DEADSOFTWARE

ca36909c43236c6bbfa8fd56fdc334f668166b59
[cavedroid.git] /
1 package ru.fredboy.cavedroid.ux.controls.input.handler.touch
2
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
20
21 @GameScope
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 {
30
31 private var activateTimeMs = 0L
32 private var cursorTimeoutMs = 100L
33
34 private var active = false
35 set(value) {
36 if (!value) {
37 resetVelocity()
38 if (TimeUtils.timeSinceMillis(activateTimeMs) < 200L &&
39 mobController.player.controlMode != Player.ControlMode.CURSOR) {
40 mobController.player.jump()
41 }
42 } else {
43 activateTimeMs = TimeUtils.millis()
44 }
45 field = value
46 }
47
48 private fun resetVelocity() {
49 mobController.player.velocity.x = 0f
50
51 if (mobController.player.isFlyMode) {
52 mobController.player.velocity.y = 0f
53 }
54 }
55
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))
66
67 }
68
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
72 active = true
73 }
74
75 private fun handleTouchUp(action: MouseInputAction) {
76 gameConfigurationRepository.getJoystick()?.deactivate()
77 active = false
78 }
79
80 private fun handleCursor() {
81 val joystick = gameConfigurationRepository.getJoystick() ?: return
82
83 if (TimeUtils.timeSinceMillis(cursorTimeoutMs) < 150L) {
84 return
85 }
86
87 val pastCursorX = mobController.player.cursorX
88 val pastCursorY = mobController.player.cursorY
89
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()
93 }
94
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()
98 }
99
100 mobController.checkPlayerCursorBounds()
101
102 if (mobController.player.cursorX != pastCursorX || mobController.player.cursorY != pastCursorY) {
103 mobController.player.blockDamage = 0f
104 }
105 }
106
107 private fun handleDragged() {
108 if (!active) {
109 return
110 }
111
112 if (mobController.player.controlMode == Player.ControlMode.CURSOR) {
113 handleCursor()
114 return
115 }
116
117 val joystick = gameConfigurationRepository.getJoystick() ?: return
118 val joyVector = joystick.getVelocityVector()
119
120 if (mobController.player.isFlyMode) {
121 joyVector.scl(2f);
122 }
123
124 mobController.player.velocity.x = joyVector.x
125
126 mobController.player.direction = if (joyVector.x < 0) {
127 Direction.LEFT
128 } else {
129 Direction.RIGHT
130 }
131
132 if (mobController.player.isFlyMode) {
133 mobController.player.velocity.y = joyVector.y
134 }
135 }
136
137 override fun handle(action: MouseInputAction) {
138 when (action.actionKey) {
139 is MouseInputActionKey.Dragged -> handleDragged()
140 else -> {
141 if (action.actionKey.touchUp) {
142 handleTouchUp(action)
143 } else {
144 handleTouchDown(action)
145 }
146 }
147 }
148 }
149
150 }