package rabbitescape.engine;
import static rabbitescape.engine.ChangeDescription.State.*;
import static rabbitescape.engine.Direction.*;
import java.util.HashMap;
import java.util.Map;
public class Entrance extends Thing
{
private int[] delay = new int[1];
private int timeToNextRabbit;
private int rabbitEntranceCount = 0;
private World world;
public Entrance( int x, int y )
{
super( x, y, ENTRANCE );
delay[0] = -1;
timeToNextRabbit = 0;
rabbitEntranceCount = 0;
}
@Override
public void calcNewState( World world )
{
if ( delay[0] == -1 )
{
delay = world.rabbit_delay;
}
}
@Override
public void step( World world )
{
this.world = world;
if ( world.num_waiting <= 0 )
{
return;
}
if ( timeToNextRabbit == 0 )
{
birthRabbit( world );
}
--timeToNextRabbit;
}
private void birthRabbit( World world )
{
int delayIndex;
delayIndex = rabbitEntranceCount >= delay.length ? delay.length-1 : rabbitEntranceCount ;
rabbitEntranceCount++ ;
timeToNextRabbit = delay[delayIndex];
Rabbit r = new Rabbit( x, y + 1, RIGHT );
world.changes.enterRabbit( r );
world.rabbitIndex( r );
}
@Override
public Map<String, String> saveState()
{
Map<String, String> ret = new HashMap<String, String>();
BehaviourState.addToStateIfGtZero(
ret, "Entrance.timeToNextRabbit", timeToNextRabbit
);
return ret;
}
@Override
public void restoreFromState( Map<String, String> state )
{
timeToNextRabbit = BehaviourState.restoreFromState(
state, "Entrance.timeToNextRabbit", timeToNextRabbit
);
}
@Override
public String overlayText()
{
return null == world ? "Entrance" : "Entrance\n" + world.num_waiting + " to come";
}
}