package com.shade.entities.treasure;
import org.newdawn.slick.Color;
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.entities.treasure.Treasure.States;
import com.shade.util.Geom;
public class PickedTreasure implements State {
private Treasure treasure;
public PickedTreasure(Treasure t) {
treasure = t;
}
public void enter() {
treasure.open();
}
public int getRole() {
return Roles.TREASURE.ordinal();
}
public boolean isNamed(Object o) {
return o == Treasure.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(treasure);
// check if way too far away, if so break off
if (Util.overThreshold(treasure, treasure.prev, 12000)) {
treasure.detach();
treasure.manager.enter(Treasure.States.NORMAL);
return;
}
}
if (obstacle.getRole() == Roles.BASKET.ordinal()) {
Treasure.collected.play();
treasure.detach();
treasure.finish();
}
}
public void render(StateBasedGame game, Graphics g) {
treasure.draw(g);
}
public void update(StateBasedGame game, int delta) {
if (treasure.prev == null) {
treasure.manager.enter(Treasure.States.NORMAL);
return;
}
if (treasure.prev.getRole() == Roles.BASKET.ordinal()) {
treasure.manager.enter(Treasure.States.COLLECTED);
return;
}
if (treasure.tooSmall()) {
treasure.manager.enter(Treasure.States.RETURNING);
return;
}
// sunny shrink
if (!treasure.inShadows()) {
treasure.shrink(delta);
}
// too far away, catch up
if (Util.overThreshold(treasure, treasure.prev, 1200)) {
followLeader();
return;
}
}
private void followLeader() {
float angle = Util.calculateAngle(treasure, treasure.prev);
Vector2f v = Geom.calculateVector(Treasure.SPEED, angle);
treasure.nudge(v.x, v.y);
}
}