#pragma once #include "componentbasic.h" #include #include #include class MessageLoader; class CompareKernel; class ConvertKernel; 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 MapKernal : virtual public Serializable { private: /// /// 绑定载入器 /// std::shared_ptr _bind_loader; /// /// {Topic,default-value} /// QHash> _variable_types; /// /// 比较器 /// QHash> _compare_types; /// /// 转换器 /// QHash> _convert_types; /// /// 所有可用的节点类型 /// QHash> _logicalnode_types; public: MapKernal(std::shared_ptr ins); virtual ~MapKernal() = default; /// /// 获取MessageLoader单例 /// /// std::shared_ptr messageLoader() const; // 数据类型管理 ====================================================== /// /// 注册数据类型 /// /// virtual void registData(std::shared_ptr init); /// /// 获取所有可用数据类型 /// /// virtual QList dataTypes() const; /// /// 获取指定topic的数据类型 /// /// /// virtual std::shared_ptr getData(const QString &topic); // 比较器类型管理 ====================================================== /// /// 注册比较器 /// /// virtual void registCompare(std::shared_ptr ins); /// /// 获取比较器类型 /// /// virtual QList compareTypes() const; /// /// 获取比较器单例实例 /// /// /// virtual std::shared_ptr getCompare(const QString& name); // 转换器类型管理 ====================================================== /// /// 注册转换器 /// /// virtual void registConvert(std::shared_ptr ins); /// /// 转换器类型名称 /// /// virtual QList convertTypes() const; /// /// 获取指定类型的转换器 /// /// /// virtual std::shared_ptr getConvert(const QString& name); // 通过 Serializable 继承 std::shared_ptr newDefault() const override; void recoveryFrom(const QJsonObject& obj) override{} void saveTo(QJsonObject& obj) const override{} }; /// /// 比较关系实例 /// class COMPONENTBASIC_EXPORT CompareKernel { private: QJSEngine& _script_engine; QString _function_name; public: CompareKernel(QJSEngine& bind_engine, const QString& func); QString name() const; bool compare(std::shared_ptr vleft, std::shared_ptr vright); }; /// /// 数据转换实例 /// class COMPONENTBASIC_EXPORT ConvertKernel { public: typedef QString DATA_TOPIC_STRING; /// /// 构建转换器 /// /// 数据类型管理核心 /// /// ConvertKernel(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); private: std::shared_ptr _host_bind; QJSEngine& _script_engine; QString _function_name; QList> _input_table; std::pair _output_appoint; }; /// /// 执行结果 /// enum class LogicalResult { UNDEFINED, // 未定义 SUCCESS, // 成功 FAILURE // 失败 }; /// /// 逻辑节点类型 /// enum class NodeKind { MAPNODE, // 逻辑树节点 SEQUENCENODE, // 顺序节点 SELECTORNODE, // 选择节点 PARALLELNODE, // 并行节点 COMPARENODE, // 比较节点 ACTIONNODE, // 动作节点 }; /// /// 所有逻辑节点的基类 /// class COMPONENTBASIC_EXPORT LogicalNode : virtual public Serializable { private: int _node_id = 0; NodeKind _node_type = NodeKind::ACTIONNODE; std::weak_ptr _parent_bind; QList> _child_list; public: LogicalNode(NodeKind t = NodeKind::ACTIONNODE); virtual ~LogicalNode() = default; /// /// 获取节点类型 /// /// NodeKind nodeKind() const; /// /// 重置父节点 /// /// void setParent(std::weak_ptr pnode); /// /// 回退节点 /// /// std::weak_ptr parent() const; /// /// 获取包含树图节点 /// /// std::shared_ptr bindMap() const; /// /// 设置节点id /// /// void setID(int unique_id); /// /// 提取节点id /// /// int getID() const; /// /// 实例化节点名称 /// /// QString runtimeName() const; /// /// 重置内部状态 /// virtual void reset() = 0; /// /// 获取节点名称 /// /// virtual QString typeName() const = 0; /// /// 执行逻辑节点 /// /// /// virtual LogicalResult execute() = 0; /// /// 声明输入变量的内部标识和数据接口 /// /// map{name, type-ins} virtual QHash> inputList() const = 0; /// /// 声明输出变量的内部标识和数据接口 /// /// map{name, type-ins} virtual QHash> outputList() const = 0; /// /// 新建默认实例 /// /// virtual std::shared_ptr newDefault() const = 0; }; /// /// 组合节点 /// class COMPONENTBASIC_EXPORT ComposeNode { private: QList> _child_list; public: /// /// 获取子节点列表 /// /// virtual QList> children() const; /// /// 添加子节点 /// /// /// virtual void insert(std::shared_ptr node, int index = -1); /// /// 移除子节点 /// /// virtual void remove(std::shared_ptr node); /// /// 获取执行入口节点 /// /// virtual QList> getForwards() const = 0; /// /// 下行节点执行状态回返填充 /// /// /// /// 接续执行标志 virtual bool fallback(std::shared_ptr node, LogicalResult ste) = 0; }; /// /// 逻辑树节点输入输出类型 /// enum class IO_TYPE { INPUT, OUTPUT }; /// /// 自定义行为树节点根节点实例 /// class COMPONENTBASIC_EXPORT BehaviorMapNode : public MapKernal, public LogicalNode, public ComposeNode { private: /// /// 地图变量表 /// QHash>> _variables; QString _map_name; LogicalResult _state_value; public: BehaviorMapNode(std::shared_ptr core); /// /// 设置变量,如果类型错误会抛出UniException异常 /// 节点初始化时会按照配置注册默认值变量 /// virtual void setVariable(const QString& key, IO_TYPE t, std::shared_ptr ins); /// /// 获取指定名称的数据变量 /// /// /// 如果不存在指定名称数据,返回nullptr,类型不确定 virtual std::shared_ptr getVariable(const QString& key) const; /// /// 设置行为树节点名称 /// /// virtual void resetName(const QString& val); /// /// 重置执行状态 /// void reset() override; /// /// 获取节点类型名称 /// /// QString typeName() const override; /// /// 提取前置节点 /// /// QList> getForwards() const override; /// /// 填充状态 /// /// /// /// bool fallback(std::shared_ptr node, LogicalResult ste) override; /// /// 执行状态 /// /// LogicalResult 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 ComposeNode, public LogicalNode { private: QHash _state_map; public: SequenceNode(); QList> getForwards() const override; QString typeName() const override; LogicalResult execute() override; QHash> inputList() const override; QHash> outputList() const override; void reset() override; bool fallback(std::shared_ptr node, LogicalResult 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 ComposeNode, public LogicalNode { private: QHash _state_map; public: SelectorNode(); QList> getForwards() const override; QString typeName() const override; LogicalResult execute() override; QHash> inputList() const override; QHash> outputList() const override; void reset() override; bool fallback(std::shared_ptr node, LogicalResult 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 ComposeNode, public LogicalNode { private: QHash _state_map; public: ParallelNode(); QHash> inputList() const override; QHash> outputList() const override; QString typeName() const override; QList> getForwards() const override; bool fallback(std::shared_ptr node, LogicalResult ste) override; LogicalResult execute() override; void reset() 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(); /// /// 委托名称 /// /// QString delegateName() const; /// /// 绑定比较委托 /// /// void bindDelegate(std::shared_ptr ins); QHash> inputList() const override; QHash> outputList() const override; QString typeName() const override; LogicalResult execute() override; void reset() override; /// /// 新实例 /// /// /// virtual 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; };