diff --git a/BaseClasses.py b/BaseClasses.py index 3f115d45..118ff9de 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -2375,6 +2375,7 @@ class Spoiler(object): 'shuffle': self.world.shuffle, 'shuffleganon': self.world.shuffle_ganon, 'shufflelinks': self.world.shufflelinks, + 'shuffletavern': self.world.shuffletavern, 'overworld_map': self.world.overworld_map, 'door_shuffle': self.world.doorShuffle, 'intensity': self.world.intensity, @@ -2574,6 +2575,7 @@ class Spoiler(object): outfile.write('Entrance Shuffle: %s\n' % self.metadata['shuffle'][player]) if self.metadata['shuffle'][player] != 'vanilla': outfile.write(f"Link's House Shuffled: {yn(self.metadata['shufflelinks'])}\n") + outfile.write(f"Back of Tavern Shuffled: {yn(self.metadata['shuffletavern'][player])}\n") outfile.write(f"GT/Ganon Shuffled: {yn(self.metadata['shuffleganon'])}\n") outfile.write(f"Overworld Map: {self.metadata['overworld_map'][player]}\n") if self.metadata['goal'][player] != 'trinity': @@ -2838,8 +2840,8 @@ func_mode = {"normal": 0, "hard": 1, "expert": 2} mixed_travel_mode = {"prevent": 0, "allow": 1, "force": 2} # intensity is 3 bits (reserves 4-7 levels) -# new byte 4: ?DDD PPPP (unused, drop, pottery) -# dropshuffle reserves 2 bits, pottery needs 2 but reserves 2 for future modes) +# new byte 4: TDDD PPPP (tavern shuffle, drop, pottery) +# dropshuffle reserves 2 bits, pottery needs 4) pottery_mode = {'none': 0, 'keys': 2, 'lottery': 3, 'dungeon': 4, 'cave': 5, 'cavekeys': 6, 'reduced': 7, 'clustered': 8, 'nonempty': 9} @@ -2893,7 +2895,7 @@ class Settings(object): | (0x8 if w.standardize_palettes[p] == "original" else 0) | (0 if w.intensity[p] == "random" else w.intensity[p]), - (0x10 if w.dropshuffle[p] else 0) | (pottery_mode[w.pottery[p]]), + (0x80 if w.shuffletavern[p] else 0) | (0x10 if w.dropshuffle[p] else 0) | (pottery_mode[w.pottery[p]]), ((8 if w.crystals_gt_orig[p] == "random" else int(w.crystals_gt_orig[p])) << 3) | (counter_mode[w.dungeon_counters[p]] << 1) | (1 if w.experimental[p] else 0), @@ -2943,7 +2945,7 @@ class Settings(object): intensity = settings[3] & 0x7 args.intensity[p] = "random" if intensity == 0 else intensity - # args.shuffleswitches[p] = True if settings[4] & 0x80 else False + args.shuffletavern[p] = True if settings[4] & 0x80 else False args.dropshuffle[p] = True if settings[4] & 0x10 else False args.pottery[p] = r(pottery_mode)[settings[4] & 0x0F] diff --git a/CLI.py b/CLI.py index 62f3248b..987652fd 100644 --- a/CLI.py +++ b/CLI.py @@ -119,8 +119,8 @@ def parse_cli(argv, no_defaults=False): 'mapshuffle', 'compassshuffle', 'keyshuffle', 'bigkeyshuffle', 'startinventory', 'usestartinventory', 'bombbag', 'overworld_map', 'restrict_boss_items', 'triforce_pool_min', 'triforce_pool_max', 'triforce_goal_min', 'triforce_goal_max', - 'triforce_min_difference', 'triforce_goal', 'triforce_pool', 'shufflelinks', 'pseudoboots', - 'retro', 'accessibility', 'hints', 'beemizer', 'experimental', 'dungeon_counters', + 'triforce_min_difference', 'triforce_goal', 'triforce_pool', 'shufflelinks', 'shuffletavern', + 'pseudoboots', 'retro', 'accessibility', 'hints', 'beemizer', 'experimental', 'dungeon_counters', 'shufflebosses', 'shuffleenemies', 'enemy_health', 'enemy_damage', 'shufflepots', 'ow_palettes', 'uw_palettes', 'sprite', 'disablemusic', 'quickswap', 'fastmenu', 'heartcolor', 'heartbeep', 'remote_items', 'shopsanity', 'dropshuffle', 'pottery', 'keydropshuffle', @@ -171,6 +171,7 @@ def parse_settings(): "shuffleganon": True, "shuffle": "vanilla", "shufflelinks": False, + "shuffletavern": False, "overworld_map": "default", "pseudoboots": False, diff --git a/ER_hint_reference.txt b/ER_hint_reference.txt index 999fb436..018dfb3a 100644 --- a/ER_hint_reference.txt +++ b/ER_hint_reference.txt @@ -91,6 +91,7 @@ While the exact verbage of location names and item names can be found in the sou Overworld Entrance naming: +Links House: The hero's old residence Turtle Rock: Turtle Rock Main Misery Mire: Misery Mire Ice Palace: Ice Palace @@ -141,6 +142,7 @@ Lake Hylia Fairy: A cave NE of Lake Hylia Light Hype Fairy: The cave south of your house Desert Fairy: The cave near the desert Chicken House: The chicken lady's house +Tavern North: A backdoor Aginahs Cave: The open desert cave Sahasrahlas Hut: The house near armos Cave Shop (Lake Hylia): The cave NW Lake Hylia diff --git a/EntranceShuffle.py b/EntranceShuffle.py index 9398121a..1537967d 100644 --- a/EntranceShuffle.py +++ b/EntranceShuffle.py @@ -3366,7 +3366,7 @@ door_addresses = {'Links House': (0x00, (0x0104, 0x2c, 0x0506, 0x0a9a, 0x0832, 0 'Light Hype Fairy': (0x6B, (0x0115, 0x34, 0x00a0, 0x0c04, 0x0900, 0x0c58, 0x0988, 0x0c73, 0x0985, 0x0a, 0xf6, 0x0000, 0x0000)), 'Desert Fairy': (0x71, (0x0115, 0x3a, 0x0000, 0x0e00, 0x0400, 0x0e26, 0x0468, 0x0e6d, 0x0485, 0x00, 0x00, 0x0000, 0x0000)), 'Kings Grave': (0x5A, (0x0113, 0x14, 0x0320, 0x0456, 0x0900, 0x04a6, 0x0998, 0x04c3, 0x097d, 0x0a, 0xf6, 0x0000, 0x0000)), - 'Tavern North': (0x42, (0x0103, 0x18, 0x1440, 0x08a7, 0x0206, 0x08f9, 0x0288, 0x0914, 0x0293, 0xf7, 0x09, 0xFFFF, 0x0000)), # do not use, buggy + 'Tavern North': (0x42, (0x0103, 0x18, 0x1440, 0x08a7, 0x0206, 0x091b, 0x0288, 0x0914, 0x0293, 0xf7, 0x09, 0xFFFF, 0x0000)), 'Chicken House': (0x4A, (0x0108, 0x18, 0x1120, 0x0837, 0x0106, 0x0888, 0x0188, 0x08a4, 0x0193, 0x07, 0xf9, 0x1530, 0x0000)), 'Aginahs Cave': (0x70, (0x010a, 0x30, 0x0656, 0x0cc6, 0x02aa, 0x0d18, 0x0328, 0x0d33, 0x032f, 0x08, 0xf8, 0x0000, 0x0000)), 'Sahasrahlas Hut': (0x44, (0x0105, 0x1e, 0x0610, 0x06d4, 0x0c76, 0x0727, 0x0cf0, 0x0743, 0x0cfb, 0x0a, 0xf6, 0x0000, 0x0000)), @@ -3655,7 +3655,7 @@ ow_prize_table = {'Links House': (0x8b1, 0xb2d), 'Inverted Big Bomb Shop': (0x8b 'Light Hype Fairy': (0x940, 0xc80), 'Desert Fairy': (0x420, 0xe00), 'Kings Grave': (0x920, 0x520), - 'Tavern North': None, # can't mark this one technically + 'Tavern North': (0x270, 0x900), 'Chicken House': (0x120, 0x880), 'Aginahs Cave': (0x2e0, 0xd00), 'Sahasrahlas Hut': (0xcf0, 0x6c0), diff --git a/Main.py b/Main.py index 98ef5fbc..240051d4 100644 --- a/Main.py +++ b/Main.py @@ -120,6 +120,7 @@ def main(args, seed=None, fish=None): world.treasure_hunt_count = {k: int(v) for k, v in args.triforce_goal.items()} world.treasure_hunt_total = {k: int(v) for k, v in args.triforce_pool.items()} world.shufflelinks = args.shufflelinks.copy() + world.shuffletavern = args.shuffletavern.copy() world.pseudoboots = args.pseudoboots.copy() world.overworld_map = args.overworld_map.copy() world.restrict_boss_items = args.restrict_boss_items.copy() @@ -203,7 +204,7 @@ def main(args, seed=None, fish=None): logger.info(world.fish.translate("cli","cli","shuffling.world")) for player in range(1, world.players + 1): - if world.experimental[player] or (world.customizer and world.customizer.get_entrances()): + if world.experimental[player] or world.shuffle[player] in ['lite', 'lean'] or world.shuffletavern[player] or (world.customizer and world.customizer.get_entrances()): link_entrances_new(world, player) else: if world.mode[player] != 'inverted': diff --git a/README.md b/README.md index f419292f..f2980840 100644 --- a/README.md +++ b/README.md @@ -333,6 +333,11 @@ Start with dash ability, but no way to use boots to accomplish checks Whether to shuffle links house in most ER modes. +``` +--shuffletavern +``` + +Whether to shuffle the back of the tavern in most ER modes. ``` --bombbag diff --git a/Rom.py b/Rom.py index 52b61a0d..453e486a 100644 --- a/Rom.py +++ b/Rom.py @@ -37,7 +37,7 @@ from source.dungeon.RoomList import Room0127 JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = 'b4daf51397414464562a772f72f0b551' +RANDOMIZERBASEHASH = '7b330d5a813abb4bf036313ed42bccee' class JsonRom(object): @@ -721,6 +721,8 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False): else: # patch door table rom.write_byte(0xDBB73 + exit.addresses, exit.target) + if exit.name == 'Tavern North': + rom.write_byte(0x157D0, exit.target) if world.mode[player] == 'inverted': patch_shuffled_dark_sanc(world, rom, player) @@ -2056,6 +2058,8 @@ def write_strings(rom, world, player, team): entrances_to_hint.update({'Inverted Links House': 'The hero\'s old residence'}) else: entrances_to_hint.update({'Links House': 'The hero\'s old residence'}) + if world.shuffletavern[player] and world.shuffle[player] not in ['vanilla', 'dungeonssimple', 'dungeonsfull']: + entrances_to_hint.update({'Tavern North': 'A backdoor'}) if world.mode[player] == 'inverted': entrances_to_hint.update({'Inverted Dark Sanctuary': 'The dark sanctuary cave'}) entrances_to_hint.update({'Inverted Big Bomb Shop': 'The old hero\'s dark home'}) diff --git a/mystery_testsuite.yml b/mystery_testsuite.yml index 723e3f56..364806e6 100644 --- a/mystery_testsuite.yml +++ b/mystery_testsuite.yml @@ -43,6 +43,9 @@ entrance_shuffle: shufflelinks: on: 1 off: 1 +shuffletavern: + on: 1 + off: 1 world_state: standard: 1 open: 1 diff --git a/resources/app/cli/args.json b/resources/app/cli/args.json index ff419fc6..6e8d0310 100644 --- a/resources/app/cli/args.json +++ b/resources/app/cli/args.json @@ -377,6 +377,10 @@ "action": "store_true", "type": "bool" }, + "shuffletavern": { + "action": "store_true", + "type": "bool" + }, "overworld_map": { "choices": [ "default", diff --git a/resources/app/cli/lang/en.json b/resources/app/cli/lang/en.json index 681570aa..1bfd124a 100644 --- a/resources/app/cli/lang/en.json +++ b/resources/app/cli/lang/en.json @@ -324,6 +324,9 @@ "shufflelinks": [ "Include Link's House in the entrance shuffle pool. (default: %(default)s)" ], + "shuffletavern": [ + "Include the back of the tavern in the entrance shuffle pool. (default: %(default)s)" + ], "overworld_map": [ "Control if and how the overworld map indicators show the locations of dungeons (default: %(default)s)" ], diff --git a/resources/app/gui/lang/en.json b/resources/app/gui/lang/en.json index c8232000..ef9ffd13 100644 --- a/resources/app/gui/lang/en.json +++ b/resources/app/gui/lang/en.json @@ -137,6 +137,7 @@ "randomizer.entrance.openpyramid": "Pre-open Pyramid Hole", "randomizer.entrance.shuffleganon": "Include Ganon's Tower and Pyramid Hole in shuffle pool", "randomizer.entrance.shufflelinks": "Include Link's House in the shuffle pool", + "randomizer.entrance.shuffletavern": "Include the back of the tavern in the entrance shuffle pool", "randomizer.entrance.overworld_map": "Overworld Map", "randomizer.entrance.overworld_map.default": "Default (no location display)", "randomizer.entrance.overworld_map.compass": "Compass indicates location", diff --git a/resources/app/gui/randomize/entrando/widgets.json b/resources/app/gui/randomize/entrando/widgets.json index c7dde4f6..b4c6698c 100644 --- a/resources/app/gui/randomize/entrando/widgets.json +++ b/resources/app/gui/randomize/entrando/widgets.json @@ -18,6 +18,7 @@ ] }, "shufflelinks": { "type": "checkbox" }, + "shuffletavern": { "type": "checkbox" }, "overworld_map": { "type": "selectbox", "options": [ diff --git a/source/classes/CustomSettings.py b/source/classes/CustomSettings.py index 253f9310..39482fcd 100644 --- a/source/classes/CustomSettings.py +++ b/source/classes/CustomSettings.py @@ -112,6 +112,7 @@ class CustomSettings(object): args.shufflepots[p] = get_setting(settings['shufflepots'], args.shufflepots[p]) args.bombbag[p] = get_setting(settings['bombbag'], args.bombbag[p]) args.shufflelinks[p] = get_setting(settings['shufflelinks'], args.shufflelinks[p]) + args.shuffletavern[p] = get_setting(settings['shuffletavern'], args.shuffletavern[p]) args.restrict_boss_items[p] = get_setting(settings['restrict_boss_items'], args.restrict_boss_items[p]) args.overworld_map[p] = get_setting(settings['overworld_map'], args.overworld_map[p]) args.pseudoboots[p] = get_setting(settings['pseudoboots'], args.pseudoboots[p]) @@ -215,6 +216,7 @@ class CustomSettings(object): settings_dict[p]['shufflepots'] = world.potshuffle[p] settings_dict[p]['bombbag'] = world.bombbag[p] settings_dict[p]['shufflelinks'] = world.shufflelinks[p] + settings_dict[p]['shuffletavern'] = world.shuffletavern[p] settings_dict[p]['overworld_map'] = world.overworld_map[p] settings_dict[p]['pseudoboots'] = world.pseudoboots[p] settings_dict[p]['triforce_goal'] = world.treasure_hunt_count[p] diff --git a/source/classes/constants.py b/source/classes/constants.py index b95604d4..2dccc1fe 100644 --- a/source/classes/constants.py +++ b/source/classes/constants.py @@ -79,6 +79,7 @@ SETTINGSTOPROCESS = { "openpyramid": "openpyramid", "shuffleganon": "shuffleganon", "shufflelinks": "shufflelinks", + "shuffletavern": "shuffletavern", "entranceshuffle": "shuffle", "overworld_map": "overworld_map", }, diff --git a/source/overworld/EntranceShuffle2.py b/source/overworld/EntranceShuffle2.py index 24760925..cb176aba 100644 --- a/source/overworld/EntranceShuffle2.py +++ b/source/overworld/EntranceShuffle2.py @@ -77,9 +77,6 @@ def link_entrances_new(world, player): for exit_name, region_name in inverted_mandatory_connections: connect_simple(world, exit_name, region_name, player) - # not randomized at this time - connect_simple(world, 'Tavern North', 'Tavern', player) - connect_custom(avail_pool, world, player) if world.shuffle[player] == 'vanilla': @@ -191,6 +188,14 @@ def do_main_shuffle(entrances, exits, avail, mode_def): avail.decoupled_entrances.remove('Ganons Tower') avail.decoupled_exits.remove('Ganons Tower Exit') + # back of tavern + if not avail.world.shuffletavern[avail.player] and 'Tavern North' in entrances: + connect_entrance('Tavern North', 'Tavern', avail) + entrances.remove('Tavern North') + exits.remove('Tavern') + if not avail.coupled: + avail.decoupled_entrances.remove('Tavern North') + # links house / houlihan do_links_house(entrances, exits, avail, cross_world) @@ -537,8 +542,8 @@ def figure_out_must_exits_same_world(entrances, exits, avail): def must_exits_helper(avail, lw_entrances, dw_entrances): - must_exit_lw = Inverted_LW_Must_Exit if avail.inverted else LW_Must_Exit - must_exit_dw = Inverted_DW_Must_Exit if avail.inverted else DW_Must_Exit + must_exit_lw = (Inverted_LW_Must_Exit if avail.inverted else LW_Must_Exit).copy() + must_exit_dw = (Inverted_DW_Must_Exit if avail.inverted else DW_Must_Exit).copy() if not avail.inverted and not avail.skull_handled: must_exit_dw.append(('Skull Woods Second Section Door (West)', 'Skull Woods Final Section')) must_exit_lw = must_exit_filter(avail, must_exit_lw, lw_entrances) @@ -549,8 +554,8 @@ def must_exits_helper(avail, lw_entrances, dw_entrances): def figure_out_must_exits_cross_world(entrances, exits, avail): multi_exit_caves = figure_out_connectors(exits) - must_exit_lw = Inverted_LW_Must_Exit if avail.inverted else LW_Must_Exit - must_exit_dw = Inverted_DW_Must_Exit if avail.inverted else DW_Must_Exit + must_exit_lw = (Inverted_LW_Must_Exit if avail.inverted else LW_Must_Exit).copy() + must_exit_dw = (Inverted_DW_Must_Exit if avail.inverted else DW_Must_Exit).copy() if not avail.inverted and not avail.skull_handled: must_exit_dw.append(('Skull Woods Second Section Door (West)', 'Skull Woods Final Section')) must_exit = must_exit_filter(avail, must_exit_lw + must_exit_dw, entrances) @@ -1061,13 +1066,12 @@ def connect_entrance(entrancename, exit_name, avail): addresses = door_addresses[entrance.name][0] entrance.connect(region, addresses, target) - if entrancename != 'Tavern North': - avail.entrances.remove(entrancename) - if avail.coupled: - if exit_name == 'Inverted Dark Sanctuary': - avail.exits.remove('Inverted Dark Sanctuary Exit') - else: - avail.exits.remove(exit_name) + avail.entrances.remove(entrancename) + if avail.coupled: + if exit_name == 'Inverted Dark Sanctuary': + avail.exits.remove('Inverted Dark Sanctuary Exit') + else: + avail.exits.remove(exit_name) world.spoiler.set_entrance(entrance.name, exit.name if exit is not None else region.name, 'entrance', player) logging.getLogger('').debug(f'Connected (entr) {entrance.name} to {exit.name if exit is not None else region.name}') @@ -1211,7 +1215,7 @@ modes = { 'Waterfall of Wishing', 'Inverted Bomb Shop', 'Cave Shop (Dark Death Mountain)', 'Dark World Potion Shop', 'Dark World Lumberjack Shop', 'Dark World Shop', 'Red Shield Shop', 'Kakariko Shop', 'Capacity Upgrade', 'Cave Shop (Lake Hylia)', - 'Links House', 'Inverted Links House'] + 'Links House', 'Inverted Links House', 'Tavern North'] }, 'old_man_cave': { # have to do old man cave first so lw dungeon don't use up everything 'special': 'old_man_cave_east', @@ -1277,7 +1281,7 @@ modes = { 'Waterfall of Wishing', 'Inverted Bomb Shop', 'Cave Shop (Dark Death Mountain)', 'Dark World Potion Shop', 'Dark World Lumberjack Shop', 'Dark World Shop', 'Red Shield Shop', 'Kakariko Shop', 'Capacity Upgrade', 'Cave Shop (Lake Hylia)', - 'Links House', 'Inverted Links House'] + 'Links House', 'Inverted Links House', 'Tavern North'] } } }, @@ -1575,8 +1579,8 @@ single_entrance_map = { 'Fortune Teller (Light)': 'Fortune Teller (Light)', 'Lost Woods Gamble': 'Lost Woods Gamble', 'Sick Kids House': 'Sick Kids House', 'Blacksmiths Hut': 'Blacksmiths Hut', 'Capacity Upgrade': 'Capacity Upgrade', 'Cave Shop (Lake Hylia)': 'Cave Shop (Lake Hylia)', 'Sahasrahlas Hut': 'Sahasrahlas Hut', - 'Aginahs Cave': 'Aginahs Cave', 'Chicken House': 'Chicken House', 'Kings Grave': 'Kings Grave', - 'Desert Fairy': 'Desert Healer Fairy', 'Light Hype Fairy': 'Swamp Healer Fairy', + 'Aginahs Cave': 'Aginahs Cave', 'Chicken House': 'Chicken House', 'Tavern North': 'Tavern', + 'Kings Grave': 'Kings Grave', 'Desert Fairy': 'Desert Healer Fairy', 'Light Hype Fairy': 'Swamp Healer Fairy', 'Lake Hylia Fortune Teller': 'Lake Hylia Fortune Teller', 'Lake Hylia Fairy': 'Lake Hylia Healer Fairy', 'Bonk Fairy (Light)': 'Bonk Fairy (Light)', 'Lumberjack House': 'Lumberjack House', 'Dam': 'Dam', 'Blinds Hideout': 'Blinds Hideout', 'Waterfall of Wishing': 'Waterfall of Wishing', @@ -1613,7 +1617,7 @@ default_lw = { 'Paradox Cave Exit (Middle)', 'Paradox Cave Exit (Top)', 'Fairy Ascension Cave Exit (Bottom)', 'Fairy Ascension Cave Exit (Top)', 'Spiral Cave Exit', 'Spiral Cave Exit (Top)', 'Waterfall of Wishing', 'Dam', 'Blinds Hideout', 'Lumberjack House', 'Bonk Fairy (Light)', 'Bonk Fairy (Dark)', 'Lake Hylia Healer Fairy', - 'Swamp Healer Fairy', 'Desert Healer Fairy', 'Fortune Teller (Light)', 'Lake Hylia Fortune Teller', 'Kings Grave', + 'Swamp Healer Fairy', 'Desert Healer Fairy', 'Fortune Teller (Light)', 'Lake Hylia Fortune Teller', 'Kings Grave', 'Tavern', 'Chicken House', 'Aginahs Cave', 'Sahasrahlas Hut', 'Cave Shop (Lake Hylia)', 'Capacity Upgrade', 'Blacksmiths Hut', 'Sick Kids House', 'Lost Woods Gamble', 'Snitch Lady (East)', 'Snitch Lady (West)', 'Bush Covered House', 'Tavern (Front)', 'Light World Bomb Hut', 'Kakariko Shop', 'Cave 45', 'Graveyard Cave', 'Checkerboard Cave', @@ -1631,7 +1635,7 @@ LW_Entrances = ['Elder House (East)', 'Elder House (West)', 'Two Brothers House 'Desert Palace Entrance (South)', 'Desert Palace Entrance (West)', 'Desert Palace Entrance (North)', 'Desert Palace Entrance (East)', 'Eastern Palace', 'Tower of Hera', 'Hyrule Castle Entrance (West)', 'Hyrule Castle Entrance (East)', 'Hyrule Castle Entrance (South)', 'Agahnims Tower', 'Blinds Hideout', - 'Lake Hylia Fairy', 'Light Hype Fairy', 'Desert Fairy', 'Chicken House', 'Aginahs Cave', + 'Lake Hylia Fairy', 'Light Hype Fairy', 'Desert Fairy', 'Tavern North', 'Chicken House', 'Aginahs Cave', 'Sahasrahlas Hut', 'Cave Shop (Lake Hylia)', 'Blacksmiths Hut', 'Sick Kids House', 'Lost Woods Gamble', 'Fortune Teller (Light)', 'Snitch Lady (East)', 'Snitch Lady (West)', 'Bush Covered House', 'Tavern (Front)', 'Light World Bomb Hut', 'Kakariko Shop', 'Mini Moldorm Cave', 'Long Fairy Cave', @@ -1774,8 +1778,8 @@ Simple_DM_Non_Connectors = {'Old Man Cave Ledge', 'Spiral Cave (Top)', 'Superbun 'Spectacle Rock Cave (Peak)', 'Spectacle Rock Cave (Top)'} Blacksmith_Options = [ - 'Blinds Hideout', 'Lake Hylia Fairy', 'Light Hype Fairy', 'Desert Fairy', 'Chicken House', 'Aginahs Cave', - 'Sahasrahlas Hut', 'Cave Shop (Lake Hylia)', 'Blacksmiths Hut', 'Sick Kids House', 'Lost Woods Gamble', + 'Blinds Hideout', 'Lake Hylia Fairy', 'Light Hype Fairy', 'Desert Fairy', 'Tavern North', 'Chicken House', + 'Aginahs Cave', 'Sahasrahlas Hut', 'Cave Shop (Lake Hylia)', 'Blacksmiths Hut', 'Sick Kids House', 'Lost Woods Gamble', 'Fortune Teller (Light)', 'Snitch Lady (East)', 'Snitch Lady (West)', 'Bush Covered House', 'Tavern (Front)', 'Light World Bomb Hut', 'Kakariko Shop', 'Mini Moldorm Cave', 'Long Fairy Cave', 'Good Bee Cave', '20 Rupee Cave', '50 Rupee Cave', 'Ice Rod Cave', 'Library', 'Potion Shop', 'Dam', 'Lumberjack House', 'Lake Hylia Fortune Teller', @@ -2653,7 +2657,7 @@ door_addresses = {'Links House': (0x00, (0x0104, 0x2c, 0x0506, 0x0a9a, 0x0832, 0 'Light Hype Fairy': (0x6B, (0x0115, 0x34, 0x00a0, 0x0c04, 0x0900, 0x0c58, 0x0988, 0x0c73, 0x0985, 0x0a, 0xf6, 0x0000, 0x0000)), 'Desert Fairy': (0x71, (0x0115, 0x3a, 0x0000, 0x0e00, 0x0400, 0x0e26, 0x0468, 0x0e6d, 0x0485, 0x00, 0x00, 0x0000, 0x0000)), 'Kings Grave': (0x5A, (0x0113, 0x14, 0x0320, 0x0456, 0x0900, 0x04a6, 0x0998, 0x04c3, 0x097d, 0x0a, 0xf6, 0x0000, 0x0000)), - 'Tavern North': (0x42, (0x0103, 0x18, 0x1440, 0x08a7, 0x0206, 0x08f9, 0x0288, 0x0914, 0x0293, 0xf7, 0x09, 0xFFFF, 0x0000)), # do not use, buggy + 'Tavern North': (0x42, (0x0103, 0x18, 0x1440, 0x08a7, 0x0206, 0x091b, 0x0288, 0x0914, 0x0293, 0xf7, 0x09, 0xFFFF, 0x0000)), 'Chicken House': (0x4A, (0x0108, 0x18, 0x1120, 0x0837, 0x0106, 0x0888, 0x0188, 0x08a4, 0x0193, 0x07, 0xf9, 0x1530, 0x0000)), 'Aginahs Cave': (0x70, (0x010a, 0x30, 0x0656, 0x0cc6, 0x02aa, 0x0d18, 0x0328, 0x0d33, 0x032f, 0x08, 0xf8, 0x0000, 0x0000)), 'Sahasrahlas Hut': (0x44, (0x0105, 0x1e, 0x0610, 0x06d4, 0x0c76, 0x0727, 0x0cf0, 0x0743, 0x0cfb, 0x0a, 0xf6, 0x0000, 0x0000)), @@ -2942,7 +2946,7 @@ ow_prize_table = {'Links House': (0x8b1, 0xb2d), 'Inverted Big Bomb Shop': (0x8b 'Light Hype Fairy': (0x940, 0xc80), 'Desert Fairy': (0x420, 0xe00), 'Kings Grave': (0x920, 0x520), - 'Tavern North': None, # can't mark this one technically + 'Tavern North': (0x270, 0x900), 'Chicken House': (0x120, 0x880), 'Aginahs Cave': (0x2e0, 0xd00), 'Sahasrahlas Hut': (0xcf0, 0x6c0), diff --git a/source/tools/MysteryUtils.py b/source/tools/MysteryUtils.py index 3816ef7c..d7e54098 100644 --- a/source/tools/MysteryUtils.py +++ b/source/tools/MysteryUtils.py @@ -87,6 +87,7 @@ def roll_settings(weights): ret.dungeon_counters = 'pickup' if ret.door_shuffle != 'vanilla' or ret.compassshuffle == 'on' else 'off' ret.shufflelinks = get_choice('shufflelinks') == 'on' + ret.shuffletavern = get_choice('shuffletavern') == 'on' ret.pseudoboots = get_choice('pseudoboots') == 'on' ret.shopsanity = get_choice('shopsanity') == 'on' keydropshuffle = get_choice('keydropshuffle') == 'on'