diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 875a76e0e5..4ccd2b8f09 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -831,21 +831,15 @@ var/list/gamemode_cache = list()
for (var/game_mode in gamemode_cache)
var/datum/game_mode/M = gamemode_cache[game_mode]
if (M.config_tag && M.config_tag == mode_name)
- M.create_antagonists()
return M
return gamemode_cache["extended"]
/datum/configuration/proc/get_runnable_modes()
- var/list/datum/game_mode/runnable_modes = new
- for (var/game_mode in gamemode_cache)
+ var/list/runnable_modes = list()
+ for(var/game_mode in gamemode_cache)
var/datum/game_mode/M = gamemode_cache[game_mode]
- if (!(M.config_tag in modes))
- continue
- if (probabilities[M.config_tag]<=0)
- continue
- if (M.can_start())
- runnable_modes[M] = probabilities[M.config_tag]
- //world << "DEBUG: runnable_mode\[[runnable_modes.len]\] = [M.config_tag]"
+ if(M && M.can_start() && !isnull(config.probabilities[M.config_tag]) && config.probabilities[M.config_tag] > 0)
+ runnable_modes |= M
return runnable_modes
/datum/configuration/proc/post_load()
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index f587af7ded..9005650650 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -114,6 +114,13 @@ var/global/list/additional_antag_types = list()
)
)
+/datum/game_mode/New()
+ ..()
+ // Enforce some formatting.
+ // This will probably break something.
+ name = capitalize(lowertext(name))
+ config_tag = lowertext(config_tag)
+
/datum/game_mode/Topic(href, href_list[])
if(..())
return
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index bfffffc8ff..2b74ee9488 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -69,33 +69,34 @@ var/global/datum/controller/gameticker/ticker
//Create and announce mode
if(master_mode=="secret")
src.hide_mode = 1
- var/list/datum/game_mode/runnable_modes
- var/mode_started
+
+ var/list/runnable_modes = config.get_runnable_modes()
if((master_mode=="random") || (master_mode=="secret"))
- runnable_modes = config.get_runnable_modes()
- if (runnable_modes.len==0)
+ if(!runnable_modes.len)
current_state = GAME_STATE_PREGAME
world << "Unable to choose playable game mode. Reverting to pre-game lobby."
return 0
if(secret_force_mode != "secret")
- var/datum/game_mode/M = config.pick_mode(secret_force_mode)
- if(M.can_start())
- mode_started = 1
- src.mode = config.pick_mode(secret_force_mode)
- job_master.ResetOccupations()
+ src.mode = config.pick_mode(secret_force_mode)
if(!src.mode)
- src.mode = pickweight(runnable_modes)
- if(src.mode)
- var/mtype = src.mode.type
- src.mode = new mtype
+ var/list/weighted_modes = list()
+ for(var/datum/game_mode/GM in runnable_modes)
+ weighted_modes[GM.config_tag] = config.probabilities[GM.config_tag]
+ src.mode = gamemode_cache[pickweight(weighted_modes)]
else
src.mode = config.pick_mode(master_mode)
- src.mode.pre_setup()
+ if(!src.mode)
+ current_state = GAME_STATE_PREGAME
+ world << "Serious error in mode setup! Reverting to pre-game lobby."
+ return 0
+ job_master.ResetOccupations()
+ src.mode.create_antagonists()
+ src.mode.pre_setup()
job_master.DivideOccupations() // Apparently important for new antagonist system to register specific job antags properly.
- if(!mode_started && !src.mode.can_start())
+ if(!src.mode.can_start())
world << "Unable to start [mode.name]. Not enough players, [mode.required_players] players needed. Reverting to pre-game lobby."
current_state = GAME_STATE_PREGAME
mode.fail_setup()
@@ -104,12 +105,14 @@ var/global/datum/controller/gameticker/ticker
return 0
if(hide_mode)
- var/list/modes = new
- for (var/datum/game_mode/M in runnable_modes)
- modes+=M.name
- modes = sortList(modes)
world << "The current game mode is - Secret!"
- world << "Possibilities: [english_list(modes)]"
+ if(runnable_modes.len)
+ var/list/tmpmodes = new
+ for (var/datum/game_mode/M in runnable_modes)
+ tmpmodes+=M.name
+ tmpmodes = sortList(tmpmodes)
+ if(tmpmodes.len)
+ world << "Possibilities: [english_list(tmpmodes)]"
else
src.mode.announce()