Refactored Locations, added heart beep setting.

This commit is contained in:
LLCoolDave 2017-05-25 17:47:15 +02:00
parent bbd52c780d
commit e4e0304b40
6 changed files with 289 additions and 293 deletions

View File

@ -350,6 +350,7 @@ class Region(object):
self.exits = []
self.locations = []
self.spot_type = 'Region'
self.hint_text = 'Hyrule'
def can_reach(self, state):
for entrance in self.entrances:
@ -357,14 +358,6 @@ class Region(object):
return True
return False
def add_locations(self, *locations):
for location in locations:
self.locations.append(Location(location, self))
def add_exits(self, *exits):
for exit in exits:
self.exits.append(Entrance(exit, self))
def __str__(self):
return str(self.__unicode__())
@ -404,15 +397,14 @@ class Entrance(object):
class Location(object):
def __init__(self, name='', parent=None, access=None, item_rule=None):
def __init__(self, name='', address=None, crystal=False, hint_text=None, parent=None):
self.name = name
self.parent_region = parent
self.item = None
self.crystal = crystal
self.address = address
self.spot_type = 'Location'
if access is not None:
self.access_rule = access
if item_rule is not None:
self.item_rule = item_rule
self.hint_text = hint_text if hint_text is not None else 'Hyrule'
def access_rule(self, state):
return True

View File

@ -67,3 +67,15 @@ def fill_dungeons(world):
world.push_item(di_location, dungeon_item, False)
world.state._clear_cache()
dungeon_music_addresses = {'Armos - Pendant': [0x1559A],
'Lanmolas - Pendant': [0x1559B, 0x1559C, 0x1559D, 0x1559E],
'Moldorm - Pendant': [0x155C5, 0x1107A, 0x10B8C],
'Helmasaur - Crystal': [0x155B8],
'Arrghus - Crystal': [0x155B7],
'Blind - Crystal': [0x155C6],
'Mothula - Crystal': [0x155BA, 0x155BB, 0x155BC, 0x155BD, 0x15608, 0x15609, 0x1560A, 0x1560B],
'Kholdstare - Crystal': [0x155BF],
'Vitreous - Crystal': [0x155B9],
'Trinexx - Crystal': [0x155C7, 0x155A7, 0x155AA, 0x155AB]}

View File

@ -62,7 +62,7 @@ def main(args, seed=None):
logger.info('Patching ROM.')
rom = bytearray(open(args.rom, 'rb').read())
patched_rom = patch_rom(world, rom, args.quickswap)
patched_rom = patch_rom(world, rom, args.quickswap, args.heartbeep)
outfilebase = 'ER_%s_%s_%s_%s' % (world.mode, world.goal, world.shuffle, world.seed)
@ -369,6 +369,8 @@ if __name__ == '__main__':
parser.add_argument('--count', help='Use to batch generate multiple seeds with same settings. If --seed is provided, it will be used for the first seed, then used to derive the next seed (i.e. generating 10 seeds with --seed given will produce the same 10 (different) roms each time).', type=int)
parser.add_argument('--quickswap', help='Enable quick item swapping with L and R.', action='store_true')
parser.add_argument('--nodungeonitems', help='Remove Maps and Compasses from Itempool, replacing them by empty slots.', action='store_true')
parser.add_argument('--heartbeep', default='normal', const='normal', nargs='?', choices=['normal', 'half', 'quarter', 'off'],
help='Select the rate at which the heart beep sound is played at low health.')
args = parser.parse_args()
if not os.path.isfile(args.rom):

View File

