mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-07 20:31:51 +09:00
saved players position is now restored but offsetted to the right for some reason
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<String>) {
|
||||
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<String>) {
|
||||
if (args.size == 2) {
|
||||
try {
|
||||
@@ -89,4 +78,4 @@ object ExportActor : ConsoleCommand {
|
||||
Echo("Usage: exportactor (id) filename-without-extension")
|
||||
Echo("blank ID for player")
|
||||
}
|
||||
}
|
||||
}*/
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<Actor>, playersList: List<IngamePlayer>): 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<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.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<Actor>, playersList: List<IngamePlayer>): 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<Actor>, playersList: List<IngamePlayer>): 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()
|
||||
|
||||
Reference in New Issue
Block a user