[MIRROR] SPECIES NUKING 2023: Nukes species_traits, good night sweet prince [MDB IGNORE] (#22458)

* SPECIES NUKING 2023: Nukes species_traits, good night sweet prince (#76297)

IT'S OVER.

Species traits are a relic of a time before the trait system was added
to generalize this kind of behavior.
They are clunky and overall less useful than inherent_traits -
Converting these makes it easier to make these behaviors modular and
usable not only by species.

🆑
refactor: A significant species refactor happened, report any issues on
the github.
/🆑

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>

* Makes it all work

* Fix widespread vampirism (#76414)

## About The Pull Request

Removing code you think is not necessary but is actually is always a
recipe for disaster (#76297)


![image](https://github.com/tgstation/tgstation/assets/51863163/8ea9fdcc-2f95-47d4-a00f-cc8ebeb319f9)

## Changelog

🆑 Melbert
fix: Fix everyone being vampires
/🆑

* Whoops, missed one!

---------

Co-authored-by: ChungusGamer666 <82850673+ChungusGamer666@users.noreply.github.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
This commit is contained in:
GoldenAlpharex
2023-07-14 21:38:54 -04:00
committed by GitHub
co-authored by ChungusGamer666 Ghom MrMelbert
parent 480763e0bc
commit 7a827df807
78 changed files with 293 additions and 316 deletions
-19
View File
@@ -76,25 +76,6 @@
#define DNA_MUTATION_BLOCKS 8
#define DNA_UNIQUE_ENZYMES_LEN 32
// species_traits list on /datum/species, please avoid adding more and use inherent_traits instead where possible
#define MUTCOLORS 1
#define NOTRANSSTING 2
#define NOZOMBIE 3
#define NO_UNDERWEAR 4
#define NO_DNA_COPY 5
#define DRINKSBLOOD 6
/// Use this if you want to change the race's color without the player being able to pick their own color. AKA special color shifting
#define DYNCOLORS 7
#define AGENDER 8
///If we have a limb-specific overlay sprite
#define HAS_MARKINGS 9
/// Do not draw blood overlay
#define NOBLOODOVERLAY 10
///No augments, for monkeys in specific because they will turn into fucking freakazoids https://cdn.discordapp.com/attachments/326831214667235328/791313258912153640/102707682-fa7cad80-4294-11eb-8f13-8c689468aeb0.png
#define NOAUGMENTS 11
///will be assigned a universal vampire themed last name shared by their department. this is preferenced!
#define BLOOD_CLANS 12
//organ slots
#define ORGAN_SLOT_ADAMANTINE_RESONATOR "adamantine_resonator"
#define ORGAN_SLOT_APPENDIX "appendix"
+37 -9
View File
@@ -226,17 +226,46 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// Prevents plasmamen from self-igniting if only their helmet is missing
#define TRAIT_NOSELFIGNITION_HEAD_ONLY "no_selfignition_head_only"
#define TRAIT_NOGUNS "no_guns"
///This carbon doesn't get hungry
#define TRAIT_NOHUNGER "no_hunger"
///This carbon doesn't bleed
#define TRAIT_NOBLOOD "noblood"
///This carbon doesn't show an overlay when they have no brain
/// Species with this trait are genderless
#define TRAIT_AGENDER "agender"
/// Species with this trait have a blood clan mechanic
#define TRAIT_BLOOD_CLANS "blood_clans"
/// Species with this trait have markings (this SUCKS, remove this later in favor of bodypart overlays)
#define TRAIT_HAS_MARKINGS "has_markings"
/// Species with this trait have mutant colors
#define TRAIT_MUTANT_COLORS "mutcolors"
/// Species with this trait have mutant colors that cannot be chosen by the player
#define TRAIT_FIXED_MUTANT_COLORS "fixed_mutcolors"
/// Humans with this trait won't get bloody hands, nor bloody feet
#define TRAIT_NO_BLOOD_OVERLAY "no_blood_overlay"
/// Humans with this trait cannot have underwear
#define TRAIT_NO_UNDERWEAR "no_underwear"
/// This carbon doesn't show an overlay when they have no brain
#define TRAIT_NO_DEBRAIN_OVERLAY "no_debrain_overlay"
#define TRAIT_NOMETABOLISM "no_metabolism"
// Use when you want a mob to be able to metabolize plasma temporarily (e.g. plasma fixation disease symptom)
#define TRAIT_PLASMA_LOVER_METABOLISM "plasma_lover_metabolism"
/// Humans with this trait cannot get augmentation surgery
#define TRAIT_NO_AUGMENTS "no_augments"
/// This carbon doesn't get hungry
#define TRAIT_NOHUNGER "no_hunger"
/// This carbon doesn't bleed
#define TRAIT_NOBLOOD "noblood"
/// This just means that the carbon will always have functional liverless metabolism
#define TRAIT_LIVERLESS_METABOLISM "liverless_metabolism"
/// Humans with this trait cannot be turned into zombies
#define TRAIT_NO_ZOMBIFY "no_zombify"
/// Humans with this trait cannot be affected by changeling transformation stings
#define TRAIT_NO_TRANSFORMATION_STING "no_transformation_sting"
/// Carbons with this trait can't have their DNA copied by diseases nor changelings
#define TRAIT_NO_DNA_COPY "no_dna_copy"
/// Carbons with this trait can eat blood to regenerate their own blood volume, instead of injecting it
#define TRAIT_DRINKS_BLOOD "drinks_blood"
/// Mob is immune to clone (cellular) damage
#define TRAIT_NOCLONELOSS "no_cloneloss"
/// Mob is immune to toxin damage
#define TRAIT_TOXIMMUNE "toxin_immune"
/// Mob is immune to oxygen damage, does not need to breathe
#define TRAIT_NOBREATH "no_breath"
/// Use when you want a mob to be able to metabolize plasma temporarily (e.g. plasma fixation disease symptom)
#define TRAIT_PLASMA_LOVER_METABOLISM "plasma_lover_metabolism"
#define TRAIT_EASYDISMEMBER "easy_dismember"
#define TRAIT_LIMBATTACHMENT "limb_attach"
#define TRAIT_NOLIMBDISABLE "no_limb_disable"
@@ -250,7 +279,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_VAL_CORRIN_MEMBER "val_corrin_member"
/// reduces the use time of syringes, pills, patches and medigels but only when using on someone
#define TRAIT_FASTMED "fast_med_use"
#define TRAIT_NOBREATH "no_breath"
#define TRAIT_ANTIMAGIC "anti_magic"
#define TRAIT_HOLY "holy"
/// This allows a person who has antimagic to cast spells without getting blocked
+3 -4
View File
@@ -6,10 +6,9 @@
// Defines for whether an accessory should have one or three colors to choose for
#define USE_ONE_COLOR 31
#define USE_MATRIXED_COLORS 32
// Defines for some extra species traits
#define REVIVES_BY_HEALING 33
#define ROBOTIC_LIMBS 34
#define ROBOTIC_DNA_ORGANS 35
// Defines for some extra inherent traits
#define TRAIT_REVIVES_BY_HEALING "trait_revives_by_healing"
#define TRAIT_ROBOTIC_DNA_ORGANS "trait_robotic_dna_organs"
//Also.. yes for some reason specie traits and accessory defines are together
//Defines for processing reagents, for synths, IPC's and Vox
+14 -1
View File
@@ -64,7 +64,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_NOFIRE" = TRAIT_NOFIRE,
"TRAIT_NOGUNS" = TRAIT_NOGUNS,
"TRAIT_NOHUNGER" = TRAIT_NOHUNGER,
"TRAIT_NOMETABOLISM" = TRAIT_NOMETABOLISM,
"TRAIT_LIVERLESS_METABOLISM" = TRAIT_LIVERLESS_METABOLISM,
"TRAIT_PLASMA_LOVER_METABOLISM" = TRAIT_PLASMA_LOVER_METABOLISM,
"TRAIT_NOCLONELOSS" = TRAIT_NOCLONELOSS,
"TRAIT_TOXIMMUNE" = TRAIT_TOXIMMUNE,
@@ -169,7 +169,20 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_SNOB" = TRAIT_SNOB,
"TRAIT_BALD" = TRAIT_BALD,
"TRAIT_BADTOUCH" = TRAIT_BADTOUCH,
"TRAIT_AGENDER" = TRAIT_AGENDER,
"TRAIT_BLOOD_CLANS" = TRAIT_BLOOD_CLANS,
"TRAIT_HAS_MARKINGS" = TRAIT_HAS_MARKINGS,
"TRAIT_MUTANT_COLORS" = TRAIT_MUTANT_COLORS,
"TRAIT_FIXED_MUTANT_COLORS" = TRAIT_FIXED_MUTANT_COLORS,
"TRAIT_NO_BLOOD_OVERLAY" = TRAIT_NO_BLOOD_OVERLAY,
"TRAIT_NO_UNDERWEAR" = TRAIT_NO_UNDERWEAR,
"TRAIT_NO_AUGMENTS" = TRAIT_NO_AUGMENTS,
"TRAIT_NOBLOOD" = TRAIT_NOBLOOD,
"TRAIT_LIVERLESS_METABOLISM" = TRAIT_LIVERLESS_METABOLISM,
"TRAIT_NO_ZOMBIFY" = TRAIT_NO_ZOMBIFY,
"TRAIT_NO_TRANSFORMATION_STING" = TRAIT_NO_TRANSFORMATION_STING,
"TRAIT_NO_DNA_COPY" = TRAIT_NO_DNA_COPY,
"TRAIT_DRINKS_BLOOD" = TRAIT_DRINKS_BLOOD,
"TRAIT_KISS_OF_DEATH" = TRAIT_KISS_OF_DEATH,
"TRAIT_ANXIOUS" = TRAIT_ANXIOUS,
"TRAIT_WEAK_SOUL" = TRAIT_WEAK_SOUL,
+8 -10
View File
@@ -263,16 +263,14 @@
RegisterSignal(parent, COMSIG_CARBON_EQUIP_SHOECOVER, PROC_REF(equip_shoecover))
/datum/component/bloodysoles/feet/update_icon()
if(ishuman(wielder))
var/mob/living/carbon/human/human = wielder
if(NOBLOODOVERLAY in human.dna.species.species_traits)
return
if(bloody_shoes[BLOOD_STATE_HUMAN] > 0 && !is_obscured())
human.remove_overlay(SHOES_LAYER)
human.overlays_standing[SHOES_LAYER] = bloody_feet
human.apply_overlay(SHOES_LAYER)
else
human.update_worn_shoes()
if(!ishuman(wielder) || HAS_TRAIT(wielder, TRAIT_NO_BLOOD_OVERLAY))
return
if(bloody_shoes[BLOOD_STATE_HUMAN] > 0 && !is_obscured())
wielder.remove_overlay(SHOES_LAYER)
wielder.overlays_standing[SHOES_LAYER] = bloody_feet
wielder.apply_overlay(SHOES_LAYER)
else
wielder.update_worn_shoes()
/datum/component/bloodysoles/feet/add_parent_to_footprint(obj/effect/decal/cleanable/blood/footprints/FP)
if(!ishuman(wielder))
+1 -2
View File
@@ -386,9 +386,8 @@
return
var/mob/living/carbon/carbon_target = target
var/obj/item/bodypart/head = carbon_target.get_bodypart(BODY_ZONE_HEAD)
var/has_no_blood = HAS_TRAIT(carbon_target, TRAIT_NOBLOOD)
if(head)
if(has_no_blood)
if(HAS_TRAIT(carbon_target, TRAIT_NOBLOOD))
to_chat(carbon_target, span_notice("You get a headache."))
return
head.adjustBleedStacks(5)
+2 -1
View File
@@ -23,7 +23,8 @@
cure()
return FALSE
if((NOTRANSSTING in affected_mob.dna.species.species_traits) || (NO_DNA_COPY in affected_mob.dna.species.species_traits)) //Only species that can be spread by transformation sting can be spread by the retrovirus
//Only species that can be spread by transformation sting can be spread by the retrovirus
if(HAS_TRAIT(affected_mob, TRAIT_NO_TRANSFORMATION_STING) || HAS_TRAIT(affected_mob, TRAIT_NO_DNA_COPY))
cure()
return FALSE
+6 -2
View File
@@ -155,8 +155,6 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
new_dna.body_markings = body_markings.Copy()
new_dna.update_body_size()
//SKYRAT EDIT ADDITION END
new_dna.species = new species.type
new_dna.species.species_traits = species.species_traits
//if the new DNA has a holder, transform them immediately, otherwise save it
if(new_dna.holder)
new_dna.holder.set_species(species.type, icon_update = 0)
@@ -201,6 +199,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
. = ""
var/list/L = new /list(DNA_UNI_IDENTITY_BLOCKS)
//ignores TRAIT_AGENDER so that a "real" gender can be stored in the DNA if later use is needed
switch(holder.gender)
if(MALE)
L[DNA_GENDER_BLOCK] = construct_block(G_MALE, 3)
@@ -617,6 +616,11 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
if(!has_dna())
return
//Always plural gender if agender
if(HAS_TRAIT(src, TRAIT_AGENDER))
gender = PLURAL
return
switch(deconstruct_block(get_uni_identity_block(dna.unique_identity, DNA_GENDER_BLOCK), 3))
if(G_MALE)
gender = MALE
+1 -1
View File
@@ -865,7 +865,7 @@
quirk_holder.mind.remove_addiction_points(addiction_type, MAX_ADDICTION_POINTS)
/datum/quirk/item_quirk/junkie/process(seconds_per_tick)
if(HAS_TRAIT(quirk_holder, TRAIT_NOMETABOLISM))
if(HAS_TRAIT(quirk_holder, TRAIT_LIVERLESS_METABOLISM))
return
var/mob/living/carbon/human/human_holder = quirk_holder
if(world.time > next_process)
@@ -289,11 +289,11 @@
var/missing_organs = list()
if(!humantarget.get_organ_slot(ORGAN_SLOT_BRAIN))
missing_organs += "brain"
if(!HAS_TRAIT(humantarget, TRAIT_NOBLOOD) && !humantarget.get_organ_slot(ORGAN_SLOT_HEART))
if(!(TRAIT_NOBLOOD in the_dudes_species.inherent_traits) && !humantarget.get_organ_slot(ORGAN_SLOT_HEART))
missing_organs += "heart"
if(!(TRAIT_NOBREATH in the_dudes_species.inherent_traits) && !humantarget.get_organ_slot(ORGAN_SLOT_LUNGS))
missing_organs += "lungs"
if(!(TRAIT_NOMETABOLISM in the_dudes_species.inherent_traits) && !humantarget.get_organ_slot(ORGAN_SLOT_LIVER))
if(!(TRAIT_LIVERLESS_METABOLISM in the_dudes_species.inherent_traits) && !humantarget.get_organ_slot(ORGAN_SLOT_LIVER))
missing_organs += "liver"
if(the_dudes_species.mutantstomach && !humantarget.get_organ_slot(ORGAN_SLOT_STOMACH))
missing_organs += "stomach"
+2 -3
View File
@@ -32,9 +32,8 @@
if(!ishuman(user))
return
var/mob/living/carbon/human/dressing_human = user
if(dressing_human.dna && dressing_human.dna.species && (NO_UNDERWEAR in dressing_human.dna.species.species_traits))
to_chat(user, span_warning("You are not capable of wearing underwear."))
if(HAS_TRAIT(dressing_human, TRAIT_NO_UNDERWEAR))
to_chat(dressing_human, span_warning("You are not capable of wearing underwear."))
return
var/choice = tgui_input_list(user, "Underwear, Undershirt, or Socks?", "Changing", list("Underwear", "Underwear Color", "Undershirt", "Socks", "Undershirt Color", "Socks Color")) //SKYRAT EDIT ADDITION - Colorable Undershirt/Socks
+1 -1
View File
@@ -216,7 +216,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror/broken, 28)
amazed_human.skin_tone = new_s_tone
amazed_human.dna.update_ui_block(DNA_SKIN_TONE_BLOCK)
if(MUTCOLORS in amazed_human.dna.species.species_traits)
if(HAS_TRAIT(amazed_human, TRAIT_MUTANT_COLORS) && !HAS_TRAIT(amazed_human, TRAIT_FIXED_MUTANT_COLORS))
var/new_mutantcolor = input(user, "Choose your skin color:", "Race change", amazed_human.dna.features["mcolor"]) as color|null
if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH))
return TRUE
@@ -27,7 +27,7 @@
return
var/obj/item/organ/internal/liver/liver = owner.get_organ_slot(ORGAN_SLOT_LIVER)
if((!liver && !HAS_TRAIT(owner, TRAIT_NOMETABOLISM)) || (liver && ((liver.damage > liver.high_threshold) || (liver.organ_flags & ORGAN_SYNTHETIC))))
if((!liver && !HAS_TRAIT(owner, TRAIT_LIVERLESS_METABOLISM)) || (liver && ((liver.damage > liver.high_threshold) || (liver.organ_flags & ORGAN_SYNTHETIC))))
replace_liver(liver)
return
@@ -504,7 +504,7 @@
if(verbose)
to_chat(user, span_warning("We already have this DNA in storage!"))
return FALSE
if(NO_DNA_COPY in target.dna.species?.species_traits)
if(HAS_TRAIT(target, TRAIT_NO_DNA_COPY))
if(verbose)
to_chat(user, span_warning("[target] is not compatible with our biology."))
return FALSE
@@ -86,16 +86,16 @@
selected_dna = changeling.select_dna()
if(!selected_dna)
return
if(NOTRANSSTING in selected_dna.dna.species.species_traits)
if(HAS_TRAIT(user, TRAIT_NO_TRANSFORMATION_STING))
user.balloon_alert(user, "incompatible DNA!")
return
..()
return ..()
/datum/action/changeling/sting/transformation/can_sting(mob/user, mob/living/carbon/target)
. = ..()
if(!.)
return
if((HAS_TRAIT(target, TRAIT_HUSK)) || !iscarbon(target) || (NOTRANSSTING in target.dna.species.species_traits))
if(!iscarbon(target) || HAS_TRAIT(target, TRAIT_HUSK) || HAS_TRAIT(target, TRAIT_NO_TRANSFORMATION_STING))
user.balloon_alert(user, "incompatible DNA!")
return FALSE
return TRUE
@@ -7,14 +7,8 @@
examine_limb_id = SPECIES_SHADOW
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE
no_equip_flags = ITEM_SLOT_MASK | ITEM_SLOT_OCLOTHING | ITEM_SLOT_GLOVES | ITEM_SLOT_FEET | ITEM_SLOT_ICLOTHING | ITEM_SLOT_SUITSTORE
species_traits = list(
NO_UNDERWEAR,
NO_DNA_COPY,
NOTRANSSTING,
)
inherent_traits = list(
TRAIT_ADVANCEDTOOLUSER,
TRAIT_CAN_STRIP,
TRAIT_NO_UNDERWEAR,
TRAIT_RESISTCOLD,
TRAIT_NOBREATH,
TRAIT_RESISTHIGHPRESSURE,
@@ -25,6 +19,8 @@
TRAIT_NODISMEMBER,
TRAIT_NOHUNGER,
TRAIT_NOBLOOD,
TRAIT_NO_DNA_COPY,
TRAIT_NO_TRANSFORMATION_STING,
)
mutantheart = /obj/item/organ/internal/heart/nightmare
@@ -101,9 +101,9 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key())
/// will show the feature as selectable.
var/relevant_mutant_bodypart = null
/// If the selected species has this in its /datum/species/species_traits,
/// If the selected species has this in its /datum/species/inherent_traits,
/// will show the feature as selectable.
var/relevant_species_trait = null
var/relevant_inherent_trait = null
/// If the selected species has this in its /datum/species/var/external_organs,
/// will show the feature as selectable.
@@ -314,7 +314,12 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key())
SHOULD_CALL_PARENT(TRUE)
SHOULD_NOT_SLEEP(TRUE)
if (!isnull(relevant_mutant_bodypart) || !isnull(relevant_species_trait) || !isnull(relevant_external_organ))
if ( \
!isnull(relevant_mutant_bodypart) \
|| !isnull(relevant_inherent_trait) \
|| !isnull(relevant_external_organ) \
|| !isnull(relevant_head_flag) \
)
var/species_type = preferences.read_preference(/datum/preference/choiced/species)
var/datum/species/species = new species_type
+1 -1
View File
@@ -141,7 +141,7 @@
var/species_type = preferences.read_preference(/datum/preference/choiced/species)
var/datum/species/species = new species_type
return !(NO_UNDERWEAR in species.species_traits)
return !(TRAIT_NO_UNDERWEAR in species.inherent_traits)
/datum/preference/choiced/underwear/compile_constant_data()
var/list/data = ..()
@@ -3,7 +3,15 @@
savefile_key = "feature_mcolor"
savefile_identifier = PREFERENCE_CHARACTER
category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
relevant_species_trait = MUTCOLORS
relevant_inherent_trait = TRAIT_MUTANT_COLORS
/datum/preference/color/mutant_color/is_accessible(datum/preferences/preferences)
if (!..(preferences))
return FALSE
var/species_type = preferences.read_preference(/datum/preference/choiced/species)
var/datum/species/species = new species_type
return !(TRAIT_FIXED_MUTANT_COLORS in species.inherent_traits)
/datum/preference/color/mutant_color/create_default_value()
return sanitize_hexcolor("[pick("7F", "FF")][pick("7F", "FF")][pick("7F", "FF")]")
@@ -5,7 +5,7 @@
priority = PREFERENCE_PRIORITY_NAME_MODIFICATIONS //this will be overwritten by names otherwise
main_feature_name = "Vampire status"
should_generate_icons = TRUE
relevant_species_trait = BLOOD_CLANS
relevant_inherent_trait = TRAIT_BLOOD_CLANS
/datum/preference/choiced/vampire_status/create_default_value()
return "Inoculated" //eh, have em try out the mechanic first
@@ -22,7 +22,7 @@
GLOBAL_LIST_EMPTY(vampire_houses)
/datum/preference/choiced/vampire_status/apply_to_human(mob/living/carbon/human/target, value)
if (!(relevant_species_trait in target.dna?.species.species_traits))
if(!HAS_TRAIT(target, TRAIT_BLOOD_CLANS))
return
if(value != "Inoculated")
@@ -3,13 +3,13 @@
savefile_identifier = PREFERENCE_CHARACTER
category = PREFERENCE_CATEGORY_SUPPLEMENTAL_FEATURES
/datum/preference/color/underwear_color/apply_to_human(mob/living/carbon/human/target, value)
target.underwear_color = value
/datum/preference/color/underwear_color/is_accessible(datum/preferences/preferences)
if (!..(preferences))
return FALSE
var/species_type = preferences.read_preference(/datum/preference/choiced/species)
var/datum/species/species = new species_type
return !(NO_UNDERWEAR in species.species_traits)
return !(TRAIT_NO_UNDERWEAR in species.inherent_traits)
/datum/preference/color/underwear_color/apply_to_human(mob/living/carbon/human/target, value)
target.underwear_color = value
+1 -1
View File
@@ -867,7 +867,7 @@
return FALSE
// And we can't heal them if they're missing their liver
if(!HAS_TRAIT(src, TRAIT_NOMETABOLISM) && !isnull(dna?.species.mutantliver) && !get_organ_slot(ORGAN_SLOT_LIVER))
if(!HAS_TRAIT(src, TRAIT_LIVERLESS_METABOLISM) && !isnull(dna?.species.mutantliver) && !get_organ_slot(ORGAN_SLOT_LIVER))
return FALSE
return ..()
@@ -148,9 +148,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
/// The icon_state of the fire overlay added when sufficently ablaze and standing. see onfire.dmi
var/fire_overlay = "human"
///Species-only traits. Can be found in [code/__DEFINES/DNA.dm]
var/list/species_traits = list()
///Generic traits tied to having the species.
/// Generic traits tied to having the species.
var/list/inherent_traits = list()
/// List of biotypes the mob belongs to. Used by diseases.
var/inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID
@@ -459,10 +457,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
*/
/datum/species/proc/on_species_gain(mob/living/carbon/human/C, datum/species/old_species, pref_load)
SHOULD_CALL_PARENT(TRUE)
if(AGENDER in species_traits)
C.gender = PLURAL
// Drop the items the new species can't wear
if(C.hud_used)
C.hud_used.update_locked_slots()
@@ -624,7 +619,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
standing += eye_overlay
// organic body markings (oh my god this is terrible please rework this to be done on the limbs themselves i beg you)
if(HAS_MARKINGS in species_traits)
if(HAS_TRAIT(species_human, TRAIT_HAS_MARKINGS))
var/obj/item/bodypart/chest/chest = species_human.get_bodypart(BODY_ZONE_CHEST)
var/obj/item/bodypart/arm/right/right_arm = species_human.get_bodypart(BODY_ZONE_R_ARM)
var/obj/item/bodypart/arm/left/left_arm = species_human.get_bodypart(BODY_ZONE_L_ARM)
@@ -660,7 +655,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
standing += markings_l_leg_overlay
//Underwear, Undershirts & Socks
if(!(NO_UNDERWEAR in species_traits))
if(!HAS_TRAIT(species_human, TRAIT_NO_UNDERWEAR))
if(species_human.underwear)
var/datum/sprite_accessory/underwear/underwear = GLOB.underwear_list[species_human.underwear]
var/mutable_appearance/underwear_overlay
@@ -1379,7 +1374,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
human.update_worn_undersuit()
/// Triggers force say events
if(weapon.force > 10 || weapon.force >= 5 && prob(33))
if(weapon.force > 10 || (weapon.force >= 5 && prob(33)))
human.force_say(user)
return TRUE
@@ -1822,7 +1817,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
if ( \
(preference.relevant_mutant_bodypart in mutant_bodyparts) \
|| (preference.relevant_species_trait in species_traits) \
|| (preference.relevant_inherent_trait in inherent_traits) \
|| (preference.relevant_external_organ in external_organs) \
|| (preference.relevant_head_flag && check_head_flags(preference.relevant_head_flag)) \
)
@@ -2,10 +2,8 @@
name = "Abductor"
id = SPECIES_ABDUCTOR
sexes = FALSE
species_traits = list(
NO_UNDERWEAR,
)
inherent_traits = list(
TRAIT_NO_UNDERWEAR,
TRAIT_NOBREATH,
TRAIT_NOHUNGER,
TRAIT_VIRUSIMMUNE,
@@ -1,12 +1,8 @@
/datum/species/android
name = "Android"
id = SPECIES_ANDROID
species_traits = list(
NO_DNA_COPY,
NOTRANSSTING,
NO_UNDERWEAR,
)
inherent_traits = list(
TRAIT_NO_UNDERWEAR,
TRAIT_CAN_USE_FLIGHT_POTION,
TRAIT_GENELESS,
TRAIT_LIMBATTACHMENT,
@@ -14,7 +10,7 @@
TRAIT_NOCLONELOSS,
TRAIT_NOFIRE,
TRAIT_NOHUNGER,
TRAIT_NOMETABOLISM,
TRAIT_LIVERLESS_METABOLISM,
TRAIT_PIERCEIMMUNE,
TRAIT_RADIMMUNE,
TRAIT_RESISTCOLD,
@@ -23,6 +19,8 @@
TRAIT_RESISTHIGHPRESSURE,
TRAIT_TOXIMMUNE,
TRAIT_NOBLOOD,
TRAIT_NO_DNA_COPY,
TRAIT_NO_TRANSFORMATION_STING,
)
inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID
@@ -1,7 +1,6 @@
/datum/species/dullahan
name = "Dullahan"
id = SPECIES_DULLAHAN
species_traits = list()
inherent_traits = list(
TRAIT_NOBREATH,
TRAIT_NOHUNGER,
@@ -10,10 +10,11 @@
exotic_bloodtype = "LE"
siemens_coeff = 0.5 //They thrive on energy
payday_modifier = 0.75
species_traits = list(
DYNCOLORS,
AGENDER,
// NO_UNDERWEAR, // SKYRAT EDIT - LET THEM WEAR PANTIES
inherent_traits = list(
// TRAIT_NO_UNDERWEAR, // SKYRAT EDIT - LET THEM WEAR PANTIES
TRAIT_MUTANT_COLORS,
TRAIT_FIXED_MUTANT_COLORS,
TRAIT_AGENDER,
)
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT
species_cookie = /obj/item/food/energybar
@@ -38,16 +39,16 @@
)
var/current_color
var/EMPeffect = FALSE
var/emageffect = FALSE
var/default_color
var/r1
var/g1
var/b1
var/static/r2 = 237
var/static/g2 = 164
var/static/b2 = 149
var/EMPeffect = FALSE
var/emageffect = FALSE
var/obj/effect/dummy/lighting_obj/ethereal_light
var/default_color
/datum/species/ethereal/Destroy(force)
QDEL_NULL(ethereal_light)
@@ -2,13 +2,8 @@
/datum/species/golem
name = "Golem"
id = SPECIES_GOLEM
species_traits = list(
NO_DNA_COPY,
NOTRANSSTING,
NO_UNDERWEAR,
NOAUGMENTS,
)
inherent_traits = list(
TRAIT_NO_UNDERWEAR,
TRAIT_GENELESS,
TRAIT_LAVA_IMMUNE,
TRAIT_NOBREATH,
@@ -17,6 +12,9 @@
TRAIT_NOFIRE,
TRAIT_PIERCEIMMUNE,
TRAIT_RADIMMUNE,
TRAIT_NO_DNA_COPY,
TRAIT_NO_TRANSFORMATION_STING,
TRAIT_NO_AUGMENTS,
)
mutantheart = null
mutantlungs = null
@@ -1,7 +1,6 @@
/datum/species/human
name = "\improper Human"
id = SPECIES_HUMAN
species_traits = list()
inherent_traits = list(
TRAIT_CAN_USE_FLIGHT_POTION,
)
@@ -10,10 +10,8 @@
name = "\improper Jellyperson"
plural_form = "Jellypeople"
id = SPECIES_JELLYPERSON
species_traits = list(
MUTCOLORS,
)
inherent_traits = list(
TRAIT_MUTANT_COLORS,
TRAIT_TOXINLOVER,
TRAIT_NOBLOOD,
)
@@ -183,9 +181,6 @@
name = "\improper Slimeperson"
plural_form = "Slimepeople"
id = SPECIES_SLIMEPERSON
species_traits = list(
MUTCOLORS,
)
hair_color = "mutcolor"
hair_alpha = 150
facial_hair_alpha = 150
@@ -3,10 +3,8 @@
name = "\improper Lizardperson"
plural_form = "Lizardfolk"
id = SPECIES_LIZARD
species_traits = list(
MUTCOLORS,
)
inherent_traits = list(
TRAIT_MUTANT_COLORS,
TRAIT_CAN_USE_FLIGHT_POTION,
TRAIT_TACKLING_TAILED_DEFENDER,
)
@@ -139,11 +137,8 @@ Lizard subspecies: ASHWALKERS
id = SPECIES_LIZARD_ASH
mutantlungs = /obj/item/organ/internal/lungs/lavaland
mutantbrain = /obj/item/organ/internal/brain/primitive
species_traits = list(
MUTCOLORS,
)
inherent_traits = list(
//TRAIT_LITERATE,
TRAIT_MUTANT_COLORS,
TRAIT_VIRUSIMMUNE,
TRAIT_FORBID_MINING_SHUTTLE_CONSOLE_OUTSIDE_STATION,
)
@@ -11,16 +11,14 @@
skinned_type = /obj/item/stack/sheet/animalhide/monkey
meat = /obj/item/food/meat/slab/monkey
knife_butcher_results = list(/obj/item/food/meat/slab/monkey = 5, /obj/item/stack/sheet/animalhide/monkey = 1)
species_traits = list(
NO_UNDERWEAR,
NOBLOODOVERLAY,
NOTRANSSTING,
NOAUGMENTS,
)
inherent_traits = list(
TRAIT_NO_UNDERWEAR,
TRAIT_NO_BLOOD_OVERLAY,
TRAIT_GUN_NATURAL,
TRAIT_VENTCRAWLER_NUDE,
TRAIT_WEAK_SOUL,
TRAIT_NO_TRANSFORMATION_STING,
TRAIT_NO_AUGMENTS,
)
no_equip_flags = ITEM_SLOT_OCLOTHING | ITEM_SLOT_GLOVES | ITEM_SLOT_FEET | ITEM_SLOT_SUITSTORE
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | ERT_SPAWN | SLIME_EXTRACT
@@ -2,10 +2,8 @@
name = "\improper Mothman"
plural_form = "Mothmen"
id = SPECIES_MOTH
species_traits = list(
HAS_MARKINGS,
)
inherent_traits = list(
TRAIT_HAS_MARKINGS,
TRAIT_CAN_USE_FLIGHT_POTION,
TRAIT_TACKLING_WINGED_ATTACKER,
TRAIT_ANTENNAE,
@@ -8,13 +8,11 @@
fixed_mut_color = "#DBBF92"
hair_color = "#FF4B19" //cap color, spot color uses eye color
species_traits = list(
MUTCOLORS,
NO_UNDERWEAR,
)
inherent_traits = list(
TRAIT_MUTANT_COLORS,
TRAIT_NOBREATH,
TRAIT_NOFLASH,
TRAIT_NO_UNDERWEAR,
)
inherent_factions = list(FACTION_MUSHROOM)
speedmod = 1.5 //faster than golems but not by much
@@ -4,9 +4,6 @@
id = SPECIES_PLASMAMAN
sexes = FALSE
meat = /obj/item/stack/sheet/mineral/plasma
species_traits = list(
NOTRANSSTING,
)
// plasmemes get hard to wound since they only need a severe bone wound to dismember, but unlike skellies, they can't pop their bones back into place
inherent_traits = list(
TRAIT_GENELESS,
@@ -14,6 +11,7 @@
TRAIT_RADIMMUNE,
TRAIT_RESISTCOLD,
TRAIT_NOBLOOD,
TRAIT_NO_TRANSFORMATION_STING,
)
inherent_biotypes = MOB_HUMANOID|MOB_MINERAL
@@ -3,10 +3,8 @@
name = "\improper Podperson"
plural_form = "Podpeople"
id = SPECIES_PODPERSON
species_traits = list(
MUTCOLORS,
)
inherent_traits = list(
TRAIT_MUTANT_COLORS,
TRAIT_PLANT_SAFE,
)
external_organs = list(
@@ -5,7 +5,6 @@
id = SPECIES_SHADOW
sexes = 0
meat = /obj/item/food/meat/slab/human/mutant/shadow
species_traits = list()
inherent_traits = list(
TRAIT_NOBREATH,
TRAIT_RADIMMUNE,
@@ -4,12 +4,8 @@
id = SPECIES_SKELETON
sexes = FALSE
meat = /obj/item/food/meat/slab/human/mutant/skeleton
species_traits = list(
NOTRANSSTING,
NO_DNA_COPY,
NO_UNDERWEAR,
)
inherent_traits = list(
TRAIT_NO_UNDERWEAR,
TRAIT_CAN_USE_FLIGHT_POTION,
TRAIT_EASYDISMEMBER,
TRAIT_FAKEDEATH,
@@ -26,6 +22,8 @@
TRAIT_TOXIMMUNE,
TRAIT_XENO_IMMUNE,
TRAIT_NOBLOOD,
TRAIT_NO_DNA_COPY,
TRAIT_NO_TRANSFORMATION_STING,
)
inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
mutanttongue = /obj/item/organ/internal/tongue/bone
@@ -1,11 +1,9 @@
/datum/species/snail
name = "Snailperson"
id = SPECIES_SNAIL
species_traits = list(
MUTCOLORS,
// NO_UNDERWEAR, //SKYRAT EDIT - Snails deserve to wear underwear
)
inherent_traits = list(
TRAIT_MUTANT_COLORS,
// TRAIT_NO_UNDERWEAR, //SKYRAT EDIT - Snails deserve to wear underwear
TRAIT_NO_SLIP_ALL,
TRAIT_WATER_BREATHING, //SKYRAT EDIT - Roundstart Snails
)
@@ -7,13 +7,11 @@
/datum/species/vampire
name = "Vampire"
id = SPECIES_VAMPIRE
species_traits = list(
DRINKSBLOOD,
BLOOD_CLANS,
)
inherent_traits = list(
TRAIT_BLOOD_CLANS,
TRAIT_NOBREATH,
TRAIT_NOHUNGER,
TRAIT_DRINKS_BLOOD,
)
inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
mutant_bodyparts = list("wings" = "None")
@@ -1,4 +1,4 @@
#define REGENERATION_DELAY 60 // After taking damage, how long it takes for automatic regeneration to begin
#define REGENERATION_DELAY 6 SECONDS // After taking damage, how long it takes for automatic regeneration to begin
/datum/species/zombie
// 1spooky
@@ -7,12 +7,9 @@
sexes = 0
meat = /obj/item/food/meat/slab/human/mutant/zombie
mutanttongue = /obj/item/organ/internal/tongue/zombie
species_traits = list(
NOZOMBIE,
NOTRANSSTING,
)
inherent_traits = list(
// SHARED WITH ALL ZOMBIES
TRAIT_NO_ZOMBIFY,
TRAIT_EASILY_WOUNDED,
TRAIT_EASYDISMEMBER,
TRAIT_FAKEDEATH,
@@ -21,12 +18,13 @@
TRAIT_NOCLONELOSS,
TRAIT_NODEATH,
TRAIT_NOHUNGER,
TRAIT_NOMETABOLISM,
TRAIT_LIVERLESS_METABOLISM,
TRAIT_RADIMMUNE,
TRAIT_RESISTCOLD,
TRAIT_RESISTHIGHPRESSURE,
TRAIT_RESISTLOWPRESSURE,
TRAIT_TOXIMMUNE,
TRAIT_NO_TRANSFORMATION_STING,
// HIGH FUNCTIONING UNIQUE
TRAIT_NOBLOOD,
TRAIT_SUCCUMB_OVERRIDE,
@@ -50,7 +48,14 @@
BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/zombie
)
var/static/list/spooks = list('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/wail.ogg')
/// Spooky growls we sometimes play while alive
var/static/list/spooks = list(
'sound/hallucinations/growl1.ogg',
'sound/hallucinations/growl2.ogg',
'sound/hallucinations/growl3.ogg',
'sound/hallucinations/veryfar_noise.ogg',
'sound/hallucinations/wail.ogg',
)
/// Zombies do not stabilize body temperature they are the walking dead and are cold blooded
/datum/species/zombie/body_temperature_core(mob/living/carbon/human/humi, seconds_per_tick, times_fired)
@@ -92,10 +97,6 @@
mutanteyes = /obj/item/organ/internal/eyes/zombie
mutantbrain = /obj/item/organ/internal/brain/zombie
changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN
/// The rate the zombies regenerate at
var/heal_rate = 0.5
/// The cooldown before the zombie can start regenerating
COOLDOWN_DECLARE(regen_cooldown)
inherent_traits = list(
// SHARED WITH ALL ZOMBIES
@@ -107,7 +108,7 @@
TRAIT_NOCLONELOSS,
TRAIT_NODEATH,
TRAIT_NOHUNGER,
TRAIT_NOMETABOLISM,
TRAIT_LIVERLESS_METABOLISM,
TRAIT_RADIMMUNE,
TRAIT_RESISTCOLD,
TRAIT_RESISTHIGHPRESSURE,
@@ -118,6 +119,11 @@
TRAIT_STABLELIVER, // Not necessary but for consistency with above
)
/// The rate the zombies regenerate at
var/heal_rate = 0.5
/// The cooldown before the zombie can start regenerating
COOLDOWN_DECLARE(regen_cooldown)
/datum/species/zombie/infectious/on_species_gain(mob/living/carbon/human/new_zombie, datum/species/old_species)
. = ..()
new_zombie.AddComponent(/datum/component/mutant_hands, mutant_hand_path = /obj/item/mutant_hand/zombie)
+36 -3
View File
@@ -2,12 +2,45 @@
/mob/living/carbon/register_init_signals()
. = ..()
//Traits that register add and remove
RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_AGENDER), PROC_REF(on_agender_trait_gain))
RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_AGENDER), PROC_REF(on_agender_trait_loss))
//Traits that register add only
RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_NOBREATH), PROC_REF(on_nobreath_trait_gain))
RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_NOMETABOLISM), PROC_REF(on_nometabolism_trait_gain))
RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_LIVERLESS_METABOLISM), PROC_REF(on_liverless_metabolism_trait_gain))
RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_VIRUSIMMUNE), PROC_REF(on_virusimmune_trait_gain))
RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_TOXIMMUNE), PROC_REF(on_toximmune_trait_gain))
RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_GENELESS), PROC_REF(on_geneless_trait_gain))
/**
* On gain of TRAIT_AGENDER
*
* This will make the mob get it's gender set to PLURAL.
*/
/mob/living/carbon/proc/on_agender_trait_gain(datum/source)
SIGNAL_HANDLER
gender = PLURAL
/**
* On removal of TRAIT_AGENDER
*
* This will make the mob get it's gender set to whatever the DNA says it should be.
*/
/mob/living/carbon/proc/on_agender_trait_loss(datum/source)
SIGNAL_HANDLER
//updates our gender to be whatever our DNA wants it to be
switch(deconstruct_block(get_uni_identity_block(dna.unique_identity, DNA_GENDER_BLOCK), 3) || pick(G_MALE, G_FEMALE))
if(G_MALE)
gender = MALE
if(G_FEMALE)
gender = FEMALE
else
gender = PLURAL
/**
* On gain of TRAIT_NOBREATH
*
@@ -40,11 +73,11 @@
clear_mood_event("suffocation")
/**
* On gain of TRAIT_NOMETABOLISM
* On gain of TRAIT_LIVERLESS_METABOLISM
*
* This will clear all moods related to addictions and stop metabolization.
*/
/mob/living/carbon/proc/on_nometabolism_trait_gain(datum/source)
/mob/living/carbon/proc/on_liverless_metabolism_trait_gain(datum/source)
SIGNAL_HANDLER
for(var/addiction_type in subtypesof(/datum/addiction))
+1 -1
View File
@@ -751,7 +751,7 @@
reagents.end_metabolization(src, keep_liverless = TRUE) //Stops trait-based effects on reagents, to prevent permanent buffs
reagents.metabolize(src, seconds_per_tick, times_fired, can_overdose = TRUE, liverless = TRUE)
if(HAS_TRAIT(src, TRAIT_STABLELIVER) || HAS_TRAIT(src, TRAIT_NOMETABOLISM))
if(HAS_TRAIT(src, TRAIT_STABLELIVER) || HAS_TRAIT(src, TRAIT_LIVERLESS_METABOLISM))
return
adjustToxLoss(0.6 * seconds_per_tick, TRUE, TRUE)
@@ -711,16 +711,12 @@
return
if(invisible_man.undergoing_liver_failure())
return
if(HAS_TRAIT(invisible_man, TRAIT_NOMETABOLISM))
if(HAS_TRAIT(invisible_man, TRAIT_LIVERLESS_METABOLISM))
return
if(invisible_man.has_status_effect(/datum/status_effect/grouped/stasis))
return
invisible_man.add_traits(list(TRAIT_INVISIBLE_MAN, TRAIT_HIDE_EXTERNAL_ORGANS), name)
var/datum/dna/druggy_dna = invisible_man.has_dna()
if(druggy_dna?.species)
druggy_dna.species.species_traits += NOBLOODOVERLAY
invisible_man.add_traits(list(TRAIT_INVISIBLE_MAN, TRAIT_HIDE_EXTERNAL_ORGANS, TRAIT_NO_BLOOD_OVERLAY), type)
invisible_man.update_body()
invisible_man.remove_from_all_data_huds()
@@ -728,16 +724,12 @@
/datum/reagent/drug/saturnx/on_mob_end_metabolize(mob/living/carbon/invisible_man)
. = ..()
if(HAS_TRAIT(invisible_man, TRAIT_INVISIBLE_MAN))
if(HAS_TRAIT_FROM(invisible_man, TRAIT_INVISIBLE_MAN, type))
invisible_man.add_to_all_human_data_huds() //Is this safe, what do you think, Floyd?
invisible_man.remove_traits(list(TRAIT_INVISIBLE_MAN, TRAIT_HIDE_EXTERNAL_ORGANS), name)
invisible_man.remove_traits(list(TRAIT_INVISIBLE_MAN, TRAIT_HIDE_EXTERNAL_ORGANS, TRAIT_NO_BLOOD_OVERLAY), type)
to_chat(invisible_man, span_notice("As you sober up, opacity once again returns to your body meats."))
var/datum/dna/druggy_dna = invisible_man.has_dna()
if(druggy_dna?.species)
druggy_dna.species.species_traits -= NOBLOODOVERLAY
invisible_man.update_body()
invisible_man.sound_environment_override = NONE
@@ -39,7 +39,7 @@
if(iscarbon(exposed_mob))
var/mob/living/carbon/exposed_carbon = exposed_mob
if(exposed_carbon.get_blood_id() == type && ((methods & INJECT) || ((methods & INGEST) && exposed_carbon.dna && exposed_carbon.dna.species && (DRINKSBLOOD in exposed_carbon.dna.species.species_traits))))
if(exposed_carbon.get_blood_id() == type && ((methods & INJECT) || ((methods & INGEST) && HAS_TRAIT(exposed_carbon, TRAIT_DRINKS_BLOOD))))
if(!data || !(data["blood_type"] in get_safe_blood(exposed_carbon.dna.blood_type)))
exposed_carbon.reagents.add_reagent(/datum/reagent/toxin, reac_volume * 0.5)
else
@@ -501,7 +501,7 @@
if(ishuman(exposed_mob))
if(methods & (PATCH|VAPOR))
var/mob/living/carbon/human/exposed_human = exposed_mob
if(exposed_human.dna.species.id == SPECIES_HUMAN)
if(exposed_human.dna.species.use_skintones)
switch(exposed_human.skin_tone)
if("african1")
exposed_human.skin_tone = "african2"
@@ -523,10 +523,11 @@
exposed_human.skin_tone = pick("caucasian3", "latino")
if("caucasian1")
exposed_human.skin_tone = "caucasian2"
if ("albino")
if("albino")
exposed_human.skin_tone = "caucasian1"
if(MUTCOLORS in exposed_human.dna.species.species_traits) //take current alien color and darken it slightly
//take current alien color and darken it slightly
if(HAS_TRAIT(exposed_human, TRAIT_MUTANT_COLORS) && !HAS_TRAIT(exposed_human, TRAIT_FIXED_MUTANT_COLORS))
var/newcolor = ""
var/string = exposed_human.dna.features["mcolor"]
var/len = length(string)
@@ -573,7 +574,7 @@
head.head_flags |= HEAD_HAIR //No hair? No problem!
if(affected_human.dna.species.use_skintones)
affected_human.skin_tone = "orange"
else if(MUTCOLORS in affected_human.dna.species.species_traits) //Aliens with custom colors simply get turned orange
else if(HAS_TRAIT(affected_human, TRAIT_MUTANT_COLORS) && !HAS_TRAIT(affected_human, TRAIT_FIXED_MUTANT_COLORS)) //Aliens with custom colors simply get turned orange
affected_human.dna.features["mcolor"] = "#ff8800"
affected_human.update_body(is_creating = TRUE)
if(SPT_PROB(3.5, seconds_per_tick))
+2 -8
View File
@@ -111,11 +111,6 @@
var/px_x = 0
var/px_y = 0
/**
* A copy of the original owner's species datum species_traits list (very hacky)
* It sucks that we have to do this, but due to MUTCOLORS and others, we have to. For now.
*/
var/species_flags_list = list()
///the type of damage overlay (if any) to use when this bodypart is bruised/burned.
var/dmg_overlay_type = "human"
/// If we're bleeding, which icon are we displaying on this part
@@ -604,7 +599,7 @@
owner.updatehealth()
//SKYRAT EDIT ADDITION BEGIN - CUSTOMIZATION
//Consider moving this to a new species proc "spec_heal" maybe?
if(owner.stat == DEAD && owner?.dna?.species && (REVIVES_BY_HEALING in owner.dna.species.species_traits))
if(owner.stat == DEAD && HAS_TRAIT(owner, TRAIT_REVIVES_BY_HEALING))
if(owner.health > 50)
owner.revive(FALSE)
//SKYRAT EDIT ADDITION END
@@ -847,7 +842,6 @@
// No, xenos don't actually use bodyparts. Don't ask.
var/mob/living/carbon/human/human_owner = owner
var/datum/species/owner_species = human_owner.dna.species
species_flags_list = owner_species.species_traits.Copy()
limb_gender = (human_owner.physique == MALE) ? "m" : "f"
if(owner_species.use_skintones)
@@ -855,7 +849,7 @@
else
skin_tone = ""
if(((MUTCOLORS in owner_species.species_traits) || (DYNCOLORS in owner_species.species_traits))) //Ethereal code. Motherfuckers.
if(HAS_TRAIT(owner, TRAIT_MUTANT_COLORS))
if(owner_species.fixed_mut_color)
species_color = owner_species.fixed_mut_color
else
+1 -1
View File
@@ -14,7 +14,7 @@
/datum/surgery_step/replace_limb/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
if(NOAUGMENTS in target.dna.species.species_traits)
if(HAS_TRAIT(target, TRAIT_NO_AUGMENTS))
to_chat(user, span_warning("[target] cannot be augmented!"))
return SURGERY_STEP_FAIL
if(istype(tool, /obj/item/borg/apparatus/organ_storage) && istype(tool.contents[1], /obj/item/bodypart))
@@ -127,23 +127,19 @@
#define HAS_PAINFUL_TOXIN 2
/obj/item/organ/internal/liver/on_life(seconds_per_tick, times_fired)
. = ..() //perform general on_life()
var/mob/living/carbon/liver_owner = owner
if(!istype(liver_owner))
return
. = ..()
//If your liver is failing, then we use the liverless version of metabolize
//We don't check for TRAIT_NOMETABOLISM here because we do want a functional liver if somehow we have one inserted
if(organ_flags & ORGAN_FAILING)
liver_owner.reagents.metabolize(liver_owner, seconds_per_tick, times_fired, can_overdose = TRUE, liverless = TRUE)
owner.reagents.metabolize(owner, seconds_per_tick, times_fired, can_overdose = TRUE, liverless = TRUE)
return
var/obj/belly = liver_owner.get_organ_slot(ORGAN_SLOT_STOMACH)
var/list/cached_reagents = liver_owner.reagents.reagent_list
var/obj/belly = owner.get_organ_slot(ORGAN_SLOT_STOMACH)
var/list/cached_reagents = owner.reagents.reagent_list
var/liver_damage = 0
var/provide_pain_message = HAS_NO_TOXIN
if(filterToxins && !HAS_TRAIT(liver_owner, TRAIT_TOXINLOVER))
if(filterToxins && !HAS_TRAIT(owner, TRAIT_TOXINLOVER))
for(var/datum/reagent/toxin/toxin in cached_reagents)
if(status != toxin.affected_organtype) //this particular toxin does not affect this type of organ
continue
@@ -157,17 +153,17 @@
if(provide_pain_message != HAS_PAINFUL_TOXIN)
provide_pain_message = toxin.silent_toxin ? HAS_SILENT_TOXIN : HAS_PAINFUL_TOXIN
liver_owner.reagents.metabolize(liver_owner, seconds_per_tick, times_fired, can_overdose = TRUE)
owner.reagents.metabolize(owner, seconds_per_tick, times_fired, can_overdose = TRUE)
if(liver_damage)
apply_organ_damage(min(liver_damage * seconds_per_tick , MAX_TOXIN_LIVER_DAMAGE * seconds_per_tick))
if(provide_pain_message && damage > 10 && SPT_PROB(damage/6, seconds_per_tick)) //the higher the damage the higher the probability
to_chat(liver_owner, span_warning("You feel a dull pain in your abdomen."))
to_chat(owner, span_warning("You feel a dull pain in your abdomen."))
/obj/item/organ/internal/liver/handle_failing_organs(seconds_per_tick)
if(HAS_TRAIT(owner, TRAIT_STABLELIVER) || HAS_TRAIT(owner, TRAIT_NOMETABOLISM))
if(HAS_TRAIT(owner, TRAIT_STABLELIVER) || HAS_TRAIT(owner, TRAIT_LIVERLESS_METABOLISM))
return
return ..()
@@ -7,7 +7,7 @@
name = "mass of bones"
desc = "You have no idea what this strange ball of bones does."
icon_state = "liver-bone"
organ_traits = list(TRAIT_NOMETABOLISM)
organ_traits = list(TRAIT_LIVERLESS_METABOLISM)
/obj/item/organ/internal/liver/bone/handle_chemical(mob/living/carbon/organ_owner, datum/reagent/chem, seconds_per_tick, times_fired)
. = ..()
+2 -3
View File
@@ -25,9 +25,8 @@
/proc/try_to_zombie_infect(mob/living/carbon/human/target)
CHECK_DNA_AND_SPECIES(target)
if(NOZOMBIE in target.dna.species.species_traits)
// cannot infect any NOZOMBIE subspecies (such as high functioning
// zombies)
if(HAS_TRAIT(target, TRAIT_NO_ZOMBIFY))
// cannot infect any TRAIT_NO_ZOMBIFY human
return
// spaceacillin has a 75% chance to block infection
@@ -69,7 +69,7 @@
human_user.skin_tone = new_s_tone
human_user.dna.update_ui_block(DNA_SKIN_TONE_BLOCK)
if(MUTCOLORS in human_user.dna.species.species_traits)
if(HAS_TRAIT(human_user, TRAIT_MUTANT_COLORS) && !HAS_TRAIT(human_user, TRAIT_FIXED_MUTANT_COLORS))
var/new_mutantcolor = input(user, "Choose your skin color:", "Race change", human_user.dna.features["mcolor"]) as color|null
if(new_mutantcolor)
var/temp_hsv = RGBtoHSV(new_mutantcolor)
@@ -14,7 +14,7 @@
var/species_type = preferences.read_preference(/datum/preference/choiced/species)
var/datum/species/species = new species_type
return !(NO_UNDERWEAR in species.species_traits)
return !(TRAIT_NO_UNDERWEAR in species.inherent_traits)
/datum/preference/choiced/undershirt/init_possible_values()
return generate_values_for_underwear(GLOB.undershirt_list, list("human_chest_m", "human_r_arm", "human_l_arm", "human_r_leg", "human_l_leg", "human_r_hand", "human_l_hand"), COLOR_ALMOST_BLACK, 10)
@@ -32,7 +32,7 @@
var/species_type = preferences.read_preference(/datum/preference/choiced/species)
var/datum/species/species = new species_type
return !(NO_UNDERWEAR in species.species_traits)
return !(TRAIT_NO_UNDERWEAR in species.inherent_traits)
/datum/preference/choiced/underwear/init_possible_values()
return generate_values_for_underwear(GLOB.underwear_list, list("human_chest_m", "human_r_leg", "human_l_leg"), COLOR_ALMOST_BLACK, 5)
@@ -43,4 +43,4 @@
var/species_type = preferences.read_preference(/datum/preference/choiced/species)
var/datum/species/species = new species_type
return !(NO_UNDERWEAR in species.species_traits)
return !(TRAIT_NO_UNDERWEAR in species.inherent_traits)
@@ -14,7 +14,7 @@
var/species_type = preferences.read_preference(/datum/preference/choiced/species)
var/datum/species/species = new species_type
return !(NO_UNDERWEAR in species.species_traits)
return !(TRAIT_NO_UNDERWEAR in species.inherent_traits)
// SKYRAT EDIT ADDITION BEGIN - Colorable Undershirt/Socks
/datum/preference/color/undershirt_color
@@ -31,7 +31,7 @@
var/species_type = preferences.read_preference(/datum/preference/choiced/species)
var/datum/species/species = new species_type
return !(NO_UNDERWEAR in species.species_traits)
return !(TRAIT_NO_UNDERWEAR in species.inherent_traits)
/datum/preference/color/socks_color
savefile_key = "socks_color"
@@ -47,5 +47,5 @@
var/species_type = preferences.read_preference(/datum/preference/choiced/species)
var/datum/species/species = new species_type
return !(NO_UNDERWEAR in species.species_traits)
return !(TRAIT_NO_UNDERWEAR in species.inherent_traits)
// SKYRAT EDIT ADDITION END - Colorable Undershirt/Socks
@@ -15,7 +15,7 @@
if ( \
(preference.relevant_mutant_bodypart in default_mutant_bodyparts) \
|| (preference.relevant_species_trait in species_traits) \
|| (preference.relevant_inherent_trait in inherent_traits) \
|| (preference.relevant_head_flag && check_head_flags(preference.relevant_head_flag)) \
)
features += preference.savefile_key
@@ -5,14 +5,12 @@
can_augment = FALSE
body_size_restricted = TRUE
digitigrade_customization = DIGITIGRADE_NEVER // We have our own unique sprites!
species_traits = list(
MUTCOLORS,
)
inherent_traits = list(
TRAIT_ADVANCEDTOOLUSER,
TRAIT_CAN_STRIP,
TRAIT_CAN_USE_FLIGHT_POTION,
TRAIT_LITERATE,
TRAIT_MUTANT_COLORS,
)
inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID
mutantlungs = /obj/item/organ/internal/lungs/nitrogen/vox
@@ -204,7 +204,7 @@
/datum/sprite_accessory/synth_chassis/default
name = "Default Chassis"
icon_state = "ipc"
color_src = MUTCOLORS //Here it's used to tell apart greyscalling
color_src = MUTANT_COLOR //Here it's used to tell apart greyscalling
/datum/sprite_accessory/synth_chassis/synth
name = "Dark Chassis"
@@ -214,7 +214,7 @@
name = "Human Chassis"
icon = BODYPART_ICON_HUMAN
icon_state = "human"
color_src = MUTCOLORS
color_src = MUTANT_COLOR
dimorphic = TRUE
/datum/sprite_accessory/synth_chassis/android
@@ -226,7 +226,7 @@
name = "Mammal Chassis"
icon = BODYPART_ICON_SYNTHMAMMAL
icon_state = "synthmammal"
color_src = MUTCOLORS
color_src = MUTANT_COLOR
dimorphic = TRUE
is_digi_compatible = TRUE
@@ -234,7 +234,7 @@
name = "Lizard Chassis"
icon = BODYPART_ICON_SYNTHLIZARD
icon_state = "synthliz"
color_src = MUTCOLORS
color_src = MUTANT_COLOR
dimorphic = TRUE
is_digi_compatible = TRUE
@@ -295,7 +295,7 @@
/datum/sprite_accessory/synth_head/default
name = "Default Head"
color_src = MUTCOLORS
color_src = MUTANT_COLOR
/datum/sprite_accessory/synth_head/synth
name = "Dark Head"
@@ -305,7 +305,7 @@
name = "Human Head"
icon = BODYPART_ICON_HUMAN
icon_state = "human"
color_src = MUTCOLORS
color_src = MUTANT_COLOR
dimorphic = TRUE
/datum/sprite_accessory/synth_head/android
@@ -317,20 +317,20 @@
name = "Mammal Head"
icon = BODYPART_ICON_SYNTHMAMMAL
icon_state = "synthmammal"
color_src = MUTCOLORS
color_src = MUTANT_COLOR
dimorphic = TRUE
/datum/sprite_accessory/synth_head/lizard
name = "Lizard Head"
icon = BODYPART_ICON_SYNTHLIZARD
icon_state = "synthliz"
color_src = MUTCOLORS
color_src = MUTANT_COLOR
dimorphic = TRUE
/datum/sprite_accessory/synth_head/mcgreyscale
name = "Morpheus Cyberkinetics (Greyscale)"
icon_state = "mcgipc"
color_src = MUTCOLORS //Here it's used to tell apart greyscalling
color_src = MUTANT_COLOR //Here it's used to tell apart greyscalling
/datum/sprite_accessory/synth_head/bishopcyberkinetics
name = "Bishop Cyberkinetics"
@@ -120,7 +120,7 @@ GLOBAL_LIST_EMPTY(customizable_races)
standing += eye_overlay
//Underwear, Undershirts & Socks
if(!(NO_UNDERWEAR in species_traits))
if(!HAS_TRAIT(species_human, TRAIT_NO_UNDERWEAR))
if(species_human.underwear && !(species_human.underwear_visibility & UNDERWEAR_HIDE_UNDIES))
var/datum/sprite_accessory/underwear/underwear = GLOB.underwear_list[species_human.underwear]
var/mutable_appearance/underwear_overlay
@@ -216,7 +216,7 @@ GLOBAL_LIST_EMPTY(customizable_races)
/datum/species/regenerate_organs(mob/living/carbon/target, datum/species/old_species, replace_current = TRUE, list/excluded_zones, visual_only = FALSE)
. = ..()
var/robot_organs = (ROBOTIC_DNA_ORGANS in target.dna.species.species_traits)
var/robot_organs = HAS_TRAIT(target, TRAIT_ROBOTIC_DNA_ORGANS)
for(var/key in target.dna.mutant_bodyparts)
if(!islist(target.dna.mutant_bodyparts[key]) || !(target.dna.mutant_bodyparts[key][MUTANT_INDEX_NAME] in GLOB.sprite_accessories[key]))
@@ -19,9 +19,6 @@
eyes_icon = 'modular_skyrat/modules/organs/icons/akula_eyes.dmi'
mutanteyes = /obj/item/organ/internal/eyes/akula
mutanttongue = /obj/item/organ/internal/tongue/akula
species_traits = list(
MUTCOLORS,
)
inherent_traits = list(
TRAIT_ADVANCEDTOOLUSER,
TRAIT_CAN_STRIP,
@@ -29,6 +26,7 @@
TRAIT_LITERATE,
TRAIT_WATER_BREATHING,
TRAIT_SLICK_SKIN,
TRAIT_MUTANT_COLORS,
)
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID
mutant_bodyparts = list()
@@ -1,15 +1,13 @@
/datum/species/aquatic
name = "Akula (Generic)"
id = SPECIES_AQUATIC
species_traits = list(
MUTCOLORS,
)
inherent_traits = list(
TRAIT_ADVANCEDTOOLUSER,
TRAIT_CAN_STRIP,
TRAIT_CAN_USE_FLIGHT_POTION,
TRAIT_LITERATE,
TRAIT_WATER_BREATHING,
TRAIT_MUTANT_COLORS,
)
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID
mutant_bodyparts = list()
@@ -2,9 +2,6 @@
name = "Ghoul"
id = SPECIES_GHOUL
examine_limb_id = SPECIES_GHOUL
species_traits = list(
DYNCOLORS,
)
can_have_genitals = FALSE //WHY WOULD YOU WANT TO FUCK ONE OF THESE THINGS?
mutant_bodyparts = list("ghoulcolor" = "Tan Necrotic")
default_mutant_bodyparts = list(
@@ -20,6 +17,8 @@
TRAIT_EASYDISMEMBER,
TRAIT_EASILY_WOUNDED, //theyre like fuckin skin and bones
TRAIT_LITERATE,
TRAIT_MUTANT_COLORS,
TRAIT_FIXED_MUTANT_COLORS,
)
payday_modifier = 0.75 //-- "Equality"
stunmod = 1.25 //multiplier for stun durations
@@ -62,9 +62,6 @@
/datum/species/hemophage
name = "Hemophage"
id = SPECIES_HEMOPHAGE
species_traits = list(
DRINKSBLOOD,
)
inherent_traits = list(
TRAIT_ADVANCEDTOOLUSER,
TRAIT_CAN_STRIP,
@@ -73,6 +70,7 @@
TRAIT_VIRUSIMMUNE,
TRAIT_CAN_USE_FLIGHT_POTION,
TRAIT_LITERATE,
TRAIT_DRINKS_BLOOD,
)
inherent_biotypes = MOB_HUMANOID | MOB_ORGANIC
default_mutant_bodyparts = list(
@@ -1,14 +1,12 @@
/datum/species/humanoid
name = "Humanoid"
id = SPECIES_HUMANOID
species_traits = list(
MUTCOLORS,
)
inherent_traits = list(
TRAIT_ADVANCEDTOOLUSER,
TRAIT_CAN_STRIP,
TRAIT_CAN_USE_FLIGHT_POTION,
TRAIT_LITERATE,
TRAIT_MUTANT_COLORS,
)
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID
mutant_bodyparts = list()
@@ -1,14 +1,12 @@
/datum/species/insect
name = "Anthromorphic Insect"
id = SPECIES_INSECT
species_traits = list(
MUTCOLORS,
)
inherent_traits = list(
TRAIT_ADVANCEDTOOLUSER,
TRAIT_CAN_STRIP,
TRAIT_CAN_USE_FLIGHT_POTION,
TRAIT_LITERATE,
TRAIT_MUTANT_COLORS,
)
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG
mutant_bodyparts = list()
@@ -1,9 +1,6 @@
/datum/species/lizard
mutant_bodyparts = list()
external_organs = list()
species_traits = list(
MUTCOLORS,
)
default_mutant_bodyparts = list(
"tail" = ACC_RANDOM,
"snout" = ACC_RANDOM,
@@ -47,11 +44,14 @@
lizard.update_body(TRUE)
/datum/species/lizard/ashwalker
species_traits = list(
MUTCOLORS,
NO_UNDERWEAR,
)
always_customizable = TRUE
inherent_traits = list(
TRAIT_NO_UNDERWEAR,
TRAIT_MUTANT_COLORS,
TRAIT_CAN_USE_FLIGHT_POTION,
TRAIT_TACKLING_TAILED_DEFENDER,
)
/datum/species/lizard/ashwalker/prepare_human_for_preview(mob/living/carbon/human/lizard, lizard_color = "#990000")
. = ..(lizard, lizard_color)
@@ -1,14 +1,12 @@
/datum/species/mammal
name = "Anthromorph" //Called so because the species is so much more universal than just mammals
id = SPECIES_MAMMAL
species_traits = list(
MUTCOLORS,
)
inherent_traits = list(
TRAIT_ADVANCEDTOOLUSER,
TRAIT_CAN_STRIP,
TRAIT_CAN_USE_FLIGHT_POTION,
TRAIT_LITERATE,
TRAIT_MUTANT_COLORS,
)
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID
mutant_bodyparts = list()
@@ -5,10 +5,12 @@
"wings" = ACC_RANDOM,
"moth_antennae" = ACC_RANDOM,
)
species_traits = list(
HAS_MARKINGS,
inherent_traits = list(
TRAIT_HAS_MARKINGS,
TRAIT_CAN_USE_FLIGHT_POTION,
TRAIT_TACKLING_WINGED_ATTACKER,
TRAIT_ANTENNAE,
MUTCOLORS,
TRAIT_MUTANT_COLORS,
)
/datum/species/moth/randomize_features(mob/living/carbon/human/human_mob)
@@ -1,5 +1,6 @@
/datum/species/pod
inherent_traits = list(
TRAIT_MUTANT_COLORS,
TRAIT_ADVANCEDTOOLUSER,
TRAIT_CAN_STRIP,
TRAIT_PLANT_SAFE,
@@ -16,13 +17,11 @@
name = "Podperson"
id = SPECIES_PODPERSON_WEAK
examine_limb_id = SPECIES_PODPERSON
species_traits = list(
MUTCOLORS,
)
inherent_traits = list(
TRAIT_ADVANCEDTOOLUSER,
TRAIT_CAN_STRIP,
TRAIT_LITERATE,
TRAIT_MUTANT_COLORS,
)
always_customizable = FALSE
@@ -1,7 +1,4 @@
/datum/species/jelly
species_traits = list(
MUTCOLORS,
)
default_mutant_bodyparts = list(
"tail" = "None",
"snout" = "None",
@@ -373,7 +370,7 @@
alterer.dna.species.mutant_bodyparts -= chosen_key
else
if(selected_sprite_accessory.organ_type)
var/robot_organs = (ROBOTIC_DNA_ORGANS in alterer.dna.species.species_traits)
var/robot_organs = HAS_TRAIT(alterer, TRAIT_ROBOTIC_DNA_ORGANS)
var/obj/item/organ/organ_path = selected_sprite_accessory.organ_type
var/slot = initial(organ_path.slot)
@@ -1,14 +1,12 @@
/datum/species/skrell
name = "Skrell"
id = SPECIES_SKRELL
species_traits = list(
MUTCOLORS,
)
inherent_traits = list(
TRAIT_ADVANCEDTOOLUSER,
TRAIT_CAN_STRIP,
TRAIT_CAN_USE_FLIGHT_POTION,
TRAIT_LITERATE,
TRAIT_MUTANT_COLORS,
)
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID
exotic_blood = /datum/reagent/copper
@@ -1,15 +1,13 @@
/datum/species/tajaran
name = "Tajaran"
id = SPECIES_TAJARAN
species_traits = list(
MUTCOLORS,
)
inherent_traits = list(
TRAIT_ADVANCEDTOOLUSER,
TRAIT_CAN_STRIP,
TRAIT_CAN_USE_FLIGHT_POTION,
TRAIT_LITERATE,
TRAIT_HATED_BY_DOGS,
TRAIT_MUTANT_COLORS,
)
mutanttongue = /obj/item/organ/internal/tongue/cat/tajaran
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID
@@ -1,14 +1,12 @@
/datum/species/unathi
name = "Unathi"
id = SPECIES_UNATHI
species_traits = list(
MUTCOLORS,
)
inherent_traits = list(
TRAIT_ADVANCEDTOOLUSER,
TRAIT_CAN_STRIP,
TRAIT_CAN_USE_FLIGHT_POTION,
TRAIT_LITERATE,
TRAIT_MUTANT_COLORS,
)
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID
mutant_bodyparts = list()
@@ -4,14 +4,12 @@
id = SPECIES_VOX
eyes_icon = 'modular_skyrat/modules/organs/icons/vox_eyes.dmi'
can_augment = FALSE
species_traits = list(
MUTCOLORS,
)
inherent_traits = list(
TRAIT_ADVANCEDTOOLUSER,
TRAIT_CAN_STRIP,
TRAIT_CAN_USE_FLIGHT_POTION,
TRAIT_LITERATE,
TRAIT_MUTANT_COLORS,
)
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID
mutanttongue = /obj/item/organ/internal/tongue/vox
@@ -1,14 +1,12 @@
/datum/species/vulpkanin
name = "Vulpkanin"
id = SPECIES_VULP
species_traits = list(
MUTCOLORS,
)
inherent_traits = list(
TRAIT_ADVANCEDTOOLUSER,
TRAIT_CAN_STRIP,
TRAIT_CAN_USE_FLIGHT_POTION,
TRAIT_LITERATE,
TRAIT_MUTANT_COLORS,
)
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID
mutant_bodyparts = list()
@@ -2,15 +2,13 @@
// A cloning mistake, crossing human and xenomorph DNA
name = "Xenomorph Hybrid"
id = SPECIES_XENO
family_heirlooms = list(/obj/item/toy/plush/rouny, /obj/item/toy/toy_xeno,)
species_traits = list(
MUTCOLORS,
)
family_heirlooms = list(/obj/item/toy/plush/rouny, /obj/item/toy/toy_xeno)
inherent_traits = list(
TRAIT_ADVANCEDTOOLUSER,
TRAIT_CAN_STRIP,
TRAIT_CAN_USE_FLIGHT_POTION,
TRAIT_LITERATE,
TRAIT_MUTANT_COLORS,
)
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID
mutanttongue = /obj/item/organ/internal/tongue/xeno
@@ -5,14 +5,11 @@
id = SPECIES_MUTANT
meat = /obj/item/food/meat/slab/human/mutant/zombie
eyes_icon = 'modular_skyrat/modules/mutants/icons/mutant_eyes.dmi'
species_traits = list(
NOZOMBIE,
)
inherent_traits = list(
TRAIT_NOBLOOD,
TRAIT_NODISMEMBER,
TRAIT_ADVANCEDTOOLUSER,
TRAIT_NOMETABOLISM,
TRAIT_LIVERLESS_METABOLISM,
TRAIT_TOXIMMUNE,
TRAIT_RESISTCOLD,
TRAIT_RESISTHIGHPRESSURE,
@@ -20,8 +17,9 @@
TRAIT_RADIMMUNE,
TRAIT_LIMBATTACHMENT,
TRAIT_NOBREATH,
TRAIT_NOCLONELOSS
)
TRAIT_NOCLONELOSS,
TRAIT_NO_ZOMBIFY,
)
inherent_biotypes = MOB_UNDEAD | MOB_HUMANOID
mutanttongue = /obj/item/organ/internal/tongue/zombie
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | ERT_SPAWN
@@ -189,7 +187,7 @@
target.AddComponent(/datum/component/mutant_infection)
return TRUE
if(NOZOMBIE in target.dna.species.species_traits)
if(HAS_TRAIT(target, TRAIT_NO_ZOMBIFY))
// cannot infect any NOZOMBIE subspecies (such as high functioning
// mutants)
return FALSE
@@ -22,7 +22,7 @@
return
var/mob/living/carbon/human/user_human = user
if(user_human?.dna?.species && (REVIVES_BY_HEALING in user_human.dna.species.species_traits) && user_human.health > SYNTH_BRAIN_WAKE_THRESHOLD)
if(HAS_TRAIT(user_human, TRAIT_REVIVES_BY_HEALING) && user_human.health > SYNTH_BRAIN_WAKE_THRESHOLD)
user_human.revive(FALSE)
/obj/item/organ/internal/brain/synth/emp_act(severity)
@@ -19,11 +19,8 @@
TRAIT_OXYIMMUNE,
TRAIT_LITERATE,
TRAIT_NOCRITDAMAGE, // We do our own handling of crit damage.
)
species_traits = list(
ROBOTIC_DNA_ORGANS,
ROBOTIC_LIMBS,
NOTRANSSTING,
TRAIT_ROBOTIC_DNA_ORGANS,
TRAIT_NO_TRANSFORMATION_STING,
)
mutant_bodyparts = list()
default_mutant_bodyparts = list(
@@ -125,7 +122,7 @@
examine_limb_id = chassis_of_choice.icon_state
if(chassis_of_choice.color_src || head_of_choice.color_src)
species_traits += MUTCOLORS
target.add_traits(list(TRAIT_MUTANT_COLORS), SPECIES_TRAIT)
// We want to ensure that the IPC gets their chassis and their head correctly.
for(var/obj/item/bodypart/limb as anything in target.bodyparts)
@@ -6,15 +6,13 @@
name = "Teshari"
id = SPECIES_TESHARI
eyes_icon = 'modular_skyrat/modules/organs/icons/teshari_eyes.dmi'
species_traits = list(
MUTCOLORS,
NO_UNDERWEAR,
HAS_MARKINGS,
)
inherent_traits = list(
TRAIT_ADVANCEDTOOLUSER,
TRAIT_CAN_STRIP,
TRAIT_LITERATE,
TRAIT_MUTANT_COLORS,
TRAIT_NO_UNDERWEAR,
TRAIT_HAS_MARKINGS,
)
default_mutant_bodyparts = list(
"tail" = ACC_RANDOM,