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_InGameSaveManagementMenu.h"
4
5#if defined(__ORBIS__) || defined(__PSVITA__)
6#include <ces.h>
7#endif
8
9int UIScene_InGameSaveManagementMenu::LoadSaveDataThumbnailReturned(LPVOID lpParam,PBYTE pbThumbnail,DWORD dwThumbnailBytes)
10{
11 UIScene_InGameSaveManagementMenu *pClass= (UIScene_InGameSaveManagementMenu *)lpParam;
12
13 app.DebugPrintf("Received data for save thumbnail\n");
14
15 if(pbThumbnail && dwThumbnailBytes)
16 {
17 pClass->m_saveDetails[pClass->m_iRequestingThumbnailId].pbThumbnailData = new BYTE[dwThumbnailBytes];
18 memcpy(pClass->m_saveDetails[pClass->m_iRequestingThumbnailId].pbThumbnailData, pbThumbnail, dwThumbnailBytes);
19 pClass->m_saveDetails[pClass->m_iRequestingThumbnailId].dwThumbnailSize = dwThumbnailBytes;
20 }
21 else
22 {
23 pClass->m_saveDetails[pClass->m_iRequestingThumbnailId].pbThumbnailData = NULL;
24 pClass->m_saveDetails[pClass->m_iRequestingThumbnailId].dwThumbnailSize = 0;
25 app.DebugPrintf("Save thumbnail data is NULL, or has size 0\n");
26 }
27 pClass->m_bSaveThumbnailReady = true;
28
29 return 0;
30}
31
32UIScene_InGameSaveManagementMenu::UIScene_InGameSaveManagementMenu(int iPad, void *initData, UILayer *parentLayer) : UIScene(iPad, parentLayer)
33{
34 // Setup all the Iggy references we need for this scene
35 initialiseMovie();
36
37 m_iRequestingThumbnailId = 0;
38 m_iSaveInfoC=0;
39 m_bIgnoreInput = false;
40 m_iState=e_SavesIdle;
41 //m_bRetrievingSaveInfo=false;
42
43 m_buttonListSaves.init(eControl_SavesList);
44
45 m_labelSavesListTitle.init( app.GetString(IDS_SAVE_INCOMPLETE_DELETE_SAVES) );
46 m_controlSavesTimer.setVisible( true );
47
48
49#if defined(_XBOX_ONE) || defined(__ORBIS__)
50 m_spaceIndicatorSaves.init(L"",eControl_SpaceIndicator,0, (4LL *1024LL * 1024LL * 1024LL) );
51#endif
52 m_bUpdateSaveSize = false;
53
54 m_bAllLoaded = false;
55 m_bRetrievingSaveThumbnails = false;
56 m_bSaveThumbnailReady = false;
57 m_bExitScene=false;
58 m_pSaveDetails=NULL;
59 m_bSavesDisplayed=false;
60 m_saveDetails = NULL;
61 m_iSaveDetailsCount = 0;
62
63#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__) || defined(_DURANGO)
64 // Always clear the saves when we enter this menu
65 StorageManager.ClearSavesInfo();
66#endif
67
68 // block input if we're waiting for DLC to install, and wipe the saves list. The end of dlc mounting custom message will fill the list again
69 if(app.StartInstallDLCProcess(m_iPad)==true || app.DLCInstallPending())
70 {
71 // if we're waiting for DLC to mount, don't fill the save list. The custom message on end of dlc mounting will do that
72 m_bIgnoreInput = true;
73 }
74 else
75 {
76 Initialise();
77 }
78
79#ifdef __PSVITA__
80 if(CGameNetworkManager::usingAdhocMode() && SQRNetworkManager_AdHoc_Vita::GetAdhocStatus())
81 {
82 g_NetworkManager.startAdhocMatching(); // create the client matching context and clear out the friends list
83 }
84
85#endif
86
87 // If we're not ignoring input, then we aren't still waiting for the DLC to mount, and can now check for corrupt dlc. Otherwise this will happen when the dlc has finished mounting.
88 if( !m_bIgnoreInput)
89 {
90 app.m_dlcManager.checkForCorruptDLCAndAlert();
91 }
92
93 parentLayer->addComponent(iPad,eUIComponent_MenuBackground);
94}
95
96
97UIScene_InGameSaveManagementMenu::~UIScene_InGameSaveManagementMenu()
98{
99 m_parentLayer->removeComponent(eUIComponent_MenuBackground);
100
101 if(m_saveDetails)
102 {
103 for(int i = 0; i < m_iSaveDetailsCount; ++i)
104 {
105 delete m_saveDetails[i].pbThumbnailData;
106 }
107 delete [] m_saveDetails;
108 }
109 app.LeaveSaveNotificationSection();
110 StorageManager.SetSaveDisabled(false);
111 StorageManager.ContinueIncompleteOperation();
112}
113
114void UIScene_InGameSaveManagementMenu::updateTooltips()
115{
116 int iA = -1;
117 if( m_bSavesDisplayed && m_iSaveDetailsCount > 0)
118 {
119 iA = IDS_TOOLTIPS_DELETESAVE;
120 }
121 ui.SetTooltips( m_parentLayer->IsFullscreenGroup()?XUSER_INDEX_ANY:m_iPad, iA, IDS_SAVE_INCOMPLETE_RETRY_SAVING);
122}
123
124//
125void UIScene_InGameSaveManagementMenu::Initialise()
126{
127 m_iSaveListIndex = 0;
128
129 // Check if we're in the trial version
130 if(ProfileManager.IsFullVersion()==false)
131 {
132 }
133 else if(StorageManager.GetSaveDisabled())
134 {
135 GetSaveInfo();
136 }
137 else
138 {
139 // 4J-PB - we need to check that there is enough space left to create a copy of the save (for a rename)
140 bool bCanRename = StorageManager.EnoughSpaceForAMinSaveGame();
141
142 GetSaveInfo();
143 }
144
145 m_bIgnoreInput=false;
146}
147
148void UIScene_InGameSaveManagementMenu::handleReload()
149{
150 m_bIgnoreInput = false;
151 m_iRequestingThumbnailId = 0;
152 m_bAllLoaded=false;
153 m_bRetrievingSaveThumbnails=false;
154 m_bSavesDisplayed=false;
155 m_iSaveInfoC=0;
156}
157
158void UIScene_InGameSaveManagementMenu::handleGainFocus(bool navBack)
159{
160 UIScene::handleGainFocus(navBack);
161
162 updateTooltips();
163
164 if(navBack)
165 {
166 // re-enable button presses
167 m_bIgnoreInput=false;
168 }
169}
170
171wstring UIScene_InGameSaveManagementMenu::getMoviePath()
172{
173 return L"SaveMenu";
174}
175
176void UIScene_InGameSaveManagementMenu::tick()
177{
178 UIScene::tick();
179
180 if(m_bExitScene) // navigate forward or back
181 {
182 if(!m_bRetrievingSaveThumbnails)
183 {
184 // need to wait for any callback retrieving thumbnail to complete
185 navigateBack();
186 }
187 }
188 // Stop loading thumbnails if we navigate forwards
189 if(hasFocus(m_iPad))
190 {
191 if(m_bUpdateSaveSize)
192 {
193 m_spaceIndicatorSaves.selectSave(m_iSaveListIndex);
194 m_bUpdateSaveSize = false;
195 }
196
197 // Display the saves if we have them
198 if(!m_bSavesDisplayed)
199 {
200 m_pSaveDetails=StorageManager.ReturnSavesInfo();
201 if(m_pSaveDetails!=NULL)
202 {
203 m_spaceIndicatorSaves.reset();
204
205 m_bSavesDisplayed=true;
206
207 if(m_saveDetails!=NULL)
208 {
209 for(unsigned int i = 0; i < m_pSaveDetails->iSaveC; ++i)
210 {
211 if(m_saveDetails[i].pbThumbnailData!=NULL)
212 {
213 delete m_saveDetails[i].pbThumbnailData;
214 }
215 }
216 delete m_saveDetails;
217 }
218 m_saveDetails = new SaveListDetails[m_pSaveDetails->iSaveC];
219
220 m_iSaveDetailsCount = m_pSaveDetails->iSaveC;
221 for(unsigned int i = 0; i < m_pSaveDetails->iSaveC; ++i)
222 {
223#if defined(_XBOX_ONE)
224 m_spaceIndicatorSaves.addSave( m_pSaveDetails->SaveInfoA[i].totalSize );
225#elif defined(__ORBIS__)
226 m_spaceIndicatorSaves.addSave( m_pSaveDetails->SaveInfoA[i].blocksUsed * (32 * 1024) );
227#endif
228#ifdef _DURANGO
229 m_buttonListSaves.addItem(m_pSaveDetails->SaveInfoA[i].UTF16SaveTitle, L"");
230
231 m_saveDetails[i].saveId = i;
232 memcpy(m_saveDetails[i].UTF16SaveName, m_pSaveDetails->SaveInfoA[i].UTF16SaveTitle, 128);
233 memcpy(m_saveDetails[i].UTF16SaveFilename, m_pSaveDetails->SaveInfoA[i].UTF16SaveFilename, MAX_SAVEFILENAME_LENGTH);
234#else
235 m_buttonListSaves.addItem(m_pSaveDetails->SaveInfoA[i].UTF8SaveTitle, L"");
236
237 m_saveDetails[i].saveId = i;
238 memcpy(m_saveDetails[i].UTF8SaveName, m_pSaveDetails->SaveInfoA[i].UTF8SaveTitle, 128);
239 memcpy(m_saveDetails[i].UTF8SaveFilename, m_pSaveDetails->SaveInfoA[i].UTF8SaveFilename, MAX_SAVEFILENAME_LENGTH);
240#endif
241 }
242 m_controlSavesTimer.setVisible( false );
243
244 // set focus on the first button
245
246 }
247 }
248
249 if(!m_bExitScene && m_bSavesDisplayed && !m_bRetrievingSaveThumbnails && !m_bAllLoaded)
250 {
251 if( m_iRequestingThumbnailId < (m_buttonListSaves.getItemCount() ))
252 {
253 m_bRetrievingSaveThumbnails = true;
254 app.DebugPrintf("Requesting the first thumbnail\n");
255 // set the save to load
256 PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo();
257 C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveDataThumbnail(&pSaveDetails->SaveInfoA[(int)m_iRequestingThumbnailId],&LoadSaveDataThumbnailReturned,this);
258
259 if(eLoadStatus!=C4JStorage::ESaveGame_GetSaveThumbnail)
260 {
261 // something went wrong
262 m_bRetrievingSaveThumbnails=false;
263 m_bAllLoaded = true;
264 }
265 }
266 }
267 else if (m_bSavesDisplayed && m_bSaveThumbnailReady)
268 {
269 m_bSaveThumbnailReady = false;
270
271 // check we're not waiting to exit the scene
272 if(!m_bExitScene)
273 {
274 // convert to utf16
275 uint16_t u16Message[MAX_SAVEFILENAME_LENGTH];
276#ifdef _DURANGO
277 // Already utf16 on durango
278 memcpy(u16Message, m_saveDetails[m_iRequestingThumbnailId].UTF16SaveFilename, MAX_SAVEFILENAME_LENGTH);
279#elif defined(_WINDOWS64)
280 int result = ::MultiByteToWideChar(
281 CP_UTF8, // convert from UTF-8
282 MB_ERR_INVALID_CHARS, // error on invalid chars
283 m_saveDetails[m_iRequestingThumbnailId].UTF8SaveFilename, // source UTF-8 string
284 MAX_SAVEFILENAME_LENGTH, // total length of source UTF-8 string,
285 // in CHAR's (= bytes), including end-of-string \0
286 (wchar_t *)u16Message, // destination buffer
287 MAX_SAVEFILENAME_LENGTH // size of destination buffer, in WCHAR's
288 );
289#else
290#ifdef __PS3
291 size_t srcmax,dstmax;
292#else
293 uint32_t srcmax,dstmax;
294 uint32_t srclen,dstlen;
295#endif
296 srcmax=MAX_SAVEFILENAME_LENGTH;
297 dstmax=MAX_SAVEFILENAME_LENGTH;
298
299#if defined(__PS3__)
300 L10nResult lres= UTF8stoUTF16s((uint8_t *)m_saveDetails[m_iRequestingThumbnailId].UTF8SaveFilename,&srcmax,u16Message,&dstmax);
301#else
302 SceCesUcsContext context;
303 sceCesUcsContextInit(&context);
304
305 sceCesUtf8StrToUtf16Str(&context, (uint8_t *)m_saveDetails[m_iRequestingThumbnailId].UTF8SaveFilename,srcmax,&srclen,u16Message,dstmax,&dstlen);
306#endif
307#endif
308 if( m_saveDetails[m_iRequestingThumbnailId].pbThumbnailData )
309 {
310 registerSubstitutionTexture((wchar_t *)u16Message,m_saveDetails[m_iRequestingThumbnailId].pbThumbnailData,m_saveDetails[m_iRequestingThumbnailId].dwThumbnailSize);
311 }
312 m_buttonListSaves.setTextureName(m_iRequestingThumbnailId, (wchar_t *)u16Message);
313
314 ++m_iRequestingThumbnailId;
315 if( m_iRequestingThumbnailId < (m_buttonListSaves.getItemCount() ))
316 {
317 app.DebugPrintf("Requesting another thumbnail\n");
318 // set the save to load
319 PSAVE_DETAILS pSaveDetails=StorageManager.ReturnSavesInfo();
320 C4JStorage::ESaveGameState eLoadStatus=StorageManager.LoadSaveDataThumbnail(&pSaveDetails->SaveInfoA[(int)m_iRequestingThumbnailId],&LoadSaveDataThumbnailReturned,this);
321 if(eLoadStatus!=C4JStorage::ESaveGame_GetSaveThumbnail)
322 {
323 // something went wrong
324 m_bRetrievingSaveThumbnails=false;
325 m_bAllLoaded = true;
326 }
327 }
328 else
329 {
330 m_bRetrievingSaveThumbnails = false;
331 m_bAllLoaded = true;
332 }
333 }
334 else
335 {
336 // stop retrieving thumbnails, and exit
337 m_bRetrievingSaveThumbnails = false;
338 }
339 }
340 }
341
342 switch(m_iState)
343 {
344 case e_SavesIdle:
345 break;
346 case e_SavesRepopulateAfterDelete:
347 m_bIgnoreInput = false;
348 m_iRequestingThumbnailId = 0;
349 m_bAllLoaded=false;
350 m_bRetrievingSaveThumbnails=false;
351 m_bSavesDisplayed=false;
352 m_iSaveInfoC=0;
353 m_buttonListSaves.clearList();
354 //StorageManager.ClearSavesInfo();
355 //GetSaveInfo();
356 m_iState=e_SavesIdle;
357 break;
358 }
359}
360
361void UIScene_InGameSaveManagementMenu::GetSaveInfo( )
362{
363 unsigned int uiSaveC=0;
364
365 // This will return with the number retrieved in uiSaveC
366
367 // clear the saves list
368 m_bSavesDisplayed = false; // we're blocking the exit from this scene until complete
369 m_buttonListSaves.clearList();
370 m_iSaveInfoC=0;
371 m_controlSavesTimer.setVisible(true);
372
373 m_pSaveDetails=StorageManager.ReturnSavesInfo();
374 if(m_pSaveDetails==NULL)
375 {
376 C4JStorage::ESaveGameState eSGIStatus= StorageManager.GetSavesInfo(m_iPad,NULL,this,"save");
377 }
378
379
380 return;
381}
382
383void UIScene_InGameSaveManagementMenu::handleInput(int iPad, int key, bool repeat, bool pressed, bool released, bool &handled)
384{
385 if(m_bIgnoreInput) return;
386
387 // if we're retrieving save info, ignore key presses
388 if(!m_bSavesDisplayed) return;
389
390 ui.AnimateKeyPress(m_iPad, key, repeat, pressed, released);
391
392 switch(key)
393 {
394 case ACTION_MENU_CANCEL:
395 if(pressed)
396 {
397#if defined(__PS3__) || defined(__ORBIS__) || defined(__PSVITA__)
398 m_bExitScene=true;
399#else
400 navigateBack();
401#endif
402 handled = true;
403 }
404 break;
405 case ACTION_MENU_OK:
406#ifdef __ORBIS__
407 case ACTION_MENU_TOUCHPAD_PRESS:
408#endif
409 case ACTION_MENU_UP:
410 case ACTION_MENU_DOWN:
411 case ACTION_MENU_PAGEUP:
412 case ACTION_MENU_PAGEDOWN:
413 sendInputToMovie(key, repeat, pressed, released);
414 handled = true;
415 break;
416 }
417}
418
419void UIScene_InGameSaveManagementMenu::handleInitFocus(F64 controlId, F64 childId)
420{
421 app.DebugPrintf(app.USER_SR, "UIScene_InGameSaveManagementMenu::handleInitFocus - %d , %d\n", (int)controlId, (int)childId);
422}
423
424void UIScene_InGameSaveManagementMenu::handleFocusChange(F64 controlId, F64 childId)
425{
426 app.DebugPrintf(app.USER_SR, "UIScene_InGameSaveManagementMenu::handleFocusChange - %d , %d\n", (int)controlId, (int)childId);
427 m_iSaveListIndex = childId;
428 if(m_bSavesDisplayed) m_bUpdateSaveSize = true;
429 updateTooltips();
430}
431
432void UIScene_InGameSaveManagementMenu::handlePress(F64 controlId, F64 childId)
433{
434 switch((int)controlId)
435 {
436 case eControl_SavesList:
437 {
438 m_bIgnoreInput = true;
439
440 // delete the save game
441 // Have to ask the player if they are sure they want to delete this game
442 UINT uiIDA[2];
443 uiIDA[0]=IDS_CONFIRM_CANCEL;
444 uiIDA[1]=IDS_CONFIRM_OK;
445 ui.RequestErrorMessage(IDS_TOOLTIPS_DELETESAVE, IDS_TEXT_DELETE_SAVE, uiIDA, 2,m_iPad,&UIScene_InGameSaveManagementMenu::DeleteSaveDialogReturned,this);
446
447 ui.PlayUISFX(eSFX_Press);
448 break;
449 }
450 }
451}
452
453int UIScene_InGameSaveManagementMenu::DeleteSaveDialogReturned(void *pParam,int iPad,C4JStorage::EMessageResult result)
454{
455 UIScene_InGameSaveManagementMenu* pClass = (UIScene_InGameSaveManagementMenu*)pParam;
456 // results switched for this dialog
457
458 if(result==C4JStorage::EMessage_ResultDecline)
459 {
460 if(app.DebugSettingsOn() && app.GetLoadSavesFromFolderEnabled())
461 {
462 pClass->m_bIgnoreInput=false;
463 }
464 else
465 {
466 StorageManager.DeleteSaveData(&pClass->m_pSaveDetails->SaveInfoA[pClass->m_iSaveListIndex],UIScene_InGameSaveManagementMenu::DeleteSaveDataReturned,pClass);
467 pClass->m_controlSavesTimer.setVisible( true );
468 }
469 }
470 else
471 {
472 pClass->m_bIgnoreInput=false;
473 }
474
475 return 0;
476}
477
478int UIScene_InGameSaveManagementMenu::DeleteSaveDataReturned(LPVOID lpParam,bool bRes)
479{
480 UIScene_InGameSaveManagementMenu* pClass = (UIScene_InGameSaveManagementMenu*)lpParam;
481
482 if(bRes)
483 {
484 // wipe the list and repopulate it
485 pClass->m_iState=e_SavesRepopulateAfterDelete;
486 }
487 else pClass->m_bIgnoreInput=false;
488
489 pClass->updateTooltips();
490
491 return 0;
492}
493
494bool UIScene_InGameSaveManagementMenu::hasFocus(int iPad)
495{
496 return bHasFocus && (iPad == m_iPad || m_iPad == XUSER_INDEX_ANY);
497}