#pragma once #include "StarGameTypes.hpp" #include "StarJson.hpp" namespace Star { STAR_CLASS(BehaviorDatabase); STAR_STRUCT(ActionNode); STAR_STRUCT(DecoratorNode); STAR_STRUCT(SequenceNode); STAR_STRUCT(SelectorNode); STAR_STRUCT(ParallelNode); STAR_STRUCT(DynamicNode); STAR_STRUCT(RandomizeNode); STAR_STRUCT(BehaviorTree); typedef Variant CompositeNode; typedef Variant BehaviorNode; typedef std::shared_ptr BehaviorNodeConstPtr; enum class NodeParameterType : uint8_t { Json, Entity, Position, Vec2, Number, Bool, List, Table, String }; extern EnumMap const NodeParameterTypeNames; typedef Variant NodeParameterValue; typedef pair NodeParameter; typedef pair, bool>> NodeOutput; NodeParameterValue nodeParameterValueFromJson(Json const& json); Json jsonFromNodeParameter(NodeParameter const& parameter); NodeParameter jsonToNodeParameter(Json const& json); Json jsonFromNodeOutput(NodeOutput const& output); NodeOutput jsonToNodeOutput(Json const& json); enum class BehaviorNodeType : uint16_t { Action, Decorator, Composite, Module }; extern EnumMap const BehaviorNodeTypeNames; enum class CompositeType : uint16_t { Sequence, Selector, Parallel, Dynamic, Randomize }; extern EnumMap const CompositeTypeNames; // replaces global tags in nodeParameters in place NodeParameterValue replaceBehaviorTag(NodeParameterValue const& parameter, StringMap const& treeParameters); Maybe replaceOutputBehaviorTag(Maybe const& output, StringMap const& treeParameters); void applyTreeParameters(StringMap& nodeParameters, StringMap const& treeParameters); struct ActionNode { ActionNode(String name, StringMap parameters, StringMap output); String name; StringMap parameters; StringMap output; }; struct DecoratorNode { DecoratorNode(String const& name, StringMap parameters, BehaviorNodeConstPtr child); String name; StringMap parameters; BehaviorNodeConstPtr child; }; struct SequenceNode { SequenceNode(List children); List children; }; struct SelectorNode { SelectorNode(List children); List children; }; struct ParallelNode { ParallelNode(StringMap, List children); int succeed; int fail; List children; }; struct DynamicNode { DynamicNode(List children); List children; }; struct RandomizeNode { RandomizeNode(List children); List children; }; struct BehaviorTree { BehaviorTree(String const& name, StringSet scripts, JsonObject const& parameters); String name; StringSet scripts; StringSet functions; JsonObject parameters; BehaviorNodeConstPtr root; }; typedef std::shared_ptr BehaviorNodeConstPtr; class BehaviorDatabase { public: BehaviorDatabase(); BehaviorTreeConstPtr behaviorTree(String const& name) const; BehaviorTreeConstPtr buildTree(Json const& config, StringMap const& overrides = {}) const; Json behaviorConfig(String const& name) const; private: StringMap m_configs; StringMap m_behaviors; StringMap> m_nodeParameters; StringMap> m_nodeOutput; void loadTree(String const& name); // constructs node variants CompositeNode compositeNode(Json const& config, StringMap parameters, StringMap const& treeParameters, BehaviorTree& tree) const; BehaviorNodeConstPtr behaviorNode(Json const& json, StringMap const& treeParameters, BehaviorTree& tree) const; }; }