diff --git a/core/src/com/unciv/logic/city/managers/CityExpansionManager.kt b/core/src/com/unciv/logic/city/managers/CityExpansionManager.kt index 3de51bb992..1df09970ef 100644 --- a/core/src/com/unciv/logic/city/managers/CityExpansionManager.kt +++ b/core/src/com/unciv/logic/city/managers/CityExpansionManager.kt @@ -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() diff --git a/core/src/com/unciv/logic/city/managers/CityInfoConquestFunctions.kt b/core/src/com/unciv/logic/city/managers/CityInfoConquestFunctions.kt index 39ea24bfbf..7d47f59671 100644 --- a/core/src/com/unciv/logic/city/managers/CityInfoConquestFunctions.kt +++ b/core/src/com/unciv/logic/city/managers/CityInfoConquestFunctions.kt @@ -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() } diff --git a/core/src/com/unciv/logic/city/managers/CityPopulationManager.kt b/core/src/com/unciv/logic/city/managers/CityPopulationManager.kt index 72e11fd586..bca375f46e 100644 --- a/core/src/com/unciv/logic/city/managers/CityPopulationManager.kt +++ b/core/src/com/unciv/logic/city/managers/CityPopulationManager.kt @@ -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.