[MIRROR] Consolidates Species Files (#10530)

Co-authored-by: Cameron Lennox <killer65311@gmail.com>
Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
This commit is contained in:
CHOMPStation2StaffMirrorBot
2025-03-26 17:31:44 -07:00
committed by GitHub
parent 93c6439567
commit 013bac9816
47 changed files with 2233 additions and 1545 deletions

View File

@@ -1,6 +1,3 @@
/datum/species
var/list/default_emotes = list()
/mob/living/carbon/get_available_emotes()
. = ..()
if(length(species?.default_emotes))

View File

@@ -1,9 +1,12 @@
/datum/species/vox
name = SPECIES_VOX
name_plural = "Vox"
icobase = 'icons/mob/human_races/r_vox.dmi'
deform = 'icons/mob/human_races/r_def_vox.dmi'
default_language = LANGUAGE_VOX
icobase = 'icons/mob/human_races/r_vox_old.dmi'
deform = 'icons/mob/human_races/r_def_vox_old.dmi'
tail = "voxtail"
tail_animation = 'icons/mob/species/vox/tail.dmi'
default_language = LANGUAGE_GALCOM
secondary_langs = list(LANGUAGE_VOX)
language = LANGUAGE_GALCOM
species_language = LANGUAGE_VOX
num_alternate_languages = 3
@@ -17,13 +20,15 @@
refer to them as 'shitbirds' for their violent and offensive nature, as well as their horrible \
smell.<br/><br/>Most humans will never meet a Vox raider, instead learning of this insular species through \
dealing with their traders and merchants; those that do rarely enjoy the experience."
wikilink="https://wiki.vore-station.net/Vox"
catalogue_data = list(/datum/category_item/catalogue/fauna/vox)
// taste_sensitivity = TASTE_DULL
min_age = 18
slowdown = -0.5
speech_sounds = list('sound/voice/shriek1.ogg')
speech_sounds = list()
speech_chance = 20
scream_verb_1p = "shriek"
@@ -47,19 +52,18 @@
cold_level_2 = 50
cold_level_3 = 0
gluttonous = 1
breath_type = GAS_N2 //CHOMPedit
poison_type = GAS_O2
ideal_air_type = /datum/gas_mixture/belly_air/vox
siemens_coefficient = 0.2
flags = NO_DNA | NO_SLEEVE | NO_DEFIB
spawn_flags = SPECIES_IS_WHITELISTED
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
appearance_flags = HAS_EYE_COLOR | HAS_HAIR_COLOR | HAS_SKIN_COLOR
blood_color = "#9066BD"
flesh_color = "#808D11"
color_mult = 1
reagent_tag = IS_VOX
@@ -90,15 +94,10 @@
genders = list(NEUTER)
descriptors = list(
/datum/mob_descriptor/height = -1,
/datum/mob_descriptor/build = 1,
/datum/mob_descriptor/vox_markings = 0
)
default_emotes = list(
/decl/emote/audible/vox_shriek
)
inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) //Get ya quills done did
/datum/species/vox/get_random_name(var/gender)
var/datum/language/species_language = GLOB.all_languages[default_language]

View File

@@ -1,4 +0,0 @@
/datum/species/vox
default_language = LANGUAGE_GALCOM
secondary_langs = list(LANGUAGE_VOX)
speech_sounds = list() // Remove obnoxious noises on every single 'say'. Should really only be a thing for event-exclusive species like benos.

View File

@@ -44,8 +44,8 @@
male_cough_sounds = null
female_cough_sounds = null
male_sneeze_sound = null
female_sneeze_sound = null
//male_sneeze_sound = null //CHOMPStation Edit Disable
//female_sneeze_sound = null //CHOMPStation Edit Disable
speech_bubble_appearance = "ghost"

View File

