mima-engine 0.2.2__py3-none-any.whl → 0.2.4__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 (57) 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/backend/pygame_events.py +210 -194
  5. mima/backend/touch_control_scheme_a.py +126 -0
  6. mima/backend/touch_control_scheme_b.py +132 -0
  7. mima/core/__init__.py +0 -0
  8. mima/{collision.py → core/collision.py} +45 -28
  9. mima/core/database.py +58 -0
  10. mima/{engine.py → core/engine.py} +51 -33
  11. mima/{mode_engine.py → core/mode_engine.py} +7 -6
  12. mima/{scene_engine.py → core/scene_engine.py} +3 -7
  13. mima/maps/template.py +31 -1
  14. mima/maps/tiled/tiled_object.py +1 -1
  15. mima/maps/tiled/tiled_tileset.py +10 -5
  16. mima/maps/tilemap.py +4 -10
  17. mima/maps/tileset.py +5 -4
  18. mima/objects/animated_sprite.py +79 -68
  19. mima/objects/creature.py +20 -7
  20. mima/objects/dynamic.py +3 -1
  21. mima/objects/effects/colorize_screen.py +9 -1
  22. mima/objects/effects/debug_box.py +11 -2
  23. mima/objects/effects/light.py +6 -1
  24. mima/objects/effects/show_sprite.py +17 -6
  25. mima/objects/effects/walking_on_grass.py +27 -13
  26. mima/objects/effects/walking_on_water.py +36 -31
  27. mima/objects/loader.py +6 -9
  28. mima/objects/projectile.py +15 -5
  29. mima/objects/sprite.py +8 -1
  30. mima/objects/world/color_gate.py +10 -15
  31. mima/objects/world/color_switch.py +18 -28
  32. mima/objects/world/container.py +32 -37
  33. mima/objects/world/floor_switch.py +22 -28
  34. mima/objects/world/gate.py +21 -24
  35. mima/objects/world/light_source.py +27 -32
  36. mima/objects/world/logic_gate.py +30 -37
  37. mima/objects/world/movable.py +106 -89
  38. mima/objects/world/oneway.py +63 -41
  39. mima/objects/world/pickup.py +81 -17
  40. mima/objects/world/switch.py +46 -35
  41. mima/objects/world/teleport.py +21 -22
  42. mima/scripts/commands/oneway_move.py +4 -3
  43. mima/scripts/commands/present_item.py +10 -10
  44. mima/types/graphic_state.py +1 -0
  45. mima/usables/item.py +28 -9
  46. mima/usables/weapon.py +28 -8
  47. mima/util/constants.py +3 -3
  48. mima/util/input_defaults.py +12 -0
  49. mima/util/runtime_config.py +8 -15
  50. mima/util/trading_item.py +4 -1
  51. mima/view/mima_mode.py +8 -2
  52. mima/view/mima_scene.py +6 -0
  53. mima/view/mima_window.py +91 -0
  54. {mima_engine-0.2.2.dist-info → mima_engine-0.2.4.dist-info}/METADATA +4 -4
  55. {mima_engine-0.2.2.dist-info → mima_engine-0.2.4.dist-info}/RECORD +57 -53
  56. {mima_engine-0.2.2.dist-info → mima_engine-0.2.4.dist-info}/WHEEL +1 -1
  57. {mima_engine-0.2.2.dist-info → mima_engine-0.2.4.dist-info}/top_level.txt +0 -0
@@ -33,14 +33,19 @@ class TiledTileset(Tileset):
33
33
 
34
34
  LOG.debug("Loading image properties ...")
35
35
  image = root.findall("image")[0]
36
- self.sprite_name: str = os.path.split(image.attrib["source"])[-1][:-4]
36
+ self.image_name: str = os.path.split(image.attrib["source"])[-1][:-4]
37
37
  self.sprite_width: int = int(image.attrib["width"])
38
38
  self.sprite_height: int = int(image.attrib["height"])
39
39
 
40
40
  LOG.debug("Loading tiles ...")
41
41
  tiles = root.findall("tile")
42
-
42
+
43
43
  for tile in tiles:
44
- self.tiles.append(TiledTile(tile))
45
- if self.tiles[-1].animated:
46
- self.animated_tiles.append(self.tiles[-1])
44
+ t_obj = TiledTile(tile)
45
+ self.tiles.append(t_obj)
46
+ if t_obj.animated:
47
+ self.animated_tiles.append(t_obj)
48
+ if t_obj.sprite_name:
49
+ self.sprite_names.setdefault(t_obj.sprite_name, []).append(
50
+ t_obj.tile_id
51
+ )
mima/maps/tilemap.py CHANGED
@@ -64,12 +64,8 @@ class Tilemap(Template):
64
64
  if layer.layer_pos != layer_pos:
