DEADSOFTWARE

Update version script
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / mobs / player / Inventory.kt
1 package ru.deadsoftware.cavedroid.game.mobs.player
3 import ru.deadsoftware.cavedroid.game.GameItemsHolder
4 import ru.deadsoftware.cavedroid.game.model.item.InventoryItem
5 import ru.deadsoftware.cavedroid.game.model.item.Item
6 import ru.deadsoftware.cavedroid.game.objects.Drop
7 import java.io.Serializable
9 class Inventory(
10 val size: Int,
11 val hotbarSize: Int,
12 gameItemsHolder: GameItemsHolder
13 ) : Serializable {
15 @Transient
16 private lateinit var fallbackItem: InventoryItem
18 init {
19 fallbackItem = gameItemsHolder.fallbackItem.toInventoryItem()
20 if (size < 0 || hotbarSize < 0 || hotbarSize > size) {
21 throw IllegalArgumentException("Invalid inventory sizes: hotbarSize=$hotbarSize; size=$size")
22 }
23 }
25 private val _items = Array(size) { InventoryItem(gameItemsHolder.fallbackItem) }
27 val items get() = _items.asList() as MutableList<InventoryItem>
29 val hotbarItems get() = items.subList(0, hotbarSize)
31 var activeSlot = 0
32 set(value) {
33 if (value in 0 ..< hotbarSize) {
34 field = value
35 }
36 }
38 val activeItem get() = items[activeSlot]
40 fun initItems(gameItemsHolder: GameItemsHolder) {
41 fallbackItem = gameItemsHolder.fallbackItem.toInventoryItem()
42 items.forEach { item ->
43 item.init(gameItemsHolder)
44 }
45 }
47 private fun getItemPickSlot(item: Item): Int {
48 for (i in items.indices) {
49 val inventoryItem = items[i]
51 if (item == inventoryItem.item && inventoryItem.canBeAdded()) {
52 return i
53 }
55 if (inventoryItem.item.isNone()) {
56 return i
57 }
58 }
60 return -1
61 }
63 fun canPickItem(item: Item): Boolean {
64 return getItemPickSlot(item) >= 0
65 }
67 fun pickDrop(drop: Drop) {
68 val slot = getItemPickSlot(drop.item).takeIf { it >= 0 } ?: return
69 val inventoryItem = items[slot]
71 if (inventoryItem.item == drop.item) {
72 inventoryItem.add()
73 drop.pickedUp = true
74 } else {
75 _items[slot] = drop.item.toInventoryItem()
76 drop.pickedUp = true
77 }
78 }
80 fun addItem(item: Item) {
81 _items.copyInto(
82 destination = _items,
83 destinationOffset = 1,
84 startIndex = 0,
85 endIndex = size - 1
86 )
88 _items[0] = item.toInventoryItem(item.params.maxStack)
89 }
91 @JvmOverloads
92 fun decreaseCurrentItemAmount(count: Int = 1) {
93 activeItem.subtract(count)
94 if (activeItem.amount <= 0) {
95 _items[activeSlot] = fallbackItem
96 }
97 }
98 }