M1c: Gleichschritt im Netz #9

Merged
steven merged 20 commits from m1c-gleichschritt-im-netz into main 2026-10-02 06:41:02 +00:00
Owner

Mit diesem Branch wird Grovewright ein Koop-Spiel für bis zu vier Spieler. Ein Spieler öffnet seine Welt als Host, die anderen treten über die Adresse bei und kommen und gehen, wann sie wollen. Jeder Rechner rechnet die ganze Welt selbst (Gleichschritt); übers Netz gehen nur die Befehle. Umgesetzt nach dem Plan docs/superpowers/plans/2026-10-01-m1c-gleichschritt-im-netz.md.

Was drin ist

Kern (core/)

  • Regel-Kennung (rules.rs): Sie leitet sich aus den Endzuständen eingefrorener Skripte ab. Aufzeichnungen in Version 3 tragen sie; Aufzeichnungen mit anderen Regeln werden abgelehnt. Fremde Aufzeichnungen sind auf 30 Tage Spielzeit begrenzt.

  • Protokoll (protocol.rs):

    • ein Gruß mit Version, Regel-Kennung, Schlüssel und Name;
    • die Welt als Snapshot;
    • Takte mit ihren Befehlen und einmal pro Sekunde einer Prüfsumme;
    • die Meldung einer Abweichung;
    • eine Ablehnung mit fünf Gründen.

    Der Anfang des Grußes und die ganze Ablehnung ändern sich nie, damit Spiele jeder Version einander noch sagen können, dass sie nicht zusammenpassen.

  • Host (host.rs):

    • bestimmt jeden Takt;
    • bindet die Aktionen eines Gastes an dessen Verbindung, höchstens vier pro Spieler und Takt;
    • prüft Beitritte gegen die Grenzen;
    • schickt einem abgewichenen Gast die Welt neu;
    • hält Schläge eines Gastes, die während der Abklingzeit ankommen, bis zum ersten Takt danach.
  • Gast (guest.rs): hat keine eigene Uhr und rechnet jeden empfangenen Takt nach. Er vergleicht die Prüfsumme, meldet Abweichungen und behält die Aufzeichnung der abgewichenen Welt.

Brücke (bridge/)

  • GwSession treibt Host oder Gast über driver.rs. Der Panik-Wächter ist in reinem Rust getestet. Ein Gast startet aus dem Snapshot des Hosts.

Hülle (game/)

  • net_link.gd (ENet, Port 24680): Kernnachrichten gehen zuverlässig über Kanal 0, Figuren unzuverlässig, aber geordnet über Kanal 1 und ohne Drosselung. Eine stille Verbindung gilt nach etwa acht Sekunden als verloren.
  • session_link.gd verbindet Sitzung und Netz und reicht Figuren weiter, gebunden an die Verbindung, von der sie kommen.
  • Oberfläche: Startmenü mit „Allein spielen“, „Welt öffnen“ und „Beitreten“, die Figuren der anderen mit Namen und eine Statuszeile.
  • Regeln der Hauptszene:
    • Nur der Host speichert, und F9 geht nur ohne geöffnete Welt.
    • Eine Pause beginnt nur ohne Gäste und endet, sobald der Host einen Gast annimmt.
    • Hält der Kern mit einem Fehler an, gibt der Host seine Gäste frei.
  • Startoptionen: Profile (--profile=NAME) für zwei Fenster auf einem Rechner, dazu --name, --solo, --host, --port und --join.
  • Vorsichtiges Lesen: Schlüssel, Spielstand und Einstellungen, die gerade nicht lesbar sind, werden nie ersetzt.

Drumherum

  • play.bat gibt Argumente an das Spiel weiter. play-zweites-fenster.bat startet ein zweites Fenster mit eigenem Profil.
  • CLAUDE.md beschreibt die gemeinsame Welt im Netz, die Netzwerkregeln und das Vertrauensmodell.
  • Der Fragebogen docs/playtests/m1c.md sagt auch, was die Rechner der Mitspieler brauchen.

