champions-of-luneraria/docs/port/U3-UI.md
Martin Stickelbroeck 66867f3332 U3D Abnahme: Prüfung, Feld um das HUD, Bilder, Leistung
Das G3-HUD ist abgenommen; der Meilenstein U3 ist damit fertig.

- Prüfung (Port von verify_g3, Teile A–H plus I): 718 Prüfungen ohne
  Fehler. Teil I prüft die Feld-Darstellung um das HUD (U3-Zugabe aus
  dem Motivvergleich): Aufstellungsflächen, Grotteneingang, ruhender
  Boss, Namensschilder, Eigentümer-Ring, Ancient-Balken.
- Feld um das HUD: Namensschilder für Helden (mit Stufe), Angriffs-
  champions und den eingesetzten Boss („für Blau“), Eigentümer-Ring,
  Ancient-Balken bei Schaden, ruhende Schlundkrone auf dem Podest,
  eigener Grotteneingang, Aufstellungsflächen als eigene Objekte.
- Schriften korrigiert: Die Referenz deklariert Cantarell 560/700–760
  und Cinzel 700, wendet die Gewichte aber nie an (variation_opentype
  mit dem String-Schlüssel „wght“ wird von Godot ignoriert). G3 zeigt
  Regular 400, der Port ebenso — Cinzel-Regular statt Bold, keine
  Kontur zur Aufdickung. Laufweite aus spacing_glyph umgerechnet;
  dunkler Saum als Schatten statt TextCore-Kontur.
- Werkzeuge: HudViewsTests (14 G3-Motive), HudPlaytest (Spieltest über
  die echte Oberfläche per Befehlsdateien), ui_ms_per_frame im
  LuneBenchmark. Layout folgt den echten Panelhöhen, Kamera startet wie
  Godot _ready auf der eigenen Lane.
- Tests: EditMode 23/23, PlayMode 13/13, Kerntests 402/402, Verify
  718/0. Fingerabdrücke der Bot-Partien unverändert (DCE95C96556F3A1A,
  7B8E43AEFC0D60C5).
- Bilder: 14 Motive bei 1920×1080, Auflösungen 1152×720 bis 2560×1440,
  Prüf-Schlüsselbilder, Spieltest-Screenshots.
- Leistung (macOS-Player mit HUD, 116 Einheiten): 169 fps Übersicht,
  218 fps Mid nah; HUD-Skripte 0,090 bzw. 0,078 ms je Bild.
- Dokumentation: U3-UI (U3D, Schriftbefund), PORT-QA (U3), PORT-STATUS
  (U3 fertig, U4 nächster Schritt), KNOWN-BEHAVIOR-DIFFERENCES.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 12:55:06 +02:00

