DEADSOFTWARE

Add crafting
[cavedroid.git] / core / src / main / kotlin / 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 Usable) }
50 return this is Usable
51 }
53 fun isFood(): Boolean {
54 contract { returns(true) implies (this@Item is Food) }
55 return this is Food
56 }
58 @JvmOverloads
59 fun toInventoryItem(amount: Int = 1): InventoryItem {
60 return InventoryItem(this, amount)
61 }
63 data class Normal(
64 override val params: CommonItemParams,
65 override val sprite: Sprite
66 ) : Item()
68 sealed class Tool : Item() {
69 abstract val mobDamageMultiplier: Float
70 abstract val blockDamageMultiplier: Float
71 abstract val level: Int
72 }
74 sealed class Placeable : Item() {
75 abstract val block: BlockModel
76 override val sprite: Sprite get() = block.sprite
77 }
79 data class None(
80 override val params: CommonItemParams,
81 ): Item() {
82 override val sprite: Sprite
83 get() = throw IllegalAccessException("Trying to get sprite of None")
84 }
86 data class Usable(
87 override val params: CommonItemParams,
88 override val sprite: Sprite,
89 val useActionKey: String
90 ) : Item()
92 data class Block(
93 override val params: CommonItemParams,
94 override val block: BlockModel
95 ) : Placeable()
97 data class Slab(
98 override val params: CommonItemParams,
99 val topPartBlock: BlockModel.Slab,
100 val bottomPartBlock: BlockModel.Slab
101 ) : Placeable() {
102 override val block get() = bottomPartBlock
105 data class Sword(
106 override val params: CommonItemParams,
107 override val sprite: Sprite,
108 override val mobDamageMultiplier: Float,
109 override val blockDamageMultiplier: Float,
110 override val level: Int,
111 ) : Tool()
113 data class Shovel(
114 override val params: CommonItemParams,
115 override val sprite: Sprite,
116 override val mobDamageMultiplier: Float,
117 override val blockDamageMultiplier: Float,
118 override val level: Int,
119 ) : Tool()
121 data class Axe(
122 override val params: CommonItemParams,
123 override val sprite: Sprite,
124 override val mobDamageMultiplier: Float,
125 override val blockDamageMultiplier: Float,
126 override val level: Int,
127 ) : Tool()
129 data class Pickaxe(
130 override val params: CommonItemParams,
131 override val sprite: Sprite,
132 override val mobDamageMultiplier: Float,
133 override val blockDamageMultiplier: Float,
134 override val level: Int,
135 ) : Tool()
137 data class Shears(
138 override val params: CommonItemParams,
139 override val sprite: Sprite,
140 override val mobDamageMultiplier: Float,
141 override val blockDamageMultiplier: Float,
142 override val level: Int,
143 ) : Tool()
145 data class Food(
146 override val params: CommonItemParams,
147 override val sprite: Sprite,
148 val heal: Int,
149 ) : Item()