diff --git a/core/src/ru/deadsoftware/cavedroid/game/model/block/Block.kt b/core/src/ru/deadsoftware/cavedroid/game/model/block/Block.kt
index 9669a5378c5f84dbafd7be4a58bc801522f2a3d7..fa99bfd91ed2afa2ed63221b23374ba221ad1baa 100644 (file)
import com.badlogic.gdx.math.Rectangle
import com.badlogic.gdx.utils.TimeUtils
import ru.deadsoftware.cavedroid.game.model.item.Item
+import ru.deadsoftware.cavedroid.misc.utils.colorFromHexString
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.contract
val spriteWidth: Float get() = 16f - params.spriteMargins.left - params.spriteMargins.right
val spriteHeight: Float get() = 16f - params.spriteMargins.top - params.spriteMargins.bottom
- private var animation: Array<Sprite>? = null
+ protected var animation: Array<Sprite>? = null
private var _sprite: Sprite? = null
get() {
return animation?.get(currentAnimationFrame) ?: field
}
- val sprite: Sprite
+ open val sprite: Sprite
get() = requireNotNull(_sprite) { "null sprite for block '${params.key}'" }
private val currentAnimationFrame: Int
val width = 16 - params.spriteMargins.left - params.spriteMargins.right
val height = 16 - params.spriteMargins.top - params.spriteMargins.bottom
Sprite(params.texture, params.spriteMargins.left, 16 * y + params.spriteMargins.top, width, height)
- .apply { flip(false, true) }
+ .apply {
+ flip(false, true)
+ params.tint?.let { tint -> color = colorFromHexString(tint) }
+ }
}
}
}
val width = 16 - params.spriteMargins.left - params.spriteMargins.right
val height = 16 - params.spriteMargins.top - params.spriteMargins.bottom
Sprite(tex, params.spriteMargins.left, params.spriteMargins.top, width, height)
- .apply { flip(false, true) }
+ .apply {
+ flip(false, true)
+ params.tint?.let { tint -> color = colorFromHexString(tint) }
+ }
}
}
return this is Slab
}
+ fun isContainer(): Boolean {
+ contract { returns(true) implies (this@Block is Container) }
+ return this is Container
+ }
+
+ fun isFurnace(): Boolean {
+ contract { returns(true) implies (this@Block is Furnace) }
+ return this is Furnace
+ }
+
+ fun isChest(): Boolean {
+ contract { returns(true) implies (this@Block is Chest) }
+ return this is Chest
+ }
+
fun isNone(): Boolean {
contract { returns(true) implies (this@Block is None) }
return this is None
)
}
+ sealed class Container() : Block()
+
data class None(
override val params: CommonBlockParams
) : Block()
override val params: CommonBlockParams,
) : Block()
+ data class Furnace(
+ override val params: CommonBlockParams,
+ ): Container() {
+
+ override val sprite: Sprite
+ get() = getSprite(false)
+
+ private fun getSprite(isActive: Boolean): Sprite {
+ return animation?.let { animation ->
+ if (isActive) {
+ animation[1]
+ } else {
+ animation[0]
+ }
+ } ?: sprite
+ }
+
+ fun draw(spriter: SpriteBatch, x: Float, y: Float, isActive: Boolean) {
+ getSprite(isActive).apply {
+ setBounds(
+ /* x = */ x + params.spriteMargins.left,
+ /* y = */ y + params.spriteMargins.top,
+ /* width = */ spriteWidth,
+ /* height = */ spriteHeight
+ )
+ draw(spriter)
+ }
+ }
+
+ }
+
+ data class Chest(
+ override val params: CommonBlockParams
+ ): Container()
+
data class Slab(
override val params: CommonBlockParams,
val fullBlockKey: String,