DEADSOFTWARE

Add tooltips
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / input / handler / mouse / UseItemMouseInputHandler.kt
1 package ru.deadsoftware.cavedroid.game.input.handler.mouse
3 import com.badlogic.gdx.Gdx
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.actions.placeToBackgroundAction
8 import ru.deadsoftware.cavedroid.game.actions.placeToForegroundAction
9 import ru.deadsoftware.cavedroid.game.actions.placeblock.IPlaceBlockAction
10 import ru.deadsoftware.cavedroid.game.actions.useblock.IUseBlockAction
11 import ru.deadsoftware.cavedroid.game.actions.useitem.IUseItemAction
12 import ru.deadsoftware.cavedroid.game.input.IGameInputHandler
13 import ru.deadsoftware.cavedroid.game.input.action.MouseInputAction
14 import ru.deadsoftware.cavedroid.game.input.action.keys.MouseInputActionKey
15 import ru.deadsoftware.cavedroid.game.input.isInsideHotbar
16 import ru.deadsoftware.cavedroid.game.mobs.MobsController
17 import ru.deadsoftware.cavedroid.game.model.item.Item
18 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
19 import ru.deadsoftware.cavedroid.game.world.GameWorld
20 import javax.inject.Inject
22 @GameScope
23 class UseItemMouseInputHandler @Inject constructor(
24 private val mobsController: MobsController,
25 private val useItemActionMap: Map<String, @JvmSuppressWildcards IUseItemAction>,
26 private val placeBlockActionMap: Map<String, @JvmSuppressWildcards IPlaceBlockAction>,
27 private val useBlockActionMap: Map<String, @JvmSuppressWildcards IUseBlockAction>,
28 private val gameWindowsManager: GameWindowsManager,
29 private val gameWorld: GameWorld,
30 ) : IGameInputHandler<MouseInputAction> {
32 private var buttonHoldTask: Timer.Task? = null
34 override fun checkConditions(action: MouseInputAction): Boolean {
35 return buttonHoldTask?.isScheduled == true ||
36 !isInsideHotbar(action) &&
37 gameWindowsManager.getCurrentWindow() == GameUiWindow.NONE &&
38 action.actionKey is MouseInputActionKey.Right
39 }
41 private fun cancelHold() {
42 buttonHoldTask?.cancel()
43 buttonHoldTask = null
44 }
46 private fun handleHold(action: MouseInputAction) {
47 cancelHold()
49 val player = mobsController.player
50 val item = player.inventory.activeItem.item
51 player.startHitting(false)
52 player.stopHitting()
54 if (item is Item.Placeable) {
55 placeBlockActionMap.placeToBackgroundAction(
56 item = item,
57 x = player.cursorX,
58 y = player.cursorY
59 )
60 }
61 }
63 private fun handleDown(action: MouseInputAction) {
64 cancelHold()
65 buttonHoldTask = object : Timer.Task() {
66 override fun run() {
67 handleHold(action)
68 }
70 }
71 Timer.schedule(buttonHoldTask, TOUCH_HOLD_TIME_SEC)
72 }
74 private fun tryUseBlock() {
75 val block = gameWorld.getForeMap(mobsController.player.cursorX, mobsController.player.cursorY)
76 .takeIf { !it.isNone() }
77 ?: gameWorld.getBackMap(mobsController.player.cursorX, mobsController.player.cursorY)
78 .takeIf { !it.isNone() }
79 ?: return
81 useBlockActionMap[block.params.key]?.perform(
82 block = block,
83 x = mobsController.player.cursorX,
84 y = mobsController.player.cursorY
85 )
86 }
88 private fun handleUp(action: MouseInputAction) {
89 val player = mobsController.player
90 val item = player.inventory.activeItem.item
91 cancelHold()
93 player.startHitting(false)
94 player.stopHitting()
96 if (item is Item.Placeable) {
97 placeBlockActionMap.placeToForegroundAction(
98 item = item,
99 x = player.cursorX,
100 y = player.cursorY
102 } else if (item is Item.Usable) {
103 useItemActionMap[item.useActionKey]?.perform(item, player.cursorX, player.cursorY)
104 ?: Gdx.app.error(TAG, "use item action ${item.useActionKey} not found");
105 } else {
106 tryUseBlock()
110 override fun handle(action: MouseInputAction) {
111 if (action.actionKey !is MouseInputActionKey.Right) {
112 if (buttonHoldTask?.isScheduled == true) {
113 cancelHold()
115 return
118 if (action.actionKey.touchUp && buttonHoldTask?.isScheduled == true) {
119 handleUp(action)
120 } else if (!action.actionKey.touchUp) {
121 handleDown(action)
125 companion object {
126 private const val TAG = "UseItemMouseInputActionHandler"
127 private const val TOUCH_HOLD_TIME_SEC = 0.5f