diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /engine/cheatcodes.cpp | |
| download | archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip | |
Diffstat (limited to 'engine/cheatcodes.cpp')
| -rw-r--r-- | engine/cheatcodes.cpp | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/engine/cheatcodes.cpp b/engine/cheatcodes.cpp new file mode 100644 index 0000000..12fa378 --- /dev/null +++ b/engine/cheatcodes.cpp @@ -0,0 +1,156 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//===========================================================================// + +#include "cheatcodes.h" +#include "cmd.h" +#include "KeyValues.h" +#include "filesystem.h" +#include "tier2/tier2.h" +#include "inputsystem/iinputsystem.h" +#include "host.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + + +//========================================================= +// Cheat Codes +//========================================================= +#define CHEAT_NAME_MAX_LEN 32 +#define CHEAT_CODE_MAX_LEN 10 +#define CHEAT_COMMAND_MAX_LEN 128 +static ButtonCode_t s_pKeyLog[CHEAT_CODE_MAX_LEN]; +static int s_nKeyLogIndex = 0; + + +struct CheatCodeData_t +{ + char szName[ CHEAT_NAME_MAX_LEN ]; + + bool bDevOnly; + + int iCodeLength; + ButtonCode_t pButtonCodes[ CHEAT_CODE_MAX_LEN ]; + + char szCommand[ CHEAT_COMMAND_MAX_LEN ]; +}; + + +static CUtlVector<CheatCodeData_t> s_CheatCodeCommands; + + +void ClearCheatCommands( void ) +{ + s_CheatCodeCommands.RemoveAll(); +} + +void ReadCheatCommandsFromFile( char *pchFileName ) +{ + KeyValues *pCheatCodeKeys = new KeyValues( "cheat_codes" ); + pCheatCodeKeys->LoadFromFile( g_pFullFileSystem, pchFileName, NULL ); + + KeyValues *pKey = NULL; + for ( pKey = pCheatCodeKeys->GetFirstTrueSubKey(); pKey; pKey = pKey->GetNextTrueSubKey() ) + { + int iCheat = s_CheatCodeCommands.AddToTail(); + CheatCodeData_t *pNewCheatCode = &(s_CheatCodeCommands[ iCheat ]); + + Q_strncpy( pNewCheatCode->szName, pKey->GetName(), CHEAT_NAME_MAX_LEN ); // Get the name + pNewCheatCode->bDevOnly = ( pKey->GetInt( "dev", 0 ) != 0 ); // Get developer only flag + pNewCheatCode->iCodeLength = 0; // Start at zero code elements + Q_strncpy( pNewCheatCode->szCommand, pKey->GetString( "command", "echo \"Cheat code has no command!\"" ), CHEAT_COMMAND_MAX_LEN ); + + KeyValues *pSubKey = NULL; + for ( pSubKey = pKey->GetFirstSubKey(); pSubKey; pSubKey = pSubKey->GetNextKey() ) + { + const char *pchType = pSubKey->GetName(); + if ( Q_strcmp( pchType, "code" ) == 0 ) + { + AssertMsg( ( pNewCheatCode->iCodeLength < CHEAT_NAME_MAX_LEN ), "Cheat code elements exceeded max!" ); + + pNewCheatCode->pButtonCodes[ pNewCheatCode->iCodeLength ] = g_pInputSystem->StringToButtonCode( pSubKey->GetString() ); + ++pNewCheatCode->iCodeLength; + } + } + + if ( pNewCheatCode->iCodeLength < CHEAT_NAME_MAX_LEN ) + { + // If it's activation is a subsequence of another cheat, the longer cheat can't be activated! + DevWarning( "Cheat code \"%s\" has less than %i code elements!", pKey->GetName(), CHEAT_NAME_MAX_LEN ); + } + } +} + +//--------------------------------------------------------- +//--------------------------------------------------------- +void ResetKeyLogging() +{ + s_nKeyLogIndex = 0; +} + +//--------------------------------------------------------- +//--------------------------------------------------------- +void LogKeyPress( ButtonCode_t code ) +{ + if ( s_nKeyLogIndex < CHEAT_CODE_MAX_LEN ) + { + // Log isn't full, so add it in the next spot + s_pKeyLog[ s_nKeyLogIndex ] = code; + ++s_nKeyLogIndex; + return; + } + + // Log is full so shift all data to the previous bucket + int i; + for ( i = 0; i < CHEAT_CODE_MAX_LEN - 1; ++i ) + { + s_pKeyLog[ i ] = s_pKeyLog[ i + 1 ]; + } + + // Log into the last bucket + s_pKeyLog[ i ] = code; +} + +//--------------------------------------------------------- +//--------------------------------------------------------- +void CheckCheatCodes() +{ + // Loop through all cheat codes + int iNumCheatCodes = s_CheatCodeCommands.Count(); + for ( int iCheatCode = 0; iCheatCode < iNumCheatCodes; ++iCheatCode ) + { + CheatCodeData_t *pCheatCode = &(s_CheatCodeCommands[ iCheatCode ]); + + if ( pCheatCode->bDevOnly && !developer.GetBool() ) + continue; // This cheat is only allowed in developer mode + + int iLogIndex = s_nKeyLogIndex - pCheatCode->iCodeLength; // Check code against the back chunk of the log + + if ( iLogIndex < 0 ) + continue; // There's less codes in the log than we need + + int iCode = 0; + + while ( iCode < pCheatCode->iCodeLength && pCheatCode->pButtonCodes[ iCode ] == s_pKeyLog[ iLogIndex ] ) + { + ++iCode; + ++iLogIndex; + } + + if ( iCode == pCheatCode->iCodeLength ) + { + // Every part of the code was correct + DevMsg( "Cheat code \"%s\" activated!", pCheatCode->szName ); + + Cbuf_AddText( "sv_cheats 1\n" ); + Cbuf_AddText( pCheatCode->szCommand ); + Cbuf_AddText( "\n" ); + + ResetKeyLogging(); + return; + } + } +} |