diff options
Diffstat (limited to 'src/libjin/ai/je_state_machine.cpp')
-rw-r--r-- | src/libjin/ai/je_state_machine.cpp | 96 |
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; |