Esempio n. 1
0
    /// <summary>
    /// This method tries to change the state the FSM is in based on
    /// the current state and the transition passed. If current state
    ///  doesn't have a target state for the transition passed,
    /// an ERROR message is printed.
    /// </summary>
    public void PerformTransition(FsmTransitionId trans)
    {
        // Check for NullTransition before changing the current state
        if (trans == FsmTransitionId.NullTransition)
        {
            throw new Exception("FSM ERROR: NullTransition is not allowed for a real transition");
        }

        // Check if the currentState has the transition passed as argument
        FsmStateId id = currentState.GetOutputState(trans);

        if (id == FsmStateId.NullStateID)
        {
            throw new Exception("FSM ERROR: State " + currentStateID.ToString() + " does not have a target state " +
                                " for transition " + trans.ToString());
        }

        // Update the currentStateID and currentState
        currentStateID = id;
        foreach (FsmState state in states)
        {
            if (state.ID == currentStateID)
            {
                // Do the post processing of the state before setting the new one
                currentState.DoBeforeLeaving();

                currentState = state;

                // Reset the state to its desired condition before it can reason or act
                currentState.DoBeforeEntering();
                break;
            }
        }
    }     // PerformTransition()
Esempio n. 2
0
    /// <summary>
    /// This method places new states inside the FSM,
    /// or prints an ERROR message if the state was already inside the List.
    /// First state added is also the initial state.
    /// </summary>
    public void AddState(FsmState s)
    {
        // Check for Null reference before deleting
        if (s == null)
        {
            throw new Exception("FSM ERROR: Null reference is not allowed");
        }

        s.SetOwner(this);

        // First State inserted is also the Initial state,
        //   the state the machine is in when the simulation begins
        if (states.Count == 0)
        {
            states.Add(s);
            currentState   = s;
            currentStateID = s.ID;
            return;
        }

        // Add the state to the List if it's not inside it
        foreach (FsmState state in states)
        {
            if (state.ID == s.ID)
            {
                throw new Exception("FSM ERROR: Impossible to add state " + s.ID.ToString() +
                                    " because state has already been added");
            }
        }

        states.Add(s);
    }
Esempio n. 3
0
        public void PerformTransition(Transition t)
        {
            FsmStateId outputState = CurrentState.GetOutPutState(t);

            if (outputState != FsmStateId.None)
            {
                AIState result = fsmstates.Find(alist =>
                {
                    if (alist.OwnFsmStateID == outputState)
                    {
                        return(true);
                    }
                    else
                    {
                        return(false);
                    }
                });
                if (result == null)
                {
                    return;
                }
                _CurrentState   = result;
                _CurrentStateID = result.OwnFsmStateID;
            }
        }
Esempio n. 4
0
 public void StartAI()
 {
     _CurrentState = fsmstates.Find(alist =>
     {
         return(alist.IsInitState);
     });
     _CurrentStateID = _CurrentState.OwnFsmStateID;
     OnInit();
     StartCoroutine(OtherUpdate());
 }
Esempio n. 5
0
    /// <summary>
    /// This method delete a state from the FSM List if it exists,
    ///   or prints an ERROR message if the state was not on the List.
    /// </summary>
    public void DeleteState(FsmStateId id)
    {
        // Check for NullState before deleting
        if (id == FsmStateId.NullStateID)
        {
            throw new Exception("FSM ERROR: NullStateID is not allowed for a real state");
        }

        // Search the List and delete the state if it's inside it
        foreach (FsmState state in states)
        {
            if (state.ID == id)
            {
                states.Remove(state);
                return;
            }
        }

        throw new Exception("FSM ERROR: Impossible to delete state " + id.ToString() +
                            ". It was not on the list of states");
    }
Esempio n. 6
0
    // regular add method
    public void AddTransition(FsmTransitionId trans, FsmStateId id)
    {
        // Check if anyone of the args is invalid
        if (trans == FsmTransitionId.NullTransition)
        {
            throw new Exception("FSMState ERROR: NullTransition is not allowed for a real transition");
        }

        if (id == FsmStateId.NullStateID)
        {
            throw new Exception("FSMState ERROR: NullStateID is not allowed for a real ID");
        }

        // Since this is a Deterministic FSM,
        //   check if the current transition was already inside the map
        if (transitionMap.ContainsKey(trans))
        {
            throw new Exception("FSMState ERROR: State " + stateID.ToString() + " already has transition " + trans.ToString() +
                                "Impossible to assign to another state");
        }

        transitionMap.Add(trans, id);
    }
