Merge pull request #8518 from Spookerton/spkrtn/sys/ssalarm

improved fire loop behavior of SSalarm
This commit is contained in:
Atermonera
2022-04-24 18:16:37 -08:00
committed by GitHub
43 changed files with 142 additions and 164 deletions

View File

@@ -1,19 +1,41 @@
/datum/controller
var/name
// The object used for the clickable stat() button.
var/obj/effect/statclick/statclick
/// The display name of this controller.
/datum/controller/var/name
/// The atom used to provide a clickable stat line in the MC tab for this controller.
/datum/controller/var/obj/effect/statclick/statclick
// Do not implement any base behaviors here.
/// Called to set up this controller.
/datum/controller/proc/Initialize()
return
//cleanup actions
// Do not implement any base behaviors here.
/// Called to clean up / finalize this controller.
/datum/controller/proc/Shutdown()
return
//when we enter dmm_suite.load_map
// Do not implement any base behaviors here.
/// Called when dmm_suite begins loading a map.
/datum/controller/proc/StartLoadingMap()
return
//when we exit dmm_suite.load_map
// Do not implement any base behaviors here.
/// Called when dmm_suite finishes loading a map.
/datum/controller/proc/StopLoadingMap()
return
// Do not implement any base behaviors here.
/// To be called on the OLD instance if the controller fails in some way that requires it to be replaced.
/datum/controller/proc/Recover()
return
// Do not implement any base behaviors here.
/// Called when an update to the stat line in the MC tab is requested.
/datum/controller/proc/stat_entry()
return

View File

@@ -11,7 +11,7 @@
GLOBAL_REAL(Master, /datum/controller/master) = new
//THIS IS THE INIT ORDER
//Master -> SSPreInit -> GLOB -> world -> config -> SSInit -> Failsafe
//Master -> SSOnNew -> GLOB -> world -> config -> SSInit -> Failsafe
//GOT IT MEMORIZED?
/datum/controller/master
@@ -176,7 +176,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
for (var/datum/controller/subsystem/SS in subsystems)
if (SS.flags & SS_NO_INIT)
continue
SS.Initialize(REALTIMEOFDAY)
SS.DoInitialize(REALTIMEOFDAY)
CHECK_TICK
current_ticklimit = TICK_LIMIT_RUNNING
var/time = (REALTIMEOFDAY - start_timeofday) / 10

View File

@@ -41,18 +41,32 @@
return ..()
/// Initializes the subsystem AFTER map load. The preferred initialization proc.
/datum/controller/subsystem/Initialize(start_timeofday)
/// Wrapper for non-implementation initialization behaviors.
/datum/controller/subsystem/proc/DoInitialize(timeofday)
Initialize(timeofday)
subsystem_initialized = TRUE
var/time = (REALTIMEOFDAY - start_timeofday) / 10
var/time = (REALTIMEOFDAY - timeofday) / 10
var/msg = "Initialized [name] subsystem within [time] second[time == 1 ? "" : "s"]!"
to_chat(world, "<span class='boldannounce'>[msg]</span>")
log_world(msg)
return time
/// Initializes the subsystem BEFORE map load. Called after recover, if recover is called.
/datum/controller/subsystem/proc/PreInit()
// Do not implement any base behaviors here.
/// Initializes the subsystem exactly once, AFTER map load, run by the MC and passed REALTIMEOFDAY. The preferred initialization proc.
/datum/controller/subsystem/Initialize(timeofday)
return
// Do not implement any base behaviors here.
/// Called in subsystem/New if there is an existing instance of the subsystem, on the existing instance, before it is deleted.
/datum/controller/subsystem/Recover()
return
// Do not implement any base behaviors here.
/// Called in subsystem/New - happens BEFORE map load, and ALSO every time the subsystem is Recovered, AFTER being Recovered.
/datum/controller/subsystem/proc/OnNew()
return

View File

@@ -30,7 +30,7 @@ SUBSYSTEM_DEF(air)
// This is used to tell CI WHERE the edges are.
var/list/startup_active_edge_log = list()
/datum/controller/subsystem/air/PreInit()
/datum/controller/subsystem/air/OnNew()
air_master = src
/datum/controller/subsystem/air/Initialize(timeofday)
@@ -63,7 +63,6 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun
log_debug("Active Edges on ZAS Startup\n" + edge_log.Join("\n"))
startup_active_edge_log = edge_log.Copy()
..()
/datum/controller/subsystem/air/fire(resumed, no_mc_tick)
var/timer

View File

