mima-engine 0.4.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. mima/__init__.py +4 -0
  2. mima/backend/__init__.py +1 -0
  3. mima/backend/pygame_assets.py +401 -0
  4. mima/backend/pygame_audio.py +78 -0
  5. mima/backend/pygame_backend.py +603 -0
  6. mima/backend/pygame_camera.py +63 -0
  7. mima/backend/pygame_events.py +695 -0
  8. mima/backend/touch_control_scheme_a.py +126 -0
  9. mima/backend/touch_control_scheme_b.py +132 -0
  10. mima/core/__init__.py +0 -0
  11. mima/core/collision.py +325 -0
  12. mima/core/database.py +58 -0
  13. mima/core/engine.py +367 -0
  14. mima/core/mode_engine.py +81 -0
  15. mima/core/scene_engine.py +81 -0
  16. mima/integrated/__init__.py +0 -0
  17. mima/integrated/entity.py +183 -0
  18. mima/integrated/layered_map.py +351 -0
  19. mima/integrated/sprite.py +156 -0
  20. mima/layered/__init__.py +0 -0
  21. mima/layered/assets.py +56 -0
  22. mima/layered/scene.py +415 -0
  23. mima/layered/shape.py +99 -0
  24. mima/layered/shaped_sprite.py +78 -0
  25. mima/layered/virtual_input.py +302 -0
  26. mima/maps/__init__.py +0 -0
  27. mima/maps/template.py +71 -0
  28. mima/maps/tile.py +20 -0
  29. mima/maps/tile_animation.py +7 -0
  30. mima/maps/tile_info.py +10 -0
  31. mima/maps/tile_layer.py +52 -0
  32. mima/maps/tiled/__init__.py +0 -0
  33. mima/maps/tiled/tiled_layer.py +48 -0
  34. mima/maps/tiled/tiled_map.py +95 -0
  35. mima/maps/tiled/tiled_object.py +79 -0
  36. mima/maps/tiled/tiled_objectgroup.py +25 -0
  37. mima/maps/tiled/tiled_template.py +49 -0
  38. mima/maps/tiled/tiled_tile.py +90 -0
  39. mima/maps/tiled/tiled_tileset.py +51 -0
  40. mima/maps/tilemap.py +216 -0
  41. mima/maps/tileset.py +39 -0
  42. mima/maps/tileset_info.py +9 -0
  43. mima/maps/transition_map.py +146 -0
  44. mima/objects/__init__.py +0 -0
  45. mima/objects/animated_sprite.py +217 -0
  46. mima/objects/attribute_effect.py +26 -0
  47. mima/objects/attributes.py +126 -0
  48. mima/objects/creature.py +384 -0
  49. mima/objects/dynamic.py +206 -0
  50. mima/objects/effects/__init__.py +0 -0
  51. mima/objects/effects/colorize_screen.py +60 -0
  52. mima/objects/effects/debug_box.py +133 -0
  53. mima/objects/effects/light.py +103 -0
  54. mima/objects/effects/show_sprite.py +50 -0
  55. mima/objects/effects/walking_on_grass.py +70 -0
  56. mima/objects/effects/walking_on_water.py +57 -0
  57. mima/objects/loader.py +111 -0
  58. mima/objects/projectile.py +111 -0
  59. mima/objects/sprite.py +116 -0
  60. mima/objects/world/__init__.py +0 -0
  61. mima/objects/world/color_gate.py +67 -0
  62. mima/objects/world/color_switch.py +101 -0
  63. mima/objects/world/container.py +175 -0
  64. mima/objects/world/floor_switch.py +109 -0
  65. mima/objects/world/gate.py +178 -0
  66. mima/objects/world/light_source.py +121 -0
  67. mima/objects/world/logic_gate.py +157 -0
  68. mima/objects/world/movable.py +399 -0
  69. mima/objects/world/oneway.py +195 -0
  70. mima/objects/world/pickup.py +157 -0
  71. mima/objects/world/switch.py +179 -0
  72. mima/objects/world/teleport.py +308 -0
  73. mima/py.typed +0 -0
  74. mima/scripts/__init__.py +2 -0
  75. mima/scripts/command.py +38 -0
  76. mima/scripts/commands/__init__.py +0 -0
  77. mima/scripts/commands/add_quest.py +19 -0
  78. mima/scripts/commands/change_map.py +34 -0
  79. mima/scripts/commands/close_dialog.py +9 -0
  80. mima/scripts/commands/equip_weapon.py +23 -0
  81. mima/scripts/commands/give_item.py +26 -0
  82. mima/scripts/commands/give_resource.py +51 -0
  83. mima/scripts/commands/move_map.py +152 -0
  84. mima/scripts/commands/move_to.py +49 -0
  85. mima/scripts/commands/oneway_move.py +58 -0
  86. mima/scripts/commands/parallel.py +66 -0
  87. mima/scripts/commands/play_sound.py +13 -0
  88. mima/scripts/commands/present_item.py +53 -0
  89. mima/scripts/commands/progress_quest.py +12 -0
  90. mima/scripts/commands/quit_game.py +8 -0
  91. mima/scripts/commands/save_game.py +14 -0
  92. mima/scripts/commands/screen_fade.py +83 -0
  93. mima/scripts/commands/serial.py +69 -0
  94. mima/scripts/commands/set_facing_direction.py +21 -0
  95. mima/scripts/commands/set_spawn_map.py +17 -0
  96. mima/scripts/commands/show_choices.py +52 -0
  97. mima/scripts/commands/show_dialog.py +118 -0
  98. mima/scripts/commands/take_coins.py +23 -0
  99. mima/scripts/script_processor.py +61 -0
  100. mima/standalone/__init__.py +0 -0
  101. mima/standalone/camera.py +153 -0
  102. mima/standalone/geometry.py +1318 -0
  103. mima/standalone/multicolumn_list.py +54 -0
  104. mima/standalone/pixel_font.py +84 -0
  105. mima/standalone/scripting.py +145 -0
  106. mima/standalone/spatial.py +186 -0
  107. mima/standalone/sprite.py +158 -0
  108. mima/standalone/tiled_map.py +1247 -0
  109. mima/standalone/transformed_view.py +433 -0
  110. mima/standalone/user_input.py +563 -0
  111. mima/states/__init__.py +0 -0
  112. mima/states/game_state.py +189 -0
  113. mima/states/memory.py +28 -0
  114. mima/states/quest.py +71 -0
  115. mima/types/__init__.py +0 -0
  116. mima/types/alignment.py +7 -0
  117. mima/types/blend.py +8 -0
  118. mima/types/damage.py +42 -0
  119. mima/types/direction.py +44 -0
  120. mima/types/gate_color.py +7 -0
  121. mima/types/graphic_state.py +23 -0
  122. mima/types/keys.py +64 -0
  123. mima/types/mode.py +9 -0
  124. mima/types/nature.py +12 -0
  125. mima/types/object.py +22 -0
  126. mima/types/player.py +9 -0
  127. mima/types/position.py +13 -0
  128. mima/types/start.py +7 -0
  129. mima/types/terrain.py +9 -0
  130. mima/types/tile_collision.py +11 -0
  131. mima/types/weapon_slot.py +6 -0
  132. mima/types/window.py +44 -0
  133. mima/usables/__init__.py +0 -0
  134. mima/usables/item.py +51 -0
  135. mima/usables/weapon.py +68 -0
  136. mima/util/__init__.py +1 -0
  137. mima/util/colors.py +50 -0
  138. mima/util/constants.py +55 -0
  139. mima/util/functions.py +38 -0
  140. mima/util/input_defaults.py +170 -0
  141. mima/util/logging.py +51 -0
  142. mima/util/property.py +8 -0
  143. mima/util/runtime_config.py +327 -0
  144. mima/util/trading_item.py +23 -0
  145. mima/view/__init__.py +0 -0
  146. mima/view/camera.py +192 -0
  147. mima/view/mima_mode.py +618 -0
  148. mima/view/mima_scene.py +231 -0
  149. mima/view/mima_view.py +12 -0
  150. mima/view/mima_window.py +244 -0
  151. mima_engine-0.4.0.dist-info/METADATA +47 -0
  152. mima_engine-0.4.0.dist-info/RECORD +153 -0
  153. mima_engine-0.4.0.dist-info/WHEEL +4 -0
