diff --git a/BaseClasses.py b/BaseClasses.py index 7e18ba60..ae8beafd 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -65,6 +65,8 @@ class World(object): self.custom = custom self.customitemarray = customitemarray self.can_take_damage = True + self.hints = hints + self.hints = hints.copy() self.dynamic_regions = [] self.dynamic_locations = [] @@ -109,7 +111,7 @@ class World(object): set_player_attr('can_access_trock_front', None) set_player_attr('can_access_trock_big_chest', None) set_player_attr('can_access_trock_middle', None) - set_player_attr('fix_fake_world', True) + set_player_attr('fix_fake_world', logic not in ['owglitches', 'nologic'] or shuffle in ['crossed', 'insanity', 'madness_legacy']) set_player_attr('mapshuffle', False) set_player_attr('compassshuffle', False) set_player_attr('keyshuffle', False) @@ -752,6 +754,31 @@ class CollectionState(object): def has_turtle_rock_medallion(self, player): return self.has(self.world.required_medallions[player][1], player) + def can_boots_clip_lw(self, player): + if self.world.mode == 'inverted': + return self.has_Boots(player) and self.has_Pearl(player) + return self.has_Boots(player) + + def can_boots_clip_dw(self, player): + if self.world.mode != 'inverted': + return self.has_Boots(player) and self.has_Pearl(player) + return self.has_Boots(player) + + def can_get_glitched_speed_lw(self, player): + rules = [self.has_Boots(player), any([self.has('Hookshot', player), self.has_sword(player)])] + if self.world.mode == 'inverted': + rules.append(self.has_Pearl(player)) + return all(rules) + + def can_get_glitched_speed_dw(self, player): + rules = [self.has_Boots(player), any([self.has('Hookshot', player), self.has_sword(player)])] + if self.world.mode != 'inverted': + rules.append(self.has_Pearl(player)) + return all(rules) + + def can_superbunny_mirror_with_sword(self, player): + return self.has_Mirror(player) and self.has_sword(player) + def collect(self, item, event=False, location=None): if location: self.locations_checked.add(location) diff --git a/EntranceShuffle.py b/EntranceShuffle.py index 63380bf4..2c5f30e3 100644 --- a/EntranceShuffle.py +++ b/EntranceShuffle.py @@ -59,7 +59,9 @@ def link_entrances(world, player): if world.mode[player] == 'standard': # rest of hyrule castle must be in light world, so it has to be the one connected to east exit of desert - connect_mandatory_exits(world, lw_entrances, [('Hyrule Castle Exit (West)', 'Hyrule Castle Exit (East)')], list(LW_Dungeon_Entrances_Must_Exit), player) + hyrule_castle_exits = [('Hyrule Castle Exit (West)', 'Hyrule Castle Exit (East)')] + connect_mandatory_exits(world, lw_entrances, hyrule_castle_exits, list(LW_Dungeon_Entrances_Must_Exit), player) + connect_caves(world, lw_entrances, [], hyrule_castle_exits, player) elif world.doorShuffle[player] != 'vanilla': # sanc is in light world, so must all of HC if door shuffle is on connect_mandatory_exits(world, lw_entrances, @@ -1933,9 +1935,7 @@ def connect_random(world, exitlist, targetlist, player, two_way=False): def connect_mandatory_exits(world, entrances, caves, must_be_exits, player): - """This works inplace""" - random.shuffle(entrances) - random.shuffle(caves) + # Keeps track of entrances that cannot be used to access each exit / cave if world.mode == 'inverted': invalid_connections = Inverted_Must_Exit_Invalid_Connections.copy() @@ -1943,6 +1943,18 @@ def connect_mandatory_exits(world, entrances, caves, must_be_exits, player): invalid_connections = Must_Exit_Invalid_Connections.copy() invalid_cave_connections = defaultdict(set) + if world.logic in ['owglitches', 'nologic']: + import OverworldGlitchRules + for entrance in OverworldGlitchRules.get_non_mandatory_exits(world.mode == 'inverted'): + invalid_connections[entrance] = set() + if entrance in must_be_exits: + must_be_exits.remove(entrance) + entrances.append(entrance) + + """This works inplace""" + random.shuffle(entrances) + random.shuffle(caves) + # Handle inverted Aga Tower - if it depends on connections, then so does Hyrule Castle Ledge if world.mode == 'inverted': for entrance in invalid_connections: @@ -2990,6 +3002,8 @@ mandatory_connections = [('Links House S&Q', 'Links House'), ('East Dark World River Pier', 'East Dark World'), ('West Dark World Gap', 'West Dark World'), ('East Dark World Broken Bridge Pass', 'East Dark World'), + ('Catfish Exit Rock', 'Northeast Dark World'), + ('Catfish Entrance Rock', 'Catfish'), ('Northeast Dark World Broken Bridge Pass', 'Northeast Dark World'), ('Bumper Cave Entrance Rock', 'Bumper Cave Entrance'), ('Bumper Cave Entrance Drop', 'West Dark World'), @@ -3032,6 +3046,7 @@ mandatory_connections = [('Links House S&Q', 'Links House'), ('Spiral Cave Mirror Spot', 'Spiral Cave Ledge'), ('Mimic Cave Mirror Spot', 'Mimic Cave Ledge'), ('Cave 45 Mirror Spot', 'Cave 45 Ledge'), + ('Bombos Tablet Mirror Spot', 'Bombos Tablet Ledge'), ('Graveyard Ledge Mirror Spot', 'Graveyard Ledge'), ('Ganon Drop', 'Bottom of Pyramid'), ('Pyramid Drop', 'East Dark World') @@ -3046,6 +3061,8 @@ inverted_mandatory_connections = [('Links House S&Q', 'Inverted Links House'), ('Lake Hylia Warp', 'Northeast Light World'), ('Northeast Light World Warp', 'Light World'), ('Zoras River', 'Zoras River'), + ('Waterfall of Wishing Cave', 'Waterfall of Wishing Cave'), + ('Northeast Light World Return', 'Northeast Light World'), ('Kings Grave Outer Rocks', 'Kings Grave Area'), ('Kings Grave Inner Rocks', 'Light World'), ('Kakariko Well (top to bottom)', 'Kakariko Well (bottom)'), @@ -3082,6 +3099,8 @@ inverted_mandatory_connections = [('Links House S&Q', 'Inverted Links House'), ('Dark Lake Hylia Teleporter', 'Dark Lake Hylia'), ('Dark Lake Hylia Ledge Pier', 'Dark Lake Hylia Ledge'), ('Dark Lake Hylia Ledge Drop', 'Dark Lake Hylia'), + ('Ice Palace Missing Wall', 'Dark Lake Hylia Central Island'), + ('Dark Lake Hylia Shallows', 'Dark Lake Hylia'), ('East Dark World Pier', 'East Dark World'), ('South Dark World Bridge', 'South Dark World'), ('East Dark World Bridge', 'East Dark World'), @@ -3095,6 +3114,8 @@ inverted_mandatory_connections = [('Links House S&Q', 'Inverted Links House'), ('West Dark World Gap', 'West Dark World'), ('East Dark World Broken Bridge Pass', 'East Dark World'), ('Northeast Dark World Broken Bridge Pass', 'Northeast Dark World'), + ('Catfish Exit Rock', 'Northeast Dark World'), + ('Catfish Entrance Rock', 'Catfish'), ('Bumper Cave Entrance Rock', 'Bumper Cave Entrance'), ('Bumper Cave Entrance Drop', 'West Dark World'), ('Bumper Cave Ledge Drop', 'West Dark World'), @@ -3148,7 +3169,7 @@ inverted_mandatory_connections = [('Links House S&Q', 'Inverted Links House'), ('Desert Palace Stairs Mirror Spot', 'Dark Desert'), ('Desert Palace North Mirror Spot', 'Dark Desert'), ('Maze Race Mirror Spot', 'West Dark World'), - ('Lake Hylia Central Island Mirror Spot', 'Dark Lake Hylia'), + ('Lake Hylia Central Island Mirror Spot', 'Dark Lake Hylia Central Island'), ('Hammer Peg Area Mirror Spot', 'Hammer Peg Area'), ('Bumper Cave Ledge Mirror Spot', 'Bumper Cave Ledge'), ('Bumper Cave Entrance Mirror Spot', 'Bumper Cave Entrance'), @@ -3164,7 +3185,7 @@ inverted_mandatory_connections = [('Links House S&Q', 'Inverted Links House'), ('West Dark World Mirror Spot', 'West Dark World'), ('South Dark World Mirror Spot', 'South Dark World'), ('Potion Shop Mirror Spot', 'Northeast Dark World'), - ('Northeast Dark World Mirror Spot', 'Northeast Dark World'), + ('Catfish Mirror Spot', 'Catfish'), ('Shopping Mall Mirror Spot', 'Dark Lake Hylia Ledge'), ('Skull Woods Mirror Spot', 'Skull Woods Forest (West)'), ('DDM Flute', 'The Sky'), @@ -3327,10 +3348,10 @@ default_connections = [('Waterfall of Wishing', 'Waterfall of Wishing'), ('Dark Desert Fairy', 'Dark Desert Healer Fairy'), ('Spike Cave', 'Spike Cave'), ('Hookshot Cave', 'Hookshot Cave'), - ('Superbunny Cave (Top)', 'Superbunny Cave'), + ('Superbunny Cave (Top)', 'Superbunny Cave (Top)'), ('Cave Shop (Dark Death Mountain)', 'Cave Shop (Dark Death Mountain)'), ('Dark Death Mountain Fairy', 'Dark Death Mountain Healer Fairy'), - ('Superbunny Cave (Bottom)', 'Superbunny Cave'), + ('Superbunny Cave (Bottom)', 'Superbunny Cave (Bottom)'), ('Superbunny Cave Exit (Top)', 'Dark Death Mountain (Top)'), ('Superbunny Cave Exit (Bottom)', 'Dark Death Mountain (East Bottom)'), ('Hookshot Cave Exit (South)', 'Dark Death Mountain (Top)'), @@ -3461,9 +3482,9 @@ inverted_default_connections = [('Waterfall of Wishing', 'Waterfall of Wishing' ('Dark Desert Fairy', 'Dark Desert Healer Fairy'), ('Spike Cave', 'Spike Cave'), ('Hookshot Cave', 'Hookshot Cave'), - ('Superbunny Cave (Top)', 'Superbunny Cave'), + ('Superbunny Cave (Top)', 'Superbunny Cave (Top)'), ('Cave Shop (Dark Death Mountain)', 'Cave Shop (Dark Death Mountain)'), - ('Superbunny Cave (Bottom)', 'Superbunny Cave'), + ('Superbunny Cave (Bottom)', 'Superbunny Cave (Bottom)'), ('Superbunny Cave Exit (Bottom)', 'Dark Death Mountain (East Bottom)'), ('Hookshot Cave Exit (North)', 'Death Mountain Floating Island (Dark World)'), ('Hookshot Cave Back Entrance', 'Hookshot Cave'), diff --git a/Fill.py b/Fill.py index 3cdf8bf3..25f4fef8 100644 --- a/Fill.py +++ b/Fill.py @@ -274,7 +274,7 @@ def distribute_items_restrictive(world, gftower_trash=False, fill_locations=None # fill in gtower locations with trash first for player in range(1, world.players + 1): - if not gftower_trash or not world.ganonstower_vanilla[player] or world.doorShuffle[player] == 'crossed': + if not gftower_trash or not world.ganonstower_vanilla[player] or world.doorShuffle[player] == 'crossed' or world.logic[player] in ['owglitches', 'nologic']: continue gftower_trash_count = (random.randint(15, 50) if world.goal[player] == 'triforcehunt' else random.randint(0, 15)) diff --git a/InvertedRegions.py b/InvertedRegions.py index 53a33f43..d935ed28 100644 --- a/InvertedRegions.py +++ b/InvertedRegions.py @@ -30,7 +30,8 @@ def create_inverted_regions(world, player): "Blind\'s Hideout - Right", "Blind\'s Hideout - Far Left", "Blind\'s Hideout - Far Right"]), - create_lw_region(player, 'Northeast Light World', None, ['Zoras River', 'Waterfall of Wishing', 'Potion Shop Outer Rock', 'Northeast Dark World Mirror Spot', 'Northeast Light World Warp']), + create_lw_region(player, 'Northeast Light World', None, ['Zoras River', 'Waterfall of Wishing Cave', 'Potion Shop Outer Rock', 'Catfish Mirror Spot', 'Northeast Light World Warp']), + create_lw_region(player, 'Waterfall of Wishing Cave', None, ['Waterfall of Wishing', 'Northeast Light World Return']), create_lw_region(player, 'Potion Shop Area', None, ['Potion Shop', 'Potion Shop Inner Bushes', 'Potion Shop Inner Rock', 'Potion Shop Mirror Spot', 'Potion Shop River Drop']), create_lw_region(player, 'Graveyard Cave Area', None, ['Graveyard Cave', 'Graveyard Cave Inner Bushes', 'Graveyard Cave Mirror Spot']), create_lw_region(player, 'River', None, ['Light World Pier', 'Potion Shop Pier']), @@ -148,14 +149,16 @@ def create_inverted_regions(world, player): create_dw_region(player, 'East Dark World', ['Pyramid'], ['Pyramid Fairy', 'South Dark World Bridge', 'Palace of Darkness', 'Dark Lake Hylia Drop (East)', 'Dark Lake Hylia Fairy', 'Palace of Darkness Hint', 'East Dark World Hint', 'Northeast Dark World Broken Bridge Pass', 'East Dark World Teleporter', 'EDW Flute']), - create_dw_region(player, 'Northeast Dark World', ['Catfish'], ['West Dark World Gap', 'Dark World Potion Shop', 'East Dark World Broken Bridge Pass', 'NEDW Flute', 'Dark Lake Hylia Teleporter']), + create_dw_region(player, 'Catfish', ['Catfish'], ['Catfish Exit Rock']), + create_dw_region(player, 'Northeast Dark World', None, ['West Dark World Gap', 'Dark World Potion Shop', 'East Dark World Broken Bridge Pass', 'NEDW Flute', 'Dark Lake Hylia Teleporter', 'Catfish Entrance Rock']), create_cave_region(player, 'Palace of Darkness Hint', 'a storyteller'), create_cave_region(player, 'East Dark World Hint', 'a storyteller'), create_dw_region(player, 'South Dark World', ['Stumpy', 'Digging Game'], ['Dark Lake Hylia Drop (South)', 'Hype Cave', 'Swamp Palace', 'Village of Outcasts Heavy Rock', 'East Dark World Bridge', 'Inverted Links House', 'Archery Game', 'Bonk Fairy (Dark)', 'Dark Lake Hylia Shop', 'South Dark World Teleporter', 'Post Aga Teleporter', 'SDW Flute']), create_cave_region(player, 'Inverted Big Bomb Shop', 'the bomb shop'), create_cave_region(player, 'Archery Game', 'a game of skill'), - create_dw_region(player, 'Dark Lake Hylia', None, ['East Dark World Pier', 'Dark Lake Hylia Ledge Pier', 'Ice Palace', 'Dark Lake Hylia Central Island Teleporter']), + create_dw_region(player, 'Dark Lake Hylia', None, ['East Dark World Pier', 'Dark Lake Hylia Ledge Pier', 'Ice Palace Missing Wall']), + create_dw_region(player, 'Dark Lake Hylia Central Island', None, ['Dark Lake Hylia Shallows', 'Ice Palace', 'Dark Lake Hylia Central Island Teleporter']), create_dw_region(player, 'Dark Lake Hylia Ledge', None, ['Dark Lake Hylia Ledge Drop', 'Dark Lake Hylia Ledge Fairy', 'Dark Lake Hylia Ledge Hint', 'Dark Lake Hylia Ledge Spike Cave', 'DLHL Flute']), create_cave_region(player, 'Dark Lake Hylia Ledge Hint', 'a storyteller'), create_cave_region(player, 'Dark Lake Hylia Ledge Spike Cave', 'a spiky hint'), @@ -193,8 +196,8 @@ def create_inverted_regions(world, player): create_dw_region(player, 'Turtle Rock (Top)', None, ['Dark Death Mountain Teleporter (East)', 'Turtle Rock Drop']), create_dw_region(player, 'Dark Death Mountain Isolated Ledge', None, ['Turtle Rock Isolated Ledge Entrance']), create_dw_region(player, 'Dark Death Mountain (East Bottom)', None, ['Superbunny Cave (Bottom)', 'Cave Shop (Dark Death Mountain)', 'Dark Death Mountain Teleporter (East Bottom)', 'EDDM Flute']), - create_cave_region(player, 'Superbunny Cave', 'a connector', ['Superbunny Cave - Top', 'Superbunny Cave - Bottom'], - ['Superbunny Cave Exit (Top)', 'Superbunny Cave Exit (Bottom)']), + create_cave_region(player, 'Superbunny Cave (Top)', 'a connector', ['Superbunny Cave - Top', 'Superbunny Cave - Bottom'], ['Superbunny Cave Exit (Top)']), + create_cave_region(player, 'Superbunny Cave (Bottom)', 'a connector', None, ['Superbunny Cave Climb', 'Superbunny Cave Exit (Bottom)']), create_cave_region(player, 'Spike Cave', 'Spike Cave', ['Spike Cave']), create_cave_region(player, 'Hookshot Cave', 'a connector', ['Hookshot Cave - Top Right', 'Hookshot Cave - Top Left', 'Hookshot Cave - Bottom Right', 'Hookshot Cave - Bottom Left'], ['Hookshot Cave Exit (South)', 'Hookshot Cave Exit (North)']), @@ -203,10 +206,13 @@ def create_inverted_regions(world, player): create_cave_region(player, 'Pyramid', 'a drop\'s exit', ['Ganon'], ['Ganon Drop']), create_cave_region(player, 'Bottom of Pyramid', 'a drop\'s exit', None, ['Pyramid Exit']), - create_dw_region(player, 'Pyramid Ledge', None, ['Pyramid Drop']), # houlihan room exits here in inverted + create_dw_region(player, 'Pyramid Ledge', None, ['Pyramid Drop']), # houlihan room exits here in inverted # to simplify flute connections - create_cave_region(player, 'The Sky', 'A Dark Sky', None, ['DDM Landing','NEDW Landing', 'WDW Landing', 'SDW Landing', 'EDW Landing', 'DD Landing', 'DLHL Landing']) + create_cave_region(player, 'The Sky', 'A Dark Sky', None, ['DDM Landing','NEDW Landing', 'WDW Landing', 'SDW Landing', 'EDW Landing', 'DD Landing', 'DLHL Landing']), + + create_lw_region(player, 'Desert Northern Cliffs'), + create_lw_region(player, 'Death Mountain Bunny Descent Area') ] diff --git a/ItemList.py b/ItemList.py index ccc10b28..31e3eb55 100644 --- a/ItemList.py +++ b/ItemList.py @@ -641,6 +641,12 @@ def get_pool_core(progressive, shuffle, difficulty, treasure_hunt_total, timer, def want_progressives(): return random.choice([True, False]) if progressive == 'random' else progressive == 'on' + # provide boots to boots glitch dependent modes + if logic in ['owglitches', 'nologic']: + precollected_items.append('Pegasus Boots') + pool.remove('Pegasus Boots') + pool.extend(['Rupees (20)']) + if want_progressives(): pool.extend(progressivegloves) else: diff --git a/Main.py b/Main.py index de0699ac..4ec7882a 100644 --- a/Main.py +++ b/Main.py @@ -335,6 +335,32 @@ def main(args, seed=None, fish=None): return world +def copy_dynamic_regions_and_locations(world, ret): + for region in world.dynamic_regions: + new_reg = Region(region.name, region.type, region.hint_text, region.player) + new_reg.world = ret + ret.regions.append(new_reg) + ret.dynamic_regions.append(new_reg) + + # Note: ideally exits should be copied here, but the current use case (Take anys) do not require this + + if region.shop: + new_reg.shop = Shop(new_reg, region.shop.room_id, region.shop.type, region.shop.shopkeeper_config, region.shop.replaceable) + ret.shops.append(new_reg.shop) + + for location in world.dynamic_locations: + new_reg = ret.get_region(location.parent_region.name, location.parent_region.player) + new_loc = Location(location.player, location.name, location.address, location.crystal, location.hint_text, new_reg) + # todo: this is potentially dangerous. later refactor so we + # can apply dynamic region rules on top of copied world like other rules + new_loc.access_rule = location.access_rule + new_loc.always_allow = location.always_allow + new_loc.item_rule = location.item_rule + new_reg.locations.append(new_loc) + + ret.clear_location_cache() + + def copy_world(world): # ToDo: Not good yet ret = World(world.players, world.shuffle, world.doorShuffle, world.logic, world.mode, world.swords, @@ -382,6 +408,7 @@ def copy_world(world): ret.keydropshuffle = world.keydropshuffle.copy() ret.mixed_travel = world.mixed_travel.copy() ret.standardize_palettes = world.standardize_palettes.copy() + ret.boss_shuffle = world.boss_shuffle for player in range(1, world.players + 1): if world.mode[player] != 'inverted': @@ -429,10 +456,11 @@ def copy_world(world): for location in world.get_locations(): new_location = ret.get_location(location.name, location.player) if location.item is not None: - item = Item(location.item.name, location.item.advancement, location.item.priority, location.item.type, player = location.item.player) + item = Item(location.item.name, location.item.advancement, location.item.priority, location.item.type, player=location.item.player) new_location.item = item item.location = new_location item.world = ret + item.world = ret if location.event: new_location.event = True if location.locked: diff --git a/OverworldGlitchRules.py b/OverworldGlitchRules.py new file mode 100644 index 00000000..385dd84e --- /dev/null +++ b/OverworldGlitchRules.py @@ -0,0 +1,292 @@ +""" +Helper functions to deliver entrance/exit/region sets to OWG rules. +""" + +from BaseClasses import Entrance + + +def get_sword_required_superbunny_mirror_regions(): + """ + Cave regions that superbunny can get through - but only with a sword. + """ + yield 'Spiral Cave (Top)' + +def get_boots_required_superbunny_mirror_regions(): + """ + Cave regions that superbunny can get through - but only with boots. + """ + yield 'Two Brothers House' + +def get_boots_required_superbunny_mirror_locations(): + """ + Cave locations that superbunny can access - but only with boots. + """ + yield 'Sahasrahla\'s Hut - Left' + yield 'Sahasrahla\'s Hut - Middle' + yield 'Sahasrahla\'s Hut - Right' + + +def get_invalid_mirror_bunny_entrances(): + """ + Entrances that can't be superbunny-mirrored into. + """ + yield 'Skull Woods Final Section' + yield 'Hype Cave' + yield 'Bonk Fairy (Dark)' + yield 'Thieves Town' + yield 'Dark World Hammer Peg Cave' + yield 'Brewery' + yield 'Hookshot Cave' + yield 'Dark Lake Hylia Ledge Fairy' + yield 'Dark Lake Hylia Ledge Spike Cave' + yield 'Bonk Rock Cave' + yield 'Bonk Fairy (Light)' + yield '50 Rupee Cave' + yield '20 Rupee Cave' + yield 'Checkerboard Cave' + yield 'Light Hype Fairy' + yield 'Waterfall of Wishing' + yield 'Light World Bomb Hut' + yield 'Mini Moldorm Cave' + yield 'Ice Rod Cave' + yield 'Sanctuary Grave' + yield 'Kings Grave' + + +def get_superbunny_accessible_locations(): + """ + Interior locations that can be accessed with superbunny state. + """ + + yield 'Waterfall of Wishing - Left' + yield 'Waterfall of Wishing - Right' + yield 'King\'s Tomb' + yield 'Floodgate' + yield 'Floodgate Chest' + yield 'Cave 45' + yield 'Bonk Rock Cave' + yield 'Brewery' + yield 'C-Shaped House' + yield 'Chest Game' + yield 'Mire Shed - Left' + yield 'Mire Shed - Right' + yield 'Secret Passage' + yield 'Ice Rod Cave' + yield 'Pyramid Fairy - Left' + yield 'Pyramid Fairy - Right' + yield 'Superbunny Cave - Top' + yield 'Superbunny Cave - Bottom' + yield 'Blind\'s Hideout - Left' + yield 'Blind\'s Hideout - Right' + yield 'Blind\'s Hideout - Far Left' + yield 'Blind\'s Hideout - Far Right' + yield 'Kakariko Well - Left' + yield 'Kakariko Well - Middle' + yield 'Kakariko Well - Right' + yield 'Kakariko Well - Bottom' + yield 'Kakariko Tavern' + yield 'Library' + yield 'Spiral Cave' + for location in get_boots_required_superbunny_mirror_locations(): + yield location + + +def get_non_mandatory_exits(inverted): + """ + Entrances that can be reached with full equipment using overworld glitches and don't need to be an exit. + The following are still be mandatory exits: + + Open: + Turtle Rock Isolated Ledge Entrance + Skull Woods Second Section Door (West) (or Skull Woods Final Section) + + Inverted: + Two Brothers House (West) + Desert Palace Entrance (East) + """ + + yield 'Bumper Cave (Top)' + yield 'Death Mountain Return Cave (West)' + yield 'Hookshot Cave Back Entrance' + + if inverted: + yield 'Desert Palace Entrance (North)' + yield 'Desert Palace Entrance (West)' + yield 'Inverted Ganons Tower' + yield 'Hyrule Castle Entrance (West)' + yield 'Hyrule Castle Entrance (East)' + else: + yield 'Dark Death Mountain Ledge (West)' + yield 'Dark Death Mountain Ledge (East)' + yield 'Mimic Cave' + yield 'Desert Palace Entrance (East)' + + +def get_boots_clip_exits_lw(inverted = False): + """ + Special Light World region exits that require boots clips. + """ + + yield ('Bat Cave River Clip Spot', 'Light World', 'Bat Cave Drop Ledge') + yield ('Light World DMA Clip Spot', 'Light World', 'Death Mountain') + yield ('Hera Ascent', 'Death Mountain', 'Death Mountain (Top)') + yield ('Death Mountain Return Ledge Clip Spot', 'Light World', 'Death Mountain Return Ledge') + yield ('Death Mountain Entrance Clip Spot', 'Light World', 'Death Mountain Entrance') + yield ('Death Mountain Glitched Bridge', 'Death Mountain', 'East Death Mountain (Top)') + yield ('Zora Descent Clip Spot', 'East Death Mountain (Top)', 'Zoras River') + yield ('Desert Northern Cliffs', 'Light World', 'Desert Northern Cliffs') + yield ('Desert Ledge Dropdown', 'Desert Northern Cliffs', 'Desert Ledge') + yield ('Desert Palace Entrance Dropdown', 'Desert Northern Cliffs', 'Desert Palace Entrance (North) Spot') + yield ('Lake Hylia Island Clip Spot', 'Light World', 'Lake Hylia Island') + yield ('Death Mountain Descent', 'Death Mountain', 'Light World') + yield ('Kings Grave Clip Spot', 'Death Mountain', 'Kings Grave Area') + + if not inverted: + yield ('Graveyard Ledge Clip Spot', 'Death Mountain', 'Graveyard Ledge') + yield ('Desert Ledge (Northeast) Dropdown', 'Desert Northern Cliffs', 'Desert Ledge (Northeast)') + yield ('Spectacle Rock Clip Spot', 'Death Mountain (Top)', 'Spectacle Rock') + yield ('Bombos Tablet Clip Spot', 'Light World', 'Bombos Tablet Ledge') + yield ('Floating Island Clip Spot', 'East Death Mountain (Top)', 'Death Mountain Floating Island (Light World)') + yield ('Cave 45 Clip Spot', 'Light World', 'Cave 45 Ledge') + + +def get_boots_clip_exits_dw(inverted): + """ + Special Dark World region exits that require boots clips. + """ + + yield ('Dark World DMA Clip Spot', 'West Dark World', inverted and 'Dark Death Mountain' or 'Dark Death Mountain (West Bottom)') + yield ('Bumper Cave Ledge Clip Spot', 'West Dark World', 'Bumper Cave Ledge') + yield ('Bumper Cave Entrance Clip Spot', 'West Dark World', 'Bumper Cave Entrance') + yield ('Catfish Descent', inverted and 'Dark Death Mountain' or 'Dark Death Mountain (Top)', 'Catfish') + yield ('Hammer Pegs River Clip Spot', 'East Dark World', 'Hammer Peg Area') + yield ('Dark Lake Hylia Ledge Clip Spot', 'East Dark World', 'Dark Lake Hylia Ledge') + yield ('Dark Desert Cliffs Clip Spot', 'South Dark World', 'Dark Desert') + yield ('DW Floating Island Clip Spot', 'Dark Death Mountain (East Bottom)', 'Death Mountain Floating Island (Dark World)') + + if not inverted: + yield ('Dark Death Mountain Descent', 'Dark Death Mountain (West Bottom)', 'West Dark World') + yield ('Ganons Tower Ascent', 'Dark Death Mountain (West Bottom)', 'Dark Death Mountain (Top)') # This only gets you to the GT entrance + yield ('Dark Death Mountain Glitched Bridge', 'Dark Death Mountain (West Bottom)', 'Dark Death Mountain (Top)') + yield ('Turtle Rock (Top) Clip Spot', 'Dark Death Mountain (Top)', 'Turtle Rock (Top)') + else: + yield ('Dark Desert Teleporter Clip Spot', 'Dark Desert', 'Dark Desert Ledge') + + +def get_glitched_speed_drops_dw(inverted = False): + """ + Dark World drop-down ledges that require glitched speed. + """ + yield ('Dark Death Mountain Ledge Clip Spot', inverted and 'Dark Death Mountain' or 'Dark Death Mountain (Top)', 'Dark Death Mountain Ledge') + + +def get_mirror_clip_spots_dw(): + """ + Out of bounds transitions using the mirror + """ + yield ('Dark Death Mountain Bunny Descent Mirror Spot', 'Dark Death Mountain (West Bottom)', 'Dark Death Mountain Bunny Descent Area') + yield ('West Dark World Bunny Descent', 'Dark Death Mountain Bunny Descent Area', 'West Dark World') + yield ('Dark Death Mountain (East Bottom) Jump', 'Dark Death Mountain Bunny Descent Area', 'Dark Death Mountain (East Bottom)') + yield ('Desert East Mirror Clip', 'Dark Desert', 'Desert Palace Lone Stairs') + + +def get_mirror_offset_spots_dw(): + """ + Mirror shenanigans placing a mirror portal with a broken camera + """ + yield ('Dark Death Mountain Offset Mirror', 'Dark Death Mountain (West Bottom)', 'East Dark World') + + +def get_mirror_offset_spots_lw(player): + """ + Mirror shenanigans placing a mirror portal with a broken camera + """ + yield ('Death Mountain Offset Mirror', 'Death Mountain', 'Light World') + yield ('Death Mountain Offset Mirror (Houlihan Exit)', 'Death Mountain', 'Hyrule Castle Ledge', lambda state: state.has_Mirror(player) and state.can_boots_clip_dw(player) and state.has_Pearl(player)) + + + +def get_invalid_bunny_revival_dungeons(): + """ + Dungeon regions that can't be bunny revived from without superbunny state. + """ + yield 'Tower of Hera (Bottom)' + yield 'Swamp Palace (Entrance)' + yield 'Turtle Rock (Entrance)' + yield 'Sanctuary' + + +def no_logic_rules(world, player): + """ + Add OWG transitions to no logic player's world + """ + create_no_logic_connections(player, world, get_boots_clip_exits_lw(world.mode == 'inverted')) + create_no_logic_connections(player, world, get_boots_clip_exits_dw(world.mode == 'inverted')) + + # Glitched speed drops. + create_no_logic_connections(player, world, get_glitched_speed_drops_dw(world.mode == 'inverted')) + + # Mirror clip spots. + if world.mode != 'inverted': + create_no_logic_connections(player, world, get_mirror_clip_spots_dw()) + create_no_logic_connections(player, world, get_mirror_offset_spots_dw()) + else: + create_no_logic_connections(player, world, get_mirror_offset_spots_lw(player)) + + +def overworld_glitches_rules(world, player): + + # Boots-accessible locations. + create_owg_connections(player, world, get_boots_clip_exits_lw(world.mode == 'inverted'), lambda state: state.can_boots_clip_lw(player)) + create_owg_connections(player, world, get_boots_clip_exits_dw(world.mode == 'inverted'), lambda state: state.can_boots_clip_dw(player)) + + # Glitched speed drops. + create_owg_connections(player, world, get_glitched_speed_drops_dw(world.mode == 'inverted'), lambda state: state.can_get_glitched_speed_dw(player)) + # Dark Death Mountain Ledge Clip Spot also accessible with mirror. + if world.mode != 'inverted': + add_alternate_rule(world.get_entrance('Dark Death Mountain Ledge Clip Spot', player), lambda state: state.has_Mirror(player)) + + # Mirror clip spots. + if world.mode != 'inverted': + create_owg_connections(player, world, get_mirror_clip_spots_dw(), lambda state: state.has_Mirror(player)) + create_owg_connections(player, world, get_mirror_offset_spots_dw(), lambda state: state.has_Mirror(player) and state.can_boots_clip_lw(player)) + else: + create_owg_connections(player, world, get_mirror_offset_spots_lw(player), lambda state: state.has_Mirror(player) and state.can_boots_clip_dw(player)) + + # Regions that require the boots and some other stuff. + if world.mode != 'inverted': + world.get_entrance('Turtle Rock Teleporter', player).access_rule = lambda state: (state.can_boots_clip_lw(player) or state.can_lift_heavy_rocks(player)) and state.has('Hammer', player) + add_alternate_rule(world.get_entrance('Waterfall of Wishing', player), lambda state: state.has('Moon Pearl', player) or state.has_Boots(player)) + else: + add_alternate_rule(world.get_entrance('Waterfall of Wishing Cave', player), lambda state: state.has('Moon Pearl', player)) + + world.get_entrance('Dark Desert Teleporter', player).access_rule = lambda state: (state.can_flute(player) or state.has_Boots(player)) and state.can_lift_heavy_rocks(player) + add_alternate_rule(world.get_entrance('Catfish Exit Rock', player), lambda state: state.can_boots_clip_dw(player)) + add_alternate_rule(world.get_entrance('East Dark World Broken Bridge Pass', player), lambda state: state.can_boots_clip_dw(player)) + + # Zora's Ledge via waterwalk setup. + add_alternate_rule(world.get_location('Zora\'s Ledge', player), lambda state: state.has_Boots(player)) + + +def add_alternate_rule(entrance, rule): + old_rule = entrance.access_rule + entrance.access_rule = lambda state: old_rule(state) or rule(state) + + +def create_no_logic_connections(player, world, connections): + for entrance, parent_region, target_region, *rule_override in connections: + parent = world.get_region(parent_region, player) + target = world.get_region(target_region, player) + connection = Entrance(player, entrance, parent) + parent.exits.append(connection) + connection.connect(target) + +def create_owg_connections(player, world, connections, default_rule): + for entrance, parent_region, target_region, *rule_override in connections: + parent = world.get_region(parent_region, player) + target = world.get_region(target_region, player) + connection = Entrance(player, entrance, parent) + parent.exits.append(connection) + connection.connect(target) + rule = rule_override[0] if len(rule_override) > 0 else default_rule + connection.access_rule = rule diff --git a/Regions.py b/Regions.py index cbbc8cb1..f96536fe 100644 --- a/Regions.py +++ b/Regions.py @@ -136,13 +136,16 @@ def create_regions(world, player): create_lw_region(player, 'Death Mountain (Top)', ['Ether Tablet'], ['East Death Mountain (Top)', 'Tower of Hera', 'Death Mountain Drop']), create_lw_region(player, 'Spectacle Rock', ['Spectacle Rock'], ['Spectacle Rock Drop']), - create_dw_region(player, 'East Dark World', ['Pyramid'], ['Pyramid Fairy', 'South Dark World Bridge', 'Palace of Darkness', 'Dark Lake Hylia Drop (East)', 'Dark Lake Hylia Teleporter', - 'Hyrule Castle Ledge Mirror Spot', 'Dark Lake Hylia Fairy', 'Palace of Darkness Hint', 'East Dark World Hint', 'Pyramid Hole', 'Northeast Dark World Broken Bridge Pass']), - create_dw_region(player, 'Northeast Dark World', ['Catfish'], ['West Dark World Gap', 'Dark World Potion Shop', 'East Dark World Broken Bridge Pass']), + create_dw_region(player, 'East Dark World', ['Pyramid'], ['Pyramid Fairy', 'South Dark World Bridge', 'Palace of Darkness', 'Dark Lake Hylia Drop (East)', + 'Hyrule Castle Ledge Mirror Spot', 'Dark Lake Hylia Fairy', 'Palace of Darkness Hint', 'East Dark World Hint', 'Pyramid Hole', 'Northeast Dark World Broken Bridge Pass',]), + create_dw_region(player, 'Catfish', ['Catfish'], ['Catfish Exit Rock']), + create_dw_region(player, 'Northeast Dark World', None, ['West Dark World Gap', 'Dark World Potion Shop', 'East Dark World Broken Bridge Pass', 'Catfish Entrance Rock', 'Dark Lake Hylia Teleporter']), create_cave_region(player, 'Palace of Darkness Hint', 'a storyteller'), create_cave_region(player, 'East Dark World Hint', 'a storyteller'), - create_dw_region(player, 'South Dark World', ['Stumpy', 'Digging Game', 'Bombos Tablet'], ['Dark Lake Hylia Drop (South)', 'Hype Cave', 'Swamp Palace', 'Village of Outcasts Heavy Rock', 'Maze Race Mirror Spot', - 'Cave 45 Mirror Spot', 'East Dark World Bridge', 'Big Bomb Shop', 'Archery Game', 'Bonk Fairy (Dark)', 'Dark Lake Hylia Shop']), + create_dw_region(player, 'South Dark World', ['Stumpy', 'Digging Game'], ['Dark Lake Hylia Drop (South)', 'Hype Cave', 'Swamp Palace', 'Village of Outcasts Heavy Rock', 'Maze Race Mirror Spot', + 'Cave 45 Mirror Spot', 'East Dark World Bridge', 'Big Bomb Shop', 'Archery Game', 'Bonk Fairy (Dark)', 'Dark Lake Hylia Shop', + 'Bombos Tablet Mirror Spot']), + create_lw_region(player, 'Bombos Tablet Ledge', ['Bombos Tablet']), create_cave_region(player, 'Big Bomb Shop', 'the bomb shop'), create_cave_region(player, 'Archery Game', 'a game of skill'), create_dw_region(player, 'Dark Lake Hylia', None, ['Lake Hylia Island Mirror Spot', 'East Dark World Pier', 'Dark Lake Hylia Ledge']), @@ -184,8 +187,8 @@ def create_regions(world, player): create_dw_region(player, 'Dark Death Mountain Ledge', None, ['Dark Death Mountain Ledge (East)', 'Dark Death Mountain Ledge (West)', 'Mimic Cave Mirror Spot', 'Spiral Cave Mirror Spot']), create_dw_region(player, 'Dark Death Mountain Isolated Ledge', None, ['Isolated Ledge Mirror Spot', 'Turtle Rock Isolated Ledge Entrance']), create_dw_region(player, 'Dark Death Mountain (East Bottom)', None, ['Superbunny Cave (Bottom)', 'Cave Shop (Dark Death Mountain)', 'Fairy Ascension Mirror Spot']), - create_cave_region(player, 'Superbunny Cave', 'a connector', ['Superbunny Cave - Top', 'Superbunny Cave - Bottom'], - ['Superbunny Cave Exit (Top)', 'Superbunny Cave Exit (Bottom)']), + create_cave_region(player, 'Superbunny Cave (Top)', 'a connector', ['Superbunny Cave - Top', 'Superbunny Cave - Bottom'], ['Superbunny Cave Exit (Top)']), + create_cave_region(player, 'Superbunny Cave (Bottom)', 'a connector', None, ['Superbunny Cave Climb', 'Superbunny Cave Exit (Bottom)']), create_cave_region(player, 'Spike Cave', 'Spike Cave', ['Spike Cave']), create_cave_region(player, 'Hookshot Cave', 'a connector', ['Hookshot Cave - Top Right', 'Hookshot Cave - Top Left', 'Hookshot Cave - Bottom Right', 'Hookshot Cave - Bottom Left'], ['Hookshot Cave Exit (South)', 'Hookshot Cave Exit (North)']), @@ -198,6 +201,8 @@ def create_regions(world, player): create_cave_region(player, 'Pyramid', 'a drop\'s exit', ['Ganon'], ['Ganon Drop']), create_cave_region(player, 'Bottom of Pyramid', 'a drop\'s exit', None, ['Pyramid Exit']), create_dw_region(player, 'Pyramid Ledge', None, ['Pyramid Entrance', 'Pyramid Drop']), + create_lw_region(player, 'Desert Northern Cliffs'), + create_dw_region(player, 'Dark Death Mountain Bunny Descent Area') ] diff --git a/Rom.py b/Rom.py index 392efbb7..1f4a777f 100644 --- a/Rom.py +++ b/Rom.py @@ -1131,7 +1131,7 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False): rom.write_byte(0x180211, gametype) # Game type # assorted fixes - rom.write_byte(0x1800A2, 0x01) # remain in real dark world when dying in dark world dungeon before killing aga1 + rom.write_byte(0x1800A2, 0x01 if world.fix_fake_world else 0x00) # remain in real dark world when dying in dark world dungeon before killing aga1 rom.write_byte(0x180169, 0x01 if world.lock_aga_door_in_escape else 0x00) # Lock or unlock aga tower door during escape sequence. if world.mode[player] == 'inverted': rom.write_byte(0x180169, 0x02) # lock aga/ganon tower door with crystals in inverted @@ -1291,6 +1291,9 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False): if item.name != 'Piece of Heart' or equip[0x36B] == 0: equip[0x36C] = min(equip[0x36C] + 0x08, 0xA0) equip[0x36D] = min(equip[0x36D] + 0x08, 0xA0) + elif item.name == 'Pegasus Boots': + rom.write_byte(0x183015, 0x01) + ability_flags |= 0b00000100 else: raise RuntimeError(f'Unsupported item in starting equipment: {item.name}') diff --git a/Rules.py b/Rules.py index 50b1f896..3c66074d 100644 --- a/Rules.py +++ b/Rules.py @@ -1,14 +1,17 @@ import logging from collections import deque +import OverworldGlitchRules from BaseClasses import CollectionState, RegionType, DoorType, Entrance, CrystalBarrier from RoomData import DoorKind +from OverworldGlitchRules import overworld_glitches_rules, no_logic_rules def set_rules(world, player): if world.logic[player] == 'nologic': logging.getLogger('').info('WARNING! Seeds generated under this logic often require major glitches and may be impossible!') + no_logic_rules(world, player) world.get_region('Menu', player).can_reach_private = lambda state: True for exit in world.get_region('Menu', player).exits: exit.hide_path = True @@ -32,6 +35,13 @@ def set_rules(world, player): no_glitches_rules(world, player) elif world.logic[player] == 'minorglitches': logging.getLogger('').info('Minor Glitches may be buggy still. No guarantee for proper logic checks.') + elif world.logic == 'owglitches': + logging.getLogger('').info('There is a chance OWG has bugged edge case rulesets, especially in inverted. Definitely file a report on GitHub if you see anything strange.') + # Initially setting no_glitches_rules to set the baseline rules for some + # entrances. The overworld_glitches_rules set is primarily additive. + no_glitches_rules(world, player) + fake_flipper_rules(world, player) + overworld_glitches_rules(world, player) else: raise NotImplementedError('Not implemented yet') @@ -46,6 +56,9 @@ def set_rules(world, player): if world.mode[player] != 'inverted': set_big_bomb_rules(world, player) + if world.logic == 'owglitches' and world.shuffle not in ('insanity', 'insanity_legacy'): + path_to_courtyard = mirrorless_path_to_castle_courtyard(world, player) + add_rule(world.get_entrance('Pyramid Fairy', player), lambda state: state.world.get_entrance('Dark Death Mountain Offset Mirror', player).can_reach(state) and all(rule(state) for rule in path_to_courtyard), 'or') else: set_inverted_big_bomb_rules(world, player) @@ -58,6 +71,32 @@ def set_rules(world, player): else: set_inverted_bunny_rules(world, player) + set_trock_key_rules(world, player) + + set_rule(ganons_tower, lambda state: state.has_crystals(world.crystals_needed_for_gt, player)) + if world.mode != 'inverted' and world.logic == 'owglitches': + add_rule(world.get_entrance('Ganons Tower', player), lambda state: state.world.get_entrance('Ganons Tower Ascent', player).can_reach(state), 'or') + + set_bunny_rules(world, player, world.mode == 'inverted') + + +def mirrorless_path_to_castle_courtyard(world, player): + # If Agahnim is defeated then the courtyard needs to be accessible without using the mirror for the mirror offset glitch. + # Only considering the secret passage for now (in non-insanity shuffle). Basically, if it's Ganon you need the master sword. + start = world.get_entrance('Hyrule Castle Secret Entrance Drop', player) + target = world.get_region('Hyrule Castle Courtyard', player) + seen = {start.parent_region, start.connected_region} + queue = collections.deque([(start.connected_region, [])]) + while queue: + (current, path) = queue.popleft() + for entrance in current.exits: + if entrance.connected_region not in seen: + new_path = path + [entrance.access_rule] + if entrance.connected_region == target: + return new_path + else: + queue.append((entrance.connected_region, new_path)) + def set_rule(spot, rule): spot.access_rule = rule @@ -448,7 +487,8 @@ def default_rules(world, player): set_rule(world.get_entrance('Turtle Rock Teleporter', player), lambda state: state.can_lift_heavy_rocks(player) and state.has('Hammer', player)) set_rule(world.get_entrance('East Death Mountain (Top)', player), lambda state: state.has('Hammer', player)) - set_rule(world.get_location('Catfish', player), lambda state: state.can_lift_rocks(player)) + set_rule(world.get_entrance('Catfish Exit Rock', player), lambda state: state.can_lift_rocks(player)) + set_rule(world.get_entrance('Catfish Entrance Rock', player), lambda state: state.can_lift_rocks(player)) set_rule(world.get_entrance('Northeast Dark World Broken Bridge Pass', player), lambda state: state.has_Pearl(player) and (state.can_lift_rocks(player) or state.has('Hammer', player) or state.has('Flippers', player))) set_rule(world.get_entrance('East Dark World Broken Bridge Pass', player), lambda state: state.has_Pearl(player) and (state.can_lift_rocks(player) or state.has('Hammer', player))) set_rule(world.get_entrance('South Dark World Bridge', player), lambda state: state.has('Hammer', player) and state.has_Pearl(player)) @@ -458,7 +498,7 @@ def default_rules(world, player): set_rule(world.get_entrance('Hyrule Castle Ledge Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Hyrule Castle Main Gate', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Dark Lake Hylia Drop (East)', player), lambda state: (state.has_Pearl(player) and state.has('Flippers', player) or state.has_Mirror(player))) # Overworld Bunny Revival - set_rule(world.get_location('Bombos Tablet', player), lambda state: state.has('Book of Mudora', player) and state.has_beam_sword(player) and state.has_Mirror(player)) + set_rule(world.get_location('Bombos Tablet', player), lambda state: state.has('Book of Mudora', player) and state.has_beam_sword(player)) set_rule(world.get_entrance('Dark Lake Hylia Drop (South)', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) # ToDo any fake flipper set up? set_rule(world.get_entrance('Dark Lake Hylia Ledge Fairy', player), lambda state: state.has_Pearl(player)) # bomb required set_rule(world.get_entrance('Dark Lake Hylia Ledge Spike Cave', player), lambda state: state.can_lift_rocks(player) and state.has_Pearl(player)) @@ -471,6 +511,7 @@ def default_rules(world, player): set_rule(world.get_entrance('Skull Woods Second Section Hole', player), lambda state: state.has_Pearl(player)) # bunny cannot lift bush set_rule(world.get_entrance('Maze Race Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Cave 45 Mirror Spot', player), lambda state: state.has_Mirror(player)) + set_rule(world.get_entrance('Bombos Tablet Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('East Dark World Bridge', player), lambda state: state.has_Pearl(player) and state.has('Hammer', player)) set_rule(world.get_entrance('Lake Hylia Island Mirror Spot', player), lambda state: state.has_Pearl(player) and state.has_Mirror(player) and state.has('Flippers', player)) set_rule(world.get_entrance('Lake Hylia Central Island Mirror Spot', player), lambda state: state.has_Mirror(player)) @@ -502,13 +543,10 @@ def default_rules(world, player): set_rule(world.get_entrance('Spiral Cave Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Fairy Ascension Mirror Spot', player), lambda state: state.has_Mirror(player) and state.has_Pearl(player)) # need to lift flowers set_rule(world.get_entrance('Isolated Ledge Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Superbunny Cave Exit (Bottom)', player), lambda state: False) # Cannot get to bottom exit from top. Just exists for shuffling set_rule(world.get_entrance('Floating Island Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Turtle Rock', player), lambda state: state.has_Pearl(player) and state.has_sword(player) and state.has_turtle_rock_medallion(player) and state.can_reach('Turtle Rock (Top)', 'Region', player)) # sword required to cast magic (!) set_rule(world.get_entrance('Pyramid Hole', player), lambda state: state.has('Beat Agahnim 2', player) or world.open_pyramid[player]) - set_rule(world.get_entrance('Ganons Tower', player), lambda state: False) # This is a safety for the TR function below to not require GT entrance in its key logic. - if world.swords[player] == 'swordless': swordless_rules(world, player) @@ -523,10 +561,11 @@ def inverted_rules(world, player): set_rule(world.get_location('Ice Rod Cave', player), lambda state: state.has_Pearl(player)) set_rule(world.get_location('Maze Race', player), lambda state: state.has_Pearl(player)) set_rule(world.get_entrance('Mini Moldorm Cave', player), lambda state: state.has_Pearl(player)) + set_rule(world.get_entrance('Ice Rod Cave', player), lambda state: state.has_Pearl(player)) set_rule(world.get_entrance('Light Hype Fairy', player), lambda state: state.has_Pearl(player)) set_rule(world.get_entrance('Potion Shop Pier', player), lambda state: state.has('Flippers', player) and state.has_Pearl(player)) set_rule(world.get_entrance('Light World Pier', player), lambda state: state.has('Flippers', player) and state.has_Pearl(player)) - set_rule(world.get_entrance('Kings Grave', player), lambda state: state.has_Boots(player) and state.can_lift_heavy_rocks(player) and state.has_Pearl(player)) + set_rule(world.get_entrance('Kings Grave', player), lambda state: state.has_Boots(player) and state.has_Pearl(player)) set_rule(world.get_entrance('Kings Grave Outer Rocks', player), lambda state: state.can_lift_heavy_rocks(player) and state.has_Pearl(player)) set_rule(world.get_entrance('Kings Grave Inner Rocks', player), lambda state: state.can_lift_heavy_rocks(player) and state.has_Pearl(player)) set_rule(world.get_entrance('Potion Shop Inner Bushes', player), lambda state: state.has_Pearl(player)) @@ -537,7 +576,6 @@ def inverted_rules(world, player): set_rule(world.get_entrance('Graveyard Cave Outer Bushes', player), lambda state: state.has_Pearl(player)) set_rule(world.get_entrance('Secret Passage Inner Bushes', player), lambda state: state.has_Pearl(player)) set_rule(world.get_entrance('Secret Passage Outer Bushes', player), lambda state: state.has_Pearl(player)) - # Caution: If king's grave is releaxed at all to account for reaching it via a two way cave's exit in insanity mode, then the bomb shop logic will need to be updated (that would involve create a small ledge-like Region for it) set_rule(world.get_entrance('Bonk Fairy (Light)', player), lambda state: state.has_Boots(player) and state.has_Pearl(player)) set_rule(world.get_entrance('Bat Cave Drop Ledge', player), lambda state: state.has('Hammer', player) and state.has_Pearl(player)) set_rule(world.get_entrance('Lumberjack Tree Tree', player), lambda state: state.has_Boots(player) and state.has_Pearl(player) and state.has('Beat Agahnim 1', player)) @@ -557,7 +595,8 @@ def inverted_rules(world, player): set_rule(world.get_location('Flute Spot', player), lambda state: state.has('Shovel', player) and state.has_Pearl(player)) set_rule(world.get_location('Zora\'s Ledge', player), lambda state: state.has('Flippers', player) and state.has_Pearl(player)) - set_rule(world.get_entrance('Waterfall of Wishing', player), lambda state: state.has('Flippers', player) and state.has_Pearl(player)) # can be fake flippered into, but is in weird state inside that might prevent you from doing things. Can be improved in future Todo + set_rule(world.get_entrance('Waterfall of Wishing Cave', player), lambda state: state.has('Flippers', player) and state.has_Pearl(player)) + set_rule(world.get_entrance('Northeast Light World Return', player), lambda state: state.has('Flippers', player) and state.has_Pearl(player)) set_rule(world.get_location('Frog', player), lambda state: state.can_lift_heavy_rocks(player) and (state.has_Pearl(player) or state.has('Beat Agahnim 1', player)) or (state.can_reach('Light World', 'Region', player) and state.has_Mirror(player))) # Need LW access using Mirror or Portal @@ -567,6 +606,7 @@ def inverted_rules(world, player): set_rule(world.get_entrance('Bush Covered Lawn Outer Bushes', player), lambda state: state.has_Pearl(player)) set_rule(world.get_entrance('Bomb Hut Inner Bushes', player), lambda state: state.has_Pearl(player)) set_rule(world.get_entrance('Bomb Hut Outer Bushes', player), lambda state: state.has_Pearl(player)) + set_rule(world.get_entrance('Light World Bomb Hut', player), lambda state: state.has_Pearl(player)) # need bomb set_rule(world.get_entrance('North Fairy Cave Drop', player), lambda state: state.has_Pearl(player)) set_rule(world.get_entrance('Lost Woods Hideout Drop', player), lambda state: state.has_Pearl(player)) set_rule(world.get_location('Potion Shop', player), lambda state: state.has('Mushroom', player) and (state.can_reach('Potion Shop Area', 'Region', player))) # new inverted region, need pearl for bushes or access to potion shop door/waterfall fairy @@ -584,7 +624,7 @@ def inverted_rules(world, player): set_rule(world.get_entrance('Dark Death Mountain Teleporter (East)', player), lambda state: state.can_lift_heavy_rocks(player) and state.has('Hammer', player) and state.has_Pearl(player)) # bunny cannot use hammer set_rule(world.get_entrance('East Death Mountain (Top)', player), lambda state: state.has('Hammer', player) and state.has_Pearl(player)) # bunny can not use hammer - set_rule(world.get_location('Catfish', player), lambda state: state.can_lift_rocks(player) or (state.has('Flippers', player) and state.has_Mirror(player) and state.has_Pearl(player) and state.can_reach('Light World', 'Region', player))) + set_rule(world.get_entrance('Catfish Entrance Rock', player), lambda state: state.can_lift_rocks(player)) set_rule(world.get_entrance('Northeast Dark World Broken Bridge Pass', player), lambda state: ((state.can_lift_rocks(player) or state.has('Hammer', player)) or state.has('Flippers', player))) set_rule(world.get_entrance('East Dark World Broken Bridge Pass', player), lambda state: (state.can_lift_rocks(player) or state.has('Hammer', player))) set_rule(world.get_entrance('South Dark World Bridge', player), lambda state: state.has('Hammer', player)) @@ -595,7 +635,8 @@ def inverted_rules(world, player): set_rule(world.get_entrance('Dark Lake Hylia Drop (South)', player), lambda state: state.has('Flippers', player)) # ToDo any fake flipper set up? set_rule(world.get_entrance('Dark Lake Hylia Ledge Pier', player), lambda state: state.has('Flippers', player)) set_rule(world.get_entrance('Dark Lake Hylia Ledge Spike Cave', player), lambda state: state.can_lift_rocks(player)) - set_rule(world.get_entrance('Dark Lake Hylia Teleporter', player), lambda state: state.has('Flippers', player) and (state.has('Hammer', player) or state.can_lift_rocks(player))) # Fake Flippers + set_rule(world.get_entrance('Dark Lake Hylia Teleporter', player), lambda state: state.has('Flippers', player)) # Fake Flippers + set_rule(world.get_entrance('Dark Lake Hylia Shallows', player), lambda state: state.has('Flippers', player)) set_rule(world.get_entrance('Village of Outcasts Heavy Rock', player), lambda state: state.can_lift_heavy_rocks(player)) set_rule(world.get_entrance('East Dark World Bridge', player), lambda state: state.has('Hammer', player)) set_rule(world.get_entrance('Lake Hylia Central Island Mirror Spot', player), lambda state: state.has_Mirror(player)) @@ -622,7 +663,6 @@ def inverted_rules(world, player): set_rule(world.get_entrance('Dark Death Mountain Ledge Mirror Spot (East)', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Dark Death Mountain Ledge Mirror Spot (West)', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Laser Bridge Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Superbunny Cave Exit (Bottom)', player), lambda state: False) # Cannot get to bottom exit from top. Just exists for shuffling set_rule(world.get_entrance('Floating Island Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Turtle Rock', player), lambda state: state.has_sword(player) and state.has_turtle_rock_medallion(player) and state.can_reach('Turtle Rock (Top)', 'Region', player)) # sword required to cast magic (!) @@ -634,7 +674,7 @@ def inverted_rules(world, player): set_rule(world.get_entrance('East Dark World Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('West Dark World Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('South Dark World Mirror Spot', player), lambda state: state.has_Mirror(player)) - set_rule(world.get_entrance('Northeast Dark World Mirror Spot', player), lambda state: state.has_Mirror(player)) + set_rule(world.get_entrance('Catfish Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Potion Shop Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Shopping Mall Mirror Spot', player), lambda state: state.has_Mirror(player)) set_rule(world.get_entrance('Maze Race Mirror Spot', player), lambda state: state.has_Mirror(player)) @@ -658,8 +698,6 @@ def inverted_rules(world, player): set_rule(world.get_entrance('Hammer Peg Area Flute', player), lambda state: state.can_flute(player)) set_rule(world.get_entrance('Inverted Pyramid Hole', player), lambda state: state.has('Beat Agahnim 2', player) or world.open_pyramid[player]) - set_rule(world.get_entrance('Inverted Ganons Tower', player), lambda state: False) # This is a safety for the TR function below to not require GT entrance in its key logic. - if world.swords[player] == 'swordless': swordless_rules(world, player) @@ -694,19 +732,49 @@ def no_glitches_rules(world, player): # for location in DMs_room_chests: # add_rule(world.get_location(location, player), lambda state: state.has('Hookshot', player)) set_rule(world.get_entrance('Paradox Cave Push Block Reverse', player), lambda state: False) # no glitches does not require block override + forbid_bomb_jump_requirements(world, player) + add_conditional_lamps(world, player) + + +def fake_flipper_rules(world, player): + if world.mode != 'inverted': + set_rule(world.get_entrance('Zoras River', player), lambda state: True) + set_rule(world.get_entrance('Lake Hylia Central Island Pier', player), lambda state: True) + set_rule(world.get_entrance('Hobo Bridge', player), lambda state: True) + set_rule(world.get_entrance('Dark Lake Hylia Drop (East)', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) + set_rule(world.get_entrance('Dark Lake Hylia Teleporter', player), lambda state: state.has_Pearl(player)) + set_rule(world.get_entrance('Dark Lake Hylia Ledge Drop', player), lambda state: state.has_Pearl(player)) + else: + set_rule(world.get_entrance('Zoras River', player), lambda state: state.has_Pearl(player)) + set_rule(world.get_entrance('Lake Hylia Central Island Pier', player), lambda state: state.has_Pearl(player)) + set_rule(world.get_entrance('Lake Hylia Island Pier', player), lambda state: state.has_Pearl(player)) + set_rule(world.get_entrance('Lake Hylia Warp', player), lambda state: state.has_Pearl(player)) + set_rule(world.get_entrance('Northeast Light World Warp', player), lambda state: state.has_Pearl(player)) + set_rule(world.get_entrance('Hobo Bridge', player), lambda state: state.has_Pearl(player)) + set_rule(world.get_entrance('Dark Lake Hylia Drop (East)', player), lambda state: state.has('Flippers', player)) + set_rule(world.get_entrance('Dark Lake Hylia Teleporter', player), lambda state: True) + set_rule(world.get_entrance('Dark Lake Hylia Ledge Drop', player), lambda state: True) + set_rule(world.get_entrance('East Dark World Pier', player), lambda state: True) + + +def forbid_bomb_jump_requirements(world, player): + DMs_room_chests = ['Ganons Tower - DMs Room - Top Left', 'Ganons Tower - DMs Room - Top Right', 'Ganons Tower - DMs Room - Bottom Left', 'Ganons Tower - DMs Room - Bottom Right'] + for location in DMs_room_chests: + add_rule(world.get_location(location, player), lambda state: state.has('Hookshot', player)) set_rule(world.get_entrance('Paradox Cave Bomb Jump', player), lambda state: False) - # Light cones in standard depend on which world we actually are in, not which one the location would normally be - # We add Lamp requirements only to those locations which lie in the dark world (or everything if open - DW_Entrances = ['Bumper Cave (Bottom)', 'Superbunny Cave (Top)', 'Superbunny Cave (Bottom)', 'Hookshot Cave', 'Bumper Cave (Top)', 'Hookshot Cave Back Entrance', 'Dark Death Mountain Ledge (East)', - 'Turtle Rock Isolated Ledge Entrance', 'Thieves Town', 'Skull Woods Final Section', 'Ice Palace', 'Misery Mire', 'Palace of Darkness', 'Swamp Palace', 'Turtle Rock', 'Dark Death Mountain Ledge (West)'] +# Light cones in standard depend on which world we actually are in, not which one the location would normally be +# We add Lamp requirements only to those locations which lie in the dark world (or everything if open +DW_Entrances = ['Bumper Cave (Bottom)', 'Superbunny Cave (Top)', 'Superbunny Cave (Bottom)', 'Hookshot Cave', 'Bumper Cave (Top)', 'Hookshot Cave Back Entrance', 'Dark Death Mountain Ledge (East)', + 'Turtle Rock Isolated Ledge Entrance', 'Thieves Town', 'Skull Woods Final Section', 'Ice Palace', 'Misery Mire', 'Palace of Darkness', 'Swamp Palace', 'Turtle Rock', 'Dark Death Mountain Ledge (West)'] - def check_is_dark_world(region): - for entrance in region.entrances: - if entrance.name in DW_Entrances: - return True - return False +def check_is_dark_world(region): + for entrance in region.entrances: + if entrance.name in DW_Entrances: + return True + return False +def add_conditional_lamps(world, player): def add_conditional_lamp(spot, region, spottype='Location'): if spottype == 'Location': spot = world.get_location(spot, player) @@ -1361,6 +1429,9 @@ def set_inverted_big_bomb_rules(world, player): elif bombshop_entrance.name == 'Capacity Upgrade': # You must Mirror but then can use either Ice Palace return path. add_rule(world.get_entrance('Pyramid Fairy', player), lambda state: (state.has('Flippers', player) or state.can_flute(player)) and state.has_Mirror(player)) + elif bombshop_entrance.name == 'Two Brothers House (West)': + # First you must Mirror. Then you can either Flute, cross the peg bridge, or use the Agah 1 portal to Mirror again. + add_rule(world.get_entrance('Pyramid Fairy', player), lambda state: (state.can_flute(player) or state.has('Hammer', player) or state.has('Beat Agahnim 1', player)) and state.has_Mirror(player)) elif bombshop_entrance.name in LW_inaccessible_entrances: # You can't get to the pyramid from these entrances without bomb duping. raise Exception('No valid path to open Pyramid Fairy. (Could not route from %s)' % bombshop_entrance.name) @@ -1371,7 +1442,7 @@ def set_inverted_big_bomb_rules(world, player): raise Exception('No logic found for routing from %s to the pyramid.' % bombshop_entrance.name) -def set_bunny_rules(world, player): +def set_bunny_rules(world, player, inverted): # regions for the exits of multi-entrace caves/drops that bunny cannot pass # Note spiral cave may be technically passible, but it would be too absurd to require since OHKO mode is a thing. @@ -1381,90 +1452,7 @@ def set_bunny_rules(world, player): 'Checkerboard Cave', 'Potion Shop', 'Spectacle Rock Cave', 'Pyramid', 'Hype Cave - Generous Guy', 'Peg Cave', 'Bumper Cave Ledge', 'Dark Blacksmith Ruins'] - def path_to_access_rule(path, entrance): - return lambda state: state.can_reach(entrance) and all(rule_func(state) for rule_func in path) - - def options_to_access_rule(options): - return lambda state: any(rule_func(state) for rule_func in options) - - def get_rule_to_add(start_region): - if not start_region.is_light_world: - return lambda state: state.has_Pearl(player) - # in this case we are mixed region. - # we collect possible options. - - # The base option is having the moon pearl - possible_options = [lambda state: state.has_Pearl(player)] - - # We will search entrances recursively until we find - # one that leads to an exclusively light world region - # for each such entrance a new option is added that consist of: - # a) being able to reach it, and - # b) being able to access all entrances from there to `region` - seen = {start_region} - queue = deque([(start_region, [])]) - while queue: - (current, path) = queue.popleft() - for entrance in current.entrances: - new_region = entrance.parent_region - if new_region in seen: - continue - new_path = path + [entrance.access_rule] - seen.add(new_region) - if not new_region.is_light_world: - continue # we don't care about pure dark world entrances - if new_region.is_dark_world: - queue.append((new_region, new_path)) - else: - # we have reached pure light world, so we have a new possible option - possible_options.append(path_to_access_rule(new_path, entrance)) - return options_to_access_rule(possible_options) - - # Add requirements for bunny-impassible caves if they occur in the dark world - for region in [world.get_region(name, player) for name in bunny_impassable_caves]: - - if not region.is_dark_world: - continue - rule = get_rule_to_add(region) - for ext in region.exits: - add_rule(ext, rule) - - paradox_shop = world.get_region('Light World Death Mountain Shop', player) - if paradox_shop.is_dark_world: - add_rule(paradox_shop.entrances[0], get_rule_to_add(paradox_shop)) - - for ent_name in bunny_impassible_doors: - bunny_exit = world.get_entrance(ent_name, player) - if bunny_exit.parent_region.is_dark_world: - add_rule(bunny_exit, get_rule_to_add(bunny_exit.parent_region)) - - doors_to_check = [x for x in world.doors if x.player == player and x not in bunny_impassible_doors] - doors_to_check = [x for x in doors_to_check if x.type in [DoorType.Normal, DoorType.Interior] and not x.blocked] - for door in doors_to_check: - room = world.get_room(door.roomIndex, player) - if door.entrance.parent_region.is_dark_world and room.kind(door) in [DoorKind.Dashable, DoorKind.Bombable, DoorKind.Hidden]: - add_rule(door.entrance, get_rule_to_add(door.entrance.parent_region)) - - # Add requirements for all locations that are actually in the dark world, except those available to the bunny - for location in world.get_locations(): - if location.player == player and location.parent_region.is_dark_world: - - if location.name in bunny_accessible_locations: - continue - - add_rule(location, get_rule_to_add(location.parent_region)) - - -def set_inverted_bunny_rules(world, player): - - # regions for the exits of multi-entrace caves/drops that bunny cannot pass - # Note spiral cave may be technically passible, but it would be too absurd to require since OHKO mode is a thing. - bunny_impassable_caves = ['Bumper Cave', 'Two Brothers House', 'Hookshot Cave', - 'Pyramid', 'Spiral Cave (Top)', 'Fairy Ascension Cave (Drop)', 'The Sky'] - bunny_accessible_locations = ['Link\'s House', 'Link\'s Uncle', 'Sahasrahla', 'Sick Kid', 'Lost Woods Hideout', 'Lumberjack Tree', - 'Checkerboard Cave', 'Potion Shop', 'Spectacle Rock Cave', 'Pyramid', - 'Hype Cave - Generous Guy', 'Peg Cave', 'Bumper Cave Ledge', 'Dark Blacksmith Ruins', - 'Bombos Tablet', 'Ether Tablet', 'Purple Chest'] + bunny_accessible_locations = ['Link\'s Uncle', 'Sahasrahla', 'Sick Kid', 'Lost Woods Hideout', 'Lumberjack Tree', 'Checkerboard Cave', 'Potion Shop', 'Spectacle Rock Cave', 'Pyramid', 'Hype Cave - Generous Guy', 'Peg Cave', 'Bumper Cave Ledge', 'Dark Blacksmith Ruins', 'Spectacle Rock', 'Bombos Tablet', 'Ether Tablet', 'Purple Chest', 'Blacksmith', 'Missing Smith', 'Master Sword Pedestal', 'Bottle Merchant', 'Sunken Treasure', 'Desert Ledge'] def path_to_access_rule(path, entrance): return lambda state: state.can_reach(entrance) and all(rule_func(state) for rule_func in path) @@ -1472,9 +1460,39 @@ def set_inverted_bunny_rules(world, player): def options_to_access_rule(options): return lambda state: any(rule_func(state) for rule_func in options) - def get_rule_to_add(start_region): - if not start_region.is_dark_world: - return lambda state: state.has_Pearl(player) + # Helper functions to determine if the moon pearl is required + def is_bunny(region): + if inverted: + return region.is_light_world + else: + return region.is_dark_world + def is_link(region): + if inverted: + return region.is_dark_world + else: + return region.is_light_world + + def get_rule_to_add(region, location = None, connecting_entrance = None): + # In OWG, a location can potentially be superbunny-mirror accessible or + # bunny revival accessible. + if world.logic == 'owglitches': + # TODO: Fix dungeon revive logic for door rando + if region.name == 'Swamp Palace (Entrance)': + return lambda state: state.has_Pearl(player) + if region.name == 'Tower of Hera (Bottom)': # Need to hit the crystal switch + return lambda state: state.has_Mirror(player) and state.has_sword(player) or state.has_Pearl(player) + if region.name in OverworldGlitchRules.get_invalid_bunny_revival_dungeons(): + return lambda state: state.has_Mirror(player) or state.has_Pearl(player) + if region.type == RegionType.Dungeon: + return lambda state: True + if (((location is None or location.name not in OverworldGlitchRules.get_superbunny_accessible_locations()) + or (connecting_entrance is not None and connecting_entrance.name in OverworldGlitchRules.get_invalid_bunny_revival_dungeons())) + and not is_link(region)): + return lambda state: state.has_Pearl(player) + else: + if not is_link(region): + return lambda state: state.has_Pearl(player) + # in this case we are mixed region. # we collect possible options. @@ -1496,9 +1514,24 @@ def set_inverted_bunny_rules(world, player): continue new_path = path + [entrance.access_rule] seen.add(new_region) - if not new_region.is_dark_world: - continue # we don't care about pure light world entrances - if new_region.is_light_world: + if not is_link(new_region): + # For OWG, establish superbunny and revival rules. + if world.logic == 'owglitches' and entrance.name not in OverworldGlitchRules.get_invalid_bunny_revival_dungeons(): + if region.name in OverworldGlitchRules.get_sword_required_superbunny_mirror_regions(): + possible_options.append(lambda state: path_to_access_rule(new_path, entrance) and state.has_Mirror(player) and state.has_sword(player)) + elif (region.name in OverworldGlitchRules.get_boots_required_superbunny_mirror_regions() + or location is not None and location.name in OverworldGlitchRules.get_boots_required_superbunny_mirror_locations()): + possible_options.append(lambda state: path_to_access_rule(new_path, entrance) and state.has_Mirror(player) and state.has_Boots(player)) + elif location is not None and location.name in OverworldGlitchRules.get_superbunny_accessible_locations(): + if new_region.name == 'Superbunny Cave (Bottom)' or region.name == 'Kakariko Well (top)': + possible_options.append(lambda state: path_to_access_rule(new_path, entrance)) + else: + possible_options.append(lambda state: path_to_access_rule(new_path, entrance) and state.has_Mirror(player)) + if new_region.type != RegionType.Cave: + continue + else: + continue + if is_bunny(new_region): queue.append((new_region, new_path)) else: # we have reached pure dark world, so we have a new possible option @@ -1508,14 +1541,14 @@ def set_inverted_bunny_rules(world, player): # Add requirements for bunny-impassible caves if they occur in the light world for region in [world.get_region(name, player) for name in bunny_impassable_caves]: - if not region.is_light_world: + if not is_bunny(region): continue rule = get_rule_to_add(region) for ext in region.exits: add_rule(ext, rule) paradox_shop = world.get_region('Light World Death Mountain Shop', player) - if paradox_shop.is_light_world: + if is_bunny(paradox_shop): add_rule(paradox_shop.entrances[0], get_rule_to_add(paradox_shop)) for ent_name in bunny_impassible_doors: @@ -1530,15 +1563,22 @@ def set_inverted_bunny_rules(world, player): if door.entrance.parent_region.is_light_world and room.kind(door) in [DoorKind.Dashable, DoorKind.Bombable, DoorKind.Hidden]: add_rule(door.entrance, get_rule_to_add(door.entrance.parent_region)) - # Add requirements for all locations that are actually in the light world, except those available to the bunny - for location in world.get_locations(): - if location.player == player and location.parent_region.is_light_world: - - if location.name in bunny_accessible_locations: - continue - - add_rule(location, get_rule_to_add(location.parent_region)) - + # Add requirements for all locations that are actually in the dark world, except those available to the bunny, including dungeon revival + for entrance in world.get_entrances(): + if entrance.player == player and is_bunny(entrance.connected_region): + if world.logic == 'owglitches': + if entrance.connected_region.type == RegionType.Dungeon: + if entrance.parent_region.type != RegionType.Dungeon and entrance.connected_region.name in OverworldGlitchRules.get_invalid_bunny_revival_dungeons(): + add_rule(entrance, get_rule_to_add(entrance.connected_region, None, entrance)) + continue + if entrance.connected_region.name == 'Turtle Rock (Entrance)': + add_rule(world.get_entrance('Turtle Rock Entrance Gap', player), get_rule_to_add(entrance.connected_region, None, entrance)) + for location in entrance.connected_region.locations: + if world.logic == 'owglitches' and entrance.name in OverworldGlitchRules.get_invalid_mirror_bunny_entrances(): + continue + if location.name in bunny_accessible_locations: + continue + add_rule(location, get_rule_to_add(entrance.connected_region, location)) bunny_impassible_doors = { 'Hyrule Dungeon Armory S', 'Hyrule Dungeon Armory ES', 'Sewers Secret Room Push Block', 'Sewers Pull Switch S', diff --git a/mystery_example.yml b/mystery_example.yml index bd19e6f5..e349063d 100644 --- a/mystery_example.yml +++ b/mystery_example.yml @@ -1,11 +1,11 @@ description: Example door rando weights door_shuffle: - vanilla: 2 - basic: 1 - crossed: 1 + vanilla: 0 + basic: 2 + crossed: 2 intensity: - 1: 1 - 2: 1 + 1: 2 + 2: 2 3: 4 keydropshuffle: on: 1 @@ -38,7 +38,7 @@ fast_ganon: 2 dungeons: 1 pedestal: 2 - triforce-hunt: 0 + triforce-hunt: 2 triforce_goal_min: 10 triforce_goal_max: 30 triforce_pool_min: 20 @@ -55,7 +55,7 @@ default: 5 experimental: on: 1 - off: 0 + off: 1 glitches_required: none: 1 no_logic: 0 @@ -90,23 +90,23 @@ random: 1 enemy_shuffle: none: 3 - shuffled: 1 - random: 0 + shuffled: 2 + random: 1 hints: on: 1 - off: 0 + off: 1 weapons: - randomized: 2 - assured: 1 - vanilla: 1 - swordless: 0 + randomized: 5 + assured: 3 + vanilla: 3 + swordless: 1 item_pool: - normal: 1 - hard: 0 + normal: 3 + hard: 1 expert: 0 item_functionality: - normal: 1 - hard: 0 + normal: 3 + hard: 1 expert: 0 enemy_damage: default: 3 diff --git a/test/TestBase.py b/test/TestBase.py new file mode 100644 index 00000000..df5c981f --- /dev/null +++ b/test/TestBase.py @@ -0,0 +1,50 @@ +import unittest + +from BaseClasses import CollectionState +from Items import ItemFactory + + +class TestBase(unittest.TestCase): + + _state_cache = {} + + def get_state(self, items): + if (self.world, tuple(items)) in self._state_cache: + return self._state_cache[self.world, tuple(items)] + state = CollectionState(self.world) + for item in items: + item.advancement = True + state.collect(item) + state.sweep_for_events() + self._state_cache[self.world, tuple(items)] = state + return state + + def run_location_tests(self, access_pool): + for location, access, *item_pool in access_pool: + items = item_pool[0] + all_except = item_pool[1] if len(item_pool) > 1 else None + with self.subTest(location=location, access=access, items=items, all_except=all_except): + if all_except and len(all_except) > 0: + items = self.world.itempool[:] + items = [item for item in items if item.name not in all_except and not ("Bottle" in item.name and "AnyBottle" in all_except)] + items.extend(ItemFactory(item_pool[0], 1)) + else: + items = ItemFactory(items, 1) + state = self.get_state(items) + + self.assertEqual(self.world.get_location(location, 1).can_reach(state), access) + + def run_entrance_tests(self, access_pool): + for entrance, access, *item_pool in access_pool: + items = item_pool[0] + all_except = item_pool[1] if len(item_pool) > 1 else None + with self.subTest(entrance=entrance, access=access, items=items, all_except=all_except): + if all_except and len(all_except) > 0: + items = self.world.itempool[:] + items = [item for item in items if item.name not in all_except and not ("Bottle" in item.name and "AnyBottle" in all_except)] + items.extend(ItemFactory(item_pool[0], 1)) + else: + items = ItemFactory(items, 1) + state = self.get_state(items) + + self.assertEqual(self.world.get_entrance(entrance, 1).can_reach(state), access) \ No newline at end of file diff --git a/test/inverted/TestInverted.py b/test/inverted/TestInverted.py index 82e1c0f0..b1707547 100644 --- a/test/inverted/TestInverted.py +++ b/test/inverted/TestInverted.py @@ -6,10 +6,10 @@ from ItemList import generate_itempool, difficulties from Items import ItemFactory from Regions import mark_light_world_regions from Rules import set_rules -from test.TestVanilla import TestVanilla +from test.TestBase import TestBase -class TestInverted(TestVanilla): +class TestInverted(TestBase): def setUp(self): self.world = World(1, 'vanilla', 'noglitches', 'inverted', 'random', 'normal', 'normal', 'none', 'on', 'ganon', 'balanced', True, False, False, False, False, False, False, False, False, None, diff --git a/test/inverted/TestInvertedDarkWorld.py b/test/inverted/TestInvertedDarkWorld.py index c2249c7e..58a4c8b1 100644 --- a/test/inverted/TestInvertedDarkWorld.py +++ b/test/inverted/TestInvertedDarkWorld.py @@ -4,7 +4,7 @@ from test.inverted.TestInverted import TestInverted class TestInvertedDeathMountain(TestInverted): def testNorthWest(self): - self.run_tests([ + self.run_location_tests([ ["Brewery", True, []], ["C-Shaped House", True, []], @@ -45,7 +45,7 @@ class TestInvertedDeathMountain(TestInverted): ]) def testNorthEast(self): - self.run_tests([ + self.run_location_tests([ ["Catfish", False, []], ["Catfish", False, [], ['Progressive Glove', 'Flippers']], ["Catfish", False, [], ['Progressive Glove', 'Magic Mirror']], @@ -80,7 +80,7 @@ class TestInvertedDeathMountain(TestInverted): ]) def testSouth(self): - self.run_tests([ + self.run_location_tests([ ["Hype Cave - Top", True, []], ["Hype Cave - Middle Right", True, []], @@ -99,7 +99,7 @@ class TestInvertedDeathMountain(TestInverted): ]) def testMireArea(self): - self.run_tests([ + self.run_location_tests([ ["Mire Shed - Left", False, []], ["Mire Shed - Left", False, [], ['Ocarina', 'Magic Mirror']], ["Mire Shed - Left", True, ['Moon Pearl', 'Ocarina', 'Progressive Glove', 'Progressive Glove']], diff --git a/test/inverted/TestInvertedDeathMountain.py b/test/inverted/TestInvertedDeathMountain.py index fbd75ddd..8c330d3c 100644 --- a/test/inverted/TestInvertedDeathMountain.py +++ b/test/inverted/TestInvertedDeathMountain.py @@ -4,7 +4,7 @@ from test.inverted.TestInverted import TestInverted class TestInvertedDeathMountain(TestInverted): def testWestDeathMountain(self): - self.run_tests([ + self.run_location_tests([ ["Old Man", False, []], ["Old Man", False, [], ['Progressive Glove', 'Ocarina']], ["Old Man", False, [], ['Lamp']], @@ -23,7 +23,7 @@ class TestInvertedDeathMountain(TestInverted): ]) def testEastDeathMountain(self): - self.run_tests([ + self.run_location_tests([ ["Spiral Cave", False, []], ["Spiral Cave", False, [], ['Moon Pearl']], ["Spiral Cave", False, [], ['Progressive Glove', 'Ocarina']], @@ -158,7 +158,7 @@ class TestInvertedDeathMountain(TestInverted): ]) def testEastDarkWorldDeathMountain(self): - self.run_tests([ + self.run_location_tests([ ["Superbunny Cave - Top", False, []], ["Superbunny Cave - Top", False, [], ['Progressive Glove', 'Ocarina']], ["Superbunny Cave - Top", True, ['Progressive Glove', 'Lamp']], @@ -204,7 +204,7 @@ class TestInvertedDeathMountain(TestInverted): ]) def testWestDarkWorldDeathMountain(self): - self.run_tests([ + self.run_location_tests([ ["Spike Cave", False, []], ["Spike Cave", False, [], ['Progressive Glove']], ["Spike Cave", False, [], ['Hammer']], diff --git a/test/inverted/TestInvertedEntrances.py b/test/inverted/TestInvertedEntrances.py new file mode 100644 index 00000000..89b3e000 --- /dev/null +++ b/test/inverted/TestInvertedEntrances.py @@ -0,0 +1,118 @@ +from test.inverted.TestInverted import TestInverted + + +class TestEntrances(TestInverted): + + def testDungeonEntrances(self): + self.run_entrance_tests([ + ["Hyrule Castle Entrance (South)", False, []], + ["Hyrule Castle Entrance (South)", False, [], ["Beat Agahnim 1", "Moon Pearl"]], + ["Hyrule Castle Entrance (South)", False, [], ["Beat Agahnim 1", "Progressive Glove"]], + ["Hyrule Castle Entrance (South)", False, ["Progressive Glove"], ["Beat Agahnim 1", "Hammer", "Progressive Glove"]], + ["Hyrule Castle Entrance (South)", True, ["Beat Agahnim 1"]], + ["Hyrule Castle Entrance (South)", True, ["Moon Pearl", "Hammer", "Progressive Glove"]], + ["Hyrule Castle Entrance (South)", True, ["Moon Pearl", "Progressive Glove", "Progressive Glove"]], + + ["Eastern Palace", False, []], + ["Eastern Palace", False, [], ["Beat Agahnim 1", "Moon Pearl"]], + ["Eastern Palace", False, [], ["Beat Agahnim 1", "Progressive Glove"]], + ["Eastern Palace", False, ["Progressive Glove"], ["Beat Agahnim 1", "Hammer", "Progressive Glove"]], + ["Eastern Palace", True, ["Beat Agahnim 1"]], + ["Eastern Palace", True, ["Moon Pearl", "Hammer", "Progressive Glove"]], + ["Eastern Palace", True, ["Moon Pearl", "Progressive Glove", "Progressive Glove"]], + + ["Desert Palace Entrance (South)", False, []], + ["Desert Palace Entrance (South)", False, [], ["Book of Mudora"]], + ["Desert Palace Entrance (South)", False, [], ["Beat Agahnim 1", "Moon Pearl"]], + ["Desert Palace Entrance (South)", False, [], ["Beat Agahnim 1", "Progressive Glove"]], + ["Desert Palace Entrance (South)", False, ["Progressive Glove"], ["Beat Agahnim 1", "Hammer", "Progressive Glove"]], + ["Desert Palace Entrance (South)", True, ["Book of Mudora", "Beat Agahnim 1"]], + ["Desert Palace Entrance (South)", True, ["Book of Mudora", "Moon Pearl", "Hammer", "Progressive Glove"]], + ["Desert Palace Entrance (South)", True, ["Book of Mudora", "Moon Pearl", "Progressive Glove", "Progressive Glove"]], + ["Desert Palace Entrance (North)", False, []], + ["Desert Palace Entrance (North)", False, [], ["Book of Mudora"]], + ["Desert Palace Entrance (North)", False, [], ["Progressive Glove"]], + ["Desert Palace Entrance (North)", False, [], ["Moon Pearl"]], + ["Desert Palace Entrance (North)", False, ["Progressive Glove"], ["Beat Agahnim 1", "Hammer", "Progressive Glove"]], + ["Desert Palace Entrance (North)", True, ["Moon Pearl", "Book of Mudora", "Progressive Glove", "Hammer"]], + ["Desert Palace Entrance (North)", True, ["Moon Pearl", "Book of Mudora", "Progressive Glove", "Progressive Glove"]], + ["Desert Palace Entrance (North)", True, ["Moon Pearl", "Book of Mudora", "Progressive Glove", "Beat Agahnim 1"]], + + ["Tower of Hera", False, []], + ["Tower of Hera", False, [], ["Moon Pearl"]], + ["Tower of Hera", False, [], ["Hammer"]], + ["Tower of Hera", False, ["Progressive Glove"], ["Hookshot", "Progressive Glove"]], + ["Tower of Hera", False, [], ["Ocarina", "Lamp"]], + ["Tower of Hera", False, [], ["Ocarina", "Progressive Glove"]], + ["Tower of Hera", True, ["Moon Pearl", "Hammer", "Progressive Glove", "Progressive Glove", "Lamp"]], + ["Tower of Hera", True, ["Moon Pearl", "Hammer", "Hookshot", "Progressive Glove", "Lamp"]], + ["Tower of Hera", True, ["Moon Pearl", "Hammer", "Hookshot", "Progressive Glove", "Ocarina"]], + ["Tower of Hera", True, ["Moon Pearl", "Hammer", "Beat Agahnim 1", "Ocarina", "Hookshot"]], + + ["Inverted Agahnims Tower", False, []], + ["Inverted Agahnims Tower", False, [], ["Ocarina", "Lamp"]], + ["Inverted Agahnims Tower", False, [], ["Ocarina", "Progressive Glove"]], + ["Inverted Agahnims Tower", False, [], ["Moon Pearl", "Lamp"]], + ["Inverted Agahnims Tower", False, [], ["Moon Pearl", "Progressive Glove"]], + ["Inverted Agahnims Tower", True, ["Lamp", "Progressive Glove"]], + ["Inverted Agahnims Tower", True, ["Ocarina", "Beat Agahnim 1", "Moon Pearl"]], + ["Inverted Agahnims Tower", True, ["Ocarina", "Progressive Glove", "Progressive Glove", "Moon Pearl"]], + ["Inverted Agahnims Tower", True, ["Ocarina", "Progressive Glove", "Hammer", "Moon Pearl"]], + + ["Palace of Darkness", False, []], + ["Palace of Darkness", False, [], ["Hammer", "Flippers", "Magic Mirror", "Ocarina"]], + ["Palace of Darkness", True, ["Hammer"]], + ["Palace of Darkness", True, ["Flippers"]], + ["Palace of Darkness", True, ["Progressive Glove", "Progressive Glove", "Moon Pearl", "Ocarina"]], + ["Palace of Darkness", True, ["Progressive Glove", "Progressive Glove", "Moon Pearl", "Magic Mirror"]], + ["Palace of Darkness", True, ["Beat Agahnim 1", "Moon Pearl", "Ocarina"]], + ["Palace of Darkness", True, ["Beat Agahnim 1", "Moon Pearl", "Magic Mirror"]], + + ["Swamp Palace", True, []], + + ["Thieves Town", True, []], + + ["Skull Woods First Section Door", True, []], + + ["Skull Woods Final Section", False, []], + ["Skull Woods Final Section", False, [], ["Fire Rod"]], + ["Skull Woods Final Section", True, ["Fire Rod"]], + + ["Ice Palace", False, []], + ["Ice Palace", False, [], ["Flippers"]], + ["Ice Palace", True, ["Flippers"]], + + ["Misery Mire", False, []], + ["Misery Mire", False, [], ["Ocarina", "Magic Mirror"]], + ["Misery Mire", False, [], ["Moon Pearl", "Magic Mirror"]], + ["Misery Mire", False, [], ["Ether"]], + ["Misery Mire", False, [], ["Progressive Sword"]], + ["Misery Mire", True, ["Progressive Sword", "Ether", "Beat Agahnim 1", "Magic Mirror"]], + ["Misery Mire", True, ["Progressive Sword", "Ether", "Beat Agahnim 1", "Moon Pearl", "Ocarina"]], + ["Misery Mire", True, ["Progressive Sword", "Ether", "Moon Pearl", "Hammer", "Progressive Glove", "Magic Mirror"]], + ["Misery Mire", True, ["Progressive Sword", "Ether", "Moon Pearl", "Hammer", "Progressive Glove", "Ocarina"]], + ["Misery Mire", True, ["Progressive Sword", "Ether", "Moon Pearl", "Progressive Glove", "Progressive Glove", "Magic Mirror"]], + ["Misery Mire", True, ["Progressive Sword", "Ether", "Moon Pearl", "Progressive Glove", "Progressive Glove", "Ocarina"]], + + ["Turtle Rock", False, []], + ["Turtle Rock", False, [], ["Quake"]], + ["Turtle Rock", False, [], ["Progressive Sword"]], + ["Turtle Rock", False, [], ["Lamp", "Ocarina"]], + ["Turtle Rock", False, [], ["Progressive Glove", "Ocarina"]], + ["Turtle Rock", True, ["Quake", "Progressive Sword", "Progressive Glove", "Lamp"]], + ["Turtle Rock", True, ["Quake", "Progressive Sword", "Progressive Glove", "Progressive Glove", "Moon Pearl", "Ocarina"]], + ["Turtle Rock", True, ["Quake", "Progressive Sword", "Progressive Glove", "Hammer", "Moon Pearl", "Ocarina"]], + ["Turtle Rock", True, ["Quake", "Progressive Sword", "Beat Agahnim 1", "Moon Pearl", "Ocarina"]], + + ["Inverted Ganons Tower", False, []], + ["Inverted Ganons Tower", False, [], ["Crystal 1"]], + ["Inverted Ganons Tower", False, [], ["Crystal 2"]], + ["Inverted Ganons Tower", False, [], ["Crystal 3"]], + ["Inverted Ganons Tower", False, [], ["Crystal 4"]], + ["Inverted Ganons Tower", False, [], ["Crystal 5"]], + ["Inverted Ganons Tower", False, [], ["Crystal 6"]], + ["Inverted Ganons Tower", False, [], ["Crystal 7"]], + ["Inverted Ganons Tower", True, ["Beat Agahnim 1", "Crystal 1", "Crystal 2", "Crystal 3", "Crystal 4", "Crystal 5", "Crystal 6", "Crystal 7"]], + ["Inverted Ganons Tower", True, ["Moon Pearl", "Progressive Glove", "Progressive Glove", "Crystal 1", "Crystal 2", "Crystal 3", "Crystal 4", "Crystal 5", "Crystal 6", "Crystal 7"]], + ["Inverted Ganons Tower", True, ["Moon Pearl", "Hammer", "Progressive Glove", "Progressive Glove", "Crystal 1", "Crystal 2", "Crystal 3", "Crystal 4", "Crystal 5", "Crystal 6", "Crystal 7"]], + ]) \ No newline at end of file diff --git a/test/inverted/TestInvertedLightWorld.py b/test/inverted/TestInvertedLightWorld.py index 6a1e5baf..014ccb66 100644 --- a/test/inverted/TestInvertedLightWorld.py +++ b/test/inverted/TestInvertedLightWorld.py @@ -6,7 +6,7 @@ class TestInvertedLightWorld(TestInverted): super().setUp() def testLostWoods(self): - self.run_tests([ + self.run_location_tests([ ["Master Sword Pedestal", False, []], ["Master Sword Pedestal", False, [], ['Green Pendant']], ["Master Sword Pedestal", False, [], ['Red Pendant']], @@ -37,7 +37,7 @@ class TestInvertedLightWorld(TestInverted): ]) def testKakariko(self): - self.run_tests([ + self.run_location_tests([ ["Kakariko Tavern", False, []], ["Kakariko Tavern", False, [], ['Moon Pearl']], ["Kakariko Tavern", True, ['Moon Pearl', 'Beat Agahnim 1']], @@ -171,7 +171,7 @@ class TestInvertedLightWorld(TestInverted): ]) def testSouthLightWorld(self): - self.run_tests([ + self.run_location_tests([ ["Desert Ledge", False, []], ["Desert Ledge", False, [], ['Book of Mudora']], ["Desert Ledge", False, [], ['Moon Pearl']], @@ -251,7 +251,7 @@ class TestInvertedLightWorld(TestInverted): ]) def testZoraArea(self): - self.run_tests([ + self.run_location_tests([ ["King Zora", False, []], ["King Zora", False, [], ['Progressive Glove', 'Flippers']], ["King Zora", False, [], ['Moon Pearl']], @@ -284,7 +284,7 @@ class TestInvertedLightWorld(TestInverted): ]) def testLightWorld(self): - self.run_tests([ + self.run_location_tests([ ["Link's Uncle", False, []], ["Link's Uncle", False, [], ['Moon Pearl']], ["Link's Uncle", True, ['Moon Pearl', 'Beat Agahnim 1']], diff --git a/test/inverted/TestInvertedTurtleRock.py b/test/inverted/TestInvertedTurtleRock.py index 7975abeb..4e9b4c32 100644 --- a/test/inverted/TestInvertedTurtleRock.py +++ b/test/inverted/TestInvertedTurtleRock.py @@ -4,7 +4,7 @@ from test.inverted.TestInverted import TestInverted class TestInvertedTurtleRock(TestInverted): def testTurtleRock(self): - self.run_tests([ + self.run_location_tests([ ["Turtle Rock - Compass Chest", False, []], ["Turtle Rock - Compass Chest", False, [], ['Cane of Somaria']], ["Turtle Rock - Compass Chest", False, [], ['Quake', 'Magic Mirror']], diff --git a/test/inverted_owg/TestDarkWorld.py b/test/inverted_owg/TestDarkWorld.py new file mode 100644 index 00000000..89dff120 --- /dev/null +++ b/test/inverted_owg/TestDarkWorld.py @@ -0,0 +1,78 @@ +from test.inverted_owg.TestInvertedOWG import TestInvertedOWG + + +class TestDarkWorld(TestInvertedOWG): + + def testSouthDarkWorld(self): + self.run_location_tests([ + ["Hype Cave - Top", True, []], + + ["Hype Cave - Middle Right", True, []], + + ["Hype Cave - Middle Left", True, []], + + ["Hype Cave - Bottom", True, []], + + ["Hype Cave - Generous Guy", True, []], + + ["Stumpy", True, []], + + ["Digging Game", True, []], + ]) + + def testWestDarkWorld(self): + self.run_location_tests([ + ["Brewery", True, []], + + ["C-Shaped House", True, []], + + ["Chest Game", True, []], + + ["Peg Cave", False, []], + ["Peg Cave", False, [], ['Hammer']], + ["Peg Cave", True, ['Hammer', 'Pegasus Boots']], + + ["Bumper Cave Ledge", False, []], + ["Bumper Cave Ledge", True, ['Pegasus Boots']], + + ["Blacksmith", False, []], + ["Blacksmith", True, ['Magic Mirror', 'Pegasus Boots']], + ["Blacksmith", True, ['Progressive Glove', 'Progressive Glove', 'Pegasus Boots', 'Moon Pearl']], + + ["Purple Chest", False, []], + ["Purple Chest", True, ['Magic Mirror', 'Pegasus Boots']], + ["Purple Chest", True, ['Progressive Glove', 'Progressive Glove', 'Pegasus Boots', 'Moon Pearl']], + ]) + + def testEastDarkWorld(self): + self.run_location_tests([ + ["Catfish", False, []], + ["Catfish", True, ['Pegasus Boots']], + + #todo: Qirn Jump + #["Pyramid", True, []], + ["Pyramid", False, []], + ["Pyramid", True, ['Pegasus Boots']], + ["Pyramid", True, ['Flippers']], + + ["Pyramid Fairy - Left", False, []], + ["Pyramid Fairy - Left", False, [], ['Magic Mirror']], + ["Pyramid Fairy - Left", False, [], ['Crystal 5']], + ["Pyramid Fairy - Left", False, [], ['Crystal 6']], + ["Pyramid Fairy - Left", True, ['Crystal 5', 'Crystal 6', 'Magic Mirror', 'Pegasus Boots']], + + ["Pyramid Fairy - Right", False, []], + ["Pyramid Fairy - Right", False, [], ['Magic Mirror']], + ["Pyramid Fairy - Right", False, [], ['Crystal 5']], + ["Pyramid Fairy - Right", False, [], ['Crystal 6']], + ["Pyramid Fairy - Right", True, ['Crystal 5', 'Crystal 6', 'Magic Mirror', 'Pegasus Boots']], + ]) + + def testMireArea(self): + self.run_location_tests([ + ["Mire Shed - Left", False, []], + ["Mire Shed - Left", True, ['Pegasus Boots']], + + ["Mire Shed - Right", False, []], + ["Mire Shed - Right", True, ['Pegasus Boots']], + ]) \ No newline at end of file diff --git a/test/inverted_owg/TestDeathMountain.py b/test/inverted_owg/TestDeathMountain.py new file mode 100644 index 00000000..093331c2 --- /dev/null +++ b/test/inverted_owg/TestDeathMountain.py @@ -0,0 +1,113 @@ +from test.inverted_owg.TestInvertedOWG import TestInvertedOWG + + +class TestDeathMountain(TestInvertedOWG): + + def testWestDeathMountain(self): + self.run_location_tests([ + ["Old Man", False, []], + ["Old Man", False, [], ['Lamp']], + ["Old Man", True, ['Pegasus Boots', 'Lamp']], + + ["Spectacle Rock Cave", False, []], + ["Spectacle Rock Cave", True, ['Pegasus Boots']], + ]) + + def testEastDeathMountain(self): + self.run_location_tests([ + ["Spiral Cave", False, []], + ["Spiral Cave", False, [], ['Moon Pearl', 'Magic Mirror']], + ["Spiral Cave", False, [], ['Moon Pearl', 'Progressive Sword']], + ["Spiral Cave", True, ['Magic Mirror', 'Progressive Glove', 'Progressive Glove', 'Lamp', 'Progressive Sword']], + ["Spiral Cave", True, ['Magic Mirror', 'Progressive Glove', 'Progressive Glove', 'Pegasus Boots', 'Progressive Sword']], + ["Spiral Cave", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Paradox Cave Lower - Far Left", False, []], + ["Paradox Cave Lower - Far Left", False, [], ['Moon Pearl']], + ["Paradox Cave Lower - Far Left", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Paradox Cave Lower - Left", False, []], + ["Paradox Cave Lower - Left", False, [], ['Moon Pearl']], + ["Paradox Cave Lower - Left", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Paradox Cave Lower - Middle", False, []], + ["Paradox Cave Lower - Middle", False, [], ['Moon Pearl']], + ["Paradox Cave Lower - Middle", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Paradox Cave Lower - Right", False, []], + ["Paradox Cave Lower - Right", False, [], ['Moon Pearl']], + ["Paradox Cave Lower - Right", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Paradox Cave Lower - Far Right", False, []], + ["Paradox Cave Lower - Far Right", False, [], ['Moon Pearl']], + ["Paradox Cave Lower - Far Right", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Paradox Cave Upper - Left", False, []], + ["Paradox Cave Upper - Left", False, [], ['Moon Pearl']], + ["Paradox Cave Upper - Left", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Paradox Cave Upper - Right", False, []], + ["Paradox Cave Upper - Right", False, [], ['Moon Pearl']], + ["Paradox Cave Upper - Right", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Mimic Cave", False, []], + ["Mimic Cave", False, [], ['Moon Pearl']], + ["Mimic Cave", False, [], ['Hammer']], + ["Mimic Cave", True, ['Moon Pearl', 'Hammer', 'Pegasus Boots']], + + ["Ether Tablet", False, []], + ["Ether Tablet", False, ['Progressive Sword'], ['Progressive Sword']], + ["Ether Tablet", False, [], ['Book of Mudora']], + ["Ether Tablet", False, [], ['Moon Pearl']], + ["Ether Tablet", True, ['Pegasus Boots', 'Moon Pearl', 'Book of Mudora', 'Progressive Sword', 'Progressive Sword']], + + ["Spectacle Rock", False, []], + ["Spectacle Rock", False, [], ['Moon Pearl']], + ["Spectacle Rock", True, ['Moon Pearl', 'Pegasus Boots']], + ]) + + + def testWestDarkWorldDeathMountain(self): + self.run_location_tests([ + ["Spike Cave", False, []], + ["Spike Cave", False, [], ['Progressive Glove']], + ["Spike Cave", False, [], ['Hammer']], + ["Spike Cave", False, [], ['Cape', 'Cane of Byrna']], + # ER doesn't put in an extra potion + #["Spike Cave", True, ['Bottle', 'Hammer', 'Progressive Glove', 'Pegasus Boots', 'Cape']], + ["Spike Cave", True, ['Bottle', 'Hammer', 'Progressive Glove', 'Pegasus Boots', 'Cape', 'Moon Pearl']], + ["Spike Cave", True, ['Bottle', 'Hammer', 'Progressive Glove', 'Pegasus Boots', 'Cane of Byrna']], + ["Spike Cave", True, ['Magic Upgrade (1/2)', 'Hammer', 'Progressive Glove', 'Pegasus Boots', 'Cape']], + ["Spike Cave", True, ['Magic Upgrade (1/2)', 'Hammer', 'Progressive Glove', 'Pegasus Boots', 'Cane of Byrna']], + ["Spike Cave", True, ['Magic Upgrade (1/4)', 'Hammer', 'Progressive Glove', 'Pegasus Boots', 'Cape']], + ["Spike Cave", True, ['Magic Upgrade (1/4)', 'Hammer', 'Progressive Glove', 'Pegasus Boots', 'Cane of Byrna']], + ]) + + def testEastDarkWorldDeathMountain(self): + self.run_location_tests([ + ["Superbunny Cave - Top", False, []], + ["Superbunny Cave - Top", True, ['Pegasus Boots']], + + ["Superbunny Cave - Bottom", False, []], + ["Superbunny Cave - Bottom", True, ['Pegasus Boots']], + + ["Hookshot Cave - Bottom Right", False, []], + ["Hookshot Cave - Bottom Right", False, [], ['Hookshot', 'Pegasus Boots']], + ["Hookshot Cave - Bottom Right", False, [], ['Progressive Glove', 'Pegasus Boots', 'Magic Mirror']], + ["Hookshot Cave - Bottom Right", True, ['Pegasus Boots']], + + ["Hookshot Cave - Bottom Left", False, []], + ["Hookshot Cave - Bottom Left", False, [], ['Hookshot']], + ["Hookshot Cave - Bottom Left", False, [], ['Progressive Glove', 'Pegasus Boots', 'Magic Mirror']], + ["Hookshot Cave - Bottom Left", True, ['Pegasus Boots', 'Hookshot']], + + ["Hookshot Cave - Top Left", False, []], + ["Hookshot Cave - Top Left", False, [], ['Hookshot']], + ["Hookshot Cave - Top Left", False, [], ['Progressive Glove', 'Pegasus Boots', 'Magic Mirror']], + ["Hookshot Cave - Top Left", True, ['Pegasus Boots', 'Hookshot']], + + ["Hookshot Cave - Top Right", False, []], + ["Hookshot Cave - Top Right", False, [], ['Hookshot']], + ["Hookshot Cave - Top Right", False, [], ['Progressive Glove', 'Pegasus Boots', 'Magic Mirror']], + ["Hookshot Cave - Top Right", True, ['Pegasus Boots', 'Hookshot']], + ]) \ No newline at end of file diff --git a/test/inverted_owg/TestDungeons.py b/test/inverted_owg/TestDungeons.py new file mode 100644 index 00000000..495912cd --- /dev/null +++ b/test/inverted_owg/TestDungeons.py @@ -0,0 +1,115 @@ +from test.inverted_owg.TestInvertedOWG import TestInvertedOWG + +class TestDungeons(TestInvertedOWG): + + def testFirstDungeonChests(self): + self.run_location_tests([ + ["Hyrule Castle - Map Chest", False, []], + ["Hyrule Castle - Map Chest", True, ['Beat Agahnim 1']], + ["Hyrule Castle - Map Chest", True, ['Moon Pearl', 'Pegasus Boots']], + ["Hyrule Castle - Map Chest", True, ['Magic Mirror', 'Pegasus Boots']], + + ["Sanctuary", False, []], + ["Sanctuary", False, ['Beat Agahnim 1']], + ["Sanctuary", True, ['Magic Mirror', 'Beat Agahnim 1']], + ["Sanctuary", True, ['Lamp', 'Beat Agahnim 1', 'Small Key (Escape)']], + ["Sanctuary", True, ['Moon Pearl', 'Pegasus Boots']], + ["Sanctuary", True, ['Magic Mirror', 'Pegasus Boots']], + + ["Sewers - Secret Room - Left", False, []], + ["Sewers - Secret Room - Left", True, ['Moon Pearl', 'Progressive Glove', 'Pegasus Boots']], + ["Sewers - Secret Room - Left", True, ['Moon Pearl', 'Pegasus Boots', 'Lamp', 'Small Key (Escape)']], + ["Sewers - Secret Room - Left", True, + ['Magic Mirror', 'Pegasus Boots', 'Lamp', 'Small Key (Escape)']], + ["Sewers - Secret Room - Left", True, ['Beat Agahnim 1', 'Lamp', 'Small Key (Escape)']], + + ["Eastern Palace - Compass Chest", False, []], + ["Eastern Palace - Compass Chest", True, ['Moon Pearl', 'Pegasus Boots']], + ["Eastern Palace - Compass Chest", True, ['Magic Mirror', 'Pegasus Boots']], + ["Eastern Palace - Compass Chest", True, ['Beat Agahnim 1']], + + ["Desert Palace - Map Chest", False, []], + ["Desert Palace - Map Chest", True, ['Moon Pearl', 'Pegasus Boots']], + ["Desert Palace - Map Chest", True, ['Book of Mudora', 'Magic Mirror', 'Pegasus Boots']], + + ["Desert Palace - Boss", False, []], + ["Desert Palace - Boss", False, [], ['Small Key (Desert Palace)']], + ["Desert Palace - Boss", False, [], ['Big Key (Desert Palace)']], + ["Desert Palace - Boss", False, [], ['Lamp', 'Fire Rod']], + ["Desert Palace - Boss", True, ['Progressive Sword', 'Small Key (Desert Palace)', 'Big Key (Desert Palace)', 'Moon Pearl', 'Pegasus Boots', 'Lamp']], + ["Desert Palace - Boss", True, ['Progressive Sword', 'Small Key (Desert Palace)', 'Big Key (Desert Palace)', 'Moon Pearl', 'Pegasus Boots', 'Fire Rod']], + + ["Tower of Hera - Basement Cage", False, []], + ["Tower of Hera - Basement Cage", False, [], ['Moon Pearl']], + ["Tower of Hera - Basement Cage", True, ['Pegasus Boots', 'Moon Pearl']], + + ["Castle Tower - Room 03", False, []], + ["Castle Tower - Room 03", False, [], ['Progressive Sword', 'Hammer', 'Progressive Bow', 'Fire Rod', 'Ice Rod', 'Cane of Somaria', 'Cane of Byrna']], + ["Castle Tower - Room 03", True, ['Pegasus Boots', 'Progressive Sword']], + ["Castle Tower - Room 03", True, ['Pegasus Boots', 'Progressive Bow']], + + #todo: Qirn Jump + #["Palace of Darkness - Shooter Room", True, []], + ["Palace of Darkness - Shooter Room", True, ['Pegasus Boots']], + ["Palace of Darkness - Shooter Room", True, ['Hammer']], + ["Palace of Darkness - Shooter Room", True, ['Flippers']], + ["Palace of Darkness - Shooter Room", True, ['Pegasus Boots', 'Progressive Glove']], + ["Palace of Darkness - Shooter Room", True, ['Pegasus Boots', 'Magic Mirror']], + + ["Swamp Palace - Entrance", False, []], + ["Swamp Palace - Entrance", False, [], ['Magic Mirror']], + ["Swamp Palace - Entrance", False, [], ['Flippers']], + ["Swamp Palace - Entrance", True, ['Magic Mirror', 'Flippers', 'Pegasus Boots']], + ["Swamp Palace - Entrance", True, ['Magic Mirror', 'Flippers', 'Beat Agahnim 1']], + + ["Skull Woods - Compass Chest", True, []], + + ["Skull Woods - Big Chest", False, []], + ["Skull Woods - Big Chest", False, [], ['Big Key (Skull Woods)']], + ["Skull Woods - Big Chest", True, ['Big Key (Skull Woods)']], + + ["Skull Woods - Big Key Chest", True, []], + + ["Skull Woods - Bridge Room", False, []], + ["Skull Woods - Bridge Room", False, [], ['Fire Rod']], + ["Skull Woods - Bridge Room", True, ['Fire Rod']], + + ["Thieves' Town - Map Chest", True, []], + + ["Ice Palace - Compass Chest", False, []], + ["Ice Palace - Compass Chest", False, [], ['Fire Rod', 'Bombos', 'Progressive Sword']], + #todo: Qirn Jump + #["Ice Palace - Compass Chest", True, ['Fire Rod']], + #["Ice Palace - Compass Chest", True, ['Bombos', 'Progressive Sword']], + ["Ice Palace - Compass Chest", True, ['Pegasus Boots', 'Fire Rod']], + ["Ice Palace - Compass Chest", True, ['Pegasus Boots', 'Bombos', 'Progressive Sword']], + + ["Misery Mire - Bridge Chest", False, []], + ["Misery Mire - Bridge Chest", False, [], ['Ether']], + ["Misery Mire - Bridge Chest", False, [], ['Progressive Sword']], + ["Misery Mire - Bridge Chest", True, ['Pegasus Boots', 'Ether', 'Progressive Sword']], + + ["Turtle Rock - Compass Chest", False, []], + ["Turtle Rock - Compass Chest", False, [], ['Cane of Somaria']], + ["Turtle Rock - Compass Chest", True, ['Pegasus Boots', 'Magic Mirror', 'Moon Pearl', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)']], + ["Turtle Rock - Compass Chest", True, ['Pegasus Boots', 'Quake', 'Progressive Sword', 'Cane of Somaria']], + + ["Turtle Rock - Chain Chomps", False, []], + ["Turtle Rock - Chain Chomps", True, ['Pegasus Boots', 'Magic Mirror', 'Moon Pearl']], + + ["Turtle Rock - Crystaroller Room", False, []], + ["Turtle Rock - Crystaroller Room", True, ['Pegasus Boots', 'Magic Mirror', 'Moon Pearl', 'Big Key (Turtle Rock)']], + ["Turtle Rock - Crystaroller Room", True, ['Pegasus Boots', 'Magic Mirror', 'Moon Pearl', 'Lamp', 'Cane of Somaria']], + + ["Ganons Tower - Hope Room - Left", False, []], + ["Ganons Tower - Hope Room - Left", False, [], ['Crystal 1']], + ["Ganons Tower - Hope Room - Left", False, [], ['Crystal 2']], + ["Ganons Tower - Hope Room - Left", False, [], ['Crystal 3']], + ["Ganons Tower - Hope Room - Left", False, [], ['Crystal 4']], + ["Ganons Tower - Hope Room - Left", False, [], ['Crystal 5']], + ["Ganons Tower - Hope Room - Left", False, [], ['Crystal 6']], + ["Ganons Tower - Hope Room - Left", False, [], ['Crystal 7']], + ["Ganons Tower - Hope Room - Left", True, ['Beat Agahnim 1', 'Hookshot', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7']], + ["Ganons Tower - Hope Room - Left", True, ['Pegasus Boots', 'Magic Mirror', 'Hookshot', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7']], + ["Ganons Tower - Hope Room - Left", True, ['Pegasus Boots', 'Moon Pearl', 'Hookshot', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7']], + ]) \ No newline at end of file diff --git a/test/inverted_owg/TestInvertedOWG.py b/test/inverted_owg/TestInvertedOWG.py new file mode 100644 index 00000000..dc5d5484 --- /dev/null +++ b/test/inverted_owg/TestInvertedOWG.py @@ -0,0 +1,30 @@ +from BaseClasses import World +from Dungeons import create_dungeons, get_dungeon_item_pool +from EntranceShuffle import link_inverted_entrances +from InvertedRegions import create_inverted_regions +from ItemList import generate_itempool, difficulties +from Items import ItemFactory +from Regions import mark_light_world_regions +from Rules import set_rules +from test.TestBase import TestBase + + +class TestInvertedOWG(TestBase): + def setUp(self): + self.world = World(1, 'vanilla', 'owglitches', 'inverted', 'random', 'normal', 'normal', 'none', 'on', 'ganon', 'balanced', + True, False, False, False, False, False, False, False, False, None, + 'none', False) + self.world.difficulty_requirements = difficulties['normal'] + create_inverted_regions(self.world, 1) + create_dungeons(self.world, 1) + link_inverted_entrances(self.world, 1) + generate_itempool(self.world, 1) + self.world.required_medallions[1] = ['Ether', 'Quake'] + self.world.itempool.extend(get_dungeon_item_pool(self.world)) + self.world.itempool.extend(ItemFactory(['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1', 'Beat Agahnim 2', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7'], 1)) + self.world.get_location('Agahnim 1', 1).item = None + self.world.get_location('Agahnim 2', 1).item = None + self.world.precollected_items.clear() + self.world.itempool.append(ItemFactory('Pegasus Boots', 1)) + mark_light_world_regions(self.world) + set_rules(self.world, 1) diff --git a/test/inverted_owg/TestLightWorld.py b/test/inverted_owg/TestLightWorld.py new file mode 100644 index 00000000..ad833017 --- /dev/null +++ b/test/inverted_owg/TestLightWorld.py @@ -0,0 +1,312 @@ +from test.inverted_owg.TestInvertedOWG import TestInvertedOWG + + +class TestLightWorld(TestInvertedOWG): + + def testLightWorld(self): + self.run_location_tests([ + ["Master Sword Pedestal", False, []], + ["Master Sword Pedestal", False, [], ['Green Pendant']], + ["Master Sword Pedestal", False, [], ['Red Pendant']], + ["Master Sword Pedestal", False, [], ['Blue Pendant']], + ["Master Sword Pedestal", True, ['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Moon Pearl', 'Pegasus Boots']], + ["Master Sword Pedestal", True, ['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Magic Mirror', 'Pegasus Boots']], + + ["Link's Uncle", False, []], + ["Link's Uncle", False, [], ['Moon Pearl']], + ["Link's Uncle", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Secret Passage", False, []], + ["Secret Passage", False, [], ['Moon Pearl']], + ["Secret Passage", True, ['Moon Pearl', 'Pegasus Boots']], + + ["King's Tomb", False, []], + ["King's Tomb", False, [], ['Pegasus Boots']], + ["King's Tomb", False, [], ['Moon Pearl']], + ["King's Tomb", True, ['Pegasus Boots', 'Magic Mirror', 'Moon Pearl']], + + ["Floodgate Chest", False, []], + ["Floodgate Chest", False, [], ['Moon Pearl', 'Magic Mirror']], + ["Floodgate Chest", True, ['Moon Pearl', 'Pegasus Boots']], + ["Floodgate Chest", True, ['Magic Mirror', 'Pegasus Boots']], + + ["Kakariko Tavern", False, []], + ["Kakariko Tavern", False, [], ['Moon Pearl', 'Magic Mirror']], + ["Kakariko Tavern", True, ['Moon Pearl', 'Pegasus Boots']], + ["Kakariko Tavern", True, ['Magic Mirror', 'Pegasus Boots']], + ["Kakariko Tavern", True, ['Beat Agahnim 1', 'Moon Pearl']], + ["Kakariko Tavern", True, ['Beat Agahnim 1', 'Magic Mirror']], + + ["Chicken House", False, []], + ["Chicken House", False, [], ['Moon Pearl']], + ["Chicken House", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Aginah's Cave", False, []], + ["Aginah's Cave", False, [], ['Moon Pearl']], + ["Aginah's Cave", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Sahasrahla's Hut - Left", False, []], + ["Sahasrahla's Hut - Left", False, [], ['Moon Pearl', 'Magic Mirror']], + ["Sahasrahla's Hut - Left", False, [], ['Moon Pearl', 'Pegasus Boots']], + ["Sahasrahla's Hut - Left", True, ['Moon Pearl', 'Pegasus Boots']], + ["Sahasrahla's Hut - Left", True, ['Magic Mirror', 'Pegasus Boots']], + ##todo: Damage boost superbunny not in logic + #["Sahasrahla's Hut - Left", True, ['Beat Agahnim 1', 'Pegasus Boots']], + ["Sahasrahla's Hut - Left", True, ['Moon Pearl', 'Beat Agahnim 1']], + + ["Sahasrahla's Hut - Middle", False, []], + ["Sahasrahla's Hut - Middle", False, [], ['Moon Pearl', 'Magic Mirror']], + ["Sahasrahla's Hut - Middle", False, [], ['Moon Pearl', 'Pegasus Boots']], + ["Sahasrahla's Hut - Middle", True, ['Moon Pearl', 'Pegasus Boots']], + ["Sahasrahla's Hut - Middle", True, ['Magic Mirror', 'Pegasus Boots']], + #["Sahasrahla's Hut - Middle", True, ['Beat Agahnim 1', 'Pegasus Boots']], + ["Sahasrahla's Hut - Middle", True, ['Moon Pearl', 'Beat Agahnim 1']], + + ["Sahasrahla's Hut - Right", False, []], + ["Sahasrahla's Hut - Right", False, [], ['Moon Pearl', 'Magic Mirror']], + ["Sahasrahla's Hut - Right", False, [], ['Moon Pearl', 'Pegasus Boots']], + ["Sahasrahla's Hut - Right", True, ['Moon Pearl', 'Pegasus Boots']], + ["Sahasrahla's Hut - Right", True, ['Magic Mirror', 'Pegasus Boots']], + #["Sahasrahla's Hut - Right", True, ['Beat Agahnim 1', 'Pegasus Boots']], + ["Sahasrahla's Hut - Right", True, ['Moon Pearl', 'Beat Agahnim 1']], + + ["Kakariko Well - Top", False, []], + ["Kakariko Well - Top", False, [], ['Moon Pearl']], + ["Kakariko Well - Top", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Kakariko Well - Left", False, []], + ["Kakariko Well - Left", True, ['Moon Pearl', 'Pegasus Boots']], + ["Kakariko Well - Left", True, ['Magic Mirror', 'Pegasus Boots']], + ["Kakariko Well - Left", True, ['Progressive Glove', 'Progressive Glove', 'Pegasus Boots']], + ["Kakariko Well - Left", True, ['Beat Agahnim 1']], + + ["Kakariko Well - Middle", False, []], + ["Kakariko Well - Middle", True, ['Moon Pearl', 'Pegasus Boots']], + ["Kakariko Well - Middle", True, ['Magic Mirror', 'Pegasus Boots']], + ["Kakariko Well - Middle", True, ['Progressive Glove', 'Progressive Glove', 'Pegasus Boots']], + ["Kakariko Well - Middle", True, ['Beat Agahnim 1']], + + ["Kakariko Well - Right", False, []], + ["Kakariko Well - Right", True, ['Moon Pearl', 'Pegasus Boots']], + ["Kakariko Well - Right", True, ['Magic Mirror', 'Pegasus Boots']], + ["Kakariko Well - Right", True, ['Progressive Glove', 'Progressive Glove', 'Pegasus Boots']], + ["Kakariko Well - Right", True, ['Beat Agahnim 1']], + + ["Kakariko Well - Bottom", False, []], + ["Kakariko Well - Bottom", True, ['Moon Pearl', 'Pegasus Boots']], + ["Kakariko Well - Bottom", True, ['Magic Mirror', 'Pegasus Boots']], + ["Kakariko Well - Bottom", True, ['Progressive Glove', 'Progressive Glove', 'Pegasus Boots']], + ["Kakariko Well - Bottom", True, ['Beat Agahnim 1']], + + ["Blind's Hideout - Top", False, []], + ["Blind's Hideout - Top", False, [], ['Moon Pearl']], + ["Blind's Hideout - Top", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Blind's Hideout - Left", False, []], + ["Blind's Hideout - Left", False, [], ['Moon Pearl', 'Magic Mirror']], + ["Blind's Hideout - Left", True, ['Moon Pearl', 'Pegasus Boots']], + ["Blind's Hideout - Left", True, ['Magic Mirror', 'Pegasus Boots']], + ["Blind's Hideout - Left", True, ['Magic Mirror', 'Beat Agahnim 1']], + + ["Blind's Hideout - Right", False, []], + ["Blind's Hideout - Right", False, [], ['Moon Pearl', 'Magic Mirror']], + ["Blind's Hideout - Right", True, ['Moon Pearl', 'Pegasus Boots']], + ["Blind's Hideout - Right", True, ['Magic Mirror', 'Pegasus Boots']], + ["Blind's Hideout - Right", True, ['Magic Mirror', 'Beat Agahnim 1']], + + ["Blind's Hideout - Far Left", False, []], + ["Blind's Hideout - Far Left", False, [], ['Moon Pearl', 'Magic Mirror']], + ["Blind's Hideout - Far Left", True, ['Moon Pearl', 'Pegasus Boots']], + ["Blind's Hideout - Far Left", True, ['Magic Mirror', 'Pegasus Boots']], + ["Blind's Hideout - Far Left", True, ['Magic Mirror', 'Beat Agahnim 1']], + + ["Blind's Hideout - Far Right", False, []], + ["Blind's Hideout - Far Right", False, [], ['Moon Pearl', 'Magic Mirror']], + ["Blind's Hideout - Far Right", True, ['Moon Pearl', 'Pegasus Boots']], + ["Blind's Hideout - Far Right", True, ['Magic Mirror', 'Pegasus Boots']], + ["Blind's Hideout - Far Right", True, ['Magic Mirror', 'Beat Agahnim 1']], + + ["Bonk Rock Cave", False, []], + ["Bonk Rock Cave", False, [], ['Pegasus Boots']], + ["Bonk Rock Cave", False, [], ['Moon Pearl']], + ["Bonk Rock Cave", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Mini Moldorm Cave - Far Left", False, []], + ["Mini Moldorm Cave - Far Left", False, [], ['Moon Pearl']], + ["Mini Moldorm Cave - Far Left", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Mini Moldorm Cave - Left", False, []], + ["Mini Moldorm Cave - Left", False, [], ['Moon Pearl']], + ["Mini Moldorm Cave - Left", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Mini Moldorm Cave - Right", False, []], + ["Mini Moldorm Cave - Right", False, [], ['Moon Pearl']], + ["Mini Moldorm Cave - Right", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Mini Moldorm Cave - Far Right", False, []], + ["Mini Moldorm Cave - Far Right", False, [], ['Moon Pearl']], + ["Mini Moldorm Cave - Far Right", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Mini Moldorm Cave - Generous Guy", False, []], + ["Mini Moldorm Cave - Generous Guy", False, [], ['Moon Pearl']], + ["Mini Moldorm Cave - Generous Guy", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Ice Rod Cave", False, []], + ["Ice Rod Cave", False, [], ['Moon Pearl']], + ["Ice Rod Cave", True, ['Moon Pearl', 'Pegasus Boots']], + #I don't think so + #["Ice Rod Cave", True, ['Magic Mirror', 'Pegasus Boots', 'BigRedBomb']], + #["Ice Rod Cave", True, ['Magic Mirror', 'Beat Agahnim 1', 'BigRedBomb']], + + ["Bottle Merchant", False, []], + ["Bottle Merchant", True, ['Pegasus Boots', 'Magic Mirror']], + ["Bottle Merchant", True, ['Moon Pearl', 'Pegasus Boots']], + ["Bottle Merchant", True, ['Progressive Glove', 'Progressive Glove', 'Pegasus Boots']], + ["Bottle Merchant", True, ['Magic Mirror', 'Pegasus Boots']], + + ["Sahasrahla", False, []], + ["Sahasrahla", False, [], ['Green Pendant']], + ["Sahasrahla", True, ['Green Pendant', 'Magic Mirror', 'Pegasus Boots']], + ["Sahasrahla", True, ['Green Pendant', 'Moon Pearl', 'Pegasus Boots']], + ["Sahasrahla", True, ['Green Pendant', 'Magic Mirror', 'Pegasus Boots']], + ["Sahasrahla", True, ['Green Pendant', 'Progressive Glove', 'Progressive Glove', 'Pegasus Boots']], + + ["Magic Bat", False, []], + ["Magic Bat", False, [], ['Magic Powder']], + ["Magic Bat", False, [], ['Moon Pearl']], + ["Magic Bat", True, ['Magic Powder', 'Pegasus Boots', 'Moon Pearl']], + + ["Sick Kid", False, []], + ["Sick Kid", False, [], ['AnyBottle']], + ["Sick Kid", False, ['Bottle (Bee)']], + ["Sick Kid", False, ['Bottle (Fairy)']], + ["Sick Kid", False, ['Bottle (Red Potion)']], + ["Sick Kid", False, ['Bottle (Green Potion)']], + ["Sick Kid", False, ['Bottle (Blue Potion)']], + ["Sick Kid", False, ['Bottle']], + ["Sick Kid", False, ['Bottle (Good Bee)']], + ["Sick Kid", True, ['Bottle (Bee)', 'Magic Mirror', 'Pegasus Boots']], + ["Sick Kid", True, ['Bottle (Bee)', 'Moon Pearl', 'Pegasus Boots']], + ["Sick Kid", True, ['Bottle (Fairy)', 'Magic Mirror', 'Pegasus Boots']], + ["Sick Kid", True, ['Bottle (Fairy)', 'Moon Pearl', 'Pegasus Boots']], + ["Sick Kid", True, ['Bottle (Red Potion)', 'Magic Mirror', 'Pegasus Boots']], + ["Sick Kid", True, ['Bottle (Red Potion)', 'Moon Pearl', 'Pegasus Boots']], + ["Sick Kid", True, ['Bottle (Green Potion)', 'Magic Mirror', 'Pegasus Boots']], + ["Sick Kid", True, ['Bottle (Green Potion)', 'Moon Pearl', 'Pegasus Boots']], + ["Sick Kid", True, ['Bottle (Blue Potion)', 'Magic Mirror', 'Pegasus Boots']], + ["Sick Kid", True, ['Bottle (Blue Potion)', 'Moon Pearl', 'Pegasus Boots']], + ["Sick Kid", True, ['Bottle (Good Bee)', 'Magic Mirror', 'Pegasus Boots']], + ["Sick Kid", True, ['Bottle (Good Bee)', 'Moon Pearl', 'Pegasus Boots']], + ["Sick Kid", True, ['Bottle', 'Magic Mirror', 'Pegasus Boots']], + ["Sick Kid", True, ['Bottle', 'Moon Pearl', 'Pegasus Boots']], + ["Sick Kid", True, ['Bottle', 'Progressive Glove', 'Progressive Glove', 'Pegasus Boots']], + + ["Hobo", False, []], + ["Hobo", False, [], ['Moon Pearl']], + ["Hobo", True, ['Moon Pearl', 'Pegasus Boots']], + ["Hobo", True, ['Moon Pearl', 'Beat Agahnim 1']], + + ["Bombos Tablet", False, []], + ["Bombos Tablet", False, ['Progressive Sword'], ['Progressive Sword']], + ["Bombos Tablet", False, [], ['Book of Mudora']], + ["Bombos Tablet", True, ['Moon Pearl', 'Book of Mudora', 'Pegasus Boots', 'Progressive Sword', 'Progressive Sword']], + ["Bombos Tablet", True, ['Magic Mirror', 'Book of Mudora', 'Pegasus Boots', 'Progressive Sword', 'Progressive Sword']], + ["Bombos Tablet", True, ['Progressive Glove', 'Progressive Glove', 'Book of Mudora', 'Pegasus Boots', 'Progressive Sword', 'Progressive Sword']], + + ["King Zora", False, []], + ["King Zora", False, [], ['Moon Pearl']], + ["King Zora", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Lost Woods Hideout", False, []], + ["Lost Woods Hideout", False, [], ['Moon Pearl']], + ["Lost Woods Hideout", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Lumberjack Tree", False, []], + ["Lumberjack Tree", False, [], ['Beat Agahnim 1']], + ["Lumberjack Tree", False, [], ['Pegasus Boots']], + ["Lumberjack Tree", False, [], ['Moon Pearl']], + ["Lumberjack Tree", True, ['Pegasus Boots', 'Moon Pearl', 'Beat Agahnim 1']], + + ["Cave 45", False, []], + ["Cave 45", False, [], ['Moon Pearl', 'Magic Mirror']], + ["Cave 45", True, ['Moon Pearl', 'Pegasus Boots']], + ["Cave 45", True, ['Magic Mirror', 'Pegasus Boots']], + ["Cave 45", True, ['Magic Mirror', 'Beat Agahnim 1']], + + ["Graveyard Cave", False, []], + ["Graveyard Cave", False, [], ['Moon Pearl']], + ["Graveyard Cave", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Checkerboard Cave", False, []], + ["Checkerboard Cave", False, [], ['Progressive Glove']], + ["Checkerboard Cave", False, [], ['Moon Pearl']], + ["Checkerboard Cave", True, ['Progressive Glove', 'Pegasus Boots', 'Moon Pearl']], + + ["Library", False, []], + ["Library", False, [], ['Pegasus Boots']], + ["Library", False, [], ['Moon Pearl', 'Magic Mirror']], + ["Library", True, ['Pegasus Boots', 'Moon Pearl']], + ["Library", True, ['Pegasus Boots', 'Magic Mirror']], + + ["Mushroom", False, []], + ["Mushroom", False, [], ['Moon Pearl']], + ["Mushroom", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Potion Shop", False, []], + ["Potion Shop", False, [], ['Mushroom']], + ["Potion Shop", False, [], ['Moon Pearl']], + ["Potion Shop", True, ['Mushroom', 'Moon Pearl', 'Pegasus Boots']], + + ["Maze Race", False, []], + ["Maze Race", False, [], ['Moon Pearl']], + ["Maze Race", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Desert Ledge", False, []], + ["Desert Ledge", True, ['Book of Mudora', 'Magic Mirror', 'Pegasus Boots']], + ["Desert Ledge", True, ['Book of Mudora', 'Progressive Glove', 'Progressive Glove', 'Pegasus Boots']], + ["Desert Ledge", True, ['Book of Mudora', 'Beat Agahnim 1']], + ["Desert Ledge", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Lake Hylia Island", False, []], + ["Lake Hylia Island", False, [], ['Moon Pearl']], + ["Lake Hylia Island", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Sunken Treasure", False, []], + ["Sunken Treasure", False, [], ['Moon Pearl', 'Magic Mirror']], + ["Sunken Treasure", True, ['Moon Pearl', 'Pegasus Boots']], + ["Sunken Treasure", True, ['Magic Mirror', 'Pegasus Boots']], + ["Sunken Treasure", True, ['Magic Mirror', 'Beat Agahnim 1']], + + ["Zora's Ledge", False, []], + ["Zora's Ledge", False, [], ['Moon Pearl']], + ["Zora's Ledge", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Flute Spot", False, []], + ["Flute Spot", False, [], ['Shovel']], + ["Flute Spot", False, [], ['Moon Pearl']], + ["Flute Spot", True, ['Shovel', 'Moon Pearl', 'Pegasus Boots']], + + ["Waterfall Fairy - Left", False, []], + ["Waterfall Fairy - Left", False, [], ['Moon Pearl']], + ["Waterfall Fairy - Left", True, ['Moon Pearl', 'Pegasus Boots']], + ["Waterfall Fairy - Left", True, ['Moon Pearl', 'Beat Agahnim 1']], + ["Waterfall Fairy - Left", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], + ["Waterfall Fairy - Left", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], + + ["Waterfall Fairy - Right", False, []], + ["Waterfall Fairy - Right", False, [], ['Moon Pearl']], + ["Waterfall Fairy - Right", True, ['Moon Pearl', 'Pegasus Boots']], + ["Waterfall Fairy - Right", True, ['Moon Pearl', 'Beat Agahnim 1']], + ["Waterfall Fairy - Right", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], + ["Waterfall Fairy - Right", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], + + # Bomb Merchant is not a separate check, and is only used as part of the Pyramid Fairy rules + # ["Bomb Merchant", False, []], + # ["Bomb Merchant", False, [], ['Crystal 5']], + # ["Bomb Merchant", False, [], ['Crystal 6']], + # ["Bomb Merchant", True, ['Crystal 5', 'Crystal 6', 'Moon Pearl', 'Pegasus Boots']], + # ["Bomb Merchant", True, ['Crystal 5', 'Crystal 6', 'Magic Mirror', 'Pegasus Boots']], + # ["Bomb Merchant", True, ['Crystal 5', 'Crystal 6', 'Beat Agahnim 1']], + + ["Ganon", False, []], + ]) \ No newline at end of file diff --git a/test/inverted_owg/__init__.py b/test/inverted_owg/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/test/owg/TestDarkWorld.py b/test/owg/TestDarkWorld.py new file mode 100644 index 00000000..a5f9ed0f --- /dev/null +++ b/test/owg/TestDarkWorld.py @@ -0,0 +1,206 @@ +from test.owg.TestVanillaOWG import TestVanillaOWG + + +class TestDarkWorld(TestVanillaOWG): + + def testSouthDarkWorld(self): + self.run_location_tests([ + ["Hype Cave - Top", False, []], + ["Hype Cave - Top", False, [], ['Moon Pearl']], + ["Hype Cave - Top", True, ['Moon Pearl', 'Pegasus Boots']], + ["Hype Cave - Top", True, ['Moon Pearl', 'Beat Agahnim 1', 'Hammer']], + ["Hype Cave - Top", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], + ["Hype Cave - Top", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], + ["Hype Cave - Top", True, ['Moon Pearl', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + ["Hype Cave - Top", True, ['Moon Pearl', 'Beat Agahnim 1', 'Flippers', 'Hookshot']], + + ["Hype Cave - Middle Right", False, []], + ["Hype Cave - Middle Right", False, [], ['Moon Pearl']], + ["Hype Cave - Middle Right", True, ['Moon Pearl', 'Pegasus Boots']], + ["Hype Cave - Middle Right", True, ['Moon Pearl', 'Beat Agahnim 1', 'Hammer']], + ["Hype Cave - Middle Right", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], + ["Hype Cave - Middle Right", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], + ["Hype Cave - Middle Right", True, ['Moon Pearl', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + ["Hype Cave - Middle Right", True, ['Moon Pearl', 'Beat Agahnim 1', 'Flippers', 'Hookshot']], + + ["Hype Cave - Middle Left", False, []], + ["Hype Cave - Middle Left", False, [], ['Moon Pearl']], + ["Hype Cave - Middle Left", True, ['Moon Pearl', 'Pegasus Boots']], + ["Hype Cave - Middle Left", True, ['Moon Pearl', 'Beat Agahnim 1', 'Hammer']], + ["Hype Cave - Middle Left", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], + ["Hype Cave - Middle Left", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], + ["Hype Cave - Middle Left", True, ['Moon Pearl', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + ["Hype Cave - Middle Left", True, ['Moon Pearl', 'Beat Agahnim 1', 'Flippers', 'Hookshot']], + + ["Hype Cave - Bottom", False, []], + ["Hype Cave - Bottom", False, [], ['Moon Pearl']], + ["Hype Cave - Bottom", True, ['Moon Pearl', 'Pegasus Boots']], + ["Hype Cave - Bottom", True, ['Moon Pearl', 'Beat Agahnim 1', 'Hammer']], + ["Hype Cave - Bottom", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], + ["Hype Cave - Bottom", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], + ["Hype Cave - Bottom", True, ['Moon Pearl', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + ["Hype Cave - Bottom", True, ['Moon Pearl', 'Beat Agahnim 1', 'Flippers', 'Hookshot']], + + ["Hype Cave - Generous Guy", False, []], + ["Hype Cave - Generous Guy", False, [], ['Moon Pearl']], + ["Hype Cave - Generous Guy", True, ['Moon Pearl', 'Pegasus Boots']], + ["Hype Cave - Generous Guy", True, ['Moon Pearl', 'Beat Agahnim 1', 'Hammer']], + ["Hype Cave - Generous Guy", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], + ["Hype Cave - Generous Guy", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], + ["Hype Cave - Generous Guy", True, ['Moon Pearl', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + ["Hype Cave - Generous Guy", True, ['Moon Pearl', 'Beat Agahnim 1', 'Flippers', 'Hookshot']], + + ["Stumpy", False, []], + ["Stumpy", False, [], ['Moon Pearl']], + ["Stumpy", True, ['Moon Pearl', 'Pegasus Boots']], + ["Stumpy", True, ['Moon Pearl', 'Beat Agahnim 1', 'Hammer']], + ["Stumpy", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], + ["Stumpy", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], + ["Stumpy", True, ['Moon Pearl', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + ["Stumpy", True, ['Moon Pearl', 'Beat Agahnim 1', 'Flippers', 'Hookshot']], + + ["Digging Game", False, []], + ["Digging Game", False, [], ['Moon Pearl']], + ["Digging Game", True, ['Moon Pearl', 'Pegasus Boots']], + ["Digging Game", True, ['Moon Pearl', 'Beat Agahnim 1', 'Hammer']], + ["Digging Game", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], + ["Digging Game", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], + ["Digging Game", True, ['Moon Pearl', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + ["Digging Game", True, ['Moon Pearl', 'Beat Agahnim 1', 'Flippers', 'Hookshot']] + ]) + + def testEastDarkWorld(self): + self.run_location_tests([ + ["Catfish", False, []], + ["Catfish", False, [], ['Moon Pearl']], + ["Catfish", False, [], ['Progressive Glove', 'Pegasus Boots']], + ["Catfish", True, ['Moon Pearl', 'Pegasus Boots']], + ["Catfish", True, ['Moon Pearl', 'Beat Agahnim 1', 'Progressive Glove']], + ["Catfish", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], + ["Catfish", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Flippers']], + + ["Pyramid", False, []], + ["Pyramid", False, [], ['Beat Agahnim 1', 'Moon Pearl', 'Magic Mirror']], + ["Pyramid", False, [], ['Beat Agahnim 1', 'Moon Pearl', 'Pegasus Boots']], + ["Pyramid", True, ['Moon Pearl', 'Pegasus Boots']], + ["Pyramid", True, ['Magic Mirror', 'Pegasus Boots']], + ["Pyramid", True, ['Beat Agahnim 1']], + ["Pyramid", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], + ["Pyramid", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Flippers']], + + ["Pyramid Fairy - Left", False, []], + ["Pyramid Fairy - Left", False, [], ['Pegasus Boots', 'Moon Pearl', 'Beat Agahnim 1']], + ["Pyramid Fairy - Left", False, [], ['Pegasus Boots', 'Moon Pearl', 'Crystal 5']], + ["Pyramid Fairy - Left", False, [], ['Pegasus Boots', 'Moon Pearl', 'Crystal 6']], + ["Pyramid Fairy - Left", False, [], ['Magic Mirror', 'Crystal 5']], + ["Pyramid Fairy - Left", False, [], ['Magic Mirror', 'Crystal 6']], + ["Pyramid Fairy - Left", False, [], ['Magic Mirror', 'Moon Pearl']], + ["Pyramid Fairy - Left", True, ['Magic Mirror', 'Pegasus Boots']], + ["Pyramid Fairy - Left", True, ['Moon Pearl', 'Crystal 5', 'Crystal 6', 'Beat Agahnim 1', 'Hammer']], + ["Pyramid Fairy - Left", True, ['Moon Pearl', 'Crystal 5', 'Crystal 6', 'Progressive Glove', 'Hammer']], + ["Pyramid Fairy - Left", True, ['Moon Pearl', 'Crystal 5', 'Crystal 6', 'Beat Agahnim 1', 'Progressive Glove', 'Progressive Glove', 'Magic Mirror']], + ["Pyramid Fairy - Left", True, ['Moon Pearl', 'Crystal 5', 'Crystal 6', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot', 'Magic Mirror']], + ["Pyramid Fairy - Left", True, ['Moon Pearl', 'Crystal 5', 'Crystal 6', 'Beat Agahnim 1', 'Flippers', 'Hookshot', 'Magic Mirror']], + ["Pyramid Fairy - Left", True, ['Crystal 5', 'Crystal 6', 'Beat Agahnim 1', 'Ocarina', 'Magic Mirror']], + ["Pyramid Fairy - Left", True, ['Crystal 5', 'Crystal 6', 'Beat Agahnim 1', 'Progressive Glove', 'Lamp', 'Magic Mirror']], + + ["Pyramid Fairy - Right", False, []], + ["Pyramid Fairy - Right", False, [], ['Pegasus Boots', 'Moon Pearl', 'Beat Agahnim 1']], + ["Pyramid Fairy - Right", False, [], ['Pegasus Boots', 'Moon Pearl', 'Crystal 5']], + ["Pyramid Fairy - Right", False, [], ['Pegasus Boots', 'Moon Pearl', 'Crystal 6']], + ["Pyramid Fairy - Right", False, [], ['Magic Mirror', 'Crystal 5']], + ["Pyramid Fairy - Right", False, [], ['Magic Mirror', 'Crystal 6']], + ["Pyramid Fairy - Right", False, [], ['Magic Mirror', 'Moon Pearl']], + ["Pyramid Fairy - Right", True, ['Magic Mirror', 'Pegasus Boots']], + ["Pyramid Fairy - Right", True, ['Moon Pearl', 'Crystal 5', 'Crystal 6', 'Beat Agahnim 1', 'Hammer']], + ["Pyramid Fairy - Right", True, ['Moon Pearl', 'Crystal 5', 'Crystal 6', 'Progressive Glove', 'Hammer']], + ["Pyramid Fairy - Right", True, ['Moon Pearl', 'Crystal 5', 'Crystal 6', 'Beat Agahnim 1', 'Progressive Glove', 'Progressive Glove', 'Magic Mirror']], + ["Pyramid Fairy - Right", True, ['Moon Pearl', 'Crystal 5', 'Crystal 6', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot', 'Magic Mirror']], + ["Pyramid Fairy - Right", True, ['Moon Pearl', 'Crystal 5', 'Crystal 6', 'Beat Agahnim 1', 'Flippers', 'Hookshot', 'Magic Mirror']], + ["Pyramid Fairy - Right", True, ['Crystal 5', 'Crystal 6', 'Beat Agahnim 1', 'Ocarina', 'Magic Mirror']], + ["Pyramid Fairy - Right", True, ['Crystal 5', 'Crystal 6', 'Beat Agahnim 1', 'Progressive Glove', 'Lamp', 'Magic Mirror']], + + ["Ganon", False, []], + ["Ganon", False, [], ['Moon Pearl']], + ["Ganon", False, [], ['Beat Agahnim 2']], + ]) + + def testWestDarkWorld(self): + self.run_location_tests([ + ["Brewery", False, []], + ["Brewery", False, [], ['Moon Pearl']], + ["Brewery", False, [], ['Pegasus Boots', 'Magic Mirror', 'Hookshot', 'Progressive Glove']], + ["Brewery", True, ['Moon Pearl', 'Pegasus Boots']], + ["Brewery", True, ['Moon Pearl', 'Ocarina', 'Magic Mirror']], + ["Brewery", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], + ["Brewery", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], + ["Brewery", True, ['Moon Pearl', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + ["Brewery", True, ['Moon Pearl', 'Beat Agahnim 1', 'Flippers', 'Hookshot']], + + ["C-Shaped House", False, []], + ["C-Shaped House", False, [], ['Moon Pearl', 'Magic Mirror']], + ["C-Shaped House", True, ['Moon Pearl', 'Pegasus Boots']], + ["C-Shaped House", True, ['Magic Mirror', 'Pegasus Boots']], + ["C-Shaped House", True, ['Magic Mirror', 'Ocarina']], + ["C-Shaped House", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], + ["C-Shaped House", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], + ["C-Shaped House", True, ['Moon Pearl', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + ["C-Shaped House", True, ['Moon Pearl', 'Beat Agahnim 1', 'Flippers', 'Hookshot']], + + ["Chest Game", False, []], + ["Chest Game", False, [], ['Moon Pearl', 'Magic Mirror']], + ["Chest Game", True, ['Moon Pearl', 'Pegasus Boots']], + ["Chest Game", True, ['Magic Mirror', 'Pegasus Boots']], + ["Chest Game", True, ['Magic Mirror', 'Ocarina']], + ["Chest Game", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], + ["Chest Game", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], + ["Chest Game", True, ['Moon Pearl', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + ["Chest Game", True, ['Moon Pearl', 'Beat Agahnim 1', 'Flippers', 'Hookshot']], + + ["Peg Cave", False, []], + ["Peg Cave", False, [], ['Moon Pearl']], + ["Peg Cave", False, [], ['Hammer']], + ["Peg Cave", False, ['Progressive Glove'], ['Pegasus Boots', 'Progressive Glove']], + ["Peg Cave", True, ['Moon Pearl', 'Hammer', 'Pegasus Boots']], + ["Peg Cave", True, ['Moon Pearl', 'Hammer', 'Progressive Glove', 'Progressive Glove']], + + ["Bumper Cave Ledge", False, []], + ["Bumper Cave Ledge", False, [], ['Moon Pearl']], + ["Bumper Cave Ledge", False, [], ['Cape', 'Pegasus Boots']], + ["Bumper Cave Ledge", False, [], ['Progressive Glove', 'Pegasus Boots']], + ["Bumper Cave Ledge", True, ['Moon Pearl', 'Pegasus Boots']], + ["Bumper Cave Ledge", True, ['Moon Pearl', 'Cape', 'Progressive Glove', 'Progressive Glove']], + ["Bumper Cave Ledge", True, ['Moon Pearl', 'Cape', 'Progressive Glove', 'Hammer']], + ["Bumper Cave Ledge", True, ['Moon Pearl', 'Cape', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + + ["Blacksmith", False, []], + ["Blacksmith", False, ['Progressive Glove'], ['Progressive Glove']], + ["Blacksmith", False, [], ['Moon Pearl']], + ["Blacksmith", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], + + ["Purple Chest", False, []], + ["Purple Chest", False, ['Progressive Glove'], ['Progressive Glove']], + ["Purple Chest", False, [], ['Moon Pearl']], + ["Purple Chest", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']] + + + ]) + + def testMireArea(self): + self.run_location_tests([ + ["Mire Shed - Left", False, []], + ["Mire Shed - Left", False, ['Progressive Glove'], ['Progressive Glove', 'Pegasus Boots']], + ["Mire Shed - Left", False, [], ['Moon Pearl', 'Magic Mirror']], + ["Mire Shed - Left", False, [], ['Ocarina', 'Pegasus Boots']], + ["Mire Shed - Left", True, ['Moon Pearl', 'Ocarina', 'Progressive Glove', 'Progressive Glove']], + ["Mire Shed - Left", True, ['Moon Pearl', 'Pegasus Boots']], + ["Mire Shed - Left", True, ['Magic Mirror', 'Ocarina', 'Progressive Glove', 'Progressive Glove']], + + ["Mire Shed - Right", False, []], + ["Mire Shed - Right", False, [], ['Moon Pearl', 'Magic Mirror']], + ["Mire Shed - Right", False, ['Progressive Glove'], ['Progressive Glove', 'Pegasus Boots']], + ["Mire Shed - Right", False, [], ['Ocarina', 'Pegasus Boots']], + ["Mire Shed - Right", True, ['Moon Pearl', 'Pegasus Boots']], + ["Mire Shed - Right", True, ['Magic Mirror', 'Ocarina', 'Progressive Glove', 'Progressive Glove']], + ["Mire Shed - Right", True, ['Moon Pearl', 'Ocarina', 'Progressive Glove', 'Progressive Glove']], + ]) \ No newline at end of file diff --git a/test/owg/TestDeathMountain.py b/test/owg/TestDeathMountain.py new file mode 100644 index 00000000..60d1e7e5 --- /dev/null +++ b/test/owg/TestDeathMountain.py @@ -0,0 +1,201 @@ +from test.owg.TestVanillaOWG import TestVanillaOWG + + +class TestDeathMountain(TestVanillaOWG): + + def testWestDeathMountain(self): + self.run_location_tests([ + ["Ether Tablet", False, []], + ["Ether Tablet", False, ['Progressive Sword'], ['Progressive Sword']], + ["Ether Tablet", False, [], ['Book of Mudora']], + ["Ether Tablet", False, [], ['Pegasus Boots', 'Progressive Glove', 'Ocarina']], + ["Ether Tablet", False, [], ['Pegasus Boots', 'Lamp', 'Ocarina']], + ["Ether Tablet", False, [], ['Pegasus Boots', 'Magic Mirror', 'Hookshot']], + ["Ether Tablet", False, [], ['Pegasus Boots', 'Magic Mirror', 'Hammer']], + ["Ether Tablet", True, ['Pegasus Boots', 'Book of Mudora', 'Progressive Sword', 'Progressive Sword']], + ["Ether Tablet", True, ['Ocarina', 'Magic Mirror', 'Book of Mudora', 'Progressive Sword', 'Progressive Sword']], + ["Ether Tablet", True, ['Progressive Glove', 'Lamp', 'Magic Mirror', 'Book of Mudora', 'Progressive Sword', 'Progressive Sword']], + ["Ether Tablet", True, ['Ocarina', 'Hammer', 'Hookshot', 'Book of Mudora', 'Progressive Sword', 'Progressive Sword']], + ["Ether Tablet", True, ['Progressive Glove', 'Lamp', 'Hammer', 'Hookshot', 'Book of Mudora', 'Progressive Sword', 'Progressive Sword']], + + ["Old Man", False, []], + ["Old Man", False, [], ['Lamp']], + ["Old Man", False, [], ['Pegasus Boots', 'Progressive Glove', 'Ocarina']], + ["Old Man", True, ['Pegasus Boots', 'Lamp']], + ["Old Man", True, ['Ocarina', 'Lamp']], + ["Old Man", True, ['Progressive Glove', 'Lamp']], + + ["Spectacle Rock Cave", False, []], + ["Spectacle Rock Cave", False, [], ['Pegasus Boots', 'Progressive Glove', 'Ocarina']], + ["Spectacle Rock Cave", False, [], ['Pegasus Boots', 'Lamp', 'Ocarina']], + ["Spectacle Rock Cave", True, ['Pegasus Boots']], + ["Spectacle Rock Cave", True, ['Ocarina']], + ["Spectacle Rock Cave", True, ['Progressive Glove', 'Lamp']], + + ["Spectacle Rock", False, []], + ["Spectacle Rock", False, [], ['Pegasus Boots', 'Progressive Glove', 'Ocarina']], + ["Spectacle Rock", False, [], ['Pegasus Boots', 'Lamp', 'Ocarina']], + ["Spectacle Rock", False, [], ['Pegasus Boots', 'Magic Mirror']], + ["Spectacle Rock", True, ['Pegasus Boots']], + ["Spectacle Rock", True, ['Ocarina', 'Magic Mirror']], + ["Spectacle Rock", True, ['Progressive Glove', 'Lamp', 'Magic Mirror']], + ]) + + def testEastDeathMountain(self): + self.run_location_tests([ + ["Mimic Cave", False, []], + ["Mimic Cave", False, [], ['Magic Mirror']], + ["Mimic Cave", False, [], ['Hammer']], + ["Mimic Cave", False, [], ['Pegasus Boots', 'Ocarina', 'Lamp']], + ["Mimic Cave", False, [], ['Pegasus Boots', 'Ocarina', 'Progressive Glove']], + ["Mimic Cave", True, ['Magic Mirror', 'Hammer', 'Pegasus Boots']], + ["Mimic Cave", True, ['Magic Mirror', 'Hammer', 'Progressive Glove', 'Lamp']], + ["Mimic Cave", True, ['Magic Mirror', 'Hammer', 'Ocarina']], + + ["Spiral Cave", False, []], + ["Spiral Cave", False, [], ['Pegasus Boots', 'Progressive Glove', 'Ocarina']], + ["Spiral Cave", False, [], ['Pegasus Boots', 'Magic Mirror', 'Hookshot']], + ["Spiral Cave", True, ['Pegasus Boots']], + ["Spiral Cave", True, ['Ocarina', 'Hookshot']], + ["Spiral Cave", True, ['Progressive Glove', 'Lamp', 'Hookshot']], + ["Spiral Cave", True, ['Progressive Glove', 'Lamp', 'Magic Mirror']], + ["Spiral Cave", True, ['Ocarina', 'Magic Mirror']], + + ["Paradox Cave Lower - Far Left", False, []], + ["Paradox Cave Lower - Far Left", False, [], ['Pegasus Boots', 'Progressive Glove', 'Ocarina']], + ["Paradox Cave Lower - Far Left", False, [], ['Pegasus Boots', 'Magic Mirror', 'Hookshot']], + ["Paradox Cave Lower - Far Left", True, ['Pegasus Boots']], + ["Paradox Cave Lower - Far Left", True, ['Ocarina', 'Hookshot']], + ["Paradox Cave Lower - Far Left", True, ['Progressive Glove', 'Lamp', 'Hookshot']], + ["Paradox Cave Lower - Far Left", True, ['Progressive Glove', 'Lamp', 'Magic Mirror']], + ["Paradox Cave Lower - Far Left", True, ['Ocarina', 'Magic Mirror']], + + ["Paradox Cave Lower - Left", False, []], + ["Paradox Cave Lower - Left", False, [], ['Pegasus Boots', 'Progressive Glove', 'Ocarina']], + ["Paradox Cave Lower - Left", False, [], ['Pegasus Boots', 'Magic Mirror', 'Hookshot']], + ["Paradox Cave Lower - Left", True, ['Pegasus Boots']], + ["Paradox Cave Lower - Left", True, ['Ocarina', 'Hookshot']], + ["Paradox Cave Lower - Left", True, ['Progressive Glove', 'Lamp', 'Hookshot']], + ["Paradox Cave Lower - Left", True, ['Progressive Glove', 'Lamp', 'Magic Mirror']], + ["Paradox Cave Lower - Left", True, ['Ocarina', 'Magic Mirror']], + + ["Paradox Cave Lower - Middle", False, []], + ["Paradox Cave Lower - Middle", False, [], ['Pegasus Boots', 'Progressive Glove', 'Ocarina']], + ["Paradox Cave Lower - Middle", False, [], ['Pegasus Boots', 'Magic Mirror', 'Hookshot']], + ["Paradox Cave Lower - Middle", True, ['Pegasus Boots']], + ["Paradox Cave Lower - Middle", True, ['Ocarina', 'Hookshot']], + ["Paradox Cave Lower - Middle", True, ['Progressive Glove', 'Lamp', 'Hookshot']], + ["Paradox Cave Lower - Middle", True, ['Progressive Glove', 'Lamp', 'Magic Mirror']], + ["Paradox Cave Lower - Middle", True, ['Ocarina', 'Magic Mirror']], + + ["Paradox Cave Lower - Right", False, []], + ["Paradox Cave Lower - Right", False, [], ['Pegasus Boots', 'Progressive Glove', 'Ocarina']], + ["Paradox Cave Lower - Right", False, [], ['Pegasus Boots', 'Magic Mirror', 'Hookshot']], + ["Paradox Cave Lower - Right", True, ['Pegasus Boots']], + ["Paradox Cave Lower - Right", True, ['Ocarina', 'Hookshot']], + ["Paradox Cave Lower - Right", True, ['Progressive Glove', 'Lamp', 'Hookshot']], + ["Paradox Cave Lower - Right", True, ['Progressive Glove', 'Lamp', 'Magic Mirror']], + ["Paradox Cave Lower - Right", True, ['Ocarina', 'Magic Mirror']], + + ["Paradox Cave Lower - Far Right", False, []], + ["Paradox Cave Lower - Far Right", False, [], ['Pegasus Boots', 'Progressive Glove', 'Ocarina']], + ["Paradox Cave Lower - Far Right", False, [], ['Pegasus Boots', 'Magic Mirror', 'Hookshot']], + ["Paradox Cave Lower - Far Right", True, ['Pegasus Boots']], + ["Paradox Cave Lower - Far Right", True, ['Ocarina', 'Hookshot']], + ["Paradox Cave Lower - Far Right", True, ['Progressive Glove', 'Lamp', 'Hookshot']], + ["Paradox Cave Lower - Far Right", True, ['Progressive Glove', 'Lamp', 'Magic Mirror']], + ["Paradox Cave Lower - Far Right", True, ['Ocarina', 'Magic Mirror']], + + ["Paradox Cave Upper - Left", False, []], + ["Paradox Cave Upper - Left", False, [], ['Pegasus Boots', 'Progressive Glove', 'Ocarina']], + ["Paradox Cave Upper - Left", False, [], ['Pegasus Boots', 'Magic Mirror', 'Hookshot']], + ["Paradox Cave Upper - Left", True, ['Pegasus Boots']], + ["Paradox Cave Upper - Left", True, ['Ocarina', 'Hookshot']], + ["Paradox Cave Upper - Left", True, ['Progressive Glove', 'Lamp', 'Hookshot']], + ["Paradox Cave Upper - Left", True, ['Progressive Glove', 'Lamp', 'Magic Mirror']], + ["Paradox Cave Upper - Left", True, ['Ocarina', 'Magic Mirror']], + + ["Paradox Cave Upper - Right", False, []], + ["Paradox Cave Upper - Right", False, [], ['Pegasus Boots', 'Progressive Glove', 'Ocarina']], + ["Paradox Cave Upper - Right", False, [], ['Pegasus Boots', 'Magic Mirror', 'Hookshot']], + ["Paradox Cave Upper - Right", True, ['Pegasus Boots']], + ["Paradox Cave Upper - Right", True, ['Ocarina', 'Hookshot']], + ["Paradox Cave Upper - Right", True, ['Progressive Glove', 'Lamp', 'Hookshot']], + ["Paradox Cave Upper - Right", True, ['Progressive Glove', 'Lamp', 'Magic Mirror']], + ["Paradox Cave Upper - Right", True, ['Ocarina', 'Magic Mirror']], + ]) + + def testWestDarkWorldDeathMountain(self): + self.run_location_tests([ + ["Spike Cave", False, []], + ["Spike Cave", False, [], ['Progressive Glove']], + ["Spike Cave", False, [], ['Moon Pearl']], + ["Spike Cave", False, [], ['Hammer']], + ["Spike Cave", False, [], ['Cape', 'Cane of Byrna']], + ["Spike Cave", True, ['Bottle', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Lamp', 'Cape']], + ["Spike Cave", True, ['Bottle', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Ocarina', 'Cape']], + ["Spike Cave", True, ['Bottle', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Lamp', 'Cane of Byrna']], + ["Spike Cave", True, ['Bottle', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Ocarina', 'Cane of Byrna']], + ["Spike Cave", True, ['Magic Upgrade (1/2)', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Lamp', 'Cape']], + ["Spike Cave", True, ['Magic Upgrade (1/2)', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Ocarina', 'Cape']], + ["Spike Cave", True, ['Magic Upgrade (1/2)', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Lamp', 'Cane of Byrna']], + ["Spike Cave", True, ['Magic Upgrade (1/2)', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Ocarina', 'Cane of Byrna']], + ["Spike Cave", True, ['Magic Upgrade (1/4)', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Lamp', 'Cape']], + ["Spike Cave", True, ['Magic Upgrade (1/4)', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Ocarina', 'Cape']], + ["Spike Cave", True, ['Magic Upgrade (1/4)', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Lamp', 'Cane of Byrna']], + ["Spike Cave", True, ['Magic Upgrade (1/4)', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Ocarina', 'Cane of Byrna']], + ]) + + def testEastDarkWorldDeathMountain(self): + self.run_location_tests([ + ["Superbunny Cave - Top", False, []], + ["Superbunny Cave - Top", True, ['Progressive Glove', 'Progressive Glove', 'Pegasus Boots']], + ["Superbunny Cave - Top", True, ['Hammer', 'Pegasus Boots']], + ["Superbunny Cave - Top", True, ['Moon Pearl', 'Pegasus Boots']], + ["Superbunny Cave - Top", True, ['Progressive Glove', 'Progressive Glove', 'Hookshot', 'Ocarina']], + ["Superbunny Cave - Top", True, ['Progressive Glove', 'Progressive Glove', 'Magic Mirror', 'Hammer', 'Ocarina']], + ["Superbunny Cave - Top", True, ['Progressive Glove', 'Progressive Glove', 'Hookshot', 'Lamp']], + ["Superbunny Cave - Top", True, ['Progressive Glove', 'Progressive Glove', 'Magic Mirror', 'Hammer', 'Lamp']], + + ["Superbunny Cave - Bottom", False, []], + ["Superbunny Cave - Bottom", True, ['Progressive Glove', 'Progressive Glove', 'Pegasus Boots']], + ["Superbunny Cave - Bottom", True, ['Hammer', 'Pegasus Boots']], + ["Superbunny Cave - Bottom", True, ['Moon Pearl', 'Pegasus Boots']], + ["Superbunny Cave - Bottom", True, ['Progressive Glove', 'Progressive Glove', 'Hookshot', 'Ocarina']], + ["Superbunny Cave - Bottom", True, ['Progressive Glove', 'Progressive Glove', 'Magic Mirror', 'Hammer', 'Ocarina']], + ["Superbunny Cave - Bottom", True, ['Progressive Glove', 'Progressive Glove', 'Hookshot', 'Lamp']], + ["Superbunny Cave - Bottom", True, ['Progressive Glove', 'Progressive Glove', 'Magic Mirror', 'Hammer', 'Lamp']], + + ["Hookshot Cave - Bottom Right", False, []], + ["Hookshot Cave - Bottom Right", False, [], ['Progressive Glove', 'Pegasus Boots']], + ["Hookshot Cave - Bottom Right", False, [], ['Moon Pearl']], + ["Hookshot Cave - Bottom Right", True, ['Moon Pearl', 'Pegasus Boots']], + ["Hookshot Cave - Bottom Right", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Hookshot', 'Ocarina']], + ["Hookshot Cave - Bottom Right", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Magic Mirror', 'Hammer', 'Ocarina', 'Pegasus Boots']], + ["Hookshot Cave - Bottom Right", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Hookshot', 'Lamp']], + ["Hookshot Cave - Bottom Right", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Magic Mirror', 'Hammer', 'Lamp', 'Pegasus Boots']], + + ["Hookshot Cave - Bottom Left", False, []], + ["Hookshot Cave - Bottom Left", False, [], ['Progressive Glove', 'Pegasus Boots']], + ["Hookshot Cave - Bottom Left", False, [], ['Moon Pearl']], + ["Hookshot Cave - Bottom Left", False, [], ['Hookshot']], + ["Hookshot Cave - Bottom Left", True, ['Moon Pearl', 'Pegasus Boots', 'Hookshot']], + ["Hookshot Cave - Bottom Left", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Hookshot', 'Ocarina']], + ["Hookshot Cave - Bottom Left", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Hookshot', 'Lamp']], + + ["Hookshot Cave - Top Left", False, []], + ["Hookshot Cave - Top Left", False, [], ['Progressive Glove', 'Pegasus Boots']], + ["Hookshot Cave - Top Left", False, [], ['Moon Pearl']], + ["Hookshot Cave - Top Left", False, [], ['Hookshot']], + ["Hookshot Cave - Top Left", True, ['Moon Pearl', 'Pegasus Boots', 'Hookshot']], + ["Hookshot Cave - Top Left", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Hookshot', 'Ocarina']], + ["Hookshot Cave - Top Left", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Hookshot', 'Lamp']], + + ["Hookshot Cave - Top Right", False, []], + ["Hookshot Cave - Top Right", False, [], ['Progressive Glove', 'Pegasus Boots']], + ["Hookshot Cave - Top Right", False, [], ['Moon Pearl']], + ["Hookshot Cave - Top Right", False, [], ['Hookshot']], + ["Hookshot Cave - Top Right", True, ['Moon Pearl', 'Pegasus Boots', 'Hookshot']], + ["Hookshot Cave - Top Right", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Hookshot', 'Ocarina']], + ["Hookshot Cave - Top Right", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Hookshot', 'Lamp']], + ]) \ No newline at end of file diff --git a/test/owg/TestDungeons.py b/test/owg/TestDungeons.py new file mode 100644 index 00000000..7aba1082 --- /dev/null +++ b/test/owg/TestDungeons.py @@ -0,0 +1,132 @@ +from test.owg.TestVanillaOWG import TestVanillaOWG + + +class TestDungeons(TestVanillaOWG): + + def testFirstDungeonChests(self): + self.run_location_tests([ + ["Hyrule Castle - Map Chest", True, []], + + ["Sanctuary", True, []], + + ["Sewers - Secret Room - Left", False, []], + ["Sewers - Secret Room - Left", True, ['Progressive Glove']], + ["Sewers - Secret Room - Left", True, ['Lamp', 'Small Key (Escape)']], + + ["Eastern Palace - Compass Chest", True, []], + + ["Desert Palace - Map Chest", False, []], + ["Desert Palace - Map Chest", True, ['Pegasus Boots']], + ["Desert Palace - Map Chest", True, ['Book of Mudora']], + ["Desert Palace - Map Chest", True, ['Ocarina', 'Progressive Glove', 'Progressive Glove', 'Magic Mirror']], + + ["Desert Palace - Boss", False, []], + ["Desert Palace - Boss", False, [], ['Small Key (Desert Palace)']], + ["Desert Palace - Boss", False, [], ['Big Key (Desert Palace)']], + ["Desert Palace - Boss", False, [], ['Lamp', 'Fire Rod']], + ["Desert Palace - Boss", True, ['Progressive Sword', 'Small Key (Desert Palace)', 'Pegasus Boots', 'Lamp', 'Big Key (Desert Palace)']], + ["Desert Palace - Boss", True, ['Small Key (Desert Palace)', 'Pegasus Boots', 'Fire Rod', 'Big Key (Desert Palace)']], + + ["Tower of Hera - Basement Cage", False, []], + ["Tower of Hera - Basement Cage", False, [], ['Pegasus Boots', "Ocarina", "Progressive Glove"]], + ["Tower of Hera - Basement Cage", False, [], ['Pegasus Boots', "Ocarina", "Lamp"]], + ["Tower of Hera - Basement Cage", False, [], ['Pegasus Boots', "Magic Mirror", "Hammer"]], + ["Tower of Hera - Basement Cage", False, [], ['Pegasus Boots', "Magic Mirror", "Hookshot"]], + ["Tower of Hera - Basement Cage", True, ['Pegasus Boots']], + ["Tower of Hera - Basement Cage", True, ["Ocarina", "Magic Mirror"]], + ["Tower of Hera - Basement Cage", True, ["Progressive Glove", "Lamp", "Magic Mirror"]], + ["Tower of Hera - Basement Cage", True, ["Ocarina", "Hookshot", "Hammer"]], + ["Tower of Hera - Basement Cage", True, ["Progressive Glove", "Lamp", "Magic Mirror"]], + + ["Castle Tower - Room 03", False, []], + ["Castle Tower - Room 03", False, ['Progressive Sword'], ['Progressive Sword', 'Cape', 'Beat Agahnim 1']], + ["Castle Tower - Room 03", False, [], ['Progressive Sword', 'Hammer', 'Progressive Bow', 'Fire Rod', 'Ice Rod', 'Cane of Somaria', 'Cane of Byrna']], + ["Castle Tower - Room 03", True, ['Progressive Sword', 'Progressive Sword']], + ["Castle Tower - Room 03", True, ['Cape', 'Progressive Bow']], + ["Castle Tower - Room 03", True, ['Beat Agahnim 1', 'Fire Rod']], + + ["Palace of Darkness - Shooter Room", False, []], + ["Palace of Darkness - Shooter Room", False, [], ['Moon Pearl']], + ["Palace of Darkness - Shooter Room", True, ['Moon Pearl', 'Pegasus Boots']], + ["Palace of Darkness - Shooter Room", True, ['Moon Pearl', 'Beat Agahnim 1']], + ["Palace of Darkness - Shooter Room", True, ['Moon Pearl', 'Hammer', 'Progressive Glove']], + #todo: Qirn jump in logic? + #["Palace of Darkness - Shooter Room", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], + ["Palace of Darkness - Shooter Room", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Flippers']], + + ["Swamp Palace - Entrance", False, []], + ["Swamp Palace - Entrance", False, [], ['Magic Mirror']], + ["Swamp Palace - Entrance", False, [], ['Moon Pearl']], + ["Swamp Palace - Entrance", False, [], ['Flippers']], + ["Swamp Palace - Entrance", True, ['Magic Mirror', 'Moon Pearl', 'Flippers', 'Pegasus Boots']], + ["Swamp Palace - Entrance", True, ['Magic Mirror', 'Moon Pearl', 'Flippers', 'Ocarina']], + ["Swamp Palace - Entrance", True, ['Magic Mirror', 'Moon Pearl', 'Flippers', 'Hammer', 'Progressive Glove']], + ["Swamp Palace - Entrance", True, ['Magic Mirror', 'Moon Pearl', 'Flippers', 'Progressive Glove', 'Progressive Glove']], + + ["Skull Woods - Compass Chest", False, []], + ["Skull Woods - Compass Chest", True, ['Magic Mirror', 'Pegasus Boots']], + ["Skull Woods - Compass Chest", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Skull Woods - Big Chest", False, []], + ["Skull Woods - Big Chest", False, [], ['Big Key (Skull Woods)']], + #todo: Bomb Jump in logic? + #["Skull Woods - Big Chest", True, ['Magic Mirror', 'Pegasus Boots', 'Big Key (Skull Woods)']], + ["Skull Woods - Big Chest", True, ['Moon Pearl', 'Pegasus Boots', 'Big Key (Skull Woods)']], + + ["Skull Woods - Big Key Chest", False, []], + ["Skull Woods - Big Key Chest", True, ['Magic Mirror', 'Pegasus Boots']], + ["Skull Woods - Big Key Chest", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Skull Woods - Bridge Room", False, []], + ["Skull Woods - Bridge Room", False, [], ['Moon Pearl']], + ["Skull Woods - Bridge Room", False, [], ['Fire Rod']], + ["Skull Woods - Bridge Room", True, ['Moon Pearl', 'Pegasus Boots', 'Fire Rod']], + + ["Thieves' Town - Map Chest", False, []], + ["Thieves' Town - Map Chest", False, [], ['Moon Pearl']], + ["Thieves' Town - Map Chest", True, ['Moon Pearl', 'Pegasus Boots']], + + ["Ice Palace - Compass Chest", False, []], + ["Ice Palace - Compass Chest", False, [], ['Fire Rod', 'Bombos']], + ["Ice Palace - Compass Chest", False, [], ['Fire Rod', 'Progressive Sword']], + ["Ice Palace - Compass Chest", False, ['Progressive Glove'], ['Progressive Glove']], + #["Ice Palace - Compass Chest", True, ['Moon Pearl', 'Pegasus Boots', 'Flippers', 'Fire Rod']], + #["Ice Palace - Compass Chest", True, ['Moon Pearl', 'Pegasus Boots', 'Flippers', 'Bombos', 'Progressive Sword']], + ["Ice Palace - Compass Chest", True, ['Progressive Glove', 'Progressive Glove', 'Fire Rod']], + ["Ice Palace - Compass Chest", True, ['Progressive Glove', 'Progressive Glove', 'Bombos', 'Progressive Sword']], + + ["Misery Mire - Bridge Chest", False, []], + ["Misery Mire - Bridge Chest", False, [], ['Moon Pearl']], + ["Misery Mire - Bridge Chest", False, [], ['Ether']], + ["Misery Mire - Bridge Chest", False, [], ['Progressive Sword']], + ["Misery Mire - Bridge Chest", True, ['Moon Pearl', 'Pegasus Boots', 'Ether', 'Progressive Sword']], + + ["Turtle Rock - Compass Chest", False, []], + ["Turtle Rock - Compass Chest", False, [], ['Cane of Somaria']], + #todo: does clip require sword? + #["Turtle Rock - Compass Chest", True, ['Moon Pearl', 'Pegasus Boots', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)']], + ["Turtle Rock - Compass Chest", True, ['Moon Pearl', 'Pegasus Boots', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Progressive Sword']], + ["Turtle Rock - Compass Chest", True, ['Moon Pearl', 'Pegasus Boots', 'Cane of Somaria', 'Progressive Sword', 'Quake', 'Hammer']], + ["Turtle Rock - Compass Chest", True, ['Pegasus Boots', 'Magic Mirror', 'Hammer', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)']], + + ["Turtle Rock - Chain Chomps", False, []], + #todo: does clip require sword? + #["Turtle Rock - Chain Chomps", True, ['Moon Pearl', 'Pegasus Boots']], + ["Turtle Rock - Chain Chomps", True, ['Moon Pearl', 'Pegasus Boots', 'Progressive Sword']], + ["Turtle Rock - Chain Chomps", True, ['Pegasus Boots', 'Magic Mirror', 'Hammer']], + ["Turtle Rock - Chain Chomps", True, ['Pegasus Boots', 'Magic Mirror', 'Progressive Glove', 'Progressive Glove']], + + ["Turtle Rock - Crystaroller Room", False, []], + ["Turtle Rock - Crystaroller Room", False, [], ['Big Key (Turtle Rock)']], + #todo: does clip require sword? + #["Turtle Rock - Crystaroller Room", True, ['Moon Pearl', 'Pegasus Boots', 'Big Key (Turtle Rock)']], + ["Turtle Rock - Crystaroller Room", True, ['Moon Pearl', 'Pegasus Boots', 'Big Key (Turtle Rock)', 'Progressive Sword']], + ["Turtle Rock - Crystaroller Room", True, ['Moon Pearl', 'Pegasus Boots', 'Big Key (Turtle Rock)', 'Hookshot']], + ["Turtle Rock - Crystaroller Room", True, ['Pegasus Boots', 'Magic Mirror', 'Hammer', 'Big Key (Turtle Rock)']], + + ["Ganons Tower - Hope Room - Left", False, []], + ["Ganons Tower - Hope Room - Left", False, ['Moon Pearl', 'Crystal 1']], + ["Ganons Tower - Hope Room - Left", False, ['Pegasus Boots', 'Crystal 1']], + ["Ganons Tower - Hope Room - Left", True, ['Moon Pearl', 'Pegasus Boots']], + ["Ganons Tower - Hope Room - Left", True, ['Pegasus Boots', 'Hammer', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7']], + ]) \ No newline at end of file diff --git a/test/owg/TestLightWorld.py b/test/owg/TestLightWorld.py new file mode 100644 index 00000000..02ea2f3b --- /dev/null +++ b/test/owg/TestLightWorld.py @@ -0,0 +1,194 @@ +from test.owg.TestVanillaOWG import TestVanillaOWG + + +class TestLightWorld(TestVanillaOWG): + + def testLightWorld(self): + self.run_location_tests([ + ["Master Sword Pedestal", False, []], + ["Master Sword Pedestal", False, [], ['Green Pendant']], + ["Master Sword Pedestal", False, [], ['Red Pendant']], + ["Master Sword Pedestal", False, [], ['Blue Pendant']], + ["Master Sword Pedestal", True, ['Green Pendant', 'Red Pendant', 'Blue Pendant']], + + ["Link's Uncle", True, []], + + ["Secret Passage", True, []], + + ["King's Tomb", False, []], + ["King's Tomb", False, [], ['Pegasus Boots']], + ["King's Tomb", True, ['Pegasus Boots']], + + ["Floodgate Chest", True, []], + + ["Link's House", True, []], + + ["Kakariko Tavern", True, []], + + ["Chicken House", True, []], + + ["Aginah's Cave", True, []], + + ["Sahasrahla's Hut - Left", True, []], + + ["Sahasrahla's Hut - Middle", True, []], + + ["Sahasrahla's Hut - Right", True, []], + + ["Kakariko Well - Top", True, []], + + ["Kakariko Well - Left", True, []], + + ["Kakariko Well - Middle", True, []], + + ["Kakariko Well - Right", True, []], + + ["Kakariko Well - Bottom", True, []], + + ["Blind's Hideout - Top", True, []], + + ["Blind's Hideout - Left", True, []], + + ["Blind's Hideout - Right", True, []], + + ["Blind's Hideout - Far Left", True, []], + + ["Blind's Hideout - Far Right", True, []], + + ["Bonk Rock Cave", False, []], + ["Bonk Rock Cave", False, [], ['Pegasus Boots']], + ["Bonk Rock Cave", True, ['Pegasus Boots']], + + ["Mini Moldorm Cave - Far Left", True, []], + + ["Mini Moldorm Cave - Left", True, []], + + ["Mini Moldorm Cave - Right", True, []], + + ["Mini Moldorm Cave - Far Right", True, []], + + ["Ice Rod Cave", True, []], + + ["Bottle Merchant", True, []], + + ["Sahasrahla", False, []], + ["Sahasrahla", False, [], ['Green Pendant']], + ["Sahasrahla", True, ['Green Pendant']], + + ["Magic Bat", False, []], + ["Magic Bat", False, [], ['Magic Powder']], + ["Magic Bat", False, [], ['Pegasus Boots', 'Hammer', 'Magic Mirror']], + ["Magic Bat", False, [], ['Pegasus Boots', 'Hammer', 'Moon Pearl']], + ["Magic Bat", False, ['Progressive Glove'], ['Pegasus Boots', 'Hammer', 'Progressive Glove']], + ["Magic Bat", True, ['Magic Powder', 'Pegasus Boots']], + ["Magic Bat", True, ['Magic Powder', 'Hammer']], + ["Magic Bat", True, ['Magic Powder', 'Progressive Glove', 'Progressive Glove', 'Moon Pearl', 'Magic Mirror']], + + ["Sick Kid", False, []], + ["Sick Kid", False, [], ['AnyBottle']], + ["Sick Kid", True, ['Bottle (Bee)']], + ["Sick Kid", True, ['Bottle (Fairy)']], + ["Sick Kid", True, ['Bottle (Red Potion)']], + ["Sick Kid", True, ['Bottle (Green Potion)']], + ["Sick Kid", True, ['Bottle (Blue Potion)']], + ["Sick Kid", True, ['Bottle']], + ["Sick Kid", True, ['Bottle (Good Bee)']], + + ["Hobo", True, []], + + ["Bombos Tablet", False, []], + ["Bombos Tablet", False, ['Progressive Sword'], ['Progressive Sword']], + ["Bombos Tablet", False, [], ['Book of Mudora']], + ["Bombos Tablet", True, ['Pegasus Boots', 'Book of Mudora', 'Progressive Sword', 'Progressive Sword']], + + ["King Zora", True, []], + + ["Lost Woods Hideout", True, []], + + ["Lumberjack Tree", False, []], + ["Lumberjack Tree", False, [], ['Pegasus Boots']], + ["Lumberjack Tree", False, [], ['Beat Agahnim 1']], + ["Lumberjack Tree", True, ['Pegasus Boots', 'Beat Agahnim 1']], + + ["Cave 45", False, []], + ["Cave 45", False, [], ['Pegasus Boots', 'Magic Mirror']], + ["Cave 45", False, [], ['Pegasus Boots', 'Moon Pearl', 'Ocarina', 'Lamp']], + ["Cave 45", False, [], ['Pegasus Boots', 'Moon Pearl', 'Ocarina', 'Progressive Glove']], + ["Cave 45", True, ['Pegasus Boots']], + ["Cave 45", True, ['Ocarina', 'Magic Mirror']], + ["Cave 45", True, ['Progressive Glove', 'Lamp', 'Magic Mirror']], + ["Cave 45", True, ['Moon Pearl', 'Magic Mirror', 'Progressive Glove', 'Progressive Glove']], + ["Cave 45", True, ['Moon Pearl', 'Magic Mirror', 'Progressive Glove', 'Hammer']], + ["Cave 45", True, ['Moon Pearl', 'Magic Mirror', 'Beat Agahnim 1', 'Hammer']], + ["Cave 45", True, ['Moon Pearl', 'Magic Mirror', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + ["Cave 45", True, ['Moon Pearl', 'Magic Mirror', 'Beat Agahnim 1', 'Flippers', 'Hookshot']], + + ["Graveyard Cave", False, []], + ["Graveyard Cave", False, [], ['Pegasus Boots', 'Magic Mirror']], + ["Graveyard Cave", False, [], ['Pegasus Boots', 'Moon Pearl']], + ["Graveyard Cave", True, ['Pegasus Boots']], + ["Graveyard Cave", True, ['Moon Pearl', 'Magic Mirror', 'Progressive Glove', 'Progressive Glove']], + ["Graveyard Cave", True, ['Moon Pearl', 'Magic Mirror', 'Progressive Glove', 'Hammer']], + ["Graveyard Cave", True, ['Moon Pearl', 'Magic Mirror', 'Beat Agahnim 1', 'Hammer', 'Hookshot']], + ["Graveyard Cave", True, ['Moon Pearl', 'Magic Mirror', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + ["Graveyard Cave", True, ['Moon Pearl', 'Magic Mirror', 'Beat Agahnim 1', 'Flippers', 'Hookshot']], + + ["Checkerboard Cave", False, []], + ["Checkerboard Cave", False, [], ['Progressive Glove']], + ["Checkerboard Cave", False, [], ['Pegasus Boots', 'Ocarina']], + ["Checkerboard Cave", False, [], ['Pegasus Boots', 'Magic Mirror']], + ["Checkerboard Cave", True, ['Pegasus Boots', 'Progressive Glove']], + ["Checkerboard Cave", True, ['Ocarina', 'Magic Mirror', 'Progressive Glove', 'Progressive Glove']], + + ["Mini Moldorm Cave - Generous Guy", True, []], + + ["Library", False, []], + ["Library", False, [], ['Pegasus Boots']], + ["Library", True, ['Pegasus Boots']], + + ["Mushroom", True, []], + + ["Potion Shop", False, []], + ["Potion Shop", False, [], ['Mushroom']], + ["Potion Shop", True, ['Mushroom']], + + ["Maze Race", True, []], + + ["Desert Ledge", False, []], + ["Desert Ledge", False, [], ['Pegasus Boots', 'Book of Mudora', 'Ocarina']], + ["Desert Ledge", False, [], ['Pegasus Boots', 'Book of Mudora', 'Magic Mirror']], + ["Desert Ledge", False, ['Progressive Glove'], ['Pegasus Boots', 'Book of Mudora', 'Progressive Glove']], + ["Desert Ledge", True, ['Pegasus Boots']], + ["Desert Ledge", True, ['Book of Mudora']], + ["Desert Ledge", True, ['Ocarina', 'Magic Mirror', 'Progressive Glove', 'Progressive Glove']], + + ["Lake Hylia Island", False, []], + ["Lake Hylia Island", False, [], ['Pegasus Boots', 'Magic Mirror']], + ["Lake Hylia Island", False, [], ['Pegasus Boots', 'Moon Pearl']], + ["Lake Hylia Island", False, [], ['Pegasus Boots', 'Flippers']], + ["Lake Hylia Island", True, ['Pegasus Boots']], + ["Lake Hylia Island", True, ['Flippers', 'Moon Pearl', 'Magic Mirror', 'Progressive Glove', 'Progressive Glove']], + ["Lake Hylia Island", True, ['Flippers', 'Moon Pearl', 'Magic Mirror', 'Progressive Glove', 'Hammer']], + ["Lake Hylia Island", True, ['Flippers', 'Moon Pearl', 'Magic Mirror', 'Beat Agahnim 1']], + + ["Sunken Treasure", True, []], + + ["Zora's Ledge", False, []], + ["Zora's Ledge", False, [], ['Pegasus Boots', 'Flippers']], + ["Zora's Ledge", True, ['Pegasus Boots']], + ["Zora's Ledge", True, ['Flippers']], + + ["Flute Spot", False, []], + ["Flute Spot", False, [], ['Shovel']], + ["Flute Spot", True, ['Shovel']], + + ["Waterfall Fairy - Left", False, []], + ["Waterfall Fairy - Left", True, ['Flippers']], + ["Waterfall Fairy - Left", True, ['Moon Pearl']], + ["Waterfall Fairy - Left", True, ['Pegasus Boots']], + + ["Waterfall Fairy - Right", False, []], + ["Waterfall Fairy - Right", True, ['Flippers']], + ["Waterfall Fairy - Right", True, ['Moon Pearl']], + ["Waterfall Fairy - Right", True, ['Pegasus Boots']] + ]) \ No newline at end of file diff --git a/test/owg/TestVanillaOWG.py b/test/owg/TestVanillaOWG.py new file mode 100644 index 00000000..977f8790 --- /dev/null +++ b/test/owg/TestVanillaOWG.py @@ -0,0 +1,29 @@ +from BaseClasses import World +from Dungeons import create_dungeons, get_dungeon_item_pool +from EntranceShuffle import link_entrances +from InvertedRegions import mark_dark_world_regions +from ItemList import difficulties, generate_itempool +from Items import ItemFactory +from Regions import create_regions +from Rules import set_rules +from test.TestBase import TestBase + + +class TestVanillaOWG(TestBase): + def setUp(self): + self.world = World(1, 'vanilla', 'owglitches', 'open', 'random', 'normal', 'normal', 'none', 'on', 'ganon', 'balanced', True, 'items', + True, False, False, False, False, False, False, None, 'none', False) + self.world.difficulty_requirements = difficulties['normal'] + create_regions(self.world, 1) + create_dungeons(self.world, 1) + link_entrances(self.world, 1) + generate_itempool(self.world, 1) + self.world.required_medallions[1] = ['Ether', 'Quake'] + self.world.itempool.extend(get_dungeon_item_pool(self.world)) + self.world.itempool.extend(ItemFactory(['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1', 'Beat Agahnim 2', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7'], 1)) + self.world.get_location('Agahnim 1', 1).item = None + self.world.get_location('Agahnim 2', 1).item = None + self.world.precollected_items.clear() + self.world.itempool.append(ItemFactory('Pegasus Boots', 1)) + mark_dark_world_regions(self.world) + set_rules(self.world, 1) \ No newline at end of file diff --git a/test/owg/__init__.py b/test/owg/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/test/vanilla/TestDarkWorld.py b/test/vanilla/TestDarkWorld.py new file mode 100644 index 00000000..b5c331c7 --- /dev/null +++ b/test/vanilla/TestDarkWorld.py @@ -0,0 +1,166 @@ +from test.vanilla.TestVanilla import TestVanilla + + +class TestDarkWorld(TestVanilla): + + def testSouthDarkWorld(self): + self.run_location_tests([ + ["Hype Cave - Top", False, []], + ["Hype Cave - Top", False, [], ['Moon Pearl']], + ["Hype Cave - Top", True, ['Moon Pearl', 'Beat Agahnim 1', 'Hammer']], + ["Hype Cave - Top", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], + ["Hype Cave - Top", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], + ["Hype Cave - Top", True, ['Moon Pearl', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + ["Hype Cave - Top", True, ['Moon Pearl', 'Beat Agahnim 1', 'Flippers', 'Hookshot']], + + ["Hype Cave - Middle Right", False, []], + ["Hype Cave - Middle Right", False, [], ['Moon Pearl']], + ["Hype Cave - Middle Right", True, ['Moon Pearl', 'Beat Agahnim 1', 'Hammer']], + ["Hype Cave - Middle Right", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], + ["Hype Cave - Middle Right", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], + ["Hype Cave - Middle Right", True, ['Moon Pearl', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + ["Hype Cave - Middle Right", True, ['Moon Pearl', 'Beat Agahnim 1', 'Flippers', 'Hookshot']], + + ["Hype Cave - Middle Left", False, []], + ["Hype Cave - Middle Left", False, [], ['Moon Pearl']], + ["Hype Cave - Middle Left", True, ['Moon Pearl', 'Beat Agahnim 1', 'Hammer']], + ["Hype Cave - Middle Left", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], + ["Hype Cave - Middle Left", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], + ["Hype Cave - Middle Left", True, ['Moon Pearl', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + ["Hype Cave - Middle Left", True, ['Moon Pearl', 'Beat Agahnim 1', 'Flippers', 'Hookshot']], + + ["Hype Cave - Bottom", False, []], + ["Hype Cave - Bottom", False, [], ['Moon Pearl']], + ["Hype Cave - Bottom", True, ['Moon Pearl', 'Beat Agahnim 1', 'Hammer']], + ["Hype Cave - Bottom", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], + ["Hype Cave - Bottom", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], + ["Hype Cave - Bottom", True, ['Moon Pearl', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + ["Hype Cave - Bottom", True, ['Moon Pearl', 'Beat Agahnim 1', 'Flippers', 'Hookshot']], + + ["Hype Cave - Generous Guy", False, []], + ["Hype Cave - Generous Guy", False, [], ['Moon Pearl']], + ["Hype Cave - Generous Guy", True, ['Moon Pearl', 'Beat Agahnim 1', 'Hammer']], + ["Hype Cave - Generous Guy", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], + ["Hype Cave - Generous Guy", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], + ["Hype Cave - Generous Guy", True, ['Moon Pearl', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + ["Hype Cave - Generous Guy", True, ['Moon Pearl', 'Beat Agahnim 1', 'Flippers', 'Hookshot']], + + ["Stumpy", False, []], + ["Stumpy", False, [], ['Moon Pearl']], + ["Stumpy", True, ['Moon Pearl', 'Beat Agahnim 1', 'Hammer']], + ["Stumpy", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], + ["Stumpy", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], + ["Stumpy", True, ['Moon Pearl', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + ["Stumpy", True, ['Moon Pearl', 'Beat Agahnim 1', 'Flippers', 'Hookshot']], + + ["Digging Game", False, []], + ["Digging Game", False, [], ['Moon Pearl']], + ["Digging Game", True, ['Moon Pearl', 'Beat Agahnim 1', 'Hammer']], + ["Digging Game", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], + ["Digging Game", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], + ["Digging Game", True, ['Moon Pearl', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + ["Digging Game", True, ['Moon Pearl', 'Beat Agahnim 1', 'Flippers', 'Hookshot']] + ]) + + def testWestDarkWorld(self): + self.run_location_tests([ + ["Brewery", False, []], + ["Brewery", False, [], ['Moon Pearl']], + ["Brewery", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], + ["Brewery", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], + ["Brewery", True, ['Moon Pearl', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + ["Brewery", True, ['Moon Pearl', 'Beat Agahnim 1', 'Flippers', 'Hookshot']], + + ["C-Shaped House", False, []], + ["C-Shaped House", False, [], ['Moon Pearl']], + ["C-Shaped House", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], + ["C-Shaped House", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], + ["C-Shaped House", True, ['Moon Pearl', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + ["C-Shaped House", True, ['Moon Pearl', 'Beat Agahnim 1', 'Flippers', 'Hookshot']], + + ["Chest Game", False, []], + ["Chest Game", False, [], ['Moon Pearl']], + ["Chest Game", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], + ["Chest Game", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], + ["Chest Game", True, ['Moon Pearl', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + ["Chest Game", True, ['Moon Pearl', 'Beat Agahnim 1', 'Flippers', 'Hookshot']], + + ["Peg Cave", False, []], + ["Peg Cave", False, [], ['Moon Pearl']], + ["Peg Cave", False, [], ['Hammer']], + ["Peg Cave", False, [], ['Progressive Glove']], + ["Peg Cave", True, ['Moon Pearl', 'Hammer', 'Progressive Glove', 'Progressive Glove']], + + ["Bumper Cave Ledge", False, []], + ["Bumper Cave Ledge", False, [], ['Moon Pearl']], + ["Bumper Cave Ledge", False, [], ['Cape']], + ["Bumper Cave Ledge", False, [], ['Progressive Glove']], + ["Bumper Cave Ledge", True, ['Moon Pearl', 'Cape', 'Progressive Glove', 'Progressive Glove']], + ["Bumper Cave Ledge", True, ['Moon Pearl', 'Cape', 'Progressive Glove', 'Hammer']], + ["Bumper Cave Ledge", True, ['Moon Pearl', 'Cape', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + + ["Blacksmith", False, []], + ["Blacksmith", False, [], ['Progressive Glove']], + ["Blacksmith", False, [], ['Moon Pearl']], + ["Blacksmith", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], + + ["Purple Chest", False, []], + ["Purple Chest", False, [], ['Progressive Glove']], + ["Purple Chest", False, [], ['Moon Pearl']], + ["Purple Chest", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']] + ]) + + def testEastDarkWorld(self): + self.run_location_tests([ + ["Catfish", False, []], + ["Catfish", False, [], ['Progressive Glove']], + ["Catfish", False, [], ['Moon Pearl']], + ["Catfish", True, ['Moon Pearl', 'Beat Agahnim 1', 'Progressive Glove']], + ["Catfish", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], + ["Catfish", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Flippers']], + + ["Pyramid", False, []], + ["Pyramid", False, [], ['Beat Agahnim 1', 'Moon Pearl']], + ["Pyramid", True, ['Beat Agahnim 1']], + ["Pyramid", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], + ["Pyramid", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Flippers']], + + ["Pyramid Fairy - Left", False, []], + ["Pyramid Fairy - Left", False, [], ['Moon Pearl']], + ["Pyramid Fairy - Left", False, [], ['Crystal 5']], + ["Pyramid Fairy - Left", False, [], ['Crystal 6']], + ["Pyramid Fairy - Left", True, ['Moon Pearl', 'Crystal 5', 'Crystal 6', 'Beat Agahnim 1', 'Hammer']], + ["Pyramid Fairy - Left", True, ['Moon Pearl', 'Crystal 5', 'Crystal 6', 'Progressive Glove', 'Hammer']], + ["Pyramid Fairy - Left", True, ['Moon Pearl', 'Crystal 5', 'Crystal 6', 'Beat Agahnim 1', 'Progressive Glove', 'Progressive Glove', 'Magic Mirror']], + ["Pyramid Fairy - Left", True, ['Moon Pearl', 'Crystal 5', 'Crystal 6', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot', 'Magic Mirror']], + ["Pyramid Fairy - Left", True, ['Moon Pearl', 'Crystal 5', 'Crystal 6', 'Beat Agahnim 1', 'Flippers', 'Hookshot', 'Magic Mirror']], + + ["Pyramid Fairy - Right", False, []], + ["Pyramid Fairy - Right", False, [], ['Moon Pearl']], + ["Pyramid Fairy - Right", False, [], ['Crystal 5']], + ["Pyramid Fairy - Right", False, [], ['Crystal 6']], + ["Pyramid Fairy - Right", True, ['Moon Pearl', 'Crystal 5', 'Crystal 6', 'Beat Agahnim 1', 'Hammer']], + ["Pyramid Fairy - Right", True, ['Moon Pearl', 'Crystal 5', 'Crystal 6', 'Progressive Glove', 'Hammer']], + ["Pyramid Fairy - Right", True, ['Moon Pearl', 'Crystal 5', 'Crystal 6', 'Beat Agahnim 1', 'Progressive Glove', 'Progressive Glove', 'Magic Mirror']], + ["Pyramid Fairy - Right", True, ['Moon Pearl', 'Crystal 5', 'Crystal 6', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot', 'Magic Mirror']], + ["Pyramid Fairy - Right", True, ['Moon Pearl', 'Crystal 5', 'Crystal 6', 'Beat Agahnim 1', 'Flippers', 'Hookshot', 'Magic Mirror']], + + ["Ganon", False, []], + ["Ganon", False, [], ['Moon Pearl']], + ["Ganon", False, [], ['Beat Agahnim 2']], + ]) + + def testMireArea(self): + self.run_location_tests([ + ["Mire Shed - Left", False, []], + ["Mire Shed - Left", False, [], ['Progressive Glove']], + ["Mire Shed - Left", False, [], ['Moon Pearl']], + ["Mire Shed - Left", False, [], ['Ocarina']], + ["Mire Shed - Left", True, ['Moon Pearl', 'Ocarina', 'Progressive Glove', 'Progressive Glove']], + + ["Mire Shed - Right", False, []], + ["Mire Shed - Right", False, [], ['Progressive Glove']], + ["Mire Shed - Right", False, [], ['Moon Pearl']], + ["Mire Shed - Right", False, [], ['Ocarina']], + ["Mire Shed - Right", True, ['Moon Pearl', 'Ocarina', 'Progressive Glove', 'Progressive Glove']], + ]) diff --git a/test/vanilla/TestDeathMountain.py b/test/vanilla/TestDeathMountain.py new file mode 100644 index 00000000..cac104d0 --- /dev/null +++ b/test/vanilla/TestDeathMountain.py @@ -0,0 +1,230 @@ +from test.vanilla.TestVanilla import TestVanilla + + +class TestDeathMountain(TestVanilla): + + def testWestDeathMountain(self): + self.run_location_tests([ + ["Ether Tablet", False, []], + ["Ether Tablet", False, [], ['Progressive Glove', 'Ocarina']], + ["Ether Tablet", False, [], ['Lamp', 'Ocarina']], + ["Ether Tablet", False, [], ['Magic Mirror', 'Hookshot']], + ["Ether Tablet", False, [], ['Magic Mirror', 'Hammer']], + ["Ether Tablet", False, ['Progressive Sword'], ['Progressive Sword']], + ["Ether Tablet", False, [], ['Book of Mudora']], + ["Ether Tablet", True, ['Ocarina', 'Magic Mirror', 'Book of Mudora', 'Progressive Sword', 'Progressive Sword']], + ["Ether Tablet", True, ['Progressive Glove', 'Lamp', 'Magic Mirror', 'Book of Mudora', 'Progressive Sword', 'Progressive Sword']], + ["Ether Tablet", True, ['Ocarina', 'Hammer', 'Hookshot', 'Book of Mudora', 'Progressive Sword', 'Progressive Sword']], + ["Ether Tablet", True, ['Progressive Glove', 'Lamp', 'Hammer', 'Hookshot', 'Book of Mudora', 'Progressive Sword', 'Progressive Sword']], + + ["Old Man", False, []], + ["Old Man", False, [], ['Progressive Glove', 'Ocarina']], + ["Old Man", False, [], ['Lamp']], + ["Old Man", True, ['Ocarina', 'Lamp']], + ["Old Man", True, ['Progressive Glove', 'Lamp']], + + ["Spectacle Rock Cave", False, []], + ["Spectacle Rock Cave", False, [], ['Progressive Glove', 'Ocarina']], + ["Spectacle Rock Cave", False, [], ['Lamp', 'Ocarina']], + ["Spectacle Rock Cave", True, ['Ocarina']], + ["Spectacle Rock Cave", True, ['Progressive Glove', 'Lamp']], + + ["Spectacle Rock", False, []], + ["Spectacle Rock", False, [], ['Progressive Glove', 'Ocarina']], + ["Spectacle Rock", False, [], ['Lamp', 'Ocarina']], + ["Spectacle Rock", False, [], ['Magic Mirror']], + ["Spectacle Rock", True, ['Ocarina', 'Magic Mirror']], + ["Spectacle Rock", True, ['Progressive Glove', 'Lamp', 'Magic Mirror']], + ]) + + def testEastDeathMountain(self): + self.run_location_tests([ + ["Mimic Cave", False, []], + ["Mimic Cave", False, [], ['Quake']], + ["Mimic Cave", False, [], ['Progressive Sword']], + ["Mimic Cave", False, ['Progressive Glove'], ['Progressive Glove']], + ["Mimic Cave", False, [], ['Hammer']], + ["Mimic Cave", False, [], ['Magic Mirror']], + ["Mimic Cave", False, [], ['Moon Pearl']], + ["Mimic Cave", False, [], ['Cane of Somaria']], + ["Mimic Cave", False, ['Small Key (Turtle Rock)'], ['Small Key (Turtle Rock)']], + ["Mimic Cave", True, ['Quake', 'Progressive Sword', 'Ocarina', 'Progressive Glove', 'Progressive Glove', 'Hammer', 'Moon Pearl', 'Cane of Somaria', 'Magic Mirror', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)']], + + ["Spiral Cave", False, []], + ["Spiral Cave", False, [], ['Progressive Glove', 'Ocarina']], + ["Spiral Cave", False, [], ['Magic Mirror', 'Hammer', 'Hookshot']], + ["Spiral Cave", False, [], ['Magic Mirror', 'Hookshot']], + ["Spiral Cave", False, [], ['Hammer', 'Hookshot']], + ["Spiral Cave", False, ['Progressive Glove', 'Lamp', 'Magic Mirror']], + ["Spiral Cave", False, ['Progressive Glove', 'Hookshot']], + ["Spiral Cave", False, ['Ocarina', 'Magic Mirror']], + ["Spiral Cave", False, ['Ocarina', 'Hammer']], + ["Spiral Cave", True, ['Ocarina', 'Hookshot']], + ["Spiral Cave", True, ['Progressive Glove', 'Lamp', 'Hookshot']], + ["Spiral Cave", True, ['Progressive Glove', 'Lamp', 'Magic Mirror', 'Hammer']], + ["Spiral Cave", True, ['Ocarina', 'Magic Mirror', 'Hammer']], + + ["Paradox Cave Lower - Far Left", False, []], + ["Paradox Cave Lower - Far Left", False, [], ['Progressive Glove', 'Ocarina']], + ["Paradox Cave Lower - Far Left", False, [], ['Magic Mirror', 'Hammer', 'Hookshot']], + ["Paradox Cave Lower - Far Left", False, [], ['Magic Mirror', 'Hookshot']], + ["Paradox Cave Lower - Far Left", False, [], ['Hammer', 'Hookshot']], + ["Paradox Cave Lower - Far Left", False, ['Progressive Glove', 'Lamp', 'Magic Mirror']], + ["Paradox Cave Lower - Far Left", False, ['Progressive Glove', 'Hookshot']], + ["Paradox Cave Lower - Far Left", False, ['Ocarina', 'Magic Mirror']], + ["Paradox Cave Lower - Far Left", False, ['Ocarina', 'Hammer']], + ["Paradox Cave Lower - Far Left", True, ['Ocarina', 'Hookshot']], + ["Paradox Cave Lower - Far Left", True, ['Progressive Glove', 'Lamp', 'Hookshot']], + ["Paradox Cave Lower - Far Left", True, ['Progressive Glove', 'Lamp', 'Magic Mirror', 'Hammer']], + ["Paradox Cave Lower - Far Left", True, ['Ocarina', 'Magic Mirror', 'Hammer']], + + ["Paradox Cave Lower - Left", False, []], + ["Paradox Cave Lower - Left", False, [], ['Progressive Glove', 'Ocarina']], + ["Paradox Cave Lower - Left", False, [], ['Magic Mirror', 'Hammer', 'Hookshot']], + ["Paradox Cave Lower - Left", False, [], ['Magic Mirror', 'Hookshot']], + ["Paradox Cave Lower - Left", False, [], ['Hammer', 'Hookshot']], + ["Paradox Cave Lower - Left", False, ['Progressive Glove', 'Lamp', 'Magic Mirror']], + ["Paradox Cave Lower - Left", False, ['Progressive Glove', 'Hookshot']], + ["Paradox Cave Lower - Left", False, ['Ocarina', 'Magic Mirror']], + ["Paradox Cave Lower - Left", False, ['Ocarina', 'Hammer']], + ["Paradox Cave Lower - Left", True, ['Ocarina', 'Hookshot']], + ["Paradox Cave Lower - Left", True, ['Progressive Glove', 'Lamp', 'Hookshot']], + ["Paradox Cave Lower - Left", True, ['Progressive Glove', 'Lamp', 'Magic Mirror', 'Hammer']], + ["Paradox Cave Lower - Left", True, ['Ocarina', 'Magic Mirror', 'Hammer']], + + ["Paradox Cave Lower - Middle", False, []], + ["Paradox Cave Lower - Middle", False, [], ['Progressive Glove', 'Ocarina']], + ["Paradox Cave Lower - Middle", False, [], ['Magic Mirror', 'Hammer', 'Hookshot']], + ["Paradox Cave Lower - Middle", False, [], ['Magic Mirror', 'Hookshot']], + ["Paradox Cave Lower - Middle", False, [], ['Hammer', 'Hookshot']], + ["Paradox Cave Lower - Middle", False, ['Progressive Glove', 'Lamp', 'Magic Mirror']], + ["Paradox Cave Lower - Middle", False, ['Progressive Glove', 'Hookshot']], + ["Paradox Cave Lower - Middle", False, ['Ocarina', 'Magic Mirror']], + ["Paradox Cave Lower - Middle", False, ['Ocarina', 'Hammer']], + ["Paradox Cave Lower - Middle", True, ['Ocarina', 'Hookshot']], + ["Paradox Cave Lower - Middle", True, ['Progressive Glove', 'Lamp', 'Hookshot']], + ["Paradox Cave Lower - Middle", True, ['Progressive Glove', 'Lamp', 'Magic Mirror', 'Hammer']], + ["Paradox Cave Lower - Middle", True, ['Ocarina', 'Magic Mirror', 'Hammer']], + + ["Paradox Cave Lower - Right", False, []], + ["Paradox Cave Lower - Right", False, [], ['Progressive Glove', 'Ocarina']], + ["Paradox Cave Lower - Right", False, [], ['Magic Mirror', 'Hammer', 'Hookshot']], + ["Paradox Cave Lower - Right", False, [], ['Magic Mirror', 'Hookshot']], + ["Paradox Cave Lower - Right", False, [], ['Hammer', 'Hookshot']], + ["Paradox Cave Lower - Right", False, ['Progressive Glove', 'Lamp', 'Magic Mirror']], + ["Paradox Cave Lower - Right", False, ['Progressive Glove', 'Hookshot']], + ["Paradox Cave Lower - Right", False, ['Ocarina', 'Magic Mirror']], + ["Paradox Cave Lower - Right", False, ['Ocarina', 'Hammer']], + ["Paradox Cave Lower - Right", True, ['Ocarina', 'Hookshot']], + ["Paradox Cave Lower - Right", True, ['Progressive Glove', 'Lamp', 'Hookshot']], + ["Paradox Cave Lower - Right", True, ['Progressive Glove', 'Lamp', 'Magic Mirror', 'Hammer']], + ["Paradox Cave Lower - Right", True, ['Ocarina', 'Magic Mirror', 'Hammer']], + + ["Paradox Cave Lower - Far Right", False, []], + ["Paradox Cave Lower - Far Right", False, [], ['Progressive Glove', 'Ocarina']], + ["Paradox Cave Lower - Far Right", False, [], ['Magic Mirror', 'Hammer', 'Hookshot']], + ["Paradox Cave Lower - Far Right", False, [], ['Magic Mirror', 'Hookshot']], + ["Paradox Cave Lower - Far Right", False, [], ['Hammer', 'Hookshot']], + ["Paradox Cave Lower - Far Right", False, ['Progressive Glove', 'Lamp', 'Magic Mirror']], + ["Paradox Cave Lower - Far Right", False, ['Progressive Glove', 'Hookshot']], + ["Paradox Cave Lower - Far Right", False, ['Ocarina', 'Magic Mirror']], + ["Paradox Cave Lower - Far Right", False, ['Ocarina', 'Hammer']], + ["Paradox Cave Lower - Far Right", True, ['Ocarina', 'Hookshot']], + ["Paradox Cave Lower - Far Right", True, ['Progressive Glove', 'Lamp', 'Hookshot']], + ["Paradox Cave Lower - Far Right", True, ['Progressive Glove', 'Lamp', 'Magic Mirror', 'Hammer']], + ["Paradox Cave Lower - Far Right", True, ['Ocarina', 'Magic Mirror', 'Hammer']], + + ["Paradox Cave Upper - Left", False, []], + ["Paradox Cave Upper - Left", False, [], ['Progressive Glove', 'Ocarina']], + ["Paradox Cave Upper - Left", False, [], ['Magic Mirror', 'Hammer', 'Hookshot']], + ["Paradox Cave Upper - Left", False, [], ['Magic Mirror', 'Hookshot']], + ["Paradox Cave Upper - Left", False, [], ['Hammer', 'Hookshot']], + ["Paradox Cave Upper - Left", False, ['Progressive Glove', 'Lamp', 'Magic Mirror']], + ["Paradox Cave Upper - Left", False, ['Progressive Glove', 'Hookshot']], + ["Paradox Cave Upper - Left", False, ['Ocarina', 'Magic Mirror']], + ["Paradox Cave Upper - Left", False, ['Ocarina', 'Hammer']], + ["Paradox Cave Upper - Left", True, ['Ocarina', 'Hookshot']], + ["Paradox Cave Upper - Left", True, ['Progressive Glove', 'Lamp', 'Hookshot']], + ["Paradox Cave Upper - Left", True, ['Progressive Glove', 'Lamp', 'Magic Mirror', 'Hammer']], + ["Paradox Cave Upper - Left", True, ['Ocarina', 'Magic Mirror', 'Hammer']], + + ["Paradox Cave Upper - Right", False, []], + ["Paradox Cave Upper - Right", False, [], ['Progressive Glove', 'Ocarina']], + ["Paradox Cave Upper - Right", False, [], ['Magic Mirror', 'Hammer', 'Hookshot']], + ["Paradox Cave Upper - Right", False, [], ['Magic Mirror', 'Hookshot']], + ["Paradox Cave Upper - Right", False, [], ['Hammer', 'Hookshot']], + ["Paradox Cave Upper - Right", False, ['Progressive Glove', 'Lamp', 'Magic Mirror']], + ["Paradox Cave Upper - Right", False, ['Progressive Glove', 'Hookshot']], + ["Paradox Cave Upper - Right", False, ['Ocarina', 'Magic Mirror']], + ["Paradox Cave Upper - Right", False, ['Ocarina', 'Hammer']], + ["Paradox Cave Upper - Right", True, ['Ocarina', 'Hookshot']], + ["Paradox Cave Upper - Right", True, ['Progressive Glove', 'Lamp', 'Hookshot']], + ["Paradox Cave Upper - Right", True, ['Progressive Glove', 'Lamp', 'Magic Mirror', 'Hammer']], + ["Paradox Cave Upper - Right", True, ['Ocarina', 'Magic Mirror', 'Hammer']], + ]) + + def testWestDarkWorldDeathMountain(self): + self.run_location_tests([ + ["Spike Cave", False, []], + ["Spike Cave", False, [], ['Progressive Glove']], + ["Spike Cave", False, [], ['Moon Pearl']], + ["Spike Cave", False, [], ['Hammer']], + ["Spike Cave", False, [], ['Cape', 'Cane of Byrna']], + ["Spike Cave", True, ['Bottle', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Lamp', 'Cape']], + ["Spike Cave", True, ['Bottle', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Ocarina', 'Cape']], + ["Spike Cave", True, ['Bottle', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Lamp', 'Cane of Byrna']], + ["Spike Cave", True, ['Bottle', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Ocarina', 'Cane of Byrna']], + ["Spike Cave", True, ['Magic Upgrade (1/2)', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Lamp', 'Cape']], + ["Spike Cave", True, ['Magic Upgrade (1/2)', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Ocarina', 'Cape']], + ["Spike Cave", True, ['Magic Upgrade (1/2)', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Lamp', 'Cane of Byrna']], + ["Spike Cave", True, ['Magic Upgrade (1/2)', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Ocarina', 'Cane of Byrna']], + ["Spike Cave", True, ['Magic Upgrade (1/4)', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Lamp', 'Cape']], + ["Spike Cave", True, ['Magic Upgrade (1/4)', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Ocarina', 'Cape']], + ["Spike Cave", True, ['Magic Upgrade (1/4)', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Lamp', 'Cane of Byrna']], + ["Spike Cave", True, ['Magic Upgrade (1/4)', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Ocarina', 'Cane of Byrna']], + ]) + + def testEastDarkWorldDeathMountain(self): + self.run_location_tests([ + ["Superbunny Cave - Top", False, []], + ["Superbunny Cave - Top", False, [], ['Progressive Glove']], + ["Superbunny Cave - Top", False, [], ['Moon Pearl']], + ["Superbunny Cave - Top", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Hookshot', 'Ocarina']], + ["Superbunny Cave - Top", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Magic Mirror', 'Hammer', 'Ocarina']], + ["Superbunny Cave - Top", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Hookshot', 'Lamp']], + ["Superbunny Cave - Top", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Magic Mirror', 'Hammer', 'Lamp']], + + ["Superbunny Cave - Bottom", False, []], + ["Superbunny Cave - Bottom", False, [], ['Progressive Glove']], + ["Superbunny Cave - Bottom", False, [], ['Moon Pearl']], + ["Superbunny Cave - Bottom", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Hookshot', 'Ocarina']], + ["Superbunny Cave - Bottom", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Magic Mirror', 'Hammer', 'Ocarina']], + ["Superbunny Cave - Bottom", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Hookshot', 'Lamp']], + ["Superbunny Cave - Bottom", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Magic Mirror', 'Hammer', 'Lamp']], + + ["Hookshot Cave - Bottom Right", False, []], + ["Hookshot Cave - Bottom Right", False, [], ['Progressive Glove']], + ["Hookshot Cave - Bottom Right", False, [], ['Moon Pearl']], + ["Hookshot Cave - Bottom Right", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Hookshot', 'Ocarina']], + ["Hookshot Cave - Bottom Right", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Magic Mirror', 'Hammer', 'Ocarina', 'Pegasus Boots']], + ["Hookshot Cave - Bottom Right", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Hookshot', 'Lamp']], + ["Hookshot Cave - Bottom Right", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Magic Mirror', 'Hammer', 'Lamp', 'Pegasus Boots']], + + ["Hookshot Cave - Bottom Left", False, []], + ["Hookshot Cave - Bottom Left", False, [], ['Progressive Glove']], + ["Hookshot Cave - Bottom Left", False, [], ['Moon Pearl']], + ["Hookshot Cave - Bottom Left", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Hookshot', 'Ocarina']], + ["Hookshot Cave - Bottom Left", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Hookshot', 'Lamp']], + + ["Hookshot Cave - Top Left", False, []], + ["Hookshot Cave - Top Left", False, [], ['Progressive Glove']], + ["Hookshot Cave - Top Left", False, [], ['Moon Pearl']], + ["Hookshot Cave - Top Left", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Hookshot', 'Ocarina']], + ["Hookshot Cave - Top Left", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Hookshot', 'Lamp']], + + ["Hookshot Cave - Top Right", False, []], + ["Hookshot Cave - Top Right", False, [], ['Progressive Glove']], + ["Hookshot Cave - Top Right", False, [], ['Moon Pearl']], + ["Hookshot Cave - Top Right", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Hookshot', 'Ocarina']], + ["Hookshot Cave - Top Right", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Hookshot', 'Lamp']], + ]) diff --git a/test/vanilla/TestEntrances.py b/test/vanilla/TestEntrances.py new file mode 100644 index 00000000..3be2212c --- /dev/null +++ b/test/vanilla/TestEntrances.py @@ -0,0 +1,133 @@ +from test.vanilla.TestVanilla import TestVanilla + + +class TestEntrances(TestVanilla): + + def testDungeonEntrances(self): + self.run_entrance_tests([ + ["Hyrule Castle Entrance (South)", True, []], + + ["Eastern Palace", True, []], + + ["Desert Palace Entrance (South)", False, []], + ["Desert Palace Entrance (South)", False, [], ["Book of Mudora", "Ocarina"]], + ["Desert Palace Entrance (South)", False, [], ["Book of Mudora", "Magic Mirror"]], + ["Desert Palace Entrance (South)", False, ["Progressive Glove"], ["Book of Mudora", "Progressive Glove"]], + ["Desert Palace Entrance (South)", True, ["Book of Mudora"]], + ["Desert Palace Entrance (South)", True, ["Ocarina", "Progressive Glove", "Progressive Glove", "Magic Mirror"]], + ["Desert Palace Entrance (North)", False, []], + ["Desert Palace Entrance (North)", False, [], ["Progressive Glove"]], + ["Desert Palace Entrance (North)", False, [], ["Book of Mudora", "Ocarina"]], + ["Desert Palace Entrance (North)", False, [], ["Book of Mudora", "Magic Mirror"]], + ["Desert Palace Entrance (North)", True, ["Book of Mudora", "Progressive Glove"]], + ["Desert Palace Entrance (North)", True, ["Ocarina", "Progressive Glove", "Progressive Glove", "Magic Mirror"]], + + ["Tower of Hera", False, []], + ["Tower of Hera", False, [], ["Ocarina", "Progressive Glove"]], + ["Tower of Hera", False, [], ["Ocarina", "Lamp"]], + ["Tower of Hera", False, [], ["Magic Mirror", "Hammer"]], + ["Tower of Hera", False, [], ["Magic Mirror", "Hookshot"]], + ["Tower of Hera", True, ["Ocarina", "Magic Mirror"]], + ["Tower of Hera", True, ["Progressive Glove", "Lamp", "Magic Mirror"]], + ["Tower of Hera", True, ["Ocarina", "Hookshot", "Hammer"]], + ["Tower of Hera", True, ["Progressive Glove", "Lamp", "Magic Mirror"]], + + ["Agahnims Tower", False, []], + ["Agahnims Tower", False, ["Progressive Sword"], ["Cape", "Progressive Sword", "Beat Agahnim 1"]], + ["Agahnims Tower", True, ["Cape"]], + ["Agahnims Tower", True, ["Progressive Sword", "Progressive Sword"]], + ["Agahnims Tower", True, ["Beat Agahnim 1"]], + + ["Palace of Darkness", False, []], + ["Palace of Darkness", False, [], ["Moon Pearl"]], + ["Palace of Darkness", False, [], ["Beat Agahnim 1", "Progressive Glove"]], + ["Palace of Darkness", False, ["Progressive Glove"], ["Beat Agahnim 1", "Hammer", "Progressive Glove"]], + ["Palace of Darkness", False, [], ["Beat Agahnim 1", "Hammer", "Flippers"]], + ["Palace of Darkness", True, ["Beat Agahnim 1", "Moon Pearl"]], + ["Palace of Darkness", True, ["Hammer", "Progressive Glove", "Moon Pearl"]], + ["Palace of Darkness", True, ["Progressive Glove", "Progressive Glove", "Flippers", "Moon Pearl"]], + + ["Swamp Palace", False, []], + ["Swamp Palace", False, [], ["Moon Pearl"]], + ["Swamp Palace", False, [], ["Beat Agahnim 1", "Progressive Glove"]], + ["Swamp Palace", False, ["Progressive Glove"], ["Beat Agahnim 1", "Hammer", "Progressive Glove"]], + ["Swamp Palace", True, ["Beat Agahnim 1", "Moon Pearl", "Hammer"]], + ["Swamp Palace", True, ["Beat Agahnim 1", "Moon Pearl", "Hookshot", "Flippers"]], + ["Swamp Palace", True, ["Beat Agahnim 1", "Moon Pearl", "Hookshot", "Progressive Glove"]], + ["Swamp Palace", True, ["Hammer", "Progressive Glove", "Moon Pearl"]], + ["Swamp Palace", True, ["Progressive Glove", "Progressive Glove", "Moon Pearl"]], + + ["Thieves Town", False, []], + ["Thieves Town", False, [], ["Moon Pearl"]], + ["Thieves Town", False, [], ["Beat Agahnim 1", "Progressive Glove"]], + ["Thieves Town", False, ["Progressive Glove"], ["Beat Agahnim 1", "Hammer", "Progressive Glove"]], + ["Thieves Town", True, ["Beat Agahnim 1", "Moon Pearl", "Hookshot", "Flippers"]], + ["Thieves Town", True, ["Beat Agahnim 1", "Moon Pearl", "Hookshot", "Hammer"]], + ["Thieves Town", True, ["Beat Agahnim 1", "Moon Pearl", "Hookshot", "Progressive Glove"]], + ["Thieves Town", True, ["Hammer", "Progressive Glove", "Moon Pearl"]], + ["Thieves Town", True, ["Progressive Glove", "Progressive Glove", "Moon Pearl"]], + + ["Skull Woods First Section Door", False, []], + ["Skull Woods First Section Door", False, [], ["Moon Pearl"]], + ["Skull Woods First Section Door", False, [], ["Beat Agahnim 1", "Progressive Glove"]], + ["Skull Woods First Section Door", False, ["Progressive Glove"], ["Beat Agahnim 1", "Hammer", "Progressive Glove"]], + ["Skull Woods First Section Door", True, ["Beat Agahnim 1", "Moon Pearl", "Hookshot", "Flippers"]], + ["Skull Woods First Section Door", True, ["Beat Agahnim 1", "Moon Pearl", "Hookshot", "Hammer"]], + ["Skull Woods First Section Door", True, ["Beat Agahnim 1", "Moon Pearl", "Hookshot", "Progressive Glove"]], + ["Skull Woods First Section Door", True, ["Hammer", "Progressive Glove", "Moon Pearl"]], + ["Skull Woods First Section Door", True, ["Progressive Glove", "Progressive Glove", "Moon Pearl"]], + + ["Skull Woods Final Section", False, []], + ["Skull Woods Final Section", False, [], ["Moon Pearl"]], + ["Skull Woods Final Section", False, [], ["Fire Rod"]], + ["Skull Woods Final Section", False, [], ["Beat Agahnim 1", "Progressive Glove"]], + ["Skull Woods Final Section", False, ["Progressive Glove"], ["Beat Agahnim 1", "Hammer", "Progressive Glove"]], + ["Skull Woods Final Section", True, ["Beat Agahnim 1", "Moon Pearl", "Hookshot", "Flippers", "Fire Rod"]], + ["Skull Woods Final Section", True, ["Beat Agahnim 1", "Moon Pearl", "Hookshot", "Hammer", "Fire Rod"]], + ["Skull Woods Final Section", True, ["Beat Agahnim 1", "Moon Pearl", "Hookshot", "Progressive Glove", "Fire Rod"]], + ["Skull Woods Final Section", True, ["Hammer", "Progressive Glove", "Moon Pearl", "Fire Rod"]], + ["Skull Woods Final Section", True, ["Progressive Glove", "Progressive Glove", "Moon Pearl", "Fire Rod"]], + + ["Ice Palace", False, []], + ["Ice Palace", False, [], ["Flippers"]], + ["Ice Palace", False, ["Progressive Glove"], ["Progressive Glove"]], + ["Ice Palace", True, ["Progressive Glove", "Progressive Glove", "Flippers"]], + + ["Misery Mire", False, []], + ["Misery Mire", False, [], ["Moon Pearl"]], + ["Misery Mire", False, [], ["Ocarina"]], + ["Misery Mire", False, [], ["Ether"]], + ["Misery Mire", False, [], ["Progressive Sword"]], + ["Misery Mire", False, ["Progressive Glove"], ["Progressive Glove"]], + ["Misery Mire", True, ["Progressive Glove", "Progressive Glove", "Ocarina", "Moon Pearl", "Ether", "Progressive Sword"]], + + ["Turtle Rock", False, []], + ["Turtle Rock", False, [], ["Moon Pearl"]], + ["Turtle Rock", False, [], ["Hammer"]], + ["Turtle Rock", False, ["Progressive Glove"], ["Progressive Glove"]], + ["Turtle Rock", False, [], ["Quake"]], + ["Turtle Rock", False, [], ["Progressive Sword"]], + ["Turtle Rock", False, [], ["Lamp", "Ocarina"]], + ["Turtle Rock", False, [], ["Hookshot", "Magic Mirror"]], + ["Turtle Rock", True, ["Progressive Glove", "Progressive Glove", "Moon Pearl", "Hammer", "Quake", "Progressive Sword", "Lamp", "Hookshot"]], + ["Turtle Rock", True, ["Progressive Glove", "Progressive Glove", "Moon Pearl", "Hammer", "Quake", "Progressive Sword", "Lamp", "Magic Mirror"]], + ["Turtle Rock", True, ["Progressive Glove", "Progressive Glove", "Moon Pearl", "Hammer", "Quake", "Progressive Sword", "Ocarina", "Hookshot"]], + ["Turtle Rock", True, ["Progressive Glove", "Progressive Glove", "Moon Pearl", "Hammer", "Quake", "Progressive Sword", "Ocarina", "Magic Mirror"]], + + ["Ganons Tower", False, []], + ["Ganons Tower", False, ["Progressive Glove"], ["Progressive Glove"]], + ["Ganons Tower", False, [], ["Lamp", "Ocarina"]], + ["Ganons Tower", False, [], ["Hookshot", "Hammer"]], + ["Ganons Tower", False, [], ["Hookshot", "Magic Mirror"]], + ["Ganons Tower", False, [], ["Crystal 1"]], + ["Ganons Tower", False, [], ["Crystal 2"]], + ["Ganons Tower", False, [], ["Crystal 3"]], + ["Ganons Tower", False, [], ["Crystal 4"]], + ["Ganons Tower", False, [], ["Crystal 5"]], + ["Ganons Tower", False, [], ["Crystal 6"]], + ["Ganons Tower", False, [], ["Crystal 7"]], + ["Ganons Tower", True, ["Lamp", "Magic Mirror", "Hammer", "Progressive Glove", "Progressive Glove", "Crystal 1", "Crystal 2", "Crystal 3", "Crystal 4", "Crystal 5", "Crystal 6", "Crystal 7"]], + ["Ganons Tower", True, ["Lamp", "Hookshot", "Progressive Glove", "Progressive Glove", "Crystal 1", "Crystal 2", "Crystal 3", "Crystal 4", "Crystal 5", "Crystal 6", "Crystal 7"]], + ["Ganons Tower", True, ["Ocarina", "Magic Mirror", "Hammer", "Progressive Glove", "Progressive Glove", "Crystal 1", "Crystal 2", "Crystal 3", "Crystal 4", "Crystal 5", "Crystal 6", "Crystal 7"]], + ["Ganons Tower", True, ["Ocarina", "Hookshot", "Progressive Glove", "Progressive Glove", "Crystal 1", "Crystal 2", "Crystal 3", "Crystal 4", "Crystal 5", "Crystal 6", "Crystal 7"]], + ]) diff --git a/test/vanilla/TestLightWorld.py b/test/vanilla/TestLightWorld.py new file mode 100644 index 00000000..259036c7 --- /dev/null +++ b/test/vanilla/TestLightWorld.py @@ -0,0 +1,197 @@ +from test.vanilla.TestVanilla import TestVanilla + + +class TestLightWorld(TestVanilla): + + def testLightWorld(self): + self.run_location_tests([ + ["Master Sword Pedestal", False, []], + ["Master Sword Pedestal", False, [], ['Green Pendant']], + ["Master Sword Pedestal", False, [], ['Red Pendant']], + ["Master Sword Pedestal", False, [], ['Blue Pendant']], + ["Master Sword Pedestal", True, ['Green Pendant', 'Red Pendant', 'Blue Pendant']], + + ["Link's Uncle", True, []], + + ["Secret Passage", True, []], + + ["King's Tomb", False, []], + ["King's Tomb", False, [], ['Pegasus Boots']], + ["King's Tomb", True, ['Pegasus Boots', 'Progressive Glove', 'Progressive Glove']], + ["King's Tomb", True, ['Pegasus Boots', 'Progressive Glove', 'Hammer', 'Moon Pearl', 'Magic Mirror']], + ["King's Tomb", True, ['Pegasus Boots', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot', 'Moon Pearl', 'Magic Mirror']], + ["King's Tomb", True, ['Pegasus Boots', 'Beat Agahnim 1', 'Hammer', 'Hookshot', 'Moon Pearl', 'Magic Mirror']], + ["King's Tomb", True, ['Pegasus Boots', 'Beat Agahnim 1', 'Flippers', 'Hookshot', 'Moon Pearl', 'Magic Mirror']], + + ["Floodgate Chest", True, []], + + ["Link's House", True, []], + + ["Kakariko Tavern", True, []], + + ["Chicken House", True, []], + + ["Aginah's Cave", True, []], + + ["Sahasrahla's Hut - Left", True, []], + + ["Sahasrahla's Hut - Middle", True, []], + + ["Sahasrahla's Hut - Right", True, []], + + ["Kakariko Well - Top", True, []], + + ["Kakariko Well - Left", True, []], + + ["Kakariko Well - Middle", True, []], + + ["Kakariko Well - Right", True, []], + + ["Kakariko Well - Bottom", True, []], + + ["Blind's Hideout - Top", True, []], + + ["Blind's Hideout - Left", True, []], + + ["Blind's Hideout - Right", True, []], + + ["Blind's Hideout - Far Left", True, []], + + ["Blind's Hideout - Far Right", True, []], + + ["Bonk Rock Cave", False, []], + ["Bonk Rock Cave", False, [], ['Pegasus Boots']], + ["Bonk Rock Cave", True, ['Pegasus Boots']], + + ["Mini Moldorm Cave - Far Left", True, []], + + ["Mini Moldorm Cave - Left", True, []], + + ["Mini Moldorm Cave - Right", True, []], + + ["Mini Moldorm Cave - Far Right", True, []], + + ["Ice Rod Cave", True, []], + + ["Bottle Merchant", True, []], + + ["Sahasrahla", False, []], + ["Sahasrahla", False, [], ['Green Pendant']], + ["Sahasrahla", True, ['Green Pendant']], + + ["Magic Bat", False, []], + ["Magic Bat", False, [], ['Magic Powder']], + ["Magic Bat", False, [], ['Hammer', 'Magic Mirror']], + ["Magic Bat", False, [], ['Hammer', 'Moon Pearl']], + ["Magic Bat", False, ['Progressive Glove'], ['Hammer', 'Progressive Glove']], + ["Magic Bat", True, ['Magic Powder', 'Hammer']], + ["Magic Bat", True, ['Magic Powder', 'Progressive Glove', 'Progressive Glove', 'Moon Pearl', 'Magic Mirror']], + + ["Sick Kid", False, []], + ["Sick Kid", False, [], ['AnyBottle']], + ["Sick Kid", True, ['Bottle (Bee)']], + ["Sick Kid", True, ['Bottle (Fairy)']], + ["Sick Kid", True, ['Bottle (Red Potion)']], + ["Sick Kid", True, ['Bottle (Green Potion)']], + ["Sick Kid", True, ['Bottle (Blue Potion)']], + ["Sick Kid", True, ['Bottle']], + ["Sick Kid", True, ['Bottle (Good Bee)']], + + ["Hobo", False, []], + ["Hobo", False, [], ['Flippers']], + ["Hobo", True, ['Flippers']], + + ["Bombos Tablet", False, []], + ["Bombos Tablet", False, [], ['Magic Mirror']], + ["Bombos Tablet", False, ['Progressive Sword'], ['Progressive Sword']], + ["Bombos Tablet", False, [], ['Book of Mudora']], + ["Bombos Tablet", False, [], ['Moon Pearl']], + ["Bombos Tablet", True, ['Moon Pearl', 'Magic Mirror', 'Book of Mudora', 'Progressive Sword', 'Progressive Sword', 'Progressive Glove', 'Progressive Glove']], + ["Bombos Tablet", True, ['Moon Pearl', 'Magic Mirror', 'Book of Mudora', 'Progressive Sword', 'Progressive Sword', 'Progressive Glove', 'Hammer']], + ["Bombos Tablet", True, ['Moon Pearl', 'Magic Mirror', 'Book of Mudora', 'Progressive Sword', 'Progressive Sword', 'Beat Agahnim 1', 'Hammer']], + ["Bombos Tablet", True, ['Moon Pearl', 'Magic Mirror', 'Book of Mudora', 'Progressive Sword', 'Progressive Sword', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + ["Bombos Tablet", True, ['Moon Pearl', 'Magic Mirror', 'Book of Mudora', 'Progressive Sword', 'Progressive Sword', 'Beat Agahnim 1', 'Flippers', 'Hookshot']], + + ["King Zora", False, []], + ["King Zora", False, [], ['Progressive Glove', 'Flippers']], + ["King Zora", True, ['Flippers']], + ["King Zora", True, ['Progressive Glove']], + + ["Lost Woods Hideout", True, []], + + ["Lumberjack Tree", False, []], + ["Lumberjack Tree", False, [], ['Pegasus Boots']], + ["Lumberjack Tree", False, [], ['Beat Agahnim 1']], + ["Lumberjack Tree", True, ['Pegasus Boots', 'Beat Agahnim 1']], + + ["Cave 45", False, []], + ["Cave 45", False, [], ['Magic Mirror']], + ["Cave 45", False, [], ['Moon Pearl']], + ["Cave 45", True, ['Moon Pearl', 'Magic Mirror', 'Progressive Glove', 'Progressive Glove']], + ["Cave 45", True, ['Moon Pearl', 'Magic Mirror', 'Progressive Glove', 'Hammer']], + ["Cave 45", True, ['Moon Pearl', 'Magic Mirror', 'Beat Agahnim 1', 'Hammer']], + ["Cave 45", True, ['Moon Pearl', 'Magic Mirror', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + ["Cave 45", True, ['Moon Pearl', 'Magic Mirror', 'Beat Agahnim 1', 'Flippers', 'Hookshot']], + + ["Graveyard Cave", False, []], + ["Graveyard Cave", False, [], ['Magic Mirror']], + ["Graveyard Cave", False, [], ['Moon Pearl']], + ["Graveyard Cave", True, ['Moon Pearl', 'Magic Mirror', 'Progressive Glove', 'Progressive Glove']], + ["Graveyard Cave", True, ['Moon Pearl', 'Magic Mirror', 'Progressive Glove', 'Hammer']], + ["Graveyard Cave", True, ['Moon Pearl', 'Magic Mirror', 'Beat Agahnim 1', 'Hammer', 'Hookshot']], + ["Graveyard Cave", True, ['Moon Pearl', 'Magic Mirror', 'Beat Agahnim 1', 'Progressive Glove', 'Hookshot']], + ["Graveyard Cave", True, ['Moon Pearl', 'Magic Mirror', 'Beat Agahnim 1', 'Flippers', 'Hookshot']], + + ["Checkerboard Cave", False, []], + ["Checkerboard Cave", False, [], ['Progressive Glove']], + ["Checkerboard Cave", False, [], ['Ocarina']], + ["Checkerboard Cave", False, [], ['Magic Mirror']], + ["Checkerboard Cave", True, ['Ocarina', 'Magic Mirror', 'Progressive Glove', 'Progressive Glove']], + + ["Mini Moldorm Cave - Generous Guy", True, []], + + ["Library", False, []], + ["Library", False, [], ['Pegasus Boots']], + ["Library", True, ['Pegasus Boots']], + + ["Mushroom", True, []], + + ["Potion Shop", False, []], + ["Potion Shop", False, [], ['Mushroom']], + ["Potion Shop", True, ['Mushroom']], + + ["Maze Race", True, []], + + ["Desert Ledge", False, []], + ["Desert Ledge", False, [], ['Book of Mudora', 'Ocarina']], + ["Desert Ledge", False, [], ['Book of Mudora', 'Magic Mirror']], + ["Desert Ledge", False, ['Progressive Glove'], ['Book of Mudora', 'Progressive Glove']], + ["Desert Ledge", True, ['Book of Mudora']], + ["Desert Ledge", True, ['Ocarina', 'Magic Mirror', 'Progressive Glove', 'Progressive Glove']], + + ["Lake Hylia Island", False, []], + ["Lake Hylia Island", False, [], ['Magic Mirror']], + ["Lake Hylia Island", False, [], ['Moon Pearl']], + ["Lake Hylia Island", False, [], ['Flippers']], + ["Lake Hylia Island", True, ['Flippers', 'Moon Pearl', 'Magic Mirror', 'Progressive Glove', 'Progressive Glove']], + ["Lake Hylia Island", True, ['Flippers', 'Moon Pearl', 'Magic Mirror', 'Progressive Glove', 'Hammer']], + ["Lake Hylia Island", True, ['Flippers', 'Moon Pearl', 'Magic Mirror', 'Beat Agahnim 1']], + + ["Sunken Treasure", True, []], + + ["Zora's Ledge", False, []], + ["Zora's Ledge", False, [], ['Flippers']], + ["Zora's Ledge", True, ['Flippers']], + + ["Flute Spot", False, []], + ["Flute Spot", False, [], ['Shovel']], + ["Flute Spot", True, ['Shovel']], + + ["Waterfall Fairy - Left", False, []], + ["Waterfall Fairy - Left", False, [], ['Flippers']], + ["Waterfall Fairy - Left", True, ['Flippers']], + + ["Waterfall Fairy - Right", False, []], + ["Waterfall Fairy - Right", False, [], ['Flippers']], + ["Waterfall Fairy - Right", True, ['Flippers']], + ]) \ No newline at end of file diff --git a/test/vanilla/TestVanilla.py b/test/vanilla/TestVanilla.py new file mode 100644 index 00000000..179b6fff --- /dev/null +++ b/test/vanilla/TestVanilla.py @@ -0,0 +1,27 @@ +from BaseClasses import World +from Dungeons import create_dungeons, get_dungeon_item_pool +from EntranceShuffle import link_entrances +from InvertedRegions import mark_dark_world_regions +from ItemList import difficulties, generate_itempool +from Items import ItemFactory +from Regions import create_regions +from Rules import set_rules +from test.TestBase import TestBase + + +class TestVanilla(TestBase): + def setUp(self): + self.world = World(1, 'vanilla', 'noglitches', 'open', 'random', 'normal', 'normal', 'none', 'on', 'ganon', 'balanced', True, 'items', + True, False, False, False, False, False, False, None, 'none', False) + self.world.difficulty_requirements = difficulties['normal'] + create_regions(self.world, 1) + create_dungeons(self.world, 1) + link_entrances(self.world, 1) + generate_itempool(self.world, 1) + self.world.required_medallions[1] = ['Ether', 'Quake'] + self.world.itempool.extend(get_dungeon_item_pool(self.world)) + self.world.itempool.extend(ItemFactory(['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1', 'Beat Agahnim 2', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7'], 1)) + self.world.get_location('Agahnim 1', 1).item = None + self.world.get_location('Agahnim 2', 1).item = None + mark_dark_world_regions(self.world) + set_rules(self.world, 1) diff --git a/test/vanilla/__init__.py b/test/vanilla/__init__.py new file mode 100644 index 00000000..e69de29b