diff --git a/.github/workflows/ci_suite.yml b/.github/workflows/ci_suite.yml index 6e2c037c58b..60eda4ea758 100644 --- a/.github/workflows/ci_suite.yml +++ b/.github/workflows/ci_suite.yml @@ -64,10 +64,19 @@ jobs: tools/bootstrap/python tools/ticked_file_enforcement/ticked_file_enforcement.py < tools/ticked_file_enforcement/schemas/tgstation_dme.json tools/bootstrap/python tools/ticked_file_enforcement/ticked_file_enforcement.py < tools/ticked_file_enforcement/schemas/unit_tests.json tools/bootstrap/python tools/ticked_file_enforcement/ticked_file_enforcement.py < tools/ticked_file_enforcement/schemas/modular_skyrat.json # SKYRAT EDIT ADDITION - modular tick enforcement - tools/bootstrap/python -m tools.maplint.source --github - tools/build/build --ci lint tgui-test - tools/bootstrap/python -m define_sanity.check - tools/bootstrap/python -m dmi.test + - name: Check Define Sanity + if: steps.linter-setup.conclusion == 'success' && !cancelled() + run: tools/bootstrap/python -m define_sanity.check + - name: Check Trait Validity + if: steps.linter-setup.conclusion == 'success' && !cancelled() + run: tools/bootstrap/python -m trait_validity.check + - name: Run DreamChecker + if: steps.linter-setup.conclusion == 'success' && !cancelled() + shell: bash + run: ~/dreamchecker 2>&1 | bash tools/ci/annotate_dm.sh + - name: Run Map Checks + if: steps.linter-setup.conclusion == 'success' && !cancelled() + run: | tools/bootstrap/python -m mapmerge2.dmm_test ~/dreamchecker 2>&1 | bash tools/ci/annotate_dm.sh diff --git a/code/__DEFINES/traits/_traits.dm b/code/__DEFINES/traits/_traits.dm new file mode 100644 index 00000000000..46fef90160a --- /dev/null +++ b/code/__DEFINES/traits/_traits.dm @@ -0,0 +1,122 @@ +#define SIGNAL_ADDTRAIT(trait_ref) "addtrait [trait_ref]" +#define SIGNAL_REMOVETRAIT(trait_ref) "removetrait [trait_ref]" + +// trait accessor defines +#define ADD_TRAIT(target, trait, source) \ + do { \ + var/list/_L; \ + if (!target._status_traits) { \ + target._status_traits = list(); \ + _L = target._status_traits; \ + _L[trait] = list(source); \ + SEND_SIGNAL(target, SIGNAL_ADDTRAIT(trait), trait); \ + } else { \ + _L = target._status_traits; \ + if (_L[trait]) { \ + _L[trait] |= list(source); \ + } else { \ + _L[trait] = list(source); \ + SEND_SIGNAL(target, SIGNAL_ADDTRAIT(trait), trait); \ + } \ + } \ + } while (0) +#define REMOVE_TRAIT(target, trait, sources) \ + do { \ + var/list/_L = target._status_traits; \ + var/list/_S; \ + if (sources && !islist(sources)) { \ + _S = list(sources); \ + } else { \ + _S = sources\ + }; \ + if (_L?[trait]) { \ + for (var/_T in _L[trait]) { \ + if ((!_S && (_T != ROUNDSTART_TRAIT)) || (_T in _S)) { \ + _L[trait] -= _T \ + } \ + };\ + if (!length(_L[trait])) { \ + _L -= trait; \ + SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(trait), trait); \ + }; \ + if (!length(_L)) { \ + target._status_traits = null \ + }; \ + } \ + } while (0) +#define REMOVE_TRAIT_NOT_FROM(target, trait, sources) \ + do { \ + var/list/_traits_list = target._status_traits; \ + var/list/_sources_list; \ + if (sources && !islist(sources)) { \ + _sources_list = list(sources); \ + } else { \ + _sources_list = sources\ + }; \ + if (_traits_list?[trait]) { \ + for (var/_trait_source in _traits_list[trait]) { \ + if (!(_trait_source in _sources_list)) { \ + _traits_list[trait] -= _trait_source \ + } \ + };\ + if (!length(_traits_list[trait])) { \ + _traits_list -= trait; \ + SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(trait), trait); \ + }; \ + if (!length(_traits_list)) { \ + target._status_traits = null \ + }; \ + } \ + } while (0) +#define REMOVE_TRAITS_NOT_IN(target, sources) \ + do { \ + var/list/_L = target._status_traits; \ + var/list/_S = sources; \ + if (_L) { \ + for (var/_T in _L) { \ + _L[_T] &= _S;\ + if (!length(_L[_T])) { \ + _L -= _T; \ + SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(_T), _T); \ + }; \ + };\ + if (!length(_L)) { \ + target._status_traits = null\ + };\ + }\ + } while (0) + +#define REMOVE_TRAITS_IN(target, sources) \ + do { \ + var/list/_L = target._status_traits; \ + var/list/_S = sources; \ + if (sources && !islist(sources)) { \ + _S = list(sources); \ + } else { \ + _S = sources\ + }; \ + if (_L) { \ + for (var/_T in _L) { \ + _L[_T] -= _S;\ + if (!length(_L[_T])) { \ + _L -= _T; \ + SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(_T)); \ + }; \ + };\ + if (!length(_L)) { \ + target._status_traits = null\ + };\ + }\ + } while (0) + +#define HAS_TRAIT(target, trait) (target._status_traits?[trait] ? TRUE : FALSE) +#define HAS_TRAIT_FROM(target, trait, source) (HAS_TRAIT(target, trait) && (source in target._status_traits[trait])) +#define HAS_TRAIT_FROM_ONLY(target, trait, source) (HAS_TRAIT(target, trait) && (source in target._status_traits[trait]) && (length(target._status_traits[trait]) == 1)) +#define HAS_TRAIT_NOT_FROM(target, trait, source) (HAS_TRAIT(target, trait) && (length(target._status_traits[trait] - source) > 0)) +/// Returns a list of trait sources for this trait. Only useful for wacko cases and internal futzing +/// You should not be using this +#define GET_TRAIT_SOURCES(target, trait) (target._status_traits?[trait] || list()) +/// Returns the amount of sources for a trait. useful if you don't want to have a "thing counter" stuck around all the time +#define COUNT_TRAIT_SOURCES(target, trait) length(GET_TRAIT_SOURCES(target, trait)) +/// A simple helper for checking traits in a mob's mind +#define HAS_MIND_TRAIT(target, trait) (HAS_TRAIT(target, trait) || (target.mind ? HAS_TRAIT(target.mind, trait) : FALSE)) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits/declarations.dm similarity index 76% rename from code/__DEFINES/traits.dm rename to code/__DEFINES/traits/declarations.dm index a840f89431c..a614d1974df 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -1,125 +1,7 @@ -#define SIGNAL_ADDTRAIT(trait_ref) "addtrait [trait_ref]" -#define SIGNAL_REMOVETRAIT(trait_ref) "removetrait [trait_ref]" - -// trait accessor defines -#define ADD_TRAIT(target, trait, source) \ - do { \ - var/list/_L; \ - if (!target._status_traits) { \ - target._status_traits = list(); \ - _L = target._status_traits; \ - _L[trait] = list(source); \ - SEND_SIGNAL(target, SIGNAL_ADDTRAIT(trait), trait); \ - } else { \ - _L = target._status_traits; \ - if (_L[trait]) { \ - _L[trait] |= list(source); \ - } else { \ - _L[trait] = list(source); \ - SEND_SIGNAL(target, SIGNAL_ADDTRAIT(trait), trait); \ - } \ - } \ - } while (0) -#define REMOVE_TRAIT(target, trait, sources) \ - do { \ - var/list/_L = target._status_traits; \ - var/list/_S; \ - if (sources && !islist(sources)) { \ - _S = list(sources); \ - } else { \ - _S = sources\ - }; \ - if (_L?[trait]) { \ - for (var/_T in _L[trait]) { \ - if ((!_S && (_T != ROUNDSTART_TRAIT)) || (_T in _S)) { \ - _L[trait] -= _T \ - } \ - };\ - if (!length(_L[trait])) { \ - _L -= trait; \ - SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(trait), trait); \ - }; \ - if (!length(_L)) { \ - target._status_traits = null \ - }; \ - } \ - } while (0) -#define REMOVE_TRAIT_NOT_FROM(target, trait, sources) \ - do { \ - var/list/_traits_list = target._status_traits; \ - var/list/_sources_list; \ - if (sources && !islist(sources)) { \ - _sources_list = list(sources); \ - } else { \ - _sources_list = sources\ - }; \ - if (_traits_list?[trait]) { \ - for (var/_trait_source in _traits_list[trait]) { \ - if (!(_trait_source in _sources_list)) { \ - _traits_list[trait] -= _trait_source \ - } \ - };\ - if (!length(_traits_list[trait])) { \ - _traits_list -= trait; \ - SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(trait), trait); \ - }; \ - if (!length(_traits_list)) { \ - target._status_traits = null \ - }; \ - } \ - } while (0) -#define REMOVE_TRAITS_NOT_IN(target, sources) \ - do { \ - var/list/_L = target._status_traits; \ - var/list/_S = sources; \ - if (_L) { \ - for (var/_T in _L) { \ - _L[_T] &= _S;\ - if (!length(_L[_T])) { \ - _L -= _T; \ - SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(_T), _T); \ - }; \ - };\ - if (!length(_L)) { \ - target._status_traits = null\ - };\ - }\ - } while (0) - -#define REMOVE_TRAITS_IN(target, sources) \ - do { \ - var/list/_L = target._status_traits; \ - var/list/_S = sources; \ - if (sources && !islist(sources)) { \ - _S = list(sources); \ - } else { \ - _S = sources\ - }; \ - if (_L) { \ - for (var/_T in _L) { \ - _L[_T] -= _S;\ - if (!length(_L[_T])) { \ - _L -= _T; \ - SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(_T)); \ - }; \ - };\ - if (!length(_L)) { \ - target._status_traits = null\ - };\ - }\ - } while (0) - -#define HAS_TRAIT(target, trait) (target._status_traits?[trait] ? TRUE : FALSE) -#define HAS_TRAIT_FROM(target, trait, source) (HAS_TRAIT(target, trait) && (source in target._status_traits[trait])) -#define HAS_TRAIT_FROM_ONLY(target, trait, source) (HAS_TRAIT(target, trait) && (source in target._status_traits[trait]) && (length(target._status_traits[trait]) == 1)) -#define HAS_TRAIT_NOT_FROM(target, trait, source) (HAS_TRAIT(target, trait) && (length(target._status_traits[trait] - source) > 0)) -/// Returns a list of trait sources for this trait. Only useful for wacko cases and internal futzing -/// You should not be using this -#define GET_TRAIT_SOURCES(target, trait) (target._status_traits?[trait] || list()) -/// Returns the amount of sources for a trait. useful if you don't want to have a "thing counter" stuck around all the time -#define COUNT_TRAIT_SOURCES(target, trait) length(GET_TRAIT_SOURCES(target, trait)) -/// A simple helper for checking traits in a mob's mind -#define HAS_MIND_TRAIT(target, trait) (HAS_TRAIT(target, trait) || (target.mind ? HAS_TRAIT(target.mind, trait) : FALSE)) +// This file contains all of the "static" define strings that tie to a trait. +// WARNING: The sections here actually matter in this file as it's tested by CI. Please do not toy with the sections." + +// BEGIN TRAIT DEFINES /* Remember to update _globalvars/traits.dm if you're adding/removing/renaming traits. @@ -304,8 +186,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_TOXINLOVER "toxinlover" /// Doesn't get overlays from being in critical. #define TRAIT_NOCRITOVERLAY "no_crit_overlay" -/// Gets a mood boost from being in the hideout. -#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" /// The mob is holy and resistance to cult magic @@ -340,6 +220,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Unlinks gliding from movement speed, meaning that there will be a delay between movements rather than a single move movement between tiles #define TRAIT_NO_GLIDE "no_glide" +/// Applied into wounds when they're scanned with the wound analyzer, halves time to treat them manually. +#define TRAIT_WOUND_SCANNED "wound_scanned" + #define TRAIT_NODEATH "nodeath" #define TRAIT_NOHARDCRIT "nohardcrit" #define TRAIT_NOSOFTCRIT "nosoftcrit" @@ -376,8 +259,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NEGATES_GRAVITY "negates_gravity" /// We are ignoring gravity #define TRAIT_IGNORING_GRAVITY "ignores_gravity" -/// Sources for TRAIT_IGNORING_GRAVITY -#define IGNORING_GRAVITY_NEGATION "ignoring_gravity_negation" /// We have some form of forced gravity acting on us #define TRAIT_FORCED_GRAVITY "forced_gravity" /// Makes whispers clearly heard from seven tiles away, the full hearing range @@ -754,7 +635,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_GOOD_QUALITY_BAIT "good_quality_bait" #define TRAIT_GREAT_QUALITY_BAIT "great_quality_bait" /// Baits with this trait will ignore bait preferences and related fish traits. -#define OMNI_BAIT_TRAIT "omni_bait" +#define TRAIT_OMNI_BAIT "omni_bait" /// Plants that were mutated as a result of passive instability, not a mutation threshold. #define TRAIT_PLANT_WILDMUTATE "wildmutation" /// If you hit an APC with exposed internals with this item it will try to shock you @@ -870,9 +751,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Trait applied when an integrated circuit opens a UI on a player (see list pick component) #define TRAIT_CIRCUIT_UI_OPEN "circuit_ui_open" -/// Hearing trait that is from the hearing component -#define CIRCUIT_HEAR_TRAIT "circuit_hear" - /// PDA Traits. This one makes PDAs explode if the user opens the messages menu #define TRAIT_PDA_MESSAGE_MENU_RIGGED "pda_message_menu_rigged" /// This one denotes a PDA has received a rigged message and will explode when the user tries to reply to a rigged PDA message @@ -934,100 +812,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Trait given to angelic constructs to let them purge cult runes #define TRAIT_ANGELIC "angelic" -// common trait sources -#define TRAIT_GENERIC "generic" -#define UNCONSCIOUS_TRAIT "unconscious" -#define EYE_DAMAGE "eye_damage" -#define EAR_DAMAGE "ear_damage" -#define GENETIC_MUTATION "genetic" -#define OBESITY "obesity" -#define MAGIC_TRAIT "magic" -#define TRAUMA_TRAIT "trauma" -#define FLIGHTPOTION_TRAIT "flightpotion" -/// Trait inherited by experimental surgeries -#define EXPERIMENTAL_SURGERY_TRAIT "experimental_surgery" -#define DISEASE_TRAIT "disease" -#define SPECIES_TRAIT "species" -#define ORGAN_TRAIT "organ" -/// Trait given by augmented limbs -#define AUGMENTATION_TRAIT "augments" -/// Trait given by organ gained via abductor surgery -#define ABDUCTOR_GLAND_TRAIT "abductor_gland" -/// cannot be removed without admin intervention -#define ROUNDSTART_TRAIT "roundstart" -#define JOB_TRAIT "job" -#define CYBORG_ITEM_TRAIT "cyborg-item" -/// Any traits granted by quirks. -#define QUIRK_TRAIT "quirk_trait" -/// (B)admins only. -#define ADMIN_TRAIT "admin" -/// Any traits given through a smite. -#define SMITE_TRAIT "smite" -#define CHANGELING_TRAIT "changeling" -#define CULT_TRAIT "cult" -#define LICH_TRAIT "lich" -/// The item is magically cursed -#define CURSED_ITEM_TRAIT(item_type) "cursed_item_[item_type]" -#define ABSTRACT_ITEM_TRAIT "abstract-item" -/// A trait given by any status effect -#define STATUS_EFFECT_TRAIT "status-effect" -/// A trait given by a specific status effect (not sure why we need both but whatever!) -#define TRAIT_STATUS_EFFECT(effect_id) "[effect_id]-trait" -/// Trait from light debugging -#define LIGHT_DEBUG_TRAIT "light-debug" - -#define CLOTHING_TRAIT "clothing" -#define HELMET_TRAIT "helmet" -/// inherited from the mask -#define MASK_TRAIT "mask" -/// inherited from your sweet kicks -#define SHOES_TRAIT "shoes" -/// Trait inherited by implants -#define IMPLANT_TRAIT "implant" -#define GLASSES_TRAIT "glasses" -/// inherited from riding vehicles -#define VEHICLE_TRAIT "vehicle" -#define INNATE_TRAIT "innate" -#define CRIT_HEALTH_TRAIT "crit_health" -#define OXYLOSS_TRAIT "oxyloss" -/// Trait sorce for "was recently shocked by something" -#define WAS_SHOCKED "was_shocked" -#define TURF_TRAIT "turf" -/// trait associated to being buckled -#define BUCKLED_TRAIT "buckled" -/// trait associated to being held in a chokehold -#define CHOKEHOLD_TRAIT "chokehold" -/// trait associated to resting -#define RESTING_TRAIT "resting" -/// trait associated to a stat value or range of -#define STAT_TRAIT "stat" -#define STATION_TRAIT "station-trait" -/// obtained from mapping helper -#define MAPPING_HELPER_TRAIT "mapping-helper" -/// Trait associated to wearing a suit -#define SUIT_TRAIT "suit" -/// Trait associated to lying down (having a [lying_angle] of a different value than zero). -#define LYING_DOWN_TRAIT "lying-down" -/// A trait gained by leaning against a wall -#define LEANING_TRAIT "leaning" -/// Trait associated to lacking electrical power. -#define POWER_LACK_TRAIT "power-lack" -/// Trait associated to lacking motor movement -#define MOTOR_LACK_TRAIT "motor-lack" -/// Trait associated with mafia -#define MAFIA_TRAIT "mafia" -/// Trait associated with ctf -#define CTF_TRAIT "ctf" -/// Trait associated with highlander -#define HIGHLANDER_TRAIT "highlander" -/// Trait given from playing pretend with baguettes -#define SWORDPLAY_TRAIT "swordplay" -/// Trait given by being recruited as a nuclear operative -#define NUKE_OP_MINION_TRAIT "nuke-op-minion" -/// Trait given by mech equipment -#define TRAIT_MECH_EQUIPMENT(equipment_type) "mech_equipment_[equipment_type]" -/// Trait given to you by shapeshifting -#define SHAPESHIFT_TRAIT "shapeshift_trait" + ///generic atom traits /// Trait from [/datum/element/rust]. Its rusty and should be applying a special overlay to denote this. @@ -1053,179 +838,39 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// This item is currently under the control of telekinesis #define TRAIT_TELEKINESIS_CONTROLLED "telekinesis_controlled" -// unique trait sources, still defines -#define EMP_TRAIT "emp_trait" -#define STATUE_MUTE "statue" -#define CHANGELING_DRAIN "drain" /// changelings with this trait can no longer talk over the hivemind -#define CHANGELING_HIVEMIND_MUTE "ling_mute" +#define TRAIT_CHANGELING_HIVEMIND_MUTE "ling_mute" #define TRAIT_HULK "hulk" -#define STASIS_MUTE "stasis" -#define GENETICS_SPELL "genetics_spell" -#define EYES_COVERED "eyes_covered" -#define NO_EYES "no_eyes" -#define HYPNOCHAIR_TRAIT "hypnochair" -#define FLASHLIGHT_EYES "flashlight_eyes" -#define IMPURE_OCULINE "impure_oculine" -#define HAUNTIUM_REAGENT_TRAIT "hauntium_reagent_trait" -#define TRAIT_SANTA "santa" -#define SCRYING_ORB "scrying-orb" -#define ABDUCTOR_ANTAGONIST "abductor-antagonist" -#define JUNGLE_FEVER_TRAIT "jungle_fever" -#define MEGAFAUNA_TRAIT "megafauna" -#define CLOWN_NUKE_TRAIT "clown-nuke" -#define STICKY_MOUSTACHE_TRAIT "sticky-moustache" -#define CHAINSAW_FRENZY_TRAIT "chainsaw-frenzy" -#define CHRONO_GUN_TRAIT "chrono-gun" -#define REVERSE_BEAR_TRAP_TRAIT "reverse-bear-trap" -#define CURSED_MASK_TRAIT "cursed-mask" -#define HIS_GRACE_TRAIT "his-grace" -#define HAND_REPLACEMENT_TRAIT "magic-hand" -#define HOT_POTATO_TRAIT "hot-potato" -#define SABRE_SUICIDE_TRAIT "sabre-suicide" -#define ABDUCTOR_VEST_TRAIT "abductor-vest" -#define CAPTURE_THE_FLAG_TRAIT "capture-the-flag" -#define BASKETBALL_MINIGAME_TRAIT "basketball-minigame" -#define EYE_OF_GOD_TRAIT "eye-of-god" -#define SHAMEBRERO_TRAIT "shamebrero" -#define CHRONOSUIT_TRAIT "chronosuit" -#define LOCKED_HELMET_TRAIT "locked-helmet" -#define NINJA_SUIT_TRAIT "ninja-suit" -#define SLEEPING_CARP_TRAIT "sleeping_carp" -#define TIMESTOP_TRAIT "timestop" -#define LIFECANDLE_TRAIT "lifecandle" -#define VENTCRAWLING_TRAIT "ventcrawling" -#define SPECIES_FLIGHT_TRAIT "species-flight" -#define FROSTMINER_ENRAGE_TRAIT "frostminer-enrage" -#define NO_GRAVITY_TRAIT "no-gravity" -/// A trait gained from a mob's leap action, like the leaper -#define LEAPING_TRAIT "leaping" -/// A trait gained from a mob's vanish action, like the herophant -#define VANISHING_TRAIT "vanishing" -/// A trait gained from a mob's swoop action, like the ash drake -#define SWOOPING_TRAIT "swooping" -/// A trait gained from a mob's mimic ability, like the mimic -#define MIMIC_TRAIT "mimic" -#define SHRUNKEN_TRAIT "shrunken" -#define LEAPER_BUBBLE_TRAIT "leaper-bubble" -#define DNA_VAULT_TRAIT "dna_vault" -/// sticky nodrop sounds like a bad soundcloud rapper's name -#define STICKY_NODROP "sticky-nodrop" -#define SKILLCHIP_TRAIT "skillchip" -#define SKILL_TRAIT "skill" -#define BUSY_FLOORBOT_TRAIT "busy-floorbot" -#define PULLED_WHILE_SOFTCRIT_TRAIT "pulled-while-softcrit" -#define LOCKED_BORG_TRAIT "locked-borg" -/// trait associated to not having locomotion appendages nor the ability to fly or float -#define LACKING_LOCOMOTION_APPENDAGES_TRAIT "lacking-locomotion-appengades" -#define CRYO_TRAIT "cryo" -/// trait associated to not having fine manipulation appendages such as hands -#define LACKING_MANIPULATION_APPENDAGES_TRAIT "lacking-manipulation-appengades" -#define HANDCUFFED_TRAIT "handcuffed" -/// Trait granted by [/obj/item/warp_whistle] -#define WARPWHISTLE_TRAIT "warpwhistle" -///Turf trait for when a turf is transparent -#define TURF_Z_TRANSPARENT_TRAIT "turf_z_transparent" -/// Trait applied by [/datum/component/soulstoned] -#define SOULSTONE_TRAIT "soulstone" -/// Trait applied to slimes by low temperature -#define SLIME_COLD "slime-cold" -/// Trait applied to mobs by being tipped over -#define TIPPED_OVER "tipped-over" -/// Trait applied to PAIs by being folded -#define PAI_FOLDED "pai-folded" -/// Trait applied to brain mobs when they lack external aid for locomotion, such as being inside a mech. -#define BRAIN_UNAIDED "brain-unaided" -/// Trait applied to a mob when it gets a required "operational datum" (components/elements). Sends out the source as the type of the element. -#define TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM "element-required" -/// Trait applied by MODsuits. -#define MOD_TRAIT "mod" -/// Trait applied by element -#define ELEMENT_TRAIT(source) "element_trait_[source]" -/// Trait granted by the berserker hood. -#define BERSERK_TRAIT "berserk_trait" -/// Trait granted by [/obj/item/rod_of_asclepius] -#define HIPPOCRATIC_OATH_TRAIT "hippocratic_oath" -/// Trait granted by [/datum/status_effect/blooddrunk] -#define BLOODDRUNK_TRAIT "blooddrunk" -/// Trait granted by lipstick -#define LIPSTICK_TRAIT "lipstick_trait" -/// Self-explainatory. -#define BEAUTY_ELEMENT_TRAIT "beauty_element" -#define MOOD_DATUM_TRAIT "mood_datum" -#define DRONE_SHY_TRAIT "drone_shy" -/// Trait given by stabilized light pink extracts -#define STABILIZED_LIGHT_PINK_EXTRACT_TRAIT "stabilized_light_pink" -/// Trait given by adamantine extracts -#define ADAMANTINE_EXTRACT_TRAIT "adamantine_extract" -/// Given by the multiple_lives component to the previous body of the mob upon death. -#define EXPIRED_LIFE_TRAIT "expired_life" -/// Trait given to an atom/movable when they orbit something. -#define ORBITING_TRAIT "orbiting" -/// From the item_scaling element -#define ITEM_SCALING_TRAIT "item_scaling" -/// Trait given by choking -#define CHOKING_TRAIT "choking_trait" -/// Trait given by hallucinations -#define HALLUCINATION_TRAIT "hallucination_trait" -/// Trait given by simple/basic mob death -#define BASIC_MOB_DEATH_TRAIT "basic_mob_death" -/// Trait given by your current speed -#define SPEED_TRAIT "speed_trait" -/// Trait given to mobs that have been autopsied -#define AUTOPSY_TRAIT "autopsy_trait" -/// Trait given by [/datum/status_effect/blessing_of_insanity] -#define MAD_WIZARD_TRAIT "mad_wizard_trait" + /// Isn't attacked harmfully by blob structures #define TRAIT_BLOB_ALLY "blob_ally" -/** -* Trait granted by [/mob/living/carbon/Initialize] and -* granted/removed by [/obj/item/organ/internal/tongue] -* Used for ensuring that carbons without tongues cannot taste anything -* so it is added in Initialize, and then removed when a tongue is inserted -* and readded when a tongue is removed. -*/ -#define NO_TONGUE_TRAIT "no_tongue_trait" - -/// Trait granted by [/mob/living/silicon/robot] -/// Traits applied to a silicon mob by their model. -#define MODEL_TRAIT "model_trait" - -/// Trait granted by [mob/living/silicon/ai] -/// Applied when the ai anchors itself -#define AI_ANCHOR_TRAIT "ai_anchor" -/// Trait from [/datum/antagonist/nukeop/clownop] -#define CLOWNOP_TRAIT "clownop" - ///Traits given by station traits #define STATION_TRAIT_BANANIUM_SHIPMENTS "station_trait_bananium_shipments" -#define STATION_TRAIT_UNNATURAL_ATMOSPHERE "station_trait_unnatural_atmosphere" -#define STATION_TRAIT_UNIQUE_AI "station_trait_unique_ai" +#define STATION_TRAIT_BIGGER_PODS "station_trait_bigger_pods" +#define STATION_TRAIT_BIRTHDAY "station_trait_birthday" +#define STATION_TRAIT_BOTS_GLITCHED "station_trait_bot_glitch" #define STATION_TRAIT_CARP_INFESTATION "station_trait_carp_infestation" -#define STATION_TRAIT_PREMIUM_INTERNALS "station_trait_premium_internals" -#define STATION_TRAIT_LATE_ARRIVALS "station_trait_late_arrivals" -#define STATION_TRAIT_RANDOM_ARRIVALS "station_trait_random_arrivals" -#define STATION_TRAIT_HANGOVER "station_trait_hangover" -#define STATION_TRAIT_FILLED_MAINT "station_trait_filled_maint" +#define STATION_TRAIT_CYBERNETIC_REVOLUTION "station_trait_cybernetic_revolution" #define STATION_TRAIT_EMPTY_MAINT "station_trait_empty_maint" +#define STATION_TRAIT_FILLED_MAINT "station_trait_filled_maint" +#define STATION_TRAIT_FORESTED "station_trait_forested" +#define STATION_TRAIT_HANGOVER "station_trait_hangover" +#define STATION_TRAIT_LATE_ARRIVALS "station_trait_late_arrivals" +#define STATION_TRAIT_LOANER_SHUTTLE "station_trait_loaner_shuttle" +#define STATION_TRAIT_MEDBOT_MANIA "station_trait_medbot_mania" #define STATION_TRAIT_PDA_GLITCHED "station_trait_pda_glitched" -#define STATION_TRAIT_BOTS_GLITCHED "station_trait_bot_glitch" -#define STATION_TRAIT_CYBERNETIC_REVOLUTION "station_trait_cybernetic_revolution" -#define STATION_TRAIT_BIGGER_PODS "station_trait_bigger_pods" +#define STATION_TRAIT_PREMIUM_INTERNALS "station_trait_premium_internals" +#define STATION_TRAIT_RADIOACTIVE_NEBULA "station_trait_radioactive_nebula" +#define STATION_TRAIT_RANDOM_ARRIVALS "station_trait_random_arrivals" +#define STATION_TRAIT_REVOLUTIONARY_TRASHING "station_trait_revolutionary_trashing" +#define STATION_TRAIT_SHUTTLE_SALE "station_trait_shuttle_sale" #define STATION_TRAIT_SMALLER_PODS "station_trait_smaller_pods" -#define STATION_TRAIT_BIRTHDAY "station_trait_birthday" #define STATION_TRAIT_SPIDER_INFESTATION "station_trait_spider_infestation" -#define STATION_TRAIT_REVOLUTIONARY_TRASHING "station_trait_revolutionary_trashing" -#define STATION_TRAIT_RADIOACTIVE_NEBULA "station_trait_radioactive_nebula" -#define STATION_TRAIT_FORESTED "station_trait_forested" +#define STATION_TRAIT_UNIQUE_AI "station_trait_unique_ai" +#define STATION_TRAIT_UNNATURAL_ATMOSPHERE "station_trait_unnatural_atmosphere" #define STATION_TRAIT_VENDING_SHORTAGE "station_trait_vending_shortage" -#define STATION_TRAIT_MEDBOT_MANIA "station_trait_medbot_mania" -#define STATION_TRAIT_LOANER_SHUTTLE "station_trait_loaner_shuttle" -#define STATION_TRAIT_SHUTTLE_SALE "station_trait_shuttle_sale" -///From the market_crash event -#define MARKET_CRASH_EVENT_TRAIT "crashed_market_event" /// Denotes that this id card was given via the job outfit, aka the first ID this player got. #define TRAIT_JOB_FIRST_ID_CARD "job_first_id_card" @@ -1236,15 +881,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// things with this trait are treated as having no access in /obj/proc/check_access(obj/item) #define TRAIT_ALWAYS_NO_ACCESS "alwaysnoaccess" -/// Traits granted to items due to their chameleon properties. -#define CHAMELEON_ITEM_TRAIT "chameleon_item_trait" - /// This human wants to see the color of their glasses, for some reason #define TRAIT_SEE_GLASS_COLORS "see_glass_colors" -/// this mob is under the effects of the power chord -#define TRAIT_POWER_CHORD "power_chord" - // Radiation defines /// Marks that this object is irradiated @@ -1300,33 +939,11 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// the object has a label applied #define TRAIT_HAS_LABEL "labeled" -///coming from a fish trait datum. -#define FISH_TRAIT_DATUM "fish_trait_datum" -///coming from a fish evolution datum -#define FISH_EVOLUTION "fish_evolution" - -/// some trait sorces dirived from bodyparts BODYPART_TRAIT is generic. -#define BODYPART_TRAIT "bodypart" -#define HEAD_TRAIT "head" -#define CHEST_TRAIT "chest" -#define RIGHT_ARM_TRAIT "right_arm" -#define LEFT_ARM_TRAIT "left_arm" -#define RIGHT_LEG_TRAIT "right_leg" -#define LEFT_LEG_TRAIT "left_leg" - -/// Trait given by echolocation component. -#define ECHOLOCATION_TRAIT "echolocation" - ///without a human having this trait, they speak as if they have no tongue. #define TRAIT_SPEAKS_CLEARLY "speaks_clearly" // specific sources for TRAIT_SPEAKS_CLEARLY -///trait source that tongues should use -#define SPEAKING_FROM_TONGUE "tongue" -///trait source that sign language should use -#define SPEAKING_FROM_HANDS "hands" - ///Trait given by /datum/component/germ_sensitive #define TRAIT_GERM_SENSITIVE "germ_sensitive" @@ -1355,3 +972,5 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_MOB_BREEDER "mob_breeder" /// Trait given to mobs that we do not want to mindswap #define TRAIT_NO_MINDSWAP "no_mindswap" + +// END TRAIT DEFINES diff --git a/code/__DEFINES/traits/macros.dm b/code/__DEFINES/traits/macros.dm new file mode 100644 index 00000000000..bbb5bf0d641 --- /dev/null +++ b/code/__DEFINES/traits/macros.dm @@ -0,0 +1,11 @@ +// This file contains all of the "dynamic" trait sources that can be used in a number of versatile and everchanging ways. +// If it uses psuedo-variables like the examples below, it's a macro-trait. + +/// The item is magically cursed +#define CURSED_ITEM_TRAIT(item_type) "cursed_item_[item_type]" +/// A trait given by a specific status effect (not sure why we need both but whatever!) +#define TRAIT_STATUS_EFFECT(effect_id) "[effect_id]-trait" +/// Trait given by mech equipment +#define TRAIT_MECH_EQUIPMENT(equipment_type) "mech_equipment_[equipment_type]" +/// Trait applied by element +#define ELEMENT_TRAIT(source) "element_trait_[source]" diff --git a/code/__DEFINES/traits/sources.dm b/code/__DEFINES/traits/sources.dm new file mode 100644 index 00000000000..3ba0008acb2 --- /dev/null +++ b/code/__DEFINES/traits/sources.dm @@ -0,0 +1,272 @@ +// This file contains all of the trait sources, or all of the things that grant traits. +// Several things such as `type` or `REF(src)` may be used in the ADD_TRAIT() macro as the "source", but this file contains all of the defines for immutable static strings. + +// common trait sources +#define TRAIT_GENERIC "generic" +#define UNCONSCIOUS_TRAIT "unconscious" +#define EYE_DAMAGE "eye_damage" +#define EAR_DAMAGE "ear_damage" +#define GENETIC_MUTATION "genetic" +#define OBESITY "obesity" +#define MAGIC_TRAIT "magic" +#define TRAUMA_TRAIT "trauma" +#define FLIGHTPOTION_TRAIT "flightpotion" +/// Trait inherited by experimental surgeries +#define EXPERIMENTAL_SURGERY_TRAIT "experimental_surgery" +#define DISEASE_TRAIT "disease" +#define SPECIES_TRAIT "species" +#define ORGAN_TRAIT "organ" +/// Trait given by augmented limbs +#define AUGMENTATION_TRAIT "augments" +/// Trait given by organ gained via abductor surgery +#define ABDUCTOR_GLAND_TRAIT "abductor_gland" +/// cannot be removed without admin intervention +#define ROUNDSTART_TRAIT "roundstart" +#define JOB_TRAIT "job" +#define CYBORG_ITEM_TRAIT "cyborg-item" +/// Any traits granted by quirks. +#define QUIRK_TRAIT "quirk_trait" +/// (B)admins only. +#define ADMIN_TRAIT "admin" +/// Any traits given through a smite. +#define SMITE_TRAIT "smite" +#define CHANGELING_TRAIT "changeling" +#define CULT_TRAIT "cult" +#define LICH_TRAIT "lich" + +#define ABSTRACT_ITEM_TRAIT "abstract-item" +/// A trait given by any status effect +#define STATUS_EFFECT_TRAIT "status-effect" + +/// Trait from light debugging +#define LIGHT_DEBUG_TRAIT "light-debug" + +#define CLOTHING_TRAIT "clothing" +#define HELMET_TRAIT "helmet" +/// inherited from the mask +#define MASK_TRAIT "mask" +/// inherited from your sweet kicks +#define SHOES_TRAIT "shoes" +/// Trait inherited by implants +#define IMPLANT_TRAIT "implant" +#define GLASSES_TRAIT "glasses" +/// inherited from riding vehicles +#define VEHICLE_TRAIT "vehicle" +#define INNATE_TRAIT "innate" +#define CRIT_HEALTH_TRAIT "crit_health" +#define OXYLOSS_TRAIT "oxyloss" +/// Trait sorce for "was recently shocked by something" +#define WAS_SHOCKED "was_shocked" +#define TURF_TRAIT "turf" +/// trait associated to being buckled +#define BUCKLED_TRAIT "buckled" +/// trait associated to being held in a chokehold +#define CHOKEHOLD_TRAIT "chokehold" +/// trait associated to resting +#define RESTING_TRAIT "resting" +/// trait associated to a stat value or range of +#define STAT_TRAIT "stat" +#define STATION_TRAIT "station-trait" +/// obtained from mapping helper +#define MAPPING_HELPER_TRAIT "mapping-helper" +/// Trait associated to wearing a suit +#define SUIT_TRAIT "suit" +/// Trait associated to lying down (having a [lying_angle] of a different value than zero). +#define LYING_DOWN_TRAIT "lying-down" +/// A trait gained by leaning against a wall +#define LEANING_TRAIT "leaning" +/// Trait associated to lacking electrical power. +#define POWER_LACK_TRAIT "power-lack" +/// Trait associated to lacking motor movement +#define MOTOR_LACK_TRAIT "motor-lack" +/// Trait associated with mafia +#define MAFIA_TRAIT "mafia" +/// Trait associated with ctf +#define CTF_TRAIT "ctf" +/// Trait associated with highlander +#define HIGHLANDER_TRAIT "highlander" +/// Trait given from playing pretend with baguettes +#define SWORDPLAY_TRAIT "swordplay" +/// Trait given by being recruited as a nuclear operative +#define NUKE_OP_MINION_TRAIT "nuke-op-minion" + +/// Trait given to you by shapeshifting +#define SHAPESHIFT_TRAIT "shapeshift_trait" + +// unique trait sources, still defines +#define EMP_TRAIT "emp_trait" +#define STATUE_MUTE "statue" +#define CHANGELING_DRAIN "drain" + +#define STASIS_MUTE "stasis" +#define GENETICS_SPELL "genetics_spell" +#define EYES_COVERED "eyes_covered" +#define NO_EYES "no_eyes" +#define HYPNOCHAIR_TRAIT "hypnochair" +#define FLASHLIGHT_EYES "flashlight_eyes" +#define IMPURE_OCULINE "impure_oculine" +#define HAUNTIUM_REAGENT_TRAIT "hauntium_reagent_trait" +#define TRAIT_SANTA "santa" +#define SCRYING_ORB "scrying-orb" +#define ABDUCTOR_ANTAGONIST "abductor-antagonist" +#define JUNGLE_FEVER_TRAIT "jungle_fever" +#define MEGAFAUNA_TRAIT "megafauna" +#define CLOWN_NUKE_TRAIT "clown-nuke" +#define STICKY_MOUSTACHE_TRAIT "sticky-moustache" +#define CHAINSAW_FRENZY_TRAIT "chainsaw-frenzy" +#define CHRONO_GUN_TRAIT "chrono-gun" +#define REVERSE_BEAR_TRAP_TRAIT "reverse-bear-trap" +#define CURSED_MASK_TRAIT "cursed-mask" +#define HIS_GRACE_TRAIT "his-grace" +#define HAND_REPLACEMENT_TRAIT "magic-hand" +#define HOT_POTATO_TRAIT "hot-potato" +#define SABRE_SUICIDE_TRAIT "sabre-suicide" +#define ABDUCTOR_VEST_TRAIT "abductor-vest" +#define CAPTURE_THE_FLAG_TRAIT "capture-the-flag" +#define BASKETBALL_MINIGAME_TRAIT "basketball-minigame" +#define EYE_OF_GOD_TRAIT "eye-of-god" +#define SHAMEBRERO_TRAIT "shamebrero" +#define CHRONOSUIT_TRAIT "chronosuit" +#define LOCKED_HELMET_TRAIT "locked-helmet" +#define NINJA_SUIT_TRAIT "ninja-suit" +#define SLEEPING_CARP_TRAIT "sleeping_carp" +#define TIMESTOP_TRAIT "timestop" +#define LIFECANDLE_TRAIT "lifecandle" +#define VENTCRAWLING_TRAIT "ventcrawling" +#define SPECIES_FLIGHT_TRAIT "species-flight" +#define FROSTMINER_ENRAGE_TRAIT "frostminer-enrage" +#define NO_GRAVITY_TRAIT "no-gravity" + +/// A trait gained from a mob's leap action, like the leaper +#define LEAPING_TRAIT "leaping" +/// A trait gained from a mob's vanish action, like the herophant +#define VANISHING_TRAIT "vanishing" +/// A trait gained from a mob's swoop action, like the ash drake +#define SWOOPING_TRAIT "swooping" +/// A trait gained from a mob's mimic ability, like the mimic +#define MIMIC_TRAIT "mimic" +#define SHRUNKEN_TRAIT "shrunken" +#define LEAPER_BUBBLE_TRAIT "leaper-bubble" +#define DNA_VAULT_TRAIT "dna_vault" +/// sticky nodrop sounds like a bad soundcloud rapper's name +#define STICKY_NODROP "sticky-nodrop" +#define SKILLCHIP_TRAIT "skillchip" +#define SKILL_TRAIT "skill" +#define BUSY_FLOORBOT_TRAIT "busy-floorbot" +#define PULLED_WHILE_SOFTCRIT_TRAIT "pulled-while-softcrit" +#define LOCKED_BORG_TRAIT "locked-borg" +/// trait associated to not having locomotion appendages nor the ability to fly or float +#define LACKING_LOCOMOTION_APPENDAGES_TRAIT "lacking-locomotion-appengades" +#define CRYO_TRAIT "cryo" +/// trait associated to not having fine manipulation appendages such as hands +#define LACKING_MANIPULATION_APPENDAGES_TRAIT "lacking-manipulation-appengades" +#define HANDCUFFED_TRAIT "handcuffed" +/// Trait granted by [/obj/item/warp_whistle] +#define WARPWHISTLE_TRAIT "warpwhistle" +///Turf trait for when a turf is transparent +#define TURF_Z_TRANSPARENT_TRAIT "turf_z_transparent" +/// Trait applied by [/datum/component/soulstoned] +#define SOULSTONE_TRAIT "soulstone" +/// Trait applied to slimes by low temperature +#define SLIME_COLD "slime-cold" +/// Trait applied to mobs by being tipped over +#define TIPPED_OVER "tipped-over" +/// Trait applied to PAIs by being folded +#define PAI_FOLDED "pai-folded" +/// Trait applied to brain mobs when they lack external aid for locomotion, such as being inside a mech. +#define BRAIN_UNAIDED "brain-unaided" +/// Trait applied to a mob when it gets a required "operational datum" (components/elements). Sends out the source as the type of the element. +#define TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM "element-required" +/// Trait applied by MODsuits. +#define MOD_TRAIT "mod" + +/// Trait granted by the berserker hood. +#define BERSERK_TRAIT "berserk_trait" +/// Trait granted by [/obj/item/rod_of_asclepius] +#define HIPPOCRATIC_OATH_TRAIT "hippocratic_oath" +/// Trait granted by [/datum/status_effect/blooddrunk] +#define BLOODDRUNK_TRAIT "blooddrunk" +/// Trait granted by lipstick +#define LIPSTICK_TRAIT "lipstick_trait" +/// Self-explainatory. +#define BEAUTY_ELEMENT_TRAIT "beauty_element" +#define MOOD_DATUM_TRAIT "mood_datum" +#define DRONE_SHY_TRAIT "drone_shy" +/// Trait given by stabilized light pink extracts +#define STABILIZED_LIGHT_PINK_EXTRACT_TRAIT "stabilized_light_pink" +/// Trait given by adamantine extracts +#define ADAMANTINE_EXTRACT_TRAIT "adamantine_extract" +/// Given by the multiple_lives component to the previous body of the mob upon death. +#define EXPIRED_LIFE_TRAIT "expired_life" +/// Trait given to an atom/movable when they orbit something. +#define ORBITING_TRAIT "orbiting" +/// From the item_scaling element +#define ITEM_SCALING_TRAIT "item_scaling" +/// Trait given by choking +#define CHOKING_TRAIT "choking_trait" +/// Trait given by hallucinations +#define HALLUCINATION_TRAIT "hallucination_trait" +/// Trait given by simple/basic mob death +#define BASIC_MOB_DEATH_TRAIT "basic_mob_death" +/// Trait given by your current speed +#define SPEED_TRAIT "speed_trait" +/// Trait given to mobs that have been autopsied +#define AUTOPSY_TRAIT "autopsy_trait" +/// Trait given by [/datum/status_effect/blessing_of_insanity] +#define MAD_WIZARD_TRAIT "mad_wizard_trait" + +///From the market_crash event +#define MARKET_CRASH_EVENT_TRAIT "crashed_market_event" + +/// Traits granted to items due to their chameleon properties. +#define CHAMELEON_ITEM_TRAIT "chameleon_item_trait" + +// some trait sources dirived from bodyparts - BODYPART_TRAIT is generic. +#define BODYPART_TRAIT "bodypart" +#define HEAD_TRAIT "head" +#define CHEST_TRAIT "chest" +#define RIGHT_ARM_TRAIT "right_arm" +#define LEFT_ARM_TRAIT "left_arm" +#define RIGHT_LEG_TRAIT "right_leg" +#define LEFT_LEG_TRAIT "left_leg" + +///coming from a fish trait datum. +#define FISH_TRAIT_DATUM "fish_trait_datum" +///coming from a fish evolution datum +#define FISH_EVOLUTION "fish_evolution" + +/// Trait given by echolocation component. +#define ECHOLOCATION_TRAIT "echolocation" + +///trait source that tongues should use +#define SPEAKING_FROM_TONGUE "tongue" +///trait source that sign language should use +#define SPEAKING_FROM_HANDS "hands" + +/// Sources for TRAIT_IGNORING_GRAVITY +#define IGNORING_GRAVITY_NEGATION "ignoring_gravity_negation" + +/// Hearing trait that is from the hearing component +#define CIRCUIT_HEAR_TRAIT "circuit_hear" + +/** +* Trait granted by [/mob/living/carbon/Initialize] and +* granted/removed by [/obj/item/organ/internal/tongue] +* Used for ensuring that carbons without tongues cannot taste anything +* so it is added in Initialize, and then removed when a tongue is inserted +* and readded when a tongue is removed. +*/ +#define NO_TONGUE_TRAIT "no_tongue_trait" + +/// Trait granted by [/mob/living/silicon/robot] +/// Traits applied to a silicon mob by their model. +#define MODEL_TRAIT "model_trait" + +/// Trait granted by [mob/living/silicon/ai] +/// Applied when the ai anchors itself +#define AI_ANCHOR_TRAIT "ai_anchor" + +/// Trait from [/datum/antagonist/nukeop/clownop] +#define CLOWNOP_TRAIT "clownop" + +#define ANALYZER_TRAIT "analyzer_trait" diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm new file mode 100644 index 00000000000..c373be5b149 --- /dev/null +++ b/code/_globalvars/traits/_traits.dm @@ -0,0 +1,589 @@ +// This file should contain every single global trait in the game in a type-based list, as well as any additional trait-related information that's useful to have on a global basis. +// This file is used in linting, so make sure to add everything alphabetically and what-not. +// Do consider adding your trait entry to the similar list in `admin_tooling.dm` if you want it to be accessible to admins (which is probably the case for 75% of traits). + +// Please do note that there is absolutely no bearing on what traits are added to what subtype of `/datum`, this is just an easily referenceable list sorted by type. +// The only thing that truly matters about traits is the code that is built to handle the traits, and where that code is located. Nothing else. + +GLOBAL_LIST_INIT(traits_by_type, list( + /atom = list( + "TRAIT_AI_PAUSED" = TRAIT_AI_PAUSED, + "TRAIT_BANNED_FROM_CARGO_SHUTTLE" = TRAIT_BANNED_FROM_CARGO_SHUTTLE, + "TRAIT_BEING_SHOCKED" = TRAIT_BEING_SHOCKED, + "TRAIT_CLIMBABLE" = TRAIT_CLIMBABLE, + "TRAIT_CURRENTLY_CLEANING" = TRAIT_CURRENTLY_CLEANING, + "TRAIT_CUSTOMIZABLE_REAGENT_HOLDER" = TRAIT_CUSTOMIZABLE_REAGENT_HOLDER, + "TRAIT_DO_NOT_SPLASH" = TRAIT_DO_NOT_SPLASH, + "TRAIT_DRIED" = TRAIT_DRIED, + "TRAIT_DRYABLE" = TRAIT_DRYABLE, + "TRAIT_FOOD_CHEF_MADE" = TRAIT_FOOD_CHEF_MADE, + "TRAIT_FOOD_FRIED" = TRAIT_FOOD_FRIED, + "TRAIT_FOOD_GRILLED" = TRAIT_FOOD_GRILLED, + "TRAIT_FOOD_SILVER" = TRAIT_FOOD_SILVER, + "TRAIT_KEEP_TOGETHER" = TRAIT_KEEP_TOGETHER,TRAIT_CUSTOMIZABLE_REAGENT_HOLDER, + "TRAIT_LIGHTING_DEBUGGED" = TRAIT_LIGHTING_DEBUGGED, + "TRAIT_MAT_TRANSMUTED" = TRAIT_MAT_TRANSMUTED, + "TRAIT_RECENTLY_COINED" = TRAIT_RECENTLY_COINED, + "TRAIT_RUSTY" = TRAIT_RUSTY, + "TRAIT_STICKERED" = TRAIT_STICKERED, + ), + /atom/movable = list( + "TRAIT_ACTIVE_STORAGE" = TRAIT_ACTIVE_STORAGE, + "TRAIT_AREA_SENSITIVE" = TRAIT_AREA_SENSITIVE, + "TRAIT_ASHSTORM_IMMUNE" = TRAIT_ASHSTORM_IMMUNE, + "TRAIT_BLOCKING_EXPLOSIVES" = TRAIT_BLOCKING_EXPLOSIVES, + "TRAIT_CASTABLE_LOC" = TRAIT_CASTABLE_LOC, + "TRAIT_DEL_ON_SPACE_DUMP" = TRAIT_DEL_ON_SPACE_DUMP, + "TRAIT_FISH_CASE_COMPATIBILE" = TRAIT_FISH_CASE_COMPATIBILE, + "TRAIT_FISH_SAFE_STORAGE" = TRAIT_FISH_SAFE_STORAGE, + "TRAIT_FROZEN" = TRAIT_FROZEN, + "TRAIT_HAS_LABEL" = TRAIT_HAS_LABEL, + "TRAIT_HEARING_SENSITIVE" = TRAIT_HEARING_SENSITIVE, + "TRAIT_HYPERSPACED" = TRAIT_HYPERSPACED, + "TRAIT_IMMERSED" = TRAIT_IMMERSED, + "TRAIT_IRRADIATED" = TRAIT_IRRADIATED, + "TRAIT_LAVA_IMMUNE" = TRAIT_LAVA_IMMUNE, + "TRAIT_MOVE_FLOATING" = TRAIT_MOVE_FLOATING, + "TRAIT_MOVE_FLYING" = TRAIT_MOVE_FLYING, + "TRAIT_MOVE_GROUND" = TRAIT_MOVE_GROUND, + "TRAIT_MOVE_PHASING" = TRAIT_MOVE_PHASING, + "TRAIT_MOVE_VENTCRAWLING" = TRAIT_MOVE_VENTCRAWLING, + "TRAIT_NO_FLOATING_ANIM" = TRAIT_NO_FLOATING_ANIM, + "TRAIT_NO_MANIFEST_CONTENTS_ERROR" = TRAIT_NO_MANIFEST_CONTENTS_ERROR, + "TRAIT_NO_MISSING_ITEM_ERROR" = TRAIT_NO_MISSING_ITEM_ERROR, + "TRAIT_NOT_ENGRAVABLE" = TRAIT_NOT_ENGRAVABLE, + "TRAIT_ODD_CUSTOMIZABLE_FOOD_INGREDIENT" = TRAIT_ODD_CUSTOMIZABLE_FOOD_INGREDIENT, + "TRAIT_RUNECHAT_HIDDEN" = TRAIT_RUNECHAT_HIDDEN, + "TRAIT_SECLUDED_LOCATION" = TRAIT_SECLUDED_LOCATION, + "TRAIT_SNOWSTORM_IMMUNE" = TRAIT_SNOWSTORM_IMMUNE, + "TRAIT_TELEKINESIS_CONTROLLED" = TRAIT_TELEKINESIS_CONTROLLED, + "TRAIT_UNDERFLOOR" = TRAIT_UNDERFLOOR, + "TRAIT_UNIQUE_IMMERSE" = TRAIT_UNIQUE_IMMERSE, + "TRAIT_VOIDSTORM_IMMUNE" = TRAIT_VOIDSTORM_IMMUNE, + "TRAIT_WEATHER_IMMUNE" = TRAIT_WEATHER_IMMUNE, + ), + /datum/controller/subsystem/economy = list( + "TRAIT_MARKET_CRASHING" = TRAIT_MARKET_CRASHING, + ), + // AKA SSstation + /datum/controller/subsystem/processing/station = list( + "STATION_TRAIT_BANANIUM_SHIPMENTS" = STATION_TRAIT_BANANIUM_SHIPMENTS, + "STATION_TRAIT_BIGGER_PODS" = STATION_TRAIT_BIGGER_PODS, + "STATION_TRAIT_BIRTHDAY" = STATION_TRAIT_BIRTHDAY, + "STATION_TRAIT_BOTS_GLITCHED" = STATION_TRAIT_BOTS_GLITCHED, + "STATION_TRAIT_CARP_INFESTATION" = STATION_TRAIT_CARP_INFESTATION, + "STATION_TRAIT_CYBERNETIC_REVOLUTION" = STATION_TRAIT_CYBERNETIC_REVOLUTION, + "STATION_TRAIT_EMPTY_MAINT" = STATION_TRAIT_EMPTY_MAINT, + "STATION_TRAIT_FILLED_MAINT" = STATION_TRAIT_FILLED_MAINT, + "STATION_TRAIT_FORESTED" = STATION_TRAIT_FORESTED, + "STATION_TRAIT_HANGOVER" = STATION_TRAIT_HANGOVER, + "STATION_TRAIT_LATE_ARRIVALS" = STATION_TRAIT_LATE_ARRIVALS, + "STATION_TRAIT_LOANER_SHUTTLE" = STATION_TRAIT_LOANER_SHUTTLE, + "STATION_TRAIT_MEDBOT_MANIA" = STATION_TRAIT_MEDBOT_MANIA, + "STATION_TRAIT_PDA_GLITCHED" = STATION_TRAIT_PDA_GLITCHED, + "STATION_TRAIT_PREMIUM_INTERNALS" = STATION_TRAIT_PREMIUM_INTERNALS, + "STATION_TRAIT_RADIOACTIVE_NEBULA" = STATION_TRAIT_RADIOACTIVE_NEBULA, + "STATION_TRAIT_RANDOM_ARRIVALS" = STATION_TRAIT_RANDOM_ARRIVALS, + "STATION_TRAIT_REVOLUTIONARY_TRASHING" = STATION_TRAIT_REVOLUTIONARY_TRASHING, + "STATION_TRAIT_SHUTTLE_SALE" = STATION_TRAIT_SHUTTLE_SALE, + "STATION_TRAIT_SMALLER_PODS" = STATION_TRAIT_SMALLER_PODS, + "STATION_TRAIT_SPIDER_INFESTATION" = STATION_TRAIT_SPIDER_INFESTATION, + "STATION_TRAIT_UNIQUE_AI" = STATION_TRAIT_UNIQUE_AI, + "STATION_TRAIT_UNNATURAL_ATMOSPHERE" = STATION_TRAIT_UNNATURAL_ATMOSPHERE, + "STATION_TRAIT_VENDING_SHORTAGE" = STATION_TRAIT_VENDING_SHORTAGE, + ), + /datum/wound = list( + "TRAIT_WOUND_SCANNED" = TRAIT_WOUND_SCANNED, + ), + /mob = list( + "TRAIT_ABDUCTOR_SCIENTIST_TRAINING" = TRAIT_ABDUCTOR_SCIENTIST_TRAINING, + "TRAIT_ABDUCTOR_TRAINING" = TRAIT_ABDUCTOR_TRAINING, + "TRAIT_ADAMANTINE_EXTRACT_ARMOR" = TRAIT_ADAMANTINE_EXTRACT_ARMOR, + "TRAIT_ADVANCEDTOOLUSER" = TRAIT_ADVANCEDTOOLUSER, + "TRAIT_AGENDER" = TRAIT_AGENDER, + "TRAIT_AGEUSIA" = TRAIT_AGEUSIA, + "TRAIT_AI_BAGATTACK" = TRAIT_AI_BAGATTACK, + "TRAIT_AIRLOCK_SHOCKIMMUNE" = TRAIT_AIRLOCK_SHOCKIMMUNE, + "TRAIT_ALCOHOL_TOLERANCE" = TRAIT_ALCOHOL_TOLERANCE, + "TRAIT_ALLOW_HERETIC_CASTING" = TRAIT_ALLOW_HERETIC_CASTING, + "TRAIT_ALLOWED_HONORBOUND_ATTACK" = TRAIT_ALLOWED_HONORBOUND_ATTACK, + "TRAIT_ALWAYS_NO_ACCESS" = TRAIT_ALWAYS_NO_ACCESS, + "TRAIT_ANGELIC" = TRAIT_ANGELIC, + "TRAIT_ANTENNAE" = TRAIT_ANTENNAE, + "TRAIT_ANTICONVULSANT" = TRAIT_ANTICONVULSANT, + "TRAIT_ANTIMAGIC_NO_SELFBLOCK" = TRAIT_ANTIMAGIC_NO_SELFBLOCK, + "TRAIT_ANTIMAGIC" = TRAIT_ANTIMAGIC, + "TRAIT_ANXIOUS" = TRAIT_ANXIOUS, + "TRAIT_BADDNA" = TRAIT_BADDNA, + "TRAIT_BADTOUCH" = TRAIT_BADTOUCH, + "TRAIT_BALD" = TRAIT_BALD, + "TRAIT_BATON_RESISTANCE" = TRAIT_BATON_RESISTANCE, + "TRAIT_BEING_BLADE_SHIELDED" = TRAIT_BEING_BLADE_SHIELDED, + "TRAIT_BLOB_ALLY" = TRAIT_BLOB_ALLY, + "TRAIT_BLOOD_CLANS" = TRAIT_BLOOD_CLANS, + "TRAIT_BLOOD_DEFICIENCY" = TRAIT_BLOOD_DEFICIENCY, + "TRAIT_BLOODSHOT_EYES" = TRAIT_BLOODSHOT_EYES, + "TRAIT_BLOODY_MESS" = TRAIT_BLOODY_MESS, + "TRAIT_BOMBIMMUNE" = TRAIT_BOMBIMMUNE, + "TRAIT_BONSAI" = TRAIT_BONSAI, + "TRAIT_BOOZE_SLIDER" = TRAIT_BOOZE_SLIDER, + "TRAIT_BRAINWASHING" = TRAIT_BRAINWASHING, + "TRAIT_BYPASS_EARLY_IRRADIATED_CHECK" = TRAIT_BYPASS_EARLY_IRRADIATED_CHECK, + "TRAIT_BYPASS_MEASURES" = TRAIT_BYPASS_MEASURES, + "TRAIT_CAN_HOLD_ITEMS" = TRAIT_CAN_HOLD_ITEMS, + "TRAIT_CAN_SIGN_ON_COMMS" = TRAIT_CAN_SIGN_ON_COMMS, + "TRAIT_CAN_STRIP" = TRAIT_CAN_STRIP, + "TRAIT_CAN_USE_NUKE" = TRAIT_CAN_USE_NUKE, + "TRAIT_CANNOT_BE_UNBUCKLED" = TRAIT_CANNOT_BE_UNBUCKLED, + "TRAIT_CANNOT_CRYSTALIZE" = TRAIT_CANNOT_CRYSTALIZE, + "TRAIT_CANNOT_OPEN_PRESENTS" = TRAIT_CANNOT_OPEN_PRESENTS, + "TRAIT_CANT_RIDE" = TRAIT_CANT_RIDE, + "TRAIT_CHANGELING_HIVEMIND_MUTE" = TRAIT_CHANGELING_HIVEMIND_MUTE, + "TRAIT_CHASM_DESTROYED" = TRAIT_CHASM_DESTROYED, + "TRAIT_CHEF_KISS" = TRAIT_CHEF_KISS, + "TRAIT_CHUNKYFINGERS_IGNORE_BATON" = TRAIT_CHUNKYFINGERS_IGNORE_BATON, + "TRAIT_CHUNKYFINGERS" = TRAIT_CHUNKYFINGERS, + "TRAIT_CLIFF_WALKER" = TRAIT_CLIFF_WALKER, + "TRAIT_CLOWN_ENJOYER" = TRAIT_CLOWN_ENJOYER, + "TRAIT_CLUMSY" = TRAIT_CLUMSY, + "TRAIT_COAGULATING" = TRAIT_COAGULATING, + "TRAIT_CORPSELOCKED" = TRAIT_CORPSELOCKED, + "TRAIT_CRITICAL_CONDITION" = TRAIT_CRITICAL_CONDITION, + "TRAIT_CULT_HALO" = TRAIT_CULT_HALO, + "TRAIT_CURSED" = TRAIT_CURSED, + "TRAIT_DEAF" = TRAIT_DEAF, + "TRAIT_DEATHCOMA" = TRAIT_DEATHCOMA, + "TRAIT_DEFIB_BLACKLISTED" = TRAIT_DEFIB_BLACKLISTED, + "TRAIT_DEPRESSION" = TRAIT_DEPRESSION, + "TRAIT_DETECT_STORM" = TRAIT_DETECT_STORM, + "TRAIT_DIAGNOSTIC_HUD" = TRAIT_DIAGNOSTIC_HUD, + "TRAIT_DISCOORDINATED_TOOL_USER" = TRAIT_DISCOORDINATED_TOOL_USER, + "TRAIT_DISEASELIKE_SEVERITY_MEDIUM" = TRAIT_DISEASELIKE_SEVERITY_MEDIUM, + "TRAIT_DISFIGURED" = TRAIT_DISFIGURED, + "TRAIT_DISGUISED" = TRAIT_DISGUISED, + "TRAIT_DISK_VERIFIER" = TRAIT_DISK_VERIFIER, + "TRAIT_DISSECTED" = TRAIT_DISSECTED, + "TRAIT_DONT_WRITE_MEMORY" = TRAIT_DONT_WRITE_MEMORY, + "TRAIT_DOUBLE_TAP" = TRAIT_DOUBLE_TAP, + "TRAIT_DRINKS_BLOOD" = TRAIT_DRINKS_BLOOD, + "TRAIT_DUMB" = TRAIT_DUMB, + "TRAIT_DWARF" = TRAIT_DWARF, + "TRAIT_EASILY_WOUNDED" = TRAIT_EASILY_WOUNDED, + "TRAIT_EASYDISMEMBER" = TRAIT_EASYDISMEMBER, + "TRAIT_ECHOLOCATION_EXTRA_RANGE" = TRAIT_ECHOLOCATION_EXTRA_RANGE, + "TRAIT_ECHOLOCATION_RECEIVER" = TRAIT_ECHOLOCATION_RECEIVER, + "TRAIT_ELITE_CHALLENGER" = TRAIT_ELITE_CHALLENGER, + "TRAIT_EMOTEMUTE " = TRAIT_EMOTEMUTE, + "TRAIT_EMOTEMUTE" = TRAIT_EMOTEMUTE, + "TRAIT_EMPATH" = TRAIT_EMPATH, + "TRAIT_ENTRAILS_READER" = TRAIT_ENTRAILS_READER, + "TRAIT_EXPANDED_FOV" = TRAIT_EXPANDED_FOV, + "TRAIT_EXTROVERT" = TRAIT_EXTROVERT, + "TRAIT_FAKEDEATH" = TRAIT_FAKEDEATH, + "TRAIT_FASTMED" = TRAIT_FASTMED, + "TRAIT_FAT" = TRAIT_FAT, + "TRAIT_FEARLESS" = TRAIT_FEARLESS, + "TRAIT_FENCE_CLIMBER" = TRAIT_FENCE_CLIMBER, + "TRAIT_FINGERPRINT_PASSTHROUGH" = TRAIT_FINGERPRINT_PASSTHROUGH, + "TRAIT_FIST_MINING" = TRAIT_FIST_MINING, + "TRAIT_FIXED_HAIRCOLOR" = TRAIT_FIXED_HAIRCOLOR, + "TRAIT_FIXED_MUTANT_COLORS" = TRAIT_FIXED_MUTANT_COLORS, + "TRAIT_FLOORED" = TRAIT_FLOORED, + "TRAIT_FORBID_MINING_SHUTTLE_CONSOLE_OUTSIDE_STATION" = TRAIT_FORBID_MINING_SHUTTLE_CONSOLE_OUTSIDE_STATION, + "TRAIT_FORCED_GRAVITY" = TRAIT_FORCED_GRAVITY, + "TRAIT_FORCED_STANDING" = TRAIT_FORCED_STANDING, + "TRAIT_FREE_FLOAT_MOVEMENT" = TRAIT_FREE_FLOAT_MOVEMENT, + "TRAIT_FREE_HYPERSPACE_MOVEMENT" = TRAIT_FREE_HYPERSPACE_MOVEMENT, + "TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT" = TRAIT_FREE_HYPERSPACE_SOFTCORDON_MOVEMENT, + "TRAIT_FREERUNNING" = TRAIT_FREERUNNING, + "TRAIT_FRIENDLY" = TRAIT_FRIENDLY, + "TRAIT_FUGU_GLANDED" = TRAIT_FUGU_GLANDED, + "TRAIT_GAMER" = TRAIT_GAMER, + "TRAIT_GAMERGOD" = TRAIT_GAMERGOD, + "TRAIT_GARLIC_BREATH" = TRAIT_GARLIC_BREATH, + "TRAIT_GENELESS" = TRAIT_GENELESS, + "TRAIT_GIANT" = TRAIT_GIANT, + "TRAIT_GIFTED" = TRAIT_GIFTED, // SKYRAT EDIT ADDITION + "TRAIT_GONE_FISHING" = TRAIT_GONE_FISHING, + "TRAIT_GOOD_HEARING" = TRAIT_GOOD_HEARING, + "TRAIT_GRABWEAKNESS" = TRAIT_GRABWEAKNESS, + "TRAIT_GREENTEXT_CURSED" = TRAIT_GREENTEXT_CURSED, + "TRAIT_GUN_NATURAL" = TRAIT_GUN_NATURAL, + "TRAIT_GUNFLIP" = TRAIT_GUNFLIP, + "TRAIT_HALT_RADIATION_EFFECTS" = TRAIT_HALT_RADIATION_EFFECTS, + "TRAIT_HANDS_BLOCKED" = TRAIT_HANDS_BLOCKED, + "TRAIT_HARDLY_WOUNDED" = TRAIT_HARDLY_WOUNDED, + "TRAIT_HAS_BEEN_KIDNAPPED" = TRAIT_HAS_BEEN_KIDNAPPED, + "TRAIT_HAS_MARKINGS" = TRAIT_HAS_MARKINGS, + "TRAIT_HATED_BY_DOGS" = TRAIT_HATED_BY_DOGS, + "TRAIT_HEALS_FROM_CARP_RIFTS" = TRAIT_HEALS_FROM_CARP_RIFTS, + "TRAIT_HEALS_FROM_CULT_PYLONS" = TRAIT_HEALS_FROM_CULT_PYLONS, + "TRAIT_HEAR_THROUGH_DARKNESS" = TRAIT_HEAR_THROUGH_DARKNESS, + "TRAIT_HEAVY_DRINKER" = TRAIT_HEAVY_DRINKER, + "TRAIT_HEAVY_SLEEPER" = TRAIT_HEAVY_SLEEPER, + "TRAIT_HIDE_EXTERNAL_ORGANS" = TRAIT_HIDE_EXTERNAL_ORGANS, + "TRAIT_HOLY" = TRAIT_HOLY, + "TRAIT_HOPELESSLY_ADDICTED" = TRAIT_HOPELESSLY_ADDICTED, + "TRAIT_HOT_SPRING_CURSED" = TRAIT_HOT_SPRING_CURSED, + "TRAIT_HULK" = TRAIT_HULK, + "TRAIT_HUSK" = TRAIT_HUSK, + "TRAIT_ID_APPRAISER" = TRAIT_ID_APPRAISER, + "TRAIT_IGNOREDAMAGESLOWDOWN" = TRAIT_IGNOREDAMAGESLOWDOWN, + "TRAIT_IGNORESLOWDOWN" = TRAIT_IGNORESLOWDOWN, + "TRAIT_IGNORING_GRAVITY" = TRAIT_IGNORING_GRAVITY, + "TRAIT_ILLITERATE" = TRAIT_ILLITERATE, + "TRAIT_IMMOBILIZED" = TRAIT_IMMOBILIZED, + "TRAIT_IN_CALL" = TRAIT_IN_CALL, + "TRAIT_INCAPACITATED" = TRAIT_INCAPACITATED, + "TRAIT_INTROVERT" = TRAIT_INTROVERT, + "TRAIT_INVISIBLE_MAN" = TRAIT_INVISIBLE_MAN, + "TRAIT_IWASBATONED" = TRAIT_IWASBATONED, + "TRAIT_JOLLY" = TRAIT_JOLLY, + "TRAIT_KISS_OF_DEATH" = TRAIT_KISS_OF_DEATH, + "TRAIT_KNOCKEDOUT" = TRAIT_KNOCKEDOUT, + "TRAIT_KNOW_ENGI_WIRES" = TRAIT_KNOW_ENGI_WIRES, + "TRAIT_KNOW_ROBO_WIRES" = TRAIT_KNOW_ROBO_WIRES, + "TRAIT_LIGHT_DRINKER" = TRAIT_LIGHT_DRINKER, + "TRAIT_LIGHT_STEP" = TRAIT_LIGHT_STEP, + "TRAIT_LIGHTBULB_REMOVER" = TRAIT_LIGHTBULB_REMOVER, + "TRAIT_LIMBATTACHMENT" = TRAIT_LIMBATTACHMENT, + "TRAIT_LITERATE" = TRAIT_LITERATE, + "TRAIT_LIVERLESS_METABOLISM" = TRAIT_LIVERLESS_METABOLISM, + "TRAIT_LIVERLESS_METABOLISM" = TRAIT_LIVERLESS_METABOLISM, + "TRAIT_MADNESS_IMMUNE" = TRAIT_MADNESS_IMMUNE, + "TRAIT_MAGICALLY_GIFTED" = TRAIT_MAGICALLY_GIFTED, + "TRAIT_MAGICALLY_PHASED" = TRAIT_MAGICALLY_PHASED, + "TRAIT_MARTIAL_ARTS_IMMUNE" = TRAIT_MARTIAL_ARTS_IMMUNE, + "TRAIT_MEDIBOTCOMINGTHROUGH" = TRAIT_MEDIBOTCOMINGTHROUGH, + "TRAIT_MEDIBOTCOMINGTHROUGH" = TRAIT_MEDIBOTCOMINGTHROUGH, + "TRAIT_MEDICAL_HUD" = TRAIT_MEDICAL_HUD, + "TRAIT_MESON_VISION" = TRAIT_MESON_VISION, + "TRAIT_MIME_FAN" = TRAIT_MIME_FAN, + "TRAIT_MIMING" = TRAIT_MIMING, + "TRAIT_MIND_TEMPORARILY_GONE" = TRAIT_MIND_TEMPORARILY_GONE, + "TRAIT_MINDSHIELD" = TRAIT_MINDSHIELD, + "TRAIT_MOB_BREEDER" = TRAIT_MOB_BREEDER, + "TRAIT_MORBID" = TRAIT_MORBID, + "TRAIT_MULTIZ_SUIT_SENSORS" = TRAIT_MULTIZ_SUIT_SENSORS, + "TRAIT_MUSICIAN" = TRAIT_MUSICIAN, + "TRAIT_MUTANT_COLORS" = TRAIT_MUTANT_COLORS, + "TRAIT_MUTE" = TRAIT_MUTE, + "TRAIT_NAIVE" = TRAIT_NAIVE, + "TRAIT_NEARSIGHTED_CORRECTED" = TRAIT_NEARSIGHTED_CORRECTED, + "TRAIT_NEGATES_GRAVITY" = TRAIT_NEGATES_GRAVITY, + "TRAIT_NEVER_WOUNDED" = TRAIT_NEVER_WOUNDED, + "TRAIT_NICE_SHOT" = TRAIT_NICE_SHOT, + "TRAIT_NIGHT_VISION" = TRAIT_NIGHT_VISION, + "TRAIT_NO_AUGMENTS" = TRAIT_NO_AUGMENTS, + "TRAIT_NO_BLOOD_OVERLAY" = TRAIT_NO_BLOOD_OVERLAY, + "TRAIT_NO_DEBRAIN_OVERLAY" = TRAIT_NO_DEBRAIN_OVERLAY, + "TRAIT_NO_DNA_COPY" = TRAIT_NO_DNA_COPY, + "TRAIT_NO_DNA_SCRAMBLE" = TRAIT_NO_DNA_SCRAMBLE, + "TRAIT_NO_FLOATING_ANIM" = TRAIT_NO_FLOATING_ANIM, + "TRAIT_NO_GLIDE" = TRAIT_NO_GLIDE, + "TRAIT_NO_GUN_AKIMBO" = TRAIT_NO_GUN_AKIMBO, + "TRAIT_NO_IMMOBILIZE" = TRAIT_NO_IMMOBILIZE, + "TRAIT_NO_JUMPSUIT" = TRAIT_NO_JUMPSUIT, + "TRAIT_NO_MINDSWAP" = TRAIT_NO_MINDSWAP, + "TRAIT_NO_MIRROR_REFLECTION" = TRAIT_NO_MIRROR_REFLECTION, + //"TRAIT_NO_PLASMA_TRANSFORM" = TRAIT_NO_PLASMA_TRANSFORM, SKYRAT EDIT - TODO - These require transformation sting pr + "TRAIT_NO_SLIP_ALL" = TRAIT_NO_SLIP_ALL, + "TRAIT_NO_SLIP_ICE" = TRAIT_NO_SLIP_ICE, + "TRAIT_NO_SLIP_SLIDE" = TRAIT_NO_SLIP_SLIDE, + "TRAIT_NO_SLIP_WATER" = TRAIT_NO_SLIP_WATER, + "TRAIT_NO_SOUL" = TRAIT_NO_SOUL, + "TRAIT_NO_STRIP" = TRAIT_NO_STRIP, + "TRAIT_NO_TRANSFORM" = TRAIT_NO_TRANSFORM, + "TRAIT_NOCRITDAMAGE" = TRAIT_NOCRITDAMAGE, + "TRAIT_NO_UNDERWEAR" = TRAIT_NO_UNDERWEAR, + "TRAIT_NO_ZOMBIFY" = TRAIT_NO_ZOMBIFY, + "TRAIT_NOBLOOD" = TRAIT_NOBLOOD, + "TRAIT_NOBREATH" = TRAIT_NOBREATH, + "TRAIT_NOCLONELOSS" = TRAIT_NOCLONELOSS, + "TRAIT_NOCRITDAMAGE" = TRAIT_NOCRITDAMAGE, + "TRAIT_NOCRITOVERLAY" = TRAIT_NOCRITOVERLAY, + "TRAIT_NODEATH" = TRAIT_NODEATH, + "TRAIT_NODISMEMBER" = TRAIT_NODISMEMBER, + "TRAIT_NOFAT" = TRAIT_NOFAT, + "TRAIT_NOFEAR_HOLDUPS" = TRAIT_NOFEAR_HOLDUPS, + "TRAIT_NOFIRE_SPREAD" = TRAIT_NOFIRE_SPREAD, + "TRAIT_NOFIRE" = TRAIT_NOFIRE, + "TRAIT_NOFLASH" = TRAIT_NOFLASH, + "TRAIT_NOGUNS" = TRAIT_NOGUNS, + "TRAIT_NOHARDCRIT" = TRAIT_NOHARDCRIT, + "TRAIT_NOHUNGER" = TRAIT_NOHUNGER, + "TRAIT_NOLIMBDISABLE" = TRAIT_NOLIMBDISABLE, + "TRAIT_NOMOBSWAP" = TRAIT_NOMOBSWAP, + "TRAIT_NOSELFIGNITION_HEAD_ONLY" = TRAIT_NOSELFIGNITION_HEAD_ONLY, + "TRAIT_NOSOFTCRIT" = TRAIT_NOSOFTCRIT, + "TRAIT_NUKEIMMUNE" = TRAIT_NUKEIMMUNE, + "TRAIT_OIL_FRIED" = TRAIT_OIL_FRIED, + "TRAIT_ORBITING_FORBIDDEN" = TRAIT_ORBITING_FORBIDDEN, + "TRAIT_OVERWATCH_IMMUNE" = TRAIT_OVERWATCH_IMMUNE, + "TRAIT_OVERWATCHED" = TRAIT_OVERWATCHED, + "TRAIT_PACIFISM" = TRAIT_PACIFISM, + "TRAIT_PARALYSIS_L_ARM" = TRAIT_PARALYSIS_L_ARM, + "TRAIT_PARALYSIS_L_LEG" = TRAIT_PARALYSIS_L_LEG, + "TRAIT_PARALYSIS_R_ARM" = TRAIT_PARALYSIS_R_ARM, + "TRAIT_PARALYSIS_R_LEG" = TRAIT_PARALYSIS_R_LEG, + "TRAIT_PASSTABLE" = TRAIT_PASSTABLE, + "TRAIT_PERFECT_ATTACKER" = TRAIT_PERFECT_ATTACKER, + "TRAIT_PERMANENTLY_MORTAL" = TRAIT_PERMANENTLY_MORTAL, + "TRAIT_PERMANENTLY_ONFIRE" = TRAIT_PERMANENTLY_ONFIRE, + "TRAIT_PHOTOGRAPHER" = TRAIT_PHOTOGRAPHER, + "TRAIT_PIERCEIMMUNE" = TRAIT_PIERCEIMMUNE, + "TRAIT_PLANT_SAFE" = TRAIT_PLANT_SAFE, + "TRAIT_PLASMA_LOVER_METABOLISM" = TRAIT_PLASMA_LOVER_METABOLISM, + "TRAIT_POSTERBOY" = TRAIT_POSTERBOY, + "TRAIT_PRESENT_VISION" = TRAIT_PRESENT_VISION, + "TRAIT_PRESERVE_UI_WITHOUT_CLIENT" = TRAIT_PRESERVE_UI_WITHOUT_CLIENT, + "TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION" = TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION, + "TRAIT_PRIMITIVE" = TRAIT_PRIMITIVE, //unable to use mechs. Given to Ash Walkers + "TRAIT_PROSOPAGNOSIA" = TRAIT_PROSOPAGNOSIA, + "TRAIT_PULL_BLOCKED" = TRAIT_PULL_BLOCKED, + "TRAIT_PUSHIMMUNE" = TRAIT_PUSHIMMUNE, + "TRAIT_QUICK_BUILD" = TRAIT_QUICK_BUILD, + "TRAIT_QUICK_CARRY" = TRAIT_QUICK_CARRY, + "TRAIT_QUICKER_CARRY" = TRAIT_QUICKER_CARRY, + "TRAIT_RADIMMUNE" = TRAIT_RADIMMUNE, + "TRAIT_RDS_SUPPRESSED" = TRAIT_RDS_SUPPRESSED, + "TRAIT_REAGENT_SCANNER" = TRAIT_REAGENT_SCANNER, + "TRAIT_RECENTLY_BLOCKED_MAGIC" = TRAIT_RECENTLY_BLOCKED_MAGIC, + "TRAIT_RELAYING_ATTACKER" = TRAIT_RELAYING_ATTACKER, + "TRAIT_RESEARCH_SCANNER" = TRAIT_RESEARCH_SCANNER, + "TRAIT_RESISTCOLD" = TRAIT_RESISTCOLD, + "TRAIT_RESISTHEAT" = TRAIT_RESISTHEAT, + "TRAIT_RESISTHEATHANDS" = TRAIT_RESISTHEATHANDS, + "TRAIT_RESISTHIGHPRESSURE" = TRAIT_RESISTHIGHPRESSURE, + "TRAIT_RESISTLOWPRESSURE" = TRAIT_RESISTLOWPRESSURE, + "TRAIT_RESTRAINED" = TRAIT_RESTRAINED, + "TRAIT_REVEAL_FISH" = TRAIT_REVEAL_FISH, + "TRAIT_REVENANT_INHIBITED" = TRAIT_REVENANT_INHIBITED, + "TRAIT_REVENANT_REVEALED" = TRAIT_REVENANT_REVEALED, + "TRAIT_RIFT_FAILURE" = TRAIT_RIFT_FAILURE, + "TRAIT_ROCK_EATER" = TRAIT_ROCK_EATER, + "TRAIT_ROCK_METAMORPHIC" = TRAIT_ROCK_METAMORPHIC, + "TRAIT_ROD_SUPLEX" = TRAIT_ROD_SUPLEX, + "TRAIT_SABRAGE_PRO" = TRAIT_SABRAGE_PRO, + "TRAIT_SACRIFICED" = TRAIT_SACRIFICED, // SKYRAT EDIT ADDITION + "TRAIT_SECURITY_HUD" = TRAIT_SECURITY_HUD, + "TRAIT_SEE_GLASS_COLORS" = TRAIT_SEE_GLASS_COLORS, + "TRAIT_SELF_AWARE" = TRAIT_SELF_AWARE, + "TRAIT_SETTLER" = TRAIT_SETTLER, + "TRAIT_SHAVED" = TRAIT_SHAVED, + "TRAIT_SHIFTY_EYES" = TRAIT_SHIFTY_EYES, + "TRAIT_OVERSIZED" = TRAIT_OVERSIZED, //SKYRAT EDIT ADDITION - Leaving this here so that it hopefully doesn't cause conflicts again in the future(?) + "TRAIT_SHOCKIMMUNE" = TRAIT_SHOCKIMMUNE, + "TRAIT_SIGN_LANG" = TRAIT_SIGN_LANG, + "TRAIT_SILENT_FOOTSTEPS" = TRAIT_SILENT_FOOTSTEPS, + "TRAIT_SIXTHSENSE" = TRAIT_SIXTHSENSE, + "TRAIT_SKITTISH" = TRAIT_SKITTISH, + "TRAIT_SLEEPIMMUNE" = TRAIT_SLEEPIMMUNE, + "TRAIT_SMOKER" = TRAIT_SMOKER, + "TRAIT_SNEAK" = TRAIT_SNEAK, + "TRAIT_SNOB" = TRAIT_SNOB, + "TRAIT_SOFTSPOKEN" = TRAIT_SOFTSPOKEN, + "TRAIT_SOOTHED_THROAT" = TRAIT_SOOTHED_THROAT, + "TRAIT_SPACEWALK" = TRAIT_SPACEWALK, + "TRAIT_SPARRING" = TRAIT_SPARRING, + "TRAIT_SPEAKS_CLEARLY" = TRAIT_SPEAKS_CLEARLY, + "TRAIT_SPECIAL_TRAUMA_BOOST" = TRAIT_SPECIAL_TRAUMA_BOOST, + "TRAIT_SPIDER_CONSUMED" = TRAIT_SPIDER_CONSUMED, + "TRAIT_SPIRITUAL" = TRAIT_SPIRITUAL, + "TRAIT_SPRAY_PAINTABLE" = TRAIT_SPRAY_PAINTABLE, + "TRAIT_STABLEHEART" = TRAIT_STABLEHEART, + "TRAIT_STABLELIVER" = TRAIT_STABLELIVER, + //"TRAIT_STASIS" = TRAIT_STASIS, TODO - SKYRAT EDIT - TODO - These require transformation sting pr + "TRAIT_STRONG_GRABBER" = TRAIT_STRONG_GRABBER, + "TRAIT_STUNIMMUNE" = TRAIT_STUNIMMUNE, + "TRAIT_SUCCUMB_OVERRIDE" = TRAIT_SUCCUMB_OVERRIDE, + "TRAIT_SUICIDED" = TRAIT_SUICIDED, + "TRAIT_SUPERMATTER_SOOTHER" = TRAIT_SUPERMATTER_SOOTHER, + "TRAIT_SURGEON" = TRAIT_SURGEON, + "TRAIT_SURGICALLY_ANALYZED" = TRAIT_SURGICALLY_ANALYZED, + "TRAIT_TACKLING_FRAIL_ATTACKER" = TRAIT_TACKLING_FRAIL_ATTACKER, + "TRAIT_TACKLING_TAILED_DEFENDER" = TRAIT_TACKLING_TAILED_DEFENDER, + "TRAIT_TACKLING_WINGED_ATTACKER" = TRAIT_TACKLING_WINGED_ATTACKER, + "TRAIT_TAGGER" = TRAIT_TAGGER, + "TRAIT_TEMPORARY_BODY" = TRAIT_TEMPORARY_BODY, + "TRAIT_TENACIOUS" = TRAIT_TENACIOUS, + "TRAIT_TENTACLE_IMMUNE" = TRAIT_TENTACLE_IMMUNE, + "TRAIT_TESLA_SHOCKIMMUNE" = TRAIT_TESLA_SHOCKIMMUNE, + "TRAIT_THERMAL_VISION" = TRAIT_THERMAL_VISION, + "TRAIT_THROWINGARM" = TRAIT_THROWINGARM, + "TRAIT_TIME_STOP_IMMUNE" = TRAIT_TIME_STOP_IMMUNE, + "TRAIT_TOWER_OF_BABEL" = TRAIT_TOWER_OF_BABEL, + "TRAIT_TOXIMMUNE" = TRAIT_TOXIMMUNE, + "TRAIT_TOXINLOVER" = TRAIT_TOXINLOVER, + "TRAIT_TRUE_NIGHT_VISION" = TRAIT_TRUE_NIGHT_VISION, + "TRAIT_TUMOR_SUPPRESSED" = TRAIT_TUMOR_SUPPRESSED, + "TRAIT_TUMOR_SUPPRESSION" = TRAIT_TUMOR_SUPPRESSED, + "TRAIT_UI_BLOCKED" = TRAIT_UI_BLOCKED, + "TRAIT_UNBREAKABLE" = TRAIT_UNBREAKABLE, + "TRAIT_UNDENSE" = TRAIT_UNDENSE, + "TRAIT_UNDERWATER_BASKETWEAVING_KNOWLEDGE" = TRAIT_UNDERWATER_BASKETWEAVING_KNOWLEDGE, + //"TRAIT_UNHUSKABLE" = TRAIT_UNHUSKABLE, SKYRAT EDIT - TODO - These require transformation sting pr + "TRAIT_UNINTELLIGIBLE_SPEECH" = TRAIT_UNINTELLIGIBLE_SPEECH, + "TRAIT_UNKNOWN" = TRAIT_UNKNOWN, + "TRAIT_UNNATURAL_RED_GLOWY_EYES" = TRAIT_UNNATURAL_RED_GLOWY_EYES, + "TRAIT_UNOBSERVANT" = TRAIT_UNOBSERVANT, + "TRAIT_UNSTABLE" = TRAIT_UNSTABLE, + "TRAIT_USED_DNA_VAULT" = TRAIT_USED_DNA_VAULT, + "TRAIT_USES_SKINTONES" = TRAIT_USES_SKINTONES, + "TRAIT_VATGROWN" = TRAIT_VATGROWN, + "TRAIT_VENTCRAWLER_ALWAYS" = TRAIT_VENTCRAWLER_ALWAYS, + "TRAIT_VENTCRAWLER_NUDE" = TRAIT_VENTCRAWLER_NUDE, + "TRAIT_VIRUS_RESISTANCE" = TRAIT_VIRUS_RESISTANCE, + "TRAIT_VIRUSIMMUNE" = TRAIT_VIRUSIMMUNE, + "TRAIT_VORACIOUS" = TRAIT_VORACIOUS, + "TRAIT_WAS_EVOLVED" = TRAIT_WAS_EVOLVED, + "TRAIT_WEAK_SOUL" = TRAIT_WEAK_SOUL, + "TRAIT_WEB_SURFER" = TRAIT_WEB_SURFER, + "TRAIT_WEB_WEAVER" = TRAIT_WEB_WEAVER, + "TRAIT_WINE_TASTER" = TRAIT_WINE_TASTER, + "TRAIT_WING_BUFFET_TIRED" = TRAIT_WING_BUFFET_TIRED, + "TRAIT_WING_BUFFET" = TRAIT_WING_BUFFET, + "TRAIT_XENO_HOST" = TRAIT_XENO_HOST, + "TRAIT_XENO_IMMUNE" = TRAIT_XENO_IMMUNE, + "TRAIT_XRAY_HEARING" = TRAIT_XRAY_HEARING, + "TRAIT_XRAY_VISION" = TRAIT_XRAY_VISION, + ), + /obj/item = list( + "TRAIT_APC_SHOCKING" = TRAIT_APC_SHOCKING, + "TRAIT_BASIC_QUALITY_BAIT" = TRAIT_BASIC_QUALITY_BAIT, + "TRAIT_BLIND_TOOL" = TRAIT_BLIND_TOOL, + "TRAIT_CUSTOM_TAP_SOUND" = TRAIT_CUSTOM_TAP_SOUND, + "TRAIT_DANGEROUS_OBJECT" = TRAIT_DANGEROUS_OBJECT, + "TRAIT_FISHING_BAIT" = TRAIT_FISHING_BAIT, + "TRAIT_GERM_SENSITIVE" = TRAIT_GERM_SENSITIVE, + "TRAIT_GOOD_QUALITY_BAIT" = TRAIT_GOOD_QUALITY_BAIT, + "TRAIT_GREAT_QUALITY_BAIT" = TRAIT_GREAT_QUALITY_BAIT, + "TRAIT_HAUNTED" = TRAIT_HAUNTED, + "TRAIT_HONKSPAMMING" = TRAIT_HONKSPAMMING, + "TRAIT_INNATELY_FANTASTICAL_ITEM" = TRAIT_INNATELY_FANTASTICAL_ITEM, + "TRAIT_NEEDS_TWO_HANDS" = TRAIT_NEEDS_TWO_HANDS, + "TRAIT_NO_BARCODES" = TRAIT_NO_BARCODES, + "TRAIT_NO_STORAGE_INSERT" = TRAIT_NO_STORAGE_INSERT, + "TRAIT_NO_TELEPORT" = TRAIT_NO_TELEPORT, + "TRAIT_NODROP" = TRAIT_NODROP, + "TRAIT_OMNI_BAIT" = TRAIT_OMNI_BAIT, + "TRAIT_PLANT_WILDMUTATE" = TRAIT_PLANT_WILDMUTATE, + "TRAIT_T_RAY_VISIBLE" = TRAIT_T_RAY_VISIBLE, + "TRAIT_TRANSFORM_ACTIVE" = TRAIT_TRANSFORM_ACTIVE, + "TRAIT_UNCATCHABLE" = TRAIT_UNCATCHABLE, + "TRAIT_WIELDED" = TRAIT_WIELDED, + ), + /obj/item/bodypart = list( + "TRAIT_DISABLED_BY_WOUND" = TRAIT_DISABLED_BY_WOUND, + "TRAIT_IGNORED_BY_LIVING_FLESH" = TRAIT_IGNORED_BY_LIVING_FLESH, + ), + /obj/item/bodypart = list( + "TRAIT_PARALYSIS" = TRAIT_PARALYSIS, + ), + /obj/item/card/id = list( + "TRAIT_JOB_FIRST_ID_CARD" = TRAIT_JOB_FIRST_ID_CARD, + "TRAIT_MAGNETIC_ID_CARD" = TRAIT_MAGNETIC_ID_CARD, + "TRAIT_TASTEFULLY_THICK_ID_CARD" = TRAIT_TASTEFULLY_THICK_ID_CARD, + ), + /obj/item/clothing = list( + "TRAIT_RADIATION_PROTECTED_CLOTHING" = TRAIT_RADIATION_PROTECTED_CLOTHING, + ), + /obj/item/fish = list( + "TRAIT_FISH_AMPHIBIOUS" = TRAIT_FISH_AMPHIBIOUS, + "TRAIT_FISH_CROSSBREEDER" = TRAIT_FISH_CROSSBREEDER, + "TRAIT_FISH_FED_LUBE" = TRAIT_FISH_FED_LUBE, + "TRAIT_FISH_FROM_CASE" = TRAIT_FISH_FROM_CASE, + "TRAIT_FISH_NO_HUNGER" = TRAIT_FISH_NO_HUNGER, + "TRAIT_FISH_NO_MATING" = TRAIT_FISH_NO_MATING, + "TRAIT_FISH_SELF_REPRODUCE" = TRAIT_FISH_SELF_REPRODUCE, + "TRAIT_FISH_TOXIN_IMMUNE" = TRAIT_FISH_TOXIN_IMMUNE, + "TRAIT_RESIST_EMULSIFY" = TRAIT_RESIST_EMULSIFY, + "TRAIT_YUCKY_FISH" = TRAIT_YUCKY_FISH, + ), + /obj/item/integrated_circuit = list( + "TRAIT_CIRCUIT_UI_OPEN" = TRAIT_CIRCUIT_UI_OPEN, + "TRAIT_CIRCUIT_UNDUPABLE" = TRAIT_CIRCUIT_UNDUPABLE, + "TRAIT_COMPONENT_MMI" = TRAIT_COMPONENT_MMI, + ), + /obj/item/modular_computer = list( + "TRAIT_PDA_CAN_EXPLODE" = TRAIT_PDA_CAN_EXPLODE, + "TRAIT_PDA_MESSAGE_MENU_RIGGED" = TRAIT_PDA_MESSAGE_MENU_RIGGED, + ), + /obj/item/organ = list( + "TRAIT_LIVING_HEART" = TRAIT_LIVING_HEART, + ), + /obj/item/organ/internal/liver = list( + "TRAIT_BALLMER_SCIENTIST" = TRAIT_BALLMER_SCIENTIST, + "TRAIT_COMEDY_METABOLISM" = TRAIT_COMEDY_METABOLISM, + "TRAIT_CORONER_METABOLISM" = TRAIT_CORONER_METABOLISM, + "TRAIT_CULINARY_METABOLISM" = TRAIT_CULINARY_METABOLISM, + "TRAIT_ENGINEER_METABOLISM" = TRAIT_ENGINEER_METABOLISM, + "TRAIT_LAW_ENFORCEMENT_METABOLISM" = TRAIT_LAW_ENFORCEMENT_METABOLISM, + "TRAIT_MAINTENANCE_METABOLISM" = TRAIT_MAINTENANCE_METABOLISM, + "TRAIT_MEDICAL_METABOLISM" = TRAIT_MEDICAL_METABOLISM, + "TRAIT_PRETENDER_ROYAL_METABOLISM" = TRAIT_PRETENDER_ROYAL_METABOLISM, + "TRAIT_ROYAL_METABOLISM" = TRAIT_ROYAL_METABOLISM, + ), + /obj/item/organ/internal/lungs = list( + "TRAIT_SPACEBREATHING" = TRAIT_SPACEBREATHING, + ), + /obj/item/reagent_containers = list( + "TRAIT_MAY_CONTAIN_BLENDED_DUST" = TRAIT_MAY_CONTAIN_BLENDED_DUST, + ), + /obj/projectile = list( + "TRAIT_ALWAYS_HIT_ZONE" = TRAIT_ALWAYS_HIT_ZONE, + ), + /obj/structure = list( + "TRAIT_RADSTORM_IMMUNE" = TRAIT_RADSTORM_IMMUNE, + ), + /obj/vehicle = list( + "TRAIT_OREBOX_FUNCTIONAL" = TRAIT_OREBOX_FUNCTIONAL, + ), + /turf = list( + "TRAIT_CHASM_STOPPED" = TRAIT_CHASM_STOPPED, + "TRAIT_FIREDOOR_STOP" = TRAIT_FIREDOOR_STOP, + "TRAIT_HYPERSPACE_STOPPED" = TRAIT_HYPERSPACE_STOPPED, + "TRAIT_IMMERSE_STOPPED" = TRAIT_IMMERSE_STOPPED, + "TRAIT_LAVA_STOPPED" = TRAIT_LAVA_STOPPED, + "TRAIT_SPINNING_WEB_TURF" = TRAIT_SPINNING_WEB_TURF, + "TRAIT_TURF_IGNORE_SLIPPERY" = TRAIT_TURF_IGNORE_SLIPPERY, + "TRAIT_TURF_IGNORE_SLOWDOWN" = TRAIT_TURF_IGNORE_SLOWDOWN, + ), +)) + +/// value -> trait name, list of ALL traits that exist in the game, used for any type of accessing. +GLOBAL_LIST(global_trait_name_map) + +/proc/generate_global_trait_name_map() + . = list() + for(var/key in GLOB.traits_by_type) + for(var/tname in GLOB.traits_by_type[key]) + var/val = GLOB.traits_by_type[key][tname] + .[val] = tname + + return . + +GLOBAL_LIST_INIT(movement_type_trait_to_flag, list( + TRAIT_MOVE_GROUND = GROUND, + TRAIT_MOVE_FLYING = FLYING, + TRAIT_MOVE_VENTCRAWLING = VENTCRAWLING, + TRAIT_MOVE_FLOATING = FLOATING, + TRAIT_MOVE_PHASING = PHASING, +)) + +GLOBAL_LIST_INIT(movement_type_addtrait_signals, set_movement_type_addtrait_signals()) +GLOBAL_LIST_INIT(movement_type_removetrait_signals, set_movement_type_removetrait_signals()) + +/proc/set_movement_type_addtrait_signals(signal_prefix) + . = list() + for(var/trait in GLOB.movement_type_trait_to_flag) + . += SIGNAL_ADDTRAIT(trait) + + return . + +/proc/set_movement_type_removetrait_signals(signal_prefix) + . = list() + for(var/trait in GLOB.movement_type_trait_to_flag) + . += SIGNAL_REMOVETRAIT(trait) + + return . diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits/admin_tooling.dm similarity index 88% rename from code/_globalvars/traits.dm rename to code/_globalvars/traits/admin_tooling.dm index 118ba513d4a..d5d19a25f39 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -1,313 +1,290 @@ -/* - FUN ZONE OF ADMIN LISTINGS - Try to keep this in sync with __DEFINES/traits.dm - quirks have it's own panel so we don't need them here. -*/ -GLOBAL_LIST_INIT(traits_by_type, list( +// This file contains any stuff related to admin-visible traits. +// There's likely more than a few traits missing from this file, do consult the `_traits.dm` file in this folder to see every global trait that exists. +// quirks have it's own panel so we don't need them here. + +GLOBAL_LIST_INIT(admin_visible_traits, list( + /atom = list( + "TRAIT_KEEP_TOGETHER" = TRAIT_KEEP_TOGETHER, + ), + /atom/movable = list( + "TRAIT_ASHSTORM_IMMUNE" = TRAIT_ASHSTORM_IMMUNE, + "TRAIT_HAS_LABEL" = TRAIT_HAS_LABEL, + "TRAIT_LAVA_IMMUNE" = TRAIT_LAVA_IMMUNE, + "TRAIT_MOVE_FLOATING" = TRAIT_MOVE_FLOATING, + "TRAIT_MOVE_FLYING" = TRAIT_MOVE_FLYING, + "TRAIT_MOVE_GROUND" = TRAIT_MOVE_GROUND, + "TRAIT_MOVE_PHASING" = TRAIT_MOVE_PHASING, + "TRAIT_MOVE_VENTCRAWLING" = TRAIT_MOVE_VENTCRAWLING, + "TRAIT_RUNECHAT_HIDDEN" = TRAIT_RUNECHAT_HIDDEN, + "TRAIT_SNOWSTORM_IMMUNE" = TRAIT_SNOWSTORM_IMMUNE, + "TRAIT_VOIDSTORM_IMMUNE" = TRAIT_VOIDSTORM_IMMUNE, + "TRAIT_WEATHER_IMMUNE" = TRAIT_WEATHER_IMMUNE, + ), /mob = list( - "TRAIT_KNOCKEDOUT" = TRAIT_KNOCKEDOUT, - "TRAIT_IMMOBILIZED" = TRAIT_IMMOBILIZED, - "TRAIT_FLOORED" = TRAIT_FLOORED, - "TRAIT_FORCED_STANDING" = TRAIT_FORCED_STANDING, - "TRAIT_HANDS_BLOCKED" = TRAIT_HANDS_BLOCKED, - "TRAIT_UI_BLOCKED" = TRAIT_UI_BLOCKED, - "TRAIT_PULL_BLOCKED" = TRAIT_PULL_BLOCKED, - "TRAIT_RESTRAINED" = TRAIT_RESTRAINED, - "TRAIT_PERFECT_ATTACKER" = TRAIT_PERFECT_ATTACKER, - "TRAIT_GREENTEXT_CURSED" = TRAIT_GREENTEXT_CURSED, - "TRAIT_INCAPACITATED" = TRAIT_INCAPACITATED, + "TRAIT_ABDUCTOR_SCIENTIST_TRAINING" = TRAIT_ABDUCTOR_SCIENTIST_TRAINING, + "TRAIT_ABDUCTOR_TRAINING" = TRAIT_ABDUCTOR_TRAINING, + "TRAIT_ADVANCEDTOOLUSER" = TRAIT_ADVANCEDTOOLUSER, + "TRAIT_AGENDER" = TRAIT_AGENDER, + "TRAIT_AGEUSIA" = TRAIT_AGEUSIA, + "TRAIT_ALCOHOL_TOLERANCE" = TRAIT_ALCOHOL_TOLERANCE, + "TRAIT_ANTIMAGIC" = TRAIT_ANTIMAGIC, + "TRAIT_ANXIOUS" = TRAIT_ANXIOUS, + "TRAIT_BADDNA" = TRAIT_BADDNA, + "TRAIT_BADTOUCH" = TRAIT_BADTOUCH, + "TRAIT_BALD" = TRAIT_BALD, + "TRAIT_BATON_RESISTANCE" = TRAIT_BATON_RESISTANCE, + "TRAIT_BLOOD_CLANS" = TRAIT_BLOOD_CLANS, + "TRAIT_BLOOD_DEFICIENCY" = TRAIT_BLOOD_DEFICIENCY, + "TRAIT_BLOODSHOT_EYES" = TRAIT_BLOODSHOT_EYES, + "TRAIT_BOMBIMMUNE" = TRAIT_BOMBIMMUNE, + "TRAIT_BONSAI" = TRAIT_BONSAI, + "TRAIT_BOOZE_SLIDER" = TRAIT_BOOZE_SLIDER, + "TRAIT_BYPASS_MEASURES" = TRAIT_BYPASS_MEASURES, + "TRAIT_CAN_HOLD_ITEMS" = TRAIT_CAN_HOLD_ITEMS, + "TRAIT_CANNOT_BE_UNBUCKLED" = TRAIT_CANNOT_BE_UNBUCKLED, + "TRAIT_CANNOT_OPEN_PRESENTS" = TRAIT_CANNOT_OPEN_PRESENTS, + "TRAIT_CHASM_DESTROYED" = TRAIT_CHASM_DESTROYED, + "TRAIT_CHUNKYFINGERS_IGNORE_BATON" = TRAIT_CHUNKYFINGERS_IGNORE_BATON, + "TRAIT_CHUNKYFINGERS" = TRAIT_CHUNKYFINGERS, + "TRAIT_CLOWN_ENJOYER" = TRAIT_CLOWN_ENJOYER, + "TRAIT_CLUMSY" = TRAIT_CLUMSY, "TRAIT_CRITICAL_CONDITION" = TRAIT_CRITICAL_CONDITION, - "TRAIT_LITERATE" = TRAIT_LITERATE, - "TRAIT_ILLITERATE" = TRAIT_ILLITERATE, - "TRAIT_MUTE" = TRAIT_MUTE, - "TRAIT_EMOTEMUTE " = TRAIT_EMOTEMUTE, + "TRAIT_CULT_HALO" = TRAIT_CULT_HALO, "TRAIT_DEAF" = TRAIT_DEAF, - "TRAIT_FAT" = TRAIT_FAT, - "TRAIT_HUSK" = TRAIT_HUSK, + "TRAIT_DEATHCOMA" = TRAIT_DEATHCOMA, "TRAIT_DEFIB_BLACKLISTED" = TRAIT_DEFIB_BLACKLISTED, - "TRAIT_BADDNA" = TRAIT_BADDNA, - "TRAIT_CLUMSY" = TRAIT_CLUMSY, - "TRAIT_CHUNKYFINGERS" = TRAIT_CHUNKYFINGERS, - "TRAIT_CHUNKYFINGERS_IGNORE_BATON" = TRAIT_CHUNKYFINGERS_IGNORE_BATON, - "TRAIT_FIST_MINING" = TRAIT_FIST_MINING, - "TRAIT_CAN_HOLD_ITEMS" = TRAIT_CAN_HOLD_ITEMS, - "TRAIT_FENCE_CLIMBER" = TRAIT_FENCE_CLIMBER, - "TRAIT_DUMB" = TRAIT_DUMB, - "TRAIT_ADVANCEDTOOLUSER" = TRAIT_ADVANCEDTOOLUSER, + "TRAIT_DEPRESSION" = TRAIT_DEPRESSION, + "TRAIT_DIAGNOSTIC_HUD" = TRAIT_DIAGNOSTIC_HUD, "TRAIT_DISCOORDINATED_TOOL_USER" = TRAIT_DISCOORDINATED_TOOL_USER, - "TRAIT_PACIFISM" = TRAIT_PACIFISM, - "TRAIT_IGNORESLOWDOWN" = TRAIT_IGNORESLOWDOWN, - "TRAIT_IGNOREDAMAGESLOWDOWN" = TRAIT_IGNOREDAMAGESLOWDOWN, - "TRAIT_DEATHCOMA" = TRAIT_DEATHCOMA, - "TRAIT_FAKEDEATH" = TRAIT_FAKEDEATH, "TRAIT_DISFIGURED" = TRAIT_DISFIGURED, - "TRAIT_XENO_HOST" = TRAIT_XENO_HOST, - "TRAIT_STUNIMMUNE" = TRAIT_STUNIMMUNE, - "TRAIT_BATON_RESISTANCE" = TRAIT_BATON_RESISTANCE, - "TRAIT_IWASBATONED" = TRAIT_IWASBATONED, - "TRAIT_SLEEPIMMUNE" = TRAIT_SLEEPIMMUNE, - "TRAIT_PUSHIMMUNE" = TRAIT_PUSHIMMUNE, - "TRAIT_SHOCKIMMUNE" = TRAIT_SHOCKIMMUNE, - "TRAIT_TESLA_SHOCKIMMUNE" = TRAIT_TESLA_SHOCKIMMUNE, - "TRAIT_STABLEHEART" = TRAIT_STABLEHEART, - "TRAIT_STABLELIVER" = TRAIT_STABLELIVER, - "TRAIT_RESISTHEAT" = TRAIT_RESISTHEAT, - "TRAIT_USED_DNA_VAULT" = TRAIT_USED_DNA_VAULT, - "TRAIT_RESISTHEATHANDS" = TRAIT_RESISTHEATHANDS, - "TRAIT_RESISTCOLD" = TRAIT_RESISTCOLD, - "TRAIT_RESISTHIGHPRESSURE" = TRAIT_RESISTHIGHPRESSURE, - "TRAIT_RESISTLOWPRESSURE" = TRAIT_RESISTLOWPRESSURE, - "TRAIT_BOMBIMMUNE" = TRAIT_BOMBIMMUNE, - "TRAIT_RADIMMUNE" = TRAIT_RADIMMUNE, - "TRAIT_GENELESS" = TRAIT_GENELESS, - "TRAIT_VIRUSIMMUNE" = TRAIT_VIRUSIMMUNE, - "TRAIT_PIERCEIMMUNE" = TRAIT_PIERCEIMMUNE, - "TRAIT_NODISMEMBER" = TRAIT_NODISMEMBER, - "TRAIT_NOFIRE" = TRAIT_NOFIRE, - "TRAIT_NOGUNS" = TRAIT_NOGUNS, - "TRAIT_NOHUNGER" = TRAIT_NOHUNGER, - "TRAIT_LIVERLESS_METABOLISM" = TRAIT_LIVERLESS_METABOLISM, - "TRAIT_PLASMA_LOVER_METABOLISM" = TRAIT_PLASMA_LOVER_METABOLISM, - "TRAIT_NOCLONELOSS" = TRAIT_NOCLONELOSS, - "TRAIT_TOXIMMUNE" = TRAIT_TOXIMMUNE, - "TRAIT_EASYDISMEMBER" = TRAIT_EASYDISMEMBER, - "TRAIT_LIMBATTACHMENT" = TRAIT_LIMBATTACHMENT, - "TRAIT_NOLIMBDISABLE" = TRAIT_NOLIMBDISABLE, + "TRAIT_DISK_VERIFIER" = TRAIT_DISK_VERIFIER, + "TRAIT_DISSECTED" = TRAIT_DISSECTED, + "TRAIT_DRINKS_BLOOD" = TRAIT_DRINKS_BLOOD, + "TRAIT_DUMB" = TRAIT_DUMB, + "TRAIT_DWARF" = TRAIT_DWARF, "TRAIT_EASILY_WOUNDED" = TRAIT_EASILY_WOUNDED, + "TRAIT_EASYDISMEMBER" = TRAIT_EASYDISMEMBER, + "TRAIT_EMOTEMUTE " = TRAIT_EMOTEMUTE, + "TRAIT_EMPATH" = TRAIT_EMPATH, + "TRAIT_EXPANDED_FOV" = TRAIT_EXPANDED_FOV, + "TRAIT_FAKEDEATH" = TRAIT_FAKEDEATH, + "TRAIT_FAT" = TRAIT_FAT, + "TRAIT_FEARLESS" = TRAIT_FEARLESS, + "TRAIT_FENCE_CLIMBER" = TRAIT_FENCE_CLIMBER, + "TRAIT_FIST_MINING" = TRAIT_FIST_MINING, + "TRAIT_FIXED_HAIRCOLOR" = TRAIT_FIXED_HAIRCOLOR, + "TRAIT_FIXED_MUTANT_COLORS" = TRAIT_FIXED_MUTANT_COLORS, + "TRAIT_FLOORED" = TRAIT_FLOORED, + "TRAIT_FORCED_STANDING" = TRAIT_FORCED_STANDING, + "TRAIT_FREERUNNING" = TRAIT_FREERUNNING, + "TRAIT_FRIENDLY" = TRAIT_FRIENDLY, + "TRAIT_GAMER" = TRAIT_GAMER, + "TRAIT_GAMERGOD" = TRAIT_GAMERGOD, + "TRAIT_GENELESS" = TRAIT_GENELESS, + "TRAIT_GIANT" = TRAIT_GIANT, + "TRAIT_GOOD_HEARING" = TRAIT_GOOD_HEARING, + "TRAIT_GRABWEAKNESS" = TRAIT_GRABWEAKNESS, + "TRAIT_GREENTEXT_CURSED" = TRAIT_GREENTEXT_CURSED, + "TRAIT_GUNFLIP" = TRAIT_GUNFLIP, + "TRAIT_HANDS_BLOCKED" = TRAIT_HANDS_BLOCKED, "TRAIT_HARDLY_WOUNDED" = TRAIT_HARDLY_WOUNDED, - "TRAIT_NEVER_WOUNDED" = TRAIT_NEVER_WOUNDED, - "TRAIT_TOXINLOVER" = TRAIT_TOXINLOVER, - "TRAIT_NOCRITOVERLAY" = TRAIT_NOCRITOVERLAY, - "TRAIT_NOBREATH" = TRAIT_NOBREATH, - "TRAIT_ANTIMAGIC" = TRAIT_ANTIMAGIC, + "TRAIT_HAS_MARKINGS" = TRAIT_HAS_MARKINGS, + "TRAIT_HEAVY_SLEEPER" = TRAIT_HEAVY_SLEEPER, + "TRAIT_HIDE_EXTERNAL_ORGANS" = TRAIT_HIDE_EXTERNAL_ORGANS, "TRAIT_HOLY" = TRAIT_HOLY, - "TRAIT_DEPRESSION" = TRAIT_DEPRESSION, - "TRAIT_BLOOD_DEFICIENCY" = TRAIT_BLOOD_DEFICIENCY, + "TRAIT_HUSK" = TRAIT_HUSK, + "TRAIT_IGNOREDAMAGESLOWDOWN" = TRAIT_IGNOREDAMAGESLOWDOWN, + "TRAIT_IGNORESLOWDOWN" = TRAIT_IGNORESLOWDOWN, + "TRAIT_ILLITERATE" = TRAIT_ILLITERATE, + "TRAIT_IMMOBILIZED" = TRAIT_IMMOBILIZED, + "TRAIT_INCAPACITATED" = TRAIT_INCAPACITATED, + "TRAIT_INVISIBLE_MAN" = TRAIT_INVISIBLE_MAN, + "TRAIT_IWASBATONED" = TRAIT_IWASBATONED, "TRAIT_JOLLY" = TRAIT_JOLLY, + "TRAIT_KISS_OF_DEATH" = TRAIT_KISS_OF_DEATH, + "TRAIT_KNOCKEDOUT" = TRAIT_KNOCKEDOUT, + "TRAIT_KNOW_ENGI_WIRES" = TRAIT_KNOW_ENGI_WIRES, + "TRAIT_KNOW_ROBO_WIRES" = TRAIT_KNOW_ROBO_WIRES, + "TRAIT_LIGHT_DRINKER" = TRAIT_LIGHT_DRINKER, + "TRAIT_LIGHT_STEP" = TRAIT_LIGHT_STEP, + "TRAIT_LIGHTBULB_REMOVER" = TRAIT_LIGHTBULB_REMOVER, + "TRAIT_LIMBATTACHMENT" = TRAIT_LIMBATTACHMENT, + "TRAIT_LITERATE" = TRAIT_LITERATE, + "TRAIT_LIVERLESS_METABOLISM" = TRAIT_LIVERLESS_METABOLISM, + "TRAIT_LIVERLESS_METABOLISM" = TRAIT_LIVERLESS_METABOLISM, + "TRAIT_MEDICAL_HUD" = TRAIT_MEDICAL_HUD, + "TRAIT_MIME_FAN" = TRAIT_MIME_FAN, + "TRAIT_MIMING" = TRAIT_MIMING, + "TRAIT_MINDSHIELD" = TRAIT_MINDSHIELD, + "TRAIT_MORBID" = TRAIT_MORBID, + "TRAIT_MUSICIAN" = TRAIT_MUSICIAN, + "TRAIT_MUTANT_COLORS" = TRAIT_MUTANT_COLORS, + "TRAIT_MUTE" = TRAIT_MUTE, + "TRAIT_NAIVE" = TRAIT_NAIVE, + "TRAIT_NEVER_WOUNDED" = TRAIT_NEVER_WOUNDED, + "TRAIT_NICE_SHOT" = TRAIT_NICE_SHOT, + "TRAIT_NIGHT_VISION" = TRAIT_NIGHT_VISION, + "TRAIT_NO_AUGMENTS" = TRAIT_NO_AUGMENTS, + "TRAIT_NO_BLOOD_OVERLAY" = TRAIT_NO_BLOOD_OVERLAY, + "TRAIT_NO_DNA_COPY" = TRAIT_NO_DNA_COPY, "TRAIT_NO_GLIDE" = TRAIT_NO_GLIDE, - "TRAIT_NO_FLOATING_ANIM" = TRAIT_NO_FLOATING_ANIM, - "TRAIT_NOCRITDAMAGE" = TRAIT_NOCRITDAMAGE, - "TRAIT_NO_SLIP_WATER" = TRAIT_NO_SLIP_WATER, + //"TRAIT_NO_PLASMA_TRANSFORM" = TRAIT_NO_PLASMA_TRANSFORM, SKYRAT EDIT - TODO - These require transformation sting pr + "TRAIT_NO_SLIP_ALL" = TRAIT_NO_SLIP_ALL, "TRAIT_NO_SLIP_ICE" = TRAIT_NO_SLIP_ICE, "TRAIT_NO_SLIP_SLIDE" = TRAIT_NO_SLIP_SLIDE, - "TRAIT_NO_SLIP_ALL" = TRAIT_NO_SLIP_ALL, + "TRAIT_NO_SLIP_WATER" = TRAIT_NO_SLIP_WATER, + "TRAIT_NO_SOUL" = TRAIT_NO_SOUL, + "TRAIT_NO_TRANSFORM" = TRAIT_NO_TRANSFORM, + "TRAIT_NO_UNDERWEAR" = TRAIT_NO_UNDERWEAR, + "TRAIT_NO_ZOMBIFY" = TRAIT_NO_ZOMBIFY, + "TRAIT_NOBLOOD" = TRAIT_NOBLOOD, + "TRAIT_NOBREATH" = TRAIT_NOBREATH, + "TRAIT_NOCLONELOSS" = TRAIT_NOCLONELOSS, + "TRAIT_NOCRITDAMAGE" = TRAIT_NOCRITDAMAGE, + "TRAIT_NOCRITOVERLAY" = TRAIT_NOCRITOVERLAY, "TRAIT_NODEATH" = TRAIT_NODEATH, + "TRAIT_NODISMEMBER" = TRAIT_NODISMEMBER, + "TRAIT_NOFIRE" = TRAIT_NOFIRE, + "TRAIT_NOFLASH" = TRAIT_NOFLASH, + "TRAIT_NOGUNS" = TRAIT_NOGUNS, "TRAIT_NOHARDCRIT" = TRAIT_NOHARDCRIT, + "TRAIT_NOHUNGER" = TRAIT_NOHUNGER, + "TRAIT_NOLIMBDISABLE" = TRAIT_NOLIMBDISABLE, + "TRAIT_NOMOBSWAP" = TRAIT_NOMOBSWAP, "TRAIT_NOSOFTCRIT" = TRAIT_NOSOFTCRIT, - "TRAIT_MINDSHIELD" = TRAIT_MINDSHIELD, - "TRAIT_DISSECTED" = TRAIT_DISSECTED, - "TRAIT_SURGICALLY_ANALYZED" = TRAIT_SURGICALLY_ANALYZED, - "TRAIT_SIXTHSENSE" = TRAIT_SIXTHSENSE, - "TRAIT_FEARLESS" = TRAIT_FEARLESS, + "TRAIT_OIL_FRIED" = TRAIT_OIL_FRIED, + "TRAIT_OVERWATCH_IMMUNE" = TRAIT_OVERWATCH_IMMUNE, + "TRAIT_PACIFISM" = TRAIT_PACIFISM, "TRAIT_PARALYSIS_L_ARM" = TRAIT_PARALYSIS_L_ARM, - "TRAIT_PARALYSIS_R_ARM" = TRAIT_PARALYSIS_R_ARM, "TRAIT_PARALYSIS_L_LEG" = TRAIT_PARALYSIS_L_LEG, + "TRAIT_PARALYSIS_R_ARM" = TRAIT_PARALYSIS_R_ARM, "TRAIT_PARALYSIS_R_LEG" = TRAIT_PARALYSIS_R_LEG, - "TRAIT_CANNOT_OPEN_PRESENTS" = TRAIT_CANNOT_OPEN_PRESENTS, + "TRAIT_PASSTABLE" = TRAIT_PASSTABLE, + "TRAIT_PERFECT_ATTACKER" = TRAIT_PERFECT_ATTACKER, + "TRAIT_PERMANENTLY_ONFIRE" = TRAIT_PERMANENTLY_ONFIRE, + "TRAIT_PHOTOGRAPHER" = TRAIT_PHOTOGRAPHER, + "TRAIT_PIERCEIMMUNE" = TRAIT_PIERCEIMMUNE, + "TRAIT_PLANT_SAFE" = TRAIT_PLANT_SAFE, + "TRAIT_PLASMA_LOVER_METABOLISM" = TRAIT_PLASMA_LOVER_METABOLISM, "TRAIT_PRESENT_VISION" = TRAIT_PRESENT_VISION, - "TRAIT_DISK_VERIFIER" = TRAIT_DISK_VERIFIER, - "TRAIT_BYPASS_MEASURES" = TRAIT_BYPASS_MEASURES, - "TRAIT_NOMOBSWAP" = TRAIT_NOMOBSWAP, - "TRAIT_XRAY_VISION" = TRAIT_XRAY_VISION, - "TRAIT_WEB_WEAVER" = TRAIT_WEB_WEAVER, - "TRAIT_WEB_SURFER" = TRAIT_WEB_SURFER, - "TRAIT_THERMAL_VISION" = TRAIT_THERMAL_VISION, - "TRAIT_ABDUCTOR_TRAINING" = TRAIT_ABDUCTOR_TRAINING, - "TRAIT_ABDUCTOR_SCIENTIST_TRAINING" = TRAIT_ABDUCTOR_SCIENTIST_TRAINING, - "TRAIT_SURGEON" = TRAIT_SURGEON, - "TRAIT_STRONG_GRABBER" = TRAIT_STRONG_GRABBER, - "TRAIT_SOOTHED_THROAT" = TRAIT_SOOTHED_THROAT, - "TRAIT_BOOZE_SLIDER" = TRAIT_BOOZE_SLIDER, + "TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION" = TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION, + "TRAIT_PRIMITIVE" = TRAIT_PRIMITIVE, //unable to use mechs. Given to Ash Walkers + "TRAIT_PROSOPAGNOSIA" = TRAIT_PROSOPAGNOSIA, + "TRAIT_PULL_BLOCKED" = TRAIT_PULL_BLOCKED, + "TRAIT_PUSHIMMUNE" = TRAIT_PUSHIMMUNE, "TRAIT_QUICK_CARRY" = TRAIT_QUICK_CARRY, "TRAIT_QUICKER_CARRY" = TRAIT_QUICKER_CARRY, - "TRAIT_PLANT_SAFE" = TRAIT_PLANT_SAFE, - "TRAIT_UNINTELLIGIBLE_SPEECH" = TRAIT_UNINTELLIGIBLE_SPEECH, - "TRAIT_UNSTABLE" = TRAIT_UNSTABLE, - "TRAIT_OIL_FRIED" = TRAIT_OIL_FRIED, - "TRAIT_MEDICAL_HUD" = TRAIT_MEDICAL_HUD, + "TRAIT_RADIMMUNE" = TRAIT_RADIMMUNE, + "TRAIT_RESISTCOLD" = TRAIT_RESISTCOLD, + "TRAIT_RESISTHEAT" = TRAIT_RESISTHEAT, + "TRAIT_RESISTHEATHANDS" = TRAIT_RESISTHEATHANDS, + "TRAIT_RESISTHIGHPRESSURE" = TRAIT_RESISTHIGHPRESSURE, + "TRAIT_RESISTLOWPRESSURE" = TRAIT_RESISTLOWPRESSURE, + "TRAIT_RESTRAINED" = TRAIT_RESTRAINED, "TRAIT_SECURITY_HUD" = TRAIT_SECURITY_HUD, - "TRAIT_DIAGNOSTIC_HUD" = TRAIT_DIAGNOSTIC_HUD, - "TRAIT_TRAIT_MEDIBOTCOMINGTHROUGH" = TRAIT_MEDIBOTCOMINGTHROUGH, - "TRAIT_PASSTABLE" = TRAIT_PASSTABLE, - "TRAIT_NOFLASH" = TRAIT_NOFLASH, - "TRAIT_XENO_IMMUNE" = TRAIT_XENO_IMMUNE, - "TRAIT_NAIVE" = TRAIT_NAIVE, - "TRAIT_PRIMITIVE" = TRAIT_PRIMITIVE, //unable to use mechs. Given to Ash Walkers - "TRAIT_GUNFLIP" = TRAIT_GUNFLIP, - "TRAIT_SPECIAL_TRAUMA_BOOST" = TRAIT_SPECIAL_TRAUMA_BOOST, - "TRAIT_SPACEWALK" = TRAIT_SPACEWALK, - "TRAIT_GAMERGOD" = TRAIT_GAMERGOD, - "TRAIT_GIANT" = TRAIT_GIANT, - "TRAIT_DWARF" = TRAIT_DWARF, - "TRAIT_SILENT_FOOTSTEPS" = TRAIT_SILENT_FOOTSTEPS, - "TRAIT_NICE_SHOT" = TRAIT_NICE_SHOT, - "TRAIT_TUMOR_SUPPRESSION" = TRAIT_TUMOR_SUPPRESSED, - "TRAIT_PERMANENTLY_ONFIRE" = TRAIT_PERMANENTLY_ONFIRE, - "TRAIT_SIGN_LANG" = TRAIT_SIGN_LANG, - "TRAIT_UNDERWATER_BASKETWEAVING_KNOWLEDGE" = TRAIT_UNDERWATER_BASKETWEAVING_KNOWLEDGE, - "TRAIT_WINE_TASTER" = TRAIT_WINE_TASTER, - "TRAIT_BONSAI" = TRAIT_BONSAI, - "TRAIT_LIGHTBULB_REMOVER" = TRAIT_LIGHTBULB_REMOVER, - "TRAIT_KNOW_ROBO_WIRES" = TRAIT_KNOW_ROBO_WIRES, - "TRAIT_KNOW_ENGI_WIRES" = TRAIT_KNOW_ENGI_WIRES, - "TRAIT_ALCOHOL_TOLERANCE" = TRAIT_ALCOHOL_TOLERANCE, - "TRAIT_AGEUSIA" = TRAIT_AGEUSIA, - "TRAIT_HEAVY_SLEEPER" = TRAIT_HEAVY_SLEEPER, - "TRAIT_GIFTED" = TRAIT_GIFTED, // SKYRAT EDIT - ADDITION - "TRAIT_NIGHT_VISION" = TRAIT_NIGHT_VISION, - "TRAIT_LIGHT_STEP" = TRAIT_LIGHT_STEP, - "TRAIT_SPIRITUAL" = TRAIT_SPIRITUAL, - "TRAIT_CLOWN_ENJOYER" = TRAIT_CLOWN_ENJOYER, - "TRAIT_MIME_FAN" = TRAIT_MIME_FAN, - "TRAIT_VORACIOUS" = TRAIT_VORACIOUS, "TRAIT_SELF_AWARE" = TRAIT_SELF_AWARE, - "TRAIT_FREERUNNING" = TRAIT_FREERUNNING, "TRAIT_SETTLER" = TRAIT_SETTLER, + "TRAIT_SHIFTY_EYES" = TRAIT_SHIFTY_EYES, + "TRAIT_SHOCKIMMUNE" = TRAIT_SHOCKIMMUNE, + "TRAIT_SIGN_LANG" = TRAIT_SIGN_LANG, + "TRAIT_SILENT_FOOTSTEPS" = TRAIT_SILENT_FOOTSTEPS, + "TRAIT_SIXTHSENSE" = TRAIT_SIXTHSENSE, "TRAIT_SKITTISH" = TRAIT_SKITTISH, - "TRAIT_PROSOPAGNOSIA" = TRAIT_PROSOPAGNOSIA, - "TRAIT_TAGGER" = TRAIT_TAGGER, - "TRAIT_PHOTOGRAPHER" = TRAIT_PHOTOGRAPHER, - "TRAIT_MUSICIAN" = TRAIT_MUSICIAN, - "TRAIT_LIGHT_DRINKER" = TRAIT_LIGHT_DRINKER, + "TRAIT_SLEEPIMMUNE" = TRAIT_SLEEPIMMUNE, "TRAIT_SMOKER" = TRAIT_SMOKER, - "TRAIT_EMPATH" = TRAIT_EMPATH, - "TRAIT_FRIENDLY" = TRAIT_FRIENDLY, - "TRAIT_GRABWEAKNESS" = TRAIT_GRABWEAKNESS, "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_USES_SKINTONES" = TRAIT_USES_SKINTONES, - "TRAIT_MUTANT_COLORS" = TRAIT_MUTANT_COLORS, - "TRAIT_FIXED_MUTANT_COLORS" = TRAIT_FIXED_MUTANT_COLORS, - "TRAIT_FIXED_HAIRCOLOR" = TRAIT_FIXED_HAIRCOLOR, - "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, - "TRAIT_NO_SOUL" = TRAIT_NO_SOUL, - "TRAIT_INVISIBLE_MAN" = TRAIT_INVISIBLE_MAN, - "TRAIT_SACRIFICED" = TRAIT_SACRIFICED, //SKYRAT CHANGE - SOULSTONE_CHANGES - "TRAIT_HIDE_EXTERNAL_ORGANS" = TRAIT_HIDE_EXTERNAL_ORGANS, - "TRAIT_CULT_HALO" = TRAIT_CULT_HALO, - "TRAIT_UNNATURAL_RED_GLOWY_EYES" = TRAIT_UNNATURAL_RED_GLOWY_EYES, - "TRAIT_BLOODSHOT_EYES" = TRAIT_BLOODSHOT_EYES, - "TRAIT_SHIFTY_EYES" = TRAIT_SHIFTY_EYES, - "TRAIT_OVERSIZED" = TRAIT_OVERSIZED, //SKYRAT EDIT ADDITION - Leaving this here so that it hopefully doesn't cause conflicts again in the future(?) - "TRAIT_CANNOT_BE_UNBUCKLED" = TRAIT_CANNOT_BE_UNBUCKLED, - "TRAIT_GAMER" = TRAIT_GAMER, + "TRAIT_SOOTHED_THROAT" = TRAIT_SOOTHED_THROAT, + "TRAIT_SPACEWALK" = TRAIT_SPACEWALK, + "TRAIT_SPECIAL_TRAUMA_BOOST" = TRAIT_SPECIAL_TRAUMA_BOOST, + "TRAIT_SPIRITUAL" = TRAIT_SPIRITUAL, + "TRAIT_STABLEHEART" = TRAIT_STABLEHEART, + "TRAIT_STABLELIVER" = TRAIT_STABLELIVER, + "TRAIT_STRONG_GRABBER" = TRAIT_STRONG_GRABBER, + "TRAIT_STUNIMMUNE" = TRAIT_STUNIMMUNE, + "TRAIT_SURGEON" = TRAIT_SURGEON, + "TRAIT_SURGICALLY_ANALYZED" = TRAIT_SURGICALLY_ANALYZED, + "TRAIT_TAGGER" = TRAIT_TAGGER, + "TRAIT_TENTACLE_IMMUNE" = TRAIT_TENTACLE_IMMUNE, + "TRAIT_TESLA_SHOCKIMMUNE" = TRAIT_TESLA_SHOCKIMMUNE, + "TRAIT_THERMAL_VISION" = TRAIT_THERMAL_VISION, + "TRAIT_TOXIMMUNE" = TRAIT_TOXIMMUNE, + "TRAIT_TOXINLOVER" = TRAIT_TOXINLOVER, + "TRAIT_TRAIT_MEDIBOTCOMINGTHROUGH" = TRAIT_MEDIBOTCOMINGTHROUGH, + "TRAIT_TUMOR_SUPPRESSION" = TRAIT_TUMOR_SUPPRESSED, + "TRAIT_UI_BLOCKED" = TRAIT_UI_BLOCKED, + "TRAIT_UNDENSE" = TRAIT_UNDENSE, + "TRAIT_UNDERWATER_BASKETWEAVING_KNOWLEDGE" = TRAIT_UNDERWATER_BASKETWEAVING_KNOWLEDGE, + //"TRAIT_UNHUSKABLE" = TRAIT_UNHUSKABLE, SKYRAT EDIT - TODO - These require transformation sting pr + "TRAIT_UNINTELLIGIBLE_SPEECH" = TRAIT_UNINTELLIGIBLE_SPEECH, "TRAIT_UNKNOWN" = TRAIT_UNKNOWN, - "TRAIT_CHASM_DESTROYED" = TRAIT_CHASM_DESTROYED, - "TRAIT_MIMING" = TRAIT_MIMING, - "TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION" = TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION, + "TRAIT_UNNATURAL_RED_GLOWY_EYES" = TRAIT_UNNATURAL_RED_GLOWY_EYES, "TRAIT_UNOBSERVANT" = TRAIT_UNOBSERVANT, - "TRAIT_MORBID" = TRAIT_MORBID, - "TRAIT_UNDENSE" = TRAIT_UNDENSE, - "TRAIT_EXPANDED_FOV" = TRAIT_EXPANDED_FOV, - "TRAIT_GOOD_HEARING" = TRAIT_GOOD_HEARING, + "TRAIT_UNSTABLE" = TRAIT_UNSTABLE, + "TRAIT_USED_DNA_VAULT" = TRAIT_USED_DNA_VAULT, + "TRAIT_USES_SKINTONES" = TRAIT_USES_SKINTONES, + "TRAIT_VIRUSIMMUNE" = TRAIT_VIRUSIMMUNE, + "TRAIT_VORACIOUS" = TRAIT_VORACIOUS, + "TRAIT_WEAK_SOUL" = TRAIT_WEAK_SOUL, + "TRAIT_WEB_SURFER" = TRAIT_WEB_SURFER, + "TRAIT_WEB_WEAVER" = TRAIT_WEB_WEAVER, + "TRAIT_WINE_TASTER" = TRAIT_WINE_TASTER, + "TRAIT_XENO_HOST" = TRAIT_XENO_HOST, + "TRAIT_XENO_IMMUNE" = TRAIT_XENO_IMMUNE, "TRAIT_XRAY_HEARING" = TRAIT_XRAY_HEARING, - "TRAIT_TENTACLE_IMMUNE" = TRAIT_TENTACLE_IMMUNE, - "TRAIT_OVERWATCH_IMMUNE" = TRAIT_OVERWATCH_IMMUNE, - "TRAIT_NO_TRANSFORM" = TRAIT_NO_TRANSFORM, + "TRAIT_XRAY_VISION" = TRAIT_XRAY_VISION, ), - /obj/item/bodypart = list( - "TRAIT_PARALYSIS" = TRAIT_PARALYSIS, - ), - /obj/item/organ/internal/lungs = list( - "TRAIT_SPACEBREATHING" = TRAIT_SPACEBREATHING, - ), - /obj/item/organ/internal/liver = list( - "TRAIT_LAW_ENFORCEMENT_METABOLISM" = TRAIT_LAW_ENFORCEMENT_METABOLISM, - "TRAIT_CULINARY_METABOLISM" = TRAIT_CULINARY_METABOLISM, - "TRAIT_COMEDY_METABOLISM" = TRAIT_COMEDY_METABOLISM, - "TRAIT_MEDICAL_METABOLISM" = TRAIT_MEDICAL_METABOLISM, - "TRAIT_ENGINEER_METABOLISM" = TRAIT_ENGINEER_METABOLISM, - "TRAIT_ROYAL_METABOLISM" = TRAIT_ROYAL_METABOLISM, - "TRAIT_PRETENDER_ROYAL_METABOLISM" = TRAIT_PRETENDER_ROYAL_METABOLISM, - "TRAIT_BALLMER_SCIENTIST" = TRAIT_BALLMER_SCIENTIST, - "TRAIT_MAINTENANCE_METABOLISM" = TRAIT_MAINTENANCE_METABOLISM, - "TRAIT_CORONER_METABOLISM" = TRAIT_CORONER_METABOLISM, - ), /obj/item = list( - "TRAIT_NODROP" = TRAIT_NODROP, - "TRAIT_NO_STORAGE_INSERT" = TRAIT_NO_STORAGE_INSERT, - "TRAIT_T_RAY_VISIBLE" = TRAIT_T_RAY_VISIBLE, - "TRAIT_NO_TELEPORT" = TRAIT_NO_TELEPORT, "TRAIT_APC_SHOCKING" = TRAIT_APC_SHOCKING, - "TRAIT_UNCATCHABLE" = TRAIT_UNCATCHABLE, "TRAIT_DANGEROUS_OBJECT" = TRAIT_DANGEROUS_OBJECT, "TRAIT_GERM_SENSITIVE" = TRAIT_GERM_SENSITIVE, "TRAIT_HAUNTED" = TRAIT_HAUNTED, + "TRAIT_NO_STORAGE_INSERT" = TRAIT_NO_STORAGE_INSERT, + "TRAIT_NO_TELEPORT" = TRAIT_NO_TELEPORT, + "TRAIT_NODROP" = TRAIT_NODROP, + "TRAIT_T_RAY_VISIBLE" = TRAIT_T_RAY_VISIBLE, + "TRAIT_UNCATCHABLE" = TRAIT_UNCATCHABLE, ), - /atom = list( - "TRAIT_KEEP_TOGETHER" = TRAIT_KEEP_TOGETHER, - ), - /atom/movable = list( - "TRAIT_MOVE_GROUND" = TRAIT_MOVE_GROUND, - "TRAIT_MOVE_FLYING" = TRAIT_MOVE_FLYING, - "TRAIT_MOVE_VENTCRAWLING" = TRAIT_MOVE_VENTCRAWLING, - "TRAIT_MOVE_FLOATING" = TRAIT_MOVE_FLOATING, - "TRAIT_MOVE_PHASING" = TRAIT_MOVE_PHASING, - "TRAIT_LAVA_IMMUNE" = TRAIT_LAVA_IMMUNE, - "TRAIT_ASHSTORM_IMMUNE" = TRAIT_ASHSTORM_IMMUNE, - "TRAIT_SNOWSTORM_IMMUNE" = TRAIT_SNOWSTORM_IMMUNE, - "TRAIT_VOIDSTORM_IMMUNE" = TRAIT_VOIDSTORM_IMMUNE, - "TRAIT_WEATHER_IMMUNE" = TRAIT_WEATHER_IMMUNE, - "TRAIT_RUNECHAT_HIDDEN" = TRAIT_RUNECHAT_HIDDEN, - "TRAIT_HAS_LABEL" = TRAIT_HAS_LABEL, - ), + /obj/item/bodypart = list( + "TRAIT_PARALYSIS" = TRAIT_PARALYSIS, + ), /obj/item/card/id = list( "TRAIT_MAGNETIC_ID_CARD" = TRAIT_MAGNETIC_ID_CARD, ), /obj/item/fish = list( - "TRAIT_RESIST_EMULSIFY" = TRAIT_RESIST_EMULSIFY, - "TRAIT_FISH_SELF_REPRODUCE" = TRAIT_FISH_SELF_REPRODUCE, - "TRAIT_FISH_NO_MATING" = TRAIT_FISH_NO_MATING, - "TRAIT_YUCKY_FISH" = TRAIT_YUCKY_FISH, - "TRAIT_FISH_TOXIN_IMMUNE" = TRAIT_FISH_TOXIN_IMMUNE, "TRAIT_FISH_CROSSBREEDER" = TRAIT_FISH_CROSSBREEDER, "TRAIT_FISH_FED_LUBE" = TRAIT_FISH_FED_LUBE, "TRAIT_FISH_NO_HUNGER" = TRAIT_FISH_NO_HUNGER, + "TRAIT_FISH_NO_MATING" = TRAIT_FISH_NO_MATING, + "TRAIT_FISH_SELF_REPRODUCE" = TRAIT_FISH_SELF_REPRODUCE, + "TRAIT_FISH_TOXIN_IMMUNE" = TRAIT_FISH_TOXIN_IMMUNE, + "TRAIT_RESIST_EMULSIFY" = TRAIT_RESIST_EMULSIFY, + "TRAIT_YUCKY_FISH" = TRAIT_YUCKY_FISH, + ), + /obj/item/organ/internal/liver = list( + "TRAIT_BALLMER_SCIENTIST" = TRAIT_BALLMER_SCIENTIST, + "TRAIT_COMEDY_METABOLISM" = TRAIT_COMEDY_METABOLISM, + "TRAIT_CORONER_METABOLISM" = TRAIT_CORONER_METABOLISM, + "TRAIT_CULINARY_METABOLISM" = TRAIT_CULINARY_METABOLISM, + "TRAIT_ENGINEER_METABOLISM" = TRAIT_ENGINEER_METABOLISM, + "TRAIT_LAW_ENFORCEMENT_METABOLISM" = TRAIT_LAW_ENFORCEMENT_METABOLISM, + "TRAIT_MAINTENANCE_METABOLISM" = TRAIT_MAINTENANCE_METABOLISM, + "TRAIT_MEDICAL_METABOLISM" = TRAIT_MEDICAL_METABOLISM, + "TRAIT_PRETENDER_ROYAL_METABOLISM" = TRAIT_PRETENDER_ROYAL_METABOLISM, + "TRAIT_ROYAL_METABOLISM" = TRAIT_ROYAL_METABOLISM, + ), + /obj/item/organ/internal/lungs = list( + "TRAIT_SPACEBREATHING" = TRAIT_SPACEBREATHING, ), )) -/// value -> trait name, generated on use from trait_by_type global -GLOBAL_LIST(trait_name_map) +/// value -> trait name, generated as needed for adminning. +GLOBAL_LIST(admin_trait_name_map) -/proc/generate_trait_name_map() +/proc/generate_admin_trait_name_map() . = list() - for(var/key in GLOB.traits_by_type) - for(var/tname in GLOB.traits_by_type[key]) - var/val = GLOB.traits_by_type[key][tname] + for(var/key in GLOB.admin_visible_traits) + for(var/tname in GLOB.admin_visible_traits[key]) + var/val = GLOB.admin_visible_traits[key][tname] .[val] = tname -GLOBAL_LIST_INIT(movement_type_trait_to_flag, list( - TRAIT_MOVE_GROUND = GROUND, - TRAIT_MOVE_FLYING = FLYING, - TRAIT_MOVE_VENTCRAWLING = VENTCRAWLING, - TRAIT_MOVE_FLOATING = FLOATING, - TRAIT_MOVE_PHASING = PHASING - )) - -GLOBAL_LIST_INIT(movement_type_addtrait_signals, set_movement_type_addtrait_signals()) -GLOBAL_LIST_INIT(movement_type_removetrait_signals, set_movement_type_removetrait_signals()) - -/proc/set_movement_type_addtrait_signals(signal_prefix) - . = list() - for(var/trait in GLOB.movement_type_trait_to_flag) - . += SIGNAL_ADDTRAIT(trait) - -/proc/set_movement_type_removetrait_signals(signal_prefix) - . = list() - for(var/trait in GLOB.movement_type_trait_to_flag) - . += SIGNAL_REMOVETRAIT(trait) + return . diff --git a/code/datums/saymode.dm b/code/datums/saymode.dm index e2425ce92b1..7e227268495 100644 --- a/code/datums/saymode.dm +++ b/code/datums/saymode.dm @@ -23,7 +23,7 @@ var/datum/antagonist/changeling/ling_sender = user.mind.has_antag_datum(/datum/antagonist/changeling) if(!ling_sender) return FALSE - if(HAS_TRAIT(user, CHANGELING_HIVEMIND_MUTE)) + if(HAS_TRAIT(user, TRAIT_CHANGELING_HIVEMIND_MUTE)) to_chat(user, span_warning("The poison in the air hinders our ability to interact with the hivemind.")) return FALSE @@ -39,7 +39,7 @@ if(!isliving(ling_mob) || issilicon(ling_mob) || isbrain(ling_mob)) continue // can't recieve messages on the hivemind right now - if(HAS_TRAIT(ling_mob, CHANGELING_HIVEMIND_MUTE)) + if(HAS_TRAIT(ling_mob, TRAIT_CHANGELING_HIVEMIND_MUTE)) continue to_chat(ling_mob, msg) diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm index 7d211b9ae29..a2b3647df01 100644 --- a/code/datums/wounds/_wounds.dm +++ b/code/datums/wounds/_wounds.dm @@ -16,11 +16,6 @@ #define WOUND_CRITICAL_BLUNT_DISMEMBER_BONUS 15 -// Applied into wounds when they're scanned with the wound analyzer, halves time to treat them manually. -#define TRAIT_WOUND_SCANNED "wound_scanned" -// I dunno lol -#define ANALYZER_TRAIT "analyzer_trait" - /datum/wound /// What it's named var/name = "Wound" diff --git a/code/game/objects/items/food/bait.dm b/code/game/objects/items/food/bait.dm index 5ac24baa578..aa9a0e7bd9e 100644 --- a/code/game/objects/items/food/bait.dm +++ b/code/game/objects/items/food/bait.dm @@ -66,4 +66,4 @@ /obj/item/food/bait/doughball/synthetic/Initialize(mapload) . = ..() - ADD_TRAIT(src, OMNI_BAIT_TRAIT, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_OMNI_BAIT, INNATE_TRAIT) diff --git a/code/game/objects/structures/crates_lockers/closets/bodybag.dm b/code/game/objects/structures/crates_lockers/closets/bodybag.dm index ffd4434825c..bfed8bea979 100644 --- a/code/game/objects/structures/crates_lockers/closets/bodybag.dm +++ b/code/game/objects/structures/crates_lockers/closets/bodybag.dm @@ -192,8 +192,7 @@ /obj/structure/closet/body_bag/environmental/Initialize(mapload) . = ..() - for(var/trait in weather_protection) - ADD_TRAIT(src, trait, ROUNDSTART_TRAIT) + add_traits(weather_protection, INNATE_TRAIT) refresh_air() /obj/structure/closet/body_bag/environmental/Destroy() diff --git a/code/modules/admin/verbs/admin.dm b/code/modules/admin/verbs/admin.dm index b851d0a5b4b..ad54e75fc40 100644 --- a/code/modules/admin/verbs/admin.dm +++ b/code/modules/admin/verbs/admin.dm @@ -128,14 +128,14 @@ switch(add_or_remove) if("Add") - for(var/key in GLOB.traits_by_type) + for(var/key in GLOB.admin_visible_traits) if(istype(D,key)) - available_traits += GLOB.traits_by_type[key] + available_traits += GLOB.admin_visible_traits[key] if("Remove") - if(!GLOB.trait_name_map) - GLOB.trait_name_map = generate_trait_name_map() + if(!GLOB.admin_trait_name_map) + GLOB.admin_trait_name_map = generate_admin_trait_name_map() for(var/trait in D._status_traits) - var/name = GLOB.trait_name_map[trait] || trait + var/name = GLOB.admin_trait_name_map[trait] || trait available_traits[name] = trait var/chosen_trait = input("Select trait to modify", "Trait") as null|anything in sort_list(available_traits) diff --git a/code/modules/fishing/fish/fish_traits.dm b/code/modules/fishing/fish/fish_traits.dm index 63de4cfdf1d..f247d11ef84 100644 --- a/code/modules/fishing/fish/fish_traits.dm +++ b/code/modules/fishing/fish/fish_traits.dm @@ -70,7 +70,7 @@ GLOBAL_LIST_INIT(fish_traits, init_subtypes_w_path_keys(/datum/fish_trait, list( if(!rod.bait) .[MULTIPLICATIVE_FISHING_MOD] = 0 return - if(HAS_TRAIT(rod.bait, OMNI_BAIT_TRAIT)) + if(HAS_TRAIT(rod.bait, TRAIT_OMNI_BAIT)) return if(HAS_TRAIT(rod.bait, TRAIT_GOOD_QUALITY_BAIT) || HAS_TRAIT(rod.bait, TRAIT_GREAT_QUALITY_BAIT)) .[MULTIPLICATIVE_FISHING_MOD] = 0 @@ -115,7 +115,7 @@ GLOBAL_LIST_INIT(fish_traits, init_subtypes_w_path_keys(/datum/fish_trait, list( if(!rod.bait) .[MULTIPLICATIVE_FISHING_MOD] = 0 return - if(HAS_TRAIT(rod.bait, OMNI_BAIT_TRAIT)) + if(HAS_TRAIT(rod.bait, TRAIT_OMNI_BAIT)) return if(!istype(rod.bait, /obj/item/food)) .[MULTIPLICATIVE_FISHING_MOD] = 0 @@ -134,7 +134,7 @@ GLOBAL_LIST_INIT(fish_traits, init_subtypes_w_path_keys(/datum/fish_trait, list( if(!rod.bait) .[MULTIPLICATIVE_FISHING_MOD] = 0 return - if(HAS_TRAIT(rod.bait, OMNI_BAIT_TRAIT)) + if(HAS_TRAIT(rod.bait, TRAIT_OMNI_BAIT)) return if(!istype(rod.bait, /obj/item/food/grown)) .[MULTIPLICATIVE_FISHING_MOD] = 0 diff --git a/code/modules/fishing/sources/_fish_source.dm b/code/modules/fishing/sources/_fish_source.dm index 7ef43238957..5061d84a018 100644 --- a/code/modules/fishing/sources/_fish_source.dm +++ b/code/modules/fishing/sources/_fish_source.dm @@ -250,7 +250,7 @@ GLOBAL_LIST(fishing_property_cache) final_table[result] = round(final_table[result] * 3.5, 1) else if(HAS_TRAIT(bait, TRAIT_BASIC_QUALITY_BAIT)) final_table[result] *= 2 - if(!HAS_TRAIT(bait, OMNI_BAIT_TRAIT)) + if(!HAS_TRAIT(bait, TRAIT_OMNI_BAIT)) //Bait matching likes doubles the chance var/list/fav_bait = fish_list_properties[result][NAMEOF(caught_fish, favorite_bait)] for(var/bait_identifer in fav_bait) diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index cf3835e247a..359c3edf4ea 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -702,9 +702,9 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) /obj/effect/mapping_helpers/atom_injector/trait_injector/check_validity() if(!istext(trait_name)) CRASH("Wrong trait in [type] - [trait_name] is not a trait") - if(!GLOB.trait_name_map) - GLOB.trait_name_map = generate_trait_name_map() - if(!GLOB.trait_name_map.Find(trait_name)) + if(!GLOB.global_trait_name_map) + GLOB.global_trait_name_map = generate_global_trait_name_map() + if(!GLOB.global_trait_name_map.Find(trait_name)) stack_trace("Possibly wrong trait in [type] - [trait_name] is not a trait in the global trait list") return TRUE diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index c72ac608fa5..3d407473d77 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2554,11 +2554,11 @@ /datum/reagent/bz_metabolites/on_mob_metabolize(mob/living/ling) . = ..() - ADD_TRAIT(ling, CHANGELING_HIVEMIND_MUTE, type) + ADD_TRAIT(ling, TRAIT_CHANGELING_HIVEMIND_MUTE, type) /datum/reagent/bz_metabolites/on_mob_end_metabolize(mob/living/ling) . = ..() - REMOVE_TRAIT(ling, CHANGELING_HIVEMIND_MUTE, type) + REMOVE_TRAIT(ling, TRAIT_CHANGELING_HIVEMIND_MUTE, type) /datum/reagent/bz_metabolites/on_mob_life(mob/living/carbon/target, seconds_per_tick, times_fired) . = ..() diff --git a/tgstation.dme b/tgstation.dme index 6646e60543c..a76b984c3cc 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -232,7 +232,6 @@ #include "code\__DEFINES\tools.dm" #include "code\__DEFINES\toys.dm" #include "code\__DEFINES\trader.dm" -#include "code\__DEFINES\traits.dm" #include "code\__DEFINES\transport.dm" #include "code\__DEFINES\tts.dm" #include "code\__DEFINES\turbine_defines.dm" @@ -372,6 +371,10 @@ #include "code\__DEFINES\research\anomalies.dm" #include "code\__DEFINES\research\research_categories.dm" #include "code\__DEFINES\research\slimes.dm" +#include "code\__DEFINES\traits\_traits.dm" +#include "code\__DEFINES\traits\declarations.dm" +#include "code\__DEFINES\traits\macros.dm" +#include "code\__DEFINES\traits\sources.dm" #include "code\__DEFINES\~ff_defines\DNA.dm" #include "code\__DEFINES\~ff_defines\nabber_clothes_pathes.dm" #include "code\__DEFINES\~ff_defines\say.dm" @@ -600,7 +603,6 @@ #include "code\_globalvars\religion.dm" #include "code\_globalvars\tgui.dm" #include "code\_globalvars\time_vars.dm" -#include "code\_globalvars\traits.dm" #include "code\_globalvars\lists\achievements.dm" #include "code\_globalvars\lists\ambience.dm" #include "code\_globalvars\lists\client.dm" @@ -623,6 +625,8 @@ #include "code\_globalvars\lists\typecache.dm" #include "code\_globalvars\lists\wiremod.dm" #include "code\_globalvars\lists\xenobiology.dm" +#include "code\_globalvars\traits\_traits.dm" +#include "code\_globalvars\traits\admin_tooling.dm" #include "code\_js\byjax.dm" #include "code\_js\menus.dm" #include "code\_onclick\adjacent.dm"