Mode als Action

This commit is contained in:
2026-06-15 09:46:13 +02:00
parent 201d3be322
commit 93480150e5
3 changed files with 133 additions and 13 deletions
+38
View File
@@ -30,6 +30,44 @@ pub enum Action {
HideObject(String),
/// WAV unter `assets/audio/<name>` als 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.
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.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ModeTarget {
/// First-Person-Spiel.
Play,
/// Noclip-Debug-Flycam.
Free,
/// Menü (pausiert die Welt, gibt die Maus frei).
Menu,
}
impl ModeTarget {
/// `play`/`free`/`menu` (case-insensitiv) → Ziel; sonst `None`.
pub fn parse(s: &str) -> Option<Self> {
match s.trim().to_ascii_lowercase().as_str() {
"play" => Some(Self::Play),
"free" => Some(Self::Free),
"menu" => Some(Self::Menu),
_ => None,
}
}
/// Kanonischer Name fürs Echo/Logging.
pub fn label(self) -> &'static str {
match self {
Self::Play => "play",
Self::Free => "free",
Self::Menu => "menu",
}
}
}
pub struct Game {