package rts.core.engine.layers.entities.vehicles;
import java.awt.Point;
import java.util.ArrayList;
import org.newdawn.slick.Color;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.SlickException;
import rts.core.engine.Engine;
import rts.core.engine.PlayerInput;
import rts.core.engine.Utils;
import rts.core.engine.layers.entities.ActiveEntity;
import rts.core.engine.layers.entities.EData;
public class Transport extends Mover implements ITransport {
private static final int MAX = 5;
private ArrayList<Mover> candidates;
private ArrayList<Mover> ents;
public Transport(Engine engine, boolean marine, int playerId, int teamId, int networkId) {
super(engine, (marine) ? EData.MOVER_MARINE_TRANSPORT : EData.MOVER_TRANSPORT, playerId, teamId, networkId);
candidates = new ArrayList<Mover>(5);
ents = new ArrayList<Mover>();
}
@Override
protected boolean specialTarget(ActiveEntity target) {
if (super.specialTarget(target))
return true;
if (target == this && !ents.isEmpty()) {
int tx = (int) this.x / engine.getTileW();
int ty = (int) this.y / engine.getTileH();
for (int i = 0; i < ents.size(); i++) {
Mover m = ents.get(i);
for (int j = 0; j < Utils.DIRECTIONS.length; j++) {
if (!engine.getMap().blocked(m, tx + Utils.DIRECTIONS[j][0], ty + Utils.DIRECTIONS[j][1])) {
m.setDirection(j);
m.show(tx + Utils.DIRECTIONS[j][0], ty + Utils.DIRECTIONS[j][1]);
candidates.add(m);
break;
}
}
}
for (int i = 0; i < candidates.size(); i++)
if (ents.contains(candidates.get(i)))
ents.remove(candidates.get(i));
return true;
} else
return false;
}
@Override
protected void destroy() {
super.destroy();
for (int i = 0; i < candidates.size(); i++) {
candidates.get(i).cancelTransport();
}
for (int i = 0; i < ents.size(); i++) {
ents.get(i).remove();
}
}
@Override
public int getTargetCursor(ActiveEntity target, int mx, int my) {
if (target != null) {
if (engine.getMap().fogOn(mx / engine.getTileW(), my / engine.getTileH())) {
return PlayerInput.CURSOR_MOVE;
} else {
if (target == this && !ents.isEmpty())
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 renderEntity(GameContainer container, Graphics g) throws SlickException {
super.renderEntity(container, g);
if (selected && engine.isPlayerEntity(playerId)) {
for (int i = 0; i < MAX; i++) {
if (i < ents.size()) {
g.setColor(Color.blue);
g.fillRect(x + (i * 4), y - 9, 4, 4);
}
g.setColor(Color.black);
g.drawRect(x + (i * 4), y - 9, 4, 4);
}
}
}
@Override
public void updateEntity(GameContainer container, int delta) throws SlickException {
super.updateEntity(container, delta);
for (int i = 0; i < candidates.size(); i++) {
Mover m = candidates.get(i);
if (m.isAlive() && m.isGoingToTransport() && !ents.contains(m)) {
if (m.isStopped()) {
int tx = (int) this.x / engine.getTileW();
int ty = (int) this.y / engine.getTileH();
if (Math.abs(tx - (m.getX() / engine.getTileW())) <= 1 && Math.abs(ty - (m.getY() / engine.getTileH())) <= 1) {
m.hide();
ents.add(m);
candidates.remove(m);
}
}
} else
candidates.remove(m);
}
}
@Override
public Point transport(Mover entity) {
if (ents.size() < MAX && candidates.size() < MAX) {
int tx = (int) this.x / engine.getTileW();
int ty = (int) this.y / engine.getTileH();
for (int i = 0; i < Utils.DIRECTIONS.length; i++) {
if (!engine.getMap().blocked(entity, tx + Utils.DIRECTIONS[i][0], ty + Utils.DIRECTIONS[i][1])) {
candidates.add(entity);
return new Point(tx + Utils.DIRECTIONS[i][0], ty + Utils.DIRECTIONS[i][1]);
}
}
}
return null;
}
}