shithub: pokered

Download patch

ref: d0be12ead077b7b501b3c9a53565b421ad241dd1
parent: 6bad9c837c2d502a0c2e52a3ecf9235765d2473f
author: Bryan Bishop <kanzure@gmail.com>
date: Fri Jan 6 20:34:22 EST 2012

somewhat buggy TX_FAR pretty printer

hg-commit-id: 94a023e4e37e


--- a/extras/analyze_texts.py
+++ b/extras/analyze_texts.py
@@ -46,7 +46,7 @@
     current_line = []
     for pbyte in subsection:
         byte = ord(pbyte)
-        current_line.append(hex(byte))
+        current_line.append(byte)
         if  byte == 0x4f or byte == 0x51 or byte == 0x55:
             lines[line_count] = current_line
             current_line = []
--- a/extras/pretty_map_headers.py
+++ b/extras/pretty_map_headers.py
@@ -1,4 +1,5 @@
 #!/usr/bin/python
+# -*- coding: utf-8 -*-
 #author: Bryan Bishop <kanzure@gmail.com>
 #date: 2012-01-02
 #purpose: dump asm for each map header
@@ -7,9 +8,11 @@
 import sprite_helper
 import random
 import string
+import analyze_texts #hopefully not a dependency loop
 
 base = 16
 spacing = "    "
+all_texts = None
 
 #map constants
 map_constants = [
@@ -245,6 +248,112 @@
 map_constants = temp
 del temp
 
+#these appear outside of quotes
+constant_abbreviation_bytes = {
+    0x4A: "Char4A",
+    0x52: "Char52",
+    0x53: "Char53",
+    0x54: "Char54",
+    0x56: "Char56",
+    0x5B: "Char5B",
+    0x5C: "Char5C",
+    0x5D: "Char5D",
+    0x5E: "Char5E",
+}
+
+#these appear in quotes
+char_conversion = [
+(" ", 0x7F),
+("A", 0x80),
+("B", 0x81),
+("C", 0x82),
+("D", 0x83),
+("E", 0x84),
+("F", 0x85),
+("G", 0x86),
+("H", 0x87),
+("I", 0x88),
+("J", 0x89),
+("K", 0x8A),
+("L", 0x8B),
+("M", 0x8C),
+("N", 0x8D),
+("O", 0x8E),
+("P", 0x8F),
+("Q", 0x90),
+("R", 0x91),
+("S", 0x92),
+("T", 0x93),
+("U", 0x94),
+("V", 0x95),
+("W", 0x96),
+("X", 0x97),
+("Y", 0x98),
+("Z", 0x99),
+("(", 0x9A),
+(")", 0x9B),
+(":", 0x9C),
+(";", 0x9D),
+("[", 0x9E),
+("]", 0x9F),
+("a", 0xA0),
+("b", 0xA1),
+("c", 0xA2),
+("d", 0xA3),
+("e", 0xA4),
+("f", 0xA5),
+("g", 0xA6),
+("h", 0xA7),
+("i", 0xA8),
+("j", 0xA9),
+("k", 0xAA),
+("l", 0xAB),
+("m", 0xAC),
+("n", 0xAD),
+("o", 0xAE),
+("p", 0xAF),
+("q", 0xB0),
+("r", 0xB1),
+("s", 0xB2),
+("t", 0xB3),
+("u", 0xB4),
+("v", 0xB5),
+("w", 0xB6),
+("x", 0xB7),
+("y", 0xB8),
+("z", 0xB9),
+("é", 0xBA),
+("'s", 0xBD),
+("'t", 0xBE),
+("'", 0xE0),
+("-", 0xE3),
+("?", 0xE6),
+("!", 0xE7),
+(".", 0xE8),
+("♂", 0xEF),
+("/", 0xF3),
+(",", 0xF4),
+("♀", 0xF5),
+("0", 0xF6),
+("1", 0xF7),
+("2", 0xF8),
+("3", 0xF9),
+("4", 0xFA),
+("5", 0xFB),
+("6", 0xFC),
+("7", 0xFD),
+("8", 0xFE),
+("9", 0xFF)]
+#these appear in quotes
+txt_bytes = {
+    0x50: "@",
+    0x54: "#",
+    0x75: "…",
+}
+for item in char_conversion:
+    txt_bytes[item[1]] = item[0]
+del char_conversion
+
 #this was originally for renaming freeze maps for a unique name
 def random_hash():
     available_chars = string.hexdigits[:16]
@@ -517,6 +626,82 @@
     output += "\n"
     return output
 
+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]
+    for map_id in all_texts:
+        map2 = all_texts[map_id]
+        for text_id in map2.keys():
+            text = map2[text_id]
+            for command_id in text.keys():
+                command = text[command_id]
+                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])
+    return tx_fars
+
+def print_tx_far(tx_far):
+    "pretty output for a tx_far"
+    map_id = tx_far[0]
+    map2 = extract_maps.map_headers[map_id]
+    text_id = tx_far[1]
+    text_pointer = tx_far[2]
+    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)
+
+    output  = ""
+    output += label + ":\n"
+    first = True
+    for line_id in lines:
+        line = lines[line_id]
+        output += spacing + "db "
+        if first:
+            output += "$0, "
+            first = False
+        
+        quotes_open = False
+        first_byte = True
+        byte_count = 0
+        for byte in line:
+            if byte in txt_bytes:
+                if not quotes_open and not first_byte: #start text
+                    output += ", \""
+                    quotes_open = True
+                    first_byte = False
+                if not quotes_open and first_byte: #start text
+                    output += "\""
+                    quotes_open = True
+                output += txt_bytes[byte]
+            elif byte in constant_abbreviation_bytes:
+                if quotes_open:
+                    output += "\""
+                    quotes_open = False
+                output += ", " + constant_abbreviation_bytes[byte]
+            else:
+                if quotes_open:
+                    output += "\""
+                    quotes_open = False
+                output += ", $" + hex(byte)[2:]
+
+                #add a comma unless it's the end of the line
+                if byte_count+1 != len(line):
+                    output += ", "
+
+            byte_count += 1
+        #close final quotes
+        if quotes_open:
+            output += "\""
+            quotes_open = False
+
+        output += "\n"
+
+    #TODO: add $50 to the end of this
+    output += "\n"
+    return output
+
 def print_all_headers():
     maps = []
     for map in extract_maps.map_headers:
@@ -538,8 +723,15 @@
     #load map headers into memory
     extract_maps.read_all_map_headers()
 
+    #load texts
+    all_texts = analyze_texts.analyze_texts()
+
     #print them out
     #print_all_headers()
 
     #print out only the object data for pallet town (map 0)
-    print object_data_pretty_printer(0)
+    #print object_data_pretty_printer(0)
+
+    tx_fars = find_all_tx_fars()
+    for entry in tx_fars:
+        print print_tx_far(entry)