This commit is contained in:
team3
2026-09-07 17:38:17 +02:00
parent 6478559252
commit 2a9ab4c7da
11 changed files with 521 additions and 125 deletions

View File

@@ -1,6 +1,6 @@
# Liar's Dice 3D
Würfel-Bluffspiel in Godot 4.7 mit echter 3D-Physik, Host/Client-Multiplayer,
Würfel-Bluffspiel in Godot 4.7 mit echter 3D-Physik, Mehrspieler über Raum-Codes,
KI-Bots und einem Booster-System aus Buffs und Debuffs.
## Starten
@@ -11,14 +11,50 @@ Das Startmenü hat drei Punkte:
* **Einzelspieler** – nur die Bot-Anzahl (1–7) einstellen und starten. Es wird
kein Netzwerk geöffnet.
* **Mehrspieler** – Name, Server-IP und Bot-Anzahl. **Spiel hosten** öffnet
einen Server auf Port 8910, **Beitreten** verbindet sich mit der eingetragenen
IP. Der Host startet die Partie, sobald mindestens 2 Teilnehmer zusammen
sind (Menschen und Bots zusammengezählt, maximal 8).
* **Mehrspieler** – nur den Namen eintragen, dann **Hosten** oder
**Beitreten**. Hosten führt direkt in die Lobby; dort steht der Code.
Beitreten fragt zuerst nach dem Code. Niemand braucht eine IP oder eine
Portfreigabe.
* **Lobby** – zeigt den Code, wer schon da ist und die Bot-Anzahl. Nur der
Host stellt die Bots ein und startet, sobald mindestens 2 Teilnehmer
zusammen sind (Menschen und Bots zusammengezählt, maximal 8).
* **Beenden** – schließt das Spiel.
Zum Testen auf einem Rechner: eine Instanz hostet, weitere Instanzen verbinden
sich auf `127.0.0.1`.
## Mehrspieler: wie es zusammenhängt
Die Partie läuft nicht mehr beim Host, sondern auf `pirate-dice.marha.de`:
Spieler ──HTTPS──> Matchmaker ──startet──> Raum (godot --headless, UDP-Port)
Spieler ──UDP────> Raum
* Der **Matchmaker** (`server/matchmaker.py`) vergibt Codes wie `K7QM` und
startet je Raum einen eigenen headless Godot-Prozess auf einem Port aus
8911–8940. `POST /api/raum` legt an, `GET /api/raum/<code>` schlägt nach.
* Ein **Raum** ist Peer 1 und damit die Autorität, sitzt aber nicht mit am
Tisch (`local_seat` bleibt −1, kein HUD). Ohne Spieler beendet er sich nach
zwei Minuten von selbst, dann ist der Code wieder frei.
* Der **Host** ist der erste Spieler im Raum. Geht er, rückt der nächste
nach. Nur er darf starten (`Net.request_start`).
Gemessen je Raum: 51 MB Speicher zusätzlich, ~1 % eines Kerns im Leerlauf,
kurze Spitzen beim Würfelwurf.
## Lokal entwickeln
make matchmaker # Matchmaker auf :8020, legt Räume als Prozesse an
make dev # Spiel, zeigt auf den lokalen Matchmaker
Ohne `PIRATE_DICE_SERVER` zeigt das Spiel auf `pirate-dice.marha.de`. Einen
einzelnen Raum ohne Matchmaker gibt es mit `make server` (Port 8910).
## Auf dem Server
make prod # kopiert das Godot-Binary, baut, startet
make logs
make down
Die HTTP-Schnittstelle läuft hinter Traefik auf `pirate-dice.marha.de`. Die
Raum-Ports 8911–8940/UDP gehen direkt nach aussen – Traefik kann kein UDP.
Das Spiel startet im Vollbild, **F11** schaltet um. **Esc** öffnet ein Menü mit
*Fortsetzen* und *Verlassen*; im Einzelspieler hält es das Spiel samt Zeitlimit