//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #ifndef TF_HUD_MANN_VS_MACHINE_STATUS_H #define TF_HUD_MANN_VS_MACHINE_STATUS_H #ifdef _WIN32 #pragma once #endif #include "hudelement.h" #include "tf_controls.h" #include "hud.h" #include #include #include #include #include #include "tf_hud_objectivestatus.h" #include "tf_hud_mann_vs_machine_victory.h" #include "tf_gcmessages.h" #include "tf_hud_mann_vs_machine_stats.h" #include "tf_hud_mann_vs_machine_loss.h" #include "tf_mann_vs_machine_stats.h" #define MAX_TANK_PROGRESS_BARS 5 //========================================================= typedef struct { int nCount; const char *pchClassIconName; int iFlags; bool bActive; } hud_enemy_data_t; class CEnemyCountPanel : public vgui::EditablePanel, public CGameEventListener { DECLARE_CLASS_SIMPLE( CEnemyCountPanel, vgui::EditablePanel ); public: CEnemyCountPanel( Panel *parent, const char *pName ); virtual void ApplySchemeSettings( vgui::IScheme *pScheme ); virtual void FireGameEvent( IGameEvent *event ); void SetFlashing( bool bState ); bool IsFlashing( void ){ return m_bFlashing; } CTFImagePanel *m_pEnemyCountImage; Panel *m_pEnemyCountImageBG; CTFImagePanel *m_pEnemyCountCritBG; private: bool m_bFlashing; }; //========================================================= class CMvMBossProgressBar : public vgui::EditablePanel { DECLARE_CLASS_SIMPLE( CMvMBossProgressBar, vgui::EditablePanel ); public: CMvMBossProgressBar( Panel *parent, const char *pName ); virtual void ApplySchemeSettings( vgui::IScheme *pScheme ); virtual void OnTick( void ); void SetPercentage( float flPercentage ); void SetImage( const char* pszImageName ); private: float m_flPercentage; float m_flOldPercentage; int m_nBarOrgX; int m_nBarOrgY; int m_nBarOrgW; int m_nBarOrgT; int m_nBgOrgX; int m_nBgOrgY; int m_nBgOrgW; int m_nBgOrgT; vgui::ScalableImagePanel *m_pProgressBar; vgui::ScalableImagePanel *m_pProgressBarBG; CTFImagePanel *m_pBossImage; // keeps the two rounded ends a certain distance apart from each other so the rounded line continues to look good even at low values CPanelAnimationVarAliasType( int, m_nWidthSpacer, "width_spacer", "2", "proportional_xpos" ); }; //========================================================= class CMvMBossStatusPanel : public vgui::EditablePanel { DECLARE_CLASS_SIMPLE( CMvMBossStatusPanel, vgui::EditablePanel ); public: CMvMBossStatusPanel( Panel *parent, const char *pName ); virtual void ApplySchemeSettings( vgui::IScheme *pScheme ); virtual void OnTick( void ); private: vgui::ScalableImagePanel *m_pBackground; CUtlVector< CMvMBossProgressBar* > m_ProgressBars; int m_nBackgroundOriginalX; int m_nBackgroundOriginalY; int m_nBackgroundOriginalW; int m_nBackgroundOriginalT; int m_nBackGroundTall; bool m_bPanelDirty; CPanelAnimationVarAliasType( int, m_nSpaceBetweenPanels, "yOffset", "5", "proportional_ypos" ); CPanelAnimationVarAliasType( int, m_nXOffset, "xOffset", "5", "proportional_xpos" ); }; //========================================================= class CCurrencyStatusPanel : public vgui::EditablePanel { DECLARE_CLASS_SIMPLE( CCurrencyStatusPanel, vgui::EditablePanel ); public: CCurrencyStatusPanel( Panel *parent, const char *name ); virtual void ApplySchemeSettings( vgui::IScheme *pScheme ); virtual void OnTick( void ); virtual bool UpdateHUD( void ); private: int m_nCurrency; int m_nTargetCurrency; }; //========================================================= class CInWorldCurrencyStatus : public vgui::EditablePanel { DECLARE_CLASS_SIMPLE( CInWorldCurrencyStatus, vgui::EditablePanel ); public: CInWorldCurrencyStatus( Panel *parent, const char *name ); virtual void ApplySchemeSettings( vgui::IScheme *pScheme ); virtual void OnTick( void ); private: vgui::Label *m_pGood; vgui::Label *m_pBad; }; //========================================================= class CWaveStatusPanel : public vgui::EditablePanel { DECLARE_CLASS_SIMPLE( CWaveStatusPanel, vgui::EditablePanel ); public: CWaveStatusPanel( Panel *parent, const char *pName ); virtual void ApplySchemeSettings( vgui::IScheme *pScheme ); virtual void OnTick( void ); private: void UpdateEnemyCounts( void ); void AddClassIconBeingUsed( CUtlVector< const char* > &vector, const char *pchIcon ) const; // used temporarily to track the icons we're showing bool IsClassIconBeingUsed( CUtlVector< const char* > &vector, const char *pchIcon ) const; // used temporarily to track the icons we're showing private: int m_nEnemyRemainingNoSupport; int m_nBarOrgX; int m_nBarOrgY; int m_nBarOrgW; int m_nBarOrgT; int m_nBgOrgX; int m_nBgOrgY; int m_nBgOrgW; int m_nBgOrgT; int m_nWaveCount; int m_nMaxWaveCount; bool m_bPanelDirty; vgui::Panel *m_pSeparatorBar; CExLabel *m_pSupportLabel; vgui::ScalableImagePanel *m_pProgressBar; vgui::ScalableImagePanel *m_pProgressBarBG; vgui::ScalableImagePanel *m_pBackground; CUtlVector< CEnemyCountPanel* > m_EnemyCountPanels; CPanelAnimationVarAliasType( int, m_nWaveCountYPos, "count_ypos", "32", "proportional_ypos" ); // ypos for the icon/count pairs CPanelAnimationVarAliasType( int, m_nSupportLabelYOffset, "support_label_yOffset", "20", "proportional_ypos" ); CPanelAnimationVarAliasType( int, m_nWaveCountOffset, "count_offset", "5", "proportional_xpos" ); // space between the icon/count pairs CPanelAnimationVarAliasType( int, m_nWaveCountBGMinWidth, "count_bg_min_width", "200", "proportional_xpos" ); // min background width CPanelAnimationVar( Color, m_clrNormal, "color_normal", "TanLight" ); CPanelAnimationVar( Color, m_clrMiniBoss, "color_miniboss", "RedSolid" ); // keeps the two rounded ends a certain distance apart from each other so the rounded line continues to look good even at low values CPanelAnimationVarAliasType( int, m_nWidthSpacer, "width_spacer", "2", "proportional_xpos" ); CPanelAnimationVar( bool, m_bVerbose, "verbose", "0" ); CPanelAnimationVarAliasType( int, m_nNormalHeight, "normal_height", "35", "proportional_ypos" ); CPanelAnimationVarAliasType( int, m_nVerboseHeightNoNumbers, "verbose_height_no_numbers", "53", "proportional_ypos" ); CPanelAnimationVarAliasType( int, m_nVerboseHeight, "verbose_height", "65", "proportional_ypos" ); }; //========================================================= class CWarningSwoop : public vgui::ImagePanel { DECLARE_CLASS_SIMPLE( CWarningSwoop, vgui::ImagePanel ); public: CWarningSwoop( Panel *parent, const char *name ); virtual void PaintBackground( void ); virtual bool IsVisible( void ); void StartSwoop( void ); private: float m_flStartCapAnimStart; CPanelAnimationVar( float, m_flSwoopTime, "time", "0.3" ); }; //========================================================= class CWaveCompleteSummaryPanel : public vgui::EditablePanel { DECLARE_CLASS_SIMPLE( CWaveCompleteSummaryPanel, vgui::EditablePanel ); public: CWaveCompleteSummaryPanel( Panel *parent, const char *pName ); virtual void ApplySchemeSettings( vgui::IScheme *pScheme ); virtual void OnTick( void ); void ShowWaveSummary( int nWaveNumber ); private: enum { CREDITS_COLLECT = 0, CREDITS_MISSED, CREDITS_BONUS, RATING_LABEL, RATING_SCORE, CHECKPOINT, WAIT, FINISHED, }; bool StateUpdateValue( vgui::EditablePanel *parent, char* field, float targetTime, float currentTime, int nextState, int endValue ); void RatingLabelUpdate( void ); void RatingScoreUpdate( void ); bool CheckState( float targetTime, float currentTime, int nextState ); void CheckCredits (); vgui::EditablePanel *m_pWaveCompleteContainer; vgui::EditablePanel *m_pCreditContainerPanel; vgui::EditablePanel *m_pRatingContainerPanel; vgui::Label *m_pCreditBonusTextLabel; vgui::Label *m_pCreditBonusCountLabel; vgui::ScalableImagePanel *m_pRespecBackground; vgui::EditablePanel *m_pRespecContainerPanel; vgui::Label *m_pRespecTextLabel; vgui::Label *m_pRespecCountLabel; float m_fPreviousTick; float m_fStateRunningTime; int m_nWaveNumber; int m_eState; int m_nCreditsCollected; int m_nCreditsMissed; int m_nCreditBonus; }; //========================================================= class CVictorySplash : public vgui::EditablePanel { DECLARE_CLASS_SIMPLE( CVictorySplash, vgui::EditablePanel ); public: CVictorySplash( Panel *parent, const char *pName ); virtual void ApplySchemeSettings( vgui::IScheme *pScheme ); virtual void OnTick( void ); private: }; //========================================================= class CMvMBombCarrierProgress : public vgui::EditablePanel { DECLARE_CLASS_SIMPLE( CMvMBombCarrierProgress, vgui::EditablePanel ); public: CMvMBombCarrierProgress( Panel *parent, const char *pName ); virtual void ApplySchemeSettings( vgui::IScheme *pScheme ); }; //========================================================= class CTFHudMannVsMachineStatus : public CHudElement, public vgui::EditablePanel { DECLARE_CLASS_SIMPLE( CTFHudMannVsMachineStatus, vgui::EditablePanel ); public: CTFHudMannVsMachineStatus( const char *pElementName ); virtual void ApplySchemeSettings( vgui::IScheme *pScheme ); virtual void FireGameEvent( IGameEvent *event ); virtual bool ShouldDraw( void ); virtual void OnTick( void ); //virtual void OnCommand( const char *command ); void WaveFailed( void ); void ShowWaveSummary ( int nWaveNumber ); void MVMVictory( bool bIsKicking, int bTime ); void MVMServerKickTimeUpdate( int bTime ); void MVMVictoryGCResponse( CMsgMvMVictoryInfo &pData ); void ForceVictoryRefresh(); void ReopenVictoryPanel( void ); bool IsVictoryPanelVisible() { return m_pVictoryContainer && m_pVictoryContainer->IsVictoryPanelVisible(); } virtual GameActionSet_t GetPreferredActionSet() { return IsVictoryPanelVisible() ? GAME_ACTION_SET_MENUCONTROLS : CHudElement::GetPreferredActionSet(); } bool IsWaveCompletePanelVisible() { return m_pWaveCompletePanel && m_pWaveCompletePanel->IsVisible(); } private: void UpdateBombCarrierProgress ( void ); void UpdateServerMessage( void ); CWarningSwoop *m_pWarningSwoop; CWaveStatusPanel *m_pWaveStatusPanel; CWaveCompleteSummaryPanel *m_pWaveCompletePanel; CVictorySplash *m_pVictorySplash; CMvMVictoryPanelContainer *m_pVictoryContainer; CMvMWaveLossPanel *m_pWaveLossPanel; vgui::EditablePanel *m_pServerChangeMessage; bool m_bInVictorySplash; float m_flVictoryTimer; int m_nNextWaveTime; bool m_bSpecPanelVisible; int m_nSpyMissionCount; int m_nFlagCarrierUpgradeLevel; vgui::EditablePanel *m_pUpgradeLevelContainer; vgui::ImagePanel *m_pUpgradeLevel1; vgui::ImagePanel *m_pUpgradeLevel2; vgui::ImagePanel *m_pUpgradeLevel3; vgui::ImagePanel *m_pUpgradeLevelBoss; int m_nUpgradeMaskBaseWidth; int m_nUpgradeMaskMaxWidth; vgui::EditablePanel *m_pBombUpgradeMeterMask; bool m_bAdjustWaveStatusPanel; bool m_bIsServerKicking; float m_flServerEndTime; }; #endif // TF_HUD_MANN_VS_MACHINE_STATUS_H