diff --git a/core/src/com/unciv/logic/civilization/Civilization.kt b/core/src/com/unciv/logic/civilization/Civilization.kt index 19f141576f..c6f8d23ec1 100644 --- a/core/src/com/unciv/logic/civilization/Civilization.kt +++ b/core/src/com/unciv/logic/civilization/Civilization.kt @@ -351,7 +351,6 @@ class Civilization : IsPartOfGameInfoSerialization { fun hasMetCivTerritory(otherCiv: Civilization): Boolean = otherCiv.getCivTerritory().any { gameInfo.tileMap[it].isExplored(this) } fun getCompletedPolicyBranchesCount(): Int = policies.adoptedPolicies.count { Policy.isBranchCompleteByName(it) } - fun originalMajorCapitalsOwned(): Int = cities.count { it.isOriginalCapital && it.foundingCiv != "" && gameInfo.getCivilization(it.foundingCiv).isMajorCiv() } private fun getCivTerritory() = cities.asSequence().flatMap { it.tiles.asSequence() } fun getPreferredVictoryType(): String { diff --git a/core/src/com/unciv/models/ruleset/Victory.kt b/core/src/com/unciv/models/ruleset/Victory.kt index f0499e44d5..9c8ba7f374 100644 --- a/core/src/com/unciv/models/ruleset/Victory.kt +++ b/core/src/com/unciv/models/ruleset/Victory.kt @@ -3,6 +3,7 @@ package com.unciv.models.ruleset import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.scenes.scene2d.ui.TextButton import com.unciv.Constants +import com.unciv.logic.GameInfo import com.unciv.logic.civilization.Civilization import com.unciv.models.Counter import com.unciv.models.stats.INamed @@ -79,6 +80,19 @@ class Milestone(val uniqueDescription: String, private val parentVictory: Victor return incompleteSpaceshipParts } + private fun originalMajorCapitalsOwned(civInfo: Civilization): Int = civInfo.cities + .count { it.isOriginalCapital && it.foundingCiv != "" && civInfo.gameInfo.getCivilization(it.foundingCiv).isMajorCiv() } + + private fun civsWithPotentialCapitalsToOwn(gameInfo: GameInfo): Set { + // Capitals that still exist, even if the civ is dead + val civsWithCapitals = gameInfo.getCities().filter { it.isOriginalCapital } + .map { gameInfo.getCivilization(it.foundingCiv) } + .filter { it.isMajorCiv() }.toSet() + // If the civ is alive, they can still create a capital, so we need them as well + val livingCivs = gameInfo.civilizations.filter { it.isMajorCiv() && !it.isDefeated() } + return civsWithCapitals.union(livingCivs) + } + fun hasBeenCompletedBy(civInfo: Civilization): Boolean { return when (type!!) { MilestoneType.BuiltBuilding -> @@ -89,7 +103,7 @@ class Milestone(val uniqueDescription: String, private val parentVictory: Victor MilestoneType.DestroyAllPlayers -> civInfo.gameInfo.getAliveMajorCivs() == listOf(civInfo) MilestoneType.CaptureAllCapitals -> - civInfo.originalMajorCapitalsOwned() == civInfo.gameInfo.civilizations.count { it.isMajorCiv() } + originalMajorCapitalsOwned(civInfo) == civsWithPotentialCapitalsToOwn(civInfo.gameInfo).size MilestoneType.CompletePolicyBranches -> civInfo.policies.completedBranches.size >= params[0].toInt() MilestoneType.BuildingBuiltGlobally -> civInfo.gameInfo.getCities().any { @@ -132,10 +146,10 @@ class Milestone(val uniqueDescription: String, private val parentVictory: Victor "{$uniqueDescription} ($amountDone/$amountToDo)" } MilestoneType.CaptureAllCapitals -> { - val amountToDo = civInfo.gameInfo.civilizations.count { it.isMajorCiv() } + val amountToDo = civsWithPotentialCapitalsToOwn(civInfo.gameInfo).size val amountDone = if (completed) amountToDo - else civInfo.originalMajorCapitalsOwned() + else originalMajorCapitalsOwned(civInfo) if (civInfo.hideCivCount()) "{$uniqueDescription} ($amountDone/?)" else @@ -226,14 +240,25 @@ class Milestone(val uniqueDescription: String, private val parentVictory: Victor MilestoneType.CaptureAllCapitals -> { val hideCivCount = civInfo.hideCivCount() + val majorCivs = civInfo.gameInfo.civilizations.filter { it.isMajorCiv() } val originalCapitals = civInfo.gameInfo.getCities().filter { it.isOriginalCapital } - for (city in originalCapitals) { - val isKnown = civInfo.hasExplored(city.getCenterTile()) - if (hideCivCount && !isKnown) continue - val milestoneText = - if (isKnown) "Capture [${city.name}]" - else "Capture [${Constants.unknownCityName}]" - buttons.add(getMilestoneButton(milestoneText, city.civ == civInfo)) + .associateBy { it.foundingCiv } + for (civ in majorCivs) { + val city = originalCapitals[civ.civName] + if (city != null) { + val isKnown = civInfo.hasExplored(city.getCenterTile()) + if (hideCivCount && !isKnown) continue + val milestoneText = + if (isKnown) "Capture [${city.name}]" + else "Capture [${Constants.unknownCityName}]" + buttons.add(getMilestoneButton(milestoneText, city.civ == civInfo)) + } + else { + val milestoneText = + if (civInfo.knows(civ) || civ.isDefeated()) "Destroy [${civ.civName}]" + else "Destroy [${Constants.unknownNationName}]" + buttons.add(getMilestoneButton(milestoneText, civ.isDefeated())) + } } if (hideCivCount) buttons.add(getMilestoneButton("Capture ? * [${Constants.unknownCityName}]", false)) }