public override void AddTransitions() { this.AddTransitionsTo(CharStates.BLOCK.ToS(), CharStates.IDLE.ToS(), CharStates.MOVE.ToS(), CharStates.FLY.ToS()); //// RELEASE FSMTransition transition = null; transition = new FSMTransition(CharStates.BLOCK.ToS(), CharStates.BLOCK.ToS(Suffixes.Release)); transition.AddConditions( new VarConditionsBuilder() .IgnoringInputs().IgnoringAttributes().IgnoringDirections().IgnoringPositions().IgnoringFlags().IgnoringCombat() .WithVar(CharVars.FromInputMode(this.input), new InputCondition(CharVars.FromInputMode(this.input).ToS(), Operators.EQUAL, InputModes.RELEASE, InputModes.NONE)) .Build() ); this.controller.fsm.RegisterTransition(transition); transition = new FSMTransition(CharStates.BLOCK.ToS(Suffixes.Release), CharStates.FLY.ToS()); transition.AddConditions( new VarConditionsBuilder() .IgnoringInputs().IgnoringAttributes().IgnoringDirections().IgnoringPositions().IgnoringFlags().IgnoringCombat() .WithVar(CharVars.IS_FLYING, new BoolCondition(CharVars.IS_FLYING.ToS(), Operators.EQUAL, true)) .Build() ); transition.AddCondition(new AnimationEndCondition(this.targetObject.GetComponent<Animator>(), CharStates.BLOCK.ToS(Suffixes.Release))); this.controller.fsm.RegisterTransition(transition); transition = new FSMTransition(CharStates.BLOCK.ToS(Suffixes.Release), CharStates.IDLE.ToS()); transition.AddConditions( new VarConditionsBuilder() .IgnoringInputs().IgnoringAttributes().IgnoringDirections().IgnoringPositions().IgnoringFlags().IgnoringCombat() .WithVar(CharVars.IS_FLYING, new BoolCondition(CharVars.IS_FLYING.ToS(), Operators.EQUAL, false)) .Build() ); transition.AddCondition(new AnimationEndCondition(this.targetObject.GetComponent<Animator>(), CharStates.BLOCK.ToS(Suffixes.Release))); this.controller.fsm.RegisterTransition(transition); }
public override void AddTransitions() { FSMTransition transition = null; transition = new FSMTransition(CharStates.FALL.ToS(), CharStates.GLIDE.ToS()); transition.AddConditions( new VarConditionsBuilder() .IgnoringInputs().IgnoringAttributes().IgnoringDirections().IgnoringPositions().IgnoringFlags().IgnoringCombat() .WithVar(CharVars.JUMP_MODE, new InputCondition(CharVars.JUMP_MODE.ToS(), Operators.EQUAL, InputModes.HOLD)) .Build() ); this.controller.fsm.RegisterTransition(transition); transition = new FSMTransition(CharStates.GLIDE.ToS(), CharStates.FALL.ToS()); transition.AddConditions( new VarConditionsBuilder() .IgnoringInputs().IgnoringAttributes().IgnoringDirections().IgnoringPositions().IgnoringFlags().IgnoringCombat() .WithVar(CharVars.JUMP_MODE, new InputCondition(CharVars.JUMP_MODE.ToS(), Operators.EQUAL, InputModes.RELEASE, InputModes.NONE)) .Build() ); this.controller.fsm.RegisterTransition(transition); transition = new FSMTransition(CharStates.GLIDE.ToS(), CharStates.FALL.ToS()); transition.AddConditions( new VarConditionsBuilder() .IgnoringInputs().IgnoringAttributes().IgnoringDirections().IgnoringPositions().IgnoringFlags().IgnoringCombat() .WithVar(CharVars.HIT_GROUND, new BoolCondition(CharVars.HIT_GROUND.ToS(), Operators.EQUAL, true)) .Build() ); this.controller.fsm.RegisterTransition(transition); }
public override void AddTransitions() { this.AddTransitionsTo(CharStates.FALL.ToS(), CharStates.IDLE.ToS(), CharStates.MOVE.ToS(), CharStates.JUMP.ToS(), CharStates.AIR_JUMP.ToS(), CharStates.WALL_JUMP.ToS()); FSMTransition transition = null; string landingState = CharStates.IDLE.ToS(); if (this.softLanding) { landingState = CharStates.CROUCH.ToS(); } transition = new FSMTransition(CharStates.FALL.ToS(), landingState); transition.AddConditions( new VarConditionsBuilder() .IgnoringInputs().IgnoringAttributes().IgnoringDirections().IgnoringPositions().IgnoringFlags().IgnoringCombat() .WithVar(CharVars.HORIZONTAL_MODE, new InputCondition(CharVars.HORIZONTAL_MODE.ToS(), Operators.EQUAL, InputModes.RELEASE, InputModes.NONE)) .WithVar(CharVars.HIT_GROUND, new BoolCondition(CharVars.HIT_GROUND.ToS(), Operators.EQUAL, true)) .Build() ); this.controller.fsm.RegisterTransition(transition); //TODO: Transition to Roll if SoftLanding is enabled? transition = new FSMTransition(CharStates.FALL.ToS(), CharStates.MOVE.ToS()); transition.AddConditions( new VarConditionsBuilder() .IgnoringInputs().IgnoringAttributes().IgnoringDirections().IgnoringPositions().IgnoringFlags().IgnoringCombat() .WithVar(CharVars.HORIZONTAL_MODE, new InputCondition(CharVars.HORIZONTAL_MODE.ToS(), Operators.EQUAL, InputModes.PRESS, InputModes.HOLD)) .WithVar(CharVars.HIT_GROUND, new BoolCondition(CharVars.HIT_GROUND.ToS(), Operators.EQUAL, true)) // .WithVar(CharVars.SPEED_MULTIPLIER, new FloatCondition(CharVars.SPEED_MULTIPLIER.ToS(), Operators.EQUAL, 1f)) .Build() ); this.controller.fsm.RegisterTransition(transition); }
public override void AddTransitions() { FSMTransition transition = null; transition = new FSMTransition(EffectStates.CREATE.ToS(), EffectStates.DESTROY.ToS()); transition.AddCondition(new TimeCondition(this.timeToLive)); this.controller.fsm.RegisterTransition(transition); }
public void ChangeState(FSMTransition stateTransition) { Enum nextStateId = stateTransition.NextStateId; FSMState prevState = CurrentState; if(nextStateId == null) { CurrentState = _stateStack.Pop(); } else { FSMState nextState = GetState(nextStateId); if(nextState == null) throw new Exception("State " + nextStateId.ToString() + " has not been defined."); if(stateTransition.PushCurrentState) _stateStack.Push(CurrentState); CurrentState = nextState; CurrentState.InitState(stateTransition); } Debug.Log("Changed state to: " + CurrentState.StateId.ToString()); CurrentState.EnterState(stateTransition); if(prevState != null && !stateTransition.PushCurrentState) prevState.Dispose(); }
private StateWrapper BuildCharge() { StateWrapper stateWrapper = new StateWrapper(); FSMState state = new ActionState(this.chargeStateName); state.WithDefaultBehaviours(this.gameObject); if (this.animationBehaviour != null) { state.AddStartBehaviour(this.animationBehaviour); } state.AddStartBehaviour(new SetAnimationSpeedBehaviour(this.gameObject, 0f)); state.AddStartBehaviour(new SetVariableBehaviour(this.gameObject, this.chargeVariable, this.initialChargeMultiplier)); foreach (FSMBehaviour behaviour in this.customStartBehaviours) { state.AddStartBehaviour(behaviour); } state.AddUpdateBehaviour(new ChargeBehaviour(this.gameObject, this.chargeVariable, this.maxChargeMultiplier, this.maxChargeSeconds)); state.AddExitBehaviour(new SetAnimationSpeedBehaviour(this.gameObject, 1f)); stateWrapper.state = state; FSMTransition transition = null; foreach (string startingState in this.startingStates) { transition = new FSMTransition(startingState, this.chargeStateName); transition.AddConditions( new VarConditionsBuilder() .IgnoringInputs().IgnoringAttributes().IgnoringDirections().IgnoringPositions().IgnoringFlags().IgnoringCombat() .WithVar(CharVars.FromInputMode(this.input), new InputCondition(CharVars.FromInputMode(this.input).ToS(), Operators.EQUAL, InputModes.PRESS, InputModes.DOUBLE_TAP)) .Build() ); stateWrapper.transitions.Add(transition); } return stateWrapper; }
public override void AddTransitions() { FSMTransition transition = null; // // KNOCKBACK RECOVER // transition = new FSMTransition(CharStates.GET_HIT.ToS(Suffixes.Knockback), CharStates.GET_HIT.ToS(Suffixes.Knockback, Suffixes.Recover)); transition.AddConditions( new VarConditionsBuilder() .IgnoringInputs().IgnoringAttributes().IgnoringDirections().IgnoringPositions().IgnoringFlags().IgnoringCombat() .WithVar(CharVars.HIT_GROUND, new BoolCondition(CharVars.HIT_GROUND.ToS(), Operators.EQUAL, false)) .WithVar(CharVars.GENERIC_COUNTER, new IntCondition(CharVars.GENERIC_COUNTER.ToS(), Operators.EQUAL, this.knockbackRecoverCount)) .Build() ); this.controller.fsm.RegisterTransition(transition); transition = new FSMTransition(CharStates.GET_HIT.ToS(Suffixes.Knockback, Suffixes.Recover), CharStates.FLY.ToS()); transition.AddCondition(new TimeCondition(this.knockbackRecoverDuration)); this.controller.fsm.RegisterTransition(transition); // // DOWN RECOVER // transition = new FSMTransition(CharStates.GET_HIT.ToS(Suffixes.Knockback), CharStates.GET_HIT.ToS(Suffixes.Down, Suffixes.Recover)); transition.AddConditions( new VarConditionsBuilder() .IgnoringInputs().IgnoringAttributes().IgnoringDirections().IgnoringPositions().IgnoringFlags().IgnoringCombat() .WithVar(CharVars.HIT_GROUND, new BoolCondition(CharVars.HIT_GROUND.ToS(), Operators.EQUAL, true)) .WithVar(CharVars.GENERIC_COUNTER, new IntCondition(CharVars.GENERIC_COUNTER.ToS(), Operators.EQUAL, this.knockbackRecoverCount)) .Build() ); this.controller.fsm.RegisterTransition(transition); transition = new FSMTransition(CharStates.GET_HIT.ToS(Suffixes.Down, Suffixes.Recover), CharStates.CROUCH.ToS()); transition.AddCondition(new TimeCondition(this.downRecoverDuration)); this.controller.fsm.RegisterTransition(transition); }
public override void AddTransitions() { FSMTransition transition = null; transition = new FSMTransition(CharStates.FLY.ToS(), CharStates.FLY_FAST.ToS()); transition.AddConditions( new VarConditionsBuilder() .IgnoringInputs().IgnoringAttributes().IgnoringDirections().IgnoringPositions().IgnoringFlags().IgnoringCombat() .WithVar(CharVars.HORIZONTAL_MODE, new InputCondition(CharVars.HORIZONTAL_MODE.ToS(), Operators.EQUAL, InputModes.DOUBLE_TAP)) .Build() ); this.controller.fsm.RegisterTransition(transition); transition = new FSMTransition(CharStates.FLY.ToS(), CharStates.FLY_FAST.ToS()); transition.AddConditions( new VarConditionsBuilder() .IgnoringInputs().IgnoringAttributes().IgnoringDirections().IgnoringPositions().IgnoringFlags().IgnoringCombat() .WithVar(CharVars.VERTICAL_MODE, new InputCondition(CharVars.VERTICAL_MODE.ToS(), Operators.EQUAL, InputModes.DOUBLE_TAP)) .Build() ); this.controller.fsm.RegisterTransition(transition); transition = new FSMTransition(CharStates.FLY_FAST.ToS(), CharStates.FLY.ToS()); transition.AddConditions( new VarConditionsBuilder() .IgnoringInputs().IgnoringAttributes().IgnoringDirections().IgnoringPositions().IgnoringFlags().IgnoringCombat() .WithVar(CharVars.HORIZONTAL_MODE, new InputCondition(CharVars.HORIZONTAL_MODE.ToS(), Operators.EQUAL, InputModes.RELEASE, InputModes.NONE)) .WithVar(CharVars.VERTICAL_MODE, new InputCondition(CharVars.VERTICAL_MODE.ToS(), Operators.EQUAL, InputModes.RELEASE, InputModes.NONE)) .Build() ); this.controller.fsm.RegisterTransition(transition); }
public override void EnterState(FSMTransition transition) { base.EnterState(transition); GameData.Player = PlacePlayer(); GameData.Monks = PlaceMonks(); ExitState(new FSMTransition(GameState.GameReset)); }
public virtual void ExitState(FSMTransition nextStateTransition) { //OnStateExit(nextStateId); if(nextStateTransition == null) throw new Exception("State transition can not be null."); NextStateTransition = nextStateTransition; }
public override void InitState(FSMTransition transition) { base.InitState(transition); _worldScreenManager = GameObject.Find("WorldScreenManager"). GetComponent<WorldScreenManager>(); _camera = Camera.main.GetComponent<BoundedTargetCamera>(); }
public override void EnterState(FSMTransition transition) { base.EnterState(transition); _player = GameData.Player.GetComponent<CharacterController>(); _playerSource = _player.GetComponent<AudioSource>(); _moved = false; _bounds = GetMovementBounds(); }
public override void ExitState(FSMTransition nextStateTransition) { // set up camera transition response _cameraMover.OnMoveBegin -= OnCameraMoveBegin; _cameraMover.OnMoveEnd -= OnCameraMoveEnd; DisableInput(); base.ExitState(nextStateTransition); }
public override void ExitState(FSMTransition transition) { _followCam.Distance = _originalDistance; _source = null; _light.intensity = _originalLightIntensity; _light = null; base.ExitState(transition); }
public override void ExitState(FSMTransition transition) { SetPlayerVisible(true); GameObject.Destroy(_smoke); _smoke = null; _idol.GetComponent<AudioSource>().Stop(); _idol = null; base.ExitState(transition); }
public override void ExitState(FSMTransition nextStateTransition) { _camMover.OnMoveBegin -= OnCameraMoveBegin; _camMover.OnMoveEnd -= OnCameraMoveEnd; _player.GetComponent<RigidBodyMover>().OnMove -= OnPlayerMove; DisableInput(); base.ExitState(nextStateTransition); }
public override void EnterState(FSMTransition transition) { base.EnterState(transition); if(_player == null) _player = GameObject.Find("Player"); XY screenCoord = GameData.CurrentScreenCoord; _navBounds = _worldScreenManager.GetScreenBounds(screenCoord); _camera.Bounds = _worldScreenManager.GetScreenCameraBounds(screenCoord); }
public override void AddTransitions() { FSMTransition transition = null; transition = new FSMTransition(CharStates.GET_HIT.ToS(Suffixes.Fall), CharStates.GET_HIT.ToS(Suffixes.Down)); transition.AddConditions( new VarConditionsBuilder() .IgnoringInputs().IgnoringAttributes().IgnoringDirections().IgnoringPositions().IgnoringFlags().IgnoringCombat() .WithVar(CharVars.HIT_GROUND, new BoolCondition(CharVars.HIT_GROUND.ToS(), Operators.EQUAL, true)) .Build() ); this.controller.fsm.RegisterTransition(transition); }
public override void EnterState(FSMTransition transition) { base.EnterState(transition); _followCam = Camera.main.GetComponent<FollowCamera>(); _originalDistance = _followCam.Distance; _light = (Light)GameObject.Find("Directional Light").GetComponent<Light>(); _originalLightIntensity = _light.intensity; SilenceMonks(); SilenceMusic(); }
public void DeleteTransition(FSMTransition trans) { if (trans == FSMTransition.NullTransition) { return; } if (map.ContainsKey(trans)) { map.Remove(trans); return; } }
public override void ExitState(FSMTransition transition) { Camera.main.GetComponent<FollowCamera>().Target = GameData.Player.transform; GameObject.Destroy(_camTarget); _idol.transform.position = _originalIdolPosition; foreach(GameObject monk in GameData.Monks) { Vector3 monkPos = monk.transform.position; monk.transform.position = new Vector3(monkPos.x, 0, monkPos.z); } base.ExitState(transition); }
void AddTransitionsTo(string toState, params string[] fromStates) { FSMTransition transition = null; foreach (string fromState in fromStates) { transition = new FSMTransition(fromState, toState); transition.AddConditions( new VarConditionsBuilder() .IgnoringInputs().IgnoringAttributes().IgnoringDirections().IgnoringPositions().IgnoringFlags().IgnoringCombat() .WithVar(CharVars.FromInputMode(this.input), new InputCondition(CharVars.FromInputMode(this.input).ToS(), Operators.EQUAL, InputModes.HOLD)) .Build() ); this.controller.fsm.RegisterTransition(transition); } }
public override void EnterState(FSMTransition transition) { base.EnterState(transition); SetPixelAlpha(0); PlayEndMusic(_loseMusic, 0.7f); _idol.GetComponent<AudioSource>().clip = _godChant; _idol.GetComponent<AudioSource>().Play(); _flashFrameDelay = 60; _flashFrameDuration = 5; _flashStarted = false; }
public override void EnterState(FSMTransition transition) { base.EnterState(transition); _camTarget = new GameObject(); _camTarget.transform.position = GameData.Player.transform.position; _idol = GameObject.Find("Idol"); _originalIdolPosition = _idol.transform.position; _idol.GetComponent<AudioSource>().Play(); Camera.main.GetComponent<FollowCamera>().Target = _camTarget.transform; PlayEndMusic(_winMusic); }
public override void AddTransitions() { FSMTransition transition = null; transition = new FSMTransition(CharStates.BLOCK.ToS(), CharStates.BLOCK.ToS(Suffixes.Hit)); transition.AddConditions( new VarConditionsBuilder() .IgnoringInputs().IgnoringAttributes().IgnoringDirections().IgnoringPositions().IgnoringFlags().IgnoringCombat() .WithVar(CharVars.DAMAGE_EFFECT, new IntCondition(CharVars.DAMAGE_EFFECT.ToS(), Operators.EQUAL, (int)AttackEffects.HIT)) .Build() ); this.controller.fsm.RegisterTransition(transition); transition = new FSMTransition(CharStates.BLOCK.ToS(Suffixes.Hit), CharStates.BLOCK.ToS()); transition.AddCondition(new AnimationEndCondition(this.targetObject.GetComponent<Animator>(), CharStates.BLOCK.ToS())); this.controller.fsm.RegisterTransition(transition); }
void AddTransitionsTo(string toState, params string[] fromStates) { FSMTransition transition = null; foreach (string fromState in fromStates) { transition = new FSMTransition(fromState, toState); transition.AddConditions( new VarConditionsBuilder() .IgnoringInputs().IgnoringAttributes().IgnoringDirections().IgnoringPositions().IgnoringFlags().IgnoringCombat() .WithVar(CharVars.VERTICAL_SPEED, new FloatCondition(CharVars.VERTICAL_SPEED.ToS(), Operators.LESS_THAN, 0f)) .WithVar(CharVars.HIT_GROUND, new BoolCondition(CharVars.HIT_GROUND.ToS(), Operators.EQUAL, false)) .Build() ); this.controller.fsm.RegisterTransition(transition); } }
void AddTransitionsTo(string toState, params string[] fromStates) { FSMTransition transition = null; foreach (string fromState in fromStates) { transition = new FSMTransition(fromState, toState); transition.AddConditions( new VarConditionsBuilder() .IgnoringInputs().IgnoringAttributes().IgnoringDirections().IgnoringPositions().IgnoringFlags().IgnoringCombat() .WithVar(CharVars.JUMP_MODE, new InputCondition(CharVars.JUMP_MODE.ToS(), Operators.EQUAL, InputModes.PRESS, InputModes.DOUBLE_TAP)) .WithVar(CharVars.HIT_WALL, new BoolCondition(CharVars.HIT_WALL.ToS(), Operators.EQUAL, true)) .Build() ); this.controller.fsm.RegisterTransition(transition); } }
public override void InitState(FSMTransition transition) { base.InitState(transition); _loseMusic = Resources.Load("Music/Death Bolt") as AudioClip; _godChant = Resources.Load("Music/God Chant") as AudioClip; _smokePrototype = Resources.Load("Prefabs/Smoke") as GameObject; _idol = GameObject.Find("Idol"); _flashColor = Color.white; _flashPixel = new Texture2D(1, 1); _flashPixel.SetPixel(0, 0, _flashColor); _flashPixel.Apply(); }
public void AddTransition(FSMTransition trans, FSMStateId id) { if (trans == FSMTransition.NullTransition) { return; } if (id == FSMStateId.NullState) { return; } if (map.ContainsKey(trans)) { return; } map.Add(trans, id); }
/// This method deletes a pair transition-state from this state´s map. /// If the transition was not inside the state´s map, an ERROR message is printed. public void DeleteTransition(FSMTransition trans) { // Check for NullTransition if (trans == FSMTransition.None) { Debug.LogError("FSMState ERROR: NullTransition is not allowed"); return; } // Check if the pair is inside the map before deleting if (map.ContainsKey(trans)) { map.Remove(trans); return; } Debug.LogError("FSMState ERROR: FSMTransition passed was not on this State´s List"); }
public FSMEdgeView(FSMTransition transition) : base() => Initialize(transition);
public void Initialize(FSMTransition transition) => _transition = transition;
public virtual void EnterState(FSMState prevState) { NextStateTransition = null; }
public virtual void ExitState(FSMTransition nextStateTransition) { //OnStateExit(nextStateId); NextStateTransition = nextStateTransition; }
//meber operation public void SetTransition(FSMTransition transition) { m_fsm.PerformTransition(transition); }
public void AddTransition(FSMTransition transition, FSMState target) { links [transition] = target; }
/// <summary> /// 增加转换条件 /// </summary> /// <param name="fsmTransition"></param> /// <param name="stateID"></param> public void AddTransition(FSMTransition fsmTransition, FSMStateID stateID) { }
/// <summary> /// 删除转换条件 /// </summary> /// <param name="fsmTransition"></param> /// <param name="stateID"></param> public void DeleteTransition(FSMTransition fsmTransition, FSMStateID stateID) { }
/// <summary> /// 根据转换条件获得状态ID /// </summary> /// <param name="fsmTransition"></param> /// <returns></returns> public FSMStateID GetStateIdByTransition(FSMTransition fsmTransition) { }
public void AddTransition(FSMTransition transition) { transitions.Add(transition); }
public override void ExitState(FSMTransition nextStateTransition) { base.ExitState(nextStateTransition); }
void Start() { formation = GetComponent <EnemyFormationManager>(); //States FSMState patrol = new FSMState(); patrol.enterActions.Add(SetGoal); patrol.stayActions.Add(Walk); patrol.exitActions.Add(StopPatrol); FSMState chase = new FSMState(); chase.enterActions.Add(StartChase); chase.stayActions.Add(Chase); chase.exitActions.Add(StopChase); FSMState attack = new FSMState(); attack.enterActions.Add(StartAttack); attack.stayActions.Add(Fight); attack.exitActions.Add(StopAttack); FSMState dead = new FSMState(); dead.enterActions.Add(Dead); FSMState flee = new FSMState(); flee.enterActions.Add(StartFleeing); flee.stayActions.Add(Flee); FSMState recoverHP = new FSMState(); recoverHP.enterActions.Add(StartRecovery); recoverHP.stayActions.Add(RechargeHP); recoverHP.exitActions.Add(StopRecovery); //Transitions FSMTransition t1 = new FSMTransition(ScanField); FSMTransition t2 = new FSMTransition(ScanFieldMoreNear); FSMTransition t3 = new FSMTransition(OutOfLargeRange); FSMTransition t4 = new FSMTransition(OutOfRange); FSMTransition t5 = new FSMTransition(CompletedBattle); FSMTransition t6 = new FSMTransition(LowHp); FSMTransition t7 = new FSMTransition(IsDead); FSMTransition t8 = new FSMTransition(DeadDuringEscape); FSMTransition t9 = new FSMTransition(DistanceFromRecovery); FSMTransition t10 = new FSMTransition(CompletedRecharge); FSMTransition t11 = new FSMTransition(ChaseDuringRecharge); // Link states with transitions patrol.AddTransition(t1, chase); chase.AddTransition(t2, attack); chase.AddTransition(t3, patrol); attack.AddTransition(t4, chase); attack.AddTransition(t5, patrol); attack.AddTransition(t6, flee); attack.AddTransition(t7, dead); flee.AddTransition(t8, dead); flee.AddTransition(t9, recoverHP); recoverHP.AddTransition(t10, patrol); recoverHP.AddTransition(t11, chase); // Setup a FSA at initial state fsm = new FSM(patrol); // Start monitoring StartCoroutine(Patrol()); }
public override void ExitState(FSMTransition nextStateTransition) { DisableInput(); base.ExitState(nextStateTransition); }
public FSMState NextState(FSMTransition t) { return(links[t]); }