mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-28 18:11:16 +00:00
## About The Pull Request
As the title says.
`init_order` is no more, subsystems ordering now depends on their
declared dependencies.
Subsystems can now declare which other subsystems need to init before
them using a list and the subsystem's typepath
I.e.
```dm
dependencies = list(
/datum/controller/subsystem/atoms,
/datum/controller/subsystem/mapping
)
```
The reverse can also be done, if a subsystem must initialize after your
own:
```dm
dependents = list(
/datum/controller/subsystem/atoms
)
```
Cyclical dependencies are not allowed and will throw an error on
initialization if one is found.
There's also a debug tool to visualize the dependency graph, although
it's a bit basic:

Subsystem load ordering can still be controlled using `init_stage`, some
subsystems use this in cases where they must initialize first or last
regardless of dependencies. An error will be thrown if a subsystem has
an `init_stage` before one of their dependencies.
## Why It's Good For The Game
Makes dealing with subsystem dependencies easier, and reduces the chance
of making a dependency error when needing to shift around subsystem
inits.
## Changelog
🆑
refactor: Refactored subsystem initialization
/🆑
69 lines
1.9 KiB
Plaintext
69 lines
1.9 KiB
Plaintext
SUBSYSTEM_DEF(title)
|
|
name = "Title Screen"
|
|
flags = SS_NO_FIRE
|
|
init_stage = INITSTAGE_EARLY
|
|
var/file_path
|
|
var/icon/icon
|
|
var/icon/previous_icon
|
|
var/turf/closed/indestructible/splashscreen/splash_turf
|
|
|
|
/datum/controller/subsystem/title/Initialize()
|
|
if(file_path && icon)
|
|
return SS_INIT_SUCCESS
|
|
|
|
if(fexists("data/previous_title.dat"))
|
|
var/previous_path = file2text("data/previous_title.dat")
|
|
if(istext(previous_path))
|
|
previous_icon = new(previous_icon)
|
|
fdel("data/previous_title.dat")
|
|
|
|
var/list/provisional_title_screens = flist("[global.config.directory]/title_screens/images/")
|
|
var/list/title_screens = list()
|
|
var/use_rare_screens = prob(1)
|
|
|
|
for(var/S in provisional_title_screens)
|
|
var/list/L = splittext(S,"+")
|
|
if((L.len == 1 && (L[1] != "exclude" && L[1] != "blank.png")) || (L.len > 1 && ((use_rare_screens && LOWER_TEXT(L[1]) == "rare") || (LOWER_TEXT(L[1]) == LOWER_TEXT(SSmapping.current_map.map_name)))))
|
|
title_screens += S
|
|
|
|
if(length(title_screens))
|
|
file_path = "[global.config.directory]/title_screens/images/[pick(title_screens)]"
|
|
|
|
if(!file_path)
|
|
file_path = "icons/runtime/default_title.dmi"
|
|
|
|
ASSERT(fexists(file_path))
|
|
|
|
icon = new(fcopy_rsc(file_path))
|
|
|
|
if(splash_turf)
|
|
splash_turf.icon = icon
|
|
splash_turf.handle_generic_titlescreen_sizes()
|
|
|
|
return SS_INIT_SUCCESS
|
|
|
|
/datum/controller/subsystem/title/vv_edit_var(var_name, var_value)
|
|
. = ..()
|
|
if(.)
|
|
switch(var_name)
|
|
if(NAMEOF(src, icon))
|
|
if(splash_turf)
|
|
splash_turf.icon = icon
|
|
|
|
/datum/controller/subsystem/title/Shutdown()
|
|
if(file_path)
|
|
var/F = file("data/previous_title.dat")
|
|
WRITE_FILE(F, file_path)
|
|
|
|
for(var/thing in GLOB.clients)
|
|
if(!thing)
|
|
continue
|
|
var/atom/movable/screen/splash/S = new(null, thing, FALSE)
|
|
S.Fade(FALSE,FALSE)
|
|
|
|
/datum/controller/subsystem/title/Recover()
|
|
icon = SStitle.icon
|
|
splash_turf = SStitle.splash_turf
|
|
file_path = SStitle.file_path
|
|
previous_icon = SStitle.previous_icon
|