Nacharbeiten aus M1b für die nächsten Pläne #5
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Die Abschlussprüfung von M1b (#4) hat Brücke und Hülle mit Korrekturen für zusammenführbar erklärt. Die Korrekturen sind im Branch erledigt. Diese Punkte wurden bewusst verschoben, weil sie erst mit den nächsten Plänen wichtig werden oder nur Kleinigkeiten sind. Jeder Plan übernimmt seine Punkte in seine Tasks. Die offenen M1c-Punkte aus #2 gelten weiter.
Für M1c (Gleichschritt im Netz)
World::from_snapshotmit einem eigenen Einstieg in der Brücke.start_loadedmeldet alle Spieler ab und würde die Welten von Host und Gast trennen.join_refusednennt keinen Schlüssel, und die Hülle wertet es nicht aus. Ein abgelehnter lokaler Beitritt hinterlässt heute eine Sitzung, in der Graben still nichts bewirkt. In M1c (#9) nennt das Ereignis den Schlüssel; die Auswertung in der Hülle ist nach #8 übernommen.TickClockverwirft nach einem Ruckler den Rest, und die Pause hält nur die eigene Welt an. Beides muss einem gemeinsamen Takt weichen; Pause gibt es nur im Solospiel (Konzept 5).user://und damit Spielerschlüssel und Spielstand. Der Zwei-Instanzen-Test von Meilenstein 1 braucht einen Speicherort pro Instanz, zum Beispielstorage_diraus einem Kommandozeilenargument.CLAUDE.md; die Bestätigung durch Steven steht in #8.pending(siehe auch den Punkt „Befehle pro Spieler und Takt begrenzen" in #2). Die Grenze muss stehen, bevor Befehle von anderen Rechnern ankommen.player_key()legt bei einem Lesefehler einen neuen Schlüssel an und überschreibtplayer.key; die Tasche bleibt dann am alten Schlüssel.read_save()liefert bei einem Öffnungsfehler leere Bytes, und_start_from_savelegt einen guten Stand beiseite. Lösung: Schlüssel nur anlegen, wenn die Datei fehlt; bei leeren BytesFileAccess.get_open_error()prüfen und melden, statt zu überschreiben oder beiseitezulegen.catch_unwind, defekte Sitzung, leere Bytes) automatisch testen: die Logik in eine Funktion ohne Godot-Typen auslagern und in Rust prüfen.Vor M2 (erste echte Regeln)
RECORDING_VERSIONerhöhen).recording_bytes()liefert sie bei defekter Sitzung;save()bleibt leer. Das Abspielen löst die Panik im selben Takt wieder aus.Recording::verify), und eine Zeile dazu in CLAUDE.md. Im Fragebogen erwähnen, dass eine Aufzeichnung die Welt abspielt, nicht den Weg der Figur.check_restorablehängt anDIG_COOLDOWN_TICKS. Sobald es längere Wartezeiten gibt, in den Skript-Tests nach jedem Schrittfrom_snapshot(to_snapshot())prüfen.set_aside_saveersetzt ein älteresworld.grw.broken. Beiseitegelegte Stände eindeutig benennen, weil Formatwechsel das Beiseitelegen bald zum Normalfall machen.Hülle und Spielgefühl
fitsist an der nahen Kante nicht direkt getestet.Avatar.walkbegrenzt die Länge vondirectionnicht. Heute unschädlich, weilInput.get_vectorhöchstens Länge 1 liefert;limit_length(1.0)ergänzen, sobald ein anderer Aufrufer dazukommt.SIMULATION_STOPPEDläuft die Schleife im selben Bild weiter._save_blockedfällt nur nach erfolgreichem Laden. Wird das Hindernis außen entfernt und ein späteres F9 legt den Stand beiseite, bleibt das Speichern trotzdem gesperrt. Lösung:_save_blocked = aside.is_empty().play.batschließt die Konsole nach einem Absturz des Spiels. Den Exit-Code vongodot --path gameprüfen und mit einer Meldung anhalten.Prüfwerkzeuge
--log-file) oderdebug/file_logging/max_log_fileserhöhen.core/clippy.tomlfehlt.SaveStore.recordings()liest den Ordnerrecordings/, ohne zu prüfen, ob es ihn gibt; Godot meldet dann einen Engine-Fehler. Im Spielablauf unerreichbar, weilwrite_recordingden Ordner vorher anlegt. Absichern, bevor ein neuer Aufrufer dazukommt, zum Beispiel ein Menü in M1c.texts.csv,install()von Texten und Tasten, die Tastenbelegung selbst, keine Datei für eine leere Aufzeichnung.test_main.gd: das Entfernen vonInputSetup.install(), eine falsche Taktrate, ein fehlendesis_walkableoder der Schutz bei defekter Sitzung fielen nicht auf. Die Grenzetick() <= 5genau als1 + TickClock.MAX_TICKS_PER_FRAMEschreiben.core/tests/forbidden_apis.rsbehauptet noch, Clippy fange gruppierte Importe allgemein ab; Clippy kennt nur die gelisteten Pfade (incore/clippy.tomlschon berichtigt).test_a_save_that_cannot_be_moved_into_place_keeps_the_previous_onesetzt die Dateifreigaben von Windows voraus (eine offene Datei lässt sich nicht verschieben). Sobald eine andere Plattform dazukommt, braucht er eine Plattformabfrage.