This commit is contained in:
2026-08-28 23:31:48 +02:00
parent 3571106251
commit 50b7b86944
19 changed files with 274 additions and 449 deletions
+8 -12
View File
@@ -5,11 +5,9 @@
//! `ActionCtx` ist der schmale `&mut`-View; er wird über `Game::action_ctx()`
//! konstruiert und durch die Dispatch-Pipeline gereicht.
//!
//! Verben, deren Ziel-Subsystem (Szene, Audio, Renderer) noch nicht
//! existiert oder den Kern nichts angeht, produzieren [`Action`]-Werte
//! statt direkt zu wirken. Frontends konsumieren die Queue: die CLI druckt
//! sie, die Engine führt sie später aus. So bleibt der Kern headless
//! testbar und kennt keines der Subsysteme.
//! Verben, deren Ziel-Subsystem (Szene, Audio, Renderer) den Kern nichts
//! angeht, produzieren [`Action`]-Werte statt direkt zu wirken. Frontends
//! konsumieren die Queue: die CLI druckt sie, das Fenster führt sie aus.
use std::collections::HashMap;
@@ -28,20 +26,18 @@ pub type Signals = HashMap<String, Vec<String>>;
pub enum Action {
/// `assets/sounds/{name}.wav` als Einmal-SFX abspielen.
PlaySound(String),
/// Anzeige-/Eingabemodus wechseln (Spiel, Flycam, Menü). Vom Frontend
/// auf seinen `Mode` gemappt; der Dialog-Modus ist hier bewusst nicht
/// wählbar — der entsteht nur aus dem Story-Ablauf.
/// Anzeige-/Eingabemodus wechseln (Spiel, Noclip, Menü). Der Dialog-Modus
/// ist bewusst nicht wählbar — er entsteht nur aus dem Story-Ablauf.
SetMode(ModeTarget),
}
/// Frontend-neutrales Ziel eines Moduswechsels. Spiegelt die nicht-Dialog-
/// Varianten von `session::Mode`, ohne dass der Kern die rich `Mode`-Daten
/// (Dialog-State) kennen muss. So bleibt `game` ← `session` eine Einbahnstraße.
/// Frontend-neutrales Ziel eines Moduswechsels: die nicht-Dialog-Varianten von
/// `session::Mode`, ohne dass der Kern dessen Dialog-Daten kennen muss.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ModeTarget {
/// First-Person-Spiel.
Play,
/// Noclip-Debug-Flycam.
/// Noclip: freies Fliegen ohne Kollision.
Free,
/// Menü (pausiert die Welt, gibt die Maus frei).
Menu,