summaryrefslogtreecommitdiff
path: root/extras
diff options
context:
space:
mode:
Diffstat (limited to 'extras')
-rw-r--r--extras/extract_maps.py2
-rw-r--r--extras/insert_object_data.py83
-rw-r--r--extras/pretty_map_headers.py28
-rw-r--r--extras/sprite_helper.py8
4 files changed, 110 insertions, 11 deletions
diff --git a/extras/extract_maps.py b/extras/extract_maps.py
index 1c4dc5d9..d1efb16a 100644
--- a/extras/extract_maps.py
+++ b/extras/extract_maps.py
@@ -532,7 +532,7 @@ def get_object_data(address):
def compute_object_data_size(object):
size = 4
- size += 6 * (object["number_of_things"])
+ size += 6 * (int(object["number_of_things"]))
trainer_count = 0
item_count = 0
diff --git a/extras/insert_object_data.py b/extras/insert_object_data.py
new file mode 100644
index 00000000..0e03a369
--- /dev/null
+++ b/extras/insert_object_data.py
@@ -0,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()
+
diff --git a/extras/pretty_map_headers.py b/extras/pretty_map_headers.py
index 527f8948..0a483b9b 100644
--- a/extras/pretty_map_headers.py
+++ b/extras/pretty_map_headers.py
@@ -4,6 +4,7 @@
#purpose: dump asm for each map header
import json
import extract_maps
+import sprite_helper
import random
import string
@@ -415,6 +416,12 @@ def make_object_label_name(name):
name = map_name_cleaner(name, None)
return name.replace("_h", "") + "Object"
+def make_text_label(map_name, id):
+ """using standard object labels
+ for instance, PalletTownText3"""
+ label = map_name_cleaner(map_name, None)[:-2] + "Text" + str(id)
+ return label
+
def object_data_pretty_printer(map_id):
map = extract_maps.map_headers[map_id]
output = ""
@@ -437,7 +444,10 @@ def object_data_pretty_printer(map_id):
warp_to_point = warp["warp_to_point"]
warp_to_map_id = warp["warp_to_map_id"]
- warp_to_map_constant = map_constants[warp_to_map_id]
+ try:
+ warp_to_map_constant = map_constants[warp_to_map_id]
+ except Exception, exc:
+ warp_to_map_constant = "$" + hex(warp_to_map_id)[2:]
output += spacing + "db $" + hex(int(y))[2:] + ", $" + hex(int(x))[2:] + ", $" + hex(int(warp_to_point))[2:] + ", " + warp_to_map_constant + "\n"
@@ -451,7 +461,7 @@ def object_data_pretty_printer(map_id):
x = sign["x"]
text_id = sign["text_id"]
- output += spacing + "db $" + hex(int(y))[2:] + ", $" + hex(int(x))[2:] + ", $" + hex(int(text_id))[2:] + "\n"
+ output += spacing + "db $" + hex(int(y))[2:] + ", $" + hex(int(x))[2:] + ", $" + hex(int(text_id))[2:] + " ; " + make_text_label(map["name"], text_id) + "\n"
output += "\n"
output += spacing + "db $" + hex(int(object["number_of_things"]))[2:] + " ; people\n"
@@ -475,13 +485,12 @@ def object_data_pretty_printer(map_id):
movement2 = hex(int(thing["movement2"]))[2:]
text_id = hex(int(thing["original_text_string_number"]))[2:]
- output += spacing + "db $" + picture_number + ", $" + y + " + 4, $" + x + " + 4, $" + movement1 + ", $" + movement2 + ", $" + text_id + ending
+ output += spacing + "db " + sprite_helper.sprites[thing["picture_number"]] + ", $" + y + " + 4, $" + x + " + 4, $" + movement1 + ", $" + movement2 + ", $" + text_id + ending
output += "\n"
if object["number_of_warps"] > 0:
output += spacing + "; warp-to\n"
- output += "\n"
for warp_to_id in object["warp_tos"]:
warp_to = object["warp_tos"][warp_to_id]
@@ -489,11 +498,16 @@ def object_data_pretty_printer(map_id):
warp_to_y = hex(int(warp_to["y"]))[2:]
warp_to_x = hex(int(warp_to["x"]))[2:]
- output += spacing + "EVENT_DISP $" + map_width[2:] + ", $" + warp_to_y + ", $" + warp_to_x + "\n"
+ try:
+ previous_location = map_constants[object["warps"][warp_to_id]["warp_to_map_id"]]
+ comment = " ; " + previous_location
+ except Exception, exc:
+ comment = ""
+
+ output += spacing + "EVENT_DISP $" + map_width[2:] + ", $" + warp_to_y + ", $" + warp_to_x + comment + "\n"
#output += spacing + "dw $" + hex(int(warp_to["event_displacement"][1]))[2:] + hex(int(warp_to["event_displacement"][0]))[2:] + "\n"
#output += spacing + "db $" + hex(int(warp_to["y"]))[2:] + ", $" + hex(int(warp_to["x"]))[2:] + "\n"
-
- output += "\n"
+ #output += "\n"
output += "\n"
diff --git a/extras/sprite_helper.py b/extras/sprite_helper.py
index f5ba1b13..4dec622f 100644
--- a/extras/sprite_helper.py
+++ b/extras/sprite_helper.py
@@ -73,7 +73,7 @@ constants = {
0x41: ["book/map/dex", ""],
0x42: ["clipboard", ""],
0x43: ["snorlax", ""],
-0x44: ["old amber", ""],
+0x44: ["old amber copy", ""],
0x45: ["old amber", ""],
0x46: ["lying old man unused 1", ""],
0x47: ["lying old man unused 2", ""],
@@ -83,6 +83,7 @@ constants = {
icons = {}
unique_icons = set()
todo_sprites = {}
+sprites = {}
def load_icons():
for map_id in map_headers:
@@ -146,7 +147,6 @@ def sprite_name_cleaner(badname):
def sprite_namer():
"makes up better constant names for each sprite"
insert_todo_sprites()
- sprites = {}
for sprite_id in constants:
suggestions = constants[sprite_id]
@@ -160,6 +160,7 @@ def sprite_namer():
result = sprite_name_cleaner(original)
sprites[sprite_id] = result
+def sprite_printer():
for key in sprites:
line_length = len(sprites[key]) + len(" EQU $") + 2
@@ -172,8 +173,9 @@ def sprite_namer():
print sprites[key] + extra + " EQU $" + value
+sprite_namer()
if __name__ == "__main__":
#load_icons()
#print_appearances()
- sprite_namer()
+ sprite_printer()