From 714c61c70fdca1f46f43bb3c07cb8c2573363ca3 Mon Sep 17 00:00:00 2001 From: AnturK Date: Mon, 29 Jul 2019 11:21:22 +0200 Subject: [PATCH] Adds way to add/remove traits for admins (#45503) --- code/__DEFINES/traits.dm | 3 + code/_globalvars/traits.dm | 107 ++++++++++++++++++++++++ code/datums/datumvars.dm | 8 ++ code/modules/admin/verbs/randomverbs.dm | 44 ++++++++++ tgstation.dme | 1 + 5 files changed, 163 insertions(+) create mode 100644 code/_globalvars/traits.dm diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 855e0ee7d01..8150af140f5 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -57,6 +57,9 @@ #define HAS_TRAIT_FROM(target, trait, source) (target.status_traits ? (target.status_traits[trait] ? (source in target.status_traits[trait]) : FALSE) : FALSE) +/* +Remember to update _globalvars/traits.dm if you're adding/removing/renaming traits. +*/ //mob traits #define TRAIT_BLIND "blind" diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm new file mode 100644 index 00000000000..23034e9d7a2 --- /dev/null +++ b/code/_globalvars/traits.dm @@ -0,0 +1,107 @@ +/* + 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_BLIND" = TRAIT_BLIND, + "TRAIT_MUTE" = TRAIT_MUTE, + "TRAIT_EMOTEMUTE " = TRAIT_EMOTEMUTE, + "TRAIT_DEAF" = TRAIT_DEAF, + "TRAIT_NEARSIGHT" = TRAIT_NEARSIGHT, + "TRAIT_FAT" = TRAIT_FAT, + "TRAIT_HUSK" = TRAIT_HUSK, + "TRAIT_BADDNA" = TRAIT_BADDNA, + "TRAIT_CLUMSY" = TRAIT_CLUMSY, + "TRAIT_DUMB" = TRAIT_DUMB, + "TRAIT_MONKEYLIKE" = TRAIT_MONKEYLIKE, + "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_SLEEPIMMUNE" = TRAIT_SLEEPIMMUNE, + "TRAIT_PUSHIMMUNE" = TRAIT_PUSHIMMUNE, + "TRAIT_SHOCKIMMUNE" = TRAIT_SHOCKIMMUNE, + "TRAIT_STABLEHEART" = TRAIT_STABLEHEART, + "TRAIT_STABLELIVER" = TRAIT_STABLELIVER, + "TRAIT_RESISTHEAT" = TRAIT_RESISTHEAT, + "TRAIT_RESISTHEATHANDS" = TRAIT_RESISTHEATHANDS, + "TRAIT_RESISTCOLD" = TRAIT_RESISTCOLD, + "TRAIT_RESISTHIGHPRESSURE" = TRAIT_RESISTHIGHPRESSURE, + "TRAIT_RESISTLOWPRESSURE" = TRAIT_RESISTLOWPRESSURE, + "TRAIT_RADIMMUNE" = TRAIT_RADIMMUNE, + "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_NOMETABOLISM" = TRAIT_NOMETABOLISM, + "TRAIT_TOXIMMUNE" = TRAIT_TOXIMMUNE, + "TRAIT_EASYDISMEMBER" = TRAIT_EASYDISMEMBER, + "TRAIT_LIMBATTACHMENT" = TRAIT_LIMBATTACHMENT, + "TRAIT_NOLIMBDISABLE" = TRAIT_NOLIMBDISABLE, + "TRAIT_EASYLIMBDISABLE" = TRAIT_EASYLIMBDISABLE, + "TRAIT_TOXINLOVER" = TRAIT_TOXINLOVER, + "TRAIT_NOBREATH" = TRAIT_NOBREATH, + "TRAIT_ANTIMAGIC" = TRAIT_ANTIMAGIC, + "TRAIT_HOLY" = TRAIT_HOLY, + "TRAIT_DEPRESSION" = TRAIT_DEPRESSION, + "TRAIT_JOLLY" = TRAIT_JOLLY, + "TRAIT_NOCRITDAMAGE" = TRAIT_NOCRITDAMAGE, + "TRAIT_NOSLIPWATER" = TRAIT_NOSLIPWATER, + "TRAIT_NOSLIPALL" = TRAIT_NOSLIPALL, + "TRAIT_NODEATH" = TRAIT_NODEATH, + "TRAIT_NOHARDCRIT" = TRAIT_NOHARDCRIT, + "TRAIT_NOSOFTCRIT" = TRAIT_NOSOFTCRIT, + "TRAIT_MINDSHIELD" = TRAIT_MINDSHIELD, + "TRAIT_DISSECTED" = TRAIT_DISSECTED, + "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_NOMOBSWAP" = TRAIT_NOMOBSWAP, + "TRAIT_XRAY_VISION" = TRAIT_XRAY_VISION, + "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_MAGIC_CHOKE" = TRAIT_MAGIC_CHOKE, + "TRAIT_SOOTHED_THROAT" = TRAIT_SOOTHED_THROAT, + "TRAIT_LAW_ENFORCEMENT_METABOLISM" = TRAIT_LAW_ENFORCEMENT_METABOLISM, + "TRAIT_ALWAYS_CLEAN" = TRAIT_ALWAYS_CLEAN, + "TRAIT_BOOZE_SLIDER" = TRAIT_BOOZE_SLIDER, + "TRAIT_UNINTELLIGIBLE_SPEECH" = TRAIT_UNINTELLIGIBLE_SPEECH, + "TRAIT_UNSTABLE" = TRAIT_UNSTABLE, + "TRAIT_OIL_FRIED" = TRAIT_OIL_FRIED + ), + /obj/item/bodypart = list( + "TRAIT_PARALYSIS" = TRAIT_PARALYSIS + ), + /obj/item = list( + "TRAIT_NODROP" = TRAIT_NODROP, + "TRAIT_T_RAY_VISIBLE" = TRAIT_T_RAY_VISIBLE, + "TRAIT_NO_TELEPORT" = TRAIT_NO_TELEPORT + ) + )) + +/// value -> trait name, generated on use from trait_by_type global +GLOBAL_LIST(trait_name_map) + +/proc/generate_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 \ No newline at end of file diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 2af8c12fda6..5fd7122f20d 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -30,6 +30,7 @@ .["Mark Object"] = "?_src_=vars;[HrefToken()];mark_object=[REF(src)]" .["Delete"] = "?_src_=vars;[HrefToken()];delete=[REF(src)]" .["Show VV To Player"] = "?_src_=vars;[HrefToken(TRUE)];expose=[REF(src)]" + .["Modify Traits"] = "?_src_=vars;[HrefToken(TRUE)];traitmod=[REF(src)]" /datum/proc/on_reagent_change(changetype) @@ -579,6 +580,13 @@ log_admin("Admin [key_name(usr)] Showed [key_name(C)] a VV window of a [thing]") to_chat(C, "[usr.client.holder.fakekey ? "an Administrator" : "[usr.client.key]"] has granted you access to view a View Variables window") C.debug_variables(thing) + else if(href_list["traitmod"]) + if(!check_rights(NONE)) + return + var/datum/A = locate(href_list["traitmod"]) + if(!A) + return + holder.modify_traits(A) //Needs +VAREDIT past this point diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 2e8a21ea69e..136a085dd83 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -1206,3 +1206,47 @@ Traitors and the like can also be revived with the previous role mostly intact. else message_admins("[key_name_admin(usr)] has [newstate ? "activated" : "deactivated"] job exp exempt status on [key_name_admin(C)]") log_admin("[key_name(usr)] has [newstate ? "activated" : "deactivated"] job exp exempt status on [key_name(C)]") + +/// Allow admin to add or remove traits of datum +/datum/admins/proc/modify_traits(datum/D) + if(!D) + return + + var/add_or_remove = input("Remove/Add?", "Trait Remove/Add") as null|anything in list("Add","Remove") + if(!add_or_remove) + return + var/list/availible_traits = list() + + switch(add_or_remove) + if("Add") + for(var/key in GLOB.traits_by_type) + if(istype(D,key)) + availible_traits += GLOB.traits_by_type[key] + if("Remove") + if(!GLOB.trait_name_map) + GLOB.trait_name_map = generate_trait_name_map() + for(var/trait in D.status_traits) + var/name = GLOB.trait_name_map[trait] || trait + availible_traits[name] = trait + + var/chosen_trait = input("Select trait to modify", "Trait") as null|anything in availible_traits + if(!chosen_trait) + return + chosen_trait = availible_traits[chosen_trait] + + var/source = "adminabuse" + switch(add_or_remove) + if("Add") //Not doing source choosing here intentionally to make this bit faster to use, you can always vv it. + ADD_TRAIT(D,chosen_trait,source) + if("Remove") + var/specific = input("All or specific source ?", "Trait Remove/Add") as null|anything in list("All","Specific") + if(!specific) + return + switch(specific) + if("All") + source = null + if("Specific") + source = input("Source to be removed","Trait Remove/Add") as null|anything in D.status_traits[chosen_trait] + if(!source) + return + REMOVE_TRAIT(D,chosen_trait,source) diff --git a/tgstation.dme b/tgstation.dme index fa36073b5ca..0d9eaa1483c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -158,6 +158,7 @@ #include "code\_globalvars\logging.dm" #include "code\_globalvars\misc.dm" #include "code\_globalvars\regexes.dm" +#include "code\_globalvars\traits.dm" #include "code\_globalvars\lists\flavor_misc.dm" #include "code\_globalvars\lists\maintenance_loot.dm" #include "code\_globalvars\lists\mapping.dm"