shithub: pokecrystal

Download patch

ref: 9189b3f6e02296e5dac76641543db92f59e720cc
parent: 6eb1478f1b89eea93744ac67cd2d198d951ac9ca
author: Bryan Bishop <[email protected]>
date: Sun Apr 29 11:15:48 EDT 2012

begin to rewrite the text parser

--- a/extras/crystal.py
+++ b/extras/crystal.py
@@ -385,6 +385,183 @@
     #info1 += "    long_info: " + long_info
     return info1
 
+class TextCommand: pass
+class MainText(TextCommand):
+    "Write text. Structure: [00][Text][0x50 (ends code)]"
+    id = 0x0
+    macro_name = "do_text"
+class WriteTextFromRAM(TextCommand):
+    """
+    Write text from ram. Structure: [01][Ram address (2byte)]
+    For valid ram addresses see Glossary. This enables use of variable text strings.
+    """
+    id = 0x1
+    macro_name = "text_from_ram"
+class WriteNumberFromRAM(TextCommand):
+    """
+    02 = Write number from ram. Structure: [02][Ram address (2byte)][Byte]
+ 
+    Byte:
+   
+    Bit5:Bit6:Bit7
+       1:   1:   1 = PokéDollar| Don’t write zeros
+       0:   1:   1 = Don’t write zeros
+       0:   0:   1 = Spaces instead of zeros
+       0:   0:   0 = Write zeros
+       0:   1:   0 = Write zeros
+       1:   0:   0 = PokéDollar
+       1:   1:   0 = PokéDollar
+       1:   0:   1 = Spaces instead of zeros| PokéDollar
+ 
+    Number of figures = Byte AND 0x1F *2
+    No Hex --> Dec Conversio
+    """
+    id = 0x2
+    macro_name = "number_from_ram"
+class SetWriteRAMLocation(TextCommand):
+    "Define new ram address to write to. Structure: [03][Ram address (2byte)]"
+    id = 0x3
+    macro_name = "store_at"
+class ShowBoxWithValueAt(TextCommand):
+    "04 = Write a box. Structure: [04][Ram address (2byte)][Y][X]"
+    id = 0x4
+    macro_name = "text_box"
+class Populate2ndLineOfTextBoxWithRAMContents(TextCommand):
+    "05 = New ram address to write to becomes 2nd line of a text box. Structure: [05]"
+    id = 0x5
+    macro_name = "text_dunno1"
+class ShowArrowsAndButtonWait(TextCommand):
+    "06 = Wait for key down + show arrows. Structure: [06]"
+    id = 0x6
+    macro_name = "waitbutton"
+class Populate2ndLine(TextCommand):
+    """
+    07 = New ram address to write to becomes 2nd line of a text box
+    Textbox + show arrows. Structure: [07]
+    """
+    id = 0x7
+    macro_name = "text_dunno2"
+class TextInlineAsm(TextCommand):
+    "08 = After the code an ASM script starts. Structure: [08][Script]"
+    id = 0x8
+    macro_name = "start_asm"
+class WriteDecimalNumberFromRAM(TextCommand):
+    """
+    09 = Write number from rom/ram in decimal. Structure: [09][Ram address/Pointer (2byte)][Byte]
+      Byte:
+ 
+      Is split: 1. 4 bits = Number of bytes to load. 0 = 3, 1 = 1, 2 = 2
+                2. 4 bits = Number of figures of displayed number
+                                                     0 = Don’t care
+                                                     1 = Don’t care
+                                                     >=2 = Number
+    """
+    id = 0x9
+    macro_name = "deciram"
+class InterpretDataStream(TextCommand):
+    """
+    0A = Interpret Data stream. Structure: [0A]
+    see: http://hax.iimarck.us/files/scriptingcodes_eng.htm#Marke88
+    """
+    id = 0xA
+    macro_name = "interpret_data"
+class Play0thSound(TextCommand):
+    "0B = Play sound 0x0000. Structure: [0B]"
+    id = 0xB
+    sound_num = 0
+    macro_name = "sound0"
+class LimitedIntrepretDataStream(TextCommand):
+    """
+    0C = Interpret Data stream. Structure: [0C][Number of codes to interpret]
+    For every interpretation there is a“…“ written
+    """
+    id = 0xC
+    macro_name = "limited_interpret_data"
+class WaitForKeyDownDisplayArrow(ShowArrowsAndButtonWait):
+    """
+    0D = Wait for key down  display arrow. Structure: [0D]
+    """
+    id = 0xD
+    macro_name = "waitbutton2"
+class Play9thSound(Play0thSound):
+    id = 0xE
+    sound_num = 9
+    macro_name = "sound0x09"
+class Play1stSound(Play0thSound):
+    id = 0xF
+    sound_num = 1
+    macro_name = "sound0x0F"
+class Play2ndSound(Play0thSound):
+    id = 0x10
+    sound_num = 2
+    macro_name = "sound0x02"
+class Play10thSound(Play0thSound):
+    id = 0x11
+    sound_num = 10
+    macro_name = "sound0x0A"
+class Play45thSound(Play0thSound):
+    id = 0x12
+    sound_num = 0x2D
+    macro_name = "sound0x2D"
+class Play44thSound(Play0thSound):
+    id = 0x13
+    sound_num = 0x2C
+    macro_name = "sound0x2C"
+class DisplayByteFromRAMAt(TextCommand):
+    """
+    14 = Display MEMORY. Structure: [14][Byte]
+ 
+    Byte:
+ 
+      00 = MEMORY1
+      01 = MEMORY2
+      02 = MEMORY
+      04 = TEMPMEMORY2
+      05 = TEMPMEMORY1
+    """
+    id = 0x14
+    macro_name = "show_byte_at"
+class WriteCurrentDay(TextCommand):
+    "15 = Write current day. Structure: [15]"
+    id = 0x15
+    macro_name = "current_day"
+class TextJump(TextCommand):
+    "16 = 3byte pointer to new text follows. Structure: [16][2byte pointer][bank]"
+    id = 0x16
+    macro_name = "text_jump"
+
+class NewTextScript:
+    """ A text is a sequence of bytes (and sometimes commands). It's not the
+    same thing as a Script. The bytes are translated into characters based
+    on the lookup table (see chars.py). The in-text commands are for including
+    values from RAM, playing sound, etc.
+
+    see: http://hax.iimarck.us/files/scriptingcodes_eng.htm#InText
+    """
+    base_label = "UnknownText_"
+    def __init__(self, address, map_group=None, map_id=None, debug=True, label=None):
+        self.address = address
+        self.map_group, self.map_id, self.debug = map_group, map_id, debug
+        self.dependencies = []
+        self.commands = []
+        
+        if not label:
+            label = self.base_label + hex(address)
+        self.label = Label(name=label, address=address, object=self)
+        
+        self.parse()
+
+    def get_dependencies(self, recompute=False, global_dependencies=set()):
+        global_dependencies.update(self.dependencies)
+        return self.dependencies
+
+    def parse(self):
+        global text_command_classes, script_parse_table
+        raise NotImplementedError, bryan_message
+
+    def to_asm(self):
+        pass
+
 class TextScript:
     "a text is a sequence of commands different from a script-engine script"
     base_label = "UnknownText_"