@@ -0,0 +1,695 @@
1
+ import logging
2
+ import time
3
+ from typing import Any, Dict, List, Optional, Tuple, Union
4
+
5
+ import pygame
6
+
7
+ from ..types.keys import Key as K
8
+ from ..types.player import Player
9
+ from ..util.constants import AXIS_ACTIVATION, AXIS_DEADZONE, DOUBLE_TAP_SPEED
10
+ from ..util.input_defaults import (
11
+ BUTTONS,
12
+ DEFAULT_JOYSTICK_MAP,
13
+ DEFAULT_KEYBOARD_MAP,
14
+ DEFAULT_TOUCHSCREEN_MAP,
15
+ )
16
+ from .touch_control_scheme_a import TouchControlSchemeA
17
+ from .touch_control_scheme_b import TouchControlSchemeB
18
+
19
+ LOG = logging.getLogger(__name__)
20
+
21
+ KEYBOARD_EVENTS = [pygame.KEYUP, pygame.KEYDOWN]
22
+ JOYSTICK_EVENTS = [
23
+ pygame.JOYDEVICEADDED,
24
+ pygame.JOYDEVICEREMOVED,
25
+ pygame.JOYBUTTONUP,
26
+ pygame.JOYBUTTONDOWN,
27
+ pygame.JOYAXISMOTION,
28
+ pygame.JOYHATMOTION,
29
+ ]
30
+ TOUCH_EVENTS = [pygame.FINGERUP, pygame.FINGERDOWN, pygame.FINGERMOTION]
31
+ SDL2_BACKGROUND_EVENTS = [259, 260, 261, 262]
32
+
33
+
34
+ class PygameUserInput:
35
+ """A class that manages keys and key events."""
36
+
37
+ def __init__(
38
+ self,
39
+ key_map: Optional[Dict[K, List[str]]] = None,
40
+ joystick_map: Optional[Dict[K, List[Union[str, int]]]] = None,
41
+ joy_to_player: Optional[Dict[int, Player]] = None,
42
+ platform: str = "PC",
43
+ ):
44
+ self._last_keys: Dict[K, bool] = {}
45
+ self._new_keys: Dict[K, bool] = {but: False for but in BUTTONS}
46
+ self._touch_control = TouchControlSchemeB()
47
+ # self._left_finger_tap_pos: pygame.Vector2 = pygame.Vector2(0, 0)
48
+ # self._right_finger_tap_pos: pygame.Vector2 = pygame.Vector2(0, 0)
49
+ # self._left_finger_pos: pygame.Vector2 = pygame.Vector2(0, 0)
50
+ # self._right_finger_pos: pygame.Vector2 = pygame.Vector2(0, 0)
51
+ # self._last_left_tap: float = 0.0
52
+ # self._last_right_tap: float = 0.0
53
+ # self._last_left_motion: float = 0.0
54
+ # self._last_right_motion: float = 0.0
55
+ self._key_map: Dict[K, List[int]] = {}
56
+ self.joystick_to_player: Dict[int, Player] = (
57
+ joy_to_player
58
+ if joy_to_player is not None
59
+ else {
60
+ 0: Player.P1,
61
+ 1: Player.P2,
62
+ 2: Player.P3,
63
+ 4: Player.P4,
64
+ }
65
+ )
66
+ self.vd = pygame.Vector2(0, 0)
67
+ self.joystick_input_enabled: bool = True
68
+ if platform == "android":
69
+ # Disable motion control
70
+ # FIXME allow external controllers
71
+ self.joystick_input_enabled = False
72
+ # self._fingers: List[pygame.Vector2] = []
73
+
74
+ # if key_map is None:
75
+ # self._key_map = dict()
76
+ # for key, vals in RuntimeConfig().keymap.items():
77
+ # self._key_map[key] = list()
78
+ # for val in vals:
79
+ # self._key_map[key].append(getattr(pygame, f"K_{val}"))
80
+ # else:
81
+ key_map = key_map if key_map is not None else DEFAULT_KEYBOARD_MAP
82
+ for key, vals in key_map.items():
83
+ self._key_map[key] = []
84
+ for val in vals:
85
+ if len(val) > 1:
86
+ val = val.upper()
87
+ self._key_map[key].append(getattr(pygame, f"K_{val}"))
88
+
89
+ # print(self._key_map)
90
+ # self._key_map = key_map
91
+ # if joystick_map is None:
92
+ # self._joystick_map = DEFAULT_JOYSTICK_MAP
93
+ # else:
94
+ if joystick_map is None:
95
+ self._joystick_map = {}
96
+ for but in BUTTONS:
97
+ self._joystick_map[but] = DEFAULT_JOYSTICK_MAP[
98
+ K(but.value % 12)
99
+ ]
100
+ else:
101
+ self._joystick_map = joystick_map
102
+
103
+ self.joysticks: Dict[Player, Optional[Any]] = {}
104
+ self._init_joysticks()
105
+ self.width = 0
106
+ self.height = 0
107
+ self._past_events = {}
108
+ self._new_events = {}
109
+ self._collect_all_events = False
110
+ self.enable_touch_controls = False
111
+
112
+ def reset(self):
113
+ self._last_keys = self._new_keys.copy()
114
+ self._past_events = self._new_events.copy()
115
+ self.all_events = []
116
+
117
+ def get_keyboard_map(self) -> Dict[K, List[str]]:
118
+ key_map: Dict[K, List[str]] = {}
119
+ for key, mapping in self._key_map.items():
120
+ key_map[key] = []
121
+ for val in mapping:
122
+ key_map[key].append(pygame.key.name(val))
123
+ return key_map
124
+
125
+ def get_joystick_map(self):
126
+ return self._joystick_map
127
+
128
+ def get_key_name(self, val: int):
129
+ return pygame.key.name(val)
130
+
131
+ def update_keyboard_map(self, kbmap: Dict[K, List[str]]):
132
+ new_keymap: Dict[K, List[int]] = {}
133
+ try:
134
+ for key, vals in kbmap.items():
135
+ new_keymap[key] = []
136
+ for val in vals:
137
+ if len(val) > 1:
138
+ val = val.upper()
139
+ new_keymap[key].append(getattr(pygame, f"K_{val}"))
140
+ except Exception as err:
141
+ LOG.exception(f"Failed to update keyboard map: {err}")
142
+ return
143
+ self._key_map = new_keymap
144
+
145
+ def update_joystick_map(self, jsmap):
146
+ self._joystick_map = jsmap
147
+
148
+ def update_joysticks(self, reassign: List[Tuple[int, Player]]):
149
+ self.joystick_to_player = {}
150
+ for item in reassign:
151
+ self.joystick_to_player[item[0]] = item[1]
152
+ # k2d = None
153
+ # for jid, p in self.joystick_to_player.items():
154
+ # if p == player:
155
+ # k2d = jid
156
+ # self.joystick_to_player[joy] = player
157
+ # self.joystick_to_player[k2d] = None
158
+
159
+ def process(self, event):
160
+ if event.type in KEYBOARD_EVENTS:
161
+ self._handle_keyboard(event)
162
+
163
+ if event.type in JOYSTICK_EVENTS and self.joystick_input_enabled:
164
+ self._handle_joystick(event)
165
+
166
+ # self._touch_control.update(self.width, self.height)
167
+ if self.enable_touch_controls and event.type in TOUCH_EVENTS:
168
+ self._handle_touch(event)
169
+
170
+ # print(
171
+ # {key: val for key, val in self._last_keys.items() if val},
172
+ # {k: v for k, v in self._new_keys.items() if v},
173
+ # )
174
+
175
+ def _handle_keyboard(self, event):
176
+ if self._collect_all_events:
177
+ self._collect_keyboard_events(event)
178
+
179
+ if event.type == pygame.KEYDOWN:
180
+ for but, keys in self._key_map.items():
181
+ if event.key in keys:
182
+ self.set_key(but)
183
+
184
+ if event.type == pygame.KEYUP:
185
+ for but, keys in self._key_map.items():
186
+ if event.key in keys:
187
+ self.unset_key(but)
188
+
189
+ def _js_real(self, joy, but):
190
+ return K[f"{self.joystick_to_player[joy].name}_{but.name}"]
191
+
192
+ def _handle_joystick(self, event):
193
+ if self._collect_all_events:
194
+ self._collect_joystick_events(event)
195
+
196
+ if event.type == pygame.JOYDEVICEREMOVED:
197
+ self.joystick = {}
198
+ LOG.info("Gamepad unplugged.")
199
+
200
+ if event.type == pygame.JOYDEVICEADDED:
201
+ self._init_joysticks()
202
+ LOG.info("Detected new gamepad device %s.", self.joysticks)
203
+
204
+ if event.type == pygame.JOYBUTTONDOWN:
205
+ if event.joy not in self.joystick_to_player:
206
+ return
207
+ for but, keys in self._joystick_map.items():
208
+ if (
209
+ str(event.button) in keys
210
+ and self.joystick_to_player[event.joy] is not None
211
+ and self.joystick_to_player[event.joy].name in but.name
212
+ ):
213
+ self.set_key(but)
214
+
215
+ if event.type == pygame.JOYBUTTONUP:
216
+ if event.joy not in self.joystick_to_player:
217
+ return
218
+ for but, keys in self._joystick_map.items():
219
+ if (
220
+ str(event.button) in keys
221
+ and self.joystick_to_player[event.joy] is not None
222
+ and self.joystick_to_player[event.joy].name in but.name
223
+ ):
224
+ self.unset_key(but)
225
+
226
+ if event.type == pygame.JOYHATMOTION:
227
+ if event.joy not in self.joystick_to_player:
228
+ return
229
+
230
+ if event.value[0] == 0:
231
+ self.unset_key(self._js_real(event.joy, K.LEFT))
232
+ self.unset_key(self._js_real(event.joy, K.RIGHT))
233
+ elif event.value[0] == -1:
234
+ self.set_key(self._js_real(event.joy, K.LEFT))
235
+ self.unset_key(self._js_real(event.joy, K.RIGHT))
236
+ else:
237
+ self.unset_key(self._js_real(event.joy, K.LEFT))
238
+ self.set_key(self._js_real(event.joy, K.RIGHT))
239
+
240
+ if event.value[1] == 0:
241
+ self.unset_key(self._js_real(event.joy, K.UP))
242
+ self.unset_key(self._js_real(event.joy, K.DOWN))
243
+ elif event.value[1] == 1:
244
+ self.set_key(self._js_real(event.joy, K.UP))
245
+ self.unset_key(self._js_real(event.joy, K.DOWN))
246
+ else:
247
+ self.unset_key(self._js_real(event.joy, K.UP))
248
+ self.set_key(self._js_real(event.joy, K.DOWN))
249
+
250
+ if event.type == pygame.JOYAXISMOTION:
251
+ if event.joy not in self.joystick_to_player:
252
+ return
253
+
254
+ if event.axis == 0:
255
+ if event.value < -AXIS_ACTIVATION:
256
+ self.set_key(self._js_real(event.joy, K.LEFT))
257
+ self.unset_key(self._js_real(event.joy, K.RIGHT))
258
+ elif event.value > AXIS_ACTIVATION:
259
+ self.unset_key(self._js_real(event.joy, K.LEFT))
260
+ self.set_key(self._js_real(event.joy, K.RIGHT))
261
+ elif abs(event.value) < AXIS_DEADZONE:
262
+ self.unset_key(self._js_real(event.joy, K.LEFT))
263
+ self.unset_key(self._js_real(event.joy, K.RIGHT))
264
+ else:
265
+ pass
266
+ if event.axis == 1:
267
+ if event.value < -AXIS_ACTIVATION:
268
+ self.set_key(self._js_real(event.joy, K.UP))
269
+ self.unset_key(self._js_real(event.joy, K.DOWN))
270
+ elif event.value > AXIS_ACTIVATION:
271
+ self.unset_key(self._js_real(event.joy, K.UP))
272
+ self.set_key(self._js_real(event.joy, K.DOWN))
273
+ elif abs(event.value) < AXIS_DEADZONE:
274
+ self.unset_key(self._js_real(event.joy, K.UP))
275
+ self.unset_key(self._js_real(event.joy, K.DOWN))
276
+
277
+ def _handle_touch(self, event):
278
+ set_keys, unset_keys = self._touch_control.handle_touch(
279
+ event, self.width, self.height
280
+ )
281
+ for key in unset_keys:
282
+ self.unset_key(key)
283
+ for key in set_keys:
284
+ self.set_key(key)
285
+
286
+ # finger_pos = pygame.Vector2(
287
+ # event.x * self.width, event.y * self.height
288
+ # )
289
+
290
+ # if event.type == pygame.FINGERDOWN:
291
+ # tap = time.time()
292
+ # for key, area in DEFAULT_TOUCHSCREEN_MAP.items():
293
+
294
+ # if (
295
+ # area[0][0] <= event.x < area[1][0]
296
+ # and area[0][1] <= event.y < area[1][1]
297
+ # ):
298
+ # if key == K.P1_UP:
299
+ # self._left_finger_tap_pos = finger_pos
300
+ # if tap - self._last_left_tap < DOUBLE_TAP_SPEED:
301
+ # # print("Left Double Tap")
302
+ # self.set_key(K.P1_SELECT)
303
+ # self._last_left_tap = tap
304
+ # elif key == K.P1_L:
305
+ # self.set_key(K.P1_L)
306
+ # else:
307
+ # self.set_key(key)
308
+ # self._right_finger_tap_pos = finger_pos
309
+ # self._last_right_tap = tap
310
+
311
+ # # if event.x < 0.0625 and event.y < 0.1111:
312
+ # # self.set_key(K.L)
313
+ # # elif event.x > 1.0 - 0.0625 and event.y < 0.1111:
314
+ # # self.set_key(K.R)
315
+ # # elif event.x < 0.5:
316
+ # # # print(f"Left Finger Down: {finger_pos}")
317
+ # # self._left_finger_tap_pos = finger_pos
318
+
319
+ # # if tap - self._last_left_tap < DOUBLE_TAP_SPEED:
320
+ # # # print("Left Double Tap")
321
+ # # self.set_key(K.SELECT)
322
+ # # self._last_left_tap = tap
323
+ # # # self._left_finger_pos.x = event.x
324
+ # # # self._left_finger_pos.y = event.y
325
+
326
+ # # # if tap - self._last_left_tap < 0.2:
327
+ # # # print("Left Double Tap")
328
+ # # # # self._set_key(K.START)
329
+ # # # # self._unset_key(K.RIGHT)
330
+ # # # # self._unset_key(K.LEFT)
331
+ # # # # self._unset_key(K.UP)
332
+ # # # # self._unset_key(K.DOWN)
333
+ # # else:
334
+ # # self._right_finger_tap_pos = finger_pos
335
+
336
+ # # # if tap - self._last_right_tap < DOUBLE_TAP_SPEED:
337
+ # # # # print("Right Double Tap")
338
+ # # # self.set_key(K.SELECT)
339
+ # # self._last_right_tap = tap
340
+ # # if event.y < 0.3:
341
+ # # self.set_key(K.START)
342
+ # # elif event.x < 0.75:
343
+ # # self.set_key(K.B)
344
+ # # else:
345
+ # # self.set_key(K.A)
346
+ # # self._right_finger_pos.x = event.x
347
+ # # self._right_finger_pos.y = event.y
348
+ # # if tap - self._last_right_tap < 0.2:
349
+ # # print("Right Double Tap")
350
+
351
+ # if event.type == pygame.FINGERUP:
352
+ # # release = time.time()
353
+ # # finger_dist = (finger_pos - self._left_finger_tap_pos).length()
354
+
355
+ # if event.x < 0.5:
356
+ # # print(f"Left Finger Up: {finger_pos}")
357
+ # # if (
358
+ # # SINGLE_TAP_MIN
359
+ # # < release - self._last_left_tap
360
+ # # < SINGLE_TAP_MAX
361
+ # # ) and finger_dist < 2.5:
362
+ # # print("Left Single Tap")
363
+ # # # self.set_key(K.START)
364
+
365
+ # self.unset_key(K.P1_SELECT)
366
+ # self.unset_key(K.P1_RIGHT)
367
+ # self.unset_key(K.P1_LEFT)
368
+ # self.unset_key(K.P1_UP)
369
+ # self.unset_key(K.P1_DOWN)
370
+ # self.unset_key(K.P1_L)
371
+ # # print(
372
+ # # f"Left Finger moved {finger_dist} "
373
+ # # f"({release - self._last_left_tap} s)"
374
+ # # )
375
+ # else:
376
+ # self.unset_key(K.P1_START)
377
+ # self.unset_key(K.P1_A)
378
+ # self.unset_key(K.P1_B)
379
+ # self.unset_key(K.P1_Y)
380
+ # self.unset_key(K.P1_X)
381
+ # self.unset_key(K.P1_R)
382
+ # # print(f"Right Finger Up: {finger_pos}")
383
+ # # if (
384
+ # # SINGLE_TAP_MIN
385
+ # # < release - self._last_right_tap
386
+ # # < SINGLE_TAP_MAX
387
+ # # ) and finger_dist < 2.5:
388
+ # # print("Right Single Tap")
389
+
390
+ # # print(
391
+ # # f"Left Finger moved {finger_dist} "
392
+ # # f"({release - self._last_left_tap} s)"
393
+ # # )
394
+ # #
395
+ # # if event.x < 0.5:
396
+ # # if 0.1 < release - self._last_left_tap < 0.25:
397
+ # # print("Left Single Tap")
398
+
399
+ # # self._left_finger_pos.x = 0
400
+ # # self._left_finger_pos.y = 0
401
+ # # self._unset_key(K.DOWN)
402
+ # # self._unset_key(K.LEFT)
403
+ # # self._unset_key(K.UP)
404
+ # # self._unset_key(K.RIGHT)
405
+ # # self._unset_key(K.START)
406
+ # # else:
407
+ # # if 0.1 < release - self._last_right_tap < 0.25:
408
+ # # print("Right Single Tap")
409
+
410
+ # # self._unset_key(K.A)
411
+ # # self._unset_key(K.B)
412
+ # if event.type == pygame.FINGERMOTION:
413
+ # if event.x < 0.5:
414
+ # vd = finger_pos - self._left_finger_tap_pos
415
+ # self.unset_key(K.P1_RIGHT)
416
+ # self.unset_key(K.P1_LEFT)
417
+ # self.unset_key(K.P1_UP)
418
+ # self.unset_key(K.P1_DOWN)
419
+ # if abs(vd.x) > 2 * abs(vd.y):
420
+ # # Horizontal
421
+ # if vd.x > 5.0:
422
+ # self.set_key(K.P1_RIGHT)
423
+ # self.unset_key(K.P1_LEFT)
424
+ # self.unset_key(K.P1_UP)
425
+ # self.unset_key(K.P1_DOWN)
426
+ # elif vd.x < -5.0:
427
+ # self.set_key(K.P1_LEFT)
428
+ # self.unset_key(K.P1_RIGHT)
429
+ # self.unset_key(K.P1_UP)
430
+ # self.unset_key(K.P1_DOWN)
431
+ # elif abs(vd.x) * 2 < abs(vd.y):
432
+ # # Vertical
433
+ # if vd.y > 5.0:
434
+ # self.unset_key(K.P1_RIGHT)
435
+ # self.unset_key(K.P1_LEFT)
436
+ # self.unset_key(K.P1_UP)
437
+ # self.set_key(K.P1_DOWN)
438
+ # elif vd.y < -5.0:
439
+ # self.unset_key(K.P1_LEFT)
440
+ # self.unset_key(K.P1_RIGHT)
441
+ # self.set_key(K.P1_UP)
442
+ # self.unset_key(K.P1_DOWN)
443
+ # elif abs(vd.x) * 1.05 > abs(vd.y) or abs(vd.x) < 1.05 * abs(
444
+ # vd.y
445
+ # ):
446
+ # if vd.x < 0:
447
+ # self.set_key(K.P1_LEFT)
448
+ # elif vd.x > 0:
449
+ # self.set_key(K.P1_RIGHT)
450
+ # if vd.y < 0:
451
+ # self.set_key(K.P1_UP)
452
+ # elif vd.y > 0:
453
+ # self.set_key(K.P1_DOWN)
454
+ # # else:
455
+ # # vd = finger_pos - self._right_finger_tap_pos
456
+ # # self.unset_key(K.A)
457
+ # # self.unset_key(K.B)
458
+ # # self.unset_key(K.Y)
459
+ # # self.unset_key(K.X)
460
+ # # if abs(vd.x) > 2 * abs(vd.y):
461
+ # # # Horizontal
462
+ # # if vd.x > 5.0:
463
+ # # self.set_key(K.Y)
464
+ # # elif vd.x < -5.0:
465
+ # # self.set_key(K.B)
466
+ # # elif abs(vd.x) * 2 < abs(vd.y):
467
+ # # # Vertical
468
+ # # if vd.y > 5.0:
469
+ # # self.set_key(K.A)
470
+ # # elif vd.y < -5.0:
471
+ # # self.set_key(K.X)
472
+
473
+ # self.vd = vd
474
+
475
+ def _handle_mouse(self, event):
476
+ # if event.type == pygame.MOUSEBUTTONDOWN:
477
+ # if 0 <= event.pos[0] < 16 and 80 <= event.pos[1] < 96:
478
+ # self._unset_key(K.RIGHT)
479
+ # self._set_key(K.LEFT)
480
+ # self._unset_key(K.UP)
481
+ # self._unset_key(K.DOWN)
482
+ # elif 0 <= event.pos[0] < 16 and 64 <= event.pos[1] < 80:
483
+ # self._unset_key(K.RIGHT)
484
+ # self._set_key(K.LEFT)
485
+ # self._set_key(K.UP)
486
+ # self._unset_key(K.DOWN)
487
+ # elif 16 <= event.pos[0] < 32 and 64 <= event.pos[1] < 80:
488
+ # self._unset_key(K.RIGHT)
489
+ # self._unset_key(K.LEFT)
490
+ # self._set_key(K.UP)
491
+ # self._unset_key(K.DOWN)
492
+ # elif 32 <= event.pos[0] < 48 and 64 <= event.pos[1] < 80:
493
+ # self._set_key(K.RIGHT)
494
+ # self._unset_key(K.LEFT)
495
+ # self._set_key(K.UP)
496
+ # self._unset_key(K.DOWN)
497
+ # elif 32 <= event.pos[0] < 48 and 80 <= event.pos[1] < 96:
498
+ # self._set_key(K.RIGHT)
499
+ # self._unset_key(K.LEFT)
500
+ # self._unset_key(K.UP)
501
+ # self._unset_key(K.DOWN)
502
+ # elif 32 <= event.pos[0] < 48 and 96 <= event.pos[1] < 112:
503
+ # self._set_key(K.RIGHT)
504
+ # self._unset_key(K.LEFT)
505
+ # self._unset_key(K.UP)
506
+ # self._set_key(K.DOWN)
507
+ # elif 16 <= event.pos[0] < 32 and 96 <= event.pos[1] < 112:
508
+ # self._unset_key(K.RIGHT)
509
+ # self._unset_key(K.LEFT)
510
+ # self._unset_key(K.UP)
511
+ # self._set_key(K.DOWN)
512
+ # elif 0 <= event.pos[0] < 16 and 96 <= event.pos[1] < 112:
513
+ # self._unset_key(K.RIGHT)
514
+ # self._set_key(K.LEFT)
515
+ # self._unset_key(K.UP)
516
+ # self._set_key(K.DOWN)
517
+ # if 112 <= event.pos[0] < 144 and 0 <= event.pos[1] < 32:
518
+ # self._set_key(K.START)
519
+ # self._unset_key(K.RIGHT)
520
+ # self._unset_key(K.LEFT)
521
+ # self._unset_key(K.UP)
522
+ # self._unset_key(K.DOWN)
523
+ # if 240 <= event.pos[0] < 256 and 80 <= event.pos[1] < 112:
524
+ # self._set_key(K.A)
525
+ # self._unset_key(K.RIGHT)
526
+ # self._unset_key(K.LEFT)
527
+ # self._unset_key(K.UP)
528
+ # self._unset_key(K.DOWN)
529
+
530
+ # if event.type == pygame.MOUSEBUTTONUP:
531
+ # self._unset_key(K.DOWN)
532
+ # self._unset_key(K.LEFT)
533
+ # self._unset_key(K.UP)
534
+ # self._unset_key(K.RIGHT)
535
+ # self._unset_key(K.START)
536
+ # self._unset_key(K.A)
537
+ pass
538
+
539
+ def _init_joysticks(self):
540
+ for jid in range(pygame.joystick.get_count()):
541
+ js = pygame.joystick.Joystick(jid)
542
+ js.init()
543
+ # p = Player(jid + 1)
544
+ self.joysticks[js.get_id()] = js
545
+ LOG.info(
546
+ "Initialized Joystick #%d: %s",
547
+ jid,
548
+ self.joysticks[js.get_id()].get_name(),
549
+ )
550
+
551
+ def set_key(self, button: K):
552
+ self._new_keys[button] = True
553
+
554
+ def unset_key(self, button: K):
555
+ self._new_keys[button] = False
556
+
557
+ def new_key_press(self, button: K, player: Player = Player.P1):
558
+ button = _button_to_player(button, player)
559
+ return self._new_keys[button] and not self._last_keys[button]
560
+
561
+ def key_held(self, button: K, player: Player = Player.P1):
562
+ button = _button_to_player(button, player)
563
+ return self._new_keys[button]
564
+
565
+ def new_key_release(self, button: K, player: Player = Player.P1):
566
+ button = _button_to_player(button, player)
567
+ return self._last_keys[button] and not self._new_keys[button]
568
+
569
+ def get_all_events(self):
570
+ return self._new_events
571
+
572
+ def _collect_keyboard_events(self, event):
573
+ kid = f"kb_{event.key}"
574
+ if event.type == pygame.KEYDOWN:
575
+ self._new_events[kid] = {
576
+ "type": "keyboard",
577
+ "id": event.type,
578
+ "button": event.key,
579
+ "name": pygame.key.name(event.key),
580
+ }
581
+ if event.type == pygame.KEYUP and kid in self._new_events:
582
+ del self._new_events[kid]
583
+
584
+ def _collect_joystick_events(self, event):
585
+ if event.type == pygame.JOYDEVICEREMOVED:
586
+ jid = f"js_{event.instance_id}_removed"
587
+ self._new_events[jid] = {
588
+ "type": "joystick",
589
+ "id": event.instance_id,
590
+ "button": "removed",
591
+ "name": "removed",
592
+ }
593
+ if event.type == pygame.JOYDEVICEADDED:
594
+ jid = f"js_{event.device_index}_added"
595
+ self._new_events[jid] = {
596
+ "type": "joystick",
597
+ "id": event.device_index,
598
+ "button": "added",
599
+ "guid": event.guid,
600
+ }
601
+
602
+ if event.type == pygame.JOYBUTTONDOWN:
603
+ kid = f"js_{event.joy}_{event.button}"
604
+
605
+ self._new_events[kid] = {
606
+ "type": "joystick",
607
+ "id": event.instance_id,
608
+ "joy": event.joy,
609
+ "button": event.button,
610
+ "name": self.joysticks[event.joy].get_name(),
611
+ "power_level": self.joysticks[event.joy].get_power_level(),
612
+ }
613
+ if event.type == pygame.JOYBUTTONUP:
614
+ kid = f"js_{event.joy}_{event.button}"
615
+ if kid in self._new_events:
616
+ del self._new_events[kid]
617
+ if event.type == pygame.JOYHATMOTION:
618
+ kid = f"js_{event.joy}_{event.hat}"
619
+ klid = f"{kid}_left"
620
+ krid = f"{kid}_right"
621
+ kuid = f"{kid}_up"
622
+ kdid = f"{kid}_down"
623
+ if event.value[0] == 0:
624
+ if klid in self._new_events:
625
+ del self._new_events[klid]
626
+ if krid in self._new_events:
627
+ del self._new_events[krid]
628
+ elif event.value[0] == -1:
629
+ self._new_events[klid] = {
630
+ "type": "joystick",
631
+ "id": event.instance_id,
632
+ "joy": event.joy,
633
+ "button": "left",
634
+ "hat": event.hat,
635
+ "value": event.value[0],
636
+ "name": self.joysticks[event.joy].get_name(),
637
+ "power_level": self.joysticks[event.joy].get_power_level(),
638
+ }
639
+ if krid in self._new_events:
640
+ del self._new_events[krid]
641
+ else:
642
+ self._new_events[krid] = {
643
+ "type": "joystick",
644
+ "id": event.instance_id,
645
+ "joy": event.joy,
646
+ "button": "right",
647
+ "hat": event.hat,
648
+ "value": event.value[0],
649
+ "name": self.joysticks[event.joy].get_name(),
650
+ "power_level": self.joysticks[event.joy].get_power_level(),
651
+ }
652
+ if klid in self._new_events:
653
+ del self._new_events[klid]
654
+
655
+ if event.value[1] == 0:
656
+ if kuid in self._new_events:
657
+ del self._new_events[kuid]
658
+ if kdid in self._new_events:
659
+ del self._new_events[kdid]
660
+ elif event.value[1] == 1:
661
+ self._new_events[kuid] = {
662
+ "type": "joystick",
663
+ "id": event.instance_id,
664
+ "joy": event.joy,
665
+ "button": "up",
666
+ "hat": event.hat,
667
+ "value": event.value[1],
668
+ "name": self.joysticks[event.joy].get_name(),
669
+ "power_level": self.joysticks[event.joy].get_power_level(),
670
+ }
671
+ if kdid in self._new_events:
672
+ del self._new_events[kdid]
673
+ else:
674
+ self._new_events[kdid] = {
675
+ "type": "joystick",
676
+ "id": event.instance_id,
677
+ "joy": event.joy,
678
+ "button": "down",
679
+ "hat": event.hat,
680
+ "value": event.value[1],
681
+ "name": self.joysticks[event.joy].get_name(),
682
+ "power_level": self.joysticks[event.joy].get_power_level(),
683
+ }
684
+ if kuid in self._new_events:
685
+ del self._new_events[kuid]
686
+
687
+ def trigger_all_events_collection(self, active: bool = True):
688
+ self._collect_all_events = active
689
+
690
+ def get_touch_state(self):
691
+ return self._touch_control.get_touch_state()
692
+
693
+
694
+ def _button_to_player(button: K, player: Player):
695
+ return K(button.value + 12 * player.value)