Consolidates Species Files (#17293)

* Consolidates the species _vr override files.

* Bugfix: Moves xenochi brain var to base brain

* gluttony

* Moves teshari to station.dm

They ARE station crew, after all.

* byebye

* RIDICULOUS

* ears

* this got lost

* this needs real unfucking

---------

Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
This commit is contained in:
Cameron Lennox
2025-03-24 18:00:11 -04:00
committed by GitHub
co-authored by Kashargul
parent 25dfd063d4
commit 34537c70ee
44 changed files with 2098 additions and 2397 deletions
@@ -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.<br/><br/>Most humans will never meet a Vox raider, instead learning of this insular species through \
dealing with their traders and merchants; those that do rarely enjoy the experience."
wikilink="https://wiki.vore-station.net/Vox"
catalogue_data = list(/datum/category_item/catalogue/fauna/vox)
// taste_sensitivity = TASTE_DULL
min_age = 18
slowdown = -0.5
speech_sounds = list('sound/voice/shriek1.ogg')
speech_sounds = list()
speech_chance = 20
scream_verb_1p = "shriek"
@@ -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]
@@ -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.
@@ -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"
@@ -99,3 +99,82 @@
var/obj/item/organ/external/affecting = target.get_organ(zone)
user.visible_message(span_warning("[user] jumped up and down on \the [target]'s [affecting.name]!"))
playsound(user, attack_sound, 25, 1, -1)
/datum/unarmed_attack/bite/sharp/numbing //Is using this against someone you are truly trying to fight a bad idea? Yes. Yes it is.
attack_name = "numbing bite"
attack_verb = list("bit")
attack_noun = list("fangs")
attack_sound = 'sound/weapons/bite.ogg'
shredding = 0
sharp = TRUE
edge = TRUE
/datum/unarmed_attack/bite/sharp/numbing/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
var/obj/item/organ/external/affecting = target.get_organ(zone)
attack_damage = CLAMP(attack_damage, 1, 5)
if(target == user)
user.visible_message(span_danger("[user] [pick(attack_verb)] \himself in the [affecting.name]!"))
return 0 //No venom for you.
switch(zone)
if(BP_HEAD, O_MOUTH, O_EYES)
// ----- HEAD ----- //
switch(attack_damage)
if(1 to 2)
user.visible_message(span_danger("[user]'s fangs scrape across [target]'s cheek!"))
to_chat(target, span_danger("Your face feels tingly!"))
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage) //Have to add this here, otherwise the swtich fails.
if(3 to 4)
user.visible_message(span_danger("[user]'s fangs pierce into [target]'s neck at an odd, awkward angle!"))
to_chat(target, span_danger("Your neck feels like it's on fire before going numb!"))
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
if(5)
user.visible_message(span_danger("[user] sinks \his [pick(attack_noun)] <b><i>deep</i></b> into [target]'s neck, causing the vein to bulge outwards at some type of chemical is pumped into it!"))
to_chat(target, span_danger("Your neck feels like it's going to burst! Moments later, you simply can't feel your neck any longer, the numbness beginning to spread throughout your body!"))
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
else
// ----- BODY ----- //
switch(attack_damage)
if(1 to 2)
user.visible_message(span_danger("[user]'s fangs scrape across [target]'s [affecting.name]!"))
to_chat(target, span_danger("Your [affecting.name] feels tingly!"))
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
if(3 to 4)
user.visible_message(span_danger("[user]'s fangs pierce [pick("", "", "the side of")] [target]'s [affecting.name]!"))
to_chat(target, span_danger("Your [affecting.name] feels like it's on fire before going numb!"))
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
if(5)
user.visible_message(span_danger("[user]'s fangs sink deep into [target]'s [affecting.name], one of their veins bulging outwards from the sudden fluid pumped into it!"))
to_chat(target, span_danger("Your [affecting.name] feels like it's going to burst! Moments later, you simply can't feel your [affecting.name] any longer, the numbness slowly spreading throughout your body!"))
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
/datum/unarmed_attack/claws/shadekin
/datum/unarmed_attack/claws/shadekin/apply_effects(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
..()
if(!(target == user))
user.shadekin_adjust_energy(attack_damage)
/datum/unarmed_attack/bite/sharp/shadekin
/datum/unarmed_attack/bite/sharp/shadekin/apply_effects(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
..()
if(!(target == user))
user.shadekin_adjust_energy(attack_damage)
/datum/unarmed_attack/claws/chimera //special feral attack that gets stronger as they get angrier
/datum/unarmed_attack/claws/chimera/get_unarmed_damage(var/mob/living/carbon/human/user)
return user.feral/5
/datum/unarmed_attack/claws/chimera/apply_effects(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/armour,var/attack_damage,var/zone)
..()
if(user.feral && !(target == user))
var/selfdamage = ((user.feral/10)-7.5)
if(selfdamage > 0)
var/selfdamagezone = null
if (user.hand)
selfdamagezone=pick(BP_L_ARM, BP_L_HAND)
else
selfdamagezone=pick(BP_R_ARM, BP_R_HAND)
user.apply_damage(selfdamage, BRUTE, selfdamagezone, 0, 0, sharp=FALSE, edge=FALSE)
@@ -1,78 +0,0 @@
/datum/unarmed_attack/bite/sharp/numbing //Is using this against someone you are truly trying to fight a bad idea? Yes. Yes it is.
attack_name = "numbing bite"
attack_verb = list("bit")
attack_noun = list("fangs")
attack_sound = 'sound/weapons/bite.ogg'
shredding = 0
sharp = TRUE
edge = TRUE
/datum/unarmed_attack/bite/sharp/numbing/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
var/obj/item/organ/external/affecting = target.get_organ(zone)
attack_damage = CLAMP(attack_damage, 1, 5)
if(target == user)
user.visible_message(span_danger("[user] [pick(attack_verb)] \himself in the [affecting.name]!"))
return 0 //No venom for you.
switch(zone)
if(BP_HEAD, O_MOUTH, O_EYES)
// ----- HEAD ----- //
switch(attack_damage)
if(1 to 2)
user.visible_message(span_danger("[user]'s fangs scrape across [target]'s cheek!"))
to_chat(target, span_danger("Your face feels tingly!"))
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage) //Have to add this here, otherwise the swtich fails.
if(3 to 4)
user.visible_message(span_danger("[user]'s fangs pierce into [target]'s neck at an odd, awkward angle!"))
to_chat(target, span_danger("Your neck feels like it's on fire before going numb!"))
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
if(5)
user.visible_message(span_danger("[user] sinks \his [pick(attack_noun)] <b><i>deep</i></b> into [target]'s neck, causing the vein to bulge outwards at some type of chemical is pumped into it!"))
to_chat(target, span_danger("Your neck feels like it's going to burst! Moments later, you simply can't feel your neck any longer, the numbness beginning to spread throughout your body!"))
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
else
// ----- BODY ----- //
switch(attack_damage)
if(1 to 2)
user.visible_message(span_danger("[user]'s fangs scrape across [target]'s [affecting.name]!"))
to_chat(target, span_danger("Your [affecting.name] feels tingly!"))
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
if(3 to 4)
user.visible_message(span_danger("[user]'s fangs pierce [pick("", "", "the side of")] [target]'s [affecting.name]!"))
to_chat(target, span_danger("Your [affecting.name] feels like it's on fire before going numb!"))
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
if(5)
user.visible_message(span_danger("[user]'s fangs sink deep into [target]'s [affecting.name], one of their veins bulging outwards from the sudden fluid pumped into it!"))
to_chat(target, span_danger("Your [affecting.name] feels like it's going to burst! Moments later, you simply can't feel your [affecting.name] any longer, the numbness slowly spreading throughout your body!"))
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
/datum/unarmed_attack/claws/shadekin
/datum/unarmed_attack/claws/shadekin/apply_effects(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
..()
if(!(target == user))
user.shadekin_adjust_energy(attack_damage)
/datum/unarmed_attack/bite/sharp/shadekin
/datum/unarmed_attack/bite/sharp/shadekin/apply_effects(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
..()
if(!(target == user))
user.shadekin_adjust_energy(attack_damage)
/datum/unarmed_attack/claws/chimera //special feral attack that gets stronger as they get angrier
/datum/unarmed_attack/claws/chimera/get_unarmed_damage(var/mob/living/carbon/human/user)
return user.feral/5
/datum/unarmed_attack/claws/chimera/apply_effects(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/armour,var/attack_damage,var/zone)
..()
if(user.feral && !(target == user))
var/selfdamage = ((user.feral/10)-7.5)
if(selfdamage > 0)
var/selfdamagezone = null
if (user.hand)
selfdamagezone=pick(BP_L_ARM, BP_L_HAND)
else
selfdamagezone=pick(BP_R_ARM, BP_R_HAND)
user.apply_damage(selfdamage, BRUTE, selfdamagezone, 0, 0, sharp=FALSE, edge=FALSE)
@@ -125,3 +125,16 @@
/datum/species/proc/get_vision_flags(var/mob/living/carbon/human/H)
return vision_flags
/datum/species/proc/get_wing_hair(var/mob/living/carbon/human/H) //I have no idea what this is even used for other than teshari, but putting it in just in case.
return wing_hair //Since the tail has it.
/datum/species/proc/get_wing(var/mob/living/carbon/human/H)
return wing
/datum/species/proc/get_wing_animation(var/mob/living/carbon/human/H)
return wing_animation
/datum/species/proc/get_perfect_belly_air_type(var/mob/living/carbon/human/H)
if(ideal_air_type)
return ideal_air_type //Whatever we want
else
return /datum/gas_mixture/belly_air //Default
@@ -1,13 +0,0 @@
/datum/species/proc/get_wing_hair(var/mob/living/carbon/human/H) //I have no idea what this is even used for other than teshari, but putting it in just in case.
return wing_hair //Since the tail has it.
/datum/species/proc/get_wing(var/mob/living/carbon/human/H)
return wing
/datum/species/proc/get_wing_animation(var/mob/living/carbon/human/H)
return wing_animation
/datum/species/proc/get_perfect_belly_air_type(var/mob/living/carbon/human/H)
if(ideal_air_type)
return ideal_air_type //Whatever we want
else
return /datum/gas_mixture/belly_air //Default
@@ -14,6 +14,9 @@ var/list/wrapped_species_by_ref = list()
var/list/valid_transform_species = list()
//var/default_form = SPECIES_HUMAN //VOREStation edit
base_species = SPECIES_HUMAN
selects_bodytype = SELECTS_BODYTYPE_SHAPESHIFTER
/datum/species/shapeshifter/get_valid_shapeshifter_forms(var/mob/living/carbon/human/H)
return list(vanity_base_fit)|valid_transform_species
@@ -321,3 +324,339 @@ var/list/wrapped_species_by_ref = list()
update_icons_body()
update_eyes()
/mob/living/carbon/human/proc/shapeshifter_select_ears()
set name = "Select Ears"
set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
last_special = world.time + 10
// Construct the list of names allowed for this user.
var/list/pretty_ear_styles = list("Normal" = null)
for(var/path in ear_styles_list)
var/datum/sprite_accessory/ears/instance = ear_styles_list[path]
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
pretty_ear_styles[instance.name] = path
// Present choice to user
var/new_ear_style = tgui_input_list(src, "Pick some ears!", "Character Preference", pretty_ear_styles)
if(!new_ear_style)
return
//Set new style
ear_style = ear_styles_list[pretty_ear_styles[new_ear_style]]
//Allow color picks
var/current_pri_color = rgb(r_ears,g_ears,b_ears)
var/new_pri_color = tgui_color_picker(src, "Pick primary ear color:","Ear Color (Pri)", current_pri_color)
if(new_pri_color)
var/list/new_color_rgb_list = hex2rgb(new_pri_color)
r_ears = new_color_rgb_list[1]
g_ears = new_color_rgb_list[2]
b_ears = new_color_rgb_list[3]
//Indented inside positive primary color choice, don't bother if they clicked cancel
var/current_sec_color = rgb(r_ears2,g_ears2,b_ears2)
var/new_sec_color = tgui_color_picker(src, "Pick secondary ear color (only applies to some ears):","Ear Color (sec)", current_sec_color)
if(new_sec_color)
new_color_rgb_list = hex2rgb(new_sec_color)
r_ears2 = new_color_rgb_list[1]
g_ears2 = new_color_rgb_list[2]
b_ears2 = new_color_rgb_list[3]
var/current_ter_color = rgb(r_ears3,g_ears3,b_ears3)
var/new_ter_color = tgui_color_picker(src, "Pick tertiary ear color (only applies to some ears):","Ear Color (sec)", current_ter_color)
if(new_ter_color)
new_color_rgb_list = hex2rgb(new_sec_color)
r_ears3 = new_color_rgb_list[1]
g_ears3 = new_color_rgb_list[2]
b_ears3 = new_color_rgb_list[3]
var/new_ear_alpha = tgui_input_number(src, "Set ear alpha (0-255):","Ear Alpha", a_ears,255,0)
if(new_ear_alpha)
a_ears = new_ear_alpha
update_hair() //Includes Virgo ears
/mob/living/carbon/human/proc/shapeshifter_select_secondary_ears()
set name = "Select Secondary Ears"
set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
last_special = world.time + 1 SECONDS
// Construct the list of names allowed for this user.
var/list/pretty_ear_styles = list("Normal" = null)
for(var/path in ear_styles_list)
var/datum/sprite_accessory/ears/instance = ear_styles_list[path]
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
pretty_ear_styles[instance.name] = path
// Handle style pick
var/new_ear_style = tgui_input_list(src, "Pick some ears!", "Character Preference", pretty_ear_styles)
if(!new_ear_style)
return
ear_secondary_style = ear_styles_list[pretty_ear_styles[new_ear_style]]
// Handle color picks
if(ear_secondary_style)
var/list/new_colors = list()
for(var/channel in 1 to ear_secondary_style.get_color_channel_count())
var/channel_name = GLOB.fancy_sprite_accessory_color_channel_names[channel]
var/default = LAZYACCESS(ear_secondary_colors, channel) || "#ffffff"
var/new_color = tgui_color_picker(src, "Pick [channel_name]", "Ear Color ([channel_name])", default)
new_colors += new_color || default
var/new_ear_alpha = tgui_input_number(src, "Set ear alpha (0-255):","Ear Alpha", a_ears2,255,0)
if(new_ear_alpha)
a_ears2 = new_ear_alpha
update_hair()
/mob/living/carbon/human/proc/shapeshifter_select_tail()
set name = "Select Tail"
set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
last_special = world.time + 10
// Construct the list of names allowed for this user.
var/list/pretty_tail_styles = list("Normal" = null)
for(var/path in tail_styles_list)
var/datum/sprite_accessory/tail/instance = tail_styles_list[path]
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
pretty_tail_styles[instance.name] = path
// Present choice to user
var/new_tail_style = tgui_input_list(src, "Pick a tail!", "Character Preference", pretty_tail_styles)
if(!new_tail_style)
return
//Set new style
tail_style = tail_styles_list[pretty_tail_styles[new_tail_style]]
//Allow color picks
var/current_pri_color = rgb(r_tail,g_tail,b_tail)
var/new_pri_color = tgui_color_picker(src, "Pick primary tail color:","Tail Color (Pri)", current_pri_color)
if(new_pri_color)
var/list/new_color_rgb_list = hex2rgb(new_pri_color)
r_tail = new_color_rgb_list[1]
g_tail = new_color_rgb_list[2]
b_tail = new_color_rgb_list[3]
//Indented inside positive primary color choice, don't bother if they clicked cancel
var/current_sec_color = rgb(r_tail2,g_tail2,b_tail2)
var/new_sec_color = tgui_color_picker(src, "Pick secondary tail color (only applies to some tails):","Tail Color (sec)", current_sec_color)
if(new_sec_color)
new_color_rgb_list = hex2rgb(new_sec_color)
r_tail2 = new_color_rgb_list[1]
g_tail2 = new_color_rgb_list[2]
b_tail2 = new_color_rgb_list[3]
var/current_ter_color = rgb(r_tail3,g_tail3,b_tail3)
var/new_ter_color = tgui_color_picker(src, "Pick tertiary tail color (only applies to some tails):","Tail Color (sec)", current_ter_color)
if(new_ter_color)
new_color_rgb_list = hex2rgb(new_ter_color)
r_tail3 = new_color_rgb_list[1]
g_tail3 = new_color_rgb_list[2]
b_tail3 = new_color_rgb_list[3]
var/new_tail_alpha = tgui_input_number(src, "Set tail alpha (0-255):","Tail Alpha", a_tail,255,0)
if(new_tail_alpha)
a_tail = new_tail_alpha
update_tail_showing()
/mob/living/carbon/human/proc/shapeshifter_select_wings()
set name = "Select Wings"
set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
last_special = world.time + 10
// Construct the list of names allowed for this user.
var/list/pretty_wing_styles = list("None" = null)
for(var/path in wing_styles_list)
var/datum/sprite_accessory/wing/instance = wing_styles_list[path]
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
pretty_wing_styles[instance.name] = path
// Present choice to user
var/new_wing_style = tgui_input_list(src, "Pick some wings!", "Character Preference", pretty_wing_styles)
if(!new_wing_style)
return
//Set new style
wing_style = wing_styles_list[pretty_wing_styles[new_wing_style]]
//Allow color picks
var/current_color = rgb(r_wing,g_wing,b_wing)
var/new_color = tgui_color_picker(src, "Pick wing color:","Wing Color", current_color)
if(new_color)
var/list/new_color_rgb_list = hex2rgb(new_color)
r_wing = new_color_rgb_list[1]
g_wing = new_color_rgb_list[2]
b_wing = new_color_rgb_list[3]
//Indented inside positive primary color choice, don't bother if they clicked cancel
var/current_sec_color = rgb(r_wing2,g_wing2,b_wing2)
var/new_sec_color = tgui_color_picker(src, "Pick secondary wing color (only applies to some wings):","Wing Color (sec)", current_sec_color)
if(new_sec_color)
new_color_rgb_list = hex2rgb(new_sec_color)
r_wing2 = new_color_rgb_list[1]
g_wing2 = new_color_rgb_list[2]
b_wing2 = new_color_rgb_list[3]
var/current_ter_color = rgb(r_wing3,g_wing3,b_wing3)
var/new_ter_color = tgui_color_picker(src, "Pick tertiary wing color (only applies to some wings):","Wing Color (sec)", current_ter_color)
if(new_ter_color)
new_color_rgb_list = hex2rgb(new_ter_color)
r_wing3 = new_color_rgb_list[1]
g_wing3 = new_color_rgb_list[2]
b_wing3 = new_color_rgb_list[3]
var/new_alpha = tgui_input_number(src, "Set wing alpha (0-255):","Wing Alpha", a_wing,255,0)
if(new_alpha)
a_wing = new_alpha
update_wing_showing()
/mob/living/carbon/human/proc/promethean_select_opaqueness()
set name = "Toggle Transparency"
set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
last_special = world.time + 50
for(var/obj/item/organ/external/L as anything in src.organs)
L.transparent = !L.transparent
visible_message(span_notice("\The [src]'s internal composition seems to change."))
update_icons_body()
update_hair()
/mob/living/carbon/human/proc/shapeshifter_change_shape(var/new_species = null, var/visible = TRUE) //not sure if this needs to be moved to a separate file but
if(!new_species)
return
dna.base_species = new_species
species.base_species = new_species
wrapped_species_by_ref["\ref[src]"] = new_species
if (visible)
visible_message(span_filter_notice(span_bold("\The [src]") + " shifts and contorts, taking the form of \a [new_species]!"))
regenerate_icons()
//////////////////// Shapeshifter copy-body powers
/// Copied from the protean version, but with some tweaks to match non-protean shapeshifters such as lleill, hanner and replicants
/mob/living/carbon/human/proc/shapeshifter_regenerate()
set name = "Fully Reform"
set desc = "Reload your appearance from whatever character slot you have loaded."
set category = "Abilities.Shapeshift"
var/mob/living/character = src
if(temporary_form)
character = temporary_form
var/input = tgui_alert(character,{"Do you want to copy the appearance data of your currently loaded save slot?"},"Reformation",list("Reform","Cancel"))
if(input == "Cancel" || !input)
return
else
input = tgui_alert(character,{"Include Flavourtext?"},"Reformation",list("Yes","No","Cancel"))
if(input == "Cancel" || !input)
return
var/flavour = 0
if(input == "Yes")
flavour = 1
input = tgui_alert(character,{"Include OOC notes?"},"Reformation",list("Yes","No","Cancel"))
if(input == "Cancel" || !input)
return
var/oocnotes = 0
if(input == "Yes")
oocnotes = 1
to_chat(character, span_notify("You begin to reform. You will need to remain still."))
character.visible_message(span_notify("[character] rapidly contorts and shifts!"), span_danger("You begin to reform."))
if(do_after(character, 40,exclusive = TASK_ALL_EXCLUSIVE))
if(character.client.prefs) //Make sure we didn't d/c
character.client.prefs.vanity_copy_to(src, FALSE, flavour, oocnotes, FALSE)
character.visible_message(span_notify("[character] adopts a new form!"), span_danger("You have reformed."))
/mob/living/carbon/human/proc/shapeshifter_copy_body()
set name = "Copy Form"
set desc = "If you are aggressively grabbing someone, with their consent, you can turn into a copy of them. (Without their name)."
set category = "Abilities.Shapeshift"
var/mob/living/character = src
if(temporary_form)
character = temporary_form
var/grabbing_but_not_enough
var/mob/living/carbon/human/victim = null
for(var/obj/item/grab/G in character)
if(G.state < GRAB_AGGRESSIVE)
grabbing_but_not_enough = TRUE
return
else
victim = G.affecting
if (!victim)
if (grabbing_but_not_enough)
to_chat(character, span_warning("You need a better grip to do that!"))
else
to_chat(character, span_notice("You need to be aggressively grabbing someone before you can copy their form."))
return
if (!ishuman(victim))
to_chat(character, span_warning("You can only perform this on human mobs!"))
return
if (!victim.client)
to_chat(character, span_notice("The person you try this on must have a client!"))
return
to_chat(character, span_notice("Waiting for other person's consent."))
var/consent = tgui_alert(victim, "Allow [src] to copy what you look like?", "Consent", list("Yes", "No"))
if (consent != "Yes")
to_chat(character, span_notice("They declined your request."))
return
var/input = tgui_alert(character,{"Copy [victim]'s flavourtext?"},"Copy Form",list("Yes","No","Cancel"))
if(input == "Cancel" || !input)
return
var/flavour = 0
if(input == "Yes")
flavour = 1
var/checking = FALSE
for(var/obj/item/grab/G in character)
if(G.affecting == victim && G.state >= GRAB_AGGRESSIVE)
checking = TRUE
if (!checking)
to_chat(character, span_warning("You lost your grip on [victim]!"))
return
to_chat(character, span_notify("You begin to reassemble into [victim]. You will need to remain still."))
character.visible_message(span_notify("[character] rapidly contorts and shifts!"), span_danger("You begin to reassemble into [victim]."))
if(do_after(character, 40,exclusive = TASK_ALL_EXCLUSIVE))
checking = FALSE
for(var/obj/item/grab/G in character)
if(G.affecting == victim && G.state >= GRAB_AGGRESSIVE)
checking = TRUE
if (!checking)
to_chat(character, span_warning("You lost your grip on [victim]!"))
return
if(character.client) //Make sure we didn't d/c
transform_into_other_human(victim, FALSE, flavour, FALSE)
character.visible_message(span_notify("[character] adopts the form of [victim]!"), span_danger("You have reassembled into [victim]."))
@@ -1,339 +0,0 @@
/datum/species/shapeshifter
base_species = SPECIES_HUMAN
selects_bodytype = SELECTS_BODYTYPE_SHAPESHIFTER
/mob/living/carbon/human/proc/shapeshifter_select_ears()
set name = "Select Ears"
set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
last_special = world.time + 10
// Construct the list of names allowed for this user.
var/list/pretty_ear_styles = list("Normal" = null)
for(var/path in ear_styles_list)
var/datum/sprite_accessory/ears/instance = ear_styles_list[path]
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
pretty_ear_styles[instance.name] = path
// Present choice to user
var/new_ear_style = tgui_input_list(src, "Pick some ears!", "Character Preference", pretty_ear_styles)
if(!new_ear_style)
return
//Set new style
ear_style = ear_styles_list[pretty_ear_styles[new_ear_style]]
//Allow color picks
var/current_pri_color = rgb(r_ears,g_ears,b_ears)
var/new_pri_color = tgui_color_picker(src, "Pick primary ear color:","Ear Color (Pri)", current_pri_color)
if(new_pri_color)
var/list/new_color_rgb_list = hex2rgb(new_pri_color)
r_ears = new_color_rgb_list[1]
g_ears = new_color_rgb_list[2]
b_ears = new_color_rgb_list[3]
//Indented inside positive primary color choice, don't bother if they clicked cancel
var/current_sec_color = rgb(r_ears2,g_ears2,b_ears2)
var/new_sec_color = tgui_color_picker(src, "Pick secondary ear color (only applies to some ears):","Ear Color (sec)", current_sec_color)
if(new_sec_color)
new_color_rgb_list = hex2rgb(new_sec_color)
r_ears2 = new_color_rgb_list[1]
g_ears2 = new_color_rgb_list[2]
b_ears2 = new_color_rgb_list[3]
var/current_ter_color = rgb(r_ears3,g_ears3,b_ears3)
var/new_ter_color = tgui_color_picker(src, "Pick tertiary ear color (only applies to some ears):","Ear Color (sec)", current_ter_color)
if(new_ter_color)
new_color_rgb_list = hex2rgb(new_sec_color)
r_ears3 = new_color_rgb_list[1]
g_ears3 = new_color_rgb_list[2]
b_ears3 = new_color_rgb_list[3]
var/new_ear_alpha = tgui_input_number(src, "Set ear alpha (0-255):","Ear Alpha", a_ears,255,0)
if(new_ear_alpha)
a_ears = new_ear_alpha
update_hair() //Includes Virgo ears
/mob/living/carbon/human/proc/shapeshifter_select_secondary_ears()
set name = "Select Secondary Ears"
set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
last_special = world.time + 1 SECONDS
// Construct the list of names allowed for this user.
var/list/pretty_ear_styles = list("Normal" = null)
for(var/path in ear_styles_list)
var/datum/sprite_accessory/ears/instance = ear_styles_list[path]
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
pretty_ear_styles[instance.name] = path
// Handle style pick
var/new_ear_style = tgui_input_list(src, "Pick some ears!", "Character Preference", pretty_ear_styles)
if(!new_ear_style)
return
ear_secondary_style = ear_styles_list[pretty_ear_styles[new_ear_style]]
// Handle color picks
if(ear_secondary_style)
var/list/new_colors = list()
for(var/channel in 1 to ear_secondary_style.get_color_channel_count())
var/channel_name = GLOB.fancy_sprite_accessory_color_channel_names[channel]
var/default = LAZYACCESS(ear_secondary_colors, channel) || "#ffffff"
var/new_color = tgui_color_picker(src, "Pick [channel_name]", "Ear Color ([channel_name])", default)
new_colors += new_color || default
var/new_ear_alpha = tgui_input_number(src, "Set ear alpha (0-255):","Ear Alpha", a_ears2,255,0)
if(new_ear_alpha)
a_ears2 = new_ear_alpha
update_hair()
/mob/living/carbon/human/proc/shapeshifter_select_tail()
set name = "Select Tail"
set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
last_special = world.time + 10
// Construct the list of names allowed for this user.
var/list/pretty_tail_styles = list("Normal" = null)
for(var/path in tail_styles_list)
var/datum/sprite_accessory/tail/instance = tail_styles_list[path]
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
pretty_tail_styles[instance.name] = path
// Present choice to user
var/new_tail_style = tgui_input_list(src, "Pick a tail!", "Character Preference", pretty_tail_styles)
if(!new_tail_style)
return
//Set new style
tail_style = tail_styles_list[pretty_tail_styles[new_tail_style]]
//Allow color picks
var/current_pri_color = rgb(r_tail,g_tail,b_tail)
var/new_pri_color = tgui_color_picker(src, "Pick primary tail color:","Tail Color (Pri)", current_pri_color)
if(new_pri_color)
var/list/new_color_rgb_list = hex2rgb(new_pri_color)
r_tail = new_color_rgb_list[1]
g_tail = new_color_rgb_list[2]
b_tail = new_color_rgb_list[3]
//Indented inside positive primary color choice, don't bother if they clicked cancel
var/current_sec_color = rgb(r_tail2,g_tail2,b_tail2)
var/new_sec_color = tgui_color_picker(src, "Pick secondary tail color (only applies to some tails):","Tail Color (sec)", current_sec_color)
if(new_sec_color)
new_color_rgb_list = hex2rgb(new_sec_color)
r_tail2 = new_color_rgb_list[1]
g_tail2 = new_color_rgb_list[2]
b_tail2 = new_color_rgb_list[3]
var/current_ter_color = rgb(r_tail3,g_tail3,b_tail3)
var/new_ter_color = tgui_color_picker(src, "Pick tertiary tail color (only applies to some tails):","Tail Color (sec)", current_ter_color)
if(new_ter_color)
new_color_rgb_list = hex2rgb(new_ter_color)
r_tail3 = new_color_rgb_list[1]
g_tail3 = new_color_rgb_list[2]
b_tail3 = new_color_rgb_list[3]
var/new_tail_alpha = tgui_input_number(src, "Set tail alpha (0-255):","Tail Alpha", a_tail,255,0)
if(new_tail_alpha)
a_tail = new_tail_alpha
update_tail_showing()
/mob/living/carbon/human/proc/shapeshifter_select_wings()
set name = "Select Wings"
set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
last_special = world.time + 10
// Construct the list of names allowed for this user.
var/list/pretty_wing_styles = list("None" = null)
for(var/path in wing_styles_list)
var/datum/sprite_accessory/wing/instance = wing_styles_list[path]
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
pretty_wing_styles[instance.name] = path
// Present choice to user
var/new_wing_style = tgui_input_list(src, "Pick some wings!", "Character Preference", pretty_wing_styles)
if(!new_wing_style)
return
//Set new style
wing_style = wing_styles_list[pretty_wing_styles[new_wing_style]]
//Allow color picks
var/current_color = rgb(r_wing,g_wing,b_wing)
var/new_color = tgui_color_picker(src, "Pick wing color:","Wing Color", current_color)
if(new_color)
var/list/new_color_rgb_list = hex2rgb(new_color)
r_wing = new_color_rgb_list[1]
g_wing = new_color_rgb_list[2]
b_wing = new_color_rgb_list[3]
//Indented inside positive primary color choice, don't bother if they clicked cancel
var/current_sec_color = rgb(r_wing2,g_wing2,b_wing2)
var/new_sec_color = tgui_color_picker(src, "Pick secondary wing color (only applies to some wings):","Wing Color (sec)", current_sec_color)
if(new_sec_color)
new_color_rgb_list = hex2rgb(new_sec_color)
r_wing2 = new_color_rgb_list[1]
g_wing2 = new_color_rgb_list[2]
b_wing2 = new_color_rgb_list[3]
var/current_ter_color = rgb(r_wing3,g_wing3,b_wing3)
var/new_ter_color = tgui_color_picker(src, "Pick tertiary wing color (only applies to some wings):","Wing Color (sec)", current_ter_color)
if(new_ter_color)
new_color_rgb_list = hex2rgb(new_ter_color)
r_wing3 = new_color_rgb_list[1]
g_wing3 = new_color_rgb_list[2]
b_wing3 = new_color_rgb_list[3]
var/new_alpha = tgui_input_number(src, "Set wing alpha (0-255):","Wing Alpha", a_wing,255,0)
if(new_alpha)
a_wing = new_alpha
update_wing_showing()
/mob/living/carbon/human/proc/promethean_select_opaqueness()
set name = "Toggle Transparency"
set category = "Abilities.Shapeshift"
if(stat || world.time < last_special)
return
last_special = world.time + 50
for(var/obj/item/organ/external/L as anything in src.organs)
L.transparent = !L.transparent
visible_message(span_notice("\The [src]'s internal composition seems to change."))
update_icons_body()
update_hair()
/mob/living/carbon/human/proc/shapeshifter_change_shape(var/new_species = null, var/visible = TRUE) //not sure if this needs to be moved to a separate file but
if(!new_species)
return
dna.base_species = new_species
species.base_species = new_species
wrapped_species_by_ref["\ref[src]"] = new_species
if (visible)
visible_message(span_filter_notice(span_bold("\The [src]") + " shifts and contorts, taking the form of \a [new_species]!"))
regenerate_icons()
//////////////////// Shapeshifter copy-body powers
/// Copied from the protean version, but with some tweaks to match non-protean shapeshifters such as lleill, hanner and replicants
/mob/living/carbon/human/proc/shapeshifter_regenerate()
set name = "Fully Reform"
set desc = "Reload your appearance from whatever character slot you have loaded."
set category = "Abilities.Shapeshift"
var/mob/living/character = src
if(temporary_form)
character = temporary_form
var/input = tgui_alert(character,{"Do you want to copy the appearance data of your currently loaded save slot?"},"Reformation",list("Reform","Cancel"))
if(input == "Cancel" || !input)
return
else
input = tgui_alert(character,{"Include Flavourtext?"},"Reformation",list("Yes","No","Cancel"))
if(input == "Cancel" || !input)
return
var/flavour = 0
if(input == "Yes")
flavour = 1
input = tgui_alert(character,{"Include OOC notes?"},"Reformation",list("Yes","No","Cancel"))
if(input == "Cancel" || !input)
return
var/oocnotes = 0
if(input == "Yes")
oocnotes = 1
to_chat(character, span_notify("You begin to reform. You will need to remain still."))
character.visible_message(span_notify("[character] rapidly contorts and shifts!"), span_danger("You begin to reform."))
if(do_after(character, 40,exclusive = TASK_ALL_EXCLUSIVE))
if(character.client.prefs) //Make sure we didn't d/c
character.client.prefs.vanity_copy_to(src, FALSE, flavour, oocnotes, FALSE)
character.visible_message(span_notify("[character] adopts a new form!"), span_danger("You have reformed."))
/mob/living/carbon/human/proc/shapeshifter_copy_body()
set name = "Copy Form"
set desc = "If you are aggressively grabbing someone, with their consent, you can turn into a copy of them. (Without their name)."
set category = "Abilities.Shapeshift"
var/mob/living/character = src
if(temporary_form)
character = temporary_form
var/grabbing_but_not_enough
var/mob/living/carbon/human/victim = null
for(var/obj/item/grab/G in character)
if(G.state < GRAB_AGGRESSIVE)
grabbing_but_not_enough = TRUE
return
else
victim = G.affecting
if (!victim)
if (grabbing_but_not_enough)
to_chat(character, span_warning("You need a better grip to do that!"))
else
to_chat(character, span_notice("You need to be aggressively grabbing someone before you can copy their form."))
return
if (!ishuman(victim))
to_chat(character, span_warning("You can only perform this on human mobs!"))
return
if (!victim.client)
to_chat(character, span_notice("The person you try this on must have a client!"))
return
to_chat(character, span_notice("Waiting for other person's consent."))
var/consent = tgui_alert(victim, "Allow [src] to copy what you look like?", "Consent", list("Yes", "No"))
if (consent != "Yes")
to_chat(character, span_notice("They declined your request."))
return
var/input = tgui_alert(character,{"Copy [victim]'s flavourtext?"},"Copy Form",list("Yes","No","Cancel"))
if(input == "Cancel" || !input)
return
var/flavour = 0
if(input == "Yes")
flavour = 1
var/checking = FALSE
for(var/obj/item/grab/G in character)
if(G.affecting == victim && G.state >= GRAB_AGGRESSIVE)
checking = TRUE
if (!checking)
to_chat(character, span_warning("You lost your grip on [victim]!"))
return
to_chat(character, span_notify("You begin to reassemble into [victim]. You will need to remain still."))
character.visible_message(span_notify("[character] rapidly contorts and shifts!"), span_danger("You begin to reassemble into [victim]."))
if(do_after(character, 40,exclusive = TASK_ALL_EXCLUSIVE))
checking = FALSE
for(var/obj/item/grab/G in character)
if(G.affecting == victim && G.state >= GRAB_AGGRESSIVE)
checking = TRUE
if (!checking)
to_chat(character, span_warning("You lost your grip on [victim]!"))
return
if(character.client) //Make sure we didn't d/c
transform_into_other_human(victim, FALSE, flavour, FALSE)
character.visible_message(span_notify("[character] adopts the form of [victim]!"), span_danger("You have reassembled into [victim]."))
@@ -1,136 +0,0 @@
/datum/species
//This is so that if a race is using the chimera revive they can't use it more than once.
//Shouldn't really be seen in play too often, but it's case an admin event happens and they give a non chimera the chimera revive. Only one person can use the chimera revive at a time per race.
//var/reviving = 0 //commented out 'cause moved to mob
holder_type = /obj/item/holder/micro //This allows you to pick up crew
min_age = 18
descriptors = list()
var/organic_food_coeff = 1
var/synthetic_food_coeff = 0
var/robo_ethanol_proc = 0 //can we get fuel from booze, as a synth?
var/robo_ethanol_drunk = 0 //can we get *drunk* from booze, as a synth?
var/digestion_efficiency = 1 //VORE specific digestion var
//var/vore_numbing = 0
var/metabolism = 0.0015
var/lightweight = FALSE //Oof! Nonhelpful bump stumbles.
var/trashcan = FALSE //It's always sunny in the wrestling ring.
var/eat_minerals = FALSE //HEAVY METAL DIET
var/base_species = null // Unused outside of a few species
var/selects_bodytype = SELECTS_BODYTYPE_FALSE // Allows the species to choose from body types like custom species can, affecting suit fitting and etcetera as you would expect.
var/bloodsucker = FALSE // Allows safely getting nutrition from blood.
var/bloodsucker_controlmode = "always loud" //Allows selecting between bloodsucker control modes. Always Loud corresponds to original implementation.
var/is_weaver = FALSE
var/silk_production = FALSE
var/silk_reserve = 100
var/silk_max_reserve = 500
var/silk_color = "#FFFFFF"
var/list/traits = list()
//Vars that need to be copied when producing a copy of species.
var/list/copy_vars = list("base_species", "icobase", "deform", "tail", "tail_animation", "icobase_tail", "color_mult", "primitive_form", "appearance_flags", "flesh_color", "base_color", "blood_mask", "damage_mask", "damage_overlays", "move_trail", "has_floating_eyes")
var/trait_points = 0
var/ideal_air_type = null // Set to something else if you breathe something else from default composition. Used for inbelly air.
var/micro_size_mod = 0 // How different is our size for interactions that involve us being small?
var/macro_size_mod = 0 // How different is our size for interactions that involve us being big?
var/digestion_nutrition_modifier = 1
var/center_offset = 0.5
var/can_climb = FALSE
var/climbing_delay = 1.5 // We climb with a quarter delay
var/list/food_preference = list() //RS edit
var/food_preference_bonus = 0
// For Lleill and Hanner
var/lleill_energy = 200
var/lleill_energy_max = 200
/datum/species/unathi
vore_belly_default_variant = "L"
/datum/species/proc/give_numbing_bite() //Holy SHIT this is hacky, but it works. Updating a mob's attacks mid game is insane.
unarmed_attacks = list()
unarmed_types += /datum/unarmed_attack/bite/sharp/numbing
for(var/u_type in unarmed_types)
unarmed_attacks += new u_type()
/datum/species/create_organs(var/mob/living/carbon/human/H)
if(H.nif)
/*var/type = H.nif.type
var/durability = H.nif.durability
var/list/nifsofts = H.nif.nifsofts
var/list/nif_savedata = H.nif.save_data.Copy()*/
..()
H.nif = null //A previous call during the rejuvenation path deleted it, so we no longer should have it here
/*var/obj/item/nif/nif = new type(H,durability,nif_savedata)
nif.nifsofts = nifsofts*/
else
..()
/datum/species/proc/produceCopy(var/list/traits, var/mob/living/carbon/human/H, var/custom_base, var/reset_dna = TRUE) // Traitgenes reset_dna flag required, or genes get reset on resleeve
ASSERT(src)
ASSERT(istype(H))
var/datum/species/new_copy = new src.type()
new_copy.race_key = race_key
if (selects_bodytype && custom_base)
new_copy.base_species = custom_base
if(selects_bodytype == SELECTS_BODYTYPE_CUSTOM) //If race selects a bodytype, retrieve the custom_base species and copy needed variables.
var/datum/species/S = GLOB.all_species[custom_base]
S.copy_variables(new_copy, copy_vars)
if(selects_bodytype == SELECTS_BODYTYPE_SHAPESHIFTER)
H.shapeshifter_change_shape(custom_base, FALSE)
for(var/organ in has_limbs) //Copy important organ data generated by species.
var/list/organ_data = has_limbs[organ]
new_copy.has_limbs[organ] = organ_data.Copy()
new_copy.traits = traits
//If you had traits, apply them
if(new_copy.traits)
for(var/trait in new_copy.traits)
var/datum/trait/T = all_traits[trait]
T.apply(new_copy, H, new_copy.traits[trait])
//Set up a mob
H.species = new_copy
H.icon_state = new_copy.get_bodytype()
if(new_copy.holder_type)
H.holder_type = new_copy.holder_type
if(H.dna && reset_dna)
H.dna.ready_dna(H)
handle_base_eyes(H, custom_base)
if(H.species.has_vibration_sense)
H.motiontracker_subscribe()
return new_copy
//We REALLY don't need to go through every variable. Doing so makes this lag like hell on 515
/datum/species/proc/copy_variables(var/datum/species/S, var/list/whitelist)
//List of variables to ignore, trying to copy type will runtime.
//var/list/blacklist = list("type", "loc", "client", "ckey")
//Makes thorough copy of species datum.
for(var/i in whitelist)
if(!(i in S.vars)) //Don't copy incompatible vars.
continue
if(S.vars[i] != vars[i] && !islist(vars[i])) //If vars are same, no point in copying.
S.vars[i] = vars[i]
/datum/species/get_bodytype()
return base_species
/datum/species/proc/update_vore_belly_def_variant()
// Determine the actual vore_belly_default_variant, if the base species in the VORE tab is set
switch (base_species)
if("Teshari")
vore_belly_default_variant = "T"
if("Unathi")
vore_belly_default_variant = "L"
@@ -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)
@@ -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)
@@ -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()
@@ -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()
File diff suppressed because it is too large Load Diff
@@ -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("<p>" + span_huge("[H.name]'s motionless form shudders grotesquely, rippling unnaturally.") + "</p>"))
//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)
)
@@ -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.<br><br>\
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."
wikilink="https://wiki.vore-station.net/Unathi"
/datum/species/tajaran
spawn_flags = SPECIES_CAN_JOIN
icobase = 'icons/mob/human_races/r_tajaran_vr.dmi'
deform = 'icons/mob/human_races/r_def_tajaran_vr.dmi'
tail_animation = 'icons/mob/species/tajaran/tail_vr.dmi'
color_mult = 1
min_age = 18
inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair)
allergens = null
gluttonous = 0 //Moving this here so I don't have to fix this conflict every time polaris glances at station.dm
inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds)
heat_discomfort_level = 295 //Prevents heat discomfort spam at 20c
genders = list(MALE, FEMALE, PLURAL, NEUTER)
wikilink="https://wiki.vore-station.net/Tajaran"
agility = 90
can_climb = TRUE
climbing_delay = 1.00 //Cats are good climbers.
/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
spawn_flags = SPECIES_CAN_JOIN
min_age = 18
inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) //I don't even know if Zaddat can HAVE hair, but here we are, I suppose
gluttonous = 0
genders = list(MALE, FEMALE, PLURAL, NEUTER)
descriptors = list()
// no wiki link exists for Zaddat yet
/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/diona
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
min_age = 18
genders = list(MALE, FEMALE, PLURAL, NEUTER)
wikilink="https://wiki.vore-station.net/Diona"
/datum/species/human
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.<br/><br/> \
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."
color_mult = 1
icobase = 'icons/mob/human_races/r_human_vr.dmi'
deform = 'icons/mob/human_races/r_def_human_vr.dmi'
appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR
min_age = 18
genders = list(MALE, FEMALE, PLURAL, NEUTER)
base_color = "#EECEB3"
wikilink="https://wiki.vore-station.net/Human"
/datum/species/human/vatgrown
spawn_flags = SPECIES_IS_RESTRICTED
/datum/species/vox
gluttonous = 0
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
min_age = 18
inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) //Get ya quills done did
icobase = 'icons/mob/human_races/r_vox_old.dmi'
tail = "voxtail"
tail_animation = 'icons/mob/species/vox/tail.dmi'
deform = 'icons/mob/human_races/r_def_vox_old.dmi'
color_mult = 1
descriptors = list(
/datum/mob_descriptor/vox_markings = 0
)
wikilink="https://wiki.vore-station.net/Vox"
/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/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)
)
@@ -1,220 +0,0 @@
/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."
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 = 12
max_age = 45
economic_modifier = 6
health_hud_intensity = 3
male_cough_sounds = list('sound/effects/mob_effects/tesharicougha.ogg','sound/effects/mob_effects/tesharicoughb.ogg')
female_cough_sounds = list('sound/effects/mob_effects/tesharicougha.ogg','sound/effects/mob_effects/tesharicoughb.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"
tail = "seromitail"
//tail_hair = "feathers" //VORESTATION TESHARI TEMPORARY REMOVAL
reagent_tag = IS_TESHARI
move_trail = /obj/effect/decal/cleanable/blood/tracks/paw
icobase = 'icons/mob/human_races/r_teshari.dmi'
deform = 'icons/mob/human_races/r_teshari.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'
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_SMALL
pass_flags = PASSTABLE
holder_type = /obj/item/holder/human
// short_sighted = 1
has_vibration_sense = TRUE
gluttonous = 1
blood_volume = 400
hunger_factor = 0.2
soft_landing = TRUE
ambiguous_genders = TRUE
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED
appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_EYE_COLOR
bump_flag = MONKEY
swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL
push_flags = MONKEY|SLIME|SIMPLE_ANIMAL|ALIEN
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
)
descriptors = list(
/datum/mob_descriptor/height = -3,
/datum/mob_descriptor/build = -3
)
/* var/static/list/flight_bodyparts = list(
BP_L_ARM,
BP_R_ARM,
BP_L_HAND,
BP_R_HAND
)
var/static/list/flight_suit_blacklisted_types = list(
/obj/item/clothing/suit/space,
/obj/item/clothing/suit/straight_jacket
)*/
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
*/
@@ -1,26 +0,0 @@
/datum/species/teshari
mob_size = MOB_MEDIUM //To allow normal mob swapping
spawn_flags = SPECIES_CAN_JOIN
icobase = 'icons/mob/human_races/r_teshari_vr.dmi'
deform = 'icons/mob/human_races/r_teshari_vr.dmi'
icobase_tail = 1
color_mult = 1
min_age = 18
push_flags = ~HEAVY //Allows them to use micro step code.
swap_flags = ~HEAVY
gluttonous = 0
genders = list(MALE, FEMALE, PLURAL, NEUTER)
descriptors = list()
wikilink="https://wiki.vore-station.net/Teshari"
agility = 90
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')
vore_belly_default_variant = "T" //Teshari belly sprite
inherent_verbs = list(
///mob/living/carbon/human/proc/sonar_ping,
/mob/living/proc/hide,
/mob/living/proc/toggle_pass_table
)
@@ -1,8 +0,0 @@
/obj/screen/xenochimera
icon = 'icons/mob/chimerahud.dmi'
invisibility = 101
/obj/screen/xenochimera/danger_level
name = "danger level"
icon_state = "danger00" //first number is bool of whether or not we're in danger, second is whether or not we're feral
alpha = 200
@@ -1,138 +0,0 @@
/*
** For now, these are just neutral traits for Xenochimera only to take.
** Traits defined as custom_only = FALSE in neutral.dm will be available for Xenochimera to take as well.
** As such, be careful not to duplicate the traits, and only add dupes where necessary.
** IE: Heat/Cold Adapt and autohisses are added to Xenochimera because they reasonably could have evolved it, along with custom species.
** However, if custom_only = FALSE is set, then any species including things like humans can take it. A little silly.
** Therefore, use this file only for Xenochimera traits that you want to keep custom + Xenochim only.
*/
/datum/trait/positive/weaver/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Weaver"
desc = "You've evolved your body to produce silk that you can fashion into articles of clothing and other objects."
cost = 0
category = 0
custom_only = FALSE
/datum/trait/positive/hardfeet/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Hard Feet"
desc = "Your body has adapted to make your feet immune to glass shards, whether by developing hooves, chitin, or just horrible callous."
cost = 0
category = 0
custom_only = FALSE
// Why put this on Xenochimera of all species? I have no idea, but someone may be enough of a lunatic to take it.
/datum/trait/negative/neural_hypersensitivity/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Neural Hypersensitivity"
desc = "Despite your evolutionary efforts, you are unusually sensitive to pain. \
Given your species' typical reactions to pain, this can only end well for you!"
cost = 0
category = 0
custom_only = FALSE
/datum/trait/positive/melee_attack_fangs/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Sharp Melee & Numbing Fangs"
desc = "Your hunting instincts manifest in earnest! You have grown numbing fangs alongside your naturally grown hunting weapons."
cost = 0
category = 0
custom_only = FALSE
var_changes = list("unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/chimera, /datum/unarmed_attack/bite/sharp, /datum/unarmed_attack/bite/sharp/numbing)) // Fixes the parent forgetting to add 'chimera-specific claws
/datum/trait/positive/snowwalker/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Snow Walker"
desc = "You've adapted to traversing snowy terrain. Snow does not slow you down!"
cost = 0
category = 0
custom_only = FALSE
/datum/trait/positive/aquatic/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Aquatic"
desc = "You can breathe under water and can traverse water more efficiently. Additionally, you can eat others in the water."
cost = 0
category = 0
excludes = list(/datum/trait/positive/winged_flight/xenochimera)
custom_only = FALSE
/datum/trait/positive/winged_flight/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochhimera: Winged Flight"
desc = "Allows you to fly by using your wings. Don't forget to bring them!"
cost = 0
excludes = list(/datum/trait/positive/aquatic/xenochimera)
custom_only = FALSE
/* // Commented out in lieu of finding a better solution.
/datum/trait/neutral/coldadapt/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Temp. Adapted, Cold"
desc = "You have adapted to withstand much colder temperatures than other species, and can even be comfortable in extremely cold environments. You are also more vulnerable to hot environments, and have a lower body temperature as a consequence of these adaptations, thanks to your evolutionary efforts."
cost = 0
category = 0
can_take = ORGANICS // (Not sure if this is needed for Xenochimera-specific sub-version.)
custom_only = FALSE
excludes = list(/datum/trait/neutral/hotadapt, /datum/trait/neutral/hotadapt/xenochimera)
/datum/trait/neutral/hotadapt/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Temp. Adapted, Heat"
desc = "You have adapted to withstand much hotter temperatures than other species, and can even be comfortable in extremely hot environments. You are also more vulnerable to cold environments, and have a higher body temperature as a consequence of these adaptations, thanks to your evolutionary efforts."
cost = 0
category = 0
can_take = ORGANICS // negates the need for suit coolers entirely for synths, so no. (Not sure if this is needed for Xenochimera-specific sub-version.)
custom_only = FALSE
excludes = list(/datum/trait/neutral/coldadapt, /datum/trait/neutral/coldadapt/xenochimera)
*/
/datum/trait/neutral/autohiss_unathi/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Autohiss (Unathi)"
desc = "You roll your S's and x's"
cost = 0
custom_only = FALSE
var_changes = list(
autohiss_basic_map = list(
"s" = list("ss", "sss", "ssss")
),
autohiss_extra_map = list(
"x" = list("ks", "kss", "ksss")
),
autohiss_exempt = list("Sinta'unathi"))
excludes = list(/datum/trait/neutral/autohiss_tajaran)
/datum/trait/neutral/autohiss_tajaran/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
name = "Xenochimera: Autohiss (Tajaran)"
desc = "You roll your R's."
cost = 0
custom_only = FALSE
var_changes = list(
autohiss_basic_map = list(
"r" = list("rr", "rrr", "rrrr")
),
autohiss_exempt = list("Siik"))
excludes = list(/datum/trait/neutral/autohiss_unathi)
/datum/trait/positive/cocoon_tf/xenochimera
sort = TRAIT_SORT_SPECIES
allowed_species = list(SPECIES_XENOCHIMERA)
custom_only = FALSE
name = "Xenochimera: Cocoon Spinner"
desc = "Allows you to build a cocoon around yourself, using it to transform your body if you desire."
cost = 0
category = 0
@@ -4,3 +4,9 @@
icon_state = "ai"
anchored = TRUE // -- TLE
canmove = 0
/mob/living/silicon/decoy/New()
src.icon = 'icons/mob/AI.dmi'
src.icon_state = "ai"
src.anchored = TRUE
src.canmove = 0