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>
41 lines
1.4 KiB
Python
41 lines
1.4 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, 'game', 'original', '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)
|