mirror of
https://github.com/4jcraft/4jcraft.git
synced 2026-04-27 17:36:49 +00:00
166 lines
6 KiB
C++
166 lines
6 KiB
C++
#pragma once
|
|
|
|
#include "UIScene.h"
|
|
#include "../Leaderboards/LeaderboardInterface.h"
|
|
|
|
class UIScene_LeaderboardsMenu : public UIScene,
|
|
public LeaderboardReadListener {
|
|
private:
|
|
// 4J Stu - Because the kills leaderboard doesn't a peaceful entry there are
|
|
// some special handling to make it skip that. We have re-arranged the order
|
|
// of the leaderboards so I am making this in case we do it again. 4J Stu -
|
|
// Made it a member of the class, rather than a #define
|
|
static const int LEADERBOARD_KILLS_POSITION = 3;
|
|
|
|
static const int NUM_LEADERBOARDS =
|
|
4; // 6; //Number of leaderboards
|
|
static const int NUM_ENTRIES = 101; // Cache up to this many entries
|
|
static const int READ_SIZE = 15; // Read this many entries at a time
|
|
|
|
struct LeaderboardDescriptor {
|
|
unsigned int m_columnCount;
|
|
bool m_isDistanceLeaderboard;
|
|
unsigned int m_title;
|
|
|
|
LeaderboardDescriptor(unsigned int columnCount,
|
|
bool isDistanceLeaderboard, unsigned int title) {
|
|
m_columnCount = columnCount;
|
|
m_isDistanceLeaderboard = isDistanceLeaderboard;
|
|
m_title = title;
|
|
}
|
|
};
|
|
|
|
static const LeaderboardDescriptor LEADERBOARD_DESCRIPTORS[NUM_LEADERBOARDS]
|
|
[4];
|
|
static const int TitleIcons[NUM_LEADERBOARDS][7];
|
|
|
|
struct LeaderboardEntry {
|
|
PlayerUID m_xuid;
|
|
unsigned int
|
|
m_row; // Row identifier for passing to Iggy as a unique identifier
|
|
unsigned int m_rank;
|
|
wchar_t m_wcRank[12];
|
|
wchar_t m_gamerTag[XUSER_NAME_SIZE + 1];
|
|
// int m_locale;
|
|
unsigned int m_columns[7];
|
|
wchar_t m_wcColumns[7][12];
|
|
bool m_bPlayer; // Is the player
|
|
bool m_bOnline; // Is online
|
|
bool m_bFriend; // Is friend
|
|
bool m_bRequestedFriend; // Friend request sent but not answered
|
|
int m_idsErrorMessage; // 4J-JEV: Non-zero if this entry has an error
|
|
// message instead of results.
|
|
};
|
|
|
|
struct Leaderboard {
|
|
unsigned int m_totalEntryCount; // Either total number of entries in
|
|
// leaderboard, or total number of
|
|
// results for a friends query
|
|
std::vector<LeaderboardEntry> m_entries;
|
|
unsigned int m_numColumns;
|
|
};
|
|
|
|
Leaderboard m_leaderboard; // All leaderboard data for the currently
|
|
// selected filter
|
|
|
|
unsigned int
|
|
m_currentLeaderboard; // The current leaderboard selected for view
|
|
LeaderboardManager::EFilterMode
|
|
m_currentFilter; // The current filter selected
|
|
unsigned int m_currentDifficulty; // The current difficulty selected
|
|
|
|
unsigned int m_newEntryIndex; // Index of the first entry being read
|
|
unsigned int
|
|
m_newReadSize; // Number of entries in the current read operation
|
|
|
|
unsigned int m_newEntriesCount; // Number of new entries in this update
|
|
|
|
int m_newTop; // Index of the element that should be at the top of the list
|
|
int m_newSel; // Index of the element that should be selected in the list
|
|
|
|
bool m_isProcessingStatsRead;
|
|
bool m_bPopulatedOnce;
|
|
bool m_bReady;
|
|
|
|
LeaderboardInterface m_interface;
|
|
|
|
UIControl_LeaderboardList m_listEntries;
|
|
UIControl_Label m_labelFilter, m_labelLeaderboard, m_labelEntries,
|
|
m_labelInfo;
|
|
UI_BEGIN_MAP_ELEMENTS_AND_NAMES(UIScene)
|
|
UI_MAP_ELEMENT(m_listEntries, "Gamers")
|
|
|
|
UI_MAP_ELEMENT(m_labelFilter, "Filter")
|
|
UI_MAP_ELEMENT(m_labelLeaderboard, "Leaderboard")
|
|
UI_MAP_ELEMENT(m_labelEntries, "Entries")
|
|
UI_MAP_ELEMENT(m_labelInfo, "Info")
|
|
UI_END_MAP_ELEMENTS_AND_NAMES()
|
|
|
|
static int ExitLeaderboards(void* pParam, int iPad,
|
|
C4JStorage::EMessageResult result);
|
|
|
|
public:
|
|
UIScene_LeaderboardsMenu(int iPad, void* initData, UILayer* parentLayer);
|
|
~UIScene_LeaderboardsMenu();
|
|
|
|
virtual void updateTooltips();
|
|
virtual void updateComponents();
|
|
|
|
virtual EUIScene getSceneType() { return eUIScene_LeaderboardsMenu; }
|
|
|
|
// Returns true if this scene has focus for the pad passed in
|
|
virtual bool hasFocus(int iPad) { return bHasFocus; }
|
|
virtual void handleTimerComplete(int id);
|
|
|
|
private:
|
|
int GetEntryStartIndex();
|
|
|
|
protected:
|
|
virtual std::wstring getMoviePath();
|
|
|
|
public:
|
|
virtual void tick();
|
|
virtual void handleReload();
|
|
|
|
// INPUT
|
|
virtual void handleInput(int iPad, int key, bool repeat, bool pressed,
|
|
bool released, bool& handled);
|
|
|
|
private:
|
|
// Start a read request with the current parameters
|
|
void ReadStats(int startIndex);
|
|
|
|
// Copy the stats from the raw m_stats structure into the m_leaderboards
|
|
// structure
|
|
int m_numStats;
|
|
LeaderboardManager::ViewOut m_stats;
|
|
bool RetrieveStats();
|
|
|
|
// Copy a leaderboard entry from the stats row
|
|
void CopyLeaderboardEntry(LeaderboardManager::ReadScore* statsRow,
|
|
int leaderboardEntryIndex,
|
|
bool isDistanceLeaderboard);
|
|
|
|
// Populate the XUI leaderboard with the contents of m_leaderboards
|
|
void PopulateLeaderboard(LeaderboardManager::eStatsReturn ret);
|
|
|
|
// Set the header text of the leaderboard
|
|
void SetLeaderboardHeader();
|
|
|
|
// Set the title icons
|
|
int SetLeaderboardTitleIcons();
|
|
|
|
// Callback function called when stats read completes, userdata contains
|
|
// pointer to instance of CScene_Leaderboards
|
|
virtual bool OnStatsReadComplete(LeaderboardManager::eStatsReturn ret,
|
|
int numResults,
|
|
LeaderboardManager::ViewOut results);
|
|
|
|
virtual void customDraw(IggyCustomDrawCallbackRegion* region);
|
|
|
|
virtual void handleSelectionChanged(F64 selectedId);
|
|
virtual void handleRequestMoreData(F64 startIndex, bool up);
|
|
|
|
bool m_bIgnoreInput;
|
|
};
|