diff --git a/baystation12.dme b/baystation12.dme index 58d1d35007..2bc75c251a 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -97,6 +97,7 @@ #include "code\controllers\verbs.dm" #include "code\controllers\voting.dm" #include "code\controllers\Processes\air.dm" +#include "code\controllers\Processes\alarm.dm" #include "code\controllers\Processes\disease.dm" #include "code\controllers\Processes\emergencyShuttle.dm" #include "code\controllers\Processes\event.dm" diff --git a/code/controllers/Processes/alarm.dm b/code/controllers/Processes/alarm.dm new file mode 100644 index 0000000000..d41aa6ffdf --- /dev/null +++ b/code/controllers/Processes/alarm.dm @@ -0,0 +1,6 @@ +/datum/controller/process/alarm/setup() + name = "alarm" + schedule_interval = 20 // every 2 seconds + +/datum/controller/process/alarm/doWork() + alarm_manager.fire() diff --git a/code/controllers/Processes/machinery.dm b/code/controllers/Processes/machinery.dm index 52274a519a..61f3c7f4de 100644 --- a/code/controllers/Processes/machinery.dm +++ b/code/controllers/Processes/machinery.dm @@ -1,9 +1,20 @@ +/var/global/machinery_sort_required = 0 + /datum/controller/process/machinery/setup() name = "machinery" schedule_interval = 20 // every 2 seconds /datum/controller/process/machinery/doWork() - //#ifdef PROFILE_MACHINES + internal_sort() + internal_process() + +/datum/controller/process/machinery/proc/internal_sort() + if(machinery_sort_required) + machinery_sort_required = 0 + machines = dd_sortedObjectList(machines) + +/datum/controller/process/machinery/proc/internal_process() +//#ifdef PROFILE_MACHINES //machine_profiling.len = 0 //#endif @@ -31,4 +42,3 @@ #endif scheck() - diff --git a/code/controllers/failsafe.dm b/code/controllers/failsafe.dm index 91449e10c8..65df6dc90d 100644 --- a/code/controllers/failsafe.dm +++ b/code/controllers/failsafe.dm @@ -28,23 +28,6 @@ var/datum/controller/failsafe/Failsafe if(!lighting_controller) new /datum/controller/lighting() //replace the missing lighting_controller if(processing) - if(master_controller.processing) //only poke if these overrides aren't in effect - if(MC_iteration == controller_iteration) //master_controller hasn't finished processing in the defined interval - switch(MC_defcon) - if(0 to 3) - MC_defcon++ - if(4) - admins << "Warning. The Master Controller has not fired in the last [MC_defcon*processing_interval] ticks. Automatic restart in [processing_interval] ticks." - MC_defcon = 5 - if(5) - admins << "Warning. The Master Controller has still not fired within the last [MC_defcon*processing_interval] ticks. Killing and restarting..." - new /datum/controller/game_controller() //replace the old master_controller (hence killing the old one's process) - master_controller.process() //Start it rolling again - MC_defcon = 0 - else - MC_defcon = 0 - MC_iteration = controller_iteration - if(lighting_controller.processing) if(lighting_iteration == lighting_controller.iteration) //master_controller hasn't finished processing in the defined interval switch(lighting_defcon) diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index 7e52419905..561d75469c 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -11,27 +11,6 @@ var/global/air_processing_killed = 0 var/global/pipe_processing_killed = 0 datum/controller/game_controller - var/processing = 0 - var/breather_ticks = 2 //a somewhat crude attempt to iron over the 'bumps' caused by high-cpu use by letting the MC have a breather for this many ticks after every loop - var/minimum_ticks = 20 //The minimum length of time between MC ticks - - var/air_cost = 0 - var/sun_cost = 0 - var/mobs_cost = 0 - var/diseases_cost = 0 - var/machines_cost = 0 - var/objects_cost = 0 - var/networks_cost = 0 - var/powernets_cost = 0 - var/nano_cost = 0 - var/events_cost = 0 - var/alarms_cost = 0 - var/ticker_cost = 0 - var/total_cost = 0 - - var/last_thing_processed - var/mob/list/expensive_mobs = list() - var/list/shuttle_list // For debugging and VV var/datum/random_map/ore/asteroid_ore_map // For debugging and VV. @@ -40,7 +19,6 @@ datum/controller/game_controller/New() if(master_controller != src) log_debug("Rebuilding Master Controller") if(istype(master_controller)) - Recover() del(master_controller) master_controller = src @@ -52,8 +30,6 @@ datum/controller/game_controller/New() if(!syndicate_code_phrase) syndicate_code_phrase = generate_code_phrase() if(!syndicate_code_response) syndicate_code_response = generate_code_phrase() -// if(!emergency_shuttle) emergency_shuttle = new /datum/emergency_shuttle_controller() // handled in scheduler -// if(!shuttle_controller) shuttle_controller = new /datum/shuttle_controller() datum/controller/game_controller/proc/setup() world.tick_lag = config.Ticklag @@ -64,13 +40,6 @@ datum/controller/game_controller/proc/setup() spawn(20) createRandomZlevel() -/* if(!air_master) // handled in scheduler - air_master = new /datum/controller/air_system() - air_master.Setup() - - if(!ticker) - ticker = new /datum/controller/gameticker()*/ - setup_objects() setupgenetics() setupfactions() @@ -79,12 +48,6 @@ datum/controller/game_controller/proc/setup() transfer_controller = new -/* spawn(0) // handled in scheduler - if(ticker) - ticker.pregame() - - lighting_controller.initializeLighting()*/ - datum/controller/game_controller/proc/setup_objects() world << "\red \b Initializing objects" @@ -120,239 +83,5 @@ datum/controller/game_controller/proc/setup_objects() //Set up spawn points. populate_spawn_points() - // Sort the machinery list so it doesn't cause a lagspike at roundstart - process_machines_sort() - world << "\red \b Initializations complete." sleep(-1) - - -datum/controller/game_controller/proc/process() - processing = 1 - spawn(0) - set background = 1 - while(1) //far more efficient than recursively calling ourself - if(!Failsafe) new /datum/controller/failsafe() - - if(processing) - var/timer - var/start_time = world.timeofday - controller_iteration++ - - vote.process() - transfer_controller.process() - shuttle_controller.process() - process_newscaster() - - //AIR - - if(!air_processing_killed) - timer = world.timeofday - last_thing_processed = air_master.type - - if(!air_master.Tick()) //Runtimed. - air_master.failed_ticks++ - if(air_master.failed_ticks > 5) - world << "RUNTIMES IN ATMOS TICKER. Killing air simulation!" - world.log << "### ZAS SHUTDOWN" - message_admins("ZASALERT: unable to run [air_master.tick_progress], shutting down!") - log_admin("ZASALERT: unable run zone/process() -- [air_master.tick_progress]") - air_processing_killed = 1 - air_master.failed_ticks = 0 - - air_cost = (world.timeofday - timer) / 10 - - sleep(breather_ticks) - - //SUN - timer = world.timeofday - last_thing_processed = sun.type - sun.calc_position() - sun_cost = (world.timeofday - timer) / 10 - - sleep(breather_ticks) - - //MOBS - timer = world.timeofday - process_mobs() - mobs_cost = (world.timeofday - timer) / 10 - - sleep(breather_ticks) - - //DISEASES - timer = world.timeofday - process_diseases() - diseases_cost = (world.timeofday - timer) / 10 - - sleep(breather_ticks) - - //MACHINES - timer = world.timeofday - process_machines() - machines_cost = (world.timeofday - timer) / 10 - - sleep(breather_ticks) - - //OBJECTS - timer = world.timeofday - process_objects() - objects_cost = (world.timeofday - timer) / 10 - - sleep(breather_ticks) - - //PIPENETS - if(!pipe_processing_killed) - timer = world.timeofday - process_pipenets() - networks_cost = (world.timeofday - timer) / 10 - - sleep(breather_ticks) - - //POWERNETS - timer = world.timeofday - process_powernets() - powernets_cost = (world.timeofday - timer) / 10 - - sleep(breather_ticks) - - //NANO UIS - timer = world.timeofday - process_nano() - nano_cost = (world.timeofday - timer) / 10 - - sleep(breather_ticks) - - //EVENTS - timer = world.timeofday - process_events() - events_cost = (world.timeofday - timer) / 10 - - //ALARMS - timer = world.timeofday - process_alarms() - alarms_cost = (world.timeofday - timer) / 10 - - //TICKER - timer = world.timeofday - last_thing_processed = ticker.type - ticker.process() - ticker_cost = (world.timeofday - timer) / 10 - - //TIMING - total_cost = air_cost + sun_cost + mobs_cost + diseases_cost + machines_cost + objects_cost + networks_cost + powernets_cost + nano_cost + events_cost + alarms_cost + ticker_cost - - var/end_time = world.timeofday - if(end_time < start_time) //why not just use world.time instead? - start_time -= 864000 //deciseconds in a day - sleep( round(minimum_ticks - (end_time - start_time),1) ) - else - sleep(10) - -datum/controller/game_controller/proc/process_mobs() - var/i = 1 - expensive_mobs.Cut() - while(i<=mob_list.len) - var/mob/M = mob_list[i] - if(M) - var/clock = world.timeofday - last_thing_processed = M.type - M.Life() - if((world.timeofday - clock) > 1) - expensive_mobs += M - i++ - continue - mob_list.Cut(i,i+1) - -datum/controller/game_controller/proc/process_diseases() - var/i = 1 - while(i<=active_diseases.len) - var/datum/disease/Disease = active_diseases[i] - if(Disease) - last_thing_processed = Disease.type - Disease.process() - i++ - continue - active_diseases.Cut(i,i+1) - -datum/controller/game_controller/proc/process_machines() - process_machines_sort() - process_machines_process() - -/var/global/machinery_sort_required = 0 -datum/controller/game_controller/proc/process_machines_sort() - if(machinery_sort_required) - machinery_sort_required = 0 - machines = dd_sortedObjectList(machines) - -datum/controller/game_controller/proc/process_machines_process() - for(var/obj/machinery/Machine in machines) - last_thing_processed = Machine.type - if(Machine.process() != PROCESS_KILL) - if(Machine) - Machine.power_change() - if(Machine.use_power) - Machine.auto_use_power() - continue - machines -= Machine - - -datum/controller/game_controller/proc/process_objects() - var/i = 1 - while(i<=processing_objects.len) - var/obj/Object = processing_objects[i] - if(Object) - last_thing_processed = Object.type - Object.process() - i++ - continue - processing_objects.Cut(i,i+1) - -datum/controller/game_controller/proc/process_pipenets() - last_thing_processed = /datum/pipe_network - var/i = 1 - while(i<=pipe_networks.len) - var/datum/pipe_network/Network = pipe_networks[i] - if(Network) - Network.process() - i++ - continue - pipe_networks.Cut(i,i+1) - -/datum/controller/game_controller/proc/process_powernets() - last_thing_processed = /datum/powernet - for(var/datum/powernet/Powernet in powernets) - Powernet.reset() - -datum/controller/game_controller/proc/process_nano() - last_thing_processed = /datum/nanoui - var/i = 1 - while(i<=nanomanager.processing_uis.len) - var/datum/nanoui/ui = nanomanager.processing_uis[i] - if(ui) - ui.process() - i++ - continue - nanomanager.processing_uis.Cut(i,i+1) - -datum/controller/game_controller/proc/process_events() - last_thing_processed = /datum/event_manager - event_manager.process() - -datum/controller/game_controller/proc/process_alarms() - last_thing_processed = /datum/subsystem/alarm - alarm_manager.fire() - -datum/controller/game_controller/proc/Recover() //Mostly a placeholder for now. - var/msg = "## DEBUG: [time2text(world.timeofday)] MC restarted. Reports:\n" - for(var/varname in master_controller.vars) - switch(varname) - if("tag","bestF","type","parent_type","vars") continue - else - var/varval = master_controller.vars[varname] - if(istype(varval,/datum)) - var/datum/D = varval - msg += "\t [varname] = [D.type]\n" - else - msg += "\t [varname] = [varval]\n" - world.log << msg - diff --git a/code/controllers/subsystem/alarms.dm b/code/controllers/subsystem/alarms.dm index a13e60782d..b05be7ccbf 100644 --- a/code/controllers/subsystem/alarms.dm +++ b/code/controllers/subsystem/alarms.dm @@ -13,9 +13,6 @@ /datum/subsystem/alarm/New() all_handlers = list(atmosphere_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm) -/datum/subsystem/alarm/stat_entry() - stat(null,"Alarm-[master_controller.alarms_cost]\t#[number_of_active_alarms()]") - /datum/subsystem/alarm/fire() for(var/datum/alarm_handler/AH in all_handlers) AH.process() diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index 4d12bf9639..4305257980 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -39,10 +39,6 @@ usr = null src = null switch(controller) - if("Master") - new /datum/controller/game_controller() - master_controller.process() - feedback_add_details("admin_verb","RMC") if("Failsafe") new /datum/controller/failsafe() feedback_add_details("admin_verb","RFailsafe") diff --git a/code/modules/events/event_manager.dm b/code/modules/events/event_manager.dm index 806e9a331e..a505cf6cf4 100644 --- a/code/modules/events/event_manager.dm +++ b/code/modules/events/event_manager.dm @@ -164,14 +164,14 @@ html += "
" html += "

