Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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

5 years ago
//========= 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 );
}
}