DEADSOFTWARE

81ef0ce118ea10d6bf7fffeb51fc706a07c50d56
[cavedroid.git] /
1 package ru.fredboy.cavedroid.ux.controls.input.handler.mouse
2
3 import com.badlogic.gdx.utils.Timer
4 import ru.fredboy.cavedroid.common.di.GameScope
5 import ru.fredboy.cavedroid.domain.assets.usecase.GetTextureRegionByNameUseCase
6 import ru.fredboy.cavedroid.domain.items.model.item.Item
7 import ru.fredboy.cavedroid.entity.drop.model.Drop
8 import ru.fredboy.cavedroid.entity.mob.model.Player
9 import ru.fredboy.cavedroid.game.controller.drop.DropController
10 import ru.fredboy.cavedroid.game.controller.mob.MobController
11 import ru.fredboy.cavedroid.game.window.GameWindowType
12 import ru.fredboy.cavedroid.game.window.GameWindowsManager
13 import ru.fredboy.cavedroid.ux.controls.input.IMouseInputHandler
14 import ru.fredboy.cavedroid.ux.controls.input.action.MouseInputAction
15 import ru.fredboy.cavedroid.ux.controls.input.action.keys.MouseInputActionKey
16 import ru.fredboy.cavedroid.ux.controls.input.annotation.BindMouseInputHandler
17 import ru.fredboy.cavedroid.ux.controls.input.handler.keyboard.DropItemKeyboardInputHandler.Companion.DROP_DISTANCE
18 import ru.fredboy.cavedroid.ux.controls.input.isInsideHotbar
19 import javax.inject.Inject
20
21 @GameScope
22 @BindMouseInputHandler
23 class HotbarMouseInputHandler @Inject constructor(
24 private val gameWindowsManager: GameWindowsManager,
25 private val mobController: MobController,
26 private val dropController: DropController,
27 private val textureRegions: GetTextureRegionByNameUseCase,
28 ) : IMouseInputHandler {
29
30 private val hotbarTexture get() = requireNotNull(textureRegions["hotbar"])
31
32 private var buttonHoldTask: Timer.Task? = null
33
34 override fun checkConditions(action: MouseInputAction): Boolean {
35 return buttonHoldTask?.isScheduled == true ||
36 ((action.actionKey is MouseInputActionKey.Left || action.actionKey is MouseInputActionKey.Screen)
37 && action.isInsideHotbar(textureRegions)
38 || action.actionKey is MouseInputActionKey.Scroll) &&
39 gameWindowsManager.currentWindowType == GameWindowType.NONE
40 }
41
42 private fun cancelHold() {
43 buttonHoldTask?.cancel()
44 buttonHoldTask = null
45 }
46
47 private fun createDrop(item: Item, playerX: Float, playerY: Float, amount: Int) {
48 dropController.addDrop(
49 /* x = */ playerX + ((DROP_DISTANCE - Drop.DROP_SIZE / 2) * mobController.player.direction.basis),
50 /* y = */ playerY,
51 /* item = */ item,
52 /* count = */ amount
53 )
54 }
55
56 private fun getActionSlot(action: MouseInputAction): Int {
57 return ((action.screenX -
58 (action.cameraViewport.width / 2 - hotbarTexture.regionWidth / 2))
59 / HOTBAR_CELL_WIDTH).toInt()
60 }
61
62 private fun handleHold(action: MouseInputAction) {
63 // buttonHoldTask = null
64 // gameWindowsManager.openInventory()
65 val player = mobController.player
66 val actionSlot = getActionSlot(action)
67 val currentItem = player.inventory.items[actionSlot]
68 val dropAmount = if (currentItem.item.isTool()) currentItem.amount else 1
69
70 createDrop(currentItem.item, player.x, player.y, dropAmount)
71 player.inventory.decreaseItemAmount(actionSlot, dropAmount)
72 }
73
74 private fun handleDown(action: MouseInputAction) {
75 buttonHoldTask = object : Timer.Task() {
76 override fun run() {
77 handleHold(action)
78 }
79 }
80
81 Timer.schedule(buttonHoldTask, TOUCH_HOLD_TIME_SEC)
82 }
83
84 private fun handleUp(action: MouseInputAction) {
85 mobController.player.activeSlot = getActionSlot(action)
86 }
87
88 private fun handleScroll(action: MouseInputAction) {
89 if (action.actionKey !is MouseInputActionKey.Scroll) {
90 return
91 }
92 mobController.player.activeSlot += action.actionKey.amountY.toInt()
93 if (mobController.player.activeSlot < 0) {
94 mobController.player.activeSlot = Player.HOTBAR_SIZE - 1
95 } else if (mobController.player.activeSlot >= Player.HOTBAR_SIZE) {
96 mobController.player.activeSlot = 0
97 }
98 }
99
100 override fun handle(action: MouseInputAction) {
101 if (buttonHoldTask != null && buttonHoldTask?.isScheduled == true) {
102 cancelHold()
103 }
104
105 if (buttonHoldTask != null && buttonHoldTask?.isScheduled != true) {
106 buttonHoldTask = null
107 return
108 }
109
110 if (action.actionKey !is MouseInputActionKey.Left && action.actionKey !is MouseInputActionKey.Screen) {
111 if (action.actionKey is MouseInputActionKey.Scroll) {
112 handleScroll(action)
113 }
114 return
115 }
116
117 if (action.actionKey.touchUp) {
118 handleUp(action)
119 } else {
120 handleDown(action)
121 }
122 }
123
124 companion object {
125 private const val TOUCH_HOLD_TIME_SEC = 0.5f
126 private const val HOTBAR_CELL_WIDTH = 20
127 }
128
129 }