From b0b47d0a3a9df4f5b655e16b904eba285e310320 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Tue, 2 Jul 2019 00:27:24 +0300 Subject: [PATCH] Split AI choice for construction of defensive and offensive buildings --- .../com/unciv/logic/automation/Automation.kt | 23 +++++++++++++++---- .../logic/automation/NextTurnAutomation.kt | 14 ++++++++++- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/core/src/com/unciv/logic/automation/Automation.kt b/core/src/com/unciv/logic/automation/Automation.kt index 4dbbd08844..d6c413ceef 100644 --- a/core/src/com/unciv/logic/automation/Automation.kt +++ b/core/src/com/unciv/logic/automation/Automation.kt @@ -159,15 +159,30 @@ class Automation { relativeCostEffectiveness.add(choice) } - //War buildings - val wartimeBuilding = buildableNotWonders.filter { it.xpForNewUnits>0 || it.cityStrength>0 } + //Defensive building + val defensiveBuilding = buildableNotWonders.filter { it.cityStrength>0 } .minBy { it.cost } - if (wartimeBuilding!=null && (preferredVictoryType!=VictoryType.Cultural || isAtWar)) { + if(defensiveBuilding!=null && (isAtWar || preferredVictoryType!=VictoryType.Cultural)){ + var modifier = 0.2f + if(isAtWar) modifier = 0.5f + + // If this city is the closest city to another civ, that makes it a likely candidate for attack + if(cityInfo.civInfo.getKnownCivs() + .any{ NextTurnAutomation().getClosestCities(cityInfo.civInfo,it).city1 == cityInfo }) + modifier *= 1.5f + + relativeCostEffectiveness.add(ConstructionChoice(defensiveBuilding.name, modifier)) + } + + val unitTrainingBuilding = buildableNotWonders.filter { it.xpForNewUnits>0} + .minBy { it.cost } + //cityInfo.civInfo.cities.sortedByDescending { } // todo don't build if this is a weak production city + if (unitTrainingBuilding!=null && (preferredVictoryType!=VictoryType.Cultural || isAtWar)) { var modifier = 0.5f if(isAtWar) modifier = 1f if(preferredVictoryType==VictoryType.Domination) modifier *= 1.3f - relativeCostEffectiveness.add(ConstructionChoice(wartimeBuilding.name,modifier)) + relativeCostEffectiveness.add(ConstructionChoice(unitTrainingBuilding.name,modifier)) } //Wonders diff --git a/core/src/com/unciv/logic/automation/NextTurnAutomation.kt b/core/src/com/unciv/logic/automation/NextTurnAutomation.kt index 09908fe232..5a34918162 100644 --- a/core/src/com/unciv/logic/automation/NextTurnAutomation.kt +++ b/core/src/com/unciv/logic/automation/NextTurnAutomation.kt @@ -1,6 +1,7 @@ package com.unciv.logic.automation import com.unciv.Constants +import com.unciv.logic.city.CityInfo import com.unciv.logic.civilization.* import com.unciv.logic.civilization.diplomacy.DiplomacyFlags import com.unciv.logic.civilization.diplomacy.DiplomaticModifiers @@ -262,7 +263,18 @@ class NextTurnAutomation{ } fun getMinDistanceBetweenCities(civ1: CivilizationInfo, civ2: CivilizationInfo): Int { - return civ1.cities.map { city -> civ2.cities.map { it.getCenterTile().arialDistanceTo(city.getCenterTile()) }.min()!! }.min()!! + return getClosestCities(civ1,civ2).arialDistance + } + + data class CityDistance(val city1:CityInfo, val city2:CityInfo, val arialDistance: Int) + fun getClosestCities(civ1: CivilizationInfo, civ2: CivilizationInfo): CityDistance { + val cityDistances = arrayListOf() + for(civ1city in civ1.cities) + for(civ2city in civ2.cities) + cityDistances.add(CityDistance(civ1city,civ2city, + civ1city.getCenterTile().arialDistanceTo(civ2city.getCenterTile()))) + + return cityDistances.minBy { it.arialDistance }!! } private fun offerPeaceTreaty(civInfo: CivilizationInfo) {