From aa24e619d0bb7ddd7224f01deb2ee77da633a69f Mon Sep 17 00:00:00 2001 From: MrMelbert Date: Mon, 11 May 2026 01:44:55 -0500 Subject: [PATCH 1/8] Mesh tails --- code/__DEFINES/bodyparts.dm | 9 ++- .../bodypart_overlays/bodypart_overlay.dm | 2 +- .../texture_bodypart_overlay.dm | 35 +++++++-- .../clothing/spacesuits/_spacesuits.dm | 1 + code/modules/mod/mod_clothes.dm | 1 + code/modules/surgery/organs/external/tails.dm | 12 +++ maplestation.dme | 1 + .../elements/equipment_bodypart_overlay.dm | 71 ++++++++++++++++++ .../icons/mob/clothing/tail_suit_mask.dmi | Bin 0 -> 258 bytes 9 files changed, 122 insertions(+), 10 deletions(-) create mode 100644 maplestation_modules/code/datums/elements/equipment_bodypart_overlay.dm create mode 100644 maplestation_modules/icons/mob/clothing/tail_suit_mask.dmi diff --git a/code/__DEFINES/bodyparts.dm b/code/__DEFINES/bodyparts.dm index c36eeda76dee..1ca1aebcfe29 100644 --- a/code/__DEFINES/bodyparts.dm +++ b/code/__DEFINES/bodyparts.dm @@ -50,10 +50,11 @@ // #define LIMB_COLOR_VOIDWALKER_CURSE 50 // // Overlay priorities -// #define BODYPART_OVERLAY_FISH_INFUSION 1 -// #define BODYPART_OVERLAY_CARP_INFUSION 2 -// #define BODYPART_OVERLAY_CSS_SUICIDE 3 -// #define BODYPART_OVERLAY_VOIDWALKER_CURSE 4 +#define BODYPART_OVERLAY_SPACESUIT_MESH 1 +#define BODYPART_OVERLAY_FISH_INFUSION 2 +#define BODYPART_OVERLAY_CARP_INFUSION 3 +#define BODYPART_OVERLAY_CSS_SUICIDE 4 +#define BODYPART_OVERLAY_VOIDWALKER_CURSE 5 // Bodypart surgery state /// An incision has been made into the skin diff --git a/code/datums/bodypart_overlays/bodypart_overlay.dm b/code/datums/bodypart_overlays/bodypart_overlay.dm index 65559f2924b1..1d6020103603 100644 --- a/code/datums/bodypart_overlays/bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/bodypart_overlay.dm @@ -81,5 +81,5 @@ return list() /// Additionally color or texture the limb -/datum/bodypart_overlay/proc/modify_bodypart_appearance(datum/appearance) +/datum/bodypart_overlay/proc/modify_bodypart_appearance(image/appearance) return diff --git a/code/datums/bodypart_overlays/texture_bodypart_overlay.dm b/code/datums/bodypart_overlays/texture_bodypart_overlay.dm index 9b66acfbcf0f..e1f4770b1761 100644 --- a/code/datums/bodypart_overlays/texture_bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/texture_bodypart_overlay.dm @@ -13,7 +13,7 @@ . = ..() cached_texture_icon = icon(texture_icon, texture_icon_state) -/datum/bodypart_overlay/texture/modify_bodypart_appearance(datum/appearance) +/datum/bodypart_overlay/texture/modify_bodypart_appearance(image/appearance) appearance.add_filter("bodypart_texture_[texture_icon_state]", 1, layering_filter(icon = cached_texture_icon, blend_mode = BLEND_INSET_OVERLAY)) /datum/bodypart_overlay/texture/generate_icon_cache() @@ -29,19 +29,44 @@ blocks_emissive = EMISSIVE_BLOCK_NONE texture_icon_state = "spacey" texture_icon = 'icons/mob/human/textures.dmi' - // overlay_priority = BODYPART_OVERLAY_VOIDWALKER_CURSE + overlay_priority = BODYPART_OVERLAY_VOIDWALKER_CURSE /datum/bodypart_overlay/texture/carpskin texture_icon_state = "carpskin" texture_icon = 'icons/mob/human/textures.dmi' - // overlay_priority = BODYPART_OVERLAY_CARP_INFUSION + overlay_priority = BODYPART_OVERLAY_CARP_INFUSION /datum/bodypart_overlay/texture/checkered texture_icon_state = "checkered" texture_icon = 'icons/mob/human/textures.dmi' - // overlay_priority = BODYPART_OVERLAY_CSS_SUICIDE + overlay_priority = BODYPART_OVERLAY_CSS_SUICIDE /datum/bodypart_overlay/texture/fishscale texture_icon_state = "fishscale" texture_icon = 'icons/mob/human/textures.dmi' - // overlay_priority = BODYPART_OVERLAY_FISH_INFUSION + overlay_priority = BODYPART_OVERLAY_FISH_INFUSION + +/datum/bodypart_overlay/texture/spacesuit_mesh + texture_icon_state = "mesh_mask" + texture_icon = 'maplestation_modules/icons/mob/clothing/tail_suit_mask.dmi' + overlay_priority = BODYPART_OVERLAY_SPACESUIT_MESH + + var/displacement_icon_state = "mesh_mask_displacement" + var/displacement_icon = 'maplestation_modules/icons/mob/clothing/tail_suit_mask.dmi' + var/cached_displacement_icon + +/datum/bodypart_overlay/texture/spacesuit_mesh/New() + . = ..() + cached_displacement_icon = icon(displacement_icon, displacement_icon_state) + +/datum/bodypart_overlay/texture/spacesuit_mesh/modify_bodypart_appearance(image/appearance) + // only modifies other bodypart overlays + if(!mutant_bodyparts_layertext(appearance.layer)) + return + . = ..() + // adds a displacement map so the outline lines up with the bottom of the sprite + appearance.add_filter("displacement", 2, displacement_map_filter(cached_displacement_icon, size = 1)) + // adds an outline so the texture doesn't end abruptly + appearance.add_filter("outline", 3, outline_filter(1, COLOR_NEARLY_ALL_BLACK, OUTLINE_SHARP)) + // forces white (blends better with the texture) + appearance.color = COLOR_WHITE diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index c6a07d3eb139..c00a4e0f0bbc 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -99,6 +99,7 @@ if(fishing_modifier) AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier) + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_CHEST, /datum/bodypart_overlay/texture/spacesuit_mesh) /// Start Processing on the space suit when it is worn to heat the wearer /obj/item/clothing/suit/space/equipped(mob/living/user, slot) diff --git a/code/modules/mod/mod_clothes.dm b/code/modules/mod/mod_clothes.dm index a62aed8f0de5..223f83f65f29 100644 --- a/code/modules/mod/mod_clothes.dm +++ b/code/modules/mod/mod_clothes.dm @@ -38,6 +38,7 @@ /obj/item/clothing/suit/mod/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NO_SPEED_POTION, INNATE_TRAIT) + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_CHEST, /datum/bodypart_overlay/texture/spacesuit_mesh) /obj/item/clothing/gloves/mod name = "MOD gauntlets" diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm index 8aec8d47329e..770d45df2b44 100644 --- a/code/modules/surgery/organs/external/tails.dm +++ b/code/modules/surgery/organs/external/tails.dm @@ -201,10 +201,22 @@ ///Lizard tail bodypart overlay datum /datum/bodypart_overlay/mutant/tail/lizard feature_key = "tail_lizard" + /// Items that make the tail look like it's in a mesh rather than hidden + var/list/net_suits = list( + /obj/item/clothing/suit/space, + /obj/item/clothing/suit/mod, + ) /datum/bodypart_overlay/mutant/tail/lizard/get_global_feature_list() return SSaccessories.tails_list_lizard +/datum/bodypart_overlay/mutant/tail/lizard/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner) + if(!(bodypart_owner.owner?.obscured_slots & HIDEJUMPSUIT)) + return TRUE + if(locate(/datum/bodypart_overlay/texture/spacesuit_mesh) in bodypart_owner.bodypart_overlays) + return TRUE + return FALSE + /obj/item/organ/tail/lizard/fake name = "fabricated lizard tail" desc = "A fabricated severed lizard tail. This one's made of synthflesh. Probably not usable for lizard wine." diff --git a/maplestation.dme b/maplestation.dme index a96b99fc2964..b65a0cdddaa1 100644 --- a/maplestation.dme +++ b/maplestation.dme @@ -6304,6 +6304,7 @@ #include "maplestation_modules\code\datums\diseases\disease_resistance.dm" #include "maplestation_modules\code\datums\elements\bodypart_sprint_buff.dm" #include "maplestation_modules\code\datums\elements\digitigrade_limb.dm" +#include "maplestation_modules\code\datums\elements\equipment_bodypart_overlay.dm" #include "maplestation_modules\code\datums\elements\fire_patting_item.dm" #include "maplestation_modules\code\datums\elements\glove_slapper.dm" #include "maplestation_modules\code\datums\elements\rip_off_able.dm" diff --git a/maplestation_modules/code/datums/elements/equipment_bodypart_overlay.dm b/maplestation_modules/code/datums/elements/equipment_bodypart_overlay.dm new file mode 100644 index 000000000000..e07f1093f0d5 --- /dev/null +++ b/maplestation_modules/code/datums/elements/equipment_bodypart_overlay.dm @@ -0,0 +1,71 @@ +/datum/element/equipment_bodypart_overlay + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + + var/body_zone + var/bodypart_overlay_type + +/datum/element/equipment_bodypart_overlay/Attach(datum/target, body_zone, bodypart_overlay_type) + . = ..() + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE + + src.body_zone = body_zone + src.bodypart_overlay_type = bodypart_overlay_type + + var/obj/item/target_item = target + RegisterSignal(target_item, COMSIG_ITEM_EQUIPPED, PROC_REF(item_equipped)) + RegisterSignal(target_item, COMSIG_ITEM_DROPPED, PROC_REF(item_dropped)) + if(isliving(target_item.loc)) + var/mob/living/wearer = target_item.loc + item_equipped(target_item, wearer, wearer.get_slot_by_item(target_item)) + +/datum/element/equipment_bodypart_overlay/Detach(datum/source, ...) + . = ..() + var/obj/item/target_item = source + UnregisterSignal(target_item, COMSIG_ITEM_EQUIPPED) + UnregisterSignal(target_item, COMSIG_ITEM_DROPPED) + if(isliving(target_item.loc)) + var/mob/living/wearer = target_item.loc + item_dropped(target_item, wearer) + +/datum/element/equipment_bodypart_overlay/proc/item_equipped(obj/item/equipped_item, mob/living/carbon/equipper, slot) + SIGNAL_HANDLER + + if(!(slot & equipped_item.slot_flags)) + return + + var/obj/item/bodypart/affected_bodypart = equipper.get_bodypart(body_zone) + if(isnull(affected_bodypart)) + return + if(locate(bodypart_overlay_type) in affected_bodypart.bodypart_overlays) + return + + affected_bodypart.add_bodypart_overlay(new bodypart_overlay_type) + RegisterSignal(equipper, COMSIG_CARBON_POST_REMOVE_LIMB, PROC_REF(limb_removed)) + RegisterSignal(equipper, COMSIG_CARBON_POST_ATTACH_LIMB, PROC_REF(limb_added)) + +/datum/element/equipment_bodypart_overlay/proc/item_dropped(obj/item/dropped_item, mob/living/carbon/dropper) + SIGNAL_HANDLER + + var/obj/item/bodypart/affected_bodypart = dropper.get_bodypart(body_zone) + if(isnull(affected_bodypart)) + return + + var/datum/bodypart_overlay/overlay_to_remove = locate(bodypart_overlay_type) in affected_bodypart.bodypart_overlays + if(!isnull(overlay_to_remove)) + affected_bodypart.remove_bodypart_overlay(overlay_to_remove) + UnregisterSignal(dropper, COMSIG_CARBON_POST_REMOVE_LIMB) + UnregisterSignal(dropper, COMSIG_CARBON_POST_ATTACH_LIMB) + +/datum/element/equipment_bodypart_overlay/proc/limb_removed(mob/living/carbon/limb_owner, obj/item/bodypart/removed_limb) + SIGNAL_HANDLER + + var/datum/bodypart_overlay/overlay_to_remove = locate(bodypart_overlay_type) in removed_limb.bodypart_overlays + if(!isnull(overlay_to_remove)) + removed_limb.remove_bodypart_overlay(overlay_to_remove) + +/datum/element/equipment_bodypart_overlay/proc/limb_added(mob/living/carbon/limb_owner, obj/item/bodypart/added_limb) + SIGNAL_HANDLER + + added_limb.add_bodypart_overlay(new bodypart_overlay_type) diff --git a/maplestation_modules/icons/mob/clothing/tail_suit_mask.dmi b/maplestation_modules/icons/mob/clothing/tail_suit_mask.dmi new file mode 100644 index 0000000000000000000000000000000000000000..7c536b2e4db38e57c8d60320d1a219fab11d475c GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH#0(_wf1V}|q<8{+LR=3VI3Ob2f^@*0Z zuGYCT=Yuzd8eBAf@JQ#pkLF2+qMqIz7REuwmyNv?<~*8oWKxJiu%`J|3uQa=jTX_J z-Nve$S4e22oj5u(YzoH|hRued$Cjsvi9bv#Ad*EnD;8)pMpYK?cqs-NLsE zk{E$5k@9qL4AGdFJcE;!$3TFKwV*LjR5{>iy#@ortnRv>3m&u_0IFi}boFyt=akR{ E09#01!2kdN literal 0 HcmV?d00001 From 4df374bc7a83a9dde5628d708f5239010712ea59 Mon Sep 17 00:00:00 2001 From: MrMelbert Date: Mon, 11 May 2026 01:49:57 -0500 Subject: [PATCH 2/8] Fix --- .../icons/mob/clothing/tail_suit_mask.dmi | Bin 258 -> 258 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/maplestation_modules/icons/mob/clothing/tail_suit_mask.dmi b/maplestation_modules/icons/mob/clothing/tail_suit_mask.dmi index 7c536b2e4db38e57c8d60320d1a219fab11d475c..328e78aa6d2962c8be44decbbebd822142a4ef4f 100644 GIT binary patch delta 17 YcmZo-YGRsT#NP0q!EVk*#fg?D0W`V>kN^Mx delta 17 ZcmZo-YGRsT#Ln=a;r_~13nyBh1OPTn2R8r! From d1f59ab1f4d06f2f9ef97be9a201c8a31b2f9463 Mon Sep 17 00:00:00 2001 From: MrMelbert Date: Mon, 11 May 2026 01:58:14 -0500 Subject: [PATCH 3/8] Helmets --- code/modules/clothing/spacesuits/_spacesuits.dm | 1 + code/modules/mod/mod_clothes.dm | 5 +---- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index c00a4e0f0bbc..d1a79a477465 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -38,6 +38,7 @@ if(fishing_modifier) AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier) add_stabilizer() + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_HEAD, /datum/bodypart_overlay/texture/spacesuit_mesh) /obj/item/clothing/head/helmet/space/proc/add_stabilizer(loose_hat = TRUE) AddComponent(/datum/component/hat_stabilizer, loose_hat = loose_hat) diff --git a/code/modules/mod/mod_clothes.dm b/code/modules/mod/mod_clothes.dm index 223f83f65f29..9f1ea4c8b846 100644 --- a/code/modules/mod/mod_clothes.dm +++ b/code/modules/mod/mod_clothes.dm @@ -11,10 +11,7 @@ /obj/item/clothing/head/mod/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NO_SPEED_POTION, INNATE_TRAIT) - -// Even without a hat stabilizer, hats can be worn - however, they'll fall off very easily -/obj/item/clothing/head/mod/Initialize(mapload) - . = ..() + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_HEAD, /datum/bodypart_overlay/texture/spacesuit_mesh) AddComponent(/datum/component/hat_stabilizer, loose_hat = TRUE) /obj/item/clothing/suit/mod From f69a9e881f0478e5e2bbe770921bf0d85876811c Mon Sep 17 00:00:00 2001 From: MrMelbert Date: Mon, 11 May 2026 02:18:39 -0500 Subject: [PATCH 4/8] Biosuits --- code/__DEFINES/bodyparts.dm | 2 +- .../texture_bodypart_overlay.dm | 20 +++++++++++++----- .../clothing/spacesuits/_spacesuits.dm | 4 ++-- code/modules/clothing/suits/bio.dm | 2 ++ code/modules/clothing/suits/utility.dm | 8 +++++++ code/modules/mod/mod_clothes.dm | 4 ++-- code/modules/surgery/organs/external/tails.dm | 7 +----- .../icons/mob/clothing/tail_suit_mask.dmi | Bin 258 -> 291 bytes 8 files changed, 31 insertions(+), 16 deletions(-) diff --git a/code/__DEFINES/bodyparts.dm b/code/__DEFINES/bodyparts.dm index 1ca1aebcfe29..e172662d6fed 100644 --- a/code/__DEFINES/bodyparts.dm +++ b/code/__DEFINES/bodyparts.dm @@ -50,7 +50,7 @@ // #define LIMB_COLOR_VOIDWALKER_CURSE 50 // // Overlay priorities -#define BODYPART_OVERLAY_SPACESUIT_MESH 1 +#define BODYPART_OVERLAY_MESH 1 #define BODYPART_OVERLAY_FISH_INFUSION 2 #define BODYPART_OVERLAY_CARP_INFUSION 3 #define BODYPART_OVERLAY_CSS_SUICIDE 4 diff --git a/code/datums/bodypart_overlays/texture_bodypart_overlay.dm b/code/datums/bodypart_overlays/texture_bodypart_overlay.dm index e1f4770b1761..67b53a8a55e6 100644 --- a/code/datums/bodypart_overlays/texture_bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/texture_bodypart_overlay.dm @@ -46,20 +46,22 @@ texture_icon = 'icons/mob/human/textures.dmi' overlay_priority = BODYPART_OVERLAY_FISH_INFUSION -/datum/bodypart_overlay/texture/spacesuit_mesh +/datum/bodypart_overlay/texture/mesh texture_icon_state = "mesh_mask" texture_icon = 'maplestation_modules/icons/mob/clothing/tail_suit_mask.dmi' - overlay_priority = BODYPART_OVERLAY_SPACESUIT_MESH + overlay_priority = BODYPART_OVERLAY_MESH var/displacement_icon_state = "mesh_mask_displacement" var/displacement_icon = 'maplestation_modules/icons/mob/clothing/tail_suit_mask.dmi' var/cached_displacement_icon -/datum/bodypart_overlay/texture/spacesuit_mesh/New() + var/outline_color = "#080808" + +/datum/bodypart_overlay/texture/mesh/New() . = ..() cached_displacement_icon = icon(displacement_icon, displacement_icon_state) -/datum/bodypart_overlay/texture/spacesuit_mesh/modify_bodypart_appearance(image/appearance) +/datum/bodypart_overlay/texture/mesh/modify_bodypart_appearance(image/appearance) // only modifies other bodypart overlays if(!mutant_bodyparts_layertext(appearance.layer)) return @@ -67,6 +69,14 @@ // adds a displacement map so the outline lines up with the bottom of the sprite appearance.add_filter("displacement", 2, displacement_map_filter(cached_displacement_icon, size = 1)) // adds an outline so the texture doesn't end abruptly - appearance.add_filter("outline", 3, outline_filter(1, COLOR_NEARLY_ALL_BLACK, OUTLINE_SHARP)) + appearance.add_filter("outline", 3, outline_filter(1, outline_color, OUTLINE_SHARP)) // forces white (blends better with the texture) appearance.color = COLOR_WHITE + +/datum/bodypart_overlay/texture/mesh/black + texture_icon_state = "mesh_mask" + outline_color = "#080808" + +/datum/bodypart_overlay/texture/mesh/white + texture_icon_state = "mesh_mask_white" + outline_color = "#B2B2B2" diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index d1a79a477465..88f89077c7c4 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -38,7 +38,7 @@ if(fishing_modifier) AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier) add_stabilizer() - AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_HEAD, /datum/bodypart_overlay/texture/spacesuit_mesh) + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_HEAD, /datum/bodypart_overlay/texture/mesh/black) /obj/item/clothing/head/helmet/space/proc/add_stabilizer(loose_hat = TRUE) AddComponent(/datum/component/hat_stabilizer, loose_hat = loose_hat) @@ -100,7 +100,7 @@ if(fishing_modifier) AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier) - AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_CHEST, /datum/bodypart_overlay/texture/spacesuit_mesh) + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_CHEST, /datum/bodypart_overlay/texture/mesh/black) /// Start Processing on the space suit when it is worn to heat the wearer /obj/item/clothing/suit/space/equipped(mob/living/user, slot) diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index a14b3fcd77bd..2a3e62cad9e5 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -20,6 +20,7 @@ AddComponent(/datum/component/clothing_dirt, dirt_state) AddComponent(/datum/component/adjust_fishing_difficulty, 6) AddComponent(/datum/component/hat_stabilizer, loose_hat = TRUE) + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_HEAD, /datum/bodypart_overlay/texture/mesh/white) /datum/armor/head_bio_hood bio = 100 @@ -47,6 +48,7 @@ /obj/item/clothing/suit/bio_suit/Initialize(mapload) . = ..() AddComponent(/datum/component/adjust_fishing_difficulty, 6) + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_CHEST, /datum/bodypart_overlay/texture/mesh/white) //Standard biosuit, orange stripe /datum/armor/suit_bio_suit diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index ad094edcace2..bf01dffc7933 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -98,11 +98,14 @@ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF resistance_flags = NONE + var/texture_type = /datum/bodypart_overlay/texture/mesh/white + /obj/item/clothing/head/utility/bomb_hood/Initialize(mapload) . = ..() AddComponent(/datum/component/clothing_dirt, "bomb_dirt") AddComponent(/datum/component/adjust_fishing_difficulty, 8) AddComponent(/datum/component/hat_stabilizer, loose_hat = TRUE) + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_HEAD, texture_type) /datum/armor/utility_bomb_hood melee = 20 @@ -130,9 +133,12 @@ equip_delay_other = 70 resistance_flags = NONE + var/texture_type = /datum/bodypart_overlay/texture/mesh/white + /obj/item/clothing/suit/utility/bomb_suit/Initialize(mapload) . = ..() AddComponent(/datum/component/adjust_fishing_difficulty, 8) + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_CHEST, texture_type) /datum/armor/utility_bomb_suit melee = 20 @@ -146,11 +152,13 @@ /obj/item/clothing/head/utility/bomb_hood/security icon_state = "bombsuit_sec" inhand_icon_state = null + texture_type = /datum/bodypart_overlay/texture/mesh/black /obj/item/clothing/suit/utility/bomb_suit/security icon_state = "bombsuit_sec" inhand_icon_state = null allowed = list(/obj/item/gun/energy, /obj/item/melee/baton, /obj/item/restraints/handcuffs) + texture_type = /datum/bodypart_overlay/texture/mesh/black /obj/item/clothing/head/utility/bomb_hood/white icon_state = "bombsuit_white" diff --git a/code/modules/mod/mod_clothes.dm b/code/modules/mod/mod_clothes.dm index 9f1ea4c8b846..7d326a7cf648 100644 --- a/code/modules/mod/mod_clothes.dm +++ b/code/modules/mod/mod_clothes.dm @@ -11,7 +11,7 @@ /obj/item/clothing/head/mod/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NO_SPEED_POTION, INNATE_TRAIT) - AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_HEAD, /datum/bodypart_overlay/texture/spacesuit_mesh) + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_HEAD, /datum/bodypart_overlay/texture/mesh/black) AddComponent(/datum/component/hat_stabilizer, loose_hat = TRUE) /obj/item/clothing/suit/mod @@ -35,7 +35,7 @@ /obj/item/clothing/suit/mod/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NO_SPEED_POTION, INNATE_TRAIT) - AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_CHEST, /datum/bodypart_overlay/texture/spacesuit_mesh) + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_CHEST, /datum/bodypart_overlay/texture/mesh/black) /obj/item/clothing/gloves/mod name = "MOD gauntlets" diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm index 770d45df2b44..fc295926f6e4 100644 --- a/code/modules/surgery/organs/external/tails.dm +++ b/code/modules/surgery/organs/external/tails.dm @@ -201,11 +201,6 @@ ///Lizard tail bodypart overlay datum /datum/bodypart_overlay/mutant/tail/lizard feature_key = "tail_lizard" - /// Items that make the tail look like it's in a mesh rather than hidden - var/list/net_suits = list( - /obj/item/clothing/suit/space, - /obj/item/clothing/suit/mod, - ) /datum/bodypart_overlay/mutant/tail/lizard/get_global_feature_list() return SSaccessories.tails_list_lizard @@ -213,7 +208,7 @@ /datum/bodypart_overlay/mutant/tail/lizard/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner) if(!(bodypart_owner.owner?.obscured_slots & HIDEJUMPSUIT)) return TRUE - if(locate(/datum/bodypart_overlay/texture/spacesuit_mesh) in bodypart_owner.bodypart_overlays) + if(locate(/datum/bodypart_overlay/texture/mesh) in bodypart_owner.bodypart_overlays) return TRUE return FALSE diff --git a/maplestation_modules/icons/mob/clothing/tail_suit_mask.dmi b/maplestation_modules/icons/mob/clothing/tail_suit_mask.dmi index 328e78aa6d2962c8be44decbbebd822142a4ef4f..f8744a8ebe68e2762f76616ed8e2e73eb2f753d7 100644 GIT binary patch delta 176 zcmZo-TFf*-+{S^0nSp^J!ae6LkP;2>32{Ae;DC&b%#R;G?%uttsi_I%HvDJ!%+h~xV`uWeg=&> zHtzF(opA!H*7kI94DskpE^uK!mC@iRz$>wsu`N*8%~!%SamOqJF1Ldk5*rnGc^8~! ZW(cfXm&khH?*^bY22WQ%mvv4FO#mlHJSG4D delta 143 zcmZ3?)WkGF+*pB$nSp`f{^x1pK#C{8C&cx@fdeu!GMbv24gVSJ=4@01iZhl3`2{mL zJiCzwsPQp9>ze9000f@O1TaS?83{1ON}WFeLy0 From da041321282987a738302f47ef25979a399f8d4f Mon Sep 17 00:00:00 2001 From: MrMelbert Date: Mon, 11 May 2026 16:48:23 -0500 Subject: [PATCH 5/8] Tweak --- code/modules/surgery/organs/external/tails.dm | 21 +++++++++++-------- .../human/ornithid_features/avian_tails.dm | 2 +- .../human/species_types/animid/animid_fish.dm | 1 + 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm index fc295926f6e4..9f3efbb43eb8 100644 --- a/code/modules/surgery/organs/external/tails.dm +++ b/code/modules/surgery/organs/external/tails.dm @@ -144,14 +144,23 @@ ///Tail parent type, with wagging functionality /datum/bodypart_overlay/mutant/tail layers = EXTERNAL_FRONT|EXTERNAL_BEHIND - var/wagging = FALSE dyable = TRUE + /// Tracks if it's currently wagging or not + var/wagging = FALSE + /// If TRUE the tail is shown when over supported suits like space suits + var/mesh_in_suits = FALSE /datum/bodypart_overlay/mutant/tail/get_base_icon_state() return "[wagging ? "wagging_" : ""][sprite_datum.icon_state]" //add the wagging tag if we be wagging /datum/bodypart_overlay/mutant/tail/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner) - return !(bodypart_owner.owner?.obscured_slots & HIDEJUMPSUIT) + if(!(bodypart_owner.owner?.obscured_slots & HIDEJUMPSUIT)) + return TRUE + if(!mesh_in_suits) + return FALSE + if(locate(/datum/bodypart_overlay/texture/mesh) in bodypart_owner.bodypart_overlays) + return TRUE + return FALSE /obj/item/organ/tail/cat name = "cat tail" @@ -197,6 +206,7 @@ wag_flags = WAG_ABLE dna_block = DNA_LIZARD_TAIL_BLOCK + mesh_in_suits = TRUE ///Lizard tail bodypart overlay datum /datum/bodypart_overlay/mutant/tail/lizard @@ -205,13 +215,6 @@ /datum/bodypart_overlay/mutant/tail/lizard/get_global_feature_list() return SSaccessories.tails_list_lizard -/datum/bodypart_overlay/mutant/tail/lizard/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner) - if(!(bodypart_owner.owner?.obscured_slots & HIDEJUMPSUIT)) - return TRUE - if(locate(/datum/bodypart_overlay/texture/mesh) in bodypart_owner.bodypart_overlays) - return TRUE - return FALSE - /obj/item/organ/tail/lizard/fake name = "fabricated lizard tail" desc = "A fabricated severed lizard tail. This one's made of synthflesh. Probably not usable for lizard wine." diff --git a/maplestation_modules/code/modules/mob/living/carbon/human/ornithid_features/avian_tails.dm b/maplestation_modules/code/modules/mob/living/carbon/human/ornithid_features/avian_tails.dm index d9f4b7bde097..632be7e06685 100644 --- a/maplestation_modules/code/modules/mob/living/carbon/human/ornithid_features/avian_tails.dm +++ b/maplestation_modules/code/modules/mob/living/carbon/human/ornithid_features/avian_tails.dm @@ -13,6 +13,7 @@ feature_key = "tail_avian" layers = EXTERNAL_BEHIND | EXTERNAL_FRONT color_source = ORGAN_COLOR_OVERRIDE + mesh_in_suits = TRUE /datum/bodypart_overlay/mutant/tail/avian/get_global_feature_list() return SSaccessories.tails_list_avian @@ -21,7 +22,6 @@ draw_color = ownerlimb?.owner?.dna?.features["feathers"] || "#FFFFFF" return TRUE - /datum/sprite_accessory/tails/avian icon = 'maplestation_modules/icons/mob/ornithidfeatures.dmi' diff --git a/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_fish.dm b/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_fish.dm index b6aac951227b..b87d77a135d4 100644 --- a/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_fish.dm +++ b/maplestation_modules/code/modules/mob/living/carbon/human/species_types/animid/animid_fish.dm @@ -130,6 +130,7 @@ /datum/bodypart_overlay/mutant/tail/fish feature_key = "fish_tail" color_source = ORGAN_COLOR_OVERRIDE + mesh_in_suits = TRUE /datum/bodypart_overlay/mutant/tail/fish/override_color(obj/item/bodypart/bodypart_owner) //If the owner uses mutant colors, inherit the color of the bodypart From beb6f4d9d644648be742869732ac56ef1c0d5791 Mon Sep 17 00:00:00 2001 From: MrMelbert Date: Mon, 11 May 2026 21:39:31 -0500 Subject: [PATCH 6/8] Tweaks --- code/__DEFINES/bodyparts.dm | 10 +++---- .../markings_bodypart_overlay.dm | 2 +- .../texture_bodypart_overlay.dm | 28 ++++++++++++++++-- code/modules/clothing/suits/bio.dm | 9 ++++-- code/modules/surgery/bodyparts/_bodyparts.dm | 2 +- code/modules/surgery/organs/external/tails.dm | 2 +- .../icons/mob/clothing/tail_suit_mask.dmi | Bin 291 -> 345 bytes 7 files changed, 40 insertions(+), 13 deletions(-) diff --git a/code/__DEFINES/bodyparts.dm b/code/__DEFINES/bodyparts.dm index e172662d6fed..e5d7181fd3cd 100644 --- a/code/__DEFINES/bodyparts.dm +++ b/code/__DEFINES/bodyparts.dm @@ -50,11 +50,11 @@ // #define LIMB_COLOR_VOIDWALKER_CURSE 50 // // Overlay priorities -#define BODYPART_OVERLAY_MESH 1 -#define BODYPART_OVERLAY_FISH_INFUSION 2 -#define BODYPART_OVERLAY_CARP_INFUSION 3 -#define BODYPART_OVERLAY_CSS_SUICIDE 4 -#define BODYPART_OVERLAY_VOIDWALKER_CURSE 5 +#define BODYPART_OVERLAY_FISH_INFUSION 1 +#define BODYPART_OVERLAY_CARP_INFUSION 2 +#define BODYPART_OVERLAY_CSS_SUICIDE 3 +#define BODYPART_OVERLAY_VOIDWALKER_CURSE 4 +#define BODYPART_OVERLAY_MESH 5 // Bodypart surgery state /// An incision has been made into the skin diff --git a/code/datums/bodypart_overlays/markings_bodypart_overlay.dm b/code/datums/bodypart_overlays/markings_bodypart_overlay.dm index ecc7e13c2f90..39dcd6185f18 100644 --- a/code/datums/bodypart_overlays/markings_bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/markings_bodypart_overlay.dm @@ -35,7 +35,7 @@ . += use_gender . += draw_color -/datum/bodypart_overlay/simple/body_marking/can_draw_on_bodypart(mob/living/carbon/human/human) +/datum/bodypart_overlay/simple/body_marking/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner) return icon_state != SPRITE_ACCESSORY_NONE /datum/bodypart_overlay/simple/body_marking/get_image(layer, obj/item/bodypart/limb) diff --git a/code/datums/bodypart_overlays/texture_bodypart_overlay.dm b/code/datums/bodypart_overlays/texture_bodypart_overlay.dm index 67b53a8a55e6..63eac4c78b33 100644 --- a/code/datums/bodypart_overlays/texture_bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/texture_bodypart_overlay.dm @@ -50,11 +50,14 @@ texture_icon_state = "mesh_mask" texture_icon = 'maplestation_modules/icons/mob/clothing/tail_suit_mask.dmi' overlay_priority = BODYPART_OVERLAY_MESH - + /// Icon state for displacement map that comes with the texture var/displacement_icon_state = "mesh_mask_displacement" + /// Icon file for the displacement map that comes with the texture. var/displacement_icon = 'maplestation_modules/icons/mob/clothing/tail_suit_mask.dmi' + /// Cache the displacement icon so we dont have to make a new one each time var/cached_displacement_icon + /// Color used for the outline filter var/outline_color = "#080808" /datum/bodypart_overlay/texture/mesh/New() @@ -62,9 +65,9 @@ cached_displacement_icon = icon(displacement_icon, displacement_icon_state) /datum/bodypart_overlay/texture/mesh/modify_bodypart_appearance(image/appearance) - // only modifies other bodypart overlays - if(!mutant_bodyparts_layertext(appearance.layer)) + if(!should_modify(appearance)) return + . = ..() // adds a displacement map so the outline lines up with the bottom of the sprite appearance.add_filter("displacement", 2, displacement_map_filter(cached_displacement_icon, size = 1)) @@ -73,6 +76,17 @@ // forces white (blends better with the texture) appearance.color = COLOR_WHITE +/datum/bodypart_overlay/texture/mesh/proc/should_modify(image/appearance) + // only apply to "real planes", ie not emissive or lighting or whatever + var/appearance_plane = PLANE_TO_TRUE(appearance.plane) + if(appearance_plane != FLOAT_PLANE && appearance_plane != GAME_PLANE) + return FALSE + // only apply to other mutant bodyparts. we filter by layer which is absolutely not ideal + var/appearance_layer = abs(appearance.layer) + if(appearance_layer != BODY_ADJ_LAYER && appearance_layer != BODY_FRONT_LAYER && appearance_layer != BODY_BEHIND_LAYER) + return FALSE + return TRUE + /datum/bodypart_overlay/texture/mesh/black texture_icon_state = "mesh_mask" outline_color = "#080808" @@ -80,3 +94,11 @@ /datum/bodypart_overlay/texture/mesh/white texture_icon_state = "mesh_mask_white" outline_color = "#B2B2B2" + +/datum/bodypart_overlay/texture/mesh/biosuit + texture_icon_state = "mesh_mask_biosuit" + outline_color = "#747182" + +/datum/bodypart_overlay/texture/mesh/biosuit_dark + texture_icon_state = "mesh_mask_biosuit_dark" + outline_color = "#514F5B" diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index 2a3e62cad9e5..b037024db0b2 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -11,6 +11,7 @@ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDEFACE|HIDESNOUT resistance_flags = ACID_PROOF flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF + var/texture_type = /datum/bodypart_overlay/texture/mesh/biosuit // Icon_state passed into clothing dirt component var/dirt_state = "bio_dirt" @@ -20,7 +21,7 @@ AddComponent(/datum/component/clothing_dirt, dirt_state) AddComponent(/datum/component/adjust_fishing_difficulty, 6) AddComponent(/datum/component/hat_stabilizer, loose_hat = TRUE) - AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_HEAD, /datum/bodypart_overlay/texture/mesh/white) + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_HEAD, texture_type) /datum/armor/head_bio_hood bio = 100 @@ -44,11 +45,12 @@ strip_delay = 70 equip_delay_other = 70 resistance_flags = ACID_PROOF + var/texture_type = /datum/bodypart_overlay/texture/mesh/biosuit /obj/item/clothing/suit/bio_suit/Initialize(mapload) . = ..() AddComponent(/datum/component/adjust_fishing_difficulty, 6) - AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_CHEST, /datum/bodypart_overlay/texture/mesh/white) + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_CHEST, texture_type) //Standard biosuit, orange stripe /datum/armor/suit_bio_suit @@ -105,9 +107,11 @@ //Janitor's biosuit, grey with purple arms /obj/item/clothing/head/bio_hood/janitor icon_state = "bio_janitor" + texture_type = /datum/bodypart_overlay/texture/mesh/biosuit_dark /obj/item/clothing/suit/bio_suit/janitor icon_state = "bio_janitor" + texture_type = /datum/bodypart_overlay/texture/mesh/biosuit_dark /obj/item/clothing/suit/bio_suit/janitor/Initialize(mapload) . = ..() @@ -139,6 +143,7 @@ inhand_icon_state = "bio_suit" strip_delay = 40 equip_delay_other = 20 + texture_type = /datum/bodypart_overlay/texture/mesh/black /obj/item/clothing/suit/bio_suit/plaguedoctorsuit/Initialize(mapload) . = ..() diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 49c4f7cceff8..ee5c579902f1 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -1252,7 +1252,7 @@ for(var/external_layer in overlay.all_layers) if(overlay.layers & external_layer) . += overlay.get_overlay(external_layer, src) - for(var/datum/layer in .) + for(var/image/layer in .) overlay.modify_bodypart_appearance(layer) return . diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm index 9f3efbb43eb8..7fe537165caf 100644 --- a/code/modules/surgery/organs/external/tails.dm +++ b/code/modules/surgery/organs/external/tails.dm @@ -206,11 +206,11 @@ wag_flags = WAG_ABLE dna_block = DNA_LIZARD_TAIL_BLOCK - mesh_in_suits = TRUE ///Lizard tail bodypart overlay datum /datum/bodypart_overlay/mutant/tail/lizard feature_key = "tail_lizard" + mesh_in_suits = TRUE /datum/bodypart_overlay/mutant/tail/lizard/get_global_feature_list() return SSaccessories.tails_list_lizard diff --git a/maplestation_modules/icons/mob/clothing/tail_suit_mask.dmi b/maplestation_modules/icons/mob/clothing/tail_suit_mask.dmi index f8744a8ebe68e2762f76616ed8e2e73eb2f753d7..f4c848923dc546643f8f2e15db3d6e2c38d86dec 100644 GIT binary patch delta 244 zcmZ3?bdxE*Gr-TCmrII^fq{Y7)59eQNGAZX0}C^d6qm}k1yYIuJ|V6L4jhn?k@@lC z$KAVk-@SWx`s~HN36o388#FaFfl>|s8E&g3Ujr&;ED7=pW^j0RBMr!zIx#rEUekF0 z4wKC-C9)qiJ6)Gp=%{Yqp`dPPX=-lDzdZL8*Sb2r2Md@Oa!EamT z(fRhQAuof10L#Jc4Qwh47&$W>m`uw8Jolg7KH<%^@|ibQEb3ddppA`-6$o18TRWAq k7k*g)0v{F>2z(bmnVGfUMAAcv2WTRLr>mdKI;Vst04T#+FaQ7m delta 189 zcmcb~w3sQlGr-TCmrII^fq{Y7)59eQNIQTq3p0?6aL;)Qq(lRJLR=3VI3Ob<^W(>l zyLazuYH9+x4gVQFvwNBX6)=_r`2{mLJiCzwtH6+~@x~;{;Tt?djqe;?bF0;KF<=qrp*tS7I?^TcEI;uY_shj#&m=ZU;3a gHY)J)E;!B15LmY^k@dje4M1%Sp00i_>zopr0P;>d6951J From 45cd823002975eb2d4b978bd16448f492bffc558 Mon Sep 17 00:00:00 2001 From: MrMelbert Date: Mon, 11 May 2026 23:53:19 -0500 Subject: [PATCH 7/8] Test --- .../screenshots/screenshot_digi_leg_test.png | Bin 1759 -> 1791 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/code/modules/unit_tests/screenshots/screenshot_digi_leg_test.png b/code/modules/unit_tests/screenshots/screenshot_digi_leg_test.png index 8fb16d008feb0fb38330be17cc50c85b0a17758d..4836591351e782f10ced8e7484848dda9361023f 100644 GIT binary patch delta 1433 zcmYk0c{tR09LEP!WM~wYk|RVyDz=fBaStmuBNTFzD}F!&*%NT>Eb{OB>?*+;^;R%>@*2}O zmu+BFl-<-BQI1QH{Y~BOr1nem&ZVO(GPY4KP1&YBIQ{%J zw;8#M#IUFPd(+fU%nnHIY?el*37hm>ZPWw}D4Bsp2bnm-kf7jL&vUBeTn`zV+BaOM z(tL9+{=Q$p^^^$N?T!-H#+B+AOHEG_I$bako|87k59EFCjkFu*-B7Av4|&LPTAD~M zNNda&XgwUMV5{SyqDKuYmAYzDXyqhI6K^*lIthtZ6)4{)I^AJQHTtO?i_Je**=6s^ zTvK^@gWwTlmH(#vX9w$&gQ3FKPU?&-*3Nk$Ao#fn@ozRQI^V!OD1F!l6#d99B1gIek4A@EZ1XYqPF^$ z{ukEfg_60AsMG2aOfh#`XYZk|Hb#gPGDO1s@wVkbW(95jv8!{Lk^)@3cumGJo0~nDzUffOD4*T)>K^_!JQED7%&# zC^CCE-Deo(6#rU1tcUXc`b)Y*+Qgq3x}{Z=y)DW|aI~!FrEOZDVhW0ecPTW~`r$p}#GMC~sreO?yR z-Tt`Dpo@`9sKX9C&p(SXenX9pYrd7X59*iI-5Y@C`h|D8o!owxW6B%v~q4U8<;({CA09Nfg#6S!~vqb-3x=@f*mO8357 znKiE0H|)TtQxs=dopo9lO|n_SuH1QesN?S#$f2XP$nK#`+_kRHXyfEQFaN>uwegVS z^|UsX4Pm9$Af2^&7>4y4>4G%Ha&B@CbyXuNaD<&Rs>t9%mVS)uKm;lQ!Y04XdVXEv z>jN|ybtUpE9)>Rdnh5dfQt2>|WO%ND2l^C1`g8nr%EBSSack*G(W>kGqkz6|e3Aa@%11_8{yzE#&5X9`{xxo-@?|xXOC*R{FQ4-H@ zgrUpzMT2KvRd!%7MiHAmaW4nsPbf{yXbY4Vz>x=v0H~ zuWdW&qpW8qU;(HA&_~z(qmz<4duyoO_G}z_(;LU`TTiv*AO;kR7lo{#;3~8dk7z{1 zB3Q!Z{G3(j5$+0St2U2+WdR%nc#cpdAafPx(Y4=X1+M(NL@a)nRsTt*PzA1ygNq$N z=km9#70#F=R0C9ahy1}7N2%}r^Sw)y|RX-^R6!$@3rWM}8}Og=$4m-nub1YF)_?5AqZqwVwK zoU=Jn$PjpA-}eH~_s3pfz=z>jO>|S^aA?dg zX_=0Qg?a-6WhMfj@>6eMm`=iRR1-wwa58^25jeEG=o+DAW*Vfx_r^pLQ}VIrw+WP* zQDUVO5zUk`g-McxvxI-m zlf*#4=>+sL9XY&Bpz-*QAU5Fh`7nvXa5|laVU!H#^EQE?dq}fPUD2KcjmLrK#hw?$ z27F4(lSXHvny$T!xW3uSdWfXH;qKo}^uJ!ce)G$(zrA_=%7C9LmCWaJTBWp2lserf zpr??~b1d~N3&SIc^VIXaG_JP>oJM~=*)`Ulf@Tz?a9l^2E;HRy8h%aS`>7FUNz^oB z_L@Ndcst=C?F1=LI|zn~Mu)am0`AsN3+oVh zDd99mmLXEpnqX=ppw&s~=?sMVnW5((cH@pYP&E7rUCFi+pyc{;wmg%BOlg0P8O^dK zzn#6 z6UEeIx$$vmR z*8iTD=XodI9gp?DA6x;vBOdAh{&=_k?~6nI{|tDi{_l%J{ofad`oDiK{#gGPrPlw& zQ=G2g>>khPTk&J@kMw_0Zc6%AK0PA4%GVEgewFRvDE>kJ6aITC#20a6u+EtNg?^1^>lTjU*-rl#+hY5%{7Bo@0eTWWI}YO;{ardNH*VMNNXo19b9L9e)`oAcv&)4Pk=W2fpn~RCraTwp||Eeg;FWWC=QB+0(I}YO; z{a^i6Rol(BqTWnk#ZmlD|5rDglGfTyE5E)Sbl@QVk^cXBQ&rW?*H(TOQ=^R$2k{5# z|HVQ>deb_fJN`iZzx?)Xx%ke$FZ9k2#2>8xZ|0Dg6{0CV7NB#lwA7K3-`3J~ovhepCG)zCR%U;hw-;|3~^C`44{so7L(l+s@<_00000NkvXX Hu0mjfnEdMl From e2518815939d364dd5638bd6b6cefcc40384d0e6 Mon Sep 17 00:00:00 2001 From: MrMelbert Date: Tue, 12 May 2026 00:57:35 -0500 Subject: [PATCH 8/8] More stuff --- .../texture_bodypart_overlay.dm | 45 ++++++++++++++++-- code/modules/antagonists/cult/cult_items.dm | 16 +++++++ .../heretic/items/heretic_armor.dm | 5 ++ code/modules/clothing/head/hardhat.dm | 4 ++ .../clothing/spacesuits/_spacesuits.dm | 4 +- code/modules/clothing/suits/armor.dm | 10 +++- code/modules/clothing/suits/utility.dm | 13 +++-- .../hydroponics/beekeeping/beekeeper_suit.dm | 8 ++++ .../modules/mining/equipment/explorer_gear.dm | 6 +++ code/modules/mod/mod_clothes.dm | 4 +- .../icons/mob/clothing/tail_suit_mask.dmi | Bin 345 -> 1078 bytes 11 files changed, 103 insertions(+), 12 deletions(-) diff --git a/code/datums/bodypart_overlays/texture_bodypart_overlay.dm b/code/datums/bodypart_overlays/texture_bodypart_overlay.dm index 63eac4c78b33..22920ea8b983 100644 --- a/code/datums/bodypart_overlays/texture_bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/texture_bodypart_overlay.dm @@ -5,8 +5,9 @@ /// icon state for the texture var/texture_icon_state /// Cache the icon so we dont have to make a new one each time - var/cached_texture_icon - /// Priority of this texture - all textures with a lower priority will not be rendered + VAR_FINAL/icon/cached_texture_icon + + /// Priority of this texture - all textures with a lower priority will outright not be rendered var/overlay_priority = 0 /datum/bodypart_overlay/texture/New() @@ -55,7 +56,14 @@ /// Icon file for the displacement map that comes with the texture. var/displacement_icon = 'maplestation_modules/icons/mob/clothing/tail_suit_mask.dmi' /// Cache the displacement icon so we dont have to make a new one each time - var/cached_displacement_icon + VAR_FINAL/icon/cached_displacement_icon + + /// Icon state for the lighting map that comes with the texture. + var/lighting_icon_state = "mesh_mask_lighting" + /// Icon file for the lighting map that comes with the texture. + var/lighting_icon = 'maplestation_modules/icons/mob/clothing/tail_suit_mask.dmi' + /// Cache the lighting icon so we dont have to make a new one each time + VAR_FINAL/icon/cached_lighting_icon /// Color used for the outline filter var/outline_color = "#080808" @@ -63,6 +71,7 @@ /datum/bodypart_overlay/texture/mesh/New() . = ..() cached_displacement_icon = icon(displacement_icon, displacement_icon_state) + cached_lighting_icon = icon(lighting_icon, lighting_icon_state) /datum/bodypart_overlay/texture/mesh/modify_bodypart_appearance(image/appearance) if(!should_modify(appearance)) @@ -73,6 +82,8 @@ appearance.add_filter("displacement", 2, displacement_map_filter(cached_displacement_icon, size = 1)) // adds an outline so the texture doesn't end abruptly appearance.add_filter("outline", 3, outline_filter(1, outline_color, OUTLINE_SHARP)) + // adds a bit of lighting to make the texture look less flat + appearance.add_filter("lighting", 4, layering_filter(cached_lighting_icon, blend_mode = BLEND_MULTIPLY)) // forces white (blends better with the texture) appearance.color = COLOR_WHITE @@ -102,3 +113,31 @@ /datum/bodypart_overlay/texture/mesh/biosuit_dark texture_icon_state = "mesh_mask_biosuit_dark" outline_color = "#514F5B" + +/datum/bodypart_overlay/texture/mesh/bombsuit + texture_icon_state = "mesh_mask_bombsuit" + outline_color = "#897B51" + +/datum/bodypart_overlay/texture/mesh/bombsuit_white + texture_icon_state = "mesh_mask_bombsuit_white" + outline_color = "#A58975" + +/datum/bodypart_overlay/texture/mesh/bombsuit_red + texture_icon_state = "mesh_mask_bombsuit_red" + outline_color = "#511D19" + +/datum/bodypart_overlay/texture/mesh/firesuit + texture_icon_state = "mesh_mask_firesuit" + outline_color = "#262A33" + +/datum/bodypart_overlay/texture/mesh/drake + texture_icon_state = "mesh_mask_drake" + outline_color = "#615C5A" + +/datum/bodypart_overlay/texture/mesh/heretic + texture_icon_state = "mesh_mask_heretic" + outline_color = "#270B08" + +/datum/bodypart_overlay/texture/mesh/space + texture_icon_state = "mesh_mask_space" + outline_color = "#1F1F1F" diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 0c604478bf11..5f0f7807bafa 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -242,6 +242,10 @@ Striking a noncultist, however, will tear their flesh."} icon_state = "cult_hoodalt" inhand_icon_state = null +/obj/item/clothing/head/hooded/cult_hoodie/alt/Initialize(mapload) + . = ..() + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_HEAD, /datum/bodypart_overlay/texture/mesh/drake) + /obj/item/clothing/suit/hooded/cultrobes/alt name = "cultist robes" desc = "An armored set of robes worn by the followers of Nar'Sie." @@ -249,6 +253,10 @@ Striking a noncultist, however, will tear their flesh."} inhand_icon_state = null hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/alt +/obj/item/clothing/suit/hooded/cultrobes/alt/Initialize(mapload) + . = ..() + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_CHEST, /datum/bodypart_overlay/texture/mesh/drake) + /obj/item/clothing/suit/hooded/cultrobes/alt/ghost item_flags = DROPDEL @@ -312,6 +320,10 @@ Striking a noncultist, however, will tear their flesh."} max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT resistance_flags = NONE +/obj/item/clothing/suit/hooded/cultrobes/hardened/Initialize(mapload) + . = ..() + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_CHEST, /datum/bodypart_overlay/texture/mesh/drake) + /datum/armor/cultrobes_hardened melee = 50 bullet = 40 @@ -336,6 +348,10 @@ Striking a noncultist, however, will tear their flesh."} flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF resistance_flags = NONE +/obj/item/clothing/head/hooded/cult_hoodie/hardened/Initialize(mapload) + . = ..() + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_HEAD, /datum/bodypart_overlay/texture/mesh/drake) + /datum/armor/cult_hoodie_hardened melee = 50 bullet = 40 diff --git a/code/modules/antagonists/heretic/items/heretic_armor.dm b/code/modules/antagonists/heretic/items/heretic_armor.dm index f2ea36dd18e1..7f2bc39a60c9 100644 --- a/code/modules/antagonists/heretic/items/heretic_armor.dm +++ b/code/modules/antagonists/heretic/items/heretic_armor.dm @@ -12,6 +12,7 @@ /obj/item/clothing/head/hooded/cult_hoodie/eldritch/Initialize(mapload) . = ..() AddElement(/datum/element/heretic_focus) + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_HEAD, /datum/bodypart_overlay/texture/mesh/heretic) /obj/item/clothing/suit/hooded/cultrobes/eldritch name = "ominous armor" @@ -25,6 +26,10 @@ // Slightly better than normal cult robes armor_type = /datum/armor/cultrobes_eldritch +/obj/item/clothing/suit/hooded/cultrobes/eldritch/Initialize(mapload) + . = ..() + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_CHEST, /datum/bodypart_overlay/texture/mesh/heretic) + /datum/armor/cultrobes_eldritch melee = 50 bullet = 50 diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index e13e04dce61e..29ad204b353f 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -196,6 +196,10 @@ visor_flags_inv = NONE visor_state = "weldvisor_atmos" +/obj/item/clothing/head/utility/hardhat/welding/atmos/Initialize(mapload) + . = ..() + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_HEAD, /datum/bodypart_overlay/texture/mesh/firesuit) + /obj/item/clothing/head/utility/hardhat/welding/atmos/worn_overlays(mutable_appearance/standing, isinhands, icon_file) . = ..() if(!isinhands) diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index 88f89077c7c4..f7189490997e 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -38,7 +38,7 @@ if(fishing_modifier) AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier) add_stabilizer() - AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_HEAD, /datum/bodypart_overlay/texture/mesh/black) + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_HEAD, /datum/bodypart_overlay/texture/mesh/space) /obj/item/clothing/head/helmet/space/proc/add_stabilizer(loose_hat = TRUE) AddComponent(/datum/component/hat_stabilizer, loose_hat = loose_hat) @@ -100,7 +100,7 @@ if(fishing_modifier) AddComponent(/datum/component/adjust_fishing_difficulty, fishing_modifier) - AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_CHEST, /datum/bodypart_overlay/texture/mesh/black) + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_CHEST, /datum/bodypart_overlay/texture/mesh/space) /// Start Processing on the space suit when it is worn to heat the wearer /obj/item/clothing/suit/space/equipped(mob/living/user, slot) diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 7a17a9b2f1fe..663319cb72fc 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -293,10 +293,14 @@ . = ..() AddComponent(/datum/component/adjust_fishing_difficulty, 5) init_rustle_component() + init_equipment_overlay() /obj/item/clothing/suit/armor/riot/proc/init_rustle_component() AddComponent(/datum/component/item_equipped_movement_rustle) +/obj/item/clothing/suit/armor/riot/proc/init_equipment_overlay() + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_CHEST, /datum/bodypart_overlay/texture/mesh/black) + /datum/armor/armor_riot melee = 50 bullet = 10 @@ -515,7 +519,11 @@ /obj/item/nullrod, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, - ) + ) + +/obj/item/clothing/suit/armor/riot/knight/init_equipment_overlay() + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_CHEST, /datum/bodypart_overlay/texture/mesh/biosuit_dark) + /obj/item/clothing/suit/armor/riot/knight/init_rustle_component() AddComponent(/datum/component/item_equipped_movement_rustle, SFX_PLATE_ARMOR_RUSTLE, 8) diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index bf01dffc7933..352848c67e17 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -40,6 +40,7 @@ /obj/item/clothing/suit/utility/fire/Initialize(mapload) . = ..() AddComponent(/datum/component/adjust_fishing_difficulty, 7) + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_CHEST, /datum/bodypart_overlay/texture/mesh/firesuit) /datum/armor/utility_fire melee = 15 @@ -98,7 +99,7 @@ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF resistance_flags = NONE - var/texture_type = /datum/bodypart_overlay/texture/mesh/white + var/texture_type = /datum/bodypart_overlay/texture/mesh/bombsuit /obj/item/clothing/head/utility/bomb_hood/Initialize(mapload) . = ..() @@ -133,7 +134,7 @@ equip_delay_other = 70 resistance_flags = NONE - var/texture_type = /datum/bodypart_overlay/texture/mesh/white + var/texture_type = /datum/bodypart_overlay/texture/mesh/bombsuit /obj/item/clothing/suit/utility/bomb_suit/Initialize(mapload) . = ..() @@ -152,21 +153,23 @@ /obj/item/clothing/head/utility/bomb_hood/security icon_state = "bombsuit_sec" inhand_icon_state = null - texture_type = /datum/bodypart_overlay/texture/mesh/black + texture_type = /datum/bodypart_overlay/texture/mesh/bombsuit_red /obj/item/clothing/suit/utility/bomb_suit/security icon_state = "bombsuit_sec" inhand_icon_state = null allowed = list(/obj/item/gun/energy, /obj/item/melee/baton, /obj/item/restraints/handcuffs) - texture_type = /datum/bodypart_overlay/texture/mesh/black + texture_type = /datum/bodypart_overlay/texture/mesh/bombsuit_red /obj/item/clothing/head/utility/bomb_hood/white icon_state = "bombsuit_white" inhand_icon_state = null + texture_type = /datum/bodypart_overlay/texture/mesh/bombsuit_white /obj/item/clothing/suit/utility/bomb_suit/white icon_state = "bombsuit_white" inhand_icon_state = null + texture_type = /datum/bodypart_overlay/texture/mesh/bombsuit_white /* * Radiation protection @@ -192,6 +195,7 @@ AddComponent(/datum/component/hat_stabilizer, loose_hat = TRUE) AddElement(/datum/element/radiation_protected_clothing) AddComponent(/datum/component/clothing_dirt, "rad_dirt") + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_HEAD, /datum/bodypart_overlay/texture/mesh/black) /datum/armor/utility_radiation bio = 60 @@ -222,3 +226,4 @@ . = ..() AddElement(/datum/element/radiation_protected_clothing) AddComponent(/datum/component/adjust_fishing_difficulty, 7) + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_CHEST, /datum/bodypart_overlay/texture/mesh/black) diff --git a/code/modules/hydroponics/beekeeping/beekeeper_suit.dm b/code/modules/hydroponics/beekeeping/beekeeper_suit.dm index ef42445b40b4..185f89410ae8 100644 --- a/code/modules/hydroponics/beekeeping/beekeeper_suit.dm +++ b/code/modules/hydroponics/beekeeping/beekeeper_suit.dm @@ -8,6 +8,10 @@ drop_sound = 'maplestation_modules/sound/items/pickup/hat.ogg' pickup_sound = 'maplestation_modules/sound/items/pickup/hat.ogg' +/obj/item/clothing/head/utility/beekeeper_head/Initialize(mapload) + . = ..() + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_HEAD, /datum/bodypart_overlay/texture/mesh/white) + /obj/item/clothing/suit/utility/beekeeper_suit name = "beekeeper suit" desc = "Keeps the lil buzzing buggers away from your squishy bits." @@ -16,3 +20,7 @@ body_parts_covered = CHEST|GROIN|LEGS|ARMS clothing_flags = THICKMATERIAL allowed = list(/obj/item/melee/flyswatter, /obj/item/reagent_containers/spray/plantbgone, /obj/item/plant_analyzer, /obj/item/seeds, /obj/item/reagent_containers/cup/bottle, /obj/item/reagent_containers/cup/beaker, /obj/item/cultivator, /obj/item/reagent_containers/spray/pestspray, /obj/item/hatchet, /obj/item/storage/bag/plants) + +/obj/item/clothing/suit/utility/beekeeper_suit/Initialize(mapload) + . = ..() + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_CHEST, /datum/bodypart_overlay/texture/mesh/white) diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm index e48aec13c27b..b8cdc8c14656 100644 --- a/code/modules/mining/equipment/explorer_gear.dm +++ b/code/modules/mining/equipment/explorer_gear.dm @@ -182,6 +182,7 @@ /obj/item/clothing/suit/armor/bone/Initialize(mapload) . = ..() AddComponent(/datum/component/armor_plate, upgrade_item = /obj/item/clothing/accessory/talisman) + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_CHEST, /datum/bodypart_overlay/texture/mesh/drake) allowed = GLOB.mining_suit_allowed /obj/item/clothing/head/helmet/skull @@ -227,6 +228,7 @@ /obj/item/clothing/suit/hooded/cloak/drake/Initialize(mapload) . = ..() allowed = GLOB.mining_suit_allowed + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_CHEST, /datum/bodypart_overlay/texture/mesh/drake) /obj/item/clothing/head/hooded/cloakhood/drake name = "drake helm" @@ -240,6 +242,10 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF +/obj/item/clothing/head/hooded/cloakhood/drake/Initialize(mapload) + . = ..() + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_HEAD, /datum/bodypart_overlay/texture/mesh/drake) + /obj/item/clothing/suit/hooded/cloak/godslayer name = "godslayer armour" icon_state = "godslayer" diff --git a/code/modules/mod/mod_clothes.dm b/code/modules/mod/mod_clothes.dm index 7d326a7cf648..965d08af117c 100644 --- a/code/modules/mod/mod_clothes.dm +++ b/code/modules/mod/mod_clothes.dm @@ -11,7 +11,7 @@ /obj/item/clothing/head/mod/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NO_SPEED_POTION, INNATE_TRAIT) - AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_HEAD, /datum/bodypart_overlay/texture/mesh/black) + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_HEAD, /datum/bodypart_overlay/texture/mesh/space) AddComponent(/datum/component/hat_stabilizer, loose_hat = TRUE) /obj/item/clothing/suit/mod @@ -35,7 +35,7 @@ /obj/item/clothing/suit/mod/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NO_SPEED_POTION, INNATE_TRAIT) - AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_CHEST, /datum/bodypart_overlay/texture/mesh/black) + AddElement(/datum/element/equipment_bodypart_overlay, BODY_ZONE_CHEST, /datum/bodypart_overlay/texture/mesh/space) /obj/item/clothing/gloves/mod name = "MOD gauntlets" diff --git a/maplestation_modules/icons/mob/clothing/tail_suit_mask.dmi b/maplestation_modules/icons/mob/clothing/tail_suit_mask.dmi index f4c848923dc546643f8f2e15db3d6e2c38d86dec..e86540b223ea40f657b3bdeb5285396d566ec2f8 100644 GIT binary patch literal 1078 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRShpIv%N?cNllZ!G7N;32F7#J$% zOzq#z*KEM!n*K>t>`iEV_Oz~5Ne%H1jS@+Y3`aA6{^h%{cIvCM)81`7fA&FHy@=?O z)P->pGoEpp#PGXMU6ZnynRohTFPWhCkG2(<2s%2yni%_*mw&5joZIC^$2FH}Z4{9( znGN|s{Rzrn^)6lc-_OyvzE6qk6YtqSDxLrQu3Tg3j4=M~_AAr<$x^!n2kiq^ zTpA%;4)O>Y$N6ZVwC0gm`PVh2V13bv(@uLCy(;fVZmXSnkAZ<%-_yl0q+-t7+xxSH z86}Q={NB{P^m(J|mrLGl0^QzhQ~i`Y4qQFzskl0U=^uY-=YJPB(GtPH@Vz%K$}4z? zDa%f}A(5%j`9fm*qHbTd&nA2Bv-h?8EE!`OKtKcUw##yV8F9i2I1qLPsWb%O4lIyQ^znqa~5#YX%w|yy-i4-r(2N@Oz1{5-) zm8bo1>%7Wlh9t&ICR4dC-ti+EJSC<%$cjU7fD~b*VBFJT>kW>y$l=;45!=}SSH+aX8<}k z73i2H)E2zL#B#PiBaKZ}DH=cRg|`ds$7%C+kM!NcyCe$NEzojG&mE}%B+&g4w@K$Toj_y(8( zqvDGl6EI3Nni)70s4ciyOyS1K)=P|gtY@&D`h9P5;D1J!*}?U79Ovi7ox1q)#r2?f z6CM|<9N4t)PwIW8|9tk0=MFQ>X=k+HXD*Oqdtk$Jpi-jYvjM~NLicK0)_pLj+ pI#FG{ey{Wi@yGgqSS-%xM=)pXziGE|4X_|!@O1TaS?83{1OR?vxbXl0 literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^2|(9B%r{y@cXk`AZeAgwk#^$f%&;jOQy4ZIh8~-qo-%F8qy=`G z#`|}eY;Gx${ixaLy2L_9b@L7dbwf*2b5s81xu>|+)#*K0z{HSyGIm2Blk94s16@5` z978-h-<~z(Wl#`cIk>%nO=STiXNCilX<2~h{fv2n2iL92Xg mr&9L9FAG56!-4{V@8Tyjv-X=vdME)6WbkzLb6Mw<&;$UQb%*u<