ref: 7a807782142e46c9c7cf0ab3364387f4220774f5
parent: cfe485a1e6c6aafdcadbd47be9098c37ca88f167
author: Bryan Bishop <kanzure@gmail.com>
date: Thu Jan 5 18:15:30 EST 2012
a script to insert map object data into pokered.asm hg-commit-id: 1026aadb307e
--- /dev/null
+++ b/extras/insert_object_data.py
@@ -1,0 +1,83 @@
+#!/usr/bin/python2.7
+#author: Bryan Bishop <kanzure@gmail.com>
+#date: 2012-01-05
+#insert object data into pokered.asm
+import extract_maps
+from pretty_map_headers import map_name_cleaner, object_data_pretty_printer, make_object_label_name, make_text_label, map_constants
+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
+import analyze_incbins
+import os, sys
+import subprocess
+spacing = " "
+
+def insert_object(map_id):
+ map = extract_maps.map_headers[map_id]
+ object = map["object_data"]
+ size = extract_maps.compute_object_data_size(object)
+ address = int(map["object_data_pointer"], 16)
+
+ line_number = find_incbin_to_replace_for(address)
+ if line_number == None:
+ print "skipping object data for map " + str(map["id"]) + " at " + map["object_data_pointer"] + " for " + str(size) + " bytes."
+ return
+
+ newlines = split_incbin_line_into_three(line_number, address, size)
+ object_asm = object_data_pretty_printer(map_id)
+
+ 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] = object_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)
+
+ diff = generate_diff_insert(line_number, newlines)
+ print 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)
+
+def insert_all_objects():
+ for map_id in extract_maps.map_headers.keys():
+ if map_id not in extract_maps.bad_maps:
+ insert_object(map_id)
+
+ 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 incbins
+ load_asm()
+ isolate_incbins()
+ process_incbins()
+
+ #insert_object(1)
+ insert_all_objects()
+