From 591b49647910b395cb714a23e2a7764b39c5bdbe Mon Sep 17 00:00:00 2001 From: Connor Date: Sun, 10 Mar 2019 22:15:22 -0700 Subject: [PATCH] --- extract_params.py | 68 ++++++++++++++++----------- fmg_flatten.py | 115 ++++++++++++++++++++++++++++++++++++++++++++++ param_notes.py | 27 +++++++++++ 3 files changed, 183 insertions(+), 27 deletions(-) create mode 100644 fmg_flatten.py create mode 100644 param_notes.py diff --git a/extract_params.py b/extract_params.py index 077cdfc..4ee1fdb 100644 --- a/extract_params.py +++ b/extract_params.py @@ -77,8 +77,8 @@ def read_paramdef(f): (unk8,) = U("I", f.read(4)) desc_str = trunc(desc).decode("shift-jis", errors="replace") - type_str = trunc(full_typename).decode() - name_str = trunc(name).decode() + type_str = trunc(full_typename).decode("shift-jis") + name_str = trunc(name).decode("shift-jis") length = None if "[" in name_str and "]" in name_str: @@ -182,12 +182,25 @@ def read_param(f, paramdef_title=None): if __name__ == "__main__": - fp1 = sys.argv[1] - fp2 = sys.argv[2] - fpo = sys.argv[3] - fph = sys.argv[4] - # ew, nasty global: - big_endian = sys.argv[5] == "big" if len(sys.argv) > 5 else False + if len(sys.argv) == 6: + fp1 = sys.argv[1] + fp2 = sys.argv[2] + fpo = sys.argv[3] + fph = sys.argv[4] + # ew, nasty global: + big_endian = sys.argv[5] == "big" + elif len(sys.argv) == 4: + fp1 = sys.argv[1] + fp2 = None + fpo = None + fph = sys.argv[2] + # ew, nasty global: + big_endian = sys.argv[3] == "big" + else: + print("usage:") + print(" python3 extract_params.py {paramdef in} {param in} {param out} {paramdef out} [big]") + print(" python3 extract_params.py {paramdef in} {paramdef out} [big]") + sys.exit(1) # ew, nasty global: E = ">" if big_endian else "<" @@ -195,27 +208,28 @@ if __name__ == "__main__": with open(fp1, "rb") as f: paramdef_title, defs = read_paramdef(f) - header = ["entryId"] - for d in defs: - name = d.name - if ":" in name: - name = name.split(":")[0] - if "[" in name: - name = name.split("[")[0] - if d.ctype == "dummy8": - # print("skipping", name) - continue - header.append(name) - header.append("notes") + if fp2 is not None and fph is not None: + header = ["entryId"] + for d in defs: + name = d.name + if ":" in name: + name = name.split(":")[0] + if "[" in name: + name = name.split("[")[0] + if d.ctype == "dummy8": + # print("skipping", name) + continue + header.append(name) + header.append("notes") - with open(fp2, "rb") as f: - param_title, entries = read_param(f, paramdef_title) + with open(fp2, "rb") as f: + param_title, entries = read_param(f, paramdef_title) - with open(fpo, "w", newline="", encoding="utf-8") as f: - cw = csv.writer(f, dialect="excel-tab") - cw.writerow(header) - for entry in entries: - cw.writerow(entry) + with open(fpo, "w", newline="", encoding="utf-8") as f: + cw = csv.writer(f, dialect="excel-tab") + cw.writerow(header) + for entry in entries: + cw.writerow(entry) with open(fph, "w", newline="", encoding="utf-8") as f: cw = csv.writer(f, dialect="excel-tab") diff --git a/fmg_flatten.py b/fmg_flatten.py new file mode 100644 index 0000000..14cd5c9 --- /dev/null +++ b/fmg_flatten.py @@ -0,0 +1,115 @@ +from struct import unpack as U +import csv +import sys + +big_endian = False + +def readint(f): + if big_endian: + return U(">i", f.read(4))[0] + else: + return U("iii", f.read(4 * 3)) + else: + a, b, c = U(" 3: + big_endian = sys.argv[3] == "big" + +en_mapping = {} +jp_mapping = {} + +with open(fp, "rb") as f: + dumpy(f, en_mapping) + +with open(fp.replace("ENGLISH", "JAPANESE"), "rb") as f: + dumpy(f, jp_mapping) + +from collections import defaultdict +mappings = defaultdict(lambda: ["", ""]) + +for k, v in en_mapping.items(): + mappings[k][0] = v + +for k, v in jp_mapping.items(): + mappings[k][1] = v + +with open(fpo, "w", newline="", encoding="utf-8") as f: + cw = csv.writer(f, dialect="excel-tab") + for k in sorted(mappings.keys()): + en_v, jp_v = mappings[k] + cw.writerow([k, en_v, jp_v]) diff --git a/param_notes.py b/param_notes.py new file mode 100644 index 0000000..32fc584 --- /dev/null +++ b/param_notes.py @@ -0,0 +1,27 @@ +from sys import argv +from struct import unpack as U + +big_endian = False +if len(argv) > 2: + big_endian = argv[2] == "big" + +with open(argv[1], "rb") as f: + f.seek(0xA) + if big_endian: + count = U(">h", f.read(2))[0] + else: + count = U("iii", f.read(3 * 4)) + else: + entryID, paramAddr, infoAddr = U("