From 4da6e9915103f5e354061e47a9cb674ab9f0b2c9 Mon Sep 17 00:00:00 2001 From: Bloop <13398309+vinylspiders@users.noreply.github.com> Date: Sun, 19 Nov 2023 18:12:03 -0500 Subject: [PATCH 1/3] [MISSED MIRROR] Puts all traits in the globalvars file + CI Testing (#79642) (#25131) * Puts all traits in the globalvars file + CI Testing (#79642) Fixes #76349 I didn't know that people needed to add any new traits to a global list so they can be easily read in View Variables, and was pretty shocked to find out many other people didn't know it was a thing. Let's make it a thing by testing it using a new CI Python Linter to check this. But oh no- ![image](https://github.com/tgstation/tgstation/assets/34697715/c093f1a8-00ce-40a6-8e1d-f344107ce7b8) There were about 200+ missing traits. Alright, so let's do the following: * Move trait defines to their own dedicated folder in the `_DEFINES` folder. * Split up the traits mega-file into different files, for better organization. One for the macros, one for the sources, and a few for the "trait declarations" * Run the linter a load of times and add everything to the globalvars file, removing anything that's no longer used and figuring out where the best categorization of it is. also minor code improvements. also rename all of the ones that look weird. also fix list indentations * Also alphabetize the lists because it's easy * Move everything to a new `traits_by_type` list, while keeping the admin one the way it is for the time being while we figure out a better way to show that list to admins. * Profit Mapping trait injectors will now work for any type of trait. You shouldn't add any trait via this injector though, but you're no longer limited to coders remembering to add it to that critical list you needed. Lays the framework for a better view variables experience. This work is too lengthy to presently do, but hopefully we can get this done sooner rather than later. we will need a code-accessible way to view these traits for such a framework to be implemented, so let's just do that. Future steps are to break down the mega-declarations file into a folder full of separate files by typepath, but that requires a lot of auditing. Does need to happen one day though, there's a lot of mob traits mingled with datum traits and auuugh we gotta do this later this PR is already massive. there's probably ways to game this but this catches _my_ mistakes so good luck to everyone else (it should work for 99% of everyone) Nothing applicable to players. However, to mappers, the mapping trait injector should always be able to add any kind of trait (which is rather good for the times when you need it). * Update tgstation.dme * Update _traits.dm * Comment these out for now --------- Co-authored-by: san7890 --- .github/workflows/ci_suite.yml | 17 +- code/__DEFINES/traits/_traits.dm | 122 ++++ .../{traits.dm => traits/declarations.dm} | 441 +------------ code/__DEFINES/traits/macros.dm | 11 + code/__DEFINES/traits/sources.dm | 272 ++++++++ code/_globalvars/traits/_traits.dm | 589 ++++++++++++++++++ .../{traits.dm => traits/admin_tooling.dm} | 309 +++++++-- code/datums/saymode.dm | 4 +- code/datums/wounds/_wounds.dm | 5 - code/game/objects/items/food/bait.dm | 2 +- .../crates_lockers/closets/bodybag.dm | 3 +- code/modules/admin/verbs/admin.dm | 10 +- code/modules/fishing/fish/fish_traits.dm | 6 +- code/modules/fishing/sources/_fish_source.dm | 2 +- code/modules/mapping/mapping_helpers.dm | 6 +- .../chemistry/reagents/other_reagents.dm | 4 +- tgstation.dme | 11 +- tools/trait_validity/check.py | 88 +++ 18 files changed, 1422 insertions(+), 480 deletions(-) create mode 100644 code/__DEFINES/traits/_traits.dm rename code/__DEFINES/{traits.dm => traits/declarations.dm} (76%) create mode 100644 code/__DEFINES/traits/macros.dm create mode 100644 code/__DEFINES/traits/sources.dm create mode 100644 code/_globalvars/traits/_traits.dm rename code/_globalvars/{traits.dm => traits/admin_tooling.dm} (51%) create mode 100644 tools/trait_validity/check.py 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 51% rename from code/_globalvars/traits.dm rename to code/_globalvars/traits/admin_tooling.dm index 4e83823b4d9..8d74c79901e 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD:code/_globalvars/traits.dm /* FUN ZONE OF ADMIN LISTINGS Try to keep this in sync with __DEFINES/traits.dm @@ -248,65 +249,295 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_GERM_SENSITIVE" = TRAIT_GERM_SENSITIVE, "TRAIT_HAUNTED" = TRAIT_HAUNTED, ), +======= +// 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( +>>>>>>> 17cba0dcc ([MISSED MIRROR] Puts all traits in the globalvars file + CI Testing (#79642) (#25131)):code/_globalvars/traits/admin_tooling.dm /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_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_LAVA_IMMUNE" = TRAIT_LAVA_IMMUNE, - "TRAIT_ASHSTORM_IMMUNE" = TRAIT_ASHSTORM_IMMUNE, + "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, - "TRAIT_RUNECHAT_HIDDEN" = TRAIT_RUNECHAT_HIDDEN, - "TRAIT_HAS_LABEL" = TRAIT_HAS_LABEL, + ), + /mob = list( + "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_CULT_HALO" = TRAIT_CULT_HALO, + "TRAIT_DEAF" = TRAIT_DEAF, + "TRAIT_DEATHCOMA" = TRAIT_DEATHCOMA, + "TRAIT_DEFIB_BLACKLISTED" = TRAIT_DEFIB_BLACKLISTED, + "TRAIT_DEPRESSION" = TRAIT_DEPRESSION, + "TRAIT_DIAGNOSTIC_HUD" = TRAIT_DIAGNOSTIC_HUD, + "TRAIT_DISCOORDINATED_TOOL_USER" = TRAIT_DISCOORDINATED_TOOL_USER, + "TRAIT_DISFIGURED" = TRAIT_DISFIGURED, + "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_HAS_MARKINGS" = TRAIT_HAS_MARKINGS, + "TRAIT_HEAVY_SLEEPER" = TRAIT_HEAVY_SLEEPER, + "TRAIT_HIDE_EXTERNAL_ORGANS" = TRAIT_HIDE_EXTERNAL_ORGANS, + "TRAIT_HOLY" = TRAIT_HOLY, + "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_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_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_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_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_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_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_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_SELF_AWARE" = TRAIT_SELF_AWARE, + "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_SLEEPIMMUNE" = TRAIT_SLEEPIMMUNE, + "TRAIT_SMOKER" = TRAIT_SMOKER, + "TRAIT_SNOB" = TRAIT_SNOB, + "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_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_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_XRAY_VISION" = TRAIT_XRAY_VISION, + ), + /obj/item = list( + "TRAIT_APC_SHOCKING" = TRAIT_APC_SHOCKING, + "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, ), + /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 1e8582112a3..2b9e9dd7809 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2556,11 +2556,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 ca33f1a6550..5fa9324a062 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,7 @@ #include "code\__DEFINES\research\anomalies.dm" #include "code\__DEFINES\research\research_categories.dm" #include "code\__DEFINES\research\slimes.dm" +<<<<<<< HEAD #include "code\__DEFINES\~ff_defines\DNA.dm" #include "code\__DEFINES\~ff_defines\nabber_clothes_pathes.dm" #include "code\__DEFINES\~ff_defines\say.dm" @@ -381,6 +381,12 @@ #include "code\__DEFINES\~ff_defines\__HELPERS\global_lists.dm" #include "code\__DEFINES\~ff_defines\__HELPERS\ishelpers.dm" #include "code\__DEFINES\~ff_defines\__HELPERS\names.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" +>>>>>>> 17cba0dcc ([MISSED MIRROR] Puts all traits in the globalvars file + CI Testing (#79642) (#25131)) #include "code\__DEFINES\~skyrat_defines\_organ_defines.dm" #include "code\__DEFINES\~skyrat_defines\access.dm" #include "code\__DEFINES\~skyrat_defines\actionspeed_modification.dm" @@ -600,7 +606,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 +628,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" diff --git a/tools/trait_validity/check.py b/tools/trait_validity/check.py new file mode 100644 index 00000000000..b50905b34e5 --- /dev/null +++ b/tools/trait_validity/check.py @@ -0,0 +1,88 @@ +import os +import re +import sys + +define_regex = re.compile(r"(\s+)?#define\s?([A-Z0-9_]+)\(?(.+)\)?") + +def green(text): + return "\033[32m" + str(text) + "\033[0m" + +def red(text): + return "\033[31m" + str(text) + "\033[0m" + +# simple way to check if we're running on github actions, or on a local machine +on_github = os.getenv("GITHUB_ACTIONS") == "true" + +defines_file = "code/__DEFINES/traits/declarations.dm" +globalvars_file = "code/_globalvars/traits/_traits.dm" + +how_to_fix_message = "Please ensure that all traits in the {defines_file} file are added in the {globalvars_file} file." + +def post_error(define_name): + if on_github: + print(f"::error file={defines_file},title=Define Sanity::{define_name} is defined in {defines_file} but not added to {globalvars_file}!") + else: + print(red(f"- Failure: {define_name} is defined in {defines_file} but not added to {globalvars_file}!")) + +number_of_defines = 0 + +if not os.path.isfile(defines_file): + print(red(f"Could not find the defines file '{defines_file}'!")) + sys.exit(1) + +if not os.path.isfile(globalvars_file): + print(red(f"Could not find the globalvars file '{globalvars_file}'!")) + sys.exit(1) + +defines_to_search_for = [] +missing_defines = [] +scannable_lines = [] + +with open(defines_file, 'r') as file: + reading = False + + for line in file: + line = line.strip() + + if line == "// BEGIN TRAIT DEFINES": + reading = True + continue + elif line == "// END TRAIT DEFINES": + break + elif not reading: + continue + + scannable_lines.append(line) + +for potential_define in scannable_lines: + match = define_regex.match(potential_define) + if not match: + continue + + number_of_defines += 1 + defines_to_search_for.append(match.group(2)) + +if number_of_defines == 0: + print(red("No defines found! This is likely an error.")) + sys.exit(1) + +if number_of_defines <= 450: + print(red(f"Only found {number_of_defines} defines! Something has likely gone wrong as the number of local defines should not be this low.")) + sys.exit(1) + +with open(globalvars_file, "r") as file: + globalvars_file_contents = file.read() + for define_name in defines_to_search_for: + searchable_string = "\"" + define_name + "\" = " + define_name + if not re.search(searchable_string, globalvars_file_contents): + missing_defines.append(define_name) + +if len(missing_defines): + for missing_define in missing_defines: + post_error(missing_define) + + print(red(how_to_fix_message)) + sys.exit(1) + +else: + print(green(f"All traits were found in both files! (found {number_of_defines} defines)")) From edb26d15093a8372a2a3c1e5b4661f8025ae69e4 Mon Sep 17 00:00:00 2001 From: Iajret Date: Mon, 20 Nov 2023 17:17:52 +0300 Subject: [PATCH 2/3] Update admin_tooling.dm --- code/_globalvars/traits/admin_tooling.dm | 254 ----------------------- 1 file changed, 254 deletions(-) diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index ecf9274e573..d5d19a25f39 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -1,262 +1,8 @@ -<<<<<<< HEAD:code/_globalvars/traits.dm -/* - 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( - /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_CRITICAL_CONDITION" = TRAIT_CRITICAL_CONDITION, - "TRAIT_LITERATE" = TRAIT_LITERATE, - "TRAIT_ILLITERATE" = TRAIT_ILLITERATE, - "TRAIT_MUTE" = TRAIT_MUTE, - "TRAIT_EMOTEMUTE " = TRAIT_EMOTEMUTE, - "TRAIT_DEAF" = TRAIT_DEAF, - "TRAIT_FAT" = TRAIT_FAT, - "TRAIT_HUSK" = TRAIT_HUSK, - "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_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_EASILY_WOUNDED" = TRAIT_EASILY_WOUNDED, - "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_HOLY" = TRAIT_HOLY, - "TRAIT_DEPRESSION" = TRAIT_DEPRESSION, - "TRAIT_BLOOD_DEFICIENCY" = TRAIT_BLOOD_DEFICIENCY, - "TRAIT_JOLLY" = TRAIT_JOLLY, - "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_SLIP_ICE" = TRAIT_NO_SLIP_ICE, - "TRAIT_NO_SLIP_SLIDE" = TRAIT_NO_SLIP_SLIDE, - "TRAIT_NO_SLIP_ALL" = TRAIT_NO_SLIP_ALL, - "TRAIT_NODEATH" = TRAIT_NODEATH, - "TRAIT_NOHARDCRIT" = TRAIT_NOHARDCRIT, - "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_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_LEG" = TRAIT_PARALYSIS_R_LEG, - "TRAIT_CANNOT_OPEN_PRESENTS" = TRAIT_CANNOT_OPEN_PRESENTS, - "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_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_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_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_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_UNKNOWN" = TRAIT_UNKNOWN, - "TRAIT_CHASM_DESTROYED" = TRAIT_CHASM_DESTROYED, - "TRAIT_MIMING" = TRAIT_MIMING, - "TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION" = TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION, - "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_XRAY_HEARING" = TRAIT_XRAY_HEARING, - "TRAIT_TENTACLE_IMMUNE" = TRAIT_TENTACLE_IMMUNE, - "TRAIT_OVERWATCH_IMMUNE" = TRAIT_OVERWATCH_IMMUNE, - "TRAIT_NO_TRANSFORM" = TRAIT_NO_TRANSFORM, - ), - /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, - ), -======= // 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( ->>>>>>> 17cba0dcc ([MISSED MIRROR] Puts all traits in the globalvars file + CI Testing (#79642) (#25131)):code/_globalvars/traits/admin_tooling.dm /atom = list( "TRAIT_KEEP_TOGETHER" = TRAIT_KEEP_TOGETHER, ), From 685395659b7fedd5b9a914a986f03f846ea31983 Mon Sep 17 00:00:00 2001 From: Iajret Date: Mon, 20 Nov 2023 17:24:35 +0300 Subject: [PATCH 3/3] dme --- tgstation.dme | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/tgstation.dme b/tgstation.dme index a9c3453644d..a76b984c3cc 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -371,7 +371,10 @@ #include "code\__DEFINES\research\anomalies.dm" #include "code\__DEFINES\research\research_categories.dm" #include "code\__DEFINES\research\slimes.dm" -<<<<<<< HEAD +#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" @@ -381,12 +384,6 @@ #include "code\__DEFINES\~ff_defines\__HELPERS\global_lists.dm" #include "code\__DEFINES\~ff_defines\__HELPERS\ishelpers.dm" #include "code\__DEFINES\~ff_defines\__HELPERS\names.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" ->>>>>>> 17cba0dcc ([MISSED MIRROR] Puts all traits in the globalvars file + CI Testing (#79642) (#25131)) #include "code\__DEFINES\~skyrat_defines\_organ_defines.dm" #include "code\__DEFINES\~skyrat_defines\access.dm" #include "code\__DEFINES\~skyrat_defines\actionspeed_modification.dm"