champions-of-luneraria/docs/port/U4-NETWORK.md
Martin Stickelbroeck ac925dfeaf Doku: Commit-ID U4 in PORT-QA, U4-NETWORK und PORT-STATUS
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 16:15:19 +02:00

6.9 KiB
Raw Blame History

U4 · Netzwerk

Stand: 2. Oktober 2026 · fertig (luneraria/u4 = 769e622).

Es wurde keine neue Architektur erfunden. Übertragen ist der M4-Umfang (lune_session.gd, Protokoll 4), serverautoritativ:

  • Clients senden Absichten.
  • Der Host berechnet Gold, Käufe, Kampf, Schaden, Besitz, Boss und Sieg.

Umsetzung

Baustein Ort Inhalt
LuneSession Assets/Luneraria/Core/Net/LuneSession.cs autoritative Sitzung (Port von lune_session.gd): Rollen, Sitze, Lobby, Hallo/Beitritt/Wiedereinstieg, Befehle, Bereit, Kampfbeginn, Momentaufnahmen, Abrechnung, Revanche, Disconnect
NetModel Assets/Luneraria/Core/Net/NetModel.cs Sitzungsmodelle (Lobby, öffentlicher Zustand, Einheitenätzeze, Rahmen) und ILuneNetLink
LuneLoopback Assets/Luneraria/Core/Net/LuneLoopback.cs In-Prozess-Transport für die Protokoll- und Mehr-Runden-Tests
LuneWire Assets/Luneraria/Net/LuneWire.cs Codierung der Nachrichten (Art + Payload, Cursor-Codec) und der Kampfrahmen
LuneTcp Assets/Luneraria/Net/LuneTcp.cs TCP-Transport (Ersatz für ENet): ein Socket je Gast, zuverlässige Nachrichten und Rahmen, Pump auf dem Spielthread
LuneMainMenu Assets/Luneraria/UI/Game/LuneMainMenu.cs Startbildschirm: Allein spielen, Hosten, Beitreten, Bund, Lane, Name, Adresse, Port
LuneNetPlay Assets/Luneraria/UI/Game/LuneNetPlay.cs Schale um Sitzung und Transport (Port von lune_main.gd): Menü, Partie, Rückkehr, Revanche
LuneGame Assets/Luneraria/UI/Game/LuneGame.cs Befehle, Rückgängig und Bereit gehen im Netzspiel über die Sitzung; Gast zeigt nur Host-Rahmen

Offline ist ein lokaler Host mit Bot-Plätzen (LuneSession.HostOffline). Hosten und Beitreten nutzen LuneTcp mit LuneWire. Peer 1 ist der Host; freie Plätze bleiben Bots.

Erfasster M4-Umfang

Funktion Verhalten in der Referenz im Port
Rollen offline (lokaler Host mit Bot-Plätzen), Host (ENet-Server, bis 5 Gäste), Gast erfüllt (offline, Host, Gast; TCP statt ENet)
Sechs Plätze ein Peer genau ein Platz; freie Plätze spielen Bots; Lobbyeinträge mit Name, Bereit, Bot erfüllt
Beitritt Hallo mit Protokollversion und Name; falsche Version wird abgelehnt; Namen gekürzt (24 Zeichen); volle Partie abgelehnt erfüllt
Private Planung ein Gast sendet Befehle für seinen Platz; fremde Plätze werden abgelehnt (Spoof-Schutz); der Zustand enthält nur den eigenen Entwurf erfüllt
Bereit nach Bereit ist die Planung verbindlich; alle bereit → Kampf; Bots planen einmal je Runde erfüllt
Kampfsynchronisation Kampfbeginn mit Einheitenätzen und Gebäude-HP; alle 0,05 s neue Einheiten und ein Frame (13 Werte je Einheit, ungeordnet-zuverlässig); Gast interpoliert, verspätete Frames werden verworfen erfüllt (Rahmen mit Serial; späte Frames verworfen)
Abrechnung Host sendet den öffentlichen Zustand nach dem Kampf erfüllt
Disconnect Platz geht an einen Bot, der in der Planung sofort plant; niemals Kernverlust erfüllt
Wiedereinstieg gleicher Name, solange der Platz bot-gehalten ist → Platz zurück, volle Synchronisation erfüllt
Übernahme ein neuer Mensch verwirft den unbestätigten Bot-Entwurf und muss selbst bereit melden erfüllt
Revanche Host startet neu, Plätze bleiben erfüllt
Hostverlust Gast kehrt mit Meldung ins Menü zurück erfüllt
Tests test_lune_net 43 Prüfungen, net_rounds.py Loopback mit zwei Prozessen 12 Prüfungen erfüllt: NetSuite 43/43, NetRoundsSuite 12/12 (In-Prozess-Loopback statt zwei Prozesse)

