DEADSOFTWARE

Update version script
[cavedroid.git] / core / src / main / kotlin / 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.GameItemsHolder
7 import ru.deadsoftware.cavedroid.game.GameScope
8 import ru.deadsoftware.cavedroid.game.GameUiWindow
9 import ru.deadsoftware.cavedroid.game.actions.placeToBackgroundAction
10 import ru.deadsoftware.cavedroid.game.actions.placeToForegroundAction
11 import ru.deadsoftware.cavedroid.game.actions.placeblock.IPlaceBlockAction
12 import ru.deadsoftware.cavedroid.game.actions.useblock.IUseBlockAction
13 import ru.deadsoftware.cavedroid.game.actions.useitem.IUseItemAction
14 import ru.deadsoftware.cavedroid.game.input.IMouseInputHandler
15 import ru.deadsoftware.cavedroid.game.input.action.MouseInputAction
16 import ru.deadsoftware.cavedroid.game.input.action.keys.MouseInputActionKey
17 import ru.deadsoftware.cavedroid.game.input.isInsideHotbar
18 import ru.deadsoftware.cavedroid.game.mobs.MobsController
19 import ru.deadsoftware.cavedroid.game.model.item.Item
20 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
21 import ru.deadsoftware.cavedroid.game.world.GameWorld
22 import javax.inject.Inject
24 @GameScope
25 @BindMouseInputHandler
26 class UseItemMouseInputHandler @Inject constructor(
27 private val mobsController: MobsController,
28 private val useItemActionMap: Map<String, @JvmSuppressWildcards IUseItemAction>,
29 private val placeBlockActionMap: Map<String, @JvmSuppressWildcards IPlaceBlockAction>,
30 private val useBlockActionMap: Map<String, @JvmSuppressWildcards IUseBlockAction>,
31 private val gameWindowsManager: GameWindowsManager,
32 private val gameWorld: GameWorld,
33 private val gameItemsHolder: GameItemsHolder,
34 ) : IMouseInputHandler {
36 private var buttonHoldTask: Timer.Task? = null
38 override fun checkConditions(action: MouseInputAction): Boolean {
39 return buttonHoldTask?.isScheduled == true ||
40 !isInsideHotbar(action) &&
41 gameWindowsManager.getCurrentWindow() == GameUiWindow.NONE &&
42 action.actionKey is MouseInputActionKey.Right
43 }
45 private fun cancelHold() {
46 buttonHoldTask?.cancel()
47 buttonHoldTask = null
48 }
50 private fun handleHold(action: MouseInputAction) {
51 cancelHold()
53 val player = mobsController.player
54 val item = player.inventory.activeItem.item
55 player.startHitting(false)
56 player.stopHitting()
58 if (item is Item.Placeable) {
59 placeBlockActionMap.placeToBackgroundAction(
60 item = item,
61 x = player.cursorX,
62 y = player.cursorY
63 )
64 }
65 }
67 private fun handleDown(action: MouseInputAction) {
68 cancelHold()
69 buttonHoldTask = object : Timer.Task() {
70 override fun run() {
71 handleHold(action)
72 }
74 }
75 Timer.schedule(buttonHoldTask, TOUCH_HOLD_TIME_SEC)
76 }
78 private fun tryUseBlock() {
79 val block = gameWorld.getForeMap(mobsController.player.cursorX, mobsController.player.cursorY)
80 .takeIf { !it.isNone() }
81 ?: gameWorld.getBackMap(mobsController.player.cursorX, mobsController.player.cursorY)
82 .takeIf { !it.isNone() }
83 ?: return
85 useBlockActionMap[block.params.key]?.perform(
86 block = block,
87 x = mobsController.player.cursorX,
88 y = mobsController.player.cursorY
89 )
90 }
92 private fun handleUp(action: MouseInputAction) {
93 val player = mobsController.player
94 val item = player.inventory.activeItem.item
95 cancelHold()
97 player.startHitting(false)
98 player.stopHitting()
100 if (item is Item.Placeable) {
101 placeBlockActionMap.placeToForegroundAction(
102 item = item,
103 x = player.cursorX,
104 y = player.cursorY
106 } else if (item is Item.Usable) {
107 useItemActionMap[item.useActionKey]?.perform(item, player.cursorX, player.cursorY)
108 ?: Gdx.app.error(TAG, "use item action ${item.useActionKey} not found");
109 } else if (item is Item.Food && player.health < player.maxHealth) {
110 player.heal(item.heal)
111 player.decreaseCurrentItemCount(gameItemsHolder)
112 } else {
113 tryUseBlock()
117 override fun handle(action: MouseInputAction) {
118 if (action.actionKey !is MouseInputActionKey.Right) {
119 if (buttonHoldTask?.isScheduled == true) {
120 cancelHold()
122 return
125 if (action.actionKey.touchUp && buttonHoldTask?.isScheduled == true) {
126 handleUp(action)
127 } else if (!action.actionKey.touchUp) {
128 handleDown(action)
132 companion object {
133 private const val TAG = "UseItemMouseInputActionHandler"
134 private const val TOUCH_HOLD_TIME_SEC = 0.5f