refactor: extract IPlatformLeaderboard from LeaderboardManager

This commit is contained in:
MatthewBeshay
2026-04-02 15:36:42 +11:00
parent e57105c5b3
commit 7b1a6092e1
8 changed files with 272 additions and 284 deletions
@@ -4,14 +4,14 @@
#include "Minecraft.Client/Common/src/Leaderboards/LeaderboardManager.h" #include "Minecraft.Client/Common/src/Leaderboards/LeaderboardManager.h"
LeaderboardInterface::LeaderboardInterface(LeaderboardManager* man) { LeaderboardInterface::LeaderboardInterface(IPlatformLeaderboard* man) {
m_manager = man; m_manager = man;
m_pending = false; m_pending = false;
m_filter = (LeaderboardManager::EFilterMode)-1; m_filter = (IPlatformLeaderboard::EFilterMode)-1;
m_callback = nullptr; m_callback = nullptr;
m_difficulty = 0; m_difficulty = 0;
m_type = LeaderboardManager::eStatsType_UNDEFINED; m_type = IPlatformLeaderboard::eStatsType_UNDEFINED;
m_startIndex = 0; m_startIndex = 0;
m_readCount = 0; m_readCount = 0;
@@ -25,9 +25,9 @@ LeaderboardInterface::~LeaderboardInterface() {
void LeaderboardInterface::ReadStats_Friends( void LeaderboardInterface::ReadStats_Friends(
LeaderboardReadListener* callback, int difficulty, LeaderboardReadListener* callback, int difficulty,
LeaderboardManager::EStatsType type, PlayerUID myUID, IPlatformLeaderboard::EStatsType type, PlayerUID myUID,
unsigned int startIndex, unsigned int readCount) { unsigned int startIndex, unsigned int readCount) {
m_filter = LeaderboardManager::eFM_Friends; m_filter = IPlatformLeaderboard::eFM_Friends;
m_pending = true; m_pending = true;
m_callback = callback; m_callback = callback;
@@ -42,9 +42,9 @@ void LeaderboardInterface::ReadStats_Friends(
void LeaderboardInterface::ReadStats_MyScore( void LeaderboardInterface::ReadStats_MyScore(
LeaderboardReadListener* callback, int difficulty, LeaderboardReadListener* callback, int difficulty,
LeaderboardManager::EStatsType type, PlayerUID myUID, IPlatformLeaderboard::EStatsType type, PlayerUID myUID,
unsigned int readCount) { unsigned int readCount) {
m_filter = LeaderboardManager::eFM_MyScore; m_filter = IPlatformLeaderboard::eFM_MyScore;
m_pending = true; m_pending = true;
m_callback = callback; m_callback = callback;
@@ -58,9 +58,9 @@ void LeaderboardInterface::ReadStats_MyScore(
void LeaderboardInterface::ReadStats_TopRank( void LeaderboardInterface::ReadStats_TopRank(
LeaderboardReadListener* callback, int difficulty, LeaderboardReadListener* callback, int difficulty,
LeaderboardManager::EStatsType type, unsigned int startIndex, IPlatformLeaderboard::EStatsType type, unsigned int startIndex,
unsigned int readCount) { unsigned int readCount) {
m_filter = LeaderboardManager::eFM_TopRank; m_filter = IPlatformLeaderboard::eFM_TopRank;
m_pending = true; m_pending = true;
m_callback = callback; m_callback = callback;
@@ -83,14 +83,14 @@ void LeaderboardInterface::tick() {
bool LeaderboardInterface::callManager() { bool LeaderboardInterface::callManager() {
switch (m_filter) { switch (m_filter) {
case LeaderboardManager::eFM_Friends: case IPlatformLeaderboard::eFM_Friends:
return m_manager->ReadStats_Friends(m_callback, m_difficulty, return m_manager->ReadStats_Friends(m_callback, m_difficulty,
m_type, m_myUID, m_startIndex, m_type, m_myUID, m_startIndex,
m_readCount); m_readCount);
case LeaderboardManager::eFM_MyScore: case IPlatformLeaderboard::eFM_MyScore:
return m_manager->ReadStats_MyScore(m_callback, m_difficulty, return m_manager->ReadStats_MyScore(m_callback, m_difficulty,
m_type, m_myUID, m_readCount); m_type, m_myUID, m_readCount);
case LeaderboardManager::eFM_TopRank: case IPlatformLeaderboard::eFM_TopRank:
return m_manager->ReadStats_TopRank( return m_manager->ReadStats_TopRank(
m_callback, m_difficulty, m_type, m_startIndex, m_readCount); m_callback, m_difficulty, m_type, m_startIndex, m_readCount);
default: default:
@@ -6,30 +6,30 @@
// 4J-JEV: Simple interface for handling ReadStat failures. // 4J-JEV: Simple interface for handling ReadStat failures.
class LeaderboardInterface { class LeaderboardInterface {
private: private:
LeaderboardManager* m_manager; IPlatformLeaderboard* m_manager;
bool m_pending; bool m_pending;
// Arguments. // Arguments.
LeaderboardManager::EFilterMode m_filter; IPlatformLeaderboard::EFilterMode m_filter;
LeaderboardReadListener* m_callback; LeaderboardReadListener* m_callback;
int m_difficulty; int m_difficulty;
LeaderboardManager::EStatsType m_type; IPlatformLeaderboard::EStatsType m_type;
PlayerUID m_myUID; PlayerUID m_myUID;
unsigned int m_startIndex; unsigned int m_startIndex;
unsigned int m_readCount; unsigned int m_readCount;
public: public:
LeaderboardInterface(LeaderboardManager* man); LeaderboardInterface(IPlatformLeaderboard* man);
~LeaderboardInterface(); ~LeaderboardInterface();
void ReadStats_Friends(LeaderboardReadListener* callback, int difficulty, void ReadStats_Friends(LeaderboardReadListener* callback, int difficulty,
LeaderboardManager::EStatsType type, PlayerUID myUID, IPlatformLeaderboard::EStatsType type, PlayerUID myUID,
unsigned int startIndex, unsigned int readCount); unsigned int startIndex, unsigned int readCount);
void ReadStats_MyScore(LeaderboardReadListener* callback, int difficulty, void ReadStats_MyScore(LeaderboardReadListener* callback, int difficulty,
LeaderboardManager::EStatsType type, PlayerUID myUID, IPlatformLeaderboard::EStatsType type, PlayerUID myUID,
unsigned int readCount); unsigned int readCount);
void ReadStats_TopRank(LeaderboardReadListener* callback, int difficulty, void ReadStats_TopRank(LeaderboardReadListener* callback, int difficulty,
LeaderboardManager::EStatsType type, IPlatformLeaderboard::EStatsType type,
unsigned int startIndex, unsigned int readCount); unsigned int startIndex, unsigned int readCount);
void CancelOperation(); void CancelOperation();
@@ -80,7 +80,7 @@ void LeaderboardManager::printStats(ReadView& view) {
"\tnumQueries=%i\n", "\tnumQueries=%i\n",
view.m_numQueries); view.m_numQueries);
for (int i = 0; i < view.m_numQueries; i++) { for (unsigned int i = 0; i < view.m_numQueries; i++) {
ReadScore score = view.m_queries[i]; ReadScore score = view.m_queries[i];
app.DebugPrintf("\tname='%s'\n", app.DebugPrintf("\tname='%s'\n",
@@ -95,8 +95,8 @@ void LeaderboardManager::printStats(ReadView& view) {
} }
bool DebugReadListener::OnStatsReadComplete( bool DebugReadListener::OnStatsReadComplete(
LeaderboardManager::eStatsReturn success, int numResults, IPlatformLeaderboard::eStatsReturn success, int numResults,
LeaderboardManager::ViewOut results) { IPlatformLeaderboard::ViewOut results) {
app.DebugPrintf("[DebugReadListener] OnStatsReadComplete, %s:\n", app.DebugPrintf("[DebugReadListener] OnStatsReadComplete, %s:\n",
(success ? "success" : "FAILED")); (success ? "success" : "FAILED"));
LeaderboardManager::printStats(results); LeaderboardManager::printStats(results);
@@ -2,187 +2,41 @@
#include <string> #include <string>
#include "4J.Common/4J_Compat.h" #include "platform/IPlatformLeaderboard.h"
// Forward Declarations. class LeaderboardManager : public IPlatformLeaderboard {
class LeaderboardManager;
// READ LISTENTER //
class LeaderboardReadListener;
// ABSTRACT CLASS //
class LeaderboardManager {
public: public:
enum eStatsReturn {
eStatsReturn_Success = 0,
eStatsReturn_NoResults,
eStatsReturn_NetworkError
};
enum eProperty_Kills {
eProperty_Kills_Zombie = 0,
eProperty_Kills_Skeleton,
eProperty_Kills_Creeper,
eProperty_Kills_Spider,
eProperty_Kills_SpiderJockey,
eProperty_Kills_ZombiePigman,
eProperty_Kills_Slime,
eProperty_Kills_Rating,
eProperty_Kills_Max,
};
enum eProperty_Mining {
eProperty_Mining_Dirt = 0,
eProperty_Mining_Stone,
eProperty_Mining_Sand,
eProperty_Mining_Cobblestone,
eProperty_Mining_Gravel,
eProperty_Mining_Clay,
eProperty_Mining_Obsidian,
eProperty_Mining_Rating,
eProperty_Mining_Max,
};
enum eProperty_Farming {
eProperty_Farming_Egg = 0,
eProperty_Farming_Wheat,
eProperty_Farming_Mushroom,
eProperty_Farming_Sugarcane,
eProperty_Farming_Milk,
eProperty_Farming_Pumpkin,
eProperty_Farming_Rating,
eProperty_Farming_Max,
};
enum eProperty_Travelling {
eProperty_Travelling_Walked = 0,
eProperty_Travelling_Fallen,
eProperty_Travelling_Minecart,
eProperty_Travelling_Boat,
eProperty_Travelling_Rating,
eProperty_Travelling_Max,
};
enum EStatsType {
eStatsType_Travelling = 0,
eStatsType_Mining,
eStatsType_Farming,
eStatsType_Kills,
eStatsType_MAX,
eStatsType_UNDEFINED
};
enum EFilterMode {
eFM_Friends = 0, // Stats belonging to current user's friends
eFM_MyScore, // Stats around the current user's rank
eFM_TopRank, // Stats at the top of the leaderboard
eNumFilterModes,
eFM_UNDEFINED
};
static const std::wstring filterNames[eNumFilterModes]; static const std::wstring filterNames[eNumFilterModes];
typedef struct KillsRecord {
public:
unsigned short m_zombie;
unsigned short m_skeleton;
unsigned short m_creeper;
unsigned short m_spider;
unsigned short m_spiderJockey;
unsigned short m_zombiePigman;
unsigned short m_slime;
} KillsRecord;
typedef struct MiningRecord {
public:
unsigned short m_dirt;
unsigned short m_stone;
unsigned short m_sand;
unsigned short m_cobblestone;
unsigned short m_gravel;
unsigned short m_clay;
unsigned short m_obsidian;
} MiningRecord;
typedef struct FarmingRecord {
public:
unsigned short m_eggs;
unsigned short m_wheat;
unsigned short m_mushroom;
unsigned short m_sugarcane;
unsigned short m_milk;
unsigned short m_pumpkin;
} FarmingRecord;
typedef struct TravellingRecord {
public:
unsigned int m_walked;
unsigned int m_fallen;
unsigned int m_minecart;
unsigned int m_boat;
} TravellingRecord;
public:
static const int RECORD_SIZE = 40; // base32
typedef struct StatsData {
EStatsType m_statsType;
union {
LeaderboardManager::KillsRecord m_kills;
LeaderboardManager::MiningRecord m_mining;
LeaderboardManager::FarmingRecord m_farming;
LeaderboardManager::TravellingRecord m_travelling;
unsigned char m_padding[RECORD_SIZE];
};
} StatsData;
typedef struct RegisterScore {
int m_iPad;
int m_score;
int m_difficulty;
StatsData m_commentData;
} RegisterScore;
typedef struct ReadScore {
// Maximum number of columns in a scoreboard.
static const unsigned int STATSDATA_MAX = 8;
PlayerUID m_uid; // Player's unique identifier.
unsigned long m_rank; // Rank of the player on this scoreboard.
std::wstring m_name; // Player's display name.
unsigned long m_totalScore; // Sum of all the player's scores on this
// leaderboard.
unsigned short m_statsSize; // Iff (m_hasResults): Number of columns on
// this leaderboard.
unsigned long
m_statsData[STATSDATA_MAX]; // Iff (m_hasResults): Player's score
// for each appropriate column.
int m_idsErrorMessage; // Iff (not m_hasResults): error message
// explaining what went wrong.
} ReadScore;
typedef struct ReadView {
unsigned int m_numQueries;
ReadScore* m_queries;
} ReadView;
typedef ReadView ViewOut;
typedef RegisterScore* ViewIn;
public:
LeaderboardManager(); LeaderboardManager();
virtual ~LeaderboardManager() {} virtual ~LeaderboardManager() {}
// Singleton
static IPlatformLeaderboard* Instance() { return m_instance; }
static void DeleteInstance();
// IPlatformLeaderboard pure virtuals — subclasses must implement:
// Tick, OpenSession, CloseSession, DeleteSession, WriteStats,
// FlushStats, CancelOperation, isIdle
// Base implementations for read operations
bool ReadStats_Friends(LeaderboardReadListener* callback, int difficulty,
EStatsType type, PlayerUID myUID,
unsigned int startIndex,
unsigned int readCount) override;
bool ReadStats_MyScore(LeaderboardReadListener* callback, int difficulty,
EStatsType type, PlayerUID myUID,
unsigned int readCount) override;
bool ReadStats_TopRank(LeaderboardReadListener* callback, int difficulty,
EStatsType type, unsigned int startIndex,
unsigned int readCount) override;
static void printStats(ReadView& view);
protected: protected:
virtual void zeroReadParameters(); virtual void zeroReadParameters();
EFilterMode m_eFilterMode; EFilterMode m_eFilterMode;
// Parameters for reading.
int m_difficulty; int m_difficulty;
EStatsType m_statsType; EStatsType m_statsType;
LeaderboardReadListener* m_readListener; LeaderboardReadListener* m_readListener;
@@ -190,66 +44,13 @@ protected:
unsigned int m_startIndex, m_readCount; unsigned int m_startIndex, m_readCount;
private: private:
static LeaderboardManager* static LeaderboardManager* m_instance;
m_instance; // Singleton instance of the LeaderboardManager
public:
static LeaderboardManager* Instance() { return m_instance; }
static void DeleteInstance();
virtual void Tick() = 0;
// Open a session
virtual bool OpenSession() = 0;
// Close a session
virtual void CloseSession() = 0;
// Delete a session
virtual void DeleteSession() = 0;
// Write the given stats
// This is called synchronously and will not free any memory allocated for
// views when it is done
virtual bool WriteStats(unsigned int viewCount, ViewIn views) = 0;
virtual bool ReadStats_Friends(LeaderboardReadListener* callback,
int difficulty, EStatsType type,
PlayerUID myUID, unsigned int startIndex,
unsigned int readCount);
virtual bool ReadStats_MyScore(LeaderboardReadListener* callback,
int difficulty, EStatsType type,
PlayerUID myUID, unsigned int readCount);
virtual bool ReadStats_TopRank(LeaderboardReadListener* callback,
int difficulty, EStatsType type,
unsigned int startIndex,
unsigned int readCount);
// Perform a flush of the stats
virtual void FlushStats() = 0;
// Cancel the current operation
virtual void CancelOperation() = 0;
// Is the leaderboard manager idle.
virtual bool isIdle() = 0;
public:
static void printStats(ReadView& view);
};
class LeaderboardReadListener {
public:
virtual bool OnStatsReadComplete(LeaderboardManager::eStatsReturn ret,
int numResults,
LeaderboardManager::ViewOut results) = 0;
}; };
class DebugReadListener : public LeaderboardReadListener { class DebugReadListener : public LeaderboardReadListener {
public: public:
virtual bool OnStatsReadComplete(LeaderboardManager::eStatsReturn ret, bool OnStatsReadComplete(IPlatformLeaderboard::eStatsReturn ret,
int numResults, int numResults,
LeaderboardManager::ViewOut results); IPlatformLeaderboard::ViewOut results) override;
static DebugReadListener* m_instance; static DebugReadListener* m_instance;
}; };
@@ -120,7 +120,7 @@ UIScene_LeaderboardsMenu::UIScene_LeaderboardsMenu(int iPad, void* initData,
m_currentLeaderboard = 0; m_currentLeaderboard = 0;
m_currentDifficulty = 2; m_currentDifficulty = 2;
SetLeaderboardHeader(); SetLeaderboardHeader();
m_currentFilter = LeaderboardManager::eFM_Friends; m_currentFilter = IPlatformLeaderboard::eFM_Friends;
wchar_t filterBuffer[40]; wchar_t filterBuffer[40];
swprintf(filterBuffer, 40, L"%ls%ls", app.GetString(IDS_LEADERBOARD_FILTER), swprintf(filterBuffer, 40, L"%ls%ls", app.GetString(IDS_LEADERBOARD_FILTER),
@@ -293,24 +293,24 @@ void UIScene_LeaderboardsMenu::handleInput(int iPad, int key, bool repeat,
ui.PlayUISFX(eSFX_Scroll); ui.PlayUISFX(eSFX_Scroll);
switch (m_currentFilter) { switch (m_currentFilter) {
case LeaderboardManager::eFM_Friends: { case IPlatformLeaderboard::eFM_Friends: {
m_currentFilter = LeaderboardManager::eFM_MyScore; m_currentFilter = IPlatformLeaderboard::eFM_MyScore;
wchar_t filterBuffer[40]; wchar_t filterBuffer[40];
swprintf(filterBuffer, 40, L"%ls%ls", swprintf(filterBuffer, 40, L"%ls%ls",
app.GetString(IDS_LEADERBOARD_FILTER), app.GetString(IDS_LEADERBOARD_FILTER),
app.GetString(IDS_LEADERBOARD_FILTER_MYSCORE)); app.GetString(IDS_LEADERBOARD_FILTER_MYSCORE));
m_labelFilter.setLabel(filterBuffer); m_labelFilter.setLabel(filterBuffer);
} break; } break;
case LeaderboardManager::eFM_MyScore: { case IPlatformLeaderboard::eFM_MyScore: {
m_currentFilter = LeaderboardManager::eFM_TopRank; m_currentFilter = IPlatformLeaderboard::eFM_TopRank;
wchar_t filterBuffer[40]; wchar_t filterBuffer[40];
swprintf(filterBuffer, 40, L"%ls%ls", swprintf(filterBuffer, 40, L"%ls%ls",
app.GetString(IDS_LEADERBOARD_FILTER), app.GetString(IDS_LEADERBOARD_FILTER),
app.GetString(IDS_LEADERBOARD_FILTER_OVERALL)); app.GetString(IDS_LEADERBOARD_FILTER_OVERALL));
m_labelFilter.setLabel(filterBuffer); m_labelFilter.setLabel(filterBuffer);
} break; } break;
case LeaderboardManager::eFM_TopRank: { case IPlatformLeaderboard::eFM_TopRank: {
m_currentFilter = LeaderboardManager::eFM_Friends; m_currentFilter = IPlatformLeaderboard::eFM_Friends;
wchar_t filterBuffer[40]; wchar_t filterBuffer[40];
swprintf(filterBuffer, 40, L"%ls%ls", swprintf(filterBuffer, 40, L"%ls%ls",
app.GetString(IDS_LEADERBOARD_FILTER), app.GetString(IDS_LEADERBOARD_FILTER),
@@ -354,39 +354,39 @@ void UIScene_LeaderboardsMenu::ReadStats(int startIndex) {
// app.DebugPrintf("Requesting stats read %d - %d - %d\n", // app.DebugPrintf("Requesting stats read %d - %d - %d\n",
// m_currentLeaderboard, startIndex == -1 ? m_currentFilter : // m_currentLeaderboard, startIndex == -1 ? m_currentFilter :
// LeaderboardManager::eFM_TopRank, m_currentDifficulty); // IPlatformLeaderboard::eFM_TopRank, m_currentDifficulty);
LeaderboardManager::EFilterMode filtermode; IPlatformLeaderboard::EFilterMode filtermode;
if (m_currentFilter == LeaderboardManager::eFM_MyScore || if (m_currentFilter == IPlatformLeaderboard::eFM_MyScore ||
m_currentFilter == LeaderboardManager::eFM_TopRank) { m_currentFilter == IPlatformLeaderboard::eFM_TopRank) {
filtermode = (startIndex == -1 ? m_currentFilter filtermode = (startIndex == -1 ? m_currentFilter
: LeaderboardManager::eFM_TopRank); : IPlatformLeaderboard::eFM_TopRank);
} else { } else {
// 4J-JEV: Friends filter shouldn't switch to toprank. // 4J-JEV: Friends filter shouldn't switch to toprank.
filtermode = m_currentFilter; filtermode = m_currentFilter;
} }
switch (filtermode) { switch (filtermode) {
case LeaderboardManager::eFM_TopRank: { case IPlatformLeaderboard::eFM_TopRank: {
m_interface.ReadStats_TopRank( m_interface.ReadStats_TopRank(
this, m_currentDifficulty, this, m_currentDifficulty,
(LeaderboardManager::EStatsType)m_currentLeaderboard, (IPlatformLeaderboard::EStatsType)m_currentLeaderboard,
m_newEntryIndex, m_newReadSize); m_newEntryIndex, m_newReadSize);
} break; } break;
case LeaderboardManager::eFM_MyScore: { case IPlatformLeaderboard::eFM_MyScore: {
PlayerUID uid; PlayerUID uid;
ProfileManager.GetXUID(ProfileManager.GetPrimaryPad(), &uid, true); ProfileManager.GetXUID(ProfileManager.GetPrimaryPad(), &uid, true);
m_interface.ReadStats_MyScore( m_interface.ReadStats_MyScore(
this, m_currentDifficulty, this, m_currentDifficulty,
(LeaderboardManager::EStatsType)m_currentLeaderboard, (IPlatformLeaderboard::EStatsType)m_currentLeaderboard,
uid /*ignored on PS3*/, m_newReadSize); uid /*ignored on PS3*/, m_newReadSize);
} break; } break;
case LeaderboardManager::eFM_Friends: { case IPlatformLeaderboard::eFM_Friends: {
PlayerUID uid; PlayerUID uid;
ProfileManager.GetXUID(ProfileManager.GetPrimaryPad(), &uid, true); ProfileManager.GetXUID(ProfileManager.GetPrimaryPad(), &uid, true);
m_interface.ReadStats_Friends( m_interface.ReadStats_Friends(
this, m_currentDifficulty, this, m_currentDifficulty,
(LeaderboardManager::EStatsType)m_currentLeaderboard, (IPlatformLeaderboard::EStatsType)m_currentLeaderboard,
uid /*ignored on PS3*/, m_newEntryIndex, m_newReadSize); uid /*ignored on PS3*/, m_newEntryIndex, m_newReadSize);
} break; } break;
default: default:
@@ -399,15 +399,15 @@ void UIScene_LeaderboardsMenu::ReadStats(int startIndex) {
} }
bool UIScene_LeaderboardsMenu::OnStatsReadComplete( bool UIScene_LeaderboardsMenu::OnStatsReadComplete(
LeaderboardManager::eStatsReturn retIn, int numResults, IPlatformLeaderboard::eStatsReturn retIn, int numResults,
LeaderboardManager::ViewOut results) { IPlatformLeaderboard::ViewOut results) {
// CScene_Leaderboards* scene = // CScene_Leaderboards* scene =
// reinterpret_cast<CScene_Leaderboards*>(userdata); // reinterpret_cast<CScene_Leaderboards*>(userdata);
m_isProcessingStatsRead = true; m_isProcessingStatsRead = true;
// bool noResults = LeaderboardManager::Instance()->GetStatsState() != // bool noResults = LeaderboardManager::Instance()->GetStatsState() !=
// XboxLeaderboardManager::eStatsState_Ready; // XboxIPlatformLeaderboard::eStatsState_Ready;
bool ret; bool ret;
// app.DebugPrintf("Leaderboards read %d stats\n", numResults); // app.DebugPrintf("Leaderboards read %d stats\n", numResults);
@@ -495,7 +495,7 @@ bool UIScene_LeaderboardsMenu::RetrieveStats() {
// assert( LeaderboardManager::Instance()->GetStats() != nullptr ); // assert( LeaderboardManager::Instance()->GetStats() != nullptr );
// PXUSER_STATS_READ_RESULTS stats = // PXUSER_STATS_READ_RESULTS stats =
// LeaderboardManager::Instance()->GetStats(); if( m_currentFilter == // LeaderboardManager::Instance()->GetStats(); if( m_currentFilter ==
// LeaderboardManager::eFM_Friends ) // IPlatformLeaderboard::eFM_Friends )
// LeaderboardManager::Instance()->SortFriendStats(); // LeaderboardManager::Instance()->SortFriendStats();
bool isDistanceLeaderboard = bool isDistanceLeaderboard =
@@ -509,7 +509,7 @@ bool UIScene_LeaderboardsMenu::RetrieveStats() {
m_leaderboard.m_entries.clear(); m_leaderboard.m_entries.clear();
m_leaderboard.m_totalEntryCount = m_leaderboard.m_totalEntryCount =
(m_currentFilter == LeaderboardManager::eFM_Friends) (m_currentFilter == IPlatformLeaderboard::eFM_Friends)
? m_newEntriesCount ? m_newEntriesCount
: m_numStats; : m_numStats;
@@ -536,7 +536,7 @@ bool UIScene_LeaderboardsMenu::RetrieveStats() {
// If the filter mode is "My Score" then centre the list around the // If the filter mode is "My Score" then centre the list around the
// entries and select the player's score // entries and select the player's score
if (m_currentFilter == LeaderboardManager::eFM_MyScore) { if (m_currentFilter == IPlatformLeaderboard::eFM_MyScore) {
// Centre the leaderboard list on the entries // Centre the leaderboard list on the entries
m_newTop = GetEntryStartIndex(); m_newTop = GetEntryStartIndex();
@@ -615,7 +615,7 @@ bool UIScene_LeaderboardsMenu::RetrieveStats() {
} }
void UIScene_LeaderboardsMenu::CopyLeaderboardEntry( void UIScene_LeaderboardsMenu::CopyLeaderboardEntry(
LeaderboardManager::ReadScore* statsRow, int leaderboardEntryIndex, IPlatformLeaderboard::ReadScore* statsRow, int leaderboardEntryIndex,
bool isDistanceLeaderboard) { bool isDistanceLeaderboard) {
LeaderboardEntry* leaderboardEntry = LeaderboardEntry* leaderboardEntry =
&(m_leaderboard.m_entries[leaderboardEntryIndex]); &(m_leaderboard.m_entries[leaderboardEntryIndex]);
@@ -632,7 +632,7 @@ void UIScene_LeaderboardsMenu::CopyLeaderboardEntry(
leaderboardEntry->m_idsErrorMessage = statsRow->m_idsErrorMessage; leaderboardEntry->m_idsErrorMessage = statsRow->m_idsErrorMessage;
// Build a row ID // Build a row ID
if (m_currentFilter == LeaderboardManager::eFM_Friends) { if (m_currentFilter == IPlatformLeaderboard::eFM_Friends) {
// If friends don't ID rows by rank // If friends don't ID rows by rank
leaderboardEntry->m_row = leaderboardEntryIndex; leaderboardEntry->m_row = leaderboardEntryIndex;
} else { } else {
@@ -690,9 +690,9 @@ void UIScene_LeaderboardsMenu::CopyLeaderboardEntry(
} }
void UIScene_LeaderboardsMenu::PopulateLeaderboard( void UIScene_LeaderboardsMenu::PopulateLeaderboard(
LeaderboardManager::eStatsReturn ret) { IPlatformLeaderboard::eStatsReturn ret) {
int iValidSlots = SetLeaderboardTitleIcons(); int iValidSlots = SetLeaderboardTitleIcons();
if (ret == LeaderboardManager::eStatsReturn_Success && if (ret == IPlatformLeaderboard::eStatsReturn_Success &&
m_leaderboard.m_totalEntryCount > 0) { m_leaderboard.m_totalEntryCount > 0) {
m_listEntries.setupTitles(app.GetString(IDS_LEADERBOARD_RANK), m_listEntries.setupTitles(app.GetString(IDS_LEADERBOARD_RANK),
app.GetString(IDS_LEADERBOARD_GAMERTAG)); app.GetString(IDS_LEADERBOARD_GAMERTAG));
@@ -771,7 +771,7 @@ void UIScene_LeaderboardsMenu::PopulateLeaderboard(
// Show the no results message // Show the no results message
#if !defined(_WINDOWS64) #if !defined(_WINDOWS64)
// so we check this for other platforms // so we check this for other platforms
if (ret == LeaderboardManager::eStatsReturn_NetworkError) if (ret == IPlatformLeaderboard::eStatsReturn_NetworkError)
m_labelInfo.setLabel(app.GetString(IDS_ERROR_NETWORK)); m_labelInfo.setLabel(app.GetString(IDS_ERROR_NETWORK));
else else
#endif #endif
@@ -78,7 +78,7 @@ private:
unsigned int unsigned int
m_currentLeaderboard; // The current leaderboard selected for view m_currentLeaderboard; // The current leaderboard selected for view
LeaderboardManager::EFilterMode IPlatformLeaderboard::EFilterMode
m_currentFilter; // The current filter selected m_currentFilter; // The current filter selected
unsigned int m_currentDifficulty; // The current difficulty selected unsigned int m_currentDifficulty; // The current difficulty selected
@@ -146,16 +146,16 @@ private:
// Copy the stats from the raw m_stats structure into the m_leaderboards // Copy the stats from the raw m_stats structure into the m_leaderboards
// structure // structure
int m_numStats; int m_numStats;
LeaderboardManager::ViewOut m_stats; IPlatformLeaderboard::ViewOut m_stats;
bool RetrieveStats(); bool RetrieveStats();
// Copy a leaderboard entry from the stats row // Copy a leaderboard entry from the stats row
void CopyLeaderboardEntry(LeaderboardManager::ReadScore* statsRow, void CopyLeaderboardEntry(IPlatformLeaderboard::ReadScore* statsRow,
int leaderboardEntryIndex, int leaderboardEntryIndex,
bool isDistanceLeaderboard); bool isDistanceLeaderboard);
// Populate the XUI leaderboard with the contents of m_leaderboards // Populate the XUI leaderboard with the contents of m_leaderboards
void PopulateLeaderboard(LeaderboardManager::eStatsReturn ret); void PopulateLeaderboard(IPlatformLeaderboard::eStatsReturn ret);
// Set the header text of the leaderboard // Set the header text of the leaderboard
void SetLeaderboardHeader(); void SetLeaderboardHeader();
@@ -165,9 +165,9 @@ private:
// Callback function called when stats read completes, userdata contains // Callback function called when stats read completes, userdata contains
// pointer to instance of CScene_Leaderboards // pointer to instance of CScene_Leaderboards
virtual bool OnStatsReadComplete(LeaderboardManager::eStatsReturn ret, virtual bool OnStatsReadComplete(IPlatformLeaderboard::eStatsReturn ret,
int numResults, int numResults,
LeaderboardManager::ViewOut results); IPlatformLeaderboard::ViewOut results);
virtual void customDraw(IggyCustomDrawCallbackRegion* region); virtual void customDraw(IggyCustomDrawCallbackRegion* region);
+186
View File
@@ -0,0 +1,186 @@
#pragma once
#include <cstdint>
#include <string>
#include "../4J.Common/4J_Compat.h"
class LeaderboardReadListener;
class IPlatformLeaderboard {
public:
enum eStatsReturn {
eStatsReturn_Success = 0,
eStatsReturn_NoResults,
eStatsReturn_NetworkError
};
enum eProperty_Kills {
eProperty_Kills_Zombie = 0,
eProperty_Kills_Skeleton,
eProperty_Kills_Creeper,
eProperty_Kills_Spider,
eProperty_Kills_SpiderJockey,
eProperty_Kills_ZombiePigman,
eProperty_Kills_Slime,
eProperty_Kills_Rating,
eProperty_Kills_Max,
};
enum eProperty_Mining {
eProperty_Mining_Dirt = 0,
eProperty_Mining_Stone,
eProperty_Mining_Sand,
eProperty_Mining_Cobblestone,
eProperty_Mining_Gravel,
eProperty_Mining_Clay,
eProperty_Mining_Obsidian,
eProperty_Mining_Rating,
eProperty_Mining_Max,
};
enum eProperty_Farming {
eProperty_Farming_Egg = 0,
eProperty_Farming_Wheat,
eProperty_Farming_Mushroom,
eProperty_Farming_Sugarcane,
eProperty_Farming_Milk,
eProperty_Farming_Pumpkin,
eProperty_Farming_Rating,
eProperty_Farming_Max,
};
enum eProperty_Travelling {
eProperty_Travelling_Walked = 0,
eProperty_Travelling_Fallen,
eProperty_Travelling_Minecart,
eProperty_Travelling_Boat,
eProperty_Travelling_Rating,
eProperty_Travelling_Max,
};
enum EStatsType {
eStatsType_Travelling = 0,
eStatsType_Mining,
eStatsType_Farming,
eStatsType_Kills,
eStatsType_MAX,
eStatsType_UNDEFINED
};
enum EFilterMode {
eFM_Friends = 0,
eFM_MyScore,
eFM_TopRank,
eNumFilterModes,
eFM_UNDEFINED
};
struct KillsRecord {
unsigned short m_zombie;
unsigned short m_skeleton;
unsigned short m_creeper;
unsigned short m_spider;
unsigned short m_spiderJockey;
unsigned short m_zombiePigman;
unsigned short m_slime;
};
struct MiningRecord {
unsigned short m_dirt;
unsigned short m_stone;
unsigned short m_sand;
unsigned short m_cobblestone;
unsigned short m_gravel;
unsigned short m_clay;
unsigned short m_obsidian;
};
struct FarmingRecord {
unsigned short m_eggs;
unsigned short m_wheat;
unsigned short m_mushroom;
unsigned short m_sugarcane;
unsigned short m_milk;
unsigned short m_pumpkin;
};
struct TravellingRecord {
unsigned int m_walked;
unsigned int m_fallen;
unsigned int m_minecart;
unsigned int m_boat;
};
static constexpr int RECORD_SIZE = 40;
struct StatsData {
EStatsType m_statsType;
union {
KillsRecord m_kills;
MiningRecord m_mining;
FarmingRecord m_farming;
TravellingRecord m_travelling;
unsigned char m_padding[RECORD_SIZE];
};
};
struct RegisterScore {
int m_iPad;
int m_score;
int m_difficulty;
StatsData m_commentData;
};
struct ReadScore {
static constexpr unsigned int STATSDATA_MAX = 8;
PlayerUID m_uid;
unsigned long m_rank;
std::wstring m_name;
unsigned long m_totalScore;
unsigned short m_statsSize;
unsigned long m_statsData[STATSDATA_MAX];
int m_idsErrorMessage;
};
struct ReadView {
unsigned int m_numQueries;
ReadScore* m_queries;
};
using ViewOut = ReadView;
using ViewIn = RegisterScore*;
virtual ~IPlatformLeaderboard() = default;
virtual void Tick() = 0;
[[nodiscard]] virtual bool OpenSession() = 0;
virtual void CloseSession() = 0;
virtual void DeleteSession() = 0;
[[nodiscard]] virtual bool WriteStats(unsigned int viewCount,
ViewIn views) = 0;
virtual bool ReadStats_Friends(LeaderboardReadListener* callback,
int difficulty, EStatsType type,
PlayerUID myUID, unsigned int startIndex,
unsigned int readCount) = 0;
virtual bool ReadStats_MyScore(LeaderboardReadListener* callback,
int difficulty, EStatsType type,
PlayerUID myUID,
unsigned int readCount) = 0;
virtual bool ReadStats_TopRank(LeaderboardReadListener* callback,
int difficulty, EStatsType type,
unsigned int startIndex,
unsigned int readCount) = 0;
virtual void FlushStats() = 0;
virtual void CancelOperation() = 0;
[[nodiscard]] virtual bool isIdle() = 0;
};
class LeaderboardReadListener {
public:
virtual ~LeaderboardReadListener() = default;
virtual bool OnStatsReadComplete(IPlatformLeaderboard::eStatsReturn ret,
int numResults,
IPlatformLeaderboard::ViewOut results) = 0;
};
+1
View File
@@ -1,6 +1,7 @@
#pragma once #pragma once
#include "IPlatformInput.h" #include "IPlatformInput.h"
#include "IPlatformLeaderboard.h"
#include "IPlatformNetwork.h" #include "IPlatformNetwork.h"
#include "IPlatformProfile.h" #include "IPlatformProfile.h"
#include "IPlatformRenderer.h" #include "IPlatformRenderer.h"