v1.3: Ablauf gefixt. Tutorial und Startsequenz waren in einer Klasse - jetzt getrennt. Reihenfolge immer: Anleitung -> Moduswahl -> Startsequenz -> Spiel -> Abschluss (10s) -> Anleitung. 57 Tests.

This commit is contained in:
Project Bridge committed 2026-11-01 11:49:44 +00:00
1 parent e3a0c5a57d
commit 441bdb440c
5 files changed
+136 -90

No files matched your search

+22 -9
View File
@@ -19,6 +19,7 @@ from loader_game.case import Case
from loader_game.difficulty import DEFAULT_DIFFICULTY, DIFFICULTIES, by_key
from loader_game.game import Game, HandleResult, State
from loader_game.input_map import Action
from loader_game.intro import StartSequence, Tutorial
from loader_game.menu import DifficultyMenu
from loader_game.sayings import saying_for
from loader_game.sequences import CaseSpec, load_sequences, parse_sequences
@@ -485,7 +486,7 @@ class SequenceChoiceTests(unittest.TestCase):
class RenderTests(unittest.TestCase):
"""Rendert je ein Bild von Intro, Menü und Spiel (ohne Fenster).
"""Rendert je ein Bild von Anleitung, Startsequenz, Menü und Spiel (ohne Fenster).
Fängt fehlende config-Konstanten und Zeichenfehler ab, die reine
Logiktests nicht bemerken.
@@ -519,15 +520,27 @@ class RenderTests(unittest.TestCase):
rng=random.Random(3),
)
def test_intro_renders(self) -> None:
from loader_game.intro import Intro
def test_tutorial_renders_and_waits(self) -> None:
tutorial = Tutorial(self.assets)
tutorial.draw(self.surface)
# Das Tutorial zeigt nur das Bild und wartet - keine Startsequenz.
self.assertFalse(tutorial.update(1 / 60))
self.assertFalse(tutorial.update(1 / 60))
tutorial.handle(Action.PRIMARY)
self.assertTrue(tutorial.update(1 / 60))
intro = Intro(self.assets, show_instruction=True)
intro.draw(self.surface)
intro.handle(Action.PRIMARY)
for _ in range(200):
intro.update(1 / 60)
intro.draw(self.surface)
def test_start_sequence_renders_and_finishes(self) -> None:
start = StartSequence(self.assets)
start.draw(self.surface)
elapsed = 0.0
while not start.update(0.05) and elapsed < 10:
elapsed += 0.05
expected = (
len(config.INTRO_DOT_COLORS) * config.INTRO_DOT_DELAY
+ config.INTRO_ZIP_DURATION
)
self.assertAlmostEqual(elapsed, expected, delta=0.3)
start.draw(self.surface)
def test_menu_renders(self) -> None:
menu = DifficultyMenu(self.assets, selected=DIFFICULTIES[0])