DEADSOFTWARE

d99a90ec60e8762c5e6b0c16f4fdfeccb02b361c
[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 ru.deadsoftware.cavedroid.game.ui.TooltipManager
8 import java.io.Serializable
10 class Inventory(
11 val size: Int,
12 val hotbarSize: Int,
13 gameItemsHolder: GameItemsHolder,
14 tooltipManager: TooltipManager,
15 ) : Serializable {
17 @Transient
18 private lateinit var tooltipManager: TooltipManager
20 @Transient
21 private lateinit var fallbackItem: InventoryItem
23 init {
24 fallbackItem = gameItemsHolder.fallbackItem.toInventoryItem()
25 this.tooltipManager = tooltipManager
27 if (size < 0 || hotbarSize < 0 || hotbarSize > size) {
28 throw IllegalArgumentException("Invalid inventory sizes: hotbarSize=$hotbarSize; size=$size")
29 }
30 }
32 private val _items = Array(size) { InventoryItem(gameItemsHolder.fallbackItem) }
34 val items get() = _items.asList() as MutableList<InventoryItem>
36 val hotbarItems get() = items.subList(0, hotbarSize)
38 var activeSlot = 0
39 set(value) {
40 if (value in 0 ..< hotbarSize) {
41 field = value
42 showCurrentItemTooltip()
43 }
44 }
46 fun showCurrentItemTooltip() {
47 tooltipManager.showHotbarTooltip(activeItem.item.params.name)
48 }
50 val activeItem get() = _items[activeSlot]
52 fun initItems(gameItemsHolder: GameItemsHolder, tooltipManager: TooltipManager) {
53 this.tooltipManager = tooltipManager
54 fallbackItem = gameItemsHolder.fallbackItem.toInventoryItem()
55 _items.forEach { item ->
56 item.init(gameItemsHolder)
57 }
58 }
60 private fun getItemPickSlot(item: Item): Int {
61 for (i in _items.indices) {
62 val inventoryItem = _items[i]
64 if (item == inventoryItem.item && inventoryItem.canBeAdded()) {
65 return i
66 }
67 }
69 for (i in _items.indices) {
70 val inventoryItem = _items[i]
72 if (inventoryItem.item.isNone()) {
73 return i
74 }
75 }
77 return -1
78 }
80 fun canPickItem(item: Item): Boolean {
81 return getItemPickSlot(item) >= 0
82 }
84 fun pickDrop(drop: Drop) {
85 val slot = getItemPickSlot(drop.item).takeIf { it >= 0 } ?: return
86 val inventoryItem = _items[slot]
88 if (inventoryItem.item == drop.item) {
89 inventoryItem.add(drop.amount)
90 } else {
91 _items[slot] = drop.item.toInventoryItem(drop.amount)
92 if (slot == activeSlot) {
93 showCurrentItemTooltip()
94 }
95 }
97 drop.pickedUp = true
98 }
100 fun addItem(item: Item) {
101 _items.copyInto(
102 destination = _items,
103 destinationOffset = 1,
104 startIndex = 0,
105 endIndex = size - 1
108 _items[0] = item.toInventoryItem(item.params.maxStack)
109 showCurrentItemTooltip()
112 @JvmOverloads
113 fun decreaseItemAmount(slot: Int, count: Int = 1) {
114 val item = _items[slot]
115 item.subtract(count)
116 if (item.amount <= 0) {
117 _items[slot] = fallbackItem
121 @JvmOverloads
122 fun decreaseCurrentItemAmount(count: Int = 1) {
123 decreaseItemAmount(activeSlot, count)