use of spacesettlers.objects.Base in project spacesettlers by amymcgovern.
the class AggressiveFlagCollectorTeamClient method getMovementStart.
/**
* Assigns ships to asteroids and beacons, as described above
*/
public Map<UUID, AbstractAction> getMovementStart(Toroidal2DPhysics space, Set<AbstractActionableObject> actionableObjects) {
HashMap<UUID, AbstractAction> actions = new HashMap<UUID, AbstractAction>();
Ship flagShip;
int numShips = 0;
// get the flag carrier, if we have one
flagShip = getFlagCarrier(space, actionableObjects);
// we don't have a ship carrying a flag, so find the best choice (if it exists)
if (flagShip == null) {
flagShip = findHealthiestShipNearFlag(space, actionableObjects);
}
// count ships so we know if we can have a weapons ship
for (AbstractObject actionable : actionableObjects) {
if (actionable instanceof Ship) {
numShips++;
}
}
// resources (as long as it isn't the flagShip)
for (AbstractObject actionable : actionableObjects) {
if (actionable instanceof Ship) {
Ship ship = (Ship) actionable;
AbstractAction action = null;
if (flagShip != null && ship.equals(flagShip)) {
if (flagShip.isCarryingFlag()) {
// System.out.println("We have a flag carrier!");
Base base = findNearestBase(space, ship);
// System.out.println("Flag ship before computing action: " + flagShip);
action = new MoveToObjectAction(space, ship.getPosition(), base);
// System.out.println("Aiming for base with action " + action);
aimingForBase.put(ship.getId(), true);
// System.out.println("Flag ship after computing action: " + flagShip);
} else {
Flag enemyFlag = getEnemyFlag(space);
action = new MoveToObjectAction(space, ship.getPosition(), enemyFlag, enemyFlag.getPosition().getTranslationalVelocity());
}
} else {
// a ship to go get resources and help buy more ships/bases)
if (numShips >= 2) {
// see if we already have a hunting ship
if (huntingShip.isEmpty()) {
huntingShip.put(ship.getId(), true);
System.out.println("Creating a hunting ship");
// make one ship the hunter
action = getWeaponShipAction(space, ship);
} else {
// if this ship is the current hunter, have it keep hunting
if (huntingShip.containsKey(ship.getId())) {
// make one ship the hunter
action = getWeaponShipAction(space, ship);
// System.out.println("Getting action for hunter");
} else {
// extra ship but not the hunter (likely a 4th ship)
action = getAsteroidCollectorAction(space, ship);
}
}
} else {
// with 2 ships, we need to always collect resources so we can buy more ships for hunting
// and resources later
}
}
// save the action for this ship
actions.put(ship.getId(), action);
} else {
// bases do nothing
actions.put(actionable.getId(), new DoNothingAction());
}
}
return actions;
}
use of spacesettlers.objects.Base in project spacesettlers by amymcgovern.
the class AggressiveFlagCollectorTeamClient method getWeaponShipAction.
/**
* Gets the action for the weapons based ship
* @param space
* @param ship
* @return
*/
private AbstractAction getWeaponShipAction(Toroidal2DPhysics space, Ship ship) {
AbstractAction current = ship.getCurrentAction();
Position currentPosition = ship.getPosition();
// aim for a beacon if there isn't enough energy
if (ship.getEnergy() < 2000) {
Beacon beacon = pickNearestBeacon(space, ship);
AbstractAction newAction = null;
// if there is no beacon, then just skip a turn
if (beacon == null) {
newAction = new DoNothingAction();
} else {
newAction = new MoveToObjectAction(space, currentPosition, beacon);
}
aimingForBase.put(ship.getId(), false);
return newAction;
}
// if the ship has enough resourcesAvailable, take it back to base
if (ship.getResources().getTotal() > 500) {
Base base = findNearestBase(space, ship);
AbstractAction newAction = new MoveToObjectAction(space, currentPosition, base);
aimingForBase.put(ship.getId(), true);
return newAction;
}
// did we bounce off the base?
if (ship.getResources().getTotal() == 0 && ship.getEnergy() > 2000 && aimingForBase.containsKey(ship.getId()) && aimingForBase.get(ship.getId())) {
current = null;
aimingForBase.put(ship.getId(), false);
}
// otherwise aim for the nearest enemy ship
if (current == null || current.isMovementFinished(space)) {
aimingForBase.put(ship.getId(), false);
Ship enemy = pickNearestEnemyShip(space, ship);
AbstractAction newAction = null;
if (enemy == null) {
// there is no enemy available so collect a beacon
Beacon beacon = pickNearestBeacon(space, ship);
// if there is no beacon, then just skip a turn
if (beacon == null) {
newAction = new DoNothingAction();
} else {
newAction = new MoveToObjectAction(space, currentPosition, beacon);
}
} else {
newAction = new MoveToObjectAction(space, currentPosition, enemy, enemy.getPosition().getTranslationalVelocity());
}
return newAction;
} else {
return ship.getCurrentAction();
}
}
use of spacesettlers.objects.Base in project spacesettlers by amymcgovern.
the class AggressiveFlagCollectorTeamClient method findNearestBase.
/**
* Find the base for this team nearest to this ship
*
* @param space
* @param ship
* @return
*/
private Base findNearestBase(Toroidal2DPhysics space, Ship ship) {
double minDistance = Double.MAX_VALUE;
Base nearestBase = null;
for (Base base : space.getBases()) {
if (base.getTeamName().equalsIgnoreCase(ship.getTeamName())) {
double dist = space.findShortestDistance(ship.getPosition(), base.getPosition());
if (dist < minDistance) {
minDistance = dist;
nearestBase = base;
}
}
}
return nearestBase;
}
use of spacesettlers.objects.Base in project spacesettlers by amymcgovern.
the class AggressiveFlagCollectorTeamClient method getAsteroidCollectorAction.
/**
* Gets the action for the asteroid collecting ship
* @param space
* @param ship
* @return
*/
private AbstractAction getAsteroidCollectorAction(Toroidal2DPhysics space, Ship ship) {
AbstractAction current = ship.getCurrentAction();
Position currentPosition = ship.getPosition();
// aim for a beacon if there isn't enough energy
if (ship.getEnergy() < 2000) {
Beacon beacon = pickNearestBeacon(space, ship);
AbstractAction newAction = null;
// if there is no beacon, then just skip a turn
if (beacon == null) {
newAction = new DoNothingAction();
} else {
newAction = new MoveToObjectAction(space, currentPosition, beacon);
}
aimingForBase.put(ship.getId(), false);
return newAction;
}
// if the ship has enough resourcesAvailable, take it back to base
if (ship.getResources().getTotal() > 500) {
Base base = findNearestBase(space, ship);
AbstractAction newAction = new MoveToObjectAction(space, currentPosition, base);
aimingForBase.put(ship.getId(), true);
return newAction;
}
// did we bounce off the base?
if (ship.getResources().getTotal() == 0 && ship.getEnergy() > 2000 && aimingForBase.containsKey(ship.getId()) && aimingForBase.get(ship.getId())) {
current = null;
aimingForBase.put(ship.getId(), false);
}
// otherwise aim for the asteroid
if (current == null || current.isMovementFinished(space)) {
aimingForBase.put(ship.getId(), false);
Asteroid asteroid = pickHighestValueNearestFreeAsteroid(space, ship);
AbstractAction newAction = null;
if (asteroid != null) {
asteroidToShipMap.put(asteroid.getId(), ship);
newAction = new MoveToObjectAction(space, currentPosition, asteroid, asteroid.getPosition().getTranslationalVelocity());
}
return newAction;
}
return ship.getCurrentAction();
}
use of spacesettlers.objects.Base in project spacesettlers by amymcgovern.
the class AggressiveFlagCollectorTeamClient method getTeamPurchases.
@Override
public /**
* If there is enough resourcesAvailable, buy a base. Place it by finding a ship that is sufficiently
* far away from the existing bases
*/
Map<UUID, PurchaseTypes> getTeamPurchases(Toroidal2DPhysics space, Set<AbstractActionableObject> actionableObjects, ResourcePile resourcesAvailable, PurchaseCosts purchaseCosts) {
HashMap<UUID, PurchaseTypes> purchases = new HashMap<UUID, PurchaseTypes>();
double BASE_BUYING_DISTANCE = 200;
boolean bought_base = false;
int numBases, numShips;
// count the number of ships for the base/ship buying algorithm
numShips = 0;
for (AbstractActionableObject actionableObject : actionableObjects) {
if (actionableObject instanceof Ship) {
numShips++;
}
}
// try to balance
if (purchaseCosts.canAfford(PurchaseTypes.BASE, resourcesAvailable)) {
for (AbstractActionableObject actionableObject : actionableObjects) {
if (actionableObject instanceof Ship) {
Ship ship = (Ship) actionableObject;
Set<Base> bases = space.getBases();
// how far away is this ship to a base of my team?
boolean buyBase = true;
numBases = 0;
for (Base base : bases) {
if (base.getTeamName().equalsIgnoreCase(getTeamName())) {
numBases++;
double distance = space.findShortestDistance(ship.getPosition(), base.getPosition());
if (distance < BASE_BUYING_DISTANCE) {
buyBase = false;
}
}
}
if (buyBase && numBases < numShips) {
purchases.put(ship.getId(), PurchaseTypes.BASE);
bought_base = true;
System.out.println("Aggressive Flag Collector is buying a base!");
break;
}
}
}
}
// can I buy a ship?
if (purchaseCosts.canAfford(PurchaseTypes.SHIP, resourcesAvailable) && bought_base == false) {
for (AbstractActionableObject actionableObject : actionableObjects) {
if (actionableObject instanceof Base) {
Base base = (Base) actionableObject;
purchases.put(base.getId(), PurchaseTypes.SHIP);
System.out.println("Aggressive Flag Collector is buying a ship!");
break;
}
}
}
return purchases;
}
Aggregations