diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 1fba72bf6c3..ffe317e68a2 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -36744,7 +36744,7 @@
dir = 1
},
/obj/structure/table/wood,
-/obj/item/clothing/mask/pig,
+/obj/item/clothing/mask/animal/pig,
/obj/item/bikehorn,
/turf/open/floor/wood,
/area/crew_quarters/theatre)
@@ -38246,7 +38246,7 @@
/area/maintenance/port)
"bPJ" = (
/obj/structure/rack,
-/obj/item/clothing/mask/horsehead,
+/obj/item/clothing/mask/animal/horsehead,
/obj/effect/spawner/lootdrop/costume,
/turf/open/floor/plating,
/area/maintenance/port)
@@ -62927,7 +62927,7 @@
/obj/machinery/light/small{
dir = 8
},
-/obj/item/clothing/mask/horsehead,
+/obj/item/clothing/mask/animal/horsehead,
/obj/structure/table/wood,
/obj/machinery/airalarm{
dir = 1;
diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm
index 4f0ad511edd..7506e2c7484 100644
--- a/code/controllers/subsystem/traumas.dm
+++ b/code/controllers/subsystem/traumas.dm
@@ -144,7 +144,7 @@ SUBSYSTEM_DEF(traumas)
/obj/item/clothing/mask/gas/space_ninja, /obj/item/clothing/shoes/space_ninja, /obj/item/clothing/gloves/space_ninja, /obj/item/vibro_weapon,
/obj/item/nullrod/scythe/vibro, /obj/item/energy_katana, /obj/item/toy/katana, /obj/item/nullrod/claymore/katana, /obj/structure/window/paperframe, /obj/structure/mineral_door/paperframe)),
- "insects" = typecacheof(list(/obj/item/toy/plush/moth, /obj/item/toy/plush/beeplushie, /obj/item/clothing/mask/rat/bee, /obj/item/clothing/suit/hooded/bee_costume, /obj/structure/beebox))
+ "insects" = typecacheof(list(/obj/item/toy/plush/moth, /obj/item/toy/plush/beeplushie, /obj/item/clothing/mask/animal/rat/bee, /obj/item/clothing/suit/hooded/bee_costume, /obj/structure/beebox))
)
phobia_turfs = list("space" = typecacheof(list(/turf/open/space, /turf/open/floor/holofloor/space, /turf/open/floor/fakespace)),
diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm
index 3e680ed7416..367fa191d29 100644
--- a/code/game/objects/items/granters.dm
+++ b/code/game/objects/items/granters.dm
@@ -269,7 +269,7 @@
/obj/item/book/granter/spell/barnyard/recoil(mob/living/carbon/user)
if(ishuman(user))
to_chat(user,"HORSIE HAS RISEN")
- var/obj/item/clothing/magichead = new /obj/item/clothing/mask/horsehead/cursed(user.drop_location())
+ var/obj/item/clothing/magichead = new /obj/item/clothing/mask/animal/horsehead/cursed(user.drop_location())
if(!user.dropItemToGround(user.wear_mask))
qdel(user.wear_mask)
user.equip_to_slot_if_possible(magichead, ITEM_SLOT_MASK, TRUE, TRUE)
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index 2dbd8840dff..3f10a324a69 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -175,7 +175,7 @@
if("bee")
new /obj/item/paper/fluff/bee_objectives(src) // 0 tc (motivation)
new /obj/item/clothing/suit/hooded/bee_costume(src) // 0 tc
- new /obj/item/clothing/mask/rat/bee(src) // 0 tc
+ new /obj/item/clothing/mask/animal/rat/bee(src) // 0 tc
new /obj/item/storage/belt/fannypack/yellow(src) // 0 tc
new /obj/item/grenade/spawnergrenade/buzzkill(src)
new /obj/item/grenade/spawnergrenade/buzzkill(src)
diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm
index 992e30a4ecd..e967b32be10 100644
--- a/code/modules/clothing/masks/_masks.dm
+++ b/code/modules/clothing/masks/_masks.dm
@@ -26,7 +26,19 @@
. = ..()
UnregisterSignal(M, COMSIG_MOB_SAY)
+/obj/item/clothing/mask/vv_edit_var(vname, vval)
+ if(vname == NAMEOF(src, modifies_speech) && ismob(loc))
+ var/mob/M = loc
+ if(M.get_item_by_slot(ITEM_SLOT_MASK) == src)
+ if(vval)
+ if(!modifies_speech)
+ RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech)
+ else if(modifies_speech)
+ UnregisterSignal(M, COMSIG_MOB_SAY)
+ return ..()
+
/obj/item/clothing/mask/proc/handle_speech()
+ SIGNAL_HANDLER
/obj/item/clothing/mask/worn_overlays(isinhands = FALSE)
. = list()
diff --git a/code/modules/clothing/masks/animal_masks.dm b/code/modules/clothing/masks/animal_masks.dm
new file mode 100644
index 00000000000..f41dea23bf4
--- /dev/null
+++ b/code/modules/clothing/masks/animal_masks.dm
@@ -0,0 +1,254 @@
+
+GLOBAL_LIST_INIT(cursed_animal_masks, list(
+ /obj/item/clothing/mask/animal/pig/cursed,
+ /obj/item/clothing/mask/animal/frog/cursed,
+ /obj/item/clothing/mask/animal/cowmask/cursed,
+ /obj/item/clothing/mask/animal/horsehead/cursed,
+ /obj/item/clothing/mask/animal/rat/cursed,
+ /obj/item/clothing/mask/animal/rat/fox/cursed,
+ /obj/item/clothing/mask/animal/rat/bee/cursed,
+ /obj/item/clothing/mask/animal/rat/bear/cursed,
+ /obj/item/clothing/mask/animal/rat/bat/cursed,
+ /obj/item/clothing/mask/animal/rat/raven/cursed,
+ /obj/item/clothing/mask/animal/rat/jackal/cursed
+ ))
+
+/obj/item/clothing/mask/animal
+ w_class = WEIGHT_CLASS_SMALL
+ clothing_flags = VOICEBOX_TOGGLABLE
+ modifies_speech = TRUE
+ flags_cover = MASKCOVERSMOUTH
+
+ var/animal_type ///what kind of animal the masks represents. used for automatic name and description generation.
+ var/list/animal_sounds ///phrases to be said when the player attempts to talk when speech modification / voicebox is enabled.
+ var/list/animal_sounds_alt ///lower probability phrases to be said when talking.
+ var/animal_sounds_alt_probability ///probability for alternative sounds to play.
+
+ var/cursed ///if it's a cursed mask variant.
+ var/curse_spawn_sound ///sound to play when the cursed mask variant is spawned.
+
+/obj/item/clothing/mask/animal/Initialize()
+ . = ..()
+ if(cursed)
+ make_cursed()
+
+/obj/item/clothing/mask/animal/vv_edit_var(vname, vval)
+ if(vname == NAMEOF(src, cursed))
+ if(vval)
+ if(!cursed)
+ make_cursed()
+ else if(cursed)
+ clear_curse()
+ return ..()
+
+/obj/item/clothing/mask/animal/examine(mob/user)
+ . = ..()
+ if(clothing_flags & VOICEBOX_TOGGLABLE)
+ . += "Its voicebox is currently [clothing_flags & VOICEBOX_DISABLED ? "disabled" : "enabled"]. Alt-click to toggle it."
+
+/obj/item/clothing/mask/animal/AltClick(mob/user)
+ . = ..()
+ if(clothing_flags & VOICEBOX_TOGGLABLE)
+ clothing_flags ^= VOICEBOX_DISABLED
+ to_chat(user, "You [clothing_flags & VOICEBOX_DISABLED ? "disabled" : "enabled"] [src]'s voicebox.")
+
+/obj/item/clothing/mask/animal/proc/make_cursed() //apply cursed effects.
+ ADD_TRAIT(src, TRAIT_NODROP, CURSED_MASK_TRAIT)
+ clothing_flags = NONE //force animal sounds to always on.
+ if(flags_inv == initial(flags_inv))
+ flags_inv = HIDEFACIALHAIR
+ name = "[animal_type] face"
+ desc = "It looks like a [animal_type] mask, but closer inspection reveals it's melded onto this person's face!"
+ if(curse_spawn_sound)
+ playsound(src, curse_spawn_sound, 50, TRUE)
+ var/update_speech_mod = !modifies_speech && LAZYLEN(animal_sounds)
+ if(update_speech_mod)
+ modifies_speech = TRUE
+ if(ismob(loc))
+ var/mob/M = loc
+ if(M.get_item_by_slot(ITEM_SLOT_MASK) == src)
+ if(update_speech_mod)
+ RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech)
+ to_chat(M, "[src] was cursed!")
+ M.update_inv_wear_mask()
+
+/obj/item/clothing/mask/animal/proc/clear_curse()
+ REMOVE_TRAIT(src, TRAIT_NODROP, CURSED_MASK_TRAIT)
+ clothing_flags = initial(clothing_flags)
+ flags_inv = initial(flags_inv)
+ name = initial(name)
+ desc = initial(desc)
+ var/update_speech_mod = modifies_speech && !initial(modifies_speech)
+ if(update_speech_mod)
+ modifies_speech = FALSE
+ if(ismob(loc))
+ var/mob/M = loc
+ if(M.get_item_by_slot(ITEM_SLOT_MASK) == src)
+ to_chat(M, "[src]'s curse has been lifted!")
+ if(update_speech_mod)
+ UnregisterSignal(M, COMSIG_MOB_SAY)
+ M.update_inv_wear_mask()
+
+/obj/item/clothing/mask/animal/handle_speech(datum/source, list/speech_args)
+ if(clothing_flags & VOICEBOX_DISABLED)
+ return
+ if(!modifies_speech || !LAZYLEN(animal_sounds))
+ return
+ speech_args[SPEECH_MESSAGE] = pick((prob(animal_sounds_alt_probability) && LAZYLEN(animal_sounds_alt)) ? animal_sounds_alt : animal_sounds)
+
+/obj/item/clothing/mask/animal/equipped(mob/user, slot)
+ if(!iscarbon(user))
+ return ..()
+ if(slot == ITEM_SLOT_MASK && HAS_TRAIT_FROM(src, TRAIT_NODROP, CURSED_MASK_TRAIT))
+ to_chat(user, "[src] was cursed!")
+ return ..()
+
+
+/obj/item/clothing/mask/animal/pig
+ name = "pig mask"
+ desc = "A rubber pig mask with a built-in voice modulator."
+ animal_type = "pig"
+ icon_state = "pig"
+ inhand_icon_state = "pig"
+ animal_sounds = list("Oink!","Squeeeeeeee!","Oink Oink!")
+ curse_spawn_sound = 'sound/magic/pighead_curse.ogg'
+ flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
+
+/obj/item/clothing/mask/animal/pig/cursed
+ cursed = TRUE
+
+///frog mask - reeee!!
+/obj/item/clothing/mask/animal/frog
+ name = "frog mask"
+ desc = "An ancient mask carved in the shape of a frog.
Sanity is like gravity, all it needs is a push."
+ icon_state = "frog"
+ inhand_icon_state = "frog"
+ animal_sounds = list("Ree!!", "Reee!!","REEE!!","REEEEE!!")
+ animal_sounds_alt_probability = 5
+ animal_sounds_alt = list("HUUUUU!!","SMOOOOOKIN'!!","Hello my baby, hello my honey, hello my rag-time gal.", "Feels bad, man.", "GIT DIS GUY OFF ME!!" ,"SOMEBODY STOP ME!!", "NORMIES, GET OUT!!")
+ flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
+
+/obj/item/clothing/mask/animal/frog/cursed
+ cursed = TRUE
+
+/obj/item/clothing/mask/animal/cowmask
+ name = "cow mask"
+ icon_state = "cowmask"
+ inhand_icon_state = "cowmask"
+ flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
+ curse_spawn_sound = 'sound/magic/cowhead_curse.ogg'
+ animal_sounds = list("Moooooooo!","Moo!","Moooo!")
+
+/obj/item/clothing/mask/animal/cowmask/cursed
+ cursed = TRUE
+
+/obj/item/clothing/mask/animal/horsehead
+ name = "horse mask"
+ desc = "A mask made of soft vinyl and latex, representing the head of a horse."
+ animal_type = "horse"
+ icon_state = "horsehead"
+ inhand_icon_state = "horsehead"
+ animal_sounds = list("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!")
+ flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDEEYES|HIDEEARS
+ curse_spawn_sound = 'sound/magic/horsehead_curse.ogg'
+
+/obj/item/clothing/mask/animal/horsehead/cursed
+ cursed = TRUE
+
+/obj/item/clothing/mask/animal/rat
+ name = "rat mask"
+ desc = "A mask made of soft vinyl and latex, representing the head of a rat."
+ animal_type = "rat"
+ icon_state = "rat"
+ inhand_icon_state = "rat"
+ flags_inv = HIDEFACE
+ modifies_speech = FALSE
+ animal_sounds = list("Skree!","SKREEE!","Squeak!")
+
+/obj/item/clothing/mask/animal/rat/make_cursed()
+ flags_inv = NONE
+ return ..()
+
+/obj/item/clothing/mask/animal/rat/cursed
+ cursed = TRUE
+
+/obj/item/clothing/mask/animal/rat/fox
+ name = "fox mask"
+ desc = "A mask made of soft vinyl and latex, representing the head of a fox."
+ animal_type = "fox"
+ icon_state = "fox"
+ inhand_icon_state = "fox"
+ animal_sounds = list("Ack-Ack!","Ack-Ack-Ack-Ackawoooo!","Geckers!","AWOO!","TCHOFF!")
+
+/obj/item/clothing/mask/animal/rat/fox/cursed
+ cursed = TRUE
+
+/obj/item/clothing/mask/animal/rat/bee
+ name = "bee mask"
+ desc = "A mask made of soft vinyl and latex, representing the head of a bee."
+ animal_type = "bee"
+ icon_state = "bee"
+ inhand_icon_state = "bee"
+ animal_sounds = list("BZZT!", "BUZZZ!", "B-zzzz!", "Bzzzzzzttttt!")
+
+/obj/item/clothing/mask/animal/rat/bee/cursed
+ cursed = TRUE
+
+/obj/item/clothing/mask/animal/rat/bear
+ name = "bear mask"
+ desc = "A mask made of soft vinyl and latex, representing the head of a bear."
+ animal_type = "bear"
+ icon_state = "bear"
+ inhand_icon_state = "bear"
+ animal_sounds = list("RAWR!","Rawr!","GRR!","Growl!")
+
+/obj/item/clothing/mask/animal/rat/bear/cursed
+ cursed = TRUE
+
+/obj/item/clothing/mask/animal/rat/bat
+ name = "bat mask"
+ desc = "A mask made of soft vinyl and latex, representing the head of a bat."
+ animal_type = "bat"
+ icon_state = "bat"
+ inhand_icon_state = "bat"
+
+/obj/item/clothing/mask/animal/rat/bat/cursed
+ cursed = TRUE
+
+
+/obj/item/clothing/mask/animal/rat/raven
+ name = "raven mask"
+ desc = "A mask made of soft vinyl and latex, representing the head of a raven."
+ icon_state = "raven"
+ inhand_icon_state = "raven"
+ animal_type = "raven"
+ animal_sounds = list("CAW!", "C-CAWW!", "Squawk!")
+ animal_sounds_alt = list("Nevermore...")
+ animal_sounds_alt_probability = 1
+
+/obj/item/clothing/mask/animal/rat/raven/cursed
+ cursed = TRUE
+
+/obj/item/clothing/mask/animal/rat/jackal
+ name = "jackal mask"
+ desc = "A mask made of soft vinyl and latex, representing the head of a jackal."
+ animal_type = "jackal"
+ icon_state = "jackal"
+ inhand_icon_state = "jackal"
+ animal_sounds = list("YAP!", "Woof!", "Bark!", "AUUUUUU!")
+
+/obj/item/clothing/mask/animal/rat/jackal/cursed
+ cursed = TRUE
+
+/obj/item/clothing/mask/animal/rat/tribal
+ name = "tribal mask"
+ desc = "A mask carved out of wood, detailed carefully by hand."
+ animal_type = "tribal" //honk.
+ icon_state = "bumba"
+ inhand_icon_state = "bumba"
+ animal_sounds = list("Bad juju, mon!", "Da Iwa be praised!", "Sum bad mojo, dat!", "You do da voodoo, mon!")
+ animal_sounds_alt = list("Eekum-bokum!", "Oomenacka!", "In mah head..... Zombi.... Zombi!")
+ animal_sounds_alt_probability = 5
+
+/obj/item/clothing/mask/animal/rat/tribal/cursed //adminspawn only.
+ cursed = TRUE
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index 899799a200c..df8a341560e 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -70,159 +70,6 @@
desc = "Express your happiness or hide your sorrows with this laughing face with crying tears of joy cutout."
icon_state = "joy"
-/obj/item/clothing/mask/pig
- name = "pig mask"
- desc = "A rubber pig mask with a built-in voice modulator."
- icon_state = "pig"
- inhand_icon_state = "pig"
- flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
- clothing_flags = VOICEBOX_TOGGLABLE
- w_class = WEIGHT_CLASS_SMALL
- modifies_speech = TRUE
-
-/obj/item/clothing/mask/pig/handle_speech(datum/source, list/speech_args)
- if(!(clothing_flags & VOICEBOX_DISABLED))
- speech_args[SPEECH_MESSAGE] = pick("Oink!","Squeeeeeeee!","Oink Oink!")
-
-/obj/item/clothing/mask/pig/cursed
- name = "pig face"
- desc = "It looks like a mask, but closer inspection reveals it's melded onto this person's face!"
- flags_inv = HIDEFACIALHAIR
- clothing_flags = NONE
-
-/obj/item/clothing/mask/pig/cursed/Initialize()
- . = ..()
- ADD_TRAIT(src, TRAIT_NODROP, CURSED_MASK_TRAIT)
- playsound(get_turf(src), 'sound/magic/pighead_curse.ogg', 50, TRUE)
-
-///frog mask - reeee!!
-/obj/item/clothing/mask/frog
- name = "frog mask"
- desc = "An ancient mask carved in the shape of a frog.
Sanity is like gravity, all it needs is a push."
- icon_state = "frog"
- inhand_icon_state = "frog"
- flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
- w_class = WEIGHT_CLASS_SMALL
- clothing_flags = VOICEBOX_TOGGLABLE
- modifies_speech = TRUE
-
-/obj/item/clothing/mask/frog/handle_speech(datum/source, list/speech_args) //whenever you speak
- if(!(clothing_flags & VOICEBOX_DISABLED))
- if(prob(5)) //sometimes, the angry spirit finds others words to speak.
- speech_args[SPEECH_MESSAGE] = pick("HUUUUU!!","SMOOOOOKIN'!!","Hello my baby, hello my honey, hello my rag-time gal.", "Feels bad, man.", "GIT DIS GUY OFF ME!!" ,"SOMEBODY STOP ME!!", "NORMIES, GET OUT!!")
- else
- speech_args[SPEECH_MESSAGE] = pick("Ree!!", "Reee!!","REEE!!","REEEEE!!") //but its usually just angry gibberish,
-
-/obj/item/clothing/mask/frog/cursed
- clothing_flags = NONE
-
-/obj/item/clothing/mask/frog/cursed/Initialize()
- . = ..()
- ADD_TRAIT(src, TRAIT_NODROP, CURSED_MASK_TRAIT)
-
-/obj/item/clothing/mask/frog/cursed/equipped(mob/user, slot)
- var/mob/living/carbon/C = user
- if(C.wear_mask == src && HAS_TRAIT_FROM(src, TRAIT_NODROP, CURSED_MASK_TRAIT))
- to_chat(user, "[src] was cursed! Ree!!")
- return ..()
-
-/obj/item/clothing/mask/cowmask
- name = "cow mask"
- icon_state = "cowmask"
- inhand_icon_state = "cowmask"
- clothing_flags = VOICEBOX_TOGGLABLE
- flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
- w_class = WEIGHT_CLASS_SMALL
- modifies_speech = TRUE
-
-/obj/item/clothing/mask/cowmask/handle_speech(datum/source, list/speech_args)
- if(!(clothing_flags & VOICEBOX_DISABLED))
- speech_args[SPEECH_MESSAGE] = pick("Moooooooo!","Moo!","Moooo!")
-
-/obj/item/clothing/mask/cowmask/cursed
- name = "cow face"
- desc = "It looks like a cow mask, but closer inspection reveals it's melded onto this person's face!"
- flags_inv = HIDEFACIALHAIR
- clothing_flags = NONE
-
-/obj/item/clothing/mask/cowmask/cursed/Initialize()
- . = ..()
- ADD_TRAIT(src, TRAIT_NODROP, CURSED_MASK_TRAIT)
- playsound(get_turf(src), 'sound/magic/cowhead_curse.ogg', 50, TRUE)
-
-/obj/item/clothing/mask/horsehead
- name = "horse head mask"
- desc = "A mask made of soft vinyl and latex, representing the head of a horse."
- icon_state = "horsehead"
- inhand_icon_state = "horsehead"
- flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDEEYES|HIDEEARS
- w_class = WEIGHT_CLASS_SMALL
- clothing_flags = VOICEBOX_TOGGLABLE
-
-/obj/item/clothing/mask/horsehead/handle_speech(datum/source, list/speech_args)
- if(!(clothing_flags & VOICEBOX_DISABLED))
- speech_args[SPEECH_MESSAGE] = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!")
-
-/obj/item/clothing/mask/horsehead/cursed
- name = "horse face"
- desc = "It initially looks like a mask, but it's melded into the poor person's face."
- clothing_flags = NONE
- flags_inv = HIDEFACIALHAIR
-
-/obj/item/clothing/mask/horsehead/cursed/Initialize()
- . = ..()
- ADD_TRAIT(src, TRAIT_NODROP, CURSED_MASK_TRAIT)
- playsound(get_turf(src), 'sound/magic/horsehead_curse.ogg', 50, TRUE)
-
-/obj/item/clothing/mask/rat
- name = "rat mask"
- desc = "A mask made of soft vinyl and latex, representing the head of a rat."
- icon_state = "rat"
- inhand_icon_state = "rat"
- flags_inv = HIDEFACE
- flags_cover = MASKCOVERSMOUTH
-
-/obj/item/clothing/mask/rat/fox
- name = "fox mask"
- desc = "A mask made of soft vinyl and latex, representing the head of a fox."
- icon_state = "fox"
- inhand_icon_state = "fox"
-
-/obj/item/clothing/mask/rat/bee
- name = "bee mask"
- desc = "A mask made of soft vinyl and latex, representing the head of a bee."
- icon_state = "bee"
- inhand_icon_state = "bee"
-
-/obj/item/clothing/mask/rat/bear
- name = "bear mask"
- desc = "A mask made of soft vinyl and latex, representing the head of a bear."
- icon_state = "bear"
- inhand_icon_state = "bear"
-
-/obj/item/clothing/mask/rat/bat
- name = "bat mask"
- desc = "A mask made of soft vinyl and latex, representing the head of a bat."
- icon_state = "bat"
- inhand_icon_state = "bat"
-
-/obj/item/clothing/mask/rat/raven
- name = "raven mask"
- desc = "A mask made of soft vinyl and latex, representing the head of a raven."
- icon_state = "raven"
- inhand_icon_state = "raven"
-
-/obj/item/clothing/mask/rat/jackal
- name = "jackal mask"
- desc = "A mask made of soft vinyl and latex, representing the head of a jackal."
- icon_state = "jackal"
- inhand_icon_state = "jackal"
-
-/obj/item/clothing/mask/rat/tribal
- name = "tribal mask"
- desc = "A mask carved out of wood, detailed carefully by hand."
- icon_state = "bumba"
- inhand_icon_state = "bumba"
/obj/item/clothing/mask/bandana
name = "botany bandana"
diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm
index 1f165160831..6cd7da5144f 100644
--- a/code/modules/holiday/holidays.dm
+++ b/code/modules/holiday/holidays.dm
@@ -234,7 +234,7 @@
name = "Bee Day"
begin_day = 20
begin_month = MAY
- drone_hat = /obj/item/clothing/mask/rat/bee
+ drone_hat = /obj/item/clothing/mask/animal/rat/bee
/datum/holiday/bee/getStationPrefix()
return pick("Bee","Honey","Hive","Africanized","Mead","Buzz")
@@ -504,7 +504,7 @@
name = "Mayan Doomsday Anniversary"
begin_day = 21
begin_month = DECEMBER
- drone_hat = /obj/item/clothing/mask/rat/tribal
+ drone_hat = /obj/item/clothing/mask/animal/rat/tribal
/datum/holiday/xmas
name = CHRISTMAS
diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm
index a212e2bd9f3..2cc7fe77054 100644
--- a/code/modules/mob/living/simple_animal/corpse.dm
+++ b/code/modules/mob/living/simple_animal/corpse.dm
@@ -238,4 +238,4 @@
belt = /obj/item/storage/belt/fannypack/yellow/bee_terrorist
id = /obj/item/card/id
l_pocket = /obj/item/paper/fluff/bee_objectives
- mask = /obj/item/clothing/mask/rat/bee
+ mask = /obj/item/clothing/mask/animal/rat/bee
diff --git a/code/modules/spells/spell_types/pointed/barnyard.dm b/code/modules/spells/spell_types/pointed/barnyard.dm
index 4753f7b4182..a62f7d8e275 100644
--- a/code/modules/spells/spell_types/pointed/barnyard.dm
+++ b/code/modules/spells/spell_types/pointed/barnyard.dm
@@ -32,8 +32,7 @@
"Your face starts burning up, but the flames are repulsed by your anti-magic protection!")
return FALSE
- var/list/masks = list(/obj/item/clothing/mask/pig/cursed, /obj/item/clothing/mask/cowmask/cursed, /obj/item/clothing/mask/horsehead/cursed)
- var/choice = pick(masks)
+ var/choice = pick(GLOB.cursed_animal_masks)
var/obj/item/clothing/mask/magichead = new choice(get_turf(target))
target.visible_message("[target]'s face bursts into flames, and a barnyard animal's head takes its place!", \
diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm
index 24856fd74dc..2b82ae9b1eb 100644
--- a/code/modules/vending/autodrobe.dm
+++ b/code/modules/vending/autodrobe.dm
@@ -77,15 +77,15 @@
/obj/item/clothing/mask/gas/sexymime = 1,
/obj/item/clothing/under/rank/civilian/mime/sexy = 1,
/obj/item/clothing/under/rank/civilian/mime/skirt = 1,
- /obj/item/clothing/mask/rat/bat = 1,
- /obj/item/clothing/mask/rat/bee = 1,
- /obj/item/clothing/mask/rat/bear = 1,
- /obj/item/clothing/mask/rat/raven = 1,
- /obj/item/clothing/mask/rat/jackal = 1,
- /obj/item/clothing/mask/rat/fox = 1,
- /obj/item/clothing/mask/frog = 1,
- /obj/item/clothing/mask/rat/tribal = 1,
- /obj/item/clothing/mask/rat = 1,
+ /obj/item/clothing/mask/animal/rat/bat = 1,
+ /obj/item/clothing/mask/animal/rat/bee = 1,
+ /obj/item/clothing/mask/animal/rat/bear = 1,
+ /obj/item/clothing/mask/animal/rat/raven = 1,
+ /obj/item/clothing/mask/animal/rat/jackal = 1,
+ /obj/item/clothing/mask/animal/rat/fox = 1,
+ /obj/item/clothing/mask/animal/frog = 1,
+ /obj/item/clothing/mask/animal/rat/tribal = 1,
+ /obj/item/clothing/mask/animal/rat = 1,
/obj/item/clothing/suit/apron/overalls = 1,
/obj/item/clothing/head/rabbitears =1,
/obj/item/clothing/head/sombrero = 1,
diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi
index a7b80e1c25c..cda43a65cda 100644
Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 1fd8dd4b127..76e17f96cb4 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1788,6 +1788,7 @@
#include "code\modules\clothing\head\misc_special.dm"
#include "code\modules\clothing\head\soft_caps.dm"
#include "code\modules\clothing\masks\_masks.dm"
+#include "code\modules\clothing\masks\animal_masks.dm"
#include "code\modules\clothing\masks\boxing.dm"
#include "code\modules\clothing\masks\breath.dm"
#include "code\modules\clothing\masks\gasmask.dm"