Example #1
0
    public void InitialiseFSM(string startingState, FSMLoader load, AIMotorActions aiM, AIConditionChecker aiC, Transform parentT)
    {
        loader      = load;
        activeState = loader.GetState(startingState);

        motorActions     = aiM;
        conditionChecker = aiC;
        parentTransform  = parentT;

        fsmCounter        = new FSMCounter();
        fsmCounter.timer  = 0f;
        fsmCounter.frames = 0;

        if (activeState.GetAction() == Action.RUN_SUB_FSM)
        {
            SpawnFSMStartingWithState(activeState.GetStartingSubstate());
        }
    }
    public bool TestCondition(Condition condition, float param, FSMCounter counter)
    {
        switch (condition)
        {
        case Condition.TIMER:
        {
            if (counter.timer > param)
            {
                return(true);
            }
            break;
        }

        case Condition.FRAMES:
        {
            if (counter.frames >= (Mathf.CeilToInt(param)))
            {
                return(true);
            }
            break;
        }

        case Condition.TARGET_IN_RADIUS:
        {
            if (Vector3.Magnitude(goals.GetTargetPosition() - parentTransform.position) < param)
            {
                return(true);
            }
            break;
        }

        case Condition.TARGET_OUTSIDE_RADIUS:
        {
            if (Vector3.Magnitude(goals.GetTargetPosition() - parentTransform.position) > param)
            {
                return(true);
            }
            break;
        }

        case Condition.TARGET_IN_LOS:
        {
            if (raycastSensors.IsGameobjectInLOS(goals.GetTargetObject()))
            {
                return(true);
            }
            break;
        }

        case Condition.TARGET_IN_OCTANT_BELOW:
        {
            FindTargetOctant();
            if (horOctant == 0f && vertOctant < 0)
            {
                return(true);
            }
            break;
        }

        case Condition.TARGET_IN_OCTANT_ABOVE:
        {
            FindTargetOctant();
            if (horOctant == 0f && vertOctant > 0)
            {
                return(true);
            }
            break;
        }

        case Condition.TARGET_IN_HORIZONTAL_OCTANTS:
        {
            FindTargetOctant();
            if (horOctant != 0f && vertOctant == 0)
            {
                return(true);
            }
            break;
        }

        case Condition.TARGET_IN_FRONT_OCTANT:
        {
            FindTargetOctant();
            if (horOctant == goals.GetForwardDirection() && vertOctant == 0)
            {
                return(true);
            }
            break;
        }

        case Condition.TARGET_IN_FRONT_HORIZONTAL:
        {
            FindTargetDistances();
            if (Mathf.Sign(horDistance) == Mathf.Sign(goals.GetForwardDirection()))
            {
                if (Mathf.Abs(vertDistance) < verticalSpottingHeight)
                {
                    return(true);
                }
            }
            break;
        }

        case Condition.CLIFF_LEFT:
        {
            if (raycastSensors.GetLeftCliff())
            {
                return(true);
            }
            break;
        }

        case Condition.CLIFF_RIGHT:
        {
            if (raycastSensors.GetRightCliff())
            {
                return(true);
            }
            break;
        }

        case Condition.CLIFF_FORWARD:
        {
            if (contactSensor.GetContactState() != ContactState.AIRBORNE)                        //Don't look for cliffs if already airborne...
            {
                if (goals.GetForwardDirection() == 1)
                {
                    if (raycastSensors.GetRightCliff())
                    {
                        return(true);
                    }
                }
                else
                {
                    if (raycastSensors.GetLeftCliff())
                    {
                        return(true);
                    }
                }
            }
            break;
        }

        case Condition.ALWAYS:
        {
            return(true);

            break;
        }
        }
        return(false);
    }