From 5a13c4af99b209dd98859640430863ec5b9b7777 Mon Sep 17 00:00:00 2001 From: Tractor Maam <69653259+Tractor-Maam@users.noreply.github.com> Date: Sat, 25 Oct 2025 17:45:52 -0700 Subject: [PATCH 1/9] anonymous gas mask hasdjfbgjabvfjsda why does trait unknown do everything i want AND do one thing i DONT want!!!! I wanna be examinable AND anonymous. --- code/__DEFINES/traits/declarations.dm | 3 +++ code/datums/components/crafting/tailoring.dm | 10 ++++++++++ code/game/say.dm | 2 +- code/modules/clothing/masks/gasmask.dm | 4 ++++ code/modules/mob/living/carbon/human/examine.dm | 2 +- code/modules/mob/living/carbon/human/human_helpers.dm | 10 +++++----- code/modules/mob/living/carbon/human/human_say.dm | 2 +- code/modules/mob/living/carbon/human/init_signals.dm | 3 ++- code/modules/mob/living/silicon/ai/ai.dm | 2 +- .../code/modules/flavor_text/flavor_helpers.dm | 6 +++--- 10 files changed, 31 insertions(+), 13 deletions(-) diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 380720ed133b7..ebeffd5cddecb 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -604,6 +604,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// The person with this trait always appears as 'unknown'. #define TRAIT_UNKNOWN "unknown" +/// The person with this trait always appears as 'unknown', but doesnt obscure the examine. +#define TRAIT_ANONYMOUS "anonymous" + /// If the mob has this trait and die, their bomb implant doesn't detonate automatically. It must be consciously activated. #define TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION "prevent_implant_auto_explosion" diff --git a/code/datums/components/crafting/tailoring.dm b/code/datums/components/crafting/tailoring.dm index 508e46b999242..a8fe3c0b84598 100644 --- a/code/datums/components/crafting/tailoring.dm +++ b/code/datums/components/crafting/tailoring.dm @@ -402,3 +402,13 @@ /datum/crafting_recipe/balloon_vest/check_requirements(mob/user, list/collected_requirements) return HAS_TRAIT(user, TRAIT_BALLOON_SUTRA) +/datum/crafting_recipe/voiceconcealer + result = /obj/item/clothing/mask/gas/voiceconcealer + reqs = list( + /obj/item/clothing/mask/gas = 1, + /obj/item/assembly/voice = 1, + /obj/item/stack/cable_coil = 5, + /obj/item/stack/sheet/plastic = 1, + ) + time = 8 SECONDS + category = CAT_CLOTHING diff --git a/code/game/say.dm b/code/game/say.dm index f18739d16005f..4672fa49c6622 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -102,7 +102,7 @@ GLOBAL_LIST_INIT(freqtospan, list( namepart = "[human_speaker.get_face_name()]" //So "fake" speaking like in hallucinations does not give the speaker away if disguised else if(visible_name) namepart = "[human_speaker.get_visible_name()]" - if(!radio_freq && !HAS_TRAIT(human_speaker, TRAIT_UNKNOWN)) + if(!radio_freq && !HAS_TRAIT(human_speaker, TRAIT_UNKNOWN) && !HAS_TRAIT(human_speaker, TRAIT_ANONYMOUS)) var/id_span = astype(human_speaker.wear_id?.GetID(), /obj/item/card/id)?.chat_span() spanpart2 = "" //End name span. diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index d2b1132e61fc0..bf5213b7b62bb 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -499,3 +499,7 @@ GLOBAL_LIST_INIT(clown_mask_options, list( flags_inv = HIDEFACIALHAIR w_class = WEIGHT_CLASS_NORMAL inhand_icon_state = null + +/obj/item/clothing/mask/gas/voiceconcealer + desc = "A face-covering mask that has been significantly modified near the mouth to block off the users voice whilst repeating it through a speaker. Inconspicuous and great for concealing your identity." + clothing_traits = list(TRAIT_ANONYMOUS) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 0ec4f161a244f..5bfbf798d57a6 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -11,7 +11,7 @@ if(isliving(user)) var/mob/living/L = user - if(HAS_TRAIT(L, TRAIT_PROSOPAGNOSIA) || HAS_TRAIT(L, TRAIT_INVISIBLE_MAN)) + if(HAS_TRAIT(L, TRAIT_PROSOPAGNOSIA) || HAS_TRAIT(L, TRAIT_INVISIBLE_MAN) || HAS_TRAIT(src, TRAIT_ANONYMOUS)) obscure_name = TRUE if(HAS_TRAIT(src, TRAIT_UNKNOWN)) obscure_name = TRUE diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 6247c057b2917..9a3d3058c6efd 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -30,7 +30,7 @@ //Useful when player do something with computers /mob/living/carbon/human/proc/get_assignment(if_no_id = "No id", if_no_job = "No job", hand_first = TRUE) var/obj/item/card/id/id = get_idcard(hand_first) - if(HAS_TRAIT(src, TRAIT_UNKNOWN)) + if(HAS_TRAIT(src, TRAIT_UNKNOWN) || HAS_TRAIT(src, TRAIT_ANONYMOUS)) return if_no_id if(id) . = id.assignment @@ -47,7 +47,7 @@ //Useful when player do something with computers /mob/living/carbon/human/proc/get_authentification_name(if_no_id = "Unknown") var/obj/item/card/id/id = get_idcard(FALSE) - if(HAS_TRAIT(src, TRAIT_UNKNOWN)) + if(HAS_TRAIT(src, TRAIT_UNKNOWN) || HAS_TRAIT(src, TRAIT_ANONYMOUS)) return if_no_id if(id) return id.registered_name @@ -60,7 +60,7 @@ /mob/living/carbon/human/get_visible_name(add_id_name = TRUE) var/face_name = get_face_name("") var/id_name = get_id_name("") - if(HAS_TRAIT(src, TRAIT_UNKNOWN)) + if(HAS_TRAIT(src, TRAIT_UNKNOWN) || HAS_TRAIT(src, TRAIT_ANONYMOUS)) return "Unknown" if(name_override) return name_override @@ -74,7 +74,7 @@ //Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when Fluacided or when updating a human's name variable /mob/living/carbon/human/proc/get_face_name(if_no_face="Unknown") - if(HAS_TRAIT(src, TRAIT_UNKNOWN)) + if(HAS_TRAIT(src, TRAIT_UNKNOWN) || HAS_TRAIT(src, TRAIT_ANONYMOUS)) return if_no_face //We're Unknown, no face information for you if( wear_mask && (wear_mask.flags_inv&HIDEFACE) ) //Wearing a mask which hides our face, use id-name if possible return if_no_face @@ -91,7 +91,7 @@ var/obj/item/storage/wallet/wallet = wear_id var/obj/item/modular_computer/pda = wear_id var/obj/item/card/id/id = wear_id - if(HAS_TRAIT(src, TRAIT_UNKNOWN)) + if(HAS_TRAIT(src, TRAIT_UNKNOWN) || HAS_TRAIT(src, TRAIT_ANONYMOUS)) . = if_no_id //You get NOTHING, no id name, good day sir if(istype(wallet)) id = wallet.front_id diff --git a/code/modules/mob/living/carbon/human/human_say.dm b/code/modules/mob/living/carbon/human/human_say.dm index bcff004ae3898..f97516bc7a3cf 100644 --- a/code/modules/mob/living/carbon/human/human_say.dm +++ b/code/modules/mob/living/carbon/human/human_say.dm @@ -21,7 +21,7 @@ return ..() /mob/living/carbon/human/GetVoice() - if(HAS_TRAIT(src, TRAIT_UNKNOWN)) + if(HAS_TRAIT(src, TRAIT_UNKNOWN) || HAS_TRAIT(src, TRAIT_ANONYMOUS)) return ("Unknown") if(istype(wear_mask, /obj/item/clothing/mask/chameleon)) diff --git a/code/modules/mob/living/carbon/human/init_signals.dm b/code/modules/mob/living/carbon/human/init_signals.dm index 0e3bc5a426cba..c023bd130fe6e 100644 --- a/code/modules/mob/living/carbon/human/init_signals.dm +++ b/code/modules/mob/living/carbon/human/init_signals.dm @@ -4,6 +4,7 @@ RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_HEAVY_BLEEDER), PROC_REF(on_gain_heavy_bleeder_trait)) RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_HEAVY_BLEEDER), PROC_REF(on_lose_heavy_bleeder_trait)) RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_UNKNOWN), SIGNAL_REMOVETRAIT(TRAIT_UNKNOWN)), PROC_REF(on_unknown_trait)) + RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_ANONYMOUS), SIGNAL_REMOVETRAIT(TRAIT_ANONYMOUS)), PROC_REF(on_unknown_trait)) RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_DWARF), SIGNAL_REMOVETRAIT(TRAIT_DWARF)), PROC_REF(on_dwarf_trait)) RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_GIANT)), PROC_REF(on_gain_giant_trait)) RegisterSignals(src, list(SIGNAL_REMOVETRAIT(TRAIT_GIANT)), PROC_REF(on_lose_giant_trait)) @@ -22,7 +23,7 @@ SIGNAL_HANDLER physiology?.bleed_mod /= 2 -/// Gaining or losing [TRAIT_UNKNOWN] updates our name and our sechud +/// Gaining or losing [TRAIT_UNKNOWN] / [TRAIT_ANONYMOUS] updates our name and our sechud /mob/living/carbon/human/proc/on_unknown_trait(datum/source) SIGNAL_HANDLER diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 3c20dba86f502..287ffb7cd56a1 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -951,7 +951,7 @@ var/hrefpart = "" var/jobpart = "Unknown" - if(!HAS_TRAIT(speaker, TRAIT_UNKNOWN)) //don't fetch the speaker's job in case they have something that conseals their identity completely + if(!(HAS_TRAIT(speaker, TRAIT_UNKNOWN) || HAS_TRAIT(src, TRAIT_ANONYMOUS))) //don't fetch the speaker's job in case they have something that conseals their identity completely if (isliving(speaker)) var/mob/living/living_speaker = speaker if(living_speaker.job) diff --git a/monkestation/code/modules/flavor_text/flavor_helpers.dm b/monkestation/code/modules/flavor_text/flavor_helpers.dm index d91d4cc7717e5..655da024a0cc2 100644 --- a/monkestation/code/modules/flavor_text/flavor_helpers.dm +++ b/monkestation/code/modules/flavor_text/flavor_helpers.dm @@ -14,7 +14,7 @@ var/datum/flavor_text/found_flavor = linked_flavor // Simple animals, basic animals, anything that's not a human/silicon is lumped under "simple" - if(found_flavor?.linked_species != "simple" || HAS_TRAIT(src, TRAIT_UNKNOWN)) + if(found_flavor?.linked_species != "simple" || HAS_TRAIT(src, TRAIT_UNKNOWN) || HAS_TRAIT(src, TRAIT_ANONYMOUS)) return null return found_flavor @@ -25,7 +25,7 @@ return linked_flavor var/shown_name = get_visible_name() - if(shown_name == "Unknown" || HAS_TRAIT(src, TRAIT_UNKNOWN)) // Redundant, but just in case + if(shown_name == "Unknown" || HAS_TRAIT(src, TRAIT_UNKNOWN) || HAS_TRAIT(src, TRAIT_ANONYMOUS)) // Redundant, but just in case return null var/datum/flavor_text/found_flavor @@ -47,7 +47,7 @@ return linked_flavor var/datum/flavor_text/found_flavor = linked_flavor - if(found_flavor?.linked_species != "silicon" || HAS_TRAIT(src, TRAIT_UNKNOWN)) + if(found_flavor?.linked_species != "silicon" || HAS_TRAIT(src, TRAIT_UNKNOWN) || HAS_TRAIT(src, TRAIT_ANONYMOUS)) return null return found_flavor From bdbc492b5ed13e1a6885366669fe577b30b1b58e Mon Sep 17 00:00:00 2001 From: Tractor Maam <69653259+Tractor-Maam@users.noreply.github.com> Date: Sat, 25 Oct 2025 17:47:08 -0700 Subject: [PATCH 2/9] actually change the desc --- code/modules/clothing/masks/gasmask.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index bf5213b7b62bb..05ce88dd03a6d 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -501,5 +501,5 @@ GLOBAL_LIST_INIT(clown_mask_options, list( inhand_icon_state = null /obj/item/clothing/mask/gas/voiceconcealer - desc = "A face-covering mask that has been significantly modified near the mouth to block off the users voice whilst repeating it through a speaker. Inconspicuous and great for concealing your identity." + desc = "A face-covering mask that has been significantly modified near the mouth to block off the users voice whilst repeating it through a speaker. Great for concealing your identity as long as you make sure to hide every other identifying feature." clothing_traits = list(TRAIT_ANONYMOUS) From bcbf1979c62a9a21f950850a88a146ee076dc521 Mon Sep 17 00:00:00 2001 From: Tractor Maam <69653259+Tractor-Maam@users.noreply.github.com> Date: Sat, 25 Oct 2025 17:48:37 -0700 Subject: [PATCH 3/9] oh... one more thing. --- code/datums/components/crafting/tailoring.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/datums/components/crafting/tailoring.dm b/code/datums/components/crafting/tailoring.dm index a8fe3c0b84598..c30f2355caa58 100644 --- a/code/datums/components/crafting/tailoring.dm +++ b/code/datums/components/crafting/tailoring.dm @@ -403,6 +403,7 @@ return HAS_TRAIT(user, TRAIT_BALLOON_SUTRA) /datum/crafting_recipe/voiceconcealer + name = "Voice Obfuscator Gas Mask" result = /obj/item/clothing/mask/gas/voiceconcealer reqs = list( /obj/item/clothing/mask/gas = 1, From 4e06fad5bd3a4c95c3594a08f5d56e26cca4fee7 Mon Sep 17 00:00:00 2001 From: Tractor Maam <69653259+Tractor-Maam@users.noreply.github.com> Date: Sat, 25 Oct 2025 18:13:49 -0700 Subject: [PATCH 4/9] there is no admin_tooling.dm but ok --- code/_globalvars/traits/_traits.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index acd1ecd1339d8..0cf5dbb34d116 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -151,6 +151,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_ANALGESIA" = TRAIT_ANALGESIA, "TRAIT_ANGELIC" = TRAIT_ANGELIC, "TRAIT_ANIME" = TRAIT_ANIME, + "TRAIT_ANONYMOUS" = TRAIT_ANONYMOUS, "TRAIT_ANTENNAE" = TRAIT_ANTENNAE, "TRAIT_ANTICONVULSANT" = TRAIT_ANTICONVULSANT, "TRAIT_ANTIMAGIC" = TRAIT_ANTIMAGIC, From 99fb727dc2c0506f3f6f3f0b2063e1f6fe6454f5 Mon Sep 17 00:00:00 2001 From: Tractor Maam <69653259+Tractor-Maam@users.noreply.github.com> Date: Mon, 27 Oct 2025 12:52:14 -0700 Subject: [PATCH 5/9] eh. fuck it. No name concealing not sure why i didnt... do this, originally. its a makeshift mask with a speaker and mystery noise absorbing plastic, not a super high tech cognitohazard generator that makes you unable to percieve the wearer. --- code/modules/mob/living/carbon/human/examine.dm | 2 +- code/modules/mob/living/carbon/human/human_helpers.dm | 10 +++++----- .../code/modules/flavor_text/flavor_helpers.dm | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 5bfbf798d57a6..0ec4f161a244f 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -11,7 +11,7 @@ if(isliving(user)) var/mob/living/L = user - if(HAS_TRAIT(L, TRAIT_PROSOPAGNOSIA) || HAS_TRAIT(L, TRAIT_INVISIBLE_MAN) || HAS_TRAIT(src, TRAIT_ANONYMOUS)) + if(HAS_TRAIT(L, TRAIT_PROSOPAGNOSIA) || HAS_TRAIT(L, TRAIT_INVISIBLE_MAN)) obscure_name = TRUE if(HAS_TRAIT(src, TRAIT_UNKNOWN)) obscure_name = TRUE diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 9a3d3058c6efd..6247c057b2917 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -30,7 +30,7 @@ //Useful when player do something with computers /mob/living/carbon/human/proc/get_assignment(if_no_id = "No id", if_no_job = "No job", hand_first = TRUE) var/obj/item/card/id/id = get_idcard(hand_first) - if(HAS_TRAIT(src, TRAIT_UNKNOWN) || HAS_TRAIT(src, TRAIT_ANONYMOUS)) + if(HAS_TRAIT(src, TRAIT_UNKNOWN)) return if_no_id if(id) . = id.assignment @@ -47,7 +47,7 @@ //Useful when player do something with computers /mob/living/carbon/human/proc/get_authentification_name(if_no_id = "Unknown") var/obj/item/card/id/id = get_idcard(FALSE) - if(HAS_TRAIT(src, TRAIT_UNKNOWN) || HAS_TRAIT(src, TRAIT_ANONYMOUS)) + if(HAS_TRAIT(src, TRAIT_UNKNOWN)) return if_no_id if(id) return id.registered_name @@ -60,7 +60,7 @@ /mob/living/carbon/human/get_visible_name(add_id_name = TRUE) var/face_name = get_face_name("") var/id_name = get_id_name("") - if(HAS_TRAIT(src, TRAIT_UNKNOWN) || HAS_TRAIT(src, TRAIT_ANONYMOUS)) + if(HAS_TRAIT(src, TRAIT_UNKNOWN)) return "Unknown" if(name_override) return name_override @@ -74,7 +74,7 @@ //Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when Fluacided or when updating a human's name variable /mob/living/carbon/human/proc/get_face_name(if_no_face="Unknown") - if(HAS_TRAIT(src, TRAIT_UNKNOWN) || HAS_TRAIT(src, TRAIT_ANONYMOUS)) + if(HAS_TRAIT(src, TRAIT_UNKNOWN)) return if_no_face //We're Unknown, no face information for you if( wear_mask && (wear_mask.flags_inv&HIDEFACE) ) //Wearing a mask which hides our face, use id-name if possible return if_no_face @@ -91,7 +91,7 @@ var/obj/item/storage/wallet/wallet = wear_id var/obj/item/modular_computer/pda = wear_id var/obj/item/card/id/id = wear_id - if(HAS_TRAIT(src, TRAIT_UNKNOWN) || HAS_TRAIT(src, TRAIT_ANONYMOUS)) + if(HAS_TRAIT(src, TRAIT_UNKNOWN)) . = if_no_id //You get NOTHING, no id name, good day sir if(istype(wallet)) id = wallet.front_id diff --git a/monkestation/code/modules/flavor_text/flavor_helpers.dm b/monkestation/code/modules/flavor_text/flavor_helpers.dm index 655da024a0cc2..d91d4cc7717e5 100644 --- a/monkestation/code/modules/flavor_text/flavor_helpers.dm +++ b/monkestation/code/modules/flavor_text/flavor_helpers.dm @@ -14,7 +14,7 @@ var/datum/flavor_text/found_flavor = linked_flavor // Simple animals, basic animals, anything that's not a human/silicon is lumped under "simple" - if(found_flavor?.linked_species != "simple" || HAS_TRAIT(src, TRAIT_UNKNOWN) || HAS_TRAIT(src, TRAIT_ANONYMOUS)) + if(found_flavor?.linked_species != "simple" || HAS_TRAIT(src, TRAIT_UNKNOWN)) return null return found_flavor @@ -25,7 +25,7 @@ return linked_flavor var/shown_name = get_visible_name() - if(shown_name == "Unknown" || HAS_TRAIT(src, TRAIT_UNKNOWN) || HAS_TRAIT(src, TRAIT_ANONYMOUS)) // Redundant, but just in case + if(shown_name == "Unknown" || HAS_TRAIT(src, TRAIT_UNKNOWN)) // Redundant, but just in case return null var/datum/flavor_text/found_flavor @@ -47,7 +47,7 @@ return linked_flavor var/datum/flavor_text/found_flavor = linked_flavor - if(found_flavor?.linked_species != "silicon" || HAS_TRAIT(src, TRAIT_UNKNOWN) || HAS_TRAIT(src, TRAIT_ANONYMOUS)) + if(found_flavor?.linked_species != "silicon" || HAS_TRAIT(src, TRAIT_UNKNOWN)) return null return found_flavor From 7d5d2cc0ea5281b818eddcf49cd0fda2a75fa89a Mon Sep 17 00:00:00 2001 From: Tractor Maam <69653259+Tractor-Maam@users.noreply.github.com> Date: Mon, 27 Oct 2025 13:41:27 -0700 Subject: [PATCH 6/9] Update gasmask.dm --- code/modules/clothing/masks/gasmask.dm | 29 ++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 05ce88dd03a6d..9587af65ab17f 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -503,3 +503,32 @@ GLOBAL_LIST_INIT(clown_mask_options, list( /obj/item/clothing/mask/gas/voiceconcealer desc = "A face-covering mask that has been significantly modified near the mouth to block off the users voice whilst repeating it through a speaker. Great for concealing your identity as long as you make sure to hide every other identifying feature." clothing_traits = list(TRAIT_ANONYMOUS) + +/obj/item/clothing/mask/gas/voiceconcealer/equipped(mob/living/user, slot) + . = ..() + if(slot_flags & slot) + RegisterSignal(user, COMSIG_TRY_MODIFY_SPEECH, PROC_REF(obscure_speech)) + RegisterSignal(user, COMSIG_MOB_SAY, PROC_REF(obscure_spans)) + var/obj/item/organ/internal/tongue/user_tongue = user.get_organ_slot(ORGAN_SLOT_TONGUE) + user_tongue.temp_say_mod = "states" + +/obj/item/clothing/mask/gas/voiceconcealer/dropped(mob/living/user) + . = ..() + UnregisterSignal(user, COMSIG_TRY_MODIFY_SPEECH) + UnregisterSignal(user, COMSIG_MOB_SAY) + var/obj/item/organ/internal/tongue/user_tongue = user.get_organ_slot(ORGAN_SLOT_TONGUE) + user_tongue.temp_say_mod = initial(user_tongue.temp_say_mod) + + +/obj/item/clothing/mask/gas/voiceconcealer/proc/obscure_speech() + SIGNAL_HANDLER + + return PREVENT_MODIFY_SPEECH // no lizard toungesss exposssing you + +/obj/item/clothing/mask/gas/voiceconcealer/proc/obscure_spans(mob/living/carbon/user, list/speech_args) + SIGNAL_HANDLER + + speech_args[SPEECH_SPANS] = list(SPAN_ROBOT) // I said NO. (this breaks megaphones.) + + + From 8c157462b0709e7c256113ca0fb12bb673b72b3c Mon Sep 17 00:00:00 2001 From: Tractor Maam <69653259+Tractor-Maam@users.noreply.github.com> Date: Mon, 27 Oct 2025 13:42:53 -0700 Subject: [PATCH 7/9] ok fine i thought i was being smart here last iteration works, but creates a race condition depending on when say mods are added, such as grabbing a megaphone before or after the mask breaking the loudness. Fuck it, we ball, we copy the wacky mutation. --- code/modules/clothing/masks/gasmask.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 9587af65ab17f..3a417012d9000 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -528,7 +528,7 @@ GLOBAL_LIST_INIT(clown_mask_options, list( /obj/item/clothing/mask/gas/voiceconcealer/proc/obscure_spans(mob/living/carbon/user, list/speech_args) SIGNAL_HANDLER - speech_args[SPEECH_SPANS] = list(SPAN_ROBOT) // I said NO. (this breaks megaphones.) + speech_args[SPEECH_SPANS] |= SPAN_ROBOT // I said NO. From 81fd31972f6a74a48beb7e1f5aa71de44282a61f Mon Sep 17 00:00:00 2001 From: Tractor Maam <69653259+Tractor-Maam@users.noreply.github.com> Date: Fri, 31 Oct 2025 15:49:42 -0700 Subject: [PATCH 8/9] Too accessible, use sechailer? --- code/datums/components/crafting/tailoring.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/datums/components/crafting/tailoring.dm b/code/datums/components/crafting/tailoring.dm index c30f2355caa58..13194a5b3b9cd 100644 --- a/code/datums/components/crafting/tailoring.dm +++ b/code/datums/components/crafting/tailoring.dm @@ -406,10 +406,11 @@ name = "Voice Obfuscator Gas Mask" result = /obj/item/clothing/mask/gas/voiceconcealer reqs = list( - /obj/item/clothing/mask/gas = 1, + /obj/item/clothing/mask/gas/sechailer = 1, /obj/item/assembly/voice = 1, /obj/item/stack/cable_coil = 5, - /obj/item/stack/sheet/plastic = 1, + /obj/item/stack/sheet/plastic = 5, //its uhh, to make a fake gas mask over the modifier hailer! yeah... ) + tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) time = 8 SECONDS category = CAT_CLOTHING From 16f467aa964844987b5ced4942b401be9ac8dcc7 Mon Sep 17 00:00:00 2001 From: Tractor Maam <69653259+Tractor-Maam@users.noreply.github.com> Date: Fri, 31 Oct 2025 15:56:45 -0700 Subject: [PATCH 9/9] LORE wont be caught with inaccurate descriptions here. --- code/modules/clothing/masks/gasmask.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 3a417012d9000..de80d55b5239c 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -501,7 +501,7 @@ GLOBAL_LIST_INIT(clown_mask_options, list( inhand_icon_state = null /obj/item/clothing/mask/gas/voiceconcealer - desc = "A face-covering mask that has been significantly modified near the mouth to block off the users voice whilst repeating it through a speaker. Great for concealing your identity as long as you make sure to hide every other identifying feature." + desc = "A modified hailer mask that has had the soundbank replaced with a microphone, and then covered with a fake plastic shell with the appearance of a gas mask. Great for concealing your identity as long as you make sure to hide every other identifying feature." clothing_traits = list(TRAIT_ANONYMOUS) /obj/item/clothing/mask/gas/voiceconcealer/equipped(mob/living/user, slot)