diff --git a/src/net/torvald/spriteassembler/ADProperties.kt b/src/net/torvald/spriteassembler/ADProperties.kt index 02f1515e7..cc3434180 100644 --- a/src/net/torvald/spriteassembler/ADProperties.kt +++ b/src/net/torvald/spriteassembler/ADProperties.kt @@ -14,8 +14,8 @@ data class Skeleton(val name: String, val joints: List) { override fun toString() = "$name=$joints" } -data class Animation(val name: String, val delay: Float, val row: Int, val skeleton: Skeleton) { - override fun toString() = "$name delay: $delay, row: $row, skeleton: ${skeleton.name}" +data class Animation(val name: String, val delay: Float, val row: Int, val frames: Int, val skeleton: Skeleton) { + override fun toString() = "$name delay: $delay, row: $row, frames: $frames, skeleton: ${skeleton.name}" } class ADProperties { @@ -38,6 +38,8 @@ class ADProperties { lateinit var baseFilename: String; private set lateinit var extension: String; private set + private val animFrameSuffixRegex = Regex("""_[0-9]+""") + constructor(reader: Reader) { javaProp.load(reader) continueLoad() @@ -63,6 +65,23 @@ class ADProperties { val bodyparts = HashSet() val skeletons = HashMap() val animations = HashMap() + val animFrames = HashMap() + // scan every props, write down anim frames for later use + propTable.keys.forEach { + if (animFrameSuffixRegex.containsMatchIn(it)) { + val animName = getAnimNameFromFrame(it) + val frameNumber = it.drop(animName.length + 1).toInt() + + // if animFrames does not have our entry, add it. + // otherwise, max() against the existing value + if (animFrames.containsKey(animName)) { + animFrames[animName] = maxOf(animFrames[animName]!!, frameNumber) + } + else { + animFrames[animName] = frameNumber + } + } + } // populate skeletons and animations forEach { s, list -> // Map-ify. If it has variable == "SKELETON", the 's' is likely an animation @@ -82,6 +101,7 @@ class ADProperties { s, propsHashMap["DELAY"] as Float, (propsHashMap["ROW"] as Float).toInt(), + animFrames[s]!!, Skeleton(skeletonName, skeletonDef.toJoints()) )) } @@ -97,7 +117,7 @@ class ADProperties { this.bodyparts = bodyparts.toList().sorted() this.skeletons = skeletons this.animations = animations - this.bodypartFiles = this.bodyparts.map { getFullFilename(it) } + this.bodypartFiles = this.bodyparts.map { toFilename(it) } } operator fun get(identifier: String) = propTable[identifier.toUpperCase()] @@ -106,14 +126,15 @@ class ADProperties { fun containsKey(key: String) = propTable.containsKey(key) fun forEach(predicate: (String, List) -> Unit) = propTable.forEach(predicate) - fun getFullFilename(partName: String) = + fun toFilename(partName: String) = "${this.baseFilename}${partName.toLowerCase()}${this.extension}" fun getAnimByFrameName(frameName: String): Animation { - val animName = frameName.substring(0 until frameName.lastIndexOf('_')) - return animations[animName]!! + return animations[getAnimNameFromFrame(frameName)]!! } + private fun getAnimNameFromFrame(s: String) = s.substring(0 until s.lastIndexOf('_')) + private fun List.toJoints() = List(this.size) { Joint(this[it].variable, this[it].input!! as ADPropertyObject.Vector2i) } diff --git a/src/net/torvald/spriteassembler/AssembleFrameGdxPixmap.kt b/src/net/torvald/spriteassembler/AssembleFrameGdxPixmap.kt index ecd4a8832..0420aaefe 100644 --- a/src/net/torvald/spriteassembler/AssembleFrameGdxPixmap.kt +++ b/src/net/torvald/spriteassembler/AssembleFrameGdxPixmap.kt @@ -9,7 +9,14 @@ object AssembleFrameGdxPixmap { operator fun invoke(properties: ADProperties, frameName: String) { val theAnim = properties.getAnimByFrameName(frameName) - val skeleton = theAnim.skeleton + val skeleton = theAnim.skeleton.joints + + println("Test") + + // test print required body part filename + skeleton.reversed().forEach { + println(properties.toFilename(it.name)) + } } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/tests/ADLParsingTest.kt b/src/net/torvald/terrarum/tests/ADLParsingTest.kt index 44d286315..d5fcb60cb 100644 --- a/src/net/torvald/terrarum/tests/ADLParsingTest.kt +++ b/src/net/torvald/terrarum/tests/ADLParsingTest.kt @@ -41,9 +41,6 @@ class ADLParsingTest { ANIM_IDLE_1= ! ANIM_IDLE_1 will not make any transformation ANIM_IDLE_2=UPPER_TORSO 0,-1 - - ANIM_CROUCH=DELAY 1;ROW 3;SKELETON SKELETON_CROUCH - ANIM_CROUCH_1= """.trimIndent() operator fun invoke() { diff --git a/src/net/torvald/terrarum/tests/SpriteAssemblerTest.kt b/src/net/torvald/terrarum/tests/SpriteAssemblerTest.kt new file mode 100644 index 000000000..3465c2c5d --- /dev/null +++ b/src/net/torvald/terrarum/tests/SpriteAssemblerTest.kt @@ -0,0 +1,21 @@ +package net.torvald.terrarum.tests + +import net.torvald.spriteassembler.ADProperties +import net.torvald.spriteassembler.AssembleFrameGdxPixmap +import java.io.StringReader + +/** + * Created by minjaesong on 2019-01-06. + */ +class SpriteAssemblerTest { + + operator fun invoke() { + val properties = ADProperties(StringReader(ADLParsingTest().TEST_STR)) + AssembleFrameGdxPixmap.invoke(properties, "ANIM_RUN_1") + } + +} + +fun main(args: Array) { + SpriteAssemblerTest().invoke() +} \ No newline at end of file