mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-14 12:34:05 +09:00
read/writeactor to process all subclasses of Actor, not just a player; actor possession confirmed working
This commit is contained in:
@@ -2,38 +2,59 @@ package net.torvald.terrarum.serialise
|
||||
|
||||
import net.torvald.spriteanimation.HasAssembledSprite
|
||||
import net.torvald.spriteanimation.SpriteAnimation
|
||||
import net.torvald.terrarum.NoSuchActorWithIDException
|
||||
import net.torvald.terrarum.gameactors.Actor
|
||||
import net.torvald.terrarum.gameactors.ActorWithBody
|
||||
import net.torvald.terrarum.modulebasegame.TerrarumIngame
|
||||
import net.torvald.terrarum.modulebasegame.gameactors.ActorHumanoid
|
||||
import net.torvald.terrarum.modulebasegame.gameactors.IngamePlayer
|
||||
import net.torvald.terrarum.modulebasegame.gameactors.Pocketed
|
||||
import java.io.InputStream
|
||||
import java.io.Reader
|
||||
|
||||
/**
|
||||
* Actor's JSON representation is expected to have "class" property on the root object, such as:
|
||||
* ```
|
||||
* "class":"net.torvald.terrarum.modulebasegame.gameactors.IngamePlayer"
|
||||
* ```
|
||||
*
|
||||
* Created by minjaesong on 2021-08-27.
|
||||
*/
|
||||
class ReadActor(val ingame: TerrarumIngame) {
|
||||
|
||||
open fun invoke(worldDataStream: InputStream) {
|
||||
postRead(Common.jsoner.fromJson(IngamePlayer::class.java, worldDataStream))
|
||||
postRead(Common.jsoner.fromJson(null, worldDataStream))
|
||||
}
|
||||
|
||||
open fun invoke(worldDataStream: Reader) {
|
||||
postRead(Common.jsoner.fromJson(IngamePlayer::class.java, worldDataStream))
|
||||
postRead(Common.jsoner.fromJson(null, worldDataStream))
|
||||
}
|
||||
|
||||
private fun postRead(actor: IngamePlayer) {
|
||||
private fun postRead(actor: Actor) {
|
||||
// filling in Transients
|
||||
actor.actorValue.actor = actor
|
||||
actor.inventory.actor = actor
|
||||
actor.sprite = SpriteAnimation(actor)
|
||||
if (actor.animDescPathGlow != null) actor.spriteGlow = SpriteAnimation(actor)
|
||||
actor.reassembleSprite(actor.sprite!!, actor.spriteGlow)
|
||||
|
||||
if (actor is Pocketed)
|
||||
actor.inventory.actor = actor
|
||||
|
||||
if (actor is ActorWithBody) {
|
||||
actor.sprite = SpriteAnimation(actor)
|
||||
|
||||
if (actor is HasAssembledSprite) {
|
||||
if (actor.animDescPathGlow != null) actor.spriteGlow = SpriteAnimation(actor)
|
||||
actor.reassembleSprite(actor.sprite!!, actor.spriteGlow)
|
||||
}
|
||||
}
|
||||
// replace existing player
|
||||
ingame.forceRemoveActor(ingame.actorNowPlaying!!)
|
||||
val oldPlayerID = ingame.actorNowPlaying?.referenceID
|
||||
try {
|
||||
ingame.forceRemoveActor(ingame.getActorByID(actor.referenceID))
|
||||
}
|
||||
catch (e: NoSuchActorWithIDException) { /* no actor to delete, you may proceed */ }
|
||||
ingame.addNewActor(actor)
|
||||
ingame.actorNowPlaying = actor
|
||||
|
||||
if (actor.referenceID == oldPlayerID)
|
||||
ingame.actorNowPlaying = actor as ActorHumanoid
|
||||
}
|
||||
|
||||
}
|
||||
@@ -14,7 +14,8 @@ import java.math.BigInteger
|
||||
object WriteActor {
|
||||
|
||||
operator fun invoke(actor: IngamePlayer): String {
|
||||
return Common.jsoner.toJson(actor)
|
||||
val s = Common.jsoner.toJson(actor, actor.javaClass)
|
||||
return """{"class":"${actor.javaClass.canonicalName}",${s.substring(1)}"""
|
||||
}
|
||||
|
||||
fun encodeToByteArray64(actor: IngamePlayer): ByteArray64 {
|
||||
|
||||
@@ -27,7 +27,7 @@ open class WriteMeta(val ingame: TerrarumIngame) {
|
||||
"randseed1": ${RoguelikeRandomiser.RNG.state1},
|
||||
"weatseed0": ${WeatherMixer.RNG.state0},
|
||||
"weatseed1": ${WeatherMixer.RNG.state1},
|
||||
"playerid": ${ingame.theRealGamer.referenceID},
|
||||
"playerid": ${ingame.actorGamer.referenceID},
|
||||
"creation_t": ${world.creationTime},
|
||||
"lastplay_t": ${world.lastPlayTime},
|
||||
"playtime_t": ${world.totalPlayTime},
|
||||
|
||||
Reference in New Issue
Block a user