132 lines
4.5 KiB
Markdown
132 lines
4.5 KiB
Markdown
# 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.
|