AI units now fortify when healing and prefer tiles with defensive bonuses while healing

This commit is contained in:
Yair Morgenstern 2018-08-13 09:25:29 +03:00
parent fee0b718ec
commit 27b4c2c2ab

View File

@ -80,21 +80,18 @@ class UnitAutomation{
} }
fun healUnit(unit:MapUnit) { fun healUnit(unit:MapUnit) {
val tilesInDistance = unit.getDistanceToTiles().keys val tilesInDistance = unit.getDistanceToTiles().keys.filter { unit.canMoveTo(it) }
val unitTile = unit.getTile() val unitTile = unit.getTile()
// Go to friendly tile if within distance - better healing! val tilesByHealingRate = tilesInDistance.groupBy { rankTileForHealing(it,unit) }
val friendlyTile = tilesInDistance.firstOrNull { it.getOwner()?.civName == unit.owner && unit.canMoveTo(it) } if(tilesByHealingRate.isEmpty()) return
if (unitTile.getOwner()?.civName != unit.owner && friendlyTile != null) { val bestTilesForHealing = tilesByHealingRate.maxBy { it.key }!!.value
unit.moveToTile(friendlyTile) // within the tiles with best healing rate, we'll prefer one which has defensive bonuses
return val bestTileForHealing = bestTilesForHealing.maxBy { it.getDefensiveBonus() }!!
} if(unitTile!=bestTileForHealing && rankTileForHealing(bestTileForHealing,unit)>rankTileForHealing(unitTile,unit))
unit.moveToTile(bestTileForHealing)
// Or at least get out of enemy territory yaknow if(unit.currentMovement>0 && !unit.hasUnique("No defensive terrain bonus") && !unit.isFortified() ){
val neutralTile = tilesInDistance.firstOrNull { it.getOwner() == null && unit.canMoveTo(it)} unit.action="Fortify 0"
if (unitTile.getOwner()?.civName != unit.owner && unitTile.getOwner() != null && neutralTile != null) {
unit.moveToTile(neutralTile)
return
} }
} }