DEADSOFTWARE

16e371c2db2d1805fa174df9ed5abc4a0bc2f7a1
[cavedroid.git] /
1 package ru.fredboy.cavedroid.ux.controls.input.handler.mouse
2
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
15
16 abstract class AbstractInventoryItemsMouseInputHandler(
17 private val itemsRepository: ItemsRepository,
18 private val gameWindowsManager: GameWindowsManager,
19 private val windowType: GameWindowType,
20 ) : IMouseInputHandler {
21
22 protected abstract val windowTexture: TextureRegion
23
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)
31 }
32
33 protected fun updateCraftResult(window: AbstractInventoryWindowWithCraftGrid) {
34 window.craftResult = itemsRepository.getCraftingResult(window.craftingItems.map(InventoryItem::item))
35 }
36
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--
41 } else {
42 window.craftingItems[i] = itemsRepository.fallbackItem.toInventoryItem()
43 }
44 }
45 }
46
47 protected fun handleInsidePlaceableCell(
48 action: MouseInputAction,
49 items: MutableList<InventoryItem>,
50 window: AbstractInventoryWindow,
51 index: Int
52 ) {
53 if (action.actionKey is MouseInputActionKey.Screen) {
54 if (!action.actionKey.touchUp) {
55 window.onLeftCLick(items, itemsRepository, index, action.actionKey.pointer)
56 } else {
57 if (action.actionKey.pointer == window.selectItemPointer) {
58 window.onLeftCLick(items, itemsRepository, index, action.actionKey.pointer)
59 } else {
60 window.onRightClick(items, itemsRepository, index)
61 }
62 }
63 } else if (action.actionKey is MouseInputActionKey.Left) {
64 window.onLeftCLick(items, itemsRepository, index)
65 } else {
66 window.onRightClick(items, itemsRepository, index)
67 }
68 }
69
70 protected fun handleInsideCraftResultCell(
71 action: MouseInputAction,
72 items: MutableList<InventoryItem>,
73 window: AbstractInventoryWindow,
74 index: Int
75 ) {
76 val selectedItem = window.selectedItem
77
78 if (!selectedItem.isNoneOrNull() && (selectedItem.item != items[index].item ||
79 !selectedItem.canBeAdded(items[index].amount))) {
80 return
81 }
82
83 if (!selectedItem.isNoneOrNull()) {
84 selectedItem.amount += items[index].amount
85 items[index] = itemsRepository.fallbackItem.toInventoryItem()
86 } else {
87 if (action.actionKey is MouseInputActionKey.Screen) {
88 if (!action.actionKey.touchUp) {
89 window.onLeftCLick(items, itemsRepository, index, action.actionKey.pointer)
90 }
91 } else if (action.actionKey is MouseInputActionKey.Left) {
92 window.onLeftCLick(items, itemsRepository, index)
93 }
94 }
95
96 if (window is AbstractInventoryWindowWithCraftGrid) {
97 reduceCraftItems(window)
98 }
99
100 }
101
102 }