/// <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()
/// <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); }
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; } }
public void StartAI() { _CurrentState = fsmstates.Find(alist => { return(alist.IsInitState); }); _CurrentStateID = _CurrentState.OwnFsmStateID; OnInit(); StartCoroutine(OtherUpdate()); }
/// <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"); }
// 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); }
// fluid interface public FsmState WithTransition(FsmTransitionId trans, FsmStateId id) { AddTransition(trans, id); return(this); }
public FsmState(FsmStateId _stateId) { stateID = _stateId; }
/// <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; } } }
// fluid interface public FsmState WithTransition(FsmTransitionId trans, FsmStateId id) { AddTransition(trans, id); return this; }