mima-engine 0.2.1__py3-none-any.whl → 0.2.3__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.

Potentially problematic release.


This version of mima-engine might be problematic. Click here for more details.

Files changed (49) hide show
  1. mima/__init__.py +4 -1
  2. mima/backend/pygame_assets.py +67 -9
  3. mima/backend/pygame_backend.py +5 -2
  4. mima/core/__init__.py +0 -0
  5. mima/{collision.py → core/collision.py} +11 -17
  6. mima/core/database.py +58 -0
  7. mima/{engine.py → core/engine.py} +51 -45
  8. mima/{mode_engine.py → core/mode_engine.py} +8 -12
  9. mima/{scene_engine.py → core/scene_engine.py} +3 -7
  10. mima/maps/template.py +31 -1
  11. mima/maps/tiled/tiled_object.py +1 -1
  12. mima/maps/tiled/tiled_tileset.py +10 -5
  13. mima/maps/tilemap.py +4 -10
  14. mima/maps/tileset.py +5 -4
  15. mima/objects/animated_sprite.py +79 -68
  16. mima/objects/creature.py +14 -7
  17. mima/objects/dynamic.py +3 -1
  18. mima/objects/effects/colorize_screen.py +9 -1
  19. mima/objects/effects/light.py +6 -1
  20. mima/objects/effects/show_sprite.py +17 -6
  21. mima/objects/effects/walking_on_grass.py +27 -13
  22. mima/objects/effects/walking_on_water.py +36 -31
  23. mima/objects/loader.py +6 -9
  24. mima/objects/projectile.py +15 -5
  25. mima/objects/sprite.py +8 -1
  26. mima/objects/world/color_gate.py +17 -21
  27. mima/objects/world/color_switch.py +18 -28
  28. mima/objects/world/container.py +31 -36
  29. mima/objects/world/floor_switch.py +22 -28
  30. mima/objects/world/gate.py +33 -32
  31. mima/objects/world/light_source.py +27 -32
  32. mima/objects/world/logic_gate.py +30 -37
  33. mima/objects/world/movable.py +106 -89
  34. mima/objects/world/oneway.py +29 -33
  35. mima/objects/world/pickup.py +75 -17
  36. mima/objects/world/switch.py +26 -31
  37. mima/objects/world/teleport.py +21 -22
  38. mima/scripts/commands/close_dialog.py +2 -1
  39. mima/scripts/commands/present_item.py +10 -10
  40. mima/types/graphic_state.py +1 -0
  41. mima/usables/item.py +28 -9
  42. mima/usables/weapon.py +28 -8
  43. mima/util/runtime_config.py +8 -15
  44. mima/util/trading_item.py +4 -1
  45. mima/view/mima_mode.py +19 -54
  46. {mima_engine-0.2.1.dist-info → mima_engine-0.2.3.dist-info}/METADATA +3 -3
  47. {mima_engine-0.2.1.dist-info → mima_engine-0.2.3.dist-info}/RECORD +49 -47
  48. {mima_engine-0.2.1.dist-info → mima_engine-0.2.3.dist-info}/WHEEL +1 -1
  49. {mima_engine-0.2.1.dist-info → mima_engine-0.2.3.dist-info}/top_level.txt +0 -0
@@ -14,54 +14,60 @@ class AnimatedSprite:
14
14
 
15
15
  def __init__(
16
16
  self,
17
- tileset_name: str,
18
- image_name: str,
19
- sprite_name: Optional[str] = None,
17
+ # tileset_name: str,
18
+ # image_name: str,
19
+ sprite_name: str,
20
20
  graphic_state: GraphicState = GraphicState.STANDING,
21
21
  facing_direction: Direction = Direction.SOUTH,
22
22
  ):
23
- self._sprite_name = (
24
- tileset_name if sprite_name is None else sprite_name
25
- )
26
-
27
- self._tileset_name = tileset_name
28
- self.name = image_name
29
- # TODO: Handle ""
30
- if tileset_name and image_name and self._sprite_name:
31
- LOG.info(
32
- {
33
- "operation": "load sprite",
34
- "tileset": tileset_name,
35
- "image": image_name,
36
- "sprite": self._sprite_name,
37
- }
38
- )
39
- tileset = self.engine.assets.get_tileset(tileset_name)
40
-
41
- self.width = tileset.tile_width
42
- self.height = tileset.tile_height
43
23
 
