diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm
index ef2828f531b9..d5f620b25640 100644
--- a/code/controllers/subsystem/mapping.dm
+++ b/code/controllers/subsystem/mapping.dm
@@ -2,7 +2,7 @@ var/datum/subsystem/mapping/SSmapping
/datum/subsystem/mapping
name = "Mapping"
- init_order = 13
+ init_order = 12
flags = SS_NO_FIRE
display_order = 50
diff --git a/code/controllers/subsystem/processing/objects.dm b/code/controllers/subsystem/processing/objects.dm
index 6bbd0ffeb329..2332763b7add 100644
--- a/code/controllers/subsystem/processing/objects.dm
+++ b/code/controllers/subsystem/processing/objects.dm
@@ -6,7 +6,7 @@ var/datum/subsystem/objects/SSobj
/datum/subsystem/objects
name = "Objects"
- init_order = 12
+ init_order = 11
priority = 40
var/initialized = INITIALIZATION_INSSOBJ
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 97d84323b721..12f6349f0540 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -4,7 +4,7 @@ var/datum/subsystem/ticker/ticker
/datum/subsystem/ticker
name = "Ticker"
- init_order = 0
+ init_order = 13
priority = 200
flags = SS_FIRE_IN_LOBBY|SS_KEEP_TIMING
@@ -39,7 +39,8 @@ var/datum/subsystem/ticker/ticker
var/tipped = 0 //Did we broadcast the tip of the day yet?
var/selected_tip // What will be the tip of the day?
- var/timeLeft = 1200 //pregame timer
+ var/timeLeft //pregame timer
+ var/start_at
var/totalPlayers = 0 //used for pregame stats on statpanel
var/totalPlayersReady = 0 //used for pregame stats on statpanel
@@ -66,19 +67,19 @@ var/datum/subsystem/ticker/ticker
if(!syndicate_code_response)
syndicate_code_response = generate_code_phrase()
..()
+ start_at = world.time + (config.lobby_countdown * 10)
+ world << "Welcome to [station_name()]!"
+ world << "Please set up your character and select \"Ready\". The game will start in about [config.lobby_countdown] seconds."
+ current_state = GAME_STATE_PREGAME
+ for(var/client/C in clients)
+ window_flash(C, ignorepref = TRUE) //let them know lobby has opened up.
/datum/subsystem/ticker/fire()
switch(current_state)
- if(GAME_STATE_STARTUP)
- timeLeft = config.lobby_countdown * 10
- world << "Welcome to [station_name()]!"
- world << "Please set up your character and select \"Ready\". The game will start in [config.lobby_countdown] seconds."
- current_state = GAME_STATE_PREGAME
- for(var/client/C in clients)
- window_flash(C, ignorepref = TRUE) //let them know lobby has opened up.
-
if(GAME_STATE_PREGAME)
//lobby stats for statpanels
+ if(isnull(timeLeft))
+ timeLeft = max(0,start_at - world.time)
totalPlayers = 0
totalPlayersReady = 0
for(var/mob/new_player/player in player_list)
@@ -707,3 +708,15 @@ var/datum/subsystem/ticker/ticker
if(news_message)
send2otherserver(news_source, news_message,"News_Report")
+
+/datum/subsystem/ticker/proc/GetTimeLeft()
+ if(isnull(ticker.timeLeft))
+ return max(0, start_at - world.time)
+ return timeLeft
+
+/datum/subsystem/ticker/proc/SetTimeLeft(newtime)
+ if(newtime >= 0 && isnull(timeLeft)) //remember, negative means delayed
+ start_at = world.time + newtime
+ else
+ timeLeft = newtime
+
\ No newline at end of file
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 4b6400189d64..24ee7c1ae331 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -569,11 +569,11 @@ var/global/BSACooldown = 0
set desc="Delay the game start"
set name="Delay pre-game"
- var/newtime = input("Set a new time in seconds. Set -1 for indefinite delay.","Set Delay",round(ticker.timeLeft/10)) as num|null
+ var/newtime = input("Set a new time in seconds. Set -1 for indefinite delay.","Set Delay",round(ticker.GetTimeLeft()/10)) as num|null
if(ticker.current_state > GAME_STATE_PREGAME)
return alert("Too late... The game has already started!")
if(newtime)
- ticker.timeLeft = newtime * 10
+ ticker.SetTimeLeft(newtime * 10)
if(newtime < 0)
world << "The game start has been delayed."
log_admin("[key_name(usr)] delayed the round start.")
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 09758d874235..35c7030adedf 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -75,7 +75,10 @@
stat("Map:", MAP_NAME)
if(ticker.current_state == GAME_STATE_PREGAME)
- stat("Time To Start:", (ticker.timeLeft >= 0) ? "[round(ticker.timeLeft / 10)]s" : "DELAYED")
+ var/time_remaining = ticker.GetTimeLeft()
+ if(time_remaining >= 0)
+ time_remaining /= 10
+ stat("Time To Start:", (time_remaining >= 0) ? "[round(time_remaining)]s" : "DELAYED")
stat("Players:", "[ticker.totalPlayers]")
if(client.holder)