1 package ru.fredboy.cavedroid.ux.controls.input.handler.touch
3 import com.badlogic.gdx.utils.TimeUtils
4 import ru.fredboy.cavedroid.common.di.GameScope
5 import ru.fredboy.cavedroid.common.model.Joystick
6 import ru.fredboy.cavedroid.domain.assets.usecase.GetTextureRegionByNameUseCase
7 import ru.fredboy.cavedroid.domain.configuration.repository.GameConfigurationRepository
8 import ru.fredboy.cavedroid.entity.mob.model.Direction
9 import ru.fredboy.cavedroid.entity.mob.model.Player
10 import ru.fredboy.cavedroid.game.controller.mob.MobController
11 import ru.fredboy.cavedroid.game.window.GameWindowType
12 import ru.fredboy.cavedroid.game.window.GameWindowsManager
13 import ru.fredboy.cavedroid.game.world.GameWorld
14 import ru.fredboy.cavedroid.ux.controls.input.IMouseInputHandler
15 import ru.fredboy.cavedroid.ux.controls.input.action.MouseInputAction
16 import ru.fredboy.cavedroid.ux.controls.input.action.keys.MouseInputActionKey
17 import ru.fredboy.cavedroid.ux.controls.input.annotation.BindMouseInputHandler
18 import ru.fredboy.cavedroid.ux.controls.input.isInsideHotbar
19 import javax.inject.Inject
22 @BindMouseInputHandler
23 class JoystickInputHandler @Inject constructor(
24 private val gameConfigurationRepository: GameConfigurationRepository,
25 private val mobController: MobController,
26 private val gameWindowsManager: GameWindowsManager,
27 private val gameWorld: GameWorld,
28 private val textureRegions: GetTextureRegionByNameUseCase,
29 ) : IMouseInputHandler {
31 private var activateTimeMs = 0L
32 private var cursorTimeoutMs = 100L
34 private var active = false
38 if (TimeUtils.timeSinceMillis(activateTimeMs) < 200L &&
39 mobController.player.controlMode != Player.ControlMode.CURSOR) {
40 mobController.player.jump()
43 activateTimeMs = TimeUtils.millis()
48 private fun resetVelocity() {
49 mobController.player.velocity.x = 0f
51 if (mobController.player.isFlyMode) {
52 mobController.player.velocity.y = 0f
56 override fun checkConditions(action: MouseInputAction): Boolean {
57 return gameWindowsManager.currentWindowType == GameWindowType.NONE &&
58 gameConfigurationRepository.isTouch() &&
59 // mobsController.player.controlMode == Player.ControlMode.WALK &&
60 gameConfigurationRepository.getJoystick() != null &&
61 (action.actionKey is MouseInputActionKey.Touch) &&
62 (action.actionKey.pointer == gameConfigurationRepository.getJoystick()?.pointer || !active) &&
63 ((action.actionKey is MouseInputActionKey.Dragged) ||
64 (action.screenX < action.cameraViewport.width / 2 && !action.actionKey.touchUp || active)) &&
65 !(action.actionKey is MouseInputActionKey.Screen && action.isInsideHotbar(textureRegions))
69 private fun handleTouchDown(action: MouseInputAction) {
70 val key = action.actionKey as MouseInputActionKey.Screen
71 gameConfigurationRepository.getJoystick()?.activate(action.screenX, action.screenY, key.pointer) ?: return
75 private fun handleTouchUp(action: MouseInputAction) {
76 gameConfigurationRepository.getJoystick()?.deactivate()
80 private fun handleCursor() {
81 val joystick = gameConfigurationRepository.getJoystick() ?: return
83 if (TimeUtils.timeSinceMillis(cursorTimeoutMs) < 150L) {
87 val pastCursorX = mobController.player.cursorX
88 val pastCursorY = mobController.player.cursorY
90 if (Math.abs(joystick.activeX - joystick.centerX) >= Joystick.RADIUS / 2) {
91 mobController.player.cursorX += if (joystick.activeX > joystick.centerX) 1 else -1
92 cursorTimeoutMs = TimeUtils.millis()
95 if (Math.abs(joystick.activeY - joystick.centerY) >= Joystick.RADIUS / 2) {
96 mobController.player.cursorY += if (joystick.activeY > joystick.centerY) 1 else -1
97 cursorTimeoutMs = TimeUtils.millis()
100 mobController.checkPlayerCursorBounds()
102 if (mobController.player.cursorX != pastCursorX || mobController.player.cursorY != pastCursorY) {
103 mobController.player.blockDamage = 0f
107 private fun handleDragged() {
112 if (mobController.player.controlMode == Player.ControlMode.CURSOR) {
117 val joystick = gameConfigurationRepository.getJoystick() ?: return
118 val joyVector = joystick.getVelocityVector()
120 if (mobController.player.isFlyMode) {
124 mobController.player.velocity.x = joyVector.x
126 mobController.player.direction = if (joyVector.x < 0) {
132 if (mobController.player.isFlyMode) {
133 mobController.player.velocity.y = joyVector.y
137 override fun handle(action: MouseInputAction) {
138 when (action.actionKey) {
139 is MouseInputActionKey.Dragged -> handleDragged()
141 if (action.actionKey.touchUp) {
142 handleTouchUp(action)
144 handleTouchDown(action)