diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 25fd070a663..656c2f1592a 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -281,6 +281,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define CHOKEHOLD_TRAIT "chokehold" //trait associated to being held in a chokehold #define RESTING_TRAIT "resting" //trait associated to resting #define STAT_TRAIT "stat" //trait associated to a stat value or range of +#define MAPPING_HELPER_TRAIT "mapping-helper" //obtained from mapping helper // unique trait sources, still defines #define CLONING_POD_TRAIT "cloning-pod" diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index e3de3a9ae37..287d168c329 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -5,6 +5,11 @@ */ GLOBAL_LIST_INIT(traits_by_type, list( /mob = list( + "TRAIT_KNOCKEDOUT" = TRAIT_KNOCKEDOUT, + "TRAIT_IMMOBILIZED" = TRAIT_IMMOBILIZED, + "TRAIT_FLOORED" = TRAIT_FLOORED, + "TRAIT_INCAPACITATED" = TRAIT_INCAPACITATED, + "TRAIT_CRITICAL_CONDITION" = TRAIT_CRITICAL_CONDITION, "TRAIT_BLIND" = TRAIT_BLIND, "TRAIT_MUTE" = TRAIT_MUTE, "TRAIT_EMOTEMUTE " = TRAIT_EMOTEMUTE, @@ -24,8 +29,9 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_FAKEDEATH" = TRAIT_FAKEDEATH, "TRAIT_DISFIGURED" = TRAIT_DISFIGURED, "TRAIT_XENO_HOST" = TRAIT_XENO_HOST, - "TRAIT_STUNRESISTANCE" = TRAIT_STUNRESISTANCE, "TRAIT_STUNIMMUNE" = TRAIT_STUNIMMUNE, + "TRAIT_STUNRESISTANCE" = TRAIT_STUNRESISTANCE, + "TRAIT_IWASBATONED" = TRAIT_IWASBATONED, "TRAIT_SLEEPIMMUNE" = TRAIT_SLEEPIMMUNE, "TRAIT_PUSHIMMUNE" = TRAIT_PUSHIMMUNE, "TRAIT_SHOCKIMMUNE" = TRAIT_SHOCKIMMUNE, @@ -53,6 +59,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_LIMBATTACHMENT" = TRAIT_LIMBATTACHMENT, "TRAIT_NOLIMBDISABLE" = TRAIT_NOLIMBDISABLE, "TRAIT_EASYLIMBWOUND" = TRAIT_EASYLIMBWOUND, + "TRAIT_HARDLIMBWOUND" = TRAIT_HARDLIMBWOUND, "TRAIT_TOXINLOVER" = TRAIT_TOXINLOVER, "TRAIT_NOBREATH" = TRAIT_NOBREATH, "TRAIT_ANTIMAGIC" = TRAIT_ANTIMAGIC, @@ -96,29 +103,65 @@ GLOBAL_LIST_INIT(traits_by_type, list( "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_BLOODCRAWL_EAT" = TRAIT_BLOODCRAWL_EAT, "TRAIT_SPACEWALK" = TRAIT_SPACEWALK, "TRAIT_GAMERGOD" = TRAIT_GAMERGOD, - "TRAIT_DWARF" = TRAIT_DWARF, "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_PERMANENTLY_ONFIRE" = TRAIT_PERMANENTLY_ONFIRE, + "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_CYBORG_WIRES" = TRAIT_KNOW_CYBORG_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_NIGHT_VISION" = TRAIT_NIGHT_VISION, + "TRAIT_LIGHT_STEP" = TRAIT_LIGHT_STEP, + "TRAIT_SPIRITUAL" = TRAIT_SPIRITUAL, + "TRAIT_FAN_CLOWN" = TRAIT_FAN_CLOWN, + "TRAIT_FAN_MIME" = TRAIT_FAN_MIME, + "TRAIT_VORACIOUS" = TRAIT_VORACIOUS, + "TRAIT_SELF_AWARE" = TRAIT_SELF_AWARE, + "TRAIT_FREERUNNING" = TRAIT_FREERUNNING, + "TRAIT_SKITTISH" = TRAIT_SKITTISH, + "TRAIT_POOR_AIM" = TRAIT_POOR_AIM, + "TRAIT_PROSOPAGNOSIA" = TRAIT_PROSOPAGNOSIA, + "TRAIT_DRUNK_HEALING" = TRAIT_DRUNK_HEALING, + "TRAIT_TAGGER" = TRAIT_TAGGER, + "TRAIT_PHOTOGRAPHER" = TRAIT_PHOTOGRAPHER, + "TRAIT_MUSICIAN" = TRAIT_MUSICIAN, + "TRAIT_LIGHT_DRINKER" = TRAIT_LIGHT_DRINKER, + "TRAIT_EMPATH" = TRAIT_EMPATH, + "TRAIT_FRIENDLY" = TRAIT_FRIENDLY, + "TRAIT_GRABWEAKNESS" = TRAIT_GRABWEAKNESS, + "TRAIT_SNOB" = TRAIT_SNOB, + "TRAIT_BALD" = TRAIT_BALD ), /obj/item/bodypart = list( "TRAIT_PARALYSIS" = TRAIT_PARALYSIS ), /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 + ), + /atom = list( + "TRAIT_KEEP_TOGETHER" = TRAIT_KEEP_TOGETHER ) )) diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index 5a20bd34d76..cf3a2e8ba51 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -169,6 +169,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) //This helper applies components to things on the map directly. /obj/effect/mapping_helpers/component_injector name = "Component Injector" + icon_state = "component" late = TRUE var/all = FALSE //Will inject into all fitting the criteria if true, otherwise first found var/target_type //Will inject into atoms of this type @@ -380,3 +381,41 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) log_mapping("[src] at [x],[y] could not find an airlock on current turf, cannot place paper note.") qdel(src) +//This helper applies traits to things on the map directly. +/obj/effect/mapping_helpers/trait_injector + name = "Trait Injector" + icon_state = "trait" + late = TRUE + ///Will inject into all fitting the criteria if false, otherwise first found. + var/first_match_only = TRUE + ///Will inject into atoms of this type. + var/target_type + ///Will inject into atoms with this name. + var/target_name + ///Name of the trait, in the lower-case text (NOT the upper-case define) form. + var/trait_name + +//Late init so everything is likely ready and loaded (no warranty) +/obj/effect/mapping_helpers/trait_injector/LateInitialize() + if(!GLOB.trait_name_map) + GLOB.trait_name_map = generate_trait_name_map() + if(!GLOB.trait_name_map.Find(trait_name)) + CRASH("Wrong trait in [type] - [trait_name] is not a trait") + var/turf/target_turf = get_turf(src) + var/matches_found = 0 + for(var/a in target_turf.GetAllContents()) + var/atom/atom_on_turf = a + if(atom_on_turf == src) + continue + if(target_name && atom_on_turf.name != target_name) + continue + if(target_type && !istype(atom_on_turf,target_type)) + continue + ADD_TRAIT(atom_on_turf, trait_name, MAPPING_HELPER_TRAIT) + matches_found++ + if(first_match_only) + qdel(src) + return + if(!matches_found) + stack_trace("Trait mapper found no targets at ([x], [y], [z]). First Match Only: [first_match_only ? "true" : "false"] target type: [target_type] | target name: [target_name] | trait name: [trait_name]") + qdel(src) diff --git a/icons/effects/mapping_helpers.dmi b/icons/effects/mapping_helpers.dmi index d1feca89b36..a1afaf1c724 100644 Binary files a/icons/effects/mapping_helpers.dmi and b/icons/effects/mapping_helpers.dmi differ