package rts.core.engine.layers.entities.vehicles;
import java.awt.Point;
import org.newdawn.slick.Animation;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.SpriteSheet;
import rts.core.engine.Engine;
import rts.core.engine.GameSound;
import rts.core.engine.PlayerInput;
import rts.core.engine.layers.Layer;
import rts.core.engine.layers.entities.ActiveEntity;
import rts.core.engine.layers.entities.EData;
import rts.core.engine.layers.entities.MoveableEntity;
import rts.core.engine.layers.entities.buildings.BigHealer;
import rts.core.engine.layers.entities.buildings.Healer;
import rts.core.engine.layers.entities.effects.Explosion;
import rts.core.engine.layers.entities.others.Mineral;
import rts.core.engine.layers.entities.projectiles.Bullet;
import rts.core.engine.layers.entities.projectiles.Flame;
import rts.utils.Colors;
import rts.utils.ResourceManager;
import rts.utils.Timer;
public class Mover extends MoveableEntity {
private Animation animation;
private Timer fireTimer;
private boolean goToTransport;
private boolean goToHealer;
private boolean goToBigHealer;
public Mover(Engine engine, int type, int playerId, int teamId, int networkId) {
super(engine, EData.TEC_LEVEL[type], 0, type, EData.MAX_LIFE[type], EData.VIEW[type], playerId, teamId, networkId);
this.speed = EData.SPEED[type];
this.calcViewLimit(0, 0);
int c = engine.getPlayer(playerId).getColor();
this.color = Colors.getColor(c);
SpriteSheet ss = null;
int pos = 0;
if (EData.isEarthMover(type)) {
ss = ResourceManager.getSpriteSheet("earth_" + c);
this.moveType = EARTH_ONLY;
this.layer = Layer.EARTH_MARINE_ENT;
pos = type;
} else {
if (EData.isMarineMover(type)) {
ss = ResourceManager.getSpriteSheet("water_" + c);
this.moveType = WATER_ONLY;
this.layer = Layer.EARTH_MARINE_ENT;
pos = type - EData.MAX_EARTH_ENTITES;
} else {
if (EData.isSkyMover(type)) {
ss = ResourceManager.getSpriteSheet("fly_" + c);
this.moveType = EVERYWHERE;
this.layer = Layer.FLIGHT_ENT;
pos = type - (EData.MAX_EARTH_ENTITES + EData.MAX_MARINE_ENTITES);
}
}
}
this.width = ss.getSprite(0, 0).getWidth();
this.height = ss.getSprite(0, 0).getHeight();
animation = new Animation(false);
for (int i = 0; i < 8; i++) {
animation.addFrame(ss.getSprite(i, pos), 10);
}
this.fireTimer = new Timer(EData.SHOOT_INTERVAL[type]);
}
public void selected() {
super.selected();
if (engine.isPlayerEntity(playerId))
GameSound.selectMover();
}
@Override
public void setLocation(float x, float y) {
super.setLocation(x, y);
checkFowFromView();
}
@Override
public void renderEntity(GameContainer container, Graphics g) throws SlickException {
g.drawImage(animation.getImage(direction), x, y);
}
@Override
public void renderOnMiniMap(Graphics g, float x, float y, float tw, float th) {
g.setColor(color);
g.fillRect(x, y, tw, th);
}
@Override
public void updateEntity(GameContainer container, int delta) throws SlickException {
super.updateEntity(container, delta);
fireTimer.update(delta);
}
@Override
protected void destroy() {
if (visible)
engine.addEntity(new Explosion(engine, Layer.SECOND_EFFECT, Explosion.NORMAL_2, x, y));
}
@Override
protected void fireOnTarget(ActiveEntity target) {
if (fireTimer.isTimeComplete()) {
if (this.type == EData.MOVER_FLAME_LAUNCHER || this.type == EData.MOVER_FLAME_LAUNCHER) {
engine.addEntity(new Flame(engine, this, target));
} else
engine.addEntity(new Bullet(engine, this, target, EData.BULLET_TYPE[type], 15, 15));
fireTimer.resetTime();
}
}
@Override
public int getTargetCursor(ActiveEntity target, int mx, int my) {
if (target != null && target.isAlive()) {
if (engine.getMap().fogOn(mx / engine.getTileW(), my / engine.getTileH())) {
return PlayerInput.CURSOR_MOVE;
} else {
if ((target.getTeamId() != teamId) && !(target instanceof Mineral)) {
return PlayerInput.CURSOR_ATTACK;
} else {
if (engine.isPlayerEntity(target.getPlayerId())
&& (target instanceof ITransport || target instanceof Healer || target instanceof BigHealer)) {
return PlayerInput.CURSOR_SPECIAL_ACTION;
}
}
}
} else {
if (!engine.getMap().isBlocked(mx / engine.getTileW(), my / engine.getTileH()))
return PlayerInput.CURSOR_MOVE;
}
return PlayerInput.CURSOR_NO_ACTION;
}
@Override
public void moveFromPlayerAction(int mx, int my) {
super.moveFromPlayerAction(mx, my);
goToTransport = false;
GameSound.moverMove();
}
@Override
protected boolean specialTarget(ActiveEntity target) {
if (target instanceof BigHealer) {
BigHealer bh = (BigHealer) target;
Point p = bh.getFreeLocation(this);
if (p != null) {
this.move(p.x * engine.getTileW(), p.y * engine.getTileH());
}
return true;
} else {
if (target instanceof Healer) {
Healer h = (Healer) target;
if (!h.isReserved()) {
h.reserved(this);
this.move((int) target.getX(), (int) target.getY());
}
return true;
}
}
return false;
}
@Override
protected boolean canGoToTransport(ActiveEntity target) {
if (target.getTeamId() == teamId && !(this instanceof ITransport) && target instanceof ITransport && this.type < EData.MAX_EARTH_ENTITES) {
Point p = ((ITransport) target).transport(this);
if (p != null) {
move(p.x * engine.getTileW(), p.y * engine.getTileH());
if (path != null) {
goToTransport = true;
}
}
return true;
} else
return false;
}
public boolean isGoingToTransport() {
return goToTransport;
}
public boolean isGoingToHealer() {
return goToHealer;
}
public boolean isGoingToBigHealer() {
return goToBigHealer;
}
public void hide() {
path = null;
goToTransport = false;
goToHealer = false;
goToBigHealer = false;
selected = false;
visible = false;
engine.getMap().removeEntityLocation(this, (int) x / engine.getTileW(), (int) y / engine.getTileH());
}
public void show(int x, int y) {
this.x = x * engine.getTileW();
this.y = y * engine.getTileH();
engine.getMap().addEntityLocation(this, true, x, y);
visible = true;
}
public void cancelTransport() {
goToTransport = false;
}
public void cancelHealer() {
goToHealer = false;
}
public void cancelBigHealer() {
goToBigHealer = false;
}
@Override
public boolean fogOnUnit() {
return engine.getMap().fogOn((int) x / engine.getTileW(), (int) y / engine.getTileH());
}
}