package rts.core.engine.layers.entities.buildings; import org.newdawn.slick.Animation; import org.newdawn.slick.GameContainer; import org.newdawn.slick.Graphics; import org.newdawn.slick.Image; import org.newdawn.slick.SlickException; import org.newdawn.slick.SpriteSheet; import rts.core.engine.Engine; import rts.core.engine.PlayerInput; import rts.core.engine.Utils; 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.effects.Explosion; import rts.utils.ResourceManager; public class Port extends BuildingECreator { private Animation animation; private Image destroy; public Port(Engine engine, int playerId, int teamId, int networkId) { super(engine, EData.BUILDING_PORT, true, playerId, teamId, networkId); // Allow 3 distance for port distanceMaxBetweenBuilding = 300; SpriteSheet ss = ResourceManager.getSpriteSheet("port_" + engine.getPlayer(playerId).getColor()); width = ss.getSprite(0, 0).getWidth(); height = ss.getSprite(0, 0).getHeight(); animation = new Animation(); for (int i = 0; i < 7; i++) { animation.addFrame(ss.getSprite(i, 0), 300); } destroy = ss.getSprite(7, 0); calcViewLimit(width / 40, height / 40); } // Location only ok on water @Override protected void checkValidLocation(Graphics g, Building closer, int x, int y) { if (engine.getMap().isEntityOccupy(x, y) || engine.getMap().isBlocked(x, y) || !engine.getMap().isWater(x, y) || (Utils.getDistanceBetween(x * engine.getTileW(), y * engine.getTileH(), closer.getRealX(), closer.getRealY()) > distanceMaxBetweenBuilding)) { g.setColor(FADE_RED); validLocation = false; } else { g.setColor(FADE_BLUE); } } @Override public void setLocation(float x, float y) { super.setLocation(x, y); if (engine.isPlayerEntity(playerId)) engine.getGui().increaseBuildLimit(4, 1); } @Override public int getTargetCursor(ActiveEntity target, int mx, int my) { if (target == null && !engine.getMap().isBlocked(engine.getMouseX() / engine.getTileW(), engine.getMouseY() / engine.getTileH()) && engine.getMap().isWater(engine.getMouseX() / engine.getTileW(), engine.getMouseY() / engine.getTileH())) return PlayerInput.CURSOR_SPECIAL_ACTION; else return PlayerInput.CURSOR_NO_ACTION; } @Override public void changeRallyingPoint(int mx, int my) { if (onEntity(mx, my) || !engine.getMap().isWater(mx / engine.getTileW(), my / engine.getTileH())) { 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(); } } } @Override public void removeBuilding() { if (engine.isPlayerEntity(playerId)) engine.getGui().decreaseBuildLimit(4, 1); engine.removeEntity(this); engine.addEntity(new Explosion(engine, Layer.SECOND_EFFECT, Explosion.BIG, x, y)); } @Override public void setPlayerId(int playerId) { if (engine.isPlayerEntity(playerId)) { engine.getGui().increaseBuildLimit(4, 1); } else { if (engine.isPlayerEntity(this.playerId) && this.playerId != playerId) engine.getGui().decreaseBuildLimit(4, 1); } super.setPlayerId(playerId); } @Override public void renderBuilding(GameContainer container, Graphics g) throws SlickException { if (weak || dying) { g.drawImage(destroy, x, y); } else { g.drawAnimation(animation, x, y); } } }