summaryrefslogtreecommitdiff
path: root/src/KingSystem/Resource/Actor/resResourceAIProgram.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/KingSystem/Resource/Actor/resResourceAIProgram.h')
-rw-r--r--src/KingSystem/Resource/Actor/resResourceAIProgram.h144
1 files changed, 144 insertions, 0 deletions
diff --git a/src/KingSystem/Resource/Actor/resResourceAIProgram.h b/src/KingSystem/Resource/Actor/resResourceAIProgram.h
new file mode 100644
index 00000000..c7a646bf
--- /dev/null
+++ b/src/KingSystem/Resource/Actor/resResourceAIProgram.h
@@ -0,0 +1,144 @@
+#pragma once
+
+#include <agl/Utils/aglParameter.h>
+#include <agl/Utils/aglParameterList.h>
+#include <agl/Utils/aglParameterObj.h>
+#include <container/seadBuffer.h>
+#include <math/seadVector.h>
+#include "KingSystem/Resource/resResource.h"
+#include "KingSystem/Utils/ParamIO.h"
+#include "KingSystem/Utils/Types.h"
+
+namespace ksys::act::ai {
+enum class ActionType : int;
+}
+
+namespace ksys::res {
+
+class AIProgram : public ParamIO, public Resource {
+ SEAD_RTTI_OVERRIDE(AIProgram, Resource)
+public:
+ struct Definition {
+ const agl::utl::ParameterBase* findSInstParam(u32 name_hash) const;
+ const agl::utl::ParameterBase* findSInstParam(const sead::SafeString& name) const;
+
+ template <typename T>
+ bool addSInstParam_(s32 idx, const char* name, sead::Heap* heap, const T& value);
+
+ void finalize_();
+
+ agl::utl::ParameterList mList;
+ const char* mClassName;
+ const char* mName;
+ sead::Buffer<agl::utl::ParameterBase*> mSInstParams;
+ agl::utl::ParameterObj mSInstObj;
+ };
+ KSYS_CHECK_SIZE_NX150(Definition, 0x98);
+
+ struct AIActionDef : Definition {
+ void finalize_();
+
+ const char* mGroupName;
+ sead::Buffer<u16> mChildIndices;
+ sead::Buffer<u8> mBehaviorIndices;
+ u16 mTriggerAction;
+ u16 mDynamicParamChild;
+ u16 _c4;
+ };
+ KSYS_CHECK_SIZE_NX150(AIActionDef, 0xc8);
+
+ struct BehaviorDef : Definition {
+ u16 mCalcTiming;
+ u16 mNoStop;
+ };
+ KSYS_CHECK_SIZE_NX150(BehaviorDef, 0xa0);
+
+ struct QueryDef : Definition {};
+ KSYS_CHECK_SIZE_NX150(QueryDef, 0x98);
+
+ AIProgram() : ParamIO("aiprog", 0) {}
+ ~AIProgram() override;
+
+ const sead::Buffer<AIActionDef>& getActionsOrAIs(act::ai::ActionType type) const;
+ const sead::Buffer<BehaviorDef>& getBehaviors() const { return mBehaviors; }
+ const sead::Buffer<QueryDef>& getQueries() const { return mQueries; }
+
+ const AIActionDef& getAI(s32 index) const { return mAIs[index]; }
+ const sead::Buffer<AIActionDef>& getAIs() const { return mAIs; }
+ const sead::Buffer<AIActionDef>& getActions() const { return mActions; }
+
+ const AIActionDef& getAction(act::ai::ActionType type, s32 index) const {
+ return getActionsOrAIs(type)[index];
+ }
+
+ const sead::Buffer<u16>& getDemoAiActionIndices() const { return mDemoAIActionIndices; }
+ const sead::Buffer<u8>& getDemoBehaviorIndices() const { return mDemoBehaviorIndices; }
+
+ 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 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,
+ const sead::SafeString& param_name) const;
+
+ void doCreate_(u8* buffer, u32 bufferSize, sead::Heap* heap) override;
+ bool needsParse() const override { return true; }
+
+private:
+ bool parse_(u8* data, size_t size, sead::Heap* parent_heap) override;
+ bool parseAIActions(sead::Buffer<AIActionDef>& defs, sead::Heap* heap,
+ agl::utl::ParameterList& target_list,
+ const agl::utl::ResParameterList& root, const char* type_name);
+ bool parseBehaviors(sead::Heap* heap, const agl::utl::ResParameterList& root);
+ bool parseQueries(sead::Heap* heap, const agl::utl::ResParameterList& root);
+ bool parseDefParams(Definition* def, void* buffer, sead::Heap* heap,
+ const agl::utl::ResParameterList& res, u16* param1, u16* param2);
+
+ void finalize_() override;
+ void finalizeAIActions(sead::Buffer<AIActionDef>& defs);
+ void finalizeBehaviors();
+ void finalizeQueries();
+
+ template <typename T>
+ bool getSInstParam_(const T** value, const Definition& def, const sead::SafeString& param_name,
+ agl::utl::ParameterType param_type, const T* default_value) const;
+
+ sead::Heap* mHeap = nullptr;
+ sead::SafeString mStr;
+
+ sead::Buffer<AIActionDef> mAIs;
+ sead::Buffer<AIActionDef> mActions;
+ sead::Buffer<BehaviorDef> mBehaviors;
+ sead::Buffer<QueryDef> mQueries;
+
+ agl::utl::ParameterList mParamListAI;
+ agl::utl::ParameterList mParamListAction;
+ agl::utl::ParameterList mParamListBehavior;
+ agl::utl::ParameterList mParamListQuery;
+
+ sead::Buffer<u16> mDemoAIActionIndices;
+ sead::Buffer<u8> mDemoBehaviorIndices;
+};
+KSYS_CHECK_SIZE_NX150(AIProgram, 0x448);
+
+template <typename T>
+inline bool AIProgram::getSInstParam_(const T** value, const AIProgram::Definition& def,
+ const sead::SafeString& param_name,
+ agl::utl::ParameterType param_type,
+ const T* default_value) const {
+ const auto* param = def.findSInstParam(param_name);
+ if (!param || param->getParameterType() != param_type) {
+ *value = default_value;
+ return false;
+ }
+ *value = param->ptrT<T>();
+ return true;
+}
+
+} // namespace ksys::res