Esempio n. 7
0
 // fluid interface
 public FsmState WithTransition(FsmTransitionId trans, FsmStateId id)
 {
     AddTransition(trans, id);
     return(this);
 }
Esempio n. 8
0
 public FsmState(FsmStateId _stateId)
 {
     stateID = _stateId;
 }
Esempio n. 9
0
    /// <summary>
    /// This method tries to change the state the FSM is in based on
    /// the current state and the transition passed. If current state
    ///  doesn't have a target state for the transition passed, 
    /// an ERROR message is printed.
    /// </summary>
    public void PerformTransition(FsmTransitionId trans)
    {
        // Check for NullTransition before changing the current state
        if (trans == FsmTransitionId.NullTransition)
        {
            throw new Exception("FSM ERROR: NullTransition is not allowed for a real transition");
        }

        // Check if the currentState has the transition passed as argument
        FsmStateId id = currentState.GetOutputState(trans);
        if (id == FsmStateId.NullStateID)
        {
            throw new Exception("FSM ERROR: State " + currentStateID.ToString() + " does not have a target state " +
                           " for transition " + trans.ToString());
        }

        // Update the currentStateID and currentState
        currentStateID = id;
        foreach (FsmState state in states)
        {
            if (state.ID == currentStateID)
            {
                // Do the post processing of the state before setting the new one
                currentState.DoBeforeLeaving();

                currentState = state;

                // Reset the state to its desired condition before it can reason or act
                currentState.DoBeforeEntering();
                break;
            }
        }
    }
Esempio n. 10
0
    /// <summary>
    /// This method delete a state from the FSM List if it exists, 
    ///   or prints an ERROR message if the state was not on the List.
    /// </summary>
    public void DeleteState(FsmStateId id)
    {
        // Check for NullState before deleting
        if (id == FsmStateId.NullStateID)
        {
            throw new Exception("FSM ERROR: NullStateID is not allowed for a real state");
        }

        // Search the List and delete the state if it's inside it
        foreach (FsmState state in states)
        {
            if (state.ID == id)
            {
                states.Remove(state);
                return;
            }
        }

        throw new Exception("FSM ERROR: Impossible to delete state " + id.ToString() +
                       ". It was not on the list of states");
    }
Esempio n. 11
0
    /// <summary>
    /// This method places new states inside the FSM,
    /// or prints an ERROR message if the state was already inside the List.
    /// First state added is also the initial state.
    /// </summary>
    public void AddState(FsmState s)
    {
        // Check for Null reference before deleting
        if (s == null)
        {
            throw new Exception("FSM ERROR: Null reference is not allowed");
        }

        s.SetOwner(this);

        // First State inserted is also the Initial state,
        //   the state the machine is in when the simulation begins
        if (states.Count == 0)
        {
            states.Add(s);
            currentState = s;
            currentStateID = s.ID;
            return;
        }

        // Add the state to the List if it's not inside it
        foreach (FsmState state in states)
        {
            if (state.ID == s.ID)
            {
                throw new Exception("FSM ERROR: Impossible to add state " + s.ID.ToString() +
                               " because state has already been added");
            }
        }

        states.Add(s);
    }
Esempio n. 12
0
 // fluid interface
 public FsmState WithTransition(FsmTransitionId trans, FsmStateId id)
 {
     AddTransition(trans, id);
     return this;
 }
Esempio n. 13
0
    // regular add method
    public void AddTransition(FsmTransitionId trans, FsmStateId id)
    {
        // Check if anyone of the args is invalid
        if (trans == FsmTransitionId.NullTransition)
        {
            throw new Exception("FSMState ERROR: NullTransition is not allowed for a real transition");
        }

        if (id == FsmStateId.NullStateID)
        {
            throw new Exception("FSMState ERROR: NullStateID is not allowed for a real ID");
        }

        // Since this is a Deterministic FSM,
        //   check if the current transition was already inside the map
        if (transitionMap.ContainsKey(trans))
        {
            throw new Exception("FSMState ERROR: State " + stateID.ToString() + " already has transition " + trans.ToString() +
                           "Impossible to assign to another state");
        }

        transitionMap.Add(trans, id);
    }
Esempio n. 14
0
 public FsmState(FsmStateId _stateId)
 {
     stateID = _stateId;
 }