diff --git a/src/net/torvald/spriteanimation/HasAssembledSprite.kt b/src/net/torvald/spriteanimation/HasAssembledSprite.kt index fb38b254d..6a79831af 100644 --- a/src/net/torvald/spriteanimation/HasAssembledSprite.kt +++ b/src/net/torvald/spriteanimation/HasAssembledSprite.kt @@ -4,6 +4,7 @@ import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.g2d.TextureRegion import net.torvald.spriteassembler.ADProperties import net.torvald.spriteassembler.AssembleSheetPixmap +import net.torvald.terrarum.gameitems.GameItem import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack /** @@ -30,11 +31,11 @@ interface HasAssembledSprite { * reassembleSprite(this.sprite, this.spriteGlow) * ``` */ - fun reassembleSprite(sprite: SpriteAnimation?, spriteGlow: SpriteAnimation? = null) { + fun reassembleSprite(sprite: SpriteAnimation?, spriteGlow: SpriteAnimation? = null, item: GameItem?) { if (animDesc != null && sprite != null) - _rebuild(animDesc!!, sprite) + _rebuild(animDesc!!, sprite, null) if (animDescGlow != null && spriteGlow != null) - _rebuild(animDescGlow!!, spriteGlow) + _rebuild(animDescGlow!!, spriteGlow, null) } /*fun reassembleSprite(disk: SimpleFileSystem, sprite: SpriteAnimation?, anim: ADProperties?, spriteGlow: SpriteAnimation? = null, animGlow: ADProperties? = null) { @@ -44,10 +45,10 @@ interface HasAssembledSprite { _rebuild(disk, animGlow, spriteGlow) }*/ - private fun _rebuild(ad: ADProperties, sprite: SpriteAnimation) { + private fun _rebuild(ad: ADProperties, sprite: SpriteAnimation, item: GameItem?) { // TODO injecting held item/armour pictures? Would it be AssembleSheetPixmap's job? - val pixmap = AssembleSheetPixmap.fromAssetsDir(ad) + val pixmap = AssembleSheetPixmap.fromAssetsDir(ad, item) val texture = Texture(pixmap) texture.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest) pixmap.dispose() diff --git a/src/net/torvald/spriteassembler/AssembleSheetPixmap.kt b/src/net/torvald/spriteassembler/AssembleSheetPixmap.kt index 6f17dbcd8..f14978efe 100644 --- a/src/net/torvald/spriteassembler/AssembleSheetPixmap.kt +++ b/src/net/torvald/spriteassembler/AssembleSheetPixmap.kt @@ -5,6 +5,7 @@ import com.badlogic.gdx.graphics.Pixmap import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.g2d.TextureRegion import com.badlogic.gdx.utils.GdxRuntimeException +import net.torvald.terrarum.gameitems.GameItem import net.torvald.terrarum.linearSearch import net.torvald.terrarum.savegame.ByteArray64InputStream import net.torvald.terrarum.savegame.ByteArray64Reader @@ -47,25 +48,25 @@ object AssembleSheetPixmap { } - private fun drawAndGetCanvas(properties: ADProperties, fileGetter: (String) -> InputStream?): Pixmap { + private fun drawAndGetCanvas(properties: ADProperties, fileGetter: (String) -> InputStream?, injectedItem: GameItem?): Pixmap { val canvas = Pixmap(properties.cols * properties.frameWidth, properties.rows * properties.frameHeight, Pixmap.Format.RGBA8888) canvas.blending = Pixmap.Blending.SourceOver // actually draw properties.transforms.forEach { t, _ -> - drawThisFrame(t, canvas, properties, fileGetter) + drawThisFrame(t, canvas, properties, fileGetter, injectedItem) } return canvas } - fun fromAssetsDir(properties: ADProperties) = drawAndGetCanvas(properties, getAssetsDirFileGetter(properties)) + fun fromAssetsDir(properties: ADProperties, injectedItem: GameItem?) = drawAndGetCanvas(properties, getAssetsDirFileGetter(properties), injectedItem) - fun fromVirtualDisk(disk: SimpleFileSystem, entrynum: Long, properties: ADProperties): Pixmap { + fun fromVirtualDisk(disk: SimpleFileSystem, entrynum: Long, properties: ADProperties, injectedItem: GameItem?): Pixmap { val bodypartMapping = Properties() bodypartMapping.load(ByteArray64Reader(disk.getFile(entrynum)!!.bytes, Common.CHARSET)) - return drawAndGetCanvas(properties, getVirtualDiskFileGetter(bodypartMapping, disk)) + return drawAndGetCanvas(properties, getVirtualDiskFileGetter(bodypartMapping, disk), injectedItem) } fun getPartPixmap(getFile: (String) -> InputStream?, partName: String): Pixmap? { @@ -131,7 +132,8 @@ object AssembleSheetPixmap { private fun drawThisFrame(frameName: String, canvas: Pixmap, properties: ADProperties, - fileGetter: (String) -> InputStream? + fileGetter: (String) -> InputStream?, + injectedItem: GameItem? ) { val theAnim = properties.getAnimByFrameName(frameName) val skeleton = theAnim.skeleton.joints.reversed() @@ -158,7 +160,7 @@ object AssembleSheetPixmap { // AppLoader.printdbg(this, "Frame to draw: $frameName (R$animRow C$animFrame)") - drawFrame(animRow, animFrame, canvas, properties, bodypartOrigins, bodypartImages, transformList) + drawFrame(animRow, animFrame, canvas, properties, bodypartOrigins, bodypartImages, transformList, injectedItem) bodypartImages.values.forEach { it?.dispose() } } @@ -168,7 +170,8 @@ object AssembleSheetPixmap { props: ADProperties, bodypartOrigins: HashMap, bodypartImages: Map, - transformList: List> + transformList: List>, + injectedItem: GameItem? ) { val tmpFrame = Pixmap(props.frameWidth, props.frameHeight, Pixmap.Format.RGBA8888) @@ -187,6 +190,8 @@ object AssembleSheetPixmap { (row - 1) * props.frameHeight ) + // TODO use injectedItem + tmpFrame.dispose() } diff --git a/src/net/torvald/spriteassembler/SpriteAssemblerApp.kt b/src/net/torvald/spriteassembler/SpriteAssemblerApp.kt index a3293fd0e..05da9c66a 100644 --- a/src/net/torvald/spriteassembler/SpriteAssemblerApp.kt +++ b/src/net/torvald/spriteassembler/SpriteAssemblerApp.kt @@ -298,7 +298,7 @@ class SpriteAssemblerPreview: Game() { } private fun assembleImage(prop: ADProperties) { - image = AssembleSheetPixmap.fromAssetsDir(prop) + image = AssembleSheetPixmap.fromAssetsDir(prop, null) } // TODO rename to requestAssembly diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/IngamePlayer.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/IngamePlayer.kt index 9991ad841..90d49082e 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/IngamePlayer.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/IngamePlayer.kt @@ -9,6 +9,7 @@ import net.torvald.spriteassembler.AssembleSheetPixmap import net.torvald.terrarum.App import net.torvald.terrarum.Terrarum import net.torvald.terrarum.gameactors.AVKey +import net.torvald.terrarum.gameitems.GameItem import net.torvald.terrarum.savegame.SimpleFileSystem import net.torvald.terrarum.utils.PlayerLastStatus import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack @@ -71,6 +72,12 @@ class IngamePlayer : ActorHumanoid { } + /** To be used later by the game to rebuild the sprite. + * Which `_rebuild` function to use is determined at the load time. + */ + private lateinit var rebuildfun: (item: GameItem?) -> Unit + private lateinit var rebuildfunGlow: (item: GameItem?) -> Unit + /** * Example usage: @@ -82,19 +89,19 @@ class IngamePlayer : ActorHumanoid { * reassembleSprite(this.sprite, this.spriteGlow) * ``` */ - fun reassembleSprite(sprite: SpriteAnimation?, spriteGlow: SpriteAnimation? = null) { + fun reassembleSprite(sprite: SpriteAnimation?, spriteGlow: SpriteAnimation?, heldItem: GameItem?) { if (animDesc != null && sprite != null) { - _rebuild(animDesc!!, sprite) + rebuildfun = { item: GameItem? -> _rebuild(animDesc!!, sprite, item) }; rebuildfun(heldItem) spriteHeadTexture = AssembleSheetPixmap.getMugshotFromAssetsDir(animDesc!!) } if (animDescGlow != null && spriteGlow != null) - _rebuild(animDescGlow!!, spriteGlow) + rebuildfunGlow = { item: GameItem? -> _rebuild(animDescGlow!!, spriteGlow, item) }; rebuildfunGlow(heldItem) } - fun reassembleSprite(disk: SimpleFileSystem, sprite: SpriteAnimation?, spriteGlow: SpriteAnimation? = null) { + fun reassembleSpriteFromDisk(disk: SimpleFileSystem, sprite: SpriteAnimation?, spriteGlow: SpriteAnimation?, heldItem: GameItem?) { if (animDesc != null && sprite != null) { - _rebuild(disk, -1025L, animDesc!!, sprite) + rebuildfun = { item: GameItem? -> _rebuild(disk, -1025L, animDesc!!, sprite, item) }; rebuildfun(heldItem) if (disk.getEntry(-1025L) != null) spriteHeadTexture = AssembleSheetPixmap.getMugshotFromVirtualDisk(disk, -1025L, animDesc!!) @@ -102,13 +109,13 @@ class IngamePlayer : ActorHumanoid { spriteHeadTexture = AssembleSheetPixmap.getMugshotFromAssetsDir(animDesc!!) } if (animDescGlow != null && spriteGlow != null) - _rebuild(disk, -1026L, animDescGlow!!, spriteGlow) + rebuildfunGlow = { item: GameItem? -> _rebuild(disk, -1026L, animDescGlow!!, spriteGlow, item) }; rebuildfunGlow(heldItem) } - private fun _rebuild(ad: ADProperties, sprite: SpriteAnimation) { + private fun _rebuild(ad: ADProperties, sprite: SpriteAnimation, item: GameItem?) { // TODO injecting held item/armour pictures? Would it be AssembleSheetPixmap's job? - val pixmap = AssembleSheetPixmap.fromAssetsDir(ad) + val pixmap = AssembleSheetPixmap.fromAssetsDir(ad, item) val texture = Texture(pixmap) texture.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest) pixmap.dispose() @@ -129,10 +136,10 @@ class IngamePlayer : ActorHumanoid { sprite.nRows = newAnimDelays.size } - private fun _rebuild(disk: SimpleFileSystem, entrynum: Long, ad: ADProperties, sprite: SpriteAnimation) { + private fun _rebuild(disk: SimpleFileSystem, entrynum: Long, ad: ADProperties, sprite: SpriteAnimation, item: GameItem?) { // TODO injecting held item/armour pictures? Would it be AssembleSheetPixmap's job? - val pixmap = if (disk.getEntry(entrynum) != null) AssembleSheetPixmap.fromVirtualDisk(disk, entrynum, ad) else AssembleSheetPixmap.fromAssetsDir(ad) + val pixmap = if (disk.getEntry(entrynum) != null) AssembleSheetPixmap.fromVirtualDisk(disk, entrynum, ad, item) else AssembleSheetPixmap.fromAssetsDir(ad, item) val texture = Texture(pixmap) texture.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest) pixmap.dispose() @@ -156,4 +163,24 @@ class IngamePlayer : ActorHumanoid { override fun getSpriteHead(): TextureRegion? { return spriteHeadTexture } + + override fun equipItem(item: GameItem) { + super.equipItem(item) + + // TODO redraw sprite with held item sprite (use sprite joint "HELD_ITEM") + if (item.equipPosition == GameItem.EquipPosition.HAND_GRIP) { + rebuildfun(item) + animDescGlow?.let { rebuildfunGlow(item) } + } + } + + override fun unequipItem(item: GameItem?) { + super.unequipItem(item) + + // redraw sprite without held item sprite (use sprite joint "HELD_ITEM") + item?.let { item -> if (item.equipPosition == GameItem.EquipPosition.HAND_GRIP) { + rebuildfun(null) + animDescGlow?.let { rebuildfunGlow(null) } + } } + } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderTestSubject1.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderTestSubject1.kt index 992877e9f..e7ad4df8d 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderTestSubject1.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderTestSubject1.kt @@ -29,7 +29,7 @@ object PlayerBuilderTestSubject1 { p.sprite = SpriteAnimation(p) p.spriteGlow = SpriteAnimation(p) - p.reassembleSprite(p.sprite, p.spriteGlow) + p.reassembleSprite(p.sprite, p.spriteGlow, null) 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 0ccb1ee1d..441dd4f81 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderWerebeastTest.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderWerebeastTest.kt @@ -30,7 +30,7 @@ object PlayerBuilderWerebeastTest { p.sprite = SpriteAnimation(p) p.spriteGlow = SpriteAnimation(p) - p.reassembleSprite(p.sprite, p.spriteGlow) + p.reassembleSprite(p.sprite, p.spriteGlow, null) 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 bdb7fa1a9..5d252ab0b 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UILoadDemoSavefiles.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UILoadDemoSavefiles.kt @@ -551,7 +551,7 @@ class UIItemPlayerCells( val p = ReadPlayer(skimmer, ByteArray64Reader(it, Common.CHARSET)) p.sprite = SpriteAnimation(p) p.animDesc = ADProperties(ByteArray64Reader(animFile.bytes, Common.CHARSET)) - p.reassembleSprite(skimmer, p.sprite) + p.reassembleSpriteFromDisk(skimmer, p.sprite, null, null) p.sprite!!.textureRegion.get(0,0).let { thumb = it thumb!!.flip(false, false) diff --git a/src/net/torvald/terrarum/savegame/DiskSkimmer.kt b/src/net/torvald/terrarum/savegame/DiskSkimmer.kt index f1b769f66..5a8ac9bf1 100644 --- a/src/net/torvald/terrarum/savegame/DiskSkimmer.kt +++ b/src/net/torvald/terrarum/savegame/DiskSkimmer.kt @@ -441,9 +441,9 @@ removefile: } - fun dispose() { - fa.close() - } +// fun dispose() { +// fa.close() +// } companion object { diff --git a/src/net/torvald/terrarum/serialise/WriteActor.kt b/src/net/torvald/terrarum/serialise/WriteActor.kt index 089154fb5..3d859ba32 100644 --- a/src/net/torvald/terrarum/serialise/WriteActor.kt +++ b/src/net/torvald/terrarum/serialise/WriteActor.kt @@ -3,8 +3,10 @@ package net.torvald.terrarum.serialise import net.torvald.spriteanimation.HasAssembledSprite import net.torvald.spriteanimation.SpriteAnimation import net.torvald.spriteassembler.ADProperties +import net.torvald.terrarum.ItemCodex import net.torvald.terrarum.gameactors.Actor import net.torvald.terrarum.gameactors.ActorWithBody +import net.torvald.terrarum.gameitems.GameItem import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.gameactors.IngamePlayer import net.torvald.terrarum.savegame.* @@ -140,16 +142,18 @@ object ReadActor { actor.animDescGlow = ADProperties(ByteArray64Reader(animFileGlow.bytes, Common.CHARSET)) } + val heldItem = ItemCodex[actor.inventory.itemEquipped[GameItem.EquipPosition.HAND_GRIP]] + if (bodypartsFile != null) - actor.reassembleSprite(disk, actor.sprite!!, actor.spriteGlow) + actor.reassembleSpriteFromDisk(disk, actor.sprite!!, actor.spriteGlow, heldItem) else - actor.reassembleSprite(actor.sprite!!, actor.spriteGlow) + actor.reassembleSprite(actor.sprite!!, actor.spriteGlow, heldItem) } 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.spriteGlow) + actor.reassembleSprite(actor.sprite, actor.spriteGlow, null) } diff --git a/src/net/torvald/terrarum/serialise/WriteSavegame.kt b/src/net/torvald/terrarum/serialise/WriteSavegame.kt index 75c99d6a0..e4d13a42c 100644 --- a/src/net/torvald/terrarum/serialise/WriteSavegame.kt +++ b/src/net/torvald/terrarum/serialise/WriteSavegame.kt @@ -163,8 +163,8 @@ object LoadSavegame { newIngame.worldSavefileName = getWorldSavefileName(newIngame.savegameNickname, world) newIngame.playerSavefileName = getPlayerSavefileName(player) - worldDisk.dispose() - playerDisk.dispose() +// worldDisk.dispose() +// playerDisk.dispose() val loadJob = { it: LoadScreenBase -> val loadscreen = it as ChunkLoadingLoadScreen diff --git a/src/net/torvald/terrarum/tests/SpriteAssemblerTest.kt b/src/net/torvald/terrarum/tests/SpriteAssemblerTest.kt index e29af870d..904b72708 100644 --- a/src/net/torvald/terrarum/tests/SpriteAssemblerTest.kt +++ b/src/net/torvald/terrarum/tests/SpriteAssemblerTest.kt @@ -11,7 +11,7 @@ class SpriteAssemblerTest { operator fun invoke() { val properties = ADProperties(StringReader(ADLParsingTest().TEST_STR)) - AssembleSheetPixmap.fromAssetsDir(properties) + AssembleSheetPixmap.fromAssetsDir(properties, null) } }