44
- self._sprites: Dict[
45
- GraphicState, Dict[Direction, Dict[str, Any]]
46
- ] = self._load_sprites_from_tileset(tileset, self._sprite_name)
24
+ self.name = sprite_name
25
+ self._last_direction: Direction = facing_direction
26
+ self._last_graphic_state: GraphicState = graphic_state
27
+ self.sprite_sheet = self.engine.assets.get_sprite_data(sprite_name)
47
28
 
48
- self._last_direction: Direction = facing_direction
49
- self._last_graphic_state: GraphicState = graphic_state
29
+ if self.name:
50
30
  data = self._get_data(
51
31
  self._last_graphic_state, self._last_direction
52
32
  )
53
-
54
33
  self._frame_index: int = 0
55
34
  self._timer: float = data["duration"][0]
35
+ self._ox = data["ox"][0]
36
+ self._oy = data["oy"][0]
37
+ self._image_name = data["image"][0]
38
+ self.width = data["width"][0]
39
+ self.height = data["height"][0]
56
40
  else:
57
- LOG.debug(
58
- "Sprite information uncomplete. Tileset=%s, Image=%s, Sprite="
59
- "%s. Will continue without sprite.",
60
- tileset_name,
61
- image_name,
62
- self._sprite_name,
63
- )
64
- self.name = self._tileset_name = self._sprite_name = ""
41
+ self.width = self.engine.rtc.tile_width
42
+ self.height = self.engine.rtc.tile_height
43
+ # # TODO: Handle ""
44
+ # if tileset_name and image_name and self._sprite_name:
45
+ # LOG.info(
46
+ # {
47
+ # "operation": "load sprite",
48
+ # "tileset": tileset_name,
49
+ # "image": image_name,
50
+ # "sprite": self._sprite_name,
51
+ # }
52
+ # )
53
+ # tileset = self.engine.assets.get_tileset(tileset_name)
54
+
55
+ # self.width = tileset.tile_width
56
+ # self.height = tileset.tile_height
57
+
58
+ # self._sprites: Dict[GraphicState, Dict[Direction, Dict[str, Any]]] = (
59
+ # self._load_sprites_from_tileset(tileset, self._sprite_name)
60
+ # )
61
+
62
+ # else:
63
+ # LOG.debug(
64
+ # "Sprite information uncomplete. Tileset=%s, Image=%s, Sprite="
65
+ # "%s. Will continue without sprite.",
66
+ # tileset_name,
67
+ # image_name,
68
+ # self._sprite_name,
69
+ # )
70
+ # self.name = self._tileset_name = self._sprite_name = ""
65
71
 
66
72
  def update(
67
73
  self,
@@ -73,13 +79,6 @@ class AnimatedSprite:
73
79
  return
74
80
 
75
81
  data = self._get_data(graphic_state, direction)
76
- # try:
77
- # self._timer_reset = data["duration"][self._frame_index]
78
- # except KeyError as err:
79
- # LOG.exception(
80
- # f"Data of {self._tileset_name, self.name} is "
81
- # f"malformed: {data}"
82
- # )
83
82
 
84
83
  if (
85
84
  direction == self._last_direction
@@ -92,7 +91,11 @@ class AnimatedSprite:
92
91
  data["duration"]
93
92
  )
94
93
  self._timer += data["duration"][self._frame_index]
95
-
94
+ self._ox = data["ox"][self._frame_index]
95
+ self._oy = data["oy"][self._frame_index]
96
+ self._image_name = data["image"][self._frame_index]
97
+ self.width = data["width"][self._frame_index]
98
+ self.height = data["height"][self._frame_index]
96
99
  else:
97
100
  self._frame_index = 0
98
101
  # Something changed
@@ -100,6 +103,11 @@ class AnimatedSprite:
100
103
  # State changed
101
104
 
102
105
  self._timer = data["duration"][0]
106
+ self._ox = data["ox"][0]
107
+ self._oy = data["oy"][0]
108
+ self._image_name = data["image"][0]
109
+ self.width = data["width"][0]
110
+ self.height = data["height"][0]
103
111
 
104
112
  self._last_direction = direction
105
113
  self._last_graphic_state = graphic_state
@@ -110,30 +118,27 @@ class AnimatedSprite:
110
118
  py: float,
111
119
  camera_name: str = "display",
112
120
  absolute_position: bool = False,
121
+ draw_to_ui: bool = False,
113
122
  ):
