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
9 changed files with 151 additions and 24 deletions
+1
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; }
+2 -1
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;
+63
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
+40 -2
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;
+8
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
+3
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 {
@@ -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,
@@ -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