package de.swagner.paxbritannica;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.Array;
import de.swagner.paxbritannica.bomber.Bomber;
import de.swagner.paxbritannica.factory.FactoryProduction;
import de.swagner.paxbritannica.fighter.Fighter;
import de.swagner.paxbritannica.frigate.Frigate;
public class Targeting {
public static boolean onScreen(Vector2 position) {
return onScreen(position, 0);
}
public static boolean onScreen(Vector2 position, float buffer) {
return position.x >= Constants.screenLeft - buffer && position.x <= Constants.screenRight + buffer && position.y >= Constants.screenBottom - buffer
&& position.y <= Constants.screenTop + buffer;
}
/*
* returns the closest target of the given type 0 = Fighter 1 = Bomber 2 =
* Frigate 3 = Factory
*/
public static Ship getNearestOfType(Ship source, int shipType) {
if (shipType == 0)
return getNearestOfType(source, GameInstance.getInstance().fighters);
else if (shipType == 3)
return getFactoryWithHighestHealth(source, GameInstance.getInstance().factorys);
else if (shipType == 1)
return getNearestOfType(source, GameInstance.getInstance().bombers);
else if (shipType == 2)
return getNearestOfType(source, GameInstance.getInstance().frigates);
else
return null;
}
private static Ship getFactoryWithHighestHealth(Ship source, Array<Ship> ships) {
// find the closest one!
Ship closestShip = null;
float highestHealth = Float.MIN_VALUE;
for (int i = 0; i < ships.size; i++) {
Ship ship = ships.get(i);
float currentHealth = ship.hitPoints+(((FactoryProduction)ship).harvestRate*500);
if (ship.alive && source.id != ship.id && onScreen(ship.collisionCenter) && (currentHealth > highestHealth)) {
closestShip = ship;
highestHealth = currentHealth;
}
}
return closestShip;
}
private static Ship getNearestOfType(Ship source, Array<Ship> ships) {
// find the closest one!
Ship closestShip = null;
float closestDistanze = Float.MAX_VALUE;
for (int i = 0; i < ships.size; i++) {
Ship ship = ships.get(i);
float currentDistance = source.collisionCenter.dst(ship.collisionCenter);
if (ship.alive && source.id != ship.id && onScreen(ship.collisionCenter) && (currentDistance < closestDistanze)) {
//skip if ship is not targeting source ship
if(ship instanceof Fighter) {
if(((Fighter) ship).ai.target!=null && ((Fighter) ship).ai.target.id != source.id) {
continue;
}
}
if(ship instanceof Bomber) {
if(((Bomber) ship).ai.target!=null && ((Bomber) ship).ai.target.id != source.id) {
continue;
}
}
if(ship instanceof Frigate) {
if(((Frigate) ship).ai.target!=null && ((Frigate) ship).ai.target.id != source.id) {
continue;
}
}
closestShip = ship;
closestDistanze = currentDistance;
}
}
return closestShip;
}
/*
* return a random ship of the desired type that's in range
* 0 = Fighter 1 = Bomber 2 = Frigate 3 = Factory
*/
public static Ship getTypeInRange(Ship source, int shipType, float range) {
if (shipType == 0)
return getTypeInRange(source, GameInstance.getInstance().fighters, range);
else if (shipType == 3)
return getTypeInRange(source, GameInstance.getInstance().factorys, range);
else if (shipType == 1)
return getTypeInRange(source, GameInstance.getInstance().bombers, range);
else if (shipType == 2)
return getTypeInRange(source, GameInstance.getInstance().frigates, range);
else
return null;
}
/**
* return a random ship of the desired type that's in range
*/
private static Ship getTypeInRange(Ship source, Array<Ship> ships, float range) {
Array<Ship> shipsInRange = new Array<Ship>();
float range_squared = range * range;
for (int i = 0; i < ships.size; i++) {
Ship ship = ships.get(i);
float currentDistance = source.collisionCenter.dst(ship.collisionCenter);
if (ship.alive && source.id != ship.id && onScreen(ship.collisionCenter) && (currentDistance < range_squared)) {
shipsInRange.add(ship);
}
}
if (shipsInRange.size > 0) {
return shipsInRange.get(MathUtils.random(0, shipsInRange.size - 1));
} else {
return null;
}
}
}