Converts cache to a GLOB. Other overlay tweaks (#17767)

This commit is contained in:
Cameron Lennox
2025-05-30 13:17:28 -07:00
committed by GitHub
parent 2673b577f6
commit 47b708c40d
6 changed files with 86 additions and 101 deletions
+5 -5
View File
@@ -558,17 +558,17 @@
if(light_on)
// Generate object icon.
if(!light_overlay_cache["[light_overlay]_icon"])
light_overlay_cache["[light_overlay]_icon"] = image(icon = 'icons/obj/light_overlays.dmi', icon_state = "[light_overlay]")
helmet_light = light_overlay_cache["[light_overlay]_icon"]
if(!GLOB.light_overlay_cache["[light_overlay]_icon"])
GLOB.light_overlay_cache["[light_overlay]_icon"] = image(icon = 'icons/obj/light_overlays.dmi', icon_state = "[light_overlay]")
helmet_light = GLOB.light_overlay_cache["[light_overlay]_icon"]
add_overlay(helmet_light)
// Generate and cache the on-mob icon, which is used in update_inv_head().
var/body_type = (H && H.species.get_bodytype(H))
var/cache_key = "[light_overlay][body_type && LAZYACCESS(sprite_sheets, body_type) ? body_type : ""]"
if(!light_overlay_cache[cache_key])
if(!GLOB.light_overlay_cache[cache_key])
var/use_icon = LAZYACCESS(sprite_sheets, body_type) || 'icons/mob/light_overlays.dmi'
light_overlay_cache[cache_key] = image(icon = use_icon, icon_state = "[light_overlay]")
GLOB.light_overlay_cache[cache_key] = image(icon = use_icon, icon_state = "[light_overlay]")
else if(helmet_light)
cut_overlay(helmet_light)
+2 -2
View File
@@ -15,8 +15,8 @@
var/image/standing = ..()
if(light_on && slot_name == slot_head_str)
var/cache_key = "[light_overlay][LAZYACCESS(sprite_sheets, body_type) ? "_[body_type]" : ""]"
if(standing && light_overlay_cache[cache_key])
standing.add_overlay(light_overlay_cache[cache_key])
if(standing && GLOB.light_overlay_cache[cache_key])
standing.add_overlay(GLOB.light_overlay_cache[cache_key])
return standing
//SUIT: Blood state is slightly different
@@ -1863,3 +1863,17 @@
/mob/living/carbon/human/get_digestion_efficiency_modifier()
return species.digestion_efficiency
/mob/living/carbon/human/verb/hide_headset()
set name = "Show/Hide Headset"
set category = "IC.Settings"
set desc = "Toggle headset worn icon visibility."
hide_headset = !hide_headset
update_inv_ears()
/mob/living/carbon/human/verb/hide_glasses()
set name = "Show/Hide Glasses"
set category = "IC.Settings"
set desc = "Toggle glasses worn icon visibility."
hide_glasses = !hide_glasses
update_inv_glasses()
@@ -176,3 +176,5 @@
var/next_loneliness_time = 0
var/redgate_restricted = FALSE
var/hide_headset = FALSE
var/hide_glasses = FALSE
@@ -2,13 +2,11 @@
Global associative list for caching humanoid icons.
Index format m or f, followed by a string of 0 and 1 to represent bodyparts followed by husk fat hulk skeleton 1 or 0.
*/
//TODO: Get all these up to date with Chomp. I'd rather not do an entire caching update with the genetics PR, thanks.
var/global/list/human_icon_cache = list() //key is incredibly complex, see update_icons_body()
var/global/list/tail_icon_cache = list() //key is [species.race_key][r_skin][g_skin][b_skin]
var/global/list/wing_icon_cache = list() // See tail.
var/global/list/light_overlay_cache = list() //see make_worn_icon() on helmets
var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
GLOBAL_LIST_EMPTY(human_icon_cache) //key is incredibly complex, see update_icons_body()
GLOBAL_LIST_EMPTY(tail_icon_cache) //key is [species.race_key][r_skin][g_skin][b_skin]
GLOBAL_LIST_EMPTY(wing_icon_cache) // See tail.
GLOBAL_LIST_EMPTY(light_overlay_cache) //see make_worn_icon() on helmets
GLOBAL_LIST_EMPTY(damage_icon_parts) //see UpdateDamageIcon()
////////////////////////////////////////////////////////////////////////////////////////////////
// # Human Icon Updating System
@@ -160,13 +158,13 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if(O.damage_state == "00") continue
var/icon/DI
var/cache_index = "[O.damage_state]/[O.icon_name]/[species.get_blood_colour(src)]/[species.get_bodytype(src)]"
if(damage_icon_parts[cache_index] == null)
if(GLOB.damage_icon_parts[cache_index] == null)
DI = icon(species.get_damage_overlays(src), O.damage_state) // the damage icon for whole human
DI.Blend(icon(species.get_damage_mask(src), O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels
DI.Blend(species.get_blood_colour(src), ICON_MULTIPLY)
damage_icon_parts[cache_index] = DI
GLOB.damage_icon_parts[cache_index] = DI
else
DI = damage_icon_parts[cache_index]
DI = GLOB.damage_icon_parts[cache_index]
standing_image.add_overlay(DI)
@@ -221,11 +219,11 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
var/wholeicontransparent = TRUE
for(var/organ_tag in species.has_limbs)
var/obj/item/organ/external/part = organs_by_name[organ_tag]
if(isnull(part) || part.is_stump() || part.is_hidden_by_sprite_accessory()) //VOREStation Edit allowing tails to prevent bodyparts rendering, granting more spriter freedom for taur/digitigrade stuff.
if(isnull(part) || part.is_stump() || part.is_hidden_by_sprite_accessory()) //Allowing tails to prevent bodyparts rendering, granting more spriter freedom for taur/digitigrade stuff.
icon_key += "0"
continue
if(part)
wholeicontransparent &&= part.transparent //VORESTATION EDIT: transparent instead of nonsolid
wholeicontransparent &&= part.transparent
icon_key += "[part.data.get_species_race_key(part.owner)]"
icon_key += "[part.data.body_gender]"
icon_key += "[part.s_tone]"
@@ -244,10 +242,8 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if (part.markings[M]["on"])
icon_key += "[M][part.markings[M]["color"]]"
// VOREStation Edit Start
if(part.nail_polish)
icon_key += "_[part.nail_polish.icon]_[part.nail_polish.icon_state]_[part.nail_polish.color]"
// VOREStation Edit End
if(part.robotic >= ORGAN_ROBOT)
icon_key += "2[part.model ? "-[part.model]": ""]"
@@ -258,11 +254,11 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
icon_key += "3"
else
icon_key += "1"
if(part.transparent) //VOREStation Edit. For better slime limbs. Avoids using solid var due to limb dropping.
icon_key += "_t" //VOREStation Edit.
if(part.transparent) //For better slime limbs. Avoids using solid var due to limb dropping.
icon_key += "_t"
if(istype(tail_style, /datum/sprite_accessory/tail/taur))
if(tail_style.clip_mask) //VOREStation Edit.
if(tail_style.clip_mask)
icon_key += tail_style.clip_mask_state
if(digitigrade && (part.organ_tag == BP_R_LEG || part.organ_tag == BP_L_LEG || part.organ_tag == BP_R_FOOT || part.organ_tag == BP_L_FOOT))
@@ -276,12 +272,13 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]"
var/icon/base_icon
if(human_icon_cache[icon_key])
base_icon = human_icon_cache[icon_key]
if(GLOB.human_icon_cache[icon_key])
base_icon = GLOB.human_icon_cache[icon_key]
else
//BEGIN CACHED ICON GENERATION.
var/obj/item/organ/external/chest = get_organ(BP_TORSO)
base_icon = chest.get_icon(skeleton, !wholeicontransparent)
base_icon = new(chest?.get_icon(skeleton, !wholeicontransparent))
var/apply_extra_transparency_leg = organs_by_name[BP_L_LEG] && organs_by_name[BP_R_LEG]
var/apply_extra_transparency_foot = organs_by_name[BP_L_FOOT] && organs_by_name[BP_R_FOOT]
@@ -291,7 +288,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
var/icon_y_offset = 0
if(istype(tail_style, /datum/sprite_accessory/tail/taur)) // Tail icon 'cookie cutters' are filled in where icons are preserved. We need to invert that.
if(tail_style.clip_mask) //VOREStation Edit.
if(tail_style.clip_mask)
Cutter = new(icon = (tail_style.clip_mask_icon ? tail_style.clip_mask_icon : tail_style.icon), icon_state = tail_style.clip_mask_state)
Cutter.Blend("#000000", ICON_MULTIPLY) // Make it all black.
@@ -305,9 +302,9 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
icon_y_offset = tail_style.offset_y
for(var/obj/item/organ/external/part in organs)
if(isnull(part) || part.is_stump() || part == chest || part.is_hidden_by_sprite_accessory()) //VOREStation Edit allowing tails to prevent bodyparts rendering, granting more spriter freedom for taur/digitigrade stuff.
if(isnull(part) || part.is_stump() || part == chest || part.is_hidden_by_sprite_accessory()) //Allowing tails to prevent bodyparts rendering, granting more spriter freedom for taur/digitigrade stuff.
continue
var/icon/temp = part.get_icon(skeleton, !wholeicontransparent)
var/icon/temp = new(part.get_icon(skeleton, !wholeicontransparent))
if((part.organ_tag in list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT)) && Cutter)
temp.Blend(Cutter, ICON_AND, x = icon_x_offset, y = icon_y_offset)
@@ -323,15 +320,12 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if(!(part.icon_position & RIGHT))
temp2.Insert(new/icon(temp,dir=WEST),dir=WEST)
base_icon.Blend(temp2, ICON_OVERLAY)
temp2.Insert(temp2,"blank",dir=NORTH) //faaaaairly certain this is more efficient than reloading temp2, doing this so we don't blend the icons twice (it matters more in transparent limbs)
temp2.Insert(temp2,"blank",dir=SOUTH)
temp2.Insert(temp2,"blank",dir=EAST)
temp2.Insert(temp2,"blank",dir=WEST)
temp2 = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi', icon_state = "blank")
if(part.icon_position & LEFT)
temp2.Insert(new/icon(temp,dir=EAST),dir=EAST)
if(part.icon_position & RIGHT)
temp2.Insert(new/icon(temp,dir=WEST),dir=WEST)
if (part.transparent && !wholeicontransparent) //apply a little (a lot) extra transparency to make it look better //VORESTATION EDIT: transparent instead of nonsolid
if (part.transparent && !wholeicontransparent) //apply a little (a lot) extra transparency to make it look better.
if ((istype(part, /obj/item/organ/external/leg) && apply_extra_transparency_leg) || (istype(part, /obj/item/organ/external/foot) && apply_extra_transparency_foot)) //maybe
temp2 += rgb(,,,30)
base_icon.Blend(temp2, ICON_UNDERLAY)
@@ -358,7 +352,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
husk_over.Blend(mask, ICON_ADD)
base_icon.Blend(husk_over, ICON_OVERLAY)
human_icon_cache[icon_key] = base_icon
GLOB.human_icon_cache[icon_key] = base_icon
//END CACHED ICON GENERATION.
stand_icon.Blend(base_icon,ICON_OVERLAY)
@@ -407,7 +401,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
//Bloody feet
if(feet_blood_DNA)
var/image/bloodsies = image(icon = species.get_blood_mask(src), icon_state = "shoeblood", layer = BODY_LAYER+BLOOD_LAYER)
var/image/bloodsies = image(icon = digitigrade ? 'icons/mob/human_races/masks/blood_digitigrade.dmi' : species.get_blood_mask(src), icon_state = "shoeblood", layer = BODY_LAYER+BLOOD_LAYER)
bloodsies.color = feet_blood_color
both.add_overlay(bloodsies)
@@ -428,7 +422,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if(hide_underwear[category])
continue
var/datum/category_item/underwear/UWI = all_underwear[category]
var/image/wear = UWI.generate_image(all_underwear_metadata[category], layer = BODY_LAYER+UNDERWEAR_LAYER)
var/image/wear = UWI.generate_image(all_underwear_metadata[category], layer = BODY_LAYER+UNDERWEAR_LAYER, digitigrade = digitigrade)
overlays_standing[UNDERWEAR_LAYER] += wear
apply_layer(UNDERWEAR_LAYER)
@@ -440,7 +434,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
//Reset our hair
remove_layer(HAIR_LAYER)
remove_layer(HAIR_ACCESSORY_LAYER) //VOREStation Edit
remove_layer(HAIR_ACCESSORY_LAYER)
update_eyes() //Pirated out of here, for glowing eyes.
var/obj/item/organ/external/head/head_organ = get_organ(BP_HEAD)
@@ -487,7 +481,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
var/icon/ears_s = get_ears_overlay()
if(head_organ.transparent) //VORESTATION EDIT: transparent instead of nonsolid
if(head_organ.transparent)
face_standing += rgb(,,,120)
//if (ears_s) //maybe cap this instead of removing it? ae, if your ears are above 180 a reduce it down?
//ears_s += rgb(,,,180)
@@ -507,9 +501,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
overlays_standing[HAIR_LAYER] = semifinal
apply_layer(HAIR_LAYER)
//return //VOREStation Edit
// VOREStation Edit - START
var/icon/hair_acc_s = get_hair_accessory_overlay()
var/image/hair_acc_s_image = null
if(hair_acc_s)
@@ -523,7 +515,6 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
return
overlays_standing[HAIR_ACCESSORY_LAYER] = image(hair_acc_s, layer = BODY_LAYER+HAIR_ACCESSORY_LAYER)
apply_layer(HAIR_ACCESSORY_LAYER)
// VOREStation Edit - END
/mob/living/carbon/human/update_eyes()
if(QDESTROYING(src))
@@ -552,14 +543,14 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if(!head_organ.eye_icon)
return
var/icon/eyes_icon = new/icon(head_organ.eye_icon_location, head_organ.eye_icon) //VOREStation Edit
var/icon/eyes_icon = new/icon(head_organ.eye_icon_location, head_organ.eye_icon)
if(eyes)
eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD)
else
eyes_icon.Blend(rgb(128,0,0), ICON_ADD)
// Convert to emissive at some point
if (head_organ.transparent) //VOREStation Edit: transparent instead of nonsolid
if (head_organ.transparent)
eyes_icon += rgb(,,,180)
var/image/eyes_image = image(eyes_icon)
@@ -695,7 +686,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
remove_layer(GLASSES_LAYER)
remove_layer(GLASSES_LAYER_ALT)
if(!glasses)
if(!glasses || hide_glasses)
return //Not wearing glasses, no need to update anything.
var/glasses_layer = GLASSES_LAYER
@@ -720,16 +711,34 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if(!l_ear && !r_ear)
return //Why bother, if no ear sprites
if(hide_headset)
if(l_ear && istype(l_ear, /obj/item/radio/headset)) //No need to generate blank images if only headsets are present.
if(!r_ear || istype(r_ear, /obj/item/radio/headset))
return
if(r_ear && istype(r_ear, /obj/item/radio/headset))
if(!l_ear || istype(l_ear, /obj/item/radio/headset))
return
// Blank image upon which to layer left & right overlays.
var/image/both = image(icon = 'icons/effects/effects.dmi', icon_state = "nothing", layer = BODY_LAYER+EARS_LAYER)
if(l_ear)
var/image/standing = l_ear.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_l_ear_str, default_icon = INV_EARS_DEF_ICON, default_layer = EARS_LAYER)
both.add_overlay(standing)
if(istype(l_ear, /obj/item/radio/headset))
if(!hide_headset)
var/image/standing = l_ear.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_l_ear_str, default_icon = INV_EARS_DEF_ICON, default_layer = EARS_LAYER)
both.add_overlay(standing)
else
var/image/standing = l_ear.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_l_ear_str, default_icon = INV_EARS_DEF_ICON, default_layer = EARS_LAYER)
both.add_overlay(standing)
if(r_ear)
var/image/standing = r_ear.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_r_ear_str, default_icon = INV_EARS_DEF_ICON, default_layer = EARS_LAYER)
both.add_overlay(standing)
if(istype(r_ear, /obj/item/radio/headset))
if(!hide_headset)
var/image/standing = r_ear.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_r_ear_str, default_icon = INV_EARS_DEF_ICON, default_layer = EARS_LAYER)
both.add_overlay(standing)
else
var/image/standing = r_ear.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_r_ear_str, default_icon = INV_EARS_DEF_ICON, default_layer = EARS_LAYER)
both.add_overlay(standing)
overlays_standing[EARS_LAYER] = both
apply_layer(EARS_LAYER)
@@ -969,7 +978,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
apply_layer(L_HAND_LAYER)
/mob/living/carbon/human/proc/get_tail_layer()
var/list/lower_layer_dirs = list(SOUTH)
var/list/lower_layer_dirs = list(SOUTH, EAST, WEST) //Tail below clothing on side views too.
if(tail_style)
lower_layer_dirs = tail_style.lower_layer_dirs.Copy()
@@ -1007,14 +1016,14 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if(species_tail && !(wear_suit && wear_suit.flags_inv & HIDETAIL))
var/icon/tail_s = get_tail_icon()
tail_image = image(icon = tail_s, icon_state = "[species_tail]_s", layer = BODY_LAYER+tail_layer)
tail_image.alpha = chest?.transparent ? 180 : 255 //VORESTATION EDIT: transparent instead of nonsolid //keeping this as is
tail_image.alpha = chest?.transparent ? 180 : 255
overlays_standing[tail_layer] = tail_image
animate_tail_reset()
//TODO: Is this the appropriate place for this, and not on species...?
/mob/living/carbon/human/proc/get_tail_icon()
var/icon_key = "[species.get_race_key(src)][r_skin][g_skin][b_skin][r_hair][g_hair][b_hair]"
var/icon/tail_icon = tail_icon_cache[icon_key]
var/icon/tail_icon = GLOB.tail_icon_cache[icon_key]
if(!tail_icon)
//generate a new one
var/species_tail_anim = species.get_tail_animation(src)
@@ -1028,7 +1037,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
var/icon/hair_icon = icon('icons/effects/species.dmi', "[species.get_tail(src)]_[use_species_tail]")
hair_icon.Blend(rgb(r_hair, g_hair, b_hair), species.color_mult ? ICON_MULTIPLY : ICON_ADD) //Check for species color_mult
tail_icon.Blend(hair_icon, ICON_OVERLAY)
tail_icon_cache[icon_key] = tail_icon
GLOB.tail_icon_cache[icon_key] = tail_icon
return tail_icon
@@ -1136,7 +1145,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
var/image/effects = new()
for(var/datum/modifier/M in modifiers)
if(M.mob_overlay_state)
if(M.icon_override) //VOREStation Edit. Override for the modifer icon.
if(M.icon_override) //Override for the modifer icon.
var/image/I = image(icon = 'icons/mob/modifier_effects_vr.dmi', icon_state = M.mob_overlay_state)
I.color = M.effect_color
effects.overlays += I // Leaving this as overlays +=
@@ -1200,7 +1209,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
return
//If you are FBP with wing style and didn't set a custom one
if(synthetic && synthetic.includes_wing && !wing_style && !wings_hidden) //VOREStation Edit
if(synthetic && synthetic.includes_wing && !wing_style && !wings_hidden)
var/icon/wing_s = new/icon("icon" = synthetic.icon, "icon_state" = "wing") //I dunno. If synths have some custom wing?
wing_s.Blend(rgb(src.r_skin, src.g_skin, src.b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD)
var/image/working = image(wing_s)
@@ -1208,7 +1217,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
return working
//If you have custom wings selected
if(wing_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL) && !wings_hidden) //VOREStation Edit
if(wing_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL) && !wings_hidden)
var/wing_state = (flapping && wing_style.ani_state) ? wing_style.ani_state : wing_style.icon_state
if(wing_style.multi_dir)
wing_state += "_[under_layer ? "back" : "front"]"
@@ -1306,13 +1315,13 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if(tail_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL && !istaurtail(tail_style)) && !tail_hidden)
var/icon/tail_s = new/icon("icon" = (tail_style.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = (wagging && tail_style.ani_state ? tail_style.ani_state : tail_style.icon_state))
if(tail_style.can_loaf && !is_shifted)
pixel_y = (resting) ? -tail_style.loaf_offset*size_multiplier : default_pixel_y //move player down, then taur up, to fit the overlays correctly // VOREStation Edit: Taur Loafing
pixel_y = (resting) ? -tail_style.loaf_offset*size_multiplier : default_pixel_y //move player down, then taur up, to fit the overlays correctly. Taur Loafing
if(tail_style.do_colouration)
tail_s.Blend(rgb(src.r_tail, src.g_tail, src.b_tail), tail_style.color_blend_mode)
if(tail_style.extra_overlay)
var/icon/overlay = new/icon("icon" = (tail_style?.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay)
if(wagging && tail_style.ani_state)
overlay = new/icon("icon" = (tail_style?.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay_w) //RS EDIT
overlay = new/icon("icon" = (tail_style?.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay_w)
overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode)
tail_s.Blend(overlay, ICON_OVERLAY)
qdel(overlay)
@@ -1324,7 +1333,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if(tail_style.extra_overlay2)
var/icon/overlay = new/icon("icon" = (tail_style?.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay2)
if(wagging && tail_style.ani_state)
overlay = new/icon("icon" = (tail_style?.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay2_w) //RS EDIT
overlay = new/icon("icon" = (tail_style?.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay2_w)
overlay.Blend(rgb(src.r_tail3, src.g_tail3, src.b_tail3), tail_style.color_blend_mode)
tail_s.Blend(overlay, ICON_OVERLAY)
qdel(overlay)
@@ -1462,43 +1471,3 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
ooc_notes_favs = read_preference(/datum/preference/text/living/ooc_notes_favs)
ooc_notes_maybes = read_preference(/datum/preference/text/living/ooc_notes_maybes)
ooc_notes_style = read_preference(/datum/preference/toggle/living/ooc_notes_style)
//Human Overlays Indexes/////////
#undef MUTATIONS_LAYER
#undef SKIN_LAYER
#undef BLOOD_LAYER
#undef MOB_DAM_LAYER
#undef SURGERY_LAYER
#undef UNDERWEAR_LAYER
#undef SHOES_LAYER_ALT
#undef UNIFORM_LAYER
#undef ID_LAYER
#undef SHOES_LAYER
#undef GLOVES_LAYER
#undef BELT_LAYER
#undef SUIT_LAYER
#undef TAIL_UPPER_LAYER
#undef TAIL_LOWER_LAYER
#undef WING_LOWER_LAYER
#undef GLASSES_LAYER
#undef BELT_LAYER_ALT
#undef SUIT_STORE_LAYER
#undef BACK_LAYER
#undef HAIR_LAYER
#undef HAIR_ACCESSORY_LAYER
#undef EARS_LAYER
#undef EYES_LAYER
#undef FACEMASK_LAYER
#undef GLASSES_LAYER_ALT
#undef HEAD_LAYER
#undef HANDCUFF_LAYER
#undef LEGCUFF_LAYER
#undef L_HAND_LAYER
#undef R_HAND_LAYER
#undef WING_LAYER
#undef TAIL_UPPER_LAYER_ALT
#undef MODIFIER_EFFECTS_LAYER
#undef FIRE_LAYER
#undef WATER_LAYER
#undef TARGETED_LAYER
#undef TOTAL_LAYERS