From dfeb87fd3d128d655633e29b0b71eb795d58eab2 Mon Sep 17 00:00:00 2001 From: AlexApps99 Date: Mon, 16 Aug 2021 11:26:11 +1200 Subject: [PATCH] ksys: Add StarterPackMgr --- data/uking_functions.csv | 78 +++--- lib/sead | 2 +- src/KingSystem/Framework/GameConfig.h | 10 + src/KingSystem/Resource/resResourceArchive.h | 2 + .../Resource/resResourceMgrTask.cpp | 9 + src/KingSystem/Resource/resResourceMgrTask.h | 6 + src/KingSystem/Resource/resSystem.cpp | 8 + src/KingSystem/Resource/resSystem.h | 11 + src/KingSystem/System/CMakeLists.txt | 2 + src/KingSystem/System/StarterPackMgr.cpp | 236 ++++++++++++++++++ src/KingSystem/System/StarterPackMgr.h | 62 +++++ 11 files changed, 386 insertions(+), 40 deletions(-) create mode 100644 src/KingSystem/Framework/GameConfig.h create mode 100644 src/KingSystem/System/StarterPackMgr.cpp create mode 100644 src/KingSystem/System/StarterPackMgr.h diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 918afdfc..ac92c13b 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -49437,7 +49437,7 @@ Address,Quality,Size,Name 0x00000071007d02a0,U,000092,uking::StageSelect::rtti2 0x00000071007d02fc,U,000008,uking::StageSelect::activeReenter 0x00000071007d0304,U,000008,uking::StageSelect::moveReenter -0x00000071007d030c,U,000428,_ZN4sead16RegionLanguageID5text_Ei +0x00000071007d030c,O,000428,_ZN4sead16RegionLanguageID5text_Ei 0x00000071007d04b8,U,000004,j__ZdlPv_354 0x00000071007d04bc,U,000240, 0x00000071007d05ac,U,000004,j__ZdlPv_355 @@ -51469,9 +51469,9 @@ Address,Quality,Size,Name 0x0000007100844878,O,000036,_ZN5uking2ai15PlayerRideHorseD0Ev 0x000000710084489c,U,000428,_ZN3aal9ShapeType5text_Ei 0x0000007100844a48,U,000004,j__ZdlPv_367 -0x0000007100844a4c,U,000240,_ZN4sead15FixedSafeStringILi95EEaSERKNS_14SafeStringBaseIcEE +0x0000007100844a4c,O,000240,_ZN4sead15FixedSafeStringILi95EEaSERKNS_14SafeStringBaseIcEE 0x0000007100844b3c,U,000004,j__ZdlPv_368 -0x0000007100844b40,U,000240,_ZN4sead19FixedSafeStringBaseIcLi95EEaSERKNS_14SafeStringBaseIcEE +0x0000007100844b40,O,000240,_ZN4sead19FixedSafeStringBaseIcLi95EEaSERKNS_14SafeStringBaseIcEE 0x0000007100844c30,O,000048,_ZN5uking2ai10PlayerRootC1ERKN4ksys3act2ai10ActionBase7InitArgE 0x0000007100844c60,U,000060,_ZN5uking2ai10PlayerRoot5calc_Ev 0x0000007100844c9c,U,000076,_ZN5uking2ai10PlayerRoot6enter_EPN4ksys3act2ai15InlineParamPackE @@ -53048,12 +53048,12 @@ Address,Quality,Size,Name 0x00000071008a5adc,U,000064,DungeonPackMgr::__auto0 0x00000071008a5b1c,U,000068, 0x00000071008a5b60,U,000008,DungeonPackMgr::startedLoadAndFailed -0x00000071008a5b68,U,000076,EntryFactorySARC::dtorDelete -0x00000071008a5bb4,U,000132,EntryFactorySARC::rtti1 -0x00000071008a5c38,U,000092,EntryFactorySARC::rtti2 -0x00000071008a5c94,U,000152,EntryFactorySARC::newResource -0x00000071008a5d2c,U,000008,EntryFactorySARC::getResourceSize -0x00000071008a5d34,U,000008,EntryFactorySARC::getLoadDataAlignment +0x00000071008a5b68,O,000076,_ZN4ksys3res12EntryFactoryINS0_7ArchiveEED0Ev +0x00000071008a5bb4,m,000132,_ZNK4ksys3res12EntryFactoryINS0_7ArchiveEE27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071008a5c38,O,000092,_ZNK4ksys3res12EntryFactoryINS0_7ArchiveEE18getRuntimeTypeInfoEv +0x00000071008a5c94,O,000152,_ZN4ksys3res12EntryFactoryINS0_7ArchiveEE12newResource_EPN4sead4HeapEi +0x00000071008a5d2c,O,000008,_ZNK4ksys3res12EntryFactoryINS0_7ArchiveEE15getResourceSizeEv +0x00000071008a5d34,O,000008,_ZNK4ksys3res12EntryFactoryINS0_7ArchiveEE20getLoadDataAlignmentEv 0x00000071008a5d3c,U,000096, 0x00000071008a5d9c,U,000104, 0x00000071008a5e04,U,000312,E3Mgr::createInstance @@ -80079,32 +80079,32 @@ Address,Quality,Size,Name 0x0000007100eda824,U,000288,System::m2 0x0000007100eda944,U,000092,System::m3 0x0000007100eda9a0,U,000008,System::m62 -0x0000007100eda9a8,U,000204,StarterPackMgr::destroyInstance -0x0000007100edaa74,U,000036,StarterPackMgr::destroyInstanceDtor -0x0000007100edaa98,U,000128,StarterPackMgr::createInstance -0x0000007100edab18,U,000244,StarterPackMgr::ctor -0x0000007100edac0c,U,000356,StarterPackMgr::registerPackFactoryAndMakeOverlayArena -0x0000007100edad70,U,000112,StarterPackMgr::deleteArenaAndHeapAndUnregisterFactory -0x0000007100edade0,U,000196,StarterPackMgr::loadBootupGraphicsPack -0x0000007100edaea4,U,000332,StarterPackMgr::loadBootupPacks -0x0000007100edaff0,U,000196,StarterPackMgr::loadTitlePack -0x0000007100edb0b4,U,000332,StarterPackMgr::loadTitleBGPacks -0x0000007100edb200,U,000032,StarterPackMgr::loadAocMainFieldPack -0x0000007100edb220,U,000072,StarterPackMgr::unloadBootupGraphicsPack -0x0000007100edb268,U,000036,StarterPackMgr::bootupGraphicsPackReady -0x0000007100edb28c,U,000116,StarterPackMgr::setPackToBootupGraphics -0x0000007100edb300,U,000080,StarterPackMgr::unloadBootupAndBootupLangPack -0x0000007100edb350,U,000088,StarterPackMgr::bootupPacksReady -0x0000007100edb3a8,U,000132,StarterPackMgr::setPackToBootupPack -0x0000007100edb42c,U,000072,StarterPackMgr::unloadTitlePack -0x0000007100edb474,U,000036,StarterPackMgr::isTitlePackReady -0x0000007100edb498,U,000036,StarterPackMgr::isTitlePackK -0x0000007100edb4bc,U,000116,StarterPackMgr::setPackToTitlePack -0x0000007100edb530,U,000180,StarterPackMgr::setPackToTitleBGPack -0x0000007100edb5e4,U,000156,StarterPackMgr::unloadTitleBGAndAocMainFieldPacksAndStuff -0x0000007100edb680,U,000008,StarterPackMgr::failedLoadTitlePack -0x0000007100edb688,U,000044,StarterPackMgr::x -0x0000007100edb6b4,U,000044,StarterPackMgr::getTitleBGLangPack +0x0000007100eda9a8,O,000204,_ZN4ksys14StarterPackMgr18SingletonDisposer_D1Ev +0x0000007100edaa74,O,000036,_ZN4ksys14StarterPackMgr18SingletonDisposer_D0Ev +0x0000007100edaa98,O,000128,_ZN4ksys14StarterPackMgr14createInstanceEPN4sead4HeapE +0x0000007100edab18,O,000244,_ZN4ksys14StarterPackMgrC1Ev +0x0000007100edac0c,O,000356,_ZN4ksys14StarterPackMgr38registerPackFactoryAndMakeOverlayArenaEb +0x0000007100edad70,O,000112,_ZN4ksys14StarterPackMgr38deleteArenaAndHeapAndUnregisterFactoryEv +0x0000007100edade0,O,000196,_ZN4ksys14StarterPackMgr22loadBootupGraphicsPackEv +0x0000007100edaea4,O,000332,_ZN4ksys14StarterPackMgr15loadBootupPacksEv +0x0000007100edaff0,O,000196,_ZN4ksys14StarterPackMgr13loadTitlePackEv +0x0000007100edb0b4,O,000332,_ZN4ksys14StarterPackMgr16loadTitleBGPacksEv +0x0000007100edb200,O,000032,_ZN4ksys14StarterPackMgr20loadAocMainFieldPackEv +0x0000007100edb220,O,000072,_ZN4ksys14StarterPackMgr24unloadBootupGraphicsPackEv +0x0000007100edb268,O,000036,_ZN4ksys14StarterPackMgr23bootupGraphicsPackReadyEv +0x0000007100edb28c,O,000116,_ZN4ksys14StarterPackMgr23setPackToBootupGraphicsEv +0x0000007100edb300,O,000080,_ZN4ksys14StarterPackMgr29unloadBootupAndBootupLangPackEv +0x0000007100edb350,O,000088,_ZN4ksys14StarterPackMgr16bootupPacksReadyEv +0x0000007100edb3a8,O,000132,_ZN4ksys14StarterPackMgr19setPackToBootupPackEv +0x0000007100edb42c,O,000072,_ZN4ksys14StarterPackMgr15unloadTitlePackEv +0x0000007100edb474,O,000036,_ZN4ksys14StarterPackMgr16isTitlePackReadyEv +0x0000007100edb498,O,000036,_ZN4ksys14StarterPackMgr12isTitlePackKEv +0x0000007100edb4bc,O,000116,_ZN4ksys14StarterPackMgr18setPackToTitlePackEv +0x0000007100edb530,O,000180,_ZN4ksys14StarterPackMgr20setPackToTitleBGPackEv +0x0000007100edb5e4,O,000156,_ZN4ksys14StarterPackMgr41unloadTitleBGAndAocMainFieldPacksAndStuffEv +0x0000007100edb680,O,000008,_ZN4ksys14StarterPackMgr19failedLoadTitlePackEv +0x0000007100edb688,O,000044,_ZN4ksys14StarterPackMgr17getBootupLangPackEv +0x0000007100edb6b4,O,000044,_ZN4ksys14StarterPackMgr18getTitleBGLangPackEv 0x0000007100edb6e0,U,000204, 0x0000007100edb7ac,U,000100, 0x0000007100edb810,U,000108, @@ -93174,7 +93174,7 @@ Address,Quality,Size,Name 0x0000007101208c0c,U,001288,res::ResourceMgrTask::submitLoadRequest 0x0000007101209114,U,000292,res::ResourceMgrTask::copyExtensionAndRemoveS 0x0000007101209238,U,002240,res::ResourceMgrTask::submitLoadForSyncRequest -0x0000007101209af8,U,000016, +0x0000007101209af8,O,000016,_ZN4ksys3res15ResourceMgrTask7setPackEPNS0_6HandleE 0x0000007101209b08,U,000332,res::ResourceMgrTask::submitUnloadRequest 0x0000007101209c54,U,000388,res::ResourceMgrTask::requestUnloadForSync 0x0000007101209dd8,O,000128,_ZN4ksys3res15ResourceMgrTask12registerUnitEPNS0_12ResourceUnitE @@ -93319,7 +93319,7 @@ Address,Quality,Size,Name 0x0000007101213144,U,000016,isResourceMgrOom 0x0000007101213154,O,000032,_ZN4ksys3res20registerEntryFactoryEPNS0_16EntryFactoryBaseERKN4sead14SafeStringBaseIcEE 0x0000007101213174,O,000024,_ZN4ksys3res22unregisterEntryFactoryEPNS0_16EntryFactoryBaseE -0x000000710121318c,U,000024,res::setResourceMgrPack +0x000000710121318c,O,000024,_ZN4ksys3res18setResourceMgrPackEPNS0_6HandleE 0x00000071012131a4,U,000016,res::clearAllCaches 0x00000071012131b4,U,000016,res::clearAllCaches2 0x00000071012131c4,U,000016,res::clearAllCaches3 @@ -93331,9 +93331,9 @@ Address,Quality,Size,Name 0x0000007101213290,O,000008,_ZN4ksys3res18stubbedLogFunctionEv 0x0000007101213298,O,000008,_ZN4ksys3res11returnFalseEv 0x00000071012132a0,O,000008,_ZN4ksys3res12returnFalse2ERKN4sead14SafeStringBaseIcEE -0x00000071012132a8,U,000004,nullsub_4703 +0x00000071012132a8,O,000004,_ZN4ksys3res21registerPackExtensionEbRKN4sead14SafeStringBaseIcEE 0x00000071012132ac,U,000008,return_0__ -0x00000071012132b4,U,000004,nullsub_4704 +0x00000071012132b4,O,000004,_ZN4ksys3res11stubbedBoolEb 0x00000071012132b8,U,000004,nullsub_4705 0x00000071012132bc,U,000004,nullsub_4706 0x00000071012132c0,U,000004,res::writeResourceListToCsv diff --git a/lib/sead b/lib/sead index 89ce7b37..1befe5e4 160000 --- a/lib/sead +++ b/lib/sead @@ -1 +1 @@ -Subproject commit 89ce7b37a6d54e3b34ef517c21ecaeaa3cf8be29 +Subproject commit 1befe5e418df5f7fa443939dc50426407d064401 diff --git a/src/KingSystem/Framework/GameConfig.h b/src/KingSystem/Framework/GameConfig.h new file mode 100644 index 00000000..a17d5661 --- /dev/null +++ b/src/KingSystem/Framework/GameConfig.h @@ -0,0 +1,10 @@ +class GameConfig { +public: + static GameConfig* getInstance() { return sInstancePtr; } + + char mPadding[0x419]; + bool mField419; + +private: + static GameConfig* sInstancePtr; +}; diff --git a/src/KingSystem/Resource/resResourceArchive.h b/src/KingSystem/Resource/resResourceArchive.h index 60550d53..34b0c16d 100644 --- a/src/KingSystem/Resource/resResourceArchive.h +++ b/src/KingSystem/Resource/resResourceArchive.h @@ -17,6 +17,8 @@ public: ~Archive() override; void doCreate_(u8* data, u32 size, sead::Heap* heap) override; + + static constexpr size_t cLoadDataAlignment = 0x80; }; KSYS_CHECK_SIZE_NX150(Archive, 0x68); diff --git a/src/KingSystem/Resource/resResourceMgrTask.cpp b/src/KingSystem/Resource/resResourceMgrTask.cpp index 4497d4f4..6b4d34f2 100644 --- a/src/KingSystem/Resource/resResourceMgrTask.cpp +++ b/src/KingSystem/Resource/resResourceMgrTask.cpp @@ -238,6 +238,10 @@ void ResourceMgrTask::setFlag2000Or5000(s32 type) { } } +void ResourceMgrTask::resetFlag20000() { + mFlags.reset(Flag::_20000); +} + bool ResourceMgrTask::isFlag4Set() const { return mFlags.isOn(Flag::_4); } @@ -701,4 +705,9 @@ void ResourceMgrTask::removeOverlayArena(OverlayArena* arena) { } } +void ResourceMgrTask::setPack(Handle* pack) { + mPackHandle = pack; + res::stubbedLogFunction(); +} + } // namespace ksys::res diff --git a/src/KingSystem/Resource/resResourceMgrTask.h b/src/KingSystem/Resource/resResourceMgrTask.h index 81e3e083..225d9b6f 100644 --- a/src/KingSystem/Resource/resResourceMgrTask.h +++ b/src/KingSystem/Resource/resResourceMgrTask.h @@ -137,6 +137,7 @@ public: void controlField9c0d88(bool off); void setFlag2000Or5000(s32 type); + void resetFlag20000(); void copyLoadRequest(ILoadRequest* request, const sead::SafeString& path, const ILoadRequest& source_request); @@ -264,6 +265,10 @@ public: ResourceUnitDelegatePair& getUnitInitLoadFn() { return mUnitInitLoadFn; } auto& getUnitAdjustHeapFn() { return mUnitAdjustHeapFn; } + OverlayArena* getArenaForResourceL() { return &mArenaForResourceL; } + + void setPack(Handle* pack); + private: enum class Flag { _1 = 1, @@ -274,6 +279,7 @@ private: _1000 = 0x1000, _2000 = 0x2000, _4000 = 0x4000, + _20000 = 0x20000, }; enum class CacheControlFlag : u8 { diff --git a/src/KingSystem/Resource/resSystem.cpp b/src/KingSystem/Resource/resSystem.cpp index c40b9df9..e1064b13 100644 --- a/src/KingSystem/Resource/resSystem.cpp +++ b/src/KingSystem/Resource/resSystem.cpp @@ -36,4 +36,12 @@ s32 getDefaultAlignment() { return 8; } +void registerPackExtension(bool has_extension, const sead::SafeString& extension) {} + +void stubbedBool(bool) {} + +void setResourceMgrPack(Handle* pack) { + ResourceMgrTask::instance()->setPack(pack); +} + } // namespace ksys::res diff --git a/src/KingSystem/Resource/resSystem.h b/src/KingSystem/Resource/resSystem.h index 4d44d20f..9cdc52f8 100644 --- a/src/KingSystem/Resource/resSystem.h +++ b/src/KingSystem/Resource/resSystem.h @@ -1,6 +1,7 @@ #pragma once #include +#include "resHandle.h" namespace ksys::res { @@ -27,4 +28,14 @@ bool returnFalse3(const sead::SafeString& path); s32 getDefaultAlignment(); +// In release builds, this function does nothing. +// TODO: figure out what this is used for. Stubbed log function? +void registerPackExtension(bool has_extension, const sead::SafeString& extension); + +// In release builds, this function does nothing. +// TODO: figure out what this is used for. Stubbed log function? +void stubbedBool(bool); + +void setResourceMgrPack(Handle* pack); + } // namespace ksys::res diff --git a/src/KingSystem/System/CMakeLists.txt b/src/KingSystem/System/CMakeLists.txt index b9dae8a7..05520333 100644 --- a/src/KingSystem/System/CMakeLists.txt +++ b/src/KingSystem/System/CMakeLists.txt @@ -32,6 +32,8 @@ target_sources(uking PRIVATE Revision.h StageInfo.cpp StageInfo.h + StarterPackMgr.cpp + StarterPackMgr.h StringBoard.h SystemPauseMgr.cpp SystemPauseMgr.h diff --git a/src/KingSystem/System/StarterPackMgr.cpp b/src/KingSystem/System/StarterPackMgr.cpp new file mode 100644 index 00000000..c0ede3a0 --- /dev/null +++ b/src/KingSystem/System/StarterPackMgr.cpp @@ -0,0 +1,236 @@ +#include "KingSystem/System/StarterPackMgr.h" + +namespace ksys { +SEAD_SINGLETON_DISPOSER_IMPL(StarterPackMgr) + +StarterPackMgr::StarterPackMgr() = default; + +StarterPackMgr::~StarterPackMgr() = default; + +void StarterPackMgr::registerPackFactoryAndMakeOverlayArena(bool reduced_heap_size) { + if (!mExpHeap) { + res::registerEntryFactory(&mArchiveFac, "pack"); + sead::Heap* heap = res::ResourceMgrTask::instance()->getArenaForResourceL()->getHeap(); + u64 heap_size; + if (!reduced_heap_size) { + heap_size = 0xe100000; + } else { + heap_size = 0x1400000; + } + mExpHeap = sead::ExpHeap::create(heap_size, "StarterPackMgr", heap, -8, + sead::Heap::cHeapDirection_Forward, true); + mOverlayArena = new (mExpHeap, 8) OverlayArena; + OverlayArena::InitArg arg; + arg.size = mExpHeap->getMaxAllocatableSize(8); + arg.use_best_fit_alloc_mode = false; + arg.set_flag_1 = true; + arg.set_flag_8 = true; + arg.name = "StarterPackMgr"; + arg.heap = mExpHeap; + arg.heap2 = nullptr; + arg._6 = false; + arg.set_flag_10 = false; + mOverlayArena->init(arg); + } +} + +void StarterPackMgr::deleteArenaAndHeapAndUnregisterFactory() { + if (!GameConfig::getInstance()->mField419) { + if (mOverlayArena) { + delete mOverlayArena; + mOverlayArena = nullptr; + } + if (mExpHeap) { + mExpHeap->destroy(); + mExpHeap = nullptr; + } + res::unregisterEntryFactory(&mArchiveFac); + } +} + +void StarterPackMgr::loadBootupGraphicsPack() { + if (!GameConfig::getInstance()->mField419) { + sead::SafeString extension = ".pack"; + res::registerPackExtension(true, extension); + + res::LoadRequest load_req; + load_req.mRequester = "StarterPackMgr"; + load_req._8 = true; + load_req._26 = false; + load_req.mArena = mOverlayArena; + + mBootupGfxPack.requestLoad("Pack/Bootup_Graphics.pack", &load_req, nullptr); + } +} + +void StarterPackMgr::loadBootupPacks() { + if (!GameConfig::getInstance()->mField419) { + sead::SafeString extension = ".pack"; + res::registerPackExtension(true, extension); + + res::LoadRequest load_req; + load_req.mRequester = "StarterPackMgr"; + load_req._8 = true; + load_req._26 = false; + load_req.mArena = mOverlayArena; + + mBootupPack.requestLoad("Pack/Bootup.pack", &load_req, nullptr); + sead::FixedSafeString<128> lang_pack; + sead::RegionLanguageID region_lang = sead::EnvUtil::getRegionLanguage(); + lang_pack.format("Pack/Bootup_%s.pack", region_lang.text()); + mBootupLangPack.requestLoad(lang_pack, &load_req, nullptr); + } +} + +void StarterPackMgr::loadTitlePack() { + if (!GameConfig::getInstance()->mField419) { + sead::SafeString extension = ".pack"; + res::registerPackExtension(true, extension); + + res::LoadRequest load_req; + load_req.mRequester = "StarterPackMgr"; + load_req._8 = true; + load_req._26 = false; + load_req.mArena = mOverlayArena; + + mTitlePack.requestLoad("Pack/Title.pack", &load_req, nullptr); + } +} + +void StarterPackMgr::loadTitleBGPacks() { + if (!GameConfig::getInstance()->mField419) { + sead::SafeString extension = ".pack"; + res::registerPackExtension(true, extension); + + res::LoadRequest load_req; + load_req.mRequester = "StarterPackMgr"; + load_req._8 = true; + load_req._26 = false; + load_req.mArena = mOverlayArena; + + mTitleBGPack.requestLoad("Pack/TitleBG.pack", &load_req, nullptr); + sead::FixedSafeString<128> lang_pack; + sead::RegionLanguageID region_lang = sead::EnvUtil::getRegionLanguage(); + lang_pack.format("Pack/TitleBG_%s.pack", region_lang.text()); + mTitleBGLangPack.requestLoad(lang_pack, &load_req, nullptr); + } +} + +void StarterPackMgr::loadAocMainFieldPack() { + if (uking::aoc::Manager::instance()) + uking::aoc::Manager::instance()->loadAocMainFieldPack(mOverlayArena); +} + +void StarterPackMgr::unloadBootupGraphicsPack() { + if (!GameConfig::getInstance()->mField419) { + res::setResourceMgrPack(nullptr); + mBootupGfxPack.requestUnload(); + } +} + +bool StarterPackMgr::bootupGraphicsPackReady() { + return GameConfig::getInstance()->mField419 || mBootupGfxPack.isReadyOrNeedsParse(); +} + +void StarterPackMgr::setPackToBootupGraphics() { + if (!GameConfig::getInstance()->mField419) { + mBootupGfxPack.parseResource(nullptr); + res::registerPackExtension(false, ""); + res::setResourceMgrPack(&mBootupGfxPack); + } +} + +void StarterPackMgr::unloadBootupAndBootupLangPack() { + if (!GameConfig::getInstance()->mField419) { + res::setResourceMgrPack(nullptr); + mBootupPack.requestUnload(); + mBootupLangPack.requestUnload(); + } +} + +bool StarterPackMgr::bootupPacksReady() { + return GameConfig::getInstance()->mField419 || + (mBootupPack.isReadyOrNeedsParse() && mBootupLangPack.isReadyOrNeedsParse()); +} + +void StarterPackMgr::setPackToBootupPack() { + if (!GameConfig::getInstance()->mField419) { + mBootupPack.parseResource(nullptr); + mBootupLangPack.parseResource(nullptr); + res::registerPackExtension(false, ""); + res::setResourceMgrPack(&mBootupPack); + } +} + +void StarterPackMgr::unloadTitlePack() { + if (!GameConfig::getInstance()->mField419) { + res::setResourceMgrPack(nullptr); + mTitlePack.requestUnload(); + } +} + +bool StarterPackMgr::isTitlePackReady() { + return GameConfig::getInstance()->mField419 || mTitlePack.isReadyOrNeedsParse(); +} + +bool StarterPackMgr::isTitlePackK() { + return GameConfig::getInstance()->mField419 || mTitlePack.hasParsedResource(); +} + +void StarterPackMgr::setPackToTitlePack() { + if (!GameConfig::getInstance()->mField419) { + mTitlePack.parseResource(nullptr); + res::registerPackExtension(false, ""); + res::setResourceMgrPack(&mTitlePack); + } +} + +void StarterPackMgr::setPackToTitleBGPack() { + if (!GameConfig::getInstance()->mField419) { + mTitleBGPack.waitForReady(); + mTitleBGPack.parseResource(nullptr); + mTitleBGLangPack.waitForReady(); + mTitleBGLangPack.parseResource(nullptr); + + if (uking::aoc::Manager::instance()) + uking::aoc::Manager::instance()->registerAocMainFieldPack(); + + res::registerPackExtension(false, ""); + res::setResourceMgrPack(&mTitleBGPack); + res::stubbedBool(false); + } +} + +void StarterPackMgr::unloadTitleBGAndAocMainFieldPacksAndStuff() { + if (!GameConfig::getInstance()->mField419) { + res::setResourceMgrPack(nullptr); + mTitleBGPack.requestUnload(); + mTitleBGLangPack.requestUnload(); + + if (uking::aoc::Manager::instance()) + uking::aoc::Manager::instance()->unloadAocMainFieldPack(); + + for (int x = 0; x < 5; x++) + res::ResourceMgrTask::instance()->waitForTaskQueuesToEmpty(); + + res::ResourceMgrTask::instance()->resetFlag20000(); + } +} + +void StarterPackMgr::failedLoadTitlePack() { + mTitlePack.requestedLoad(); +} + +res::Handle* StarterPackMgr::getTitleBGLangPack() { + if (!mTitleBGLangPack.hasParsedResource()) + return nullptr; + return &mTitleBGLangPack; +} + +res::Handle* StarterPackMgr::getBootupLangPack() { + if (!mBootupLangPack.hasParsedResource()) + return nullptr; + return &mBootupLangPack; +} + +} // namespace ksys diff --git a/src/KingSystem/System/StarterPackMgr.h b/src/KingSystem/System/StarterPackMgr.h new file mode 100644 index 00000000..a0d1214d --- /dev/null +++ b/src/KingSystem/System/StarterPackMgr.h @@ -0,0 +1,62 @@ +#pragma once + +#include +#include +#include +#include "Game/DLC/aocManager.h" +#include "KingSystem/Framework/GameConfig.h" +#include "KingSystem/Resource/resEntryFactory.h" +#include "KingSystem/Resource/resHandle.h" +#include "KingSystem/Resource/resLoadRequest.h" +#include "KingSystem/Resource/resResourceArchive.h" +#include "KingSystem/Resource/resResourceMgrTask.h" +#include "KingSystem/Resource/resSystem.h" +#include "KingSystem/System/OverlayArena.h" +#include "KingSystem/Utils/Types.h" + +namespace ksys { + +class StarterPackMgr { + SEAD_SINGLETON_DISPOSER(StarterPackMgr) + StarterPackMgr(); + ~StarterPackMgr(); + +public: + void registerPackFactoryAndMakeOverlayArena(bool reduced_heap_size); + void deleteArenaAndHeapAndUnregisterFactory(); + void loadBootupGraphicsPack(); + void loadBootupPacks(); + void loadTitlePack(); + void loadTitleBGPacks(); + void loadAocMainFieldPack(); + void unloadBootupGraphicsPack(); + bool bootupGraphicsPackReady(); + void setPackToBootupGraphics(); + void unloadBootupAndBootupLangPack(); + bool bootupPacksReady(); + void setPackToBootupPack(); + void unloadTitlePack(); + bool isTitlePackReady(); + bool isTitlePackK(); + void setPackToTitlePack(); + void setPackToTitleBGPack(); + void unloadTitleBGAndAocMainFieldPacksAndStuff(); + void failedLoadTitlePack(); + res::Handle* getBootupLangPack(); + res::Handle* getTitleBGLangPack(); + +private: + res::Handle mBootupGfxPack; + res::Handle mBootupPack; + res::Handle mUnusedPack; + res::Handle mBootupLangPack; + res::Handle mTitlePack; + res::Handle mTitleBGPack; + res::Handle mTitleBGLangPack; + OverlayArena* mOverlayArena = nullptr; + sead::ExpHeap* mExpHeap = nullptr; + res::EntryFactory mArchiveFac; +}; +KSYS_CHECK_SIZE_NX150(StarterPackMgr, 0x348); + +} // namespace ksys