@ -1,10 +1,19 @@
from BaseClasses import Region
from BaseClasses import Region, Location, Entrance
def create_regions(world):
world.regions = [
LightWorld(),
create_region('Light World', ['Mushroom', 'Bottle Vendor', 'Haunted Grove', 'Piece of Heart (Dam)', 'Purple Chest'],
["Thiefs Hut", "Hyrule Castle Secret Entrance Drop", "Hyrule Castle Secret Entrance Stairs", 'Zoras River', 'Kings Grave', 'Dam',
'Links House', 'Tavern North', 'Chicken House', 'Aginahs Cave', 'Sahasrahlas Hut', 'Kakariko Well Drop', 'Kakariko Well Cave',
'Blacksmiths Hut', 'Bat Cave Drop Ledge', 'Bat Cave Cave', 'Sick Kids House', 'Hobo Bridge', 'Thieves Forest Hideout Drop', 'Thieves Forest Hideout Stump',
'Lumberjack Tree Tree', 'Lumberjack Tree Cave', 'Lake Hylia Cave', 'Ice Cave',
'Bonk Rock Cave', 'Library', 'Witch Hut', 'Two Brothers House (East)', 'Desert Palace Stairs', 'Eastern Palace', 'Master Sword Meadow', 'Hyrule Castle Entrance (South)',
'Sanctuary', 'Sanctuary Grave', 'Old Man Cave (West)', 'Flute Spot 1', 'Ice Palace', 'Dark Desert Teleporter', 'East Hyrule Teleporter', 'South Hyrule Teleporter', 'Kakariko Teleporter',
'Elder House (East)', 'Elder House (West)', 'North Fairy Cave', 'North Fairy Cave Drop', 'Lost Woods Gamble', 'Snitch Lady (East)', 'Snitch Lady (West)', 'Tavern (Front)',
'Bush Covered House', 'Light World Bomb Hut', 'Kakariko Shop', 'Long Fairy Cave', 'Good Bee Cave', '20 Rupee Cave', 'Cave Shop (Lake Hylia)', 'Waterfall of Wishing',
'Capacity Upgrade', 'Bonk Fairy (Light)', '50 Rupee Cave', 'Fortune Teller (Light)', 'Lake Hylia Fairy', 'Swamp Fairy', 'Desert Fairy', 'Lumberjack House', 'Lake Hylia Fortune Teller', 'Kakariko Gamble Game']),
create_region('Thiefs Hut', ["[cave-022-B1] Thiefs hut [top chest]",
"[cave-022-B1] Thiefs hut [top left chest]",
"[cave-022-B1] Thiefs hut [top right chest]",
@ -262,262 +271,237 @@ def create_region(name, locations=None, exits=None):
locations = []
if exits is None:
exits = []
ret.add_exits(*exits)
ret.add_locations(*locations)
for exit in exits:
ret.exits.append(Entrance(exit, ret))
for location in locations:
address, crystal, hint_text = location_table[location]
ret.locations.append(Location(location, address, crystal, hint_text, ret))
return ret
class LightWorld(Region):
def __init__(self):
super(LightWorld, self).__init__('Light World')
self.add_exits("Thiefs Hut", "Hyrule Castle Secret Entrance Drop", "Hyrule Castle Secret Entrance Stairs", 'Zoras River', 'Kings Grave', 'Dam',
'Links House', 'Tavern North', 'Chicken House', 'Aginahs Cave', 'Sahasrahlas Hut', 'Kakariko Well Drop', 'Kakariko Well Cave',
'Blacksmiths Hut', 'Bat Cave Drop Ledge', 'Bat Cave Cave', 'Sick Kids House', 'Hobo Bridge', 'Thieves Forest Hideout Drop', 'Thieves Forest Hideout Stump',
'Lumberjack Tree Tree', 'Lumberjack Tree Cave', 'Lake Hylia Cave', 'Ice Cave',
'Bonk Rock Cave', 'Library', 'Witch Hut', 'Two Brothers House (East)', 'Desert Palace Stairs', 'Eastern Palace', 'Master Sword Meadow', 'Hyrule Castle Entrance (South)',
'Sanctuary', 'Sanctuary Grave', 'Old Man Cave (West)', 'Flute Spot 1', 'Ice Palace', 'Dark Desert Teleporter', 'East Hyrule Teleporter', 'South Hyrule Teleporter', 'Kakariko Teleporter',
'Elder House (East)', 'Elder House (West)', 'North Fairy Cave', 'North Fairy Cave Drop', 'Lost Woods Gamble', 'Snitch Lady (East)', 'Snitch Lady (West)', 'Tavern (Front)',
'Bush Covered House', 'Light World Bomb Hut', 'Kakariko Shop', 'Long Fairy Cave', 'Good Bee Cave', '20 Rupee Cave', 'Cave Shop (Lake Hylia)', 'Waterfall of Wishing',
'Capacity Upgrade', 'Bonk Fairy (Light)', '50 Rupee Cave', 'Fortune Teller (Light)', 'Lake Hylia Fairy', 'Swamp Fairy', 'Desert Fairy', 'Lumberjack House', 'Lake Hylia Fortune Teller', 'Kakariko Gamble Game')
self.add_locations('Mushroom', 'Bottle Vendor', 'Haunted Grove', 'Piece of Heart (Dam)', 'Purple Chest')
location_addresses = {'Mushroom': 0x180013,
'Bottle Vendor': 0x2EB18,
'Haunted Grove': 0x18014A,
'Piece of Heart (Dam)': 0x180145,
'Purple Chest': 0x33D68,
'[cave-022-B1] Thiefs hut [top chest]': 0xEB0F,
'[cave-022-B1] Thiefs hut [top left chest]': 0xEB12,
'[cave-022-B1] Thiefs hut [top right chest]': 0xEB15,
'[cave-022-B1] Thiefs hut [bottom left chest]': 0xEB18,
'[cave-022-B1] Thiefs hut [bottom right chest]': 0xEB1B,
'Uncle': 0x2DF45,
'[cave-034] Hyrule Castle Secret Entrance': 0xE971,
'King Zora': 0xEE1C3,
'Piece of Heart (Zoras River)': 0x180149,
'[cave-018] Graveyard - top right grave': 0xE97A,
'[cave-047] Dam': 0xE98C,
'[cave-040] Links House': 0xE9BC,
'[cave-031] Tavern': 0xE9CE,
'[cave-026] Chicken House': 0xE9E9,
'[cave-044] Aginahs Cave': 0xE9F2,
'[cave-035] Sahasrahlas Hut [left chest]': 0xEA82,
'[cave-035] Sahasrahlas Hut [center chest]': 0xEA85,
'[cave-035] Sahasrahlas Hut [right chest]': 0xEA88,
'Sahasrahla': 0x2F1FC,
'[cave-021] Kakariko Well [top chest]': 0xEA8E,
'[cave-021] Kakariko Well [left chest row of 3]': 0xEA91,
'[cave-021] Kakariko Well [center chest row of 3]': 0xEA94,
'[cave-021] Kakariko Well [right chest row of 3]': 0xEA97,
'[cave-021] Kakariko Well [bottom chest]': 0xEA9A,
'Blacksmiths': 0x18002A,
'Magic Bat': 0x180015,
'Sick Kid': 0x339CF,
'Hobo': 0x33E7D,
'Piece of Heart (Thieves Forest Hideout)': 0x180000,
'Piece of Heart (Lumberjack Tree)': 0x180001,
'Piece of Heart (Cave South of Haunted Grove)': 0x180003,
'Piece of Heart (Graveyard Cave)': 0x180004,
'Piece of Heart (Desert Cave)': 0x180005,
'[cave-050] Lake Hylia Cave [bottom left chest]': 0xEB42,
'[cave-050] Lake Hylia Cave [top left chest]': 0xEB45,
'[cave-050] Lake Hylia Cave [top right chest]': 0xEB48,
'[cave-050] Lake Hylia Cave [bottom right chest]': 0xEB4B,
'[cave-050] Lake Hylia Cave [generous guy]': 0x180010,
'[cave-051] Ice Cave': 0xEB4E,
'[cave-016] Bonk Rock Cave': 0xEB3F,
'Library': 0x180012,
'Witch': 0x180014,
'Piece of Heart (Lake Hylia)': 0x180144,
'Piece of Heart (Maze Race)': 0x180142,
'Piece of Heart (Desert - west side)': 0x180143,
'[dungeon-L2-B1] Desert Palace - Big Chest': 0xE98F,
'[dungeon-L2-B1] Desert Palace - Torch': 0x180160,
'[dungeon-L2-B1] Desert Palace - Map Room': 0xE9B6,
'[dungeon-L2-B1] Desert Palace - Compass Room': 0xE9CB,
'[dungeon-L2-B1] Desert Palace - Big Key Room': 0xE9C2,
'Lanmolas - Heart Container': 0x180151,
'[dungeon-L1-1F] Eastern Palace - Compass Room': 0xE977,
'[dungeon-L1-1F] Eastern Palace - Big Chest': 0xE97D,
'[dungeon-L1-1F] Eastern Palace - Big Ball Room': 0xE9B3,
'[dungeon-L1-1F] Eastern Palace - Big Key Room': 0xE9B9,
'[dungeon-L1-1F] Eastern Palace - Map Room': 0xE9F5,
'Armos - Heart Container': 0x180150,
'Altar': 0x289B0,
'[dungeon-C-B1] Hyrule Castle - Boomerang Room': 0xE974,
'[dungeon-C-B1] Hyrule Castle - Map Room': 0xEB0C,
'[dungeon-C-B1] Hyrule Castle - Next To Zelda': 0xEB09,
'[dungeon-C-B1] Escape - First B1 Room': 0xE96E,
'[dungeon-C-B1] Escape - Final Basement Room [left chest]': 0xEB5D,
'[dungeon-C-B1] Escape - Final Basement Room [middle chest]': 0xEB60,
'[dungeon-C-B1] Escape - Final Basement Room [right chest]': 0xEB63,
'[dungeon-C-1F] Sanctuary': 0xEA79,
'[dungeon-A1-2F] Hyrule Castle Tower - 2 Knife Guys Room': 0xEAB5,
'[dungeon-A1-3F] Hyrule Castle Tower - Maze Room': 0xEAB2,
'Old Mountain Man': 0xF69FA,
'Piece of Heart (Spectacle Rock Cave)': 0x180002,
'[cave-009-1F] Death Mountain - right cave [top left chest]': 0xEB2A,
'[cave-009-1F] Death Mountain - right cave [top left middle chest]': 0xEB2D,
'[cave-009-1F] Death Mountain - right cave [top right middle chest]': 0xEB30,
'[cave-009-1F] Death Mountain - right cave [top right chest]': 0xEB33,
'[cave-009-1F] Death Mountain - right cave [bottom chest]': 0xEB36,
'[cave-009-B1] Death Mountain - right cave [left chest]': 0xEB39,
'[cave-009-B1] Death Mountain - right cave [right chest]': 0xEB3C,
'[cave-012-1F] Death Mountain - left cave]': 0xE9BF,
'Ether Tablet': 0x180016,
'Piece of Heart (Spectacle Rock)': 0x180140,
'[dungeon-L3-1F] Tower of Hera - Freestanding Key': 0x180162,
'[dungeon-L3-1F] Tower of Hera - Entrance': 0xE9AD,
'[dungeon-L3-1F] Tower of Hera - Basement': 0xE9E6,
'[dungeon-L3-1F] Tower of Hera - 4F [small chest]': 0xE9FB,
'[dungeon-L3-1F] Tower of Hera - Big Chest': 0xE9F8,
'Moldorm - Heart Container': 0x180152,
'Piece of Heart (Pyramid)': 0x180147,
'Catfish': 0xEE185,
'Flute Boy': 0x330C7,
'Piece of Heart (Digging Game)': 0x180148,
'Bombos Tablet': 0x180017,
'[cave-073] Cave Northeast of Swamp Palace [top chest]': 0xEB1E,
'[cave-073] Cave Northeast of Swamp Palace [top middle chest]': 0xEB21,
'[cave-073] Cave Northeast of Swamp Palace [bottom middle chest]': 0xEB24,
'[cave-073] Cave Northeast of Swamp Palace [bottom chest]': 0xEB27,
'[cave-073] Cave Northeast of Swamp Palace [generous guy]': 0x180011,
'Piece of Heart (Dark World Blacksmith Pegs)': 0x180006,
'Pyramid Fairy [left chest]': 0xE980,
'Pyramid Fairy [right chest]': 0xE983,
'[cave-063] Doorless Hut': 0xE9EC,
'[cave-062] C-Shaped House': 0xE9EF,
'Piece of Heart (Treasure Chest Game)': 0xEDA8,
'Piece of Heart (Bumper Cave)': 0x180146,
'[cave-071] Misery Mire West Area [left chest]': 0xEA73,
'[cave-071] Misery Mire West Area [right chest]': 0xEA76,
'[cave-057-1F] Dark World Death Mountain Climb [top chest]': 0xEA7C,
'[cave-057-1F] Dark World Death Mountain Climb [bottom chest]': 0xEA7F,
'[cave-055] Spike Cave': 0xEA8B,
'[cave-056] Hookshot Cave [top right chest]': 0xEB51,
'[cave-056] Hookshot Cave [top left chest]': 0xEB54,
'[cave-056] Hookshot Cave [bottom right chest]': 0xEB5A,
'[cave-056] Hookshot Cave [bottom left chest]': 0xEB57,
'Piece of Heart (Death Mountain - Floating Island)': 0x180141,
'[cave-013] Mimic Cave': 0xE9C5,
'[dungeon-D2-1F] Swamp Palace - First Room': 0xEA9D,
'[dungeon-D2-1F] Swamp Palace - Map Room': 0xE986,
'[dungeon-D2-B1] Swamp Palace - Big Chest': 0xE989,
'[dungeon-D2-B1] Swamp Palace - South of Hookshot Room': 0xEAA0,
'[dungeon-D2-B1] Swamp Palace - Big Key Chest': 0xEAA6,
'[dungeon-D2-B1] Swamp Palace - Compass Chest': 0xEAA3,
'[dungeon-D2-B2] Swamp Palace - Flooded Room [left chest]': 0xEAA9,
'[dungeon-D2-B2] Swamp Palace - Flooded Room [right chest]': 0xEAAC,
'[dungeon-D2-B2] Swamp Palace - Waterfall Room': 0xEAAF,
'Arrghus - Heart Container': 0x180154,
'[dungeon-D4-B1] Thieves Town - Bottom Left of Huge Room [bottom right chest]': 0xEA04,
'[dungeon-D4-B1] Thieves Town - Bottom Left of Huge Room [top left chest]': 0xEA01,
'[dungeon-D4-B1] Thieves Town - Bottom Right of Huge Room': 0xEA07,
'[dungeon-D4-B1] Thieves Town - Top Left of Huge Room': 0xEA0A,
'[dungeon-D4-1F] Thieves Town - Room above Boss': 0xEA0D,
'[dungeon-D4-B2] Thieves Town - Big Chest': 0xEA10,
'[dungeon-D4-B2] Thieves Town - Chest next to Blind': 0xEA13,
'Blind - Heart Container': 0x180156,
'[dungeon-D3-B1] Skull Woods - Compass Room': 0xE992,
'[dungeon-D3-B1] Skull Woods - East of Big Chest': 0xE99B,
'[dungeon-D3-B1] Skull Woods - Big Chest': 0xE998,
'[dungeon-D3-B1] Skull Woods - Map Room': 0xE9A1,
'[dungeon - D3 - B1] Skull Woods - South of Big Chest': 0xE9C8,
'[dungeon-D3-B1] Skull Woods - Big Key Room': 0xE99E,
'[dungeon-D3-B1] Skull Woods - Final Section Entrance': 0xE9FE,
'Mothula - Heart Container': 0x180155,
'[dungeon-D5-B1] Ice Palace - Compass Room': 0xE9D4,
'[dungeon-D5-B4] Ice Palace - Above Big Chest': 0xE995,
'[dungeon-D5-B5] Ice Palace - Big Chest': 0xE9AA,
'[dungeon-D5-B5] Ice Palace - Jellyfish Room': 0xE9E3,
'[dungeon-D5-B3] Ice Palace - Spike Room': 0xE9E0,
'[dungeon-D5-B1] Ice Palace - Big Key Room': 0xE9A4,
'[dungeon-D5-B2] Ice Palace - Map Room': 0xE9DD,
'Kholdstare - Heart Container': 0x180157,
'[dungeon-D6-B1] Misery Mire - Big Chest': 0xEA67,
'[dungeon-D6-B1] Misery Mire - Map Room': 0xEA6A,
'[dungeon-D6-B1] Misery Mire - Hub Room': 0xEA5E,
'[dungeon-D6-B1] Misery Mire - End of Bridge': 0xEA61,
'[dungeon-D6-B1] Misery Mire - Spike Room': 0xE9DA,
'[dungeon-D6-B1] Misery Mire - Compass Room': 0xEA64,
'[dungeon-D6-B1] Misery Mire - Big Key Room':0xEA6D ,
'Vitreous - Heart Container': 0x180158,
'[dungeon-D7-1F] Turtle Rock - Compass Room': 0xEA22,
'[dungeon-D7-1F] Turtle Rock - Map Room [left chest]': 0xEA1C,
'[dungeon-D7-1F] Turtle Rock - Map Room [right chest]': 0xEA1F,
'[dungeon-D7-1F] Turtle Rock - Chain Chomp Room': 0xEA16,
'[dungeon-D7-B1] Turtle Rock - Big Key Room': 0xEA25,
'[dungeon-D7-B1] Turtle Rock - Big Chest': 0xEA19,
'[dungeon-D7-B1] Turtle Rock - Roller Switch Room': 0xEA34,
'[dungeon-D7-B2] Turtle Rock - Eye Bridge Room [bottom left chest]': 0xEA31,
'[dungeon-D7-B2] Turtle Rock - Eye Bridge Room [bottom right chest]': 0xEA2E,
'[dungeon-D7-B2] Turtle Rock - Eye Bridge Room [top left chest]': 0xEA2B,
'[dungeon-D7-B2] Turtle Rock - Eye Bridge Room [top right chest]': 0xEA28,
'Trinexx - Heart Container': 0x180159,
'[dungeon-D1-B1] Dark Palace - Shooter Room': 0xEA5B,
'[dungeon-D1-1F] Dark Palace - Jump Room [left chest]': 0xEA3A,
'[dungeon-D1-B1] Dark Palace - Turtle Stalfos Room': 0xEA49,
'[dungeon-D1-1F] Dark Palace - Big Key Room': 0xEA37,
'[dungeon-D1-1F] Dark Palace - Jump Room [right chest]': 0xEA3D,
'[dungeon-D1-1F] Dark Palace - Statue Push Room': 0xEA52,
'[dungeon-D1-1F] Dark Palace - Compass Room': 0xEA43,
'[dungeon-D1-B1] Dark Palace - Dark Room [left chest]': 0xEA4C,
'[dungeon-D1-B1] Dark Palace - Dark Room [right chest]': 0xEA4F,
'[dungeon-D1-1F] Dark Palace - Maze Room [top chest]': 0xEA55,
'[dungeon-D1-1F] Dark Palace - Maze Room [bottom chest]': 0xEA58,
'[dungeon-D1-1F] Dark Palace - Big Chest': 0xEA40,
'[dungeon-D1-1F] Dark Palace - Spike Statue Room': 0xEA46,
'Helmasaur - Heart Container': 0x180153,
'[dungeon-A2-1F] Ganons Tower - Torch': 0x180161,
'[dungeon-A2-1F] Ganons Tower - Right Staircase [left chest]': 0xEAD9,
'[dungeon-A2-1F] Ganons Tower - Right Staircase [right chest]': 0xEADC,
'[dungeon-A2-1F] Ganons Tower - Tile Room': 0xEAE2,
'[dungeon-A2-1F] Ganons Tower - Compass Room [top left chest]': 0xEAE5,
'[dungeon-A2-1F] Ganons Tower - Compass Room [top right chest]': 0xEAE8,
'[dungeon-A2-1F] Ganons Tower - Compass Room [bottom left chest]': 0xEAEB,
'[dungeon-A2-1F] Ganons Tower - Compass Room [bottom right chest]': 0xEAEE,
'[dungeon-A2-1F] Ganons Tower - North of Hookshot Room [top left chest]': 0xEAB8,
'[dungeon-A2-1F] Ganons Tower - North of Hookshot Room [top right chest]': 0xEABB,
'[dungeon-A2-1F] Ganons Tower - North of Hookshot Room [bottom left chest]': 0xEABE,
'[dungeon-A2-1F] Ganons Tower - North of Hookshot Room [bottom right chest]': 0xEAC1,
'[dungeon-A2-1F] Ganons Tower - Map Room': 0xEAD3,
'[dungeon-A2-1F] Ganons Tower - Firesnake Room': 0xEAD0,
'[dungeon-A2-1F] Ganons Tower - Teleport Room [top left chest]': 0xEAC4,
'[dungeon-A2-1F] Ganons Tower - Teleport Room [top right chest]': 0xEAC7,
'[dungeon-A2-1F] Ganons Tower - Teleport Room [bottom left chest]': 0xEACA,
'[dungeon-A2-1F] Ganons Tower - Teleport Room [bottom right chest]': 0xEACD,
'[dungeon-A2-1F] Ganons Tower - above Armos': 0xEADF,
'[dungeon-A2-1F] Ganons Tower - Big Chest': 0xEAD6,
'[dungeon-A2-B1] Ganons Tower - Armos Room [left chest]': 0xEAF4,
'[dungeon-A2-B1] Ganons Tower - Armos Room [right chest]': 0xEAF7,
'[dungeon-A2-B1] Ganons Tower - Armos Room [bottom chest]': 0xEAF1,
'[dungeon-A2-6F] Ganons Tower - Mini Helmasaur Room [left chest]': 0xEAFD,
'[dungeon-A2-6F] Ganons Tower - Mini Helmasaur Room [right chest]': 0xEB00,
'[dungeon-A2-6F] Ganons Tower - Room before Moldorm': 0xEB03,
'[dungeon-A2-6F] Ganons Tower - Moldorm Room': 0xEB06}
crystal_locations = {'Armos - Pendant': [0x1209D, 0x53EF8, 0x53EF9, 0x180052, 0x18007C, 0xC6FE],
'Lanmolas - Pendant': [0x1209E, 0x53F1C, 0x53F1D, 0x180053, 0x180078, 0xC6FF],
'Moldorm - Pendant': [0x120A5, 0x53F0A, 0x53F0B, 0x18005A, 0x18007A, 0xC706],
'Helmasaur - Crystal': [0x120A1, 0x53F00, 0x53F01, 0x180056, 0x18007D, 0xC702],
'Arrghus - Crystal': [0x120A0, 0x53F6C, 0x53F6D, 0x180055, 0x180071, 0xC701],
'Blind - Crystal': [0x120A6, 0x53F36, 0x53F37, 0x18005B, 0x180077, 0xC707],
'Mothula - Crystal': [0x120A3, 0x53F12, 0x53F13, 0x180058, 0x18007B, 0xC704],
'Kholdstare - Crystal': [0x120A4, 0x53F5A, 0x53F5B, 0x180059, 0x180073, 0xC705],
'Vitreous - Crystal': [0x120A2, 0x53F48, 0x53F49, 0x180057, 0x180075, 0xC703],
'Trinexx - Crystal': [0x120A7, 0x53F24, 0x53F25, 0x18005C, 0x180079, 0xC708]}
dungeon_music_addresses = {'Armos - Pendant': [0x1559A],
'Lanmolas - Pendant': [0x1559B, 0x1559C, 0x1559D, 0x1559E],
'Moldorm - Pendant': [0x155C5, 0x1107A, 0x10B8C],
'Helmasaur - Crystal': [0x155B8],
'Arrghus - Crystal': [0x155B7],
'Blind - Crystal': [0x155C6],
'Mothula - Crystal': [0x155BA, 0x155BB, 0x155BC, 0x155BD, 0x15608, 0x15609, 0x1560A, 0x1560B],
'Kholdstare - Crystal': [0x155BF],
'Vitreous - Crystal': [0x155B9],
'Trinexx - Crystal': [0x155C7, 0x155A7, 0x155AA, 0x155AB]}
location_table = {'Mushroom': (0x180013, False, 'Light World'),
'Bottle Vendor': (0x2EB18, False, 'Light World'),
'Haunted Grove': (0x18014A, False, 'Light World'),
'Piece of Heart (Dam)': (0x180145, False, 'Light World'),
'Purple Chest': (0x33D68, False, 'Light World'),
'[cave-022-B1] Thiefs hut [top chest]': (0xEB0F, False, None),
'[cave-022-B1] Thiefs hut [top left chest]': (0xEB12, False, None),
'[cave-022-B1] Thiefs hut [top right chest]': (0xEB15, False, None),
'[cave-022-B1] Thiefs hut [bottom left chest]': (0xEB18, False, None),
'[cave-022-B1] Thiefs hut [bottom right chest]': (0xEB1B, False, None),
'Uncle': (0x2DF45, False, None),
'[cave-034] Hyrule Castle Secret Entrance': (0xE971, False, None),
'King Zora': (0xEE1C3, False, 'Light World'),
'Piece of Heart (Zoras River)': (0x180149, False, 'Light World'),
'[cave-018] Graveyard - top right grave': (0xE97A, False, None),
'[cave-047] Dam': (0xE98C, False, None),
'[cave-040] Links House': (0xE9BC, False, 'Light World'),
'[cave-031] Tavern': (0xE9CE, False, None),
'[cave-026] Chicken House': (0xE9E9, False, None),
'[cave-044] Aginahs Cave': (0xE9F2, False, None),
'[cave-035] Sahasrahlas Hut [left chest]': (0xEA82, False, None),
'[cave-035] Sahasrahlas Hut [center chest]': (0xEA85, False, None),
'[cave-035] Sahasrahlas Hut [right chest]': (0xEA88, False, None),
'Sahasrahla': (0x2F1FC, False, None),
'[cave-021] Kakariko Well [top chest]': (0xEA8E, False, None),
'[cave-021] Kakariko Well [left chest row of 3]': (0xEA91, False, None),
'[cave-021] Kakariko Well [center chest row of 3]': (0xEA94, False, None),
'[cave-021] Kakariko Well [right chest row of 3]': (0xEA97, False, None),
'[cave-021] Kakariko Well [bottom chest]': (0xEA9A, False, None),
'Blacksmiths': (0x18002A, False, None),
'Magic Bat': (0x180015, False, None),
'Sick Kid': (0x339CF, False, None),
'Hobo': (0x33E7D, False, 'Light World'),
'Piece of Heart (Thieves Forest Hideout)': (0x180000, False, None),
'Piece of Heart (Lumberjack Tree)': (0x180001, False, None),
'Piece of Heart (Cave South of Haunted Grove)': (0x180003, False, None),
'Piece of Heart (Graveyard Cave)': (0x180004, False, None),
'Piece of Heart (Desert Cave)': (0x180005, False, None),
'[cave-050] Lake Hylia Cave [bottom left chest]': (0xEB42, False, None),
'[cave-050] Lake Hylia Cave [top left chest]': (0xEB45, False, None),
'[cave-050] Lake Hylia Cave [top right chest]': (0xEB48, False, None),
'[cave-050] Lake Hylia Cave [bottom right chest]': (0xEB4B, False, None),
'[cave-050] Lake Hylia Cave [generous guy]': (0x180010, False, None),
'[cave-051] Ice Cave': (0xEB4E, False, None),
'[cave-016] Bonk Rock Cave': (0xEB3F, False, None),
'Library': (0x180012, False, None),
'Witch': (0x180014, False, None),
'Piece of Heart (Lake Hylia)': (0x180144, False, 'Light World'),
'Piece of Heart (Maze Race)': (0x180142, False, 'Light World'),
'Piece of Heart (Desert - west side)': (0x180143, False, 'Light World'),
'[dungeon-L2-B1] Desert Palace - Big Chest': (0xE98F, False, 'Desert Palace'),
'[dungeon-L2-B1] Desert Palace - Torch': (0x180160, False, 'Desert Palace'),
'[dungeon-L2-B1] Desert Palace - Map Room': (0xE9B6, False, 'Desert Palace'),
'[dungeon-L2-B1] Desert Palace - Compass Room': (0xE9CB, False, 'Desert Palace'),
'[dungeon-L2-B1] Desert Palace - Big Key Room': (0xE9C2, False, 'Desert Palace'),
'Lanmolas - Heart Container': (0x180151, False, 'Desert Palace'),
'[dungeon-L1-1F] Eastern Palace - Compass Room': (0xE977, False, 'Eastern Palace'),
'[dungeon-L1-1F] Eastern Palace - Big Chest': (0xE97D, False, 'Eastern Palace'),
'[dungeon-L1-1F] Eastern Palace - Big Ball Room': (0xE9B3, False, 'Eastern Palace'),
'[dungeon-L1-1F] Eastern Palace - Big Key Room': (0xE9B9, False, 'Eastern Palace'),
'[dungeon-L1-1F] Eastern Palace - Map Room': (0xE9F5, False, 'Eastern Palace'),
'Armos - Heart Container': (0x180150, False, 'Eastern Palace'),
'Altar': (0x289B0, False, 'Light World'),
'[dungeon-C-B1] Hyrule Castle - Boomerang Room': (0xE974, False, 'Hyrule Castle'),
'[dungeon-C-B1] Hyrule Castle - Map Room': (0xEB0C, False, 'Hyrule Castle'),
'[dungeon-C-B1] Hyrule Castle - Next To Zelda': (0xEB09, False, 'Hyrule Castle'),
'[dungeon-C-B1] Escape - First B1 Room': (0xE96E, False, 'Hyrule Castle'),
'[dungeon-C-B1] Escape - Final Basement Room [left chest]': (0xEB5D, False, 'Hyrule Castle'),
'[dungeon-C-B1] Escape - Final Basement Room [middle chest]': (0xEB60, False, 'Hyrule Castle'),
'[dungeon-C-B1] Escape - Final Basement Room [right chest]': (0xEB63, False, 'Hyrule Castle'),
'[dungeon-C-1F] Sanctuary': (0xEA79, False, 'Hyrule Castle'),
'[dungeon-A1-2F] Hyrule Castle Tower - 2 Knife Guys Room': (0xEAB5, False, 'Hyrule Castle'),
'[dungeon-A1-3F] Hyrule Castle Tower - Maze Room': (0xEAB2, False, 'Hyrule Castle'),
'Old Mountain Man': (0xF69FA, False, 'Light World'),
'Piece of Heart (Spectacle Rock Cave)': (0x180002, False, None),
'[cave-009-1F] Death Mountain - right cave [top left chest]': (0xEB2A, False, None),
'[cave-009-1F] Death Mountain - right cave [top left middle chest]': (0xEB2D, False, None),
'[cave-009-1F] Death Mountain - right cave [top right middle chest]': (0xEB30, False, None),
'[cave-009-1F] Death Mountain - right cave [top right chest]': (0xEB33, False, None),
'[cave-009-1F] Death Mountain - right cave [bottom chest]': (0xEB36, False, None),
'[cave-009-B1] Death Mountain - right cave [left chest]': (0xEB39, False, None),
'[cave-009-B1] Death Mountain - right cave [right chest]': (0xEB3C, False, None),
'[cave-012-1F] Death Mountain - left cave]': (0xE9BF, False, None),
'Ether Tablet': (0x180016, False, 'Light World'),
'Piece of Heart (Spectacle Rock)': (0x180140, False, 'Light World'),
'[dungeon-L3-1F] Tower of Hera - Freestanding Key': (0x180162, False, 'Tower of Hera'),
'[dungeon-L3-1F] Tower of Hera - Entrance': (0xE9AD, False, 'Tower of Hera'),
'[dungeon-L3-1F] Tower of Hera - Basement': (0xE9E6, False, 'Tower of Hera'),
'[dungeon-L3-1F] Tower of Hera - 4F [small chest]': (0xE9FB, False, 'Tower of Hera'),
'[dungeon-L3-1F] Tower of Hera - Big Chest': (0xE9F8, False, 'Tower of Hera'),
'Moldorm - Heart Container': (0x180152, False, 'Tower of Hera'),
'Piece of Heart (Pyramid)': (0x180147, False, 'Dark World'),
'Catfish': (0xEE185, False, 'Dark World'),
'Flute Boy': (0x330C7, False, 'Dark World'),
'Piece of Heart (Digging Game)': (0x180148, False, 'Dark World'),
'Bombos Tablet': (0x180017, False, 'Light World'),
'[cave-073] Cave Northeast of Swamp Palace [top chest]': (0xEB1E, False, None),
'[cave-073] Cave Northeast of Swamp Palace [top middle chest]': (0xEB21, False, None),
'[cave-073] Cave Northeast of Swamp Palace [bottom middle chest]': (0xEB24, False, None),
'[cave-073] Cave Northeast of Swamp Palace [bottom chest]': (0xEB27, False, None),
'[cave-073] Cave Northeast of Swamp Palace [generous guy]': (0x180011, False, None),
'Piece of Heart (Dark World Blacksmith Pegs)': (0x180006, False, None),
'Pyramid Fairy [left chest]': (0xE980, False, None),
'Pyramid Fairy [right chest]': (0xE983, False, None),
'[cave-063] Doorless Hut': (0xE9EC, False, None),
'[cave-062] C-Shaped House': (0xE9EF, False, None),
'Piece of Heart (Treasure Chest Game)': (0xEDA8, False, None),
'Piece of Heart (Bumper Cave)': (0x180146, False, 'Dark World'),
'[cave-071] Misery Mire West Area [left chest]': (0xEA73, False, None),
'[cave-071] Misery Mire West Area [right chest]': (0xEA76, False, None),
'[cave-057-1F] Dark World Death Mountain Climb [top chest]': (0xEA7C, False, None),
'[cave-057-1F] Dark World Death Mountain Climb [bottom chest]': (0xEA7F, False, None),
'[cave-055] Spike Cave': (0xEA8B, False, None),
'[cave-056] Hookshot Cave [top right chest]': (0xEB51, False, None),
'[cave-056] Hookshot Cave [top left chest]': (0xEB54, False, None),
'[cave-056] Hookshot Cave [bottom right chest]': (0xEB5A, False, None),
'[cave-056] Hookshot Cave [bottom left chest]': (0xEB57, False, None),
'Piece of Heart (Death Mountain - Floating Island)': (0x180141, False, 'Light World'),
'[cave-013] Mimic Cave': (0xE9C5, False, None),
'[dungeon-D2-1F] Swamp Palace - First Room': (0xEA9D, False, 'Swamp Palace'),
'[dungeon-D2-1F] Swamp Palace - Map Room': (0xE986, False, 'Swamp Palace'),
'[dungeon-D2-B1] Swamp Palace - Big Chest': (0xE989, False, 'Swamp Palace'),
'[dungeon-D2-B1] Swamp Palace - South of Hookshot Room': (0xEAA0, False, 'Swamp Palace'),
'[dungeon-D2-B1] Swamp Palace - Big Key Chest': (0xEAA6, False, 'Swamp Palace'),
'[dungeon-D2-B1] Swamp Palace - Compass Chest': (0xEAA3, False, 'Swamp Palace'),
'[dungeon-D2-B2] Swamp Palace - Flooded Room [left chest]': (0xEAA9, False, 'Swamp Palace'),
'[dungeon-D2-B2] Swamp Palace - Flooded Room [right chest]': (0xEAAC, False, 'Swamp Palace'),
'[dungeon-D2-B2] Swamp Palace - Waterfall Room': (0xEAAF, False, 'Swamp Palace'),
'Arrghus - Heart Container': (0x180154, False, 'Swamp Palace'),
'[dungeon-D4-B1] Thieves Town - Bottom Left of Huge Room [bottom right chest]': (0xEA04, False, 'Thieves\' Town'),
'[dungeon-D4-B1] Thieves Town - Bottom Left of Huge Room [top left chest]': (0xEA01, False, 'Thieves\' Town'),
'[dungeon-D4-B1] Thieves Town - Bottom Right of Huge Room': (0xEA07, False, 'Thieves\' Town'),
'[dungeon-D4-B1] Thieves Town - Top Left of Huge Room': (0xEA0A, False, 'Thieves\' Town'),
'[dungeon-D4-1F] Thieves Town - Room above Boss': (0xEA0D, False, 'Thieves\' Town'),
'[dungeon-D4-B2] Thieves Town - Big Chest': (0xEA10, False, 'Thieves\' Town'),
'[dungeon-D4-B2] Thieves Town - Chest next to Blind': (0xEA13, False, 'Thieves\' Town'),
'Blind - Heart Container': (0x180156, False, 'Thieves\' Town'),
'[dungeon-D3-B1] Skull Woods - Compass Room': (0xE992, False, 'Skull Woods'),
'[dungeon-D3-B1] Skull Woods - East of Big Chest': (0xE99B, False, 'Skull Woods'),
'[dungeon-D3-B1] Skull Woods - Big Chest': (0xE998, False, 'Skull Woods'),
'[dungeon-D3-B1] Skull Woods - Map Room': (0xE9A1, False, 'Skull Woods'),
'[dungeon - D3 - B1] Skull Woods - South of Big Chest': (0xE9C8, False, 'Skull Woods'),
'[dungeon-D3-B1] Skull Woods - Big Key Room': (0xE99E, False, 'Skull Woods'),
'[dungeon-D3-B1] Skull Woods - Final Section Entrance': (0xE9FE, False, 'Skull Woods'),
'Mothula - Heart Container': (0x180155, False, 'Skull Woods'),
'[dungeon-D5-B1] Ice Palace - Compass Room': (0xE9D4, False, 'Ice Palace'),
'[dungeon-D5-B4] Ice Palace - Above Big Chest': (0xE995, False, 'Ice Palace'),
'[dungeon-D5-B5] Ice Palace - Big Chest': (0xE9AA, False, 'Ice Palace'),
'[dungeon-D5-B5] Ice Palace - Jellyfish Room': (0xE9E3, False, 'Ice Palace'),
'[dungeon-D5-B3] Ice Palace - Spike Room': (0xE9E0, False, 'Ice Palace'),
'[dungeon-D5-B1] Ice Palace - Big Key Room': (0xE9A4, False, 'Ice Palace'),
'[dungeon-D5-B2] Ice Palace - Map Room': (0xE9DD, False, 'Ice Palace'),
'Kholdstare - Heart Container': (0x180157, False, 'Ice Palace'),
'[dungeon-D6-B1] Misery Mire - Big Chest': (0xEA67, False, 'Misery Mire'),
'[dungeon-D6-B1] Misery Mire - Map Room': (0xEA6A, False, 'Misery Mire'),
'[dungeon-D6-B1] Misery Mire - Hub Room': (0xEA5E, False, 'Misery Mire'),
'[dungeon-D6-B1] Misery Mire - End of Bridge': (0xEA61, False, 'Misery Mire'),
'[dungeon-D6-B1] Misery Mire - Spike Room': (0xE9DA, False, 'Misery Mire'),
'[dungeon-D6-B1] Misery Mire - Compass Room': (0xEA64, False, 'Misery Mire'),
'[dungeon-D6-B1] Misery Mire - Big Key Room': (0xEA6D, False, 'Misery Mire'),
'Vitreous - Heart Container': (0x180158, False, 'Misery Mire'),
'[dungeon-D7-1F] Turtle Rock - Compass Room': (0xEA22, False, 'Turtle Rock'),
'[dungeon-D7-1F] Turtle Rock - Map Room [left chest]': (0xEA1C, False, 'Turtle Rock'),
'[dungeon-D7-1F] Turtle Rock - Map Room [right chest]': (0xEA1F, False, 'Turtle Rock'),
'[dungeon-D7-1F] Turtle Rock - Chain Chomp Room': (0xEA16, False, 'Turtle Rock'),
'[dungeon-D7-B1] Turtle Rock - Big Key Room': (0xEA25, False, 'Turtle Rock'),
'[dungeon-D7-B1] Turtle Rock - Big Chest': (0xEA19, False, 'Turtle Rock'),
'[dungeon-D7-B1] Turtle Rock - Roller Switch Room': (0xEA34, False, 'Turtle Rock'),
'[dungeon-D7-B2] Turtle Rock - Eye Bridge Room [bottom left chest]': (0xEA31, False, 'Turtle Rock'),
'[dungeon-D7-B2] Turtle Rock - Eye Bridge Room [bottom right chest]': (0xEA2E, False, 'Turtle Rock'),
'[dungeon-D7-B2] Turtle Rock - Eye Bridge Room [top left chest]': (0xEA2B, False, 'Turtle Rock'),
'[dungeon-D7-B2] Turtle Rock - Eye Bridge Room [top right chest]': (0xEA28, False, 'Turtle Rock'),
'Trinexx - Heart Container': (0x180159, False, 'Turtle Rock'),
'[dungeon-D1-B1] Dark Palace - Shooter Room': (0xEA5B, False, 'Palace of Darkness'),
'[dungeon-D1-1F] Dark Palace - Jump Room [left chest]': (0xEA3A, False, 'Palace of Darkness'),
'[dungeon-D1-B1] Dark Palace - Turtle Stalfos Room': (0xEA49, False, 'Palace of Darkness'),
'[dungeon-D1-1F] Dark Palace - Big Key Room': (0xEA37, False, 'Palace of Darkness'),
'[dungeon-D1-1F] Dark Palace - Jump Room [right chest]': (0xEA3D, False, 'Palace of Darkness'),
'[dungeon-D1-1F] Dark Palace - Statue Push Room': (0xEA52, False, 'Palace of Darkness'),
'[dungeon-D1-1F] Dark Palace - Compass Room': (0xEA43, False, 'Palace of Darkness'),
'[dungeon-D1-B1] Dark Palace - Dark Room [left chest]': (0xEA4C, False, 'Palace of Darkness'),
'[dungeon-D1-B1] Dark Palace - Dark Room [right chest]': (0xEA4F, False, 'Palace of Darkness'),
'[dungeon-D1-1F] Dark Palace - Maze Room [top chest]': (0xEA55, False, 'Palace of Darkness'),
'[dungeon-D1-1F] Dark Palace - Maze Room [bottom chest]': (0xEA58, False, 'Palace of Darkness'),
'[dungeon-D1-1F] Dark Palace - Big Chest': (0xEA40, False, 'Palace of Darkness'),
'[dungeon-D1-1F] Dark Palace - Spike Statue Room': (0xEA46, False, 'Palace of Darkness'),
'Helmasaur - Heart Container': (0x180153, False, 'Palace of Darkness'),
'[dungeon-A2-1F] Ganons Tower - Torch': (0x180161, False, 'My Tower'),
'[dungeon-A2-1F] Ganons Tower - Right Staircase [left chest]': (0xEAD9, False, 'My Tower'),
'[dungeon-A2-1F] Ganons Tower - Right Staircase [right chest]': (0xEADC, False, 'My Tower'),
'[dungeon-A2-1F] Ganons Tower - Tile Room': (0xEAE2, False, 'My Tower'),
'[dungeon-A2-1F] Ganons Tower - Compass Room [top left chest]': (0xEAE5, False, 'My Tower'),
'[dungeon-A2-1F] Ganons Tower - Compass Room [top right chest]': (0xEAE8, False, 'My Tower'),
'[dungeon-A2-1F] Ganons Tower - Compass Room [bottom left chest]': (0xEAEB, False, 'My Tower'),
'[dungeon-A2-1F] Ganons Tower - Compass Room [bottom right chest]': (0xEAEE, False, 'My Tower'),
'[dungeon-A2-1F] Ganons Tower - North of Hookshot Room [top left chest]': (0xEAB8, False, 'My Tower'),
'[dungeon-A2-1F] Ganons Tower - North of Hookshot Room [top right chest]': (0xEABB, False, 'My Tower'),
'[dungeon-A2-1F] Ganons Tower - North of Hookshot Room [bottom left chest]': (0xEABE, False, 'My Tower'),
'[dungeon-A2-1F] Ganons Tower - North of Hookshot Room [bottom right chest]': (0xEAC1, False, 'My Tower'),
'[dungeon-A2-1F] Ganons Tower - Map Room': (0xEAD3, False, 'My Tower'),
'[dungeon-A2-1F] Ganons Tower - Firesnake Room': (0xEAD0, False, 'My Tower'),
'[dungeon-A2-1F] Ganons Tower - Teleport Room [top left chest]': (0xEAC4, False, 'My Tower'),
'[dungeon-A2-1F] Ganons Tower - Teleport Room [top right chest]': (0xEAC7, False, 'My Tower'),
'[dungeon-A2-1F] Ganons Tower - Teleport Room [bottom left chest]': (0xEACA, False, 'My Tower'),
'[dungeon-A2-1F] Ganons Tower - Teleport Room [bottom right chest]': (0xEACD, False, 'My Tower'),
'[dungeon-A2-1F] Ganons Tower - above Armos': (0xEADF, False, 'My Tower'),
'[dungeon-A2-1F] Ganons Tower - Big Chest': (0xEAD6, False, 'My Tower'),
'[dungeon-A2-B1] Ganons Tower - Armos Room [left chest]': (0xEAF4, False, 'My Tower'),
'[dungeon-A2-B1] Ganons Tower - Armos Room [right chest]': (0xEAF7, False, 'My Tower'),
'[dungeon-A2-B1] Ganons Tower - Armos Room [bottom chest]': (0xEAF1, False, 'My Tower'),
'[dungeon-A2-6F] Ganons Tower - Mini Helmasaur Room [left chest]': (0xEAFD, False, 'My Tower'),
'[dungeon-A2-6F] Ganons Tower - Mini Helmasaur Room [right chest]': (0xEB00, False, 'My Tower'),
'[dungeon-A2-6F] Ganons Tower - Room before Moldorm': (0xEB03, False, 'My Tower'),
'[dungeon-A2-6F] Ganons Tower - Moldorm Room': (0xEB06, False, 'My Tower'),
'Ganon': (None, False, None),
'Armos - Pendant': ([0x1209D, 0x53EF8, 0x53EF9, 0x180052, 0x18007C, 0xC6FE], True, 'Eastern Palace'),
'Lanmolas - Pendant': ([0x1209E, 0x53F1C, 0x53F1D, 0x180053, 0x180078, 0xC6FF], True, 'Desert Palace'),
'Moldorm - Pendant': ([0x120A5, 0x53F0A, 0x53F0B, 0x18005A, 0x18007A, 0xC706], True, 'Tower of Hera'),
'Helmasaur - Crystal': ([0x120A1, 0x53F00, 0x53F01, 0x180056, 0x18007D, 0xC702], True, 'Palace of Darkness'),
'Arrghus - Crystal': ([0x120A0, 0x53F6C, 0x53F6D, 0x180055, 0x180071, 0xC701], True, 'Swamp Palace'),
'Blind - Crystal': ([0x120A6, 0x53F36, 0x53F37, 0x18005B, 0x180077, 0xC707], True, 'Thieves\' Town'),
'Mothula - Crystal': ([0x120A3, 0x53F12, 0x53F13, 0x180058, 0x18007B, 0xC704], True, 'Skull Woods'),
'Kholdstare - Crystal': ([0x120A4, 0x53F5A, 0x53F5B, 0x180059, 0x180073, 0xC705], True, 'Ice Palace'),
'Vitreous - Crystal': ([0x120A2, 0x53F48, 0x53F49, 0x180057, 0x180075, 0xC703], True, 'Misery Mire'),
'Trinexx - Crystal': ([0x120A7, 0x53F24, 0x53F25, 0x18005C, 0x180079, 0xC708], True, 'Turtle Rock')}

31
Rom.py
View File

@ -1,4 +1,4 @@
from Regions import location_addresses, crystal_locations, dungeon_music_addresses
from Dungeons import dungeon_music_addresses
from EntranceShuffle import door_addresses, single_doors
from Text import string_to_alttp_text, text_addresses, credits_addresses, string_to_credits
from Text import Uncle_texts, Ganon1_texts, PyramidFairy_texts, TavernMan_texts, Sahasrahla2_texts, Triforce_texts, Blind_texts, BombShop2_texts
@ -6,7 +6,7 @@ from Text import KingsReturn_texts, Sanctuary_texts, Kakariko_texts, Blacksmiths
import random
def patch_rom(world, rom, quickswap=False):
def patch_rom(world, rom, quickswap=False, beep='normal'):
# patch items
for location in world.get_locations():
if location.name == 'Ganon':
@ -15,13 +15,12 @@ def patch_rom(world, rom, quickswap=False):
itemid = location.item.code if location.item is not None else 0x5A
try:
locationaddress = location.address
if not location.crystal:
# regular items
locationaddress = location_addresses[location.name]
write_byte(rom, locationaddress, itemid)
except KeyError:
else:
# crystals
locationaddress = crystal_locations[location.name]
for address, value in zip(locationaddress, itemid):
write_byte(rom, address, value)
@ -221,6 +220,12 @@ def patch_rom(world, rom, quickswap=False):
write_strings(rom, world)
# set rom name
write_bytes(rom, 0x7FC0, [0x45, 0x6E, 0x74, 0x72, 0x61, 0x6E, 0x63, 0x65, 0x52, 0x61, 0x6E, 0x64, 0x6F, 0x6D, 0x69, 0x7A, 0x65, 0x72, 0x00, 0x00, 0x00])
# set heart beep rate
write_byte(rom, 0x180033, {'off': 0x00, 'half': 0x40, 'quarter': 0x80, 'normal': 0x20}[beep])
return rom
@ -244,10 +249,16 @@ def write_credits_string_to_rom(rom, target, string):
def write_strings(rom, world):
# ToDo should read location of items and give hint
write_string_to_rom(rom, 'Ganon2', 'Did you find the silver arrows in Hyrule?')
write_string_to_rom(rom, 'BombShop1', 'Big Bomb?\nI Uh … Never heard of that. Move along.')
write_string_to_rom(rom, 'Sahasrahla1', 'How Did you Find me?')
silverarrows = world.find_items('Silver Arrows')
silverarrow_hint = ('in %s?' % silverarrows[0].hint_text) if silverarrows else '?\nI think not!'
write_string_to_rom(rom, 'Ganon2', 'Did you find the silver arrows %s' % silverarrow_hint)
crystal5 = world.find_items('Crystal 5')[0]
crystal6 = world.find_items('Crystal 6')[0]
write_string_to_rom(rom, 'BombShop1', 'Big Bomb?\nMy supply is blocked until you clear %s and %s.' % (crystal5.hint_text, crystal6.hint_text))
greenpendant = world.find_items('Green Pendant')[0]
write_string_to_rom(rom, 'Sahasrahla1', 'I lost my family heirloom in %s' % greenpendant.hint_text)
write_string_to_rom(rom, 'Uncle', Uncle_texts[random.randint(0, len(Uncle_texts) - 1)])
write_string_to_rom(rom, 'Triforce', Triforce_texts[random.randint(0, len(Triforce_texts) - 1)])

17
Text.py
View File

@ -28,13 +28,16 @@ credits_addresses = {'KingsReturn': (0x76928, 22),
'LostWoods': (0x76C51, 16),
'Altar': (0x76C81, 20)}
Uncle_texts = ['Good Luck!\nYou will need it.']
Triforce_texts = ['Product has Hole in center. Bad seller, 0 out of 5.']
Uncle_texts = ['Good Luck!\nYou will need it.',
'10\n9\n8\n7\n6\n5\n4\n3\n2\n1\nGo!']
Triforce_texts = ['Product has Hole in center. Bad seller, 0 out of 5.',
'\n Well Done!']
BombShop2_texts = ['Bombs!\nBombs!\nBiggest!\nBestest!\nGreatest!\nBoomest!']
PyramidFairy_texts = ['May I talk to you about our lord and savior, Ganon?']
Sahasrahla2_texts = ['You already got my item, idiot.']
Blind_texts = ['I bet you expected a vision related pun?\n\nNot Today.\n Didn\'t see that coming, did you?']
Ganon1_texts = ['\n\n\n\n\n\n\n\n\nWhy are you reading an empty textbox?']
Ganon1_texts = ['\n\n\n\n\n\n\n\n\nWhy are you reading an empty textbox?',
'Hi']
TavernMan_texts = ['Did you know that talking to random NPCs wastes time in a race? I hope this information may be of use to you in the future.']
KingsReturn_texts = ['Who is this even']
@ -54,14 +57,6 @@ MagicShop_texts = ['Drug deal']
FluteBoy_texts = ['Stumped']
def write_texts_to_rom(rom, world):
pass
def write_credits_to_rom(rom, world):
pass
def string_to_credits(s, length):
buf = bytearray()