Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions code/__DEFINES/traits/declarations.dm
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down
1 change: 1 addition & 0 deletions code/_globalvars/traits/_traits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
12 changes: 12 additions & 0 deletions code/datums/components/crafting/tailoring.dm
Original file line number Diff line number Diff line change
Expand Up @@ -402,3 +402,15 @@
/datum/crafting_recipe/balloon_vest/check_requirements(mob/user, list/collected_requirements)
return HAS_TRAIT(user, TRAIT_BALLOON_SUTRA)

/datum/crafting_recipe/voiceconcealer
name = "Voice Obfuscator Gas Mask"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unironically this sounds on paper stronger than the actual syndicate version since trying to disguise as someone won't show to security that you're not an actual crewmember and they could assume you're just a greyshitter upon seeing you.

result = /obj/item/clothing/mask/gas/voiceconcealer
reqs = list(
/obj/item/clothing/mask/gas/sechailer = 1,
/obj/item/assembly/voice = 1,
/obj/item/stack/cable_coil = 5,
/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
2 changes: 1 addition & 1 deletion code/game/say.dm
Original file line number Diff line number Diff line change
Expand Up @@ -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 = "<span class='name [id_span || "job__unknown"]'>"
//End name span.
Expand Down
33 changes: 33 additions & 0 deletions code/modules/clothing/masks/gasmask.dm
Original file line number Diff line number Diff line change
Expand Up @@ -499,3 +499,36 @@ 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 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)
. = ..()
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] |= SPAN_ROBOT // I said NO.



2 changes: 1 addition & 1 deletion code/modules/mob/living/carbon/human/human_say.dm
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down
3 changes: 2 additions & 1 deletion code/modules/mob/living/carbon/human/init_signals.dm
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand All @@ -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

Expand Down
2 changes: 1 addition & 1 deletion code/modules/mob/living/silicon/ai/ai.dm
Original file line number Diff line number Diff line change
Expand Up @@ -951,7 +951,7 @@
var/hrefpart = "<a href='byond://?src=[REF(src)];track=[html_encode(namepart)]'>"
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)
Expand Down
Loading