diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/KingSystem/ActorSystem/actActorParam.cpp | 78 | ||||
| -rw-r--r-- | src/KingSystem/ActorSystem/actActorParam.h | 76 | ||||
| -rw-r--r-- | src/KingSystem/Utils/ParamIO.h | 10 |
3 files changed, 132 insertions, 32 deletions
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 <basis/seadRawPrint.h> #include <prim/seadScopedLock.h> 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<void*, 25> 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<sead::Buffer<res::Handle>, 2> mHandles; std::array<s32, 2> 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); |
