From d365553af1abe46198f3c5adad90cf77500b1b19 Mon Sep 17 00:00:00 2001 From: CHOMPStation2StaffMirrorBot <94713762+CHOMPStation2StaffMirrorBot@users.noreply.github.com> Date: Thu, 9 Oct 2025 06:34:23 -0700 Subject: [PATCH] [MIRROR] Adds a new loadout item - Cloak of Eyes (#11801) Co-authored-by: Cameron Lennox Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com> --- .../datums/components/reactive_icon_update.dm | 21 ++- .../preference_setup/loadout/loadout_suit.dm | 5 + .../vore/fluffstuff/custom_clothes_vr.dm | 149 ++++++++++++------ .../eyerobes/custom_clothes_robe_item.dmi | Bin 0 -> 1050 bytes .../eyerobes/custom_clothes_robe_mob.dmi | Bin 0 -> 2718 bytes .../eyerobes/eyerobe_components.dmi | Bin 0 -> 2697 bytes 6 files changed, 124 insertions(+), 51 deletions(-) create mode 100644 icons/vore/fluff_clothing/eyerobes/custom_clothes_robe_item.dmi create mode 100644 icons/vore/fluff_clothing/eyerobes/custom_clothes_robe_mob.dmi create mode 100644 icons/vore/fluff_clothing/eyerobes/eyerobe_components.dmi diff --git a/code/datums/components/reactive_icon_update.dm b/code/datums/components/reactive_icon_update.dm index 4e3c26e861..dffe5faa5f 100644 --- a/code/datums/components/reactive_icon_update.dm +++ b/code/datums/components/reactive_icon_update.dm @@ -33,7 +33,6 @@ /datum/component/reactive_icon_update/proc/update_proximity_icon(atom/current_loc, atom/movable/AM, atom/old_loc) SIGNAL_HANDLER - SHOULD_NOT_OVERRIDE(TRUE) var/obj/our_item = parent if(!ismob(AM) || !mob_check(AM)) return @@ -124,6 +123,26 @@ //The icon_state will be changed to cloak_direction_north our_item.icon_state = initial(our_item.icon_state) + icon_prefix + "_" + directional_name +///Variant of the reactive_icon_update component that allows for setting what slot is should be in to update it! +/datum/component/reactive_icon_update/clothing + +/datum/component/reactive_icon_update/clothing/update_proximity_icon(atom/current_loc, atom/movable/AM, atom/old_loc) + . = ..() + //Code to actually update the mob wearing us + var/obj/our_object = parent + if(ishuman(our_object.loc)) //If we're being worn + var/mob/living/carbon/human/wearing_mob = our_object.loc + + //Code to actually update the mob wearing us + //Only suit and uniform for now...Feel free to expand if you need. + if(wearing_mob.wear_suit == our_object) + wearing_mob.update_inv_wear_suit() + return + if(wearing_mob.w_uniform == our_object) + wearing_mob.update_inv_w_uniform() + return + + //Example item for testing directions. /obj/item/tool/screwdriver/test_driver icon = 'icons/obj/directional_test.dmi' diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index 8faacc9bbf..274efec16e 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -1177,3 +1177,8 @@ Talon winter coat /datum/gear/suit/pirate_coat display_name = "pirate coat" path = /obj/item/clothing/suit/pirate + +/datum/gear/suit/cloak_of_eyes + display_name = "cloak of eyes" + description = "A basic looking purple robe that has a hood and can be toggled to have eyes form and stare at moving creatures!" + path = /obj/item/clothing/suit/storage/hooded/purple_robes diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index 873ba94ab4..3b4b5bc480 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -181,7 +181,7 @@ body_parts_covered = CHEST|ARMS allowed = list(POCKET_GENERIC, POCKET_EMERGENCY, POCKET_SECURITY, POCKET_DETECTIVE) armor = list(melee = 10, bullet = 20, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0) //As much armor as the cyberpunk jacket. Also priced the same. - var/unbuttoned = 0 + var/unbuttoned = FALSE /obj/item/clothing/suit/storage/fluff/fedcoat/verb/toggle() set name = "Toggle coat buttons" @@ -189,19 +189,18 @@ set src in usr if(!usr.canmove || usr.stat || usr.restrained()) - return 0 + return FALSE - switch(unbuttoned) - if(0) - icon_state = "[initial(icon_state)]_open" - item_state = "[initial(item_state)]_open" - unbuttoned = 1 - to_chat(usr, "You unbutton the coat.") - if(1) - icon_state = "[initial(icon_state)]" - item_state = "[initial(item_state)]" - unbuttoned = 0 - to_chat(usr, "You button up the coat.") + if(unbuttoned) + icon_state = "[initial(icon_state)]" + item_state = "[initial(item_state)]" + unbuttoned = FALSE + to_chat(usr, "You button up the coat.") + else + icon_state = "[initial(icon_state)]_open" + item_state = "[initial(item_state)]_open" + unbuttoned = TRUE + to_chat(usr, "You unbutton the coat.") usr.update_inv_wear_suit() //Variants @@ -684,14 +683,12 @@ // to_chat(user, "You cannot turn the light on while in this [user.loc]") // return - switch(light_on) - if(0) - to_chat(user, "You light up your pom-pom.") - icon_state = "pom-on" - - if(1) - to_chat(user, "You dim your pom-pom.") - icon_state = "pom" + if(light_on) + to_chat(user, "You dim your pom-pom.") + icon_state = "pom" + else + to_chat(user, "You light up your pom-pom.") + icon_state = "pom-on" //update_light(user) -- old code update_flashlight(user) @@ -1246,7 +1243,7 @@ Departamental Swimsuits, for general use icon_state = "fjacket" default_worn_icon = 'icons/vore/custom_clothes_mob.dmi' - var/unbuttoned = 0 + var/unbuttoned = FALSE /obj/item/clothing/suit/storage/fluff/jacket/verb/toggle() set name = "Toggle coat buttons" @@ -1254,19 +1251,18 @@ Departamental Swimsuits, for general use set src in usr if(!usr.canmove || usr.stat || usr.restrained()) - return 0 + return FALSE - switch(unbuttoned) - if(0) - icon_state = "[initial(icon_state)]_open" - item_state = "[initial(item_state)]_open" - unbuttoned = 1 - to_chat(usr, "You unbutton the coat.") - if(1) - icon_state = "[initial(icon_state)]" - item_state = "[initial(item_state)]" - unbuttoned = 0 - to_chat(usr, "You button up the coat.") + if(unbuttoned) + icon_state = "[initial(icon_state)]" + item_state = "[initial(item_state)]" + unbuttoned = FALSE + to_chat(usr, "You button up the coat.") + else + icon_state = "[initial(icon_state)]_open" + item_state = "[initial(item_state)]_open" + unbuttoned = TRUE + to_chat(usr, "You unbutton the coat.") usr.update_inv_wear_suit() /obj/item/clothing/suit/storage/fluff/jacket/field //Just here so it can be seen and easily recognized under /spawn. @@ -2257,23 +2253,20 @@ Departamental Swimsuits, for general use set category = "Object" set src in usr if(!usr.canmove || usr.stat || usr.restrained()) - return 0 + return FALSE - if(open == 1) //Will check whether icon state is currently set to the "open" or "closed" state and switch it around with a message to the user - open = 0 + if(open) //Will check whether icon state is currently set to the "open" or "closed" state and switch it around with a message to the user + open = FALSE icon_state = initial(icon_state) item_state = initial(item_state) flags_inv = HIDETIE|HIDEHOLSTER to_chat(usr, "You button up the coat.") - else if(open == 0) - open = 1 + else + open = TRUE icon_state = "[icon_state]_open" item_state = "[item_state]_open" flags_inv = HIDEHOLSTER to_chat(usr, "You unbutton the coat.") - else //in case some goofy admin switches icon states around without switching the icon_open or icon_closed - to_chat(usr, "You attempt to button-up the velcro on your [src], before promptly realising how silly you are.") - return update_clothing_icon() //so our overlays update /obj/item/clothing/head/welding/fluff/zera @@ -2324,23 +2317,20 @@ Departamental Swimsuits, for general use set category = "Object" set src in usr if(!usr.canmove || usr.stat || usr.restrained()) - return 0 + return FALSE - if(open == 1) //Will check whether icon state is currently set to the "open" or "closed" state and switch it around with a message to the user - open = 0 + if(open) //Will check whether icon state is currently set to the "open" or "closed" state and switch it around with a message to the user + open = FALSE icon_state = initial(icon_state) item_state = initial(item_state) flags_inv = HIDETIE|HIDEHOLSTER to_chat(usr, "You button up the coat.") - else if(open == 0) - open = 1 + else + open = TRUE icon_state = "[icon_state]_open" item_state = "[item_state]_open" flags_inv = HIDEHOLSTER to_chat(usr, "You unbutton the coat.") - else //in case some goofy admin switches icon states around without switching the icon_open or icon_closed - to_chat(usr, "You attempt to button-up the velcro on your [src], before promptly realising how silly you are.") - return update_clothing_icon() //so our overlays update /obj/item/clothing/head/fluff/zerahat @@ -2418,3 +2408,62 @@ End CHOMP Removal*/ default_worn_icon = 'icons/vore/custom_clothes_mob.dmi' slot_flags = SLOT_HEAD */ //Chomp REMOVE END + +//For general use +/obj/item/clothing/suit/storage/hooded/purple_robes + name = "Purple Robes" + desc = "A basic set of purple robes. This one has a tag that reads 'Now with eye-tracking technology!'" + + icon = 'icons/vore/fluff_clothing/eyerobes/custom_clothes_robe_item.dmi' + icon_state = "purple_robes" + default_worn_icon = 'icons/vore/fluff_clothing/eyerobes/custom_clothes_robe_mob.dmi' + hoodtype = /obj/item/clothing/head/hood/purple_robes + + blood_overlay_type = "coat" + has_hood_sprite = FALSE //No need. + body_parts_covered = CHEST|ARMS|LEGS + allowed = list(POCKET_GENERIC, POCKET_EMERGENCY) + var/toggled = FALSE + var/last_toggled = 0 + +/obj/item/clothing/suit/storage/hooded/purple_robes/verb/toggle() + set name = "Toggle Eyes" + set category = "Object" + set src in usr + toggle_eyes(usr) + +/obj/item/clothing/suit/storage/hooded/purple_robes/proc/toggle_eyes(mob/user) + + if(!user.canmove || user.stat || user.restrained()) + return FALSE + + //Antispam. + if((last_toggled + 6 SECONDS) > world.time) //Can only toggle it once every 6 seconds! + to_chat(user, span_info("You can only toggle the eyes every six seconds!")) + return + + + if(!toggled) + AddComponent(/datum/component/reactive_icon_update/clothing, \ + icon_prefix = "_corrupted", \ + directions = list(NORTH,EAST,SOUTH,WEST,SOUTHWEST,SOUTHEAST,NORTHWEST,NORTHEAST), \ + range = 3, \ + triggering_mobs = list(/mob/living)) + toggled = TRUE + to_chat(user, span_info("The coat's eyes open.")) + else + var/datum/component/reactive_icon_update/clothing/reactive_component = GetComponent(/datum/component/reactive_icon_update/clothing) + if(reactive_component) + qdel(reactive_component) + toggled = FALSE + icon_state = initial(icon_state) + item_state = initial(item_state) + to_chat(user, span_info("The coat's eyes close.")) + last_toggled = world.time + user.update_inv_wear_suit() + +/obj/item/clothing/head/hood/purple_robes + name = "purple hood" + icon = 'icons/vore/fluff_clothing/eyerobes/custom_clothes_robe_item.dmi' + icon_state = "hood" + default_worn_icon = 'icons/vore/fluff_clothing/eyerobes/custom_clothes_robe_mob.dmi' diff --git a/icons/vore/fluff_clothing/eyerobes/custom_clothes_robe_item.dmi b/icons/vore/fluff_clothing/eyerobes/custom_clothes_robe_item.dmi new file mode 100644 index 0000000000000000000000000000000000000000..0e43270edd876c4ee5002751387c0aad86dd17ab GIT binary patch literal 1050 zcmV+#1m*jQP)fFDZ*Bkpc$}q@&kDjY493sxQ2!Trf#eBuWz2g;^yZ4DV+cS0^>yt=^N+7KPj6CE%h z_23>hwv#g8zAyC>^5WV z8py+C)D$mspY+dxw|G0f?j**A5B6q-WzT@ad?;_>KH!5H^p@=k z0q(itxVGy!Fz?a9DD5DdYp%|MhTi1^t70G(miT*8lGRKJ5Rx9L%79G>=f;SjK0V527GJ{l71d zk^dUTLBMHRqThSxc|38^1T4@gDS@7 zr2qHH_X5lhifs2O?SH}tm><*uYw$p?Xn-*fP#N<8l`#)c8S?;@IS){kJn(Pp7d=Qm U=V2!PuK)l507*qoM6N<$f~hC`DF6Tf literal 0 HcmV?d00001 diff --git a/icons/vore/fluff_clothing/eyerobes/custom_clothes_robe_mob.dmi b/icons/vore/fluff_clothing/eyerobes/custom_clothes_robe_mob.dmi new file mode 100644 index 0000000000000000000000000000000000000000..c8454b9ae9780e78b6e94de980a403fb96cb6d38 GIT binary patch literal 2718 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 YGd^2b%d$Q$+5i9m07*qoM6N<$f_(&pi~s-t literal 0 HcmV?d00001 diff --git a/icons/vore/fluff_clothing/eyerobes/eyerobe_components.dmi b/icons/vore/fluff_clothing/eyerobes/eyerobe_components.dmi new file mode 100644 index 0000000000000000000000000000000000000000..99189b32da08d7f0218240be1d100d8b88732269 GIT binary patch literal 2697 zcmV;43U>90P)%0000dP)t-s0000c z3@J4cIZYT+LlsD3X?CEnxUgixT}P5MGehN&xgZ)X)#Bpa6afSP0004WQchCV=-0C=30lsyZ=Fc604E_B0uq zlq6OB_XZ1s&=POEJ02bm?&WfEl&1U{S zv$Bg|KFEhRzuvdI!{NMd-_VR17#K`p+xAtRdR~+Kd3~=WK8gTG*AKBvpGTD&b!31!BrzdZD zFU)3{CqH(c3+j_3`4ZI2E41(}SUp5$++RhP+~2hD#$d+n%>p8>f7 z+YupHYpZrT2OL;GOis``fX9~}V?6Krjqj1YPbLAm0*?#fxfubUd))V7{np8(j|RZw zGwa1G`pLv-?BQpCufP*Qx0ex+4AMVbe=F}HO0@C`Fh=^XLBmNGo}8t&s9qaI4z9&P zu(f}7y*>dUL>__PJ(TsMcSzvDU-Rp=QSp7>)2P>nT=`s`dIJN4w}`*LYXXLWVPF^- z1`8QfT^Z0q+qWGQ$Ef;>@8#{VisF09fGRBOf#2=|n>+0gQSkl9N1+~pMPmRQ{!<3k zsloz6IXew@fz3UK3)oc%-{z1Kjo+U!ya^}aKViV%C@k)*ocGdDFSDzm@O&gX@zCQT zETQrHc<=-hSR53bGHAb1SmqAfqUU?SuKL|j0R4m20$I?(^8$y@<34st!hg)5a;mWO zP771pelN4rIpMW~8(FuNKo)fIEW`w?{)01IE?`hORaj;lcWFxsp~yD!j!+436lgS` zT>jO392st?Q+ej(1PXP`g? zK6BvIRVGB+ugv+ zWUeYtrvdDm&KDp=>iK6jo2qPAE2j=C_SClRS%ZqRSqm_MV6&F{Ww4BY>CkBhfuA`% zwKE4ckAe>D+?Fem&9s2Nj;X>z?TRGOg&m}+sW%}1m8nDfO#2cD;O$6dJ^e1Q&$Ltd zKfvFHlAv3f|LFw=VCAJYb9g`}VGwFaE_6Hgwh1WP!NNJ<_)!xf9wrg7kqHhUZsgc>duJrG1Pl_iqi8 zZLAOM4EMy{c?;*hx3dih)VBkV-z$wk^P7z%*+crktt3hKkMkCve{Clxn^})Wa+~S{ zI@s!Z(jU?X(u@l}pOv+n!h3({W<9PXdsH9L0pF|)ljJqj2PVnzF4hO$PhgkH-U5B# z!jR$l#$@;!>H{aqgz5t)u*@I497KbH1G7@mLl7bQIZqQsPp%Foi_@3B5` z^9M-aW3tQsXje<1Pza=x?l-ToovRN_bo7Bmc$@lwfq{X6fx#~li*u5X&os)%u{u6E z1W}MTtt8twpVJn({jC?2LF<^jtj

`HCjnH;)FSMeY??;{#IvYD_%h^a9eqL6hy- z>QRFbfGrx2MufmKhL3Etp5uX!vNR`pPv}Ep>|1EGXmxxCA7Y7>9FQ1UbQURTGA|X1=s*IaPw3zn zPNLR}S4uhrc6qK`t>pmM4doz~f>!wimP8>%0|NsC0|NsC1B15;d>2J{Z_dq2;GZ<(CtOyW+g6$)H zK*?!g=gJT`HGc zJMr97--N0^&z}Re@hZvgFUTXdcAE4l(CBJBg6#_$r@7c_CO(k>y_YC^Lzn~<`)cr zC@I0M_W1$~Ypi6o6rkku1?R{sQee&(7#J8BToC^QukIqB8LM?a00000NkvXXu0mjf D_|*H) literal 0 HcmV?d00001