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) city.tiles = city.tiles.withoutItem(tile.position)
for (city in city.civ.cities) { for (city in city.civ.cities) {
if (city.isWorked(tile)) { if (city.isWorked(tile)) {
city.workedTiles = city.workedTiles.withoutItem(tile.position) city.population.stopWorkingTile(tile.position)
city.population.autoAssignPopulation() city.population.autoAssignPopulation()
} }
if (city.lockedTiles.contains(tile.position))
city.lockedTiles.remove(tile.position)
} }
tile.improvementFunctions.removeCreatesOneImprovementMarker() tile.improvementFunctions.removeCreatesOneImprovementMarker()

View File

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

View File

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