champions-of-luneraria/docs/port/KNOWN-BEHAVIOR-DIFFERENCES.md
Martin Stickelbroeck 769e622952 U4 Netzwerk: LuneSession, TCP, Host/Join, 43+12 Prüfungen
Der M4-Umfang ist als Protokoll 4 portiert, serverautoritativ. Der Host
besitzt LuneMatch und rechnet jeden Kampf; Clients senden nur Absichten
und zeigen den Kampf aus Host-Momentaufnahmen.

- LuneSession (Core/Net): Rollen offline/Host/Gast, sechs Sitze, Lobby,
  Hallo mit Protokollprüfung und Namenskürzung, Beitritt und Wieder-
  einstieg über den Anzeigenamen, private Planung mit Spoof-Schutz,
  Bereit ist verbindlich, Bots planen einmal je Runde, Disconnect gibt
  den Platz an einen Bot (nie Kernverlust), Übernahme verwirft den
  unbestätigten Bot-Entwurf, Revanche hält die Plätze, Hostverlust
  meldet und führt ins Menü zurück.
- Kampfsynchronisation: Beginn mit Einheitenätzen und Gebäude-HP, alle
  0,05 s neue Einheiten und ein Frame (13 Werte je Einheit), späte
  Frames über die Serial verworfen, Gast interpoliert (frame_alpha).
- Transport: LuneLoopback (In-Prozess) für die Tests, LuneTcp + LuneWire
  (Cursor-Codec) für Echtverbindungen statt ENet; ein Socket je Gast.
- Oberfläche: LuneMainMenu (Offline/Hosten/Beitreten, Bund, Lane, Name,
  Adresse, Port) als Startbildschirm, LuneNetPlay als Schale wie
  lune_main.gd. LuneGame leitet Befehle, Rückgängig und Bereit im
  Netzspiel über die Sitzung; Tempo und Pause bestimmt der Host.
- Tests: NetSuite 43/43 (Port von test_lune_net.gd), NetRoundsSuite
  12/12 (Port von net_rounds.py: 5 Runden, Prüfsummen gleich, Gast
  rechnet 0 Schritte, Drop und Wiedereinstieg auf denselben Sitz),
  LuneWireTests Round-trip. EditMode 29/29, PlayMode 13/13, Kerntests
  457/457. Fingerabdrücke der Bot-Partien unverändert.
- Dokumentation: U4-NETWORK (Abnahme, Grenzen), PORT-QA (U4), PORT-STATUS
  (U4 fertig, U5 nächster Schritt), KNOWN-BEHAVIOR-DIFFERENCES.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 16:14:42 +02:00

5.1 KiB
Raw Permalink Blame History

Bekannte Verhaltensunterschiede

Diese Datei führt jedes bekannte Verhalten des Unity-Ports, das von der Godot-Referenz (luneraria/g3, 1b540f2) abweicht oder bewusst gleich falsch bleibt. Jeder Eintrag nennt Ursache, Wirkung, Nachweis und Status. Neue Befunde kommen hier hinein, bevor sie behoben werden.

Legacy defects retained for parity

Diese Fehler der Referenz sind im Port absichtlich nachgebildet. Die Golden-Parität bleibt so erhalten, und Bots und Partien verhalten sich fachlich wie in Godot. Jeder Fehler wird später in einem eigenen Schritt behoben, mit neuer Golden-Referenz und eigenem Commit.

R1 · Bot vergisst die Bossjagd nach einer Champion-Buchung

Ort in der Referenz saumwacht-godot/scripts/luneraria/core/lune_bot.gd, _plan_boss (Zeile 150)
Ort im Port Assets/Luneraria/Core/Simulation/LuneBot.cs, PlanBoss (Kommentar R1)
Ursache Das Bot-Gedächtnis wird von zwei Stellen befüllt. Die Champion-Planung legt einen Eintrag nur mit champion_round an. _plan_boss liest danach memory.bar und memory.sent, die fehlen. GDScript meldet Invalid access to property or key 'bar' und bricht die Funktion ab.
Wirkung Ein Bot, der vor seiner ersten Bossplanung einen Champion gebucht hat, schickt in dieser Partie nie eine Expedition in die Grotte. Das betrifft vor allem das Profil bossjagd. Die Bossjagd der Bots ist dadurch seltener, als die Profile vorsehen.
Nachweis Beim Erzeugen der Golden-Referenzen trat der Fehler in vier Szenarien auf. Der Port liefert in allen 19 Szenarien dieselben Bossentscheidungen (Golden-Bereich „Boss“: 1.559 Werte, 0 Abweichungen).
Status bewusst übernommen (U1, U1.5). Nicht korrigieren, solange U1 als Paritätsreferenz dient.
Korrektur später In einer eigenen Bot- oder Balance-Phase: fehlende Felder mit Standardwerten anlegen (bar = 1,35, sent = 0), neue Golden-Referenz erzeugen und den Unterschied zu dieser Referenz dokumentieren.

