- 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 { 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 || UncivGame.Current.settings.autoPlay.isAutoPlayingAndFullAI())) return false
if (unit.baseUnit.upgradesTo == null) return false if (unit.baseUnit.upgradesTo == null) return false
val upgradedUnit = unit.upgrade.getUnitToUpgradeTo() val upgradedUnit = unit.upgrade.getUnitToUpgradeTo()
@ -173,18 +173,18 @@ object UnitAutomation {
CivilianUnitAutomation.automateCivilianUnit(unit) CivilianUnitAutomation.automateCivilianUnit(unit)
return return
} }
if (unit.baseUnit.isAirUnit()) { if (unit.baseUnit.isAirUnit()) {
if (unit.canIntercept()) if (unit.canIntercept())
return AirUnitAutomation.automateFighter(unit) return AirUnitAutomation.automateFighter(unit)
if (!unit.baseUnit.isNuclearWeapon()) if (!unit.baseUnit.isNuclearWeapon())
return AirUnitAutomation.automateBomber(unit) return AirUnitAutomation.automateBomber(unit)
// Note that not all nukes have to be air units // Note that not all nukes have to be air units
if (unit.baseUnit.isNuclearWeapon()) if (unit.baseUnit.isNuclearWeapon())
return AirUnitAutomation.automateNukes(unit) return AirUnitAutomation.automateNukes(unit)
if (unit.hasUnique(UniqueType.SelfDestructs)) if (unit.hasUnique(UniqueType.SelfDestructs))
return AirUnitAutomation.automateMissile(unit) return AirUnitAutomation.automateMissile(unit)
} }
@ -263,7 +263,7 @@ object UnitAutomation {
if (unit.isCivilian()) return false if (unit.isCivilian()) return false
// Better to do a more healing oriented move then // Better to do a more healing oriented move then
if (unit.civ.threatManager.getDistanceToClosestEnemyUnit(unit.getTile(),6, true) > 4) return false if (unit.civ.threatManager.getDistanceToClosestEnemyUnit(unit.getTile(),6, true) > 4) return false
if (unit.baseUnit.isAirUnit()) { if (unit.baseUnit.isAirUnit()) {
return false return false
} }
@ -273,9 +273,8 @@ object UnitAutomation {
for (swapTile in swapableTiles) { for (swapTile in swapableTiles) {
val otherUnit = swapTile.militaryUnit!! val otherUnit = swapTile.militaryUnit!!
val ourDistanceToClosestEnemy = unit.civ.threatManager.getDistanceToClosestEnemyUnit(unit.getTile(),6, false) 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)) { && ourDistanceToClosestEnemy < otherUnit.civ.threatManager.getDistanceToClosestEnemyUnit(otherUnit.getTile(),6,false)) {
if (otherUnit.baseUnit.isRanged()) { if (otherUnit.baseUnit.isRanged()) {
// Don't swap ranged units closer than they have to be // Don't swap ranged units closer than they have to be
val range = otherUnit.baseUnit.range 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.civ.addNotification("${unit.shortDisplayName()} finished exploring.", unit.currentTile.position, NotificationCategory.Units, unit.name, "OtherIcons/Sleep")
unit.action = null 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.withItem
import com.unciv.ui.components.extensions.withoutItem import com.unciv.ui.components.extensions.withoutItem
import com.unciv.utils.DebugUtils import com.unciv.utils.DebugUtils
import com.unciv.utils.Log
import kotlin.math.abs import kotlin.math.abs
import kotlin.math.min import kotlin.math.min
import kotlin.random.Random import kotlin.random.Random
@ -895,8 +896,10 @@ open class Tile : IsPartOfGameInfoSerialization {
// otherwise use pillage/repair systems // otherwise use pillage/repair systems
if (canPillageTileImprovement()) if (canPillageTileImprovement())
improvementIsPillaged = true improvementIsPillaged = true
else else {
roadIsPillaged = true roadIsPillaged = true
clearAllPathfindingCaches()
}
} }
owningCity?.reassignPopulationDeferred() owningCity?.reassignPopulationDeferred()
@ -904,6 +907,16 @@ open class Tile : IsPartOfGameInfoSerialization {
owningCity!!.civ.cache.updateCivResources() 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 isPillaged(): Boolean = improvementIsPillaged || roadIsPillaged
fun setRepaired() { fun setRepaired() {