summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlexApps99 <alex.apps99@gmail.com>2021-08-16 11:26:11 +1200
committerAlexApps99 <alex.apps99@gmail.com>2021-08-20 23:27:01 +1200
commitdfeb87fd3d128d655633e29b0b71eb795d58eab2 (patch)
tree4c123792562055302e02887566aee8bfe586b3bf /src
parent8812e80809dcc18d00faa7f21f5f28b92bfefc66 (diff)
ksys: Add StarterPackMgr
Diffstat (limited to 'src')
-rw-r--r--src/KingSystem/Framework/GameConfig.h10
-rw-r--r--src/KingSystem/Resource/resResourceArchive.h2
-rw-r--r--src/KingSystem/Resource/resResourceMgrTask.cpp9
-rw-r--r--src/KingSystem/Resource/resResourceMgrTask.h6
-rw-r--r--src/KingSystem/Resource/resSystem.cpp8
-rw-r--r--src/KingSystem/Resource/resSystem.h11
-rw-r--r--src/KingSystem/System/CMakeLists.txt2
-rw-r--r--src/KingSystem/System/StarterPackMgr.cpp236
-rw-r--r--src/KingSystem/System/StarterPackMgr.h62
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