DEADSOFTWARE

Update version script
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / input / handler / mouse / UseItemMouseInputHandler.kt
1 package ru.deadsoftware.cavedroid.game.input.handler.mouse
3 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindMouseInputHandler
4 import com.badlogic.gdx.Gdx
5 import com.badlogic.gdx.utils.Timer
6 import ru.deadsoftware.cavedroid.game.GameScope
7 import ru.deadsoftware.cavedroid.game.GameUiWindow
8 import ru.deadsoftware.cavedroid.game.actions.placeToBackgroundAction
9 import ru.deadsoftware.cavedroid.game.actions.placeToForegroundAction
10 import ru.deadsoftware.cavedroid.game.actions.placeblock.IPlaceBlockAction
11 import ru.deadsoftware.cavedroid.game.actions.useblock.IUseBlockAction
12 import ru.deadsoftware.cavedroid.game.actions.useitem.IUseItemAction
13 import ru.deadsoftware.cavedroid.game.input.IMouseInputHandler
14 import ru.deadsoftware.cavedroid.game.input.action.MouseInputAction
15 import ru.deadsoftware.cavedroid.game.input.action.keys.MouseInputActionKey
16 import ru.deadsoftware.cavedroid.game.input.isInsideHotbar
17 import ru.deadsoftware.cavedroid.game.mobs.MobsController
18 import ru.deadsoftware.cavedroid.game.model.item.Item
19 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
20 import ru.deadsoftware.cavedroid.game.world.GameWorld
21 import javax.inject.Inject
23 @GameScope
24 @BindMouseInputHandler
25 class UseItemMouseInputHandler @Inject constructor(
26 private val mobsController: MobsController,
27 private val useItemActionMap: Map<String, @JvmSuppressWildcards IUseItemAction>,
28 private val placeBlockActionMap: Map<String, @JvmSuppressWildcards IPlaceBlockAction>,
29 private val useBlockActionMap: Map<String, @JvmSuppressWildcards IUseBlockAction>,
30 private val gameWindowsManager: GameWindowsManager,
31 private val gameWorld: GameWorld,
32 ) : IMouseInputHandler {
34 private var buttonHoldTask: Timer.Task? = null
36 override fun checkConditions(action: MouseInputAction): Boolean {
37 return buttonHoldTask?.isScheduled == true ||
38 !isInsideHotbar(action) &&
39 gameWindowsManager.getCurrentWindow() == GameUiWindow.NONE &&
40 action.actionKey is MouseInputActionKey.Right
41 }
43 private fun cancelHold() {
44 buttonHoldTask?.cancel()
45 buttonHoldTask = null
46 }
48 private fun handleHold(action: MouseInputAction) {
49 cancelHold()
51 val player = mobsController.player
52 val item = player.inventory.activeItem.item
53 player.startHitting(false)
54 player.stopHitting()
56 if (item is Item.Placeable) {
57 placeBlockActionMap.placeToBackgroundAction(
58 item = item,
59 x = player.cursorX,
60 y = player.cursorY
61 )
62 }
63 }
65 private fun handleDown(action: MouseInputAction) {
66 cancelHold()
67 buttonHoldTask = object : Timer.Task() {
68 override fun run() {
69 handleHold(action)
70 }
72 }
73 Timer.schedule(buttonHoldTask, TOUCH_HOLD_TIME_SEC)
74 }
76 private fun tryUseBlock() {
77 val block = gameWorld.getForeMap(mobsController.player.cursorX, mobsController.player.cursorY)
78 .takeIf { !it.isNone() }
79 ?: gameWorld.getBackMap(mobsController.player.cursorX, mobsController.player.cursorY)
80 .takeIf { !it.isNone() }
81 ?: return
83 useBlockActionMap[block.params.key]?.perform(
84 block = block,
85 x = mobsController.player.cursorX,
86 y = mobsController.player.cursorY
87 )
88 }
90 private fun handleUp(action: MouseInputAction) {
91 val player = mobsController.player
92 val item = player.inventory.activeItem.item
93 cancelHold()
95 player.startHitting(false)
96 player.stopHitting()
98 if (item is Item.Placeable) {
99 placeBlockActionMap.placeToForegroundAction(
100 item = item,
101 x = player.cursorX,
102 y = player.cursorY
104 } else if (item is Item.Usable) {
105 useItemActionMap[item.useActionKey]?.perform(item, player.cursorX, player.cursorY)
106 ?: Gdx.app.error(TAG, "use item action ${item.useActionKey} not found");
107 } else {
108 tryUseBlock()
112 override fun handle(action: MouseInputAction) {
113 if (action.actionKey !is MouseInputActionKey.Right) {
114 if (buttonHoldTask?.isScheduled == true) {
115 cancelHold()
117 return
120 if (action.actionKey.touchUp && buttonHoldTask?.isScheduled == true) {
121 handleUp(action)
122 } else if (!action.actionKey.touchUp) {
123 handleDown(action)
127 companion object {
128 private const val TAG = "UseItemMouseInputActionHandler"
129 private const val TOUCH_HOLD_TIME_SEC = 0.5f