diff options
author | Bryan Bishop <kanzure@gmail.com> | 2012-01-07 15:13:24 -0600 |
---|---|---|
committer | Bryan Bishop <kanzure@gmail.com> | 2012-01-07 15:13:24 -0600 |
commit | ff60685f4e08699ba9655bbdd9773b6f4a8d9140 (patch) | |
tree | 6a95c2ba97c86b745b3ac8ae81a0ad7daa843fee | |
parent | 20c54ccd583d2f847e6f264d7ced057f652dd095 (diff) |
text analysis and insertion code (TX_FAR targets only)
hg-commit-id: e4c007ad1c11
-rw-r--r-- | extras/analyze_incbins.py | 26 | ||||
-rw-r--r-- | extras/insert_texts.py | 118 | ||||
-rw-r--r-- | extras/pretty_map_headers.py | 26 | ||||
-rw-r--r-- | textpre.awk | 1 |
4 files changed, 161 insertions, 10 deletions
diff --git a/extras/analyze_incbins.py b/extras/analyze_incbins.py index 7c7c93dd..4bc82c63 100644 --- a/extras/analyze_incbins.py +++ b/extras/analyze_incbins.py @@ -204,6 +204,32 @@ def dump_all_remaining_maps(): print "Inserting map id=" + str(map_id) wrapper_insert_map_header_asm(map_id) +def reset_incbins(): + "reset asm before inserting another diff" + asm = None + incbin_lines = [] + processed_incbins = {} + load_asm() + isolate_incbins() + process_incbins() + +def apply_diff(diff): + print "... Applying diff." + + #write the diff to a file + fh = open("temp.patch", "w") + fh.write(diff) + fh.close() + + #apply the patch + os.system("patch ../pokered.asm temp.patch") + + #remove the patch + os.system("rm temp.patch") + + #confirm it's working + subprocess.check_call("cd ../; make clean; LC_CTYPE=UTF-8 make", shell=True) + if __name__ == "__main__": #load map headers load_rom() diff --git a/extras/insert_texts.py b/extras/insert_texts.py new file mode 100644 index 00000000..931d16eb --- /dev/null +++ b/extras/insert_texts.py @@ -0,0 +1,118 @@ +#!/usr/bin/python2.7 +#author: Bryan Bishop <kanzure@gmail.com> +#date: 2012-01-07 +#insert TX_FAR targets into pokered.asm +import extract_maps +from analyze_texts import analyze_texts +from pretty_map_headers import map_name_cleaner, make_text_label, map_constants, find_all_tx_fars, tx_far_pretty_printer, tx_far_label_maker +import pretty_map_headers +from analyze_incbins import asm, offset_to_pointer, find_incbin_to_replace_for, split_incbin_line_into_three, generate_diff_insert, load_asm, isolate_incbins, process_incbins, reset_incbins, apply_diff +import analyze_incbins +import os, sys +import subprocess +spacing = " " +tx_fars = None + +def find_tx_far_entry(map_id, text_id): + for tx_far_line in tx_fars: + if tx_far_line[0] == map_id and tx_far_line[1] == text_id: + return tx_far_line + +def insert_tx_far(map_id, text_id, tx_far_line=None): + "inserts a tx_far" + global tx_fars + if tx_far_line == None: + tx_far_line = find_tx_far_entry(map_id, text_id) + text_pointer = tx_far_line[2] + start_address = tx_far_line[3] + tx_far_object = tx_far_line[4] + end_address = tx_far_object[1]["end_address"] + 1 #the end byte; +1 because of a bug somewhere :( + + line_number = find_incbin_to_replace_for(start_address) + if line_number == None: + print "skipping tx_far for map_id=" + str(map_id) + " text_id=" + str(text_id) + " text_pointer=" + hex(text_pointer) + " tx_far_start_address=" + hex(start_address) + return + + #also do a name check + label = tx_far_label_maker(extract_maps.map_headers[map_id]["name"], text_id) + if (label + ":") in "\n".join(analyze_incbins.asm): + print "skipping tx_far for map_id=" + str(map_id) + " text_id=" + str(text_id) + " text_pointer=" + hex(text_pointer) + " tx_far_start_address=" + hex(start_address) + return + + newlines = split_incbin_line_into_three(line_number, start_address, end_address - start_address) + tx_far_asm = tx_far_pretty_printer(tx_far_line) + + newlines = newlines.split("\n") + if len(newlines) == 2: index = 0 #replace the 1st line with new content + elif len(newlines) == 3: index = 1 #replace the 2nd line with new content + + newlines[index] = tx_far_asm + + if len(newlines) == 3 and newlines[2][-2:] == "$0": + #get rid of the last incbin line if it is only including 0 bytes + del newlines[2] + #note that this has to be done after adding in the new asm + newlines = "\n".join(line for line in newlines) + newlines = newlines.replace("$x", "$") #where does this keep coming from?? + + #signs are dumb; cluster the labels please + if "\"needs fulfilled!\", $55" in newlines: + newlines = "\n" + label + ": " + line_number += 1 + if ("STRENGTH to move!" in newlines) or ("it the way it is." in newlines): + newlines = "\n" + label + ": " + line_number += 1 + if "@\"" in newlines and not "@@\"" in newlines: + newlines = newlines.replace("@", "@@") + + #Char52 doesn't work yet? oh well + newlines = newlines.replace("Char52", "$52") + + diff = generate_diff_insert(line_number, newlines) + print "working on map_id=" + str(map_id) + " text_id=" + str(text_id) + print diff + apply_diff(diff) + +def insert_all_tx_fars(): + for tx_far in tx_fars: + map_id = tx_far[0] + text_id = tx_far[1] + #if map_id <= 185: continue #i'm just trying to get it going faster + + insert_tx_far(map_id, text_id, tx_far_line=tx_far) + + reset_incbins() + analyze_incbins.reset_incbins() + asm = None + incbin_lines = [] + processed_incbins = {} + analyze_incbins.asm = None + analyze_incbins.incbin_lines = [] + analyze_incbins.processed_incbins = {} + + load_asm() + isolate_incbins() + process_incbins() + +if __name__ == "__main__": + #load map headers and object data + extract_maps.load_rom() + extract_maps.load_map_pointers() + extract_maps.read_all_map_headers() + + #load texts (these two have different formats) + all_texts = pretty_map_headers.analyze_texts.analyze_texts() + pretty_map_headers.all_texts = all_texts + tx_fars = pretty_map_headers.find_all_tx_fars() + + #load incbins + reset_incbins() + + #insert _ViridianCityText10 + #insert_tx_far(1, 10) + + insert_all_tx_fars() + + #just me testing a pokemart sign duplicate + #insert_tx_far(3, 14) + diff --git a/extras/pretty_map_headers.py b/extras/pretty_map_headers.py index 39e8cd3d..952d6fd2 100644 --- a/extras/pretty_map_headers.py +++ b/extras/pretty_map_headers.py @@ -633,7 +633,7 @@ def object_data_pretty_printer(map_id): def find_all_tx_fars(): global all_texts - tx_fars = [] #[map_id, text_id, text_pointer, tx_far_pointer, tx_far_start_address, TX_FAR] + tx_fars = [] #[map_id, text_id, text_pointer, tx_far_pointer, TX_FAR] for map_id in all_texts: map2 = all_texts[map_id] for text_id in map2.keys(): @@ -643,10 +643,14 @@ def find_all_tx_fars(): if "TX_FAR" in command.keys(): TX_FAR = command["TX_FAR"] if TX_FAR[0]["type"] == 0x0: - tx_fars.append([map_id, text_id, analyze_texts.get_text_pointer(int(extract_maps.map_headers[map_id]["texts_pointer"], 16), text_id), TX_FAR[0]["start_address"], TX_FAR]) + tx_fars.append([map_id, text_id, analyze_texts.get_text_pointer(int(extract_maps.map_headers[map_id]["texts_pointer"], 16), text_id), command["pointer"], TX_FAR]) return tx_fars -def print_tx_far(tx_far): +def tx_far_label_maker(map_name, text_id): + label = "_" + map_name_cleaner(map_name, None)[:-2] + "Text" + str(text_id) + return label + +def tx_far_pretty_printer(tx_far): "pretty output for a tx_far" map_id = tx_far[0] map2 = extract_maps.map_headers[map_id] @@ -655,7 +659,7 @@ def print_tx_far(tx_far): tx_far_start_address = tx_far[3] text_far = tx_far[4] lines = text_far[0]["lines"] - label = "_" + map_name_cleaner(map2["name"], None)[:-2] + "Text" + str(text_id) + label = tx_far_label_maker(map2["name"], text_id) #add the ending byte on the next line #lines[len(lines.keys())+1] = [text_far[1]["type"]] @@ -663,8 +667,8 @@ def print_tx_far(tx_far): #add the ending byte to the last line- always seems $57 lines[len(lines.keys())-1].append(text_far[1]["type"]) - output = "" - output += label + ":\n" + output = "\n" + output += label + ": ; " + hex(tx_far_start_address) + "\n" first = True for line_id in lines: line = lines[line_id] @@ -701,7 +705,8 @@ def print_tx_far(tx_far): #if you want the ending byte on the last line #if not (byte == 0x57 or byte == 0x50 or byte == 0x58): - output += ", " + if not first_byte: + output += ", " output += "$" + hex(byte)[2:] was_byte = True @@ -719,8 +724,7 @@ def print_tx_far(tx_far): output += "\n" - #TODO: add $50 to the end of this - output += "\n" + #output += "\n" return output def print_all_headers(): @@ -753,6 +757,8 @@ if __name__ == "__main__": #print out only the object data for pallet town (map 0) #print object_data_pretty_printer(0) + #prepare to pretty print tx_fars + #first you must load all_texts tx_fars = find_all_tx_fars() for entry in tx_fars: - print print_tx_far(entry) + print tx_far_pretty_printer(entry) diff --git a/textpre.awk b/textpre.awk index 82a7c9c1..4858568a 100644 --- a/textpre.awk +++ b/textpre.awk @@ -287,6 +287,7 @@ else { substr(f,1,1) == "t" || substr(f,1,1) == "s" || substr(f,1,1) == "v" || + substr(f,1,1) == "d" || substr(f,1,1) == "l") { c = c substr(f,1,1) f = substr(f,2,length(f) - 1) |