From 585f7767c389bb9851fc5ef0dc5e44bae05ff3da Mon Sep 17 00:00:00 2001 From: Lucy Date: Wed, 12 Jan 2022 12:42:45 -0500 Subject: [PATCH] Visual spell cooldowns (from Tau Ceti) (#13038) --- code/_onclick/hud/screen_objects.dm | 57 ++++++++++++++++++++++++++++ code/modules/spells/spell.dm | 5 +++ icons/mob/screen_gen.dmi | Bin 115971 -> 116146 bytes 3 files changed, 62 insertions(+) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 6f02824a50da..67ebde9d2bb0 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -734,3 +734,60 @@ /obj/screen/component_button/Click(params) if(parent) parent.component_click(src, params) + +/obj/screen/cooldown_overlay + name = "" + icon_state = "cooldown" + pixel_y = 4 + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + appearance_flags = RESET_COLOR | PIXEL_SCALE | RESET_TRANSFORM | KEEP_TOGETHER | RESET_ALPHA + vis_flags = VIS_INHERIT_ID + var/end_time = 0 + var/obj/screen/parent_button + var/datum/callback/callback + var/timer + +/obj/screen/cooldown_overlay/Initialize(mapload, button) + . = ..(mapload) + parent_button = button + +/obj/screen/cooldown_overlay/Destroy() + stop_cooldown() + deltimer(timer) + return ..() + +/obj/screen/cooldown_overlay/proc/start_cooldown(end_time, need_timer = TRUE) + parent_button.color = "#8000007c" + parent_button.vis_contents += src + src.end_time = end_time + set_maptext("[round((end_time - world.time) / 10, 1)]") + if(need_timer) + timer = addtimer(CALLBACK(src, .proc/tick), 1 SECONDS, TIMER_STOPPABLE) + +/obj/screen/cooldown_overlay/proc/tick() + if(world.time >= end_time) + stop_cooldown() + return + set_maptext("[round((end_time - world.time) / 10, 1)]") + if(timer) + timer = addtimer(CALLBACK(src, .proc/tick), 1 SECONDS, TIMER_STOPPABLE) + +/obj/screen/cooldown_overlay/proc/stop_cooldown() + parent_button.color = "#ffffffff" + parent_button.vis_contents -= src + if(callback) + callback.Invoke() + +/obj/screen/cooldown_overlay/proc/set_maptext(time) + maptext = "
[time]
" + +/proc/start_cooldown(obj/screen/button, time, datum/callback/callback) + if(!time) + return + var/obj/screen/cooldown_overlay/cooldown = new(button, button) + if(callback) + cooldown.callback = callback + cooldown.start_cooldown(time) + else + cooldown.start_cooldown(time, FALSE) + return cooldown diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index 42e0799c70bd..0e7f44ffcf4a 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -152,6 +152,8 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th var/centcom_cancast = TRUE //Whether or not the spell should be allowed on z2 + var/obj/screen/cooldown_overlay/cooldown_overlay + action_icon = 'icons/mob/actions/actions_spells.dmi' action_icon_state = "spell_default" action_background_icon_state = "bg_spell" @@ -299,15 +301,18 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th return TRUE /obj/effect/proc_holder/spell/proc/start_recharge() + cooldown_overlay = start_cooldown(action.button, world.time + charge_max) recharging = TRUE /obj/effect/proc_holder/spell/process() if(recharging && charge_type == "recharge" && (charge_counter < charge_max)) charge_counter += 2 //processes 5 times per second instead of 10. + cooldown_overlay?.tick() if(charge_counter >= charge_max) action.UpdateButtonIcon() charge_counter = charge_max recharging = FALSE + QDEL_NULL(cooldown_overlay) /obj/effect/proc_holder/spell/proc/perform(list/targets, recharge = TRUE, mob/user = usr) //if recharge is started is important for the trigger spells before_cast(targets) diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index 0dd809656256957c2d17cc6f9d367ca555e2cd1b..6d8925ce03d31bbbbc955ee4658e4beb79ba6dbd 100644 GIT binary patch delta 6392 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 delta 6215 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 IU?2AX0JQ~!_y7O^