114
- if self.name == "":
123
+ if not self.name:
115
124
  return
116
125
 
117
- data = self._get_data(self._last_graphic_state, self._last_direction)
118
126
  if not absolute_position:
119
127
  px *= self.engine.rtc.tile_width
120
128
  py *= self.engine.rtc.tile_height
121
129
  px, py = math.floor(px), math.floor(py)
122
- try:
123
- self.engine.backend.draw_partial_sprite(
124
- px,
125
- py,
126
- self.name,
127
- data["ox"][self._frame_index] * self.width,
128
- data["oy"][self._frame_index] * self.height,
129
- self.width,
130
- self.height,
131
- camera_name,
132
- )
133
- except KeyError:
134
- LOG.exception(
135
- f"Data of {self._tileset_name, self.name} is malformed: {data}"
136
- )
130
+
131
+ self.engine.backend.draw_partial_sprite(
132
+ px,
133
+ py,
134
+ self._image_name,
135
+ self._ox * self.width,
136
+ self._oy * self.height,
137
+ self.width,
138
+ self.height,
139
+ camera_name,
140
+ draw_to_ui=draw_to_ui,
141
+ )
137
142
 
138
143
  def _load_sprites_from_tileset(self, tileset, sprite_name):
139
144
  if sprite_name in AnimatedSprite.sprite_sets:
@@ -185,16 +190,15 @@ class AnimatedSprite:
185
190
  if graphic_state == GraphicState.DEFEATED:
186
191
  graphic_state = graphic_state.DEAD
187
192
 
188
- data = self._sprites.get(
189
- graphic_state, self._sprites.get(GraphicState.STANDING, {})
193
+ data = self.sprite_sheet.get(
194
+ graphic_state, self.sprite_sheet.get(GraphicState.STANDING, {})
190
195
  )
191
196
  data = data.get(direction, data.get(Direction.SOUTH, {}))
192
197
  if not data:
193
198
  try:
194
199
  LOG.debug(
195
- "Animation of sprite %s,%s is empty for %s, %s ",
196
- self._tileset_name,
197
- self._sprite_name,
200
+ "Animation of sprite %s is empty for %s, %s ",
201
+ self.name,
198
202
  graphic_state.name,
199
203
  direction.name,
200
204
  )
@@ -202,5 +206,12 @@ class AnimatedSprite:
202
206
  # print(graphic_state, direction)
203
207
  LOG.exception(graphic_state, direction)
204
208
  raise
205
- data = {"ox": [0], "oy": [0], "duration": [1.0]}
209
+ data = {
210
+ "ox": [0],
211
+ "oy": [0],
212
+ "duration": [1.0],
213
+ "image": [""],
214
+ "width": [0],
215
+ "height": [0],
216
+ }
206
217
  return data
mima/objects/creature.py CHANGED
@@ -33,16 +33,23 @@ class Creature(Dynamic):
33
33
  py: float = 0,
34
34
  name: str = "Unnamed Creature",
35
35
  *,
36
+ sprite_name: str = "",
36
37
  tilemap: Tilemap = None,
37
38
  dyn_id: int = -1,
38
- tileset_name: str = "",
39
- image_name: str = "",
40
- sprite_name: str = "",
41
39
  player: Player = Player.P0,
42
40
  ):
43
- super().__init__(px, py, name, tilemap, dyn_id)
41
+ super().__init__(
42
+ px,
43
+ py,
44
+ name,
45
+ sprite_name=sprite_name,
46
+ tilemap=tilemap,
47
+ dyn_id=dyn_id,
48
+ )
44
49
 
