DEADSOFTWARE

CaveGame in kotlin
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / input / handler / mouse / HotbarMouseInputHandler.kt
1 package ru.deadsoftware.cavedroid.game.input.handler.mouse
3 import com.badlogic.gdx.utils.Timer
4 import ru.deadsoftware.cavedroid.game.GameScope
5 import ru.deadsoftware.cavedroid.game.GameUiWindow
6 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
7 import ru.deadsoftware.cavedroid.game.input.IGameInputHandler
8 import ru.deadsoftware.cavedroid.game.input.action.MouseInputAction
9 import ru.deadsoftware.cavedroid.game.input.action.keys.MouseInputActionKey
10 import ru.deadsoftware.cavedroid.game.input.handler.keyboard.DropItemKeyboardInputHandler.Companion.DROP_DISTANCE
11 import ru.deadsoftware.cavedroid.game.input.isInsideHotbar
12 import ru.deadsoftware.cavedroid.game.mobs.MobsController
13 import ru.deadsoftware.cavedroid.game.mobs.player.Player
14 import ru.deadsoftware.cavedroid.game.model.item.Item
15 import ru.deadsoftware.cavedroid.game.objects.drop.Drop
16 import ru.deadsoftware.cavedroid.game.objects.drop.DropController
17 import ru.deadsoftware.cavedroid.misc.Assets
18 import javax.inject.Inject
20 @GameScope
21 class HotbarMouseInputHandler @Inject constructor(
22 private val gameWindowsManager: GameWindowsManager,
23 private val mobsController: MobsController,
24 private val dropController: DropController,
25 ) : IGameInputHandler<MouseInputAction> {
27 private val hotbarTexture get() = requireNotNull(Assets.textureRegions["hotbar"])
29 private var buttonHoldTask: Timer.Task? = null
31 override fun checkConditions(action: MouseInputAction): Boolean {
32 return buttonHoldTask?.isScheduled == true ||
33 ((action.actionKey is MouseInputActionKey.Left || action.actionKey is MouseInputActionKey.Screen)
34 && isInsideHotbar(action)
35 || action.actionKey is MouseInputActionKey.Scroll) &&
36 gameWindowsManager.getCurrentWindow() == GameUiWindow.NONE
37 }
39 private fun cancelHold() {
40 buttonHoldTask?.cancel()
41 buttonHoldTask = null
42 }
44 private fun createDrop(item: Item, playerX: Float, playerY: Float, amount: Int) {
45 dropController.addDrop(
46 /* x = */ playerX + ((DROP_DISTANCE - Drop.DROP_SIZE / 2) * mobsController.player.direction.basis),
47 /* y = */ playerY,
48 /* item = */ item,
49 /* count = */ amount
50 )
51 }
53 private fun getActionSlot(action: MouseInputAction): Int {
54 return ((action.screenX -
55 (action.cameraViewport.width / 2 - hotbarTexture.regionWidth / 2))
56 / HOTBAR_CELL_WIDTH).toInt()
57 }
59 private fun handleHold(action: MouseInputAction) {
60 // buttonHoldTask = null
61 // gameWindowsManager.openInventory()
62 val player = mobsController.player
63 val actionSlot = getActionSlot(action)
64 val currentItem = player.inventory.items[actionSlot]
65 val dropAmount = if (currentItem.item.isTool()) currentItem.amount else 1
67 createDrop(currentItem.item, player.x, player.y, dropAmount)
68 player.inventory.decreaseItemAmount(actionSlot, dropAmount)
69 }
71 private fun handleDown(action: MouseInputAction) {
72 buttonHoldTask = object : Timer.Task() {
73 override fun run() {
74 handleHold(action)
75 }
76 }
78 Timer.schedule(buttonHoldTask, TOUCH_HOLD_TIME_SEC)
79 }
81 private fun handleUp(action: MouseInputAction) {
82 mobsController.player.inventory.activeSlot = getActionSlot(action)
83 }
85 private fun handleScroll(action: MouseInputAction) {
86 if (action.actionKey !is MouseInputActionKey.Scroll) {
87 return
88 }
89 mobsController.player.inventory.activeSlot += action.actionKey.amountY.toInt()
90 if (mobsController.player.inventory.activeSlot < 0) {
91 mobsController.player.inventory.activeSlot = Player.HOTBAR_SIZE - 1
92 } else if (mobsController.player.inventory.activeSlot >= Player.HOTBAR_SIZE) {
93 mobsController.player.inventory.activeSlot = 0
94 }
95 }
97 override fun handle(action: MouseInputAction) {
98 if (buttonHoldTask != null && buttonHoldTask?.isScheduled == true) {
99 cancelHold()
102 if (buttonHoldTask != null && buttonHoldTask?.isScheduled != true) {
103 buttonHoldTask = null
104 return
107 if (action.actionKey !is MouseInputActionKey.Left && action.actionKey !is MouseInputActionKey.Screen) {
108 if (action.actionKey is MouseInputActionKey.Scroll) {
109 handleScroll(action)
111 return
114 if (action.actionKey.touchUp) {
115 handleUp(action)
116 } else {
117 handleDown(action)
121 companion object {
122 private const val TOUCH_HOLD_TIME_SEC = 0.5f
123 private const val HOTBAR_CELL_WIDTH = 20