DEADSOFTWARE

00efbf7bde3f51e98a97d92f3b19918aee64426b
[cavedroid.git] /
1 package ru.fredboy.cavedroid.ux.controls.input.handler.mouse
2
3 import ru.fredboy.cavedroid.common.di.GameScope
4 import ru.fredboy.cavedroid.domain.assets.usecase.GetTextureRegionByNameUseCase
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.entity.container.model.Furnace
8 import ru.fredboy.cavedroid.game.controller.mob.MobController
9 import ru.fredboy.cavedroid.game.window.GameWindowType
10 import ru.fredboy.cavedroid.game.window.GameWindowsConfigs
11 import ru.fredboy.cavedroid.game.window.GameWindowsManager
12 import ru.fredboy.cavedroid.game.window.inventory.FurnaceInventoryWindow
13 import ru.fredboy.cavedroid.ux.controls.input.action.MouseInputAction
14 import ru.fredboy.cavedroid.ux.controls.input.annotation.BindMouseInputHandler
15 import javax.inject.Inject
16
17 @GameScope
18 @BindMouseInputHandler
19 class SelectFurnaceInventoryItemMouseInputHandler @Inject constructor(
20 private val gameWindowsManager: GameWindowsManager,
21 private val mobController: MobController,
22 private val textureRegions: GetTextureRegionByNameUseCase,
23 itemsRepository: ItemsRepository
24 ) : AbstractInventoryItemsMouseInputHandler(itemsRepository, gameWindowsManager, GameWindowType.FURNACE) {
25
26 override val windowTexture get() = requireNotNull(textureRegions["furnace"])
27
28 private fun handleInsideInventoryGrid(action: MouseInputAction, xOnGrid: Int, yOnGrid: Int) {
29 val window = gameWindowsManager.currentWindow as FurnaceInventoryWindow
30
31 var itemIndex = xOnGrid + yOnGrid * GameWindowsConfigs.Furnace.itemsInRow
32 itemIndex += GameWindowsConfigs.Furnace.hotbarCells
33
34 if (itemIndex >= mobController.player.inventory.size) {
35 itemIndex -= mobController.player.inventory.size
36 }
37
38 handleInsidePlaceableCell(action, mobController.player.inventory.items, window, itemIndex)
39 }
40
41 private fun handleInsideFuel(action: MouseInputAction) {
42 val window = gameWindowsManager.currentWindow as FurnaceInventoryWindow
43
44 if (!window.selectedItem.isNoneOrNull() && window.selectedItem?.item?.params?.burningTimeMs == null) {
45 return
46 }
47
48 handleInsidePlaceableCell(action, window.furnace.items, window, Furnace.FUEL_INDEX)
49 }
50
51 private fun handleInsideInput(action: MouseInputAction) {
52 val window = gameWindowsManager.currentWindow as FurnaceInventoryWindow
53
54 handleInsidePlaceableCell(action, window.furnace.items, window, Furnace.INPUT_INDEX)
55 }
56
57 private fun handleInsideResult(action: MouseInputAction) {
58 val window = gameWindowsManager.currentWindow as FurnaceInventoryWindow
59
60 handleInsideCraftResultCell(action, window.furnace.items, window, Furnace.RESULT_INDEX)
61 }
62
63 override fun handle(action: MouseInputAction) {
64 val texture = windowTexture
65
66 val xOnWindow = action.screenX - (action.cameraViewport.width / 2 - texture.regionWidth / 2)
67 val yOnWindow = action.screenY - (action.cameraViewport.height / 2 - texture.regionHeight / 2)
68
69 val xOnGrid = (xOnWindow - GameWindowsConfigs.Furnace.itemsGridMarginLeft) /
70 GameWindowsConfigs.Furnace.itemsGridColWidth
71 val yOnGrid = (yOnWindow - GameWindowsConfigs.Furnace.itemsGridMarginTop) /
72 GameWindowsConfigs.Furnace.itemsGridRowHeight
73
74 val isInsideInput = xOnWindow > GameWindowsConfigs.Furnace.smeltInputMarginLeft &&
75 xOnWindow < GameWindowsConfigs.Furnace.smeltInputMarginLeft + GameWindowsConfigs.Furnace.itemsGridColWidth &&
76 yOnWindow > GameWindowsConfigs.Furnace.smeltInputMarginTop &&
77 yOnWindow < GameWindowsConfigs.Furnace.smeltInputMarginTop + GameWindowsConfigs.Furnace.itemsGridRowHeight
78
79 val isInsideFuel = xOnWindow > GameWindowsConfigs.Furnace.smeltFuelMarginLeft &&
80 xOnWindow < GameWindowsConfigs.Furnace.smeltFuelMarginLeft + GameWindowsConfigs.Furnace.itemsGridColWidth &&
81 yOnWindow > GameWindowsConfigs.Furnace.smeltFuelMarginTop &&
82 yOnWindow < GameWindowsConfigs.Furnace.smeltFuelMarginTop + GameWindowsConfigs.Furnace.itemsGridRowHeight
83
84 val isInsideResult = xOnWindow > GameWindowsConfigs.Furnace.smeltResultOffsetX &&
85 xOnWindow < GameWindowsConfigs.Furnace.smeltResultOffsetX + GameWindowsConfigs.Furnace.itemsGridColWidth &&
86 yOnWindow > GameWindowsConfigs.Furnace.smeltResultOffsetY &&
87 yOnWindow < GameWindowsConfigs.Furnace.smeltResultOffsetY + GameWindowsConfigs.Furnace.itemsGridRowHeight
88
89 val isInsideInventoryGrid = xOnGrid >= 0 && xOnGrid < GameWindowsConfigs.Furnace.itemsInRow &&
90 yOnGrid >= 0 && yOnGrid < GameWindowsConfigs.Furnace.itemsInCol
91
92 if (isInsideInventoryGrid) {
93 handleInsideInventoryGrid(action, xOnGrid.toInt(), yOnGrid.toInt())
94 } else if (isInsideFuel) {
95 handleInsideFuel(action)
96 } else if (isInsideInput) {
97 handleInsideInput(action)
98 } else if (isInsideResult) {
99 handleInsideResult(action)
100 }
101
102 }
103 }