@@ -1,45 +1,56 @@
// We manually initialize the alarm handlers instead of looping over all existing types
// 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()
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/subsystem/alarm/Initialize()
all_handlers = list(atmosphere_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm)
. = ..()
/// The list of alarm handlers this subsystem processes
var/static/tmp/list/datum/alarm_handler/handlers
/// The list of alarm handlers currently being processed
var/static/tmp/list/current = list()
/// The list of active alarms
var/static/tmp/list/active = list()
/datum/controller/subsystem/alarm/Initialize(timeofday)
handlers = list(
GLOB.atmosphere_alarm,
GLOB.camera_alarm,
GLOB.fire_alarm,
GLOB.motion_alarm,
GLOB.power_alarm
)
/datum/controller/subsystem/alarm/stat_entry(msg)
..("[active.len] alarm\s")
/datum/controller/subsystem/alarm/fire(resumed, no_mc_tick)
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()
active_alarm_cache += AH.alarms
if (MC_TICK_CHECK)
if (!resumed)
current = handlers.Copy()
active.Cut()
var/datum/alarm_handler/A
for (var/i = current.len to 1 step -1)
A = current[i]
A.process()
active += A.alarms
if (no_mc_tick)
CHECK_TICK
else if (MC_TICK_CHECK)
current.Cut(i)
return
current.Cut()
/datum/controller/subsystem/alarm/proc/active_alarms()
return active_alarm_cache.Copy()
/datum/controller/subsystem/alarm/proc/number_of_active_alarms()
return active_alarm_cache.len
GLOBAL_DATUM_INIT(atmosphere_alarm, /datum/alarm_handler/atmosphere, new)
/datum/controller/subsystem/alarm/stat_entry()
..("[number_of_active_alarms()] alarm\s")
GLOBAL_DATUM_INIT(camera_alarm, /datum/alarm_handler/camera, new)
GLOBAL_DATUM_INIT(fire_alarm, /datum/alarm_handler/fire, new)
GLOBAL_DATUM_INIT(motion_alarm, /datum/alarm_handler/motion, new)
GLOBAL_DATUM_INIT(power_alarm, /datum/alarm_handler/power, new)

View File

@@ -22,10 +22,7 @@ SUBSYSTEM_DEF(antags)
var/list/antag_datums = list()
var/list/antag_spawnpoints = list()
/datum/controller/subsystem/antags/Initialize()
. = ..()
// Set up antagonists.
/datum/controller/subsystem/antags/Initialize(timeofday)
for(var/antag_type in subtypesof(/datum/antagonist))
var/datum/antagonist/A = new antag_type
antag_datums[A.id] = A

View File

@@ -16,4 +16,3 @@ SUBSYSTEM_DEF(assets)
for(var/client/C in GLOB.clients)
addtimer(CALLBACK(GLOBAL_PROC, .proc/getFilesSlow, C, preload, FALSE), 10)
return ..()

View File

@@ -24,7 +24,6 @@ SUBSYSTEM_DEF(atoms)
setupgenetics() //to set the mutations' place in structural enzymes, so initializers know where to put mutations.
atom_init_stage = INITIALIZATION_INNEW_MAPLOAD
InitializeAtoms()
return ..()
/datum/controller/subsystem/atoms/proc/InitializeAtoms(var/list/supplied_atoms)

View File

@@ -11,18 +11,7 @@ SUBSYSTEM_DEF(character_setup)
var/list/newplayers_requiring_init = list()
var/list/save_queue = list()
/*
/datum/controller/subsystem/character_setup/Initialize()
while(prefs_awaiting_setup.len)
var/datum/preferences/prefs = prefs_awaiting_setup[prefs_awaiting_setup.len]
prefs_awaiting_setup.len--
prefs.setup()
while(newplayers_requiring_init.len)
var/mob/new_player/new_player = newplayers_requiring_init[newplayers_requiring_init.len]
newplayers_requiring_init.len--
new_player.deferred_login()
. = ..()
*/ //Might be useful if we ever switch to Bay prefs.
/datum/controller/subsystem/character_setup/fire(resumed, no_mc_tick)
while(save_queue.len)
var/datum/preferences/prefs = save_queue[save_queue.len]

View File

@@ -9,7 +9,6 @@ SUBSYSTEM_DEF(chat)
/datum/controller/subsystem/chat/Initialize(timeofday)
init_vchat()
..()
/datum/controller/subsystem/chat/fire(resumed, no_mc_tick)
var/list/msg_queue = src.msg_queue // Local variable for sanic speed.

View File

