var/datum/controller/failsafe/Failsafe /datum/controller/failsafe // This thing pretty much just keeps poking the master controller var/processing = 0 var/processing_interval = 100 //poke the MC every 10 seconds var/MC_iteration = 0 var/MC_defcon = 0 //alert level. For every poke that fails this is raised by 1. When it reaches 5 the MC is replaced with a new one. (effectively killing any master_controller.process() and starting a new one) var/lighting_iteration = 0 var/lighting_defcon = 0 //alert level for lighting controller. /datum/controller/failsafe/New() //There can be only one failsafe. Out with the old in with the new (that way we can restart the Failsafe by spawning a new one) if(Failsafe != src) if(istype(Failsafe)) del(Failsafe) Failsafe = src Failsafe.process() /datum/controller/failsafe/proc/process() processing = 1 spawn(0) set background = 1 while(1) //more efficient than recursivly calling ourself over and over. background = 1 ensures we do not trigger an infinite loop if(!master_controller) new /datum/controller/game_controller() //replace the missing master_controller! This should never happen. if(!lighting_controller) new /datum/controller/lighting() //replace the missing lighting_controller if(processing) if(lighting_controller.processing) if(lighting_iteration == lighting_controller.iteration) //master_controller hasn't finished processing in the defined interval switch(lighting_defcon) if(0 to 3) lighting_defcon++ if(4) admins << "Warning. The Lighting Controller has not fired in the last [lighting_defcon*processing_interval] ticks. Automatic restart in [processing_interval] ticks." lighting_defcon = 5 if(5) admins << "Warning. The Lighting Controller has still not fired within the last [lighting_defcon*processing_interval] ticks. Killing and restarting..." new /datum/controller/lighting() //replace the old lighting_controller (hence killing the old one's process) lighting_controller.process() //Start it rolling again lighting_defcon = 0 else lighting_defcon = 0 lighting_iteration = lighting_controller.iteration else MC_defcon = 0 lighting_defcon = 0 sleep(processing_interval)