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.
- mima/__init__.py +4 -1
- mima/backend/pygame_assets.py +67 -9
- mima/backend/pygame_backend.py +5 -2
- mima/backend/pygame_events.py +210 -194
- mima/backend/touch_control_scheme_a.py +126 -0
- mima/backend/touch_control_scheme_b.py +132 -0
- mima/core/__init__.py +0 -0
- mima/{collision.py → core/collision.py} +45 -28
- mima/core/database.py +58 -0
- mima/{engine.py → core/engine.py} +51 -33
- mima/{mode_engine.py → core/mode_engine.py} +7 -6
- 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 +20 -7
- mima/objects/dynamic.py +3 -1
- mima/objects/effects/colorize_screen.py +9 -1
- mima/objects/effects/debug_box.py +11 -2
- 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 +10 -15
- mima/objects/world/color_switch.py +18 -28
- mima/objects/world/container.py +32 -37
- mima/objects/world/floor_switch.py +22 -28
- mima/objects/world/gate.py +21 -24
- 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 +63 -41
- mima/objects/world/pickup.py +81 -17
- mima/objects/world/switch.py +46 -35
- mima/objects/world/teleport.py +21 -22
- mima/scripts/commands/oneway_move.py +4 -3
- 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/constants.py +3 -3
- mima/util/input_defaults.py +12 -0
- mima/util/runtime_config.py +8 -15
- mima/util/trading_item.py +4 -1
- mima/view/mima_mode.py +8 -2
- mima/view/mima_scene.py +6 -0
- mima/view/mima_window.py +91 -0
- {mima_engine-0.2.2.dist-info → mima_engine-0.2.4.dist-info}/METADATA +4 -4
- {mima_engine-0.2.2.dist-info → mima_engine-0.2.4.dist-info}/RECORD +57 -53
- {mima_engine-0.2.2.dist-info → mima_engine-0.2.4.dist-info}/WHEEL +1 -1
- {mima_engine-0.2.2.dist-info → mima_engine-0.2.4.dist-info}/top_level.txt +0 -0
mima/maps/tiled/tiled_tileset.py
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
9
|
+
self.image_name: str = ""
|
|
10
10
|
# self.filename: str = ""
|
|
11
|
-
self.
|
|
12
|
-
self.
|
|
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:
|
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,
|
|
@@ -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 =
|
|
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
|
|
@@ -21,7 +21,12 @@ class DynamicDebugBox(Projectile):
|
|
|
21
21
|
ids=None,
|
|
22
22
|
) -> None:
|
|
23
23
|
super().__init__(
|
|
24
|
-
0,
|
|
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,
|
|
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
|
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 []
|