From 930b780cd1513e1dd92bc114cde58adb552159a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Wed, 9 Dec 2020 18:32:25 +0100 Subject: [PATCH] ksys/act: Implement more Query functions --- data/uking_functions.csv | 26 ++++---- src/KingSystem/ActorSystem/actActor.h | 1 + src/KingSystem/ActorSystem/actAiParam.h | 3 +- src/KingSystem/ActorSystem/actAiQuery.cpp | 63 +++++++++++++++++++ src/KingSystem/ActorSystem/actAiQuery.h | 42 ++++++++++++- src/KingSystem/ActorSystem/actAiRoot.cpp | 8 +++ src/KingSystem/ActorSystem/actAiRoot.h | 3 + .../Resource/resResourceAIProgram.cpp | 17 +++++ .../Resource/resResourceAIProgram.h | 12 ++-- 9 files changed, 151 insertions(+), 24 deletions(-) diff --git a/data/uking_functions.csv b/data/uking_functions.csv index a6f7394e..5bb17e0d 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -40494,13 +40494,13 @@ 0x0000007100683ec0,AI_Query_BranchByDyeColor::doQuery,36, 0x0000007100683ee4,AI_Query_BranchByDyeColor::m10,4, 0x0000007100683ee8,AI_Query_BranchByDyeColor::loadParams,4, -0x0000007100683eec,AI_QueryBase::m8n,4,_ZN4ksys3act2ai5Query2m8Ev +0x0000007100683eec,AI_QueryBase::m8n,4,_ZN4ksys3act2ai5Query8preInit_Ev 0x0000007100683ef0,AI_Query_BranchByDyeColor::rtti1,204, 0x0000007100683fbc,AI_Query_BranchByDyeColor::rtti2,92, 0x0000007100684018,AI_QueryBase::m4r0,8,_ZN4ksys3act2ai5Query2m4Ev 0x0000007100684020,AI_QueryBase::m5r0,8,_ZN4ksys3act2ai5Query2m5Ev 0x0000007100684028,AI_QueryBase::m6n,4,_ZN4ksys3act2ai5Query2m6Ev -0x000000710068402c,AI_QueryBase::m7r1,8,_ZN4ksys3act2ai5Query2m7Ev +0x000000710068402c,AI_QueryBase::m7r1,8,_ZN4ksys3act2ai5Query5init_EPN4sead4HeapE 0x0000007100684034,AI_QueryBase::m11r1,8,_ZN4ksys3act2ai5Query3m11Ev 0x000000710068403c,AI_QueryBase::m12n,4,_ZN4ksys3act2ai5Query3m12Ev 0x0000007100684040,AI_QueryBase::rtti1,112,_ZNK4ksys3act2ai5Query27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE @@ -74048,13 +74048,13 @@ 0x0000007100d5a158,sub_7100D5A158,92, 0x0000007100d5a1b4,sub_7100D5A1B4,140,_ZNK4sead15RuntimeTypeInfo6DeriveINS_15SharcArchiveResEE9isDerivedEPKNS0_9InterfaceE 0x0000007100d5a240,AI_QueryBase::ctor,72,_ZN4ksys3act2ai5QueryC1ERKNS2_7InitArgE -0x0000007100d5a288,sub_7100D5A288,304, -0x0000007100d5a3b8,sub_7100D5A3B8,64, -0x0000007100d5a3f8,sub_7100D5A3F8,56, -0x0000007100d5a430,AI_QueryBase::getString_m8,108, -0x0000007100d5a49c,AI_QueryBase::getIntDynamic,84, -0x0000007100d5a4f0,sub_7100D5A4F0,80, -0x0000007100d5a540,sub_7100D5A540,80, +0x0000007100d5a288,sub_7100D5A288,304,_ZN4ksys3act2ai5Query4initEPN4sead4HeapE +0x0000007100d5a3b8,sub_7100D5A3B8,64,_ZNK4ksys3act2ai5Query7getNameEv +0x0000007100d5a3f8,sub_7100D5A3F8,56,_ZNK4ksys3act2ai5Query13getSInstParamEPPKfRKN4sead14SafeStringBaseIcEE +0x0000007100d5a430,AI_QueryBase::getString_m8,108,_ZNK4ksys3act2ai5Query13getDInstParamEPN4sead14SafeStringBaseIcEERKS5_ +0x0000007100d5a49c,AI_QueryBase::getIntDynamic,84,_ZNK4ksys3act2ai5Query13getDInstParamEPPKiRKN4sead14SafeStringBaseIcEE +0x0000007100d5a4f0,sub_7100D5A4F0,80,_ZNK4ksys3act2ai5Query13getDInstParamEPPKfRKN4sead14SafeStringBaseIcEE +0x0000007100d5a540,sub_7100D5A540,80,_ZNK4ksys3act2ai5Query13getDInstParamEPPKbRKN4sead14SafeStringBaseIcEE 0x0000007100d5a590,AI_QueryBase::getArgument_m10,196, 0x0000007100d5a654,sub_7100D5A654,184, 0x0000007100d5a70c,sub_7100D5A70C,184, @@ -74294,8 +74294,8 @@ 0x0000007100d64664,sub_7100D64664,40,_ZThn56_N4ksys3act2ai6RootAiD0Ev 0x0000007100d6468c,ai::ActorAI::createAiClass,996, 0x0000007100d64a70,ai::loadActorParamsIntoClassDef,592, -0x0000007100d64cc0,ai::ActorAI::loadMapUnitParams,36, -0x0000007100d64ce4,ai::ActorAI::loadAITreeParams,36, +0x0000007100d64cc0,ai::ActorAI::loadMapUnitParams,36,_ZN4ksys3act2ai6RootAi17loadMapUnitParamsERKNS_5AIDefEPN4sead4HeapE +0x0000007100d64ce4,ai::ActorAI::loadAITreeParams,36,_ZN4ksys3act2ai6RootAi16loadAITreeParamsERKNS_5AIDefEPN4sead4HeapE 0x0000007100d64d08,act::getExtraHeapSizeForParams,200, 0x0000007100d64dd0,ai::ActorAI::init,8, 0x0000007100d64dd8,ai::ActorAI::calcRecursively,240, @@ -91459,10 +91459,10 @@ 0x00000071011aa070,Aiprog::loadDefParameters,1556,_ZN4ksys3res9AIProgram14parseDefParamsEPNS1_10DefinitionEPvPN4sead4HeapERKN3agl3utl16ResParameterListEPtSD_ 0x00000071011aa684,sub_71011AA684,256,_ZN4ksys3res9AIProgram10Definition14addSInstParam_IN4sead14SafeStringBaseIcEEEEbiPKcPNS4_4HeapERKT_ 0x00000071011aa784,Aiprog::getActionsOrAIs,20,_ZNK4ksys3res9AIProgram15getActionsOrAIsENS1_12AIActionTypeE -0x00000071011aa798,sub_71011AA798,168, +0x00000071011aa798,sub_71011AA798,168,_ZNK4ksys3res9AIProgram13getSInstParamEPPKcRKNS1_10DefinitionERKN4sead14SafeStringBaseIcEE 0x00000071011aa840,Aiprog::x_2,208,_ZNK4ksys3res9AIProgram13getSInstParamEPN4sead14SafeStringBaseIcEERKNS1_10DefinitionERKS4_ 0x00000071011aa910,sub_71011AA910,156,_ZNK4ksys3res9AIProgram13getSInstParamEPPKiRKNS1_10DefinitionERKN4sead14SafeStringBaseIcEE? -0x00000071011aa9ac,sub_71011AA9AC,156, +0x00000071011aa9ac,sub_71011AA9AC,156,_ZNK4ksys3res9AIProgram13getSInstParamEPPKfRKNS1_10DefinitionERKN4sead14SafeStringBaseIcEE? 0x00000071011aaa48,Aiprog::x_3,156,_ZNK4ksys3res9AIProgram13getSInstParamEPPKN4sead7Vector3IfEERKNS1_10DefinitionERKNS2_14SafeStringBaseIcEE? 0x00000071011aaae4,sub_71011AAAE4,168,_ZNK4ksys3res9AIProgram13getSInstParamEPPKbRKNS1_10DefinitionERKN4sead14SafeStringBaseIcEE 0x00000071011aab8c,sub_71011AAB8C,8,_ZNK4ksys3res9AIProgram27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE diff --git a/src/KingSystem/ActorSystem/actActor.h b/src/KingSystem/ActorSystem/actActor.h index b910671a..c351e663 100644 --- a/src/KingSystem/ActorSystem/actActor.h +++ b/src/KingSystem/ActorSystem/actActor.h @@ -28,6 +28,7 @@ public: SEAD_RTTI_OVERRIDE(Actor, BaseProc) + ai::RootAi* getRootAi() const { return mRootAi; } const ActorParam* getParam() const { return mActorParam; } const map::MubinIter& getMapObjIter() const { return mMapObjIter; } diff --git a/src/KingSystem/ActorSystem/actAiParam.h b/src/KingSystem/ActorSystem/actAiParam.h index 0a19fca4..058e1262 100644 --- a/src/KingSystem/ActorSystem/actAiParam.h +++ b/src/KingSystem/ActorSystem/actAiParam.h @@ -80,7 +80,8 @@ public: } 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* getAITreeVariablePointer(const sead::SafeString& key, AIDefParamType type, + bool x = false) const; void copy(InlineParamPack* dest, bool x); void getPairs(ParamNameTypePairs* pairs, bool update_use_count) const; diff --git a/src/KingSystem/ActorSystem/actAiQuery.cpp b/src/KingSystem/ActorSystem/actAiQuery.cpp index ca97fc67..3ff02b07 100644 --- a/src/KingSystem/ActorSystem/actAiQuery.cpp +++ b/src/KingSystem/ActorSystem/actAiQuery.cpp @@ -1,10 +1,73 @@ #include "KingSystem/ActorSystem/actAiQuery.h" +#include "KingSystem/ActorSystem/actActorParam.h" #include "KingSystem/ActorSystem/actAiRoot.h" +#include "KingSystem/Resource/resResourceAIProgram.h" namespace ksys::act::ai { Query::Query(const InitArg& arg) : mActor(arg.actor), mDefIdx(arg.def_idx) {} +inline res::AIProgram* Query::getAIProg() const { + return mActor->getParam()->getRes().mAIProgram; +} + +bool Query::init(sead::Heap* heap) { + if (mDefIdx != -1) { + AIDefSet set; + set.dynamic_params.num_params = 0; + set.ai_tree_params.num_params = 0; + + auto* inst = AIClassDef::instance(); + const auto& query = getAIProg()->getQueries()[mDefIdx]; + inst->getDef(query.mClassName, &set, AIDefType::Query); + + if (mActor->getRootAi()->loadMapUnitParams(set.map_unit_params, heap) && + mActor->getRootAi()->loadAITreeParams(set.ai_tree_params, heap) && + (set.dynamic_params.num_params < 1 || + mParamPack.load(*mActor, set.dynamic_params, heap, AIDefInstParamKind::Dynamic))) { + preInit_(); + return init_(heap); + } + } + return false; +} + +const char* Query::getName() const { + if (mDefIdx == -1) + return nullptr; + + return getAIProg()->getQueries()[mDefIdx].mClassName; +} + +bool Query::getSInstParam(const f32** value, const sead::SafeString& param) const { + const auto& def = getAIProg()->getQueries()[mDefIdx]; + return getAIProg()->getSInstParam(value, def, param); +} + +bool Query::getDInstParam(sead::SafeString* value, const sead::SafeString& param) const { + if (mParamPack.getString(value, param)) + return true; + *value = ""; + return false; +} + +bool Query::getDInstParam(const s32** value, const sead::SafeString& param) const { + static s32 sDefault{}; + return getDInstParam_(value, param, AIDefParamType::Int, &sDefault); +} + +bool Query::getDInstParam(const f32** value, const sead::SafeString& param) const { + static f32 sDefault{}; + return getDInstParam_(value, param, AIDefParamType::Float, &sDefault); +} + +bool Query::getDInstParam(const bool** value, const sead::SafeString& param) const { + static bool sDefault{}; + auto ret = static_cast(mParamPack.getAITreeVariablePointer(param, AIDefParamType::Bool)); + *value = ret ? ret : &sDefault; + return ret != nullptr; +} + template class ClassContainer; } // namespace ksys::act::ai diff --git a/src/KingSystem/ActorSystem/actAiQuery.h b/src/KingSystem/ActorSystem/actAiQuery.h index 18304968..5d41f689 100644 --- a/src/KingSystem/ActorSystem/actAiQuery.h +++ b/src/KingSystem/ActorSystem/actAiQuery.h @@ -5,10 +5,18 @@ #include "KingSystem/ActorSystem/actAiParam.h" #include "KingSystem/Utils/Types.h" +namespace evfl { +class ParamAccessor; +} + namespace ksys::act { class Actor; } +namespace ksys::res { +class AIProgram; +} + namespace ksys::act::ai { class Query { @@ -24,17 +32,47 @@ public: explicit Query(const InitArg& arg); virtual ~Query() = default; + bool init(sead::Heap* heap); + const char* getName() const; + + bool getSInstParam(const f32** value, const sead::SafeString& param) const; + + bool getDInstParam(sead::SafeString* value, const sead::SafeString& param) const; + bool getDInstParam(const s32** value, const sead::SafeString& param) const; + bool getDInstParam(const f32** value, const sead::SafeString& param) const; + bool getDInstParam(const bool** value, const sead::SafeString& param) const; + + bool loadString(evfl::ParamAccessor* accessor, const sead::SafeString& param); + bool loadInt(evfl::ParamAccessor* accessor, const sead::SafeString& param); + bool loadFloat(evfl::ParamAccessor* accessor, const sead::SafeString& param); + bool loadBool(evfl::ParamAccessor* accessor, const sead::SafeString& param); + + bool getAITreeVariable(const sead::SafeString** value, const sead::SafeString& param) const; + bool getAITreeVariable(const char** value, const sead::SafeString& param) const; + virtual bool m4() { return false; } virtual bool m5() { return false; } virtual void m6() {} - virtual bool m7() { return true; } - virtual void m8() {} + virtual bool init_(sead::Heap* heap) { return true; } + virtual void preInit_() {} virtual int doQuery() { return 0; } virtual void m10() {} virtual bool m11() { return true; } virtual void m12() {} protected: + res::AIProgram* getAIProg() const; + + template + bool getDInstParam_(const T** value, const sead::SafeString& param, AIDefParamType type, + const T* default_value) const { + *value = static_cast(mParamPack.getAITreeVariablePointer(param, type)); + if (*value) + return true; + *value = default_value; + return false; + } + Actor* mActor; ParamPack mParamPack; s32 mDefIdx; diff --git a/src/KingSystem/ActorSystem/actAiRoot.cpp b/src/KingSystem/ActorSystem/actAiRoot.cpp index 041ab86c..1098c634 100644 --- a/src/KingSystem/ActorSystem/actAiRoot.cpp +++ b/src/KingSystem/ActorSystem/actAiRoot.cpp @@ -16,4 +16,12 @@ RootAi::~RootAi() { delete _140; } +bool RootAi::loadMapUnitParams(const AIDef& def, sead::Heap* heap) { + return mMapUnitParams.load(*mActor, def, heap, AIDefInstParamKind::MapUnit); +} + +bool RootAi::loadAITreeParams(const AIDef& def, sead::Heap* heap) { + return mAiTreeParams.load(*mActor, def, heap, AIDefInstParamKind::AITree); +} + } // namespace ksys::act::ai diff --git a/src/KingSystem/ActorSystem/actAiRoot.h b/src/KingSystem/ActorSystem/actAiRoot.h index e80ec01b..fbb46eeb 100644 --- a/src/KingSystem/ActorSystem/actAiRoot.h +++ b/src/KingSystem/ActorSystem/actAiRoot.h @@ -48,6 +48,9 @@ public: const ParamPack& getMapUnitParams() const { return mMapUnitParams; } const ParamPack& getAiTreeParams() const { return mAiTreeParams; } + bool loadMapUnitParams(const AIDef& def, sead::Heap* heap); + bool loadAITreeParams(const AIDef& def, sead::Heap* heap); + private: // TODO: rename and put this in a different translation unit struct SomeStruct { diff --git a/src/KingSystem/Resource/resResourceAIProgram.cpp b/src/KingSystem/Resource/resResourceAIProgram.cpp index f7271975..242fb42b 100644 --- a/src/KingSystem/Resource/resResourceAIProgram.cpp +++ b/src/KingSystem/Resource/resResourceAIProgram.cpp @@ -326,6 +326,17 @@ AIProgram::Definition::findSInstParam(const sead::SafeString& name) const { return findSInstParam(agl::utl::ParameterBase::calcHash(name)); } +bool AIProgram::getSInstParam(const char** value, const AIProgram::Definition& def, + const sead::SafeString& param_name) const { + const auto* param = def.findSInstParam(param_name); + if (!param || param->getParameterType() != agl::utl::ParameterType::StringRef) { + *value = &sead::SafeString::cNullChar; + return false; + } + *value = param->ptrT(); + return true; +} + bool AIProgram::getSInstParam(sead::SafeString* value, const AIProgram::Definition& def, const sead::SafeString& param_name) const { const auto* param = def.findSInstParam(param_name); @@ -343,6 +354,12 @@ bool AIProgram::getSInstParam(const s32** value, const AIProgram::Definition& de return getSInstParam_(value, def, param_name, agl::utl::ParameterType::Int, &sDefault); } +bool AIProgram::getSInstParam(const f32** value, const AIProgram::Definition& def, + const sead::SafeString& param_name) const { + static const f32 sDefault{}; + return getSInstParam_(value, def, param_name, agl::utl::ParameterType::F32, &sDefault); +} + bool AIProgram::getSInstParam(const sead::Vector3f** value, const AIProgram::Definition& def, const sead::SafeString& param_name) const { return getSInstParam_(value, def, param_name, agl::utl::ParameterType::Vec3, diff --git a/src/KingSystem/Resource/resResourceAIProgram.h b/src/KingSystem/Resource/resResourceAIProgram.h index a7781937..9fdf53d9 100644 --- a/src/KingSystem/Resource/resResourceAIProgram.h +++ b/src/KingSystem/Resource/resResourceAIProgram.h @@ -64,12 +64,14 @@ public: const sead::Buffer& getBehaviors() const { return mBehaviors; } const sead::Buffer& getQueries() const { return mQueries; } + bool getSInstParam(const char** value, const Definition& def, + const sead::SafeString& param_name) const; bool getSInstParam(sead::SafeString* value, const Definition& def, const sead::SafeString& param_name) const; - bool getSInstParam(const f32** value, const Definition& def, - const sead::SafeString& param_name) const; bool getSInstParam(const s32** value, const Definition& def, const sead::SafeString& param_name) const; + bool getSInstParam(const f32** value, const Definition& def, + const sead::SafeString& param_name) const; bool getSInstParam(const sead::Vector3f** value, const Definition& def, const sead::SafeString& param_name) const; bool getSInstParam(const bool** value, const Definition& def, @@ -129,10 +131,4 @@ inline bool AIProgram::getSInstParam_(const T** value, const AIProgram::Definiti return true; } -inline bool AIProgram::getSInstParam(const f32** value, const AIProgram::Definition& def, - const sead::SafeString& param_name) const { - static const f32 sDefault{}; - return getSInstParam_(value, def, param_name, agl::utl::ParameterType::F32, &sDefault); -} - } // namespace ksys::res