//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #ifndef TF_MATCH_SUMMARY_H #define TF_MATCH_SUMMARY_H #ifdef _WIN32 #pragma once #endif #include "hudelement.h" #include #include #include "tf_imagepanel.h" #include "econ_controls.h" #include "drawing_panel.h" #include "tf_particlepanel.h" #include "tf_matchmaking_shared.h" #include "tf_gamerules.h" #include "tf_match_join_handlers.h" using namespace vgui; class CAvatarImagePanel; class CTFBadgePanel; enum matchsummary_displaystate_t { MS_STATE_INITIAL = 0, MS_STATE_DRAWING, MS_STATE_STATS, MS_STATE_BRONZE_MEDALS, MS_STATE_SILVER_MEDALS, MS_STATE_GOLD_MEDALS, MS_STATE_FINAL, MS_NUM_STATES }; enum matchsummary_columns_t { MS_COLUMN_INVALID = -1, MS_COLUMN_MEDAL = 0, MS_COLUMN_AVATAR, MS_COLUMN_SPACER, MS_COLUMN_NAME, MS_COLUMN_CLASS, MS_COLUMN_SCORE, MS_COLUMN_SCORE_MEDAL, MS_COLUMN_KILLS, MS_COLUMN_KILLS_MEDAL, MS_COLUMN_DAMAGE, MS_COLUMN_DAMAGE_MEDAL, MS_COLUMN_HEALING, MS_COLUMN_HEALING_MEDAL, MS_COLUMN_SUPPORT, MS_COLUMN_SUPPORT_MEDAL, MS_NUM_COLUMNS }; class TFSectionedListPanel : public vgui::SectionedListPanel { private: DECLARE_CLASS_SIMPLE( TFSectionedListPanel, vgui::SectionedListPanel ); public: TFSectionedListPanel( Panel *parent, const char *panelName ) : BaseClass( parent, panelName ){} virtual ~TFSectionedListPanel(){} CPanelAnimationVarAliasType( int, m_iMedalWidth, "medal_width", "s.05", "proportional_width" ); CPanelAnimationVarAliasType( int, m_iAvatarWidth, "avatar_width", "s.1", "proportional_width" ); // Avatar width doesn't scale with resolution CPanelAnimationVarAliasType( int, m_iSpacerWidth, "spacer", "s.1", "proportional_width" ); CPanelAnimationVarAliasType( int, m_iNameWidth, "name_width", "s.1", "proportional_width" ); CPanelAnimationVarAliasType( int, m_iClassWidth, "class_width", "s.1", "proportional_width" ); CPanelAnimationVarAliasType( int, m_iAwardWidth, "award_width", "s.1", "proportional_width" ); CPanelAnimationVarAliasType( int, m_iStatsWidth, "stats_width", "s.1", "proportional_width" ); CPanelAnimationVarAliasType( int, m_iHorizFillInset, "horiz_inset", "5", "proportional_int" ); }; class CTFMatchSummary : public CHudElement, public vgui::EditablePanel { private: DECLARE_CLASS_SIMPLE( CTFMatchSummary, vgui::EditablePanel ); public: CTFMatchSummary( const char *pElementName ); virtual ~CTFMatchSummary(); virtual bool ShouldDraw( void ) OVERRIDE; virtual void ApplySchemeSettings( vgui::IScheme *pScheme ) OVERRIDE; virtual void PerformLayout() OVERRIDE; virtual void SetVisible( bool state ) OVERRIDE; virtual void OnTick() OVERRIDE; virtual void LevelInit( void ) OVERRIDE; virtual void LevelShutdown( void ) OVERRIDE; virtual GameActionSet_t GetPreferredActionSet() OVERRIDE { return GAME_ACTION_SET_IN_GAME_HUD; } virtual void FireGameEvent( IGameEvent *event ) OVERRIDE; bool ShowPerformanceMedals( void ); private: void Update( void ); void InitPlayerList( TFSectionedListPanel *pPlayerList, int nTeam ); static bool TFPlayerSortFunc( vgui::SectionedListPanel *list, int itemID1, int itemID2 ); void UpdateTeamInfo(); void UpdatePlayerList(); void UpdatePlayerAvatar( int playerIndex, KeyValues *kv ); void RecalculateMedalCounts(); void UpdateBadgePanels( CUtlVector &pBadgePanels, TFSectionedListPanel *pPlayerList ); void InternalUpdateMedalCountForType( int iTeam, StatMedal_t eMedal ); matchsummary_columns_t InternalAddMedalKeyValues( int iIndex, StatMedal_t eMedal, KeyValues *pKeyValues, int nTotalMedals = -1 ); void FireMedalEffects( Panel *pPanel, int nPanelXPos, int nPanelYPos, int nPanelWide, int nPanelTall, StatMedal_t eParticleMedal ); private: EditablePanel *m_pTeamScoresPanel; int m_iImageClass[SCOREBOARD_CLASS_ICONS]; int m_iImageClassAlt[SCOREBOARD_CLASS_ICONS]; int m_iImageMedals[StatMedal_Max]; CDrawingPanel *m_pDrawingPanel; vgui::EditablePanel *m_pBlueTeamPanel; vgui::EditablePanel *m_pRedTeamPanel; vgui::EditablePanel *m_pMainStatsContainer; vgui::EditablePanel *m_pPlayerListBlueParent; TFSectionedListPanel *m_pPlayerListBlue; vgui::EditablePanel *m_pPlayerListRedParent; TFSectionedListPanel *m_pPlayerListRed; CExLabel *m_pBlueTeamScore; CExLabel *m_pBlueTeamScoreDropshadow; EditablePanel *m_pBlueTeamScoreBG; EditablePanel *m_pBluePlayerListBG; CExLabel *m_pRedTeamScore; CExLabel *m_pRedTeamScoreDropshadow; EditablePanel *m_pRedTeamScoreBG; EditablePanel *m_pRedPlayerListBG; EditablePanel *m_pBlueMedalsPanel; EditablePanel *m_pRedMedalsPanel; vgui::ImagePanel *m_pRedTeamImage; vgui::ImagePanel *m_pBlueTeamImage; CAvatarImagePanel *m_pRedLeaderAvatarImage; CAvatarImagePanel *m_pBlueLeaderAvatarImage; EditablePanel *m_pRedLeaderAvatarBG; EditablePanel *m_pBlueLeaderAvatarBG; EditablePanel *m_pStatsLabelPanel; CExLabel *m_pStatsAndMedals; CExLabel *m_pStatsAndMedalsShadow; CExLabel *m_pBlueTeamName; CExLabel *m_pRedTeamName; CExLabel *m_pRedTeamWinner; CExLabel *m_pRedTeamWinnerDropshadow; CExLabel *m_pBlueTeamWinner; CExLabel *m_pBlueTeamWinnerDropshadow; CTFParticlePanel *m_pParticlePanel; vgui::EditablePanel *m_pStatsBgPanel; vgui::ImageList *m_pImageList; CUtlMap m_mapAvatarsToImageList; vgui::HFont m_hFont; bool m_bLargeMatchGroup; bool m_bXPShown; float m_flDrawingPanelTime; CPanelAnimationVar( Color, m_clrGoldMedal, "GoldMedalText", "214 186 24 255" ); CPanelAnimationVar( Color, m_clrSilverMedal, "SilverMedalText", "222 218 222 255" ); CPanelAnimationVar( Color, m_clrBronzeMedal, "BronzeMedalText", "214 125 57 255" ); CPanelAnimationVarAliasType( int, m_iAnimBluePlayerListParent, "AnimBluePlayerListParent", "0", "proportional_width" ); CPanelAnimationVarAliasType( int, m_iAnimBlueTeamScore, "AnimBlueTeamScore", "0", "proportional_width" ); CPanelAnimationVarAliasType( int, m_iAnimBlueTeamScoreDropshadow, "AnimBlueTeamScoreDropshadow", "0", "proportional_width" ); CPanelAnimationVarAliasType( int, m_iAnimBlueTeamScoreBG, "AnimBlueTeamScoreBG", "0", "proportional_width" ); CPanelAnimationVarAliasType( int, m_iAnimBluePlayerListBG, "AnimBluePlayerListBG", "0", "proportional_width" ); CPanelAnimationVarAliasType( int, m_iAnimRedTeamScoreBGWide, "AnimRedTeamScoreBGWide", "0", "proportional_width" ); CPanelAnimationVarAliasType( int, m_iAnimRedTeamScoreBGXPos, "AnimRedTeamScoreBGXPos", "0", "proportional_xpos" ); CPanelAnimationVarAliasType( int, m_iAnimRedTeamScoreWide, "AnimRedTeamScoreWide", "0", "proportional_width" ); CPanelAnimationVarAliasType( int, m_iAnimRedTeamScoreXPos, "AnimRedTeamScoreXPos", "0", "proportional_xpos" ); CPanelAnimationVarAliasType( int, m_iAnimRedTeamScoreDropshadowWide, "AnimRedTeamScoreDropshadowWide", "0", "proportional_width" ); CPanelAnimationVarAliasType( int, m_iAnimRedTeamScoreDropshadowXPos, "AnimRedTeamScoreDropshadowXPos", "0", "proportional_xpos" ); CPanelAnimationVarAliasType( int, m_iAnimRedPlayerListParentWide, "AnimRedPlayerListParentWide", "0", "proportional_width" ); CPanelAnimationVarAliasType( int, m_iAnimRedPlayerListParentXPos, "AnimRedPlayerListParentXPos", "0", "proportional_xpos" ); CPanelAnimationVarAliasType( int, m_iAnimRedPlayerListBGWide, "AnimRedPlayerListBGWide", "0", "proportional_width" ); CPanelAnimationVarAliasType( int, m_iAnimRedPlayerListBGXPos, "AnimRedPlayerListBGXPos", "0", "proportional_xpos" ); CPanelAnimationVarAliasType( int, m_iAnimBlueMedalsYPos, "AnimBlueMedalsYPos", "0", "proportional_ypos" ); CPanelAnimationVarAliasType( int, m_iAnimRedMedalsYPos, "AnimRedMedalsYPos", "0", "proportional_ypos" ); CPanelAnimationVarAliasType( int, m_iAnimStatsLabelPanel6v6YPos, "AnimStatsLabelPanel6v6YPos", "0", "proportional_ypos" ); CPanelAnimationVarAliasType( int, m_iAnimBlueTeamLabel6v6YPos, "AnimBlueTeamLabel6v6YPos", "0", "proportional_ypos" ); CPanelAnimationVarAliasType( int, m_iAnimRedTeamLabel6v6YPos, "AnimRedTeamLabel6v6YPos", "0", "proportional_ypos" ); CPanelAnimationVarAliasType( int, m_iAnimStatsLabelPanel12v12YPos, "AnimStatsLabelPanel12v12YPos", "0", "proportional_ypos" ); CPanelAnimationVarAliasType( int, m_iAnimBlueTeamLabel12v12YPos, "AnimBlueTeamLabel12v12YPos", "0", "proportional_ypos" ); CPanelAnimationVarAliasType( int, m_iAnimRedTeamLabel12v12YPos, "AnimRedTeamLabel12v12YPos", "0", "proportional_ypos" ); CPanelAnimationVarAliasType( int, m_iAnimStatsContainer12v12YPos, "AnimStatsContainer12v12YPos", "0", "proportional_ypos" ); struct MatchDataUpdate_t { uint32 unRating; int nDelta; int nScoreRank; int nKillsRank; int nDamageRank; int nHealingRank; int nSupportRank; }; MatchDataUpdate_t m_SkillRatings[MAX_PLAYERS + 1]; int m_iCurrentState; float m_flNextActionTime; int m_nMedalsToAward_Bronze_Blue; int m_nMedalsToAward_Silver_Blue; int m_nMedalsToAward_Gold_Blue; int m_nMedalsToAward_Bronze_Red; int m_nMedalsToAward_Silver_Red; int m_nMedalsToAward_Gold_Red; int m_nMedalsRevealed; int m_nNumMedalsThisUpdate; bool m_bBlueGoldValueRevealed; bool m_bBlueSilverValueRevealed; bool m_bBlueBronzeValueRevealed; bool m_bRedGoldValueRevealed; bool m_bRedSilverValueRevealed; bool m_bRedBronzeValueRevealed; bool m_bPlayerAbandoned; float m_flMedalSoundTime; CUtlVector< CTFBadgePanel* > m_pBlueBadgePanels; CUtlVector< CTFBadgePanel* > m_pRedBadgePanels; }; #endif //TF_MATCH_SUMMARY_H