newworld-rom/scripts/prclmake.py

84 lines
2.4 KiB
Python
Executable File

#!/usr/bin/env python3
from prcltool import ParcelsArea, ParcelStruct, ParcelEntry
import argparse
from sys import argv
class DataLoader(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
path = values[0]
try:
p2 = path + '.patch'
with open(p2, 'rb') as f:
namespace.bytes = f.read()
print('Using', p2)
except FileNotFoundError:
with open(path, 'rb') as f:
namespace.bytes = f.read()
class DataReader(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
d = b''.join(s.encode('ascii')+b'\0' for s in values)
namespace.bytes = d
namespace.should_checksum = False
def hex(s):
return int(s, 16)
def fourcc(s):
b = s.encode('ascii')
if len(b) != 4:
raise ValueError('type code not four bytes')
return b
p1 = argparse.ArgumentParser()
p2 = argparse.ArgumentParser()
p1.add_argument('--flags', '-f', action='store', type=hex, default=0)
p1.add_argument('--fourcc', '-t', action='store', type=fourcc, default=' ')
p1.add_argument('--name', '-n', action='store', default='')
p1.add_argument('--compat', '-c', action='store', default='')
p2.add_argument('--fourcc', '-t', action='store', type=fourcc, default=' ')
p2.add_argument('--flags', '-f', action='store', type=hex, default=0)
p2.add_argument('--lzss', '-l', action='store_true', dest='compress')
p2.add_argument('--name', '-n', action='store', default='')
p2.add_argument('--backref', action='store_true', dest='backref_allowed')
p2.add_argument('--nosum', action='store_false', dest='should_checksum')
p2.add_argument('--src', '-s', nargs=1, dest='bytes', action=DataLoader)
p2.add_argument('--data', '-d', nargs='+', dest='bytes', action=DataReader)
# Usage: prog.py [ --prcl prcl-opts [ --bin bin-opts ] ... ] ...
progname, dest, *args = argv
groups = []
me = ParcelsArea()
for a in args:
if a in ('--prcl', '--bin'):
n = []
groups.append(n)
n.append(a)
for g in groups:
t, *opts = g
if t == '--prcl':
prcl = ParcelStruct()
p1.parse_args(args=opts, namespace=prcl)
me.prcls.append(prcl)
elif t == '--bin':
bn = ParcelEntry()
p2.parse_args(args=opts, namespace=bn)
prcl.entries.append(bn)
else:
raise ValueError('bad arg')
with open(dest, 'wb') as f:
f.write(bytes(me))