'capture all capitals' victory accepts defeat of civs that did not found capitals

This commit is contained in:
Yair Morgenstern
2023-12-31 14:33:48 +02:00
parent 8b3163a926
commit 662ba037c8
2 changed files with 35 additions and 11 deletions

View File

@ -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 {

View File

@ -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<Civilization> {
// 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))
}