autosave notifier will say an error occured if autosaving fails

This commit is contained in:
minjaesong
2021-10-08 22:15:30 +09:00
parent aec6fea49e
commit a1402f98bd
4 changed files with 62 additions and 15 deletions

View File

@@ -48,9 +48,6 @@ import net.torvald.util.CircularArray
import org.khelekore.prtree.PRTree import org.khelekore.prtree.PRTree
import java.util.* import java.util.*
import java.util.concurrent.locks.ReentrantLock 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 // 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()
WriteSavegame.immediate(WriteSavegame.SaveMode.PLAYER, playerDisk, getPlayerSaveFiledesc(playerSavefileName), this, false, true) { try {
makeSavegameBackupCopy(getPlayerSaveFiledesc(playerSavefileName)) 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) { 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 makeSavegameBackupCopy(getWorldSaveFiledesc(worldSavefileName)) // don't put it on the postInit() or render(); must be called using callback
uiAutosaveNotifier.setAsClose() uiAutosaveNotifier.setAsClose()
}
} }
} }
catch (e: Throwable) {
e.printStackTrace()
uiAutosaveNotifier.setAsError()
}
} }
/** /**

View File

@@ -1,13 +1,16 @@
package net.torvald.terrarum.serialise package net.torvald.terrarum.serialise
import net.torvald.gdx.graphics.PixmapIO2 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.console.Echo
import net.torvald.terrarum.gameworld.PhysicalStatus import net.torvald.terrarum.gameworld.PhysicalStatus
import net.torvald.terrarum.modulebasegame.IngameRenderer import net.torvald.terrarum.modulebasegame.IngameRenderer
import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.TerrarumIngame
import net.torvald.terrarum.modulebasegame.gameactors.IngamePlayer import net.torvald.terrarum.modulebasegame.gameactors.IngamePlayer
import net.torvald.terrarum.realestate.LandUtil import net.torvald.terrarum.realestate.LandUtil
import net.torvald.terrarum.toInt
import net.torvald.terrarum.tvda.* import net.torvald.terrarum.tvda.*
import java.io.File import java.io.File
import java.util.zip.GZIPOutputStream import java.util.zip.GZIPOutputStream
@@ -164,7 +167,13 @@ class WorldSavingThread(val disk: VirtualDisk, val outFile: File, val ingame: Te
WriteSavegame.savingStatus = 255 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) WritePlayer(ingame.actorGamer, disk)
VDUtil.dumpToRealMachine(disk, outFile) VDUtil.dumpToRealMachine(disk, outFile)
callback() try {
callback()
}
catch (e: Throwable) {
e.printStackTrace()
ingame.uiAutosaveNotifier.setAsError()
}
} }
} }

View File

@@ -12,7 +12,10 @@ import net.torvald.terrarum.modulebasegame.TerrarumIngame
import net.torvald.terrarum.modulebasegame.gameactors.IngamePlayer import net.torvald.terrarum.modulebasegame.gameactors.IngamePlayer
import net.torvald.terrarum.realestate.LandUtil import net.torvald.terrarum.realestate.LandUtil
import net.torvald.terrarum.serialise.Common.getUnzipInputStream 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.File
import java.io.Reader import java.io.Reader

View File

@@ -27,12 +27,27 @@ class UIAutosaveNotifier : UICanvas() {
private var spinnerFrame = 0 private var spinnerFrame = 0
private val spinnerInterval = 1f / 60f 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) { override fun updateUI(delta: Float) {
spinnerTimer += delta spinnerTimer += delta
while (spinnerTimer > spinnerInterval) { while (spinnerTimer > spinnerInterval) {
spinnerFrame = (spinnerFrame + 1) % 32 spinnerFrame = (spinnerFrame + 1) % 32
spinnerTimer -= spinnerInterval spinnerTimer -= spinnerInterval
} }
if (errored) {
errorTimer += delta
if (errorTimer >= errorMax) {
this.setAsClose()
}
}
} }
override fun renderUI(batch: SpriteBatch, camera: Camera) { override fun renderUI(batch: SpriteBatch, camera: Camera) {
@@ -40,9 +55,20 @@ class UIAutosaveNotifier : UICanvas() {
val offX = (App.scr.tvSafeGraphicsWidth * 1.25f).roundToInt().toFloat() val offX = (App.scr.tvSafeGraphicsWidth * 1.25f).roundToInt().toFloat()
val offY = App.scr.tvSafeGraphicsHeight + 9f // +9 to align to quickslot and watch UI val offY = App.scr.tvSafeGraphicsHeight + 9f // +9 to align to quickslot and watch UI
batch.color = Color.WHITE val text = if (errored) Lang["ERROR_GENERIC_TEXT"] else Lang["MENU_IO_SAVING"]
batch.draw(spin, offX, offY) batch.color = if (errored) errorCol else normalCol
App.fontGame.draw(batch, Lang["MENU_IO_SAVING"], offX + 30f, offY) 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) { override fun doOpening(delta: Float) {