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.
- mima/__init__.py +4 -1
- mima/backend/pygame_assets.py +67 -9
- mima/backend/pygame_backend.py +5 -2
- mima/core/__init__.py +0 -0
- mima/{collision.py → core/collision.py} +11 -17
- mima/core/database.py +58 -0
- mima/{engine.py → core/engine.py} +51 -45
- mima/{mode_engine.py → core/mode_engine.py} +8 -12
- mima/{scene_engine.py → core/scene_engine.py} +3 -7
- mima/maps/template.py +31 -1
- mima/maps/tiled/tiled_object.py +1 -1
- mima/maps/tiled/tiled_tileset.py +10 -5
- mima/maps/tilemap.py +4 -10
- mima/maps/tileset.py +5 -4
- mima/objects/animated_sprite.py +79 -68
- mima/objects/creature.py +14 -7
- mima/objects/dynamic.py +3 -1
- mima/objects/effects/colorize_screen.py +9 -1
- mima/objects/effects/light.py +6 -1
- mima/objects/effects/show_sprite.py +17 -6
- mima/objects/effects/walking_on_grass.py +27 -13
- mima/objects/effects/walking_on_water.py +36 -31
- mima/objects/loader.py +6 -9
- mima/objects/projectile.py +15 -5
- mima/objects/sprite.py +8 -1
- mima/objects/world/color_gate.py +17 -21
- mima/objects/world/color_switch.py +18 -28
- mima/objects/world/container.py +31 -36
- mima/objects/world/floor_switch.py +22 -28
- mima/objects/world/gate.py +33 -32
- mima/objects/world/light_source.py +27 -32
- mima/objects/world/logic_gate.py +30 -37
- mima/objects/world/movable.py +106 -89
- mima/objects/world/oneway.py +29 -33
- mima/objects/world/pickup.py +75 -17
- mima/objects/world/switch.py +26 -31
- mima/objects/world/teleport.py +21 -22
- mima/scripts/commands/close_dialog.py +2 -1
- mima/scripts/commands/present_item.py +10 -10
- mima/types/graphic_state.py +1 -0
- mima/usables/item.py +28 -9
- mima/usables/weapon.py +28 -8
- mima/util/runtime_config.py +8 -15
- mima/util/trading_item.py +4 -1
- mima/view/mima_mode.py +19 -54
- {mima_engine-0.2.1.dist-info → mima_engine-0.2.3.dist-info}/METADATA +3 -3
- {mima_engine-0.2.1.dist-info → mima_engine-0.2.3.dist-info}/RECORD +49 -47
- {mima_engine-0.2.1.dist-info → mima_engine-0.2.3.dist-info}/WHEEL +1 -1
- {mima_engine-0.2.1.dist-info → mima_engine-0.2.3.dist-info}/top_level.txt +0 -0
mima/objects/animated_sprite.py
CHANGED
|
@@ -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:
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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.
|
|
189
|
-
graphic_state, self.
|
|
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
|
|
196
|
-
self.
|
|
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 = {
|
|
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__(
|
|
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 =
|
|
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 =
|
|
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__(
|
|
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
|
mima/objects/effects/light.py
CHANGED
|
@@ -15,7 +15,12 @@ class Light(Projectile):
|
|
|
15
15
|
update_from_target: bool = False,
|
|
16
16
|
):
|
|
17
17
|
super().__init__(
|
|
18
|
-
0,
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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,
|
|
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.
|
|
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__(
|
|
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,
|
|
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.
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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__(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
self.sprite.
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
|
|
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 []
|
mima/objects/projectile.py
CHANGED
|
@@ -16,14 +16,24 @@ class Projectile(Dynamic):
|
|
|
16
16
|
self,
|
|
17
17
|
px: float,
|
|
18
18
|
py: float,
|
|
19
|
-
|
|
20
|
-
|
|
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__(
|
|
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(
|
|
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):
|
mima/objects/world/color_gate.py
CHANGED
|
@@ -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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
-
|
|
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]
|