ksys/act: Implement more ActorParam functions

This commit is contained in:
Léo Lam
2020-11-08 13:55:12 +01:00
parent 23ec19806c
commit aa92bf882c
4 changed files with 143 additions and 42 deletions
+77 -1
View File
@@ -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
+47 -29
View File
@@ -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};
+8 -2
View File
@@ -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);