You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2017 lines
58 KiB
2017 lines
58 KiB
![]()
4 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose: HUD Target ID element
|
||
|
//
|
||
|
// $NoKeywords: $
|
||
|
//=============================================================================
|
||
|
#include "cbase.h"
|
||
|
#include "tf_hud_mann_vs_machine_status.h"
|
||
|
|
||
|
#include <vgui_controls/AnimationController.h>
|
||
|
#include "iclientmode.h"
|
||
|
#include "c_tf_objective_resource.h"
|
||
|
#include "tf_gamerules.h"
|
||
|
#include "tf_mann_vs_machine_stats.h"
|
||
|
#include "spectatorgui.h"
|
||
|
#include "engine/IEngineSound.h"
|
||
|
#include "c_tf_mvm_boss_progress_user.h"
|
||
|
#include "hud_macros.h"
|
||
|
|
||
|
// memdbgon must be the last include file in a .cpp file!!!
|
||
|
#include "tier0/memdbgon.h"
|
||
|
|
||
|
|
||
|
using namespace vgui;
|
||
|
|
||
|
extern void AddSubKeyNamed( KeyValues *pKeys, const char *pszName );
|
||
|
extern const ConVar *sv_cheats;
|
||
|
extern ConVar cl_hud_minmode;
|
||
|
|
||
|
|
||
|
#define VICTORY_SPLASH_TIME 1.0f
|
||
|
#define CREDITS_COLLECTED_TIME 2.0f
|
||
|
#define CREDITS_MISSED_TIME 1.0f
|
||
|
#define CREDITS_BONUS_TIME 0.5f
|
||
|
#define RATING_LABEL_TIME 0.5f
|
||
|
#define RATING_SCORE_TIME 0.5f
|
||
|
#define WAIT_TIME 12.0f
|
||
|
|
||
|
// String constants that match variable names in .res files
|
||
|
#define CREDITS_COLLECTED_STR "creditscollected"
|
||
|
#define CREDITS_MISSED_STR "creditsmissed"
|
||
|
#define CREDITS_BONUS_STR "creditbonus"
|
||
|
#define RESPEC_COUNT_STR "respeccount"
|
||
|
#define RATING_LABEL_STR "ratinglabel"
|
||
|
#define RATING_SCORE_STR "ratingscore"
|
||
|
|
||
|
|
||
|
ConVar cl_mvm_wave_status_visible_during_wave( "cl_mvm_wave_status_visible_during_wave", "0", FCVAR_ARCHIVE, "Display full wave contents while a wave is active in MvM." );
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// User Message Callbacks for CTFHudMannVsMachineStatus
|
||
|
//-----------------------------------------------------------------------------
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Restore Checkpoint status message
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void __MsgFunc_MVMWaveFailed( bf_read &msg )
|
||
|
{
|
||
|
CTFHudMannVsMachineStatus *pMannVsMachineStatus = GET_HUDELEMENT( CTFHudMannVsMachineStatus );
|
||
|
if ( pMannVsMachineStatus )
|
||
|
{
|
||
|
pMannVsMachineStatus->WaveFailed();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Announce a MVM message on the HUD
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void __MsgFunc_MVMAnnouncement( bf_read &msg )
|
||
|
{
|
||
|
CTFHudMannVsMachineStatus *pMannVsMachineStatus = GET_HUDELEMENT( CTFHudMannVsMachineStatus );
|
||
|
if ( pMannVsMachineStatus )
|
||
|
{
|
||
|
uint8 nType = msg.ReadByte();
|
||
|
uint8 nCount = msg.ReadByte();
|
||
|
|
||
|
switch ( nType )
|
||
|
{
|
||
|
case TF_MVM_ANNOUNCEMENT_WAVE_COMPLETE:
|
||
|
pMannVsMachineStatus->ShowWaveSummary( nCount );
|
||
|
break;
|
||
|
default:
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Players have won the MvM Pop File
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void __MsgFunc_MVMVictory( bf_read &msg )
|
||
|
{
|
||
|
CTFHudMannVsMachineStatus *pMannVsMachineStatus = GET_HUDELEMENT( CTFHudMannVsMachineStatus );
|
||
|
if ( !pMannVsMachineStatus )
|
||
|
return;
|
||
|
|
||
|
bool bIsKicking = (bool)msg.ReadByte();
|
||
|
int nTime = (int)msg.ReadByte();
|
||
|
|
||
|
pMannVsMachineStatus->MVMVictory( bIsKicking, nTime );
|
||
|
}
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Update the time to disconnect / kick
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void __MsgFunc_MVMServerKickTimeUpdate( bf_read &msg )
|
||
|
{
|
||
|
CTFHudMannVsMachineStatus *pMannVsMachineStatus = GET_HUDELEMENT( CTFHudMannVsMachineStatus );
|
||
|
if ( !pMannVsMachineStatus )
|
||
|
return;
|
||
|
|
||
|
int nTime = (int)msg.ReadByte();
|
||
|
|
||
|
pMannVsMachineStatus->MVMServerKickTimeUpdate( nTime );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
DECLARE_BUILD_FACTORY( CEnemyCountPanel );
|
||
|
|
||
|
CEnemyCountPanel::CEnemyCountPanel( Panel *parent, const char *pName ): vgui::EditablePanel( parent, pName )
|
||
|
{
|
||
|
m_bFlashing = false;
|
||
|
|
||
|
ListenForGameEvent( "localplayer_respawn" );
|
||
|
|
||
|
m_pEnemyCountImage = NULL;
|
||
|
m_pEnemyCountImageBG = NULL;
|
||
|
m_pEnemyCountCritBG = NULL;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CEnemyCountPanel::ApplySchemeSettings( IScheme *pScheme )
|
||
|
{
|
||
|
BaseClass::ApplySchemeSettings( pScheme );
|
||
|
|
||
|
// load control settings...
|
||
|
LoadControlSettings( "resource/UI/EnemyCountPanel.res" );
|
||
|
|
||
|
// Save refs to images
|
||
|
m_pEnemyCountImage = dynamic_cast< CTFImagePanel* >( FindChildByName( "EnemyCountImage" ) );
|
||
|
m_pEnemyCountImageBG = dynamic_cast< Panel* >( FindChildByName( "EnemyCountImageBG" ) );
|
||
|
m_pEnemyCountCritBG = dynamic_cast< CTFImagePanel* >( FindChildByName( "EnemyCountCritImageBG" ) );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CEnemyCountPanel::FireGameEvent( IGameEvent * event )
|
||
|
{
|
||
|
if ( FStrEq( event->GetName(), "localplayer_respawn" ) )
|
||
|
{
|
||
|
if ( m_bFlashing )
|
||
|
{
|
||
|
// when the player respawns all the animation events
|
||
|
// are cleared so we need to restart them if necessary
|
||
|
SetFlashing( true );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CEnemyCountPanel::SetFlashing( bool bState )
|
||
|
{
|
||
|
if ( m_bFlashing != bState )
|
||
|
{
|
||
|
m_bFlashing = bState;
|
||
|
|
||
|
if (m_bFlashing)
|
||
|
{
|
||
|
g_pClientMode->GetViewportAnimationController()->StartAnimationSequence(this, "SpyWarningFlash");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
g_pClientMode->GetViewportAnimationController()->StartAnimationSequence(this, "SpyWarningFlashEnd");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
DECLARE_BUILD_FACTORY( CMvMBossProgressBar );
|
||
|
|
||
|
CMvMBossProgressBar::CMvMBossProgressBar( Panel *parent, const char *pName ): vgui::EditablePanel( parent, pName )
|
||
|
{
|
||
|
m_flPercentage = m_flOldPercentage = 1.0f;
|
||
|
m_pProgressBar = new ScalableImagePanel( this, "ProgressBar" );
|
||
|
m_pProgressBarBG = new ScalableImagePanel( this, "ProgressBarBG" );
|
||
|
m_pBossImage = new CTFImagePanel( this, "TankImage" );
|
||
|
|
||
|
m_nBarOrgX = m_nBarOrgY = m_nBarOrgW = m_nBarOrgT = 0;
|
||
|
m_nBgOrgX = m_nBgOrgY = m_nBgOrgW = m_nBgOrgT = 0;
|
||
|
|
||
|
vgui::ivgui()->AddTickSignal( GetVPanel(), 50 );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CMvMBossProgressBar::ApplySchemeSettings( IScheme *pScheme )
|
||
|
{
|
||
|
BaseClass::ApplySchemeSettings( pScheme );
|
||
|
|
||
|
// load control settings...
|
||
|
LoadControlSettings( "resource/UI/TankProgressBar.res" );
|
||
|
|
||
|
if ( m_pProgressBar )
|
||
|
{
|
||
|
m_pProgressBar->GetBounds( m_nBarOrgX, m_nBarOrgY, m_nBarOrgW, m_nBarOrgT );
|
||
|
}
|
||
|
|
||
|
if ( m_pProgressBarBG )
|
||
|
{
|
||
|
m_pProgressBarBG->GetBounds( m_nBgOrgX, m_nBgOrgY, m_nBgOrgW, m_nBgOrgT );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CMvMBossProgressBar::SetPercentage( float flPercentage )
|
||
|
{
|
||
|
m_flPercentage = flPercentage;
|
||
|
if ( m_flPercentage < 0.0f )
|
||
|
{
|
||
|
m_flPercentage = 0.0f;
|
||
|
}
|
||
|
else if ( m_flPercentage > 1.0f )
|
||
|
{
|
||
|
m_flPercentage = 1.0f;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CMvMBossProgressBar::SetImage( const char* pszImageName )
|
||
|
{
|
||
|
if ( m_pBossImage )
|
||
|
{
|
||
|
m_pBossImage->SetImage( pszImageName );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CMvMBossProgressBar::OnTick( void )
|
||
|
{
|
||
|
if ( !TFGameRules() || !TFGameRules()->IsMannVsMachineMode() )
|
||
|
return;
|
||
|
|
||
|
if ( m_flOldPercentage != m_flPercentage )
|
||
|
{
|
||
|
m_flOldPercentage = m_flPercentage;
|
||
|
|
||
|
if ( m_pProgressBar )
|
||
|
{
|
||
|
m_pProgressBar->SetBounds(m_nBarOrgX, m_nBarOrgY, (int)(m_nBarOrgW * m_flPercentage) + m_nWidthSpacer, m_nBarOrgT );
|
||
|
}
|
||
|
|
||
|
if ( m_pProgressBarBG )
|
||
|
{
|
||
|
m_pProgressBarBG->SetBounds( m_nBgOrgX, m_nBgOrgY, m_nBgOrgW + m_nWidthSpacer, m_nBgOrgT );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
DECLARE_BUILD_FACTORY( CMvMBossStatusPanel );
|
||
|
|
||
|
CMvMBossStatusPanel::CMvMBossStatusPanel( Panel *parent, const char *pName ): vgui::EditablePanel( parent, pName )
|
||
|
{
|
||
|
m_pBackground = new ScalableImagePanel( this, "Background" );
|
||
|
|
||
|
for ( int i = 0; i < MAX_TANK_PROGRESS_BARS; ++i )
|
||
|
{
|
||
|
m_ProgressBars.AddToTail();
|
||
|
m_ProgressBars[ i ] = new CMvMBossProgressBar( this, "TankProgressBar" );
|
||
|
m_ProgressBars[ i ]->SetVisible( false );
|
||
|
}
|
||
|
|
||
|
m_nBackGroundTall = 0;
|
||
|
m_bPanelDirty = false;
|
||
|
|
||
|
vgui::ivgui()->AddTickSignal( GetVPanel(), 100 );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CMvMBossStatusPanel::ApplySchemeSettings( IScheme *pScheme )
|
||
|
{
|
||
|
BaseClass::ApplySchemeSettings( pScheme );
|
||
|
|
||
|
// load control settings...
|
||
|
LoadControlSettings( "resource/UI/TankStatusPanel.res" );
|
||
|
|
||
|
if ( m_pBackground )
|
||
|
{
|
||
|
m_pBackground->GetBounds( m_nBackgroundOriginalX, m_nBackgroundOriginalY, m_nBackgroundOriginalW, m_nBackgroundOriginalT );
|
||
|
}
|
||
|
|
||
|
m_bPanelDirty = true;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CMvMBossStatusPanel::OnTick( void )
|
||
|
{
|
||
|
if ( !TFGameRules() || !TFGameRules()->IsMannVsMachineMode() )
|
||
|
return;
|
||
|
|
||
|
CUtlVector< C_TFMvMBossProgressUser* > activeBosses;
|
||
|
for ( int i = 0; i < ITFMvMBossProgressUserAutoList::AutoList().Count(); ++i )
|
||
|
{
|
||
|
C_TFMvMBossProgressUser *pBossProgressUser = static_cast< C_TFMvMBossProgressUser* >( ITFMvMBossProgressUserAutoList::AutoList()[i] );
|
||
|
if ( pBossProgressUser->GetBossProgressImageName() != NULL )
|
||
|
{
|
||
|
C_BaseEntity *pEnt = dynamic_cast< C_BaseEntity* >( pBossProgressUser );
|
||
|
if ( pEnt && !pEnt->IsDormant() )
|
||
|
{
|
||
|
activeBosses.AddToTail( pBossProgressUser );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// setup the background
|
||
|
bool bBackgroundVisible = activeBosses.Count() > 0;
|
||
|
if ( m_pBackground && ( m_pBackground->IsVisible() != bBackgroundVisible ) )
|
||
|
{
|
||
|
m_pBackground->SetVisible( bBackgroundVisible );
|
||
|
}
|
||
|
|
||
|
int nBackgroundTall = 0;
|
||
|
int nHeightPerPanel = m_ProgressBars[0]->GetTall();
|
||
|
int nTotalPanelHeight = ( activeBosses.Count() * nHeightPerPanel );// + ( ( nNumBosses - 1 ) * m_nSpaceBetweenPanels );
|
||
|
if ( m_pBackground && bBackgroundVisible )
|
||
|
{
|
||
|
nBackgroundTall = nTotalPanelHeight + ( m_nSpaceBetweenPanels * 2 );
|
||
|
if ( ( m_nBackGroundTall != nBackgroundTall ) || m_bPanelDirty )
|
||
|
{
|
||
|
m_bPanelDirty = false;
|
||
|
m_nBackGroundTall = nBackgroundTall;
|
||
|
m_pBackground->SetBounds( m_nBackgroundOriginalX, m_nBackgroundOriginalY, m_nBackgroundOriginalW, m_nBackGroundTall );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// setup the tank progress bars
|
||
|
int iPanelIndex = 0;
|
||
|
int nYPos = 0;
|
||
|
if ( nBackgroundTall > 0 )
|
||
|
{
|
||
|
nYPos = ( nBackgroundTall * 0.5 ) - ( nTotalPanelHeight * 0.5 );
|
||
|
}
|
||
|
|
||
|
for ( int i = 0 ; i < activeBosses.Count() && iPanelIndex < MAX_TANK_PROGRESS_BARS ; i++, iPanelIndex++ )
|
||
|
{
|
||
|
m_ProgressBars[ iPanelIndex ]->SetVisible( true );
|
||
|
m_ProgressBars[ iPanelIndex ]->SetPercentage( activeBosses[i]->GetBossStatusProgress() );
|
||
|
char szImg[128];
|
||
|
V_snprintf( szImg, sizeof( szImg ), "../HUD/leaderboard_class_%s", activeBosses[i]->GetBossProgressImageName() );
|
||
|
m_ProgressBars[ iPanelIndex ]->SetImage( szImg );
|
||
|
m_ProgressBars[ iPanelIndex ]->SetPos( m_nXOffset, nYPos );
|
||
|
|
||
|
nYPos += nHeightPerPanel;// + m_nSpaceBetweenPanels;
|
||
|
}
|
||
|
|
||
|
// turn off any unused panels
|
||
|
while ( iPanelIndex < MAX_TANK_PROGRESS_BARS )
|
||
|
{
|
||
|
m_ProgressBars[ iPanelIndex ]->SetVisible( false );
|
||
|
iPanelIndex++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
DECLARE_BUILD_FACTORY( CWaveStatusPanel );
|
||
|
|
||
|
CWaveStatusPanel::CWaveStatusPanel( Panel *parent, const char *pName ): vgui::EditablePanel( parent, pName )
|
||
|
{
|
||
|
m_pSeparatorBar = new vgui::Panel( this, "SeparatorBar" );
|
||
|
m_pSupportLabel = new CExLabel( this, "SupportLabel", L"" );
|
||
|
m_pProgressBar = new ScalableImagePanel( this, "ProgressBar" );
|
||
|
m_pProgressBarBG = new ScalableImagePanel( this, "ProgressBarBG" );
|
||
|
m_pBackground = new ScalableImagePanel( this, "Background" );
|
||
|
|
||
|
for ( int i = 0; i < MVM_CLASS_TYPES_PER_WAVE_MAX_NEW; ++i )
|
||
|
{
|
||
|
m_EnemyCountPanels.AddToTail();
|
||
|
m_EnemyCountPanels[ i ] = new CEnemyCountPanel( this, "EnemyCountPanel" );
|
||
|
m_EnemyCountPanels[ i ]->SetVisible( false );
|
||
|
}
|
||
|
|
||
|
m_nBarOrgX = m_nBarOrgY = m_nBarOrgW = m_nBarOrgT = 0;
|
||
|
m_nBgOrgX = m_nBgOrgY = m_nBgOrgW = m_nBgOrgT = 0;
|
||
|
|
||
|
m_nWaveCount = -1;
|
||
|
m_nMaxWaveCount = -1;
|
||
|
m_nEnemyRemainingNoSupport = 0;
|
||
|
m_bPanelDirty = false;
|
||
|
|
||
|
vgui::ivgui()->AddTickSignal( GetVPanel(), 100 );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CWaveStatusPanel::ApplySchemeSettings( IScheme *pScheme )
|
||
|
{
|
||
|
BaseClass::ApplySchemeSettings( pScheme );
|
||
|
|
||
|
KeyValues *pConditions = NULL;
|
||
|
|
||
|
if ( m_bVerbose )
|
||
|
{
|
||
|
pConditions = new KeyValues( "conditions" );
|
||
|
AddSubKeyNamed( pConditions, "if_verbose" );
|
||
|
}
|
||
|
|
||
|
LoadControlSettings( "resource/UI/WaveStatusPanel.res", NULL, NULL, pConditions );
|
||
|
|
||
|
if ( pConditions )
|
||
|
{
|
||
|
pConditions->deleteThis();
|
||
|
}
|
||
|
|
||
|
m_bPanelDirty = true;
|
||
|
|
||
|
if ( m_pProgressBar )
|
||
|
{
|
||
|
m_pProgressBar->GetBounds( m_nBarOrgX, m_nBarOrgY, m_nBarOrgW, m_nBarOrgT );
|
||
|
}
|
||
|
|
||
|
if ( m_pProgressBarBG )
|
||
|
{
|
||
|
m_pProgressBarBG->GetBounds( m_nBgOrgX, m_nBgOrgY, m_nBgOrgW, m_nBgOrgT );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CWaveStatusPanel::OnTick( void )
|
||
|
{
|
||
|
if ( !TFGameRules() || !TFGameRules()->IsMannVsMachineMode() )
|
||
|
return;
|
||
|
|
||
|
if ( !TFObjectiveResource() )
|
||
|
return;
|
||
|
|
||
|
if ( m_nWaveCount != TFObjectiveResource()->GetMannVsMachineWaveCount() ||
|
||
|
m_nMaxWaveCount != TFObjectiveResource()->GetMannVsMachineMaxWaveCount() || m_bPanelDirty )
|
||
|
{
|
||
|
m_nWaveCount = TFObjectiveResource()->GetMannVsMachineWaveCount();
|
||
|
m_nMaxWaveCount = TFObjectiveResource()->GetMannVsMachineMaxWaveCount();
|
||
|
|
||
|
char szbuf[32];
|
||
|
if ( TFObjectiveResource()->GetMvMEventPopfileType() == MVM_EVENT_POPFILE_HALLOWEEN )
|
||
|
{
|
||
|
V_strcpy_safe( szbuf, "666" );
|
||
|
}
|
||
|
else if ( m_nMaxWaveCount == 0 )
|
||
|
{
|
||
|
V_snprintf( szbuf, sizeof(szbuf), "%d", m_nWaveCount );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
V_snprintf( szbuf, sizeof(szbuf), "%d / %d", m_nWaveCount, m_nMaxWaveCount );
|
||
|
}
|
||
|
|
||
|
wchar_t wszFinal[256];
|
||
|
wchar_t wszCount[32];
|
||
|
|
||
|
g_pVGuiLocalize->ConvertANSIToUnicode( szbuf, wszCount, sizeof(wszCount) );
|
||
|
g_pVGuiLocalize->ConstructString_safe( wszFinal, g_pVGuiLocalize->Find( "#TF_PVE_WaveCount" ), 1, wszCount );
|
||
|
SetDialogVariable( "wave_count", wszFinal );
|
||
|
|
||
|
m_bPanelDirty = false;
|
||
|
}
|
||
|
|
||
|
UpdateEnemyCounts();
|
||
|
|
||
|
C_BasePlayer *pLocalPlayer = CBasePlayer::GetLocalPlayer();
|
||
|
if ( pLocalPlayer )
|
||
|
{
|
||
|
bool bVisible = m_bVerbose || pLocalPlayer->IsAlive() || ( pLocalPlayer->GetTeamNumber() == TEAM_SPECTATOR ) || ( !m_bVerbose && !pLocalPlayer->IsAlive() );
|
||
|
|
||
|
// turn off if game is over
|
||
|
bVisible &= TFGameRules()->State_Get() != GR_STATE_GAME_OVER;
|
||
|
if ( IsVisible() != bVisible )
|
||
|
{
|
||
|
SetVisible( bVisible );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CWaveStatusPanel::AddClassIconBeingUsed( CUtlVector< const char* > &vector, const char *pchIcon ) const
|
||
|
{
|
||
|
if ( pchIcon && pchIcon[0] && !IsClassIconBeingUsed( vector, pchIcon ) )
|
||
|
{
|
||
|
vector.AddToHead( pchIcon );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool CWaveStatusPanel::IsClassIconBeingUsed( CUtlVector< const char* > &vector, const char *pchIcon ) const
|
||
|
{
|
||
|
if ( pchIcon && pchIcon[0] )
|
||
|
{
|
||
|
for ( int i = 0 ; i < vector.Count() ; i++ )
|
||
|
{
|
||
|
if ( FStrEq( vector[i], pchIcon ) )
|
||
|
{
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CWaveStatusPanel::UpdateEnemyCounts( void )
|
||
|
{
|
||
|
if ( !TFGameRules() || !TFObjectiveResource() )
|
||
|
return;
|
||
|
|
||
|
bool bBetweenWaves = TFGameRules()->InSetup() || TFObjectiveResource()->GetMannVsMachineIsBetweenWaves();
|
||
|
if ( bBetweenWaves )
|
||
|
{
|
||
|
m_nEnemyRemainingNoSupport = 0;
|
||
|
}
|
||
|
|
||
|
int nMaxEnemyCountNoSupport = TFObjectiveResource()->GetMannVsMachineWaveEnemyCount();
|
||
|
|
||
|
// Loop through all the class types to find which enemy counts to display
|
||
|
CUtlVector< hud_enemy_data_t > miniboss;
|
||
|
CUtlVector< hud_enemy_data_t > normal;
|
||
|
CUtlVector< hud_enemy_data_t > support;
|
||
|
CUtlVector< hud_enemy_data_t > mission;
|
||
|
int nNumEnemyRemaining = 0;
|
||
|
int nNumEnemyTypes = 0;
|
||
|
int nNumNonVerboseTypes = 0;
|
||
|
|
||
|
for ( int i = 0; i < MVM_CLASS_TYPES_PER_WAVE_MAX_NEW; ++i )
|
||
|
{
|
||
|
int nClassCount = TFObjectiveResource()->GetMannVsMachineWaveClassCount( i );
|
||
|
const char *pchClassIconName = TFObjectiveResource()->GetMannVsMachineWaveClassName( i );
|
||
|
unsigned int iFlags = TFObjectiveResource()->GetMannVsMachineWaveClassFlags( i );
|
||
|
|
||
|
if ( pchClassIconName[ 0 ] != '\0' )
|
||
|
{
|
||
|
if ( iFlags & MVM_CLASS_FLAG_SUPPORT )
|
||
|
{
|
||
|
int index = support.AddToTail();
|
||
|
support[index].nCount = nClassCount;
|
||
|
support[index].pchClassIconName = pchClassIconName;
|
||
|
support[index].iFlags = iFlags;
|
||
|
support[index].bActive = TFObjectiveResource()->GetMannVsMachineWaveClassActive( i );
|
||
|
nNumEnemyTypes++;
|
||
|
|
||
|
// Show support spies
|
||
|
if ( ( iFlags & MVM_CLASS_FLAG_SUPPORT_LIMITED ) && support[index].bActive )
|
||
|
{
|
||
|
nNumNonVerboseTypes++;
|
||
|
}
|
||
|
}
|
||
|
else if ( iFlags & MVM_CLASS_FLAG_MISSION )
|
||
|
{
|
||
|
if ( ( ( TFGameRules()->State_Get() != GR_STATE_RND_RUNNING ) && !( FStrEq( "sentry_buster", pchClassIconName ) || FStrEq( "teleporter", pchClassIconName ) ) ) || ( nClassCount > 0 ) )
|
||
|
{
|
||
|
int index = mission.AddToTail();
|
||
|
mission[index].nCount = nClassCount;
|
||
|
mission[index].pchClassIconName = pchClassIconName;
|
||
|
mission[index].iFlags = iFlags;
|
||
|
mission[index].bActive = TFObjectiveResource()->GetMannVsMachineWaveClassActive( i );
|
||
|
nNumEnemyTypes++;
|
||
|
nNumNonVerboseTypes++;
|
||
|
}
|
||
|
}
|
||
|
else if ( iFlags & MVM_CLASS_FLAG_MINIBOSS )
|
||
|
{
|
||
|
if ( nClassCount > 0 )
|
||
|
{
|
||
|
int index = miniboss.AddToTail();
|
||
|
miniboss[index].nCount = nClassCount;
|
||
|
miniboss[index].pchClassIconName = pchClassIconName;
|
||
|
miniboss[index].iFlags = iFlags;
|
||
|
miniboss[index].bActive = TFObjectiveResource()->GetMannVsMachineWaveClassActive( i );
|
||
|
nNumEnemyTypes++;
|
||
|
nNumEnemyRemaining += nClassCount;
|
||
|
}
|
||
|
}
|
||
|
else if ( iFlags & MVM_CLASS_FLAG_NORMAL )
|
||
|
{
|
||
|
// only show classes with > 0 remaining
|
||
|
if ( nClassCount > 0 )
|
||
|
{
|
||
|
int index = normal.AddToTail();
|
||
|
normal[index].nCount = nClassCount;
|
||
|
normal[index].pchClassIconName = pchClassIconName;
|
||
|
normal[index].iFlags = iFlags;
|
||
|
normal[index].bActive = TFObjectiveResource()->GetMannVsMachineWaveClassActive( i );
|
||
|
nNumEnemyTypes++;
|
||
|
nNumEnemyRemaining += nClassCount;
|
||
|
|
||
|
if ( FStrEq( "spy", pchClassIconName ) )
|
||
|
{
|
||
|
nNumNonVerboseTypes++;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// update the progress bar
|
||
|
if ( nMaxEnemyCountNoSupport > 0 )
|
||
|
{
|
||
|
if ( m_nEnemyRemainingNoSupport != nNumEnemyRemaining )
|
||
|
{
|
||
|
m_nEnemyRemainingNoSupport = nNumEnemyRemaining;
|
||
|
|
||
|
if ( m_pProgressBar )
|
||
|
{
|
||
|
float flPercent = (float)m_nEnemyRemainingNoSupport / (float)nMaxEnemyCountNoSupport;
|
||
|
m_pProgressBar->SetBounds( m_nBarOrgX, m_nBarOrgY, (int)(m_nBarOrgW * flPercent) + m_nWidthSpacer, m_nBarOrgT );
|
||
|
}
|
||
|
|
||
|
if ( m_pProgressBarBG )
|
||
|
{
|
||
|
m_pProgressBarBG->SetBounds( m_nBgOrgX, m_nBgOrgY, m_nBgOrgW + m_nWidthSpacer, m_nBgOrgT );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int nXPos = 0;
|
||
|
int nBgX = 0, nBgY = 0, nBgWide = 0, nBgTall = 0;
|
||
|
int nEnemyCountWide = m_EnemyCountPanels[0]->GetWide();
|
||
|
|
||
|
CTFPlayer *pLocalPlayer = ToTFPlayer( C_TFPlayer::GetLocalPlayer() );
|
||
|
bool bVerbose = ( m_bVerbose ||
|
||
|
( TFGameRules()->State_Get() != GR_STATE_RND_RUNNING ) ||
|
||
|
( pLocalPlayer && ( pLocalPlayer->GetTeamNumber() == TEAM_SPECTATOR ) ) ||
|
||
|
cl_mvm_wave_status_visible_during_wave.GetBool() );
|
||
|
if ( !bVerbose )
|
||
|
{
|
||
|
nNumEnemyTypes = nNumNonVerboseTypes;
|
||
|
}
|
||
|
|
||
|
int nSupportLabelRightSide = 0;
|
||
|
int nBackGroundRightSide = 0;
|
||
|
int nUpdatedBgWidth = 0;
|
||
|
int nMinModeReduction = ( cl_hud_minmode.GetBool() ? -YRES(12) : 0 );
|
||
|
|
||
|
if ( m_pBackground )
|
||
|
{
|
||
|
int nNumEnemyWidth = nNumEnemyTypes * nEnemyCountWide;
|
||
|
int nSpacerWidth = ( nNumEnemyTypes - 1 ) * m_nWaveCountOffset;
|
||
|
|
||
|
int nSeparatorBarWidth = 0;
|
||
|
if ( support.Count() > 0 || mission.Count() > 0 )
|
||
|
{
|
||
|
nSeparatorBarWidth = m_pSeparatorBar ? m_pSeparatorBar->GetWide() + m_nWaveCountOffset : 0;
|
||
|
}
|
||
|
int nTotalEnemyWidth = nNumEnemyWidth + nSpacerWidth + nSeparatorBarWidth;
|
||
|
|
||
|
m_pBackground->GetBounds( nBgX, nBgY, nBgWide, nBgTall );
|
||
|
|
||
|
nUpdatedBgWidth = m_nWaveCountBGMinWidth;
|
||
|
int nNeededBgWidth = nTotalEnemyWidth + ( m_nWaveCountOffset * 3 ); // add little buffer to both ends of the background
|
||
|
if ( nNeededBgWidth > m_nWaveCountBGMinWidth )
|
||
|
{
|
||
|
nUpdatedBgWidth = nNeededBgWidth;
|
||
|
}
|
||
|
|
||
|
nBgX = ( GetWide() * 0.5 ) - ( nUpdatedBgWidth * 0.5 );
|
||
|
|
||
|
nBgTall = m_nNormalHeight + nMinModeReduction;
|
||
|
|
||
|
if ( nNumEnemyTypes > 0 )
|
||
|
{
|
||
|
if ( !bVerbose )
|
||
|
{
|
||
|
nBgTall = m_nVerboseHeightNoNumbers + nMinModeReduction;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
nBgTall = m_nVerboseHeight + nMinModeReduction;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
SetTall( nBgTall + YRES( 2 ) );
|
||
|
|
||
|
m_pBackground->SetBounds( nBgX, nBgY, nUpdatedBgWidth, nBgTall );
|
||
|
nXPos = nBgX + ( nUpdatedBgWidth * 0.5 ) - ( nTotalEnemyWidth * 0.5 );
|
||
|
|
||
|
nBackGroundRightSide = nBgX + nUpdatedBgWidth;
|
||
|
}
|
||
|
|
||
|
int iPanelIndex = 0;
|
||
|
|
||
|
if ( bVerbose )
|
||
|
{
|
||
|
// miniboss enemies
|
||
|
for ( int i = 0 ; i < miniboss.Count() && iPanelIndex < m_EnemyCountPanels.Count() ; i++, iPanelIndex++ )
|
||
|
{
|
||
|
CEnemyCountPanel *pPanel = m_EnemyCountPanels[ iPanelIndex ];
|
||
|
|
||
|
pPanel->SetVisible( true );
|
||
|
pPanel->SetDialogVariable( "enemy_count", miniboss[i].nCount );
|
||
|
pPanel->SetPos( nXPos, m_nWaveCountYPos + nMinModeReduction );
|
||
|
pPanel->SetFlashing( false );
|
||
|
|
||
|
if ( pPanel->m_pEnemyCountImage )
|
||
|
{
|
||
|
pPanel->m_pEnemyCountImage->SetImage( VarArgs( "../hud/leaderboard_class_%s", miniboss[i].pchClassIconName ) );
|
||
|
pPanel->m_pEnemyCountImage->SetVisible( true );
|
||
|
}
|
||
|
|
||
|
if ( pPanel->m_pEnemyCountImageBG )
|
||
|
{
|
||
|
pPanel->m_pEnemyCountImageBG->SetBgColor( m_clrMiniBoss );
|
||
|
}
|
||
|
if ( pPanel->m_pEnemyCountCritBG )
|
||
|
{
|
||
|
pPanel->m_pEnemyCountCritBG->SetVisible( miniboss[i].iFlags & MVM_CLASS_FLAG_ALWAYSCRIT );
|
||
|
}
|
||
|
|
||
|
nXPos += nEnemyCountWide + m_nWaveCountOffset;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// normal enemies
|
||
|
for ( int i = 0 ; i < normal.Count() && iPanelIndex < m_EnemyCountPanels.Count() ; i++ )
|
||
|
{
|
||
|
bool bNonVerboseSpy = !bVerbose && FStrEq( "spy", normal[i].pchClassIconName );
|
||
|
if ( bVerbose || bNonVerboseSpy )
|
||
|
{
|
||
|
CEnemyCountPanel *pPanel = m_EnemyCountPanels[ iPanelIndex ];
|
||
|
|
||
|
pPanel->SetVisible( true );
|
||
|
if ( bNonVerboseSpy )
|
||
|
{
|
||
|
pPanel->SetDialogVariable( "enemy_count", "" );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pPanel->SetDialogVariable( "enemy_count", normal[i].nCount );
|
||
|
}
|
||
|
pPanel->SetPos( nXPos, m_nWaveCountYPos + nMinModeReduction );
|
||
|
|
||
|
if ( pPanel->m_pEnemyCountImage )
|
||
|
{
|
||
|
pPanel->m_pEnemyCountImage->SetImage( VarArgs( "../hud/leaderboard_class_%s", normal[i].pchClassIconName ) );
|
||
|
pPanel->m_pEnemyCountImage->SetVisible( true );
|
||
|
}
|
||
|
|
||
|
bool bResetBG = true;
|
||
|
|
||
|
if ( bNonVerboseSpy )
|
||
|
{
|
||
|
if ( pPanel->IsFlashing() )
|
||
|
{
|
||
|
// we're already flashing so don't reset the background
|
||
|
bResetBG = false;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// start flashing
|
||
|
pPanel->SetFlashing( true );
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pPanel->SetFlashing( false );
|
||
|
}
|
||
|
|
||
|
if ( bResetBG )
|
||
|
{
|
||
|
if ( pPanel->m_pEnemyCountImageBG )
|
||
|
{
|
||
|
pPanel->m_pEnemyCountImageBG->SetBgColor( m_clrNormal );
|
||
|
}
|
||
|
if ( pPanel->m_pEnemyCountCritBG )
|
||
|
{
|
||
|
pPanel->m_pEnemyCountCritBG->SetVisible( normal[i].iFlags & MVM_CLASS_FLAG_ALWAYSCRIT );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
nXPos += nEnemyCountWide + m_nWaveCountOffset;
|
||
|
iPanelIndex++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// bar and label
|
||
|
if ( bVerbose && ( support.Count() > 0 || mission.Count() > 0 ) )
|
||
|
{
|
||
|
if ( m_pSeparatorBar && m_pSupportLabel )
|
||
|
{
|
||
|
if ( !m_pSeparatorBar->IsVisible() )
|
||
|
{
|
||
|
m_pSeparatorBar->SetVisible( true );
|
||
|
}
|
||
|
|
||
|
m_pSeparatorBar->SetPos( nXPos, m_nWaveCountYPos + nMinModeReduction );
|
||
|
nXPos += m_pSeparatorBar->GetWide() + m_nWaveCountOffset;
|
||
|
|
||
|
if ( !m_pSupportLabel->IsVisible() )
|
||
|
{
|
||
|
m_pSupportLabel->SetVisible( true );
|
||
|
}
|
||
|
|
||
|
m_pSupportLabel->SizeToContents();
|
||
|
m_pSupportLabel->SetPos( nXPos, m_nWaveCountYPos + nMinModeReduction + m_nSupportLabelYOffset );
|
||
|
nSupportLabelRightSide = nXPos + m_pSupportLabel->GetWide();
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if ( m_pSeparatorBar )
|
||
|
{
|
||
|
if ( m_pSeparatorBar->IsVisible() )
|
||
|
{
|
||
|
m_pSeparatorBar->SetVisible( false );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( m_pSupportLabel )
|
||
|
{
|
||
|
if ( m_pSupportLabel->IsVisible() )
|
||
|
{
|
||
|
m_pSupportLabel->SetVisible( false );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CUtlVector< const char* > classIconsBeingUsed; // used temporarily to track the icons we're showing
|
||
|
|
||
|
// support
|
||
|
for ( int i = 0 ; i < support.Count() && iPanelIndex < m_EnemyCountPanels.Count() ; i++ )
|
||
|
{
|
||
|
bool bActive = !bVerbose && support[i].bActive && ( support[i].iFlags & MVM_CLASS_FLAG_SUPPORT_LIMITED );
|
||
|
if ( bVerbose || bActive )
|
||
|
{
|
||
|
if ( !IsClassIconBeingUsed( classIconsBeingUsed, support[i].pchClassIconName ) )
|
||
|
{
|
||
|
CEnemyCountPanel *pPanel = m_EnemyCountPanels[ iPanelIndex ];
|
||
|
|
||
|
pPanel->SetVisible( true );
|
||
|
pPanel->SetDialogVariable( "enemy_count", "" );
|
||
|
pPanel->SetPos( nXPos, m_nWaveCountYPos + nMinModeReduction );
|
||
|
pPanel->SetFlashing( false );
|
||
|
|
||
|
if ( pPanel->m_pEnemyCountImage )
|
||
|
{
|
||
|
pPanel->m_pEnemyCountImage->SetImage( VarArgs( "../hud/leaderboard_class_%s", support[i].pchClassIconName ) );
|
||
|
pPanel->m_pEnemyCountImage->SetVisible( true );
|
||
|
}
|
||
|
|
||
|
AddClassIconBeingUsed( classIconsBeingUsed, support[i].pchClassIconName );
|
||
|
|
||
|
if ( pPanel->m_pEnemyCountImageBG )
|
||
|
{
|
||
|
pPanel->m_pEnemyCountImageBG->SetBgColor( m_clrNormal );
|
||
|
}
|
||
|
|
||
|
if ( pPanel->m_pEnemyCountCritBG )
|
||
|
{
|
||
|
pPanel->m_pEnemyCountCritBG->SetVisible( support[i].iFlags & MVM_CLASS_FLAG_ALWAYSCRIT );
|
||
|
}
|
||
|
|
||
|
nXPos += nEnemyCountWide + m_nWaveCountOffset;
|
||
|
iPanelIndex++;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// missions
|
||
|
for ( int i = 0 ; i < mission.Count() && iPanelIndex < m_EnemyCountPanels.Count() ; i++, iPanelIndex++ )
|
||
|
{
|
||
|
if ( !IsClassIconBeingUsed( classIconsBeingUsed, mission[i].pchClassIconName ) )
|
||
|
{
|
||
|
CEnemyCountPanel *pPanel = m_EnemyCountPanels[ iPanelIndex ];
|
||
|
|
||
|
pPanel->SetVisible( true );
|
||
|
pPanel->SetDialogVariable( "enemy_count", "" );
|
||
|
pPanel->SetPos( nXPos, m_nWaveCountYPos + nMinModeReduction );
|
||
|
|
||
|
if ( pPanel->m_pEnemyCountImage )
|
||
|
{
|
||
|
const char* pchMissionClassIconName = mission[i].pchClassIconName;
|
||
|
pPanel->m_pEnemyCountImage->SetImage( VarArgs( "../hud/leaderboard_class_%s", pchMissionClassIconName ) );
|
||
|
pPanel->m_pEnemyCountImage->SetVisible( true );
|
||
|
|
||
|
bool bResetBG = true;
|
||
|
|
||
|
if ( !bBetweenWaves && ( FStrEq( "spy", pchMissionClassIconName ) || FStrEq( "sentry_buster", pchMissionClassIconName ) || FStrEq( "engineer", pchMissionClassIconName ) ) )
|
||
|
{
|
||
|
if ( pPanel->IsFlashing() )
|
||
|
{
|
||
|
// we're already flashing so don't reset the background
|
||
|
bResetBG = false;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// start flashing
|
||
|
pPanel->SetFlashing( true );
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pPanel->SetFlashing( false );
|
||
|
}
|
||
|
|
||
|
if ( pPanel->m_pEnemyCountCritBG )
|
||
|
{
|
||
|
pPanel->m_pEnemyCountCritBG->SetVisible( mission[i].iFlags & MVM_CLASS_FLAG_ALWAYSCRIT );
|
||
|
}
|
||
|
|
||
|
if ( bResetBG )
|
||
|
{
|
||
|
if ( pPanel->m_pEnemyCountImageBG )
|
||
|
{
|
||
|
pPanel->m_pEnemyCountImageBG->SetBgColor( m_clrNormal );
|
||
|
}
|
||
|
if ( pPanel->m_pEnemyCountCritBG )
|
||
|
{
|
||
|
pPanel->m_pEnemyCountCritBG->SetVisible( false );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
AddClassIconBeingUsed( classIconsBeingUsed, mission[i].pchClassIconName );
|
||
|
|
||
|
nXPos += nEnemyCountWide + m_nWaveCountOffset;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// final check to make sure the background covers the support label
|
||
|
if ( nSupportLabelRightSide > nBackGroundRightSide )
|
||
|
{
|
||
|
if ( m_pBackground )
|
||
|
{
|
||
|
int nDelta = nSupportLabelRightSide - nBackGroundRightSide + ( m_nWaveCountOffset * 1.5 );
|
||
|
m_pBackground->SetBounds( nBgX - nDelta, nBgY, nUpdatedBgWidth + ( nDelta * 2 ), nBgTall );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// turn off any unused panels
|
||
|
while ( iPanelIndex < m_EnemyCountPanels.Count() )
|
||
|
{
|
||
|
CEnemyCountPanel *pPanel = m_EnemyCountPanels[ iPanelIndex ];
|
||
|
|
||
|
pPanel->SetVisible( false );
|
||
|
pPanel->SetFlashing( false );
|
||
|
iPanelIndex++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
DECLARE_BUILD_FACTORY( CCurrencyStatusPanel );
|
||
|
|
||
|
CCurrencyStatusPanel::CCurrencyStatusPanel( Panel *parent, const char *name ) : vgui::EditablePanel( parent, name )
|
||
|
{
|
||
|
m_nCurrency = 0;
|
||
|
m_nTargetCurrency = 0;
|
||
|
SetDialogVariable( "currency", "" );
|
||
|
|
||
|
vgui::ivgui()->AddTickSignal( GetVPanel(), 50 );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CCurrencyStatusPanel::OnTick( void )
|
||
|
{
|
||
|
BaseClass::OnTick();
|
||
|
|
||
|
if ( !TFGameRules() || !TFGameRules()->IsMannVsMachineMode() )
|
||
|
return;
|
||
|
|
||
|
C_TFPlayer *pLocalPlayer = C_TFPlayer::GetLocalTFPlayer();
|
||
|
if ( !pLocalPlayer ||
|
||
|
( pLocalPlayer->GetTeamNumber() != TF_TEAM_PVE_DEFENDERS ) ||
|
||
|
( pLocalPlayer->GetPlayerClass()->GetClassIndex() == TF_CLASS_UNDEFINED ) )
|
||
|
{
|
||
|
if ( IsVisible() )
|
||
|
{
|
||
|
SetVisible( false );
|
||
|
}
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if ( !IsVisible() )
|
||
|
{
|
||
|
SetVisible( true );
|
||
|
}
|
||
|
|
||
|
m_nTargetCurrency = pLocalPlayer->GetCurrency();
|
||
|
|
||
|
if ( UpdateHUD() )
|
||
|
{
|
||
|
pLocalPlayer->EmitSound( "Credits.Updated" );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CCurrencyStatusPanel::ApplySchemeSettings( IScheme *pScheme )
|
||
|
{
|
||
|
BaseClass::ApplySchemeSettings( pScheme );
|
||
|
LoadControlSettings( "resource/UI/HudCurrencyAccount.res" );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool CCurrencyStatusPanel::UpdateHUD( void )
|
||
|
{
|
||
|
if ( m_nTargetCurrency == m_nCurrency )
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
int delta = m_nTargetCurrency - m_nCurrency;
|
||
|
|
||
|
if ( delta > 0 )
|
||
|
{
|
||
|
if ( delta > 100 )
|
||
|
{
|
||
|
delta = 100;
|
||
|
}
|
||
|
else if ( delta > 10 )
|
||
|
{
|
||
|
delta = 10;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
delta = 1;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if ( delta < -100 )
|
||
|
{
|
||
|
delta = -100;
|
||
|
}
|
||
|
else if ( delta < -10 )
|
||
|
{
|
||
|
delta = -10;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
delta = -1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
m_nCurrency += delta;
|
||
|
|
||
|
char szTmp[16];
|
||
|
Q_snprintf( szTmp, ARRAYSIZE( szTmp ), "$%d", m_nCurrency );
|
||
|
SetDialogVariable( "currency", szTmp );
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
DECLARE_BUILD_FACTORY( CInWorldCurrencyStatus );
|
||
|
|
||
|
CInWorldCurrencyStatus::CInWorldCurrencyStatus( Panel *parent, const char *name ) : vgui::EditablePanel( parent, name )
|
||
|
{
|
||
|
vgui::ivgui()->AddTickSignal( GetVPanel(), 50 );
|
||
|
|
||
|
SetDialogVariable( "currency", "" );
|
||
|
|
||
|
m_pGood = NULL;
|
||
|
m_pBad = NULL;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CInWorldCurrencyStatus::ApplySchemeSettings( IScheme *pScheme )
|
||
|
{
|
||
|
BaseClass::ApplySchemeSettings( pScheme );
|
||
|
LoadControlSettings( "resource/UI/MvMInWorldCurrency.res" );
|
||
|
|
||
|
m_pGood = dynamic_cast<vgui::Label*>( FindChildByName( "CurrencyGood" ) );
|
||
|
m_pBad = dynamic_cast<vgui::Label*>( FindChildByName( "CurrencyBad" ) );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CInWorldCurrencyStatus::OnTick( void )
|
||
|
{
|
||
|
if ( !TFGameRules() || !TFGameRules()->IsMannVsMachineMode() )
|
||
|
return;
|
||
|
|
||
|
C_TFPlayer *pLocalPlayer = C_TFPlayer::GetLocalTFPlayer();
|
||
|
if ( !pLocalPlayer || pLocalPlayer->GetPlayerClass()->GetClassIndex() == TF_CLASS_UNDEFINED ||
|
||
|
pLocalPlayer->GetTeamNumber() == TEAM_SPECTATOR )
|
||
|
{
|
||
|
if ( IsVisible() )
|
||
|
{
|
||
|
SetVisible( false );
|
||
|
}
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if ( !IsVisible() )
|
||
|
{
|
||
|
SetVisible( true );
|
||
|
}
|
||
|
|
||
|
int nWorldMoney = TFObjectiveResource()->GetMvMInWorldMoney();
|
||
|
int iWaveIndex = TFObjectiveResource()->GetMannVsMachineWaveCount();
|
||
|
if ( TFObjectiveResource()->GetMannVsMachineIsBetweenWaves() && iWaveIndex > 1 )
|
||
|
{
|
||
|
iWaveIndex--;
|
||
|
}
|
||
|
|
||
|
if ( m_pGood && m_pBad )
|
||
|
{
|
||
|
C_MannVsMachineStats *pStats = MannVsMachineStats_GetInstance();
|
||
|
int nMissed = pStats ? (int)pStats->GetMissedCredits( iWaveIndex - 1 ) : 0;
|
||
|
if ( (pStats && nMissed > nWorldMoney) || ( TFObjectiveResource()->GetMannVsMachineIsBetweenWaves() && nWorldMoney == 0 ))
|
||
|
{
|
||
|
m_pBad->SetVisible( true );
|
||
|
m_pGood->SetVisible( false );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_pBad->SetVisible( false );
|
||
|
m_pGood->SetVisible( true );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
char szTmp[16];
|
||
|
Q_snprintf( szTmp, ARRAYSIZE( szTmp ), "$%d", nWorldMoney );
|
||
|
SetDialogVariable( "currency", szTmp );
|
||
|
}
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
DECLARE_BUILD_FACTORY( CWarningSwoop );
|
||
|
|
||
|
CWarningSwoop::CWarningSwoop( Panel *parent, const char *name ) : vgui::ImagePanel( parent, name )
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CWarningSwoop::PaintBackground( void )
|
||
|
{
|
||
|
float flElapsedTime = ( gpGlobals->curtime - m_flStartCapAnimStart );
|
||
|
|
||
|
if ( GetImage() )
|
||
|
{
|
||
|
surface()->DrawSetColor( 255, 255, 255, 255 );
|
||
|
int iYPos = RemapValClamped( flElapsedTime, 0, m_flSwoopTime, 0, GetTall() );
|
||
|
GetImage()->SetPos( 0, GetTall() - iYPos );
|
||
|
GetImage()->SetSize( GetWide(), GetTall() );
|
||
|
GetImage()->Paint();
|
||
|
}
|
||
|
|
||
|
if ( flElapsedTime >= m_flSwoopTime )
|
||
|
{
|
||
|
SetVisible( false );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool CWarningSwoop::IsVisible( void )
|
||
|
{
|
||
|
if ( IsInFreezeCam() == true )
|
||
|
return false;
|
||
|
|
||
|
return BaseClass::IsVisible();
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CWarningSwoop::StartSwoop( void )
|
||
|
{
|
||
|
SetVisible( true );
|
||
|
m_flStartCapAnimStart = gpGlobals->curtime;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
DECLARE_BUILD_FACTORY( CWaveCompleteSummaryPanel );
|
||
|
|
||
|
CWaveCompleteSummaryPanel::CWaveCompleteSummaryPanel( Panel *parent, const char *pName ): vgui::EditablePanel( parent, pName )
|
||
|
{
|
||
|
m_eState = FINISHED;
|
||
|
|
||
|
m_pWaveCompleteContainer = NULL;
|
||
|
m_pCreditContainerPanel = NULL;
|
||
|
m_pRatingContainerPanel = NULL;
|
||
|
|
||
|
m_pCreditBonusTextLabel = NULL;
|
||
|
m_pCreditBonusCountLabel = NULL;
|
||
|
|
||
|
m_pRespecBackground = NULL;
|
||
|
m_pRespecContainerPanel = NULL;
|
||
|
m_pRespecTextLabel = NULL;
|
||
|
m_pRespecCountLabel = NULL;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CWaveCompleteSummaryPanel::ApplySchemeSettings( IScheme *pScheme )
|
||
|
{
|
||
|
BaseClass::ApplySchemeSettings( pScheme );
|
||
|
LoadControlSettings( "resource/UI/WaveCompleteSummaryPanel.res" );
|
||
|
|
||
|
m_pWaveCompleteContainer = dynamic_cast<vgui::EditablePanel*>( FindChildByName("WaveCompleteContainer") );
|
||
|
m_pCreditContainerPanel = dynamic_cast<vgui::EditablePanel*>( FindChildByName("CreditContainer") );
|
||
|
m_pRatingContainerPanel = dynamic_cast<vgui::EditablePanel*>( FindChildByName("RatingContainer") );
|
||
|
|
||
|
if ( m_pCreditContainerPanel )
|
||
|
{
|
||
|
m_pCreditBonusTextLabel = dynamic_cast<vgui::Label*>( m_pCreditContainerPanel->FindChildByName("CreditBonusTextLabel") );
|
||
|
m_pCreditBonusCountLabel = dynamic_cast<vgui::Label*>( m_pCreditContainerPanel->FindChildByName("CreditBonusCountLabel") );
|
||
|
}
|
||
|
|
||
|
m_pRespecBackground = dynamic_cast<vgui::ScalableImagePanel*>( FindChildByName("RespecBackground") );
|
||
|
m_pRespecContainerPanel = dynamic_cast<vgui::EditablePanel*>( FindChildByName("RespecContainer") );
|
||
|
|
||
|
if ( m_pRespecContainerPanel )
|
||
|
{
|
||
|
m_pRespecTextLabel = dynamic_cast<vgui::Label*>( m_pRespecContainerPanel->FindChildByName("RespecTextLabelWin") );
|
||
|
m_pRespecCountLabel = dynamic_cast<vgui::Label*>( m_pRespecContainerPanel->FindChildByName("RespecCountLabel") );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CWaveCompleteSummaryPanel::ShowWaveSummary( int nWaveNumber )
|
||
|
{
|
||
|
// if in progress just add time (reset it)
|
||
|
if ( m_eState != FINISHED )
|
||
|
{
|
||
|
m_fStateRunningTime = 0;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
m_nWaveNumber = nWaveNumber;
|
||
|
|
||
|
if ( m_pWaveCompleteContainer )
|
||
|
{
|
||
|
// Set all the values to empty strings
|
||
|
if ( nWaveNumber == -1 )
|
||
|
{
|
||
|
m_pWaveCompleteContainer->SetDialogVariable( "titletext", g_pVGuiLocalize->Find( "#Winpanel_PVE_Evil_Wins" ) );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_pWaveCompleteContainer->SetDialogVariable( "titletext", g_pVGuiLocalize->Find( "#TF_PVE_WaveComplete" ) );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( m_pCreditContainerPanel )
|
||
|
{
|
||
|
m_pCreditContainerPanel->SetDialogVariable( CREDITS_COLLECTED_STR, "" );
|
||
|
m_pCreditContainerPanel->SetDialogVariable( CREDITS_MISSED_STR, "" );
|
||
|
m_pCreditContainerPanel->SetDialogVariable( CREDITS_BONUS_STR, "" );
|
||
|
}
|
||
|
|
||
|
if ( m_pRatingContainerPanel )
|
||
|
{
|
||
|
m_pRatingContainerPanel->SetDialogVariable( RATING_LABEL_STR, "" );
|
||
|
m_pRatingContainerPanel->SetDialogVariable( RATING_SCORE_STR, "" );
|
||
|
}
|
||
|
|
||
|
if ( m_pRespecContainerPanel )
|
||
|
{
|
||
|
m_pRespecContainerPanel->SetDialogVariable( RESPEC_COUNT_STR, "" );
|
||
|
}
|
||
|
|
||
|
m_eState = CREDITS_COLLECT;
|
||
|
m_fStateRunningTime = 0;
|
||
|
m_fPreviousTick = gpGlobals->curtime;
|
||
|
|
||
|
int nAcquired = MannVsMachineStats_GetAcquiredCredits( nWaveNumber, false );
|
||
|
int nDropped = MannVsMachineStats_GetDroppedCredits( nWaveNumber );
|
||
|
int nPickedUp = MIN( nAcquired, nDropped );
|
||
|
|
||
|
int nMissed = nDropped - nPickedUp;
|
||
|
int nBonus = Max( (int)MannVsMachineStats_GetAcquiredCredits( m_nWaveNumber, true ) - nAcquired, 0 );
|
||
|
|
||
|
m_nCreditsCollected = nPickedUp;
|
||
|
m_nCreditsMissed = nMissed;
|
||
|
m_nCreditBonus = nBonus;
|
||
|
|
||
|
if ( m_pCreditBonusTextLabel )
|
||
|
{
|
||
|
m_pCreditBonusTextLabel->SetVisible( false );
|
||
|
}
|
||
|
|
||
|
if ( m_pCreditBonusCountLabel )
|
||
|
{
|
||
|
m_pCreditBonusCountLabel->SetVisible( false );
|
||
|
}
|
||
|
|
||
|
if ( m_pRespecBackground && m_pRespecTextLabel && m_pRespecCountLabel )
|
||
|
{
|
||
|
m_pRespecBackground->SetVisible( false );
|
||
|
m_pRespecTextLabel->SetVisible( false );
|
||
|
m_pRespecCountLabel->SetVisible( false );
|
||
|
}
|
||
|
|
||
|
SetVisible( true );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CWaveCompleteSummaryPanel::OnTick( void )
|
||
|
{
|
||
|
if ( TFGameRules()->State_Get() != GR_STATE_BETWEEN_RNDS && TFGameRules()->State_Get() != GR_STATE_GAME_OVER && TFGameRules()->State_Get() != GR_STATE_TEAM_WIN )
|
||
|
{
|
||
|
SetVisible( false );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if ( TFObjectiveResource() && TFObjectiveResource()->GetMannVsMachineWaveCount() == 0 )
|
||
|
{
|
||
|
SetVisible( false );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if ( m_eState == FINISHED )
|
||
|
return;
|
||
|
|
||
|
m_fStateRunningTime += gpGlobals->curtime - m_fPreviousTick;
|
||
|
m_fPreviousTick = gpGlobals->curtime;
|
||
|
|
||
|
CheckCredits();
|
||
|
|
||
|
// Run through animation loop
|
||
|
switch ( m_eState )
|
||
|
{
|
||
|
case CREDITS_COLLECT:
|
||
|
StateUpdateValue ( m_pCreditContainerPanel, CREDITS_COLLECTED_STR, CREDITS_COLLECTED_TIME, m_fStateRunningTime, CREDITS_MISSED, m_nCreditsCollected );
|
||
|
break;
|
||
|
case CREDITS_MISSED:
|
||
|
StateUpdateValue ( m_pCreditContainerPanel, CREDITS_MISSED_STR, CREDITS_MISSED_TIME, m_fStateRunningTime, RATING_LABEL, m_nCreditsMissed );
|
||
|
break;
|
||
|
case RATING_LABEL:
|
||
|
RatingLabelUpdate();
|
||
|
CheckState( RATING_LABEL_TIME, m_fStateRunningTime, RATING_SCORE );
|
||
|
break;
|
||
|
case RATING_SCORE:
|
||
|
RatingScoreUpdate();
|
||
|
CheckState( RATING_SCORE_TIME, m_fStateRunningTime, WAIT );
|
||
|
break;
|
||
|
case WAIT:
|
||
|
if ( CheckState( WAIT_TIME, m_fStateRunningTime, FINISHED ) )
|
||
|
{
|
||
|
SetVisible( false );
|
||
|
}
|
||
|
break;
|
||
|
case FINISHED:
|
||
|
SetVisible( false );
|
||
|
break;
|
||
|
default:
|
||
|
SetVisible( false );
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: updates the target field based on the input args. Returns TRUE if transitioning to new state
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool CWaveCompleteSummaryPanel::StateUpdateValue( vgui::EditablePanel *parent, char* field, float targetTime, float currentTime, int nextState, int endValue )
|
||
|
{
|
||
|
float fPercent = currentTime / targetTime;
|
||
|
fPercent = 1.0 < fPercent ? 1.0f : fPercent;
|
||
|
|
||
|
if ( parent )
|
||
|
{
|
||
|
parent->SetDialogVariable( field, (int)(endValue * fPercent) );
|
||
|
}
|
||
|
|
||
|
// transition to next state
|
||
|
return CheckState( targetTime, currentTime, nextState );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CWaveCompleteSummaryPanel::RatingLabelUpdate( void )
|
||
|
{
|
||
|
if ( m_pRatingContainerPanel )
|
||
|
{
|
||
|
m_pRatingContainerPanel->SetDialogVariable( RATING_LABEL_STR, g_pVGuiLocalize->Find( "#TF_PVE_CreditRating" ) );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CWaveCompleteSummaryPanel::RatingScoreUpdate( )
|
||
|
{
|
||
|
//calc a score
|
||
|
const char* pletterScore = "F";
|
||
|
|
||
|
int nAcquired = MannVsMachineStats_GetAcquiredCredits( m_nWaveNumber, false );
|
||
|
int nDropped = MannVsMachineStats_GetDroppedCredits( m_nWaveNumber );
|
||
|
|
||
|
float fPercent = (float)nAcquired / (float)nDropped;
|
||
|
|
||
|
if ( fPercent >= 1.0 )
|
||
|
{
|
||
|
pletterScore = "A+";
|
||
|
}
|
||
|
else if ( fPercent >= 0.9 )
|
||
|
{
|
||
|
pletterScore = "A";
|
||
|
}
|
||
|
else if ( fPercent >= 0.8 )
|
||
|
{
|
||
|
pletterScore = "B";
|
||
|
}
|
||
|
else if ( fPercent >= 0.7 )
|
||
|
{
|
||
|
pletterScore = "C";
|
||
|
}
|
||
|
else if ( fPercent >= 0.6 )
|
||
|
{
|
||
|
pletterScore = "D";
|
||
|
}
|
||
|
|
||
|
if ( m_pRatingContainerPanel )
|
||
|
{
|
||
|
m_pRatingContainerPanel->SetDialogVariable( RATING_SCORE_STR, pletterScore );
|
||
|
}
|
||
|
}
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool CWaveCompleteSummaryPanel::CheckState( float targetTime, float currentTime, int nextState )
|
||
|
{
|
||
|
if ( currentTime >= targetTime )
|
||
|
{
|
||
|
m_fStateRunningTime = 0;
|
||
|
m_eState = nextState;
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Check CreditCounts incase they have changed after Summary first showed on screen.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CWaveCompleteSummaryPanel::CheckCredits()
|
||
|
{
|
||
|
int nAcquired = MannVsMachineStats_GetAcquiredCredits( m_nWaveNumber, false );
|
||
|
int nDropped = MannVsMachineStats_GetDroppedCredits( m_nWaveNumber );
|
||
|
int nPickedUp = Min( nAcquired, nDropped );
|
||
|
int nMissed = nDropped - nPickedUp;
|
||
|
int nBonus = Max( (int)MannVsMachineStats_GetAcquiredCredits( m_nWaveNumber, true ) - nAcquired, 0 );
|
||
|
|
||
|
if ( m_eState > CREDITS_COLLECT )
|
||
|
{
|
||
|
if ( m_nCreditsCollected != nPickedUp )
|
||
|
{
|
||
|
if ( m_pCreditContainerPanel )
|
||
|
{
|
||
|
m_pCreditContainerPanel->SetDialogVariable( CREDITS_COLLECTED_STR, nPickedUp );
|
||
|
}
|
||
|
m_nCreditsCollected = nPickedUp;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( m_eState > CREDITS_MISSED )
|
||
|
{
|
||
|
if ( m_nCreditsMissed != nMissed)
|
||
|
{
|
||
|
if ( m_pCreditContainerPanel )
|
||
|
{
|
||
|
m_pCreditContainerPanel->SetDialogVariable( CREDITS_MISSED_STR, nMissed );
|
||
|
}
|
||
|
m_nCreditsMissed = nMissed;
|
||
|
}
|
||
|
|
||
|
if ( m_nCreditBonus != nBonus )
|
||
|
{
|
||
|
if ( m_pCreditContainerPanel )
|
||
|
{
|
||
|
m_pCreditContainerPanel->SetDialogVariable( CREDITS_BONUS_STR, nBonus );
|
||
|
}
|
||
|
m_nCreditBonus = nBonus;
|
||
|
}
|
||
|
|
||
|
if ( m_nCreditBonus > 0 )
|
||
|
{
|
||
|
if ( m_pCreditBonusCountLabel )
|
||
|
{
|
||
|
m_pCreditBonusCountLabel->SetVisible( true );
|
||
|
}
|
||
|
|
||
|
if ( m_pCreditBonusTextLabel )
|
||
|
{
|
||
|
m_pCreditBonusTextLabel->SetVisible( true );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Respec
|
||
|
if ( TFGameRules()->IsMannVsMachineRespecEnabled() )
|
||
|
{
|
||
|
CMannVsMachineStats *pStats = MannVsMachineStats_GetInstance();
|
||
|
if ( pStats )
|
||
|
{
|
||
|
uint16 nRespecs = pStats->GetNumRespecsEarnedInWave();
|
||
|
bool bVisible = nRespecs > 0;
|
||
|
if ( bVisible )
|
||
|
{
|
||
|
if ( m_pRespecContainerPanel )
|
||
|
{
|
||
|
m_pRespecContainerPanel->SetDialogVariable( RESPEC_COUNT_STR, nRespecs );
|
||
|
}
|
||
|
|
||
|
if ( m_pRespecBackground && m_pRespecCountLabel && m_pRespecTextLabel )
|
||
|
{
|
||
|
if ( !m_pRespecBackground->IsVisible() && !m_pRespecCountLabel->IsVisible() && !m_pRespecTextLabel->IsVisible() )
|
||
|
{
|
||
|
C_TFPlayer *pLocalTFPlayer = C_TFPlayer::GetLocalTFPlayer();
|
||
|
if ( pLocalTFPlayer )
|
||
|
{
|
||
|
pLocalTFPlayer->EmitSound( "MVM.RespecAwarded" );
|
||
|
}
|
||
|
g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( "RespecEarnedPulse" );
|
||
|
}
|
||
|
|
||
|
if ( m_pRespecBackground->IsVisible() != bVisible )
|
||
|
{
|
||
|
m_pRespecBackground->SetVisible( bVisible );
|
||
|
}
|
||
|
if ( m_pRespecCountLabel->IsVisible() != bVisible )
|
||
|
{
|
||
|
m_pRespecCountLabel->SetVisible( bVisible );
|
||
|
}
|
||
|
if ( m_pRespecTextLabel->IsVisible() != bVisible )
|
||
|
{
|
||
|
m_pRespecTextLabel->SetVisible( bVisible );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( m_eState > RATING_SCORE )
|
||
|
{
|
||
|
RatingLabelUpdate();
|
||
|
RatingScoreUpdate();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
DECLARE_BUILD_FACTORY( CVictorySplash );
|
||
|
|
||
|
CVictorySplash::CVictorySplash( Panel *parent, const char *pName ): vgui::EditablePanel( parent, pName )
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CVictorySplash::ApplySchemeSettings( IScheme *pScheme )
|
||
|
{
|
||
|
BaseClass::ApplySchemeSettings( pScheme );
|
||
|
LoadControlSettings( "resource/UI/MvMVictorySplash.res" );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CVictorySplash::OnTick( void )
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// CMvMBombCarrierProgress
|
||
|
//-----------------------------------------------------------------------------
|
||
|
DECLARE_BUILD_FACTORY( CMvMBombCarrierProgress );
|
||
|
|
||
|
CMvMBombCarrierProgress::CMvMBombCarrierProgress( Panel *parent, const char *pName ): vgui::EditablePanel( parent, pName )
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CMvMBombCarrierProgress::ApplySchemeSettings( IScheme *pScheme )
|
||
|
{
|
||
|
BaseClass::ApplySchemeSettings( pScheme );
|
||
|
LoadControlSettings( "resource/UI/MvMBombCarrierProgressPanel.res" );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// CTFHudMannVsMachineStatus
|
||
|
//-----------------------------------------------------------------------------
|
||
|
DECLARE_HUDELEMENT( CTFHudMannVsMachineStatus );
|
||
|
|
||
|
CTFHudMannVsMachineStatus::CTFHudMannVsMachineStatus( const char *pElementName ) :
|
||
|
CHudElement( pElementName ), BaseClass( NULL, "HudMannVsMachineStatus" )
|
||
|
{
|
||
|
Panel *pParent = g_pClientMode->GetViewport();
|
||
|
SetParent( pParent );
|
||
|
|
||
|
SetHiddenBits( HIDEHUD_MISCSTATUS );
|
||
|
|
||
|
m_pWarningSwoop = new CWarningSwoop( this, "WarningSwoop" );
|
||
|
m_pWaveStatusPanel = new CWaveStatusPanel( this, "WaveStatusPanel" );
|
||
|
m_pWaveCompletePanel = new CWaveCompleteSummaryPanel( this, "WaveCompleteSummaryPanel" );
|
||
|
|
||
|
m_pVictorySplash = new CVictorySplash( this, "VictorySplash" );
|
||
|
m_pVictoryContainer = new CMvMVictoryPanelContainer( this, "VictoryPanelContainer" );
|
||
|
|
||
|
m_pWaveLossPanel = new CMvMWaveLossPanel ( this, "WaveLossPanel" );
|
||
|
|
||
|
m_nFlagCarrierUpgradeLevel = -1;
|
||
|
m_pUpgradeLevelContainer = new vgui::EditablePanel( this, "UpgradeLevelContainer" );
|
||
|
m_pUpgradeLevel1 = new vgui::ImagePanel( m_pUpgradeLevelContainer, "UpgradeLevel1" );
|
||
|
m_pUpgradeLevel2 = new vgui::ImagePanel( m_pUpgradeLevelContainer, "UpgradeLevel2" );
|
||
|
m_pUpgradeLevel3 = new vgui::ImagePanel( m_pUpgradeLevelContainer, "UpgradeLevel3" );
|
||
|
m_pUpgradeLevelBoss = new vgui::ImagePanel( m_pUpgradeLevelContainer, "UpgradeLevelBoss" );
|
||
|
|
||
|
m_nNextWaveTime = 0;
|
||
|
m_nSpyMissionCount = 0;
|
||
|
|
||
|
m_bSpecPanelVisible = false;
|
||
|
|
||
|
m_bInVictorySplash = false;
|
||
|
|
||
|
m_bAdjustWaveStatusPanel = false;
|
||
|
|
||
|
ListenForGameEvent( "mvm_mission_update" );
|
||
|
ListenForGameEvent( "localplayer_changeteam" );
|
||
|
ListenForGameEvent( "mvm_begin_wave" );
|
||
|
|
||
|
vgui::ivgui()->AddTickSignal( GetVPanel(), 100 );
|
||
|
|
||
|
HOOK_MESSAGE( MVMWaveFailed );
|
||
|
HOOK_MESSAGE( MVMAnnouncement );
|
||
|
HOOK_MESSAGE( MVMVictory );
|
||
|
HOOK_MESSAGE( MVMServerKickTimeUpdate );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CTFHudMannVsMachineStatus::ApplySchemeSettings( IScheme *pScheme )
|
||
|
{
|
||
|
BaseClass::ApplySchemeSettings( pScheme );
|
||
|
|
||
|
// load control settings...
|
||
|
LoadControlSettings( "resource/UI/HudMannVsMachineStatus.res" );
|
||
|
|
||
|
m_bSpecPanelVisible = false;
|
||
|
|
||
|
m_pWaveCompletePanel->SetVisible( false );
|
||
|
|
||
|
CMvMBombCarrierProgress *parent = dynamic_cast<CMvMBombCarrierProgress*>( m_pUpgradeLevelContainer->FindChildByName( "UpgradeProgressTrack" ) );
|
||
|
if ( parent )
|
||
|
{
|
||
|
parent->ApplySchemeSettings( pScheme );
|
||
|
m_pBombUpgradeMeterMask = dynamic_cast<vgui::EditablePanel*>( parent->FindChildByName( "FillContainer" ) );
|
||
|
m_nUpgradeMaskBaseWidth = scheme()->GetProportionalScaledValueEx( GetScheme(), 20 );
|
||
|
m_nUpgradeMaskMaxWidth = scheme()->GetProportionalScaledValueEx( GetScheme(), 60 );
|
||
|
}
|
||
|
|
||
|
m_pServerChangeMessage = dynamic_cast<vgui::EditablePanel*>( FindChildByName( "ServerChangeMessage" ) );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CTFHudMannVsMachineStatus::FireGameEvent( IGameEvent * event )
|
||
|
{
|
||
|
if ( !ShouldDraw() )
|
||
|
return;
|
||
|
|
||
|
C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer();
|
||
|
|
||
|
const char *type = event->GetName();
|
||
|
|
||
|
if ( Q_strcmp( type, "mvm_mission_update" ) == 0 )
|
||
|
{
|
||
|
int nClass = event->GetInt( "class", 0 );
|
||
|
if ( nClass == TF_CLASS_SPY )
|
||
|
{
|
||
|
int nCount = event->GetInt( "count", 0 );
|
||
|
|
||
|
if ( nCount > 0 )
|
||
|
{
|
||
|
if ( m_nSpyMissionCount == 0 )
|
||
|
{
|
||
|
if ( pPlayer )
|
||
|
{
|
||
|
pPlayer->EmitSound( "Announcer.MVM_Spy_Alert" );
|
||
|
}
|
||
|
|
||
|
if ( m_pWarningSwoop )
|
||
|
{
|
||
|
m_pWarningSwoop->StartSwoop();
|
||
|
}
|
||
|
}
|
||
|
// else if ( m_nSpyMissionCount > nCount )
|
||
|
// {
|
||
|
// if ( pPlayer )
|
||
|
// {
|
||
|
// switch ( nCount )
|
||
|
// {
|
||
|
// case 6:
|
||
|
// pPlayer->EmitSound( "Announcer.mvm_spybot_death_six" );
|
||
|
// break;
|
||
|
// case 5:
|
||
|
// pPlayer->EmitSound( "Announcer.mvm_spybot_death_five" );
|
||
|
// break;
|
||
|
// case 4:
|
||
|
// pPlayer->EmitSound( "Announcer.mvm_spybot_death_four" );
|
||
|
// break;
|
||
|
// case 3:
|
||
|
// pPlayer->EmitSound( "Announcer.mvm_spybot_death_three" );
|
||
|
// break;
|
||
|
// case 2:
|
||
|
// pPlayer->EmitSound( "Announcer.mvm_spybot_death_two" );
|
||
|
// break;
|
||
|
// case 1:
|
||
|
// pPlayer->EmitSound( "Announcer.mvm_spybot_death_one" );
|
||
|
// break;
|
||
|
// }
|
||
|
// }
|
||
|
// }
|
||
|
|
||
|
m_nSpyMissionCount = nCount;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if ( m_nSpyMissionCount != 0 )
|
||
|
{
|
||
|
m_nSpyMissionCount = 0;
|
||
|
|
||
|
if ( pPlayer )
|
||
|
{
|
||
|
pPlayer->EmitSound( "Announcer.mvm_spybot_death_all" );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if ( Q_strcmp( type, "localplayer_changeteam" ) == 0 )
|
||
|
{
|
||
|
m_bAdjustWaveStatusPanel = true;
|
||
|
}
|
||
|
else if ( Q_strcmp( type, "mvm_begin_wave" ) == 0 )
|
||
|
{
|
||
|
m_nSpyMissionCount = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool CTFHudMannVsMachineStatus::ShouldDraw( void )
|
||
|
{
|
||
|
// Don't draw in freezecam
|
||
|
C_TFPlayer *pPlayer = CTFPlayer::GetLocalTFPlayer();
|
||
|
if ( !pPlayer || pPlayer->GetObserverMode() == OBS_MODE_FREEZECAM || !TFGameRules()->IsMannVsMachineMode() )
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return CHudElement::ShouldDraw();
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CTFHudMannVsMachineStatus::OnTick( void )
|
||
|
{
|
||
|
if ( !TFGameRules() || !TFGameRules()->IsMannVsMachineMode() )
|
||
|
return;
|
||
|
|
||
|
if ( m_pVictoryContainer->IsVisible() )
|
||
|
{
|
||
|
m_pVictoryContainer->OnTick();
|
||
|
}
|
||
|
|
||
|
if ( !IsVisible() || !TFObjectiveResource() )
|
||
|
return;
|
||
|
|
||
|
m_pWaveCompletePanel->OnTick();
|
||
|
|
||
|
m_pWaveLossPanel->OnTick();
|
||
|
|
||
|
if ( g_pSpectatorGUI && m_pWaveStatusPanel )
|
||
|
{
|
||
|
if ( ( m_bSpecPanelVisible != g_pSpectatorGUI->IsVisible() ) || m_bAdjustWaveStatusPanel )
|
||
|
{
|
||
|
int xPos, yPos;
|
||
|
m_pWaveStatusPanel->GetPos( xPos, yPos );
|
||
|
|
||
|
m_bSpecPanelVisible = g_pSpectatorGUI->IsVisible();
|
||
|
|
||
|
if ( m_bSpecPanelVisible )
|
||
|
{
|
||
|
m_pWaveStatusPanel->SetPos( xPos, g_pSpectatorGUI->GetTopBarHeight() );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_pWaveStatusPanel->SetPos( xPos, 0 );
|
||
|
}
|
||
|
|
||
|
m_bAdjustWaveStatusPanel = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int nTime = 0;
|
||
|
|
||
|
if ( TFObjectiveResource()->GetMannVsMachineNextWaveTime() > 0.0f )
|
||
|
{
|
||
|
nTime = TFObjectiveResource()->GetMannVsMachineNextWaveTime() - gpGlobals->curtime;
|
||
|
}
|
||
|
|
||
|
if ( TFGameRules()->InSetup() && ObjectiveResource() && !TFGameRules()->IsInTournamentMode() )
|
||
|
{
|
||
|
CTeamRoundTimer *pTimer = dynamic_cast< CTeamRoundTimer* >( ClientEntityList().GetEnt( ObjectiveResource()->GetTimerToShowInHUD() ) );
|
||
|
if ( pTimer )
|
||
|
{
|
||
|
nTime = pTimer->GetTimeRemaining();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( nTime < 0 )
|
||
|
{
|
||
|
nTime = 0;
|
||
|
}
|
||
|
|
||
|
if ( TFGameRules()->State_Get() > GR_STATE_PREGAME )
|
||
|
{
|
||
|
if ( m_nNextWaveTime != nTime )
|
||
|
{
|
||
|
m_nNextWaveTime = nTime;
|
||
|
|
||
|
// announcer countdown
|
||
|
C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer();
|
||
|
if ( pPlayer )
|
||
|
{
|
||
|
switch( nTime )
|
||
|
{
|
||
|
case 10:
|
||
|
if ( TFObjectiveResource()->GetMannVsMachineWaveCount() + 1 >= TFObjectiveResource()->GetMannVsMachineMaxWaveCount() )
|
||
|
{
|
||
|
pPlayer->EmitSound( "Announcer.MVM_Final_Wave_Start" );
|
||
|
}
|
||
|
else if ( TFObjectiveResource()->GetMannVsMachineWaveCount() == 0 )
|
||
|
{
|
||
|
pPlayer->EmitSound( "Announcer.MVM_First_Wave_Start" );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pPlayer->EmitSound( "Announcer.MVM_Wave_Start" );
|
||
|
}
|
||
|
break;
|
||
|
case 5: pPlayer->EmitSound( "Announcer.RoundBegins5Seconds" ); break;
|
||
|
case 4: pPlayer->EmitSound( "Announcer.RoundBegins4Seconds" ); break;
|
||
|
case 3: pPlayer->EmitSound( "Announcer.RoundBegins3Seconds" ); break;
|
||
|
case 2: pPlayer->EmitSound( "Announcer.RoundBegins2Seconds" ); break;
|
||
|
case 1: pPlayer->EmitSound( "Announcer.RoundBegins1Seconds" ); break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Bomb Carrier Indictators
|
||
|
UpdateBombCarrierProgress();
|
||
|
|
||
|
if ( m_bInVictorySplash && gpGlobals->curtime > m_flVictoryTimer )
|
||
|
{
|
||
|
m_bInVictorySplash = false;
|
||
|
m_pVictorySplash->SetVisible( false );
|
||
|
m_pVictoryContainer->ShowVictoryPanel( false );
|
||
|
}
|
||
|
|
||
|
m_pVictorySplash->SetVisible( m_bInVictorySplash && TFGameRules()->State_Get() == GR_STATE_GAME_OVER );
|
||
|
|
||
|
// Check to see if we need to display server message
|
||
|
if ( TFGameRules()->State_Get() == GR_STATE_GAME_OVER && !m_bInVictorySplash)
|
||
|
{
|
||
|
//calculate seconds
|
||
|
m_pServerChangeMessage->SetVisible( true );
|
||
|
int seconds = MAX(0, (int)(m_flServerEndTime - gpGlobals->curtime) );
|
||
|
wchar_t wszTime[16];
|
||
|
_snwprintf( wszTime, ARRAYSIZE( wszTime ), L"%d", seconds );
|
||
|
wchar_t wszLocalizedMessage[512];
|
||
|
|
||
|
if ( !m_bIsServerKicking )
|
||
|
{
|
||
|
if ( seconds > 1 )
|
||
|
{
|
||
|
g_pVGuiLocalize->ConstructString_safe( wszLocalizedMessage, g_pVGuiLocalize->Find( "#TF_PVE_Server_Message_Reset" ), 1, wszTime );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
g_pVGuiLocalize->ConstructString_safe( wszLocalizedMessage, g_pVGuiLocalize->Find( "#TF_PVE_Server_Message_ResetNoS" ), 1, wszTime );
|
||
|
}
|
||
|
m_pServerChangeMessage->SetDialogVariable( "servermessage", wszLocalizedMessage);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if ( seconds > 1 )
|
||
|
{
|
||
|
g_pVGuiLocalize->ConstructString_safe( wszLocalizedMessage, g_pVGuiLocalize->Find( "#TF_PVE_Server_Message_Kick" ), 1, wszTime );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
g_pVGuiLocalize->ConstructString_safe( wszLocalizedMessage, g_pVGuiLocalize->Find( "#TF_PVE_Server_Message_KickNoS" ), 1, wszTime );
|
||
|
}
|
||
|
m_pServerChangeMessage->SetDialogVariable( "servermessage", wszLocalizedMessage);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_pServerChangeMessage->SetVisible( false );
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CTFHudMannVsMachineStatus::WaveFailed( void )
|
||
|
{
|
||
|
if ( TFObjectiveResource() && TFObjectiveResource()->GetMannVsMachineWaveCount() > 1 )
|
||
|
{
|
||
|
m_pWaveLossPanel->ShowPanel();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CTFHudMannVsMachineStatus::ShowWaveSummary( int nWaveNumber)
|
||
|
{
|
||
|
m_pWaveCompletePanel->ShowWaveSummary( nWaveNumber );
|
||
|
}
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CTFHudMannVsMachineStatus::MVMVictory( bool bIsKicking, int nTime )
|
||
|
{
|
||
|
m_bInVictorySplash = true;
|
||
|
m_flVictoryTimer = gpGlobals->curtime + VICTORY_SPLASH_TIME;
|
||
|
m_pVictorySplash->SetVisible( true );
|
||
|
|
||
|
m_bIsServerKicking = bIsKicking;
|
||
|
m_flServerEndTime = gpGlobals->curtime + (float)nTime;
|
||
|
}
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CTFHudMannVsMachineStatus::MVMServerKickTimeUpdate( int nTime )
|
||
|
{
|
||
|
m_flServerEndTime = gpGlobals->curtime + (float)nTime;
|
||
|
}
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CTFHudMannVsMachineStatus::MVMVictoryGCResponse( CMsgMvMVictoryInfo &pData )
|
||
|
{
|
||
|
m_pVictoryContainer->MannUpServerResponse( pData );
|
||
|
}
|
||
|
|
||
|
void CTFHudMannVsMachineStatus::ForceVictoryRefresh()
|
||
|
{
|
||
|
InvalidateLayout( false, true );
|
||
|
}
|
||
|
|
||
|
void CTFHudMannVsMachineStatus::ReopenVictoryPanel( void )
|
||
|
{
|
||
|
m_pVictoryContainer->ShowVictoryPanel( true );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Private
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CTFHudMannVsMachineStatus::UpdateBombCarrierProgress ( void )
|
||
|
{
|
||
|
m_pUpgradeLevelContainer->SetVisible( TFGameRules()->State_Get() == GR_STATE_RND_RUNNING );
|
||
|
|
||
|
if ( !m_pUpgradeLevel1 || !m_pUpgradeLevel2 || !m_pUpgradeLevel3 || !m_pUpgradeLevelBoss )
|
||
|
return;
|
||
|
|
||
|
// Width of Meter
|
||
|
float flBase = TFObjectiveResource()->GetNextMvMBombUpgradeTime() - TFObjectiveResource()->GetBaseMvMBombUpgradeTime();
|
||
|
float flCurr = TFObjectiveResource()->GetNextMvMBombUpgradeTime() - gpGlobals->curtime;
|
||
|
|
||
|
float flPercent = 0;
|
||
|
int nFlagLevel = TFObjectiveResource()->GetFlagCarrierUpgradeLevel();
|
||
|
if ( flBase <= 0 || nFlagLevel >= 3 )
|
||
|
{
|
||
|
flPercent = nFlagLevel >= 3 ? 1.0 : 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
flPercent = MIN( 1.0f, 1.0f - (flCurr / flBase) );
|
||
|
}
|
||
|
m_pBombUpgradeMeterMask->SetWide( ( m_nUpgradeMaskBaseWidth * ( nFlagLevel + 1 ) ) + flPercent * m_nUpgradeMaskBaseWidth );
|
||
|
|
||
|
// Updating Image
|
||
|
if ( m_nFlagCarrierUpgradeLevel == nFlagLevel )
|
||
|
return;
|
||
|
|
||
|
m_pUpgradeLevel1->SetImage( "../hud/hud_mvm_bomb_upgrade_1_disabled" );
|
||
|
m_pUpgradeLevel2->SetImage( "../hud/hud_mvm_bomb_upgrade_2_disabled" );
|
||
|
m_pUpgradeLevel3->SetImage( "../hud/hud_mvm_bomb_upgrade_3_disabled" );
|
||
|
|
||
|
m_nFlagCarrierUpgradeLevel = nFlagLevel;
|
||
|
|
||
|
switch ( m_nFlagCarrierUpgradeLevel )
|
||
|
{
|
||
|
case 4:
|
||
|
m_pUpgradeLevelBoss->SetVisible( true );
|
||
|
m_pUpgradeLevel1->SetVisible( false );
|
||
|
m_pUpgradeLevel2->SetVisible( false );
|
||
|
m_pUpgradeLevel3->SetVisible( false );
|
||
|
break;
|
||
|
|
||
|
case 3:
|
||
|
m_pUpgradeLevel3->SetImage( "../hud/hud_mvm_bomb_upgrade_3" );
|
||
|
// Intentionally fall through
|
||
|
case 2:
|
||
|
m_pUpgradeLevel2->SetImage( "../hud/hud_mvm_bomb_upgrade_2" );
|
||
|
// Intentionally fall through
|
||
|
case 1:
|
||
|
m_pUpgradeLevel1->SetImage( "../hud/hud_mvm_bomb_upgrade_1" );
|
||
|
// Intentionally fall through
|
||
|
|
||
|
default:
|
||
|
m_pUpgradeLevelBoss->SetVisible( false );
|
||
|
m_pUpgradeLevel1->SetVisible( true );
|
||
|
m_pUpgradeLevel2->SetVisible( true );
|
||
|
m_pUpgradeLevel3->SetVisible( true );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CTFHudMannVsMachineStatus::UpdateServerMessage( void )
|
||
|
{
|
||
|
|
||
|
}
|