Prüfung

Test Ergebnis
NetSuite (Port von test_lune_net.gd) 43/43: Sitzplatzbesitz und Spoof, veraltete Befehle, Doppelkauf, fremde UID, Disconnect ohne Kernschaden, sechs Plätze und Phasen, Hallo und Wiedereinstieg, Bot-Übernahme und einmaliges Bot-Planen, Bereit verbindlich und Privatsphäre der Entwürfe
NetRoundsSuite (Port von net_rounds.py) 12/12: Host und Gast spielen 5 Runden, Prüfsummen nach jeder Abrechnung gleich, Gast rechnet 0 Kampfschritte und erhält Rahmen, Gast A trennt im Kampf von Runde 2, Bot übernimmt, Gast B kehrt mit demselben Namen auf denselben Sitz zurück
LuneWireTests Round-trip von Befehlen, öffentlichem Zustand (inkl. Entwurf, Hero, Buchungen), Einheitenätzen, Rahmen, Lobby und Optionen
EditMode gesamt 29/29 (Kern 9 inkl. NetProtocol und NetRounds, Wire 4, Integration 2, UI-Modell 12, Bildraten 4)
PlayMode gesamt 13/13 (Szene, Vertical Function Test, Capture, Verify A–I, UI-Toolkit-Probe); Bildwerkzeuge und Spieltest Explicit
Kerntests .NET 457/457 (75 + 91 + 73 + 157 + 6 + 43 + 12)
Fingerabdrücke der Bot-Partien unverändert DCE95C96556F3A1A, 7B8E43AEFC0D60C5

Das Loopback der Mehr-Runden-Partie läuft im Prozess mit zwei LuneSession-Instanzen und LuneLoopback (Nachrichten synchron in Sende-Reihenfolge). Damit sind Protokoll, Prüfsummen, Übernahme und Wiedereinstieg abgedeckt; eine echte Zwei-Prozess-Partie über Sockets bleibt eine optionale Erweiterung.

Abnahme U4

Vorgabe Stand
Rollen offline / Host / Gast erfüllt
Sechs Plätze, ein Peer ein Platz, freie Plätze Bots erfüllt
Beitritt mit Protokollprüfung, Namenskürzung, volle Partie abgelehnt erfüllt
Private Planung, Spoof-Schutz, nur eigener Entwurf im Zustand erfüllt
Bereit verbindlich, alle bereit → Kampf, Bots einmal je Runde erfüllt
Kampfsynchronisation (Beginn, neue Einheiten, Rahmen 20/s, späte Frames verworfen) erfüllt
Abrechnung mit öffentlichem Zustand erfüllt
Disconnect → Bot, kein Kernverlust erfüllt
Wiedereinstieg über den Namen erfüllt
Übernahme verwirft den Bot-Entwurf erfüllt
Revanche durch den Host erfüllt
Hostverlust → Meldung und Rückkehr ins Menü erfüllt
Mindestumfang: Ready, private Planung, Bot-Übernahme, Wiedereinstieg, Snapshots, Revanche, Disconnect, sechs Plätze erfüllt
Tests 43 + 12 erfüllt

Bekannte Grenzen

  • Transport: TCP statt ENet. Kampfrahmen laufen auf demselben Socket und werden über die Serial verworfen (wie unreliable_ordered). Unter Paketverlust kann TCP Head-of-Line-Blocking erzeugen; für eine Internetpartie wäre ein unzuverlässiger Kanal wie bei ENet der nächste Schritt.
  • Zwei-Prozess-Loopback (net_rounds.py) ist als In-Prozess-Test umgesetzt (NetRoundsSuite). Ein Sockets-Lauf über zwei Player ist optional.
  • Windows auf x64-Hardware und Netz über mehrere Rechner sind nicht gemessen (Build-Module fehlen, siehe U1.5-UNITY.md).
  • Hauptmenü ist der Startbildschirm mit Offline/Hosten/Beitreten; das erweiterte Menü der Referenz (Emblem, Version, erweiterte Optionen) ist vereinfacht.
  • Kein Audio-Netzwerk und keine Lobby-Chat-Nachrichten (waren nicht Teil des M4-Mindestumfangs).