mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 10:43:20 +00:00
[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:
committed by
GitHub
parent
93c6439567
commit
013bac9816
@@ -1,6 +1,3 @@
|
||||
/datum/species
|
||||
var/list/default_emotes = list()
|
||||
|
||||
/mob/living/carbon/get_available_emotes()
|
||||
. = ..()
|
||||
if(length(species?.default_emotes))
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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.
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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]."))
|
||||
|
||||
@@ -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]."))
|
||||
@@ -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"
|
||||
@@ -1,3 +1,4 @@
|
||||
//Are these even USED? If not, axe them.
|
||||
/datum/species/grey
|
||||
name = SPECIES_GREY_YW
|
||||
name_plural = "Gray"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
@@ -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,16 +18,16 @@ 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
|
||||
flags = NO_DNA | NO_SLEEVE | NO_SLIP | NO_MINOR_CUT | NO_HALLUCINATION | NO_INFECT | NO_DEFIB
|
||||
hunger_factor = 0.2
|
||||
reagent_tag = IS_SLIME
|
||||
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
|
||||
spawn_flags = SPECIES_CAN_JOIN
|
||||
health_hud_intensity = 2
|
||||
num_alternate_languages = 3
|
||||
language = LANGUAGE_PROMETHEAN
|
||||
@@ -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()
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
@@ -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
|
||||
)
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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()
|
||||
..()
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user