From 8da8e3e0b13e22ee791b470978bc8d35adf3d054 Mon Sep 17 00:00:00 2001 From: Leshana Date: Wed, 25 Mar 2020 15:00:02 -0400 Subject: [PATCH] Convert alarm_manager into SSalarm subsystem. - Switch to using MC_TICK_CHECK and replace all references. - Optimize stat panel display by caching the active alarms. --- code/__defines/subsystems.dm | 2 + code/controllers/subsystems/alarm.dm | 55 ++++++++++--------- code/controllers/verbs.dm | 1 - code/modules/mob/living/silicon/silicon.dm | 2 +- code/modules/mob/living/silicon/subystems.dm | 2 +- .../programs/engineering/alarm_monitor.dm | 2 +- 6 files changed, 34 insertions(+), 30 deletions(-) diff --git a/code/__defines/subsystems.dm b/code/__defines/subsystems.dm index a3320983ca..1790890dfb 100644 --- a/code/__defines/subsystems.dm +++ b/code/__defines/subsystems.dm @@ -68,6 +68,7 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G #define INIT_ORDER_PLANETS -4 #define INIT_ORDER_HOLOMAPS -5 #define INIT_ORDER_OVERLAY -6 +#define INIT_ORDER_ALARM -7 #define INIT_ORDER_XENOARCH -20 #define INIT_ORDER_CIRCUIT -21 #define INIT_ORDER_AI -22 @@ -83,6 +84,7 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G #define FIRE_PRIORITY_VOTE 9 #define FIRE_PRIORITY_AI 10 #define FIRE_PRIORITY_GARBAGE 15 +#define FIRE_PRIORITY_ALARM 20 #define FIRE_PRIORITY_CHARSETUP 25 #define FIRE_PRIORITY_AIRFLOW 30 #define FIRE_PRIORITY_AIR 35 diff --git a/code/controllers/subsystems/alarm.dm b/code/controllers/subsystems/alarm.dm index 3590149811..4b6140e507 100644 --- a/code/controllers/subsystems/alarm.dm +++ b/code/controllers/subsystems/alarm.dm @@ -1,42 +1,45 @@ // We manually initialize the alarm handlers instead of looping over all existing types -// to make it possible to write: camera.triggerAlarm() rather than alarm_manager.managers[datum/alarm_handler/camera].triggerAlarm() or a variant thereof. +// to make it possible to write: camera_alarm.triggerAlarm() rather than SSalarm.managers[datum/alarm_handler/camera].triggerAlarm() or a variant thereof. /var/global/datum/alarm_handler/atmosphere/atmosphere_alarm = new() /var/global/datum/alarm_handler/camera/camera_alarm = new() /var/global/datum/alarm_handler/fire/fire_alarm = new() /var/global/datum/alarm_handler/motion/motion_alarm = new() /var/global/datum/alarm_handler/power/power_alarm = new() -// Alarm Manager, the manager for alarms. -var/datum/controller/process/alarm/alarm_manager +SUBSYSTEM_DEF(alarm) + name = "Alarm" + wait = 2 SECONDS + priority = FIRE_PRIORITY_ALARM + init_order = INIT_ORDER_ALARM + var/list/datum/alarm/all_handlers + var/tmp/list/currentrun = null + var/static/list/active_alarm_cache = list() -/datum/controller/process/alarm - var/list/datum/alarm/all_handlers = list() - -/datum/controller/process/alarm/setup() - name = "alarm" - schedule_interval = 20 // every 2 seconds +/datum/controller/subsystem/alarm/Initialize() all_handlers = list(atmosphere_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm) - alarm_manager = src + . = ..() -/datum/controller/process/alarm/doWork() - for(last_object in all_handlers) - var/datum/alarm_handler/AH = last_object +/datum/controller/subsystem/alarm/fire(resumed = FALSE) + if(!resumed) + src.currentrun = all_handlers.Copy() + active_alarm_cache.Cut() + + var/list/currentrun = src.currentrun // Cache for sanic speed + while (currentrun.len) + var/datum/alarm_handler/AH = currentrun[currentrun.len] + currentrun.len-- AH.process() - SCHECK + active_alarm_cache += AH.alarms -/datum/controller/process/alarm/proc/active_alarms() - var/list/all_alarms = new - for(var/datum/alarm_handler/AH in all_handlers) - var/list/alarms = AH.alarms - all_alarms += alarms + if (MC_TICK_CHECK) + return - return all_alarms +/datum/controller/subsystem/alarm/proc/active_alarms() + return active_alarm_cache.Copy() -/datum/controller/process/alarm/proc/number_of_active_alarms() - var/list/alarms = active_alarms() - return alarms.len +/datum/controller/subsystem/alarm/proc/number_of_active_alarms() + return active_alarm_cache.len -/datum/controller/process/alarm/statProcess() - ..() - stat(null, "[number_of_active_alarms()] alarm\s") +/datum/controller/subsystem/alarm/stat_entry() + ..("[number_of_active_alarms()] alarm\s") diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index 7dce6bc834..2dc3b1626b 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -100,7 +100,6 @@ options["LEGACY: transfer_controller"] = transfer_controller options["LEGACY: gas_data"] = gas_data options["LEGACY: plant_controller"] = plant_controller - options["LEGACY: alarm_manager"] = alarm_manager var/pick = input(mob, "Choose a controller to debug/view variables of.", "VV controller:") as null|anything in options if(!pick) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index b2959539b2..6c7456f80e 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -37,7 +37,7 @@ /mob/living/silicon/Destroy() silicon_mob_list -= src - for(var/datum/alarm_handler/AH in alarm_manager.all_handlers) + for(var/datum/alarm_handler/AH in SSalarm.all_handlers) AH.unregister_alarm(src) return ..() diff --git a/code/modules/mob/living/silicon/subystems.dm b/code/modules/mob/living/silicon/subystems.dm index 1dae0026aa..ac10167c2d 100644 --- a/code/modules/mob/living/silicon/subystems.dm +++ b/code/modules/mob/living/silicon/subystems.dm @@ -38,7 +38,7 @@ if(!register_alarms) return - for(var/datum/alarm_handler/AH in alarm_manager.all_handlers) + for(var/datum/alarm_handler/AH in SSalarm.all_handlers) AH.register_alarm(src, /mob/living/silicon/proc/receive_alarm) queued_alarms[AH] = list() // Makes sure alarms remain listed in consistent order diff --git a/code/modules/modular_computers/file_system/programs/engineering/alarm_monitor.dm b/code/modules/modular_computers/file_system/programs/engineering/alarm_monitor.dm index 20c4dde1ca..c887034754 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/alarm_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/alarm_monitor.dm @@ -42,7 +42,7 @@ /datum/nano_module/alarm_monitor/all/New() ..() - alarm_handlers = alarm_manager.all_handlers + alarm_handlers = SSalarm.all_handlers /datum/nano_module/alarm_monitor/engineering/New() ..()