healUnit and tryPillageImprovement in BarbarianAutomation use their counterparts from UnitAutomation, because they're basically exactly the same

This commit is contained in:
Yair Morgenstern
2020-01-12 23:21:34 +02:00
parent 8a327fa7be
commit 08218b954e
2 changed files with 12 additions and 50 deletions

View File

@ -22,9 +22,9 @@ class BarbarianAutomation(val civInfo: CivilizationInfo) {
fun automate() { fun automate() {
// ranged go first, after melee and then everyone else // ranged go first, after melee and then everyone else
civInfo.getCivUnits().filter { it.type.isRanged() }.forEach(::automateUnit) civInfo.getCivUnits().filter { it.type.isRanged() }.forEach { automateUnit(it) }
civInfo.getCivUnits().filter { it.type.isMelee() }.forEach(::automateUnit) civInfo.getCivUnits().filter { it.type.isMelee() }.forEach { automateUnit(it) }
civInfo.getCivUnits().filter { !it.type.isRanged() && !it.type.isMelee() }.forEach(::automateUnit) civInfo.getCivUnits().filter { !it.type.isRanged() && !it.type.isMelee() }.forEach { automateUnit(it) }
} }
private fun automateUnit(unit: MapUnit) { private fun automateUnit(unit: MapUnit) {
@ -82,11 +82,11 @@ class BarbarianAutomation(val civInfo: CivilizationInfo) {
if (battleHelper.tryAttackNearbyEnemy(unit)) return if (battleHelper.tryAttackNearbyEnemy(unit)) return
// 4 - trying to pillage tile or route // 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 // 5 - heal the unit if needed
if (unit.health < 100) { if (unit.health < 100) {
healUnit(unit, unitDistanceToTiles) UnitAutomation().tryHealUnit(unit, unitDistanceToTiles)
return return
} }
@ -95,20 +95,17 @@ class BarbarianAutomation(val civInfo: CivilizationInfo) {
} }
private fun automateScout(unit: MapUnit) { private fun automateScout(unit: MapUnit) {
val unitActions = UnitActions().getUnitActions(unit, UncivGame.Current.worldScreen)
val unitDistanceToTiles = unit.movement.getDistanceToTiles() val unitDistanceToTiles = unit.movement.getDistanceToTiles()
val nearEnemyTiles = battleHelper.getAttackableEnemies(unit, unitDistanceToTiles) val nearEnemyTiles = battleHelper.getAttackableEnemies(unit, unitDistanceToTiles)
// 1 - heal or run if death is near // 1 - heal or run if death is near
if (unit.health < 50) { if (unit.health < 50) {
if (nearEnemyTiles.isNotEmpty()) { if (nearEnemyTiles.isNotEmpty()) {
// run
val furthestTile = findFurthestTile(unit, unitDistanceToTiles, nearEnemyTiles) val furthestTile = findFurthestTile(unit, unitDistanceToTiles, nearEnemyTiles)
unit.movement.moveToTile(furthestTile) unit.movement.moveToTile(furthestTile)
} else {
// heal
unit.fortifyIfCan()
} }
unit.fortifyIfCan()
return return
} }
@ -116,11 +113,11 @@ class BarbarianAutomation(val civInfo: CivilizationInfo) {
// TODO // TODO
// 3 - trying to pillage tile or trade route // 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 // 4 - heal the unit if needed
if (unit.health < 100) { if (unit.health < 100) {
healUnit(unit, unitDistanceToTiles) UnitAutomation().tryHealUnit(unit, unitDistanceToTiles)
return return
} }
@ -147,23 +144,6 @@ class BarbarianAutomation(val civInfo: CivilizationInfo) {
return furthestTile.first 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<UnitAction>): Boolean { private fun tryUpgradeUnit(unit: MapUnit, unitActions: List<UnitAction>): Boolean {
if (unit.baseUnit().upgradesTo != null) { if (unit.baseUnit().upgradesTo != null) {
@ -179,22 +159,4 @@ class BarbarianAutomation(val civInfo: CivilizationInfo) {
return false return false
} }
private fun tryPillageImprovement(
unit: MapUnit,
unitDistanceToTiles: PathsToTilesWithinTurn,
unitActions: List<UnitAction>
): 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
}
} }

View File

@ -115,7 +115,7 @@ class UnitAutomation {
return true 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) } val tilesInDistance = unitDistanceToTiles.keys.filter { unit.movement.canMoveTo(it) }
if (unitDistanceToTiles.isEmpty()) return true // can't move, so... if (unitDistanceToTiles.isEmpty()) return true // can't move, so...
val currentUnitTile = unit.getTile() val currentUnitTile = unit.getTile()
@ -142,11 +142,11 @@ class UnitAutomation {
&& bestTileForHealingRank > unit.rankTileForHealing(currentUnitTile)) && bestTileForHealingRank > unit.rankTileForHealing(currentUnitTile))
unit.movement.moveToTile(bestTileForHealing) unit.movement.moveToTile(bestTileForHealing)
if (unit.currentMovement > 0 && unit.canFortify()) unit.fortify() unit.fortifyIfCan()
return true return true
} }
private fun tryPillageImprovement(unit: MapUnit, unitDistanceToTiles: PathsToTilesWithinTurn): Boolean { fun tryPillageImprovement(unit: MapUnit, unitDistanceToTiles: PathsToTilesWithinTurn): Boolean {
if (unit.type.isCivilian()) return false if (unit.type.isCivilian()) return false
val tilesThatCanWalkToAndThenPillage = unitDistanceToTiles val tilesThatCanWalkToAndThenPillage = unitDistanceToTiles
.filter { it.value.totalDistance < unit.currentMovement }.keys .filter { it.value.totalDistance < unit.currentMovement }.keys