From 3180fce94d8d03146ac52eb2eff11dd47886f7fa Mon Sep 17 00:00:00 2001 From: alexban011 Date: Fri, 3 Feb 2023 09:51:18 +0200 Subject: [PATCH] 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 4a1e6964b00070625dcad2f90a32bb8a622dd49e. * improved UX * translations * fix checks --- android/Images/OtherIcons/NationSwap.png | Bin 0 -> 2206 bytes .../jsons/translations/template.properties | 5 +- core/src/com/unciv/logic/GameStarter.kt | 10 +-- .../unciv/models/metadata/GameParameters.kt | 1 - .../ui/newgamescreen/GameOptionsTable.kt | 79 ++++++++++++------ 5 files changed, 58 insertions(+), 37 deletions(-) create mode 100644 android/Images/OtherIcons/NationSwap.png diff --git a/android/Images/OtherIcons/NationSwap.png b/android/Images/OtherIcons/NationSwap.png new file mode 100644 index 0000000000000000000000000000000000000000..7e2b079dba80ac2b293670e3356fadaef7aec9c8 GIT binary patch literal 2206 zcmV;P2x0e$P)EX>4Tx04R}tkv&MmP!xqvQ>7vm2Rn#3M5s=7Q7MkK3Pq?8YK2xEOkVm2O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mgb#YR3krMAq3N2!M@OU5Ry>qzlUO;G8nP&AQ08O{e zOe!hn@~dL#6#{|)#t@g8Wz0!Z8oul69sz#d#dwzgyFb@}TCf-p5Q!7aFm2)u;`pX* zaNZ}5u(GTYpA%1-R3Pyq*A$FFa!XlO+L4<-jDyYInj82^t3mLjk`uIm&zeFyDToo{K zET9Grvg-$*!SCK$#px+8DVzj)UmWLS90=_Kt%l=#A3IL#1PDF@S9-@^YXY;Mq>R z^avQ-1}?5Unz9F6?f}D2hHT2N#OE&*i@^ICjVTWd-2(klPOC-$-x38ZFxdS&H2{pwJkY2#57*HM#UP~UzK%g-Ol)Hl0l7~_WY<7h5dw}9E zeQm&90g4AGJz}P>P*Xgmuf{O?D!f9!1~}~q<)P5gCl6&%OenPhiXSLVj!>F`+Tb;R zk>XlYrUtJSUh{Zfqc4-Ei|i?>r;2BCvr^LQk|sHP_Nb&;#+Vhk{G;v(JHET5(UPu~ zR4r+Qq=AykC3VZ!4UwbzJAST@q}KrD0>vZ%!AKe_saDc#Nf&kDj5oy?vnDSx#ZM%9wWc&j16#Wo^lNa_*%e~#KD zok|>ttrO!UEtPax@Owt>vVYDh$pJ=*q-l~?1sGX%OwuA_%<;q`#KNeP^h%B?>a-oF zAC=T+9|0~(x;M|ix5aZNy{C9oUkxfCEZ=$ z1hm9>s`ef5I4}w*+JX-Z1vWWe^I_mlA4Uzg4tCK|;8~!$*o%OLvAWP;lmRP%HV31= z1#Yu*RmBdYuZ7X-2xE>f!|rp0(FF8M!|=$$_{1?X{`L|X*02%49tWeA1LY}!F%Z}q zBR$vnG;XegQM-WtDT2{hs4&WagAqpk3XDt<4A(UE3ozZcfiokFY6E6;(a4yd4sv@STBs>zq3PevH`HPEfdVf1#$0)CsmEXIBqVc;_< zh>mGR0mB-*KcbkYVOnHfL3Q9(-8(R}r=($7zVo9oW_Jn(SFI7pPe__=j9KZ^sE!^` z4OaGN;(L@1t&f25sBajVLV0XN7%xi+5CJdxc+J4hmOlr)0Xznj#`*HZ2p|hn1jGO} zz`MZ5z+zy0C!W6tFw6EYXX}9T{{bdM0C`?PuD-m=PA_$&9UZ;G&`}LJkfq>}q8j2u zlO+wxaBQ^Nm)2$nVvPA&(t8@kq0hR)Po;7W- z5xBGyVUz;%fggb5z#*H<2c#%vy&94J$Hh5W2~Z7O3tSHL?nFb&fwwZumu&_5rUc0H z2q2>h!N_bd{?$Dx0rGhSkcvWpvCLu0Vtxu>bhAB8CLMF_)Ds)?OIoD%#dc9Tl7ax4 zr1sU0nY7nwE-OJ8?@Mx>HEm1*kh+NDTk_cruZXeY@re|qt1>%NoJ}?PFwC`P0Gt3G zvC&lQKo&$?YfG&8tUSS(ml7Biwx`Obck(r~b%jx{6v&RO-i)~3R$z=zqe>n6jI&`h zq^L8W?ywcd+Cppk{u3GAb7^wdJ|&{>066J$9dKM24Jm?g3$WX94Rl{$FkX%cqgM(* z7~od>z{zDFl<~fdiZz-_NmN__yySQjwgGbsvFS@opE1WVD$WdZ6Mu;*2N(^-31B^(0CTUt+7_or>LnO@%{?4cqHkD5?#_Y@G z1aWiX2uTBi-_N~QC9Re8w4{y3n4Ak`Tp%rK-zuXbFgT;#k`_w(z!=kfz9)+dWS^vs z%Dy_jE2ve{my+IA`_s(>#+XjowW6Y_7wHW9R?2GaCYWTrM4^XOr^)aAKwVR*?B@D&& zCxZ@JC}G#qgrQs+6Uub~O7c*K+xOR9)M9t23s4eC=-I$3M*3n04jsm3ag{9@2Y(H{ne1~2)CGR*D() // 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) - } + for (nation in gameSetupInfo.gameParameters.randomNations) + availableCivNames.add(nation.name) } else availableCivNames.addAll(ruleset.nations.filter { it.value.isMajorCiv() }.keys.shuffled()) diff --git a/core/src/com/unciv/models/metadata/GameParameters.kt b/core/src/com/unciv/models/metadata/GameParameters.kt index 392eebd884..cf1d666c3b 100644 --- a/core/src/com/unciv/models/metadata/GameParameters.kt +++ b/core/src/com/unciv/models/metadata/GameParameters.kt @@ -29,7 +29,6 @@ class GameParameters : IsPartOfGameInfoSerialization { // Default values are the var numberOfCityStates = 6 var enableRandomNationsPool = false - var blacklistRandomNationsPool = false var randomNations = arrayListOf() var noCityRazing = false diff --git a/core/src/com/unciv/ui/newgamescreen/GameOptionsTable.kt b/core/src/com/unciv/ui/newgamescreen/GameOptionsTable.kt index c7d1db3ef2..cd631063a6 100644 --- a/core/src/com/unciv/ui/newgamescreen/GameOptionsTable.kt +++ b/core/src/com/unciv/ui/newgamescreen/GameOptionsTable.kt @@ -42,7 +42,10 @@ class GameOptionsTable( val ruleset = previousScreen.ruleset var locked = false var modCheckboxes: ModCheckboxTable? = null - private set + 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() - + private var bannedNations = gameParameters.randomNations + var availableNations = arrayListOf() 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 + bannedNations = gameParameters.randomNations + availableNations -= bannedNations.toSet() + availableNations = availableNations.sortedWith(compareBy(UncivGame.Current.settings.getCollatorFromLocale()) { it.name.tr() }).toMutableList() as ArrayList 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() } }