DEADSOFTWARE

Update version script
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / input / handler / mouse / HotbarMouseInputHandler.kt
1 package ru.deadsoftware.cavedroid.game.input.handler.mouse
3 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindMouseInputHandler
4 import com.badlogic.gdx.utils.Timer
5 import ru.deadsoftware.cavedroid.game.GameScope
6 import ru.deadsoftware.cavedroid.game.GameUiWindow
7 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
8 import ru.deadsoftware.cavedroid.game.input.IMouseInputHandler
9 import ru.deadsoftware.cavedroid.game.input.action.MouseInputAction
10 import ru.deadsoftware.cavedroid.game.input.action.keys.MouseInputActionKey
11 import ru.deadsoftware.cavedroid.game.input.handler.keyboard.DropItemKeyboardInputHandler.Companion.DROP_DISTANCE
12 import ru.deadsoftware.cavedroid.game.input.isInsideHotbar
13 import ru.deadsoftware.cavedroid.game.mobs.MobsController
14 import ru.deadsoftware.cavedroid.game.mobs.player.Player
15 import ru.deadsoftware.cavedroid.game.model.item.Item
16 import ru.deadsoftware.cavedroid.game.objects.drop.Drop
17 import ru.deadsoftware.cavedroid.game.objects.drop.DropController
18 import ru.deadsoftware.cavedroid.misc.Assets
19 import javax.inject.Inject
21 @GameScope
22 @BindMouseInputHandler
23 class HotbarMouseInputHandler @Inject constructor(
24 private val gameWindowsManager: GameWindowsManager,
25 private val mobsController: MobsController,
26 private val dropController: DropController,
27 ) : IMouseInputHandler {
29 private val hotbarTexture get() = requireNotNull(Assets.textureRegions["hotbar"])
31 private var buttonHoldTask: Timer.Task? = null
33 override fun checkConditions(action: MouseInputAction): Boolean {
34 return buttonHoldTask?.isScheduled == true ||
35 ((action.actionKey is MouseInputActionKey.Left || action.actionKey is MouseInputActionKey.Screen)
36 && isInsideHotbar(action)
37 || action.actionKey is MouseInputActionKey.Scroll) &&
38 gameWindowsManager.getCurrentWindow() == GameUiWindow.NONE
39 }
41 private fun cancelHold() {
42 buttonHoldTask?.cancel()
43 buttonHoldTask = null
44 }
46 private fun createDrop(item: Item, playerX: Float, playerY: Float, amount: Int) {
47 dropController.addDrop(
48 /* x = */ playerX + ((DROP_DISTANCE - Drop.DROP_SIZE / 2) * mobsController.player.direction.basis),
49 /* y = */ playerY,
50 /* item = */ item,
51 /* count = */ amount
52 )
53 }
55 private fun getActionSlot(action: MouseInputAction): Int {
56 return ((action.screenX -
57 (action.cameraViewport.width / 2 - hotbarTexture.regionWidth / 2))
58 / HOTBAR_CELL_WIDTH).toInt()
59 }
61 private fun handleHold(action: MouseInputAction) {
62 // buttonHoldTask = null
63 // gameWindowsManager.openInventory()
64 val player = mobsController.player
65 val actionSlot = getActionSlot(action)
66 val currentItem = player.inventory.items[actionSlot]
67 val dropAmount = if (currentItem.item.isTool()) currentItem.amount else 1
69 createDrop(currentItem.item, player.x, player.y, dropAmount)
70 player.inventory.decreaseItemAmount(actionSlot, dropAmount)
71 }
73 private fun handleDown(action: MouseInputAction) {
74 buttonHoldTask = object : Timer.Task() {
75 override fun run() {
76 handleHold(action)
77 }
78 }
80 Timer.schedule(buttonHoldTask, TOUCH_HOLD_TIME_SEC)
81 }
83 private fun handleUp(action: MouseInputAction) {
84 mobsController.player.inventory.activeSlot = getActionSlot(action)
85 }
87 private fun handleScroll(action: MouseInputAction) {
88 if (action.actionKey !is MouseInputActionKey.Scroll) {
89 return
90 }
91 mobsController.player.inventory.activeSlot += action.actionKey.amountY.toInt()
92 if (mobsController.player.inventory.activeSlot < 0) {
93 mobsController.player.inventory.activeSlot = Player.HOTBAR_SIZE - 1
94 } else if (mobsController.player.inventory.activeSlot >= Player.HOTBAR_SIZE) {
95 mobsController.player.inventory.activeSlot = 0
96 }
97 }
99 override fun handle(action: MouseInputAction) {
100 if (buttonHoldTask != null && buttonHoldTask?.isScheduled == true) {
101 cancelHold()
104 if (buttonHoldTask != null && buttonHoldTask?.isScheduled != true) {
105 buttonHoldTask = null
106 return
109 if (action.actionKey !is MouseInputActionKey.Left && action.actionKey !is MouseInputActionKey.Screen) {
110 if (action.actionKey is MouseInputActionKey.Scroll) {
111 handleScroll(action)
113 return
116 if (action.actionKey.touchUp) {
117 handleUp(action)
118 } else {
119 handleDown(action)
123 companion object {
124 private const val TOUCH_HOLD_TIME_SEC = 0.5f
125 private const val HOTBAR_CELL_WIDTH = 20