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
No known key found for this signature in database
GPG Key ID: 0DF30F9081000741
4 changed files with 143 additions and 42 deletions

View File

@ -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

Can't render this file because it is too large.

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

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};

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);