diff --git a/code/modules/emotes/definitions/_species.dm b/code/modules/emotes/definitions/_species.dm
index 3fb1ccd65d..a661bf527a 100644
--- a/code/modules/emotes/definitions/_species.dm
+++ b/code/modules/emotes/definitions/_species.dm
@@ -1,6 +1,3 @@
-/datum/species
- var/list/default_emotes = list()
-
/mob/living/carbon/get_available_emotes()
. = ..()
if(length(species?.default_emotes))
diff --git a/code/modules/mob/living/carbon/human/species/outsider/vox.dm b/code/modules/mob/living/carbon/human/species/outsider/vox.dm
index e7c4744b63..b0c634a853 100644
--- a/code/modules/mob/living/carbon/human/species/outsider/vox.dm
+++ b/code/modules/mob/living/carbon/human/species/outsider/vox.dm
@@ -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
@@ -16,13 +19,15 @@
refer to them as 'shitbirds' for their violent and offensive nature, as well as their horrible \
smell.
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"
@@ -41,19 +46,18 @@
cold_level_2 = 50
cold_level_3 = 0
- gluttonous = 1
-
breath_type = GAS_PHORON
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
@@ -84,15 +88,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]
diff --git a/code/modules/mob/living/carbon/human/species/outsider/vox_vr.dm b/code/modules/mob/living/carbon/human/species/outsider/vox_vr.dm
deleted file mode 100644
index b7e39f4863..0000000000
--- a/code/modules/mob/living/carbon/human/species/outsider/vox_vr.dm
+++ /dev/null
@@ -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.
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 8b64cc8b08..b3d1d58a88 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -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'
@@ -225,7 +225,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.
@@ -250,6 +250,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,
@@ -290,10 +292,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)
@@ -314,6 +313,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()
@@ -665,3 +711,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"
diff --git a/code/modules/mob/living/carbon/human/species/species_attack.dm b/code/modules/mob/living/carbon/human/species/species_attack.dm
index e42e14a142..1ad8a7bfaf 100644
--- a/code/modules/mob/living/carbon/human/species/species_attack.dm
+++ b/code/modules/mob/living/carbon/human/species/species_attack.dm
@@ -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)] deep 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)
diff --git a/code/modules/mob/living/carbon/human/species/species_attack_vr.dm b/code/modules/mob/living/carbon/human/species/species_attack_vr.dm
deleted file mode 100644
index 3608b719ca..0000000000
--- a/code/modules/mob/living/carbon/human/species/species_attack_vr.dm
+++ /dev/null
@@ -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)] deep 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)
diff --git a/code/modules/mob/living/carbon/human/species/species_getters.dm b/code/modules/mob/living/carbon/human/species/species_getters.dm
index 298179fa5a..a1ccf8206e 100644
--- a/code/modules/mob/living/carbon/human/species/species_getters.dm
+++ b/code/modules/mob/living/carbon/human/species/species_getters.dm
@@ -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
diff --git a/code/modules/mob/living/carbon/human/species/species_getters_vr.dm b/code/modules/mob/living/carbon/human/species/species_getters_vr.dm
deleted file mode 100644
index e57e6a2fe3..0000000000
--- a/code/modules/mob/living/carbon/human/species/species_getters_vr.dm
+++ /dev/null
@@ -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
diff --git a/code/modules/mob/living/carbon/human/species/species_shapeshift.dm b/code/modules/mob/living/carbon/human/species/species_shapeshift.dm
index bf80064540..544018818e 100644
--- a/code/modules/mob/living/carbon/human/species/species_shapeshift.dm
+++ b/code/modules/mob/living/carbon/human/species/species_shapeshift.dm
@@ -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]."))
diff --git a/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm b/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm
deleted file mode 100644
index 453771e90e..0000000000
--- a/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm
+++ /dev/null
@@ -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]."))
diff --git a/code/modules/mob/living/carbon/human/species/species_vr.dm b/code/modules/mob/living/carbon/human/species/species_vr.dm
deleted file mode 100644
index f7b8cbe169..0000000000
--- a/code/modules/mob/living/carbon/human/species/species_vr.dm
+++ /dev/null
@@ -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"
diff --git a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm b/code/modules/mob/living/carbon/human/species/station/custom.dm
similarity index 100%
rename from code/modules/mob/living/carbon/human/species/station/blank_vr.dm
rename to code/modules/mob/living/carbon/human/species/station/custom.dm
diff --git a/code/modules/mob/living/carbon/human/species/station/monkey.dm b/code/modules/mob/living/carbon/human/species/station/monkey.dm
index c5e3b40194..4a5dce90c7 100644
--- a/code/modules/mob/living/carbon/human/species/station/monkey.dm
+++ b/code/modules/mob/living/carbon/human/species/station/monkey.dm
@@ -137,3 +137,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)
diff --git a/code/modules/mob/living/carbon/human/species/station/monkey_vr.dm b/code/modules/mob/living/carbon/human/species/station/monkey_vr.dm
deleted file mode 100644
index 380601d0fb..0000000000
--- a/code/modules/mob/living/carbon/human/species/station/monkey_vr.dm
+++ /dev/null
@@ -1,85 +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.
-
-/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 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
-
-//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)
diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans.dm b/code/modules/mob/living/carbon/human/species/station/prometheans.dm
index baf0784391..e4e138763a 100644
--- a/code/modules/mob/living/carbon/human/species/station/prometheans.dm
+++ b/code/modules/mob/living/carbon/human/species/station/prometheans.dm
@@ -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 | SPECIES_IS_WHITELISTED
+ spawn_flags = SPECIES_CAN_JOIN
health_hud_intensity = 2
num_alternate_languages = 3
language = LANGUAGE_PROMETHEAN
@@ -46,12 +46,11 @@ var/datum/species/shapeshifter/promethean/prometheans
male_cough_sounds = list('sound/effects/slime_squish.ogg')
female_cough_sounds = list('sound/effects/slime_squish.ogg')
- min_age = 1
- max_age = 16
+ min_age = 18
+ max_age = 80
economic_modifier = 3
- gluttonous = 1
virus_immune = 1
blood_volume = 560
brute_mod = 0.75
@@ -79,9 +78,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)
@@ -114,13 +113,25 @@ 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,
)
- 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.
@@ -182,6 +193,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()
@@ -369,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()
diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm
deleted file mode 100644
index 699a79e11c..0000000000
--- a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm
+++ /dev/null
@@ -1,79 +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 //No water damage
- 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/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()
diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/_protean_defines.dm b/code/modules/mob/living/carbon/human/species/station/protean/_protean_defines.dm
similarity index 100%
rename from code/modules/mob/living/carbon/human/species/station/protean_vr/_protean_defines.dm
rename to code/modules/mob/living/carbon/human/species/station/protean/_protean_defines.dm
diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm b/code/modules/mob/living/carbon/human/species/station/protean/protean_blob.dm
similarity index 100%
rename from code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm
rename to code/modules/mob/living/carbon/human/species/station/protean/protean_blob.dm
diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm b/code/modules/mob/living/carbon/human/species/station/protean/protean_powers.dm
similarity index 100%
rename from code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm
rename to code/modules/mob/living/carbon/human/species/station/protean/protean_powers.dm
diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_rig.dm b/code/modules/mob/living/carbon/human/species/station/protean/protean_rig.dm
similarity index 100%
rename from code/modules/mob/living/carbon/human/species/station/protean_vr/protean_rig.dm
rename to code/modules/mob/living/carbon/human/species/station/protean/protean_rig.dm
diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_rig_tgui.dm b/code/modules/mob/living/carbon/human/species/station/protean/protean_rig_tgui.dm
similarity index 100%
rename from code/modules/mob/living/carbon/human/species/station/protean_vr/protean_rig_tgui.dm
rename to code/modules/mob/living/carbon/human/species/station/protean/protean_rig_tgui.dm
diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm b/code/modules/mob/living/carbon/human/species/station/protean/protean_species.dm
old mode 100755
new mode 100644
similarity index 100%
rename from code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm
rename to code/modules/mob/living/carbon/human/species/station/protean/protean_species.dm
diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm
index 8a5ac67d8b..64878643c2 100644
--- a/code/modules/mob/living/carbon/human/species/station/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station.dm
@@ -1,13 +1,16 @@
/datum/species/human
name = SPECIES_HUMAN
name_plural = "Humans"
+ icobase = 'icons/mob/human_races/r_human_vr.dmi'
+ deform = 'icons/mob/human_races/r_def_human_vr.dmi'
primitive_form = SPECIES_MONKEY
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch, /datum/unarmed_attack/bite)
- blurb = "Humanity originated in the Sol system, and over the last five centuries has spread \
+ blurb = "Humanity originated in the Sol system, and over the last three centuries has spread \
colonies across a wide swathe of space. They hold a wide range of forms and creeds.
\
While the central Sol government maintains control of its far-flung people, powerful corporate \
interests, rampant cyber and bio-augmentation and secretive factions make life on most human \
worlds tumultous at best."
+ wikilink="https://wiki.vore-station.net/Human"
catalogue_data = list(/datum/category_item/catalogue/fauna/humans)
num_alternate_languages = 3
species_language = LANGUAGE_SOL_COMMON
@@ -15,12 +18,16 @@
name_language = null // Use the first-name last-name generator rather than a language scrambler
assisted_langs = list(LANGUAGE_EAL, LANGUAGE_SKRELLIAN, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX, LANGUAGE_PROMETHEAN)
- min_age = 17
+ min_age = 18
max_age = 130
+ genders = list(MALE, FEMALE, PLURAL, NEUTER)
economic_modifier = 10
health_hud_intensity = 1.5
+ base_color = "#EECEB3"
+ color_mult = 1
+
spawn_flags = SPECIES_CAN_JOIN
appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR
@@ -45,25 +52,28 @@
/datum/species/human/get_bodytype(var/mob/living/carbon/human/H)
return SPECIES_HUMAN
+/datum/species/human/vatgrown
+ spawn_flags = SPECIES_IS_RESTRICTED
+
/datum/species/unathi
name = SPECIES_UNATHI
name_plural = "Unathi"
- icobase = 'icons/mob/human_races/r_lizard.dmi'
- deform = 'icons/mob/human_races/r_def_lizard.dmi'
+ icobase = 'icons/mob/human_races/r_lizard_vr.dmi'
+ deform = 'icons/mob/human_races/r_def_lizard_vr.dmi'
+ tail_animation = 'icons/mob/species/unathi/tail_vr.dmi'
tail = "sogtail"
- tail_animation = 'icons/mob/species/unathi/tail.dmi'
+ vore_belly_default_variant = "L"
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
primitive_form = SPECIES_MONKEY_UNATHI
darksight = 3
ambiguous_genders = TRUE
- gluttonous = 1
slowdown = 0.5
total_health = 125
brute_mod = 0.85
burn_mod = 0.85
metabolic_rate = 0.85
item_slowdown_mod = 0.25
- mob_size = MOB_LARGE
+ mob_size = MOB_MEDIUM
blood_volume = 840
bloodloss_rate = 0.75
num_alternate_languages = 3
@@ -74,17 +84,23 @@
chem_strength_alcohol = 1.25
throwforce_absorb_threshold = 10
digi_allowed = TRUE
+ genders = list(MALE, FEMALE, PLURAL, NEUTER)
- min_age = 32
+ min_age = 18
max_age = 260
economic_modifier = 7
- blurb = "A heavily reptillian species, Unathi hail from the \
- Uuosa-Eso system, which roughly translates to 'burning mother'.
Coming from a harsh, inhospitable \
- planet, they mostly hold ideals of honesty, virtue, proficiency and bravery above all \
- else, frequently even their own lives. They prefer warmer temperatures than most species and \
- their native tongue is a heavy hissing laungage called Sinta'Unathi."
+ blurb = "Heavily reptilian in appearance, the Unathi hail from the Uueoa-Esa system, roughly translated as 'Burning Mother'. \
+ Their home planet, Moghes, is an arid climate with hot rocky plains and deserts, and a temperate band of swamps and savannas with \
+ massive saltwater lakes being the closest equivalent to oceans. This environment bred a very hardy people who value ideals of honesty, \
+ virtue, proficiency and bravery above all else, frequently even one's own life. These same values lend them culturally to imperialistic \
+ politics, as well as often being viewed as haughty and arrogant by other interstellar species.
\
+ On the stage of the interstellar political realm the Unathi are noteworthy contenders, the Moghes Hegemony possesses vast technological and \
+ material prowess when compared to human contemporaries such as the Sol-Procyon Commonwealth or Ares Confederation. The Hegemony War nearly one \
+ hundred years ago is a prime example of this, having engaged in brutal warfare that ultimately fell to a stalemate between all involved parties. \
+ Nowadays relations remain cool and somewhat tense, although this does not prevent individual Unathi from finding reasonable career success within Human space."
+
catalogue_data = list(/datum/category_item/catalogue/fauna/unathi)
cold_level_1 = 280 //Default 260 - Lower is better
@@ -107,12 +123,13 @@
body_temperature = T20C
- spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED
+ spawn_flags = SPECIES_CAN_JOIN
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
flesh_color = "#34AF10"
blood_color = "#b3cbc3"
base_color = "#066000"
+ color_mult = 1
reagent_tag = IS_UNATHI
@@ -158,11 +175,6 @@
"Your scales bristle against the cold."
)
- descriptors = list(
- /datum/mob_descriptor/height = 2,
- /datum/mob_descriptor/build = 2
- )
-
default_emotes = list(
/decl/emote/human/swish,
/decl/emote/human/wag,
@@ -175,6 +187,9 @@
footstep = FOOTSTEP_MOB_CLAW
+ inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair)
+ wikilink="https://wiki.vore-station.net/Unathi"
+
/datum/species/unathi/equip_survival_gear(var/mob/living/carbon/human/H)
..()
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes)
@@ -182,10 +197,10 @@
/datum/species/tajaran
name = SPECIES_TAJARAN
name_plural = "Tajaran"
- icobase = 'icons/mob/human_races/r_tajaran.dmi'
- deform = 'icons/mob/human_races/r_def_tajaran.dmi'
+ icobase = 'icons/mob/human_races/r_tajaran_vr.dmi'
+ deform = 'icons/mob/human_races/r_def_tajaran_vr.dmi'
tail = "tajtail"
- tail_animation = 'icons/mob/species/tajaran/tail.dmi'
+ tail_animation = 'icons/mob/species/tajaran/tail_vr.dmi'
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
darksight = 8
slowdown = -0.5
@@ -194,7 +209,6 @@
burn_mod = 1.15
flash_mod = 1.1
metabolic_rate = 1.1
- gluttonous = 1
num_alternate_languages = 3
secondary_langs = list(LANGUAGE_SIIK, LANGUAGE_AKHANI, LANGUAGE_ALAI)
name_language = LANGUAGE_SIIK
@@ -202,8 +216,11 @@
health_hud_intensity = 2.5
chem_strength_alcohol = 0.75
digi_allowed = TRUE
+ agility = 90
+ can_climb = TRUE
+ climbing_delay = 1.00 //Cats are good climbers.
- min_age = 17
+ min_age = 18
max_age = 80
economic_modifier = 7
@@ -213,6 +230,7 @@
and have accelerated the fledgling culture into the interstellar age. Their history is full of war and highly fractious \
governments, something that permeates even to today's times. They prefer colder, tundra-like climates, much like their \
home worlds and speak a variety of languages, especially Siik and Akhani."
+ wikilink="https://wiki.vore-station.net/Tajaran"
catalogue_data = list(/datum/category_item/catalogue/fauna/tajaran)
body_temperature = 280.15 //Even more cold resistant, even more flammable
@@ -235,20 +253,22 @@
primitive_form = SPECIES_MONKEY_TAJ
- spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED
+ 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"
base_color = "#333333"
+ color_mult = 1
reagent_tag = IS_TAJARA
- allergens = ALLERGEN_STIMULANT
+ allergens = null
climb_mult = 0.75
move_trail = /obj/effect/decal/cleanable/blood/tracks/paw
- heat_discomfort_level = 292
+ heat_discomfort_level = 295 //Prevents heat discomfort spam at 20c
heat_discomfort_strings = list(
"Your fur prickles in the heat.",
"You feel uncomfortably warm.",
@@ -283,6 +303,7 @@
/decl/emote/human/swag,
/decl/emote/human/stopsway
)
+ inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds, /mob/living/carbon/human/proc/tie_hair)
/datum/species/tajaran/equip_survival_gear(var/mob/living/carbon/human/H)
..()
@@ -291,8 +312,8 @@
/datum/species/skrell
name = SPECIES_SKRELL
name_plural = "Skrell"
- icobase = 'icons/mob/human_races/r_skrell.dmi'
- deform = 'icons/mob/human_races/r_def_skrell.dmi'
+ icobase = 'icons/mob/human_races/r_skrell_vr.dmi'
+ deform = 'icons/mob/human_races/r_def_skrell_vr.dmi'
primitive_form = SPECIES_MONKEY_SKRELL
unarmed_types = list(/datum/unarmed_attack/punch)
blurb = "An amphibious species, Skrell come from the star system known as Qerr'Vallis, which translates to 'Star of \
@@ -300,6 +321,7 @@
of the Qerr'Katish, a caste within their society which keeps the empire of the Skrell running smoothly. Skrell are \
herbivores on the whole and tend to be co-operative with the other species of the galaxy, although they rarely reveal \
the secrets of their empire to their allies."
+ wikilink="https://wiki.vore-station.net/Skrell"
catalogue_data = list(/datum/category_item/catalogue/fauna/skrell)
num_alternate_languages = 3
secondary_langs = list(LANGUAGE_SKRELLIAN, LANGUAGE_SCHECHI)
@@ -311,7 +333,7 @@
water_movement = -3
- min_age = 19
+ min_age = 18
max_age = 130
economic_modifier = 12
@@ -325,12 +347,13 @@
ambiguous_genders = TRUE
- spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED
+ spawn_flags = SPECIES_CAN_JOIN
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR
flesh_color = "#8CD7A3"
blood_color = "#0081CD"
base_color = "#006666"
+ color_mult = 1
cold_level_1 = 280 //Default 260 - Lower is better
cold_level_2 = 220 //Default 200
@@ -348,10 +371,13 @@
breath_heat_level_2 = 500 //Default 450
breath_heat_level_3 = 1350 //Default 1250
- reagent_tag = IS_SKRELL
- allergens = ALLERGEN_MEAT|ALLERGEN_FISH|ALLERGEN_DAIRY|ALLERGEN_EGGS
+ reagent_tag = null //I am going to just NUKE reagent_tag omfg...This is ridiculous
+ allergens = null
+
+ genders = list(MALE, FEMALE, PLURAL, NEUTER)
water_breather = TRUE
+ water_movement = -4 //Negates shallow. Halves deep.
has_limbs = list(
BP_TORSO = list("path" = /obj/item/organ/external/chest),
@@ -387,6 +413,8 @@
/decl/emote/audible/croon,
/decl/emote/audible/croak
)
+ inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair, /mob/living/carbon/human/proc/water_stealth, /mob/living/carbon/human/proc/underwater_devour)
+
/datum/species/skrell/can_breathe_water()
return TRUE
@@ -403,7 +431,6 @@
flash_mod = 2
flash_burn = 15 //flashing a zaddat probably counts as police brutality
metabolic_rate = 0.7 //did u know if your ancestors starved ur body will actually start in starvation mode?
- gluttonous = 1
taste_sensitivity = TASTE_SENSITIVE
num_alternate_languages = 3
secondary_langs = list(LANGUAGE_ZADDAT, LANGUAGE_UNATHI)
@@ -417,7 +444,7 @@
economic_modifier = 3
- min_age = 16
+ min_age = 18
max_age = 90
blurb = "The Zaddat are an Unathi client race only recently introduced to SolGov space. Having evolved on \
@@ -435,9 +462,9 @@
poison_type = GAS_N2 // technically it's a partial pressure thing but IDK if we can emulate that
ideal_air_type = /datum/gas_mixture/belly_air/zaddat
- genders = list(FEMALE, PLURAL) //females are polyp-producing, infertile females and males are nigh-identical
+ genders = list(MALE, FEMALE, PLURAL, NEUTER)
- spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED
+ spawn_flags = SPECIES_CAN_JOIN
appearance_flags = null
flesh_color = "#AFA59E"
@@ -470,14 +497,11 @@
O_INTESTINE =/obj/item/organ/internal/intestine
)
- descriptors = list(
- /datum/mob_descriptor/height = 0,
- /datum/mob_descriptor/build = -1
- )
default_emotes = list(
/decl/emote/audible/chirp
)
+ inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair)
/datum/species/zaddat/equip_survival_gear(var/mob/living/carbon/human/H)
..()
@@ -510,6 +534,7 @@
H.apply_damage(light_amount/4, BURN, K, 0, 0)
/datum/species/diona
+
name = SPECIES_DIONA
name_plural = "Dionaea"
icobase = 'icons/mob/human_races/r_diona.dmi'
@@ -534,7 +559,7 @@
species_language = LANGUAGE_ROOTLOCAL
secondary_langs = list(LANGUAGE_ROOTGLOBAL)
assisted_langs = list(LANGUAGE_VOX) // Diona are weird, let's just assume they can use basically any language.
- min_age = 1
+ min_age = 18
max_age = 300
economic_modifier = 4
@@ -546,6 +571,7 @@
all known species, especially the Skrell. Their communal mind makes them slow to react, and they have difficulty understanding \
even the simplest concepts of other minds. Their alien physiology allows them survive happily off a diet of nothing but light, \
water and other radiation."
+ wikilink="https://wiki.vore-station.net/Diona"
catalogue_data = list(/datum/category_item/catalogue/fauna/dionaea)
has_organ = list(
@@ -599,7 +625,7 @@
reagent_tag = IS_DIONA
- genders = list(PLURAL)
+ genders = list(MALE, FEMALE, PLURAL, NEUTER)
default_emotes = list(
/decl/emote/audible/chirp,
@@ -679,3 +705,1282 @@
//traumatic_shock is updated every tick, incrementing that is pointless - shock_stage is the counter.
//Not that it matters much for diona, who have NO_PAIN.
H.shock_stage++
+
+
+
+/datum/species/sergal
+ name = SPECIES_SERGAL
+ name_plural = "Sergals"
+ icobase = 'icons/mob/human_races/r_sergal.dmi'
+ deform = 'icons/mob/human_races/r_def_sergal.dmi'
+ tail = "tail"
+ icobase_tail = 1
+ unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
+ //darksight = 8
+ //slowdown = -0.5
+ //brute_mod = 1.15
+ //burn_mod = 1.15
+ num_alternate_languages = 3
+ secondary_langs = list(LANGUAGE_SAGARU)
+ name_language = LANGUAGE_SAGARU
+ species_language = LANGUAGE_SAGARU
+ color_mult = 1
+ inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair)
+ digi_allowed = TRUE
+
+ min_age = 18
+ max_age = 80
+
+ blurb = "There are two subspecies of Sergal; Southern and Northern. Northern sergals are a highly aggressive race \
+ that lives in the plains and tundra of their homeworld. They are characterized by long, fluffy fur bodies with cold colors; \
+ usually with white abdomens, somewhat short ears, and thick faces. Southern sergals are much more docile and live in the \
+ Gold Ring City and are scattered around the outskirts in rural areas and small towns. They usually have short, brown or yellow \
+ (or other 'earthy' colors) fur, long ears, and a long, thin face. They are smaller than their Northern relatives. Both have strong \
+ racial tensions which has resulted in more than a number of wars and outright attempts at genocide. Sergals have an incredibly long \
+ lifespan, but due to their lust for violence, only a handful have ever survived beyond the age of 80, such as the infamous and \
+ legendary General Rain Silves who is claimed to have lived to 5000."
+
+ wikilink="https://wiki.vore-station.net/Backstory#Sergal"
+
+ catalogue_data = list(/datum/category_item/catalogue/fauna/sergal)
+
+ primitive_form = SPECIES_MONKEY_SERGAL
+
+ spawn_flags = SPECIES_CAN_JOIN
+ appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | 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/sergal),
+ 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)
+ )
+
+/datum/species/akula
+ name = SPECIES_AKULA
+ name_plural = "Akula"
+ icobase = 'icons/mob/human_races/r_akula.dmi'
+ deform = 'icons/mob/human_races/r_def_akula.dmi'
+ tail = "tail"
+ icobase_tail = 1
+ unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
+ //darksight = 8
+ //slowdown = -0.5
+ //brute_mod = 1.15
+ //burn_mod = 1.15
+ num_alternate_languages = 3
+ secondary_langs = list(LANGUAGE_SPACER)
+ name_language = LANGUAGE_SPACER
+ species_language = LANGUAGE_SPACER
+ color_mult = 1
+ assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX, LANGUAGE_PROMETHEAN)
+ inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair, /mob/living/carbon/human/proc/water_stealth, /mob/living/carbon/human/proc/underwater_devour)
+ min_age = 18
+ max_age = 80
+ digi_allowed = TRUE
+
+ blurb = "The Akula are a species of amphibious humanoids like the Skrell, but have an appearance very similar to that of a shark. \
+ They were first discovered as a primitive race of underwater dwelling tribal creatures by the Skrell. At first they were not believed \
+ to be noteworthy, but the Akula proved to be such swift and clever learners that the Skrell reclassified them as sentients. Allegedly, \
+ the Akula were also the first sentient life that the Skrell had ever encountered beside themselves, and thus the two species became swift \
+ allies over the next few hundred years. With the help of Skrellean technology, the Akula had their genome modified to be capable of \
+ surviving in open air for long periods of time. However, Akula even today still require a high humidity environment to avoid drying out \
+ after a few days, which would make life on an arid world like Virgo-Prime nearly impossible if it were not for Skrellean technology to aid them."
+
+ wikilink="https://wiki.vore-station.net/Backstory#Akula"
+
+ catalogue_data = list(/datum/category_item/catalogue/fauna/akula)
+
+ primitive_form = SPECIES_MONKEY_AKULA
+
+ genders = list(MALE, FEMALE, PLURAL, NEUTER)
+
+ spawn_flags = SPECIES_CAN_JOIN
+ appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
+
+ water_breather = TRUE
+ water_movement = -4 //Negates shallow. Halves deep.
+ swim_mult = 0.5
+
+ flesh_color = "#AFA59E"
+ base_color = "#777777"
+ blood_color = "#1D2CBF"
+
+/datum/species/nevrean
+ name = SPECIES_NEVREAN
+ name_plural = "Nevreans"
+ icobase = 'icons/mob/human_races/r_nevrean.dmi'
+ deform = 'icons/mob/human_races/r_def_nevrean.dmi'
+ tail = "tail"
+ icobase_tail = 1
+ unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
+ //darksight = 8
+ //slowdown = -0.5
+ //brute_mod = 1.15
+ //burn_mod = 1.15
+ soft_landing = TRUE
+ num_alternate_languages = 3
+ secondary_langs = list(LANGUAGE_BIRDSONG)
+ name_language = LANGUAGE_BIRDSONG
+ species_language = LANGUAGE_BIRDSONG
+ color_mult = 1
+ inherent_verbs = list(/mob/living/proc/flying_toggle,
+ /mob/living/proc/flying_vore_toggle,
+ /mob/living/proc/start_wings_hovering,
+ /mob/living/carbon/human/proc/tie_hair)
+ min_age = 18
+ max_age = 80
+ digi_allowed = TRUE
+
+ blurb = "Nevreans are a race of avian and dinosaur-like creatures living on Tal. They belong to a group of races that hails from Eltus, \
+ in the Vilous system. Unlike sergals whom they share a star system with, their species is a very peaceful one. They possess remarkable \
+ intelligence and very skillful hands that are put use for constructing precision instruments, but tire-out fast when repeatedly working \
+ over and over again. Consequently, they struggle to make copies of same things. Both genders have a voice that echoes a lot. Their natural \
+ tone oscillates between tenor and soprano. They are excessively noisy when they quarrel in their native language."
+
+ wikilink="https://wiki.vore-station.net/Backstory#Nevrean"
+
+ catalogue_data = list(/datum/category_item/catalogue/fauna/nevrean)
+
+ primitive_form = SPECIES_MONKEY_NEVREAN
+
+ genders = list(MALE, FEMALE, PLURAL, NEUTER)
+
+ spawn_flags = SPECIES_CAN_JOIN
+ appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
+
+ flesh_color = "#AFA59E"
+ base_color = "#333333"
+
+ heat_discomfort_strings = list(
+ "Your fur prickles in the heat.",
+ "You feel uncomfortably warm.",
+ "Your overheated skin itches."
+ )
+
+/datum/species/hi_zoxxen
+ name = SPECIES_ZORREN_HIGH
+ name_plural = "Zorren"
+ icobase = 'icons/mob/human_races/r_fox_vr.dmi'
+ deform = 'icons/mob/human_races/r_def_fox.dmi'
+ tail = "tail"
+ icobase_tail = 1
+ unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
+ num_alternate_languages = 3
+ secondary_langs = list(LANGUAGE_TERMINUS)
+ name_language = LANGUAGE_TERMINUS
+ species_language = LANGUAGE_TERMINUS
+ inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds,
+ /mob/living/proc/shred_limb,
+ /mob/living/carbon/human/proc/tie_hair)
+ digi_allowed = TRUE
+
+ min_age = 18
+ max_age = 80
+
+ blurb = "The fennec-like, blue-blooded Zorren are native to Virgo 4/Menhir and are descendants of a precursor species \
+ that is thought to be responsible for the near-collapse of the biosphere of the planet. \
+ With societies organised around hierarchal caste systems (such as the Royal Zorren) or freedom and strength (such as the Free Tribe Zorren), \
+ they now slowly recover from their previous hubris and aim to revitalize their planet. While many Zorren live in pre-industrial conditions by necessity, \
+ they are an interstellar species known for their pride and stubbornness and doggedly hold out on a Deathworld of their own creation. \
+ As local species, they hold moderate sway on local corporations and are hired by NT and other companies, although they find \"Outlander\" culture deeply weird."
+ wikilink="https://wiki.vore-station.net/Zorren"
+
+ catalogue_data = list(/datum/category_item/catalogue/fauna/zorren)
+
+ //primitive_form = "" //We don't have fox-monkey sprites.
+
+ spawn_flags = SPECIES_CAN_JOIN
+ appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
+ flesh_color = "#AFA59E"
+ base_color = "#333333"
+ blood_color = "#240bc4"
+ blood_reagents = REAGENT_ID_COPPER
+ reagent_tag = IS_ZORREN
+ color_mult = 1
+
+ genders = list(MALE, FEMALE, PLURAL, NEUTER)
+
+ heat_discomfort_strings = list(
+ "Your fur prickles in the heat.",
+ "You feel uncomfortably warm.",
+ "Your overheated skin itches."
+ )
+
+/datum/species/vulpkanin
+ name = SPECIES_VULPKANIN
+ name_plural = "Vulpkanin"
+ blurb = "Vulpkanin are a species of sapient canine bipeds, who are the descendants of a lost colony during the waning days of a Precursor species, \
+ from which their distant cousins, the Zorren, also originate from. Independent and iconoclast, they have abandoned the ideals of their forefathers \
+ largely and prefer to look outwards as explorers and scientists to forge their own identity. They speak a guttural language known as 'Canilunzt' \
+ which has a heavy emphasis on utilizing tail positioning and ear twitches to communicate intent."
+ icobase = 'icons/mob/human_races/r_vulpkanin.dmi'
+ deform = 'icons/mob/human_races/r_vulpkanin.dmi'
+ secondary_langs = list(LANGUAGE_CANILUNZT)
+ name_language = LANGUAGE_CANILUNZT
+ species_language = LANGUAGE_CANILUNZT
+ primitive_form = SPECIES_MONKEY_VULPKANIN
+ tail = "vulptail"
+ tail_animation = 'icons/mob/species/vulpkanin/tail.dmi'
+ unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
+ darksight = 5
+ num_alternate_languages = 3
+ color_mult = 1
+ inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds,
+ /mob/living/carbon/human/proc/tie_hair)
+ digi_allowed = TRUE
+
+ wikilink="https://wiki.vore-station.net/Backstory#Vulpkanin"
+
+ catalogue_data = list(/datum/category_item/catalogue/fauna/vulpkanin)
+
+ //Furry fox-like animals shouldn't start freezing at 5 degrees celsius.
+ //Minor cold is resisted, but not severe frost.
+ cold_discomfort_level = 263 //Not as good at surviving the frost as tajara, but still better than humans.
+
+ cold_level_1 = 243 //Default 260, other values remain at default. Starts taking damage at -30 celsius. Default tier 2 is -70 and tier 3 is -150
+
+
+ breath_cold_level_1 = 220 // Default 240, lower is better.
+
+ //While foxes can survive in deserts, that's handled by zorren. It's a good contrast that our vulp find heat a little uncomfortable.
+
+ heat_discomfort_level = 295 //Just above standard 20 C to avoid heat message spam, same as Taj
+
+ heat_level_1 = 345 //Default 360
+ heat_level_2 = 390 //Default 400
+ heat_level_3 = 900 //Default 1000
+
+ breath_heat_level_1 = 370 //Default 380 - Higher is better
+ breath_heat_level_2 = 445 //Default 450
+ breath_heat_level_3 = 1125 //Default 1250
+
+ primitive_form = SPECIES_MONKEY_VULPKANIN
+
+ 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 = "#966464"
+ base_color = "#B43214"
+
+ min_age = 18
+ max_age = 80
+
+ heat_discomfort_strings = list(
+ "Your fur prickles in the heat.",
+ "You feel uncomfortably warm.",
+ "Your overheated skin itches."
+ )
+
+/datum/species/skrell
+ spawn_flags = SPECIES_CAN_JOIN
+ icobase = 'icons/mob/human_races/r_skrell_vr.dmi'
+ deform = 'icons/mob/human_races/r_def_skrell_vr.dmi'
+ color_mult = 1
+ min_age = 18
+ inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair, /mob/living/carbon/human/proc/water_stealth, /mob/living/carbon/human/proc/underwater_devour)
+ reagent_tag = null
+ allergens = null
+ assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX, LANGUAGE_PROMETHEAN)
+ genders = list(MALE, FEMALE, PLURAL, NEUTER)
+ wikilink="https://wiki.vore-station.net/Skrell"
+
+ water_breather = TRUE
+ water_movement = -4 //Negates shallow. Halves deep.
+
+/datum/species/zaddat/equip_survival_gear(var/mob/living/carbon/human/H)
+ .=..()
+ var/obj/item/storage/toolbox/lunchbox/survival/zaddat/L = new(get_turf(H))
+ if(H.backbag == 1)
+ H.equip_to_slot_or_del(L, slot_r_hand)
+ else
+ H.equip_to_slot_or_del(L, slot_in_backpack)
+
+/datum/species/human/vatgrown
+ spawn_flags = SPECIES_IS_RESTRICTED
+/datum/species/harpy
+ name = SPECIES_RAPALA
+ name_plural = "Rapalans"
+ icobase = 'icons/mob/human_races/r_harpy_vr.dmi'
+ deform = 'icons/mob/human_races/r_def_harpy_vr.dmi'
+ tail = "tail"
+ icobase_tail = 1
+ unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch, /datum/unarmed_attack/bite)
+ num_alternate_languages = 3
+ secondary_langs = list(LANGUAGE_BIRDSONG, LANGUAGE_UNATHI)
+ species_language = LANGUAGE_UNATHI
+ name_language = null
+ color_mult = 1
+ genders = list(MALE, FEMALE, PLURAL, NEUTER)
+ inherent_verbs = list(/mob/living/proc/flying_toggle,/mob/living/proc/flying_vore_toggle,/mob/living/proc/start_wings_hovering,/mob/living/carbon/human/proc/tie_hair)
+ digi_allowed = TRUE
+
+ min_age = 18
+ max_age = 80
+
+ soft_landing = TRUE
+
+ base_color = "#EECEB3"
+
+ blurb = "An Avian species, coming from a distant planet, the Rapalas are the very proud race.\
+ Sol researchers have commented on them having a very close resemblance to the mythical race called 'Harpies',\
+ who are known for having massive winged arms and talons as feet. They've been clocked at speeds of over 35 miler per hour chasing the planet's many fish-like fauna.\
+ The Rapalan's home-world 'Verita' is a strangely habitable gas giant, while no physical earth exists, there are fertile floating islands orbiting around the planet from past asteroid activity."
+
+ wikilink="https://wiki.vore-station.net/Backstory#Rapala"
+
+ catalogue_data = list(/datum/category_item/catalogue/fauna/rapala)
+
+ spawn_flags = SPECIES_CAN_JOIN
+ appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
+
+
+ heat_discomfort_strings = list(
+ "Your feathers prickle in the heat.",
+ "You feel uncomfortably warm.",
+ "Your overheated skin itches."
+ )
+
+/datum/species/teshari
+ name = SPECIES_TESHARI
+ name_plural = "Tesharii"
+ blurb = "A race of feathered raptors who developed alongside the Skrell, inhabiting \
+ the polar tundral regions outside of Skrell territory. Extremely fragile, they developed \
+ hunting skills that emphasized taking out their prey without themselves getting hit. They \
+ are only recently becoming known on human stations after reaching space with Skrell assistance."
+ wikilink="https://wiki.vore-station.net/Teshari"
+ catalogue_data = list(/datum/category_item/catalogue/fauna/teshari)
+
+ num_alternate_languages = 3
+ secondary_langs = list(LANGUAGE_SCHECHI, LANGUAGE_SKRELLIAN)
+ name_language = LANGUAGE_SCHECHI
+ species_language = LANGUAGE_SCHECHI
+
+ min_age = 18
+ max_age = 45
+
+ economic_modifier = 6
+
+ health_hud_intensity = 3
+
+ 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')
+ male_sneeze_sound = 'sound/effects/mob_effects/tesharisneeze.ogg'
+ female_sneeze_sound = 'sound/effects/mob_effects/tesharisneeze.ogg'
+ center_offset = 0
+
+ blood_color = "#D514F7"
+ flesh_color = "#5F7BB0"
+ base_color = "#001144"
+ color_mult = 1
+ tail = "seromitail"
+ icobase_tail = 1
+ reagent_tag = IS_TESHARI
+
+ move_trail = /obj/effect/decal/cleanable/blood/tracks/paw
+
+ icobase = 'icons/mob/human_races/r_teshari_vr.dmi'
+ deform = 'icons/mob/human_races/r_teshari_vr.dmi'
+ damage_overlays = 'icons/mob/human_races/masks/dam_teshari.dmi'
+ damage_mask = 'icons/mob/human_races/masks/dam_mask_teshari.dmi'
+ blood_mask = 'icons/mob/human_races/masks/blood_teshari.dmi'
+ suit_storage_icon = 'icons/inventory/suit_store/mob_teshari.dmi'
+ vore_belly_default_variant = "T" //Teshari belly sprite
+
+ fire_icon_state = "generic" // Humanoid is too big for them and spriting a new one is really annoying.
+
+ slowdown = -1
+ snow_movement = -2 // Ignores light snow
+ item_slowdown_mod = 2 // Tiny birds don't like heavy things
+ total_health = 50
+ brute_mod = 1.35
+ burn_mod = 1.35
+ mob_size = MOB_MEDIUM
+ pass_flags = PASSTABLE
+ holder_type = /obj/item/holder/human
+// short_sighted = 1
+ has_vibration_sense = TRUE
+ blood_volume = 400
+ hunger_factor = 0.2
+ soft_landing = TRUE
+ agility = 90
+
+ ambiguous_genders = TRUE
+ genders = list(MALE, FEMALE, PLURAL, NEUTER)
+
+ spawn_flags = SPECIES_CAN_JOIN
+ appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_EYE_COLOR
+
+ body_temperature = 270
+
+ cold_level_1 = 180 //Default 260
+ cold_level_2 = 130 //Default 200
+ cold_level_3 = 70 //Default 120
+
+ breath_cold_level_1 = 180 //Default 240 - Lower is better
+ breath_cold_level_2 = 100 //Default 180
+ breath_cold_level_3 = 60 //Default 100
+
+ heat_level_1 = 330 //Default 360
+ heat_level_2 = 370 //Default 400
+ heat_level_3 = 600 //Default 1000
+
+ breath_heat_level_1 = 350 //Default 380 - Higher is better
+ breath_heat_level_2 = 400 //Default 450
+ breath_heat_level_3 = 800 //Default 1250
+
+ heat_discomfort_level = 295
+ heat_discomfort_strings = list(
+ "Your feathers prickle in the heat.",
+ "You feel uncomfortably warm.",
+ "Your hands and feet feel hot as your body tries to regulate heat",
+ )
+ cold_discomfort_level = 180
+ cold_discomfort_strings = list(
+ "You feel a bit chilly.",
+ "You fluff up your feathers against the cold.",
+ "You move your arms closer to your body to shield yourself from the cold.",
+ "You press your ears against your head to conserve heat",
+ "You start to feel the cold on your skin",
+ )
+
+ minimum_breath_pressure = 12 //Smaller, so needs less air
+
+ 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/teshari),
+ 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/teshari),
+ BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/teshari),
+ BP_L_FOOT = list("path" = /obj/item/organ/external/foot/teshari),
+ BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/teshari)
+ )
+
+ has_organ = list(
+ 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,
+ O_EYES = /obj/item/organ/internal/eyes,
+ O_STOMACH = /obj/item/organ/internal/stomach,
+ O_INTESTINE = /obj/item/organ/internal/intestine
+ )
+
+ unarmed_types = list(
+ /datum/unarmed_attack/claws,
+ /datum/unarmed_attack/bite/sharp,
+ /datum/unarmed_attack/stomp/weak
+ )
+
+ inherent_verbs = list(
+ ///mob/living/carbon/human/proc/sonar_ping,
+ /mob/living/proc/hide,
+ /mob/living/proc/toggle_pass_table
+ )
+
+ default_emotes = list(
+ /decl/emote/audible/teshsqueak,
+ /decl/emote/audible/teshchirp,
+ /decl/emote/audible/teshtrill
+ )
+
+ footstep = FOOTSTEP_MOB_TESHARI
+
+/datum/species/teshari/equip_survival_gear(var/mob/living/carbon/human/H)
+ ..()
+ if(!(H.client?.prefs?.shoe_hater))
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes)
+/*
+/datum/species/teshari/handle_falling(mob/living/carbon/human/H, atom/hit_atom, damage_min, damage_max, silent, planetary)
+
+ // Tesh can glide to save themselves from some falls. Basejumping bird
+ // without parachute, or falling bird without free wings, goes splat.
+
+ // Are we landing from orbit, or handcuffed/unconscious/tied to something?
+ if(planetary || !istype(H) || H.incapacitated(INCAPACITATION_DEFAULT|INCAPACITATION_DISABLED))
+ return ..()
+
+ // Are we landing on a turf? Not sure how this could not be the case, but let's be safe.
+ var/turf/landing = get_turf(hit_atom)
+ if(!istype(landing))
+ return ..()
+
+ if(H.buckled)
+ if(!silent)
+ to_chat(H, span_warning("You try to spread your wings to slow your fall, but \the [H.buckled] weighs you down!"))
+ return ..()
+
+ // Is there enough air to flap against?
+ var/datum/gas_mixture/environment = landing.return_air()
+ if(!environment || environment.return_pressure() < (ONE_ATMOSPHERE * 0.75))
+ if(!silent)
+ to_chat(H, span_warning("You spread your wings to slow your fall, but the air is too thin!"))
+ return ..()
+
+ // Are we wearing a space suit?
+ if(H.wear_suit)
+ for(var/blacklisted_type in flight_suit_blacklisted_types)
+ if(istype(H.wear_suit, blacklisted_type))
+ if(!silent)
+ to_chat(H, span_warning("You try to spread your wings to slow your fall, but \the [H.wear_suit] is in the way!"))
+ return ..()
+
+ // Do we have working wings?
+ for(var/bp in flight_bodyparts)
+ var/obj/item/organ/external/E = H.organs_by_name[bp]
+ if(!istype(E) || !E.is_usable() || E.is_broken() || E.is_stump())
+ if(!silent)
+ to_chat(H, span_warning("You try to spread your wings to slow your fall, but they won't hold your weight!"))
+ return ..()
+
+ // Handled!
+ if(!silent)
+ to_chat(H, span_notice("You catch the air in your wings and greatly slow your fall."))
+ landing.visible_message(span_infoplain(span_bold("\The [H]") + " glides down from above, landing safely."))
+ H.Stun(1)
+ playsound(H, "rustle", 25, 1)
+ return TRUE
+*/
+
+
+
+/datum/species/crew_shadekin
+ name = SPECIES_SHADEKIN_CREW
+ name_plural = "Black-Eyed Shadekin"
+ icobase = 'icons/mob/human_races/r_shadekin_vr.dmi'
+ deform = 'icons/mob/human_races/r_shadekin_vr.dmi'
+ tail = "tail"
+ icobase_tail = 1
+ blurb = "Very little is known about these creatures. They appear to be largely mammalian in appearance. \
+ Seemingly very rare to encounter, there have been widespread myths of these creatures the galaxy over, \
+ but next to no verifiable evidence to their existence. However, they have recently been more verifiably \
+ documented in the Virgo system, following a mining bombardment of Virgo 3. The crew of NSB Adephagia have \
+ taken to calling these creatures 'Shadekin', and the name has generally stuck and spread. " //TODO: Something more fitting for black-eyes
+ wikilink = "https://wiki.vore-station.net/Shadekin"
+ catalogue_data = list(/datum/category_item/catalogue/fauna/shadekin)
+ digi_allowed = TRUE
+
+ language = LANGUAGE_SHADEKIN
+ name_language = LANGUAGE_SHADEKIN
+ species_language = LANGUAGE_SHADEKIN
+ secondary_langs = list(LANGUAGE_SHADEKIN)
+ num_alternate_languages = 3
+ unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
+ rarity_value = 5 //INTERDIMENSIONAL FLUFFERS
+
+ inherent_verbs = list(/mob/proc/adjust_hive_range)
+
+ siemens_coefficient = 0
+ darksight = 10
+
+ slowdown = 0.5
+ item_slowdown_mod = 1.5
+
+ total_health = 75
+ brute_mod = 1.25 // Frail
+ burn_mod = 1.25 // Furry
+ blood_volume = 500
+ hunger_factor = 0.2
+
+ warning_low_pressure = 50
+ hazard_low_pressure = -1
+
+ warning_high_pressure = 300
+ hazard_high_pressure = INFINITY
+
+ cold_level_1 = -1 //Immune to cold
+ cold_level_2 = -1
+ cold_level_3 = -1
+
+ heat_level_1 = 850 //Resistant to heat
+ heat_level_2 = 1000
+ heat_level_3 = 1150
+
+ flags = NO_DNA | NO_SLEEVE
+ spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
+
+ reagent_tag = IS_SHADEKIN // for shadekin-unqiue chem interactions
+
+ flesh_color = "#FFC896"
+ blood_color = "#A10808"
+ base_color = "#f0f0f0"
+ color_mult = 1
+
+ //has_glowing_eyes = TRUE // Applicable through traits.
+
+ male_cough_sounds = null
+ female_cough_sounds = null
+ male_sneeze_sound = null
+ female_sneeze_sound = null
+
+ speech_bubble_appearance = "ghost"
+
+ genders = list(MALE, FEMALE, PLURAL, NEUTER)
+
+ breath_type = null
+ poison_type = null
+ water_breather = TRUE //They do not quite breathe...
+
+ appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_SKIN_COLOR | HAS_UNDERWEAR
+
+ move_trail = /obj/effect/decal/cleanable/blood/tracks/paw
+
+ has_organ = list(
+ O_HEART = /obj/item/organ/internal/heart,
+ 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,
+ O_EYES = /obj/item/organ/internal/eyes,
+ O_STOMACH = /obj/item/organ/internal/stomach,
+ O_INTESTINE = /obj/item/organ/internal/intestine
+ )
+
+ has_limbs = list(
+ BP_TORSO = list("path" = /obj/item/organ/external/chest/crewkin),
+ BP_GROIN = list("path" = /obj/item/organ/external/groin/crewkin),
+ BP_HEAD = list("path" = /obj/item/organ/external/head/crewkin),
+ BP_L_ARM = list("path" = /obj/item/organ/external/arm/crewkin),
+ BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/crewkin),
+ BP_L_LEG = list("path" = /obj/item/organ/external/leg/crewkin),
+ BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/crewkin),
+ BP_L_HAND = list("path" = /obj/item/organ/external/hand/crewkin),
+ BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/crewkin),
+ BP_L_FOOT = list("path" = /obj/item/organ/external/foot/crewkin),
+ BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/crewkin)
+ )
+
+/datum/species/crew_shadekin/get_bodytype()
+ return SPECIES_SHADEKIN
+
+//These species are not really species but are just there for custom species selection
+
+/datum/species/fl_zorren
+ name = SPECIES_FENNEC
+ name_plural = "Fennec"
+ icobase = 'icons/mob/human_races/r_fennec_vr.dmi'
+ deform = 'icons/mob/human_races/r_def_fennec.dmi'
+ tail = "tail"
+ icobase_tail = 1
+ unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
+ num_alternate_languages = 3
+ secondary_langs = list(LANGUAGE_TERMINUS)
+ name_language = LANGUAGE_TERMINUS
+ species_language = LANGUAGE_TERMINUS
+ inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds,/mob/living/proc/shred_limb,/mob/living/carbon/human/proc/tie_hair)
+ digi_allowed = TRUE
+
+ min_age = 18
+ max_age = 80
+
+ //primitive_form = "" //We don't have fennec-monkey sprites.
+ spawn_flags = SPECIES_IS_RESTRICTED
+ appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
+ genders = list(MALE, FEMALE, PLURAL, NEUTER)
+
+ flesh_color = "#AFA59E"
+ base_color = "#333333"
+ blood_color = "#240bc4"
+ color_mult = 1
+
+ heat_discomfort_strings = list(
+ "Your fur prickles in the heat.",
+ "You feel uncomfortably warm.",
+ "Your overheated skin itches."
+ )
+
+/datum/species/xenohybrid
+ name = SPECIES_XENOHYBRID
+ name_plural = "Xenomorphs"
+ icobase = 'icons/mob/human_races/r_xenomorph.dmi'
+ deform = 'icons/mob/human_races/r_def_xenomorph.dmi'
+ tail = "tail"
+ icobase_tail = 1
+ unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
+ darksight = 4 //Better hunters in the dark.
+ hunger_factor = 0.1 //In exchange, they get hungry a tad faster.
+ num_alternate_languages = 3
+ digi_allowed = TRUE
+
+ min_age = 18
+ max_age = 80
+
+ blurb = "Xenomorphs hybrids are a mixture of xenomorph DNA and some other humanoid species. \
+ Xenomorph hyrids mostly have had had their natural aggression removed due to the gene modification process \
+ although there are some exceptions, such as when they are harmed. Most xenomorph hybrids are female, due to their natural xenomorph genes, \
+ but there are multiple exceptions. All xenomorph hybrids have had their ability to lay eggs containing facehuggers \
+ removed if they had the ability to, although hybrids that previously contained this ability is extremely rare."
+ // No wiki page for xenohybrids at present
+
+ //primitive_form = "" //None for these guys
+
+ spawn_flags = SPECIES_IS_RESTRICTED
+ appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
+ genders = list(MALE, FEMALE, PLURAL, NEUTER)
+
+ blood_color = "#12ff12"
+ flesh_color = "#201730"
+ base_color = "#201730"
+
+ heat_discomfort_strings = list(
+ "Your chitin feels extremely warm.",
+ "You feel uncomfortably warm.",
+ "Your chitin feels hot."
+ )
+
+/datum/species/altevian
+ name = SPECIES_ALTEVIAN
+ name_plural = "Altevians"
+ icobase = 'icons/mob/human_races/r_altevian.dmi'
+ deform = 'icons/mob/human_races/r_def_altevian.dmi'
+ unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
+ num_alternate_languages = 3
+ secondary_langs = list(LANGUAGE_TAVAN)
+ species_language = LANGUAGE_TAVAN
+ name_language = null
+ color_mult = 1
+ inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair)
+ digi_allowed = TRUE
+
+ min_age = 18
+ max_age = 80
+
+ blurb = "The Altevian are a species of tall, rodent humanoids that are akin to rats for their features. \
+ The Altevian, unlike most species, do not have a home planet, nor system, adopting a fully nomadic lifestyle \
+ for their survival across the stars. Instead, they have opted to live in massive super capital-class colony-ships \
+ with a flagship as their place they would call home."
+
+ wikilink="https://wiki.vore-station.net/Altevian"
+
+ catalogue_data = list(/datum/category_item/catalogue/fauna/altevian)
+
+ spawn_flags = SPECIES_CAN_JOIN
+ appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
+
+ flesh_color = "#AFA59E"
+ base_color = "#777777"
+
+ genders = list(MALE, FEMALE, PLURAL, NEUTER)
+
+ burn_mod = 1.15
+ hunger_factor = 0.04
+ can_zero_g_move = TRUE
+
+ 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),
+ 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)
+ )
+
+
+/////////////////////
+/////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
+
+ 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."
+
+ wikilink = "https://wiki.vore-station.net/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
+
+ 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
+ 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)
+ )
+
+
+/// XENOCHIMERA
+/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"
+ 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)
+
+ virus_immune = 1 // They practically ARE one.
+ min_age = 18
+ max_age = 80
+
+ 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."
+
+ wikilink = "https://wiki.vore-station.net/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,
+ 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.weakened = 5
+ 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("
" + span_huge("[H.name]'s motionless form shudders grotesquely, rippling unnaturally.") + "
")) + + //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) + +/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/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 + +/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 diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities.dm similarity index 100% rename from code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm rename to code/modules/mob/living/carbon/human/species/station/station_special_abilities.dm diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm deleted file mode 100644 index 5ac162eb6f..0000000000 --- a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm +++ /dev/null @@ -1,469 +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) - - virus_immune = 1 // They practically ARE one. - min_age = 18 - max_age = 80 - - 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." - - wikilink = "https://wiki.vore-station.net/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.weakened = 5 - 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("" + span_huge("[H.name]'s motionless form shudders grotesquely, rippling unnaturally.") + "
")) - - //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 - - 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." - - wikilink = "https://wiki.vore-station.net/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 - - 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 - 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) - ) diff --git a/code/modules/mob/living/carbon/human/species/station/station_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_vr.dm deleted file mode 100644 index fad2edd50a..0000000000 --- a/code/modules/mob/living/carbon/human/species/station/station_vr.dm +++ /dev/null @@ -1,688 +0,0 @@ -/datum/species/sergal - name = SPECIES_SERGAL - name_plural = "Sergals" - icobase = 'icons/mob/human_races/r_sergal.dmi' - deform = 'icons/mob/human_races/r_def_sergal.dmi' - tail = "tail" - icobase_tail = 1 - unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) - //darksight = 8 - //slowdown = -0.5 - //brute_mod = 1.15 - //burn_mod = 1.15 - //gluttonous = 1 - num_alternate_languages = 3 - secondary_langs = list(LANGUAGE_SAGARU) - name_language = LANGUAGE_SAGARU - species_language = LANGUAGE_SAGARU - color_mult = 1 - inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) - digi_allowed = TRUE - - min_age = 18 - max_age = 80 - - blurb = "There are two subspecies of Sergal; Southern and Northern. Northern sergals are a highly aggressive race \ - that lives in the plains and tundra of their homeworld. They are characterized by long, fluffy fur bodies with cold colors; \ - usually with white abdomens, somewhat short ears, and thick faces. Southern sergals are much more docile and live in the \ - Gold Ring City and are scattered around the outskirts in rural areas and small towns. They usually have short, brown or yellow \ - (or other 'earthy' colors) fur, long ears, and a long, thin face. They are smaller than their Northern relatives. Both have strong \ - racial tensions which has resulted in more than a number of wars and outright attempts at genocide. Sergals have an incredibly long \ - lifespan, but due to their lust for violence, only a handful have ever survived beyond the age of 80, such as the infamous and \ - legendary General Rain Silves who is claimed to have lived to 5000." - - wikilink="https://wiki.vore-station.net/Backstory#Sergal" - - catalogue_data = list(/datum/category_item/catalogue/fauna/sergal) - - primitive_form = SPECIES_MONKEY_SERGAL - - spawn_flags = SPECIES_CAN_JOIN - appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | 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/sergal), - 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) - ) - -/datum/species/akula - name = SPECIES_AKULA - name_plural = "Akula" - icobase = 'icons/mob/human_races/r_akula.dmi' - deform = 'icons/mob/human_races/r_def_akula.dmi' - tail = "tail" - icobase_tail = 1 - unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) - //darksight = 8 - //slowdown = -0.5 - //brute_mod = 1.15 - //burn_mod = 1.15 - //gluttonous = 1 - num_alternate_languages = 3 - secondary_langs = list(LANGUAGE_SPACER) - name_language = LANGUAGE_SPACER - species_language = LANGUAGE_SPACER - color_mult = 1 - assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX, LANGUAGE_PROMETHEAN) - inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair, /mob/living/carbon/human/proc/water_stealth, /mob/living/carbon/human/proc/underwater_devour) - min_age = 18 - max_age = 80 - digi_allowed = TRUE - - blurb = "The Akula are a species of amphibious humanoids like the Skrell, but have an appearance very similar to that of a shark. \ - They were first discovered as a primitive race of underwater dwelling tribal creatures by the Skrell. At first they were not believed \ - to be noteworthy, but the Akula proved to be such swift and clever learners that the Skrell reclassified them as sentients. Allegedly, \ - the Akula were also the first sentient life that the Skrell had ever encountered beside themselves, and thus the two species became swift \ - allies over the next few hundred years. With the help of Skrellean technology, the Akula had their genome modified to be capable of \ - surviving in open air for long periods of time. However, Akula even today still require a high humidity environment to avoid drying out \ - after a few days, which would make life on an arid world like Virgo-Prime nearly impossible if it were not for Skrellean technology to aid them." - - wikilink="https://wiki.vore-station.net/Backstory#Akula" - - catalogue_data = list(/datum/category_item/catalogue/fauna/akula) - - primitive_form = SPECIES_MONKEY_AKULA - - genders = list(MALE, FEMALE, PLURAL, NEUTER) - - spawn_flags = SPECIES_CAN_JOIN - appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR - - water_breather = TRUE - water_movement = -4 //Negates shallow. Halves deep. - swim_mult = 0.5 - - flesh_color = "#AFA59E" - base_color = "#777777" - blood_color = "#1D2CBF" - -/datum/species/nevrean - name = SPECIES_NEVREAN - name_plural = "Nevreans" - icobase = 'icons/mob/human_races/r_nevrean.dmi' - deform = 'icons/mob/human_races/r_def_nevrean.dmi' - tail = "tail" - icobase_tail = 1 - unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) - //darksight = 8 - //slowdown = -0.5 - //brute_mod = 1.15 - //burn_mod = 1.15 - //gluttonous = 1 - soft_landing = TRUE - num_alternate_languages = 3 - secondary_langs = list(LANGUAGE_BIRDSONG) - name_language = LANGUAGE_BIRDSONG - species_language = LANGUAGE_BIRDSONG - color_mult = 1 - inherent_verbs = list(/mob/living/proc/flying_toggle, - /mob/living/proc/flying_vore_toggle, - /mob/living/proc/start_wings_hovering, - /mob/living/carbon/human/proc/tie_hair) - min_age = 18 - max_age = 80 - digi_allowed = TRUE - - blurb = "Nevreans are a race of avian and dinosaur-like creatures living on Tal. They belong to a group of races that hails from Eltus, \ - in the Vilous system. Unlike sergals whom they share a star system with, their species is a very peaceful one. They possess remarkable \ - intelligence and very skillful hands that are put use for constructing precision instruments, but tire-out fast when repeatedly working \ - over and over again. Consequently, they struggle to make copies of same things. Both genders have a voice that echoes a lot. Their natural \ - tone oscillates between tenor and soprano. They are excessively noisy when they quarrel in their native language." - - wikilink="https://wiki.vore-station.net/Backstory#Nevrean" - - catalogue_data = list(/datum/category_item/catalogue/fauna/nevrean) - - primitive_form = SPECIES_MONKEY_NEVREAN - - genders = list(MALE, FEMALE, PLURAL, NEUTER) - - spawn_flags = SPECIES_CAN_JOIN - appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR - - flesh_color = "#AFA59E" - base_color = "#333333" - - heat_discomfort_strings = list( - "Your fur prickles in the heat.", - "You feel uncomfortably warm.", - "Your overheated skin itches." - ) - -/datum/species/hi_zoxxen - name = SPECIES_ZORREN_HIGH - name_plural = "Zorren" - icobase = 'icons/mob/human_races/r_fox_vr.dmi' - deform = 'icons/mob/human_races/r_def_fox.dmi' - tail = "tail" - icobase_tail = 1 - unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) - num_alternate_languages = 3 - secondary_langs = list(LANGUAGE_TERMINUS) - name_language = LANGUAGE_TERMINUS - species_language = LANGUAGE_TERMINUS - inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds, - /mob/living/proc/shred_limb, - /mob/living/carbon/human/proc/tie_hair) - digi_allowed = TRUE - - min_age = 18 - max_age = 80 - - blurb = "The fennec-like, blue-blooded Zorren are native to Virgo 4/Menhir and are descendants of a precursor species \ - that is thought to be responsible for the near-collapse of the biosphere of the planet. \ - With societies organised around hierarchal caste systems (such as the Royal Zorren) or freedom and strength (such as the Free Tribe Zorren), \ - they now slowly recover from their previous hubris and aim to revitalize their planet. While many Zorren live in pre-industrial conditions by necessity, \ - they are an interstellar species known for their pride and stubbornness and doggedly hold out on a Deathworld of their own creation. \ - As local species, they hold moderate sway on local corporations and are hired by NT and other companies, although they find \"Outlander\" culture deeply weird." - wikilink="https://wiki.vore-station.net/Zorren" - - catalogue_data = list(/datum/category_item/catalogue/fauna/zorren) - - //primitive_form = "" //We don't have fox-monkey sprites. - - spawn_flags = SPECIES_CAN_JOIN - appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR - flesh_color = "#AFA59E" - base_color = "#333333" - blood_color = "#240bc4" - blood_reagents = REAGENT_ID_COPPER - reagent_tag = IS_ZORREN - color_mult = 1 - - genders = list(MALE, FEMALE, PLURAL, NEUTER) - - heat_discomfort_strings = list( - "Your fur prickles in the heat.", - "You feel uncomfortably warm.", - "Your overheated skin itches." - ) - -/datum/species/vulpkanin - name = SPECIES_VULPKANIN - name_plural = "Vulpkanin" - blurb = "Vulpkanin are a species of sapient canine bipeds, who are the descendants of a lost colony during the waning days of a Precursor species, \ - from which their distant cousins, the Zorren, also originate from. Independent and iconoclast, they have abandoned the ideals of their forefathers \ - largely and prefer to look outwards as explorers and scientists to forge their own identity. They speak a guttural language known as 'Canilunzt' \ - which has a heavy emphasis on utilizing tail positioning and ear twitches to communicate intent." - icobase = 'icons/mob/human_races/r_vulpkanin.dmi' - deform = 'icons/mob/human_races/r_vulpkanin.dmi' -// path = /mob/living/carbon/human/vulpkanin -// default_language = "Sol Common" - secondary_langs = list(LANGUAGE_CANILUNZT) - name_language = LANGUAGE_CANILUNZT - species_language = LANGUAGE_CANILUNZT - primitive_form = SPECIES_MONKEY_VULPKANIN - tail = "vulptail" - tail_animation = 'icons/mob/species/vulpkanin/tail.dmi' // probably need more than just one of each, but w/e - unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) - darksight = 5 //worse than cats, but better than lizards. -- Poojawa -// gluttonous = 1 - num_alternate_languages = 3 - color_mult = 1 - inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds, - /mob/living/carbon/human/proc/tie_hair) - digi_allowed = TRUE - - wikilink="https://wiki.vore-station.net/Backstory#Vulpkanin" - - catalogue_data = list(/datum/category_item/catalogue/fauna/vulpkanin) - - //Furry fox-like animals shouldn't start freezing at 5 degrees celsius. - //Minor cold is resisted, but not severe frost. - cold_discomfort_level = 263 //Not as good at surviving the frost as tajara, but still better than humans. - - cold_level_1 = 243 //Default 260, other values remain at default. Starts taking damage at -30 celsius. Default tier 2 is -70 and tier 3 is -150 - - - breath_cold_level_1 = 220 // Default 240, lower is better. - - //While foxes can survive in deserts, that's handled by zorren. It's a good contrast that our vulp find heat a little uncomfortable. - - heat_discomfort_level = 295 //Just above standard 20 C to avoid heat message spam, same as Taj - - heat_level_1 = 345 //Default 360 - heat_level_2 = 390 //Default 400 - heat_level_3 = 900 //Default 1000 - - breath_heat_level_1 = 370 //Default 380 - Higher is better - breath_heat_level_2 = 445 //Default 450 - breath_heat_level_3 = 1125 //Default 1250 - - primitive_form = SPECIES_MONKEY_VULPKANIN - - 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 = "#966464" - base_color = "#B43214" - - min_age = 18 - max_age = 80 - - heat_discomfort_strings = list( - "Your fur prickles in the heat.", - "You feel uncomfortably warm.", - "Your overheated skin itches." - ) - -/datum/species/unathi - mob_size = MOB_MEDIUM //To allow normal mob swapping - spawn_flags = SPECIES_CAN_JOIN //Species_can_join is the only spawn flag all the races get, so that none of them will be whitelist only if whitelist is enabled. - icobase = 'icons/mob/human_races/r_lizard_vr.dmi' - deform = 'icons/mob/human_races/r_def_lizard_vr.dmi' - tail_animation = 'icons/mob/species/unathi/tail_vr.dmi' - color_mult = 1 - min_age = 18 - inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) - gluttonous = 0 - genders = list(MALE, FEMALE, PLURAL, NEUTER) - descriptors = list() - blurb = "Heavily reptilian in appearance, the Unathi hail from the Uueoa-Esa system, roughly translated as 'Burning Mother'. \ - Their home planet, Moghes, is an arid climate with hot rocky plains and deserts, and a temperate band of swamps and savannas with \ - massive saltwater lakes being the closest equivalent to oceans. This environment bred a very hardy people who value ideals of honesty, \ - virtue, proficiency and bravery above all else, frequently even one's own life. These same values lend them culturally to imperialistic \ - politics, as well as often being viewed as haughty and arrogant by other interstellar species.