Files
FabianK3andGitHub 689ce3a836 Rework of wall damage visuals (#21032)
# Summary

Wall damage visuals had two issue for a longer time.
The first issue is that applied visual damage was permanent and
non-revertable, additionally it was too overwhelming.
The second issue was that the wall damage inspect descriptions ignored
the added health of reinforcing materials, as a result, all wall types
received the same damage descriptions even though their actual health
was different.

## Changes

This PR fixes both issues by fixing the stacking of damage overlays,
refactoring the alpha calculation of said overlays, adding additional
inspect-descriptions and lastly by adding the additional strength of
walls to their inspect calculation.

## Additional notes

Thanks to @Batrachophreno for assisting and suggesting to refactor
visual damage layers calculation.
2025-07-21 22:13:26 +00:00

124 lines
4.1 KiB
Plaintext

/turf/simulated/wall/proc/update_material()
if(!material)
return
if(reinf_material)
construction_stage = 6
else
construction_stage = null
if(!material)
material = SSmaterials.get_material_by_name(DEFAULT_WALL_MATERIAL)
if(material)
explosion_resistance = material.explosion_resistance
if (material.wall_icon)
icon = material.wall_icon
if(reinf_material && reinf_material.explosion_resistance > explosion_resistance)
explosion_resistance = reinf_material.explosion_resistance
if(reinf_material)
name = "reinforced [material.display_name] wall"
if(material.display_name == reinf_material.display_name)
desc = "It seems to be a section of hull reinforced and plated with [material.display_name]."
else
desc = "It seems to be a section of hull reinforced with [reinf_material.display_name] and plated with [material.display_name]."
else
name = "[material.display_name] wall"
desc = "It seems to be a section of hull plated with [material.display_name]."
if(material.opacity < 0.5)
opacity = FALSE
alpha = 125
if(!opacity)
var/turf/under_floor = under_turf
var/image/under_image = image(initial(under_floor.icon), icon_state = initial(under_floor.icon_state))
under_image.alpha = 255
underlays += under_image
update_icon()
/turf/simulated/wall/proc/set_material(var/material/newmaterial, var/material/newrmaterial)
material = newmaterial
reinf_material = newrmaterial
update_material()
/turf/simulated/wall/update_icon()
if(!material)
return
if(!damage_overlays[1]) //list hasn't been populated
generate_overlays()
if (LAZYLEN(reinforcement_images))
CutOverlays(reinforcement_images, ATOM_ICON_CACHE_PROTECTED)
if (damage_image)
CutOverlays(damage_image, ATOM_ICON_CACHE_PROTECTED)
LAZYCLEARLIST(reinforcement_images)
damage_image = null
var/list/overlays_to_add = list()
if (!density) // We're a fake and we're open.
clear_smooth_overlays()
fake_wall_image = image('icons/turf/wall_masks.dmi', "[material.icon_base]fwall_open")
fake_wall_image.color = material.icon_colour
AddOverlays(fake_wall_image)
smoothing_flags = SMOOTH_FALSE
return
else if (fake_wall_image)
CutOverlays(fake_wall_image)
fake_wall_image = null
smoothing_flags = initial(smoothing_flags)
calculate_adjacencies() // Update cached_adjacency
if(reinf_material)
var/image/I
if(construction_stage != null && construction_stage < 6)
I = image('icons/turf/wall_masks.dmi', "reinf_construct-[construction_stage]")
I.color = reinf_material.icon_colour
LAZYADD(reinforcement_images, I)
else
if (reinf_material.multipart_reinf_icon)
LAZYADD(reinforcement_images, cardinal_smooth_fromicon(reinf_material.multipart_reinf_icon, cached_adjacency))
else
I = image('icons/turf/wall_masks.dmi', reinf_material.reinf_icon)
I.color = reinf_material.icon_colour
LAZYADD(reinforcement_images, I)
if (reinforcement_images)
overlays_to_add += reinforcement_images
if(damage != 0)
var/integrity = material.integrity
if(reinf_material)
integrity += reinf_material.integrity
var/overlay = round(damage / integrity * damage_overlays.len) + 1
if(overlay > damage_overlays.len)
overlay = damage_overlays.len
damage_image = damage_overlays[overlay]
overlays_to_add += damage_image
// Remove the existing damage overlay entirely and replace it with the newly-calculated one.
CutOverlays(damage_overlays)
AddOverlays(overlays_to_add)
UNSETEMPTY(reinforcement_images)
QUEUE_SMOOTH(src)
if(smoothing_flags & SMOOTH_UNDERLAYS)
get_underlays(cached_adjacency)
/turf/simulated/wall/proc/generate_overlays()
for(var/damage_level = 1; damage_level <= damage_overlays.len; damage_level++) // Generate damage overlay for each placeholder (16 in array)
var/image/damage_overlay = image(icon = 'icons/turf/walls.dmi', icon_state = "overlay_damage")
damage_overlay.blend_mode = BLEND_MULTIPLY
// The actual difference in each damage overlay is represented with a different alpha value, higher alpha = higher visible damage
damage_overlay.alpha = damage_level * 18 + 32; // Linear scale with inital offset
damage_overlays[damage_level] = damage_overlay