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 /extras/insert_texts.py | |
parent | 20c54ccd583d2f847e6f264d7ced057f652dd095 (diff) |
text analysis and insertion code (TX_FAR targets only)
hg-commit-id: e4c007ad1c11
Diffstat (limited to 'extras/insert_texts.py')
-rw-r--r-- | extras/insert_texts.py | 118 |
1 files changed, 118 insertions, 0 deletions
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) + |