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.
305 lines
9.1 KiB
305 lines
9.1 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
// |
|
//=============================================================================// |
|
#include "cbase.h" |
|
#include "c_vguiscreen.h" |
|
#include "vgui_controls/Label.h" |
|
#include "vgui_bitmappanel.h" |
|
#include <vgui/IVGui.h> |
|
#include "c_prop_portal_stats_display.h" |
|
#include "ienginevgui.h" |
|
#include "fmtstr.h" |
|
#include "portal_shareddefs.h" |
|
|
|
using namespace vgui; |
|
|
|
|
|
#define TESTCHAMBER_STATS_FIRST_MEDAL "MedalPortalGold" |
|
#define TESTCHAMBER_STATS_FIRST_MEDAL_POINTER "MedalPointer00" |
|
#define TESTCHAMBER_STATS_FIRST_SUBJECT_REACTION "SubjectReactionIdle" |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Control screen |
|
//----------------------------------------------------------------------------- |
|
class CPortalStatsDisplayScreen : public CVGuiScreenPanel |
|
{ |
|
DECLARE_CLASS( CPortalStatsDisplayScreen, CVGuiScreenPanel ); |
|
|
|
public: |
|
CPortalStatsDisplayScreen( vgui::Panel *parent, const char *panelName ); |
|
~CPortalStatsDisplayScreen(); |
|
|
|
virtual void ApplySchemeSettings( IScheme *pScheme ); |
|
|
|
virtual bool Init( KeyValues* pKeyValues, VGuiScreenInitData_t* pInitData ); |
|
virtual void OnTick(); |
|
|
|
private: |
|
void UpdateTextFields( C_PropPortalStatsDisplay *pPropPortalStatsDisplay ); |
|
void UpdateMedals( C_PropPortalStatsDisplay *pPropPortalStatsDisplay ); |
|
|
|
private: |
|
vgui::Label *m_pNumPlayerLabel; |
|
vgui::Label *m_pNumGoalLabel; |
|
vgui::Label *m_pCheatedLabel; |
|
|
|
float m_flNextDigitRandomizeTime; //next time to grab a new digit while scrolling random digits |
|
//in un-decoded digits |
|
int m_iLastRandomInt; //store the random digit between new rand calls |
|
|
|
bool m_bInitLabelColor; |
|
|
|
Color m_cPass; |
|
Color m_cFail; |
|
Color m_cUnknown; |
|
Color m_cInvisible; |
|
}; |
|
|
|
|
|
DECLARE_VGUI_SCREEN_FACTORY( CPortalStatsDisplayScreen, "portal_stats_display_screen" ); |
|
|
|
//----------------------------------------------------------------------------- |
|
// Constructor: |
|
//----------------------------------------------------------------------------- |
|
CPortalStatsDisplayScreen::CPortalStatsDisplayScreen( vgui::Panel *parent, const char *panelName ) |
|
: BaseClass( parent, "CPortalStatsDisplayScreen", vgui::scheme()->LoadSchemeFromFileEx( enginevgui->GetPanel( PANEL_CLIENTDLL ), "resource/PortalStatsDisplayScreen.res", "PortalStatsDisplayScreens" ) ) |
|
{ |
|
m_pNumPlayerLabel = new vgui::Label( this, "NumPlayer", "" ); |
|
m_pNumGoalLabel = new vgui::Label( this, "NumGoal", "" ); |
|
m_pCheatedLabel = new vgui::Label( this, "CheatedLabel", "" ); |
|
|
|
m_flNextDigitRandomizeTime = 0; |
|
m_iLastRandomInt = 0; |
|
|
|
m_bInitLabelColor = true; |
|
} |
|
|
|
CPortalStatsDisplayScreen::~CPortalStatsDisplayScreen() |
|
{ |
|
} |
|
|
|
void CPortalStatsDisplayScreen::ApplySchemeSettings( IScheme *pScheme ) |
|
{ |
|
assert( pScheme ); |
|
|
|
m_cPass = pScheme->GetColor( "CPortalStatsDisplayScreen_Pass", GetFgColor() ); |
|
m_cFail = pScheme->GetColor( "CPortalStatsDisplayScreen_Fail", GetFgColor() ); |
|
m_cUnknown = pScheme->GetColor( "CPortalStatsDisplayScreen_Unknown", GetFgColor() ); |
|
m_cInvisible = Color( 0, 0, 0, 0 ); |
|
|
|
if( m_bInitLabelColor ) |
|
{ |
|
m_pNumPlayerLabel->SetFgColor( m_cUnknown ); |
|
m_pNumGoalLabel->SetFgColor( m_cUnknown ); |
|
|
|
m_bInitLabelColor = false; |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Initialization |
|
//----------------------------------------------------------------------------- |
|
bool CPortalStatsDisplayScreen::Init( KeyValues* pKeyValues, VGuiScreenInitData_t* pInitData ) |
|
{ |
|
// Make sure we get ticked... |
|
vgui::ivgui()->AddTickSignal( GetVPanel() ); |
|
|
|
if (!BaseClass::Init(pKeyValues, pInitData)) |
|
return false; |
|
|
|
return true; |
|
} |
|
|
|
void MakeTimeString( CFmtStr &str, int iHours, int iMinutes, int iSeconds ) |
|
{ |
|
if ( iHours ) |
|
{ |
|
if ( iMinutes < 10 ) |
|
{ |
|
if ( iSeconds < 10 ) |
|
str.sprintf( "%d:0%d:0%d", iHours, iMinutes, iSeconds ); |
|
else |
|
str.sprintf( "%d:0%d:%d", iHours, iMinutes, iSeconds ); |
|
} |
|
else |
|
{ |
|
if ( iSeconds < 10 ) |
|
str.sprintf( "%d:%d:0%d", iHours, iMinutes, iSeconds ); |
|
else |
|
str.sprintf( "%d:%d:%d", iHours, iMinutes, iSeconds ); |
|
} |
|
} |
|
else |
|
{ |
|
if ( iSeconds < 10 ) |
|
str.sprintf( "%d:0%d", iMinutes, iSeconds ); |
|
else |
|
str.sprintf( "%d:%d", iMinutes, iSeconds ); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Update the display string |
|
//----------------------------------------------------------------------------- |
|
void CPortalStatsDisplayScreen::OnTick() |
|
{ |
|
BaseClass::OnTick(); |
|
|
|
if ( g_PropPortalStatsDisplays.Count() <= 0 ) |
|
return; |
|
|
|
C_PropPortalStatsDisplay *pPropPortalStatsDisplay = NULL; |
|
|
|
for ( int iDisplayScreens = 0; iDisplayScreens < g_PropPortalStatsDisplays.Count(); ++iDisplayScreens ) |
|
{ |
|
C_PropPortalStatsDisplay *pPropPortalStatsDisplayTemp = g_PropPortalStatsDisplays[ iDisplayScreens ]; |
|
if ( pPropPortalStatsDisplayTemp && pPropPortalStatsDisplayTemp->IsEnabled() ) |
|
{ |
|
pPropPortalStatsDisplay = pPropPortalStatsDisplayTemp; |
|
break; |
|
} |
|
} |
|
|
|
if( !pPropPortalStatsDisplay ) |
|
{ |
|
// All display screens are disabled |
|
SetVisible( false ); |
|
return; |
|
} |
|
|
|
SetVisible( true ); |
|
|
|
UpdateTextFields( pPropPortalStatsDisplay ); |
|
UpdateMedals( pPropPortalStatsDisplay ); |
|
} |
|
|
|
void CPortalStatsDisplayScreen::UpdateTextFields( C_PropPortalStatsDisplay *pPropPortalStatsDisplay ) |
|
{ |
|
bool bIsTime = pPropPortalStatsDisplay->IsTime(); |
|
float fNumPlayer = pPropPortalStatsDisplay->GetNumPlayerDisplay(); |
|
float fNumGoal = pPropPortalStatsDisplay->GetNumGoalDisplay(); |
|
|
|
// Figure out colors |
|
|
|
Color *( pColors[ 3 ] ) = { &m_cUnknown, &m_cFail, &m_cPass }; |
|
|
|
int iColor = pPropPortalStatsDisplay->GetGoalSuccess() + 1; |
|
|
|
m_pNumPlayerLabel->SetFgColor( ( fNumPlayer != 0.0f ) ? ( *pColors[ iColor ] ) : ( m_cInvisible ) ); |
|
m_pNumGoalLabel->SetFgColor( ( pPropPortalStatsDisplay->GetGoalVisible() ) ? ( *pColors[ iColor ] ) : ( m_cInvisible ) ); |
|
|
|
// Fill in labels |
|
|
|
CFmtStr str; |
|
|
|
if ( !bIsTime ) |
|
{ |
|
str.sprintf( "%.0f", fNumPlayer ); |
|
m_pNumPlayerLabel->SetText( str ); |
|
|
|
str.sprintf( "%.0f", fNumGoal ); |
|
m_pNumGoalLabel->SetText( str ); |
|
} |
|
else |
|
{ |
|
// break seconds into mnutes and seconds |
|
int iMinutes = static_cast<int>( fNumPlayer / 60.0f ); |
|
int iHours = iMinutes / 60; |
|
iMinutes %= 60; |
|
int iSeconds = static_cast<int>( fNumPlayer ) % 60; |
|
MakeTimeString( str, iHours, iMinutes, iSeconds ); |
|
m_pNumPlayerLabel->SetText( str ); |
|
|
|
// break seconds into mnutes and seconds |
|
iMinutes = static_cast<int>( fNumGoal / 60.0f ); |
|
iHours = iMinutes / 60; |
|
iMinutes %= 60; |
|
iSeconds = static_cast<int>( fNumGoal ) % 60; |
|
MakeTimeString( str, iHours, iMinutes, iSeconds ); |
|
m_pNumGoalLabel->SetText( str ); |
|
} |
|
|
|
// Draw cheated label when needed |
|
m_pCheatedLabel->SetVisible( pPropPortalStatsDisplay->HasCheated() ); |
|
} |
|
|
|
int GetMedalOffset( int iObjective, int iLevel ) |
|
{ |
|
return iObjective * 6 + ( 2 - iLevel ) * 2; |
|
} |
|
|
|
void CPortalStatsDisplayScreen::UpdateMedals( C_PropPortalStatsDisplay *pPropPortalStatsDisplay ) |
|
{ |
|
// Get the index of the first medal image |
|
int iFirstChildIndex = FindChildIndexByName( TESTCHAMBER_STATS_FIRST_MEDAL ); |
|
|
|
CBitmapPanel *pBitmapPanel; |
|
|
|
// Loop through all the goals |
|
for ( int iGoal = 0; iGoal < PORTAL_LEVEL_STAT_TOTAL; ++iGoal ) |
|
{ |
|
int iMedalComplete = -1; |
|
|
|
// Loop through bronze, silver, and gold |
|
for ( int iLevel = 0; iLevel < 3; ++iLevel ) |
|
{ |
|
if ( pPropPortalStatsDisplay->IsMedalCompleted( iLevel ) ) |
|
iMedalComplete = iLevel; |
|
} |
|
|
|
// Loop through bronze, silver, and gold |
|
for ( int iLevel = 0; iLevel < 3; ++iLevel ) |
|
{ |
|
int iMedalIndex = iFirstChildIndex + GetMedalOffset( iGoal, iLevel ); |
|
|
|
if ( iGoal != pPropPortalStatsDisplay->GetDisplayObjective() ) |
|
{ |
|
// Set both invisible |
|
pBitmapPanel = dynamic_cast<CBitmapPanel*>( GetChild( iMedalIndex ) ); |
|
pBitmapPanel->SetVisible( false ); |
|
|
|
// Set if "no medal" is visible |
|
pBitmapPanel = dynamic_cast<CBitmapPanel*>( GetChild( iMedalIndex + 1 ) ); |
|
pBitmapPanel->SetVisible( false ); |
|
|
|
} |
|
else |
|
{ |
|
// Set if medal is visible |
|
pBitmapPanel = dynamic_cast<CBitmapPanel*>( GetChild( iMedalIndex ) ); |
|
pBitmapPanel->SetVisible( ( iLevel == iMedalComplete ) ? ( true ) : ( false ) ); |
|
|
|
// Set if "no medal" is visible |
|
pBitmapPanel = dynamic_cast<CBitmapPanel*>( GetChild( iMedalIndex + 1 ) ); |
|
pBitmapPanel->SetVisible( ( iMedalComplete == -1 && iLevel == 0 ) ? ( true ) : ( false ) ); |
|
} |
|
} |
|
} |
|
|
|
// Get the index of the first pointer |
|
iFirstChildIndex = FindChildIndexByName( TESTCHAMBER_STATS_FIRST_MEDAL_POINTER ); |
|
|
|
// Loop through bronze, silver, and gold |
|
for ( int iLevel = 0; iLevel < 3; ++iLevel ) |
|
{ |
|
pBitmapPanel = dynamic_cast<CBitmapPanel*>( GetChild( iFirstChildIndex + iLevel ) ); |
|
pBitmapPanel->SetVisible( ( iLevel == pPropPortalStatsDisplay->GetGoalLevelDisplay() ) ? ( true ) : ( false ) ); |
|
} |
|
|
|
int iSubjectReaction = pPropPortalStatsDisplay->GetGoalSuccess() + 1; |
|
|
|
// Get the index of the first subject reaction |
|
iFirstChildIndex = FindChildIndexByName( TESTCHAMBER_STATS_FIRST_SUBJECT_REACTION ); |
|
|
|
// Loop through idle, happy, sad |
|
for ( int iReaction = 0; iReaction < 3; ++iReaction ) |
|
{ |
|
pBitmapPanel = dynamic_cast<CBitmapPanel*>( GetChild( iFirstChildIndex + iReaction ) ); |
|
pBitmapPanel->SetVisible( ( iReaction == iSubjectReaction ) ? ( true ) : ( false ) ); |
|
} |
|
} |