diff --git a/code/game/cellautomata.dm b/code/game/cellautomata.dm
index 3f878ecdfae..5bf3b888a55 100644
--- a/code/game/cellautomata.dm
+++ b/code/game/cellautomata.dm
@@ -125,7 +125,8 @@
src.update_status()
master_controller = new /datum/controller/game_controller()
- spawn(-1) master_controller.setup()
+ spawn(-1)
+ master_controller.setup()
return
//Crispy fullban
diff --git a/code/game/master_controller.dm b/code/game/master_controller.dm
index 8128b4c7a98..175bbc62aa0 100644
--- a/code/game/master_controller.dm
+++ b/code/game/master_controller.dm
@@ -1,9 +1,26 @@
var/global/datum/controller/game_controller/master_controller //Set in world.New()
+var/global/datum/failsafe/Failsafe
var/global/controllernum = "no"
+var/global/controller_iteration = 0
+
+
+
+
datum/controller/game_controller
var/processing = 1
+ var/global/air_master_ready = 0
+ var/global/tension_master_ready = 0
+ var/global/sun_ready = 0
+ var/global/mobs_ready = 0
+ var/global/diseases_ready = 0
+ var/global/machines_ready = 0
+ var/global/objects_ready = 0
+ var/global/networks_ready = 0
+ var/global/powernets_ready = 0
+ var/global/ticker_ready = 0
+
proc
setup()
setup_objects()
@@ -80,57 +97,142 @@ datum/controller/game_controller
process()
+ if(!Failsafe)
+ Failsafe = new /datum/failsafe
+ spawn(0)
+ Failsafe.spin()
+
+
if(!processing)
return 0
controllernum = "yes"
- spawn (100) controllernum = "no"
+ spawn (100)
+ controllernum = "no"
+
+ controller_iteration++
var/start_time = world.timeofday
- air_master.process()
+ air_master_ready = 0
+ tension_master_ready = 0
+ sun_ready = 0
+ mobs_ready = 0
+ diseases_ready = 0
+ machines_ready = 0
+ objects_ready = 0
+ networks_ready = 0
+ powernets_ready = 0
+ ticker_ready = 0
- tension_master.process()
+
+
+
+
+ spawn(0)
+ air_master.process()
+ air_master_ready = 1
+ spawn(0)
+ tension_master.process()
+ tension_master_ready = 1
sleep(1)
- sun.calc_position()
+ spawn(0)
+ sun.calc_position()
+ sun_ready = 1
sleep(-1)
- for(var/mob/M in world)
- M.Life()
+ spawn(0)
+ for(var/mob/M in world)
+ M.Life()
+ mobs_ready = 1
+
+
sleep(-1)
- for(var/datum/disease/D in active_diseases)
- D.process()
+ spawn(0)
+ for(var/datum/disease/D in active_diseases)
+ D.process()
+ diseases_ready = 1
- for(var/obj/machinery/machine in machines)
- if(machine)
- machine.process()
- if(machine && machine.use_power)
- machine.auto_use_power()
+ spawn(0)
+ for(var/obj/machinery/machine in machines)
+ if(machine)
+ machine.process()
+ if(machine && machine.use_power)
+ machine.auto_use_power()
+ machines_ready = 1
sleep(-1)
sleep(1)
- for(var/obj/object in processing_objects)
- object.process()
+ spawn(0)
+ for(var/obj/object in processing_objects)
+ object.process()
+ objects_ready = 1
- for(var/datum/pipe_network/network in pipe_networks)
- network.process()
+ spawn(0)
+ for(var/datum/pipe_network/network in pipe_networks)
+ network.process()
+ networks_ready = 1
- for(var/datum/powernet/P in powernets)
- P.reset()
+ spawn(0)
+ for(var/datum/powernet/P in powernets)
+ P.reset()
+ powernets_ready = 1
sleep(-1)
- ticker.process()
+ spawn(0)
+ ticker.process()
+ ticker_ready = 1
- sleep(world.timeofday+10-start_time) // This is fine for our tick lag. DMTG
+ sleep(world.timeofday+10-start_time)// Don't touch this. DMTG
- spawn process()
+ while(!air_master_ready || !tension_master_ready || !sun_ready || !mobs_ready || !diseases_ready || !machines_ready || !objects_ready || !networks_ready || !powernets_ready || !ticker_ready)
+ sleep(1)
+
+ spawn
+ process()
- return 1
\ No newline at end of file
+ return 1
+
+
+
+/datum/failsafe // This thing pretty much just keeps poking the master controller
+ var/spinning = 1
+ var/current_iteration = 0
+
+/datum/failsafe/proc/spin()
+ if(!master_controller) // Well fuck. How did this happen?
+ sleep(50)
+ if(!master_controller)
+ master_controller = new /datum/controller/game_controller()
+ spawn(-1)
+ master_controller.setup()
+
+ else
+ while(spinning)
+ current_iteration = controller_iteration
+ sleep(600) // Wait 15 seconds
+ if(current_iteration == controller_iteration) // Mm. The master controller hasn't ticked yet.
+
+ for (var/mob/M in world)
+ if (M.client && M.client.holder)
+ M << " Warning. The Master Controller has not fired in the last 60 seconds. Restart recommended. Automatic restart in 60 seconds."
+
+ sleep(600)
+ if(current_iteration == controller_iteration)
+ for (var/mob/M in world)
+ if (M.client && M.client.holder)
+ M << " Warning. The Master Controller has not fired in the last 2 minutes. Automatic restart beginning."
+ master_controller.process()
+ sleep(150)
+ else
+ for (var/mob/M in world)
+ if (M.client && M.client.holder)
+ M << " The Master Controller has fired. Automatic restart aborted."
\ No newline at end of file
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index ae551810a05..38e63dea1b0 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -227,7 +227,7 @@
//verbs += /proc/togglebuildmode --Merged with view variables
//verbs += /client/proc/cmd_modify_object_variables --Merged with view variables
verbs += /client/proc/togglebuildmodeself
-
+ verbs += /client/proc/debug_master_controller
else return
//Game Admin
@@ -445,6 +445,7 @@
//verbs -= /client/proc/cmd_switch_radio --removed because tcommsat is staying
verbs -= /client/proc/togglebuildmodeself
verbs -= /client/proc/kill_airgroup
+ verbs -= /client/proc/debug_master_controller
verbs -= /client/proc/admin_deny_shuttle
verbs -= /client/proc/cmd_admin_christmas
verbs -= /client/proc/editappear
diff --git a/code/modules/admin/verbs/MC.dm b/code/modules/admin/verbs/MC.dm
index ded7740c2c1..a9481f7f348 100644
--- a/code/modules/admin/verbs/MC.dm
+++ b/code/modules/admin/verbs/MC.dm
@@ -7,4 +7,16 @@
master_controller.process()
if("No")
return 0
+ //feedback_add_details("admin_verb","RMC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ return
+
+/client/proc/debug_master_controller()
+ set category = "Debug"
+ set name = "Debug Master Controller"
+ switch(alert("Debug Master Controller or Failsafe?" ,, "Master Controller" , "Failsafe"))
+ if("Master Controller")
+ debug_variables(master_controller)
+ if("Failsafe")
+ debug_variables(Failsafe)
+ //feedback_add_details("admin_verb","DMC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
\ No newline at end of file
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index f3355dba7f7..ca7176b713d 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -1038,8 +1038,8 @@ note dizziness decrements automatically in the mob's Life() proc.
stat(null, "([x], [y], [z])")
stat(null, "CPU: [world.cpu]")
stat(null, "Controller: [controllernum]")
- //if (master_controller)
- // stat(null, "Loop: [master_controller.loop_freq]")
+ if (master_controller)
+ stat(null, "Current Iteration: [controller_iteration]")
if (spell_list.len)