1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
|
#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 )
};
|