diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index adad9e1fc23..9a0ec8a80b5 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -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" diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 8fb59cf02b0..87a3b5e4d61 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -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 diff --git a/code/__DEFINES/~skyrat_defines/DNA.dm b/code/__DEFINES/~skyrat_defines/DNA.dm index 7d00a8cf2c0..8e9c220c9e1 100644 --- a/code/__DEFINES/~skyrat_defines/DNA.dm +++ b/code/__DEFINES/~skyrat_defines/DNA.dm @@ -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 diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index 631c0ee904c..da399f2a250 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -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, diff --git a/code/datums/components/bloodysoles.dm b/code/datums/components/bloodysoles.dm index e2f8a7d064f..835679a61e0 100644 --- a/code/datums/components/bloodysoles.dm +++ b/code/datums/components/bloodysoles.dm @@ -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)) diff --git a/code/datums/components/singularity.dm b/code/datums/components/singularity.dm index 463c3ef7a0c..043be3e50c0 100644 --- a/code/datums/components/singularity.dm +++ b/code/datums/components/singularity.dm @@ -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) diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm index d14b58b491c..7783465aabd 100644 --- a/code/datums/diseases/dna_spread.dm +++ b/code/datums/diseases/dna_spread.dm @@ -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 diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 800907076ac..7c8ecdf0055 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -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 diff --git a/code/datums/quirks/negative_quirks.dm b/code/datums/quirks/negative_quirks.dm index a6baee9d0da..523c26c79bf 100644 --- a/code/datums/quirks/negative_quirks.dm +++ b/code/datums/quirks/negative_quirks.dm @@ -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) diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm index 52b28b3afc3..54ef949f4bf 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -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" diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm index c8b892e91bb..6644b088f08 100644 --- a/code/game/objects/structures/dresser.dm +++ b/code/game/objects/structures/dresser.dm @@ -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 diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 56a8c84119c..cf08ad247ec 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -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 diff --git a/code/modules/antagonists/abductor/equipment/glands/heal.dm b/code/modules/antagonists/abductor/equipment/glands/heal.dm index 79268cdf5ca..8704f049a91 100644 --- a/code/modules/antagonists/abductor/equipment/glands/heal.dm +++ b/code/modules/antagonists/abductor/equipment/glands/heal.dm @@ -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 diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index f5e81de5675..0e830f7e91b 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -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 diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm index 7def3f89c29..13a506a2f89 100644 --- a/code/modules/antagonists/changeling/powers/tiny_prick.dm +++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm @@ -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 diff --git a/code/modules/antagonists/nightmare/nightmare_species.dm b/code/modules/antagonists/nightmare/nightmare_species.dm index 32d12cffc33..73f2f02f847 100644 --- a/code/modules/antagonists/nightmare/nightmare_species.dm +++ b/code/modules/antagonists/nightmare/nightmare_species.dm @@ -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 diff --git a/code/modules/client/preferences/_preference.dm b/code/modules/client/preferences/_preference.dm index 83b1cd2f123..4a23464f2f8 100644 --- a/code/modules/client/preferences/_preference.dm +++ b/code/modules/client/preferences/_preference.dm @@ -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 diff --git a/code/modules/client/preferences/clothing.dm b/code/modules/client/preferences/clothing.dm index 3736d16fc16..df71be9a6b1 100644 --- a/code/modules/client/preferences/clothing.dm +++ b/code/modules/client/preferences/clothing.dm @@ -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 = ..() diff --git a/code/modules/client/preferences/species_features/mutants.dm b/code/modules/client/preferences/species_features/mutants.dm index c73d2473d9b..aa66d3fea0c 100644 --- a/code/modules/client/preferences/species_features/mutants.dm +++ b/code/modules/client/preferences/species_features/mutants.dm @@ -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")]") diff --git a/code/modules/client/preferences/species_features/vampire.dm b/code/modules/client/preferences/species_features/vampire.dm index 1b05c2c3e12..710dd37a1f2 100644 --- a/code/modules/client/preferences/species_features/vampire.dm +++ b/code/modules/client/preferences/species_features/vampire.dm @@ -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") diff --git a/code/modules/client/preferences/underwear_color.dm b/code/modules/client/preferences/underwear_color.dm index a005145d173..6e64b4423e5 100644 --- a/code/modules/client/preferences/underwear_color.dm +++ b/code/modules/client/preferences/underwear_color.dm @@ -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 diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 133d242ae40..3b3a90a0f8c 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -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 ..() diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index ca8c8743ee9..a59ba15569b 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -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)) \ ) diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm index 8796bc41493..ed9eb3c1094 100644 --- a/code/modules/mob/living/carbon/human/species_types/abductors.dm +++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm @@ -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, diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm index a37f2896f59..f9ffc94c4a0 100644 --- a/code/modules/mob/living/carbon/human/species_types/android.dm +++ b/code/modules/mob/living/carbon/human/species_types/android.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm index e93b971fc00..e78912b11d8 100644 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm @@ -1,7 +1,6 @@ /datum/species/dullahan name = "Dullahan" id = SPECIES_DULLAHAN - species_traits = list() inherent_traits = list( TRAIT_NOBREATH, TRAIT_NOHUNGER, diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm index 942750ea0c7..6e290438b96 100644 --- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm +++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm @@ -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) diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 3ac67e43dd4..eaeb54cf2f3 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm index 811e2c63700..fe1072880e9 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -1,7 +1,6 @@ /datum/species/human name = "\improper Human" id = SPECIES_HUMAN - species_traits = list() inherent_traits = list( TRAIT_CAN_USE_FLIGHT_POTION, ) diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 62b4ae5c2a6..e82e2329d00 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 78ff17ae9ac..6aa5a5d6736 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -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, ) diff --git a/code/modules/mob/living/carbon/human/species_types/monkeys.dm b/code/modules/mob/living/carbon/human/species_types/monkeys.dm index bb7137864c3..838065b3439 100644 --- a/code/modules/mob/living/carbon/human/species_types/monkeys.dm +++ b/code/modules/mob/living/carbon/human/species_types/monkeys.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/species_types/mothmen.dm b/code/modules/mob/living/carbon/human/species_types/mothmen.dm index 00c26defbea..667d02c4097 100644 --- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm @@ -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, diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm index 0593cee2845..6e1631aeb58 100644 --- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index 28fd4d6d3f0..4d52d15b181 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index a2ea3d751d7..0ef940b6101 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -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( diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index dc960f66aa2..c34543abb37 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -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, diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm index 7b4c417d0a5..3ac0483f8ce 100644 --- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm +++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/species_types/snail.dm b/code/modules/mob/living/carbon/human/species_types/snail.dm index e9da166ab59..99680be7ca3 100644 --- a/code/modules/mob/living/carbon/human/species_types/snail.dm +++ b/code/modules/mob/living/carbon/human/species_types/snail.dm @@ -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 ) diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm index 34c1ddd41ad..cf152ef58db 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -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") diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm index ced1df311ef..9f34d39b946 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -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) diff --git a/code/modules/mob/living/carbon/init_signals.dm b/code/modules/mob/living/carbon/init_signals.dm index d9c471e494d..0094c54b43a 100644 --- a/code/modules/mob/living/carbon/init_signals.dm +++ b/code/modules/mob/living/carbon/init_signals.dm @@ -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)) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index b9f33482c09..7bee12c758c 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -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) diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 68fb40bd2a5..5bf64550bc2 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -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 diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 825fa464986..946f16f2985 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -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)) diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index fb35379efee..7a7412a6eea 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -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 diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm index f85158f7ccd..6905de5d8db 100644 --- a/code/modules/surgery/limb_augmentation.dm +++ b/code/modules/surgery/limb_augmentation.dm @@ -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)) diff --git a/code/modules/surgery/organs/internal/liver/_liver.dm b/code/modules/surgery/organs/internal/liver/_liver.dm index 68c68672350..e69a632fdeb 100644 --- a/code/modules/surgery/organs/internal/liver/_liver.dm +++ b/code/modules/surgery/organs/internal/liver/_liver.dm @@ -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 ..() diff --git a/code/modules/surgery/organs/internal/liver/liver_skeleton.dm b/code/modules/surgery/organs/internal/liver/liver_skeleton.dm index f5f1128a148..ab127151a62 100644 --- a/code/modules/surgery/organs/internal/liver/liver_skeleton.dm +++ b/code/modules/surgery/organs/internal/liver/liver_skeleton.dm @@ -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) . = ..() diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index 7f303cc64a8..620796333a9 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -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 diff --git a/modular_skyrat/master_files/code/game/objects/items/hhmirror.dm b/modular_skyrat/master_files/code/game/objects/items/hhmirror.dm index 625cc0bbd4f..481d1b8f3f4 100644 --- a/modular_skyrat/master_files/code/game/objects/items/hhmirror.dm +++ b/modular_skyrat/master_files/code/game/objects/items/hhmirror.dm @@ -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) diff --git a/modular_skyrat/master_files/code/modules/client/preferences/clothing.dm b/modular_skyrat/master_files/code/modules/client/preferences/clothing.dm index 5f8fe8ed51c..48f9df3be3c 100644 --- a/modular_skyrat/master_files/code/modules/client/preferences/clothing.dm +++ b/modular_skyrat/master_files/code/modules/client/preferences/clothing.dm @@ -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) diff --git a/modular_skyrat/master_files/code/modules/client/preferences/underwear_color.dm b/modular_skyrat/master_files/code/modules/client/preferences/underwear_color.dm index 1856d8159c4..a1819c64b3f 100644 --- a/modular_skyrat/master_files/code/modules/client/preferences/underwear_color.dm +++ b/modular_skyrat/master_files/code/modules/client/preferences/underwear_color.dm @@ -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 diff --git a/modular_skyrat/master_files/code/modules/mob/living/human/species.dm b/modular_skyrat/master_files/code/modules/mob/living/human/species.dm index 051f52a9a1d..b2b9eaeecba 100644 --- a/modular_skyrat/master_files/code/modules/mob/living/human/species.dm +++ b/modular_skyrat/master_files/code/modules/mob/living/human/species.dm @@ -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 diff --git a/modular_skyrat/modules/better_vox/code/vox_species.dm b/modular_skyrat/modules/better_vox/code/vox_species.dm index 0f545988a24..eb615743adb 100644 --- a/modular_skyrat/modules/better_vox/code/vox_species.dm +++ b/modular_skyrat/modules/better_vox/code/vox_species.dm @@ -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 diff --git a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/ipc.dm b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/ipc.dm index 784fcde4e50..8e19d245eee 100644 --- a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/ipc.dm +++ b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/ipc.dm @@ -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" diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm index e203e0176a5..b22c4cd06bf 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm @@ -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])) diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/akula.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/akula.dm index acbb9eeb7a3..170936590c2 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/akula.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/akula.dm @@ -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() diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/aquatic.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/aquatic.dm index 5bb1af4998c..080766a166e 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/aquatic.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/aquatic.dm @@ -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() diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/ghoul.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/ghoul.dm index 5c1537c1388..e0e93a7a3da 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/ghoul.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/ghoul.dm @@ -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 diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/hemophage.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/hemophage.dm index 8bdea81209a..da7b16e35a2 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/hemophage.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/hemophage.dm @@ -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( diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/humanoid.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/humanoid.dm index 20776c46d8b..b3477673b71 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/humanoid.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/humanoid.dm @@ -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() diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/insect.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/insect.dm index 388290167a0..db3e4c699c3 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/insect.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/insect.dm @@ -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() diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/lizard.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/lizard.dm index 0a1dd1fb9ae..3975e10775c 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/lizard.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/lizard.dm @@ -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) diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/mammal.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/mammal.dm index aacb437bfa7..6d9761bdc0b 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/mammal.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/mammal.dm @@ -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() diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/moth.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/moth.dm index 8bbd5fe28a7..80dc243d476 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/moth.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/moth.dm @@ -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) diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/podweak.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/podweak.dm index faa6e4f3c40..3a528f1b88c 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/podweak.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/podweak.dm @@ -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 diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/roundstartslime.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/roundstartslime.dm index 734dadeddcf..07a5c518799 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/roundstartslime.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/roundstartslime.dm @@ -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) diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/skrell.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/skrell.dm index 7cb827507ac..4c24b4e9d07 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/skrell.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/skrell.dm @@ -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 diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/tajaran.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/tajaran.dm index bec407cb9ef..57eb335622c 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/tajaran.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/tajaran.dm @@ -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 diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/unathi.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/unathi.dm index 982eb07499b..d3e016d6974 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/unathi.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/unathi.dm @@ -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() diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vox.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vox.dm index 1e15a8e29f2..efe92cfb3ac 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vox.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vox.dm @@ -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 diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vulpkanin.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vulpkanin.dm index 7dc086f36db..8e82513d992 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vulpkanin.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vulpkanin.dm @@ -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() diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/xeno.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/xeno.dm index 146f66198fc..1d2739fe34e 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/xeno.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/xeno.dm @@ -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 diff --git a/modular_skyrat/modules/mutants/code/mutant_species.dm b/modular_skyrat/modules/mutants/code/mutant_species.dm index a3c88fb9828..cee1b60848e 100644 --- a/modular_skyrat/modules/mutants/code/mutant_species.dm +++ b/modular_skyrat/modules/mutants/code/mutant_species.dm @@ -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 diff --git a/modular_skyrat/modules/synths/code/bodyparts/brain.dm b/modular_skyrat/modules/synths/code/bodyparts/brain.dm index 45e44e9e66c..cb7ccdbef0c 100644 --- a/modular_skyrat/modules/synths/code/bodyparts/brain.dm +++ b/modular_skyrat/modules/synths/code/bodyparts/brain.dm @@ -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) diff --git a/modular_skyrat/modules/synths/code/species/synthetic.dm b/modular_skyrat/modules/synths/code/species/synthetic.dm index cedcceb88a8..5b98c45a3c0 100644 --- a/modular_skyrat/modules/synths/code/species/synthetic.dm +++ b/modular_skyrat/modules/synths/code/species/synthetic.dm @@ -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) diff --git a/modular_skyrat/modules/teshari/code/_teshari.dm b/modular_skyrat/modules/teshari/code/_teshari.dm index 5c2f9685177..b278be3c2c8 100644 --- a/modular_skyrat/modules/teshari/code/_teshari.dm +++ b/modular_skyrat/modules/teshari/code/_teshari.dm @@ -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,