ksys/act: Implement more Query functions

This commit is contained in:
Léo Lam 2020-12-09 18:32:25 +01:00
parent fcbe17a3f0
commit 930b780cd1
No known key found for this signature in database
GPG Key ID: 0DF30F9081000741
9 changed files with 151 additions and 24 deletions

View File

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

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

View File

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

View File

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

View File

@ -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_<s32>(value, param, AIDefParamType::Int, &sDefault);
}
bool Query::getDInstParam(const f32** value, const sead::SafeString& param) const {
static f32 sDefault{};
return getDInstParam_<f32>(value, param, AIDefParamType::Float, &sDefault);
}
bool Query::getDInstParam(const bool** value, const sead::SafeString& param) const {
static bool sDefault{};
auto ret = static_cast<bool*>(mParamPack.getAITreeVariablePointer(param, AIDefParamType::Bool));
*value = ret ? ret : &sDefault;
return ret != nullptr;
}
template class ClassContainer<Query>;
} // namespace ksys::act::ai

View File

@ -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 <typename T>
bool getDInstParam_(const T** value, const sead::SafeString& param, AIDefParamType type,
const T* default_value) const {
*value = static_cast<T*>(mParamPack.getAITreeVariablePointer(param, type));
if (*value)
return true;
*value = default_value;
return false;
}
Actor* mActor;
ParamPack mParamPack;
s32 mDefIdx;

View File

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

View File

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

View File

@ -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<char>();
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,

View File

@ -64,12 +64,14 @@ public:
const sead::Buffer<BehaviorDef>& getBehaviors() const { return mBehaviors; }
const sead::Buffer<QueryDef>& 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