summaryrefslogtreecommitdiff
path: root/src/KingSystem/ActorSystem/actAiQuery.cpp
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2020-12-09 18:32:25 +0100
committerLéo Lam <leo@leolam.fr>2020-12-09 20:43:22 +0100
commit930b780cd1513e1dd92bc114cde58adb552159a6 (patch)
tree11e767a103695841a90afdc922e088c2b47b4ae2 /src/KingSystem/ActorSystem/actAiQuery.cpp
parentfcbe17a3f0db98bdafdfd917210b03019de2d31f (diff)
ksys/act: Implement more Query functions
Diffstat (limited to 'src/KingSystem/ActorSystem/actAiQuery.cpp')
-rw-r--r--src/KingSystem/ActorSystem/actAiQuery.cpp63
1 files changed, 63 insertions, 0 deletions
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_<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