diff --git a/doomsday/apps/plugins/common/include/config.h b/doomsday/apps/plugins/common/include/config.h index 1174a9746d..58b73355c9 100644 --- a/doomsday/apps/plugins/common/include/config.h +++ b/doomsday/apps/plugins/common/include/config.h @@ -53,6 +53,7 @@ typedef struct libcommon_config_s { // Gameplay: byte switchSoundOrigin; + byte defaultRuleFastMonsters; // Weapons: byte weaponCycleSequential; // if true multiple next/prev weapon impulses can be chained to allow the user to "count-click-switch". diff --git a/doomsday/apps/plugins/common/include/g_common.h b/doomsday/apps/plugins/common/include/g_common.h index ee3f094863..466f01e83f 100644 --- a/doomsday/apps/plugins/common/include/g_common.h +++ b/doomsday/apps/plugins/common/include/g_common.h @@ -221,6 +221,7 @@ byte G_Ruleset_RandomClasses(); #else byte G_Ruleset_RespawnMonsters(); #endif +void G_Ruleset_UpdateDefaults(); /// @todo remove me void G_SetGameActionMapCompletedAndSetNextMap(void); diff --git a/doomsday/apps/plugins/common/src/common.c b/doomsday/apps/plugins/common/src/common.c index 8b0ad925af..f07d6fe372 100644 --- a/doomsday/apps/plugins/common/src/common.c +++ b/doomsday/apps/plugins/common/src/common.c @@ -36,6 +36,13 @@ int Common_GetInteger(int id) return 0; } +#ifdef __JDOOM__ +void fastMonstersChanged() +{ + G_Ruleset_UpdateDefaults(); +} +#endif + void Common_Register() { // Movement @@ -46,4 +53,7 @@ void Common_Register() // Gameplay C_VAR_BYTE ("sound-switch-origin", &cfg.common.switchSoundOrigin, 0, 0, 1); +#ifdef __JDOOM__ + C_VAR_BYTE2("game-monsters-fast", &cfg.common.defaultRuleFastMonsters, 0, 0, 1, fastMonstersChanged); +#endif } diff --git a/doomsday/apps/plugins/common/src/game/g_game.cpp b/doomsday/apps/plugins/common/src/game/g_game.cpp index a0fd283745..eef5444aaa 100644 --- a/doomsday/apps/plugins/common/src/game/g_game.cpp +++ b/doomsday/apps/plugins/common/src/game/g_game.cpp @@ -1929,6 +1929,13 @@ byte G_Ruleset_RespawnMonsters() } #endif +void G_Ruleset_UpdateDefaults() +{ +#if !__JHEXEN__ + defaultGameRules.fast = cfg.common.defaultRuleFastMonsters; +#endif +} + /** * Lookup the debriefing Finale for the current episode and map (if any). */ diff --git a/doomsday/apps/plugins/common/src/hu_menu.cpp b/doomsday/apps/plugins/common/src/hu_menu.cpp index a2edb0e34c..48ed29122f 100644 --- a/doomsday/apps/plugins/common/src/hu_menu.cpp +++ b/doomsday/apps/plugins/common/src/hu_menu.cpp @@ -1008,6 +1008,12 @@ void Hu_MenuInitGameplayOptionsPage() .setShortcut('j'); #endif +#if __JDOOM__ + page->addWidget(new LabelWidget("Fast Monsters")); + page->addWidget(new CVarToggleWidget("game-monsters-fast")) + .setShortcut('f'); +#endif + #if __JDOOM64__ page->addWidget(new LabelWidget("Weapon Recoil")); page->addWidget(new CVarToggleWidget("player-weapon-recoil")); diff --git a/doomsday/apps/plugins/doom/src/d_main.cpp b/doomsday/apps/plugins/doom/src/d_main.cpp index 8d3f275eee..bd39e15ce4 100644 --- a/doomsday/apps/plugins/doom/src/d_main.cpp +++ b/doomsday/apps/plugins/doom/src/d_main.cpp @@ -421,6 +421,8 @@ void D_PostInit() ::cfg.common.netDeathmatch = 1; } + ::defaultGameRules.fast = cfg.common.defaultRuleFastMonsters; + // Apply these rules. ::defaultGameRules.noMonsters = cmdLine.check("-nomonsters")? true : false; ::defaultGameRules.respawnMonsters = cmdLine.check("-respawn") ? true : false;