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