From 3ee4c76769ee5e802400353f17a6a14bd8fa7e62 Mon Sep 17 00:00:00 2001 From: LT3 <83487515+lessthnthree@users.noreply.github.com> Date: Thu, 28 Aug 2025 16:05:51 -0700 Subject: [PATCH] New powernet light flicker (#92567) ## About The Pull Request Changes light flicker to be an overlay instead of a rapid turning on/off of the light itself. It acts similar to a brownout and delayed restart of the light. The introduction of lights flickering when the powernet is hit by a bomb is a cool effect, but makes it very apparent the current flicker method's limitations. Rapid cycling of machinery on/off as fast as 0.5 seconds, spanning over dozens of lights at a time leads to the subsystem not being able to keep up with the lighting changes. It ultimately results in just a single broken looking change of lighting
Screenshots/Videos Before: https://github.com/user-attachments/assets/8237e72e-1edc-4423-b48b-8dd403ee3111 https://github.com/user-attachments/assets/f3a3d481-61fa-4fd9-b51c-3c1e080e129c After: https://github.com/user-attachments/assets/0fa2bbfd-4ca7-422a-8cd1-b6b738addb0f https://github.com/user-attachments/assets/8b8b10b9-912a-4476-9a11-985f79228500
## Why It's Good For The Game The powernet flicker effect looks better (and also now has an electrical sizzle sound) ## Changelog :cl: LT3 code: Improved powernet light flickering /:cl: --- .../revenant/revenant_abilities.dm | 2 +- code/modules/power/lighting/light.dm | 28 ++++++++++++++---- code/modules/power/powernet.dm | 7 ++--- icons/obj/lighting_overlay.dmi | Bin 2982 -> 4705 bytes 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/code/modules/mob/living/basic/space_fauna/revenant/revenant_abilities.dm b/code/modules/mob/living/basic/space_fauna/revenant/revenant_abilities.dm index b2d8a6bac22..5751a354b4b 100644 --- a/code/modules/mob/living/basic/space_fauna/revenant/revenant_abilities.dm +++ b/code/modules/mob/living/basic/space_fauna/revenant/revenant_abilities.dm @@ -192,7 +192,7 @@ if(window.fulltile) new /obj/effect/temp_visual/revenant/cracks(window.loc) for(var/obj/machinery/light/light in victim) - light.flicker(20) //spooky + light.flicker(rand(3, 5)) //spooky //Malfunction: Makes bad stuff happen to robots and machines. /datum/action/cooldown/spell/aoe/revenant/malfunction diff --git a/code/modules/power/lighting/light.dm b/code/modules/power/lighting/light.dm index 9306712be36..3491c23e2c0 100644 --- a/code/modules/power/lighting/light.dm +++ b/code/modules/power/lighting/light.dm @@ -180,6 +180,9 @@ var/area/local_area = get_room_area() + if(flickering) + . += mutable_appearance(overlay_icon, "[base_state]_flickering") + return if(low_power_mode || major_emergency || (local_area?.fire)) . += mutable_appearance(overlay_icon, "[base_state]_emergency") return @@ -225,7 +228,11 @@ if(reagents) START_PROCESSING(SSmachines, src) var/area/local_area = get_room_area() - if (local_area?.fire) + if (flickering) + brightness_set = brightness * bulb_low_power_brightness_mul + power_set = bulb_low_power_pow_mul + color_set = nightshift_light_color + else if (local_area?.fire) color_set = fire_colour power_set = fire_power brightness_set = fire_brightness @@ -500,27 +507,36 @@ ) return TRUE -/obj/machinery/light/proc/flicker(amount = rand(10, 20)) +/obj/machinery/light/proc/flicker(amount = 1) set waitfor = FALSE if(flickering || !on || status != LIGHT_OK) return . = TRUE // did we actually flicker? Send this now because we expect immediate response, before sleeping. - flickering = TRUE + set_light( + l_range = brightness * bulb_low_power_brightness_mul, + l_power = bulb_low_power_pow_mul, + l_color = nightshift_light_color, + ) + cut_overlays(src) + stoplag(0.7 SECONDS) + if(prob(30)) + do_sparks(number = 2, cardinal_only = TRUE, source = src) + for(var/i in 1 to amount) if(status != LIGHT_OK || !has_power()) break - on = !on + flickering = !flickering update(FALSE) - stoplag(rand(0.5 SECONDS, 1.5 SECONDS)) + stoplag(pick(list(2 SECONDS, 4 SECONDS, 6 SECONDS))) if(has_power()) on = (status == LIGHT_OK) else on = FALSE - update(FALSE) flickering = FALSE + update(FALSE) // ai attack - make lights flicker, because why not diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm index f09b175878f..852ae3a2008 100644 --- a/code/modules/power/powernet.dm +++ b/code/modules/power/powernet.dm @@ -111,7 +111,6 @@ return flickering = TRUE - var/most_flickers = 1 for(var/obj/machinery/power/terminal/terminal in nodes) if(!istype(terminal.master, /obj/machinery/power/apc)) continue @@ -123,12 +122,10 @@ if(!prob(flicker_prob)) continue - var/flicker_count = rand(1, 3) - most_flickers = max(most_flickers, flicker_count) var/obj/machinery/power/apc/apc = terminal.master for(var/obj/machinery/light/light as anything in apc.get_lights()) - light.flicker(flicker_count) + light.flicker(amount = 1) CHECK_TICK // don't let another flicker propagation until our slowest area is done (with some added leeway) - addtimer(VARSET_CALLBACK(src, flickering, FALSE), most_flickers * 2 SECONDS) + addtimer(VARSET_CALLBACK(src, flickering, FALSE), 9 SECONDS) diff --git a/icons/obj/lighting_overlay.dmi b/icons/obj/lighting_overlay.dmi index de25dbe17096176284f21f7135720ed2849f9d0e..df3f480f25c7bbe91b8267eb5be0f727fad26ca4 100644 GIT binary patch literal 4705 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 b-g7V1-MCue?xzgY(RtJ*Bi(XsO!&V6dbz>T literal 2982 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 vB26l!2*V>sr9UF