package rts.core.engine.layers;
import java.util.ArrayList;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.SlickException;
import rts.core.engine.Engine;
import rts.core.engine.Utils;
import rts.core.engine.layers.entities.ActiveEntity;
import rts.core.engine.layers.entities.IEntity;
import rts.core.engine.layers.entities.INetworkEntity;
import rts.core.engine.layers.entities.MoveableEntity;
import rts.core.engine.layers.entities.buildings.Building;
import rts.core.engine.layers.entities.others.Mineral;
import rts.core.network.ig_udp_containers.EntityState;
public class Layer {
public static final int FIRST_EFFECT = 0;
public static final int EARTH_MARINE_ENT = 1;
public static final int SECOND_EFFECT = 2;
public static final int FLIGHT_ENT = 3;
public static final int THIRD_EFFECT = 4;
private int id;
private boolean visible;
private ArrayList<IEntity> array;
private Engine engine;
public Layer(Engine engine, int id) {
this.engine = engine;
this.id = id;
this.array = new ArrayList<IEntity>();
this.visible = true;
}
// TRUNG NGUYEN need to get all the entities to use in the engine to select closest units to a point
public ArrayList<IEntity> getArray() {
return array;
}
public void render(GameContainer container, Graphics g) throws SlickException {
if (visible) {
for (int i = 0; i < array.size(); i++) {
array.get(i).render(container, g);
}
}
}
public void renderInfos(Graphics g) {
if (visible) {
for (int i = 0; i < array.size(); i++) {
if (array.get(i) instanceof ActiveEntity) {
((ActiveEntity) array.get(i)).renderInfos(g);
}
}
}
}
public void updateAll(GameContainer container, int delta) throws SlickException {
for (int i = 0; i < array.size(); i++) {
array.get(i).update(container, delta);
// Must check the size because an update can remove an entity
if (i < array.size() && array.get(i) instanceof ActiveEntity) {
engine.addEntToCount(((ActiveEntity) array.get(i)).getPlayerId());
}
}
}
public void addEntity(IEntity e) {
array.add(e);
}
public void removeEntity(IEntity e) {
array.remove(e);
}
public void removeAllEntity(int playerId) {
for (int i = 0; i < array.size(); i++) {
if (array.get(i) instanceof ActiveEntity && ((ActiveEntity) array.get(i)).getPlayerId() == playerId) {
((ActiveEntity) array.get(i)).remove();
i--;
}
}
}
// Network
public void removeEntity(int networkId) {
for (int i = 0; i < array.size(); i++) {
if (array.get(i) instanceof ActiveEntity && ((ActiveEntity) array.get(i)).getNetworkID() == networkId) {
((ActiveEntity) array.get(i)).setLife(0);
((ActiveEntity) array.get(i)).remove();
break;
}
}
}
public void updateEntityState(EntityState entityState) {
for (int i = 0; i < array.size(); i++) {
if (array.get(i) instanceof ActiveEntity && ((ActiveEntity) array.get(i)).getNetworkID() == entityState.networkId) {
((ActiveEntity) array.get(i)).setState(entityState);
}
}
}
// End Network
public void deselectAllEntities() {
for (int i = 0; i < array.size(); i++) {
if (array.get(i) instanceof ActiveEntity) {
((ActiveEntity) array.get(i)).deselected();
}
}
}
public ArrayList<ActiveEntity> getPlayerSelectedEntities(int playerId) {
ArrayList<ActiveEntity> a = new ArrayList<ActiveEntity>();
for (int i = 0; i < array.size(); i++) {
if (array.get(i) instanceof ActiveEntity && ((ActiveEntity) array.get(i)).isSelected() && ((ActiveEntity) array.get(i)).getPlayerId() == playerId) {
a.add((ActiveEntity) array.get(i));
}
}
return a;
}
public ArrayList<EntityState> getPlayerEntitiesState(int playerId) {
ArrayList<EntityState> a = new ArrayList<EntityState>();
for (int i = 0; i < array.size(); i++) {
if (array.get(i) instanceof ActiveEntity && ((ActiveEntity) array.get(i)).getPlayerId() == playerId) {
a.add(((ActiveEntity) array.get(i)).getState());
}
}
return a;
}
public ArrayList<MoveableEntity> getSelectedMoveableEntities(int x, int y) {
ArrayList<MoveableEntity> a = new ArrayList<MoveableEntity>();
for (int i = 0; i < array.size(); i++) {
if (array.get(i) instanceof MoveableEntity && ((ActiveEntity) array.get(i)).isSelected()) {
a.add((MoveableEntity) array.get(i));
}
}
return a;
}
public void selectEntitiesBetween(int sx, int sy, int mx, int my) {
for (int i = 0; i < array.size(); i++) {
if (array.get(i) instanceof ActiveEntity && !(array.get(i) instanceof Building)) {
ActiveEntity e = (ActiveEntity) array.get(i);
if (e.getPlayerId() == engine.getPlayer().getId() && (e.getX() + e.getWidth() > sx && e.getX() + e.getWidth() < mx)
&& (e.getY() + e.getHeight() > sy && e.getY() + e.getHeight() < my)) {
e.selected();
} else
e.deselected();
}
}
}
public ArrayList<Building> getPlayerBuilding() {
ArrayList<Building> a = new ArrayList<Building>();
for (int i = 0; i < array.size(); i++) {
if (array.get(i) instanceof Building) {
Building b = (Building) array.get(i);
if (engine.isPlayerEntity(b.getPlayerId())) {
a.add(b);
}
}
}
return a;
}
public void removeNetworkEntity(int networkId) {
for (int i = 0; i < array.size(); i++) {
if (array.get(i) instanceof INetworkEntity && ((INetworkEntity) array.get(i)).getNetworkID() == networkId) {
array.remove(i);
break;
}
}
}
public Mineral getCloserMineral(ActiveEntity entity) {
Mineral mineral = null;
float lastDist = 0;
for (int i = 0; i < array.size(); i++) {
if (array.get(i) instanceof Mineral) {
float newDistance = Utils.getDistanceBetween(entity.getX(), entity.getY(), array.get(i).getX(), array.get(i).getY());
if (mineral == null) {
mineral = (Mineral) array.get(i);
lastDist = newDistance;
} else {
if (newDistance < lastDist
&& !engine.getMap().isEntityBlocked((int) array.get(i).getX() / engine.getTileW(), (int) array.get(i).getY() / engine.getTileH())) {
mineral = (Mineral) array.get(i);
lastDist = newDistance;
}
}
}
}
return mineral;
}
public void clear() {
array.clear();
}
public void setVisible(boolean visible) {
this.visible = visible;
}
public int getId() {
return id;
}
}