package rabbitescape.engine.behaviours; import static rabbitescape.engine.CellularDirection.DOWN; import static rabbitescape.engine.CellularDirection.UP; import rabbitescape.engine.Behaviour; import rabbitescape.engine.BehaviourTools; import rabbitescape.engine.CellularDirection; import rabbitescape.engine.ChangeDescription.State; import rabbitescape.engine.Rabbit; import rabbitescape.engine.WaterRegion; import rabbitescape.engine.World; public class Drowning extends Behaviour { @Override public void cancel() { } @Override public boolean checkTriggered( Rabbit rabbit, World world ) { int yCoordinate = rabbit.y; CellularDirection directionToCheck = UP; if ( rabbit.onSlope ) { // The rabbit's head is at the bottom of the cell above. yCoordinate = rabbit.y - 1; directionToCheck = DOWN; } // TODO Find out why the rabbit's y coordinate is allowed to be larger than the size of the world (see solution for easy-12). if ( yCoordinate < 0 || yCoordinate >= world.size.height ) { return false; } for ( WaterRegion waterRegion : world.waterTable.getItemsAt( rabbit.x, yCoordinate ) ) { if ( waterRegion.isConnected( directionToCheck ) ) { return ( waterRegion.getContents() >= waterRegion.capacity ); } } return false; } @Override public State newState( BehaviourTools t, boolean triggered ) { return ( triggered ? State.RABBIT_DROWNING : null ); } @Override public boolean behave( World world, Rabbit rabbit, State state ) { switch ( state ) { case RABBIT_DROWNING: world.changes.killRabbit( rabbit ); return true; default: return false; } } }