include "lib_fsm.bmd" include "stdlib.bmd" int moveCounter; int counterMax; void init (point p) { moveCounter = 10; counterMax = 10; } void doNothing0 (point p) { return; } void doNothing1 () { return; } bool alwaysTrue (fsmStateInformation info) { return true; } move moveEast (environment env) { move ret; ret.direction = moveDirection.East; ret.placeBomb = false; ret.detonate = false; moveCounter -= 1; return ret; } move moveSouth (environment env) { move ret; ret.direction = moveDirection.South; ret.placeBomb = false; ret.detonate = false; moveCounter -= 1; return ret; } move waitSouth (environment env) { move ret; ret.direction = moveDirection.Void; ret.placeBomb = false; ret.detonate = false; moveCounter -= 1; return ret; } move moveNorthStart (environment env) { move ret; ret.direction = moveDirection.North; ret.placeBomb = true; ret.detonate = true; moveCounter -= 1; return ret; } move moveNorth (environment env) { move ret; ret.direction = moveDirection.North; ret.placeBomb = false; ret.detonate = false; moveCounter -= 1; return ret; } move waitEast (environment env) { move ret; ret.direction = moveDirection.Void; ret.placeBomb = false; ret.detonate = false; moveCounter -= 1; return ret; } move moveWestStart (environment env) { move ret; ret.direction = moveDirection.West; ret.placeBomb = false; ret.detonate = false; moveCounter -= 1; return ret; } move moveWest (environment env) { move ret; ret.direction = moveDirection.West; ret.placeBomb = false; ret.detonate = false; moveCounter -= 1; return ret; } void resetCounter() { //counterMax += 1; moveCounter = counterMax; } bool isCounterDone(fsmStateInformation info) { return ((moveCounter < 0) || (moveCounter = 0)); } stateMachine ai { stateMachineInit: init; state moveEastState { onInit: resetCounter; onMoveRequest: moveEast; onTeammateDeath: doNothing1; onBombDetonate: doNothing0; onDeath: doNothing1; stateTransition { transitionPredicates: isCounterDone; transitionTargets: moveWestStartState 1.0; } } state moveWestStartState { onInit: resetCounter; onMoveRequest: moveWestStart; onTeammateDeath: doNothing1; onBombDetonate: doNothing0; onDeath: doNothing1; stateTransition { transitionPredicates: alwaysTrue; transitionTargets: moveWestState 1.0; } } state moveWestState { onInit: doNothing1; onMoveRequest: moveWest; onTeammateDeath: doNothing1; onBombDetonate: doNothing0; onDeath: doNothing1; stateTransition { transitionPredicates: isCounterDone; transitionTargets: moveSouthState 1.0; } } state moveSouthState { onInit: resetCounter; onMoveRequest: moveSouth; onTeammateDeath: doNothing1; onBombDetonate: doNothing0; onDeath: doNothing1; stateTransition { transitionPredicates: isCounterDone; transitionTargets: moveNorthStartState 1.0; } } state moveNorthStartState { onInit: resetCounter; onMoveRequest: moveNorthStart; onTeammateDeath: doNothing1; onBombDetonate: doNothing0; onDeath: doNothing1; stateTransition { transitionPredicates: alwaysTrue; transitionTargets: moveNorthState 1.0; } } state moveNorthState { onInit: doNothing1; onMoveRequest: moveNorth; onTeammateDeath: doNothing1; onBombDetonate: doNothing0; onDeath: doNothing1; stateTransition{ transitionPredicates: isCounterDone; transitionTargets: moveEastState 1.0; } } } void main () { finiteStateMachine fsm = ai(); registerFSM(fsm); }