Better great general placement calc

This commit is contained in:
Yair Morgenstern
2023-02-06 23:44:33 +02:00
parent 4642c1a576
commit d161a0a088
2 changed files with 6 additions and 4 deletions

View File

@ -1,5 +1,6 @@
package com.unciv.logic.battle
import com.unciv.logic.automation.unit.BattleHelper
import com.unciv.logic.automation.unit.SpecificUnitAutomation
import com.unciv.logic.map.mapunit.MapUnit
import com.unciv.logic.map.tile.Tile
@ -93,7 +94,8 @@ object GreatGeneralImplementation {
.maxByOrNull { unitTile ->
unitTile.getTilesInDistance(unitBonusRadius).sumOf { auraTile ->
val militaryUnit = auraTile.militaryUnit
if (militaryUnit == null || militaryUnit.civ != general.civ) 0
if (militaryUnit == null || militaryUnit.civ != general.civ || militaryUnit.isEmbarked()) 0
else if (BattleHelper.getAttackableEnemies(militaryUnit, militaryUnit.movement.getDistanceToTiles()).isEmpty()) 0
else generalBonusData.firstOrNull {
// "Military" as commented above only a small optimization
auraTile.aerialDistanceTo(unitTile) <= it.radius

View File

@ -145,7 +145,7 @@ class UnitMovementAlgorithms(val unit: MapUnit) {
return true
}
class ParentTileAndTotalDistance(val parentTile: Tile, val totalDistance: Float)
class ParentTileAndTotalDistance(val tile:Tile, val parentTile: Tile, val totalDistance: Float)
fun isUnknownTileWeShouldAssumeToBePassable(tile: Tile) = !unit.civ.hasExplored(tile)
@ -160,7 +160,7 @@ class UnitMovementAlgorithms(val unit: MapUnit) {
val currentUnitTile = unit.currentTile
// This is for performance, because this is called all the time
val unitTile = if (origin == currentUnitTile.position) currentUnitTile else currentUnitTile.tileMap[origin]
distanceToTiles[unitTile] = ParentTileAndTotalDistance(unitTile, 0f)
distanceToTiles[unitTile] = ParentTileAndTotalDistance(unitTile, unitTile, 0f)
var tilesToCheck = listOf(unitTile)
while (tilesToCheck.isNotEmpty()) {
@ -189,7 +189,7 @@ class UnitMovementAlgorithms(val unit: MapUnit) {
// In Civ V, you can always travel between adjacent tiles, even if you don't technically
// have enough movement points - it simply depletes what you have
distanceToTiles[neighbor] = ParentTileAndTotalDistance(tileToCheck, totalDistanceToTile)
distanceToTiles[neighbor] = ParentTileAndTotalDistance(neighbor, tileToCheck, totalDistanceToTile)
}
}