From d91a23b723f4ccc0737ab617a63065671c314448 Mon Sep 17 00:00:00 2001 From: Duan Tao Date: Wed, 6 Mar 2019 17:42:00 +0800 Subject: [PATCH] Make units pillage improvement to heal, especially barbarians. --- .../unciv/logic/automation/UnitAutomation.kt | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/core/src/com/unciv/logic/automation/UnitAutomation.kt b/core/src/com/unciv/logic/automation/UnitAutomation.kt index 72a5997fdd..a94b738f52 100644 --- a/core/src/com/unciv/logic/automation/UnitAutomation.kt +++ b/core/src/com/unciv/logic/automation/UnitAutomation.kt @@ -64,6 +64,11 @@ class UnitAutomation{ // if there is an attackable unit in the vicinity, attack! if (tryAttackNearbyEnemy(unit,unitDistanceToTiles)) return + // Barbarians try to pillage improvements if no targets reachable + if (unit.civInfo.isBarbarianCivilization()) { + if (pillageImprovement(unit, unitDistanceToTiles)) return + } + if (tryGarrisoningUnit(unit)) return if (unit.health < 80) { @@ -101,6 +106,8 @@ class UnitAutomation{ val tilesInDistance = unitDistanceToTiles.keys.filter { unit.canMoveTo(it) } val unitTile = unit.getTile() + if (pillageImprovement(unit, unitDistanceToTiles)) return + val tilesByHealingRate = tilesInDistance.groupBy { rankTileForHealing(it,unit) } if(tilesByHealingRate.isEmpty()) return val bestTilesForHealing = tilesByHealingRate.maxBy { it.key }!!.value @@ -113,6 +120,20 @@ class UnitAutomation{ } } + fun pillageImprovement(unit: MapUnit, unitDistanceToTiles: HashMap) : Boolean { + val tilesInDistance = unitDistanceToTiles.filter {it.value < unit.currentMovement}.keys + .filter { unit.canMoveTo(it) && it.improvement != null } + + if (tilesInDistance.isEmpty()) return false + val tileToPillage = tilesInDistance.maxBy { it.getDefensiveBonus() }!! + if (unit.getTile()!=tileToPillage) + unit.moveToTile(tileToPillage) + + UnitActions().getUnitActions(unit,UnCivGame.Current.worldScreen) + .first { it.name=="Pillage" }.action() + return true + } + fun containsAttackableEnemy(tile: TileInfo, combatant: ICombatant): Boolean { if(combatant is MapUnitCombatant){ if (combatant.unit.isEmbarked()) {