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)
41 lines
1.1 KiB
Python
41 lines
1.1 KiB
Python
import sys, struct
|
|
|
|
def rle_decode_pcx_style(data):
|
|
"""Decode assuming classic PCX RLE over the whole byte stream (no scanline boundary)."""
|
|
out = bytearray()
|
|
i = 0
|
|
n = len(data)
|
|
while i < n:
|
|
b = data[i]
|
|
if (b & 0xC0) == 0xC0:
|
|
count = b & 0x3F
|
|
i += 1
|
|
if i >= n:
|
|
break
|
|
val = data[i]
|
|
out.extend([val]*count)
|
|
i += 1
|
|
else:
|
|
out.append(b)
|
|
i += 1
|
|
return bytes(out)
|
|
|
|
def factor_pairs_near_sqrt(total, tol=0):
|
|
import math
|
|
res = []
|
|
for w in range(1, int(math.isqrt(total))+50):
|
|
if w == 0: continue
|
|
if total % w == 0:
|
|
h = total // w
|
|
res.append((w,h))
|
|
return res
|
|
|
|
files = ["A.BOB","B.BOB","E.BOB","N.BOB","O.BOB","D.BOB","H.BOB","I.BOB","J.BOB","K.BOB","TONY.BOB"]
|
|
base = "/home/aria/kellogg_remake/extracted_pre/"
|
|
|
|
for fn in files:
|
|
path = base+fn
|
|
data = open(path,"rb").read()
|
|
dec = rle_decode_pcx_style(data)
|
|
print(fn, "raw_len=",len(data), "decoded_len=",len(dec))
|