diff --git a/src/net/torvald/spriteanimation/HasAssembledSprite.kt b/src/net/torvald/spriteanimation/HasAssembledSprite.kt index 54cb76a06..11e4ffd88 100644 --- a/src/net/torvald/spriteanimation/HasAssembledSprite.kt +++ b/src/net/torvald/spriteanimation/HasAssembledSprite.kt @@ -27,11 +27,11 @@ interface HasAssembledSprite { * reassembleSprite(this.sprite, this.spriteGlow) * ``` */ - fun reassembleSprite(sprite: SpriteAnimation?, anim: ADProperties?, spriteGlow: SpriteAnimation? = null, animGlow: ADProperties? = null) { - if (anim != null && sprite != null) - _rebuild(anim, sprite) - if (animGlow != null && spriteGlow != null) - _rebuild(animGlow, spriteGlow) + fun reassembleSprite(sprite: SpriteAnimation?, spriteGlow: SpriteAnimation? = null) { + if (animDesc != null && sprite != null) + _rebuild(animDesc!!, sprite) + if (animDescGlow != null && spriteGlow != null) + _rebuild(animDescGlow!!, spriteGlow) } /*fun reassembleSprite(disk: SimpleFileSystem, sprite: SpriteAnimation?, anim: ADProperties?, spriteGlow: SpriteAnimation? = null, animGlow: ADProperties? = null) { diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt index 2cbf3b6b3..2e19ca4b1 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt @@ -345,12 +345,6 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) { } private fun postInitForNewGame() { - // go to spawn position - printdbg(this, "World Spawn position: (${world.spawnX}, ${world.spawnY})") - -// worldSavefileName = "$savegameNickname-${world.worldIndex}" -// playerSavefileName = (actorGamer.actorValue.getAsString(AVKey.NAME) ?: "Player") + "-${actorGamer.uuid}" - worldSavefileName = LoadSavegame.getWorldSavefileName(savegameNickname, world) playerSavefileName = LoadSavegame.getPlayerSavefileName(actorGamer) @@ -366,6 +360,8 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) { Common.CHARSET ) + // go to spawn position + printdbg(this, "World Spawn position: (${world.spawnX}, ${world.spawnY})") actorGamer.setPosition( world.spawnX * TILE_SIZED, world.spawnY * TILE_SIZED diff --git a/src/net/torvald/terrarum/modulebasegame/console/ExportMeta.kt b/src/net/torvald/terrarum/modulebasegame/console/ExportMeta.kt index 200ed17c1..ae1bb4e2c 100644 --- a/src/net/torvald/terrarum/modulebasegame/console/ExportMeta.kt +++ b/src/net/torvald/terrarum/modulebasegame/console/ExportMeta.kt @@ -1,16 +1,5 @@ package net.torvald.terrarum.modulebasegame.console -import net.torvald.terrarum.App -import net.torvald.terrarum.Terrarum -import net.torvald.terrarum.Terrarum.ingame -import net.torvald.terrarum.console.ConsoleCommand -import net.torvald.terrarum.console.Echo -import net.torvald.terrarum.modulebasegame.TerrarumIngame -import net.torvald.terrarum.modulebasegame.gameactors.IngamePlayer -import net.torvald.terrarum.serialise.WriteActor -import net.torvald.terrarum.serialise.WriteWorld -import java.io.IOException - /** * Created by minjaesong on 2017-07-18. */ @@ -34,7 +23,7 @@ import java.io.IOException } }*/ -object ExportWorld : ConsoleCommand { +/*object ExportWorld : ConsoleCommand { override fun execute(args: Array) { if (args.size == 2) { try { @@ -57,9 +46,9 @@ object ExportWorld : ConsoleCommand { override fun printUsage() { Echo("Usage: Exportworld filename-without-extension") } -} +}*/ -object ExportActor : ConsoleCommand { +/*object ExportActor : ConsoleCommand { override fun execute(args: Array) { if (args.size == 2) { try { @@ -89,4 +78,4 @@ object ExportActor : ConsoleCommand { Echo("Usage: exportactor (id) filename-without-extension") Echo("blank ID for player") } -} \ No newline at end of file +}*/ \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/IngamePlayer.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/IngamePlayer.kt index 5d42657bc..9fb7f4440 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/IngamePlayer.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/IngamePlayer.kt @@ -78,18 +78,18 @@ class IngamePlayer : ActorHumanoid { * reassembleSprite(this.sprite, this.spriteGlow) * ``` */ - fun reassembleSprite(sprite: SpriteAnimation?, anim: ADProperties?, spriteGlow: SpriteAnimation? = null, animGlow: ADProperties? = null) { - if (anim != null && sprite != null) - _rebuild(anim, sprite) - if (animGlow != null && spriteGlow != null) - _rebuild(animGlow, spriteGlow) + fun reassembleSprite(sprite: SpriteAnimation?, spriteGlow: SpriteAnimation? = null) { + if (animDesc != null && sprite != null) + _rebuild(animDesc!!, sprite) + if (animDescGlow != null && spriteGlow != null) + _rebuild(animDescGlow!!, spriteGlow) } - fun reassembleSprite(disk: SimpleFileSystem, sprite: SpriteAnimation?, anim: ADProperties?, spriteGlow: SpriteAnimation? = null, animGlow: ADProperties? = null) { - if (anim != null && sprite != null) - _rebuild(disk, anim, sprite) - if (animGlow != null && spriteGlow != null) - _rebuild(disk, animGlow, spriteGlow) + fun reassembleSprite(disk: SimpleFileSystem, sprite: SpriteAnimation?, spriteGlow: SpriteAnimation? = null) { + if (animDesc != null && sprite != null) + _rebuild(disk, animDesc!!, sprite) + if (animDescGlow != null && spriteGlow != null) + _rebuild(disk, animDescGlow!!, spriteGlow) } private fun _rebuild(ad: ADProperties, sprite: SpriteAnimation) { diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderTestSubject1.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderTestSubject1.kt index 2c9c0342f..992877e9f 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderTestSubject1.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderTestSubject1.kt @@ -2,9 +2,7 @@ package net.torvald.terrarum.modulebasegame.gameactors import net.torvald.spriteanimation.SpriteAnimation import net.torvald.terrarum.ModMgr -import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.gameactors.AVKey -import net.torvald.terrarum.worlddrawer.CreateTileAtlas /** * Created by minjaesong on 2017-02-10. @@ -31,7 +29,7 @@ object PlayerBuilderTestSubject1 { p.sprite = SpriteAnimation(p) p.spriteGlow = SpriteAnimation(p) - p.reassembleSprite(p.sprite, p.animDesc, p.spriteGlow, p.animDescGlow) + p.reassembleSprite(p.sprite, p.spriteGlow) p.setHitboxDimension(15, p.actorValue.getAsInt(AVKey.BASEHEIGHT) ?: ActorHumanoid.BASE_HEIGHT, 21, 0) // ingame must teleport the player to the spawn point diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderWerebeastTest.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderWerebeastTest.kt index 175296a28..0ccb1ee1d 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderWerebeastTest.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderWerebeastTest.kt @@ -4,7 +4,6 @@ import net.torvald.spriteanimation.SpriteAnimation import net.torvald.terrarum.ModMgr import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.gameactors.AVKey -import net.torvald.terrarum.worlddrawer.CreateTileAtlas /** * Created by minjaesong on 2021-07-07. @@ -31,7 +30,7 @@ object PlayerBuilderWerebeastTest { p.sprite = SpriteAnimation(p) p.spriteGlow = SpriteAnimation(p) - p.reassembleSprite(p.sprite, p.animDesc, p.spriteGlow, p.animDescGlow) + p.reassembleSprite(p.sprite, p.spriteGlow) p.setHitboxDimension(22, p.actorValue.getAsInt(AVKey.BASEHEIGHT)!!, 30, 0) p.setPosition(3.0 * TILE_SIZE, 3.0 * TILE_SIZE) diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UILoadDemoSavefiles.kt b/src/net/torvald/terrarum/modulebasegame/ui/UILoadDemoSavefiles.kt index 0e5d2d8d3..5edd9eafc 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UILoadDemoSavefiles.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UILoadDemoSavefiles.kt @@ -459,13 +459,13 @@ class UIItemPlayerCells( skimmer.getFile(-1L)?.bytes?.let { val animFile = skimmer.getFile(-2L)!! val p = ReadPlayer(skimmer, ByteArray64Reader(it, Common.CHARSET)) - val sprite = SpriteAnimation(p) - val animDesc = ADProperties(ByteArray64Reader(animFile.bytes, Common.CHARSET)) - p.reassembleSprite(skimmer, sprite, animDesc) - sprite.textureRegion.get(0,0).let { + p.sprite = SpriteAnimation(p) + p.animDesc = ADProperties(ByteArray64Reader(animFile.bytes, Common.CHARSET)) + p.reassembleSprite(skimmer, p.sprite) + p.sprite!!.textureRegion.get(0,0).let { thumb = it } - this.sprite = sprite + this.sprite = p.sprite } hasTexture = true diff --git a/src/net/torvald/terrarum/serialise/GameSavingThread.kt b/src/net/torvald/terrarum/serialise/GameSavingThread.kt index 84bfca070..83991a488 100644 --- a/src/net/torvald/terrarum/serialise/GameSavingThread.kt +++ b/src/net/torvald/terrarum/serialise/GameSavingThread.kt @@ -10,7 +10,6 @@ import net.torvald.terrarum.modulebasegame.gameactors.IngamePlayer import net.torvald.terrarum.realestate.LandUtil import net.torvald.terrarum.toInt import net.torvald.terrarum.tvda.* -import net.torvald.terrarum.utils.PlayerLastStatus import java.io.File import java.util.zip.GZIPOutputStream @@ -94,11 +93,8 @@ class WorldSavingThread( WriteSavegame.saveProgress += 1f // Write World // - // record all player's last position - playersList.forEach { - ingame.world.playersLastStatus[it.uuid] = PlayerLastStatus(it, ingame.isMultiplayer) - } - val worldMeta = EntryFile(WriteWorld.encodeToByteArray64(ingame, time_t)) + + val worldMeta = EntryFile(WriteWorld.encodeToByteArray64(ingame, time_t, actorsList, playersList)) val world = DiskEntry(-1L, 0, creation_t, time_t, worldMeta) addFile(disk, world) diff --git a/src/net/torvald/terrarum/serialise/QuickSaveThread.kt b/src/net/torvald/terrarum/serialise/QuickSaveThread.kt index 40bded0a9..49f650efb 100644 --- a/src/net/torvald/terrarum/serialise/QuickSaveThread.kt +++ b/src/net/torvald/terrarum/serialise/QuickSaveThread.kt @@ -90,7 +90,7 @@ class QuickSingleplayerWorldSavingThread( playersList.forEach { ingame.world.playersLastStatus[it.uuid] = PlayerLastStatus(it, ingame.isMultiplayer) } - val worldMeta = EntryFile(WriteWorld.encodeToByteArray64(ingame, time_t)) + val worldMeta = EntryFile(WriteWorld.encodeToByteArray64(ingame, time_t, actorsList, playersList)) val world = DiskEntry(-1L, 0, creation_t, time_t, worldMeta) addFile(disk, world); skimmer.appendEntryOnly(world) diff --git a/src/net/torvald/terrarum/serialise/WriteActor.kt b/src/net/torvald/terrarum/serialise/WriteActor.kt index f00aebe7d..04603eb38 100644 --- a/src/net/torvald/terrarum/serialise/WriteActor.kt +++ b/src/net/torvald/terrarum/serialise/WriteActor.kt @@ -65,13 +65,11 @@ object WritePlayer { player.totalPlayTime += time_t - ingame.loadedTime_t - // restore player prop backup created on load-time - if (ingame.world.playersLastStatus[player.uuid] != null) { + // restore player prop backup created on load-time for multiplayer + if (ingame.isMultiplayer) { player.setPosition(player.unauthorisedPlayerProps.physics.position) - if (ingame.isMultiplayer) { - player.actorValue = player.unauthorisedPlayerProps.actorValue!! - player.inventory = player.unauthorisedPlayerProps.inventory!! - } + player.actorValue = player.unauthorisedPlayerProps.actorValue!! + player.inventory = player.unauthorisedPlayerProps.inventory!! } @@ -141,29 +139,22 @@ object ReadActor { val bodypartsFile = disk.getFile(-1025) actor.sprite = SpriteAnimation(actor) - if (animFileGlow != null) actor.spriteGlow = SpriteAnimation(actor) + actor.animDesc = ADProperties(ByteArray64Reader(animFile!!.bytes, Common.CHARSET)) + if (animFileGlow != null) { + actor.spriteGlow = SpriteAnimation(actor) + actor.animDescGlow = ADProperties(ByteArray64Reader(animFileGlow.bytes, Common.CHARSET)) + } if (bodypartsFile != null) - actor.reassembleSprite( - disk, - actor.sprite!!, - ADProperties(ByteArray64Reader(animFile!!.bytes, Common.CHARSET)), - actor.spriteGlow, - if (animFileGlow == null) null else ADProperties(ByteArray64Reader(animFileGlow.bytes, Common.CHARSET)) - ) + actor.reassembleSprite(disk, actor.sprite!!, actor.spriteGlow) else - actor.reassembleSprite( - actor.sprite!!, - ADProperties(ByteArray64Reader(animFile!!.bytes, Common.CHARSET)), - actor.spriteGlow, - if (animFileGlow == null) null else ADProperties(ByteArray64Reader(animFileGlow.bytes, Common.CHARSET)) - ) + actor.reassembleSprite(actor.sprite!!, actor.spriteGlow) } else if (actor is ActorWithBody && actor is HasAssembledSprite) { if (actor.animDesc != null) actor.sprite = SpriteAnimation(actor) if (actor.animDescGlow != null) actor.spriteGlow = SpriteAnimation(actor) - actor.reassembleSprite(actor.sprite, actor.animDesc, actor.spriteGlow, actor.animDescGlow) + actor.reassembleSprite(actor.sprite, actor.spriteGlow) } diff --git a/src/net/torvald/terrarum/serialise/WriteSavegame.kt b/src/net/torvald/terrarum/serialise/WriteSavegame.kt index 6ca35c42a..05106ab53 100644 --- a/src/net/torvald/terrarum/serialise/WriteSavegame.kt +++ b/src/net/torvald/terrarum/serialise/WriteSavegame.kt @@ -41,25 +41,27 @@ object WriteSavegame { operator fun invoke(time_t: Long, mode: SaveMode, disk: VirtualDisk, outFile: File, ingame: TerrarumIngame, isAuto: Boolean, errorHandler: (Throwable) -> Unit, callback: () -> Unit) { savingStatus = 0 - + val hasThumbnail = (mode == SaveMode.WORLD) Echo("Save queued") - IngameRenderer.screencapExportCallback = { - Echo("Generating thumbnail...") + if (hasThumbnail) { + IngameRenderer.screencapExportCallback = { + Echo("Generating thumbnail...") - val w = 960 - val h = 640 - val p = Pixmap.createFromFrameBuffer((it.width - w).ushr(1), (it.height - h).ushr(1), w, h) - IngameRenderer.fboRGBexport = p - //PixmapIO2._writeTGA(gzout, p, true, true) - //p.dispose() - IngameRenderer.fboRGBexportedLatch = true + val w = 960 + val h = 640 + val p = Pixmap.createFromFrameBuffer((it.width - w).ushr(1), (it.height - h).ushr(1), w, h) + IngameRenderer.fboRGBexport = p + //PixmapIO2._writeTGA(gzout, p, true, true) + //p.dispose() + IngameRenderer.fboRGBexportedLatch = true - Echo("Done thumbnail generation") + Echo("Done thumbnail generation") + } + IngameRenderer.screencapRequested = true } - IngameRenderer.screencapRequested = true - val savingThread = Thread(getSaveThread(time_t, mode, disk, outFile, ingame, true, isAuto, errorHandler, callback), "TerrarumBasegameGameSaveThread") + val savingThread = Thread(getSaveThread(time_t, mode, disk, outFile, ingame, hasThumbnail, isAuto, errorHandler, 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/serialise/WriteWorld.kt b/src/net/torvald/terrarum/serialise/WriteWorld.kt index 04013d214..dab91bc26 100644 --- a/src/net/torvald/terrarum/serialise/WriteWorld.kt +++ b/src/net/torvald/terrarum/serialise/WriteWorld.kt @@ -3,7 +3,6 @@ package net.torvald.terrarum.serialise import net.torvald.terrarum.CommonResourcePool import net.torvald.terrarum.ReferencingRanges import net.torvald.terrarum.gameactors.Actor -import net.torvald.terrarum.gameactors.ActorID import net.torvald.terrarum.gameactors.BlockMarkerActor import net.torvald.terrarum.gameworld.BlockLayer import net.torvald.terrarum.gameworld.GameWorld @@ -14,6 +13,7 @@ import net.torvald.terrarum.modulebasegame.worldgenerator.RoguelikeRandomiser import net.torvald.terrarum.realestate.LandUtil import net.torvald.terrarum.tvda.ByteArray64 import net.torvald.terrarum.tvda.ByteArray64Writer +import net.torvald.terrarum.utils.PlayerLastStatus import net.torvald.terrarum.weather.WeatherMixer import java.io.Reader @@ -29,7 +29,7 @@ object WriteWorld { actor !is IngamePlayer // IngamePlayers must not be saved with the world } - private fun preWrite(ingame: TerrarumIngame, time_t: Long): GameWorld { + private fun preWrite(ingame: TerrarumIngame, time_t: Long, actorsList: List, playersList: List): GameWorld { val world = ingame.world val currentPlayTime_t = time_t - ingame.loadedTime_t @@ -38,29 +38,30 @@ object WriteWorld { world.lastPlayTime = time_t world.totalPlayTime += currentPlayTime_t - val actorIDbuf = ArrayList() - ingame.actorContainerActive.cloneToList().filter { actorAcceptable(it) }.forEach { actorIDbuf.add(it.referenceID) } - ingame.actorContainerInactive.cloneToList().filter { actorAcceptable(it) }.forEach { actorIDbuf.add(it.referenceID) } - world.actors.clear() - world.actors.addAll(actorIDbuf.sorted().distinct()) + world.actors.addAll(actorsList.map { it.referenceID }.sorted().distinct()) world.randSeeds[0] = RoguelikeRandomiser.RNG.state0 world.randSeeds[1] = RoguelikeRandomiser.RNG.state1 world.randSeeds[2] = WeatherMixer.RNG.state0 world.randSeeds[3] = WeatherMixer.RNG.state1 + // record all player's last position + playersList.forEach { + world.playersLastStatus.put(it.uuid.toString(), PlayerLastStatus(it, ingame.isMultiplayer)) + } + return world } - operator fun invoke(ingame: TerrarumIngame, time_t: Long): String { - return Common.jsoner.toJson(preWrite(ingame, time_t)) + operator fun invoke(ingame: TerrarumIngame, time_t: Long, actorsList: List, playersList: List): String { + return Common.jsoner.toJson(preWrite(ingame, time_t, actorsList, playersList)) } - fun encodeToByteArray64(ingame: TerrarumIngame, time_t: Long): ByteArray64 { + fun encodeToByteArray64(ingame: TerrarumIngame, time_t: Long, actorsList: List, playersList: List): ByteArray64 { val baw = ByteArray64Writer(Common.CHARSET) - Common.jsoner.toJson(preWrite(ingame, time_t), baw) + Common.jsoner.toJson(preWrite(ingame, time_t, actorsList, playersList), baw) baw.flush(); baw.close() return baw.toByteArray64()