diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 9244e852..42d809eb 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -78166,15 +78166,16 @@ 0x0000007100e4cf18,_ZNK5uking2ai11DefWanderAI18getRuntimeTypeInfoEv,92,_ZNK5uking2ai11DefWanderAI18getRuntimeTypeInfoEv 0x0000007100e4cf74,_ZN5uking2ai11DefWanderAID1Ev,4,_ZN5uking2ai11DefWanderAID1Ev 0x0000007100e4cf78,_ZN5uking2ai11DefWanderAID0Ev,36,_ZN5uking2ai11DefWanderAID0Ev -0x0000007100e4cf9c,sub_7100E4CF9C,96, -0x0000007100e4cffc,sub_7100E4CFFC,104, -0x0000007100e4d064,GlobalParameter::createInstance,132, -0x0000007100e4d0e8,GlobalParameter::deleteInstance,92, -0x0000007100e4d144,GlobalParameter::stubbed,8, -0x0000007100e4d14c,GlobalParameter::unload,92, -0x0000007100e4d1a8,GlobalParameter::loadActorPack,84, -0x0000007100e4d1fc,GlobalParameter::resIsReady,60, -0x0000007100e4d238,GlobalParameter::loadActorFiles,256, +0x0000007100e4cf9c,sub_7100E4CF9C,96,_ZN4ksys3act15GlobalParameter18SingletonDisposer_D2Ev +0x0000007100e4cffc,sub_7100E4CFFC,104,_ZN4ksys3act15GlobalParameter18SingletonDisposer_D0Ev +0x0000007100e4d064,GlobalParameter::createInstance,132,_ZN4ksys3act15GlobalParameter14createInstanceEPN4sead4HeapE +0x0000007100e4d0e8,GlobalParameter::deleteInstance,92,_ZN4ksys3act15GlobalParameter14deleteInstanceEv +0x0000007100e4d144,GlobalParameter::stubbed,8,_ZN4ksys3act15GlobalParameter4initEPN4sead4HeapE +0x0000007100e4d14c,GlobalParameter::unload,92,_ZN4ksys3act15GlobalParameter8finalizeEv +0x0000007100e4d1a8,GlobalParameter::loadActorPack,84,_ZN4ksys3act15GlobalParameter13loadActorPackEPN4sead4HeapE +0x0000007100e4d1fc,GlobalParameter::resIsReady,60,_ZNK4ksys3act15GlobalParameter16isActorPackReadyEv +0x0000007100e4d238,GlobalParameter::loadActorFiles,4,_ZN4ksys3act15GlobalParameter15loadActorParamsEv +0x0000007100e4d23c,GlobalParameter::loadActorFiles_,252,_ZN4ksys3act15GlobalParameter16loadActorParams_Ev 0x0000007100e4d338,ActorLimiter::List::init,236,_ZN4ksys3act12ActorLimiter4List4initEPN4sead4HeapEi 0x0000007100e4d424,ActorLimiter::List::addActor,428,_ZN4ksys3act12ActorLimiter4List8addActorEPNS0_8BaseProcEb 0x0000007100e4d5d0,ActorLimiter::Disposer::dtor,204,_ZN4ksys3act12ActorLimiter18SingletonDisposer_D2Ev diff --git a/src/KingSystem/ActorSystem/CMakeLists.txt b/src/KingSystem/ActorSystem/CMakeLists.txt index e7bef107..17a8eae2 100644 --- a/src/KingSystem/ActorSystem/CMakeLists.txt +++ b/src/KingSystem/ActorSystem/CMakeLists.txt @@ -66,6 +66,8 @@ target_sources(uking PRIVATE actBaseProcUnit.h actDebug.cpp actDebug.h + actGlobalParameter.cpp + actGlobalParameter.h actInfoCommon.cpp actInfoCommon.h actInfoData.cpp diff --git a/src/KingSystem/ActorSystem/actActorParamMgr.h b/src/KingSystem/ActorSystem/actActorParamMgr.h index 461ca4a6..452c5855 100644 --- a/src/KingSystem/ActorSystem/actActorParamMgr.h +++ b/src/KingSystem/ActorSystem/actActorParamMgr.h @@ -46,6 +46,9 @@ public: u32 load_req_c); void unloadParam(ActorParam* param); + bool requestLoadActorPack(res::Handle* handle, const sead::SafeString& actor_name, + u32 load_req_c); + ActorParam* loadParamAsync(const char* actor_name, res::Handle* pack_handle, bool* allocated_new, void* x, u32 load_req_c); bool finishLoadingActorLink(ActorParam* param, void* x); @@ -65,8 +68,6 @@ private: void loadFiles(ActorParam* param, sead::Heap* heap, res::Handle* pack_handle, void* x, u32 load_req_c); - bool requestLoadActorPack(res::Handle* handle, const sead::SafeString& actor_name, - u32 load_req_c); bool prepareLoadFromActorPack(sead::BufferedSafeString* path, res::LoadRequest* req, void* x, const sead::SafeString& dir_name, const sead::SafeString& extension, diff --git a/src/KingSystem/ActorSystem/actGlobalParameter.cpp b/src/KingSystem/ActorSystem/actGlobalParameter.cpp new file mode 100644 index 00000000..3e560b9d --- /dev/null +++ b/src/KingSystem/ActorSystem/actGlobalParameter.cpp @@ -0,0 +1,53 @@ +#include "KingSystem/ActorSystem/actGlobalParameter.h" +#include "KingSystem/ActorSystem/actActorParam.h" +#include "KingSystem/ActorSystem/actActorParamMgr.h" +#include "KingSystem/Resource/resResourceArchive.h" +#include "KingSystem/Resource/resResourceGParamList.h" + +namespace ksys::act { + +SEAD_SINGLETON_DISPOSER_IMPL(GlobalParameter) + +bool GlobalParameter::init(sead::Heap* heap) { + return true; +} + +void GlobalParameter::finalize() { + if (mActorParam) { + ActorParamMgr::instance()->unloadParam(mActorParam); + mActorParam = nullptr; + } + + mGlobalParam = nullptr; + + if (mResHandle.getResource()) + mResHandle.requestUnload(); +} + +void GlobalParameter::loadActorPack(sead::Heap* heap) { + ActorParamMgr::instance()->requestLoadActorPack(&mResHandle, "GlobalParameter", 1); +} + +bool GlobalParameter::isActorPackReady() const { + return mResHandle.checkLoadStatus() || mResHandle.isReady(); +} + +bool GlobalParameter::loadActorParams() { + return loadActorParams_(); +} + +bool GlobalParameter::loadActorParams_() { + const auto* res = sead::DynamicCast(mResHandle.getResource()); + if (!res) + return false; + + void* x; + mActorParam = ActorParamMgr::instance()->loadParam("GlobalParameter", &mResHandle, &x, 1); + + if (mActorParam->getRes().mGParamList) + mGlobalParam = mActorParam->getRes().mGParamList->getGlobal(); + + return mGlobalParam != nullptr; +} + +} // namespace ksys::act diff --git a/src/KingSystem/ActorSystem/actGlobalParameter.h b/src/KingSystem/ActorSystem/actGlobalParameter.h new file mode 100644 index 00000000..bb1ca54d --- /dev/null +++ b/src/KingSystem/ActorSystem/actGlobalParameter.h @@ -0,0 +1,37 @@ +#pragma once + +#include +#include "KingSystem/Resource/resHandle.h" + +namespace ksys::res { +class GParamListObjectGlobal; +} + +namespace ksys::act { + +class ActorParam; + +class GlobalParameter { + SEAD_SINGLETON_DISPOSER(GlobalParameter) + GlobalParameter() = default; + ~GlobalParameter() = default; + +public: + bool init(sead::Heap* heap); + void finalize(); + + void loadActorPack(sead::Heap* heap); + bool isActorPackReady() const; + bool loadActorParams(); + + const res::GParamListObjectGlobal* getGlobalParam() const { return mGlobalParam; } + +private: + bool loadActorParams_(); + + ActorParam* mActorParam{}; + const res::GParamListObjectGlobal* mGlobalParam{}; + res::Handle mResHandle{}; +}; + +} // namespace ksys::act