diff --git a/code/__DEFINES/dye_keys.dm b/code/__DEFINES/dye_keys.dm
index 582f3127380..ac0c2d35229 100644
--- a/code/__DEFINES/dye_keys.dm
+++ b/code/__DEFINES/dye_keys.dm
@@ -23,11 +23,18 @@
#define DYE_PURPLE "purple"
#define DYE_BLACK "black"
#define DYE_WHITE "white"
-#define DYE_PINK "pink"
-#define DYE_YELLOWGREEN "yellowgreen"
+#define DYE_DARKBLUE "darkblue"
#define DYE_LIGHTBLUE "lightblue"
-#define DYE_LIGHTPURPLE "lightpurple"
+#define DYE_AQUA "aqua"
+#define DYE_BROWN "brown"
+#define DYE_LIGHTBROWN "lightbrown"
+#define DYE_DARKRED "darkred"
#define DYE_LIGHTRED "lightred"
+#define DYE_LIGHTGREEN "lightgreen"
+#define DYE_YELLOWGREEN "yellowgreen"
+#define DYE_LIGHTPURPLE "lightpurple"
+#define DYE_PINK "pink"
+#define DYE_GREY "grey"
#define DYE_RAINBOW "rainbow"
#define DYE_MIME "mime"
#define DYE_COSMIC "cosmic"
diff --git a/code/__HELPERS/iconprocs.dm b/code/__HELPERS/iconprocs.dm
index 92bff1512b4..425c5bb2549 100644
--- a/code/__HELPERS/iconprocs.dm
+++ b/code/__HELPERS/iconprocs.dm
@@ -547,3 +547,10 @@ GLOBAL_LIST_EMPTY(bicon_cache)
"x" = icon_width > world.icon_size && pixel_x != 0 ? (icon_width - world.icon_size) * 0.5 : 0,
"y" = icon_height > world.icon_size && pixel_y != 0 ? (icon_height - world.icon_size) * 0.5 : 0,
)
+
+/// Swaps an entire palette, for convenience, given two same-length lists of rgb or rgba colors
+/icon/proc/swap_palette(list/old_colors, list/new_colors)
+ if(length(old_colors) != length(new_colors))
+ return FALSE
+ for(var/index in 1 to length(old_colors))
+ SwapColor(old_colors[index], new_colors[index])
diff --git a/code/_globalvars/lists/dye_registry.dm b/code/_globalvars/lists/dye_registry.dm
index fabac01927f..1fb3d867460 100644
--- a/code/_globalvars/lists/dye_registry.dm
+++ b/code/_globalvars/lists/dye_registry.dm
@@ -321,3 +321,72 @@ GLOBAL_LIST_INIT(dye_registry, list(
DYE_NTREP = /obj/item/clothing/head/helmet/space/syndicate/blue,
),
))
+
+// Palettes for clothing
+#define PALETTE_JS_RED list("#4d0d1d", "#7e111e", "#ab312c", "#cb4836")
+#define PALETTE_JS_ORANGE list("#651d22", "#9d3720", "#c05425", "#d67a2f")
+#define PALETTE_JS_YELLOW list("#733b22", "#9d6025", "#c48c1a", "#d9b114")
+#define PALETTE_JS_GREEN list("#112624", "#1c492c", "#2a7330", "#3d9339")
+#define PALETTE_JS_BLUE list("#0d1a4d", "#0c3473", "#0e56af", "#2771cb")
+#define PALETTE_JS_PURPLE list("#2f0f54", "#571485", "#7f2ea8", "#a043bf")
+#define PALETTE_JS_BLACK list("#151414", "#212022", "#2f2e31", "#424144")
+#define PALETTE_JS_WHITE list("#6f6f75", "#9da3a3", "#caccca", "#f0efed")
+#define PALETTE_JS_DARKBLUE list("#131426", "#1c2649", "#203d65", "#28527a")
+#define PALETTE_JS_LIGHTBLUE list("#355780", "#477eb3", "#5fa4cc", "#85c1e6")
+#define PALETTE_JS_AQUA list("#285081", "#2d7b9d", "#3badb6", "#5ad2ca")
+#define PALETTE_JS_BROWN list("#270806", "#44150e", "#632f18", "#7b4323")
+#define PALETTE_JS_LIGHTBROWN list("#814537", "#a86141", "#cb8857", "#dca26a")
+#define PALETTE_JS_DARKRED list("#2a0611", "#50091a", "#77161c", "#962525")
+#define PALETTE_JS_LIGHTRED list("#853236", "#bd4b4b", "#d9755f", "#ea9275")
+#define PALETTE_JS_LIGHTGREEN list("#356241", "#429349", "#66bd5c", "#8dd97e")
+#define PALETTE_JS_YELLOWGREEN list("#776934", "#938d45", "#acbd57", "#bddc6e")
+#define PALETTE_JS_LIGHTPURPLE list("#564788", "#7e5ac4", "#af77e0", "#ce91ee")
+#define PALETTE_JS_PINK list("#853d5b", "#bd5379", "#e07791", "#ee919c")
+#define PALETTE_JS_GREY list("#3b363d", "#62626e", "#7e8789", "#9dabab")
+
+GLOBAL_LIST_INIT(palette_registry, list(
+ DYE_REGISTRY_UNDER = list(
+ DYE_RED = PALETTE_JS_RED,
+ DYE_ORANGE = PALETTE_JS_ORANGE,
+ DYE_YELLOW = PALETTE_JS_YELLOW,
+ DYE_GREEN = PALETTE_JS_GREEN,
+ DYE_BLUE = PALETTE_JS_BLUE,
+ DYE_PURPLE = PALETTE_JS_PURPLE,
+ DYE_BLACK = PALETTE_JS_BLACK,
+ DYE_WHITE = PALETTE_JS_WHITE,
+ DYE_DARKBLUE = PALETTE_JS_DARKBLUE,
+ DYE_LIGHTBLUE = PALETTE_JS_LIGHTBLUE,
+ DYE_AQUA = PALETTE_JS_AQUA,
+ DYE_BROWN = PALETTE_JS_BROWN,
+ DYE_LIGHTBROWN = PALETTE_JS_LIGHTBROWN,
+ DYE_DARKRED = PALETTE_JS_DARKRED,
+ DYE_LIGHTRED = PALETTE_JS_LIGHTRED,
+ DYE_LIGHTGREEN = PALETTE_JS_LIGHTGREEN,
+ DYE_YELLOWGREEN = PALETTE_JS_YELLOWGREEN,
+ DYE_LIGHTPURPLE = PALETTE_JS_LIGHTPURPLE,
+ DYE_PINK = PALETTE_JS_PINK,
+ DYE_GREY = PALETTE_JS_GREY,
+ ),
+ DYE_REGISTRY_JUMPSKIRT = list(
+ DYE_RED = PALETTE_JS_RED,
+ DYE_ORANGE = PALETTE_JS_ORANGE,
+ DYE_YELLOW = PALETTE_JS_YELLOW,
+ DYE_GREEN = PALETTE_JS_GREEN,
+ DYE_BLUE = PALETTE_JS_BLUE,
+ DYE_PURPLE = PALETTE_JS_PURPLE,
+ DYE_BLACK = PALETTE_JS_BLACK,
+ DYE_WHITE = PALETTE_JS_WHITE,
+ DYE_DARKBLUE = PALETTE_JS_DARKBLUE,
+ DYE_LIGHTBLUE = PALETTE_JS_LIGHTBLUE,
+ DYE_AQUA = PALETTE_JS_AQUA,
+ DYE_BROWN = PALETTE_JS_BROWN,
+ DYE_LIGHTBROWN = PALETTE_JS_LIGHTBROWN,
+ DYE_DARKRED = PALETTE_JS_DARKRED,
+ DYE_LIGHTRED = PALETTE_JS_LIGHTRED,
+ DYE_LIGHTGREEN = PALETTE_JS_LIGHTGREEN,
+ DYE_YELLOWGREEN = PALETTE_JS_YELLOWGREEN,
+ DYE_LIGHTPURPLE = PALETTE_JS_LIGHTPURPLE,
+ DYE_PINK = PALETTE_JS_PINK,
+ DYE_GREY = PALETTE_JS_GREY,
+ ),
+))
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index 8cab647ec6a..b7f330bc030 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -579,7 +579,8 @@ GLOBAL_VAR_INIT(record_id_num, 1001)
clothes_s = new /icon('icons/mob/clothing/under/centcom.dmi', "officer_s")
clothes_s.Blend(new /icon('icons/mob/clothing/feet.dmi', "laceups"), ICON_UNDERLAY)
else
- clothes_s = new /icon('icons/mob/clothing/under/color.dmi', "grey_s")
+ clothes_s = new /icon('icons/mob/clothing/under/color.dmi', "color_s")
+ clothes_s.swap_palette(PALETTE_JS_WHITE, PALETTE_JS_GREY)
clothes_s.Blend(new /icon('icons/mob/clothing/feet.dmi', "black"), ICON_UNDERLAY)
preview_icon.Blend(face_s, ICON_OVERLAY) // Why do we do this twice
diff --git a/code/game/objects/items/dyeing.dm b/code/game/objects/items/dyeing.dm
index 101e4d0f8e2..ad26adaef10 100644
--- a/code/game/objects/items/dyeing.dm
+++ b/code/game/objects/items/dyeing.dm
@@ -30,7 +30,6 @@
worn_icon_state = initial(target_obj.worn_icon_state)
inhand_icon_state = initial(target_obj.inhand_icon_state)
sprite_sheets = target_obj.sprite_sheets
- desc = target_obj.desc
base_icon_state = target_obj.base_icon_state
// update inhand sprites
@@ -41,11 +40,41 @@
// update the name/description
name = initial(target_obj.name)
- desc += "\nThe colors look a little dodgy."
+ desc = target_obj.desc + "\nThe colors look a little dodgy."
qdel(target_obj)
+
update_appearance(ALL)
return target_type
+/// Because of jumpsuit palettes, we have to do some extra icon shenanigans.
+/obj/item/clothing/under/dye_item(dye_color, dye_key_override)
+ if(!dyeable || !dye_color)
+ return
+ var/dye_key_selector = dye_key_override ? dye_key_override : dyeing_key
+ var/obj/item/clothing/under/target_type = GLOB.dye_registry[dye_key_selector][dye_color]
+
+ // If we're dying it to a colored jumpsuit...
+ if(target_type in typesof(/obj/item/clothing/under/color))
+ var/obj/item/clothing/under/color/target_obj = new target_type(null)
+ set_icon_from_cache(palette_key = target_obj.icon_palette_key, dye_key = target_obj.dyeing_key)
+ // update the name/description
+ name = initial(target_obj.name)
+ desc = target_obj.desc + "\nThe colors look a little dodgy."
+ qdel(target_obj)
+
+ // If it also started as a colored jumpsuit, change the palette key
+ if("icon_palette_key" in vars)
+ var/obj/item/clothing/under/color/dyed_item = src
+ dyed_item.icon_palette_key = dye_color
+ return
+
+ // If we're not, but it started as a colored jumpsuit, unset the palette key so icon updates don't mess it up
+ else if("icon_palette_key" in vars)
+ var/obj/item/clothing/under/color/dyed_item = src
+ dyed_item.icon_palette_key = null
+
+ return ..()
+
/// Beanies use the color var for their appearance, we don't normally copy this over but we have to for beanies
/obj/item/clothing/head/beanie/dye_item(dye_color, dye_key_override)
. = ..()
diff --git a/code/modules/asset_cache/assets/asset_clothing_icons.dm b/code/modules/asset_cache/assets/asset_clothing_icons.dm
new file mode 100644
index 00000000000..f15d4b52a87
--- /dev/null
+++ b/code/modules/asset_cache/assets/asset_clothing_icons.dm
@@ -0,0 +1,58 @@
+/datum/asset/icon_cache/clothing
+ var/list/sprite_sheets = list()
+
+/datum/asset/icon_cache/clothing/New()
+ . = ..()
+ for(var/each_subtype in subtypesof(/obj/item/clothing/under/color))
+ var/obj/item/clothing/under/color/jumpsuit_type = each_subtype
+ // If it doesn't have a palette key, the icon already exists and we don't need to generate it again.
+ // UNLESS it's the psychedelic jumpsuits.
+ var/is_psychedelic = jumpsuit_type::icon_state == "psyche" || jumpsuit_type::icon_state == "psycheskirt"
+ if(!jumpsuit_type::icon_palette_key && !is_psychedelic)
+ continue
+
+ var/palette_keys = is_psychedelic ? list(DYE_DARKBLUE, DYE_RED, DYE_BLACK, DYE_YELLOW, DYE_AQUA, DYE_PURPLE, DYE_LIGHTGREEN, DYE_PINK) : list(jumpsuit_type::icon_palette_key)
+ var/registry_key = ispath(jumpsuit_type, /obj/item/clothing/under/color/jumpskirt) ? DYE_REGISTRY_JUMPSKIRT : DYE_REGISTRY_UNDER
+ var/list/all_sheets = list(
+ "Vox" = 'icons/mob/clothing/species/vox/under/color.dmi',
+ "Skkulakin" = 'icons/mob/clothing/species/skkulakin/under/color.dmi',
+ "Drask" = 'icons/mob/clothing/species/drask/under/color.dmi',
+ "Grey" = 'icons/mob/clothing/species/grey/under/color.dmi',
+ "Kidan" = 'icons/mob/clothing/species/kidan/under/color.dmi',
+ "Human" = jumpsuit_type::worn_icon,
+ "Obj" = jumpsuit_type::icon,
+ "Lefthand" = jumpsuit_type::lefthand_file,
+ "Righthand" = jumpsuit_type::righthand_file)
+ var/list/state_names = list(jumpsuit_type::icon_state,
+ "[jumpsuit_type::worn_icon_state || jumpsuit_type::icon_state]_s",
+ "[jumpsuit_type::worn_icon_state || jumpsuit_type::icon_state]_d_s",
+ jumpsuit_type::inhand_icon_state,)
+ // For every sprite sheet...
+ for(var/sheet_key in all_sheets)
+ var/filepath = all_sheets[sheet_key]
+ var/icon/jumpsuit = new(filepath)
+ var/icon/new_suit = new()
+
+ // If each icon state exists in the file...
+ for(var/white_state in state_names)
+ if(!white_state)
+ continue
+ if(!(white_state in jumpsuit.IconStates()))
+ continue
+
+ // For every frame of color we need to dye it...
+ for(var/frame_num in 1 to length(palette_keys))
+ // Dye it the color we want.
+ var/icon/colored_icon = new(filepath, white_state)
+ colored_icon.swap_palette(
+ GLOB.palette_registry[registry_key][jumpsuit_type::default_palette_key],
+ GLOB.palette_registry[registry_key][palette_keys[frame_num]]
+ )
+ new_suit.Insert(colored_icon, white_state, frame = frame_num, delay = 1)
+
+ // Set the new sprite we just made to the one this jumpsuit uses.
+ all_sheets[sheet_key] = new_suit
+ var/suit_key = is_psychedelic ? jumpsuit_type::icon_state : jumpsuit_type::icon_palette_key
+ if(!sprite_sheets[registry_key])
+ sprite_sheets[registry_key] = list()
+ sprite_sheets[registry_key][suit_key] = all_sheets
diff --git a/code/modules/client/preference/character.dm b/code/modules/client/preference/character.dm
index 79d1b0584ac..7b9e91b149e 100644
--- a/code/modules/client/preference/character.dm
+++ b/code/modules/client/preference/character.dm
@@ -1062,7 +1062,8 @@
var/has_gloves = FALSE
if(job_support_low & JOB_ASSISTANT) //This gives the preview icon clothes depending on which job(if any) is set to 'high'
- clothes_s = new /icon('icons/mob/clothing/under/color.dmi', "grey_s")
+ clothes_s = new /icon('icons/mob/clothing/under/color.dmi', "color_s")
+ clothes_s.swap_palette(PALETTE_JS_WHITE, PALETTE_JS_GREY)
clothes_s.Blend(new /icon('icons/mob/clothing/feet.dmi', "black"), ICON_UNDERLAY)
if(backbag == 2)
clothes_s.Blend(new /icon('icons/mob/clothing/back.dmi', "backpack"), ICON_OVERLAY)
diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm
index ff8e9350f02..d78739dfbf7 100644
--- a/code/modules/clothing/chameleon.dm
+++ b/code/modules/clothing/chameleon.dm
@@ -185,6 +185,7 @@
target.name = initial(picked_item.name)
target.desc = initial(picked_item.desc)
target.icon_state = initial(picked_item.icon_state)
+ target.icon = initial(picked_item.icon)
if(isitem(target))
var/obj/item/I = target
@@ -202,14 +203,20 @@
else
I.sprite_sheets = null
- if(isclothing(I) && isclothing(picked_item))
+ if(isclothing(I) && ispath(picked_item, /obj/item/clothing))
var/obj/item/clothing/CL = I
var/obj/item/clothing/PCL = picked_item
CL.flags_cover = initial(PCL.flags_cover)
+ if(istype(I, /obj/item/clothing/under) && ispath(picked_item, /obj/item/clothing/under/color))
+ var/obj/item/clothing/under/color/colored_jumpsuit = picked_item
+ if(colored_jumpsuit.icon_palette_key)
+ var/obj/item/clothing/under/target_jumpsuit = I
+ target_jumpsuit.set_icon_from_cache(palette_key = colored_jumpsuit::icon_palette_key, dye_key = colored_jumpsuit::dyeing_key)
+ else if(ispath(colored_jumpsuit, /obj/item/clothing/under/color/psyche) || ispath(colored_jumpsuit, /obj/item/clothing/under/color/jumpskirt/psyche))
+ var/obj/item/clothing/under/target_jumpsuit = I
+ target_jumpsuit.set_icon_from_cache(palette_key = colored_jumpsuit::icon_state, dye_key = colored_jumpsuit::dyeing_key)
I.update_appearance()
- target.icon = initial(picked_item.icon)
-
/datum/action/item_action/chameleon_change/Trigger(left_click)
if(!IsAvailable())
return
@@ -232,12 +239,12 @@
random_look(owner)
/obj/item/clothing/under/chameleon
- name = "black jumpsuit"
+ name = "white jumpsuit"
desc = "It's a plain jumpsuit. It has a small dial on the wrist."
icon = 'icons/obj/clothing/under/color.dmi'
- icon_state = "black"
+ icon_state = "color"
worn_icon = 'icons/mob/clothing/under/color.dmi'
- inhand_icon_state = "bl_suit"
+ inhand_icon_state = "color_suit"
random_sensor = FALSE
resistance_flags = NONE
armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 50, ACID = 50)
@@ -260,6 +267,9 @@
/obj/item/clothing/under/dress,
/obj/item/clothing/under/pants,
/obj/item/clothing/under/color,
+ /obj/item/clothing/under/color/random,
+ /obj/item/clothing/under/color/jumpskirt,
+ /obj/item/clothing/under/color/jumpskirt/random,
/obj/item/clothing/under/retro,
/obj/item/clothing/under/solgov,
/obj/item/clothing/under/suit,
diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm
index 47562b3d507..fefcc2561c8 100644
--- a/code/modules/clothing/under/color.dm
+++ b/code/modules/clothing/under/color.dm
@@ -2,7 +2,11 @@
desc = "A standard issue colored jumpsuit. Variety is the spice of life!"
icon = 'icons/obj/clothing/under/color.dmi'
worn_icon = 'icons/mob/clothing/under/color.dmi'
+ icon_state = "color"
+ inhand_icon_state = "color_suit"
dyeable = TRUE
+ var/default_palette_key = DYE_WHITE
+ var/icon_palette_key = null
sprite_sheets = list(
"Vox" = 'icons/mob/clothing/species/vox/under/color.dmi',
"Skkulakin" = 'icons/mob/clothing/species/skkulakin/under/color.dmi',
@@ -14,10 +18,43 @@
/obj/item/clothing/under/color/jumpskirt
desc = "A standard issue colored jumpskirt. Variety is the spice of life!"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ icon_state = "colorskirt"
dyeing_key = DYE_REGISTRY_JUMPSKIRT
-/obj/item/clothing/under/color/random/Initialize(mapload)
+/obj/item/clothing/under/color/Initialize(mapload)
. = ..()
+ update_icon()
+
+/obj/item/clothing/under/color/update_icon()
+ . = ..()
+ set_icon_from_cache()
+
+/obj/item/clothing/under/proc/set_icon_from_cache(palette_key = null, dye_key = null)
+ if(!palette_key && ("icon_palette_key" in vars))
+ var/obj/item/clothing/under/color/colored_jumpsuit = src
+ palette_key = palette_key || colored_jumpsuit.icon_palette_key
+ if(!palette_key)
+ return FALSE
+ dye_key = dye_key || dyeing_key
+ if(!GLOB.palette_registry[dye_key])
+ stack_trace("Item just tried to be colored with an invalid registry key: [dye_key]")
+ var/datum/asset/icon_cache/clothing/icon_cache = get_asset_datum(/datum/asset/icon_cache/clothing/)
+
+ // Set icons
+ for(var/sheet_key in sprite_sheets)
+ sprite_sheets[sheet_key] = icon_cache.sprite_sheets[dye_key][palette_key][sheet_key]
+ icon = icon_cache.sprite_sheets[dye_key][palette_key]["Obj"]
+ worn_icon = icon_cache.sprite_sheets[dye_key][palette_key]["Human"]
+ lefthand_file = icon_cache.sprite_sheets[dye_key][palette_key]["Lefthand"]
+ righthand_file = icon_cache.sprite_sheets[dye_key][palette_key]["Righthand"]
+
+ // Set icon states
+ var/icon_state_prefix = findtext(palette_key, "psyche") ? "psyche" : "color"
+ var/icon_state_skirt = dye_key == "under" ? "" : "skirt"
+ icon_state = "[icon_state_prefix][icon_state_skirt]"
+ inhand_icon_state = "[icon_state_prefix]_suit"
+
+/obj/item/clothing/under/color/random/Initialize(mapload)
var/list/excluded = list(/obj/item/clothing/under/color/random,
/obj/item/clothing/under/color/blue/dodgeball,
/obj/item/clothing/under/color/orange/prison,
@@ -28,48 +65,57 @@
var/obj/item/clothing/under/color/C = pick(subtypesof(/obj/item/clothing/under/color) - typesof(/obj/item/clothing/under/color/jumpskirt) - excluded)
name = initial(C.name)
icon_state = initial(C.icon_state)
+ icon_palette_key = initial(C.icon_palette_key)
inhand_icon_state = initial(C.inhand_icon_state)
+ . = ..()
+ if(C == /obj/item/clothing/under/color/psyche)
+ set_icon_from_cache(palette_key = "psyche")
+
+/obj/item/clothing/under/color/jumpskirt/random/Initialize(mapload)
+ var/list/excluded = list(/obj/item/clothing/under/color/jumpskirt/random,
+ /obj/item/clothing/under/color/jumpskirt/orange/prison,)
+ var/obj/item/clothing/under/color/C = pick(subtypesof(/obj/item/clothing/under/color/jumpskirt) - excluded)
+ name = initial(C.name)
+ icon_state = initial(C.icon_state)
+ icon_palette_key = initial(C.icon_palette_key)
+ inhand_icon_state = initial(C.inhand_icon_state)
+ . = ..()
+ if(C == /obj/item/clothing/under/color/jumpskirt/psyche)
+ set_icon_from_cache(palette_key = "psycheskirt")
/obj/item/clothing/under/color/black
name = "black jumpsuit"
- icon_state = "black"
- inhand_icon_state = "bl_suit"
+ icon_palette_key = DYE_BLACK
resistance_flags = NONE
/obj/item/clothing/under/color/jumpskirt/black
name = "black jumpskirt"
- icon_state = "blackskirt"
- inhand_icon_state = "bl_suit"
+ icon_palette_key = DYE_BLACK
resistance_flags = NONE // I am going to assume this is here for a reason
/obj/item/clothing/under/color/blue
name = "blue jumpsuit"
- icon_state = "blue"
- inhand_icon_state = "b_suit"
+ icon_palette_key = DYE_BLUE
/obj/item/clothing/under/color/jumpskirt/blue
name = "blue jumpskirt"
- icon_state = "blueskirt"
- inhand_icon_state = "b_suit"
+ icon_palette_key = DYE_BLUE
/obj/item/clothing/under/color/blue/dodgeball
flags = NODROP
/obj/item/clothing/under/color/green
name = "green jumpsuit"
- icon_state = "green"
- inhand_icon_state = "g_suit"
+ icon_palette_key = DYE_GREEN
/obj/item/clothing/under/color/jumpskirt/green
name = "green jumpskirt"
- icon_state = "greenskirt"
- inhand_icon_state = "g_suit"
+ icon_palette_key = DYE_GREEN
/obj/item/clothing/under/color/grey
name = "grey jumpsuit"
desc = "A tasteful grey jumpsuit that reminds you of the good old days."
- icon_state = "grey"
- inhand_icon_state = "gy_suit"
+ icon_palette_key = DYE_GREY
/obj/item/clothing/under/color/grey/greytide
flags = NODROP
@@ -77,29 +123,28 @@
/obj/item/clothing/under/color/jumpskirt/grey
name = "grey jumpskirt"
desc = "A tasteful grey jumpskirt that reminds you of the good old days."
- icon_state = "greyskirt"
- inhand_icon_state = "gy_suit"
+ icon_palette_key = DYE_GREY
/obj/item/clothing/under/color/grey/glorf
name = "ancient jumpsuit"
desc = "A terribly ragged and frayed grey jumpsuit. It looks like it hasn't been washed in over a decade."
icon_state = "ancient"
+ icon_palette_key = null
/obj/item/clothing/under/color/orange
name = "orange jumpsuit"
desc = "Don't wear this near paranoid security officers."
- icon_state = "orange"
- inhand_icon_state = "o_suit"
+ icon_palette_key = DYE_ORANGE
/obj/item/clothing/under/color/jumpskirt/orange
name = "orange jumpskirt"
desc = "Don't wear this near paranoid security officers."
- icon_state = "orangeskirt"
- inhand_icon_state = "o_suit"
+ icon_palette_key = DYE_ORANGE
/obj/item/clothing/under/color/orange/prison
desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position."
icon_state = "prisoner"
+ icon_palette_key = null
inhand_icon_state = "prisoner"
has_sensor = 2
sensor_mode = SENSOR_COORDS
@@ -107,6 +152,7 @@
/obj/item/clothing/under/color/jumpskirt/orange/prison
desc = "It's standardised Nanotrasen prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position."
icon_state = "prisonerskirt"
+ icon_palette_key = null
inhand_icon_state = "prisoner"
has_sensor = 2
sensor_mode = SENSOR_COORDS
@@ -114,74 +160,81 @@
/obj/item/clothing/under/color/pink
name = "pink jumpsuit"
desc = "Just looking at this makes you feel fabulous."
- icon_state = "pink"
- inhand_icon_state = "p_suit"
+ icon_palette_key = DYE_PINK
/obj/item/clothing/under/color/jumpskirt/pink
name = "pink jumpskirt"
desc = "Just looking at this makes you feel fabulous."
- icon_state = "pinkskirt"
- inhand_icon_state = "p_suit"
+ icon_palette_key = DYE_PINK
/obj/item/clothing/under/color/red
name = "red jumpsuit"
- icon_state = "red"
- inhand_icon_state = "r_suit"
+ icon_palette_key = DYE_RED
/obj/item/clothing/under/color/jumpskirt/red
name = "red jumpskirt"
- icon_state = "redskirt"
- inhand_icon_state = "r_suit"
+ icon_palette_key = DYE_RED
/obj/item/clothing/under/color/red/dodgeball
flags = NODROP
/obj/item/clothing/under/color/white
name = "white jumpsuit"
- icon_state = "white"
+ icon_palette_key = DYE_WHITE
/obj/item/clothing/under/color/jumpskirt/white
name = "white jumpskirt"
- icon_state = "whiteskirt"
+ icon_palette_key = DYE_WHITE
/obj/item/clothing/under/color/yellow
name = "yellow jumpsuit"
- icon_state = "yellow"
+ icon_palette_key = DYE_YELLOW
/obj/item/clothing/under/color/jumpskirt/yellow
name = "yellow jumpskirt"
- icon_state = "yellowskirt"
+ icon_palette_key = DYE_YELLOW
/obj/item/clothing/under/color/psyche
name = "psychedelic jumpsuit"
desc = "Groovy!"
icon_state = "psyche"
+ inhand_icon_state = "psyche_suit"
+
+/obj/item/clothing/under/color/psyche/set_icon_from_cache(palette_key = "psyche", dye_key = null)
+ return ..()
+
+/obj/item/clothing/under/color/jumpskirt/psyche
+ name = "psychedelic jumpskirt"
+ desc = "Far out!"
+ icon_state = "psycheskirt"
+ inhand_icon_state = "psyche_suit"
+
+/obj/item/clothing/under/color/jumpskirt/psyche/set_icon_from_cache(palette_key = "psycheskirt", dye_key = null)
+ return ..()
/obj/item/clothing/under/color/lightblue
name = "light blue jumpsuit"
- icon_state = "lightblue"
+ icon_palette_key = DYE_LIGHTBLUE
/obj/item/clothing/under/color/jumpskirt/lightblue
name = "light blue jumpskirt"
- icon_state = "lightblueskirt"
+ icon_palette_key = DYE_LIGHTBLUE
/obj/item/clothing/under/color/aqua
name = "aqua jumpsuit"
- icon_state = "aqua"
+ icon_palette_key = DYE_AQUA
/obj/item/clothing/under/color/jumpskirt/aqua
name = "aqua jumpskirt"
- icon_state = "aquaskirt"
+ icon_palette_key = DYE_AQUA
/obj/item/clothing/under/color/purple
name = "purple jumpsuit"
- icon_state = "purple"
- inhand_icon_state = "p_suit"
+ icon_palette_key = DYE_PURPLE
/obj/item/clothing/under/color/jumpskirt/purple
name = "purple jumpskirt"
- icon_state = "purpleskirt"
- inhand_icon_state = "p_suit"
+ icon_palette_key = DYE_PURPLE
/// for jani ert
/obj/item/clothing/under/color/purple/sensor
@@ -190,71 +243,71 @@
/obj/item/clothing/under/color/lightpurple
name = "light purple jumpsuit"
- icon_state = "lightpurple"
+ icon_palette_key = DYE_LIGHTPURPLE
/obj/item/clothing/under/color/jumpskirt/lightpurple
name = "light purple jumpskirt"
- icon_state = "lightpurpleskirt"
+ icon_palette_key = DYE_LIGHTPURPLE
/obj/item/clothing/under/color/lightgreen
name = "light green jumpsuit"
- icon_state = "lightgreen"
+ icon_palette_key = DYE_LIGHTGREEN
/obj/item/clothing/under/color/jumpskirt/lightgreen
name = "light green jumpskirt"
- icon_state = "lightgreenskirt"
+ icon_palette_key = DYE_LIGHTGREEN
/obj/item/clothing/under/color/lightbrown
name = "light brown jumpsuit"
- icon_state = "lightbrown"
+ icon_palette_key = DYE_LIGHTBROWN
/obj/item/clothing/under/color/jumpskirt/lightbrown
name = "light brown jumpskirt"
- icon_state = "lightbrownskirt"
+ icon_palette_key = DYE_LIGHTBROWN
/obj/item/clothing/under/color/brown
name = "brown jumpsuit"
- icon_state = "brown"
+ icon_palette_key = DYE_BROWN
/obj/item/clothing/under/color/jumpskirt/brown
name = "brown jumpskirt"
- icon_state = "brownskirt"
+ icon_palette_key = DYE_BROWN
/obj/item/clothing/under/color/yellowgreen
name = "yellow green jumpsuit"
- icon_state = "yellowgreen"
+ icon_palette_key = DYE_YELLOWGREEN
/obj/item/clothing/under/color/jumpskirt/yellowgreen
name = "yellow green jumpskirt"
- icon_state = "yellowgreenskirt"
+ icon_palette_key = DYE_YELLOWGREEN
/obj/item/clothing/under/color/darkblue
name = "dark blue jumpsuit"
- icon_state = "darkblue"
+ icon_palette_key = DYE_DARKBLUE
/obj/item/clothing/under/color/jumpskirt/darkblue
name = "dark blue jumpskirt"
- icon_state = "darkblueskirt"
+ icon_palette_key = DYE_DARKBLUE
/obj/item/clothing/under/color/lightred
name = "light red jumpsuit"
- icon_state = "lightred"
+ icon_palette_key = DYE_LIGHTRED
/obj/item/clothing/under/color/jumpskirt/lightred
name = "light red jumpskirt"
- icon_state = "lightredskirt"
+ icon_palette_key = DYE_LIGHTRED
/obj/item/clothing/under/color/darkred
name = "dark red jumpsuit"
- icon_state = "darkred"
+ icon_palette_key = DYE_DARKRED
/obj/item/clothing/under/color/jumpskirt/darkred
name = "dark red jumpskirt"
- icon_state = "darkredskirt"
+ icon_palette_key = DYE_DARKRED
/obj/item/clothing/under/color/rainbow
name = "rainbow jumpsuit"
- desc = "rainbow."
+ desc = "Rainbow."
icon_state = "rainbow"
inhand_icon_state = "rainbow"
@@ -268,8 +321,10 @@
name = "red team jersey"
desc = "The jersey of the Nanotrasen Phi-ghters!"
icon_state = "redjersey"
+ icon_palette_key = null
/obj/item/clothing/under/color/blue/jersey
name = "blue team jersey"
desc = "The jersey of the Nanotrasen Pi-rates!"
icon_state = "bluejersey"
+ icon_palette_key = null
diff --git a/icons/mob/clothing/species/drask/under/color.dmi b/icons/mob/clothing/species/drask/under/color.dmi
index c91b1131eae..3db33434977 100644
Binary files a/icons/mob/clothing/species/drask/under/color.dmi and b/icons/mob/clothing/species/drask/under/color.dmi differ
diff --git a/icons/mob/clothing/species/grey/under/color.dmi b/icons/mob/clothing/species/grey/under/color.dmi
index e286752d659..ce71e565bce 100644
Binary files a/icons/mob/clothing/species/grey/under/color.dmi and b/icons/mob/clothing/species/grey/under/color.dmi differ
diff --git a/icons/mob/clothing/species/kidan/under/color.dmi b/icons/mob/clothing/species/kidan/under/color.dmi
index b9548a7d3d9..874f3e31c56 100644
Binary files a/icons/mob/clothing/species/kidan/under/color.dmi and b/icons/mob/clothing/species/kidan/under/color.dmi differ
diff --git a/icons/mob/clothing/species/skkulakin/under/color.dmi b/icons/mob/clothing/species/skkulakin/under/color.dmi
index 82303ac4d40..d91cb7ead87 100644
Binary files a/icons/mob/clothing/species/skkulakin/under/color.dmi and b/icons/mob/clothing/species/skkulakin/under/color.dmi differ
diff --git a/icons/mob/clothing/species/vox/under/color.dmi b/icons/mob/clothing/species/vox/under/color.dmi
index 82303ac4d40..d91cb7ead87 100644
Binary files a/icons/mob/clothing/species/vox/under/color.dmi and b/icons/mob/clothing/species/vox/under/color.dmi differ
diff --git a/icons/mob/clothing/under/color.dmi b/icons/mob/clothing/under/color.dmi
index 633488f11cc..3b63ea4e608 100644
Binary files a/icons/mob/clothing/under/color.dmi and b/icons/mob/clothing/under/color.dmi differ
diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi
index 9f4e737b4ac..b09cb0d0e43 100644
Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ
diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi
index a750ecb680b..4ff4dd33981 100644
Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ
diff --git a/icons/obj/clothing/under/color.dmi b/icons/obj/clothing/under/color.dmi
index 1da385bf096..6f1744540f4 100644
Binary files a/icons/obj/clothing/under/color.dmi and b/icons/obj/clothing/under/color.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 7e5c9c81ef5..c25aa0d4103 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1930,6 +1930,7 @@
#include "code\modules\asset_cache\assets\asset_chess.dm"
#include "code\modules\asset_cache\assets\asset_claw_game.dm"
#include "code\modules\asset_cache\assets\asset_cloning.dm"
+#include "code\modules\asset_cache\assets\asset_clothing_icons.dm"
#include "code\modules\asset_cache\assets\asset_common.dm"
#include "code\modules\asset_cache\assets\asset_emoji.dm"
#include "code\modules\asset_cache\assets\asset_icon_ref_map.dm"