From e4e0304b40c35c727daadc7f6e089d15740f7eac Mon Sep 17 00:00:00 2001 From: LLCoolDave Date: Thu, 25 May 2017 17:47:15 +0200 Subject: [PATCH] Refactored Locations, added heart beep setting. --- BaseClasses.py | 18 +- Dungeons.py | 12 ++ Main.py | 4 +- Regions.py | 500 ++++++++++++++++++++++++------------------------- Rom.py | 31 ++- Text.py | 17 +- 6 files changed, 289 insertions(+), 293 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index 71ea8d78..d52b2143 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -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 diff --git a/Dungeons.py b/Dungeons.py index 86110e49..ccfc6bd8 100644 --- a/Dungeons.py +++ b/Dungeons.py @@ -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]} diff --git a/Main.py b/Main.py index 14e92ff4..01a63ff6 100644 --- a/Main.py +++ b/Main.py @@ -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): diff --git a/Regions.py b/Regions.py index a2cc63c5..5284cf2d 100644 --- a/Regions.py +++ b/Regions.py @@ -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')} diff --git a/Rom.py b/Rom.py index 3d4c1674..5f35398a 100644 --- a/Rom.py +++ b/Rom.py @@ -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)]) diff --git a/Text.py b/Text.py index dc46dde9..179c3a3f 100644 --- a/Text.py +++ b/Text.py @@ -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()