mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-12 03:24:06 +09:00
autosave is back
This commit is contained in:
Binary file not shown.
@@ -371,6 +371,9 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) {
|
|||||||
makeSavegameBackupCopy(getPlayerSaveFiledesc(playerSavefileName))
|
makeSavegameBackupCopy(getPlayerSaveFiledesc(playerSavefileName))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val autosaveOnErrorAction = { e: Throwable -> uiAutosaveNotifier.setAsError() }
|
||||||
|
|
||||||
|
|
||||||
private fun postInitForNewGame() {
|
private fun postInitForNewGame() {
|
||||||
worldSavefileName = LoadSavegame.getWorldSavefileName(savegameNickname, world)
|
worldSavefileName = LoadSavegame.getWorldSavefileName(savegameNickname, world)
|
||||||
playerSavefileName = LoadSavegame.getPlayerSavefileName(actorGamer)
|
playerSavefileName = LoadSavegame.getPlayerSavefileName(actorGamer)
|
||||||
@@ -395,18 +398,16 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) {
|
|||||||
)
|
)
|
||||||
actorGamer.backupPlayerProps(isMultiplayer)
|
actorGamer.backupPlayerProps(isMultiplayer)
|
||||||
|
|
||||||
val onError = { e: Throwable -> uiAutosaveNotifier.setAsError() }
|
|
||||||
|
|
||||||
// make initial savefile
|
// make initial savefile
|
||||||
// we're not writing multiple files at one go because:
|
// we're not writing multiple files at one go because:
|
||||||
// 1. lighten the IO burden
|
// 1. lighten the IO burden
|
||||||
// 2. cannot sync up the "counter" to determine whether both are finished
|
// 2. cannot sync up the "counter" to determine whether both are finished
|
||||||
uiAutosaveNotifier.setAsOpen()
|
uiAutosaveNotifier.setAsOpen()
|
||||||
val saveTime_t = App.getTIME_T()
|
val saveTime_t = App.getTIME_T()
|
||||||
WriteSavegame.immediate(saveTime_t, WriteSavegame.SaveMode.PLAYER, playerDisk, getPlayerSaveFiledesc(playerSavefileName), this, true, onError) {
|
WriteSavegame.immediate(saveTime_t, WriteSavegame.SaveMode.PLAYER, playerDisk, getPlayerSaveFiledesc(playerSavefileName), this, true, autosaveOnErrorAction) {
|
||||||
makeSavegameBackupCopy(getPlayerSaveFiledesc(playerSavefileName))
|
makeSavegameBackupCopy(getPlayerSaveFiledesc(playerSavefileName))
|
||||||
|
|
||||||
WriteSavegame.immediate(saveTime_t, WriteSavegame.SaveMode.WORLD, worldDisk, getWorldSaveFiledesc(worldSavefileName), this, true, onError) {
|
WriteSavegame.immediate(saveTime_t, WriteSavegame.SaveMode.WORLD, worldDisk, getWorldSaveFiledesc(worldSavefileName), this, true, autosaveOnErrorAction) {
|
||||||
makeSavegameBackupCopy(getWorldSaveFiledesc(worldSavefileName)) // don't put it on the postInit() or render(); must be called using callback
|
makeSavegameBackupCopy(getWorldSaveFiledesc(worldSavefileName)) // don't put it on the postInit() or render(); must be called using callback
|
||||||
uiAutosaveNotifier.setAsClose()
|
uiAutosaveNotifier.setAsClose()
|
||||||
}
|
}
|
||||||
@@ -1083,13 +1084,31 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) {
|
|||||||
fun queueAutosave() {
|
fun queueAutosave() {
|
||||||
val start = System.nanoTime()
|
val start = System.nanoTime()
|
||||||
|
|
||||||
/*uiAutosaveNotifier.setAsOpen()
|
uiAutosaveNotifier.setAsOpen()
|
||||||
makeSavegameBackupCopy()
|
|
||||||
WriteSavegame.quick(savegameArchive, getSaveFileMain(), this, true) {
|
val saveTime_t = App.getTIME_T()
|
||||||
uiAutosaveNotifier.setAsClose()
|
val playerSavefile = getPlayerSaveFiledesc(INGAME.playerSavefileName)
|
||||||
|
val worldSavefile = getWorldSaveFiledesc(INGAME.worldSavefileName)
|
||||||
|
|
||||||
|
INGAME.makeSavegameBackupCopy(playerSavefile)
|
||||||
|
WriteSavegame(saveTime_t, WriteSavegame.SaveMode.PLAYER, INGAME.playerDisk, playerSavefile, INGAME as TerrarumIngame, true, autosaveOnErrorAction) {
|
||||||
|
|
||||||
|
INGAME.makeSavegameBackupCopy(worldSavefile)
|
||||||
|
WriteSavegame(saveTime_t, WriteSavegame.SaveMode.QUICK_WORLD, INGAME.worldDisk, worldSavefile, INGAME as TerrarumIngame, true, autosaveOnErrorAction) {
|
||||||
|
// callback:
|
||||||
|
// rebuild the disk skimmers
|
||||||
|
INGAME.actorContainerActive.filterIsInstance<IngamePlayer>().forEach {
|
||||||
|
printdbg(this, "Game Save callback -- rebuilding the disk skimmer for IngamePlayer ${it.actorValue.getAsString(AVKey.NAME)}")
|
||||||
|
it.rebuildingDiskSkimmer?.rebuild()
|
||||||
|
}
|
||||||
|
|
||||||
|
// return to normal state
|
||||||
|
uiAutosaveNotifier.setAsClose()
|
||||||
|
|
||||||
|
debugTimers.put("Last Autosave Duration", System.nanoTime() - start)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
debugTimers.put("Last Autosave Duration", System.nanoTime() - start)
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ import java.util.logging.Level
|
|||||||
object WriteSavegame {
|
object WriteSavegame {
|
||||||
|
|
||||||
enum class SaveMode {
|
enum class SaveMode {
|
||||||
META, PLAYER, WORLD, SHARED, QUICK_PLAYER, QUICK_WORLD
|
META, PLAYER, WORLD, SHARED, QUICK_WORLD
|
||||||
}
|
}
|
||||||
|
|
||||||
@Volatile var savingStatus = -1 // -1: not started, 0: saving in progress, 255: saving finished
|
@Volatile var savingStatus = -1 // -1: not started, 0: saving in progress, 255: saving finished
|
||||||
@@ -36,13 +36,13 @@ object WriteSavegame {
|
|||||||
private fun getSaveThread(time_t: Long, mode: SaveMode, disk: VirtualDisk, outFile: File, ingame: TerrarumIngame, hasThumbnail: Boolean, isAuto: Boolean, errorHandler: (Throwable) -> Unit, callback: () -> Unit) = when (mode) {
|
private fun getSaveThread(time_t: Long, mode: SaveMode, disk: VirtualDisk, outFile: File, ingame: TerrarumIngame, hasThumbnail: Boolean, isAuto: Boolean, errorHandler: (Throwable) -> Unit, callback: () -> Unit) = when (mode) {
|
||||||
SaveMode.WORLD -> WorldSavingThread(time_t, disk, outFile, ingame, hasThumbnail, isAuto, callback, errorHandler)
|
SaveMode.WORLD -> WorldSavingThread(time_t, disk, outFile, ingame, hasThumbnail, isAuto, callback, errorHandler)
|
||||||
SaveMode.PLAYER -> PlayerSavingThread(time_t, disk, outFile, ingame, hasThumbnail, isAuto, callback, errorHandler)
|
SaveMode.PLAYER -> PlayerSavingThread(time_t, disk, outFile, ingame, hasThumbnail, isAuto, callback, errorHandler)
|
||||||
SaveMode.QUICK_PLAYER -> QuickSingleplayerWorldSavingThread(time_t, disk, outFile, ingame, hasThumbnail, isAuto, callback, errorHandler)
|
SaveMode.QUICK_WORLD -> QuickSingleplayerWorldSavingThread(time_t, disk, outFile, ingame, hasThumbnail, isAuto, callback, errorHandler)
|
||||||
else -> throw IllegalArgumentException("$mode")
|
else -> throw IllegalArgumentException("$mode")
|
||||||
}
|
}
|
||||||
|
|
||||||
operator fun invoke(time_t: Long, mode: SaveMode, disk: VirtualDisk, outFile: File, ingame: TerrarumIngame, isAuto: Boolean, errorHandler: (Throwable) -> Unit, callback: () -> Unit) {
|
operator fun invoke(time_t: Long, mode: SaveMode, disk: VirtualDisk, outFile: File, ingame: TerrarumIngame, isAuto: Boolean, errorHandler: (Throwable) -> Unit, callback: () -> Unit) {
|
||||||
savingStatus = 0
|
savingStatus = 0
|
||||||
val hasThumbnail = (mode == SaveMode.WORLD)
|
val hasThumbnail = (mode == SaveMode.WORLD || mode == SaveMode.QUICK_WORLD)
|
||||||
printdbg(this, "Save queued")
|
printdbg(this, "Save queued")
|
||||||
|
|
||||||
if (hasThumbnail) {
|
if (hasThumbnail) {
|
||||||
@@ -70,7 +70,7 @@ object WriteSavegame {
|
|||||||
savingThread.start()
|
savingThread.start()
|
||||||
|
|
||||||
// it is caller's job to keep the game paused or keep a "save in progress" ui up
|
// it is caller's job to keep the game paused or keep a "save in progress" ui up
|
||||||
// use field 'savingStatus' to know when the saving is done
|
// use callback to fire the after-the-saving-progress job
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -84,39 +84,9 @@ object WriteSavegame {
|
|||||||
savingThread.start()
|
savingThread.start()
|
||||||
|
|
||||||
// it is caller's job to keep the game paused or keep a "save in progress" ui up
|
// it is caller's job to keep the game paused or keep a "save in progress" ui up
|
||||||
// use field 'savingStatus' to know when the saving is done
|
// use callback to fire the after-the-saving-progress job
|
||||||
}
|
}
|
||||||
|
|
||||||
fun quick(time_t: Long, mode: SaveMode, disk: VirtualDisk, outFile: File, ingame: TerrarumIngame, isAuto: Boolean, callback: () -> Unit, errorHandler: (Throwable) -> Unit) {
|
|
||||||
if (ingame.isMultiplayer) TODO()
|
|
||||||
|
|
||||||
return // TODO //
|
|
||||||
|
|
||||||
savingStatus = 0
|
|
||||||
|
|
||||||
printdbg(this, "Quicksave queued")
|
|
||||||
|
|
||||||
IngameRenderer.screencapExportCallback = {
|
|
||||||
printdbg(this, "Generating thumbnail...")
|
|
||||||
|
|
||||||
val w = 960
|
|
||||||
val h = 640
|
|
||||||
val p = Pixmap.createFromFrameBuffer((it.width - w).ushr(1), (it.height - h).ushr(1), w, h)
|
|
||||||
IngameRenderer.fboRGBexport = p
|
|
||||||
//PixmapIO2._writeTGA(gzout, p, true, true)
|
|
||||||
//p.dispose()
|
|
||||||
IngameRenderer.fboRGBexportedLatch = true
|
|
||||||
|
|
||||||
printdbg(this, "Done thumbnail generation")
|
|
||||||
}
|
|
||||||
IngameRenderer.screencapRequested = true
|
|
||||||
|
|
||||||
val savingThread = Thread(getSaveThread(time_t, mode, disk, outFile, ingame, false, isAuto, errorHandler, callback), "TerrarumBasegameGameSaveThread")
|
|
||||||
savingThread.start()
|
|
||||||
|
|
||||||
// it is caller's job to keep the game paused or keep a "save in progress" ui up
|
|
||||||
// use field 'savingStatus' to know when the saving is done
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user