def extract(args): with open(args.filenames[0], 'rb') as rom: asmsrc, files = rip_msprite_mtable(rom, args.metatable_loc) for filename, data in files.items(): install_path(os.path.dirname(filename)) with io.open(filename, "w+", encoding="utf-8") as spr_csv: spr_csv.write(data) print(asmsrc)
def extract_bank(args, rom, bank, bank_dir): this_bank, this_table = decompress_bank(rom, 0x4000 * bank) for j, data in enumerate(this_bank): csvpath = os.path.join(args.output, "unknown", bank_dir) mainscript_text.install_path(csvpath) with open(os.path.join(csvpath, "{0:x}.csv".format(j)), "w+") as csvout: csvwriter = csv.writer(csvout) for row in data[:-1]: csvwriter.writerow(row) #Workaround for a csv.writer bug if len(data) > 0 and len(data[-1]) == 0: csvout.write(",") elif len(data) > 0: csvwriter.writerow(data[-1])
def extract(args): charmap = mainscript_text.parse_charmap(args.charmap) tablenames = parse_tablenames(args.tablenames) with open(args.rom, 'rb') as rom: #Extract a list of pointers each index is expecting #This is used for trash byte detection later for table in tablenames: if table["format"] != "index": continue try: all_ptrs = tablenames[table["foreign_id"]]["expected_ptrs"] except KeyError: all_ptrs = [] rom.seek(mainscript_text.flat(table["basebank"], table["baseaddr"])) for i in range(table["count"]): ptr = mainscript_text.PTR.unpack(rom.read(2))[0] addr = mainscript_text.flat(table["basebank"], ptr) if addr not in all_ptrs: all_ptrs.append(addr) all_ptrs.sort() tablenames[table["foreign_id"]]["expected_ptrs"] = all_ptrs for table in tablenames: #Indexes are extracted in a second pass if table["format"] == "index": continue entries = [] reverse_entries = {} try: expected_ptrs = table["expected_ptrs"] except KeyError: expected_ptrs = None csvdir = os.path.join(args.input, table["basedir"]) csvpath = os.path.join(args.input, table["filename"]) mainscript_text.install_path(csvdir) with open(csvpath, "w+", encoding="utf-8") as table_csvfile: csvwriter = csv.writer(table_csvfile) csvwriter.writerow(["#", args.language]) if table["format"] == "table": for i in range(table["count"]): rom.seek(mainscript_text.flat(table["basebank"], table["baseaddr"] + i * table["stride"])) reverse_entries[rom.tell()] = len(entries) entries.append(rom.tell()) data = extract_string(rom, charmap, table["stride"], expected_ptrs).encode("utf-8") idx = "{0}".format(i + 1).encode("utf-8") csvwriter.writerow([idx, data]) elif table["format"] == "block": rom.seek(mainscript_text.flat(table["basebank"], table["baseaddr"])) for i in range(table["count"]): reverse_entries[rom.tell()] = len(entries) entries.append(rom.tell()) data = extract_string(rom, charmap, None, expected_ptrs).encode("utf-8") idx = "{0}".format(i + 1).encode("utf-8") csvwriter.writerow([idx, data]) #Save these for later table["entries"] = entries table["reverse_entries"] = reverse_entries #OK, now we can extract the indexes for table in tablenames: if table["format"] != "index": continue foreign_ptrs = tablenames[table["foreign_id"]]["reverse_entries"] rom.seek(mainscript_text.flat(table["basebank"], table["baseaddr"])) csvdir = os.path.join(args.input, table["basedir"]) csvpath = os.path.join(args.input, table["filename"]) mainscript_text.install_path(csvdir) with open(csvpath, "w+", encoding="utf-8") as table_csvfile: csvwriter = csv.writer(table_csvfile) pretty_row_length = math.ceil(math.sqrt(table["count"])) cur_row = [] for i in range(table["count"]): ptr = mainscript_text.PTR.unpack(rom.read(2))[0] addr = mainscript_text.flat(table["basebank"], ptr) cur_row.append("{0}".format(foreign_ptrs[addr] + 1).encode("utf-8")) if len(cur_row) >= pretty_row_length: csvwriter.writerow(cur_row) cur_row = [] if len(cur_row) > 0: csvwriter.writerow(cur_row)