Files
Habegger_loader_game/README.md
T

132 lines
4.5 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. Ziel ist eine hohe
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).
Optionen:
| Option | Bedeutung |
| --- | --- |
| `--fullscreen` | Vollbild starten (F11 schaltet jederzeit um) |
| `--name "Anna"` | Spielername setzen (sonst der zuletzt gespeicherte) |
| `--seed 42` | feste Zufallsfolge, reproduzierbare Koffer-Sequenzen |
| `--smoke 10` | Selbsttest: bestätigt das Intro automatisch, spielt 10 s ohne Eingaben und beendet sich |
## Steuerung
| Aktion | Tastatur | Controller (Xbox-Layout) |
| --- | --- | --- |
| 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 |
| Spiel beenden | `Esc` | B |
| Vollbild umschalten | `F11` | – |
Stick und D-Pad werden beide ausgewertet, Controller-Hotplug funktioniert
(der Name des erkannten Controllers steht beim Start im Terminal).
## Projektstruktur
```
main.py Einstiegspunkt (Fenster, Hauptschleife, CLI)
run.sh / run.command Start inkl. venv + Installation
requirements.txt pygame
case_sequences.txt Koffersequenzen (Datenbestand)
loader_game/
config.py Masse, Tempi, Farben, Texte, Pfade
assets.py Bilder/Sounds/Fonts laden und cachen
sequences.py Einlesen und Validieren der Sequenzdatei
case.py Koffer: Geometrie und Einlaufbewegung
trailer.py Stapelregeln im Auflieger (reine Logik)
input_map.py Tastatur/Controller → Action
scene.py Zeichnen
intro.py Tutorialbild, Ampel, Reissverschluss
game.py Zustandsmaschine des Spiels
storage.py Laufzeitdaten (letzter Spielername)
net.py optionaler Punkte-Upload
tests/test_logic.py 35 Tests (ohne Fenster)
docs/ANALYSE.md Analyse Altstand + Fehlerliste
old_version/ eingefrorener Altstand (nicht versioniert)
runtime/ Laufzeitdaten (nicht versioniert)
```
## Konfiguration
Alle Werte stehen in `loader_game/config.py` – Auflösung, Bänder, Auflieger,
Tempo, Farben, Texte. Gezeichnet wird immer in der virtuellen Auflösung
1920×1080; `pygame.SCALED` skaliert automatisch auf die tatsächliche
Fenstergrösse (Retina, 1440×900, 4K …).
Punkte-Upload (standardmässig aus):
```bash
export HAG_SCORE_URL="https://…/api/submit_points.php"
export HAG_SCORE_API_KEY="…"
```
Zugangsdaten gehören in die Umgebung, **nicht** in den Quellcode.
## 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,
Stapelregeln, komplette Spieldurchläufe (bis Spielende) und die
Laufzeitdaten. Kein Fenster, kein Ton nötig.
## Laufzeitdaten
`runtime/` (in `.gitignore`): zuletzt verwendeter Spielername. Per
`HAG_RUNTIME_DIR` umlenkbar (nutzen die Tests).
## Eingefrorener Altstand
`old_version/` enthält die Dateien vor dem Umbau – ebenfalls in `.gitignore`,
also **nicht** versioniert. Details: `old_version/FROZEN.md`.
## Nächste Schritte
1. Namenseingabe direkt am Controller (Buchstabe für Buchstabe, alternativ
Tastatur) – ersetzt QR-Scanner und `last_user.txt`.
2. Mehrere Durchgänge ohne Neustart des Programms (zurück zur Namenseingabe).
3. Entscheiden, ob und wohin die Punkte gesendet werden.