package de.swagner.paxbritannica.frigate;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Vector2;
import de.swagner.paxbritannica.Ship;
import de.swagner.paxbritannica.Targeting;
public class FrigateAI {
private Vector2 target_fuzzy_pos = new Vector2();
private boolean stopping = false;
public Ship target;
private Frigate frigate;
public FrigateAI(Frigate frigate) {
this.frigate = frigate;
}
public void retarget() {
target = Targeting.getNearestOfType(frigate, 0);
if (target == null) {
target = Targeting.getNearestOfType(frigate, 1);
}
if (target == null) {
target = Targeting.getNearestOfType(frigate, 2);
}
if (target == null) {
target = Targeting.getNearestOfType(frigate, 3);
}
if (target != null) {
Vector2 random = new Vector2(MathUtils.cos((float) ((MathUtils.random() * MathUtils.PI * 2) * Math.sqrt(MathUtils.random()))),
MathUtils.sin((float) ((MathUtils.random() * MathUtils.PI * 2) * Math.sqrt(MathUtils.random()))));
target_fuzzy_pos.set(target.collisionCenter).add(random.scl(250));
}
}
public void update() {
if (target == null || !target.alive || MathUtils.random() < 0.001f) {
retarget();
}
if (target != null) {
float target_distance = target.collisionCenter.dst(frigate.collisionCenter);
float speed_square = frigate.velocity.dot(frigate.velocity);
if (frigate.isReadyToShoot() && speed_square > 0) {
stopping = true;
} else if(frigate.isEmpty()) {
stopping = false;
}
if(!stopping) {
if(target_distance < 150) {
//not too close!
frigate.goAway(target_fuzzy_pos, true);
} else {
frigate.goTowards(target_fuzzy_pos, true);
}
}
// Shoot when not moving and able to fire
if(!frigate.isEmpty() && speed_square < 0.1) {
frigate.shoot();
}
}
}
}