private bool CheckCondition(TransitionInfo.Condition condition, long lv, double dv, bool bv) { switch (condition.mode) { case ConditionMode.If: return(bv); case ConditionMode.IfNot: return(!bv); case ConditionMode.Greater: return(condition.CheckGreater(dv, lv)); case ConditionMode.Less: return(condition.CheckLess(dv, lv)); case ConditionMode.Equals: return(condition.CheckEquals(dv, lv)); case ConditionMode.NotEqual: return(condition.CheckNotEquals(dv, lv)); case ConditionMode.Contains: return(condition.isKey ? condition.CheckContainsKey(lv) : condition.CheckContains(lv)); case ConditionMode.Except: return(condition.isKey ? condition.CheckExceptKey(lv) : condition.CheckExcept(lv)); case ConditionMode.Between: return(condition.CheckBetween(dv, lv)); case ConditionMode.NotBetween: return(condition.CheckNotBetween(dv, lv)); case ConditionMode.GEquals: return(condition.CheckGEquals(dv, lv)); case ConditionMode.LEquals: return(condition.CheckLEquals(dv, lv)); default: return(true); // Invalid condition mode always return true because we ignore it } }
private bool CheckKeyCondition(TransitionInfo.Condition condition, int key) { var nk = key >> 7 * stateMachine.keyIndex & 0x7F; var k = condition.isMask ? key : nk & 0x1F; var passed = CheckCondition(condition, k, k, k != 0); if (!passed) { return(false); } if (m_acceptInverseKey && nk.BitMask(5) && !target.info.preventTurn) { forceTurn = true; } return(true); }
/// <summary> /// Check current state transition /// </summary> /// <param name="now">Current state</param> /// <returns>High 8 bit: mask Low 8 bit: TransitionCheckResults</returns> public int Check(StateMachineState now) { if (!m_hasKeyCondition && stateMachine.keyIndex > 0) { return(FAILED); } forceTurn = false; if (target.level == 0 || // state locked info.hasExitTime && !now.ended || // exit time check info.noSelfTransition && target == now || // self transition check !info.noExitCondition && !stateMachine.GetBool(StateMachineParam.exit) || // exit frame check !info.noDeadCondition && stateMachine.GetBool(StateMachineParam.isDead) || // dead check !info.noFreezCondition && stateMachine.freezing || // freezing state check m_dismissKeyCondition && stateMachine.GetLong(StateMachineParam.process) > 1 // ignore key transition check ) { return(FAILED); } var cool = target.coolingDown; if (!m_hasKeyCondition && cool) { return(FAILED); // pre cooldown check } var infoResult = m_hasKeyCondition && stateMachine.keyIsFirstCheck; var cs = info.conditions; var paramIdx = -1; StateMachineParam param = null; TransitionInfo.Condition failed = null; failed = CheckConditions(cs, 0, info.itemConditionEnd, ref paramIdx, ref param); // Check group and item requirement if (failed != null) { return(FAILED); } failed = CheckConditions(cs, info.itemConditionEnd, info.keyConditionEnd, ref paramIdx, ref param); // Check key condition if (failed != null) { return(FAILED); } if (cool) { return(infoResult ? SPELL_COOLING_DOWN : FAILED); } failed = CheckConditions(cs, info.keyConditionEnd, cs.Length, ref paramIdx, ref param); if (failed != null) { return(infoResult ? failed.isRage && rageCost > 0 || failed.isRageRate && rageRateCost > 0 ? NOT_ENOUGH_RAGE : failed.isEnergy && energyCost > 0 || failed.isEnergyRate && energyRateCost > 0 ? NOT_ENOUGH_ENERGY : info.forceUIResult != 0 ? info.forceUIResult : FAILED : FAILED); } var trace = target.info.trackDistance * 0.1; // dm -> m if (trace > 0) { var c = stateMachine.creature; var tar = Util.SelectNearestTarget(c, trace, true); if (!tar) { return(info.forceUIResult != 0 ? info.forceUIResult : FAILED); } else { if (!c.TargetInFront(tar)) { c.TurnBack(); } c.position_ = tar.position_; } } return(info.preventInputReset ? (1 << 8) : PASSED); }