DEADSOFTWARE

Add spruce and snow to winter biome
[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 init {
16 if (size < 0 || hotbarSize < 0 || hotbarSize > size) {
17 throw IllegalArgumentException("Invalid inventory sizes: hotbarSize=$hotbarSize; size=$size")
18 }
19 }
21 private val _items = Array(size) { InventoryItem(gameItemsHolder.fallbackItem) }
23 val items get() = _items.asList() as MutableList<InventoryItem>
25 val hotbarItems get() = items.subList(0, hotbarSize)
27 var activeSlot = 0
28 set(value) {
29 if (value in 0 ..< hotbarSize) {
30 field = value
31 }
32 }
34 val activeItem get() = items[activeSlot]
36 fun initItems(gameItemsHolder: GameItemsHolder) {
37 items.forEach { item ->
38 item.init(gameItemsHolder)
39 }
40 }
42 private fun getItemPickSlot(item: Item): Int {
43 for (i in items.indices) {
44 val inventoryItem = items[i]
46 if (item == inventoryItem.item && inventoryItem.canBeAdded()) {
47 return i
48 }
50 if (inventoryItem.item.isNone()) {
51 return i
52 }
53 }
55 return -1
56 }
58 fun canPickItem(item: Item): Boolean {
59 return getItemPickSlot(item) >= 0
60 }
62 fun pickDrop(drop: Drop) {
63 val slot = getItemPickSlot(drop.item).takeIf { it >= 0 } ?: return
64 val inventoryItem = items[slot]
66 if (inventoryItem.item == drop.item) {
67 inventoryItem.add()
68 drop.pickedUp = true
69 } else {
70 _items[slot] = drop.item.toInventoryItem()
71 drop.pickedUp = true
72 }
73 }
75 fun addItem(item: Item) {
76 _items.copyInto(
77 destination = _items,
78 destinationOffset = 1,
79 startIndex = 0,
80 endIndex = size - 1
81 )
83 _items[0] = item.toInventoryItem(item.params.maxStack)
84 }
85 }