diff --git a/code/__defines/dcs/signals.dm b/code/__defines/dcs/signals.dm
index 4c71d271d54..ec05e0a8bc2 100644
--- a/code/__defines/dcs/signals.dm
+++ b/code/__defines/dcs/signals.dm
@@ -33,5 +33,13 @@
// /mob signals
// /obj signals
+/// when a hood is unequipped
+#define COMSIG_ITEM_REMOVE "item_remove"
+/// checks an item's state
+#define COMSIG_ITEM_STATE_CHECK "state_check"
+/// updates an item between several states
+#define COMSIG_ITEM_UPDATE_STATE "update_state"
+/// updates sprites
+#define COMSIG_ITEM_ICON_UPDATE "icon_update"
/*******Component Specific Signals*******/
diff --git a/code/datums/observation/equipped.dm b/code/datums/observation/equipped.dm
index 06dc5a8b013..acddd989d67 100644
--- a/code/datums/observation/equipped.dm
+++ b/code/datums/observation/equipped.dm
@@ -38,6 +38,7 @@ var/datum/observ/item_equipped/item_equipped_event = new()
. = ..()
mob_equipped_event.raise_event(user, src, slot)
item_equipped_event.raise_event(src, user, slot)
+ SEND_SIGNAL(src, COMSIG_ITEM_REMOVE, src)
/obj/item/proc/check_equipped(var/mob/user, var/slot, var/assisted_equip = FALSE)
return TRUE
\ No newline at end of file
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 308898fc8ca..15fecfd12f4 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -336,6 +336,7 @@
/obj/item/proc/dropped(var/mob/user)
if(zoom)
zoom(user) //binoculars, scope, etc
+ SEND_SIGNAL(src, COMSIG_ITEM_REMOVE, src)
// Called whenever an object is moved around inside the mob's contents.
// Linker proc: mob/proc/prepare_for_slotmove, which is referenced in proc/handle_item_insertion and obj/item/attack_hand.
@@ -343,6 +344,7 @@
/obj/item/proc/on_slotmove(var/mob/user, slot)
if(zoom)
zoom(user)
+ SEND_SIGNAL(src, COMSIG_ITEM_REMOVE, src)
// called just as an item is picked up (loc is not yet changed)
/obj/item/proc/pickup(mob/user)
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 24ba21d0e8d..c2c8d6a9c3c 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -31,7 +31,6 @@
var/move_trail = /obj/effect/decal/cleanable/blood/tracks/footprints
-
/obj/item/clothing/Initialize(var/mapload, var/material_key)
. = ..(mapload)
if(!material_key)
@@ -292,6 +291,15 @@
siemens_coefficient = between(0, material.conductivity / 10, 10)
slowdown = between(0, round(material.weight / 10, 0.1), 6)
+/obj/item/clothing/proc/get_accessory(var/typepath)
+ if(istype(src, typepath))
+ return src
+ if(LAZYLEN(accessories))
+ var/accessory = locate(typepath) in accessories
+ if(accessory)
+ return accessory
+ return null
+
///////////////////////////////////////////////////////////////////////
// Ears: headsets, earmuffs and tiny objects
/obj/item/clothing/ears
diff --git a/code/modules/clothing/suits/hoodies.dm b/code/modules/clothing/suits/hoodies.dm
index e4247e1ff52..4512f077813 100644
--- a/code/modules/clothing/suits/hoodies.dm
+++ b/code/modules/clothing/suits/hoodies.dm
@@ -1,51 +1,23 @@
//Hoods for winter coats and chaplain hoodie etc
/obj/item/clothing/suit/storage/hooded
- var/obj/item/clothing/head/winterhood/hood
- var/hoodtype = null
- var/suittoggled = FALSE
var/opened = FALSE
sprite_sheets = list(
BODYTYPE_VAURCA_BULWARK = 'icons/mob/species/bulwark/hoodie.dmi'
)
+ var/hoodtype = /obj/item/clothing/head/winterhood
/obj/item/clothing/suit/storage/hooded/Initialize()
. = ..()
- MakeHood()
+ new hoodtype(src)
-/obj/item/clothing/suit/storage/hooded/Destroy()
- QDEL_NULL(hood)
- return ..()
-
-/obj/item/clothing/suit/storage/hooded/proc/MakeHood()
- if(!hood)
- hood = new hoodtype(src)
-
-/obj/item/clothing/suit/storage/hooded/equipped(mob/user, slot)
- if(slot != slot_wear_suit)
- RemoveHood()
- ..()
-
-/obj/item/clothing/suit/storage/hooded/proc/RemoveHood()
- suittoggled = FALSE
- icon_state = "[initial(icon_state)][opened ? "_open" : ""][suittoggled ? "_t" : ""]"
+/obj/item/clothing/suit/storage/hooded/update_icon(var/hooded = FALSE)
+ SEND_SIGNAL(src, COMSIG_ITEM_STATE_CHECK, args)
+ icon_state = "[initial(icon_state)][hooded ? "_t" : ""]"
item_state = icon_state
- // Hood got nuked. Probably because of RIGs or the like.
- if(!hood)
- MakeHood()
- return
-
- if(ishuman(hood.loc))
- var/mob/living/carbon/H = hood.loc
- H.unEquip(hood, 1)
- H.update_inv_wear_suit()
- hood.forceMove(src)
-
-/obj/item/clothing/suit/storage/hooded/dropped()
- RemoveHood()
-
-/obj/item/clothing/suit/storage/hooded/on_slotmove()
- RemoveHood()
+ . = ..()
+ if(usr)
+ usr.update_inv_wear_suit()
/obj/item/clothing/suit/storage/hooded/verb/ToggleHood()
set name = "Toggle Coat Hood"
@@ -55,31 +27,7 @@
if(use_check_and_message(usr))
return 0
- if(!suittoggled)
- if(ishuman(loc))
- var/mob/living/carbon/human/H = src.loc
- if(H.wear_suit != src)
- to_chat(H, "You must be wearing [src] to put up the hood!")
- return
- if(H.head)
- to_chat(H, "You're already wearing something on your head!")
- return
- else
- suittoggled = TRUE
- icon_state = "[initial(icon_state)][opened ? "_open" : ""]"
- //spawn appropriate hood.
- CreateHood()
- H.equip_to_slot_if_possible(hood,slot_head,0,0,1)
- H.update_inv_wear_suit()
- else
- RemoveHood()
-
-/obj/item/clothing/suit/storage/hooded/proc/CreateHood()
- hood.color = src.color
- hood.icon_state = "[icon_state]_hood"
- hood.item_state = "[icon_state]_hood"
- icon_state = "[icon_state][suittoggled ? "_t" : ""]"
- item_state = icon_state
+ SEND_SIGNAL(src, COMSIG_ITEM_UPDATE_STATE)
update_icon()
//hoodies and the like
@@ -98,7 +46,6 @@
bio = ARMOR_BIO_MINOR
)
siemens_coefficient = 0.75
- hoodtype = /obj/item/clothing/head/winterhood
/obj/item/clothing/head/winterhood
name = "winter hood"
@@ -112,6 +59,75 @@
flags_inv = HIDEEARS | BLOCKHAIR | HIDEEARS
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
canremove = 0
+ var/hooded = FALSE
+
+/obj/item/clothing/head/winterhood/Initialize(mapload, material_key)
+ . = ..()
+ if(isclothing(loc))
+ RegisterSignal(loc, COMSIG_ITEM_REMOVE, .proc/RemoveHood)
+ RegisterSignal(loc, COMSIG_PARENT_QDELETING, /datum/.proc/Destroy)
+ RegisterSignal(loc, COMSIG_ITEM_STATE_CHECK, .proc/hooded)
+ RegisterSignal(loc, COMSIG_ITEM_UPDATE_STATE, .proc/change_hood)
+ RegisterSignal(loc, COMSIG_ITEM_ICON_UPDATE, /atom/.proc/update_icon)
+ color = loc.color
+ icon_state = "[loc.icon_state]_hood"
+ item_state = "[loc.icon_state]_hood"
+
+/obj/item/clothing/head/winterhood/update_icon(mob/user)
+ . = ..()
+ if(isclothing(loc))
+ color = loc.color
+ icon_state = "[loc.icon_state]_hood"
+ item_state = "[loc.icon_state]_hood"
+
+/obj/item/clothing/head/winterhood/proc/hooded(var/hood, list/arguments)
+ arguments[1] = hooded
+
+/obj/item/clothing/head/winterhood/proc/change_hood(var/parent)
+ if(!hooded)
+ if(CheckSlot(parent))
+ var/mob/living/carbon/human/H = get_human(parent)
+ hooded = TRUE
+ update_icon(H)
+ H.equip_to_slot_if_possible(src,slot_head,0,0,1)
+ usr.visible_message(SPAN_NOTICE("[usr] pulls up the hood on \the [src]."))
+ else
+ RemoveHood(parent)
+ usr.visible_message(SPAN_NOTICE("[usr] pulls down the hood on \the [src]."))
+
+/obj/item/clothing/head/winterhood/proc/RemoveHood(var/parent)
+ if(ishuman(loc))
+ var/mob/living/carbon/H = loc
+ H.unEquip(src, 1)
+ forceMove(parent)
+ update_icon(H)
+ hooded = FALSE
+
+/obj/item/clothing/head/winterhood/proc/get_human(var/obj/parent)
+ var/mob/living/carbon/human/H
+ if(isclothing(parent.loc))
+ if(ishuman(parent.loc.loc))
+ H = parent.loc.loc
+ else if(ishuman(parent.loc))
+ H = parent.loc
+ return H
+
+/obj/item/clothing/head/winterhood/proc/CheckSlot(var/parent)
+ var/mob/living/carbon/human/H = get_human(parent)
+ var/obj/base_item = loc
+ if(isclothing(loc.loc))
+ base_item = loc.loc
+
+ if(H)
+ if(H.wear_suit != base_item && H.w_uniform != base_item)
+ to_chat(H, SPAN_WARNING("You must be wearing [base_item] to put up the hood!"))
+ return FALSE
+ else if(H.head)
+ to_chat(H, SPAN_WARNING("You're already wearing something on your head!"))
+ return FALSE
+ else
+ return TRUE
+ return FALSE
/obj/item/clothing/suit/storage/hooded/wintercoat/red
name = "red winter coat"
@@ -210,8 +226,6 @@
playsound(src, 'sound/items/zip.ogg', EQUIP_SOUND_VOLUME, TRUE)
icon_state = "[initial(icon_state)][opened ? "_open" : ""]"
item_state = icon_state
- if(suittoggled)
- CreateHood() //rebuild the hood with open/closed version
update_icon()
update_clothing_icon()
usr.update_inv_head()
diff --git a/code/modules/clothing/suits/xeno/tajara.dm b/code/modules/clothing/suits/xeno/tajara.dm
index 63cdd9a12bb..de69293c22b 100644
--- a/code/modules/clothing/suits/xeno/tajara.dm
+++ b/code/modules/clothing/suits/xeno/tajara.dm
@@ -108,7 +108,6 @@
contained_sprite = TRUE
flags_inv = HIDETAIL
no_overheat = TRUE
- hoodtype = /obj/item/clothing/head/winterhood
desc_fluff = "Today the fashion that dominates Adhomai shares few similarities to the clothing of old Furs, linen, hemp, silk and other such fabrics were traded for \
synthetic versions, creating a massive boom in the nylon industry and textile industry in the cities. Jeans, overcoats, army uniforms, parade uniforms, flags, pants, shirts, ties, \
suspenders, overalls are now the fashion of every Tajara from Nal'Tor to Kaltir. The protests of \"Old fashion\" supporters can't stand against how undeniably effective and cheap \
diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm
index 3f0bb3bcfeb..062e5a0cbea 100644
--- a/code/modules/clothing/under/accessories/holster.dm
+++ b/code/modules/clothing/under/accessories/holster.dm
@@ -116,14 +116,8 @@
if(usr.stat) return
//can't we just use src here?
- var/obj/item/clothing/accessory/holster/H = null
- if(istype(src, /obj/item/clothing/accessory/holster))
- H = src
- if(!H && istype(src, /obj/item/clothing))
- var/obj/item/clothing/S = src
- if(LAZYLEN(S.accessories))
- H = locate() in S.accessories
- if(!H && istype(src, /obj/item/clothing/suit/armor/tactical)) // This armor is a snowflake and has an integrated holster.
+ var/obj/item/clothing/accessory/holster/H = get_accessory(/obj/item/clothing/accessory/holster)
+ if(!H && istype(src, /obj/item/clothing/suit/armor/tactical)) // This armor is a snowflake and has an integrated holster.
var/obj/item/clothing/suit/armor/tactical/tacticool = src
H = tacticool.holster
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index a3aa6fce56c..c4ffd3e03bc 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -2102,6 +2102,35 @@ All custom items with worn sprites must follow the contained sprite system: http
var/desc2 = "A blue cloak with the symbol of the New Kingdom of Adhomai proudly displayed on the back.\nUpon closer examination it appears to be a patchwork of older textile and newer fabrics, with the inside of the cloak appearing to be colored differently."
var/changed = FALSE
+ var/hoodtype = /obj/item/clothing/head/winterhood/fluff/kathira_hood
+
+/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/Initialize()
+ . = ..()
+ new hoodtype(src)
+
+/obj/item/clothing/head/winterhood/fluff/kathira_hood
+ name = "handsewn hood"
+ desc = "A hood attached to a cloak."
+ icon = 'icons/obj/custom_items/kathira_cloak.dmi'
+ icon_override = 'icons/obj/custom_items/kathira_cloak.dmi'
+ icon_state = "idris_cloak_hood"
+ contained_sprite = TRUE
+ flags_inv = HIDEEARS | BLOCKHAIR | HIDEEARS
+
+/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/update_icon(var/hooded = FALSE)
+ var/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/K = get_accessory(/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak)
+ K.icon_state = "[K.changed ? K.style : initial(K.icon_state)]"
+ SEND_SIGNAL(K, COMSIG_ITEM_STATE_CHECK, args)
+ K.item_state = "[K.icon_state][hooded ? "_up" : ""]"
+ K.name = "[K.changed ? K.name2 : initial(K.name)]"
+ K.desc = "[K.changed ? K.desc2 : initial(K.desc)]"
+ K.accessory_mob_overlay = null
+ . = ..()
+ SEND_SIGNAL(K, COMSIG_ITEM_ICON_UPDATE)
+ if(usr)
+ usr.update_inv_w_uniform()
+ usr.update_inv_wear_suit()
+
/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/verb/change_cloak()
set name = "Change Cloak"
set category = "Object"
@@ -2110,38 +2139,40 @@ All custom items with worn sprites must follow the contained sprite system: http
if(use_check_and_message(usr))
return
- var/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/K = null
- if(istype(src, /obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak))
- K = src
- if(!K && isclothing(src))
- var/obj/item/clothing/S = src
- if(LAZYLEN(S.accessories))
- K = locate() in S.accessories
+ var/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/K = get_accessory(/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak)
if(!K)
return
usr.visible_message(SPAN_NOTICE("[usr] swiftly pulls \the [K] inside out, changing its appearance."))
- K.icon_state = "[K.changed ? initial(K.icon_state) : K.style]"
- K.item_state = K.icon_state
- K.name = "[K.changed ? initial(K.name) : K.name2]"
- K.desc = "[K.changed ? initial(K.desc) : K.desc2]"
- K.accessory_mob_overlay = null
-
K.changed = !K.changed
K.update_icon()
- usr.update_icon()
- usr.update_inv_w_uniform()
- usr.update_inv_wear_suit()
+ SEND_SIGNAL(K, COMSIG_ITEM_REMOVE, K)
/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/on_attached(obj/item/clothing/S, mob/user as mob)
..()
has_suit.verbs += /obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/verb/change_cloak
+ has_suit.verbs += /obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/verb/change_hood
/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/on_removed(mob/user as mob)
if(has_suit)
has_suit.verbs -= /obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/verb/change_cloak
+ has_suit.verbs -= /obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/verb/change_hood
..()
+/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/verb/change_hood()
+ set name = "Toggle Hood"
+ set category = "Object"
+ set src in usr
+
+ if(use_check_and_message(usr))
+ return
+
+ var/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak/K = get_accessory(/obj/item/clothing/accessory/poncho/tajarancloak/fluff/kathira_cloak)
+ if(!K)
+ return
+
+ SEND_SIGNAL(K, COMSIG_ITEM_UPDATE_STATE, K)
+ K.update_icon()
/obj/item/clothing/suit/storage/toggle/fluff/leonid_chokha //Old Rebel's Chokha - Leonid Myagmar - lucaken
name = "old rebel's chokha"
@@ -2154,7 +2185,6 @@ All custom items with worn sprites must follow the contained sprite system: http
item_state = "leonid_chokha"
contained_sprite = TRUE
-
/obj/item/clothing/suit/storage/toggle/fluff/sezrak_coat //red Domelkoan Coat - Sezrak Han'san - captaingecko
name = "red Domelkoan Coat"
desc = "A warm coat made in Domelkos. This red coat is stuffed with yupmi fur and made out of reinforced cloth-like synthetic materials, both to keep the wearer warm in the cold winters of \
@@ -2203,7 +2233,6 @@ All custom items with worn sprites must follow the contained sprite system: http
contained_sprite = TRUE
slot_flags = SLOT_EARS | SLOT_TIE
-
/obj/item/clothing/under/fluff/quoro_robes //Black Robes - Quoro Wurri'Til - witchbells
name = "black robes"
desc = "Some simple black robes, made to wear under something more elaborate. The fabric has a distinct texture to it, giving you the impression of activewear or swimsuits."
diff --git a/html/changelogs/HoodChanges.yml b/html/changelogs/HoodChanges.yml
new file mode 100644
index 00000000000..fd884cb880e
--- /dev/null
+++ b/html/changelogs/HoodChanges.yml
@@ -0,0 +1,6 @@
+author: TheGreyWolf
+
+delete-after: True
+
+changes:
+ - tweak: "Changed how hoods works slightly. Shouldn't be any player-facing changes."
diff --git a/icons/obj/custom_items/kathira_cloak.dmi b/icons/obj/custom_items/kathira_cloak.dmi
index fe5579a9592..da74247145a 100644
Binary files a/icons/obj/custom_items/kathira_cloak.dmi and b/icons/obj/custom_items/kathira_cloak.dmi differ