mini-arcade-core 0.10.0__py3-none-any.whl → 1.0.1__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 (78) hide show
  1. mini_arcade_core/__init__.py +51 -63
  2. mini_arcade_core/backend/__init__.py +2 -6
  3. mini_arcade_core/backend/backend.py +148 -8
  4. mini_arcade_core/backend/events.py +1 -1
  5. mini_arcade_core/{keymaps/sdl.py → backend/sdl_map.py} +1 -1
  6. mini_arcade_core/engine/__init__.py +0 -0
  7. mini_arcade_core/engine/commands.py +169 -0
  8. mini_arcade_core/engine/game.py +369 -0
  9. mini_arcade_core/engine/render/__init__.py +0 -0
  10. mini_arcade_core/engine/render/packet.py +56 -0
  11. mini_arcade_core/engine/render/pipeline.py +63 -0
  12. mini_arcade_core/engine/render/viewport.py +203 -0
  13. mini_arcade_core/managers/__init__.py +0 -22
  14. mini_arcade_core/managers/cheats.py +71 -240
  15. mini_arcade_core/managers/inputs.py +5 -3
  16. mini_arcade_core/runtime/__init__.py +0 -0
  17. mini_arcade_core/runtime/audio/__init__.py +0 -0
  18. mini_arcade_core/runtime/audio/audio_adapter.py +20 -0
  19. mini_arcade_core/runtime/audio/audio_port.py +36 -0
  20. mini_arcade_core/runtime/capture/__init__.py +0 -0
  21. mini_arcade_core/runtime/capture/capture_adapter.py +143 -0
  22. mini_arcade_core/runtime/capture/capture_port.py +51 -0
  23. mini_arcade_core/runtime/context.py +53 -0
  24. mini_arcade_core/runtime/file/__init__.py +0 -0
  25. mini_arcade_core/runtime/file/file_adapter.py +20 -0
  26. mini_arcade_core/runtime/file/file_port.py +31 -0
  27. mini_arcade_core/runtime/input/__init__.py +0 -0
  28. mini_arcade_core/runtime/input/input_adapter.py +49 -0
  29. mini_arcade_core/runtime/input/input_port.py +31 -0
  30. mini_arcade_core/runtime/input_frame.py +71 -0
  31. mini_arcade_core/runtime/scene/__init__.py +0 -0
  32. mini_arcade_core/runtime/scene/scene_adapter.py +97 -0
  33. mini_arcade_core/runtime/scene/scene_port.py +149 -0
  34. mini_arcade_core/runtime/services.py +35 -0
  35. mini_arcade_core/runtime/window/__init__.py +0 -0
  36. mini_arcade_core/runtime/window/window_adapter.py +90 -0
  37. mini_arcade_core/runtime/window/window_port.py +109 -0
  38. mini_arcade_core/scenes/__init__.py +0 -22
  39. mini_arcade_core/scenes/autoreg.py +1 -1
  40. mini_arcade_core/scenes/registry.py +21 -19
  41. mini_arcade_core/scenes/sim_scene.py +41 -0
  42. mini_arcade_core/scenes/systems/__init__.py +0 -0
  43. mini_arcade_core/scenes/systems/base_system.py +40 -0
  44. mini_arcade_core/scenes/systems/system_pipeline.py +57 -0
  45. mini_arcade_core/sim/__init__.py +0 -0
  46. mini_arcade_core/sim/protocols.py +41 -0
  47. mini_arcade_core/sim/runner.py +222 -0
  48. mini_arcade_core/spaces/__init__.py +0 -12
  49. mini_arcade_core/spaces/d2/__init__.py +0 -30
  50. mini_arcade_core/spaces/d2/boundaries2d.py +10 -1
  51. mini_arcade_core/spaces/d2/collision2d.py +25 -28
  52. mini_arcade_core/spaces/d2/geometry2d.py +18 -0
  53. mini_arcade_core/spaces/d2/kinematics2d.py +2 -8
  54. mini_arcade_core/spaces/d2/physics2d.py +9 -0
  55. mini_arcade_core/ui/__init__.py +0 -26
  56. mini_arcade_core/ui/menu.py +271 -85
  57. mini_arcade_core/utils/__init__.py +10 -0
  58. mini_arcade_core/utils/deprecated_decorator.py +45 -0
  59. mini_arcade_core/utils/logging.py +168 -0
  60. {mini_arcade_core-0.10.0.dist-info → mini_arcade_core-1.0.1.dist-info}/METADATA +1 -1
  61. mini_arcade_core-1.0.1.dist-info/RECORD +66 -0
  62. {mini_arcade_core-0.10.0.dist-info → mini_arcade_core-1.0.1.dist-info}/WHEEL +1 -1
  63. mini_arcade_core/commands.py +0 -84
  64. mini_arcade_core/entity.py +0 -72
  65. mini_arcade_core/game.py +0 -287
  66. mini_arcade_core/keymaps/__init__.py +0 -15
  67. mini_arcade_core/managers/base.py +0 -132
  68. mini_arcade_core/managers/entities.py +0 -38
  69. mini_arcade_core/managers/overlays.py +0 -53
  70. mini_arcade_core/managers/system.py +0 -26
  71. mini_arcade_core/scenes/model.py +0 -34
  72. mini_arcade_core/scenes/runtime.py +0 -29
  73. mini_arcade_core/scenes/scene.py +0 -109
  74. mini_arcade_core/scenes/system.py +0 -69
  75. mini_arcade_core/ui/overlays.py +0 -41
  76. mini_arcade_core-0.10.0.dist-info/RECORD +0 -40
  77. /mini_arcade_core/{keymaps → backend}/keys.py +0 -0
  78. {mini_arcade_core-0.10.0.dist-info → mini_arcade_core-1.0.1.dist-info}/licenses/LICENSE +0 -0
