From b165c3fd3ba0eac88e634e25c99df0b2c85c1d31 Mon Sep 17 00:00:00 2001 From: Alan Date: Fri, 23 Jan 2026 14:06:49 -0500 Subject: [PATCH] Fix some body parts being drawn multiple times. (#31392) * Fix some body parts being drawn multiple times. * Attempt to draw hands ONCE in update_hands_layer(). * Thanks, linters. * Draw hands only once. Fix blood overlays for hands. * Draw hand markings similarly to markings layer. * Correct color distortion in hands marking layer. * Apply whitespace suggestions from review. --- .../living/carbon/human/human_update_icons.dm | 71 ++++++++++++++---- icons/mob/human_races/masks/blood_human.dmi | Bin 4178 -> 8072 bytes icons/mob/human_races/masks/blood_monkey.dmi | Bin 1287 -> 1964 bytes 3 files changed, 55 insertions(+), 16 deletions(-) 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 c9ba69b21fe..2996cd00b66 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -198,22 +198,34 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) base_icon = chest.get_icon(skeleton) for(var/obj/item/organ/external/part in bodyparts) + // We just drew the chest, don't draw it twice. + if(part == chest) + continue + // We will draw the hands later in the //HANDS OVERLAY section, if they're not covered by a uniform. + if(istype(part, /obj/item/organ/external/hand) && !(w_uniform?.body_parts_covered & HANDS)) + continue + var/icon/temp = part.get_icon(skeleton) //That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST //And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part) if(part.icon_position & (LEFT | RIGHT)) - var/icon/temp2 = new('icons/mob/human.dmi',"blank") - temp2.Insert(new/icon(temp,dir=NORTH),dir=NORTH) - temp2.Insert(new/icon(temp,dir=SOUTH),dir=SOUTH) + // First draw JUST ONE copy of north and south views + var/icon/temp2 = new('icons/mob/human.dmi', "blank") + temp2.Insert(new/icon(temp, dir = NORTH), dir = NORTH) + temp2.Insert(new/icon(temp, dir = SOUTH), dir = SOUTH) + base_icon.Blend(temp2, ICON_OVERLAY) + + // Now underlay or overlay the left and right sides as appropriate + temp2 = new('icons/mob/human.dmi', "blank") if(!(part.icon_position & LEFT)) - temp2.Insert(new/icon(temp,dir=EAST),dir=EAST) + temp2.Insert(new/icon(temp, dir = EAST), dir = EAST) if(!(part.icon_position & RIGHT)) - temp2.Insert(new/icon(temp,dir=WEST),dir=WEST) + temp2.Insert(new/icon(temp, dir = WEST), dir = WEST) base_icon.Blend(temp2, ICON_OVERLAY) if(part.icon_position & LEFT) - temp2.Insert(new/icon(temp,dir=EAST),dir=EAST) + temp2.Insert(new/icon(temp, dir = EAST), dir = EAST) if(part.icon_position & RIGHT) - temp2.Insert(new/icon(temp,dir=WEST),dir=WEST) + temp2.Insert(new/icon(temp, dir = WEST), dir = WEST) base_icon.Blend(temp2, ICON_UNDERLAY) else base_icon.Blend(temp, ICON_OVERLAY) @@ -228,12 +240,12 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) base_icon.ColorTone(husk_color_mod) else if(hulk) var/list/tone = rgb2num(hulk_color_mod) - base_icon.MapColors(rgb(tone[1],0,0),rgb(0,tone[2],0),rgb(0,0,tone[3])) + base_icon.MapColors(rgb(tone[1], 0, 0), rgb(0, tone[2], 0), rgb(0, 0, tone[3])) //Handle husk overlay. if(husk && ("overlay_husk" in icon_states(chest.icobase))) var/icon/mask = new(base_icon) - var/icon/husk_over = new(chest.icobase,"overlay_husk") + var/icon/husk_over = new(chest.icobase, "overlay_husk") mask.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,0) husk_over.Blend(mask, ICON_ADD) base_icon.Blend(husk_over, ICON_OVERLAY) @@ -420,26 +432,53 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) if(w_uniform?.body_parts_covered & HANDS) return + var/husk_color_mod = rgb(96, 88, 80) + var/hulk_color_mod = rgb(48, 224, 40) + + var/husk = HAS_TRAIT(src, TRAIT_HUSK) + var/hulk = HAS_TRAIT(src, TRAIT_HULK) + var/skeleton = HAS_TRAIT(src, TRAIT_SKELETONIZED) + var/species_name = "" if(dna.species.name in list("Drask", "Grey", "Vox", "Kidan", "Skkulakin")) species_name = "_[lowertext(dna.species.sprite_sheet_name)]" - var/icon/hands_mask = icon('icons/mob/body_accessory.dmi', "accessory_none_s") //Needs a blank icon, not actually related to markings at all + var/icon/hands_icon = icon('icons/mob/human.dmi', "blank") + var/icon/hands_mask = icon('icons/mob/human.dmi', "blank") if(get_limb_by_name("l_hand")) + var/obj/item/organ/external/l_hand = get_limb_by_name("l_hand") + hands_icon.Blend(l_hand.get_icon(skeleton), ICON_OVERLAY) hands_mask.Blend(icon('icons/mob/clothing/masking_helpers.dmi', "l_hand_mask[species_name]"), ICON_OVERLAY) if(get_limb_by_name("r_hand")) + var/obj/item/organ/external/r_hand = get_limb_by_name("r_hand") + hands_icon.Blend(r_hand.get_icon(skeleton), ICON_OVERLAY) hands_mask.Blend(icon('icons/mob/clothing/masking_helpers.dmi', "r_hand_mask[species_name]"), ICON_OVERLAY) - var/mutable_appearance/body_layer = overlays_standing[LIMBS_LAYER][1] - var/icon/body_hands = icon(body_layer.icon) - body_hands.Blend(hands_mask, ICON_MULTIPLY) - var/mutable_appearance/markings_layer = overlays_standing[MARKINGS_LAYER] var/icon/markings_hands = icon(markings_layer.icon) markings_hands.Blend(hands_mask, ICON_MULTIPLY) - var/mutable_appearance/final_sprite = mutable_appearance(body_hands, layer = -HANDS_LAYER) + if(!skeleton) + if(isgolem(src)) + var/datum/species/golem/G = src.dna.species + if(G.golem_colour) + hands_icon.ColorTone(G.golem_colour) + if(husk) + hands_icon.ColorTone(husk_color_mod) + else if(hulk) + var/list/tone = rgb2num(hulk_color_mod) + hands_icon.MapColors(rgb(tone[1], 0, 0), rgb(0, tone[2], 0), rgb(0, 0, tone[3])) + + var/obj/item/organ/external/chest = get_organ("chest") + if(husk && ("overlay_husk" in icon_states(chest.icobase))) + var/icon/mask = new(hands_icon) + var/icon/husk_over = new(chest.icobase, "overlay_husk") + mask.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,0) + husk_over.Blend(mask, ICON_ADD) + hands_icon.Blend(husk_over, ICON_OVERLAY) + + var/mutable_appearance/final_sprite = mutable_appearance(hands_icon, layer = -HANDS_LAYER) final_sprite.overlays += markings_hands overlays_standing[HANDS_LAYER] = final_sprite @@ -643,7 +682,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) update_hud_id(wear_id) if(w_uniform && w_uniform:displays_id) - overlays_standing[ID_LAYER] = mutable_appearance('icons/mob/mob.dmi', "id", layer = -ID_LAYER) + overlays_standing[ID_LAYER] = mutable_appearance('icons/mob/mob.dmi', "id", layer = -ID_LAYER) apply_overlay(ID_LAYER) /mob/living/carbon/human/update_inv_gloves() diff --git a/icons/mob/human_races/masks/blood_human.dmi b/icons/mob/human_races/masks/blood_human.dmi index 3c3eedd081f19f222ead7713e7795311b3ba834c..0ceb8e8b3651f81369142024520acc523d30ecea 100644 GIT binary patch literal 8072 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 diff --git a/icons/mob/human_races/masks/blood_monkey.dmi b/icons/mob/human_races/masks/blood_monkey.dmi index b2e8f00324d82d4a6cf8c5b53cc3f0d79e8d66b8..ab1da5b8ba4a4cf377d3f28943e6317c82810b60 100644 GIT binary patch literal 1964 zcmbW2Yc$&l7Qp`=Ln=xgt+5_qbz6pd#N*J`dxH&%(<-WA81*KhBGe`?D~lxIMEuA!ifzwiU>Jzk2Cy((6Gpqh`X^#=vWjI0Mcd3z8O;*v^e9& z7!6eBgl3_)-GiTkkH8lmG^rv0-5>4?9=V ze4GFsU{pR7YT}x9z5-mRRsf(2A~Lz0LVC=>n8p`f98#%GmgwaL zRfQoT+z4)Y4*{33DE3I4G0V?ptz$%+P;@V-Tq%tQ01BgUn2Ue<0%z%V%)F<8{hg*rf?Y7kA$bX!OXE|`mro_y?Z(~Rhwu-q?>r7kJ2& zpfg85%rw9w%+jux9){IlKV?`tN~S$m=Yp5mbNRbBjLQ~c1)@V%qia^zNAd0fMNR4c z+kg@rheX)qc?gt~5Hggl-sHy2&Ye6CqHyhvAE3AShm}*~E^xjzJ0-|!n_D3SGLjl> zn$m8iI<*l{?>=jNW)i;=g=4hR!iSIf7d3SWfHMHd0P?_@-x0Jxoa>HO)2{UH(@=YS zHRk&8q(_Vq-d#vbd!&A}+Lk2yq1_2vS6wnC%ja&f&VSJOslRtTU(5>x4U~&{+Ttwv z?jG?0sOz&N4v?@Y{HTQFdZC2L9f!wPlPfWFQ&i6MH0U?R!xt(KfsVwIc7|RaalN)` zomnaqBjdWxnVFfHH3@8Gc83q;4vpT~MVdQmG#3#F1UsneL6(HUXH9Z-ArQ%YO6iP> z%-O=>DK?uu3p3!2Y|S=zkJIVLomlbV5-EtC+~%MGX8jo1ud`T!FX|E6&TY*qf;oyo-p#K=$kk8B&U$5i_1) zA4BhWoH)*3>q@tmc-7Hhz?`{cgvn$+%FfQlZC#jxgxr4&&Kt6-_1kbTrHe5oD5SVn z)Nf22I~Q{LytXYe%bCXiwwQ(Y!M{gNTr(qP8kKp9Hv~{njY?J07k$SS3|VGVv($@x zsK=Pa`2|dRK9J~)6MPI36r-53v2ata?0>)v*3XIBmsU*x=?_1A$wf5WdPHhJe<473Ou z0`C=3JoZ29YIhdDn7Jd@s<5&TImS23{4+Sx96M0<6Fn9HnE@-M`-AK0_E;b8pI0;V zf<;2sp+q-Z+7DIT-0ea9 zE1xzMrMj;)?eBu`VlfStbww?ujS`c`Y}=rDCa@{+WVTd#56)T4=GApz_A-+R&r zp8dw^{@@W4xHPvooQk#o zelOY1Mk<(FW?3{dsNVzZh3dY1brfRN`%6lC@+BP=)ol;MlpbatIoqu?c_iO$3aUw# z#ZEC8X;1u(`>H2d+-VXe3X)g+s*G5MnUs2Nb5~Y7(BgZl_+s~8r}wXb{pZqxKF}+q zp~}RYZ8X+-yB8AEbNKg1tKDxUd$z%7N4-~llO9PI0NWGhob(VY)K5|;+)1(qYC_KZ d@9Wr*mjVTK+Do1ki4|}na5o=Vt7}-!zX8`gfK>nh literal 1287 zcmX|93pAT|6#s-^>J`oAv7SxSjx#2-Rdj~ZU>+wWC|WzBonob)^@>-uD_RbYb}dD8 zy0X)QPOU*hu(r125wBK4ns}U&B0{7|HN@`vt^J*o`~B|k{_g+Y@BgL9kL;3 zh>q9yBnmux;8&-q3NcPr5f2Y~W?)DPDKhy?QcOZhO#FESNw2;!JfwBWMqh0vS%SaD z_sL~0PzYaXWdCg7m2#|p7k6ZgA$DzK+~c2}`TUkivuH?K=eUpVoLGm&+ZNR0TV@XC z=MRKxNhA80pAFm5{QQC_?PW&z>bpi2HQQAzY9VR0BsG!Az4xPdv^1mictoFs`e@6D zP;Tk%A#r?_OSe~UB72vjtHWX=;s^g4lD2M?8xPEh%%WBBA?HP zC=!Vv6^q4Cl1L<|M=F(0PEG=!nwlCP9|!Ug%gf79g%&VF2@JqNffG=mRq%rj0D|f; z4pN~|$m8+Q(P)G!h_D7M037^~!XaP-Kk7jb0kOBYcXM+Sbl_k^r+^dMfunD?w6p{q z05)`6bR~%BOTp$J?*Tlh6GkhQO7H+coSmJ8(d+B$b8~Y*K!Jz?Z2>=;LOZm;GN1qf z5jY&hRzA^(OHWUskOL6qNOTNFG!xOpe7m#r>rabigIBavG1kp;N^HM2wjlDx zv8p~*I5y)q+C^Ey>TtlIo-avTjWIb*+J7}Uz~M!EGJ;?TUL@DR^eGWHIN+o|{^`0) z^yxsn&jW^(PZM`}#&X7Jr?q>--bynDGCHCPItKkm-_R~rUWgJKuG&1bBfQ7X^NDgS z(%E@?PO?fwOs8=-4;?<@8f0eHP`D^FAK`J;k+#UHdC4G)d59R*S*DSvKG$v^d~rS(6C=0sCu{Kvwl7;X8J;A4z>_zM zS@ABrGa){;C2=Usr{sDyMFbK&Fagp z)Rn(E#H`juVpvD!yZxMJ#ior-9v@k#9CqjV6YLulxS$XRrNJ zP@Wj!Yb9Z$cGj9$p z+q>kY#olp_n^!cHUKiv>T3+~Fav#&f@OEc;;69*yXo4m8FFELw-o9D8{ixeSA-8Y2 zI^@$n2^QGI^#kWPd-M!+WY&!-3ayO z2zJZ5sSg#|lY(hCf#IIV0)~QiN+id2sSybG7py6iFnU+NIs97?#LJybYIdXM{|hEU B28I9t