From dc4c03d594cc7484a00a91fe1f439659e41108da Mon Sep 17 00:00:00 2001
From: Casper3667 <8396443+Casper3667@users.noreply.github.com>
Date: Fri, 18 Feb 2022 12:06:36 +0100
Subject: [PATCH] Adds a hood to Kathira's cloak and changes how hoods works
slightly (#13060)
---
code/__defines/dcs/signals.dm | 8 +
code/datums/observation/equipped.dm | 1 +
code/game/objects/items.dm | 2 +
code/modules/clothing/clothing.dm | 10 +-
code/modules/clothing/suits/hoodies.dm | 142 ++++++++++--------
code/modules/clothing/suits/xeno/tajara.dm | 1 -
.../clothing/under/accessories/holster.dm | 10 +-
code/modules/customitems/item_defines.dm | 65 +++++---
html/changelogs/HoodChanges.yml | 6 +
icons/obj/custom_items/kathira_cloak.dmi | Bin 1305 -> 5562 bytes
10 files changed, 153 insertions(+), 92 deletions(-)
create mode 100644 html/changelogs/HoodChanges.yml
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 fe5579a95928b58cc2c19d077db0d9998bed90fa..da74247145a0022e643ef710d5f0bd28b61503ec 100644
GIT binary patch
literal 5562
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
cn{1sl!Azg%8i(f|Me
literal 1305
zcmV+!1?KvRP)004jp0{{R3yS
zXsfHMva+%nFE5#ynZm-tKUI-RWT-DcYc)uEL|mCUO@j3F^uWNtaAV<100001bW%=J
z06^y0W&i*Hih5L7bVOxyV{&P5bZKvH004NLQ&w|IVV3cTZxM^C9|j)C~C;X
znO2mTn+joLQyX7gicoGsSb1q4LFIYbiA1^su975U@iIsfv803T0jW}PQbdTNkC(tf9GV6ET3=@TK_Vq0rS$af^0o>5G4eAAw&W{
zIHBdMs){Cr@y*t(fZ{U?+-|4>4`9z%CpAH6_dhc!`J>V;=$O_e^&8q9%Wr+z4L*%K>mNa6U`u;_CtFLz)#u(Y7sI-FzfqDeM*l
z1a)WAy7+v63DC9u#iJDtXx3KPRg!l$F21Do0KTn1uTLU8w{3IN}@KObQ9{BH!*7~sP^QSv`^_oAK%7&!k^Lq6%@iRIi8tCOf3#IrHJAou6D@es_W2Ukz7c+yc5Be#vytj%z3&$Nm0V=ifQm
zBg1#oPUV|zrPu;lbWco``caQ
zMUuPR14>QjgPI2P`P%?i!hn(z4Pgx*H1J|tNNfUBoE;JKHHAJCfPVjLyspqC^as#1
z@IoHLIe-_ZhT+=n8!PNi%xVfY&WHgxFWSd5E2_8ACx-
z`26qlK@#w~#pVza`5?SRq$44*=ZpaK_&?5r0cx|wJz$6PSwa_I59o8p{oexAot?ky
zrsjk8FAWO-LIt|T^Yg);&{-^#w5S^O;Kaj;@{h#^^IoYCBi>7n9
P00000NkvXXu0mjfm~L&7