From 4c41536ed80d6b89bd72c4d2856125446e33b458 Mon Sep 17 00:00:00 2001 From: yairm210 Date: Fri, 24 Dec 2021 12:50:58 +0200 Subject: [PATCH] Resolved #4202 - AI cities now build workboats for use in other cities Solves the 'landlocked but with water improvement' deadlock --- .../automation/ConstructionAutomation.kt | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/core/src/com/unciv/logic/automation/ConstructionAutomation.kt b/core/src/com/unciv/logic/automation/ConstructionAutomation.kt index 1796d35849..580c26eeee 100644 --- a/core/src/com/unciv/logic/automation/ConstructionAutomation.kt +++ b/core/src/com/unciv/logic/automation/ConstructionAutomation.kt @@ -138,26 +138,28 @@ class ConstructionAutomation(val cityConstructions: CityConstructions){ private fun addWorkBoatChoice() { val buildableWorkboatUnits = cityInfo.cityConstructions.getConstructableUnits() - .filter { it.hasUnique(UniqueType.CreateWaterImprovements) - && Automation.allowSpendingResource(civInfo, it) } + .filter { + it.hasUnique(UniqueType.CreateWaterImprovements) + && Automation.allowSpendingResource(civInfo, it) + } val canBuildWorkboat = buildableWorkboatUnits.any() - && !cityInfo.getTiles().any { it.civilianUnit?.hasUnique(UniqueType.CreateWaterImprovements) == true } + && !cityInfo.getTiles() + .any { it.civilianUnit?.hasUnique(UniqueType.CreateWaterImprovements) == true } if (!canBuildWorkboat) return - val tilesThatNeedWorkboat = cityInfo.getTiles() - .filter { it.isWater && it.hasViewableResource(civInfo) && it.improvement == null }.toList() - if (tilesThatNeedWorkboat.isEmpty()) return - // If we can't reach the tile we need to improve within 15 tiles, it's probably unreachable. - val bfs = BFS(cityInfo.getCenterTile()) { (it.isWater || it.isCityCenter()) && it.isFriendlyTerritory(civInfo) } - for (i in 1..15) { - bfs.nextStep() - if (tilesThatNeedWorkboat.any { bfs.hasReachedTile(it) }) - break - if (bfs.hasEnded()) break + + val bfs = BFS(cityInfo.getCenterTile()) { + (it.isWater || it.isCityCenter()) && it.isFriendlyTerritory(civInfo) } - if (tilesThatNeedWorkboat.none { bfs.hasReachedTile(it) }) return + for (i in 1..10) bfs.nextStep() + if (!bfs.getReachedTiles() + .any { it.hasViewableResource(civInfo) && it.improvement == null && it.getOwner() == civInfo } + ) return - addChoice(relativeCostEffectiveness, buildableWorkboatUnits.minByOrNull { it.cost }!!.name, 0.6f) + addChoice( + relativeCostEffectiveness, buildableWorkboatUnits.minByOrNull { it.cost }!!.name, + 0.6f + ) } private fun addWorkerChoice() {