- Clear all unit movement caches upon a road being pillaged
- Log when this happens
- Minor whitespace fixes
This commit is contained in:
Will Allen 2023-11-30 11:13:39 -06:00 committed by GitHub
parent 01636c27f0
commit 70bbfe14d6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 10 deletions

View File

@ -125,7 +125,7 @@ object UnitAutomation {
}
internal fun tryUpgradeUnit(unit: MapUnit): Boolean {
if (unit.civ.isHuman() && (!UncivGame.Current.settings.automatedUnitsCanUpgrade
if (unit.civ.isHuman() && (!UncivGame.Current.settings.automatedUnitsCanUpgrade
|| UncivGame.Current.settings.autoPlay.isAutoPlayingAndFullAI())) return false
if (unit.baseUnit.upgradesTo == null) return false
val upgradedUnit = unit.upgrade.getUnitToUpgradeTo()
@ -173,18 +173,18 @@ object UnitAutomation {
CivilianUnitAutomation.automateCivilianUnit(unit)
return
}
if (unit.baseUnit.isAirUnit()) {
if (unit.canIntercept())
return AirUnitAutomation.automateFighter(unit)
if (!unit.baseUnit.isNuclearWeapon())
return AirUnitAutomation.automateBomber(unit)
// Note that not all nukes have to be air units
if (unit.baseUnit.isNuclearWeapon())
return AirUnitAutomation.automateNukes(unit)
if (unit.hasUnique(UniqueType.SelfDestructs))
return AirUnitAutomation.automateMissile(unit)
}
@ -263,7 +263,7 @@ object UnitAutomation {
if (unit.isCivilian()) return false
// Better to do a more healing oriented move then
if (unit.civ.threatManager.getDistanceToClosestEnemyUnit(unit.getTile(),6, true) > 4) return false
if (unit.baseUnit.isAirUnit()) {
return false
}
@ -273,9 +273,8 @@ object UnitAutomation {
for (swapTile in swapableTiles) {
val otherUnit = swapTile.militaryUnit!!
val ourDistanceToClosestEnemy = unit.civ.threatManager.getDistanceToClosestEnemyUnit(unit.getTile(),6, false)
if (otherUnit.health > 80
if (otherUnit.health > 80
&& ourDistanceToClosestEnemy < otherUnit.civ.threatManager.getDistanceToClosestEnemyUnit(otherUnit.getTile(),6,false)) {
if (otherUnit.baseUnit.isRanged()) {
// Don't swap ranged units closer than they have to be
val range = otherUnit.baseUnit.range
@ -588,6 +587,6 @@ object UnitAutomation {
unit.civ.addNotification("${unit.shortDisplayName()} finished exploring.", unit.currentTile.position, NotificationCategory.Units, unit.name, "OtherIcons/Sleep")
unit.action = null
}
}

View File

@ -27,6 +27,7 @@ import com.unciv.models.ruleset.unique.UniqueType
import com.unciv.ui.components.extensions.withItem
import com.unciv.ui.components.extensions.withoutItem
import com.unciv.utils.DebugUtils
import com.unciv.utils.Log
import kotlin.math.abs
import kotlin.math.min
import kotlin.random.Random
@ -895,8 +896,10 @@ open class Tile : IsPartOfGameInfoSerialization {
// otherwise use pillage/repair systems
if (canPillageTileImprovement())
improvementIsPillaged = true
else
else {
roadIsPillaged = true
clearAllPathfindingCaches()
}
}
owningCity?.reassignPopulationDeferred()
@ -904,6 +907,16 @@ open class Tile : IsPartOfGameInfoSerialization {
owningCity!!.civ.cache.updateCivResources()
}
private fun clearAllPathfindingCaches() {
val units = tileMap.gameInfo.civilizations.asSequence()
.filter { it.isAlive() }
.flatMap { it.units.getCivUnits() }
Log.debug("%s: road pillaged, clearing cache for %d units", this, { units.count() })
for (otherUnit in units) {
otherUnit.movement.clearPathfindingCache()
}
}
fun isPillaged(): Boolean = improvementIsPillaged || roadIsPillaged
fun setRepaired() {