diff --git a/Minecraft.Client/Cafe/WiiU_App.cpp b/Minecraft.Client/Cafe/WiiU_App.cpp new file mode 100644 index 00000000..9969fdb0 --- /dev/null +++ b/Minecraft.Client/Cafe/WiiU_App.cpp @@ -0,0 +1,24 @@ +#include "stdafx.h" +#include "..\Common\Consoles_App.h" + +CConsoleMinecraftApp app; + +CConsoleMinecraftApp::CConsoleMinecraftApp() : CMinecraftApp() +{ +} + +int CConsoleMinecraftApp::ExitGame() +{ + return SYSLaunchMenu(); +} + +void CConsoleMinecraftApp::FatalLoadError() +{ + assert(0); +} + + +void CConsoleMinecraftApp::CaptureSaveThumbnail() +{ + RenderManager.CaptureThumbnail(&m_ThumbnailBuffer,&m_SaveImageBuffer); +} \ No newline at end of file diff --git a/Minecraft.Client/Cafe/WiiU_App.h b/Minecraft.Client/Cafe/WiiU_App.h new file mode 100644 index 00000000..e69de29b diff --git a/Minecraft.Client/Cafe/WiiU_Minecraft.cpp b/Minecraft.Client/Cafe/WiiU_Minecraft.cpp new file mode 100644 index 00000000..700473e8 --- /dev/null +++ b/Minecraft.Client/Cafe/WiiU_Minecraft.cpp @@ -0,0 +1,558 @@ +#include "stdafx.h" +#include "..\..\Minecraft.Client\Tesselator.h" +#include "..\..\Minecraft.World\compression.h" + +#define FIFTY_ONE_MB (1000000*51) // Maximum TCR space required for a save is 52MB (checking for this on a selected device) + +#define NUM_PROFILE_VALUES 5 +DWORD dwProfileSettingsA[NUM_PROFILE_VALUES]= +{ +#ifdef _XBOX + XPROFILE_OPTION_CONTROLLER_VIBRATION, + XPROFILE_GAMER_YAXIS_INVERSION, + XPROFILE_GAMER_CONTROL_SENSITIVITY, + XPROFILE_GAMER_ACTION_MOVEMENT_CONTROL, + XPROFILE_TITLE_SPECIFIC1, +#else + 0,0,0,0,0 +#endif +}; + +int DefineActions() +{ +}; + +int v47; + +int main() +{ +#ifdef 0 + if ( !SYSGetArguments(&v54, v62) && v55 == 1 ) + { + byte_1046C163 = 1; + dword_104DD144 = v56; + byte_1046C162 = 1; + } + OSInitMessageQueue(&unk_10709BB0, &unk_10709B88, 1); + InitializeCriticalSection(&unk_10709BEC); + OSCreateThread4J__FP8OSThreadPFiPv_iiPvT4UiT3Us(&unk_107094E8, altMainThread, 0, 0, &unk_107094E8, 0x20000, 17, 0); + v5 = OSResumeThread(&unk_107094E8); + v6 = SetMainThreadID__9C4JThreadSFv(v5); +#endif // WII U DECOMP + + // 4J-JEV: Moved this here in case some archived files are compressed. + Compression::CreateNewThreadStorage(); + + RenderManager.Initialise(); + + // Set the number of possible joypad layouts that the user can switch between, and the number of actions + // Need to init Input before UI so we know what the Circle/Cross state is + InputManager.Initialise(1,3,MINECRAFT_ACTION_MAX, ACTION_MAX_MENU); + + // Set the default joypad action mappings for Minecraft + DefineActions(); + InputManager.SetJoypadMapVal(0,0); + InputManager.SetKeyRepeatRate(0.3f,0.2f); +#ifdef 0 + InputManager.SetDeadzoneAndMovementRange(0, 20000, 32767); +#endif // WII U DECOMP + + app.loadMediaArchive(); + + app.DebugPrintf("+++Main - after app.loadMediaArchive\n"); + + // Read the file containing the product codes + if(app.ReadProductCodes()==FALSE) + { + // can't continue + app.FatalLoadError(); + } + +#ifdef 0 + int ProductSKU = app.GetProductSKU(); + + if (ProductSKU <= 2) { + C_4JProfile::SetMinimumAge(&unk_1078D372, *(unsigned __int8 *)(ProductSKU + 270239279)); + } +#endif // WII U DECOMP + // ESRB EVERYONE 10+, temporary for now + ProfileManager.SetMinimumAge(10,1); + + app.loadStringTable(); + + // 4J-Stu Wii U is weird, it already has it swapped, 1 will suffice. + // (just imagine this is a real 4J comment) + InputManager.SetCircleCrossSwapped(1); + + if(RenderManager.IsWidescreen()) + ui.init(1280,720); + else + ui.init(1280,480); + + static bool bTrialTimerDisplayed=true; + + + //////////////// + // Initialise // + //////////////// + +#if 0 + // 4J Stu - XACT was creating these automatically, but we need them for QNet. The setup params + // are just copied from a sample app and may need changed for our purposes + // Start XAudio2 + hr = XAudio2Create( &g_pXAudio2, 0, XAUDIO2_DEFAULT_PROCESSOR ); + if( FAILED( hr ) ) + { + app.DebugPrintf( "Initializing XAudio2 failed (err = 0x%08x)!\n", hr ); + app.FatalLoadError(); + } + + // Create an XAudio2 mastering voice (utilized by XHV2 when voice data is mixed to main speakers) + hr = g_pXAudio2->CreateMasteringVoice(&g_pXAudio2MasteringVoice, XAUDIO2_DEFAULT_CHANNELS, XAUDIO2_DEFAULT_SAMPLERATE, 0, 0, NULL); + if ( FAILED( hr ) ) + { + app.DebugPrintf( "Creating XAudio2 mastering voice failed (err = 0x%08x)!\n", hr ); + app.FatalLoadError(); + } +#endif + + app.InitTime(); + +// more Wii U sdk specific stuff, yayyyy +#ifdef 0 + // Initialise the profile manager with the game Title ID, Offer ID, a profile version number, and the number of profile values and settings + ProfileManager.Initialise(&unk_101B862C, + &unk_101B862C, + 18, + 5, + 4, + &unk_1047B9B0, + 3888, + &dword_106E8DB8); + + ProfileManager.SetSignInChoicesCallback(RequestSignInUIChoices__20CConsoleMinecraftAppSFi); +#endif // WII U DECOMP + + app.DebugPrintf("+++Main - after ProfileManager.Initialise\n"); + + // register the awards + RegisterAwardsWithProfileManager(); + + // PIEBOT: its not confirmed what the 4th argument is, its FIFTY_ONE_MB temporarily until its sorted out + // initialise the storage manager with a callback for displaying the saving message + StorageManager.Init(0,app.GetString(IDS_DEFAULT_SAVENAME),"savegame.dat",FIFTY_ONE_MB,&CConsoleMinecraftApp::DisplaySavingMessage,(LPVOID)&app,"",v47); + + app.SetNoSpaceForSaveQuota(v47[0]); + app.DebugPrintf(">>> StorageManager.Init, noSpaceForQuota is %d\n", v47[0]); + + ProfileManager.LoadAllMiiData(); +#if 0 + + // Set up the global title storage path + StorageManager.StoreTMSPathName(); +#endif + + // MGH - I've had to rearrange some of the ordering here, as I was getting conflicts with the sysutils for trophies and the upgrade key + + //app.FatalLoadError(); + + + // set a function to be called when there's a sign in change, so we can exit a level if the primary player signs out + ProfileManager.SetSignInChangeCallback(&CConsoleMinecraftApp::SignInChangeCallback,(LPVOID)&app); + +#if 0 + // set a function to be called when the ethernet is disconnected, so we can back out if required + ProfileManager.SetNotificationsCallback(&CConsoleMinecraftApp::NotificationsCallback,(LPVOID)&app); + + // Set a callback for when there is a read error on profile data + ProfileManager.SetProfileReadErrorCallback(&CConsoleMinecraftApp::ProfileReadErrorCallback,(LPVOID)&app); + + // QNet needs to be setup after profile manager, as we do not want its Notify listener to handle + // XN_SYS_SIGNINCHANGED notifications. This does mean that we need to have a callback in the + // ProfileManager for XN_LIVE_INVITE_ACCEPTED for QNet. +#endif // 0 + + // Set a callback for when there is a read error on profile data + ProfileManager.SetProfileReadErrorCallback(&CConsoleMinecraftApp::ProfileReadErrorCallback,(LPVOID)&app); + + // Before using any save/load on Wii U, we need a secure id set + StorageManager.InitialiseProfileData(PROFILE_VERSION_18, + NUM_PROFILE_VALUES, + NUM_PROFILE_SETTINGS, + dwProfileSettingsA, + app.GAME_DEFINED_PROFILE_DATA_BYTES*XUSER_MAX_COUNT, + &app.uiGameDefinedDataChangedBitmask); + + app.DebugPrintf("+++Main - after InitialiseProfileData\n"); + + // Set a callback for the default player options to be set - when there is no profile data for the player + + StorageManager.SetDefaultOptionsCallback(&CConsoleMinecraftApp::DefaultOptionsCallback,(LPVOID)&app); + StorageManager.SetOptionsDataCallback(&CConsoleMinecraftApp::OptionsDataCallback,(LPVOID)&app); + + // Set a callback to deal with old profile versions needing updated to new versions + ProfileManager.SetOldProfileVersionCallback(&CConsoleMinecraftApp::OldProfileVersionCallback,(LPVOID)&app); + + StorageManager.SetGameSaveFolderPrefix(""); + StorageManager.SetMaxSaves(99); + byteArray baSaveThumbnail = app.getArchiveFile(L"DefaultSaveThumbnail64x64.png"); + + if(baSaveThumbnail.data!=NULL) + { + delete [] baSaveThumbnail.data; + } + StorageManager.SetDefaultImages(); + + StorageManager.SetIncompleteSaveCallback(&CConsoleMinecraftApp::Callback_SaveGameIncomplete, (LPVOID)&app); + + // defaults + StorageManager.SetSaveTitle(L"Default Save"); + + // debug switch to trial version +// ProfileManager.SetDebugFullOverride(true); + + //ProfileManager.AddDLC(2); + StorageManager.SetDLCPackageRoot("DLCDrive"); + + // Initialise TLS for tesselator, for this main thread + Tesselator::CreateNewThreadStorage(1024*1024); + // Initialise TLS for AABB and Vec3 pools, for this main thread + AABB::CreateNewThreadStorage(); + Vec3::CreateNewThreadStorage(); + IntCache::CreateNewThreadStorage(); + OldChunkStorage::CreateNewThreadStorage(); + Level::enableLightingCache(); + Tile::CreateNewThreadStorage(); +#ifdef 0 + FireworksRecipe::CreateNewThreadStorage(); +#endif // FROM WII U DECOMP + + Minecraft::main(); + Minecraft *pMinecraft=Minecraft::GetInstance(); + + app.InitGameSettings(); // - allocates the memory for the game settings + // read the options here for controller 0 - this won't actually be actioned until a storagemanager tick later + StorageManager.ReadFromProfile(0); + + // set the default profile values + // 4J-PB - InitGameSettings already does this + /*for(int i=0;ioptions->set(Options::Option::MUSIC,1.0f); + pMinecraft->options->set(Options::Option::SOUND,1.0f); + + app.NavigateToScene(XUSER_INDEX_ANY,eUIScene_Intro,&initData); +#endif + + + + //LeaderboardManager::Instance()->OpenSession(); + //LeaderboardManager::Instance()->ReadStats_TopRank(DebugReadListener::m_instance, 0, LeaderboardManager::eStatsType_Travelling, 1, 1); + + g_NetworkManager.Initialise(); + g_NetworkManager.SetLocalGame(true); + + while( true ) + { +// nintendo sdk bullshit +#ifdef 0 + EnterCriticalSection(&unk_10709BEC); + LeaveCriticalSection(&unk_10709BEC); + if ( byte_1047B9AC ) + break; + v26 = ProcUIProcessMessages(1); + if ( v26 == 3 ) + { + CMinecraftApp::DebugPrintf(&app, ">>! PROCUI_STATUS_EXIT\n"); + v27 = C4JRender::WiiUWaitDrawDone(&unk_1072C506); + ProcUIShutdown(v27); + result = 0; + goto LABEL_66; + } + if ( v26 == 2 ) + { + v29 = CMinecraftApp::DebugPrintf(&app, ">>! PROCUI_STATUS_RELEASING\n"); + v30 = ReleaseCallback__22NintendoVoiceChat_WiiUSFv(v29); + ProcUIDrawDoneRelease(v30); + } +#endif // WII U DECOMP + RenderManager.StartFrame(); + app.UpdateTime(); + PIXBeginNamedEvent(0,"Input manager tick"); + InputManager.Tick(); + PIXEndNamedEvent(); +// I think the lines under me is related to the gamepad, which is +// so important that it was one of the Wii U's selling point. +// We should look into it when we do 4JLibs Wii U. +#ifdef 0 + IsPadDRCController = InputManager.IsPadDRCController(4); + if ( IsPadDRCController != (unsigned __int8)byte_1047B988 ) + { + if ( IsPadDRCController ) + { + if ( byte_106E9491 ) + byte_106E9492 = 1; + } + else + { + byte_106E9492 = 0; + } + byte_1047B988 = IsPadDRCController; + } +#endif // WII U DECOMP + PIXBeginNamedEvent(0,"Profile manager tick"); + ProfileManager.Tick(); + PIXEndNamedEvent(); + PIXBeginNamedEvent(0,"Storage manager tick"); + StorageManager.Tick(); + PIXEndNamedEvent(); + PIXBeginNamedEvent(0,"Render manager tick"); + RenderManager.Tick(); + PIXEndNamedEvent(); + + + // Tick the social networking manager. + PIXBeginNamedEvent(0,"Social network manager tick"); +// CSocialManager::Instance()->Tick(); + PIXEndNamedEvent(); + + // Tick sentient. + PIXBeginNamedEvent(0,"Sentient tick"); + MemSect(37); +// SentientManager.Tick(); + MemSect(0); + PIXEndNamedEvent(); + + PIXBeginNamedEvent(0,"Network manager do work #1"); + g_NetworkManager.DoWork(); + PIXEndNamedEvent(); +#ifdef 0 + if ( byte_106E9492 + || byte_106E9491 + || !CGameNetworkManager::IsInGameplay(&unk_104C0E34) + || !byte_106E9493 + || CMinecraftApp::GetLocalPlayerCount(&app) != 1 ) + { + v32 = 119; + dword_1047B98C = 119; + goto LABEL_37; + } + if ( dword_1047B98C ) + { + v32 = --dword_1047B98C; + LABEL_37: + if ( v32 ) + goto LABEL_39; + } + byte_106E9491 = 1; +LABEL_39: + (*(void (**)(void))(*(_DWORD *)(dword_106E8A18 + 44) + 28))(); +#endif // WII U DECOMP + // 4J-PB - these get set every tick causing the write profile flag to be true all the time - +// app.SetGameSettingsDebugMask(0,eDebugSetting_LoadSavesFromDisk); +// app.SetGameSettingsDebugMask(0,eDebugSetting_WriteSavesToDisk); +// app.SetLoadSavesFromFolderEnabled(true); +// app.SetWriteSavesToFolderEnabled(true); + + //LeaderboardManager::Instance()->Tick(); + // Render game graphics. + if(app.GetGameStarted()) + { + +// if(InputManager.ButtonPressed(0, MINECRAFT_ACTION_SNEAK_TOGGLE)) +// { +// app.DebugPrintf("saving game...\n"); +// debugSaveGameDirect(); +// +// } + pMinecraft->run_middle(); + app.SetAppPaused( g_NetworkManager.IsLocalGame() && g_NetworkManager.GetPlayerCount() == 1 && ui.IsPauseMenuDisplayed(ProfileManager.GetPrimaryPad()) ); + } + else + { + MemSect(28); + pMinecraft->soundEngine->tick(NULL, 0.0f); + MemSect(0); + pMinecraft->textures->tick(true,false); + IntCache::Reset(); + if( app.GetReallyChangingSessionType() ) + { + pMinecraft->tickAllConnections(); // Added to stop timing out when we are waiting after converting to an offline game + } + } + + pMinecraft->soundEngine->playMusicTick(); + +#ifdef MEMORY_TRACKING + static bool bResetMemTrack = false; + static bool bDumpMemTrack = false; + + MemPixStuff(); + + if( bResetMemTrack ) + { + ResetMem(); + MEMORYSTATUS memStat; + GlobalMemoryStatus(&memStat); + printf("RESETMEM: Avail. phys %d\n",memStat.dwAvailPhys/(1024*1024)); + bResetMemTrack = false; + } + + if( bDumpMemTrack ) + { + DumpMem(); + bDumpMemTrack = false; + MEMORYSTATUS memStat; + GlobalMemoryStatus(&memStat); + printf("DUMPMEM: Avail. phys %d\n",memStat.dwAvailPhys/(1024*1024)); + printf("Renderer used: %d\n",RenderManager.CBuffSize(-1)); + } +#endif +#if 0 + static bool bDumpTextureUsage = false; + if( bDumpTextureUsage ) + { + RenderManager.TextureGetStats(); + bDumpTextureUsage = false; + } +#endif + ui.tick(); + ui.render(); + + // Present the frame. + PIXBeginNamedEvent(0,"Frame present"); + RenderManager.Present(); + PIXEndNamedEvent(); + + RenderManager.Set_matrixDirty(); + + ui.CheckMenuDisplayed(); + PIXBeginNamedEvent(0,"Profile load check"); + // has the game defined profile data been changed (by a profile load) + if(app.uiGameDefinedDataChangedBitmask!=0) + { + void *pData; + for(int i=0;istats[ i ]->clear(); + pMinecraft->stats[i]->parse(pData); + } + } + + // Check to see if we can post to social networks. + + // clear the flag + app.uiGameDefinedDataChangedBitmask=0; + + // Check if any profile write are needed + //app.CheckGameSettingsChanged(); + } + PIXEndNamedEvent(); + +#if 0 + app.TickDLCOffersRetrieved(); + app.TickTMSPPFilesRetrieved(); +#endif + + PIXBeginNamedEvent(0,"Network manager do work #2"); + g_NetworkManager.DoWork(); + PIXEndNamedEvent(); + +#if 0 + PIXBeginNamedEvent(0,"Misc extra xui"); + // Update XUI Timers + hr = XuiTimersRun(); +#endif + // Any threading type things to deal with from the xui side? + app.HandleXuiActions(); + +#if 0 + PIXEndNamedEvent(); +#endif + + // 4J-PB - Update the trial timer display if we are in the trial version + if(!ProfileManager.IsFullVersion()) + { + // display the trial timer + if(app.GetGameStarted()) + { + // 4J-PB - if the game is paused, add the elapsed time to the trial timer count so it doesn't tick down + if(app.IsAppPaused()) + { + app.UpdateTrialPausedTimer(); + } + ui.UpdateTrialTimer(ProfileManager.GetPrimaryPad()); + } + } + else + { + // need to turn off the trial timer if it was on , and we've unlocked the full version + if(bTrialTimerDisplayed) + { + ui.ShowTrialTimer(false); + bTrialTimerDisplayed=false; + } + } + + // PS3 DLC + app.CommerceTick(); + + // Fix for #7318 - Title crashes after short soak in the leaderboards menu + // A memory leak was caused because the icon renderer kept creating new Vec3's because the pool wasn't reset + Vec3::resetPool(); + } + + // Free resources, unregister custom classes, and exit. +// app.Uninit(); +// g_pd3dDevice->Release(); +} diff --git a/Minecraft.Client/Cafe/WiiU_Minecraft.h b/Minecraft.Client/Cafe/WiiU_Minecraft.h new file mode 100644 index 00000000..e69de29b diff --git a/Minecraft.Client/Minecraft.Client.vcxproj b/Minecraft.Client/Minecraft.Client.vcxproj index bda9453c..eb82be0f 100644 --- a/Minecraft.Client/Minecraft.Client.vcxproj +++ b/Minecraft.Client/Minecraft.Client.vcxproj @@ -4971,6 +4971,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + + @@ -25115,6 +25117,8 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU + + diff --git a/Minecraft.Client/Minecraft.Client.vcxproj.filters b/Minecraft.Client/Minecraft.Client.vcxproj.filters index ad3f55ca..8174e121 100644 --- a/Minecraft.Client/Minecraft.Client.vcxproj.filters +++ b/Minecraft.Client/Minecraft.Client.vcxproj.filters @@ -726,6 +726,9 @@ {889a84db-3009-4a7c-8234-4bf93d412690} + + {0956a505-3070-4d85-b25b-8731cee48587} + @@ -3775,6 +3778,12 @@ PSVita + + Cafe + + + Cafe + @@ -5919,6 +5928,12 @@ PSVita + + Cafe + + + Cafe +