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@iI&#sfv803T0jW}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