diff --git a/data/uking_functions.csv b/data/uking_functions.csv index f6229949..8fa78cba 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -73057,23 +73057,23 @@ 0x0000007100d175d4,ai::ParamPack::ctor,8,_ZN4ksys3act2ai9ParamPackC1Ev 0x0000007100d175dc,ai::ParamPack::dtor,152,_ZN4ksys3act2ai9ParamPackD1Ev 0x0000007100d17674,ai::ParamPack::x,184, -0x0000007100d1772c,ai::ParamPack::getAITreeVariablePointer,116, +0x0000007100d1772c,ai::ParamPack::getAITreeVariablePointer,116,_ZNK4ksys3act2ai9ParamPack24getAITreeVariablePointerERKN4sead14SafeStringBaseIcEENS_14AIDefParamTypeEb 0x0000007100d177a0,ai::ParamPack::loadFromInlineParamPack,1132, -0x0000007100d17c0c,ai::InlineParamPack::addInt,116, -0x0000007100d17c80,ai::InlineParamPack::addFloat,116, -0x0000007100d17cf4,ai::InlineParamPack::addFloatArray,144, -0x0000007100d17d84,ai::InlineParamPack::addBool,116, -0x0000007100d17df8,ai::InlineParamPack::addActor,132, -0x0000007100d17e7c,ai::InlineParamPack::addMesTransceiverId,152, +0x0000007100d17c0c,ai::InlineParamPack::addInt,116,_ZN4ksys3act2ai15InlineParamPack6addIntEiRKN4sead14SafeStringBaseIcEEi +0x0000007100d17c80,ai::InlineParamPack::addFloat,116,_ZN4ksys3act2ai15InlineParamPack8addFloatEfRKN4sead14SafeStringBaseIcEEi +0x0000007100d17cf4,ai::InlineParamPack::addFloatArray,144,_ZN4ksys3act2ai15InlineParamPack7addVec3ERKN4sead7Vector3IfEERKNS3_14SafeStringBaseIcEEi +0x0000007100d17d84,ai::InlineParamPack::addBool,116,_ZN4ksys3act2ai15InlineParamPack7addBoolEbRKN4sead14SafeStringBaseIcEEi +0x0000007100d17df8,ai::InlineParamPack::addActor,132,_ZN4ksys3act2ai15InlineParamPack8addActorERKNS0_12BaseProcLinkERKN4sead14SafeStringBaseIcEEi +0x0000007100d17e7c,ai::InlineParamPack::addMesTransceiverId,152,_ZN4ksys3act2ai15InlineParamPack19addMesTransceiverIdERKNS_3mes13TransceiverIdERKN4sead14SafeStringBaseIcEEi 0x0000007100d17f14,sub_7100D17F14,112, 0x0000007100d17f84,sub_7100D17F84,432, -0x0000007100d18134,ai::ParamPack::getString,160, -0x0000007100d181d4,ai::ParamPack::getString_0,316, -0x0000007100d18310,ai::ParamPack::getBaseProcLink_0,120, -0x0000007100d18388,ai::ParamPack::getBaseProcLink,116, +0x0000007100d18134,ai::ParamPack::getString,160,_ZNK4ksys3act2ai9ParamPack9getStringEPN4sead14SafeStringBaseIcEERKS5_ +0x0000007100d181d4,ai::ParamPack::getString_0,316,_ZNK4ksys3act2ai9ParamPack9setStringERKN4sead14SafeStringBaseIcEES7_ +0x0000007100d18310,ai::ParamPack::getBaseProcLink_0,120,_ZNK4ksys3act2ai9ParamPack8getActorEPNS0_8BaseProcERKN4sead14SafeStringBaseIcEE +0x0000007100d18388,ai::ParamPack::getBaseProcLink,116,_ZNK4ksys3act2ai9ParamPack8setActorERKNS0_12BaseProcLinkERKN4sead14SafeStringBaseIcEE 0x0000007100d183fc,ai::ParamPack::allocAndLoadParams,1312, -0x0000007100d1891c,ai::InlineParamPack::addString,132, -0x0000007100d189a0,sub_7100D189A0,136, +0x0000007100d1891c,ai::InlineParamPack::addString,132,_ZN4ksys3act2ai15InlineParamPack10addPointerEPvRKN4sead14SafeStringBaseIcEENS_14AIDefParamTypeEi +0x0000007100d189a0,sub_7100D189A0,136,_ZN4ksys3act2ai15InlineParamPack12acquireActorEPNS0_8BaseProcERKN4sead14SafeStringBaseIcEEi 0x0000007100d18a28,ai::InlineParamPack::copyToParamPack,1204,_ZNK4ksys3act2ai15InlineParamPack15copyToParamPackERNS1_9ParamPackE 0x0000007100d18edc,j__ZdlPv_839,4, 0x0000007100d18ee0,_ZN4sead19FixedSafeStringBaseIcLi5EEaSERKNS_14SafeStringBaseIcEE,240, diff --git a/src/KingSystem/ActorSystem/actAiParam.cpp b/src/KingSystem/ActorSystem/actAiParam.cpp index 094cd362..a5f1ba97 100644 --- a/src/KingSystem/ActorSystem/actAiParam.cpp +++ b/src/KingSystem/ActorSystem/actAiParam.cpp @@ -53,6 +53,101 @@ ParamPack::~ParamPack() { } } +void* ParamPack::getAITreeVariablePointer(const sead::SafeString& key, AIDefParamType type, + bool x) const { + return getVariable(key, type, x); +} + +void InlineParamPack::addInt(s32 value, const sead::SafeString& key, s32 idx) { + auto& param = getParam(idx); + param.key = key.cstr(); + param.i = value; + param.type = AIDefParamType::Int; +} + +void InlineParamPack::addFloat(f32 value, const sead::SafeString& key, s32 idx) { + auto& param = getParam(idx); + param.key = key.cstr(); + param.f = value; + param.type = AIDefParamType::Float; +} + +void InlineParamPack::addVec3(const sead::Vector3f& value, const sead::SafeString& key, s32 idx) { + auto& param = getParam(idx); + param.key = key.cstr(); + param.vec3 = value; + param.type = AIDefParamType::Vec3; +} + +void InlineParamPack::addBool(bool value, const sead::SafeString& key, s32 idx) { + auto& param = getParam(idx); + param.key = key.cstr(); + param.b = value; + param.type = AIDefParamType::Bool; +} + +void InlineParamPack::addActor(const BaseProcLink& value, const sead::SafeString& key, s32 idx) { + auto& param = getParam(idx); + param.key = key.cstr(); + param.baseProcLink = value; + param.type = AIDefParamType::BaseProcLink; +} + +void InlineParamPack::addMesTransceiverId(const mes::TransceiverId& value, + const sead::SafeString& key, s32 idx) { + auto& param = getParam(idx); + param.key = key.cstr(); + param.mesTransceiverId = value; + param.type = AIDefParamType::MesTransceiverId; +} + +bool ParamPack::getString(sead::SafeString* value, const sead::SafeString& key) const { + auto* str = getVariable(key, AIDefParamType::String, false); + if (!str) + return false; + *value = str->cstr(); + return true; +} + +bool ParamPack::setString(const sead::SafeString& value, const sead::SafeString& key) const { + auto* str = getVariable(key, AIDefParamType::String); + if (!str) + return false; + str->copy(value); + return true; +} + +bool ParamPack::getActor(BaseProc* proc, const sead::SafeString& key) const { + auto* link = getVariable(key, AIDefParamType::BaseProcLink); + if (!link) + return false; + link->acquire(proc, false); + return true; +} + +bool ParamPack::setActor(const BaseProcLink& new_link, const sead::SafeString& key) const { + auto* link = getVariable(key, AIDefParamType::BaseProcLink); + if (!link) + return false; + *link = new_link; + return true; +} + +void InlineParamPack::addPointer(void* value, const sead::SafeString& key, AIDefParamType type, + s32 idx) { + auto& param = getParam(idx); + param.key = key.cstr(); + param.ptr = value; + param.type = type; +} + +void InlineParamPack::acquireActor(BaseProc* proc, const sead::SafeString& key, s32 idx) { + auto& param = getParam(idx); + param.key = key.cstr(); + param.baseProcLink.acquire(proc, false); + param.type = AIDefParamType::BaseProcLink; +} + void InlineParamPack::copyToParamPack(ParamPack& pack) const { const u32 n = count >= 0x1F ? 0x1F : count; const InlineParam* param = params; diff --git a/src/KingSystem/ActorSystem/actAiParam.h b/src/KingSystem/ActorSystem/actAiParam.h index 69fedc2b..4882f4dd 100644 --- a/src/KingSystem/ActorSystem/actAiParam.h +++ b/src/KingSystem/ActorSystem/actAiParam.h @@ -57,6 +57,14 @@ public: *variable = val; } + void* getAITreeVariablePointer(const sead::SafeString& key, AIDefParamType type, bool x) const; + + bool getString(sead::SafeString* value, const sead::SafeString& key) const; + bool setString(const sead::SafeString& value, const sead::SafeString& key) const; + + bool getActor(BaseProc* proc, const sead::SafeString& key) const; + bool setActor(const BaseProcLink& link, const sead::SafeString& key) const; + private: Param* mParams = nullptr; }; @@ -79,9 +87,29 @@ struct InlineParam { KSYS_CHECK_SIZE_NX150(InlineParam, 0x50); struct InlineParamPack { + InlineParam& getParam(s32 idx) { + if (idx < 0) { + idx = count; + if (count > NumParamsMax - 1) + idx = 0; + else + count = idx + 1; + } + return params[idx]; + } + + void addInt(s32 value, const sead::SafeString& key, s32 idx); + void addFloat(f32 value, const sead::SafeString& key, s32 idx); + void addVec3(const sead::Vector3f& value, const sead::SafeString& key, s32 idx); + void addBool(bool value, const sead::SafeString& key, s32 idx); + void addActor(const BaseProcLink& value, const sead::SafeString& key, s32 idx); + void addMesTransceiverId(const mes::TransceiverId& value, const sead::SafeString& key, s32 idx); + void addPointer(void* value, const sead::SafeString& key, AIDefParamType type, s32 idx); + void acquireActor(BaseProc* proc, const sead::SafeString& key, s32 idx); void copyToParamPack(ParamPack& pack) const; - InlineParam params[32]; + static constexpr s32 NumParamsMax = 32; + InlineParam params[NumParamsMax]; int count; }; KSYS_CHECK_SIZE_NX150(InlineParamPack, 0xA08);