summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryenatch <yenatch@gmail.com>2013-12-01 14:23:15 -0500
committeryenatch <yenatch@gmail.com>2013-12-01 16:26:15 -0500
commit2a44f6e448983c59afa3cb043a50d4f4cb35d37c (patch)
treed402b697072223bf47f887b84ae18a853f533ccd
parent10d8edbc3b52dbb2dfad38917c7dc233ab5e1301 (diff)
crystal: some new param classes and reword bittable1 -> event flag
-rw-r--r--pokemontools/crystal.py418
1 files changed, 366 insertions, 52 deletions
diff --git a/pokemontools/crystal.py b/pokemontools/crystal.py
index cdab01f..4e556d8 100644
--- a/pokemontools/crystal.py
+++ b/pokemontools/crystal.py
@@ -71,6 +71,7 @@ import configuration
conf = configuration.Config()
from map_names import map_names
+from song_names import song_names
# ---- script_parse_table explanation ----
# This is an IntervalMap that keeps track of previously parsed scripts, texts
@@ -1422,6 +1423,18 @@ class DataByteWordMacro(Command):
def parse(self): pass
def to_asm(self): pass
+
+event_flags = wram.read_constants(os.path.join(conf.path, 'constants/event_flags.asm'))
+
+class EventFlagParam(MultiByteParam):
+
+ def to_asm(self):
+ if self.parsed_number in event_flags.keys():
+ return event_flags[self.parsed_number]
+ return MultiByteParam.to_asm(self)
+
+
+
class MovementCommand(Command):
# the vast majority of movement commands do not end the movement script
end = False
@@ -2231,12 +2244,12 @@ pksv_crystal_more = {
0x2E: ["giveegg", ["pkmn", PokemonParam], ["level", DecimalParam]],
0x2F: ["givepokeitem", ["pointer", PointerParamToItemAndLetter]],
0x30: ["checkpokeitem", ["pointer", PointerParamToItemAndLetter]], # not pksv
- 0x31: ["checkevent", ["bit_number", MultiByteParam]],
- 0x32: ["clearevent", ["bit_number", MultiByteParam]],
- 0x33: ["setevent", ["bit_number", MultiByteParam]],
- 0x34: ["checkflag", ["bit_number", MultiByteParam]],
- 0x35: ["clearflag", ["bit_number", MultiByteParam]],
- 0x36: ["setflag", ["bit_number", MultiByteParam]],
+ 0x31: ["checkevent", ["event_flag", EventFlagParam]],
+ 0x32: ["clearevent", ["event_flag", EventFlagParam]],
+ 0x33: ["setevent", ["event_flag", EventFlagParam]],
+ 0x34: ["checkflag", ["event_flag", EventFlagParam]],
+ 0x35: ["clearflag", ["event_flag", EventFlagParam]],
+ 0x36: ["setflag", ["event_flag", EventFlagParam]],
0x37: ["wildon"],
0x38: ["wildoff"],
0x39: ["xycompare", ["pointer", MultiByteParam]],
@@ -2318,7 +2331,7 @@ pksv_crystal_more = {
0x81: ["musicfadeout", ["music", MultiByteParam], ["fadetime", SingleByteParam]],
0x82: ["playmapmusic"],
0x83: ["reloadmapmusic"],
- 0x84: ["cry", ["cry_id", MultiByteParam]], # XXX maybe it should use PokemonParam
+ 0x84: ["cry", ["cry_id", PokemonParam]],
0x85: ["playsound", ["sound_pointer", MultiByteParam]],
0x86: ["waitbutton"],
0x87: ["warpsound"],
@@ -2354,7 +2367,7 @@ pksv_crystal_more = {
0xA5: ["displaylocation", ["id", SingleByteParam], ["memory", SingleByteParam]],
0xA6: ["trainerclassname", ["id", SingleByteParam]],
0xA7: ["name", ["type", SingleByteParam], ["id", SingleByteParam]],
- 0xA8: ["wait", ["unknown", SingleByteParam]],
+ 0xA8: ["wait", ["duration", DecimalParam]],
0xA9: ["unknown0xa9"],
}
def create_command_classes(debug=False):
@@ -3261,14 +3274,14 @@ class TrainerFragment(Command):
Maybe this shouldn't be a Command. The output might sprawl
over multiple lines, and maybe it should be commented in to_asm?
- [Bit no. (2byte)][Trainer group][Trainer]
+ [Event flag (2byte)][Trainer group][Trainer]
[2byte pointer to Text when seen]
[2byte pointer to text when trainer beaten]
[2byte pointer to script when lost (0000=Blackout)]
[2byte pointer to script if won/talked to again]
- The bit number tell the game later on if the trainer has been
- beaten already (bit = 1) or not (bit = 0). All Bit number of BitTable1.
+ The event flag tells the game later on if the trainer has been
+ beaten already (set) or not (reset).
03 = Nothing
04 = Nothing
@@ -3280,7 +3293,7 @@ class TrainerFragment(Command):
base_label = "Trainer_"
override_byte_check = True
param_types = {
- 0: {"name": "bit_number", "class": MultiByteParam},
+ 0: {"name": "event_flag", "class": EventFlagParam},
1: {"name": "trainer_group", "class": TrainerGroupParam},
2: {"name": "trainer_id", "class": TrainerIdParam},
3: {"name": "text_when_seen", "class": TextPointerLabelParam},
@@ -3374,7 +3387,7 @@ class TrainerFragment(Command):
def to_asm(self):
xspacing = ""
output = ""
- output += xspacing + "; bit/flag number\n"
+ output += xspacing + "; event flag\n"
output += xspacing + "dw $%.2x"%(self.params[0].parsed_number)
output += "\n\n"+xspacing+"; trainer group && trainer id\n"
output += xspacing + "db %s, %s" % (self.params[1].to_asm(), self.params[2].to_asm())
@@ -3930,13 +3943,188 @@ def make_trainer_group_name_trainer_ids(trainer_group_table, debug=True):
if debug:
logging.info("done improving trainer names")
+
+class SpriteParam(SingleByteParam):
+ sprites = {
+ 0x1: 'SPRITE_CHRIS',
+ 0x2: 'SPRITE_CHRIS_BIKE',
+ 0x3: 'SPRITE_GAMEBOY_KID',
+ 0x4: 'SPRITE_SILVER',
+ 0x5: 'SPRITE_OAK',
+ 0x6: 'SPRITE_RED',
+ 0x7: 'SPRITE_BLUE',
+ 0x8: 'SPRITE_BILL',
+ 0x9: 'SPRITE_ELDER',
+ 0xa: 'SPRITE_JANINE',
+ 0xb: 'SPRITE_KURT',
+ 0xc: 'SPRITE_MOM',
+ 0xd: 'SPRITE_BLAINE',
+ 0xe: 'SPRITE_REDS_MOM',
+ 0xf: 'SPRITE_DAISY',
+ 0x10: 'SPRITE_ELM',
+ 0x11: 'SPRITE_WILL',
+ 0x12: 'SPRITE_FALKNER',
+ 0x13: 'SPRITE_WHITNEY',
+ 0x14: 'SPRITE_BUGSY',
+ 0x15: 'SPRITE_MORTY',
+ 0x16: 'SPRITE_CHUCK',
+ 0x17: 'SPRITE_JASMINE',
+ 0x18: 'SPRITE_PRYCE',
+ 0x19: 'SPRITE_CLAIR',
+ 0x1a: 'SPRITE_BROCK',
+ 0x1b: 'SPRITE_KAREN',
+ 0x1c: 'SPRITE_BRUNO',
+ 0x1d: 'SPRITE_MISTY',
+ 0x1e: 'SPRITE_LANCE',
+ 0x1f: 'SPRITE_SURGE',
+ 0x20: 'SPRITE_ERIKA',
+ 0x21: 'SPRITE_KOGA',
+ 0x22: 'SPRITE_SABRINA',
+ 0x23: 'SPRITE_COOLTRAINER_M',
+ 0x24: 'SPRITE_COOLTRAINER_F',
+ 0x25: 'SPRITE_BUG_CATCHER',
+ 0x26: 'SPRITE_TWIN',
+ 0x27: 'SPRITE_YOUNGSTER',
+ 0x28: 'SPRITE_LASS',
+ 0x29: 'SPRITE_TEACHER',
+ 0x2a: 'SPRITE_BUENA',
+ 0x2b: 'SPRITE_SUPER_NERD',
+ 0x2c: 'SPRITE_ROCKER',
+ 0x2d: 'SPRITE_POKEFAN_M',
+ 0x2e: 'SPRITE_POKEFAN_F',
+ 0x2f: 'SPRITE_GRAMPS',
+ 0x30: 'SPRITE_GRANNY',
+ 0x31: 'SPRITE_SWIMMER_GUY',
+ 0x32: 'SPRITE_SWIMMER_GIRL',
+ 0x33: 'SPRITE_BIG_SNORLAX',
+ 0x34: 'SPRITE_SURFING_PIKACHU',
+ 0x35: 'SPRITE_ROCKET',
+ 0x36: 'SPRITE_ROCKET_GIRL',
+ 0x37: 'SPRITE_NURSE',
+ 0x38: 'SPRITE_LINK_RECEPTIONIST',
+ 0x39: 'SPRITE_CLERK',
+ 0x3a: 'SPRITE_FISHER',
+ 0x3b: 'SPRITE_FISHING_GURU',
+ 0x3c: 'SPRITE_SCIENTIST',
+ 0x3d: 'SPRITE_KIMONO_GIRL',
+ 0x3e: 'SPRITE_SAGE',
+ 0x3f: 'SPRITE_UNUSED_GUY',
+ 0x40: 'SPRITE_GENTLEMAN',
+ 0x41: 'SPRITE_BLACK_BELT',
+ 0x42: 'SPRITE_RECEPTIONIST',
+ 0x43: 'SPRITE_OFFICER',
+ 0x44: 'SPRITE_CAL',
+ 0x45: 'SPRITE_SLOWPOKE',
+ 0x46: 'SPRITE_CAPTAIN',
+ 0x47: 'SPRITE_BIG_LAPRAS',
+ 0x48: 'SPRITE_GYM_GUY',
+ 0x49: 'SPRITE_SAILOR',
+ 0x4a: 'SPRITE_BIKER',
+ 0x4b: 'SPRITE_PHARMACIST',
+ 0x4c: 'SPRITE_MONSTER',
+ 0x4d: 'SPRITE_FAIRY',
+ 0x4e: 'SPRITE_BIRD',
+ 0x4f: 'SPRITE_DRAGON',
+ 0x50: 'SPRITE_BIG_ONIX',
+ 0x51: 'SPRITE_N64',
+ 0x52: 'SPRITE_SUDOWOODO',
+ 0x53: 'SPRITE_SURF',
+ 0x54: 'SPRITE_POKE_BALL',
+ 0x55: 'SPRITE_POKEDEX',
+ 0x56: 'SPRITE_PAPER',
+ 0x57: 'SPRITE_VIRTUAL_BOY',
+ 0x58: 'SPRITE_OLD_LINK_RECEPTIONIST',
+ 0x59: 'SPRITE_ROCK',
+ 0x5a: 'SPRITE_BOULDER',
+ 0x5b: 'SPRITE_SNES',
+ 0x5c: 'SPRITE_FAMICOM',
+ 0x5d: 'SPRITE_FRUIT_TREE',
+ 0x5e: 'SPRITE_GOLD_TROPHY',
+ 0x5f: 'SPRITE_SILVER_TROPHY',
+ 0x60: 'SPRITE_KRIS',
+ 0x61: 'SPRITE_KRIS_BIKE',
+ 0x62: 'SPRITE_KURT_OUTSIDE',
+ 0x63: 'SPRITE_SUICUNE',
+ 0x64: 'SPRITE_ENTEI',
+ 0x65: 'SPRITE_RAIKOU',
+ 0x66: 'SPRITE_STANDING_YOUNGSTER',
+ }
+
+ pokemon_sprites = {
+ 0x80: 'SPRITE_UNOWN',
+ 0x81: 'SPRITE_GEODUDE',
+ 0x82: 'SPRITE_GROWLITHE',
+ 0x83: 'SPRITE_WEEDLE',
+ 0x84: 'SPRITE_SHELLDER',
+ 0x85: 'SPRITE_ODDISH',
+ 0x86: 'SPRITE_GENGAR',
+ 0x87: 'SPRITE_ZUBAT',
+ 0x88: 'SPRITE_MAGIKARP',
+ 0x89: 'SPRITE_SQUIRTLE',
+ 0x8a: 'SPRITE_TOGEPI',
+ 0x8b: 'SPRITE_BUTTERFREE',
+ 0x8c: 'SPRITE_DIGLETT',
+ 0x8d: 'SPRITE_POLIWAG',
+ 0x8e: 'SPRITE_PIKACHU',
+ 0x8f: 'SPRITE_CLEFAIRY',
+ 0x90: 'SPRITE_CHARMANDER',
+ 0x91: 'SPRITE_JYNX',
+ 0x92: 'SPRITE_STARMIE',
+ 0x93: 'SPRITE_BULBASAUR',
+ 0x94: 'SPRITE_JIGGLYPUFF',
+ 0x95: 'SPRITE_GRIMER',
+ 0x96: 'SPRITE_EKANS',
+ 0x97: 'SPRITE_PARAS',
+ 0x98: 'SPRITE_TENTACOOL',
+ 0x99: 'SPRITE_TAUROS',
+ 0x9a: 'SPRITE_MACHOP',
+ 0x9b: 'SPRITE_VOLTORB',
+ 0x9c: 'SPRITE_LAPRAS',
+ 0x9d: 'SPRITE_RHYDON',
+ 0x9e: 'SPRITE_MOLTRES',
+ 0x9f: 'SPRITE_SNORLAX',
+ 0xa0: 'SPRITE_GYARADOS',
+ 0xa1: 'SPRITE_LUGIA',
+ 0xa2: 'SPRITE_HO_OH',
+ }
+
+ variable_sprites = {
+ 0xe0: 'SPRITE_DAYCARE_MON_1',
+ 0xe1: 'SPRITE_DAYCARE_MON_2',
+ 0xf0: 'SPRITE_VARS',
+ 0xf0: 'SPRITE_CONSOLE',
+ 0xf1: 'SPRITE_DOLL_1',
+ 0xf2: 'SPRITE_DOLL_2',
+ 0xf3: 'SPRITE_BIG_DOLL',
+ 0xf4: 'SPRITE_WEIRD_TREE',
+ 0xf5: 'SPRITE_OLIVINE_RIVAL',
+ 0xf6: 'SPRITE_AZALEA_ROCKET',
+ 0xf7: 'SPRITE_FUSCHIA_GYM_1',
+ 0xf8: 'SPRITE_FUSCHIA_GYM_2',
+ 0xf9: 'SPRITE_FUSCHIA_GYM_3',
+ 0xfa: 'SPRITE_FUSCHIA_GYM_4',
+ 0xfb: 'SPRITE_COPYCAT',
+ 0xfc: 'SPRITE_JANINE_IMPERSONATOR',
+ }
+
+ def to_asm(self):
+ if self.byte in self.sprites.keys():
+ return self.sprites[self.byte]
+ if self.byte in self.pokemon_sprites.keys():
+ return self.sprites[self.byte]
+ if self.byte in self.variable_sprites.keys():
+ return self.sprites[self.byte]
+ return SingleByteParam.to_asm(self)
+
+
+
class PeopleEvent(Command):
size = people_event_byte_size
macro_name = "person_event"
base_label = "PeopleEvent_"
override_byte_check = True
param_types = {
- 0: {"name": "sprite", "class": HexByte},
+ 0: {"name": "sprite", "class": SpriteParam},
1: {"name": "y from top+4", "class": DecimalParam},
2: {"name": "x from top+4", "class": DecimalParam},
3: {"name": "facing", "class": HexByte},
@@ -3946,14 +4134,14 @@ class PeopleEvent(Command):
7: {"name": "color_function", "class": HexByte},
8: {"name": "sight_range", "class": DecimalParam},
9: {"name": "pointer", "class": PointerLabelParam}, # or ScriptPointerLabelParam or ItemLabelParam
- 10: {"name": "BitTable1 bit number", "class": MultiByteParam},
+ 10: {"name": "event flag", "class": EventFlagParam},
}
def xto_asm(self):
output = "\n; person-event\n; picture, y, x, facing, movement, clock_hour, clock_daytime, color_function, sight_range\n"
output += "db $%.2x, %d, %d, $%.2x, $%.2x, %d, %d, $%.2x, %d\n" % (self.params[0].byte, self.params[1].byte, self.params[2].byte, self.params[3].byte, self.params[4].byte, self.params[5].byte, self.params[6].byte, self.params[7].byte, self.params[8].byte)
output += "; pointer\ndw %s\n" % (self.params[9].to_asm())
- output += "; BitTable1 bit number\ndw %s" % (self.params[10].to_asm())
+ output += "; event flag\ndw %s" % (self.params[10].to_asm())
return output
def __init__(self, address, id, bank=None, map_group=None, map_id=None, debug=False, label=None, force=False):
@@ -4038,7 +4226,7 @@ class PeopleEvent(Command):
self.color_function = self.params[7].byte
self.sight_range = self.params[8].byte
self.pointer = self.params[9].bytes
- self.bit_number = self.params[10].bytes
+ self.event_flag = self.params[10].bytes
return True
@@ -4145,14 +4333,14 @@ def old_parse_people_event_bytes(some_bytes, address=None, map_group=None, map_i
}
# XXX not sure what's going on here
- # bit no. of bit table 1 (hidden if set)
+ # event flag (hidden if set)
# note: FFFF for none
when_byte = int(bytes[11], 16)
hide = int(bytes[12], 16)
- bit_number_of_bit_table1_byte2 = int(bytes[11], 16)
- bit_number_of_bit_table1_byte1 = int(bytes[12], 16)
- bit_number_of_bit_table1 = bit_number_of_bit_table1_byte1 + (bit_number_of_bit_table1_byte2 << 8)
+ event_flag_byte2 = int(bytes[11], 16)
+ event_flag_byte1 = int(bytes[12], 16)
+ event_flag = event_flag_byte1 + (event_flag_byte2 << 8)
people_event = {
"pict": pict,
@@ -4169,7 +4357,7 @@ def old_parse_people_event_bytes(some_bytes, address=None, map_group=None, map_i
#"text_block": text_block, # script pointer byte 1
#"text_bank": text_bank, # script pointer byte 2
- "when_byte": when_byte, # bit no. of bit table 1 (hidden if set)
+ "when_byte": when_byte, # event flag (hidden if set)
"hide": hide, # note: FFFF for none
"is_trainer": is_trainer,
@@ -4226,7 +4414,7 @@ class SignpostRemoteBase:
class SignpostRemoteScriptChunk(SignpostRemoteBase):
"""
- a signpost might point to [Bit-Nr. (2byte)][2byte pointer to script]
+ a signpost might point to [Event flag (2byte)][2byte pointer to script]
"""
base_label = "SignpostRemoteScript_"
size = 4
@@ -4235,10 +4423,10 @@ class SignpostRemoteScriptChunk(SignpostRemoteBase):
address = self.address
bank = self.bank
- #bit_table_byte1 = ord(rom[address])
- #bit_table_byte2 = ord(rom[address+1])
- bit_table = MultiByteParam(address=address, map_group=self.map_group, map_id=self.map_id, debug=self.debug)
- self.params.append(bit_table)
+ #event_flag_byte1 = ord(rom[address])
+ #event_flag_byte2 = ord(rom[address+1])
+ event_flag = MultiByteParam(address=address, map_group=self.map_group, map_id=self.map_id, debug=self.debug)
+ self.params.append(event_flag)
#script_address = calculate_pointer_from_bytes_at(address+2, bank=bank)
#script = parse_script_engine_script_at(script_address, map_group=self.map_group, map_id=self.map_id, debug=self.debug)
@@ -4247,14 +4435,14 @@ class SignpostRemoteScriptChunk(SignpostRemoteBase):
self.script = script_param.script
self.signpost.remote_script = self.script
- #self.bit_table_bytes = [bit_table_byte1, bit_table_byte2]
+ #self.event_flag_bytes = [event_flag_byte1, event_flag_byte2]
#self.script_address = script_address
#self.script = script
class SignpostRemoteItemChunk(SignpostRemoteBase):
"""
- a signpost might point to [Bit-Nr. (2byte)][Item no.]
+ a signpost might point to [Event flag (2byte)][Item no.]
"""
base_label = "SignpostRemoteItem_"
size = 3
@@ -4263,8 +4451,8 @@ class SignpostRemoteItemChunk(SignpostRemoteBase):
address = self.address
bank = self.bank
- bit_table = MultiByteParam(address=address, map_group=self.map_group, map_id=self.map_id, debug=self.debug)
- self.params.append(bit_table)
+ event_flag = MultiByteParam(address=address, map_group=self.map_group, map_id=self.map_id, debug=self.debug)
+ self.params.append(event_flag)
item = ItemLabelByte(address=address+2)
self.params.append(item)
@@ -4273,7 +4461,7 @@ class SignpostRemoteItemChunk(SignpostRemoteBase):
class SignpostRemoteUnknownChunk(SignpostRemoteBase):
"""
- a signpost might point to [Bit-Nr. (2byte)][??]
+ a signpost might point to [Event flag (2byte)][??]
"""
base_label = "SignpostRemoteUnknown_"
size = 3
@@ -4282,8 +4470,8 @@ class SignpostRemoteUnknownChunk(SignpostRemoteBase):
address = self.address
bank = self.bank
- bit_table = MultiByteParam(address=address, bank=self.bank, map_group=self.map_group, map_id=self.map_id, debug=self.debug)
- self.params.append(bit_table)
+ event_flag = MultiByteParam(address=address, bank=self.bank, map_group=self.map_group, map_id=self.map_id, debug=self.debug)
+ self.params.append(event_flag)
byte = SingleByteParam(address=address+2)
self.params.append(byte)
@@ -4307,14 +4495,14 @@ class Signpost(Command):
script pointer to: script
04 Sign can only be read from left
script pointer to: script
- 05 If bit of BitTable1 is set then pointer is interpreted
- script pointer to: [Bit-Nr. (2byte)][2byte pointer to script]
- 06 If bit of BitTable1 is not set then pointer is interpreted
- script pointer to: [Bit-Nr. (2byte)][2byte pointer to script]
- 07 If bit of BitTable1 is set then item is given
- script pointer to: [Bit-Nr. (2byte)][Item no.]
+ 05 If event flag is set then pointer is interpreted
+ script pointer to: [event flag (2byte)][2byte pointer to script]
+ 06 If event flag is not set then pointer is interpreted
+ script pointer to: [event flag (2byte)][2byte pointer to script]
+ 07 If event flag is set then item is given
+ script pointer to: [event flag (2byte)][Item no.]
08 No Action
- script pointer to: [Bit-Nr. (2byte)][??]
+ script pointer to: [event flag (2byte)][??]
"""
size = 5
macro_name = "signpost"
@@ -4388,14 +4576,14 @@ class Signpost(Command):
#self.script_address = script_address
#self.script = script
elif func in [5, 6]:
- # signpost's script pointer points to [Bit-Nr. (2byte)][2byte pointer to script]
+ # signpost's script pointer points to [event flag (2byte)][2byte pointer to script]
ptr_byte1 = int(bytes[3], 16)
ptr_byte2 = int(bytes[4], 16)
pointer = ptr_byte1 + (ptr_byte2 << 8)
address = pointers.calculate_pointer(pointer, bank)
- bit_table_byte1 = ord(rom[address])
- bit_table_byte2 = ord(rom[address+1])
+ event_flag_byte1 = ord(rom[address])
+ event_flag_byte2 = ord(rom[address+1])
script_ptr_byte1 = ord(rom[address+2])
script_ptr_byte2 = ord(rom[address+3])
script_address = calculate_pointer_from_bytes_at(address+2, bank=bank)
@@ -4419,7 +4607,7 @@ class Signpost(Command):
param.label = Label(address=param.address, object=param, name="Map"+map_names[self.map_group][self.map_id]["label"]+"Signpost"+str(self.id)+"Script")
elif func == 7:
- # signpost's script pointer points to [Bit-Nr. (2byte)][Item no.]
+ # signpost's script pointer points to [event flag (2byte)][Item no.]
ptr_byte1 = int(bytes[3], 16)
ptr_byte2 = int(bytes[4], 16)
pointer = ptr_byte1 + (ptr_byte2 << 8)
@@ -4438,12 +4626,12 @@ class Signpost(Command):
mb = PointerLabelParam(address=self.address+3, map_group=self.map_group, map_id=self.map_id, debug=self.debug)
self.params.append(mb)
- #bit_table_byte1 = ord(rom[address])
- #bit_table_byte2 = ord(rom[address+1])
- #self.bit_table_bytes = [bit_table_byte1, bit_table_byte2]
+ #event_flag_byte1 = ord(rom[address])
+ #event_flag_byte2 = ord(rom[address+1])
+ #self.event_flag_bytes = [event_flag_byte1, event_flag_byte2]
#self.item_id = item_id
elif func == 8:
- # signpost's script pointer points to [Bit-Nr. (2byte)][??]
+ # signpost's script pointer points to [event flag (2byte)][??]
ptr_byte1 = int(bytes[3], 16)
ptr_byte2 = int(bytes[4], 16)
pointer = ptr_byte1 + (ptr_byte2 << 8)
@@ -4494,6 +4682,132 @@ def parse_signposts(address, signpost_count, bank=None, map_group=None, map_id=N
all_signposts.extend(signposts)
return signposts
+
+class LandmarkParam(SingleByteParam):
+ landmarks = [
+ 'SPECIAL_MAP',
+
+ # johto
+ 'NEW_BARK_TOWN',
+ 'ROUTE_29',
+ 'CHERRYGROVE_CITY',
+ 'ROUTE_30',
+ 'ROUTE_31',
+ 'VIOLET_CITY',
+ 'SPROUT_TOWER',
+ 'ROUTE_32',
+ 'RUINS_OF_ALPH',
+ 'UNION_CAVE',
+ 'ROUTE_33',
+ 'AZALEA_TOWN',
+ 'SLOWPOKE_WELL',
+ 'ILEX_FOREST',
+ 'ROUTE_34',
+ 'GOLDENROD_CITY',
+ 'RADIO_TOWER',
+ 'ROUTE_35',
+ 'NATIONAL_PARK',
+ 'ROUTE_36',
+ 'ROUTE_37',
+ 'ECRUTEAK_CITY',
+ 'TIN_TOWER',
+ 'BURNED_TOWER',
+ 'ROUTE_38',
+ 'ROUTE_39',
+ 'OLIVINE_CITY',
+ 'LIGHTHOUSE',
+ 'BATTLE_TOWER',
+ 'ROUTE_40',
+ 'WHIRL_ISLANDS',
+ 'ROUTE_41',
+ 'CIANWOOD_CITY',
+ 'ROUTE_42',
+ 'MT_MORTAR',
+ 'MAHOGANY_TOWN',
+ 'ROUTE_43',
+ 'LAKE_OF_RAGE',
+ 'ROUTE_44',
+ 'ICE_PATH',
+ 'BLACKTHORN_CITY',
+ 'DRAGONS_DEN',
+ 'ROUTE_45',
+ 'DARK_CAVE',
+ 'ROUTE_46',
+ 'SILVER_CAVE',
+
+ # kanto
+ 'PALLET_TOWN',
+ 'ROUTE_1',
+ 'VIRIDIAN_CITY',
+ 'ROUTE_2',
+ 'PEWTER_CITY',
+ 'ROUTE_3',
+ 'MT_MOON',
+ 'ROUTE_4',
+ 'CERULEAN_CITY',
+ 'ROUTE_24',
+ 'ROUTE_25',
+ 'ROUTE_5',
+ 'UNDERGROUND',
+ 'ROUTE_6',
+ 'VERMILION_CITY',
+ 'DIGLETTS_CAVE',
+ 'ROUTE_7',
+ 'ROUTE_8',
+ 'ROUTE_9',
+ 'ROCK_TUNNEL',
+ 'ROUTE_10',
+ 'POWER_PLANT',
+ 'LAVENDER_TOWN',
+ 'LAV_RADIO_TOWER',
+ 'CELADON_CITY',
+ 'SAFFRON_CITY',
+ 'ROUTE_11',
+ 'ROUTE_12',
+ 'ROUTE_13',
+ 'ROUTE_14',
+ 'ROUTE_15',
+ 'ROUTE_16',
+ 'ROUTE_17',
+ 'ROUTE_18',
+ 'FUCHSIA_CITY',
+ 'ROUTE_19',
+ 'ROUTE_20',
+ 'SEAFOAM_ISLANDS',
+ 'CINNABAR_ISLAND',
+ 'ROUTE_21',
+ 'ROUTE_22',
+ 'VICTORY_ROAD',
+ 'ROUTE_23',
+ 'INDIGO_PLATEAU',
+ 'ROUTE_26',
+ 'ROUTE_27',
+ 'TOHJO_FALLS',
+ 'ROUTE_28',
+ 'FAST_SHIP',
+ ]
+
+ def to_asm(self):
+ if self.byte < len(self.landmarks):
+ return self.landmarks[self.byte]
+ return SingleByteParam.to_asm(self)
+
+
+class SongParam(SingleByteParam):
+ def to_asm(self):
+ if self.byte < len(song_names):
+ return 'MUSIC_' + song_names[self.byte].upper().replace(' ','_')
+ return SingleByteParam.to_asm(self)
+
+
+class TimeOfDayParam(DecimalParam):
+ times = ['MORN', 'DAY', 'NITE', 'DARKNESS']
+ def to_asm(self):
+ if self.byte < len(self.times):
+ return self.times[self.byte]
+ return DecimalParam.to_asm(self)
+
+
class MapHeader:
base_label = "MapHeader_"
@@ -4527,9 +4841,9 @@ class MapHeader:
# TODO: is the bank really supposed to be 0x25 all the time ??
self.second_map_header = SecondMapHeader(self.second_map_header_address, map_group=self.map_group, map_id=self.map_id, debug=self.debug)
all_second_map_headers.append(self.second_map_header)
- self.location_on_world_map = HexByte(address=address+5)
- self.music = HexByte(address=address+6)
- self.time_of_day = DecimalParam(address=address+7)
+ self.location_on_world_map = LandmarkParam(address=address+5)
+ self.music = SongParam(address=address+6)
+ self.time_of_day = TimeOfDayParam(address=address+7)
self.fishing_group = DecimalParam(address=address+8)
def get_dependencies(self, recompute=False, global_dependencies=set()):