main wird ohne Konflikte auf diesen Stand vorgerückt (alle Phasen-Branches liegen in einer Linie); Tag stand-2026-10-11. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
65 lines
11 KiB
Markdown
65 lines
11 KiB
Markdown
# Port-Status · Champions of Luneraria in Unity
|
||
|
||
Stand: 11. Oktober 2026 (Hauptstand: `main` = S4, Tag `stand-2026-10-11`; Übersicht [../luneraria/HAUPTSTAND.md](../luneraria/HAUPTSTAND.md)).
|
||
|
||
Referenz ist der Godot-Stand `luneraria/g3` (`1b540f2`) in `../saumwacht-godot`; er wird nicht mehr verändert. Engine: Unity 6.3 LTS (6000.3.20f1), Renderer URP. HDRP ist ausgeschlossen, bis ein Vergleich mit einer echten Szene etwas anderes nahelegt.
|
||
|
||
Zielplattformen sind Fedora 44 und Windows 11; macOS ist die Entwicklungsplattform.
|
||
|
||
| Meilenstein | Zustand | Nachweis |
|
||
| --- | --- | --- |
|
||
| U1 · C#-Simulation | **fertig** (Referenzmeilenstein, `luneraria/u1` = `4d6ed17`): 402/402 Prüfungen, Golden-Parität mit Godot | [U1-RULES.md](U1-RULES.md) |
|
||
| U1.5 · Unity-Integrationsprüfung | **fertig**: Kern im Unity-Editor 402/402 (Release und Debug), Golden bitgleich nach expliziter float32-Rundung in `Vec2`, Editor-Benchmark | [U1.5-UNITY.md](U1.5-UNITY.md) |
|
||
| U2 · Unity-Spielwelt | **fertig**: U2A Blender→FBX-Pipeline (9 Assets geprüft), U2B G1-Karte mit Materialsystem, U2C fester Takt und Ansichten (bildratenunabhängig nachgewiesen), U2D vollständige Bot-Partien sichtbar und gleich dem Kern; danach Batch-Import aller 86 Modelle, Einheiten mit eigenen Modellen | [U2-WORLD.md](U2-WORLD.md) |
|
||
| U3 · G3-HUD portieren | **fertig** (`luneraria/u3`): UI Toolkit, Sichtmodell mit Privatsphäre, menschlicher Sitz, alle HUD-Bereiche, Eingabe und Befehle, Prüfung 718/0, 14 G3-Motive, Spieltest, Leistung mit HUD | [U3-UI.md](U3-UI.md) |
|
||
| U4 · Netzwerk | **fertig** (`luneraria/u4` = `769e622`): LuneSession (Protokoll 4), TCP-Transport, Startbildschirm Host/Join, 43+12 Prüfungen, Mindestumfang M4. Nachtrag (`luneraria/u4-nachtrag`, in U5.3 zusammengeführt): Startbildschirm in der Szene, „Menü“ führt dorthin zurück | [U4-NETWORK.md](U4-NETWORK.md) |
|
||
| U5 · Visuelle Neuausrichtung (Vertical Slice Mid-Lane) | **fertig** (`luneraria/u5` = `2c1686b`, Stufen `luneraria/u5.2`): 6 PBR-Sätze, Surface-Shader mit Albedo/Normal/ORM, Stufen Lane/Rand, Hit- und Turm-VFX, 133/180 fps. **U5.3** (`luneraria/u5.3` = `07fa457`): Gebäude, Boss und Ringborkes Rinde auf PBR (11 Sätze); Bildfehler aus U5 behoben (doppelte Einfärbung, Datenkarten als sRGB, Streifen, bleichender Treffer-Flash, Nebel), Helligkeit und Grün wieder auf U3-Niveau **U5.4** (`luneraria/u5.4` = `4883d95`): Surface-Materialien für alle 146 Figurenmaterialien (Metalle metallisch, Randlicht, Struktur in den Porträts), SSAO (abschaltbar), Leistung −13 % Karte / −16 % Mid **U5.5** (`luneraria/u5.5` = `dd78c8d`): **Pilot** (`c386206`): Meshy-Figur für den Kohlenbeißer `g01` (Pipeline `tools/meshy/`, UV-Material mit Lava-Glut, Schatten ohne Normalen-Versatz), GPU-Batched-Skinning, Figuren-Stress −21 % Mid / −13 % Karte gegenüber Phase-4; **Lane-Fassung** (`f0d1e93`): 5.000-Dreiecke-LOD, Abstand −10 % Mid / −2 % Karte; **Schlackenklaue** `g02` (`714d0c6`) als zweite Meshy-Figur, −11 % Mid / −1 % Karte; **Schlackenwacht** `g03` (`4e2b6bc`), −8 % Mid / 0 % Karte; **Funkenlanze** `g05` mit Lanze als eigenem Modell (`eddf49d`), +15 % gegenüber der Phase-18-Figur; **Glasballiste** `g06` als Maschine mit übernommenem Skelett (`aa77d0e`); **Aschenwerfer** `g07` (`91ea297`), −11 % Mid / +2 % Karte; **Kraterrufer** `g08` (`eb8a537`), −9 % Mid / +10 % Karte; **Herdhüter** `g09` (`024937c`), −4 % Mid / +6 % Karte; **Sonnenesse** `g10` (`02c8839`), +11 % Mid / +15 % Karte; **Basaltbastion** `g04` (`9e253f4`): alle zehn Glutpakt-Truppen sind Meshy-Figuren | [U5-VISUAL.md](U5-VISUAL.md) |
|
||
| H1 · Sylvara | **fertig** (`luneraria/h1-sylvara`): erste spielbare Heldin nach dem Port mit Ultimate-Auslöser in der Planung und Skin-System (Blutmond); Referenzpartien unverändert | [../luneraria/H1-SYLVARA.md](../luneraria/H1-SYLVARA.md) |
|
||
| S1 · Strategie-Regeln | **fertig** (`luneraria/s1-strategie`): Söldner-Einkommen (Legion TD 2), Kasernen und Rückkauf (Dota 2), Mondsegen (League of Legends) hinter dem Regelschalter „Erweitert“ (Standard im Spiel); Referenzregeln für Tests unverändert | [../luneraria/S1-STRATEGIE.md](../luneraria/S1-STRATEGIE.md) |
|
||
| S2 · Glyphe, Rezepte, Ancient | **fertig** (`luneraria/s2-strategie`): Glyphe (Dota 2), Item-Rezepte (Dota 2/LoL), Ancient-Stufen (Legion TD 2), Grottenjagd der Bots; hinter dem Regelschalter „Erweitert“ | [../luneraria/S2-STRATEGIE.md](../luneraria/S2-STRATEGIE.md) |
|
||
| S3 · Bots, Neutrallager, Fog of War | **fertig** (`luneraria/s3-strategie`): frühe Bot-Helden und Rotationsfehler behoben, Neutrallager mit LoL-Buffs, Fog of War mit Spähern (Dota 2) und Aufklärung in der Planung; hinter dem Regelschalter „Erweitert“ | [../luneraria/S3-STRATEGIE.md](../luneraria/S3-STRATEGIE.md) |
|
||
| H2 · Brunhild | **fertig** (`luneraria/h2-brunhild`): zweite Heldin des Champions-Konzepts mit Markierung und Betäubung, Skin Eiswalküre; Referenzpartien unverändert | [../luneraria/H2-BRUNHILD.md](../luneraria/H2-BRUNHILD.md) |
|
||
| S4 · Feinschliff | **fertig** (`luneraria/s4-feinschliff`): Betäubung sichtbar, Nebel im Gelände, Glyphe und Betäubung für Gäste | [../luneraria/S4-FEINSCHLIFF.md](../luneraria/S4-FEINSCHLIFF.md) |
|
||
|
||
QA je Meilenstein: [PORT-QA.md](PORT-QA.md).
|
||
|
||
Bekannte Verhaltensunterschiede, auch die bewusst übernommenen Referenzfehler: [KNOWN-BEHAVIOR-DIFFERENCES.md](KNOWN-BEHAVIOR-DIFFERENCES.md).
|
||
|
||
## Offene Voraussetzungen
|
||
|
||
- **Build-Module für die Zielplattformen fehlen:** Windows Build Support (Mono) und Linux Build Support (Mono), optional Linux IL2CPP und Linux Dedicated Server. Installation nur nach Freigabe (Details in U1.5-UNITY.md).
|
||
- Kerntests und Player auf Windows 11 und Fedora 44 stehen deshalb aus; gemessen ist bisher der macOS-Player.
|
||
|
||
## Entscheidungen
|
||
|
||
- **Regelkern ohne Unity** (`Luneraria.Core`, `noEngineReferences`). Unity wird Adapter und Präsentation.
|
||
- **Verhaltensgleichheit statt Bitgleichheit.** Verglichen wird mit dokumentierten Toleranzen; gemessen wurde auf dem Mac trotzdem Abweichung 0, in .NET 8 und im Unity-Editor.
|
||
- **Explizite float32-Rundung in `Vec2` (U1.5).** Unitys Mono rechnet float32-Zwischenwerte doppelt genau. Das änderte in einem Szenario eine Zielentscheidung, deshalb ist eine Toleranz hier nicht begründbar. Die Casts erzwingen Godots float32-Semantik auf jeder Laufzeit; Regeln und .NET-Ergebnisse bleiben unverändert.
|
||
- **Tabellen** einmal aus Godot erzeugt (`tools/port/gen_content.py`); danach ist `ContentData.cs` die gepflegte Quelle.
|
||
- **Referenzfehler R1** im Bot-Gedächtnis ist bewusst übernommen (Parität) und für eine spätere Bot-Phase vorgemerkt.
|
||
- **Geplante Helden** (Lucy, Ghaliga, Siegfried, Feena) stehen im Datenmodell, sind aber inaktiv, bis eine Heldenphase ihre Regeln umsetzt.
|
||
- **Neue Helden ergänzen, statt zu ersetzen (H1):** Die drei Referenzhelden bleiben, neue Helden folgen ihnen in `ContentData.Heroes` (`ReferenceHeroes` hält die Godot-Liste für den Inhaltsvergleich). Ultimates lösen über eine in der Planung gewählte Regel aus, Skins sind kosmetische Planungswahl. Bot-Profile neuer Helden stehen außerhalb der Seed-Rotation.
|
||
- **Assets:** Blender-Quellen und Generatoren sind die Quelle. Ein zentraler, reproduzierbarer Blender-Export erzeugt FBX für Unity; GLB nur, wo keine bessere Quelle existiert (U2A).
|
||
- **Prozedurale Welt gebacken (U2B):** Gelände und Vegetation der G1-Karte hängen an Godots Rauschen und Zufallsgenerator; ein Godot-Werkzeug backt die Welt aus dem Referenzgenerator, Unity baut daraus die Szene. U5 bekommt eine neue Weltquelle.
|
||
- **Koordinaten:** Unity = (−x, Höhe, y) der Kartenpunkte; FBX-Pipeline, Welt und Kamera nutzen dieselbe Umrechnung, das Bild entspricht Godots.
|
||
- **Host-Schleife (U2C):** fester Takt mit Akkumulator; die Bildrate bestimmt nur die Zahl der Schritte je Bild. Nachweis über Fingerabdrücke der Partie.
|
||
- **Schriftgewichte wie in G3 (U3D):** Die Referenz deklariert Gewichte, wendet sie aber nie an (String-Schlüssel „wght“ wird von Godot ignoriert). Der Port zeigt wie G3 Regular 400. Die Stilrollen bleiben getrennt, damit U5 echte Gewichte vergeben kann.
|
||
- **Netzwerk über TCP (U4):** Die Referenz nutzt ENet; der Port nutzt TCP mit `LuneWire` (Nachrichten) und binären Kampfrahmen. Späte Rahmen werden über die Serial verworfen wie bei `unreliable_ordered`. Offline ist ein lokaler Host mit Bot-Plätzen (`LuneSession.HostOffline`).
|
||
- **PBR-Texturen aus Blender (U5):** `tools/blender/bake_pbr.py` backt nahtlose Albedo-/Normal-/ORM-Sätze (Torus-Mapping). Der Surface-Shader legt sie triplanar über die Godot-Weltfarben.
|
||
- **PBR-Karten als Struktur um die Godot-Farben (U5.3):** Albedo und Rauigkeit der gebackenen Sätze werden durch ihren Mittelwert geteilt. Die Godot-Farben und -Rauigkeiten bleiben der Durchschnitt, die Karten liefern Struktur; Normal- und ORM-Karten importieren als Daten (nicht sRGB).
|
||
- **SSAO standardmäßig an (U5.4, Entscheidung 9. Oktober 2026):** Umgebungsverdeckung nach den opaken Objekten in halber Auflösung; in den Optionen abschaltbar. Kostet auf dem M5 9–13 % Bildrate.
|
||
- **Stufen statt flächiger Zielqualität (U5.2, Entscheidung 2. Oktober 2026):** Der Lankorridor (22 m um Mittellinien, Gebäude und Grotte) trägt die vollen PBR-Sätze; Berge, Kluft und ferner Hintergrund behalten Farbe + Steinschicht (`LuneZones`, Surface `_Quality`, `TerrainEdge`). Gebäude, Einheiten, Wege und Wasser bleiben Lane-Stufe.
|
||
- **Modelle direkt in Git** (1. Oktober 2026): Auch die Modelle des Batch-Imports liegen wie die U2A-Modelle im Repository, ohne Git LFS. Keine Datei ist größer als 40 MB; das Repository wächst auf etwa 240 MB.
|
||
- **Projektort außerhalb von iCloud Drive** (1. Oktober 2026): Der Arbeitsordner `TowerDefense` zieht von `~/Documents/Projekte` nach `~/Developer`. iCloud Drive synchronisierte `~/Documents` und legte Konfliktkopien an, die einen Player unbrauchbar machten (U2-WORLD.md, Batch-Import). Der Schutz in `LunePlayerBuild` bleibt.
|
||
|
||
## Arbeitsweise
|
||
|
||
- Ein Zweig je Meilenstein: `luneraria/u1`, `luneraria/u1.5`, `luneraria/u2`, … Pilotzweige tragen einen Suffix (`c386206`). Nach jedem Meilenstein kommen Tests, Bild, Leistung, bekannte Unterschiede und ein Commit.
|
||
- Werkzeuge:
|
||
- `tools/run_core_tests.sh` (Kern mit .NET).
|
||
- Unity Test Runner: EditMode (Kern, Integration, Bildraten-Logik) und PlayMode (Szene bei echten Bildraten, Vertical Function Test).
|
||
- `CoreBatch`, `LuneAssetVerifier`, `LuneWorldBuilder`, `LuneWorldCapture`, `LunePlayerBuild` im Batchmodus.
|
||
- `tools/blender/export_fbx.sh` (Assets) mit dem Manifest aus `tools/blender/make_manifest.py`, `tools/godot-golden/world_export.gd` (Weltbake).
|
||
- `LUNE_EVIDENCE=<Ordner>` leitet die Nachweise der PlayMode-Tests nach `docs/port/logs/<Ordner>` und `docs/port/screenshots/<Ordner>` um; ohne die Variable schreiben sie in die Ordner ihres Meilensteins.
|
||
- `tools/godot-golden/run_godot.sh` (Godot-Referenz).
|
||
- `tools/dotnet/Luneraria.Core.Bench` und `CoreBatch.Benchmark` (Leistung).
|