diff --git a/code/modules/emotes/definitions/_species.dm b/code/modules/emotes/definitions/_species.dm index 3fb1ccd65d..a661bf527a 100644 --- a/code/modules/emotes/definitions/_species.dm +++ b/code/modules/emotes/definitions/_species.dm @@ -1,6 +1,3 @@ -/datum/species - var/list/default_emotes = list() - /mob/living/carbon/get_available_emotes() . = ..() if(length(species?.default_emotes)) diff --git a/code/modules/mob/living/carbon/human/species/outsider/vox.dm b/code/modules/mob/living/carbon/human/species/outsider/vox.dm index e7c4744b63..b0c634a853 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/vox.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/vox.dm @@ -1,9 +1,12 @@ /datum/species/vox name = SPECIES_VOX name_plural = "Vox" - icobase = 'icons/mob/human_races/r_vox.dmi' - deform = 'icons/mob/human_races/r_def_vox.dmi' - default_language = LANGUAGE_VOX + icobase = 'icons/mob/human_races/r_vox_old.dmi' + deform = 'icons/mob/human_races/r_def_vox_old.dmi' + tail = "voxtail" + tail_animation = 'icons/mob/species/vox/tail.dmi' + default_language = LANGUAGE_GALCOM + secondary_langs = list(LANGUAGE_VOX) language = LANGUAGE_GALCOM species_language = LANGUAGE_VOX num_alternate_languages = 3 @@ -16,13 +19,15 @@ refer to them as 'shitbirds' for their violent and offensive nature, as well as their horrible \ smell.

