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 <xuiresource.h>
3#include <xuiapp.h>
4#include <assert.h>
5
6#include "XUI_Ctrl_4JList.h"
7#include "XUI_Ctrl_4JIcon.h"
8#include "XUI_LoadSettings.h"
9#include "..\..\ProgressRenderer.h"
10#include "XUI_TransferToXboxOne.h"
11
12
13//----------------------------------------------------------------------------------
14// Performs initialization tasks - retrieves controls.
15//----------------------------------------------------------------------------------
16HRESULT CScene_TransferToXboxOne::OnInit( XUIMessageInit* pInitData, BOOL& bHandled )
17{
18 m_iX=-1;
19 m_params = (LoadMenuInitData *)pInitData->pvInitData;
20
21 m_iPad=m_params->iPad;
22
23 m_bRetrievingSaveInfo=false;
24 m_bIgnoreInput=false;
25 MapChildControls();
26
27 VOID *pObj;
28 XuiObjectFromHandle( m_SavesSlotList, &pObj );
29 m_pSavesSlotList = (CXuiCtrl4JList *)pObj;
30
31 m_pbImageData=NULL;
32 m_dwImageBytes=0;
33
34 StorageManager.GetSaveCacheFileInfo(m_params->iSaveGameInfoIndex,m_XContentData);
35 StorageManager.GetSaveCacheFileInfo(m_params->iSaveGameInfoIndex,&m_pbImageData,&m_dwImageBytes);
36
37
38 m_SavesSlotListTimer.SetShow(TRUE);
39
40
41 XuiControlSetText(m_SavesSlotList,app.GetString(IDS_XBONE_SELECTSLOT));
42
43 // insert the current save slot names
44 m_MaxSlotC=app.m_uiTransferSlotC;
45 m_pSlotDataA = new SLOTDATA [m_MaxSlotC];
46 ZeroMemory(m_pSlotDataA,sizeof(SLOTDATA)*m_MaxSlotC);
47
48
49 // saves will be called slot1 to slotx
50 // there will be a details file with the names and png of each slot
51 m_pbSlotListFile=NULL;
52 m_uiSlotListFileBytes=0;
53
54 if(StorageManager.TMSPP_InFileList(C4JStorage::eGlobalStorage_TitleUser,m_iPad,L"XboxOne/SlotList"))
55 {
56 // there is a slot list file with details of the saves
57 C4JStorage::ETMSStatus status=StorageManager.TMSPP_ReadFile(m_iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,"XboxOne/SlotList",&CScene_TransferToXboxOne::TMSPPSlotListReturned,this);
58 m_iX=IDS_TOOLTIPS_CLEARSLOTS;
59 }
60 else
61 {
62 CXuiCtrl4JList::LIST_ITEM_INFO ListInfo;
63
64 ZeroMemory(&ListInfo,sizeof(CXuiCtrl4JList::LIST_ITEM_INFO));
65
66 // create dummy slots
67 for(int i=0;i<m_MaxSlotC;i++)
68 {
69 memcpy(m_pSlotDataA[i].wchSaveTitle,app.GetString(IDS_XBONE_EMPTYSLOT),sizeof(WCHAR)*XCONTENT_MAX_DISPLAYNAME_LENGTH);
70 ListInfo.pwszText = app.GetString(IDS_XBONE_EMPTYSLOT);
71 ListInfo.fEnabled = TRUE;
72 ListInfo.iData = -1;
73 m_pSavesSlotList->AddData(ListInfo);
74 }
75 m_SavesSlotListTimer.SetShow(FALSE);
76 }
77
78
79 CXuiSceneBase::SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, m_iX, -1,-1,-1,-1,-1,-1,true);
80
81 return S_OK;
82}
83
84//----------------------------------------------------------------------------------
85// TMSPPSlotListReturned callback
86//----------------------------------------------------------------------------------
87int CScene_TransferToXboxOne::TMSPPWriteReturned(LPVOID pParam,int iPad,int iUserData)
88{
89 CScene_TransferToXboxOne* pClass = (CScene_TransferToXboxOne *) pParam;
90 pClass->m_bWaitingForWrite=false;
91
92 return 0;
93}
94
95//----------------------------------------------------------------------------------
96// TMSPPSlotListReturned callback
97//----------------------------------------------------------------------------------
98int CScene_TransferToXboxOne::TMSPPDeleteReturned(LPVOID pParam,int iPad,int iUserData)
99{
100 CScene_TransferToXboxOne* pClass = (CScene_TransferToXboxOne *) pParam;
101 pClass->m_SavesSlotListTimer.SetShow(FALSE);
102 pClass->m_bIgnoreInput=false;
103
104 // update the slots
105 delete pClass->m_pbSlotListFile;
106 pClass->m_pbSlotListFile=NULL;
107 pClass->m_uiSlotListFileBytes=0;
108 pClass->m_pSavesSlotList->RemoveAllData();
109 CXuiCtrl4JList::LIST_ITEM_INFO ListInfo;
110
111 ZeroMemory(&ListInfo,sizeof(CXuiCtrl4JList::LIST_ITEM_INFO));
112 // clear our slot info
113 ZeroMemory(pClass->m_pSlotDataA,sizeof(SLOTDATA)*pClass->m_MaxSlotC);
114
115 for(int i=0;i<pClass->m_MaxSlotC;i++)
116 {
117 memcpy(pClass->m_pSlotDataA[i].wchSaveTitle,app.GetString(IDS_XBONE_EMPTYSLOT),sizeof(WCHAR)*XCONTENT_MAX_DISPLAYNAME_LENGTH);
118 ListInfo.pwszText = app.GetString(IDS_XBONE_EMPTYSLOT);
119 ListInfo.fEnabled = TRUE;
120 ListInfo.iData = -1;
121 pClass->m_pSavesSlotList->AddData(ListInfo);
122 }
123
124 return 0;
125}
126
127//----------------------------------------------------------------------------------
128// TMSPPSlotListReturned callback
129//----------------------------------------------------------------------------------
130int CScene_TransferToXboxOne::TMSPPSlotListReturned(LPVOID pParam,int iPad,int iUserData,C4JStorage::PTMSPP_FILEDATA pFileData, LPCSTR szFilename)
131{
132 CScene_TransferToXboxOne* pClass = (CScene_TransferToXboxOne *) pParam;
133 unsigned int uiSlotListFileSlots=*((unsigned int *)pFileData->pbData);
134 pClass->m_pbSlotListFile=pFileData->pbData;
135 pClass->m_uiSlotListFileBytes=pFileData->dwSize;
136
137 // clear our slot info
138 ZeroMemory(pClass->m_pSlotDataA,sizeof(SLOTDATA)*pClass->m_MaxSlotC);
139 // set the empty slot strings
140 for(int i=0;i<pClass->m_MaxSlotC;i++)
141 {
142 memcpy(pClass->m_pSlotDataA[i].wchSaveTitle,app.GetString(IDS_XBONE_EMPTYSLOT),sizeof(WCHAR)*XCONTENT_MAX_DISPLAYNAME_LENGTH);
143 }
144 // update our slot info with the data from the file - might have less slots
145 unsigned int uiNewSlotsC=(pClass->m_MaxSlotC<uiSlotListFileSlots)?pClass->m_MaxSlotC:uiSlotListFileSlots;
146 memcpy(pClass->m_pSlotDataA,pClass->m_pbSlotListFile + sizeof(unsigned int),sizeof(SLOTDATA)*uiNewSlotsC);
147
148 CXuiCtrl4JList::LIST_ITEM_INFO ListInfo;
149
150 ZeroMemory(&ListInfo,sizeof(CXuiCtrl4JList::LIST_ITEM_INFO));
151 PBYTE pbImageData=pClass->m_pbSlotListFile + sizeof(unsigned int) + sizeof(SLOTDATA)*uiSlotListFileSlots;
152
153 // fill out the slot info
154 for(int i=0;i<pClass->m_MaxSlotC;i++)
155 {
156 if(i<uiNewSlotsC)
157 {
158 ListInfo.pwszText = pClass->m_pSlotDataA[i].wchSaveTitle;
159 ListInfo.fEnabled = TRUE;
160 ListInfo.iData = -1;
161 pClass->m_pSavesSlotList->AddData(ListInfo);
162
163 if(pClass->m_pSlotDataA[i].uiImageLength!=0)
164 {
165 XuiCreateTextureBrushFromMemory(pbImageData,pClass->m_pSlotDataA[i].uiImageLength,&pClass->m_hXuiBrush);
166 pClass->m_pSavesSlotList->UpdateGraphic(i,pClass->m_hXuiBrush);
167 // increment the image data pointer
168 pbImageData+=pClass->m_pSlotDataA[i].uiImageLength;
169 }
170 }
171 else
172 {
173 // make it blank
174 ListInfo.pwszText = app.GetString(IDS_XBONE_EMPTYSLOT);
175 ListInfo.fEnabled = TRUE;
176 ListInfo.iData = -1;
177 pClass->m_pSavesSlotList->AddData(ListInfo);
178 }
179 }
180 pClass->m_SavesSlotListTimer.SetShow(FALSE);
181 return 0;
182
183}
184
185//----------------------------------------------------------------------------------
186// Handler for OnDestroy
187//----------------------------------------------------------------------------------
188HRESULT CScene_TransferToXboxOne::OnDestroy()
189{
190 return S_OK;
191}
192
193//----------------------------------------------------------------------------------
194// Handler for the button press message.
195//----------------------------------------------------------------------------------
196HRESULT CScene_TransferToXboxOne::OnNotifyPressEx(HXUIOBJ hObjPressed, XUINotifyPress* pNotifyPressData, BOOL& rfHandled)
197{
198 if(m_bIgnoreInput) return S_OK;
199
200 // if we're retrieving save info, ignore key presses
201 if(m_bRetrievingSaveInfo)
202 {
203 return S_OK;
204 }
205
206 // This assumes all buttons can only be pressed with the A button
207 ui.AnimateKeyPress(pNotifyPressData->UserIndex, VK_PAD_A);
208
209 if(hObjPressed==m_SavesSlotList)
210 {
211 m_bIgnoreInput=true;
212
213 // update the info in the SlotList file
214 CXuiControl pItem;
215 int iIndex;
216
217 // get the selected item
218 iIndex=m_SavesSlotList.GetCurSel(&pItem);
219
220 // check if there is a save there
221
222 CXuiCtrl4JList::LIST_ITEM_INFO info = m_pSavesSlotList->GetData(iIndex);
223 if(info.pwszImage!=NULL)
224 {
225 // we have a save here
226 // Are you sure, etc.
227 }
228
229 // update the data
230 memcpy(m_pSlotDataA[iIndex].wchSaveTitle,m_XContentData.szDisplayName,sizeof(WCHAR)*XCONTENT_MAX_DISPLAYNAME_LENGTH);
231 m_pSavesSlotList->UpdateText(iIndex,m_pSlotDataA[iIndex].wchSaveTitle);
232
233 // if there is no thumbnail, retrieve the default one from the file.
234 // Don't delete the image data after creating the xuibrush, since we'll use it in the rename of the save
235 bool bHostOptionsRead = false;
236 unsigned int uiHostOptions = 0;
237
238 XuiCreateTextureBrushFromMemory(m_pbImageData,m_dwImageBytes,&m_hXuiBrush);
239 m_pSavesSlotList->UpdateGraphic(iIndex,m_hXuiBrush);
240
241 m_pSlotDataA[iIndex].uiImageLength=m_dwImageBytes;
242
243 m_bIgnoreInput=false;
244
245 // finished so navigate back
246 //app.NavigateBack(XUSER_INDEX_ANY);
247 BuildSlotFile(iIndex,m_pbImageData,m_dwImageBytes);
248 }
249
250 return S_OK;
251}
252
253HRESULT CScene_TransferToXboxOne::BuildSlotFile(int iIndexBeingUpdated,PBYTE pbImageData,DWORD dwImageBytes )
254{
255 SLOTDATA *pCurrentSlotData=NULL;
256 PBYTE pbCurrentSlotDataPtr=NULL;
257 // there may be no slot file yet
258 if(m_pbSlotListFile!=NULL)
259 {
260 pCurrentSlotData=(SLOTDATA *)(m_pbSlotListFile+sizeof(unsigned int));
261 pbCurrentSlotDataPtr=m_pbSlotListFile + sizeof(unsigned int) + sizeof(SLOTDATA)*m_MaxSlotC;
262 }
263
264 m_uiSlotID=iIndexBeingUpdated;
265
266 // memory required - first int is the number of slots in this file, in case that changes later
267 unsigned int uiBytesRequired=sizeof(unsigned int) + sizeof(SLOTDATA)*m_MaxSlotC;
268 for(int i=0;i<m_MaxSlotC;i++)
269 {
270 if(i==iIndexBeingUpdated)
271 {
272 uiBytesRequired+=dwImageBytes;
273 }
274 else
275 {
276 uiBytesRequired+=m_pSlotDataA[i].uiImageLength;
277 }
278 }
279
280 PBYTE pbNewSlotFileData= new BYTE [uiBytesRequired];
281 *((unsigned int *)pbNewSlotFileData)=m_MaxSlotC;
282 PBYTE pbNewSlotFileDataSlots=pbNewSlotFileData + sizeof(unsigned int);
283 PBYTE pbNewSlotImageDataPtr=pbNewSlotFileData + sizeof(unsigned int) + sizeof(SLOTDATA)*m_MaxSlotC;
284 SLOTDATA *pNewSlotData=(SLOTDATA *)pbNewSlotFileDataSlots;
285
286 // copy the slot info into the new memory, just after the first int
287 memcpy(pbNewSlotFileDataSlots,m_pSlotDataA,sizeof(SLOTDATA)*m_MaxSlotC);
288
289 for(int i=0;i<m_MaxSlotC;i++)
290 {
291 if(i==iIndexBeingUpdated)
292 {
293 memcpy(pbNewSlotImageDataPtr,pbImageData,dwImageBytes);
294 pbNewSlotImageDataPtr+=dwImageBytes;
295 // update the fields
296 pNewSlotData[i].uiImageLength=dwImageBytes;
297 // save title is already correct
298 }
299 else
300 {
301 if(pbCurrentSlotDataPtr!=NULL)
302 {
303 memcpy(pbNewSlotImageDataPtr,pbCurrentSlotDataPtr,pCurrentSlotData[i].uiImageLength);
304 pbNewSlotImageDataPtr+=pCurrentSlotData[i].uiImageLength;
305 }
306 // fields are already correct
307 }
308
309 // move to the next image data in the current slot file
310 if(pbCurrentSlotDataPtr!=NULL)
311 {
312 pbCurrentSlotDataPtr+=pCurrentSlotData[i].uiImageLength;
313 }
314 }
315
316 // free the previous file data and the current file data
317 delete m_pbSlotListFile;
318
319 // reset the pointer until we have the exit from this scene running
320 m_pbSlotListFile = pbNewSlotFileData;
321 m_uiSlotListFileBytes = uiBytesRequired;
322 m_pSlotDataA = (SLOTDATA *)pbNewSlotFileDataSlots;
323
324 LoadingInputParams *loadingParams = new LoadingInputParams();
325 loadingParams->func = &CScene_TransferToXboxOne::UploadSaveForXboxOneThreadProc;
326 loadingParams->lpParam = (LPVOID)this;
327
328 UIFullscreenProgressCompletionData *completionData = new UIFullscreenProgressCompletionData();
329 completionData->bShowBackground=TRUE;
330 completionData->bShowLogo=TRUE;
331 completionData->iPad = m_iPad;
332 completionData->type = e_ProgressCompletion_NavigateBackToScene;
333 completionData->scene = eUIScene_LoadMenu;
334 loadingParams->completionData = completionData;
335
336 app.NavigateToScene(m_iPad,eUIScene_FullscreenProgress, loadingParams);
337
338 return S_OK;
339}
340
341int CScene_TransferToXboxOne::UploadSaveForXboxOneThreadProc( LPVOID lpParameter )
342{
343 HRESULT hr = S_OK;
344 char szFilename[32];
345 CScene_TransferToXboxOne* pClass = (CScene_TransferToXboxOne *) lpParameter;
346 Minecraft *pMinecraft = Minecraft::GetInstance();
347 unsigned int uiComplete=0;
348 pClass->m_bWaitingForWrite=true;
349 pMinecraft->progressRenderer->progressStart(IDS_XBONE_UPLOAD_SAVE_TITLE);
350 pMinecraft->progressRenderer->progressStage( IDS_XBONE_UPLOAD_METADATA );
351 // now write the new slot data file to global storage, and then write the save data
352 C4JStorage::ETMSStatus eStatus=StorageManager.TMSPP_WriteFile(pClass->m_iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,C4JStorage::TMS_UGCTYPE_NONE,"XboxOne/SlotList",(PCHAR) pClass->m_pbSlotListFile, pClass->m_uiSlotListFileBytes,
353 &CScene_TransferToXboxOne::TMSPPWriteReturned,lpParameter, 0);
354
355 if(eStatus!=C4JStorage::ETMSStatus_WriteInProgress)
356 {
357 // failed
358 pClass->m_bWaitingForWrite=false;
359 }
360 else
361 {
362 // loop waiting for the write to complete
363 uiComplete=0;
364 while(pClass->m_bWaitingForWrite && (hr == S_OK))
365 {
366 Sleep(50);
367 uiComplete++;
368 if(uiComplete>100) uiComplete=100;
369
370 pMinecraft->progressRenderer->progressStagePercentage(uiComplete);
371
372 if(app.GetChangingSessionType())
373 {
374 // 4J Stu - This causes the fullscreenprogress scene to ignore the action it was given
375 hr = ERROR_CANCELLED;
376 }
377 }
378
379 if(hr!=S_OK) return -1;
380
381 // finish the bar
382 for(int i=uiComplete;i<100;i++)
383 {
384 Sleep(5);
385 pMinecraft->progressRenderer->progressStagePercentage(i);
386 }
387
388
389 // now upload the save data
390 pMinecraft->progressRenderer->progressStage( IDS_XBONE_UPLOAD_SAVE );
391
392 // write the save file, and increment the progress percentage
393 pMinecraft->progressRenderer->progressStagePercentage(25);
394 pClass->m_bSaveDataReceived=false;
395 C4JStorage::ELoadGameStatus eLoadStatus=StorageManager.LoadSaveData(&pClass->m_XContentData,CScene_TransferToXboxOne::LoadSaveDataReturned,lpParameter);
396
397 // sleep until we have the data
398 while(pClass->m_bSaveDataReceived==false)
399 {
400 Sleep(50);
401 }
402
403 // write the save to user TMS
404
405 // break the file up into 256K chunks
406 unsigned int uiChunkSize=262144;
407 unsigned int uiBytesLeft=pClass->m_uiStorageLength;
408 C4JStorage::ETMSStatus eStatus;
409 // max file size would be 100*256K
410 unsigned int uiPercentageChunk=100/(pClass->m_uiStorageLength/uiChunkSize);
411 uiComplete=0;
412
413 if(uiPercentageChunk==0) uiPercentageChunk=1;
414
415 for(int i=0;i<(pClass->m_uiStorageLength/uiChunkSize)+1;i++)
416 {
417 sprintf( szFilename, "XboxOne/Slot%.2d%.2d", pClass->m_uiSlotID,i );
418 PCHAR pchData=((PCHAR)pClass->m_pvSaveMem)+i*uiChunkSize;
419
420 pClass->m_bWaitingForWrite=true;
421 if(uiBytesLeft>=uiChunkSize)
422 {
423 eStatus=StorageManager.TMSPP_WriteFile(pClass->m_iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,C4JStorage::TMS_UGCTYPE_NONE,szFilename,pchData, uiChunkSize,
424 &CScene_TransferToXboxOne::TMSPPWriteReturned,lpParameter, 0);
425 uiBytesLeft-=uiChunkSize;
426 }
427 else
428 {
429 // last bit of the file to upload is less than uiChunkSize
430 eStatus=StorageManager.TMSPP_WriteFile(pClass->m_iPad,C4JStorage::eGlobalStorage_TitleUser,C4JStorage::TMS_FILETYPE_BINARY,C4JStorage::TMS_UGCTYPE_NONE,szFilename,pchData, uiBytesLeft,
431 &CScene_TransferToXboxOne::TMSPPWriteReturned,lpParameter, 0);
432 }
433
434 // wait until
435 if(eStatus!=C4JStorage::ETMSStatus_WriteInProgress)
436 {
437 // failed
438 pClass->m_bWaitingForWrite=false;
439 }
440 else
441 {
442 // loop waiting for the write to complete
443 while(pClass->m_bWaitingForWrite && (hr == S_OK))
444 {
445 Sleep(50);
446 }
447 uiComplete+=uiPercentageChunk;
448 if(uiComplete>100) uiComplete=100;
449
450 // update the progress
451 pMinecraft->progressRenderer->progressStagePercentage(uiComplete);
452 }
453 }
454
455
456
457 delete pClass->m_pvSaveMem;
458 }
459 return hr;
460}
461
462int CScene_TransferToXboxOne::LoadSaveDataReturned(void *pParam,bool bContinue)
463{
464 CScene_TransferToXboxOne* pClass = (CScene_TransferToXboxOne*)pParam;
465
466 if(bContinue==true)
467 {
468 unsigned int uiFileSize = StorageManager.GetSaveSize();
469 pClass->m_pvSaveMem = new BYTE [uiFileSize];
470 pClass->m_uiStorageLength=0;
471
472 StorageManager.GetSaveData( pClass->m_pvSaveMem, &pClass->m_uiStorageLength );
473
474 pClass->m_bSaveDataReceived=true;
475 }
476
477 return 0;
478}
479
480HRESULT CScene_TransferToXboxOne::OnKeyDown(XUIMessageInput* pInputData, BOOL& rfHandled)
481{
482 if(m_bIgnoreInput) return S_OK;
483
484 // if we're retrieving save info, ignore key presses
485 if(m_bRetrievingSaveInfo)
486 {
487 return S_OK;
488 }
489
490 ui.AnimateKeyPress(pInputData->UserIndex, pInputData->dwKeyCode);
491
492 HRESULT hr = S_OK;
493
494 // Explicitly handle B button presses
495 switch(pInputData->dwKeyCode)
496 {
497 case VK_PAD_B:
498 case VK_ESCAPE:
499
500 app.NavigateBack(XUSER_INDEX_ANY);
501 rfHandled = TRUE;
502 break;
503 case VK_PAD_X:
504 // wipe the save slots
505 if(m_pbSlotListFile!=NULL)
506 {
507 m_SavesSlotListTimer.SetShow(TRUE);
508 m_bIgnoreInput=true;
509
510 C4JStorage::ETMSStatus eStatus=StorageManager.TMSPP_DeleteFile(m_iPad,"XboxOne/SlotList",C4JStorage::TMS_FILETYPE_BINARY,&CScene_TransferToXboxOne::TMSPPDeleteReturned,this, 0);
511
512 }
513
514 break;
515 }
516
517 return hr;
518}
519
520HRESULT CScene_TransferToXboxOne::OnNotifySelChanged(HXUIOBJ hObjSource, XUINotifySelChanged *pNotifySelChangedData, BOOL& bHandled)
521{
522
523 //if(m_bReady)
524 {
525 CXuiSceneBase::PlayUISFX(eSFX_Focus);
526 }
527
528 return S_OK;
529}
530
531
532HRESULT CScene_TransferToXboxOne::OnTransitionStart( XUIMessageTransition *pTransition, BOOL& bHandled )
533{
534 //if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ) return S_OK;
535
536 if(pTransition->dwTransAction==XUI_TRANSITION_ACTION_DESTROY ||
537 pTransition->dwTransType == XUI_TRANSITION_FROM || pTransition->dwTransType == XUI_TRANSITION_BACKFROM)
538 {
539 // 4J Stu - We may have had to unload our font renderer in this scene if one of the save files
540 // uses characters not in our font (eg asian chars) so restore our font renderer
541 // This will not do anything if our font renderer is already loaded
542 app.OverrideFontRenderer(true,true);
543 }
544
545 return S_OK;
546}
547
548HRESULT CScene_TransferToXboxOne::OnFontRendererChange()
549{
550 // update the tooltips
551 CXuiSceneBase::SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, m_iX, -1,-1,-1,-1,-1,-1,true);
552
553 return S_OK;
554}
555
556HRESULT CScene_TransferToXboxOne::OnNotifySetFocus(HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled)
557{
558 // update the tooltips
559 CXuiSceneBase::SetTooltips( DEFAULT_XUI_MENU_USER, IDS_TOOLTIPS_SELECT, IDS_TOOLTIPS_BACK, m_iX, -1,-1,-1,-1,-1,-1,true);
560
561 return S_OK;
562}
563
564HRESULT CScene_TransferToXboxOne::OnNotifyKillFocus(HXUIOBJ hObjSource, XUINotifyFocus *pNotifyFocusData, BOOL& bHandled)
565{
566 return S_OK;
567}
568
569