the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
1#include "stdafx.h"
2#include "UI.h"
3#include "UIScene_FullscreenProgress.h"
4#include "..\..\Minecraft.h"
5#include "..\..\ProgressRenderer.h"
6
7
8UIScene_FullscreenProgress::UIScene_FullscreenProgress(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer)
9{
10 // Setup all the Iggy references we need for this scene
11 initialiseMovie();
12
13 parentLayer->addComponent(iPad,eUIComponent_Panorama);
14 parentLayer->addComponent(iPad,eUIComponent_Logo);
15 parentLayer->showComponent(iPad,eUIComponent_Logo,true);
16 parentLayer->showComponent(iPad,eUIComponent_MenuBackground,false);
17
18 m_controlTimer.setVisible( false );
19
20 m_titleText = L"";
21 m_statusText = L"";
22
23 m_lastTitle = -1;
24 m_lastStatus = -1;
25 m_lastProgress = 0;
26
27 m_buttonConfirm.init( app.GetString( IDS_CONFIRM_OK ), eControl_Confirm );
28 m_buttonConfirm.setVisible(false);
29
30 LoadingInputParams *params = (LoadingInputParams *)initData;
31
32 m_CompletionData = params->completionData;
33 m_iPad=params->completionData->iPad;
34 m_cancelFunc = params->cancelFunc;
35 m_cancelFuncParam = params->m_cancelFuncParam;
36 m_completeFunc = params->completeFunc;
37 m_completeFuncParam = params->m_completeFuncParam;
38
39 m_cancelText = params->cancelText;
40 m_bWasCancelled=false;
41 m_bWaitForThreadToDelete = params->waitForThreadToDelete;
42
43 // Clear the progress text
44 Minecraft *pMinecraft=Minecraft::GetInstance();
45 pMinecraft->progressRenderer->progressStart(-1);
46 pMinecraft->progressRenderer->progressStage(-1);
47 m_progressBar.init(L"",0,0,100,0);
48
49 // set the tip
50 wstring wsText= app.FormatHTMLString(m_iPad,app.GetString(app.GetNextTip()));
51
52 wchar_t startTags[64];
53 swprintf(startTags,64,L"<font color=\"#%08x\"><p align=center>",app.GetHTMLColour(eHTMLColor_White));
54 wsText= startTags + wsText + L"</p>";
55 m_labelTip.init(wsText);
56
57 addTimer(TIMER_FULLSCREEN_TIPS, TIMER_FULLSCREEN_TIPS_TIME);
58
59 m_labelTitle.init(L"");
60
61 m_labelTip.setVisible( m_CompletionData->bShowTips );
62
63 thread = new C4JThread(params->func, params->lpParam, "FullscreenProgress");
64 thread->SetProcessor(CPU_CORE_UI_SCENE); // TODO 4J Stu - Make sure this is a good thread/core to use
65
66 m_threadCompleted = false;
67 thread->Run();
68 threadStarted = true;
69
70#ifdef __PSVITA__
71 ui.TouchBoxRebuild(this);
72#endif
73
74#ifdef _XBOX_ONE
75 ui.ShowPlayerDisplayname(false);
76#endif
77}
78
79UIScene_FullscreenProgress::~UIScene_FullscreenProgress()
80{
81 m_parentLayer->removeComponent(eUIComponent_Panorama);
82 m_parentLayer->removeComponent(eUIComponent_Logo);
83
84 delete thread;
85
86 delete m_CompletionData;
87}
88
89wstring UIScene_FullscreenProgress::getMoviePath()
90{
91 return L"FullscreenProgress";
92}
93
94void UIScene_FullscreenProgress::updateTooltips()
95{
96 ui.SetTooltips( m_parentLayer->IsFullscreenGroup()?XUSER_INDEX_ANY:m_iPad, m_threadCompleted?IDS_TOOLTIPS_SELECT:-1, m_threadCompleted?-1:m_cancelText, -1, -1 );
97}
98
99void UIScene_FullscreenProgress::handleDestroy()
100{
101 int code = thread->GetExitCode();
102 DWORD exitcode = *((DWORD *)&code);
103
104 // If we're active, have a cancel func, and haven't already cancelled, call cancel func
105 if( exitcode == STILL_ACTIVE && m_cancelFunc != NULL && !m_bWasCancelled)
106 {
107 m_bWasCancelled = true;
108 m_cancelFunc(m_cancelFuncParam);
109 }
110}
111
112void UIScene_FullscreenProgress::tick()
113{
114 UIScene::tick();
115
116 Minecraft *pMinecraft=Minecraft::GetInstance();
117
118 int currentProgress = pMinecraft->progressRenderer->getCurrentPercent();
119 if(currentProgress < 0) currentProgress = 0;
120 if(currentProgress != m_lastProgress)
121 {
122 m_lastProgress = currentProgress;
123 m_progressBar.setProgress(currentProgress);
124 //app.DebugPrintf("Updated progress value\n");
125 }
126
127 int title = pMinecraft->progressRenderer->getCurrentTitle();
128 if(title >= 0 && title != m_lastTitle)
129 {
130 m_lastTitle = title;
131 m_titleText = app.GetString( title );
132 m_labelTitle.setLabel(m_titleText);
133 }
134
135 ProgressRenderer::eProgressStringType eProgressType=pMinecraft->progressRenderer->getType();
136
137 if(eProgressType==ProgressRenderer::eProgressStringType_ID)
138 {
139 int status = pMinecraft->progressRenderer->getCurrentStatus();
140 if(status >= 0 && status != m_lastStatus)
141 {
142 m_lastStatus = status;
143 m_statusText = app.GetString( status );
144 m_progressBar.setLabel(m_statusText.c_str());
145 }
146 }
147 else
148 {
149 wstring& wstrText = pMinecraft->progressRenderer->getProgressString();
150 m_progressBar.setLabel(wstrText.c_str());
151 }
152
153
154 int code = thread->GetExitCode();
155 DWORD exitcode = *((DWORD *)&code);
156
157 //app.DebugPrintf("CScene_FullscreenProgress Timer %d\n",pTimer->nId);
158
159 if( exitcode != STILL_ACTIVE )
160 {
161 // If we failed (currently used by network connection thread), navigate back
162 if( exitcode != S_OK )
163 {
164 if( exitcode == ERROR_CANCELLED )
165 {
166 // Current thread cancelled for whatever reason
167 // Currently used only for the CConsoleMinecraftApp::RemoteSaveThreadProc thread
168 // Assume to just ignore this thread as something else is now running that will
169 // cause another action
170 }
171 else
172 {
173 /*m_threadCompleted = true;
174 m_buttonConfirm.SetShow( TRUE );
175 m_buttonConfirm.SetFocus( m_CompletionData->iPad );
176 m_CompletionData->type = e_ProgressCompletion_NavigateToHomeMenu;
177
178 int exitReasonStringId;
179 switch( app.GetDisconnectReason() )
180 {
181 default:
182 exitReasonStringId = IDS_CONNECTION_FAILED;
183 }
184 Minecraft *pMinecraft=Minecraft::GetInstance();
185 pMinecraft->progressRenderer->progressStartNoAbort( exitReasonStringId );*/
186 //app.NavigateBack(m_CompletionData->iPad);
187
188 UINT uiIDA[1];
189 uiIDA[0]=IDS_CONFIRM_OK;
190 ui.RequestErrorMessage( g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_FAILED), g_NetworkManager.CorrectErrorIDS(IDS_CONNECTION_LOST_SERVER), uiIDA,1, XUSER_INDEX_ANY);
191
192 ui.NavigateToHomeMenu();
193 ui.UpdatePlayerBasePositions();
194 }
195 }
196 else
197 {
198 if(( m_CompletionData->bRequiresUserAction == TRUE ) && (!m_bWasCancelled))
199 {
200 m_threadCompleted = true;
201 m_buttonConfirm.setVisible( true );
202 // 4J-TomK - rebuild touch after confirm button made visible again
203#ifdef __PSVITA__
204 ui.TouchBoxRebuild(this);
205#endif
206 updateTooltips();
207 }
208 else
209 {
210 if(m_bWasCancelled)
211 {
212 m_threadCompleted = true;
213 }
214 app.DebugPrintf("FullScreenProgress complete with action: ");
215 switch(m_CompletionData->type)
216 {
217 case e_ProgressCompletion_AutosaveNavigateBack:
218 app.DebugPrintf("e_ProgressCompletion_AutosaveNavigateBack\n");
219 {
220 // 4J Stu - Fix for #65437 - Customer Encountered: Code: Settings: Autosave option doesn't work when the Host goes into idle state during gameplay.
221 // Autosave obviously cannot occur if an ignore autosave menu is displayed, so even if we navigate back to a scene and not empty
222 // then we still want to reset this flag which was set true by the navigate to the fullscreen progress
223 ui.SetIgnoreAutosaveMenuDisplayed(m_iPad, false);
224
225 // This just allows it to be shown
226 Minecraft *pMinecraft = Minecraft::GetInstance();
227 if(pMinecraft->localgameModes[ProfileManager.GetPrimaryPad()] != NULL) pMinecraft->localgameModes[ProfileManager.GetPrimaryPad()]->getTutorial()->showTutorialPopup(true);
228 ui.UpdatePlayerBasePositions();
229 navigateBack();
230 }
231 break;
232
233 case e_ProgressCompletion_NavigateBack:
234 app.DebugPrintf("e_ProgressCompletion_NavigateBack\n");
235 {
236 ui.UpdatePlayerBasePositions();
237 navigateBack();
238 }
239 break;
240 case e_ProgressCompletion_NavigateBackToScene:
241 app.DebugPrintf("e_ProgressCompletion_NavigateBackToScene\n");
242 ui.UpdatePlayerBasePositions();
243 // 4J Stu - If used correctly this scene will not have interfered with any other scene at all, so just navigate back
244 navigateBack();
245 break;
246 case e_ProgressCompletion_CloseUIScenes:
247 app.DebugPrintf("e_ProgressCompletion_CloseUIScenes\n");
248 ui.CloseUIScenes(m_CompletionData->iPad);
249 ui.UpdatePlayerBasePositions();
250 break;
251 case e_ProgressCompletion_CloseAllPlayersUIScenes:
252 app.DebugPrintf("e_ProgressCompletion_CloseAllPlayersUIScenes\n");
253 ui.CloseAllPlayersScenes();
254 ui.UpdatePlayerBasePositions();
255 break;
256 case e_ProgressCompletion_NavigateToHomeMenu:
257 app.DebugPrintf("e_ProgressCompletion_NavigateToHomeMenu\n");
258 ui.NavigateToHomeMenu();
259 ui.UpdatePlayerBasePositions();
260 break;
261 default:
262 app.DebugPrintf("Default\n");
263 break;
264 }
265 }
266 }
267 }
268}
269
270void UIScene_FullscreenProgress::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled)
271{
272 //if( m_showTooltips )
273 {
274 //ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released);
275
276 switch(key)
277 {
278 case ACTION_MENU_OK:
279#ifdef __ORBIS__
280 case ACTION_MENU_TOUCHPAD_PRESS:
281#endif
282 if(pressed)
283 {
284 sendInputToMovie(key, repeat, pressed, released);
285 }
286 break;
287 case ACTION_MENU_B:
288 case ACTION_MENU_CANCEL:
289 if( pressed && m_cancelFunc != NULL && !m_bWasCancelled )
290 {
291 m_bWasCancelled = true;
292 m_cancelFunc( m_cancelFuncParam );
293 }
294 break;
295 }
296 }
297}
298
299void UIScene_FullscreenProgress::handlePress(F64 controlId, F64 childId)
300{
301 if(m_threadCompleted && (int)controlId == eControl_Confirm)
302 {
303 // This assumes all buttons can only be pressed with the A button
304 ui.AnimateKeyPress(m_iPad, ACTION_MENU_A, false, true, false);
305
306 // if there's a complete function, call it
307 if(m_completeFunc)
308 {
309 m_completeFunc(m_completeFuncParam);
310 }
311
312 switch(m_CompletionData->type)
313 {
314 case e_ProgressCompletion_NavigateBack:
315 app.DebugPrintf("e_ProgressCompletion_NavigateBack\n");
316 {
317 ui.UpdatePlayerBasePositions();
318 navigateBack();
319 }
320 break;
321 case e_ProgressCompletion_NavigateBackToScene:
322 app.DebugPrintf("e_ProgressCompletion_NavigateBackToScene\n");
323 ui.UpdatePlayerBasePositions();
324 // 4J Stu - If used correctly this scene will not have interfered with any other scene at all, so just navigate back
325 navigateBack();
326 break;
327 case e_ProgressCompletion_CloseUIScenes:
328 app.DebugPrintf("e_ProgressCompletion_CloseUIScenes\n");
329 ui.CloseUIScenes(m_CompletionData->iPad);
330 ui.UpdatePlayerBasePositions();
331 break;
332 case e_ProgressCompletion_CloseAllPlayersUIScenes:
333 app.DebugPrintf("e_ProgressCompletion_CloseAllPlayersUIScenes\n");
334 ui.CloseAllPlayersScenes();
335 ui.UpdatePlayerBasePositions();
336 break;
337 case e_ProgressCompletion_NavigateToHomeMenu:
338 app.DebugPrintf("e_ProgressCompletion_NavigateToHomeMenu\n");
339 ui.NavigateToHomeMenu();
340 ui.UpdatePlayerBasePositions();
341 break;
342 }
343 }
344}
345
346void UIScene_FullscreenProgress::handleTimerComplete(int id)
347{
348 switch(id)
349 {
350 case TIMER_FULLSCREEN_TIPS:
351 {
352 // display the next tip
353 wstring wsText=app.FormatHTMLString(m_iPad,app.GetString(app.GetNextTip()));
354 wchar_t startTags[64];
355 swprintf(startTags,64,L"<font color=\"#%08x\"><p align=center>",app.GetHTMLColour(eHTMLColor_White));
356 wsText= startTags + wsText + L"</p>";
357 m_labelTip.setLabel(wsText);
358 }
359 break;
360 }
361}
362
363void UIScene_FullscreenProgress::SetWasCancelled(bool wasCancelled)
364{
365 m_bWasCancelled = wasCancelled;
366}
367
368bool UIScene_FullscreenProgress::isReadyToDelete()
369{
370 if( m_bWaitForThreadToDelete )
371 {
372 return !thread->isRunning();
373 }
374 else
375 {
376 return true;
377 }
378}