first commit
This commit is contained in:
119
README.md
Normal file
119
README.md
Normal file
@@ -0,0 +1,119 @@
|
||||
# Liar's Dice 3D
|
||||
|
||||
Würfel-Bluffspiel in Godot 4.7 mit echter 3D-Physik, Host/Client-Multiplayer,
|
||||
KI-Bots und einem Booster-System aus Buffs und Debuffs.
|
||||
|
||||
## Starten
|
||||
|
||||
godot --path . # oder das Projekt im Godot-Editor öffnen
|
||||
|
||||
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).
|
||||
* **Beenden** – schließt das Spiel.
|
||||
|
||||
Zum Testen auf einem Rechner: eine Instanz hostet, weitere Instanzen verbinden
|
||||
sich auf `127.0.0.1`.
|
||||
|
||||
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
|
||||
wirklich an, im Mehrspieler läuft die Runde weiter – sonst würde ein geöffnetes
|
||||
Menü alle anderen am Tisch blockieren.
|
||||
|
||||
Die Bildaufteilung: Tisch mittig, aktuelles Gebot oben mittig, Würfel aller
|
||||
Spieler oben rechts, Verlauf unten links, Ansage unten rechts.
|
||||
|
||||
Augenzahlen werden überall als gezeichnete Würfel dargestellt (`DieIcon` in
|
||||
`hud.gd`), unbekannte Werte als Würfel mit Fragezeichen. Im Panel oben rechts
|
||||
stehen deshalb deine eigenen Würfel offen, gegnerische verdeckt – bis auf die
|
||||
per *Spähen* aufgedeckten und beim Aufdecken am Rundenende.
|
||||
|
||||
Der Tisch wächst mit der Spielerzahl, damit die Würfelzonen auch bei acht
|
||||
Plätzen nicht aneinanderstoßen. Die Kamera schaut mit 15° Neigung fast senkrecht
|
||||
von oben darauf; der eigene Platz liegt unten im Bild. `_frame_camera` in
|
||||
`table.gd` rechnet den Abstand so aus, dass der Tisch genau das freie Band
|
||||
zwischen den HUD-Feldern ausfüllt (`HUD_TOP`/`HUD_BOTTOM`) – bei jeder
|
||||
Spielerzahl und jedem Fensterformat, auch nach dem Ändern der Fenstergröße.
|
||||
|
||||
## Physik und Bildrate
|
||||
|
||||
Zwei Engine-Vorgaben sind bewusst gesetzt, beide in `project.godot`:
|
||||
|
||||
* **`3d/physics_engine="Jolt Physics"`** – GodotPhysics3D hat Kontakt-Toleranzen,
|
||||
die auf meterhohe Objekte ausgelegt sind (`contact_max_separation` 0.05 bei
|
||||
0.075 Würfel-Halbkante). Würfel dieser Größe sanken dadurch in die Tischplatte
|
||||
ein und rollten endlos weiter, sodass jeder Wurf in den Settle-Timeout lief.
|
||||
Mit Jolt liegt die Wurfphase bei rund 0,9 s statt 7 s.
|
||||
* **`renderer/rendering_method="mobile"`** – auf integrierten GPUs kostet
|
||||
Forward+ hier mehr als das Doppelte: 22 statt 47 fps bei 30 Würfeln.
|
||||
|
||||
Ein Würfel ist ein einziges Renderobjekt: Körper und Augen stecken in einem
|
||||
gemeinsamen Mesh mit Vertexfarben, statt 21 Augen als eigene Meshes zu hängen.
|
||||
|
||||
Weil Kamera und Deckenlicht beide fast senkrecht stehen, liegt der Glanzpunkt
|
||||
genau auf der Würfeloberseite. Mit glänzendem Material und starkem Spot klippte
|
||||
die weiße Fläche bei 255 und riss die schwarzen Augen mit hoch – gemessen lag
|
||||
kein einziger Punkt-Pixel unter Luminanz 150. Deshalb ist das Würfelmaterial
|
||||
matt (`roughness` 0.9, `metallic_specular` 0.0) und der Spot schwächer
|
||||
zugunsten von mehr Umgebungslicht; der Kontrast Auge zu Körper liegt damit bei
|
||||
rund 11:1.
|
||||
|
||||
## Regeln
|
||||
|
||||
Klassisches Liar's Dice ohne Joker. Jeder startet mit 5 Würfeln und sieht nur
|
||||
die eigenen.
|
||||
|
||||
1. **Würfeln** – alle Würfel fallen physikalisch in den eigenen Becher.
|
||||
2. **Boost wählen** – jeder bekommt 3 zufällige Booster angeboten und wählt
|
||||
einen; er wirkt nur für die laufende Runde.
|
||||
3. **Ansagen** – reihum wird ein Gebot "Anzahl x Augenzahl" über alle Würfel
|
||||
am Tisch gemacht. Jedes Gebot muss höher sein: mehr Würfel, oder gleich
|
||||
viele bei höherer Augenzahl.
|
||||
4. **Anfechten** – statt zu erhöhen kann man das Vorgebot anzweifeln. Alle
|
||||
Becher werden gehoben und gezählt: Stimmt das Gebot, verliert der
|
||||
Anfechter einen Würfel, sonst der Bieter.
|
||||
|
||||
Für Boosterwahl und Ansage hat man jeweils **30 Sekunden**; die Restzeit steht
|
||||
im Booster-Fenster beziehungsweise neben „Deine Ansage" und wird unter zehn
|
||||
Sekunden rot. Läuft die Zeit ab, entscheidet der Host automatisch – beim Booster
|
||||
zufällig, beim Gebot mit der Bot-Logik. Ohne dieses Limit würde ein abwesender
|
||||
oder getrennter Mitspieler den ganzen Tisch dauerhaft blockieren.
|
||||
|
||||
Wer keine Würfel mehr hat, scheidet aus. Der Letzte gewinnt.
|
||||
|
||||
## Booster
|
||||
|
||||
| Booster | Art | Wirkung |
|
||||
|---|---|---|
|
||||
| Neuwurf | Buff | Alle eigenen Würfel neu werfen |
|
||||
| Feinschliff | Buff | Einen gewählten eigenen Würfel neu werfen |
|
||||
| Glücksgriff | Buff | Ein gewählter Würfel wird zur 6 |
|
||||
| Zwilling | Buff | Ein anderer eigener Würfel nimmt den Wert des gewählten an |
|
||||
| Spähen | Buff | Von jedem Gegner wird ein zufälliger Würfel aufgedeckt |
|
||||
| Rütteln | Debuff | Jeder Gegner wirft einen zufälligen Würfel neu |
|
||||
| Absenken | Debuff | Bei jedem Gegner sinkt ein zufälliger Würfel um 1 |
|
||||
| Nebel | Debuff | Jeder Gegner sieht einen eigenen Würfel nicht mehr |
|
||||
| Störfeuer | Debuff | Gegner müssen diese Runde um mindestens 2 erhöhen |
|
||||
| Maulkorb | Debuff | Der nächste Spieler muss bieten und darf nicht anfechten |
|
||||
|
||||
## Aufbau
|
||||
|
||||
| Datei | Inhalt |
|
||||
|---|---|
|
||||
| `scripts/net.gd` | Autoload: ENet-Host/Client, Lobby, Spielstart |
|
||||
| `scripts/boosters.gd` | Autoload: Booster-Katalog |
|
||||
| `scripts/game.gd` | Spiellogik (host-autoritativ), RPCs, Zustandsabgleich |
|
||||
| `scripts/table.gd` | Aufbau der 3D-Szene: Tisch, Würfelzonen, Becher, Kamera |
|
||||
| `scripts/die.gd` | Physik-Würfel, Ablesen der Augenzahl aus der Ruhelage |
|
||||
| `scripts/ai.gd` | Bot-Entscheidungen (Binomialabschätzung für Gebot/Anfechtung) |
|
||||
| `scripts/hud.gd` | Spiel-UI |
|
||||
| `scripts/menu.gd` | Startmenü und Lobby |
|
||||
|
||||
Die gesamte Spiellogik und die Würfelphysik laufen beim Host. Clients erhalten
|
||||
nur ihre eigenen Würfel als Transform-Stream, gegnerische Werte erst beim
|
||||
Aufdecken – Mitlesen fremder Würfel ist damit nicht möglich.
|
||||
Reference in New Issue
Block a user