PCC-Decoder-Bugfix: RLE-Runs duerfen Zeilengrenzen ueberschreiten (Row-Reset war falsch)
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)
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
import struct, sys
|
||||
|
||||
path = "/home/aria/kellogg_remake/raw/PCKELL.DAT"
|
||||
data = open(path, "rb").read()
|
||||
print("total size:", len(data))
|
||||
|
||||
# Read uint16 LE values until they stop being monotonically non-decreasing
|
||||
vals = []
|
||||
off = 0
|
||||
prev = -1
|
||||
while off + 2 <= len(data):
|
||||
v = struct.unpack_from("<H", data, off)[0]
|
||||
vals.append(v)
|
||||
off += 2
|
||||
if len(vals) > 5000:
|
||||
break
|
||||
|
||||
# find longest monotonic non-decreasing prefix
|
||||
mono_len = 1
|
||||
for i in range(1, len(vals)):
|
||||
if vals[i] >= vals[i-1]:
|
||||
mono_len = i+1
|
||||
else:
|
||||
break
|
||||
|
||||
print("monotonic non-decreasing prefix length (uint16 entries):", mono_len)
|
||||
print("that's byte offset:", mono_len*2)
|
||||
print("first 40 vals:", vals[:40])
|
||||
print("vals around break point:", vals[max(0,mono_len-10):mono_len+10])
|
||||
Reference in New Issue
Block a user