Running Events

" - html += "Estimated times, affected by master controller delays." + html += "Estimated times, affected by process scheduler delays." html += "" html += "SeverityNameEnds AtEnds InStop" for(var/datum/event/E in active_events) if(!E.event_meta) continue var/datum/event_meta/EM = E.event_meta - var/ends_at = E.startedAt + (E.lastProcessAt() * master_controller.minimum_ticks) // A best estimate + var/ends_at = E.startedAt + (E.lastProcessAt() * 20) // A best estimate, based on how often the alarm manager processes var/ends_in = max(0, round((ends_at - world.time) / 600, 0.1)) html += "" html += "[severity_to_string[EM.severity]]" diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 1d8c10e43c..8921564d6c 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -787,7 +787,8 @@ note dizziness decrements automatically in the mob's Life() proc. //reset the pixel offsets to zero is_floating = 0 - +/proc/getStatName(var/datum/controller/process/process) + return uppertext(copytext(process.name, 1, 4)) /mob/Stat() ..() @@ -797,57 +798,45 @@ note dizziness decrements automatically in the mob's Life() proc. stat(null,"Location:\t([x], [y], [z])") stat(null,"CPU:\t[world.cpu]") stat(null,"Instances:\t[world.contents.len]") - if(statpanel("Status") && master_controller) -/* stat(null,"MasterController-[last_tick_duration] ([master_controller.processing?"On":"Off"]-[controller_iteration])") // all this is now under the scheduler - stat(null,"Air-[master_controller.air_cost]\tSun-[master_controller.sun_cost]") - stat(null,"Mob-[master_controller.mobs_cost]\t#[mob_list.len]") - stat(null,"Dis-[master_controller.diseases_cost]\t#[active_diseases.len]") - stat(null,"Mch-[master_controller.machines_cost]\t#[machines.len]") - stat(null,"Obj-[master_controller.objects_cost]\t#[processing_objects.len]") - stat(null,"Net-[master_controller.networks_cost]\tPnet-[master_controller.powernets_cost]") - stat(null,"NanoUI-[master_controller.nano_cost]\t#[nanomanager.processing_uis.len]")*/ - stat(null,"Event-[master_controller.events_cost]\t#[event_manager.active_events.len]") - alarm_manager.stat_entry() - stat(null,"Tick-[master_controller.ticker_cost]\tALL-[master_controller.total_cost]") - else - stat(null,"MasterController-ERROR") - - - if(processScheduler.getIsRunning()) + if(statpanel("Status") && processScheduler.getIsRunning()) var/datum/controller/process/process process = processScheduler.getProcess("ticker") - stat(null, "TIC\t - #[process.getTicks()]\t - [process.getLastRunTime()]") + stat(null, "[getStatName(process)]\t - #[process.getTicks()]\t - [process.getLastRunTime()]") process = processScheduler.getProcess("air") - stat(null, "AIR\t - #[process.getTicks()]\t - [process.getLastRunTime()]") + stat(null, "[getStatName(process)]\t - #[process.getTicks()]\t - [process.getLastRunTime()]") process = processScheduler.getProcess("lighting") - stat(null, "LIG\t - #[process.getTicks()]\t - [process.getLastRunTime()]") + stat(null, "[getStatName(process)]\t - #[process.getTicks()]\t - [process.getLastRunTime()]") + + process = processScheduler.getProcess("alarm") + var/list/alarms = alarm_manager.active_alarms() + stat(null, "[getStatName(process)]([alarms.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") process = processScheduler.getProcess("mob") - stat(null, "MOB([mob_list.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") + stat(null, "[getStatName(process)]([mob_list.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") process = processScheduler.getProcess("machinery") - stat(null, "MAC([machines.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") + stat(null, "[getStatName(process)]([machines.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") process = processScheduler.getProcess("obj") - stat(null, "OBJ([processing_objects.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") + stat(null, "[getStatName(process)]([processing_objects.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") process = processScheduler.getProcess("pipenet") - stat(null, "PIP([pipe_networks.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") + stat(null, "[getStatName(process)]([pipe_networks.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") process = processScheduler.getProcess("powernet") - stat(null, "POW([powernets.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") + stat(null, "[getStatName(process)]([powernets.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") process = processScheduler.getProcess("nanoui") - stat(null, "NAN([nanomanager.processing_uis.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") + stat(null, "[getStatName(process)]([nanomanager.processing_uis.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") process = processScheduler.getProcess("disease") - stat(null, "DIS([active_diseases.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") + stat(null, "[getStatName(process)]([active_diseases.len])\t - #[process.getTicks()]\t - [process.getLastRunTime()]") process = processScheduler.getProcess("sun") - stat(null, "SUN\t - #[process.getTicks()]\t - [process.getLastRunTime()]") + stat(null, "[getStatName(process)]\t - #[process.getTicks()]\t - [process.getLastRunTime()]") else stat(null, "processScheduler is not running.")