raw/ -> game/original/ (die Original-DOS-Dateien liegen jetzt neben dem Code,
der sie liest). Bleibt gitignored -- ist das Original-Spiel selbst, gehoert
nicht ins Repo.
Nachgezogen:
- Default-DAT-Pfad in game/intro.py, tools/dat_extract.py, tools/render_assets.py
-> game/original/PCKELL.DAT (KELLOGG_DAT-Override unveraendert).
- .gitignore: raw/ -> game/original/.
- Docstrings (game/audio.py, game/__init__.py), dosbox/dosbox.conf-Mountpfad,
README-Struktur/Verweise angepasst.
tfmx_player: KEINE Aenderung -- der Quellcode ist bereits getrackt (benoetigt),
nur das kompilierte Binary render_tfmx bleibt bewusst gitignored (plattform-
spezifisch, wird von build.sh automatisch neu gebaut).
Verifiziert: python -m game --once (headless) exit 0 mit neuem Pfad.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
audio/, png_out/, render_out/ nach preview/ verschoben -- das sind reine
Ansichts-/Archiv-Ausgaben (aus PCKELL.DAT gerendert), keine Laufzeit-
Abhaengigkeit. Das Spiel dekodiert zur Laufzeit alles selbst on the fly aus
raw/PCKELL.DAT; die Musik rendert game/tfmx_player/ frisch nach audio_cache/,
preview/audio/ wird vom Spiel nicht gelesen.
- render_assets.py: Default-Ausgabepfad -> preview/render_out/.
- README.md: Struktur-Abschnitt auf preview/ aktualisiert.
- tfmx_player/ bleibt bewusst in game/ (Laufzeit-Audio-Decoder, Gegenstueck
zu game/formats.py -- kein Dev-Tool).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Repo-Hygiene-Fund (23.07.2026): tools/tfmx_audio.py reicht song_index bereits
seit dem Factor5-Sound-Fix als 5. CLI-Arg an render_tfmx durch (siehe dessen
Docstring), aber die zugehoerige C-Quelle war nie committed -- nur lokal auf
der VM in /home/aria/kellogg_remake gebaut. Ein frischer Checkout+Build von
origin/master haette also render_tfmx OHNE song_index-Unterstuetzung erzeugt:
jeder render_wav(..., song_index=N)-Aufruf (z.B. TITEL2 Song 1 fuer den
Factor5-Sound) waere klanglich stillschweigend auf Song 0 zurueckgefallen --
kein Crash, aber ein 1:1-Port-Bruch, den man erst durchs Hoeren gemerkt haette.
Ursache: parallel zur Bugfix-Session ist zusaetzlich ein zweiter, veralteter
Git-Checkout unter /tmp entstanden (tmpfs, ueberlebt keinen Reboot) und dort
unabhaengig weitergearbeitet worden, ohne vorher zu fetchen -- dadurch ist
lokal vs. Remote auseinandergelaufen. Nach Abgleich: die tatsaechliche
Arbeitskopie auf der VM (/home/aria/kellogg_remake) war fuer alle anderen
Dateien bereits 1:1 identisch mit origin/master; nur diese eine C-Datei fehlte
im Repo. Die verwaisten, ueberholten Doppel-Commits im tmpfs-Checkout wurden
verworfen (kein Datenverlust, deren Inhalt war ein aelterer, bereits
ueberholter Zwischenstand).
Stefans Meldung 'nur noch ein schwarzes Bild, verschiebe ich das Fenster
wird der Desktop reingerendert, das Programm haengt' war real (per
Xvfb-Test verifiziert). Ursache: render_wav() rief render_tfmx als
blockierenden subprocess.run() auf -- bei einem frischen, ungecachten Song
(v.a. TITEL, ~109s) dauerte das reproduzierbar ~14s ohne dass die
pygame-Eventloop weiterlief, das OS stufte das Fenster dann als haengend
ein.
Fix: preload_all_audio() rendert alle benoetigten Songs jetzt EINMALIG vor
der eigentlichen Sequenz, per Hintergrund-Thread + responsivem
Ladebildschirm (render_audio_with_loading). run_once()/run_rauser() greifen
danach nur noch auf fertige WAV-Pfade zu, nie mehr Live-Rendering im
Hauptloop. Verifiziert per Xvfb-Testlauf: laeuft jetzt sauber durch.
Pixelvermessung von Stefans Referenz-Screenshot widerlegt die letzte
"native Groesse ist richtig"-Annahme -- das Logo ist im Original klein
(~34% Bildbreite), nicht bildschirmfuellend. Der eigentliche Bloedsinn war
smoothscale() (bilinear, verwaescht Pixel-Art), nicht die 0.5x-Groesse
selbst. Fix: 0.5x beibehalten, pygame.transform.scale() (Nearest-Neighbor)
statt smoothscale().
Factor5 spielte bisher faelschlich ONGAME2 (~123s Level-Musik) ab. Fund:
TFX-Module buendeln mehrere Songs (v_songs[]) -- TITEL2 hat 2 (Song0 =
2.04s Rauser-Sting, Song1 = 2.40s), TITEL 3, ONGAME2 sogar 14. TITEL2-Song1
passt laenge-maessig exakt zu "nur ein bisschen laenger als der
Rauser-Sound" -- jetzt der Factor5-Sound, feste 5s Anzeigedauer.
- intro_sequence.py, tfmx_audio.py, render_assets.py, dat_extract.py:
/home/aria/kellogg_remake/... durch PROJECT_ROOT-relative Pfade ersetzt
(mit optionalem ENV-Override), laeuft jetzt von jedem Checkout aus.
- Rauser-Logo: war 1:1 nativ gezeichnet (viel zu gross) und weisser statt
grauer Hintergrund. Per frischer DOSBox-Referenzaufnahme (Xvfb-Screenshot-
Serie) neu vermessen: 0.5x Skalierung, Slide-in-Animation (RAUSER-Box von
links, "!"-Box von oben, ADVERTAINMENT steht fest), Sound-Sting (TITEL2,
einmalig) bei Ankunft, danach Fade weiss->grau.
- Titelbild: fruehere Annahme (4 Quadranten voll gestapelt = 320x480) war
falsch und die Ursache fuer den gemeldeten Squish-Bug. Per Pixel-
Rekonstruktion verifiziert: jeder Quadrant wird nur auf halber HOEHE
(160x120 statt 160x240, Breite bleibt nativ) im 2x2-Raster angeordnet ->
korrektes 320x240-Bild. Zusaetzlich neu entdeckter und nachgebauter
Scanline/Graustufen-Reveal-Effekt auf der unteren Bildhaelfte.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- 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>
- PCKELL.DAT ist der eigentliche Asset-Container (Index am Dateiende),
nicht PCKELL.PRE -- alle 178 Assets fehlerfrei extrahierbar
(tools/dat_extract.py, tools/kellogg_formats.DATContainer)
- BOB (Sprites): self-modifying x86 draw-code decodiert, alle 32 Dateien /
462 Frames korrekt (Tony, Gegner, Items) -- tools/kellogg_formats.parse_bob
- ICO (16x16 EGA-Tilesets) und MAP (Level-Grids, big-endian) decodiert und
gerendert -- alle 19 ICO- und 22 MAP-Dateien fehlerfrei, Level W1L0 sieht
korrekt aus (Haeuser, Baeume, Berge an den erwarteten Stellen)
- Palette-Regeln (BOB/ICO/MAP -> passende PCC) aus der C#-Referenz
uebernommen und in Python neu implementiert
- Aufraeumen: PRE-basierte Extraktion (split_pre.py, extracted_pre) und
alle Blindflug-Explorationsskripte aus der ersten BOB-Sackgasse entfernt,
VM-Arbeitsverzeichnis von Debug-Screenshots befreit
- pcc_to_png.py aktualisiert (Xmax/Ymin-Dimensionsfix, jetzt visuell
gegen DOSBox-Referenz verifiziert statt nur behauptet)
Offen: ARE (Kollisionszonen, auch Referenz-Projekt unvollstaendig) und
SAM/TFX (TFMX-Sound) noch nicht angefasst.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Beide vorherigen Hand-RLE-Decoder (Row-Reset und kontinuierlich) waren
trotz gegenteiliger Behauptung sichtbar kaputt (Bildinhalt verschoben/
dupliziert) -- Stefan hat das im gepushten Repo sofort wieder gesehen.
Format-Referenz https://github.com/movAX13h/tony-and-friends-in-kelloggs-land
bestaetigt .PCC = Standard-PCX v5. Fix: convert pcx:datei.PCC statt
eigenem RLE-Parser. Verifiziert (visuell, nicht nur Byte-Stats) gegen
echte DOSBox-Screenshots -- KARTE.PCC und KELLOGGS.PCC jetzt wirklich
korrekt. Alle 77 PNGs neu erzeugt.
Stefan hat zurecht bemaengelt dass KARTE.PCC/KELLOGGS.PCC verzerrt/verrutscht
aussehen (Smacks-Frosch an falscher Position, Notch-Fehlstelle im Logo-Rahmen).
Root Cause: Der Decoder hat RLE-Runs am Ende jeder Bildzeile hart abgeschnitten
und den Rest verworfen (klassisches PCX-Verhalten angenommen). Dieses Format
haelt sich aber NICHT an die PCX-Konvention 'ein Run ueberschreitet nie eine
Zeile' -- Runs laufen frei ueber Zeilengrenzen. Verifiziert per Pixel-fuer-Pixel-
Vergleich gegen echten DOSBox-Screenshot (world map): mit durchgehender
Dekodierung (kein Row-Reset) ist das Ergebnis jetzt pixel-identisch zur Referenz.
- tools/pcc_to_png.py: Row-Reset entfernt, decodiert jetzt width*height Pixel
am Stueck aus dem RLE-Strom
- png_out/: alle 77 PNGs mit dem Fix neu generiert
- tools/wip_bob_sprite_research/: Backup der laufenden (noch ungeloesten)
BOB-Sprite-Format-Exploration von aria-wohnung, damit nichts bei einem
VM-Neustart verloren geht
- NOTES.md: Root-Cause-Analyse dokumentiert, alte Fehldiagnose ('byte-identisch
zwischen Row-Reset und kontinuierlich') korrigiert, Rauser-Intro-Frage
beantwortet (3 Frames vorhanden, Text-Logo, keine Video-Datei)
- tools/pcc_to_png.py: PCX-artiger Decoder fuer die 77 PCC-Vollbild-/Logo-
Dateien, mit Fix fuer falsch gelesene Width/Height (muss aus Xmax-Xmin+1/
Ymax-Ymin+1 statt Offset 12-15 berechnet werden)
- tools/split_pre.py: Extrahiert alle 181 Dateien aus PCKELL.PRE
- png_out/: alle 77 konvertierten PNGs (Arbeitsergebnis, kein Original-Asset)
- NOTES.md: vollstaendiger Analyse-Stand inkl. offener Punkte
- dosbox/dosbox.conf: funktionierende Testkonfiguration (IRQ-Fix)
Bewusst ausgeschlossen (.gitignore): raw/ und extracted_pre/, da Original-
Spieldaten von Kellogg's Tony and Friends (1994), keine Weiterverbreitung.