mirror of
https://github.com/4jcraft/4jcraft.git
synced 2026-04-26 00:47:04 +00:00
196 lines
7.6 KiB
C++
196 lines
7.6 KiB
C++
#pragma once
|
|
#include "XUI_Helper.h"
|
|
#include "../media/xuiscene_leaderboards.h"
|
|
|
|
#include "../Leaderboards/LeaderboardManager.h"
|
|
|
|
class CXuiCtrlCraftIngredientSlot;
|
|
|
|
class CScene_Leaderboards : public CXuiSceneImpl,
|
|
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
|
|
|
|
// static LPCWSTR FLAG_ICON_PATHS[37];
|
|
int m_iPad;
|
|
|
|
bool m_bPopulatedOnce;
|
|
|
|
static const int LEADERBOARD_HEADERS[NUM_LEADERBOARDS][4];
|
|
|
|
static const int TitleIcons[NUM_LEADERBOARDS][7];
|
|
static LPCWSTR m_TitleIconNameA[7];
|
|
static LPCWSTR m_TextColumnNameA[7];
|
|
HXUIOBJ m_hTextEntryA[7];
|
|
|
|
struct LeaderboardDescriptor {
|
|
DWORD m_viewId;
|
|
DWORD m_columnCount;
|
|
WORD m_columnIds[8];
|
|
|
|
LeaderboardDescriptor(DWORD viewId, DWORD columnCount, WORD columnId_0,
|
|
WORD columnId_1, WORD columnId_2, WORD columnId_3,
|
|
WORD columnId_4, WORD columnId_5, WORD columnId_6,
|
|
WORD columnId_7) {
|
|
m_viewId = viewId;
|
|
m_columnCount = columnCount;
|
|
m_columnIds[0] = columnId_0;
|
|
m_columnIds[1] = columnId_1;
|
|
m_columnIds[2] = columnId_2;
|
|
m_columnIds[3] = columnId_3;
|
|
m_columnIds[4] = columnId_4;
|
|
m_columnIds[5] = columnId_5;
|
|
m_columnIds[6] = columnId_6;
|
|
m_columnIds[7] = columnId_7;
|
|
}
|
|
};
|
|
|
|
static const LeaderboardDescriptor LEADERBOARD_DESCRIPTORS[NUM_LEADERBOARDS]
|
|
[4];
|
|
|
|
struct LeaderboardEntry {
|
|
PlayerUID m_xuid;
|
|
DWORD m_rank;
|
|
WCHAR m_wcRank[12];
|
|
WCHAR m_gamerTag[XUSER_NAME_SIZE + 1];
|
|
// int m_locale;
|
|
unsigned int m_columns[7];
|
|
WCHAR 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
|
|
};
|
|
|
|
struct Leaderboard {
|
|
DWORD m_totalEntryCount; // Either total number of entries in
|
|
// leaderboard, or total number of results for
|
|
// a friends query
|
|
DWORD m_entryStartIndex; // Index of first entry
|
|
DWORD m_currentEntryCount; // Current number of entries
|
|
LeaderboardEntry m_entries[NUM_ENTRIES];
|
|
DWORD m_numColumns;
|
|
};
|
|
|
|
Leaderboard m_leaderboard; // All leaderboard data for the currently
|
|
// selected filter
|
|
|
|
unsigned int
|
|
m_currentLeaderboard; // The current leaderboard selected for view
|
|
|
|
#ifdef _XBOX
|
|
LeaderboardManager::EFilterMode
|
|
m_currentFilter; // The current filter selected
|
|
#endif
|
|
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
|
|
|
|
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
|
|
|
|
XONLINE_FRIEND* m_friends; // Current player's friends
|
|
unsigned int m_numFriends; // Count of friends
|
|
PlayerUID* m_filteredFriends; // List of all friend XUIDs (and player's),
|
|
// only counting actual friends, not pending
|
|
unsigned int m_numFilteredFriends; // Count of filtered friends
|
|
|
|
CXuiList m_listGamers; // The XUI list showing the leaderboard info
|
|
CXuiControl m_textLeaderboard; // The XUI text box showing the current
|
|
// leaderboard name
|
|
CXuiControl m_textInfo; // The XUI text box showing info messages (loading,
|
|
// no results, etc.)
|
|
CXuiControl m_textFilter; // The XUI text box showing the current filter
|
|
CXuiControl m_textEntries; // The XUI text box showing the total number of
|
|
// entries in this leaderboard
|
|
CXuiCtrlCraftIngredientSlot* m_pHTitleIconSlots[7];
|
|
float m_fTitleIconXPositions[7];
|
|
float m_fTextXPositions[7];
|
|
|
|
XUI_BEGIN_MSG_MAP()
|
|
XUI_ON_XM_INIT(OnInit)
|
|
XUI_ON_XM_DESTROY(OnDestroy)
|
|
XUI_ON_XM_KEYDOWN(OnKeyDown)
|
|
XUI_ON_XM_GET_ITEMCOUNT_ALL(OnGetItemCountAll)
|
|
XUI_ON_XM_GET_SOURCE_TEXT(OnGetSourceDataText)
|
|
XUI_ON_XM_GET_SOURCE_IMAGE(OnGetSourceDataImage)
|
|
XUI_ON_XM_NOTIFY_SELCHANGED(OnNotifySelChanged)
|
|
XUI_ON_XM_NOTIFY_SET_FOCUS(OnNotifySetFocus)
|
|
|
|
XUI_END_MSG_MAP()
|
|
|
|
BEGIN_CONTROL_MAP()
|
|
MAP_CONTROL(IDC_XuiListGamers, m_listGamers)
|
|
MAP_CONTROL(IDC_XuiTextLeaderboard, m_textLeaderboard)
|
|
MAP_CONTROL(IDC_XuiTextInfo, m_textInfo)
|
|
MAP_CONTROL(IDC_XuiTextFilter, m_textFilter)
|
|
MAP_CONTROL(IDC_XuiTextEntries, m_textEntries)
|
|
END_CONTROL_MAP()
|
|
|
|
HRESULT OnInit(XUIMessageInit* pInitData, BOOL& bHandled);
|
|
HRESULT OnDestroy();
|
|
HRESULT OnKeyDown(XUIMessageInput* pInputData, BOOL& bHandled);
|
|
HRESULT OnGetItemCountAll(XUIMessageGetItemCount* pGetItemCountData,
|
|
BOOL& bHandled);
|
|
HRESULT OnGetSourceDataText(XUIMessageGetSourceText* pGetSourceTextData,
|
|
BOOL& bHandled);
|
|
HRESULT OnGetSourceDataImage(XUIMessageGetSourceImage* pGetImage,
|
|
BOOL& bHandled);
|
|
HRESULT OnNotifySetFocus(HXUIOBJ hObjSource,
|
|
XUINotifyFocus* pNotifyFocusData, BOOL& bHandled);
|
|
HRESULT OnNotifySelChanged(HXUIOBJ hObjSource,
|
|
XUINotifySelChanged* pNotifySelChangedData,
|
|
BOOL& bHandled);
|
|
|
|
// Start a read request with the current parameters
|
|
void ReadStats(int startIndex);
|
|
|
|
// Callback function called when stats read completes, userdata contains
|
|
// pointer to instance of CScene_Leaderboards
|
|
virtual bool OnStatsReadComplete(bool success, int numResults,
|
|
LeaderboardManager::ViewOut results);
|
|
|
|
// Copy the stats from the raw m_stats structure into the m_leaderboards
|
|
// structure
|
|
int m_numStats;
|
|
PXUSER_STATS_READ_RESULTS m_stats;
|
|
bool RetrieveStats();
|
|
|
|
// Populate the XUI leaderboard with the contents of m_leaderboards
|
|
void PopulateLeaderboard(bool noResults);
|
|
|
|
// Copy a leaderboard entry from the stats row
|
|
void CopyLeaderboardEntry(PXUSER_STATS_ROW statsRow,
|
|
LeaderboardEntry* leaderboardEntry,
|
|
bool isDistanceLeaderboard);
|
|
|
|
// Set the header text of the leaderboard
|
|
void SetLeaderboardHeader();
|
|
|
|
// Set the title icons
|
|
int SetLeaderboardTitleIcons();
|
|
void ClearLeaderboardTitlebar();
|
|
void Reposition(int iNumber);
|
|
void RepositionText(int iNumber);
|
|
void UpdateTooltips();
|
|
|
|
protected:
|
|
bool m_isProcessingStatsRead;
|
|
bool m_bReady;
|
|
|
|
public:
|
|
XUI_IMPLEMENT_CLASS(CScene_Leaderboards, L"CScene_Leaderboards",
|
|
XUI_CLASS_SCENE)
|
|
};
|