diff options
Diffstat (limited to 'game/client/tf2/hud_commander_statuspanel.cpp')
| -rw-r--r-- | game/client/tf2/hud_commander_statuspanel.cpp | 414 |
1 files changed, 414 insertions, 0 deletions
diff --git a/game/client/tf2/hud_commander_statuspanel.cpp b/game/client/tf2/hud_commander_statuspanel.cpp new file mode 100644 index 0000000..46cb908 --- /dev/null +++ b/game/client/tf2/hud_commander_statuspanel.cpp @@ -0,0 +1,414 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Flyover/Tooltip hint area for commander +// +// $NoKeywords: $ +//=============================================================================// +#include "cbase.h" +#include <stdarg.h> +#include "hud_commander_statuspanel.h" +#include "techtree.h" +#include <vgui/IVGui.h> +#include "VGuiMatSurface/IMatSystemSurface.h" +#include <vgui_controls/Controls.h> +#include <vgui/ISurface.h> +#include <vgui/IScheme.h> + +// 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 ); + } +}
\ No newline at end of file |