65
65
  continue
66
66
 
67
- layer_ox = (
68
- layer.layer_ox - math.floor(layer.layer_ox)
69
- ) * self.tile_width
70
- layer_oy = (
71
- layer.layer_oy - math.floor(layer.layer_oy)
72
- ) * self.tile_height
67
+ layer_ox = (layer.layer_ox - math.floor(layer.layer_ox)) * self.tile_width
68
+ layer_oy = (layer.layer_oy - math.floor(layer.layer_oy)) * self.tile_height
73
69
 
74
70
  layer_visible_tiles_sx = int(visible_tiles_sx)
75
71
  layer_visible_tiles_sy = int(visible_tiles_sy)
@@ -81,9 +77,7 @@ class Tilemap(Template):
81
77
 
82
78
  # Draw visible tiles of the map
83
79
  for x in range(layer_visible_tiles_sx, int(visible_tiles_ex) + 2):
84
- for y in range(
85
- layer_visible_tiles_sy, int(visible_tiles_ey) + 2
86
- ):
80
+ for y in range(layer_visible_tiles_sy, int(visible_tiles_ey) + 2):
87
81
  tile_index = layer.get_index(
88
82
  int(x + math.floor(ox)), int(y + math.floor(oy))
89
83
  )
@@ -103,7 +97,7 @@ class Tilemap(Template):
103
97
  self.engine.backend.draw_partial_sprite(
104
98
  math.floor(x * self.tile_width - tile_ox + layer_ox),
105
99
  math.floor(y * self.tile_height - tile_oy + layer_oy),
106
- info.tileset.sprite_name,
100
+ info.tileset.image_name,
107
101
  sx * self.tile_width,
108
102
  sy * self.tile_height,
109
103
  self.tile_width,
mima/maps/tileset.py CHANGED
@@ -1,4 +1,4 @@
1
- from typing import List
1
+ from typing import Dict, List
2
2
 
3
3
  from .tile import Tile
4
4
 
@@ -6,10 +6,10 @@ from .tile import Tile
6
6
  class Tileset:
7
7
  def __init__(self):
8
8
  self.name: str = "Unnamed Tileset"
9
- self.sprite_name: str = ""
9
+ self.image_name: str = ""
10
10
  # self.filename: str = ""
11
- self.sprite_width: int = 0
12
- self.sprite_height: int = 0
11
+ self.image_width: int = 0
12
+ self.image_height: int = 0
13
13
  self.tile_width: int = 0
14
14
  self.tile_height: int = 0
15
15
  self.tile_count: int = 0
@@ -17,6 +17,7 @@ class Tileset:
17
17
 
18
18
  self.tiles: List[Tile] = []
19
19
  self.animated_tiles: List[Tile] = []
20
+ self.sprite_names: Dict[str, List[int]] = {}
20
21
  self._is_new_frame: bool = False
21
22
 
22
23
  def update(self, elapsed_time: float) -> bool:
@@ -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,
@@ -291,6 +298,12 @@ class Creature(Dynamic):
291
298
 
292
299
  self.projectiles = []
293
300
 
301
+ def on_enter_map(self):
302
+ pass
303
+
304
+ def on_exit_map(self):
305
+ pass
306
+
294
307
  def on_death(self):
295
308
  if self.spawn_on_death:
296
309
  for do in self.spawn_on_death:
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
@@ -21,7 +21,12 @@ class DynamicDebugBox(Projectile):
21
21
  ids=None,
22
22
  ) -> None:
23
23
  super().__init__(
24
- 0, 0, 0, 0, 0, Alignment.NEUTRAL, follow.tilemap, "DynamicDebugBox"
24
+ 0,
25
+ 0,
26
+ "DynamicDebugBox",
27
+ duration=0.0,
28
+ alignment=Alignment.NEUTRAL,
29
+ tilemap=follow.tilemap,
25
30
  )
26
31
  self.layer = 2
27
32
  self.sprite = None
@@ -76,7 +81,11 @@ class DynamicDebugBox(Projectile):
76
81
  class StaticDebugBox(Projectile):
77
82
  def __init__(self, px, py, width, height, color, n_frames=1, ids=None):
78
83
  super().__init__(
79
- px, py, 0, 0, 0, Alignment.NEUTRAL, None, "StaticDebugBox"
84
+ px,
85
+ py,
86
+ "StaticDebugBox",
87
+ duration=0.0,
88
+ alignment=Alignment.NEUTRAL,
80
89
  )
81
90
  self.layer = 2
82
91
  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 []