269 lines
6.2 KiB
C++
269 lines
6.2 KiB
C++
#pragma once
|
|
|
|
// Forward Declarations.
|
|
class LeaderboardManager;
|
|
|
|
// READ LISTENTER //
|
|
class LeaderboardReadListener;
|
|
|
|
// ABSTRACT CLASS //
|
|
class LeaderboardManager
|
|
{
|
|
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 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:
|
|
#ifdef _XBOX
|
|
typedef XSESSION_VIEW_PROPERTIES *ViewIn;
|
|
typedef PXUSER_STATS_READ_RESULTS ViewOut;
|
|
#else
|
|
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.
|
|
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;
|
|
#endif
|
|
|
|
|
|
public:
|
|
LeaderboardManager();
|
|
virtual ~LeaderboardManager() {}
|
|
|
|
protected:
|
|
virtual void zeroReadParameters();
|
|
|
|
EFilterMode m_eFilterMode;
|
|
|
|
// Parameters for reading.
|
|
int m_difficulty;
|
|
EStatsType m_statsType;
|
|
LeaderboardReadListener *m_readListener;
|
|
PlayerUID m_myXUID;
|
|
unsigned int m_startIndex, m_readCount;
|
|
|
|
private:
|
|
static LeaderboardManager *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:
|
|
#ifndef _XBOX
|
|
static void printStats(ReadView &view);
|
|
#endif
|
|
};
|
|
|
|
class LeaderboardReadListener
|
|
{
|
|
public:
|
|
#ifdef _XBOX
|
|
virtual bool OnStatsReadComplete(bool success, int numResults, LeaderboardManager::ViewOut results) = 0;
|
|
#else
|
|
virtual bool OnStatsReadComplete(LeaderboardManager::eStatsReturn ret, int numResults, LeaderboardManager::ViewOut results) = 0;
|
|
#endif
|
|
};
|
|
|
|
#ifndef _XBOX
|
|
class DebugReadListener : public LeaderboardReadListener
|
|
{
|
|
public:
|
|
virtual bool OnStatsReadComplete(LeaderboardManager::eStatsReturn ret, int numResults, LeaderboardManager::ViewOut results);
|
|
static DebugReadListener *m_instance;
|
|
};
|
|
#endif
|