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 /game/client/tf/tf_hud_training.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/client/tf/tf_hud_training.cpp')
| -rw-r--r-- | game/client/tf/tf_hud_training.cpp | 300 |
1 files changed, 300 insertions, 0 deletions
diff --git a/game/client/tf/tf_hud_training.cpp b/game/client/tf/tf_hud_training.cpp new file mode 100644 index 0000000..a14839e --- /dev/null +++ b/game/client/tf/tf_hud_training.cpp @@ -0,0 +1,300 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#include "cbase.h" +#include "tf_hud_escort.h" +#include <vgui/IVGui.h> +#include "tf_hud_freezepanel.h" +#include "teamplayroundbased_gamerules.h" +#include "iclientmode.h" +#include "tf_gamerules.h" +#include "tf_hud_training.h" +#include <vgui/ILocalize.h> + +using namespace vgui; + +//----------------------------------------------------------------------------- +// Purpose: Localize text for training messages. Used in annotations and in the training hud. Assumes the output string size is greater than or equal to MAX_TRAINING_MSG_LENGTH +//----------------------------------------------------------------------------- +bool CTFHudTraining::FormatTrainingText(const char* inputString, wchar_t* outputString) +{ + static wchar_t szBuf[MAX_TRAINING_MSG_LENGTH]; + static wchar_t *pszBuf; + + if ( !inputString || !inputString[0] ) + { + return false; + } + + // init buffers & pointers + outputString[0] = 0; + szBuf[0] = 0; + pszBuf = szBuf; + + // try to localize + pszBuf = g_pVGuiLocalize->Find( inputString ); + + if ( !pszBuf ) + { + // use plain ASCII string + g_pVGuiLocalize->ConvertANSIToUnicode( inputString, szBuf, sizeof(szBuf) ); + pszBuf = szBuf; + } + + // Replace bindings with the keys + // parse out the text into a label set + wchar_t *ws = pszBuf; + while ( *ws ) + { + wchar_t token[MAX_TRAINING_MSG_LENGTH]; + bool isVar = false; + + // check for variables + if ( *ws == '%' ) + { + isVar = true; + ++ws; + } + + // parse out the string + wchar_t *end = wcschr( ws, '%' ); + if ( end ) + { + wcsncpy( token, ws, end - ws ); + token[end - ws] = 0; + } + else + { + V_wcscpy_safe( token, ws ); + } + ws += wcslen( token ); + if ( isVar ) + { + // move over the end of the variable + ++ws; + } + + // modify the label if necessary + if ( isVar ) + { + // lookup key names + char binding[64]; + g_pVGuiLocalize->ConvertUnicodeToANSI( token, binding, sizeof(binding) ); + + //!! change some key names into better names + char friendlyName[64]; + const char *key = engine->Key_LookupBinding( *binding == '+' ? binding + 1 : binding ); + if ( !key ) + { + key = "< not bound >"; + } + + Q_snprintf( friendlyName, sizeof(friendlyName), "#%s", key ); + Q_strupr( friendlyName ); + + // set the variable text - key may need to be localized (button images for example) + wchar_t *locName = g_pVGuiLocalize->Find( friendlyName ); + if ( !locName || wcslen(locName) <= 0) + { + wchar_t wszFriendly[64]; + g_pVGuiLocalize->ConvertANSIToUnicode( friendlyName+1, wszFriendly, sizeof( wszFriendly ) ); + V_wcsncat( outputString, wszFriendly, MAX_TRAINING_MSG_LENGTH ); + } + else + { + V_wcsncat( outputString, locName, MAX_TRAINING_MSG_LENGTH ); + } + } + else + { + V_wcsncat( outputString, token, MAX_TRAINING_MSG_LENGTH ); + } + } + return true; +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CTFHudTraining::CTFHudTraining( Panel *parent, const char *name ) : EditablePanel( parent, name ) +{ + m_pMsgLabel = NULL; + m_pPressSpacebarToContinueLabel = NULL; + + ivgui()->AddTickSignal( GetVPanel(), 10 ); + + ListenForGameEvent( "teamplay_round_start" ); +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CTFHudTraining::~CTFHudTraining() +{ + ivgui()->RemoveTickSignal( GetVPanel() ); +} + + +//----------------------------------------------------------------------------- +// Purpose: Hide when we take a freeze cam shot +//----------------------------------------------------------------------------- +bool CTFHudTraining::IsVisible( void ) +{ + if( IsTakingAFreezecamScreenshot() ) + return false; + + if ( IsInFreezeCam() ) + return false; + + return BaseClass::IsVisible(); +} + +void CTFHudTraining::Reset( void ) +{ + const char *emptyText = ""; + + SetDialogVariable( "goal", emptyText ); + + if (m_pMsgLabel) m_pMsgLabel->SetText(emptyText); + if (m_pPressSpacebarToContinueLabel) m_pPressSpacebarToContinueLabel->SetVisible( false ); + +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFHudTraining::ApplySchemeSettings( IScheme *pScheme ) +{ + BaseClass::ApplySchemeSettings( pScheme ); + + // load control settings... + LoadControlSettings( "resource/UI/HudTraining.res" ); + + m_pMsgLabel = dynamic_cast<CExRichText *>( FindChildByName("MsgLabel") ); + m_pPressSpacebarToContinueLabel = dynamic_cast<CExLabel *>( FindChildByName("PressSpacebarToContinue") ); +} + +void CTFHudTraining::SetTrainingObjective(char *szRawString) +{ + wchar_t wszText[MAX_TRAINING_MSG_LENGTH]; + + if (!FormatTrainingText(szRawString, wszText)) + { + SetDialogVariable( "goal", "" ); + return; + } + + SetDialogVariable( "goal", wszText ); + + C_BasePlayer *pLocalPlayer = C_BasePlayer::GetLocalPlayer(); + if ( pLocalPlayer ) + { + pLocalPlayer->EmitSound( "Hud.TrainingMsgUpdate" ); + } +} + + +void CTFHudTraining::SetTrainingText(char *szRawString) +{ + static wchar_t wszText[MAX_TRAINING_MSG_LENGTH]; + + InvalidateLayout( false, true ); + + if ( !m_pMsgLabel ) + return; + + if (!FormatTrainingText(szRawString, wszText)) + { + m_pMsgLabel->SetText( "" ); + return; + } + + // clear the text first + m_pMsgLabel->SetText(""); + + enum + { + COLOR_NORMAL = 1, + COLOR_HINT = 2, + }; + static wchar_t wszInsertedText[MAX_TRAINING_MSG_LENGTH]; + Color color = m_pMsgLabel->GetFgColor(); + Color newColor = color; + int startIdx = 0; + int endIdx = 0; + bool bContinue = true; + while ( bContinue ) + { + bool bSetText = false; + switch ( wszText[endIdx] ) + { + case 0: + bContinue = false; + bSetText = true; + break; + case COLOR_NORMAL: + newColor = m_pMsgLabel->GetFgColor(); + bSetText = true; + break; + case COLOR_HINT: + newColor = m_pMsgLabel->GetSchemeColor( "HudTrainingHint", Color(255, 255, 255, 255), scheme()->GetIScheme( m_pMsgLabel->GetScheme() ) ); + bSetText = true; + break; + } + if ( bSetText ) + { + if ( startIdx != endIdx ) + { + int len = endIdx - startIdx + 1; + wcsncpy( wszInsertedText, wszText + startIdx, len ); + wszInsertedText[len-1] = 0; + m_pMsgLabel->InsertColorChange( color ); + m_pMsgLabel->InsertString( wszInsertedText ); + // skip past the color change character + startIdx = endIdx + 1; + } + color = newColor; + } + ++endIdx; + } + + //m_pMessageFlashEndTime = gpGlobals->curtime + MESSAGE_FLASH_TIME; + g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( "TrainingHudBounce"); + + C_BasePlayer *pLocalPlayer = C_BasePlayer::GetLocalPlayer(); + if ( pLocalPlayer ) + { + pLocalPlayer->EmitSound( "Hud.TrainingMsgUpdate" ); + } +} + + +//----------------------------------------------------------------------------- +// Purpose: Receive messages about changes in state +//----------------------------------------------------------------------------- +void CTFHudTraining::FireGameEvent( IGameEvent *event ) +{ + const char *eventName = event->GetName(); + + if ( FStrEq( "teamplay_round_start", eventName ) ) + { + InvalidateLayout( false, true ); + } +} + + +void CTFHudTraining::OnTick( ) +{ + bool bShouldBeVisible = TFGameRules() && TFGameRules()->IsWaitingForTrainingContinue(); + if ( m_pPressSpacebarToContinueLabel && bShouldBeVisible != m_pPressSpacebarToContinueLabel->IsVisible() ) + { + m_pPressSpacebarToContinueLabel->SetVisible( bShouldBeVisible ); + + g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( bShouldBeVisible ? "TrainingPressSpacebarBlink" : "TrainingPressSpacebarBlinkStop" ); + } +}
\ No newline at end of file |