From a1402f98bddfc350baab64094a8b42ad1045e070 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Fri, 8 Oct 2021 22:15:30 +0900 Subject: [PATCH] autosave notifier will say an error occured if autosaving fails --- .../terrarum/modulebasegame/TerrarumIngame.kt | 19 ++++++----- .../terrarum/serialise/GameSavingThread.kt | 21 ++++++++++-- .../terrarum/serialise/WriteSavegame.kt | 5 ++- .../torvald/terrarum/ui/UIAutosaveNotifier.kt | 32 +++++++++++++++++-- 4 files changed, 62 insertions(+), 15 deletions(-) diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt index c0fd304e0..495f00100 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt @@ -48,9 +48,6 @@ import net.torvald.util.CircularArray import org.khelekore.prtree.PRTree import java.util.* import java.util.concurrent.locks.ReentrantLock -import kotlin.collections.ArrayList -import kotlin.collections.HashMap -import kotlin.collections.HashSet /** @@ -335,14 +332,20 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) { // 1. lighten the IO burden // 2. cannot sync up the "counter" to determine whether both are finished uiAutosaveNotifier.setAsOpen() - WriteSavegame.immediate(WriteSavegame.SaveMode.PLAYER, playerDisk, getPlayerSaveFiledesc(playerSavefileName), this, false, true) { - makeSavegameBackupCopy(getPlayerSaveFiledesc(playerSavefileName)) + try { + WriteSavegame.immediate(WriteSavegame.SaveMode.PLAYER, playerDisk, getPlayerSaveFiledesc(playerSavefileName), this, false, true) { + makeSavegameBackupCopy(getPlayerSaveFiledesc(playerSavefileName)) - WriteSavegame.immediate(WriteSavegame.SaveMode.WORLD, worldDisk, getWorldSaveFiledesc(worldSavefileName), this, false, true) { - makeSavegameBackupCopy(getWorldSaveFiledesc(worldSavefileName)) // don't put it on the postInit() or render(); must be called using callback - uiAutosaveNotifier.setAsClose() + WriteSavegame.immediate(WriteSavegame.SaveMode.WORLD, worldDisk, getWorldSaveFiledesc(worldSavefileName), this, false, true) { + makeSavegameBackupCopy(getWorldSaveFiledesc(worldSavefileName)) // don't put it on the postInit() or render(); must be called using callback + uiAutosaveNotifier.setAsClose() + } } } + catch (e: Throwable) { + e.printStackTrace() + uiAutosaveNotifier.setAsError() + } } /** diff --git a/src/net/torvald/terrarum/serialise/GameSavingThread.kt b/src/net/torvald/terrarum/serialise/GameSavingThread.kt index 416776412..288916ba2 100644 --- a/src/net/torvald/terrarum/serialise/GameSavingThread.kt +++ b/src/net/torvald/terrarum/serialise/GameSavingThread.kt @@ -1,13 +1,16 @@ package net.torvald.terrarum.serialise import net.torvald.gdx.graphics.PixmapIO2 -import net.torvald.terrarum.* +import net.torvald.terrarum.App +import net.torvald.terrarum.ccG +import net.torvald.terrarum.ccW import net.torvald.terrarum.console.Echo import net.torvald.terrarum.gameworld.PhysicalStatus import net.torvald.terrarum.modulebasegame.IngameRenderer import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.gameactors.IngamePlayer import net.torvald.terrarum.realestate.LandUtil +import net.torvald.terrarum.toInt import net.torvald.terrarum.tvda.* import java.io.File import java.util.zip.GZIPOutputStream @@ -164,7 +167,13 @@ class WorldSavingThread(val disk: VirtualDisk, val outFile: File, val ingame: Te WriteSavegame.savingStatus = 255 - callback() + try { + callback() + } + catch (e: Throwable) { + e.printStackTrace() + ingame.uiAutosaveNotifier.setAsError() + } } } @@ -183,6 +192,12 @@ class PlayerSavingThread(val disk: VirtualDisk, val outFile: File, val ingame: T WritePlayer(ingame.actorGamer, disk) VDUtil.dumpToRealMachine(disk, outFile) - callback() + try { + callback() + } + catch (e: Throwable) { + e.printStackTrace() + ingame.uiAutosaveNotifier.setAsError() + } } } diff --git a/src/net/torvald/terrarum/serialise/WriteSavegame.kt b/src/net/torvald/terrarum/serialise/WriteSavegame.kt index 2784d945e..4a61bbdea 100644 --- a/src/net/torvald/terrarum/serialise/WriteSavegame.kt +++ b/src/net/torvald/terrarum/serialise/WriteSavegame.kt @@ -12,7 +12,10 @@ import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.gameactors.IngamePlayer import net.torvald.terrarum.realestate.LandUtil import net.torvald.terrarum.serialise.Common.getUnzipInputStream -import net.torvald.terrarum.tvda.* +import net.torvald.terrarum.tvda.ByteArray64 +import net.torvald.terrarum.tvda.ByteArray64Reader +import net.torvald.terrarum.tvda.VDUtil +import net.torvald.terrarum.tvda.VirtualDisk import java.io.File import java.io.Reader diff --git a/src/net/torvald/terrarum/ui/UIAutosaveNotifier.kt b/src/net/torvald/terrarum/ui/UIAutosaveNotifier.kt index 507c54daf..2908a3029 100644 --- a/src/net/torvald/terrarum/ui/UIAutosaveNotifier.kt +++ b/src/net/torvald/terrarum/ui/UIAutosaveNotifier.kt @@ -27,12 +27,27 @@ class UIAutosaveNotifier : UICanvas() { private var spinnerFrame = 0 private val spinnerInterval = 1f / 60f + private var errorTimer = 0f + private var errorMax = App.getConfigInt("notificationshowuptime") / 1000f + private var errored = false + + private var normalCol = Color.WHITE + private var errorCol = Color(0xFF8888FF.toInt()) + override fun updateUI(delta: Float) { spinnerTimer += delta while (spinnerTimer > spinnerInterval) { spinnerFrame = (spinnerFrame + 1) % 32 spinnerTimer -= spinnerInterval } + + if (errored) { + errorTimer += delta + + if (errorTimer >= errorMax) { + this.setAsClose() + } + } } override fun renderUI(batch: SpriteBatch, camera: Camera) { @@ -40,9 +55,20 @@ class UIAutosaveNotifier : UICanvas() { val offX = (App.scr.tvSafeGraphicsWidth * 1.25f).roundToInt().toFloat() val offY = App.scr.tvSafeGraphicsHeight + 9f // +9 to align to quickslot and watch UI - batch.color = Color.WHITE - batch.draw(spin, offX, offY) - App.fontGame.draw(batch, Lang["MENU_IO_SAVING"], offX + 30f, offY) + val text = if (errored) Lang["ERROR_GENERIC_TEXT"] else Lang["MENU_IO_SAVING"] + batch.color = if (errored) errorCol else normalCol + if (!errored) batch.draw(spin, offX, offY)// else RED_X_SYMBOL + App.fontGame.draw(batch, text, offX + 30f, offY) + } + + fun setAsError() { + println("ugh, diddums") + errored = true + } + + override fun setAsOpen() { + errored = false + super.setAsOpen() } override fun doOpening(delta: Float) {