DEADSOFTWARE

7eeb9403a88a636f843998a18b98188bbedaf2c0
[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 }
38 fun isTool(): Boolean {
39 contract { returns(true) implies (this@Item is Tool) }
40 return this is Tool
41 }
43 fun isShears(): Boolean {
44 contract { returns(true) implies (this@Item is Shears) }
45 return this is Shears
46 }
48 fun isUsable(): Boolean {
49 contract { returns(true) implies (this@Item is Placeable) }
50 return this is Placeable
51 }
53 @JvmOverloads
54 fun toInventoryItem(amount: Int = 1): InventoryItem {
55 return InventoryItem(this, amount)
56 }
58 sealed class Tool : Item() {
59 abstract val mobDamageMultiplier: Float
60 abstract val blockDamageMultiplier: Float
61 abstract val level: Int
62 }
64 sealed class Usable : Item() {
65 abstract val useActionKey: String
66 }
68 sealed class Placeable : Item() {
69 abstract val block: BlockModel
70 override val sprite: Sprite get() = block.sprite
71 }
73 data class None(
74 override val params: CommonItemParams,
75 ): Item() {
76 override val sprite: Sprite
77 get() = throw IllegalAccessException("Trying to get sprite of None")
78 }
80 data class Block(
81 override val params: CommonItemParams,
82 override val block: BlockModel
83 ) : Placeable()
85 data class Slab(
86 override val params: CommonItemParams,
87 val topPartBlock: BlockModel.Slab,
88 val bottomPartBlock: BlockModel.Slab
89 ) : Placeable() {
90 override val block get() = bottomPartBlock
91 }
93 data class Sword(
94 override val params: CommonItemParams,
95 override val sprite: Sprite,
96 override val mobDamageMultiplier: Float,
97 override val blockDamageMultiplier: Float,
98 override val level: Int,
99 ) : Tool()
101 data class Shovel(
102 override val params: CommonItemParams,
103 override val sprite: Sprite,
104 override val mobDamageMultiplier: Float,
105 override val blockDamageMultiplier: Float,
106 override val level: Int,
107 ) : Tool()
109 data class Axe(
110 override val params: CommonItemParams,
111 override val sprite: Sprite,
112 override val mobDamageMultiplier: Float,
113 override val blockDamageMultiplier: Float,
114 override val level: Int,
115 ) : Tool()
117 data class Pickaxe(
118 override val params: CommonItemParams,
119 override val sprite: Sprite,
120 override val mobDamageMultiplier: Float,
121 override val blockDamageMultiplier: Float,
122 override val level: Int,
123 ) : Tool()
125 data class Shears(
126 override val params: CommonItemParams,
127 override val sprite: Sprite,
128 override val mobDamageMultiplier: Float,
129 override val blockDamageMultiplier: Float,
130 override val level: Int,
131 ) : Tool()
133 data class Bucket(
134 override val params: CommonItemParams,
135 override val sprite: Sprite,
136 override val useActionKey: String
137 ) : Usable()