2026-03-01 12:16:08 +08:00
# include "stdafx.h"
# include "..\Common\Consoles_App.h"
# include "..\User.h"
# include "..\..\Minecraft.Client\Minecraft.h"
# include "..\..\Minecraft.Client\MinecraftServer.h"
# include "..\..\Minecraft.Client\PlayerList.h"
# include "..\..\Minecraft.Client\ServerPlayer.h"
# include "..\..\Minecraft.World\Level.h"
# include "..\..\Minecraft.World\LevelSettings.h"
# include "..\..\Minecraft.World\BiomeSource.h"
# include "..\..\Minecraft.World\LevelType.h"
# include "..\..\Minecraft.World\StringHelpers.h"
# include "PSVita\Network\SonyRemoteStorage_Vita.h"
# include "PSVita\Network\SonyCommerce_Vita.h"
# include "..\..\Common\Network\Sony\SonyRemoteStorage.h"
# include "PSVita/Network/PSVita_NPToolkit.h"
# include <message_dialog.h>
# include <savedata_dialog.h>
2026-03-03 03:04:10 +08:00
# include "Common\UI\UI.h"
2026-03-01 12:16:08 +08:00
# include "PSVita\PSVitaExtras\PSVitaStrings.h"
# define VITA_COMMERCE_ENABLED
CConsoleMinecraftApp app ;
CConsoleMinecraftApp : : CConsoleMinecraftApp ( ) : CMinecraftApp ( )
{
memset ( & m_ThumbnailBuffer , 0 , sizeof ( ImageFileBuffer ) ) ;
memset ( & m_SaveImageBuffer , 0 , sizeof ( ImageFileBuffer ) ) ;
memset ( & ProductCodes , 0 , sizeof ( PRODUCTCODES ) ) ;
m_bVoiceChatAndUGCRestricted = false ;
m_bDisplayFullVersionPurchase = false ;
m_ProductListA = NULL ;
m_pRemoteStorage = new SonyRemoteStorage_Vita ;
m_bSaveIncompleteDialogRunning = false ;
m_bSaveDataDeleteDialogState = eSaveDataDeleteState_idle ;
m_pSaveToDelete = NULL ;
m_pCheckoutProductInfo = NULL ;
}
void CConsoleMinecraftApp : : SetRichPresenceContext ( int iPad , int contextId )
{
ProfileManager . SetRichPresenceContextValue ( iPad , CONTEXT_GAME_STATE , contextId ) ;
}
char * CConsoleMinecraftApp : : GetProductCode ( )
{
return ProductCodes . chProductCode ;
}
char * CConsoleMinecraftApp : : GetSaveFolderPrefix ( )
{
return ProductCodes . chSaveFolderPrefix ;
}
char * CConsoleMinecraftApp : : GetCommerceCategory ( )
{
return ProductCodes . chCommerceCategory ;
}
char * CConsoleMinecraftApp : : GetTexturePacksCategoryID ( )
{
return NULL ; // ProductCodes.chTexturePackID;
}
char * CConsoleMinecraftApp : : GetUpgradeKey ( )
{
return ProductCodes . chUpgradeKey ;
}
EProductSKU CConsoleMinecraftApp : : GetProductSKU ( )
{
return ProductCodes . eProductSKU ;
}
bool CConsoleMinecraftApp : : IsJapaneseSKU ( )
{
return ProductCodes . eProductSKU = = e_sku_SCEJ ;
}
bool CConsoleMinecraftApp : : IsEuropeanSKU ( )
{
return ProductCodes . eProductSKU = = e_sku_SCEE ;
}
bool CConsoleMinecraftApp : : IsAmericanSKU ( )
{
return ProductCodes . eProductSKU = = e_sku_SCEA ;
}
// char *CConsoleMinecraftApp::GetSKUPostfix()
// {
// return ProductCodes.chSkuPostfix;
// }
SONYDLC * CConsoleMinecraftApp : : GetSONYDLCInfo ( char * pchTitle )
{
wstring wstrTemp = convStringToWstring ( pchTitle ) ;
AUTO_VAR ( it , m_SONYDLCMap . find ( wstrTemp ) ) ;
if ( it = = m_SONYDLCMap . end ( ) )
{
app . DebugPrintf ( " Couldn't find DLC info for %s \n " , pchTitle ) ;
assert ( 0 ) ;
return NULL ;
}
return it - > second ;
/*wstring wstrTemp=convStringToWstring(pchTitle);
SONYDLC * pTemp = m_SONYDLCMap . at ( wstrTemp ) ;
return pTemp ; */
}
2026-03-03 03:04:10 +08:00
SONYDLC * CConsoleMinecraftApp : : GetSONYDLCInfo ( int iTexturePackID )
{
for ( AUTO_VAR ( it , m_SONYDLCMap . begin ( ) ) ; it ! = m_SONYDLCMap . end ( ) ; + + it )
{
if ( it - > second - > iConfig = = iTexturePackID )
return it - > second ;
}
return NULL ;
}
2026-03-01 12:16:08 +08:00
# define WRAPPED_READFILE(hFile,lpBuffer,nNumberOfBytesToRead,lpNumberOfBytesRead,lpOverlapped) {if(ReadFile(hFile,lpBuffer,nNumberOfBytesToRead,lpNumberOfBytesRead,lpOverlapped)==FALSE) { return FALSE;}}
BOOL CConsoleMinecraftApp : : ReadProductCodes ( )
{
char chDLCTitle [ 64 ] ;
// 4J-PB - Read the file containing the product codes. This will be different for the SCEE/SCEA/SCEJ builds
HANDLE file = CreateFile ( " PSVita/PSVitaProductCodes.bin " , GENERIC_READ , 0 , NULL , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL ) ;
if ( file = = INVALID_HANDLE_VALUE )
{
DWORD error = GetLastError ( ) ;
app . DebugPrintf ( " Failed to open ProductCodes.bin with error code %d (%x) \n " , error , error ) ;
return FALSE ;
}
DWORD dwHigh = 0 ;
DWORD dwFileSize = GetFileSize ( file , & dwHigh ) ;
if ( dwFileSize ! = 0 )
{
DWORD bytesRead ;
WRAPPED_READFILE ( file , ProductCodes . chProductCode , PRODUCT_CODE_SIZE , & bytesRead , NULL ) ;
WRAPPED_READFILE ( file , ProductCodes . chSaveFolderPrefix , SAVEFOLDERPREFIX_SIZE , & bytesRead , NULL ) ;
//WRAPPED_READFILE(file,ProductCodes.chDiscSaveFolderPrefix,SAVEFOLDERPREFIX_SIZE,&bytesRead,NULL);
WRAPPED_READFILE ( file , ProductCodes . chCommerceCategory , COMMERCE_CATEGORY_SIZE , & bytesRead , NULL ) ;
//WRAPPED_READFILE(file,ProductCodes.chTexturePackID,SCE_NP_COMMERCE2_CATEGORY_ID_LEN,&bytesRead,NULL); // TODO
WRAPPED_READFILE ( file , ProductCodes . chUpgradeKey , UPGRADE_KEY_SIZE , & bytesRead , NULL ) ;
//WRAPPED_READFILE(file,ProductCodes.chSkuPostfix,SKU_POSTFIX_SIZE,&bytesRead,NULL);
app . DebugPrintf ( " ProductCodes.chProductCode %s \n " , ProductCodes . chProductCode ) ;
app . DebugPrintf ( " ProductCodes.chSaveFolderPrefix %s \n " , ProductCodes . chSaveFolderPrefix ) ;
//app.DebugPrintf("ProductCodes.chDiscSaveFolderPrefix %s\n",ProductCodes.chDiscSaveFolderPrefix);
app . DebugPrintf ( " ProductCodes.chCommerceCategory %s \n " , ProductCodes . chCommerceCategory ) ;
//app.DebugPrintf("ProductCodes.chTexturePackID %s\n",ProductCodes.chTexturePackID);
app . DebugPrintf ( " ProductCodes.chUpgradeKey %s \n " , ProductCodes . chUpgradeKey ) ;
//app.DebugPrintf("ProductCodes.chSkuPostfix %s\n",ProductCodes.chSkuPostfix);
// DLC
unsigned int uiDLC ;
WRAPPED_READFILE ( file , & uiDLC , sizeof ( int ) , & bytesRead , NULL ) ;
for ( unsigned int i = 0 ; i < uiDLC ; i + + )
{
SONYDLC * pDLCInfo = new SONYDLC ;
memset ( pDLCInfo , 0 , sizeof ( SONYDLC ) ) ;
memset ( chDLCTitle , 0 , 64 ) ;
unsigned int uiVal ;
WRAPPED_READFILE ( file , & uiVal , sizeof ( int ) , & bytesRead , NULL ) ;
WRAPPED_READFILE ( file , pDLCInfo - > chDLCKeyname , sizeof ( char ) * uiVal , & bytesRead , NULL ) ;
WRAPPED_READFILE ( file , & uiVal , sizeof ( int ) , & bytesRead , NULL ) ;
WRAPPED_READFILE ( file , chDLCTitle , sizeof ( char ) * uiVal , & bytesRead , NULL ) ;
app . DebugPrintf ( " DLC title %s \n " , chDLCTitle ) ;
WRAPPED_READFILE ( file , & pDLCInfo - > eDLCType , sizeof ( int ) , & bytesRead , NULL ) ;
WRAPPED_READFILE ( file , & pDLCInfo - > iFirstSkin , sizeof ( int ) , & bytesRead , NULL ) ;
WRAPPED_READFILE ( file , & pDLCInfo - > iConfig , sizeof ( int ) , & bytesRead , NULL ) ;
// push this into a vector
wstring wstrTemp = convStringToWstring ( chDLCTitle ) ;
m_SONYDLCMap [ wstrTemp ] = pDLCInfo ;
}
CloseHandle ( file ) ;
}
if ( strcmp ( ProductCodes . chProductCode , " PCSB00560 " ) = = 0 )
ProductCodes . eProductSKU = e_sku_SCEE ;
else if ( strcmp ( ProductCodes . chProductCode , " PCSE00491 " ) = = 0 )
ProductCodes . eProductSKU = e_sku_SCEA ;
else if ( strcmp ( ProductCodes . chProductCode , " PCSG00302 " ) = = 0 )
ProductCodes . eProductSKU = e_sku_SCEJ ;
else
{
// unknown product ID
assert ( 0 ) ;
}
return TRUE ;
}
void CConsoleMinecraftApp : : StoreLaunchData ( )
{
}
void CConsoleMinecraftApp : : ExitGame ( )
{
}
void CConsoleMinecraftApp : : FatalLoadError ( )
{
assert ( 0 ) ;
}
void CConsoleMinecraftApp : : CaptureSaveThumbnail ( )
{
RenderManager . CaptureThumbnail ( & m_ThumbnailBuffer ) ;
}
void CConsoleMinecraftApp : : GetSaveThumbnail ( PBYTE * ppbThumbnailData , DWORD * pdwThumbnailSize , PBYTE * ppbDataImage , DWORD * pdwSizeImage )
{
// on a save caused by a create world, the thumbnail capture won't have happened
if ( m_ThumbnailBuffer . Allocated ( ) )
{
if ( ppbThumbnailData )
{
* ppbThumbnailData = new BYTE [ m_ThumbnailBuffer . GetBufferSize ( ) ] ;
* pdwThumbnailSize = m_ThumbnailBuffer . GetBufferSize ( ) ;
memcpy ( * ppbThumbnailData , m_ThumbnailBuffer . GetBufferPointer ( ) , * pdwThumbnailSize ) ;
}
m_ThumbnailBuffer . Release ( ) ;
}
else
{
if ( ppbThumbnailData )
{
// use the default image
StorageManager . GetDefaultSaveThumbnail ( ppbThumbnailData , pdwThumbnailSize ) ;
}
}
if ( m_SaveImageBuffer . Allocated ( ) )
{
if ( ppbDataImage )
{
* ppbDataImage = new BYTE [ m_SaveImageBuffer . GetBufferSize ( ) ] ;
* pdwSizeImage = m_SaveImageBuffer . GetBufferSize ( ) ;
memcpy ( * ppbDataImage , m_SaveImageBuffer . GetBufferPointer ( ) , * pdwSizeImage ) ;
}
m_SaveImageBuffer . Release ( ) ;
}
else
{
if ( ppbDataImage )
{
// use the default image
StorageManager . GetDefaultSaveImage ( ppbDataImage , pdwSizeImage ) ;
}
}
}
void CConsoleMinecraftApp : : ReleaseSaveThumbnail ( )
{
}
void CConsoleMinecraftApp : : GetScreenshot ( int iPad , PBYTE * pbData , DWORD * pdwSize )
{
}
int CConsoleMinecraftApp : : GetLocalTMSFileIndex ( WCHAR * wchTMSFile , bool bFilenameIncludesExtension , eFileExtensionType eEXT )
{
return - 1 ;
}
int CConsoleMinecraftApp : : LoadLocalTMSFile ( WCHAR * wchTMSFile )
{
return - 1 ;
}
int CConsoleMinecraftApp : : LoadLocalTMSFile ( WCHAR * wchTMSFile , eFileExtensionType eExt )
{
return - 1 ;
}
void CConsoleMinecraftApp : : FreeLocalTMSFiles ( eTMSFileType eType )
{
}
void CConsoleMinecraftApp : : TemporaryCreateGameStart ( )
{
////////////////////////////////////////////////////////////////////////////////////////////// From CScene_Main::OnInit
app . setLevelGenerationOptions ( NULL ) ;
// From CScene_Main::RunPlayGame
Minecraft * pMinecraft = Minecraft : : GetInstance ( ) ;
app . ReleaseSaveThumbnail ( ) ;
ProfileManager . SetLockedProfile ( 0 ) ;
pMinecraft - > user - > name = L " Vita " ;
app . ApplyGameSettingsChanged ( 0 ) ;
////////////////////////////////////////////////////////////////////////////////////////////// From CScene_MultiGameJoinLoad::OnInit
MinecraftServer : : resetFlags ( ) ;
// From CScene_MultiGameJoinLoad::OnNotifyPressEx
app . SetTutorialMode ( false ) ;
app . SetCorruptSaveDeleted ( false ) ;
////////////////////////////////////////////////////////////////////////////////////////////// From CScene_MultiGameCreate::CreateGame
app . ClearTerrainFeaturePosition ( ) ;
wstring wWorldName = L " TestWorld " ;
bool isFlat = false ;
2026-03-02 17:39:35 +07:00
__int64 seedValue = 0 ; //BiomeSource::findSeed(isFlat?LevelType::lvl_flat:LevelType::lvl_normal); // 4J - was (new Random())->nextLong() - now trying to actually find a seed to suit our requirements
2026-03-01 12:16:08 +08:00
NetworkGameInitData * param = new NetworkGameInitData ( ) ;
param - > seed = seedValue ;
param - > saveData = NULL ;
g_NetworkManager . HostGame ( 0 , false , true , MINECRAFT_NET_MAX_PLAYERS , 0 ) ;
app . SetGameHostOption ( eGameHostOption_Difficulty , 0 ) ;
app . SetGameHostOption ( eGameHostOption_FriendsOfFriends , 0 ) ;
app . SetGameHostOption ( eGameHostOption_Gamertags , 1 ) ;
app . SetGameHostOption ( eGameHostOption_BedrockFog , 1 ) ;
2026-03-02 17:39:35 +07:00
app . SetGameHostOption ( eGameHostOption_GameType , GameType : : CREATIVE - > getId ( ) ) ;
2026-03-01 12:16:08 +08:00
app . SetGameHostOption ( eGameHostOption_LevelType , 0 ) ;
app . SetGameHostOption ( eGameHostOption_Structures , 1 ) ;
app . SetGameHostOption ( eGameHostOption_BonusChest , 0 ) ;
app . SetGameHostOption ( eGameHostOption_PvP , 1 ) ;
app . SetGameHostOption ( eGameHostOption_TrustPlayers , 1 ) ;
app . SetGameHostOption ( eGameHostOption_FireSpreads , 1 ) ;
app . SetGameHostOption ( eGameHostOption_TNT , 1 ) ;
app . SetGameHostOption ( eGameHostOption_HostCanFly , 1 ) ;
app . SetGameHostOption ( eGameHostOption_HostCanChangeHunger , 1 ) ;
app . SetGameHostOption ( eGameHostOption_HostCanBeInvisible , 1 ) ;
2026-03-03 03:04:10 +08:00
app . SetGameHostOption ( eGameHostOption_MobGriefing , 1 ) ;
app . SetGameHostOption ( eGameHostOption_KeepInventory , 0 ) ;
app . SetGameHostOption ( eGameHostOption_DoMobSpawning , 1 ) ;
app . SetGameHostOption ( eGameHostOption_DoMobLoot , 1 ) ;
app . SetGameHostOption ( eGameHostOption_DoTileDrops , 1 ) ;
app . SetGameHostOption ( eGameHostOption_NaturalRegeneration , 1 ) ;
app . SetGameHostOption ( eGameHostOption_DoDaylightCycle , 1 ) ;
2026-03-01 12:16:08 +08:00
param - > settings = app . GetGameHostOption ( eGameHostOption_All ) ;
g_NetworkManager . FakeLocalPlayerJoined ( ) ;
LoadingInputParams * loadingParams = new LoadingInputParams ( ) ;
loadingParams - > func = & CGameNetworkManager : : RunNetworkGameThreadProc ;
loadingParams - > lpParam = ( LPVOID ) param ;
// Reset the autosave time
app . SetAutosaveTimerTime ( ) ;
C4JThread * thread = new C4JThread ( loadingParams - > func , loadingParams - > lpParam , " RunNetworkGame " ) ;
thread - > Run ( ) ;
}
// COMMERCE / DLC
void CConsoleMinecraftApp : : CommerceInit ( )
{
m_bCommerceCategoriesRetrieved = false ;
m_bCommerceProductListRetrieved = false ;
m_bCommerceInitialised = false ;
m_bProductListAdditionalDetailsRetrieved = false ;
# ifdef VITA_COMMERCE_ENABLED
m_pCommerce = new SonyCommerce_Vita ;
# endif
m_eCommerce_State = eCommerce_State_Offline ; // can only init when we have a PSN user
m_ProductListRetrievedC = 0 ;
m_ProductListAdditionalDetailsC = 0 ;
m_ProductListCategoriesC = 0 ;
m_iCurrentCategory = 0 ;
m_iCurrentProduct = 0 ;
memset ( m_pchSkuID , 0 , 48 ) ;
}
void CConsoleMinecraftApp : : CommerceTick ( )
{
# ifdef VITA_COMMERCE_ENABLED
// only tick this if the primary user is signed in to the PSN
if ( ProfileManager . IsSignedInLive ( 0 ) )
{
switch ( m_eCommerce_State )
{
case eCommerce_State_Offline :
m_eCommerce_State = eCommerce_State_Init ;
break ;
case eCommerce_State_Init :
m_eCommerce_State = eCommerce_State_Init_Pending ;
m_pCommerce - > CreateSession ( & CConsoleMinecraftApp : : CommerceInitCallback , this ) ;
break ;
case eCommerce_State_GetCategories :
m_eCommerce_State = eCommerce_State_GetCategories_Pending ;
// get all categories for this product
m_pCommerce - > GetCategoryInfo ( & CConsoleMinecraftApp : : CommerceGetCategoriesCallback , this , & m_CategoryInfo , app . GetCommerceCategory ( ) ) ;
break ;
case eCommerce_State_GetProductList :
2026-03-02 17:39:35 +07:00
{
2026-03-01 12:16:08 +08:00
m_eCommerce_State = eCommerce_State_GetProductList_Pending ;
SonyCommerce : : CategoryInfo * pCategories = app . GetCategoryInfo ( ) ;
std : : list < SonyCommerce : : CategoryInfoSub > : : iterator iter = pCategories - > subCategories . begin ( ) ;
for ( int i = 0 ; i < m_ProductListRetrievedC ; i + + )
{
iter + + ;
}
SonyCommerce : : CategoryInfoSub category = ( SonyCommerce : : CategoryInfoSub ) ( * iter ) ;
m_pCommerce - > GetProductList ( & CConsoleMinecraftApp : : CommerceGetProductListCallback , this , & m_ProductListA [ m_ProductListRetrievedC ] , category . categoryId ) ;
}
break ;
case eCommerce_State_AddProductInfoDetailed :
2026-03-02 17:39:35 +07:00
{
2026-03-01 12:16:08 +08:00
m_eCommerce_State = eCommerce_State_AddProductInfoDetailed_Pending ;
// for each of the products in the categories, get the detailed info. We really only need the long description and price info.
SonyCommerce : : CategoryInfo * pCategories = app . GetCategoryInfo ( ) ;
std : : list < SonyCommerce : : CategoryInfoSub > : : iterator iter = pCategories - > subCategories . begin ( ) ;
for ( int i = 0 ; i < m_iCurrentCategory ; i + + )
{
iter + + ;
}
SonyCommerce : : CategoryInfoSub category = ( SonyCommerce : : CategoryInfoSub ) ( * iter ) ;
std : : vector < SonyCommerce : : ProductInfo > * pvProductList = & m_ProductListA [ m_iCurrentCategory ] ;
// 4J-PB - there may be no products in the category
if ( pvProductList - > size ( ) = = 0 )
{
CConsoleMinecraftApp : : CommerceAddDetailedProductInfoCallback ( this , 0 ) ;
}
else
{
assert ( pvProductList - > size ( ) > m_iCurrentProduct ) ;
SonyCommerce : : ProductInfo * pProductInfo = & ( pvProductList - > at ( m_iCurrentProduct ) ) ;
m_pCommerce - > AddDetailedProductInfo ( & CConsoleMinecraftApp : : CommerceAddDetailedProductInfoCallback , this , pProductInfo , pProductInfo - > productId , category . categoryId ) ;
}
}
break ;
case eCommerce_State_Checkout :
m_pCommerce - > CreateSession ( & CConsoleMinecraftApp : : CheckoutSessionStartedCallback , this ) ;
m_eCommerce_State = eCommerce_State_Checkout_WaitingForSession ;
break ;
case eCommerce_State_Checkout_SessionStarted :
m_eCommerce_State = eCommerce_State_Checkout_Pending ;
( ( SonyCommerce_Vita * ) m_pCommerce ) - > Checkout ( & CConsoleMinecraftApp : : CommerceCheckoutCallback , this , m_pCheckoutProductInfo ) ;
break ;
case eCommerce_State_RegisterDLC :
2026-03-02 17:39:35 +07:00
{
2026-03-01 12:16:08 +08:00
m_eCommerce_State = eCommerce_State_Online ;
// register the DLC info
SonyCommerce : : CategoryInfo * pCategories = app . GetCategoryInfo ( ) ;
std : : list < SonyCommerce : : CategoryInfoSub > : : iterator iter = pCategories - > subCategories . begin ( ) ;
for ( int i = 0 ; i < m_iCurrentCategory ; i + + )
{
std : : vector < SonyCommerce : : ProductInfo > * pvProductList = & m_ProductListA [ i ] ;
for ( int j = 0 ; j < pvProductList - > size ( ) ; j + + )
{
SonyCommerce : : ProductInfo * pProductInfo = & ( pvProductList - > at ( j ) ) ;
// just want the final 16 characters of the product id
RegisterDLCData ( & pProductInfo - > productId [ 20 ] , 0 , pProductInfo - > imageUrl ) ;
}
iter + + ;
}
}
break ;
case eCommerce_State_DownloadAlreadyPurchased :
m_pCommerce - > CreateSession ( & CConsoleMinecraftApp : : DownloadAlreadyPurchasedSessionStartedCallback , this ) ;
m_eCommerce_State = eCommerce_State_DownloadAlreadyPurchased_WaitingForSession ;
break ;
case eCommerce_State_DownloadAlreadyPurchased_SessionStarted :
m_eCommerce_State = eCommerce_State_DownloadAlreadyPurchased_Pending ;
m_pCommerce - > DownloadAlreadyPurchased ( & CConsoleMinecraftApp : : CommerceCheckoutCallback , this , m_pchSkuID ) ;
break ;
case eCommerce_State_UpgradeTrial :
m_pCommerce - > CreateSession ( & CConsoleMinecraftApp : : UpgradeTrialSessionStartedCallback , this ) ;
m_eCommerce_State = eCommerce_State_UpgradeTrial_WaitingForSession ;
break ;
case eCommerce_State_UpgradeTrial_SessionStarted :
m_pCommerce - > UpgradeTrial ( & CConsoleMinecraftApp : : CommerceCheckoutCallback , this ) ;
m_eCommerce_State = eCommerce_State_UpgradeTrial_Pending ;
break ;
}
// 4J-PB - bit of a hack to display the full version purchase after signing in during a trial trophy popup
if ( m_bDisplayFullVersionPurchase & & ( ( m_eCommerce_State = = eCommerce_State_Online ) | | ( m_eCommerce_State = = eCommerce_State_Error ) ) )
{
m_bDisplayFullVersionPurchase = false ;
ProfileManager . DisplayFullVersionPurchase ( false , ProfileManager . GetPrimaryPad ( ) , eSen_UpsellID_Full_Version_Of_Game ) ;
}
}
else
{
// was the primary player signed in and is now signed out?
if ( m_eCommerce_State ! = eCommerce_State_Offline )
{
m_eCommerce_State = eCommerce_State_Offline ;
// clear out all the product info
ClearCommerceDetails ( ) ;
m_pCommerce - > CloseSession ( ) ;
}
}
# endif // VITA_COMMERCE_ENABLED
}
bool CConsoleMinecraftApp : : GetCommerceCategoriesRetrieved ( )
{
return m_bCommerceCategoriesRetrieved ;
}
bool CConsoleMinecraftApp : : GetCommerceProductListRetrieved ( )
{
return m_bCommerceProductListRetrieved ;
}
bool CConsoleMinecraftApp : : GetCommerceProductListInfoRetrieved ( )
{
return m_bProductListAdditionalDetailsRetrieved ;
}
# ifdef VITA_COMMERCE_ENABLED
SonyCommerce : : CategoryInfo * CConsoleMinecraftApp : : GetCategoryInfo ( )
{
if ( m_bCommerceCategoriesRetrieved = = false )
{
return NULL ;
}
return & m_CategoryInfo ;
}
2026-03-02 17:39:35 +07:00
# endif
2026-03-01 12:16:08 +08:00
void CConsoleMinecraftApp : : ClearCommerceDetails ( )
{
# ifdef VITA_COMMERCE_ENABLED
for ( int i = 0 ; i < m_ProductListCategoriesC ; i + + )
{
2026-03-02 17:39:35 +07:00
std : : vector < SonyCommerce : : ProductInfo > * pProductList = & m_ProductListA [ i ] ;
2026-03-01 12:16:08 +08:00
pProductList - > clear ( ) ;
}
if ( m_ProductListA ! = NULL )
{
2026-03-02 17:39:35 +07:00
delete [ ] m_ProductListA ;
2026-03-01 12:16:08 +08:00
m_ProductListA = NULL ;
}
m_ProductListRetrievedC = 0 ;
m_ProductListAdditionalDetailsC = 0 ;
m_ProductListCategoriesC = 0 ;
m_iCurrentCategory = 0 ;
m_iCurrentProduct = 0 ;
m_bCommerceCategoriesRetrieved = false ;
m_bCommerceInitialised = false ;
m_bCommerceProductListRetrieved = false ;
m_bProductListAdditionalDetailsRetrieved = false ;
m_CategoryInfo . subCategories . clear ( ) ;
# endif // #ifdef VITA_COMMERCE_ENABLED
}
void CConsoleMinecraftApp : : GetDLCSkuIDFromProductList ( char * pchDLCProductID , char * pchSkuID )
{
# ifdef VITA_COMMERCE_ENABLED
// find the DLC
for ( int i = 0 ; i < m_ProductListCategoriesC ; i + + )
{
for ( int j = 0 ; j < m_ProductListA [ i ] . size ( ) ; j + + )
{
std : : vector < SonyCommerce : : ProductInfo > * pProductList = & m_ProductListA [ i ] ;
AUTO_VAR ( itEnd , pProductList - > end ( ) ) ;
for ( AUTO_VAR ( it , pProductList - > begin ( ) ) ; it ! = itEnd ; it + + )
{
SonyCommerce : : ProductInfo Info = * it ;
if ( strcmp ( pchDLCProductID , Info . productId ) = = 0 )
2026-03-02 17:39:35 +07:00
{
2026-03-01 12:16:08 +08:00
memcpy ( pchSkuID , Info . skuId , SCE_NP_COMMERCE2_SKU_ID_LEN ) ;
return ;
}
2026-03-02 17:39:35 +07:00
}
2026-03-01 12:16:08 +08:00
}
}
return ;
# endif // #ifdef VITA_COMMERCE_ENABLED
}
void CConsoleMinecraftApp : : Checkout ( char * pchSkuID )
{
SonyCommerce : : ProductInfo * productInfo = NULL ;
for ( int i = 0 ; i < m_ProductListCategoriesC ; i + + )
{
for ( int j = 0 ; j < m_ProductListA [ i ] . size ( ) ; j + + )
{
std : : vector < SonyCommerce : : ProductInfo > * pProductList = & m_ProductListA [ i ] ;
AUTO_VAR ( itEnd , pProductList - > end ( ) ) ;
for ( AUTO_VAR ( it , pProductList - > begin ( ) ) ; it ! = itEnd ; it + + )
{
SonyCommerce : : ProductInfo Info = * it ;
if ( strcmp ( pchSkuID , Info . skuId ) = = 0 )
2026-03-02 17:39:35 +07:00
{
2026-03-01 12:16:08 +08:00
productInfo = & ( * it ) ;
break ;
}
2026-03-02 17:39:35 +07:00
}
2026-03-01 12:16:08 +08:00
}
}
if ( productInfo )
{
if ( m_eCommerce_State = = eCommerce_State_Online )
2026-03-02 17:39:35 +07:00
{
2026-03-01 12:16:08 +08:00
strcpy ( m_pchSkuID , productInfo - > skuId ) ;
m_pCheckoutProductInfo = productInfo ;
m_eCommerce_State = eCommerce_State_Checkout ;
}
}
else
{
assert ( 0 ) ;
}
}
void CConsoleMinecraftApp : : DownloadAlreadyPurchased ( char * pchSkuID )
{
if ( m_eCommerce_State = = eCommerce_State_Online )
2026-03-02 17:39:35 +07:00
{
2026-03-01 12:16:08 +08:00
strcpy ( m_pchSkuID , pchSkuID ) ;
m_eCommerce_State = eCommerce_State_DownloadAlreadyPurchased ;
}
}
bool CConsoleMinecraftApp : : UpgradeTrial ( )
{
if ( m_eCommerce_State = = eCommerce_State_Online )
2026-03-02 17:39:35 +07:00
{
2026-03-01 12:16:08 +08:00
m_eCommerce_State = eCommerce_State_UpgradeTrial ;
return true ;
}
else if ( m_eCommerce_State = = eCommerce_State_Error )
{
UINT uiIDA [ 1 ] ;
uiIDA [ 0 ] = IDS_CONFIRM_OK ;
2026-03-03 03:04:10 +08:00
C4JStorage : : EMessageResult result = ui . RequestErrorMessage ( IDS_PRO_UNLOCKGAME_TITLE , IDS_NO_DLCOFFERS , uiIDA , 1 , ProfileManager . GetPrimaryPad ( ) ) ;
2026-03-01 12:16:08 +08:00
return true ;
}
else
{
// commerce is busy
return false ;
}
}
# ifdef VITA_COMMERCE_ENABLED
std : : vector < SonyCommerce : : ProductInfo > * CConsoleMinecraftApp : : GetProductList ( int iIndex )
{
if ( ( m_bCommerceProductListRetrieved = = false ) | | ( m_bProductListAdditionalDetailsRetrieved = = false ) )
{
return NULL ;
}
return & m_ProductListA [ iIndex ] ;
}
# endif // #ifdef VITA_COMMERCE_ENABLED
bool CConsoleMinecraftApp : : DLCAlreadyPurchased ( char * pchTitle )
{
# ifdef VITA_COMMERCE_ENABLED
// find the DLC
for ( int i = 0 ; i < m_ProductListCategoriesC ; i + + )
{
for ( int j = 0 ; j < m_ProductListA [ i ] . size ( ) ; j + + )
{
std : : vector < SonyCommerce : : ProductInfo > * pProductList = & m_ProductListA [ i ] ;
AUTO_VAR ( itEnd , pProductList - > end ( ) ) ;
for ( AUTO_VAR ( it , pProductList - > begin ( ) ) ; it ! = itEnd ; it + + )
{
SonyCommerce : : ProductInfo Info = * it ;
if ( strcmp ( pchTitle , Info . skuId ) = = 0 )
2026-03-02 17:39:35 +07:00
{
2026-03-01 12:16:08 +08:00
if ( Info . purchasabilityFlag = = SCE_TOOLKIT_NP_COMMERCE_NOT_PURCHASED )
{
return false ;
}
else
{
return true ;
}
}
2026-03-02 17:39:35 +07:00
}
2026-03-01 12:16:08 +08:00
}
}
# endif //#ifdef VITA_COMMERCE_ENABLED
return false ;
}
////////////////////
// Commerce callbacks
/////////////////////
void CConsoleMinecraftApp : : CommerceInitCallback ( LPVOID lpParam , int err )
{
CConsoleMinecraftApp * pClass = ( CConsoleMinecraftApp * ) lpParam ;
if ( err = = 0 )
{
pClass - > m_eCommerce_State = eCommerce_State_GetCategories ;
}
else
{
pClass - > m_eCommerce_State = eCommerce_State_Error ;
pClass - > m_ProductListCategoriesC = 0 ;
pClass - > m_bCommerceCategoriesRetrieved = true ;
}
}
void CConsoleMinecraftApp : : CommerceGetCategoriesCallback ( LPVOID lpParam , int err )
{
# ifdef VITA_COMMERCE_ENABLED
CConsoleMinecraftApp * pClass = ( CConsoleMinecraftApp * ) lpParam ;
if ( err = = 0 )
{
pClass - > m_ProductListCategoriesC = pClass - > m_CategoryInfo . countOfSubCategories ;
2026-03-02 17:39:35 +07:00
// allocate the memory for the product info for each categories
2026-03-01 12:16:08 +08:00
if ( pClass - > m_CategoryInfo . countOfSubCategories > 0 )
{
pClass - > m_ProductListA = ( std : : vector < SonyCommerce : : ProductInfo > * ) new std : : vector < SonyCommerce : : ProductInfo > [ pClass - > m_CategoryInfo . countOfSubCategories ] ;
pClass - > m_eCommerce_State = eCommerce_State_GetProductList ;
}
else
{
pClass - > m_eCommerce_State = eCommerce_State_Online ;
}
}
else
{
pClass - > m_ProductListCategoriesC = 0 ;
pClass - > m_eCommerce_State = eCommerce_State_Error ;
}
pClass - > m_bCommerceCategoriesRetrieved = true ;
# endif // #ifdef VITA_COMMERCE_ENABLED
}
void CConsoleMinecraftApp : : CommerceGetProductListCallback ( LPVOID lpParam , int err )
{
CConsoleMinecraftApp * pClass = ( CConsoleMinecraftApp * ) lpParam ;
if ( err = = 0 )
{
pClass - > m_ProductListRetrievedC + + ;
// if we have more info to get, keep going with the next call
if ( pClass - > m_ProductListRetrievedC = = pClass - > m_CategoryInfo . countOfSubCategories )
{
// we're done, so now retrieve the additional product details for each product
pClass - > m_eCommerce_State = eCommerce_State_AddProductInfoDetailed ;
2026-03-02 17:39:35 +07:00
pClass - > m_bCommerceProductListRetrieved = true ;
2026-03-01 12:16:08 +08:00
}
else
{
pClass - > m_eCommerce_State = eCommerce_State_GetProductList ;
}
}
else
{
pClass - > m_eCommerce_State = eCommerce_State_Error ;
2026-03-02 17:39:35 +07:00
pClass - > m_bCommerceProductListRetrieved = true ;
2026-03-01 12:16:08 +08:00
}
}
// void CConsoleMinecraftApp::CommerceGetDetailedProductInfoCallback(LPVOID lpParam,int err)
// {
// CConsoleMinecraftApp *pScene=(CConsoleMinecraftApp *)lpParam;
2026-03-02 17:39:35 +07:00
//
2026-03-01 12:16:08 +08:00
// if(err==0)
// {
// pScene->m_eCommerce_State=eCommerce_State_Idle;
2026-03-02 17:39:35 +07:00
// //pScene->m_bCommerceProductListRetrieved=true;
2026-03-01 12:16:08 +08:00
// }
// //printf("Callback hit, error 0x%08x\n", err);
2026-03-02 17:39:35 +07:00
//
2026-03-01 12:16:08 +08:00
// }
void CConsoleMinecraftApp : : CommerceAddDetailedProductInfoCallback ( LPVOID lpParam , int err )
{
# ifdef VITA_COMMERCE_ENABLED
CConsoleMinecraftApp * pClass = ( CConsoleMinecraftApp * ) lpParam ;
if ( err = = 0 )
{
// increment the current product counter. When this gets to the end of the products, move to the next category
pClass - > m_iCurrentProduct + + ;
std : : vector < SonyCommerce : : ProductInfo > * pvProductList = & pClass - > m_ProductListA [ pClass - > m_iCurrentCategory ] ;
// if there are no more products in this category, move to the next category (there may be no products in the category)
if ( pClass - > m_iCurrentProduct > = pvProductList - > size ( ) )
{
// MGH - change this to a while loop so we can skip empty categories.
do
2026-03-02 17:39:35 +07:00
{
2026-03-01 12:16:08 +08:00
pClass - > m_iCurrentCategory + + ;
} while ( pClass - > m_ProductListA [ pClass - > m_iCurrentCategory ] . size ( ) = = 0 & & pClass - > m_iCurrentCategory < pClass - > m_ProductListCategoriesC ) ;
pClass - > m_iCurrentProduct = 0 ;
if ( pClass - > m_iCurrentCategory = = pClass - > m_ProductListCategoriesC )
{
// there are no more categories, so we're done
pClass - > m_eCommerce_State = eCommerce_State_RegisterDLC ;
2026-03-02 17:39:35 +07:00
pClass - > m_bProductListAdditionalDetailsRetrieved = true ;
2026-03-01 12:16:08 +08:00
}
else
{
// continue with the next category
2026-03-02 17:39:35 +07:00
pClass - > m_eCommerce_State = eCommerce_State_AddProductInfoDetailed ;
2026-03-01 12:16:08 +08:00
}
}
else
{
// continue with the next product
pClass - > m_eCommerce_State = eCommerce_State_AddProductInfoDetailed ;
}
}
else
{
pClass - > m_eCommerce_State = eCommerce_State_Error ;
2026-03-02 17:39:35 +07:00
pClass - > m_bProductListAdditionalDetailsRetrieved = true ;
2026-03-01 12:16:08 +08:00
pClass - > m_iCurrentProduct = 0 ;
pClass - > m_iCurrentCategory = 0 ;
}
# endif //#ifdef VITA_COMMERCE_ENABLED
}
void CConsoleMinecraftApp : : CommerceCheckoutCallback ( LPVOID lpParam , int err )
{
CConsoleMinecraftApp * pClass = ( CConsoleMinecraftApp * ) lpParam ;
if ( err = = 0 )
{
}
pClass - > m_eCommerce_State = eCommerce_State_Online ;
}
void CConsoleMinecraftApp : : CheckoutSessionStartedCallback ( LPVOID lpParam , int err )
{
CConsoleMinecraftApp * pClass = ( CConsoleMinecraftApp * ) lpParam ;
if ( err = = 0 )
pClass - > m_eCommerce_State = eCommerce_State_Checkout_SessionStarted ;
else
pClass - > m_eCommerce_State = eCommerce_State_Error ;
}
void CConsoleMinecraftApp : : DownloadAlreadyPurchasedSessionStartedCallback ( LPVOID lpParam , int err )
{
CConsoleMinecraftApp * pClass = ( CConsoleMinecraftApp * ) lpParam ;
if ( err = = 0 )
pClass - > m_eCommerce_State = eCommerce_State_DownloadAlreadyPurchased_SessionStarted ;
else
pClass - > m_eCommerce_State = eCommerce_State_Error ;
}
void CConsoleMinecraftApp : : UpgradeTrialSessionStartedCallback ( LPVOID lpParam , int err )
{
CConsoleMinecraftApp * pClass = ( CConsoleMinecraftApp * ) lpParam ;
if ( err = = 0 )
pClass - > m_eCommerce_State = eCommerce_State_UpgradeTrial_SessionStarted ;
else
pClass - > m_eCommerce_State = eCommerce_State_Error ;
}
bool CConsoleMinecraftApp : : GetTrialFromName ( char * pchDLCName )
{
if ( pchDLCName [ 0 ] = = ' T ' )
{
return true ;
}
return false ;
}
eDLCContentType CConsoleMinecraftApp : : GetDLCTypeFromName ( char * pchDLCName )
{
char chDLCType [ 3 ] ;
chDLCType [ 0 ] = pchDLCName [ 1 ] ;
chDLCType [ 1 ] = pchDLCName [ 2 ] ;
chDLCType [ 2 ] = 0 ;
app . DebugPrintf ( 6 , " DLC - %s \n " , pchDLCName ) ;
if ( strcmp ( chDLCType , " SP " ) = = 0 )
{
return e_DLC_SkinPack ;
}
else if ( strcmp ( chDLCType , " GP " ) = = 0 )
{
return e_DLC_Gamerpics ;
}
else if ( strcmp ( chDLCType , " TH " ) = = 0 )
{
return e_DLC_Themes ;
}
else if ( strcmp ( chDLCType , " AV " ) = = 0 )
{
return e_DLC_AvatarItems ;
}
else if ( strcmp ( chDLCType , " MP " ) = = 0 )
{
return e_DLC_MashupPacks ;
}
else if ( strcmp ( chDLCType , " TP " ) = = 0 )
{
return e_DLC_TexturePacks ;
}
else
{
return e_DLC_NotDefined ;
}
}
int CConsoleMinecraftApp : : GetiConfigFromName ( char * pchName )
{
char pchiConfig [ 5 ] ;
int iStrlen = strlen ( pchName ) ;
// last four character of DLC product name are the iConfig value
pchiConfig [ 0 ] = pchName [ iStrlen - 4 ] ;
pchiConfig [ 1 ] = pchName [ iStrlen - 3 ] ;
pchiConfig [ 2 ] = pchName [ iStrlen - 2 ] ;
pchiConfig [ 3 ] = pchName [ iStrlen - 1 ] ;
pchiConfig [ 4 ] = 0 ;
return atoi ( pchiConfig ) ;
}
int CConsoleMinecraftApp : : GetiFirstSkinFromName ( char * pchName )
{
char pchiFirstSkin [ 5 ] ;
int iStrlen = strlen ( pchName ) ;
// last four character of DLC product name are the iConfig value
// four before that are the first skin id
pchiFirstSkin [ 0 ] = pchName [ iStrlen - 8 ] ;
pchiFirstSkin [ 1 ] = pchName [ iStrlen - 7 ] ;
pchiFirstSkin [ 2 ] = pchName [ iStrlen - 6 ] ;
pchiFirstSkin [ 3 ] = pchName [ iStrlen - 5 ] ;
pchiFirstSkin [ 4 ] = 0 ;
return atoi ( pchiFirstSkin ) ;
}
// void CConsoleMinecraftApp::SetVoiceChatAndUGCRestricted(bool bRestricted)
//{
// m_bVoiceChatAndUGCRestricted=bRestricted;
//}
// bool CConsoleMinecraftApp::GetVoiceChatAndUGCRestricted(void)
//{
// return m_bVoiceChatAndUGCRestricted;
//}
int CConsoleMinecraftApp : : GetCommerceState ( )
{
return m_eCommerce_State ;
}
// bool g_bCalledJoin = false;
void CConsoleMinecraftApp : : AppEventTick ( )
{
int res = SCE_OK ;
SceAppMgrAppState appStatus ;
res = sceAppMgrGetAppState ( & appStatus ) ;
// if(!g_bCalledJoin)
// {
// SceAppUtilNpBasicJoinablePresenceParam joinParam = {0};
// strcpy(joinParam.npId.handle.data, "Mark4J");
// SQRNetworkManager_Vita::GetJoinablePresenceDataAndProcess(&joinParam);
// }
if ( res = = SCE_OK )
{
if ( appStatus . appEventNum > 0 )
{
SceAppUtilAppEventParam eventParam ;
memset ( & eventParam , 0 , sizeof ( SceAppUtilAppEventParam ) ) ;
res = sceAppUtilReceiveAppEvent ( & eventParam ) ;
if ( res = = SCE_OK )
{
if ( SCE_APPUTIL_APPEVENT_TYPE_NP_APP_DATA_MESSAGE = = eventParam . type )
{
PSVitaNPToolkit : : getMessageData ( & eventParam ) ;
// Messaging::Interface::retrieveMessageAttachment(&eventParam,&s_attachment);
}
else if ( SCE_APPUTIL_APPEVENT_TYPE_NP_BASIC_JOINABLE_PRESENCE = = eventParam . type )
{
PSVitaNPToolkit : : getMessageData ( & eventParam ) ;
}
else
{
app . DebugPrintf ( " unknown app event : 0x%08x \n " , eventParam . type ) ;
assert ( 0 ) ;
}
}
}
if ( appStatus . systemEventNum > 0 )
{
SceAppMgrSystemEvent systemEvent ;
memset ( & systemEvent , 0 , sizeof ( SceAppMgrSystemEvent ) ) ;
res = sceAppMgrReceiveSystemEvent ( & systemEvent ) ;
if ( res = = SCE_OK )
{
switch ( systemEvent . systemEvent )
{
case SCE_APPMGR_SYSTEMEVENT_ON_STORE_PURCHASE :
SonyCommerce_Vita : : checkBackgroundDownloadStatus ( ) ;
break ;
case SCE_APPMGR_SYSTEMEVENT_ON_RESUME :
app . DebugPrintf ( " SCE_APPMGR_SYSTEMEVENT_ON_RESUME event received \n " ) ;
break ;
case SCE_APPMGR_SYSTEMEVENT_ON_NP_MESSAGE_ARRIVED :
app . DebugPrintf ( " SCE_APPMGR_SYSTEMEVENT_ON_NP_MESSAGE_ARRIVED event received \n " ) ;
break ;
case SCE_APPMGR_SYSTEMEVENT_ON_STORE_REDEMPTION :
app . DebugPrintf ( " SCE_APPMGR_SYSTEMEVENT_ON_STORE_REDEMPTION event received \n " ) ;
break ;
default :
app . DebugPrintf ( " unknown sys event : 0x%08x \n " , systemEvent . systemEvent ) ;
assert ( 0 ) ;
break ;
}
}
}
}
}
bool CConsoleMinecraftApp : : CheckForEmptyStore ( int iPad )
{
SonyCommerce : : CategoryInfo * pCategories = app . GetCategoryInfo ( ) ;
bool bEmptyStore = true ;
2026-03-03 03:04:10 +08:00
if ( pCategories ! = NULL )
{
if ( pCategories - > countOfProducts > 0 )
2026-03-01 12:16:08 +08:00
{
2026-03-03 03:04:10 +08:00
bEmptyStore = false ;
}
else
{
for ( int i = 0 ; i < pCategories - > countOfSubCategories ; i + + )
2026-03-01 12:16:08 +08:00
{
2026-03-03 03:04:10 +08:00
std : : vector < SonyCommerce : : ProductInfo > * pvProductInfo = app . GetProductList ( i ) ;
if ( pvProductInfo - > size ( ) > 0 )
{
bEmptyStore = false ;
break ;
}
2026-03-01 12:16:08 +08:00
}
}
}
if ( bEmptyStore )
{
ProfileManager . ShowSystemMessage ( SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_EMPTY_STORE , iPad ) ;
}
return bEmptyStore ;
}
void printSaveState ( )
{
# ifndef _CONTENT_PACKAGE
string strState ;
switch ( StorageManager . GetSaveState ( ) )
{
case C4JStorage : : ESaveGame_Idle : strState = " ESaveGame_Idle " ; break ;
case C4JStorage : : ESaveGame_Save : strState = " ESaveGame_Save " ; break ;
case C4JStorage : : ESaveGame_SaveCompleteSuccess : strState = " ESaveGame_SaveCompleteSuccess " ; break ;
case C4JStorage : : ESaveGame_SaveCompleteFail : strState = " ESaveGame_SaveCompleteFail " ; break ;
case C4JStorage : : ESaveGame_SaveIncomplete : strState = " ESaveGame_SaveIncomplete " ; break ;
case C4JStorage : : ESaveGame_SaveIncomplete_WaitingOnResponse : strState = " ESaveGame_SaveIncomplete_WaitingOnResponse " ; break ;
case C4JStorage : : ESaveGame_Load : strState = " ESaveGame_Load " ; break ;
case C4JStorage : : ESaveGame_LoadCompleteSuccess : strState = " ESaveGame_LoadCompleteSuccess " ; break ;
case C4JStorage : : ESaveGame_LoadCompleteFail : strState = " ESaveGame_LoadCompleteFail " ; break ;
case C4JStorage : : ESaveGame_Delete : strState = " ESaveGame_Delete " ; break ;
case C4JStorage : : ESaveGame_DeleteSuccess : strState = " ESaveGame_DeleteSuccess " ; break ;
case C4JStorage : : ESaveGame_DeleteFail : strState = " ESaveGame_DeleteFail " ; break ;
case C4JStorage : : ESaveGame_Rename : strState = " ESaveGame_Rename " ; break ;
case C4JStorage : : ESaveGame_RenameSuccess : strState = " ESaveGame_RenameSuccess " ; break ;
case C4JStorage : : ESaveGame_RenameFail : strState = " ESaveGame_RenameFail " ; break ;
case C4JStorage : : ESaveGame_GetSaveThumbnail : strState = " ESaveGame_GetSaveThumbnail " ; break ;
case C4JStorage : : ESaveGame_GetSaveInfo : strState = " ESaveGame_GetSaveInfo " ; break ;
case C4JStorage : : ESaveGame_SaveCache : strState = " ESaveGame_SaveCache " ; break ;
case C4JStorage : : ESaveGame_ReconstructCache : strState = " ESaveGame_ReconstructCache " ; break ;
}
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
app . DebugPrintf ( " [printSaveState] GetSaveState == %s. \n " , strState . c_str ( ) ) ;
# endif
}
void CConsoleMinecraftApp : : SaveDataTick ( )
{
//CD - We must check the savedata for odd failures that require messages
//CD - This is based on the Orbis and Durango code and solves TRC issue
//Are there any errors?
//SaveData?
if ( m_bSaveIncompleteDialogRunning )
{
updateSaveIncompleteDialog ( ) ;
return ;
}
if ( sceSaveDataDialogGetStatus ( ) ! = SCE_COMMON_DIALOG_STATUS_NONE )
{
updateSaveDataDeleteDialog ( ) ;
}
switch ( m_bSaveDataDeleteDialogState )
{
case eSaveDataDeleteState_idle :
return ;
case eSaveDataDeleteState_waitingForUser :
case eSaveDataDeleteState_userConfirmation :
case eSaveDataDeleteState_deleting :
return ;
case eSaveDataDeleteState_abort :
case eSaveDataDeleteState_continue :
{
C4JStorage : : ESaveGameState eGameState = StorageManager . GetSaveState ( ) ;
printSaveState ( ) ;
if ( eGameState = = C4JStorage : : ESaveGame_SaveIncomplete_WaitingOnResponse )
{
if ( m_bSaveDataDeleteDialogState = = eSaveDataDeleteState_abort )
{
app . DebugPrintf ( " [SaveDataTick] eSaveDataDeleteState_abort. \n " ) ;
StorageManager . CancelIncompleteOperation ( ) ;
2026-03-02 17:39:35 +07:00
}
2026-03-01 12:16:08 +08:00
else if ( m_bSaveDataDeleteDialogState = = eSaveDataDeleteState_continue )
{
app . DebugPrintf ( " [SaveDataTick] eSaveDataDeleteState_continue. \n " ) ;
StorageManager . ContinueIncompleteOperation ( ) ;
}
}
else if ( eGameState = = C4JStorage : : ESaveGame_Idle )
{
app . DebugPrintf ( " [SaveDataTick] Storage Manager is idle, SaveDataDialog reverting to idle state too. \n " ) ;
}
m_bSaveDataDeleteDialogState = eSaveDataDeleteState_idle ;
}
return ;
}
#if 0
C4JStorage : : ESaveIncompleteType errorType = StorageManager . GetSaveError ( ) ;
if ( errorType = = C4JStorage : : ESaveIncomplete_None ) errorType = StorageManager . GetOptionsSaveError ( ) ;
if ( errorType = = C4JStorage : : ESaveIncomplete_OutOfQuota )
{
initSaveDataDeleteDialog ( ) ;
}
else if ( errorType = = C4JStorage : : ESaveIncomplete_OutOfLocalStorage )
{
//initSaveIncompleteDialog(1);
}
else if ( errorType ! = C4JStorage : : ESaveIncomplete_None )
{
app . DebugPrintf ( " [SaveDataTick] Unknown save error from StorageManager. \n " ) ;
}
//TRC - Quota Failure
if ( errorType = = C4JStorage : : ESaveIncomplete_OutOfQuota )
{
UINT uiIDA [ 1 ] ;
uiIDA [ 0 ] = IDS_CONFIRM_OK ;
2026-03-03 03:04:10 +08:00
C4JStorage : : EMessageResult res = ui . RequestErrorMessage ( IDS_SAVE_INCOMPLETE_TITLE , IDS_SAVE_INCOMPLETE_EXPLANATION_QUOTA , uiIDA , 1 , ProfileManager . GetPrimaryPad ( ) ) ;
2026-03-01 12:16:08 +08:00
if ( res ! = C4JStorage : : EMessage_Busy )
{
//Clear the error now it's been dealt with
StorageManager . ClearSaveError ( ) ;
StorageManager . ClearOptionsSaveError ( ) ;
}
}
# endif
}
void CConsoleMinecraftApp : : Callback_SaveGameIncomplete ( void * pParam , C4JStorage : : ESaveIncompleteType saveIncompleteType , int blocksRequired )
{
app . DebugPrintf (
" [Callback_SaveGameIncomplete] saveIncompleteType=%i, blocksRequired=%i, \n " ,
saveIncompleteType , blocksRequired
) ;
if ( saveIncompleteType = = C4JStorage : : ESaveIncomplete_OutOfQuota | | saveIncompleteType = = C4JStorage : : ESaveIncomplete_OutOfLocalStorage )
{
2026-03-03 03:04:10 +08:00
if ( UIScene_LoadOrJoinMenu : : isSaveTransferRunning ( ) )
{
// 4J MGH - if we're trying to save from the save transfer stuff, only show "ok", and we won't try to save again
if ( saveIncompleteType = = C4JStorage : : ESaveIncomplete_OutOfQuota ) blocksRequired = - 1 ;
UINT uiIDA [ 1 ] ;
uiIDA [ 0 ] = IDS_CONFIRM_OK ;
C4JStorage : : EMessageResult res = ui . RequestErrorMessage ( IDS_SAVE_INCOMPLETE_TITLE , IDS_SAVE_INCOMPLETE_EXPLANATION_QUOTA , uiIDA , 1 , ProfileManager . GetPrimaryPad ( ) , & NoSaveSpaceReturned , ( void * ) blocksRequired ) ;
}
else
{
// 4J Stu - If it's quota then we definitely have to delete our saves, so don't show the system UI for this case
if ( saveIncompleteType = = C4JStorage : : ESaveIncomplete_OutOfQuota ) blocksRequired = - 1 ;
UINT uiIDA [ 2 ] ;
uiIDA [ 0 ] = IDS_CONFIRM_OK ;
uiIDA [ 1 ] = IDS_CONFIRM_CANCEL ;
C4JStorage : : EMessageResult res = ui . RequestErrorMessage ( IDS_SAVE_INCOMPLETE_TITLE , IDS_SAVE_INCOMPLETE_EXPLANATION_QUOTA , uiIDA , 2 , ProfileManager . GetPrimaryPad ( ) , & NoSaveSpaceReturned , ( void * ) blocksRequired ) ;
}
2026-03-01 12:16:08 +08:00
}
}
int CConsoleMinecraftApp : : NoSaveSpaceReturned ( void * pParam , int iPad , C4JStorage : : EMessageResult result )
{
2026-03-03 03:04:10 +08:00
if ( result = = C4JStorage : : EMessage_ResultAccept & & ! UIScene_LoadOrJoinMenu : : isSaveTransferRunning ( ) ) // MGH - we won't try to save again during a save tranfer
2026-03-01 12:16:08 +08:00
{
int blocksRequired = ( int ) pParam ;
if ( blocksRequired > 0 )
{
app . initSaveIncompleteDialog ( blocksRequired ) ;
}
else
{
app . initSaveDataDeleteDialog ( ) ;
}
}
else
{
StorageManager . CancelIncompleteOperation ( ) ;
StorageManager . ClearSaveError ( ) ;
StorageManager . ClearOptionsSaveError ( ) ;
}
return 0 ;
}
int CConsoleMinecraftApp : : cbConfirmDeleteMessageBox ( void * pParam , int iPad , const C4JStorage : : EMessageResult result )
{
CConsoleMinecraftApp * pClass = ( CConsoleMinecraftApp * ) pParam ;
if ( pClass ! = NULL & & pClass - > m_pSaveToDelete ! = NULL )
{
2026-03-02 17:39:35 +07:00
if ( result = = C4JStorage : : EMessage_ResultDecline )
2026-03-01 12:16:08 +08:00
{
pClass - > m_bSaveDataDeleteDialogState = eSaveDataDeleteState_deleting ;
C4JStorage : : ESaveGameState eDeleteStatus = StorageManager . DeleteSaveData ( pClass - > m_pSaveToDelete , cbSaveDataDeleted , pClass ) ;
}
else
{
pClass - > initSaveDataDeleteDialog ( ) ;
}
}
else
{
pClass - > initSaveDataDeleteDialog ( ) ;
// 4J-JEV: This could leave the storage library in a waiting for user state.
//pClass->m_bSaveDataDeleteDialogState = eSaveDataDeleteState_idle;
}
return 0 ;
}
void CConsoleMinecraftApp : : initSaveIncompleteDialog ( int spaceNeeded )
{
SceSaveDataDialogParam param ;
sceSaveDataDialogParamInit ( & param ) ;
SceSaveDataDialogSystemMessageParam sysParam ;
ZeroMemory ( & sysParam , sizeof ( SceSaveDataDialogSystemMessageParam ) ) ;
param . sysMsgParam = & sysParam ;
param . mode = SCE_SAVEDATA_DIALOG_MODE_SYSTEM_MSG ;
param . dispType = SCE_SAVEDATA_DIALOG_TYPE_SAVE ;
param . sysMsgParam - > sysMsgType = SCE_SAVEDATA_DIALOG_SYSMSG_TYPE_NOSPACE_CONTINUABLE ;
param . sysMsgParam - > value = ( SceInt32 ) spaceNeeded ;
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
SceInt32 ret = sceSaveDataDialogInit ( & param ) ;
if ( ret = = SCE_OK )
{
m_bSaveIncompleteDialogRunning = true ;
InputManager . SetMenuDisplayed ( 0 , true ) ;
ProfileManager . SetSysUIShowing ( true ) ;
ui . SetSysUIShowing ( true ) ;
}
else
{
app . DebugPrintf ( " [SaveDataIncompleteDialog] ERROR: INITIALISING DIALOG, sceSaveDataDialogInit() (0x%x). \n " , ret ) ;
}
}
void CConsoleMinecraftApp : : updateSaveIncompleteDialog ( )
{
SceCommonDialogStatus dialogStatus = sceSaveDataDialogGetStatus ( ) ;
if ( dialogStatus = = SCE_COMMON_DIALOG_STATUS_RUNNING )
{
SceCommonDialogStatus dialogSubStatus = sceSaveDataDialogGetSubStatus ( ) ;
if ( dialogSubStatus = = SCE_COMMON_DIALOG_STATUS_RUNNING )
{
// Wait for user.
}
else if ( dialogSubStatus = = SCE_COMMON_DIALOG_STATUS_FINISHED )
{
SceSaveDataDialogFinishParam finishParam ;
ZeroMemory ( & finishParam , sizeof ( SceSaveDataDialogFinishParam ) ) ;
finishParam . flag = SCE_SAVEDATA_DIALOG_FINISH_FLAG_DEFAULT ;
SceInt32 ret = sceSaveDataDialogFinish ( & finishParam ) ;
if ( ret ! = SCE_OK )
{
app . DebugPrintf ( " [SaveDataIncompleteDialog] ERROR: UPDATING DIALOG, sceSaveDataDialogFinish() (0x%x). \n " , ret ) ;
}
}
}
else if ( dialogStatus = = SCE_COMMON_DIALOG_STATUS_FINISHED )
{
SceInt32 ret = sceSaveDataDialogTerm ( ) ;
if ( ret = = SCE_OK )
{
finishSaveIncompleteDialog ( ) ;
}
else
{
app . DebugPrintf ( " [SaveDataIncompleteDialog] ERROR: TERMINATING DIALOG, sceSaveDataDialogTerm() (0x%x). \n " , ret ) ;
}
}
}
void CConsoleMinecraftApp : : finishSaveIncompleteDialog ( )
{
m_bSaveIncompleteDialogRunning = false ;
InputManager . SetMenuDisplayed ( 0 , false ) ;
ProfileManager . SetSysUIShowing ( false ) ;
ui . SetSysUIShowing ( false ) ;
StorageManager . ClearSaveError ( ) ;
StorageManager . ClearOptionsSaveError ( ) ;
initSaveDataDeleteDialog ( ) ;
}
void CConsoleMinecraftApp : : initSaveDataDeleteDialog ( )
{
SceSaveDataDialogParam param ;
getSaveDataDeleteDialogParam ( & param ) ;
SceInt32 ret = sceSaveDataDialogInit ( & param ) ;
if ( ret = = SCE_OK )
{
app . DebugPrintf ( " [SaveDataDeleteDialog] Successfully initialised SaveDataDelete dialog. \n " ) ;
m_bSaveDataDeleteDialogState = eSaveDataDeleteState_waitingForUser ;
InputManager . SetMenuDisplayed ( 0 , true ) ;
ProfileManager . SetSysUIShowing ( true ) ;
ui . SetSysUIShowing ( true ) ;
// Start getting saves data to use when deleting.
if ( StorageManager . ReturnSavesInfo ( ) = = NULL )
{
2026-03-02 17:39:35 +07:00
C4JStorage : : ESaveGameState eSGIStatus
= StorageManager . GetSavesInfo (
2026-03-01 12:16:08 +08:00
ProfileManager . GetPrimaryPad ( ) ,
2026-03-02 17:39:35 +07:00
NULL ,
this ,
2026-03-01 12:16:08 +08:00
" save "
2026-03-02 17:39:35 +07:00
) ;
2026-03-01 12:16:08 +08:00
}
// Dim background because sony doesn't do that.
ui . showComponent ( 0 , eUIComponent_MenuBackground , eUILayer_Tooltips , eUIGroup_Fullscreen , true ) ;
StorageManager . SetSaveDisabled ( true ) ;
EnterSaveNotificationSection ( ) ;
}
else
{
app . DebugPrintf ( " [SaveDataDeleteDialog] ERROR: INITIALISING DIALOG, sceSaveDataDialogInit() (0x%x). \n " , ret ) ;
}
releaseSaveDataDeleteDialogParam ( & param ) ;
}
void CConsoleMinecraftApp : : updateSaveDataDeleteDialog ( )
{
SceCommonDialogStatus dialogStatus = sceSaveDataDialogGetStatus ( ) ;
if ( dialogStatus = = SCE_COMMON_DIALOG_STATUS_RUNNING )
{
SceCommonDialogStatus dialogSubStatus = sceSaveDataDialogGetSubStatus ( ) ;
if ( dialogSubStatus = = SCE_COMMON_DIALOG_STATUS_RUNNING )
{
// Wait for user.
}
else if ( dialogSubStatus = = SCE_COMMON_DIALOG_STATUS_FINISHED )
{
SceSaveDataDialogResult dialogResult ;
ZeroMemory ( & dialogResult , sizeof ( SceSaveDataDialogResult ) ) ;
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
SceInt32 ret = sceSaveDataDialogGetResult ( & dialogResult ) ;
if ( ret = = SCE_OK )
{
bool finishDialog = false ;
if ( dialogResult . result = = SCE_COMMON_DIALOG_RESULT_USER_CANCELED
| | dialogResult . result = = SCE_COMMON_DIALOG_RESULT_ABORTED )
{
app . DebugPrintf ( " [SaveDataDeleteDialog] CANCELED OR ABORTED! \n " ) ;
// 4J-JEV: Check to ensure that finishedDeletingSaves is called only once.
if ( m_bSaveDataDeleteDialogState = = eSaveDataDeleteState_waitingForUser )
{
finishedDeletingSaves ( false ) ;
}
finishDialog = true ;
}
if ( dialogResult . result = = SCE_COMMON_DIALOG_RESULT_OK )
{
SceAppUtilSaveDataSlotParam slotParam ;
ret = sceAppUtilSaveDataSlotGetParam ( dialogResult . slotId , & slotParam , NULL ) ;
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
if ( ret = = SCE_OK )
{
int saveindex = - 1 ;
PSAVE_INFO pSaveInfo = NULL ;
PSAVE_DETAILS pSaveDetails = StorageManager . ReturnSavesInfo ( ) ;
if ( pSaveDetails ! = NULL )
{
app . DebugPrintf ( " [SaveDataDeleteDialog] Searching for save files: \n " ) ;
for ( unsigned int i = 0 ; i < pSaveDetails - > iSaveC ; i + + )
{
app . DebugPrintf ( " \t - '%s' \n " , pSaveDetails - > SaveInfoA [ i ] . UTF8SaveFilename ) ;
void * buf1 , * buf2 ;
buf1 = & ( pSaveDetails - > SaveInfoA [ i ] . UTF8SaveFilename ) ;
buf2 = & slotParam . title ;
if ( 0 = = memcmp ( buf1 , buf2 , MAX_SAVEFILENAME_LENGTH ) )
{
pSaveInfo = & pSaveDetails - > SaveInfoA [ i ] ;
saveindex = i ;
break ;
}
}
}
else
{
app . DebugPrintf ( " [SaveDataDeleteDialog] ERROR: PERFORMING DELETE OPERATION, pSavesDetails is null. \n " ) ;
}
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
if ( pSaveInfo ! = NULL )
{
app . DebugPrintf (
" [SaveDataDeleteDialog] User wishes to delete slot_%d: \n \t "
2026-03-02 17:39:35 +07:00
" 4jsaveindex=%d, filename='%s', title='%s', subtitle='%s', size=%dKiB. \n " ,
2026-03-01 12:16:08 +08:00
dialogResult . slotId ,
saveindex ,
pSaveInfo - > UTF8SaveFilename ,
slotParam . title ,
slotParam . subTitle ,
slotParam . sizeKiB
) ;
UINT uiIDA [ ] =
{
IDS_CONFIRM_CANCEL ,
IDS_CONFIRM_OK
} ;
2026-03-03 03:04:10 +08:00
ui . RequestErrorMessage (
2026-03-02 17:39:35 +07:00
IDS_TOOLTIPS_DELETESAVE , IDS_TEXT_DELETE_SAVE ,
2026-03-01 12:16:08 +08:00
uiIDA , 2 ,
0 ,
2026-03-03 03:04:10 +08:00
& cbConfirmDeleteMessageBox , this
2026-03-01 12:16:08 +08:00
) ;
m_bSaveDataDeleteDialogState = eSaveDataDeleteState_userConfirmation ;
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
m_pSaveToDelete = pSaveInfo ;
}
else
{
app . DebugPrintf (
" [SaveDataDeleteDialog] ERROR: PERFORMING DELETE OPERATION, cannot find file in our saves list: \n "
" \t slotId=%i, title=%s, subtitle=%s, \n " ,
dialogResult . slotId , slotParam . title , slotParam . subTitle
) ;
}
finishDialog = true ;
}
else
{
app . DebugPrintf ( " [SaveDataDeleteDialog] ERROR: UPDATING DIALOG, sceAppUtilSaveDataGetParam() (0x%x). \n " , ret ) ;
}
}
if ( finishDialog )
{
SceSaveDataDialogFinishParam finishParam ;
ZeroMemory ( & finishParam , sizeof ( SceSaveDataDialogFinishParam ) ) ;
finishParam . flag = SCE_SAVEDATA_DIALOG_FINISH_FLAG_DEFAULT ;
sceSaveDataDialogFinish ( & finishParam ) ;
if ( ret = = SCE_OK ) app . DebugPrintf ( " [SaveDataDeleteDialog] Successfully finished saveDataDialog. \n " ) ;
else app . DebugPrintf ( " [SaveDataDeleteDialog] ERROR: UPDATING DIALOG, sceSaveDataDialogFinish() (0x%x). \n " , ret ) ;
}
}
else
{
app . DebugPrintf ( " [SaveDataDeleteDialog] ERROR: UPDATING DIALOG, sceSaveDataDialogGetResult() (0x%x). \n " , ret ) ;
}
}
}
else if ( dialogStatus = = SCE_COMMON_DIALOG_STATUS_FINISHED )
{
SceInt32 ret = sceSaveDataDialogTerm ( ) ;
if ( ret = = SCE_OK )
{
finishSaveDataDeleteDialog ( ) ;
}
else
{
app . DebugPrintf ( " [SaveDataDeleteDialog] ERROR: TERMINATING DIALOG, sceSaveDataDialogTerm() (0x%x). \n " , ret ) ;
}
}
}
void CConsoleMinecraftApp : : finishSaveDataDeleteDialog ( )
{
ProfileManager . SetSysUIShowing ( false ) ;
InputManager . SetMenuDisplayed ( 0 , false ) ;
ui . SetSysUIShowing ( false ) ;
ui . removeComponent ( eUIComponent_MenuBackground , eUILayer_Tooltips , eUIGroup_Fullscreen ) ;
}
void CConsoleMinecraftApp : : getSaveDataDeleteDialogParam ( SceSaveDataDialogParam * baseParam )
{
sceSaveDataDialogParamInit ( baseParam ) ;
static SceSaveDataDialogListParam listParam ;
ZeroMemory ( & listParam , sizeof ( SceSaveDataDialogListParam ) ) ;
{
vector < const SceAppUtilSaveDataSlot > slots ;
for ( unsigned int i = 2 ; i < SCE_APPUTIL_SAVEDATA_SLOT_MAX ; i + + )
{
SceAppUtilSaveDataSlotParam slotParam ;
int ret = sceAppUtilSaveDataSlotGetParam ( i , & slotParam , NULL ) ;
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
if ( ret = = SCE_OK )
{
SceAppUtilSaveDataSlot slot ;
ZeroMemory ( & slot , sizeof ( SceAppUtilSaveDataSlot ) ) ;
slot . id = i ;
slot . status = slotParam . status ;
slot . userParam = 0 ;
slots . push_back ( slot ) ;
}
}
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
SceAppUtilSaveDataSlot * pSavesList = new SceAppUtilSaveDataSlot [ slots . size ( ) ] ;
int slotIndex = 0 ;
vector < const SceAppUtilSaveDataSlot > : : iterator itr ;
for ( itr = slots . begin ( ) ; itr ! = slots . end ( ) ; itr + + )
{
pSavesList [ slotIndex ] = * itr ;
slotIndex + + ;
}
listParam . slotListSize = slots . size ( ) ;
listParam . slotList = pSavesList ;
}
if ( listParam . slotListSize > 0 ) listParam . focusPos = SCE_SAVEDATA_DIALOG_FOCUS_POS_LISTHEAD ;
else listParam . focusPos = SCE_SAVEDATA_DIALOG_FOCUS_POS_EMPTYHEAD ;
// static SceCommonDialogColor s_bgColor, s_dColor;
// s_bgColor.r = s_dColor.r = 50;
// s_bgColor.g = s_dColor.g = 50;
// s_bgColor.b = s_dColor.b = 50;
// s_bgColor.a = s_dColor.a = 125;
// baseParam->commonParam.bgColor = &s_bgColor;
// baseParam->commonParam.dimmerColor = &s_dColor;
static uint8_t * strPtr = NULL ;
if ( strPtr ! = NULL ) delete strPtr ;
strPtr = mallocAndCreateUTF8ArrayFromString ( IDS_TOOLTIPS_DELETESAVE ) ;
listParam . listTitle = ( const SceChar8 * ) strPtr ;
listParam . itemStyle = SCE_SAVEDATA_DIALOG_LIST_ITEM_STYLE_TITLE_SUBTITLE_DATE ;
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
baseParam - > mode = SCE_SAVEDATA_DIALOG_MODE_LIST ;
baseParam - > dispType = SCE_SAVEDATA_DIALOG_TYPE_DELETE ;
baseParam - > listParam = & listParam ;
baseParam - > flag = SCE_SAVEDATA_DIALOG_ENV_FLAG_DEFAULT ;
}
void CConsoleMinecraftApp : : releaseSaveDataDeleteDialogParam ( SceSaveDataDialogParam * baseParam )
{
//delete baseParam->listParam;
//delete baseParam->commonParam.dimmerColor;
//delete baseParam->commonParam.bgColor;
//delete baseParam->listParam.listTitle;
}
int CConsoleMinecraftApp : : cbSaveDataDeleted ( void * pParam , const bool success )
{
app . DebugPrintf ( " [SaveDataDeleteDialog] cbSaveDataDeleted(%s) \n " , ( success ? " success " : " fail " ) ) ;
CConsoleMinecraftApp * pApp = ( CConsoleMinecraftApp * ) pParam ;
if ( pApp - > m_bSaveDataDeleteDialogState = = eSaveDataDeleteState_deleting )
{
/* SceSaveDataDialogParam param;
pApp - > getSaveDataDeleteDialogParam ( & param ) ;
SceInt32 ret = sceSaveDataDialogContinue ( & param ) ;
if ( ret ! = SCE_OK ) app . DebugPrintf ( " [SaveDataDeleteDialog] ERROR: UPDATING DIALOG, sceSaveDataDialogContinue() (0x%x). \n " , ret ) ;
pApp - > m_bSaveDataDeleteDialogState = eSaveDataDeleteState_waitingForUser ;
pApp - > releaseSaveDataDeleteDialogParam ( & param ) ; */
pApp - > finishedDeletingSaves ( true ) ;
}
return 0 ;
}
void CConsoleMinecraftApp : : finishedDeletingSaves ( bool bContinue )
{
app . DebugPrintf ( " [finishedDeletingSaves] %s. \n " , ( bContinue ? " Continuing " : " Aborting " ) ) ;
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
StorageManager . SetSaveDisabled ( false ) ;
LeaveSaveNotificationSection ( ) ;
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
StorageManager . ClearSaveError ( ) ;
StorageManager . ClearOptionsSaveError ( ) ;
if ( bContinue ) m_bSaveDataDeleteDialogState = eSaveDataDeleteState_continue ;
else m_bSaveDataDeleteDialogState = eSaveDataDeleteState_abort ;
}