Files
Habegger_loader_game/README.md
T

139 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Habegger Trailer Load
Kofferlager-Spiel für Messe-/Eventbetrieb: Koffer laufen von rechts ein und
müssen im Auflieger möglichst dicht gestapelt werden. Angezeigt wird am Ende
die Stufe und die erreichte Beladung in Prozent.
Neu aufgesetzt für macOS (Apple Silicon) mit Controller-Unterstützung.
Die Analyse des Altstands und die Liste der behobenen Fehler stehen in
[`docs/ANALYSE.md`](docs/ANALYSE.md).
## Voraussetzungen
* Python 3.10 oder neuer (getestet: 3.12)
* macOS oder Linux – sonst nichts. `pygame` bringt SDL2 selbst mit,
Kamera-, Brew- oder Systembibliotheken werden **nicht** gebraucht.
## Start
```bash
./run.sh # Fenster
./run.sh --fullscreen # Vollbild (Eventbetrieb)
```
`run.sh` legt beim ersten Start `.venv/` an und installiert `requirements.txt`
automatisch. Ändert sich `requirements.txt`, wird neu installiert.
Auf macOS lässt sich das Spiel auch per Doppelklick auf **`run.command`**
starten (beim ersten Mal ggf. Rechtsklick → Öffnen wegen Gatekeeper).
| Option | Bedeutung |
| --- | --- |
| `--fullscreen` | Vollbild starten (F11 schaltet jederzeit um) |
| `--seed 42` | feste Zufallsfolge, reproduzierbare Koffer-Sequenzen |
| `--smoke 10` | Selbsttest: spielt 10 s ohne Eingaben und beendet sich |
## Ablauf
1. **Tutorialbild** (jede Runde, auch nach einem Ergebnis) – weiter mit A / Space
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
Runde (wieder ab Punkt 1).
Beendet wird ausschliesslich mit **Esc** (Controller: B).
Beim Start jeder Runde steht im Terminal, welche Sequenz gezogen wurde, z. B.:
```
Runde 1: Sequenz 4/6 (16 Koffer, Start: 3x2, 3x1, 2x2, 2x1, 4x2 …), Stufe Normal
Runde 2: Sequenz 3/6 (19 Koffer, Start: 4x2, 4x1, 3x1, 2x1, 1x1 …), Stufe Normal
```
Dieselbe Sequenz kommt nie zweimal direkt hintereinander.
## Steuerung
| Aktion | Tastatur | Controller (Xbox-Layout) |
| --- | --- | --- |
| Stufe wählen | `←` / `→` | D-Pad links/rechts |
| Bestätigen / Einrasten an der Barriere | `Space` / `Enter` | A |
| Koffer drehen (wenn er passt) | `←` | X / D-Pad links |
| Auf einen Koffer obendrauf setzen | `↑` | Y / D-Pad hoch |
| Beenden | `Esc` | B |
| Vollbild umschalten | `F11` | – |
Ein gedrehter Koffer behält seine Grafik – er wird nur um 90° gedreht
gezeichnet, nie durch eine andere Textur ersetzt.
## Projektstruktur
```
main.py Einstiegspunkt (Phasen: Anleitung → Moduswahl → Start → Spiel)
run.sh / run.command Start inkl. venv + Installation
requirements.txt pygame
case_sequences.txt Koffersequenzen (Datenbestand)
loader_game/
config.py Masse, Farben, Texte, Pfade
difficulty.py Stufen Easy/Normal/Hard (Tempo)
assets.py Bilder/Sounds/Fonts laden und cachen
sequences.py Einlesen und Validieren der Sequenzdatei
case.py Koffer: Geometrie, Textur, Bewegung
trailer.py Stapelregeln im Auflieger (reine Logik)
sayings.py Sprüche zum Ergebnis (nach Prozent gestuft)
input_map.py Tastatur/Controller → Action
scene.py Zeichnen
menu.py Stufenauswahl
intro.py Anleitungsbild (Tutorial) + Startsequenz (Ampel, Reissverschluss)
game.py Zustandsmaschine einer Runde
tests/test_logic.py 56 Tests (ohne Fenster)
docs/ANALYSE.md Analyse Altstand + Fehlerliste
old_version/ eingefrorener Altstand (nicht versioniert)
```
## Konfiguration
Alle Werte stehen in `loader_game/config.py` (Layout, Farben, Texte, Tempo der
Animationen) und `loader_game/difficulty.py` (Einlaufgeschwindigkeit der drei
Stufen). Gezeichnet wird immer in der virtuellen Auflösung 1920×1080;
`pygame.SCALED` skaliert automatisch auf die tatsächliche Fenstergrösse
(Retina, 1440×900, 4K …).
## Sequenzdatei
`case_sequences.txt`: Sequenzen durch Leerzeilen getrennt, pro Zeile ein
Koffer als `breite,höhe,rotiert` in Einheiten von 100×100 Pixeln.
`rotiert=True` dreht den Koffer beim Einlaufen um 90°.
```
3,1,False
1,2,True # effektiv 2 Einheiten breit, 1 hoch
```
Ungültige Zeilen werden beim Start mit Meldung übersprungen.
## Tests
```bash
.venv/bin/python -m unittest discover -s tests -v
```
Getestet werden Sequenz-Parsing, Layout-Invarianten, Kofferbewegung
(inkl. Stufen-Tempo), Stapelregeln, Menü-Navigation, komplette Spieldurchläufe
bis zum Ergebnis sowie das Rendern von Anleitung, Startsequenz, Menü, Spiel und Ergebnis.
Kein Fenster, kein Ton nötig.
## Eingefrorener Altstand
`old_version/` enthält die Dateien vor dem Umbau – in `.gitignore`, also
**nicht** versioniert. Details: `old_version/FROZEN.md`.
## Nächste Schritte
1. Namenseingabe direkt am Controller (Buchstabe für Buchstabe, alternativ
Tastatur) – falls wieder eine Personalisierung gewünscht ist.
2. Entscheiden, ob und wohin Ergebnisse gesendet werden (Punkteliste ist
derzeit bewusst nicht vorhanden).