From b11344bc5eab061a8ad23d4692dc73bb9d888be5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Sun, 6 Dec 2020 12:12:39 +0100 Subject: [PATCH] ksys/act: Finish ParamPack --- data/uking_functions.csv | 18 ++++---- src/KingSystem/ActorSystem/actAiClassDef.h | 2 +- src/KingSystem/ActorSystem/actAiParam.cpp | 52 ++++++++++++++++++++++ src/KingSystem/ActorSystem/actAiParam.h | 18 ++++++++ 4 files changed, 80 insertions(+), 10 deletions(-) diff --git a/data/uking_functions.csv b/data/uking_functions.csv index b4d26c20..7a15f081 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -505,7 +505,7 @@ 0x0000007100012610,_ZNK4sead14SafeStringBaseIcE9findIndexERKS1_,468,_ZNK4sead14SafeStringBaseIcE9findIndexERKS1_ 0x00000071000127e4,_ZN4sead18Matrix34CalcCommonIfE7inverseERNS_9BaseMtx34IfEERKS3_,336, 0x0000007100012934,j__ZdlPv_7,4, -0x0000007100012938,_ZN4sead19FixedSafeStringBaseIcLi80EEaSERKNS_14SafeStringBaseIcEE,240, +0x0000007100012938,xxxx,240, 0x0000007100012a28,sub_7100012A28,600, 0x0000007100012c80,Enemy::construct,68, 0x0000007100012cc4,sub_7100012CC4,44, @@ -46393,8 +46393,8 @@ 0x00000071007219e8,Message3DText::set,308, 0x0000007100721b1c,sub_7100721B1C,300, 0x0000007100721c48,sub_7100721C48,168, -0x0000007100721cf0,j__ZdlPv_313,4, -0x0000007100721cf4,_ZN4sead15FixedSafeStringILi8EEaSERKNS_14SafeStringBaseIcEE,240, +0x0000007100721cf0,j__ZdlPv_313,4,_ZN4sead15FixedSafeStringILi80EED0Ev +0x0000007100721cf4,_ZN4sead15FixedSafeStringILi80EEaSERKNS_14SafeStringBaseIcEE,240,_ZN4sead15FixedSafeStringILi80EEaSERKNS_14SafeStringBaseIcEE 0x0000007100721de4,sub_7100721DE4,156, 0x0000007100721e80,sub_7100721E80,124, 0x0000007100721f54,sub_7100721F54,96, @@ -73056,7 +73056,7 @@ 0x0000007100d17484,sub_7100D17484,336, 0x0000007100d175d4,ai::ParamPack::ctor,8,_ZN4ksys3act2ai9ParamPackC1Ev 0x0000007100d175dc,ai::ParamPack::dtor,152,_ZN4ksys3act2ai9ParamPackD1Ev -0x0000007100d17674,ai::ParamPack::x,184, +0x0000007100d17674,ai::ParamPack::x,184,_ZN4ksys3act2ai9ParamPack4loadERKNS0_5ActorERKNS1_18ParamNameTypePairsEiPN4sead4HeapE 0x0000007100d1772c,ai::ParamPack::getAITreeVariablePointer,116,_ZNK4ksys3act2ai9ParamPack24getAITreeVariablePointerERKN4sead14SafeStringBaseIcEENS_14AIDefParamTypeEb 0x0000007100d177a0,ai::ParamPack::loadFromInlineParamPack,1132,_ZN4ksys3act2ai9ParamPack4copyEPNS1_15InlineParamPackEb 0x0000007100d17c0c,ai::InlineParamPack::addInt,116,_ZN4ksys3act2ai15InlineParamPack6addIntEiRKN4sead14SafeStringBaseIcEEi @@ -73065,8 +73065,8 @@ 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, +0x0000007100d17f14,sub_7100D17F14,112,_ZN4ksys3act2ai9ParamPack8getPairsEPNS1_18ParamNameTypePairsEb +0x0000007100d17f84,sub_7100D17F84,432,_ZN4ksys3act2ai18ParamNameTypePairs7addPairENS_14AIDefParamTypeERKN4sead14SafeStringBaseIcEEb 0x0000007100d18134,ai::ParamPack::getString,160,_ZNK4ksys3act2ai9ParamPack9getStringEPN4sead14SafeStringBaseIcEERKS5_ 0x0000007100d181d4,ai::ParamPack::getString_0,316,_ZNK4ksys3act2ai9ParamPack9setStringERKN4sead14SafeStringBaseIcEES7_ 0x0000007100d18310,ai::ParamPack::getBaseProcLink_0,120,_ZNK4ksys3act2ai9ParamPack8getActorEPNS0_8BaseProcERKN4sead14SafeStringBaseIcEE @@ -73075,8 +73075,8 @@ 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, +0x0000007100d18edc,j__ZdlPv_839,4,_ZN4sead19FixedSafeStringBaseIcLi80EED0Ev +0x0000007100d18ee0,_ZN4sead19FixedSafeStringBaseIcLi80EEaSERKNS_14SafeStringBaseIcEE,240,_ZN4sead19FixedSafeStringBaseIcLi80EEaSERKNS_14SafeStringBaseIcEE 0x0000007100d18fd0,ActorQuestLink::ctor,424, 0x0000007100d19178,ActorQuestLink::allocRes,76, 0x0000007100d191c4,sub_7100D191C4,76, @@ -87922,7 +87922,7 @@ 0x0000007101097f6c,sub_7101097F6C,40,_ZThn664_N4ksys3res11DamageParamD0Ev 0x0000007101097f94,getDamageRateTypes,428,_ZN4ksys3res11DamageParam12DamageSource5text_Ei? 0x0000007101098140,j__ZdlPv_1173,4,_ZN4sead15FixedSafeStringILi75EED0Ev -0x0000007101098144,_ZN4sead15FixedSafeStringILi80EEaSERKNS_14SafeStringBaseIcEE,240,_ZN4sead15FixedSafeStringILi75EEaSERKNS_14SafeStringBaseIcEE +0x0000007101098144,_ZN4sead15FixedSafeStringILi75EEaSERKNS_14SafeStringBaseIcEE,240,_ZN4sead15FixedSafeStringILi75EEaSERKNS_14SafeStringBaseIcEE 0x0000007101098234,j__ZdlPv_1174,4,_ZN4sead19FixedSafeStringBaseIcLi75EED0Ev 0x0000007101098238,_ZN4sead15FixedSafeStringILi165EEaSERKNS_14SafeStringBaseIcEE,240,_ZN4sead19FixedSafeStringBaseIcLi75EEaSERKNS_14SafeStringBaseIcEE 0x0000007101098328,getDamageReactionTypes,428,_ZN4ksys3res11DamageParam10DamageSize5text_Ei? diff --git a/src/KingSystem/ActorSystem/actAiClassDef.h b/src/KingSystem/ActorSystem/actAiClassDef.h index 127da9a6..2d5756b1 100644 --- a/src/KingSystem/ActorSystem/actAiClassDef.h +++ b/src/KingSystem/ActorSystem/actAiClassDef.h @@ -65,7 +65,7 @@ enum class CalcTiming { struct AIDef { union Value { Value() {} - u8 raw[16]; + std::array raw; const char* str; s32 i; f32 f; diff --git a/src/KingSystem/ActorSystem/actAiParam.cpp b/src/KingSystem/ActorSystem/actAiParam.cpp index 3be0d6e2..591cc65d 100644 --- a/src/KingSystem/ActorSystem/actAiParam.cpp +++ b/src/KingSystem/ActorSystem/actAiParam.cpp @@ -54,6 +54,30 @@ ParamPack::~ParamPack() { } } +bool ParamPack::load(const Actor& actor, const ParamNameTypePairs& pairs, s32 count, + sead::Heap* heap) { + AIDef def; + def.no_stop = false; + def.trigger_action = false; + def.dynamic_param_child = false; + def._24b = false; + def.num_params = 0; + def.calc_timing = CalcTiming::AIAfter; + + for (s32 i = 0; i < pairs.count; ++i) { + const auto& pair = pairs.pairs[i]; + if (pair.use_count < count) { + def.param_names[def.num_params] = pair.name; + def.param_types[def.num_params] = pair.type; + def.param_values[def.num_params].vec3 = {0, 0, 0}; + def.param_values[def.num_params].variable_ptr = nullptr; + ++def.num_params; + } + } + + return load(actor, def, heap, AIDefInstParamKind::Dynamic); +} + void* ParamPack::getAITreeVariablePointer(const sead::SafeString& key, AIDefParamType type, bool x) const { return getVariable(key, type, x); @@ -172,6 +196,34 @@ void InlineParamPack::addMesTransceiverId(const mes::TransceiverId& value, param.type = AIDefParamType::MesTransceiverId; } +void ParamPack::getPairs(ParamNameTypePairs* pairs, bool update_use_count) { + for (auto* param = mParams; param; param = param->next) { + if (param->data) + pairs->addPair(param->type, param->name, update_use_count); + } +} + +void ParamNameTypePairs::addPair(AIDefParamType type, const sead::SafeString& name, + bool update_use_count) { + for (s32 i = 0; i < count; ++i) { + auto& pair = pairs[i]; + if (pair.type == type && name == pair.name) { + if (update_use_count) + ++pair.use_count; + return; + } + } + + if (count >= pairs.size()) + return; + + auto& pair = pairs[count]; + pair.type = type; + pair.name = name.cstr(); + pair.use_count = 1; + ++count; +} + bool ParamPack::getString(sead::SafeString* value, const sead::SafeString& key) const { auto* str = getVariable(key, AIDefParamType::String, false); if (!str) diff --git a/src/KingSystem/ActorSystem/actAiParam.h b/src/KingSystem/ActorSystem/actAiParam.h index b008b325..8faaa69d 100644 --- a/src/KingSystem/ActorSystem/actAiParam.h +++ b/src/KingSystem/ActorSystem/actAiParam.h @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -24,6 +25,21 @@ namespace act::ai { struct InlineParamPack; +struct ParamNameType { + const char* name; + AIDefParamType type; + s32 use_count; +}; +KSYS_CHECK_SIZE_NX150(ParamNameType, 0x10); + +struct ParamNameTypePairs { + void addPair(AIDefParamType type, const sead::SafeString& name, bool update_use_count); + + sead::SafeArray pairs; + s32 count; +}; +KSYS_CHECK_SIZE_NX150(ParamNameTypePairs, 0x208); + struct Param { Param* next; u32 hash; @@ -63,8 +79,10 @@ public: *variable = val; } + bool load(const Actor& actor, const ParamNameTypePairs& pairs, s32 count, sead::Heap* heap); void* getAITreeVariablePointer(const sead::SafeString& key, AIDefParamType type, bool x) const; void copy(InlineParamPack* dest, bool x); + void getPairs(ParamNameTypePairs* pairs, bool update_use_count); bool getString(sead::SafeString* value, const sead::SafeString& key) const; bool setString(const sead::SafeString& value, const sead::SafeString& key) const;