mirror of
https://github.com/yairm210/Unciv.git
synced 2025-07-20 04:38:18 +07:00
Better great general placement calc
This commit is contained in:
@ -1,5 +1,6 @@
|
|||||||
package com.unciv.logic.battle
|
package com.unciv.logic.battle
|
||||||
|
|
||||||
|
import com.unciv.logic.automation.unit.BattleHelper
|
||||||
import com.unciv.logic.automation.unit.SpecificUnitAutomation
|
import com.unciv.logic.automation.unit.SpecificUnitAutomation
|
||||||
import com.unciv.logic.map.mapunit.MapUnit
|
import com.unciv.logic.map.mapunit.MapUnit
|
||||||
import com.unciv.logic.map.tile.Tile
|
import com.unciv.logic.map.tile.Tile
|
||||||
@ -93,7 +94,8 @@ object GreatGeneralImplementation {
|
|||||||
.maxByOrNull { unitTile ->
|
.maxByOrNull { unitTile ->
|
||||||
unitTile.getTilesInDistance(unitBonusRadius).sumOf { auraTile ->
|
unitTile.getTilesInDistance(unitBonusRadius).sumOf { auraTile ->
|
||||||
val militaryUnit = auraTile.militaryUnit
|
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 {
|
else generalBonusData.firstOrNull {
|
||||||
// "Military" as commented above only a small optimization
|
// "Military" as commented above only a small optimization
|
||||||
auraTile.aerialDistanceTo(unitTile) <= it.radius
|
auraTile.aerialDistanceTo(unitTile) <= it.radius
|
||||||
|
@ -145,7 +145,7 @@ class UnitMovementAlgorithms(val unit: MapUnit) {
|
|||||||
return true
|
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)
|
fun isUnknownTileWeShouldAssumeToBePassable(tile: Tile) = !unit.civ.hasExplored(tile)
|
||||||
|
|
||||||
@ -160,7 +160,7 @@ class UnitMovementAlgorithms(val unit: MapUnit) {
|
|||||||
val currentUnitTile = unit.currentTile
|
val currentUnitTile = unit.currentTile
|
||||||
// This is for performance, because this is called all the time
|
// This is for performance, because this is called all the time
|
||||||
val unitTile = if (origin == currentUnitTile.position) currentUnitTile else currentUnitTile.tileMap[origin]
|
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)
|
var tilesToCheck = listOf(unitTile)
|
||||||
|
|
||||||
while (tilesToCheck.isNotEmpty()) {
|
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
|
// 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
|
// have enough movement points - it simply depletes what you have
|
||||||
|
|
||||||
distanceToTiles[neighbor] = ParentTileAndTotalDistance(tileToCheck, totalDistanceToTile)
|
distanceToTiles[neighbor] = ParentTileAndTotalDistance(neighbor, tileToCheck, totalDistanceToTile)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user