package rabbitescape.engine.behaviours;
import static rabbitescape.engine.ChangeDescription.State.*;
import static rabbitescape.engine.Token.Type.brolly;
import java.util.Map;
import rabbitescape.engine.Behaviour;
import rabbitescape.engine.BehaviourState;
import rabbitescape.engine.BehaviourTools;
import rabbitescape.engine.Block;
import rabbitescape.engine.ChangeDescription.State;
import rabbitescape.engine.Rabbit;
import rabbitescape.engine.World;
public class Brollychuting extends Behaviour
{
boolean hasAbility = false;
private final Climbing climbing;
public Brollychuting( Climbing climbing)
{
this.climbing = climbing;
}
@Override
public State newState( BehaviourTools t, boolean triggered )
{
if ( triggered )
{
hasAbility = true;
}
if( !hasAbility )
{
return null;
}
if ( climbing.abilityActive )
{
return null;
}
Block below = t.blockBelow();
if ( t.isFlat( below ) )
{
return null;
}
if (
t.rabbit.onSlope
&& !t.blockHereJustRemoved()
)
{
return null;
}
if ( below != null )
{
if ( t.isUpSlope( below ) )
{
return t.rl(
RABBIT_FALLING_1_ONTO_RISE_RIGHT,
RABBIT_FALLING_1_ONTO_RISE_LEFT
);
}
else // Must be a slope in the opposite direction
{
return t.rl(
RABBIT_FALLING_1_ONTO_LOWER_RIGHT,
RABBIT_FALLING_1_ONTO_LOWER_LEFT
);
}
}
return RABBIT_BROLLYCHUTING;
}
@Override
public boolean behave( World world, Rabbit rabbit, State state )
{
if ( state == RABBIT_BROLLYCHUTING )
{
rabbit.y = rabbit.y + 1;
return true;
}
return false;
}
public boolean hasBrolly()
{
return hasAbility;
}
@Override
public boolean checkTriggered( Rabbit rabbit, World world )
{
BehaviourTools t = new BehaviourTools( rabbit, world );
if ( !hasAbility && t.pickUpToken( brolly, true ) )
{
return true;
}
if( !hasAbility )
{
return false;
}
if ( climbing.abilityActive || rabbit.state == RABBIT_DIGGING )
{
return false;
}
if ( t.isFlat( t.blockBelow() ) )
{
return false;
}
if (
rabbit.onSlope
&& !t.blockHereJustRemoved()
)
{
return false;
}
return true;
}
@Override
public void cancel()
{
}
@Override
public void saveState( Map<String, String> saveState )
{
BehaviourState.addToStateIfTrue(
saveState, "Brollychuting.hasAbility", hasAbility
);
}
@Override
public void restoreFromState( Map<String, String> saveState )
{
hasAbility = BehaviourState.restoreFromState(
saveState, "Brollychuting.hasAbility", hasAbility
);
}
}