Most humans will never meet a Vox raider, instead learning of this insular species through \ dealing with their traders and merchants; those that do rarely enjoy the experience." + wikilink="https://wiki.vore-station.net/Vox" catalogue_data = list(/datum/category_item/catalogue/fauna/vox) // taste_sensitivity = TASTE_DULL + min_age = 18 slowdown = -0.5 - speech_sounds = list('sound/voice/shriek1.ogg') + speech_sounds = list() speech_chance = 20 scream_verb_1p = "shriek" @@ -41,19 +46,18 @@ cold_level_2 = 50 cold_level_3 = 0 - gluttonous = 1 - breath_type = GAS_PHORON poison_type = GAS_O2 ideal_air_type = /datum/gas_mixture/belly_air/vox siemens_coefficient = 0.2 flags = NO_DNA | NO_SLEEVE | NO_DEFIB - spawn_flags = SPECIES_IS_WHITELISTED + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE appearance_flags = HAS_EYE_COLOR | HAS_HAIR_COLOR | HAS_SKIN_COLOR blood_color = "#9066BD" flesh_color = "#808D11" + color_mult = 1 reagent_tag = IS_VOX @@ -84,15 +88,10 @@ genders = list(NEUTER) - descriptors = list( - /datum/mob_descriptor/height = -1, - /datum/mob_descriptor/build = 1, - /datum/mob_descriptor/vox_markings = 0 - ) - default_emotes = list( /decl/emote/audible/vox_shriek ) + inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) //Get ya quills done did /datum/species/vox/get_random_name(var/gender) var/datum/language/species_language = GLOB.all_languages[default_language] diff --git a/code/modules/mob/living/carbon/human/species/outsider/vox_vr.dm b/code/modules/mob/living/carbon/human/species/outsider/vox_vr.dm deleted file mode 100644 index b7e39f4863..0000000000 --- a/code/modules/mob/living/carbon/human/species/outsider/vox_vr.dm +++ /dev/null @@ -1,4 +0,0 @@ -/datum/species/vox - default_language = LANGUAGE_GALCOM - secondary_langs = list(LANGUAGE_VOX) - speech_sounds = list() // Remove obnoxious noises on every single 'say'. Should really only be a thing for event-exclusive species like benos. diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 8b64cc8b08..b3d1d58a88 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -58,7 +58,7 @@ var/allergen_damage_severity = 2.5 // How bad are reactions to the allergen? Touch with extreme caution. var/allergen_disable_severity = 10 // Whilst this determines how long nonlethal effects last and how common emotes are. - var/min_age = 17 + var/min_age = 18 var/max_age = 70 var/icodigi = 'icons/mob/human_races/r_digi.dmi' @@ -225,7 +225,7 @@ var/item_slowdown_mod = 1 // How affected by item slowdown the species is. var/primitive_form // Lesser form, if any (ie. monkey for humans) var/greater_form // Greater form, if any, ie. human for monkeys. - var/holder_type + var/holder_type = /obj/item/holder/micro //This allows you to pick up crew var/gluttonous // Can eat some mobs. 1 for mice, 2 for monkeys, 3 for people. var/soft_landing = FALSE // Can fall down and land safely on small falls. @@ -250,6 +250,8 @@ var/vore_belly_default_variant = "H" + var/list/default_emotes = list() + // Determines the organs that the species spawns with and var/list/has_organ = list( // which required-organ checks are conducted. O_HEART = /obj/item/organ/internal/heart, @@ -290,10 +292,7 @@ var/pass_flags = 0 - var/list/descriptors = list( - /datum/mob_descriptor/height, - /datum/mob_descriptor/build - ) + var/list/descriptors = list() //This is used in character setup preview generation (prefences_setup.dm) and human mob //rendering (update_icons.dm) @@ -314,6 +313,53 @@ var/gun_accuracy_dispersion_mod = 0 // More is worse var/sort_hint = SPECIES_SORT_NORMAL + //This is so that if a race is using the chimera revive they can't use it more than once. + //Shouldn't really be seen in play too often, but it's case an admin event happens and they give a non chimera the chimera revive. Only one person can use the chimera revive at a time per race. + //var/reviving = 0 //commented out 'cause moved to mob + + var/organic_food_coeff = 1 + var/synthetic_food_coeff = 0 + var/robo_ethanol_proc = 0 //can we get fuel from booze, as a synth? + var/robo_ethanol_drunk = 0 //can we get *drunk* from booze, as a synth? + var/digestion_efficiency = 1 //VORE specific digestion var + //var/vore_numbing = 0 + var/metabolism = 0.0015 + var/lightweight = FALSE //Oof! Nonhelpful bump stumbles. + var/trashcan = FALSE //It's always sunny in the wrestling ring. + var/eat_minerals = FALSE //HEAVY METAL DIET + var/base_species = null // Unused outside of a few species + var/selects_bodytype = SELECTS_BODYTYPE_FALSE // Allows the species to choose from body types like custom species can, affecting suit fitting and etcetera as you would expect. + + var/bloodsucker = FALSE // Allows safely getting nutrition from blood. + var/bloodsucker_controlmode = "always loud" //Allows selecting between bloodsucker control modes. Always Loud corresponds to original implementation. + + var/is_weaver = FALSE + var/silk_production = FALSE + var/silk_reserve = 100 + var/silk_max_reserve = 500 + var/silk_color = "#FFFFFF" + + var/list/traits = list() + //Vars that need to be copied when producing a copy of species. + var/list/copy_vars = list("base_species", "icobase", "deform", "tail", "tail_animation", "icobase_tail", "color_mult", "primitive_form", "appearance_flags", "flesh_color", "base_color", "blood_mask", "damage_mask", "damage_overlays", "move_trail", "has_floating_eyes") + var/trait_points = 0 + + var/ideal_air_type = null // Set to something else if you breathe something else from default composition. Used for inbelly air. + + var/micro_size_mod = 0 // How different is our size for interactions that involve us being small? + var/macro_size_mod = 0 // How different is our size for interactions that involve us being big? + var/digestion_nutrition_modifier = 1 + var/center_offset = 0.5 + var/can_climb = FALSE + var/climbing_delay = 1.5 // We climb with a quarter delay + + var/list/food_preference = list() //RS edit + var/food_preference_bonus = 0 + + + // For Lleill and Hanner + var/lleill_energy = 200 + var/lleill_energy_max = 200 /datum/species/proc/update_attack_types() unarmed_attacks = list() @@ -665,3 +711,85 @@ if(!QDELETED(baseHead) && baseHead) qdel(baseHead) return + +/datum/species/proc/give_numbing_bite() //Holy SHIT this is hacky, but it works. Updating a mob's attacks mid game is insane. + unarmed_attacks = list() + unarmed_types += /datum/unarmed_attack/bite/sharp/numbing + for(var/u_type in unarmed_types) + unarmed_attacks += new u_type() + +/datum/species/create_organs(var/mob/living/carbon/human/H) + if(H.nif) + /*var/type = H.nif.type + var/durability = H.nif.durability + var/list/nifsofts = H.nif.nifsofts + var/list/nif_savedata = H.nif.save_data.Copy()*/ + ..() + H.nif = null //A previous call during the rejuvenation path deleted it, so we no longer should have it here + /*var/obj/item/nif/nif = new type(H,durability,nif_savedata) + nif.nifsofts = nifsofts*/ + else + ..() + +/datum/species/proc/produceCopy(var/list/traits, var/mob/living/carbon/human/H, var/custom_base, var/reset_dna = TRUE) // Traitgenes reset_dna flag required, or genes get reset on resleeve + ASSERT(src) + ASSERT(istype(H)) + var/datum/species/new_copy = new src.type() + new_copy.race_key = race_key + if (selects_bodytype && custom_base) + new_copy.base_species = custom_base + if(selects_bodytype == SELECTS_BODYTYPE_CUSTOM) //If race selects a bodytype, retrieve the custom_base species and copy needed variables. + var/datum/species/S = GLOB.all_species[custom_base] + S.copy_variables(new_copy, copy_vars) + + if(selects_bodytype == SELECTS_BODYTYPE_SHAPESHIFTER) + H.shapeshifter_change_shape(custom_base, FALSE) + + for(var/organ in has_limbs) //Copy important organ data generated by species. + var/list/organ_data = has_limbs[organ] + new_copy.has_limbs[organ] = organ_data.Copy() + + new_copy.traits = traits + //If you had traits, apply them + if(new_copy.traits) + for(var/trait in new_copy.traits) + var/datum/trait/T = all_traits[trait] + T.apply(new_copy, H, new_copy.traits[trait]) + + //Set up a mob + H.species = new_copy + H.icon_state = new_copy.get_bodytype() + + if(new_copy.holder_type) + H.holder_type = new_copy.holder_type + + if(H.dna && reset_dna) + H.dna.ready_dna(H) + handle_base_eyes(H, custom_base) + + if(H.species.has_vibration_sense) + H.motiontracker_subscribe() + + return new_copy + +//We REALLY don't need to go through every variable. Doing so makes this lag like hell on 515 +/datum/species/proc/copy_variables(var/datum/species/S, var/list/whitelist) + //List of variables to ignore, trying to copy type will runtime. + //var/list/blacklist = list("type", "loc", "client", "ckey") + //Makes thorough copy of species datum. + for(var/i in whitelist) + if(!(i in S.vars)) //Don't copy incompatible vars. + continue + if(S.vars[i] != vars[i] && !islist(vars[i])) //If vars are same, no point in copying. + S.vars[i] = vars[i] + +/datum/species/get_bodytype() + return base_species + +/datum/species/proc/update_vore_belly_def_variant() + // Determine the actual vore_belly_default_variant, if the base species in the VORE tab is set + switch (base_species) + if("Teshari") + vore_belly_default_variant = "T" + if("Unathi") + vore_belly_default_variant = "L" diff --git a/code/modules/mob/living/carbon/human/species/species_attack.dm b/code/modules/mob/living/carbon/human/species/species_attack.dm index e42e14a142..1ad8a7bfaf 100644 --- a/code/modules/mob/living/carbon/human/species/species_attack.dm +++ b/code/modules/mob/living/carbon/human/species/species_attack.dm @@ -99,3 +99,82 @@ var/obj/item/organ/external/affecting = target.get_organ(zone) user.visible_message(span_warning("[user] jumped up and down on \the [target]'s [affecting.name]!")) playsound(user, attack_sound, 25, 1, -1) + +/datum/unarmed_attack/bite/sharp/numbing //Is using this against someone you are truly trying to fight a bad idea? Yes. Yes it is. + attack_name = "numbing bite" + attack_verb = list("bit") + attack_noun = list("fangs") + attack_sound = 'sound/weapons/bite.ogg' + shredding = 0 + sharp = TRUE + edge = TRUE + +/datum/unarmed_attack/bite/sharp/numbing/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) + var/obj/item/organ/external/affecting = target.get_organ(zone) + + attack_damage = CLAMP(attack_damage, 1, 5) + if(target == user) + user.visible_message(span_danger("[user] [pick(attack_verb)] \himself in the [affecting.name]!")) + return 0 //No venom for you. + switch(zone) + if(BP_HEAD, O_MOUTH, O_EYES) + // ----- HEAD ----- // + switch(attack_damage) + if(1 to 2) + user.visible_message(span_danger("[user]'s fangs scrape across [target]'s cheek!")) + to_chat(target, span_danger("Your face feels tingly!")) + target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage) //Have to add this here, otherwise the swtich fails. + if(3 to 4) + user.visible_message(span_danger("[user]'s fangs pierce into [target]'s neck at an odd, awkward angle!")) + to_chat(target, span_danger("Your neck feels like it's on fire before going numb!")) + target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage) + if(5) + user.visible_message(span_danger("[user] sinks \his [pick(attack_noun)] deep into [target]'s neck, causing the vein to bulge outwards at some type of chemical is pumped into it!")) + to_chat(target, span_danger("Your neck feels like it's going to burst! Moments later, you simply can't feel your neck any longer, the numbness beginning to spread throughout your body!")) + target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage) + else + // ----- BODY ----- // + switch(attack_damage) + if(1 to 2) + user.visible_message(span_danger("[user]'s fangs scrape across [target]'s [affecting.name]!")) + to_chat(target, span_danger("Your [affecting.name] feels tingly!")) + target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage) + if(3 to 4) + user.visible_message(span_danger("[user]'s fangs pierce [pick("", "", "the side of")] [target]'s [affecting.name]!")) + to_chat(target, span_danger("Your [affecting.name] feels like it's on fire before going numb!")) + target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage) + if(5) + user.visible_message(span_danger("[user]'s fangs sink deep into [target]'s [affecting.name], one of their veins bulging outwards from the sudden fluid pumped into it!")) + to_chat(target, span_danger("Your [affecting.name] feels like it's going to burst! Moments later, you simply can't feel your [affecting.name] any longer, the numbness slowly spreading throughout your body!")) + target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage) + +/datum/unarmed_attack/claws/shadekin + +/datum/unarmed_attack/claws/shadekin/apply_effects(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) + ..() + if(!(target == user)) + user.shadekin_adjust_energy(attack_damage) + +/datum/unarmed_attack/bite/sharp/shadekin + +/datum/unarmed_attack/bite/sharp/shadekin/apply_effects(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) + ..() + if(!(target == user)) + user.shadekin_adjust_energy(attack_damage) + +/datum/unarmed_attack/claws/chimera //special feral attack that gets stronger as they get angrier + +/datum/unarmed_attack/claws/chimera/get_unarmed_damage(var/mob/living/carbon/human/user) + return user.feral/5 + +/datum/unarmed_attack/claws/chimera/apply_effects(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/armour,var/attack_damage,var/zone) + ..() + if(user.feral && !(target == user)) + var/selfdamage = ((user.feral/10)-7.5) + if(selfdamage > 0) + var/selfdamagezone = null + if (user.hand) + selfdamagezone=pick(BP_L_ARM, BP_L_HAND) + else + selfdamagezone=pick(BP_R_ARM, BP_R_HAND) + user.apply_damage(selfdamage, BRUTE, selfdamagezone, 0, 0, sharp=FALSE, edge=FALSE) diff --git a/code/modules/mob/living/carbon/human/species/species_attack_vr.dm b/code/modules/mob/living/carbon/human/species/species_attack_vr.dm deleted file mode 100644 index 3608b719ca..0000000000 --- a/code/modules/mob/living/carbon/human/species/species_attack_vr.dm +++ /dev/null @@ -1,78 +0,0 @@ -/datum/unarmed_attack/bite/sharp/numbing //Is using this against someone you are truly trying to fight a bad idea? Yes. Yes it is. - attack_name = "numbing bite" - attack_verb = list("bit") - attack_noun = list("fangs") - attack_sound = 'sound/weapons/bite.ogg' - shredding = 0 - sharp = TRUE - edge = TRUE - -/datum/unarmed_attack/bite/sharp/numbing/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) - var/obj/item/organ/external/affecting = target.get_organ(zone) - - attack_damage = CLAMP(attack_damage, 1, 5) - if(target == user) - user.visible_message(span_danger("[user] [pick(attack_verb)] \himself in the [affecting.name]!")) - return 0 //No venom for you. - switch(zone) - if(BP_HEAD, O_MOUTH, O_EYES) - // ----- HEAD ----- // - switch(attack_damage) - if(1 to 2) - user.visible_message(span_danger("[user]'s fangs scrape across [target]'s cheek!")) - to_chat(target, span_danger("Your face feels tingly!")) - target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage) //Have to add this here, otherwise the swtich fails. - if(3 to 4) - user.visible_message(span_danger("[user]'s fangs pierce into [target]'s neck at an odd, awkward angle!")) - to_chat(target, span_danger("Your neck feels like it's on fire before going numb!")) - target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage) - if(5) - user.visible_message(span_danger("[user] sinks \his [pick(attack_noun)] deep into [target]'s neck, causing the vein to bulge outwards at some type of chemical is pumped into it!")) - to_chat(target, span_danger("Your neck feels like it's going to burst! Moments later, you simply can't feel your neck any longer, the numbness beginning to spread throughout your body!")) - target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage) - else - // ----- BODY ----- // - switch(attack_damage) - if(1 to 2) - user.visible_message(span_danger("[user]'s fangs scrape across [target]'s [affecting.name]!")) - to_chat(target, span_danger("Your [affecting.name] feels tingly!")) - target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage) - if(3 to 4) - user.visible_message(span_danger("[user]'s fangs pierce [pick("", "", "the side of")] [target]'s [affecting.name]!")) - to_chat(target, span_danger("Your [affecting.name] feels like it's on fire before going numb!")) - target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage) - if(5) - user.visible_message(span_danger("[user]'s fangs sink deep into [target]'s [affecting.name], one of their veins bulging outwards from the sudden fluid pumped into it!")) - to_chat(target, span_danger("Your [affecting.name] feels like it's going to burst! Moments later, you simply can't feel your [affecting.name] any longer, the numbness slowly spreading throughout your body!")) - target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage) - -/datum/unarmed_attack/claws/shadekin - -/datum/unarmed_attack/claws/shadekin/apply_effects(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) - ..() - if(!(target == user)) - user.shadekin_adjust_energy(attack_damage) - -/datum/unarmed_attack/bite/sharp/shadekin - -/datum/unarmed_attack/bite/sharp/shadekin/apply_effects(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) - ..() - if(!(target == user)) - user.shadekin_adjust_energy(attack_damage) - -/datum/unarmed_attack/claws/chimera //special feral attack that gets stronger as they get angrier - -/datum/unarmed_attack/claws/chimera/get_unarmed_damage(var/mob/living/carbon/human/user) - return user.feral/5 - -/datum/unarmed_attack/claws/chimera/apply_effects(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/armour,var/attack_damage,var/zone) - ..() - if(user.feral && !(target == user)) - var/selfdamage = ((user.feral/10)-7.5) - if(selfdamage > 0) - var/selfdamagezone = null - if (user.hand) - selfdamagezone=pick(BP_L_ARM, BP_L_HAND) - else - selfdamagezone=pick(BP_R_ARM, BP_R_HAND) - user.apply_damage(selfdamage, BRUTE, selfdamagezone, 0, 0, sharp=FALSE, edge=FALSE) diff --git a/code/modules/mob/living/carbon/human/species/species_getters.dm b/code/modules/mob/living/carbon/human/species/species_getters.dm index 298179fa5a..a1ccf8206e 100644 --- a/code/modules/mob/living/carbon/human/species/species_getters.dm +++ b/code/modules/mob/living/carbon/human/species/species_getters.dm @@ -125,3 +125,16 @@ /datum/species/proc/get_vision_flags(var/mob/living/carbon/human/H) return vision_flags + +/datum/species/proc/get_wing_hair(var/mob/living/carbon/human/H) //I have no idea what this is even used for other than teshari, but putting it in just in case. + return wing_hair //Since the tail has it. +/datum/species/proc/get_wing(var/mob/living/carbon/human/H) + return wing +/datum/species/proc/get_wing_animation(var/mob/living/carbon/human/H) + return wing_animation + +/datum/species/proc/get_perfect_belly_air_type(var/mob/living/carbon/human/H) + if(ideal_air_type) + return ideal_air_type //Whatever we want + else + return /datum/gas_mixture/belly_air //Default diff --git a/code/modules/mob/living/carbon/human/species/species_getters_vr.dm b/code/modules/mob/living/carbon/human/species/species_getters_vr.dm deleted file mode 100644 index e57e6a2fe3..0000000000 --- a/code/modules/mob/living/carbon/human/species/species_getters_vr.dm +++ /dev/null @@ -1,13 +0,0 @@ - -/datum/species/proc/get_wing_hair(var/mob/living/carbon/human/H) //I have no idea what this is even used for other than teshari, but putting it in just in case. - return wing_hair //Since the tail has it. -/datum/species/proc/get_wing(var/mob/living/carbon/human/H) - return wing -/datum/species/proc/get_wing_animation(var/mob/living/carbon/human/H) - return wing_animation - -/datum/species/proc/get_perfect_belly_air_type(var/mob/living/carbon/human/H) - if(ideal_air_type) - return ideal_air_type //Whatever we want - else - return /datum/gas_mixture/belly_air //Default diff --git a/code/modules/mob/living/carbon/human/species/species_shapeshift.dm b/code/modules/mob/living/carbon/human/species/species_shapeshift.dm index bf80064540..544018818e 100644 --- a/code/modules/mob/living/carbon/human/species/species_shapeshift.dm +++ b/code/modules/mob/living/carbon/human/species/species_shapeshift.dm @@ -14,6 +14,9 @@ var/list/wrapped_species_by_ref = list() var/list/valid_transform_species = list() //var/default_form = SPECIES_HUMAN //VOREStation edit + base_species = SPECIES_HUMAN + selects_bodytype = SELECTS_BODYTYPE_SHAPESHIFTER + /datum/species/shapeshifter/get_valid_shapeshifter_forms(var/mob/living/carbon/human/H) return list(vanity_base_fit)|valid_transform_species @@ -321,3 +324,339 @@ var/list/wrapped_species_by_ref = list() update_icons_body() update_eyes() + +/mob/living/carbon/human/proc/shapeshifter_select_ears() + set name = "Select Ears" + set category = "Abilities.Shapeshift" + + if(stat || world.time < last_special) + return + + last_special = world.time + 10 + // Construct the list of names allowed for this user. + var/list/pretty_ear_styles = list("Normal" = null) + for(var/path in ear_styles_list) + var/datum/sprite_accessory/ears/instance = ear_styles_list[path] + if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed)) + pretty_ear_styles[instance.name] = path + + // Present choice to user + var/new_ear_style = tgui_input_list(src, "Pick some ears!", "Character Preference", pretty_ear_styles) + if(!new_ear_style) + return + + //Set new style + ear_style = ear_styles_list[pretty_ear_styles[new_ear_style]] + + //Allow color picks + var/current_pri_color = rgb(r_ears,g_ears,b_ears) + + var/new_pri_color = tgui_color_picker(src, "Pick primary ear color:","Ear Color (Pri)", current_pri_color) + if(new_pri_color) + var/list/new_color_rgb_list = hex2rgb(new_pri_color) + r_ears = new_color_rgb_list[1] + g_ears = new_color_rgb_list[2] + b_ears = new_color_rgb_list[3] + + //Indented inside positive primary color choice, don't bother if they clicked cancel + var/current_sec_color = rgb(r_ears2,g_ears2,b_ears2) + + var/new_sec_color = tgui_color_picker(src, "Pick secondary ear color (only applies to some ears):","Ear Color (sec)", current_sec_color) + if(new_sec_color) + new_color_rgb_list = hex2rgb(new_sec_color) + r_ears2 = new_color_rgb_list[1] + g_ears2 = new_color_rgb_list[2] + b_ears2 = new_color_rgb_list[3] + + var/current_ter_color = rgb(r_ears3,g_ears3,b_ears3) + + var/new_ter_color = tgui_color_picker(src, "Pick tertiary ear color (only applies to some ears):","Ear Color (sec)", current_ter_color) + if(new_ter_color) + new_color_rgb_list = hex2rgb(new_sec_color) + r_ears3 = new_color_rgb_list[1] + g_ears3 = new_color_rgb_list[2] + b_ears3 = new_color_rgb_list[3] + + var/new_ear_alpha = tgui_input_number(src, "Set ear alpha (0-255):","Ear Alpha", a_ears,255,0) + if(new_ear_alpha) + a_ears = new_ear_alpha + + update_hair() //Includes Virgo ears + +/mob/living/carbon/human/proc/shapeshifter_select_secondary_ears() + set name = "Select Secondary Ears" + set category = "Abilities.Shapeshift" + + if(stat || world.time < last_special) + return + last_special = world.time + 1 SECONDS + + // Construct the list of names allowed for this user. + var/list/pretty_ear_styles = list("Normal" = null) + for(var/path in ear_styles_list) + var/datum/sprite_accessory/ears/instance = ear_styles_list[path] + if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed)) + pretty_ear_styles[instance.name] = path + + // Handle style pick + var/new_ear_style = tgui_input_list(src, "Pick some ears!", "Character Preference", pretty_ear_styles) + if(!new_ear_style) + return + ear_secondary_style = ear_styles_list[pretty_ear_styles[new_ear_style]] + + // Handle color picks + if(ear_secondary_style) + var/list/new_colors = list() + for(var/channel in 1 to ear_secondary_style.get_color_channel_count()) + var/channel_name = GLOB.fancy_sprite_accessory_color_channel_names[channel] + var/default = LAZYACCESS(ear_secondary_colors, channel) || "#ffffff" + var/new_color = tgui_color_picker(src, "Pick [channel_name]", "Ear Color ([channel_name])", default) + new_colors += new_color || default + + var/new_ear_alpha = tgui_input_number(src, "Set ear alpha (0-255):","Ear Alpha", a_ears2,255,0) + if(new_ear_alpha) + a_ears2 = new_ear_alpha + + update_hair() + +/mob/living/carbon/human/proc/shapeshifter_select_tail() + set name = "Select Tail" + set category = "Abilities.Shapeshift" + + if(stat || world.time < last_special) + return + + last_special = world.time + 10 + // Construct the list of names allowed for this user. + var/list/pretty_tail_styles = list("Normal" = null) + for(var/path in tail_styles_list) + var/datum/sprite_accessory/tail/instance = tail_styles_list[path] + if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed)) + pretty_tail_styles[instance.name] = path + + // Present choice to user + var/new_tail_style = tgui_input_list(src, "Pick a tail!", "Character Preference", pretty_tail_styles) + if(!new_tail_style) + return + + //Set new style + tail_style = tail_styles_list[pretty_tail_styles[new_tail_style]] + + //Allow color picks + var/current_pri_color = rgb(r_tail,g_tail,b_tail) + + var/new_pri_color = tgui_color_picker(src, "Pick primary tail color:","Tail Color (Pri)", current_pri_color) + if(new_pri_color) + var/list/new_color_rgb_list = hex2rgb(new_pri_color) + r_tail = new_color_rgb_list[1] + g_tail = new_color_rgb_list[2] + b_tail = new_color_rgb_list[3] + + //Indented inside positive primary color choice, don't bother if they clicked cancel + var/current_sec_color = rgb(r_tail2,g_tail2,b_tail2) + + var/new_sec_color = tgui_color_picker(src, "Pick secondary tail color (only applies to some tails):","Tail Color (sec)", current_sec_color) + if(new_sec_color) + new_color_rgb_list = hex2rgb(new_sec_color) + r_tail2 = new_color_rgb_list[1] + g_tail2 = new_color_rgb_list[2] + b_tail2 = new_color_rgb_list[3] + + var/current_ter_color = rgb(r_tail3,g_tail3,b_tail3) + + var/new_ter_color = tgui_color_picker(src, "Pick tertiary tail color (only applies to some tails):","Tail Color (sec)", current_ter_color) + if(new_ter_color) + new_color_rgb_list = hex2rgb(new_ter_color) + r_tail3 = new_color_rgb_list[1] + g_tail3 = new_color_rgb_list[2] + b_tail3 = new_color_rgb_list[3] + + var/new_tail_alpha = tgui_input_number(src, "Set tail alpha (0-255):","Tail Alpha", a_tail,255,0) + if(new_tail_alpha) + a_tail = new_tail_alpha + + update_tail_showing() + +/mob/living/carbon/human/proc/shapeshifter_select_wings() + set name = "Select Wings" + set category = "Abilities.Shapeshift" + + if(stat || world.time < last_special) + return + + last_special = world.time + 10 + // Construct the list of names allowed for this user. + var/list/pretty_wing_styles = list("None" = null) + for(var/path in wing_styles_list) + var/datum/sprite_accessory/wing/instance = wing_styles_list[path] + if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed)) + pretty_wing_styles[instance.name] = path + + // Present choice to user + var/new_wing_style = tgui_input_list(src, "Pick some wings!", "Character Preference", pretty_wing_styles) + if(!new_wing_style) + return + + //Set new style + wing_style = wing_styles_list[pretty_wing_styles[new_wing_style]] + + //Allow color picks + var/current_color = rgb(r_wing,g_wing,b_wing) + + var/new_color = tgui_color_picker(src, "Pick wing color:","Wing Color", current_color) + if(new_color) + var/list/new_color_rgb_list = hex2rgb(new_color) + r_wing = new_color_rgb_list[1] + g_wing = new_color_rgb_list[2] + b_wing = new_color_rgb_list[3] + + //Indented inside positive primary color choice, don't bother if they clicked cancel + var/current_sec_color = rgb(r_wing2,g_wing2,b_wing2) + + var/new_sec_color = tgui_color_picker(src, "Pick secondary wing color (only applies to some wings):","Wing Color (sec)", current_sec_color) + if(new_sec_color) + new_color_rgb_list = hex2rgb(new_sec_color) + r_wing2 = new_color_rgb_list[1] + g_wing2 = new_color_rgb_list[2] + b_wing2 = new_color_rgb_list[3] + + var/current_ter_color = rgb(r_wing3,g_wing3,b_wing3) + + var/new_ter_color = tgui_color_picker(src, "Pick tertiary wing color (only applies to some wings):","Wing Color (sec)", current_ter_color) + if(new_ter_color) + new_color_rgb_list = hex2rgb(new_ter_color) + r_wing3 = new_color_rgb_list[1] + g_wing3 = new_color_rgb_list[2] + b_wing3 = new_color_rgb_list[3] + + var/new_alpha = tgui_input_number(src, "Set wing alpha (0-255):","Wing Alpha", a_wing,255,0) + if(new_alpha) + a_wing = new_alpha + + update_wing_showing() + +/mob/living/carbon/human/proc/promethean_select_opaqueness() + + set name = "Toggle Transparency" + set category = "Abilities.Shapeshift" + + if(stat || world.time < last_special) + return + + last_special = world.time + 50 + + for(var/obj/item/organ/external/L as anything in src.organs) + L.transparent = !L.transparent + visible_message(span_notice("\The [src]'s internal composition seems to change.")) + update_icons_body() + update_hair() + +/mob/living/carbon/human/proc/shapeshifter_change_shape(var/new_species = null, var/visible = TRUE) //not sure if this needs to be moved to a separate file but + if(!new_species) + return + + dna.base_species = new_species + species.base_species = new_species + wrapped_species_by_ref["\ref[src]"] = new_species + if (visible) + visible_message(span_filter_notice(span_bold("\The [src]") + " shifts and contorts, taking the form of \a [new_species]!")) + regenerate_icons() + + +//////////////////// Shapeshifter copy-body powers +/// Copied from the protean version, but with some tweaks to match non-protean shapeshifters such as lleill, hanner and replicants + +/mob/living/carbon/human/proc/shapeshifter_regenerate() + set name = "Fully Reform" + set desc = "Reload your appearance from whatever character slot you have loaded." + set category = "Abilities.Shapeshift" + var/mob/living/character = src + if(temporary_form) + character = temporary_form + var/input = tgui_alert(character,{"Do you want to copy the appearance data of your currently loaded save slot?"},"Reformation",list("Reform","Cancel")) + if(input == "Cancel" || !input) + return + else + input = tgui_alert(character,{"Include Flavourtext?"},"Reformation",list("Yes","No","Cancel")) + if(input == "Cancel" || !input) + return + var/flavour = 0 + if(input == "Yes") + flavour = 1 + input = tgui_alert(character,{"Include OOC notes?"},"Reformation",list("Yes","No","Cancel")) + if(input == "Cancel" || !input) + return + var/oocnotes = 0 + if(input == "Yes") + oocnotes = 1 + to_chat(character, span_notify("You begin to reform. You will need to remain still.")) + character.visible_message(span_notify("[character] rapidly contorts and shifts!"), span_danger("You begin to reform.")) + if(do_after(character, 40,exclusive = TASK_ALL_EXCLUSIVE)) + if(character.client.prefs) //Make sure we didn't d/c + character.client.prefs.vanity_copy_to(src, FALSE, flavour, oocnotes, FALSE) + character.visible_message(span_notify("[character] adopts a new form!"), span_danger("You have reformed.")) + +/mob/living/carbon/human/proc/shapeshifter_copy_body() + set name = "Copy Form" + set desc = "If you are aggressively grabbing someone, with their consent, you can turn into a copy of them. (Without their name)." + set category = "Abilities.Shapeshift" + var/mob/living/character = src + if(temporary_form) + character = temporary_form + + var/grabbing_but_not_enough + var/mob/living/carbon/human/victim = null + for(var/obj/item/grab/G in character) + if(G.state < GRAB_AGGRESSIVE) + grabbing_but_not_enough = TRUE + return + else + victim = G.affecting + if (!victim) + if (grabbing_but_not_enough) + to_chat(character, span_warning("You need a better grip to do that!")) + else + to_chat(character, span_notice("You need to be aggressively grabbing someone before you can copy their form.")) + return + if (!ishuman(victim)) + to_chat(character, span_warning("You can only perform this on human mobs!")) + return + if (!victim.client) + to_chat(character, span_notice("The person you try this on must have a client!")) + return + + + to_chat(character, span_notice("Waiting for other person's consent.")) + var/consent = tgui_alert(victim, "Allow [src] to copy what you look like?", "Consent", list("Yes", "No")) + if (consent != "Yes") + to_chat(character, span_notice("They declined your request.")) + return + + var/input = tgui_alert(character,{"Copy [victim]'s flavourtext?"},"Copy Form",list("Yes","No","Cancel")) + if(input == "Cancel" || !input) + return + var/flavour = 0 + if(input == "Yes") + flavour = 1 + + var/checking = FALSE + for(var/obj/item/grab/G in character) + if(G.affecting == victim && G.state >= GRAB_AGGRESSIVE) + checking = TRUE + if (!checking) + to_chat(character, span_warning("You lost your grip on [victim]!")) + return + + to_chat(character, span_notify("You begin to reassemble into [victim]. You will need to remain still.")) + character.visible_message(span_notify("[character] rapidly contorts and shifts!"), span_danger("You begin to reassemble into [victim].")) + if(do_after(character, 40,exclusive = TASK_ALL_EXCLUSIVE)) + checking = FALSE + for(var/obj/item/grab/G in character) + if(G.affecting == victim && G.state >= GRAB_AGGRESSIVE) + checking = TRUE + if (!checking) + to_chat(character, span_warning("You lost your grip on [victim]!")) + return + if(character.client) //Make sure we didn't d/c + transform_into_other_human(victim, FALSE, flavour, FALSE) + character.visible_message(span_notify("[character] adopts the form of [victim]!"), span_danger("You have reassembled into [victim].")) diff --git a/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm b/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm deleted file mode 100644 index 453771e90e..0000000000 --- a/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm +++ /dev/null @@ -1,339 +0,0 @@ -/datum/species/shapeshifter - base_species = SPECIES_HUMAN - selects_bodytype = SELECTS_BODYTYPE_SHAPESHIFTER - -/mob/living/carbon/human/proc/shapeshifter_select_ears() - set name = "Select Ears" - set category = "Abilities.Shapeshift" - - if(stat || world.time < last_special) - return - - last_special = world.time + 10 - // Construct the list of names allowed for this user. - var/list/pretty_ear_styles = list("Normal" = null) - for(var/path in ear_styles_list) - var/datum/sprite_accessory/ears/instance = ear_styles_list[path] - if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed)) - pretty_ear_styles[instance.name] = path - - // Present choice to user - var/new_ear_style = tgui_input_list(src, "Pick some ears!", "Character Preference", pretty_ear_styles) - if(!new_ear_style) - return - - //Set new style - ear_style = ear_styles_list[pretty_ear_styles[new_ear_style]] - - //Allow color picks - var/current_pri_color = rgb(r_ears,g_ears,b_ears) - - var/new_pri_color = tgui_color_picker(src, "Pick primary ear color:","Ear Color (Pri)", current_pri_color) - if(new_pri_color) - var/list/new_color_rgb_list = hex2rgb(new_pri_color) - r_ears = new_color_rgb_list[1] - g_ears = new_color_rgb_list[2] - b_ears = new_color_rgb_list[3] - - //Indented inside positive primary color choice, don't bother if they clicked cancel - var/current_sec_color = rgb(r_ears2,g_ears2,b_ears2) - - var/new_sec_color = tgui_color_picker(src, "Pick secondary ear color (only applies to some ears):","Ear Color (sec)", current_sec_color) - if(new_sec_color) - new_color_rgb_list = hex2rgb(new_sec_color) - r_ears2 = new_color_rgb_list[1] - g_ears2 = new_color_rgb_list[2] - b_ears2 = new_color_rgb_list[3] - - var/current_ter_color = rgb(r_ears3,g_ears3,b_ears3) - - var/new_ter_color = tgui_color_picker(src, "Pick tertiary ear color (only applies to some ears):","Ear Color (sec)", current_ter_color) - if(new_ter_color) - new_color_rgb_list = hex2rgb(new_sec_color) - r_ears3 = new_color_rgb_list[1] - g_ears3 = new_color_rgb_list[2] - b_ears3 = new_color_rgb_list[3] - - var/new_ear_alpha = tgui_input_number(src, "Set ear alpha (0-255):","Ear Alpha", a_ears,255,0) - if(new_ear_alpha) - a_ears = new_ear_alpha - - update_hair() //Includes Virgo ears - -/mob/living/carbon/human/proc/shapeshifter_select_secondary_ears() - set name = "Select Secondary Ears" - set category = "Abilities.Shapeshift" - - if(stat || world.time < last_special) - return - last_special = world.time + 1 SECONDS - - // Construct the list of names allowed for this user. - var/list/pretty_ear_styles = list("Normal" = null) - for(var/path in ear_styles_list) - var/datum/sprite_accessory/ears/instance = ear_styles_list[path] - if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed)) - pretty_ear_styles[instance.name] = path - - // Handle style pick - var/new_ear_style = tgui_input_list(src, "Pick some ears!", "Character Preference", pretty_ear_styles) - if(!new_ear_style) - return - ear_secondary_style = ear_styles_list[pretty_ear_styles[new_ear_style]] - - // Handle color picks - if(ear_secondary_style) - var/list/new_colors = list() - for(var/channel in 1 to ear_secondary_style.get_color_channel_count()) - var/channel_name = GLOB.fancy_sprite_accessory_color_channel_names[channel] - var/default = LAZYACCESS(ear_secondary_colors, channel) || "#ffffff" - var/new_color = tgui_color_picker(src, "Pick [channel_name]", "Ear Color ([channel_name])", default) - new_colors += new_color || default - var/new_ear_alpha = tgui_input_number(src, "Set ear alpha (0-255):","Ear Alpha", a_ears2,255,0) - if(new_ear_alpha) - a_ears2 = new_ear_alpha - update_hair() - -/mob/living/carbon/human/proc/shapeshifter_select_tail() - set name = "Select Tail" - set category = "Abilities.Shapeshift" - - if(stat || world.time < last_special) - return - - last_special = world.time + 10 - // Construct the list of names allowed for this user. - var/list/pretty_tail_styles = list("Normal" = null) - for(var/path in tail_styles_list) - var/datum/sprite_accessory/tail/instance = tail_styles_list[path] - if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed)) - pretty_tail_styles[instance.name] = path - - // Present choice to user - var/new_tail_style = tgui_input_list(src, "Pick a tail!", "Character Preference", pretty_tail_styles) - if(!new_tail_style) - return - - //Set new style - tail_style = tail_styles_list[pretty_tail_styles[new_tail_style]] - - //Allow color picks - var/current_pri_color = rgb(r_tail,g_tail,b_tail) - - var/new_pri_color = tgui_color_picker(src, "Pick primary tail color:","Tail Color (Pri)", current_pri_color) - if(new_pri_color) - var/list/new_color_rgb_list = hex2rgb(new_pri_color) - r_tail = new_color_rgb_list[1] - g_tail = new_color_rgb_list[2] - b_tail = new_color_rgb_list[3] - - //Indented inside positive primary color choice, don't bother if they clicked cancel - var/current_sec_color = rgb(r_tail2,g_tail2,b_tail2) - - var/new_sec_color = tgui_color_picker(src, "Pick secondary tail color (only applies to some tails):","Tail Color (sec)", current_sec_color) - if(new_sec_color) - new_color_rgb_list = hex2rgb(new_sec_color) - r_tail2 = new_color_rgb_list[1] - g_tail2 = new_color_rgb_list[2] - b_tail2 = new_color_rgb_list[3] - - var/current_ter_color = rgb(r_tail3,g_tail3,b_tail3) - - var/new_ter_color = tgui_color_picker(src, "Pick tertiary tail color (only applies to some tails):","Tail Color (sec)", current_ter_color) - if(new_ter_color) - new_color_rgb_list = hex2rgb(new_ter_color) - r_tail3 = new_color_rgb_list[1] - g_tail3 = new_color_rgb_list[2] - b_tail3 = new_color_rgb_list[3] - - - var/new_tail_alpha = tgui_input_number(src, "Set tail alpha (0-255):","Tail Alpha", a_tail,255,0) - if(new_tail_alpha) - a_tail = new_tail_alpha - - update_tail_showing() - -/mob/living/carbon/human/proc/shapeshifter_select_wings() - set name = "Select Wings" - set category = "Abilities.Shapeshift" - - if(stat || world.time < last_special) - return - - last_special = world.time + 10 - // Construct the list of names allowed for this user. - var/list/pretty_wing_styles = list("None" = null) - for(var/path in wing_styles_list) - var/datum/sprite_accessory/wing/instance = wing_styles_list[path] - if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed)) - pretty_wing_styles[instance.name] = path - - // Present choice to user - var/new_wing_style = tgui_input_list(src, "Pick some wings!", "Character Preference", pretty_wing_styles) - if(!new_wing_style) - return - - //Set new style - wing_style = wing_styles_list[pretty_wing_styles[new_wing_style]] - - //Allow color picks - var/current_color = rgb(r_wing,g_wing,b_wing) - - var/new_color = tgui_color_picker(src, "Pick wing color:","Wing Color", current_color) - if(new_color) - var/list/new_color_rgb_list = hex2rgb(new_color) - r_wing = new_color_rgb_list[1] - g_wing = new_color_rgb_list[2] - b_wing = new_color_rgb_list[3] - - //Indented inside positive primary color choice, don't bother if they clicked cancel - var/current_sec_color = rgb(r_wing2,g_wing2,b_wing2) - - var/new_sec_color = tgui_color_picker(src, "Pick secondary wing color (only applies to some wings):","Wing Color (sec)", current_sec_color) - if(new_sec_color) - new_color_rgb_list = hex2rgb(new_sec_color) - r_wing2 = new_color_rgb_list[1] - g_wing2 = new_color_rgb_list[2] - b_wing2 = new_color_rgb_list[3] - - var/current_ter_color = rgb(r_wing3,g_wing3,b_wing3) - - var/new_ter_color = tgui_color_picker(src, "Pick tertiary wing color (only applies to some wings):","Wing Color (sec)", current_ter_color) - if(new_ter_color) - new_color_rgb_list = hex2rgb(new_ter_color) - r_wing3 = new_color_rgb_list[1] - g_wing3 = new_color_rgb_list[2] - b_wing3 = new_color_rgb_list[3] - - var/new_alpha = tgui_input_number(src, "Set wing alpha (0-255):","Wing Alpha", a_wing,255,0) - if(new_alpha) - a_wing = new_alpha - - - update_wing_showing() - -/mob/living/carbon/human/proc/promethean_select_opaqueness() - - set name = "Toggle Transparency" - set category = "Abilities.Shapeshift" - - if(stat || world.time < last_special) - return - - last_special = world.time + 50 - - for(var/obj/item/organ/external/L as anything in src.organs) - L.transparent = !L.transparent - visible_message(span_notice("\The [src]'s internal composition seems to change.")) - update_icons_body() - update_hair() - -/mob/living/carbon/human/proc/shapeshifter_change_shape(var/new_species = null, var/visible = TRUE) //not sure if this needs to be moved to a separate file but - if(!new_species) - return - - dna.base_species = new_species - species.base_species = new_species - wrapped_species_by_ref["\ref[src]"] = new_species - if (visible) - visible_message(span_filter_notice(span_bold("\The [src]") + " shifts and contorts, taking the form of \a [new_species]!")) - regenerate_icons() - - -//////////////////// Shapeshifter copy-body powers -/// Copied from the protean version, but with some tweaks to match non-protean shapeshifters such as lleill, hanner and replicants - -/mob/living/carbon/human/proc/shapeshifter_regenerate() - set name = "Fully Reform" - set desc = "Reload your appearance from whatever character slot you have loaded." - set category = "Abilities.Shapeshift" - var/mob/living/character = src - if(temporary_form) - character = temporary_form - var/input = tgui_alert(character,{"Do you want to copy the appearance data of your currently loaded save slot?"},"Reformation",list("Reform","Cancel")) - if(input == "Cancel" || !input) - return - else - input = tgui_alert(character,{"Include Flavourtext?"},"Reformation",list("Yes","No","Cancel")) - if(input == "Cancel" || !input) - return - var/flavour = 0 - if(input == "Yes") - flavour = 1 - input = tgui_alert(character,{"Include OOC notes?"},"Reformation",list("Yes","No","Cancel")) - if(input == "Cancel" || !input) - return - var/oocnotes = 0 - if(input == "Yes") - oocnotes = 1 - to_chat(character, span_notify("You begin to reform. You will need to remain still.")) - character.visible_message(span_notify("[character] rapidly contorts and shifts!"), span_danger("You begin to reform.")) - if(do_after(character, 40,exclusive = TASK_ALL_EXCLUSIVE)) - if(character.client.prefs) //Make sure we didn't d/c - character.client.prefs.vanity_copy_to(src, FALSE, flavour, oocnotes, FALSE) - character.visible_message(span_notify("[character] adopts a new form!"), span_danger("You have reformed.")) - -/mob/living/carbon/human/proc/shapeshifter_copy_body() - set name = "Copy Form" - set desc = "If you are aggressively grabbing someone, with their consent, you can turn into a copy of them. (Without their name)." - set category = "Abilities.Shapeshift" - var/mob/living/character = src - if(temporary_form) - character = temporary_form - - var/grabbing_but_not_enough - var/mob/living/carbon/human/victim = null - for(var/obj/item/grab/G in character) - if(G.state < GRAB_AGGRESSIVE) - grabbing_but_not_enough = TRUE - return - else - victim = G.affecting - if (!victim) - if (grabbing_but_not_enough) - to_chat(character, span_warning("You need a better grip to do that!")) - else - to_chat(character, span_notice("You need to be aggressively grabbing someone before you can copy their form.")) - return - if (!ishuman(victim)) - to_chat(character, span_warning("You can only perform this on human mobs!")) - return - if (!victim.client) - to_chat(character, span_notice("The person you try this on must have a client!")) - return - - - to_chat(character, span_notice("Waiting for other person's consent.")) - var/consent = tgui_alert(victim, "Allow [src] to copy what you look like?", "Consent", list("Yes", "No")) - if (consent != "Yes") - to_chat(character, span_notice("They declined your request.")) - return - - var/input = tgui_alert(character,{"Copy [victim]'s flavourtext?"},"Copy Form",list("Yes","No","Cancel")) - if(input == "Cancel" || !input) - return - var/flavour = 0 - if(input == "Yes") - flavour = 1 - - var/checking = FALSE - for(var/obj/item/grab/G in character) - if(G.affecting == victim && G.state >= GRAB_AGGRESSIVE) - checking = TRUE - if (!checking) - to_chat(character, span_warning("You lost your grip on [victim]!")) - return - - to_chat(character, span_notify("You begin to reassemble into [victim]. You will need to remain still.")) - character.visible_message(span_notify("[character] rapidly contorts and shifts!"), span_danger("You begin to reassemble into [victim].")) - if(do_after(character, 40,exclusive = TASK_ALL_EXCLUSIVE)) - checking = FALSE - for(var/obj/item/grab/G in character) - if(G.affecting == victim && G.state >= GRAB_AGGRESSIVE) - checking = TRUE - if (!checking) - to_chat(character, span_warning("You lost your grip on [victim]!")) - return - if(character.client) //Make sure we didn't d/c - transform_into_other_human(victim, FALSE, flavour, FALSE) - character.visible_message(span_notify("[character] adopts the form of [victim]!"), span_danger("You have reassembled into [victim].")) diff --git a/code/modules/mob/living/carbon/human/species/species_vr.dm b/code/modules/mob/living/carbon/human/species/species_vr.dm deleted file mode 100644 index f7b8cbe169..0000000000 --- a/code/modules/mob/living/carbon/human/species/species_vr.dm +++ /dev/null @@ -1,136 +0,0 @@ -/datum/species - //This is so that if a race is using the chimera revive they can't use it more than once. - //Shouldn't really be seen in play too often, but it's case an admin event happens and they give a non chimera the chimera revive. Only one person can use the chimera revive at a time per race. - //var/reviving = 0 //commented out 'cause moved to mob - holder_type = /obj/item/holder/micro //This allows you to pick up crew - min_age = 18 - descriptors = list() - - var/organic_food_coeff = 1 - var/synthetic_food_coeff = 0 - var/robo_ethanol_proc = 0 //can we get fuel from booze, as a synth? - var/robo_ethanol_drunk = 0 //can we get *drunk* from booze, as a synth? - var/digestion_efficiency = 1 //VORE specific digestion var - //var/vore_numbing = 0 - var/metabolism = 0.0015 - var/lightweight = FALSE //Oof! Nonhelpful bump stumbles. - var/trashcan = FALSE //It's always sunny in the wrestling ring. - var/eat_minerals = FALSE //HEAVY METAL DIET - var/base_species = null // Unused outside of a few species - var/selects_bodytype = SELECTS_BODYTYPE_FALSE // Allows the species to choose from body types like custom species can, affecting suit fitting and etcetera as you would expect. - - var/bloodsucker = FALSE // Allows safely getting nutrition from blood. - var/bloodsucker_controlmode = "always loud" //Allows selecting between bloodsucker control modes. Always Loud corresponds to original implementation. - - var/is_weaver = FALSE - var/silk_production = FALSE - var/silk_reserve = 100 - var/silk_max_reserve = 500 - var/silk_color = "#FFFFFF" - - var/list/traits = list() - //Vars that need to be copied when producing a copy of species. - var/list/copy_vars = list("base_species", "icobase", "deform", "tail", "tail_animation", "icobase_tail", "color_mult", "primitive_form", "appearance_flags", "flesh_color", "base_color", "blood_mask", "damage_mask", "damage_overlays", "move_trail", "has_floating_eyes") - var/trait_points = 0 - - var/ideal_air_type = null // Set to something else if you breathe something else from default composition. Used for inbelly air. - - var/micro_size_mod = 0 // How different is our size for interactions that involve us being small? - var/macro_size_mod = 0 // How different is our size for interactions that involve us being big? - var/digestion_nutrition_modifier = 1 - var/center_offset = 0.5 - var/can_climb = FALSE - var/climbing_delay = 1.5 // We climb with a quarter delay - - var/list/food_preference = list() //RS edit - var/food_preference_bonus = 0 - - - // For Lleill and Hanner - var/lleill_energy = 200 - var/lleill_energy_max = 200 - -/datum/species/unathi - vore_belly_default_variant = "L" - -/datum/species/proc/give_numbing_bite() //Holy SHIT this is hacky, but it works. Updating a mob's attacks mid game is insane. - unarmed_attacks = list() - unarmed_types += /datum/unarmed_attack/bite/sharp/numbing - for(var/u_type in unarmed_types) - unarmed_attacks += new u_type() - -/datum/species/create_organs(var/mob/living/carbon/human/H) - if(H.nif) - /*var/type = H.nif.type - var/durability = H.nif.durability - var/list/nifsofts = H.nif.nifsofts - var/list/nif_savedata = H.nif.save_data.Copy()*/ - ..() - H.nif = null //A previous call during the rejuvenation path deleted it, so we no longer should have it here - /*var/obj/item/nif/nif = new type(H,durability,nif_savedata) - nif.nifsofts = nifsofts*/ - else - ..() - -/datum/species/proc/produceCopy(var/list/traits, var/mob/living/carbon/human/H, var/custom_base, var/reset_dna = TRUE) // Traitgenes reset_dna flag required, or genes get reset on resleeve - ASSERT(src) - ASSERT(istype(H)) - var/datum/species/new_copy = new src.type() - new_copy.race_key = race_key - if (selects_bodytype && custom_base) - new_copy.base_species = custom_base - if(selects_bodytype == SELECTS_BODYTYPE_CUSTOM) //If race selects a bodytype, retrieve the custom_base species and copy needed variables. - var/datum/species/S = GLOB.all_species[custom_base] - S.copy_variables(new_copy, copy_vars) - - if(selects_bodytype == SELECTS_BODYTYPE_SHAPESHIFTER) - H.shapeshifter_change_shape(custom_base, FALSE) - - for(var/organ in has_limbs) //Copy important organ data generated by species. - var/list/organ_data = has_limbs[organ] - new_copy.has_limbs[organ] = organ_data.Copy() - - new_copy.traits = traits - //If you had traits, apply them - if(new_copy.traits) - for(var/trait in new_copy.traits) - var/datum/trait/T = all_traits[trait] - T.apply(new_copy, H, new_copy.traits[trait]) - - //Set up a mob - H.species = new_copy - H.icon_state = new_copy.get_bodytype() - - if(new_copy.holder_type) - H.holder_type = new_copy.holder_type - - if(H.dna && reset_dna) - H.dna.ready_dna(H) - handle_base_eyes(H, custom_base) - - if(H.species.has_vibration_sense) - H.motiontracker_subscribe() - - return new_copy - -//We REALLY don't need to go through every variable. Doing so makes this lag like hell on 515 -/datum/species/proc/copy_variables(var/datum/species/S, var/list/whitelist) - //List of variables to ignore, trying to copy type will runtime. - //var/list/blacklist = list("type", "loc", "client", "ckey") - //Makes thorough copy of species datum. - for(var/i in whitelist) - if(!(i in S.vars)) //Don't copy incompatible vars. - continue - if(S.vars[i] != vars[i] && !islist(vars[i])) //If vars are same, no point in copying. - S.vars[i] = vars[i] - -/datum/species/get_bodytype() - return base_species - -/datum/species/proc/update_vore_belly_def_variant() - // Determine the actual vore_belly_default_variant, if the base species in the VORE tab is set - switch (base_species) - if("Teshari") - vore_belly_default_variant = "T" - if("Unathi") - vore_belly_default_variant = "L" diff --git a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm b/code/modules/mob/living/carbon/human/species/station/custom.dm similarity index 100% rename from code/modules/mob/living/carbon/human/species/station/blank_vr.dm rename to code/modules/mob/living/carbon/human/species/station/custom.dm diff --git a/code/modules/mob/living/carbon/human/species/station/monkey.dm b/code/modules/mob/living/carbon/human/species/station/monkey.dm index c5e3b40194..4a5dce90c7 100644 --- a/code/modules/mob/living/carbon/human/species/station/monkey.dm +++ b/code/modules/mob/living/carbon/human/species/station/monkey.dm @@ -137,3 +137,89 @@ flesh_color = "#34AF10" base_color = "#066000" reagent_tag = IS_UNATHI + +/datum/species/monkey/shark + name = SPECIES_MONKEY_AKULA + name_plural = "Sobaka" + icobase = 'icons/mob/human_races/monkeys/r_sobaka_vr.dmi' + deform = 'icons/mob/human_races/monkeys/r_sobaka_vr.dmi' + tail = null //The tail is part of its body due to tail using the "icons/effects/species.dmi" file. It must be null, or they'll have a chimp tail. + greater_form = SPECIES_AKULA + default_language = "Skrellian" //Closest we have. + +/datum/species/monkey/sergal + name = SPECIES_MONKEY_SERGAL + greater_form = "Sergal" + icobase = 'icons/mob/human_races/monkeys/r_sergaling_vr.dmi' + deform = 'icons/mob/human_races/monkeys/r_sergaling_vr.dmi' + tail = null + default_language = LANGUAGE_SAGARU + +/datum/species/monkey/sparra + name = SPECIES_MONKEY_NEVREAN + name_plural = "Sparra" + greater_form = SPECIES_NEVREAN + tail = null + icobase = 'icons/mob/human_races/monkeys/r_sparra_vr.dmi' + deform = 'icons/mob/human_races/monkeys/r_sparra_vr.dmi' + default_language = LANGUAGE_BIRDSONG + + +/* Example +/datum/species/monkey/tajaran + name = SPECIES_MONKEY_TAJ + name_plural = "Farwa" + + icobase = 'icons/mob/human_races/monkeys/r_farwa.dmi' + deform = 'icons/mob/human_races/monkeys/r_farwa.dmi' + + greater_form = SPECIES_TAJARAN + default_language = "Farwa" + flesh_color = "#AFA59E" + base_color = "#333333" + tail = "farwatail" +*/ + +/datum/species/monkey/vulpkanin + name = SPECIES_MONKEY_VULPKANIN + name_plural = "Wolpin" + + icobase = 'icons/mob/human_races/monkeys/r_wolpin.dmi' + deform = 'icons/mob/human_races/monkeys/r_wolpin.dmi' + + greater_form = SPECIES_VULPKANIN + default_language = LANGUAGE_CANILUNZT + flesh_color = "#966464" + base_color = "#000000" + tail = null + +//INSERT CODE HERE SO MONKEYS CAN BE SPAWNED. +//Also, M was added to the end of the spawn names to signify that it's a monkey, since some names were conflicting. + +/mob/living/carbon/human/sharkm + low_sorting_priority = TRUE + +/mob/living/carbon/human/sharkm/Initialize(mapload) + . = ..(mapload, SPECIES_MONKEY_AKULA) + species.produceCopy(species.traits.Copy(),src,null,FALSE) + +/mob/living/carbon/human/sergallingm + low_sorting_priority = TRUE + +/mob/living/carbon/human/sergallingm/Initialize(mapload) + . = ..(mapload, SPECIES_MONKEY_SERGAL) + species.produceCopy(species.traits.Copy(),src,null,FALSE) + +/mob/living/carbon/human/sparram + low_sorting_priority = TRUE + +/mob/living/carbon/human/sparram/Initialize(mapload) + . = ..(mapload, SPECIES_MONKEY_NEVREAN) + species.produceCopy(species.traits.Copy(),src,null,FALSE) + +/mob/living/carbon/human/wolpin + low_sorting_priority = TRUE + +/mob/living/carbon/human/wolpin/Initialize(mapload) + . = ..(mapload, SPECIES_MONKEY_VULPKANIN) + species.produceCopy(species.traits.Copy(),src,null,FALSE) diff --git a/code/modules/mob/living/carbon/human/species/station/monkey_vr.dm b/code/modules/mob/living/carbon/human/species/station/monkey_vr.dm deleted file mode 100644 index 380601d0fb..0000000000 --- a/code/modules/mob/living/carbon/human/species/station/monkey_vr.dm +++ /dev/null @@ -1,85 +0,0 @@ -/datum/species/monkey/shark - name = SPECIES_MONKEY_AKULA - name_plural = "Sobaka" - icobase = 'icons/mob/human_races/monkeys/r_sobaka_vr.dmi' - deform = 'icons/mob/human_races/monkeys/r_sobaka_vr.dmi' - tail = null //The tail is part of its body due to tail using the "icons/effects/species.dmi" file. It must be null, or they'll have a chimp tail. - greater_form = SPECIES_AKULA - default_language = "Skrellian" //Closest we have. - -/datum/species/monkey/sergal - name = SPECIES_MONKEY_SERGAL - greater_form = "Sergal" - icobase = 'icons/mob/human_races/monkeys/r_sergaling_vr.dmi' - deform = 'icons/mob/human_races/monkeys/r_sergaling_vr.dmi' - tail = null - default_language = LANGUAGE_SAGARU - -/datum/species/monkey/sparra - name = SPECIES_MONKEY_NEVREAN - name_plural = "Sparra" - greater_form = SPECIES_NEVREAN - tail = null - icobase = 'icons/mob/human_races/monkeys/r_sparra_vr.dmi' - deform = 'icons/mob/human_races/monkeys/r_sparra_vr.dmi' - default_language = LANGUAGE_BIRDSONG - - -/* Example from Polaris code -/datum/species/monkey/tajaran - name = SPECIES_MONKEY_TAJ - name_plural = "Farwa" - - icobase = 'icons/mob/human_races/monkeys/r_farwa.dmi' - deform = 'icons/mob/human_races/monkeys/r_farwa.dmi' - - greater_form = SPECIES_TAJARAN - default_language = "Farwa" - flesh_color = "#AFA59E" - base_color = "#333333" - tail = "farwatail" -*/ - -/datum/species/monkey/vulpkanin - name = SPECIES_MONKEY_VULPKANIN - name_plural = "Wolpin" - - icobase = 'icons/mob/human_races/monkeys/r_wolpin.dmi' - deform = 'icons/mob/human_races/monkeys/r_wolpin.dmi' - - greater_form = SPECIES_VULPKANIN - default_language = LANGUAGE_CANILUNZT - flesh_color = "#966464" - base_color = "#000000" - tail = null - -//INSERT CODE HERE SO MONKEYS CAN BE SPAWNED. -//Also, M was added to the end of the spawn names to signify that it's a monkey, since some names were conflicting. - -/mob/living/carbon/human/sharkm - low_sorting_priority = TRUE - -/mob/living/carbon/human/sharkm/Initialize(mapload) - . = ..(mapload, SPECIES_MONKEY_AKULA) - species.produceCopy(species.traits.Copy(),src,null,FALSE) - -/mob/living/carbon/human/sergallingm - low_sorting_priority = TRUE - -/mob/living/carbon/human/sergallingm/Initialize(mapload) - . = ..(mapload, SPECIES_MONKEY_SERGAL) - species.produceCopy(species.traits.Copy(),src,null,FALSE) - -/mob/living/carbon/human/sparram - low_sorting_priority = TRUE - -/mob/living/carbon/human/sparram/Initialize(mapload) - . = ..(mapload, SPECIES_MONKEY_NEVREAN) - species.produceCopy(species.traits.Copy(),src,null,FALSE) - -/mob/living/carbon/human/wolpin - low_sorting_priority = TRUE - -/mob/living/carbon/human/wolpin/Initialize(mapload) - . = ..(mapload, SPECIES_MONKEY_VULPKANIN) - species.produceCopy(species.traits.Copy(),src,null,FALSE) diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans.dm b/code/modules/mob/living/carbon/human/species/station/prometheans.dm index baf0784391..e4e138763a 100644 --- a/code/modules/mob/living/carbon/human/species/station/prometheans.dm +++ b/code/modules/mob/living/carbon/human/species/station/prometheans.dm @@ -2,7 +2,6 @@ var/datum/species/shapeshifter/promethean/prometheans // Species definition follows. /datum/species/shapeshifter/promethean - name = SPECIES_PROMETHEAN name_plural = "Prometheans" blurb = "Prometheans (Macrolimus artificialis) are a species of artificially-created gelatinous humanoids, \ @@ -10,6 +9,7 @@ var/datum/species/shapeshifter/promethean/prometheans mimic many forms of life. Derived from the Aetolian giant slime (Macrolimus vulgaris) inhabiting the warm, tropical planet \ of Aetolus, they are a relatively new lab-created sapient species, and as such many things about them have yet to be comprehensively studied. \ What has Science done?" + wikilink="https://wiki.vore-station.net/Promethean" catalogue_data = list(/datum/category_item/catalogue/fauna/promethean) show_ssd = "totally quiescent" death_message = "rapidly loses cohesion, splattering across the ground..." @@ -18,16 +18,16 @@ var/datum/species/shapeshifter/promethean/prometheans blood_color = "#05FF9B" flesh_color = "#05FFFB" + color_mult = 1 - hunger_factor = 0.2 - reagent_tag = IS_SLIME - mob_size = MOB_SMALL - bump_flag = SLIME - swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL - push_flags = MONKEY|SLIME|SIMPLE_ANIMAL - flags = NO_DNA | NO_SLEEVE | NO_SLIP | NO_MINOR_CUT | NO_HALLUCINATION | NO_INFECT | NO_DEFIB + hunger_factor = 0.2 + reagent_tag = IS_SLIME + mob_size = MOB_MEDIUM + push_flags = ~HEAVY + swap_flags = ~HEAVY + flags = NO_DNA | NO_SLEEVE | NO_SLIP | NO_MINOR_CUT | NO_HALLUCINATION | NO_INFECT | NO_DEFIB appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | RADIATION_GLOWS | HAS_UNDERWEAR - spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED + spawn_flags = SPECIES_CAN_JOIN health_hud_intensity = 2 num_alternate_languages = 3 language = LANGUAGE_PROMETHEAN @@ -46,12 +46,11 @@ var/datum/species/shapeshifter/promethean/prometheans male_cough_sounds = list('sound/effects/slime_squish.ogg') female_cough_sounds = list('sound/effects/slime_squish.ogg') - min_age = 1 - max_age = 16 + min_age = 18 + max_age = 80 economic_modifier = 3 - gluttonous = 1 virus_immune = 1 blood_volume = 560 brute_mod = 0.75 @@ -79,9 +78,9 @@ var/datum/species/shapeshifter/promethean/prometheans siemens_coefficient = 0.8 water_resistance = 0 - water_damage_mod = 0.3 + water_damage_mod = 0 - genders = list(MALE, FEMALE, NEUTER, PLURAL) + genders = list(MALE, FEMALE, PLURAL, NEUTER) unarmed_types = list(/datum/unarmed_attack/slime_glomp) @@ -114,13 +113,25 @@ var/datum/species/shapeshifter/promethean/prometheans /mob/living/carbon/human/proc/shapeshifter_select_shape, /mob/living/carbon/human/proc/shapeshifter_select_colour, /mob/living/carbon/human/proc/shapeshifter_select_hair, - /mob/living/carbon/human/proc/shapeshifter_select_eye_colour, /mob/living/carbon/human/proc/shapeshifter_select_hair_colors, /mob/living/carbon/human/proc/shapeshifter_select_gender, - /mob/living/carbon/human/proc/regenerate + /mob/living/carbon/human/proc/regenerate, + /mob/living/carbon/human/proc/shapeshifter_select_wings, + /mob/living/carbon/human/proc/shapeshifter_select_tail, + /mob/living/carbon/human/proc/shapeshifter_select_ears, + /mob/living/carbon/human/proc/shapeshifter_select_secondary_ears, + /mob/living/carbon/human/proc/prommie_blobform, + /mob/living/proc/set_size, + /mob/living/carbon/human/proc/promethean_select_opaqueness, ) - valid_transform_species = list(SPECIES_HUMAN, SPECIES_HUMAN_VATBORN, SPECIES_UNATHI, SPECIES_TAJARAN, SPECIES_SKRELL, SPECIES_DIONA, SPECIES_TESHARI, SPECIES_MONKEY) + valid_transform_species = list( + SPECIES_HUMAN, SPECIES_UNATHI, SPECIES_TAJARAN, SPECIES_SKRELL, + SPECIES_DIONA, SPECIES_TESHARI, SPECIES_MONKEY, SPECIES_SERGAL, + SPECIES_AKULA, SPECIES_NEVREAN, SPECIES_ZORREN_HIGH, + SPECIES_FENNEC, SPECIES_VULPKANIN, SPECIES_VASILISSAN, + SPECIES_RAPALA, SPECIES_MONKEY_SKRELL, SPECIES_MONKEY_UNATHI, SPECIES_MONKEY_TAJ, SPECIES_MONKEY_AKULA, + SPECIES_MONKEY_VULPKANIN, SPECIES_MONKEY_SERGAL, SPECIES_MONKEY_NEVREAN) var/heal_rate = 0.5 // Temp. Regen per tick. @@ -182,6 +193,14 @@ var/datum/species/shapeshifter/promethean/prometheans H.apply_stored_shock_to(target) /datum/species/shapeshifter/promethean/handle_death(var/mob/living/carbon/human/H) + if(!H) + return // Iono! + + if(H.temporary_form) + H.forceMove(H.temporary_form.drop_location()) + H.ckey = H.temporary_form.ckey + QDEL_NULL(H.temporary_form) + spawn(1) if(H) H.gib() @@ -369,3 +388,28 @@ var/datum/species/shapeshifter/promethean/prometheans return span_warning("[t_she] glowing brightly with high levels of electrical activity.") if(35 to INFINITY) return span_danger("[t_she] radiating massive levels of electrical activity!") + +/mob/living/carbon/human/proc/prommie_blobform() + set name = "Toggle Blobform" + set desc = "Switch between amorphous and humanoid forms." + set category = "Abilities.Promethean" + set hidden = FALSE + + var/atom/movable/to_locate = temporary_form || src + if(!isturf(to_locate.loc)) + to_chat(to_locate,span_warning("You need more space to perform this action!")) + return + /* + //Blob form + if(temporary_form) + if(temporary_form.stat) + to_chat(temporary_form,span_warning("You can only do this while not stunned.")) + else + prommie_outofblob(temporary_form) + */ + //Human form + else if(stat || paralysis || stunned || weakened || restrained()) + to_chat(src,span_warning("You can only do this while not stunned.")) + return + else + prommie_intoblob() diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm deleted file mode 100644 index 699a79e11c..0000000000 --- a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm +++ /dev/null @@ -1,79 +0,0 @@ -/datum/species/shapeshifter/promethean - min_age = 18 //Required for server rules - max_age = 80 - push_flags = ~HEAVY - swap_flags = ~HEAVY - gluttonous = 0 - water_damage_mod = 0 //No water damage - valid_transform_species = list( - SPECIES_HUMAN, SPECIES_UNATHI, SPECIES_TAJARAN, SPECIES_SKRELL, - SPECIES_DIONA, SPECIES_TESHARI, SPECIES_MONKEY, SPECIES_SERGAL, - SPECIES_AKULA, SPECIES_NEVREAN, SPECIES_ZORREN_HIGH, - SPECIES_FENNEC, SPECIES_VULPKANIN, SPECIES_VASILISSAN, - SPECIES_RAPALA, SPECIES_MONKEY_SKRELL, SPECIES_MONKEY_UNATHI, SPECIES_MONKEY_TAJ, SPECIES_MONKEY_AKULA, - SPECIES_MONKEY_VULPKANIN, SPECIES_MONKEY_SERGAL, SPECIES_MONKEY_NEVREAN) - - spawn_flags = SPECIES_CAN_JOIN - wikilink="https://wiki.vore-station.net/Promethean" - genders = list(MALE, FEMALE, PLURAL, NEUTER) - color_mult = 1 - mob_size = MOB_MEDIUM //As of writing, original was MOB_SMALL - Allows normal swapping - //var/mob/living/simple_mob/slime/promethean/stored_blob = null - appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | RADIATION_GLOWS | HAS_UNDERWEAR - - inherent_verbs = list( - /mob/living/carbon/human/proc/shapeshifter_select_shape, - /mob/living/carbon/human/proc/shapeshifter_select_colour, - /mob/living/carbon/human/proc/shapeshifter_select_hair, - /mob/living/carbon/human/proc/shapeshifter_select_hair_colors, - /mob/living/carbon/human/proc/shapeshifter_select_gender, - /mob/living/carbon/human/proc/regenerate, - /mob/living/carbon/human/proc/shapeshifter_select_wings, - /mob/living/carbon/human/proc/shapeshifter_select_tail, - /mob/living/carbon/human/proc/shapeshifter_select_ears, - /mob/living/carbon/human/proc/shapeshifter_select_secondary_ears, - /mob/living/carbon/human/proc/prommie_blobform, - /mob/living/proc/set_size, - /mob/living/carbon/human/proc/promethean_select_opaqueness, - ) - -/mob/living/carbon/human/proc/prommie_blobform() - set name = "Toggle Blobform" - set desc = "Switch between amorphous and humanoid forms." - set category = "Abilities.Promethean" - set hidden = FALSE - - var/atom/movable/to_locate = temporary_form || src - if(!isturf(to_locate.loc)) - to_chat(to_locate,span_warning("You need more space to perform this action!")) - return - /* - //Blob form - if(temporary_form) - if(temporary_form.stat) - to_chat(temporary_form,span_warning("You can only do this while not stunned.")) - else - prommie_outofblob(temporary_form) - */ - //Human form - else if(stat || paralysis || stunned || weakened || restrained()) - to_chat(src,span_warning("You can only do this while not stunned.")) - return - else - prommie_intoblob() - -/datum/species/shapeshifter/promethean/handle_death(var/mob/living/carbon/human/H) - if(!H) - return // Iono! - - if(H.temporary_form) - H.forceMove(H.temporary_form.drop_location()) - H.ckey = H.temporary_form.ckey - QDEL_NULL(H.temporary_form) - //else if(H.stored_blob) // Should prevent phantom blobs in the aether. I don't anticipate this being an issue, but if it is just uncomment. - // qdel(stored_blob) - // stored_blob = null - - spawn(1) - if(H) - H.gib() diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/_protean_defines.dm b/code/modules/mob/living/carbon/human/species/station/protean/_protean_defines.dm similarity index 100% rename from code/modules/mob/living/carbon/human/species/station/protean_vr/_protean_defines.dm rename to code/modules/mob/living/carbon/human/species/station/protean/_protean_defines.dm diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm b/code/modules/mob/living/carbon/human/species/station/protean/protean_blob.dm similarity index 100% rename from code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm rename to code/modules/mob/living/carbon/human/species/station/protean/protean_blob.dm diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm b/code/modules/mob/living/carbon/human/species/station/protean/protean_powers.dm similarity index 100% rename from code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm rename to code/modules/mob/living/carbon/human/species/station/protean/protean_powers.dm diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_rig.dm b/code/modules/mob/living/carbon/human/species/station/protean/protean_rig.dm similarity index 100% rename from code/modules/mob/living/carbon/human/species/station/protean_vr/protean_rig.dm rename to code/modules/mob/living/carbon/human/species/station/protean/protean_rig.dm diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_rig_tgui.dm b/code/modules/mob/living/carbon/human/species/station/protean/protean_rig_tgui.dm similarity index 100% rename from code/modules/mob/living/carbon/human/species/station/protean_vr/protean_rig_tgui.dm rename to code/modules/mob/living/carbon/human/species/station/protean/protean_rig_tgui.dm diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm b/code/modules/mob/living/carbon/human/species/station/protean/protean_species.dm old mode 100755 new mode 100644 similarity index 100% rename from code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm rename to code/modules/mob/living/carbon/human/species/station/protean/protean_species.dm diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index 8a5ac67d8b..64878643c2 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -1,13 +1,16 @@ /datum/species/human name = SPECIES_HUMAN name_plural = "Humans" + icobase = 'icons/mob/human_races/r_human_vr.dmi' + deform = 'icons/mob/human_races/r_def_human_vr.dmi' primitive_form = SPECIES_MONKEY unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch, /datum/unarmed_attack/bite) - blurb = "Humanity originated in the Sol system, and over the last five centuries has spread \ + blurb = "Humanity originated in the Sol system, and over the last three centuries has spread \ colonies across a wide swathe of space. They hold a wide range of forms and creeds.

