mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-13 03:54:06 +09:00
autosave notifier will say an error occured if autosaving fails
This commit is contained in:
@@ -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()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user