Laufzeitunterschiede

F1 · Mono rechnet float32-Zwischenwerte doppelt genau (behoben in U1.5)

Ursache Unitys Mono 6.13 hält float32-Zwischenwerte doppelt genau (erlaubt nach ECMA-335 I.12.1.3). .NET 8 und Godot runden nach jeder Operation.
Wirkung ohne Korrektur Positionen weichen nach 10–60 s um bis zu 0,22 mm ab, die Blickrichtung um bis zu 1,6·10⁻³ rad. In mirror_match verliert eine Einheit in Schritt 599 ihr Ziel, und der Kampf dauert 4,8 s länger. Die Abweichung beeinflusst also Entscheidungen.
Maßnahme Vec2 rundet jeden Zwischenwert explizit auf float32. Keine Regeländerung; .NET-Ergebnisse sind byteidentisch zu vorher.
Status behoben. Im Unity-Editor (Release und Debug) sind alle Golden-Werte bitgleich. CoreIntegrationTests.CoreFloatArithmeticMatchesGodot sichert das ab.
Offen IL2CPP sowie Player unter Windows 11 und Fedora 44 sind noch nicht gemessen (Build-Module fehlen).

Details: U1.5-UNITY.md.

Unity-Szene (U2)

Die Szene ändert kein Verhalten. Der Host treibt den Kern im festen Takt; die Ansichten lesen nur. Die vollständige Bot-Partie (Seed 2) und die Partie ab Runde 21 (Seed 9) liefern in der Szene denselben Fingerabdruck wie der reine Kernlauf. Das gilt auch bei 30, 60 und 120 fps, unbegrenzter Bildrate, Rucklern und erhöhtem Spieltempo (U2-WORLD.md).

Darstellungswerte

Wert Warum kein Regelunterschied
Blickrichtung (LuneUnit.Facing) Der Kern schreibt sie nur (Bewegungsrichtung ab 1 mm Schritt); keine Regel liest sie. Die Darstellung darf sie glätten.
Schriftgewichte (U3D) Das Theme der Referenz deklariert Cantarell 560/700–760 und Cinzel 700, wendet sie aber nie an: SaumwachtTheme.font schreibt variation_opentype = {"wght": …} mit dem String-Schlüssel „wght“, den Godot 4.7.2 ignoriert. G3 zeigt Regular 400, der Port ebenso. Die Rollen bleiben getrennt, damit U5 echte Gewichte vergeben kann (U3-UI.md).

Netzwerk (U4)

Wert Warum kein Regelunterschied
Transport TCP statt ENet Der Host rechnet weiter autoritativ; Clients senden nur Absichten. Kampfrahmen laufen auf demselben Socket und werden über die Serial verworfen (wie unreliable_ordered). Unter Paketverlust kann TCP Head-of-Line-Blocking erzeugen — rein darstellerisch, kein Regelergebnis.
Mehr-Runden-Loopback im Prozess net_rounds.py startet zwei Godot-Prozesse; NetRoundsSuite koppelt zwei LuneSession über LuneLoopback. Protokoll, Prüfsummen, Übernahme und Wiedereinstieg sind dieselben Pfade.

Technische Repräsentation

Klassen statt Dictionaries, stabile Einfügesortierung, 32-Bit-int, der ungenutzte Zufallsgenerator entfällt. Keiner dieser Unterschiede ändert Ergebnisse. Die Liste steht in U1-RULES.md.

Noch nicht gemessen

  • IL2CPP-Player (alle Plattformen).
  • Mono-Player unter Windows 11 (x64) und Fedora 44 (x86_64).
  • Läufe auf x86-64-Prozessoren. Bisher lief alles auf Apple M5 (ARM64).