From 42ff9b1d35a46914a156c740a70b4875b9a56966 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Tue, 14 Apr 2020 01:23:26 +0200 Subject: [PATCH] Final test, fixes and parent calls. --- code/datums/elements/polychromic.dm | 61 +++++++++--------- code/game/objects/items/holy_weapons.dm | 2 +- code/game/objects/items/tanks/watertank.dm | 2 +- code/game/objects/items/tools/screwdriver.dm | 2 +- .../clockcult/clock_items/clockwork_slab.dm | 2 +- code/modules/antagonists/cult/cult_items.dm | 2 +- code/modules/clothing/glasses/_glasses.dm | 2 +- code/modules/clothing/gloves/_gloves.dm | 2 +- code/modules/clothing/head/_head.dm | 2 +- code/modules/clothing/head/misc_special.dm | 2 +- code/modules/clothing/masks/_masks.dm | 2 +- code/modules/clothing/neck/_neck.dm | 2 +- code/modules/clothing/shoes/_shoes.dm | 2 +- code/modules/food_and_drinks/pizzabox.dm | 2 +- icons/obj/clothing/cloaks.dmi | Bin 2114 -> 2616 bytes icons/obj/clothing/neck.dmi | Bin 3253 -> 2759 bytes 16 files changed, 42 insertions(+), 45 deletions(-) diff --git a/code/datums/elements/polychromic.dm b/code/datums/elements/polychromic.dm index f664ed9063..bce5a765fe 100644 --- a/code/datums/elements/polychromic.dm +++ b/code/datums/elements/polychromic.dm @@ -9,11 +9,10 @@ var/overlays_states //A list or a number of states. In the latter case, the atom icon_state/item_state will be used followed by a number. var/list/colors_by_atom = list() //list of color strings or mutable appearances, depending on the above variable. var/icon_file + var/worn_file //used in place of items' held or mob overlay icons if present. var/list/overlays_names //wrap numbers into text strings please. var/list/actions_by_atom = list() - var/list/already_updates_onmob = list() var/poly_flags - var/worn_file //used in place of items' held or mob overlay icons if present. var/static/list/suits_with_helmet_typecache = typecacheof(list(/obj/item/clothing/suit/hooded, /obj/item/clothing/suit/space/hardsuit)) var/list/helmet_by_suit //because poly winter coats exist. var/list/suit_by_helmet //Idem. @@ -58,11 +57,8 @@ if(_flags & POLYCHROMIC_ACTION) RegisterSignal(A, COMSIG_ITEM_EQUIPPED, .proc/grant_user_action) RegisterSignal(A, COMSIG_ITEM_DROPPED, .proc/remove_user_action) - if(!(_flags & POLYCHROMIC_NO_HELD) && !(_flags & POLYCHROMIC_NO_WORN)) - if(!SSdcs.GetElement(/datum/element/update_icon_updates_onmob)) - A.AddElement(/datum/element/update_icon_updates_onmob) - else - LAZYSET(already_updates_onmob, A, TRUE) + if(!(_flags & POLYCHROMIC_NO_WORN) || !(_flags & POLYCHROMIC_NO_HELD)) + A.AddElement(/datum/element/update_icon_updates_onmob) RegisterSignal(A, COMSIG_ITEM_WORN_OVERLAYS, .proc/apply_worn_overlays) if(suits_with_helmet_typecache[A.type]) RegisterSignal(A, COMSIG_SUIT_MADE_HELMET, .proc/register_helmet) @@ -83,19 +79,16 @@ qdel(P) UnregisterSignal(A, list(COMSIG_PARENT_EXAMINE, COMSIG_CLICK_ALT, COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED, COMSIG_ITEM_WORN_OVERLAYS, COMSIG_SUIT_MADE_HELMET)) if(isitem(A)) - if(!(poly_flags & POLYCHROMIC_NO_HELD) && !(poly_flags & POLYCHROMIC_NO_WORN)) - if(!already_updates_onmob[A]) - A.RemoveElement(/datum/element/update_icon_updates_onmob) - else - LAZYREMOVE(already_updates_onmob, A) - var/obj/item/clothing/head/H = helmet_by_suit[A] - if(H) - UnregisterSignal(H, list(COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_ITEM_WORN_OVERLAYS, COMSIG_PARENT_QDELETING)) - LAZYREMOVE(helmet_by_suit, A) - LAZYREMOVE(suit_by_helmet, H) - colors_by_atom -= H - if(!QDELETED(H)) - H.update_icon() //removing the overlays + var/obj/item/clothing/head/H = helmet_by_suit[A] + if(H) + UnregisterSignal(H, list(COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_ITEM_WORN_OVERLAYS, COMSIG_PARENT_QDELETING)) + LAZYREMOVE(helmet_by_suit, A) + LAZYREMOVE(suit_by_helmet, H) + colors_by_atom -= H + if(!QDELETED(H)) + H.update_icon() //removing the overlays + if(!(poly_flags & POLYCHROMIC_NO_WORN) || !(poly_flags & POLYCHROMIC_NO_HELD)) + A.RemoveElement(/datum/element/update_icon_updates_onmob) if(!QDELETED(A) && ismob(A.loc)) var/mob/M = A.loc if(!(poly_flags & POLYCHROMIC_NO_HELD) && M.is_holding(A)) @@ -124,26 +117,29 @@ for(var/i in 1 to overlays_states) overlays += mutable_appearance(f_icon, "[used_state]-[i]", color = L[i]) else - for(var/I in 1 to length(overlays_states)) - var/mutable_appearance/M = L[I] - overlays += mutable_appearance(f_icon, overlays_states[I], color = M.color) + for(var/i in 1 to length(overlays_states)) + var/mutable_appearance/M = L[i] + overlays += mutable_appearance(f_icon, overlays_states[i], color = M.color) /datum/element/polychromic/proc/set_color(atom/source, mob/user) var/choice = input(user,"Polychromic options", "Recolor [source]") as null|anything in overlays_names if(!choice || QDELETED(source) || !user.canUseTopic(source, BE_CLOSE, NO_DEXTERY)) return - var/ncolor = input(user, "Polychromic options", "Choose [choice] Color") as color|null - if(!ncolor || QDELETED(source) || !user.canUseTopic(source, BE_CLOSE, NO_DEXTERY)) - return + var/index = overlays_names.Find(choice) var/list/L = colors_by_atom[source] if(!L) // Ummmmmh. return - var/K = L[overlays_names.Find(choice)] - if(istext(K)) - K = sanitize_hexcolor(ncolor, 6, TRUE, K) + var/mutable_appearance/M = L[index] + var/old_color = istype(M) ? M.color : M + var/ncolor = input(user, "Polychromic options", "Choose [choice] Color", old_color) as color|null + if(!ncolor || QDELETED(source) || !colors_by_atom[source] || !user.canUseTopic(source, BE_CLOSE, NO_DEXTERY)) + return + ncolor = sanitize_hexcolor(ncolor, 6, TRUE, old_color) + if(istype(M)) + M.color = ncolor else - var/mutable_appearance/M = K - M.color = sanitize_hexcolor(ncolor, 6, TRUE, M.color) + L[index] = ncolor + source.update_icon() return TRUE @@ -153,6 +149,7 @@ var/datum/action/polychromic/P = actions_by_atom[source] if(!P) P = new (source) + P.name = "Modify [source]'\s Colors" actions_by_atom[source] = P P.check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUN|AB_CHECK_CONSCIOUS RegisterSignal(P, COMSIG_ACTION_TRIGGER, .proc/activate_action) @@ -187,4 +184,4 @@ background_icon_state = "bg_polychromic" use_target_appearance = TRUE button_icon_state = null - target_appearance_matrix = list(0.75,0,0,0,0.75,0) + target_appearance_matrix = list(0.8,0,0,0,0.8,0) diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 845d14ccff..ac60a322d8 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -304,7 +304,7 @@ var/shield_icon = "shield-red" /obj/item/nullrod/staff/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) - . = list() + . = ..() if(isinhands) . += mutable_appearance('icons/effects/effects.dmi', shield_icon, MOB_LAYER + 0.01) diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index 5210f00e99..6ff5dfc8ad 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -377,7 +377,7 @@ add_overlay(filling) /obj/item/reagent_containers/chemtank/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) //apply chemcolor and level - . = list() + . = ..() //inhands + reagent_filling if(!isinhands && reagents.total_volume) var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "backpackmob-10") diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index 24fe73ba12..e9f517a9f1 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -54,7 +54,7 @@ . += base_overlay /obj/item/screwdriver/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) - . = list() + . = ..() if(isinhands && random_color) var/mutable_appearance/M = mutable_appearance(icon_file, "screwdriver_head") M.appearance_flags = RESET_COLOR diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm index e6045b2548..5837ac302d 100644 --- a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm +++ b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm @@ -122,7 +122,7 @@ addtimer(CALLBACK(src, .proc/check_on_mob, user), 1) //dropped is called before the item is out of the slot, so we need to check slightly later /obj/item/clockwork/slab/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) - . = list() + . = ..() if(isinhands && item_state && inhand_overlay) var/mutable_appearance/M = mutable_appearance(icon_file, "slab_[inhand_overlay]") . += M diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index ea6bfa9b92..b05aa7f769 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -452,7 +452,7 @@ return BLOCK_NONE /obj/item/clothing/suit/hooded/cultrobes/cult_shield/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) - . = list() + . = ..() if(!isinhands && current_charges) . += mutable_appearance('icons/effects/cult_effects.dmi', "shield-cult", MOB_LAYER + 0.01) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 362e4a5605..8cbc416b2e 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -347,7 +347,7 @@ colored_before = TRUE /obj/item/clothing/glasses/sunglasses/blindfold/white/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) - . = list() + . = ..() if(!isinhands && ishuman(loc) && !colored_before) var/mob/living/carbon/human/H = loc var/mutable_appearance/M = mutable_appearance('icons/mob/clothing/eyes.dmi', "blindfoldwhite") diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index 21ebeaa2bb..ddf5e4b584 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -27,7 +27,7 @@ return OXYLOSS /obj/item/clothing/gloves/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) - . = list() + . = ..() if(!isinhands) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedgloves") diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index 121217c128..475e7a4e51 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -49,7 +49,7 @@ /obj/item/clothing/head/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) - . = list() + . = ..() if(!isinhands) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedhelmet") diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 4ef2970a24..9c96223a6f 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -205,7 +205,7 @@ icon_state = S.icon_state /obj/item/clothing/head/wig/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) - . = list() + . = ..() if(!isinhands) var/datum/sprite_accessory/S = GLOB.hair_styles_list[hair_style] if(!S) diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm index ac087fd9e2..7df38661e5 100644 --- a/code/modules/clothing/masks/_masks.dm +++ b/code/modules/clothing/masks/_masks.dm @@ -29,7 +29,7 @@ /obj/item/clothing/mask/proc/handle_speech() /obj/item/clothing/mask/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) - . = list() + . = ..() if(!isinhands) if(body_parts_covered & HEAD) if(damaged_clothes) diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index 33666d2b00..402ea37f21 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -7,7 +7,7 @@ equip_delay_other = 40 /obj/item/clothing/neck/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) - . = list() + . = ..() if(!isinhands) if(body_parts_covered & HEAD) if(damaged_clothes) diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index cc5e88c5d6..802dd7265e 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -50,7 +50,7 @@ last_blood_DNA = blood_dna[blood_dna.len] /obj/item/clothing/shoes/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) - . = list() + . = ..() if(!isinhands) var/bloody = FALSE if(blood_DNA) diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm index 3505a35487..94c8d7219c 100644 --- a/code/modules/food_and_drinks/pizzabox.dm +++ b/code/modules/food_and_drinks/pizzabox.dm @@ -87,7 +87,7 @@ add_overlay(tag_overlay) /obj/item/pizzabox/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) - . = list() + . = ..() var/current_offset = 2 if(isinhands) for(var/V in boxes) //add EXTRA BOX per box diff --git a/icons/obj/clothing/cloaks.dmi b/icons/obj/clothing/cloaks.dmi index dd1ae7d727541359971f603e226d63c94065b7f0..6f4de62cc06828e238bc3a9eba60c77316a9dac9 100644 GIT binary patch delta 2329 zcmV+!3Fh{~5V#aUiBL{Q4GJ0x0000DNk~Le0001h0001B2m=5B0OF*IdjJ3e8Bk1A zMZmzoKPCY{CILbx0bK!go0%1K?dpR=`2fKPE7%kfEWfsLIFWR0g;#?0|2tjk+~!Z zK|umSLIO@r0+HPzN>^3_S5^T`ObJ(31XorAKqdlGF9B{u4sb#TcSQwFOafR}16EZA zR#gg4O$2d73uQV2VmJXaQe;+D1aCwQbVLYaI00B!1Xfj(Aptsn0XIYeI!KKG8vrds z|Ns91DKh~@RRJk90XIb`C@3*8F?tmhumAu6M`i$EhMJn1si~=~tgP6I0|7-=9UUEv zjEn(edjVs7MMXu+%gX^#WdT%aJ3BkXv^BcAy0^Et0aR!JPjLWLcmYON0d9!_Uv^DR zO#-AK0cwN+Mp)S|+1b|C*3{J0+}zya;^NNE&H*?^0Xav&z`%FZ$9ez&00DGTPE!Ct z=GbNc005ekEdqOgiF9H?eokd_Dv`=`4T)7~M65z%Tnd#HT>V_Y(G379wU0_PkC&4G z00$>YL_t(&f$f)zR~tnX#urFPg_V#5X+mo&MB17J5G>SfRYEmwEr^yDi=y@Ys*n19 z)JL<)8cAT2P)cND2qYv>Nm2VBdhag9G;^0Dw6*HlZ#O%C6DH?;zrAzs48w7T3>h+1 zrmE`d>YD0m-Eos9-EnhmE#A807EOA?JMO8etLOQ;x_fJM>>C=aR%=6p4uaX-*l4ra z8XL_tg2iIDJDMDJyAHyR`U1f+mO0*I_4r01ozcb#-<3^&L6{ZSSK5fJtMp z(v@KD0Re-@+t}Dh0)Tud?63gUb$o9xGJtz;@4mXq5SSXAR;N?-c0#YAlEB>K^0-{U zfR*5}HC7T>><+=a(=7Xpj~Jn(@K5CCU| z<74MudG)o|$9%#WVhVO1hB+7?27uu=-h7MiWB{zHbE|4kOaUk`0swEr1HUi;$9%#$ zVN7^OaFaPur2_cDfBfC|&Y$NicO*>0G5{h8yg{6|0j z9zpa6T6YcA-KUD@(>zoH~NhK{EIIK2m6nH_4PLw_$n6Q z<_NF=+WVWe7*GJCWf33%F5*_acQ4O>*Vmu=ww?kg7Xk2{=P!LvM!1OzM+3;=F!+bVG7X?i zC)628BozuEm`bO?9mA0Rg&+vcWisF%0)|Y6APCRPavTuC@RaA-Jdl)Zc6xd?Ih&kb zSfB`kVp=1Jq!-f@1VA){1Xs|1KNBSYc zbSVH(28A600Hx*tT?vqZ31rA-vBLsD0W3zA&|8EUM3@jj=rdRWQLKbaj41?|fxIlM z-ZJ!k@CT_y08@~jVE{1l8MO-34g()$N zawQ1Gz#nh4pIasX=1OVo+Eqq^>TebODx^ zmp22L&*u?=1Xz=@tIFDc+Hb$FW+egurU3j`P!NJN0gwTI6#xk69FXIAR9x1}0YzGc zOCfVW1c0ll6h@#30L)^110bXaFrUlg5-^X8K|aS;0p!3M0F+9SQlfGI2*5v;S}CT0 zV1``?U=BiabFdP^W0@$!a5#@EQCwSx*o6R+0N!1@N<c*x;+o-G130!h5JhT0DQfd7R=QM^7eF(F3?z#-(x* zlQj&Q=BIceRD{`!)f%8#Ayi zfSb5TTod6=wt)JgHIJ;3lkt*8T z4FG8f*6>j{5@5Z&=qkGn0ILdD!tB4c#=-fW`iZ30*&T~?z#6x4e&7HcLso41AtPAQ%ZLw2OtUH-LlJ25!e<0tc189tBsDu9gV=P$~gZU`mgFwJY=ccz>W{%00000NkvXXu0mjf)e-J; delta 1843 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 a@h{p-KOfl+_P_uD002ovPDHLk0$_sZ4~8@V delta 2957 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 z