Esempio n. 1
0
    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
        }
    }
Esempio n. 2
0
    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);
    }
Esempio n. 3
0
    /// <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);
    }