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 440d258eb94bbb832df8bedd9e060c3661382079..fa99bfd91ed2afa2ed63221b23374ba221ad1baa 100644 (file)
import com.badlogic.gdx.graphics.g2d.SpriteBatch
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 width: Float get() = 16f - params.collisionMargins.left - params.collisionMargins.right
val height: Float get() = 16f - params.collisionMargins.top - params.collisionMargins.bottom
- private val spriteWidth: Float get() = 16f - params.spriteMargins.left - params.spriteMargins.right
- private val spriteHeight: Float get() = 16f - params.spriteMargins.top - params.spriteMargins.bottom
+ 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
+ private var _sprite: Sprite? = null
get() {
return animation?.get(currentAnimationFrame) ?: field
}
+ open val sprite: Sprite
+ get() = requireNotNull(_sprite) { "null sprite for block '${params.key}'" }
+
private val currentAnimationFrame: Int
get() {
return params.animationInfo?.let { animInfo ->
} ?: 0
}
+ override fun hashCode(): Int {
+ return params.key.hashCode()
+ }
+
+ override fun equals(other: Any?): Boolean {
+ return params.key == (other as Item).params.key
+ }
+
fun initialize() {
initAnimation()
initSprite()
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) }
+ }
}
}
}
private fun initSprite() {
- sprite = animation?.get(0) ?: params.texture?.let { tex ->
+ _sprite = animation?.get(0) ?: params.texture?.let { tex ->
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) }
+ }
}
}
fun requireSprite() = requireNotNull(sprite)
fun draw(spriter: SpriteBatch, x: Float, y: Float) {
- sprite?.apply {
+ sprite.apply {
setBounds(
/* x = */ x + params.spriteMargins.left,
/* y = */ y + params.spriteMargins.top,
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
+ }
+
fun getRectangle(x: Int, y: Int): Rectangle {
return Rectangle(
/* x = */ x * 16f + params.collisionMargins.left,
)
}
+ sealed class Container() : Block()
+ data class None(
+ override val params: CommonBlockParams
+ ) : Block()
data class Normal(
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,
+ val otherPartBlockKey: String,
): Block()
- abstract class Fluid: Block() {
- abstract val statesCount: Int
+ sealed class Fluid: Block() {
+ abstract val state: Int
}
data class Water(
override val params: CommonBlockParams,
- override val statesCount: Int
+ override val state: Int,
) : Fluid()
data class Lava(
override val params: CommonBlockParams,
- override val statesCount: Int
+ override val state: Int,
) : Fluid()
/* Legacy accessors below */
@Deprecated(LEGACY_ACCESSOR_DEPRECATION) fun isTransparent() = params.isTransparent
@Deprecated(LEGACY_ACCESSOR_DEPRECATION) fun getTexture() = sprite
-
companion object {
private const val LEGACY_ACCESSOR_DEPRECATION = "legacy accessors will be removed"
private const val ANIMATION_FRAME_DURATION_MS = 100L