DEADSOFTWARE

Drop items from hotbar
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / input / handler / touch / JoystickInputHandler.kt
1 package ru.deadsoftware.cavedroid.game.input.handler.touch
3 import com.badlogic.gdx.math.Vector2
4 import com.badlogic.gdx.utils.TimeUtils
5 import ru.deadsoftware.cavedroid.MainConfig
6 import ru.deadsoftware.cavedroid.game.GameScope
7 import ru.deadsoftware.cavedroid.game.GameUiWindow
8 import ru.deadsoftware.cavedroid.game.input.IGameInputHandler
9 import ru.deadsoftware.cavedroid.game.input.Joystick
10 import ru.deadsoftware.cavedroid.game.input.action.MouseInputAction
11 import ru.deadsoftware.cavedroid.game.input.action.keys.MouseInputActionKey
12 import ru.deadsoftware.cavedroid.game.input.isInsideHotbar
13 import ru.deadsoftware.cavedroid.game.mobs.Mob
14 import ru.deadsoftware.cavedroid.game.mobs.MobsController
15 import ru.deadsoftware.cavedroid.game.mobs.player.Player
16 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
17 import ru.deadsoftware.cavedroid.game.world.GameWorld
18 import javax.inject.Inject
20 @GameScope
21 class JoystickInputHandler @Inject constructor(
22 private val mainConfig: MainConfig,
23 private val mobsController: MobsController,
24 private val gameWindowsManager: GameWindowsManager,
25 private val gameWorld: GameWorld,
26 ) : IGameInputHandler<MouseInputAction> {
28 private var activateTimeMs = 0L
29 private var cursorTimeoutMs = 100L
31 private var active = false
32 set(value) {
33 if (!value) {
34 resetVelocity()
35 if (TimeUtils.timeSinceMillis(activateTimeMs) < 100L &&
36 mobsController.player.controlMode != Player.ControlMode.CURSOR) {
37 mobsController.player.jump()
38 }
39 } else {
40 activateTimeMs = TimeUtils.millis()
41 }
42 field = value
43 }
45 private fun resetVelocity() {
46 mobsController.player.velocity.x = 0f
48 if (mobsController.player.isFlyMode) {
49 mobsController.player.velocity.y = 0f
50 }
51 }
53 override fun checkConditions(action: MouseInputAction): Boolean {
54 return gameWindowsManager.getCurrentWindow() == GameUiWindow.NONE &&
55 mainConfig.isTouch &&
56 // mobsController.player.controlMode == Player.ControlMode.WALK &&
57 mainConfig.joystick != null &&
58 (action.actionKey is MouseInputActionKey.Touch) &&
59 (action.actionKey.pointer == mainConfig.joystick?.pointer || !active) &&
60 ((action.actionKey is MouseInputActionKey.Dragged) ||
61 (action.screenX < action.cameraViewport.width / 2 && !action.actionKey.touchUp || active)) &&
62 !(action.actionKey is MouseInputActionKey.Screen && isInsideHotbar(action))
64 }
66 private fun handleTouchDown(action: MouseInputAction) {
67 val key = action.actionKey as MouseInputActionKey.Screen
68 mainConfig.joystick?.activate(action.screenX, action.screenY, key.pointer) ?: return
69 active = true
70 }
72 private fun handleTouchUp(action: MouseInputAction) {
73 mainConfig.joystick?.deactivate()
74 active = false
75 }
77 private fun handleCursor() {
78 val joystick = mainConfig.joystick ?: return
80 if (TimeUtils.timeSinceMillis(cursorTimeoutMs) < 200L) {
81 return
82 }
84 if (Math.abs(joystick.activeX - joystick.centerX) >= Joystick.RADIUS / 2) {
85 mobsController.player.cursorX += if (joystick.activeX > joystick.centerX) 1 else -1
86 cursorTimeoutMs = TimeUtils.millis()
87 }
89 if (Math.abs(joystick.activeY - joystick.centerY) >= Joystick.RADIUS / 2) {
90 mobsController.player.cursorY += if (joystick.activeY > joystick.centerY) 1 else -1
91 cursorTimeoutMs = TimeUtils.millis()
92 }
94 mobsController.player.checkCursorBounds(gameWorld)
95 }
97 private fun handleDragged() {
98 if (mobsController.player.controlMode == Player.ControlMode.CURSOR) {
99 handleCursor()
100 return
103 val joystick = mainConfig.joystick ?: return
104 val joyVector = joystick.getVelocityVector()
106 mobsController.player.velocity.x = joyVector.x
108 mobsController.player.setDir(
109 if (joyVector.x < 0) {
110 Mob.Direction.LEFT
111 } else {
112 Mob.Direction.RIGHT
116 if (mobsController.player.isFlyMode) {
117 mobsController.player.velocity.y = joyVector.y
121 override fun handle(action: MouseInputAction) {
122 when (action.actionKey) {
123 is MouseInputActionKey.Dragged -> handleDragged()
124 else -> {
125 if (action.actionKey.touchUp) {
126 handleTouchUp(action)
127 } else {
128 handleTouchDown(action)