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