From 7f590a6f74983b3f938a27dec23505e5bafab735 Mon Sep 17 00:00:00 2001 From: Project Bridge Date: Sun, 1 Nov 2026 12:22:08 +0000 Subject: [PATCH] v1.4: Tempo erhoeht - Normal 740 px/s (+30%), Hard 1080 (+50%), Easy unveraendert. Snap-Fenster 160->200 px, damit genug Zeit fuer Befehle bleibt. 57 Tests gruen. --- README.md | 3 ++- docs/ANALYSE.md | 6 ++++++ loader_game/config.py | 3 ++- loader_game/difficulty.py | 15 +++++++++++---- tests/test_logic.py | 14 +++++++++++--- 5 files changed, 32 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index af4a8ee..b3b7f1c 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,8 @@ starten (beim ersten Mal ggf. Rechtsklick → Öffnen wegen Gatekeeper). ## Ablauf 1. **Tutorialbild** (jede Runde, auch nach einem Ergebnis) – weiter mit A / Space -2. **Stufenauswahl**: Easy / Normal / Hard (Hard = Tempo des Altstands) +2. **Stufenauswahl**: Easy / Normal / Hard – Einlauf 420 / 740 / 1080 Pixel pro Sekunde, + gebremst 140 / 250 / 360. Das Zeitfenster für Befehle ist in allen Stufen gleich gross. 3. **Ampel-Start** (rot/gelb/grün + Reissverschluss), dann läuft die Runde 4. **Ergebnis**: Stufe, Prozent und ein Spruch – dazu **10 Sekunden Cooldown**, damit man nicht versehentlich weiterspringt. Danach startet A eine neue diff --git a/docs/ANALYSE.md b/docs/ANALYSE.md index 3b7f49e..82ab53b 100644 --- a/docs/ANALYSE.md +++ b/docs/ANALYSE.md @@ -121,3 +121,9 @@ Runde: ``` ANLEITUNG → MODUSWAHL → STARTSEQUENZ → SPIEL → ABSCHLUSS (10 s) → ANLEITUNG → … ``` + +## 9. Tempo nachgezogen (v1.4) + +| Rückmeldung | Umsetzung | +| --- | --- | +| „Normal und Hard sind zu einfach, aber die Zeit für die Befehle soll bleiben" | Tempo erhöht: Normal 570 → **740** px/s (+30 %), Hard 720 → **1080** px/s (+50 %), Easy unverändert 420. Gebremst entsprechend 250 bzw. 360 px/s. Damit die Reaktionszeit nicht mitschrumpft, wurde das Snap-Fenster von 160 auf **200 px** vergrössert: rund 1,4 s (Easy), 0,8 s (Normal) und 0,55 s (Hard) zwischen „Befehl möglich" und Barriere. | diff --git a/loader_game/config.py b/loader_game/config.py index dba2e7d..48c792b 100644 --- a/loader_game/config.py +++ b/loader_game/config.py @@ -71,7 +71,8 @@ MAX_UNITS_H = 3 # Ab dieser Entfernung zur Barriere wird abgebremst – früh, damit man Zeit hat. FAST_TO_SLOW_DISTANCE = 260 # Ab dieser Entfernung darf eingerastet/gedreht/gestapelt werden. -SNAP_WINDOW = 160 +# 200 px ergeben je nach Stufe rund 1,4 s (Easy), 0,8 s (Normal) und 0,55 s (Hard). +SNAP_WINDOW = 200 # Lücke, die nach einer Kollision (ohne Einrasten) entsteht – Strafe bleibt wie bisher. FAIL_GAP = 60 PLATFORM_TOLERANCE = 5 # Toleranz für "bündig an der Barriere" diff --git a/loader_game/difficulty.py b/loader_game/difficulty.py index 4907b4c..a3be483 100644 --- a/loader_game/difficulty.py +++ b/loader_game/difficulty.py @@ -1,7 +1,14 @@ """Schwierigkeitsstufen: wie schnell die Koffer einlaufen. -``hard`` entspricht dem Tempo des Altstands (6 bzw. 2 Pixel pro Frame bei -120 fps = 720 bzw. 240 Pixel pro Sekunde). +Referenz: der Altstand lief mit 6 bzw. 2 Pixeln pro Frame bei 120 fps, also +720 bzw. 240 Pixel pro Sekunde. Das ist die Basis, von der aus skaliert wird: + +* **Easy** – 0,58× so schnell wie der Altstand (zum Einsteigen) +* **Normal** – 1,3× so schnell wie der Altstand +* **Hard** – 1,5× so schnell wie der Altstand + +Das Zeitfenster für die Befehle (Einrasten/Drehen/Stapeln) steht in +``config.SNAP_WINDOW`` und ist für alle Stufen gleich gross. """ from __future__ import annotations @@ -24,8 +31,8 @@ class Difficulty: DIFFICULTIES: tuple[Difficulty, ...] = ( Difficulty("easy", "Easy", speed_fast=420.0, speed_slow=140.0), - Difficulty("normal", "Normal", speed_fast=570.0, speed_slow=190.0), - Difficulty("hard", "Hard", speed_fast=720.0, speed_slow=240.0), + Difficulty("normal", "Normal", speed_fast=740.0, speed_slow=250.0), + Difficulty("hard", "Hard", speed_fast=1080.0, speed_slow=360.0), ) DEFAULT_DIFFICULTY: Difficulty = DIFFICULTIES[1] diff --git a/tests/test_logic.py b/tests/test_logic.py index cbb4264..dece00b 100644 --- a/tests/test_logic.py +++ b/tests/test_logic.py @@ -85,9 +85,17 @@ class DifficultyTests(unittest.TestCase): self.assertEqual([d.key for d in DIFFICULTIES], ["easy", "normal", "hard"]) self.assertEqual([d.label for d in DIFFICULTIES], ["Easy", "Normal", "Hard"]) - def test_hard_matches_old_game_speed(self) -> None: - hard = by_key("hard") - self.assertEqual((hard.speed_fast, hard.speed_slow), (720.0, 240.0)) + def test_speeds_match_the_requested_levels(self) -> None: + self.assertEqual( + [(d.speed_fast, d.speed_slow) for d in DIFFICULTIES], + [(420.0, 140.0), (740.0, 250.0), (1080.0, 360.0)], + ) + # Gegenüber der ersten Fassung (Normal 570, Hard 720): + # Normal ~30 % schneller, Hard ~50 % schneller + self.assertAlmostEqual(by_key("normal").speed_fast / 570.0, 1.30, delta=0.02) + self.assertAlmostEqual(by_key("hard").speed_fast / 720.0, 1.50, delta=0.02) + self.assertAlmostEqual(by_key("normal").speed_slow / 190.0, 1.30, delta=0.02) + self.assertAlmostEqual(by_key("hard").speed_slow / 240.0, 1.50, delta=0.02) def test_speeds_increase_with_difficulty(self) -> None: fast = [d.speed_fast for d in DIFFICULTIES]