noclip gestrichen

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 <noreply@anthropic.com>
This commit is contained in:
2026-08-28 23:31:49 +02:00
co-authored by Claude Opus 5
parent a3ace75c81
commit 8bee8322c3
+7 -27
View File
@@ -224,9 +224,8 @@ impl Session {
("", _) => ExecResult::empty(), ("", _) => ExecResult::empty(),
("quit" | "exit", _) => ExecResult { output: Vec::new(), quit: true }, ("quit" | "exit", _) => ExecResult { output: Vec::new(), quit: true },
("menu", _) => { ("menu", _) => {
// Menü öffnen bzw. ins Spiel zurück. „Fortsetzen" landet im // Menü öffnen bzw. ins Spiel zurück; „Fortsetzen" landet immer
// Spielmodus (Play), nicht im Noclip; aus Play oder // im Spielmodus, nie im Noclip. (Dialog wird anders geroutet.)
// Free öffnet es das Menü. (Dialog wird anders geroutet.)
let t = match self.mode { let t = match self.mode {
Mode::Menu => ModeTarget::Play, Mode::Menu => ModeTarget::Play,
_ => ModeTarget::Menu, _ => ModeTarget::Menu,
@@ -234,14 +233,6 @@ impl Session {
self.set_mode(t); self.set_mode(t);
ExecResult::empty() ExecResult::empty()
} }
("noclip", _) => {
let t = match self.mode {
Mode::FirstPerson => ModeTarget::Free,
_ => ModeTarget::Play,
};
self.set_mode(t);
ExecResult::empty()
}
("help", _) => ExecResult::lines(help()), ("help", _) => ExecResult::lines(help()),
("kv", _) => ExecResult::lines(self.dump_kv()), ("kv", _) => ExecResult::lines(self.dump_kv()),
("reload", _) => { ("reload", _) => {
@@ -361,9 +352,9 @@ impl Session {
} }
/// Frontend-neutrales [`ModeTarget`] auf den konkreten [`Mode`] mappen. /// Frontend-neutrales [`ModeTarget`] auf den konkreten [`Mode`] mappen.
/// Einziger Schreibpfad für die nicht-Dialog-Modi — `menu`/`noclip`/`mode` /// Einziger Schreibpfad für die nicht-Dialog-Modi — `menu` und die
/// und die `SetMode`-Action laufen alle hier durch. (Der Dialog-Modus /// `SetMode`-Action laufen beide hier durch. (Der Dialog-Modus entsteht
/// entsteht ausschließlich in `step` aus dem Story-Ablauf.) /// ausschließlich in `step` aus dem Story-Ablauf.)
fn set_mode(&mut self, t: ModeTarget) { fn set_mode(&mut self, t: ModeTarget) {
self.mode = match t { self.mode = match t {
ModeTarget::Play => Mode::FirstPerson, ModeTarget::Play => Mode::FirstPerson,
@@ -389,8 +380,7 @@ fn help() -> Vec<String> {
" feuert Signal `Mushroom` mit $self = Mushroom.005".into(), " feuert Signal `Mushroom` mit $self = Mushroom.005".into(),
" kv KV-Store anzeigen".into(), " kv KV-Store anzeigen".into(),
" menu Menü öffnen / ins Spiel zurück".into(), " menu Menü öffnen / ins Spiel zurück".into(),
" noclip zwischen First-Person und Noclip wechseln".into(), " mode <m> Modus setzen: play | free (Noclip) | menu".into(),
" mode <m> Modus direkt setzen: play | free | menu".into(),
" reload signals.toml neu laden".into(), " reload signals.toml neu laden".into(),
" quit beenden".into(), " quit beenden".into(),
] ]
@@ -466,16 +456,6 @@ mod tests {
assert!(matches!(s.mode, Mode::FirstPerson)); 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] #[test]
fn fixed_timestep_is_framerate_independent() { fn fixed_timestep_is_framerate_independent() {
// Gleiche Gesamtzeit, einmal als grober und einmal als viele feine // Gleiche Gesamtzeit, einmal als grober und einmal als viele feine
@@ -535,7 +515,7 @@ mod tests {
assert!(!s.player.grounded); assert!(!s.player.grounded);
let flown_to = s.player.pos; 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"); assert_eq!(s.player.pos, flown_to, "Noclip-Ende teleportiert nicht zurück");
} }