First, thanks for your great stateless framework, Nicholas!
I have a quick question: in my state-machine I have a superstate S ("battle phase") with three sub-states, A, B, and C. I want to be able to reenter S from within C, but when I call the trigger T from within C, it seems to exit 'back' into S but does not call S.OnExit / S.OnEnter unless I fire T a second time (seems like I'm doing something wrong...) The configuration is below:
// configure "prebattle" state
BattleSM.Configure(FSM.Battle.PreBattle.Instance)
.OnEntry( () => FSM.Battle.PreBattle.Instance.Entering(BattleSM) )
.OnExit( () => FSM.Battle.PreBattle.Instance.Exiting(BattleSM) )
.Permit(BattleFSMTrigger.StartPhase, FSM.Battle.BattlePhase.Instance);
// configure "thinking" state (sub-state of BattlePhase)
BattleSM.Configure(FSM.Battle.Thinking.Instance)
.OnEntry( () => FSM.Battle.Thinking.Instance.Entering(BattleSM) )
.OnExit( () => FSM.Battle.Thinking.Instance.Exiting(BattleSM) )
.Permit(BattleFSMTrigger.StartMoving, FSM.Battle.Moving.Instance)
.SubstateOf(FSM.Battle.BattlePhase.Instance);
// configure "moving" state (sub-state of BattlePhase)
BattleSM.Configure(FSM.Battle.Moving.Instance)
.OnEntry( () => FSM.Battle.Moving.Instance.Entering(BattleSM) )
.OnExit( () => FSM.Battle.Moving.Instance.Exiting(BattleSM) )
.Permit(BattleFSMTrigger.StopMoving, FSM.Battle.DoAction.Instance)
.SubstateOf(FSM.Battle.BattlePhase.Instance);
// configure "do action" state (sub-state of BattlePhase)
BattleSM.Configure(FSM.Battle.DoAction.Instance)
.OnEntry( () => FSM.Battle.DoAction.Instance.Entering(BattleSM) )
.OnExit( () => FSM.Battle.DoAction.Instance.Exiting(BattleSM) )
.Permit(BattleFSMTrigger.NextTurn, FSM.Battle.Thinking.Instance )
.Permit(BattleFSMTrigger.EndBattle, FSM.Battle.BattleDone.Instance)
.SubstateOf(FSM.Battle.BattlePhase.Instance);
// configure "battle phase" super-state
BattleSM.Configure(FSM.Battle.BattlePhase.Instance)
.OnEntry( () => FSM.Battle.BattlePhase.Instance.Entering(BattleSM) )
.OnExit( () => FSM.Battle.BattlePhase.Instance.Exiting(BattleSM) )
.Permit(BattleFSMTrigger.NextTurn, FSM.Battle.Thinking.Instance )
.PermitReentry(BattleFSMTrigger.StartPhase);
// configure "battle done" state
BattleSM.Configure(FSM.Battle.BattleDone.Instance)
.OnEntry( () => FSM.Battle.BattleDone.Instance.Entering(BattleSM) )
.OnExit( () => FSM.Battle.BattleDone.Instance.Exiting(BattleSM) );
I'm trying to attach a diagram (.png format) of my state-machine as well.
Cheers,
-Arun