-
Notifications
You must be signed in to change notification settings - Fork 224
/
Copy pathweather.dm
65 lines (54 loc) · 2.5 KB
/
weather.dm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
SUBSYSTEM_DEF(weather)
name = "Weather"
wait = 15 SECONDS
init_order = SS_INIT_WEATHER
priority = SS_PRIORITY_WEATHER
flags = SS_BACKGROUND
var/list/weather_systems = list()
var/list/weather_by_z = list()
var/list/processing_systems
/datum/controller/subsystem/weather/stat_entry()
..("all systems: [length(weather_systems)], processing systems: [length(processing_systems)]")
/datum/controller/subsystem/weather/Initialize(start_timeofday)
. = ..()
for(var/obj/abstract/weather_system/weather as anything in weather_systems)
weather.init_weather()
/datum/controller/subsystem/weather/fire(resumed)
if(!resumed)
processing_systems = weather_systems.Copy()
var/obj/abstract/weather_system/weather
while(processing_systems.len)
weather = processing_systems[processing_systems.len]
processing_systems.len--
weather.tick()
if(MC_TICK_CHECK)
return
///Sets a weather state to use for a given z level/z level stack. topmost_level may be a level_id or a level_data instance.
/datum/controller/subsystem/weather/proc/setup_weather_system(var/datum/level_data/topmost_level, var/decl/state/weather/initial_state, list/banned_states)
if(istext(topmost_level))
topmost_level = SSmapping.levels_by_id[topmost_level]
//First check and clear any existing weather system on the level
var/obj/abstract/weather_system/WS = weather_by_z[topmost_level.level_z]
if(WS)
unregister_weather_system(WS)
qdel(WS)
//Create the new weather system and let it register itself
new /obj/abstract/weather_system(locate(1, 1, topmost_level.level_z), topmost_level.level_z, initial_state, banned_states)
///Registers a given weather system obj for getting updates by SSweather.
/datum/controller/subsystem/weather/proc/register_weather_system(var/obj/abstract/weather_system/WS)
if(weather_by_z[WS.z])
CRASH("Trying to register another weather system on the same z-level([WS.z]) as an existing one!")
weather_systems |= WS
//Mark all affected z-levels
var/list/affected = SSmapping.get_connected_levels(WS.z)
for(var/Z in affected)
if(weather_by_z[Z])
CRASH("Trying to register another weather system on the same z-level([Z]) as an existing one!")
weather_by_z[Z] = WS
///Remove a weather systeam from the processing lists.
/datum/controller/subsystem/weather/proc/unregister_weather_system(var/obj/abstract/weather_system/WS)
//Clear any and all references to our weather object
for(var/Z = 1 to length(weather_by_z))
if(weather_by_z[Z] == WS)
weather_by_z[Z] = null
weather_systems -= WS