From d537d3320a16b3419be5e46a8b77f58ff8fc35f6 Mon Sep 17 00:00:00 2001 From: warriorstar-orion Date: Tue, 9 Dec 2025 11:26:24 -0500 Subject: [PATCH] fix overlay stacking on action HUD icons (#31101) --- code/_onclick/hud/action_button.dm | 2 ++ code/datums/actions/action.dm | 23 ++++++++++--------- code/datums/actions/spell_action.dm | 34 +++++++++++++++++------------ 3 files changed, 35 insertions(+), 24 deletions(-) diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index bbe5b0873b6..d71129da49d 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -27,6 +27,8 @@ var/shown_to_observers = FALSE /// Whether or not this button is locked, preventing it from being dragged. var/locked = TRUE + /// Overlay for displaying the availability of the button + var/image/unavailable_image /atom/movable/screen/movable/action_button/Destroy() . = ..() diff --git a/code/datums/actions/action.dm b/code/datums/actions/action.dm index 1772a3b3b72..86fa623110f 100644 --- a/code/datums/actions/action.dm +++ b/code/datums/actions/action.dm @@ -30,8 +30,6 @@ var/show_to_observers = TRUE /// Toggles whether this action is usable or not var/action_disabled = FALSE - /// The appearance used as an overlay for when the action is unavailable - var/mutable_appearance/unavailable_effect /// If False, the owner of this action does not get a hud and cannot activate it on their own var/owner_has_control = TRUE @@ -194,7 +192,7 @@ * force - whether an update is forced regardless of existing status */ /datum/action/proc/update_button_status(atom/movable/screen/movable/action_button/button, force = FALSE) - button.overlays -= unavailable_effect + button.cut_overlay(button.unavailable_image) button.maptext = "" if(IsAvailable(show_message = FALSE)) button.color = rgb(255, 255, 255, 255) @@ -268,13 +266,18 @@ return /datum/action/proc/apply_unavailable_effect(atom/movable/screen/movable/action_button/button) - if(isnull(unavailable_effect)) - unavailable_effect = mutable_appearance('icons/mob/screen_white.dmi', icon_state = "template") - unavailable_effect.alpha = 200 - unavailable_effect.appearance_flags = RESET_COLOR | RESET_ALPHA - unavailable_effect.color = "#000000" - unavailable_effect.plane = FLOAT_PLANE + 1 - button.overlays |= unavailable_effect + if(isnull(button.unavailable_image)) + var/mutable_appearance/ma = mutable_appearance( + icon = 'icons/mob/screen_white.dmi', + icon_state = "template", + plane = FLOAT_PLANE + 1, + alpha = 200, + appearance_flags = RESET_COLOR | RESET_ALPHA, + color = "#000000", + ) + button.unavailable_image = new + button.unavailable_image.appearance = ma + button.add_overlay(button.unavailable_image) /** * Applies any overlays to our button diff --git a/code/datums/actions/spell_action.dm b/code/datums/actions/spell_action.dm index d5b28d831b5..daa314b1a75 100644 --- a/code/datums/actions/spell_action.dm +++ b/code/datums/actions/spell_action.dm @@ -48,21 +48,27 @@ return FALSE /datum/action/spell_action/apply_unavailable_effect(atom/movable/screen/movable/action_button/button) - var/datum/spell/S = target - if(!istype(S)) - return ..() + var/datum/spell/spell = target + if(!istype(spell)) + return - unavailable_effect = mutable_appearance('icons/mob/screen_white.dmi', icon_state = "template") - unavailable_effect.appearance_flags = RESET_COLOR | RESET_ALPHA - unavailable_effect.color = "#000000" - unavailable_effect.plane = FLOAT_PLANE + 1 - unavailable_effect.alpha = S.cooldown_handler.get_cooldown_alpha() + var/text = spell.cooldown_handler.cooldown_info() - // Make a holder for the charge text + button.cut_overlay(button.unavailable_image) + var/mutable_appearance/ma = mutable_appearance( + icon = 'icons/mob/screen_white.dmi', + icon_state = "template", + plane = FLOAT_PLANE + 1, + alpha = spell.cooldown_handler.get_cooldown_alpha(), + appearance_flags = RESET_COLOR | RESET_ALPHA, + color = "#000000" + ) + button.unavailable_image = new + button.unavailable_image.appearance = ma + + // Make a holder for the charge text, and yes this needs to be a separate overlay on our overlay var/image/count_down_holder = mutable_appearance('icons/effects/effects.dmi', icon_state = "nothing", appearance_flags = RESET_COLOR | RESET_ALPHA) - var/text = S.cooldown_handler.cooldown_info() - count_down_holder.maptext_y = 4 + count_down_holder.maptext_y = 4 // bump up off the bottom border count_down_holder.maptext = "
[text]
" - unavailable_effect.add_overlay(count_down_holder) - - button.overlays |= unavailable_effect + button.unavailable_image.overlays += count_down_holder + button.add_overlay(button.unavailable_image)