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.h199
1 files changed, 141 insertions, 58 deletions
diff --git a/src/libjin/ai/je_state_machine.h b/src/libjin/ai/je_state_machine.h
index 1765e97..f53137e 100644
--- a/src/libjin/ai/je_state_machine.h
+++ b/src/libjin/ai/je_state_machine.h
@@ -7,6 +7,7 @@
#include <map>
#include <vector>
+#include "../common/je_temporary.h"
#include "../common/je_types.h"
#include "../common/je_object.h"
@@ -14,23 +15,14 @@ namespace JinEngine
{
namespace AI
{
+ // Grab from Unity.
///
/// A single layer statemachine.
///
class StateMachine : public Object
{
- public:
-
- ///
- ///
- ///
- enum Mode
- {
- Iterative, ///< Process until reach condition failed.(May cause endless loop)
- Stepwise ///< Process one state each update.
- };
-
+ public:
///
///
///
@@ -48,6 +40,113 @@ namespace JinEngine
BOOL_NOT = 0x100,
};
+ private:
+ ///
+ ///
+ ///
+ enum ParameterType
+ {
+ Int, ///< A integer value.
+ Float, ///< A float value.
+ Bool, ///< A bool value.
+ Trigger ///< A trigger will be reset to false after activated.
+ };
+
+ ///
+ ///
+ ///
+ union ParameterValue
+ {
+ int _int; ///< 0 by default.
+ float _float; ///< 0 by default.
+ bool _bool; ///< false by default.
+ bool _trigger; ///< false by default.
+ };
+
+ ///
+ /// Traslation's condition.
+ ///
+ struct Condition
+ {
+ std::string parameter;
+ ParameterExpression expression;
+ ParameterType type;
+ ParameterValue value;
+ };
+
+ public:
+ ///
+ ///
+ ///
+ enum Mode
+ {
+ Iterative, ///< Process until reach condition failed.(May cause endless loop)
+ Stepwise ///< Process one state each update.
+ };
+
+ struct Conditions : Temporary
+ {
+ Conditions()
+ {
+ }
+
+ Conditions(const Conditions& condition)
+ {
+ conditions = condition.conditions;
+ }
+
+ void operator = (const Conditions& condition)
+ {
+ conditions = condition.conditions;
+ }
+
+ inline Conditions& andi(const std::string& parameter, ParameterExpression expression, int value)
+ {
+ Condition condition;
+ condition.expression = expression;
+ condition.parameter = parameter;
+ condition.value._int = value;
+ condition.type = ParameterType::Int;
+ conditions.push_back(condition);
+ return *this;
+ }
+
+ inline Conditions& andf(const std::string& parameter, ParameterExpression expression , float value)
+ {
+ Condition condition;
+ condition.expression = expression;
+ condition.parameter = parameter;
+ condition.value._int = value;
+ condition.type = ParameterType::Float;
+ conditions.push_back(condition);
+ return *this;
+ }
+
+ inline Conditions& andb(const std::string& parameter, ParameterExpression expression, bool value)
+ {
+ Condition condition;
+ condition.expression = expression;
+ condition.parameter = parameter;
+ condition.value._int = value;
+ condition.type = ParameterType::Bool;
+ conditions.push_back(condition);
+ return *this;
+ }
+
+ inline Conditions& andt(const std::string& parameter)
+ {
+ Condition condition;
+ condition.parameter = parameter;
+ condition.type = ParameterType::Trigger;
+ conditions.push_back(condition);
+ return *this;
+ }
+
+ private:
+ friend class StateMachine;
+ std::vector<Condition> conditions;
+ };
+
///
///
///
@@ -56,6 +155,11 @@ namespace JinEngine
///
///
///
+ typedef void(StateUpdateCallback)(void* userdata);
+
+ ///
+ ///
+ ///
typedef void(StateTranslateCallback)(void* userdata);
///
@@ -117,26 +221,11 @@ namespace JinEngine
/// Add a state.
///
void addState(const std::string& name);
-
- ///
- ///
- ///
- void addTransitioni(const std::string& stateFrom, const std::string& stateTo, const std::string& name, ParameterExpression condition, int value);
-
- ///
- ///
- ///
- void addTransitionf(const std::string& stateFrom, const std::string& stateTo, const std::string& name, ParameterExpression condition, float value);
-
- ///
- ///
- ///
- void addTransitionb(const std::string& stateFrom, const std::string& stateTo, const std::string& name, ParameterExpression condition, bool value);
-
+
///
///
///
- void addTransitiont(const std::string& stateFrom, const std::string& stateTo, const std::string& name);
+ void addTransition(const std::string& from, const std::string& to, const Conditions& conditions);
///
/// Set parameter value.
@@ -169,6 +258,11 @@ namespace JinEngine
void addEnterListener(const std::string& state, StateChangeCallback* callback);
///
+ /// Call state update function.
+ ///
+ void addUpdateListener(const std::string& state, StateUpdateCallback* callback);
+
+ ///
///
///
void addExitListener(const std::string& state, StateChangeCallback* callback);
@@ -186,6 +280,11 @@ namespace JinEngine
///
///
///
+ void setUpdateListener(SingleStateCallback* callback);
+
+ ///
+ ///
+ ///
void setExitListener(SingleStateCallback* callback);
///
@@ -195,45 +294,19 @@ namespace JinEngine
private:
- enum ParameterType
- {
- Int, ///< A integer value.
- Float, ///< A float value.
- Bool, ///< A bool value.
- Trigger ///< A trigger will be reset to false after activated.
- };
-
- union ParameterValue
- {
- int _int; ///< 0 by default.
- float _float; ///< 0 by default.
- bool _bool; ///< false by default.
- bool _trigger; ///< false by default.
- };
-
struct Parameter
{
ParameterType type;
ParameterValue value;
};
- ///
- /// Traslation's condition.
- ///
- struct Condition
- {
- std::string parameter;
- ParameterExpression expression;
- ParameterValue value;
- };
-
///
/// Translate to another state.
///
struct Transition
{
- Condition condition; ///< Condition to active transition.
- std::string state; ///< State to translate to.
+ Conditions conditions; ///< Condition to active transition.
+ std::string state; ///< State to translate to.
};
///
@@ -284,6 +357,11 @@ namespace JinEngine
///
///
///
+ std::map<std::string, StateUpdateCallback*> mOnUpdateState;
+
+ ///
+ ///
+ ///
std::map<std::string, StateChangeCallback*> mOnExitState;
///
@@ -294,8 +372,13 @@ namespace JinEngine
///
///
///
- SingleStateCallback* mEnterCallback;
-
+ SingleStateCallback* mEnterCallback;
+
+ ///
+ ///
+ ///
+ SingleStateCallback* mUpdateCallback;
+
///
///
///