Exemple #1
0
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)
Exemple #2
0
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])
Exemple #3
0
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)
Exemple #5
0
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)