summaryrefslogtreecommitdiff
path: root/game/client/dod/dod_hud_winpanel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/client/dod/dod_hud_winpanel.cpp')
-rw-r--r--game/client/dod/dod_hud_winpanel.cpp526
1 files changed, 526 insertions, 0 deletions
diff --git a/game/client/dod/dod_hud_winpanel.cpp b/game/client/dod/dod_hud_winpanel.cpp
new file mode 100644
index 0000000..43dd74f
--- /dev/null
+++ b/game/client/dod/dod_hud_winpanel.cpp
@@ -0,0 +1,526 @@
+
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#include "cbase.h"
+#include "dod_hud_winpanel.h"
+#include "vgui_controls/AnimationController.h"
+#include "iclientmode.h"
+#include "c_dod_playerresource.h"
+#include <vgui_controls/Label.h>
+#include <vgui/ILocalize.h>
+#include <vgui/ISurface.h>
+#include "vgui_avatarimage.h"
+#include "fmtstr.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+DECLARE_HUDELEMENT_DEPTH( CDODWinPanel_Allies, 1 ); // 1 is foreground
+DECLARE_HUDELEMENT_DEPTH( CDODWinPanel_Axis, 1 );
+
+CDODWinPanel_Allies::CDODWinPanel_Allies( const char *pElementName ) : CDODWinPanel( "WinPanel_Allies", TEAM_ALLIES )
+{
+ LoadControlSettings("Resource/UI/Win_Allies.res");
+}
+
+void CDODWinPanel_Allies::OnScreenSizeChanged( int iOldWide, int iOldTall )
+{
+ LoadControlSettings( "resource/UI/Win_Allies.res" );
+}
+
+void CDODWinPanel_Allies::ApplySchemeSettings( vgui::IScheme *pScheme )
+{
+ m_pIcon = gHUD.GetIcon( "icon_obj_allies" );
+
+ LoadControlSettings( "resource/UI/Win_Allies.res" );
+
+ BaseClass::ApplySchemeSettings( pScheme );
+}
+
+//============================
+
+CDODWinPanel_Axis::CDODWinPanel_Axis( const char *pElementName ) : CDODWinPanel( "WinPanel_Axis", TEAM_AXIS )
+{
+ LoadControlSettings("Resource/UI/Win_Axis.res");
+}
+
+void CDODWinPanel_Axis::OnScreenSizeChanged( int iOldWide, int iOldTall )
+{
+ LoadControlSettings( "resource/UI/Win_Axis.res" );
+}
+
+void CDODWinPanel_Axis::ApplySchemeSettings( vgui::IScheme *pScheme )
+{
+ m_pIcon = gHUD.GetIcon( "icon_obj_axis" );
+
+ LoadControlSettings( "resource/UI/Win_Axis.res" );
+
+ BaseClass::ApplySchemeSettings( pScheme );
+}
+
+//============================
+
+//-----------------------------------------------------------------------------
+// Purpose: Constructor
+//-----------------------------------------------------------------------------
+CDODWinPanel::CDODWinPanel( const char *pElementName, int iTeam )
+ : EditablePanel( NULL, pElementName ), CHudElement( pElementName )
+{
+ vgui::Panel *pParent = g_pClientMode->GetViewport();
+ SetParent( pParent );
+ SetVisible( false );
+ SetAlpha( 0 );
+ SetScheme( "ClientScheme" );
+
+ m_iTeam = iTeam;
+
+ m_pTimerStatusLabel = new vgui::Label( this, "TimerInfo", "" );
+
+ m_pLastCapperHeader = new vgui::Label( this, "LastCapperHeader", "" );
+ m_pLastBomberHeader = new vgui::Label( this, "LastBomberHeader", "" );
+
+ m_pLastCapperLabel = new vgui::Label( this, "LastCapper", "" );
+ m_pLastCapperLabel_Avatar = new vgui::Label( this, "LastCapper_Avatar", "" );
+
+ m_pLeftCategoryHeader = new vgui::Label( this, "LeftCategoryHeader", "..." );
+ m_pRightCategoryHeader = new vgui::Label( this, "RightCategoryHeader", "..." );
+
+ m_pLeftCategoryLabels[0] = new vgui::Label( this, "LeftCategory1", "" );
+ m_pLeftCategoryLabels[1] = new vgui::Label( this, "LeftCategory2", "" );
+ m_pLeftCategoryLabels[2] = new vgui::Label( this, "LeftCategory3", "" );
+
+ m_pRightCategoryLabels[0] = new vgui::Label( this, "RightCategory1", "" );
+ m_pRightCategoryLabels[1] = new vgui::Label( this, "RightCategory2", "" );
+ m_pRightCategoryLabels[2] = new vgui::Label( this, "RightCategory3", "" );
+
+ RegisterForRenderGroup( "winpanel" );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CDODWinPanel::Reset()
+{
+ Hide();
+}
+
+void CDODWinPanel::Init()
+{
+ // listen for events
+ ListenForGameEvent( "dod_round_win" );
+ ListenForGameEvent( "dod_round_start" );
+ ListenForGameEvent( "dod_point_captured" );
+ ListenForGameEvent( "dod_win_panel" );
+
+ Hide();
+
+ SetFinalCaptureLabel( "", false );
+
+ m_pTimerStatusLabel->SetText( "" );
+
+ m_bShowTimerDefend = false;
+ m_bShowTimerAttack = false;
+ m_iTimerTime = 0;
+
+ m_iFinalEventType = CAP_EVENT_NONE;
+
+ m_iLeftCategory = WINPANEL_TOP3_NONE;
+ m_iRightCategory = WINPANEL_TOP3_NONE;
+
+ for ( int i=0;i<3;i++ )
+ {
+ m_iLeftCategoryScores[i] = 0;
+ m_iRightCategoryScores[i] = 0;
+ }
+
+ CHudElement::Init();
+}
+
+void CDODWinPanel::VidInit()
+{
+ m_pIconCap = gHUD.GetIcon( "stats_cap" );
+ m_pIconDefended = gHUD.GetIcon( "stats_defended" );
+ m_pIconBomb = gHUD.GetIcon( "icon_c4" );
+ m_pIconKill = gHUD.GetIcon( "stats_kill" );
+}
+
+void SetPlayerNameLabel( vgui::Label *pLabel, int clientIndex )
+{
+ if ( !pLabel )
+ return;
+
+ if ( clientIndex >= 1 && clientIndex <= MAX_PLAYERS )
+ {
+ char buf[48];
+ Q_snprintf( buf, sizeof(buf), "%s:", g_PR->GetPlayerName(clientIndex) );
+ pLabel->SetText( buf );
+ }
+
+ pLabel->SetVisible( clientIndex > 0 );
+}
+
+void CDODWinPanel::FireGameEvent( IGameEvent * event )
+{
+ const char *pEventName = event->GetName();
+
+ if ( Q_strcmp( "dod_round_win", pEventName ) == 0 )
+ {
+ if ( event->GetInt( "team" ) == m_iTeam )
+ {
+ Show();
+ }
+ }
+ else if ( Q_strcmp( "dod_round_start", pEventName ) == 0 )
+ {
+ Hide();
+
+ m_pLastCapperHeader->SetVisible( false );
+ m_pLastBomberHeader->SetVisible( false );
+ }
+ else if ( Q_strcmp( "dod_point_captured", pEventName ) == 0 )
+ {
+ if ( !g_PR )
+ return;
+
+ // Array of capper indeces
+ const char *cappers = event->GetString("cappers");
+
+ char szCappers[256];
+ szCappers[0] = '\0';
+
+ int len = Q_strlen(cappers);
+
+ bool bShowAvatar = ( len == 1 );
+
+ if ( !bShowAvatar )
+ {
+ SetupAvatar( "top", 1, 0 ); // hide it
+ }
+
+ for( int i=0;i<len;i++ )
+ {
+ int iPlayerIndex = (int)cappers[i];
+
+ Assert( iPlayerIndex > 0 && iPlayerIndex <= gpGlobals->maxClients );
+
+ const char *pPlayerName = g_PR->GetPlayerName( iPlayerIndex );
+
+ if ( bShowAvatar )
+ {
+ SetupAvatar( "top", 1, iPlayerIndex );
+ }
+
+ if ( i > 0 )
+ {
+ Q_strncat( szCappers, ", ", sizeof(szCappers), 2 );
+ }
+
+ Q_strncat( szCappers, pPlayerName, sizeof(szCappers), COPY_ALL_CHARACTERS );
+ }
+
+ if ( event->GetBool( "bomb" ) )
+ {
+ m_pLastCapperHeader->SetVisible( false );
+ m_pLastBomberHeader->SetVisible( true );
+ }
+ else
+ {
+ m_pLastCapperHeader->SetVisible( true );
+ m_pLastBomberHeader->SetVisible( false );
+ }
+
+ SetFinalCaptureLabel( szCappers, bShowAvatar );
+ }
+ else if ( Q_strcmp( "dod_win_panel", pEventName ) == 0 )
+ {
+ /*
+ "show_timer_defend" "bool"
+ "show_timer_attack" "bool"
+ "timer_time" "int"
+
+ "final_event" "byte" // 0 - no event, 1 - bomb exploded, 2 - flag capped, 3 - timer expired
+
+ "category_left" "byte" // 0-4: none, bombers, cappers, defenders, killers
+ "left_1" "byte" // player index if first
+ "left_score_1" "byte"
+ "left_2" "byte"
+ "left_score_2" "byte"
+ "left_3" "byte"
+ "left_score_3" "byte"
+
+ "right_1" "byte"
+ "right_score_1" "byte"
+ "right_2" "byte"
+ "right_score_2" "byte"
+ "right_3" "byte"
+ "right_score_3" "byte"
+ */
+
+ if ( !g_PR )
+ return;
+
+ m_bShowTimerDefend = event->GetBool( "show_timer_defend" );
+ m_bShowTimerAttack = event->GetBool( "show_timer_attack" );
+ m_iTimerTime = event->GetInt( "timer_time" );
+
+ int minutes = clamp( m_iTimerTime / 60, 0, 99 );
+ int seconds = clamp( m_iTimerTime % 60, 0, 59 );
+
+ if ( m_bShowTimerDefend )
+ {
+ // defenders win, show total time defended
+ // "Total Time Defended: 4:28"
+
+ wchar_t time[8];
+ _snwprintf( time, ARRAYSIZE( time ), L"%d:%02d", minutes, seconds );
+
+ wchar_t timerText[128];
+ g_pVGuiLocalize->ConstructString( timerText, sizeof( timerText ), g_pVGuiLocalize->Find( "#winpanel_total_time" ), 1, time );
+
+ m_pTimerStatusLabel->SetText( timerText );
+
+ // zero out the final capture label, they won by timer
+ m_pLastCapperHeader->SetVisible( false );
+ m_pLastBomberHeader->SetVisible( false );
+ SetFinalCaptureLabel( "", false );
+
+ SetupAvatar( "top", 1, 0 ); // hide it
+ }
+ else if ( m_bShowTimerAttack )
+ {
+ // attackers win, show time elapsed
+ // "Time Elapsed: 4:12"
+
+ wchar_t time[8];
+ _snwprintf( time, ARRAYSIZE( time ), L"%d:%02d", minutes, seconds );
+
+ wchar_t timerText[128];
+ g_pVGuiLocalize->ConstructString( timerText, sizeof( timerText ), g_pVGuiLocalize->Find( "#winpanel_attack_time" ), 1, time );
+
+ m_pTimerStatusLabel->SetText( timerText );
+ }
+ else
+ {
+ m_pTimerStatusLabel->SetText( "" );
+ }
+
+ m_iFinalEventType = event->GetInt( "final_event" );
+ // up to client to fill in who completed the final event
+
+ m_iLeftCategory = event->GetInt( "category_left" );
+ m_iRightCategory = event->GetInt( "category_right" );
+
+ m_pLeftCategoryHeader->SetText( g_pVGuiLocalize->Find( pszWinPanelCategoryHeaders[m_iLeftCategory] ) );
+ m_pRightCategoryHeader->SetText( g_pVGuiLocalize->Find( pszWinPanelCategoryHeaders[m_iRightCategory] ) );
+
+ int iPlayer;
+
+ // Left Top 3 Category
+ iPlayer = event->GetInt( "left_1" );
+ SetPlayerNameLabel( m_pLeftCategoryLabels[0], iPlayer );
+ SetupAvatar( "left", 1, iPlayer );
+
+ iPlayer = event->GetInt( "left_2" );
+ SetPlayerNameLabel( m_pLeftCategoryLabels[1], iPlayer );
+ SetupAvatar( "left", 2, iPlayer );
+
+ iPlayer = event->GetInt( "left_3" );
+ SetPlayerNameLabel( m_pLeftCategoryLabels[2], iPlayer );
+ SetupAvatar( "left", 3, iPlayer );
+
+ m_iLeftCategoryScores[0] = event->GetInt( "left_score_1" );
+ m_iLeftCategoryScores[1] = event->GetInt( "left_score_2" );
+ m_iLeftCategoryScores[2] = event->GetInt( "left_score_3" );
+
+ // Right Top 3 Category
+ iPlayer = event->GetInt( "right_1" );
+ SetPlayerNameLabel( m_pRightCategoryLabels[0], iPlayer );
+ SetupAvatar( "right", 1, iPlayer );
+
+ iPlayer = event->GetInt( "right_2" );
+ SetPlayerNameLabel( m_pRightCategoryLabels[1], iPlayer );
+ SetupAvatar( "right", 2, iPlayer );
+
+ iPlayer = event->GetInt( "right_3" );
+ SetPlayerNameLabel( m_pRightCategoryLabels[2], iPlayer );
+ SetupAvatar( "right", 3, iPlayer );
+
+ m_iRightCategoryScores[0] = event->GetInt( "right_score_1" );
+ m_iRightCategoryScores[1] = event->GetInt( "right_score_2" );
+ m_iRightCategoryScores[2] = event->GetInt( "right_score_3" );
+
+ m_pRightCategoryHeader->SetVisible( ( m_iRightCategoryScores[0] > 0 ) );
+ }
+}
+
+void CDODWinPanel::SetupAvatar( const char *pSide, int pos, int iPlayerIndex )
+{
+#if !defined( _X360 )
+
+ bool bVisible = ( iPlayerIndex > 0 );
+
+ CAvatarImagePanel *pPlayerAvatar = dynamic_cast<CAvatarImagePanel *>( FindChildByName( CFmtStr( "%s_%d_avatar", pSide, pos ) ) );
+
+ if ( pPlayerAvatar )
+ {
+ pPlayerAvatar->SetShouldScaleImage( true );
+ pPlayerAvatar->SetShouldDrawFriendIcon( false );
+
+ if ( bVisible )
+ {
+ CBasePlayer *pPlayer = UTIL_PlayerByIndex( iPlayerIndex );
+ pPlayerAvatar->SetPlayer( pPlayer );
+ }
+
+ pPlayerAvatar->SetVisible( bVisible );
+ }
+#endif
+}
+
+void CDODWinPanel::SetFinalCaptureLabel( const char *szCappers, bool bShowAvatar )
+{
+ SetDialogVariable( "lastcappers", szCappers );
+
+ m_pLastCapperLabel->SetVisible( !bShowAvatar );
+ m_pLastCapperLabel_Avatar->SetVisible( bShowAvatar );
+}
+
+void CDODWinPanel::Show( void )
+{
+ SetAlpha( 255 );
+
+ int iRenderGroup = gHUD.LookupRenderGroupIndexByName( "winpanel" );
+ if ( iRenderGroup >= 0 )
+ {
+ gHUD.LockRenderGroup( iRenderGroup );
+ }
+}
+
+void CDODWinPanel::Hide( void )
+{
+ SetAlpha( 0 );
+
+ int iRenderGroup = gHUD.LookupRenderGroupIndexByName( "winpanel" );
+ if ( iRenderGroup >= 0 )
+ {
+ gHUD.UnlockRenderGroup( iRenderGroup );
+ }
+}
+
+void CDODWinPanel::ApplySchemeSettings( vgui::IScheme *pScheme )
+{
+ BaseClass::ApplySchemeSettings( pScheme );
+
+ SetBgColor( GetSchemeColor("TransparentLightBlack", pScheme) );
+}
+
+bool CDODWinPanel::ShouldDraw( void )
+{
+ return ( GetAlpha() > 0 );
+}
+
+CHudTexture *CDODWinPanel::GetIconForCategory( int category )
+{
+ CHudTexture *pTex = NULL;
+
+ switch( category )
+ {
+ case WINPANEL_TOP3_BOMBERS:
+ pTex = m_pIconBomb;
+ break;
+ case WINPANEL_TOP3_CAPPERS:
+ pTex = m_pIconCap;
+ break;
+ case WINPANEL_TOP3_DEFENDERS:
+ pTex = m_pIconDefended;
+ break;
+ case WINPANEL_TOP3_KILLERS:
+ pTex = m_pIconKill;
+ break;
+ default:
+ break;
+ }
+
+ return pTex;
+}
+
+void CDODWinPanel::Paint( void )
+{
+ if ( m_pIcon )
+ {
+ Color c(255,255,255,255);
+ m_pIcon->DrawSelf( m_iIconX_left, m_iIconY, m_iIconW, m_iIconH, c );
+ m_pIcon->DrawSelf( m_iIconX_right, m_iIconY, m_iIconW, m_iIconH, c );
+ }
+
+ int i;
+ int x, y, w, h;
+ Color c(255,255,255,255);
+
+ // Draw Left Category Icons
+ CHudTexture *pIcon = GetIconForCategory( m_iLeftCategory );
+
+ if ( pIcon )
+ {
+ for ( i=0;i<3;i++ )
+ {
+ if ( m_iLeftCategoryScores[i] > 0 )
+ {
+ m_pLeftCategoryLabels[i]->GetBounds( x, y, w, h );
+
+ x = x + w + XRES(2);
+ y = y + ( h - m_iIconSize ) * 0.5;
+
+ // too many, do a "(icon) 8"
+ pIcon->DrawSelf( x, y, m_iIconSize, m_iIconSize, c );
+ x += m_iIconSize;
+
+ char buf[10];
+ Q_snprintf( buf, sizeof(buf), " %d", m_iLeftCategoryScores[i] );
+ DrawText( buf, x, y, c );
+ }
+ }
+ }
+
+ // Draw Right Category Icons
+ pIcon = GetIconForCategory( m_iRightCategory );
+
+ if ( pIcon )
+ {
+ for ( i=0;i<3;i++ )
+ {
+ if ( m_iRightCategoryScores[i] > 0 )
+ {
+ m_pRightCategoryLabels[i]->GetBounds( x, y, w, h );
+
+ x = x + w + XRES(2);
+ y = y + ( h - m_iIconSize ) * 0.5;
+
+ // too many, do a "(icon) 8"
+ pIcon->DrawSelf( x, y, m_iIconSize, m_iIconSize, c );
+ x += m_iIconSize;
+
+ char buf[10];
+ Q_snprintf( buf, sizeof(buf), " %d", m_iRightCategoryScores[i] );
+ DrawText( buf, x, y, c );
+ }
+ }
+ }
+}
+
+void CDODWinPanel::DrawText( char *text, int x, int y, Color clrText )
+{
+ vgui::surface()->DrawSetTextColor( clrText );
+ vgui::surface()->DrawSetTextFont( m_hNumberFont );
+ vgui::surface()->DrawSetTextPos( x, y );
+
+ for (char *pch = text; *pch != 0; pch++)
+ {
+ vgui::surface()->DrawUnicodeChar(*pch);
+ }
+} \ No newline at end of file