5.4 KiB
5.4 KiB
Projektplan: Audiopoker (Bevy + Wasm)
Zielsetzung
Ein barrierefreies Multiplayer-Pokergame für blinde Spieler, das primär über Audio (TTS & SFX) bedient wird. Das Spiel wird via Webbrowser aufgerufen und auf WebAssembly kompiliert.
Technologie-Stack
- Engine: Bevy (Rust)
- Target: WebAssembly (Wasm)
- Networking: WebSockets für die Synchronisation des Spielzustands.
- Audio-Output: Web Speech API (via JS-Bindings) für Text-to-Speech,
bevy_audiofür Soundeffekte. - Input: Tastatur-zentrierte Steuerung (Tab/Space/Enter).
Modul-Struktur
core::logic: Reine Poker-Logik (Deck, Hand-Evaluation, Betting) ohne grafische Abhängigkeiten.core::network: Netzwerkprotokoll und WebSocket-Handhabung für Multiplayer-Synchronisation.audio::tts: Interface zur Web Speech API für dynamisches Sprechen von Spielereignissen.audio::sfx: Sound-Manager für atmosphärische Effekte (Chips, Karten mischen).ui_minimal: Minimalistische Darstellung, optimiert für Barrierefreiheit und geringen Ressourcenverbrauch.
Implementierungsphasen
Phase 1: Fundament & Core Logic (MVP)
- Projektstruktur aufsetzen (
Cargo.toml; Modul-Strukturcore/audiobereinigt und verdrahtet). - Poker Engine: Hand-Rankings (inkl. Wheel-Straight, 7-Karten-Bestbewertung), Deck-Shuffling/Draw und einfache Betting-Logik (Fold/Check/Call/Raise, All-In) implementiert und getestet.
- Audio-Grundlagen:
audio::ttsruft die Web Speech API korrekt an (SpeechSynthesisUtterance); auf nativen Targets Dummy-Ausgabe für Tests. - Bevy-
App-Grundgerüst aufgesetzt:AudiopokerPlugin(src/game_plugin.rs) verdrahtetcore::game/core::logicundaudioüber Bevy-Messages (Announce,PlaySfx) mitStartup/Update-Systemen. API-Stand: Bevy 0.19 (Message/MessageWriter/MessageReader/add_message, seit 0.17 getrennt von Observer-Events). Bitte lokal mitcargo check/cargo runverifizieren, da hier kein zu Bevy 0.19 passender Compiler zur Verfügung stand.
Projektstruktur (seit Phase 2: Cargo-Workspace)
core/(Libaudiopoker_core):logic,game,network- unverändert engine-unabhängig, jetzt von Client und Server genutzt.client/(Binaudiopoker_client): Bevy/Wasm, bisheriger Inhalt vonsrc/.server/(Binaudiopoker_server): neuer nativer WebSocket-Server (Tokio + tokio-tungstenite).
Phase 2: Networking & Multiplayer
- Server-Architektur:
server/src/table.rs(TableActor, Actor-Modell: ein Tokio-Task pro Tisch, kein geteilter Mutex für den Spielzustand) +server/src/lobby.rs(Tisch-Registry, legt Tische on-demand per Namen an).server/src/main.rsnimmt WebSocket-Verbindungen an (tokio-tungstenite) und verbindet sie mit dem passenden Tisch. - Netzwerkprotokoll:
core::network::{ClientMessage, ServerMessage}neu entworfen, sodass der Server dieselben Announce-/PlaySfx-"Häppchen" verschickt, die der lokale Client schon per TTS/SFX verarbeitet (GameManager::take_actionliefert sie direkt). Erhöhungsbeträge werden bewusst serverseitig festgelegt (kein clientseitig frei wählbarer Raise-Betrag). - Multiplayer-Lobby/Tischsuche (einfache Variante): Tischname im
JoinTabledient als Suchbegriff; unbekannte Namen legen automatisch einen neuen Tisch an. Kein Auflisten aller offenen Tische (ListTables) - falls gewünscht, wäre das die nächste Ausbaustufe. - Getestet:
cargo test -p audiopoker_core(10 Tests) und ein Ende-zu-Ende-Smoke-Test mit zwei echten WebSocket-Clients (Python) gegen den laufendenaudiopoker_serverliefen hier erfolgreich durch (kompletter Hand-Durchlauf Pre-Flop bis Showdown, korrekte Sieger-Ermittlung). - Client-Anbindung an den Server fehlt noch: Der Bevy-Client (
client/) spielt aktuell weiterhin nur lokal/offline (siehegame_plugin.rs, 2 fest verdrahtete Spieler). Die Anbindung perweb_sys::WebSocket(Feature ist inclient/Cargo.tomlschon vorbereitet) anaudiopoker_serverist der nächste sinnvolle Schritt. - Tisch-Übersicht/
ListTablesfür echte Tischsuche (aktuell nur "Name kennen und beitreten").
Phase 3: Audio Experience & UI
- TTS-Logik verfeinert:
GameManager::take_actionerzeugt kontextuelle Ansagen (Aktion des Spielers, Rundenwechsel inkl. aufgedeckter Community Cards, Showdown-Gewinner mit Hand-Kategorie, "wer ist am Zug"). Karten werden überCard/Suit-Displaysprachfreundlich ausgegeben ("König Herz"). - Soundeffekte eingebunden (Event-Ebene):
PlaySfx-Messages für "shuffle", "chip", "fold", "flip" werden an den entsprechenden Stellen ausgelöst und vonaudio::sfxentgegengenommen. Echte Audiodateien/bevy_audio-Wiedergabe fehlen noch (keine Assets im Projekt) – aktuell Log-Ausgabe als Platzhalter. - Minimalistische, tastaturzentrierte Steuerung:
Tabwählt zwischen Fold/Call-Check/Raise,Leertaste/Enterbestätigt (siehegame_plugin::handle_player_input). Kein grafisches UI nötig, da das Spiel primär auf Audio-Feedback setzt. - Mehrspieler-lokal-Testbarkeit über die Konsole hinaus (aktuell nur 2 fest verdrahtete Spieler; echte Steuerung pro Spieler braucht Networking, siehe Phase 2).
- Neue Hand nach Showdown starten (aktuell stoppt die Eingabe-Verarbeitung nach
Round::Showdown).
Phase 4: Polishing & Testing
- Barrierefreiheits-Audit (Tastatur-Flow ohne Maus).
- Latenztests im Multiplayer.
- WebAssembly Deployment Vorbereitung.