Boot-Sequenz vermessen + Intro-Player gebaut, echten PCC-Decoder-Regressionsbug gefixt

- Regression gefunden+gefixt: pcc_to_png.py war durch einen frueheren Commit
  versehentlich auf den kaputten Hand-RLE-Decoder zurueckgefallen (der
  ImageMagick-Fix ging verloren). Jetzt: kellogg_formats.load_pcc() nutzt
  Pillows PCX-Decoder direkt, kein eigener RLE-Code mehr im Projekt. Alle
  77 PCC neu gerendert, AE=0 (pixelidentisch) zu den alten guten PNGs.
- Boot-Sequenz per echter DOSBox-Screenshot-Serie (0.3s-Intervall) vermessen:
  Rauser-Karte -> Factor5-Logo (statisch, keine Animation) -> Kellogg's-Logo
  mit Palette-Fade des "praesentiert"-Texts (Indizes 34/42/43/44/45) ->
  Titelbild "Tony & Friends in Kellogg's Land" mit echtem Vorhang-Wipe-Effekt
  (320x480 aus 4 Quadranten KELL256A-D, obere Haelfte faehrt runter, untere
  hoch, treffen sich in der Mitte). Korrigiert eine fruehere Fehlannahme:
  der Wipe sitzt auf dem TITELBILD, nicht auf dem Kellogg's-Markenlogo.
- tools/intro_sequence.py: erster spielbarer pygame-Meilenstein, baut die
  komplette Sequenz nach (Asset-Loading, Palette-Rendering, Timing, echter
  Palette-Fade, Wipe-Effekt). Headless getestet, visuell verifiziert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
