mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-20 11:31:12 +01:00
# 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.
124 lines
4.1 KiB
Plaintext
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
|