246 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# U3 · G3-HUD portieren
Stand: 1. Oktober 2026.
| Teil | Inhalt | Zustand |
| --- | --- | --- |
| U3A | Entscheidung UI Toolkit, Sichtmodell mit Privatsphäre, menschlicher Sitz, Theme-Grundlagen (Farben, Platten, Symbole, Schriften) | **fertig** |
| U3B | Komponenten, Porträts, Tooltip, alle HUD-Bereiche, Optionen, Partieende | **fertig** |
| U3C | Eingabe und Befehle: Tasten, Kamera-Ziele, Auswahl im Feld, Bereit-Sperre, Planungsvorschau | **fertig** |
| U3D | Prüfung (Teile A–H von `verify_g3`), Spieltest über die echte Oberfläche, Bilder, Leistung | **fertig** |
Funktionale Referenz ist das G3-HUD aus Godot (`../saumwacht-godot/docs/luneraria/G3-HUD.md`, Commit `1b540f2`). Es wird übertragen, nicht neu erfunden.
## Zu übertragen
- Ancient-Anzeige, Welle und Phase, Gold.
- Drei Lanes mit Bedrohung und Türmen, Teammitglieder.
- Einheitenkarten, Armee.
- Held mit Stufe, Erfahrung, drei Itemslots und Talenten.
- Angriffschampions, nächste Welle, Bossstatus.
- Minimap, Bereit-Zustand, Tooltips, Ereignisse.
- Datenzugang über ein Sichtmodell mit denselben Privatsphäre-Regeln wie `LuneHudModel`.
Die geplanten Helden (`PlannedHeroes`) mit Command-Menü für Ultimates sind im Layout vorzusehen.
Der Bestand in Godot umfasst rund 5.100 Zeilen:
- `lune_hud.gd` (1.058 Zeilen),
- `lune_hud_model.gd` (333),
- 22 Komponenten,
- Theme (`lune_ui_theme.gd`, `forged_style.gd`) und Vektorsymbole (`lune_glyphs.gd`),
- Minimap, Porträt-Cache, Optionen,
- die Verdrahtung in `lune_game.gd` (Befehle, Tasten, Kamera, Auswahl).
Das Hauptmenü (`lune_menu.gd`, mit Netzwerk-Host/Join) ist der Startbildschirm des Spiels und gehört nicht zum HUD.
## Entscheidung: UI Toolkit
Vor Beginn war eine kurze technische Bewertung gefordert, dann **ein** System als Hauptlösung. Gewählt ist **UI Toolkit**; uGUI kommt im HUD nicht vor.
| Kriterium | UI Toolkit | uGUI |
| --- | --- | --- |
| Aufbau wie in Godot (Komponenten im Code, Container) | `VisualElement` und Flexbox entsprechen Godots Box-Containern; Komponenten sind C#-Klassen | GameObjects mit RectTransform und Layout-Gruppen; jede Zeile ein Objekt, Layout-Gruppen teuer beim Neuaufbau |
| Eigenes Zeichnen (Godot `_draw`: Platten, 50 Symbole, Balken, Minimap) | `generateVisualContent` mit `Painter2D` (Pfade, Bögen, konkave Flächen) und eigenen Meshes (Verlauf) | eigene `Graphic`-Klassen; konkave Flächen müsste man selbst triangulieren |
| Skalierung wie Godot (`canvas_items`, `expand`, Basis 1600×960) | `PanelSettings`: Scale With Screen Size, Expand, 1600×960 ergibt bei 16:9 dieselbe logische Fläche 1706×960 | `CanvasScaler` gleichwertig |
| Prüfbarkeit im Batchmodus | Panel rendert in eine RenderTexture beliebiger Größe; Elemente per Name und Pick abfragbar | Canvas über eine Kamera rendern; Abfragen über GameObjects |
| Tooltips, Weltelemente | Laufzeit-Tooltip selbst bauen (Godot hatte ohnehin einen eigenen); Weltbalken sind schon Meshes | eingebaut nur im Editor; Weltraum-Canvas reif |
| Empfehlung in Unity 6 | empfohlenes System für neue Laufzeit-Oberflächen | weiter unterstützt, älterer Ansatz |
**Probe vor der Entscheidung** (`Tests/UI/PlayMode/UiToolkitProbeTests`, Bild `screenshots/u3/00-ui-toolkit-probe.png`):
- Ein Panel rendert im Batchmodus in eine 1920×1080-Textur.
- Die Position stimmt mit Godot überein: 12 logische Pixel ergeben 13,5 Pixel bei 1920×1080.
- Die Platten mit Fasen, Verlauf, Innen- und Kantenlinie entstehen korrekt.
- Alle 50 Symbole zeichnen sich, auch die konkaven (Mondsichel, Turm, Kreuz).
- Die Schriften kommen aus Godots variablen Fonts.
## U3A · Grundlagen
### Sichtmodell und Privatsphäre
Portiert nach `Assets/Luneraria/UI/Model/`, Verhalten wie in Godot:
| Datei | Inhalt |
| --- | --- |
| `LuneHudModel.cs` | einziger Datenzugang des HUD: Phase, eigener Sitz (Gold, Entwurf, Rückgängig, Buchungen), Gebäude, Ancients, Mitspieler, Lanes, Boss, nächste Welle, öffentlicher Digest |
| `LuneLaneThreat.cs` | Lane-Bedrohung RUHIG · UMKÄMPFT · UNTER DRUCK · KRITISCH, nur aus öffentlichem Zustand (Turm-HP, Positionen, Ankündigungen) |
| `LuneStats.cs` | Wertzeilen und Tooltip-Inhalte aus den echten Definitionen (Schaden je Treffer, Tempo, Reichweite, Rüstungsmatrix) |
Die Privatsphäre-Regeln gelten unverändert:
- Gold, Entwurf, Rückgängig und neue Buchungen gibt es nur für den eigenen Sitz.
- Von anderen sieht man Name, Lane, Bereitschaft, Mensch/Bot/offline und den bestätigten Helden.
- Lanes, Gebäude, Boss und Wellen kommen aus öffentlichem Zustand.
Eine Abweichung: Im öffentlichen Digest (Testhilfe) steht beim Boss die öffentliche Claim-Lane. Godot nahm dort auch die private Lane-Wahl des Wählenden auf, sodass der Digest für ihn vom Bild der anderen abweichen konnte.
### Menschlicher Sitz
- `LuneMatchRunner` und `LuneMatchDriver` haben einen menschlichen Sitz bekommen (`HumanSlot`).
- Die Bots planen nur die anderen fünf Sitze. Die Planung wartet auf „Bereit“ des Menschen, wie offline in Godot (`lune_game.gd`), und nach der Abrechnung beginnt sofort die nächste Planung.
- Tempo (1×, 2×, 4×) und Pause wirken nur im Kampf.
- Bot-Partien (`HumanSlot = -1`) laufen unverändert. Die Bildraten-Tests prüfen das mit denselben Fingerabdrücken.
### Theme, Symbole, Schriften
- `Theme/LuneUiTheme.cs`: alle Farben aus `lune_ui_theme.gd` und dem Saumwacht-Menütheme, Zahlenformate (12.000, Dezimalkomma).
- `Theme/LunePlates.cs`: die Platten aus `forged_style.gd` (Fase, Verlauf, Innenlinie, Kante, Schatten, Fokusring).
- `Theme/LuneGlyphs.cs`: alle 50 Symbole aus `lune_glyphs.gd` mit `Painter2D`.
- Schriften: Cantarell und Cinzel als statische SDF-Atlanten (`LuneUiAssetsBuilder`, `Settings/LuneUi.asset`, Lizenz OFL).
- Unitys Textsystem hat keine Gewichtsachse. FreeType lädt die benannten Instanzen der variablen Fonts über den Face-Index (Instanz ≪ 16).
- In Cantarell fehlt „★“ (Godot nahm eine Ersatzschrift). Das HUD zeichnet den Stern als Symbol.
- **Gewichte (U3D korrigiert):** Das Theme der Referenz deklariert Cantarell 560/700–760 und Cinzel 700, wendet sie aber nie an. `SaumwachtTheme.font` schreibt `variation_opentype = {"wght": weight}` mit dem *String*-Schlüssel „wght“; Godot 4.7.2 ignoriert den (gemessen: gleiche Fortschritte bei 400, 560 und 700; nur der Integer-Tag ändert sie). G3 zeigt beide Fonts in ihrer Grundinstanz Regular 400, und so auch der Port. Die Rollen (`LuneFace`) bleiben getrennt, damit U5 echte Gewichte vergeben kann.
- **Laufweite und Konturen (U3D):** Godots `spacing_glyph` (Pixel je Glyph) wird als UI-Toolkit-`letterSpacing` umgerechnet (Hundertstel der Schriftgröße). Titel, Welle und Gold bekommen Godots dunklen Saum (`outline_size`) als weichen Schatten statt einer TextCore-Kontur — die Kontur liegt auf beiden Seiten der Glyphenkante und frisst die dünnen Striche der Regular-Schnitte, Godots Outline wächst nur nach außen.
### Prüfung U3A
| Test | Ergebnis |
| --- | --- |
| EditMode gesamt | 23/23, davon 12 neue: öffentliches Bild für alle sechs Sitze gleich (Planung und Kampf), fremde Entwürfe (Held, Champion-Buchung) bis zum Kampf unsichtbar, private Boss-Lane-Wahl, Lane-Bedrohung bei Turm-HP und Ankündigungen, Einheitenzahlen je Lane, Bosszustände, nächste Welle gleich der Regelwelle (Runden 1–24), Bereit-Sperre, Zahlenformate, menschlicher Sitz, Bot-Partie unverändert |
| PlayMode-Probe | UI Toolkit rendert im Batchmodus (siehe oben) |
## U3B · Komponenten und Bereiche
Alles liegt unter `Assets/Luneraria/UI/Hud/` und ist aus Godot übertragen:
| Unity | Godot | Inhalt |
| --- | --- | --- |
| `LuneHud.cs` | `lune_hud.gd` | die fünf Bereiche, Synchronisierung (10 Hz Planung, 5 Hz Kampf, Minimap 10 Hz, Ereignisse 4 Hz), UI-Größe (mindestens 1560 × 880 logische Pixel), Ereignis-Erkennung aus öffentlichem Zustand, Tooltips |
| `LuneUi.cs`, `LuneElements.cs` | `lune_ui_theme.gd`, `status_badge.gd`, `hp_bar.gd`, `tower_indicator.gd`, `tab_bar.gd`, `lune_glyph.gd` | Textvarianten, Platten- und Knopfvarianten, Grundelemente |
| `LuneComponents.cs` | `resource_display.gd`, `team_panel.gd`, `unit_card.gd`, `army_chip.gd`, `item_slot.gd`, `event_feed.gd`, `modal_panel.gd` | Gold, Team, Kaufkarten, Armee, Items, Ereignisse, Fenster |
| `LuneLanePanels.cs` | `lane_indicator.gd`, `boss_indicator.gd`, `next_wave_panel.gd` | Lanes, Bossgrotte, nächste Welle |
| `LuneArmyPanels.cs` | `champion_panel.gd`, `unit_detail.gd` | Angriffschampions, ausgewählte Einheit |
| `LuneHeroPanels.cs` | `hero_card.gd`, `hero_detail.gd` | Heldenkarte, Heldenfenster (Anwerben, Werte, Items, Talente) |
| `LuneMinimap.cs` | `lune_minimap.gd`, `lune_minimap_overlay.gd` | Minimap mit eigener Ebene für den Kamerarahmen |
| `LunePortraits.cs` | `portrait_cache.gd`, `portrait_rect.gd` | Porträts aus den echten Modellen, einmal gerendert |
| `LuneTooltip.cs` | `lune_tooltip.gd` | der eine Tooltip |
| `LuneSettingsPanel.cs`, `LunePreferences.cs` | `lune_settings.gd`, `preferences.gd` | Optionen (F1) und gespeicherte Einstellungen |
Die offenen Punkte aus G3 sind umgesetzt:
- **Champion-Etikett:** „1 WELLE“ steht als Band am unteren Porträtrand und verdeckt die Köpfe nicht mehr.
- **Typ-Symbole:** Schadens- und Rüstungstyp stehen als farbige Symbole auf den Einheitenkarten. Die Farben gleichen der Wellenvorschau: Ein Schadenstyp hat die Farbe der Rüstung, gegen die er 130 % trifft (Legion-TD-Prinzip).
- **Armeewert:** Die Summe des Einsatzes steht in der Armeezeile („Wert 185“).
- **Helden auf der Minimap:** kleine Porträts im Goldring statt Punkten, der eigene Held mit weißem Ring (Dota-Prinzip).
Die Heldenkarte hat einen reservierten Befehlsplatz für die Ultimates der geplanten Helden (`PlannedHeroes`, Auslöser `Command`). Er bleibt verborgen, solange keiner dieser Helden spielbar ist.
## U3C · Eingabe und Befehle
`Assets/Luneraria/UI/Game/LuneGame.cs` ist das Gegenstück zur HUD-Seite von `lune_game.gd`.
- **Befehle:** Die Befehle des Menschen laufen über dieselbe Schnittstelle wie die der Bots (`LuneMatch.Submit`). Jeder Befehl meldet sein Ergebnis im HUD zurück.
- **Bereit:** Bereit geht an die Host-Schleife; der Kampf beginnt, sobald alle bereit sind. Nach einem Kampf ist Bereit eine Sekunde lang gesperrt.
- **Tasten wie in G3:**
- 1–5 kaufen, Leertaste meldet Bereit (im Kampf: Pause), P pausiert.
- Tab wechselt die Lane, F2–F4 springen zu Top, Mid und Bottom.
- B, G und H zeigen den eigenen Ancient, die Grotte und den eigenen Helden.
- R setzt die Kamera auf die eigene Lane zurück.
- F1 öffnet die Optionen, M schaltet den Ton, F11 das Vollbild, Esc schließt Fenster und Auswahl.
- **Kamera und Maus:**
- Klicks auf Lanes, Ereignisse, Banner, Bossgrotte und Minimap bewegen die Kamera.
- Über HUD-Flächen zoomt das Mausrad die Welt nicht.
- Ein Linksklick im Feld wählt eine eigene Figur (innerhalb von 34 px).
- **Planung:** Die eigene Entwurfsarmee steht in ihrer Formation. Die eigenen Aufstellungsflächen leuchten; Lanes mit eigenen Einheiten sind hervorgehoben.
- **Optionen:** Sie pausieren einen laufenden Kampf offline.
- **Menü:** Ein Hauptmenü gibt es im Unity-Port noch nicht. „Menü“ fragt deshalb nach und beendet das Spiel.
Bot-Partien (Tests, Benchmark) laufen unverändert; der Spielcontroller folgt dem Sitz der laufenden Partie. In der Szene ersetzt der Spielcontroller die U2-Debug-Anzeige.
Die Szenen- und Bibliotheksbauer arbeiten jetzt idempotent:
- Animator-Controller und Post-Processing-Profil werden an Ort und Stelle aktualisiert.
- Vorher erzeugte jeder Szenenbau neue interne IDs in 15 Dateien, obwohl der Inhalt gleich blieb.
- Die Szene selbst entsteht weiter bei jedem Bau neu; Unity vergibt dabei neue Objekt-IDs.
- Zwei Bauten hintereinander ergeben inhaltlich dieselbe Szene. Ersetzt man die IDs durch Platzhalter, sind alle 2840 Objekteinträge gleich; nur ihre Reihenfolge in der Datei ändert sich, weil Unity nach ID sortiert.
## U3D · Prüfung und Abnahme
### Prüfung (Port von `verify_g3`, Teile A–I)
`HudVerifyTests` zählt jede Prüfung und schreibt die Summen nach `tools/out/hud-verify-*.txt`. Die Referenz `verify_g3` der Godot-Seite zählt 715 Prüfungen; der Port hat denselben Umfang plus Teil I (Feld um das HUD, U3-Zugabe).
| Teil | Inhalt | Prüfungen | Fehler |
| --- | --- | ---: | ---: |
| A | Layout 1152×720 … 2560×1440 und Ultrawide, UI-Skalen 90–130 % | 585 | 0 |
| B | Partiestatus: Ancients, Türme, Lanes, Wellen mit zwei und drei Ziffern, nur eigenes Gold | 21 | 0 |
| C | Held, Items, Talente, normale Einheiten (ohne Itemslots), Lane-Befehle mit Grottenwarnung | 23 | 0 |
| D | Angriffschampions (zeitlich), Bossgrotte in allen Zuständen, Lane des Wählenden, Banner | 16 | 0 |
| E | Bereit-Sperre, Bots, Privatsphäre, abgebrochener Menschensitz | 17 | 0 |
| F | Eingabe: Minimap, Lane-Klicks, Tasten, Feldklicks, kein Klick-Durchgriff, Tooltips | 18 | 0 |
| G | Ereignisse, kritische Warnungen, Bewegung reduzieren | 14 | 0 |
| H | Aktualisierungsraten, Porträt-Cache | 5 | 0 |
| I | Feld (U3-Zugabe): Aufstellungsflächen, Grotteneingang, ruhender Boss, Namensschilder, Eigentümer-Ring, Ancient-Balken | 19 | 0 |
| **Summe** | | **718** | **0** |
Dazu EditMode 23/23 (Kern 402 Prüfungen, Sichtmodell, Bildraten-Logik) und PlayMode 13/13 (Szene bei echten Bildraten, Vertical Function Test, Capture, Verify A–I, UI-Toolkit-Probe). Die Bildwerkzeuge `HudViewsTests` und der Spieltest `HudPlaytest` sind `Explicit` und laufen nur gezielt. Fingerabdrücke der Bot-Partien unverändert: Seed 2 `DCE95C96556F3A1A`, Seed 9 ab Runde 21 `7B8E43AEFC0D60C5`.
### Bilder
| Ordner | Inhalt |
| --- | --- |
| `screenshots/u3/motive-1920x1080/` | die 14 G3-Motive (`HudViewsTests`, Port von `g3_views.gd`): Planung, Held, Items, Einheit, Champion, Boss verfügbar/angekündigt, Kampf Top/Mid/Bottom, eigener und gegnerischer Ancient kritisch, Turm zerstört, große Kampfansicht |
| `screenshots/u3/pruefung/` | Schlüsselbilder der Teile B–F (Status, Held, Items, Einheit, Champions, Boss, Tooltip) |
| `screenshots/u3/aufloesungen/` | Kampf bei 1152×720, 1280×720, 2560×1080, 2560×1440 (Teil A) |
| `screenshots/u3/r1-*.png`, `r2-*.png` | Spieltest über die echte Oberfläche: Lane-Tooltip, Kampfbeginn, Pause, Karten-Tooltip, Kampf Bottom |
Die 14 Motive liegen auch als JPEG bei 1280×720, 2560×1080 und 2560×1440 (Repository-Größe). Vergleichsbilder der Referenz: `../saumwacht-godot/docs/luneraria/screenshots/`.
### Spieltest über die echte Oberfläche
`HudPlaytest` (Port von `g3_playtest.gd`) treibt die echte Partie nur über Eingaben: Klicks an Pixelkoordinaten von 1920×1080, Tasten, Zeigerbewegungen für Tooltips. Ein Tester schreibt Befehlsstapel nach `/tmp/lune_play/cmd-N.txt` und bekommt danach einen Screenshot zurück; der Protokoll aller Befehle mit Runde und Phase steht in `logs/u3/playtest-log.txt`.
Geprüft in einem Lauf über drei Runden: Lane-Tooltip in der Planung, Bereit und Kampfbeginn, Pause im Kampf (P), Karten-Tooltip, Tastenkauf (4), Lane-Wechsel per F3/F4 und Kamera nach Bottom. Der Port hat noch kein Hauptmenü; der Spieltest startet deshalb in der Partie der G1-Szene.
### Leistung
**Player** (macOS, Mono, Release; Apple M5, Metal; 1920 × 1080 im Fenster, VSync aus): Seed 9 in Runde 21, Spieltempo 1×, gemessen ab 10 s Kampf mit `LuneBenchmark`. Die Szene trägt seit U3 das HUD (Sitz 1 der Bot-Partie); `ui_ms_per_frame` zählt die HUD-Skripte (Tick des Panels plus Spielcontroller).
| Ansicht | Einheiten | fps (Mittel) | Bildzeit Median | p95 | Sim | Views | **UI** | Hauptthread (Mittel/p95) |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- |
| ganze Karte (Zoom 64) | 116 | 169 | 4,60 ms | 13,05 ms | 0,094 ms | 0,309 ms | **0,090 ms** | 2,77 / 3,94 ms |
| Mid-Lane nah (Zoom 22) | 63 | 218 | 3,90 ms | 9,60 ms | 0,044 ms | 0,332 ms | **0,078 ms** | 2,35 / 3,06 ms |
Das HUD kostet unter 0,1 ms je Bild und liegt damit unter Simulation und Ansichten. Gegenüber den U2D-Läufen ohne HUD (158–160 bzw. 205–207 fps) ist die Bildrate im Rahmen der Laufstreuung; die Ausreißer beim Present (p95 10–13 ms) sind kürzer als in den früheren U2D-Spannen (18–26 ms), ohne dass sich daran etwas geändert hätte — das bleibt Laufstreuung und offene U5-Frage.
Rohdaten: `logs/u3/player-benchmark-macos.json`. Befehle siehe [U2-WORLD.md](U2-WORLD.md#leistung) (Build `LunePlayerBuild.BuildMac`, Lauf mit `-luneBenchmark`).
### Feld um das HUD (Zugabe aus dem Motivvergleich)
Der Vergleich der 14 Motive mit der Referenz brachte Darstellungen hervor, die zum G3-Bild gehören, aber noch nicht im Port standen:
- **Namensschilder** (`LuneFieldTags`): Helden mit Stufe in Heldengold, Angriffschampions und der Boss in der hellen Teamfarbe. Ein eingesetzter Boss nennt, für wen er kämpft („SCHLUNDKRONE · für Blau“) — G3s Antwort auf die Farbnähe seiner Kristalle und Blaus Armeen. Feste Bildschirmgröße wie Godots `fixed_size`-Schilder, hinter allen HUD-Bereichen, ohne Maus.
- **Eigentümer-Ring** am eingesetzten Boss in der Teamfarbe.
- **Ancient-Balken** über den Ancients, solange sie beschädigt stehen (3,4 m breit, 11,2 m hoch, kameragerichtet).
- **Ruhende Schlundkrone** auf dem Podest, solange die Grotte offen ist und kein Kämpfer dort steht (`lune_grotto_view.gd`), neutral, in ihrem Idle-Clip. Die Lichtzustände der Grotte (Runen, Kristalle, Funken) sind noch nicht übertragen.
- **Grotteneingang** der eigenen Seite als Ring, solange die Grotte offen ist.
- **Aufstellungsflächen** als eigene Objekte (vormals nur Renderer-Sichtbarkeit), beleuchtet, wenn die Lane eigene Einheiten hat.
### Befunde und Korrekturen
| Befund | Maßnahme |
| --- | --- |
| Godot wendet die deklarierten Schriftgewichte nie an (String-Schlüssel „wght“ wird ignoriert) | Port zeigt wie G3 Regular 400; `Cinzel-Bold` ersetzt durch `Cinzel-Regular`; Rollen bleiben für U5 |
| TextCore-Kontur frisst die dünnen Striche der Regular-Schnitte | Godots dunkler Saum als weicher Schatten; Laufweite aus `spacing_glyph` umgerechnet |
| Layout der rechten Spalte und des Banners nutzte geschätzte Höhen | Folgt den echten Höhen von Top-Panel, Bottom-Leiste und Systemzeile (`GeometryChangedEvent`) |
| Kamera startete in jeder Partie in derselben Ansicht | Start wie Godot `_ready`: eigene Lane in Planungsdistanz, Bot-Partie von oben |
| Eigentümer-Ringe und Ancient-Balken fehlten in den Motiven | `OwnerRingRound`/`OwnerRingDiamond`, `AncientBarFill_*`, Balken und ruhender Boss in der Ansicht |
### Abnahme U3
| Vorgabe | Stand |
| --- | --- |
| G3-HUD übertragen (Ancients, Wellen, Gold, Lanes, Türme, Team, Einheitenkarten, Armee, Held mit Items und Talenten, Angriffschampions, nächste Welle, Bossstatus, Minimap, Bereit, Tooltips, Ereignisse, Optionen, Partieende) | erfüllt (U3A–C) |
| Sichtmodell mit denselben Privatsphäre-Regeln wie `LuneHudModel` | erfüllt (U3A) |
| Eingabe und Befehle wie in G3, Befehle über dieselbe Schnittstelle wie die Bots | erfüllt (U3C) |
| Offene G3-Punkte: Champion-Etikett, Typ-Symbole, Armeewert, Helden auf der Minimap | erfüllt (U3B) |
| Prüfung Teile A–H von `verify_g3` | erfüllt, 718 Prüfungen mit Teil I, 0 Fehler |
| Spieltest über die echte Oberfläche | erfüllt (Runden 1–3, siehe oben) |
| Bilder der 14 Motive und der Auflösungen | erfüllt |
| Leistung gemessen, einschließlich HUD-Kosten | erfüllt (`ui_ms_per_frame` 0,08–0,09) |
| Bot-Partien und Fingerabdrücke unverändert | erfüllt |
| Bekannte Unterschiede dokumentiert | erfüllt (siehe unten und [KNOWN-BEHAVIOR-DIFFERENCES.md](KNOWN-BEHAVIOR-DIFFERENCES.md)) |
### Bekannte Grenzen
- **Kein Hauptmenü** im Port; „Menü“ beendet das Spiel nach Rückfrage. Das Menü mit Netzwerk-Host/Join gehört zu U4.
- **Grottenlicht** (Runen, Kristalle, Funken) fehlt; nur die ruhende Schlundkrone steht dort.
- **Geplante Helden** behalten ihren reservierten Befehlsplatz, solange keiner dieser Helden spielbar ist.
- **Windows- und Linux-Player** weiterhin an die fehlenden Build-Module gebunden ([U1.5-UNITY.md](U1.5-UNITY.md)).
- **Schriftgewichte** wie in G3 absichtlich Regular 400; echte Gewichte sind eine U5-Entscheidung.