diff --git a/core/src/com/unciv/MainMenuScreen.kt b/core/src/com/unciv/MainMenuScreen.kt index e7e91eab03..36c3f81b15 100644 --- a/core/src/com/unciv/MainMenuScreen.kt +++ b/core/src/com/unciv/MainMenuScreen.kt @@ -20,6 +20,7 @@ import com.unciv.ui.mapeditor.EditorMapHolder import com.unciv.ui.mapeditor.LoadMapScreen import com.unciv.ui.mapeditor.MapEditorScreen import com.unciv.ui.mapeditor.NewMapScreen +import com.unciv.ui.newgamescreen.GameSetupInfo import com.unciv.ui.newgamescreen.NewGameScreen import com.unciv.ui.saves.LoadGameScreen import com.unciv.ui.utils.* @@ -75,7 +76,7 @@ class MainMenuScreen: CameraStageBaseScreen() { table.add(resumeTable).row() } - val quickstartTable = getTableBlock("Quickstart","OtherIcons/Quickstart") { startNewGame() } + val quickstartTable = getTableBlock("Quickstart","OtherIcons/Quickstart") { QuickstartNewGame() } table.add(quickstartTable).row() val newGameButton = getTableBlock("Start new game","OtherIcons/New") { @@ -148,8 +149,8 @@ class MainMenuScreen: CameraStageBaseScreen() { } } - private fun startNewGame() { - val newGame = GameStarter.startNewGame(GameParameters().apply { difficulty = "Chieftain" }, MapParameters()) + private fun QuickstartNewGame() { + val newGame = GameStarter.startNewGame(GameSetupInfo().apply { gameParameters.difficulty = "Chieftain" }) game.loadGame(newGame) } diff --git a/core/src/com/unciv/logic/GameInfo.kt b/core/src/com/unciv/logic/GameInfo.kt index 984c2d6680..ee4322a2fc 100644 --- a/core/src/com/unciv/logic/GameInfo.kt +++ b/core/src/com/unciv/logic/GameInfo.kt @@ -367,5 +367,6 @@ class GameInfo { } } + } diff --git a/core/src/com/unciv/logic/GameStarter.kt b/core/src/com/unciv/logic/GameStarter.kt index 4f5a36e573..a1b2f3ad3c 100644 --- a/core/src/com/unciv/logic/GameStarter.kt +++ b/core/src/com/unciv/logic/GameStarter.kt @@ -7,25 +7,26 @@ import com.unciv.logic.map.* import com.unciv.models.metadata.GameParameters import com.unciv.models.ruleset.Ruleset import com.unciv.models.ruleset.RulesetCache +import com.unciv.ui.newgamescreen.GameSetupInfo import java.util.* import kotlin.collections.ArrayList import kotlin.math.max object GameStarter { - fun startNewGame(newGameParameters: GameParameters, mapParameters: MapParameters): GameInfo { + fun startNewGame(gameSetupInfo: GameSetupInfo): GameInfo { val gameInfo = GameInfo() - gameInfo.gameParameters = newGameParameters - val ruleset = RulesetCache.getComplexRuleset(newGameParameters.mods) + gameInfo.gameParameters = gameSetupInfo.gameParameters + val ruleset = RulesetCache.getComplexRuleset(gameInfo.gameParameters.mods) - if (mapParameters.name != "") - gameInfo.tileMap = MapSaver.loadMap(mapParameters.name) - else gameInfo.tileMap = MapGenerator(ruleset).generateMap(mapParameters) - gameInfo.tileMap.mapParameters = mapParameters + if (gameSetupInfo.mapParameters.name != "") + gameInfo.tileMap = MapSaver.loadMap(gameSetupInfo.mapParameters.name) + else gameInfo.tileMap = MapGenerator(ruleset).generateMap(gameSetupInfo.mapParameters) + gameInfo.tileMap.mapParameters = gameSetupInfo.mapParameters gameInfo.tileMap.gameInfo = gameInfo // need to set this transient before placing units in the map - addCivilizations(newGameParameters, gameInfo, ruleset) // this is before gameInfo.setTransients, so gameInfo doesn't yet have the gameBasics + addCivilizations(gameSetupInfo.gameParameters, gameInfo, ruleset) // this is before gameInfo.setTransients, so gameInfo doesn't yet have the gameBasics for(tile in gameInfo.tileMap.values) for(unit in tile.getUnits()) @@ -36,7 +37,7 @@ object GameStarter { gameInfo.tileMap.setTransients(ruleset) // if we're starting from a map with preplaced units, they need the civs to exist first - gameInfo.difficulty = newGameParameters.difficulty + gameInfo.difficulty = gameSetupInfo.gameParameters.difficulty gameInfo.setTransients() // needs to be before placeBarbarianUnit because it depends on the tilemap having its gameinfo set @@ -49,7 +50,7 @@ object GameStarter { civInfo.tech.addTechnology(tech) for (tech in ruleset.technologies.values - .filter { ruleset.getEraNumber(it.era()) < ruleset.getEraNumber(newGameParameters.startingEra) }) + .filter { ruleset.getEraNumber(it.era()) < ruleset.getEraNumber(gameSetupInfo.gameParameters.startingEra) }) if (!civInfo.tech.isResearched(tech.name)) civInfo.tech.addTechnology(tech.name) diff --git a/core/src/com/unciv/ui/newgamescreen/NewGameScreen.kt b/core/src/com/unciv/ui/newgamescreen/NewGameScreen.kt index 49344658e1..4cfeb8d729 100644 --- a/core/src/com/unciv/ui/newgamescreen/NewGameScreen.kt +++ b/core/src/com/unciv/ui/newgamescreen/NewGameScreen.kt @@ -21,17 +21,22 @@ import com.unciv.ui.worldscreen.mainmenu.OnlineMultiplayer import java.util.* import kotlin.concurrent.thread -class NewGameScreen(previousScreen:CameraStageBaseScreen, currentGame:GameInfo?=null): PickerScreen(){ - val newGameParameters= currentGame?.gameParameters?.clone() ?: GameParameters() - val mapParameters = currentGame?.tileMap?.mapParameters ?: MapParameters() - val ruleset = RulesetCache.getComplexRuleset(newGameParameters.mods) +class GameSetupInfo(var gameId:String, var gameParameters: GameParameters, var mapParameters: MapParameters) { + constructor() : this("", GameParameters(), MapParameters()) + constructor(gameInfo: GameInfo) : this("", gameInfo.gameParameters.clone(), gameInfo.tileMap.mapParameters) +} + +class NewGameScreen(previousScreen:CameraStageBaseScreen, _gameSetupInfo: GameSetupInfo?=null): PickerScreen(){ + + var gameSetupInfo:GameSetupInfo= _gameSetupInfo ?: GameSetupInfo() + val ruleset = RulesetCache.getComplexRuleset(gameSetupInfo.gameParameters.mods) init { setDefaultCloseAction(previousScreen) scrollPane.setScrollingDisabled(true,true) - val playerPickerTable = PlayerPickerTable(this, newGameParameters) + 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) @@ -41,7 +46,7 @@ class NewGameScreen(previousScreen:CameraStageBaseScreen, currentGame:GameInfo?= rightSideButton.enable() rightSideButton.setText("Start game!".tr()) rightSideButton.onClick { - if (newGameParameters.players.none { it.playerType == PlayerType.Human }) { + if (gameSetupInfo.gameParameters.players.none { it.playerType == PlayerType.Human }) { val noHumanPlayersPopup = Popup(this) noHumanPlayersPopup.addGoodSizedLabel("No human players selected!".tr()).row() noHumanPlayersPopup.addCloseButton() @@ -49,8 +54,8 @@ class NewGameScreen(previousScreen:CameraStageBaseScreen, currentGame:GameInfo?= return@onClick } - if (newGameParameters.isOnlineMultiplayer) { - for (player in newGameParameters.players.filter { it.playerType == PlayerType.Human }) { + if (gameSetupInfo.gameParameters.isOnlineMultiplayer) { + for (player in gameSetupInfo.gameParameters.players.filter { it.playerType == PlayerType.Human }) { try { UUID.fromString(IdChecker.checkAndReturnPlayerUuid(player.playerId)) } catch (ex: Exception) { @@ -76,8 +81,8 @@ class NewGameScreen(previousScreen:CameraStageBaseScreen, currentGame:GameInfo?= private fun newGameThread() { try { - newGame = GameStarter.startNewGame(newGameParameters, mapParameters) - if (newGameParameters.isOnlineMultiplayer) { + newGame = GameStarter.startNewGame(gameSetupInfo) + if (gameSetupInfo.gameParameters.isOnlineMultiplayer) { newGame!!.isUpToDate = true // So we don't try to download it from dropbox the second after we upload it - the file is not yet ready for loading! try { OnlineMultiplayer().tryUploadGame(newGame!!) diff --git a/core/src/com/unciv/ui/newgamescreen/NewGameScreenOptionsTable.kt b/core/src/com/unciv/ui/newgamescreen/NewGameScreenOptionsTable.kt index c8d41c4b7b..d6cb8fec38 100644 --- a/core/src/com/unciv/ui/newgamescreen/NewGameScreenOptionsTable.kt +++ b/core/src/com/unciv/ui/newgamescreen/NewGameScreenOptionsTable.kt @@ -17,8 +17,8 @@ import com.unciv.ui.utils.toLabel class NewGameScreenOptionsTable(val newGameScreen: NewGameScreen, val updatePlayerPickerTable:(desiredCiv:String)->Unit) : Table(CameraStageBaseScreen.skin) { - val newGameParameters = newGameScreen.newGameParameters - val mapParameters = newGameScreen.mapParameters + val newGameParameters = newGameScreen.gameSetupInfo.gameParameters + val mapParameters = newGameScreen.gameSetupInfo.mapParameters val ruleset = newGameScreen.ruleset private var mapTypeSpecificTable = Table() diff --git a/core/src/com/unciv/ui/victoryscreen/VictoryScreen.kt b/core/src/com/unciv/ui/victoryscreen/VictoryScreen.kt index 4be8338d64..7f050811a5 100644 --- a/core/src/com/unciv/ui/victoryscreen/VictoryScreen.kt +++ b/core/src/com/unciv/ui/victoryscreen/VictoryScreen.kt @@ -7,6 +7,7 @@ import com.unciv.logic.civilization.CivilizationInfo import com.unciv.models.ruleset.VictoryType import com.unciv.models.translations.tr import com.unciv.ui.EmpireOverviewScreen +import com.unciv.ui.newgamescreen.GameSetupInfo import com.unciv.ui.newgamescreen.NewGameScreen import com.unciv.ui.pickerscreens.PickerScreen import com.unciv.ui.utils.* @@ -85,7 +86,7 @@ class VictoryScreen(val worldScreen: WorldScreen) : PickerScreen() { rightSideButton.isVisible = true rightSideButton.enable() rightSideButton.onClick { - game.setScreen(NewGameScreen(this, worldScreen.gameInfo)) + game.setScreen(NewGameScreen(this, GameSetupInfo(worldScreen.gameInfo))) } closeButton.setText("One more turn...!".tr()) diff --git a/core/src/com/unciv/ui/worldscreen/mainmenu/WorldScreenMenuPopup.kt b/core/src/com/unciv/ui/worldscreen/mainmenu/WorldScreenMenuPopup.kt index df1561c83d..d993720f3d 100644 --- a/core/src/com/unciv/ui/worldscreen/mainmenu/WorldScreenMenuPopup.kt +++ b/core/src/com/unciv/ui/worldscreen/mainmenu/WorldScreenMenuPopup.kt @@ -5,6 +5,7 @@ import com.unciv.Constants import com.unciv.MainMenuScreen import com.unciv.models.translations.tr import com.unciv.ui.CivilopediaScreen +import com.unciv.ui.newgamescreen.GameSetupInfo import com.unciv.ui.newgamescreen.NewGameScreen import com.unciv.ui.saves.SaveGameScreen import com.unciv.ui.utils.Popup @@ -37,7 +38,7 @@ class WorldScreenMenuPopup(val worldScreen: WorldScreen) : Popup(worldScreen) { addSquareButton("Start new game".tr()){ - worldScreen.game.setScreen(NewGameScreen(worldScreen, worldScreen.gameInfo)) + worldScreen.game.setScreen(NewGameScreen(worldScreen, GameSetupInfo(worldScreen.gameInfo))) close() }.size(width,height) addSeparator()