DEADSOFTWARE

Input handler modules code generation
[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.utils.TimeUtils
4 import ru.deadsoftware.cavedroid.MainConfig
5 import ru.deadsoftware.cavedroid.game.GameScope
6 import ru.deadsoftware.cavedroid.game.GameUiWindow
7 import ru.deadsoftware.cavedroid.game.input.*
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.mobs.Mob
11 import ru.deadsoftware.cavedroid.game.mobs.MobsController
12 import ru.deadsoftware.cavedroid.game.mobs.player.Player
13 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
14 import ru.deadsoftware.cavedroid.game.world.GameWorld
15 import javax.inject.Inject
17 @GameScope
18 @MouseInputHandler
19 class JoystickInputHandler @Inject constructor(
20 private val mainConfig: MainConfig,
21 private val mobsController: MobsController,
22 private val gameWindowsManager: GameWindowsManager,
23 private val gameWorld: GameWorld,
24 ) : IMouseInputHandler {
26 private var activateTimeMs = 0L
27 private var cursorTimeoutMs = 100L
29 private var active = false
30 set(value) {
31 if (!value) {
32 resetVelocity()
33 if (TimeUtils.timeSinceMillis(activateTimeMs) < 200L &&
34 mobsController.player.controlMode != Player.ControlMode.CURSOR) {
35 mobsController.player.jump()
36 }
37 } else {
38 activateTimeMs = TimeUtils.millis()
39 }
40 field = value
41 }
43 private fun resetVelocity() {
44 mobsController.player.velocity.x = 0f
46 if (mobsController.player.isFlyMode) {
47 mobsController.player.velocity.y = 0f
48 }
49 }
51 override fun checkConditions(action: MouseInputAction): Boolean {
52 return gameWindowsManager.getCurrentWindow() == GameUiWindow.NONE &&
53 mainConfig.isTouch &&
54 // mobsController.player.controlMode == Player.ControlMode.WALK &&
55 mainConfig.joystick != null &&
56 (action.actionKey is MouseInputActionKey.Touch) &&
57 (action.actionKey.pointer == mainConfig.joystick?.pointer || !active) &&
58 ((action.actionKey is MouseInputActionKey.Dragged) ||
59 (action.screenX < action.cameraViewport.width / 2 && !action.actionKey.touchUp || active)) &&
60 !(action.actionKey is MouseInputActionKey.Screen && isInsideHotbar(action))
62 }
64 private fun handleTouchDown(action: MouseInputAction) {
65 val key = action.actionKey as MouseInputActionKey.Screen
66 mainConfig.joystick?.activate(action.screenX, action.screenY, key.pointer) ?: return
67 active = true
68 }
70 private fun handleTouchUp(action: MouseInputAction) {
71 mainConfig.joystick?.deactivate()
72 active = false
73 }
75 private fun handleCursor() {
76 val joystick = mainConfig.joystick ?: return
78 if (TimeUtils.timeSinceMillis(cursorTimeoutMs) < 150L) {
79 return
80 }
82 val pastCursorX = mobsController.player.cursorX
83 val pastCursorY = mobsController.player.cursorY
85 if (Math.abs(joystick.activeX - joystick.centerX) >= Joystick.RADIUS / 2) {
86 mobsController.player.cursorX += if (joystick.activeX > joystick.centerX) 1 else -1
87 cursorTimeoutMs = TimeUtils.millis()
88 }
90 if (Math.abs(joystick.activeY - joystick.centerY) >= Joystick.RADIUS / 2) {
91 mobsController.player.cursorY += if (joystick.activeY > joystick.centerY) 1 else -1
92 cursorTimeoutMs = TimeUtils.millis()
93 }
95 mobsController.player.checkCursorBounds(gameWorld)
97 if (mobsController.player.cursorX != pastCursorX || mobsController.player.cursorY != pastCursorY) {
98 mobsController.player.blockDamage = 0f
99 }
102 private fun handleDragged() {
103 if (!active) {
104 return
107 if (mobsController.player.controlMode == Player.ControlMode.CURSOR) {
108 handleCursor()
109 return
112 val joystick = mainConfig.joystick ?: return
113 val joyVector = joystick.getVelocityVector()
115 if (mobsController.player.isFlyMode) {
116 joyVector.scl(2f);
119 mobsController.player.velocity.x = joyVector.x
121 mobsController.player.setDir(
122 if (joyVector.x < 0) {
123 Mob.Direction.LEFT
124 } else {
125 Mob.Direction.RIGHT
129 if (mobsController.player.isFlyMode) {
130 mobsController.player.velocity.y = joyVector.y
134 override fun handle(action: MouseInputAction) {
135 when (action.actionKey) {
136 is MouseInputActionKey.Dragged -> handleDragged()
137 else -> {
138 if (action.actionKey.touchUp) {
139 handleTouchUp(action)
140 } else {
141 handleTouchDown(action)