/tg/ Station 13 - Modules - TypesVar Details - Proc Details

Subsystem base class

Defines a subsystem to be managed by the Master Controller

Simply define a child of this subsystem, using the [SUBSYSTEM_DEF] macro, and the MC will handle registration. Changing the name is required

Vars

can_fireSet to 0 to prevent fire() calls, mostly for admin use or subsystems that may be resumed later use the SS_NO_FIRE flag instead for systems that never fire to keep it from even being added to list that is checked every tick
costRunning average of the amount of milliseconds it takes the subsystem to complete a run (including all resumes but not the time spent paused)
failure_strikesHow many times we suspect a subsystem type has crashed the MC, 3 strikes and you're out!
flagsSubsystem Flags to control binary behavior. Flags must be set at compile time or before preinit finishes to take full effect. (You can also restart the mc to force them to process again)
init_orderOrder of initialization. Higher numbers are initialized first, lower numbers later. Use or create defines such as [INIT_ORDER_DEFAULT] so we can see the order in one file.
init_stageWhich stage does this subsystem init at. Earlier stages can fire while later stages init.
initialization_failure_messageString to store an applicable error message for a subsystem crashing, used to help debug crashes in contexts such as Continuous Integration/Unit Tests
initializedThis var is set to TRUE after the subsystem has been initialized.
last_fireLast world.time the subsystem completed a run (as in wasn't paused by [MC_TICK_CHECK])
nameName of the subsystem - you must change this
next_fireScheduled world.time for next fire()
paused_tick_usageTracks how much of a tick the subsystem has consumed in the current run
paused_ticksTracks how many fires the subsystem has consecutively paused on in the current run
postponed_firesHow many fires have we been requested to postpone
priorityPriority Weight: When multiple subsystems need to run in the same tick, higher priority subsystems will be given a higher share of the tick before MC_TICK_CHECK triggers a sleep, higher priority subsystems also run before lower priority subsystems
profiler_focusedboolean set by admins. if TRUE then this subsystem will stop the world profiler after ignite() returns and start it again when called. used so that you can audit a specific subsystem or group of subsystems' synchronous call chain.
queue_nextNext subsystem in the queue of subsystems to run this tick
queue_prevPrevious subsystem in the queue of subsystems to run this tick
queued_priorityPriority at the time the subsystem entered the queue. Needed to avoid changes in priority (by admins and the like) from breaking things.
queued_timeTime the subsystem entered the queue, (for timing and priority reasons)
rolling_usageFlat list of usage and time, every odd index is a log time, every even index is a usage
runlevelsBitmap of what game states can this subsystem fire at. See [RUNLEVELS_DEFAULT] for more details.
slept_countTracks how many times a subsystem has ever slept in fire().
stateTracks the current execution state of the subsystem. Used to handle subsystems that sleep in fire so the mc doesn't run them again while they are sleeping
tick_allocation_avgHow much of a tick (in percents of a tick) do we get allocated by the mc on avg.
tick_allocation_lastHow much of a tick (in percents of a tick) were we allocated last fire.
tick_overrunRunning average of the amount of tick usage (in percents of a game tick) the subsystem has spent past its allocated time without pausing
tick_usageRunning average of the amount of tick usage in percents of a tick it takes the subsystem to complete a run
ticksTracks how many fires the subsystem takes to complete a run on average.
times_firedTracks the amount of completed runs for the subsystem
waitTime to wait (in deciseconds) between each call to fire(). Must be a positive integer.

Procs

InitializeUsed to initialize the subsystem. This is expected to be overridden by subtypes.
OnConfigLoadCalled after the config has been loaded or reloaded.
PreInitdatum/controller/subsystem/New()
enqueueQueue it to run. (we loop thru a linked list until we get to the end or find the right point) (this lets us sort our run order correctly without having to re-sort the entire already sorted list)
firepreviously, this would have been named 'process()' but that name is used everywhere for different things! fire() seems more suitable. This is the procedure that gets called every 'wait' deciseconds. Sleeping in here prevents future fires until returned.
igniteThis is used so the mc knows when the subsystem sleeps. do not override.
postponeCauses the next "cycle" fires to be missed. Effect is accumulative but can reset by calling update_nextfire(reset_time = TRUE)
prune_rolling_usagePrunes out of date entries in our rolling usage list
update_nextfire

Var Details

can_fire

Set to 0 to prevent fire() calls, mostly for admin use or subsystems that may be resumed later use the SS_NO_FIRE flag instead for systems that never fire to keep it from even being added to list that is checked every tick

cost

Running average of the amount of milliseconds it takes the subsystem to complete a run (including all resumes but not the time spent paused)

failure_strikes

How many times we suspect a subsystem type has crashed the MC, 3 strikes and you're out!

flags

Subsystem Flags to control binary behavior. Flags must be set at compile time or before preinit finishes to take full effect. (You can also restart the mc to force them to process again)

init_order

Order of initialization. Higher numbers are initialized first, lower numbers later. Use or create defines such as [INIT_ORDER_DEFAULT] so we can see the order in one file.

init_stage

Which stage does this subsystem init at. Earlier stages can fire while later stages init.

initialization_failure_message

String to store an applicable error message for a subsystem crashing, used to help debug crashes in contexts such as Continuous Integration/Unit Tests

initialized

This var is set to TRUE after the subsystem has been initialized.

last_fire

Last world.time the subsystem completed a run (as in wasn't paused by [MC_TICK_CHECK])

name

Name of the subsystem - you must change this

next_fire

Scheduled world.time for next fire()

paused_tick_usage

Tracks how much of a tick the subsystem has consumed in the current run

paused_ticks

Tracks how many fires the subsystem has consecutively paused on in the current run

postponed_fires

How many fires have we been requested to postpone

priority

Priority Weight: When multiple subsystems need to run in the same tick, higher priority subsystems will be given a higher share of the tick before MC_TICK_CHECK triggers a sleep, higher priority subsystems also run before lower priority subsystems

profiler_focused

boolean set by admins. if TRUE then this subsystem will stop the world profiler after ignite() returns and start it again when called. used so that you can audit a specific subsystem or group of subsystems' synchronous call chain.

queue_next

Next subsystem in the queue of subsystems to run this tick

queue_prev

Previous subsystem in the queue of subsystems to run this tick

queued_priority

Priority at the time the subsystem entered the queue. Needed to avoid changes in priority (by admins and the like) from breaking things.

queued_time

Time the subsystem entered the queue, (for timing and priority reasons)

rolling_usage

Flat list of usage and time, every odd index is a log time, every even index is a usage

runlevels

Bitmap of what game states can this subsystem fire at. See [RUNLEVELS_DEFAULT] for more details.

slept_count

Tracks how many times a subsystem has ever slept in fire().

state

Tracks the current execution state of the subsystem. Used to handle subsystems that sleep in fire so the mc doesn't run them again while they are sleeping

tick_allocation_avg

How much of a tick (in percents of a tick) do we get allocated by the mc on avg.

tick_allocation_last

How much of a tick (in percents of a tick) were we allocated last fire.

tick_overrun

Running average of the amount of tick usage (in percents of a game tick) the subsystem has spent past its allocated time without pausing

tick_usage

Running average of the amount of tick usage in percents of a tick it takes the subsystem to complete a run

ticks

Tracks how many fires the subsystem takes to complete a run on average.

times_fired

Tracks the amount of completed runs for the subsystem

wait

Time to wait (in deciseconds) between each call to fire(). Must be a positive integer.

Proc Details

Initialize

Used to initialize the subsystem. This is expected to be overridden by subtypes.

OnConfigLoad

Called after the config has been loaded or reloaded.

PreInit

datum/controller/subsystem/New()

enqueue

Queue it to run. (we loop thru a linked list until we get to the end or find the right point) (this lets us sort our run order correctly without having to re-sort the entire already sorted list)

fire

previously, this would have been named 'process()' but that name is used everywhere for different things! fire() seems more suitable. This is the procedure that gets called every 'wait' deciseconds. Sleeping in here prevents future fires until returned.

ignite

This is used so the mc knows when the subsystem sleeps. do not override.

postpone

Causes the next "cycle" fires to be missed. Effect is accumulative but can reset by calling update_nextfire(reset_time = TRUE)

prune_rolling_usage

Prunes out of date entries in our rolling usage list

update_nextfire