mima-engine 0.2.4__py3-none-any.whl → 0.2.5__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 +1 -1
- mima/backend/pygame_backend.py +4 -1
- mima/core/engine.py +8 -1
- mima/objects/creature.py +3 -3
- mima/scripts/commands/save_game.py +1 -0
- mima/states/game_state.py +60 -35
- mima/util/constants.py +2 -0
- {mima_engine-0.2.4.dist-info → mima_engine-0.2.5.dist-info}/METADATA +1 -1
- {mima_engine-0.2.4.dist-info → mima_engine-0.2.5.dist-info}/RECORD +11 -11
- {mima_engine-0.2.4.dist-info → mima_engine-0.2.5.dist-info}/WHEEL +1 -1
- {mima_engine-0.2.4.dist-info → mima_engine-0.2.5.dist-info}/top_level.txt +0 -0
mima/__init__.py
CHANGED
mima/backend/pygame_backend.py
CHANGED
|
@@ -87,6 +87,7 @@ class PygameBackend:
|
|
|
87
87
|
fullscreen: bool = False,
|
|
88
88
|
target_fps: int = 60,
|
|
89
89
|
resizeable: bool = False,
|
|
90
|
+
no_scaled_flag: bool = False,
|
|
90
91
|
):
|
|
91
92
|
LOG.info("Constructing window.")
|
|
92
93
|
self.render_width, self.display_width = width, width
|
|
@@ -96,7 +97,9 @@ class PygameBackend:
|
|
|
96
97
|
|
|
97
98
|
flags = pygame.HWSURFACE | pygame.DOUBLEBUF
|
|
98
99
|
if fullscreen:
|
|
99
|
-
flags = flags | pygame.FULLSCREEN
|
|
100
|
+
flags = flags | pygame.FULLSCREEN
|
|
101
|
+
if not no_scaled_flag:
|
|
102
|
+
flags = flags | pygame.SCALED
|
|
100
103
|
self.pixel_size = -1 # Calculate later
|
|
101
104
|
elif pixel_size == 0:
|
|
102
105
|
flags = flags | pygame.SCALED
|
mima/core/engine.py
CHANGED
|
@@ -78,6 +78,7 @@ class MimaEngine(ABC):
|
|
|
78
78
|
fullscreen: bool = False,
|
|
79
79
|
target_fps: int = 60,
|
|
80
80
|
resizable: bool = False,
|
|
81
|
+
no_scaled_flag: bool = False,
|
|
81
82
|
kb_map=None,
|
|
82
83
|
):
|
|
83
84
|
"""Initialize backend and create a window."""
|
|
@@ -106,7 +107,13 @@ class MimaEngine(ABC):
|
|
|
106
107
|
joy_to_player=self.rtc.get_joy_to_player(),
|
|
107
108
|
)
|
|
108
109
|
self.backend.construct(
|
|
109
|
-
width,
|
|
110
|
+
width,
|
|
111
|
+
height,
|
|
112
|
+
pixel_size,
|
|
113
|
+
fullscreen,
|
|
114
|
+
target_fps,
|
|
115
|
+
resizable,
|
|
116
|
+
no_scaled_flag,
|
|
110
117
|
)
|
|
111
118
|
self.backend.user_input.enable_touch_controls = (
|
|
112
119
|
self.enable_touch_controls
|
mima/objects/creature.py
CHANGED
|
@@ -136,6 +136,9 @@ class Creature(Dynamic):
|
|
|
136
136
|
if self.attributes.health <= 0:
|
|
137
137
|
self.change_graphic_state(GraphicState.DEAD)
|
|
138
138
|
|
|
139
|
+
if self.can_act():
|
|
140
|
+
self.behavior(elapsed_time, target)
|
|
141
|
+
|
|
139
142
|
if self.vx < -0.01:
|
|
140
143
|
self.facing_direction = Direction.WEST
|
|
141
144
|
if self.vx > 0.01:
|
|
@@ -147,9 +150,6 @@ class Creature(Dynamic):
|
|
|
147
150
|
|
|
148
151
|
self.speed = self.attributes.speed
|
|
149
152
|
|
|
150
|
-
if self.can_act():
|
|
151
|
-
self.behavior(elapsed_time, target)
|
|
152
|
-
|
|
153
153
|
self.sprite.update(
|
|
154
154
|
elapsed_time, self.facing_direction, self.graphic_state
|
|
155
155
|
)
|
mima/states/game_state.py
CHANGED
|
@@ -2,19 +2,21 @@ import json
|
|
|
2
2
|
import logging
|
|
3
3
|
import os
|
|
4
4
|
from os import PathLike
|
|
5
|
-
from
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Any, Dict, Union
|
|
6
7
|
|
|
8
|
+
# from typing_extensions import overload
|
|
9
|
+
from ..util.constants import SAVE_FILE_NAME
|
|
7
10
|
from ..util.functions import strtobool
|
|
8
11
|
|
|
9
12
|
LOG = logging.getLogger(__name__)
|
|
10
13
|
|
|
11
14
|
|
|
12
15
|
class GameState:
|
|
13
|
-
def __init__(self,
|
|
14
|
-
self.
|
|
15
|
-
self.
|
|
16
|
-
|
|
17
|
-
}
|
|
16
|
+
def __init__(self, save_path: PathLike, state_name: str = "autosave.json"):
|
|
17
|
+
self.state_name = state_name
|
|
18
|
+
self._save_path = save_path
|
|
19
|
+
self._state: Dict[str, Any] = {}
|
|
18
20
|
|
|
19
21
|
def save_value(
|
|
20
22
|
self, key: str, value: Union[int, float, bool, str, dict, list]
|
|
@@ -27,12 +29,22 @@ class GameState:
|
|
|
27
29
|
else:
|
|
28
30
|
state[part] = value
|
|
29
31
|
|
|
32
|
+
# @overload
|
|
33
|
+
# def load_value(
|
|
34
|
+
# self, key: str, default: str, astype: str | None
|
|
35
|
+
# ) -> str | None: ...
|
|
36
|
+
|
|
37
|
+
# @overload
|
|
38
|
+
# def load_value(
|
|
39
|
+
# self, key: str, default: int, astype: str | None
|
|
40
|
+
# ) -> int | None: ...
|
|
41
|
+
|
|
30
42
|
def load_value(
|
|
31
43
|
self,
|
|
32
44
|
key: str,
|
|
33
|
-
default:
|
|
34
|
-
astype:
|
|
35
|
-
) ->
|
|
45
|
+
default: int | float | bool | str | dict | list | None = None,
|
|
46
|
+
astype: str | None = None,
|
|
47
|
+
) -> int | float | bool | str | dict | list | None:
|
|
36
48
|
parts = key.split("__")
|
|
37
49
|
state = self._state
|
|
38
50
|
for idx, part in enumerate(parts):
|
|
@@ -57,11 +69,11 @@ class GameState:
|
|
|
57
69
|
return data
|
|
58
70
|
|
|
59
71
|
def load_from_disk(self, autosave: bool = False):
|
|
60
|
-
filename = self.filename
|
|
61
|
-
if autosave:
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
72
|
+
# filename = self.filename
|
|
73
|
+
# if autosave:
|
|
74
|
+
# filename = os.path.join(self._save_path, "autosave.json")
|
|
75
|
+
# else:
|
|
76
|
+
filename = Path(self._save_path) / self.state_name
|
|
65
77
|
try:
|
|
66
78
|
with open(filename, "r") as fp:
|
|
67
79
|
self._state = json.load(fp)
|
|
@@ -71,32 +83,33 @@ class GameState:
|
|
|
71
83
|
LOG.info("No saved state found or state corrupted.")
|
|
72
84
|
|
|
73
85
|
if autosave:
|
|
74
|
-
self.
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
86
|
+
self.state_name = self.load_value("savefile_name", "")
|
|
87
|
+
# if autosave:
|
|
88
|
+
# self.filename = os.path.join(
|
|
89
|
+
# os.path.split(filename)[0],
|
|
90
|
+
# f"{self._state['savefile_name']}.json",
|
|
91
|
+
# )
|
|
78
92
|
|
|
79
93
|
def save_to_disk(self, autosave: bool = False):
|
|
80
|
-
filename = self.filename
|
|
94
|
+
# filename = self.filename
|
|
81
95
|
if autosave:
|
|
82
|
-
filename =
|
|
83
|
-
|
|
84
|
-
)
|
|
85
|
-
self.save_value("savefile_name", "autosave")
|
|
96
|
+
filename = Path(self._save_path) / "autosave.json"
|
|
97
|
+
self.save_value("savefile_name", self.state_name)
|
|
86
98
|
self.save_value("player__pos_x", 5.0)
|
|
87
99
|
self.save_value("player__pos_y", 5.0)
|
|
88
100
|
self.save_value(
|
|
89
101
|
"player__map_name", self.load_value("player__spawn_map")
|
|
90
102
|
)
|
|
91
103
|
else:
|
|
92
|
-
self.
|
|
93
|
-
|
|
94
|
-
|
|
104
|
+
if self.state_name == "autosave.json":
|
|
105
|
+
self.state_name = chose_filename(self._save_path)
|
|
106
|
+
self.save_value("savefile_name", self.state_name)
|
|
107
|
+
filename = Path(self._save_path) / self.state_name
|
|
108
|
+
self._state["savefile_name"] = self.state_name
|
|
109
|
+
|
|
95
110
|
# Auto save file will be removed after a successful save
|
|
96
111
|
try:
|
|
97
|
-
os.remove(
|
|
98
|
-
os.path.join(os.path.split(filename)[0], "autosave.json")
|
|
99
|
-
)
|
|
112
|
+
os.remove(Path(self._save_path) / "autosave.json")
|
|
100
113
|
except FileNotFoundError:
|
|
101
114
|
pass
|
|
102
115
|
|
|
@@ -112,6 +125,17 @@ class GameState:
|
|
|
112
125
|
del self._state[scope][k]
|
|
113
126
|
|
|
114
127
|
|
|
128
|
+
def chose_filename(save_path: PathLike):
|
|
129
|
+
|
|
130
|
+
files = os.listdir(save_path)
|
|
131
|
+
game_idx = 0
|
|
132
|
+
while True:
|
|
133
|
+
savegame = f"{SAVE_FILE_NAME}_{game_idx:03d}.json"
|
|
134
|
+
if savegame not in files:
|
|
135
|
+
return savegame
|
|
136
|
+
game_idx += 1
|
|
137
|
+
|
|
138
|
+
|
|
115
139
|
def convert(value, astype):
|
|
116
140
|
if astype == "int":
|
|
117
141
|
try:
|
|
@@ -144,17 +168,18 @@ def load_saved_games(save_path, save_file_name):
|
|
|
144
168
|
return all_games
|
|
145
169
|
|
|
146
170
|
if "autosave.json" in files:
|
|
147
|
-
all_games["autosave"] = GameState(
|
|
148
|
-
|
|
171
|
+
all_games["autosave.json"] = GameState(save_path)
|
|
172
|
+
all_games["autosave.json"].load_from_disk(autosave=True)
|
|
173
|
+
LOG.debug(
|
|
174
|
+
"Loading saved game from autosave.json (%s)",
|
|
175
|
+
all_games["autosave.json"].state_name,
|
|
149
176
|
)
|
|
150
|
-
all_games["autosave"].load_from_disk(autosave=True)
|
|
151
|
-
LOG.debug("Loading saved game from autosave.json")
|
|
152
177
|
|
|
153
178
|
game_idx = 0
|
|
154
179
|
while True:
|
|
155
|
-
savegame = f"{save_file_name}{game_idx:03d}.json"
|
|
180
|
+
savegame = f"{save_file_name}_{game_idx:03d}.json"
|
|
156
181
|
if savegame in files:
|
|
157
|
-
all_games[savegame] = GameState(
|
|
182
|
+
all_games[savegame] = GameState(save_path, savegame)
|
|
158
183
|
all_games[savegame].load_from_disk()
|
|
159
184
|
LOG.debug(f"Loading saved game from {savegame}")
|
|
160
185
|
game_idx += 1
|
mima/util/constants.py
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
mima/__init__.py,sha256=
|
|
1
|
+
mima/__init__.py,sha256=F5RjHC-SN2HiXoAyraEs4p3v2Qoo3eEj7tVbx8Gi-M4,104
|
|
2
2
|
mima/backend/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
3
3
|
mima/backend/pygame_assets.py,sha256=DoeebQlRqzTtuu_AsZ0kauqGzly0JtrOi66W1WTzUhk,14106
|
|
4
4
|
mima/backend/pygame_audio.py,sha256=gag9bM-UT8DfYpGDYvKBn8jdnwgFU4NklEs2aNwHhRY,2365
|
|
5
|
-
mima/backend/pygame_backend.py,sha256=
|
|
5
|
+
mima/backend/pygame_backend.py,sha256=9-bIEMMboKzJ2lhuKGLx4pLFICd6AX-TVFGjAYRF0DU,18655
|
|
6
6
|
mima/backend/pygame_camera.py,sha256=5ietEyhDryT3SBChvcY_jdsWRi09gcTg5O5mvg_15mM,2059
|
|
7
7
|
mima/backend/pygame_events.py,sha256=dLn3T2cw-RWIcKAUjcQRh0-ZgY43Ps3Y47ZfxCpw4B0,27669
|
|
8
8
|
mima/backend/touch_control_scheme_a.py,sha256=lI8xCVH-KDuLwoH4Vq-0JuQm1cDI3I2g1rkoR5lY8DY,4745
|
|
@@ -10,7 +10,7 @@ mima/backend/touch_control_scheme_b.py,sha256=L_WiwGFTjCtL_YcL8SH2bToHe-RiXoqAj6
|
|
|
10
10
|
mima/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
11
|
mima/core/collision.py,sha256=CMItVHkjt6Bl8rr7Wnwa_QkynMNVTpDmJEF8dZzJSJk,9897
|
|
12
12
|
mima/core/database.py,sha256=lo_LlhONPwZxuW8fdm_Oeg8Ofe4Qr8pwbAeYx477HxM,2007
|
|
13
|
-
mima/core/engine.py,sha256=
|
|
13
|
+
mima/core/engine.py,sha256=k3ykBbJkIOnCVRRG2BnDTo81g_tHuN-OrnB08MS6j9Y,11417
|
|
14
14
|
mima/core/mode_engine.py,sha256=4dSjLRxjaoj3wP1k13X3-YqT2PbmXZ1fBwzmVHYt2Eg,2305
|
|
15
15
|
mima/core/scene_engine.py,sha256=8P_ZuXwPHZFthgHmVtWkIgaXHedeu0eyRdf2P8ACLRA,2586
|
|
16
16
|
mima/maps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -35,7 +35,7 @@ mima/objects/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
35
35
|
mima/objects/animated_sprite.py,sha256=xeg89mZxx2_PpKX_dq1ySkfeZlEbxVymbX2Kf_yOHSw,7210
|
|
36
36
|
mima/objects/attribute_effect.py,sha256=zikOSb6-hD6Ecm4L9EyRocTyJQ7IYC0CJ9DCBxbK4cU,650
|
|
37
37
|
mima/objects/attributes.py,sha256=qqIVjuIXUQDv3qtdoaRDvBnx5oUbjuPdvcGR49fHRwM,3781
|
|
38
|
-
mima/objects/creature.py,sha256=
|
|
38
|
+
mima/objects/creature.py,sha256=ILyLMeJyoQ0ewmOhFlpXynLxdVppzac2EAKQyAMayN0,12773
|
|
39
39
|
mima/objects/dynamic.py,sha256=yDh8wjX_FViUWF0lqiLH0q3iuLMaE1qAd4uu6DHB7D4,6434
|
|
40
40
|
mima/objects/loader.py,sha256=GAdXsS5dINwNuHq88nCTHqrorg-BC5Fw8wgDtcMpnoA,4394
|
|
41
41
|
mima/objects/projectile.py,sha256=50aoKz8F8NH0Z5wSSsSm2RhsgbGWQd4PFMTf0Ku-0z4,3214
|
|
@@ -78,7 +78,7 @@ mima/scripts/commands/play_sound.py,sha256=m4wqWC6O8TUsJIcYrP8bb8ZFjSNK3IpAyBdxL
|
|
|
78
78
|
mima/scripts/commands/present_item.py,sha256=HfSCncURe6HIc2-omA7xvFbon58wmRaKEwVukZ1FlhM,1865
|
|
79
79
|
mima/scripts/commands/progress_quest.py,sha256=-Nm7basBFdnixKwf42Xrs6iDROx22WGIDHpAZ0itpGU,359
|
|
80
80
|
mima/scripts/commands/quit_game.py,sha256=BmLlh45K46Mx57j1dE2wWhmmmcb0Y-X5mLrFV1HIfhI,219
|
|
81
|
-
mima/scripts/commands/save_game.py,sha256=
|
|
81
|
+
mima/scripts/commands/save_game.py,sha256=5B9OJCe2_mJ2AoAhVkLzb62NDerNGc_QEGyJgoJ5tus,464
|
|
82
82
|
mima/scripts/commands/screen_fade.py,sha256=rcdH44ANsaQa_wLMTj7mdzc4Dy9ZzjAQLNMWAcmFh34,2290
|
|
83
83
|
mima/scripts/commands/serial.py,sha256=AI8h2r5nF9B7H6gpiI3J3ewvpF9p0thsYpnKecXWfP8,2223
|
|
84
84
|
mima/scripts/commands/set_facing_direction.py,sha256=M_AFJQWgd0nYG7ZPq6BBOmjF4n0jcnBdvyxLboucjZk,567
|
|
@@ -87,7 +87,7 @@ mima/scripts/commands/show_choices.py,sha256=6DwlhmXMcAgMyVmzwvUoQKEmIu2ynO1VmiA
|
|
|
87
87
|
mima/scripts/commands/show_dialog.py,sha256=xKlve5O03IlBvg87zfyDczWT7IlaMRPfsl2Y9hxabVE,3948
|
|
88
88
|
mima/scripts/commands/take_coins.py,sha256=37jChQBQKFaIBx6-Bvx3xNPlqSq87pvnMtnSWQWU1iI,573
|
|
89
89
|
mima/states/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
90
|
-
mima/states/game_state.py,sha256=
|
|
90
|
+
mima/states/game_state.py,sha256=EmqwBB-7xX_O7q0MWi8BwtVGGBZjB1ZahRR-rAJflhU,5943
|
|
91
91
|
mima/states/memory.py,sha256=js8sqKDcq8xPw8oB6j4GICXWeNsoqj_rueSe3jRS0-A,1020
|
|
92
92
|
mima/states/quest.py,sha256=sF1IhVa0QcwSoHrl8hiCG-j6UlE51UrLbq--a8Rvu4k,2380
|
|
93
93
|
mima/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -113,7 +113,7 @@ mima/usables/item.py,sha256=3ZM1gR6Ve-5PgBC8QuXU26rKIe9KXbKp_VCouvi-vUY,1443
|
|
|
113
113
|
mima/usables/weapon.py,sha256=YzahQ_B9PT2rgd6NjBJY2ISVAE3XO7PPpE2gZumv3q4,2033
|
|
114
114
|
mima/util/__init__.py,sha256=KMuEDnRsGr32gXED12ZyL1za6iKAuk_Tn8S3mTtpYds,42
|
|
115
115
|
mima/util/colors.py,sha256=u4YVTCvSNFBhHaR9dFiMVzvE9fRM1UlW1m8gDa7oDY4,1483
|
|
116
|
-
mima/util/constants.py,sha256=
|
|
116
|
+
mima/util/constants.py,sha256=oF9An3UVmBVziG7XkG_YLzTiK2M8ObEXBLVNrfzy_iU,1382
|
|
117
117
|
mima/util/functions.py,sha256=GqAgT4-ATZcCvaaUyEOCeXphUu8xJXmVshAbFPJfOWI,1130
|
|
118
118
|
mima/util/input_defaults.py,sha256=dIfcp9nQSVcO3U4tCB0R5cXwcKUQ7rpztnB1Feud1e4,3179
|
|
119
119
|
mima/util/logging.py,sha256=p6-C1ozlCs_sCkmykh_B0NgZtvSkcZXXseE6qA6Zwew,1197
|
|
@@ -126,7 +126,7 @@ mima/view/mima_mode.py,sha256=W92hAKBvvC_yM_6SpXZmpY8WHKiYgqYuULlxGeMbipA,22189
|
|
|
126
126
|
mima/view/mima_scene.py,sha256=0dDeuObUfgtWhaZRbiKLpTukhJ-74TU4gm111VF9FHQ,7253
|
|
127
127
|
mima/view/mima_view.py,sha256=tKLcoNWVwldoqgG3jxhI_jMsFAXzod2csXyEbhub2xI,217
|
|
128
128
|
mima/view/mima_window.py,sha256=tUdMDBZoB2zV66NhVuOb7pvQjehg_zPQtmdN9M8PIcc,8105
|
|
129
|
-
mima_engine-0.2.
|
|
130
|
-
mima_engine-0.2.
|
|
131
|
-
mima_engine-0.2.
|
|
132
|
-
mima_engine-0.2.
|
|
129
|
+
mima_engine-0.2.5.dist-info/METADATA,sha256=qRo-6PT-zVG5h1FYsyu7v9hejE0bfdvETwX4q4R8Jvc,487
|
|
130
|
+
mima_engine-0.2.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
131
|
+
mima_engine-0.2.5.dist-info/top_level.txt,sha256=5t1cOdQSaPQ0jWDhKDvDXwpV2XZ_a1GSSFAIvEsG0fQ,5
|
|
132
|
+
mima_engine-0.2.5.dist-info/RECORD,,
|
|
File without changes
|