Resolved ANR in City Screen by increasing performance of rankTileForExpansion

This commit is contained in:
Yair Morgenstern 2022-05-07 22:43:34 +03:00
parent 806d58074c
commit 417831085b
3 changed files with 12 additions and 8 deletions

View File

@ -12,6 +12,7 @@ import com.unciv.models.ruleset.MilestoneType
import com.unciv.models.ruleset.Victory
import com.unciv.models.ruleset.Victory.Focus
import com.unciv.models.ruleset.tile.ResourceType
import com.unciv.models.ruleset.unique.LocalUniqueCache
import com.unciv.models.ruleset.unique.UniqueType
import com.unciv.models.ruleset.unit.BaseUnit
import com.unciv.models.stats.Stats
@ -271,7 +272,8 @@ object Automation {
}
// Ranks a tile for the expansion algorithm of cities
internal fun rankTileForExpansion(tile: TileInfo, cityInfo: CityInfo): Int {
internal fun rankTileForExpansion(tile: TileInfo, cityInfo: CityInfo,
localUniqueCache: LocalUniqueCache = LocalUniqueCache(false)): Int {
// https://github.com/Gedemon/Civ5-DLL/blob/aa29e80751f541ae04858b6d2a2c7dcca454201e/CvGameCoreDLL_Expansion1/CvCity.cpp#L10301
// Apparently this is not the full calculation. The exact tiles are also
// dependent on which tiles are between the chosen tile and the city center
@ -302,7 +304,7 @@ object Automation {
if (tile.naturalWonder != null) score -= 105
// Straight up take the sum of all yields
score -= tile.getTileStats(cityInfo, cityInfo.civInfo).values.sum().toInt()
score -= tile.getTileStats(cityInfo, cityInfo.civInfo, localUniqueCache).values.sum().toInt()
// Check if we get access to better tiles from this tile
var adjacentNaturalWonder = false

View File

@ -5,6 +5,7 @@ import com.unciv.logic.automation.Automation
import com.unciv.logic.civilization.LocationAction
import com.unciv.logic.civilization.NotificationIcon
import com.unciv.logic.map.TileInfo
import com.unciv.models.ruleset.unique.LocalUniqueCache
import com.unciv.models.ruleset.unique.UniqueType
import com.unciv.ui.utils.toPercent
import com.unciv.ui.utils.withItem
@ -72,17 +73,18 @@ class CityExpansionManager {
return cost.roundToInt()
}
fun getChoosableTiles() = cityInfo.getCenterTile().getTilesInDistance(5)
.filter { it.getOwner() == null }
fun chooseNewTileToOwn(): TileInfo? {
val choosableTiles = cityInfo.getCenterTile().getTilesInDistance(5)
.filter { it.getOwner() == null }
// Technically, in the original a random tile with the lowest score was selected
// However, doing this requires either caching it, which is way more work,
// or selecting all possible tiles and only choosing one when the border expands.
// But since the order in which tiles are selected in distance is kinda random anyways,
// this is fine.
return choosableTiles.minByOrNull {
Automation.rankTileForExpansion(it, cityInfo)
val localUniqueCache = LocalUniqueCache()
return getChoosableTiles().minByOrNull {
Automation.rankTileForExpansion(it, cityInfo, localUniqueCache)
}
}

View File

@ -59,7 +59,7 @@ class CityStatsTable(val cityScreen: CityScreen): Table() {
cityInfo.population.getFreePopulation().toString() + "/" + cityInfo.population.population
var turnsToExpansionString =
if (cityInfo.cityStats.currentCityStats.culture > 0 && cityInfo.expansion.chooseNewTileToOwn() != null) {
if (cityInfo.cityStats.currentCityStats.culture > 0 && cityInfo.expansion.getChoosableTiles().any()) {
val remainingCulture = cityInfo.expansion.getCultureToNextTile() - cityInfo.expansion.cultureStored
var turnsToExpansion = ceil(remainingCulture / cityInfo.cityStats.currentCityStats.culture).toInt()
if (turnsToExpansion < 1) turnsToExpansion = 1