@@ -15,10 +15,9 @@ SUBSYSTEM_DEF(chemistry)
chemical_reactions = SSchemistry.chemical_reactions
chemical_reagents = SSchemistry.chemical_reagents
/datum/controller/subsystem/chemistry/Initialize()
/datum/controller/subsystem/chemistry/Initialize(timeofday)
initialize_chemical_reagents()
initialize_chemical_reactions()
..()
/datum/controller/subsystem/chemistry/stat_entry()
..("C: [chemical_reagents.len] | R: [chemical_reactions.len]")

View File

@@ -14,12 +14,8 @@ SUBSYSTEM_DEF(circuit)
var/list/circuit_fabricator_recipe_list = list() // Associative list of [category_name]:[list_of_circuit_paths] pairs
// var/cost_multiplier = MINERAL_MATERIAL_AMOUNT / 10 // Each circuit cost unit is 200cm3
/datum/controller/subsystem/circuit/Recover()
flags |= SS_NO_INIT // Make extra sure we don't initialize twice.
/datum/controller/subsystem/circuit/Initialize(timeofday)
circuits_init()
return ..()
/datum/controller/subsystem/circuit/proc/circuits_init()
//Cached lists for free performance

View File

@@ -12,7 +12,7 @@ SUBSYSTEM_DEF(events)
var/datum/event_meta/new_event = new
/datum/controller/subsystem/events/Initialize()
/datum/controller/subsystem/events/Initialize(timeofday)
allEvents = typesof(/datum/event) - /datum/event
event_containers = list(
EVENT_LEVEL_MUNDANE = new/datum/event_container/mundane,
@@ -21,7 +21,6 @@ SUBSYSTEM_DEF(events)
)
if(global.using_map.use_overmap)
GLOB.overmap_event_handler.create_events(global.using_map.overmap_z, global.using_map.overmap_size, global.using_map.overmap_event_areas)
return ..()
/datum/controller/subsystem/events/fire(resumed, no_mc_tick)
if (!resumed)

View File

@@ -23,7 +23,7 @@ SUBSYSTEM_DEF(game_master)
var/debug_messages = FALSE // If true, debug information is written to `log_debug()`.
/datum/controller/subsystem/game_master/Initialize()
/datum/controller/subsystem/game_master/Initialize(timeofday)
var/list/subtypes = subtypesof(/datum/event2/meta)
for(var/T in subtypes)
var/datum/event2/meta/M = new T()
@@ -36,8 +36,6 @@ SUBSYSTEM_DEF(game_master)
if(config && !config.enable_game_master)
can_fire = FALSE
return ..()
/datum/controller/subsystem/game_master/fire(resumed, no_mc_tick)
adjust_staleness(1)
adjust_danger(-1)

View File

@@ -30,7 +30,7 @@ SUBSYSTEM_DEF(garbage)
var/list/queues
/datum/controller/subsystem/garbage/PreInit()
/datum/controller/subsystem/garbage/OnNew()
queues = new(GC_QUEUE_COUNT)
pass_counts = new(GC_QUEUE_COUNT)
fail_counts = new(GC_QUEUE_COUNT)

View File

@@ -11,12 +11,8 @@ SUBSYSTEM_DEF(holomaps)
var/static/list/extraMiniMaps = list()
var/static/list/station_holomaps = list()
/datum/controller/subsystem/holomaps/Recover()
flags |= SS_NO_INIT // Make extra sure we don't initialize twice.
/datum/controller/subsystem/holomaps/Initialize(timeofday)
generateHoloMinimaps()
. = ..()
/datum/controller/subsystem/holomaps/stat_entry(msg)
if (!Debug2)

View File

@@ -16,7 +16,6 @@ SUBSYSTEM_DEF(job)
setup_departments()
if(!occupations.len)
setup_occupations()
return ..()
/datum/controller/subsystem/job/proc/setup_occupations(faction = "Station")
occupations = list()

View File

@@ -40,7 +40,6 @@ SUBSYSTEM_DEF(lighting)
internal_process_lights(FALSE, TRUE)
internal_process_corners(FALSE, TRUE)
internal_process_overlays(FALSE, TRUE)
return ..()
/datum/controller/subsystem/lighting/fire(resumed, no_mc_tick)
var/timer

View File

