PRSA---Rom-Manager-/load/datparser.py
2026-02-28 01:30:59 -08:00

45 lines
1.6 KiB
Python

from typing import Dict, List
from load.lz10util import decompress_lz10
from load.narcutil import parse_narc
LAYER_NAMES = {1: '0X01 LAYER', 2: '0X02 LAYER', 3: '0X03 LAYER', 4: '0X04 LAYER', 5: '0X05 LAYER', 6: '0X06 LAYER', 7: '0X07 LAYER', 8: '0X08 LAYER', 9: '0X09 LAYER', 10: '0X0A LAYER', 13: '0X0D LAYER', 14: '0X0E LAYER'}
def parse_dat_map(dat_path: str) -> Dict:
with open(dat_path, 'rb') as f:
raw = f.read()
dec = decompress_lz10(raw)
outer_files = parse_narc(dec)
mpif = None
txif = None
lyr = None
cta = None
for bf in outer_files:
sig = bf[:4]
if sig == b'MPIF':
mpif = bf
elif sig == b'TXIF':
txif = bf
elif sig == b'LYR\x00':
lyr = bf
elif sig == b'CTA\x00':
cta = bf
layers = []
if lyr:
if lyr[:4] == b'LYR\x00':
lyr = lyr[4:]
lyr_stage1 = parse_narc(lyr)
final_candidates = []
for blob in lyr_stage1:
if blob[:4] == b'NARC':
inner = parse_narc(blob)
final_candidates.extend(inner)
else:
final_candidates.append(blob)
for lb in final_candidates:
if len(lb) >= 4:
ltype = int.from_bytes(lb[0:4], 'little')
else:
ltype = -1
name = LAYER_NAMES.get(ltype, f'UNKNOWN_{ltype:02X}')
layers.append({'type': ltype, 'name': name, 'data': lb})
return {'mpif': mpif, 'txif': txif, 'layers': layers, 'cta': cta}