\ While the central Sol government maintains control of its far-flung people, powerful corporate \ interests, rampant cyber and bio-augmentation and secretive factions make life on most human \ worlds tumultous at best." + wikilink="https://wiki.vore-station.net/Human" catalogue_data = list(/datum/category_item/catalogue/fauna/humans) num_alternate_languages = 3 species_language = LANGUAGE_SOL_COMMON @@ -15,12 +18,16 @@ name_language = null // Use the first-name last-name generator rather than a language scrambler assisted_langs = list(LANGUAGE_EAL, LANGUAGE_SKRELLIAN, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX, LANGUAGE_PROMETHEAN) - min_age = 17 + min_age = 18 max_age = 130 + genders = list(MALE, FEMALE, PLURAL, NEUTER) economic_modifier = 10 health_hud_intensity = 1.5 + base_color = "#EECEB3" + color_mult = 1 + spawn_flags = SPECIES_CAN_JOIN appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR @@ -45,25 +52,28 @@ /datum/species/human/get_bodytype(var/mob/living/carbon/human/H) return SPECIES_HUMAN +/datum/species/human/vatgrown + spawn_flags = SPECIES_IS_RESTRICTED + /datum/species/unathi name = SPECIES_UNATHI name_plural = "Unathi" - icobase = 'icons/mob/human_races/r_lizard.dmi' - deform = 'icons/mob/human_races/r_def_lizard.dmi' + icobase = 'icons/mob/human_races/r_lizard_vr.dmi' + deform = 'icons/mob/human_races/r_def_lizard_vr.dmi' + tail_animation = 'icons/mob/species/unathi/tail_vr.dmi' tail = "sogtail" - tail_animation = 'icons/mob/species/unathi/tail.dmi' + vore_belly_default_variant = "L" unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) primitive_form = SPECIES_MONKEY_UNATHI darksight = 3 ambiguous_genders = TRUE - gluttonous = 1 slowdown = 0.5 total_health = 125 brute_mod = 0.85 burn_mod = 0.85 metabolic_rate = 0.85 item_slowdown_mod = 0.25 - mob_size = MOB_LARGE + mob_size = MOB_MEDIUM blood_volume = 840 bloodloss_rate = 0.75 num_alternate_languages = 3 @@ -74,17 +84,23 @@ chem_strength_alcohol = 1.25 throwforce_absorb_threshold = 10 digi_allowed = TRUE + genders = list(MALE, FEMALE, PLURAL, NEUTER) - min_age = 32 + min_age = 18 max_age = 260 economic_modifier = 7 - blurb = "A heavily reptillian species, Unathi hail from the \ - Uuosa-Eso system, which roughly translates to 'burning mother'.

