mirror of
https://github.com/zeldaret/botw
synced 2026-06-08 04:07:15 -04:00
ksys: Add StarterPackMgr
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
class GameConfig {
|
||||
public:
|
||||
static GameConfig* getInstance() { return sInstancePtr; }
|
||||
|
||||
char mPadding[0x419];
|
||||
bool mField419;
|
||||
|
||||
private:
|
||||
static GameConfig* sInstancePtr;
|
||||
};
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -32,6 +32,8 @@ target_sources(uking PRIVATE
|
||||
Revision.h
|
||||
StageInfo.cpp
|
||||
StageInfo.h
|
||||
StarterPackMgr.cpp
|
||||
StarterPackMgr.h
|
||||
StringBoard.h
|
||||
SystemPauseMgr.cpp
|
||||
SystemPauseMgr.h
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user