Skip to content

Commit

Permalink
libcommon|Fixed: Initialization of global GameRules instances
Browse files Browse the repository at this point in the history
Moved GameRules instances from the global scope to getter functions,
to avoid initialization order problems where static Strings needed by
GameRules aren't available early enough.
  • Loading branch information
skyjake committed Jan 21, 2018
1 parent f952d0d commit 42daab7
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 35 deletions.
8 changes: 4 additions & 4 deletions doomsday/apps/plugins/common/include/g_common.h
Expand Up @@ -31,13 +31,13 @@
#if __cplusplus
class SaveSlots;

extern GameRules defaultGameRules;
GameRules &gfw_DefaultGameRules();

#define gfw_DefaultRule(name) (defaultGameRules.values.name)
#define gfw_SetDefaultRule(name, value) GameRules_Set(defaultGameRules, name, value)
#define gfw_DefaultRule(name) (gfw_DefaultGameRules().values.name)
#define gfw_SetDefaultRule(name, value) GameRules_Set(gfw_DefaultGameRules(), name, value)

extern de::Uri nextMapUri;
extern uint nextMapEntryPoint;
extern uint nextMapEntryPoint;

/**
* Schedule a new game session (deferred).
Expand Down
13 changes: 13 additions & 0 deletions doomsday/apps/plugins/common/src/common.cpp
Expand Up @@ -82,6 +82,19 @@ void *Common_GetGameAPI(char const *name)
return nullptr;
}

GameRules &gfw_DefaultGameRules()
{
static GameRules defaultGameRules;
return defaultGameRules;
}

void GameRules_UpdateDefaultsFromCVars()
{
#if !__JHEXEN__
gfw_SetDefaultRule(fast, cfg.common.defaultRuleFastMonsters);
#endif
}

#ifdef __JDOOM__
void fastMonstersChanged()
{
Expand Down
39 changes: 18 additions & 21 deletions doomsday/apps/plugins/common/src/game/g_game.cpp
Expand Up @@ -82,8 +82,6 @@ using namespace common;
void R_LoadVectorGraphics();
int Hook_DemoStop(int hookType, int val, void *parm);

GameRules defaultGameRules;

game_config_t cfg; // The global cfg.

#if __JDOOM__ || __JDOOM64__
Expand Down Expand Up @@ -122,13 +120,17 @@ static SaveSlots *sslots;
static gameaction_t gameAction;

// Game action parameters:
static GameRules gaNewSessionRules;
static String gaNewSessionEpisodeId;
static GameRules &G_NewSessionRules()
{
static GameRules gaNewSessionRules;
return gaNewSessionRules;
}
static String gaNewSessionEpisodeId;
static de::Uri gaNewSessionMapUri;
static uint gaNewSessionMapEntrance;
static uint gaNewSessionMapEntrance;

static String gaSaveSessionSlot;
static bool gaSaveSessionGenerateDescription = true;
static bool gaSaveSessionGenerateDescription = true;
static String gaSaveSessionUserDescription;
static String gaLoadSessionSlot;

Expand All @@ -147,10 +149,10 @@ void G_SetGameAction(gameaction_t newAction)
}
}

void G_SetGameActionNewSession(GameRules const &rules, String episodeId,
de::Uri const &mapUri, uint mapEntrance)
void G_SetGameActionNewSession(GameRules const &rules, String episodeId, de::Uri const &mapUri,
uint mapEntrance)
{
::gaNewSessionRules = rules; // make a copy.
G_NewSessionRules() = rules;
::gaNewSessionEpisodeId = episodeId;
::gaNewSessionMapUri = mapUri;
::gaNewSessionMapEntrance = mapEntrance;
Expand Down Expand Up @@ -311,7 +313,7 @@ void G_CommonPreInit()
::quitInProgress = false;

// Apply the default game rules.
gfw_Session()->applyNewRules(defaultGameRules = GameRules());
gfw_Session()->applyNewRules(gfw_DefaultGameRules() = GameRules());

// Register hooks.
Plug_AddHook(HOOK_DEMO_STOP, Hook_DemoStop);
Expand Down Expand Up @@ -905,7 +907,7 @@ void G_AutoStartOrBeginTitleLoop()
// Don't brief when autostarting.
::briefDisabled = true;

G_SetGameActionNewSession(defaultGameRules, startEpisodeId, startMapUri);
G_SetGameActionNewSession(gfw_DefaultGameRules(), startEpisodeId, startMapUri);
}
else
{
Expand Down Expand Up @@ -1355,8 +1357,10 @@ static void runGameAction()
{
case GA_NEWSESSION:
gfw_Session()->end();
gfw_Session()->begin(::gaNewSessionRules, ::gaNewSessionEpisodeId,
::gaNewSessionMapUri, ::gaNewSessionMapEntrance);
gfw_Session()->begin(G_NewSessionRules(),
::gaNewSessionEpisodeId,
::gaNewSessionMapUri,
::gaNewSessionMapEntrance);
break;

case GA_LOADSESSION:
Expand Down Expand Up @@ -1891,13 +1895,6 @@ void G_QueueBody(mobj_t *mo)
}
#endif

void GameRules_UpdateDefaultsFromCVars()
{
#if !__JHEXEN__
gfw_SetDefaultRule(fast, cfg.common.defaultRuleFastMonsters);
#endif
}

/**
* Lookup the debriefing Finale for the current episode and map (if any).
*/
Expand Down Expand Up @@ -2820,7 +2817,7 @@ D_CMD(WarpMap)
else
{
// If a session is already in progress then copy the rules from it.
GameRules rules = (gfw_Session()->hasBegun() ? gfw_Session()->rules() : defaultGameRules);
GameRules rules = (gfw_Session()->hasBegun() ? gfw_Session()->rules() : gfw_DefaultGameRules());
if (IS_DEDICATED)
{
// Why is this necessary to set here? Changing the rules in P_SetupMap()
Expand Down
16 changes: 7 additions & 9 deletions doomsday/apps/plugins/common/src/game/gamerules.cpp
Expand Up @@ -35,17 +35,15 @@ String const GameRules::KEY_noMonsters = "noMonsters";
String const GameRules::KEY_respawnMonsters = "respawnMonsters";
String const GameRules::KEY_randomClasses = "randomClasses";

static Record const builtInDefaults =
Record::withMembers(GameRules::KEY_skill, 2, // medium
GameRules::KEY_fast, false,
GameRules::KEY_deathmatch, 0,
GameRules::KEY_noMonsters, false,
GameRules::KEY_randomClasses, false,
GameRules::KEY_respawnMonsters, false);

DENG2_PIMPL_NOREF(GameRules)
{
Record rules { builtInDefaults };
Record rules {
Record::withMembers(GameRules::KEY_skill, 2, // medium
GameRules::KEY_fast, false,
GameRules::KEY_deathmatch, 0,
GameRules::KEY_noMonsters, false,
GameRules::KEY_randomClasses, false,
GameRules::KEY_respawnMonsters, false) };

Impl() {}

Expand Down
2 changes: 1 addition & 1 deletion doomsday/apps/plugins/common/src/hu_menu.cpp
Expand Up @@ -3384,7 +3384,7 @@ static void Hu_MenuInitNewGame(bool confirmed)
cfg.playerClass[CONSOLEPLAYER] = playerclass_t(mnPlrClass);
#endif

GameRules newRules(defaultGameRules);
GameRules newRules{gfw_DefaultGameRules()};
GameRules_Set(newRules, skill, mnSkillmode);

Record const &episodeDef = Defs().episodes.find("id", mnEpisode);
Expand Down

0 comments on commit 42daab7

Please sign in to comment.