chore: Removed vestigal city.apply{} for CityInfoConquestFunctions, for clarity on what is actually for the city and what is not

No logic changes
This commit is contained in:
Yair Morgenstern 2023-06-28 10:34:29 +03:00
parent 42a9c3af57
commit bef1843cd9

View File

@ -35,58 +35,52 @@ class CityInfoConquestFunctions(val city: City){
} }
private fun destroyBuildingsOnCapture() { private fun destroyBuildingsOnCapture() {
city.apply { // Possibly remove other buildings
// Possibly remove other buildings for (building in city.cityConstructions.getBuiltBuildings()) {
for (building in cityConstructions.getBuiltBuildings()) { when {
when { building.hasUnique(UniqueType.NotDestroyedWhenCityCaptured) || building.isWonder -> continue
building.hasUnique(UniqueType.NotDestroyedWhenCityCaptured) || building.isWonder -> continue building.hasUnique(UniqueType.IndicatesCapital) -> continue // Palace needs to stay a just a bit longer so moveToCiv isn't confused
building.hasUnique(UniqueType.IndicatesCapital) -> continue // Palace needs to stay a just a bit longer so moveToCiv isn't confused building.hasUnique(UniqueType.DestroyedWhenCityCaptured) ->
building.hasUnique(UniqueType.DestroyedWhenCityCaptured) -> city.cityConstructions.removeBuilding(building.name)
cityConstructions.removeBuilding(building.name) // Regular buildings have a 34% chance of removal
else -> { tileBasedRandom.nextInt(100) < 34 -> city.cityConstructions.removeBuilding(building.name)
if (tileBasedRandom.nextInt(100) < 34) {
cityConstructions.removeBuilding(building.name)
}
}
}
} }
} }
} }
private fun removeBuildingsOnMoveToCiv(oldCiv: Civilization) { private fun removeBuildingsOnMoveToCiv(oldCiv: Civilization) {
city.apply { // Remove all buildings provided for free to this city
// Remove all buildings provided for free to this city for (building in city.civ.civConstructions.getFreeBuildings(city.id)) {
for (building in civ.civConstructions.getFreeBuildings(id)) { city.cityConstructions.removeBuilding(building)
cityConstructions.removeBuilding(building) }
// Remove all buildings provided for free from here to other cities (e.g. CN Tower)
for ((cityId, buildings) in city.cityConstructions.freeBuildingsProvidedFromThisCity) {
val city = oldCiv.cities.firstOrNull { it.id == cityId } ?: continue
debug("Removing buildings %s from city %s", buildings, city.name)
for (building in buildings) {
city.cityConstructions.removeBuilding(building)
} }
}
city.cityConstructions.freeBuildingsProvidedFromThisCity.clear()
// Remove all buildings provided for free from here to other cities (e.g. CN Tower) for (building in city.cityConstructions.getBuiltBuildings()) {
for ((cityId, buildings) in cityConstructions.freeBuildingsProvidedFromThisCity) { // Remove national wonders
val city = oldCiv.cities.firstOrNull { it.id == cityId } ?: continue if (building.isNationalWonder && !building.hasUnique(UniqueType.NotDestroyedWhenCityCaptured)
debug("Removing buildings %s from city %s", buildings, city.name) && building.name != city.capitalCityIndicator()
for (building in buildings) { ) // If we have just made this city the capital, don't remove that
city.cityConstructions.removeBuilding(building) city.cityConstructions.removeBuilding(building.name)
}
}
cityConstructions.freeBuildingsProvidedFromThisCity.clear()
for (building in cityConstructions.getBuiltBuildings()) { // Check if we exceed MaxNumberBuildable for any buildings
// Remove national wonders for (unique in building.getMatchingUniques(UniqueType.MaxNumberBuildable)) {
if (building.isNationalWonder && !building.hasUnique(UniqueType.NotDestroyedWhenCityCaptured) if (city.civ.cities
&& building.name != capitalCityIndicator()) // If we have just made this city the capital, don't remove that
cityConstructions.removeBuilding(building.name)
// Check if we exceed MaxNumberBuildable for any buildings
for (unique in building.getMatchingUniques(UniqueType.MaxNumberBuildable)) {
if (civ.cities
.count { .count {
it.cityConstructions.containsBuildingOrEquivalent(building.name) it.cityConstructions.containsBuildingOrEquivalent(building.name)
|| it.cityConstructions.isBeingConstructedOrEnqueued(building.name) || it.cityConstructions.isBeingConstructedOrEnqueued(building.name)
} >= unique.params[0].toInt() } >= unique.params[0].toInt()
) { ) {
// For now, just destroy in new city. Even if constructing in own cities // For now, just destroy in new city. Even if constructing in own cities
city.cityConstructions.removeBuilding(building.name) this.city.cityConstructions.removeBuilding(building.name)
}
} }
} }
} }
@ -98,35 +92,33 @@ class CityInfoConquestFunctions(val city: City){
*/ */
private fun conquerCity(conqueringCiv: Civilization, conqueredCiv: Civilization, receivingCiv: Civilization) { private fun conquerCity(conqueringCiv: Civilization, conqueredCiv: Civilization, receivingCiv: Civilization) {
val goldPlundered = getGoldForCapturingCity(conqueringCiv) val goldPlundered = getGoldForCapturingCity(conqueringCiv)
city.apply { conqueringCiv.addGold(goldPlundered)
conqueringCiv.addGold(goldPlundered) conqueringCiv.addNotification("Received [$goldPlundered] Gold for capturing [${city.name}]",
conqueringCiv.addNotification("Received [$goldPlundered] Gold for capturing [$name]", city.getCenterTile().position, NotificationCategory.General, NotificationIcon.Gold)
getCenterTile().position, NotificationCategory.General, NotificationIcon.Gold)
val reconqueredCityWhileStillInResistance = previousOwner == receivingCiv.civName && isInResistance() val reconqueredCityWhileStillInResistance = city.previousOwner == receivingCiv.civName && city.isInResistance()
destroyBuildingsOnCapture() destroyBuildingsOnCapture()
moveToCiv(receivingCiv) city.moveToCiv(receivingCiv)
Battle.destroyIfDefeated(conqueredCiv, conqueringCiv) Battle.destroyIfDefeated(conqueredCiv, conqueringCiv)
health = getMaxHealth() / 2 // I think that cities recover to half health when conquered? city.health = city.getMaxHealth() / 2 // I think that cities recover to half health when conquered?
if (population.population > 1) if (city.population.population > 1)
population.addPopulation(-1 - population.population / 4) // so from 2-4 population, remove 1, from 5-8, remove 2, etc. city.population.addPopulation(-1 - city.population.population / 4) // so from 2-4 population, remove 1, from 5-8, remove 2, etc.
reassignAllPopulation() city.reassignAllPopulation()
if (!reconqueredCityWhileStillInResistance && foundingCiv != receivingCiv.civName) { if (!reconqueredCityWhileStillInResistance && city.foundingCiv != receivingCiv.civName) {
// add resistance // add resistance
// I checked, and even if you puppet there's resistance for conquering // I checked, and even if you puppet there's resistance for conquering
setFlag(CityFlags.Resistance, population.population) city.setFlag(CityFlags.Resistance, city.population.population)
} else { } else {
// reconquering or liberating city in resistance so eliminate it // reconquering or liberating city in resistance so eliminate it
removeFlag(CityFlags.Resistance) city.removeFlag(CityFlags.Resistance)
}
espionage.removeAllPresentSpies(SpyFleeReason.CityCaptured)
} }
city.espionage.removeAllPresentSpies(SpyFleeReason.CityCaptured)
} }
@ -135,23 +127,20 @@ class CityInfoConquestFunctions(val city: City){
// Gain gold for plundering city // Gain gold for plundering city
@Suppress("UNUSED_VARIABLE") // todo: use this val @Suppress("UNUSED_VARIABLE") // todo: use this val
val goldPlundered = getGoldForCapturingCity(conqueringCiv) val goldPlundered = getGoldForCapturingCity(conqueringCiv)
city.apply { val oldCiv = city.civ
val oldCiv = civ // must be before moving the city to the conquering civ,
// so the repercussions are properly checked
diplomaticRepercussionsForConqueringCity(oldCiv, conqueringCiv)
// must be before moving the city to the conquering civ, conquerCity(conqueringCiv, oldCiv, conqueringCiv)
// so the repercussions are properly checked
diplomaticRepercussionsForConqueringCity(oldCiv, conqueringCiv)
conquerCity(conqueringCiv, oldCiv, conqueringCiv) city.isPuppet = true
city.cityStats.update()
isPuppet = true // The city could be producing something that puppets shouldn't, like units
cityStats.update() city.cityConstructions.currentConstructionIsUserSet = false
// The city could be producing something that puppets shouldn't, like units city.cityConstructions.constructionQueue.clear()
cityConstructions.currentConstructionIsUserSet = false city.cityConstructions.chooseNextConstruction()
cityConstructions.constructionQueue.clear()
cityConstructions.chooseNextConstruction()
}
} }
fun annexCity() { fun annexCity() {
@ -187,51 +176,50 @@ class CityInfoConquestFunctions(val city: City){
} }
fun liberateCity(conqueringCiv: Civilization) { fun liberateCity(conqueringCiv: Civilization) {
city.apply { if (city.foundingCiv == "") { // this should never happen but just in case...
if (foundingCiv == "") { // this should never happen but just in case... this.puppetCity(conqueringCiv)
this@CityInfoConquestFunctions.puppetCity(conqueringCiv) this.annexCity()
this@CityInfoConquestFunctions.annexCity() return
return }
}
val foundingCiv = civ.gameInfo.getCivilization(foundingCiv) val foundingCiv = city.civ.gameInfo.getCivilization(city.foundingCiv)
if (foundingCiv.isDefeated()) // resurrected civ if (foundingCiv.isDefeated()) // resurrected civ
for (diploManager in foundingCiv.diplomacy.values) for (diploManager in foundingCiv.diplomacy.values)
if (diploManager.diplomaticStatus == DiplomaticStatus.War) if (diploManager.diplomaticStatus == DiplomaticStatus.War)
diploManager.makePeace() diploManager.makePeace()
val oldCiv = civ val oldCiv = city.civ
diplomaticRepercussionsForLiberatingCity(conqueringCiv, oldCiv) diplomaticRepercussionsForLiberatingCity(conqueringCiv, oldCiv)
conquerCity(conqueringCiv, oldCiv, foundingCiv) conquerCity(conqueringCiv, oldCiv, foundingCiv)
if (foundingCiv.cities.size == 1) { if (foundingCiv.cities.size == 1) {
// Resurrection! // Resurrection!
cityConstructions.addBuilding(capitalCityIndicator()) city.cityConstructions.addBuilding(city.capitalCityIndicator())
for (civ in civ.gameInfo.civilizations) { for (civ in city.civ.gameInfo.civilizations) {
if (civ == foundingCiv || civ == conqueringCiv) continue // don't need to notify these civs if (civ == foundingCiv || civ == conqueringCiv) continue // don't need to notify these civs
when { when {
civ.knows(conqueringCiv) && civ.knows(foundingCiv) -> civ.knows(conqueringCiv) && civ.knows(foundingCiv) ->
civ.addNotification("[$conqueringCiv] has liberated [$foundingCiv]", NotificationCategory.Diplomacy, foundingCiv.civName, NotificationIcon.Diplomacy, conqueringCiv.civName) civ.addNotification("[$conqueringCiv] has liberated [$foundingCiv]", NotificationCategory.Diplomacy, foundingCiv.civName, NotificationIcon.Diplomacy, conqueringCiv.civName)
civ.knows(conqueringCiv) && !civ.knows(foundingCiv) -> civ.knows(conqueringCiv) && !civ.knows(foundingCiv) ->
civ.addNotification("[$conqueringCiv] has liberated an unknown civilization", NotificationCategory.Diplomacy, NotificationIcon.Diplomacy, conqueringCiv.civName) civ.addNotification("[$conqueringCiv] has liberated an unknown civilization", NotificationCategory.Diplomacy, NotificationIcon.Diplomacy, conqueringCiv.civName)
!civ.knows(conqueringCiv) && civ.knows(foundingCiv) -> !civ.knows(conqueringCiv) && civ.knows(foundingCiv) ->
civ.addNotification("An unknown civilization has liberated [$foundingCiv]", NotificationCategory.Diplomacy, NotificationIcon.Diplomacy, foundingCiv.civName) civ.addNotification("An unknown civilization has liberated [$foundingCiv]", NotificationCategory.Diplomacy, NotificationIcon.Diplomacy, foundingCiv.civName)
else -> continue else -> continue
}
} }
} }
isPuppet = false
cityStats.update()
// Move units out of the city when liberated
for (unit in getCenterTile().getUnits().toList())
unit.movement.teleportToClosestMoveableTile()
for (unit in getTiles().flatMap { it.getUnits() }.toList())
if (!unit.movement.canPassThrough(unit.currentTile))
unit.movement.teleportToClosestMoveableTile()
} }
city.isPuppet = false
city.cityStats.update()
// Move units out of the city when liberated
for (unit in city.getCenterTile().getUnits().toList())
unit.movement.teleportToClosestMoveableTile()
for (unit in city.getTiles().flatMap { it.getUnits() }.toList())
if (!unit.movement.canPassThrough(unit.currentTile))
unit.movement.teleportToClosestMoveableTile()
} }
@ -269,69 +257,69 @@ class CityInfoConquestFunctions(val city: City){
fun moveToCiv(newCiv: Civilization) { fun moveToCiv(newCiv: Civilization) {
val oldCiv = city.civ val oldCiv = city.civ
city.apply {
// Remove/relocate palace for old Civ - need to do this BEFORE we move the cities between
// civs so the capitalCityIndicator recognizes the unique buildings of the conquered civ
if (oldCiv.getCapital() == this) oldCiv.moveCapitalToNextLargest()
oldCiv.cities = oldCiv.cities.toMutableList().apply { remove(city) } // Remove/relocate palace for old Civ - need to do this BEFORE we move the cities between
newCiv.cities = newCiv.cities.toMutableList().apply { add(city) } // civs so the capitalCityIndicator recognizes the unique buildings of the conquered civ
civ = newCiv if (city.isCapital()) oldCiv.moveCapitalToNextLargest()
hasJustBeenConquered = false
turnAcquired = civ.gameInfo.turns
previousOwner = oldCiv.civName
// now that the tiles have changed, we need to reassign population oldCiv.cities = oldCiv.cities.toMutableList().apply { remove(city) }
for (workedTile in workedTiles.filterNot { tiles.contains(it) }) { newCiv.cities = newCiv.cities.toMutableList().apply { add(city) }
population.stopWorkingTile(workedTile) city.civ = newCiv
population.autoAssignPopulation() city.hasJustBeenConquered = false
} city.turnAcquired = city.civ.gameInfo.turns
city.previousOwner = oldCiv.civName
// Stop WLTKD if it's still going // now that the tiles have changed, we need to reassign population
resetWLTKD() for (workedTile in city.workedTiles.filterNot { city.tiles.contains(it) }) {
city.population.stopWorkingTile(workedTile)
city.population.autoAssignPopulation()
}
// Place palace for newCiv if this is the only city they have. // Stop WLTKD if it's still going
// This needs to happen _before_ buildings are added or removed, city.resetWLTKD()
// as any building change triggers a reevaluation of stats which assumes there to be a capital
if (newCiv.cities.size == 1) newCiv.moveCapitalTo(this)
// Remove their free buildings from this city and remove free buildings provided by the city from their cities // Place palace for newCiv if this is the only city they have.
removeBuildingsOnMoveToCiv(oldCiv) // This needs to happen _before_ buildings are added or removed,
// as any building change triggers a reevaluation of stats which assumes there to be a capital
if (newCiv.cities.size == 1) newCiv.moveCapitalTo(city)
// Add our free buildings to this city and add free buildings provided by the city to other cities // Remove their free buildings from this city and remove free buildings provided by the city from their cities
civ.civConstructions.tryAddFreeBuildings() removeBuildingsOnMoveToCiv(oldCiv)
isBeingRazed = false // Add our free buildings to this city and add free buildings provided by the city to other cities
city.civ.civConstructions.tryAddFreeBuildings()
// Transfer unique buildings city.isBeingRazed = false
for (building in cityConstructions.getBuiltBuildings()) {
val civEquivalentBuilding = newCiv.getEquivalentBuilding(building.name)
if (building != civEquivalentBuilding) {
cityConstructions.removeBuilding(building.name)
cityConstructions.addBuilding(civEquivalentBuilding.name)
}
}
if (civ.gameInfo.isReligionEnabled()) religion.removeUnknownPantheons() // Transfer unique buildings
for (building in city.cityConstructions.getBuiltBuildings()) {
if (newCiv.hasUnique(UniqueType.MayNotAnnexCities)) { val civEquivalentBuilding = newCiv.getEquivalentBuilding(building.name)
isPuppet = true if (building != civEquivalentBuilding) {
cityConstructions.currentConstructionIsUserSet = false city.cityConstructions.removeBuilding(building.name)
cityConstructions.constructionQueue.clear() city.cityConstructions.addBuilding(civEquivalentBuilding.name)
cityConstructions.chooseNextConstruction()
}
tryUpdateRoadStatus()
cityStats.update()
// Update proximity rankings
civ.updateProximity(oldCiv, oldCiv.updateProximity(civ))
// Update history
city.getTiles().forEach { tile ->
tile.history.recordTakeOwnership(tile)
} }
} }
if (city.civ.gameInfo.isReligionEnabled()) city.religion.removeUnknownPantheons()
if (newCiv.hasUnique(UniqueType.MayNotAnnexCities)) {
city.isPuppet = true
city.cityConstructions.currentConstructionIsUserSet = false
city.cityConstructions.constructionQueue.clear()
city.cityConstructions.chooseNextConstruction()
}
city.tryUpdateRoadStatus()
city.cityStats.update()
// Update proximity rankings
city.civ.updateProximity(oldCiv, oldCiv.updateProximity(city.civ))
// Update history
city.getTiles().forEach { tile ->
tile.history.recordTakeOwnership(tile)
}
newCiv.cache.updateOurTiles() newCiv.cache.updateOurTiles()
oldCiv.cache.updateOurTiles() oldCiv.cache.updateOurTiles()
} }