mirror of
https://github.com/zeldaret/botw
synced 2026-07-31 07:56:30 -04:00
ksys/act: Implement more Query functions
This commit is contained in:
@@ -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; }
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user