# HG changeset patch # User Adam Kaminski # Date 1625521429 14400 # Mon Jul 05 17:43:49 2021 -0400 # Node ID 153023bbd56d8e88468f21585fac4f3544b0868f # Parent d6e67b99ef4b4caa3b42203e15f3e771c0e4df59 Externalized all default game mode properties to the GAMEMODE lump, also adding new supported keywords like "name", "shortname", and "f1texture" for more customization. diff -r d6e67b99ef4b -r 153023bbd56d src/d_main.cpp --- a/src/d_main.cpp Sat May 08 20:32:09 2021 -0700 +++ b/src/d_main.cpp Mon Jul 05 17:43:49 2021 -0400 @@ -2434,9 +2434,6 @@ gamestate = GS_STARTUP; - // Initialize the game mode module. - GAMEMODE_Construct( ); - // Determine if we're going to be a server, client, or local player. if ( Args->CheckParm( "-host" )) NETWORK_SetState( NETSTATE_SERVER ); diff -r d6e67b99ef4b -r 153023bbd56d src/gamemode.cpp --- a/src/gamemode.cpp Sat May 08 20:32:09 2021 -0700 +++ b/src/gamemode.cpp Mon Jul 05 17:43:49 2021 -0400 @@ -96,126 +96,6 @@ //***************************************************************************** // FUNCTIONS -void GAMEMODE_Construct( void ) -{ - // Regular co-op. - g_GameModes[GAMEMODE_COOPERATIVE].ulFlags = GMF_COOPERATIVE|GMF_PLAYERSEARNKILLS; - strcpy( g_GameModes[GAMEMODE_COOPERATIVE].szName, "Cooperative" ); - strncpy( g_GameModes[GAMEMODE_COOPERATIVE].szShortName, "COOP", 8 ); - strncpy( g_GameModes[GAMEMODE_COOPERATIVE].szF1Texture, "F1_COOP", 8 ); - - // Survival co-op. - g_GameModes[GAMEMODE_SURVIVAL].ulFlags = GMF_COOPERATIVE|GMF_PLAYERSEARNKILLS|GMF_MAPRESETS|GMF_DEADSPECTATORS|GMF_USEMAXLIVES|GMF_MAPRESET_RESETS_MAPTIME; - strcpy( g_GameModes[GAMEMODE_SURVIVAL].szName, "Survival" ); - strncpy( g_GameModes[GAMEMODE_SURVIVAL].szShortName, "SURV", 8 ); - strncpy( g_GameModes[GAMEMODE_SURVIVAL].szF1Texture, "F1_SCP", 8 ); - - // Invasion. - g_GameModes[GAMEMODE_INVASION].ulFlags = GMF_COOPERATIVE|GMF_PLAYERSEARNKILLS|GMF_MAPRESETS|GMF_DEADSPECTATORS|GMF_USEMAXLIVES; - strcpy( g_GameModes[GAMEMODE_INVASION].szName, "Invasion" ); - strncpy( g_GameModes[GAMEMODE_INVASION].szShortName, "INVAS", 8 ); - strncpy( g_GameModes[GAMEMODE_INVASION].szF1Texture, "F1_INV", 8 ); - - // Regular deathmatch. - g_GameModes[GAMEMODE_DEATHMATCH].ulFlags = GMF_DEATHMATCH|GMF_PLAYERSEARNFRAGS; - strcpy( g_GameModes[GAMEMODE_DEATHMATCH].szName, "Deathmatch" ); - strncpy( g_GameModes[GAMEMODE_DEATHMATCH].szShortName, "DM", 8 ); - strncpy( g_GameModes[GAMEMODE_DEATHMATCH].szF1Texture, "F1_DM", 8 ); - - // Teamplay DM. - g_GameModes[GAMEMODE_TEAMPLAY].ulFlags = GMF_DEATHMATCH|GMF_PLAYERSEARNFRAGS|GMF_PLAYERSONTEAMS; - strcpy( g_GameModes[GAMEMODE_TEAMPLAY].szName, "Team Deathmatch" ); - strncpy( g_GameModes[GAMEMODE_TEAMPLAY].szShortName, "TDM", 8 ); - strncpy( g_GameModes[GAMEMODE_TEAMPLAY].szF1Texture, "F1_TDM", 8 ); - - // Duel. - g_GameModes[GAMEMODE_DUEL].ulFlags = GMF_DEATHMATCH|GMF_PLAYERSEARNFRAGS|GMF_MAPRESETS|GMF_MAPRESET_RESETS_MAPTIME; - strcpy( g_GameModes[GAMEMODE_DUEL].szName, "Duel" ); - strncpy( g_GameModes[GAMEMODE_DUEL].szShortName, "DUEL", 8 ); - strncpy( g_GameModes[GAMEMODE_DUEL].szF1Texture, "F1_DUEL", 8 ); - - // Terminator DM. - g_GameModes[GAMEMODE_TERMINATOR].ulFlags = GMF_DEATHMATCH|GMF_PLAYERSEARNFRAGS; - strcpy( g_GameModes[GAMEMODE_TERMINATOR].szName, "Terminator" ); - strncpy( g_GameModes[GAMEMODE_TERMINATOR].szShortName, "TERM", 8 ); - strncpy( g_GameModes[GAMEMODE_TERMINATOR].szF1Texture, "F1_TERM", 8 ); - - // Last man standing. - g_GameModes[GAMEMODE_LASTMANSTANDING].ulFlags = GMF_DEATHMATCH|GMF_PLAYERSEARNWINS|GMF_DONTSPAWNMAPTHINGS|GMF_MAPRESETS|GMF_DEADSPECTATORS|GMF_USEMAXLIVES|GMF_MAPRESET_RESETS_MAPTIME; - strcpy( g_GameModes[GAMEMODE_LASTMANSTANDING].szName, "Last Man Standing" ); - strncpy( g_GameModes[GAMEMODE_LASTMANSTANDING].szShortName, "LMS", 8 ); - strncpy( g_GameModes[GAMEMODE_LASTMANSTANDING].szF1Texture, "F1_LMS", 8 ); - - // Team LMS. - g_GameModes[GAMEMODE_TEAMLMS].ulFlags = GMF_DEATHMATCH|GMF_PLAYERSEARNWINS|GMF_DONTSPAWNMAPTHINGS|GMF_MAPRESETS|GMF_DEADSPECTATORS|GMF_PLAYERSONTEAMS|GMF_USEMAXLIVES|GMF_MAPRESET_RESETS_MAPTIME; - strcpy( g_GameModes[GAMEMODE_TEAMLMS].szName, "Team Last Man Standing" ); - strncpy( g_GameModes[GAMEMODE_TEAMLMS].szShortName, "TLMS", 8 ); - strncpy( g_GameModes[GAMEMODE_TEAMLMS].szF1Texture, "F1_TLMS", 8 ); - - // Possession DM. - // [BB] Even though possession doesn't do a full map reset, it still resets the map time during its partial reset. - g_GameModes[GAMEMODE_POSSESSION].ulFlags = GMF_DEATHMATCH|GMF_PLAYERSEARNPOINTS|GMF_MAPRESET_RESETS_MAPTIME; - strcpy( g_GameModes[GAMEMODE_POSSESSION].szName, "Possession" ); - strncpy( g_GameModes[GAMEMODE_POSSESSION].szShortName, "POSS", 8 ); - strncpy( g_GameModes[GAMEMODE_POSSESSION].szF1Texture, "F1_POSS", 8 ); - - // Team possession. - g_GameModes[GAMEMODE_TEAMPOSSESSION].ulFlags = GMF_DEATHMATCH|GMF_PLAYERSEARNPOINTS|GMF_PLAYERSONTEAMS|GMF_MAPRESET_RESETS_MAPTIME; - strcpy( g_GameModes[GAMEMODE_TEAMPOSSESSION].szName, "Team Possession" ); - strncpy( g_GameModes[GAMEMODE_TEAMPOSSESSION].szShortName, "TM POSS", 8 ); - strncpy( g_GameModes[GAMEMODE_TEAMPOSSESSION].szF1Texture, "F1_TPOSS", 8 ); - - // Regular teamgame. - g_GameModes[GAMEMODE_TEAMGAME].ulFlags = GMF_TEAMGAME|GMF_PLAYERSEARNPOINTS|GMF_PLAYERSONTEAMS; - strcpy( g_GameModes[GAMEMODE_TEAMGAME].szName, "Team Game" ); - strncpy( g_GameModes[GAMEMODE_TEAMGAME].szShortName, "TM GAME", 8 ); - strncpy( g_GameModes[GAMEMODE_TEAMGAME].szF1Texture, "F1_TMGM", 8 ); - - // Capture the flag. - g_GameModes[GAMEMODE_CTF].ulFlags = GMF_TEAMGAME|GMF_USEFLAGASTEAMITEM|GMF_PLAYERSEARNPOINTS|GMF_PLAYERSONTEAMS|GMF_USETEAMITEM; - strcpy( g_GameModes[GAMEMODE_CTF].szName, "Capture the Flag" ); - strncpy( g_GameModes[GAMEMODE_CTF].szShortName, "CTF", 8 ); - strncpy( g_GameModes[GAMEMODE_CTF].szF1Texture, "F1_CTF", 8 ); - - // One flag CTF. - g_GameModes[GAMEMODE_ONEFLAGCTF].ulFlags = GMF_TEAMGAME|GMF_USEFLAGASTEAMITEM|GMF_PLAYERSEARNPOINTS|GMF_PLAYERSONTEAMS|GMF_USETEAMITEM; - strcpy( g_GameModes[GAMEMODE_ONEFLAGCTF].szName, "1-Flag CTF" ); - strncpy( g_GameModes[GAMEMODE_ONEFLAGCTF].szShortName, "1F-CTF", 8 ); - strncpy( g_GameModes[GAMEMODE_ONEFLAGCTF].szF1Texture, "F1_1FCTF", 8 ); - - // Skulltag. - g_GameModes[GAMEMODE_SKULLTAG].ulFlags = GMF_TEAMGAME|GMF_PLAYERSEARNPOINTS|GMF_PLAYERSONTEAMS|GMF_USETEAMITEM; - strcpy( g_GameModes[GAMEMODE_SKULLTAG].szName, "Skulltag" ); - strncpy( g_GameModes[GAMEMODE_SKULLTAG].szShortName, "ST", 8 ); - strncpy( g_GameModes[GAMEMODE_SKULLTAG].szF1Texture, "F1_ST", 8 ); - - // Domination - g_GameModes[GAMEMODE_DOMINATION].ulFlags = GMF_TEAMGAME|GMF_PLAYERSEARNPOINTS|GMF_PLAYERSONTEAMS; - strcpy( g_GameModes[GAMEMODE_DOMINATION].szName, "Domination" ); - strncpy( g_GameModes[GAMEMODE_DOMINATION].szShortName, "DOM", 8 ); - strncpy( g_GameModes[GAMEMODE_DOMINATION].szF1Texture, "F1_DOM", 8 ); - - // [AK] Set the default values of all flagsets for all gamemodes. - for ( int i = GAMEMODE_COOPERATIVE; i < NUM_GAMEMODES; i++ ) - { - for ( int j = 0; j <= 1; j++ ) - { - g_GameModes[i].lDMFlags[j] = 0; - g_GameModes[i].lDMFlags[j] = 0; - g_GameModes[i].lCompatFlags[j] = 0; - g_GameModes[i].lCompatFlags[j] = 0; - g_GameModes[i].lZaDMFlags[j] = 0; - g_GameModes[i].lZaCompatFlags[j] = 0; - } - } - - // Our default game mode is co-op. - g_CurrentGameMode = GAMEMODE_COOPERATIVE; - -} - -//***************************************************************************** -// void GAMEMODE_Tick( void ) { static GAMESTATE_e oldState = GAMESTATE_UNSPECIFIED; @@ -304,6 +184,24 @@ { g_GameModes[GameMode].ulFlags |= GAMEMODE_ParserMustGetEnumName( sc, "flag", "GMF_", GetValueGMF ); } + else if (0 == stricmp (sc.String, "name")) + { + sc.MustGetString(); + strncpy( g_GameModes[GameMode].szName, sc.String, 31 ); + g_GameModes[GameMode].szName[31] = 0; + } + else if (0 == stricmp (sc.String, "shortname")) + { + sc.MustGetString(); + strncpy( g_GameModes[GameMode].szShortName, sc.String, 8 ); + g_GameModes[GameMode].szShortName[8] = 0; + } + else if (0 == stricmp (sc.String, "f1texture")) + { + sc.MustGetString(); + strncpy( g_GameModes[GameMode].szF1Texture, sc.String, 8 ); + g_GameModes[GameMode].szF1Texture[8] = 0; + } else if ((0 == stricmp (sc.String, "gamesettings")) || (0 == stricmp (sc.String, "lockedgamesettings"))) { bool bLockFlags = !stricmp( sc.String, "lockedgamesettings" ); @@ -373,6 +271,20 @@ { int lastlump = 0, lump; + // [AK] Before we start parsing any GAMEMODE lumps, initialize the flagset values used by all game modes to zero. + for ( unsigned int gamemode = GAMEMODE_COOPERATIVE; gamemode < NUM_GAMEMODES; gamemode++ ) + { + for ( unsigned int flagset = FLAGSET_VALUE; flagset <= FLAGSET_LOCKEDMASK; flagset++ ) + { + g_GameModes[gamemode].lDMFlags[flagset] = 0; + g_GameModes[gamemode].lDMFlags2[flagset] = 0; + g_GameModes[gamemode].lCompatFlags[flagset] = 0; + g_GameModes[gamemode].lCompatFlags2[flagset] = 0; + g_GameModes[gamemode].lZaDMFlags[flagset] = 0; + g_GameModes[gamemode].lZaCompatFlags[flagset] = 0; + } + } + while ((lump = Wads.FindLump ("GAMEMODE", &lastlump)) != -1) { FScanner sc(lump); @@ -382,6 +294,9 @@ GAMEMODE_ParseGamemodeInfoLump ( sc, GameMode ); } } + + // Our default game mode is co-op. + g_CurrentGameMode = GAMEMODE_COOPERATIVE; } //***************************************************************************** diff -r d6e67b99ef4b -r 153023bbd56d src/gamemode.h --- a/src/gamemode.h Sat May 08 20:32:09 2021 -0700 +++ b/src/gamemode.h Mon Jul 05 17:43:49 2021 -0400 @@ -167,7 +167,6 @@ //***************************************************************************** // PROTOTYPES -void GAMEMODE_Construct( void ); void GAMEMODE_Tick( void ); void GAMEMODE_ParseGamemodeInfoLump ( FScanner &sc, const GAMEMODE_e GameMode ); void GAMEMODE_ParseGamemodeInfo( void ); diff -r d6e67b99ef4b -r 153023bbd56d wadsrc/static/gamemode.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wadsrc/static/gamemode.txt Mon Jul 05 17:43:49 2021 -0400 @@ -0,0 +1,210 @@ +// Regular co-op +Cooperative +{ + AddFlag COOPERATIVE + AddFlag PLAYERSEARNKILLS + + Name "Cooperative" + ShortName "COOP" + F1Texture "F1_COOP" +} + +// Survival co-op +Survival +{ + AddFlag COOPERATIVE + AddFlag PLAYERSEARNKILLS + AddFlag MAPRESETS + AddFlag DEADSPECTATORS + AddFlag USEMAXLIVES + AddFlag MAPRESET_RESETS_MAPTIME + + Name "Survival" + ShortName "SURV" + F1Texture "F1_SCP" +} + +// Invasion +Invasion +{ + AddFlag COOPERATIVE + AddFlag PLAYERSEARNKILLS + AddFlag MAPRESETS + AddFlag DEADSPECTATORS + AddFlag USEMAXLIVES + + Name "Invasion" + ShortName "INVAS" + F1Texture "F1_INV" +} + +// Regular deathmatch +Deathmatch +{ + AddFlag DEATHMATCH + AddFlag PLAYERSEARNFRAGS + + Name "Deathmatch" + ShortName "DM" + F1Texture "F1_DM" +} + +// Teamplay DM +Teamplay +{ + AddFlag DEATHMATCH + AddFlag PLAYERSEARNFRAGS + AddFlag PLAYERSONTEAMS + + Name "Team Deathmatch" + ShortName "TDM" + F1Texture "F1_TDM" +} + +// Duel +Duel +{ + AddFlag DEATHMATCH + AddFlag PLAYERSEARNFRAGS + AddFlag MAPRESETS + AddFlag MAPRESET_RESETS_MAPTIME + + Name "Duel" + ShortName "DUEL" + F1Texture "F1_DUEL" +} + +// Terminator DM +Terminator +{ + AddFlag DEATHMATCH + AddFlag PLAYERSEARNFRAGS + + Name "Terminator" + ShortName "TERM" + F1Texture "F1_TERM" +} + +// Last man standing +LastManStanding +{ + AddFlag DEATHMATCH + AddFlag PLAYERSEARNWINS + AddFlag DONTSPAWNMAPTHINGS + AddFlag MAPRESETS + AddFlag DEADSPECTATORS + AddFlag USEMAXLIVES + AddFlag MAPRESET_RESETS_MAPTIME + + Name "Last Man Standing" + ShortName "LMS" + F1Texture "F1_LMS" +} + +// Team LMS +TeamLMS +{ + AddFlag DEATHMATCH + AddFlag PLAYERSEARNWINS + AddFlag DONTSPAWNMAPTHINGS + AddFlag MAPRESETS + AddFlag DEADSPECTATORS + AddFlag PLAYERSONTEAMS + AddFlag USEMAXLIVES + AddFlag MAPRESET_RESETS_MAPTIME + + Name "Team Last Man Standing" + ShortName "TLMS" + F1Texture "F1_TLMS" +} + +// Possession DM +Possession +{ + AddFlag DEATHMATCH + AddFlag PLAYERSEARNPOINTS + // [BB] Even though possession doesn't do a full map reset, it still resets the map time during its partial reset. + AddFlag MAPRESET_RESETS_MAPTIME + + Name "Possession" + ShortName "POSS" + F1Texture "F1_POSS" +} + +// Team possession +TeamPossession +{ + AddFlag DEATHMATCH + AddFlag PLAYERSEARNPOINTS + AddFlag PLAYERSONTEAMS + AddFlag MAPRESET_RESETS_MAPTIME + + Name "Team Possession" + ShortName "TM POSS" + F1Texture "F1_TPOSS" +} + +// Regular teamgame +TeamGame +{ + AddFlag TEAMGAME + AddFlag PLAYERSEARNPOINTS + AddFlag PLAYERSONTEAMS + + Name "Team Game" + ShortName "TM GAME" + F1Texture "F1_TMGM" +} + +// Capture the flag +CTF +{ + AddFlag TEAMGAME + AddFlag USEFLAGASTEAMITEM + AddFlag PLAYERSEARNPOINTS + AddFlag PLAYERSONTEAMS + AddFlag USETEAMITEM + + Name "Capture the Flag" + ShortName "CTF" + F1Texture "F1_CTF" +} + +// One flag CTF +OneFlagCTF +{ + AddFlag TEAMGAME + AddFlag USEFLAGASTEAMITEM + AddFlag PLAYERSEARNPOINTS + AddFlag PLAYERSONTEAMS + AddFlag USETEAMITEM + + Name "1-Flag CTF" + ShortName "1F-CTF" + F1Texture "F1_1FCTF" +} + +// Skulltag +Skulltag +{ + AddFlag TEAMGAME + AddFlag PLAYERSEARNPOINTS + AddFlag PLAYERSONTEAMS + AddFlag USETEAMITEM + + Name "Skulltag" + ShortName "ST" + F1Texture "F1_ST" +} + +// Domination +Domination +{ + AddFlag TEAMGAME + AddFlag PLAYERSEARNPOINTS + AddFlag PLAYERSONTEAMS + + Name "Domination" + ShortName "DOM" + F1Texture "F1_DOM" +} \ No newline at end of file