@@ -37,7 +37,6 @@ SUBSYSTEM_DEF(machines)
admin_notice("<span class='danger'>Initializing atmos machinery.</span>", R_DEBUG)
setup_atmos_machinery(global.machines)
fire()
..()
/datum/controller/subsystem/machines/fire(resumed, no_mc_tick)
var/timer = TICK_USAGE
@@ -162,16 +161,6 @@ SUBSYSTEM_DEF(machines)
if(MC_TICK_CHECK)
return
/datum/controller/subsystem/machines/Recover()
// TODO - PHASE 2
// if (istype(SSmachines.pipenets))
// pipenets = SSmachines.pipenets
// if (istype(SSmachines.machinery))
// machinery = SSmachines.machinery
// if (istype(SSmachines.powernets))
// powernets = SSmachines.powernets
// if (istype(SSmachines.power_objects))
// power_objects = SSmachines.power_objects
#undef SSMACHINES_PIPENETS
#undef SSMACHINES_MACHINERY

View File

@@ -16,7 +16,6 @@ SUBSYSTEM_DEF(mapping)
var/list/engine_submap_landmarks = list()
/datum/controller/subsystem/mapping/Recover()
flags |= SS_NO_INIT // Make extra sure we don't initialize twice.
shelter_templates = SSmapping.shelter_templates
/datum/controller/subsystem/mapping/Initialize(timeofday)
@@ -46,7 +45,6 @@ SUBSYSTEM_DEF(mapping)
// Lateload Code related to Expedition areas.
// if(using_map)
// loadLateMaps()
..()
/datum/controller/subsystem/mapping/proc/log_mapload(msg)
to_world_log(" [name]: [msg]")

View File

@@ -10,14 +10,9 @@ SUBSYSTEM_DEF(nightshift)
var/high_security_mode = FALSE
/datum/controller/subsystem/nightshift/Initialize()
/datum/controller/subsystem/nightshift/Initialize(timeofday)
if(!config.enable_night_shifts)
can_fire = FALSE
/*
if(config.randomize_shift_time)
GLOB.gametime_offset = rand(0, 23) HOURS
*/
return ..()
/datum/controller/subsystem/nightshift/fire(resumed, no_mc_tick)
if(round_duration_in_ds < nightshift_first_check)

View File

@@ -20,11 +20,6 @@ SUBSYSTEM_DEF(open_space)
initialize_open_space()
// Pre-process open space turfs once before the round starts.
fire(FALSE, TRUE)
return ..()
/datum/controller/subsystem/open_space/Recover()
flags |= SS_NO_INIT // Make extra sure we don't initialize twice.
. = ..()
/datum/controller/subsystem/open_space/fire(resumed, no_mc_tick)
// We use a different list so any additions to the update lists during a delay from MC_TICK_CHECK

View File

@@ -14,15 +14,14 @@ var/global/image/stringbro = new() // Temporarily super-global because of BYOND
var/global/image/iconbro = new() // Temporarily super-global because of BYOND init order dumbness.
var/global/image/appearance_bro = new() // Temporarily super-global because of BYOND init order dumbness.
/datum/controller/subsystem/overlays/PreInit()
/datum/controller/subsystem/overlays/OnNew()
overlay_icon_state_caches = list()
overlay_icon_cache = list()
queue = list()
stats = list()
/datum/controller/subsystem/overlays/Initialize()
/datum/controller/subsystem/overlays/Initialize(timeofday)
fire(FALSE, TRUE)
..()
/datum/controller/subsystem/overlays/stat_entry()
..("Ov:[length(queue)]")

View File

@@ -5,8 +5,7 @@ SUBSYSTEM_DEF(persistence)
var/list/tracking_values = list()
var/list/persistence_datums = list()
/datum/controller/subsystem/persistence/Initialize()
. = ..()
/datum/controller/subsystem/persistence/Initialize(timeofday)
for(var/thing in subtypesof(/datum/persistent))
var/datum/persistent/P = thing
if(initial(P.name))

View File

@@ -17,7 +17,6 @@ SUBSYSTEM_DEF(planets)
/datum/controller/subsystem/planets/Initialize(timeofday)
admin_notice("<span class='danger'>Initializing planetary weather.</span>", R_DEBUG)
createPlanets()
..()
/datum/controller/subsystem/planets/proc/createPlanets()
var/list/planet_datums = using_map.planet_datums_to_make

View File

@@ -35,7 +35,7 @@ SUBSYSTEM_DEF(shuttles)
var/tmp/list/current_run // Shuttles remaining to process this fire() tick
/datum/controller/subsystem/shuttles/PreInit()
/datum/controller/subsystem/shuttles/OnNew()
global.shuttle_controller = src // TODO - Remove this! Change everything to point at SSshuttles intead
/datum/controller/subsystem/shuttles/Initialize(timeofday)
@@ -49,7 +49,6 @@ SUBSYSTEM_DEF(shuttles)
LAZYDISTINCTADD(shuttles_to_initialize, shuttle_type)
block_init_queue = FALSE
process_init_queues()
return ..()
/datum/controller/subsystem/shuttles/fire(resumed, no_mc_tick)
if (!resumed)

