DEADSOFTWARE

Update README
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / input / handler / mouse / HotbarMouseInputHandler.kt
1 package ru.deadsoftware.cavedroid.game.input.handler.mouse
3 import com.badlogic.gdx.utils.Timer
4 import ru.deadsoftware.cavedroid.game.GameScope
5 import ru.deadsoftware.cavedroid.game.GameUiWindow
6 import ru.deadsoftware.cavedroid.game.windows.GameWindowsManager
7 import ru.deadsoftware.cavedroid.game.input.IGameInputHandler
8 import ru.deadsoftware.cavedroid.game.input.action.MouseInputAction
9 import ru.deadsoftware.cavedroid.game.input.action.keys.MouseInputActionKey
10 import ru.deadsoftware.cavedroid.game.input.isInsideHotbar
11 import ru.deadsoftware.cavedroid.game.mobs.MobsController
12 import ru.deadsoftware.cavedroid.misc.Assets
13 import javax.inject.Inject
15 @GameScope
16 class HotbarMouseInputHandler @Inject constructor(
17 private val gameWindowsManager: GameWindowsManager,
18 private val mobsController: MobsController,
19 ) : IGameInputHandler<MouseInputAction> {
21 private val hotbarTexture get() = requireNotNull(Assets.textureRegions["hotbar"])
23 private var buttonHoldTask: Timer.Task? = null
25 override fun checkConditions(action: MouseInputAction): Boolean {
26 return buttonHoldTask?.isScheduled == true ||
27 ((action.actionKey is MouseInputActionKey.Left || action.actionKey is MouseInputActionKey.Touch)
28 && isInsideHotbar(action)
29 || action.actionKey is MouseInputActionKey.Scroll) &&
30 gameWindowsManager.getCurrentWindow() == GameUiWindow.NONE
31 }
33 private fun cancelHold() {
34 buttonHoldTask?.cancel()
35 buttonHoldTask = null
36 }
38 private fun handleHold() {
39 buttonHoldTask = null
40 gameWindowsManager.openInventory()
41 }
43 private fun handleDown(action: MouseInputAction) {
44 buttonHoldTask = object : Timer.Task() {
45 override fun run() {
46 handleHold()
47 }
48 }
50 Timer.schedule(buttonHoldTask, TOUCH_HOLD_TIME_SEC)
51 }
53 private fun handleUp(action: MouseInputAction) {
54 mobsController.player.slot =
55 ((action.screenX -
56 (action.cameraViewport.width / 2 - hotbarTexture.regionWidth / 2))
57 / HOTBAR_CELL_WIDTH).toInt()
58 }
60 private fun handleScroll(action: MouseInputAction) {
61 if (action.actionKey !is MouseInputActionKey.Scroll) {
62 return
63 }
64 mobsController.player.slot += action.actionKey.amountY.toInt()
65 if (mobsController.player.slot < 0) {
66 mobsController.player.slot = HOTBAR_ITEMS - 1
67 } else if (mobsController.player.slot >= HOTBAR_ITEMS){
68 mobsController.player.slot = 0
69 }
70 }
72 override fun handle(action: MouseInputAction) {
73 if (buttonHoldTask != null && buttonHoldTask?.isScheduled == true) {
74 cancelHold()
75 }
77 if (action.actionKey !is MouseInputActionKey.Left && action.actionKey !is MouseInputActionKey.Touch ) {
78 if (action.actionKey is MouseInputActionKey.Scroll) {
79 handleScroll(action)
80 }
81 return
82 }
84 if (action.actionKey.touchUp) {
85 handleUp(action)
86 } else {
87 handleDown(action)
88 }
89 }
91 companion object {
92 private const val TOUCH_HOLD_TIME_SEC = 0.5f
93 private const val HOTBAR_CELL_WIDTH = 20
94 private const val HOTBAR_ITEMS = 9
95 }
97 }