Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/game/StarBehaviorDatabase.hpp
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2023-06-20 14:33:09 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2023-06-20 14:33:09 +1000
commit6352e8e3196f78388b6c771073f9e03eaa612673 (patch)
treee23772f79a7fbc41bc9108951e9e136857484bf4 /source/game/StarBehaviorDatabase.hpp
parent6741a057e5639280d85d0f88ba26f000baa58f61 (diff)
everything everywhere
all at once
Diffstat (limited to 'source/game/StarBehaviorDatabase.hpp')
-rw-r--r--source/game/StarBehaviorDatabase.hpp155
1 files changed, 155 insertions, 0 deletions
diff --git a/source/game/StarBehaviorDatabase.hpp b/source/game/StarBehaviorDatabase.hpp
new file mode 100644
index 0000000..f1db93a
--- /dev/null
+++ b/source/game/StarBehaviorDatabase.hpp
@@ -0,0 +1,155 @@
+#ifndef STAR_BEHAVIOR_DATABASE_HPP
+#define STAR_BEHAVIOR_DATABASE_HPP
+
+#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<SequenceNode, SelectorNode, ParallelNode, DynamicNode, RandomizeNode> CompositeNode;
+
+typedef Variant<ActionNode, DecoratorNode, CompositeNode, BehaviorTreeConstPtr> BehaviorNode;
+typedef std::shared_ptr<const BehaviorNode> BehaviorNodeConstPtr;
+
+enum class NodeParameterType : uint8_t {
+ Json,
+ Entity,
+ Position,
+ Vec2,
+ Number,
+ Bool,
+ List,
+ Table,
+ String
+};
+extern EnumMap<NodeParameterType> const NodeParameterTypeNames;
+
+typedef Variant<String, Json> NodeParameterValue;
+typedef pair<NodeParameterType, NodeParameterValue> NodeParameter;
+typedef pair<NodeParameterType, pair<Maybe<String>, 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<BehaviorNodeType> const BehaviorNodeTypeNames;
+
+enum class CompositeType : uint16_t {
+ Sequence,
+ Selector,
+ Parallel,
+ Dynamic,
+ Randomize
+};
+extern EnumMap<CompositeType> const CompositeTypeNames;
+
+// replaces global tags in nodeParameters in place
+NodeParameterValue replaceBehaviorTag(NodeParameterValue const& parameter, StringMap<NodeParameterValue> const& treeParameters);
+Maybe<String> replaceOutputBehaviorTag(Maybe<String> const& output, StringMap<NodeParameterValue> const& treeParameters);
+void applyTreeParameters(StringMap<NodeParameter>& nodeParameters, StringMap<NodeParameterValue> const& treeParameters);
+
+struct ActionNode {
+ ActionNode(String name, StringMap<NodeParameter> parameters, StringMap<NodeOutput> output);
+
+ String name;
+ StringMap<NodeParameter> parameters;
+ StringMap<NodeOutput> output;
+};
+
+struct DecoratorNode {
+ DecoratorNode(String const& name, StringMap<NodeParameter> parameters, BehaviorNodeConstPtr child);
+
+ String name;
+ StringMap<NodeParameter> parameters;
+ BehaviorNodeConstPtr child;
+};
+
+struct SequenceNode {
+ SequenceNode(List<BehaviorNodeConstPtr> children);
+
+ List<BehaviorNodeConstPtr> children;
+};
+
+struct SelectorNode {
+ SelectorNode(List<BehaviorNodeConstPtr> children);
+
+ List<BehaviorNodeConstPtr> children;
+};
+
+struct ParallelNode {
+ ParallelNode(StringMap<NodeParameter>, List<BehaviorNodeConstPtr> children);
+
+ int succeed;
+ int fail;
+ List<BehaviorNodeConstPtr> children;
+};
+
+struct DynamicNode {
+ DynamicNode(List<BehaviorNodeConstPtr> children);
+
+ List<BehaviorNodeConstPtr> children;
+};
+
+struct RandomizeNode {
+ RandomizeNode(List<BehaviorNodeConstPtr> children);
+
+ List<BehaviorNodeConstPtr> 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<const BehaviorNode> BehaviorNodeConstPtr;
+
+class BehaviorDatabase {
+public:
+ BehaviorDatabase();
+
+ BehaviorTreeConstPtr behaviorTree(String const& name) const;
+ BehaviorTreeConstPtr buildTree(Json const& config, StringMap<NodeParameterValue> const& overrides = {}) const;
+ Json behaviorConfig(String const& name) const;
+
+private:
+ StringMap<Json> m_configs;
+ StringMap<BehaviorTreeConstPtr> m_behaviors;
+ StringMap<StringMap<NodeParameter>> m_nodeParameters;
+ StringMap<StringMap<NodeOutput>> m_nodeOutput;
+
+ void loadTree(String const& name);
+
+ // constructs node variants
+ CompositeNode compositeNode(Json const& config, StringMap<NodeParameter> parameters, StringMap<NodeParameterValue> const& treeParameters, BehaviorTree& tree) const;
+ BehaviorNodeConstPtr behaviorNode(Json const& json, StringMap<NodeParameterValue> const& treeParameters, BehaviorTree& tree) const;
+};
+
+}
+
+#endif