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.
352 lines
11 KiB
352 lines
11 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: Wave Loss Screen for MvM |
|
// |
|
// $NoKeywords: $ |
|
//============================================================================= |
|
#include "cbase.h" |
|
#include "tf_hud_mann_vs_machine_loss.h" |
|
|
|
using namespace vgui; |
|
|
|
#ifdef STAGING_ONLY |
|
ConVar tf_tips_show_captain_canteen( "tf_tips_show_captain_canteen", 0, FCVAR_NONE, "Show Captain Canteen when displaying tips" ); |
|
#endif |
|
|
|
|
|
const char *g_pszInactiveClassPortraits[] = |
|
{ |
|
"", // TF_CLASS_UNDEFINED = 0, |
|
"class_sel_sm_scout_inactive", |
|
"class_sel_sm_soldier_inactive", |
|
"class_sel_sm_pyro_inactive", |
|
"class_sel_sm_demo_inactive", |
|
"class_sel_sm_heavy_inactive", |
|
"class_sel_sm_engineer_inactive", |
|
"class_sel_sm_medic_inactive", |
|
"class_sel_sm_sniper_inactive", |
|
"class_sel_sm_spy_inactive", |
|
"class_sel_sm_random_inactive", // Random |
|
}; |
|
|
|
//----------------------------------------------------------------------------- |
|
// CMvMVictoryPanelContainer |
|
//----------------------------------------------------------------------------- |
|
DECLARE_BUILD_FACTORY( CMvMWaveLossPanel ); |
|
|
|
CMvMWaveLossPanel::CMvMWaveLossPanel( Panel *parent, const char *pName ) : vgui::EditablePanel( parent, pName ) |
|
{ |
|
SetMouseInputEnabled( true ); |
|
|
|
MakePopup(); |
|
MoveToFront(); |
|
|
|
m_pVoteButton = new CExImageButton( this, "VoteButton", g_pVGuiLocalize->Find( "#TF_PVE_Vote_MissionRestart" ), this ); |
|
m_pCloseButton = new CExImageButton( this, "ContinueButton", g_pVGuiLocalize->Find( "#ConfirmButtonText" ), this ); |
|
|
|
m_pHintContainer = NULL; |
|
m_pCollectionContainer = NULL; |
|
m_pUsageContainer = NULL; |
|
m_pCaptainCanteenBody = NULL; |
|
m_pCaptainCanteenMisc = NULL; |
|
m_pCaptainCanteenHat = NULL; |
|
m_pHintImage1 = NULL; |
|
m_pHintImage2 = NULL; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
void CMvMWaveLossPanel::ApplySchemeSettings( vgui::IScheme *pScheme ) |
|
{ |
|
BaseClass::ApplySchemeSettings( pScheme ); |
|
|
|
// load control settings... |
|
LoadControlSettings( "resource/UI/MvMWaveLossPanel.res" ); |
|
|
|
m_pHintContainer = dynamic_cast<vgui::EditablePanel*>( FindChildByName( "HintContainer" ) ); |
|
m_pCollectionContainer = dynamic_cast<vgui::EditablePanel*>( FindChildByName( "CollectionContainer" ) ); |
|
m_pUsageContainer = dynamic_cast<vgui::EditablePanel*>( FindChildByName( "UsageContainer" ) ); |
|
|
|
if ( m_pHintContainer ) |
|
{ |
|
m_pCaptainCanteenBody = dynamic_cast<vgui::ImagePanel*>( m_pHintContainer->FindChildByName( "CptCntnBody" ) ); |
|
m_pCaptainCanteenMisc = dynamic_cast<vgui::ImagePanel*>( m_pHintContainer->FindChildByName( "CptCntnMisc" ) ); |
|
m_pCaptainCanteenHat = dynamic_cast<vgui::ImagePanel*>( m_pHintContainer->FindChildByName( "CptCntnHat" ) ); |
|
|
|
m_pHintImage1 = dynamic_cast<vgui::ImagePanel*>( m_pHintContainer->FindChildByName( "HintImage1" ) ); |
|
m_pHintImage2 = dynamic_cast<vgui::ImagePanel*>( m_pHintContainer->FindChildByName( "HintImage2" ) ); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
void CMvMWaveLossPanel::FireGameEvent( IGameEvent * event ) |
|
{ |
|
|
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
void CMvMWaveLossPanel::OnTick( void ) |
|
{ |
|
if ( !IsVisible() ) |
|
return; |
|
|
|
if ( TFObjectiveResource() && !TFObjectiveResource()->GetMannVsMachineIsBetweenWaves() ) |
|
{ |
|
// Close it if the mission starts |
|
SetMouseInputEnabled( false ); |
|
SetVisible( false ); |
|
} |
|
|
|
// Display Credit Usage Stats |
|
CMannVsMachineStats *pMVMStats = MannVsMachineStats_GetInstance(); |
|
if ( pMVMStats != NULL ) |
|
{ |
|
if ( m_pCollectionContainer ) |
|
{ |
|
m_pCollectionContainer->SetDialogVariable( "creditscollected", (int)pMVMStats->GetAcquiredCredits( -1, false ) ); |
|
m_pCollectionContainer->SetDialogVariable( "creditsmissed", (int)pMVMStats->GetMissedCredits( -1 ) ); |
|
m_pCollectionContainer->SetDialogVariable( "creditbonus", (int)pMVMStats->GetBonusCredits( -1 ) ); |
|
} |
|
|
|
if ( m_pUsageContainer ) |
|
{ |
|
// Local Player |
|
m_pUsageContainer->SetDialogVariable( "buybacksyou", (int)pMVMStats->GetLocalPlayerBuyBackSpending( -1 ) ); |
|
m_pUsageContainer->SetDialogVariable( "bottlesyou", (int)pMVMStats->GetLocalPlayerBottleSpending( -1 ) ); |
|
|
|
int nTotalUpgradeCosts = (int)pMVMStats->GetLocalPlayerUpgradeSpending( -1 ); |
|
CSteamID steamID; |
|
int nActiveUpgradeCosts = 0; |
|
if ( C_TFPlayer::GetLocalTFPlayer()->GetSteamID( &steamID ) ) |
|
{ |
|
nActiveUpgradeCosts = (int)pMVMStats->GetPlayerActiveUpgradeCosts( steamID.ConvertToUint64() ); |
|
} |
|
|
|
m_pUsageContainer->SetDialogVariable( "inactiveupgradesyou", nTotalUpgradeCosts - nActiveUpgradeCosts ); |
|
|
|
// Team |
|
nTotalUpgradeCosts = (int)pMVMStats->GetUpgradeSpending(); |
|
nActiveUpgradeCosts = (int)pMVMStats->GetPlayerActiveUpgradeCosts( 0 ); |
|
|
|
m_pUsageContainer->SetDialogVariable( "buybacksteam", (int)pMVMStats->GetBuyBackSpending() ); |
|
m_pUsageContainer->SetDialogVariable( "bottlesteam", (int)pMVMStats->GetBottleSpending() ); |
|
m_pUsageContainer->SetDialogVariable( "inactiveupgradesteam", nTotalUpgradeCosts - nActiveUpgradeCosts ); |
|
} |
|
} |
|
|
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
void CMvMWaveLossPanel::OnCommand( const char *command ) |
|
{ |
|
if ( !Q_stricmp( command, "vote_restart" ) ) |
|
{ |
|
engine->ClientCmd( "callvote RestartGame;" ); |
|
SetMouseInputEnabled( false ); |
|
SetVisible( false ); |
|
} |
|
else if ( !Q_stricmp( command, "continue" ) ) |
|
{ |
|
SetMouseInputEnabled( false ); |
|
SetVisible( false ); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
void CMvMWaveLossPanel::ShowPanel() |
|
{ |
|
SetVisible( true ); |
|
SetKeyBoardInputEnabled( false ); |
|
SetMouseInputEnabled( true ); |
|
MoveToFront(); |
|
|
|
ClearContents(); |
|
|
|
if ( TFObjectiveResource() ) |
|
{ |
|
// Get the WaveNumber |
|
int iWaveNumber = TFObjectiveResource()->GetMannVsMachineWaveCount(); |
|
|
|
wchar_t wszWaveNumber[16]; |
|
_snwprintf( wszWaveNumber, ARRAYSIZE( wszWaveNumber ), L"%d", MAX( 1, iWaveNumber ) ); |
|
|
|
wchar_t wszLocalizedWave[512]; |
|
g_pVGuiLocalize->ConstructString_safe( wszLocalizedWave, g_pVGuiLocalize->Find( "#TF_PVE_WaveCountFail" ), 1, wszWaveNumber ); |
|
SetDialogVariable( "waveheader", wszLocalizedWave ); |
|
|
|
// Pop file |
|
char szTempName[MAX_PATH]; |
|
V_FileBase( TFObjectiveResource()->GetMvMPopFileName(), szTempName, sizeof( szTempName ) ); |
|
int iChallengeIndex = GetItemSchema()->FindMvmMissionByName( szTempName ); |
|
|
|
wchar_t wszLocalizedSummary[ MAX_PATH ]; |
|
if ( GetItemSchema()->GetMvmMissions().IsValidIndex( iChallengeIndex ) ) |
|
{ |
|
const MvMMission_t &mission = GetItemSchema()->GetMvmMissions()[ iChallengeIndex ]; |
|
g_pVGuiLocalize->ConstructString_safe( wszLocalizedSummary, g_pVGuiLocalize->Find( "#TF_PVE_MissionSummaryScheme" ), 2, |
|
g_pVGuiLocalize->Find( mission.m_sDisplayName.Get() ), g_pVGuiLocalize->Find( mission.m_sMode.Get() ) ); |
|
} |
|
else |
|
{ |
|
wchar_t wszName[256]; |
|
g_pVGuiLocalize->ConvertANSIToUnicode( GetMapDisplayName( szTempName ), wszName, sizeof(wszName) ); |
|
g_pVGuiLocalize->ConstructString_safe( wszLocalizedSummary, g_pVGuiLocalize->Find( "#TF_PVE_MissionSummaryDefault" ), 1, |
|
wszName ); |
|
} |
|
|
|
SetDialogVariable( "summaryheader", wszLocalizedSummary ); |
|
} |
|
|
|
|
|
// Tips |
|
if ( m_pHintContainer ) |
|
{ |
|
int iClassUsed; |
|
m_pHintContainer->SetDialogVariable( "hint1", g_TFTips.GetRandomMvMTip( iClassUsed ) ); |
|
|
|
#ifdef STAGING_ONLY |
|
bool bShowCaptainCanteen = tf_tips_show_captain_canteen.GetBool(); |
|
|
|
if ( tf_tips_show_captain_canteen.GetInt() > 1 ) |
|
{ |
|
// Force Captain Canteen on to test |
|
iClassUsed = TF_LAST_NORMAL_CLASS; |
|
} |
|
#else |
|
bool bShowCaptainCanteen = false; |
|
#endif |
|
|
|
if ( m_pHintImage1 ) |
|
{ |
|
SetHintImage( m_pHintImage1, iClassUsed, bShowCaptainCanteen ); |
|
} |
|
|
|
// Make sure we only use captain canteen once |
|
bool bUsedCaptainCanteen = ( iClassUsed == TF_LAST_NORMAL_CLASS ); |
|
|
|
m_pHintContainer->SetDialogVariable( "hint2", g_TFTips.GetRandomMvMTip( iClassUsed ) ); |
|
|
|
if ( m_pHintImage2 ) |
|
{ |
|
SetHintImage( m_pHintImage2, iClassUsed, bShowCaptainCanteen && !bUsedCaptainCanteen ); |
|
} |
|
|
|
if ( !bUsedCaptainCanteen && iClassUsed != TF_LAST_NORMAL_CLASS ) |
|
{ |
|
// We didn't use captain canteen, hide him |
|
if ( m_pCaptainCanteenBody ) |
|
{ |
|
m_pCaptainCanteenBody->SetVisible( false ); |
|
} |
|
if ( m_pCaptainCanteenMisc ) |
|
{ |
|
m_pCaptainCanteenMisc->SetVisible( false ); |
|
} |
|
if ( m_pCaptainCanteenHat ) |
|
{ |
|
m_pCaptainCanteenHat->SetVisible( false ); |
|
} |
|
} |
|
} |
|
|
|
/*waveheader |
|
summaryheader |
|
creditscollected |
|
creditsmissed |
|
creditbonus |
|
|
|
buybacks |
|
bottles |
|
activeupgrades |
|
inactiveupgrades |
|
|
|
hint1 |
|
hint2*/ |
|
} |
|
|
|
void CMvMWaveLossPanel::SetCaptainCanteenImage( vgui::ImagePanel *panel, const char *pchImage, int nNewX ) |
|
{ |
|
if ( !panel ) |
|
return; |
|
|
|
int nX, nY; |
|
panel->SetVisible( true ); |
|
panel->SetImage( pchImage ); |
|
panel->GetPos( nX, nY ); |
|
panel->SetPos( nNewX, nY ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
void CMvMWaveLossPanel::SetHintImage( vgui::ImagePanel *panel, int iClassUsed, bool bAllowCaptainCanteen ) |
|
{ |
|
if ( !panel ) |
|
return; |
|
|
|
if ( bAllowCaptainCanteen && iClassUsed == TF_LAST_NORMAL_CLASS ) |
|
{ |
|
// Hide the normal tip image |
|
panel->SetVisible( false ); |
|
|
|
// Get the asset images |
|
const char *pchCaptainCanteenBody; |
|
const char *pchCaptainCanteenMisc; |
|
const char *pchCaptainCanteenHat; |
|
g_TFTips.GetRandomCaptainCanteenImages( &pchCaptainCanteenBody, &pchCaptainCanteenMisc, &pchCaptainCanteenHat ); |
|
|
|
// Get the destination X position |
|
int nX, nY; |
|
panel->GetPos( nX, nY ); |
|
|
|
// Set up the canteen images |
|
if ( m_pCaptainCanteenBody ) |
|
{ |
|
SetCaptainCanteenImage( m_pCaptainCanteenBody, pchCaptainCanteenBody, nX ); |
|
} |
|
if ( m_pCaptainCanteenMisc ) |
|
{ |
|
SetCaptainCanteenImage( m_pCaptainCanteenMisc, pchCaptainCanteenMisc, nX ); |
|
} |
|
if ( m_pCaptainCanteenHat ) |
|
{ |
|
SetCaptainCanteenImage( m_pCaptainCanteenHat, pchCaptainCanteenHat, nX ); |
|
} |
|
} |
|
else |
|
{ |
|
panel->SetVisible( true ); |
|
panel->SetImage( g_pszInactiveClassPortraits[ iClassUsed ] ); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
void CMvMWaveLossPanel::ClearContents() |
|
{ |
|
SetDialogVariable( "waveheader", "" ); |
|
SetDialogVariable( "summaryheader", "" ); |
|
|
|
if ( m_pCollectionContainer ) |
|
{ |
|
m_pCollectionContainer->SetDialogVariable( "creditscollected", "" ); |
|
m_pCollectionContainer->SetDialogVariable( "creditsmissed", "" ); |
|
m_pCollectionContainer->SetDialogVariable( "creditbonus", "" ); |
|
} |
|
|
|
if ( m_pUsageContainer ) |
|
{ |
|
m_pUsageContainer->SetDialogVariable( "buybacksyou", "" ); |
|
m_pUsageContainer->SetDialogVariable( "bottlesyou", "" ); |
|
m_pUsageContainer->SetDialogVariable( "activeupgradesyou", "" ); |
|
m_pUsageContainer->SetDialogVariable( "inactiveupgradesyou", "" ); |
|
|
|
m_pUsageContainer->SetDialogVariable( "buybacksteam", "" ); |
|
m_pUsageContainer->SetDialogVariable( "bottlesteam", "" ); |
|
m_pUsageContainer->SetDialogVariable( "activeupgradesteam", "" ); |
|
m_pUsageContainer->SetDialogVariable( "inactiveupgradesteam", "" ); |
|
} |
|
|
|
// Tips |
|
if ( m_pHintContainer ) |
|
{ |
|
m_pHintContainer->SetDialogVariable( "hint1", "" ); |
|
m_pHintContainer->SetDialogVariable( "hint2", "" ); |
|
} |
|
} |