package de.swagner.paxbritannica.frigate; import com.badlogic.gdx.math.Vector2; import de.swagner.paxbritannica.GameInstance; import de.swagner.paxbritannica.Ship; import de.swagner.paxbritannica.Targeting; public class MissileAI { private float MAX_LIFETIME = 5; // 5 seconds to auto-destruct private Ship target; private Missile missile; Vector2 relativeVel = new Vector2(); Vector2 toTarget = new Vector2(); public MissileAI(Missile missile) { this.missile = missile; retarget(); } public void retarget() { target = Targeting.getTypeInRange(missile, 0, 500); if (target == null) { target = Targeting.getTypeInRange(missile, 1, 500); } else return; if (target == null) { target = Targeting.getTypeInRange(missile, 2, 500); } else return; if (target == null) { target = Targeting.getNearestOfType(missile, 1); } else return; if (target == null) { target = Targeting.getNearestOfType(missile, 3); } else target = null; } public void selfDestruct() { // EXPLODE! missile.alive = false; GameInstance.getInstance().explosionParticles.addTinyExplosion(missile.collisionCenter); } public Vector2 predict() { relativeVel.set(missile.velocity).sub(target.velocity); toTarget.set(target.collisionCenter).sub(missile.collisionCenter); if (missile.velocity.dot(toTarget) != 0) { float time_to_target = toTarget.dot(toTarget) / relativeVel.dot(toTarget); return new Vector2(target.collisionCenter).sub(relativeVel.scl(Math.max(0, time_to_target))); } else { return target.collisionCenter; } } public void update() { if (target == null || missile.aliveTime > MAX_LIFETIME) { selfDestruct(); } else if (!target.alive) { retarget(); } else { missile.goTowards(predict(), true); } } }