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 Digging extends Behaviour
{
private int stepsOfDigging;
@Override
public void cancel()
{
stepsOfDigging = 0;
}
@Override
public boolean checkTriggered( Rabbit rabbit, World world )
{
BehaviourTools t = new BehaviourTools( rabbit, world );
return t.pickUpToken( dig );
}
@Override
public State newState( BehaviourTools t, boolean triggered )
{
if ( !triggered && stepsOfDigging == 0 )
{
return null;
}
if ( t.rabbit.state == RABBIT_DIGGING )
{
stepsOfDigging = 1;
return RABBIT_DIGGING_2;
}
if (
triggered
|| stepsOfDigging > 0
)
{
if ( t.rabbit.onSlope && t.blockHere() != null )
{
stepsOfDigging = 1;
return RABBIT_DIGGING_ON_SLOPE;
}
else if ( t.blockBelow() != null )
{
if ( t.blockBelow().material == Block.Material.METAL )
{
stepsOfDigging = 0;
return RABBIT_DIGGING_USELESSLY;
}
else
{
stepsOfDigging = 2;
return RABBIT_DIGGING;
}
}
}
--stepsOfDigging;
return null;
}
@Override
public boolean behave( World world, Rabbit rabbit, State state )
{
switch ( state )
{
case RABBIT_DIGGING:
{
world.changes.removeBlockAt( rabbit.x, rabbit.y + 1 );
++rabbit.y;
return true;
}
case RABBIT_DIGGING_ON_SLOPE:
{
world.changes.removeBlockAt( rabbit.x, rabbit.y );
rabbit.onSlope = false;
return true;
}
case RABBIT_DIGGING_2:
case RABBIT_DIGGING_USELESSLY:
{
return true;
}
default:
{
return false;
}
}
}
@Override
public void saveState( Map<String, String> saveState )
{
BehaviourState.addToStateIfGtZero(
saveState, "Digging.stepsOfDigging", stepsOfDigging );
}
@Override
public void restoreFromState( Map<String, String> saveState )
{
stepsOfDigging = BehaviourState.restoreFromState(
saveState, "Digging.stepsOfDigging", stepsOfDigging );
}
}