From a5776822eacd2ab821cc8c5e4827d88e25dd7adf Mon Sep 17 00:00:00 2001 From: Major Cooke Date: Mon, 13 Apr 2020 10:51:44 -0500 Subject: [PATCH] Merged https://github.com/coelckers/gzdoom/pull/980 --- src/gamedata/a_weapons.cpp | 10 +++++++++- src/gamedata/keysections.cpp | 38 ++++++++++++++++++++++++++++++++++-- wadsrc/static/menudef.txt | 1 + 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/gamedata/a_weapons.cpp b/src/gamedata/a_weapons.cpp index 735334275..c8918a95c 100644 --- a/src/gamedata/a_weapons.cpp +++ b/src/gamedata/a_weapons.cpp @@ -544,6 +544,9 @@ int FWeaponSlots::RestoreSlots(FConfigFile *config, const char *section) // //=========================================================================== +// Strict handling of SetSlot and ClearPlayerClasses in KEYCONF +CVAR(Bool,setslotstrict,true,CVAR_ARCHIVE); + void FWeaponSlots::PrintSettings() { for (int i = 1; i <= NUM_WEAPON_SLOTS; ++i) @@ -589,7 +592,12 @@ CCMD (setslot) } else if (PlayingKeyConf != nullptr) { - PlayingKeyConf->ClearSlot(slot); + // Only clear the slot first if setslotstrict is true + // If not, we'll just add to the slot without clearing it + if(setslotstrict) + { + PlayingKeyConf->ClearSlot(slot); + } for (int i = 2; i < argv.argc(); ++i) { PlayingKeyConf->AddWeapon(slot, argv[i]); diff --git a/src/gamedata/keysections.cpp b/src/gamedata/keysections.cpp index 464941d2e..1767724b4 100644 --- a/src/gamedata/keysections.cpp +++ b/src/gamedata/keysections.cpp @@ -223,11 +223,45 @@ void D_LoadWadSettings () ParsingKeyConf = false; } +// Strict handling of SetSlot and ClearPlayerClasses in KEYCONF (see a_weapons.cpp) +EXTERN_CVAR (Bool, setslotstrict) + +// Specifically hunt for and remove IWAD playerclasses +void ClearIWADPlayerClasses (PClassActor *ti) +{ + for(unsigned i=0; i < PlayerClasses.Size(); i++) + { + if(PlayerClasses[i].Type==ti) + { + for(unsigned j = i; j < PlayerClasses.Size()-1; j++) + { + PlayerClasses[j] = PlayerClasses[j+1]; + } + PlayerClasses.Pop(); + } + } +} + CCMD(clearplayerclasses) { if (ParsingKeyConf) - { - PlayerClasses.Clear(); + { + // Only clear the playerclasses first if setslotstrict is true + // If not, we'll only remove the IWAD playerclasses + if(setslotstrict) + PlayerClasses.Clear(); + else + { + // I wish I had a better way to pick out IWAD playerclasses + // without having to explicitly name them here... + ClearIWADPlayerClasses(PClass::FindActor("DoomPlayer")); + ClearIWADPlayerClasses(PClass::FindActor("HereticPlayer")); + ClearIWADPlayerClasses(PClass::FindActor("StrifePlayer")); + ClearIWADPlayerClasses(PClass::FindActor("FighterPlayer")); + ClearIWADPlayerClasses(PClass::FindActor("ClericPlayer")); + ClearIWADPlayerClasses(PClass::FindActor("MagePlayer")); + ClearIWADPlayerClasses(PClass::FindActor("ChexPlayer")); + } } } diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index b59af595f..102d9ca11 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -1204,6 +1204,7 @@ OptionMenu "MiscOptions" protected Option "$MISCMNU_QUICKSAVEROTATION", "quicksaverotation", "OnOff" Slider "$MISCMNU_QUICKSAVECOUNT", "quicksaverotationcount", 1, 20, 1, 0 Option "$MISCMNU_DEHLOAD", "dehload", "dehopt" + Option "$MISCMNU_SETSLOTSTRICT", "setslotstrict", "YesNo" Option "$MISCMNU_ENABLESCRIPTSCREENSHOTS", "enablescriptscreenshot", "OnOff" Option "$MISCMNU_INTERSCROLL", "nointerscrollabort", "OffOn" StaticText " "