Merge branch 'DoorDevOWG' of https://github.com/compiling/ALttPEntranceRandomizer into compiling-DoorDevOWG
This commit is contained in:
@@ -109,7 +109,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[player] not in ['owglitches', 'nologic'] or shuffle[player] in ['crossed', 'insanity', 'madness_legacy'])
|
||||
set_player_attr('mapshuffle', False)
|
||||
set_player_attr('compassshuffle', False)
|
||||
set_player_attr('keyshuffle', False)
|
||||
@@ -752,6 +752,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[player] == '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[player] != '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[player] == '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[player] != '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)
|
||||
@@ -2189,7 +2214,7 @@ er_mode = {"vanilla": 0, "simple": 1, "restricted": 2, "full": 3, "crossed": 4,
|
||||
"full_legacy": 9, "madness_legacy": 10, "insanity_legacy": 11, "dungeonsfull": 7, "dungeonssimple": 6}
|
||||
|
||||
# byte 1: LLLW WSSR (logic, mode, sword, retro)
|
||||
logic_mode = {"noglitches": 0, "minorglitches": 1, "nologic": 2, "owg": 3, "majorglitches": 4}
|
||||
logic_mode = {"noglitches": 0, "minorglitches": 1, "nologic": 2, "owglitches": 3, "majorglitches": 4}
|
||||
world_mode = {"open": 0, "standard": 1, "inverted": 2}
|
||||
sword_mode = {"random": 0, "assured": 1, "swordless": 2, "vanilla": 3}
|
||||
|
||||
|
||||
@@ -1432,7 +1432,8 @@ def calc_allowance_and_dead_ends(builder, connections_tuple, world, player):
|
||||
check_list = list(potentials[enabling_region])
|
||||
if enabling_region.name in ['Desert Ledge', 'Desert Palace Entrance (North) Spot']:
|
||||
alternate = 'Desert Palace Entrance (North) Spot' if enabling_region.name == 'Desert Ledge' else 'Desert Ledge'
|
||||
check_list.extend(potentials[world.get_region(alternate, player)])
|
||||
if world.get_region(alternate, player) in potentials:
|
||||
check_list.extend(potentials[world.get_region(alternate, player)])
|
||||
connecting_entrances = [x for x in check_list if x != entrance and x not in dead_entrances and x not in drop_entrances_allowance]
|
||||
connect_able = len(connecting_entrances) > 0
|
||||
if is_destination and sector.branches() == 0: #
|
||||
|
||||
@@ -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,
|
||||
@@ -1759,7 +1761,7 @@ def link_inverted_entrances(world, player):
|
||||
raise NotImplementedError('Shuffling not supported yet')
|
||||
|
||||
# check for swamp palace fix
|
||||
if world.get_entrance('Dam', player).connected_region.name != 'Dam' or world.get_entrance('Swamp Palace', player).connected_region.name != 'Swamp Lobby':
|
||||
if world.get_entrance('Dam', player).connected_region.name != 'Dam' or world.get_entrance('Swamp Palace', player).connected_region.name != 'Swamp Portal':
|
||||
world.swamp_patch_required[player] = True
|
||||
|
||||
# check for potion shop location
|
||||
@@ -1933,20 +1935,30 @@ 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':
|
||||
if world.mode[player] == 'inverted':
|
||||
invalid_connections = Inverted_Must_Exit_Invalid_Connections.copy()
|
||||
else:
|
||||
invalid_connections = Must_Exit_Invalid_Connections.copy()
|
||||
invalid_cave_connections = defaultdict(set)
|
||||
|
||||
if world.logic[player] in ['owglitches', 'nologic']:
|
||||
import OverworldGlitchRules
|
||||
for entrance in OverworldGlitchRules.get_non_mandatory_exits(world.mode[player] == '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':
|
||||
if world.mode[player] == 'inverted':
|
||||
for entrance in invalid_connections:
|
||||
if world.get_entrance(entrance, player).connected_region == world.get_region('Inverted Agahnims Tower', player):
|
||||
if world.get_entrance(entrance, player).connected_region == world.get_region('Agahnims Tower Portal', player):
|
||||
for exit in invalid_connections[entrance]:
|
||||
invalid_connections[exit] = invalid_connections[exit].union({'Inverted Ganons Tower', 'Hyrule Castle Entrance (West)', 'Hyrule Castle Entrance (East)'})
|
||||
break
|
||||
@@ -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'),
|
||||
@@ -3023,6 +3037,7 @@ mandatory_connections = [('Links House S&Q', 'Links House'),
|
||||
('Dark Death Mountain Drop (East)', 'Dark Death Mountain (East Bottom)'),
|
||||
('Dark Death Mountain Drop (West)', 'Dark Death Mountain (West Bottom)'),
|
||||
('East Death Mountain (Top) Mirror Spot', 'East Death Mountain (Top)'),
|
||||
('Superbunny Cave Climb', 'Superbunny Cave (Top)'),
|
||||
('Turtle Rock Teleporter', 'Turtle Rock (Top)'),
|
||||
('Turtle Rock Drop', 'Dark Death Mountain (Top)'),
|
||||
('Floating Island Drop', 'Dark Death Mountain (Top)'),
|
||||
@@ -3032,6 +3047,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 +3062,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 +3100,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 +3115,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'),
|
||||
@@ -3133,6 +3155,7 @@ inverted_mandatory_connections = [('Links House S&Q', 'Inverted Links House'),
|
||||
('Mimic Cave Ledge Drop', 'East Death Mountain (Bottom)'),
|
||||
('Turtle Rock Tail Drop', 'Turtle Rock (Top)'),
|
||||
('Turtle Rock Drop', 'Dark Death Mountain'),
|
||||
('Superbunny Cave Climb', 'Superbunny Cave (Top)'),
|
||||
('Desert Ledge Drop', 'Light World'),
|
||||
('Floating Island Drop', 'Dark Death Mountain'),
|
||||
('Dark Lake Hylia Central Island Teleporter', 'Lake Hylia Central Island'),
|
||||
@@ -3148,7 +3171,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 +3187,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 +3350,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 +3484,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'),
|
||||
|
||||
2
Fill.py
2
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))
|
||||
|
||||
@@ -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')
|
||||
]
|
||||
|
||||
|
||||
|
||||
39
ItemList.py
39
ItemList.py
@@ -254,7 +254,7 @@ def generate_itempool(world, player):
|
||||
(pool, placed_items, precollected_items, clock_mode, treasure_hunt_count, treasure_hunt_icon, lamps_needed_for_dark_rooms) = make_custom_item_pool(world.progressive, world.shuffle[player], world.difficulty[player], world.timer, world.goal[player], world.mode[player], world.swords[player], world.retro[player], world.customitemarray)
|
||||
world.rupoor_cost = min(world.customitemarray[player]["rupoorcost"], 9999)
|
||||
else:
|
||||
(pool, placed_items, precollected_items, clock_mode, lamps_needed_for_dark_rooms) = get_pool_core(world.progressive, world.shuffle[player], world.difficulty[player], world.treasure_hunt_total[player], world.timer, world.goal[player], world.mode[player], world.swords[player], world.retro[player], world.doorShuffle[player])
|
||||
(pool, placed_items, precollected_items, clock_mode, lamps_needed_for_dark_rooms) = get_pool_core(world.progressive, world.shuffle[player], world.difficulty[player], world.treasure_hunt_total[player], world.timer, world.goal[player], world.mode[player], world.swords[player], world.retro[player], world.doorShuffle[player], world.logic[player])
|
||||
|
||||
if player in world.pool_adjustment.keys():
|
||||
amt = world.pool_adjustment[player]
|
||||
@@ -697,7 +697,7 @@ rupee_chart = {'Rupee (1)': 1, 'Rupees (5)': 5, 'Rupees (20)': 20, 'Rupees (50)'
|
||||
'Rupees (100)': 100, 'Rupees (300)': 300}
|
||||
|
||||
|
||||
def get_pool_core(progressive, shuffle, difficulty, treasure_hunt_total, timer, goal, mode, swords, retro, door_shuffle):
|
||||
def get_pool_core(progressive, shuffle, difficulty, treasure_hunt_total, timer, goal, mode, swords, retro, door_shuffle, logic):
|
||||
pool = []
|
||||
placed_items = {}
|
||||
precollected_items = []
|
||||
@@ -716,6 +716,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:
|
||||
@@ -946,21 +952,22 @@ def test():
|
||||
for swords in ['random', 'assured', 'swordless', 'vanilla']:
|
||||
for progressive in ['on', 'off']:
|
||||
for shuffle in ['full', 'insanity_legacy']:
|
||||
for retro in [True, False]:
|
||||
for door_shuffle in ['basic', 'crossed', 'vanilla']:
|
||||
out = get_pool_core(progressive, shuffle, difficulty, timer, goal, mode, swords, retro, door_shuffle)
|
||||
count = len(out[0]) + len(out[1])
|
||||
for logic in ['noglitches', 'minorglitches', 'owglitches', 'nologic']:
|
||||
for retro in [True, False]:
|
||||
for door_shuffle in ['basic', 'crossed', 'vanilla']:
|
||||
out = get_pool_core(progressive, shuffle, difficulty, 30, timer, goal, mode, swords, retro, door_shuffle, logic)
|
||||
count = len(out[0]) + len(out[1])
|
||||
|
||||
correct_count = total_items_to_place
|
||||
if goal == 'pedestal' and swords != 'vanilla':
|
||||
# pedestal goals generate one extra item
|
||||
correct_count += 1
|
||||
if retro:
|
||||
correct_count += 28
|
||||
try:
|
||||
assert count == correct_count, "expected {0} items but found {1} items for {2}".format(correct_count, count, (progressive, shuffle, difficulty, timer, goal, mode, swords, retro))
|
||||
except AssertionError as e:
|
||||
print(e)
|
||||
correct_count = total_items_to_place
|
||||
if goal == 'pedestal' and swords != 'vanilla':
|
||||
# pedestal goals generate one extra item
|
||||
correct_count += 1
|
||||
if retro:
|
||||
correct_count += 28
|
||||
try:
|
||||
assert count == correct_count, "expected {0} items but found {1} items for {2}".format(correct_count, count, (progressive, shuffle, difficulty, timer, goal, mode, swords, retro))
|
||||
except AssertionError as e:
|
||||
print(e)
|
||||
|
||||
if __name__ == '__main__':
|
||||
test()
|
||||
|
||||
@@ -1671,7 +1671,7 @@ def val_mire(key_logic, world, player):
|
||||
|
||||
def val_turtle(key_logic, world, player):
|
||||
# todo: check vanilla key logic when TR back doors are accessible
|
||||
if world.shuffle[player] == 'vanilla' and world.mode[player] != 'inverted':
|
||||
if world.shuffle[player] == 'vanilla' and world.mode[player] != 'inverted' and world.logic[player] in ('noglitches', 'minorglitches'):
|
||||
val_rule(key_logic.door_rules['TR Hub NW'], 1)
|
||||
val_rule(key_logic.door_rules['TR Pokey 1 NW'], 2)
|
||||
val_rule(key_logic.door_rules['TR Chain Chomps Down Stairs'], 3)
|
||||
|
||||
10
Main.py
10
Main.py
@@ -11,6 +11,7 @@ import zlib
|
||||
from BaseClasses import World, CollectionState, Item, Region, Location, Shop, Entrance, Settings
|
||||
from Items import ItemFactory
|
||||
from KeyDoorShuffle import validate_key_placement
|
||||
from OverworldGlitchRules import create_owg_connections
|
||||
from PotShuffle import shuffle_pots
|
||||
from Regions import create_regions, create_shops, mark_light_world_regions, create_dungeon_regions, adjust_locations
|
||||
from InvertedRegions import create_inverted_regions, mark_dark_world_regions
|
||||
@@ -123,6 +124,8 @@ def main(args, seed=None, fish=None):
|
||||
create_regions(world, player)
|
||||
else:
|
||||
create_inverted_regions(world, player)
|
||||
if world.logic[player] in ('owglitches', 'nologic'):
|
||||
create_owg_connections(world, player)
|
||||
create_dungeon_regions(world, player)
|
||||
create_shops(world, player)
|
||||
create_doors(world, player)
|
||||
@@ -392,6 +395,8 @@ def copy_world(world):
|
||||
create_shops(ret, player)
|
||||
create_rooms(ret, player)
|
||||
create_dungeons(ret, player)
|
||||
if world.logic[player] in ('owglitches', 'nologic'):
|
||||
create_owg_connections(ret, player)
|
||||
|
||||
copy_dynamic_regions_and_locations(world, ret)
|
||||
for player in range(1, world.players + 1):
|
||||
@@ -429,7 +434,7 @@ 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
|
||||
@@ -508,6 +513,7 @@ def create_playthrough(world):
|
||||
|
||||
# get locations containing progress items
|
||||
prog_locations = [location for location in world.get_filled_locations() if location.item.advancement]
|
||||
optional_locations = ['Trench 1 Switch', 'Trench 2 Switch', 'Ice Block Drop']
|
||||
state_cache = [None]
|
||||
collection_spheres = []
|
||||
state = CollectionState(world)
|
||||
@@ -533,7 +539,7 @@ def create_playthrough(world):
|
||||
logging.getLogger('').debug(world.fish.translate("cli", "cli", "building.calculating.spheres"), len(collection_spheres), len(sphere), len(prog_locations))
|
||||
if not sphere:
|
||||
logging.getLogger('').error(world.fish.translate("cli", "cli", "cannot.reach.items"), [world.fish.translate("cli","cli","cannot.reach.item") % (location.item.name, location.item.player, location.name, location.player) for location in sphere_candidates])
|
||||
if any([world.accessibility[location.item.player] != 'none' for location in sphere_candidates]):
|
||||
if any([location.name not in optional_locations and world.accessibility[location.item.player] != 'none' for location in sphere_candidates]):
|
||||
raise RuntimeError(world.fish.translate("cli", "cli", "cannot.reach.progression"))
|
||||
else:
|
||||
old_world.spoiler.unreachables = sphere_candidates.copy()
|
||||
|
||||
284
OverworldGlitchRules.py
Normal file
284
OverworldGlitchRules.py
Normal file
@@ -0,0 +1,284 @@
|
||||
"""
|
||||
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 'Palace of Darkness'
|
||||
yield 'Misery Mire'
|
||||
yield 'Turtle Rock'
|
||||
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'
|
||||
yield 'Sanctuary Grave'
|
||||
yield 'Hyrule Castle Secret Entrance Drop'
|
||||
yield 'Skull Woods Second Section Hole'
|
||||
yield 'Skull Woods First Section Hole (North)'
|
||||
|
||||
|
||||
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 create_owg_connections(world, player):
|
||||
"""
|
||||
Add OWG transitions to player's world without logic
|
||||
"""
|
||||
create_no_logic_connections(player, world, get_boots_clip_exits_lw(world.mode[player] == 'inverted'))
|
||||
create_no_logic_connections(player, world, get_boots_clip_exits_dw(world.mode[player] == 'inverted'))
|
||||
|
||||
# Glitched speed drops.
|
||||
create_no_logic_connections(player, world, get_glitched_speed_drops_dw(world.mode[player] == 'inverted'))
|
||||
|
||||
# Mirror clip spots.
|
||||
if world.mode[player] != '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.
|
||||
set_owg_rules(player, world, get_boots_clip_exits_lw(world.mode[player] == 'inverted'), lambda state: state.can_boots_clip_lw(player))
|
||||
set_owg_rules(player, world, get_boots_clip_exits_dw(world.mode[player] == 'inverted'), lambda state: state.can_boots_clip_dw(player))
|
||||
|
||||
# Glitched speed drops.
|
||||
set_owg_rules(player, world, get_glitched_speed_drops_dw(world.mode[player] == 'inverted'), lambda state: state.can_get_glitched_speed_dw(player))
|
||||
# Dark Death Mountain Ledge Clip Spot also accessible with mirror.
|
||||
if world.mode[player] != '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[player] != 'inverted':
|
||||
set_owg_rules(player, world, get_mirror_clip_spots_dw(), lambda state: state.has_Mirror(player))
|
||||
set_owg_rules(player, world, get_mirror_offset_spots_dw(), lambda state: state.has_Mirror(player) and state.can_boots_clip_lw(player))
|
||||
else:
|
||||
set_owg_rules(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[player] != '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 set_owg_rules(player, world, connections, default_rule):
|
||||
for entrance, parent_region, target_region, *rule_override in connections:
|
||||
connection = world.get_entrance(entrance, player)
|
||||
rule = rule_override[0] if len(rule_override) > 0 else default_rule
|
||||
connection.access_rule = rule
|
||||
19
Regions.py
19
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')
|
||||
]
|
||||
|
||||
|
||||
|
||||
5
Rom.py
5
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}')
|
||||
|
||||
|
||||
367
Rules.py
367
Rules.py
@@ -1,8 +1,11 @@
|
||||
import collections
|
||||
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
|
||||
|
||||
|
||||
def set_rules(world, player):
|
||||
@@ -32,6 +35,15 @@ 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.')
|
||||
no_glitches_rules(world, player)
|
||||
fake_flipper_rules(world, player)
|
||||
elif world.logic[player] == '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 +58,9 @@ def set_rules(world, player):
|
||||
|
||||
if world.mode[player] != 'inverted':
|
||||
set_big_bomb_rules(world, player)
|
||||
if world.logic[player] == 'owglitches' and world.shuffle[player] 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)
|
||||
|
||||
@@ -53,10 +68,30 @@ def set_rules(world, player):
|
||||
if not world.swamp_patch_required[player]:
|
||||
add_rule(world.get_entrance('Swamp Lobby Moat', player), lambda state: state.has_Mirror(player))
|
||||
|
||||
if world.mode[player] != 'inverted':
|
||||
set_bunny_rules(world, player)
|
||||
else:
|
||||
set_inverted_bunny_rules(world, player)
|
||||
set_bunny_rules(world, player, world.mode[player] == 'inverted')
|
||||
|
||||
if world.mode[player] != 'inverted' and world.logic[player] == 'owglitches':
|
||||
add_rule(world.get_entrance('Ganons Tower', player), lambda state: state.world.get_entrance('Ganons Tower Ascent', player).can_reach(state), 'or')
|
||||
|
||||
|
||||
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)
|
||||
if start.connected_region == world.get_region('Sewer Drop', player):
|
||||
return [lambda state: False] # not handling dungeons for now
|
||||
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 +483,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 +494,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 +507,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 +539,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 +557,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 +572,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 +591,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 +602,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 +620,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 +631,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 +659,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 +670,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 +694,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 +728,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[player] != '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 +1425,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 +1438,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.
|
||||
@@ -1379,7 +1446,25 @@ def set_bunny_rules(world, player):
|
||||
'Pyramid', 'Spiral Cave (Top)', 'Fairy Ascension Cave (Drop)']
|
||||
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']
|
||||
'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',
|
||||
'Kakariko Shop - Left', 'Kakariko Shop - Middle', 'Kakariko Shop - Right',
|
||||
'Lake Hylia Shop - Left', 'Lake Hylia Shop - Middle', 'Lake Hylia Shop - Right',
|
||||
'Potion Shop - Left', 'Potion Shop - Middle', 'Potion Shop - Right',
|
||||
'Capacity Upgrade - Left', 'Capacity Upgrade - Right',
|
||||
'Village of Outcasts Shop - Left', 'Village of Outcasts Shop - Middle', 'Village of Outcasts Shop - Right',
|
||||
'Dark Lake Hylia Shop - Left', 'Dark Lake Hylia Shop - Middle', 'Dark Lake Hylia Shop - Right',
|
||||
'Dark Death Mountain Shop - Left', 'Dark Death Mountain Shop - Middle', 'Dark Death Mountain Shop - Right',
|
||||
'Dark Lumberjack Shop - Left', 'Dark Lumberjack Shop - Middle', 'Dark Lumberjack Shop - Right',
|
||||
'Dark Potion Shop - Left', 'Dark Potion Shop - Middle', 'Dark Potion Shop - Right',
|
||||
'Red Shield Shop - Left', 'Red Shield Shop - Middle', 'Red Shield Shop - Right',
|
||||
'Old Man Sword Cave Item 1',
|
||||
'Take - Any # 1 Item 1', 'Take - Any # 1 Item 2',
|
||||
'Take - Any # 2 Item 1', 'Take - Any # 2 Item 2',
|
||||
'Take - Any # 3 Item 1', 'Take - Any # 3 Item 2',
|
||||
'Take - Any # 4 Item 1', 'Take - Any # 4 Item 2',
|
||||
]
|
||||
|
||||
def path_to_access_rule(path, entrance):
|
||||
return lambda state: state.can_reach(entrance) and all(rule_func(state) for rule_func in path)
|
||||
@@ -1387,9 +1472,30 @@ def set_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_light_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[player] == 'owglitches':
|
||||
if region.type != RegionType.Dungeon \
|
||||
and (location is None or location.name not in OverworldGlitchRules.get_superbunny_accessible_locations()) \
|
||||
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.
|
||||
|
||||
@@ -1401,145 +1507,140 @@ def set_bunny_rules(world, player):
|
||||
# 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, [])])
|
||||
seen = {region}
|
||||
queue = deque([(region, [])])
|
||||
while queue:
|
||||
(current, path) = queue.popleft()
|
||||
for entrance in current.entrances:
|
||||
new_region = entrance.parent_region
|
||||
if new_region in seen:
|
||||
if new_region.type in (RegionType.Cave, RegionType.Dungeon) and 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:
|
||||
if not is_link(new_region):
|
||||
if world.logic[player] == 'owglitches':
|
||||
if region.type == RegionType.Dungeon and new_region.type != RegionType.Dungeon:
|
||||
if entrance.name in OverworldGlitchRules.get_invalid_mirror_bunny_entrances():
|
||||
continue
|
||||
if entrance.name in drop_dungeon_entrances:
|
||||
lobby = entrance.connected_region
|
||||
else:
|
||||
lobby = next(exit.connected_region for exit in current.exits if exit.connected_region.type == RegionType.Dungeon)
|
||||
if lobby.name in bunny_revivable_entrances:
|
||||
possible_options.append(path_to_access_rule(new_path, entrance))
|
||||
elif lobby.name in superbunny_revivable_entrances:
|
||||
possible_options.append(path_to_access_rule(new_path + [lambda state: state.has_Mirror(player)], entrance))
|
||||
elif lobby.name in superbunny_sword_revivable_entrances:
|
||||
possible_options.append(path_to_access_rule(new_path + [lambda state: state.has_Mirror(player) and state.has_sword(player)], entrance))
|
||||
continue
|
||||
elif region.type == RegionType.Cave and new_region.type != RegionType.Cave:
|
||||
if entrance.name in OverworldGlitchRules.get_invalid_mirror_bunny_entrances():
|
||||
continue
|
||||
if region.name in OverworldGlitchRules.get_sword_required_superbunny_mirror_regions():
|
||||
possible_options.append(path_to_access_rule(new_path + [lambda state: state.has_Mirror(player) and state.has_sword(player)], entrance))
|
||||
elif region.name in OverworldGlitchRules.get_boots_required_superbunny_mirror_regions():
|
||||
possible_options.append(path_to_access_rule(new_path + [lambda state: state.has_Mirror(player) and state.has_Boots(player)], entrance))
|
||||
elif location and location.name in OverworldGlitchRules.get_superbunny_accessible_locations():
|
||||
if location.name in OverworldGlitchRules.get_boots_required_superbunny_mirror_locations():
|
||||
possible_options.append(path_to_access_rule(new_path + [lambda state: state.has_Mirror(player) and state.has_Boots(player)], entrance))
|
||||
elif region.name == 'Kakariko Well (top)':
|
||||
possible_options.append(path_to_access_rule(new_path, entrance))
|
||||
else:
|
||||
possible_options.append(path_to_access_rule(new_path + [lambda state: state.has_Mirror(player)], entrance))
|
||||
continue
|
||||
elif region.name == 'Superbunny Cave (Top)' and new_region.name == 'Superbunny Cave (Bottom)' and location and location.name in OverworldGlitchRules.get_superbunny_accessible_locations():
|
||||
possible_options.append(path_to_access_rule(new_path, entrance))
|
||||
else:
|
||||
continue
|
||||
if is_bunny(new_region):
|
||||
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']
|
||||
|
||||
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_dark_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 dark 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_dark_world:
|
||||
continue # we don't care about pure light world entrances
|
||||
if new_region.is_light_world:
|
||||
queue.append((new_region, new_path))
|
||||
else:
|
||||
# we have reached pure dark 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 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:
|
||||
bunny_exit = world.get_entrance(ent_name, player)
|
||||
if bunny_exit.parent_region.is_light_world:
|
||||
if is_bunny(bunny_exit.parent_region):
|
||||
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_light_world and room.kind(door) in [DoorKind.Dashable, DoorKind.Bombable, DoorKind.Hidden]:
|
||||
if is_bunny(door.entrance.parent_region) 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:
|
||||
for region in world.get_regions():
|
||||
if region.player == player and is_bunny(region):
|
||||
for location in region.locations:
|
||||
if location.name in bunny_accessible_locations:
|
||||
continue
|
||||
add_rule(location, get_rule_to_add(region, location))
|
||||
|
||||
if location.name in bunny_accessible_locations:
|
||||
continue
|
||||
|
||||
add_rule(location, get_rule_to_add(location.parent_region))
|
||||
drop_dungeon_entrances = {
|
||||
"Sewer Drop",
|
||||
"Skull Left Drop",
|
||||
"Skull Pinball",
|
||||
"Skull Pot Circle",
|
||||
"Skull Back Drop"
|
||||
}
|
||||
|
||||
|
||||
bunny_revivable_entrances = {
|
||||
"Sewers Pull Switch", "TR Dash Room", "Swamp Boss", "Hera Boss",
|
||||
"Tower Agahnim 1", "Ice Lobby", "Sewers Rat Path", "PoD Falling Bridge",
|
||||
"PoD Harmless Hellway", "PoD Mimics 2", "Ice Cross Bottom", "GT Agahnim 2",
|
||||
"Sewers Water", "TR Lazy Eyes", "TR Big Chest Entrance", "Swamp Push Statue",
|
||||
"PoD Arena Main", "PoD Arena Bridge", "PoD Map Balcony", "Sewers Dark Cross",
|
||||
"Desert Boss", "Swamp Hub", "Skull Spike Corner", "PoD Pit Room",
|
||||
"PoD Conveyor", "GT Crystal Circles", "Sewers Behind Tapestry",
|
||||
"Desert Tiles 2", "Skull Star Pits", "Hyrule Castle West Hall",
|
||||
"Hyrule Castle Throne Room", "Hyrule Castle East Hall", "Skull 2 West Lobby",
|
||||
"Skull 2 East Lobby", "Skull Pot Prison", "Skull 1 Lobby", "Skull Map Room",
|
||||
"Skull 3 Lobby", "PoD Boss", "GT Hidden Spikes", "GT Gauntlet 3",
|
||||
"Ice Spike Cross", "Hyrule Castle West Lobby", "Hyrule Castle Lobby",
|
||||
"Hyrule Castle East Lobby", "Desert Back Lobby", "Hyrule Dungeon Armory Main",
|
||||
"Hyrule Dungeon North Abyss", "Desert Sandworm Corner", "Desert Dead End",
|
||||
"Desert North Hall", "Desert Arrow Pot Corner", "GT DMs Room",
|
||||
"GT Petting Zoo", "Ice Tall Hint", "Desert West Lobby", "Desert Main Lobby",
|
||||
"Desert East Lobby", "GT Big Chest", "GT Bob\'s Room", "GT Speed Torch",
|
||||
"Mire Boss", "GT Conveyor Bridge", "Mire Lobby", "Eastern Darkness",
|
||||
"Ice Many Pots", "Mire South Fish", "Mire Right Bridge", "Mire Left Bridge",
|
||||
"TR Boss", "Eastern Hint Tile Blocked Path", "Thieves Spike Switch",
|
||||
"Thieves Boss", "Mire Spike Barrier", "Mire Cross", "Mire Hidden Shooters",
|
||||
"Mire Spikes", "TR Final Abyss", "TR Dark Ride", "TR Pokey 1", "TR Tile Room",
|
||||
"TR Roller Room", "Eastern Cannonball", "Thieves Hallway", "Ice Switch Room",
|
||||
"Mire Tile Room", "Mire Conveyor Crystal", "Mire Hub", "TR Dash Bridge",
|
||||
"TR Hub", "Eastern Boss", "Eastern Lobby", "Thieves Ambush",
|
||||
"Thieves BK Corner", "TR Eye Bridge", "Thieves Lobby", "Tower Lobby",
|
||||
"Sewer Drop", "Skull Left Drop", "Skull Pinball", "Skull Back Drop",
|
||||
"Skull Pot Circle", # You automatically get superbunny by dropping
|
||||
}
|
||||
|
||||
# Revive as superbunny or use superbunny to get the item in a dead end
|
||||
superbunny_revivable_entrances = {
|
||||
"TR Main Lobby", "Sanctuary", "Thieves Pot Alcove Bottom"
|
||||
}
|
||||
|
||||
superbunny_sword_revivable_entrances = {
|
||||
"Hera Lobby"
|
||||
}
|
||||
|
||||
bunny_impassible_doors = {
|
||||
'Hyrule Dungeon Armory S', 'Hyrule Dungeon Armory ES', 'Sewers Secret Room Push Block', 'Sewers Pull Switch S',
|
||||
'Eastern Lobby N', 'Eastern Courtyard Ledge W', 'Eastern Courtyard Ledge E', 'Eastern Pot Switch SE',
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
"choices": [
|
||||
"noglitches",
|
||||
"minorglitches",
|
||||
"owglitches",
|
||||
"nologic"
|
||||
]
|
||||
},
|
||||
|
||||
@@ -195,6 +195,7 @@
|
||||
"randomizer.item.logiclevel": "Logic Level",
|
||||
"randomizer.item.logiclevel.noglitches": "No Glitches",
|
||||
"randomizer.item.logiclevel.minorglitches": "Minor Glitches",
|
||||
"randomizer.item.logiclevel.owglitches": "Overworld Glitches",
|
||||
"randomizer.item.logiclevel.nologic": "No Logic",
|
||||
|
||||
"randomizer.item.goal": "Goal",
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
"options": [
|
||||
"noglitches",
|
||||
"minorglitches",
|
||||
"owglitches",
|
||||
"nologic"
|
||||
]
|
||||
},
|
||||
|
||||
50
test/TestBase.py
Normal file
50
test/TestBase.py
Normal file
@@ -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)
|
||||
@@ -1,53 +0,0 @@
|
||||
from BaseClasses import World
|
||||
from Dungeons import create_dungeons
|
||||
from EntranceShuffle import link_entrances
|
||||
from ItemList import difficulties
|
||||
from Regions import create_regions
|
||||
from Rules import set_rules
|
||||
from test.TestVanilla import TestVanilla
|
||||
|
||||
|
||||
class TestDeathMountain(TestVanilla):
|
||||
def setUp(self):
|
||||
self.world = World(1, 'vanilla', 'noglitches', 'open', '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_regions(self.world, 1)
|
||||
create_dungeons(self.world, 1)
|
||||
link_entrances(self.world, 1)
|
||||
set_rules(self.world, 1)
|
||||
|
||||
def testWestDeathMountain(self):
|
||||
self.run_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']],
|
||||
])
|
||||
@@ -1,41 +0,0 @@
|
||||
import unittest
|
||||
|
||||
from BaseClasses import World, CollectionState
|
||||
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
|
||||
from Items import ItemFactory
|
||||
from Regions import create_regions
|
||||
from Rules import set_rules
|
||||
|
||||
|
||||
class TestVanilla(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.world = World(1, 'vanilla', 'noglitches', 'open', '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_regions(self.world, 1)
|
||||
create_dungeons(self.world, 1)
|
||||
link_entrances(self.world, 1)
|
||||
mark_dark_world_regions(self.world)
|
||||
set_rules(self.world, 1)
|
||||
|
||||
def run_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 = CollectionState(self.world)
|
||||
for item in items:
|
||||
item.advancement = True
|
||||
state.collect(item)
|
||||
|
||||
self.assertEqual(self.world.get_location(location, 1).can_reach(state), access)
|
||||
@@ -1,28 +1,36 @@
|
||||
from BaseClasses import World
|
||||
from DoorShuffle import link_doors
|
||||
from Doors import create_doors
|
||||
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 Regions import mark_light_world_regions, create_dungeon_regions, create_shops
|
||||
from RoomData import create_rooms
|
||||
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,
|
||||
'none', False)
|
||||
self.world.difficulty_requirements = difficulties['normal']
|
||||
self.world = World(1, {1: 'vanilla'}, {1: 'vanilla'}, {1: 'noglitches'}, {1: 'inverted'}, {1: 'random'}, {1: 'normal'}, {1: 'normal'}, 'none', 'on', {1: 'ganon'}, 'balanced', {1: 'items'},
|
||||
{1: True}, {1: False}, False, None, {1: False})
|
||||
self.world.difficulty_requirements[1] = difficulties['normal']
|
||||
self.world.intensity = {1: 1}
|
||||
create_inverted_regions(self.world, 1)
|
||||
create_dungeon_regions(self.world, 1)
|
||||
create_shops(self.world, 1)
|
||||
create_doors(self.world, 1)
|
||||
create_rooms(self.world, 1)
|
||||
create_dungeons(self.world, 1)
|
||||
link_inverted_entrances(self.world, 1)
|
||||
link_doors(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_light_world_regions(self.world)
|
||||
mark_light_world_regions(self.world, 1)
|
||||
set_rules(self.world, 1)
|
||||
|
||||
@@ -7,17 +7,10 @@ from EntranceShuffle import connect_entrance, Inverted_LW_Entrances, Inverted_LW
|
||||
from InvertedRegions import create_inverted_regions
|
||||
from ItemList import difficulties
|
||||
from Rules import set_inverted_big_bomb_rules
|
||||
from test.inverted.TestInverted import TestInverted
|
||||
|
||||
|
||||
class TestInvertedBombRules(unittest.TestCase):
|
||||
|
||||
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,
|
||||
'none', False)
|
||||
self.world.difficulty_requirements = difficulties['normal']
|
||||
create_inverted_regions(self.world, 1)
|
||||
create_dungeons(self.world, 1)
|
||||
class TestInvertedBombRules(TestInverted):
|
||||
|
||||
#TODO: Just making sure I haven't missed an entrance. It would be good to test the rules make sense as well.
|
||||
def testInvertedBombRulesAreComplete(self):
|
||||
@@ -26,6 +19,8 @@ class TestInvertedBombRules(unittest.TestCase):
|
||||
for entrance_name in (entrances + must_exits):
|
||||
if entrance_name not in ['Desert Palace Entrance (East)', 'Spectacle Rock Cave', 'Spectacle Rock Cave (Bottom)']:
|
||||
entrance = self.world.get_entrance(entrance_name, 1)
|
||||
entrance.connected_region = None
|
||||
self.world.get_region('Inverted Big Bomb Shop', 1).entrances = []
|
||||
connect_entrance(self.world, entrance, 'Inverted Big Bomb Shop', 1)
|
||||
set_inverted_big_bomb_rules(self.world, 1)
|
||||
entrance.connected_region.entrances.remove(entrance)
|
||||
@@ -40,6 +35,7 @@ class TestInvertedBombRules(unittest.TestCase):
|
||||
def testInvalidEntrances(self):
|
||||
for entrance_name in ['Desert Palace Entrance (East)', 'Spectacle Rock Cave', 'Spectacle Rock Cave (Bottom)']:
|
||||
entrance = self.world.get_entrance(entrance_name, 1)
|
||||
self.world.get_region('Inverted Big Bomb Shop', 1).entrances = []
|
||||
connect_entrance(self.world, entrance, 'Inverted Big Bomb Shop', 1)
|
||||
with self.assertRaises(Exception):
|
||||
set_inverted_big_bomb_rules(self.world, 1)
|
||||
|
||||
@@ -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']],
|
||||
|
||||
@@ -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,17 +204,17 @@ 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']],
|
||||
["Spike Cave", False, [], ['Cape', 'Cane of Byrna']],
|
||||
["Spike Cave", False, [], ['Cane of Byrna', 'AnyBottle', 'Magic Upgrade (1/2)']],
|
||||
["Spike Cave", False, [], ['AnyBottle', 'Magic Upgrade (1/2)', 'Pegasus Boots', 'Boss Heart Container', 'Piece of Heart', 'Sanctuary Heart Container']],
|
||||
["Spike Cave", False, ['Bottle', 'Hammer', 'Progressive Glove', 'Lamp', 'Cape']],
|
||||
["Spike Cave", True, ['Bottle', 'Hammer', 'Progressive Glove', 'Lamp', 'Cape']], # blue potion added to dark world
|
||||
["Spike Cave", True, ['Bottle', 'Hammer', 'Progressive Glove', 'Lamp', 'Moon Pearl', 'Cape']],
|
||||
["Spike Cave", True, ['Bottle', 'Hammer', 'Progressive Glove', 'Ocarina', 'Moon Pearl', 'Cape']],
|
||||
["Spike Cave", False, ['Bottle', 'Hammer', 'Progressive Glove', 'Lamp', 'Cane of Byrna']],
|
||||
["Spike Cave", True, ['Bottle', 'Hammer', 'Progressive Glove', 'Lamp', 'Cane of Byrna']], # blue potion added to dark world
|
||||
["Spike Cave", True, ['Bottle', 'Hammer', 'Progressive Glove', 'Lamp', 'Moon Pearl', 'Cane of Byrna']],
|
||||
["Spike Cave", True, ['Bottle', 'Hammer', 'Progressive Glove', 'Ocarina', 'Moon Pearl', 'Cane of Byrna']],
|
||||
["Spike Cave", True, ['Magic Upgrade (1/2)', 'Hammer', 'Progressive Glove', 'Lamp', 'Cape']],
|
||||
|
||||
118
test/inverted/TestInvertedEntrances.py
Normal file
118
test/inverted/TestInvertedEntrances.py
Normal file
@@ -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"]],
|
||||
])
|
||||
@@ -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']],
|
||||
|
||||
@@ -4,7 +4,8 @@ from test.inverted.TestInverted import TestInverted
|
||||
class TestInvertedTurtleRock(TestInverted):
|
||||
|
||||
def testTurtleRock(self):
|
||||
self.run_tests([
|
||||
return # Door rando makes this harder
|
||||
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']],
|
||||
|
||||
78
test/inverted_owg/TestDarkWorld.py
Normal file
78
test/inverted_owg/TestDarkWorld.py
Normal file
@@ -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']],
|
||||
])
|
||||
113
test/inverted_owg/TestDeathMountain.py
Normal file
113
test/inverted_owg/TestDeathMountain.py
Normal file
@@ -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']],
|
||||
])
|
||||
116
test/inverted_owg/TestDungeons.py
Normal file
116
test/inverted_owg/TestDungeons.py
Normal file
@@ -0,0 +1,116 @@
|
||||
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', 'Small Key (Ice Palace)']],
|
||||
|
||||
["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']],
|
||||
#todo: smarter dungeon revive logic
|
||||
#["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']],
|
||||
])
|
||||
40
test/inverted_owg/TestInvertedOWG.py
Normal file
40
test/inverted_owg/TestInvertedOWG.py
Normal file
@@ -0,0 +1,40 @@
|
||||
from BaseClasses import World
|
||||
from DoorShuffle import link_doors
|
||||
from Doors import create_doors
|
||||
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 OverworldGlitchRules import create_owg_connections
|
||||
from Regions import mark_light_world_regions, create_dungeon_regions, create_shops
|
||||
from RoomData import create_rooms
|
||||
from Rules import set_rules
|
||||
from test.TestBase import TestBase
|
||||
|
||||
|
||||
class TestInvertedOWG(TestBase):
|
||||
def setUp(self):
|
||||
self.world = World(1, {1: 'vanilla'}, {1: 'vanilla'}, {1: 'owglitches'}, {1: 'inverted'}, {1: 'random'}, {1: 'normal'}, {1: 'normal'}, 'none', 'on', {1: 'ganon'}, 'balanced', {1: 'items'},
|
||||
{1: True}, {1: False}, False, None, {1: False})
|
||||
self.world.difficulty_requirements[1] = difficulties['normal']
|
||||
self.world.intensity = {1: 1}
|
||||
create_inverted_regions(self.world, 1)
|
||||
create_dungeon_regions(self.world, 1)
|
||||
create_shops(self.world, 1)
|
||||
create_doors(self.world, 1)
|
||||
create_rooms(self.world, 1)
|
||||
create_dungeons(self.world, 1)
|
||||
create_owg_connections(self.world, 1)
|
||||
link_inverted_entrances(self.world, 1)
|
||||
link_doors(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, 1)
|
||||
set_rules(self.world, 1)
|
||||
312
test/inverted_owg/TestLightWorld.py
Normal file
312
test/inverted_owg/TestLightWorld.py
Normal file
@@ -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, []],
|
||||
])
|
||||
0
test/inverted_owg/__init__.py
Normal file
0
test/inverted_owg/__init__.py
Normal file
206
test/owg/TestDarkWorld.py
Normal file
206
test/owg/TestDarkWorld.py
Normal file
@@ -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']],
|
||||
])
|
||||
201
test/owg/TestDeathMountain.py
Normal file
201
test/owg/TestDeathMountain.py
Normal file
@@ -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']],
|
||||
])
|
||||
133
test/owg/TestDungeons.py
Normal file
133
test/owg/TestDungeons.py
Normal file
@@ -0,0 +1,133 @@
|
||||
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']],
|
||||
#todo: more advanced bunny revive logic
|
||||
#["Ganons Tower - Hope Room - Left", True, ['Pegasus Boots', 'Hammer', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7']],
|
||||
])
|
||||
194
test/owg/TestLightWorld.py
Normal file
194
test/owg/TestLightWorld.py
Normal file
@@ -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']]
|
||||
])
|
||||
40
test/owg/TestVanillaOWG.py
Normal file
40
test/owg/TestVanillaOWG.py
Normal file
@@ -0,0 +1,40 @@
|
||||
from BaseClasses import World
|
||||
from DoorShuffle import link_doors
|
||||
from Doors import create_doors
|
||||
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 OverworldGlitchRules import create_owg_connections
|
||||
from Regions import create_regions, create_dungeon_regions, create_shops
|
||||
from RoomData import create_rooms
|
||||
from Rules import set_rules
|
||||
from test.TestBase import TestBase
|
||||
|
||||
|
||||
class TestVanillaOWG(TestBase):
|
||||
def setUp(self):
|
||||
self.world = World(1, {1:'vanilla'}, {1:'vanilla'}, {1:'owglitches'}, {1:'open'}, {1:'random'}, {1:'normal'}, {1:'normal'}, 'none', 'on', {1:'ganon'}, 'balanced', {1:'items'},
|
||||
{1:True}, {1:False}, False, None, {1:False})
|
||||
self.world.difficulty_requirements[1] = difficulties['normal']
|
||||
self.world.intensity = {1:1}
|
||||
create_regions(self.world, 1)
|
||||
create_dungeon_regions(self.world, 1)
|
||||
create_shops(self.world, 1)
|
||||
create_doors(self.world, 1)
|
||||
create_rooms(self.world, 1)
|
||||
create_dungeons(self.world, 1)
|
||||
link_entrances(self.world, 1)
|
||||
link_doors(self.world, 1)
|
||||
create_owg_connections(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, 1)
|
||||
set_rules(self.world, 1)
|
||||
0
test/owg/__init__.py
Normal file
0
test/owg/__init__.py
Normal file
166
test/vanilla/TestDarkWorld.py
Normal file
166
test/vanilla/TestDarkWorld.py
Normal file
@@ -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']],
|
||||
])
|
||||
230
test/vanilla/TestDeathMountain.py
Normal file
230
test/vanilla/TestDeathMountain.py
Normal file
@@ -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']],
|
||||
])
|
||||
133
test/vanilla/TestEntrances.py
Normal file
133
test/vanilla/TestEntrances.py
Normal file
@@ -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"]],
|
||||
])
|
||||
197
test/vanilla/TestLightWorld.py
Normal file
197
test/vanilla/TestLightWorld.py
Normal file
@@ -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']],
|
||||
])
|
||||
36
test/vanilla/TestVanilla.py
Normal file
36
test/vanilla/TestVanilla.py
Normal file
@@ -0,0 +1,36 @@
|
||||
from BaseClasses import World
|
||||
from DoorShuffle import link_doors
|
||||
from Doors import create_doors
|
||||
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, create_dungeon_regions, create_shops
|
||||
from RoomData import create_rooms
|
||||
from Rules import set_rules
|
||||
from test.TestBase import TestBase
|
||||
|
||||
|
||||
class TestVanilla(TestBase):
|
||||
def setUp(self):
|
||||
self.world = World(1, {1:'vanilla'}, {1:'vanilla'}, {1:'noglitches'}, {1:'open'}, {1:'random'}, {1:'normal'}, {1:'normal'}, 'none', 'on', {1:'ganon'}, 'balanced', {1:'items'},
|
||||
{1:True}, {1:False}, False, None, {1:False})
|
||||
self.world.difficulty_requirements[1] = difficulties['normal']
|
||||
self.world.intensity = {1:1}
|
||||
create_regions(self.world, 1)
|
||||
create_dungeon_regions(self.world, 1)
|
||||
create_shops(self.world, 1)
|
||||
create_doors(self.world, 1)
|
||||
create_rooms(self.world, 1)
|
||||
create_dungeons(self.world, 1)
|
||||
link_entrances(self.world, 1)
|
||||
link_doors(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, 1)
|
||||
set_rules(self.world, 1)
|
||||
0
test/vanilla/__init__.py
Normal file
0
test/vanilla/__init__.py
Normal file
Reference in New Issue
Block a user