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.
Voraussetzungen
- Python 3.10 oder neuer (getestet: 3.12)
- macOS oder Linux – sonst nichts.
pygamebringt SDL2 selbst mit, Kamera-, Brew- oder Systembibliotheken werden nicht gebraucht.
Start
./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):
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
.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
- Namenseingabe direkt am Controller (Buchstabe für Buchstabe, alternativ
Tastatur) – ersetzt QR-Scanner und
last_user.txt. - Mehrere Durchgänge ohne Neustart des Programms (zurück zur Namenseingabe).
- Entscheiden, ob und wohin die Punkte gesendet werden.