saved players position is now restored but offsetted to the right for some reason

This commit is contained in:
minjaesong
2021-10-13 22:23:28 +09:00
parent 03a854ca58
commit 3c2564ca64
12 changed files with 70 additions and 98 deletions

View File

@@ -27,11 +27,11 @@ interface HasAssembledSprite {
* reassembleSprite(this.sprite, this.spriteGlow) * reassembleSprite(this.sprite, this.spriteGlow)
* ``` * ```
*/ */
fun reassembleSprite(sprite: SpriteAnimation?, anim: ADProperties?, spriteGlow: SpriteAnimation? = null, animGlow: ADProperties? = null) { fun reassembleSprite(sprite: SpriteAnimation?, spriteGlow: SpriteAnimation? = null) {
if (anim != null && sprite != null) if (animDesc != null && sprite != null)
_rebuild(anim, sprite) _rebuild(animDesc!!, sprite)
if (animGlow != null && spriteGlow != null) if (animDescGlow != null && spriteGlow != null)
_rebuild(animGlow, spriteGlow) _rebuild(animDescGlow!!, spriteGlow)
} }
/*fun reassembleSprite(disk: SimpleFileSystem, sprite: SpriteAnimation?, anim: ADProperties?, spriteGlow: SpriteAnimation? = null, animGlow: ADProperties? = null) { /*fun reassembleSprite(disk: SimpleFileSystem, sprite: SpriteAnimation?, anim: ADProperties?, spriteGlow: SpriteAnimation? = null, animGlow: ADProperties? = null) {

View File

@@ -345,12 +345,6 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) {
} }
private fun postInitForNewGame() { 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) worldSavefileName = LoadSavegame.getWorldSavefileName(savegameNickname, world)
playerSavefileName = LoadSavegame.getPlayerSavefileName(actorGamer) playerSavefileName = LoadSavegame.getPlayerSavefileName(actorGamer)
@@ -366,6 +360,8 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) {
Common.CHARSET Common.CHARSET
) )
// go to spawn position
printdbg(this, "World Spawn position: (${world.spawnX}, ${world.spawnY})")
actorGamer.setPosition( actorGamer.setPosition(
world.spawnX * TILE_SIZED, world.spawnX * TILE_SIZED,
world.spawnY * TILE_SIZED world.spawnY * TILE_SIZED

View File

@@ -1,16 +1,5 @@
package net.torvald.terrarum.modulebasegame.console 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. * 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<String>) { override fun execute(args: Array<String>) {
if (args.size == 2) { if (args.size == 2) {
try { try {
@@ -57,9 +46,9 @@ object ExportWorld : ConsoleCommand {
override fun printUsage() { override fun printUsage() {
Echo("Usage: Exportworld filename-without-extension") Echo("Usage: Exportworld filename-without-extension")
} }
} }*/
object ExportActor : ConsoleCommand { /*object ExportActor : ConsoleCommand {
override fun execute(args: Array<String>) { override fun execute(args: Array<String>) {
if (args.size == 2) { if (args.size == 2) {
try { try {
@@ -89,4 +78,4 @@ object ExportActor : ConsoleCommand {
Echo("Usage: exportactor (id) filename-without-extension") Echo("Usage: exportactor (id) filename-without-extension")
Echo("blank ID for player") Echo("blank ID for player")
} }
} }*/

View File

@@ -78,18 +78,18 @@ class IngamePlayer : ActorHumanoid {
* reassembleSprite(this.sprite, this.spriteGlow) * reassembleSprite(this.sprite, this.spriteGlow)
* ``` * ```
*/ */
fun reassembleSprite(sprite: SpriteAnimation?, anim: ADProperties?, spriteGlow: SpriteAnimation? = null, animGlow: ADProperties? = null) { fun reassembleSprite(sprite: SpriteAnimation?, spriteGlow: SpriteAnimation? = null) {
if (anim != null && sprite != null) if (animDesc != null && sprite != null)
_rebuild(anim, sprite) _rebuild(animDesc!!, sprite)
if (animGlow != null && spriteGlow != null) if (animDescGlow != null && spriteGlow != null)
_rebuild(animGlow, spriteGlow) _rebuild(animDescGlow!!, spriteGlow)
} }
fun reassembleSprite(disk: SimpleFileSystem, sprite: SpriteAnimation?, anim: ADProperties?, spriteGlow: SpriteAnimation? = null, animGlow: ADProperties? = null) { fun reassembleSprite(disk: SimpleFileSystem, sprite: SpriteAnimation?, spriteGlow: SpriteAnimation? = null) {
if (anim != null && sprite != null) if (animDesc != null && sprite != null)
_rebuild(disk, anim, sprite) _rebuild(disk, animDesc!!, sprite)
if (animGlow != null && spriteGlow != null) if (animDescGlow != null && spriteGlow != null)
_rebuild(disk, animGlow, spriteGlow) _rebuild(disk, animDescGlow!!, spriteGlow)
} }
private fun _rebuild(ad: ADProperties, sprite: SpriteAnimation) { private fun _rebuild(ad: ADProperties, sprite: SpriteAnimation) {

View File

@@ -2,9 +2,7 @@ package net.torvald.terrarum.modulebasegame.gameactors
import net.torvald.spriteanimation.SpriteAnimation import net.torvald.spriteanimation.SpriteAnimation
import net.torvald.terrarum.ModMgr import net.torvald.terrarum.ModMgr
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE
import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.AVKey
import net.torvald.terrarum.worlddrawer.CreateTileAtlas
/** /**
* Created by minjaesong on 2017-02-10. * Created by minjaesong on 2017-02-10.
@@ -31,7 +29,7 @@ object PlayerBuilderTestSubject1 {
p.sprite = SpriteAnimation(p) p.sprite = SpriteAnimation(p)
p.spriteGlow = 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) p.setHitboxDimension(15, p.actorValue.getAsInt(AVKey.BASEHEIGHT) ?: ActorHumanoid.BASE_HEIGHT, 21, 0)
// ingame must teleport the player to the spawn point // ingame must teleport the player to the spawn point

View File

@@ -4,7 +4,6 @@ import net.torvald.spriteanimation.SpriteAnimation
import net.torvald.terrarum.ModMgr import net.torvald.terrarum.ModMgr
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE
import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.AVKey
import net.torvald.terrarum.worlddrawer.CreateTileAtlas
/** /**
* Created by minjaesong on 2021-07-07. * Created by minjaesong on 2021-07-07.
@@ -31,7 +30,7 @@ object PlayerBuilderWerebeastTest {
p.sprite = SpriteAnimation(p) p.sprite = SpriteAnimation(p)
p.spriteGlow = 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.setHitboxDimension(22, p.actorValue.getAsInt(AVKey.BASEHEIGHT)!!, 30, 0)
p.setPosition(3.0 * TILE_SIZE, 3.0 * TILE_SIZE) p.setPosition(3.0 * TILE_SIZE, 3.0 * TILE_SIZE)

View File

@@ -459,13 +459,13 @@ class UIItemPlayerCells(
skimmer.getFile(-1L)?.bytes?.let { skimmer.getFile(-1L)?.bytes?.let {
val animFile = skimmer.getFile(-2L)!! val animFile = skimmer.getFile(-2L)!!
val p = ReadPlayer(skimmer, ByteArray64Reader(it, Common.CHARSET)) val p = ReadPlayer(skimmer, ByteArray64Reader(it, Common.CHARSET))
val sprite = SpriteAnimation(p) p.sprite = SpriteAnimation(p)
val animDesc = ADProperties(ByteArray64Reader(animFile.bytes, Common.CHARSET)) p.animDesc = ADProperties(ByteArray64Reader(animFile.bytes, Common.CHARSET))
p.reassembleSprite(skimmer, sprite, animDesc) p.reassembleSprite(skimmer, p.sprite)
sprite.textureRegion.get(0,0).let { p.sprite!!.textureRegion.get(0,0).let {
thumb = it thumb = it
} }
this.sprite = sprite this.sprite = p.sprite
} }
hasTexture = true hasTexture = true

View File

@@ -10,7 +10,6 @@ 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.toInt
import net.torvald.terrarum.tvda.* import net.torvald.terrarum.tvda.*
import net.torvald.terrarum.utils.PlayerLastStatus
import java.io.File import java.io.File
import java.util.zip.GZIPOutputStream import java.util.zip.GZIPOutputStream
@@ -94,11 +93,8 @@ class WorldSavingThread(
WriteSavegame.saveProgress += 1f WriteSavegame.saveProgress += 1f
// Write World // // Write World //
// record all player's last position
playersList.forEach { val worldMeta = EntryFile(WriteWorld.encodeToByteArray64(ingame, time_t, actorsList, playersList))
ingame.world.playersLastStatus[it.uuid] = PlayerLastStatus(it, ingame.isMultiplayer)
}
val worldMeta = EntryFile(WriteWorld.encodeToByteArray64(ingame, time_t))
val world = DiskEntry(-1L, 0, creation_t, time_t, worldMeta) val world = DiskEntry(-1L, 0, creation_t, time_t, worldMeta)
addFile(disk, world) addFile(disk, world)

View File

@@ -90,7 +90,7 @@ class QuickSingleplayerWorldSavingThread(
playersList.forEach { playersList.forEach {
ingame.world.playersLastStatus[it.uuid] = PlayerLastStatus(it, ingame.isMultiplayer) 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) val world = DiskEntry(-1L, 0, creation_t, time_t, worldMeta)
addFile(disk, world); skimmer.appendEntryOnly(world) addFile(disk, world); skimmer.appendEntryOnly(world)

View File

@@ -65,13 +65,11 @@ object WritePlayer {
player.totalPlayTime += time_t - ingame.loadedTime_t player.totalPlayTime += time_t - ingame.loadedTime_t
// restore player prop backup created on load-time // restore player prop backup created on load-time for multiplayer
if (ingame.world.playersLastStatus[player.uuid] != null) { if (ingame.isMultiplayer) {
player.setPosition(player.unauthorisedPlayerProps.physics.position) player.setPosition(player.unauthorisedPlayerProps.physics.position)
if (ingame.isMultiplayer) { player.actorValue = player.unauthorisedPlayerProps.actorValue!!
player.actorValue = player.unauthorisedPlayerProps.actorValue!! player.inventory = player.unauthorisedPlayerProps.inventory!!
player.inventory = player.unauthorisedPlayerProps.inventory!!
}
} }
@@ -141,29 +139,22 @@ object ReadActor {
val bodypartsFile = disk.getFile(-1025) val bodypartsFile = disk.getFile(-1025)
actor.sprite = SpriteAnimation(actor) 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) if (bodypartsFile != null)
actor.reassembleSprite( actor.reassembleSprite(disk, actor.sprite!!, actor.spriteGlow)
disk,
actor.sprite!!,
ADProperties(ByteArray64Reader(animFile!!.bytes, Common.CHARSET)),
actor.spriteGlow,
if (animFileGlow == null) null else ADProperties(ByteArray64Reader(animFileGlow.bytes, Common.CHARSET))
)
else else
actor.reassembleSprite( actor.reassembleSprite(actor.sprite!!, actor.spriteGlow)
actor.sprite!!,
ADProperties(ByteArray64Reader(animFile!!.bytes, Common.CHARSET)),
actor.spriteGlow,
if (animFileGlow == null) null else ADProperties(ByteArray64Reader(animFileGlow.bytes, Common.CHARSET))
)
} }
else if (actor is ActorWithBody && actor is HasAssembledSprite) { else if (actor is ActorWithBody && actor is HasAssembledSprite) {
if (actor.animDesc != null) actor.sprite = SpriteAnimation(actor) if (actor.animDesc != null) actor.sprite = SpriteAnimation(actor)
if (actor.animDescGlow != null) actor.spriteGlow = 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)
} }

View File

@@ -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) { operator fun invoke(time_t: Long, mode: SaveMode, disk: VirtualDisk, outFile: File, ingame: TerrarumIngame, isAuto: Boolean, errorHandler: (Throwable) -> Unit, callback: () -> Unit) {
savingStatus = 0 savingStatus = 0
val hasThumbnail = (mode == SaveMode.WORLD)
Echo("Save queued") Echo("Save queued")
IngameRenderer.screencapExportCallback = { if (hasThumbnail) {
Echo("Generating thumbnail...") IngameRenderer.screencapExportCallback = {
Echo("Generating thumbnail...")
val w = 960 val w = 960
val h = 640 val h = 640
val p = Pixmap.createFromFrameBuffer((it.width - w).ushr(1), (it.height - h).ushr(1), w, h) val p = Pixmap.createFromFrameBuffer((it.width - w).ushr(1), (it.height - h).ushr(1), w, h)
IngameRenderer.fboRGBexport = p IngameRenderer.fboRGBexport = p
//PixmapIO2._writeTGA(gzout, p, true, true) //PixmapIO2._writeTGA(gzout, p, true, true)
//p.dispose() //p.dispose()
IngameRenderer.fboRGBexportedLatch = true 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() savingThread.start()
// it is caller's job to keep the game paused or keep a "save in progress" ui up // it is caller's job to keep the game paused or keep a "save in progress" ui up

View File

@@ -3,7 +3,6 @@ package net.torvald.terrarum.serialise
import net.torvald.terrarum.CommonResourcePool import net.torvald.terrarum.CommonResourcePool
import net.torvald.terrarum.ReferencingRanges import net.torvald.terrarum.ReferencingRanges
import net.torvald.terrarum.gameactors.Actor import net.torvald.terrarum.gameactors.Actor
import net.torvald.terrarum.gameactors.ActorID
import net.torvald.terrarum.gameactors.BlockMarkerActor import net.torvald.terrarum.gameactors.BlockMarkerActor
import net.torvald.terrarum.gameworld.BlockLayer import net.torvald.terrarum.gameworld.BlockLayer
import net.torvald.terrarum.gameworld.GameWorld 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.realestate.LandUtil
import net.torvald.terrarum.tvda.ByteArray64 import net.torvald.terrarum.tvda.ByteArray64
import net.torvald.terrarum.tvda.ByteArray64Writer import net.torvald.terrarum.tvda.ByteArray64Writer
import net.torvald.terrarum.utils.PlayerLastStatus
import net.torvald.terrarum.weather.WeatherMixer import net.torvald.terrarum.weather.WeatherMixer
import java.io.Reader import java.io.Reader
@@ -29,7 +29,7 @@ object WriteWorld {
actor !is IngamePlayer // IngamePlayers must not be saved with the world 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<Actor>, playersList: List<IngamePlayer>): GameWorld {
val world = ingame.world val world = ingame.world
val currentPlayTime_t = time_t - ingame.loadedTime_t val currentPlayTime_t = time_t - ingame.loadedTime_t
@@ -38,29 +38,30 @@ object WriteWorld {
world.lastPlayTime = time_t world.lastPlayTime = time_t
world.totalPlayTime += currentPlayTime_t world.totalPlayTime += currentPlayTime_t
val actorIDbuf = ArrayList<ActorID>()
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.clear()
world.actors.addAll(actorIDbuf.sorted().distinct()) world.actors.addAll(actorsList.map { it.referenceID }.sorted().distinct())
world.randSeeds[0] = RoguelikeRandomiser.RNG.state0 world.randSeeds[0] = RoguelikeRandomiser.RNG.state0
world.randSeeds[1] = RoguelikeRandomiser.RNG.state1 world.randSeeds[1] = RoguelikeRandomiser.RNG.state1
world.randSeeds[2] = WeatherMixer.RNG.state0 world.randSeeds[2] = WeatherMixer.RNG.state0
world.randSeeds[3] = WeatherMixer.RNG.state1 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 return world
} }
operator fun invoke(ingame: TerrarumIngame, time_t: Long): String { operator fun invoke(ingame: TerrarumIngame, time_t: Long, actorsList: List<Actor>, playersList: List<IngamePlayer>): String {
return Common.jsoner.toJson(preWrite(ingame, time_t)) 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<Actor>, playersList: List<IngamePlayer>): ByteArray64 {
val baw = ByteArray64Writer(Common.CHARSET) 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() baw.flush(); baw.close()
return baw.toByteArray64() return baw.toByteArray64()