diff options
| author | AlexApps99 <alex.apps99@gmail.com> | 2021-08-16 11:26:11 +1200 |
|---|---|---|
| committer | AlexApps99 <alex.apps99@gmail.com> | 2021-08-20 23:27:01 +1200 |
| commit | dfeb87fd3d128d655633e29b0b71eb795d58eab2 (patch) | |
| tree | 4c123792562055302e02887566aee8bfe586b3bf /src/KingSystem/System/StarterPackMgr.cpp | |
| parent | 8812e80809dcc18d00faa7f21f5f28b92bfefc66 (diff) | |
ksys: Add StarterPackMgr
Diffstat (limited to 'src/KingSystem/System/StarterPackMgr.cpp')
| -rw-r--r-- | src/KingSystem/System/StarterPackMgr.cpp | 236 |
1 files changed, 236 insertions, 0 deletions
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 |
