diff --git a/pack_softpal_text_dat.py b/pack_softpal_text_dat.py new file mode 100644 index 0000000..34c6f82 --- /dev/null +++ b/pack_softpal_text_dat.py @@ -0,0 +1,69 @@ +import struct +from os.path import splitext +import json +import sys + + +def rotate_right(val, rshift): + return ((val >> rshift) | ((val << (8 - rshift)) & 0xFF)) & 0xFF + + +def encrypt_bytes(data: bytes) -> bytes: + # Matches inverse of decrypt in unpack_softpal_text_dat.py + CONST = 0x084DF873 ^ 0xFF987DEE + b = bytearray(data) + pos = 0x10 + shift = 4 + while pos + 4 <= len(b): + val = struct.unpack(' bytes: + # header: 12 bytes (unused by unpack) + header = b"\x00" * 12 + items = sorted(((int(k), v) for k, v in table.items()), key=lambda x: x[0]) + count = len(items) + out = bytearray() + out += header + out += struct.pack(' [] [] [--no-encrypt]") + sys.exit(1) + + infile = sys.argv[1] + outfile = sys.argv[2] if len(sys.argv) > 2 else splitext(infile)[0] + '.dat' + encoding = sys.argv[3] if len(sys.argv) > 3 and not sys.argv[3].startswith('--') else 'cp932' + encrypt = True + if '--no-encrypt' in sys.argv: + encrypt = False + + with open(infile, 'r', encoding='utf-8') as f: + table = json.load(f) + + data = pack_table(table, encoding=encoding, encrypt=encrypt) + with open(outfile, 'wb') as f: + f.write(data) + + print(f'Wrote {outfile} ({len(data)} bytes)')