45
- self.sprite = AnimatedSprite(tileset_name, image_name, sprite_name)
50
+ # self.sprite = self.engine.db.get_sprite(
51
+ # sprite_name
52
+ # ) # AnimatedSprite(tileset_name, image_name, sprite_name)
46
53
  self.player = player
47
54
  self.type = ObjectType.CREATURE
48
55
  self.knock_speed: float = DEFAULT_KNOCK_SPEED
@@ -196,8 +203,8 @@ class Creature(Dynamic):
196
203
 
197
204
  if self.pz != 0:
198
205
  self.engine.backend.fill_circle(
199
- px + 0.5 * self.sprite.width,
200
- py + 0.7 * self.sprite.height,
206
+ (px + 0.5) * self.sprite.width,
207
+ (py + 0.7) * self.sprite.height,
201
208
  0.3125 * self.sprite.width,
202
209
  BLACK,
203
210
  camera_name,
mima/objects/dynamic.py CHANGED
@@ -28,6 +28,8 @@ class Dynamic:
28
28
  px: float = 0.0,
29
29
  py: float = 0.0,
30
30
  name: str = "Unnamed Dynamic",
31
+ *,
32
+ sprite_name: str = "",
31
33
  tilemap: Optional[Tilemap] = None,
32
34
  dyn_id=-1,
33
35
  ):
@@ -91,7 +93,7 @@ class Dynamic:
91
93
  self.can_lift: bool = False
92
94
  self.can_push: bool = False
93
95
 
94
- self.sprite: Sprite = Sprite()
96
+ self.sprite: Sprite = self.engine.db.get_sprite(sprite_name)
95
97
 
96
98
  # Performance
97
99
  self.chunks: List[int] = []
@@ -17,7 +17,15 @@ class ColorizeScreen(Projectile):
17
17
  to_filter: bool = False,
18
18
  cameras: Optional[List[str]] = None,
19
19
  ):
20
- super().__init__(0, 0, 0, 0, duration, Alignment.GOOD, None)
20
+ super().__init__(
21
+ 0,
22
+ 0,
23
+ "ColorizeScreen",
24
+ vx=0,
25
+ vy=0,
26
+ duration=duration,
27
+ alignment=Alignment.GOOD,
28
+ )
21
29
  self.layer = 1
22
30
  self.solid_vs_map = False
23
31
  self.color = color
@@ -15,7 +15,12 @@ class Light(Projectile):
15
15
  update_from_target: bool = False,
16
16
  ):
17
17
  super().__init__(
18
- 0, 0, 0, 0, 0, Alignment.GOOD, follow.tilemap, "Light"
18
+ 0,
19
+ 0,
20
+ name="Light",
21
+ tilemap=follow.tilemap,
22
+ duration=0,
23
+ alignment=Alignment.GOOD,
19
24
  )
20
25
  self.layer = 1
21
26
  self.sprite.name = "light_small"
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import TYPE_CHECKING
3
+ from typing import TYPE_CHECKING, Optional
4
4
 
5
5
  from ...types.alignment import Alignment
6
6
  from ..projectile import Projectile
@@ -15,17 +15,28 @@ class ShowSprite(Projectile):
15
15
  self,
16
16
  px: float,
17
17
  py: float,
18
- sprite: Sprite,
19
- tilemap: Tilemap,
20
- layer: int = 0,
18
+ name: str = "ShowSprite",
19
+ *,
20
+ sprite_name: str = "",
21
+ tilemap: Optional[Tilemap] = None,
21
22
  dyn_id: int = 0,
23
+ layer: int = 0,
22
24
  ):
23
25
  super().__init__(
24
- px, py, 0.0, 0.0, 0.0, Alignment.NEUTRAL, tilemap, "SpriteEffect"
26
+ px,
27
+ py,
28
+ name,
29
+ sprite_name=sprite_name,
30
+ tilemap=tilemap,
31
+ dyn_id=dyn_id,
32
+ vx=0.0,
33
+ vy=0.0,
34
+ duration=0.0,
35
+ alignment=Alignment.NEUTRAL,
25
36
  )
