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 | |
| parent | 8812e80809dcc18d00faa7f21f5f28b92bfefc66 (diff) | |
ksys: Add StarterPackMgr
Diffstat (limited to 'src')
| -rw-r--r-- | src/KingSystem/Framework/GameConfig.h | 10 | ||||
| -rw-r--r-- | src/KingSystem/Resource/resResourceArchive.h | 2 | ||||
| -rw-r--r-- | src/KingSystem/Resource/resResourceMgrTask.cpp | 9 | ||||
| -rw-r--r-- | src/KingSystem/Resource/resResourceMgrTask.h | 6 | ||||
| -rw-r--r-- | src/KingSystem/Resource/resSystem.cpp | 8 | ||||
| -rw-r--r-- | src/KingSystem/Resource/resSystem.h | 11 | ||||
| -rw-r--r-- | src/KingSystem/System/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/KingSystem/System/StarterPackMgr.cpp | 236 | ||||
| -rw-r--r-- | src/KingSystem/System/StarterPackMgr.h | 62 |
9 files changed, 346 insertions, 0 deletions
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 <prim/seadSafeString.h> +#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 <devenv/seadEnvUtil.h> +#include <heap/seadExpHeap.h> +#include <prim/seadSafeString.h> +#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<res::Archive> mArchiveFac; +}; +KSYS_CHECK_SIZE_NX150(StarterPackMgr, 0x348); + +} // namespace ksys |
