1 package ru.fredboy.cavedroid.ux.controls.input.handler.mouse
3 import com.badlogic.gdx.graphics.g2d.TextureRegion
4 import ru.fredboy.cavedroid.domain.items.model.inventory.InventoryItem
5 import ru.fredboy.cavedroid.domain.items.model.inventory.InventoryItem.Companion.isNoneOrNull
6 import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
7 import ru.fredboy.cavedroid.game.window.GameWindowType
8 import ru.fredboy.cavedroid.game.window.GameWindowsManager
9 import ru.fredboy.cavedroid.game.window.inventory.AbstractInventoryWindow
10 import ru.fredboy.cavedroid.game.window.inventory.AbstractInventoryWindowWithCraftGrid
11 import ru.fredboy.cavedroid.ux.controls.input.IMouseInputHandler
12 import ru.fredboy.cavedroid.ux.controls.input.action.MouseInputAction
13 import ru.fredboy.cavedroid.ux.controls.input.action.keys.MouseInputActionKey
14 import ru.fredboy.cavedroid.ux.controls.input.isInsideWindow
16 abstract class AbstractInventoryItemsMouseInputHandler(
17 private val itemsRepository: ItemsRepository,
18 private val gameWindowsManager: GameWindowsManager,
19 private val windowType: GameWindowType,
20 ) : IMouseInputHandler {
22 protected abstract val windowTexture: TextureRegion
24 override fun checkConditions(action: MouseInputAction): Boolean {
25 return gameWindowsManager.currentWindowType == windowType &&
26 isInsideWindow(action, windowTexture) &&
27 (action.actionKey is MouseInputActionKey.Left ||
28 action.actionKey is MouseInputActionKey.Right ||
29 action.actionKey is MouseInputActionKey.Screen)
30 && (action.actionKey.touchUp || action.actionKey is MouseInputActionKey.Screen)
33 protected fun updateCraftResult(window: AbstractInventoryWindowWithCraftGrid) {
34 window.craftResult = itemsRepository.getCraftingResult(window.craftingItems.map(InventoryItem::item))
37 private fun reduceCraftItems(window: AbstractInventoryWindowWithCraftGrid) {
38 for (i in window.craftingItems.indices) {
39 if (window.craftingItems[i].amount > 1) {
40 window.craftingItems[i].amount--
42 window.craftingItems[i] = itemsRepository.fallbackItem.toInventoryItem()
47 protected fun handleInsidePlaceableCell(
48 action: MouseInputAction,
49 items: MutableList<InventoryItem>,
50 window: AbstractInventoryWindow,
53 if (action.actionKey is MouseInputActionKey.Screen) {
54 if (!action.actionKey.touchUp) {
55 window.onLeftCLick(items, itemsRepository, index, action.actionKey.pointer)
57 if (action.actionKey.pointer == window.selectItemPointer) {
58 window.onLeftCLick(items, itemsRepository, index, action.actionKey.pointer)
60 window.onRightClick(items, itemsRepository, index)
63 } else if (action.actionKey is MouseInputActionKey.Left) {
64 window.onLeftCLick(items, itemsRepository, index)
66 window.onRightClick(items, itemsRepository, index)
70 protected fun handleInsideCraftResultCell(
71 action: MouseInputAction,
72 items: MutableList<InventoryItem>,
73 window: AbstractInventoryWindow,
76 val selectedItem = window.selectedItem
78 if (!selectedItem.isNoneOrNull() && (selectedItem.item != items[index].item ||
79 !selectedItem.canBeAdded(items[index].amount))) {
83 if (!selectedItem.isNoneOrNull()) {
84 selectedItem.amount += items[index].amount
85 items[index] = itemsRepository.fallbackItem.toInventoryItem()
87 if (action.actionKey is MouseInputActionKey.Screen) {
88 if (!action.actionKey.touchUp) {
89 window.onLeftCLick(items, itemsRepository, index, action.actionKey.pointer)
91 } else if (action.actionKey is MouseInputActionKey.Left) {
92 window.onLeftCLick(items, itemsRepository, index)
96 if (window is AbstractInventoryWindowWithCraftGrid) {
97 reduceCraftItems(window)