diff --git a/code/datums/spells/horsemask.dm b/code/datums/spells/horsemask.dm
index d5f686fb763..f22689067d8 100644
--- a/code/datums/spells/horsemask.dm
+++ b/code/datums/spells/horsemask.dm
@@ -30,7 +30,7 @@
var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead
magichead.flags |= NODROP | DROPDEL //curses!
magichead.flags_inv = null //so you can still see their face
- magichead.voicechange = 1 //NEEEEIIGHH
+ magichead.voicechange = TRUE //NEEEEIIGHH
target.visible_message( "[target]'s face lights up in fire, and after the event a horse's head takes its place!", \
"Your face burns up, and shortly after the fire you realise you have the face of a horse!")
if(!target.unEquip(target.wear_mask))
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index f8f2fe512f6..4e59d8ad6dd 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -1174,6 +1174,15 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 4
excludefrom = list(/datum/game_mode/nuclear)
+/datum/uplink_item/stealthy_tools/voice_modulator
+ name = "Chameleon Voice Modulator Mask"
+ desc = "A syndicate tactical mask equipped with chameleon technology and a sound modulator for disguising your voice. \
+ While the mask is active, your voice will sound unrecognizable to others"
+ reference = "CVMM"
+ item = /obj/item/clothing/mask/gas/voice_modulator/chameleon
+ cost = 1
+ excludefrom = list(/datum/game_mode/nuclear)
+
/datum/uplink_item/stealthy_tools/chameleon/nuke
reference = "NCHAM"
cost = 6
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index 67ad3a2ebae..0eef296334d 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -1029,7 +1029,7 @@
var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead
magichead.flags |= NODROP | DROPDEL //curses!
magichead.flags_inv = null //so you can still see their face
- magichead.voicechange = 1 //NEEEEIIGHH
+ magichead.voicechange = TRUE //NEEEEIIGHH
if(!user.unEquip(user.wear_mask))
qdel(user.wear_mask)
user.equip_to_slot_if_possible(magichead, slot_wear_mask, TRUE, TRUE)
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index c4af2849947..a5c01d63ae4 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -144,6 +144,8 @@
/obj/item/stamp/chameleon = 2,
/obj/item/clothing/shoes/chameleon/noslip = 5,
/obj/item/clothing/mask/chameleon = 2,
+ /obj/item/clothing/mask/gas/voice_modulator = 2,
+ /obj/item/clothing/mask/gas/voice_modulator/chameleon = 2,
/obj/item/dnascrambler = 1,
/obj/item/storage/backpack/satchel_flat = 2,
/obj/item/storage/toolbox/syndicate = 2,
@@ -156,7 +158,7 @@
/obj/item/storage/secure/briefcase/syndie = 2,
/obj/item/storage/fancy/cigarettes/cigpack_syndicate = 2,
/obj/item/storage/pill_bottle/fakedeath = 2,
- "" = 68
+ "" = 64 // Reduce this number if you add things above. Make sure all the numbers in the list add to 100 EXACTLY
)
/obj/effect/spawner/lootdrop/crate_spawner // for ruins
diff --git a/code/game/objects/items/devices/voice.dm b/code/game/objects/items/devices/voice.dm
index 43a95ae86d7..c18af96333d 100644
--- a/code/game/objects/items/devices/voice.dm
+++ b/code/game/objects/items/devices/voice.dm
@@ -1,6 +1,6 @@
/obj/item/voice_changer
name = "voice changer"
- desc = "A voice scrambling module."
+ desc = "A voice mimicking module."
icon = 'icons/obj/device.dmi'
icon_state = "voice_changer_off"
@@ -42,3 +42,9 @@
voice = sanitize(copytext(chosen_voice, 1, MAX_MESSAGE_LEN))
to_chat(user, "You are now mimicking [voice].")
+
+/obj/item/voice_changer/voice_modulator
+ name = "voice modulator"
+ desc = "A voice scrambling module."
+ voice = "Unknown"
+ actions_types = list(/datum/action/item_action/voice_changer/toggle)
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 3f79aa71727..bbcebdc519d 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -428,6 +428,10 @@ BLIND // can't see anything
var/datum/action/A = X
A.UpdateButtonIcon()
+// Changes the speech verb when wearing a mask if a value is returned
+/obj/item/clothing/mask/proc/change_speech_verb()
+ return
+
//Shoes
/obj/item/clothing/shoes
name = "shoes"
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index bddb5701535..cb2b402b2a2 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -313,7 +313,7 @@
flags = BLOCKHAIR
flags_inv = HIDEFACE
w_class = WEIGHT_CLASS_SMALL
- var/voicechange = 0
+ var/voicechange = FALSE
var/temporaryname = " the Horse"
var/originalname = ""
@@ -347,6 +347,10 @@
if(user.real_name == "[originalname][temporaryname]" || user.real_name == "A Horse With No Name") //if it's somehow changed while the mask is on it doesn't revert
user.real_name = originalname
+/obj/item/clothing/mask/horsehead/change_speech_verb()
+ if(voicechange)
+ return pick("whinnies", "neighs", "says")
+
/obj/item/clothing/mask/face
flags_inv = HIDEFACE
flags_cover = MASKCOVERSMOUTH
diff --git a/code/modules/clothing/masks/voicemodulator.dm b/code/modules/clothing/masks/voicemodulator.dm
new file mode 100644
index 00000000000..c05a17aeab1
--- /dev/null
+++ b/code/modules/clothing/masks/voicemodulator.dm
@@ -0,0 +1,44 @@
+/obj/item/clothing/mask/gas/voice_modulator
+ name = "modified gas mask"
+ desc = "A gas mask modified with a sound modulator that disguises the user's voice when active"
+ icon_state = "voice_modulator"
+ item_state = "voice_modulator"
+
+ var/obj/item/voice_changer/voice_modulator/voice_modulator
+
+/obj/item/clothing/mask/gas/voice_modulator/Initialize(mapload)
+ . = ..()
+ voice_modulator = new(src)
+
+/obj/item/clothing/mask/gas/voice_modulator/Destroy()
+ QDEL_NULL(voice_modulator)
+ return ..()
+
+/obj/item/clothing/mask/gas/voice_modulator/chameleon
+ name = "chameleon voice modulator mask"
+ desc = "A tactical mask equipped with chameleon technology and a sound modulator that disguises the user's voice when active"
+ icon_state = "swat"
+ item_state = "swat"
+
+ var/datum/action/item_action/chameleon/change/chameleon_action
+
+/obj/item/clothing/mask/gas/voice_modulator/chameleon/Initialize(mapload)
+ . = ..()
+
+ chameleon_action = new(src)
+ chameleon_action.chameleon_type = /obj/item/clothing/mask
+ chameleon_action.chameleon_name = "Mask"
+ chameleon_action.chameleon_blacklist = list()
+ chameleon_action.initialize_disguises()
+
+/obj/item/clothing/mask/gas/voice_modulator/chameleon/Destroy()
+ QDEL_NULL(chameleon_action)
+ return ..()
+
+/obj/item/clothing/mask/gas/voice_modulator/chameleon/emp_act(severity)
+ . = ..()
+ chameleon_action.emp_randomise()
+
+/obj/item/clothing/mask/gas/voice_modulator/change_speech_verb()
+ if(voice_modulator.active)
+ return pick("modulates", "drones", "hums", "buzzes")
diff --git a/code/modules/crafting/tailoring.dm b/code/modules/crafting/tailoring.dm
index 6a597e9e8fa..a1fc09728d0 100644
--- a/code/modules/crafting/tailoring.dm
+++ b/code/modules/crafting/tailoring.dm
@@ -162,3 +162,13 @@
tools = list(TOOL_WIRECUTTER)
pathtools = list(/obj/item/kitchen/knife)
category = CAT_CLOTHING
+
+/datum/crafting_recipe/voice_modulator
+ name = "Voice Modulator Mask"
+ result = list(/obj/item/clothing/mask/gas/voice_modulator)
+ time = 45
+ tools = list(TOOL_SCREWDRIVER, TOOL_MULTITOOL)
+ reqs = list(/obj/item/clothing/mask/gas = 1,
+ /obj/item/assembly/voice = 1,
+ /obj/item/stack/cable_coil = 5)
+ category = CAT_CLOTHING
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 4f857163500..76211cf3198 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -149,7 +149,6 @@
var/obj/item/clothing/mask/horsehead/hoers = wear_mask
if(hoers.voicechange)
S.message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!")
- verb = pick("whinnies", "neighs", "says")
if(dna)
for(var/mutation_type in active_mutations)
@@ -167,6 +166,12 @@
if(span)
S.message = "[S.message]"
+
+ if(wear_mask)
+ var/speech_verb_when_masked = wear_mask.change_speech_verb()
+ if(speech_verb_when_masked)
+ verb = speech_verb_when_masked
+
return list("verb" = verb)
/mob/living/carbon/human/handle_message_mode(message_mode, list/message_pieces, verb, used_radios)
diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi
index 99be80fb681..4d3568caad8 100644
Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.dmi differ
diff --git a/icons/mob/clothing/species/drask/mask.dmi b/icons/mob/clothing/species/drask/mask.dmi
index 27fa4502ad7..0795633a7c1 100644
Binary files a/icons/mob/clothing/species/drask/mask.dmi and b/icons/mob/clothing/species/drask/mask.dmi differ
diff --git a/icons/mob/clothing/species/grey/mask.dmi b/icons/mob/clothing/species/grey/mask.dmi
index 348a39c0f03..ae355aa8d51 100644
Binary files a/icons/mob/clothing/species/grey/mask.dmi and b/icons/mob/clothing/species/grey/mask.dmi differ
diff --git a/icons/mob/clothing/species/plasmaman/mask.dmi b/icons/mob/clothing/species/plasmaman/mask.dmi
index 73ff04e9288..1923e54a745 100644
Binary files a/icons/mob/clothing/species/plasmaman/mask.dmi and b/icons/mob/clothing/species/plasmaman/mask.dmi differ
diff --git a/icons/mob/clothing/species/tajaran/mask.dmi b/icons/mob/clothing/species/tajaran/mask.dmi
index f189a8d950d..337953a805b 100644
Binary files a/icons/mob/clothing/species/tajaran/mask.dmi and b/icons/mob/clothing/species/tajaran/mask.dmi differ
diff --git a/icons/mob/clothing/species/unathi/mask.dmi b/icons/mob/clothing/species/unathi/mask.dmi
index 2e29c80faf2..163fdc75628 100644
Binary files a/icons/mob/clothing/species/unathi/mask.dmi and b/icons/mob/clothing/species/unathi/mask.dmi differ
diff --git a/icons/mob/clothing/species/vox/mask.dmi b/icons/mob/clothing/species/vox/mask.dmi
index a875b7205a5..5e877739fab 100644
Binary files a/icons/mob/clothing/species/vox/mask.dmi and b/icons/mob/clothing/species/vox/mask.dmi differ
diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi
index 2c755f556ea..266db362dba 100644
Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 5c415a06568..a491d9c3e4c 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1417,6 +1417,7 @@
#include "code\modules\clothing\masks\breath.dm"
#include "code\modules\clothing\masks\gasmask.dm"
#include "code\modules\clothing\masks\miscellaneous.dm"
+#include "code\modules\clothing\masks\voicemodulator.dm"
#include "code\modules\clothing\patreon\glasses.dm"
#include "code\modules\clothing\patreon\hats.dm"
#include "code\modules\clothing\shoes\colour.dm"