mirror of
https://github.com/yairm210/Unciv.git
synced 2025-07-22 05:41:11 +07:00
Fix broken random nations pool (#8763)
This commit is contained in:
@ -221,11 +221,10 @@ object GameStarter {
|
|||||||
|
|
||||||
private fun addCivilizations(newGameParameters: GameParameters, gameInfo: GameInfo, ruleset: Ruleset, existingMap: Boolean) {
|
private fun addCivilizations(newGameParameters: GameParameters, gameInfo: GameInfo, ruleset: Ruleset, existingMap: Boolean) {
|
||||||
val availableCivNames = Stack<String>()
|
val availableCivNames = Stack<String>()
|
||||||
// CityState or Spectator civs are not available for Random pick
|
|
||||||
if (gameSetupInfo.gameParameters.enableRandomNationsPool) {
|
if (gameSetupInfo.gameParameters.enableRandomNationsPool) {
|
||||||
for (nation in gameSetupInfo.gameParameters.randomNations)
|
availableCivNames.addAll(gameSetupInfo.gameParameters.randomNations.shuffled())
|
||||||
availableCivNames.add(nation.name)
|
|
||||||
} else
|
} else
|
||||||
|
// CityState or Spectator civs are not available for Random pick
|
||||||
availableCivNames.addAll(ruleset.nations.filter { it.value.isMajorCiv() }.keys.shuffled())
|
availableCivNames.addAll(ruleset.nations.filter { it.value.isMajorCiv() }.keys.shuffled())
|
||||||
|
|
||||||
availableCivNames.removeAll(newGameParameters.players.map { it.chosenCiv }.toSet())
|
availableCivNames.removeAll(newGameParameters.players.map { it.chosenCiv }.toSet())
|
||||||
@ -248,12 +247,12 @@ object GameStarter {
|
|||||||
val max = newGameParameters.maxNumberOfPlayers.coerceAtLeast(newGameParameters.minNumberOfPlayers)
|
val max = newGameParameters.maxNumberOfPlayers.coerceAtLeast(newGameParameters.minNumberOfPlayers)
|
||||||
var playerCount = (min..max).random()
|
var playerCount = (min..max).random()
|
||||||
|
|
||||||
val humanPlayerCount = newGameParameters.players.filter {
|
val humanPlayerCount = newGameParameters.players.count {
|
||||||
it.playerType === PlayerType.Human
|
it.playerType === PlayerType.Human
|
||||||
}.count()
|
}
|
||||||
val spectatorCount = newGameParameters.players.filter {
|
val spectatorCount = newGameParameters.players.count {
|
||||||
it.chosenCiv === Constants.spectator
|
it.chosenCiv === Constants.spectator
|
||||||
}.count()
|
}
|
||||||
playerCount = playerCount.coerceAtLeast(humanPlayerCount + spectatorCount)
|
playerCount = playerCount.coerceAtLeast(humanPlayerCount + spectatorCount)
|
||||||
|
|
||||||
if (newGameParameters.players.size < playerCount) {
|
if (newGameParameters.players.size < playerCount) {
|
||||||
@ -265,6 +264,7 @@ object GameStarter {
|
|||||||
it.playerType === PlayerType.AI
|
it.playerType === PlayerType.AI
|
||||||
}.shuffled().subList(0, extraPlayers)
|
}.shuffled().subList(0, extraPlayers)
|
||||||
|
|
||||||
|
@Suppress("ConvertArgumentToSet") // Not worth it for a handful entries
|
||||||
newGameParameters.players.removeAll(playersToRemove)
|
newGameParameters.players.removeAll(playersToRemove)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,9 @@ package com.unciv.models.metadata
|
|||||||
import com.unciv.logic.IsPartOfGameInfoSerialization
|
import com.unciv.logic.IsPartOfGameInfoSerialization
|
||||||
import com.unciv.logic.civilization.PlayerType
|
import com.unciv.logic.civilization.PlayerType
|
||||||
import com.unciv.models.ruleset.Speed
|
import com.unciv.models.ruleset.Speed
|
||||||
import com.unciv.models.ruleset.nation.Nation
|
|
||||||
|
|
||||||
|
|
||||||
|
@Suppress("EnumEntryName") // These merit unusual names
|
||||||
enum class BaseRuleset(val fullName:String){
|
enum class BaseRuleset(val fullName:String){
|
||||||
Civ_V_Vanilla("Civ V - Vanilla"),
|
Civ_V_Vanilla("Civ V - Vanilla"),
|
||||||
Civ_V_GnK("Civ V - Gods & Kings"),
|
Civ_V_GnK("Civ V - Gods & Kings"),
|
||||||
@ -29,7 +30,7 @@ class GameParameters : IsPartOfGameInfoSerialization { // Default values are the
|
|||||||
var numberOfCityStates = 6
|
var numberOfCityStates = 6
|
||||||
|
|
||||||
var enableRandomNationsPool = false
|
var enableRandomNationsPool = false
|
||||||
var randomNations = arrayListOf<Nation>()
|
var randomNations = arrayListOf<String>()
|
||||||
|
|
||||||
var noCityRazing = false
|
var noCityRazing = false
|
||||||
var noBarbarians = false
|
var noBarbarians = false
|
||||||
@ -54,21 +55,28 @@ class GameParameters : IsPartOfGameInfoSerialization { // Default values are the
|
|||||||
val parameters = GameParameters()
|
val parameters = GameParameters()
|
||||||
parameters.difficulty = difficulty
|
parameters.difficulty = difficulty
|
||||||
parameters.speed = speed
|
parameters.speed = speed
|
||||||
parameters.players = ArrayList(players)
|
|
||||||
parameters.randomNumberOfPlayers = randomNumberOfPlayers
|
parameters.randomNumberOfPlayers = randomNumberOfPlayers
|
||||||
parameters.minNumberOfPlayers = minNumberOfPlayers
|
parameters.minNumberOfPlayers = minNumberOfPlayers
|
||||||
parameters.maxNumberOfPlayers = maxNumberOfPlayers
|
parameters.maxNumberOfPlayers = maxNumberOfPlayers
|
||||||
|
parameters.players = ArrayList(players)
|
||||||
parameters.randomNumberOfCityStates = randomNumberOfCityStates
|
parameters.randomNumberOfCityStates = randomNumberOfCityStates
|
||||||
parameters.minNumberOfCityStates = minNumberOfCityStates
|
parameters.minNumberOfCityStates = minNumberOfCityStates
|
||||||
parameters.maxNumberOfCityStates = maxNumberOfCityStates
|
parameters.maxNumberOfCityStates = maxNumberOfCityStates
|
||||||
parameters.numberOfCityStates = numberOfCityStates
|
parameters.numberOfCityStates = numberOfCityStates
|
||||||
|
parameters.enableRandomNationsPool = enableRandomNationsPool
|
||||||
|
parameters.randomNations = ArrayList(randomNations)
|
||||||
|
parameters.noCityRazing = noCityRazing
|
||||||
parameters.noBarbarians = noBarbarians
|
parameters.noBarbarians = noBarbarians
|
||||||
parameters.ragingBarbarians = ragingBarbarians
|
parameters.ragingBarbarians = ragingBarbarians
|
||||||
parameters.oneCityChallenge = oneCityChallenge
|
parameters.oneCityChallenge = oneCityChallenge
|
||||||
|
// godMode intentionally reset on clone
|
||||||
parameters.nuclearWeaponsEnabled = nuclearWeaponsEnabled
|
parameters.nuclearWeaponsEnabled = nuclearWeaponsEnabled
|
||||||
|
parameters.espionageEnabled = espionageEnabled
|
||||||
|
parameters.noStartBias = noStartBias
|
||||||
parameters.victoryTypes = ArrayList(victoryTypes)
|
parameters.victoryTypes = ArrayList(victoryTypes)
|
||||||
parameters.startingEra = startingEra
|
parameters.startingEra = startingEra
|
||||||
parameters.isOnlineMultiplayer = isOnlineMultiplayer
|
parameters.isOnlineMultiplayer = isOnlineMultiplayer
|
||||||
|
parameters.anyoneCanSpectate = anyoneCanSpectate
|
||||||
parameters.baseRuleset = baseRuleset
|
parameters.baseRuleset = baseRuleset
|
||||||
parameters.mods = LinkedHashSet(mods)
|
parameters.mods = LinkedHashSet(mods)
|
||||||
parameters.maxTurns = maxTurns
|
parameters.maxTurns = maxTurns
|
||||||
|
@ -28,6 +28,7 @@ import com.unciv.ui.components.extensions.keyShortcuts
|
|||||||
import com.unciv.ui.components.extensions.onActivation
|
import com.unciv.ui.components.extensions.onActivation
|
||||||
import com.unciv.ui.components.extensions.onChange
|
import com.unciv.ui.components.extensions.onChange
|
||||||
import com.unciv.ui.components.extensions.onClick
|
import com.unciv.ui.components.extensions.onClick
|
||||||
|
import com.unciv.ui.components.extensions.pad
|
||||||
import com.unciv.ui.components.extensions.surroundWithCircle
|
import com.unciv.ui.components.extensions.surroundWithCircle
|
||||||
import com.unciv.ui.components.extensions.toCheckBox
|
import com.unciv.ui.components.extensions.toCheckBox
|
||||||
import com.unciv.ui.components.extensions.toLabel
|
import com.unciv.ui.components.extensions.toLabel
|
||||||
@ -43,9 +44,6 @@ class GameOptionsTable(
|
|||||||
var locked = false
|
var locked = false
|
||||||
var modCheckboxes: ModCheckboxTable? = null
|
var modCheckboxes: ModCheckboxTable? = null
|
||||||
private set
|
private set
|
||||||
var keepAdvancedTabOpenForNationsPool = false
|
|
||||||
var keepAdvancedTabOpenForRandomNations = false
|
|
||||||
var keepAdvancedTabOpenForRandomCityStates = false
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
getGameOptionsTable()
|
getGameOptionsTable()
|
||||||
@ -92,8 +90,6 @@ class GameOptionsTable(
|
|||||||
}).row()
|
}).row()
|
||||||
addVictoryTypeCheckboxes()
|
addVictoryTypeCheckboxes()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
val checkboxTable = Table().apply { defaults().left().pad(2.5f) }
|
val checkboxTable = Table().apply { defaults().left().pad(2.5f) }
|
||||||
checkboxTable.addIsOnlineMultiplayerCheckbox()
|
checkboxTable.addIsOnlineMultiplayerCheckbox()
|
||||||
if (gameParameters.isOnlineMultiplayer)
|
if (gameParameters.isOnlineMultiplayer)
|
||||||
@ -102,7 +98,10 @@ class GameOptionsTable(
|
|||||||
|
|
||||||
val expander = ExpanderTab(
|
val expander = ExpanderTab(
|
||||||
"Advanced Settings",
|
"Advanced Settings",
|
||||||
startsOutOpened = keepAdvancedTabOpenForNationsPool || keepAdvancedTabOpenForRandomNations || keepAdvancedTabOpenForRandomCityStates) {
|
startsOutOpened = gameParameters.enableRandomNationsPool,
|
||||||
|
persistenceID = "GameOptionsTable.Advanced"
|
||||||
|
) {
|
||||||
|
it.defaults().pad(5f, 0f)
|
||||||
it.addNoCityRazingCheckbox()
|
it.addNoCityRazingCheckbox()
|
||||||
it.addNoBarbariansCheckbox()
|
it.addNoBarbariansCheckbox()
|
||||||
it.addRagingBarbariansCheckbox()
|
it.addRagingBarbariansCheckbox()
|
||||||
@ -118,11 +117,10 @@ class GameOptionsTable(
|
|||||||
it.addNationsSelectTextButton()
|
it.addNationsSelectTextButton()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
add(expander).pad(10f).padTop(10f).growX().row()
|
add(expander).pad(10f).row()
|
||||||
|
|
||||||
|
|
||||||
if (!isPortrait)
|
if (!isPortrait)
|
||||||
add(modCheckboxes).row()
|
add(modCheckboxes).padTop(0f).row()
|
||||||
|
|
||||||
pack()
|
pack()
|
||||||
}
|
}
|
||||||
@ -178,8 +176,7 @@ class GameOptionsTable(
|
|||||||
private fun Table.addRandomNationsPoolCheckbox() =
|
private fun Table.addRandomNationsPoolCheckbox() =
|
||||||
addCheckbox("Set available nations for random pool", gameParameters.enableRandomNationsPool) {
|
addCheckbox("Set available nations for random pool", gameParameters.enableRandomNationsPool) {
|
||||||
gameParameters.enableRandomNationsPool = it
|
gameParameters.enableRandomNationsPool = it
|
||||||
keepAdvancedTabOpenForNationsPool = it
|
update() // To show the button opening the chooser popup
|
||||||
update()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun Table.addNationsSelectTextButton() {
|
private fun Table.addNationsSelectTextButton() {
|
||||||
@ -209,16 +206,14 @@ class GameOptionsTable(
|
|||||||
addCheckbox("Random number of Civilizations", gameParameters.randomNumberOfPlayers)
|
addCheckbox("Random number of Civilizations", gameParameters.randomNumberOfPlayers)
|
||||||
{
|
{
|
||||||
gameParameters.randomNumberOfPlayers = it
|
gameParameters.randomNumberOfPlayers = it
|
||||||
keepAdvancedTabOpenForRandomNations = it
|
update() // To see the new sliders
|
||||||
update()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun Table.addRandomCityStatesCheckbox() =
|
private fun Table.addRandomCityStatesCheckbox() =
|
||||||
addCheckbox("Random number of City-States", gameParameters.randomNumberOfCityStates)
|
addCheckbox("Random number of City-States", gameParameters.randomNumberOfCityStates)
|
||||||
{
|
{
|
||||||
gameParameters.randomNumberOfCityStates = it
|
gameParameters.randomNumberOfCityStates = it
|
||||||
keepAdvancedTabOpenForRandomCityStates = it
|
update() // To see the changed sliders
|
||||||
update()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun Table.addMinPlayersSlider() {
|
private fun Table.addMinPlayersSlider() {
|
||||||
@ -459,12 +454,14 @@ private class RandomNationPickerPopup(
|
|||||||
private val selectedNationsListTable = Table()
|
private val selectedNationsListTable = Table()
|
||||||
private val selectedNationsListScroll = AutoScrollPane(selectedNationsListTable)
|
private val selectedNationsListScroll = AutoScrollPane(selectedNationsListTable)
|
||||||
private var bannedNations = gameParameters.randomNations
|
private var bannedNations = gameParameters.randomNations
|
||||||
var availableNations = arrayListOf<Nation>()
|
var availableNations = arrayListOf<String>()
|
||||||
|
|
||||||
|
private val ruleset = previousScreen.ruleset
|
||||||
|
|
||||||
init {
|
init {
|
||||||
var nationListScrollY = 0f
|
var nationListScrollY = 0f
|
||||||
availableNations += previousScreen.ruleset.nations.values.asSequence()
|
availableNations += ruleset.nations.values.asSequence()
|
||||||
.filter { it.isMajorCiv() }
|
.filter { it.isMajorCiv() }.map { it.name }
|
||||||
nationListScroll.setOverscroll(false, false)
|
nationListScroll.setOverscroll(false, false)
|
||||||
// +10, because the nation table has a 5f pad, for a total of +10f
|
// +10, because the nation table has a 5f pad, for a total of +10f
|
||||||
if (stageToShowOn.isNarrowerThan4to3()) {
|
if (stageToShowOn.isNarrowerThan4to3()) {
|
||||||
@ -515,10 +512,11 @@ private class RandomNationPickerPopup(
|
|||||||
nationListTable.clear()
|
nationListTable.clear()
|
||||||
bannedNations = gameParameters.randomNations
|
bannedNations = gameParameters.randomNations
|
||||||
availableNations -= bannedNations.toSet()
|
availableNations -= bannedNations.toSet()
|
||||||
availableNations = availableNations.sortedWith(compareBy(UncivGame.Current.settings.getCollatorFromLocale()) { it.name.tr() }).toMutableList() as ArrayList<Nation>
|
availableNations = availableNations.sortedWith(compareBy(UncivGame.Current.settings.getCollatorFromLocale()) { it.tr() }).toMutableList() as ArrayList<String>
|
||||||
|
|
||||||
var currentY = 0f
|
var currentY = 0f
|
||||||
for (nation in availableNations) {
|
for (nationName in availableNations) {
|
||||||
|
val nation = ruleset.nations[nationName] ?: continue
|
||||||
val nationTable = NationTable(nation, civBlocksWidth, 0f) // no need for min height
|
val nationTable = NationTable(nation, civBlocksWidth, 0f) // no need for min height
|
||||||
val cell = nationListTable.add(nationTable)
|
val cell = nationListTable.add(nationTable)
|
||||||
currentY += cell.padBottom + cell.prefHeight + cell.padTop
|
currentY += cell.padBottom + cell.prefHeight + cell.padTop
|
||||||
@ -528,15 +526,7 @@ private class RandomNationPickerPopup(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bannedNations.isNotEmpty()) {
|
updateNationListTable()
|
||||||
selectedNationsListTable.clear()
|
|
||||||
|
|
||||||
for (currentNation in bannedNations) {
|
|
||||||
val nationTable = NationTable(currentNation, civBlocksWidth, 0f)
|
|
||||||
nationTable.onClick { removeNationFromPool(currentNation) }
|
|
||||||
selectedNationsListTable.add(nationTable).row()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun String.toImageButton(overColor: Color): Group {
|
private fun String.toImageButton(overColor: Color): Group {
|
||||||
@ -553,7 +543,8 @@ private class RandomNationPickerPopup(
|
|||||||
private fun updateNationListTable() {
|
private fun updateNationListTable() {
|
||||||
selectedNationsListTable.clear()
|
selectedNationsListTable.clear()
|
||||||
|
|
||||||
for (currentNation in bannedNations) {
|
for (nationName in bannedNations) {
|
||||||
|
val currentNation = ruleset.nations[nationName] ?: continue
|
||||||
val nationTable = NationTable(currentNation, civBlocksWidth, 0f)
|
val nationTable = NationTable(currentNation, civBlocksWidth, 0f)
|
||||||
nationTable.onClick { removeNationFromPool(currentNation) }
|
nationTable.onClick { removeNationFromPool(currentNation) }
|
||||||
selectedNationsListTable.add(nationTable).row()
|
selectedNationsListTable.add(nationTable).row()
|
||||||
@ -561,18 +552,17 @@ private class RandomNationPickerPopup(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun addNationToPool(nation: Nation) {
|
private fun addNationToPool(nation: Nation) {
|
||||||
bannedNations.add(nation)
|
availableNations.remove(nation.name)
|
||||||
|
bannedNations.add(nation.name)
|
||||||
|
|
||||||
update()
|
update()
|
||||||
updateNationListTable()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun removeNationFromPool(nation: Nation) {
|
private fun removeNationFromPool(nation: Nation) {
|
||||||
availableNations.add(nation)
|
availableNations.add(nation.name)
|
||||||
bannedNations.remove(nation)
|
bannedNations.remove(nation.name)
|
||||||
|
|
||||||
update()
|
update()
|
||||||
updateNationListTable()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun returnSelected() {
|
private fun returnSelected() {
|
||||||
@ -588,8 +578,5 @@ private class RandomNationPickerPopup(
|
|||||||
gameParameters.randomNations = bannedNations
|
gameParameters.randomNations = bannedNations
|
||||||
|
|
||||||
update()
|
update()
|
||||||
updateNationListTable()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user