mirror of
https://github.com/thornAvery/kep-hack.git
synced 2025-09-16 18:30:50 +12:00
text analysis and insertion code (TX_FAR targets only)
hg-commit-id: e4c007ad1c11
This commit is contained in:
parent
20c54ccd58
commit
ff60685f4e
|
@ -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()
|
||||
|
|
118
extras/insert_texts.py
Normal file
118
extras/insert_texts.py
Normal file
|
@ -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)
|
||||
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue