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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
|
#pragma once
#define GROUP_ID "A9C80F8E-5EAE-4883-89E6-0C456CADE89B"
#define SAVETRANSFER_GROUP_ID "43FD7A62-2747-4489-8E71-F937163DC3C5"
class XUI_FontRenderer;
class CConsoleMinecraftApp : public CMinecraftApp
{
private:
bool m_bMenuDisplayed[XUSER_MAX_COUNT]; // track each players menu displayed
bool m_bMenuToBeClosed[XUSER_MAX_COUNT]; // actioned at the end of the game loop
bool m_bPauseMenuDisplayed[XUSER_MAX_COUNT];
bool m_bContainerMenuDisplayed[XUSER_MAX_COUNT];
bool m_bIgnoreAutosaveMenuDisplayed[XUSER_MAX_COUNT];
bool m_bIgnorePlayerJoinMenuDisplayed[XUSER_MAX_COUNT];
int m_iCountDown[XUSER_MAX_COUNT]; // ticks to block input
HXUIOBJ m_PlayerBaseScene[XUSER_MAX_COUNT];
HXUIOBJ m_hFirstScene[XUSER_MAX_COUNT];
HXUIOBJ m_hCurrentScene[XUSER_MAX_COUNT];
HXUIOBJ m_hFirstTutorialScene[XUSER_MAX_COUNT];
HXUIOBJ m_hCurrentTutorialScene[XUSER_MAX_COUNT];
HXUIOBJ m_hFirstChatScene[XUSER_MAX_COUNT];
HXUIOBJ m_hCurrentChatScene[XUSER_MAX_COUNT];
HXUIOBJ m_hFirstHudScene[XUSER_MAX_COUNT];
HXUIOBJ m_hCurrentHudScene[XUSER_MAX_COUNT];
std::list< SceneStackPair > m_sceneStack[XUSER_MAX_COUNT];
// XUI scene names
static WCHAR *wchSceneA[eUIScene_COUNT];
static WCHAR *wchTypefaceA[4];
static WCHAR *wchTypefaceLocatorA[4];
WCHAR m_SceneName[50];
public:
CConsoleMinecraftApp();
virtual void SetRichPresenceContext(int iPad, int contextId);
virtual HRESULT RegisterXuiClasses();
virtual HRESULT UnregisterXuiClasses();
XTITLE_DEPLOYMENT_TYPE getDeploymentType() { return m_titleDeploymentType; }
void GetPreviewImage(int iPad,XSOCIAL_PREVIEWIMAGE *preview);
virtual HRESULT LoadXuiResources();
virtual void CaptureScreenshot(int iPad);
virtual void CaptureSaveThumbnail();
virtual void GetSaveThumbnail(PBYTE*,DWORD*);
virtual void ReleaseSaveThumbnail();
virtual void GetScreenshot(int iPad,PBYTE *pbData,DWORD *pdwSize);
virtual void RunFrame();
// TMS++
void TMSPP_SetTitleGroupID(LPCSTR szTitleGroupID);
void TMSPP_RetrieveFileList(int iPad,C4JStorage::eGlobalStorage eStorageFacility,CHAR *szPath,eTMSAction NextAction);
void TMSPP_ReadXuidsFile(int iPad,eTMSAction NextAction);
void TMSPP_ReadConfigFile(int iPad,eTMSAction NextAction);
void TMSPP_ReadDLCFile(int iPad,eTMSAction NextAction);
bool TMSPP_ReadBannedList(int iPad,eTMSAction NextAction);
static int Callback_TMSPPReadFileList(void *pParam,int iPad, int iUserData, C4JStorage::PTMSPP_FILE_LIST pTmsFileList);
static int Callback_TMSPPReadXuidsFile(void *pParam,int iPad, int iUserData, C4JStorage::PTMSPP_FILEDATA pFileData,LPCSTR szFilename);
static int Callback_TMSPPReadConfigFile(void *pParam,int iPad, int iUserData, C4JStorage::PTMSPP_FILEDATA pFileData, LPCSTR szFilename);
static int Callback_TMSPPReadDLCFile(void *pParam,int iPad, int iUserData, C4JStorage::PTMSPP_FILEDATA pFileData,LPCSTR szFilename);
static int Callback_TMSPPReadBannedList(void *pParam,int iPad, int iUserData, C4JStorage::PTMSPP_FILEDATA pFileData,LPCSTR szFilename);
virtual bool GetTMSGlobalFileListRead() { return m_bTMSPP_GlobalFileListRead;}
virtual bool GetTMSDLCInfoRead() { return m_bRead_TMS_DLCINFO_XML;}
virtual bool GetTMSXUIDsFileRead() { return m_bRead_TMS_XUIDS_XML;}
virtual int LoadLocalTMSFile(WCHAR *wchTMSFile);
virtual int LoadLocalTMSFile(WCHAR *wchTMSFile, eFileExtensionType eExt);
virtual void FreeLocalTMSFiles(eTMSFileType eType);
virtual int GetLocalTMSFileIndex(WCHAR *wchTMSFile,bool bFilenameIncludesExtension,eFileExtensionType eEXT=eFileExtensionType_PNG);
virtual int RetrieveTMSFileListIndex(WCHAR *wchTMSFile);
virtual void OverrideFontRenderer(bool set, bool immediate=true);
virtual void ToggleFontRenderer() { OverrideFontRenderer(!m_bFontRendererOverridden,false); }
virtual LPCWSTR GetString(int iID);
CXuiStringTable *GetStringTable();
#ifdef _DEBUG_MENUS_ENABLED
void EnableDebugOverlay(bool enable, int iPad);
#endif
private:
XUI_FontRenderer *m_fontRenderer;
bool m_bFontRendererOverridden;
bool m_bOverrideFontRenderer;
// Global string table for this application.
CXuiStringTable StringTable;
CXuiScene debugContainerScene;
// screenshot for social post, and thumbnail for save
LPD3DXBUFFER m_ThumbnailBuffer;
LPD3DXBUFFER m_ScreenshotBuffer[XUSER_MAX_COUNT];
private:
XTITLE_DEPLOYMENT_TYPE m_titleDeploymentType;
XSOCIAL_PREVIEWIMAGE m_PreviewBuffer[XUSER_MAX_COUNT];
bool m_bTMSPP_GlobalFileListRead; // track whether we have already read the file list from TMSPP
bool m_bRead_TMS_XUIDS_XML; // track whether we have already read the TMS xuids.xml file
bool m_bRead_TMS_Config_XML; // track whether we have already read the config file
bool m_bRead_TMS_DLCINFO_XML; // track whether we have already read the TMS DLC.xml file
BYTE *m_pXuidsFileBuffer;
DWORD m_dwXuidsFileSize;
#ifdef _DEBUG_MENUS_ENABLED
bool debugOverlayCreated;
HXUIOBJ m_hDebugOverlay;
#endif
public:
void ReadBannedList(int iPad, eTMSAction action=static_cast<eTMSAction>(0), bool bCallback=false);
// void ReadXuidsFileFromTMS(int iPad,eTMSAction NextAction,bool bCallback);
// void ReadDLCFileFromTMS(int iPad,eTMSAction NextAction, bool bCallback);
// static int CallbackReadXuidsFileFromTMS(LPVOID lpParam, WCHAR *wchFilename, int iPad, bool bResult, int iAction);
// static int CallbackDLCFileFromTMS(LPVOID lpParam, WCHAR *wchFilename, int iPad, bool bResult, int iAction);
static int CallbackBannedListFileFromTMS(LPVOID lpParam, WCHAR *wchFilename, int iPad, bool bResult, int iAction);
HRESULT RegisterFont(eFont eFontLanguage,eFont eFontFallback, bool bSetAsDefault=false);
WCHAR *GetSceneName(EUIScene eScene, bool bAppendToName,bool bSplitscreenScene);
virtual HRESULT NavigateToScene(int iPad,EUIScene eScene, void *initData = nullptr, bool forceUsePad = false, BOOL bStayVisible=FALSE, HXUIOBJ *phResultingScene=nullptr);
virtual HRESULT NavigateBack(int iPad, bool forceUsePad = false,EUIScene eScene = eUIScene_COUNT);
virtual HRESULT TutorialSceneNavigateBack(int iPad, bool forceUsePad = false);
virtual HRESULT CloseXuiScenes(int iPad, bool forceUsePad = false);
virtual HRESULT CloseAllPlayersXuiScenes();
virtual HRESULT CloseXuiScenesAndNavigateToScene(int iPad,EUIScene eScene, void *initData=nullptr, bool forceUsePad = false);
virtual HRESULT RemoveBackScene(int iPad);
virtual HRESULT NavigateToHomeMenu();
D3DXVECTOR3 GetElementScreenPosition(HXUIOBJ hObj);
virtual void SetChatTextDisplayed(int iPad, bool bVal);
virtual void ReloadChatScene(int iPad, bool bJoining = false, bool bForce = false);
virtual void ReloadHudScene(int iPad, bool bJoining = false, bool bForce = false);
bool GetMenuDisplayed(int iPad);
void SetMenuDisplayed(int iPad,bool bVal);
void CheckMenuDisplayed();
bool IsSceneInStack(int iPad, EUIScene eScene);
bool IsPauseMenuDisplayed(int iPad) { return m_bPauseMenuDisplayed[iPad]; }
bool IsContainerMenuDisplayed(int iPad) { return m_bContainerMenuDisplayed[iPad]; }
bool IsIgnoreAutosaveMenuDisplayed(int iPad) { return m_bIgnoreAutosaveMenuDisplayed[iPad]; }
void SetIgnoreAutosaveMenuDisplayed(int iPad, bool displayed) { m_bIgnoreAutosaveMenuDisplayed[iPad] = displayed; }
bool IsIgnorePlayerJoinMenuDisplayed(int iPad) { return m_bIgnorePlayerJoinMenuDisplayed[iPad]; }
void SetIgnorePlayerJoinMenuDisplayed(int iPad, bool displayed) { m_bIgnorePlayerJoinMenuDisplayed[iPad] = displayed; }
HXUIOBJ GetFirstScene(int iPad)
{
return m_hFirstScene[iPad];
}
HXUIOBJ GetCurrentTutorialScene(int iPad)
{
return m_hCurrentTutorialScene[iPad];
}
HXUIOBJ GetCurrentHUDScene(int iPad)
{
return m_hCurrentHudScene[iPad];
}
HXUIOBJ GetCurrentScene(int iPad) { return m_hCurrentScene[iPad]; }
// Move splitscreen scenes based on which screen segment they are in
void AdjustSplitscreenScene(HXUIOBJ hScene,D3DXVECTOR3 *pvOriginalPosition, int iPad, bool bAdjustXForSafeArea=true);
void AdjustSplitscreenScene(HXUIOBJ hScene,D3DXVECTOR3 *pvOriginalPosition, int iPad, float fXAdjust);
HRESULT AdjustSplitscreenScene_PlayerChanged(HXUIOBJ hScene,D3DXVECTOR3 *pvOriginalPosition, int iPad, bool bJoining, bool bAdjustXForSafeArea=true);
HRESULT AdjustSplitscreenScene_PlayerChanged(HXUIOBJ hScene,D3DXVECTOR3 *pvOriginalPosition, int iPad, bool bJoining, float fXAdjust);
// functions to store launch data, and to exit the game - required due to possibly being on a demo disc
virtual void StoreLaunchData();
virtual void ExitGame();
virtual void FatalLoadError();
static TMS_FILE TMSFileA[TMS_COUNT];
virtual void GetFileFromTPD(eTPDFileType eType,PBYTE pbData,DWORD dwBytes,PBYTE *ppbData,DWORD *pdwBytes );
private:
static WCHAR m_wchTMSXZP[];
static WCHAR *CConsoleMinecraftApp::wchExt[MAX_EXTENSION_TYPES];
};
extern CConsoleMinecraftApp app;
|