Coming from a harsh, inhospitable \ - planet, they mostly hold ideals of honesty, virtue, proficiency and bravery above all \ - else, frequently even their own lives. They prefer warmer temperatures than most species and \ - their native tongue is a heavy hissing laungage called Sinta'Unathi." + blurb = "Heavily reptilian in appearance, the Unathi hail from the Uueoa-Esa system, roughly translated as 'Burning Mother'. \ + Their home planet, Moghes, is an arid climate with hot rocky plains and deserts, and a temperate band of swamps and savannas with \ + massive saltwater lakes being the closest equivalent to oceans. This environment bred a very hardy people who value ideals of honesty, \ + virtue, proficiency and bravery above all else, frequently even one's own life. These same values lend them culturally to imperialistic \ + politics, as well as often being viewed as haughty and arrogant by other interstellar species.

\ + On the stage of the interstellar political realm the Unathi are noteworthy contenders, the Moghes Hegemony possesses vast technological and \ + material prowess when compared to human contemporaries such as the Sol-Procyon Commonwealth or Ares Confederation. The Hegemony War nearly one \ + hundred years ago is a prime example of this, having engaged in brutal warfare that ultimately fell to a stalemate between all involved parties. \ + Nowadays relations remain cool and somewhat tense, although this does not prevent individual Unathi from finding reasonable career success within Human space." + catalogue_data = list(/datum/category_item/catalogue/fauna/unathi) cold_level_1 = 280 //Default 260 - Lower is better @@ -107,12 +123,13 @@ body_temperature = T20C - spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED + spawn_flags = SPECIES_CAN_JOIN appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR flesh_color = "#34AF10" blood_color = "#b3cbc3" base_color = "#066000" + color_mult = 1 reagent_tag = IS_UNATHI @@ -158,11 +175,6 @@ "Your scales bristle against the cold." ) - descriptors = list( - /datum/mob_descriptor/height = 2, - /datum/mob_descriptor/build = 2 - ) - default_emotes = list( /decl/emote/human/swish, /decl/emote/human/wag, @@ -175,6 +187,9 @@ footstep = FOOTSTEP_MOB_CLAW + inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) + wikilink="https://wiki.vore-station.net/Unathi" + /datum/species/unathi/equip_survival_gear(var/mob/living/carbon/human/H) ..() H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes) @@ -182,10 +197,10 @@ /datum/species/tajaran name = SPECIES_TAJARAN name_plural = "Tajaran" - icobase = 'icons/mob/human_races/r_tajaran.dmi' - deform = 'icons/mob/human_races/r_def_tajaran.dmi' + icobase = 'icons/mob/human_races/r_tajaran_vr.dmi' + deform = 'icons/mob/human_races/r_def_tajaran_vr.dmi' tail = "tajtail" - tail_animation = 'icons/mob/species/tajaran/tail.dmi' + tail_animation = 'icons/mob/species/tajaran/tail_vr.dmi' unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) darksight = 8 slowdown = -0.5 @@ -194,7 +209,6 @@ burn_mod = 1.15 flash_mod = 1.1 metabolic_rate = 1.1 - gluttonous = 1 num_alternate_languages = 3 secondary_langs = list(LANGUAGE_SIIK, LANGUAGE_AKHANI, LANGUAGE_ALAI) name_language = LANGUAGE_SIIK @@ -202,8 +216,11 @@ health_hud_intensity = 2.5 chem_strength_alcohol = 0.75 digi_allowed = TRUE + agility = 90 + can_climb = TRUE + climbing_delay = 1.00 //Cats are good climbers. - min_age = 17 + min_age = 18 max_age = 80 economic_modifier = 7 @@ -213,6 +230,7 @@ and have accelerated the fledgling culture into the interstellar age. Their history is full of war and highly fractious \ governments, something that permeates even to today's times. They prefer colder, tundra-like climates, much like their \ home worlds and speak a variety of languages, especially Siik and Akhani." + wikilink="https://wiki.vore-station.net/Tajaran" catalogue_data = list(/datum/category_item/catalogue/fauna/tajaran) body_temperature = 280.15 //Even more cold resistant, even more flammable @@ -235,20 +253,22 @@ primitive_form = SPECIES_MONKEY_TAJ - spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED + spawn_flags = SPECIES_CAN_JOIN appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR + genders = list(MALE, FEMALE, PLURAL, NEUTER) flesh_color = "#AFA59E" base_color = "#333333" + color_mult = 1 reagent_tag = IS_TAJARA - allergens = ALLERGEN_STIMULANT + allergens = null climb_mult = 0.75 move_trail = /obj/effect/decal/cleanable/blood/tracks/paw - heat_discomfort_level = 292 + heat_discomfort_level = 295 //Prevents heat discomfort spam at 20c heat_discomfort_strings = list( "Your fur prickles in the heat.", "You feel uncomfortably warm.", @@ -283,6 +303,7 @@ /decl/emote/human/swag, /decl/emote/human/stopsway ) + inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds, /mob/living/carbon/human/proc/tie_hair) /datum/species/tajaran/equip_survival_gear(var/mob/living/carbon/human/H) ..() @@ -291,8 +312,8 @@ /datum/species/skrell name = SPECIES_SKRELL name_plural = "Skrell" - icobase = 'icons/mob/human_races/r_skrell.dmi' - deform = 'icons/mob/human_races/r_def_skrell.dmi' + icobase = 'icons/mob/human_races/r_skrell_vr.dmi' + deform = 'icons/mob/human_races/r_def_skrell_vr.dmi' primitive_form = SPECIES_MONKEY_SKRELL unarmed_types = list(/datum/unarmed_attack/punch) blurb = "An amphibious species, Skrell come from the star system known as Qerr'Vallis, which translates to 'Star of \ @@ -300,6 +321,7 @@ of the Qerr'Katish, a caste within their society which keeps the empire of the Skrell running smoothly. Skrell are \ herbivores on the whole and tend to be co-operative with the other species of the galaxy, although they rarely reveal \ the secrets of their empire to their allies." + wikilink="https://wiki.vore-station.net/Skrell" catalogue_data = list(/datum/category_item/catalogue/fauna/skrell) num_alternate_languages = 3 secondary_langs = list(LANGUAGE_SKRELLIAN, LANGUAGE_SCHECHI) @@ -311,7 +333,7 @@ water_movement = -3 - min_age = 19 + min_age = 18 max_age = 130 economic_modifier = 12 @@ -325,12 +347,13 @@ ambiguous_genders = TRUE - spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED + spawn_flags = SPECIES_CAN_JOIN appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR flesh_color = "#8CD7A3" blood_color = "#0081CD" base_color = "#006666" + color_mult = 1 cold_level_1 = 280 //Default 260 - Lower is better cold_level_2 = 220 //Default 200 @@ -348,10 +371,13 @@ breath_heat_level_2 = 500 //Default 450 breath_heat_level_3 = 1350 //Default 1250 - reagent_tag = IS_SKRELL - allergens = ALLERGEN_MEAT|ALLERGEN_FISH|ALLERGEN_DAIRY|ALLERGEN_EGGS + reagent_tag = null //I am going to just NUKE reagent_tag omfg...This is ridiculous + allergens = null + + genders = list(MALE, FEMALE, PLURAL, NEUTER) water_breather = TRUE + water_movement = -4 //Negates shallow. Halves deep. has_limbs = list( BP_TORSO = list("path" = /obj/item/organ/external/chest), @@ -387,6 +413,8 @@ /decl/emote/audible/croon, /decl/emote/audible/croak ) + inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair, /mob/living/carbon/human/proc/water_stealth, /mob/living/carbon/human/proc/underwater_devour) + /datum/species/skrell/can_breathe_water() return TRUE @@ -403,7 +431,6 @@ flash_mod = 2 flash_burn = 15 //flashing a zaddat probably counts as police brutality metabolic_rate = 0.7 //did u know if your ancestors starved ur body will actually start in starvation mode? - gluttonous = 1 taste_sensitivity = TASTE_SENSITIVE num_alternate_languages = 3 secondary_langs = list(LANGUAGE_ZADDAT, LANGUAGE_UNATHI) @@ -417,7 +444,7 @@ economic_modifier = 3 - min_age = 16 + min_age = 18 max_age = 90 blurb = "The Zaddat are an Unathi client race only recently introduced to SolGov space. Having evolved on \ @@ -435,9 +462,9 @@ poison_type = GAS_N2 // technically it's a partial pressure thing but IDK if we can emulate that ideal_air_type = /datum/gas_mixture/belly_air/zaddat - genders = list(FEMALE, PLURAL) //females are polyp-producing, infertile females and males are nigh-identical + genders = list(MALE, FEMALE, PLURAL, NEUTER) - spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED + spawn_flags = SPECIES_CAN_JOIN appearance_flags = null flesh_color = "#AFA59E" @@ -470,14 +497,11 @@ O_INTESTINE =/obj/item/organ/internal/intestine ) - descriptors = list( - /datum/mob_descriptor/height = 0, - /datum/mob_descriptor/build = -1 - ) default_emotes = list( /decl/emote/audible/chirp ) + inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) /datum/species/zaddat/equip_survival_gear(var/mob/living/carbon/human/H) ..() @@ -510,6 +534,7 @@ H.apply_damage(light_amount/4, BURN, K, 0, 0) /datum/species/diona + name = SPECIES_DIONA name_plural = "Dionaea" icobase = 'icons/mob/human_races/r_diona.dmi' @@ -534,7 +559,7 @@ species_language = LANGUAGE_ROOTLOCAL secondary_langs = list(LANGUAGE_ROOTGLOBAL) assisted_langs = list(LANGUAGE_VOX) // Diona are weird, let's just assume they can use basically any language. - min_age = 1 + min_age = 18 max_age = 300 economic_modifier = 4 @@ -546,6 +571,7 @@ all known species, especially the Skrell. Their communal mind makes them slow to react, and they have difficulty understanding \ even the simplest concepts of other minds. Their alien physiology allows them survive happily off a diet of nothing but light, \ water and other radiation." + wikilink="https://wiki.vore-station.net/Diona" catalogue_data = list(/datum/category_item/catalogue/fauna/dionaea) has_organ = list( @@ -599,7 +625,7 @@ reagent_tag = IS_DIONA - genders = list(PLURAL) + genders = list(MALE, FEMALE, PLURAL, NEUTER) default_emotes = list( /decl/emote/audible/chirp, @@ -679,3 +705,1282 @@ //traumatic_shock is updated every tick, incrementing that is pointless - shock_stage is the counter. //Not that it matters much for diona, who have NO_PAIN. H.shock_stage++ + + + +/datum/species/sergal + name = SPECIES_SERGAL + name_plural = "Sergals" + icobase = 'icons/mob/human_races/r_sergal.dmi' + deform = 'icons/mob/human_races/r_def_sergal.dmi' + tail = "tail" + icobase_tail = 1 + unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) + //darksight = 8 + //slowdown = -0.5 + //brute_mod = 1.15 + //burn_mod = 1.15 + num_alternate_languages = 3 + secondary_langs = list(LANGUAGE_SAGARU) + name_language = LANGUAGE_SAGARU + species_language = LANGUAGE_SAGARU + color_mult = 1 + inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) + digi_allowed = TRUE + + min_age = 18 + max_age = 80 + + blurb = "There are two subspecies of Sergal; Southern and Northern. Northern sergals are a highly aggressive race \ + that lives in the plains and tundra of their homeworld. They are characterized by long, fluffy fur bodies with cold colors; \ + usually with white abdomens, somewhat short ears, and thick faces. Southern sergals are much more docile and live in the \ + Gold Ring City and are scattered around the outskirts in rural areas and small towns. They usually have short, brown or yellow \ + (or other 'earthy' colors) fur, long ears, and a long, thin face. They are smaller than their Northern relatives. Both have strong \ + racial tensions which has resulted in more than a number of wars and outright attempts at genocide. Sergals have an incredibly long \ + lifespan, but due to their lust for violence, only a handful have ever survived beyond the age of 80, such as the infamous and \ + legendary General Rain Silves who is claimed to have lived to 5000." + + wikilink="https://wiki.vore-station.net/Backstory#Sergal" + + catalogue_data = list(/datum/category_item/catalogue/fauna/sergal) + + primitive_form = SPECIES_MONKEY_SERGAL + + spawn_flags = SPECIES_CAN_JOIN + appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR + + flesh_color = "#AFA59E" + base_color = "#777777" + + genders = list(MALE, FEMALE, PLURAL, NEUTER) + + heat_discomfort_strings = list( + "Your fur prickles in the heat.", + "You feel uncomfortably warm.", + "Your overheated skin itches." + ) + + has_limbs = list( + BP_TORSO = list("path" = /obj/item/organ/external/chest), + BP_GROIN = list("path" = /obj/item/organ/external/groin), + BP_HEAD = list("path" = /obj/item/organ/external/head/sergal), + BP_L_ARM = list("path" = /obj/item/organ/external/arm), + BP_R_ARM = list("path" = /obj/item/organ/external/arm/right), + BP_L_LEG = list("path" = /obj/item/organ/external/leg), + BP_R_LEG = list("path" = /obj/item/organ/external/leg/right), + BP_L_HAND = list("path" = /obj/item/organ/external/hand), + BP_R_HAND = list("path" = /obj/item/organ/external/hand/right), + BP_L_FOOT = list("path" = /obj/item/organ/external/foot), + BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right) + ) + +/datum/species/akula + name = SPECIES_AKULA + name_plural = "Akula" + icobase = 'icons/mob/human_races/r_akula.dmi' + deform = 'icons/mob/human_races/r_def_akula.dmi' + tail = "tail" + icobase_tail = 1 + unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) + //darksight = 8 + //slowdown = -0.5 + //brute_mod = 1.15 + //burn_mod = 1.15 + num_alternate_languages = 3 + secondary_langs = list(LANGUAGE_SPACER) + name_language = LANGUAGE_SPACER + species_language = LANGUAGE_SPACER + color_mult = 1 + assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX, LANGUAGE_PROMETHEAN) + inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair, /mob/living/carbon/human/proc/water_stealth, /mob/living/carbon/human/proc/underwater_devour) + min_age = 18 + max_age = 80 + digi_allowed = TRUE + + blurb = "The Akula are a species of amphibious humanoids like the Skrell, but have an appearance very similar to that of a shark. \ + They were first discovered as a primitive race of underwater dwelling tribal creatures by the Skrell. At first they were not believed \ + to be noteworthy, but the Akula proved to be such swift and clever learners that the Skrell reclassified them as sentients. Allegedly, \ + the Akula were also the first sentient life that the Skrell had ever encountered beside themselves, and thus the two species became swift \ + allies over the next few hundred years. With the help of Skrellean technology, the Akula had their genome modified to be capable of \ + surviving in open air for long periods of time. However, Akula even today still require a high humidity environment to avoid drying out \ + after a few days, which would make life on an arid world like Virgo-Prime nearly impossible if it were not for Skrellean technology to aid them." + + wikilink="https://wiki.vore-station.net/Backstory#Akula" + + catalogue_data = list(/datum/category_item/catalogue/fauna/akula) + + primitive_form = SPECIES_MONKEY_AKULA + + genders = list(MALE, FEMALE, PLURAL, NEUTER) + + spawn_flags = SPECIES_CAN_JOIN + appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR + + water_breather = TRUE + water_movement = -4 //Negates shallow. Halves deep. + swim_mult = 0.5 + + flesh_color = "#AFA59E" + base_color = "#777777" + blood_color = "#1D2CBF" + +/datum/species/nevrean + name = SPECIES_NEVREAN + name_plural = "Nevreans" + icobase = 'icons/mob/human_races/r_nevrean.dmi' + deform = 'icons/mob/human_races/r_def_nevrean.dmi' + tail = "tail" + icobase_tail = 1 + unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) + //darksight = 8 + //slowdown = -0.5 + //brute_mod = 1.15 + //burn_mod = 1.15 + soft_landing = TRUE + num_alternate_languages = 3 + secondary_langs = list(LANGUAGE_BIRDSONG) + name_language = LANGUAGE_BIRDSONG + species_language = LANGUAGE_BIRDSONG + color_mult = 1 + inherent_verbs = list(/mob/living/proc/flying_toggle, + /mob/living/proc/flying_vore_toggle, + /mob/living/proc/start_wings_hovering, + /mob/living/carbon/human/proc/tie_hair) + min_age = 18 + max_age = 80 + digi_allowed = TRUE + + blurb = "Nevreans are a race of avian and dinosaur-like creatures living on Tal. They belong to a group of races that hails from Eltus, \ + in the Vilous system. Unlike sergals whom they share a star system with, their species is a very peaceful one. They possess remarkable \ + intelligence and very skillful hands that are put use for constructing precision instruments, but tire-out fast when repeatedly working \ + over and over again. Consequently, they struggle to make copies of same things. Both genders have a voice that echoes a lot. Their natural \ + tone oscillates between tenor and soprano. They are excessively noisy when they quarrel in their native language." + + wikilink="https://wiki.vore-station.net/Backstory#Nevrean" + + catalogue_data = list(/datum/category_item/catalogue/fauna/nevrean) + + primitive_form = SPECIES_MONKEY_NEVREAN + + genders = list(MALE, FEMALE, PLURAL, NEUTER) + + spawn_flags = SPECIES_CAN_JOIN + appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR + + flesh_color = "#AFA59E" + base_color = "#333333" + + heat_discomfort_strings = list( + "Your fur prickles in the heat.", + "You feel uncomfortably warm.", + "Your overheated skin itches." + ) + +/datum/species/hi_zoxxen + name = SPECIES_ZORREN_HIGH + name_plural = "Zorren" + icobase = 'icons/mob/human_races/r_fox_vr.dmi' + deform = 'icons/mob/human_races/r_def_fox.dmi' + tail = "tail" + icobase_tail = 1 + unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) + num_alternate_languages = 3 + secondary_langs = list(LANGUAGE_TERMINUS) + name_language = LANGUAGE_TERMINUS + species_language = LANGUAGE_TERMINUS + inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds, + /mob/living/proc/shred_limb, + /mob/living/carbon/human/proc/tie_hair) + digi_allowed = TRUE + + min_age = 18 + max_age = 80 + + blurb = "The fennec-like, blue-blooded Zorren are native to Virgo 4/Menhir and are descendants of a precursor species \ + that is thought to be responsible for the near-collapse of the biosphere of the planet. \ + With societies organised around hierarchal caste systems (such as the Royal Zorren) or freedom and strength (such as the Free Tribe Zorren), \ + they now slowly recover from their previous hubris and aim to revitalize their planet. While many Zorren live in pre-industrial conditions by necessity, \ + they are an interstellar species known for their pride and stubbornness and doggedly hold out on a Deathworld of their own creation. \ + As local species, they hold moderate sway on local corporations and are hired by NT and other companies, although they find \"Outlander\" culture deeply weird." + wikilink="https://wiki.vore-station.net/Zorren" + + catalogue_data = list(/datum/category_item/catalogue/fauna/zorren) + + //primitive_form = "" //We don't have fox-monkey sprites. + + spawn_flags = SPECIES_CAN_JOIN + appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR + flesh_color = "#AFA59E" + base_color = "#333333" + blood_color = "#240bc4" + blood_reagents = REAGENT_ID_COPPER + reagent_tag = IS_ZORREN + color_mult = 1 + + genders = list(MALE, FEMALE, PLURAL, NEUTER) + + heat_discomfort_strings = list( + "Your fur prickles in the heat.", + "You feel uncomfortably warm.", + "Your overheated skin itches." + ) + +/datum/species/vulpkanin + name = SPECIES_VULPKANIN + name_plural = "Vulpkanin" + blurb = "Vulpkanin are a species of sapient canine bipeds, who are the descendants of a lost colony during the waning days of a Precursor species, \ + from which their distant cousins, the Zorren, also originate from. Independent and iconoclast, they have abandoned the ideals of their forefathers \ + largely and prefer to look outwards as explorers and scientists to forge their own identity. They speak a guttural language known as 'Canilunzt' \ + which has a heavy emphasis on utilizing tail positioning and ear twitches to communicate intent." + icobase = 'icons/mob/human_races/r_vulpkanin.dmi' + deform = 'icons/mob/human_races/r_vulpkanin.dmi' + secondary_langs = list(LANGUAGE_CANILUNZT) + name_language = LANGUAGE_CANILUNZT + species_language = LANGUAGE_CANILUNZT + primitive_form = SPECIES_MONKEY_VULPKANIN + tail = "vulptail" + tail_animation = 'icons/mob/species/vulpkanin/tail.dmi' + unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) + darksight = 5 + num_alternate_languages = 3 + color_mult = 1 + inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds, + /mob/living/carbon/human/proc/tie_hair) + digi_allowed = TRUE + + wikilink="https://wiki.vore-station.net/Backstory#Vulpkanin" + + catalogue_data = list(/datum/category_item/catalogue/fauna/vulpkanin) + + //Furry fox-like animals shouldn't start freezing at 5 degrees celsius. + //Minor cold is resisted, but not severe frost. + cold_discomfort_level = 263 //Not as good at surviving the frost as tajara, but still better than humans. + + cold_level_1 = 243 //Default 260, other values remain at default. Starts taking damage at -30 celsius. Default tier 2 is -70 and tier 3 is -150 + + + breath_cold_level_1 = 220 // Default 240, lower is better. + + //While foxes can survive in deserts, that's handled by zorren. It's a good contrast that our vulp find heat a little uncomfortable. + + heat_discomfort_level = 295 //Just above standard 20 C to avoid heat message spam, same as Taj + + heat_level_1 = 345 //Default 360 + heat_level_2 = 390 //Default 400 + heat_level_3 = 900 //Default 1000 + + breath_heat_level_1 = 370 //Default 380 - Higher is better + breath_heat_level_2 = 445 //Default 450 + breath_heat_level_3 = 1125 //Default 1250 + + primitive_form = SPECIES_MONKEY_VULPKANIN + + spawn_flags = SPECIES_CAN_JOIN + appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR + + genders = list(MALE, FEMALE, PLURAL, NEUTER) + + flesh_color = "#966464" + base_color = "#B43214" + + min_age = 18 + max_age = 80 + + heat_discomfort_strings = list( + "Your fur prickles in the heat.", + "You feel uncomfortably warm.", + "Your overheated skin itches." + ) + +/datum/species/skrell + spawn_flags = SPECIES_CAN_JOIN + icobase = 'icons/mob/human_races/r_skrell_vr.dmi' + deform = 'icons/mob/human_races/r_def_skrell_vr.dmi' + color_mult = 1 + min_age = 18 + inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair, /mob/living/carbon/human/proc/water_stealth, /mob/living/carbon/human/proc/underwater_devour) + reagent_tag = null + allergens = null + assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX, LANGUAGE_PROMETHEAN) + genders = list(MALE, FEMALE, PLURAL, NEUTER) + wikilink="https://wiki.vore-station.net/Skrell" + + water_breather = TRUE + water_movement = -4 //Negates shallow. Halves deep. + +/datum/species/zaddat/equip_survival_gear(var/mob/living/carbon/human/H) + .=..() + var/obj/item/storage/toolbox/lunchbox/survival/zaddat/L = new(get_turf(H)) + if(H.backbag == 1) + H.equip_to_slot_or_del(L, slot_r_hand) + else + H.equip_to_slot_or_del(L, slot_in_backpack) + +/datum/species/human/vatgrown + spawn_flags = SPECIES_IS_RESTRICTED +/datum/species/harpy + name = SPECIES_RAPALA + name_plural = "Rapalans" + icobase = 'icons/mob/human_races/r_harpy_vr.dmi' + deform = 'icons/mob/human_races/r_def_harpy_vr.dmi' + tail = "tail" + icobase_tail = 1 + unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch, /datum/unarmed_attack/bite) + num_alternate_languages = 3 + secondary_langs = list(LANGUAGE_BIRDSONG, LANGUAGE_UNATHI) + species_language = LANGUAGE_UNATHI + name_language = null + color_mult = 1 + genders = list(MALE, FEMALE, PLURAL, NEUTER) + inherent_verbs = list(/mob/living/proc/flying_toggle,/mob/living/proc/flying_vore_toggle,/mob/living/proc/start_wings_hovering,/mob/living/carbon/human/proc/tie_hair) + digi_allowed = TRUE + + min_age = 18 + max_age = 80 + + soft_landing = TRUE + + base_color = "#EECEB3" + + blurb = "An Avian species, coming from a distant planet, the Rapalas are the very proud race.\ + Sol researchers have commented on them having a very close resemblance to the mythical race called 'Harpies',\ + who are known for having massive winged arms and talons as feet. They've been clocked at speeds of over 35 miler per hour chasing the planet's many fish-like fauna.\ + The Rapalan's home-world 'Verita' is a strangely habitable gas giant, while no physical earth exists, there are fertile floating islands orbiting around the planet from past asteroid activity." + + wikilink="https://wiki.vore-station.net/Backstory#Rapala" + + catalogue_data = list(/datum/category_item/catalogue/fauna/rapala) + + spawn_flags = SPECIES_CAN_JOIN + appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR + + + heat_discomfort_strings = list( + "Your feathers prickle in the heat.", + "You feel uncomfortably warm.", + "Your overheated skin itches." + ) + +/datum/species/teshari + name = SPECIES_TESHARI + name_plural = "Tesharii" + blurb = "A race of feathered raptors who developed alongside the Skrell, inhabiting \ + the polar tundral regions outside of Skrell territory. Extremely fragile, they developed \ + hunting skills that emphasized taking out their prey without themselves getting hit. They \ + are only recently becoming known on human stations after reaching space with Skrell assistance." + wikilink="https://wiki.vore-station.net/Teshari" + catalogue_data = list(/datum/category_item/catalogue/fauna/teshari) + + num_alternate_languages = 3 + secondary_langs = list(LANGUAGE_SCHECHI, LANGUAGE_SKRELLIAN) + name_language = LANGUAGE_SCHECHI + species_language = LANGUAGE_SCHECHI + + min_age = 18 + max_age = 45 + + economic_modifier = 6 + + health_hud_intensity = 3 + + male_sneeze_sound = list('sound/effects/mob_effects/tesharisneeze.ogg','sound/effects/mob_effects/tesharisneezeb.ogg') + female_sneeze_sound = list('sound/effects/mob_effects/tesharisneeze.ogg','sound/effects/mob_effects/tesharisneezeb.ogg') + male_sneeze_sound = 'sound/effects/mob_effects/tesharisneeze.ogg' + female_sneeze_sound = 'sound/effects/mob_effects/tesharisneeze.ogg' + center_offset = 0 + + blood_color = "#D514F7" + flesh_color = "#5F7BB0" + base_color = "#001144" + color_mult = 1 + tail = "seromitail" + icobase_tail = 1 + reagent_tag = IS_TESHARI + + move_trail = /obj/effect/decal/cleanable/blood/tracks/paw + + icobase = 'icons/mob/human_races/r_teshari_vr.dmi' + deform = 'icons/mob/human_races/r_teshari_vr.dmi' + damage_overlays = 'icons/mob/human_races/masks/dam_teshari.dmi' + damage_mask = 'icons/mob/human_races/masks/dam_mask_teshari.dmi' + blood_mask = 'icons/mob/human_races/masks/blood_teshari.dmi' + suit_storage_icon = 'icons/inventory/suit_store/mob_teshari.dmi' + vore_belly_default_variant = "T" //Teshari belly sprite + + fire_icon_state = "generic" // Humanoid is too big for them and spriting a new one is really annoying. + + slowdown = -1 + snow_movement = -2 // Ignores light snow + item_slowdown_mod = 2 // Tiny birds don't like heavy things + total_health = 50 + brute_mod = 1.35 + burn_mod = 1.35 + mob_size = MOB_MEDIUM + pass_flags = PASSTABLE + holder_type = /obj/item/holder/human +// short_sighted = 1 + has_vibration_sense = TRUE + blood_volume = 400 + hunger_factor = 0.2 + soft_landing = TRUE + agility = 90 + + ambiguous_genders = TRUE + genders = list(MALE, FEMALE, PLURAL, NEUTER) + + spawn_flags = SPECIES_CAN_JOIN + appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_EYE_COLOR + + body_temperature = 270 + + cold_level_1 = 180 //Default 260 + cold_level_2 = 130 //Default 200 + cold_level_3 = 70 //Default 120 + + breath_cold_level_1 = 180 //Default 240 - Lower is better + breath_cold_level_2 = 100 //Default 180 + breath_cold_level_3 = 60 //Default 100 + + heat_level_1 = 330 //Default 360 + heat_level_2 = 370 //Default 400 + heat_level_3 = 600 //Default 1000 + + breath_heat_level_1 = 350 //Default 380 - Higher is better + breath_heat_level_2 = 400 //Default 450 + breath_heat_level_3 = 800 //Default 1250 + + heat_discomfort_level = 295 + heat_discomfort_strings = list( + "Your feathers prickle in the heat.", + "You feel uncomfortably warm.", + "Your hands and feet feel hot as your body tries to regulate heat", + ) + cold_discomfort_level = 180 + cold_discomfort_strings = list( + "You feel a bit chilly.", + "You fluff up your feathers against the cold.", + "You move your arms closer to your body to shield yourself from the cold.", + "You press your ears against your head to conserve heat", + "You start to feel the cold on your skin", + ) + + minimum_breath_pressure = 12 //Smaller, so needs less air + + has_limbs = list( + BP_TORSO = list("path" = /obj/item/organ/external/chest), + BP_GROIN = list("path" = /obj/item/organ/external/groin), + BP_HEAD = list("path" = /obj/item/organ/external/head/teshari), + BP_L_ARM = list("path" = /obj/item/organ/external/arm), + BP_R_ARM = list("path" = /obj/item/organ/external/arm/right), + BP_L_LEG = list("path" = /obj/item/organ/external/leg), + BP_R_LEG = list("path" = /obj/item/organ/external/leg/right), + BP_L_HAND = list("path" = /obj/item/organ/external/hand/teshari), + BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/teshari), + BP_L_FOOT = list("path" = /obj/item/organ/external/foot/teshari), + BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/teshari) + ) + + has_organ = list( + O_HEART = /obj/item/organ/internal/heart, + O_LUNGS = /obj/item/organ/internal/lungs, + O_VOICE = /obj/item/organ/internal/voicebox, + O_LIVER = /obj/item/organ/internal/liver, + O_KIDNEYS = /obj/item/organ/internal/kidneys, + O_BRAIN = /obj/item/organ/internal/brain, + O_EYES = /obj/item/organ/internal/eyes, + O_STOMACH = /obj/item/organ/internal/stomach, + O_INTESTINE = /obj/item/organ/internal/intestine + ) + + unarmed_types = list( + /datum/unarmed_attack/claws, + /datum/unarmed_attack/bite/sharp, + /datum/unarmed_attack/stomp/weak + ) + + inherent_verbs = list( + ///mob/living/carbon/human/proc/sonar_ping, + /mob/living/proc/hide, + /mob/living/proc/toggle_pass_table + ) + + default_emotes = list( + /decl/emote/audible/teshsqueak, + /decl/emote/audible/teshchirp, + /decl/emote/audible/teshtrill + ) + + footstep = FOOTSTEP_MOB_TESHARI + +/datum/species/teshari/equip_survival_gear(var/mob/living/carbon/human/H) + ..() + if(!(H.client?.prefs?.shoe_hater)) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes) +/* +/datum/species/teshari/handle_falling(mob/living/carbon/human/H, atom/hit_atom, damage_min, damage_max, silent, planetary) + + // Tesh can glide to save themselves from some falls. Basejumping bird + // without parachute, or falling bird without free wings, goes splat. + + // Are we landing from orbit, or handcuffed/unconscious/tied to something? + if(planetary || !istype(H) || H.incapacitated(INCAPACITATION_DEFAULT|INCAPACITATION_DISABLED)) + return ..() + + // Are we landing on a turf? Not sure how this could not be the case, but let's be safe. + var/turf/landing = get_turf(hit_atom) + if(!istype(landing)) + return ..() + + if(H.buckled) + if(!silent) + to_chat(H, span_warning("You try to spread your wings to slow your fall, but \the [H.buckled] weighs you down!")) + return ..() + + // Is there enough air to flap against? + var/datum/gas_mixture/environment = landing.return_air() + if(!environment || environment.return_pressure() < (ONE_ATMOSPHERE * 0.75)) + if(!silent) + to_chat(H, span_warning("You spread your wings to slow your fall, but the air is too thin!")) + return ..() + + // Are we wearing a space suit? + if(H.wear_suit) + for(var/blacklisted_type in flight_suit_blacklisted_types) + if(istype(H.wear_suit, blacklisted_type)) + if(!silent) + to_chat(H, span_warning("You try to spread your wings to slow your fall, but \the [H.wear_suit] is in the way!")) + return ..() + + // Do we have working wings? + for(var/bp in flight_bodyparts) + var/obj/item/organ/external/E = H.organs_by_name[bp] + if(!istype(E) || !E.is_usable() || E.is_broken() || E.is_stump()) + if(!silent) + to_chat(H, span_warning("You try to spread your wings to slow your fall, but they won't hold your weight!")) + return ..() + + // Handled! + if(!silent) + to_chat(H, span_notice("You catch the air in your wings and greatly slow your fall.")) + landing.visible_message(span_infoplain(span_bold("\The [H]") + " glides down from above, landing safely.")) + H.Stun(1) + playsound(H, "rustle", 25, 1) + return TRUE +*/ + + + +/datum/species/crew_shadekin + name = SPECIES_SHADEKIN_CREW + name_plural = "Black-Eyed Shadekin" + icobase = 'icons/mob/human_races/r_shadekin_vr.dmi' + deform = 'icons/mob/human_races/r_shadekin_vr.dmi' + tail = "tail" + icobase_tail = 1 + blurb = "Very little is known about these creatures. They appear to be largely mammalian in appearance. \ + Seemingly very rare to encounter, there have been widespread myths of these creatures the galaxy over, \ + but next to no verifiable evidence to their existence. However, they have recently been more verifiably \ + documented in the Virgo system, following a mining bombardment of Virgo 3. The crew of NSB Adephagia have \ + taken to calling these creatures 'Shadekin', and the name has generally stuck and spread. " //TODO: Something more fitting for black-eyes + wikilink = "https://wiki.vore-station.net/Shadekin" + catalogue_data = list(/datum/category_item/catalogue/fauna/shadekin) + digi_allowed = TRUE + + language = LANGUAGE_SHADEKIN + name_language = LANGUAGE_SHADEKIN + species_language = LANGUAGE_SHADEKIN + secondary_langs = list(LANGUAGE_SHADEKIN) + num_alternate_languages = 3 + unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) + rarity_value = 5 //INTERDIMENSIONAL FLUFFERS + + inherent_verbs = list(/mob/proc/adjust_hive_range) + + siemens_coefficient = 0 + darksight = 10 + + slowdown = 0.5 + item_slowdown_mod = 1.5 + + total_health = 75 + brute_mod = 1.25 // Frail + burn_mod = 1.25 // Furry + blood_volume = 500 + hunger_factor = 0.2 + + warning_low_pressure = 50 + hazard_low_pressure = -1 + + warning_high_pressure = 300 + hazard_high_pressure = INFINITY + + cold_level_1 = -1 //Immune to cold + cold_level_2 = -1 + cold_level_3 = -1 + + heat_level_1 = 850 //Resistant to heat + heat_level_2 = 1000 + heat_level_3 = 1150 + + flags = NO_DNA | NO_SLEEVE + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE + + reagent_tag = IS_SHADEKIN // for shadekin-unqiue chem interactions + + flesh_color = "#FFC896" + blood_color = "#A10808" + base_color = "#f0f0f0" + color_mult = 1 + + //has_glowing_eyes = TRUE // Applicable through traits. + + male_cough_sounds = null + female_cough_sounds = null + male_sneeze_sound = null + female_sneeze_sound = null + + speech_bubble_appearance = "ghost" + + genders = list(MALE, FEMALE, PLURAL, NEUTER) + + breath_type = null + poison_type = null + water_breather = TRUE //They do not quite breathe... + + appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_SKIN_COLOR | HAS_UNDERWEAR + + move_trail = /obj/effect/decal/cleanable/blood/tracks/paw + + has_organ = list( + O_HEART = /obj/item/organ/internal/heart, + O_VOICE = /obj/item/organ/internal/voicebox, + O_LIVER = /obj/item/organ/internal/liver, + O_KIDNEYS = /obj/item/organ/internal/kidneys, + O_BRAIN = /obj/item/organ/internal/brain, + O_EYES = /obj/item/organ/internal/eyes, + O_STOMACH = /obj/item/organ/internal/stomach, + O_INTESTINE = /obj/item/organ/internal/intestine + ) + + has_limbs = list( + BP_TORSO = list("path" = /obj/item/organ/external/chest/crewkin), + BP_GROIN = list("path" = /obj/item/organ/external/groin/crewkin), + BP_HEAD = list("path" = /obj/item/organ/external/head/crewkin), + BP_L_ARM = list("path" = /obj/item/organ/external/arm/crewkin), + BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/crewkin), + BP_L_LEG = list("path" = /obj/item/organ/external/leg/crewkin), + BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/crewkin), + BP_L_HAND = list("path" = /obj/item/organ/external/hand/crewkin), + BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/crewkin), + BP_L_FOOT = list("path" = /obj/item/organ/external/foot/crewkin), + BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/crewkin) + ) + +/datum/species/crew_shadekin/get_bodytype() + return SPECIES_SHADEKIN + +//These species are not really species but are just there for custom species selection + +/datum/species/fl_zorren + name = SPECIES_FENNEC + name_plural = "Fennec" + icobase = 'icons/mob/human_races/r_fennec_vr.dmi' + deform = 'icons/mob/human_races/r_def_fennec.dmi' + tail = "tail" + icobase_tail = 1 + unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) + num_alternate_languages = 3 + secondary_langs = list(LANGUAGE_TERMINUS) + name_language = LANGUAGE_TERMINUS + species_language = LANGUAGE_TERMINUS + inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds,/mob/living/proc/shred_limb,/mob/living/carbon/human/proc/tie_hair) + digi_allowed = TRUE + + min_age = 18 + max_age = 80 + + //primitive_form = "" //We don't have fennec-monkey sprites. + spawn_flags = SPECIES_IS_RESTRICTED + appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR + genders = list(MALE, FEMALE, PLURAL, NEUTER) + + flesh_color = "#AFA59E" + base_color = "#333333" + blood_color = "#240bc4" + color_mult = 1 + + heat_discomfort_strings = list( + "Your fur prickles in the heat.", + "You feel uncomfortably warm.", + "Your overheated skin itches." + ) + +/datum/species/xenohybrid + name = SPECIES_XENOHYBRID + name_plural = "Xenomorphs" + icobase = 'icons/mob/human_races/r_xenomorph.dmi' + deform = 'icons/mob/human_races/r_def_xenomorph.dmi' + tail = "tail" + icobase_tail = 1 + unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) + darksight = 4 //Better hunters in the dark. + hunger_factor = 0.1 //In exchange, they get hungry a tad faster. + num_alternate_languages = 3 + digi_allowed = TRUE + + min_age = 18 + max_age = 80 + + blurb = "Xenomorphs hybrids are a mixture of xenomorph DNA and some other humanoid species. \ + Xenomorph hyrids mostly have had had their natural aggression removed due to the gene modification process \ + although there are some exceptions, such as when they are harmed. Most xenomorph hybrids are female, due to their natural xenomorph genes, \ + but there are multiple exceptions. All xenomorph hybrids have had their ability to lay eggs containing facehuggers \ + removed if they had the ability to, although hybrids that previously contained this ability is extremely rare." + // No wiki page for xenohybrids at present + + //primitive_form = "" //None for these guys + + spawn_flags = SPECIES_IS_RESTRICTED + appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR + genders = list(MALE, FEMALE, PLURAL, NEUTER) + + blood_color = "#12ff12" + flesh_color = "#201730" + base_color = "#201730" + + heat_discomfort_strings = list( + "Your chitin feels extremely warm.", + "You feel uncomfortably warm.", + "Your chitin feels hot." + ) + +/datum/species/altevian + name = SPECIES_ALTEVIAN + name_plural = "Altevians" + icobase = 'icons/mob/human_races/r_altevian.dmi' + deform = 'icons/mob/human_races/r_def_altevian.dmi' + unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) + num_alternate_languages = 3 + secondary_langs = list(LANGUAGE_TAVAN) + species_language = LANGUAGE_TAVAN + name_language = null + color_mult = 1 + inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) + digi_allowed = TRUE + + min_age = 18 + max_age = 80 + + blurb = "The Altevian are a species of tall, rodent humanoids that are akin to rats for their features. \ + The Altevian, unlike most species, do not have a home planet, nor system, adopting a fully nomadic lifestyle \ + for their survival across the stars. Instead, they have opted to live in massive super capital-class colony-ships \ + with a flagship as their place they would call home." + + wikilink="https://wiki.vore-station.net/Altevian" + + catalogue_data = list(/datum/category_item/catalogue/fauna/altevian) + + spawn_flags = SPECIES_CAN_JOIN + appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR + + flesh_color = "#AFA59E" + base_color = "#777777" + + genders = list(MALE, FEMALE, PLURAL, NEUTER) + + burn_mod = 1.15 + hunger_factor = 0.04 + can_zero_g_move = TRUE + + heat_discomfort_strings = list( + "Your fur prickles in the heat.", + "You feel uncomfortably warm.", + "Your overheated skin itches." + ) + + has_limbs = list( + BP_TORSO = list("path" = /obj/item/organ/external/chest), + BP_GROIN = list("path" = /obj/item/organ/external/groin), + BP_HEAD = list("path" = /obj/item/organ/external/head), + BP_L_ARM = list("path" = /obj/item/organ/external/arm), + BP_R_ARM = list("path" = /obj/item/organ/external/arm/right), + BP_L_LEG = list("path" = /obj/item/organ/external/leg), + BP_R_LEG = list("path" = /obj/item/organ/external/leg/right), + BP_L_HAND = list("path" = /obj/item/organ/external/hand), + BP_R_HAND = list("path" = /obj/item/organ/external/hand/right), + BP_L_FOOT = list("path" = /obj/item/organ/external/foot), + BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right) + ) + + +///////////////////// +/////SPIDER RACE///// +///////////////////// +/datum/species/spider //These actually look pretty damn spooky! + name = SPECIES_VASILISSAN + name_plural = "Vasilissans" + icobase = 'icons/mob/human_races/r_spider.dmi' + deform = 'icons/mob/human_races/r_def_spider.dmi' + unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) + darksight = 8 //Can see completely in the dark. They are spiders, after all. Not that any of this matters because people will be using custom race. + slowdown = -0.15 //Small speedboost, as they've got a bunch of legs. Or something. I dunno. + brute_mod = 0.8 //20% brute damage reduction + burn_mod = 1.15 //15% burn damage increase. They're spiders. Aerosol can+lighter = dead spiders. + throwforce_absorb_threshold = 10 + digi_allowed = TRUE + + num_alternate_languages = 3 + species_language = LANGUAGE_VESPINAE + secondary_langs = list(LANGUAGE_VESPINAE) + color_mult = 1 + tail = "tail" //Spider tail. + icobase_tail = 1 + + inherent_verbs = list( + /mob/living/carbon/human/proc/check_silk_amount, + /mob/living/carbon/human/proc/toggle_silk_production, + /mob/living/carbon/human/proc/weave_structure, + /mob/living/carbon/human/proc/weave_item, + /mob/living/carbon/human/proc/set_silk_color, + /mob/living/carbon/human/proc/tie_hair) + + min_age = 18 + max_age = 80 + + blurb = "Vasilissans are a tall, lanky, spider like people. \ + Each having four eyes, an extra four, large legs sprouting from their back, and a chitinous plating on their body, and the ability to spit webs \ + from their mandible lined mouths. They are a recent discovery by Nanotrasen, only being discovered roughly seven years ago. \ + Before they were found they built great cities out of their silk, being united and subjugated in warring factions under great “Star Queens” \ + Who forced the working class to build huge, towering cities to attempt to reach the stars, which they worship as gems of great spiritual and magical significance." + + wikilink = "https://wiki.vore-station.net/Vasilissans" + + catalogue_data = list(/datum/category_item/catalogue/fauna/vasilissan) + + hazard_low_pressure = 20 //Prevents them from dying normally in space. Special code handled below. + cold_level_1 = -1 // All cold debuffs are handled below in handle_environment_special + cold_level_2 = -1 + cold_level_3 = -1 + + //primitive_form = SPECIES_MONKEY //I dunno. Replace this in the future. + + flags = NO_MINOR_CUT + spawn_flags = SPECIES_CAN_JOIN + appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR + + genders = list(MALE, FEMALE, PLURAL, NEUTER) + + flesh_color = "#AFA59E" //Gray-ish. Not sure if this is really needed, but eh. + base_color = "#333333" //Blackish-gray + blood_color = "#0952EF" //Spiders have blue blood. + + is_weaver = TRUE + silk_reserve = 500 + silk_max_reserve = 1000 + + climb_mult = 0.75 + +/datum/species/spider/handle_environment_special(var/mob/living/carbon/human/H) + if(H.stat == DEAD) // If they're dead they won't need anything. + return + + if(H.bodytemperature <= 260) //If they're really cold, they go into stasis. + var/coldshock = 0 + if(H.bodytemperature <= 260 && H.bodytemperature >= 200) //Chilly. + coldshock = 4 //This will begin to knock them out until they run out of oxygen and suffocate or until someone finds them. + H.eye_blurry = 5 //Blurry vision in the cold. + if(H.bodytemperature <= 199 && H.bodytemperature >= 100) //Extremely cold. Even in somewhere like the server room it takes a while for bodytemp to drop this low. + coldshock = 8 + H.eye_blurry = 5 + if(H.bodytemperature <= 99) //Insanely cold. + coldshock = 16 + H.eye_blurry = 5 + H.shock_stage = min(H.shock_stage + coldshock, 160) //cold hurts and gives them pain messages, eventually weakening and paralysing, but doesn't damage. + return + +/datum/species/werebeast + name = SPECIES_WEREBEAST + name_plural = "Werebeasts" + icobase = 'icons/mob/human_races/r_werebeast.dmi' + deform = 'icons/mob/human_races/r_def_werebeast.dmi' + icon_template = 'icons/mob/human_races/r_werebeast.dmi' + tail = "tail" + unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) + total_health = 200 + brute_mod = 0.85 + burn_mod = 0.85 + metabolic_rate = 2 + item_slowdown_mod = 0.25 + hunger_factor = 0.4 + darksight = 8 + mob_size = MOB_LARGE + num_alternate_languages = 3 + secondary_langs = list(LANGUAGE_CANILUNZT) + name_language = LANGUAGE_CANILUNZT + species_language = LANGUAGE_CANILUNZT + primitive_form = SPECIES_MONKEY_VULPKANIN + color_mult = 1 + icon_height = 64 + can_climb = TRUE + climbing_delay = 1 + + min_age = 18 + max_age = 200 + + blurb = "Big buff werewolves. These are a limited functionality event species that are not balanced for regular gameplay. Adminspawn only." + + wikilink="N/A" + + catalogue_data = list(/datum/category_item/catalogue/fauna/vulpkanin) + + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE + appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_EYE_COLOR + + flesh_color = "#AFA59E" + base_color = "#777777" + + genders = list(MALE, FEMALE, PLURAL, NEUTER) + + heat_discomfort_strings = list( + "Your fur prickles in the heat.", + "You feel uncomfortably warm.", + "Your overheated skin itches." + ) + + has_limbs = list( + BP_TORSO = list("path" = /obj/item/organ/external/chest), + BP_GROIN = list("path" = /obj/item/organ/external/groin), + BP_HEAD = list("path" = /obj/item/organ/external/head/werebeast), + BP_L_ARM = list("path" = /obj/item/organ/external/arm), + BP_R_ARM = list("path" = /obj/item/organ/external/arm/right), + BP_L_LEG = list("path" = /obj/item/organ/external/leg), + BP_R_LEG = list("path" = /obj/item/organ/external/leg/right), + BP_L_HAND = list("path" = /obj/item/organ/external/hand), + BP_R_HAND = list("path" = /obj/item/organ/external/hand/right), + BP_L_FOOT = list("path" = /obj/item/organ/external/foot), + BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right) + ) + + +/// XENOCHIMERA +/datum/species/xenochimera //Scree's race. + name = SPECIES_XENOCHIMERA + name_plural = "Xenochimeras" + icobase = 'icons/mob/human_races/r_xenochimera.dmi' + deform = 'icons/mob/human_races/r_def_xenochimera.dmi' + unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/chimera, /datum/unarmed_attack/bite/sharp) + darksight = 8 //critters with instincts to hide in the dark need to see in the dark - about as good as tajara. + slowdown = -0.2 //scuttly, but not as scuttly as a tajara or a teshari. + brute_mod = 0.8 //About as tanky to brute as a Unathi. They'll probably snap and go feral when hurt though. + burn_mod = 1.15 //As vulnerable to burn as a Tajara. + base_species = "Xenochimera" + selects_bodytype = SELECTS_BODYTYPE_CUSTOM + digi_allowed = TRUE + has_vibration_sense = TRUE + + num_alternate_languages = 3 + species_language = null + secondary_langs = list("Sol Common") + //color_mult = 1 //It seemed to work fine in testing, but I've been informed it's unneeded. + tail = "tail" + icobase_tail = 1 + inherent_verbs = list( + /mob/living/carbon/human/proc/reconstitute_form, + ///mob/living/carbon/human/proc/sonar_ping, + /mob/living/carbon/human/proc/tie_hair) + + virus_immune = 1 // They practically ARE one. + min_age = 18 + max_age = 80 + + blurb = "Some amalgamation of different species from across the universe,with extremely unstable DNA, making them unfit for regular cloners. \ + Widely known for their voracious nature and violent tendencies when stressed or left unfed for long periods of time. \ + Most, if not all chimeras possess the ability to undergo some type of regeneration process, at the cost of energy." + + wikilink = "https://wiki.vore-station.net/Xenochimera" + + catalogue_data = list(/datum/category_item/catalogue/fauna/xenochimera) + + hazard_low_pressure = -1 //Prevents them from dying normally in space. Special code handled below. + cold_level_1 = -1 // All cold debuffs are handled below in handle_environment_special + cold_level_2 = -1 + cold_level_3 = -1 + + //primitive_form = SPECIES_MONKEY_TAJ + + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE//Whitelisted as restricted is broken. + flags = NO_SLEEVE | NO_DNA | NO_INFECT // | NO_DEFIB // Dying as a chimera is, quite literally, a death sentence. Well, if it wasn't for their revive, that is. Leaving NO_DEFIB there for the future/in case reversion to old 'chimera no-defib. + appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR + + genders = list(MALE, FEMALE, PLURAL, NEUTER) + + has_organ = list( //Same organ list as tajarans, except for their SPECIAL BRAIN. + O_HEART = /obj/item/organ/internal/heart, + O_LUNGS = /obj/item/organ/internal/lungs, + O_VOICE = /obj/item/organ/internal/voicebox, + O_LIVER = /obj/item/organ/internal/liver, + O_KIDNEYS = /obj/item/organ/internal/kidneys, + O_BRAIN = /obj/item/organ/internal/brain, + O_EYES = /obj/item/organ/internal/eyes, + O_STOMACH = /obj/item/organ/internal/stomach, + O_INTESTINE = /obj/item/organ/internal/intestine + ) + + flesh_color = "#AFA59E" + base_color = "#333333" + blood_color = "#14AD8B" + + reagent_tag = IS_CHIMERA + +/datum/species/xenochimera/handle_environment_special(var/mob/living/carbon/human/H) + //If they're KO'd/dead, or reviving, they're probably not thinking a lot about much of anything. + if(!H.stat || !(H.revive_ready == REVIVING_NOW || H.revive_ready == REVIVING_DONE)) + handle_feralness(H) + + //While regenerating + if(H.revive_ready == REVIVING_NOW || H.revive_ready == REVIVING_DONE) + H.weakened = 5 + H.canmove = 0 + H.does_not_breathe = TRUE + var/regen_sounds = H.regen_sounds + if(prob(2)) // 2% chance of playing squelchy noise while reviving, which is run roughly every 2 seconds/tick while regenerating. + playsound(H, pick(regen_sounds), 30) + H.visible_message(span_danger("

