DEADSOFTWARE

Add top slabs
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / model / item / Item.kt
1 package ru.deadsoftware.cavedroid.game.model.item
3 import com.badlogic.gdx.graphics.g2d.Sprite
4 import ru.deadsoftware.cavedroid.game.model.block.Block
5 import ru.deadsoftware.cavedroid.game.model.block.Block as BlockModel
6 import kotlin.contracts.ExperimentalContracts
7 import kotlin.contracts.contract
9 @OptIn(ExperimentalContracts::class)
10 sealed class Item {
12 abstract val params: CommonItemParams
13 abstract val sprite: Sprite
15 override fun hashCode(): Int {
16 return params.key.hashCode()
17 }
19 override fun equals(other: Any?): Boolean {
20 return params.key == (other as Item).params.key
21 }
23 fun isNone(): Boolean {
24 contract { returns(true) implies (this@Item is None) }
25 return this is None
26 }
28 fun isPlaceable(): Boolean {
29 contract { returns(true) implies (this@Item is Placeable) }
30 return this is Placeable
31 }
33 fun isSlab(): Boolean {
34 contract { returns(true) implies (this@Item is Slab) }
35 return this is Slab
36 }
39 fun isTool(): Boolean {
40 contract { returns(true) implies (this@Item is Tool) }
41 return this is Tool
42 }
44 fun isUsable(): Boolean {
45 contract { returns(true) implies (this@Item is Placeable) }
46 return this is Placeable
47 }
49 @JvmOverloads
50 fun toInventoryItem(amount: Int = 1): InventoryItem {
51 return InventoryItem(this, amount)
52 }
54 sealed class Tool : Item() {
55 abstract val mobDamageMultiplier: Float
56 abstract val blockDamageMultiplier: Float
57 }
59 sealed class Usable : Item() {
60 abstract val useActionKey: String
61 }
63 sealed class Placeable : Item() {
64 abstract val block: BlockModel
65 override val sprite: Sprite get() = block.sprite
66 }
68 data class None(
69 override val params: CommonItemParams,
70 ): Item() {
71 override val sprite: Sprite
72 get() = throw IllegalAccessException("Trying to get sprite of None")
73 }
75 data class Block(
76 override val params: CommonItemParams,
77 override val block: BlockModel
78 ) : Placeable()
80 data class Slab(
81 override val params: CommonItemParams,
82 val topPartBlock: BlockModel.Slab,
83 val bottomPartBlock: BlockModel.Slab
84 ) : Placeable() {
85 override val block get() = bottomPartBlock
86 }
88 data class Sword(
89 override val params: CommonItemParams,
90 override val sprite: Sprite,
91 override val mobDamageMultiplier: Float,
92 override val blockDamageMultiplier: Float,
93 ) : Tool()
95 data class Shovel(
96 override val params: CommonItemParams,
97 override val sprite: Sprite,
98 override val mobDamageMultiplier: Float,
99 override val blockDamageMultiplier: Float,
100 ) : Tool()
102 data class Bucket(
103 override val params: CommonItemParams,
104 override val sprite: Sprite,
105 override val useActionKey: String
106 ) : Usable()