You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
414 lines
10 KiB
414 lines
10 KiB
//========= 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 ); |
|
} |
|
} |