# HG changeset patch # User Adam Kaminski # Date 1616512853 14400 # Tue Mar 23 11:20:53 2021 -0400 # Node ID 8371cb02ede6a175b3bdbc4dd29c2fc28af345b3 # Parent 342153688b6a3df69e59c4764b01b1bbdbac7034 Gameplay and compatibility flags added in the "gamesettings" block in GAMEMODE aren't locked anymore, so they can still be changed manually from the console. To lock them, the "lockedgamesettings" block should be used instead. diff -r 342153688b6a -r 8371cb02ede6 src/c_cvars.cpp --- a/src/c_cvars.cpp Mon Mar 22 18:05:27 2021 -0400 +++ b/src/c_cvars.cpp Tue Mar 23 11:20:53 2021 -0400 @@ -198,7 +198,7 @@ // [AK] Check if we (indirectly) changed any flags locked in the current game mode. else if ( Flags & CVAR_GAMEMODELOCK ) { - int mask = GAMEMODE_GetCurrentFlagsetMask( static_cast( this )); + int mask = GAMEMODE_GetCurrentFlagsetMask( static_cast( this ), true ); int oldValue = GetGenericRep( CVAR_Int ).Int; int newValue = ToInt( value, type ); diff -r 342153688b6a -r 8371cb02ede6 src/g_level.cpp --- a/src/g_level.cpp Mon Mar 22 18:05:27 2021 -0400 +++ b/src/g_level.cpp Tue Mar 23 11:20:53 2021 -0400 @@ -421,6 +421,9 @@ S_ResumeSound (false); } + // [AK] Set any flags to what the need to be in the new game mode. + GAMEMODE_ReconfigureGameSettings( ); + // [BC] Reset the end level delay. GAME_SetEndLevelDelay( 0 ); @@ -1068,7 +1071,7 @@ NETTRAFFIC_Reset(); // [AK] Reset all locked gameplay/compatibility flags to what they're supposed to be, in case they somehow changed. - GAMEMODE_ReconfigureGameSettings(); + GAMEMODE_ReconfigureGameSettings( true ); // Loop through the teams, and reset the scores. for ( i = 0; i < teams.Size( ); i++ ) diff -r 342153688b6a -r 8371cb02ede6 src/gamemode.cpp --- a/src/gamemode.cpp Mon Mar 22 18:05:27 2021 -0400 +++ b/src/gamemode.cpp Tue Mar 23 11:20:53 2021 -0400 @@ -304,8 +304,10 @@ { g_GameModes[GameMode].ulFlags |= GAMEMODE_ParserMustGetEnumName( sc, "flag", "GMF_", GetValueGMF ); } - else if (0 == stricmp (sc.String, "gamesettings")) + else if ((0 == stricmp (sc.String, "gamesettings")) || (0 == stricmp (sc.String, "lockedgamesettings"))) { + bool bLockFlags = !stricmp( sc.String, "lockedgamesettings" ); + sc.MustGetStringName( "{" ); while ( !sc.CheckString( "}" )) { @@ -331,6 +333,10 @@ flagset[FLAGSET_VALUE] &= ~ulBit; flagset[FLAGSET_MASK] |= ulBit; + + // [AK] Lock this flag so it can't be manually changed. + if ( bLockFlags ) + flagset[FLAGSET_LOCKEDMASK] |= ulBit; } } else if (0 == stricmp (sc.String, "removegamesetting")) @@ -340,6 +346,7 @@ flagset[FLAGSET_VALUE] &= ~ulBit; flagset[FLAGSET_MASK] &= ~ulBit; + flagset[FLAGSET_LOCKEDMASK] &= ~ulBit; } else sc.ScriptError ( "Unknown option '%s', on line %d in GAMEMODE.", sc.String, sc.Line ); @@ -412,20 +419,22 @@ //***************************************************************************** // -int GAMEMODE_GetFlagsetMask( GAMEMODE_e GameMode, FIntCVar *Flagset ) +int GAMEMODE_GetFlagsetMask( GAMEMODE_e GameMode, FIntCVar *Flagset, bool bLocked ) { + ULONG ulMask = bLocked ? FLAGSET_LOCKEDMASK : FLAGSET_MASK; + if ( Flagset == &dmflags ) - return ( g_GameModes[GameMode].lDMFlags[FLAGSET_MASK] ); + return ( g_GameModes[GameMode].lDMFlags[ulMask] ); else if ( Flagset == &dmflags2 ) - return ( g_GameModes[GameMode].lDMFlags2[FLAGSET_MASK] ); + return ( g_GameModes[GameMode].lDMFlags2[ulMask] ); else if ( Flagset == &compatflags ) - return ( g_GameModes[GameMode].lCompatFlags[FLAGSET_MASK] ); + return ( g_GameModes[GameMode].lCompatFlags[ulMask] ); else if ( Flagset == &compatflags2 ) - return ( g_GameModes[GameMode].lCompatFlags2[FLAGSET_MASK] ); + return ( g_GameModes[GameMode].lCompatFlags2[ulMask] ); else if ( Flagset == &zadmflags ) - return ( g_GameModes[GameMode].lZaDMFlags[FLAGSET_MASK] ); + return ( g_GameModes[GameMode].lZaDMFlags[ulMask] ); else if ( Flagset == &zacompatflags ) - return ( g_GameModes[GameMode].lZaCompatFlags[FLAGSET_MASK] ); + return ( g_GameModes[GameMode].lZaCompatFlags[ulMask] ); // [AK] We passed an invalid flagset, just return zero. return ( 0 ); @@ -433,9 +442,9 @@ //***************************************************************************** // -int GAMEMODE_GetCurrentFlagsetMask( FIntCVar *Flagset ) +int GAMEMODE_GetCurrentFlagsetMask( FIntCVar *Flagset, bool bLocked ) { - return ( GAMEMODE_GetFlagsetMask( g_CurrentGameMode, Flagset ) ); + return ( GAMEMODE_GetFlagsetMask( g_CurrentGameMode, Flagset, bLocked ) ); } //***************************************************************************** @@ -1322,32 +1331,33 @@ //***************************************************************************** // -void GAMEMODE_ReconfigureGameSettings( void ) +void GAMEMODE_ReconfigureGameSettings( bool bLockedOnly ) { + ULONG ulMask = bLockedOnly ? FLAGSET_LOCKEDMASK : FLAGSET_MASK; GAMEMODE_s *GameMode = &g_GameModes[g_CurrentGameMode]; UCVarValue value; // [AK] Apply the mask to dmflags, but don't change the values of any unlocked flags. - value.Int = ( dmflags & ~GameMode->lDMFlags[FLAGSET_MASK] ) | GameMode->lDMFlags[FLAGSET_VALUE]; + value.Int = ( dmflags & ~GameMode->lDMFlags[ulMask] ) | ( GameMode->lDMFlags[FLAGSET_VALUE] & GameMode->lDMFlags[ulMask] ); dmflags.ForceSet( value, CVAR_Int ); // ...and dmflags2. - value.Int = ( dmflags2 & ~GameMode->lDMFlags2[FLAGSET_MASK] ) | GameMode->lDMFlags2[FLAGSET_VALUE]; + value.Int = ( dmflags2 & ~GameMode->lDMFlags2[ulMask] ) | ( GameMode->lDMFlags2[FLAGSET_VALUE] & GameMode->lDMFlags2[ulMask] ); dmflags2.ForceSet( value, CVAR_Int ); // ...and compatflags. - value.Int = ( compatflags & ~GameMode->lCompatFlags[FLAGSET_MASK] ) | GameMode->lCompatFlags[FLAGSET_VALUE]; + value.Int = ( compatflags & ~GameMode->lCompatFlags[ulMask] ) | ( GameMode->lCompatFlags[FLAGSET_VALUE] & GameMode->lCompatFlags[ulMask] ); compatflags.ForceSet( value, CVAR_Int ); // ...and compatflags2. - value.Int = ( compatflags2 & ~GameMode->lCompatFlags2[FLAGSET_MASK] ) | GameMode->lCompatFlags2[FLAGSET_VALUE]; + value.Int = ( compatflags2 & ~GameMode->lCompatFlags2[ulMask] ) | ( GameMode->lCompatFlags2[FLAGSET_VALUE] & GameMode->lCompatFlags2[ulMask] ); compatflags2.ForceSet( value, CVAR_Int ); // ...and zadmflags. - value.Int = ( zadmflags & ~GameMode->lZaDMFlags[FLAGSET_MASK] ) | GameMode->lZaDMFlags[FLAGSET_VALUE]; + value.Int = ( zadmflags & ~GameMode->lZaDMFlags[ulMask] ) | ( GameMode->lZaDMFlags[FLAGSET_VALUE] & GameMode->lZaDMFlags[ulMask] ); zadmflags.ForceSet( value, CVAR_Int ); // ...and zacompatflags. - value.Int = ( zacompatflags & ~GameMode->lZaCompatFlags[FLAGSET_MASK] ) | GameMode->lZaCompatFlags[FLAGSET_VALUE]; + value.Int = ( zacompatflags & ~GameMode->lZaCompatFlags[ulMask] ) | ( GameMode->lZaCompatFlags[FLAGSET_VALUE] & GameMode->lZaCompatFlags[ulMask] ); zacompatflags.ForceSet( value, CVAR_Int ); } \ No newline at end of file diff -r 342153688b6a -r 8371cb02ede6 src/gamemode.h --- a/src/gamemode.h Mon Mar 22 18:05:27 2021 -0400 +++ b/src/gamemode.h Tue Mar 23 11:20:53 2021 -0400 @@ -68,10 +68,12 @@ #define GAMEEVENT_RETURN_TIMEOUTRETURN 0 #define GAMEEVENT_RETURN_PLAYERRETURN 1 -// [AK] The combined bit values of all flags that are locked in a game mode. +// [AK] The combined values of all flags set in a game mode. #define FLAGSET_VALUE 0 -// [AK] All the bits of a flagset to be locked in a game mode. +// [AK] The bits of a flagset to be set. #define FLAGSET_MASK 1 +// [AK] The bits of a flagset that are locked and cannot be changed. +#define FLAGSET_LOCKEDMASK 2 //***************************************************************************** // EXTERNAL CONSOLE VARIABLES @@ -143,22 +145,22 @@ char szF1Texture[9]; // [AK] The dmflags we set for this gamemode. - LONG lDMFlags[2]; + LONG lDMFlags[3]; // [AK] The dmflags2 we set for this gamemode. - LONG lDMFlags2[2]; + LONG lDMFlags2[3]; // [AK] The compatflags we set for this gamemode. - LONG lCompatFlags[2]; + LONG lCompatFlags[3]; // [AK] The compatflags2 we set for this gamemode. - LONG lCompatFlags2[2]; + LONG lCompatFlags2[3]; // [AK] The zadmflags we set for this gamemode. - LONG lZaDMFlags[2]; + LONG lZaDMFlags[3]; // [AK] The zacompatflags we set for this gamemode. - LONG lZaCompatFlags[2]; + LONG lZaCompatFlags[3]; } GAMEMODE_s; @@ -174,8 +176,8 @@ char *GAMEMODE_GetShortName( GAMEMODE_e GameMode ); char *GAMEMODE_GetName( GAMEMODE_e GameMode ); char *GAMEMODE_GetF1Texture( GAMEMODE_e GameMode ); -int GAMEMODE_GetFlagsetMask( GAMEMODE_e GameMode, FIntCVar *Flagset ); -int GAMEMODE_GetCurrentFlagsetMask( FIntCVar *Flagset ); +int GAMEMODE_GetFlagsetMask( GAMEMODE_e GameMode, FIntCVar *Flagset, bool bLocked = false ); +int GAMEMODE_GetCurrentFlagsetMask( FIntCVar *Flagset, bool bLocked = false ); void GAMEMODE_DetermineGameMode( void ); bool GAMEMODE_IsGameInCountdown( void ); bool GAMEMODE_IsGameInProgress( void ); @@ -219,6 +221,6 @@ void GAMEMODE_SetCountdownTicks( const ULONG Ticks ); void GAMEMODE_SetLimit( GAMELIMIT_e GameLimit, int value ); -void GAMEMODE_ReconfigureGameSettings( void ); +void GAMEMODE_ReconfigureGameSettings( bool bLockedOnly = false ); #endif // __GAMEMODE_H__