83 lines
5.4 KiB
Markdown
83 lines
5.4 KiB
Markdown
# Dinger
|
||
|
||
Kartenspiel in 2D (Godot 4.7): du und 1 bis 5 KI-Magier, jeder gegen jeden, alle mit denselben Regeln.
|
||
|
||
## Starten
|
||
|
||
Projektordner in Godot öffnen und auf „Play" drücken, oder im Terminal:
|
||
|
||
```
|
||
./start.sh # Linux/macOS (start.bat unter Windows); Godot 4.7 muss als `godot` im Pfad liegen
|
||
godot --path . # wenn das Projekt schon einmal importiert wurde
|
||
```
|
||
|
||
Frisch geklont fehlt das Verzeichnis `.godot` mit Godots Import-Cache. Die Startskripte holen den Import
|
||
beim ersten Start nach; alternativ das Projekt einmal im Godot-Editor öffnen oder
|
||
`godot --headless --path . --import` ausführen.
|
||
|
||
Der Spielstand liegt unter `user://spielstand.json`
|
||
(Linux: `~/.local/share/godot/app_userdata/Dinger/spielstand.json`).
|
||
|
||
## Spielsysteme
|
||
|
||
- 77 Karten in `data/karten.json`, alle Wesen, jede mit genau einem der vier Elemente; Kombos entstehen erst im Spiel (Verschmelzen, Feldkombos)
|
||
- Kein Deck und keine Starthand: jeder hat einen eigenen Laden mit fünf Angeboten. Kaufen kostet Mana, Ausspielen nichts, neu würfeln kostet 1 Mana
|
||
- Mana wächst um 1 je Zug (bis 10) und bleibt liegen, wenn du es nicht ausgibst — sparen ist eine echte Entscheidung
|
||
- Der Laden zeigt nur Karten, die höchstens dein Einkommen plus eins kosten: teure Wesen tauchen erst später auf
|
||
- Jede Karte gehört jedem von Anfang an. Gesammelt wird die Seltenheitsstufe, und die ist reine Optik: sie ändert weder Werte noch Text
|
||
- Booster (100 Münzen): fünf gewürfelte Stufen, höhere werten die Karte auf, der Rest wird zu Staub. Staub wertet gezielt auf, eine Stufe abgeben bringt Staub zurück
|
||
- Resonanz: gleiche Elemente auf dem Feld verstärken sich (+1, +2, +3, +3)
|
||
- Feldkombos: ein neues Wesen neben einem Wesen mit anderem Element löst einen Effekt aus
|
||
- Karteneffekte lösen beim Ausspielen aus (Schaden, Einfrieren, Heilen, Zurückwerfen, Verstärken, Schild, Mana); Kartenvorteil ist hier Manavorteil
|
||
- Elementvorteil im Kreis (Wasser > Feuer > Luft > Erde > Wasser): 1 Schaden mehr im Vorteil, 1 weniger im Nachteil, auch für Karteneffekte gegen Wesen
|
||
- Gemeinsames Feld: vier gespielte Karten eines Elements kippen es (Vulkan, Flut, Fels, Wirbel), Wesen dieses Elements bekommen +1 Angriff
|
||
- Verschmelzen: zwei eigene Wesen werden eins (Elemente und Schlüsselwörter beider, Werte Durchschnitt plus 1, Kosten der Durchschnitt der Karten); drei oder mehr Elemente ergeben eine Chimäre
|
||
- Jeder gegen jeden mit ausgeloster Zugreihenfolge, 1 bis 5 KI-Gegner; die Hand fasst 8 Karten, das Feld 5 Wesen
|
||
- Schwierigkeit Leicht/Normal/Schwer: Gegner mit 25/30/35 Leben, einfache oder Vorausschau-KI, Münzen 0,75/1/1,5-fach
|
||
- KI mit Vorausschau in zwei Stufen und Zeitbudget (150 ms), sie rechnet im Hintergrund-Thread
|
||
- Kampagne: drei Kapitel mit je zehn Magiern, Bosse mit ein bis drei Merkmalen, eigenes Merkmal nach Kapitel 1
|
||
- Netzwerkspiel im lokalen Netz: Host führt das Spiel, Mitspieler sehen nur ihre Hand, Zuschauer keine. Fällt der Host aus, übernimmt der Mitspieler mit der kleinsten Kennung, die anderen verbinden neu (Platz bleibt 60 s frei)
|
||
- Unterbrochene Einzelspieler-Kämpfe (auch Kampagne) werden laufend gespeichert und lassen sich im Menü fortsetzen
|
||
- Spielstand versioniert mit Sicherungskopie (`spielstand.json.bak`)
|
||
- Oberfläche und Kartentexte wahlweise auf Englisch (`translations/ui.csv`, `name_en` in `data/karten.json`)
|
||
- Gamepad in Menü, Sammlung, Booster und Kampf; große Schrift und Animationen in den Einstellungen
|
||
|
||
## Tests
|
||
|
||
`tests/run_headless.sh` führt Import, statische Prüfung (`tests/lint.gd`) und Headless-Prüfungen aus. `.github/workflows/tests.yml`:
|
||
Headless und schneller Fenster-Test bei jedem Push, voller Fenster-Test nachts um 3 Uhr oder von Hand (Xvfb, lokal nicht geprüft).
|
||
`DINGER_FAST=1` lässt den Fenster-Test ohne die langen Kämpfe laufen (etwa ein Drittel der Zeit).
|
||
|
||
```
|
||
godot --headless --path . --import # einmalig nach dem Klonen: Ressourcen importieren
|
||
godot --headless --path . -s tests/test_runner.gd # Regeln, KI, Booster, Spielstand
|
||
godot --headless --path . -s tests/simulate.gd # Balance: KI spielt gegen KI
|
||
DINGER_SHOTS=/tmp/shots godot --path . tests/ui_test.tscn # Oberfläche mit Fenster und Screenshots
|
||
DINGER_ONLY=test_sammlung godot --path . tests/ui_test.tscn # nur einzelne Oberflächentests
|
||
DINGER_NETZ=1 godot --path . tests/ui_test.tscn # zusätzlich die langsamen Netzwerktests (Bot-Prozesse)
|
||
godot --headless --path . -s tests/perf_probe.gd # Laufzeiten: KI-Entscheidung, Ladenangebot, Musik
|
||
godot --path . tests/frame_probe.tscn # Bildzeiten im Kampf mit 5 Gegnern
|
||
```
|
||
|
||
## Export
|
||
|
||
Export-Vorlagen für Godot 4.7 installieren (Editor: Editor → Export-Vorlagen verwalten), dann:
|
||
|
||
```
|
||
godot --headless --path . --export-release Linux build/dinger-linux.x86_64
|
||
godot --headless --path . --export-release Windows build/dinger-windows.exe
|
||
```
|
||
|
||
## Aufbau
|
||
|
||
- `scripts/cards.gd` – Elemente, Kombos, Kartenklassen; Pool aus `data/karten.json`
|
||
- `scripts/game.gd` – Spielregeln, Züge, Kampf, Feldkombos, Resonanz, Feld, Verschmelzen
|
||
- `scripts/deckgen.gd` – Ladenangebot und Gegner
|
||
- `scripts/netstate.gd` – Zustandsbilder fürs Netzwerk
|
||
- `scripts/ai.gd` – KI mit Vorausschau (plus gierige Vergleichs-KI)
|
||
- `scripts/profile.gd` – Spielstand (versioniert), Sammlung, Booster, Einstellungen
|
||
- `scripts/campaign.gd` – Kampagnenstufen
|
||
- `scenes/main.tscn` – Startszene
|
||
- `scripts/net.gd` – Netzwerkspiel (ENet) mit Wiederverbinden
|
||
- `translations/ui.csv` – englische Oberflächentexte
|