" + span_huge("[H.name]'s motionless form shudders grotesquely, rippling unnaturally.") + "

")) + + //Cold/pressure effects when not regenerating + else + var/datum/gas_mixture/environment = H.loc.return_air() + var/pressure2 = environment.return_pressure() + var/adjusted_pressure2 = H.calculate_affecting_pressure(pressure2) + + //Very low pressure damage + if(adjusted_pressure2 <= 20) + H.take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure") + //they handle areas where they can't breathe better than most, but it still lowers their effective health as well as all the other bad stuff that comes with unbreathable environments + if(H.getOxyLoss() >= 50) + H.does_not_breathe = TRUE + + //Cold hurts and gives them pain messages, eventually weakening and paralysing, but doesn't damage or trigger feral. + //NB: 'body_temperature' used here is the 'setpoint' species var + var/temp_diff = body_temperature - H.bodytemperature + if(temp_diff >= 50) + H.shock_stage = min(H.shock_stage + (temp_diff/20), 160) // Divided by 20 is the same as previous numbers, but a full scale + H.eye_blurry = max(5,H.eye_blurry) + +/datum/species/xenochimera/proc/handle_feralness(var/mob/living/carbon/human/H) + //first, calculate how stressed the chimera is + var/laststress = 0 + var/obj/item/organ/internal/brain/B = H.internal_organs_by_name[O_BRAIN] + if(B) //if you don't have a chimera brain in a chimera body somehow, you don't get the feraless protection + laststress = B.laststress + + //Low-ish nutrition has messages and can eventually cause feralness + var/hunger = max(0, 150 - H.nutrition) + + //pain makes feralness a thing + var/shock = 0.75*H.traumatic_shock + + //Caffeinated or otherwise overexcited xenochimera can become feral and have special messages + var/jittery = max(0, H.jitteriness - 100) + + //To reduce distant object references + var/feral = H.feral + + //Are we in danger of ferality? + var/danger = FALSE + var/feral_state = FALSE + + //finally, calculate the current stress total the chimera is operating under, and the cause + var/currentstress = (hunger + shock + jittery) + var/cause = "stress" + if(hunger > shock && hunger > jittery) + cause = "hunger" + else if (shock > hunger && shock > jittery) + cause = "shock" + else if (jittery > shock && jittery > hunger) + cause = "jittery" + + //check to see if they go feral if they weren't before + if(!feral && !isbelly(H.loc)) + // if stress is below 15, no chance of snapping. Also if they weren't feral before, they won't suddenly become feral unless they get MORE stressed + if((currentstress > laststress) && prob(clamp(currentstress-15, 0, 100)) ) + go_feral(H, currentstress, cause) + feral = currentstress //update the local var + + //they didn't go feral, give 'em a chance of hunger messages + else if(H.nutrition <= 200 && prob(0.5)) + switch(H.nutrition) + if(150 to 200) + to_chat(H,span_info("You feel rather hungry. It might be a good idea to find some some food...")) + if(100 to 150) + to_chat(H,span_warning("You feel like you're going to snap and give in to your hunger soon... It would be for the best to find some [pick("food","prey")] to eat...")) + danger = TRUE + + //now the check's done, update their brain so it remembers how stressed they were + if(B && !isbelly(H.loc)) //another sanity check for brain implant shenanigans, also no you don't get to hide in a belly and get your laststress set to a huge amount to skip rolls + B.laststress = currentstress + + // Handle being feral + if(feral) + //We're feral + feral_state = TRUE + + //If they're still stressed, they stay feral + if(currentstress >= 15) + danger = TRUE + feral = max(feral, currentstress) + + else + feral = max(0,--feral) + + // Being in a belly or in the darkness decreases stress further. Helps mechanically reward players for staying in darkness + RP'ing appropriately. :9 + var/turf/T = get_turf(H) + if(feral && (isbelly(H.loc) || T.get_lumcount() <= 0.1)) + feral = max(0,--feral) + + //Set our real mob's var to our temp var + H.feral = feral + + //Did we just finish being feral? + if(!feral) + feral_state = FALSE + to_chat(H,span_info("Your thoughts start clearing, your feral urges having passed - for the time being, at least.")) + log_and_message_admins("is no longer feral.", H) + update_xenochimera_hud(H, danger, feral_state) + return + + //If they lose enough health to hit softcrit, handle_shock() will keep resetting this. Otherwise, pissed off critters will lose shock faster than they gain it. + H.shock_stage = max(H.shock_stage-(feral/20), 0) + + //Handle light/dark areas + var/turf/T = get_turf(H) + if(!T) + update_xenochimera_hud(H, danger, feral_state) + return //Nullspace + var/darkish = T.get_lumcount() <= 0.1 + + //Don't bother doing heavy lifting if we weren't going to give emotes anyway. + if(!prob(1)) + + //This is basically the 'lite' version of the below block. + var/list/nearby = H.living_mobs(world.view) + + //Not in the dark, or a belly, and out in the open. + if(!darkish && isturf(H.loc) && !isbelly(H.loc)) // Added specific check for if in belly + + //Always handle feral if nobody's around and not in the dark. + if(!nearby.len) + H.handle_feral() + + //Rarely handle feral if someone is around + else if(prob(1)) + H.handle_feral() + + //And bail + update_xenochimera_hud(H, danger, feral_state) + return + + // In the darkness, or "hidden", or in a belly. No need for custom scene-protection checks as it's just an occational infomessage. + if(darkish || !isturf(H.loc) || isbelly(H.loc)) // Specific check for if in belly. !isturf should do this, but JUST in case. + // If hurt, tell 'em to heal up + if (cause == "shock") + to_chat(H,span_info("This place seems safe, secure, hidden, a place to lick your wounds and recover...")) + + //If hungry, nag them to go and find someone or something to eat. + else if(cause == "hunger") + to_chat(H,span_info("Secure in your hiding place, your hunger still gnaws at you. You need to catch some food...")) + + //If jittery, etc + else if(cause == "jittery") + to_chat(H,span_info("sneakysneakyyesyesyescleverhidingfindthingsyessssss")) + + //Otherwise, just tell them to keep hiding. + else + to_chat(H,span_info("...safe...")) + + // NOT in the darkness + else + + //Twitch twitch + if(!H.stat) + H.emote("twitch") + + var/list/nearby = H.living_mobs(world.view) + + // Someone/something nearby + if(nearby.len) + var/M = pick(nearby) + if(cause == "shock") + to_chat(H,span_danger("You're hurt, in danger, exposed, and [M] looks to be a little too close for comfort...")) + else + to_chat(H,span_danger("Every movement, every flick, every sight and sound has your full attention, your hunting instincts on high alert... In fact, [M] looks extremely appetizing...")) + + // Nobody around + else + if(cause == "hunger") + to_chat(H,span_danger("Confusing sights and sounds and smells surround you - scary and disorienting it may be, but the drive to hunt, to feed, to survive, compels you.")) + else if(cause == "jittery") + to_chat(H,span_danger("yesyesyesyesyesyesgetthethingGETTHETHINGfindfoodsfindpreypounceyesyesyes")) + else + to_chat(H,span_danger("Confusing sights and sounds and smells surround you, this place is wrong, confusing, frightening. You need to hide, go to ground...")) + + // HUD update time + update_xenochimera_hud(H, danger, feral_state) + +/datum/species/xenochimera/proc/go_feral(var/mob/living/carbon/human/H, var/stress, var/cause) + // Going feral due to hunger + if(cause == "hunger") + to_chat(H,span_danger(span_large("Something in your mind flips, your instincts taking over, no longer able to fully comprehend your surroundings as survival becomes your primary concern - you must feed, survive, there is nothing else. Hunt. Eat. Hide. Repeat."))) + log_and_message_admins("has gone feral due to hunger.", H) + + // If they're hurt, chance of snapping. + else if(cause == "shock") + //If the majority of their shock is due to halloss, give them a different message (3x multiplier on check as halloss is 2x - meaning t_s must be at least 3x for other damage sources to be the greater part) + if(3*H.halloss >= H.traumatic_shock) + to_chat(H,span_danger(span_large("The pain! It stings! Got to get away! Your instincts take over, urging you to flee, to hide, to go to ground, get away from here..."))) + log_and_message_admins("has gone feral due to halloss.", H) + + //Majority due to other damage sources + else + to_chat(H,span_danger(span_large("Your fight-or-flight response kicks in, your injuries too much to simply ignore - you need to flee, to hide, survive at all costs - or destroy whatever is threatening you."))) + log_and_message_admins("has gone feral due to injury.", H) + + //No hungry or shock, but jittery + else if(cause == "jittery") + to_chat(H,span_warning(span_large("Suddenly, something flips - everything that moves is... potential prey. A plaything. This is great! Time to hunt!"))) + log_and_message_admins("has gone feral due to jitteriness.", H) + + else // catch-all just in case something weird happens + to_chat(H,span_warning(span_large("The stress of your situation is too much for you, and your survival instincts kick in!"))) + log_and_message_admins("has gone feral for unknown reasons.", H) + //finally, set their feral var + H.feral = stress + if(!H.stat) + H.emote("twitch") + +/datum/species/xenochimera/get_race_key() + var/datum/species/real = GLOB.all_species[base_species] + return real.race_key + +/datum/species/xenochimera/proc/update_xenochimera_hud(var/mob/living/carbon/human/H, var/danger, var/feral) + if(H.xenochimera_danger_display) + H.xenochimera_danger_display.invisibility = 0 + if(danger && feral) + H.xenochimera_danger_display.icon_state = "danger11" + else if(danger && !feral) + H.xenochimera_danger_display.icon_state = "danger10" + else if(!danger && feral) + H.xenochimera_danger_display.icon_state = "danger01" + else + H.xenochimera_danger_display.icon_state = "danger00" + + return + +/obj/screen/xenochimera + icon = 'icons/mob/chimerahud.dmi' + invisibility = 101 + +/obj/screen/xenochimera/danger_level + name = "danger level" + icon_state = "danger00" //first number is bool of whether or not we're in danger, second is whether or not we're feral + alpha = 200 diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities.dm similarity index 100% rename from code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm rename to code/modules/mob/living/carbon/human/species/station/station_special_abilities.dm diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm deleted file mode 100644 index 5ac162eb6f..0000000000 --- a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm +++ /dev/null @@ -1,469 +0,0 @@ -///////////////File for all snowflake/special races///////////////////////////// -/////Anything that is spectacularly special should be put in here/////////////// -//////////////////////////////////////////////////////////////////////////////// - - - -/datum/species/xenochimera //Scree's race. - name = SPECIES_XENOCHIMERA - name_plural = "Xenochimeras" - icobase = 'icons/mob/human_races/r_xenochimera.dmi' - deform = 'icons/mob/human_races/r_def_xenochimera.dmi' - unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/chimera, /datum/unarmed_attack/bite/sharp) - darksight = 8 //critters with instincts to hide in the dark need to see in the dark - about as good as tajara. - slowdown = -0.2 //scuttly, but not as scuttly as a tajara or a teshari. - brute_mod = 0.8 //About as tanky to brute as a Unathi. They'll probably snap and go feral when hurt though. - burn_mod = 1.15 //As vulnerable to burn as a Tajara. - base_species = "Xenochimera" - selects_bodytype = SELECTS_BODYTYPE_CUSTOM - digi_allowed = TRUE - has_vibration_sense = TRUE - - num_alternate_languages = 3 - species_language = null - secondary_langs = list("Sol Common") - //color_mult = 1 //It seemed to work fine in testing, but I've been informed it's unneeded. - tail = "tail" //Scree's tail. Can be disabled in the vore tab by choosing "hide species specific tail sprite" - icobase_tail = 1 - inherent_verbs = list( - /mob/living/carbon/human/proc/reconstitute_form, - ///mob/living/carbon/human/proc/sonar_ping, - /mob/living/carbon/human/proc/tie_hair) - - virus_immune = 1 // They practically ARE one. - min_age = 18 - max_age = 80 - - blurb = "Some amalgamation of different species from across the universe,with extremely unstable DNA, making them unfit for regular cloners. \ - Widely known for their voracious nature and violent tendencies when stressed or left unfed for long periods of time. \ - Most, if not all chimeras possess the ability to undergo some type of regeneration process, at the cost of energy." - - wikilink = "https://wiki.vore-station.net/Xenochimera" - - catalogue_data = list(/datum/category_item/catalogue/fauna/xenochimera) - - hazard_low_pressure = -1 //Prevents them from dying normally in space. Special code handled below. - cold_level_1 = -1 // All cold debuffs are handled below in handle_environment_special - cold_level_2 = -1 - cold_level_3 = -1 - - //primitive_form = SPECIES_MONKEY_TAJ - - spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE//Whitelisted as restricted is broken. - flags = NO_SLEEVE | NO_DNA | NO_INFECT // | NO_DEFIB // Dying as a chimera is, quite literally, a death sentence. Well, if it wasn't for their revive, that is. Leaving NO_DEFIB there for the future/in case reversion to old 'chimera no-defib. - appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR - - genders = list(MALE, FEMALE, PLURAL, NEUTER) - - has_organ = list( //Same organ list as tajarans, except for their SPECIAL BRAIN. - O_HEART = /obj/item/organ/internal/heart, - O_LUNGS = /obj/item/organ/internal/lungs, - O_VOICE = /obj/item/organ/internal/voicebox, - O_LIVER = /obj/item/organ/internal/liver, - O_KIDNEYS = /obj/item/organ/internal/kidneys, - O_BRAIN = /obj/item/organ/internal/brain/xenochimera, - O_EYES = /obj/item/organ/internal/eyes, - O_STOMACH = /obj/item/organ/internal/stomach, - O_INTESTINE = /obj/item/organ/internal/intestine - ) - - flesh_color = "#AFA59E" - base_color = "#333333" - blood_color = "#14AD8B" - - reagent_tag = IS_CHIMERA - -/datum/species/xenochimera/handle_environment_special(var/mob/living/carbon/human/H) - //If they're KO'd/dead, or reviving, they're probably not thinking a lot about much of anything. - if(!H.stat || !(H.revive_ready == REVIVING_NOW || H.revive_ready == REVIVING_DONE)) - handle_feralness(H) - - //While regenerating - if(H.revive_ready == REVIVING_NOW || H.revive_ready == REVIVING_DONE) - H.weakened = 5 - H.canmove = 0 - H.does_not_breathe = TRUE - var/regen_sounds = H.regen_sounds - if(prob(2)) // 2% chance of playing squelchy noise while reviving, which is run roughly every 2 seconds/tick while regenerating. - playsound(H, pick(regen_sounds), 30) - H.visible_message(span_danger("

