From 8bee8322c3a2ad3bce02429cac62e4aef14b9095 Mon Sep 17 00:00:00 2001 From: irrlicht Date: Tue, 4 Aug 2026 13:10:45 +0200 Subject: [PATCH] noclip gestrichen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Der Befehl war ein Toggle zwischen Play und Free — als getippter Konsolen-Befehl die falsche Form (man sieht nicht, wohin er schaltet) und deckungsgleich mit `mode play` / `mode free`. Keine Taste, kein Menü-Knopf, keine Referenz in assets/ hing daran. Damit stimmt auch die Doku von set_mode wieder: `menu` und die SetMode-Action sind jetzt tatsächlich die einzigen Schreibpfade. Co-Authored-By: Claude Opus 5 --- src/session.rs | 34 +++++++--------------------------- 1 file changed, 7 insertions(+), 27 deletions(-) diff --git a/src/session.rs b/src/session.rs index 592d590..be82d19 100644 --- a/src/session.rs +++ b/src/session.rs @@ -224,9 +224,8 @@ impl Session { ("", _) => ExecResult::empty(), ("quit" | "exit", _) => ExecResult { output: Vec::new(), quit: true }, ("menu", _) => { - // Menü öffnen bzw. ins Spiel zurück. „Fortsetzen" landet im - // Spielmodus (Play), nicht im Noclip; aus Play oder - // Free öffnet es das Menü. (Dialog wird anders geroutet.) + // Menü öffnen bzw. ins Spiel zurück; „Fortsetzen" landet immer + // im Spielmodus, nie im Noclip. (Dialog wird anders geroutet.) let t = match self.mode { Mode::Menu => ModeTarget::Play, _ => ModeTarget::Menu, @@ -234,14 +233,6 @@ impl Session { self.set_mode(t); ExecResult::empty() } - ("noclip", _) => { - let t = match self.mode { - Mode::FirstPerson => ModeTarget::Free, - _ => ModeTarget::Play, - }; - self.set_mode(t); - ExecResult::empty() - } ("help", _) => ExecResult::lines(help()), ("kv", _) => ExecResult::lines(self.dump_kv()), ("reload", _) => { @@ -361,9 +352,9 @@ impl Session { } /// Frontend-neutrales [`ModeTarget`] auf den konkreten [`Mode`] mappen. - /// Einziger Schreibpfad für die nicht-Dialog-Modi — `menu`/`noclip`/`mode` - /// und die `SetMode`-Action laufen alle hier durch. (Der Dialog-Modus - /// entsteht ausschließlich in `step` aus dem Story-Ablauf.) + /// Einziger Schreibpfad für die nicht-Dialog-Modi — `menu` und die + /// `SetMode`-Action laufen beide hier durch. (Der Dialog-Modus entsteht + /// ausschließlich in `step` aus dem Story-Ablauf.) fn set_mode(&mut self, t: ModeTarget) { self.mode = match t { ModeTarget::Play => Mode::FirstPerson, @@ -389,8 +380,7 @@ fn help() -> Vec { " feuert Signal `Mushroom` mit $self = Mushroom.005".into(), " kv KV-Store anzeigen".into(), " menu Menü öffnen / ins Spiel zurück".into(), - " noclip zwischen First-Person und Noclip wechseln".into(), - " mode Modus direkt setzen: play | free | menu".into(), + " mode Modus setzen: play | free (Noclip) | menu".into(), " reload signals.toml neu laden".into(), " quit beenden".into(), ] @@ -466,16 +456,6 @@ mod tests { assert!(matches!(s.mode, Mode::FirstPerson)); } - #[test] - fn noclip_toggles_play_and_free() { - let mut s = empty_session(); - s.mode = Mode::FirstPerson; - s.exec("noclip"); - assert!(matches!(s.mode, Mode::Free)); - s.exec("noclip"); - assert!(matches!(s.mode, Mode::FirstPerson)); - } - #[test] fn fixed_timestep_is_framerate_independent() { // Gleiche Gesamtzeit, einmal als grober und einmal als viele feine @@ -535,7 +515,7 @@ mod tests { assert!(!s.player.grounded); let flown_to = s.player.pos; - s.exec("noclip"); + s.exec("mode play"); assert_eq!(s.player.pos, flown_to, "Noclip-Ende teleportiert nicht zurück"); }