#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) };