@@ -39,25 +39,34 @@ class VerticalBounce:
39
39
 
40
40
  bounds: Bounds2D
41
41
 
42
- def apply(self, obj: RectKinematic):
42
+ def apply(self, obj: RectKinematic) -> bool:
43
43
  """
44
44
  Apply vertical bounce to the given object.
45
45
 
46
46
  :param obj: The object to apply the bounce to.
47
47
  :type obj: RectKinematic
48
+
49
+ :return: True if a bounce occurred, False otherwise.
50
+ :rtype: bool
48
51
  """
49
52
  top = self.bounds.top
50
53
  bottom = self.bounds.bottom
51
54
 
55
+ bounced = False
56
+
52
57
  # Top collision
53
58
  if obj.position.y <= top:
54
59
  obj.position.y = top
55
60
  obj.velocity.vy *= -1
61
+ bounced = True
56
62
 
57
63
  # Bottom collision
58
64
  if obj.position.y + obj.size.height >= bottom:
59
65
  obj.position.y = bottom - obj.size.height
60
66
  obj.velocity.vy *= -1
67
+ bounced = True
68
+
69
+ return bounced
61
70
 
62
71
 
63
72
  class RectSprite(Protocol):
@@ -4,45 +4,35 @@
4
4
 
5
5
  from __future__ import annotations
6
6
 
7
+ from abc import ABC, abstractmethod
7
8
  from dataclasses import dataclass
8
9
 
9
10
  from .geometry2d import Position2D, Size2D
10
11
 
11
12
 
12
- def _rects_intersect(
13
- pos_a: Position2D,
14
- size_a: Size2D,
15
- pos_b: Position2D,
16
- size_b: Size2D,
17
- ) -> bool:
13
+ class Collider2D(ABC):
14
+ """
15
+ Abstract base class for 2D colliders.
18
16
  """
19
- Low-level AABB check. Internal helper.
20
-
21
- :param pos_a: Top-left position of rectangle A.
22
- :type pos_a: Position2D
23
17
 
24
- :param size_a: Size of rectangle A.
25
- :type size_a: Size2D
18
+ position: Position2D
19
+ size: Size2D
26
20
 
27
- :param pos_b: Top-left position of rectangle B.
28
- :type pos_b: Position2D
21
+ @abstractmethod
22
+ def intersects(self, other: Collider2D) -> bool:
23
+ """
24
+ Check if this collider intersects with another collider.
29
25
 
30
- :param size_b: Size of rectangle B.
31
- :type size_b: Size2D
26
+ :param other: The other collider to check against.
27
+ :type other: Collider2D
32
28
 
33
- :return: True if the rectangles intersect.
34
- :rtype: bool
35
- """
36
- return not (
37
- pos_a.x + size_a.width < pos_b.x
38
- or pos_a.x > pos_b.x + size_b.width
39
- or pos_a.y + size_a.height < pos_b.y
40
- or pos_a.y > pos_b.y + size_b.height
41
- )
29
+ :return: True if the colliders intersect.
30
+ :rtype: bool
31
+ """
42
32
 
43
33
 
44
34
  @dataclass
45
- class RectCollider:
35
+ class RectCollider(Collider2D):
46
36
  """
47
37
  OOP collision helper that wraps a Position2D + Size2D pair.
48
38
 
@@ -66,6 +56,13 @@ class RectCollider:
66
56
  :return: True if the rectangles intersect.
67
57
  :rtype: bool
