mirror of
https://github.com/yairm210/Unciv.git
synced 2025-09-30 07:21:34 -04:00
Fixed "Arial units trying to move to their own tile" crashing bug
This commit is contained in:
parent
9868749d56
commit
cf4d40501e
@ -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,14 +213,7 @@ 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)
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -228,6 +221,7 @@ class SpecificUnitAutomation{
|
|||||||
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
|
val immediatelyReachableCities = tilesInRange
|
||||||
.filter { it.isCityCenter() && it.getOwner() == unit.civInfo && unit.movement.canMoveTo(it) }
|
.filter { it.isCityCenter() && it.getOwner() == unit.civInfo && unit.movement.canMoveTo(it) }
|
||||||
|
|
||||||
@ -240,16 +234,22 @@ 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
|
||||||
|
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
|
||||||
|
&& it.getTilesInDistance(airUnit.getRange())
|
||||||
|
.any { UnitAutomation().containsAttackableEnemy(it, MapUnitCombatant(airUnit)) }
|
||||||
|
}
|
||||||
if (citiesThatCanAttackFrom.isEmpty()) return
|
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user