Files
Bubberstation/code/datums/elements/light_eaten.dm
T
GPeckmanandGitHub 5f923b097f Light-Eaten objects can no longer emit light after being turned off and then back on (#79240)
## About The Pull Request

#67676 described a bug where PDAs can apparently emit a small amount of
light after being affected by the light eater. As it turns out, the bug
is even worse than that. It doesn't work for just PDAs, it works for
basically any light source that can be turned off and on. Even
flashlights. In the following pictures, a flashlight has been
light-eaten and then turned off and on again:


![fine](https://github.com/tgstation/tgstation/assets/21979502/e880c3a8-4ae9-4b6c-8ee9-27dacdbb23ab)

Observe how the nightmare jaunt is available, as it should be. However,
one step closer to the flashlight:

![not
fine](https://github.com/tgstation/tgstation/assets/21979502/b35014d4-71e8-49cf-b0f6-479cdf2ba3fc)

The nightmare jaunt can no longer be used, because the flashlight is
still emitting light.

This PR just fixes that behavior. Light-eaten objects will now be
totally dark again, even after being power cycled. Closes #67676.
## Why It's Good For The Game

Bugs bad.
## Changelog
🆑
fix: Light-Eaten objects can no longer emit light after being turned off
and then back on.
code: Flashlights now use light_on instead of defining their own
variable. Please report buggy behavior.
/🆑
2023-10-28 23:49:13 -04:00

72 lines
2.5 KiB
Plaintext

/**
* Makes anything that it attaches to incapable of producing light
*/
/datum/element/light_eaten
element_flags = ELEMENT_DETACH_ON_HOST_DESTROY // Detach for turfs
/datum/element/light_eaten/Attach(atom/target)
if(!isatom(target))
return ELEMENT_INCOMPATIBLE
. = ..()
var/atom/atom_target = target
RegisterSignal(atom_target, COMSIG_ATOM_SET_LIGHT_POWER, PROC_REF(block_light_power))
RegisterSignal(atom_target, COMSIG_ATOM_SET_LIGHT_RANGE, PROC_REF(block_light_range))
RegisterSignal(atom_target, COMSIG_ATOM_SET_LIGHT_ON, PROC_REF(block_light_on))
RegisterSignal(atom_target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
/// Because the lighting system does not like movable lights getting set_light() called.
switch(atom_target.light_system)
if(STATIC_LIGHT)
target.set_light(0, 0, null, l_on = FALSE)
else
target.set_light_power(0)
target.set_light_range(0)
target.set_light_on(FALSE)
target.update_icon()
/datum/element/light_eaten/Detach(datum/source)
UnregisterSignal(source, list(
COMSIG_ATOM_SET_LIGHT_POWER,
COMSIG_ATOM_SET_LIGHT_RANGE,
COMSIG_ATOM_SET_LIGHT_ON,
COMSIG_ATOM_EXAMINE,
))
return ..()
/// Prevents the light power of the target atom from exceeding 0 or increasing.
/datum/element/light_eaten/proc/block_light_power(atom/eaten_light, new_power)
SIGNAL_HANDLER
if(new_power > 0)
return COMPONENT_BLOCK_LIGHT_UPDATE
if(new_power > eaten_light.light_power)
return COMPONENT_BLOCK_LIGHT_UPDATE
return NONE
/// Prevents the light range of the target atom from exceeding 0 while the light power is greater than 0.
/datum/element/light_eaten/proc/block_light_range(atom/eaten_light, new_range)
SIGNAL_HANDLER
if(new_range <= 0)
return NONE
if(eaten_light.light_power <= 0)
return NONE
return COMPONENT_BLOCK_LIGHT_UPDATE
/// Prevents the light from turning on while the light power is greater than 0.
/datum/element/light_eaten/proc/block_light_on(atom/eaten_light, new_on)
SIGNAL_HANDLER
if(new_on)
return COMPONENT_BLOCK_LIGHT_UPDATE
return NONE
/// Signal handler for light eater flavortext
/datum/element/light_eaten/proc/on_examine(atom/eaten_light, mob/examiner, list/examine_text)
SIGNAL_HANDLER
examine_text += span_warning("It's dark and empty...")
if(isliving(examiner) && prob(20))
var/mob/living/target = examiner
examine_text += span_danger("You can feel something in [eaten_light.p_them()] gnash at your eyes!")
target.adjust_temp_blindness(10 SECONDS)
target.set_eye_blur_if_lower(20 SECONDS)
return NONE