DEADSOFTWARE

Update README
[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.useitem.IUseItemAction
11 import ru.deadsoftware.cavedroid.game.input.IGameInputHandler
12 import ru.deadsoftware.cavedroid.game.input.action.MouseInputAction
13 import ru.deadsoftware.cavedroid.game.input.action.keys.MouseInputActionKey
14 import ru.deadsoftware.cavedroid.game.input.isInsideHotbar
15 import ru.deadsoftware.cavedroid.game.mobs.MobsController
16 import ru.deadsoftware.cavedroid.game.model.item.Item
17 import ru.deadsoftware.cavedroid.game.windows.GameWindowsManager
18 import javax.inject.Inject
20 @GameScope
21 class UseItemMouseInputHandler @Inject constructor(
22 private val mobsController: MobsController,
23 private val useItemActionMap: Map<String, @JvmSuppressWildcards IUseItemAction>,
24 private val placeBlockActionMap: Map<String, @JvmSuppressWildcards IPlaceBlockAction>,
25 private val gameWindowsManager: GameWindowsManager,
26 ) : IGameInputHandler<MouseInputAction> {
28 private var buttonHoldTask: Timer.Task? = null
30 override fun checkConditions(action: MouseInputAction): Boolean {
31 return buttonHoldTask?.isScheduled == true ||
32 !isInsideHotbar(action) &&
33 gameWindowsManager.getCurrentWindow() == GameUiWindow.NONE &&
34 action.actionKey is MouseInputActionKey.Right
35 }
37 private fun cancelHold() {
38 buttonHoldTask?.cancel()
39 buttonHoldTask = null
40 }
42 private fun handleHold(action: MouseInputAction) {
43 cancelHold()
45 val player = mobsController.player
46 val item = player.currentItem.item
47 player.startHitting(false)
48 player.stopHitting()
50 if (item is Item.Placeable) {
51 placeBlockActionMap.placeToBackgroundAction(
52 item = player.currentItem.item as Item.Placeable,
53 x = player.cursorX,
54 y = player.cursorY
55 )
56 }
57 }
59 private fun handleDown(action: MouseInputAction) {
60 cancelHold()
61 buttonHoldTask = object : Timer.Task() {
62 override fun run() {
63 handleHold(action)
64 }
66 }
67 Timer.schedule(buttonHoldTask, TOUCH_HOLD_TIME_SEC)
68 }
70 private fun handleUp(action: MouseInputAction) {
71 val player = mobsController.player
72 val item = player.currentItem.item
73 cancelHold()
75 player.startHitting(false)
76 player.stopHitting()
78 if (item is Item.Placeable) {
79 placeBlockActionMap.placeToForegroundAction(
80 item = item,
81 x = player.cursorX,
82 y = player.cursorY
83 )
84 } else if (item is Item.Usable) {
85 useItemActionMap[item.useActionKey]?.perform(item, player.cursorX, player.cursorY)
86 ?: Gdx.app.error(TAG, "use item action ${item.useActionKey} not found");
87 }
88 }
90 override fun handle(action: MouseInputAction) {
91 if (action.actionKey !is MouseInputActionKey.Right) {
92 if (buttonHoldTask?.isScheduled == true) {
93 cancelHold()
94 }
95 return
96 }
98 if (action.actionKey.touchUp && buttonHoldTask?.isScheduled == true) {
99 handleUp(action)
100 } else if (!action.actionKey.touchUp) {
101 handleDown(action)
105 companion object {
106 private const val TAG = "UseItemMouseInputActionHandler"
107 private const val TOUCH_HOLD_TIME_SEC = 0.5f