feat: echte Charakter-Portraits statt Buchstaben-Platzhalter im Modal #18

Merged
DasAoD merged 1 commit from feature/character-portraits into main 2026-08-03 21:39:58 +02:00
Owner

Zusammenfassung

Ersetzt den Buchstaben-Platzhalter im Charakter-Modal durch ein aus Sprite-Ebenen zusammengesetztes Portrait (Gesicht/Haare/Bart/Augen/Nase/Mund/Augenbrauen/Ohren/Extra), gerendert per <canvas> im Browser.

Herkunft der Daten/Logik

  • Sprite-Grafiken direkt aus den Unity-Asset-Bundles des Spiels geripped (portraits/{gender}/{race}{gender}sprites — die HD-Variante ohne _sd-Suffix, siehe Bugfix unten).
  • Ebenen-Reihenfolge, Farbgruppen-Sonderfälle (z.B. Bartfarbe bei Dämonen an Hornfarbe statt Haarfarbe gekoppelt) und Sprite-Offsets aus sfportrait.12hp.des PortraitMaker-full-1.74.min.js rekonstruiert — ein Community-Tool, das dieselben Spiel-Assets für einen manuellen Portrait-Builder nutzt. Offset-Map + Rahmengrafik (portrait_border.webp, als der echte In-Game-Rahmen verifiziert, nicht eines der dekorativen Zusatz-Frames der Seite) sind lokal vendored, damit nichts von der Verfügbarkeit dieser Seite abhängt.
  • Klassen-zu-Gesicht-Zuordnung (9 Klassen ohne eigenes Gesicht nutzen das einer Basisklasse, z.B. Nekromant/Pestdoktor → Magier-Gesicht, Paladin → Krieger-Gesicht) aus derselben Quelle, gegen die sf-api-Klassenreihenfolge verifiziert.

Wichtige Bugfixes während der Entwicklung

Gefunden per direktem Referenzvergleich: die Kompositions-Klasse von sfportrait.12hp.de wurde live im Browser importiert und mit identischen Test-Parametern aufgerufen, um Soll-Ergebnisse zum Vergleich zu erzeugen.

  1. Auflösung: Die _sd-Bundles (1024×1024-Atlanten) sind halb so groß wie die für die Offset-Map kalibrierten HD-Bundles (2048×2048) — führte dazu, dass periphere Elemente (Ohren, Hörner, Haar-Accessoires) weit neben dem Kopf landeten. Alle Portraits neu aus den HD-Bundles geripped.
  2. Mehrseitige Texturen: Manche Rassen haben 2 Atlas-Seiten pro Bundle. Statt einer Bounds-Heuristik ("passt die Sprite-Rect in diese Textur?") wird jetzt über die tatsächliche Textur-GUID-Referenz im Sprite-Asset aufgelöst, welche Seite ein Sprite wirklich enthält — die Heuristik hatte gelegentlich falsche Bildfragmente zusammengewürfelt.

Nach beiden Fixes stimmen 6 stichprobenartig getestete Rasse/Klasse-Kombinationen (Mensch, Dämon, Dunkelelf, Goblin, Ork, Elf) visuell überein mit dem Referenz-Rendering von sfportrait.12hp.de.

Bekannte Lücke

Dämon-Hörner (horn-demon_horn_*.png) sind trotz GUID-Fix nicht in den geripten Bundles auffindbar, obwohl sfportrait sie erfolgreich lädt (Quelle noch ungeklärt — evtl. ein weiteres, noch nicht identifiziertes Bundle). Portraits von Dämonen mit Hörnern zeigen daher aktuell keine Hörner, degradieren aber sauber (kein Fehler, nur fehlendes Detail).

Änderungen

  • cli/cron_character_sync.php: speichert jetzt die Portrait-Rohdaten (Gender, Haare, Bart, Augen, ...) aus der sf-api mit
  • public/assets/js/portrait.js: neuer Compositor — Ebenen-Auflösung per Datei-Manifest statt starrer Namenskonstruktion (Dateinamen sind nicht über alle Rassen einheitlich, z.B. hat Ork bei Augenbrauen keine Farbgruppen-Ziffer)
  • guild.js/guild.css/guild.php: Canvas statt Platzhalter im Modal, portrait.js vor guild.js eingebunden
  • includes/template.php: JS-Cache-Version gebumpt (betrifft auch die vorherigen PRs dieser Session, die noch nicht gebumpt war)
  • 1844 Portrait-Sprites + Offset-Map + Rahmengrafik vendored (~34 MB)