ARIA
2026-07-22 16:13:32 +00:00
co-authored by Claude Sonnet 5
parent 3622bd0a1a
commit ea1f5b951e
4 changed files with 456 additions and 89 deletions
+111
View File
@@ -778,3 +778,114 @@ zu einer Sequenz zusammengesetzt):**
geht und einfach hier weitergelesen werden kann.
Laeuft jetzt selbstaendig weiter, keine Rueckfrage noetig.
## Boot-Sequenz vermessen + Intro-Player gebaut (2026-07-22 abends, Fortsetzung)
### 1) Echter Regressions-Bug gefunden + gefixt (tools/pcc_to_png.py)
Beim Draufschauen fuer die Intro-Arbeit aufgefallen: Commit `62af15e` hatte
den PCC-Decoder korrekt auf ImageMagick umgestellt (nachdem zwei eigene
Hand-RLE-Parser nachweislich falsche Pixel lieferten). Der naechste Commit
`3410a53` (eigentlich nur fuer BOB/ICO/MAP gedacht) hat `pcc_to_png.py`
aber **versehentlich durch eine AELTERE Version mit dem kaputten
Hand-RLE-Decoder ueberschrieben** -- vermutlich ein Merge-/Copy-Fehler beim
Zusammenfuehren von Aenderungen. Die bereits committeten 77 PNGs in
`png_out/` waren zum Glueck NICHT betroffen (die stammen noch von der guten
ImageMagick-Version), aber ein Rerun des Skripts haette wieder kaputte
Bilder erzeugt, ohne dass es aufgefallen waere.
**Fix:** Statt ImageMagick-Subprocess jetzt `kellogg_formats.load_pcc()` --
nutzt Pillows eingebauten, robusten PCX-Decoder direkt (`PIL.Image.open`
erkennt PCX an den Magic-Bytes, nicht am Dateinamen). Kein eigener
RLE-Parser mehr im Projekt, an keiner Stelle. Alle 77 PCC neu aus
`PCKELL.DAT` gerendert und via `compare -metric AE` **byte-fuer-byte
pixelidentisch (AE=0)** zu den alten (guten) PNGs verifiziert -- keine
Regression, sauberer Fix. Neue Funktionen `load_pcc()` / `pcc_to_rgba()`
in `kellogg_formats.py`, wiederverwendbar fuer den Intro-Player.
### 2) Boot-Sequenz per echter Screenshot-Serie vermessen (0.3s-Intervall)
`xvfb-run`-Setup (Xvfb + `import -window root` alle 0.3s) waehrend
`START.EXE` bootet, ~90 Frames ueber ~27s. Ergebnis (Hash-Dedup + visuelle
Pruefung der Uebergaenge):
1. **Rauser-Advertainment-Karte** -- Komposit aus `RAUSER1.PCC` (dunkle Box
"RAUSER"), `RAUSER3.PCC` (blaue Box, Ausrufezeichen), `RAUSER2.PCC`
("ADVERTAINMENT"-Schriftzug) auf weissem Grund. Statisch gehalten (kein
Aufbau-Effekt beobachtet), ~3s.
2. Kurze schwarze Pause (~0.3-0.5s).
3. **Factor5-Studio-Logo** (`FACTOR5.PCC`, 320x199) -- **komplett statisches
Bild**, keine Laufzeit-Animation. Das "Geister"-Doppellogo (zwei leicht
versetzte FACTOR-Schriftzuege + Spiegelung am Boden) ist Teil des Assets
selbst (Byte-Konsum exakt 100%, kein Bug). Lange gehalten, ~6s.
4. Kurze schwarze Pause.
5. **Kellogg's-Markenlogo** (`KELLOGGS.PCC`, 320x200) -- erscheint SOFORT
komplett und bleibt die ganze Zeit scharf. **KORREKTUR einer fruehen
Fehlannahme:** es gibt HIER keinen Vorhang-/Wipe-Effekt auf dem Logo
selbst. Was tatsaechlich passiert: der Text **"praesentiert"** darunter
faedet per **Palette-Animation** von blass (fast weiss) zu kraeftigem
Rot ein (~3-4s beobachtet). Per Index-Analyse verifiziert: die Pixel des
Textes nutzen exklusiv die Palette-Indizes **34, 42, 43, 44, 45** (Bbox
x=71-241, y=108-141 im 320x200-Bild) -- alles andere im Bild bleibt
waehrend des Fades unveraendert.
6. Kurze schwarze Pause.
7. **Titelbild "TONY & FRIENDS in Kellogg's Land"** -- **DAS ist der
eigentliche Vorhang-Effekt**, den Stefan urspruenglich meinte. Wichtiger
Fund: dieses Bild ist intern **320x480** (doppelt so hoch wie die
anderen Screens!), zusammengesetzt aus den 4 PCC-Quadranten `KELL256A`
(oben links) / `KELL256B` (oben rechts) / `KELL256C` (unten links) /
`KELL256D` (unten rechts), je 160x240 -- durch Stitchen zu einem
320x480-Gesamtbild verifiziert (siehe `/tmp/kell_full_stitch.png`
waehrend der Session, zeigt exakt das erwartete Titelbild). Der
Reveal-Effekt: **obere Bildhaelfte (A|B) faehrt von oben nach unten
ein, untere Haelfte (C|D) von unten nach oben** -- wie ein Theater-
vorhang, nur vertikal, beide Haelften treffen sich exakt in der Mitte
(y=240 im 480px-Bild). Dauer ~3s (Frames 73->83 in der Aufnahme).
DOSBox-Fenster ist fuer diesen Screen sichtbar groesser/anders
proportioniert als bei den 320x240-Screens davor -- passt zur These
eines eigenen 320x480-Modus nur fuer dieses Bild.
Alle anderen Screens (Rauser/Factor5/Kellogg's-Logo) laufen im
Fenster-Seitenverhaeltnis 320x240 (aus Trim-Analyse des DOSBox-Fensters:
640x480 Xvfb-Ausschnitt = exakt 2x 320x240) -- die PCC-Bilder selbst sind
oft nur 320x199/200 und werden darin mit schwarzen Balken oben/unten
letterboxed (gut sichtbar am schwarzen Rand um die Kellogg's-Box in den
Screenshots).
### 3) Erster spielbarer Meilenstein: `tools/intro_sequence.py`
pygame-Player, der die komplette oben beschriebene Sequenz nachbaut:
Asset-Loading aus `PCKELL.DAT` (ueber `kellogg_formats`), Bild-Rendering
mit Palette, Timing/Sequenzer, Palette-Fade-Effekt (echte Index-Animation,
kein Alpha-Crossfade-Hack), Vorhang-Wipe-Effekt fuer das Titelbild.
Headless getestet (Xvfb + Screenshot-Serie) -- **visuell verifiziert,
sieht in allen Phasen sehr nah am echten DOSBox-Boot aus**:
[FILE: /shared/uploads/aria_intro_rauser.png] (Rauser-Karte, Komposit)
[FILE: /shared/uploads/aria_intro_factor5.png] (Factor5-Logo, statisch)
[FILE: /shared/uploads/aria_intro_kelloggs_fade.png] ("praesentiert" mitten im Fade)
[FILE: /shared/uploads/aria_intro_titel_wipe.png] (Titelbild-Vorhang mitten im Reveal)
[FILE: /shared/uploads/aria_intro_titel_final.png] (Titelbild komplett offen)
**Bekannte Ungenauigkeiten (v1, nicht pixelperfekt, aber nah dran):**
- Rauser-Komposit-Layout (Position von RAUSER1/2/3 zueinander) ist per
Augenmass an die Screenshots angenaehert, nicht pixelgenau vermessen --
bei Bedarf spaeter per genauerem Screenshot-Vergleich nachjustieren.
- Fade-/Wipe-Dauern sind aus der 0.3s-Sample-Screenshot-Serie abgeleitet
(+/- ein paar hundert ms Unschaerfe), nicht aus dem Originalcode gelesen
(RTM.EXE ist compiliert, kein Quellcode verfuegbar).
- Sound fehlt komplett (TFMX/SAM noch nicht decodiert, siehe unten).
**Ausfuehren:** `python3 tools/intro_sequence.py` auf `aria-wohnung`
(pygame jetzt per `apt install python3-pygame` installiert, NICHT pip --
System-Python ist "externally managed", pip-User-Install schlug fehl).
`--once` fuer einen Durchlauf statt Endlosschleife wie im Original.
### Naechste Schritte (Prioritaet)
1. Sound (SAM/TFX TFMX-Format) decodieren + an die Intro-Sequenz haengen --
`tools/tfmx_player/` (C-Referenztool) liegt bereit.
2. Rauser-Layout und Fade/Wipe-Timings feinjustieren falls gewuenscht.
3. Danach: Uebergang von Intro zu echtem Gameplay -- Tony-Bewegung auf
Level W1L0 als naechster grosser Meilenstein (MAP+ICO+BOB sind fertig).
Laeuft selbstaendig weiter, keine Rueckfrage noetig.