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.toLabel
class MapOptionsTable(val newGameScreen: NewGameScreen): Table(){
class MapOptionsTable(val newGameScreen: NewGameScreen): Table() {
val mapParameters = newGameScreen.gameSetupInfo.mapParameters
private var mapTypeSpecificTable = Table()
private val generatedMapOptionsTable = MapParametersTable(mapParameters)
private val savedMapOptionsTable = Table()
init{
init {
defaults().pad(5f)
add("Map options".toLabel(fontSize = 24)).colspan(2).row()
add("Map options".toLabel(fontSize = 24)).top().colspan(2).row()
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)
}
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)
init {
setDefaultCloseAction(previousScreen)
scrollPane.setScrollingDisabled(true,true)
scrollPane.setScrollingDisabled(true, true)
val playerPickerTable = PlayerPickerTable(this, gameSetupInfo.gameParameters)
val newGameScreenOptionsTable = NewGameScreenOptionsTable(this) { desiredCiv: String -> playerPickerTable.update(desiredCiv) }
topTable.add(ScrollPane(newGameScreenOptionsTable).apply{setOverscroll(false,false)}).height(topTable.parent.height)
topTable.add(playerPickerTable).height(topTable.parent.height)
topTable.add(ScrollPane(MapOptionsTable(this)).apply { setOverscroll(false, false) })
.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.setFillParent(true)
@ -72,7 +77,7 @@ class NewGameScreen(previousScreen:CameraStageBaseScreen, _gameSetupInfo: GameSe
rightSideButton.disable()
rightSideButton.setText("Working...".tr())
thread(name="NewGame") {
thread(name = "NewGame") {
// Creating a new game can take a while and we don't want ANRs
newGameThread()
}
@ -115,16 +120,16 @@ class NewGameScreen(previousScreen:CameraStageBaseScreen, _gameSetupInfo: GameSe
Gdx.graphics.requestRendering()
}
fun setNewGameButtonEnabled(bool:Boolean){
if(bool) rightSideButton.enable()
fun setNewGameButtonEnabled(bool: Boolean) {
if (bool) rightSideButton.enable()
else rightSideButton.disable()
}
var newGame:GameInfo?=null
var newGame: GameInfo? = null
override fun render(delta: Float) {
if (newGame != null){
if (newGame != null) {
game.loadGame(newGame!!)
}
super.render(delta)
@ -144,5 +149,4 @@ class TranslatedSelectBox(values : Collection<String>, default:String, skin: Ski
val defaultItem = array.firstOrNull { it.value == default }
selected = if (defaultItem != null) defaultItem else array.first()
}
}
}

View File

@ -23,11 +23,8 @@ class NewGameScreenOptionsTable(newGameScreen: NewGameScreen, val updatePlayerPi
top()
defaults().pad(5f)
val mapOptionsColumn = MapOptionsTable(newGameScreen)
add(mapOptionsColumn).row()
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.addGameSpeedSelectBox()
gameOptionsColumn.addEraSelectBox()
@ -43,23 +40,23 @@ class NewGameScreenOptionsTable(newGameScreen: NewGameScreen, val updatePlayerPi
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)
checkbox.isChecked = initialState
checkbox.onChange { onChange(checkbox.isChecked) }
add(checkbox).colspan(2).row()
}
private fun Table.addBarbariansCheckbox() =
addCheckbox("No barbarians", newGameParameters.noBarbarians)
private fun Table.addBarbariansCheckbox() =
addCheckbox("No barbarians", newGameParameters.noBarbarians)
{ newGameParameters.noBarbarians = it }
private fun Table.addOneCityChallengeCheckbox() =
addCheckbox("One City Challenge", newGameParameters.oneCityChallenge)
addCheckbox("One City Challenge", newGameParameters.oneCityChallenge)
{ newGameParameters.oneCityChallenge = it }
private fun Table.addNuclearWeaponsCheckbox() =
addCheckbox("Enable nuclear weapons", newGameParameters.nuclearWeaponsEnabled)
addCheckbox("Enable nuclear weapons", newGameParameters.nuclearWeaponsEnabled)
{ newGameParameters.nuclearWeaponsEnabled = it }
@ -80,7 +77,7 @@ class NewGameScreenOptionsTable(newGameScreen: NewGameScreen, val updatePlayerPi
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) }
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())
val selectBox = TranslatedSelectBox(values, initialState, CameraStageBaseScreen.skin)
selectBox.onChange { onChange(selectBox.selected.value) }
@ -100,18 +97,18 @@ class NewGameScreenOptionsTable(newGameScreen: NewGameScreen, val updatePlayerPi
private fun Table.addDifficultySelectBox() {
addSelectBox("{Difficulty}:", ruleset.difficulties.keys, newGameParameters.difficulty)
{newGameParameters.difficulty = it}
{ newGameParameters.difficulty = it }
}
private fun Table.addGameSpeedSelectBox() {
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() {
val eras = ruleset.technologies.values.map { it.era() }.distinct()
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() {
val modRulesets = RulesetCache.filter { it.key!="" }.values
if(modRulesets.isEmpty()) return
val modRulesets = RulesetCache.filter { it.key != "" }.values
if (modRulesets.isEmpty()) return
fun reloadMods() {
ruleset.clear()
@ -158,8 +155,8 @@ class NewGameScreenOptionsTable(newGameScreen: NewGameScreen, val updatePlayerPi
add("Mods:".toLabel(fontSize = 24)).padTop(16f).colspan(2).row()
val modCheckboxTable = Table().apply { defaults().pad(5f) }
for(mod in modRulesets){
val checkBox = CheckBox(mod.name.tr(),CameraStageBaseScreen.skin)
for (mod in modRulesets) {
val checkBox = CheckBox(mod.name.tr(), CameraStageBaseScreen.skin)
if (mod.name in newGameParameters.mods) checkBox.isChecked = true
checkBox.onChange {
if (checkBox.isChecked) newGameParameters.mods.add(mod.name)
@ -180,5 +177,4 @@ class NewGameScreenOptionsTable(newGameScreen: NewGameScreen, val updatePlayerPi
add(modCheckboxTable).colspan(2).row()
}
}
}

View File

@ -22,10 +22,12 @@ import java.util.*
class PlayerPickerTable(val newGameScreen: NewGameScreen, val newGameParameters: GameParameters): Table() {
val playerListTable = Table()
val nationsPopupWidth = newGameScreen.stage.width / 2f
val civBlocksWidth = newGameScreen.stage.width / 3
init {
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()
}
@ -34,19 +36,19 @@ class PlayerPickerTable(val newGameScreen: NewGameScreen, val newGameParameters:
val gameBasics = newGameScreen.ruleset // the mod picking changes this ruleset
reassignRemovedModReferences()
val newRulesetPlayableCivs = newGameScreen.ruleset.nations.count { it.key!=Constants.barbarians }
if(newGameParameters.players.size > newRulesetPlayableCivs)
newGameParameters.players=ArrayList(newGameParameters.players.subList(0,newRulesetPlayableCivs))
val newRulesetPlayableCivs = newGameScreen.ruleset.nations.count { it.key != Constants.barbarians }
if (newGameParameters.players.size > newRulesetPlayableCivs)
newGameParameters.players = ArrayList(newGameParameters.players.subList(0, newRulesetPlayableCivs))
if (desiredCiv.isNotEmpty()) assignDesiredCiv(desiredCiv)
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() }) {
playerListTable.add("+".toLabel(Color.BLACK,30).apply { this.setAlignment(Align.center) }
if (newGameParameters.players.count() < gameBasics.nations.values.count { it.isMajorCiv() }) {
playerListTable.add("+".toLabel(Color.BLACK, 30).apply { this.setAlignment(Align.center) }
.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() {
@ -58,9 +60,9 @@ class PlayerPickerTable(val newGameScreen: NewGameScreen, val newGameParameters:
private fun assignDesiredCiv(desiredCiv: String) {
// 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)
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 {
@ -69,7 +71,7 @@ class PlayerPickerTable(val newGameScreen: NewGameScreen, val newGameParameters:
playerTable.background = ImageGetter.getBackground(ImageGetter.getBlue().lerp(Color.BLACK, 0.8f))
val nationTable = getNationTable(player)
playerTable.add(nationTable)
playerTable.add(nationTable).left()
val playerTypeTextbutton = player.playerType.name.toTextButton()
playerTypeTextbutton.onClick {
@ -78,11 +80,11 @@ class PlayerPickerTable(val newGameScreen: NewGameScreen, val newGameParameters:
else player.playerType = PlayerType.AI
update()
}
playerTable.add(playerTypeTextbutton).width(100f).pad(5f)
playerTable.add("-".toLabel(Color.BLACK,30).apply { this.setAlignment(Align.center) }
playerTable.add(playerTypeTextbutton).width(100f).pad(5f).right()
playerTable.add("-".toLabel(Color.BLACK, 30).apply { this.setAlignment(Align.center) }
.surroundWithCircle(40f)
.onClick { newGameParameters.players.remove(player); update() }).pad(5f).row()
if(newGameParameters.isOnlineMultiplayer && player.playerType==PlayerType.Human) {
.onClick { newGameParameters.players.remove(player); update() }).pad(5f).right().row()
if (newGameParameters.isOnlineMultiplayer && player.playerType == PlayerType.Human) {
val playerIdTextfield = TextField(player.playerId, CameraStageBaseScreen.skin)
playerIdTextfield.messageText = "Please input Player ID!".tr()
@ -90,7 +92,7 @@ class PlayerPickerTable(val newGameScreen: NewGameScreen, val newGameParameters:
var errorLabel = "".toLabel(Color.RED)
playerTable.add(errorLabel).pad(5f).row()
fun onPlayerIdTextUpdated(){
fun onPlayerIdTextUpdated() {
try {
UUID.fromString(IdChecker.checkAndReturnPlayerUuid(playerIdTextfield.text))
player.playerId = playerIdTextfield.text.trim()
@ -122,13 +124,13 @@ class PlayerPickerTable(val newGameScreen: NewGameScreen, val newGameParameters:
private fun getNationTable(player: Player): 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) }
.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)
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.onClick {
popupNationPicker(player)
@ -146,7 +148,7 @@ class PlayerPickerTable(val newGameScreen: NewGameScreen, val newGameParameters:
randomPlayerTable.add("?".toLabel(Color.WHITE, 30)
.apply { this.setAlignment(Align.center) }
.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.touchable = Touchable.enabled
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 })
continue
nationListTable.add(NationTable(nation, nationsPopupWidth,newGameScreen.ruleset).onClick {
nationListTable.add(NationTable(nation, nationsPopupWidth, newGameScreen.ruleset).onClick {
player.chosenCiv = nation.name
nationsPopup.close()
update()
@ -172,6 +174,4 @@ class PlayerPickerTable(val newGameScreen: NewGameScreen, val newGameParameters:
nationsPopup.open()
update()
}
}
}