Update keybindings and enhance loading screen functionality

- Refactor keybindings for gas spawning across multiple configurations
- Implement new loading screen updates during game initialization
- Add tests to ensure all weapon actions are exposed in keybinding profiles
- Introduce new assets for explosion effects
This commit is contained in:
John Doe
2026-05-09 13:29:32 +02:00
parent 310dc0dca9
commit d9d7a4ac82
16 changed files with 306 additions and 21 deletions
+51 -7
View File
@@ -50,12 +50,12 @@ def build_dummy(level_index):
dummy.save_score = lambda: saves.append(dummy.points)
dummy.load_level = lambda *args, **kwargs: load_calls.append((args, kwargs))
return dummy, dialogs, stats, saves, load_calls
return dummy, sounds, dialogs, stats, saves, load_calls
class FinalLevelFlowTests(unittest.TestCase):
def test_debug_flag_helper_opens_final_dialog_without_recording_score(self):
dummy, _, stats, saves, _ = build_dummy(3)
dummy, _, _, stats, saves, _ = build_dummy(3)
dummy.activate_debug_run_complete_dialog(score=777)
@@ -68,7 +68,7 @@ class FinalLevelFlowTests(unittest.TestCase):
self.assertEqual(saves, [])
def test_run_complete_screen_uses_dedicated_music(self):
dummy, _, _, _, _ = build_dummy(3)
dummy, _, _, _, _, _ = build_dummy(3)
music_calls = []
dummy.render_engine.play_music = lambda track, loop=True: music_calls.append((track, loop)) or True
dummy.render_engine.pause_music = lambda: music_calls.append(("pause", False))
@@ -79,7 +79,7 @@ class FinalLevelFlowTests(unittest.TestCase):
self.assertEqual(music_calls, [(RUN_COMPLETE_MUSIC, True)])
def test_advance_level_does_not_wrap_after_last_dat_level(self):
dummy, _, stats, saves, load_calls = build_dummy(maze.DEFAULT_LEVELS_PER_DAT_FILE - 1)
dummy, _, _, stats, saves, load_calls = build_dummy(maze.DEFAULT_LEVELS_PER_DAT_FILE - 1)
dummy.advance_level()
@@ -90,7 +90,7 @@ class FinalLevelFlowTests(unittest.TestCase):
self.assertEqual(load_calls, [])
def test_regular_level_clear_keeps_run_open(self):
dummy, _, stats, saves, _ = build_dummy(4)
dummy, sounds, _, stats, saves, _ = build_dummy(4)
result = dummy.game_over()
@@ -100,9 +100,16 @@ class FinalLevelFlowTests(unittest.TestCase):
self.assertEqual(dummy.combined_scores, [{"user_id": "Player1", "best_score": 1234}])
self.assertEqual(stats, [])
self.assertEqual(saves, [])
self.assertEqual(
sounds,
[
("stop",),
(("VICTORY.WAV",), {}),
],
)
def test_final_dat_level_records_score_and_shows_dedicated_dialog(self):
dummy, dialogs, stats, saves, _ = build_dummy(maze.DEFAULT_LEVELS_PER_DAT_FILE - 1)
dummy, sounds, dialogs, stats, saves, _ = build_dummy(maze.DEFAULT_LEVELS_PER_DAT_FILE - 1)
result = dummy.game_over()
@@ -112,6 +119,14 @@ class FinalLevelFlowTests(unittest.TestCase):
self.assertEqual(stats, [(1234, True)])
self.assertEqual(saves, [1234])
self.assertEqual(dummy.combined_scores, [{"user_id": "Player1", "best_score": 1234}])
self.assertEqual(
sounds,
[
("stop",),
(("VICTORY.WAV",), {}),
(("WELLDONE.WAV",), {"tag": "effects"}),
],
)
dummy.game_over()
@@ -121,7 +136,7 @@ class FinalLevelFlowTests(unittest.TestCase):
self.assertIs(dialogs[-1][1]["image"], dummy.assets["end"])
def test_return_after_final_dialog_goes_back_to_start_menu(self):
dummy, _, _, _, load_calls = build_dummy(maze.DEFAULT_LEVELS_PER_DAT_FILE - 1)
dummy, _, _, _, _, load_calls = build_dummy(maze.DEFAULT_LEVELS_PER_DAT_FILE - 1)
dummy.game_end = (True, GAME_END_RUN_COMPLETE)
dummy.game_status = "paused"
@@ -132,6 +147,35 @@ class FinalLevelFlowTests(unittest.TestCase):
[((0,), {"preserve_points": False, "show_menu": True, "menu_screen": "start"})],
)
def test_toggle_pause_ignores_transition_screen_between_levels(self):
dummy, _, _, _, _, _ = build_dummy(2)
dummy.game_status = "start_menu"
dummy.menu_screen = "level_intro"
dummy.toggle_pause()
self.assertEqual(dummy.game_status, "start_menu")
self.assertEqual(dummy.menu_screen, "level_intro")
def test_toggle_pause_ignores_game_end_dialogs(self):
dummy, _, _, _, _, _ = build_dummy(2)
dummy.game_status = "paused"
dummy.game_end = (True, GAME_END_LEVEL_CLEAR)
dummy.toggle_pause()
self.assertEqual(dummy.game_status, "paused")
self.assertEqual(dummy.game_end, (True, GAME_END_LEVEL_CLEAR))
def test_toggle_pause_still_toggles_real_pause(self):
dummy, _, _, _, _, _ = build_dummy(2)
dummy.toggle_pause()
self.assertEqual(dummy.game_status, "paused")
dummy.toggle_pause()
self.assertEqual(dummy.game_status, "game")
if __name__ == "__main__":
unittest.main()