mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-22 19:47:47 +01:00
Consolidates Species Files (#17293)
* Consolidates the species _vr override files. * Bugfix: Moves xenochi brain var to base brain * gluttony * Moves teshari to station.dm They ARE station crew, after all. * byebye * RIDICULOUS * ears * this got lost * this needs real unfucking --------- Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
This commit is contained in:
co-authored by
Kashargul
parent
25dfd063d4
commit
34537c70ee
@@ -1,9 +1,12 @@
|
||||
/datum/species/vox
|
||||
name = SPECIES_VOX
|
||||
name_plural = "Vox"
|
||||
icobase = 'icons/mob/human_races/r_vox.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_vox.dmi'
|
||||
default_language = LANGUAGE_VOX
|
||||
icobase = 'icons/mob/human_races/r_vox_old.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_vox_old.dmi'
|
||||
tail = "voxtail"
|
||||
tail_animation = 'icons/mob/species/vox/tail.dmi'
|
||||
default_language = LANGUAGE_GALCOM
|
||||
secondary_langs = list(LANGUAGE_VOX)
|
||||
language = LANGUAGE_GALCOM
|
||||
species_language = LANGUAGE_VOX
|
||||
num_alternate_languages = 3
|
||||
@@ -16,13 +19,15 @@
|
||||
refer to them as 'shitbirds' for their violent and offensive nature, as well as their horrible \
|
||||
smell.<br/><br/>Most humans will never meet a Vox raider, instead learning of this insular species through \
|
||||
dealing with their traders and merchants; those that do rarely enjoy the experience."
|
||||
wikilink="https://wiki.vore-station.net/Vox"
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/vox)
|
||||
|
||||
// taste_sensitivity = TASTE_DULL
|
||||
min_age = 18
|
||||
|
||||
slowdown = -0.5
|
||||
|
||||
speech_sounds = list('sound/voice/shriek1.ogg')
|
||||
speech_sounds = list()
|
||||
speech_chance = 20
|
||||
|
||||
scream_verb_1p = "shriek"
|
||||
@@ -41,19 +46,18 @@
|
||||
cold_level_2 = 50
|
||||
cold_level_3 = 0
|
||||
|
||||
gluttonous = 1
|
||||
|
||||
breath_type = GAS_PHORON
|
||||
poison_type = GAS_O2
|
||||
ideal_air_type = /datum/gas_mixture/belly_air/vox
|
||||
siemens_coefficient = 0.2
|
||||
|
||||
flags = NO_DNA | NO_SLEEVE | NO_DEFIB
|
||||
spawn_flags = SPECIES_IS_WHITELISTED
|
||||
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
|
||||
appearance_flags = HAS_EYE_COLOR | HAS_HAIR_COLOR | HAS_SKIN_COLOR
|
||||
|
||||
blood_color = "#9066BD"
|
||||
flesh_color = "#808D11"
|
||||
color_mult = 1
|
||||
|
||||
reagent_tag = IS_VOX
|
||||
|
||||
@@ -84,15 +88,10 @@
|
||||
|
||||
genders = list(NEUTER)
|
||||
|
||||
descriptors = list(
|
||||
/datum/mob_descriptor/height = -1,
|
||||
/datum/mob_descriptor/build = 1,
|
||||
/datum/mob_descriptor/vox_markings = 0
|
||||
)
|
||||
|
||||
default_emotes = list(
|
||||
/decl/emote/audible/vox_shriek
|
||||
)
|
||||
inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) //Get ya quills done did
|
||||
|
||||
/datum/species/vox/get_random_name(var/gender)
|
||||
var/datum/language/species_language = GLOB.all_languages[default_language]
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
/datum/species/vox
|
||||
default_language = LANGUAGE_GALCOM
|
||||
secondary_langs = list(LANGUAGE_VOX)
|
||||
speech_sounds = list() // Remove obnoxious noises on every single 'say'. Should really only be a thing for event-exclusive species like benos.
|
||||
@@ -58,7 +58,7 @@
|
||||
var/allergen_damage_severity = 2.5 // How bad are reactions to the allergen? Touch with extreme caution.
|
||||
var/allergen_disable_severity = 10 // Whilst this determines how long nonlethal effects last and how common emotes are.
|
||||
|
||||
var/min_age = 17
|
||||
var/min_age = 18
|
||||
var/max_age = 70
|
||||
|
||||
var/icodigi = 'icons/mob/human_races/r_digi.dmi'
|
||||
@@ -225,7 +225,7 @@
|
||||
var/item_slowdown_mod = 1 // How affected by item slowdown the species is.
|
||||
var/primitive_form // Lesser form, if any (ie. monkey for humans)
|
||||
var/greater_form // Greater form, if any, ie. human for monkeys.
|
||||
var/holder_type
|
||||
var/holder_type = /obj/item/holder/micro //This allows you to pick up crew
|
||||
var/gluttonous // Can eat some mobs. 1 for mice, 2 for monkeys, 3 for people.
|
||||
var/soft_landing = FALSE // Can fall down and land safely on small falls.
|
||||
|
||||
@@ -250,6 +250,8 @@
|
||||
|
||||
var/vore_belly_default_variant = "H"
|
||||
|
||||
var/list/default_emotes = list()
|
||||
|
||||
// Determines the organs that the species spawns with and
|
||||
var/list/has_organ = list( // which required-organ checks are conducted.
|
||||
O_HEART = /obj/item/organ/internal/heart,
|
||||
@@ -290,10 +292,7 @@
|
||||
|
||||
var/pass_flags = 0
|
||||
|
||||
var/list/descriptors = list(
|
||||
/datum/mob_descriptor/height,
|
||||
/datum/mob_descriptor/build
|
||||
)
|
||||
var/list/descriptors = list()
|
||||
|
||||
//This is used in character setup preview generation (prefences_setup.dm) and human mob
|
||||
//rendering (update_icons.dm)
|
||||
@@ -314,6 +313,53 @@
|
||||
var/gun_accuracy_dispersion_mod = 0 // More is worse
|
||||
|
||||
var/sort_hint = SPECIES_SORT_NORMAL
|
||||
//This is so that if a race is using the chimera revive they can't use it more than once.
|
||||
//Shouldn't really be seen in play too often, but it's case an admin event happens and they give a non chimera the chimera revive. Only one person can use the chimera revive at a time per race.
|
||||
//var/reviving = 0 //commented out 'cause moved to mob
|
||||
|
||||
var/organic_food_coeff = 1
|
||||
var/synthetic_food_coeff = 0
|
||||
var/robo_ethanol_proc = 0 //can we get fuel from booze, as a synth?
|
||||
var/robo_ethanol_drunk = 0 //can we get *drunk* from booze, as a synth?
|
||||
var/digestion_efficiency = 1 //VORE specific digestion var
|
||||
//var/vore_numbing = 0
|
||||
var/metabolism = 0.0015
|
||||
var/lightweight = FALSE //Oof! Nonhelpful bump stumbles.
|
||||
var/trashcan = FALSE //It's always sunny in the wrestling ring.
|
||||
var/eat_minerals = FALSE //HEAVY METAL DIET
|
||||
var/base_species = null // Unused outside of a few species
|
||||
var/selects_bodytype = SELECTS_BODYTYPE_FALSE // Allows the species to choose from body types like custom species can, affecting suit fitting and etcetera as you would expect.
|
||||
|
||||
var/bloodsucker = FALSE // Allows safely getting nutrition from blood.
|
||||
var/bloodsucker_controlmode = "always loud" //Allows selecting between bloodsucker control modes. Always Loud corresponds to original implementation.
|
||||
|
||||
var/is_weaver = FALSE
|
||||
var/silk_production = FALSE
|
||||
var/silk_reserve = 100
|
||||
var/silk_max_reserve = 500
|
||||
var/silk_color = "#FFFFFF"
|
||||
|
||||
var/list/traits = list()
|
||||
//Vars that need to be copied when producing a copy of species.
|
||||
var/list/copy_vars = list("base_species", "icobase", "deform", "tail", "tail_animation", "icobase_tail", "color_mult", "primitive_form", "appearance_flags", "flesh_color", "base_color", "blood_mask", "damage_mask", "damage_overlays", "move_trail", "has_floating_eyes")
|
||||
var/trait_points = 0
|
||||
|
||||
var/ideal_air_type = null // Set to something else if you breathe something else from default composition. Used for inbelly air.
|
||||
|
||||
var/micro_size_mod = 0 // How different is our size for interactions that involve us being small?
|
||||
var/macro_size_mod = 0 // How different is our size for interactions that involve us being big?
|
||||
var/digestion_nutrition_modifier = 1
|
||||
var/center_offset = 0.5
|
||||
var/can_climb = FALSE
|
||||
var/climbing_delay = 1.5 // We climb with a quarter delay
|
||||
|
||||
var/list/food_preference = list() //RS edit
|
||||
var/food_preference_bonus = 0
|
||||
|
||||
|
||||
// For Lleill and Hanner
|
||||
var/lleill_energy = 200
|
||||
var/lleill_energy_max = 200
|
||||
|
||||
/datum/species/proc/update_attack_types()
|
||||
unarmed_attacks = list()
|
||||
@@ -665,3 +711,85 @@
|
||||
if(!QDELETED(baseHead) && baseHead)
|
||||
qdel(baseHead)
|
||||
return
|
||||
|
||||
/datum/species/proc/give_numbing_bite() //Holy SHIT this is hacky, but it works. Updating a mob's attacks mid game is insane.
|
||||
unarmed_attacks = list()
|
||||
unarmed_types += /datum/unarmed_attack/bite/sharp/numbing
|
||||
for(var/u_type in unarmed_types)
|
||||
unarmed_attacks += new u_type()
|
||||
|
||||
/datum/species/create_organs(var/mob/living/carbon/human/H)
|
||||
if(H.nif)
|
||||
/*var/type = H.nif.type
|
||||
var/durability = H.nif.durability
|
||||
var/list/nifsofts = H.nif.nifsofts
|
||||
var/list/nif_savedata = H.nif.save_data.Copy()*/
|
||||
..()
|
||||
H.nif = null //A previous call during the rejuvenation path deleted it, so we no longer should have it here
|
||||
/*var/obj/item/nif/nif = new type(H,durability,nif_savedata)
|
||||
nif.nifsofts = nifsofts*/
|
||||
else
|
||||
..()
|
||||
|
||||
/datum/species/proc/produceCopy(var/list/traits, var/mob/living/carbon/human/H, var/custom_base, var/reset_dna = TRUE) // Traitgenes reset_dna flag required, or genes get reset on resleeve
|
||||
ASSERT(src)
|
||||
ASSERT(istype(H))
|
||||
var/datum/species/new_copy = new src.type()
|
||||
new_copy.race_key = race_key
|
||||
if (selects_bodytype && custom_base)
|
||||
new_copy.base_species = custom_base
|
||||
if(selects_bodytype == SELECTS_BODYTYPE_CUSTOM) //If race selects a bodytype, retrieve the custom_base species and copy needed variables.
|
||||
var/datum/species/S = GLOB.all_species[custom_base]
|
||||
S.copy_variables(new_copy, copy_vars)
|
||||
|
||||
if(selects_bodytype == SELECTS_BODYTYPE_SHAPESHIFTER)
|
||||
H.shapeshifter_change_shape(custom_base, FALSE)
|
||||
|
||||
for(var/organ in has_limbs) //Copy important organ data generated by species.
|
||||
var/list/organ_data = has_limbs[organ]
|
||||
new_copy.has_limbs[organ] = organ_data.Copy()
|
||||
|
||||
new_copy.traits = traits
|
||||
//If you had traits, apply them
|
||||
if(new_copy.traits)
|
||||
for(var/trait in new_copy.traits)
|
||||
var/datum/trait/T = all_traits[trait]
|
||||
T.apply(new_copy, H, new_copy.traits[trait])
|
||||
|
||||
//Set up a mob
|
||||
H.species = new_copy
|
||||
H.icon_state = new_copy.get_bodytype()
|
||||
|
||||
if(new_copy.holder_type)
|
||||
H.holder_type = new_copy.holder_type
|
||||
|
||||
if(H.dna && reset_dna)
|
||||
H.dna.ready_dna(H)
|
||||
handle_base_eyes(H, custom_base)
|
||||
|
||||
if(H.species.has_vibration_sense)
|
||||
H.motiontracker_subscribe()
|
||||
|
||||
return new_copy
|
||||
|
||||
//We REALLY don't need to go through every variable. Doing so makes this lag like hell on 515
|
||||
/datum/species/proc/copy_variables(var/datum/species/S, var/list/whitelist)
|
||||
//List of variables to ignore, trying to copy type will runtime.
|
||||
//var/list/blacklist = list("type", "loc", "client", "ckey")
|
||||
//Makes thorough copy of species datum.
|
||||
for(var/i in whitelist)
|
||||
if(!(i in S.vars)) //Don't copy incompatible vars.
|
||||
continue
|
||||
if(S.vars[i] != vars[i] && !islist(vars[i])) //If vars are same, no point in copying.
|
||||
S.vars[i] = vars[i]
|
||||
|
||||
/datum/species/get_bodytype()
|
||||
return base_species
|
||||
|
||||
/datum/species/proc/update_vore_belly_def_variant()
|
||||
// Determine the actual vore_belly_default_variant, if the base species in the VORE tab is set
|
||||
switch (base_species)
|
||||
if("Teshari")
|
||||
vore_belly_default_variant = "T"
|
||||
if("Unathi")
|
||||
vore_belly_default_variant = "L"
|
||||
|
||||
@@ -99,3 +99,82 @@
|
||||
var/obj/item/organ/external/affecting = target.get_organ(zone)
|
||||
user.visible_message(span_warning("[user] jumped up and down on \the [target]'s [affecting.name]!"))
|
||||
playsound(user, attack_sound, 25, 1, -1)
|
||||
|
||||
/datum/unarmed_attack/bite/sharp/numbing //Is using this against someone you are truly trying to fight a bad idea? Yes. Yes it is.
|
||||
attack_name = "numbing bite"
|
||||
attack_verb = list("bit")
|
||||
attack_noun = list("fangs")
|
||||
attack_sound = 'sound/weapons/bite.ogg'
|
||||
shredding = 0
|
||||
sharp = TRUE
|
||||
edge = TRUE
|
||||
|
||||
/datum/unarmed_attack/bite/sharp/numbing/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
|
||||
var/obj/item/organ/external/affecting = target.get_organ(zone)
|
||||
|
||||
attack_damage = CLAMP(attack_damage, 1, 5)
|
||||
if(target == user)
|
||||
user.visible_message(span_danger("[user] [pick(attack_verb)] \himself in the [affecting.name]!"))
|
||||
return 0 //No venom for you.
|
||||
switch(zone)
|
||||
if(BP_HEAD, O_MOUTH, O_EYES)
|
||||
// ----- HEAD ----- //
|
||||
switch(attack_damage)
|
||||
if(1 to 2)
|
||||
user.visible_message(span_danger("[user]'s fangs scrape across [target]'s cheek!"))
|
||||
to_chat(target, span_danger("Your face feels tingly!"))
|
||||
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage) //Have to add this here, otherwise the swtich fails.
|
||||
if(3 to 4)
|
||||
user.visible_message(span_danger("[user]'s fangs pierce into [target]'s neck at an odd, awkward angle!"))
|
||||
to_chat(target, span_danger("Your neck feels like it's on fire before going numb!"))
|
||||
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
|
||||
if(5)
|
||||
user.visible_message(span_danger("[user] sinks \his [pick(attack_noun)] <b><i>deep</i></b> into [target]'s neck, causing the vein to bulge outwards at some type of chemical is pumped into it!"))
|
||||
to_chat(target, span_danger("Your neck feels like it's going to burst! Moments later, you simply can't feel your neck any longer, the numbness beginning to spread throughout your body!"))
|
||||
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
|
||||
else
|
||||
// ----- BODY ----- //
|
||||
switch(attack_damage)
|
||||
if(1 to 2)
|
||||
user.visible_message(span_danger("[user]'s fangs scrape across [target]'s [affecting.name]!"))
|
||||
to_chat(target, span_danger("Your [affecting.name] feels tingly!"))
|
||||
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
|
||||
if(3 to 4)
|
||||
user.visible_message(span_danger("[user]'s fangs pierce [pick("", "", "the side of")] [target]'s [affecting.name]!"))
|
||||
to_chat(target, span_danger("Your [affecting.name] feels like it's on fire before going numb!"))
|
||||
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
|
||||
if(5)
|
||||
user.visible_message(span_danger("[user]'s fangs sink deep into [target]'s [affecting.name], one of their veins bulging outwards from the sudden fluid pumped into it!"))
|
||||
to_chat(target, span_danger("Your [affecting.name] feels like it's going to burst! Moments later, you simply can't feel your [affecting.name] any longer, the numbness slowly spreading throughout your body!"))
|
||||
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
|
||||
|
||||
/datum/unarmed_attack/claws/shadekin
|
||||
|
||||
/datum/unarmed_attack/claws/shadekin/apply_effects(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
|
||||
..()
|
||||
if(!(target == user))
|
||||
user.shadekin_adjust_energy(attack_damage)
|
||||
|
||||
/datum/unarmed_attack/bite/sharp/shadekin
|
||||
|
||||
/datum/unarmed_attack/bite/sharp/shadekin/apply_effects(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
|
||||
..()
|
||||
if(!(target == user))
|
||||
user.shadekin_adjust_energy(attack_damage)
|
||||
|
||||
/datum/unarmed_attack/claws/chimera //special feral attack that gets stronger as they get angrier
|
||||
|
||||
/datum/unarmed_attack/claws/chimera/get_unarmed_damage(var/mob/living/carbon/human/user)
|
||||
return user.feral/5
|
||||
|
||||
/datum/unarmed_attack/claws/chimera/apply_effects(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/armour,var/attack_damage,var/zone)
|
||||
..()
|
||||
if(user.feral && !(target == user))
|
||||
var/selfdamage = ((user.feral/10)-7.5)
|
||||
if(selfdamage > 0)
|
||||
var/selfdamagezone = null
|
||||
if (user.hand)
|
||||
selfdamagezone=pick(BP_L_ARM, BP_L_HAND)
|
||||
else
|
||||
selfdamagezone=pick(BP_R_ARM, BP_R_HAND)
|
||||
user.apply_damage(selfdamage, BRUTE, selfdamagezone, 0, 0, sharp=FALSE, edge=FALSE)
|
||||
|
||||
@@ -1,78 +0,0 @@
|
||||
/datum/unarmed_attack/bite/sharp/numbing //Is using this against someone you are truly trying to fight a bad idea? Yes. Yes it is.
|
||||
attack_name = "numbing bite"
|
||||
attack_verb = list("bit")
|
||||
attack_noun = list("fangs")
|
||||
attack_sound = 'sound/weapons/bite.ogg'
|
||||
shredding = 0
|
||||
sharp = TRUE
|
||||
edge = TRUE
|
||||
|
||||
/datum/unarmed_attack/bite/sharp/numbing/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
|
||||
var/obj/item/organ/external/affecting = target.get_organ(zone)
|
||||
|
||||
attack_damage = CLAMP(attack_damage, 1, 5)
|
||||
if(target == user)
|
||||
user.visible_message(span_danger("[user] [pick(attack_verb)] \himself in the [affecting.name]!"))
|
||||
return 0 //No venom for you.
|
||||
switch(zone)
|
||||
if(BP_HEAD, O_MOUTH, O_EYES)
|
||||
// ----- HEAD ----- //
|
||||
switch(attack_damage)
|
||||
if(1 to 2)
|
||||
user.visible_message(span_danger("[user]'s fangs scrape across [target]'s cheek!"))
|
||||
to_chat(target, span_danger("Your face feels tingly!"))
|
||||
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage) //Have to add this here, otherwise the swtich fails.
|
||||
if(3 to 4)
|
||||
user.visible_message(span_danger("[user]'s fangs pierce into [target]'s neck at an odd, awkward angle!"))
|
||||
to_chat(target, span_danger("Your neck feels like it's on fire before going numb!"))
|
||||
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
|
||||
if(5)
|
||||
user.visible_message(span_danger("[user] sinks \his [pick(attack_noun)] <b><i>deep</i></b> into [target]'s neck, causing the vein to bulge outwards at some type of chemical is pumped into it!"))
|
||||
to_chat(target, span_danger("Your neck feels like it's going to burst! Moments later, you simply can't feel your neck any longer, the numbness beginning to spread throughout your body!"))
|
||||
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
|
||||
else
|
||||
// ----- BODY ----- //
|
||||
switch(attack_damage)
|
||||
if(1 to 2)
|
||||
user.visible_message(span_danger("[user]'s fangs scrape across [target]'s [affecting.name]!"))
|
||||
to_chat(target, span_danger("Your [affecting.name] feels tingly!"))
|
||||
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
|
||||
if(3 to 4)
|
||||
user.visible_message(span_danger("[user]'s fangs pierce [pick("", "", "the side of")] [target]'s [affecting.name]!"))
|
||||
to_chat(target, span_danger("Your [affecting.name] feels like it's on fire before going numb!"))
|
||||
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
|
||||
if(5)
|
||||
user.visible_message(span_danger("[user]'s fangs sink deep into [target]'s [affecting.name], one of their veins bulging outwards from the sudden fluid pumped into it!"))
|
||||
to_chat(target, span_danger("Your [affecting.name] feels like it's going to burst! Moments later, you simply can't feel your [affecting.name] any longer, the numbness slowly spreading throughout your body!"))
|
||||
target.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,attack_damage)
|
||||
|
||||
/datum/unarmed_attack/claws/shadekin
|
||||
|
||||
/datum/unarmed_attack/claws/shadekin/apply_effects(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
|
||||
..()
|
||||
if(!(target == user))
|
||||
user.shadekin_adjust_energy(attack_damage)
|
||||
|
||||
/datum/unarmed_attack/bite/sharp/shadekin
|
||||
|
||||
/datum/unarmed_attack/bite/sharp/shadekin/apply_effects(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
|
||||
..()
|
||||
if(!(target == user))
|
||||
user.shadekin_adjust_energy(attack_damage)
|
||||
|
||||
/datum/unarmed_attack/claws/chimera //special feral attack that gets stronger as they get angrier
|
||||
|
||||
/datum/unarmed_attack/claws/chimera/get_unarmed_damage(var/mob/living/carbon/human/user)
|
||||
return user.feral/5
|
||||
|
||||
/datum/unarmed_attack/claws/chimera/apply_effects(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/armour,var/attack_damage,var/zone)
|
||||
..()
|
||||
if(user.feral && !(target == user))
|
||||
var/selfdamage = ((user.feral/10)-7.5)
|
||||
if(selfdamage > 0)
|
||||
var/selfdamagezone = null
|
||||
if (user.hand)
|
||||
selfdamagezone=pick(BP_L_ARM, BP_L_HAND)
|
||||
else
|
||||
selfdamagezone=pick(BP_R_ARM, BP_R_HAND)
|
||||
user.apply_damage(selfdamage, BRUTE, selfdamagezone, 0, 0, sharp=FALSE, edge=FALSE)
|
||||
@@ -125,3 +125,16 @@
|
||||
|
||||
/datum/species/proc/get_vision_flags(var/mob/living/carbon/human/H)
|
||||
return vision_flags
|
||||
|
||||
/datum/species/proc/get_wing_hair(var/mob/living/carbon/human/H) //I have no idea what this is even used for other than teshari, but putting it in just in case.
|
||||
return wing_hair //Since the tail has it.
|
||||
/datum/species/proc/get_wing(var/mob/living/carbon/human/H)
|
||||
return wing
|
||||
/datum/species/proc/get_wing_animation(var/mob/living/carbon/human/H)
|
||||
return wing_animation
|
||||
|
||||
/datum/species/proc/get_perfect_belly_air_type(var/mob/living/carbon/human/H)
|
||||
if(ideal_air_type)
|
||||
return ideal_air_type //Whatever we want
|
||||
else
|
||||
return /datum/gas_mixture/belly_air //Default
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
|
||||
/datum/species/proc/get_wing_hair(var/mob/living/carbon/human/H) //I have no idea what this is even used for other than teshari, but putting it in just in case.
|
||||
return wing_hair //Since the tail has it.
|
||||
/datum/species/proc/get_wing(var/mob/living/carbon/human/H)
|
||||
return wing
|
||||
/datum/species/proc/get_wing_animation(var/mob/living/carbon/human/H)
|
||||
return wing_animation
|
||||
|
||||
/datum/species/proc/get_perfect_belly_air_type(var/mob/living/carbon/human/H)
|
||||
if(ideal_air_type)
|
||||
return ideal_air_type //Whatever we want
|
||||
else
|
||||
return /datum/gas_mixture/belly_air //Default
|
||||
@@ -14,6 +14,9 @@ var/list/wrapped_species_by_ref = list()
|
||||
var/list/valid_transform_species = list()
|
||||
//var/default_form = SPECIES_HUMAN //VOREStation edit
|
||||
|
||||
base_species = SPECIES_HUMAN
|
||||
selects_bodytype = SELECTS_BODYTYPE_SHAPESHIFTER
|
||||
|
||||
/datum/species/shapeshifter/get_valid_shapeshifter_forms(var/mob/living/carbon/human/H)
|
||||
return list(vanity_base_fit)|valid_transform_species
|
||||
|
||||
@@ -321,3 +324,339 @@ var/list/wrapped_species_by_ref = list()
|
||||
|
||||
update_icons_body()
|
||||
update_eyes()
|
||||
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_ears()
|
||||
set name = "Select Ears"
|
||||
set category = "Abilities.Shapeshift"
|
||||
|
||||
if(stat || world.time < last_special)
|
||||
return
|
||||
|
||||
last_special = world.time + 10
|
||||
// Construct the list of names allowed for this user.
|
||||
var/list/pretty_ear_styles = list("Normal" = null)
|
||||
for(var/path in ear_styles_list)
|
||||
var/datum/sprite_accessory/ears/instance = ear_styles_list[path]
|
||||
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
|
||||
pretty_ear_styles[instance.name] = path
|
||||
|
||||
// Present choice to user
|
||||
var/new_ear_style = tgui_input_list(src, "Pick some ears!", "Character Preference", pretty_ear_styles)
|
||||
if(!new_ear_style)
|
||||
return
|
||||
|
||||
//Set new style
|
||||
ear_style = ear_styles_list[pretty_ear_styles[new_ear_style]]
|
||||
|
||||
//Allow color picks
|
||||
var/current_pri_color = rgb(r_ears,g_ears,b_ears)
|
||||
|
||||
var/new_pri_color = tgui_color_picker(src, "Pick primary ear color:","Ear Color (Pri)", current_pri_color)
|
||||
if(new_pri_color)
|
||||
var/list/new_color_rgb_list = hex2rgb(new_pri_color)
|
||||
r_ears = new_color_rgb_list[1]
|
||||
g_ears = new_color_rgb_list[2]
|
||||
b_ears = new_color_rgb_list[3]
|
||||
|
||||
//Indented inside positive primary color choice, don't bother if they clicked cancel
|
||||
var/current_sec_color = rgb(r_ears2,g_ears2,b_ears2)
|
||||
|
||||
var/new_sec_color = tgui_color_picker(src, "Pick secondary ear color (only applies to some ears):","Ear Color (sec)", current_sec_color)
|
||||
if(new_sec_color)
|
||||
new_color_rgb_list = hex2rgb(new_sec_color)
|
||||
r_ears2 = new_color_rgb_list[1]
|
||||
g_ears2 = new_color_rgb_list[2]
|
||||
b_ears2 = new_color_rgb_list[3]
|
||||
|
||||
var/current_ter_color = rgb(r_ears3,g_ears3,b_ears3)
|
||||
|
||||
var/new_ter_color = tgui_color_picker(src, "Pick tertiary ear color (only applies to some ears):","Ear Color (sec)", current_ter_color)
|
||||
if(new_ter_color)
|
||||
new_color_rgb_list = hex2rgb(new_sec_color)
|
||||
r_ears3 = new_color_rgb_list[1]
|
||||
g_ears3 = new_color_rgb_list[2]
|
||||
b_ears3 = new_color_rgb_list[3]
|
||||
|
||||
var/new_ear_alpha = tgui_input_number(src, "Set ear alpha (0-255):","Ear Alpha", a_ears,255,0)
|
||||
if(new_ear_alpha)
|
||||
a_ears = new_ear_alpha
|
||||
|
||||
update_hair() //Includes Virgo ears
|
||||
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_secondary_ears()
|
||||
set name = "Select Secondary Ears"
|
||||
set category = "Abilities.Shapeshift"
|
||||
|
||||
if(stat || world.time < last_special)
|
||||
return
|
||||
last_special = world.time + 1 SECONDS
|
||||
|
||||
// Construct the list of names allowed for this user.
|
||||
var/list/pretty_ear_styles = list("Normal" = null)
|
||||
for(var/path in ear_styles_list)
|
||||
var/datum/sprite_accessory/ears/instance = ear_styles_list[path]
|
||||
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
|
||||
pretty_ear_styles[instance.name] = path
|
||||
|
||||
// Handle style pick
|
||||
var/new_ear_style = tgui_input_list(src, "Pick some ears!", "Character Preference", pretty_ear_styles)
|
||||
if(!new_ear_style)
|
||||
return
|
||||
ear_secondary_style = ear_styles_list[pretty_ear_styles[new_ear_style]]
|
||||
|
||||
// Handle color picks
|
||||
if(ear_secondary_style)
|
||||
var/list/new_colors = list()
|
||||
for(var/channel in 1 to ear_secondary_style.get_color_channel_count())
|
||||
var/channel_name = GLOB.fancy_sprite_accessory_color_channel_names[channel]
|
||||
var/default = LAZYACCESS(ear_secondary_colors, channel) || "#ffffff"
|
||||
var/new_color = tgui_color_picker(src, "Pick [channel_name]", "Ear Color ([channel_name])", default)
|
||||
new_colors += new_color || default
|
||||
|
||||
var/new_ear_alpha = tgui_input_number(src, "Set ear alpha (0-255):","Ear Alpha", a_ears2,255,0)
|
||||
if(new_ear_alpha)
|
||||
a_ears2 = new_ear_alpha
|
||||
|
||||
update_hair()
|
||||
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_tail()
|
||||
set name = "Select Tail"
|
||||
set category = "Abilities.Shapeshift"
|
||||
|
||||
if(stat || world.time < last_special)
|
||||
return
|
||||
|
||||
last_special = world.time + 10
|
||||
// Construct the list of names allowed for this user.
|
||||
var/list/pretty_tail_styles = list("Normal" = null)
|
||||
for(var/path in tail_styles_list)
|
||||
var/datum/sprite_accessory/tail/instance = tail_styles_list[path]
|
||||
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
|
||||
pretty_tail_styles[instance.name] = path
|
||||
|
||||
// Present choice to user
|
||||
var/new_tail_style = tgui_input_list(src, "Pick a tail!", "Character Preference", pretty_tail_styles)
|
||||
if(!new_tail_style)
|
||||
return
|
||||
|
||||
//Set new style
|
||||
tail_style = tail_styles_list[pretty_tail_styles[new_tail_style]]
|
||||
|
||||
//Allow color picks
|
||||
var/current_pri_color = rgb(r_tail,g_tail,b_tail)
|
||||
|
||||
var/new_pri_color = tgui_color_picker(src, "Pick primary tail color:","Tail Color (Pri)", current_pri_color)
|
||||
if(new_pri_color)
|
||||
var/list/new_color_rgb_list = hex2rgb(new_pri_color)
|
||||
r_tail = new_color_rgb_list[1]
|
||||
g_tail = new_color_rgb_list[2]
|
||||
b_tail = new_color_rgb_list[3]
|
||||
|
||||
//Indented inside positive primary color choice, don't bother if they clicked cancel
|
||||
var/current_sec_color = rgb(r_tail2,g_tail2,b_tail2)
|
||||
|
||||
var/new_sec_color = tgui_color_picker(src, "Pick secondary tail color (only applies to some tails):","Tail Color (sec)", current_sec_color)
|
||||
if(new_sec_color)
|
||||
new_color_rgb_list = hex2rgb(new_sec_color)
|
||||
r_tail2 = new_color_rgb_list[1]
|
||||
g_tail2 = new_color_rgb_list[2]
|
||||
b_tail2 = new_color_rgb_list[3]
|
||||
|
||||
var/current_ter_color = rgb(r_tail3,g_tail3,b_tail3)
|
||||
|
||||
var/new_ter_color = tgui_color_picker(src, "Pick tertiary tail color (only applies to some tails):","Tail Color (sec)", current_ter_color)
|
||||
if(new_ter_color)
|
||||
new_color_rgb_list = hex2rgb(new_ter_color)
|
||||
r_tail3 = new_color_rgb_list[1]
|
||||
g_tail3 = new_color_rgb_list[2]
|
||||
b_tail3 = new_color_rgb_list[3]
|
||||
|
||||
var/new_tail_alpha = tgui_input_number(src, "Set tail alpha (0-255):","Tail Alpha", a_tail,255,0)
|
||||
if(new_tail_alpha)
|
||||
a_tail = new_tail_alpha
|
||||
|
||||
update_tail_showing()
|
||||
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_wings()
|
||||
set name = "Select Wings"
|
||||
set category = "Abilities.Shapeshift"
|
||||
|
||||
if(stat || world.time < last_special)
|
||||
return
|
||||
|
||||
last_special = world.time + 10
|
||||
// Construct the list of names allowed for this user.
|
||||
var/list/pretty_wing_styles = list("None" = null)
|
||||
for(var/path in wing_styles_list)
|
||||
var/datum/sprite_accessory/wing/instance = wing_styles_list[path]
|
||||
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
|
||||
pretty_wing_styles[instance.name] = path
|
||||
|
||||
// Present choice to user
|
||||
var/new_wing_style = tgui_input_list(src, "Pick some wings!", "Character Preference", pretty_wing_styles)
|
||||
if(!new_wing_style)
|
||||
return
|
||||
|
||||
//Set new style
|
||||
wing_style = wing_styles_list[pretty_wing_styles[new_wing_style]]
|
||||
|
||||
//Allow color picks
|
||||
var/current_color = rgb(r_wing,g_wing,b_wing)
|
||||
|
||||
var/new_color = tgui_color_picker(src, "Pick wing color:","Wing Color", current_color)
|
||||
if(new_color)
|
||||
var/list/new_color_rgb_list = hex2rgb(new_color)
|
||||
r_wing = new_color_rgb_list[1]
|
||||
g_wing = new_color_rgb_list[2]
|
||||
b_wing = new_color_rgb_list[3]
|
||||
|
||||
//Indented inside positive primary color choice, don't bother if they clicked cancel
|
||||
var/current_sec_color = rgb(r_wing2,g_wing2,b_wing2)
|
||||
|
||||
var/new_sec_color = tgui_color_picker(src, "Pick secondary wing color (only applies to some wings):","Wing Color (sec)", current_sec_color)
|
||||
if(new_sec_color)
|
||||
new_color_rgb_list = hex2rgb(new_sec_color)
|
||||
r_wing2 = new_color_rgb_list[1]
|
||||
g_wing2 = new_color_rgb_list[2]
|
||||
b_wing2 = new_color_rgb_list[3]
|
||||
|
||||
var/current_ter_color = rgb(r_wing3,g_wing3,b_wing3)
|
||||
|
||||
var/new_ter_color = tgui_color_picker(src, "Pick tertiary wing color (only applies to some wings):","Wing Color (sec)", current_ter_color)
|
||||
if(new_ter_color)
|
||||
new_color_rgb_list = hex2rgb(new_ter_color)
|
||||
r_wing3 = new_color_rgb_list[1]
|
||||
g_wing3 = new_color_rgb_list[2]
|
||||
b_wing3 = new_color_rgb_list[3]
|
||||
|
||||
var/new_alpha = tgui_input_number(src, "Set wing alpha (0-255):","Wing Alpha", a_wing,255,0)
|
||||
if(new_alpha)
|
||||
a_wing = new_alpha
|
||||
|
||||
update_wing_showing()
|
||||
|
||||
/mob/living/carbon/human/proc/promethean_select_opaqueness()
|
||||
|
||||
set name = "Toggle Transparency"
|
||||
set category = "Abilities.Shapeshift"
|
||||
|
||||
if(stat || world.time < last_special)
|
||||
return
|
||||
|
||||
last_special = world.time + 50
|
||||
|
||||
for(var/obj/item/organ/external/L as anything in src.organs)
|
||||
L.transparent = !L.transparent
|
||||
visible_message(span_notice("\The [src]'s internal composition seems to change."))
|
||||
update_icons_body()
|
||||
update_hair()
|
||||
|
||||
/mob/living/carbon/human/proc/shapeshifter_change_shape(var/new_species = null, var/visible = TRUE) //not sure if this needs to be moved to a separate file but
|
||||
if(!new_species)
|
||||
return
|
||||
|
||||
dna.base_species = new_species
|
||||
species.base_species = new_species
|
||||
wrapped_species_by_ref["\ref[src]"] = new_species
|
||||
if (visible)
|
||||
visible_message(span_filter_notice(span_bold("\The [src]") + " shifts and contorts, taking the form of \a [new_species]!"))
|
||||
regenerate_icons()
|
||||
|
||||
|
||||
//////////////////// Shapeshifter copy-body powers
|
||||
/// Copied from the protean version, but with some tweaks to match non-protean shapeshifters such as lleill, hanner and replicants
|
||||
|
||||
/mob/living/carbon/human/proc/shapeshifter_regenerate()
|
||||
set name = "Fully Reform"
|
||||
set desc = "Reload your appearance from whatever character slot you have loaded."
|
||||
set category = "Abilities.Shapeshift"
|
||||
var/mob/living/character = src
|
||||
if(temporary_form)
|
||||
character = temporary_form
|
||||
var/input = tgui_alert(character,{"Do you want to copy the appearance data of your currently loaded save slot?"},"Reformation",list("Reform","Cancel"))
|
||||
if(input == "Cancel" || !input)
|
||||
return
|
||||
else
|
||||
input = tgui_alert(character,{"Include Flavourtext?"},"Reformation",list("Yes","No","Cancel"))
|
||||
if(input == "Cancel" || !input)
|
||||
return
|
||||
var/flavour = 0
|
||||
if(input == "Yes")
|
||||
flavour = 1
|
||||
input = tgui_alert(character,{"Include OOC notes?"},"Reformation",list("Yes","No","Cancel"))
|
||||
if(input == "Cancel" || !input)
|
||||
return
|
||||
var/oocnotes = 0
|
||||
if(input == "Yes")
|
||||
oocnotes = 1
|
||||
to_chat(character, span_notify("You begin to reform. You will need to remain still."))
|
||||
character.visible_message(span_notify("[character] rapidly contorts and shifts!"), span_danger("You begin to reform."))
|
||||
if(do_after(character, 40,exclusive = TASK_ALL_EXCLUSIVE))
|
||||
if(character.client.prefs) //Make sure we didn't d/c
|
||||
character.client.prefs.vanity_copy_to(src, FALSE, flavour, oocnotes, FALSE)
|
||||
character.visible_message(span_notify("[character] adopts a new form!"), span_danger("You have reformed."))
|
||||
|
||||
/mob/living/carbon/human/proc/shapeshifter_copy_body()
|
||||
set name = "Copy Form"
|
||||
set desc = "If you are aggressively grabbing someone, with their consent, you can turn into a copy of them. (Without their name)."
|
||||
set category = "Abilities.Shapeshift"
|
||||
var/mob/living/character = src
|
||||
if(temporary_form)
|
||||
character = temporary_form
|
||||
|
||||
var/grabbing_but_not_enough
|
||||
var/mob/living/carbon/human/victim = null
|
||||
for(var/obj/item/grab/G in character)
|
||||
if(G.state < GRAB_AGGRESSIVE)
|
||||
grabbing_but_not_enough = TRUE
|
||||
return
|
||||
else
|
||||
victim = G.affecting
|
||||
if (!victim)
|
||||
if (grabbing_but_not_enough)
|
||||
to_chat(character, span_warning("You need a better grip to do that!"))
|
||||
else
|
||||
to_chat(character, span_notice("You need to be aggressively grabbing someone before you can copy their form."))
|
||||
return
|
||||
if (!ishuman(victim))
|
||||
to_chat(character, span_warning("You can only perform this on human mobs!"))
|
||||
return
|
||||
if (!victim.client)
|
||||
to_chat(character, span_notice("The person you try this on must have a client!"))
|
||||
return
|
||||
|
||||
|
||||
to_chat(character, span_notice("Waiting for other person's consent."))
|
||||
var/consent = tgui_alert(victim, "Allow [src] to copy what you look like?", "Consent", list("Yes", "No"))
|
||||
if (consent != "Yes")
|
||||
to_chat(character, span_notice("They declined your request."))
|
||||
return
|
||||
|
||||
var/input = tgui_alert(character,{"Copy [victim]'s flavourtext?"},"Copy Form",list("Yes","No","Cancel"))
|
||||
if(input == "Cancel" || !input)
|
||||
return
|
||||
var/flavour = 0
|
||||
if(input == "Yes")
|
||||
flavour = 1
|
||||
|
||||
var/checking = FALSE
|
||||
for(var/obj/item/grab/G in character)
|
||||
if(G.affecting == victim && G.state >= GRAB_AGGRESSIVE)
|
||||
checking = TRUE
|
||||
if (!checking)
|
||||
to_chat(character, span_warning("You lost your grip on [victim]!"))
|
||||
return
|
||||
|
||||
to_chat(character, span_notify("You begin to reassemble into [victim]. You will need to remain still."))
|
||||
character.visible_message(span_notify("[character] rapidly contorts and shifts!"), span_danger("You begin to reassemble into [victim]."))
|
||||
if(do_after(character, 40,exclusive = TASK_ALL_EXCLUSIVE))
|
||||
checking = FALSE
|
||||
for(var/obj/item/grab/G in character)
|
||||
if(G.affecting == victim && G.state >= GRAB_AGGRESSIVE)
|
||||
checking = TRUE
|
||||
if (!checking)
|
||||
to_chat(character, span_warning("You lost your grip on [victim]!"))
|
||||
return
|
||||
if(character.client) //Make sure we didn't d/c
|
||||
transform_into_other_human(victim, FALSE, flavour, FALSE)
|
||||
character.visible_message(span_notify("[character] adopts the form of [victim]!"), span_danger("You have reassembled into [victim]."))
|
||||
|
||||
@@ -1,339 +0,0 @@
|
||||
/datum/species/shapeshifter
|
||||
base_species = SPECIES_HUMAN
|
||||
selects_bodytype = SELECTS_BODYTYPE_SHAPESHIFTER
|
||||
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_ears()
|
||||
set name = "Select Ears"
|
||||
set category = "Abilities.Shapeshift"
|
||||
|
||||
if(stat || world.time < last_special)
|
||||
return
|
||||
|
||||
last_special = world.time + 10
|
||||
// Construct the list of names allowed for this user.
|
||||
var/list/pretty_ear_styles = list("Normal" = null)
|
||||
for(var/path in ear_styles_list)
|
||||
var/datum/sprite_accessory/ears/instance = ear_styles_list[path]
|
||||
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
|
||||
pretty_ear_styles[instance.name] = path
|
||||
|
||||
// Present choice to user
|
||||
var/new_ear_style = tgui_input_list(src, "Pick some ears!", "Character Preference", pretty_ear_styles)
|
||||
if(!new_ear_style)
|
||||
return
|
||||
|
||||
//Set new style
|
||||
ear_style = ear_styles_list[pretty_ear_styles[new_ear_style]]
|
||||
|
||||
//Allow color picks
|
||||
var/current_pri_color = rgb(r_ears,g_ears,b_ears)
|
||||
|
||||
var/new_pri_color = tgui_color_picker(src, "Pick primary ear color:","Ear Color (Pri)", current_pri_color)
|
||||
if(new_pri_color)
|
||||
var/list/new_color_rgb_list = hex2rgb(new_pri_color)
|
||||
r_ears = new_color_rgb_list[1]
|
||||
g_ears = new_color_rgb_list[2]
|
||||
b_ears = new_color_rgb_list[3]
|
||||
|
||||
//Indented inside positive primary color choice, don't bother if they clicked cancel
|
||||
var/current_sec_color = rgb(r_ears2,g_ears2,b_ears2)
|
||||
|
||||
var/new_sec_color = tgui_color_picker(src, "Pick secondary ear color (only applies to some ears):","Ear Color (sec)", current_sec_color)
|
||||
if(new_sec_color)
|
||||
new_color_rgb_list = hex2rgb(new_sec_color)
|
||||
r_ears2 = new_color_rgb_list[1]
|
||||
g_ears2 = new_color_rgb_list[2]
|
||||
b_ears2 = new_color_rgb_list[3]
|
||||
|
||||
var/current_ter_color = rgb(r_ears3,g_ears3,b_ears3)
|
||||
|
||||
var/new_ter_color = tgui_color_picker(src, "Pick tertiary ear color (only applies to some ears):","Ear Color (sec)", current_ter_color)
|
||||
if(new_ter_color)
|
||||
new_color_rgb_list = hex2rgb(new_sec_color)
|
||||
r_ears3 = new_color_rgb_list[1]
|
||||
g_ears3 = new_color_rgb_list[2]
|
||||
b_ears3 = new_color_rgb_list[3]
|
||||
|
||||
var/new_ear_alpha = tgui_input_number(src, "Set ear alpha (0-255):","Ear Alpha", a_ears,255,0)
|
||||
if(new_ear_alpha)
|
||||
a_ears = new_ear_alpha
|
||||
|
||||
update_hair() //Includes Virgo ears
|
||||
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_secondary_ears()
|
||||
set name = "Select Secondary Ears"
|
||||
set category = "Abilities.Shapeshift"
|
||||
|
||||
if(stat || world.time < last_special)
|
||||
return
|
||||
last_special = world.time + 1 SECONDS
|
||||
|
||||
// Construct the list of names allowed for this user.
|
||||
var/list/pretty_ear_styles = list("Normal" = null)
|
||||
for(var/path in ear_styles_list)
|
||||
var/datum/sprite_accessory/ears/instance = ear_styles_list[path]
|
||||
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
|
||||
pretty_ear_styles[instance.name] = path
|
||||
|
||||
// Handle style pick
|
||||
var/new_ear_style = tgui_input_list(src, "Pick some ears!", "Character Preference", pretty_ear_styles)
|
||||
if(!new_ear_style)
|
||||
return
|
||||
ear_secondary_style = ear_styles_list[pretty_ear_styles[new_ear_style]]
|
||||
|
||||
// Handle color picks
|
||||
if(ear_secondary_style)
|
||||
var/list/new_colors = list()
|
||||
for(var/channel in 1 to ear_secondary_style.get_color_channel_count())
|
||||
var/channel_name = GLOB.fancy_sprite_accessory_color_channel_names[channel]
|
||||
var/default = LAZYACCESS(ear_secondary_colors, channel) || "#ffffff"
|
||||
var/new_color = tgui_color_picker(src, "Pick [channel_name]", "Ear Color ([channel_name])", default)
|
||||
new_colors += new_color || default
|
||||
var/new_ear_alpha = tgui_input_number(src, "Set ear alpha (0-255):","Ear Alpha", a_ears2,255,0)
|
||||
if(new_ear_alpha)
|
||||
a_ears2 = new_ear_alpha
|
||||
update_hair()
|
||||
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_tail()
|
||||
set name = "Select Tail"
|
||||
set category = "Abilities.Shapeshift"
|
||||
|
||||
if(stat || world.time < last_special)
|
||||
return
|
||||
|
||||
last_special = world.time + 10
|
||||
// Construct the list of names allowed for this user.
|
||||
var/list/pretty_tail_styles = list("Normal" = null)
|
||||
for(var/path in tail_styles_list)
|
||||
var/datum/sprite_accessory/tail/instance = tail_styles_list[path]
|
||||
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
|
||||
pretty_tail_styles[instance.name] = path
|
||||
|
||||
// Present choice to user
|
||||
var/new_tail_style = tgui_input_list(src, "Pick a tail!", "Character Preference", pretty_tail_styles)
|
||||
if(!new_tail_style)
|
||||
return
|
||||
|
||||
//Set new style
|
||||
tail_style = tail_styles_list[pretty_tail_styles[new_tail_style]]
|
||||
|
||||
//Allow color picks
|
||||
var/current_pri_color = rgb(r_tail,g_tail,b_tail)
|
||||
|
||||
var/new_pri_color = tgui_color_picker(src, "Pick primary tail color:","Tail Color (Pri)", current_pri_color)
|
||||
if(new_pri_color)
|
||||
var/list/new_color_rgb_list = hex2rgb(new_pri_color)
|
||||
r_tail = new_color_rgb_list[1]
|
||||
g_tail = new_color_rgb_list[2]
|
||||
b_tail = new_color_rgb_list[3]
|
||||
|
||||
//Indented inside positive primary color choice, don't bother if they clicked cancel
|
||||
var/current_sec_color = rgb(r_tail2,g_tail2,b_tail2)
|
||||
|
||||
var/new_sec_color = tgui_color_picker(src, "Pick secondary tail color (only applies to some tails):","Tail Color (sec)", current_sec_color)
|
||||
if(new_sec_color)
|
||||
new_color_rgb_list = hex2rgb(new_sec_color)
|
||||
r_tail2 = new_color_rgb_list[1]
|
||||
g_tail2 = new_color_rgb_list[2]
|
||||
b_tail2 = new_color_rgb_list[3]
|
||||
|
||||
var/current_ter_color = rgb(r_tail3,g_tail3,b_tail3)
|
||||
|
||||
var/new_ter_color = tgui_color_picker(src, "Pick tertiary tail color (only applies to some tails):","Tail Color (sec)", current_ter_color)
|
||||
if(new_ter_color)
|
||||
new_color_rgb_list = hex2rgb(new_ter_color)
|
||||
r_tail3 = new_color_rgb_list[1]
|
||||
g_tail3 = new_color_rgb_list[2]
|
||||
b_tail3 = new_color_rgb_list[3]
|
||||
|
||||
|
||||
var/new_tail_alpha = tgui_input_number(src, "Set tail alpha (0-255):","Tail Alpha", a_tail,255,0)
|
||||
if(new_tail_alpha)
|
||||
a_tail = new_tail_alpha
|
||||
|
||||
update_tail_showing()
|
||||
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_wings()
|
||||
set name = "Select Wings"
|
||||
set category = "Abilities.Shapeshift"
|
||||
|
||||
if(stat || world.time < last_special)
|
||||
return
|
||||
|
||||
last_special = world.time + 10
|
||||
// Construct the list of names allowed for this user.
|
||||
var/list/pretty_wing_styles = list("None" = null)
|
||||
for(var/path in wing_styles_list)
|
||||
var/datum/sprite_accessory/wing/instance = wing_styles_list[path]
|
||||
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
|
||||
pretty_wing_styles[instance.name] = path
|
||||
|
||||
// Present choice to user
|
||||
var/new_wing_style = tgui_input_list(src, "Pick some wings!", "Character Preference", pretty_wing_styles)
|
||||
if(!new_wing_style)
|
||||
return
|
||||
|
||||
//Set new style
|
||||
wing_style = wing_styles_list[pretty_wing_styles[new_wing_style]]
|
||||
|
||||
//Allow color picks
|
||||
var/current_color = rgb(r_wing,g_wing,b_wing)
|
||||
|
||||
var/new_color = tgui_color_picker(src, "Pick wing color:","Wing Color", current_color)
|
||||
if(new_color)
|
||||
var/list/new_color_rgb_list = hex2rgb(new_color)
|
||||
r_wing = new_color_rgb_list[1]
|
||||
g_wing = new_color_rgb_list[2]
|
||||
b_wing = new_color_rgb_list[3]
|
||||
|
||||
//Indented inside positive primary color choice, don't bother if they clicked cancel
|
||||
var/current_sec_color = rgb(r_wing2,g_wing2,b_wing2)
|
||||
|
||||
var/new_sec_color = tgui_color_picker(src, "Pick secondary wing color (only applies to some wings):","Wing Color (sec)", current_sec_color)
|
||||
if(new_sec_color)
|
||||
new_color_rgb_list = hex2rgb(new_sec_color)
|
||||
r_wing2 = new_color_rgb_list[1]
|
||||
g_wing2 = new_color_rgb_list[2]
|
||||
b_wing2 = new_color_rgb_list[3]
|
||||
|
||||
var/current_ter_color = rgb(r_wing3,g_wing3,b_wing3)
|
||||
|
||||
var/new_ter_color = tgui_color_picker(src, "Pick tertiary wing color (only applies to some wings):","Wing Color (sec)", current_ter_color)
|
||||
if(new_ter_color)
|
||||
new_color_rgb_list = hex2rgb(new_ter_color)
|
||||
r_wing3 = new_color_rgb_list[1]
|
||||
g_wing3 = new_color_rgb_list[2]
|
||||
b_wing3 = new_color_rgb_list[3]
|
||||
|
||||
var/new_alpha = tgui_input_number(src, "Set wing alpha (0-255):","Wing Alpha", a_wing,255,0)
|
||||
if(new_alpha)
|
||||
a_wing = new_alpha
|
||||
|
||||
|
||||
update_wing_showing()
|
||||
|
||||
/mob/living/carbon/human/proc/promethean_select_opaqueness()
|
||||
|
||||
set name = "Toggle Transparency"
|
||||
set category = "Abilities.Shapeshift"
|
||||
|
||||
if(stat || world.time < last_special)
|
||||
return
|
||||
|
||||
last_special = world.time + 50
|
||||
|
||||
for(var/obj/item/organ/external/L as anything in src.organs)
|
||||
L.transparent = !L.transparent
|
||||
visible_message(span_notice("\The [src]'s internal composition seems to change."))
|
||||
update_icons_body()
|
||||
update_hair()
|
||||
|
||||
/mob/living/carbon/human/proc/shapeshifter_change_shape(var/new_species = null, var/visible = TRUE) //not sure if this needs to be moved to a separate file but
|
||||
if(!new_species)
|
||||
return
|
||||
|
||||
dna.base_species = new_species
|
||||
species.base_species = new_species
|
||||
wrapped_species_by_ref["\ref[src]"] = new_species
|
||||
if (visible)
|
||||
visible_message(span_filter_notice(span_bold("\The [src]") + " shifts and contorts, taking the form of \a [new_species]!"))
|
||||
regenerate_icons()
|
||||
|
||||
|
||||
//////////////////// Shapeshifter copy-body powers
|
||||
/// Copied from the protean version, but with some tweaks to match non-protean shapeshifters such as lleill, hanner and replicants
|
||||
|
||||
/mob/living/carbon/human/proc/shapeshifter_regenerate()
|
||||
set name = "Fully Reform"
|
||||
set desc = "Reload your appearance from whatever character slot you have loaded."
|
||||
set category = "Abilities.Shapeshift"
|
||||
var/mob/living/character = src
|
||||
if(temporary_form)
|
||||
character = temporary_form
|
||||
var/input = tgui_alert(character,{"Do you want to copy the appearance data of your currently loaded save slot?"},"Reformation",list("Reform","Cancel"))
|
||||
if(input == "Cancel" || !input)
|
||||
return
|
||||
else
|
||||
input = tgui_alert(character,{"Include Flavourtext?"},"Reformation",list("Yes","No","Cancel"))
|
||||
if(input == "Cancel" || !input)
|
||||
return
|
||||
var/flavour = 0
|
||||
if(input == "Yes")
|
||||
flavour = 1
|
||||
input = tgui_alert(character,{"Include OOC notes?"},"Reformation",list("Yes","No","Cancel"))
|
||||
if(input == "Cancel" || !input)
|
||||
return
|
||||
var/oocnotes = 0
|
||||
if(input == "Yes")
|
||||
oocnotes = 1
|
||||
to_chat(character, span_notify("You begin to reform. You will need to remain still."))
|
||||
character.visible_message(span_notify("[character] rapidly contorts and shifts!"), span_danger("You begin to reform."))
|
||||
if(do_after(character, 40,exclusive = TASK_ALL_EXCLUSIVE))
|
||||
if(character.client.prefs) //Make sure we didn't d/c
|
||||
character.client.prefs.vanity_copy_to(src, FALSE, flavour, oocnotes, FALSE)
|
||||
character.visible_message(span_notify("[character] adopts a new form!"), span_danger("You have reformed."))
|
||||
|
||||
/mob/living/carbon/human/proc/shapeshifter_copy_body()
|
||||
set name = "Copy Form"
|
||||
set desc = "If you are aggressively grabbing someone, with their consent, you can turn into a copy of them. (Without their name)."
|
||||
set category = "Abilities.Shapeshift"
|
||||
var/mob/living/character = src
|
||||
if(temporary_form)
|
||||
character = temporary_form
|
||||
|
||||
var/grabbing_but_not_enough
|
||||
var/mob/living/carbon/human/victim = null
|
||||
for(var/obj/item/grab/G in character)
|
||||
if(G.state < GRAB_AGGRESSIVE)
|
||||
grabbing_but_not_enough = TRUE
|
||||
return
|
||||
else
|
||||
victim = G.affecting
|
||||
if (!victim)
|
||||
if (grabbing_but_not_enough)
|
||||
to_chat(character, span_warning("You need a better grip to do that!"))
|
||||
else
|
||||
to_chat(character, span_notice("You need to be aggressively grabbing someone before you can copy their form."))
|
||||
return
|
||||
if (!ishuman(victim))
|
||||
to_chat(character, span_warning("You can only perform this on human mobs!"))
|
||||
return
|
||||
if (!victim.client)
|
||||
to_chat(character, span_notice("The person you try this on must have a client!"))
|
||||
return
|
||||
|
||||
|
||||
to_chat(character, span_notice("Waiting for other person's consent."))
|
||||
var/consent = tgui_alert(victim, "Allow [src] to copy what you look like?", "Consent", list("Yes", "No"))
|
||||
if (consent != "Yes")
|
||||
to_chat(character, span_notice("They declined your request."))
|
||||
return
|
||||
|
||||
var/input = tgui_alert(character,{"Copy [victim]'s flavourtext?"},"Copy Form",list("Yes","No","Cancel"))
|
||||
if(input == "Cancel" || !input)
|
||||
return
|
||||
var/flavour = 0
|
||||
if(input == "Yes")
|
||||
flavour = 1
|
||||
|
||||
var/checking = FALSE
|
||||
for(var/obj/item/grab/G in character)
|
||||
if(G.affecting == victim && G.state >= GRAB_AGGRESSIVE)
|
||||
checking = TRUE
|
||||
if (!checking)
|
||||
to_chat(character, span_warning("You lost your grip on [victim]!"))
|
||||
return
|
||||
|
||||
to_chat(character, span_notify("You begin to reassemble into [victim]. You will need to remain still."))
|
||||
character.visible_message(span_notify("[character] rapidly contorts and shifts!"), span_danger("You begin to reassemble into [victim]."))
|
||||
if(do_after(character, 40,exclusive = TASK_ALL_EXCLUSIVE))
|
||||
checking = FALSE
|
||||
for(var/obj/item/grab/G in character)
|
||||
if(G.affecting == victim && G.state >= GRAB_AGGRESSIVE)
|
||||
checking = TRUE
|
||||
if (!checking)
|
||||
to_chat(character, span_warning("You lost your grip on [victim]!"))
|
||||
return
|
||||
if(character.client) //Make sure we didn't d/c
|
||||
transform_into_other_human(victim, FALSE, flavour, FALSE)
|
||||
character.visible_message(span_notify("[character] adopts the form of [victim]!"), span_danger("You have reassembled into [victim]."))
|
||||
@@ -1,136 +0,0 @@
|
||||
/datum/species
|
||||
//This is so that if a race is using the chimera revive they can't use it more than once.
|
||||
//Shouldn't really be seen in play too often, but it's case an admin event happens and they give a non chimera the chimera revive. Only one person can use the chimera revive at a time per race.
|
||||
//var/reviving = 0 //commented out 'cause moved to mob
|
||||
holder_type = /obj/item/holder/micro //This allows you to pick up crew
|
||||
min_age = 18
|
||||
descriptors = list()
|
||||
|
||||
var/organic_food_coeff = 1
|
||||
var/synthetic_food_coeff = 0
|
||||
var/robo_ethanol_proc = 0 //can we get fuel from booze, as a synth?
|
||||
var/robo_ethanol_drunk = 0 //can we get *drunk* from booze, as a synth?
|
||||
var/digestion_efficiency = 1 //VORE specific digestion var
|
||||
//var/vore_numbing = 0
|
||||
var/metabolism = 0.0015
|
||||
var/lightweight = FALSE //Oof! Nonhelpful bump stumbles.
|
||||
var/trashcan = FALSE //It's always sunny in the wrestling ring.
|
||||
var/eat_minerals = FALSE //HEAVY METAL DIET
|
||||
var/base_species = null // Unused outside of a few species
|
||||
var/selects_bodytype = SELECTS_BODYTYPE_FALSE // Allows the species to choose from body types like custom species can, affecting suit fitting and etcetera as you would expect.
|
||||
|
||||
var/bloodsucker = FALSE // Allows safely getting nutrition from blood.
|
||||
var/bloodsucker_controlmode = "always loud" //Allows selecting between bloodsucker control modes. Always Loud corresponds to original implementation.
|
||||
|
||||
var/is_weaver = FALSE
|
||||
var/silk_production = FALSE
|
||||
var/silk_reserve = 100
|
||||
var/silk_max_reserve = 500
|
||||
var/silk_color = "#FFFFFF"
|
||||
|
||||
var/list/traits = list()
|
||||
//Vars that need to be copied when producing a copy of species.
|
||||
var/list/copy_vars = list("base_species", "icobase", "deform", "tail", "tail_animation", "icobase_tail", "color_mult", "primitive_form", "appearance_flags", "flesh_color", "base_color", "blood_mask", "damage_mask", "damage_overlays", "move_trail", "has_floating_eyes")
|
||||
var/trait_points = 0
|
||||
|
||||
var/ideal_air_type = null // Set to something else if you breathe something else from default composition. Used for inbelly air.
|
||||
|
||||
var/micro_size_mod = 0 // How different is our size for interactions that involve us being small?
|
||||
var/macro_size_mod = 0 // How different is our size for interactions that involve us being big?
|
||||
var/digestion_nutrition_modifier = 1
|
||||
var/center_offset = 0.5
|
||||
var/can_climb = FALSE
|
||||
var/climbing_delay = 1.5 // We climb with a quarter delay
|
||||
|
||||
var/list/food_preference = list() //RS edit
|
||||
var/food_preference_bonus = 0
|
||||
|
||||
|
||||
// For Lleill and Hanner
|
||||
var/lleill_energy = 200
|
||||
var/lleill_energy_max = 200
|
||||
|
||||
/datum/species/unathi
|
||||
vore_belly_default_variant = "L"
|
||||
|
||||
/datum/species/proc/give_numbing_bite() //Holy SHIT this is hacky, but it works. Updating a mob's attacks mid game is insane.
|
||||
unarmed_attacks = list()
|
||||
unarmed_types += /datum/unarmed_attack/bite/sharp/numbing
|
||||
for(var/u_type in unarmed_types)
|
||||
unarmed_attacks += new u_type()
|
||||
|
||||
/datum/species/create_organs(var/mob/living/carbon/human/H)
|
||||
if(H.nif)
|
||||
/*var/type = H.nif.type
|
||||
var/durability = H.nif.durability
|
||||
var/list/nifsofts = H.nif.nifsofts
|
||||
var/list/nif_savedata = H.nif.save_data.Copy()*/
|
||||
..()
|
||||
H.nif = null //A previous call during the rejuvenation path deleted it, so we no longer should have it here
|
||||
/*var/obj/item/nif/nif = new type(H,durability,nif_savedata)
|
||||
nif.nifsofts = nifsofts*/
|
||||
else
|
||||
..()
|
||||
|
||||
/datum/species/proc/produceCopy(var/list/traits, var/mob/living/carbon/human/H, var/custom_base, var/reset_dna = TRUE) // Traitgenes reset_dna flag required, or genes get reset on resleeve
|
||||
ASSERT(src)
|
||||
ASSERT(istype(H))
|
||||
var/datum/species/new_copy = new src.type()
|
||||
new_copy.race_key = race_key
|
||||
if (selects_bodytype && custom_base)
|
||||
new_copy.base_species = custom_base
|
||||
if(selects_bodytype == SELECTS_BODYTYPE_CUSTOM) //If race selects a bodytype, retrieve the custom_base species and copy needed variables.
|
||||
var/datum/species/S = GLOB.all_species[custom_base]
|
||||
S.copy_variables(new_copy, copy_vars)
|
||||
|
||||
if(selects_bodytype == SELECTS_BODYTYPE_SHAPESHIFTER)
|
||||
H.shapeshifter_change_shape(custom_base, FALSE)
|
||||
|
||||
for(var/organ in has_limbs) //Copy important organ data generated by species.
|
||||
var/list/organ_data = has_limbs[organ]
|
||||
new_copy.has_limbs[organ] = organ_data.Copy()
|
||||
|
||||
new_copy.traits = traits
|
||||
//If you had traits, apply them
|
||||
if(new_copy.traits)
|
||||
for(var/trait in new_copy.traits)
|
||||
var/datum/trait/T = all_traits[trait]
|
||||
T.apply(new_copy, H, new_copy.traits[trait])
|
||||
|
||||
//Set up a mob
|
||||
H.species = new_copy
|
||||
H.icon_state = new_copy.get_bodytype()
|
||||
|
||||
if(new_copy.holder_type)
|
||||
H.holder_type = new_copy.holder_type
|
||||
|
||||
if(H.dna && reset_dna)
|
||||
H.dna.ready_dna(H)
|
||||
handle_base_eyes(H, custom_base)
|
||||
|
||||
if(H.species.has_vibration_sense)
|
||||
H.motiontracker_subscribe()
|
||||
|
||||
return new_copy
|
||||
|
||||
//We REALLY don't need to go through every variable. Doing so makes this lag like hell on 515
|
||||
/datum/species/proc/copy_variables(var/datum/species/S, var/list/whitelist)
|
||||
//List of variables to ignore, trying to copy type will runtime.
|
||||
//var/list/blacklist = list("type", "loc", "client", "ckey")
|
||||
//Makes thorough copy of species datum.
|
||||
for(var/i in whitelist)
|
||||
if(!(i in S.vars)) //Don't copy incompatible vars.
|
||||
continue
|
||||
if(S.vars[i] != vars[i] && !islist(vars[i])) //If vars are same, no point in copying.
|
||||
S.vars[i] = vars[i]
|
||||
|
||||
/datum/species/get_bodytype()
|
||||
return base_species
|
||||
|
||||
/datum/species/proc/update_vore_belly_def_variant()
|
||||
// Determine the actual vore_belly_default_variant, if the base species in the VORE tab is set
|
||||
switch (base_species)
|
||||
if("Teshari")
|
||||
vore_belly_default_variant = "T"
|
||||
if("Unathi")
|
||||
vore_belly_default_variant = "L"
|
||||
@@ -137,3 +137,89 @@
|
||||
flesh_color = "#34AF10"
|
||||
base_color = "#066000"
|
||||
reagent_tag = IS_UNATHI
|
||||
|
||||
/datum/species/monkey/shark
|
||||
name = SPECIES_MONKEY_AKULA
|
||||
name_plural = "Sobaka"
|
||||
icobase = 'icons/mob/human_races/monkeys/r_sobaka_vr.dmi'
|
||||
deform = 'icons/mob/human_races/monkeys/r_sobaka_vr.dmi'
|
||||
tail = null //The tail is part of its body due to tail using the "icons/effects/species.dmi" file. It must be null, or they'll have a chimp tail.
|
||||
greater_form = SPECIES_AKULA
|
||||
default_language = "Skrellian" //Closest we have.
|
||||
|
||||
/datum/species/monkey/sergal
|
||||
name = SPECIES_MONKEY_SERGAL
|
||||
greater_form = "Sergal"
|
||||
icobase = 'icons/mob/human_races/monkeys/r_sergaling_vr.dmi'
|
||||
deform = 'icons/mob/human_races/monkeys/r_sergaling_vr.dmi'
|
||||
tail = null
|
||||
default_language = LANGUAGE_SAGARU
|
||||
|
||||
/datum/species/monkey/sparra
|
||||
name = SPECIES_MONKEY_NEVREAN
|
||||
name_plural = "Sparra"
|
||||
greater_form = SPECIES_NEVREAN
|
||||
tail = null
|
||||
icobase = 'icons/mob/human_races/monkeys/r_sparra_vr.dmi'
|
||||
deform = 'icons/mob/human_races/monkeys/r_sparra_vr.dmi'
|
||||
default_language = LANGUAGE_BIRDSONG
|
||||
|
||||
|
||||
/* Example
|
||||
/datum/species/monkey/tajaran
|
||||
name = SPECIES_MONKEY_TAJ
|
||||
name_plural = "Farwa"
|
||||
|
||||
icobase = 'icons/mob/human_races/monkeys/r_farwa.dmi'
|
||||
deform = 'icons/mob/human_races/monkeys/r_farwa.dmi'
|
||||
|
||||
greater_form = SPECIES_TAJARAN
|
||||
default_language = "Farwa"
|
||||
flesh_color = "#AFA59E"
|
||||
base_color = "#333333"
|
||||
tail = "farwatail"
|
||||
*/
|
||||
|
||||
/datum/species/monkey/vulpkanin
|
||||
name = SPECIES_MONKEY_VULPKANIN
|
||||
name_plural = "Wolpin"
|
||||
|
||||
icobase = 'icons/mob/human_races/monkeys/r_wolpin.dmi'
|
||||
deform = 'icons/mob/human_races/monkeys/r_wolpin.dmi'
|
||||
|
||||
greater_form = SPECIES_VULPKANIN
|
||||
default_language = LANGUAGE_CANILUNZT
|
||||
flesh_color = "#966464"
|
||||
base_color = "#000000"
|
||||
tail = null
|
||||
|
||||
//INSERT CODE HERE SO MONKEYS CAN BE SPAWNED.
|
||||
//Also, M was added to the end of the spawn names to signify that it's a monkey, since some names were conflicting.
|
||||
|
||||
/mob/living/carbon/human/sharkm
|
||||
low_sorting_priority = TRUE
|
||||
|
||||
/mob/living/carbon/human/sharkm/Initialize(mapload)
|
||||
. = ..(mapload, SPECIES_MONKEY_AKULA)
|
||||
species.produceCopy(species.traits.Copy(),src,null,FALSE)
|
||||
|
||||
/mob/living/carbon/human/sergallingm
|
||||
low_sorting_priority = TRUE
|
||||
|
||||
/mob/living/carbon/human/sergallingm/Initialize(mapload)
|
||||
. = ..(mapload, SPECIES_MONKEY_SERGAL)
|
||||
species.produceCopy(species.traits.Copy(),src,null,FALSE)
|
||||
|
||||
/mob/living/carbon/human/sparram
|
||||
low_sorting_priority = TRUE
|
||||
|
||||
/mob/living/carbon/human/sparram/Initialize(mapload)
|
||||
. = ..(mapload, SPECIES_MONKEY_NEVREAN)
|
||||
species.produceCopy(species.traits.Copy(),src,null,FALSE)
|
||||
|
||||
/mob/living/carbon/human/wolpin
|
||||
low_sorting_priority = TRUE
|
||||
|
||||
/mob/living/carbon/human/wolpin/Initialize(mapload)
|
||||
. = ..(mapload, SPECIES_MONKEY_VULPKANIN)
|
||||
species.produceCopy(species.traits.Copy(),src,null,FALSE)
|
||||
|
||||
@@ -1,85 +0,0 @@
|
||||
/datum/species/monkey/shark
|
||||
name = SPECIES_MONKEY_AKULA
|
||||
name_plural = "Sobaka"
|
||||
icobase = 'icons/mob/human_races/monkeys/r_sobaka_vr.dmi'
|
||||
deform = 'icons/mob/human_races/monkeys/r_sobaka_vr.dmi'
|
||||
tail = null //The tail is part of its body due to tail using the "icons/effects/species.dmi" file. It must be null, or they'll have a chimp tail.
|
||||
greater_form = SPECIES_AKULA
|
||||
default_language = "Skrellian" //Closest we have.
|
||||
|
||||
/datum/species/monkey/sergal
|
||||
name = SPECIES_MONKEY_SERGAL
|
||||
greater_form = "Sergal"
|
||||
icobase = 'icons/mob/human_races/monkeys/r_sergaling_vr.dmi'
|
||||
deform = 'icons/mob/human_races/monkeys/r_sergaling_vr.dmi'
|
||||
tail = null
|
||||
default_language = LANGUAGE_SAGARU
|
||||
|
||||
/datum/species/monkey/sparra
|
||||
name = SPECIES_MONKEY_NEVREAN
|
||||
name_plural = "Sparra"
|
||||
greater_form = SPECIES_NEVREAN
|
||||
tail = null
|
||||
icobase = 'icons/mob/human_races/monkeys/r_sparra_vr.dmi'
|
||||
deform = 'icons/mob/human_races/monkeys/r_sparra_vr.dmi'
|
||||
default_language = LANGUAGE_BIRDSONG
|
||||
|
||||
|
||||
/* Example from Polaris code
|
||||
/datum/species/monkey/tajaran
|
||||
name = SPECIES_MONKEY_TAJ
|
||||
name_plural = "Farwa"
|
||||
|
||||
icobase = 'icons/mob/human_races/monkeys/r_farwa.dmi'
|
||||
deform = 'icons/mob/human_races/monkeys/r_farwa.dmi'
|
||||
|
||||
greater_form = SPECIES_TAJARAN
|
||||
default_language = "Farwa"
|
||||
flesh_color = "#AFA59E"
|
||||
base_color = "#333333"
|
||||
tail = "farwatail"
|
||||
*/
|
||||
|
||||
/datum/species/monkey/vulpkanin
|
||||
name = SPECIES_MONKEY_VULPKANIN
|
||||
name_plural = "Wolpin"
|
||||
|
||||
icobase = 'icons/mob/human_races/monkeys/r_wolpin.dmi'
|
||||
deform = 'icons/mob/human_races/monkeys/r_wolpin.dmi'
|
||||
|
||||
greater_form = SPECIES_VULPKANIN
|
||||
default_language = LANGUAGE_CANILUNZT
|
||||
flesh_color = "#966464"
|
||||
base_color = "#000000"
|
||||
tail = null
|
||||
|
||||
//INSERT CODE HERE SO MONKEYS CAN BE SPAWNED.
|
||||
//Also, M was added to the end of the spawn names to signify that it's a monkey, since some names were conflicting.
|
||||
|
||||
/mob/living/carbon/human/sharkm
|
||||
low_sorting_priority = TRUE
|
||||
|
||||
/mob/living/carbon/human/sharkm/Initialize(mapload)
|
||||
. = ..(mapload, SPECIES_MONKEY_AKULA)
|
||||
species.produceCopy(species.traits.Copy(),src,null,FALSE)
|
||||
|
||||
/mob/living/carbon/human/sergallingm
|
||||
low_sorting_priority = TRUE
|
||||
|
||||
/mob/living/carbon/human/sergallingm/Initialize(mapload)
|
||||
. = ..(mapload, SPECIES_MONKEY_SERGAL)
|
||||
species.produceCopy(species.traits.Copy(),src,null,FALSE)
|
||||
|
||||
/mob/living/carbon/human/sparram
|
||||
low_sorting_priority = TRUE
|
||||
|
||||
/mob/living/carbon/human/sparram/Initialize(mapload)
|
||||
. = ..(mapload, SPECIES_MONKEY_NEVREAN)
|
||||
species.produceCopy(species.traits.Copy(),src,null,FALSE)
|
||||
|
||||
/mob/living/carbon/human/wolpin
|
||||
low_sorting_priority = TRUE
|
||||
|
||||
/mob/living/carbon/human/wolpin/Initialize(mapload)
|
||||
. = ..(mapload, SPECIES_MONKEY_VULPKANIN)
|
||||
species.produceCopy(species.traits.Copy(),src,null,FALSE)
|
||||
@@ -2,7 +2,6 @@ var/datum/species/shapeshifter/promethean/prometheans
|
||||
|
||||
// Species definition follows.
|
||||
/datum/species/shapeshifter/promethean
|
||||
|
||||
name = SPECIES_PROMETHEAN
|
||||
name_plural = "Prometheans"
|
||||
blurb = "Prometheans (Macrolimus artificialis) are a species of artificially-created gelatinous humanoids, \
|
||||
@@ -10,6 +9,7 @@ var/datum/species/shapeshifter/promethean/prometheans
|
||||
mimic many forms of life. Derived from the Aetolian giant slime (Macrolimus vulgaris) inhabiting the warm, tropical planet \
|
||||
of Aetolus, they are a relatively new lab-created sapient species, and as such many things about them have yet to be comprehensively studied. \
|
||||
What has Science done?"
|
||||
wikilink="https://wiki.vore-station.net/Promethean"
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/promethean)
|
||||
show_ssd = "totally quiescent"
|
||||
death_message = "rapidly loses cohesion, splattering across the ground..."
|
||||
@@ -18,16 +18,16 @@ var/datum/species/shapeshifter/promethean/prometheans
|
||||
|
||||
blood_color = "#05FF9B"
|
||||
flesh_color = "#05FFFB"
|
||||
color_mult = 1
|
||||
|
||||
hunger_factor = 0.2
|
||||
reagent_tag = IS_SLIME
|
||||
mob_size = MOB_SMALL
|
||||
bump_flag = SLIME
|
||||
swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL
|
||||
push_flags = MONKEY|SLIME|SIMPLE_ANIMAL
|
||||
flags = NO_DNA | NO_SLEEVE | NO_SLIP | NO_MINOR_CUT | NO_HALLUCINATION | NO_INFECT | NO_DEFIB
|
||||
hunger_factor = 0.2
|
||||
reagent_tag = IS_SLIME
|
||||
mob_size = MOB_MEDIUM
|
||||
push_flags = ~HEAVY
|
||||
swap_flags = ~HEAVY
|
||||
flags = NO_DNA | NO_SLEEVE | NO_SLIP | NO_MINOR_CUT | NO_HALLUCINATION | NO_INFECT | NO_DEFIB
|
||||
appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | RADIATION_GLOWS | HAS_UNDERWEAR
|
||||
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED
|
||||
spawn_flags = SPECIES_CAN_JOIN
|
||||
health_hud_intensity = 2
|
||||
num_alternate_languages = 3
|
||||
language = LANGUAGE_PROMETHEAN
|
||||
@@ -46,12 +46,11 @@ var/datum/species/shapeshifter/promethean/prometheans
|
||||
male_cough_sounds = list('sound/effects/slime_squish.ogg')
|
||||
female_cough_sounds = list('sound/effects/slime_squish.ogg')
|
||||
|
||||
min_age = 1
|
||||
max_age = 16
|
||||
min_age = 18
|
||||
max_age = 80
|
||||
|
||||
economic_modifier = 3
|
||||
|
||||
gluttonous = 1
|
||||
virus_immune = 1
|
||||
blood_volume = 560
|
||||
brute_mod = 0.75
|
||||
@@ -79,9 +78,9 @@ var/datum/species/shapeshifter/promethean/prometheans
|
||||
siemens_coefficient = 0.8
|
||||
|
||||
water_resistance = 0
|
||||
water_damage_mod = 0.3
|
||||
water_damage_mod = 0
|
||||
|
||||
genders = list(MALE, FEMALE, NEUTER, PLURAL)
|
||||
genders = list(MALE, FEMALE, PLURAL, NEUTER)
|
||||
|
||||
unarmed_types = list(/datum/unarmed_attack/slime_glomp)
|
||||
|
||||
@@ -114,13 +113,25 @@ var/datum/species/shapeshifter/promethean/prometheans
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_shape,
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_colour,
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_hair,
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_eye_colour,
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_hair_colors,
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_gender,
|
||||
/mob/living/carbon/human/proc/regenerate
|
||||
/mob/living/carbon/human/proc/regenerate,
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_wings,
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_tail,
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_ears,
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_secondary_ears,
|
||||
/mob/living/carbon/human/proc/prommie_blobform,
|
||||
/mob/living/proc/set_size,
|
||||
/mob/living/carbon/human/proc/promethean_select_opaqueness,
|
||||
)
|
||||
|
||||
valid_transform_species = list(SPECIES_HUMAN, SPECIES_HUMAN_VATBORN, SPECIES_UNATHI, SPECIES_TAJARAN, SPECIES_SKRELL, SPECIES_DIONA, SPECIES_TESHARI, SPECIES_MONKEY)
|
||||
valid_transform_species = list(
|
||||
SPECIES_HUMAN, SPECIES_UNATHI, SPECIES_TAJARAN, SPECIES_SKRELL,
|
||||
SPECIES_DIONA, SPECIES_TESHARI, SPECIES_MONKEY, SPECIES_SERGAL,
|
||||
SPECIES_AKULA, SPECIES_NEVREAN, SPECIES_ZORREN_HIGH,
|
||||
SPECIES_FENNEC, SPECIES_VULPKANIN, SPECIES_VASILISSAN,
|
||||
SPECIES_RAPALA, SPECIES_MONKEY_SKRELL, SPECIES_MONKEY_UNATHI, SPECIES_MONKEY_TAJ, SPECIES_MONKEY_AKULA,
|
||||
SPECIES_MONKEY_VULPKANIN, SPECIES_MONKEY_SERGAL, SPECIES_MONKEY_NEVREAN)
|
||||
|
||||
var/heal_rate = 0.5 // Temp. Regen per tick.
|
||||
|
||||
@@ -182,6 +193,14 @@ var/datum/species/shapeshifter/promethean/prometheans
|
||||
H.apply_stored_shock_to(target)
|
||||
|
||||
/datum/species/shapeshifter/promethean/handle_death(var/mob/living/carbon/human/H)
|
||||
if(!H)
|
||||
return // Iono!
|
||||
|
||||
if(H.temporary_form)
|
||||
H.forceMove(H.temporary_form.drop_location())
|
||||
H.ckey = H.temporary_form.ckey
|
||||
QDEL_NULL(H.temporary_form)
|
||||
|
||||
spawn(1)
|
||||
if(H)
|
||||
H.gib()
|
||||
@@ -369,3 +388,28 @@ var/datum/species/shapeshifter/promethean/prometheans
|
||||
return span_warning("[t_she] glowing brightly with high levels of electrical activity.")
|
||||
if(35 to INFINITY)
|
||||
return span_danger("[t_she] radiating massive levels of electrical activity!")
|
||||
|
||||
/mob/living/carbon/human/proc/prommie_blobform()
|
||||
set name = "Toggle Blobform"
|
||||
set desc = "Switch between amorphous and humanoid forms."
|
||||
set category = "Abilities.Promethean"
|
||||
set hidden = FALSE
|
||||
|
||||
var/atom/movable/to_locate = temporary_form || src
|
||||
if(!isturf(to_locate.loc))
|
||||
to_chat(to_locate,span_warning("You need more space to perform this action!"))
|
||||
return
|
||||
/*
|
||||
//Blob form
|
||||
if(temporary_form)
|
||||
if(temporary_form.stat)
|
||||
to_chat(temporary_form,span_warning("You can only do this while not stunned."))
|
||||
else
|
||||
prommie_outofblob(temporary_form)
|
||||
*/
|
||||
//Human form
|
||||
else if(stat || paralysis || stunned || weakened || restrained())
|
||||
to_chat(src,span_warning("You can only do this while not stunned."))
|
||||
return
|
||||
else
|
||||
prommie_intoblob()
|
||||
|
||||
@@ -1,79 +0,0 @@
|
||||
/datum/species/shapeshifter/promethean
|
||||
min_age = 18 //Required for server rules
|
||||
max_age = 80
|
||||
push_flags = ~HEAVY
|
||||
swap_flags = ~HEAVY
|
||||
gluttonous = 0
|
||||
water_damage_mod = 0 //No water damage
|
||||
valid_transform_species = list(
|
||||
SPECIES_HUMAN, SPECIES_UNATHI, SPECIES_TAJARAN, SPECIES_SKRELL,
|
||||
SPECIES_DIONA, SPECIES_TESHARI, SPECIES_MONKEY, SPECIES_SERGAL,
|
||||
SPECIES_AKULA, SPECIES_NEVREAN, SPECIES_ZORREN_HIGH,
|
||||
SPECIES_FENNEC, SPECIES_VULPKANIN, SPECIES_VASILISSAN,
|
||||
SPECIES_RAPALA, SPECIES_MONKEY_SKRELL, SPECIES_MONKEY_UNATHI, SPECIES_MONKEY_TAJ, SPECIES_MONKEY_AKULA,
|
||||
SPECIES_MONKEY_VULPKANIN, SPECIES_MONKEY_SERGAL, SPECIES_MONKEY_NEVREAN)
|
||||
|
||||
spawn_flags = SPECIES_CAN_JOIN
|
||||
wikilink="https://wiki.vore-station.net/Promethean"
|
||||
genders = list(MALE, FEMALE, PLURAL, NEUTER)
|
||||
color_mult = 1
|
||||
mob_size = MOB_MEDIUM //As of writing, original was MOB_SMALL - Allows normal swapping
|
||||
//var/mob/living/simple_mob/slime/promethean/stored_blob = null
|
||||
appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | RADIATION_GLOWS | HAS_UNDERWEAR
|
||||
|
||||
inherent_verbs = list(
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_shape,
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_colour,
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_hair,
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_hair_colors,
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_gender,
|
||||
/mob/living/carbon/human/proc/regenerate,
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_wings,
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_tail,
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_ears,
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_secondary_ears,
|
||||
/mob/living/carbon/human/proc/prommie_blobform,
|
||||
/mob/living/proc/set_size,
|
||||
/mob/living/carbon/human/proc/promethean_select_opaqueness,
|
||||
)
|
||||
|
||||
/mob/living/carbon/human/proc/prommie_blobform()
|
||||
set name = "Toggle Blobform"
|
||||
set desc = "Switch between amorphous and humanoid forms."
|
||||
set category = "Abilities.Promethean"
|
||||
set hidden = FALSE
|
||||
|
||||
var/atom/movable/to_locate = temporary_form || src
|
||||
if(!isturf(to_locate.loc))
|
||||
to_chat(to_locate,span_warning("You need more space to perform this action!"))
|
||||
return
|
||||
/*
|
||||
//Blob form
|
||||
if(temporary_form)
|
||||
if(temporary_form.stat)
|
||||
to_chat(temporary_form,span_warning("You can only do this while not stunned."))
|
||||
else
|
||||
prommie_outofblob(temporary_form)
|
||||
*/
|
||||
//Human form
|
||||
else if(stat || paralysis || stunned || weakened || restrained())
|
||||
to_chat(src,span_warning("You can only do this while not stunned."))
|
||||
return
|
||||
else
|
||||
prommie_intoblob()
|
||||
|
||||
/datum/species/shapeshifter/promethean/handle_death(var/mob/living/carbon/human/H)
|
||||
if(!H)
|
||||
return // Iono!
|
||||
|
||||
if(H.temporary_form)
|
||||
H.forceMove(H.temporary_form.drop_location())
|
||||
H.ckey = H.temporary_form.ckey
|
||||
QDEL_NULL(H.temporary_form)
|
||||
//else if(H.stored_blob) // Should prevent phantom blobs in the aether. I don't anticipate this being an issue, but if it is just uncomment.
|
||||
// qdel(stored_blob)
|
||||
// stored_blob = null
|
||||
|
||||
spawn(1)
|
||||
if(H)
|
||||
H.gib()
|
||||
Executable → Regular
File diff suppressed because it is too large
Load Diff
@@ -1,469 +0,0 @@
|
||||
///////////////File for all snowflake/special races/////////////////////////////
|
||||
/////Anything that is spectacularly special should be put in here///////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
/datum/species/xenochimera //Scree's race.
|
||||
name = SPECIES_XENOCHIMERA
|
||||
name_plural = "Xenochimeras"
|
||||
icobase = 'icons/mob/human_races/r_xenochimera.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_xenochimera.dmi'
|
||||
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/chimera, /datum/unarmed_attack/bite/sharp)
|
||||
darksight = 8 //critters with instincts to hide in the dark need to see in the dark - about as good as tajara.
|
||||
slowdown = -0.2 //scuttly, but not as scuttly as a tajara or a teshari.
|
||||
brute_mod = 0.8 //About as tanky to brute as a Unathi. They'll probably snap and go feral when hurt though.
|
||||
burn_mod = 1.15 //As vulnerable to burn as a Tajara.
|
||||
base_species = "Xenochimera"
|
||||
selects_bodytype = SELECTS_BODYTYPE_CUSTOM
|
||||
digi_allowed = TRUE
|
||||
has_vibration_sense = TRUE
|
||||
|
||||
num_alternate_languages = 3
|
||||
species_language = null
|
||||
secondary_langs = list("Sol Common")
|
||||
//color_mult = 1 //It seemed to work fine in testing, but I've been informed it's unneeded.
|
||||
tail = "tail" //Scree's tail. Can be disabled in the vore tab by choosing "hide species specific tail sprite"
|
||||
icobase_tail = 1
|
||||
inherent_verbs = list(
|
||||
/mob/living/carbon/human/proc/reconstitute_form,
|
||||
///mob/living/carbon/human/proc/sonar_ping,
|
||||
/mob/living/carbon/human/proc/tie_hair)
|
||||
|
||||
virus_immune = 1 // They practically ARE one.
|
||||
min_age = 18
|
||||
max_age = 80
|
||||
|
||||
blurb = "Some amalgamation of different species from across the universe,with extremely unstable DNA, making them unfit for regular cloners. \
|
||||
Widely known for their voracious nature and violent tendencies when stressed or left unfed for long periods of time. \
|
||||
Most, if not all chimeras possess the ability to undergo some type of regeneration process, at the cost of energy."
|
||||
|
||||
wikilink = "https://wiki.vore-station.net/Xenochimera"
|
||||
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/xenochimera)
|
||||
|
||||
hazard_low_pressure = -1 //Prevents them from dying normally in space. Special code handled below.
|
||||
cold_level_1 = -1 // All cold debuffs are handled below in handle_environment_special
|
||||
cold_level_2 = -1
|
||||
cold_level_3 = -1
|
||||
|
||||
//primitive_form = SPECIES_MONKEY_TAJ
|
||||
|
||||
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE//Whitelisted as restricted is broken.
|
||||
flags = NO_SLEEVE | NO_DNA | NO_INFECT // | NO_DEFIB // Dying as a chimera is, quite literally, a death sentence. Well, if it wasn't for their revive, that is. Leaving NO_DEFIB there for the future/in case reversion to old 'chimera no-defib.
|
||||
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
|
||||
|
||||
genders = list(MALE, FEMALE, PLURAL, NEUTER)
|
||||
|
||||
has_organ = list( //Same organ list as tajarans, except for their SPECIAL BRAIN.
|
||||
O_HEART = /obj/item/organ/internal/heart,
|
||||
O_LUNGS = /obj/item/organ/internal/lungs,
|
||||
O_VOICE = /obj/item/organ/internal/voicebox,
|
||||
O_LIVER = /obj/item/organ/internal/liver,
|
||||
O_KIDNEYS = /obj/item/organ/internal/kidneys,
|
||||
O_BRAIN = /obj/item/organ/internal/brain/xenochimera,
|
||||
O_EYES = /obj/item/organ/internal/eyes,
|
||||
O_STOMACH = /obj/item/organ/internal/stomach,
|
||||
O_INTESTINE = /obj/item/organ/internal/intestine
|
||||
)
|
||||
|
||||
flesh_color = "#AFA59E"
|
||||
base_color = "#333333"
|
||||
blood_color = "#14AD8B"
|
||||
|
||||
reagent_tag = IS_CHIMERA
|
||||
|
||||
/datum/species/xenochimera/handle_environment_special(var/mob/living/carbon/human/H)
|
||||
//If they're KO'd/dead, or reviving, they're probably not thinking a lot about much of anything.
|
||||
if(!H.stat || !(H.revive_ready == REVIVING_NOW || H.revive_ready == REVIVING_DONE))
|
||||
handle_feralness(H)
|
||||
|
||||
//While regenerating
|
||||
if(H.revive_ready == REVIVING_NOW || H.revive_ready == REVIVING_DONE)
|
||||
H.weakened = 5
|
||||
H.canmove = 0
|
||||
H.does_not_breathe = TRUE
|
||||
var/regen_sounds = H.regen_sounds
|
||||
if(prob(2)) // 2% chance of playing squelchy noise while reviving, which is run roughly every 2 seconds/tick while regenerating.
|
||||
playsound(H, pick(regen_sounds), 30)
|
||||
H.visible_message(span_danger("<p>" + span_huge("[H.name]'s motionless form shudders grotesquely, rippling unnaturally.") + "</p>"))
|
||||
|
||||
//Cold/pressure effects when not regenerating
|
||||
else
|
||||
var/datum/gas_mixture/environment = H.loc.return_air()
|
||||
var/pressure2 = environment.return_pressure()
|
||||
var/adjusted_pressure2 = H.calculate_affecting_pressure(pressure2)
|
||||
|
||||
//Very low pressure damage
|
||||
if(adjusted_pressure2 <= 20)
|
||||
H.take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure")
|
||||
//they handle areas where they can't breathe better than most, but it still lowers their effective health as well as all the other bad stuff that comes with unbreathable environments
|
||||
if(H.getOxyLoss() >= 50)
|
||||
H.does_not_breathe = TRUE
|
||||
|
||||
//Cold hurts and gives them pain messages, eventually weakening and paralysing, but doesn't damage or trigger feral.
|
||||
//NB: 'body_temperature' used here is the 'setpoint' species var
|
||||
var/temp_diff = body_temperature - H.bodytemperature
|
||||
if(temp_diff >= 50)
|
||||
H.shock_stage = min(H.shock_stage + (temp_diff/20), 160) // Divided by 20 is the same as previous numbers, but a full scale
|
||||
H.eye_blurry = max(5,H.eye_blurry)
|
||||
|
||||
/obj/item/organ/internal/brain/xenochimera
|
||||
var/laststress = 0
|
||||
|
||||
/datum/species/xenochimera/proc/handle_feralness(var/mob/living/carbon/human/H)
|
||||
//first, calculate how stressed the chimera is
|
||||
var/laststress = 0
|
||||
var/obj/item/organ/internal/brain/xenochimera/B = H.internal_organs_by_name[O_BRAIN]
|
||||
if(B) //if you don't have a chimera brain in a chimera body somehow, you don't get the feraless protection
|
||||
laststress = B.laststress
|
||||
|
||||
//Low-ish nutrition has messages and can eventually cause feralness
|
||||
var/hunger = max(0, 150 - H.nutrition)
|
||||
|
||||
//pain makes feralness a thing
|
||||
var/shock = 0.75*H.traumatic_shock
|
||||
|
||||
//Caffeinated or otherwise overexcited xenochimera can become feral and have special messages
|
||||
var/jittery = max(0, H.jitteriness - 100)
|
||||
|
||||
//To reduce distant object references
|
||||
var/feral = H.feral
|
||||
|
||||
//Are we in danger of ferality?
|
||||
var/danger = FALSE
|
||||
var/feral_state = FALSE
|
||||
|
||||
//finally, calculate the current stress total the chimera is operating under, and the cause
|
||||
var/currentstress = (hunger + shock + jittery)
|
||||
var/cause = "stress"
|
||||
if(hunger > shock && hunger > jittery)
|
||||
cause = "hunger"
|
||||
else if (shock > hunger && shock > jittery)
|
||||
cause = "shock"
|
||||
else if (jittery > shock && jittery > hunger)
|
||||
cause = "jittery"
|
||||
|
||||
//check to see if they go feral if they weren't before
|
||||
if(!feral && !isbelly(H.loc))
|
||||
// if stress is below 15, no chance of snapping. Also if they weren't feral before, they won't suddenly become feral unless they get MORE stressed
|
||||
if((currentstress > laststress) && prob(clamp(currentstress-15, 0, 100)) )
|
||||
go_feral(H, currentstress, cause)
|
||||
feral = currentstress //update the local var
|
||||
|
||||
//they didn't go feral, give 'em a chance of hunger messages
|
||||
else if(H.nutrition <= 200 && prob(0.5))
|
||||
switch(H.nutrition)
|
||||
if(150 to 200)
|
||||
to_chat(H,span_info("You feel rather hungry. It might be a good idea to find some some food..."))
|
||||
if(100 to 150)
|
||||
to_chat(H,span_warning("You feel like you're going to snap and give in to your hunger soon... It would be for the best to find some [pick("food","prey")] to eat..."))
|
||||
danger = TRUE
|
||||
|
||||
//now the check's done, update their brain so it remembers how stressed they were
|
||||
if(B && !isbelly(H.loc)) //another sanity check for brain implant shenanigans, also no you don't get to hide in a belly and get your laststress set to a huge amount to skip rolls
|
||||
B.laststress = currentstress
|
||||
|
||||
// Handle being feral
|
||||
if(feral)
|
||||
//We're feral
|
||||
feral_state = TRUE
|
||||
|
||||
//If they're still stressed, they stay feral
|
||||
if(currentstress >= 15)
|
||||
danger = TRUE
|
||||
feral = max(feral, currentstress)
|
||||
|
||||
else
|
||||
feral = max(0,--feral)
|
||||
|
||||
// Being in a belly or in the darkness decreases stress further. Helps mechanically reward players for staying in darkness + RP'ing appropriately. :9
|
||||
var/turf/T = get_turf(H)
|
||||
if(feral && (isbelly(H.loc) || T.get_lumcount() <= 0.1))
|
||||
feral = max(0,--feral)
|
||||
|
||||
//Set our real mob's var to our temp var
|
||||
H.feral = feral
|
||||
|
||||
//Did we just finish being feral?
|
||||
if(!feral)
|
||||
feral_state = FALSE
|
||||
to_chat(H,span_info("Your thoughts start clearing, your feral urges having passed - for the time being, at least."))
|
||||
log_and_message_admins("is no longer feral.", H)
|
||||
update_xenochimera_hud(H, danger, feral_state)
|
||||
return
|
||||
|
||||
//If they lose enough health to hit softcrit, handle_shock() will keep resetting this. Otherwise, pissed off critters will lose shock faster than they gain it.
|
||||
H.shock_stage = max(H.shock_stage-(feral/20), 0)
|
||||
|
||||
//Handle light/dark areas
|
||||
var/turf/T = get_turf(H)
|
||||
if(!T)
|
||||
update_xenochimera_hud(H, danger, feral_state)
|
||||
return //Nullspace
|
||||
var/darkish = T.get_lumcount() <= 0.1
|
||||
|
||||
//Don't bother doing heavy lifting if we weren't going to give emotes anyway.
|
||||
if(!prob(1))
|
||||
|
||||
//This is basically the 'lite' version of the below block.
|
||||
var/list/nearby = H.living_mobs(world.view)
|
||||
|
||||
//Not in the dark, or a belly, and out in the open.
|
||||
if(!darkish && isturf(H.loc) && !isbelly(H.loc)) // Added specific check for if in belly
|
||||
|
||||
//Always handle feral if nobody's around and not in the dark.
|
||||
if(!nearby.len)
|
||||
H.handle_feral()
|
||||
|
||||
//Rarely handle feral if someone is around
|
||||
else if(prob(1))
|
||||
H.handle_feral()
|
||||
|
||||
//And bail
|
||||
update_xenochimera_hud(H, danger, feral_state)
|
||||
return
|
||||
|
||||
// In the darkness, or "hidden", or in a belly. No need for custom scene-protection checks as it's just an occational infomessage.
|
||||
if(darkish || !isturf(H.loc) || isbelly(H.loc)) // Specific check for if in belly. !isturf should do this, but JUST in case.
|
||||
// If hurt, tell 'em to heal up
|
||||
if (cause == "shock")
|
||||
to_chat(H,span_info("This place seems safe, secure, hidden, a place to lick your wounds and recover..."))
|
||||
|
||||
//If hungry, nag them to go and find someone or something to eat.
|
||||
else if(cause == "hunger")
|
||||
to_chat(H,span_info("Secure in your hiding place, your hunger still gnaws at you. You need to catch some food..."))
|
||||
|
||||
//If jittery, etc
|
||||
else if(cause == "jittery")
|
||||
to_chat(H,span_info("sneakysneakyyesyesyescleverhidingfindthingsyessssss"))
|
||||
|
||||
//Otherwise, just tell them to keep hiding.
|
||||
else
|
||||
to_chat(H,span_info("...safe..."))
|
||||
|
||||
// NOT in the darkness
|
||||
else
|
||||
|
||||
//Twitch twitch
|
||||
if(!H.stat)
|
||||
H.emote("twitch")
|
||||
|
||||
var/list/nearby = H.living_mobs(world.view)
|
||||
|
||||
// Someone/something nearby
|
||||
if(nearby.len)
|
||||
var/M = pick(nearby)
|
||||
if(cause == "shock")
|
||||
to_chat(H,span_danger("You're hurt, in danger, exposed, and [M] looks to be a little too close for comfort..."))
|
||||
else
|
||||
to_chat(H,span_danger("Every movement, every flick, every sight and sound has your full attention, your hunting instincts on high alert... In fact, [M] looks extremely appetizing..."))
|
||||
|
||||
// Nobody around
|
||||
else
|
||||
if(cause == "hunger")
|
||||
to_chat(H,span_danger("Confusing sights and sounds and smells surround you - scary and disorienting it may be, but the drive to hunt, to feed, to survive, compels you."))
|
||||
else if(cause == "jittery")
|
||||
to_chat(H,span_danger("yesyesyesyesyesyesgetthethingGETTHETHINGfindfoodsfindpreypounceyesyesyes"))
|
||||
else
|
||||
to_chat(H,span_danger("Confusing sights and sounds and smells surround you, this place is wrong, confusing, frightening. You need to hide, go to ground..."))
|
||||
|
||||
// HUD update time
|
||||
update_xenochimera_hud(H, danger, feral_state)
|
||||
|
||||
/datum/species/xenochimera/proc/go_feral(var/mob/living/carbon/human/H, var/stress, var/cause)
|
||||
// Going feral due to hunger
|
||||
if(cause == "hunger")
|
||||
to_chat(H,span_danger(span_large("Something in your mind flips, your instincts taking over, no longer able to fully comprehend your surroundings as survival becomes your primary concern - you must feed, survive, there is nothing else. Hunt. Eat. Hide. Repeat.")))
|
||||
log_and_message_admins("has gone feral due to hunger.", H)
|
||||
|
||||
// If they're hurt, chance of snapping.
|
||||
else if(cause == "shock")
|
||||
//If the majority of their shock is due to halloss, give them a different message (3x multiplier on check as halloss is 2x - meaning t_s must be at least 3x for other damage sources to be the greater part)
|
||||
if(3*H.halloss >= H.traumatic_shock)
|
||||
to_chat(H,span_danger(span_large("The pain! It stings! Got to get away! Your instincts take over, urging you to flee, to hide, to go to ground, get away from here...")))
|
||||
log_and_message_admins("has gone feral due to halloss.", H)
|
||||
|
||||
//Majority due to other damage sources
|
||||
else
|
||||
to_chat(H,span_danger(span_large("Your fight-or-flight response kicks in, your injuries too much to simply ignore - you need to flee, to hide, survive at all costs - or destroy whatever is threatening you.")))
|
||||
log_and_message_admins("has gone feral due to injury.", H)
|
||||
|
||||
//No hungry or shock, but jittery
|
||||
else if(cause == "jittery")
|
||||
to_chat(H,span_warning(span_large("Suddenly, something flips - everything that moves is... potential prey. A plaything. This is great! Time to hunt!")))
|
||||
log_and_message_admins("has gone feral due to jitteriness.", H)
|
||||
|
||||
else // catch-all just in case something weird happens
|
||||
to_chat(H,span_warning(span_large("The stress of your situation is too much for you, and your survival instincts kick in!")))
|
||||
log_and_message_admins("has gone feral for unknown reasons.", H)
|
||||
//finally, set their feral var
|
||||
H.feral = stress
|
||||
if(!H.stat)
|
||||
H.emote("twitch")
|
||||
|
||||
/datum/species/xenochimera/get_race_key()
|
||||
var/datum/species/real = GLOB.all_species[base_species]
|
||||
return real.race_key
|
||||
|
||||
/datum/species/xenochimera/proc/update_xenochimera_hud(var/mob/living/carbon/human/H, var/danger, var/feral)
|
||||
if(H.xenochimera_danger_display)
|
||||
H.xenochimera_danger_display.invisibility = 0
|
||||
if(danger && feral)
|
||||
H.xenochimera_danger_display.icon_state = "danger11"
|
||||
else if(danger && !feral)
|
||||
H.xenochimera_danger_display.icon_state = "danger10"
|
||||
else if(!danger && feral)
|
||||
H.xenochimera_danger_display.icon_state = "danger01"
|
||||
else
|
||||
H.xenochimera_danger_display.icon_state = "danger00"
|
||||
|
||||
return
|
||||
|
||||
/////////////////////
|
||||
/////SPIDER RACE/////
|
||||
/////////////////////
|
||||
/datum/species/spider //These actually look pretty damn spooky!
|
||||
name = SPECIES_VASILISSAN
|
||||
name_plural = "Vasilissans"
|
||||
icobase = 'icons/mob/human_races/r_spider.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_spider.dmi'
|
||||
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
|
||||
darksight = 8 //Can see completely in the dark. They are spiders, after all. Not that any of this matters because people will be using custom race.
|
||||
slowdown = -0.15 //Small speedboost, as they've got a bunch of legs. Or something. I dunno.
|
||||
brute_mod = 0.8 //20% brute damage reduction
|
||||
burn_mod = 1.15 //15% burn damage increase. They're spiders. Aerosol can+lighter = dead spiders.
|
||||
throwforce_absorb_threshold = 10
|
||||
digi_allowed = TRUE
|
||||
|
||||
num_alternate_languages = 3
|
||||
species_language = LANGUAGE_VESPINAE
|
||||
secondary_langs = list(LANGUAGE_VESPINAE)
|
||||
color_mult = 1
|
||||
tail = "tail" //Spider tail.
|
||||
icobase_tail = 1
|
||||
|
||||
inherent_verbs = list(
|
||||
/mob/living/carbon/human/proc/check_silk_amount,
|
||||
/mob/living/carbon/human/proc/toggle_silk_production,
|
||||
/mob/living/carbon/human/proc/weave_structure,
|
||||
/mob/living/carbon/human/proc/weave_item,
|
||||
/mob/living/carbon/human/proc/set_silk_color,
|
||||
/mob/living/carbon/human/proc/tie_hair)
|
||||
|
||||
min_age = 18
|
||||
max_age = 80
|
||||
|
||||
blurb = "Vasilissans are a tall, lanky, spider like people. \
|
||||
Each having four eyes, an extra four, large legs sprouting from their back, and a chitinous plating on their body, and the ability to spit webs \
|
||||
from their mandible lined mouths. They are a recent discovery by Nanotrasen, only being discovered roughly seven years ago. \
|
||||
Before they were found they built great cities out of their silk, being united and subjugated in warring factions under great Star Queens \
|
||||
Who forced the working class to build huge, towering cities to attempt to reach the stars, which they worship as gems of great spiritual and magical significance."
|
||||
|
||||
wikilink = "https://wiki.vore-station.net/Vasilissans"
|
||||
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/vasilissan)
|
||||
|
||||
hazard_low_pressure = 20 //Prevents them from dying normally in space. Special code handled below.
|
||||
cold_level_1 = -1 // All cold debuffs are handled below in handle_environment_special
|
||||
cold_level_2 = -1
|
||||
cold_level_3 = -1
|
||||
|
||||
//primitive_form = SPECIES_MONKEY //I dunno. Replace this in the future.
|
||||
|
||||
flags = NO_MINOR_CUT
|
||||
spawn_flags = SPECIES_CAN_JOIN
|
||||
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
|
||||
|
||||
genders = list(MALE, FEMALE, PLURAL, NEUTER)
|
||||
|
||||
flesh_color = "#AFA59E" //Gray-ish. Not sure if this is really needed, but eh.
|
||||
base_color = "#333333" //Blackish-gray
|
||||
blood_color = "#0952EF" //Spiders have blue blood.
|
||||
|
||||
is_weaver = TRUE
|
||||
silk_reserve = 500
|
||||
silk_max_reserve = 1000
|
||||
|
||||
climb_mult = 0.75
|
||||
|
||||
/datum/species/spider/handle_environment_special(var/mob/living/carbon/human/H)
|
||||
if(H.stat == DEAD) // If they're dead they won't need anything.
|
||||
return
|
||||
|
||||
if(H.bodytemperature <= 260) //If they're really cold, they go into stasis.
|
||||
var/coldshock = 0
|
||||
if(H.bodytemperature <= 260 && H.bodytemperature >= 200) //Chilly.
|
||||
coldshock = 4 //This will begin to knock them out until they run out of oxygen and suffocate or until someone finds them.
|
||||
H.eye_blurry = 5 //Blurry vision in the cold.
|
||||
if(H.bodytemperature <= 199 && H.bodytemperature >= 100) //Extremely cold. Even in somewhere like the server room it takes a while for bodytemp to drop this low.
|
||||
coldshock = 8
|
||||
H.eye_blurry = 5
|
||||
if(H.bodytemperature <= 99) //Insanely cold.
|
||||
coldshock = 16
|
||||
H.eye_blurry = 5
|
||||
H.shock_stage = min(H.shock_stage + coldshock, 160) //cold hurts and gives them pain messages, eventually weakening and paralysing, but doesn't damage.
|
||||
return
|
||||
|
||||
/datum/species/werebeast
|
||||
name = SPECIES_WEREBEAST
|
||||
name_plural = "Werebeasts"
|
||||
icobase = 'icons/mob/human_races/r_werebeast.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_werebeast.dmi'
|
||||
icon_template = 'icons/mob/human_races/r_werebeast.dmi'
|
||||
tail = "tail"
|
||||
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
|
||||
total_health = 200
|
||||
brute_mod = 0.85
|
||||
burn_mod = 0.85
|
||||
metabolic_rate = 2
|
||||
item_slowdown_mod = 0.25
|
||||
hunger_factor = 0.4
|
||||
darksight = 8
|
||||
mob_size = MOB_LARGE
|
||||
num_alternate_languages = 3
|
||||
secondary_langs = list(LANGUAGE_CANILUNZT)
|
||||
name_language = LANGUAGE_CANILUNZT
|
||||
species_language = LANGUAGE_CANILUNZT
|
||||
primitive_form = SPECIES_MONKEY_VULPKANIN
|
||||
color_mult = 1
|
||||
icon_height = 64
|
||||
can_climb = TRUE
|
||||
climbing_delay = 1
|
||||
|
||||
min_age = 18
|
||||
max_age = 200
|
||||
|
||||
blurb = "Big buff werewolves. These are a limited functionality event species that are not balanced for regular gameplay. Adminspawn only."
|
||||
|
||||
wikilink="N/A"
|
||||
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/vulpkanin)
|
||||
|
||||
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
|
||||
appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_EYE_COLOR
|
||||
|
||||
flesh_color = "#AFA59E"
|
||||
base_color = "#777777"
|
||||
|
||||
genders = list(MALE, FEMALE, PLURAL, NEUTER)
|
||||
|
||||
heat_discomfort_strings = list(
|
||||
"Your fur prickles in the heat.",
|
||||
"You feel uncomfortably warm.",
|
||||
"Your overheated skin itches."
|
||||
)
|
||||
|
||||
has_limbs = list(
|
||||
BP_TORSO = list("path" = /obj/item/organ/external/chest),
|
||||
BP_GROIN = list("path" = /obj/item/organ/external/groin),
|
||||
BP_HEAD = list("path" = /obj/item/organ/external/head/werebeast),
|
||||
BP_L_ARM = list("path" = /obj/item/organ/external/arm),
|
||||
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
|
||||
BP_L_LEG = list("path" = /obj/item/organ/external/leg),
|
||||
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
|
||||
BP_L_HAND = list("path" = /obj/item/organ/external/hand),
|
||||
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
|
||||
BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
|
||||
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
|
||||
)
|
||||
@@ -1,688 +0,0 @@
|
||||
/datum/species/sergal
|
||||
name = SPECIES_SERGAL
|
||||
name_plural = "Sergals"
|
||||
icobase = 'icons/mob/human_races/r_sergal.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_sergal.dmi'
|
||||
tail = "tail"
|
||||
icobase_tail = 1
|
||||
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
|
||||
//darksight = 8
|
||||
//slowdown = -0.5
|
||||
//brute_mod = 1.15
|
||||
//burn_mod = 1.15
|
||||
//gluttonous = 1
|
||||
num_alternate_languages = 3
|
||||
secondary_langs = list(LANGUAGE_SAGARU)
|
||||
name_language = LANGUAGE_SAGARU
|
||||
species_language = LANGUAGE_SAGARU
|
||||
color_mult = 1
|
||||
inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair)
|
||||
digi_allowed = TRUE
|
||||
|
||||
min_age = 18
|
||||
max_age = 80
|
||||
|
||||
blurb = "There are two subspecies of Sergal; Southern and Northern. Northern sergals are a highly aggressive race \
|
||||
that lives in the plains and tundra of their homeworld. They are characterized by long, fluffy fur bodies with cold colors; \
|
||||
usually with white abdomens, somewhat short ears, and thick faces. Southern sergals are much more docile and live in the \
|
||||
Gold Ring City and are scattered around the outskirts in rural areas and small towns. They usually have short, brown or yellow \
|
||||
(or other 'earthy' colors) fur, long ears, and a long, thin face. They are smaller than their Northern relatives. Both have strong \
|
||||
racial tensions which has resulted in more than a number of wars and outright attempts at genocide. Sergals have an incredibly long \
|
||||
lifespan, but due to their lust for violence, only a handful have ever survived beyond the age of 80, such as the infamous and \
|
||||
legendary General Rain Silves who is claimed to have lived to 5000."
|
||||
|
||||
wikilink="https://wiki.vore-station.net/Backstory#Sergal"
|
||||
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/sergal)
|
||||
|
||||
primitive_form = SPECIES_MONKEY_SERGAL
|
||||
|
||||
spawn_flags = SPECIES_CAN_JOIN
|
||||
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
|
||||
|
||||
flesh_color = "#AFA59E"
|
||||
base_color = "#777777"
|
||||
|
||||
genders = list(MALE, FEMALE, PLURAL, NEUTER)
|
||||
|
||||
heat_discomfort_strings = list(
|
||||
"Your fur prickles in the heat.",
|
||||
"You feel uncomfortably warm.",
|
||||
"Your overheated skin itches."
|
||||
)
|
||||
|
||||
has_limbs = list(
|
||||
BP_TORSO = list("path" = /obj/item/organ/external/chest),
|
||||
BP_GROIN = list("path" = /obj/item/organ/external/groin),
|
||||
BP_HEAD = list("path" = /obj/item/organ/external/head/sergal),
|
||||
BP_L_ARM = list("path" = /obj/item/organ/external/arm),
|
||||
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
|
||||
BP_L_LEG = list("path" = /obj/item/organ/external/leg),
|
||||
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
|
||||
BP_L_HAND = list("path" = /obj/item/organ/external/hand),
|
||||
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
|
||||
BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
|
||||
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
|
||||
)
|
||||
|
||||
/datum/species/akula
|
||||
name = SPECIES_AKULA
|
||||
name_plural = "Akula"
|
||||
icobase = 'icons/mob/human_races/r_akula.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_akula.dmi'
|
||||
tail = "tail"
|
||||
icobase_tail = 1
|
||||
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
|
||||
//darksight = 8
|
||||
//slowdown = -0.5
|
||||
//brute_mod = 1.15
|
||||
//burn_mod = 1.15
|
||||
//gluttonous = 1
|
||||
num_alternate_languages = 3
|
||||
secondary_langs = list(LANGUAGE_SPACER)
|
||||
name_language = LANGUAGE_SPACER
|
||||
species_language = LANGUAGE_SPACER
|
||||
color_mult = 1
|
||||
assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX, LANGUAGE_PROMETHEAN)
|
||||
inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair, /mob/living/carbon/human/proc/water_stealth, /mob/living/carbon/human/proc/underwater_devour)
|
||||
min_age = 18
|
||||
max_age = 80
|
||||
digi_allowed = TRUE
|
||||
|
||||
blurb = "The Akula are a species of amphibious humanoids like the Skrell, but have an appearance very similar to that of a shark. \
|
||||
They were first discovered as a primitive race of underwater dwelling tribal creatures by the Skrell. At first they were not believed \
|
||||
to be noteworthy, but the Akula proved to be such swift and clever learners that the Skrell reclassified them as sentients. Allegedly, \
|
||||
the Akula were also the first sentient life that the Skrell had ever encountered beside themselves, and thus the two species became swift \
|
||||
allies over the next few hundred years. With the help of Skrellean technology, the Akula had their genome modified to be capable of \
|
||||
surviving in open air for long periods of time. However, Akula even today still require a high humidity environment to avoid drying out \
|
||||
after a few days, which would make life on an arid world like Virgo-Prime nearly impossible if it were not for Skrellean technology to aid them."
|
||||
|
||||
wikilink="https://wiki.vore-station.net/Backstory#Akula"
|
||||
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/akula)
|
||||
|
||||
primitive_form = SPECIES_MONKEY_AKULA
|
||||
|
||||
genders = list(MALE, FEMALE, PLURAL, NEUTER)
|
||||
|
||||
spawn_flags = SPECIES_CAN_JOIN
|
||||
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
|
||||
|
||||
water_breather = TRUE
|
||||
water_movement = -4 //Negates shallow. Halves deep.
|
||||
swim_mult = 0.5
|
||||
|
||||
flesh_color = "#AFA59E"
|
||||
base_color = "#777777"
|
||||
blood_color = "#1D2CBF"
|
||||
|
||||
/datum/species/nevrean
|
||||
name = SPECIES_NEVREAN
|
||||
name_plural = "Nevreans"
|
||||
icobase = 'icons/mob/human_races/r_nevrean.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_nevrean.dmi'
|
||||
tail = "tail"
|
||||
icobase_tail = 1
|
||||
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
|
||||
//darksight = 8
|
||||
//slowdown = -0.5
|
||||
//brute_mod = 1.15
|
||||
//burn_mod = 1.15
|
||||
//gluttonous = 1
|
||||
soft_landing = TRUE
|
||||
num_alternate_languages = 3
|
||||
secondary_langs = list(LANGUAGE_BIRDSONG)
|
||||
name_language = LANGUAGE_BIRDSONG
|
||||
species_language = LANGUAGE_BIRDSONG
|
||||
color_mult = 1
|
||||
inherent_verbs = list(/mob/living/proc/flying_toggle,
|
||||
/mob/living/proc/flying_vore_toggle,
|
||||
/mob/living/proc/start_wings_hovering,
|
||||
/mob/living/carbon/human/proc/tie_hair)
|
||||
min_age = 18
|
||||
max_age = 80
|
||||
digi_allowed = TRUE
|
||||
|
||||
blurb = "Nevreans are a race of avian and dinosaur-like creatures living on Tal. They belong to a group of races that hails from Eltus, \
|
||||
in the Vilous system. Unlike sergals whom they share a star system with, their species is a very peaceful one. They possess remarkable \
|
||||
intelligence and very skillful hands that are put use for constructing precision instruments, but tire-out fast when repeatedly working \
|
||||
over and over again. Consequently, they struggle to make copies of same things. Both genders have a voice that echoes a lot. Their natural \
|
||||
tone oscillates between tenor and soprano. They are excessively noisy when they quarrel in their native language."
|
||||
|
||||
wikilink="https://wiki.vore-station.net/Backstory#Nevrean"
|
||||
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/nevrean)
|
||||
|
||||
primitive_form = SPECIES_MONKEY_NEVREAN
|
||||
|
||||
genders = list(MALE, FEMALE, PLURAL, NEUTER)
|
||||
|
||||
spawn_flags = SPECIES_CAN_JOIN
|
||||
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
|
||||
|
||||
flesh_color = "#AFA59E"
|
||||
base_color = "#333333"
|
||||
|
||||
heat_discomfort_strings = list(
|
||||
"Your fur prickles in the heat.",
|
||||
"You feel uncomfortably warm.",
|
||||
"Your overheated skin itches."
|
||||
)
|
||||
|
||||
/datum/species/hi_zoxxen
|
||||
name = SPECIES_ZORREN_HIGH
|
||||
name_plural = "Zorren"
|
||||
icobase = 'icons/mob/human_races/r_fox_vr.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_fox.dmi'
|
||||
tail = "tail"
|
||||
icobase_tail = 1
|
||||
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
|
||||
num_alternate_languages = 3
|
||||
secondary_langs = list(LANGUAGE_TERMINUS)
|
||||
name_language = LANGUAGE_TERMINUS
|
||||
species_language = LANGUAGE_TERMINUS
|
||||
inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds,
|
||||
/mob/living/proc/shred_limb,
|
||||
/mob/living/carbon/human/proc/tie_hair)
|
||||
digi_allowed = TRUE
|
||||
|
||||
min_age = 18
|
||||
max_age = 80
|
||||
|
||||
blurb = "The fennec-like, blue-blooded Zorren are native to Virgo 4/Menhir and are descendants of a precursor species \
|
||||
that is thought to be responsible for the near-collapse of the biosphere of the planet. \
|
||||
With societies organised around hierarchal caste systems (such as the Royal Zorren) or freedom and strength (such as the Free Tribe Zorren), \
|
||||
they now slowly recover from their previous hubris and aim to revitalize their planet. While many Zorren live in pre-industrial conditions by necessity, \
|
||||
they are an interstellar species known for their pride and stubbornness and doggedly hold out on a Deathworld of their own creation. \
|
||||
As local species, they hold moderate sway on local corporations and are hired by NT and other companies, although they find \"Outlander\" culture deeply weird."
|
||||
wikilink="https://wiki.vore-station.net/Zorren"
|
||||
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/zorren)
|
||||
|
||||
//primitive_form = "" //We don't have fox-monkey sprites.
|
||||
|
||||
spawn_flags = SPECIES_CAN_JOIN
|
||||
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
|
||||
flesh_color = "#AFA59E"
|
||||
base_color = "#333333"
|
||||
blood_color = "#240bc4"
|
||||
blood_reagents = REAGENT_ID_COPPER
|
||||
reagent_tag = IS_ZORREN
|
||||
color_mult = 1
|
||||
|
||||
genders = list(MALE, FEMALE, PLURAL, NEUTER)
|
||||
|
||||
heat_discomfort_strings = list(
|
||||
"Your fur prickles in the heat.",
|
||||
"You feel uncomfortably warm.",
|
||||
"Your overheated skin itches."
|
||||
)
|
||||
|
||||
/datum/species/vulpkanin
|
||||
name = SPECIES_VULPKANIN
|
||||
name_plural = "Vulpkanin"
|
||||
blurb = "Vulpkanin are a species of sapient canine bipeds, who are the descendants of a lost colony during the waning days of a Precursor species, \
|
||||
from which their distant cousins, the Zorren, also originate from. Independent and iconoclast, they have abandoned the ideals of their forefathers \
|
||||
largely and prefer to look outwards as explorers and scientists to forge their own identity. They speak a guttural language known as 'Canilunzt' \
|
||||
which has a heavy emphasis on utilizing tail positioning and ear twitches to communicate intent."
|
||||
icobase = 'icons/mob/human_races/r_vulpkanin.dmi'
|
||||
deform = 'icons/mob/human_races/r_vulpkanin.dmi'
|
||||
// path = /mob/living/carbon/human/vulpkanin
|
||||
// default_language = "Sol Common"
|
||||
secondary_langs = list(LANGUAGE_CANILUNZT)
|
||||
name_language = LANGUAGE_CANILUNZT
|
||||
species_language = LANGUAGE_CANILUNZT
|
||||
primitive_form = SPECIES_MONKEY_VULPKANIN
|
||||
tail = "vulptail"
|
||||
tail_animation = 'icons/mob/species/vulpkanin/tail.dmi' // probably need more than just one of each, but w/e
|
||||
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
|
||||
darksight = 5 //worse than cats, but better than lizards. -- Poojawa
|
||||
// gluttonous = 1
|
||||
num_alternate_languages = 3
|
||||
color_mult = 1
|
||||
inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds,
|
||||
/mob/living/carbon/human/proc/tie_hair)
|
||||
digi_allowed = TRUE
|
||||
|
||||
wikilink="https://wiki.vore-station.net/Backstory#Vulpkanin"
|
||||
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/vulpkanin)
|
||||
|
||||
//Furry fox-like animals shouldn't start freezing at 5 degrees celsius.
|
||||
//Minor cold is resisted, but not severe frost.
|
||||
cold_discomfort_level = 263 //Not as good at surviving the frost as tajara, but still better than humans.
|
||||
|
||||
cold_level_1 = 243 //Default 260, other values remain at default. Starts taking damage at -30 celsius. Default tier 2 is -70 and tier 3 is -150
|
||||
|
||||
|
||||
breath_cold_level_1 = 220 // Default 240, lower is better.
|
||||
|
||||
//While foxes can survive in deserts, that's handled by zorren. It's a good contrast that our vulp find heat a little uncomfortable.
|
||||
|
||||
heat_discomfort_level = 295 //Just above standard 20 C to avoid heat message spam, same as Taj
|
||||
|
||||
heat_level_1 = 345 //Default 360
|
||||
heat_level_2 = 390 //Default 400
|
||||
heat_level_3 = 900 //Default 1000
|
||||
|
||||
breath_heat_level_1 = 370 //Default 380 - Higher is better
|
||||
breath_heat_level_2 = 445 //Default 450
|
||||
breath_heat_level_3 = 1125 //Default 1250
|
||||
|
||||
primitive_form = SPECIES_MONKEY_VULPKANIN
|
||||
|
||||
spawn_flags = SPECIES_CAN_JOIN
|
||||
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
|
||||
|
||||
genders = list(MALE, FEMALE, PLURAL, NEUTER)
|
||||
|
||||
flesh_color = "#966464"
|
||||
base_color = "#B43214"
|
||||
|
||||
min_age = 18
|
||||
max_age = 80
|
||||
|
||||
heat_discomfort_strings = list(
|
||||
"Your fur prickles in the heat.",
|
||||
"You feel uncomfortably warm.",
|
||||
"Your overheated skin itches."
|
||||
)
|
||||
|
||||
/datum/species/unathi
|
||||
mob_size = MOB_MEDIUM //To allow normal mob swapping
|
||||
spawn_flags = SPECIES_CAN_JOIN //Species_can_join is the only spawn flag all the races get, so that none of them will be whitelist only if whitelist is enabled.
|
||||
icobase = 'icons/mob/human_races/r_lizard_vr.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_lizard_vr.dmi'
|
||||
tail_animation = 'icons/mob/species/unathi/tail_vr.dmi'
|
||||
color_mult = 1
|
||||
min_age = 18
|
||||
inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair)
|
||||
gluttonous = 0
|
||||
genders = list(MALE, FEMALE, PLURAL, NEUTER)
|
||||
descriptors = list()
|
||||
blurb = "Heavily reptilian in appearance, the Unathi hail from the Uueoa-Esa system, roughly translated as 'Burning Mother'. \
|
||||
Their home planet, Moghes, is an arid climate with hot rocky plains and deserts, and a temperate band of swamps and savannas with \
|
||||
massive saltwater lakes being the closest equivalent to oceans. This environment bred a very hardy people who value ideals of honesty, \
|
||||
virtue, proficiency and bravery above all else, frequently even one's own life. These same values lend them culturally to imperialistic \
|
||||
politics, as well as often being viewed as haughty and arrogant by other interstellar species.<br><br>\
|
||||
On the stage of the interstellar political realm the Unathi are noteworthy contenders, the Moghes Hegemony possesses vast technological and \
|
||||
material prowess when compared to human contemporaries such as the Sol-Procyon Commonwealth or Ares Confederation. The Hegemony War nearly one \
|
||||
hundred years ago is a prime example of this, having engaged in brutal warfare that ultimately fell to a stalemate between all involved parties. \
|
||||
Nowadays relations remain cool and somewhat tense, although this does not prevent individual Unathi from finding reasonable career success within Human space."
|
||||
wikilink="https://wiki.vore-station.net/Unathi"
|
||||
|
||||
/datum/species/tajaran
|
||||
spawn_flags = SPECIES_CAN_JOIN
|
||||
icobase = 'icons/mob/human_races/r_tajaran_vr.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_tajaran_vr.dmi'
|
||||
tail_animation = 'icons/mob/species/tajaran/tail_vr.dmi'
|
||||
color_mult = 1
|
||||
min_age = 18
|
||||
inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair)
|
||||
allergens = null
|
||||
gluttonous = 0 //Moving this here so I don't have to fix this conflict every time polaris glances at station.dm
|
||||
inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds)
|
||||
heat_discomfort_level = 295 //Prevents heat discomfort spam at 20c
|
||||
genders = list(MALE, FEMALE, PLURAL, NEUTER)
|
||||
wikilink="https://wiki.vore-station.net/Tajaran"
|
||||
agility = 90
|
||||
can_climb = TRUE
|
||||
climbing_delay = 1.00 //Cats are good climbers.
|
||||
|
||||
/datum/species/skrell
|
||||
spawn_flags = SPECIES_CAN_JOIN
|
||||
icobase = 'icons/mob/human_races/r_skrell_vr.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_skrell_vr.dmi'
|
||||
color_mult = 1
|
||||
min_age = 18
|
||||
inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair, /mob/living/carbon/human/proc/water_stealth, /mob/living/carbon/human/proc/underwater_devour)
|
||||
reagent_tag = null
|
||||
allergens = null
|
||||
assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX, LANGUAGE_PROMETHEAN)
|
||||
genders = list(MALE, FEMALE, PLURAL, NEUTER)
|
||||
wikilink="https://wiki.vore-station.net/Skrell"
|
||||
|
||||
water_breather = TRUE
|
||||
water_movement = -4 //Negates shallow. Halves deep.
|
||||
|
||||
/datum/species/zaddat
|
||||
spawn_flags = SPECIES_CAN_JOIN
|
||||
min_age = 18
|
||||
inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) //I don't even know if Zaddat can HAVE hair, but here we are, I suppose
|
||||
gluttonous = 0
|
||||
genders = list(MALE, FEMALE, PLURAL, NEUTER)
|
||||
descriptors = list()
|
||||
// no wiki link exists for Zaddat yet
|
||||
|
||||
/datum/species/zaddat/equip_survival_gear(var/mob/living/carbon/human/H)
|
||||
.=..()
|
||||
var/obj/item/storage/toolbox/lunchbox/survival/zaddat/L = new(get_turf(H))
|
||||
if(H.backbag == 1)
|
||||
H.equip_to_slot_or_del(L, slot_r_hand)
|
||||
else
|
||||
H.equip_to_slot_or_del(L, slot_in_backpack)
|
||||
|
||||
/datum/species/diona
|
||||
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
|
||||
min_age = 18
|
||||
genders = list(MALE, FEMALE, PLURAL, NEUTER)
|
||||
wikilink="https://wiki.vore-station.net/Diona"
|
||||
|
||||
/datum/species/human
|
||||
blurb = "Humanity originated in the Sol system, and over the last three centuries has spread \
|
||||
colonies across a wide swathe of space. They hold a wide range of forms and creeds.<br/><br/> \
|
||||
While the central Sol government maintains control of its far-flung people, powerful corporate \
|
||||
interests, rampant cyber and bio-augmentation and secretive factions make life on most human \
|
||||
worlds tumultous at best."
|
||||
color_mult = 1
|
||||
icobase = 'icons/mob/human_races/r_human_vr.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_human_vr.dmi'
|
||||
appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR
|
||||
min_age = 18
|
||||
genders = list(MALE, FEMALE, PLURAL, NEUTER)
|
||||
base_color = "#EECEB3"
|
||||
wikilink="https://wiki.vore-station.net/Human"
|
||||
|
||||
/datum/species/human/vatgrown
|
||||
spawn_flags = SPECIES_IS_RESTRICTED
|
||||
|
||||
/datum/species/vox
|
||||
gluttonous = 0
|
||||
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
|
||||
min_age = 18
|
||||
inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair) //Get ya quills done did
|
||||
icobase = 'icons/mob/human_races/r_vox_old.dmi'
|
||||
tail = "voxtail"
|
||||
tail_animation = 'icons/mob/species/vox/tail.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_vox_old.dmi'
|
||||
color_mult = 1
|
||||
|
||||
descriptors = list(
|
||||
/datum/mob_descriptor/vox_markings = 0
|
||||
)
|
||||
wikilink="https://wiki.vore-station.net/Vox"
|
||||
|
||||
/datum/species/harpy
|
||||
name = SPECIES_RAPALA
|
||||
name_plural = "Rapalans"
|
||||
icobase = 'icons/mob/human_races/r_harpy_vr.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_harpy_vr.dmi'
|
||||
tail = "tail"
|
||||
icobase_tail = 1
|
||||
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch, /datum/unarmed_attack/bite)
|
||||
num_alternate_languages = 3
|
||||
secondary_langs = list(LANGUAGE_BIRDSONG, LANGUAGE_UNATHI)
|
||||
species_language = LANGUAGE_UNATHI
|
||||
name_language = null
|
||||
color_mult = 1
|
||||
genders = list(MALE, FEMALE, PLURAL, NEUTER)
|
||||
inherent_verbs = list(/mob/living/proc/flying_toggle,/mob/living/proc/flying_vore_toggle,/mob/living/proc/start_wings_hovering,/mob/living/carbon/human/proc/tie_hair)
|
||||
digi_allowed = TRUE
|
||||
|
||||
min_age = 18
|
||||
max_age = 80
|
||||
|
||||
soft_landing = TRUE
|
||||
|
||||
base_color = "#EECEB3"
|
||||
|
||||
blurb = "An Avian species, coming from a distant planet, the Rapalas are the very proud race.\
|
||||
Sol researchers have commented on them having a very close resemblance to the mythical race called 'Harpies',\
|
||||
who are known for having massive winged arms and talons as feet. They've been clocked at speeds of over 35 miler per hour chasing the planet's many fish-like fauna.\
|
||||
The Rapalan's home-world 'Verita' is a strangely habitable gas giant, while no physical earth exists, there are fertile floating islands orbiting around the planet from past asteroid activity."
|
||||
|
||||
wikilink="https://wiki.vore-station.net/Backstory#Rapala"
|
||||
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/rapala)
|
||||
|
||||
spawn_flags = SPECIES_CAN_JOIN
|
||||
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
|
||||
|
||||
|
||||
heat_discomfort_strings = list(
|
||||
"Your feathers prickle in the heat.",
|
||||
"You feel uncomfortably warm.",
|
||||
"Your overheated skin itches."
|
||||
)
|
||||
|
||||
/datum/species/crew_shadekin
|
||||
name = SPECIES_SHADEKIN_CREW
|
||||
name_plural = "Black-Eyed Shadekin"
|
||||
icobase = 'icons/mob/human_races/r_shadekin_vr.dmi'
|
||||
deform = 'icons/mob/human_races/r_shadekin_vr.dmi'
|
||||
tail = "tail"
|
||||
icobase_tail = 1
|
||||
blurb = "Very little is known about these creatures. They appear to be largely mammalian in appearance. \
|
||||
Seemingly very rare to encounter, there have been widespread myths of these creatures the galaxy over, \
|
||||
but next to no verifiable evidence to their existence. However, they have recently been more verifiably \
|
||||
documented in the Virgo system, following a mining bombardment of Virgo 3. The crew of NSB Adephagia have \
|
||||
taken to calling these creatures 'Shadekin', and the name has generally stuck and spread. " //TODO: Something more fitting for black-eyes
|
||||
wikilink = "https://wiki.vore-station.net/Shadekin"
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/shadekin)
|
||||
digi_allowed = TRUE
|
||||
|
||||
language = LANGUAGE_SHADEKIN
|
||||
name_language = LANGUAGE_SHADEKIN
|
||||
species_language = LANGUAGE_SHADEKIN
|
||||
secondary_langs = list(LANGUAGE_SHADEKIN)
|
||||
num_alternate_languages = 3
|
||||
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
|
||||
rarity_value = 5 //INTERDIMENSIONAL FLUFFERS
|
||||
|
||||
inherent_verbs = list(/mob/proc/adjust_hive_range)
|
||||
|
||||
siemens_coefficient = 0
|
||||
darksight = 10
|
||||
|
||||
slowdown = 0.5
|
||||
item_slowdown_mod = 1.5
|
||||
|
||||
total_health = 75
|
||||
brute_mod = 1.25 // Frail
|
||||
burn_mod = 1.25 // Furry
|
||||
blood_volume = 500
|
||||
hunger_factor = 0.2
|
||||
|
||||
warning_low_pressure = 50
|
||||
hazard_low_pressure = -1
|
||||
|
||||
warning_high_pressure = 300
|
||||
hazard_high_pressure = INFINITY
|
||||
|
||||
cold_level_1 = -1 //Immune to cold
|
||||
cold_level_2 = -1
|
||||
cold_level_3 = -1
|
||||
|
||||
heat_level_1 = 850 //Resistant to heat
|
||||
heat_level_2 = 1000
|
||||
heat_level_3 = 1150
|
||||
|
||||
flags = NO_DNA | NO_SLEEVE
|
||||
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
|
||||
|
||||
reagent_tag = IS_SHADEKIN // for shadekin-unqiue chem interactions
|
||||
|
||||
flesh_color = "#FFC896"
|
||||
blood_color = "#A10808"
|
||||
base_color = "#f0f0f0"
|
||||
color_mult = 1
|
||||
|
||||
//has_glowing_eyes = TRUE // Applicable through traits.
|
||||
|
||||
male_cough_sounds = null
|
||||
female_cough_sounds = null
|
||||
male_sneeze_sound = null
|
||||
female_sneeze_sound = null
|
||||
|
||||
speech_bubble_appearance = "ghost"
|
||||
|
||||
genders = list(MALE, FEMALE, PLURAL, NEUTER)
|
||||
|
||||
breath_type = null
|
||||
poison_type = null
|
||||
water_breather = TRUE //They do not quite breathe...
|
||||
|
||||
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_SKIN_COLOR | HAS_UNDERWEAR
|
||||
|
||||
move_trail = /obj/effect/decal/cleanable/blood/tracks/paw
|
||||
|
||||
has_organ = list(
|
||||
O_HEART = /obj/item/organ/internal/heart,
|
||||
O_VOICE = /obj/item/organ/internal/voicebox,
|
||||
O_LIVER = /obj/item/organ/internal/liver,
|
||||
O_KIDNEYS = /obj/item/organ/internal/kidneys,
|
||||
O_BRAIN = /obj/item/organ/internal/brain,
|
||||
O_EYES = /obj/item/organ/internal/eyes,
|
||||
O_STOMACH = /obj/item/organ/internal/stomach,
|
||||
O_INTESTINE = /obj/item/organ/internal/intestine
|
||||
)
|
||||
|
||||
has_limbs = list(
|
||||
BP_TORSO = list("path" = /obj/item/organ/external/chest/crewkin),
|
||||
BP_GROIN = list("path" = /obj/item/organ/external/groin/crewkin),
|
||||
BP_HEAD = list("path" = /obj/item/organ/external/head/crewkin),
|
||||
BP_L_ARM = list("path" = /obj/item/organ/external/arm/crewkin),
|
||||
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/crewkin),
|
||||
BP_L_LEG = list("path" = /obj/item/organ/external/leg/crewkin),
|
||||
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/crewkin),
|
||||
BP_L_HAND = list("path" = /obj/item/organ/external/hand/crewkin),
|
||||
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/crewkin),
|
||||
BP_L_FOOT = list("path" = /obj/item/organ/external/foot/crewkin),
|
||||
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/crewkin)
|
||||
)
|
||||
|
||||
/datum/species/crew_shadekin/get_bodytype()
|
||||
return SPECIES_SHADEKIN
|
||||
|
||||
//These species are not really species but are just there for custom species selection
|
||||
|
||||
/datum/species/fl_zorren
|
||||
name = SPECIES_FENNEC
|
||||
name_plural = "Fennec"
|
||||
icobase = 'icons/mob/human_races/r_fennec_vr.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_fennec.dmi'
|
||||
tail = "tail"
|
||||
icobase_tail = 1
|
||||
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
|
||||
num_alternate_languages = 3
|
||||
secondary_langs = list(LANGUAGE_TERMINUS)
|
||||
name_language = LANGUAGE_TERMINUS
|
||||
species_language = LANGUAGE_TERMINUS
|
||||
inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds,/mob/living/proc/shred_limb,/mob/living/carbon/human/proc/tie_hair)
|
||||
digi_allowed = TRUE
|
||||
|
||||
min_age = 18
|
||||
max_age = 80
|
||||
|
||||
//primitive_form = "" //We don't have fennec-monkey sprites.
|
||||
spawn_flags = SPECIES_IS_RESTRICTED
|
||||
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
|
||||
genders = list(MALE, FEMALE, PLURAL, NEUTER)
|
||||
|
||||
flesh_color = "#AFA59E"
|
||||
base_color = "#333333"
|
||||
blood_color = "#240bc4"
|
||||
color_mult = 1
|
||||
|
||||
heat_discomfort_strings = list(
|
||||
"Your fur prickles in the heat.",
|
||||
"You feel uncomfortably warm.",
|
||||
"Your overheated skin itches."
|
||||
)
|
||||
|
||||
/datum/species/xenohybrid
|
||||
name = SPECIES_XENOHYBRID
|
||||
name_plural = "Xenomorphs"
|
||||
icobase = 'icons/mob/human_races/r_xenomorph.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_xenomorph.dmi'
|
||||
tail = "tail"
|
||||
icobase_tail = 1
|
||||
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
|
||||
darksight = 4 //Better hunters in the dark.
|
||||
hunger_factor = 0.1 //In exchange, they get hungry a tad faster.
|
||||
num_alternate_languages = 3
|
||||
digi_allowed = TRUE
|
||||
|
||||
min_age = 18
|
||||
max_age = 80
|
||||
|
||||
blurb = "Xenomorphs hybrids are a mixture of xenomorph DNA and some other humanoid species. \
|
||||
Xenomorph hyrids mostly have had had their natural aggression removed due to the gene modification process \
|
||||
although there are some exceptions, such as when they are harmed. Most xenomorph hybrids are female, due to their natural xenomorph genes, \
|
||||
but there are multiple exceptions. All xenomorph hybrids have had their ability to lay eggs containing facehuggers \
|
||||
removed if they had the ability to, although hybrids that previously contained this ability is extremely rare."
|
||||
// No wiki page for xenohybrids at present
|
||||
|
||||
//primitive_form = "" //None for these guys
|
||||
|
||||
spawn_flags = SPECIES_IS_RESTRICTED
|
||||
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
|
||||
genders = list(MALE, FEMALE, PLURAL, NEUTER)
|
||||
|
||||
blood_color = "#12ff12"
|
||||
flesh_color = "#201730"
|
||||
base_color = "#201730"
|
||||
|
||||
heat_discomfort_strings = list(
|
||||
"Your chitin feels extremely warm.",
|
||||
"You feel uncomfortably warm.",
|
||||
"Your chitin feels hot."
|
||||
)
|
||||
|
||||
/datum/species/altevian
|
||||
name = SPECIES_ALTEVIAN
|
||||
name_plural = "Altevians"
|
||||
icobase = 'icons/mob/human_races/r_altevian.dmi'
|
||||
deform = 'icons/mob/human_races/r_def_altevian.dmi'
|
||||
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)
|
||||
num_alternate_languages = 3
|
||||
secondary_langs = list(LANGUAGE_TAVAN)
|
||||
species_language = LANGUAGE_TAVAN
|
||||
name_language = null
|
||||
color_mult = 1
|
||||
inherent_verbs = list(/mob/living/carbon/human/proc/tie_hair)
|
||||
digi_allowed = TRUE
|
||||
|
||||
min_age = 18
|
||||
max_age = 80
|
||||
|
||||
blurb = "The Altevian are a species of tall, rodent humanoids that are akin to rats for their features. \
|
||||
The Altevian, unlike most species, do not have a home planet, nor system, adopting a fully nomadic lifestyle \
|
||||
for their survival across the stars. Instead, they have opted to live in massive super capital-class colony-ships \
|
||||
with a flagship as their place they would call home."
|
||||
|
||||
wikilink="https://wiki.vore-station.net/Altevian"
|
||||
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/altevian)
|
||||
|
||||
spawn_flags = SPECIES_CAN_JOIN
|
||||
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
|
||||
|
||||
flesh_color = "#AFA59E"
|
||||
base_color = "#777777"
|
||||
|
||||
genders = list(MALE, FEMALE, PLURAL, NEUTER)
|
||||
|
||||
burn_mod = 1.15
|
||||
hunger_factor = 0.04
|
||||
can_zero_g_move = TRUE
|
||||
|
||||
heat_discomfort_strings = list(
|
||||
"Your fur prickles in the heat.",
|
||||
"You feel uncomfortably warm.",
|
||||
"Your overheated skin itches."
|
||||
)
|
||||
|
||||
has_limbs = list(
|
||||
BP_TORSO = list("path" = /obj/item/organ/external/chest),
|
||||
BP_GROIN = list("path" = /obj/item/organ/external/groin),
|
||||
BP_HEAD = list("path" = /obj/item/organ/external/head),
|
||||
BP_L_ARM = list("path" = /obj/item/organ/external/arm),
|
||||
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
|
||||
BP_L_LEG = list("path" = /obj/item/organ/external/leg),
|
||||
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
|
||||
BP_L_HAND = list("path" = /obj/item/organ/external/hand),
|
||||
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
|
||||
BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
|
||||
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
|
||||
)
|
||||
@@ -1,220 +0,0 @@
|
||||
/datum/species/teshari
|
||||
name = SPECIES_TESHARI
|
||||
name_plural = "Tesharii"
|
||||
blurb = "A race of feathered raptors who developed alongside the Skrell, inhabiting \
|
||||
the polar tundral regions outside of Skrell territory. Extremely fragile, they developed \
|
||||
hunting skills that emphasized taking out their prey without themselves getting hit. They \
|
||||
are only recently becoming known on human stations after reaching space with Skrell assistance."
|
||||
catalogue_data = list(/datum/category_item/catalogue/fauna/teshari)
|
||||
|
||||
num_alternate_languages = 3
|
||||
secondary_langs = list(LANGUAGE_SCHECHI, LANGUAGE_SKRELLIAN)
|
||||
name_language = LANGUAGE_SCHECHI
|
||||
species_language = LANGUAGE_SCHECHI
|
||||
|
||||
min_age = 12
|
||||
max_age = 45
|
||||
|
||||
economic_modifier = 6
|
||||
|
||||
health_hud_intensity = 3
|
||||
|
||||
male_cough_sounds = list('sound/effects/mob_effects/tesharicougha.ogg','sound/effects/mob_effects/tesharicoughb.ogg')
|
||||
female_cough_sounds = list('sound/effects/mob_effects/tesharicougha.ogg','sound/effects/mob_effects/tesharicoughb.ogg')
|
||||
male_sneeze_sound = 'sound/effects/mob_effects/tesharisneeze.ogg'
|
||||
female_sneeze_sound = 'sound/effects/mob_effects/tesharisneeze.ogg'
|
||||
center_offset = 0
|
||||
|
||||
blood_color = "#D514F7"
|
||||
flesh_color = "#5F7BB0"
|
||||
base_color = "#001144"
|
||||
tail = "seromitail"
|
||||
//tail_hair = "feathers" //VORESTATION TESHARI TEMPORARY REMOVAL
|
||||
reagent_tag = IS_TESHARI
|
||||
|
||||
move_trail = /obj/effect/decal/cleanable/blood/tracks/paw
|
||||
|
||||
icobase = 'icons/mob/human_races/r_teshari.dmi'
|
||||
deform = 'icons/mob/human_races/r_teshari.dmi'
|
||||
damage_overlays = 'icons/mob/human_races/masks/dam_teshari.dmi'
|
||||
damage_mask = 'icons/mob/human_races/masks/dam_mask_teshari.dmi'
|
||||
blood_mask = 'icons/mob/human_races/masks/blood_teshari.dmi'
|
||||
suit_storage_icon = 'icons/inventory/suit_store/mob_teshari.dmi'
|
||||
|
||||
fire_icon_state = "generic" // Humanoid is too big for them and spriting a new one is really annoying.
|
||||
|
||||
slowdown = -1
|
||||
snow_movement = -2 // Ignores light snow
|
||||
item_slowdown_mod = 2 // Tiny birds don't like heavy things
|
||||
total_health = 50
|
||||
brute_mod = 1.35
|
||||
burn_mod = 1.35
|
||||
mob_size = MOB_SMALL
|
||||
pass_flags = PASSTABLE
|
||||
holder_type = /obj/item/holder/human
|
||||
// short_sighted = 1
|
||||
has_vibration_sense = TRUE
|
||||
gluttonous = 1
|
||||
blood_volume = 400
|
||||
hunger_factor = 0.2
|
||||
soft_landing = TRUE
|
||||
|
||||
ambiguous_genders = TRUE
|
||||
|
||||
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED
|
||||
appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_EYE_COLOR
|
||||
bump_flag = MONKEY
|
||||
swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL
|
||||
push_flags = MONKEY|SLIME|SIMPLE_ANIMAL|ALIEN
|
||||
|
||||
body_temperature = 270
|
||||
|
||||
cold_level_1 = 180 //Default 260
|
||||
cold_level_2 = 130 //Default 200
|
||||
cold_level_3 = 70 //Default 120
|
||||
|
||||
breath_cold_level_1 = 180 //Default 240 - Lower is better
|
||||
breath_cold_level_2 = 100 //Default 180
|
||||
breath_cold_level_3 = 60 //Default 100
|
||||
|
||||
heat_level_1 = 330 //Default 360
|
||||
heat_level_2 = 370 //Default 400
|
||||
heat_level_3 = 600 //Default 1000
|
||||
|
||||
breath_heat_level_1 = 350 //Default 380 - Higher is better
|
||||
breath_heat_level_2 = 400 //Default 450
|
||||
breath_heat_level_3 = 800 //Default 1250
|
||||
|
||||
heat_discomfort_level = 295
|
||||
heat_discomfort_strings = list(
|
||||
"Your feathers prickle in the heat.",
|
||||
"You feel uncomfortably warm.",
|
||||
"Your hands and feet feel hot as your body tries to regulate heat",
|
||||
)
|
||||
cold_discomfort_level = 180
|
||||
cold_discomfort_strings = list(
|
||||
"You feel a bit chilly.",
|
||||
"You fluff up your feathers against the cold.",
|
||||
"You move your arms closer to your body to shield yourself from the cold.",
|
||||
"You press your ears against your head to conserve heat",
|
||||
"You start to feel the cold on your skin",
|
||||
)
|
||||
|
||||
minimum_breath_pressure = 12 //Smaller, so needs less air
|
||||
|
||||
has_limbs = list(
|
||||
BP_TORSO = list("path" = /obj/item/organ/external/chest),
|
||||
BP_GROIN = list("path" = /obj/item/organ/external/groin),
|
||||
BP_HEAD = list("path" = /obj/item/organ/external/head/teshari),
|
||||
BP_L_ARM = list("path" = /obj/item/organ/external/arm),
|
||||
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
|
||||
BP_L_LEG = list("path" = /obj/item/organ/external/leg),
|
||||
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
|
||||
BP_L_HAND = list("path" = /obj/item/organ/external/hand/teshari),
|
||||
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/teshari),
|
||||
BP_L_FOOT = list("path" = /obj/item/organ/external/foot/teshari),
|
||||
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/teshari)
|
||||
)
|
||||
|
||||
has_organ = list(
|
||||
O_HEART = /obj/item/organ/internal/heart,
|
||||
O_LUNGS = /obj/item/organ/internal/lungs,
|
||||
O_VOICE = /obj/item/organ/internal/voicebox,
|
||||
O_LIVER = /obj/item/organ/internal/liver,
|
||||
O_KIDNEYS = /obj/item/organ/internal/kidneys,
|
||||
O_BRAIN = /obj/item/organ/internal/brain,
|
||||
O_EYES = /obj/item/organ/internal/eyes,
|
||||
O_STOMACH = /obj/item/organ/internal/stomach,
|
||||
O_INTESTINE = /obj/item/organ/internal/intestine
|
||||
)
|
||||
|
||||
unarmed_types = list(
|
||||
/datum/unarmed_attack/claws,
|
||||
/datum/unarmed_attack/bite/sharp,
|
||||
/datum/unarmed_attack/stomp/weak
|
||||
)
|
||||
|
||||
inherent_verbs = list(
|
||||
///mob/living/carbon/human/proc/sonar_ping,
|
||||
/mob/living/proc/hide
|
||||
)
|
||||
|
||||
descriptors = list(
|
||||
/datum/mob_descriptor/height = -3,
|
||||
/datum/mob_descriptor/build = -3
|
||||
)
|
||||
|
||||
/* var/static/list/flight_bodyparts = list(
|
||||
BP_L_ARM,
|
||||
BP_R_ARM,
|
||||
BP_L_HAND,
|
||||
BP_R_HAND
|
||||
)
|
||||
var/static/list/flight_suit_blacklisted_types = list(
|
||||
/obj/item/clothing/suit/space,
|
||||
/obj/item/clothing/suit/straight_jacket
|
||||
)*/
|
||||
|
||||
default_emotes = list(
|
||||
/decl/emote/audible/teshsqueak,
|
||||
/decl/emote/audible/teshchirp,
|
||||
/decl/emote/audible/teshtrill
|
||||
)
|
||||
|
||||
footstep = FOOTSTEP_MOB_TESHARI
|
||||
|
||||
/datum/species/teshari/equip_survival_gear(var/mob/living/carbon/human/H)
|
||||
..()
|
||||
if(!(H.client?.prefs?.shoe_hater))
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes)
|
||||
/*
|
||||
/datum/species/teshari/handle_falling(mob/living/carbon/human/H, atom/hit_atom, damage_min, damage_max, silent, planetary)
|
||||
|
||||
// Tesh can glide to save themselves from some falls. Basejumping bird
|
||||
// without parachute, or falling bird without free wings, goes splat.
|
||||
|
||||
// Are we landing from orbit, or handcuffed/unconscious/tied to something?
|
||||
if(planetary || !istype(H) || H.incapacitated(INCAPACITATION_DEFAULT|INCAPACITATION_DISABLED))
|
||||
return ..()
|
||||
|
||||
// Are we landing on a turf? Not sure how this could not be the case, but let's be safe.
|
||||
var/turf/landing = get_turf(hit_atom)
|
||||
if(!istype(landing))
|
||||
return ..()
|
||||
|
||||
if(H.buckled)
|
||||
if(!silent)
|
||||
to_chat(H, span_warning("You try to spread your wings to slow your fall, but \the [H.buckled] weighs you down!"))
|
||||
return ..()
|
||||
|
||||
// Is there enough air to flap against?
|
||||
var/datum/gas_mixture/environment = landing.return_air()
|
||||
if(!environment || environment.return_pressure() < (ONE_ATMOSPHERE * 0.75))
|
||||
if(!silent)
|
||||
to_chat(H, span_warning("You spread your wings to slow your fall, but the air is too thin!"))
|
||||
return ..()
|
||||
|
||||
// Are we wearing a space suit?
|
||||
if(H.wear_suit)
|
||||
for(var/blacklisted_type in flight_suit_blacklisted_types)
|
||||
if(istype(H.wear_suit, blacklisted_type))
|
||||
if(!silent)
|
||||
to_chat(H, span_warning("You try to spread your wings to slow your fall, but \the [H.wear_suit] is in the way!"))
|
||||
return ..()
|
||||
|
||||
// Do we have working wings?
|
||||
for(var/bp in flight_bodyparts)
|
||||
var/obj/item/organ/external/E = H.organs_by_name[bp]
|
||||
if(!istype(E) || !E.is_usable() || E.is_broken() || E.is_stump())
|
||||
if(!silent)
|
||||
to_chat(H, span_warning("You try to spread your wings to slow your fall, but they won't hold your weight!"))
|
||||
return ..()
|
||||
|
||||
// Handled!
|
||||
if(!silent)
|
||||
to_chat(H, span_notice("You catch the air in your wings and greatly slow your fall."))
|
||||
landing.visible_message(span_infoplain(span_bold("\The [H]") + " glides down from above, landing safely."))
|
||||
H.Stun(1)
|
||||
playsound(H, "rustle", 25, 1)
|
||||
return TRUE
|
||||
*/
|
||||
@@ -1,26 +0,0 @@
|
||||
/datum/species/teshari
|
||||
mob_size = MOB_MEDIUM //To allow normal mob swapping
|
||||
spawn_flags = SPECIES_CAN_JOIN
|
||||
icobase = 'icons/mob/human_races/r_teshari_vr.dmi'
|
||||
deform = 'icons/mob/human_races/r_teshari_vr.dmi'
|
||||
icobase_tail = 1
|
||||
color_mult = 1
|
||||
min_age = 18
|
||||
push_flags = ~HEAVY //Allows them to use micro step code.
|
||||
swap_flags = ~HEAVY
|
||||
gluttonous = 0
|
||||
genders = list(MALE, FEMALE, PLURAL, NEUTER)
|
||||
descriptors = list()
|
||||
wikilink="https://wiki.vore-station.net/Teshari"
|
||||
agility = 90
|
||||
|
||||
male_sneeze_sound = list('sound/effects/mob_effects/tesharisneeze.ogg','sound/effects/mob_effects/tesharisneezeb.ogg')
|
||||
female_sneeze_sound = list('sound/effects/mob_effects/tesharisneeze.ogg','sound/effects/mob_effects/tesharisneezeb.ogg')
|
||||
|
||||
vore_belly_default_variant = "T" //Teshari belly sprite
|
||||
|
||||
inherent_verbs = list(
|
||||
///mob/living/carbon/human/proc/sonar_ping,
|
||||
/mob/living/proc/hide,
|
||||
/mob/living/proc/toggle_pass_table
|
||||
)
|
||||
@@ -1,8 +0,0 @@
|
||||
/obj/screen/xenochimera
|
||||
icon = 'icons/mob/chimerahud.dmi'
|
||||
invisibility = 101
|
||||
|
||||
/obj/screen/xenochimera/danger_level
|
||||
name = "danger level"
|
||||
icon_state = "danger00" //first number is bool of whether or not we're in danger, second is whether or not we're feral
|
||||
alpha = 200
|
||||
@@ -1,138 +0,0 @@
|
||||
/*
|
||||
** For now, these are just neutral traits for Xenochimera only to take.
|
||||
** Traits defined as custom_only = FALSE in neutral.dm will be available for Xenochimera to take as well.
|
||||
** As such, be careful not to duplicate the traits, and only add dupes where necessary.
|
||||
** IE: Heat/Cold Adapt and autohisses are added to Xenochimera because they reasonably could have evolved it, along with custom species.
|
||||
** However, if custom_only = FALSE is set, then any species including things like humans can take it. A little silly.
|
||||
** Therefore, use this file only for Xenochimera traits that you want to keep custom + Xenochim only.
|
||||
*/
|
||||
/datum/trait/positive/weaver/xenochimera
|
||||
sort = TRAIT_SORT_SPECIES
|
||||
allowed_species = list(SPECIES_XENOCHIMERA)
|
||||
name = "Xenochimera: Weaver"
|
||||
desc = "You've evolved your body to produce silk that you can fashion into articles of clothing and other objects."
|
||||
cost = 0
|
||||
category = 0
|
||||
custom_only = FALSE
|
||||
|
||||
/datum/trait/positive/hardfeet/xenochimera
|
||||
sort = TRAIT_SORT_SPECIES
|
||||
allowed_species = list(SPECIES_XENOCHIMERA)
|
||||
name = "Xenochimera: Hard Feet"
|
||||
desc = "Your body has adapted to make your feet immune to glass shards, whether by developing hooves, chitin, or just horrible callous."
|
||||
cost = 0
|
||||
category = 0
|
||||
custom_only = FALSE
|
||||
|
||||
// Why put this on Xenochimera of all species? I have no idea, but someone may be enough of a lunatic to take it.
|
||||
/datum/trait/negative/neural_hypersensitivity/xenochimera
|
||||
sort = TRAIT_SORT_SPECIES
|
||||
allowed_species = list(SPECIES_XENOCHIMERA)
|
||||
name = "Xenochimera: Neural Hypersensitivity"
|
||||
desc = "Despite your evolutionary efforts, you are unusually sensitive to pain. \
|
||||
Given your species' typical reactions to pain, this can only end well for you!"
|
||||
cost = 0
|
||||
category = 0
|
||||
custom_only = FALSE
|
||||
|
||||
/datum/trait/positive/melee_attack_fangs/xenochimera
|
||||
sort = TRAIT_SORT_SPECIES
|
||||
allowed_species = list(SPECIES_XENOCHIMERA)
|
||||
name = "Xenochimera: Sharp Melee & Numbing Fangs"
|
||||
desc = "Your hunting instincts manifest in earnest! You have grown numbing fangs alongside your naturally grown hunting weapons."
|
||||
cost = 0
|
||||
category = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list("unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/chimera, /datum/unarmed_attack/bite/sharp, /datum/unarmed_attack/bite/sharp/numbing)) // Fixes the parent forgetting to add 'chimera-specific claws
|
||||
|
||||
/datum/trait/positive/snowwalker/xenochimera
|
||||
sort = TRAIT_SORT_SPECIES
|
||||
allowed_species = list(SPECIES_XENOCHIMERA)
|
||||
name = "Xenochimera: Snow Walker"
|
||||
desc = "You've adapted to traversing snowy terrain. Snow does not slow you down!"
|
||||
cost = 0
|
||||
category = 0
|
||||
custom_only = FALSE
|
||||
|
||||
/datum/trait/positive/aquatic/xenochimera
|
||||
sort = TRAIT_SORT_SPECIES
|
||||
allowed_species = list(SPECIES_XENOCHIMERA)
|
||||
name = "Xenochimera: Aquatic"
|
||||
desc = "You can breathe under water and can traverse water more efficiently. Additionally, you can eat others in the water."
|
||||
cost = 0
|
||||
category = 0
|
||||
excludes = list(/datum/trait/positive/winged_flight/xenochimera)
|
||||
custom_only = FALSE
|
||||
|
||||
/datum/trait/positive/winged_flight/xenochimera
|
||||
sort = TRAIT_SORT_SPECIES
|
||||
allowed_species = list(SPECIES_XENOCHIMERA)
|
||||
name = "Xenochhimera: Winged Flight"
|
||||
desc = "Allows you to fly by using your wings. Don't forget to bring them!"
|
||||
cost = 0
|
||||
excludes = list(/datum/trait/positive/aquatic/xenochimera)
|
||||
custom_only = FALSE
|
||||
|
||||
/* // Commented out in lieu of finding a better solution.
|
||||
/datum/trait/neutral/coldadapt/xenochimera
|
||||
sort = TRAIT_SORT_SPECIES
|
||||
allowed_species = list(SPECIES_XENOCHIMERA)
|
||||
name = "Xenochimera: Temp. Adapted, Cold"
|
||||
desc = "You have adapted to withstand much colder temperatures than other species, and can even be comfortable in extremely cold environments. You are also more vulnerable to hot environments, and have a lower body temperature as a consequence of these adaptations, thanks to your evolutionary efforts."
|
||||
cost = 0
|
||||
category = 0
|
||||
can_take = ORGANICS // (Not sure if this is needed for Xenochimera-specific sub-version.)
|
||||
custom_only = FALSE
|
||||
excludes = list(/datum/trait/neutral/hotadapt, /datum/trait/neutral/hotadapt/xenochimera)
|
||||
|
||||
/datum/trait/neutral/hotadapt/xenochimera
|
||||
sort = TRAIT_SORT_SPECIES
|
||||
allowed_species = list(SPECIES_XENOCHIMERA)
|
||||
name = "Xenochimera: Temp. Adapted, Heat"
|
||||
desc = "You have adapted to withstand much hotter temperatures than other species, and can even be comfortable in extremely hot environments. You are also more vulnerable to cold environments, and have a higher body temperature as a consequence of these adaptations, thanks to your evolutionary efforts."
|
||||
cost = 0
|
||||
category = 0
|
||||
can_take = ORGANICS // negates the need for suit coolers entirely for synths, so no. (Not sure if this is needed for Xenochimera-specific sub-version.)
|
||||
custom_only = FALSE
|
||||
excludes = list(/datum/trait/neutral/coldadapt, /datum/trait/neutral/coldadapt/xenochimera)
|
||||
*/
|
||||
|
||||
/datum/trait/neutral/autohiss_unathi/xenochimera
|
||||
sort = TRAIT_SORT_SPECIES
|
||||
allowed_species = list(SPECIES_XENOCHIMERA)
|
||||
name = "Xenochimera: Autohiss (Unathi)"
|
||||
desc = "You roll your S's and x's"
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list(
|
||||
autohiss_basic_map = list(
|
||||
"s" = list("ss", "sss", "ssss")
|
||||
),
|
||||
autohiss_extra_map = list(
|
||||
"x" = list("ks", "kss", "ksss")
|
||||
),
|
||||
autohiss_exempt = list("Sinta'unathi"))
|
||||
excludes = list(/datum/trait/neutral/autohiss_tajaran)
|
||||
|
||||
/datum/trait/neutral/autohiss_tajaran/xenochimera
|
||||
sort = TRAIT_SORT_SPECIES
|
||||
allowed_species = list(SPECIES_XENOCHIMERA)
|
||||
name = "Xenochimera: Autohiss (Tajaran)"
|
||||
desc = "You roll your R's."
|
||||
cost = 0
|
||||
custom_only = FALSE
|
||||
var_changes = list(
|
||||
autohiss_basic_map = list(
|
||||
"r" = list("rr", "rrr", "rrrr")
|
||||
),
|
||||
autohiss_exempt = list("Siik"))
|
||||
excludes = list(/datum/trait/neutral/autohiss_unathi)
|
||||
|
||||
/datum/trait/positive/cocoon_tf/xenochimera
|
||||
sort = TRAIT_SORT_SPECIES
|
||||
allowed_species = list(SPECIES_XENOCHIMERA)
|
||||
custom_only = FALSE
|
||||
name = "Xenochimera: Cocoon Spinner"
|
||||
desc = "Allows you to build a cocoon around yourself, using it to transform your body if you desire."
|
||||
cost = 0
|
||||
category = 0
|
||||
@@ -4,3 +4,9 @@
|
||||
icon_state = "ai"
|
||||
anchored = TRUE // -- TLE
|
||||
canmove = 0
|
||||
|
||||
/mob/living/silicon/decoy/New()
|
||||
src.icon = 'icons/mob/AI.dmi'
|
||||
src.icon_state = "ai"
|
||||
src.anchored = TRUE
|
||||
src.canmove = 0
|
||||
|
||||
Reference in New Issue
Block a user