Files
Bubberstation/code/modules/modular_computers/file_system/programs/alarm.dm
Gear ef959b28d2 Relocate alarm monitor display update code to the signal handler instead of process tick (#74824)
## About The Pull Request
This very simply makes alarm monitor UI and icon updates event based
instead of updating them with the processing loop.
The original proc also included unnecessary conditionals, these have
been worked out.
## Why It's Good For The Game
Instead of updating alarm monitors every single program tick, we could
instead update them only when alarms actually update. This improves
responsiveness for when alarms go off (we don't wait for the next
program tick and instead update immediately), and prevents us from
running unnecessary conditionals and icon updates.
## Changelog
🆑
code: Update active alarm monitor computers only when alarms are
actually changed instead of every program tick
/🆑

---------

Co-authored-by: Gear <gear@gear.is>
2023-04-20 17:21:37 -06:00

57 lines
2.1 KiB
Plaintext

/datum/computer_file/program/alarm_monitor
filename = "alarmmonitor"
filedesc = "Canary"
category = PROGRAM_CATEGORY_ENGI
ui_header = "alarm_green.gif"
program_icon_state = "alert-green"
extended_desc = "This program provides visual interface for a station's alarm system."
requires_ntnet = 1
size = 4
tgui_id = "NtosStationAlertConsole"
program_icon = "bell"
/// If there is any station alert
var/has_alert = FALSE
/// Station alert datum for showing alerts UI
var/datum/station_alert/alert_control
/datum/computer_file/program/alarm_monitor/on_install()
. = ..()
//We want to send an alarm if we're in one of the mining home areas
//Or if we're on station. Otherwise, die.
var/list/allowed_areas = GLOB.the_station_areas + typesof(/area/mine)
alert_control = new(computer, list(ALARM_ATMOS, ALARM_FIRE, ALARM_POWER), listener_areas = allowed_areas)
RegisterSignals(alert_control.listener, list(COMSIG_ALARM_LISTENER_TRIGGERED, COMSIG_ALARM_LISTENER_CLEARED), PROC_REF(update_alarm_display))
/datum/computer_file/program/alarm_monitor/Destroy()
QDEL_NULL(alert_control)
return ..()
/datum/computer_file/program/alarm_monitor/ui_data(mob/user)
var/list/data = list()
data += alert_control.ui_data(user)
return data
/datum/computer_file/program/alarm_monitor/proc/update_alarm_display()
SIGNAL_HANDLER
// has_alert is true if there are any active alarms in our listener.
has_alert = (length(alert_control.listener.alarms) > 0)
if(!has_alert)
program_icon_state = "alert-green"
ui_header = "alarm_green.gif"
else
// If we don't know the status, assume the worst.
// Technically we should never have anything other than a truthy or falsy value
// but this will allow for unknown values to fall through to be an actual alert.
program_icon_state = "alert-red"
ui_header = "alarm_red.gif"
update_computer_icon() // Always update the icon after we check our conditional because we might've changed it
/datum/computer_file/program/alarm_monitor/on_start(mob/user)
. = ..(user)
GLOB.alarmdisplay += src
/datum/computer_file/program/alarm_monitor/kill_program(forced = FALSE)
GLOB.alarmdisplay -= src
return ..()