Redid layout for the New Game screen - see #2549

This commit is contained in:
Yair Morgenstern 2020-05-12 20:38:44 +03:00
parent 105a7d63b0
commit 0190854b88
4 changed files with 59 additions and 59 deletions

View File

@ -9,17 +9,17 @@ import com.unciv.ui.utils.CameraStageBaseScreen
import com.unciv.ui.utils.onChange import com.unciv.ui.utils.onChange
import com.unciv.ui.utils.toLabel import com.unciv.ui.utils.toLabel
class MapOptionsTable(val newGameScreen: NewGameScreen): Table(){ class MapOptionsTable(val newGameScreen: NewGameScreen): Table() {
val mapParameters = newGameScreen.gameSetupInfo.mapParameters val mapParameters = newGameScreen.gameSetupInfo.mapParameters
private var mapTypeSpecificTable = Table() private var mapTypeSpecificTable = Table()
private val generatedMapOptionsTable = MapParametersTable(mapParameters) private val generatedMapOptionsTable = MapParametersTable(mapParameters)
private val savedMapOptionsTable = Table() private val savedMapOptionsTable = Table()
init{ init {
defaults().pad(5f) defaults().pad(5f)
add("Map options".toLabel(fontSize = 24)).colspan(2).row() add("Map options".toLabel(fontSize = 24)).top().colspan(2).row()
addMapTypeSelection() addMapTypeSelection()
} }

View File

@ -27,19 +27,24 @@ class GameSetupInfo(var gameId:String, var gameParameters: GameParameters, var m
constructor(gameInfo: GameInfo) : this("", gameInfo.gameParameters.clone(), gameInfo.tileMap.mapParameters) constructor(gameInfo: GameInfo) : this("", gameInfo.gameParameters.clone(), gameInfo.tileMap.mapParameters)
} }
class NewGameScreen(previousScreen:CameraStageBaseScreen, _gameSetupInfo: GameSetupInfo?=null): PickerScreen(){ class NewGameScreen(previousScreen:CameraStageBaseScreen, _gameSetupInfo: GameSetupInfo?=null): PickerScreen() {
var gameSetupInfo:GameSetupInfo= _gameSetupInfo ?: GameSetupInfo() var gameSetupInfo: GameSetupInfo = _gameSetupInfo ?: GameSetupInfo()
val ruleset = RulesetCache.getComplexRuleset(gameSetupInfo.gameParameters.mods) val ruleset = RulesetCache.getComplexRuleset(gameSetupInfo.gameParameters.mods)
init { init {
setDefaultCloseAction(previousScreen) setDefaultCloseAction(previousScreen)
scrollPane.setScrollingDisabled(true,true) scrollPane.setScrollingDisabled(true, true)
val playerPickerTable = PlayerPickerTable(this, gameSetupInfo.gameParameters) val playerPickerTable = PlayerPickerTable(this, gameSetupInfo.gameParameters)
val newGameScreenOptionsTable = NewGameScreenOptionsTable(this) { desiredCiv: String -> playerPickerTable.update(desiredCiv) } val newGameScreenOptionsTable = NewGameScreenOptionsTable(this) { desiredCiv: String -> playerPickerTable.update(desiredCiv) }
topTable.add(ScrollPane(newGameScreenOptionsTable).apply{setOverscroll(false,false)}).height(topTable.parent.height) topTable.add(ScrollPane(MapOptionsTable(this)).apply { setOverscroll(false, false) })
topTable.add(playerPickerTable).height(topTable.parent.height) .maxHeight(topTable.parent.height).width(stage.width / 3).padTop(20f).top()
topTable.addSeparatorVertical()
topTable.add(playerPickerTable).maxHeight(topTable.parent.height).width(stage.width / 3).padTop(20f).top()
topTable.addSeparatorVertical()
topTable.add(ScrollPane(newGameScreenOptionsTable).apply { setOverscroll(false, false) })
.maxHeight(topTable.parent.height).width(stage.width / 3).padTop(20f).top()
topTable.pack() topTable.pack()
topTable.setFillParent(true) topTable.setFillParent(true)
@ -72,7 +77,7 @@ class NewGameScreen(previousScreen:CameraStageBaseScreen, _gameSetupInfo: GameSe
rightSideButton.disable() rightSideButton.disable()
rightSideButton.setText("Working...".tr()) rightSideButton.setText("Working...".tr())
thread(name="NewGame") { thread(name = "NewGame") {
// Creating a new game can take a while and we don't want ANRs // Creating a new game can take a while and we don't want ANRs
newGameThread() newGameThread()
} }
@ -115,16 +120,16 @@ class NewGameScreen(previousScreen:CameraStageBaseScreen, _gameSetupInfo: GameSe
Gdx.graphics.requestRendering() Gdx.graphics.requestRendering()
} }
fun setNewGameButtonEnabled(bool:Boolean){ fun setNewGameButtonEnabled(bool: Boolean) {
if(bool) rightSideButton.enable() if (bool) rightSideButton.enable()
else rightSideButton.disable() else rightSideButton.disable()
} }
var newGame:GameInfo?=null var newGame: GameInfo? = null
override fun render(delta: Float) { override fun render(delta: Float) {
if (newGame != null){ if (newGame != null) {
game.loadGame(newGame!!) game.loadGame(newGame!!)
} }
super.render(delta) super.render(delta)
@ -145,4 +150,3 @@ class TranslatedSelectBox(values : Collection<String>, default:String, skin: Ski
selected = if (defaultItem != null) defaultItem else array.first() selected = if (defaultItem != null) defaultItem else array.first()
} }
} }

View File

@ -23,11 +23,8 @@ class NewGameScreenOptionsTable(newGameScreen: NewGameScreen, val updatePlayerPi
top() top()
defaults().pad(5f) defaults().pad(5f)
val mapOptionsColumn = MapOptionsTable(newGameScreen)
add(mapOptionsColumn).row()
val gameOptionsColumn = Table().apply { defaults().pad(5f) } val gameOptionsColumn = Table().apply { defaults().pad(5f) }
gameOptionsColumn.add("Game options".toLabel(fontSize = 24)).colspan(2).row() gameOptionsColumn.add("Game options".toLabel(fontSize = 24)).padTop(0f).colspan(2).row()
gameOptionsColumn.addDifficultySelectBox() gameOptionsColumn.addDifficultySelectBox()
gameOptionsColumn.addGameSpeedSelectBox() gameOptionsColumn.addGameSpeedSelectBox()
gameOptionsColumn.addEraSelectBox() gameOptionsColumn.addEraSelectBox()
@ -43,23 +40,23 @@ class NewGameScreenOptionsTable(newGameScreen: NewGameScreen, val updatePlayerPi
pack() pack()
} }
private fun Table.addCheckbox(text:String, initialState:Boolean, onChange:(newValue:Boolean)->Unit){ private fun Table.addCheckbox(text: String, initialState: Boolean, onChange: (newValue: Boolean) -> Unit) {
val checkbox = CheckBox(text.tr(), CameraStageBaseScreen.skin) val checkbox = CheckBox(text.tr(), CameraStageBaseScreen.skin)
checkbox.isChecked = initialState checkbox.isChecked = initialState
checkbox.onChange { onChange(checkbox.isChecked) } checkbox.onChange { onChange(checkbox.isChecked) }
add(checkbox).colspan(2).row() add(checkbox).colspan(2).row()
} }
private fun Table.addBarbariansCheckbox() = private fun Table.addBarbariansCheckbox() =
addCheckbox("No barbarians", newGameParameters.noBarbarians) addCheckbox("No barbarians", newGameParameters.noBarbarians)
{ newGameParameters.noBarbarians = it } { newGameParameters.noBarbarians = it }
private fun Table.addOneCityChallengeCheckbox() = private fun Table.addOneCityChallengeCheckbox() =
addCheckbox("One City Challenge", newGameParameters.oneCityChallenge) addCheckbox("One City Challenge", newGameParameters.oneCityChallenge)
{ newGameParameters.oneCityChallenge = it } { newGameParameters.oneCityChallenge = it }
private fun Table.addNuclearWeaponsCheckbox() = private fun Table.addNuclearWeaponsCheckbox() =
addCheckbox("Enable nuclear weapons", newGameParameters.nuclearWeaponsEnabled) addCheckbox("Enable nuclear weapons", newGameParameters.nuclearWeaponsEnabled)
{ newGameParameters.nuclearWeaponsEnabled = it } { newGameParameters.nuclearWeaponsEnabled = it }
@ -80,7 +77,7 @@ class NewGameScreenOptionsTable(newGameScreen: NewGameScreen, val updatePlayerPi
val numberOfCityStates = ruleset.nations.filter { it.value.isCityState() }.size val numberOfCityStates = ruleset.nations.filter { it.value.isCityState() }.size
val cityStatesArray = Array<Int>(numberOfCityStates+1) val cityStatesArray = Array<Int>(numberOfCityStates + 1)
(0..numberOfCityStates).forEach { cityStatesArray.add(it) } (0..numberOfCityStates).forEach { cityStatesArray.add(it) }
cityStatesSelectBox.items = cityStatesArray cityStatesSelectBox.items = cityStatesArray
@ -91,7 +88,7 @@ class NewGameScreenOptionsTable(newGameScreen: NewGameScreen, val updatePlayerPi
} }
} }
fun Table.addSelectBox(text:String, values:Collection<String>, initialState:String, onChange: (newValue: String) -> Unit){ fun Table.addSelectBox(text: String, values: Collection<String>, initialState: String, onChange: (newValue: String) -> Unit) {
add(text.toLabel()) add(text.toLabel())
val selectBox = TranslatedSelectBox(values, initialState, CameraStageBaseScreen.skin) val selectBox = TranslatedSelectBox(values, initialState, CameraStageBaseScreen.skin)
selectBox.onChange { onChange(selectBox.selected.value) } selectBox.onChange { onChange(selectBox.selected.value) }
@ -100,18 +97,18 @@ class NewGameScreenOptionsTable(newGameScreen: NewGameScreen, val updatePlayerPi
private fun Table.addDifficultySelectBox() { private fun Table.addDifficultySelectBox() {
addSelectBox("{Difficulty}:", ruleset.difficulties.keys, newGameParameters.difficulty) addSelectBox("{Difficulty}:", ruleset.difficulties.keys, newGameParameters.difficulty)
{newGameParameters.difficulty = it} { newGameParameters.difficulty = it }
} }
private fun Table.addGameSpeedSelectBox() { private fun Table.addGameSpeedSelectBox() {
addSelectBox("{Game Speed}:", GameSpeed.values().map { it.name }, newGameParameters.gameSpeed.name) addSelectBox("{Game Speed}:", GameSpeed.values().map { it.name }, newGameParameters.gameSpeed.name)
{newGameParameters.gameSpeed = GameSpeed.valueOf(it)} { newGameParameters.gameSpeed = GameSpeed.valueOf(it) }
} }
private fun Table.addEraSelectBox() { private fun Table.addEraSelectBox() {
val eras = ruleset.technologies.values.map { it.era() }.distinct() val eras = ruleset.technologies.values.map { it.era() }.distinct()
addSelectBox("{Starting Era}:", eras, newGameParameters.startingEra) addSelectBox("{Starting Era}:", eras, newGameParameters.startingEra)
{ newGameParameters.startingEra = it } { newGameParameters.startingEra = it }
} }
@ -142,8 +139,8 @@ class NewGameScreenOptionsTable(newGameScreen: NewGameScreen, val updatePlayerPi
fun Table.addModCheckboxes() { fun Table.addModCheckboxes() {
val modRulesets = RulesetCache.filter { it.key!="" }.values val modRulesets = RulesetCache.filter { it.key != "" }.values
if(modRulesets.isEmpty()) return if (modRulesets.isEmpty()) return
fun reloadMods() { fun reloadMods() {
ruleset.clear() ruleset.clear()
@ -158,8 +155,8 @@ class NewGameScreenOptionsTable(newGameScreen: NewGameScreen, val updatePlayerPi
add("Mods:".toLabel(fontSize = 24)).padTop(16f).colspan(2).row() add("Mods:".toLabel(fontSize = 24)).padTop(16f).colspan(2).row()
val modCheckboxTable = Table().apply { defaults().pad(5f) } val modCheckboxTable = Table().apply { defaults().pad(5f) }
for(mod in modRulesets){ for (mod in modRulesets) {
val checkBox = CheckBox(mod.name.tr(),CameraStageBaseScreen.skin) val checkBox = CheckBox(mod.name.tr(), CameraStageBaseScreen.skin)
if (mod.name in newGameParameters.mods) checkBox.isChecked = true if (mod.name in newGameParameters.mods) checkBox.isChecked = true
checkBox.onChange { checkBox.onChange {
if (checkBox.isChecked) newGameParameters.mods.add(mod.name) if (checkBox.isChecked) newGameParameters.mods.add(mod.name)
@ -181,4 +178,3 @@ class NewGameScreenOptionsTable(newGameScreen: NewGameScreen, val updatePlayerPi
} }
} }

View File

@ -22,10 +22,12 @@ import java.util.*
class PlayerPickerTable(val newGameScreen: NewGameScreen, val newGameParameters: GameParameters): Table() { class PlayerPickerTable(val newGameScreen: NewGameScreen, val newGameParameters: GameParameters): Table() {
val playerListTable = Table() val playerListTable = Table()
val nationsPopupWidth = newGameScreen.stage.width / 2f val nationsPopupWidth = newGameScreen.stage.width / 2f
val civBlocksWidth = newGameScreen.stage.width / 3
init { init {
top() top()
add(ScrollPane(playerListTable).apply{setOverscroll(false,false)}).width(newGameScreen.stage.width/2) add("Civilizations".toLabel(fontSize = 24)).padBottom(20f).row()
add(ScrollPane(playerListTable).apply { setOverscroll(false, false) }).width(civBlocksWidth)
update() update()
} }
@ -34,19 +36,19 @@ class PlayerPickerTable(val newGameScreen: NewGameScreen, val newGameParameters:
val gameBasics = newGameScreen.ruleset // the mod picking changes this ruleset val gameBasics = newGameScreen.ruleset // the mod picking changes this ruleset
reassignRemovedModReferences() reassignRemovedModReferences()
val newRulesetPlayableCivs = newGameScreen.ruleset.nations.count { it.key!=Constants.barbarians } val newRulesetPlayableCivs = newGameScreen.ruleset.nations.count { it.key != Constants.barbarians }
if(newGameParameters.players.size > newRulesetPlayableCivs) if (newGameParameters.players.size > newRulesetPlayableCivs)
newGameParameters.players=ArrayList(newGameParameters.players.subList(0,newRulesetPlayableCivs)) newGameParameters.players = ArrayList(newGameParameters.players.subList(0, newRulesetPlayableCivs))
if (desiredCiv.isNotEmpty()) assignDesiredCiv(desiredCiv) if (desiredCiv.isNotEmpty()) assignDesiredCiv(desiredCiv)
for (player in newGameParameters.players) { for (player in newGameParameters.players) {
playerListTable.add(getPlayerTable(player, gameBasics)).pad(10f).row() playerListTable.add(getPlayerTable(player, gameBasics)).width(civBlocksWidth).padBottom(20f).row()
} }
if(newGameParameters.players.count() < gameBasics.nations.values.count { it.isMajorCiv() }) { if (newGameParameters.players.count() < gameBasics.nations.values.count { it.isMajorCiv() }) {
playerListTable.add("+".toLabel(Color.BLACK,30).apply { this.setAlignment(Align.center) } playerListTable.add("+".toLabel(Color.BLACK, 30).apply { this.setAlignment(Align.center) }
.surroundWithCircle(50f).onClick { newGameParameters.players.add(Player()); update() }).pad(10f) .surroundWithCircle(50f).onClick { newGameParameters.players.add(Player()); update() }).pad(10f)
} }
newGameScreen.setNewGameButtonEnabled(newGameParameters.players.size>1) newGameScreen.setNewGameButtonEnabled(newGameParameters.players.size > 1)
} }
private fun reassignRemovedModReferences() { private fun reassignRemovedModReferences() {
@ -58,9 +60,9 @@ class PlayerPickerTable(val newGameScreen: NewGameScreen, val newGameParameters:
private fun assignDesiredCiv(desiredCiv: String) { private fun assignDesiredCiv(desiredCiv: String) {
// No auto-select if desiredCiv already used // No auto-select if desiredCiv already used
if (newGameParameters.players.any {it.chosenCiv == desiredCiv}) return if (newGameParameters.players.any { it.chosenCiv == desiredCiv }) return
// Do auto-select, silently no-op if no suitable slot (human with 'random' choice) // Do auto-select, silently no-op if no suitable slot (human with 'random' choice)
newGameParameters.players.firstOrNull { it.chosenCiv == "Random" && it.playerType==PlayerType.Human }?.chosenCiv = desiredCiv newGameParameters.players.firstOrNull { it.chosenCiv == "Random" && it.playerType == PlayerType.Human }?.chosenCiv = desiredCiv
} }
fun getPlayerTable(player: Player, ruleset: Ruleset): Table { fun getPlayerTable(player: Player, ruleset: Ruleset): Table {
@ -69,7 +71,7 @@ class PlayerPickerTable(val newGameScreen: NewGameScreen, val newGameParameters:
playerTable.background = ImageGetter.getBackground(ImageGetter.getBlue().lerp(Color.BLACK, 0.8f)) playerTable.background = ImageGetter.getBackground(ImageGetter.getBlue().lerp(Color.BLACK, 0.8f))
val nationTable = getNationTable(player) val nationTable = getNationTable(player)
playerTable.add(nationTable) playerTable.add(nationTable).left()
val playerTypeTextbutton = player.playerType.name.toTextButton() val playerTypeTextbutton = player.playerType.name.toTextButton()
playerTypeTextbutton.onClick { playerTypeTextbutton.onClick {
@ -78,11 +80,11 @@ class PlayerPickerTable(val newGameScreen: NewGameScreen, val newGameParameters:
else player.playerType = PlayerType.AI else player.playerType = PlayerType.AI
update() update()
} }
playerTable.add(playerTypeTextbutton).width(100f).pad(5f) playerTable.add(playerTypeTextbutton).width(100f).pad(5f).right()
playerTable.add("-".toLabel(Color.BLACK,30).apply { this.setAlignment(Align.center) } playerTable.add("-".toLabel(Color.BLACK, 30).apply { this.setAlignment(Align.center) }
.surroundWithCircle(40f) .surroundWithCircle(40f)
.onClick { newGameParameters.players.remove(player); update() }).pad(5f).row() .onClick { newGameParameters.players.remove(player); update() }).pad(5f).right().row()
if(newGameParameters.isOnlineMultiplayer && player.playerType==PlayerType.Human) { if (newGameParameters.isOnlineMultiplayer && player.playerType == PlayerType.Human) {
val playerIdTextfield = TextField(player.playerId, CameraStageBaseScreen.skin) val playerIdTextfield = TextField(player.playerId, CameraStageBaseScreen.skin)
playerIdTextfield.messageText = "Please input Player ID!".tr() playerIdTextfield.messageText = "Please input Player ID!".tr()
@ -90,7 +92,7 @@ class PlayerPickerTable(val newGameScreen: NewGameScreen, val newGameParameters:
var errorLabel = "".toLabel(Color.RED) var errorLabel = "".toLabel(Color.RED)
playerTable.add(errorLabel).pad(5f).row() playerTable.add(errorLabel).pad(5f).row()
fun onPlayerIdTextUpdated(){ fun onPlayerIdTextUpdated() {
try { try {
UUID.fromString(IdChecker.checkAndReturnPlayerUuid(playerIdTextfield.text)) UUID.fromString(IdChecker.checkAndReturnPlayerUuid(playerIdTextfield.text))
player.playerId = playerIdTextfield.text.trim() player.playerId = playerIdTextfield.text.trim()
@ -122,13 +124,13 @@ class PlayerPickerTable(val newGameScreen: NewGameScreen, val newGameParameters:
private fun getNationTable(player: Player): Table { private fun getNationTable(player: Player): Table {
val nationTable = Table() val nationTable = Table()
val nationImage = if (player.chosenCiv == "Random") "?".toLabel(Color.WHITE,25) val nationImage = if (player.chosenCiv == "Random") "?".toLabel(Color.WHITE, 25)
.apply { this.setAlignment(Align.center) } .apply { this.setAlignment(Align.center) }
.surroundWithCircle(36f).apply { circle.color = Color.BLACK } .surroundWithCircle(36f).apply { circle.color = Color.BLACK }
.surroundWithCircle(40f,false).apply { circle.color = Color.WHITE } .surroundWithCircle(40f, false).apply { circle.color = Color.WHITE }
else ImageGetter.getNationIndicator(newGameScreen.ruleset.nations[player.chosenCiv]!!, 40f) else ImageGetter.getNationIndicator(newGameScreen.ruleset.nations[player.chosenCiv]!!, 40f)
nationTable.add(nationImage).pad(5f) nationTable.add(nationImage).pad(5f)
nationTable.add(player.chosenCiv.toLabel()).width(230f).pad(5f) nationTable.add(player.chosenCiv.toLabel()).pad(5f)
nationTable.touchable = Touchable.enabled nationTable.touchable = Touchable.enabled
nationTable.onClick { nationTable.onClick {
popupNationPicker(player) popupNationPicker(player)
@ -146,7 +148,7 @@ class PlayerPickerTable(val newGameScreen: NewGameScreen, val newGameParameters:
randomPlayerTable.add("?".toLabel(Color.WHITE, 30) randomPlayerTable.add("?".toLabel(Color.WHITE, 30)
.apply { this.setAlignment(Align.center) } .apply { this.setAlignment(Align.center) }
.surroundWithCircle(45f).apply { circle.color = Color.BLACK } .surroundWithCircle(45f).apply { circle.color = Color.BLACK }
.surroundWithCircle(50f,false).apply { circle.color = Color.WHITE }).pad(10f) .surroundWithCircle(50f, false).apply { circle.color = Color.WHITE }).pad(10f)
randomPlayerTable.add("Random".toLabel()) randomPlayerTable.add("Random".toLabel())
randomPlayerTable.touchable = Touchable.enabled randomPlayerTable.touchable = Touchable.enabled
randomPlayerTable.onClick { randomPlayerTable.onClick {
@ -162,7 +164,7 @@ class PlayerPickerTable(val newGameScreen: NewGameScreen, val newGameParameters:
if (player.chosenCiv != nation.name && newGameParameters.players.any { it.chosenCiv == nation.name }) if (player.chosenCiv != nation.name && newGameParameters.players.any { it.chosenCiv == nation.name })
continue continue
nationListTable.add(NationTable(nation, nationsPopupWidth,newGameScreen.ruleset).onClick { nationListTable.add(NationTable(nation, nationsPopupWidth, newGameScreen.ruleset).onClick {
player.chosenCiv = nation.name player.chosenCiv = nation.name
nationsPopup.close() nationsPopup.close()
update() update()
@ -173,5 +175,3 @@ class PlayerPickerTable(val newGameScreen: NewGameScreen, val newGameParameters:
update() update()
} }
} }