#pragma once #include "componentbasic.h" #include #include #include class MessageLoader; class CompareDelegate; class ConvertDelegate; class ExecuteDelegate; class LogicalNode; /// /// 通用数据类型 /// struct COMPONENTBASIC_EXPORT GeneralData : public TopicData { QJsonObject _element_bind; QString topicString() const override; std::shared_ptr newDefault() const override; void recoveryFrom(const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; }; // ================================================================================== /// /// 行为树实例化节点 /// class COMPONENTBASIC_EXPORT MapKernel : public QObject, virtual public Serializable, public std::enable_shared_from_this { Q_OBJECT private: /// /// 绑定载入器 /// std::shared_ptr _bind_loader; QJSEngine _core_engine; /// /// {Topic,default-value} /// QHash> _variable_types; /// /// 比较器 /// QHash> _compare_types; /// /// 转换器 /// QHash> _convert_types; /// /// 执行器 /// QHash> _execute_types; /// /// 所有可用的节点类型 /// QHash> _logicalnode_types; signals: /// /// 比较器类型列表变更 /// void compareTypeListChanged(); /// /// 转换器类型列表变更 /// void convertTypeListChanged(); public: MapKernel(std::shared_ptr ins); virtual ~MapKernel() = default; void initial(); QJSEngine& bindEngine(); // 数据类型管理 ====================================================== /// /// 注册数据类型 /// /// virtual void registData(std::shared_ptr init); /// /// 获取所有可用数据类型 /// /// virtual QList dataTypes() const; /// /// 获取指定topic的数据类型 /// /// /// virtual std::shared_ptr getData(const QString& topic) const; // 逻辑树类型管理 ==================================================== /// /// 注册逻辑节点 /// /// virtual void registNode(std::shared_ptr ins); /// /// 执行器类型名称 /// /// virtual QList nodeTypes() const; /// /// 获取指定类型的执行器节点 /// /// /// virtual std::shared_ptr getNode(const QString& name) const; // 比较器类型管理 ====================================================== /// /// 注册比较器 /// /// virtual void registCompare(std::shared_ptr ins); /// /// 获取比较器类型 /// /// virtual QList compareTypes() const; /// /// 获取比较器单例实例 /// /// /// virtual std::shared_ptr getCompare(const QString& name) const; // 转换器类型管理 ====================================================== /// /// 注册转换器 /// /// virtual void registConvert(std::shared_ptr ins); /// /// 转换器类型名称 /// /// virtual QList convertTypes() const; /// /// 获取指定类型的转换器 /// /// /// virtual std::shared_ptr getConvert(const QString& name) const; // 执行节点类型管理 ==================================================== /// /// 注册拓展执行器 /// /// virtual void registExecute(std::shared_ptr ins); /// /// 执行器类型名称 /// /// virtual QList executeTypes() const; /// /// 获取指定类型的执行器节点 /// /// /// virtual std::shared_ptr getExecute(const QString& name) const; // 通过 Serializable 继承 std::shared_ptr newDefault() const override; void recoveryFrom(const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; }; /// /// 比较关系实例 /// class COMPONENTBASIC_EXPORT CompareDelegate : public Serializable { private: QJSEngine& _script_engine; QString _function_name; public: CompareDelegate(QJSEngine& bind_engine, const QString& func); QString name() const; bool compare(std::shared_ptr vleft, std::shared_ptr vright); std::shared_ptr newDefault() const override; void recoveryFrom(const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; }; /// /// 数据转换实例 /// class COMPONENTBASIC_EXPORT ConvertDelegate : public Serializable { public: typedef QString DATA_TOPIC_STRING; /// /// 构建转换器 /// /// 数据类型管理核心 /// /// ConvertDelegate(std::shared_ptr host, QJSEngine& bind_engine, const QString& func); /// /// 转换器名称:JS函数名 /// /// QString name() const; /// /// 输入变量类型绑定表 /// /// list{pair{类型名称,绑定输入变量名}} QList> inputTable() const; /// /// 重置输入变量类型表 /// /// list{pair{类型名称,绑定输入变量名}} void inputReset(const QList>& table); /// /// 输入变量 /// /// pair{类型名称,绑定输出变量名} std::pair outputVariable() const; /// /// 重置输出变量类型名 /// /// void outputReset(std::pair appoint); /// /// 执行转换 /// /// 输入变量列表 /// std::shared_ptr convert(const QList>& input_variables); std::shared_ptr newDefault() const override; void recoveryFrom(const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; private: std::shared_ptr _host_bind; QJSEngine& _script_engine; QString _function_name; QList> _input_table; std::pair _output_appoint; }; /// /// 执行结果 /// enum class ExecuteResult { UNDEFINED, // 未定义 SUCCESS, // 成功 FAILURE // 失败 }; /// /// 执行代理 /// class COMPONENTBASIC_EXPORT ExecuteDelegate : public Serializable { public: /// /// 获取节点名称 /// /// virtual QString typeName() const = 0; /// /// 声明输入变量的内部标识和数据接口 /// /// map{name, type-ins} virtual QHash> inputList() const = 0; /// /// 声明输出变量的内部标识和数据接口 /// /// map{name, type-ins} virtual QHash> outputList() const = 0; /// /// 重置内部状态 /// virtual void reset() = 0; /// /// 执行逻辑节点 /// /// /// virtual ExecuteResult execute() = 0; }; /// /// 逻辑节点类型 /// enum class NodeKind { MAPNODE, // 逻辑树节点 SEQUENCENODE, // 顺序节点 SELECTORNODE, // 选择节点 PARALLELNODE, // 并行节点 COMPARENODE, // 比较节点 ACTIONNODE, // 动作节点 MODIFYNODE, // 修饰节点 }; class BehaviorMapNode; /// /// 所有逻辑节点的基类 /// class COMPONENTBASIC_EXPORT LogicalNode : virtual public Serializable, public std::enable_shared_from_this { private: int _node_id = 0; NodeKind _node_type = NodeKind::ACTIONNODE; std::shared_ptr _bind_kernal; std::weak_ptr _parent_bind; QList> _child_list; /// /// 重置父节点 /// /// void _set_parent_node(std::weak_ptr pnode); public: LogicalNode(NodeKind t, std::shared_ptr kernal); virtual ~LogicalNode() = default; /// /// 获取节点类型 /// /// NodeKind nodeKind() const; /// /// 节点深度 /// /// int depth() const; /// /// 获取包含树图节点 /// /// std::shared_ptr bindMap() const; std::shared_ptr getKernal() const; /// /// 回退节点 /// /// std::weak_ptr parent() const; /// /// 获取子节点列表 /// /// virtual QList> children() const; /// /// 添加子节点 /// /// /// virtual void insert(std::shared_ptr node, int index = -1); /// /// 移除子节点 /// /// virtual void remove(std::shared_ptr node); /// /// 设置节点id /// /// void setID(int unique_id); /// /// 提取节点id /// /// int getID() const; /// /// 实例化节点名称 /// /// virtual QString rtName() const; /// /// 获取节点名称 /// /// virtual QString typeName() const = 0; /// /// 声明输入变量的内部标识和数据接口 /// /// map{name, type-ins} virtual QHash> inputList() const = 0; /// /// 声明输出变量的内部标识和数据接口 /// /// map{name, type-ins} virtual QHash> outputList() const = 0; /// /// 重置内部状态 /// virtual void reset() = 0; /// /// 获取执行入口节点 /// /// virtual QList> getForwards() const = 0; /// /// 下行节点执行状态回返填充 /// /// /// /// 接续执行标志 virtual bool fallback(std::shared_ptr node, ExecuteResult ste) = 0; /// /// 执行逻辑节点 /// /// /// virtual ExecuteResult execute() = 0; /// /// 新建默认实例 /// /// virtual std::shared_ptr newDefault() const = 0; }; /// /// 逻辑树节点输入输出类型 /// enum class IO_TYPE { INPUT, // 输入 OUTPUT, // 输出 INTERNAL// 内部变量 }; /// /// 自定义行为树节点根节点实例 /// class COMPONENTBASIC_EXPORT BehaviorMapNode : public LogicalNode { private: QString _map_name = u8"行为树节点"; /// /// 地图变量表 /// QHash>> _variables; ExecuteResult _state_value = ExecuteResult::FAILURE; public: BehaviorMapNode(std::shared_ptr kernal); /// /// 设置变量,如果类型错误会抛出UniException异常 /// 节点初始化时会按照配置注册默认值变量 /// virtual void setVariable(const QString& key, IO_TYPE t, std::shared_ptr ins); virtual QList inputVariableKeys() const; virtual QList outputVariableKeys() const; virtual QList internalVariableKeys() const; virtual void removeVariable(const QString &key); /// /// 获取指定名称的数据变量 /// /// /// 如果不存在指定名称数据,返回nullptr,类型不确定 virtual std::shared_ptr getVariable(const QString& key) const; /// /// 设置行为树节点名称 /// /// virtual void resetName(const QString& val); /// /// 重置执行状态 /// void reset() override; /// /// 实例名称 /// /// QString rtName() const override; /// /// 获取节点类型名称 /// /// QString typeName() const override; /// /// 提取前置节点 /// /// QList> getForwards() const override; /// /// 填充状态 /// /// /// /// bool fallback(std::shared_ptr node, ExecuteResult ste) override; /// /// 执行状态 /// /// ExecuteResult execute() override; /// /// 输入变量列表 /// /// QHash> inputList() const override; /// /// 输出变量列表 /// /// QHash> outputList() const override; /// /// 创建新实例 /// /// /// virtual std::shared_ptr newDefault() const override; void recoveryFrom(const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; }; // 行为树节点 ====================================================== /// /// 顺序节点 /// class COMPONENTBASIC_EXPORT SequenceNode : public LogicalNode { private: QHash _state_map; public: SequenceNode(std::shared_ptr kernal); QList> getForwards() const override; QString typeName() const override; QHash> inputList() const override; QHash> outputList() const override; void reset() override; ExecuteResult execute() override; bool fallback(std::shared_ptr node, ExecuteResult ste) override; virtual std::shared_ptr newDefault() const override; void recoveryFrom(const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; }; /// /// 选择节点 /// class COMPONENTBASIC_EXPORT SelectorNode : public LogicalNode { private: QHash _state_map; public: SelectorNode(std::shared_ptr kernal); QList> getForwards() const override; QString typeName() const override; QHash> inputList() const override; QHash> outputList() const override; void reset() override; ExecuteResult execute() override; bool fallback(std::shared_ptr node, ExecuteResult ste) override; virtual std::shared_ptr newDefault() const override; void recoveryFrom(const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; }; /// /// 并行节点 /// class COMPONENTBASIC_EXPORT ParallelNode : public LogicalNode { private: QHash _state_map; public: ParallelNode(std::shared_ptr kernal); QList> getForwards() const override; QString typeName() const override; QHash> inputList() const override; QHash> outputList() const override; void reset() override; ExecuteResult execute() override; bool fallback(std::shared_ptr node, ExecuteResult ste) override; virtual std::shared_ptr newDefault() const override; void recoveryFrom(const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; }; /// /// 比较节点 /// class COMPONENTBASIC_EXPORT CompareNode : public LogicalNode { private: std::shared_ptr _bind_delegate; QHash> _data_map; public: CompareNode(std::shared_ptr kernal); QString delegateName() const; void bindDelegate(std::shared_ptr ins); virtual QList> getForwards() const override; virtual QString rtName() const override; QString typeName() const override; QHash> inputList() const override; QHash> outputList() const override; virtual void insert(std::shared_ptr node, int index /*= -1*/) override; void reset() override; ExecuteResult execute() override; virtual bool fallback(std::shared_ptr node, ExecuteResult ste) override; virtual std::shared_ptr newDefault() const override; void recoveryFrom(const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; }; /// /// 执行节点 /// class COMPONENTBASIC_EXPORT ExecuteNode : public LogicalNode { private: std::shared_ptr _bind_delegate; public: ExecuteNode(std::shared_ptr kernal); QString delegateName() const; void bindDelegate(std::shared_ptr ins); virtual QList> getForwards() const override; virtual QString rtName() const override; QString typeName() const override; QHash> inputList() const override; QHash> outputList() const override; virtual void insert(std::shared_ptr node, int index /*= -1*/) override; void reset() override; ExecuteResult execute() override; virtual bool fallback(std::shared_ptr node, ExecuteResult ste) override; virtual std::shared_ptr newDefault() const override; void recoveryFrom(const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; }; /// /// 修饰节点类型 /// enum class ModifyType { NONE, ALWAYS_SUCCESS, // 永远成功 ALWAYS_FAILURE, // 永远失败 RESULT_INVENTER, // 结果翻转 }; class COMPONENTBASIC_EXPORT ModifiedNode : public LogicalNode { private: ModifyType _type_appoint = ModifyType::NONE; ExecuteResult _result_store = ExecuteResult::UNDEFINED; public: ModifiedNode(std::shared_ptr kernal); ModifyType modifyType() const; void resetModify(ModifyType t); void insert(std::shared_ptr node, int index = -1) override; virtual QString rtName() const override; QString typeName() const override; QHash> inputList() const override; QHash> outputList() const override; QList> getForwards() const override; bool fallback(std::shared_ptr node, ExecuteResult ste) override; void reset() override; ExecuteResult execute() override; std::shared_ptr newDefault() const override; void recoveryFrom(const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; }; // 行为节点 ==================================================================== /// /// 行为树组件 /// class COMPONENTBASIC_EXPORT BehaviorPerformPlugin : public RespondRoute< WsRespond, WsRespond, WsRespond, WsRespond>, public RequestRoute<> { private: std::weak_ptr _bind_entity; public: void mapReset(const QString& path); // 通过 ProcList 继承 void execute(std::shared_ptr in, QList>& out) override; void execute(std::shared_ptr in, QList>& out) override; void execute(std::shared_ptr in, QList>& out) override; void execute(std::shared_ptr in, QList>& out) override; void recoveryFrom(const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; std::shared_ptr newDefault() const override; void bindEntity(std::weak_ptr host) override; QString name() const override; };