hl2_src-leak-2017/src/game/client/portal/vgui_portal_stats_display_s...

305 lines
9.1 KiB
C++

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