Barbarian automation's run away uses the same function as the worker's run away - solves a crash caused by bad logic in the barbarian automation
3.9.0-patch1
This commit is contained in:
parent
4b649825cd
commit
d77415de8d
4 changed files with 35 additions and 35 deletions
|
@ -3,8 +3,8 @@ package com.unciv.build
|
||||||
object BuildConfig {
|
object BuildConfig {
|
||||||
const val kotlinVersion = "1.3.71"
|
const val kotlinVersion = "1.3.71"
|
||||||
const val appName = "Unciv"
|
const val appName = "Unciv"
|
||||||
const val appCodeNumber = 433
|
const val appCodeNumber = 434
|
||||||
const val appVersion = "3.9.0"
|
const val appVersion = "3.9.0-patch1"
|
||||||
|
|
||||||
const val gdxVersion = "1.9.10"
|
const val gdxVersion = "1.9.10"
|
||||||
const val roboVMVersion = "2.3.1"
|
const val roboVMVersion = "2.3.1"
|
||||||
|
|
|
@ -48,14 +48,13 @@ class BarbarianAutomation(val civInfo: CivilizationInfo) {
|
||||||
val possibleDamage = nearEnemyTiles
|
val possibleDamage = nearEnemyTiles
|
||||||
.map {
|
.map {
|
||||||
BattleDamage.calculateDamageToAttacker(MapUnitCombatant(unit),
|
BattleDamage.calculateDamageToAttacker(MapUnitCombatant(unit),
|
||||||
|
it.tileToAttackFrom,
|
||||||
Battle.getMapCombatantOfTile(it.tileToAttack)!!)
|
Battle.getMapCombatantOfTile(it.tileToAttack)!!)
|
||||||
}
|
}
|
||||||
.sum()
|
.sum()
|
||||||
val possibleHeal = unit.rankTileForHealing(unit.currentTile)
|
val possibleHeal = unit.rankTileForHealing(unit.currentTile)
|
||||||
if (possibleDamage > possibleHeal) {
|
if (possibleDamage > possibleHeal) {
|
||||||
// run
|
UnitAutomation.runAway(unit)
|
||||||
val furthestTile = findFurthestTileCanMoveTo(unit, unitDistanceToTiles, nearEnemyTiles)
|
|
||||||
if(furthestTile!=null) unit.movement.moveToTile(furthestTile)
|
|
||||||
}
|
}
|
||||||
unit.fortifyIfCan()
|
unit.fortifyIfCan()
|
||||||
return
|
return
|
||||||
|
@ -85,10 +84,7 @@ class BarbarianAutomation(val civInfo: CivilizationInfo) {
|
||||||
|
|
||||||
// 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()) UnitAutomation.runAway(unit)
|
||||||
val furthestTile = findFurthestTileCanMoveTo(unit, unitDistanceToTiles, nearEnemyTiles)
|
|
||||||
if(furthestTile!=null) unit.movement.moveToTile(furthestTile)
|
|
||||||
}
|
|
||||||
unit.fortifyIfCan()
|
unit.fortifyIfCan()
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
|
@ -234,6 +234,7 @@ object UnitAutomation {
|
||||||
).filter {
|
).filter {
|
||||||
// Ignore units that would 1-shot you if you attacked
|
// Ignore units that would 1-shot you if you attacked
|
||||||
BattleDamage.calculateDamageToAttacker(MapUnitCombatant(unit),
|
BattleDamage.calculateDamageToAttacker(MapUnitCombatant(unit),
|
||||||
|
it.tileToAttackFrom,
|
||||||
Battle.getMapCombatantOfTile(it.tileToAttack)!!) < unit.health
|
Battle.getMapCombatantOfTile(it.tileToAttack)!!) < unit.health
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -404,4 +405,30 @@ object UnitAutomation {
|
||||||
unit.civInfo.addNotification("[${unit.name}] finished exploring.", unit.currentTile.position, Color.GRAY)
|
unit.civInfo.addNotification("[${unit.name}] finished exploring.", unit.currentTile.position, Color.GRAY)
|
||||||
unit.action = null
|
unit.action = null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun runAway(unit: MapUnit) {
|
||||||
|
val reachableTiles = unit.movement.getDistanceToTiles()
|
||||||
|
val enterableCity = reachableTiles.keys.firstOrNull { it.isCityCenter() && unit.movement.canMoveTo(it) }
|
||||||
|
if(enterableCity!=null) {
|
||||||
|
unit.movement.moveToTile(enterableCity)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
val tileFurthestFromEnemy = reachableTiles.keys.filter { unit.movement.canMoveTo(it) }
|
||||||
|
.maxBy{ countDistanceToClosestEnemy(unit, it)}
|
||||||
|
if(tileFurthestFromEnemy==null) return // can't move anywhere!
|
||||||
|
unit.movement.moveToTile(tileFurthestFromEnemy)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun countDistanceToClosestEnemy(unit: MapUnit, tile: TileInfo): Int {
|
||||||
|
for(i in 1..3)
|
||||||
|
if(tile.getTilesAtDistance(i).any{containsEnemyMilitaryUnit(unit,it)})
|
||||||
|
return i
|
||||||
|
return 4
|
||||||
|
}
|
||||||
|
|
||||||
|
fun containsEnemyMilitaryUnit(unit: MapUnit, tileInfo: TileInfo) = tileInfo.militaryUnit != null
|
||||||
|
&& tileInfo.militaryUnit!!.civInfo.isAtWarWith(unit.civInfo)
|
||||||
|
|
||||||
}
|
}
|
|
@ -11,14 +11,12 @@ import com.unciv.models.ruleset.tile.TileImprovement
|
||||||
|
|
||||||
class WorkerAutomation(val unit: MapUnit) {
|
class WorkerAutomation(val unit: MapUnit) {
|
||||||
|
|
||||||
fun containsEnemyMilitaryUnit(tileInfo: TileInfo) = tileInfo.militaryUnit != null
|
|
||||||
&& tileInfo.militaryUnit!!.civInfo.isAtWarWith(unit.civInfo)
|
|
||||||
|
|
||||||
fun automateWorkerAction() {
|
fun automateWorkerAction() {
|
||||||
val enemyUnitsInWalkingDistance = unit.movement.getDistanceToTiles().keys
|
val enemyUnitsInWalkingDistance = unit.movement.getDistanceToTiles().keys
|
||||||
.filter(this::containsEnemyMilitaryUnit)
|
.filter { UnitAutomation.containsEnemyMilitaryUnit(unit, it) }
|
||||||
|
|
||||||
if (enemyUnitsInWalkingDistance.isNotEmpty()) return runAway()
|
if (enemyUnitsInWalkingDistance.isNotEmpty()) return UnitAutomation.runAway(unit)
|
||||||
|
|
||||||
val currentTile = unit.getTile()
|
val currentTile = unit.getTile()
|
||||||
val tileToWork = findTileToWork()
|
val tileToWork = findTileToWork()
|
||||||
|
@ -34,7 +32,7 @@ class WorkerAutomation(val unit: MapUnit) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currentTile.improvementInProgress == null && currentTile.isLand
|
if (currentTile.improvementInProgress == null && currentTile.isLand
|
||||||
&& tileCanBeImproved(currentTile,unit.civInfo)) {
|
&& tileCanBeImproved(currentTile, unit.civInfo)) {
|
||||||
return currentTile.startWorkingOnImprovement(chooseImprovement(currentTile, unit.civInfo)!!, unit.civInfo)
|
return currentTile.startWorkingOnImprovement(chooseImprovement(currentTile, unit.civInfo)!!, unit.civInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,27 +60,6 @@ class WorkerAutomation(val unit: MapUnit) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun countDistanceToClosestEnemy(tile: TileInfo): Int {
|
|
||||||
for(i in 1..3)
|
|
||||||
if(tile.getTilesAtDistance(i).any(this::containsEnemyMilitaryUnit))
|
|
||||||
return i
|
|
||||||
return 4
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun runAway() {
|
|
||||||
val reachableTiles = unit.movement.getDistanceToTiles()
|
|
||||||
val enterableCity = reachableTiles.keys.firstOrNull { it.isCityCenter() && unit.movement.canMoveTo(it) }
|
|
||||||
if(enterableCity!=null) {
|
|
||||||
unit.movement.moveToTile(enterableCity)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
val tileFurthestFromEnemy = reachableTiles.keys.filter { unit.movement.canMoveTo(it) }
|
|
||||||
.maxBy(this::countDistanceToClosestEnemy)
|
|
||||||
if(tileFurthestFromEnemy==null) return // can't move anywhere!
|
|
||||||
unit.movement.moveToTile(tileFurthestFromEnemy)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private fun tryConnectingCities(unit: MapUnit):Boolean { // returns whether we actually did anything
|
private fun tryConnectingCities(unit: MapUnit):Boolean { // returns whether we actually did anything
|
||||||
//Player can choose not to auto-build roads & railroads.
|
//Player can choose not to auto-build roads & railroads.
|
||||||
if (unit.civInfo.isPlayerCivilization() && !UncivGame.Current.settings.autoBuildingRoads)
|
if (unit.civInfo.isPlayerCivilization() && !UncivGame.Current.settings.autoBuildingRoads)
|
||||||
|
|
Loading…
Reference in a new issue