Qt_d_g&vvd-dX
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
LSLNdatI+=k=$XBH
diff --git a/tgstation.dme b/tgstation.dme
index 7ce9569f9a..b12baa9c47 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -501,6 +501,7 @@
#include "code\datums\elements\firestacker.dm"
#include "code\datums\elements\ghost_role_eligibility.dm"
#include "code\datums\elements\mob_holder.dm"
+#include "code\datums\elements\polychromic.dm"
#include "code\datums\elements\swimming.dm"
#include "code\datums\elements\sword_point.dm"
#include "code\datums\elements\update_icon_blocker.dm"
From 2b4b626facaefedebbbcea6f15080b08ecf6c194 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Tue, 10 Mar 2020 16:55:30 +0100
Subject: [PATCH 2/8] support for items that switch states through update_icon.
---
code/__DEFINES/components.dm | 2 +-
code/datums/elements/polychromic.dm | 65 +++++++++++++------
code/game/objects/items.dm | 4 +-
code/game/objects/items/RCL.dm | 2 +-
code/game/objects/items/holy_weapons.dm | 2 +-
code/game/objects/items/melee/energy.dm | 2 +-
code/game/objects/items/storage/belt.dm | 2 +-
code/game/objects/items/tanks/watertank.dm | 2 +-
code/game/objects/items/tools/screwdriver.dm | 2 +-
code/game/objects/items/toys.dm | 2 +-
code/game/objects/items/twohanded.dm | 2 +-
code/game/objects/structures/bedsheet_bin.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/hardhat.dm | 2 +-
code/modules/clothing/head/misc_special.dm | 2 +-
code/modules/clothing/masks/_masks.dm | 2 +-
code/modules/clothing/neck/_neck.dm | 4 +-
code/modules/clothing/shoes/_shoes.dm | 2 +-
code/modules/clothing/spacesuits/hardsuit.dm | 6 +-
code/modules/clothing/spacesuits/plasmamen.dm | 2 +-
code/modules/clothing/suits/_suits.dm | 2 +-
code/modules/clothing/suits/miscellaneous.dm | 4 +-
code/modules/clothing/under/_under.dm | 2 +-
.../clothing/under/polychromic_clothes.dm | 2 +-
code/modules/food_and_drinks/pizzabox.dm | 2 +-
.../modules/mining/equipment/explorer_gear.dm | 2 +-
.../mob/living/carbon/human/update_icons.dm | 2 +-
.../clothing/suits/polychromic_cloaks.dm | 2 +-
.../projectiles/guns/energy/energy_gun.dm | 2 +-
.../modules/projectiles/guns/pumpenergy.dm | 2 +-
34 files changed, 82 insertions(+), 59 deletions(-)
diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm
index ff0750a28c..85a8d7a37d 100644
--- a/code/__DEFINES/components.dm
+++ b/code/__DEFINES/components.dm
@@ -255,7 +255,7 @@
#define COMSIG_ITEM_IMBUE_SOUL "item_imbue_soul" //return a truthy value to prevent ensouling, checked in /obj/effect/proc_holder/spell/targeted/lichdom/cast(): (mob/user)
#define COMSIG_ITEM_HIT_REACT "item_hit_react" //from base of obj/item/hit_reaction(): (list/args)
#define COMSIG_ITEM_WEARERCROSSED "wearer_crossed" //called on item when crossed by something (): (/atom/movable)
-#define COMSIG_ITEM_WORN_OVERLAYS "item_worn_overlays" //from base of obj/item/worn_overlays(): (isinhands, icon_file, style_flags, list/overlays)
+#define COMSIG_ITEM_WORN_OVERLAYS "item_worn_overlays" //from base of obj/item/worn_overlays(): (isinhands, icon_file, used_state, style_flags, list/overlays)
// /obj/item/clothing signals
#define COMSIG_SHOES_STEP_ACTION "shoes_step_action" //from base of obj/item/clothing/shoes/proc/step_action(): ()
diff --git a/code/datums/elements/polychromic.dm b/code/datums/elements/polychromic.dm
index 4301a280f3..d7057cfdf7 100644
--- a/code/datums/elements/polychromic.dm
+++ b/code/datums/elements/polychromic.dm
@@ -6,8 +6,8 @@
/datum/element/polychromic
element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH
id_arg_index = 3
- var/list/overlays_by_atom = list()
- var/list/overlays_states //also used for worn/held overlsays
+ 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 for the overlays.
+ var/list/colors_by_atom = list() //list of color strings or mutable appearance depending on the above variable.
var/icon_file
var/list/overlays_names //wrap numbers into text strings please.
var/list/actions_by_atom = list()
@@ -15,7 +15,7 @@
//item variables
var/worn_file //used for boths held and worn overlays if present.
-/datum/element/polychromic/Attach(datum/target, list/colors, list/states, _icon, _flags = POLYCHROMIC_ALTCLICK|POLYCHROMIC_NO_HELD, _worn, list/names = list("Primary", "Secondary", "Tertiary", "Quaternary", "Quinary", "Senary"))
+/datum/element/polychromic/Attach(datum/target, list/colors, states, _icon, _flags = POLYCHROMIC_ALTCLICK|POLYCHROMIC_NO_HELD, _worn, list/names = list("Primary", "Secondary", "Tertiary", "Quaternary", "Quinary", "Senary"))
. = ..()
var/states_len = length(overlays_states)
var/names_len = length(names)
@@ -30,11 +30,17 @@
var/mut_icon = icon_file || A.icon
var/list/L = list()
- for(var/I in overlays_states)
- var/col = popleft(colors) || "#FFFFFF"
- L += mutable_appearance(mut_icon, I, color = col)
- A.add_overlay(L)
- overlays_by_atom[A] = L
+ if(islist(overlays_states))
+ for(var/I in overlays_states)
+ var/col = popleft(colors) || "#FFFFFF"
+ L += mutable_appearance(mut_icon, I, color = col)
+ else
+ for(var/I in 1 to overlays_states)
+ var/col = LAZYACCESS(colors, I) || "#FFFFFF"
+ L += col
+ colors_by_atom[A] = L
+
+ RegisterSignal(A, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/apply_overlays)
if(_flags & POLYCHROMIC_ALTCLICK)
RegisterSignal(A, COMSIG_PARENT_EXAMINE, .proc/on_examine)
@@ -61,40 +67,57 @@
actions_by_atom[A] = P
P.Grant(A)
+ A.update_icon()
+
/datum/element/polychromic/Detach(atom/A)
. = ..()
- A.cut_overlay(overlays_by_atom[A])
- overlays_by_atom -= A
+ A.cut_overlay(colors_by_atom[A])
+ colors_by_atom -= A
var/datum/action/polychromic/P = actions_by_atom[A]
if(P)
qdel(P)
actions_by_atom -= A
if(poly_flags & POLYCHROMIC_ALTCLICK)
- UnregisterSignal(A, list(COMSIG_PARENT_EXAMINE, COMSIG_CLICK_ALT))
+ UnregisterSignal(A, list(COMSIG_PARENT_EXAMINE, COMSIG_CLICK_ALT, COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED))
-/datum/element/polychromic/proc/apply_worn_overlays(obj/item/source, isinhands, icon_file, style_flags, list/overlays)
+/datum/element/polychromic/proc/apply_overlays(atom/source, list/overlays)
+ var/list/L = colors_by_atom[source]
+ if(isnum(overlays_states))
+ for(var/i in 1 to overlays_states)
+ overlays += mutable_appearance(source.icon, "[source.icon_state]-[i]", color = L[i])
+ else
+ overlays += colors_by_atom[source]
+
+/datum/element/polychromic/proc/apply_worn_overlays(obj/item/source, isinhands, icon_file, used_state, style_flags, list/overlays)
if(poly_flags & (isinhands ? POLYCHROMIC_NO_HELD : POLYCHROMIC_NO_WORN))
return
var/f_icon = worn_file || icon_file
- var/list/L = overlays_by_atom[source]
+ var/list/L = colors_by_atom[source]
- 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)
+ if(isnum(overlays_states))
+ 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)
/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(src, BE_CLOSE, NO_DEXTERY))
return
- choice = overlays_names.Find(choice)
var/ncolor = input(user, "Polychromic options", "Choose [choice] Color") as color|null
if(!ncolor || QDELETED(source) || !user.canUseTopic(src, BE_CLOSE, NO_DEXTERY))
return
- var/list/L = overlays_by_atom[source]
+ var/list/L = colors_by_atom[source]
if(!L) // Ummmmmh.
return
- var/mutable_appearance/M = L[choice]
- M.color = sanitize_hexcolor(ncolor, 6, TRUE, M.color)
+ var/K = L[overlays_names.Find(choice)]
+ if(istext(K))
+ K = sanitize_hexcolor(ncolor, 6, TRUE, K)
+ else
+ var/mutable_appearance/M = K
+ M.color = sanitize_hexcolor(ncolor, 6, TRUE, M.color)
source.update_icon()
return TRUE
@@ -105,7 +128,7 @@
if(!P)
P = new (source)
actions_by_atom[source] = P
- P.check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUN|AB_CHECK_LYING|AB_CHECK_CONSCIOUS
+ P.check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUN|AB_CHECK_CONSCIOUS
RegisterSignal(P, COMSIG_ACTION_TRIGGER, .proc/activate_action)
P.Grant(user)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 7a155ca932..5d3725200c 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -428,9 +428,9 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
//Overlays for the worn overlay so you can overlay while you overlay
//eg: ammo counters, primed grenade flashing, etc.
//"icon_file" is used automatically for inhands etc. to make sure it gets the right inhand file
-/obj/item/proc/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
+/obj/item/proc/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE)
. = list()
- SEND_SIGNAL(src, COMSIG_ITEM_WORN_OVERLAYS, isinhands, icon_file, style_flags, .)
+ SEND_SIGNAL(src, COMSIG_ITEM_WORN_OVERLAYS, isinhands, icon_file, used_state, style_flags, .)
//sometimes we only want to grant the item's action if it's equipped in a specific slot.
/obj/item/proc/item_action_slot_check(slot, mob/user, datum/action/A)
diff --git a/code/game/objects/items/RCL.dm b/code/game/objects/items/RCL.dm
index 9513519fa9..5444b0c557 100644
--- a/code/game/objects/items/RCL.dm
+++ b/code/game/objects/items/RCL.dm
@@ -113,7 +113,7 @@
cable_overlay.color = GLOB.cable_colors[colors[current_color_index]]
. += cable_overlay
-/obj/item/twohanded/rcl/worn_overlays(isinhands, icon_file, style_flags = NONE)
+/obj/item/twohanded/rcl/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE)
. = ..()
if(!isinhands || !(loaded?.amount))
return
diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm
index 4d275e2034..65c188918f 100644
--- a/code/game/objects/items/holy_weapons.dm
+++ b/code/game/objects/items/holy_weapons.dm
@@ -309,7 +309,7 @@
block_chance = 50
var/shield_icon = "shield-red"
-/obj/item/nullrod/staff/worn_overlays(isinhands, icon_file, style_flags = NONE)
+/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/melee/energy.dm b/code/game/objects/items/melee/energy.dm
index aba07c9120..83d7ec1b6d 100644
--- a/code/game/objects/items/melee/energy.dm
+++ b/code/game/objects/items/melee/energy.dm
@@ -337,7 +337,7 @@
. = ..()
. += "Alt-click to recolor it."
-/obj/item/melee/transforming/energy/sword/cx/worn_overlays(isinhands, icon_file, style_flags = NONE)
+/obj/item/melee/transforming/energy/sword/cx/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE)
. = ..()
if(active)
if(isinhands)
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index 4e03d029a8..3ee4fbead8 100755
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -22,7 +22,7 @@
for(var/obj/item/I in contents)
. += I.get_belt_overlay()
-/obj/item/storage/belt/worn_overlays(isinhands, icon_file, style_flags = NONE)
+/obj/item/storage/belt/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE)
. = ..()
if(!isinhands && onmob_overlays)
for(var/obj/item/I in contents)
diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm
index c1cbf534ca..5210f00e99 100644
--- a/code/game/objects/items/tanks/watertank.dm
+++ b/code/game/objects/items/tanks/watertank.dm
@@ -376,7 +376,7 @@
filling.color = mix_color_from_reagents(reagents.reagent_list)
add_overlay(filling)
-/obj/item/reagent_containers/chemtank/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE) //apply chemcolor and level
+/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)
diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm
index 0d2892cb4a..24fe73ba12 100644
--- a/code/game/objects/items/tools/screwdriver.dm
+++ b/code/game/objects/items/tools/screwdriver.dm
@@ -53,7 +53,7 @@
base_overlay.appearance_flags = RESET_COLOR
. += base_overlay
-/obj/item/screwdriver/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
+/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")
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index ba51fa3d65..08b87fe1d6 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -352,7 +352,7 @@
update_light()
return TRUE
-/obj/item/toy/sword/cx/worn_overlays(isinhands, icon_file, style_flags = NONE)
+/obj/item/toy/sword/cx/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE)
. = ..()
if(active)
if(isinhands)
diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm
index 11a06e149d..7f2e322c69 100644
--- a/code/game/objects/items/twohanded.dm
+++ b/code/game/objects/items/twohanded.dm
@@ -530,7 +530,7 @@
update_light()
return TRUE
-/obj/item/twohanded/dualsaber/hypereutactic/worn_overlays(isinhands, icon_file, style_flags = NONE)
+/obj/item/twohanded/dualsaber/hypereutactic/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE)
. = ..()
if(isinhands)
var/mutable_appearance/gem_inhand = mutable_appearance(icon_file, "hypereutactic_gem")
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index 8dc7caa5ad..7859b888f2 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -252,7 +252,7 @@ LINEN BINS
add_overlay(g_mouth)
add_overlay(g_eyes)
-/obj/item/bedsheet/gondola/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
+/obj/item/bedsheet/gondola/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE)
. = ..()
if(!isinhands)
. += mutable_appearance(icon_file, g_mouth)
diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
index b12c72b4af..b0ba3ccaaa 100644
--- a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
+++ b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm
@@ -103,7 +103,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, style_flags = NONE)
+/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]")
diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm
index 3dc199b56d..888e99f1ad 100644
--- a/code/modules/antagonists/cult/cult_items.dm
+++ b/code/modules/antagonists/cult/cult_items.dm
@@ -425,7 +425,7 @@
return 1
return 0
-/obj/item/clothing/suit/hooded/cultrobes/cult_shield/worn_overlays(isinhands, icon_file, style_flags = 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 5ae86636d6..2b6036498e 100644
--- a/code/modules/clothing/glasses/_glasses.dm
+++ b/code/modules/clothing/glasses/_glasses.dm
@@ -333,7 +333,7 @@
add_atom_colour("#[user.eye_color]", FIXED_COLOUR_PRIORITY)
colored_before = TRUE
-/obj/item/clothing/glasses/sunglasses/blindfold/white/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
+/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
diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm
index 0729317eac..21ebeaa2bb 100644
--- a/code/modules/clothing/gloves/_gloves.dm
+++ b/code/modules/clothing/gloves/_gloves.dm
@@ -26,7 +26,7 @@
user.visible_message("\the [src] are forcing [user]'s hands around [user.p_their()] neck! It looks like the gloves are possessed!")
return OXYLOSS
-/obj/item/clothing/gloves/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
+/obj/item/clothing/gloves/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE)
. = list()
if(!isinhands)
if(damaged_clothes)
diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm
index d599fbf6f7..121217c128 100644
--- a/code/modules/clothing/head/_head.dm
+++ b/code/modules/clothing/head/_head.dm
@@ -48,7 +48,7 @@
-/obj/item/clothing/head/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
+/obj/item/clothing/head/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE)
. = list()
if(!isinhands)
if(damaged_clothes)
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index e7a8243889..9715709e00 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -125,7 +125,7 @@
playsound(src, 'sound/mecha/mechmove03.ogg', 50, TRUE) //Visors don't just come from nothing
update_icon()
-/obj/item/clothing/head/hardhat/weldhat/worn_overlays(isinhands, icon_file, style_flags = NONE)
+/obj/item/clothing/head/hardhat/weldhat/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE)
. = ..()
if(!isinhands)
. += mutable_appearance('icons/mob/head.dmi', "weldhelmet")
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index 4be949a65e..ec5573e4d7 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -208,7 +208,7 @@
M.color = hair_color
add_overlay(M)
-/obj/item/clothing/head/wig/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
+/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]
diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm
index 5019633cf0..ac087fd9e2 100644
--- a/code/modules/clothing/masks/_masks.dm
+++ b/code/modules/clothing/masks/_masks.dm
@@ -28,7 +28,7 @@
/obj/item/clothing/mask/proc/handle_speech()
-/obj/item/clothing/mask/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
+/obj/item/clothing/mask/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE)
. = list()
if(!isinhands)
if(body_parts_covered & HEAD)
diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm
index 2b43460257..cfc806b4db 100644
--- a/code/modules/clothing/neck/_neck.dm
+++ b/code/modules/clothing/neck/_neck.dm
@@ -6,7 +6,7 @@
strip_delay = 40
equip_delay_other = 40
-/obj/item/clothing/neck/worn_overlays(isinhands = FALSE, icon_flag, style_flags = NONE)
+/obj/item/clothing/neck/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE)
. = list()
if(!isinhands)
if(body_parts_covered & HEAD)
@@ -192,7 +192,7 @@
tagname = stripped_input(user, "Would you like to change the name on the tag?", "Name your new pet", "Spot", MAX_NAME_LEN)
name = "[initial(name)] - [tagname]"
-/obj/item/clothing/neck/petcollar/worn_overlays(isinhands, icon_file, style_flags = NONE)
+/obj/item/clothing/neck/petcollar/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE)
. = ..()
if(hasprimary | hassecondary | hastertiary)
if(!isinhands) //prevents the worn sprites from showing up if you're just holding them
diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm
index 4c6d3a8f88..7ac4f062f3 100644
--- a/code/modules/clothing/shoes/_shoes.dm
+++ b/code/modules/clothing/shoes/_shoes.dm
@@ -49,7 +49,7 @@
last_bloodtype = blood_dna[blood_dna[blood_dna.len]]//trust me this works
last_blood_DNA = blood_dna[blood_dna.len]
-/obj/item/clothing/shoes/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
+/obj/item/clothing/shoes/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE)
. = list()
if(!isinhands)
var/bloody = FALSE
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index d9e4f17649..a391a3807f 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -793,7 +793,7 @@
var/mob/living/carbon/human/C = loc
C.update_inv_wear_suit()
-/obj/item/clothing/suit/space/hardsuit/shielded/worn_overlays(isinhands, icon_file, style_flags = NONE)
+/obj/item/clothing/suit/space/hardsuit/shielded/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE)
. = ..()
if(!isinhands)
var/file2use = style_flags & STYLE_ALL_TAURIC ? 'modular_citadel/icons/mob/64x32_effects.dmi' : 'icons/effects/effects.dmi'
@@ -956,7 +956,7 @@
add_overlay(helm_overlay)
-/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
+/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE)
. = ..()
if(!isinhands)
var/mutable_appearance/energy_overlay = mutable_appearance(icon_file, "knight_cydonia_overlay", ABOVE_LIGHTING_LAYER)
@@ -993,7 +993,7 @@
add_overlay(suit_overlay)
-/obj/item/clothing/suit/space/hardsuit/lavaknight/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
+/obj/item/clothing/suit/space/hardsuit/lavaknight/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE)
. = ..()
if(!isinhands)
var/mutable_appearance/energy_overlay = mutable_appearance(icon_file, "knight_cydonia_overlay", ABOVE_LIGHTING_LAYER)
diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm
index fee8dbce33..f17eb91b74 100644
--- a/code/modules/clothing/spacesuits/plasmamen.dm
+++ b/code/modules/clothing/spacesuits/plasmamen.dm
@@ -67,7 +67,7 @@
var/datum/action/A=X
A.UpdateButtonIcon()
-/obj/item/clothing/head/helmet/space/plasmaman/worn_overlays(isinhands, icon_file, style_flags = NONE)
+/obj/item/clothing/head/helmet/space/plasmaman/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE)
. = ..()
if(!isinhands && on)
. += mutable_appearance(icon_file, light_overlay)
diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm
index 1b2080feb1..3d312e260a 100644
--- a/code/modules/clothing/suits/_suits.dm
+++ b/code/modules/clothing/suits/_suits.dm
@@ -11,7 +11,7 @@
var/suittoggled = FALSE
mutantrace_variation = STYLE_DIGITIGRADE
-/obj/item/clothing/suit/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
+/obj/item/clothing/suit/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE)
. = ..()
if(!isinhands)
if(damaged_clothes)
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 6f61bf56cb..febecd9f71 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -987,7 +987,7 @@
item_color = "winterhood_poly"
item_state = "winterhood_poly"
-/obj/item/clothing/head/hooded/winterhood/polychromic/worn_overlays(isinhands, icon_file, style_flags = NONE) //this is where the main magic happens.
+/obj/item/clothing/head/hooded/winterhood/polychromic/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) //this is where the main magic happens.
. = ..()
if(suit.hasprimary | suit.hassecondary)
if(!isinhands) //prevents the worn sprites from showing up if you're just holding them
@@ -1000,7 +1000,7 @@
secondary_worn.color = suit.secondary_color
. += secondary_worn
-/obj/item/clothing/suit/hooded/wintercoat/polychromic/worn_overlays(isinhands, icon_file, style_flags = NONE) //this is where the main magic happens.
+/obj/item/clothing/suit/hooded/wintercoat/polychromic/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) //this is where the main magic happens.
. = ..()
if(hasprimary | hassecondary | hastertiary)
if(!isinhands) //prevents the worn sprites from showing up if you're just holding them
diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm
index 63e3a63968..d0cfef4f71 100644
--- a/code/modules/clothing/under/_under.dm
+++ b/code/modules/clothing/under/_under.dm
@@ -16,7 +16,7 @@
var/mutable_appearance/accessory_overlay
mutantrace_variation = STYLE_DIGITIGRADE
-/obj/item/clothing/under/worn_overlays(isinhands = FALSE, icon_file, style_flags = NONE)
+/obj/item/clothing/under/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE)
. = list()
if(!isinhands)
if(damaged_clothes)
diff --git a/code/modules/clothing/under/polychromic_clothes.dm b/code/modules/clothing/under/polychromic_clothes.dm
index 53011d42d1..e56e1eb265 100644
--- a/code/modules/clothing/under/polychromic_clothes.dm
+++ b/code/modules/clothing/under/polychromic_clothes.dm
@@ -27,7 +27,7 @@
can_adjust = FALSE
mutantrace_variation = NONE //Not all clothes are currently digi-compatible (only the shorts are as of time of writing)
-/obj/item/clothing/under/polychromic/worn_overlays(isinhands, icon_file, style_flags = NONE) //this is where the main magic happens.
+/obj/item/clothing/under/polychromic/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) //this is where the main magic happens.
. = ..()
if(hasprimary | hassecondary | hastertiary)
if(!isinhands) //prevents the worn sprites from showing up if you're just holding them
diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm
index b163c6ba97..3505a35487 100644
--- a/code/modules/food_and_drinks/pizzabox.dm
+++ b/code/modules/food_and_drinks/pizzabox.dm
@@ -86,7 +86,7 @@
tag_overlay.pixel_y = boxes.len * 3
add_overlay(tag_overlay)
-/obj/item/pizzabox/worn_overlays(isinhands, icon_file, style_flags = NONE)
+/obj/item/pizzabox/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE)
. = list()
var/current_offset = 2
if(isinhands)
diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm
index 5165d95340..d3bf4368f7 100644
--- a/code/modules/mining/equipment/explorer_gear.dm
+++ b/code/modules/mining/equipment/explorer_gear.dm
@@ -117,7 +117,7 @@
glass_overlay.appearance_flags = RESET_COLOR
add_overlay(glass_overlay)
-/obj/item/clothing/head/helmet/space/hostile_environment/worn_overlays(isinhands, icon_file, style_flags = NONE)
+/obj/item/clothing/head/helmet/space/hostile_environment/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE)
. = ..()
if(!isinhands)
var/mutable_appearance/M = mutable_appearance('icons/mob/head.dmi', "hostile_env_glass")
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index f1b1570e24..fa138e38f8 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -593,7 +593,7 @@ generate/load female uniform sprites matching all previously decided variables
//Get the overlays for this item when it's being worn
//eg: ammo counters, primed grenade flashes, etc.
- var/list/worn_overlays = worn_overlays(isinhands, file2use, style_flags)
+ var/list/worn_overlays = worn_overlays(isinhands, file2use, state, style_flags)
if(worn_overlays && worn_overlays.len)
standing.overlays.Add(worn_overlays)
diff --git a/modular_citadel/code/modules/clothing/suits/polychromic_cloaks.dm b/modular_citadel/code/modules/clothing/suits/polychromic_cloaks.dm
index ade6cee3ba..ac7d2e80b0 100644
--- a/modular_citadel/code/modules/clothing/suits/polychromic_cloaks.dm
+++ b/modular_citadel/code/modules/clothing/suits/polychromic_cloaks.dm
@@ -13,7 +13,7 @@
secondary_color = "#FFFFFF"
tertiary_color = "#808080"
-/obj/item/clothing/neck/cloak/polychromic/worn_overlays(isinhands, icon_file, style_flags = NONE) //this is where the main magic happens. Also mandates that ALL polychromic stuff MUST USE alternate_worn_icon
+/obj/item/clothing/neck/cloak/polychromic/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) //this is where the main magic happens. Also mandates that ALL polychromic stuff MUST USE alternate_worn_icon
. = ..()
if(hasprimary | hassecondary | hastertiary)
if(!isinhands) //prevents the worn sprites from showing up if you're just holding them
diff --git a/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm b/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm
index 49a8a26f35..49d48e0000 100644
--- a/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm
+++ b/modular_citadel/code/modules/projectiles/guns/energy/energy_gun.dm
@@ -39,7 +39,7 @@ obj/item/gun/energy/e_gun/cx/AltClick(mob/living/user)
body_color = sanitize_hexcolor(body_color_input, desired_format=6, include_crunch=1)
update_icon()
-obj/item/gun/energy/e_gun/cx/worn_overlays(isinhands, icon_file, style_flags = NONE)
+obj/item/gun/energy/e_gun/cx/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE)
. = ..()
if(isinhands)
var/mutable_appearance/body_inhand = mutable_appearance(icon_file, "cxe_body")
diff --git a/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm b/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm
index f7c0b343c3..fcead7f179 100644
--- a/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm
+++ b/modular_citadel/code/modules/projectiles/guns/pumpenergy.dm
@@ -87,7 +87,7 @@
. = ..()
. += "Alt-click to change firing modes."
-/obj/item/gun/energy/pumpaction/worn_overlays(isinhands, icon_file, style_flags = NONE) //ammo counter for inhands
+/obj/item/gun/energy/pumpaction/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) //ammo counter for inhands
. = ..()
var/ratio = CEILING((cell.charge / cell.maxcharge) * charge_sections, 1)
var/obj/item/ammo_casing/energy/shot = ammo_type[current_firemode_index]
From 0816512150d221acf17caff365f2e6d8b9e3eeac Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Mon, 13 Apr 2020 16:09:52 +0200
Subject: [PATCH 3/8] more work.
---
code/__HELPERS/_lists.dm | 2 +-
code/datums/elements/polychromic.dm | 38 +++++++++++---------------
code/modules/clothing/under/costume.dm | 8 +++---
3 files changed, 21 insertions(+), 27 deletions(-)
diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm
index 8887a2aa1d..a34b3ce67c 100644
--- a/code/__HELPERS/_lists.dm
+++ b/code/__HELPERS/_lists.dm
@@ -555,7 +555,7 @@
for(var/i in deep_list)
var/key = i
if(isnum(key))
- key = "[key]"
+ L += "[key]"
continue
if(islist(key))
key = deep_list2params(key)
diff --git a/code/datums/elements/polychromic.dm b/code/datums/elements/polychromic.dm
index d7057cfdf7..5e1a3e3c73 100644
--- a/code/datums/elements/polychromic.dm
+++ b/code/datums/elements/polychromic.dm
@@ -6,20 +6,20 @@
/datum/element/polychromic
element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH
id_arg_index = 3
- 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 for the overlays.
- var/list/colors_by_atom = list() //list of color strings or mutable appearance depending on the above variable.
+ 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/list/overlays_names //wrap numbers into text strings please.
var/list/actions_by_atom = list()
var/poly_flags
- //item variables
- var/worn_file //used for boths held and worn overlays if present.
+ var/worn_file //used in place of items' held or mob overlay icons if present.
/datum/element/polychromic/Attach(datum/target, list/colors, states, _icon, _flags = POLYCHROMIC_ALTCLICK|POLYCHROMIC_NO_HELD, _worn, list/names = list("Primary", "Secondary", "Tertiary", "Quaternary", "Quinary", "Senary"))
. = ..()
- var/states_len = length(overlays_states)
+ var/make_appearances = islist(overlays_states)
+ var/states_len = make_appearances ? length(states) : states
var/names_len = length(names)
- if(!states_len || names_len || !isatom(target))
+ if(!states_len || !names_len || !isatom(target))
return ELEMENT_INCOMPATIBLE
var/atom/A = target
@@ -30,14 +30,9 @@
var/mut_icon = icon_file || A.icon
var/list/L = list()
- if(islist(overlays_states))
- for(var/I in overlays_states)
- var/col = popleft(colors) || "#FFFFFF"
- L += mutable_appearance(mut_icon, I, color = col)
- else
- for(var/I in 1 to overlays_states)
- var/col = LAZYACCESS(colors, I) || "#FFFFFF"
- L += col
+ for(var/I in 1 to states_len)
+ var/col = LAZYACCESS(colors, I) || "#FFFFFF"
+ L += make_appearances ? mutable_appearance(mut_icon, overlays_states[I], color = col) : col
colors_by_atom[A] = L
RegisterSignal(A, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/apply_overlays)
@@ -46,12 +41,12 @@
RegisterSignal(A, COMSIG_PARENT_EXAMINE, .proc/on_examine)
RegisterSignal(A, COMSIG_CLICK_ALT, .proc/set_color)
- if(!overlays_names && names)
+ if(!overlays_names && names) //generate
overlays_names = names
var/diff = states_len - names_len
- if(diff > 0) //It will be ugly, but still functional.
+ if(diff > 0)
for(var/i in 1 to diff)
- overlays_names += "[names_len + i]"
+ overlays_names += "[names_len + i]°"
else if(diff < 0)
overlays_names.len += diff
@@ -61,13 +56,13 @@
RegisterSignal(src, COMSIG_ITEM_DROPPED, .proc/remove_user_action)
AddElement(A, /datum/element/update_icon_updates_onmob) //Since we can change the overall aspect of the item.
RegisterSignal(A, COMSIG_ITEM_WORN_OVERLAYS, .proc/apply_worn_overlays)
- else if(_flags & POLYCHROMIC_ACTION && ismob(A)) //Not safe until mob icon updating procs are standarized and stop using cut_overlays()
+ else if(_flags & POLYCHROMIC_ACTION && ismob(A)) //in the event mob update icon procs are ever standarized.
var/datum/action/polychromic/P = new(A)
RegisterSignal(P, COMSIG_ACTION_TRIGGER, .proc/activate_action)
actions_by_atom[A] = P
P.Grant(A)
- A.update_icon()
+ A.update_icon() //apply the overlays.
/datum/element/polychromic/Detach(atom/A)
. = ..()
@@ -75,10 +70,9 @@
colors_by_atom -= A
var/datum/action/polychromic/P = actions_by_atom[A]
if(P)
+ actions_by_atom -= A
qdel(P)
- actions_by_atom -= A
- if(poly_flags & POLYCHROMIC_ALTCLICK)
- UnregisterSignal(A, list(COMSIG_PARENT_EXAMINE, COMSIG_CLICK_ALT, COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED))
+ UnregisterSignal(A, list(COMSIG_PARENT_EXAMINE, COMSIG_CLICK_ALT, COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED, COMSIG_ITEM_WORN_OVERLAYS))
/datum/element/polychromic/proc/apply_overlays(atom/source, list/overlays)
var/list/L = colors_by_atom[source]
diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm
index 12988c26ae..7cbfe5abf5 100644
--- a/code/modules/clothing/under/costume.dm
+++ b/code/modules/clothing/under/costume.dm
@@ -91,13 +91,13 @@
name = "polychromic kilt"
desc = "It's not a skirt!"
icon_state = "polykilt"
- hasprimary = TRUE
- hassecondary = TRUE
- primary_color = "#FFFFFF"
- secondary_color = "#F08080"
body_parts_covered = CHEST|GROIN|ARMS|LEGS
mutantrace_variation = NONE
+/obj/item/clothing/under/costume/kilt/polychromic/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/polychromic, list("#FFFFFF", "#F08080"), list("polykilt-primary", "polykilt-secondary"), null, POLYCHROMIC_ALTCLICK|POLYCHROMIC_NO_HELD|POLYCHROMIC_ACTION)
+
/obj/item/clothing/under/costume/gladiator
name = "gladiator uniform"
desc = "Are you not entertained? Is that not why you are here?"
From bfa006fac1300e3addba0b9fe706bc6a0c5c7b87 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Mon, 13 Apr 2020 17:25:13 +0200
Subject: [PATCH 4/8] Fixing runtime errors.
---
code/datums/elements/polychromic.dm | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/code/datums/elements/polychromic.dm b/code/datums/elements/polychromic.dm
index 5e1a3e3c73..109da4ac50 100644
--- a/code/datums/elements/polychromic.dm
+++ b/code/datums/elements/polychromic.dm
@@ -16,7 +16,7 @@
/datum/element/polychromic/Attach(datum/target, list/colors, states, _icon, _flags = POLYCHROMIC_ALTCLICK|POLYCHROMIC_NO_HELD, _worn, list/names = list("Primary", "Secondary", "Tertiary", "Quaternary", "Quinary", "Senary"))
. = ..()
- var/make_appearances = islist(overlays_states)
+ var/make_appearances = islist(states)
var/states_len = make_appearances ? length(states) : states
var/names_len = length(names)
if(!states_len || !names_len || !isatom(target))
@@ -52,10 +52,11 @@
if(isitem(A))
if(_flags & POLYCHROMIC_ACTION)
- RegisterSignal(src, COMSIG_ITEM_EQUIPPED, .proc/grant_user_action)
- RegisterSignal(src, COMSIG_ITEM_DROPPED, .proc/remove_user_action)
- AddElement(A, /datum/element/update_icon_updates_onmob) //Since we can change the overall aspect of the item.
- RegisterSignal(A, COMSIG_ITEM_WORN_OVERLAYS, .proc/apply_worn_overlays)
+ RegisterSignal(A, COMSIG_ITEM_EQUIPPED, .proc/grant_user_action)
+ RegisterSignal(A, COMSIG_ITEM_DROPPED, .proc/remove_user_action)
+ if(!(_flags & (POLYCHROMIC_NO_HELD|POLYCHROMIC_NO_WORN)))
+ A.AddElement(/datum/element/update_icon_updates_onmob)
+ RegisterSignal(A, COMSIG_ITEM_WORN_OVERLAYS, .proc/apply_worn_overlays)
else if(_flags & POLYCHROMIC_ACTION && ismob(A)) //in the event mob update icon procs are ever standarized.
var/datum/action/polychromic/P = new(A)
RegisterSignal(P, COMSIG_ACTION_TRIGGER, .proc/activate_action)
From 8c995dbad983e585266eea0bc28f755f33d6d652 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Mon, 13 Apr 2020 19:16:55 +0200
Subject: [PATCH 5/8] Making things work.
---
code/datums/action.dm | 50 ++++++++++++++---------------
code/datums/elements/polychromic.dm | 21 +++++++++---
2 files changed, 41 insertions(+), 30 deletions(-)
diff --git a/code/datums/action.dm b/code/datums/action.dm
index e94e6a182d..f2f93ac40d 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -120,34 +120,34 @@
/datum/action/proc/UpdateButtonIcon(status_only = FALSE, force = FALSE)
if(!button)
return
- if(button_icon && button_icon_state)
- if(!status_only)
- button.name = name
- button.desc = desc
- if(owner && owner.hud_used && background_icon_state == ACTION_BUTTON_DEFAULT_BACKGROUND)
- var/list/settings = owner.hud_used.get_action_buttons_icons()
- if(button.icon != settings["bg_icon"])
- button.icon = settings["bg_icon"]
- if(button.icon_state != settings["bg_state"])
- button.icon_state = settings["bg_state"]
- else
- if(button.icon != button_icon)
- button.icon = button_icon
- if(button.icon_state != background_icon_state)
- button.icon_state = background_icon_state
+ if(!status_only)
+ button.name = name
+ button.desc = desc
+ if(owner && owner.hud_used && background_icon_state == ACTION_BUTTON_DEFAULT_BACKGROUND)
+ var/list/settings = owner.hud_used.get_action_buttons_icons()
+ if(button.icon != settings["bg_icon"])
+ button.icon = settings["bg_icon"]
+ if(button.icon_state != settings["bg_state"])
+ button.icon_state = settings["bg_state"]
+ else
+ if(button.icon != button_icon)
+ button.icon = button_icon
+ if(button.icon_state != background_icon_state)
+ button.icon_state = background_icon_state
+ if(!use_target_appearance)
ApplyIcon(button, force)
- else if(use_target_appearance && target && button.appearance_cache != target.appearance) //replace with /ref comparison if this is not valid.
- var/mutable_appearance/M = new(target)
- M.layer = FLOAT_LAYER
- M.plane = FLOAT_PLANE
- if(target_appearance_matrix)
- var/list/L = target_appearance_matrix
- M.transform = matrix(L[1], L[2], L[3], L[4], L[5], L[6])
- button.cut_overlays()
- button.add_overlay(M)
- button.appearance_cache = target.appearance
+ else if(target && button.appearance_cache != target.appearance) //replace with /ref comparison if this is not valid.
+ var/mutable_appearance/M = new(target)
+ M.layer = FLOAT_LAYER
+ M.plane = FLOAT_PLANE
+ if(target_appearance_matrix)
+ var/list/L = target_appearance_matrix
+ M.transform = matrix(L[1], L[2], L[3], L[4], L[5], L[6])
+ button.cut_overlays()
+ button.add_overlay(M)
+ button.appearance_cache = target.appearance
if(!IsAvailable(TRUE))
button.color = transparent_when_unavailable ? rgb(128,0,0,128) : rgb(128,0,0)
diff --git a/code/datums/elements/polychromic.dm b/code/datums/elements/polychromic.dm
index 109da4ac50..70424507b7 100644
--- a/code/datums/elements/polychromic.dm
+++ b/code/datums/elements/polychromic.dm
@@ -11,6 +11,7 @@
var/icon_file
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.
@@ -54,8 +55,11 @@
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|POLYCHROMIC_NO_WORN)))
- A.AddElement(/datum/element/update_icon_updates_onmob)
+ 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
+ already_updates_onmob[A]++
RegisterSignal(A, COMSIG_ITEM_WORN_OVERLAYS, .proc/apply_worn_overlays)
else if(_flags & POLYCHROMIC_ACTION && ismob(A)) //in the event mob update icon procs are ever standarized.
var/datum/action/polychromic/P = new(A)
@@ -69,6 +73,13 @@
. = ..()
A.cut_overlay(colors_by_atom[A])
colors_by_atom -= A
+ if(!(poly_flags & POLYCHROMIC_NO_HELD) && !(poly_flags & POLYCHROMIC_NO_WORN) && isitem(A))
+ if(!already_updates_onmob[A])
+ A.RemoveElement(/datum/element/update_icon_updates_onmob)
+ else
+ already_updates_onmob[A]--
+ if(!already_updates_onmob[A])
+ already_updates_onmob -= A
var/datum/action/polychromic/P = actions_by_atom[A]
if(P)
actions_by_atom -= A
@@ -99,10 +110,10 @@
/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(src, BE_CLOSE, NO_DEXTERY))
+ 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(src, BE_CLOSE, NO_DEXTERY))
+ if(!ncolor || QDELETED(source) || !user.canUseTopic(source, BE_CLOSE, NO_DEXTERY))
return
var/list/L = colors_by_atom[source]
if(!L) // Ummmmmh.
@@ -142,4 +153,4 @@
background_icon_state = "bg_polychromic"
use_target_appearance = TRUE
button_icon_state = null
- target_appearance_matrix = list(0.7,0,0,0,0.7,0)
+ target_appearance_matrix = list(0.75,0,0,0,0.75,0)
From 616d482cf6a44d2b426d152f502a9fdb2646fdc6 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Mon, 13 Apr 2020 22:51:46 +0200
Subject: [PATCH 6/8] Deleting poly clothes copypasta.
---
code/__DEFINES/dcs/signals.dm | 1 +
code/datums/elements/polychromic.dm | 64 ++++--
code/modules/clothing/clothing.dm | 194 ------------------
code/modules/clothing/neck/_neck.dm | 65 ++----
code/modules/clothing/suits/cloaks.dm | 11 +
code/modules/clothing/suits/miscellaneous.dm | 67 +-----
code/modules/clothing/suits/toggles.dm | 24 ++-
code/modules/clothing/under/_under.dm | 132 ++++++++++--
code/modules/clothing/under/costume.dm | 2 +-
code/modules/clothing/under/miscellaneous.dm | 52 +++--
code/modules/clothing/under/shorts.dm | 13 +-
code/modules/clothing/under/skirt_dress.dm | 15 +-
code/modules/clothing/under/suits.dm | 10 +-
icons/mob/clothing/head.dmi | Bin 223286 -> 223289 bytes
icons/mob/clothing/neck.dmi | Bin 45707 -> 47399 bytes
icons/mob/clothing/suit.dmi | Bin 424980 -> 424968 bytes
icons/mob/clothing/suit_digi.dmi | Bin 439805 -> 439792 bytes
icons/mob/clothing/uniform.dmi | Bin 403435 -> 403416 bytes
icons/mob/clothing/uniform_digi.dmi | Bin 344180 -> 344171 bytes
icons/obj/clothing/hats.dmi | Bin 109697 -> 109696 bytes
icons/obj/clothing/neck.dmi | Bin 2866 -> 3253 bytes
icons/obj/clothing/suits.dmi | Bin 143821 -> 143808 bytes
icons/obj/clothing/uniforms.dmi | Bin 112864 -> 113086 bytes
.../clothing/suits/polychromic_cloaks.dm | 38 ----
.../modules/custom_loadout/custom_items.dm | 5 +
.../icons/polyclothes/item/neck.dmi | Bin 633 -> 0 bytes
.../icons/polyclothes/mob/neck.dmi | Bin 1418 -> 0 bytes
tgstation.dme | 1 -
28 files changed, 264 insertions(+), 430 deletions(-)
delete mode 100644 modular_citadel/code/modules/clothing/suits/polychromic_cloaks.dm
delete mode 100644 modular_citadel/icons/polyclothes/item/neck.dmi
delete mode 100644 modular_citadel/icons/polyclothes/mob/neck.dmi
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index b16002e35b..e0f7457a4a 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -249,6 +249,7 @@
// /obj/item/clothing signals
#define COMSIG_SHOES_STEP_ACTION "shoes_step_action" //from base of obj/item/clothing/shoes/proc/step_action(): ()
+#define COMSIG_SUIT_MADE_HELMET "suit_made_helmet" //from base of obj/item/clothing/suit/MakeHelmet(): (helmet)
// /obj/item/implant signals
#define COMSIG_IMPLANT_ACTIVATED "implant_activated" //from base of /obj/item/implant/proc/activate(): ()
diff --git a/code/datums/elements/polychromic.dm b/code/datums/elements/polychromic.dm
index 70424507b7..f664ed9063 100644
--- a/code/datums/elements/polychromic.dm
+++ b/code/datums/elements/polychromic.dm
@@ -14,13 +14,16 @@
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.
-/datum/element/polychromic/Attach(datum/target, list/colors, states, _icon, _flags = POLYCHROMIC_ALTCLICK|POLYCHROMIC_NO_HELD, _worn, list/names = list("Primary", "Secondary", "Tertiary", "Quaternary", "Quinary", "Senary"))
+/datum/element/polychromic/Attach(datum/target, list/colors, states, _flags = POLYCHROMIC_ACTION|POLYCHROMIC_NO_HELD, _icon, _worn, list/names = list("Primary", "Secondary", "Tertiary", "Quaternary", "Quinary", "Senary"))
. = ..()
var/make_appearances = islist(states)
var/states_len = make_appearances ? length(states) : states
var/names_len = length(names)
- if(!states_len || !names_len || !isatom(target))
+ if(!states_len || !names_len || colors_by_atom[target] || !isatom(target))
return ELEMENT_INCOMPATIBLE
var/atom/A = target
@@ -59,8 +62,10 @@
if(!SSdcs.GetElement(/datum/element/update_icon_updates_onmob))
A.AddElement(/datum/element/update_icon_updates_onmob)
else
- already_updates_onmob[A]++
+ LAZYSET(already_updates_onmob, A, TRUE)
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)
else if(_flags & POLYCHROMIC_ACTION && ismob(A)) //in the event mob update icon procs are ever standarized.
var/datum/action/polychromic/P = new(A)
RegisterSignal(P, COMSIG_ACTION_TRIGGER, .proc/activate_action)
@@ -71,33 +76,48 @@
/datum/element/polychromic/Detach(atom/A)
. = ..()
- A.cut_overlay(colors_by_atom[A])
colors_by_atom -= A
- if(!(poly_flags & POLYCHROMIC_NO_HELD) && !(poly_flags & POLYCHROMIC_NO_WORN) && isitem(A))
- if(!already_updates_onmob[A])
- A.RemoveElement(/datum/element/update_icon_updates_onmob)
- else
- already_updates_onmob[A]--
- if(!already_updates_onmob[A])
- already_updates_onmob -= A
var/datum/action/polychromic/P = actions_by_atom[A]
if(P)
actions_by_atom -= A
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))
+ 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
+ if(!QDELETED(A) && ismob(A.loc))
+ var/mob/M = A.loc
+ if(!(poly_flags & POLYCHROMIC_NO_HELD) && M.is_holding(A))
+ M.update_inv_hands()
+ else if(!(poly_flags & POLYCHROMIC_NO_WORN))
+ M.regenerate_icons()
+ if(!QDELETED(A))
+ A.update_icon() //removing the overlays
/datum/element/polychromic/proc/apply_overlays(atom/source, list/overlays)
var/list/L = colors_by_atom[source]
+ var/f_icon = icon_file || source.icon
if(isnum(overlays_states))
for(var/i in 1 to overlays_states)
- overlays += mutable_appearance(source.icon, "[source.icon_state]-[i]", color = L[i])
+ overlays += mutable_appearance(f_icon, "[source.icon_state]-[i]", color = L[i])
else
overlays += colors_by_atom[source]
-/datum/element/polychromic/proc/apply_worn_overlays(obj/item/source, isinhands, icon_file, used_state, style_flags, list/overlays)
+/datum/element/polychromic/proc/apply_worn_overlays(obj/item/source, isinhands, icon, used_state, style_flags, list/overlays)
if(poly_flags & (isinhands ? POLYCHROMIC_NO_HELD : POLYCHROMIC_NO_WORN))
return
- var/f_icon = worn_file || icon_file
+ var/f_icon = worn_file || icon
var/list/L = colors_by_atom[source]
if(isnum(overlays_states))
@@ -148,6 +168,20 @@
/datum/element/polychromic/proc/on_examine(atom/source, mob/user, list/examine_list)
examine_list += "Alt-click to recolor it."
+/datum/element/polychromic/proc/register_helmet(atom/source, obj/item/clothing/head/H)
+ LAZYSET(suit_by_helmet, H, source)
+ LAZYSET(helmet_by_suit, source, H)
+ colors_by_atom[H] = colors_by_atom[source]
+ RegisterSignal(H, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/apply_overlays)
+ RegisterSignal(H, COMSIG_ITEM_WORN_OVERLAYS, .proc/apply_worn_overlays)
+ RegisterSignal(H, COMSIG_PARENT_QDELETING, .proc/unregister_helmet)
+
+/datum/element/polychromic/proc/unregister_helmet(atom/source)
+ var/obj/item/clothing/suit/S = suit_by_helmet[source]
+ LAZYREMOVE(suit_by_helmet, source)
+ LAZYREMOVE(helmet_by_suit, S)
+ colors_by_atom -= source
+
/datum/action/polychromic
name = "Modify Polychromic Colors"
background_icon_state = "bg_polychromic"
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 402d16e7ec..d484027ad5 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -47,25 +47,12 @@
//Add a "exclude" string to do the opposite, making it only only species listed that can't wear it.
//You append this to clothing objects.
- //Polychrome stuff:
- var/hasprimary = FALSE //These vars allow you to choose which overlays a clothing has
- var/hassecondary = FALSE
- var/hastertiary = FALSE
- var/primary_color = "#FFFFFF" //RGB in hexcode
- var/secondary_color = "#FFFFFF"
- var/tertiary_color = "#808080"
-
- //No idea what this is but eh -tori
- var/force_alternate_icon = FALSE
-
/obj/item/clothing/Initialize()
. = ..()
if(CHECK_BITFIELD(clothing_flags, VOICEBOX_TOGGLABLE))
actions_types += /datum/action/item_action/toggle_voice_box
if(ispath(pocket_storage_component_path))
LoadComponent(pocket_storage_component_path)
- if(hasprimary | hassecondary | hastertiary) //Checks if polychrome is enabled
- update_icon() //Applies the overlays and default colors onto the clothes on spawn.
/obj/item/clothing/MouseDrop(atom/over_object)
. = ..()
@@ -150,8 +137,6 @@
how_cool_are_your_threads += "Adding or removing items from [src] makes no noise.\n"
how_cool_are_your_threads += ""
. += how_cool_are_your_threads.Join()
- if(hasprimary | hassecondary | hastertiary) //Checks if polychrome is enabled
- . += "Alt-click to recolor it."
/obj/item/clothing/obj_break(damage_flag)
if(!damaged_clothes)
@@ -195,173 +180,6 @@ BLIND // can't see anything
female_clothing_icon = fcopy_rsc(female_clothing_icon)
GLOB.female_clothing_icons[index] = female_clothing_icon
-/obj/item/clothing/under/verb/toggle()
- set name = "Adjust Suit Sensors"
- set category = "Object"
- set src in usr
- var/mob/M = usr
- if (istype(M, /mob/dead/))
- return
- if (!can_use(M))
- return
- if(src.has_sensor == LOCKED_SENSORS)
- to_chat(usr, "The controls are locked.")
- return 0
- if(src.has_sensor == BROKEN_SENSORS)
- to_chat(usr, "The sensors have shorted out!")
- return 0
- if(src.has_sensor <= NO_SENSORS)
- to_chat(usr, "This suit does not have any sensors.")
- return 0
-
- var/list/modes = list("Off", "Binary vitals", "Exact vitals", "Tracking beacon")
- var/switchMode = input("Select a sensor mode:", "Suit Sensor Mode", modes[sensor_mode + 1]) in modes
- if(get_dist(usr, src) > 1)
- to_chat(usr, "You have moved too far away!")
- return
- sensor_mode = modes.Find(switchMode) - 1
-
- if (src.loc == usr)
- switch(sensor_mode)
- if(0)
- to_chat(usr, "You disable your suit's remote sensing equipment.")
- if(1)
- to_chat(usr, "Your suit will now only report whether you are alive or dead.")
- if(2)
- to_chat(usr, "Your suit will now only report your exact vital lifesigns.")
- if(3)
- to_chat(usr, "Your suit will now report your exact vital lifesigns as well as your coordinate position.")
-
- if(ishuman(loc))
- var/mob/living/carbon/human/H = loc
- if(H.w_uniform == src)
- H.update_suit_sensors()
-
-
-/obj/item/clothing/under/CtrlClick(mob/user)
- . = ..()
-
- if (!(item_flags & IN_INVENTORY))
- return
-
- if(!isliving(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
- return
-
- if(has_sensor == LOCKED_SENSORS)
- to_chat(user, "The controls are locked.")
- return
- if(has_sensor == BROKEN_SENSORS)
- to_chat(user, "The sensors have shorted out!")
- return
- if(has_sensor <= NO_SENSORS)
- to_chat(user, "This suit does not have any sensors.")
- return
-
- sensor_mode = SENSOR_COORDS
-
- to_chat(user, "Your suit will now report your exact vital lifesigns as well as your coordinate position.")
-
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- if(H.w_uniform == src)
- H.update_suit_sensors()
-
-/obj/item/clothing/under/AltClick(mob/user)
- . = ..()
- if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
- return
- if(attached_accessory)
- remove_accessory(user)
- else
- rolldown()
- // Polychrome stuff:
- if(hasprimary | hassecondary | hastertiary)
- var/choice = input(user,"polychromic thread options", "Clothing Recolor") as null|anything in list("[hasprimary ? "Primary Color" : ""]", "[hassecondary ? "Secondary Color" : ""]", "[hastertiary ? "Tertiary Color" : ""]") //generates a list depending on the enabled overlays
- switch(choice) //Lets the list's options actually lead to something
- if("Primary Color")
- var/primary_color_input = input(usr,"","Choose Primary Color",primary_color) as color|null //color input menu, the "|null" adds a cancel button to it.
- if(primary_color_input) //Checks if the color selected is NULL, rejects it if it is NULL.
- primary_color = sanitize_hexcolor(primary_color_input, desired_format=6, include_crunch=1) //formats the selected color properly
- update_icon() //updates the item icon
- user.regenerate_icons() //updates the worn icon. Probably a bad idea, but it works.
- if("Secondary Color")
- var/secondary_color_input = input(usr,"","Choose Secondary Color",secondary_color) as color|null
- if(secondary_color_input)
- secondary_color = sanitize_hexcolor(secondary_color_input, desired_format=6, include_crunch=1)
- update_icon()
- user.regenerate_icons()
- if("Tertiary Color")
- var/tertiary_color_input = input(usr,"","Choose Tertiary Color",tertiary_color) as color|null
- if(tertiary_color_input)
- tertiary_color = sanitize_hexcolor(tertiary_color_input, desired_format=6, include_crunch=1)
- update_icon()
- user.regenerate_icons()
- return TRUE
-
-/obj/item/clothing/neck/AltClick(mob/user)
- . = ..()
- if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
- return
- // Polychrome stuff:
- if(hasprimary | hassecondary | hastertiary)
- var/choice = input(user,"polychromic thread options", "Clothing Recolor") as null|anything in list("[hasprimary ? "Primary Color" : ""]", "[hassecondary ? "Secondary Color" : ""]", "[hastertiary ? "Tertiary Color" : ""]") //generates a list depending on the enabled overlays
- switch(choice) //Lets the list's options actually lead to something
- if("Primary Color")
- var/primary_color_input = input(usr,"","Choose Primary Color",primary_color) as color|null //color input menu, the "|null" adds a cancel button to it.
- if(primary_color_input) //Checks if the color selected is NULL, rejects it if it is NULL.
- primary_color = sanitize_hexcolor(primary_color_input, desired_format=6, include_crunch=1) //formats the selected color properly
- update_icon() //updates the item icon
- user.regenerate_icons() //updates the worn icon. Probably a bad idea, but it works.
- if("Secondary Color")
- var/secondary_color_input = input(usr,"","Choose Secondary Color",secondary_color) as color|null
- if(secondary_color_input)
- secondary_color = sanitize_hexcolor(secondary_color_input, desired_format=6, include_crunch=1)
- update_icon()
- user.regenerate_icons()
- if("Tertiary Color")
- var/tertiary_color_input = input(usr,"","Choose Tertiary Color",tertiary_color) as color|null
- if(tertiary_color_input)
- tertiary_color = sanitize_hexcolor(tertiary_color_input, desired_format=6, include_crunch=1)
- update_icon()
- user.regenerate_icons()
- return TRUE
-
-/obj/item/clothing/under/verb/jumpsuit_adjust()
- set name = "Adjust Jumpsuit Style"
- set category = null
- set src in usr
- rolldown()
-
-/obj/item/clothing/under/proc/rolldown()
- if(!can_use(usr))
- return
- if(!can_adjust)
- to_chat(usr, "You cannot wear this suit any differently!")
- return
- if(toggle_jumpsuit_adjust())
- to_chat(usr, "You adjust the suit to wear it more casually.")
- else
- to_chat(usr, "You adjust the suit back to normal.")
- if(ishuman(usr))
- var/mob/living/carbon/human/H = usr
- H.update_inv_w_uniform()
- H.update_body()
-
-/obj/item/clothing/under/proc/toggle_jumpsuit_adjust()
- adjusted = !adjusted
-
- if(adjusted)
- if(fitted != FEMALE_UNIFORM_TOP)
- fitted = NO_FEMALE_UNIFORM
- if(!alt_covers_chest) // for the special snowflake suits that expose the chest when adjusted
- body_parts_covered &= ~CHEST
- else
- fitted = initial(fitted)
- if(!alt_covers_chest)
- body_parts_covered |= CHEST
-
- return adjusted
-
/obj/item/clothing/proc/weldingvisortoggle(mob/user) //proc to toggle welding visors on helmets, masks, goggles, etc.
if(!can_use(user))
return FALSE
@@ -441,15 +259,3 @@ BLIND // can't see anything
return FALSE
return TRUE
-
-/obj/item/clothing/update_overlays() // Polychrome stuff
- . = ..()
- if(hasprimary) //Checks if the overlay is enabled
- var/mutable_appearance/primary_overlay = mutable_appearance(icon, "[item_state]-primary", color = primary_color) //Automagically picks overlays
- . += primary_overlay //Applies the coloured overlay onto the item sprite. but NOT the mob sprite.
- if(hassecondary)
- var/mutable_appearance/secondary_overlay = mutable_appearance(icon, "[item_state]-secondary", color = secondary_color)
- . += secondary_overlay
- if(hastertiary)
- var/mutable_appearance/tertiary_overlay = mutable_appearance(icon, "[item_state]-tertiary", color = tertiary_color)
- . += tertiary_overlay
diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm
index f775fca203..33666d2b00 100644
--- a/code/modules/clothing/neck/_neck.dm
+++ b/code/modules/clothing/neck/_neck.dm
@@ -169,54 +169,44 @@
name = "pet collar"
desc = "It's for pets. Though you probably could wear it yourself, you'd doubtless be the subject of ridicule. It seems to be made out of a polychromic material."
icon_state = "petcollar"
- mob_overlay_icon = 'icons/mob/clothing/neck.dmi' //Because, as it appears, the item itself is normally not directly aware of its worn overlays, so this is about the easiest way, without adding a new var.
- hasprimary = TRUE
- primary_color = "#00BBBB"
pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/collar
+ var/poly_states = 1
+ var/poly_colors = list("#00BBBB")
var/tagname = null
+ var/treat_path = /obj/item/reagent_containers/food/snacks/cookie
+
+/obj/item/clothing/neck/petcollar/Initialize()
+ . = ..()
+ if(treat_path)
+ new treat_path(src)
+
+/obj/item/clothing/neck/petcollar/ComponentInitialize()
+ . = ..()
+ if(!poly_states)
+ return
+ AddElement(/datum/element/polychromic, poly_colors, poly_states)
/obj/item/clothing/neck/petcollar/attack_self(mob/user)
tagname = stripped_input(user, "Would you like to change the name on the tag?", "Name your new pet", "Spot", MAX_NAME_LEN)
name = "[initial(name)] - [tagname]"
-/obj/item/clothing/neck/petcollar/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE)
- . = ..()
- if(hasprimary | hassecondary | hastertiary)
- if(!isinhands) //prevents the worn sprites from showing up if you're just holding them
- if(hasprimary) //checks if overlays are enabled
- var/mutable_appearance/primary_worn = mutable_appearance(mob_overlay_icon, "[icon_state]-primary") //automagical sprite selection
- primary_worn.color = primary_color //colors the overlay
- . += primary_worn //adds the overlay onto the buffer list to draw on the mob sprite
- if(hassecondary)
- var/mutable_appearance/secondary_worn = mutable_appearance(mob_overlay_icon, "[icon_state]-secondary")
- secondary_worn.color = secondary_color
- . += secondary_worn
- if(hastertiary)
- var/mutable_appearance/tertiary_worn = mutable_appearance(mob_overlay_icon, "[icon_state]-tertiary")
- tertiary_worn.color = tertiary_color
- . += tertiary_worn
-
/obj/item/clothing/neck/petcollar/leather
name = "leather pet collar"
icon_state = "leathercollar"
-
- hasprimary = TRUE
- hassecondary = TRUE
- primary_color = "#222222"
- secondary_color = "#888888"
+ poly_states = 2
+ poly_colors = list("#222222", "#888888")
/obj/item/clothing/neck/petcollar/choker
desc = "Quite fashionable... if you're somebody who's just read their first BDSM-themed erotica novel."
name = "choker"
icon_state = "choker"
-
- hasprimary = TRUE
- primary_color = "#222222"
+ poly_colors = list("#222222")
/obj/item/clothing/neck/petcollar/locked
name = "locked collar"
desc = "A collar that has a small lock on it to keep it from being removed."
pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/collar/locked
+ treat_path = /obj/item/key/collar
var/lock = FALSE
/obj/item/clothing/neck/petcollar/locked/attackby(obj/item/K, mob/user, params)
@@ -238,32 +228,19 @@
/obj/item/clothing/neck/petcollar/locked/leather
name = "leather pet collar"
icon_state = "leathercollar"
-
- hasprimary = TRUE
- hassecondary = TRUE
- primary_color = "#222222"
- secondary_color = "#888888"
+ poly_states = 2
+ poly_colors = list("#222222", "#888888")
/obj/item/clothing/neck/petcollar/locked/choker
name = "choker"
desc = "Quite fashionable... if you're somebody who's just read their first BDSM-themed erotica novel."
icon_state = "choker"
-
- hasprimary = TRUE
- primary_color = "#222222"
+ poly_colors = list("#222222")
/obj/item/key/collar
name = "Collar Key"
desc = "A key for a tiny lock on a collar or bag."
-/obj/item/clothing/neck/petcollar/Initialize()
- . = ..()
- new /obj/item/reagent_containers/food/snacks/cookie(src)
-
-/obj/item/clothing/neck/petcollar/locked/Initialize()
- . = ..()
- new /obj/item/key/collar(src)
-
//////////////
//DOPE BLING//
//////////////
diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm
index 7d56fbe6dd..ce3d2576f9 100644
--- a/code/modules/clothing/suits/cloaks.dm
+++ b/code/modules/clothing/suits/cloaks.dm
@@ -91,3 +91,14 @@
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF | GOLIATH_RESISTANCE
+
+/obj/item/clothing/neck/cloak/polychromic
+ name = "polychromic cloak"
+ desc = "For when you want to show off your horrible colour coordination skills."
+ icon_state = "polyce"
+ item_state = "qmcloak"
+ var/list/poly_colors = list("#FFFFFF", "#FFFFFF", "#808080")
+
+/obj/item/clothing/neck/cloak/polychromic/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/polychromic, poly_colors, 3)
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 71f04afc9c..c133ea7c88 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -974,70 +974,11 @@
icon_state = "coatpoly"
item_state = "coatpoly"
hoodtype = /obj/item/clothing/head/hooded/winterhood/polychromic
- hasprimary = TRUE
- hassecondary = TRUE
- hastertiary = TRUE
- primary_color = "#6A6964"
- secondary_color = "#C4B8A6"
- tertiary_color = "#0000FF"
+
+/obj/item/clothing/suit/hooded/wintercoat/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/polychromic, list("#6A6964", "#C4B8A6", "#0000FF"), 3)
/obj/item/clothing/head/hooded/winterhood/polychromic
icon_state = "winterhood_poly"
item_state = "winterhood_poly"
-
-/obj/item/clothing/head/hooded/winterhood/polychromic/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) //this is where the main magic happens.
- . = ..()
- if(suit.hasprimary | suit.hassecondary)
- if(!isinhands) //prevents the worn sprites from showing up if you're just holding them
- if(suit.hasprimary) //checks if overlays are enabled
- var/mutable_appearance/primary_worn = mutable_appearance(icon_file, "[icon_state]-primary") //automagical sprite selection
- primary_worn.color = suit.primary_color //colors the overlay
- . += primary_worn //adds the overlay onto the buffer list to draw on the mob sprite.
- if(suit.hassecondary)
- var/mutable_appearance/secondary_worn = mutable_appearance(icon_file, "[icon_state]-secondary")
- secondary_worn.color = suit.secondary_color
- . += secondary_worn
-
-/obj/item/clothing/suit/hooded/wintercoat/polychromic/worn_overlays(isinhands, icon_file, used_state, style_flags = NONE) //this is where the main magic happens.
- . = ..()
- if(hasprimary | hassecondary | hastertiary)
- if(!isinhands) //prevents the worn sprites from showing up if you're just holding them
- if(hasprimary) //checks if overlays are enabled
- var/mutable_appearance/primary_worn = mutable_appearance(icon_file, "[icon_state]-primary[suittoggled ? "_t" : ""]") //automagical sprite selection
- primary_worn.color = primary_color //colors the overlay
- . += primary_worn //adds the overlay onto the buffer list to draw on the mob sprite.
- if(hassecondary)
- var/mutable_appearance/secondary_worn = mutable_appearance(icon_file, "[icon_state]-secondary[suittoggled ? "_t" : ""]")
- secondary_worn.color = secondary_color
- . += secondary_worn
- if(hastertiary)
- var/mutable_appearance/tertiary_worn = mutable_appearance(icon_file, "[icon_state]-tertiary[suittoggled ? "_t" : ""]")
- tertiary_worn.color = tertiary_color
- . += tertiary_worn
-
-/obj/item/clothing/suit/hooded/wintercoat/AltClick(mob/user)
- . = ..()
- if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
- return
- if(hasprimary | hassecondary | hastertiary)
- var/choice = input(user,"polychromic thread options", "Clothing Recolor") as null|anything in list("[hasprimary ? "Primary Color" : ""]", "[hassecondary ? "Secondary Color" : ""]", "[hastertiary ? "Tertiary Color" : ""]") //generates a list depending on the enabled overlays
- switch(choice) //Lets the list's options actually lead to something
- if("Primary Color")
- var/primary_color_input = input(usr,"","Choose Primary Color",primary_color) as color|null //color input menu, the "|null" adds a cancel button to it.
- if(primary_color_input) //Checks if the color selected is NULL, rejects it if it is NULL.
- primary_color = sanitize_hexcolor(primary_color_input, desired_format=6, include_crunch=1) //formats the selected color properly
- update_icon() //updates the item icon
- user.regenerate_icons() //updates the worn icon. Probably a bad idea, but it works.
- if("Secondary Color")
- var/secondary_color_input = input(usr,"","Choose Secondary Color",secondary_color) as color|null
- if(secondary_color_input)
- secondary_color = sanitize_hexcolor(secondary_color_input, desired_format=6, include_crunch=1)
- update_icon()
- user.regenerate_icons()
- if("Tertiary Color")
- var/tertiary_color_input = input(usr,"","Choose Tertiary Color",tertiary_color) as color|null
- if(tertiary_color_input)
- tertiary_color = sanitize_hexcolor(tertiary_color_input, desired_format=6, include_crunch=1)
- update_icon()
- user.regenerate_icons()
- return TRUE
diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm
index cbbd64ebcc..4f29eab6ab 100644
--- a/code/modules/clothing/suits/toggles.dm
+++ b/code/modules/clothing/suits/toggles.dm
@@ -6,7 +6,7 @@
var/hoodtype = /obj/item/clothing/head/hooded/winterhood //so the chaplain hoodie or other hoodies can override this
/obj/item/clothing/suit/hooded/New()
- MakeHood()
+ hood = MakeHelmet()
..()
/obj/item/clothing/suit/hooded/Destroy()
@@ -14,11 +14,15 @@
qdel(hood)
hood = null
-/obj/item/clothing/suit/hooded/proc/MakeHood()
+/obj/item/clothing/suit/proc/MakeHelmet(obj/item/clothing/head/H)
+ SEND_SIGNAL(src, COMSIG_SUIT_MADE_HELMET, H)
+ return H
+
+/obj/item/clothing/suit/hooded/MakeHelmet(obj/item/clothing/head/hooded/H)
if(!hood)
- var/obj/item/clothing/head/hooded/W = new hoodtype(src)
- W.suit = src
- hood = W
+ H = new hoodtype(src)
+ H.suit = src
+ return ..()
/obj/item/clothing/suit/hooded/ui_action_click()
ToggleHood()
@@ -125,7 +129,7 @@
//Hardsuit toggle code
/obj/item/clothing/suit/space/hardsuit/Initialize()
- MakeHelmet()
+ helmet = MakeHelmet()
. = ..()
/obj/item/clothing/suit/space/hardsuit/Destroy()
@@ -140,13 +144,13 @@
suit.helmet = null
return ..()
-/obj/item/clothing/suit/space/hardsuit/proc/MakeHelmet()
+/obj/item/clothing/suit/space/hardsuit/MakeHelmet(obj/item/clothing/head/helmet/space/hardsuit/H)
if(!helmettype)
return
if(!helmet)
- var/obj/item/clothing/head/helmet/space/hardsuit/W = new helmettype(src)
- W.suit = src
- helmet = W
+ H = new helmettype(src)
+ H.suit = src
+ return ..()
/obj/item/clothing/suit/space/hardsuit/ui_action_click()
..()
diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm
index 42783ab518..fe3aaf4bda 100644
--- a/code/modules/clothing/under/_under.dm
+++ b/code/modules/clothing/under/_under.dm
@@ -19,27 +19,13 @@
var/mutable_appearance/accessory_overlay
/obj/item/clothing/under/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE)
- . = list()
+ . = ..()
if(isinhands)
return
if(damaged_clothes)
. += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform")
if(blood_DNA)
. += mutable_appearance('icons/effects/blood.dmi', "uniformblood", color = blood_DNA_to_color())
- if(accessory_overlay)
- . += accessory_overlay
- if(hasprimary) //checks if overlays are enabled
- var/mutable_appearance/primary_worn = mutable_appearance(icon_file, "[icon_state]-primary") //automagical sprite selection
- primary_worn.color = primary_color //colors the overlay
- . += primary_worn //adds the overlay onto the buffer list to draw on the mob sprite.
- if(hassecondary)
- var/mutable_appearance/secondary_worn = mutable_appearance(icon_file, "[icon_state]-secondary")
- secondary_worn.color = secondary_color
- . += secondary_worn
- if(hastertiary)
- var/mutable_appearance/tertiary_worn = mutable_appearance(icon_file, "[icon_state]-tertiary")
- tertiary_worn.color = tertiary_color
- . += tertiary_worn
/obj/item/clothing/under/attackby(obj/item/I, mob/user, params)
if((has_sensor == BROKEN_SENSORS) && istype(I, /obj/item/stack/cable_coil))
@@ -167,5 +153,121 @@
if(attached_accessory)
. += "\A [attached_accessory] is attached to it."
+/obj/item/clothing/under/verb/toggle()
+ set name = "Adjust Suit Sensors"
+ set category = "Object"
+ set src in usr
+ var/mob/M = usr
+ if (istype(M, /mob/dead/))
+ return
+ if (!can_use(M))
+ return
+ if(src.has_sensor == LOCKED_SENSORS)
+ to_chat(usr, "The controls are locked.")
+ return 0
+ if(src.has_sensor == BROKEN_SENSORS)
+ to_chat(usr, "The sensors have shorted out!")
+ return 0
+ if(src.has_sensor <= NO_SENSORS)
+ to_chat(usr, "This suit does not have any sensors.")
+ return 0
+
+ var/list/modes = list("Off", "Binary vitals", "Exact vitals", "Tracking beacon")
+ var/switchMode = input("Select a sensor mode:", "Suit Sensor Mode", modes[sensor_mode + 1]) in modes
+ if(get_dist(usr, src) > 1)
+ to_chat(usr, "You have moved too far away!")
+ return
+ sensor_mode = modes.Find(switchMode) - 1
+
+ if (src.loc == usr)
+ switch(sensor_mode)
+ if(0)
+ to_chat(usr, "You disable your suit's remote sensing equipment.")
+ if(1)
+ to_chat(usr, "Your suit will now only report whether you are alive or dead.")
+ if(2)
+ to_chat(usr, "Your suit will now only report your exact vital lifesigns.")
+ if(3)
+ to_chat(usr, "Your suit will now report your exact vital lifesigns as well as your coordinate position.")
+
+ if(ishuman(loc))
+ var/mob/living/carbon/human/H = loc
+ if(H.w_uniform == src)
+ H.update_suit_sensors()
+
+
+/obj/item/clothing/under/CtrlClick(mob/user)
+ . = ..()
+
+ if (!(item_flags & IN_INVENTORY))
+ return
+
+ if(!isliving(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
+ return
+
+ if(has_sensor == LOCKED_SENSORS)
+ to_chat(user, "The controls are locked.")
+ return
+ if(has_sensor == BROKEN_SENSORS)
+ to_chat(user, "The sensors have shorted out!")
+ return
+ if(has_sensor <= NO_SENSORS)
+ to_chat(user, "This suit does not have any sensors.")
+ return
+
+ sensor_mode = SENSOR_COORDS
+
+ to_chat(user, "Your suit will now report your exact vital lifesigns as well as your coordinate position.")
+
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if(H.w_uniform == src)
+ H.update_suit_sensors()
+
+/obj/item/clothing/under/AltClick(mob/user)
+ . = ..()
+ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
+ return
+ if(attached_accessory)
+ remove_accessory(user)
+ else
+ rolldown()
+
+/obj/item/clothing/under/verb/jumpsuit_adjust()
+ set name = "Adjust Jumpsuit Style"
+ set category = null
+ set src in usr
+ rolldown()
+
+/obj/item/clothing/under/proc/rolldown()
+ if(!can_use(usr))
+ return
+ if(!can_adjust)
+ to_chat(usr, "You cannot wear this suit any differently!")
+ return
+ if(toggle_jumpsuit_adjust())
+ to_chat(usr, "You adjust the suit to wear it more casually.")
+ else
+ to_chat(usr, "You adjust the suit back to normal.")
+ if(ishuman(usr))
+ var/mob/living/carbon/human/H = usr
+ H.update_inv_w_uniform()
+ H.update_body()
+
+/obj/item/clothing/under/proc/toggle_jumpsuit_adjust()
+ adjusted = !adjusted
+
+ if(adjusted)
+ if(fitted != FEMALE_UNIFORM_TOP)
+ fitted = NO_FEMALE_UNIFORM
+ if(!alt_covers_chest) // for the special snowflake suits that expose the chest when adjusted
+ body_parts_covered &= ~CHEST
+ else
+ fitted = initial(fitted)
+ if(!alt_covers_chest)
+ body_parts_covered |= CHEST
+
+ return adjusted
+
/obj/item/clothing/under/rank
dying_key = DYE_REGISTRY_UNDER
diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm
index 7cbfe5abf5..69a1dc67b3 100644
--- a/code/modules/clothing/under/costume.dm
+++ b/code/modules/clothing/under/costume.dm
@@ -96,7 +96,7 @@
/obj/item/clothing/under/costume/kilt/polychromic/ComponentInitialize()
. = ..()
- AddElement(/datum/element/polychromic, list("#FFFFFF", "#F08080"), list("polykilt-primary", "polykilt-secondary"), null, POLYCHROMIC_ALTCLICK|POLYCHROMIC_NO_HELD|POLYCHROMIC_ACTION)
+ AddElement(/datum/element/polychromic, list("#FFFFFF", "#F08080"), 2)
/obj/item/clothing/under/costume/gladiator
name = "gladiator uniform"
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index a7557a0702..d475ca8100 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -241,69 +241,67 @@
desc = "A fancy button-up shirt made with polychromic threads."
icon_state = "polysuit"
item_state = "sl_suit"
- hasprimary = TRUE
- hassecondary = TRUE
- hastertiary = TRUE
- primary_color = "#FFFFFF"
- secondary_color = "#353535"
- tertiary_color = "#353535"
mutantrace_variation = NONE
+/obj/item/clothing/under/misc/poly_shirt/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/polychromic, list("#FFFFFF", "#353535", "#353535"), 3)
+
/obj/item/clothing/under/misc/polyshorts
name = "polychromic shorts"
desc = "For ease of movement and style."
icon_state = "polyshorts"
item_state = "rainbow"
- hasprimary = TRUE
- hassecondary = TRUE
- hastertiary = TRUE
- primary_color = "#353535"
- secondary_color = "#808080"
- tertiary_color = "#808080"
can_adjust = FALSE
body_parts_covered = CHEST|GROIN|ARMS
+/obj/item/clothing/under/misc/polyshorts/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/polychromic, list("#353535", "#808080", "#808080"), 3)
+
/obj/item/clothing/under/misc/polyjumpsuit
name = "polychromic tri-tone jumpsuit"
desc = "A fancy jumpsuit made with polychromic threads."
icon_state = "polyjump"
item_state = "rainbow"
- hasprimary = TRUE
- hassecondary = TRUE
- hastertiary = TRUE
- primary_color = "#FFFFFF"
- secondary_color = "#808080"
- tertiary_color = "#FF3535"
can_adjust = FALSE
mutantrace_variation = NONE
+/obj/item/clothing/under/misc/polyjumpsuit/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/polychromic, list("#FFFFFF", "#808080", "#353535"), 3)
+
/obj/item/clothing/under/misc/poly_bottomless
name = "polychromic bottomless shirt"
- desc = "Great for showing off your junk in dubious style."
+ desc = "Great for showing off your underwear in dubious style."
icon_state = "polybottomless"
item_state = "rainbow"
- primary_color = "#808080"
- secondary_color = "#FF3535"
body_parts_covered = CHEST|ARMS //Because there's no bottom included
can_adjust = FALSE
mutantrace_variation = NONE
+/obj/item/clothing/under/misc/poly_bottomless/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/polychromic, list("#808080", "#FF3535"), 2)
+
/obj/item/clothing/under/misc/poly_tanktop
name = "polychromic tank top"
desc = "For those lazy summer days."
icon_state = "polyshimatank"
item_state = "rainbow"
- primary_color = "#808080"
- secondary_color = "#FFFFFF"
- tertiary_color = "#8CC6FF"
body_parts_covered = CHEST|GROIN
can_adjust = FALSE
mutantrace_variation = NONE
+ var/list/poly_states = 3
+ var/list/poly_colors = list("#808080", "#FFFFFF", "#8CC6FF")
+
+/obj/item/clothing/under/misc/poly_tanktop/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/polychromic, poly_colors, poly_states)
/obj/item/clothing/under/misc/poly_tanktop/female
name = "polychromic feminine tank top"
desc = "Great for showing off your chest in style. Not recommended for males."
icon_state = "polyfemtankpantsu"
- hastertiary = FALSE
- primary_color = "#808080"
- secondary_color = "#FF3535"
+ poly_states = 2
+ poly_colors = list("#808080", "#FF3535")
diff --git a/code/modules/clothing/under/shorts.dm b/code/modules/clothing/under/shorts.dm
index ebf7cb5896..f61a41e4c3 100644
--- a/code/modules/clothing/under/shorts.dm
+++ b/code/modules/clothing/under/shorts.dm
@@ -35,19 +35,18 @@
desc = "95% Polychrome, 5% Spandex!"
icon_state = "polyshortpants"
item_state = "rainbow"
- hasprimary = TRUE
- hassecondary = TRUE
- primary_color = "#FFFFFF"
- secondary_color = "#F08080"
mutantrace_variation = NONE
+ var/list/poly_colors = list("#FFFFFF", "#F08080")
+
+/obj/item/clothing/under/shorts/polychromic/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/polychromic, poly_colors, 2)
/obj/item/clothing/under/shorts/polychromic/pantsu
name = "polychromic panties"
desc = "Topless striped panties. Now with 120% more polychrome!"
icon_state = "polypantsu"
item_state = "rainbow"
- hastertiary = FALSE
- primary_color = "#FFFFFF"
- secondary_color = "#8CC6FF"
body_parts_covered = GROIN
mutantrace_variation = NONE
+ poly_colors = list("#FFFFFF", "#8CC6FF")
diff --git a/code/modules/clothing/under/skirt_dress.dm b/code/modules/clothing/under/skirt_dress.dm
index f00e96d821..fa2c9eed71 100644
--- a/code/modules/clothing/under/skirt_dress.dm
+++ b/code/modules/clothing/under/skirt_dress.dm
@@ -211,21 +211,18 @@
desc = "A fancy skirt made with polychromic threads."
icon_state = "polyskirt"
item_state = "rainbow"
- hasprimary = TRUE
- hassecondary = TRUE
- hastertiary = TRUE
- primary_color = "#FFFFFF"
- secondary_color = "#F08080"
- tertiary_color = "#808080"
mutantrace_variation = NONE
+ var/list/poly_colors = list("#FFFFFF", "#F08080", "#808080")
+
+/obj/item/clothing/under/dress/skirt/polychromic/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/polychromic, poly_colors, 3)
/obj/item/clothing/under/dress/skirt/polychromic/pleated
name = "polychromic pleated skirt"
desc = "A magnificent pleated skirt complements the woolen polychromatic sweater."
icon_state = "polypleat"
item_state = "rainbow"
- primary_color = "#8CC6FF"
- secondary_color = "#808080"
- tertiary_color = "#FF3535"
body_parts_covered = CHEST|GROIN|ARMS
mutantrace_variation = NONE
+ poly_colors = list("#8CC6FF", "#808080", "#FF3535")
diff --git a/code/modules/clothing/under/suits.dm b/code/modules/clothing/under/suits.dm
index 3ee5204c3b..087262dd1e 100644
--- a/code/modules/clothing/under/suits.dm
+++ b/code/modules/clothing/under/suits.dm
@@ -109,11 +109,9 @@
desc = "For when you want to show off your horrible colour coordination skills."
icon_state = "polysuit"
item_state = "sl_suit"
- hasprimary = TRUE
- hassecondary = TRUE
- hastertiary = TRUE
- primary_color = "#FFFFFF"
- secondary_color = "#FFFFFF"
- tertiary_color = "#808080"
can_adjust = FALSE
mutantrace_variation = NONE
+
+/obj/item/clothing/under/suit/polychromic/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/polychromic, list("#FFFFFF", "#FFFFFF", "#808080"), 3)
diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi
index c499c236e36e363136e61b121b430ee0a94787b3..f2ea9fa55dc7b92f45665ae280be3722c8af95d1 100644
GIT binary patch
delta 8017
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
CtW`
delta 7985
zcmXX~2Q*w=xDA5ni73$}(L2$5BElegjWQCw_d2*F!5_VgPPB+#M;{_Oqjy6@H#$Rx
z!JEAIX5G2>-0ytr-gVcvzrD{sE#qWO<75eJINpiutn^|~wto1bjesf0Wiw%4%Tg?i
z28Tp(icGsM5zGb*WOfvd4sT5vI-xsDcTlU
z%&Hg)9%u5^e8+eghntlAIh{+~=V>_mXt|jCm^U0U&&dg}Q|O8dW+ApISo~O4#^Wv6
zRe=a=8}Y)ck6|$FQ)O=^-rC_p@M@BgCB(B+h)SRYcUXD@b#efoEBgymmJ=;KsgP#gT8fAdOqCtU7n&mt(Eo9o}J8
z+H!bpU>#u2s@EZ4&g$jw{DNbz=Y`8NJn6s8C$$~f%~#*GH9G)pj?xvcaN>$*(WK<=
z3Q-KnHjR{Xk+SHcqOM78p3egz_#6``NQfkwx%rkj>rZ?r=#PF(MYNbG)hRMiVY~}z
z^e70%bkkkhdwF;`0zU~stUhgw8)}mCdf@r$qzzERG~tge+hC+IH0^1EJx1No%J7P5
zn{%GOP0G$gHqKPpDq#AJOnLN&<*S4wvdZhPpYFTOdl)OoT`LxM(4FNz8!k&e<8eNY
zn(vHDDt?UwQ+{Vzhu`n0nj)bKy|
zqdI&&a2FU-$GC&V(7rt1o%~(vIOUg|x+;KhBhHhKIy1FS43{s`Cib%Dx_l!gnvXQD1Y
z-Vp8A<|^mxE7^oK8VzFls*f-Wg(ZT^>C>IzDoU7(BuZWwNx_Ga(Pe(`l9haCaR#tc
z@3=e;{&D?T?Pt^AwsmlLs5GX@qt2DKs&FnJO2)n}wH65dL}yEiFMr>PtMYNJsv68l
zUWw+I`T;{%_+$-=K=|0G5{Hf{nVd9e3#v-jk`a5h)io%b@D0;PG#(d5Fnht~ST0)j
zdhnAKs^pD%xjj#!Zd@
zq34iTFTa*bcuM>zhK*Gjv`%#)Vat|QYf8Uo)g~k&TP4EjZ^@kk=aOdWdw49BEXDd;d7z+JEP3rdJ3vod
zA%@d?*VBpUiF~b~+KCv8WW!z-mLl)ZdBp00aOvkXOJfwqp${|E@RzytMB}8q@R1Ch
zWubm4Tsrs#10fZm+uf$K1NuUkXM^|7hxv3#@3k7iRd
zdUa8ef@x-c;A^F3$8~dTGt$d&`vC7KfFkdf#_~2cddUCvef%*Z(f^e48M$>cz1}a`
zUgbIdA!iR+GkZcpQR*+kKv(;>9$Q9Bo}
z&4Xle{**bPA|)rT_)wCKFuvp@t(@%q1go&{p12X?&tmJpJyQ9_w}~PnLGP`Fo{Hm~
zT+O81bc^&nreucv7*qNLE;!!N)1wf*q9%@K4*t~_g8%2_^1D)3U*{_p)qcFKtvzo=
zGODf6qT(Q)3e8_l_Q<6qT)?-RpGz~rHkAb9v>DU@9`jxa@*<;;)1hT-Us?H$xV4@TbfiWSD{Ga=J*K_y(nVTj&ztMo9d*RZ
z80ijPT_KYM!@?dT<;1RpXTER*)oRM4B4iFW9Zo}7?Jd$?+Z
zQ>&H55{r>&9W|C;n@&XTri;-4o6(JX}@))XT+je6veWq^sMEQ
z{6nGE(?l_^C1D3ssvYX3Xo>;9Lp&Qox!!Fz#W4n!ut~h+_cbd98^4hKWi=k30^#%P
z34{JdztWg^(}{yd$5UDgAJ$}}a7nkNq?kIQ)*mvAe+EWD|6L53NgNiX>5=tF(*IzS
z1UE;xqtW5?li7hktVbPM>4z{3jHwm7=GJ6Za4&_$Wx
zIk)ui|M`}7XI5~lhkraz1pfA$T*8t=yjn`5V&%Ad;z5@tji
zBkHkL{hV5~({R--i%%t9HtOVtyf02lo%W45Rq-F@gVeEwhn8PysQX`rZuLt1wbf=R
zt5Q`^m6YJih-Hfws#egpVWVc(t7%Qpg0Kuxyl_x(3%Nr=N8Nzi6O6(LlMJh`?#0tj
zMZ}Rs#5mYLF0_ak?|};NX#%&hi~CR6e7XMAta_V0!i%TP*{>jXG0GG*jX!)+SIHcE
zKCstkT#sMj+1~B=fz>g>+Y^V##PhijUYOtA*Y+N3RaX04zrMjsFL-u>--nPf*|GbB
zf?BzQGt3!?SVmr?!r6>jEL=K(>eq?5L%-Nz1xycDIzZRC;%)>m^73i#Stbbu)z;sx
zESs6r_;y%u!kFJy_d2E7fH}(e`#NvyJ-twABklLt2<%MK4h(S^)EDkyf9_52J>}nU
zf=xHf0t|rpUZld3t~wCAlO#Ikc1yFlH7BpLUJy)ey7A3pr)^WVBj5lTAXB)UgHkxw
zTasS!@RS86wqm-y(F`QnDA`S}0K^ho(CV3W5PtS_%m%cGtULK5d3rz-2CcbaHoU`!|iCGMno7GficX$f1dv50H
z#59$(vhNpUs=mac^3Z!_f+Mu?9~^GL^?YqYZ@4;dJ6cLRg;@T5(7oDU^N$|>@95sW
z&>a!q`}hCvqRmgfI
zm*$dp+OeGQw$(qiWBW!-2ST7CqhQ!~@7{j^uVF>a_E=su3OQH)g8!6H>GoL7H@t5Qe)%%-LVSOAb}zU9i9$i9S5_XSiY&VzXDjQCs?6waJDu=%
zT78iF-@ZKq_|2MyFrE!tvgdw^%F5w;dwVfsO4vb%``Rl5eSP~-Xy0~$;9W{~cU9Zd
z51Px_fDwzE|H*ZC&S)!U&>?WWt?_D7sih!Z*q~E0S9YPQx*A%dndPWHnYCI@vI(HS
zJOfQ0E+W#-JUIG(Q^6J%793q%3_?OWLu8>78f0_aeeE8TwDok1_lNWy;0N!S$YIAmsxOd?T7HK
zu{@SmDVv(zpvZcXh3zwk^}g7}W{>sIe%-GlexAYdc`pe2&a{kf;{>@T&ln6Dn0gd9
ztJ$z{`ErPb%{n@9^XRnq>?##TOGV|7+$}7*dBoW%{r0P*!I`bbcx<#98vsh?)Y7%J
zz2cThUVm$i<^^HdMqq16yH{Hq4Mhi(Xrg~Jo`PgAMwB(wqz8ru|I
z%$EP~VESI+zPnOjV5@v{y$NKgc>TiTz=a~Mdv|xYuf7xu1r`#+M!+xYhC<~GDi
zMpGQmQo7#JQ8f~#cUyuTmz%y5h0F<^!C0Xakp&FF~HfU%GSi$OUWmM
ztjrZf8?~I$jvrp33KUf0y3Zv!%-e^2J)fOD@3&RUr4$?XQdR!Kzqr((g}r2MN)^en
z(~tR{=1jV|>A4e*=m(e$-zBEnXr-#?ZR+TJP~Y)29eq@68z*+ls4>duv})*81a5l4
zETIN;$+GWV+0Z&3N(hWs>@H+p$C7y8)RCxQuBx*{btDkpEgjy26+|U<=>i#IYb99%
z(7CsnPf}47f^;xU{8UO^a4j*7*k?6WiT$OUBn;sS^qHG$T30EgoqLIvVc19hQqk*o
z-})swDCr~qK9+dIfZL!_%)TFNH>khPMr2qM0wcmQ_f1@W0#zW!HKj%~BH6^ipcqT)
zPPZ5|4?n+H8jHzo2r^RP=yoAk%P0NiJ3MOIFV&iUtC#xFvrcZ!*$xWX;DN!#)xYo4
zUEbj_0b{U%Q=Oz4qrP{pRQXB^Ye-KbXO+Vc@+^ku1VcZ*e@`&u3OfQjFVOqcos(^+
zbkomVdJyxJs6b;*z#^K$?Kz2ItoJnxN@DIvV734lO}Z0Myn8}|4_&KHtLI52QVMh3^a
zfti^zXP#GF)p1~BW4_`MJhQ;hZgjlDZ&eTbG%V0!;9>P=lKgV!^((=GDKKn~k$=bD
z-oCzvhlknSy(cG|72x~u*rYS>i*{IF6kmX87PKXaDR=6J%Md(=7bIO%
z6U1VghuP!PK8CUMA_eQeVowG2q@-FL9i&t!=4Q$djpM4WEfk?+yNMRLc23>kk(jm3
z0N?E!xlylQdS-jM}
zzXh}{l7rdrCe+{TU$L0_$J(YdPJP@sphx+wx|pF+c#
zN6C&dL8&VfVrmusGc%}oJ~?;$XPJi=6e&5A#R
zoqlX|yX?JC^s)?O%3i0vf-f34I5_N(TG*+$o0w!^HQMEIztHDx8T|b^o8g9#o2zlU
zE{-#%#I}6)@IF05!>xU|SQ1Oftq0i9o)0VkZ~PQh(qLp{WDfA)$DEq`S3LkmWTs_R
zzw#{!74%~W*5H2*KI2xIeBRGAWOgS^V$PwRPXj&S;4ia2>7z9CzRx__;
zlsC=eHE2Rwm~Fn=;(5I
z{RFT#06{f!@Uk;9pJI8FZBRZ)KTMIefkfirg8^>4w;rdLs%mO#Nw5x65D3(LDaVXY
zO8YxZQPBw6u!H*fDt1&O6(-mG7~=FYtZK1Qy_%MW=jmDnZ{<@j`OAItwgzlt5Cx;H
z`fc`5pYNL=p!R&?`;Fy=mf?Hl?EZZR0DY|7(UBHfWxU|-y4>mRckFC*RSWtFVO`Ow
z6(Vb*U}^i@Uf=bL_Y73bv0PusF8VO|sj?HVf_N@CW&WEW;#?VV^^227&3Pg(zIeBX
zUFzz0Jl3LY{WlQ=x-yJZdCOF(`?j1}bANI&g$l&fdKRJniN$>eIvRdCdije1D1w0f
zO?9KhXJ(KEnTF#zkq;!+3NbC1Pcf0#UDR-;u8)(MGC`PHC-horFZ^B&OED+
zOmJm3-8TBkIPEU0lc`N^=>-b`OD7e0&;fpB;;CR`=Kw$xe?U-_Y^wrku_JWQj-?3*5G~xutqG
z^fh%}()7ec!Pb`TO&}yq1Er;jZ3qTOlEwn@X5^ey;LoF@l>T)cQ>Uy99MyOA>;~m(
zj;IvB%)0t|?6S(h*!X)~9QkOrl%9<5zK~(38s`{m93N1RojvhC&-wYTa^Zt3XI-l7
z8;SPo+`c&Y1R&N%0ZN*LT$a6f3ho8YkOj*YRtuV)dacsicNgd9PevJIg8zQ+Tt_+X
z?=a>79~!JTkyr5-IcNn8>21f+nIFdnGV_h;wF=s2$3Hr^W9M06ODH#X#a2Vb_v*P@
zkDO5U53X8eCmE5ArQG7jqozfbcMDKFNp);QKV=^H5Jc+J|IsGz%nsCjT75L;+G1Gt
zLnf{8t(@GurNn}WZO2z$A2e2jBxH>W8=2@9r>6>At)yBF4>4C*wT@1^Ec$+MY;ZFR
z!=B%*B#V5Q0|K<7-YL|5^3ruWhT=FvcVC~;G=^9^VZ%ryMFkjUfz{9gCTMDEDi1%v
zKXZjT#Mo+zo;~+_dL7g`F8Oopl{j}0)W^ogW{33mG1EAQXAV5AF|?}skK)qAc=TV(U{PQMfkZC#c$oY6`0Q*&w6?Z>PlG8Ln44F&
zwyxbhRh{?1`$YdmCbZCn3n{{w31nvSX?fO!y12TMoBIucL8okxn2rb8>v8Its6S*D
z0kX_Fz%BaJUpDZBpgKgn-|Pfwj3pN_Q(c43?}p6rDrhwNG_V7EVD;B~lX2tx+*?ds
zJi_zr>4j#OyR*e0MoW18dPNmyDVKldyK5VsX10(7$`cDRQx}Y2psO
z>L6j-wrPZ@Wkh7m7b}#T`f>P{VfD{K`yPFt78cL7C0!dc4JRa_7=zriy)Md%#|mK@Eg4Ib|{Pg0`VB5Va+hFtW2GMECKNQJ5#`6&D>Ic%0|(I4r7`ycIn+faQ##rOD_@E^PdWA`;&hB
z;OS^aqu+z?3aD~9h6kSJ`Z%@eM5rB7SKEnl3k*GaC@B+Y7
zJy)*Cnm_02kgWLxl*+~=>E4x8)Q^nzMtFsvUf&cf`HWHTom_njVUbwIqNxH~`P96;
z>P^8hZS=QA?On)9!1nIWMB&hoh!^H{b43LolU$(wc8;ILcTxece)+#dtc9C(2BnrU
z4MfH>PFP9dxitiENxVEbH~{cgB+Oddw9=L|(MYPFSnn0P%_2{UA)8WUW#tXf(AaMe
zzW5ex%^pv5@SktrgCJ((rqPUPpG4#qiFDzx7_j4>i4#r1gA|s$1P)s
zYrnnAu%y6tWfnS-xz5uCB;9;P_@k_BqU3E>OpML$WbwuM?v&4=AP^!5s-nupdw+Ay
z;DDs~d?YGn-rn~ir1|vJb4e<*pgLd7m!QV$))Rb!+*=O`>2bWiG6jU~w=xb{;xH%p
z%7GgvZ>2AnN5*v?Vw)3raU?h+56;opQtv+VAtB-1y9$_k#eS^YlksT*>$eYL*3hu&
zA*73Td+rTGRckA-C?Fs}&V)a4Ih)$w;fj!MYiO8mY%jp>K{UNh|7{oew5gz7dr4?R
z9gjuneOmyV(l2zIPJqB`E7E{~fTqJwp=+qV*o_{PV>ORGz8`bA>apIpfNf2z
zVi%m*^{igqgjnI%^hiZ?C+6f-&dwTk_(1%2!hdV9-~emZQVVMuHZoWSKiKes6UA}L
znH!!y@i~;q?@@{Sjx|buy@VFgU@oqjqT^)f#lfnl06x
zA@R2Wx{77Mx^sPU;f0GG^yKfyXGS7~r+vI*^YACP?`PcJyhh8+XOz08S#nrdAJls~
zXfzQh;Q4c10xM_NHe_pN8_kS8Sf8tjE-94PReh
zdq!8P>e>_*lUM4TV{GCEx6=P?pgL!Kkk!uKeoB#+d8ppK=b2ogIQQ;-FmCX>*PpZ$
z5)>Ugl~mq11~pZ8`!Y%XyWenWoutGO-nh#6$cx!(nUBHh)xT6$BR?h;>7F?Idy@Rb
zmaiY<3;o~bndL)#p>JPk!|>9>^zbtNZJ|lfPT%3hFpVJaFzb!~l0eFuud7~Je*7Qp
C$vD6O
diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi
index de59a136d99ca23e0b751b962395756793bcaafb..68fde7bff95931d53484b9bcb01221142988828d 100644
GIT binary patch
literal 47399
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
z