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

summaryrefslogtreecommitdiff
path: root/source/game/StarBehaviorState.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/game/StarBehaviorState.hpp')
-rw-r--r--source/game/StarBehaviorState.hpp119
1 files changed, 119 insertions, 0 deletions
diff --git a/source/game/StarBehaviorState.hpp b/source/game/StarBehaviorState.hpp
new file mode 100644
index 0000000..c1721c2
--- /dev/null
+++ b/source/game/StarBehaviorState.hpp
@@ -0,0 +1,119 @@
+#ifndef STAR_BEHAVIOR_STATE_HPP
+#define STAR_BEHAVIOR_STATE_HPP
+
+#include "StarBehaviorDatabase.hpp"
+#include "StarLua.hpp"
+
+namespace Star {
+
+STAR_CLASS(Blackboard);
+STAR_CLASS(BehaviorState);
+STAR_STRUCT(ActionState);
+STAR_STRUCT(DecoratorState);
+STAR_STRUCT(CompositeState);
+
+STAR_EXCEPTION(BehaviorException, StarException);
+
+extern List<NodeParameterType> BlackboardTypes;
+
+class Blackboard {
+public:
+ Blackboard(LuaTable luaContext);
+
+ LuaValue get(NodeParameterType type, String const& key) const;
+ void set(NodeParameterType type, String const& key, LuaValue value);
+
+ LuaTable parameters(StringMap<NodeParameter> const& nodeParameters, uint64_t nodeId);
+ void setOutput(ActionNode const& node, LuaTable const& output);
+
+ // takes the set of currently held ephemeral values
+ Set<pair<NodeParameterType, String>> takeEphemerals();
+
+ // clears any provided ephemerals that are not currently held
+ void clearEphemerals(Set<pair<NodeParameterType, String>> ephemerals);
+private:
+ LuaTable m_luaContext;
+
+ HashMap<uint64_t, LuaTable> m_parameters;
+ HashMap<NodeParameterType, StringMap<LuaValue>> m_board;
+
+ HashMap<NodeParameterType, StringMap<List<pair<uint64_t, String>>>> m_input;
+ StringMap<List<pair<uint64_t, LuaTable>>> m_vectorNumberInput;
+
+ Set<pair<NodeParameterType, String>> m_ephemeral;
+};
+
+typedef Maybe<Variant<ActionState,DecoratorState,CompositeState>> NodeState;
+typedef shared_ptr<NodeState> NodeStatePtr;
+
+typedef pair<LuaFunction, LuaThread> Coroutine;
+
+enum class NodeStatus {
+ Invalid,
+ Success,
+ Failure,
+ Running
+};
+
+typedef LuaTupleReturn<NodeStatus, LuaValue> ActionReturn;
+struct ActionState {
+ LuaThread thread;
+};
+
+struct DecoratorState {
+ DecoratorState(LuaThread thread);
+ LuaThread thread;
+ NodeStatePtr child;
+};
+
+struct CompositeState {
+ CompositeState(size_t children);
+ CompositeState(size_t children, size_t index);
+
+ size_t index;
+ List<NodeStatePtr> children;
+};
+
+class BehaviorState {
+public:
+ BehaviorState(BehaviorTreeConstPtr tree, LuaTable context, Maybe<BlackboardWeakPtr> blackboard = {});
+
+ NodeStatus run(float dt);
+ void clear();
+
+ BlackboardWeakPtr blackboardPtr();
+private:
+ BlackboardPtr board();
+
+ LuaThread nodeLuaThread(String const& funcName);
+
+ NodeStatus runNode(BehaviorNode const& node, NodeState& state);
+
+ NodeStatus runAction(ActionNode const& node, NodeState& state);
+ NodeStatus runDecorator(DecoratorNode const& node, NodeState& state);
+
+ NodeStatus runComposite(CompositeNode const& node, NodeState& state);
+ NodeStatus runSequence(SequenceNode const& node, NodeState& state);
+ NodeStatus runSelector(SelectorNode const& node, NodeState& state);
+ NodeStatus runParallel(ParallelNode const& node, NodeState& state);
+ NodeStatus runDynamic(DynamicNode const& node, NodeState& state);
+ NodeStatus runRandomize(RandomizeNode const& node, NodeState& state);
+
+ BehaviorTreeConstPtr m_tree;
+ NodeState m_rootState;
+
+ LuaTable m_luaContext;
+
+ // The blackboard can either be created and owned by this behavior,
+ // or a blackboard from another behavior can be used
+ Variant<BlackboardPtr, BlackboardWeakPtr> m_board;
+
+ // Keep threads here for recycling
+ List<LuaThread> m_threads;
+ StringMap<LuaFunction> m_functions;
+
+ float m_lastDt;
+};
+
+}
+#endif