68
58
  """
69
- return _rects_intersect(
70
- self.position, self.size, other.position, other.size
59
+ pos_a = self.position
60
+ size_a = self.size
61
+ pos_b = other.position
62
+ size_b = other.size
63
+ return not (
64
+ pos_a.x + size_a.width < pos_b.x
65
+ or pos_a.x > pos_b.x + size_b.width
66
+ or pos_a.y + size_a.height < pos_b.y
67
+ or pos_a.y > pos_b.y + size_b.height
71
68
  )
@@ -19,6 +19,15 @@ class Position2D:
19
19
  x: float
20
20
  y: float
21
21
 
22
+ def to_tuple(self) -> tuple[float, float]:
23
+ """
24
+ Convert Position2D to a tuple.
25
+
26
+ :return: Tuple of (x, y).
27
+ :rtype: tuple[float, float]
28
+ """
29
+ return (self.x, self.y)
30
+
22
31
 
23
32
  @dataclass
24
33
  class Size2D:
@@ -32,6 +41,15 @@ class Size2D:
32
41
  width: int
33
42
  height: int
34
43
 
44
+ def to_tuple(self) -> tuple[int, int]:
45
+ """
46
+ Convert Size2D to a tuple.
47
+
48
+ :return: Tuple of (width, height).
49
+ :rtype: tuple[int, int]
50
+ """
51
+ return (self.width, self.height)
52
+
35
53
 
36
54
  @dataclass
37
55
  class Bounds2D:
@@ -7,8 +7,7 @@ from __future__ import annotations
7
7
  from dataclasses import dataclass
8
8
  from typing import Optional
9
9
 
10
- from mini_arcade_core.backend import Color
11
-
10
+ from .collision2d import Collider2D
12
11
  from .geometry2d import Position2D, Size2D
13
12
  from .physics2d import Velocity2D
14
13
 
@@ -28,7 +27,7 @@ class KinematicData:
28
27
  size: Size2D
29
28
  velocity: Velocity2D
30
29
  time_scale: float = 1.0
31
- color: Optional[Color] = None # future use
30
+ collider: Optional[Collider2D] = None
32
31
 
33
32
  # Justification: Convenience factory with many params.
34
33
  # pylint: disable=too-many-arguments,too-many-positional-arguments
@@ -42,7 +41,6 @@ class KinematicData:
42
41
  vx: float = 0.0,
43
42
  vy: float = 0.0,
44
43
  time_scale: float = 1.0,
45
- color: Optional[Color] = None,
46
44
  ) -> "KinematicData":
47
45
  """
48
46
  Convenience factory for rectangular kinematic data.
@@ -65,9 +63,6 @@ class KinematicData:
65
63
  :param vy: Velocity in the Y direction.
66
64
  :type vy: float
67
65
 
68
- :param color: Optional color for rendering.
69
- :type color: Optional[Color]
70
-
71
66
  :return: KinematicData instance with the specified parameters.
72
67
  :rtype: KinematicData
73
68
  """
@@ -76,7 +71,6 @@ class KinematicData:
76
71
  size=Size2D(int(width), int(height)),
77
72
  velocity=Velocity2D(float(vx), float(vy)),
78
73
  time_scale=time_scale,
79
- color=color,
80
74
  )
81
75
 
82
76
  # pylint: enable=too-many-arguments,too-many-positional-arguments
@@ -19,6 +19,15 @@ class Velocity2D:
19
19
  vx: float = 0.0
20
20
  vy: float = 0.0
21
21
 
22
+ def to_tuple(self) -> tuple[float, float]:
23
+ """
24
+ Convert Velocity2D to a tuple.
25
+
26
+ :return: Tuple of (vx, vy).
27
+ :rtype: tuple[float, float]
28
+ """
29
+ return (self.vx, self.vy)
30
+
22
31
  def advance(self, x: float, y: float, dt: float) -> tuple[float, float]:
23
32
  """Return new (x, y) after dt seconds."""
24
33
  return x + self.vx * dt, y + self.vy * dt
@@ -1,26 +0,0 @@
1
- """
2
- UI utilities and components for Mini Arcade Core.
3
- Includes buttons, labels, and layout management.
4
- """
5
-
6
- from __future__ import annotations
7
-
8
- from .menu import (
9
- BaseMenuScene,
10
- Menu,
11
- MenuItem,
12
- MenuModel,
13
- MenuStyle,
14
- MenuSystem,
15
- )
16
- from .overlays import BaseOverlay
17
-
18
- __all__ = [
19
- "Menu",
20
- "MenuItem",
21
- "MenuStyle",
22
- "MenuModel",
23
- "MenuSystem",
24
- "BaseMenuScene",
25
- "BaseOverlay",
26
- ]