package com.shade.entities.mushroom;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.geom.Vector2f;
import org.newdawn.slick.state.StateBasedGame;
import com.shade.base.Entity;
import com.shade.base.util.State;
import com.shade.crash.Repelable;
import com.shade.entities.Roles;
import com.shade.util.Geom;
public class PickedShroom implements State {
private Mushroom shroom;
public PickedShroom(Mushroom mushroom) {
shroom = mushroom;
}
public void enter() {
}
public int getRole() {
return Roles.PICKED_MUSHROOM.ordinal();
}
public boolean isNamed(Object o) {
return o == Mushroom.States.PICKED;
}
public void onCollision(Entity obstacle) {
// TODO determine whether this is desired behavior
// if (obstacle.getRole() == Roles.MOLE.ordinal()) {
// shroom.detach();
// ((Linkable) obstacle).attach(shroom);
// }
if (obstacle.getRole() == Roles.OBSTACLE.ordinal()) {
Repelable b = (Repelable) obstacle;
b.repel(shroom);
// check if way too far away, if so break off
if (WrappingUtils.overThreshold(shroom, shroom.prev, 12000)) {
shroom.detach();
shroom.manager.enter(Mushroom.States.NORMAL);
return;
}
}
if (obstacle.getRole() == Roles.BASKET.ordinal()) {
Mushroom.collected.play();
shroom.detach();
shroom.kill();
}
}
public void render(StateBasedGame game, Graphics g) {
shroom.draw();
}
public void update(StateBasedGame game, int delta) {
if (shroom.prev == null) {
shroom.manager.enter(Mushroom.States.NORMAL);
return;
}
if (shroom.prev.getRole() == Roles.BASKET.ordinal()) {
shroom.manager.enter(Mushroom.States.COLLECTED);
return;
}
if (shroom.tooSmall()) {
shroom.kill();
return;
}
// sunny shrink
if (!shroom.inShadows()) {
shroom.shrink();
}
// too far away, catch up
if (WrappingUtils.overThreshold(shroom, shroom.prev, 1200)) {
followLeader();
return;
}
}
private void followLeader() {
float angle = WrappingUtils.calculateAngle(shroom, shroom.prev);
Vector2f v = Geom.calculateVector(Mushroom.SPEED, angle);
shroom.nudge(v.x, v.y);
}
}