mirror of
https://github.com/etienerodri/PRSA---Rom-Manager-.git
synced 2026-05-07 05:26:08 -05:00
45 lines
1.6 KiB
Python
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}
|