ref: 242a02aaa79966c25cc0ffc1985fda30753c475d
parent: f1054129e2869a093585f5779259cbb11f9241bb
author: Bryan Bishop <[email protected]>
date: Fri Jan 6 09:23:12 EST 2012
analyze_text now works with TX_FAR hg-commit-id: a32cf6cdc6f2
--- a/extras/analyze_texts.py
+++ b/extras/analyze_texts.py
@@ -5,6 +5,7 @@
import extract_maps
from pretty_map_headers import map_name_cleaner
from operator import itemgetter
+import sys
debug = False #set to True to increase logging output
#how many times is each command byte called?
@@ -30,6 +31,32 @@
if debug:
print "byte is " + str(command_byte) + " on text #" + str(text_id) + " at " + hex(text_pointer) + " on map " + str(map_id) + " (" + extract_maps.map_headers[map_id]["name"] + ")"
+def add_command_byte_to_totals(byte):
+ global totals
+ if not byte in totals.keys(): totals[byte] = 1
+ else: totals[byte] += 1
+
+def process_00_subcommands(start_address, end_address):
+ """split this text up into multiple lines
+ based on subcommands ending each line"""
+ lines = {}
+ subsection = extract_maps.rom[start_address:end_address]
+
+ line_count = 0
+ current_line = []
+ for pbyte in subsection:
+ byte = ord(pbyte)
+ current_line.append(hex(byte))
+ if byte == 0x4f or byte == 0x51 or byte == 0x55:
+ lines[line_count] = current_line
+ current_line = []
+ line_count += 1
+
+ #don't forget the last line
+ lines[line_count] = current_line
+ line_count += 1
+ return lines
+
def parse_text_script(text_pointer, text_id, map_id):
global total_text_commands
offset = text_pointer
@@ -41,27 +68,29 @@
command = {}
command_byte = ord(extract_maps.rom[offset])
+ print_command_debug_info(command_byte, text_id, text_pointer, map_id)
if command_byte == 0:
- print_command_debug_info(command_byte, text_id, text_pointer, map_id)
+ #read until $57, $50 or $58
+ jump57 = how_many_until(chr(0x57), offset)
+ jump50 = how_many_until(chr(0x50), offset)
+ jump58 = how_many_until(chr(0x58), offset)
+
+ #whichever command comes first
+ jump = min([jump57, jump50, jump58])
- #read until $57
- jump = how_many_until(str(57), offset)
- end_address = offset + jump
+ end_address = offset + jump - 1 #we want the address before $57
command = {"type": command_byte,
"start_address": offset,
"end_address": end_address,
"size": jump,
+ "lines": process_00_subcommands(offset+1, end_address),
}
- offset += end_address + 1
+ offset += jump
if not 0x0 in totals.keys(): totals[0x0] = 1
else: totals[0x0] += 1
-
- end = True
elif command_byte == 0x17:
- print_command_debug_info(command_byte, text_id, text_pointer, map_id)
-
#TX_FAR [pointer][bank]
pointer_byte1 = ord(extract_maps.rom[offset+1])
pointer_byte2 = ord(extract_maps.rom[offset+2])
@@ -73,17 +102,28 @@
command = {"type": command_byte,
"start_address": offset,
"end_address": offset + 3,
- "pointer": pointer,
+ "pointer": pointer, #parameter
}
- offset += 3
- if not 0x17 in totals.keys(): totals[0x17] = 1
- else: totals[0x17] += 1
+ offset += 3 + 1
+ add_command_byte_to_totals(0x17)
+ elif command_byte == 0x50 or command_byte == 0x57 or command_byte == 0x58: #end text
+ command = {"type": command_byte,
+ "start_address": offset,
+ "end_address": offset,
+ }
+ add_command_byte_to_totals(command_byte)
+
+ #this byte simply indicates to end the script
end = True
else:
- if not command_byte in totals.keys(): totals[command_byte] = 1
- else: totals[command_byte] += 1
+ add_command_byte_to_totals(command_byte)
+
+ if len(commands) > 0:
+ print "Unknown text command " + hex(command_byte) + " at " + hex(offset) + ", script began with " + hex(commands[0]["type"])
+ #print "Unknown text command at " + hex(offset)
+ #end at the first unknown command
end = True
commands[command_counter] = command
@@ -109,6 +149,22 @@
text_pointer = get_text_pointer(texts_pointer, text_id)
text_pointer = extract_maps.calculate_pointer(text_pointer, int(map2["bank"], 16))
commands = parse_text_script(text_pointer, text_id, map_id)
+
+ #process TX_FARs
+ for command_id in commands:
+ #skip commands starting with an unknown command byte
+ if len(commands[command_id]) == 0: continue
+
+ if commands[command_id]["type"] == 0x17:
+ TX_FAR = parse_text_script(commands[command_id]["pointer"], text_id, map_id)
+ if len(TX_FAR.keys()) > 0:
+ print "TX_FAR object: " + str(TX_FAR)
+ print TX_FAR[TX_FAR.keys()[0]]
+ print "processing a TX_FAR at " + hex(commands[command_id]["pointer"]) + "... first byte is: " + str(ord(extract_maps.rom[commands[command_id]["pointer"]])) + " .. offset: " + hex(commands[command_id]["pointer"])
+ #sys.exit(0)
+
+ commands[command_id]["TX_FAR"] = TX_FAR
+ #map2["texts"][text_id][command_id]["TX_FAR"] = parse_text_script(command["pointer"], text_id, map_id)
map2["texts"][text_id] = commands
texts[map_id] = map2["texts"]
@@ -119,7 +175,8 @@
extract_maps.load_rom()
extract_maps.load_map_pointers()
extract_maps.read_all_map_headers()
- print analyze_texts()
+ text_output = analyze_texts()
+ #print text_output
print "\n\n---- stats ----\n\n"
--- a/pokered.asm
+++ b/pokered.asm
@@ -5646,8 +5646,8 @@
TX_FAR _OakWalksUpText
db "@"
-PalletTownText2: ; girl
- TX_FAR _PalletTownText2
+PalletTownText2: ; girl 0x18fd3
+ TX_FAR _PalletTownText2 ; dc 42 29 pointing to 0xa42dc
db "@"
PalletTownText3: ; fat man