summaryrefslogtreecommitdiff
path: root/game/shared/tf/tf_duckleaderboard.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/shared/tf/tf_duckleaderboard.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/shared/tf/tf_duckleaderboard.cpp')
-rw-r--r--game/shared/tf/tf_duckleaderboard.cpp343
1 files changed, 343 insertions, 0 deletions
diff --git a/game/shared/tf/tf_duckleaderboard.cpp b/game/shared/tf/tf_duckleaderboard.cpp
new file mode 100644
index 0000000..5b89e23
--- /dev/null
+++ b/game/shared/tf/tf_duckleaderboard.cpp
@@ -0,0 +1,343 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================
+#include "cbase.h"
+#include "tf_duckleaderboard.h"
+#ifdef CLIENT_DLL
+ #include "vgui_avatarimage.h"
+ #include "tf_item_inventory.h"
+#endif
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include <tier0/memdbgon.h>
+
+//-------------------------------
+const char *g_szDuckLeaderboardNames[] =
+{
+ "TF_DUCK_SCORING_OVERALL_RATING", // TF_DUCK_SCORING_OVERALL_RATING
+ "TF_DUCK_SCORING_PERSONAL_GENERATION", // TF_DUCK_SCORING_PERSONAL_GENERATION
+ "TF_DUCK_SCORING_PERSONAL_PICKUP_OFFENSE", // TF_DUCK_SCORING_PERSONAL_PICKUP_OFFENSE
+ "TF_DUCK_SCORING_PERSONAL_PICKUP_DEFENDED", // TF_DUCK_SCORING_PERSONAL_PICKUP_DEFENDED
+ "TF_DUCK_SCORING_PERSONAL_PICKUP_OBJECTIVE", // TF_DUCK_SCORING_PERSONAL_PICKUP_OBJECTIVE
+ "TF_DUCK_SCORING_TEAM_PICKUP_MY_DUCKS", // TF_DUCK_SCORING_TEAM_PICKUP_MY_DUCKS
+ "TF_DUCK_SCORING_PERSONAL_BONUS_PICKUP", // TF_DUCK_SCORING_PERSONAL_BONUS_PICKUP
+};
+COMPILE_TIME_ASSERT( ARRAYSIZE( g_szDuckLeaderboardNames ) == DUCK_NUM_LEADERBOARDS );
+
+#ifdef CLIENT_DLL
+
+//-----------------------------------------------------------------------------
+CDucksLeaderboard::CDucksLeaderboard( Panel *parent, const char *panelName, const char *pszDuckLeaderboardname )
+ : CTFLeaderboardPanel( parent, panelName )
+ , m_pszDuckLeaderboardName( pszDuckLeaderboardname )
+ , m_pToolTip( NULL )
+{
+ m_pToolTip = new CTFTextToolTip( this );
+ m_pToolTipEmbeddedPanel = new vgui::EditablePanel( this, "TooltipPanel" );
+ m_pToolTipEmbeddedPanel->SetKeyBoardInputEnabled( false );
+ m_pToolTipEmbeddedPanel->SetMouseInputEnabled( false );
+ m_pToolTip->SetEmbeddedPanel( m_pToolTipEmbeddedPanel );
+ m_pToolTip->SetTooltipDelay( 0 );
+}
+
+//-----------------------------------------------------------------------------
+CDucksLeaderboard::~CDucksLeaderboard()
+{}
+
+//-----------------------------------------------------------------------------
+void CDucksLeaderboard::ApplySchemeSettings( IScheme *pScheme )
+{
+ BaseClass::ApplySchemeSettings( pScheme );
+
+ LoadControlSettings( "Resource/UI/econ/DucksLeaderboardPanel.res" );
+}
+
+//-----------------------------------------------------------------------------
+bool CDucksLeaderboard::GetLeaderboardData( CUtlVector< LeaderboardEntry_t* > &scores )
+{
+ return Leaderboards_GetDuckLeaderboard( scores, m_pszDuckLeaderboardName );
+}
+
+//-----------------------------------------------------------------------------
+bool CDucksLeaderboard::UpdateLeaderboards()
+{
+ CUtlVector< LeaderboardEntry_t* > scores;
+ if ( !GetLeaderboardData( scores ) )
+ return false;
+
+ CSteamID localSteamID;
+ if ( steamapicontext && steamapicontext->SteamUser() )
+ {
+ localSteamID = steamapicontext->SteamUser()->GetSteamID();
+ }
+
+ // Scores were empty but the leaderboard query was OK? This will happen while the user
+ // and their friends has no scores. For now, insert a dummy value for the local player.
+ LeaderboardEntry_t dummyentry;
+ if ( scores.IsEmpty() )
+ {
+ dummyentry.m_nScore = 0;
+ dummyentry.m_steamIDUser = localSteamID;
+ scores.AddToTail( &dummyentry );
+ }
+
+ int nStartingIndex = 0;
+ FOR_EACH_VEC( scores, i )
+ {
+ if ( scores[ i ]->m_steamIDUser == localSteamID )
+ {
+ // Try to go 3 past where the player is if we can, then go back 6
+ nStartingIndex = Max( Min( i + 3, scores.Count() ) - 6, 0 );
+ break;
+ }
+ }
+
+ int x=0,y=0;
+ FOR_EACH_VEC( m_vecLeaderboardEntries, i )
+ {
+ Color colorToUse = i % 2 == 1 ? m_OddTextColor : m_EvenTextColor;
+ EditablePanel *pContainer = dynamic_cast< EditablePanel* >( m_vecLeaderboardEntries[i] );
+ int nScoreIndex = nStartingIndex + i;
+ if ( pContainer )
+ {
+ bool bIsEntryVisible = nScoreIndex < scores.Count();
+ pContainer->SetVisible( bIsEntryVisible );
+ pContainer->SetPos( x, y );
+ y += m_yEntryStep;
+ if ( bIsEntryVisible )
+ {
+ const LeaderboardEntry_t *leaderboardEntry = scores[nScoreIndex];
+ const CSteamID &steamID = leaderboardEntry->m_steamIDUser;
+ bool bIsLocalPlayer = steamapicontext && steamapicontext->SteamUser() && steamapicontext->SteamUser()->GetSteamID() == steamID;
+ pContainer->SetDialogVariable( "username", InventoryManager()->PersonaName_Get( steamID.GetAccountID() ) );
+ float flXPToLevel = DUCK_XP_SCALE;
+ const float flPreciseLevel = leaderboardEntry->m_nScore / flXPToLevel;
+ const int nCurrentLevel = floor( flPreciseLevel );
+ const float flPercentToNextLevel = flPreciseLevel - nCurrentLevel;
+ pContainer->SetDialogVariable( "score", nCurrentLevel );
+ ProgressBar* pProgressBar = pContainer->FindControl<ProgressBar>( "ProgressToNextLevel", true );
+ if ( pProgressBar )
+ {
+ pProgressBar->SetProgress( 1.f - flPercentToNextLevel );
+ pProgressBar->SetProgressDirection( ProgressBar::PROGRESS_WEST );
+ //const int nNextLevelXP = ( nCurrentLevel + 1 ) * DUCK_XP_SCALE;
+ pProgressBar->SetTooltip( m_pToolTip, CFmtStr( "%d / %d", leaderboardEntry->m_nScore % DUCK_XP_SCALE, DUCK_XP_SCALE ) );
+ }
+
+ CExLabel *pText = pContainer->FindControl< CExLabel >( "UserName" );
+ if ( pText )
+ {
+ pText->SetColorStr( bIsLocalPlayer ? m_LocalPlayerTextColor : colorToUse );
+ }
+
+ pText = pContainer->FindControl< CExLabel >( "Score" );
+ if ( pText )
+ {
+ pText->SetColorStr( bIsLocalPlayer ? m_LocalPlayerTextColor : colorToUse );
+ }
+
+ CAvatarImagePanel *pAvatar = dynamic_cast< CAvatarImagePanel* >( pContainer->FindChildByName( "AvatarImage" ) );
+ if ( pAvatar )
+ {
+ pAvatar->SetShouldDrawFriendIcon( false );
+ pAvatar->SetPlayer( steamID, k_EAvatarSize32x32 );
+ }
+ }
+ }
+ }
+
+ return true;
+}
+
+
+
+//-----------------------------------------------------------------------------
+CDucksLeaderboardManager::CDucksLeaderboardManager( Panel *parent, const char *panelName )
+ : EditablePanel( parent, panelName )
+ , m_nCurrentPage( 0 )
+ , m_flFadeStartTime( Plat_FloatTime() )
+ , m_pDimmer( NULL )
+{
+ ListenForGameEvent( "gameui_hidden" );
+
+ m_pToolTip = new CTFTextToolTip( this );
+ m_pToolTipEmbeddedPanel = new vgui::EditablePanel( this, "TooltipPanel" );
+ m_pToolTipEmbeddedPanel->SetKeyBoardInputEnabled( false );
+ m_pToolTipEmbeddedPanel->SetMouseInputEnabled( false );
+ m_pToolTip->SetEmbeddedPanel( m_pToolTipEmbeddedPanel );
+ m_pToolTip->SetTooltipDelay( 0 );
+
+ static CSchemaItemDefHandle pDuckBadgeDef( "Duck Badge" );
+ // Prevent users who don't own the badge from opening the duck leaderboards
+ if( CTFPlayerInventory::GetFirstItemOfItemDef( pDuckBadgeDef->GetDefinitionIndex() ) == NULL )
+ {
+ SetVisible( false );
+ MarkForDeletion();
+ return;
+ }
+}
+
+//-----------------------------------------------------------------------------
+void CDucksLeaderboardManager::ApplySchemeSettings( IScheme *pScheme )
+{
+ BaseClass::ApplySchemeSettings( pScheme );
+
+ LoadControlSettings( "Resource/UI/econ/DucksLeaderboards.res" );
+
+ m_pDimmer = FindControl<EditablePanel>( "Dimmer" );
+
+ ShowPage( 0 );
+}
+
+//-----------------------------------------------------------------------------
+void CDucksLeaderboardManager::ApplySettings( KeyValues *inResourceData )
+{
+ BaseClass::ApplySettings( inResourceData );
+
+ m_vecLeaderboards.PurgeAndDeleteElements();
+
+ EditablePanel* pBackgroundPanel = FindControl< EditablePanel >( "Background", true );
+ if ( pBackgroundPanel )
+ {
+ EDuckLeaderboardTypes eShowLeaderboard = TF_DUCK_SCORING_OVERALL_RATING;
+ CDucksLeaderboard *pLeaderboard = new CDucksLeaderboard( pBackgroundPanel, "DuckLeaderboard", g_szDuckLeaderboardNames[eShowLeaderboard] );
+ pLeaderboard->SetDialogVariable( "title", g_pVGuiLocalize->Find( CFmtStr( "#%s", g_szDuckLeaderboardNames[eShowLeaderboard] ) ) );
+ pLeaderboard->SetDialogVariable( "description", g_pVGuiLocalize->Find( CFmtStr( "#%s_Desc", g_szDuckLeaderboardNames[eShowLeaderboard] ) ) );
+ pLeaderboard->InvalidateLayout( true, true );
+ m_vecLeaderboards.AddToTail( pLeaderboard );
+
+ EditablePanel *pStatsPanel = pBackgroundPanel->FindControl<EditablePanel>( "SecondaryStatsContainer", true );
+ if ( pStatsPanel )
+ {
+ m_vecLeaderboards.AddToTail( pStatsPanel );
+
+ Panel* pScoresContainer = pStatsPanel->FindChildByName( "ScoresContainer", true );
+
+ if ( pScoresContainer )
+ {
+ CSteamID localSteamID;
+ if ( steamapicontext && steamapicontext->SteamUser() )
+ {
+ localSteamID= steamapicontext->SteamUser()->GetSteamID();
+ }
+
+ KeyValues* pScoreEntryKVs = inResourceData->FindKey( "ScoreEntryKVs" );
+ if ( pScoreEntryKVs )
+ {
+ for( int i = 1; i < DUCK_NUM_LEADERBOARDS; ++i )
+ {
+ EditablePanel *pNewEntry = new EditablePanel( pScoresContainer , "Score%d" );
+
+ pNewEntry->ApplySettings( pScoreEntryKVs );
+ pNewEntry->SetDialogVariable( "name", g_pVGuiLocalize->Find( CFmtStr( "#%s", g_szDuckLeaderboardNames[i] ) ) );
+ pNewEntry->SetTooltip( m_pToolTip, CFmtStr( "#%s_Desc", g_szDuckLeaderboardNames[i] ) );
+ pNewEntry->SetVisible( true );
+ pNewEntry->SetPos( 0, m_iScoreStep * i ); // This is off by 1, but that's what we want. It starts at 1, but we want it to start lower
+ // so it matches the leaderboard entries
+
+ CUtlVector< LeaderboardEntry_t* > scores;
+ Leaderboards_GetDuckLeaderboard( scores, g_szDuckLeaderboardNames[i] );
+
+ int nScore = 0;
+ FOR_EACH_VEC( scores, j )
+ {
+ if ( scores[j]->m_steamIDUser == localSteamID )
+ {
+ nScore = scores[j]->m_nScore;
+ break;
+ }
+ }
+
+ pNewEntry->SetDialogVariable( "score", nScore );
+ }
+ }
+ }
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+void CDucksLeaderboardManager::OnCommand( const char *command )
+{
+ if ( FStrEq( command, "close" ) )
+ {
+ SetVisible( false );
+ MarkForDeletion();
+ return;
+ }
+ else if ( FStrEq( command, "nextpage" ) )
+ {
+ NextPage();
+ }
+ else if ( FStrEq( command, "prevpage" ) )
+ {
+ PrevPage();
+ }
+}
+
+//-----------------------------------------------------------------------------
+void CDucksLeaderboardManager::FireGameEvent( IGameEvent *event )
+{
+ if ( FStrEq( event->GetName(), "gameui_hidden" ) )
+ {
+ SetVisible( false );
+ MarkForDeletion();
+ return;
+ }
+}
+
+
+void CDucksLeaderboardManager::OnThink()
+{
+ if ( m_pDimmer )
+ {
+ float flDelta = Plat_FloatTime() - m_flFadeStartTime;
+ float flAlpha = RemapValClamped( flDelta, 0.f, 0.2f, 0.f, 253.f );
+ m_pDimmer->SetAlpha( flAlpha );
+ }
+}
+
+//-----------------------------------------------------------------------------
+void CDucksLeaderboardManager::NextPage()
+{
+ ++m_nCurrentPage;
+ if ( m_nCurrentPage == m_vecLeaderboards.Count() )
+ {
+ m_nCurrentPage = 0;
+ }
+
+ ShowPage( m_nCurrentPage );
+}
+
+//-----------------------------------------------------------------------------
+void CDucksLeaderboardManager::PrevPage()
+{
+ --m_nCurrentPage;
+ if ( m_nCurrentPage < 0 )
+ {
+ m_nCurrentPage = m_vecLeaderboards.Count() - 1;
+ }
+
+ ShowPage( m_nCurrentPage );
+}
+
+//-----------------------------------------------------------------------------
+void CDucksLeaderboardManager::ShowPage( int nPage )
+{
+ for( int i=0; i < m_vecLeaderboards.Count(); ++i )
+ {
+ m_vecLeaderboards[i]->SetVisible( i == nPage );
+ }
+
+ EditablePanel* pBackgroundPanel = dynamic_cast< EditablePanel* >( FindChildByName( "Background", true ) );
+ if ( pBackgroundPanel )
+ {
+ pBackgroundPanel->SetDialogVariable( "pagenumber", CFmtStr( "%d/%d", nPage + 1, m_vecLeaderboards.Count() ) );
+ }
+}
+
+
+#endif