aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/ai
diff options
context:
space:
mode:
Diffstat (limited to 'src/libjin/ai')
-rw-r--r--src/libjin/ai/je_behavior_tree.h2
-rw-r--r--src/libjin/ai/je_state_machine.cpp96
-rw-r--r--src/libjin/ai/je_state_machine.h38
3 files changed, 85 insertions, 51 deletions
diff --git a/src/libjin/ai/je_behavior_tree.h b/src/libjin/ai/je_behavior_tree.h
index cb518f0..8621696 100644
--- a/src/libjin/ai/je_behavior_tree.h
+++ b/src/libjin/ai/je_behavior_tree.h
@@ -9,8 +9,6 @@ namespace JinEngine
namespace AI
{
-
-
///
///
///
diff --git a/src/libjin/ai/je_state_machine.cpp b/src/libjin/ai/je_state_machine.cpp
index 8f8bd81..9b766b5 100644
--- a/src/libjin/ai/je_state_machine.cpp
+++ b/src/libjin/ai/je_state_machine.cpp
@@ -88,7 +88,6 @@ namespace JinEngine
mMode = mode;
}
- //ģʽ״̬
void StateMachine::update()
{
switch (mMode)
@@ -109,10 +108,42 @@ namespace JinEngine
Parameter& p = it->second;
switch (p.type)
{
- case ParameterType::Int: return p.value._int == condition.value._int;
- case ParameterType::Float: return p.value._float == condition.value._float;
- case ParameterType::Bool: return p.value._bool == condition.value._bool;
- case ParameterType::Trigger: return p.value._trigger == true;
+ case ParameterType::Int:
+ {
+ int value = p.value._int;
+ int cvalue = condition.value._int;
+ bool is = false;
+ is |= ((condition.expression & ParameterExpression::INT_BIGGER) ? value > cvalue : false);
+ is |= ((condition.expression & ParameterExpression::INT_EQUAL) ? value == cvalue : false);
+ is |= ((condition.expression & ParameterExpression::INT_SMALLER) ? value < cvalue : false);
+ return is;
+ }
+ case ParameterType::Float:
+ {
+ float value = p.value._float;
+ float cvalue = condition.value._float;
+ bool is = false;
+ is |= ((condition.expression & ParameterExpression::FLOAT_BIGGER) ? value > cvalue : false);
+ is |= ((condition.expression & ParameterExpression::FLOAT_EQUAL) ? value == cvalue : false);
+ is |= ((condition.expression & ParameterExpression::FLOAT_SMALLER) ? value < cvalue : false);
+ return is;
+ }
+ case ParameterType::Bool:
+ {
+ bool value = p.value._bool;
+ bool cvalue = condition.value._bool;
+ bool is = false;
+ is |= ((condition.expression & ParameterExpression::BOOL_IS) ? value == cvalue : false);
+ is |= ((condition.expression & ParameterExpression::BOOL_NOT) ? value != cvalue : false);
+ return is;
+ }
+ case ParameterType::Trigger:
+ {
+ bool is = p.value._trigger;
+ // Close trigger.
+ p.value._trigger = false;
+ return is;
+ }
}
return false;
}
@@ -197,7 +228,7 @@ namespace JinEngine
}
}
- void StateMachine::addTransitioni(const std::string& stateFrom, const std::string& stateTo, const std::string& name, int value)
+ void StateMachine::addTransitioni(const std::string& stateFrom, const std::string& stateTo, const std::string& name, ParameterExpression expression, int value)
{
map<string, State>::iterator it;
it = mStates.find(stateFrom);
@@ -224,17 +255,18 @@ namespace JinEngine
Parameter& parameter = itp->second;
if (parameter.type != ParameterType::Int)
{
- jin_log_error("The type of parameter called %s is %s, but the transition gives a int value.", name, parameterTypeString(parameter.type));
+ jin_log_error("The type of parameter %s is %s, but the transition gives a int value.", name, parameterTypeString(parameter.type));
return;
}
- Transition trasition;
- trasition.condition.parameter = name;
- trasition.condition.value._int = value;
- trasition.state = stateTo;
- from.transitions.push_back(trasition);
+ Transition transition;
+ transition.condition.parameter = name;
+ transition.condition.expression = expression;
+ transition.condition.value._int = value;
+ transition.state = stateTo;
+ from.transitions.push_back(transition);
}
- void StateMachine::addTransitionf(const std::string& stateFrom, const std::string& stateTo, const std::string& name, float value)
+ void StateMachine::addTransitionf(const std::string& stateFrom, const std::string& stateTo, const std::string& name, ParameterExpression expression, float value)
{
map<string, State>::iterator it;
it = mStates.find(stateFrom);
@@ -261,17 +293,18 @@ namespace JinEngine
Parameter& parameter = itp->second;
if (parameter.type != ParameterType::Float)
{
- jin_log_error("The type of parameter called %s is %s, but the transition gives a float value.", name, parameterTypeString(parameter.type));
+ jin_log_error("The type of parameter %s is %s, but the transition gives a float value.", name, parameterTypeString(parameter.type));
return;
}
- Transition trasition;
- trasition.condition.parameter = name;
- trasition.condition.value._float = value;
- trasition.state = stateTo;
- from.transitions.push_back(trasition);
+ Transition transition;
+ transition.condition.parameter = name;
+ transition.condition.expression = expression;
+ transition.condition.value._float = value;
+ transition.state = stateTo;
+ from.transitions.push_back(transition);
}
- void StateMachine::addTransitionb(const std::string& stateFrom, const std::string& stateTo, const std::string& name, bool value)
+ void StateMachine::addTransitionb(const std::string& stateFrom, const std::string& stateTo, const std::string& name, ParameterExpression expression, bool value)
{
map<string, State>::iterator it;
it = mStates.find(stateFrom);
@@ -298,14 +331,15 @@ namespace JinEngine
Parameter& parameter = itp->second;
if (parameter.type != ParameterType::Bool)
{
- jin_log_error("The type of parameter called %s is %s, but the transition gives a bool value.", name, parameterTypeString(parameter.type));
+ jin_log_error("The type of parameter %s is %s, but the transition gives a bool value.", name, parameterTypeString(parameter.type));
return;
}
- Transition trasition;
- trasition.condition.parameter = name;
- trasition.condition.value._bool = value;
- trasition.state = stateTo;
- from.transitions.push_back(trasition);
+ Transition transition;
+ transition.condition.parameter = name;
+ transition.condition.expression = expression;
+ transition.condition.value._bool = value;
+ transition.state = stateTo;
+ from.transitions.push_back(transition);
}
void StateMachine::addTransitiont(const std::string& stateFrom, const std::string& stateTo, const std::string& name)
@@ -335,7 +369,7 @@ namespace JinEngine
Parameter& parameter = itp->second;
if (parameter.type != ParameterType::Trigger)
{
- jin_log_error("The type of parameter called %s is %s, but the transition gives a trigger value.", name, parameterTypeString(parameter.type));
+ jin_log_error("The type of parameter %s is %s, but the transition gives a trigger value.", name, parameterTypeString(parameter.type));
return;
}
Transition trasition;
@@ -356,7 +390,7 @@ namespace JinEngine
Parameter& p = it->second;
if (p.type != ParameterType::Int)
{
- jin_log_error("The type of parameter called %s is %s, but try to assign a int value to it", name, parameterTypeString(p.type));
+ jin_log_error("The type of parameter %s is %s, but try to assign a int value to it", name, parameterTypeString(p.type));
return;
}
p.value._int = value;
@@ -373,7 +407,7 @@ namespace JinEngine
Parameter& p = it->second;
if (p.type != ParameterType::Float)
{
- jin_log_error("The type of parameter called %s is %s, but try to assign a float value to it", name, parameterTypeString(p.type));
+ jin_log_error("The type of parameter %s is %s, but try to assign a float value to it", name, parameterTypeString(p.type));
return;
}
p.value._float = value;
@@ -390,7 +424,7 @@ namespace JinEngine
Parameter& p = it->second;
if (p.type != ParameterType::Bool)
{
- jin_log_error("The type of parameter called %s is %s, but try to assign a bool value to it", name, parameterTypeString(p.type));
+ jin_log_error("The type of parameter %s is %s, but try to assign a bool value to it", name, parameterTypeString(p.type));
return;
}
p.value._bool = value;
@@ -407,7 +441,7 @@ namespace JinEngine
Parameter& p = it->second;
if (p.type != ParameterType::Trigger)
{
- jin_log_error("The type of parameter called %s is %s, but try to assign a trigger value to it", name, parameterTypeString(p.type));
+ jin_log_error("The type of parameter %s is %s, but try to assign a trigger value to it", name, parameterTypeString(p.type));
return;
}
p.value._trigger = true;
diff --git a/src/libjin/ai/je_state_machine.h b/src/libjin/ai/je_state_machine.h
index 7d638c4..1765e97 100644
--- a/src/libjin/ai/je_state_machine.h
+++ b/src/libjin/ai/je_state_machine.h
@@ -34,6 +34,23 @@ namespace JinEngine
///
///
///
+ enum ParameterExpression
+ {
+ INT_BIGGER = 0x02,
+ INT_SMALLER = 0x04,
+ INT_EQUAL = 0x08,
+
+ FLOAT_BIGGER = 0x10,
+ FLOAT_SMALLER = 0x20,
+ FLOAT_EQUAL = 0x40,
+
+ BOOL_IS = 0x80,
+ BOOL_NOT = 0x100,
+ };
+
+ ///
+ ///
+ ///
typedef void(StateChangeCallback)(void* userdata);
///
@@ -104,17 +121,17 @@ namespace JinEngine
///
///
///
- void addTransitioni(const std::string& stateFrom, const std::string& stateTo, const std::string& name, int value);
+ 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, float 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, bool value);
+ void addTransitionb(const std::string& stateFrom, const std::string& stateTo, const std::string& name, ParameterExpression condition, bool value);
///
///
@@ -200,21 +217,6 @@ namespace JinEngine
ParameterValue value;
};
- enum ParameterExpression
- {
- //
- INT_BIGGER = 0x02,
- INT_SMALLER = 0x04,
- INT_EQUAL = 0x08,
- //
- FLOAT_BIGGER = 0x10,
- FLOAT_SMALLER = 0x20,
- FLOAT_EQUAL = 0x40,
- //
- BOOL_IS = 0x80,
- BOOL_NOT = 0x100,
- };
-
///
/// Traslation's condition.
///