save/load with fixed entry id

This commit is contained in:
minjaesong
2021-08-31 17:24:44 +09:00
parent 32144fc241
commit 3b37e91e4a
3 changed files with 28 additions and 13 deletions

View File

@@ -2,6 +2,7 @@ package net.torvald.terrarum.modulebasegame.console
import com.badlogic.gdx.utils.JsonValue import com.badlogic.gdx.utils.JsonValue
import net.torvald.terrarum.AppLoader import net.torvald.terrarum.AppLoader
import net.torvald.terrarum.AppLoader.printdbg
import net.torvald.terrarum.Terrarum import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.console.ConsoleCommand import net.torvald.terrarum.console.ConsoleCommand
import net.torvald.terrarum.console.Echo import net.torvald.terrarum.console.Echo
@@ -10,8 +11,10 @@ import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.DiskEntry
import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.EntryFile import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.EntryFile
import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.VDUtil import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.VDUtil
import net.torvald.terrarum.serialise.* import net.torvald.terrarum.serialise.*
import net.torvald.terrarum.utils.JsonFetcher
import java.io.File import java.io.File
import java.io.IOException import java.io.IOException
import java.nio.ByteBuffer
/** /**
* Created by minjaesong on 2021-08-30. * Created by minjaesong on 2021-08-30.
@@ -22,13 +25,16 @@ object Load : ConsoleCommand {
if (args.size == 2) { if (args.size == 2) {
try { try {
val charset = Common.CHARSET val charset = Common.CHARSET
val file = File(AppLoader.defaultDir + "Exports/${args[1]}") val file = File(AppLoader.defaultDir + "/Exports/${args[1]}")
val disk = VDUtil.readDiskArchive(file, charset = charset) val disk = VDUtil.readDiskArchive(file, charset = charset)
val metaFile = VDUtil.getFile(disk, VDUtil.VDPath("savegame", charset))!! val metaFile = disk.entries[-1]!!
val metaReader = ByteArray64Reader(metaFile.contents.serialize().array, charset) val metaReader = ByteArray64Reader(metaFile.contents.serialize().array, charset)
val meta = Common.jsoner.fromJson(JsonValue::class.java, metaReader) val meta = Common.jsoner.fromJson(JsonValue::class.java, metaReader)
JsonFetcher.forEach(meta) { key, value ->
println("$key\t$value")
}
} }
catch (e: IOException) { catch (e: IOException) {
Echo("Load: IOException raised.") Echo("Load: IOException raised.")

View File

@@ -10,10 +10,7 @@ import net.torvald.terrarum.console.Echo
import net.torvald.terrarum.gameactors.Actor import net.torvald.terrarum.gameactors.Actor
import net.torvald.terrarum.gameactors.BlockMarkerActor import net.torvald.terrarum.gameactors.BlockMarkerActor
import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.TerrarumIngame
import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.DiskEntry import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.*
import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.DiskEntryContent
import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.EntryFile
import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.VDUtil
import net.torvald.terrarum.serialise.Common import net.torvald.terrarum.serialise.Common
import net.torvald.terrarum.serialise.WriteActor import net.torvald.terrarum.serialise.WriteActor
import net.torvald.terrarum.serialise.WriteMeta import net.torvald.terrarum.serialise.WriteMeta
@@ -32,6 +29,12 @@ object Save : ConsoleCommand {
actor != (CommonResourcePool.get("blockmarking_actor") as BlockMarkerActor) actor != (CommonResourcePool.get("blockmarking_actor") as BlockMarkerActor)
} }
private fun addFile(disk: VirtualDisk, file: DiskEntry) {
VDUtil.getAsDirectory(disk, 0).add(file.entryID)
disk.entries[file.entryID] = file
file.parentEntryID = 0
}
override fun execute(args: Array<String>) { override fun execute(args: Array<String>) {
if (args.size == 2) { if (args.size == 2) {
try { try {
@@ -45,19 +48,19 @@ object Save : ConsoleCommand {
// NOTE: don't bother with the entryID of DiskEntries; it will be overwritten anyway // NOTE: don't bother with the entryID of DiskEntries; it will be overwritten anyway
val metaContent = EntryFile(WriteMeta(ingame).encodeToByteArray64()) val metaContent = EntryFile(WriteMeta(ingame).encodeToByteArray64())
val meta = DiskEntry(0, 0, "savegame".toByteArray(), creation_t, time_t, metaContent) val meta = DiskEntry(-1, 0, "savegame".toByteArray(), creation_t, time_t, metaContent)
VDUtil.addFile(disk, 0, meta) addFile(disk, meta)
val worldContent = EntryFile(WriteWorld(ingame).encodeToByteArray64()) val worldContent = EntryFile(WriteWorld(ingame).encodeToByteArray64())
val world = DiskEntry(0, 0, "world${ingame.world.worldIndex}".toByteArray(), creation_t, time_t, worldContent) val world = DiskEntry(ingame.world.worldIndex, 0, "world${ingame.world.worldIndex}".toByteArray(), creation_t, time_t, worldContent)
VDUtil.addFile(disk, 0, world) addFile(disk, world)
listOf(ingame.actorContainerActive, ingame.actorContainerInactive).forEach { actors -> listOf(ingame.actorContainerActive, ingame.actorContainerInactive).forEach { actors ->
actors.forEach { actors.forEach {
if (acceptable(it)) { if (acceptable(it)) {
val actorContent = EntryFile(WriteActor.encodeToByteArray64(it)) val actorContent = EntryFile(WriteActor.encodeToByteArray64(it))
val actor = DiskEntry(0, 0, "actor${it.referenceID}".toByteArray(), creation_t, time_t, actorContent) val actor = DiskEntry(it.referenceID, 0, "actor${it.referenceID}".toByteArray(), creation_t, time_t, actorContent)
VDUtil.addFile(disk, 0, actor) addFile(disk, actor)
} }
} }
} }

View File

@@ -1,6 +1,7 @@
package net.torvald.terrarum.modulebasegame.gameactors package net.torvald.terrarum.modulebasegame.gameactors
import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.SpriteBatch
import com.badlogic.gdx.graphics.g2d.TextureRegion
import net.torvald.terrarum.AppLoader.printdbg import net.torvald.terrarum.AppLoader.printdbg
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZEF import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZEF
@@ -20,7 +21,12 @@ import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
open class DroppedItem : ActorWithBody { open class DroppedItem : ActorWithBody {
private var itemID: ItemID = "" private var itemID: ItemID = ""
private val textureRegion = ItemCodex.getItemImage(itemID) set(value) {
field = value
textureRegion = ItemCodex.getItemImage(itemID)!!
}
@Transient private lateinit var textureRegion: TextureRegion
var itemCount = 1 var itemCount = 1