mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-13 07:06:06 +09:00
portrait now available again on player load; still not on the equippedview
This commit is contained in:
@@ -112,7 +112,7 @@ class AssembledSpriteAnimation(
|
|||||||
if (flipHorizontal) bodypartPos = bodypartPos.invertX()
|
if (flipHorizontal) bodypartPos = bodypartPos.invertX()
|
||||||
bodypartPos += ADPropertyObject.Vector2i(1,0)
|
bodypartPos += ADPropertyObject.Vector2i(1,0)
|
||||||
|
|
||||||
if (name == "HELD_ITEM") { // inject item's image
|
if (name in jointNameToEquipPos) {
|
||||||
ItemCodex[(parentActor as? Pocketed)?.inventory?.itemEquipped?.get(jointNameToEquipPos[name]!!)]?.let { item ->
|
ItemCodex[(parentActor as? Pocketed)?.inventory?.itemEquipped?.get(jointNameToEquipPos[name]!!)]?.let { item ->
|
||||||
ItemCodex.getItemImage(item)?.let { image ->
|
ItemCodex.getItemImage(item)?.let { image ->
|
||||||
val drawPos = adp.origin + bodypartPos // imgCentre for held items are (0,0)
|
val drawPos = adp.origin + bodypartPos // imgCentre for held items are (0,0)
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ import com.jme3.math.FastMath
|
|||||||
import net.torvald.unicode.EMDASH
|
import net.torvald.unicode.EMDASH
|
||||||
import net.torvald.unicode.getKeycapConsole
|
import net.torvald.unicode.getKeycapConsole
|
||||||
import net.torvald.unicode.getKeycapPC
|
import net.torvald.unicode.getKeycapPC
|
||||||
import net.torvald.spriteanimation.SpriteAnimation
|
|
||||||
import net.torvald.terrarum.*
|
import net.torvald.terrarum.*
|
||||||
import net.torvald.terrarum.App.printdbg
|
import net.torvald.terrarum.App.printdbg
|
||||||
import net.torvald.terrarum.langpack.Lang
|
import net.torvald.terrarum.langpack.Lang
|
||||||
@@ -24,7 +23,6 @@ import net.torvald.terrarum.savegame.DiskSkimmer
|
|||||||
import net.torvald.terrarum.savegame.EntryFile
|
import net.torvald.terrarum.savegame.EntryFile
|
||||||
import net.torvald.terrarum.serialise.Common
|
import net.torvald.terrarum.serialise.Common
|
||||||
import net.torvald.terrarum.serialise.LoadSavegame
|
import net.torvald.terrarum.serialise.LoadSavegame
|
||||||
import net.torvald.terrarum.serialise.ReadPlayer
|
|
||||||
import net.torvald.terrarum.serialise.SaveLoadError
|
import net.torvald.terrarum.serialise.SaveLoadError
|
||||||
import net.torvald.terrarum.spriteassembler.ADProperties
|
import net.torvald.terrarum.spriteassembler.ADProperties
|
||||||
import net.torvald.terrarum.spriteassembler.ADProperties.Companion.EXTRA_HEADROOM_X
|
import net.torvald.terrarum.spriteassembler.ADProperties.Companion.EXTRA_HEADROOM_X
|
||||||
@@ -241,9 +239,9 @@ class UILoadDemoSavefiles(val remoCon: UIRemoCon) : UICanvas() {
|
|||||||
mode1Node.data = "MENU_MODE_SINGLEPLAYER : net.torvald.terrarum.modulebasegame.ui.UILoadDemoSavefiles"
|
mode1Node.data = "MENU_MODE_SINGLEPLAYER : net.torvald.terrarum.modulebasegame.ui.UILoadDemoSavefiles"
|
||||||
mode2Node.data = "MENU_MODE_SINGLEPLAYER : net.torvald.terrarum.modulebasegame.ui.UILoadDemoSavefiles"
|
mode2Node.data = "MENU_MODE_SINGLEPLAYER : net.torvald.terrarum.modulebasegame.ui.UILoadDemoSavefiles"
|
||||||
|
|
||||||
printdbg(this, "mode1Node parent: ${mode1Node.parent?.data}") // will be 'null' because the parent is the root node
|
// printdbg(this, "mode1Node parent: ${mode1Node.parent?.data}") // will be 'null' because the parent is the root node
|
||||||
printdbg(this, "mode1Node data: ${mode1Node.data}")
|
// printdbg(this, "mode1Node data: ${mode1Node.data}")
|
||||||
printdbg(this, "mode2Node data: ${mode2Node.data}")
|
// printdbg(this, "mode2Node data: ${mode2Node.data}")
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun modeChangedHandler(mode: Int) {
|
private fun modeChangedHandler(mode: Int) {
|
||||||
@@ -486,9 +484,6 @@ class UIItemPlayerCells(
|
|||||||
override val width = SAVE_CELL_WIDTH
|
override val width = SAVE_CELL_WIDTH
|
||||||
override val height = SAVE_CELL_HEIGHT
|
override val height = SAVE_CELL_HEIGHT
|
||||||
|
|
||||||
private var thumbPixmap: Pixmap? = null
|
|
||||||
private var thumb: TextureRegion? = null
|
|
||||||
|
|
||||||
override var clickOnceListener: ((Int, Int, Int) -> Unit)? = { _: Int, _: Int, _: Int ->
|
override var clickOnceListener: ((Int, Int, Int) -> Unit)? = { _: Int, _: Int, _: Int ->
|
||||||
UILoadGovernor.playerDisk = skimmer
|
UILoadGovernor.playerDisk = skimmer
|
||||||
parent.advanceMode()
|
parent.advanceMode()
|
||||||
@@ -499,11 +494,13 @@ class UIItemPlayerCells(
|
|||||||
private var lastPlayTime: String = "????-??-?? --:--:--"
|
private var lastPlayTime: String = "????-??-?? --:--:--"
|
||||||
private var totalPlayTime: String = "--h--m--s"
|
private var totalPlayTime: String = "--h--m--s"
|
||||||
|
|
||||||
|
private var playerUUID: UUID? = null
|
||||||
|
|
||||||
init {
|
init {
|
||||||
skimmer.getFile(-1L)?.bytes?.let {
|
skimmer.getFile(-1L)?.bytes?.let {
|
||||||
val json = JsonReader().parse(ByteArray64Reader(it, Common.CHARSET))
|
val json = JsonReader().parse(ByteArray64Reader(it, Common.CHARSET))
|
||||||
|
|
||||||
val playerUUID = UUID.fromString(json["uuid"]?.asString())
|
playerUUID = UUID.fromString(json["uuid"]?.asString())
|
||||||
val worldUUID = UUID.fromString(json["worldCurrentlyPlaying"]?.asString())
|
val worldUUID = UUID.fromString(json["worldCurrentlyPlaying"]?.asString())
|
||||||
|
|
||||||
App.savegamePlayersName[playerUUID]?.let { if (it.isNotBlank()) playerName = it else "(name)" }
|
App.savegamePlayersName[playerUUID]?.let { if (it.isNotBlank()) playerName = it else "(name)" }
|
||||||
@@ -559,9 +556,10 @@ class UIItemPlayerCells(
|
|||||||
if (skimmer.initialised && !hasTexture) {
|
if (skimmer.initialised && !hasTexture) {
|
||||||
skimmer.getFile(-1L)?.bytes?.let {
|
skimmer.getFile(-1L)?.bytes?.let {
|
||||||
try {
|
try {
|
||||||
|
printdbg(this, "Generating portrait for $playerName")
|
||||||
val frameName = "ANIM_IDLE_1"
|
val frameName = "ANIM_IDLE_1"
|
||||||
val animFile = skimmer.getFile(-2L)!!
|
val animFile = skimmer.getFile(-2L)!!
|
||||||
val properties = ADProperties(ByteArray64Reader(animFile.bytes, Common.CHARSET))
|
val props = ADProperties(ByteArray64Reader(animFile.bytes, Common.CHARSET))
|
||||||
|
|
||||||
val imagesSelfContained = skimmer.hasEntry(-1025L)
|
val imagesSelfContained = skimmer.hasEntry(-1025L)
|
||||||
val bodypartMapping = Properties().also { if (imagesSelfContained) it.load(ByteArray64Reader(skimmer.getFile(-1025L)!!.bytes, Common.CHARSET)) }
|
val bodypartMapping = Properties().also { if (imagesSelfContained) it.load(ByteArray64Reader(skimmer.getFile(-1025L)!!.bytes, Common.CHARSET)) }
|
||||||
@@ -569,36 +567,51 @@ class UIItemPlayerCells(
|
|||||||
val fileGetter = if (imagesSelfContained)
|
val fileGetter = if (imagesSelfContained)
|
||||||
AssembleSheetPixmap.getVirtualDiskFileGetter(bodypartMapping, skimmer)
|
AssembleSheetPixmap.getVirtualDiskFileGetter(bodypartMapping, skimmer)
|
||||||
else
|
else
|
||||||
AssembleSheetPixmap.getAssetsDirFileGetter(properties)
|
AssembleSheetPixmap.getAssetsDirFileGetter(props)
|
||||||
|
|
||||||
// println(properties.transforms.keys)
|
// println(properties.transforms.keys)
|
||||||
|
|
||||||
val canvas = Pixmap(properties.cols * (properties.frameWidth), properties.rows * (properties.frameHeight), Pixmap.Format.RGBA8888).also { it.blending = Pixmap.Blending.SourceOver }
|
val canvas = Pixmap(props.frameWidth, props.frameHeight, Pixmap.Format.RGBA8888).also { it.blending = Pixmap.Blending.SourceOver }
|
||||||
val theAnim = properties.getAnimByFrameName(frameName)
|
val theAnim = props.getAnimByFrameName(frameName)
|
||||||
val skeleton = theAnim.skeleton.joints.reversed()
|
val skeleton = theAnim.skeleton.joints.reversed()
|
||||||
val transforms = properties.getTransform(frameName)
|
val transforms = props.getTransform(frameName)
|
||||||
val bodypartOrigins = properties.bodypartJoints
|
val bodypartOrigins = props.bodypartJoints
|
||||||
val bodypartImages = properties.bodypartJoints.keys.map { partname ->
|
val bodypartImages = props.bodypartJoints.keys.associate { partname ->
|
||||||
fileGetter(partname).let { file ->
|
fileGetter(partname).let { file ->
|
||||||
if (file == null) partname to null
|
if (file == null) {
|
||||||
|
printdbg(this, " Partname $partname points to a null file!")
|
||||||
|
partname to null
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
try {
|
try {
|
||||||
|
printdbg(this, " Partname $partname successfully retrieved")
|
||||||
val bytes = file.readAllBytes()
|
val bytes = file.readAllBytes()
|
||||||
partname to Pixmap(bytes, 0, bytes.size)
|
partname to Pixmap(bytes, 0, bytes.size)
|
||||||
}
|
}
|
||||||
catch (e: GdxRuntimeException) {
|
catch (e: GdxRuntimeException) {
|
||||||
|
printdbg(this, " Partname $partname failed to load: ${e.message}")
|
||||||
partname to null
|
partname to null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}.toMap()
|
}
|
||||||
val transformList = AssembleFrameBase.makeTransformList(skeleton, transforms)
|
val transformList = AssembleFrameBase.makeTransformList(skeleton, transforms)
|
||||||
|
|
||||||
// manually draw 0th frame of ANIM_IDLE
|
// manually draw 0th frame of ANIM_IDLE
|
||||||
AssembleSheetPixmap.drawFrame(0, 0, canvas, properties, bodypartOrigins, bodypartImages, transformList, null)
|
transformList.forEach { (name, bodypartPos) ->
|
||||||
|
bodypartImages[name]?.let { image ->
|
||||||
|
val imgCentre = bodypartOrigins[name]!!.invertX()
|
||||||
|
val drawPos = props.origin + bodypartPos + imgCentre
|
||||||
|
|
||||||
|
canvas.drawPixmap(image, drawPos.x, props.frameHeight - drawPos.y - 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// dispose of temporary resources
|
||||||
bodypartImages.values.forEach { it?.dispose() }
|
bodypartImages.values.forEach { it?.dispose() }
|
||||||
|
|
||||||
|
// PixmapIO.writePNG(Gdx.files.absolute("${App.defaultDir}/Exports/Portrait-$playerName.tga"), canvas)
|
||||||
|
|
||||||
this.sprite = TextureRegion(Texture(canvas))
|
this.sprite = TextureRegion(Texture(canvas))
|
||||||
}
|
}
|
||||||
catch (e: Throwable) {
|
catch (e: Throwable) {
|
||||||
@@ -643,7 +656,7 @@ class UIItemPlayerCells(
|
|||||||
|
|
||||||
// player avatar
|
// player avatar
|
||||||
batch.color = Color.WHITE
|
batch.color = Color.WHITE
|
||||||
thumb?.let {
|
this.sprite?.let {
|
||||||
batch.draw(it,
|
batch.draw(it,
|
||||||
x + FastMath.ceil((106f - it.regionWidth) / 2f) + EXTRA_HEADROOM_X / 2,
|
x + FastMath.ceil((106f - it.regionWidth) / 2f) + EXTRA_HEADROOM_X / 2,
|
||||||
y + FastMath.ceil((height - it.regionHeight) / 2f) - EXTRA_HEADROOM_Y / 2
|
y + FastMath.ceil((height - it.regionHeight) / 2f) - EXTRA_HEADROOM_Y / 2
|
||||||
@@ -652,8 +665,6 @@ class UIItemPlayerCells(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun dispose() {
|
override fun dispose() {
|
||||||
thumb?.texture?.dispose()
|
|
||||||
thumbPixmap?.dispose()
|
|
||||||
sprite?.texture?.dispose()
|
sprite?.texture?.dispose()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user