Test

Verifiziert per direktem Bild-Vergleich gegen sfportrait.12hp.de-Referenz-Renderings für 6 Rasse/Klasse-Kombinationen (siehe oben). Noch nicht gegen echte Gildencharaktere getestet — das ist für eine Folge-Session geplant, sobald das hier live ist.

## Zusammenfassung Ersetzt den Buchstaben-Platzhalter im Charakter-Modal durch ein aus Sprite-Ebenen zusammengesetztes Portrait (Gesicht/Haare/Bart/Augen/Nase/Mund/Augenbrauen/Ohren/Extra), gerendert per `<canvas>` im Browser. ## Herkunft der Daten/Logik - Sprite-Grafiken direkt aus den Unity-Asset-Bundles des Spiels geripped (`portraits/{gender}/{race}{gender}sprites` — die **HD-Variante ohne `_sd`-Suffix**, siehe Bugfix unten). - Ebenen-Reihenfolge, Farbgruppen-Sonderfälle (z.B. Bartfarbe bei Dämonen an Hornfarbe statt Haarfarbe gekoppelt) und Sprite-Offsets aus `sfportrait.12hp.de`s `PortraitMaker-full-1.74.min.js` rekonstruiert — ein Community-Tool, das dieselben Spiel-Assets für einen manuellen Portrait-Builder nutzt. Offset-Map + Rahmengrafik (`portrait_border.webp`, als der echte In-Game-Rahmen verifiziert, nicht eines der dekorativen Zusatz-Frames der Seite) sind lokal vendored, damit nichts von der Verfügbarkeit dieser Seite abhängt. - Klassen-zu-Gesicht-Zuordnung (9 Klassen ohne eigenes Gesicht nutzen das einer Basisklasse, z.B. Nekromant/Pestdoktor → Magier-Gesicht, Paladin → Krieger-Gesicht) aus derselben Quelle, gegen die sf-api-Klassenreihenfolge verifiziert. ## Wichtige Bugfixes während der Entwicklung Gefunden per direktem Referenzvergleich: die Kompositions-Klasse von sfportrait.12hp.de wurde live im Browser importiert und mit identischen Test-Parametern aufgerufen, um Soll-Ergebnisse zum Vergleich zu erzeugen. 1. **Auflösung**: Die `_sd`-Bundles (1024×1024-Atlanten) sind halb so groß wie die für die Offset-Map kalibrierten HD-Bundles (2048×2048) — führte dazu, dass periphere Elemente (Ohren, Hörner, Haar-Accessoires) weit neben dem Kopf landeten. Alle Portraits neu aus den HD-Bundles geripped. 2. **Mehrseitige Texturen**: Manche Rassen haben 2 Atlas-Seiten pro Bundle. Statt einer Bounds-Heuristik ("passt die Sprite-Rect in diese Textur?") wird jetzt über die tatsächliche Textur-GUID-Referenz im Sprite-Asset aufgelöst, welche Seite ein Sprite wirklich enthält — die Heuristik hatte gelegentlich falsche Bildfragmente zusammengewürfelt. Nach beiden Fixes stimmen 6 stichprobenartig getestete Rasse/Klasse-Kombinationen (Mensch, Dämon, Dunkelelf, Goblin, Ork, Elf) visuell überein mit dem Referenz-Rendering von sfportrait.12hp.de. ## Bekannte Lücke Dämon-Hörner (`horn-demon_horn_*.png`) sind trotz GUID-Fix nicht in den geripten Bundles auffindbar, obwohl sfportrait sie erfolgreich lädt (Quelle noch ungeklärt — evtl. ein weiteres, noch nicht identifiziertes Bundle). Portraits von Dämonen mit Hörnern zeigen daher aktuell keine Hörner, degradieren aber sauber (kein Fehler, nur fehlendes Detail). ## Änderungen - `cli/cron_character_sync.php`: speichert jetzt die Portrait-Rohdaten (Gender, Haare, Bart, Augen, ...) aus der sf-api mit - `public/assets/js/portrait.js`: neuer Compositor — Ebenen-Auflösung per Datei-Manifest statt starrer Namenskonstruktion (Dateinamen sind nicht über alle Rassen einheitlich, z.B. hat Ork bei Augenbrauen keine Farbgruppen-Ziffer) - `guild.js`/`guild.css`/`guild.php`: Canvas statt Platzhalter im Modal, `portrait.js` vor `guild.js` eingebunden - `includes/template.php`: JS-Cache-Version gebumpt (betrifft auch die vorherigen PRs dieser Session, die noch nicht gebumpt war) - 1844 Portrait-Sprites + Offset-Map + Rahmengrafik vendored (~34 MB) ## Test Verifiziert per direktem Bild-Vergleich gegen sfportrait.12hp.de-Referenz-Renderings für 6 Rasse/Klasse-Kombinationen (siehe oben). **Noch nicht gegen echte Gildencharaktere getestet** — das ist für eine Folge-Session geplant, sobald das hier live ist.
Ersetzt den Buchstaben-Platzhalter im Charakter-Modal durch ein aus
Sprite-Ebenen zusammengesetztes Portrait (Gesicht/Haare/Bart/Augen/...),
gerendert per Canvas im Browser.