" + span_huge("[H.name]'s motionless form shudders grotesquely, rippling unnaturally.") + "

")) - - //Cold/pressure effects when not regenerating - else - var/datum/gas_mixture/environment = H.loc.return_air() - var/pressure2 = environment.return_pressure() - var/adjusted_pressure2 = H.calculate_affecting_pressure(pressure2) - - //Very low pressure damage - if(adjusted_pressure2 <= 20) - H.take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure") - //they handle areas where they can't breathe better than most, but it still lowers their effective health as well as all the other bad stuff that comes with unbreathable environments - if(H.getOxyLoss() >= 50) - H.does_not_breathe = TRUE - - //Cold hurts and gives them pain messages, eventually weakening and paralysing, but doesn't damage or trigger feral. - //NB: 'body_temperature' used here is the 'setpoint' species var - var/temp_diff = body_temperature - H.bodytemperature - if(temp_diff >= 50) - H.shock_stage = min(H.shock_stage + (temp_diff/20), 160) // Divided by 20 is the same as previous numbers, but a full scale - H.eye_blurry = max(5,H.eye_blurry) - -/obj/item/organ/internal/brain/xenochimera - var/laststress = 0 - -/datum/species/xenochimera/proc/handle_feralness(var/mob/living/carbon/human/H) - //first, calculate how stressed the chimera is - var/laststress = 0 - var/obj/item/organ/internal/brain/xenochimera/B = H.internal_organs_by_name[O_BRAIN] - if(B) //if you don't have a chimera brain in a chimera body somehow, you don't get the feraless protection - laststress = B.laststress - - //Low-ish nutrition has messages and can eventually cause feralness - var/hunger = max(0, 150 - H.nutrition) - - //pain makes feralness a thing - var/shock = 0.75*H.traumatic_shock - - //Caffeinated or otherwise overexcited xenochimera can become feral and have special messages - var/jittery = max(0, H.jitteriness - 100) - - //To reduce distant object references - var/feral = H.feral - - //Are we in danger of ferality? - var/danger = FALSE - var/feral_state = FALSE - - //finally, calculate the current stress total the chimera is operating under, and the cause - var/currentstress = (hunger + shock + jittery) - var/cause = "stress" - if(hunger > shock && hunger > jittery) - cause = "hunger" - else if (shock > hunger && shock > jittery) - cause = "shock" - else if (jittery > shock && jittery > hunger) - cause = "jittery" - - //check to see if they go feral if they weren't before - if(!feral && !isbelly(H.loc)) - // if stress is below 15, no chance of snapping. Also if they weren't feral before, they won't suddenly become feral unless they get MORE stressed - if((currentstress > laststress) && prob(clamp(currentstress-15, 0, 100)) ) - go_feral(H, currentstress, cause) - feral = currentstress //update the local var - - //they didn't go feral, give 'em a chance of hunger messages - else if(H.nutrition <= 200 && prob(0.5)) - switch(H.nutrition) - if(150 to 200) - to_chat(H,span_info("You feel rather hungry. It might be a good idea to find some some food...")) - if(100 to 150) - to_chat(H,span_warning("You feel like you're going to snap and give in to your hunger soon... It would be for the best to find some [pick("food","prey")] to eat...")) - danger = TRUE - - //now the check's done, update their brain so it remembers how stressed they were - if(B && !isbelly(H.loc)) //another sanity check for brain implant shenanigans, also no you don't get to hide in a belly and get your laststress set to a huge amount to skip rolls - B.laststress = currentstress - - // Handle being feral - if(feral) - //We're feral - feral_state = TRUE - - //If they're still stressed, they stay feral - if(currentstress >= 15) - danger = TRUE - feral = max(feral, currentstress) - - else - feral = max(0,--feral) - - // Being in a belly or in the darkness decreases stress further. Helps mechanically reward players for staying in darkness + RP'ing appropriately. :9 - var/turf/T = get_turf(H) - if(feral && (isbelly(H.loc) || T.get_lumcount() <= 0.1)) - feral = max(0,--feral) - - //Set our real mob's var to our temp var - H.feral = feral - - //Did we just finish being feral? - if(!feral) - feral_state = FALSE - to_chat(H,span_info("Your thoughts start clearing, your feral urges having passed - for the time being, at least.")) - log_and_message_admins("is no longer feral.", H) - update_xenochimera_hud(H, danger, feral_state) - return - - //If they lose enough health to hit softcrit, handle_shock() will keep resetting this. Otherwise, pissed off critters will lose shock faster than they gain it. - H.shock_stage = max(H.shock_stage-(feral/20), 0) - - //Handle light/dark areas - var/turf/T = get_turf(H) - if(!T) - update_xenochimera_hud(H, danger, feral_state) - return //Nullspace - var/darkish = T.get_lumcount() <= 0.1 - - //Don't bother doing heavy lifting if we weren't going to give emotes anyway. - if(!prob(1)) - - //This is basically the 'lite' version of the below block. - var/list/nearby = H.living_mobs(world.view) - - //Not in the dark, or a belly, and out in the open. - if(!darkish && isturf(H.loc) && !isbelly(H.loc)) // Added specific check for if in belly - - //Always handle feral if nobody's around and not in the dark. - if(!nearby.len) - H.handle_feral() - - //Rarely handle feral if someone is around - else if(prob(1)) - H.handle_feral() - - //And bail - update_xenochimera_hud(H, danger, feral_state) - return - - // In the darkness, or "hidden", or in a belly. No need for custom scene-protection checks as it's just an occational infomessage. - if(darkish || !isturf(H.loc) || isbelly(H.loc)) // Specific check for if in belly. !isturf should do this, but JUST in case. - // If hurt, tell 'em to heal up - if (cause == "shock") - to_chat(H,span_info("This place seems safe, secure, hidden, a place to lick your wounds and recover...")) - - //If hungry, nag them to go and find someone or something to eat. - else if(cause == "hunger") - to_chat(H,span_info("Secure in your hiding place, your hunger still gnaws at you. You need to catch some food...")) - - //If jittery, etc - else if(cause == "jittery") - to_chat(H,span_info("sneakysneakyyesyesyescleverhidingfindthingsyessssss")) - - //Otherwise, just tell them to keep hiding. - else - to_chat(H,span_info("...safe...")) - - // NOT in the darkness - else - - //Twitch twitch - if(!H.stat) - H.emote("twitch") - - var/list/nearby = H.living_mobs(world.view) - - // Someone/something nearby - if(nearby.len) - var/M = pick(nearby) - if(cause == "shock") - to_chat(H,span_danger("You're hurt, in danger, exposed, and [M] looks to be a little too close for comfort...")) - else - to_chat(H,span_danger("Every movement, every flick, every sight and sound has your full attention, your hunting instincts on high alert... In fact, [M] looks extremely appetizing...")) - - // Nobody around - else - if(cause == "hunger") - to_chat(H,span_danger("Confusing sights and sounds and smells surround you - scary and disorienting it may be, but the drive to hunt, to feed, to survive, compels you.")) - else if(cause == "jittery") - to_chat(H,span_danger("yesyesyesyesyesyesgetthethingGETTHETHINGfindfoodsfindpreypounceyesyesyes")) - else - to_chat(H,span_danger("Confusing sights and sounds and smells surround you, this place is wrong, confusing, frightening. You need to hide, go to ground...")) - - // HUD update time - update_xenochimera_hud(H, danger, feral_state) - -/datum/species/xenochimera/proc/go_feral(var/mob/living/carbon/human/H, var/stress, var/cause) - // Going feral due to hunger - if(cause == "hunger") - to_chat(H,span_danger(span_large("Something in your mind flips, your instincts taking over, no longer able to fully comprehend your surroundings as survival becomes your primary concern - you must feed, survive, there is nothing else. Hunt. Eat. Hide. Repeat."))) - log_and_message_admins("has gone feral due to hunger.", H) - - // If they're hurt, chance of snapping. - else if(cause == "shock") - //If the majority of their shock is due to halloss, give them a different message (3x multiplier on check as halloss is 2x - meaning t_s must be at least 3x for other damage sources to be the greater part) - if(3*H.halloss >= H.traumatic_shock) - to_chat(H,span_danger(span_large("The pain! It stings! Got to get away! Your instincts take over, urging you to flee, to hide, to go to ground, get away from here..."))) - log_and_message_admins("has gone feral due to halloss.", H) - - //Majority due to other damage sources - else - to_chat(H,span_danger(span_large("Your fight-or-flight response kicks in, your injuries too much to simply ignore - you need to flee, to hide, survive at all costs - or destroy whatever is threatening you."))) - log_and_message_admins("has gone feral due to injury.", H) - - //No hungry or shock, but jittery - else if(cause == "jittery") - to_chat(H,span_warning(span_large("Suddenly, something flips - everything that moves is... potential prey. A plaything. This is great! Time to hunt!"))) - log_and_message_admins("has gone feral due to jitteriness.", H) - - else // catch-all just in case something weird happens - to_chat(H,span_warning(span_large("The stress of your situation is too much for you, and your survival instincts kick in!"))) - log_and_message_admins("has gone feral for unknown reasons.", H) - //finally, set their feral var - H.feral = stress - if(!H.stat) - H.emote("twitch") - -/datum/species/xenochimera/get_race_key() - var/datum/species/real = GLOB.all_species[base_species] - return real.race_key - -/datum/species/xenochimera/proc/update_xenochimera_hud(var/mob/living/carbon/human/H, var/danger, var/feral) - if(H.xenochimera_danger_display) - H.xenochimera_danger_display.invisibility = 0 - if(danger && feral) - H.xenochimera_danger_display.icon_state = "danger11" - else if(danger && !feral) - H.xenochimera_danger_display.icon_state = "danger10" - else if(!danger && feral) - H.xenochimera_danger_display.icon_state = "danger01" - else - H.xenochimera_danger_display.icon_state = "danger00" - - return - -///////////////////// -/////SPIDER RACE///// -///////////////////// -/datum/species/spider //These actually look pretty damn spooky! - name = SPECIES_VASILISSAN - name_plural = "Vasilissans" - icobase = 'icons/mob/human_races/r_spider.dmi' - deform = 'icons/mob/human_races/r_def_spider.dmi' - unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) - darksight = 8 //Can see completely in the dark. They are spiders, after all. Not that any of this matters because people will be using custom race. - slowdown = -0.15 //Small speedboost, as they've got a bunch of legs. Or something. I dunno. - brute_mod = 0.8 //20% brute damage reduction - burn_mod = 1.15 //15% burn damage increase. They're spiders. Aerosol can+lighter = dead spiders. - throwforce_absorb_threshold = 10 - digi_allowed = TRUE - - num_alternate_languages = 3 - species_language = LANGUAGE_VESPINAE - secondary_langs = list(LANGUAGE_VESPINAE) - color_mult = 1 - tail = "tail" //Spider tail. - icobase_tail = 1 - - inherent_verbs = list( - /mob/living/carbon/human/proc/check_silk_amount, - /mob/living/carbon/human/proc/toggle_silk_production, - /mob/living/carbon/human/proc/weave_structure, - /mob/living/carbon/human/proc/weave_item, - /mob/living/carbon/human/proc/set_silk_color, - /mob/living/carbon/human/proc/tie_hair) - - min_age = 18 - max_age = 80 - - blurb = "Vasilissans are a tall, lanky, spider like people. \ - Each having four eyes, an extra four, large legs sprouting from their back, and a chitinous plating on their body, and the ability to spit webs \ - from their mandible lined mouths. They are a recent discovery by Nanotrasen, only being discovered roughly seven years ago. \ - Before they were found they built great cities out of their silk, being united and subjugated in warring factions under great “Star Queens” \ - Who forced the working class to build huge, towering cities to attempt to reach the stars, which they worship as gems of great spiritual and magical significance." - - wikilink = "https://wiki.vore-station.net/Vasilissans" - - catalogue_data = list(/datum/category_item/catalogue/fauna/vasilissan) - - hazard_low_pressure = 20 //Prevents them from dying normally in space. Special code handled below. - cold_level_1 = -1 // All cold debuffs are handled below in handle_environment_special - cold_level_2 = -1 - cold_level_3 = -1 - - //primitive_form = SPECIES_MONKEY //I dunno. Replace this in the future. - - flags = NO_MINOR_CUT - spawn_flags = SPECIES_CAN_JOIN - appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR - - genders = list(MALE, FEMALE, PLURAL, NEUTER) - - flesh_color = "#AFA59E" //Gray-ish. Not sure if this is really needed, but eh. - base_color = "#333333" //Blackish-gray - blood_color = "#0952EF" //Spiders have blue blood. - - is_weaver = TRUE - silk_reserve = 500 - silk_max_reserve = 1000 - - climb_mult = 0.75 - -/datum/species/spider/handle_environment_special(var/mob/living/carbon/human/H) - if(H.stat == DEAD) // If they're dead they won't need anything. - return - - if(H.bodytemperature <= 260) //If they're really cold, they go into stasis. - var/coldshock = 0 - if(H.bodytemperature <= 260 && H.bodytemperature >= 200) //Chilly. - coldshock = 4 //This will begin to knock them out until they run out of oxygen and suffocate or until someone finds them. - H.eye_blurry = 5 //Blurry vision in the cold. - if(H.bodytemperature <= 199 && H.bodytemperature >= 100) //Extremely cold. Even in somewhere like the server room it takes a while for bodytemp to drop this low. - coldshock = 8 - H.eye_blurry = 5 - if(H.bodytemperature <= 99) //Insanely cold. - coldshock = 16 - H.eye_blurry = 5 - H.shock_stage = min(H.shock_stage + coldshock, 160) //cold hurts and gives them pain messages, eventually weakening and paralysing, but doesn't damage. - return - -/datum/species/werebeast - name = SPECIES_WEREBEAST - name_plural = "Werebeasts" - icobase = 'icons/mob/human_races/r_werebeast.dmi' - deform = 'icons/mob/human_races/r_def_werebeast.dmi' - icon_template = 'icons/mob/human_races/r_werebeast.dmi' - tail = "tail" - unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) - total_health = 200 - brute_mod = 0.85 - burn_mod = 0.85 - metabolic_rate = 2 - item_slowdown_mod = 0.25 - hunger_factor = 0.4 - darksight = 8 - mob_size = MOB_LARGE - num_alternate_languages = 3 - secondary_langs = list(LANGUAGE_CANILUNZT) - name_language = LANGUAGE_CANILUNZT - species_language = LANGUAGE_CANILUNZT - primitive_form = SPECIES_MONKEY_VULPKANIN - color_mult = 1 - icon_height = 64 - can_climb = TRUE - climbing_delay = 1 - - min_age = 18 - max_age = 200 - - blurb = "Big buff werewolves. These are a limited functionality event species that are not balanced for regular gameplay. Adminspawn only." - - wikilink="N/A" - - catalogue_data = list(/datum/category_item/catalogue/fauna/vulpkanin) - - spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE - appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_EYE_COLOR - - flesh_color = "#AFA59E" - base_color = "#777777" - - genders = list(MALE, FEMALE, PLURAL, NEUTER) - - heat_discomfort_strings = list( - "Your fur prickles in the heat.", - "You feel uncomfortably warm.", - "Your overheated skin itches." - ) - - has_limbs = list( - BP_TORSO = list("path" = /obj/item/organ/external/chest), - BP_GROIN = list("path" = /obj/item/organ/external/groin), - BP_HEAD = list("path" = /obj/item/organ/external/head/werebeast), - BP_L_ARM = list("path" = /obj/item/organ/external/arm), - BP_R_ARM = list("path" = /obj/item/organ/external/arm/right), - BP_L_LEG = list("path" = /obj/item/organ/external/leg), - BP_R_LEG = list("path" = /obj/item/organ/external/leg/right), - BP_L_HAND = list("path" = /obj/item/organ/external/hand), - BP_R_HAND = list("path" = /obj/item/organ/external/hand/right), - BP_L_FOOT = list("path" = /obj/item/organ/external/foot), - BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right) - ) diff --git a/code/modules/mob/living/carbon/human/species/station/station_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_vr.dm deleted file mode 100644 index fad2edd50a..0000000000 --- a/code/modules/mob/living/carbon/human/species/station/station_vr.dm +++ /dev/null @@ -1,688 +0,0 @@ -/datum/species/sergal - name = SPECIES_SERGAL - name_plural = "Sergals" - icobase = 'icons/mob/human_races/r_sergal.dmi' - deform = 'icons/mob/human_races/r_def_sergal.dmi' - tail = "tail" - icobase_tail = 1 - unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) - //darksight = 8 - //slowdown = -0.5 - //brute_mod = 1.15 - //burn_mod = 1.15 - //gluttonous = 1 - num_alternate_languages = 3 - secondary_langs = list(LANGUAGE_SAGARU) - name_language = LANGUAGE_SAGARU - species_language = LANGUAGE_SAGARU - color_mult = 1 - inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) - digi_allowed = TRUE - - min_age = 18 - max_age = 80 - - blurb = "There are two subspecies of Sergal; Southern and Northern. Northern sergals are a highly aggressive race \ - that lives in the plains and tundra of their homeworld. They are characterized by long, fluffy fur bodies with cold colors; \ - usually with white abdomens, somewhat short ears, and thick faces. Southern sergals are much more docile and live in the \ - Gold Ring City and are scattered around the outskirts in rural areas and small towns. They usually have short, brown or yellow \ - (or other 'earthy' colors) fur, long ears, and a long, thin face. They are smaller than their Northern relatives. Both have strong \ - racial tensions which has resulted in more than a number of wars and outright attempts at genocide. Sergals have an incredibly long \ - lifespan, but due to their lust for violence, only a handful have ever survived beyond the age of 80, such as the infamous and \ - legendary General Rain Silves who is claimed to have lived to 5000." - - wikilink="https://wiki.vore-station.net/Backstory#Sergal" - - catalogue_data = list(/datum/category_item/catalogue/fauna/sergal) - - primitive_form = SPECIES_MONKEY_SERGAL - - spawn_flags = SPECIES_CAN_JOIN - appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR - - flesh_color = "#AFA59E" - base_color = "#777777" - - genders = list(MALE, FEMALE, PLURAL, NEUTER) - - heat_discomfort_strings = list( - "Your fur prickles in the heat.", - "You feel uncomfortably warm.", - "Your overheated skin itches." - ) - - has_limbs = list( - BP_TORSO = list("path" = /obj/item/organ/external/chest), - BP_GROIN = list("path" = /obj/item/organ/external/groin), - BP_HEAD = list("path" = /obj/item/organ/external/head/sergal), - BP_L_ARM = list("path" = /obj/item/organ/external/arm), - BP_R_ARM = list("path" = /obj/item/organ/external/arm/right), - BP_L_LEG = list("path" = /obj/item/organ/external/leg), - BP_R_LEG = list("path" = /obj/item/organ/external/leg/right), - BP_L_HAND = list("path" = /obj/item/organ/external/hand), - BP_R_HAND = list("path" = /obj/item/organ/external/hand/right), - BP_L_FOOT = list("path" = /obj/item/organ/external/foot), - BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right) - ) - -/datum/species/akula - name = SPECIES_AKULA - name_plural = "Akula" - icobase = 'icons/mob/human_races/r_akula.dmi' - deform = 'icons/mob/human_races/r_def_akula.dmi' - tail = "tail" - icobase_tail = 1 - unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) - //darksight = 8 - //slowdown = -0.5 - //brute_mod = 1.15 - //burn_mod = 1.15 - //gluttonous = 1 - num_alternate_languages = 3 - secondary_langs = list(LANGUAGE_SPACER) - name_language = LANGUAGE_SPACER - species_language = LANGUAGE_SPACER - color_mult = 1 - assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX, LANGUAGE_PROMETHEAN) - inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair, /mob/living/carbon/human/proc/water_stealth, /mob/living/carbon/human/proc/underwater_devour) - min_age = 18 - max_age = 80 - digi_allowed = TRUE - - blurb = "The Akula are a species of amphibious humanoids like the Skrell, but have an appearance very similar to that of a shark. \ - They were first discovered as a primitive race of underwater dwelling tribal creatures by the Skrell. At first they were not believed \ - to be noteworthy, but the Akula proved to be such swift and clever learners that the Skrell reclassified them as sentients. Allegedly, \ - the Akula were also the first sentient life that the Skrell had ever encountered beside themselves, and thus the two species became swift \ - allies over the next few hundred years. With the help of Skrellean technology, the Akula had their genome modified to be capable of \ - surviving in open air for long periods of time. However, Akula even today still require a high humidity environment to avoid drying out \ - after a few days, which would make life on an arid world like Virgo-Prime nearly impossible if it were not for Skrellean technology to aid them." - - wikilink="https://wiki.vore-station.net/Backstory#Akula" - - catalogue_data = list(/datum/category_item/catalogue/fauna/akula) - - primitive_form = SPECIES_MONKEY_AKULA - - genders = list(MALE, FEMALE, PLURAL, NEUTER) - - spawn_flags = SPECIES_CAN_JOIN - appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR - - water_breather = TRUE - water_movement = -4 //Negates shallow. Halves deep. - swim_mult = 0.5 - - flesh_color = "#AFA59E" - base_color = "#777777" - blood_color = "#1D2CBF" - -/datum/species/nevrean - name = SPECIES_NEVREAN - name_plural = "Nevreans" - icobase = 'icons/mob/human_races/r_nevrean.dmi' - deform = 'icons/mob/human_races/r_def_nevrean.dmi' - tail = "tail" - icobase_tail = 1 - unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) - //darksight = 8 - //slowdown = -0.5 - //brute_mod = 1.15 - //burn_mod = 1.15 - //gluttonous = 1 - soft_landing = TRUE - num_alternate_languages = 3 - secondary_langs = list(LANGUAGE_BIRDSONG) - name_language = LANGUAGE_BIRDSONG - species_language = LANGUAGE_BIRDSONG - color_mult = 1 - inherent_verbs = list(/mob/living/proc/flying_toggle, - /mob/living/proc/flying_vore_toggle, - /mob/living/proc/start_wings_hovering, - /mob/living/carbon/human/proc/tie_hair) - min_age = 18 - max_age = 80 - digi_allowed = TRUE - - blurb = "Nevreans are a race of avian and dinosaur-like creatures living on Tal. They belong to a group of races that hails from Eltus, \ - in the Vilous system. Unlike sergals whom they share a star system with, their species is a very peaceful one. They possess remarkable \ - intelligence and very skillful hands that are put use for constructing precision instruments, but tire-out fast when repeatedly working \ - over and over again. Consequently, they struggle to make copies of same things. Both genders have a voice that echoes a lot. Their natural \ - tone oscillates between tenor and soprano. They are excessively noisy when they quarrel in their native language." - - wikilink="https://wiki.vore-station.net/Backstory#Nevrean" - - catalogue_data = list(/datum/category_item/catalogue/fauna/nevrean) - - primitive_form = SPECIES_MONKEY_NEVREAN - - genders = list(MALE, FEMALE, PLURAL, NEUTER) - - spawn_flags = SPECIES_CAN_JOIN - appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR - - flesh_color = "#AFA59E" - base_color = "#333333" - - heat_discomfort_strings = list( - "Your fur prickles in the heat.", - "You feel uncomfortably warm.", - "Your overheated skin itches." - ) - -/datum/species/hi_zoxxen - name = SPECIES_ZORREN_HIGH - name_plural = "Zorren" - icobase = 'icons/mob/human_races/r_fox_vr.dmi' - deform = 'icons/mob/human_races/r_def_fox.dmi' - tail = "tail" - icobase_tail = 1 - unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) - num_alternate_languages = 3 - secondary_langs = list(LANGUAGE_TERMINUS) - name_language = LANGUAGE_TERMINUS - species_language = LANGUAGE_TERMINUS - inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds, - /mob/living/proc/shred_limb, - /mob/living/carbon/human/proc/tie_hair) - digi_allowed = TRUE - - min_age = 18 - max_age = 80 - - blurb = "The fennec-like, blue-blooded Zorren are native to Virgo 4/Menhir and are descendants of a precursor species \ - that is thought to be responsible for the near-collapse of the biosphere of the planet. \ - With societies organised around hierarchal caste systems (such as the Royal Zorren) or freedom and strength (such as the Free Tribe Zorren), \ - they now slowly recover from their previous hubris and aim to revitalize their planet. While many Zorren live in pre-industrial conditions by necessity, \ - they are an interstellar species known for their pride and stubbornness and doggedly hold out on a Deathworld of their own creation. \ - As local species, they hold moderate sway on local corporations and are hired by NT and other companies, although they find \"Outlander\" culture deeply weird." - wikilink="https://wiki.vore-station.net/Zorren" - - catalogue_data = list(/datum/category_item/catalogue/fauna/zorren) - - //primitive_form = "" //We don't have fox-monkey sprites. - - spawn_flags = SPECIES_CAN_JOIN - appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR - flesh_color = "#AFA59E" - base_color = "#333333" - blood_color = "#240bc4" - blood_reagents = REAGENT_ID_COPPER - reagent_tag = IS_ZORREN - color_mult = 1 - - genders = list(MALE, FEMALE, PLURAL, NEUTER) - - heat_discomfort_strings = list( - "Your fur prickles in the heat.", - "You feel uncomfortably warm.", - "Your overheated skin itches." - ) - -/datum/species/vulpkanin - name = SPECIES_VULPKANIN - name_plural = "Vulpkanin" - blurb = "Vulpkanin are a species of sapient canine bipeds, who are the descendants of a lost colony during the waning days of a Precursor species, \ - from which their distant cousins, the Zorren, also originate from. Independent and iconoclast, they have abandoned the ideals of their forefathers \ - largely and prefer to look outwards as explorers and scientists to forge their own identity. They speak a guttural language known as 'Canilunzt' \ - which has a heavy emphasis on utilizing tail positioning and ear twitches to communicate intent." - icobase = 'icons/mob/human_races/r_vulpkanin.dmi' - deform = 'icons/mob/human_races/r_vulpkanin.dmi' -// path = /mob/living/carbon/human/vulpkanin -// default_language = "Sol Common" - secondary_langs = list(LANGUAGE_CANILUNZT) - name_language = LANGUAGE_CANILUNZT - species_language = LANGUAGE_CANILUNZT - primitive_form = SPECIES_MONKEY_VULPKANIN - tail = "vulptail" - tail_animation = 'icons/mob/species/vulpkanin/tail.dmi' // probably need more than just one of each, but w/e - unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) - darksight = 5 //worse than cats, but better than lizards. -- Poojawa -// gluttonous = 1 - num_alternate_languages = 3 - color_mult = 1 - inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds, - /mob/living/carbon/human/proc/tie_hair) - digi_allowed = TRUE - - wikilink="https://wiki.vore-station.net/Backstory#Vulpkanin" - - catalogue_data = list(/datum/category_item/catalogue/fauna/vulpkanin) - - //Furry fox-like animals shouldn't start freezing at 5 degrees celsius. - //Minor cold is resisted, but not severe frost. - cold_discomfort_level = 263 //Not as good at surviving the frost as tajara, but still better than humans. - - cold_level_1 = 243 //Default 260, other values remain at default. Starts taking damage at -30 celsius. Default tier 2 is -70 and tier 3 is -150 - - - breath_cold_level_1 = 220 // Default 240, lower is better. - - //While foxes can survive in deserts, that's handled by zorren. It's a good contrast that our vulp find heat a little uncomfortable. - - heat_discomfort_level = 295 //Just above standard 20 C to avoid heat message spam, same as Taj - - heat_level_1 = 345 //Default 360 - heat_level_2 = 390 //Default 400 - heat_level_3 = 900 //Default 1000 - - breath_heat_level_1 = 370 //Default 380 - Higher is better - breath_heat_level_2 = 445 //Default 450 - breath_heat_level_3 = 1125 //Default 1250 - - primitive_form = SPECIES_MONKEY_VULPKANIN - - spawn_flags = SPECIES_CAN_JOIN - appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR - - genders = list(MALE, FEMALE, PLURAL, NEUTER) - - flesh_color = "#966464" - base_color = "#B43214" - - min_age = 18 - max_age = 80 - - heat_discomfort_strings = list( - "Your fur prickles in the heat.", - "You feel uncomfortably warm.", - "Your overheated skin itches." - ) - -/datum/species/unathi - mob_size = MOB_MEDIUM //To allow normal mob swapping - spawn_flags = SPECIES_CAN_JOIN //Species_can_join is the only spawn flag all the races get, so that none of them will be whitelist only if whitelist is enabled. - icobase = 'icons/mob/human_races/r_lizard_vr.dmi' - deform = 'icons/mob/human_races/r_def_lizard_vr.dmi' - tail_animation = 'icons/mob/species/unathi/tail_vr.dmi' - color_mult = 1 - min_age = 18 - inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) - gluttonous = 0 - genders = list(MALE, FEMALE, PLURAL, NEUTER) - descriptors = list() - blurb = "Heavily reptilian in appearance, the Unathi hail from the Uueoa-Esa system, roughly translated as 'Burning Mother'. \ - Their home planet, Moghes, is an arid climate with hot rocky plains and deserts, and a temperate band of swamps and savannas with \ - massive saltwater lakes being the closest equivalent to oceans. This environment bred a very hardy people who value ideals of honesty, \ - virtue, proficiency and bravery above all else, frequently even one's own life. These same values lend them culturally to imperialistic \ - politics, as well as often being viewed as haughty and arrogant by other interstellar species.

