From 62b71385808e3e4457ee1ddd2a3201d8f396f759 Mon Sep 17 00:00:00 2001 From: Alexander Korolyov <49795502+alkorolyov@users.noreply.github.com> Date: Tue, 16 Jun 2020 13:26:03 -0400 Subject: [PATCH] Fix error during saving scenario when empty name. (#2732) * Fix error during saving scenario when empty name. Safe saving and check for empty name. * New Screen instead of popup for Game Parameters, during editing/creating scenario. * Now game parameters information is correctly loaded with scenario. --- .../ui/mapeditor/GameParametersScreen.kt | 83 +++++++++++++++++++ .../unciv/ui/mapeditor/MapEditorMenuPopup.kt | 38 +-------- .../ui/newgamescreen/PlayerPickerTable.kt | 5 +- 3 files changed, 86 insertions(+), 40 deletions(-) create mode 100644 core/src/com/unciv/ui/mapeditor/GameParametersScreen.kt diff --git a/core/src/com/unciv/ui/mapeditor/GameParametersScreen.kt b/core/src/com/unciv/ui/mapeditor/GameParametersScreen.kt new file mode 100644 index 0000000000..d18e02ef65 --- /dev/null +++ b/core/src/com/unciv/ui/mapeditor/GameParametersScreen.kt @@ -0,0 +1,83 @@ +package com.unciv.ui.mapeditor + +import com.badlogic.gdx.Gdx +import com.badlogic.gdx.scenes.scene2d.ui.TextField +import com.unciv.logic.MapSaver +import com.unciv.logic.map.MapType +import com.unciv.logic.map.Scenario +import com.unciv.logic.map.TileMap +import com.unciv.models.metadata.Player +import com.unciv.ui.newgamescreen.GameOptionsTable +import com.unciv.ui.newgamescreen.GameSetupInfo +import com.unciv.ui.newgamescreen.PlayerPickerTable +import com.unciv.ui.newgamescreen.PreviousScreenInterface +import com.unciv.ui.pickerscreens.PickerScreen +import com.unciv.ui.utils.* +import kotlin.concurrent.thread + +class GameParametersScreen(var mapEditorScreen: MapEditorScreen): PickerScreen() { + var playerPickerTable = PlayerPickerTable(mapEditorScreen, mapEditorScreen.gameSetupInfo.gameParameters) + var gameOptionsTable = GameOptionsTable(mapEditorScreen) { desiredCiv: String -> playerPickerTable.update(desiredCiv) } + + init { + setDefaultCloseAction(mapEditorScreen) + scrollPane.setScrollingDisabled(true, true) + + // update players list from tileMap starting locations + if (mapEditorScreen.scenario == null) { + mapEditorScreen.gameSetupInfo.gameParameters.players = getPlayersFromMap(mapEditorScreen.tileMap) + } + + playerPickerTable.apply { locked = true }.update() + val scenarioNameEditor = TextField(mapEditorScreen.scenarioName, skin) + + topTable.add(playerPickerTable) + topTable.addSeparatorVertical() + topTable.add(gameOptionsTable).row() + topTable.add(scenarioNameEditor) + rightSideButton.setText("Save scenario") + rightSideButton.onClick { + thread(name = "SaveScenario") { + try { + mapEditorScreen.tileMap.mapParameters.type = MapType.scenario + mapEditorScreen.scenario = Scenario(mapEditorScreen.tileMap, mapEditorScreen.gameSetupInfo.gameParameters) + mapEditorScreen.scenarioName = scenarioNameEditor.text + MapSaver.saveScenario(scenarioNameEditor.text, mapEditorScreen.scenario!!) + + game.setScreen(mapEditorScreen) + Gdx.app.postRunnable { + ResponsePopup("Scenario saved", mapEditorScreen) // todo - add this text to translations + } + } catch (ex: Exception) { + ex.printStackTrace() + Gdx.app.postRunnable { + val cantLoadGamePopup = Popup(mapEditorScreen) + cantLoadGamePopup.addGoodSizedLabel("It looks like your scenario can't be saved!").row() + cantLoadGamePopup.addCloseButton() + cantLoadGamePopup.open(force = true) + } + } + } + } + + rightSideButton.isEnabled = scenarioNameEditor.text.isNotEmpty() + scenarioNameEditor.addListener { + mapEditorScreen.scenarioName = scenarioNameEditor.text + rightSideButton.isEnabled = scenarioNameEditor.text.isNotEmpty() + true + } + } + + private fun getPlayersFromMap(tileMap: TileMap): ArrayList { + val tilesWithStartingLocations = tileMap.values + .filter { it.improvement != null && it.improvement!!.startsWith("StartingLocation ") } + var players = ArrayList() + for (tile in tilesWithStartingLocations) { + players.add(Player().apply{ + chosenCiv = tile.improvement!!.removePrefix("StartingLocation ") + }) + } + return players + } +} + diff --git a/core/src/com/unciv/ui/mapeditor/MapEditorMenuPopup.kt b/core/src/com/unciv/ui/mapeditor/MapEditorMenuPopup.kt index ae74f5c4d5..85bbe62320 100644 --- a/core/src/com/unciv/ui/mapeditor/MapEditorMenuPopup.kt +++ b/core/src/com/unciv/ui/mapeditor/MapEditorMenuPopup.kt @@ -161,30 +161,7 @@ class MapEditorMenuPopup(var mapEditorScreen: MapEditorScreen): Popup(mapEditorS add(scenarioButton).row() scenarioButton.onClick { remove() - // update players list from tileMap starting locations - if (mapEditorScreen.scenario == null) { - mapEditorScreen.gameSetupInfo.gameParameters.players = getPlayersFromMap(mapEditorScreen.tileMap) - } - - val gameParametersPopup = Popup(screen) - val playerPickerTable = PlayerPickerTable(mapEditorScreen, mapEditorScreen.gameSetupInfo.gameParameters) - val gameOptionsTable = GameOptionsTable(mapEditorScreen) { desiredCiv: String -> playerPickerTable.update(desiredCiv) } - val scenarioNameEditor = TextField(mapEditorScreen.scenarioName, skin) - - gameParametersPopup.add(playerPickerTable) - gameParametersPopup.addSeparatorVertical() - gameParametersPopup.add(gameOptionsTable).row() - gameParametersPopup.add(scenarioNameEditor) - gameParametersPopup.addButton("Save scenario") { - mapEditorScreen.tileMap.mapParameters.type = MapType.scenario - mapEditorScreen.scenario = Scenario(mapEditorScreen.tileMap, mapEditorScreen.gameSetupInfo.gameParameters) - mapEditorScreen.scenarioName = scenarioNameEditor.text - MapSaver.saveScenario(scenarioNameEditor.text, mapEditorScreen.scenario!!) - ResponsePopup("Scenario saved", mapEditorScreen) - gameParametersPopup.close() - }.row() - gameParametersPopup.addCloseButton().row() - gameParametersPopup.open() + UncivGame.Current.setScreen(GameParametersScreen(mapEditorScreen)) } } @@ -210,16 +187,3 @@ class MapEditorMenuPopup(var mapEditorScreen: MapEditorScreen): Popup(mapEditorS } } - - -private fun getPlayersFromMap(tileMap: TileMap): ArrayList { - val tilesWithStartingLocations = tileMap.values - .filter { it.improvement != null && it.improvement!!.startsWith("StartingLocation ") } - var players = ArrayList() - for (tile in tilesWithStartingLocations) { - players.add(Player().apply{ - chosenCiv = tile.improvement!!.removePrefix("StartingLocation ") - }) - } - return players -} diff --git a/core/src/com/unciv/ui/newgamescreen/PlayerPickerTable.kt b/core/src/com/unciv/ui/newgamescreen/PlayerPickerTable.kt index 7a2775feba..7a31102707 100644 --- a/core/src/com/unciv/ui/newgamescreen/PlayerPickerTable.kt +++ b/core/src/com/unciv/ui/newgamescreen/PlayerPickerTable.kt @@ -24,7 +24,6 @@ class PlayerPickerTable(val previousScreen: PreviousScreenInterface, var gamePar val civBlocksWidth = previousScreen.stage.width / 3 var locked = false - init { top() add("Civilizations".toLabel(fontSize = 24)).padBottom(20f).row() @@ -77,7 +76,7 @@ class PlayerPickerTable(val previousScreen: PreviousScreenInterface, var gamePar val playerTypeTextbutton = player.playerType.name.toTextButton() playerTypeTextbutton.onClick { - if (locked) return@onClick +// if (locked) return@onClick if (player.playerType == PlayerType.AI) player.playerType = PlayerType.Human else player.playerType = PlayerType.AI @@ -138,7 +137,7 @@ class PlayerPickerTable(val previousScreen: PreviousScreenInterface, var gamePar nationTable.add(player.chosenCiv.toLabel()).pad(5f) nationTable.touchable = Touchable.enabled nationTable.onClick { - popupNationPicker(player) + if (!locked) popupNationPicker(player) } return nationTable }