Mode als Action
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user