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