Prüfung

  • 151 Rust-Tests in Debug und Release, 96 GDScript-Tests; rustfmt und Clippy ohne Befund. Ein GDScript-Lauf zeigt drei bekannte Warnungen aus Tests, die Fehler absichtlich auslösen.
  • test_two_instances.gd startet einen zweiten Godot-Prozess als Gast und prüft, dass beide Welten nach 150 Takten gleich sind.
  • Jede Task wurde von einem eigenen Prüfer gesehen. Acht brauchten eine Korrekturrunde; jede Korrektur war vorab rot und grün geprüft und wurde nachgeprüft.
  • Die Abschlussprüfung über den ganzen Branch urteilte „mit Korrekturen“. Die Korrekturwelle wurde nachgeprüft und hinterließ keinen offenen Punkt.
  • Ein Nachprüfer hat mit einem und drei Gästen, Latenz, Schwankungen und Spitzen den Gleichschritt nachgemessen: kein Unterschied in den Prüfsummen. Vor der Korrekturwelle verloren Gäste in derselben Umgebung 11 bis 26 % ihrer Schläge, danach keinen.

Entscheidungen während der Umsetzung

  1. Der Test für zu lange Namen hat keinen roten Lauf, weil er bestehendes Verhalten festhält und #2 ihn verlangt.
  2. Umsetzer tragen ihr eigenes Modell in die Zeile Co-Authored-By ein, nicht das Modell aus dem Plan.
  3. Tests dürfen private Teile der Hauptszene aufrufen. Sonst wären automatisches Speichern, unlesbarer Schlüssel und Gleiten nur in Echtzeit testbar.
  4. Es gibt kein drittes eingefrorenes Skript für die Beitrittsgrenzen, weil es festgeschriebene Werte ändern würde. Die Prüfsumme sichert ab.
  5. Task 2: Ein Golden-Test hält fest, dass der Anfang des Grußes und die Ablehnung sich nie ändern.
  6. Task 3: Die neue Testdatei core/tests/host_guest.rs treibt Host und Gast von Hand: Rückstand, verlorener Takt und Beitritte an den Grenzen. Der Produktivcode bleibt unverändert.
  7. Task 4: Der Brückentest tauscht keinen globalen Panik-Hook mehr.
  8. Task 4: Die Gast-Schleifen in den Tests sind gezählt, damit ein Kernfehler den Lauf scheitern lässt statt ihn aufzuhängen.
  9. Task 4: Dasselbe gilt für den Test des automatischen Speicherns, als Nachtrag zu Task 8.
  10. Task 5: NetLink sendet nichts an schließende oder fehlende Verbindungen und schickt jedes Paket einzeln. Sonst meldete Godot Engine-Fehler.
  11. Task 6: Einstellungen, die gerade nicht lesbar sind, werden nicht überschrieben. Beschädigte werden beim nächsten Ändern neu geschrieben.
  12. Zählregel nach Task 6: Es gibt einen Test und eine bekannte Warnung mehr; die Briefs bleiben unverändert.
  13. Task 8:
    • Eine defekte Sitzung gibt die Mitspieler frei: Der Host schließt seine Welt, der Gast geht ins Menü.
    • Eine Pause endet nur, wenn ein Gast angenommen wird, und lässt sich immer beenden.
    • Meldungen nach dem Ende einer Sitzung werden ignoriert.
  14. Zählregel nach Task 8: vier Tests mehr.
  15. Task 9:
    • Die Uhr des Hosts wartet im Zwei-Prozess-Test auf den Gast.
    • Der Bot endet immer.
    • Ein leeres --storage= führt nie in den echten Spielerordner.
  16. Zählregel nach Task 9: ein Test mehr.
  17. Task 10: Die Startskripte wurden aus geprüften Vorlagen kopiert, damit die Windows-Zeilenenden erhalten bleiben.
  18. Task 10: Fragebogen und CLAUDE.md sind an den Code angeglichen: Statuszeile oben rechts, Aufzeichnungen und Logs, Pausenregel. Das zweite Startskript reicht weitere Argumente weiter.
  19. Korrekturwelle nach der Abschlussprüfung:
    • Der Host hält zu frühe Schläge der Gäste.
    • Die ENet-Drosselung ist aus, und eine stille Verbindung gilt nach etwa acht Sekunden als verloren.
    • Ungültige Figuren werden verworfen.
    • Bei einem Kernfehler zeigt die Statuszeile des Hosts das an.
    • Der Fragebogen nennt, was Mitspieler brauchen.
    • Neue Tests sichern das ab.
  20. Weitere Punkte sind bewusst nach #8 verschoben.
  21. Die Restpunkte der letzten Nachprüfung sind in #8 geparkt, statt eine zweite Korrekturwelle zu starten.

