the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 497 lines 14 kB view raw
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}