diff --git a/core/src/com/unciv/logic/GameSaver.kt b/core/src/com/unciv/logic/GameSaver.kt index 2d2d36c9c2..799af4fb24 100644 --- a/core/src/com/unciv/logic/GameSaver.kt +++ b/core/src/com/unciv/logic/GameSaver.kt @@ -31,18 +31,21 @@ object GameSaver { return externalFile } - fun getSaves(multiplayer: Boolean = false): Sequence { - val localSaves = Gdx.files.local(getSubfolder(multiplayer)).list().asSequence().map { it.name() } + fun getSaves(multiplayer: Boolean = false): Sequence { + val localSaves = Gdx.files.local(getSubfolder(multiplayer)).list().asSequence() if (externalFilesDirForAndroid == "" || !Gdx.files.isExternalStorageAvailable) return localSaves - return localSaves + Gdx.files.absolute(externalFilesDirForAndroid + "/${getSubfolder(multiplayer)}").list().asSequence().map { it.name() } + return localSaves + Gdx.files.absolute(externalFilesDirForAndroid + "/${getSubfolder(multiplayer)}").list().asSequence() } fun saveGame(game: GameInfo, GameName: String, multiplayer: Boolean = false) { json().toJson(game,getSave(GameName, multiplayer)) } - fun loadGameByName(GameName: String, multiplayer: Boolean = false) : GameInfo { - val game = json().fromJson(GameInfo::class.java, getSave(GameName, multiplayer)) + fun loadGameByName(GameName: String, multiplayer: Boolean = false) = + loadGameFromFile(getSave(GameName, multiplayer)) + + fun loadGameFromFile(gameFile: FileHandle): GameInfo { + val game = json().fromJson(GameInfo::class.java, gameFile) game.setTransients() return game } @@ -110,10 +113,10 @@ object GameSaver { val newAutosaveFilename = saveFilesFolder + File.separator + "Autosave-${gameInfo.currentPlayer}-${gameInfo.turns}" getSave("Autosave").copyTo(Gdx.files.local(newAutosaveFilename)) - fun getAutosaves(): Sequence { return getSaves().filter { it.startsWith("Autosave") } } + fun getAutosaves(): Sequence { return getSaves().filter { it.name().startsWith("Autosave") } } while(getAutosaves().count()>10){ - val saveToDelete = getAutosaves().minBy { getSave(it).lastModified() }!! - deleteSave(saveToDelete) + val saveToDelete = getAutosaves().minBy { it.lastModified() }!! + deleteSave(saveToDelete.name()) } } diff --git a/core/src/com/unciv/ui/MultiplayerScreen.kt b/core/src/com/unciv/ui/MultiplayerScreen.kt index fcea2ec576..29342edaa0 100644 --- a/core/src/com/unciv/ui/MultiplayerScreen.kt +++ b/core/src/com/unciv/ui/MultiplayerScreen.kt @@ -2,6 +2,7 @@ package com.unciv.ui import com.unciv.ui.utils.AutoScrollPane as ScrollPane import com.badlogic.gdx.Gdx +import com.badlogic.gdx.files.FileHandle import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.scenes.scene2d.ui.* import com.unciv.logic.GameInfo @@ -18,7 +19,7 @@ class MultiplayerScreen(previousScreen: CameraStageBaseScreen) : PickerScreen() private lateinit var selectedGame: GameInfo private lateinit var selectedGameName: String - private var multiplayerGameList = mutableMapOf() + private var multiplayerGameList = mutableMapOf() private val rightSideTable = Table() private val leftSideTable = Table() @@ -186,7 +187,7 @@ class MultiplayerScreen(previousScreen: CameraStageBaseScreen) : PickerScreen() fun reloadGameListUI() { val leftSubTable = Table() val gameSaver = GameSaver - val savedGames: Sequence + val savedGames: Sequence try { savedGames = gameSaver.getSaves(true) @@ -199,14 +200,14 @@ class MultiplayerScreen(previousScreen: CameraStageBaseScreen) : PickerScreen() return } - for (gameSaveName in savedGames) { + for (gameSaveFile in savedGames) { try { val gameTable = Table() - val game = gameSaver.loadGameByName(gameSaveName, true) + val game = gameSaver.loadGameFromFile(gameSaveFile) //Add games to list so saves don't have to be loaded as Files so often if (!gameIsAlreadySavedAsMultiplayer(game.gameId)) - multiplayerGameList[game.gameId] = gameSaveName + multiplayerGameList[game.gameId] = gameSaveFile if (isUsersTurn(game)) { gameTable.add(ImageGetter.getNationIndicator(game.currentPlayerCiv.nation, 45f)) @@ -214,11 +215,11 @@ class MultiplayerScreen(previousScreen: CameraStageBaseScreen) : PickerScreen() gameTable.add() } - val lastModifiedMillis = gameSaver.getSave(gameSaveName, true).lastModified() - val gameButton = TextButton(gameSaveName, skin) + val lastModifiedMillis = gameSaveFile.lastModified() + val gameButton = gameSaveFile.name().toTextButton() gameButton.onClick { selectedGame = game - selectedGameName = gameSaveName + selectedGameName = gameSaveFile.name() copyGameIdButton.enable() editButton.enable() rightSideButton.enable() @@ -254,7 +255,7 @@ class MultiplayerScreen(previousScreen: CameraStageBaseScreen) : PickerScreen() for (gameId in multiplayerGameList.keys) { try { val game = OnlineMultiplayer().tryDownloadGame(gameId) - GameSaver.saveGame(game, multiplayerGameList.getValue(gameId), true) + GameSaver.saveGame(game, multiplayerGameList.getValue(gameId).name(), true) } catch (ex: Exception) { //skipping one is not fatal //Trying to use as many prev. used strings as possible diff --git a/core/src/com/unciv/ui/newgamescreen/MapOptionsTable.kt b/core/src/com/unciv/ui/newgamescreen/MapOptionsTable.kt index c841066e33..442d773b16 100644 --- a/core/src/com/unciv/ui/newgamescreen/MapOptionsTable.kt +++ b/core/src/com/unciv/ui/newgamescreen/MapOptionsTable.kt @@ -1,5 +1,6 @@ package com.unciv.ui.newgamescreen +import com.badlogic.gdx.files.FileHandle import com.badlogic.gdx.scenes.scene2d.ui.SelectBox import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.utils.Array @@ -29,10 +30,10 @@ class MapOptionsTable(val newGameScreen: NewGameScreen): Table() { addMapTypeSelection() } - fun selectSavedGameAsScenario(gameName: String){ - val savedGame = GameSaver.loadGameByName(gameName) + fun selectSavedGameAsScenario(gameFile: FileHandle){ + val savedGame = GameSaver.loadGameFromFile(gameFile) mapParameters.type = MapType.scenario - mapParameters.name = gameName + mapParameters.name = gameFile.name() newGameScreen.gameSetupInfo.gameParameters = savedGame.gameParameters newGameScreen.gameSetupInfo.mapParameters = savedGame.tileMap.mapParameters newGameScreen.updateRuleset() @@ -46,7 +47,7 @@ class MapOptionsTable(val newGameScreen: NewGameScreen): Table() { if (MapSaver.getMaps().isNotEmpty()) mapTypes.add(MapType.custom) if (MapSaver.getScenarios().isNotEmpty() && UncivGame.Current.settings.extendedMapEditor) mapTypes.add(MapType.scenarioMap) - if (GameSaver.getSaves().any { it.toLowerCase().endsWith("scenario") }) + if (GameSaver.getSaves().any { it.name().toLowerCase().endsWith("scenario") }) mapTypes.add(MapType.scenario) mapTypeSelectBox = TranslatedSelectBox(mapTypes, "Generated", CameraStageBaseScreen.skin) @@ -66,13 +67,13 @@ class MapOptionsTable(val newGameScreen: NewGameScreen): Table() { .right().row() - val scenarioSelectBox = SelectBox(CameraStageBaseScreen.skin) + val scenarioSelectBox = SelectBox(CameraStageBaseScreen.skin) for (savedGame in GameSaver.getSaves()) { - if (savedGame.toLowerCase().endsWith("scenario")) + if (savedGame.name().toLowerCase().endsWith("scenario")) scenarioSelectBox.items.add(savedGame) } scenarioSelectBox.items = scenarioSelectBox.items // it doesn't register them until you do this. - scenarioSelectBox.selected = scenarioMapSelectBox.items.first() + scenarioSelectBox.selected = scenarioSelectBox.items.first() // needs to be after the item change, so it doesn't activate before we choose the Scenario maptype scenarioSelectBox.onChange { selectSavedGameAsScenario(scenarioSelectBox.selected) } scenarioOptionsTable.add("{Scenario file}:".toLabel()).left() diff --git a/core/src/com/unciv/ui/saves/LoadGameScreen.kt b/core/src/com/unciv/ui/saves/LoadGameScreen.kt index d9480451fb..6624042f01 100644 --- a/core/src/com/unciv/ui/saves/LoadGameScreen.kt +++ b/core/src/com/unciv/ui/saves/LoadGameScreen.kt @@ -114,20 +114,20 @@ class LoadGameScreen(previousScreen:CameraStageBaseScreen) : PickerScreen() { private fun updateLoadableGames(showAutosaves:Boolean) { saveTable.clear() - for (save in GameSaver.getSaves().sortedByDescending { GameSaver.getSave(it).lastModified() }) { - if (save.startsWith("Autosave") && !showAutosaves) continue - val textButton = TextButton(save, skin) + for (save in GameSaver.getSaves().sortedByDescending { it.lastModified() }) { + if (save.name().startsWith("Autosave") && !showAutosaves) continue + val textButton = TextButton(save.name(), skin) textButton.onClick { - selectedSave = save + selectedSave = save.name() copySavedGameToClipboardButton.enable() - var textToSet = save + var textToSet = save.name() - val savedAt = Date(GameSaver.getSave(save).lastModified()) + val savedAt = Date(save.lastModified()) descriptionLabel.setText("Loading...".tr()) textToSet += "\n{Saved at}: ".tr() + SimpleDateFormat("yyyy-MM-dd HH:mm").format(savedAt) thread { // Even loading the game to get its metadata can take a long time on older phones try { - val game = GameSaver.loadGameByName(save) + val game = GameSaver.loadGameFromFile(save) val playerCivNames = game.civilizations.filter { it.isPlayerCivilization() }.joinToString { it.civName.tr() } textToSet += "\n" + playerCivNames + ", " + game.difficulty.tr() + ", {Turn} ".tr() + game.turns @@ -137,7 +137,7 @@ class LoadGameScreen(previousScreen:CameraStageBaseScreen) : PickerScreen() { Gdx.app.postRunnable { descriptionLabel.setText(textToSet) - rightSideButton.setText("Load [$save]".tr()) + rightSideButton.setText("Load [${save.name()}]".tr()) rightSideButton.enable() deleteSaveButton.enable() deleteSaveButton.color = Color.RED diff --git a/core/src/com/unciv/ui/saves/SaveGameScreen.kt b/core/src/com/unciv/ui/saves/SaveGameScreen.kt index 22d29221b2..966e4f21de 100644 --- a/core/src/com/unciv/ui/saves/SaveGameScreen.kt +++ b/core/src/com/unciv/ui/saves/SaveGameScreen.kt @@ -3,7 +3,6 @@ package com.unciv.ui.saves import com.badlogic.gdx.Gdx import com.badlogic.gdx.scenes.scene2d.ui.CheckBox import com.badlogic.gdx.scenes.scene2d.ui.Table -import com.badlogic.gdx.scenes.scene2d.ui.TextButton import com.badlogic.gdx.scenes.scene2d.ui.TextField import com.badlogic.gdx.utils.Json import com.unciv.UncivGame @@ -67,12 +66,12 @@ class SaveGameScreen : PickerScreen() { fun updateShownSaves(showAutosaves: Boolean) { currentSaves.clear() val saves = GameSaver.getSaves() - .sortedByDescending { GameSaver.getSave(it).lastModified() } - for (saveGameName in saves) { - if (saveGameName.startsWith("Autosave") && !showAutosaves) continue - val textButton = TextButton(saveGameName, skin) + .sortedByDescending { it.lastModified() } + for (saveGameFile in saves) { + if (saveGameFile.name().startsWith("Autosave") && !showAutosaves) continue + val textButton = saveGameFile.name().toTextButton() textButton.onClick { - textField.text = saveGameName + textField.text = saveGameFile.name() } currentSaves.add(textButton).pad(5f).row() }