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 =
Reset to defaults =
Select nations =
Random nations pool =
Blacklist random nations pool =
Set available nations for random pool =
Available nations =
Banned nations =
Are you sure you want to reset all game options to defaults? =
Start game! =
Map Options =

View File

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

View File

@ -43,6 +43,9 @@ class GameOptionsTable(
var locked = false
var modCheckboxes: ModCheckboxTable? = null
private set
var keepAdvancedTabOpenForNationsPool = false
var keepAdvancedTabOpenForRandomNations = false
var keepAdvancedTabOpenForRandomCityStates = false
init {
getGameOptionsTable()
@ -97,7 +100,9 @@ class GameOptionsTable(
checkboxTable.addAnyoneCanSpectateCheckbox()
add(checkboxTable).center().row()
val expander = ExpanderTab("Advanced Settings", startsOutOpened = false) {
val expander = ExpanderTab(
"Advanced Settings",
startsOutOpened = keepAdvancedTabOpenForNationsPool || keepAdvancedTabOpenForRandomNations || keepAdvancedTabOpenForRandomCityStates) {
it.addNoCityRazingCheckbox()
it.addNoBarbariansCheckbox()
it.addRagingBarbariansCheckbox()
@ -110,7 +115,6 @@ class GameOptionsTable(
it.addRandomCityStatesCheckbox()
it.addRandomNationsPoolCheckbox()
if (gameParameters.enableRandomNationsPool) {
it.addBlacklistRandomPool()
it.addNationsSelectTextButton()
}
}
@ -172,16 +176,12 @@ class GameOptionsTable(
{ gameParameters.espionageEnabled = it }
private fun Table.addRandomNationsPoolCheckbox() =
addCheckbox("Random nations pool", gameParameters.enableRandomNationsPool) {
addCheckbox("Set available nations for random pool", gameParameters.enableRandomNationsPool) {
gameParameters.enableRandomNationsPool = it
keepAdvancedTabOpenForNationsPool = it
update()
}
private fun Table.addBlacklistRandomPool() =
addCheckbox("Blacklist random nations pool", gameParameters.blacklistRandomNationsPool) {
gameParameters.blacklistRandomNationsPool = it
}
private fun Table.addNationsSelectTextButton() {
val button = "Select nations".toTextButton()
button.onClick {
@ -209,6 +209,7 @@ class GameOptionsTable(
addCheckbox("Random number of Civilizations", gameParameters.randomNumberOfPlayers)
{
gameParameters.randomNumberOfPlayers = it
keepAdvancedTabOpenForRandomNations = it
update()
}
@ -216,6 +217,7 @@ class GameOptionsTable(
addCheckbox("Random number of City-States", gameParameters.randomNumberOfCityStates)
{
gameParameters.randomNumberOfCityStates = it
keepAdvancedTabOpenForRandomCityStates = it
update()
}
@ -462,18 +464,27 @@ private class RandomNationPickerPopup(
private val nationListScroll = AutoScrollPane(nationListTable)
private val selectedNationsListTable = Table()
private val selectedNationsListScroll = AutoScrollPane(selectedNationsListTable)
private var selectedNations = gameParameters.randomNations
var nations = arrayListOf<Nation>()
private var bannedNations = gameParameters.randomNations
var availableNations = arrayListOf<Nation>()
init {
var nationListScrollY = 0f
nations += previousScreen.ruleset.nations.values.asSequence()
availableNations += previousScreen.ruleset.nations.values.asSequence()
.filter { it.isMajorCiv() }
nationListScroll.setOverscroll(false, false)
add(nationListScroll).size( civBlocksWidth + 10f, partHeight )
// +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)
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)
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
}
fun update() {
nationListTable.clear()
selectedNations = gameParameters.randomNations
nations -= selectedNations.toSet()
nations = nations.sortedWith(compareBy(UncivGame.Current.settings.getCollatorFromLocale()) { it.name.tr() }).toMutableList() as ArrayList<Nation>
bannedNations = gameParameters.randomNations
availableNations -= bannedNations.toSet()
availableNations = availableNations.sortedWith(compareBy(UncivGame.Current.settings.getCollatorFromLocale()) { it.name.tr() }).toMutableList() as ArrayList<Nation>
var currentY = 0f
for (nation in nations) {
for (nation in availableNations) {
val nationTable = NationTable(nation, civBlocksWidth, 0f) // no need for min height
val cell = nationListTable.add(nationTable)
currentY += cell.padBottom + cell.prefHeight + cell.padTop
@ -518,10 +534,10 @@ private class RandomNationPickerPopup(
}
}
if (selectedNations.isNotEmpty()) {
if (bannedNations.isNotEmpty()) {
selectedNationsListTable.clear()
for (currentNation in selectedNations) {
for (currentNation in bannedNations) {
val nationTable = NationTable(currentNation, civBlocksWidth, 0f)
nationTable.onClick { removeNationFromPool(currentNation) }
selectedNationsListTable.add(nationTable).row()
@ -543,7 +559,7 @@ private class RandomNationPickerPopup(
private fun updateNationListTable() {
selectedNationsListTable.clear()
for (currentNation in selectedNations) {
for (currentNation in bannedNations) {
val nationTable = NationTable(currentNation, civBlocksWidth, 0f)
nationTable.onClick { removeNationFromPool(currentNation) }
selectedNationsListTable.add(nationTable).row()
@ -551,15 +567,15 @@ private class RandomNationPickerPopup(
}
private fun addNationToPool(nation: Nation) {
selectedNations.add(nation)
bannedNations.add(nation)
update()
updateNationListTable()
}
private fun removeNationFromPool(nation: Nation) {
nations.add(nation)
selectedNations.remove(nation)
availableNations.add(nation)
bannedNations.remove(nation)
update()
updateNationListTable()
@ -567,7 +583,18 @@ private class RandomNationPickerPopup(
private fun returnSelected() {
close()
gameParameters.randomNations = selectedNations
gameParameters.randomNations = availableNations
}
private fun switchAllNations() {
val tempNations = availableNations
availableNations = bannedNations
bannedNations = tempNations
gameParameters.randomNations = bannedNations
update()
updateNationListTable()
}
}