26
37
 
27
38
  self.layer = layer
28
- self.sprite: Sprite = sprite
39
+ self.draw_to_ui: bool = False
29
40
 
30
41
  def update(self, elapsed_time: float):
31
42
  self.sprite.update(
@@ -5,17 +5,30 @@ from ..projectile import Projectile
5
5
 
6
6
 
7
7
  class WalkingOnGrass(Projectile):
8
- def __init__(self, follow: Dynamic):
8
+ def __init__(
9
+ self,
10
+ follow: Dynamic,
11
+ name: str = "WalkingOnGrass",
12
+ sprite_name: str = "walking_on_grass",
13
+ ):
9
14
  super().__init__(
10
- follow.px, follow.py, 0, 0, 1.0, follow.alignment, follow.tilemap
15
+ follow.px,
16
+ follow.py,
17
+ name,
18
+ sprite_name=sprite_name,
19
+ tilemap=follow.tilemap,
20
+ vx=0,
21
+ vy=0,
22
+ duration=1.0,
23
+ alignment=follow.alignment,
11
24
  )
12
25
  self.layer = 0
13
- self.sprite.name = "simple_sheet"
14
- self.sprite.ox = 32
15
- self.sprite.oy = 10
16
- self.sprite.num_frames = 2
17
- self.sprite.timer = 0.2
18
- self.sprite.timer_reset = 0.2
26
+ # self.sprite.name = "simple_sheet"
27
+ # self.sprite.ox = 32
28
+ # self.sprite.oy = 10
29
+ # self.sprite.num_frames = 2
30
+ # self.sprite.timer = 0.2
31
+ # self.sprite.timer_reset = 0.2
19
32
  self._follow = follow
20
33
  self.renew: bool = True
21
34
  self.solid_vs_map = False
@@ -37,11 +50,12 @@ class WalkingOnGrass(Projectile):
37
50
  / self.engine.rtc.tile_height
38
51
  )
39
52
 
40
- if self._follow.graphic_state == GraphicState.STANDING:
41
- elapsed_time = 0
42
- self.sprite.update(
43
- elapsed_time, Direction.SOUTH, GraphicState.STANDING
44
- )
53
+ if self._follow.graphic_state == GraphicState.WALKING:
54
+ self.graphic_state = GraphicState.WALKING
55
+ else:
56
+ self.graphic_state = GraphicState.STANDING
57
+ # elapsed_time = 0
58
+ self.sprite.update(elapsed_time, Direction.SOUTH, self.graphic_state)
45
59
 
46
60
  self.renew = False
47
61
 
@@ -5,41 +5,46 @@ from .walking_on_grass import WalkingOnGrass
5
5
 
6
6
 
7
7
  class WalkingOnWater(WalkingOnGrass):
8
- def __init__(self, follow: Dynamic):
9
- super().__init__(follow)
10
- self.sprite.name = "simple_sheet"
11
- self.sprite.ox = 32
12
- self.sprite.oy = 9
13
- self.sprite.num_frames = 2
14
- self.sprite.timer = 0.2
15
- self.sprite.timer_reset = 0.2
8
+ def __init__(
9
+ self,
10
+ follow: Dynamic,
11
+ name: str = "WalkingOnWater",
12
+ sprite_name: str = "walking_on_water",
13
+ ):
14
+ super().__init__(follow, name, sprite_name)
15
+ # self.sprite.name = "simple_sheet"
16
+ # self.sprite.ox = 32
17
+ # self.sprite.oy = 9
18
+ # self.sprite.num_frames = 2
19
+ # self.sprite.timer = 0.2
20
+ # self.sprite.timer_reset = 0.2
16
21
  self._follow = follow
17
22
  self.renew: bool = True
18
23
  self.solid_vs_map = False
19
24
 
