package rabbitescape.engine.behaviours; import static rabbitescape.engine.ChangeDescription.State.*; import static rabbitescape.engine.Token.Type.*; import java.util.Map; import rabbitescape.engine.*; import rabbitescape.engine.ChangeDescription.State; public class Blocking extends Behaviour { public boolean abilityActive = false; @Override public void cancel() { abilityActive = false; } @Override public boolean checkTriggered( Rabbit rabbit, World world ) { BehaviourTools t = new BehaviourTools( rabbit, world ); return t.pickUpToken( block ); } @Override public State newState( BehaviourTools t, boolean triggered ) { if ( abilityActive || triggered ) { abilityActive = true; Block here = t.blockHere(); if( BehaviourTools.isRightRiseSlope( here ) ) { return RABBIT_BLOCKING_RISE_RIGHT; } else if ( BehaviourTools.isLeftRiseSlope( here ) ) { return RABBIT_BLOCKING_RISE_LEFT; } else { return RABBIT_BLOCKING; } } return null; } @Override public boolean behave( World world, Rabbit rabbit, State state ) { return isBlocking( state ); } @Override public void saveState( Map<String, String> saveState ) { BehaviourState.addToStateIfTrue( saveState, "Blocking.abilityActive", abilityActive ); } @Override public void restoreFromState( Map<String, String> saveState ) { abilityActive = BehaviourState.restoreFromState( saveState, "Blocking.abilityActive", abilityActive ); } public static boolean blockerAt( World world, int nextX, int nextY ) { Rabbit[] rabbits = world.getRabbitsAt( nextX, nextY ); for ( Rabbit r : rabbits ) { if ( isBlocking( r.state ) ) { return true; } } return false; } private static boolean isBlocking( State s ) { switch ( s ) { case RABBIT_BLOCKING: case RABBIT_BLOCKING_RISE_RIGHT: case RABBIT_BLOCKING_RISE_LEFT: return true; default: return false; } } }