mirror of
https://github.com/yairm210/Unciv.git
synced 2025-03-09 20:29:50 +07:00
List of saved games is now returned as a series of file hanldes - this means there's a lot less ping-ponging between the game name and the file in all kinds of places
This commit is contained in:
parent
4046837a3e
commit
1261b1de30
@ -31,18 +31,21 @@ object GameSaver {
|
||||
return externalFile
|
||||
}
|
||||
|
||||
fun getSaves(multiplayer: Boolean = false): Sequence<String> {
|
||||
val localSaves = Gdx.files.local(getSubfolder(multiplayer)).list().asSequence().map { it.name() }
|
||||
fun getSaves(multiplayer: Boolean = false): Sequence<FileHandle> {
|
||||
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<String> { return getSaves().filter { it.startsWith("Autosave") } }
|
||||
fun getAutosaves(): Sequence<FileHandle> { 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())
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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<String, String>()
|
||||
private var multiplayerGameList = mutableMapOf<String, FileHandle>()
|
||||
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<String>
|
||||
val savedGames: Sequence<FileHandle>
|
||||
|
||||
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
|
||||
|
@ -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<String>(CameraStageBaseScreen.skin)
|
||||
val scenarioSelectBox = SelectBox<FileHandle>(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()
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user