20
- def update(self, elapsed_time: float, target: Dynamic = None):
21
- if not self.renew:
22
- self.kill()
23
-
24
- self.px = (
25
- self._follow.px
26
- + (self._follow.sprite.width - self.sprite.width)
27
- / 2
28
- / self.engine.rtc.tile_width
29
- )
30
- self.py = (
31
- self._follow.py
32
- + (self._follow.sprite.height - self.sprite.height)
33
- / self.engine.rtc.tile_height
34
- )
35
-
36
- if self._follow.graphic_state == GraphicState.STANDING:
37
- elapsed_time = 0
38
- self.sprite.update(
39
- elapsed_time, Direction.SOUTH, GraphicState.STANDING
40
- )
41
-
42
- self.renew = False
25
+ # def update(self, elapsed_time: float, target: Dynamic = None):
26
+ # if not self.renew:
27
+ # self.kill()
28
+
29
+ # self.px = (
30
+ # self._follow.px
31
+ # + (self._follow.sprite.width - self.sprite.width)
32
+ # / 2
33
+ # / self.engine.rtc.tile_width
34
+ # )
35
+ # self.py = (
36
+ # self._follow.py
37
+ # + (self._follow.sprite.height - self.sprite.height)
38
+ # / self.engine.rtc.tile_height
39
+ # )
40
+
41
+ # if self._follow.graphic_state == GraphicState.STANDING:
42
+ # elapsed_time = 0
43
+ # self.sprite.update(
44
+ # elapsed_time, Direction.SOUTH, GraphicState.STANDING
45
+ # )
46
+
47
+ # self.renew = False
43
48
 
44
49
  def draw_self(self, ox: float, oy: float, camera_name: str):
45
50
  if (
mima/objects/loader.py CHANGED
@@ -13,6 +13,7 @@ from .world.light_source import LightSource
13
13
  from .world.logic_gate import LogicGate
14
14
  from .world.movable import Movable
15
15
  from .world.oneway import Oneway
16
+ from .world.pickup import Pickup
16
17
 
17
18
  # from .world.pickup import Pickup
18
19
  from .world.switch import Switch
@@ -38,6 +39,7 @@ class ObjectLoader:
38
39
  "logic_gate": LogicGate.load_from_tiled_object,
39
40
  "movable": Movable.load_from_tiled_object,
40
41
  "oneway": Oneway.load_from_tiled_object,
42
+ "pickup": Pickup.load_from_tiled_object,
41
43
  "switch": Switch.load_from_tiled_object,
42
44
  "teleport": Teleport.load_from_tiled_object,
43
45
  "creature": self.load_creature_from_tiled_object,
@@ -69,10 +71,9 @@ class ObjectLoader:
69
71
  )
70
72
  except (KeyError, ValueError):
71
73
  LOG.exception(
72
- f"Failed to load '{obj.name}' ({obj.object_id}: "
73
- f"{obj.type})"
74
+ f"Failed to load '{obj.name}' ({obj.object_id}: " f"{obj.type})"
74
75
  )
75
- # raise
76
+ raise
76
77
 
77
78
  # Connect listener IDs to actual listeners
78
79
  for dyn in dynamics:
@@ -98,17 +99,13 @@ class ObjectLoader:
98
99
  f"Logic Gate {listener.dyn_id}"
99
100
  )
100
101
 
101
- def load_creature_from_tiled_object(
102
- self, obj, px, py, width, height, tilemap
103
- ):
102
+ def load_creature_from_tiled_object(self, obj, px, py, width, height, tilemap):
104
103
  creature_type = obj.get_string("creature_type")
105
104
  try:
106
105
  return self._cstm_creature_dispatcher[creature_type](
107
106
  obj, px, py, width, height, tilemap
108
107
  )
109
108
  except (KeyError, ValueError):
110
- LOG.exception(
111
- f"Failed to load '{obj.name}' ({obj.object_id}: {obj.type})"
112
- )
109
+ LOG.exception(f"Failed to load '{obj.name}' ({obj.object_id}: {obj.type})")
113
110
  # raise
114
111
  return []
@@ -16,14 +16,24 @@ class Projectile(Dynamic):
16
16
  self,
17
17
  px: float,
18
18
  py: float,
19
- vx: float,
20
- vy: float,
19
+ name: str = "Projectile",
20
+ *,
21
+ sprite_name: str = "",
22
+ tilemap: Tilemap = None,
23
+ dyn_id: int = 1000,
24
+ vx: float = 0.0,
25
+ vy: float = 0.0,
21
26
  duration: float,
