From aa92bf882c41b292a9ee11b6ec5ba8593b4b4fc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Sun, 8 Nov 2020 13:55:12 +0100 Subject: [PATCH] ksys/act: Implement more ActorParam functions --- data/uking_functions.csv | 21 +++--- src/KingSystem/ActorSystem/actActorParam.cpp | 78 +++++++++++++++++++- src/KingSystem/ActorSystem/actActorParam.h | 76 +++++++++++-------- src/KingSystem/Utils/ParamIO.h | 10 ++- 4 files changed, 143 insertions(+), 42 deletions(-) diff --git a/data/uking_functions.csv b/data/uking_functions.csv index fefe37e3..6c5f1e74 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -86787,6 +86787,7 @@ 0x00000071010c0c3c,Event::waitTimed,32,_ZN4ksys4util5Event4waitEN4sead8TickSpanE 0x00000071010c0c5c,Event::setSignal,52,_ZN4ksys4util5Event9setSignalEv 0x00000071010c0c90,Event::resetSignal,64,_ZN4ksys4util5Event11resetSignalEv +0x00000071010c0cd0,Event::isSignalSet,16,_ZNK4ksys4util5Event11isSignalSetEv 0x00000071010c0ce0,sub_71010C0CE0,32, 0x00000071010c0d00,ThreadD0Base::ctor,96,_ZN4ksys4util13TaskQueueBaseC1EPN4sead4HeapE 0x00000071010c0d60,sub_71010C0D60,136,_ZN4ksys4util13TaskQueueBaseD1Ev @@ -89053,17 +89054,17 @@ 0x0000007101185a78,sub_7101185A78,68,_ZN4ksys3act10ActorParamD0Ev 0x0000007101185abc,ActorParam::Load::deleteRes2,164,_ZN4ksys3act10ActorParam16deleteResHandlesEv 0x0000007101185b60,ActorParam::Load::isDummyParamResource,136,_ZNK4ksys3act10ActorParam12isDummyParamENS_3res9ActorLink5Users4UserE -0x0000007101185be8,ActorParam::Load::constructRes2,188, -0x0000007101185ca4,ActorParam::Event::incRefCount,72, -0x0000007101185cec,ActorParam::Data::unload,124, -0x0000007101185d68,ActorParam::Event::setSignal,8, -0x0000007101185d70,ActorParam::Event::wait,8, -0x0000007101185d78,sub_7101185D78,8, +0x0000007101185be8,ActorParam::Load::constructRes2,188,_ZN4ksys3act10ActorParam15allocResHandlesEPN4sead4HeapEji +0x0000007101185ca4,ActorParam::Event::incRefCount,72,_ZN4ksys3act10ActorParam12incrementRefEv +0x0000007101185cec,ActorParam::Data::unload,124,_ZN4ksys3act10ActorParam12decrementRefEv +0x0000007101185d68,ActorParam::Event::setSignal,8,_ZN4ksys3act10ActorParam14setEventSignalEv +0x0000007101185d70,ActorParam::Event::wait,8,_ZN4ksys3act10ActorParam12waitForEventEv +0x0000007101185d78,sub_7101185D78,8,_ZNK4ksys3act10ActorParam11isSignalSetEv 0x0000007101185d80,sub_7101185D80,684, -0x000000710118602c,ActorParam::Load::x,52, -0x0000007101186060,sub_7101186060,24, -0x0000007101186078,ActorParam::Load::setResourcePointer,28, -0x0000007101186094,ActorParam::Load::loadPriority,472, +0x000000710118602c,ActorParam::Load::x,52,_ZN4ksys3act10ActorParam11allocHandleEv +0x0000007101186060,sub_7101186060,24,_ZN4ksys3act10ActorParam14freeLastHandleEv +0x0000007101186078,ActorParam::Load::setResourcePointer,28,_ZN4ksys3act10ActorParam11setResourceENS1_12ResourceTypeEPNS_7ParamIOE +0x0000007101186094,ActorParam::Load::loadPriority,472,_ZN4ksys3act10ActorParam11setPriorityERKN4sead14SafeStringBaseIcEE 0x000000710118626c,ActorParam::Load::checkClassAndPriority,424, 0x0000007101186414,nullsub_4613,4, 0x0000007101186418,nullsub_4614,4,_ZN4ksys3res10GParamList9doCreate_EPhjPN4sead4HeapE diff --git a/src/KingSystem/ActorSystem/actActorParam.cpp b/src/KingSystem/ActorSystem/actActorParam.cpp index bfe08fed..bcc3a045 100644 --- a/src/KingSystem/ActorSystem/actActorParam.cpp +++ b/src/KingSystem/ActorSystem/actActorParam.cpp @@ -1,4 +1,5 @@ #include "KingSystem/ActorSystem/actActorParam.h" +#include #include namespace ksys::act { @@ -34,7 +35,7 @@ void ActorParam::deleteData() { deleteResHandles(); mActorName = ""; - _168 = 0; + mRefCount = 0; _a = 0; mRes = {}; mEvent.resetSignal(); @@ -49,4 +50,79 @@ bool ActorParam::isDummyParam(res::ActorLink::Users::User user) const { return mRes.mActorLink->getUsers().getUserName(user) == "Dummy"; } +void ActorParam::allocResHandles(sead::Heap* heap, u32 buffer_idx, s32 count) { + SEAD_ASSERT(buffer_idx == 0 || buffer_idx == 1); + mHandles[buffer_idx].allocBufferAssert(count, heap); + mNumHandles[buffer_idx] = 0; +} + +s32 ActorParam::incrementRef() { + auto lock = sead::makeScopedLock(mCS); + return ++mRefCount; +} + +s32 ActorParam::decrementRef() { + auto lock = sead::makeScopedLock(mCS); + + if (mActorName.isEmpty()) + return 0; + + if (--mRefCount == 0) + deleteData(); + + return mRefCount; +} + +void ActorParam::setEventSignal() { + mEvent.setSignal(); +} + +void ActorParam::waitForEvent() { + mEvent.wait(); +} + +bool ActorParam::isSignalSet() const { + return mEvent.isSignalSet(); +} + +res::Handle* ActorParam::allocHandle() { + const auto idx = mNumHandles[mActiveBufferIdx]; + ++mNumHandles[mActiveBufferIdx]; + return &mHandles[mActiveBufferIdx][idx]; +} + +void ActorParam::freeLastHandle() { + --mNumHandles[mActiveBufferIdx]; +} + +void ActorParam::setResource(ResourceType type, ParamIO* param_io) { + const auto idx = u32(type); + mRes.mArray[idx] = param_io; + param_io->setIndex(idx); +} + +bool ActorParam::setPriority(const sead::SafeString& priority) { + if (priority == "PlayerBefore") { + mPriority = Priority::PlayerBefore; + return true; + } + + if (priority == "Player") { + mPriority = Priority::Player; + return true; + } + + if (priority == "PlayerAfter") { + mPriority = Priority::PlayerAfter; + return true; + } + + if (priority == "AllAfter") { + mPriority = Priority::AllAfter; + return true; + } + + return false; +} + } // namespace ksys::act diff --git a/src/KingSystem/ActorSystem/actActorParam.h b/src/KingSystem/ActorSystem/actActorParam.h index c0d7346c..8726f0d5 100644 --- a/src/KingSystem/ActorSystem/actActorParam.h +++ b/src/KingSystem/ActorSystem/actActorParam.h @@ -71,32 +71,35 @@ public: AnimationInfo = 24, }; - struct Resources { - res::ActorLink* mActorLink; - res::ModelList* mModelList; - res::ASList* mASList; - res::AIProgram* mAIProgram; - res::GParamList* mGParamList; - res::Physics* mPhysics; - res::Chemical* mChemical; - res::AttClientList* mAttClientList; - res::AISchedule* mAISchedule; - res::EventFlow* mEventFlow; - res::DamageParam* mDamageParam; - res::RagdollConfigList* mRagdollConfigList; - res::RagdollBlendWeight* mRagdollBlendWeight; - res::Awareness* mAwareness; - void* mResource14; - void* mResource15; - void* mResource16; - res::Drop* mDropTable; - res::Shop* mShopData; - res::Recipe* mRecipe; - res::Lod* mLod; - res::BoneControl* mBoneControl; - res::LifeCondition* mLifeCondition; - res::UMii* mUMii; - res::AnimationInfo* mAnimationInfo; + union Resources { + struct { + res::ActorLink* mActorLink; + res::ModelList* mModelList; + res::ASList* mASList; + res::AIProgram* mAIProgram; + res::GParamList* mGParamList; + res::Physics* mPhysics; + res::Chemical* mChemical; + res::AttClientList* mAttClientList; + res::AISchedule* mAISchedule; + res::EventFlow* mEventFlow; + res::DamageParam* mDamageParam; + res::RagdollConfigList* mRagdollConfigList; + res::RagdollBlendWeight* mRagdollBlendWeight; + res::Awareness* mAwareness; + void* mResource14; + void* mResource15; + void* mResource16; + res::Drop* mDropTable; + res::Shop* mShopData; + res::Recipe* mRecipe; + res::Lod* mLod; + res::BoneControl* mBoneControl; + res::LifeCondition* mLifeCondition; + res::UMii* mUMii; + res::AnimationInfo* mAnimationInfo; + }; + sead::SafeArray mArray; }; KSYS_CHECK_SIZE_NX150(Resources, 0xc8); @@ -107,7 +110,6 @@ public: const sead::SafeString& getProfile() const { return mProfile; } const char* getClassName() const { return mClassName; } Priority getPriority() const { return mPriority; } - u32 get74() const { return _74; } const Resources& getRes() const { return mRes; } bool isDummyParam(res::ActorLink::Users::User user) const; @@ -122,17 +124,33 @@ private: void deleteData(); void deleteResHandles(); + void allocResHandles(sead::Heap* heap, u32 buffer_idx, s32 count); + + s32 incrementRef(); + s32 decrementRef(); + + void setEventSignal(); + void waitForEvent(); + bool isSignalSet() const; + void updateResource(const char* name, const char* data, const char* data1); + + res::Handle* allocHandle(); + void freeLastHandle(); + + void setResource(ResourceType type, ParamIO* param_io); + bool setPriority(const sead::SafeString& priority); + u16 _8 = 0; u8 _a = 0; sead::FixedSafeString<64> mActorName; sead::SafeString mProfile; const char* mClassName{}; Priority mPriority = Priority::AllAfter; - u32 _74 = 2; + u32 mActiveBufferIdx = 2; Resources mRes; std::array, 2> mHandles; std::array mNumHandles; - u32 _168{}; + s32 mRefCount{}; sead::CriticalSection mCS{nullptr}; util::Event mEvent{nullptr, sead::IDisposer::HeapNullOption::DoNotAppendDisposerIfNoHeapSpecified, true}; diff --git a/src/KingSystem/Utils/ParamIO.h b/src/KingSystem/Utils/ParamIO.h index 29907c37..58f14e55 100644 --- a/src/KingSystem/Utils/ParamIO.h +++ b/src/KingSystem/Utils/ParamIO.h @@ -13,9 +13,15 @@ public: virtual bool ParamIO_m0() { return false; } + bool applyResourceUpdate(const char* data, const char* data1); + + u32 getIdx() const { return mIdx; } + const sead::SafeString& getId() const { return mId; } + void setIndex(u32 idx) { mIdx = idx; } + protected: - u32 _1d8 = 0x1c; - sead::FixedSafeString<128> _1e0; + u32 mIdx = 0x1c; + sead::FixedSafeString<128> mId; }; KSYS_CHECK_SIZE_NX150(ParamIO, 0x278);