//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: Flyover/Tooltip hint area for commander // // $NoKeywords: $ //=============================================================================// #include "cbase.h" #include #include "hud_commander_statuspanel.h" #include "techtree.h" #include #include "VGuiMatSurface/IMatSystemSurface.h" #include #include #include // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" static CCommanderStatusPanel *g_pCommanderStatusPanel = NULL; // #define ALPHA_ADJUST_TIME 0.1f #define MAX_FILLED_INFO_ALPHA 127.0f //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- CCommanderStatusPanel::CCommanderStatusPanel( void ) : BaseClass( NULL, "CCommanderStatusPanel" ) { m_hFont = m_hFontText = 0; m_nLeftEdge = 0; m_nBottomEdge = 0; // m_pBorder = new vgui::LineBorder( 2, vgui::Color( 127, 127, 127, 255 ) ); // setBorder( m_pBorder ); SetBgColor( Color( 0, 0, 0, 100 ) ); // we need updating vgui::ivgui()->AddTickSignal( GetVPanel() ); InternalClear(); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- CCommanderStatusPanel::~CCommanderStatusPanel( void ) { // delete m_pBorder; } //----------------------------------------------------------------------------- // Scheme settings //----------------------------------------------------------------------------- void CCommanderStatusPanel::ApplySchemeSettings(vgui::IScheme *pScheme) { BaseClass::ApplySchemeSettings(pScheme); m_hFont = pScheme->GetFont( "Trebuchet20" ); // FIXME: Outline, weight 1000 m_hFontText = pScheme->GetFont( "Trebuchet18" ); // FIXME: Outline, weight 700 } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CCommanderStatusPanel::OnTick() { // Simulate alpha float dt = gpGlobals->frametime; float maxmove = 1.0f / ALPHA_ADJUST_TIME; float moverequested = dt * maxmove; float remaining = m_flGoalAlpha - m_flCurrentAlpha; if ( fabs( remaining ) < 0.01f ) { if ( m_flCurrentAlpha < 0.01f ) { InternalClear(); return; } } if ( moverequested > fabs( remaining ) ) { moverequested = fabs( remaining ); } if ( remaining > 0.0f ) { m_flCurrentAlpha += moverequested; } else { m_flCurrentAlpha -= moverequested; } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CCommanderStatusPanel::Paint() { if ( m_flCurrentAlpha <= 0.0f ) return; int wide, tall; GetSize( wide, tall ); int x = 2; int y = 2; wide -= 4; tall -= 4; int alpha = 255.0f * m_flCurrentAlpha; if ( m_Type == TYPE_INFO && m_nTitlePos != -1 ) { m_szText[ m_nTitlePos ] = 0; g_pMatSystemSurface->DrawColoredTextRect( m_hFont, x, y, wide, tall, 220, 220, 255, alpha, "%s", m_szText ); m_szText[ m_nTitlePos ] = '\n'; y += vgui::surface()->GetFontTall( m_hFont ); tall -= vgui::surface()->GetFontTall( m_hFont ); // Start after title g_pMatSystemSurface->DrawColoredTextRect( m_hFontText, x, y, wide, tall, 255, 255, 255, alpha, "%s", &m_szText[ m_nTitlePos + 1 ] ); if ( m_bShowTechnology && m_pTechnology ) { int x = 0; int y = tall; int size; int r, g, b; r = g = 192; b = 255; float fResourceCost = m_pTechnology->GetResourceCost(); float fResourceLevel = m_pTechnology->GetResourceLevel(); int techLevel = m_pTechnology->GetLevel(); x = 5; g_pMatSystemSurface->DrawColoredText( m_hFontText, x, y, r, g, b, alpha, "Level <%i>", techLevel ); x = wide - 5; if ( m_pTechnology->GetActive() ) { size = g_pMatSystemSurface->DrawTextLen( m_hFontText, "Already owned" ); x -= size; g_pMatSystemSurface->DrawColoredText( m_hFontText, x, y, r, g, b, alpha, "Already owned" ); } else { if ( !fResourceCost ) { size = g_pMatSystemSurface->DrawTextLen( m_hFontText, "Cost: Free" ); x -= size; g_pMatSystemSurface->DrawColoredText( m_hFontText, x, y, r, g, b, alpha, "Cost: Free" ); } else { int sizecost = g_pMatSystemSurface->DrawTextLen( m_hFontText, "WWW: 000 (000)" ) + 5; size = g_pMatSystemSurface->DrawTextLen( m_hFontText, "Cost: " ); x = wide - size - 4 * sizecost; r = 255; g = 255; b = 255; g_pMatSystemSurface->DrawColoredText( m_hFontText, x, y, r, g, b, alpha, "Cost: " ); x += size; char szCostString[64]; // Draw cost string backward to right justify it if ( fResourceCost ) { if ( fResourceLevel ) Q_snprintf( szCostString, sizeof( szCostString ), "A: %i (%i)", (int)fResourceLevel, (int)fResourceCost ); else Q_snprintf( szCostString, sizeof( szCostString ), "A: %i", (int)fResourceCost ); g_pMatSystemSurface->DrawColoredText( m_hFontText, x, y, sResourceColor.r, sResourceColor.g, sResourceColor.b, alpha, "%s", szCostString ); sizecost = g_pMatSystemSurface->DrawTextLen( m_hFontText, "%s", szCostString ) + 2; } x += sizecost; } } } } else { g_pMatSystemSurface->DrawColoredTextRect( m_hFont, x, y + tall - vgui::surface()->GetFontTall( m_hFont ) - 4, wide, vgui::surface()->GetFontTall( m_hFont ) + 2, 220, 220, 255, alpha, "%s", m_szText ); } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CCommanderStatusPanel::PaintBackground() { if ( m_flCurrentAlpha <= 0.0f ) return; if ( m_Type == TYPE_INFO ) { int alpha = MAX_FILLED_INFO_ALPHA * m_flCurrentAlpha; SetBgColor( Color( 0, 0, 0, alpha ) ); alpha += ( 255 - alpha ) / 2; // m_pBorder->SetColor( vgui::Color( 120, 120, 180, alpha ) ); } else { SetBgColor( Color( 0, 0, 0, 0 ) ); // m_pBorder->SetColor( vgui::Color( 0, 0, 0, 0 ) ); } BaseClass::PaintBackground(); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CCommanderStatusPanel::Clear( void ) { m_flGoalAlpha = 0.0f; } //----------------------------------------------------------------------------- // Purpose: // Input : *fmt - // ... - //----------------------------------------------------------------------------- void CCommanderStatusPanel::SetText( STATUSTYPE type, const char *fmt, ... ) { va_list argptr; va_start( argptr, fmt ); _vsnprintf(m_szText, MAX_STATUS_TEXT, fmt, argptr); va_end(argptr); m_szText[ MAX_STATUS_TEXT - 1 ] = 0; m_Type = type; SetVisible( true ); m_nTitlePos = -1; if ( m_Type == TYPE_INFO ) { // Search for first \n char *p = m_szText; while ( *p && *p != '\n' ) { p++; } if ( *p == '\n' ) { m_nTitlePos = p - m_szText; } } m_flCurrentAlpha = MAX( m_flCurrentAlpha, 0.01f ); m_flGoalAlpha = 1.0f; m_bShowTechnology = false; m_pTechnology = NULL; RecomputeBounds(); } void CCommanderStatusPanel::SetTechnology( CBaseTechnology *technology ) { m_bShowTechnology = true; m_pTechnology = technology; } void CCommanderStatusPanel::InternalClear( void ) { m_Type = TYPE_UNKNOWN; m_szText[ 0 ] = 0; m_nTitlePos = -1; m_flCurrentAlpha = 0.0f; m_flGoalAlpha = 0.0f; m_bShowTechnology = false; m_pTechnology = NULL; SetVisible( false ); SetPaintBackgroundEnabled( false ); SetPaintBorderEnabled( false ); } void CCommanderStatusPanel::RecomputeBounds( void ) { int maxlines = 5; int lineheight = vgui::surface()->GetFontTall( m_hFont ); int height; height = lineheight + ( maxlines - 1 ) * vgui::surface()->GetFontTall( m_hFontText ); height += 4; // 2 pixels top and bottom SetBounds( m_nLeftEdge, m_nBottomEdge - height, ScreenWidth() * 0.6, height ); SetPaintBackgroundEnabled( true ); SetPaintBorderEnabled( true ); } void CCommanderStatusPanel::SetLeftBottom( int l, int b ) { m_nLeftEdge = l; m_nBottomEdge = b; RecomputeBounds(); } ////////////////////////////////////////// // // Status Panel Creation/Destruction and public api // ////////////////////////////////////////// void StatusCreate( vgui::Panel *parent, int treetoprow ) { Assert( !g_pCommanderStatusPanel ); g_pCommanderStatusPanel = new CCommanderStatusPanel(); g_pCommanderStatusPanel->SetAutoDelete( false ); g_pCommanderStatusPanel->SetParent( parent ); g_pCommanderStatusPanel->SetLeftBottom( 0, treetoprow - 10 ); } //----------------------------------------------------------------------------- // Purpose: // Input : treeetoprow - //----------------------------------------------------------------------------- void StatusSetTopRow( int treetoprow ) { Assert( g_pCommanderStatusPanel ); g_pCommanderStatusPanel->SetLeftBottom( 0, treetoprow - 10 ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void StatusDestroy( void ) { delete g_pCommanderStatusPanel; g_pCommanderStatusPanel = NULL; } //----------------------------------------------------------------------------- // Purpose: // Input : type - // *fmt - // ... - //----------------------------------------------------------------------------- void StatusPrint( STATUSTYPE type, const char *fmt, ... ) { char text[ CCommanderStatusPanel::MAX_STATUS_TEXT ]; va_list argptr; va_start( argptr, fmt ); _vsnprintf(text, CCommanderStatusPanel::MAX_STATUS_TEXT, fmt, argptr); va_end(argptr); text[ CCommanderStatusPanel::MAX_STATUS_TEXT - 1 ] = 0; if ( g_pCommanderStatusPanel ) { g_pCommanderStatusPanel->SetText( type, text ); } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void StatusClear( void ) { if ( g_pCommanderStatusPanel ) { g_pCommanderStatusPanel->Clear(); } } //----------------------------------------------------------------------------- // Purpose: // Input : *technology - //----------------------------------------------------------------------------- void StatusTechnology( CBaseTechnology *technology ) { if ( g_pCommanderStatusPanel ) { g_pCommanderStatusPanel->SetTechnology(technology ); } }