View File

@@ -12,7 +12,7 @@ SUBSYSTEM_DEF(skybox)
var/static/list/phase_shift_by_x = list()
var/static/list/phase_shift_by_y = list()
/datum/controller/subsystem/skybox/PreInit()
/datum/controller/subsystem/skybox/OnNew()
//Static
for (var/i in 0 to 25)
var/image/im = image('icons/turf/space_dust.dmi', "[i]")
@@ -60,10 +60,6 @@ SUBSYSTEM_DEF(skybox)
phase_shift_by_x = get_cross_shift_list(15)
phase_shift_by_y = get_cross_shift_list(15)
. = ..()
/datum/controller/subsystem/skybox/Initialize()
. = ..()
/datum/controller/subsystem/skybox/proc/get_skybox(z)
if(!skybox_cache["[z]"])

View File

@@ -4,7 +4,6 @@ SUBSYSTEM_DEF(supply)
name = "Supply"
wait = 20 SECONDS
priority = FIRE_PRIORITY_SUPPLY
//Initializes at default time
flags = SS_NO_TICK_CHECK
//supply points
@@ -24,7 +23,7 @@ SUBSYSTEM_DEF(supply)
var/movetime = 1200
var/datum/shuttle/autodock/ferry/supply/shuttle
/datum/controller/subsystem/supply/Initialize()
/datum/controller/subsystem/supply/Initialize(timeofday)
ordernum = rand(1,9000)
// build master supply list
@@ -35,8 +34,6 @@ SUBSYSTEM_DEF(supply)
else
qdel(P)
. = ..()
// Supply shuttle ticker - handles supply point regeneration. Just add points over time.
/datum/controller/subsystem/supply/fire(resumed, no_mc_tick)
points += points_per_process

View File

@@ -22,7 +22,7 @@ SUBSYSTEM_DEF(tgui)
current.Cut()
/datum/controller/subsystem/tgui/PreInit()
/datum/controller/subsystem/tgui/OnNew()
base_html = file2text('tgui/packages/tgui/public/tgui.html')

View File

@@ -47,10 +47,10 @@ SUBSYSTEM_DEF(ticker)
// This global variable exists for legacy support so we don't have to rename every 'ticker' to 'SSticker' yet.
var/global/datum/controller/subsystem/ticker/ticker
/datum/controller/subsystem/ticker/PreInit()
/datum/controller/subsystem/ticker/OnNew()
global.ticker = src // TODO - Remove this! Change everything to point at SSticker intead
/datum/controller/subsystem/ticker/Initialize()
/datum/controller/subsystem/ticker/Initialize(timeofday)
pregame_timeleft = config.pregame_time
send2mainirc("Server lobby is loaded and open at byond://[config.serverurl ? config.serverurl : (config.server ? config.server : "[world.address]:[world.port]")]")
SSwebhooks.send(
@@ -61,7 +61,6 @@ var/global/datum/controller/subsystem/ticker/ticker
)
)
GLOB.autospeaker = new (null, null, null, 1) //Set up Global Announcer
return ..()
/datum/controller/subsystem/ticker/fire(resumed, no_mc_tick)
switch(current_state)

View File

@@ -28,7 +28,7 @@ SUBSYSTEM_DEF(timer)
var/static/last_invoke_warning = 0
var/static/bucket_auto_reset = TRUE
/datum/controller/subsystem/timer/PreInit()
/datum/controller/subsystem/timer/OnNew()
bucket_list.len = BUCKET_LEN
head_offset = world.time
bucket_resolution = world.tick_lag

View File

@@ -4,9 +4,8 @@ SUBSYSTEM_DEF(webhooks)
flags = SS_NO_FIRE
var/list/webhook_decls = list()
/datum/controller/subsystem/webhooks/Initialize()
/datum/controller/subsystem/webhooks/Initialize(timeofday)
load_webhooks()
. = ..()
/datum/controller/subsystem/webhooks/proc/load_webhooks()

View File

@@ -16,7 +16,6 @@ SUBSYSTEM_DEF(xenoarch)
/datum/controller/subsystem/xenoarch/Initialize(timeofday)
SetupXenoarch()
..()
/datum/controller/subsystem/xenoarch/Recover()
if (istype(SSxenoarch.artifact_spawning_turfs))