\ - 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.

\ - 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) - ) diff --git a/code/modules/mob/living/carbon/human/species/station/teshari.dm b/code/modules/mob/living/carbon/human/species/station/teshari.dm deleted file mode 100644 index c89acf4b28..0000000000 --- a/code/modules/mob/living/carbon/human/species/station/teshari.dm +++ /dev/null @@ -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 -*/ diff --git a/code/modules/mob/living/carbon/human/species/station/teshari_vr.dm b/code/modules/mob/living/carbon/human/species/station/teshari_vr.dm deleted file mode 100644 index 7de5fc7fa7..0000000000 --- a/code/modules/mob/living/carbon/human/species/station/teshari_vr.dm +++ /dev/null @@ -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 - ) diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/_traits.dm b/code/modules/mob/living/carbon/human/species/station/traits/_traits.dm similarity index 100% rename from code/modules/mob/living/carbon/human/species/station/traits_vr/_traits.dm rename to code/modules/mob/living/carbon/human/species/station/traits/_traits.dm diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm b/code/modules/mob/living/carbon/human/species/station/traits/negative.dm similarity index 100% rename from code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm rename to code/modules/mob/living/carbon/human/species/station/traits/negative.dm diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/negative_genes.dm b/code/modules/mob/living/carbon/human/species/station/traits/negative_genes.dm similarity index 100% rename from code/modules/mob/living/carbon/human/species/station/traits_vr/negative_genes.dm rename to code/modules/mob/living/carbon/human/species/station/traits/negative_genes.dm diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm b/code/modules/mob/living/carbon/human/species/station/traits/neutral.dm similarity index 100% rename from code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm rename to code/modules/mob/living/carbon/human/species/station/traits/neutral.dm diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral_genes.dm b/code/modules/mob/living/carbon/human/species/station/traits/neutral_genes.dm similarity index 100% rename from code/modules/mob/living/carbon/human/species/station/traits_vr/neutral_genes.dm rename to code/modules/mob/living/carbon/human/species/station/traits/neutral_genes.dm diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm b/code/modules/mob/living/carbon/human/species/station/traits/positive.dm similarity index 100% rename from code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm rename to code/modules/mob/living/carbon/human/species/station/traits/positive.dm diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive_genes.dm b/code/modules/mob/living/carbon/human/species/station/traits/positive_genes.dm similarity index 100% rename from code/modules/mob/living/carbon/human/species/station/traits_vr/positive_genes.dm rename to code/modules/mob/living/carbon/human/species/station/traits/positive_genes.dm diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm b/code/modules/mob/living/carbon/human/species/station/traits/trait.dm similarity index 100% rename from code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm rename to code/modules/mob/living/carbon/human/species/station/traits/trait.dm diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/traits_tutorial.dm b/code/modules/mob/living/carbon/human/species/station/traits/traits_tutorial.dm similarity index 100% rename from code/modules/mob/living/carbon/human/species/station/traits_vr/traits_tutorial.dm rename to code/modules/mob/living/carbon/human/species/station/traits/traits_tutorial.dm diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_objs.dm b/code/modules/mob/living/carbon/human/species/station/traits/weaver_objs.dm similarity index 100% rename from code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_objs.dm rename to code/modules/mob/living/carbon/human/species/station/traits/weaver_objs.dm diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_recipies.dm b/code/modules/mob/living/carbon/human/species/station/traits/weaver_recipies.dm similarity index 100% rename from code/modules/mob/living/carbon/human/species/station/traits_vr/weaver_recipies.dm rename to code/modules/mob/living/carbon/human/species/station/traits/weaver_recipies.dm diff --git a/code/modules/mob/living/carbon/human/species/station/xenochimera_hud_vr.dm b/code/modules/mob/living/carbon/human/species/station/xenochimera_hud_vr.dm deleted file mode 100644 index 38a207cdfe..0000000000 --- a/code/modules/mob/living/carbon/human/species/station/xenochimera_hud_vr.dm +++ /dev/null @@ -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 diff --git a/code/modules/mob/living/carbon/human/species/station/xenochimera_trait_vr.dm b/code/modules/mob/living/carbon/human/species/station/xenochimera_trait_vr.dm deleted file mode 100644 index c7064af431..0000000000 --- a/code/modules/mob/living/carbon/human/species/station/xenochimera_trait_vr.dm +++ /dev/null @@ -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 diff --git a/code/modules/mob/living/silicon/decoy/decoy.dm b/code/modules/mob/living/silicon/decoy/decoy.dm index 4915e441f8..3a43ef2bb2 100644 --- a/code/modules/mob/living/silicon/decoy/decoy.dm +++ b/code/modules/mob/living/silicon/decoy/decoy.dm @@ -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 diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index 4c7769f0c1..538fb886eb 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -19,6 +19,7 @@ GLOBAL_LIST_BOILERPLATE(all_brain_organs, /obj/item/organ/internal/brain) var/mob/living/carbon/brain/brainmob = null var/can_assist = TRUE var/defib_timer = -1 + var/laststress = 0 /obj/item/organ/internal/brain/process() ..() diff --git a/vorestation.dme b/vorestation.dme index 3c9165d71b..15a880339b 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -3140,14 +3140,10 @@ #include "code\modules\mob\living\carbon\human\descriptors\descriptors_vox.dm" #include "code\modules\mob\living\carbon\human\species\species.dm" #include "code\modules\mob\living\carbon\human\species\species_attack.dm" -#include "code\modules\mob\living\carbon\human\species\species_attack_vr.dm" #include "code\modules\mob\living\carbon\human\species\species_getters.dm" -#include "code\modules\mob\living\carbon\human\species\species_getters_vr.dm" #include "code\modules\mob\living\carbon\human\species\species_helpers.dm" #include "code\modules\mob\living\carbon\human\species\species_hud.dm" #include "code\modules\mob\living\carbon\human\species\species_shapeshift.dm" -#include "code\modules\mob\living\carbon\human\species\species_shapeshift_vr.dm" -#include "code\modules\mob\living\carbon\human\species\species_vr.dm" #include "code\modules\mob\living\carbon\human\species\lleill\hanner.dm" #include "code\modules\mob\living\carbon\human\species\lleill\lleill.dm" #include "code\modules\mob\living\carbon\human\species\lleill\lleill_abilities.dm" @@ -3158,45 +3154,36 @@ #include "code\modules\mob\living\carbon\human\species\outsider\shadow.dm" #include "code\modules\mob\living\carbon\human\species\outsider\skeleton.dm" #include "code\modules\mob\living\carbon\human\species\outsider\vox.dm" -#include "code\modules\mob\living\carbon\human\species\outsider\vox_vr.dm" #include "code\modules\mob\living\carbon\human\species\shadekin\shadekin.dm" #include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_abilities.dm" #include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_hud.dm" #include "code\modules\mob\living\carbon\human\species\station\alraune.dm" -#include "code\modules\mob\living\carbon\human\species\station\blank_vr.dm" +#include "code\modules\mob\living\carbon\human\species\station\custom.dm" #include "code\modules\mob\living\carbon\human\species\station\golem.dm" #include "code\modules\mob\living\carbon\human\species\station\human_subspecies.dm" #include "code\modules\mob\living\carbon\human\species\station\monkey.dm" -#include "code\modules\mob\living\carbon\human\species\station\monkey_vr.dm" #include "code\modules\mob\living\carbon\human\species\station\prometheans.dm" -#include "code\modules\mob\living\carbon\human\species\station\prometheans_vr.dm" #include "code\modules\mob\living\carbon\human\species\station\prommie_blob.dm" #include "code\modules\mob\living\carbon\human\species\station\replicant_crew.dm" #include "code\modules\mob\living\carbon\human\species\station\station.dm" -#include "code\modules\mob\living\carbon\human\species\station\station_special_abilities_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\station_special_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\station_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\teshari.dm" -#include "code\modules\mob\living\carbon\human\species\station\teshari_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\xenochimera_hud_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\xenochimera_trait_vr.dm" -#include "code\modules\mob\living\carbon\human\species\station\protean_vr\_protean_defines.dm" -#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_blob.dm" -#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_powers.dm" -#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_rig.dm" -#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_rig_tgui.dm" -#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_species.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\_traits.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\negative.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\negative_genes.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\neutral.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\neutral_genes.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\positive.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\positive_genes.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\trait.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\traits_tutorial.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\weaver_objs.dm" -#include "code\modules\mob\living\carbon\human\species\station\traits_vr\weaver_recipies.dm" +#include "code\modules\mob\living\carbon\human\species\station\station_special_abilities.dm" +#include "code\modules\mob\living\carbon\human\species\station\protean\_protean_defines.dm" +#include "code\modules\mob\living\carbon\human\species\station\protean\protean_blob.dm" +#include "code\modules\mob\living\carbon\human\species\station\protean\protean_powers.dm" +#include "code\modules\mob\living\carbon\human\species\station\protean\protean_rig.dm" +#include "code\modules\mob\living\carbon\human\species\station\protean\protean_rig_tgui.dm" +#include "code\modules\mob\living\carbon\human\species\station\protean\protean_species.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits\_traits.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits\negative.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits\negative_genes.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits\neutral.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits\neutral_genes.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits\positive.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits\positive_genes.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits\trait.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits\traits_tutorial.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits\weaver_objs.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits\weaver_recipies.dm" #include "code\modules\mob\living\carbon\human\species\virtual_reality\avatar.dm" #include "code\modules\mob\living\carbon\human\species\virtual_reality\opaque_form.dm" #include "code\modules\mob\living\carbon\human\species\xenomorphs\alien_powers.dm"