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.core.engine.layers.entities.others.CountDown;
import rts.core.engine.layers.entities.projectiles.AtomicBomb;
import rts.core.network.ig_udp_containers.EntityState;
import rts.utils.ResourceManager;
public class MissileSilo extends Building {
private static final int START_TIME_BEFORE_READY = 600;
private Animation animation;
private Image destroy;
private CountDown countDown;
public MissileSilo(Engine engine, int playerId, int teamId, int networkId) {
super(engine, EData.BUILDING_MISSILE_SILO, false, playerId, teamId, networkId);
SpriteSheet ss = ResourceManager.getSpriteSheet("televat2_" + engine.getPlayer(playerId).getColor());
width = ss.getSprite(0, 0).getWidth();
height = ss.getSprite(0, 0).getHeight();
animation = new Animation(true);
animation.setLooping(false);
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
animation.addFrame(ss.getSprite(j, i), 150);
}
}
animation.setCurrentFrame(15);
destroy = ss.getSprite(0, 4);
calcViewLimit(width / 40, height / 40);
countDown = new CountDown("A Missile", color, START_TIME_BEFORE_READY);
}
@Override
public void checkFowFromView() {
if (engine.getMap().isEnableFow()) {
if (view != 0) {
for (int i = 0; i < viewLimit.size(); i++) {
engine.getMap().showFow(viewLimit.get(i).x + (int) (x / engine.getTileW()), viewLimit.get(i).y + (int) (y / engine.getTileH()));
}
}
}
}
@Override
public void setLocation(float x, float y) {
super.setLocation(x, y);
engine.addCountDown(countDown);
}
private void shoot(float tx, float ty) {
animation.restart();
state.tx = tx;
state.ty = ty;
direction = Utils.findDirection(x, y, tx, ty);
engine.addEntity(new AtomicBomb(engine, playerId, x, y, tx, ty));
countDown.reset();
}
@Override
public void target(ActiveEntity target, int mx, int my) {
if (countDown.isFinish()) {
if (target.getTeamId() != teamId) {
shoot(mx * engine.getTileW(), my * engine.getTileH());
}
}
}
public int getTargetCursor(ActiveEntity target, int mx, int my) {
if (countDown.isFinish()) {
if (target != null && target.getTeamId() != teamId) {
return PlayerInput.CURSOR_ATTACK;
}
}
return PlayerInput.CURSOR_NO_ACTION;
}
@Override
public void removeBuilding() {
engine.removeEntity(this);
engine.addEntity(new Explosion(engine, Layer.SECOND_EFFECT, Explosion.NORMAL_2, x, y));
engine.addEntity(new Explosion(engine, Layer.SECOND_EFFECT, Explosion.NORMAL_2, x + 10, y));
engine.addEntity(new Explosion(engine, Layer.SECOND_EFFECT, Explosion.NORMAL_2, x + 20, y));
engine.removeCountDown(countDown);
}
@Override
public void updateEntity(GameContainer container, int delta) throws SlickException {
super.updateEntity(container, delta);
if (engine.isPlayerEntity(playerId)) {
countDown.update(delta);
this.state.moneyState = countDown.getTime();
}
countDown.updateBlink(delta);
}
@Override
public void renderBuilding(GameContainer container, Graphics g) throws SlickException {
if (weak || dying) {
g.drawImage(destroy, x, y);
} else {
g.drawAnimation(animation, x, y);
}
}
@Override
public void setState(EntityState state) {
super.setState(state);
if (state.moneyState > this.countDown.getTime()) {
shoot(state.tx, state.ty);
}
this.countDown.setTime(state.moneyState);
}
}