22
27
  alignment: Alignment,
23
- tilemap: Tilemap = None,
24
- name: str = "Projectile",
25
28
  ):
26
- super().__init__(px, py, name, tilemap)
29
+ super().__init__(
30
+ px,
31
+ py,
32
+ name,
33
+ sprite_name=sprite_name,
34
+ tilemap=tilemap,
35
+ dyn_id=dyn_id,
36
+ )
27
37
 
28
38
  self.type = ObjectType.PROJECTILE
29
39
  self.vx = vx
mima/objects/sprite.py CHANGED
@@ -72,7 +72,13 @@ class Sprite:
72
72
  self.last_direction = direction
73
73
  self.last_graphic_state = graphic_state
74
74
 
75
- def draw_self(self, px: float, py: float, camera_name: str = "display"):
75
+ def draw_self(
76
+ self,
77
+ px: float,
78
+ py: float,
79
+ camera_name: str = "display",
80
+ draw_to_ui: bool = False,
81
+ ):
76
82
  if self.name == "":
77
83
  return
78
84
 
@@ -102,6 +108,7 @@ class Sprite:
102
108
  self.width,
103
109
  self.height,
104
110
  camera_name,
111
+ draw_to_ui=draw_to_ui,
105
112
  )
106
113
 
107
114
  def reset(self):
@@ -1,5 +1,6 @@
1
1
  from typing import List, Optional, Union
2
2
 
3
+ from ...maps.tilemap import Tilemap
3
4
  from ...types.direction import Direction
4
5
  from ...types.gate_color import GateColor
5
6
  from ...types.graphic_state import GraphicState
@@ -15,28 +16,25 @@ class ColorGate(Gate):
15
16
  self,
16
17
  px: float,
17
18
  py: float,
18
- tileset_name: str,
19
- image_name: str,
20
- sprite_name: str,
21
- graphic_state: GraphicState,
22
- facing_direction: Direction,
23
- color: GateColor,
24
- tilemap=None,
25
- dyn_id: int = -1,
26
19
  name: str = "ColorGate",
20
+ *,
21
+ sprite_name: str = "",
22
+ tilemap: Optional[Tilemap] = None,
23
+ dyn_id: int = -1,
24
+ graphic_state: GraphicState = GraphicState.STANDING,
25
+ facing_direction: Direction = Direction.SOUTH,
26
+ color: GateColor = GateColor.RED,
27
27
  ):
28
28
  super().__init__(
29
29
  px,
30
30
  py,
31
31
  name,
32
- tileset_name,
33
- image_name,
34
- sprite_name,
35
- graphic_state,
36
- facing_direction,
37
- False,
38
- tilemap,
39
- dyn_id,
32
+ sprite_name=sprite_name,
33
+ tilemap=tilemap,
34
+ dyn_id=dyn_id,
35
+ graphic_state=graphic_state,
36
+ facing_direction=facing_direction,
37
+ bombable=False,
40
38
  )
41
39
  self.color = color
42
40
  self.type = ObjectType.COLOR_GATE
@@ -53,9 +51,10 @@ class ColorGate(Gate):
53
51
  gate = ColorGate(
54
52
  px=px,
55
53
  py=py,
56
- tileset_name=obj.get_string("tileset_name"),
57
- image_name=obj.get_string("tileset_name"),
54
+ name=obj.name,
58
55
  sprite_name=obj.get_string("sprite_name"),
56
+ tilemap=tilemap,
57
+ dyn_id=obj.object_id,
59
58
  graphic_state=GraphicState[
60
59
  obj.get_string("graphic_state", "closed").upper()
61
60
  ],
@@ -63,9 +62,6 @@ class ColorGate(Gate):
63
62
  obj.get_string("facing_direction", "south").upper()
64
63
  ],
65
64
  color=GateColor[obj.get_string("color", "red").upper()],
66
- tilemap=tilemap,
67
- dyn_id=obj.object_id,
68
- name=obj.name,
69
65
  )
70
66
 
71
67
  return [gate]