City tiles are always contiguous, otherwise loads of wierd bugs happen

Also, better calculation of the number of claimed tiles
In retrospect this has been plaguing us for a long time
This commit is contained in:
Yair Morgenstern
2020-04-20 01:46:21 +03:00
parent 1564502fc2
commit 81097fdde9

View File

@ -6,6 +6,7 @@ import com.unciv.logic.automation.Automation
import com.unciv.logic.map.TileInfo import com.unciv.logic.map.TileInfo
import com.unciv.ui.utils.withItem import com.unciv.ui.utils.withItem
import com.unciv.ui.utils.withoutItem import com.unciv.ui.utils.withoutItem
import kotlin.math.max
import kotlin.math.pow import kotlin.math.pow
import kotlin.math.roundToInt import kotlin.math.roundToInt
@ -20,8 +21,12 @@ class CityExpansionManager {
return toReturn return toReturn
} }
fun tilesClaimed() = cityInfo.tiles.size - 7 fun tilesClaimed(): Int {
fun isAreaMaxed(): Boolean = (cityInfo.tiles.size >= 90) val tilesAroundCity = cityInfo.getCenterTile().getTilesInDistance(1)
.map { it.position }
return cityInfo.tiles.filterNot { it in tilesAroundCity }.size
}
fun isAreaMaxed(): Boolean = cityInfo.tiles.size >= 90
// This one has conflicting sources - // This one has conflicting sources -
// http://civilization.wikia.com/wiki/Mathematics_of_Civilization_V says it's 20+(10(t-1))^1.1 // http://civilization.wikia.com/wiki/Mathematics_of_Civilization_V says it's 20+(10(t-1))^1.1
@ -29,7 +34,7 @@ class CityExpansionManager {
// (per game XML files) at 6*(t+0.4813)^1.3 // (per game XML files) at 6*(t+0.4813)^1.3
// The second seems to be more based, so I'll go with that // The second seems to be more based, so I'll go with that
fun getCultureToNextTile(): Int { fun getCultureToNextTile(): Int {
var cultureToNextTile = 6 * (kotlin.math.max(0, tilesClaimed()) + 1.4813).pow(1.3) var cultureToNextTile = 6 * (max(0, tilesClaimed()) + 1.4813).pow(1.3)
if (cityInfo.civInfo.containsBuildingUnique("Cost of acquiring new tiles reduced by 25%")) if (cityInfo.civInfo.containsBuildingUnique("Cost of acquiring new tiles reduced by 25%"))
cultureToNextTile *= 0.75 //Speciality of Angkor Wat cultureToNextTile *= 0.75 //Speciality of Angkor Wat
if (cityInfo.containsBuildingUnique("Culture and Gold costs of acquiring new tiles reduced by 25% in this city")) if (cityInfo.containsBuildingUnique("Culture and Gold costs of acquiring new tiles reduced by 25% in this city"))
@ -40,6 +45,7 @@ class CityExpansionManager {
fun buyTile(tileInfo: TileInfo) { fun buyTile(tileInfo: TileInfo) {
val goldCost = getGoldCostOfTile(tileInfo) val goldCost = getGoldCostOfTile(tileInfo)
class NotEnoughGoldToBuyTileException : Exception() class NotEnoughGoldToBuyTileException : Exception()
if (cityInfo.civInfo.gold < goldCost) throw NotEnoughGoldToBuyTileException() if (cityInfo.civInfo.gold < goldCost) throw NotEnoughGoldToBuyTileException()
cityInfo.civInfo.gold -= goldCost cityInfo.civInfo.gold -= goldCost
@ -65,8 +71,10 @@ class CityExpansionManager {
fun chooseNewTileToOwn(): TileInfo? { fun chooseNewTileToOwn(): TileInfo? {
for (i in 2..5) { for (i in 2..5) {
val tiles = cityInfo.getCenterTile().getTilesInDistance(i) val tiles = cityInfo.getCenterTile().getTilesInDistance(i)
.filter { it.getOwner() == null .filter {
&& it.neighbors.any { tile -> tile.getOwner() == cityInfo.civInfo } } it.getOwner() == null
&& it.neighbors.any { tile -> tile.getCity() == cityInfo }
}
val chosenTile = tiles.maxBy { Automation.rankTile(it, cityInfo.civInfo) } val chosenTile = tiles.maxBy { Automation.rankTile(it, cityInfo.civInfo) }
if (chosenTile != null) if (chosenTile != null)
return chosenTile return chosenTile