aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/ai/je_state_machine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libjin/ai/je_state_machine.cpp')
-rw-r--r--src/libjin/ai/je_state_machine.cpp96
1 files changed, 65 insertions, 31 deletions
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;