X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=core%2Fsrc%2Fru%2Fdeadsoftware%2Fcavedroid%2Fgame%2Fmobs%2Fplayer%2FInventory.kt;h=3012d6675a3346bed978a5183b342120d31ab0b9;hb=6bb7e1d207c640ff3b8e41ce2fb1c6203985bdb1;hp=31f4c7801a4b35c4756879ca5a60d762975ca89a;hpb=c1b8f5c93482cb9933dd608c48f41622ce2994c6;p=cavedroid.git diff --git a/core/src/ru/deadsoftware/cavedroid/game/mobs/player/Inventory.kt b/core/src/ru/deadsoftware/cavedroid/game/mobs/player/Inventory.kt index 31f4c78..3012d66 100644 --- a/core/src/ru/deadsoftware/cavedroid/game/mobs/player/Inventory.kt +++ b/core/src/ru/deadsoftware/cavedroid/game/mobs/player/Inventory.kt @@ -3,16 +3,29 @@ package ru.deadsoftware.cavedroid.game.mobs.player import ru.deadsoftware.cavedroid.game.GameItemsHolder import ru.deadsoftware.cavedroid.game.model.item.InventoryItem import ru.deadsoftware.cavedroid.game.model.item.Item -import ru.deadsoftware.cavedroid.game.objects.Drop +import ru.deadsoftware.cavedroid.game.objects.drop.Drop +import ru.deadsoftware.cavedroid.game.ui.TooltipManager import java.io.Serializable class Inventory( val size: Int, val hotbarSize: Int, - gameItemsHolder: GameItemsHolder + gameItemsHolder: GameItemsHolder, + tooltipManager: TooltipManager, ) : Serializable { + @Suppress("UNNECESSARY_LATEINIT") + @Transient + private lateinit var tooltipManager: TooltipManager + + @Suppress("UNNECESSARY_LATEINIT") + @Transient + private lateinit var fallbackItem: InventoryItem + init { + fallbackItem = gameItemsHolder.fallbackItem.toInventoryItem() + this.tooltipManager = tooltipManager + if (size < 0 || hotbarSize < 0 || hotbarSize > size) { throw IllegalArgumentException("Invalid inventory sizes: hotbarSize=$hotbarSize; size=$size") } @@ -28,24 +41,37 @@ class Inventory( set(value) { if (value in 0 ..< hotbarSize) { field = value + showCurrentItemTooltip() } } - val activeItem get() = items[activeSlot] + fun showCurrentItemTooltip() { + tooltipManager.showHotbarTooltip(activeItem.item.params.name) + } + + val activeItem get() = _items[activeSlot] - fun initItems(gameItemsHolder: GameItemsHolder) { - items.forEach { item -> + fun initItems(gameItemsHolder: GameItemsHolder, tooltipManager: TooltipManager) { + this.tooltipManager = tooltipManager + fallbackItem = gameItemsHolder.fallbackItem.toInventoryItem() + _items.forEach { item -> item.init(gameItemsHolder) } } - private fun getItemPickSlot(item: Item): Int { - for (i in items.indices) { - val inventoryItem = items[i] + private fun getItemPickSlot(drop: Drop): Int { + val item = drop.item + + for (i in _items.indices) { + val inventoryItem = _items[i] if (item == inventoryItem.item && inventoryItem.canBeAdded()) { return i } + } + + for (i in _items.indices) { + val inventoryItem = _items[i] if (inventoryItem.item.isNone()) { return i @@ -55,19 +81,29 @@ class Inventory( return -1 } - fun canPickItem(item: Item): Boolean { - return getItemPickSlot(item) >= 0 + fun canPickItem(drop: Drop): Boolean { + return getItemPickSlot(drop) >= 0 } fun pickDrop(drop: Drop) { - val slot = getItemPickSlot(drop.item).takeIf { it >= 0 } ?: return - val inventoryItem = items[slot] + val slot = getItemPickSlot(drop).takeIf { it >= 0 } ?: return + val inventoryItem = _items[slot] if (inventoryItem.item == drop.item) { - inventoryItem.add() - drop.pickedUp = true + if (inventoryItem.canBeAdded(drop.amount)) { + inventoryItem.add(drop.amount) + drop.pickedUp = true + } else { + val addCount = inventoryItem.item.params.maxStack - inventoryItem.amount + inventoryItem.add(addCount) + drop.subtract(addCount) + pickDrop(drop) + } } else { - _items[slot] = drop.item.toInventoryItem() + _items[slot] = drop.item.toInventoryItem(drop.amount) + if (slot == activeSlot) { + showCurrentItemTooltip() + } drop.pickedUp = true } } @@ -80,6 +116,21 @@ class Inventory( endIndex = size - 1 ) - _items[0] = item.toInventoryItem() + _items[0] = item.toInventoryItem(item.params.maxStack) + showCurrentItemTooltip() + } + + @JvmOverloads + fun decreaseItemAmount(slot: Int, count: Int = 1) { + val item = _items[slot] + item.subtract(count) + if (item.amount <= 0) { + _items[slot] = fallbackItem + } + } + + @JvmOverloads + fun decreaseCurrentItemAmount(count: Int = 1) { + decreaseItemAmount(activeSlot, count) } } \ No newline at end of file