Resolved "dead population working tiles" bug

When removing a worked tile, remove it from locked tiles
This commit is contained in:
Yair Morgenstern 2023-02-06 22:53:43 +02:00
parent 34815eb296
commit 4642c1a576
3 changed files with 15 additions and 11 deletions

View File

@ -138,11 +138,9 @@ class CityExpansionManager : IsPartOfGameInfoSerialization {
city.tiles = city.tiles.withoutItem(tile.position)
for (city in city.civ.cities) {
if (city.isWorked(tile)) {
city.workedTiles = city.workedTiles.withoutItem(tile.position)
city.population.stopWorkingTile(tile.position)
city.population.autoAssignPopulation()
}
if (city.lockedTiles.contains(tile.position))
city.lockedTiles.remove(tile.position)
}
tile.improvementFunctions.removeCreatesOneImprovementMarker()

View File

@ -3,8 +3,8 @@
import com.unciv.Constants
import com.unciv.UncivGame
import com.unciv.logic.battle.Battle
import com.unciv.logic.city.CityFlags
import com.unciv.logic.city.City
import com.unciv.logic.city.CityFlags
import com.unciv.logic.civilization.Civilization
import com.unciv.logic.civilization.NotificationCategory
import com.unciv.logic.civilization.NotificationIcon
@ -14,7 +14,6 @@ import com.unciv.logic.trade.TradeLogic
import com.unciv.logic.trade.TradeOffer
import com.unciv.logic.trade.TradeType
import com.unciv.models.ruleset.unique.UniqueType
import com.unciv.ui.utils.extensions.withoutItem
import com.unciv.utils.debug
import kotlin.math.max
import kotlin.math.min
@ -287,8 +286,8 @@ class CityInfoConquestFunctions(val city: City){
previousOwner = oldCiv.civName
// now that the tiles have changed, we need to reassign population
for (it in workedTiles.filterNot { tiles.contains(it) }) {
workedTiles = workedTiles.withoutItem(it)
for (workedTile in workedTiles.filterNot { tiles.contains(it) }) {
population.stopWorkingTile(workedTile)
population.autoAssignPopulation()
}

View File

@ -1,5 +1,6 @@
package com.unciv.logic.city.managers
import com.badlogic.gdx.math.Vector2
import com.unciv.logic.IsPartOfGameInfoSerialization
import com.unciv.logic.automation.Automation
import com.unciv.logic.city.City
@ -185,11 +186,16 @@ class CityPopulationManager : IsPartOfGameInfoSerialization {
city.cityStats.update()
}
fun stopWorkingTile(position: Vector2){
city.workedTiles = city.workedTiles.withoutItem(position)
city.lockedTiles.remove(position)
}
fun unassignExtraPopulation() {
for (tile in city.workedTiles.map { city.tileMap[it] }) {
if (tile.getOwner() != city.civ || tile.getWorkingCity() != city
|| tile.aerialDistanceTo(city.getCenterTile()) > 3)
city.workedTiles = city.workedTiles.withoutItem(tile.position)
city.population.stopWorkingTile(tile.position)
}
// unassign specialists that cannot be (e.g. the city was captured and one of the specialist buildings was destroyed)
@ -227,13 +233,14 @@ class CityPopulationManager : IsPartOfGameInfoSerialization {
when {
worstAutoJob != null && worstWorkedTile != null -> {
// choose between removing a specialist and removing a tile
if (valueWorstTile < valueWorstSpecialist)
city.workedTiles = city.workedTiles.withoutItem(worstWorkedTile.position)
if (valueWorstTile < valueWorstSpecialist) {
stopWorkingTile(worstWorkedTile.position)
}
else
specialistAllocations.add(worstAutoJob, -1)
}
worstAutoJob != null -> specialistAllocations.add(worstAutoJob, -1)
worstWorkedTile != null -> city.workedTiles = city.workedTiles.withoutItem(worstWorkedTile.position)
worstWorkedTile != null -> stopWorkingTile(worstWorkedTile.position)
else -> {
// It happens when "cityInfo.manualSpecialists == true"
// and population goes below the number of specialists, e.g. city is razing.