Fixed "Arial units trying to move to their own tile" crashing bug

This commit is contained in:
Yair Morgenstern 2019-12-03 20:45:35 +02:00
parent 9868749d56
commit cf4d40501e
2 changed files with 27 additions and 25 deletions

View File

@ -198,7 +198,7 @@ class SpecificUnitAutomation{
} }
val pathsToCities = unit.movement.getArialPathsToCities() val pathsToCities = unit.movement.getArialPathsToCities()
if(pathsToCities.size==1) return // can't actually move anywhere else if(pathsToCities.isEmpty()) return // can't actually move anywhere else
val citiesByNearbyAirUnits = pathsToCities.keys val citiesByNearbyAirUnits = pathsToCities.keys
.groupBy { it.getTilesInDistance(unit.getRange()) .groupBy { it.getTilesInDistance(unit.getRange())
@ -213,43 +213,43 @@ class SpecificUnitAutomation{
} }
// no city needs fighters to defend, so let's attack stuff from the closest possible location // no city needs fighters to defend, so let's attack stuff from the closest possible location
val citiesThatCanAttackFrom = pathsToCities.keys tryMoveToCitiesToArialAttackFrom(pathsToCities, unit)
.filter { it.getTilesInDistance(unit.getRange())
.any { UnitAutomation().containsAttackableEnemy(it,MapUnitCombatant(unit)) } }
if(citiesThatCanAttackFrom.isEmpty()) return
val closestCityThatCanAttackFrom = citiesThatCanAttackFrom.minBy { pathsToCities[it]!!.size }!!
val firstStepInPath = pathsToCities[closestCityThatCanAttackFrom]!!.first()
unit.movement.moveToTile(firstStepInPath)
} }
fun automateBomber(unit: MapUnit) { fun automateBomber(unit: MapUnit) {
if(UnitAutomation().tryAttackNearbyEnemy(unit)) return if (UnitAutomation().tryAttackNearbyEnemy(unit)) return
val tilesInRange = unit.currentTile.getTilesInDistance(unit.getRange()) val tilesInRange = unit.currentTile.getTilesInDistance(unit.getRange())
val immediatelyReachableCities = tilesInRange
.filter { it.isCityCenter() && it.getOwner()==unit.civInfo && unit.movement.canMoveTo(it)}
for(city in immediatelyReachableCities){ val immediatelyReachableCities = tilesInRange
if(city.getTilesInDistance(unit.getRange()) .filter { it.isCityCenter() && it.getOwner() == unit.civInfo && unit.movement.canMoveTo(it) }
.any { UnitAutomation().containsAttackableEnemy(it,MapUnitCombatant(unit)) }) {
for (city in immediatelyReachableCities) {
if (city.getTilesInDistance(unit.getRange())
.any { UnitAutomation().containsAttackableEnemy(it, MapUnitCombatant(unit)) }) {
unit.movement.moveToTile(city) unit.movement.moveToTile(city)
return return
} }
} }
val pathsToCities = unit.movement.getArialPathsToCities() val pathsToCities = unit.movement.getArialPathsToCities()
if(pathsToCities.size==1) return // can't actually move anywhere else if (pathsToCities.isEmpty()) return // can't actually move anywhere else
tryMoveToCitiesToArialAttackFrom(pathsToCities, unit)
}
private fun tryMoveToCitiesToArialAttackFrom(pathsToCities: HashMap<TileInfo, ArrayList<TileInfo>>, airUnit: MapUnit) {
val citiesThatCanAttackFrom = pathsToCities.keys val citiesThatCanAttackFrom = pathsToCities.keys
.filter { it.getTilesInDistance(unit.getRange()) .filter {
.any { UnitAutomation().containsAttackableEnemy(it,MapUnitCombatant(unit)) } } it != airUnit.currentTile
if(citiesThatCanAttackFrom.isEmpty()) return && it.getTilesInDistance(airUnit.getRange())
.any { UnitAutomation().containsAttackableEnemy(it, MapUnitCombatant(airUnit)) }
}
if (citiesThatCanAttackFrom.isEmpty()) return
val closestCityThatCanAttackFrom = citiesThatCanAttackFrom.minBy { pathsToCities[it]!!.size }!! val closestCityThatCanAttackFrom = citiesThatCanAttackFrom.minBy { pathsToCities[it]!!.size }!!
val firstStepInPath = pathsToCities[closestCityThatCanAttackFrom]!!.first() val firstStepInPath = pathsToCities[closestCityThatCanAttackFrom]!!.first()
unit.movement.moveToTile(firstStepInPath) airUnit.movement.moveToTile(firstStepInPath)
} }
} }

View File

@ -321,12 +321,12 @@ class UnitMovementAlgorithms(val unit:MapUnit) {
while(tilesToCheck.isNotEmpty()) { while(tilesToCheck.isNotEmpty()) {
val newTilesToCheck = ArrayList<TileInfo>() val newTilesToCheck = ArrayList<TileInfo>()
for(tileToCheck in tilesToCheck){ for(currentTileToCheck in tilesToCheck){
val reachableTiles = tileToCheck.getTilesInDistance(unit.getRange()) val reachableTiles = currentTileToCheck.getTilesInDistance(unit.getRange())
.filter { unit.movement.canMoveTo(it) } .filter { unit.movement.canMoveTo(it) }
for(reachableTile in reachableTiles){ for(reachableTile in reachableTiles) {
if(tilesReached.containsKey(reachableTile)) continue if (tilesReached.containsKey(reachableTile)) continue
tilesReached[reachableTile]=tileToCheck tilesReached[reachableTile] = currentTileToCheck
newTilesToCheck.add(reachableTile) newTilesToCheck.add(reachableTile)
} }
} }
@ -345,6 +345,8 @@ class UnitMovementAlgorithms(val unit:MapUnit) {
path.reverse() path.reverse()
pathsToCities[city] = path pathsToCities[city] = path
} }
pathsToCities.remove(startingTile)
return pathsToCities return pathsToCities
} }
} }