From 7f4171fd4d1a9bf819d1365e82bbfa8e0773edcb Mon Sep 17 00:00:00 2001
From: Bloop <13398309+vinylspiders@users.noreply.github.com>
Date: Tue, 30 Jun 2026 16:02:53 -0400
Subject: [PATCH] Adds bodyshape arg to a lot of missing spots, generalizes
'wear_digi_version', adds female gender shaping to digi sprites (#96633)
## About The Pull Request
Adds female gender shaping to digi species (such as lizards), for the
top half only.
Shown here
Also just adds a bunch of bodyshape args now that we are passing that to
the clothing rendering. This will help with anything where you want
unique digi handling for any specific items. Also fixes some missing
args and even improper args in some of these proc overrides.
## Why It's Good For The Game
Makes things more convenient for coders. Adds some more customization
options for feminine lizardfolk.
## Changelog
:cl:
code: bodyshape is now accessible in build_worn_overlays() and similar
procs.
image: lizards now have support female gender shaping for their suits
/:cl:
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
---
code/__DEFINES/dcs/signals/signals_object.dm | 2 +-
code/datums/components/clothing_dirt.dm | 2 +-
code/datums/components/hat_stabilizer.dm | 8 +--
.../components/toggle_attached_clothing.dm | 2 +-
code/datums/sprite_accessories/clothing.dm | 5 +-
code/game/objects/items.dm | 2 +
.../objects/items/stacks/tiles/tile_types.dm | 4 +-
code/game/objects/items/tanks/watertank.dm | 2 +-
.../objects/items/weaponry/melee/spear.dm | 2 +-
code/game/objects/items/wind_turbine.dm | 2 +-
code/game/objects/structures/bedsheet_bin.dm | 2 +-
.../heretic/items/heretic_armor.dm | 2 +-
code/modules/clothing/clothing.dm | 2 +-
code/modules/clothing/gloves/_gloves.dm | 6 +-
code/modules/clothing/head/_head.dm | 6 +-
code/modules/clothing/head/cone.dm | 2 +-
code/modules/clothing/head/hardhat.dm | 6 +-
code/modules/clothing/head/helmet.dm | 2 +-
code/modules/clothing/head/wig.dm | 2 +-
code/modules/clothing/masks/_masks.dm | 6 +-
code/modules/clothing/masks/gasmask.dm | 4 +-
code/modules/clothing/neck/_neck.dm | 8 +--
code/modules/clothing/shoes/_shoes.dm | 6 +-
code/modules/clothing/shoes/boots.dm | 6 ++
code/modules/clothing/shoes/costume.dm | 2 +-
code/modules/clothing/shoes/sneakers.dm | 2 +
code/modules/clothing/spacesuits/plasmamen.dm | 4 +-
code/modules/clothing/suits/_suits.dm | 6 +-
code/modules/clothing/suits/armor.dm | 4 +-
code/modules/clothing/suits/costume.dm | 4 ++
code/modules/clothing/suits/ethereal.dm | 2 +-
code/modules/clothing/suits/ghostsheet.dm | 2 +-
code/modules/clothing/suits/jobs.dm | 4 +-
code/modules/clothing/suits/lasertag.dm | 3 +-
code/modules/clothing/suits/moth.dm | 1 +
code/modules/clothing/suits/utility.dm | 2 +-
code/modules/clothing/suits/wintercoats.dm | 6 +-
code/modules/clothing/under/_under.dm | 7 +-
code/modules/clothing/under/color.dm | 1 +
code/modules/clothing/under/costume.dm | 7 ++
code/modules/clothing/under/ethereal.dm | 2 +-
code/modules/clothing/under/jobs/cargo.dm | 3 +
code/modules/clothing/under/jobs/centcom.dm | 2 +
.../clothing/under/jobs/civilian/civilian.dm | 12 ++++
.../under/jobs/civilian/clown_mime.dm | 2 +
code/modules/clothing/under/jobs/command.dm | 1 +
.../clothing/under/jobs/engineering.dm | 4 ++
code/modules/clothing/under/jobs/medical.dm | 7 ++
code/modules/clothing/under/jobs/rnd.dm | 6 ++
code/modules/clothing/under/jobs/security.dm | 7 ++
code/modules/clothing/under/shorts.dm | 1 +
code/modules/clothing/under/skirt_dress.dm | 1 +
code/modules/clothing/under/suits.dm | 3 +
code/modules/clothing/under/syndicate.dm | 11 ++++
code/modules/fishing/fishing_rod.dm | 8 +--
code/modules/food_and_drinks/pizzabox.dm | 2 +-
.../job_types/chaplain/chaplain_nullrod.dm | 2 +-
.../modules/mining/equipment/explorer_gear.dm | 2 +
.../modules/mining/equipment/kheiral_cuffs.dm | 2 +-
.../mining_loot/megafauna/hierophant.dm | 2 +-
.../mob/living/basic/drone/drone_tools.dm | 2 +-
.../mob/living/carbon/carbon_update_icons.dm | 8 +--
.../mob/living/carbon/human/_species.dm | 2 +-
.../living/carbon/human/human_update_icons.dm | 64 +++++++++++--------
code/modules/mod/mod_link.dm | 2 +-
code/modules/mod/mod_part.dm | 4 +-
code/modules/mod/modules/_module.dm | 2 +-
.../reagents/reagent_containers/jerrycan.dm | 2 +-
68 files changed, 205 insertions(+), 109 deletions(-)
diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm
index 54a7948faf6..17d62cd353a 100644
--- a/code/__DEFINES/dcs/signals/signals_object.dm
+++ b/code/__DEFINES/dcs/signals/signals_object.dm
@@ -222,7 +222,7 @@
#define COMPONENT_OFFER_TAKE_INTERRUPT (1<<0)
/// sent from obj/effect/attackby(): (/obj/effect/hit_effect, /mob/living/attacker, list/modifiers)
#define COMSIG_ITEM_ATTACK_EFFECT "item_effect_attacked"
-/// Called by /obj/item/proc/worn_overlays(list/overlays, mutable_appearance/standing, isinhands, icon_file)
+/// Called by /obj/item/proc/worn_overlays(list/overlays, mutable_appearance/standing, isinhands, icon_file, bodyshape)
#define COMSIG_ITEM_GET_WORN_OVERLAYS "item_get_worn_overlays"
/// Called by /obj/item/proc/separate_worn_overlays(list/overlays, mutable_appearance/standing, mutable_appearance/draw_target, isinhands, icon_file)
#define COMSIG_ITEM_GET_SEPARATE_WORN_OVERLAYS "item_get_separate_worn_overlays"
diff --git a/code/datums/components/clothing_dirt.dm b/code/datums/components/clothing_dirt.dm
index a02b2cfa0a5..3828f061dae 100644
--- a/code/datums/components/clothing_dirt.dm
+++ b/code/datums/components/clothing_dirt.dm
@@ -89,7 +89,7 @@
dirt_overlay.color = dirt_color
overlays += dirt_overlay
-/datum/component/clothing_dirt/proc/on_separate_worn_overlays(obj/item/source, list/overlays, mutable_appearance/standing, mutable_appearance/draw_target, isinhands, icon_file)
+/datum/component/clothing_dirt/proc/on_separate_worn_overlays(obj/item/source, list/overlays, mutable_appearance/standing, mutable_appearance/draw_target, isinhands, icon_file, bodyshape = NONE)
SIGNAL_HANDLER
if (isinhands || !dirtiness || !dirt_state || !(source.flags_cover & PEPPERPROOF))
diff --git a/code/datums/components/hat_stabilizer.dm b/code/datums/components/hat_stabilizer.dm
index 909eba12a2f..bae4cea2fc4 100644
--- a/code/datums/components/hat_stabilizer.dm
+++ b/code/datums/components/hat_stabilizer.dm
@@ -104,13 +104,13 @@
else
base_examine += span_notice("There's nothing placed on [parent]. Yet.")
-/datum/component/hat_stabilizer/proc/get_worn_overlays(atom/movable/source, list/overlays, mutable_appearance/standing, isinhands, icon_file)
+/datum/component/hat_stabilizer/proc/get_worn_overlays(atom/movable/source, list/overlays, mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
SIGNAL_HANDLER
if(isinhands)
return
if(!attached_hat)
return
- var/mutable_appearance/worn_overlay = attached_hat.build_worn_icon(default_layer = ABOVE_BODY_FRONT_HEAD_LAYER - 0.1, default_icon_file = 'icons/mob/clothing/head/default.dmi')
+ var/mutable_appearance/worn_overlay = attached_hat.build_worn_icon(default_layer = ABOVE_BODY_FRONT_HEAD_LAYER - 0.1, default_icon_file = 'icons/mob/clothing/head/default.dmi', bodyshape = bodyshape)
worn_overlay.appearance_flags |= RESET_COLOR
// loose hats are slightly angled
if(loose_hat)
@@ -121,13 +121,13 @@
worn_overlay.pixel_z = pixel_z_offset + attached_hat.worn_y_offset
overlays += worn_overlay
-/datum/component/hat_stabilizer/proc/get_separate_worn_overlays(atom/movable/source, list/overlays, mutable_appearance/standing, mutable_appearance/draw_target, isinhands, icon_file)
+/datum/component/hat_stabilizer/proc/get_separate_worn_overlays(atom/movable/source, list/overlays, mutable_appearance/standing, mutable_appearance/draw_target, isinhands, icon_file, bodyshape = NONE)
SIGNAL_HANDLER
if (isinhands)
return
if(!attached_hat)
return
- var/mutable_appearance/worn_overlay = attached_hat.build_worn_icon(default_layer = ABOVE_BODY_FRONT_HEAD_LAYER - 0.1, default_icon_file = 'icons/mob/clothing/head/default.dmi')
+ var/mutable_appearance/worn_overlay = attached_hat.build_worn_icon(default_layer = ABOVE_BODY_FRONT_HEAD_LAYER - 0.1, default_icon_file = 'icons/mob/clothing/head/default.dmi', bodyshape = bodyshape)
for (var/mutable_appearance/overlay in worn_overlay.overlays)
overlay.layer = -ABOVE_BODY_FRONT_HEAD_LAYER + 0.1
// loose hats are slightly angled
diff --git a/code/datums/components/toggle_attached_clothing.dm b/code/datums/components/toggle_attached_clothing.dm
index a251fd0e38a..ffec2e6026d 100644
--- a/code/datums/components/toggle_attached_clothing.dm
+++ b/code/datums/components/toggle_attached_clothing.dm
@@ -106,7 +106,7 @@
return COMPONENT_ITEM_ACTION_SLOT_INVALID
/// Apply an overlay while the item is not deployed
-/datum/component/toggle_attached_clothing/proc/on_checked_overlays(obj/item/source, list/overlays, mutable_appearance/standing, isinhands, icon_file)
+/datum/component/toggle_attached_clothing/proc/on_checked_overlays(obj/item/source, list/overlays, mutable_appearance/standing, isinhands, icon_file, bodyshape)
SIGNAL_HANDLER
if (isinhands || currently_deployed)
return
diff --git a/code/datums/sprite_accessories/clothing.dm b/code/datums/sprite_accessories/clothing.dm
index 2b23cd411a8..96b2f3b16fd 100644
--- a/code/datums/sprite_accessories/clothing.dm
+++ b/code/datums/sprite_accessories/clothing.dm
@@ -39,9 +39,10 @@
result = mutable_appearance(icon(cached_icons[key]))
else if(greyscale_config || use_female || use_digi) // icon ops ahead
- var/icon/created = icon(greyscale_config ? SSgreyscale.GetColoredIconByType(greyscale_config, greyscale_colors) : icon, icon_state_to_use)
+ var/icon_file_path = greyscale_config ? SSgreyscale.GetColoredIconByType(greyscale_config, greyscale_colors) : icon
+ var/icon/created = icon(icon_file_path, icon_state_to_use)
if(use_female)
- created = wear_female_version(icon_state_to_use, icon, female_sprite_flags_to_use)
+ created = wear_female_version(icon_state_to_use, icon_file_path, icon, female_sprite_flags_to_use)
if(use_digi)
var/icon/replacement = icon(SSgreyscale.GetColoredIconByType(/datum/greyscale_config/digitigrade_underwear, greyscale_colors), digi_icon_state)
created = replace_icon_legs(created, replacement)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index c0a7c8d1944..35721788368 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -172,6 +172,8 @@
var/list/species_exception = null
///This is a bitfield that defines what variations exist for bodyparts like Digi legs. See: code\_DEFINES\inventory.dm
var/supports_variations_flags = NONE
+ /// This is a bitfield that defines which bodyshapes this item is capable of rendering, used by build_worn_icon()
+ var/bodyshapes_with_variations = NONE
///Items can by default thrown up to 10 tiles by TK users
tk_throw_range = 10
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index 915fbf2af5e..eb4ae72db32 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -421,7 +421,7 @@
. += neon_overlay
. += emissive_appearance(neon_icon || icon, neon_icon_state || icon_state, src, alpha = emissive_alpha)
-/obj/item/stack/tile/carpet/neon/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/stack/tile/carpet/neon/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(!isinhands || !neon_inhand_icon_state)
return
@@ -1240,7 +1240,7 @@
. = ..()
. += emissive_appearance(icon, icon_state, src, alpha = alpha)
-/obj/item/stack/tile/emissive_test/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/stack/tile/emissive_test/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
. += emissive_appearance(standing.icon, standing.icon_state, src, alpha = standing.alpha)
diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm
index 23b13ccfef4..c0e75f77930 100644
--- a/code/game/objects/items/tanks/watertank.dm
+++ b/code/game/objects/items/tanks/watertank.dm
@@ -409,7 +409,7 @@
turn_on()
//Todo : cache these.
-/obj/item/reagent_containers/chemtank/worn_overlays(mutable_appearance/standing, isinhands = FALSE) //apply chemcolor and level
+/obj/item/reagent_containers/chemtank/worn_overlays(mutable_appearance/standing, isinhands = FALSE, icon_file, bodyshape = NONE) //apply chemcolor and level
. = ..()
//inhands + reagent_filling
if(isinhands || !reagents.total_volume)
diff --git a/code/game/objects/items/weaponry/melee/spear.dm b/code/game/objects/items/weaponry/melee/spear.dm
index 6fc5634c7c0..93ad7222479 100644
--- a/code/game/objects/items/weaponry/melee/spear.dm
+++ b/code/game/objects/items/weaponry/melee/spear.dm
@@ -161,7 +161,7 @@
tip_overlay.color = tip_material.color
. += tip_overlay
-/obj/item/spear/separate_worn_overlays(mutable_appearance/standing, mutable_appearance/draw_target, isinhands, icon_file)
+/obj/item/spear/separate_worn_overlays(mutable_appearance/standing, mutable_appearance/draw_target, isinhands, icon_file, bodyshape = NONE)
. = ..()
if (icon_prefix != SPEAR_CUSTOM_TIP_PREFIX || !isinhands)
return
diff --git a/code/game/objects/items/wind_turbine.dm b/code/game/objects/items/wind_turbine.dm
index b713c3acd5e..4b89a679582 100644
--- a/code/game/objects/items/wind_turbine.dm
+++ b/code/game/objects/items/wind_turbine.dm
@@ -345,7 +345,7 @@
if (istype(charging, /obj/item/melee/baton/security/))
. += mutable_appearance(icon, "baton")
-/obj/item/portable_wind_turbine/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/portable_wind_turbine/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if (isinhands)
return
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index 58196a173da..7f6c04cda70 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -393,7 +393,7 @@ LINEN BINS
add_overlay(gondola_mouth)
add_overlay(gondola_eyes)
-/obj/item/bedsheet/gondola/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/bedsheet/gondola/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(!isinhands)
. += mutable_appearance(icon_file, gondola_mouth)
diff --git a/code/modules/antagonists/heretic/items/heretic_armor.dm b/code/modules/antagonists/heretic/items/heretic_armor.dm
index 1529284652b..c94d7bf9406 100644
--- a/code/modules/antagonists/heretic/items/heretic_armor.dm
+++ b/code/modules/antagonists/heretic/items/heretic_armor.dm
@@ -989,7 +989,7 @@
add_overlay(object_overlay)
hood?.add_overlay(hood_object_overlay)
-/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust/worn_overlays(mutable_appearance/standing, isinhands)
+/obj/item/clothing/suit/hooded/cultrobes/eldritch/rust/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
// Should basically catch toggling the hood on/off while standing on rust
if(rusted)
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 1bdb47a1854..33bb5b745e3 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -646,7 +646,7 @@ BLIND // can't see anything
return ..()
/// Returns a list of overlays with our blood, if we're bloodied
-/obj/item/clothing/proc/get_blood_overlay(blood_state)
+/obj/item/clothing/proc/get_blood_overlay(blood_state, bodyshape = NONE)
if (!GET_ATOM_BLOOD_DECAL_LENGTH(src))
return
diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm
index 20b321592b7..0f06e9ec442 100644
--- a/code/modules/clothing/gloves/_gloves.dm
+++ b/code/modules/clothing/gloves/_gloves.dm
@@ -44,18 +44,18 @@
user.visible_message(span_suicide("\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(mutable_appearance/standing, isinhands = FALSE)
+/obj/item/clothing/gloves/worn_overlays(mutable_appearance/standing, isinhands = FALSE, icon_file, bodyshape = NONE)
. = ..()
if(isinhands)
return
if(damaged_clothes)
. += mutable_appearance('icons/effects/item_damage.dmi', "damagedgloves")
-/obj/item/clothing/gloves/separate_worn_overlays(mutable_appearance/standing, mutable_appearance/draw_target, isinhands, icon_file)
+/obj/item/clothing/gloves/separate_worn_overlays(mutable_appearance/standing, mutable_appearance/draw_target, isinhands, icon_file, bodyshape = NONE)
. = ..()
if (isinhands)
return
- var/blood_overlay = get_blood_overlay("glove")
+ var/blood_overlay = get_blood_overlay("glove", bodyshape)
if (blood_overlay)
. += blood_overlay
diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm
index 71e3b789a6c..662ceceaffd 100644
--- a/code/modules/clothing/head/_head.dm
+++ b/code/modules/clothing/head/_head.dm
@@ -55,18 +55,18 @@
R.visible_message(span_notice("[src] lands neatly on top of [R]!"), span_notice("[src] lands perfectly on top of you."))
R.place_on_head(src) //hats aren't designed to snugly fit borg heads or w/e so they'll always manage to knock eachother off
-/obj/item/clothing/head/worn_overlays(mutable_appearance/standing, isinhands = FALSE)
+/obj/item/clothing/head/worn_overlays(mutable_appearance/standing, isinhands = FALSE, icon_file, bodyshape = NONE)
. = ..()
if(isinhands)
return
if(damaged_clothes)
. += mutable_appearance('icons/effects/item_damage.dmi', "damagedhelmet")
-/obj/item/clothing/head/separate_worn_overlays(mutable_appearance/standing, mutable_appearance/draw_target, isinhands, icon_file)
+/obj/item/clothing/head/separate_worn_overlays(mutable_appearance/standing, mutable_appearance/draw_target, isinhands, icon_file, bodyshape = NONE)
. = ..()
if (isinhands)
return
- var/blood_overlay = get_blood_overlay("helmet")
+ var/blood_overlay = get_blood_overlay("helmet", bodyshape)
if (blood_overlay)
. += blood_overlay
diff --git a/code/modules/clothing/head/cone.dm b/code/modules/clothing/head/cone.dm
index 844558b5515..205e133e235 100644
--- a/code/modules/clothing/head/cone.dm
+++ b/code/modules/clothing/head/cone.dm
@@ -22,7 +22,7 @@
. = ..()
AddElement(/datum/element/floor_placeable)
-/obj/item/clothing/head/cone/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/clothing/head/cone/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(!isinhands)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha, effect_type = EMISSIVE_SPECULAR)
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index 7afc876c9fd..05f94232a85 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -151,7 +151,7 @@
if(.)
playsound(src, up ? SFX_VISOR_UP : SFX_VISOR_DOWN, 50, TRUE)
-/obj/item/clothing/head/utility/hardhat/welding/worn_overlays(mutable_appearance/standing, isinhands)
+/obj/item/clothing/head/utility/hardhat/welding/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(isinhands)
return
@@ -223,7 +223,7 @@
visor_flags_inv = NONE
visor_state = "weldvisor_atmos"
-/obj/item/clothing/head/utility/hardhat/welding/atmos/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/clothing/head/utility/hardhat/welding/atmos/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(!isinhands)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha, effect_type = EMISSIVE_SPECULAR)
@@ -270,7 +270,7 @@
if(light_on)
. += emissive_appearance(icon, "carved_pumpkin-emissive", src, alpha = src.alpha)
-/obj/item/clothing/head/utility/hardhat/pumpkinhead/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/clothing/head/utility/hardhat/pumpkinhead/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(light_on && !isinhands)
. += emissive_appearance(icon_file, "carved_pumpkin-emissive", src, alpha = src.alpha)
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 4b2bbe061d1..cf379ab556c 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -110,7 +110,7 @@
. = ..()
AddComponent(/datum/component/seclite_attachable, light_icon_state = "flight")
-/obj/item/clothing/head/helmet/press/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/clothing/head/helmet/press/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(!isinhands)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha, effect_type = EMISSIVE_SPECULAR)
diff --git a/code/modules/clothing/head/wig.dm b/code/modules/clothing/head/wig.dm
index 42fb32c08cb..0b4cd5f2b92 100644
--- a/code/modules/clothing/head/wig.dm
+++ b/code/modules/clothing/head/wig.dm
@@ -32,7 +32,7 @@
icon_state = hair_style.icon_state
return ..()
-/obj/item/clothing/head/wig/worn_overlays(mutable_appearance/standing, isinhands = FALSE, file2use)
+/obj/item/clothing/head/wig/worn_overlays(mutable_appearance/standing, isinhands = FALSE, icon_file, bodyshape = NONE)
. = ..()
if(isinhands)
return
diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm
index 672b2eeef1c..e365abec485 100644
--- a/code/modules/clothing/masks/_masks.dm
+++ b/code/modules/clothing/masks/_masks.dm
@@ -26,18 +26,18 @@
var/status = !(clothing_flags & VOICEBOX_DISABLED)
to_chat(user, span_notice("You turn the voice box in [src] [status ? "on" : "off"]."))
-/obj/item/clothing/mask/worn_overlays(mutable_appearance/standing, isinhands = FALSE)
+/obj/item/clothing/mask/worn_overlays(mutable_appearance/standing, isinhands = FALSE, icon_file, bodyshape = NONE)
. = ..()
if(isinhands || !(body_parts_covered & HEAD))
return
if(damaged_clothes)
. += mutable_appearance('icons/effects/item_damage.dmi', "damagedmask")
-/obj/item/clothing/mask/separate_worn_overlays(mutable_appearance/standing, mutable_appearance/draw_target, isinhands, icon_file)
+/obj/item/clothing/mask/separate_worn_overlays(mutable_appearance/standing, mutable_appearance/draw_target, isinhands, icon_file, bodyshape = NONE)
. = ..()
if (isinhands || !(body_parts_covered & HEAD))
return
- var/blood_overlay = get_blood_overlay("mask")
+ var/blood_overlay = get_blood_overlay("mask", bodyshape)
if (blood_overlay)
. += blood_overlay
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 36e6a6115cf..292ead0d920 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -58,10 +58,10 @@ GLOBAL_LIST_INIT(clown_mask_options, list(
LAZYADD(gas_filters, inserted_filter)
has_filter = TRUE
-/obj/item/clothing/mask/gas/separate_worn_overlays(mutable_appearance/standing, mutable_appearance/draw_target, isinhands, icon_file)
+/obj/item/clothing/mask/gas/separate_worn_overlays(mutable_appearance/standing, mutable_appearance/draw_target, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(!isinhands && cig)
- . += cig.build_worn_icon(default_layer = FACEMASK_LAYER, default_icon_file = 'icons/mob/clothing/mask.dmi')
+ . += cig.build_worn_icon(default_layer = FACEMASK_LAYER, default_icon_file = 'icons/mob/clothing/mask.dmi', bodyshape = bodyshape)
/obj/item/clothing/mask/gas/Destroy()
QDEL_LAZYLIST(gas_filters)
diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm
index ab2bb53516c..2d61617c03c 100644
--- a/code/modules/clothing/neck/_neck.dm
+++ b/code/modules/clothing/neck/_neck.dm
@@ -15,11 +15,11 @@
if(damaged_clothes)
. += mutable_appearance('icons/effects/item_damage.dmi', "damagedmask")
-/obj/item/clothing/neck/separate_worn_overlays(mutable_appearance/standing, mutable_appearance/draw_target, isinhands, icon_file)
+/obj/item/clothing/neck/separate_worn_overlays(mutable_appearance/standing, mutable_appearance/draw_target, isinhands, icon_file, bodyshape = NONE)
. = ..()
if (isinhands || !(body_parts_covered & HEAD))
return
- var/blood_overlay = get_blood_overlay("mask")
+ var/blood_overlay = get_blood_overlay("mask", bodyshape)
if (blood_overlay)
. += blood_overlay
@@ -145,7 +145,7 @@
context[SCREENTIP_CONTEXT_ALT_LMB] = "Tie"
return CONTEXTUAL_SCREENTIP_SET
-/obj/item/clothing/neck/tie/worn_overlays(mutable_appearance/standing, isinhands)
+/obj/item/clothing/neck/tie/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
var/mob/living/carbon/human/wearer = loc
if(!ishuman(wearer) || !wearer.w_uniform)
@@ -584,7 +584,7 @@
resistance_flags = FIRE_PROOF | LAVA_PROOF
custom_materials = list(/datum/material/bone = SHEET_MATERIAL_AMOUNT * 2, /datum/material/diamond = SHEET_MATERIAL_AMOUNT * 2)
-/obj/item/clothing/neck/wreath/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/clothing/neck/wreath/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(!isinhands)
. += emissive_appearance(icon_file, "wreath_emissive", src, alpha = src.alpha)
diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm
index 72b9efd045d..a88e5a28217 100644
--- a/code/modules/clothing/shoes/_shoes.dm
+++ b/code/modules/clothing/shoes/_shoes.dm
@@ -63,18 +63,18 @@
playsound(user, 'sound/items/weapons/genhit2.ogg', 50, TRUE)
return BRUTELOSS
-/obj/item/clothing/shoes/worn_overlays(mutable_appearance/standing, isinhands = FALSE)
+/obj/item/clothing/shoes/worn_overlays(mutable_appearance/standing, isinhands = FALSE, icon_file, bodyshape = NONE)
. = ..()
if(isinhands)
return
if(damaged_clothes)
. += mutable_appearance('icons/effects/item_damage.dmi', "damagedshoe")
-/obj/item/clothing/shoes/separate_worn_overlays(mutable_appearance/standing, mutable_appearance/draw_target, isinhands = FALSE, icon_file)
+/obj/item/clothing/shoes/separate_worn_overlays(mutable_appearance/standing, mutable_appearance/draw_target, isinhands = FALSE, icon_file, bodyshape = NONE)
. = ..()
if (isinhands)
return
- var/blood_overlay = get_blood_overlay("shoe")
+ var/blood_overlay = get_blood_overlay("shoe", bodyshape)
if (blood_overlay)
. += blood_overlay
diff --git a/code/modules/clothing/shoes/boots.dm b/code/modules/clothing/shoes/boots.dm
index 6140ee8b80f..6eaaa200c1f 100644
--- a/code/modules/clothing/shoes/boots.dm
+++ b/code/modules/clothing/shoes/boots.dm
@@ -4,6 +4,7 @@
icon_state = "jackboots"
inhand_icon_state = "jackboots"
supports_variations_flags = CLOTHING_DIGITIGRADE_MASK
+ bodyshapes_with_variations = BODYSHAPE_DIGITIGRADE
body_parts_covered = FEET|LEGS
armor_type = /datum/armor/shoes_combat
strip_delay = 4 SECONDS
@@ -47,6 +48,7 @@
icon_state = "jackboots"
inhand_icon_state = "jackboots"
supports_variations_flags = CLOTHING_DIGITIGRADE_MASK
+ bodyshapes_with_variations = BODYSHAPE_DIGITIGRADE
strip_delay = 3 SECONDS
equip_delay_other = 5 SECONDS
resistance_flags = NONE
@@ -74,6 +76,7 @@
icon_state = "ftc_boots"
inhand_icon_state = null
supports_variations_flags = NONE
+ bodyshapes_with_variations = NONE
/obj/item/clothing/shoes/jackboots/floortile/Initialize(mapload)
. = ..()
@@ -85,6 +88,7 @@
icon_state = "winterboots"
inhand_icon_state = null
supports_variations_flags = CLOTHING_DIGITIGRADE_MASK
+ bodyshapes_with_variations = BODYSHAPE_DIGITIGRADE
armor_type = /datum/armor/shoes_winterboots
cold_protection = FEET|LEGS
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
@@ -136,6 +140,7 @@
inhand_icon_state = "jackboots"
armor_type = /datum/armor/shoes_workboots
supports_variations_flags = CLOTHING_DIGITIGRADE_MASK
+ bodyshapes_with_variations = BODYSHAPE_DIGITIGRADE
strip_delay = 2 SECONDS
equip_delay_other = 4 SECONDS
lace_time = 8 SECONDS
@@ -166,6 +171,7 @@
inhand_icon_state = null
lace_time = 8 SECONDS
supports_variations_flags = CLOTHING_DIGITIGRADE_MASK
+ bodyshapes_with_variations = BODYSHAPE_DIGITIGRADE
/obj/item/clothing/shoes/russian/Initialize(mapload)
. = ..()
diff --git a/code/modules/clothing/shoes/costume.dm b/code/modules/clothing/shoes/costume.dm
index 65a0722000d..0572603d774 100644
--- a/code/modules/clothing/shoes/costume.dm
+++ b/code/modules/clothing/shoes/costume.dm
@@ -93,7 +93,7 @@
AddElement(/datum/element/gags_recolorable)
update_icon(UPDATE_OVERLAYS)
-/obj/item/clothing/shoes/glow/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/clothing/shoes/glow/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(!isinhands)
. += emissive_appearance(DEFAULT_SHOES_FILE, "glow_shoes_emissive", src, alpha = src.alpha)
diff --git a/code/modules/clothing/shoes/sneakers.dm b/code/modules/clothing/shoes/sneakers.dm
index f073336f429..1faed5d2eef 100644
--- a/code/modules/clothing/shoes/sneakers.dm
+++ b/code/modules/clothing/shoes/sneakers.dm
@@ -12,6 +12,8 @@
greyscale_config_inhand_right = /datum/greyscale_config/sneakers/inhand_right
greyscale_colors = "#2d2d33#ffffff"
supports_variations_flags = CLOTHING_DIGITIGRADE_MASK
+ bodyshapes_with_variations = BODYSHAPE_DIGITIGRADE
+
flags_1 = IS_PLAYER_COLORABLE_1
interaction_flags_mouse_drop = NEED_HANDS
diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm
index 44324bae47a..9e68856c203 100644
--- a/code/modules/clothing/spacesuits/plasmamen.dm
+++ b/code/modules/clothing/spacesuits/plasmamen.dm
@@ -176,12 +176,12 @@
return ITEM_INTERACT_SUCCESS
///By the by, helmets have the update_icon_updates_onmob element, so we don't have to call mob.update_worn_head()
-/obj/item/clothing/head/helmet/space/plasmaman/worn_overlays(mutable_appearance/standing, isinhands)
+/obj/item/clothing/head/helmet/space/plasmaman/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(!isinhands && !up)
. += mutable_appearance('icons/mob/clothing/head/plasmaman_head.dmi', visor_icon)
-/obj/item/clothing/head/helmet/space/plasmaman/separate_worn_overlays(mutable_appearance/standing, mutable_appearance/draw_target, isinhands = FALSE, icon_file)
+/obj/item/clothing/head/helmet/space/plasmaman/separate_worn_overlays(mutable_appearance/standing, mutable_appearance/draw_target, isinhands = FALSE, icon_file, bodyshape = NONE)
. = ..()
if(!isinhands && smile)
var/mutable_appearance/smiley = mutable_appearance('icons/mob/clothing/head/plasmaman_head.dmi', smile_state)
diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm
index 2124d80d189..97d7991a825 100644
--- a/code/modules/clothing/suits/_suits.dm
+++ b/code/modules/clothing/suits/_suits.dm
@@ -18,7 +18,7 @@
var/blood_overlay_type = "suit"
limb_integrity = 0 // disabled for most exo-suits
-/obj/item/clothing/suit/worn_overlays(mutable_appearance/standing, isinhands = FALSE)
+/obj/item/clothing/suit/worn_overlays(mutable_appearance/standing, isinhands = FALSE, icon_file, bodyshape = NONE)
. = ..()
if(isinhands)
return
@@ -37,11 +37,11 @@
if(displayed.above_suit && undershirt.accessory_overlay)
. += undershirt.accessory_overlay
-/obj/item/clothing/suit/separate_worn_overlays(mutable_appearance/standing, mutable_appearance/draw_target, isinhands = FALSE, icon_file)
+/obj/item/clothing/suit/separate_worn_overlays(mutable_appearance/standing, mutable_appearance/draw_target, isinhands = FALSE, icon_file, bodyshape = NONE)
. = ..()
if (isinhands)
return
- var/blood_overlay = get_blood_overlay(blood_overlay_type)
+ var/blood_overlay = get_blood_overlay(blood_overlay_type, bodyshape)
if (blood_overlay)
. += blood_overlay
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 2e7f7e6c464..991c89e4cfa 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -65,7 +65,7 @@
desc = "A blue armor vest used to distinguish non-combatant \"PRESS\" members, like if anyone cares."
icon_state = "armor_press"
-/obj/item/clothing/suit/armor/vest/press/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/clothing/suit/armor/vest/press/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(!isinhands)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha, effect_type = EMISSIVE_SPECULAR)
@@ -225,7 +225,7 @@
resistance_flags = FLAMMABLE
dog_fashion = null
-/obj/item/clothing/suit/armor/vest/secjacket/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/clothing/suit/armor/vest/secjacket/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(!isinhands)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha, effect_type = EMISSIVE_SPECULAR)
diff --git a/code/modules/clothing/suits/costume.dm b/code/modules/clothing/suits/costume.dm
index f497b5d701b..2bd519f2e2a 100644
--- a/code/modules/clothing/suits/costume.dm
+++ b/code/modules/clothing/suits/costume.dm
@@ -661,6 +661,7 @@
inhand_icon_state = null
body_parts_covered = CHEST|GROIN|LEGS|ARMS
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/suit/costume/soviet
name = "soviet armored coat"
@@ -683,6 +684,7 @@
inhand_icon_state = null
body_parts_covered = CHEST|GROIN|LEGS|ARMS
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/suit/costume/pg
name = "powder ganger jacket"
@@ -691,6 +693,7 @@
inhand_icon_state = null
body_parts_covered = CHEST|GROIN|LEGS|ARMS
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/suit/costume/irs
name = "internal revenue service jacket"
@@ -699,6 +702,7 @@
inhand_icon_state = null
body_parts_covered = CHEST|GROIN|LEGS|ARMS
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/suit/costume/bear_suit
name = "bear suit"
diff --git a/code/modules/clothing/suits/ethereal.dm b/code/modules/clothing/suits/ethereal.dm
index bd5e7d84cfe..47f096dc367 100644
--- a/code/modules/clothing/suits/ethereal.dm
+++ b/code/modules/clothing/suits/ethereal.dm
@@ -17,7 +17,7 @@
update_icon(UPDATE_OVERLAYS)
AddElement(/datum/element/adjust_fishing_difficulty, -5)
-/obj/item/clothing/suit/hooded/ethereal_raincoat/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/clothing/suit/hooded/ethereal_raincoat/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(!isinhands)
. += emissive_appearance('icons/mob/clothing/suits/ethereal.dmi', "eth_raincoat_glow_worn", offset_spokesman = src, alpha = src.alpha)
diff --git a/code/modules/clothing/suits/ghostsheet.dm b/code/modules/clothing/suits/ghostsheet.dm
index 85c3cfed3f8..a2e61bdb3d9 100644
--- a/code/modules/clothing/suits/ghostsheet.dm
+++ b/code/modules/clothing/suits/ghostsheet.dm
@@ -18,7 +18,7 @@
update_icon(UPDATE_OVERLAYS)
AddElement(/datum/element/adjust_fishing_difficulty, 8)
-/obj/item/clothing/suit/costume/ghost_sheet/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/clothing/suit/costume/ghost_sheet/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(!isinhands && check_holidays(HALLOWEEN))
. += emissive_appearance('icons/mob/simple/mob.dmi', "ghost", offset_spokesman = src, alpha = src.alpha)
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 663ac5db102..5666cace974 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -194,7 +194,7 @@
resistance_flags = NONE
species_exception = list(/datum/species/golem)
-/obj/item/clothing/suit/hazardvest/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/clothing/suit/hazardvest/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(!isinhands)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha, effect_type = EMISSIVE_SPECULAR)
@@ -442,7 +442,7 @@
fire = 100
acid = 50
-/obj/item/clothing/suit/atmos_overalls/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/clothing/suit/atmos_overalls/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(!isinhands)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha, effect_type = EMISSIVE_SPECULAR)
diff --git a/code/modules/clothing/suits/lasertag.dm b/code/modules/clothing/suits/lasertag.dm
index 93badb50fae..9f34e86fefd 100644
--- a/code/modules/clothing/suits/lasertag.dm
+++ b/code/modules/clothing/suits/lasertag.dm
@@ -10,6 +10,7 @@
allowed = list (/obj/item/gun/energy/laser/bluetag)
resistance_flags = NONE
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/suit/bluetag/equipped(mob/equipper, slot)
. = ..()
@@ -34,7 +35,7 @@
allowed = list (/obj/item/gun/energy/laser/redtag)
resistance_flags = NONE
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
-
+ bodyshapes_with_variations = NONE
/obj/item/clothing/suit/redtag/equipped(mob/equipper, slot)
. = ..()
diff --git a/code/modules/clothing/suits/moth.dm b/code/modules/clothing/suits/moth.dm
index 58c73c88597..aa2a10ca84d 100644
--- a/code/modules/clothing/suits/moth.dm
+++ b/code/modules/clothing/suits/moth.dm
@@ -35,3 +35,4 @@
cold_protection = CHEST|GROIN|ARMS|LEGS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm
index 3910d121246..6273d4ae1f4 100644
--- a/code/modules/clothing/suits/utility.dm
+++ b/code/modules/clothing/suits/utility.dm
@@ -53,7 +53,7 @@
fire = 100
acid = 50
-/obj/item/clothing/suit/utility/fire/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/clothing/suit/utility/fire/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(!isinhands)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha, effect_type = EMISSIVE_SPECULAR)
diff --git a/code/modules/clothing/suits/wintercoats.dm b/code/modules/clothing/suits/wintercoats.dm
index 84121104e93..5b4f92e0c47 100644
--- a/code/modules/clothing/suits/wintercoats.dm
+++ b/code/modules/clothing/suits/wintercoats.dm
@@ -543,7 +543,7 @@
/datum/armor/wintercoat_engineering
fire = 20
-/obj/item/clothing/suit/hooded/wintercoat/engineering/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/clothing/suit/hooded/wintercoat/engineering/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(!isinhands)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha, effect_type = EMISSIVE_SPECULAR)
@@ -556,7 +556,7 @@
/datum/armor/winterhood_engineering
fire = 20
-/obj/item/clothing/head/hooded/winterhood/engineering/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/clothing/head/hooded/winterhood/engineering/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(!isinhands)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha, effect_type = EMISSIVE_SPECULAR)
@@ -759,7 +759,7 @@
hood_down_overlay_suffix = ""
hood_up_affix = "_t"
-/obj/item/clothing/suit/hooded/wintercoat/zipup/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/clothing/suit/hooded/wintercoat/zipup/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(isinhands || (hood && hood.loc != src))
return
diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm
index 154b4c716e6..559467ea5e8 100644
--- a/code/modules/clothing/under/_under.dm
+++ b/code/modules/clothing/under/_under.dm
@@ -10,6 +10,7 @@
interaction_flags_click = NEED_DEXTERITY|ALLOW_RESTING
armor_type = /datum/armor/clothing_under
supports_variations_flags = CLOTHING_DIGITIGRADE_MASK
+ bodyshapes_with_variations = BODYSHAPE_DIGITIGRADE
equip_sound = 'sound/items/equip/jumpsuit_equip.ogg'
drop_sound = 'sound/items/handling/cloth/cloth_drop1.ogg'
pickup_sound = 'sound/items/handling/cloth/cloth_pickup1.ogg'
@@ -110,7 +111,7 @@
return changed ? CONTEXTUAL_SCREENTIP_SET : .
-/obj/item/clothing/under/worn_overlays(mutable_appearance/standing, isinhands = FALSE)
+/obj/item/clothing/under/worn_overlays(mutable_appearance/standing, isinhands = FALSE, icon_file, bodyshape = NONE)
. = ..()
if(isinhands)
return
@@ -120,11 +121,11 @@
if(accessory_overlay)
. += accessory_overlay
-/obj/item/clothing/under/separate_worn_overlays(mutable_appearance/standing, mutable_appearance/draw_target, isinhands = FALSE, icon_file)
+/obj/item/clothing/under/separate_worn_overlays(mutable_appearance/standing, mutable_appearance/draw_target, isinhands = FALSE, icon_file, bodyshape = NONE)
. = ..()
if (isinhands)
return
- var/blood_overlay = get_blood_overlay("uniform")
+ var/blood_overlay = get_blood_overlay("uniform", bodyshape)
if (blood_overlay)
. += blood_overlay
diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm
index 9c1fe797ba5..9c69ed4b3f9 100644
--- a/code/modules/clothing/under/color.dm
+++ b/code/modules/clothing/under/color.dm
@@ -22,6 +22,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/// Returns a random, acceptable jumpsuit typepath
/proc/get_random_jumpsuit()
diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm
index f72fba10945..c38caff9e9b 100644
--- a/code/modules/clothing/under/costume.dm
+++ b/code/modules/clothing/under/costume.dm
@@ -105,6 +105,7 @@
body_parts_covered = CHEST|GROIN|ARMS
female_sprite_flags = NO_FEMALE_UNIFORM
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
can_adjust = FALSE
resistance_flags = NONE
@@ -128,6 +129,7 @@
body_parts_covered = CHEST|GROIN
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
alternate_worn_layer = UNDER_SUIT_LAYER
can_adjust = FALSE
clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR //weebs are gonna love this
@@ -147,6 +149,7 @@
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
@@ -168,6 +171,7 @@
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
clothing_flags = parent_type::clothing_flags | CARP_STYLE_FACTOR
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
@@ -385,6 +389,7 @@
flags_1 = IS_PLAYER_COLORABLE_1
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/costume/buttondown/skirt/service //preset one to be a formal white shirt and black skirt
icon_state = "/obj/item/clothing/under/costume/buttondown/skirt/service"
@@ -551,6 +556,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/costume/head_of_personnel
name = "head of personnel's suit"
@@ -568,3 +574,4 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
diff --git a/code/modules/clothing/under/ethereal.dm b/code/modules/clothing/under/ethereal.dm
index 25a47323a30..169010c0cfb 100644
--- a/code/modules/clothing/under/ethereal.dm
+++ b/code/modules/clothing/under/ethereal.dm
@@ -15,7 +15,7 @@
. = ..()
update_icon(UPDATE_OVERLAYS)
-/obj/item/clothing/under/ethereal_tunic/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/clothing/under/ethereal_tunic/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(!isinhands)
. += emissive_appearance('icons/mob/clothing/under/ethereal.dmi', "eth_tunic_emissive", offset_spokesman = src, alpha = src.alpha)
diff --git a/code/modules/clothing/under/jobs/cargo.dm b/code/modules/clothing/under/jobs/cargo.dm
index c2c1325d4aa..2ee01f77388 100644
--- a/code/modules/clothing/under/jobs/cargo.dm
+++ b/code/modules/clothing/under/jobs/cargo.dm
@@ -17,6 +17,7 @@
body_parts_covered = CHEST|GROIN|ARMS
dying_key = DYE_REGISTRY_JUMPSKIRT
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
/obj/item/clothing/under/rank/cargo/tech
@@ -32,6 +33,7 @@
inhand_icon_state = "lb_suit"
body_parts_covered = CHEST|GROIN|ARMS
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/cargo/tech/skirt
name = "cargo technician's skirt"
@@ -40,6 +42,7 @@
inhand_icon_state = "lb_suit"
body_parts_covered = CHEST|GROIN|ARMS
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
diff --git a/code/modules/clothing/under/jobs/centcom.dm b/code/modules/clothing/under/jobs/centcom.dm
index 38bcafe1211..7fabdb9aa86 100644
--- a/code/modules/clothing/under/jobs/centcom.dm
+++ b/code/modules/clothing/under/jobs/centcom.dm
@@ -42,6 +42,7 @@
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
body_parts_covered = CHEST|GROIN|ARMS
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/centcom/officer_skirt/replica
name = "\improper CentCom turtleneck skirt replica"
@@ -55,6 +56,7 @@
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
body_parts_covered = CHEST|GROIN|ARMS
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/centcom/military
name = "tactical combat uniform"
diff --git a/code/modules/clothing/under/jobs/civilian/civilian.dm b/code/modules/clothing/under/jobs/civilian/civilian.dm
index 86ea0a9e452..c6d89bd056a 100644
--- a/code/modules/clothing/under/jobs/civilian/civilian.dm
+++ b/code/modules/clothing/under/jobs/civilian/civilian.dm
@@ -27,6 +27,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/civilian/head_of_personnel
desc = "A slick uniform worn by those to earn the position of \"Head of Personnel\"."
@@ -43,6 +44,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/civilian/hydroponics
desc = "It's a jumpsuit designed to protect against minor plant-related hazards."
@@ -63,6 +65,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/civilian/janitor
desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards."
@@ -82,6 +85,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/civilian/janitor/maid
name = "maid uniform"
@@ -122,6 +126,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/civilian/lawyer/beige
name = "good lawyer's suit"
@@ -137,6 +142,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/civilian/lawyer/red
name = "lawyer red suit"
@@ -150,6 +156,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/civilian/lawyer/blue
name = "lawyer blue suit"
@@ -163,6 +170,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/civilian/lawyer/bluesuit
name = "blue buttondown suit"
@@ -187,6 +195,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/civilian/lawyer/purpsuit
name = "purple suit"
@@ -204,6 +213,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/civilian/lawyer/galaxy
icon = 'icons/obj/clothing/under/lawyer_galaxy.dmi'
@@ -219,6 +229,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/civilian/lawyer/galaxy/red
name = "red galaxy suit"
@@ -231,6 +242,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/civilian/cookjorts
name = "grilling shorts"
diff --git a/code/modules/clothing/under/jobs/civilian/clown_mime.dm b/code/modules/clothing/under/jobs/civilian/clown_mime.dm
index 1ed0b8608cf..b2cc738739a 100644
--- a/code/modules/clothing/under/jobs/civilian/clown_mime.dm
+++ b/code/modules/clothing/under/jobs/civilian/clown_mime.dm
@@ -14,6 +14,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/civilian/mime/sexy
name = "sexy mime outfit"
@@ -32,6 +33,7 @@
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
can_adjust = FALSE
supports_variations_flags = NONE
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/civilian/clown/Initialize(mapload)
. = ..()
diff --git a/code/modules/clothing/under/jobs/command.dm b/code/modules/clothing/under/jobs/command.dm
index 0df4a925fe1..9fbe969f58e 100644
--- a/code/modules/clothing/under/jobs/command.dm
+++ b/code/modules/clothing/under/jobs/command.dm
@@ -21,6 +21,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/captain/parade
name = "captain's parade uniform"
diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm
index 257312ffff8..4771abdc27e 100644
--- a/code/modules/clothing/under/jobs/engineering.dm
+++ b/code/modules/clothing/under/jobs/engineering.dm
@@ -31,6 +31,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/engineering/chief_engineer/turtleneck
name = "chief engineer's turtleneck"
@@ -50,6 +51,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/engineering/atmospheric_technician
desc = "It's a jumpsuit worn by atmospheric technicians. Made from fire resistant materials."
@@ -66,6 +68,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/engineering/engineer
desc = "It's an orange high visibility jumpsuit worn by engineers. Made from fire resistant materials."
@@ -89,3 +92,4 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
diff --git a/code/modules/clothing/under/jobs/medical.dm b/code/modules/clothing/under/jobs/medical.dm
index 42d3c7aa8cf..286b19c202d 100644
--- a/code/modules/clothing/under/jobs/medical.dm
+++ b/code/modules/clothing/under/jobs/medical.dm
@@ -22,6 +22,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/medical/chief_medical_officer
desc = "It's a jumpsuit worn by those with the experience to be \"Chief Medical Officer\". It provides minor biological protection."
@@ -38,6 +39,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/medical/chief_medical_officer/scrubs
name = "chief medical officer's scrubs"
@@ -67,6 +69,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/medical/virologist
desc = "It's made of a special fiber that gives special protection against biohazards. It has a virologist rank stripe on it."
@@ -83,6 +86,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/medical/scrubs
name = "medical scrubs"
@@ -118,6 +122,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/medical/scrubs/coroner
name = "coroner scrubs"
@@ -144,6 +149,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/medical/paramedic
desc = "It's made of a special fiber that provides minor protection against biohazards. It has a dark blue cross on the chest denoting that the wearer is a trained paramedic."
@@ -160,6 +166,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/medical/doctor/nurse
desc = "It's a jumpsuit commonly worn by nursing staff in the medical department."
diff --git a/code/modules/clothing/under/jobs/rnd.dm b/code/modules/clothing/under/jobs/rnd.dm
index 44cb6889768..aff332cd7ef 100644
--- a/code/modules/clothing/under/jobs/rnd.dm
+++ b/code/modules/clothing/under/jobs/rnd.dm
@@ -33,6 +33,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/rnd/research_director/alt
name = "research director's tan suit"
@@ -57,6 +58,7 @@
body_parts_covered = CHEST|GROIN|ARMS
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/rnd/research_director/turtleneck
desc = "A Nanotrasen-purple turtleneck and black jeans, for a director with a superior sense of style."
@@ -74,6 +76,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/rnd/scientist
name = "scientist's jumpsuit"
@@ -89,6 +92,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/rnd/roboticist
desc = "It's a slimming black with reinforced seams; great for industrial work."
@@ -106,6 +110,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/rnd/geneticist
name = "geneticist's jumpsuit"
@@ -120,3 +125,4 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm
index 8d6753afadb..5c65963d690 100644
--- a/code/modules/clothing/under/jobs/security.dm
+++ b/code/modules/clothing/under/jobs/security.dm
@@ -45,6 +45,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/security/officer/blueshirt
name = "blue shirt and tie"
@@ -90,6 +91,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/security/warden/formal
desc = "The insignia on this uniform tells you that this uniform belongs to the Warden."
@@ -118,6 +120,7 @@
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
alt_covers_chest = TRUE
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/security/detective/noir
name = "noir suit"
@@ -136,6 +139,7 @@
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
alt_covers_chest = TRUE
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/*
* Head of Security
@@ -163,6 +167,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/security/head_of_security/grey
name = "head of security's grey jumpsuit"
@@ -187,6 +192,7 @@
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
alt_covers_chest = TRUE
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/security/head_of_security/parade
name = "head of security's parade uniform"
@@ -265,6 +271,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/rank/security/officer/beatcop
name = "space police uniform"
diff --git a/code/modules/clothing/under/shorts.dm b/code/modules/clothing/under/shorts.dm
index 7110fab35bc..e780d2d4d96 100644
--- a/code/modules/clothing/under/shorts.dm
+++ b/code/modules/clothing/under/shorts.dm
@@ -11,6 +11,7 @@
body_parts_covered = GROIN
female_sprite_flags = NO_FEMALE_UNIFORM
supports_variations_flags = NONE
+ bodyshapes_with_variations = NONE
can_adjust = FALSE
species_exception = list(/datum/species/golem)
flags_1 = IS_PLAYER_COLORABLE_1
diff --git a/code/modules/clothing/under/skirt_dress.dm b/code/modules/clothing/under/skirt_dress.dm
index 34a492e2b56..d0dbea735cd 100644
--- a/code/modules/clothing/under/skirt_dress.dm
+++ b/code/modules/clothing/under/skirt_dress.dm
@@ -3,6 +3,7 @@
can_adjust = FALSE
body_parts_covered = CHEST|GROIN
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
icon = 'icons/obj/clothing/under/dress.dmi'
worn_icon = 'icons/mob/clothing/under/dress.dmi'
diff --git a/code/modules/clothing/under/suits.dm b/code/modules/clothing/under/suits.dm
index f77114d4aab..6d7183be3db 100644
--- a/code/modules/clothing/under/suits.dm
+++ b/code/modules/clothing/under/suits.dm
@@ -49,6 +49,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/suit/white
name = "white suit"
@@ -64,6 +65,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/suit/tan
name = "tan suit"
@@ -92,6 +94,7 @@
dying_key = DYE_REGISTRY_JUMPSKIRT
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY|FEMALE_UNIFORM_NO_BREASTS
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/suit/tuxedo
name = "tuxedo"
diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm
index c195718dc3a..4d15df94638 100644
--- a/code/modules/clothing/under/syndicate.dm
+++ b/code/modules/clothing/under/syndicate.dm
@@ -23,6 +23,7 @@
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
dying_key = DYE_REGISTRY_JUMPSKIRT
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/syndicate/bloodred
name = "blood-red sneaksuit"
@@ -33,6 +34,7 @@
resistance_flags = FIRE_PROOF | ACID_PROOF
can_adjust = FALSE
supports_variations_flags = NONE
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/syndicate/bloodred/Initialize(mapload)
. = ..()
@@ -97,6 +99,7 @@
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
dying_key = DYE_REGISTRY_JUMPSKIRT
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/syndicate/sniper
name = "tactical turtleneck suit"
@@ -105,6 +108,7 @@
inhand_icon_state = "bl_suit"
can_adjust = FALSE
supports_variations_flags = NONE
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/syndicate/camo
name = "camouflage fatigues"
@@ -113,6 +117,7 @@
inhand_icon_state = "g_suit"
can_adjust = FALSE
supports_variations_flags = NONE
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/syndicate/cybersun
name = "\improper Cybersun businesswear"
@@ -122,6 +127,7 @@
inhand_icon_state = "bl_suit"
can_adjust = FALSE
supports_variations_flags = NONE
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/syndicate/floortilecamo
name = "floortile camouflage fatigues"
@@ -131,6 +137,7 @@
inhand_icon_state = "gy_suit"
can_adjust = FALSE
supports_variations_flags = NONE
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/syndicate/floortilecamo/Initialize(mapload)
. = ..()
@@ -142,6 +149,7 @@
icon_state = "trackpants"
can_adjust = FALSE
supports_variations_flags = NONE
+ bodyshapes_with_variations = NONE
armor_type = /datum/armor/clothing_under/syndicate_soviet
resistance_flags = NONE
@@ -154,6 +162,7 @@
icon_state = "syndicate_combat"
can_adjust = FALSE
supports_variations_flags = NONE
+ bodyshapes_with_variations = NONE
/obj/item/clothing/under/syndicate/rus_army
name = "advanced military tracksuit"
@@ -161,6 +170,7 @@
icon_state = "rus_under"
can_adjust = FALSE
supports_variations_flags = NONE
+ bodyshapes_with_variations = NONE
armor_type = /datum/armor/clothing_under/syndicate_rus_army
resistance_flags = NONE
@@ -175,6 +185,7 @@
icon_state = "scrubswine"
can_adjust = FALSE
supports_variations_flags = NONE
+ bodyshapes_with_variations = NONE
armor_type = /datum/armor/clothing_under/syndicate_scrubs
/obj/item/clothing/under/syndicate/scrubs/Initialize(mapload)
diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm
index ce2abbc6b99..a6d6fe48425 100644
--- a/code/modules/fishing/fishing_rod.dm
+++ b/code/modules/fishing/fishing_rod.dm
@@ -508,11 +508,11 @@
bait_state = "battery_overlay"
. += bait_state
-/obj/item/fishing_rod/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/fishing_rod/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
- . += get_fishing_worn_overlays(standing, isinhands, icon_file)
+ . += get_fishing_worn_overlays(standing, isinhands, icon_file, bodyshape)
-/obj/item/fishing_rod/proc/get_fishing_worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/fishing_rod/proc/get_fishing_worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = list()
var/line_color = line?.line_color || default_line_color
var/mutable_appearance/reel_overlay = mutable_appearance(icon_file, "reel_overlay", appearance_flags = RESET_COLOR|KEEP_APART)
@@ -740,7 +740,7 @@
return list()
return ..()
-/obj/item/fishing_rod/telescopic/get_fishing_worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/fishing_rod/telescopic/get_fishing_worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE))
return list()
return ..()
diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm
index 8c8f1135d89..b09bcfa7175 100644
--- a/code/modules/food_and_drinks/pizzabox.dm
+++ b/code/modules/food_and_drinks/pizzabox.dm
@@ -122,7 +122,7 @@
tag_overlay.pixel_z = box_offset
. += tag_overlay
-/obj/item/pizzabox/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/pizzabox/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
var/current_offset = 2
if(!isinhands)
diff --git a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm
index f73ab5f588c..fbb870a0670 100644
--- a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm
+++ b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm
@@ -344,7 +344,7 @@ GLOBAL_LIST_INIT(nullrod_variants, init_nullrod_variants())
. = ..()
AddComponent(/datum/component/walking_aid)
-/obj/item/nullrod/staff/worn_overlays(mutable_appearance/standing, isinhands)
+/obj/item/nullrod/staff/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(isinhands)
. += mutable_appearance('icons/effects/effects.dmi', shield_icon, MOB_SHIELD_LAYER)
diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm
index e3b92dda982..99578b9bf72 100644
--- a/code/modules/mining/equipment/explorer_gear.dm
+++ b/code/modules/mining/equipment/explorer_gear.dm
@@ -7,6 +7,7 @@
worn_icon = 'icons/mob/clothing/suits/utility.dmi'
inhand_icon_state = null
supports_variations_flags = CLOTHING_DIGITIGRADE_MASK
+ bodyshapes_with_variations = BODYSHAPE_DIGITIGRADE
body_parts_covered = CHEST|GROIN|LEGS|ARMS
cold_protection = CHEST|GROIN|LEGS|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
@@ -115,6 +116,7 @@
alternate_worn_layer = NECK_LAYER
body_parts_covered = CHEST|GROIN|LEGS|ARMS
supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
+ bodyshapes_with_variations = NONE
cold_protection = CHEST|GROIN|LEGS|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
heat_protection = CHEST|GROIN|LEGS|ARMS
diff --git a/code/modules/mining/equipment/kheiral_cuffs.dm b/code/modules/mining/equipment/kheiral_cuffs.dm
index 79264731c88..8fce6f55432 100644
--- a/code/modules/mining/equipment/kheiral_cuffs.dm
+++ b/code/modules/mining/equipment/kheiral_cuffs.dm
@@ -100,7 +100,7 @@
else if(isliving(loc.loc)) // for the "worn as accessory" case
connect_kheiral_network(loc.loc)
-/obj/item/clothing/accessory/kheiral_cuffs/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/clothing/accessory/kheiral_cuffs/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(!isinhands)
. += emissive_appearance(icon_file, "strandcuff_emissive", src, alpha = src.alpha)
diff --git a/code/modules/mining/lavaland/mining_loot/megafauna/hierophant.dm b/code/modules/mining/lavaland/mining_loot/megafauna/hierophant.dm
index 38f51568544..fe03791baed 100644
--- a/code/modules/mining/lavaland/mining_loot/megafauna/hierophant.dm
+++ b/code/modules/mining/lavaland/mining_loot/megafauna/hierophant.dm
@@ -106,7 +106,7 @@
if (blink?.current_charges)
. += "hierophant_ready"
-/obj/item/hierophant_club/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/hierophant_club/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if (blink?.current_charges)
. += "hierophant_ready"
diff --git a/code/modules/mob/living/basic/drone/drone_tools.dm b/code/modules/mob/living/basic/drone/drone_tools.dm
index d1be8ab0cec..d7d88bd7f8c 100644
--- a/code/modules/mob/living/basic/drone/drone_tools.dm
+++ b/code/modules/mob/living/basic/drone/drone_tools.dm
@@ -49,7 +49,7 @@
greyscale_config = null
greyscale_colors = null
-/obj/item/screwdriver/drone/separate_worn_overlays(mutable_appearance/standing, mutable_appearance/draw_target, isinhands = FALSE, icon_file)
+/obj/item/screwdriver/drone/separate_worn_overlays(mutable_appearance/standing, mutable_appearance/draw_target, isinhands = FALSE, icon_file, bodyshape = NONE)
. = ..()
if(!isinhands)
return
diff --git a/code/modules/mob/living/carbon/carbon_update_icons.dm b/code/modules/mob/living/carbon/carbon_update_icons.dm
index 8561b2178ff..e4e5b079b74 100644
--- a/code/modules/mob/living/carbon/carbon_update_icons.dm
+++ b/code/modules/mob/living/carbon/carbon_update_icons.dm
@@ -399,21 +399,21 @@
/// 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(mutable_appearance/standing, isinhands = FALSE, icon_file)
+/obj/item/proc/worn_overlays(mutable_appearance/standing, isinhands = FALSE, icon_file, bodyshape = NONE)
SHOULD_CALL_PARENT(TRUE)
RETURN_TYPE(/list)
. = list()
if(blocks_emissive != EMISSIVE_BLOCK_NONE)
. += emissive_blocker(standing.icon, standing.icon_state, src)
- SEND_SIGNAL(src, COMSIG_ITEM_GET_WORN_OVERLAYS, ., standing, isinhands, icon_file)
+ SEND_SIGNAL(src, COMSIG_ITEM_GET_WORN_OVERLAYS, ., standing, isinhands, icon_file, bodyshape)
/// worn_overlays to use when you'd want to use KEEP_APART. Don't use KEEP_APART neither there nor here, as it would break floating overlays
-/obj/item/proc/separate_worn_overlays(mutable_appearance/standing, mutable_appearance/draw_target, isinhands = FALSE, icon_file)
+/obj/item/proc/separate_worn_overlays(mutable_appearance/standing, mutable_appearance/draw_target, isinhands = FALSE, icon_file, bodyshape = NONE)
SHOULD_CALL_PARENT(TRUE)
RETURN_TYPE(/list)
. = list()
- SEND_SIGNAL(src, COMSIG_ITEM_GET_SEPARATE_WORN_OVERLAYS, ., standing, draw_target, isinhands, icon_file)
+ SEND_SIGNAL(src, COMSIG_ITEM_GET_SEPARATE_WORN_OVERLAYS, ., standing, draw_target, isinhands, icon_file, bodyshape)
///Checks to see if any bodyparts need to be redrawn, then does so. update_limb_data = TRUE redraws the limbs to conform to the owner.
///Returns an integer representing the number of limbs that were updated.
diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm
index f22819057c6..eeaa717558b 100644
--- a/code/modules/mob/living/carbon/human/_species.dm
+++ b/code/modules/mob/living/carbon/human/_species.dm
@@ -28,7 +28,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
*/
var/plural_form
- ///Whether or not the race has sexual characteristics (biological genders). At the moment this is only FALSE for skeletons and shadows
+ /// Whether or not the race has sexual characteristics (biological genders). At the moment this is only FALSE for skeletons and shadows
var/sexes = TRUE
///The maximum number of bodyparts this species can have.
diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm
index adc59f11027..55fbb4cec72 100644
--- a/code/modules/mob/living/carbon/human/human_update_icons.dm
+++ b/code/modules/mob/living/carbon/human/human_update_icons.dm
@@ -93,13 +93,19 @@ There are several things that need to be remembered:
//"override_file = handled_by_bodyshape ? icon_file : null" MUST be added to the arguments of build_worn_icon()
//Friendly reminder that icon_exists_or_scream(file, state) is your friend when debugging this code.
var/handled_by_bodyshape = TRUE
+ var/digi = (bodyshape & BODYSHAPE_DIGITIGRADE)
var/icon_file
var/woman
+ var/female_sprite_flags = uniform.female_sprite_flags
//BEGIN SPECIES HANDLING
- if((bodyshape & BODYSHAPE_DIGITIGRADE) && (uniform.supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION))
+ if(digi && (uniform.supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION))
icon_file = DIGITIGRADE_UNIFORM_FILE
//Female sprites have lower priority than digitigrade sprites
- else if(dna.species.sexes && (bodyshape & BODYSHAPE_HUMANOID) && physique == FEMALE && !(uniform.female_sprite_flags & NO_FEMALE_UNIFORM)) //Agggggggghhhhh
+ var/chest_is_dimorphic
+ if(dna.species.sexes)
+ var/obj/item/bodypart/chest/our_chest = get_bodypart(BODY_ZONE_CHEST)
+ chest_is_dimorphic = our_chest.is_dimorphic
+ if(chest_is_dimorphic && (bodyshape & BODYSHAPE_HUMANOID) && physique == FEMALE && !(female_sprite_flags & NO_FEMALE_UNIFORM)) //Agggggggghhhhh
woman = TRUE
if(!icon_exists(icon_file, RESOLVE_ICON_STATE(uniform)))
@@ -111,7 +117,7 @@ There are several things that need to be remembered:
default_layer = UNIFORM_LAYER,
default_icon_file = icon_file,
isinhands = FALSE,
- female_uniform = woman ? uniform.female_sprite_flags : null,
+ female_uniform = woman ? female_sprite_flags : null,
override_state = target_overlay,
override_file = handled_by_bodyshape ? icon_file : null,
bodyshape = bodyshape,
@@ -301,7 +307,8 @@ There are several things that need to be remembered:
if(HAS_TRAIT(worn_item, TRAIT_NO_WORN_ICON) || (obscured_slots & HIDESUITSTORAGE))
return
- var/mutable_appearance/s_store_overlay = worn_item.build_worn_icon(default_layer = SUIT_STORE_LAYER, default_icon_file = 'icons/mob/clothing/belt_mirror.dmi')
+
+ var/mutable_appearance/s_store_overlay = worn_item.build_worn_icon(default_layer = SUIT_STORE_LAYER, default_icon_file = 'icons/mob/clothing/belt_mirror.dmi', bodyshape = bodyshape)
apply_height(s_store_overlay, ENTIRE_BODY)
var/obj/item/bodypart/chest/my_chest = get_bodypart(BODY_ZONE_CHEST)
my_chest?.worn_suit_storage_offset?.apply_offset(s_store_overlay)
@@ -430,12 +437,12 @@ There are several things that need to be remembered:
return hands
/// Modifies a sprite slightly to conform to female body shapes
-/proc/wear_female_version(icon_state, icon, type, greyscale_colors)
- var/index = "[icon_state]-[greyscale_colors]"
+/proc/wear_female_version(icon_state, icon_file_path, icon, type, greyscale_colors, bodyshape)
+ var/index = "[icon_file_path]-[icon_state]-[greyscale_colors]"
var/static/list/female_clothing_icons = list()
var/icon/female_clothing_icon = female_clothing_icons[index]
if(!female_clothing_icon) //Create standing/laying icons if they don't exist
- var/female_icon_state = "female[type == FEMALE_UNIFORM_FULL ? "_full" : ((!type || type & FEMALE_UNIFORM_TOP_ONLY) ? "_top" : "")][type & FEMALE_UNIFORM_NO_BREASTS ? "_no_breasts" : ""]"
+ var/female_icon_state = "female[type == FEMALE_UNIFORM_FULL ? "_full" : ((!type || type & FEMALE_UNIFORM_TOP_ONLY) || bodyshape & BODYSHAPE_DIGITIGRADE ? "_top" : "")][type & FEMALE_UNIFORM_NO_BREASTS ? "_no_breasts" : ""]"
var/icon/female_cropping_mask = icon('icons/mob/clothing/under/masking_helpers.dmi', female_icon_state)
female_clothing_icon = icon(icon, icon_state)
female_clothing_icon.Blend(female_cropping_mask, ICON_MULTIPLY)
@@ -444,24 +451,24 @@ There are several things that need to be remembered:
return icon(female_clothing_icon)
-/// Modifies a sprite to conform to digitigrade body shapes
-/proc/wear_digi_version(icon/base_icon, obj/item/item, key, greyscale_colors)
- ASSERT(istype(item), "wear_digi_version: no item passed")
- ASSERT(istext(key), "wear_digi_version: no key passed")
- if(isnull(greyscale_colors) || length(SSgreyscale.ParseColorString(greyscale_colors)) > 1)
- greyscale_colors = item.get_general_color(base_icon)
+/// Modifies a sprite to conform to custom body shapes
+/obj/item/proc/get_bodyshape_icon(icon/base_icon, key, bodyshape)
+ ASSERT(istext(key), "get_bodyshape_icon: no key passed")
+ if((bodyshape & BODYSHAPE_DIGITIGRADE) && (supports_variations_flags & CLOTHING_DIGITIGRADE_MASK))
+ if(isnull(greyscale_colors) || length(SSgreyscale.ParseColorString(greyscale_colors)) > 1)
+ greyscale_colors = get_general_color(base_icon)
- var/index = "[key]-[item.type]-[greyscale_colors]"
- var/static/list/digitigrade_clothing_cache = list()
- var/icon/resulting_icon = digitigrade_clothing_cache[index]
- if(!resulting_icon)
- resulting_icon = item.generate_digitigrade_icons(base_icon, greyscale_colors)
+ var/index = "[key]-[type]-[greyscale_colors]"
+ var/static/list/digitigrade_clothing_cache = list()
+ var/icon/resulting_icon = digitigrade_clothing_cache[index]
if(!resulting_icon)
- stack_trace("[item.type] is set to generate a masked digitigrade icon, but generate_digitigrade_icons was not implemented (or error'd).")
- return base_icon
- digitigrade_clothing_cache[index] = fcopy_rsc(resulting_icon)
+ resulting_icon = generate_digitigrade_icons(base_icon, greyscale_colors)
+ if(!resulting_icon)
+ stack_trace("[type] is set to generate a masked digitigrade icon, but generate_digitigrade_icons was not implemented (or error'd).")
+ return base_icon
+ digitigrade_clothing_cache[index] = fcopy_rsc(resulting_icon)
- return icon(resulting_icon)
+ return icon(resulting_icon)
/// Modifies a sprite to replace the legs with a new version
/proc/replace_icon_legs(icon/base_icon, icon/new_legs)
@@ -591,16 +598,17 @@ generate/load female uniform sprites matching all previously decided variables
if(female_uniform)
building_icon = wear_female_version(
icon_state = t_state,
+ icon_file_path = file2use,
icon = file2use,
type = female_uniform,
greyscale_colors = greyscale_colors,
+ bodyshape = bodyshape,
)
- if(!isinhands && (bodyshape & BODYSHAPE_DIGITIGRADE) && (supports_variations_flags & CLOTHING_DIGITIGRADE_MASK))
- building_icon = wear_digi_version(
+ if(!isinhands && (bodyshapes_with_variations & bodyshape))
+ building_icon = get_bodyshape_icon(
base_icon = building_icon || icon(file2use, t_state),
- item = src,
key = "[t_state]-[file2use]-[female_uniform]",
- greyscale_colors = greyscale_colors,
+ bodyshape = bodyshape,
)
if(building_icon)
draw_target = mutable_appearance(building_icon, layer = -layer2use)
@@ -609,7 +617,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(draw_target, isinhands, file2use)
+ var/list/worn_overlays = worn_overlays(draw_target, isinhands, file2use, bodyshape)
if(length(worn_overlays))
draw_target.overlays += worn_overlays
draw_target = color_atom_overlay(draw_target)
@@ -618,7 +626,7 @@ generate/load female uniform sprites matching all previously decided variables
// but KEEP_APART breaks float layering, so what we need to do is make fake KEEP_APART for us to use
var/mutable_appearance/standing = mutable_appearance(layer = -layer2use, appearance_flags = KEEP_TOGETHER)
standing.overlays += draw_target
- var/list/separate_overlays = separate_worn_overlays(standing, draw_target, isinhands, file2use)
+ var/list/separate_overlays = separate_worn_overlays(standing, draw_target, isinhands, file2use, bodyshape)
if(length(separate_overlays))
standing.overlays += separate_overlays
else // Don't nest overlays if there's nothing to nest against
diff --git a/code/modules/mod/mod_link.dm b/code/modules/mod/mod_link.dm
index 1ce9b43337f..966462f6809 100644
--- a/code/modules/mod/mod_link.dm
+++ b/code/modules/mod/mod_link.dm
@@ -260,7 +260,7 @@
balloon_alert(user, "frequency set")
. = ITEM_INTERACT_SUCCESS
-/obj/item/clothing/neck/link_scryer/worn_overlays(mutable_appearance/standing, isinhands)
+/obj/item/clothing/neck/link_scryer/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(!QDELETED(mod_link.link_call))
. += mutable_appearance('icons/mob/clothing/neck.dmi', "modlink_active")
diff --git a/code/modules/mod/mod_part.dm b/code/modules/mod/mod_part.dm
index a184df7f7a0..d74a6f24720 100644
--- a/code/modules/mod/mod_part.dm
+++ b/code/modules/mod/mod_part.dm
@@ -30,7 +30,7 @@
RegisterSignal(part_item, COMSIG_ITEM_GET_SEPARATE_WORN_OVERLAYS, PROC_REF(get_separate_worn_overlays))
// If we're overslotting an item, add its visual as an underlay
-/datum/mod_part/proc/get_separate_worn_overlays(obj/item/source, list/overlays, mutable_appearance/standing, mutable_appearance/draw_target, isinhands, icon_file)
+/datum/mod_part/proc/get_separate_worn_overlays(obj/item/source, list/overlays, mutable_appearance/standing, mutable_appearance/draw_target, isinhands, icon_file, bodyshape = NONE)
SIGNAL_HANDLER
if (!overslotting || sealed)
@@ -40,7 +40,7 @@
if (ismob(source.loc))
var/mob/as_mob = source.loc
checked_slot = as_mob.get_slot_by_item(source)
- var/mutable_appearance/worn_overlay = overslotting.build_worn_icon(default_layer = -draw_target.layer + 0.1, default_icon_file = get_default_icon_by_slot(checked_slot))
+ var/mutable_appearance/worn_overlay = overslotting.build_worn_icon(default_layer = -draw_target.layer + 0.1, default_icon_file = get_default_icon_by_slot(checked_slot), bodyshape = bodyshape)
for (var/mutable_appearance/overlay in worn_overlay.overlays)
overlay.layer = draw_target.layer + 0.1
overlays += worn_overlay
diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm
index 432a2676653..a6d812f462b 100644
--- a/code/modules/mod/modules/_module.dm
+++ b/code/modules/mod/modules/_module.dm
@@ -381,7 +381,7 @@
qdel(src)
/// Adds the worn overlays to the suit.
-/obj/item/mod/module/proc/add_module_overlay(obj/item/source, list/overlays, mutable_appearance/standing, mutable_appearance/draw_target, isinhands, icon_file)
+/obj/item/mod/module/proc/add_module_overlay(obj/item/source, list/overlays, mutable_appearance/standing, mutable_appearance/draw_target, isinhands, icon_file, bodyshape = NONE)
SIGNAL_HANDLER
if (isinhands)
diff --git a/code/modules/reagents/reagent_containers/jerrycan.dm b/code/modules/reagents/reagent_containers/jerrycan.dm
index 2d8ff258340..b92dc7ec85c 100644
--- a/code/modules/reagents/reagent_containers/jerrycan.dm
+++ b/code/modules/reagents/reagent_containers/jerrycan.dm
@@ -85,7 +85,7 @@
if(cap_type)
. += mutable_appearance(icon, "[base_icon_state]_cap_[cap_type]")
-/obj/item/reagent_containers/cup/jerrycan/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+/obj/item/reagent_containers/cup/jerrycan/worn_overlays(mutable_appearance/standing, isinhands, icon_file, bodyshape = NONE)
. = ..()
if(!isinhands)
return