diff --git a/code/__HELPERS/logging.dm b/code/__HELPERS/logging.dm
index fd07b20e641..1635e94094a 100644
--- a/code/__HELPERS/logging.dm
+++ b/code/__HELPERS/logging.dm
@@ -84,4 +84,11 @@
/proc/log_to_dd(text)
world.log << text //this comes before the config check because it can't possibly runtime
if(config.log_world_output)
- diary << "\[[time_stamp()]]DD_OUTPUT: [text][log_end]"
\ No newline at end of file
+ diary << "\[[time_stamp()]]DD_OUTPUT: [text][log_end]"
+
+/**
+ * Standardized method for tracking startup times.
+ */
+/proc/log_startup_progress(var/message)
+ world << "[message]"
+ world.log << message
\ No newline at end of file
diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm
index af4de68fd7a..dc23a2d2782 100644
--- a/code/__HELPERS/time.dm
+++ b/code/__HELPERS/time.dm
@@ -28,4 +28,17 @@ proc/isDay(var/month, var/day)
//returns timestamp in a sql and ISO 8601 friendly format
/proc/SQLtime()
return time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
+
+/**
+ * Returns "watch handle" (really just a timestamp :V)
+ */
+/proc/start_watch()
+ return world.timeofday
+
+/**
+ * Returns number of seconds elapsed.
+ * @param wh number The "Watch Handle" from start_watch(). (timestamp)
+ */
+/proc/stop_watch(wh)
+ return round(0.1*(world.timeofday-wh),0.1)
\ No newline at end of file
diff --git a/code/controllers/Processes/air.dm b/code/controllers/Processes/air.dm
index 2ae00b8a456..84b2075a151 100644
--- a/code/controllers/Processes/air.dm
+++ b/code/controllers/Processes/air.dm
@@ -27,12 +27,12 @@ var/global/datum/controller/process/air_system/air_master
schedule_interval = 20 // every 2 seconds
start_delay = 4
air_master = src
-
- world << "Processing Geometry..."
- var/start_time = world.timeofday
+
+ var/watch = start_watch()
+ log_startup_progress("Processing geometry...")
setup_allturfs() // Get all currently active tiles that need processing each atmos tick.
setup_overlays() // Assign icons and such for gas-turf-overlays
- world << "Geometry processed in [(world.timeofday-start_time)/10] seconds!"
+ log_startup_progress(" Geometry processed in [stop_watch(watch)]s.")
/datum/controller/process/air_system/doWork()
if(kill_air)
diff --git a/code/controllers/Processes/mob.dm b/code/controllers/Processes/mob.dm
index be630a68fd8..c1dd47236f1 100644
--- a/code/controllers/Processes/mob.dm
+++ b/code/controllers/Processes/mob.dm
@@ -38,7 +38,7 @@ var/global/datum/controller/mob_system/mob_master
var/starttime
/datum/controller/mob_system/proc/Setup()
- world << "\red \b Mob ticker starting up."
+ log_startup_progress("Mob ticker starting up.")
starttime = world.timeofday
/datum/controller/mob_system/proc/process()
diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm
index 8ef9985f998..9b15b0fad42 100644
--- a/code/controllers/master_controller.dm
+++ b/code/controllers/master_controller.dm
@@ -27,11 +27,13 @@ datum/controller/game_controller/New()
del(master_controller)
master_controller = src
+ var/watch=0
if(!job_master)
+ watch = start_watch()
job_master = new /datum/controller/occupations()
job_master.SetupOccupations()
job_master.LoadJobs("config/jobs.txt")
- world << "\red \b Job setup complete"
+ log_startup_progress("Job setup complete in [stop_watch(watch)]s.")
if(!syndicate_code_phrase) syndicate_code_phrase = generate_code_phrase()
if(!syndicate_code_response) syndicate_code_response = generate_code_phrase()
@@ -48,7 +50,6 @@ datum/controller/game_controller/proc/setup()
setupgenetics()
setupfactions()
setup_economy()
- //SetupXenoarch()
for(var/i=0, iSearching for away missions..."
+ log_startup_progress("Searching for away missions...")
var/list/Lines = file2list("_maps/map_files/RandomZLevels/fileList.txt")
if(!Lines.len) return
@@ -34,7 +34,8 @@ proc/createRandomZlevel()
if(potentialRandomZlevels.len)
- world << "Loading away mission..."
+ var/watch = start_watch()
+ log_startup_progress(" Loading away mission...")
var/map = pick(potentialRandomZlevels)
var/file = file(map)
@@ -51,8 +52,8 @@ proc/createRandomZlevel()
continue
awaydestinations.Add(L)
- world << "Away mission loaded."
+ log_startup_progress(" Away mission loaded in [stop_watch(watch)]s.")
else
- world << "No away missions found."
+ log_startup_progress(" No away missions found.")
return
\ No newline at end of file