diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 7a9864be..64286f56 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -90952,10 +90952,10 @@ 0x0000007101169c1c,sub_7101169C1C,248,_ZN4sead9SafeArrayIN4ksys3res6HandleELi28EED2Ev 0x0000007101169d14,sub_7101169D14,8, 0x0000007101169d1c,sub_7101169D1C,316, -0x0000007101169e58,ActorParam::getLoad,620, -0x000000710116a0c4,ActorParam::prepareLoad,404, +0x0000007101169e58,ActorParam::getLoad,620,_ZNK4ksys3act13ActorParamMgr8getParamEPKcPPNS0_10ActorParamE? +0x000000710116a0c4,ActorParam::prepareLoad,404,_ZN4ksys3act13ActorParamMgr9loadParamEPKcPNS_3res6HandleEPvj 0x000000710116a258,ActorParam::loadActorFiles,492, -0x000000710116a444,ActorParam::loadActorPack,284, +0x000000710116a444,ActorParam::loadActorPack,284,_ZN4ksys3act13ActorParamMgr13loadActorPackEPNS_3res6HandleERKN4sead14SafeStringBaseIcEEj 0x000000710116a560,sub_710116A560,224, 0x000000710116a640,sub_710116A640,548, 0x000000710116a864,ActorParam::__auto0,144, @@ -91040,10 +91040,10 @@ 0x000000710117ee58,sub_710117EE58,1876, 0x000000710117f5ac,sub_710117F5AC,376, 0x000000710117f724,sub_710117F724,8, -0x000000710117f72c,ActorParam::getBgparamlist,36, +0x000000710117f72c,ActorParam::getBgparamlist,36,_ZNK4ksys3act13ActorParamMgr18getDummyGParamListEv 0x000000710117f750,getAglXml,12, 0x000000710117f75c,sub_710117F75C,12, -0x000000710117f768,ActorParam::Res2Array::ctor,244, +0x000000710117f768,ActorParam::Res2Array::ctor,244,_ZN4sead9SafeArrayIN4ksys3res6HandleELi28EEC2Ev 0x000000710117f85c,sub_710117F85C,272, 0x000000710117f96c,sub_710117F96C,280, 0x000000710117fa84,sub_710117FA84,132, diff --git a/expected/_ZNK4ksys3act13ActorParamMgr8getParamEPKcPPNS0_10ActorParamE.bin b/expected/_ZNK4ksys3act13ActorParamMgr8getParamEPKcPPNS0_10ActorParamE.bin new file mode 100644 index 00000000..aac14537 Binary files /dev/null and b/expected/_ZNK4ksys3act13ActorParamMgr8getParamEPKcPPNS0_10ActorParamE.bin differ diff --git a/src/KingSystem/ActorSystem/actActorParamMgr.cpp b/src/KingSystem/ActorSystem/actActorParamMgr.cpp index f4b3d5cb..82fa697e 100644 --- a/src/KingSystem/ActorSystem/actActorParamMgr.cpp +++ b/src/KingSystem/ActorSystem/actActorParamMgr.cpp @@ -1,5 +1,9 @@ #include "KingSystem/ActorSystem/actActorParamMgr.h" +#include #include "KingSystem/ActorSystem/actASSetting.h" +#include "KingSystem/ActorSystem/actActorParam.h" +#include "KingSystem/Resource/resLoadRequest.h" +#include "KingSystem/Resource/resResourceGParamList.h" namespace ksys::act { @@ -11,4 +15,75 @@ ActorParamMgr::~ActorParamMgr() { ASSetting::deleteInstance(); } +// NON_MATCHING: addressing mode +ActorParam* ActorParamMgr::getParam(const char* actor_name, ActorParam** out_free_param) const { + auto lock = sead::makeScopedLock(mCS); + for (s32 i = 0; i < NumParams; ++i) { + auto* param = &mParams[i]; + if (param->getActorName().isEmpty()) { + if (out_free_param && !*out_free_param) + *out_free_param = param; + } else if (param->getActorName() == actor_name) { + return param; + } + } + return nullptr; +} + +ActorParam* ActorParamMgr::loadParam(const char* actor_name, res::Handle* handle, void* x, + u32 load_req_c) { + ActorParam* param; + bool existing = false; + + { + auto lock = sead::makeScopedLock(mCS); + + ActorParam* free_param = nullptr; + param = getParam(actor_name, &free_param); + + if (param) { + existing = true; + } else { + param = free_param; + if (free_param) + free_param->mRes = {}; + else + param = &mParams[NumParams - 1]; + + param->mActorName = actor_name; + } + param->incrementRef(); + } + + if (!existing) { + loadFiles(param, mTmpActorParamMgrHeap, handle, x, load_req_c); + param->setEventSignal(); + } else { + param->waitForEvent(); + } + + return param; +} + +bool ActorParamMgr::loadActorPack(res::Handle* handle, const sead::SafeString& actor_name, + u32 load_req_c) { + sead::FixedSafeString<128> path; + res::LoadRequest req; + + if (mFlags.isOn(Flag::_5)) + return false; + + path.format("Actor/Pack/%s.bactorpack", actor_name.cstr()); + req.mRequester = actor_name; + req._c = load_req_c; + req._8 = true; + req._28 = false; + return handle->requestLoad(path, &req); +} + +res::GParamList* ActorParamMgr::getDummyGParamList() const { + return static_cast( + mResHandles[u32(ActorParam::ResourceType::GParamList)].getResourceUnchecked()); +} + } // namespace ksys::act diff --git a/src/KingSystem/ActorSystem/actActorParamMgr.h b/src/KingSystem/ActorSystem/actActorParamMgr.h index 4ec7ee52..accb3457 100644 --- a/src/KingSystem/ActorSystem/actActorParamMgr.h +++ b/src/KingSystem/ActorSystem/actActorParamMgr.h @@ -3,6 +3,8 @@ #include #include #include +#include +#include #include #include "KingSystem/Resource/resHandle.h" #include "KingSystem/System/DebugMessage.h" @@ -29,16 +31,32 @@ public: const char* getName() const override { return "AglXml"; } void syncData(const char* data) override; - void init(sead::Heap* heap, sead::Heap* debug_heap); - - res::GParamList* getDummyGParamList() const; - DebugMessage& getDebugMessage() { return mDebugMessage; } sead::Heap* getDebugHeap() const { return mDebugHeap; } sead::Heap* getTmpActorParamMgrHeap() const { return mTmpActorParamMgrHeap; } + void init(sead::Heap* heap, sead::Heap* debug_heap); + + ActorParam* getParam(const char* actor_name, ActorParam** out_free_param) const; + ActorParam* loadParam(const char* actor_name, res::Handle* handle, void* x, u32 load_req_c); + + res::GParamList* getDummyGParamList() const; + private: - u8 mFlags{}; + enum class Flag : u8 { + _1 = 1, + _2 = 2, + _4 = 4, + _5 = _1 | _4, + }; + + void loadFiles(ActorParam* param, sead::Heap* heap, res::Handle* handle, void* x, + u32 load_req_c); + bool loadActorPack(res::Handle* handle, const sead::SafeString& actor_name, u32 load_req_c); + + static constexpr s32 NumParams = 0x400; + + sead::TypedBitFlag mFlags{}; ActorParam* mParams = nullptr; DebugMessage mDebugMessage{"アクタパラメータ"}; void* _e0 = nullptr; @@ -46,7 +64,7 @@ private: sead::Heap* mDebugHeap = nullptr; sead::Heap* mTmpActorParamMgrHeap = nullptr; sead::SafeArray mResHandles; - sead::CriticalSection mCS; + mutable sead::CriticalSection mCS; }; KSYS_CHECK_SIZE_NX150(ActorParamMgr, 0xa00);