DEADSOFTWARE

Inventory class
[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.game.mobs.player.Player
13 import ru.deadsoftware.cavedroid.misc.Assets
14 import javax.inject.Inject
16 @GameScope
17 class HotbarMouseInputHandler @Inject constructor(
18 private val gameWindowsManager: GameWindowsManager,
19 private val mobsController: MobsController,
20 ) : IGameInputHandler<MouseInputAction> {
22 private val hotbarTexture get() = requireNotNull(Assets.textureRegions["hotbar"])
24 private var buttonHoldTask: Timer.Task? = null
26 override fun checkConditions(action: MouseInputAction): Boolean {
27 return buttonHoldTask?.isScheduled == true ||
28 ((action.actionKey is MouseInputActionKey.Left || action.actionKey is MouseInputActionKey.Touch)
29 && isInsideHotbar(action)
30 || action.actionKey is MouseInputActionKey.Scroll) &&
31 gameWindowsManager.getCurrentWindow() == GameUiWindow.NONE
32 }
34 private fun cancelHold() {
35 buttonHoldTask?.cancel()
36 buttonHoldTask = null
37 }
39 private fun handleHold() {
40 buttonHoldTask = null
41 gameWindowsManager.openInventory()
42 }
44 private fun handleDown(action: MouseInputAction) {
45 buttonHoldTask = object : Timer.Task() {
46 override fun run() {
47 handleHold()
48 }
49 }
51 Timer.schedule(buttonHoldTask, TOUCH_HOLD_TIME_SEC)
52 }
54 private fun handleUp(action: MouseInputAction) {
55 mobsController.player.inventory.activeSlot =
56 ((action.screenX -
57 (action.cameraViewport.width / 2 - hotbarTexture.regionWidth / 2))
58 / HOTBAR_CELL_WIDTH).toInt()
59 }
61 private fun handleScroll(action: MouseInputAction) {
62 if (action.actionKey !is MouseInputActionKey.Scroll) {
63 return
64 }
65 mobsController.player.inventory.activeSlot += action.actionKey.amountY.toInt()
66 if (mobsController.player.inventory.activeSlot < 0) {
67 mobsController.player.inventory.activeSlot = Player.HOTBAR_SIZE - 1
68 } else if (mobsController.player.inventory.activeSlot >= Player.HOTBAR_SIZE){
69 mobsController.player.inventory.activeSlot = 0
70 }
71 }
73 override fun handle(action: MouseInputAction) {
74 if (buttonHoldTask != null && buttonHoldTask?.isScheduled == true) {
75 cancelHold()
76 }
78 if (action.actionKey !is MouseInputActionKey.Left && action.actionKey !is MouseInputActionKey.Touch ) {
79 if (action.actionKey is MouseInputActionKey.Scroll) {
80 handleScroll(action)
81 }
82 return
83 }
85 if (action.actionKey.touchUp) {
86 handleUp(action)
87 } else {
88 handleDown(action)
89 }
90 }
92 companion object {
93 private const val TOUCH_HOLD_TIME_SEC = 0.5f
94 private const val HOTBAR_CELL_WIDTH = 20
95 }
97 }