DEADSOFTWARE

3c2a16317ce6628946aecab8a152916c778e3257
[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 && isInsideHotbar(action) || action.actionKey is MouseInputActionKey.Scroll) &&
28 gameWindowsManager.getCurrentWindow() == GameUiWindow.NONE
29 }
31 private fun cancelHold() {
32 buttonHoldTask?.cancel()
33 buttonHoldTask = null
34 }
36 private fun handleHold() {
37 buttonHoldTask = null
38 gameWindowsManager.openInventory()
39 }
41 private fun handleDown(action: MouseInputAction) {
42 buttonHoldTask = object : Timer.Task() {
43 override fun run() {
44 handleHold()
45 }
46 }
48 Timer.schedule(buttonHoldTask, TOUCH_HOLD_TIME_SEC)
49 }
51 private fun handleUp(action: MouseInputAction) {
52 mobsController.player.slot =
53 ((action.screenX -
54 (action.cameraViewport.width / 2 - hotbarTexture.regionWidth / 2))
55 / HOTBAR_CELL_WIDTH).toInt()
56 }
58 private fun handleScroll(action: MouseInputAction) {
59 if (action.actionKey !is MouseInputActionKey.Scroll) {
60 return
61 }
62 mobsController.player.slot += action.actionKey.amountY.toInt()
63 if (mobsController.player.slot < 0) {
64 mobsController.player.slot = HOTBAR_ITEMS - 1
65 } else if (mobsController.player.slot >= HOTBAR_ITEMS){
66 mobsController.player.slot = 0
67 }
68 }
70 override fun handle(action: MouseInputAction) {
71 if (buttonHoldTask != null && buttonHoldTask?.isScheduled == true) {
72 cancelHold()
73 }
75 if (action.actionKey !is MouseInputActionKey.Left) {
76 if (action.actionKey is MouseInputActionKey.Scroll) {
77 handleScroll(action)
78 }
79 return
80 }
82 if (action.actionKey.touchUp) {
83 handleUp(action)
84 } else {
85 handleDown(action)
86 }
87 }
89 companion object {
90 private const val TOUCH_HOLD_TIME_SEC = 0.5f
91 private const val HOTBAR_CELL_WIDTH = 20
92 private const val HOTBAR_ITEMS = 9
93 }
95 }