Herkunft der Daten/Logik:
- Sprite-Grafiken direkt aus den Unity-Asset-Bundles des Spiels geripped
  (portraits/{gender}/{race}{gender}sprites, HD-Variante ohne "_sd"-Suffix
  — die SD-Variante hat nur die halbe Auflösung, was zu Fehlplatzierungen
  führte, siehe unten).
- Ebenen-Reihenfolge, Farbgruppen-Sonderfälle (z.B. Bartfarbe bei Dämonen
  an Hornfarbe gekoppelt) und Sprite-Offsets aus sfportrait.12hp.de's
  PortraitMaker-full-1.74.min.js rekonstruiert (Community-Tool, das
  dieselben Spiel-Assets für einen manuellen Portrait-Builder nutzt) —
  Offset-Map + Rahmengrafik (portrait_border.webp, bestätigt als der
  echte In-Game-Rahmen) von dort übernommen und lokal vorgehalten, damit
  nichts von der Verfügbarkeit dieser Seite abhängt.
- Klassen-zu-Gesicht-Zuordnung (9 Klassen ohne eigenes Gesicht nutzen das
  einer Basisklasse, z.B. Nekromant/Pestdoktor -> Magier-Gesicht) aus
  derselben Quelle, gegen die sf-api-Klassenreihenfolge verifiziert.

Wichtige Bugfixes während der Entwicklung (per Referenzvergleich gegen
sfportrait.12hp.de gefunden, dessen Kompositions-Klasse dafür direkt im
Browser importiert und mit identischen Test-Parametern aufgerufen wurde):
- Sprite-Auflösung: SD-Bundles (1024x1024-Atlanten) sind halb so groß wie
  die für die Offset-Map kalibrierten HD-Bundles (2048x2048) -> alle
  Portraits neu aus den HD-Bundles geripped.
- Mehrseitige Texturen (manche Rassen haben 2 Atlas-Seiten): statt vager
  Bounds-Heuristik wird jetzt über die tatsächliche Textur-GUID-Referenz
  im Sprite-Asset aufgelöst, welche Seite ein Sprite enthält.

Bekannte Lücke: Dämon-Hörner (horn-demon_horn_*.png) sind trotzdem nicht
auffindbar in den geripten Bundles, obwohl sfportrait sie erfolgreich lädt
— Ursache noch ungeklärt, Portraits ohne Hörner degradieren aber sauber.

- cli/cron_character_sync.php speichert jetzt die Portrait-Rohdaten mit
- public/assets/js/portrait.js: neuer Compositor (Layer-Auflösung per
  Datei-Manifest statt starrer Namenskonstruktion, da Dateinamen nicht
  über alle Rassen einheitlich sind)
- guild.js/guild.css/guild.php: Canvas statt Platzhalter im Modal
- 1844 Portrait-Sprites + Offset-Map + Rahmengrafik vendored
DasAoD merged commit 17de8fc377 into main 2026-08-03 21:39:58 +02:00
Sign in to join this conversation.
No description provided.