diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt index 1e10d7913..4872d8f66 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt @@ -291,6 +291,8 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) { // by doing this, whatever the "possession" the player had will be broken by the game load actorNowPlaying = getActorByID(Terrarum.PLAYER_REF_ID) as IngamePlayer + + makeSavegameBackupCopy() // don't put it on the postInit() or render(); postInitForNewGame calls this function on the savegamewriter's callback } private fun postInitForNewGame() { @@ -314,7 +316,7 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) { // make initial savefile WriteSavegame.immediate(savegameArchive, getSaveFileMain(), this) { - makeSavegameBackupCopy() + makeSavegameBackupCopy() // don't put it on the postInit() or render(); must be called using callback } } diff --git a/src/net/torvald/terrarum/modulebasegame/console/Save.kt b/src/net/torvald/terrarum/modulebasegame/console/Save.kt index 373b0c22d..4381a25c1 100644 --- a/src/net/torvald/terrarum/modulebasegame/console/Save.kt +++ b/src/net/torvald/terrarum/modulebasegame/console/Save.kt @@ -53,7 +53,7 @@ object Quicksave : ConsoleCommand { override fun execute(args: Array) { val ingame = Terrarum.ingame!! as TerrarumIngame - WriteSavegame.quick(ingame.savegameArchive, ingame.getSaveFileMain(), ingame) { + WriteSavegame.quick(ingame.savegameArchive, ingame.getSaveFileMain(), ingame, false) { } } diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UILoadDemoSavefiles.kt b/src/net/torvald/terrarum/modulebasegame/ui/UILoadDemoSavefiles.kt index 3fd11a151..547e46701 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UILoadDemoSavefiles.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UILoadDemoSavefiles.kt @@ -359,7 +359,8 @@ class UIItemDemoSaveCells( // file size App.fontSmallNumbers.draw(batch, "${disk.usedBytes.ushr(10)} KiB", x + 3f, y + height - 16f) // savegame name - App.fontGame.draw(batch, disk.getDiskNameString(Common.CHARSET), x + 3f, y + 1f) + val diskName = disk.getDiskNameString(Common.CHARSET) + App.fontGame.draw(batch, diskName + "${if (disk.saveMode % 2 == 1) "*" else ""}", x + 3f, y + 1f) super.render(batch, camera) batch.color = Color.WHITE diff --git a/src/net/torvald/terrarum/serialise/QuickSaveThread.kt b/src/net/torvald/terrarum/serialise/QuickSaveThread.kt index b2f9d06ed..207fd76d4 100644 --- a/src/net/torvald/terrarum/serialise/QuickSaveThread.kt +++ b/src/net/torvald/terrarum/serialise/QuickSaveThread.kt @@ -8,6 +8,7 @@ import net.torvald.terrarum.console.Echo import net.torvald.terrarum.modulebasegame.IngameRenderer import net.torvald.terrarum.modulebasegame.TerrarumIngame 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 @@ -15,7 +16,7 @@ import java.util.zip.GZIPOutputStream /** * Created by minjaesong on 2021-09-29. */ -class QuickSaveThread(val disk: VirtualDisk, val file: File, val ingame: TerrarumIngame, val hasThumbnail: Boolean, val callback: () -> Unit) : Runnable { +class QuickSaveThread(val disk: VirtualDisk, val file: File, val ingame: TerrarumIngame, val hasThumbnail: Boolean, val isAuto: Boolean, val callback: () -> Unit) : Runnable { /** * Will happily overwrite existing entry @@ -130,14 +131,14 @@ class QuickSaveThread(val disk: VirtualDisk, val file: File, val ingame: Terraru skimmer.rewriteDirectories() skimmer.injectDiskCRC(disk.hashCode()) - + skimmer.setSaveMode(1 + 2 * isAuto.toInt()) Echo ("${ccW}Game saved with size of $ccG${file.length()}$ccW bytes") if (hasThumbnail) IngameRenderer.fboRGBexportedLatch = false WriteSavegame.savingStatus = 255 - ingame.modifiedChunks.forEach { it.clear() } + ingame.clearModifiedChunks() callback() } diff --git a/src/net/torvald/terrarum/serialise/WriteSavegame.kt b/src/net/torvald/terrarum/serialise/WriteSavegame.kt index 9c2febd4f..d28cc7dbd 100644 --- a/src/net/torvald/terrarum/serialise/WriteSavegame.kt +++ b/src/net/torvald/terrarum/serialise/WriteSavegame.kt @@ -68,7 +68,7 @@ object WriteSavegame { // use field 'savingStatus' to know when the saving is done } - fun quick(disk: VirtualDisk, file: File, ingame: TerrarumIngame, callback: () -> Unit = {}) { + fun quick(disk: VirtualDisk, file: File, ingame: TerrarumIngame, isAuto: Boolean, callback: () -> Unit = {}) { savingStatus = 0 Echo("Quicksave queued") @@ -88,7 +88,7 @@ object WriteSavegame { } IngameRenderer.fboRGBexportRequested = true - val savingThread = Thread(QuickSaveThread(disk, file, ingame, true, callback), "TerrarumBasegameGameSaveThread") + val savingThread = Thread(QuickSaveThread(disk, file, ingame, true, isAuto, callback), "TerrarumBasegameGameSaveThread") savingThread.start() // it is caller's job to keep the game paused or keep a "save in progress" ui up diff --git a/src/net/torvald/terrarum/tvda/DiskSkimmer.kt b/src/net/torvald/terrarum/tvda/DiskSkimmer.kt index 52bfc6b5d..004f82e69 100644 --- a/src/net/torvald/terrarum/tvda/DiskSkimmer.kt +++ b/src/net/torvald/terrarum/tvda/DiskSkimmer.kt @@ -301,6 +301,11 @@ removefile: } } + fun setSaveMode(bits: Int) { + fa.seek(49L) + fa.writeByte(bits) + } + /////////////////////////////////////////////////////// // THESE ARE METHODS TO SUPPORT ON-LINE MODIFICATION // /////////////////////////////////////////////////////// diff --git a/src/net/torvald/terrarum/tvda/VirtualDisk.kt b/src/net/torvald/terrarum/tvda/VirtualDisk.kt index 653da89c2..3592c226a 100644 --- a/src/net/torvald/terrarum/tvda/VirtualDisk.kt +++ b/src/net/torvald/terrarum/tvda/VirtualDisk.kt @@ -64,7 +64,10 @@ Version 254 is a customised version of TEVD tailored to be used as a savegame fo Int8 0xFE Int8 Disk properties flag 1 0th bit: readonly - Int8[15] Extra info bytes + Int8 Save type + 0th bit: unset - full save; set - quick save + 1st bit: set - generated by autosave + Int8[14] Extra info bytes Unit8[236] Rest of the long disk name (268 bytes total) (Header size: 300 bytes) @@ -127,6 +130,9 @@ class VirtualDisk( var isReadOnly: Boolean set(value) { extraInfoBytes[0] = (extraInfoBytes[0] and 0xFE.toByte()) or value.toBit() } get() = capacity == 0L || (extraInfoBytes.size > 0 && extraInfoBytes[0].and(1) == 1.toByte()) + var saveMode: Int + set(value) { extraInfoBytes[1] = value.toByte() } + get() = extraInfoBytes[1].toUint() fun getDiskNameString(charset: Charset) = diskName.toCanonicalString(charset) val root: DiskEntry get() = entries[0]!!