Für Steven

  • Bitte die Vertrauensregel in CLAUDE.md bestätigen oder verwerfen. Danach prüft nur die Hülle die Reichweite, und jeder Gast kennt die Schlüssel aller Spieler. Sie steht nicht in docs/KONZEPT.md, sondern stammt aus dem Plan; sie steht auch in #8.
  • Mitspieler brauchen heute Git, Rust und Godot 4.7.2. Ein fertig gepacktes Spiel wäre ein eigener Schritt.
  • Vor dem Spieltest mit Freunden einmal zehn Minuten mit zwei Fenstern auf einem Rechner spielen. Dabei auf Esc, F5 und F9, das Menü, die Statuszeile und die zweite Figur mit Namen achten.

Verschoben

  • #8 sammelt die bewusst verschobenen Punkte aus M1c.
  • Die erledigten M1c-Punkte in #2 und #5 sind abgehakt. join_refused aus #5 ist nach #8 übernommen.

Spieltest

play.bat im Hauptordner doppelklicken, dann den Fragebogen docs/playtests/m1c.md ausfüllen. Für zwei Spieler auf einem Rechner play-zweites-fenster.bat dazunehmen.

Closes #7

🤖 Generated with Claude Code

Mit diesem Branch wird Grovewright ein Koop-Spiel für bis zu vier Spieler. Ein Spieler öffnet seine Welt als Host, die anderen treten über die Adresse bei und kommen und gehen, wann sie wollen. Jeder Rechner rechnet die ganze Welt selbst (Gleichschritt); übers Netz gehen nur die Befehle. Umgesetzt nach dem Plan `docs/superpowers/plans/2026-10-01-m1c-gleichschritt-im-netz.md`. ## Was drin ist **Kern (`core/`)** - **Regel-Kennung** (`rules.rs`): Sie leitet sich aus den Endzuständen eingefrorener Skripte ab. Aufzeichnungen in Version 3 tragen sie; Aufzeichnungen mit anderen Regeln werden abgelehnt. Fremde Aufzeichnungen sind auf 30 Tage Spielzeit begrenzt. - **Protokoll** (`protocol.rs`): - ein Gruß mit Version, Regel-Kennung, Schlüssel und Name; - die Welt als Snapshot; - Takte mit ihren Befehlen und einmal pro Sekunde einer Prüfsumme; - die Meldung einer Abweichung; - eine Ablehnung mit fünf Gründen. Der Anfang des Grußes und die ganze Ablehnung ändern sich nie, damit Spiele jeder Version einander noch sagen können, dass sie nicht zusammenpassen. - **Host** (`host.rs`): - bestimmt jeden Takt; - bindet die Aktionen eines Gastes an dessen Verbindung, höchstens vier pro Spieler und Takt; - prüft Beitritte gegen die Grenzen; - schickt einem abgewichenen Gast die Welt neu; - hält Schläge eines Gastes, die während der Abklingzeit ankommen, bis zum ersten Takt danach. - **Gast** (`guest.rs`): hat keine eigene Uhr und rechnet jeden empfangenen Takt nach. Er vergleicht die Prüfsumme, meldet Abweichungen und behält die Aufzeichnung der abgewichenen Welt. **Brücke (`bridge/`)** - `GwSession` treibt Host oder Gast über `driver.rs`. Der Panik-Wächter ist in reinem Rust getestet. Ein Gast startet aus dem Snapshot des Hosts. **Hülle (`game/`)** - **`net_link.gd`** (ENet, Port 24680): Kernnachrichten gehen zuverlässig über Kanal 0, Figuren unzuverlässig, aber geordnet über Kanal 1 und ohne Drosselung. Eine stille Verbindung gilt nach etwa acht Sekunden als verloren. - **`session_link.gd`** verbindet Sitzung und Netz und reicht Figuren weiter, gebunden an die Verbindung, von der sie kommen. - **Oberfläche:** Startmenü mit „Allein spielen“, „Welt öffnen“ und „Beitreten“, die Figuren der anderen mit Namen und eine Statuszeile. - **Regeln der Hauptszene:** - Nur der Host speichert, und F9 geht nur ohne geöffnete Welt. - Eine Pause beginnt nur ohne Gäste und endet, sobald der Host einen Gast annimmt. - Hält der Kern mit einem Fehler an, gibt der Host seine Gäste frei. - **Startoptionen:** Profile (`--profile=NAME`) für zwei Fenster auf einem Rechner, dazu `--name`, `--solo`, `--host`, `--port` und `--join`. - **Vorsichtiges Lesen:** Schlüssel, Spielstand und Einstellungen, die gerade nicht lesbar sind, werden nie ersetzt. **Drumherum** - `play.bat` gibt Argumente an das Spiel weiter. `play-zweites-fenster.bat` startet ein zweites Fenster mit eigenem Profil. - `CLAUDE.md` beschreibt die gemeinsame Welt im Netz, die Netzwerkregeln und das Vertrauensmodell. - Der Fragebogen `docs/playtests/m1c.md` sagt auch, was die Rechner der Mitspieler brauchen. ## Prüfung - 151 Rust-Tests in Debug und Release, 96 GDScript-Tests; rustfmt und Clippy ohne Befund. Ein GDScript-Lauf zeigt drei bekannte Warnungen aus Tests, die Fehler absichtlich auslösen. - `test_two_instances.gd` startet einen zweiten Godot-Prozess als Gast und prüft, dass beide Welten nach 150 Takten gleich sind. - Jede Task wurde von einem eigenen Prüfer gesehen. Acht brauchten eine Korrekturrunde; jede Korrektur war vorab rot und grün geprüft und wurde nachgeprüft. - Die Abschlussprüfung über den ganzen Branch urteilte „mit Korrekturen“. Die Korrekturwelle wurde nachgeprüft und hinterließ keinen offenen Punkt. - Ein Nachprüfer hat mit einem und drei Gästen, Latenz, Schwankungen und Spitzen den Gleichschritt nachgemessen: kein Unterschied in den Prüfsummen. Vor der Korrekturwelle verloren Gäste in derselben Umgebung 11 bis 26 % ihrer Schläge, danach keinen. ## Entscheidungen während der Umsetzung 1. Der Test für zu lange Namen hat keinen roten Lauf, weil er bestehendes Verhalten festhält und #2 ihn verlangt. 2. Umsetzer tragen ihr eigenes Modell in die Zeile `Co-Authored-By` ein, nicht das Modell aus dem Plan. 3. Tests dürfen private Teile der Hauptszene aufrufen. Sonst wären automatisches Speichern, unlesbarer Schlüssel und Gleiten nur in Echtzeit testbar. 4. Es gibt kein drittes eingefrorenes Skript für die Beitrittsgrenzen, weil es festgeschriebene Werte ändern würde. Die Prüfsumme sichert ab. 5. Task 2: Ein Golden-Test hält fest, dass der Anfang des Grußes und die Ablehnung sich nie ändern. 6. Task 3: Die neue Testdatei `core/tests/host_guest.rs` treibt Host und Gast von Hand: Rückstand, verlorener Takt und Beitritte an den Grenzen. Der Produktivcode bleibt unverändert. 7. Task 4: Der Brückentest tauscht keinen globalen Panik-Hook mehr. 8. Task 4: Die Gast-Schleifen in den Tests sind gezählt, damit ein Kernfehler den Lauf scheitern lässt statt ihn aufzuhängen. 9. Task 4: Dasselbe gilt für den Test des automatischen Speicherns, als Nachtrag zu Task 8. 10. Task 5: `NetLink` sendet nichts an schließende oder fehlende Verbindungen und schickt jedes Paket einzeln. Sonst meldete Godot Engine-Fehler. 11. Task 6: Einstellungen, die gerade nicht lesbar sind, werden nicht überschrieben. Beschädigte werden beim nächsten Ändern neu geschrieben. 12. Zählregel nach Task 6: Es gibt einen Test und eine bekannte Warnung mehr; die Briefs bleiben unverändert. 13. Task 8: - Eine defekte Sitzung gibt die Mitspieler frei: Der Host schließt seine Welt, der Gast geht ins Menü. - Eine Pause endet nur, wenn ein Gast angenommen wird, und lässt sich immer beenden. - Meldungen nach dem Ende einer Sitzung werden ignoriert. 14. Zählregel nach Task 8: vier Tests mehr. 15. Task 9: - Die Uhr des Hosts wartet im Zwei-Prozess-Test auf den Gast. - Der Bot endet immer. - Ein leeres `--storage=` führt nie in den echten Spielerordner. 16. Zählregel nach Task 9: ein Test mehr. 17. Task 10: Die Startskripte wurden aus geprüften Vorlagen kopiert, damit die Windows-Zeilenenden erhalten bleiben. 18. Task 10: Fragebogen und `CLAUDE.md` sind an den Code angeglichen: Statuszeile oben rechts, Aufzeichnungen und Logs, Pausenregel. Das zweite Startskript reicht weitere Argumente weiter. 19. Korrekturwelle nach der Abschlussprüfung: - Der Host hält zu frühe Schläge der Gäste. - Die ENet-Drosselung ist aus, und eine stille Verbindung gilt nach etwa acht Sekunden als verloren. - Ungültige Figuren werden verworfen. - Bei einem Kernfehler zeigt die Statuszeile des Hosts das an. - Der Fragebogen nennt, was Mitspieler brauchen. - Neue Tests sichern das ab. 20. Weitere Punkte sind bewusst nach #8 verschoben. 21. Die Restpunkte der letzten Nachprüfung sind in #8 geparkt, statt eine zweite Korrekturwelle zu starten. ## Für Steven - Bitte die Vertrauensregel in `CLAUDE.md` bestätigen oder verwerfen. Danach prüft nur die Hülle die Reichweite, und jeder Gast kennt die Schlüssel aller Spieler. Sie steht nicht in `docs/KONZEPT.md`, sondern stammt aus dem Plan; sie steht auch in #8. - Mitspieler brauchen heute Git, Rust und Godot 4.7.2. Ein fertig gepacktes Spiel wäre ein eigener Schritt. - Vor dem Spieltest mit Freunden einmal zehn Minuten mit zwei Fenstern auf einem Rechner spielen. Dabei auf Esc, F5 und F9, das Menü, die Statuszeile und die zweite Figur mit Namen achten. ## Verschoben - #8 sammelt die bewusst verschobenen Punkte aus M1c. - Die erledigten M1c-Punkte in #2 und #5 sind abgehakt. `join_refused` aus #5 ist nach #8 übernommen. ## Spieltest `play.bat` im Hauptordner doppelklicken, dann den Fragebogen `docs/playtests/m1c.md` ausfüllen. Für zwei Spieler auf einem Rechner `play-zweites-fenster.bat` dazunehmen. Closes #7 🤖 Generated with [Claude Code](https://claude.com/claude-code)
steven added this to the M1 Fundament milestone 2026-10-02 06:40:35 +00:00
steven added 20 commits 2026-10-02 06:40:37 +00:00
Zehn Tasks machen Grovewright zum Koop-Spiel für bis zu vier Spieler:
Regel-Kennung und Aufzeichnung Version 3, Nachrichten zwischen Host und
Gästen, Host und Gast im Kern, die Brücke für beide Rollen, die
Verbindung über ENet, Profile und Startoptionen, Startmenü und fremde
Figuren, die Hauptszene für Host und Gast, ein Test mit zwei echten
Spielinstanzen und zum Schluss Startskripte, Regeln und Fragebogen.
Jede Task-Grenze wurde vorab mit rotem und grünem Lauf nachgestellt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Die eingefrorenen Skripte ziehen von den festgeschriebenen Tests in den
Kern. Aus ihren Endzuständen leitet sich die Regel-Kennung ab, die sich
mit jeder Regel ändert, die ein Skript berührt. Aufzeichnungen tragen
sie und werden mit anderen Regeln abgelehnt, statt eine scheinbare
Abweichung zu melden. Fremde Aufzeichnungen dürfen höchstens 30 Tage
lang sein. Ein Test hält fest, dass zu lange Namen beim Dekodieren
abgelehnt werden.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Gäste grüßen mit Protokollversion, Regel-Kennung, Schlüssel und Name
und schicken danach nur Aktionen ohne Spielernummer. Der Host schickt
seine Welt, Ablehnungen mit Grund und jeden Takt mit seinen Befehlen,
jede Sekunde mit einer Prüfsumme. Ein Gruß einer anderen Version bleibt
erkennbar, und das Format ist in den festgeschriebenen Werten
verankert.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Ein Test hält fest, dass ein Gruß mit Kennung und Version beginnt und
eine Ablehnung aus Kennung und Grund besteht. Beides bleibt auch bei
einer neuen Protokollversion gleich, damit sich Spiele verschiedener
Versionen weiter sagen können, dass sie nicht zusammenpassen. Die
Meldung des festgeschriebenen Nachrichtenformats weist darauf hin.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Der Host nimmt Gäste auf, macht aus ihren Aktionen Befehle für den
Spieler ihrer Verbindung, begrenzt sie pro Takt und schickt jeden Takt
an alle Gäste. Gäste rechnen jeden Takt nach, vergleichen die
Prüfsummen und holen sich nach einer Abweichung die Welt des Hosts neu.
Tests verbinden Host und Gäste im Speicher, auch über 2000 Takte mit
Gehen und Wiederkommen.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Neue Tests treiben Host und Gast Nachricht für Nachricht und erzeugen,
was das Netz im Speicher nie herstellt: einen Gast, der hinterherhängt,
einen verlorenen Takt und Beitritte, die an den Grenzen warten. Sie
halten fest, dass ein abgewichener Gast nichts rechnet, bis die Welt des
Hosts kommt, dass er dann ältere Takte verwirft, dass die Zahl der
Aktionen eines Gastes in jedem Takt neu beginnt und dass wartende
Beitritte bei beiden Spielergrenzen zählen.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
GwSession führt eine Sitzung als Host oder als Gast und reicht die
Nachrichten des Kerns an GDScript weiter. Nur der Host speichert. Die
Behandlung interner Fehler liegt jetzt in einem reinen Rust-Teil und hat
einen Test, und das Ereignis join_refused nennt den Schlüssel.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Der Test einer Panik im Kern tauscht den globalen Panik-Hook nicht mehr
aus. Das war unnötig, weil der Testläufer die Meldung einer erwarteten
Panik ohnehin zurückhält, und es konnte Meldungen anderer, gleichzeitig
scheiternder Tests verschlucken. Die Gast-Schleifen in den GDScript-Tests
der Brücke laufen höchstens so oft, wie Takte warten, damit ein
abgewichener Gast den Testlauf nicht anhält.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
NetLink verbindet Host und Gäste über ENet: Nachrichten des Kerns
zuverlässig und in Reihenfolge, Positionen der Figuren unzuverlässig.
Eine Verbindung schließt erst, wenn wartende Nachrichten draußen sind.
SessionLink trägt die Nachrichten einer Sitzung über die Verbindung und
reicht Positionen weiter. Die Tests verbinden zwei Seiten über die
Loopback-Schnittstelle.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
NetLink merkt sich die Verbindungen, die es gerade schließt, und
schickt ihnen nichts mehr. Pakete an alle oder an alle außer einem gehen
einzeln an die offenen Verbindungen, statt Godot ein Ziel zu nennen, das
es nicht mehr gibt. Beides löste sonst Fehler in Godot aus, etwa wenn
der Host Figuren weiterreicht, während er einen abgelehnten Gast
hinauswirft. Ein neuer Test mit zwei Gästen deckt das ab.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Die Befehlszeile wählt ein Profil, einen Namen und einen Direktstart.
Zwei Fenster auf einem Rechner sind so zwei Spieler. Ein Schlüssel oder
Spielstand, der sich gerade nicht lesen lässt, wird nicht mehr ersetzt.
Name und zuletzt genutzte Adresse bleiben gespeichert.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Wer eine Einstellung ändert, liest die Einstellungsdatei jetzt an
derselben Stelle wie Schlüssel und Speicherstand. Ist sie gerade nicht
lesbar, etwa weil ein anderes Programm sie hält, bleibt sie unverändert,
statt nur mit dem neuen Wert überschrieben zu werden. Von einer
beschädigten Datei bleibt, was Godot lesen konnte. Ein neuer Test deckt
die gehaltene Datei ab. Der Parameter von set_player_name heißt jetzt
new_name, damit er die Methode player_name nicht verdeckt.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Das Startmenü fragt nach dem Namen und bietet allein spielen, die Welt
öffnen oder beitreten. Die Figuren der anderen Spieler gleiten zu ihrer
neuesten Position und tragen ihren Namen. Die Anzeige füllt Werte in
Meldungen ein und hat eine Statuszeile. Die Texte für Menü und Netzwerk
gibt es auf Deutsch und Englisch.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Die Hauptszene beginnt mit dem Startmenü oder mit dem Direktstart aus
der Befehlszeile. Gäste sehen die Welt des Hosts und die Figuren aller
Spieler. Nur der Host speichert, Pause gibt es nur ohne Gäste, Laden
nur beim Spielen allein. Ablehnungen, Abbrüche und Abgleiche erscheinen
als Meldung, und ein Spielstand, der sich gerade nicht lesen lässt,
bleibt unangetastet.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Hält der Kern mit einem internen Fehler an, schließt ein Host seine Welt
für Gäste, und ein Gast kehrt ins Menü zurück, statt dass die anderen
ohne Nachricht warten. Eine Pause endet erst, wenn der Host einen Gast
angenommen hat, nicht schon bei einer bloßen Verbindung. So kann ein
Gast nicht mehr in einer pausierten Welt festhängen, wenn der Host
zwischen Verbindung und Gruß pausiert. Eine Pause lässt sich immer
beenden. Meldungen, die nach dem Ende einer Sitzung im selben Stapel
folgen, bleiben unbeachtet. Vier neue Tests decken das ab.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Ein Test startet einen zweiten Godot-Prozess als Gast. Der Gast tritt
über das Netzwerk bei und schlägt Stein, beide Welten enden im selben
Zustand, ohne Abgleich unterwegs. Damit ist die Prüffrage von
Meilenstein 1 Teil der automatischen Prüfungen.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Die Uhr des Hosts wartet jetzt auf den Gast. So kann ein langsamer Start
des zweiten Prozesses die Takte bis zum Vergleich nicht mehr verbrauchen.
Der Bot endet auch dann, wenn er seinen Bericht nicht schreiben kann,
und überlebt den Test nie. Ein leeres --storage= führt ihn nicht mehr in
den Ordner des Spielers. Ein neuer Test prüft, dass der Bot ohne
schreibbaren Bericht mit Exit-Code 1 endet.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
play.bat gibt Argumente an das Spiel weiter, und
play-zweites-fenster.bat startet ein zweites Fenster mit eigenem Profil.
CLAUDE.md beschreibt die gemeinsame Welt, das Vertrauensmodell der
Reichweite, die Netzwerkregeln und den Test zweier Instanzen. Ein
Fragebogen begleitet den Probelauf.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Der Fragebogen nennt die Statuszeile oben rechts. Er sagt wieder, wann
eine Aufzeichnung entsteht, dass eine angehaltene Sitzung keine
hinterlässt und wo die Logs liegen, und er gibt bessere Hinweise für
Verbindungen übers Internet. CLAUDE.md beschreibt jetzt auch:
- die Übernahme der Host-Welt durch Gäste,
- den festen Anfang von Gruß und Ablehnung,
- die Pausenregel und das Anhalten bei einem Kernfehler,
- die erlaubten Profilnamen,
- die gesperrte Brücken-DLL bei laufendem Spiel.
play-zweites-fenster.bat gibt weitere Argumente an das Spiel weiter.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
- Der Host hält einen Schlag eines Gastes, der während der Abklingzeit
  ankommt, bis zum ersten Takt danach. Übers Internet ging sonst etwa
  jeder fünfte Schlag eines Gastes verloren.
- ENet drosselt die Figuren nie mehr; sonst konnten die Figuren eines
  von zwei Gästen dauerhaft stehen bleiben. Figuren gehen geordnet, und
  eine stille Verbindung gilt nach höchstens acht Sekunden als verloren.
- Positionen, die keine Zahlen sind, und Figuren von Spielern, die
  nicht online sind, werden verworfen.
- Ein Host mit angehaltener Simulation sagt das in der Statuszeile.
- Neue Tests: Schlag während der Abklingzeit, Zielauswahl von NetLink,
  verworfene Figuren, Neuabgleich über die Brücke.
- Der Fragebogen sagt, was jeder Rechner braucht, und die Freigabe in
  der Firewall gehört zum Host. CLAUDE.md beschreibt das Halten der
  Schläge, die Drosselung und die Zeitüberschreitung und ergänzt die
  Vertrauensregel um die Schlüssel.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
steven merged commit 22f87f1ff4 into main 2026-10-02 06:41:02 +00:00
steven deleted branch m1c-gleichschritt-im-netz 2026-10-02 06:41:02 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: steven/Grovewright#9