summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/KingSystem/ActorSystem/actActorParam.cpp78
-rw-r--r--src/KingSystem/ActorSystem/actActorParam.h76
-rw-r--r--src/KingSystem/Utils/ParamIO.h10
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);