Files
tony-remake/tools/dat_extract.py
T
ARIAandClaude Sonnet 5 6d196020db Pfade relativ statt hardcodiert + Rauser/Titelbild-Korrektur per Pixelvermessung
- 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>
2026-07-22 21:01:47 +00:00

41 lines
1.3 KiB
Python

import struct, os
from collections import Counter
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
SRC = os.environ.get('KELLOGG_DAT', os.path.join(PROJECT_ROOT, 'raw', 'PCKELL.DAT'))
OUT = os.environ.get('KELLOGG_EXTRACT_OUT', os.path.join(PROJECT_ROOT, 'extracted_dat'))
os.makedirs(OUT, exist_ok=True)
with open(SRC, 'rb') as f:
data = f.read()
num_entries = struct.unpack_from('<H', data, len(data)-4)[0] + 1
offset = struct.unpack_from('<i', data, len(data)-8)[0]
index_offset = offset
entries = []
for i in range(num_entries):
name_len = struct.unpack_from('<H', data, offset)[0]
offset += 2
filename = data[offset:offset+name_len].decode('ascii', errors='replace')
offset += name_len
e_offset = struct.unpack_from('<i', data, offset)[0]
offset += 4
entries.append([filename, e_offset])
for i, e in enumerate(entries):
length = (entries[i+1][1] if i+1 < len(entries) else index_offset) - e[1]
e.append(length)
ext_counter = Counter()
for filename, e_offset, length in entries:
payload = data[e_offset:e_offset+length]
with open(os.path.join(OUT, filename), 'wb') as out:
out.write(payload)
ext = os.path.splitext(filename)[1].upper()
ext_counter[ext] += 1
print('Extracted', len(entries), 'files to', OUT)
for ext, cnt in sorted(ext_counter.items()):
print(ext, cnt)