1 package ru.fredboy.cavedroid.ux.controls.input.handler.mouse
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
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 {
30 private val hotbarTexture get() = requireNotNull(textureRegions["hotbar"])
32 private var buttonHoldTask: Timer.Task? = null
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
42 private fun cancelHold() {
43 buttonHoldTask?.cancel()
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),
56 private fun getActionSlot(action: MouseInputAction): Int {
57 return ((action.screenX -
58 (action.cameraViewport.width / 2 - hotbarTexture.regionWidth / 2))
59 / HOTBAR_CELL_WIDTH).toInt()
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
70 createDrop(currentItem.item, player.x, player.y, dropAmount)
71 player.inventory.decreaseItemAmount(actionSlot, dropAmount)
74 private fun handleDown(action: MouseInputAction) {
75 buttonHoldTask = object : Timer.Task() {
81 Timer.schedule(buttonHoldTask, TOUCH_HOLD_TIME_SEC)
84 private fun handleUp(action: MouseInputAction) {
85 mobController.player.activeSlot = getActionSlot(action)
88 private fun handleScroll(action: MouseInputAction) {
89 if (action.actionKey !is MouseInputActionKey.Scroll) {
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
100 override fun handle(action: MouseInputAction) {
101 if (buttonHoldTask != null && buttonHoldTask?.isScheduled == true) {
105 if (buttonHoldTask != null && buttonHoldTask?.isScheduled != true) {
106 buttonHoldTask = null
110 if (action.actionKey !is MouseInputActionKey.Left && action.actionKey !is MouseInputActionKey.Screen) {
111 if (action.actionKey is MouseInputActionKey.Scroll) {
117 if (action.actionKey.touchUp) {
125 private const val TOUCH_HOLD_TIME_SEC = 0.5f
126 private const val HOTBAR_CELL_WIDTH = 20