package rabbitescape.engine.behaviours; import static rabbitescape.engine.ChangeDescription.State.*; import static rabbitescape.engine.Direction.*; import static rabbitescape.engine.Token.Type.*; import java.util.Map; import rabbitescape.engine.*; import rabbitescape.engine.ChangeDescription.State; public class Bashing extends Behaviour { private int stepsOfBashing; @Override public void cancel() { stepsOfBashing = 0; } @Override public boolean checkTriggered( Rabbit rabbit, World world ) { BehaviourTools t = new BehaviourTools( rabbit, world ); return t.pickUpToken( bash ); } @Override public State newState( BehaviourTools t, boolean triggered ) { if ( triggered || stepsOfBashing > 0 ) { if ( t.isOnUpSlope() && t.blockAboveNext() != null ) { if (t.blockAboveNext().material == Block.Material.METAL) { stepsOfBashing = 0; return t.rl( RABBIT_BASHING_USELESSLY_RIGHT_UP, RABBIT_BASHING_USELESSLY_LEFT_UP ); } else { stepsOfBashing = 2; return t.rl( RABBIT_BASHING_UP_RIGHT, RABBIT_BASHING_UP_LEFT ); } } else if ( t.isOnUpSlope() && t.blockAboveNext() == null && triggered ) { return t.rl( RABBIT_BASHING_USELESSLY_RIGHT_UP, RABBIT_BASHING_USELESSLY_LEFT_UP ); } else if ( t.blockNext() != null ) { if ( t.blockNext().material == Block.Material.METAL ) { stepsOfBashing = 0; return t.rl( RABBIT_BASHING_USELESSLY_RIGHT, RABBIT_BASHING_USELESSLY_LEFT ); } else { stepsOfBashing = 2; return t.rl( RABBIT_BASHING_RIGHT, RABBIT_BASHING_LEFT ); } } else if ( triggered ) { return t.rl( RABBIT_BASHING_USELESSLY_RIGHT, RABBIT_BASHING_USELESSLY_LEFT ); } } --stepsOfBashing; return null; } @Override public boolean behave( World world, Rabbit rabbit, State state ) { switch ( state ) { case RABBIT_BASHING_RIGHT: case RABBIT_BASHING_LEFT: { world.changes.removeBlockAt( destX( rabbit ), rabbit.y ); return true; } case RABBIT_BASHING_UP_RIGHT: case RABBIT_BASHING_UP_LEFT: { world.changes.removeBlockAt( destX( rabbit ), rabbit.y - 1 ); rabbit.y -= 1; return true; } case RABBIT_BASHING_USELESSLY_RIGHT: case RABBIT_BASHING_USELESSLY_LEFT: { return true; } case RABBIT_BASHING_USELESSLY_RIGHT_UP: case RABBIT_BASHING_USELESSLY_LEFT_UP: { rabbit.y -= 1; return true; } default: { return false; } } } private int destX( Rabbit rabbit ) { return ( rabbit.dir == RIGHT ) ? rabbit.x + 1 : rabbit.x - 1; } @Override public void saveState( Map<String, String> saveState ) { BehaviourState.addToStateIfGtZero( saveState, "Bashing.stepsOfBashing", stepsOfBashing ); } @Override public void restoreFromState( Map<String, String> saveState ) { stepsOfBashing = BehaviourState.restoreFromState( saveState, "Bashing.stepsOfBashing", stepsOfBashing ); if ( stepsOfBashing > 0 ) { ++stepsOfBashing; } } }