package rts.core.engine.layers.entities.buildings; import java.awt.Point; import java.util.ArrayList; import org.newdawn.slick.Animation; import org.newdawn.slick.Color; 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.utils.ResourceManager; public abstract class BuildingECreator extends Building { private static ArrayList<BuildingECreator> creators = new ArrayList<BuildingECreator>(); private Animation flag; protected Point rp; protected boolean isPrimary; public BuildingECreator(Engine engine, int type, boolean block, int playerId, int teamId, int networkId) { super(engine, type, block, playerId, teamId, networkId); // Flag and rallying point rp = new Point(-1, -1); flag = new Animation(); SpriteSheet ss = ResourceManager.getSpriteSheet("flag"); for (int i = 0; i < 5; i++) { flag.addFrame(ss.getSprite(i, 0), 150); } } public void checkPrimary() { if (engine.isPlayerEntity(playerId)) { // Check if primary means no entity with the same type in the array boolean findE = false; for (int i = 0; i < creators.size(); i++) { if (creators.get(i).getType() == type) { findE = true; } } isPrimary = !findE; creators.add(this); } } @Override public void remove() { super.remove(); creators.remove(this); } @Override public void selected() { if (engine.isPlayerEntity(playerId) && selected && !isPrimary) { // Set this building primary for (int i = 0; i < creators.size(); i++) { if (creators.get(i).type == this.type) creators.get(i).setPrimary(false); } isPrimary = true; } super.selected(); } @Override public void renderEntity(GameContainer container, Graphics g) throws SlickException { if (selected && rp.x != -1 && rp.y != -1) { g.setColor(Color.red); g.drawLine(getRealX(), getRealY(), rp.x + 8, rp.y + 10); g.drawAnimation(flag, rp.x - 6, rp.y - 6); } super.renderEntity(container, g); if (isPrimary && selected) { g.setColor(Color.white); g.drawRect(x, y - 2, 13, 13); g.drawString("P", x + 2, y - 4); } } public Point getRallyingPoint() { if (rp.x == -1 && rp.y == -1) return null; else return rp; } public void changeRallyingPoint(int mx, int my) { if (onEntity(mx, my)) { rp.x = -1; rp.y = -1; } else { if (!engine.getMap().isBlocked(mx / engine.getTileW(), my / engine.getTileH())) { rp.x = (mx / engine.getTileW()) * engine.getTileW(); rp.y = (my / engine.getTileH()) * engine.getTileH(); } } } public void setPrimary(boolean isPrimary) { this.isPrimary = isPrimary; } public boolean isPrimary() { return isPrimary; } }