aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/ai/je_state_machine.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libjin/ai/je_state_machine.h')
-rw-r--r--src/libjin/ai/je_state_machine.h118
1 files changed, 117 insertions, 1 deletions
diff --git a/src/libjin/ai/je_state_machine.h b/src/libjin/ai/je_state_machine.h
index 7869925..0d19be9 100644
--- a/src/libjin/ai/je_state_machine.h
+++ b/src/libjin/ai/je_state_machine.h
@@ -4,17 +4,133 @@
#include "../core/je_configuration.h"
#if defined(jin_ai)
+#include <map>
+#include <vector>
+
+#include "../common/je_object.h"
+
namespace JinEngine
{
namespace AI
{
+ // From Unity3D game engine.
+
+ class State;
+
+ enum ConditionType
+ {
+
+ };
///
+ /// Traslation's condition.
///
+ struct Condition
+ {
+
+ };
+
+ ///
+ /// Translate to another state.
+ ///
+ struct Transition
+ {
+ Condition condition; ///< Condition to active transition.
+ State* state; ///< State translate to.
+ };
+
+ ///
+ /// Definition of state.
///
- class StateMachine
+ struct StateDef
{
+ };
+
+ ///
+ /// A single state.
+ ///
+ struct State
+ {
+ std::string name; ///< Name of state.
+ std::vector<Transition> translations; ///< All transitions this state have.
+ StateDef definition; ///< Definition of state.
+ void* userdata; ///< A state could have a user data.
+ };
+
+ ///
+ /// A single layer statemachine.
+ ///
+ class StateMachine : public Object
+ {
+ public:
+ ///
+ ///
+ ///
+ typedef void(*SingleStateCallback)(State* state);
+
+ ///
+ ///
+ ///
+ typedef void(*DoubleStateCallback)(State* stateFrom, State* stateTo);
+
+ ///
+ /// State machine constructor.
+ ///
+ StateMachine();
+
+ ///
+ /// State machine destructor.
+ ///
+ ~StateMachine();
+
+ ///
+ /// Update statemachine.
+ ///
+ void onUpdate();
+
+ ///
+ /// Add new state.
+ ///
+ void addState(const std::string& name, const State& state);
+
+ ///
+ /// Get state reference by given state name.
+ ///
+ const State* getState(const std::string& name);
+
+ void addEnterListener();
+ void addExitListener();
+ void addTranslateListener();
+
+ const std::string& getCurrentStateName();
+ const State* getCurrentState();
+
+ private:
+ ///
+ /// All state this state machine keeps.
+ ///
+ std::map<std::string, State> mStates;
+
+ ///
+ ///
+ ///
+ std::map<std::string, SingleStateCallback> mOnEnterState;
+
+ ///
+ ///
+ ///
+ std::map<std::string, SingleStateCallback> mOnExitState;
+
+ ///
+ /// From first to second.
+ ///
+ std::map<std::pair<std::string, std::string>, DoubleStateCallback> mOnStateTranslate;
+ ///
+ /// Current state.
+ ///
+ State* mCurrentState;
+
};
}