Worker automation option fix (#11024)

* Generalized removing fallout

* Automated workers don't replace improvements when the option is set
This commit is contained in:
Oskar Niesen 2024-01-28 03:07:22 -06:00 committed by GitHub
parent d53766b7d7
commit f93a3f462b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 13 additions and 6 deletions

View File

@ -190,7 +190,7 @@ object AirUnitAutomation {
else if (targetTile.owningCity != null) { else if (targetTile.owningCity != null) {
val owningCiv = targetTile.owningCity?.civ!! val owningCiv = targetTile.owningCity?.civ!!
// If there is a tile to add fallout to there is a 50% chance it will get fallout // If there is a tile to add fallout to there is a 50% chance it will get fallout
if (!(tile.isWater || tile.isImpassible() || targetTile.terrainFeatures.any { it == "Fallout" })) if (!(tile.isWater || tile.isImpassible() || targetTile.hasFalloutEquivalent()))
explosionValue += evaluateCivValue(owningCiv, -40, 10) explosionValue += evaluateCivValue(owningCiv, -40, 10)
// If there is an improvment to pillage // If there is an improvment to pillage
if (targetTile.improvement != null && !targetTile.improvementIsPillaged) if (targetTile.improvement != null && !targetTile.improvementIsPillaged)

View File

@ -25,7 +25,6 @@ import com.unciv.models.ruleset.tile.Terrain
import com.unciv.models.ruleset.tile.TileImprovement import com.unciv.models.ruleset.tile.TileImprovement
import com.unciv.models.ruleset.unique.LocalUniqueCache import com.unciv.models.ruleset.unique.LocalUniqueCache
import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.ruleset.unique.UniqueType
import com.unciv.models.stats.Stats
import com.unciv.ui.screens.worldscreen.unit.actions.UnitActions import com.unciv.ui.screens.worldscreen.unit.actions.UnitActions
import com.unciv.ui.screens.worldscreen.unit.actions.UnitActionsFromUniques import com.unciv.ui.screens.worldscreen.unit.actions.UnitActionsFromUniques
import com.unciv.utils.Log import com.unciv.utils.Log
@ -474,7 +473,7 @@ class WorkerAutomation(
private fun findTileToWork(unit: MapUnit, tilesToAvoid: Set<Tile>): Tile { private fun findTileToWork(unit: MapUnit, tilesToAvoid: Set<Tile>): Tile {
val currentTile = unit.getTile() val currentTile = unit.getTile()
if (currentTile != tilesToAvoid && getBasePriority(currentTile, unit) >= 5 if (currentTile != tilesToAvoid && getBasePriority(currentTile, unit) >= 5
&& (tileHasWorkToDo(currentTile, unit) || currentTile.isPillaged() || currentTile.terrainFeatures.contains("Fallout"))) { && (tileHasWorkToDo(currentTile, unit) || currentTile.isPillaged() || currentTile.hasFalloutEquivalent())) {
return currentTile return currentTile
} }
val workableTilesCenterFirst = currentTile.getTilesInDistance(4) val workableTilesCenterFirst = currentTile.getTilesInDistance(4)
@ -524,8 +523,7 @@ class WorkerAutomation(
priority += Automation.rankStatsValue(tile.stats.getTerrainStatsBreakdown().toStats(), civInfo) priority += Automation.rankStatsValue(tile.stats.getTerrainStatsBreakdown().toStats(), civInfo)
if (tile.providesYield()) priority += 2 if (tile.providesYield()) priority += 2
if (tile.isPillaged()) priority += 1 if (tile.isPillaged()) priority += 1
// TODO: Removing fallout is hardcoded for now, but what if we want to have other bad features on tiles? if (tile.hasFalloutEquivalent()) priority += 1
if (tile.terrainFeatures.contains("Fallout")) priority += 1
} }
// give a minor priority to tiles that we could expand onto // give a minor priority to tiles that we could expand onto
else if (tile.getOwner() == null && tile.neighbors.any { it.getOwner() == civInfo }) else if (tile.getOwner() == null && tile.neighbors.any { it.getOwner() == civInfo })
@ -623,11 +621,17 @@ class WorkerAutomation(
val localUniqueCache = LocalUniqueCache() val localUniqueCache = LocalUniqueCache()
val bestBuildableImprovement = potentialTileImprovements.values.asSequence() var bestBuildableImprovement = potentialTileImprovements.values.asSequence()
.map { Pair(it, getImprovementRanking(tile, unit,it.name, localUniqueCache)) } .map { Pair(it, getImprovementRanking(tile, unit,it.name, localUniqueCache)) }
.filter { it.second > 0f } .filter { it.second > 0f }
.maxByOrNull { it.second }?.first .maxByOrNull { it.second }?.first
if (tile.improvement != null && civInfo.isHuman() && (!UncivGame.Current.settings.automatedWorkersReplaceImprovements
|| UncivGame.Current.settings.autoPlay.isAutoPlayingAndFullAI())) {
// Note that we might still want to build roads or remove fallout, so we can't exit the function immedietly
bestBuildableImprovement = null
}
val lastTerrain = tile.lastTerrain val lastTerrain = tile.lastTerrain
fun isRemovable(terrain: Terrain): Boolean = ruleSet.tileImprovements.containsKey(Constants.remove + terrain.name) fun isRemovable(terrain: Terrain): Boolean = ruleSet.tileImprovements.containsKey(Constants.remove + terrain.name)

View File

@ -343,6 +343,9 @@ open class Tile : IsPartOfGameInfoSerialization {
viewingCiv.lastSeenImprovement[position] viewingCiv.lastSeenImprovement[position]
} }
/** Returns true if this tile has fallout or an equivalent terrain feature */
fun hasFalloutEquivalent(): Boolean = terrainFeatures.any { ruleset.terrains[it]!!.hasUnique(UniqueType.NullifyYields)}
// This is for performance - since we access the neighbors of a tile ALL THE TIME, // This is for performance - since we access the neighbors of a tile ALL THE TIME,
// and the neighbors of a tile never change, it's much more efficient to save the list once and for all! // and the neighbors of a tile never change, it's much more efficient to save the list once and for all!