@@ -58,7 +58,7 @@
var/allergen_damage_severity = 2.5 // How bad are reactions to the allergen? Touch with extreme caution.
var/allergen_disable_severity = 10 // Whilst this determines how long nonlethal effects last and how common emotes are.
var/min_age = 17
var/min_age = 18
var/max_age = 70
var/icodigi = 'icons/mob/human_races/r_digi.dmi'
@@ -248,7 +248,7 @@
var/item_slowdown_mod = 1 // How affected by item slowdown the species is.
var/primitive_form // Lesser form, if any (ie. monkey for humans)
var/greater_form // Greater form, if any, ie. human for monkeys.
var/holder_type
var/holder_type = /obj/item/holder/micro //This allows you to pick up crew
var/gluttonous // Can eat some mobs. 1 for mice, 2 for monkeys, 3 for people.
var/soft_landing = FALSE // Can fall down and land safely on small falls.
@@ -273,6 +273,8 @@
var/vore_belly_default_variant = "H"
var/list/default_emotes = list()
// Determines the organs that the species spawns with and
var/list/has_organ = list( // which required-organ checks are conducted.
O_HEART = /obj/item/organ/internal/heart,
@@ -313,10 +315,7 @@
var/pass_flags = 0
var/list/descriptors = list(
/datum/mob_descriptor/height,
/datum/mob_descriptor/build
)
var/list/descriptors = list()
//This is used in character setup preview generation (prefences_setup.dm) and human mob
//rendering (update_icons.dm)
@@ -337,6 +336,53 @@
var/gun_accuracy_dispersion_mod = 0 // More is worse
var/sort_hint = SPECIES_SORT_NORMAL
//This is so that if a race is using the chimera revive they can't use it more than once.
//Shouldn't really be seen in play too often, but it's case an admin event happens and they give a non chimera the chimera revive. Only one person can use the chimera revive at a time per race.
//var/reviving = 0 //commented out 'cause moved to mob
var/organic_food_coeff = 1
var/synthetic_food_coeff = 0
var/robo_ethanol_proc = 0 //can we get fuel from booze, as a synth?
var/robo_ethanol_drunk = 0 //can we get *drunk* from booze, as a synth?
var/digestion_efficiency = 1 //VORE specific digestion var
//var/vore_numbing = 0
var/metabolism = 0.0015
var/lightweight = FALSE //Oof! Nonhelpful bump stumbles.
var/trashcan = FALSE //It's always sunny in the wrestling ring.
var/eat_minerals = FALSE //HEAVY METAL DIET
var/base_species = null // Unused outside of a few species
var/selects_bodytype = SELECTS_BODYTYPE_FALSE // Allows the species to choose from body types like custom species can, affecting suit fitting and etcetera as you would expect.
var/bloodsucker = FALSE // Allows safely getting nutrition from blood.
var/bloodsucker_controlmode = "always loud" //Allows selecting between bloodsucker control modes. Always Loud corresponds to original implementation.
var/is_weaver = FALSE
var/silk_production = FALSE
var/silk_reserve = 100
var/silk_max_reserve = 500
var/silk_color = "#FFFFFF"
var/list/traits = list()
//Vars that need to be copied when producing a copy of species.
var/list/copy_vars = list("base_species", "icobase", "deform", "tail", "tail_animation", "icobase_tail", "color_mult", "primitive_form", "appearance_flags", "flesh_color", "base_color", "blood_mask", "damage_mask", "damage_overlays", "move_trail", "has_floating_eyes")
var/trait_points = 0
var/ideal_air_type = null // Set to something else if you breathe something else from default composition. Used for inbelly air.
var/micro_size_mod = 0 // How different is our size for interactions that involve us being small?
var/macro_size_mod = 0 // How different is our size for interactions that involve us being big?
var/digestion_nutrition_modifier = 1
var/center_offset = 0.5
var/can_climb = FALSE
var/climbing_delay = 1.5 // We climb with a quarter delay
var/list/food_preference = list() //RS edit
var/food_preference_bonus = 0
// For Lleill and Hanner
var/lleill_energy = 200
var/lleill_energy_max = 200
/datum/species/proc/update_attack_types()
unarmed_attacks = list()
@@ -690,3 +736,85 @@
if(!QDELETED(baseHead) && baseHead)
qdel(baseHead)
return
/datum/species/proc/give_numbing_bite() //Holy SHIT this is hacky, but it works. Updating a mob's attacks mid game is insane.
unarmed_attacks = list()
unarmed_types += /datum/unarmed_attack/bite/sharp/numbing
for(var/u_type in unarmed_types)
unarmed_attacks += new u_type()
/datum/species/create_organs(var/mob/living/carbon/human/H)
if(H.nif)
/*var/type = H.nif.type
var/durability = H.nif.durability
var/list/nifsofts = H.nif.nifsofts
var/list/nif_savedata = H.nif.save_data.Copy()*/
..()
H.nif = null //A previous call during the rejuvenation path deleted it, so we no longer should have it here
/*var/obj/item/nif/nif = new type(H,durability,nif_savedata)
nif.nifsofts = nifsofts*/
else
..()
/datum/species/proc/produceCopy(var/list/traits, var/mob/living/carbon/human/H, var/custom_base, var/reset_dna = TRUE) // Traitgenes reset_dna flag required, or genes get reset on resleeve
ASSERT(src)
ASSERT(istype(H))
var/datum/species/new_copy = new src.type()
new_copy.race_key = race_key
if (selects_bodytype && custom_base)
new_copy.base_species = custom_base
if(selects_bodytype == SELECTS_BODYTYPE_CUSTOM) //If race selects a bodytype, retrieve the custom_base species and copy needed variables.
var/datum/species/S = GLOB.all_species[custom_base]
S.copy_variables(new_copy, copy_vars)
if(selects_bodytype == SELECTS_BODYTYPE_SHAPESHIFTER)
H.shapeshifter_change_shape(custom_base, FALSE)
for(var/organ in has_limbs) //Copy important organ data generated by species.
var/list/organ_data = has_limbs[organ]
new_copy.has_limbs[organ] = organ_data.Copy()
new_copy.traits = traits
//If you had traits, apply them
if(new_copy.traits)
for(var/trait in new_copy.traits)
var/datum/trait/T = all_traits[trait]
T.apply(new_copy, H, new_copy.traits[trait])
//Set up a mob
H.species = new_copy
H.icon_state = new_copy.get_bodytype()
if(new_copy.holder_type)
H.holder_type = new_copy.holder_type
if(H.dna && reset_dna)
H.dna.ready_dna(H)
handle_base_eyes(H, custom_base)
if(H.species.has_vibration_sense)
H.motiontracker_subscribe()
return new_copy
//We REALLY don't need to go through every variable. Doing so makes this lag like hell on 515
/datum/species/proc/copy_variables(var/datum/species/S, var/list/whitelist)
//List of variables to ignore, trying to copy type will runtime.
//var/list/blacklist = list("type", "loc", "client", "ckey")
//Makes thorough copy of species datum.
for(var/i in whitelist)
if(!(i in S.vars)) //Don't copy incompatible vars.
continue
if(S.vars[i] != vars[i] && !islist(vars[i])) //If vars are same, no point in copying.
S.vars[i] = vars[i]
/datum/species/get_bodytype()
return base_species
/datum/species/proc/update_vore_belly_def_variant()
// Determine the actual vore_belly_default_variant, if the base species in the VORE tab is set
switch (base_species)
if("Teshari")
vore_belly_default_variant = "T"
if("Unathi")
vore_belly_default_variant = "L"

View File

@@ -99,3 +99,82 @@
var/obj/item/organ/external/affecting = target.get_organ(zone)
user.visible_message(span_warning("[user] jumped up and down on \the [target]'s [affecting.name]!"))
playsound(user, attack_sound, 25, 1, -1)
/datum/unarmed_attack/bite/sharp/numbing //Is using this against someone you are truly trying to fight a bad idea? Yes. Yes it is.
attack_name = "numbing bite"
attack_verb = list("bit")
attack_noun = list("fangs")
attack_sound = 'sound/weapons/bite.ogg'
shredding = 0
sharp = TRUE
edge = TRUE
/datum/unarmed_attack/bite/sharp/numbing/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
var/obj/item/organ/external/affecting = target.get_organ(zone)
attack_damage = CLAMP(attack_damage, 1, 5)
if(target == user)
user.visible_message(span_danger("[user] [pick(attack_verb)] \himself in the [affecting.name]!"))
return 0 //No venom for you.
switch(zone)
if(BP_HEAD, O_MOUTH, O_EYES)
// ----- HEAD ----- //
switch(attack_damage)
if(1 to 2)
user.visible_message(span_danger("[user]'s fangs scrape across [target]'s cheek!"))
to_chat(target, span_danger("Your face feels tingly!"))
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage) //Have to add this here, otherwise the swtich fails.
if(3 to 4)
user.visible_message(span_danger("[user]'s fangs pierce into [target]'s neck at an odd, awkward angle!"))
to_chat(target, span_danger("Your neck feels like it's on fire before going numb!"))
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
if(5)
user.visible_message(span_danger("[user] sinks \his [pick(attack_noun)] <b><i>deep</i></b> into [target]'s neck, causing the vein to bulge outwards at some type of chemical is pumped into it!"))
to_chat(target, span_danger("Your neck feels like it's going to burst! Moments later, you simply can't feel your neck any longer, the numbness beginning to spread throughout your body!"))
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
else
// ----- BODY ----- //
switch(attack_damage)
if(1 to 2)
user.visible_message(span_danger("[user]'s fangs scrape across [target]'s [affecting.name]!"))
to_chat(target, span_danger("Your [affecting.name] feels tingly!"))
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
if(3 to 4)
user.visible_message(span_danger("[user]'s fangs pierce [pick("", "", "the side of")] [target]'s [affecting.name]!"))
to_chat(target, span_danger("Your [affecting.name] feels like it's on fire before going numb!"))
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
if(5)
user.visible_message(span_danger("[user]'s fangs sink deep into [target]'s [affecting.name], one of their veins bulging outwards from the sudden fluid pumped into it!"))
to_chat(target, span_danger("Your [affecting.name] feels like it's going to burst! Moments later, you simply can't feel your [affecting.name] any longer, the numbness slowly spreading throughout your body!"))
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
/datum/unarmed_attack/claws/shadekin
/datum/unarmed_attack/claws/shadekin/apply_effects(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
..()
if(!(target == user))
user.shadekin_adjust_energy(attack_damage)
/datum/unarmed_attack/bite/sharp/shadekin
/datum/unarmed_attack/bite/sharp/shadekin/apply_effects(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
..()
if(!(target == user))
user.shadekin_adjust_energy(attack_damage)
/datum/unarmed_attack/claws/chimera //special feral attack that gets stronger as they get angrier
/datum/unarmed_attack/claws/chimera/get_unarmed_damage(var/mob/living/carbon/human/user)
return user.feral/5
/datum/unarmed_attack/claws/chimera/apply_effects(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/armour,var/attack_damage,var/zone)
..()
if(user.feral && !(target == user))
var/selfdamage = ((user.feral/10)-7.5)
if(selfdamage > 0)
var/selfdamagezone = null
if (user.hand)
selfdamagezone=pick(BP_L_ARM, BP_L_HAND)
else
selfdamagezone=pick(BP_R_ARM, BP_R_HAND)
user.apply_damage(selfdamage, BRUTE, selfdamagezone, 0, 0, sharp=FALSE, edge=FALSE)

View File

@@ -1,78 +0,0 @@
/datum/unarmed_attack/bite/sharp/numbing //Is using this against someone you are truly trying to fight a bad idea? Yes. Yes it is.
attack_name = "numbing bite"
attack_verb = list("bit")
attack_noun = list("fangs")
attack_sound = 'sound/weapons/bite.ogg'
shredding = 0
sharp = TRUE
edge = TRUE
/datum/unarmed_attack/bite/sharp/numbing/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
var/obj/item/organ/external/affecting = target.get_organ(zone)
attack_damage = CLAMP(attack_damage, 1, 5)
if(target == user)
user.visible_message(span_danger("[user] [pick(attack_verb)] \himself in the [affecting.name]!"))
return 0 //No venom for you.
switch(zone)
if(BP_HEAD, O_MOUTH, O_EYES)
// ----- HEAD ----- //
switch(attack_damage)
if(1 to 2)
user.visible_message(span_danger("[user]'s fangs scrape across [target]'s cheek!"))
to_chat(target, span_danger("Your face feels tingly!"))
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage) //Have to add this here, otherwise the swtich fails.
if(3 to 4)
user.visible_message(span_danger("[user]'s fangs pierce into [target]'s neck at an odd, awkward angle!"))
to_chat(target, span_danger("Your neck feels like it's on fire before going numb!"))
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
if(5)
user.visible_message(span_danger("[user] sinks \his [pick(attack_noun)] <b><i>deep</i></b> into [target]'s neck, causing the vein to bulge outwards at some type of chemical is pumped into it!"))
to_chat(target, span_danger("Your neck feels like it's going to burst! Moments later, you simply can't feel your neck any longer, the numbness beginning to spread throughout your body!"))
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
else
// ----- BODY ----- //
switch(attack_damage)
if(1 to 2)
user.visible_message(span_danger("[user]'s fangs scrape across [target]'s [affecting.name]!"))
to_chat(target, span_danger("Your [affecting.name] feels tingly!"))
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
if(3 to 4)
user.visible_message(span_danger("[user]'s fangs pierce [pick("", "", "the side of")] [target]'s [affecting.name]!"))
to_chat(target, span_danger("Your [affecting.name] feels like it's on fire before going numb!"))
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
if(5)
user.visible_message(span_danger("[user]'s fangs sink deep into [target]'s [affecting.name], one of their veins bulging outwards from the sudden fluid pumped into it!"))
to_chat(target, span_danger("Your [affecting.name] feels like it's going to burst! Moments later, you simply can't feel your [affecting.name] any longer, the numbness slowly spreading throughout your body!"))
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
/datum/unarmed_attack/claws/shadekin
/datum/unarmed_attack/claws/shadekin/apply_effects(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
..()
if(!(target == user))
user.shadekin_adjust_energy(attack_damage)
/datum/unarmed_attack/bite/sharp/shadekin
/datum/unarmed_attack/bite/sharp/shadekin/apply_effects(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
..()
if(!(target == user))
user.shadekin_adjust_energy(attack_damage)
/datum/unarmed_attack/claws/chimera //special feral attack that gets stronger as they get angrier
/datum/unarmed_attack/claws/chimera/get_unarmed_damage(var/mob/living/carbon/human/user)
return user.feral/5
/datum/unarmed_attack/claws/chimera/apply_effects(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/armour,var/attack_damage,var/zone)
..()
if(user.feral && !(target == user))
var/selfdamage = ((user.feral/10)-7.5)
if(selfdamage > 0)
var/selfdamagezone = null
if (user.hand)
selfdamagezone=pick(BP_L_ARM, BP_L_HAND)
else
selfdamagezone=pick(BP_R_ARM, BP_R_HAND)
user.apply_damage(selfdamage, BRUTE, selfdamagezone, 0, 0, sharp=FALSE, edge=FALSE)

View File

@@ -125,3 +125,16 @@
/datum/species/proc/get_vision_flags(var/mob/living/carbon/human/H)
return vision_flags
/datum/species/proc/get_wing_hair(var/mob/living/carbon/human/H) //I have no idea what this is even used for other than teshari, but putting it in just in case.
return wing_hair //Since the tail has it.
/datum/species/proc/get_wing(var/mob/living/carbon/human/H)
return wing
/datum/species/proc/get_wing_animation(var/mob/living/carbon/human/H)
return wing_animation
/datum/species/proc/get_perfect_belly_air_type(var/mob/living/carbon/human/H)
if(ideal_air_type)
return ideal_air_type //Whatever we want
else
return /datum/gas_mixture/belly_air //Default

View File

@@ -1,13 +0,0 @@
/datum/species/proc/get_wing_hair(var/mob/living/carbon/human/H) //I have no idea what this is even used for other than teshari, but putting it in just in case.
return wing_hair //Since the tail has it.
/datum/species/proc/get_wing(var/mob/living/carbon/human/H)
return wing
/datum/species/proc/get_wing_animation(var/mob/living/carbon/human/H)
return wing_animation
/datum/species/proc/get_perfect_belly_air_type(var/mob/living/carbon/human/H)
if(ideal_air_type)
return ideal_air_type //Whatever we want
else
return /datum/gas_mixture/belly_air //Default

View File

@@ -14,6 +14,9 @@ var/list/wrapped_species_by_ref = list()
var/list/valid_transform_species = list()
//var/default_form = SPECIES_HUMAN //VOREStation edit
base_species = SPECIES_HUMAN
selects_bodytype = SELECTS_BODYTYPE_SHAPESHIFTER
/datum/species/shapeshifter/get_valid_shapeshifter_forms(var/mob/living/carbon/human/H)
return list(vanity_base_fit)|valid_transform_species
@@ -321,3 +324,339 @@ var/list/wrapped_species_by_ref = list()
update_icons_body()
update_eyes()
/mob/living/carbon/human/proc/shapeshifter_select_ears()
set name = "Select Ears"
set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
last_special = world.time + 10
// Construct the list of names allowed for this user.
var/list/pretty_ear_styles = list("Normal" = null)
for(var/path in ear_styles_list)
var/datum/sprite_accessory/ears/instance = ear_styles_list[path]
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
pretty_ear_styles[instance.name] = path
// Present choice to user
var/new_ear_style = tgui_input_list(src, "Pick some ears!", "Character Preference", pretty_ear_styles)
if(!new_ear_style)
return
//Set new style
ear_style = ear_styles_list[pretty_ear_styles[new_ear_style]]
//Allow color picks
var/current_pri_color = rgb(r_ears,g_ears,b_ears)
var/new_pri_color = tgui_color_picker(src, "Pick primary ear color:","Ear Color (Pri)", current_pri_color)
if(new_pri_color)
var/list/new_color_rgb_list = hex2rgb(new_pri_color)
r_ears = new_color_rgb_list[1]
g_ears = new_color_rgb_list[2]
b_ears = new_color_rgb_list[3]
//Indented inside positive primary color choice, don't bother if they clicked cancel
var/current_sec_color = rgb(r_ears2,g_ears2,b_ears2)
var/new_sec_color = tgui_color_picker(src, "Pick secondary ear color (only applies to some ears):","Ear Color (sec)", current_sec_color)
if(new_sec_color)
new_color_rgb_list = hex2rgb(new_sec_color)
r_ears2 = new_color_rgb_list[1]
g_ears2 = new_color_rgb_list[2]
b_ears2 = new_color_rgb_list[3]
var/current_ter_color = rgb(r_ears3,g_ears3,b_ears3)
var/new_ter_color = tgui_color_picker(src, "Pick tertiary ear color (only applies to some ears):","Ear Color (sec)", current_ter_color)
if(new_ter_color)
new_color_rgb_list = hex2rgb(new_sec_color)
r_ears3 = new_color_rgb_list[1]
g_ears3 = new_color_rgb_list[2]
b_ears3 = new_color_rgb_list[3]
var/new_ear_alpha = tgui_input_number(src, "Set ear alpha (0-255):","Ear Alpha", a_ears,255,0)
if(new_ear_alpha)
a_ears = new_ear_alpha
update_hair() //Includes Virgo ears
/mob/living/carbon/human/proc/shapeshifter_select_secondary_ears()
set name = "Select Secondary Ears"
set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
last_special = world.time + 1 SECONDS
// Construct the list of names allowed for this user.
var/list/pretty_ear_styles = list("Normal" = null)
for(var/path in ear_styles_list)
var/datum/sprite_accessory/ears/instance = ear_styles_list[path]
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
pretty_ear_styles[instance.name] = path
// Handle style pick
var/new_ear_style = tgui_input_list(src, "Pick some ears!", "Character Preference", pretty_ear_styles)
if(!new_ear_style)
return
ear_secondary_style = ear_styles_list[pretty_ear_styles[new_ear_style]]
// Handle color picks
if(ear_secondary_style)
var/list/new_colors = list()
for(var/channel in 1 to ear_secondary_style.get_color_channel_count())
var/channel_name = GLOB.fancy_sprite_accessory_color_channel_names[channel]
var/default = LAZYACCESS(ear_secondary_colors, channel) || "#ffffff"
var/new_color = tgui_color_picker(src, "Pick [channel_name]", "Ear Color ([channel_name])", default)
new_colors += new_color || default
var/new_ear_alpha = tgui_input_number(src, "Set ear alpha (0-255):","Ear Alpha", a_ears2,255,0)
if(new_ear_alpha)
a_ears2 = new_ear_alpha
update_hair()
/mob/living/carbon/human/proc/shapeshifter_select_tail()
set name = "Select Tail"
set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
last_special = world.time + 10
// Construct the list of names allowed for this user.
var/list/pretty_tail_styles = list("Normal" = null)
for(var/path in tail_styles_list)
var/datum/sprite_accessory/tail/instance = tail_styles_list[path]
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
pretty_tail_styles[instance.name] = path
// Present choice to user
var/new_tail_style = tgui_input_list(src, "Pick a tail!", "Character Preference", pretty_tail_styles)
if(!new_tail_style)
return
//Set new style
tail_style = tail_styles_list[pretty_tail_styles[new_tail_style]]
//Allow color picks
var/current_pri_color = rgb(r_tail,g_tail,b_tail)
var/new_pri_color = tgui_color_picker(src, "Pick primary tail color:","Tail Color (Pri)", current_pri_color)
if(new_pri_color)
var/list/new_color_rgb_list = hex2rgb(new_pri_color)
r_tail = new_color_rgb_list[1]
g_tail = new_color_rgb_list[2]
b_tail = new_color_rgb_list[3]
//Indented inside positive primary color choice, don't bother if they clicked cancel
var/current_sec_color = rgb(r_tail2,g_tail2,b_tail2)
var/new_sec_color = tgui_color_picker(src, "Pick secondary tail color (only applies to some tails):","Tail Color (sec)", current_sec_color)
if(new_sec_color)
new_color_rgb_list = hex2rgb(new_sec_color)
r_tail2 = new_color_rgb_list[1]
g_tail2 = new_color_rgb_list[2]
b_tail2 = new_color_rgb_list[3]
var/current_ter_color = rgb(r_tail3,g_tail3,b_tail3)
var/new_ter_color = tgui_color_picker(src, "Pick tertiary tail color (only applies to some tails):","Tail Color (sec)", current_ter_color)
if(new_ter_color)
new_color_rgb_list = hex2rgb(new_ter_color)
r_tail3 = new_color_rgb_list[1]
g_tail3 = new_color_rgb_list[2]
b_tail3 = new_color_rgb_list[3]
var/new_tail_alpha = tgui_input_number(src, "Set tail alpha (0-255):","Tail Alpha", a_tail,255,0)
if(new_tail_alpha)
a_tail = new_tail_alpha
update_tail_showing()
/mob/living/carbon/human/proc/shapeshifter_select_wings()
set name = "Select Wings"
set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
last_special = world.time + 10
// Construct the list of names allowed for this user.
var/list/pretty_wing_styles = list("None" = null)
for(var/path in wing_styles_list)
var/datum/sprite_accessory/wing/instance = wing_styles_list[path]
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
pretty_wing_styles[instance.name] = path
// Present choice to user
var/new_wing_style = tgui_input_list(src, "Pick some wings!", "Character Preference", pretty_wing_styles)
if(!new_wing_style)
return
//Set new style
wing_style = wing_styles_list[pretty_wing_styles[new_wing_style]]
//Allow color picks
var/current_color = rgb(r_wing,g_wing,b_wing)
var/new_color = tgui_color_picker(src, "Pick wing color:","Wing Color", current_color)
if(new_color)
var/list/new_color_rgb_list = hex2rgb(new_color)
r_wing = new_color_rgb_list[1]
g_wing = new_color_rgb_list[2]
b_wing = new_color_rgb_list[3]
//Indented inside positive primary color choice, don't bother if they clicked cancel
var/current_sec_color = rgb(r_wing2,g_wing2,b_wing2)
var/new_sec_color = tgui_color_picker(src, "Pick secondary wing color (only applies to some wings):","Wing Color (sec)", current_sec_color)
if(new_sec_color)
new_color_rgb_list = hex2rgb(new_sec_color)
r_wing2 = new_color_rgb_list[1]
g_wing2 = new_color_rgb_list[2]
b_wing2 = new_color_rgb_list[3]
var/current_ter_color = rgb(r_wing3,g_wing3,b_wing3)
var/new_ter_color = tgui_color_picker(src, "Pick tertiary wing color (only applies to some wings):","Wing Color (sec)", current_ter_color)
if(new_ter_color)
new_color_rgb_list = hex2rgb(new_ter_color)
r_wing3 = new_color_rgb_list[1]
g_wing3 = new_color_rgb_list[2]
b_wing3 = new_color_rgb_list[3]
var/new_alpha = tgui_input_number(src, "Set wing alpha (0-255):","Wing Alpha", a_wing,255,0)
if(new_alpha)
a_wing = new_alpha
update_wing_showing()
/mob/living/carbon/human/proc/promethean_select_opaqueness()
set name = "Toggle Transparency"
set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
last_special = world.time + 50
for(var/obj/item/organ/external/L as anything in src.organs)
L.transparent = !L.transparent
visible_message(span_notice("\The [src]'s internal composition seems to change."))
update_icons_body()
update_hair()
/mob/living/carbon/human/proc/shapeshifter_change_shape(var/new_species = null, var/visible = TRUE) //not sure if this needs to be moved to a separate file but
if(!new_species)
return
dna.base_species = new_species
species.base_species = new_species
wrapped_species_by_ref["\ref[src]"] = new_species
if (visible)
visible_message(span_filter_notice(span_bold("\The [src]") + " shifts and contorts, taking the form of \a [new_species]!"))
regenerate_icons()
//////////////////// Shapeshifter copy-body powers
/// Copied from the protean version, but with some tweaks to match non-protean shapeshifters such as lleill, hanner and replicants
/mob/living/carbon/human/proc/shapeshifter_regenerate()
set name = "Fully Reform"
set desc = "Reload your appearance from whatever character slot you have loaded."
set category = "Abilities.Shapeshift"
var/mob/living/character = src
if(temporary_form)
character = temporary_form
var/input = tgui_alert(character,{"Do you want to copy the appearance data of your currently loaded save slot?"},"Reformation",list("Reform","Cancel"))
if(input == "Cancel" || !input)
return
else
input = tgui_alert(character,{"Include Flavourtext?"},"Reformation",list("Yes","No","Cancel"))
if(input == "Cancel" || !input)
return
var/flavour = 0
if(input == "Yes")
flavour = 1
input = tgui_alert(character,{"Include OOC notes?"},"Reformation",list("Yes","No","Cancel"))
if(input == "Cancel" || !input)
return
var/oocnotes = 0
if(input == "Yes")
oocnotes = 1
to_chat(character, span_notify("You begin to reform. You will need to remain still."))
character.visible_message(span_notify("[character] rapidly contorts and shifts!"), span_danger("You begin to reform."))
if(do_after(character, 40,exclusive = TASK_ALL_EXCLUSIVE))
if(character.client.prefs) //Make sure we didn't d/c
character.client.prefs.vanity_copy_to(src, FALSE, flavour, oocnotes, FALSE)
character.visible_message(span_notify("[character] adopts a new form!"), span_danger("You have reformed."))
/mob/living/carbon/human/proc/shapeshifter_copy_body()
set name = "Copy Form"
set desc = "If you are aggressively grabbing someone, with their consent, you can turn into a copy of them. (Without their name)."
set category = "Abilities.Shapeshift"
var/mob/living/character = src
if(temporary_form)
character = temporary_form
var/grabbing_but_not_enough
var/mob/living/carbon/human/victim = null
for(var/obj/item/grab/G in character)
if(G.state < GRAB_AGGRESSIVE)
grabbing_but_not_enough = TRUE
return
else
victim = G.affecting
if (!victim)
if (grabbing_but_not_enough)
to_chat(character, span_warning("You need a better grip to do that!"))
else
to_chat(character, span_notice("You need to be aggressively grabbing someone before you can copy their form."))
return
if (!ishuman(victim))
to_chat(character, span_warning("You can only perform this on human mobs!"))
return
if (!victim.client)
to_chat(character, span_notice("The person you try this on must have a client!"))
return
to_chat(character, span_notice("Waiting for other person's consent."))
var/consent = tgui_alert(victim, "Allow [src] to copy what you look like?", "Consent", list("Yes", "No"))
if (consent != "Yes")
to_chat(character, span_notice("They declined your request."))
return
var/input = tgui_alert(character,{"Copy [victim]'s flavourtext?"},"Copy Form",list("Yes","No","Cancel"))
if(input == "Cancel" || !input)
return
var/flavour = 0
if(input == "Yes")
flavour = 1
var/checking = FALSE
for(var/obj/item/grab/G in character)
if(G.affecting == victim && G.state >= GRAB_AGGRESSIVE)
checking = TRUE
if (!checking)
to_chat(character, span_warning("You lost your grip on [victim]!"))
return
to_chat(character, span_notify("You begin to reassemble into [victim]. You will need to remain still."))
character.visible_message(span_notify("[character] rapidly contorts and shifts!"), span_danger("You begin to reassemble into [victim]."))
if(do_after(character, 40,exclusive = TASK_ALL_EXCLUSIVE))
checking = FALSE
for(var/obj/item/grab/G in character)
if(G.affecting == victim && G.state >= GRAB_AGGRESSIVE)
checking = TRUE
if (!checking)
to_chat(character, span_warning("You lost your grip on [victim]!"))
return
if(character.client) //Make sure we didn't d/c
transform_into_other_human(victim, FALSE, flavour, FALSE)
character.visible_message(span_notify("[character] adopts the form of [victim]!"), span_danger("You have reassembled into [victim]."))

View File

@@ -1,339 +0,0 @@
/datum/species/shapeshifter
base_species = SPECIES_HUMAN
selects_bodytype = SELECTS_BODYTYPE_SHAPESHIFTER
/mob/living/carbon/human/proc/shapeshifter_select_ears()
set name = "Select Ears"
set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
last_special = world.time + 10
// Construct the list of names allowed for this user.
var/list/pretty_ear_styles = list("Normal" = null)
for(var/path in ear_styles_list)
var/datum/sprite_accessory/ears/instance = ear_styles_list[path]
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
pretty_ear_styles[instance.name] = path
// Present choice to user
var/new_ear_style = tgui_input_list(src, "Pick some ears!", "Character Preference", pretty_ear_styles)
if(!new_ear_style)
return
//Set new style
ear_style = ear_styles_list[pretty_ear_styles[new_ear_style]]
//Allow color picks
var/current_pri_color = rgb(r_ears,g_ears,b_ears)
var/new_pri_color = tgui_color_picker(src, "Pick primary ear color:","Ear Color (Pri)", current_pri_color)
if(new_pri_color)
var/list/new_color_rgb_list = hex2rgb(new_pri_color)
r_ears = new_color_rgb_list[1]
g_ears = new_color_rgb_list[2]
b_ears = new_color_rgb_list[3]
//Indented inside positive primary color choice, don't bother if they clicked cancel
var/current_sec_color = rgb(r_ears2,g_ears2,b_ears2)
var/new_sec_color = tgui_color_picker(src, "Pick secondary ear color (only applies to some ears):","Ear Color (sec)", current_sec_color)
if(new_sec_color)
new_color_rgb_list = hex2rgb(new_sec_color)
r_ears2 = new_color_rgb_list[1]
g_ears2 = new_color_rgb_list[2]
b_ears2 = new_color_rgb_list[3]
var/current_ter_color = rgb(r_ears3,g_ears3,b_ears3)
var/new_ter_color = tgui_color_picker(src, "Pick tertiary ear color (only applies to some ears):","Ear Color (sec)", current_ter_color)
if(new_ter_color)
new_color_rgb_list = hex2rgb(new_sec_color)
r_ears3 = new_color_rgb_list[1]
g_ears3 = new_color_rgb_list[2]
b_ears3 = new_color_rgb_list[3]
var/new_ear_alpha = tgui_input_number(src, "Set ear alpha (0-255):","Ear Alpha", a_ears,255,0)
if(new_ear_alpha)
a_ears = new_ear_alpha
update_hair() //Includes Virgo ears
/mob/living/carbon/human/proc/shapeshifter_select_secondary_ears()
set name = "Select Secondary Ears"
set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
last_special = world.time + 1 SECONDS
// Construct the list of names allowed for this user.
var/list/pretty_ear_styles = list("Normal" = null)
for(var/path in ear_styles_list)
var/datum/sprite_accessory/ears/instance = ear_styles_list[path]
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
pretty_ear_styles[instance.name] = path
// Handle style pick
var/new_ear_style = tgui_input_list(src, "Pick some ears!", "Character Preference", pretty_ear_styles)
if(!new_ear_style)
return
ear_secondary_style = ear_styles_list[pretty_ear_styles[new_ear_style]]
// Handle color picks
if(ear_secondary_style)
var/list/new_colors = list()
for(var/channel in 1 to ear_secondary_style.get_color_channel_count())
var/channel_name = GLOB.fancy_sprite_accessory_color_channel_names[channel]
var/default = LAZYACCESS(ear_secondary_colors, channel) || "#ffffff"
var/new_color = tgui_color_picker(src, "Pick [channel_name]", "Ear Color ([channel_name])", default)
new_colors += new_color || default
var/new_ear_alpha = tgui_input_number(src, "Set ear alpha (0-255):","Ear Alpha", a_ears2,255,0)
if(new_ear_alpha)
a_ears2 = new_ear_alpha
update_hair()
/mob/living/carbon/human/proc/shapeshifter_select_tail()
set name = "Select Tail"
set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
last_special = world.time + 10
// Construct the list of names allowed for this user.
var/list/pretty_tail_styles = list("Normal" = null)
for(var/path in tail_styles_list)
var/datum/sprite_accessory/tail/instance = tail_styles_list[path]
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
pretty_tail_styles[instance.name] = path
// Present choice to user
var/new_tail_style = tgui_input_list(src, "Pick a tail!", "Character Preference", pretty_tail_styles)
if(!new_tail_style)
return
//Set new style
tail_style = tail_styles_list[pretty_tail_styles[new_tail_style]]
//Allow color picks
var/current_pri_color = rgb(r_tail,g_tail,b_tail)
var/new_pri_color = tgui_color_picker(src, "Pick primary tail color:","Tail Color (Pri)", current_pri_color)
if(new_pri_color)
var/list/new_color_rgb_list = hex2rgb(new_pri_color)
r_tail = new_color_rgb_list[1]
g_tail = new_color_rgb_list[2]
b_tail = new_color_rgb_list[3]
//Indented inside positive primary color choice, don't bother if they clicked cancel
var/current_sec_color = rgb(r_tail2,g_tail2,b_tail2)
var/new_sec_color = tgui_color_picker(src, "Pick secondary tail color (only applies to some tails):","Tail Color (sec)", current_sec_color)
if(new_sec_color)
new_color_rgb_list = hex2rgb(new_sec_color)
r_tail2 = new_color_rgb_list[1]
g_tail2 = new_color_rgb_list[2]
b_tail2 = new_color_rgb_list[3]
var/current_ter_color = rgb(r_tail3,g_tail3,b_tail3)
var/new_ter_color = tgui_color_picker(src, "Pick tertiary tail color (only applies to some tails):","Tail Color (sec)", current_ter_color)
if(new_ter_color)
new_color_rgb_list = hex2rgb(new_ter_color)
r_tail3 = new_color_rgb_list[1]
g_tail3 = new_color_rgb_list[2]
b_tail3 = new_color_rgb_list[3]
var/new_tail_alpha = tgui_input_number(src, "Set tail alpha (0-255):","Tail Alpha", a_tail,255,0)
if(new_tail_alpha)
a_tail = new_tail_alpha
update_tail_showing()
/mob/living/carbon/human/proc/shapeshifter_select_wings()
set name = "Select Wings"
set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
last_special = world.time + 10
// Construct the list of names allowed for this user.
var/list/pretty_wing_styles = list("None" = null)
for(var/path in wing_styles_list)
var/datum/sprite_accessory/wing/instance = wing_styles_list[path]
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
pretty_wing_styles[instance.name] = path
// Present choice to user
var/new_wing_style = tgui_input_list(src, "Pick some wings!", "Character Preference", pretty_wing_styles)
if(!new_wing_style)
return
//Set new style
wing_style = wing_styles_list[pretty_wing_styles[new_wing_style]]
//Allow color picks
var/current_color = rgb(r_wing,g_wing,b_wing)
var/new_color = tgui_color_picker(src, "Pick wing color:","Wing Color", current_color)
if(new_color)
var/list/new_color_rgb_list = hex2rgb(new_color)
r_wing = new_color_rgb_list[1]
g_wing = new_color_rgb_list[2]
b_wing = new_color_rgb_list[3]
//Indented inside positive primary color choice, don't bother if they clicked cancel
var/current_sec_color = rgb(r_wing2,g_wing2,b_wing2)
var/new_sec_color = tgui_color_picker(src, "Pick secondary wing color (only applies to some wings):","Wing Color (sec)", current_sec_color)
if(new_sec_color)
new_color_rgb_list = hex2rgb(new_sec_color)
r_wing2 = new_color_rgb_list[1]
g_wing2 = new_color_rgb_list[2]
b_wing2 = new_color_rgb_list[3]
var/current_ter_color = rgb(r_wing3,g_wing3,b_wing3)
var/new_ter_color = tgui_color_picker(src, "Pick tertiary wing color (only applies to some wings):","Wing Color (sec)", current_ter_color)
if(new_ter_color)
new_color_rgb_list = hex2rgb(new_ter_color)
r_wing3 = new_color_rgb_list[1]
g_wing3 = new_color_rgb_list[2]
b_wing3 = new_color_rgb_list[3]
var/new_alpha = tgui_input_number(src, "Set wing alpha (0-255):","Wing Alpha", a_wing,255,0)
if(new_alpha)
a_wing = new_alpha
update_wing_showing()
/mob/living/carbon/human/proc/promethean_select_opaqueness()
set name = "Toggle Transparency"
set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
last_special = world.time + 50
for(var/obj/item/organ/external/L as anything in src.organs)
L.transparent = !L.transparent
visible_message(span_notice("\The [src]'s internal composition seems to change."))
update_icons_body()
update_hair()
/mob/living/carbon/human/proc/shapeshifter_change_shape(var/new_species = null, var/visible = TRUE) //not sure if this needs to be moved to a separate file but
if(!new_species)
return
dna.base_species = new_species
species.base_species = new_species
wrapped_species_by_ref["\ref[src]"] = new_species
if (visible)
visible_message(span_filter_notice(span_bold("\The [src]") + " shifts and contorts, taking the form of \a [new_species]!"))
regenerate_icons()
//////////////////// Shapeshifter copy-body powers
/// Copied from the protean version, but with some tweaks to match non-protean shapeshifters such as lleill, hanner and replicants
/mob/living/carbon/human/proc/shapeshifter_regenerate()
set name = "Fully Reform"
set desc = "Reload your appearance from whatever character slot you have loaded."
set category = "Abilities.Shapeshift"
var/mob/living/character = src
if(temporary_form)
character = temporary_form
var/input = tgui_alert(character,{"Do you want to copy the appearance data of your currently loaded save slot?"},"Reformation",list("Reform","Cancel"))
if(input == "Cancel" || !input)
return
else
input = tgui_alert(character,{"Include Flavourtext?"},"Reformation",list("Yes","No","Cancel"))
if(input == "Cancel" || !input)
return
var/flavour = 0
if(input == "Yes")
flavour = 1
input = tgui_alert(character,{"Include OOC notes?"},"Reformation",list("Yes","No","Cancel"))
if(input == "Cancel" || !input)
return
var/oocnotes = 0
if(input == "Yes")
oocnotes = 1
to_chat(character, span_notify("You begin to reform. You will need to remain still."))
character.visible_message(span_notify("[character] rapidly contorts and shifts!"), span_danger("You begin to reform."))
if(do_after(character, 40,exclusive = TASK_ALL_EXCLUSIVE))
if(character.client.prefs) //Make sure we didn't d/c
character.client.prefs.vanity_copy_to(src, FALSE, flavour, oocnotes, FALSE)
character.visible_message(span_notify("[character] adopts a new form!"), span_danger("You have reformed."))
/mob/living/carbon/human/proc/shapeshifter_copy_body()
set name = "Copy Form"
set desc = "If you are aggressively grabbing someone, with their consent, you can turn into a copy of them. (Without their name)."
set category = "Abilities.Shapeshift"
var/mob/living/character = src
if(temporary_form)
character = temporary_form
var/grabbing_but_not_enough
var/mob/living/carbon/human/victim = null
for(var/obj/item/grab/G in character)
if(G.state < GRAB_AGGRESSIVE)
grabbing_but_not_enough = TRUE
return
else
victim = G.affecting
if (!victim)
if (grabbing_but_not_enough)
to_chat(character, span_warning("You need a better grip to do that!"))
else
to_chat(character, span_notice("You need to be aggressively grabbing someone before you can copy their form."))
return
if (!ishuman(victim))
to_chat(character, span_warning("You can only perform this on human mobs!"))
return
if (!victim.client)
to_chat(character, span_notice("The person you try this on must have a client!"))
return
to_chat(character, span_notice("Waiting for other person's consent."))
var/consent = tgui_alert(victim, "Allow [src] to copy what you look like?", "Consent", list("Yes", "No"))
if (consent != "Yes")
to_chat(character, span_notice("They declined your request."))
return
var/input = tgui_alert(character,{"Copy [victim]'s flavourtext?"},"Copy Form",list("Yes","No","Cancel"))
if(input == "Cancel" || !input)
return
var/flavour = 0
if(input == "Yes")
flavour = 1
var/checking = FALSE
for(var/obj/item/grab/G in character)
if(G.affecting == victim && G.state >= GRAB_AGGRESSIVE)
checking = TRUE
if (!checking)
to_chat(character, span_warning("You lost your grip on [victim]!"))
return
to_chat(character, span_notify("You begin to reassemble into [victim]. You will need to remain still."))
character.visible_message(span_notify("[character] rapidly contorts and shifts!"), span_danger("You begin to reassemble into [victim]."))
if(do_after(character, 40,exclusive = TASK_ALL_EXCLUSIVE))
checking = FALSE
for(var/obj/item/grab/G in character)
if(G.affecting == victim && G.state >= GRAB_AGGRESSIVE)
checking = TRUE
if (!checking)
to_chat(character, span_warning("You lost your grip on [victim]!"))
return
if(character.client) //Make sure we didn't d/c
transform_into_other_human(victim, FALSE, flavour, FALSE)
character.visible_message(span_notify("[character] adopts the form of [victim]!"), span_danger("You have reassembled into [victim]."))

View File

@@ -1,136 +0,0 @@
/datum/species
//This is so that if a race is using the chimera revive they can't use it more than once.
//Shouldn't really be seen in play too often, but it's case an admin event happens and they give a non chimera the chimera revive. Only one person can use the chimera revive at a time per race.
//var/reviving = 0 //commented out 'cause moved to mob
holder_type = /obj/item/holder/micro //This allows you to pick up crew
min_age = 18
descriptors = list()
var/organic_food_coeff = 1
var/synthetic_food_coeff = 0
var/robo_ethanol_proc = 0 //can we get fuel from booze, as a synth?
var/robo_ethanol_drunk = 0 //can we get *drunk* from booze, as a synth?
var/digestion_efficiency = 1 //VORE specific digestion var
//var/vore_numbing = 0
var/metabolism = 0.0015
var/lightweight = FALSE //Oof! Nonhelpful bump stumbles.
var/trashcan = FALSE //It's always sunny in the wrestling ring.
var/eat_minerals = FALSE //HEAVY METAL DIET
var/base_species = null // Unused outside of a few species
var/selects_bodytype = SELECTS_BODYTYPE_FALSE // Allows the species to choose from body types like custom species can, affecting suit fitting and etcetera as you would expect.
var/bloodsucker = FALSE // Allows safely getting nutrition from blood.
var/bloodsucker_controlmode = "always loud" //Allows selecting between bloodsucker control modes. Always Loud corresponds to original implementation.
var/is_weaver = FALSE
var/silk_production = FALSE
var/silk_reserve = 100
var/silk_max_reserve = 500
var/silk_color = "#FFFFFF"
var/list/traits = list()
//Vars that need to be copied when producing a copy of species.
var/list/copy_vars = list("base_species", "icobase", "deform", "tail", "tail_animation", "icobase_tail", "color_mult", "primitive_form", "appearance_flags", "flesh_color", "base_color", "blood_mask", "damage_mask", "damage_overlays", "move_trail", "has_floating_eyes")
var/trait_points = 0
var/ideal_air_type = null // Set to something else if you breathe something else from default composition. Used for inbelly air.
var/micro_size_mod = 0 // How different is our size for interactions that involve us being small?
var/macro_size_mod = 0 // How different is our size for interactions that involve us being big?
var/digestion_nutrition_modifier = 1
var/center_offset = 0.5
var/can_climb = FALSE
var/climbing_delay = 1.5 // We climb with a quarter delay
var/list/food_preference = list() //RS edit
var/food_preference_bonus = 0
// For Lleill and Hanner
var/lleill_energy = 200
var/lleill_energy_max = 200
/datum/species/unathi
vore_belly_default_variant = "L"
/datum/species/proc/give_numbing_bite() //Holy SHIT this is hacky, but it works. Updating a mob's attacks mid game is insane.
unarmed_attacks = list()
unarmed_types += /datum/unarmed_attack/bite/sharp/numbing
for(var/u_type in unarmed_types)
unarmed_attacks += new u_type()
/datum/species/create_organs(var/mob/living/carbon/human/H)
if(H.nif)
/*var/type = H.nif.type
var/durability = H.nif.durability
var/list/nifsofts = H.nif.nifsofts
var/list/nif_savedata = H.nif.save_data.Copy()*/
..()
H.nif = null //A previous call during the rejuvenation path deleted it, so we no longer should have it here
/*var/obj/item/nif/nif = new type(H,durability,nif_savedata)
nif.nifsofts = nifsofts*/
else
..()
/datum/species/proc/produceCopy(var/list/traits, var/mob/living/carbon/human/H, var/custom_base, var/reset_dna = TRUE) // Traitgenes reset_dna flag required, or genes get reset on resleeve
ASSERT(src)
ASSERT(istype(H))
var/datum/species/new_copy = new src.type()
new_copy.race_key = race_key
if (selects_bodytype && custom_base)
new_copy.base_species = custom_base
if(selects_bodytype == SELECTS_BODYTYPE_CUSTOM) //If race selects a bodytype, retrieve the custom_base species and copy needed variables.
var/datum/species/S = GLOB.all_species[custom_base]
S.copy_variables(new_copy, copy_vars)
if(selects_bodytype == SELECTS_BODYTYPE_SHAPESHIFTER)
H.shapeshifter_change_shape(custom_base, FALSE)
for(var/organ in has_limbs) //Copy important organ data generated by species.
var/list/organ_data = has_limbs[organ]
new_copy.has_limbs[organ] = organ_data.Copy()
new_copy.traits = traits
//If you had traits, apply them
if(new_copy.traits)
for(var/trait in new_copy.traits)
var/datum/trait/T = all_traits[trait]
T.apply(new_copy, H, new_copy.traits[trait])
//Set up a mob
H.species = new_copy
H.icon_state = new_copy.get_bodytype()
if(new_copy.holder_type)
H.holder_type = new_copy.holder_type
if(H.dna && reset_dna)
H.dna.ready_dna(H)
handle_base_eyes(H, custom_base)
if(H.species.has_vibration_sense)
H.motiontracker_subscribe()
return new_copy
//We REALLY don't need to go through every variable. Doing so makes this lag like hell on 515
/datum/species/proc/copy_variables(var/datum/species/S, var/list/whitelist)
//List of variables to ignore, trying to copy type will runtime.
//var/list/blacklist = list("type", "loc", "client", "ckey")
//Makes thorough copy of species datum.
for(var/i in whitelist)
if(!(i in S.vars)) //Don't copy incompatible vars.
continue
if(S.vars[i] != vars[i] && !islist(vars[i])) //If vars are same, no point in copying.
S.vars[i] = vars[i]
/datum/species/get_bodytype()
return base_species
/datum/species/proc/update_vore_belly_def_variant()
// Determine the actual vore_belly_default_variant, if the base species in the VORE tab is set
switch (base_species)
if("Teshari")
vore_belly_default_variant = "T"
if("Unathi")
vore_belly_default_variant = "L"

View File

@@ -1,3 +1,4 @@
//Are these even USED? If not, axe them.
/datum/species/grey
name = SPECIES_GREY_YW
name_plural = "Gray"

View File

@@ -140,3 +140,89 @@
flesh_color = "#34AF10"
base_color = "#066000"
reagent_tag = IS_UNATHI
/datum/species/monkey/shark
name = SPECIES_MONKEY_AKULA
name_plural = "Sobaka"
icobase = 'icons/mob/human_races/monkeys/r_sobaka_vr.dmi'
deform = 'icons/mob/human_races/monkeys/r_sobaka_vr.dmi'
tail = null //The tail is part of its body due to tail using the "icons/effects/species.dmi" file. It must be null, or they'll have a chimp tail.
greater_form = SPECIES_AKULA
default_language = "Skrellian" //Closest we have.
/datum/species/monkey/sergal
name = SPECIES_MONKEY_SERGAL
greater_form = "Sergal"
icobase = 'icons/mob/human_races/monkeys/r_sergaling_vr.dmi'
deform = 'icons/mob/human_races/monkeys/r_sergaling_vr.dmi'
tail = null
default_language = LANGUAGE_SAGARU
/datum/species/monkey/sparra
name = SPECIES_MONKEY_NEVREAN
name_plural = "Sparra"
greater_form = SPECIES_NEVREAN
tail = null
icobase = 'icons/mob/human_races/monkeys/r_sparra_vr.dmi'
deform = 'icons/mob/human_races/monkeys/r_sparra_vr.dmi'
default_language = LANGUAGE_BIRDSONG
/* Example
/datum/species/monkey/tajaran
name = SPECIES_MONKEY_TAJ
name_plural = "Farwa"
icobase = 'icons/mob/human_races/monkeys/r_farwa.dmi'
deform = 'icons/mob/human_races/monkeys/r_farwa.dmi'
greater_form = SPECIES_TAJARAN
default_language = "Farwa"
flesh_color = "#AFA59E"
base_color = "#333333"
tail = "farwatail"
*/
/datum/species/monkey/vulpkanin
name = SPECIES_MONKEY_VULPKANIN
name_plural = "Wolpin"
icobase = 'icons/mob/human_races/monkeys/r_wolpin.dmi'
deform = 'icons/mob/human_races/monkeys/r_wolpin.dmi'
greater_form = SPECIES_VULPKANIN
default_language = LANGUAGE_CANILUNZT
flesh_color = "#966464"
base_color = "#000000"
tail = null
//INSERT CODE HERE SO MONKEYS CAN BE SPAWNED.
//Also, M was added to the end of the spawn names to signify that it's a monkey, since some names were conflicting.
/mob/living/carbon/human/sharkm
low_sorting_priority = TRUE
/mob/living/carbon/human/sharkm/Initialize(mapload)
. = ..(mapload, SPECIES_MONKEY_AKULA)
species.produceCopy(species.traits.Copy(),src,null,FALSE)
/mob/living/carbon/human/sergallingm
low_sorting_priority = TRUE
/mob/living/carbon/human/sergallingm/Initialize(mapload)
. = ..(mapload, SPECIES_MONKEY_SERGAL)
species.produceCopy(species.traits.Copy(),src,null,FALSE)
/mob/living/carbon/human/sparram
low_sorting_priority = TRUE
/mob/living/carbon/human/sparram/Initialize(mapload)
. = ..(mapload, SPECIES_MONKEY_NEVREAN)
species.produceCopy(species.traits.Copy(),src,null,FALSE)
/mob/living/carbon/human/wolpin
low_sorting_priority = TRUE
/mob/living/carbon/human/wolpin/Initialize(mapload)
. = ..(mapload, SPECIES_MONKEY_VULPKANIN)
species.produceCopy(species.traits.Copy(),src,null,FALSE)

View File

@@ -1,94 +0,0 @@
/datum/species/monkey/shark
name = SPECIES_MONKEY_AKULA
name_plural = "Sobaka"
icobase = 'icons/mob/human_races/monkeys/r_sobaka_vr.dmi'
deform = 'icons/mob/human_races/monkeys/r_sobaka_vr.dmi'
tail = null //The tail is part of its body due to tail using the "icons/effects/species.dmi" file. It must be null, or they'll have a chimp tail.
greater_form = SPECIES_AKULA
default_language = "Skrellian" //Closest we have.
// male_scream_sound = null //CHOMPedit
// female_scream_sound = null //CHOMPedit
/datum/species/monkey/sergal
name = SPECIES_MONKEY_SERGAL
greater_form = "Sergal"
icobase = 'icons/mob/human_races/monkeys/r_sergaling_vr.dmi'
deform = 'icons/mob/human_races/monkeys/r_sergaling_vr.dmi'
tail = null
default_language = LANGUAGE_SAGARU
// male_scream_sound = null //CHOMPedit
// female_scream_sound = null //CHOMPedit
/datum/species/monkey/sparra
name = SPECIES_MONKEY_NEVREAN
name_plural = "Sparra"
greater_form = SPECIES_NEVREAN
tail = null
icobase = 'icons/mob/human_races/monkeys/r_sparra_vr.dmi'
deform = 'icons/mob/human_races/monkeys/r_sparra_vr.dmi'
default_language = LANGUAGE_BIRDSONG
// male_scream_sound = null //CHOMPedit
// female_scream_sound = null //CHOMPedit
/* Example from Polaris code
/datum/species/monkey/tajaran
name = SPECIES_MONKEY_TAJ
name_plural = "Farwa"
icobase = 'icons/mob/human_races/monkeys/r_farwa.dmi'
deform = 'icons/mob/human_races/monkeys/r_farwa.dmi'
greater_form = SPECIES_TAJARAN
default_language = "Farwa"
flesh_color = "#AFA59E"
base_color = "#333333"
tail = "farwatail"
*/
/datum/species/monkey/vulpkanin
name = SPECIES_MONKEY_VULPKANIN
name_plural = "Wolpin"
icobase = 'icons/mob/human_races/monkeys/r_wolpin.dmi'
deform = 'icons/mob/human_races/monkeys/r_wolpin.dmi'
greater_form = SPECIES_VULPKANIN
default_language = LANGUAGE_CANILUNZT
flesh_color = "#966464"
base_color = "#000000"
tail = null
species_sounds = "Canine"
// male_scream_sound = null //CHOMPedit
// female_scream_sound = null //CHOMPedit
//INSERT CODE HERE SO MONKEYS CAN BE SPAWNED.
//Also, M was added to the end of the spawn names to signify that it's a monkey, since some names were conflicting.
/mob/living/carbon/human/sharkm
low_sorting_priority = TRUE
/mob/living/carbon/human/sharkm/Initialize(mapload)
. = ..(mapload, SPECIES_MONKEY_AKULA)
species.produceCopy(species.traits.Copy(),src,null,FALSE)
/mob/living/carbon/human/sergallingm
low_sorting_priority = TRUE
/mob/living/carbon/human/sergallingm/Initialize(mapload)
. = ..(mapload, SPECIES_MONKEY_SERGAL)
species.produceCopy(species.traits.Copy(),src,null,FALSE)
/mob/living/carbon/human/sparram
low_sorting_priority = TRUE
/mob/living/carbon/human/sparram/Initialize(mapload)
. = ..(mapload, SPECIES_MONKEY_NEVREAN)
species.produceCopy(species.traits.Copy(),src,null,FALSE)
/mob/living/carbon/human/wolpin
low_sorting_priority = TRUE
/mob/living/carbon/human/wolpin/Initialize(mapload)
. = ..(mapload, SPECIES_MONKEY_VULPKANIN)
species.produceCopy(species.traits.Copy(),src,null,FALSE)

View File

@@ -2,7 +2,6 @@ var/datum/species/shapeshifter/promethean/prometheans
// Species definition follows.
/datum/species/shapeshifter/promethean
name = SPECIES_PROMETHEAN
name_plural = "Prometheans"
blurb = "Prometheans (Macrolimus artificialis) are a species of artificially-created gelatinous humanoids, \
@@ -10,6 +9,7 @@ var/datum/species/shapeshifter/promethean/prometheans
mimic many forms of life. Derived from the Aetolian giant slime (Macrolimus vulgaris) inhabiting the warm, tropical planet \
of Aetolus, they are a relatively new lab-created sapient species, and as such many things about them have yet to be comprehensively studied. \
What has Science done?"
wikilink="https://wiki.vore-station.net/Promethean"
catalogue_data = list(/datum/category_item/catalogue/fauna/promethean)
show_ssd = "totally quiescent"
death_message = "rapidly loses cohesion, splattering across the ground..."
@@ -18,13 +18,13 @@ var/datum/species/shapeshifter/promethean/prometheans
blood_color = "#05FF9B"
flesh_color = "#05FFFB"
color_mult = 1
hunger_factor = 0.2
reagent_tag = IS_SLIME
mob_size = MOB_SMALL
bump_flag = SLIME
swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL
push_flags = MONKEY|SLIME|SIMPLE_ANIMAL
mob_size = MOB_MEDIUM
push_flags = ~HEAVY
swap_flags = ~HEAVY
flags = NO_DNA | NO_SLEEVE | NO_SLIP | NO_MINOR_CUT | NO_HALLUCINATION | NO_INFECT | NO_DEFIB
appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | RADIATION_GLOWS | HAS_UNDERWEAR
spawn_flags = SPECIES_CAN_JOIN
@@ -47,15 +47,11 @@ var/datum/species/shapeshifter/promethean/prometheans
// female_cough_sounds = list('sound/effects/slime_squish.ogg')
species_sounds = "Slime"
min_age = 1
max_age = 16
min_age = 18
max_age = 80
economic_modifier = 3
// male_scream_sound = null //CHOMPedit
// female_scream_sound = null //CHOMPedit
gluttonous = 1
virus_immune = 1
blood_volume = 560
brute_mod = 0.7 //chompedit Old values of .75 brute and 2 burn were imbalanced.
@@ -83,9 +79,9 @@ var/datum/species/shapeshifter/promethean/prometheans
siemens_coefficient = 0.8
water_resistance = 0
water_damage_mod = 0.3
water_damage_mod = 0
genders = list(MALE, FEMALE, NEUTER, PLURAL)
genders = list(MALE, FEMALE, PLURAL, NEUTER)
unarmed_types = list(/datum/unarmed_attack/slime_glomp)
@@ -118,13 +114,26 @@ var/datum/species/shapeshifter/promethean/prometheans
/mob/living/carbon/human/proc/shapeshifter_select_shape,
/mob/living/carbon/human/proc/shapeshifter_select_colour,
/mob/living/carbon/human/proc/shapeshifter_select_hair,
/mob/living/carbon/human/proc/shapeshifter_select_eye_colour,
/mob/living/carbon/human/proc/shapeshifter_select_hair_colors,
/mob/living/carbon/human/proc/shapeshifter_select_gender,
/mob/living/carbon/human/proc/regenerate
/mob/living/carbon/human/proc/regenerate,
/mob/living/carbon/human/proc/shapeshifter_select_wings,
/mob/living/carbon/human/proc/shapeshifter_select_tail,
/mob/living/carbon/human/proc/shapeshifter_select_ears,
/mob/living/carbon/human/proc/shapeshifter_select_secondary_ears,
/mob/living/carbon/human/proc/prommie_blobform,
/mob/living/proc/set_size,
/mob/living/carbon/human/proc/promethean_select_opaqueness,
/mob/living/carbon/human/proc/shapeshifter_reassemble //CHOMPEdit: reform verb
)
valid_transform_species = list(SPECIES_HUMAN, SPECIES_HUMAN_VATBORN, SPECIES_UNATHI, SPECIES_TAJARAN, SPECIES_SKRELL, SPECIES_DIONA, SPECIES_TESHARI, SPECIES_MONKEY)
valid_transform_species = list(
SPECIES_HUMAN, SPECIES_UNATHI, SPECIES_TAJARAN, SPECIES_SKRELL,
SPECIES_DIONA, SPECIES_TESHARI, SPECIES_MONKEY, SPECIES_SERGAL,
SPECIES_AKULA, SPECIES_NEVREAN, SPECIES_ZORREN_HIGH,
SPECIES_FENNEC, SPECIES_VULPKANIN, SPECIES_VASILISSAN,
SPECIES_RAPALA, SPECIES_MONKEY_SKRELL, SPECIES_MONKEY_UNATHI, SPECIES_MONKEY_TAJ, SPECIES_MONKEY_AKULA,
SPECIES_MONKEY_VULPKANIN, SPECIES_MONKEY_SERGAL, SPECIES_MONKEY_NEVREAN)
var/heal_rate = 0.5 // Temp. Regen per tick.
@@ -186,6 +195,14 @@ var/datum/species/shapeshifter/promethean/prometheans
H.apply_stored_shock_to(target)
/datum/species/shapeshifter/promethean/handle_death(var/mob/living/carbon/human/H)
if(!H)
return // Iono!
if(H.temporary_form)
H.forceMove(H.temporary_form.drop_location())
H.ckey = H.temporary_form.ckey
QDEL_NULL(H.temporary_form)
spawn(1)
if(H)
H.gib()
@@ -371,3 +388,28 @@ var/datum/species/shapeshifter/promethean/prometheans
return span_warning("[t_she] glowing brightly with high levels of electrical activity.")
if(35 to INFINITY)
return span_danger("[t_she] radiating massive levels of electrical activity!")
/mob/living/carbon/human/proc/prommie_blobform()
set name = "Toggle Blobform"
set desc = "Switch between amorphous and humanoid forms."
set category = "Abilities.Promethean"
set hidden = FALSE
var/atom/movable/to_locate = temporary_form || src
if(!isturf(to_locate.loc))
to_chat(to_locate,span_warning("You need more space to perform this action!"))
return
/*
//Blob form
if(temporary_form)
if(temporary_form.stat)
to_chat(temporary_form,span_warning("You can only do this while not stunned."))
else
prommie_outofblob(temporary_form)
*/
//Human form
else if(stat || paralysis || stunned || weakened || restrained())
to_chat(src,span_warning("You can only do this while not stunned."))
return
else
prommie_intoblob()

View File

@@ -1,80 +0,0 @@
/datum/species/shapeshifter/promethean
min_age = 18 //Required for server rules
max_age = 80
push_flags = ~HEAVY
swap_flags = ~HEAVY
gluttonous = 0
//water_damage_mod = 0 YW Edit
valid_transform_species = list(
SPECIES_HUMAN, SPECIES_UNATHI, SPECIES_TAJARAN, SPECIES_SKRELL,
SPECIES_DIONA, SPECIES_TESHARI, SPECIES_MONKEY, SPECIES_SERGAL,
SPECIES_AKULA, SPECIES_NEVREAN, SPECIES_ZORREN_HIGH,
SPECIES_FENNEC, SPECIES_VULPKANIN, SPECIES_VASILISSAN,
SPECIES_RAPALA, SPECIES_MONKEY_SKRELL, SPECIES_MONKEY_UNATHI, SPECIES_MONKEY_TAJ, SPECIES_MONKEY_AKULA,
SPECIES_MONKEY_VULPKANIN, SPECIES_MONKEY_SERGAL, SPECIES_MONKEY_NEVREAN)
spawn_flags = SPECIES_CAN_JOIN
wikilink="https://wiki.vore-station.net/Promethean"
genders = list(MALE, FEMALE, PLURAL, NEUTER)
color_mult = 1
mob_size = MOB_MEDIUM //As of writing, original was MOB_SMALL - Allows normal swapping
//var/mob/living/simple_mob/slime/promethean/stored_blob = null
appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | RADIATION_GLOWS | HAS_UNDERWEAR
inherent_verbs = list(
/mob/living/carbon/human/proc/shapeshifter_select_shape,
/mob/living/carbon/human/proc/shapeshifter_select_colour,
/mob/living/carbon/human/proc/shapeshifter_select_hair,
/mob/living/carbon/human/proc/shapeshifter_select_hair_colors,
/mob/living/carbon/human/proc/shapeshifter_select_gender,
/mob/living/carbon/human/proc/regenerate,
/mob/living/carbon/human/proc/shapeshifter_select_wings,
/mob/living/carbon/human/proc/shapeshifter_select_tail,
/mob/living/carbon/human/proc/shapeshifter_select_ears,
/mob/living/carbon/human/proc/shapeshifter_select_secondary_ears,
/mob/living/carbon/human/proc/prommie_blobform,
/mob/living/proc/set_size,
/mob/living/carbon/human/proc/promethean_select_opaqueness,
/mob/living/carbon/human/proc/shapeshifter_reassemble //CHOMPEdit: reform verb
)
/mob/living/carbon/human/proc/prommie_blobform()
set name = "Toggle Blobform"
set desc = "Switch between amorphous and humanoid forms."
set category = "Abilities.Promethean"
set hidden = FALSE
var/atom/movable/to_locate = temporary_form || src
if(!isturf(to_locate.loc))
to_chat(to_locate,span_warning("You need more space to perform this action!"))
return
/*
//Blob form
if(temporary_form)
if(temporary_form.stat)
to_chat(temporary_form,span_warning("You can only do this while not stunned."))
else
prommie_outofblob(temporary_form)
*/
//Human form
else if(stat || paralysis || stunned || weakened || restrained())
to_chat(src,span_warning("You can only do this while not stunned."))
return
else
prommie_intoblob()
/datum/species/shapeshifter/promethean/handle_death(var/mob/living/carbon/human/H)
if(!H)
return // Iono!
if(H.temporary_form)
H.forceMove(H.temporary_form.drop_location())
H.ckey = H.temporary_form.ckey
QDEL_NULL(H.temporary_form)
//else if(H.stored_blob) // Should prevent phantom blobs in the aether. I don't anticipate this being an issue, but if it is just uncomment.
// qdel(stored_blob)
// stored_blob = null
spawn(1)
if(H)
H.gib()

File diff suppressed because it is too large Load Diff

View File

@@ -2,7 +2,7 @@
/mob/living/proc/succubus_bite()
set name = "Inject Prey"
set desc = "Bite prey and inject them with various toxins."
set category = "Abilities.Succubus" //CHOMPEdit
set category = "Abilities.Succubus"
if(last_special > world.time)
return
@@ -120,7 +120,7 @@ var/eggs = 0
/mob/living/proc/mobegglaying()
set name = "Egg laying"
set desc = "you can lay Eggs"
set category = "Abilities.General" //CHOMPEdit
set category = "Abilities.General"
var/mob/living/carbon/human/C = src
@@ -174,7 +174,7 @@ var/eggs = 0
/mob/living/proc/insect_sting()
set name = "Insect Sting"
set desc = "Sting a target and inject a small amount of toxin"
set category = "Abilities.General" //CHOMPEdit
set category = "Abilities.General"
if(last_special > world.time)
return

View File

@@ -1,489 +0,0 @@
///////////////File for all snowflake/special races/////////////////////////////
/////Anything that is spectacularly special should be put in here///////////////
////////////////////////////////////////////////////////////////////////////////
/datum/species/xenochimera //Scree's race.
name = SPECIES_XENOCHIMERA
name_plural = "Xenochimeras"
icobase = 'icons/mob/human_races/r_xenochimera.dmi'
deform = 'icons/mob/human_races/r_def_xenochimera.dmi'
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/chimera, /datum/unarmed_attack/bite/sharp)
darksight = 8 //critters with instincts to hide in the dark need to see in the dark - about as good as tajara.
slowdown = -0.2 //scuttly, but not as scuttly as a tajara or a teshari.
brute_mod = 0.8 //About as tanky to brute as a Unathi. They'll probably snap and go feral when hurt though.
burn_mod = 1.15 //As vulnerable to burn as a Tajara.
base_species = "Xenochimera"
selects_bodytype = SELECTS_BODYTYPE_CUSTOM
digi_allowed = TRUE
has_vibration_sense = TRUE
num_alternate_languages = 3
species_language = null
secondary_langs = list("Sol Common")
//color_mult = 1 //It seemed to work fine in testing, but I've been informed it's unneeded.
tail = "tail" //Scree's tail. Can be disabled in the vore tab by choosing "hide species specific tail sprite"
icobase_tail = 1
inherent_verbs = list(
/mob/living/carbon/human/proc/reconstitute_form,
///mob/living/carbon/human/proc/sonar_ping,
/mob/living/carbon/human/proc/tie_hair,
/mob/living/carbon/human/proc/lick_wounds,
/mob/living/carbon/human/proc/shapeshifter_reassemble) //Xenochimera get all the special verbs since they can't select traits.
// CHOMPEdit: Lick Wounds Verb, reform verb
virus_immune = 1 // They practically ARE one.
min_age = 18
max_age = 80
species_sounds = "Unset" // CHOMPEdit: Chimera get a default/safety of unset, going off their icon base if there's none overriding.
blurb = "Some amalgamation of different species from across the universe,with extremely unstable DNA, making them unfit for regular cloners. \
Widely known for their voracious nature and violent tendencies when stressed or left unfed for long periods of time. \
Most, if not all chimeras possess the ability to undergo some type of regeneration process, at the cost of energy."
//CHOMPStation Removal TFF 12/24/19 - Wikilinks removed
// wikilink = "https://www.yawn.ocry.com/Xenochimera"
catalogue_data = list(/datum/category_item/catalogue/fauna/xenochimera)
hazard_low_pressure = -1 //Prevents them from dying normally in space. Special code handled below.
cold_level_1 = -1 // All cold debuffs are handled below in handle_environment_special
cold_level_2 = -1
cold_level_3 = -1
//primitive_form = SPECIES_MONKEY_TAJ
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE//Whitelisted as restricted is broken.
flags = NO_SLEEVE | NO_DNA | NO_INFECT // | NO_DEFIB // Dying as a chimera is, quite literally, a death sentence. Well, if it wasn't for their revive, that is. Leaving NO_DEFIB there for the future/in case reversion to old 'chimera no-defib.
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
genders = list(MALE, FEMALE, PLURAL, NEUTER)
has_organ = list( //Same organ list as tajarans, except for their SPECIAL BRAIN.
O_HEART = /obj/item/organ/internal/heart,
O_LUNGS = /obj/item/organ/internal/lungs,
O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain/xenochimera,
O_EYES = /obj/item/organ/internal/eyes,
O_STOMACH = /obj/item/organ/internal/stomach,
O_INTESTINE = /obj/item/organ/internal/intestine
)
flesh_color = "#AFA59E"
base_color = "#333333"
blood_color = "#14AD8B"
reagent_tag = IS_CHIMERA
/datum/species/xenochimera/handle_environment_special(var/mob/living/carbon/human/H)
//If they're KO'd/dead, or reviving, they're probably not thinking a lot about much of anything.
if(!H.stat || !(H.revive_ready == REVIVING_NOW || H.revive_ready == REVIVING_DONE))
handle_feralness(H)
//While regenerating
if(H.revive_ready == REVIVING_NOW || H.revive_ready == REVIVING_DONE)
H.stunned = 5 // CHOMPEdit - Crawling is a thing now
H.canmove = 0
H.does_not_breathe = TRUE
var/regen_sounds = H.regen_sounds
if(prob(2)) // 2% chance of playing squelchy noise while reviving, which is run roughly every 2 seconds/tick while regenerating.
playsound(H, pick(regen_sounds), 30)
H.visible_message(span_danger("<p>" + span_huge("[H.name]'s motionless form shudders grotesquely, rippling unnaturally.") + "</p>"))
// CHOMPAdd - F A L L
if(!H.lying)
H.lay_down()
//Cold/pressure effects when not regenerating
else
var/datum/gas_mixture/environment = H.loc.return_air()
var/pressure2 = environment.return_pressure()
var/adjusted_pressure2 = H.calculate_affecting_pressure(pressure2)
//Very low pressure damage
if(adjusted_pressure2 <= 20)
H.take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure")
//they handle areas where they can't breathe better than most, but it still lowers their effective health as well as all the other bad stuff that comes with unbreathable environments
if(H.getOxyLoss() >= 50)
H.does_not_breathe = TRUE
//Cold hurts and gives them pain messages, eventually weakening and paralysing, but doesn't damage or trigger feral.
//NB: 'body_temperature' used here is the 'setpoint' species var
var/temp_diff = body_temperature - H.bodytemperature
if(temp_diff >= 50)
H.shock_stage = min(H.shock_stage + (temp_diff/20), 160) // Divided by 20 is the same as previous numbers, but a full scale
H.eye_blurry = max(5,H.eye_blurry)
/obj/item/organ/internal/brain/xenochimera
var/laststress = 0
/datum/species/xenochimera/proc/handle_feralness(var/mob/living/carbon/human/H)
//first, calculate how stressed the chimera is
var/laststress = 0
var/obj/item/organ/internal/brain/xenochimera/B = H.internal_organs_by_name[O_BRAIN]
if(B) //if you don't have a chimera brain in a chimera body somehow, you don't get the feraless protection
laststress = B.laststress
//Low-ish nutrition has messages and can eventually cause feralness
var/hunger = max(0, 150 - H.nutrition)
//pain makes feralness a thing
var/shock = 0.75*H.traumatic_shock
//Caffeinated or otherwise overexcited xenochimera can become feral and have special messages
var/jittery = max(0, H.jitteriness - 100)
//To reduce distant object references
var/feral = H.feral
//Are we in danger of ferality?
var/danger = FALSE
var/feral_state = FALSE
//finally, calculate the current stress total the chimera is operating under, and the cause
var/currentstress = (hunger + shock + jittery)
var/cause = "stress"
if(hunger > shock && hunger > jittery)
cause = "hunger"
else if (shock > hunger && shock > jittery)
cause = "shock"
else if (jittery > shock && jittery > hunger)
cause = "jittery"
//check to see if they go feral if they weren't before
if(!feral && !isbelly(H.loc))
// if stress is below 15, no chance of snapping. Also if they weren't feral before, they won't suddenly become feral unless they get MORE stressed
if((currentstress > laststress) && prob(clamp(currentstress-15, 0, 100)) )
go_feral(H, currentstress, cause)
feral = currentstress //update the local var
//they didn't go feral, give 'em a chance of hunger messages
else if(H.nutrition <= 200 && prob(0.5))
switch(H.nutrition)
if(150 to 200)
to_chat(H,span_info("You feel rather hungry. It might be a good idea to find some some food..."))
if(100 to 150)
to_chat(H,span_warning("You feel like you're going to snap and give in to your hunger soon... It would be for the best to find some [pick("food","prey")] to eat..."))
danger = TRUE
//now the check's done, update their brain so it remembers how stressed they were
if(B && !isbelly(H.loc)) //another sanity check for brain implant shenanigans, also no you don't get to hide in a belly and get your laststress set to a huge amount to skip rolls
B.laststress = currentstress
// Handle being feral
if(feral)
//We're feral
feral_state = TRUE
//If they're still stressed, they stay feral
if(currentstress >= 15)
danger = TRUE
feral = max(feral, currentstress)
else
feral = max(0,--feral)
// Being in a belly or in the darkness decreases stress further. Helps mechanically reward players for staying in darkness + RP'ing appropriately. :9
var/turf/T = get_turf(H)
if(feral && (isbelly(H.loc) || T.get_lumcount() <= 0.1))
feral = max(0,--feral)
//Set our real mob's var to our temp var
H.feral = feral
//Did we just finish being feral?
if(!feral)
feral_state = FALSE
to_chat(H,span_info("Your thoughts start clearing, your feral urges having passed - for the time being, at least."))
log_and_message_admins("is no longer feral.", H)
update_xenochimera_hud(H, danger, feral_state)
return
//If they lose enough health to hit softcrit, handle_shock() will keep resetting this. Otherwise, pissed off critters will lose shock faster than they gain it.
H.shock_stage = max(H.shock_stage-(feral/20), 0)
//Handle light/dark areas
var/turf/T = get_turf(H)
if(!T)
update_xenochimera_hud(H, danger, feral_state)
return //Nullspace
var/darkish = T.get_lumcount() <= 0.1
//Don't bother doing heavy lifting if we weren't going to give emotes anyway.
if(!prob(1))
//This is basically the 'lite' version of the below block.
var/list/nearby = H.living_mobs(world.view)
//Not in the dark, or a belly, and out in the open.
if(!darkish && isturf(H.loc) && !isbelly(H.loc)) // Added specific check for if in belly
//Always handle feral if nobody's around and not in the dark.
if(!nearby.len)
H.handle_feral()
//Rarely handle feral if someone is around
else if(prob(1))
H.handle_feral()
//And bail
update_xenochimera_hud(H, danger, feral_state)
return
// In the darkness, or "hidden", or in a belly. No need for custom scene-protection checks as it's just an occational infomessage.
if(darkish || !isturf(H.loc) || isbelly(H.loc)) // Specific check for if in belly. !isturf should do this, but JUST in case.
// If hurt, tell 'em to heal up
if (cause == "shock")
to_chat(H,span_info("This place seems safe, secure, hidden, a place to lick your wounds and recover..."))
//If hungry, nag them to go and find someone or something to eat.
else if(cause == "hunger")
to_chat(H,span_info("Secure in your hiding place, your hunger still gnaws at you. You need to catch some food..."))
//If jittery, etc
else if(cause == "jittery")
to_chat(H,span_info("sneakysneakyyesyesyescleverhidingfindthingsyessssss"))
//Otherwise, just tell them to keep hiding.
else
to_chat(H,span_info("...safe..."))
// NOT in the darkness
else
//Twitch twitch
if(!H.stat)
H.emote("twitch")
var/list/nearby = H.living_mobs(world.view)
// Someone/something nearby
if(nearby.len)
var/M = pick(nearby)
if(cause == "shock")
to_chat(H,span_danger("You're hurt, in danger, exposed, and [M] looks to be a little too close for comfort..."))
else
to_chat(H,span_danger("Every movement, every flick, every sight and sound has your full attention, your hunting instincts on high alert... In fact, [M] looks extremely appetizing..."))
// Nobody around
else
if(cause == "hunger")
to_chat(H,span_danger("Confusing sights and sounds and smells surround you - scary and disorienting it may be, but the drive to hunt, to feed, to survive, compels you."))
else if(cause == "jittery")
to_chat(H,span_danger("yesyesyesyesyesyesgetthethingGETTHETHINGfindfoodsfindpreypounceyesyesyes"))
else
to_chat(H,span_danger("Confusing sights and sounds and smells surround you, this place is wrong, confusing, frightening. You need to hide, go to ground..."))
// HUD update time
update_xenochimera_hud(H, danger, feral_state)
/datum/species/xenochimera/proc/go_feral(var/mob/living/carbon/human/H, var/stress, var/cause)
// Going feral due to hunger
if(cause == "hunger")
to_chat(H,span_danger(span_large("Something in your mind flips, your instincts taking over, no longer able to fully comprehend your surroundings as survival becomes your primary concern - you must feed, survive, there is nothing else. Hunt. Eat. Hide. Repeat.")))
log_and_message_admins("has gone feral due to hunger.", H)
// If they're hurt, chance of snapping.
else if(cause == "shock")
//If the majority of their shock is due to halloss, give them a different message (3x multiplier on check as halloss is 2x - meaning t_s must be at least 3x for other damage sources to be the greater part)
if(3*H.halloss >= H.traumatic_shock)
to_chat(H,span_danger(span_large("The pain! It stings! Got to get away! Your instincts take over, urging you to flee, to hide, to go to ground, get away from here...")))
log_and_message_admins("has gone feral due to halloss.", H)
//Majority due to other damage sources
else
to_chat(H,span_danger(span_large("Your fight-or-flight response kicks in, your injuries too much to simply ignore - you need to flee, to hide, survive at all costs - or destroy whatever is threatening you.")))
log_and_message_admins("has gone feral due to injury.", H)
//No hungry or shock, but jittery
else if(cause == "jittery")
to_chat(H,span_warning(span_large("Suddenly, something flips - everything that moves is... potential prey. A plaything. This is great! Time to hunt!")))
log_and_message_admins("has gone feral due to jitteriness.", H)
else // catch-all just in case something weird happens
to_chat(H,span_warning(span_large("The stress of your situation is too much for you, and your survival instincts kick in!")))
log_and_message_admins("has gone feral for unknown reasons.", H)
//finally, set their feral var
H.feral = stress
if(!H.stat)
H.emote("twitch")
/datum/species/xenochimera/get_race_key()
var/datum/species/real = GLOB.all_species[base_species]
return real.race_key
/datum/species/xenochimera/proc/update_xenochimera_hud(var/mob/living/carbon/human/H, var/danger, var/feral)
if(H.xenochimera_danger_display)
H.xenochimera_danger_display.invisibility = 0
if(danger && feral)
H.xenochimera_danger_display.icon_state = "danger11"
else if(danger && !feral)
H.xenochimera_danger_display.icon_state = "danger10"
else if(!danger && feral)
H.xenochimera_danger_display.icon_state = "danger01"
else
H.xenochimera_danger_display.icon_state = "danger00"
return
/////////////////////
/////SPIDER RACE/////
/////////////////////
/datum/species/spider //These actually look pretty damn spooky!
name = SPECIES_VASILISSAN
name_plural = "Vasilissans"
icobase = 'icons/mob/human_races/r_spider.dmi'
deform = 'icons/mob/human_races/r_def_spider.dmi'
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
darksight = 8 //Can see completely in the dark. They are spiders, after all. Not that any of this matters because people will be using custom race.
slowdown = -0.15 //Small speedboost, as they've got a bunch of legs. Or something. I dunno.
brute_mod = 0.8 //20% brute damage reduction
burn_mod = 1.15 //15% burn damage increase. They're spiders. Aerosol can+lighter = dead spiders.
throwforce_absorb_threshold = 10
digi_allowed = TRUE
num_alternate_languages = 3
species_language = LANGUAGE_VESPINAE
secondary_langs = list(LANGUAGE_VESPINAE)
color_mult = 1
tail = "tail" //Spider tail.
icobase_tail = 1
inherent_verbs = list(
/mob/living/carbon/human/proc/check_silk_amount,
/mob/living/carbon/human/proc/toggle_silk_production,
/mob/living/carbon/human/proc/weave_structure,
/mob/living/carbon/human/proc/weave_item,
/mob/living/carbon/human/proc/set_silk_color,
/mob/living/carbon/human/proc/tie_hair)
min_age = 18
max_age = 80
species_sounds = "Spider"
// male_scream_sound = null //CHOMPedit
// female_scream_sound = null //CHOMPedit
blurb = "Vasilissans are a tall, lanky, spider like people. \
Each having four eyes, an extra four, large legs sprouting from their back, and a chitinous plating on their body, and the ability to spit webs \
from their mandible lined mouths. They are a recent discovery by Nanotrasen, only being discovered roughly seven years ago. \
Before they were found they built great cities out of their silk, being united and subjugated in warring factions under great “Star Queens” \
Who forced the working class to build huge, towering cities to attempt to reach the stars, which they worship as gems of great spiritual and magical significance."
//CHOMPStation Removal TFF 12/24/19 - Wikilinks removed
// wikilink = "https://www.yawn.ocry.com/Vasilissans"
catalogue_data = list(/datum/category_item/catalogue/fauna/vasilissan)
hazard_low_pressure = 20 //Prevents them from dying normally in space. Special code handled below.
cold_level_1 = -1 // All cold debuffs are handled below in handle_environment_special
cold_level_2 = -1
cold_level_3 = -1
//primitive_form = SPECIES_MONKEY //I dunno. Replace this in the future.
flags = NO_MINOR_CUT
spawn_flags = SPECIES_CAN_JOIN
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
genders = list(MALE, FEMALE, PLURAL, NEUTER)
flesh_color = "#AFA59E" //Gray-ish. Not sure if this is really needed, but eh.
base_color = "#333333" //Blackish-gray
blood_color = "#0952EF" //Spiders have blue blood.
is_weaver = TRUE
silk_reserve = 500
silk_max_reserve = 1000
climb_mult = 0.75
/datum/species/spider/handle_environment_special(var/mob/living/carbon/human/H)
if(H.stat == DEAD) // If they're dead they won't need anything.
return
if(H.bodytemperature <= 260) //If they're really cold, they go into stasis.
var/coldshock = 0
if(H.bodytemperature <= 260 && H.bodytemperature >= 200) //Chilly.
coldshock = 4 //This will begin to knock them out until they run out of oxygen and suffocate or until someone finds them.
H.eye_blurry = 5 //Blurry vision in the cold.
if(H.bodytemperature <= 199 && H.bodytemperature >= 100) //Extremely cold. Even in somewhere like the server room it takes a while for bodytemp to drop this low.
coldshock = 8
H.eye_blurry = 5
if(H.bodytemperature <= 99) //Insanely cold.
coldshock = 16
H.eye_blurry = 5
H.shock_stage = min(H.shock_stage + coldshock, 160) //cold hurts and gives them pain messages, eventually weakening and paralysing, but doesn't damage.
return
/datum/species/werebeast
name = SPECIES_WEREBEAST
name_plural = "Werebeasts"
icobase = 'icons/mob/human_races/r_werebeast.dmi'
deform = 'icons/mob/human_races/r_def_werebeast.dmi'
icon_template = 'icons/mob/human_races/r_werebeast.dmi'
tail = "tail"
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
total_health = 200
brute_mod = 0.85
burn_mod = 0.85
metabolic_rate = 2
item_slowdown_mod = 0.25
hunger_factor = 0.4
darksight = 8
mob_size = MOB_LARGE
num_alternate_languages = 3
secondary_langs = list(LANGUAGE_CANILUNZT)
name_language = LANGUAGE_CANILUNZT
species_language = LANGUAGE_CANILUNZT
primitive_form = SPECIES_MONKEY_VULPKANIN
color_mult = 1
icon_height = 64
can_climb = TRUE
climbing_delay = 1
min_age = 18
max_age = 200
// CHOMPEdit Start: Species Sounds
species_sounds = "Canine"
// male_scream_sound = null
// female_scream_sound = null
// CHOMPEdit End
blurb = "Big buff werewolves. These are a limited functionality event species that are not balanced for regular gameplay. Adminspawn only."
wikilink="N/A"
catalogue_data = list(/datum/category_item/catalogue/fauna/vulpkanin)
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE//Whitelisted as restricted is broken. ChompEdit;renable
appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_EYE_COLOR
flesh_color = "#AFA59E"
base_color = "#777777"
genders = list(MALE, FEMALE, PLURAL, NEUTER)
heat_discomfort_strings = list(
"Your fur prickles in the heat.",
"You feel uncomfortably warm.",
"Your overheated skin itches."
)
has_limbs = list(
BP_TORSO = list("path" = /obj/item/organ/external/chest),
BP_GROIN = list("path" = /obj/item/organ/external/groin),
BP_HEAD = list("path" = /obj/item/organ/external/head/werebeast),
BP_L_ARM = list("path" = /obj/item/organ/external/arm),
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
BP_L_LEG = list("path" = /obj/item/organ/external/leg),
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
BP_L_HAND = list("path" = /obj/item/organ/external/hand),
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
)

View File

@@ -1,27 +0,0 @@
/datum/species/teshari
mob_size = MOB_MEDIUM
spawn_flags = SPECIES_CAN_JOIN
icobase = 'icons/mob/human_races/r_teshari_vr.dmi'
deform = 'icons/mob/human_races/r_teshari_vr.dmi'
icobase_tail = 1
color_mult = 1
min_age = 18
push_flags = ~HEAVY //Allows them to use micro step code.
swap_flags = ~HEAVY
gluttonous = 0
genders = list(MALE, FEMALE, PLURAL, NEUTER)
descriptors = list()
wikilink="https://wiki.chompstation13.net/index.php?title=Teshari" //CHOMPedit: link to our wiki
agility = 90
/* Begin Chomp edit
male_sneeze_sound = list('sound/effects/mob_effects/tesharisneeze.ogg','sound/effects/mob_effects/tesharisneezeb.ogg')
female_sneeze_sound = list('sound/effects/mob_effects/tesharisneeze.ogg','sound/effects/mob_effects/tesharisneezeb.ogg')
End Chomp Edit */
vore_belly_default_variant = "T" //Teshari belly sprite
inherent_verbs = list(
///mob/living/carbon/human/proc/sonar_ping,
/mob/living/proc/hide,
/mob/living/proc/toggle_pass_table
)

View File

@@ -740,3 +740,14 @@
custom_only = TRUE
var_changes = list("flags" = NO_SLEEVE | NO_DEFIB)
excludes = list(/datum/trait/negative/nodefib, /datum/trait/negative/noresleeve)
// Why put this on Xenochimera of all species? I have no idea, but someone may be enough of a lunatic to take it.
/datum/trait/negative/neural_hypersensitivity/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Neural Hypersensitivity"
desc = "Despite your evolutionary efforts, you are unusually sensitive to pain. \
Given your species' typical reactions to pain, this can only end well for you!"
cost = 0
category = 0
custom_only = FALSE

View File

@@ -1440,3 +1440,57 @@
..()
H.touch_reaction_flags |= SPECIES_TRAIT_PERSONAL_BUBBLE
add_verb(H, /mob/living/proc/toggle_personal_space)
/* // Commented out in lieu of finding a better solution.
/datum/trait/neutral/coldadapt/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Temp. Adapted, Cold"
desc = "You have adapted to withstand much colder temperatures than other species, and can even be comfortable in extremely cold environments. You are also more vulnerable to hot environments, and have a lower body temperature as a consequence of these adaptations, thanks to your evolutionary efforts."
cost = 0
category = 0
can_take = ORGANICS // (Not sure if this is needed for Xenochimera-specific sub-version.)
custom_only = FALSE
excludes = list(/datum/trait/neutral/hotadapt, /datum/trait/neutral/hotadapt/xenochimera)
/datum/trait/neutral/hotadapt/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Temp. Adapted, Heat"
desc = "You have adapted to withstand much hotter temperatures than other species, and can even be comfortable in extremely hot environments. You are also more vulnerable to cold environments, and have a higher body temperature as a consequence of these adaptations, thanks to your evolutionary efforts."
cost = 0
category = 0
can_take = ORGANICS // negates the need for suit coolers entirely for synths, so no. (Not sure if this is needed for Xenochimera-specific sub-version.)
custom_only = FALSE
excludes = list(/datum/trait/neutral/coldadapt, /datum/trait/neutral/coldadapt/xenochimera)
*/
/datum/trait/neutral/autohiss_unathi/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Autohiss (Unathi)"
desc = "You roll your S's and x's"
cost = 0
custom_only = FALSE
var_changes = list(
autohiss_basic_map = list(
"s" = list("ss", "sss", "ssss")
),
autohiss_extra_map = list(
"x" = list("ks", "kss", "ksss")
),
autohiss_exempt = list("Sinta'unathi"))
excludes = list(/datum/trait/neutral/autohiss_tajaran)
/datum/trait/neutral/autohiss_tajaran/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Autohiss (Tajaran)"
desc = "You roll your R's."
cost = 0
custom_only = FALSE
var_changes = list(
autohiss_basic_map = list(
"r" = list("rr", "rrr", "rrrr")
),
autohiss_exempt = list("Siik"))
excludes = list(/datum/trait/neutral/autohiss_unathi)

View File

@@ -412,3 +412,68 @@
cost = 2
custom_only = TRUE
var_changes = list("flags" = NO_DNA)
/datum/trait/positive/weaver/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Weaver"
desc = "You've evolved your body to produce silk that you can fashion into articles of clothing and other objects."
cost = 0
category = 0
custom_only = FALSE
/datum/trait/positive/hardfeet/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Hard Feet"
desc = "Your body has adapted to make your feet immune to glass shards, whether by developing hooves, chitin, or just horrible callous."
cost = 0
category = 0
custom_only = FALSE
/datum/trait/positive/melee_attack_fangs/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Sharp Melee & Numbing Fangs"
desc = "Your hunting instincts manifest in earnest! You have grown numbing fangs alongside your naturally grown hunting weapons."
cost = 0
category = 0
custom_only = FALSE
var_changes = list("unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/chimera, /datum/unarmed_attack/bite/sharp, /datum/unarmed_attack/bite/sharp/numbing)) // Fixes the parent forgetting to add 'chimera-specific claws
/datum/trait/positive/snowwalker/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Snow Walker"
desc = "You've adapted to traversing snowy terrain. Snow does not slow you down!"
cost = 0
category = 0
custom_only = FALSE
/datum/trait/positive/aquatic/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Aquatic"
desc = "You can breathe under water and can traverse water more efficiently. Additionally, you can eat others in the water."
cost = 0
category = 0
excludes = list(/datum/trait/positive/winged_flight/xenochimera)
custom_only = FALSE
/datum/trait/positive/winged_flight/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochhimera: Winged Flight"
desc = "Allows you to fly by using your wings. Don't forget to bring them!"
cost = 0
excludes = list(/datum/trait/positive/aquatic/xenochimera)
custom_only = FALSE
/datum/trait/positive/cocoon_tf/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
custom_only = FALSE
name = "Xenochimera: Cocoon Spinner"
desc = "Allows you to build a cocoon around yourself, using it to transform your body if you desire."
cost = 0
category = 0

View File

@@ -1,8 +0,0 @@
/obj/screen/xenochimera
icon = 'icons/mob/chimerahud.dmi'
invisibility = 101
/obj/screen/xenochimera/danger_level
name = "danger level"
icon_state = "danger00" //first number is bool of whether or not we're in danger, second is whether or not we're feral
alpha = 200

View File

@@ -1,158 +0,0 @@
/* CHOMPEdit: Changed the file comment-header to be more clear.
** For now, these are just neutral traits for Xenochimera only to take.
** Traits defined as custom_only = FALSE in neutral.dm will be available for Xenochimera to take as well.
** As such, be careful not to duplicate the traits, and only add dupes where necessary.
** IE: Heat/Cold Adapt and autohisses are added to Xenochimera because they reasonably could have evolved it, along with custom species.
** However, if custom_only = FALSE is set, then any species including things like humans can take it. A little silly.
** Therefore, use this file only for Xenochimera traits that you want to keep custom + Xenochim only.
*/
/datum/trait/positive/weaver/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Weaver"
desc = "You've evolved your body to produce silk that you can fashion into articles of clothing and other objects."
cost = 0
category = 0
custom_only = FALSE
/datum/trait/positive/hardfeet/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Hard Feet"
desc = "Your body has adapted to make your feet immune to glass shards, whether by developing hooves, chitin, or just horrible callous."
cost = 0
category = 0
custom_only = FALSE
// Why put this on Xenochimera of all species? I have no idea, but someone may be enough of a lunatic to take it.
/datum/trait/negative/neural_hypersensitivity/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Neural Hypersensitivity"
desc = "Despite your evolutionary efforts, you are unusually sensitive to pain. \
Given your species' typical reactions to pain, this can only end well for you!"
cost = 0
category = 0
custom_only = FALSE
/datum/trait/positive/melee_attack_fangs/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Sharp Melee & Numbing Fangs"
desc = "Your hunting instincts manifest in earnest! You have grown numbing fangs alongside your naturally grown hunting weapons."
cost = 0
category = 0
custom_only = FALSE
var_changes = list("unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/chimera, /datum/unarmed_attack/bite/sharp, /datum/unarmed_attack/bite/sharp/numbing)) // Fixes the parent forgetting to add 'chimera-specific claws
/datum/trait/positive/snowwalker/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Snow Walker"
desc = "You've adapted to traversing snowy terrain. Snow does not slow you down!"
cost = 0
category = 0
custom_only = FALSE
/datum/trait/positive/aquatic/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Aquatic"
desc = "You can breathe under water and can traverse water more efficiently. Additionally, you can eat others in the water."
cost = 0
category = 0
excludes = list(/datum/trait/positive/winged_flight/xenochimera)
custom_only = FALSE
/datum/trait/positive/winged_flight/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochhimera: Winged Flight"
desc = "Allows you to fly by using your wings. Don't forget to bring them!"
cost = 0
excludes = list(/datum/trait/positive/aquatic/xenochimera)
custom_only = FALSE
/* // Commented out in lieu of finding a better solution.
/datum/trait/neutral/coldadapt/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Temp. Adapted, Cold"
desc = "You have adapted to withstand much colder temperatures than other species, and can even be comfortable in extremely cold environments. You are also more vulnerable to hot environments, and have a lower body temperature as a consequence of these adaptations, thanks to your evolutionary efforts."
cost = 0
category = 0
can_take = ORGANICS // (Not sure if this is needed for Xenochimera-specific sub-version.)
custom_only = FALSE
excludes = list(/datum/trait/neutral/hotadapt, /datum/trait/neutral/hotadapt/xenochimera)
/datum/trait/neutral/hotadapt/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Temp. Adapted, Heat"
desc = "You have adapted to withstand much hotter temperatures than other species, and can even be comfortable in extremely hot environments. You are also more vulnerable to cold environments, and have a higher body temperature as a consequence of these adaptations, thanks to your evolutionary efforts."
cost = 0
category = 0
can_take = ORGANICS // negates the need for suit coolers entirely for synths, so no. (Not sure if this is needed for Xenochimera-specific sub-version.)
custom_only = FALSE
excludes = list(/datum/trait/neutral/coldadapt, /datum/trait/neutral/coldadapt/xenochimera)
*/
/datum/trait/neutral/autohiss_unathi/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Autohiss (Unathi)"
desc = "You roll your S's and x's"
cost = 0
custom_only = FALSE
var_changes = list(
autohiss_basic_map = list(
"s" = list("ss", "sss", "ssss")
),
autohiss_extra_map = list(
"x" = list("ks", "kss", "ksss")
),
autohiss_exempt = list("Sinta'unathi"))
excludes = list(/datum/trait/neutral/autohiss_tajaran, /datum/trait/neutral/autohiss_vassilian) //YW edit: exclude vassillian hiss
/datum/trait/neutral/autohiss_tajaran/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Autohiss (Tajaran)"
desc = "You roll your R's."
cost = 0
custom_only = FALSE
var_changes = list(
autohiss_basic_map = list(
"r" = list("rr", "rrr", "rrrr")
),
autohiss_exempt = list("Siik"))
excludes = list(/datum/trait/neutral/autohiss_unathi, /datum/trait/neutral/autohiss_vassilian) //YW edit: exclude vassillian hiss
/datum/trait/neutral/autohiss_vassilian/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Autohiss (Vassilian)"
desc = "You buzz your S's, F's, Th's, and R's."
cost = 0
custom_only = FALSE
var_changes = list(
autohiss_basic_map = list(
"s" = list("sz", "z", "zz"),
"f" = list("zk")
),
autohiss_extra_map = list(
"th" = list("zk", "szk"),
"r" = list("rk")
),
autohiss_exempt = list("Vespinae"))
excludes = list(/datum/trait/neutral/autohiss_tajaran, /datum/trait/neutral/autohiss_unathi)
//End YW edit
/datum/trait/positive/cocoon_tf/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
custom_only = FALSE
name = "Xenochimera: Cocoon Spinner"
desc = "Allows you to build a cocoon around yourself, using it to transform your body if you desire."
cost = 0
category = 0

View File

@@ -19,6 +19,7 @@ GLOBAL_LIST_BOILERPLATE(all_brain_organs, /obj/item/organ/internal/brain)
var/mob/living/carbon/brain/brainmob = null
var/can_assist = TRUE
var/defib_timer = -1
var/laststress = 0
/obj/item/organ/internal/brain/process()
..()

View File

@@ -3301,14 +3301,10 @@
#include "code\modules\mob\living\carbon\human\descriptors\descriptors_vox.dm"
#include "code\modules\mob\living\carbon\human\species\species.dm"
#include "code\modules\mob\living\carbon\human\species\species_attack.dm"
#include "code\modules\mob\living\carbon\human\species\species_attack_vr.dm"
#include "code\modules\mob\living\carbon\human\species\species_getters.dm"
#include "code\modules\mob\living\carbon\human\species\species_getters_vr.dm"
#include "code\modules\mob\living\carbon\human\species\species_helpers.dm"
#include "code\modules\mob\living\carbon\human\species\species_hud.dm"
#include "code\modules\mob\living\carbon\human\species\species_shapeshift.dm"
#include "code\modules\mob\living\carbon\human\species\species_shapeshift_vr.dm"
#include "code\modules\mob\living\carbon\human\species\species_vr.dm"
#include "code\modules\mob\living\carbon\human\species\lleill\hanner.dm"
#include "code\modules\mob\living\carbon\human\species\lleill\lleill.dm"
#include "code\modules\mob\living\carbon\human\species\lleill\lleill_abilities.dm"
@@ -3324,45 +3320,37 @@
#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_abilities.dm"
#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_hud.dm"
#include "code\modules\mob\living\carbon\human\species\station\alraune.dm"
#include "code\modules\mob\living\carbon\human\species\station\blank_vr.dm"
#include "code\modules\mob\living\carbon\human\species\station\custom.dm"
#include "code\modules\mob\living\carbon\human\species\station\golem.dm"
#include "code\modules\mob\living\carbon\human\species\station\greyYW.dm"
#include "code\modules\mob\living\carbon\human\species\station\human_subspecies.dm"
#include "code\modules\mob\living\carbon\human\species\station\monkey.dm"
#include "code\modules\mob\living\carbon\human\species\station\monkey_vr.dm"
#include "code\modules\mob\living\carbon\human\species\station\prometheans.dm"
#include "code\modules\mob\living\carbon\human\species\station\prometheans_vr.dm"
#include "code\modules\mob\living\carbon\human\species\station\prommie_blob.dm"
#include "code\modules\mob\living\carbon\human\species\station\replicant_crew.dm"
#include "code\modules\mob\living\carbon\human\species\station\station.dm"
#include "code\modules\mob\living\carbon\human\species\station\station_special_abilities.dm"
#include "code\modules\mob\living\carbon\human\species\station\station_special_abilities_ch.dm"
#include "code\modules\mob\living\carbon\human\species\station\station_special_abilities_vr.dm"
#include "code\modules\mob\living\carbon\human\species\station\station_special_vr.dm"
#include "code\modules\mob\living\carbon\human\species\station\station_vr.dm"
#include "code\modules\mob\living\carbon\human\species\station\teshari.dm"
#include "code\modules\mob\living\carbon\human\species\station\teshari_vr.dm"
#include "code\modules\mob\living\carbon\human\species\station\xenochimera_hud_vr.dm"
#include "code\modules\mob\living\carbon\human\species\station\xenochimera_trait_vr.dm"
#include "code\modules\mob\living\carbon\human\species\station\protean_vr\_protean_defines.dm"
#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_blob.dm"
#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_powers.dm"
#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_rig.dm"
#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_rig_tgui.dm"
#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_species.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits_vr\_traits.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits_vr\negative.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits_vr\negative_ch.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits_vr\negative_genes.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits_vr\neutral.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits_vr\neutral_ch.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits_vr\neutral_genes.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits_vr\positive.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits_vr\positive_ch.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits_vr\positive_genes.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits_vr\trait.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits_vr\traits_tutorial.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits_vr\weaver_objs.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits_vr\weaver_recipies.dm"
#include "code\modules\mob\living\carbon\human\species\station\protean\_protean_defines.dm"
#include "code\modules\mob\living\carbon\human\species\station\protean\protean_blob.dm"
#include "code\modules\mob\living\carbon\human\species\station\protean\protean_powers.dm"
#include "code\modules\mob\living\carbon\human\species\station\protean\protean_rig.dm"
#include "code\modules\mob\living\carbon\human\species\station\protean\protean_rig_tgui.dm"
#include "code\modules\mob\living\carbon\human\species\station\protean\protean_species.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits\_traits.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits\negative.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits\negative_ch.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits\negative_genes.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits\neutral.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits\neutral_ch.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits\neutral_genes.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits\positive.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits\positive_ch.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits\positive_genes.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits\trait.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits\traits_tutorial.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits\weaver_objs.dm"
#include "code\modules\mob\living\carbon\human\species\station\traits\weaver_recipies.dm"
#include "code\modules\mob\living\carbon\human\species\virtual_reality\avatar.dm"
#include "code\modules\mob\living\carbon\human\species\virtual_reality\opaque_form.dm"
#include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_powers.dm"