Fix UX of random nations pool && keep advanced tab open when updating the screen (#8452)

* added feature to select specific city states

created MultiNationSelectPopup to reuse for the city states

* keep advanced tab open when update() is called

* Revert "added feature to select specific city states"

This reverts commit 4a1e6964b0.

* improved UX

* translations

* fix checks
This commit is contained in:
alexban011
2023-02-03 09:51:18 +02:00
committed by GitHub
parent af2307782f
commit 3180fce94d
5 changed files with 58 additions and 37 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -336,8 +336,9 @@ Promotions =
Load copied data = Load copied data =
Reset to defaults = Reset to defaults =
Select nations = Select nations =
Random nations pool = Set available nations for random pool =
Blacklist random nations pool = Available nations =
Banned nations =
Are you sure you want to reset all game options to defaults? = Are you sure you want to reset all game options to defaults? =
Start game! = Start game! =
Map Options = Map Options =

View File

@ -223,14 +223,8 @@ object GameStarter {
val availableCivNames = Stack<String>() val availableCivNames = Stack<String>()
// CityState or Spectator civs are not available for Random pick // CityState or Spectator civs are not available for Random pick
if (gameSetupInfo.gameParameters.enableRandomNationsPool) { if (gameSetupInfo.gameParameters.enableRandomNationsPool) {
if (gameSetupInfo.gameParameters.blacklistRandomNationsPool) { for (nation in gameSetupInfo.gameParameters.randomNations)
availableCivNames.addAll(ruleset.nations.filter { it.value.isMajorCiv() }.keys.shuffled()) availableCivNames.add(nation.name)
for (nation in gameSetupInfo.gameParameters.randomNations)
availableCivNames.remove(nation.name)
} else {
for (nation in gameSetupInfo.gameParameters.randomNations)
availableCivNames.add(nation.name)
}
} else } else
availableCivNames.addAll(ruleset.nations.filter { it.value.isMajorCiv() }.keys.shuffled()) availableCivNames.addAll(ruleset.nations.filter { it.value.isMajorCiv() }.keys.shuffled())

View File

@ -29,7 +29,6 @@ class GameParameters : IsPartOfGameInfoSerialization { // Default values are the
var numberOfCityStates = 6 var numberOfCityStates = 6
var enableRandomNationsPool = false var enableRandomNationsPool = false
var blacklistRandomNationsPool = false
var randomNations = arrayListOf<Nation>() var randomNations = arrayListOf<Nation>()
var noCityRazing = false var noCityRazing = false

View File

@ -42,7 +42,10 @@ class GameOptionsTable(
val ruleset = previousScreen.ruleset val ruleset = previousScreen.ruleset
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()
@ -97,7 +100,9 @@ class GameOptionsTable(
checkboxTable.addAnyoneCanSpectateCheckbox() checkboxTable.addAnyoneCanSpectateCheckbox()
add(checkboxTable).center().row() add(checkboxTable).center().row()
val expander = ExpanderTab("Advanced Settings", startsOutOpened = false) { val expander = ExpanderTab(
"Advanced Settings",
startsOutOpened = keepAdvancedTabOpenForNationsPool || keepAdvancedTabOpenForRandomNations || keepAdvancedTabOpenForRandomCityStates) {
it.addNoCityRazingCheckbox() it.addNoCityRazingCheckbox()
it.addNoBarbariansCheckbox() it.addNoBarbariansCheckbox()
it.addRagingBarbariansCheckbox() it.addRagingBarbariansCheckbox()
@ -110,7 +115,6 @@ class GameOptionsTable(
it.addRandomCityStatesCheckbox() it.addRandomCityStatesCheckbox()
it.addRandomNationsPoolCheckbox() it.addRandomNationsPoolCheckbox()
if (gameParameters.enableRandomNationsPool) { if (gameParameters.enableRandomNationsPool) {
it.addBlacklistRandomPool()
it.addNationsSelectTextButton() it.addNationsSelectTextButton()
} }
} }
@ -172,16 +176,12 @@ class GameOptionsTable(
{ gameParameters.espionageEnabled = it } { gameParameters.espionageEnabled = it }
private fun Table.addRandomNationsPoolCheckbox() = private fun Table.addRandomNationsPoolCheckbox() =
addCheckbox("Random nations pool", gameParameters.enableRandomNationsPool) { addCheckbox("Set available nations for random pool", gameParameters.enableRandomNationsPool) {
gameParameters.enableRandomNationsPool = it gameParameters.enableRandomNationsPool = it
keepAdvancedTabOpenForNationsPool = it
update() update()
} }
private fun Table.addBlacklistRandomPool() =
addCheckbox("Blacklist random nations pool", gameParameters.blacklistRandomNationsPool) {
gameParameters.blacklistRandomNationsPool = it
}
private fun Table.addNationsSelectTextButton() { private fun Table.addNationsSelectTextButton() {
val button = "Select nations".toTextButton() val button = "Select nations".toTextButton()
button.onClick { button.onClick {
@ -209,6 +209,7 @@ 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() update()
} }
@ -216,6 +217,7 @@ class GameOptionsTable(
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() update()
} }
@ -462,18 +464,27 @@ private class RandomNationPickerPopup(
private val nationListScroll = AutoScrollPane(nationListTable) private val nationListScroll = AutoScrollPane(nationListTable)
private val selectedNationsListTable = Table() private val selectedNationsListTable = Table()
private val selectedNationsListScroll = AutoScrollPane(selectedNationsListTable) private val selectedNationsListScroll = AutoScrollPane(selectedNationsListTable)
private var selectedNations = gameParameters.randomNations private var bannedNations = gameParameters.randomNations
var nations = arrayListOf<Nation>() var availableNations = arrayListOf<Nation>()
init { init {
var nationListScrollY = 0f var nationListScrollY = 0f
nations += previousScreen.ruleset.nations.values.asSequence() availableNations += previousScreen.ruleset.nations.values.asSequence()
.filter { it.isMajorCiv() } .filter { it.isMajorCiv() }
nationListScroll.setOverscroll(false, false) nationListScroll.setOverscroll(false, false)
add(nationListScroll).size( civBlocksWidth + 10f, partHeight )
// +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()) row() if (stageToShowOn.isNarrowerThan4to3()) {
add("Available nations".tr())
row()
add(nationListScroll).size( civBlocksWidth + 10f, partHeight )
row()
add("Banned nations".tr()).row()
} else {
add("Available nations".tr())
add("Banned nations".tr()).row()
row()
add(nationListScroll).size( civBlocksWidth + 10f, partHeight )
}
selectedNationsListScroll.setOverscroll(false, false) selectedNationsListScroll.setOverscroll(false, false)
add(selectedNationsListScroll).size(civBlocksWidth + 10f, partHeight) // Same here, see above add(selectedNationsListScroll).size(civBlocksWidth + 10f, partHeight) // Same here, see above
@ -498,17 +509,22 @@ private class RandomNationPickerPopup(
okButton.setPosition(innerTable.width - buttonsOffsetFromEdge, buttonsOffsetFromEdge, Align.bottomRight) okButton.setPosition(innerTable.width - buttonsOffsetFromEdge, buttonsOffsetFromEdge, Align.bottomRight)
innerTable.addActor(okButton) innerTable.addActor(okButton)
val switchButton = "OtherIcons/NationSwap".toImageButton(Color.YELLOW)
switchButton.onClick { switchAllNations() }
switchButton.setPosition(innerTable.width / 2, buttonsOffsetFromEdge + 35, Align.center)
innerTable.addActor(switchButton)
selectedNationsListTable.touchable = Touchable.enabled selectedNationsListTable.touchable = Touchable.enabled
} }
fun update() { fun update() {
nationListTable.clear() nationListTable.clear()
selectedNations = gameParameters.randomNations bannedNations = gameParameters.randomNations
nations -= selectedNations.toSet() availableNations -= bannedNations.toSet()
nations = nations.sortedWith(compareBy(UncivGame.Current.settings.getCollatorFromLocale()) { it.name.tr() }).toMutableList() as ArrayList<Nation> availableNations = availableNations.sortedWith(compareBy(UncivGame.Current.settings.getCollatorFromLocale()) { it.name.tr() }).toMutableList() as ArrayList<Nation>
var currentY = 0f var currentY = 0f
for (nation in nations) { for (nation in availableNations) {
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
@ -518,10 +534,10 @@ private class RandomNationPickerPopup(
} }
} }
if (selectedNations.isNotEmpty()) { if (bannedNations.isNotEmpty()) {
selectedNationsListTable.clear() selectedNationsListTable.clear()
for (currentNation in selectedNations) { for (currentNation in bannedNations) {
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()
@ -543,7 +559,7 @@ private class RandomNationPickerPopup(
private fun updateNationListTable() { private fun updateNationListTable() {
selectedNationsListTable.clear() selectedNationsListTable.clear()
for (currentNation in selectedNations) { for (currentNation in bannedNations) {
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()
@ -551,15 +567,15 @@ private class RandomNationPickerPopup(
} }
private fun addNationToPool(nation: Nation) { private fun addNationToPool(nation: Nation) {
selectedNations.add(nation) bannedNations.add(nation)
update() update()
updateNationListTable() updateNationListTable()
} }
private fun removeNationFromPool(nation: Nation) { private fun removeNationFromPool(nation: Nation) {
nations.add(nation) availableNations.add(nation)
selectedNations.remove(nation) bannedNations.remove(nation)
update() update()
updateNationListTable() updateNationListTable()
@ -567,7 +583,18 @@ private class RandomNationPickerPopup(
private fun returnSelected() { private fun returnSelected() {
close() close()
gameParameters.randomNations = selectedNations gameParameters.randomNations = availableNations
}
private fun switchAllNations() {
val tempNations = availableNations
availableNations = bannedNations
bannedNations = tempNations
gameParameters.randomNations = bannedNations
update()
updateNationListTable()
} }
} }