From 10b9bce6d6bd68c2ed426461c22b59402a784142 Mon Sep 17 00:00:00 2001 From: Ron Date: Thu, 12 Jul 2018 17:31:33 -0500 Subject: [PATCH] Add support for placing triggered sea units (#3542) --- .../triplea/ai/pro/ProPurchaseAi.java | 42 ++++++++++++------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/game-core/src/main/java/games/strategy/triplea/ai/pro/ProPurchaseAi.java b/game-core/src/main/java/games/strategy/triplea/ai/pro/ProPurchaseAi.java index d51e5bd39d4..20b447fd0c4 100644 --- a/game-core/src/main/java/games/strategy/triplea/ai/pro/ProPurchaseAi.java +++ b/game-core/src/main/java/games/strategy/triplea/ai/pro/ProPurchaseAi.java @@ -374,8 +374,15 @@ void place(final Map purchaseTerritories, // Find all place territories final Map placeNonConstructionTerritories = ProPurchaseUtils.findPurchaseTerritories(player); + final Set placeTerritories = new HashSet<>(); + for (final Territory t : placeNonConstructionTerritories.keySet()) { + for (final ProPlaceTerritory ppt : placeNonConstructionTerritories.get(t).getCanPlaceTerritories()) { + placeTerritories.add(ppt.getTerritory()); + } + } // Determine max enemy attack units and current allied defenders + territoryManager.populateEnemyAttackOptions(new ArrayList<>(), new ArrayList<>(placeTerritories)); findDefendersInPlaceTerritories(placeNonConstructionTerritories); // Prioritize land territories that need defended and place additional defenders @@ -383,6 +390,11 @@ void place(final Map purchaseTerritories, prioritizeTerritoriesToDefend(placeNonConstructionTerritories, true); placeDefenders(placeNonConstructionTerritories, needToDefendLandTerritories, placeDelegate); + // Prioritize sea territories that need defended and place additional defenders + final List needToDefendSeaTerritories = + prioritizeTerritoriesToDefend(placeNonConstructionTerritories, false); + placeDefenders(placeNonConstructionTerritories, needToDefendSeaTerritories, placeDelegate); + // Find strategic value for each territory ProLogger.info("Find strategic value for place territories"); final Map territoryValueMap = @@ -394,22 +406,20 @@ void place(final Map purchaseTerritories, } } - // Prioritize land place territories, add all territories, and then place units - final List prioritizedLandTerritories = + // Prioritize place territories + final List prioritizedTerritories = prioritizeLandTerritories(placeNonConstructionTerritories); for (final ProPurchaseTerritory ppt : placeNonConstructionTerritories.values()) { for (final ProPlaceTerritory placeTerritory : ppt.getCanPlaceTerritories()) { - final Territory t = placeTerritory.getTerritory(); - if (!t.isWater() && !prioritizedLandTerritories.contains(placeTerritory)) { - prioritizedLandTerritories.add(placeTerritory); + if (!prioritizedTerritories.contains(placeTerritory)) { + prioritizedTerritories.add(placeTerritory); } } } - // Place regular land units - placeLandUnits(prioritizedLandTerritories, placeDelegate, false); - // Place isConstruction land units (needs separated since placeDelegate.getPlaceableUnits doesn't handle combined) - placeLandUnits(prioritizedLandTerritories, placeDelegate, true); + // Place regular then isConstruction units (placeDelegate.getPlaceableUnits doesn't handle combined) + placeUnits(prioritizedTerritories, placeDelegate, false); + placeUnits(prioritizedTerritories, placeDelegate, true); territoryManager = null; } @@ -1842,20 +1852,20 @@ private void placeDefenders(final Map placeNonC } } - private void placeLandUnits(final List prioritizedLandTerritories, + private void placeUnits(final List prioritizedTerritories, final IAbstractPlaceDelegate placeDelegate, final boolean isConstruction) { - ProLogger.info("Place land with isConstruction=" + isConstruction + ", units=" + player.getUnits().getUnits()); + ProLogger.info("Place with isConstruction=" + isConstruction + ", units=" + player.getUnits().getUnits()); Predicate unitMatch = Matches.unitIsNotConstruction(); if (isConstruction) { unitMatch = Matches.unitIsConstruction(); } - // Loop through prioritized territories and place land units - for (final ProPlaceTerritory placeTerritory : prioritizedLandTerritories) { + // Loop through prioritized territories and place units + for (final ProPlaceTerritory placeTerritory : prioritizedTerritories) { final Territory t = placeTerritory.getTerritory(); - ProLogger.debug("Checking land place for " + t.getName()); + ProLogger.debug("Checking place for " + t.getName()); // Check if any units can be placed final PlaceableUnits placeableUnits = placeDelegate.getPlaceableUnits(player.getUnits().getMatches(unitMatch), t); @@ -1873,8 +1883,8 @@ private void placeLandUnits(final List prioritizedLandTerrito // Place as many units as possible final List unitsThatCanBePlaced = new ArrayList<>(placeableUnits.getUnits()); - final int landPlaceCount = Math.min(remainingUnitProduction, unitsThatCanBePlaced.size()); - final List unitsToPlace = unitsThatCanBePlaced.subList(0, landPlaceCount); + final int placeCount = Math.min(remainingUnitProduction, unitsThatCanBePlaced.size()); + final List unitsToPlace = unitsThatCanBePlaced.subList(0, placeCount); ProLogger.trace(t + ", placedUnits=" + unitsToPlace); doPlace(t, unitsToPlace, placeDelegate); }