feat: echte Sonder-/Streamer-Portraits statt Buchstaben-Platzhalter #25

Merged
DasAoD merged 1 commit from feat/special-streamer-portraits into main 2026-08-10 01:06:38 +02:00
Owner

Hintergrund

sf-api liefert für Influencer/Streamer ein Portrait über das Feld special_portrait (sf-api-Quellcode-Kommentar: "Influencers get a special portrait"), statt der normalen Ebenen-Werte (hair, eyes, mouth, ...) — die sind für diese Charaktere alle 0. Bisher hat portrait.js das explizit erkannt und dann aufgegeben (Kommentar: "Sonder-/Streamer-Portraits liegen uns nicht lokal vor."), sodass diese Charaktere nur den Buchstaben-Platzhalter zeigten.

Herkunft/Verifikation der Bild-IDs

special_portrait ist negativ, der Betrag ist die Bild-ID (z.B. -259 → special259.webp). Verifiziert gegen sfportrait.12hp.de — deren "Custom avatar"-Galerie labelt #259 als "ZsombeyHD (#259)", exakt passend zum gespeicherten Wert für diesen Spieler (Gilde Equilibrium).

Änderungen

  • Alle ~490 auf sfportrait.12hp.de verfügbaren Sonderportraits (res/scripts/PortraitMaker-res/portraits/special/specialN.webp) heruntergeladen und lokal vendored (public/assets/images/portraits/special/), damit nichts von der Verfügbarkeit dieser Seite abhängt — gleiches Prinzip wie beim Rahmen/der Offset-Map aus PR #18.
  • portrait.js: neue renderSpecialPortrait()-Funktion zeichnet das fertige Einzelbild (statt Ebenen-Komposition) mit kleinem Rand zentriert auf den Canvas und legt wie gewohnt den goldenen Rahmen (portrait_border.webp) darüber. Fällt bei fehlendem Bild weiterhin sauber auf den Platzhalter zurück (z.B. für zukünftige neue Influencer, deren Bild noch nicht vendored ist).

Test

Live im Browser getestet: renderSpecialPortrait-Logik gegen ZsombeyHDs echte, per API abgerufene Portrait-Daten (special_portrait: -259) laufen lassen und auf einen Test-Canvas gezeichnet — Ergebnis sieht korrekt aus (Portrait + Rahmen, sauber zentriert, kein Clipping). Bitte nach Merge/Deploy nochmal am echten Modal für ZsombeyHD (Gilde Equilibrium) gegenchecken.

## Hintergrund sf-api liefert für Influencer/Streamer ein Portrait über das Feld `special_portrait` (sf-api-Quellcode-Kommentar: *"Influencers get a special portrait"*), statt der normalen Ebenen-Werte (hair, eyes, mouth, ...) — die sind für diese Charaktere alle 0. Bisher hat `portrait.js` das explizit erkannt und dann aufgegeben (Kommentar: *"Sonder-/Streamer-Portraits liegen uns nicht lokal vor."*), sodass diese Charaktere nur den Buchstaben-Platzhalter zeigten. ## Herkunft/Verifikation der Bild-IDs `special_portrait` ist negativ, der Betrag ist die Bild-ID (z.B. `-259` → `special259.webp`). Verifiziert gegen [sfportrait.12hp.de](https://sfportrait.12hp.de) — deren "Custom avatar"-Galerie labelt `#259` als **"ZsombeyHD (#259)"**, exakt passend zum gespeicherten Wert für diesen Spieler (Gilde Equilibrium). ## Änderungen - Alle ~490 auf sfportrait.12hp.de verfügbaren Sonderportraits (`res/scripts/PortraitMaker-res/portraits/special/specialN.webp`) heruntergeladen und lokal vendored (`public/assets/images/portraits/special/`), damit nichts von der Verfügbarkeit dieser Seite abhängt — gleiches Prinzip wie beim Rahmen/der Offset-Map aus PR #18. - `portrait.js`: neue `renderSpecialPortrait()`-Funktion zeichnet das fertige Einzelbild (statt Ebenen-Komposition) mit kleinem Rand zentriert auf den Canvas und legt wie gewohnt den goldenen Rahmen (`portrait_border.webp`) darüber. Fällt bei fehlendem Bild weiterhin sauber auf den Platzhalter zurück (z.B. für zukünftige neue Influencer, deren Bild noch nicht vendored ist). ## Test Live im Browser getestet: `renderSpecialPortrait`-Logik gegen ZsombeyHDs echte, per API abgerufene Portrait-Daten (`special_portrait: -259`) laufen lassen und auf einen Test-Canvas gezeichnet — Ergebnis sieht korrekt aus (Portrait + Rahmen, sauber zentriert, kein Clipping). Bitte nach Merge/Deploy nochmal am echten Modal für ZsombeyHD (Gilde Equilibrium) gegenchecken.
sf-api liefert für Influencer/Streamer ein Portrait über das Feld
special_portrait (laut sf-api-Quellcode-Kommentar: "Influencers get
a special portrait"), statt der normalen Ebenen-Werte (hair, eyes,
mouth, ...) - die sind für diese Charaktere alle 0. Bisher hat
portrait.js das explizit erkannt und dann einfach aufgegeben
(Kommentar: "Sonder-/Streamer-Portraits liegen uns nicht lokal
vor."), sodass diese Charaktere den Buchstaben-Platzhalter zeigten.

Herkunft/Verifikation der Bild-IDs: special_portrait ist negativ,
der Betrag ist die Bild-ID (z.B. -259 -> special259.webp). Verifiziert
gegen sfportrait.12hp.de - deren "Custom avatar"-Galerie labelt #259
als "ZsombeyHD (#259)", exakt passend zum gespeicherten Wert für
diesen Spieler (Gilde Equilibrium).

Alle ~490 dort verfügbaren Sonderportraits von
res/scripts/PortraitMaker-res/portraits/special/specialN.webp
heruntergeladen und lokal vendored (public/assets/images/portraits/
special/), damit nichts von der Verfügbarkeit dieser Seite abhängt
(gleiches Prinzip wie beim Rahmen/Offset-Map aus PR #18).

portrait.js: neue renderSpecialPortrait()-Funktion zeichnet das
fertige Einzelbild (statt Ebenen-Komposition) mit kleinem Rand
zentriert auf den Canvas und legt wie gewohnt den goldenen Rahmen
(portrait_border.webp) darüber. Fällt bei fehlendem Bild weiterhin
sauber auf den Platzhalter zurück (z.B. für zukünftige neue
Influencer, deren Bild noch nicht vendored ist).
DasAoD merged commit b0de6f9b11 into main 2026-08-10 01:06:38 +02:00
Sign in to join this conversation.
No description provided.