From 08218b954edee80725c7cafa80c8ceb5f6291c5c Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Sun, 12 Jan 2020 23:21:34 +0200 Subject: [PATCH] healUnit and tryPillageImprovement in BarbarianAutomation use their counterparts from UnitAutomation, because they're basically exactly the same --- .../logic/automation/BarbarianAutomation.kt | 56 +++---------------- .../unciv/logic/automation/UnitAutomation.kt | 6 +- 2 files changed, 12 insertions(+), 50 deletions(-) diff --git a/core/src/com/unciv/logic/automation/BarbarianAutomation.kt b/core/src/com/unciv/logic/automation/BarbarianAutomation.kt index 0605f7c6a7..2a65f0129f 100644 --- a/core/src/com/unciv/logic/automation/BarbarianAutomation.kt +++ b/core/src/com/unciv/logic/automation/BarbarianAutomation.kt @@ -22,9 +22,9 @@ class BarbarianAutomation(val civInfo: CivilizationInfo) { fun automate() { // ranged go first, after melee and then everyone else - civInfo.getCivUnits().filter { it.type.isRanged() }.forEach(::automateUnit) - civInfo.getCivUnits().filter { it.type.isMelee() }.forEach(::automateUnit) - civInfo.getCivUnits().filter { !it.type.isRanged() && !it.type.isMelee() }.forEach(::automateUnit) + civInfo.getCivUnits().filter { it.type.isRanged() }.forEach { automateUnit(it) } + civInfo.getCivUnits().filter { it.type.isMelee() }.forEach { automateUnit(it) } + civInfo.getCivUnits().filter { !it.type.isRanged() && !it.type.isMelee() }.forEach { automateUnit(it) } } private fun automateUnit(unit: MapUnit) { @@ -82,11 +82,11 @@ class BarbarianAutomation(val civInfo: CivilizationInfo) { if (battleHelper.tryAttackNearbyEnemy(unit)) return // 4 - trying to pillage tile or route - if (tryPillageImprovement(unit, unitDistanceToTiles, unitActions)) return + if (UnitAutomation().tryPillageImprovement(unit, unitDistanceToTiles)) return // 5 - heal the unit if needed if (unit.health < 100) { - healUnit(unit, unitDistanceToTiles) + UnitAutomation().tryHealUnit(unit, unitDistanceToTiles) return } @@ -95,20 +95,17 @@ class BarbarianAutomation(val civInfo: CivilizationInfo) { } private fun automateScout(unit: MapUnit) { - val unitActions = UnitActions().getUnitActions(unit, UncivGame.Current.worldScreen) val unitDistanceToTiles = unit.movement.getDistanceToTiles() val nearEnemyTiles = battleHelper.getAttackableEnemies(unit, unitDistanceToTiles) // 1 - heal or run if death is near if (unit.health < 50) { if (nearEnemyTiles.isNotEmpty()) { - // run val furthestTile = findFurthestTile(unit, unitDistanceToTiles, nearEnemyTiles) unit.movement.moveToTile(furthestTile) - } else { - // heal - unit.fortifyIfCan() } + unit.fortifyIfCan() + return } @@ -116,11 +113,11 @@ class BarbarianAutomation(val civInfo: CivilizationInfo) { // TODO // 3 - trying to pillage tile or trade route - if (tryPillageImprovement(unit, unitDistanceToTiles, unitActions)) return + if (UnitAutomation().tryPillageImprovement(unit, unitDistanceToTiles)) return // 4 - heal the unit if needed if (unit.health < 100) { - healUnit(unit, unitDistanceToTiles) + UnitAutomation().tryHealUnit(unit, unitDistanceToTiles) return } @@ -147,23 +144,6 @@ class BarbarianAutomation(val civInfo: CivilizationInfo) { return furthestTile.first } - private fun healUnit(unit: MapUnit, unitDistanceToTiles: PathsToTilesWithinTurn) { - val currentUnitTile = unit.getTile() - val bestTilesForHealing = unitDistanceToTiles.keys - .filter { unit.movement.canMoveTo(it) } - .groupBy { unit.rankTileForHealing(it) } - .maxBy { it.key } - - // within the tiles with best healing rate, we'll prefer one which has the highest defensive bonuses - val bestTileForHealing = bestTilesForHealing?.value?.maxBy { it.getDefensiveBonus() } - if (bestTileForHealing != null - && currentUnitTile != bestTileForHealing - && unit.rankTileForHealing(bestTileForHealing) > unit.rankTileForHealing(currentUnitTile)) { - unit.movement.moveToTile(bestTileForHealing) - } - - unit.fortifyIfCan() - } private fun tryUpgradeUnit(unit: MapUnit, unitActions: List): Boolean { if (unit.baseUnit().upgradesTo != null) { @@ -179,22 +159,4 @@ class BarbarianAutomation(val civInfo: CivilizationInfo) { return false } - private fun tryPillageImprovement( - unit: MapUnit, - unitDistanceToTiles: PathsToTilesWithinTurn, - unitActions: List - ): Boolean { - val tilesThatCanWalkToAndThenPillage = unitDistanceToTiles - .filter { it.value.totalDistance < unit.currentMovement }.keys - .filter { unit.movement.canMoveTo(it) && UnitActions().canPillage(unit, it) } - - if (tilesThatCanWalkToAndThenPillage.isEmpty()) return false - val tileToPillage = tilesThatCanWalkToAndThenPillage.maxBy { it.getDefensiveBonus() }!! - if (unit.getTile() != tileToPillage) { - unit.movement.moveToTile(tileToPillage) - } - - unitActions.first { it.type == UnitActionType.Pillage }.action?.invoke() - return true - } } \ No newline at end of file diff --git a/core/src/com/unciv/logic/automation/UnitAutomation.kt b/core/src/com/unciv/logic/automation/UnitAutomation.kt index e9d228e157..122fff434d 100644 --- a/core/src/com/unciv/logic/automation/UnitAutomation.kt +++ b/core/src/com/unciv/logic/automation/UnitAutomation.kt @@ -115,7 +115,7 @@ class UnitAutomation { return true } - private fun tryHealUnit(unit: MapUnit, unitDistanceToTiles: PathsToTilesWithinTurn): Boolean { + fun tryHealUnit(unit: MapUnit, unitDistanceToTiles: PathsToTilesWithinTurn): Boolean { val tilesInDistance = unitDistanceToTiles.keys.filter { unit.movement.canMoveTo(it) } if (unitDistanceToTiles.isEmpty()) return true // can't move, so... val currentUnitTile = unit.getTile() @@ -142,11 +142,11 @@ class UnitAutomation { && bestTileForHealingRank > unit.rankTileForHealing(currentUnitTile)) unit.movement.moveToTile(bestTileForHealing) - if (unit.currentMovement > 0 && unit.canFortify()) unit.fortify() + unit.fortifyIfCan() return true } - private fun tryPillageImprovement(unit: MapUnit, unitDistanceToTiles: PathsToTilesWithinTurn): Boolean { + fun tryPillageImprovement(unit: MapUnit, unitDistanceToTiles: PathsToTilesWithinTurn): Boolean { if (unit.type.isCivilian()) return false val tilesThatCanWalkToAndThenPillage = unitDistanceToTiles .filter { it.value.totalDistance < unit.currentMovement }.keys