OWG fixes (#79)

* Fix Waterfall entrance being inaccessible with the flippers.
Fix Spectacle Rock and Bombos Tablet requiring moon pearl

* Inverted - make the blacksmith, purple chest, bottle merchant and master sword pedestal accessible without the moon pearl.

* Fix moon pearl checks to avoid requiring moon pearl for mirror accessible locations.

* Dark Desert Teleporter requires the mitts

* Fix OWG bunny rules

* Fix another bunny rule bug.

* Separate superbunny cave into 2 regions.
For OWG, allow superbunny in superbunny cave with no mirror when entering from the bottom
Fix boots clip logic to desert teleporter ledge and TR teleporter
Fix mirror wrap logic for pyramid fairy
For insanity shuffle, exiting Superbunny Cave bottom is now in logic.

* Always require pearl for Swamp (Superbunny cannot do anything)

* Allow clipping into the GT entrance

* Add OWG tests from vt_randomizer

* Add some extra vanilla test cases

* Allow superbunny into the Blind's Hideout entrance.

* More moon pearl / superbunny fixes
Use the Catfish region properly, so Catfish Descent works.

* Allow superbunny into tavern
Fix inverted Kings Grave logic

* Inverted OWG tests

* Update unit tests for King's Tomb clip.

* All superbunny to spiral cave item (with sword)

* Bunny revive is not possible in Sanctuary.

* More inverted tests

* Add/fix test cases

* Fix logic for Magic Bat

* Fix merge to multiworld

* Fix Floodgate superbunny rule

* Require bunny revival for all dungeons except for Swamp/TR Main/Hera/Sanctuary, which have extra requirements

* Require a weapon for Castle Tower.

* Test case fixes

* Update test case - superbunny into Kakariko Tavern is in logic
This commit is contained in:
compiling 2020-04-29 01:34:30 +10:00 committed by GitHub
parent 00da5dfd65
commit 4851a905cf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
34 changed files with 2442 additions and 162 deletions

View File

@ -2926,6 +2926,7 @@ mandatory_connections = [('Lake Hylia Central Island Pier', 'Lake Hylia Central
('Cave 45 Mirror Spot', 'Cave 45 Ledge'), ('Cave 45 Mirror Spot', 'Cave 45 Ledge'),
('Bombos Tablet Mirror Spot', 'Bombos Tablet Ledge'), ('Bombos Tablet Mirror Spot', 'Bombos Tablet Ledge'),
('Graveyard Ledge Mirror Spot', 'Graveyard Ledge'), ('Graveyard Ledge Mirror Spot', 'Graveyard Ledge'),
('Superbunny Cave Climb', 'Superbunny Cave (Top)'),
('Swamp Palace Moat', 'Swamp Palace (First Room)'), ('Swamp Palace Moat', 'Swamp Palace (First Room)'),
('Swamp Palace Small Key Door', 'Swamp Palace (Starting Area)'), ('Swamp Palace Small Key Door', 'Swamp Palace (Starting Area)'),
@ -2996,6 +2997,7 @@ mandatory_connections = [('Lake Hylia Central Island Pier', 'Lake Hylia Central
('Floating Island Clip Spot', 'Death Mountain Floating Island (Light World)'), ('Floating Island Clip Spot', 'Death Mountain Floating Island (Light World)'),
('Dark Death Mountain Ledge Clip Spot', 'Dark Death Mountain Ledge'), ('Dark Death Mountain Ledge Clip Spot', 'Dark Death Mountain Ledge'),
('Zora Descent Clip Spot', 'Zoras River'), ('Zora Descent Clip Spot', 'Zoras River'),
#todo: Entrances shouldn't lead to multiple regions. This currently works, but it's fragile
('Graveyard Ledge Clip Spot', 'Graveyard Ledge'), ('Graveyard Ledge Clip Spot', 'Graveyard Ledge'),
('Graveyard Ledge Clip Spot', 'Kings Grave Area'), ('Graveyard Ledge Clip Spot', 'Kings Grave Area'),
('Desert Northern Cliffs', 'Desert Ledge'), ('Desert Northern Cliffs', 'Desert Ledge'),
@ -3103,6 +3105,7 @@ inverted_mandatory_connections = [('Lake Hylia Central Island Pier', 'Lake Hylia
('Fairy Ascension Cave Pots', 'Fairy Ascension Cave (Bottom)'), ('Fairy Ascension Cave Pots', 'Fairy Ascension Cave (Bottom)'),
('Fairy Ascension Cave Drop', 'Fairy Ascension Cave (Drop)'), ('Fairy Ascension Cave Drop', 'Fairy Ascension Cave (Drop)'),
('Dark Death Mountain Drop (East)', 'Dark Death Mountain (East Bottom)'), ('Dark Death Mountain Drop (East)', 'Dark Death Mountain (East Bottom)'),
('Superbunny Cave Climb', 'Superbunny Cave (Top)'),
('Swamp Palace Moat', 'Swamp Palace (First Room)'), ('Swamp Palace Moat', 'Swamp Palace (First Room)'),
('Swamp Palace Small Key Door', 'Swamp Palace (Starting Area)'), ('Swamp Palace Small Key Door', 'Swamp Palace (Starting Area)'),
('Swamp Palace (Center)', 'Swamp Palace (Center)'), ('Swamp Palace (Center)', 'Swamp Palace (Center)'),
@ -3214,7 +3217,7 @@ inverted_mandatory_connections = [('Lake Hylia Central Island Pier', 'Lake Hylia
('West Dark World Mirror Spot', 'West Dark World'), ('West Dark World Mirror Spot', 'West Dark World'),
('South Dark World Mirror Spot', 'South Dark World'), ('South Dark World Mirror Spot', 'South Dark World'),
('Potion Shop Mirror Spot', 'Northeast 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'), ('Shopping Mall Mirror Spot', 'Dark Lake Hylia Ledge'),
('Skull Woods Mirror Spot', 'Skull Woods Forest (West)'), ('Skull Woods Mirror Spot', 'Skull Woods Forest (West)'),
('DDM Flute', 'The Sky'), ('DDM Flute', 'The Sky'),
@ -3402,10 +3405,10 @@ default_connections = [('Waterfall of Wishing', 'Waterfall of Wishing'),
('Dark Desert Fairy', 'Dark Desert Healer Fairy'), ('Dark Desert Fairy', 'Dark Desert Healer Fairy'),
('Spike Cave', 'Spike Cave'), ('Spike Cave', 'Spike Cave'),
('Hookshot Cave', 'Hookshot 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)'), ('Cave Shop (Dark Death Mountain)', 'Cave Shop (Dark Death Mountain)'),
('Dark Death Mountain Fairy', 'Dark Death Mountain Healer Fairy'), ('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 (Top)', 'Dark Death Mountain (Top)'),
('Superbunny Cave Exit (Bottom)', 'Dark Death Mountain (East Bottom)'), ('Superbunny Cave Exit (Bottom)', 'Dark Death Mountain (East Bottom)'),
('Hookshot Cave Exit (South)', 'Dark Death Mountain (Top)'), ('Hookshot Cave Exit (South)', 'Dark Death Mountain (Top)'),
@ -3536,9 +3539,9 @@ inverted_default_connections = [('Waterfall of Wishing', 'Waterfall of Wishing'
('Dark Desert Fairy', 'Dark Desert Healer Fairy'), ('Dark Desert Fairy', 'Dark Desert Healer Fairy'),
('Spike Cave', 'Spike Cave'), ('Spike Cave', 'Spike Cave'),
('Hookshot Cave', 'Hookshot 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)'), ('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)'), ('Superbunny Cave Exit (Bottom)', 'Dark Death Mountain (East Bottom)'),
('Hookshot Cave Exit (North)', 'Death Mountain Floating Island (Dark World)'), ('Hookshot Cave Exit (North)', 'Death Mountain Floating Island (Dark World)'),
('Hookshot Cave Back Entrance', 'Hookshot Cave'), ('Hookshot Cave Back Entrance', 'Hookshot Cave'),

View File

@ -30,7 +30,7 @@ def create_inverted_regions(world, player):
"Blind\'s Hideout - Right", "Blind\'s Hideout - Right",
"Blind\'s Hideout - Far Left", "Blind\'s Hideout - Far Left",
"Blind\'s Hideout - Far Right"]), "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', 'Potion Shop Outer Rock', 'Catfish Mirror Spot', 'Northeast Light World Warp']),
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, '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, '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']), create_lw_region(player, 'River', None, ['Light World Pier', 'Potion Shop Pier']),
@ -166,13 +166,13 @@ 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)', 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', 'Dark Lake Hylia Fairy', 'Palace of Darkness Hint', 'East Dark World Hint', 'Northeast Dark World Broken Bridge Pass', 'East Dark World Teleporter', 'EDW Flute',
'Hammer Pegs River Clip Spot', 'Dark Lake Hylia Ledge Clip Spot', 'Dark Desert Cliffs Clip Spot']), 'Hammer Pegs River Clip Spot', 'Dark Lake Hylia Ledge Clip Spot']),
create_dw_region(player, 'Catfish', ['Catfish'], ['Catfish Exit Rock']), 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_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, 'Palace of Darkness Hint', 'a storyteller'),
create_cave_region(player, 'East Dark World 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)', 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']), 'Dark Lake Hylia Shop', 'South Dark World Teleporter', 'Post Aga Teleporter', 'SDW Flute', 'Dark Desert Cliffs Clip Spot']),
create_cave_region(player, 'Inverted Big Bomb Shop', 'the bomb shop'), create_cave_region(player, 'Inverted Big Bomb Shop', 'the bomb shop'),
create_cave_region(player, 'Archery Game', 'a game of skill'), 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', 'Dark Lake Hylia Central Island Teleporter']),
@ -215,8 +215,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, '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 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_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'], create_cave_region(player, 'Superbunny Cave (Top)', 'a connector', ['Superbunny Cave - Top', 'Superbunny Cave - Bottom'], ['Superbunny Cave Exit (Top)']),
['Superbunny Cave Exit (Top)', 'Superbunny Cave Exit (Bottom)']), 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, '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'], 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)']), ['Hookshot Cave Exit (South)', 'Hookshot Cave Exit (North)']),

View File

@ -47,15 +47,10 @@ def get_invalid_mirror_bunny_entrances_dw():
def get_invalid_mirror_bunny_entrances_lw(): def get_invalid_mirror_bunny_entrances_lw():
""" """
Light World entrances that can't be superbunny-mirrored into. Light World entrances that can't be superbunny-mirrored into.
A couple of these, like Blind's Hideout, are odd cases where the pixel
leading into the entrance prevents mirror superbunnying - generally due to
there being stairs there.
""" """
yield 'Bonk Rock Cave' yield 'Bonk Rock Cave'
yield 'Bonk Fairy (Light)' yield 'Bonk Fairy (Light)'
yield 'Blinds Hideout'
yield '50 Rupee Cave' yield '50 Rupee Cave'
yield '20 Rupee Cave' yield '20 Rupee Cave'
yield 'Checkerboard Cave' yield 'Checkerboard Cave'
@ -64,9 +59,10 @@ def get_invalid_mirror_bunny_entrances_lw():
yield 'Light World Bomb Hut' yield 'Light World Bomb Hut'
yield 'Mini Moldorm Cave' yield 'Mini Moldorm Cave'
yield 'Ice Rod Cave' yield 'Ice Rod Cave'
yield 'Hyrule Castle Secret Entrance Stairs'
yield 'Sanctuary Grave' yield 'Sanctuary Grave'
yield 'Kings Grave' yield 'Kings Grave'
#todo: you can for insanity shuffle
yield 'Hyrule Castle Secret Entrance Stairs'
yield 'Tower of Hera' yield 'Tower of Hera'
@ -77,7 +73,8 @@ def get_superbunny_accessible_locations():
yield 'Waterfall of Wishing - Left' yield 'Waterfall of Wishing - Left'
yield 'Waterfall of Wishing - Right' yield 'Waterfall of Wishing - Right'
yield 'King\'s Tomb', 'Floodgate' yield 'King\'s Tomb'
yield 'Floodgate'
yield 'Floodgate Chest' yield 'Floodgate Chest'
yield 'Cave 45' yield 'Cave 45'
yield 'Bonk Rock Cave' yield 'Bonk Rock Cave'
@ -92,6 +89,17 @@ def get_superbunny_accessible_locations():
yield 'Pyramid Fairy - Right' yield 'Pyramid Fairy - Right'
yield 'Superbunny Cave - Top' yield 'Superbunny Cave - Top'
yield 'Superbunny Cave - Bottom' 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'
def get_boots_clip_exits_lw(inverted = False): def get_boots_clip_exits_lw(inverted = False):
@ -109,8 +117,9 @@ def get_boots_clip_exits_lw(inverted = False):
yield 'Lake Hylia Island Clip Spot' yield 'Lake Hylia Island Clip Spot'
yield 'Death Mountain Descent' yield 'Death Mountain Descent'
yield 'Graveyard Ledge Clip Spot' yield 'Graveyard Ledge Clip Spot'
# TODO: This is not an OWG only entrance
# Also requires a waterwalk setup, but the point still remains. # Also requires a waterwalk setup, but the point still remains.
yield 'Waterfall of Wishing' # yield 'Waterfall of Wishing'
if not inverted: if not inverted:
yield 'Spectacle Rock Clip Spot' yield 'Spectacle Rock Clip Spot'
@ -169,3 +178,4 @@ def get_invalid_bunny_revival_dungeons():
yield 'Tower of Hera (Bottom)' yield 'Tower of Hera (Bottom)'
yield 'Swamp Palace (Entrance)' yield 'Swamp Palace (Entrance)'
yield 'Turtle Rock (Entrance)' yield 'Turtle Rock (Entrance)'
yield 'Sanctuary'

View File

@ -205,8 +205,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 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 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_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'], create_cave_region(player, 'Superbunny Cave (Top)', 'a connector', ['Superbunny Cave - Top', 'Superbunny Cave - Bottom'], ['Superbunny Cave Exit (Top)']),
['Superbunny Cave Exit (Top)', 'Superbunny Cave Exit (Bottom)']), 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, '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'], 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)']), ['Hookshot Cave Exit (South)', 'Hookshot Cave Exit (North)']),

View File

@ -58,6 +58,8 @@ def set_rules(world, player):
if world.mode[player] != 'inverted': if world.mode[player] != 'inverted':
set_big_bomb_rules(world, player) set_big_bomb_rules(world, player)
if world.logic[player] == 'owglitches':
add_rule(world.get_entrance('Pyramid Fairy', player), lambda state: state.can_reach('Dark Death Mountain (West Bottom)', 'Region', player) and state.has_Mirror(player), 'or')
else: else:
set_inverted_big_bomb_rules(world, player) set_inverted_big_bomb_rules(world, player)
@ -71,6 +73,8 @@ def set_rules(world, player):
set_trock_key_rules(world, player) set_trock_key_rules(world, player)
set_rule(ganons_tower, lambda state: state.has_crystals(world.crystals_needed_for_gt[player], player)) set_rule(ganons_tower, lambda state: state.has_crystals(world.crystals_needed_for_gt[player], player))
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')
if world.mode[player] != 'inverted': if world.mode[player] != 'inverted':
set_bunny_rules(world, player) set_bunny_rules(world, player)
@ -159,7 +163,8 @@ def global_rules(world, player):
set_rule(world.get_entrance('Sewers Back Door', player), lambda state: state.has_key('Small Key (Escape)', player)) set_rule(world.get_entrance('Sewers Back Door', player), lambda state: state.has_key('Small Key (Escape)', player))
set_rule(world.get_entrance('Agahnim 1', player), lambda state: state.has_sword(player) and state.has_key('Small Key (Agahnims Tower)', player, 2)) set_rule(world.get_entrance('Agahnim 1', player), lambda state: state.has_sword(player) and state.has_key('Small Key (Agahnims Tower)', player, 2))
set_defeat_dungeon_boss_rule(world.get_location('Agahnim 1', player)) set_defeat_dungeon_boss_rule(world.get_location('Agahnim 1', player))
set_rule(world.get_location('Castle Tower - Dark Maze', player), lambda state: state.has_key('Small Key (Agahnims Tower)', player)) set_rule(world.get_location('Castle Tower - Room 03', player), lambda state: state.can_kill_most_things(player, 8))
set_rule(world.get_location('Castle Tower - Dark Maze', player), lambda state: state.can_kill_most_things(player, 8) and state.has_key('Small Key (Agahnims Tower)', player))
set_rule(world.get_location('Eastern Palace - Big Chest', player), lambda state: state.has('Big Key (Eastern Palace)', player)) set_rule(world.get_location('Eastern Palace - Big Chest', player), lambda state: state.has('Big Key (Eastern Palace)', player))
set_rule(world.get_location('Eastern Palace - Boss', player), lambda state: state.can_shoot_arrows(player) and state.has('Big Key (Eastern Palace)', player) and world.get_location('Eastern Palace - Boss', player).parent_region.dungeon.boss.can_defeat(state)) set_rule(world.get_location('Eastern Palace - Boss', player), lambda state: state.can_shoot_arrows(player) and state.has('Big Key (Eastern Palace)', player) and world.get_location('Eastern Palace - Boss', player).parent_region.dungeon.boss.can_defeat(state))
@ -383,6 +388,7 @@ def default_rules(world, player):
set_rule(world.get_entrance('South Hyrule Teleporter', player), lambda state: state.has('Hammer', player) and state.can_lift_rocks(player) and state.has_Pearl(player)) # bunny cannot use hammer set_rule(world.get_entrance('South Hyrule Teleporter', player), lambda state: state.has('Hammer', player) and state.can_lift_rocks(player) and state.has_Pearl(player)) # bunny cannot use hammer
set_rule(world.get_entrance('Kakariko Teleporter', player), lambda state: ((state.has('Hammer', player) and state.can_lift_rocks(player)) or state.can_lift_heavy_rocks(player)) and state.has_Pearl(player)) # bunny cannot lift bushes set_rule(world.get_entrance('Kakariko Teleporter', player), lambda state: ((state.has('Hammer', player) and state.can_lift_rocks(player)) or state.can_lift_heavy_rocks(player)) and state.has_Pearl(player)) # bunny cannot lift bushes
set_rule(world.get_location('Flute Spot', player), lambda state: state.has('Shovel', player)) set_rule(world.get_location('Flute Spot', player), lambda state: state.has('Shovel', player))
set_rule(world.get_entrance('Bat Cave Drop Ledge', player), lambda state: state.has('Hammer', player))
set_rule(world.get_location('Zora\'s Ledge', player), lambda state: state.has('Flippers', player)) set_rule(world.get_location('Zora\'s Ledge', player), lambda state: state.has('Flippers', player))
set_rule(world.get_entrance('Waterfall of Wishing', player), lambda state: state.has('Flippers', 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', player), lambda state: state.has('Flippers', 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
@ -502,7 +508,7 @@ def inverted_rules(world, player):
set_rule(world.get_entrance('Light Hype Fairy', 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('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('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 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('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)) set_rule(world.get_entrance('Potion Shop Inner Bushes', player), lambda state: state.has_Pearl(player))
@ -562,7 +568,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('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_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('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('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)) set_rule(world.get_entrance('South Dark World Bridge', player), lambda state: state.has('Hammer', player))
@ -601,7 +607,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 (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('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('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('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 (!) 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 (!)
@ -613,7 +618,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('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('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('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('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('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)) set_rule(world.get_entrance('Maze Race Mirror Spot', player), lambda state: state.has_Mirror(player))
@ -650,7 +655,6 @@ def no_glitches_rules(world, player):
set_rule(world.get_entrance('Dark Lake Hylia Teleporter', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player) and (state.has('Hammer', player) or state.can_lift_rocks(player))) set_rule(world.get_entrance('Dark Lake Hylia Teleporter', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player) and (state.has('Hammer', player) or state.can_lift_rocks(player)))
set_rule(world.get_entrance('Dark Lake Hylia Ledge Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) set_rule(world.get_entrance('Dark Lake Hylia Ledge Drop', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player))
else: else:
set_rule(world.get_entrance('Bat Cave Drop Ledge', player), lambda state: state.has('Hammer', player))
set_rule(world.get_entrance('Zoras River', player), lambda state: state.has_Pearl(player) and (state.has('Flippers', player) or state.can_lift_rocks(player))) set_rule(world.get_entrance('Zoras River', player), lambda state: state.has_Pearl(player) and (state.has('Flippers', player) or state.can_lift_rocks(player)))
set_rule(world.get_entrance('Lake Hylia Central Island Pier', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) # can be fake flippered to set_rule(world.get_entrance('Lake Hylia Central Island Pier', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) # can be fake flippered to
set_rule(world.get_entrance('Lake Hylia Island Pier', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) # can be fake flippered to set_rule(world.get_entrance('Lake Hylia Island Pier', player), lambda state: state.has_Pearl(player) and state.has('Flippers', player)) # can be fake flippered to
@ -777,11 +781,10 @@ def overworld_glitches_rules(world, player):
# Regions that require the boots and some other stuff. # Regions that require the boots and some other stuff.
if world.mode[player] != 'inverted': if world.mode[player] != 'inverted':
set_rule(world.get_entrance('Dark Desert Teleporter', player), lambda state: state.has('Flute', player) or (state.can_boots_clip_dw(player) and state.can_lift_heavy_rocks(player))) set_rule(world.get_entrance('Dark Desert Teleporter', player), lambda state: (state.has('Flute', player) or state.can_boots_clip_lw(player)) and state.can_lift_heavy_rocks(player))
set_rule(world.get_entrance('Turtle Rock Teleporter', player), lambda state: (state.can_boots_clip_dw(player) or state.can_lift_heavy_rocks(player)) and state.has('Hammer', player)) set_rule(world.get_entrance('Turtle Rock Teleporter', player), lambda state: (state.can_boots_clip_lw(player) or state.can_lift_heavy_rocks(player)) and state.has('Hammer', player))
add_rule(world.get_entrance('Catfish Exit Rock', player), lambda state: state.can_boots_clip_dw(player), 'or') add_rule(world.get_entrance('Catfish Exit Rock', player), lambda state: state.can_boots_clip_dw(player), 'or')
add_rule(world.get_entrance('East Dark World Broken Bridge Pass', player), lambda state: state.can_boots_clip_dw(player), 'or') add_rule(world.get_entrance('East Dark World Broken Bridge Pass', player), lambda state: state.can_boots_clip_dw(player), 'or')
add_rule(world.get_entrance('Pyramid Fairy', player), lambda state: state.can_reach('Dark Death Mountain (West Bottom)', 'Region', player) and state.has_Mirror(player))
else: else:
add_rule(world.get_entrance('South Dark World Teleporter', player), lambda state: state.has_Boots(player) and state.can_lift_rocks(player), 'or') add_rule(world.get_entrance('South Dark World Teleporter', player), lambda state: state.has_Boots(player) and state.can_lift_rocks(player), 'or')
@ -1355,7 +1358,6 @@ def set_bunny_rules(world, player):
bunny_accessible_locations = ['Link\'s Uncle', 'Sahasrahla', 'Sick Kid', 'Lost Woods Hideout', 'Lumberjack Tree', 'Checkerboard Cave', 'Potion Shop', 'Spectacle Rock Cave', 'Pyramid', 'Hype Cave - Generous Guy', 'Peg Cave', 'Bumper Cave Ledge', 'Dark Blacksmith Ruins'] bunny_accessible_locations = ['Link\'s Uncle', 'Sahasrahla', 'Sick Kid', 'Lost Woods Hideout', 'Lumberjack Tree', 'Checkerboard Cave', 'Potion Shop', 'Spectacle Rock Cave', 'Pyramid', 'Hype Cave - Generous Guy', 'Peg Cave', 'Bumper Cave Ledge', 'Dark Blacksmith Ruins']
def path_to_access_rule(path, entrance): def path_to_access_rule(path, entrance):
return lambda state: state.can_reach(entrance) and all(rule(state) for rule in path) return lambda state: state.can_reach(entrance) and all(rule(state) for rule in path)
@ -1366,11 +1368,15 @@ def set_bunny_rules(world, player):
# In OWG, a location can potentially be superbunny-mirror accessible or # In OWG, a location can potentially be superbunny-mirror accessible or
# bunny revival accessible. # bunny revival accessible.
if world.logic[player] == 'owglitches': if world.logic[player] == 'owglitches':
if region.name == 'Swamp Palace (Entrance)':
return lambda state: state.has_Pearl(player)
if region.name in OWGSets.get_invalid_bunny_revival_dungeons(): if region.name in OWGSets.get_invalid_bunny_revival_dungeons():
return lambda state: state.has_Mirror(player) or state.has_Pearl(player) return lambda state: state.has_Mirror(player) or state.has_Pearl(player)
if not any([ if region.type == RegionType.Dungeon:
None not in [location, connecting_entrance] and location.name in OWGSets.get_superbunny_accessible_locations() and connecting_entrance.name not in OWGSets.get_invalid_mirror_bunny_entrances_dw(), return lambda state: True
not region.is_light_world]): if (((location is None or location.name not in OWGSets.get_superbunny_accessible_locations())
or (connecting_entrance is not None and connecting_entrance.name in OWGSets.get_invalid_bunny_revival_dungeons()))
and not region.is_light_world):
return lambda state: state.has_Pearl(player) return lambda state: state.has_Pearl(player)
else: else:
if not region.is_light_world: if not region.is_light_world:
@ -1400,10 +1406,13 @@ def set_bunny_rules(world, player):
if not new_region.is_light_world: if not new_region.is_light_world:
# For OWG, establish superbunny and revival rules. # For OWG, establish superbunny and revival rules.
if world.logic[player] == 'owglitches' and entrance.name not in OWGSets.get_invalid_mirror_bunny_entrances_dw(): if world.logic[player] == 'owglitches' and entrance.name not in OWGSets.get_invalid_mirror_bunny_entrances_dw():
for location in entrance.connected_region.locations: if location is not None and location.name in OWGSets.get_superbunny_accessible_locations():
if location.name in OWGSets.get_superbunny_accessible_locations(): if new_region.name == 'Superbunny Cave (Bottom)' or region.name == 'Kakariko Well (top)':
possible_options.append(lambda state: path_to_access_rule(new_path, entrance))
else:
possible_options.append(lambda state: path_to_access_rule(new_path, entrance) and state.has_Mirror(player)) possible_options.append(lambda state: path_to_access_rule(new_path, entrance) and state.has_Mirror(player))
continue if new_region.type != RegionType.Cave:
continue
else: else:
continue continue
if new_region.is_dark_world: if new_region.is_dark_world:
@ -1428,16 +1437,14 @@ def set_bunny_rules(world, player):
# Add requirements for all locations that are actually in the dark world, except those available to the bunny, including dungeon revival # Add requirements for all locations that are actually in the dark world, except those available to the bunny, including dungeon revival
for entrance in world.get_entrances(): for entrance in world.get_entrances():
if entrance.player == player and entrance.parent_region.is_dark_world: if entrance.player == player and entrance.connected_region.is_dark_world:
if world.logic[player] == 'owglitches': if world.logic[player] == 'owglitches':
if entrance.connected_region.type == RegionType.Dungeon: if entrance.connected_region.type == RegionType.Dungeon:
if entrance.connected_region.name in OWGSets.get_invalid_bunny_revival_dungeons(): if entrance.parent_region.type != RegionType.Dungeon and entrance.connected_region.name in OWGSets.get_invalid_bunny_revival_dungeons():
add_rule(entrance, get_rule_to_add(entrance.connected_region, None, entrance)) add_rule(entrance, get_rule_to_add(entrance.connected_region, None, entrance))
continue continue
if entrance.connected_region.name == 'Turtle Rock (Entrance)': if entrance.connected_region.name == 'Turtle Rock (Entrance)':
add_rule(world.get_entrance('Turtle Rock Entrance Gap', player), get_rule_to_add(entrance.connected_region, None, entrance)) add_rule(world.get_entrance('Turtle Rock Entrance Gap', player), get_rule_to_add(entrance.connected_region, None, entrance))
if entrance.name in OWGSets.get_invalid_mirror_bunny_entrances_dw():
continue
for location in entrance.connected_region.locations: for location in entrance.connected_region.locations:
if world.logic[player] == 'owglitches' and entrance.name in OWGSets.get_invalid_mirror_bunny_entrances_dw(): if world.logic[player] == 'owglitches' and entrance.name in OWGSets.get_invalid_mirror_bunny_entrances_dw():
add_rule(location, get_rule_to_add(entrance.connected_region, location, entrance)) add_rule(location, get_rule_to_add(entrance.connected_region, location, entrance))
@ -1451,7 +1458,7 @@ def set_inverted_bunny_rules(world, player):
# Note spiral cave may be technically passible, but it would be too absurd to require since OHKO mode is a thing. # 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', 'Skull Woods First Section (Right)', 'Skull Woods First Section (Left)', 'Skull Woods First Section (Top)', 'Turtle Rock (Entrance)', 'Turtle Rock (Second Section)', 'Turtle Rock (Big Chest)', 'Skull Woods Second Section (Drop)', bunny_impassable_caves = ['Bumper Cave', 'Two Brothers House', 'Hookshot Cave', 'Skull Woods First Section (Right)', 'Skull Woods First Section (Left)', 'Skull Woods First Section (Top)', 'Turtle Rock (Entrance)', 'Turtle Rock (Second Section)', 'Turtle Rock (Big Chest)', 'Skull Woods Second Section (Drop)',
'Turtle Rock (Eye Bridge)', 'Sewers', 'Pyramid', 'Spiral Cave (Top)', 'Desert Palace Main (Inner)', 'Fairy Ascension Cave (Drop)', 'The Sky'] 'Turtle Rock (Eye Bridge)', 'Sewers', 'Pyramid', 'Spiral Cave (Top)', 'Desert Palace Main (Inner)', 'Fairy Ascension Cave (Drop)', 'The Sky']
bunny_accessible_locations = ['Link\'s Uncle', 'Sahasrahla', 'Sick Kid', 'Lost Woods Hideout', 'Lumberjack Tree', 'Checkerboard Cave', 'Potion Shop', 'Spectacle Rock Cave', 'Pyramid', 'Hype Cave - Generous Guy', 'Peg Cave', 'Bumper Cave Ledge', 'Dark Blacksmith Ruins', 'Bombos Tablet Ledge', 'Ether Tablet', 'Purple Chest'] bunny_accessible_locations = ['Link\'s Uncle', 'Sahasrahla', 'Sick Kid', 'Lost Woods Hideout', 'Lumberjack Tree', 'Checkerboard Cave', 'Potion Shop', 'Spectacle Rock Cave', 'Pyramid', 'Hype Cave - Generous Guy', 'Peg Cave', 'Bumper Cave Ledge', 'Dark Blacksmith Ruins', 'Spectacle Rock', 'Bombos Tablet', 'Ether Tablet', 'Purple Chest', 'Blacksmith', 'Missing Smith', 'Master Sword Pedestal', 'Bottle Merchant', 'Sunken Treasure', 'Desert Ledge']
def path_to_access_rule(path, entrance): def path_to_access_rule(path, entrance):
return lambda state: state.can_reach(entrance) and all(rule(state) for rule in path) return lambda state: state.can_reach(entrance) and all(rule(state) for rule in path)
@ -1463,11 +1470,15 @@ def set_inverted_bunny_rules(world, player):
# In OWG, a location can potentially be superbunny-mirror accessible or # In OWG, a location can potentially be superbunny-mirror accessible or
# bunny revival accessible. # bunny revival accessible.
if world.logic[player] == 'owglitches': if world.logic[player] == 'owglitches':
if region.name == 'Swamp Palace (Entrance)':
return lambda state: state.has_Pearl(player)
if region.name in OWGSets.get_invalid_bunny_revival_dungeons(): if region.name in OWGSets.get_invalid_bunny_revival_dungeons():
return lambda state: state.has_Mirror(player) or state.has_Pearl(player) return lambda state: state.has_Mirror(player) or state.has_Pearl(player)
if not any([ if region.type == RegionType.Dungeon:
None not in [location, connecting_entrance] and location.name in OWGSets.get_superbunny_accessible_locations() and connecting_entrance.name not in OWGSets.get_invalid_mirror_bunny_entrances_lw(), return lambda state: True
not region.is_dark_world]): if (((location is None or location.name not in OWGSets.get_superbunny_accessible_locations())
or (connecting_entrance is not None and connecting_entrance.name in OWGSets.get_invalid_bunny_revival_dungeons()))
and not region.is_dark_world):
return lambda state: state.has_Pearl(player) return lambda state: state.has_Pearl(player)
else: else:
if not region.is_dark_world: if not region.is_dark_world:
@ -1496,10 +1507,13 @@ def set_inverted_bunny_rules(world, player):
if not new_region.is_dark_world: if not new_region.is_dark_world:
# For OWG, establish superbunny and revival rules. # For OWG, establish superbunny and revival rules.
if world.logic[player] == 'owglitches' and entrance.name not in OWGSets.get_invalid_mirror_bunny_entrances_lw(): if world.logic[player] == 'owglitches' and entrance.name not in OWGSets.get_invalid_mirror_bunny_entrances_lw():
for location in entrance.connected_region.locations: if location is not None and location.name in OWGSets.get_superbunny_accessible_locations():
if location.name in OWGSets.get_superbunny_accessible_locations(): if new_region.name == 'Superbunny Cave (Bottom)' or region.name == 'Kakariko Well (top)':
possible_options.append(lambda state: path_to_access_rule(new_path, entrance))
else:
possible_options.append(lambda state: path_to_access_rule(new_path, entrance) and state.has_Mirror(player)) possible_options.append(lambda state: path_to_access_rule(new_path, entrance) and state.has_Mirror(player))
continue if new_region.type != RegionType.Cave:
continue
else: else:
continue continue
if new_region.is_light_world: if new_region.is_light_world:
@ -1524,16 +1538,14 @@ def set_inverted_bunny_rules(world, player):
# Add requirements for all locations that are actually in the light world, except those available to the bunny, including dungeon revival # Add requirements for all locations that are actually in the light world, except those available to the bunny, including dungeon revival
for entrance in world.get_entrances(): for entrance in world.get_entrances():
if entrance.player == player and entrance.parent_region.is_light_world: if entrance.player == player and entrance.connected_region.is_light_world:
if world.logic[player] == 'owglitches': if world.logic[player] == 'owglitches':
if entrance.connected_region.type == RegionType.Dungeon: if entrance.connected_region.type == RegionType.Dungeon:
if entrance.connected_region.name in OWGSets.get_invalid_bunny_revival_dungeons(): if entrance.parent_region.type != RegionType.Dungeon and entrance.connected_region.name in OWGSets.get_invalid_bunny_revival_dungeons():
add_rule(entrance, get_rule_to_add(entrance.connected_region, None, entrance)) add_rule(entrance, get_rule_to_add(entrance.connected_region, None, entrance))
continue continue
if entrance.connected_region.name == 'Turtle Rock (Entrance)': if entrance.connected_region.name == 'Turtle Rock (Entrance)':
add_rule(world.get_entrance('Turtle Rock Entrance Gap', player), get_rule_to_add(entrance.connected_region, None, entrance)) add_rule(world.get_entrance('Turtle Rock Entrance Gap', player), get_rule_to_add(entrance.connected_region, None, entrance))
if entrance.name in OWGSets.get_invalid_mirror_bunny_entrances_lw():
continue
for location in entrance.connected_region.locations: for location in entrance.connected_region.locations:
if world.logic[player] == 'owglitches' and entrance.name in OWGSets.get_invalid_mirror_bunny_entrances_lw(): if world.logic[player] == 'owglitches' and entrance.name in OWGSets.get_invalid_mirror_bunny_entrances_lw():
add_rule(location, get_rule_to_add(entrance.connected_region, location, entrance)) add_rule(location, get_rule_to_add(entrance.connected_region, location, entrance))

50
test/TestBase.py Normal file
View 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)

View File

@ -1,25 +1,10 @@
from BaseClasses import World from test.vanilla.TestVanilla import TestVanilla
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): 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): def testWestDeathMountain(self):
self.run_tests([ self.run_location_tests([
["Ether Tablet", False, []], ["Ether Tablet", False, []],
["Ether Tablet", False, [], ['Progressive Glove', 'Flute']], ["Ether Tablet", False, [], ['Progressive Glove', 'Flute']],
["Ether Tablet", False, [], ['Lamp', 'Flute']], ["Ether Tablet", False, [], ['Lamp', 'Flute']],

View File

@ -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)

View File

@ -5,22 +5,22 @@ from Dungeons import create_dungeons, get_dungeon_item_pool
from EntranceShuffle import mandatory_connections, connect_simple from EntranceShuffle import mandatory_connections, connect_simple
from ItemList import difficulties, generate_itempool from ItemList import difficulties, generate_itempool
from Items import ItemFactory from Items import ItemFactory
from Regions import create_regions from Regions import create_regions, create_shops
from Rules import set_rules from Rules import set_rules
class TestDungeon(unittest.TestCase): class TestDungeon(unittest.TestCase):
def setUp(self): def setUp(self):
self.world = World(1, 'vanilla', 'noglitches', 'open', 'random', 'normal', 'normal', 'none', 'on', 'ganon', 'balanced', self.world = World(1, {1:'vanilla'}, {1:'noglitches'}, {1:'open'}, {1:'random'}, {1:'normal'}, {1:'normal'}, {1:False}, {1:'on'}, {1:'ganon'}, 'balanced', {1:'items'},
True, False, False, False, False, False, False, False, False, None, True, {1:False}, False, None, {1:False})
'none', False)
self.starting_regions = [] self.starting_regions = []
self.world.difficulty_requirements = difficulties['normal'] self.world.difficulty_requirements[1] = difficulties['normal']
create_regions(self.world, 1) create_regions(self.world, 1)
create_dungeons(self.world, 1) create_dungeons(self.world, 1)
create_shops(self.world, 1)
for exitname, regionname in mandatory_connections: for exitname, regionname in mandatory_connections:
connect_simple(self.world, exitname, regionname, 1) connect_simple(self.world, exitname, regionname, 1)
connect_simple(self.world, self.world.get_entrance('Big Bomb Shop', 1), self.world.get_region('Big Bomb Shop', 1), 1) connect_simple(self.world, 'Big Bomb Shop', 'Big Bomb Shop', 1)
self.world.swamp_patch_required[1] = True self.world.swamp_patch_required[1] = True
set_rules(self.world, 1) set_rules(self.world, 1)
generate_itempool(self.world, 1) generate_itempool(self.world, 1)

View File

@ -4,19 +4,19 @@ from EntranceShuffle import link_inverted_entrances
from InvertedRegions import create_inverted_regions from InvertedRegions import create_inverted_regions
from ItemList import generate_itempool, difficulties from ItemList import generate_itempool, difficulties
from Items import ItemFactory from Items import ItemFactory
from Regions import mark_light_world_regions from Regions import mark_light_world_regions, create_shops
from Rules import set_rules from Rules import set_rules
from test.TestVanilla import TestVanilla from test.TestBase import TestBase
class TestInverted(TestVanilla): class TestInverted(TestBase):
def setUp(self): def setUp(self):
self.world = World(1, 'vanilla', 'noglitches', 'inverted', 'random', 'normal', 'normal', 'none', 'on', 'ganon', 'balanced', self.world = World(1, {1:'vanilla'}, {1:'noglitches'}, {1:'inverted'}, {1:'random'}, {1:'normal'}, {1:'normal'}, {1:False}, {1:'on'}, {1:'ganon'}, 'balanced', {1:'items'},
True, False, False, False, False, False, False, False, False, None, True, {1:False}, False, None, {1:False})
'none', False) self.world.difficulty_requirements[1] = difficulties['normal']
self.world.difficulty_requirements = difficulties['normal']
create_inverted_regions(self.world, 1) create_inverted_regions(self.world, 1)
create_dungeons(self.world, 1) create_dungeons(self.world, 1)
create_shops(self.world, 1)
link_inverted_entrances(self.world, 1) link_inverted_entrances(self.world, 1)
generate_itempool(self.world, 1) generate_itempool(self.world, 1)
self.world.required_medallions[1] = ['Ether', 'Quake'] self.world.required_medallions[1] = ['Ether', 'Quake']
@ -24,5 +24,5 @@ class TestInverted(TestVanilla):
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.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 1', 1).item = None
self.world.get_location('Agahnim 2', 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) set_rules(self.world, 1)

View File

@ -3,7 +3,7 @@ import unittest
from BaseClasses import World from BaseClasses import World
from Dungeons import create_dungeons from Dungeons import create_dungeons
from EntranceShuffle import connect_entrance, Inverted_LW_Entrances, Inverted_LW_Dungeon_Entrances, Inverted_LW_Single_Cave_Doors, Inverted_Old_Man_Entrances, Inverted_DW_Entrances, Inverted_DW_Dungeon_Entrances, Inverted_DW_Single_Cave_Doors, \ from EntranceShuffle import connect_entrance, Inverted_LW_Entrances, Inverted_LW_Dungeon_Entrances, Inverted_LW_Single_Cave_Doors, Inverted_Old_Man_Entrances, Inverted_DW_Entrances, Inverted_DW_Dungeon_Entrances, Inverted_DW_Single_Cave_Doors, \
Inverted_LW_Entrances_Must_Exit, Inverted_LW_Dungeon_Entrances_Must_Exit, Inverted_Bomb_Shop_Multi_Cave_Doors, Inverted_Bomb_Shop_Single_Cave_Doors, Inverted_Blacksmith_Single_Cave_Doors, Inverted_Blacksmith_Multi_Cave_Doors Inverted_LW_Entrances_Must_Exit, Inverted_LW_Dungeon_Entrances_Must_Exit, Inverted_Bomb_Shop_Multi_Cave_Doors, Inverted_Bomb_Shop_Single_Cave_Doors, Blacksmith_Single_Cave_Doors, Inverted_Blacksmith_Multi_Cave_Doors
from InvertedRegions import create_inverted_regions from InvertedRegions import create_inverted_regions
from ItemList import difficulties from ItemList import difficulties
from Rules import set_inverted_big_bomb_rules from Rules import set_inverted_big_bomb_rules
@ -12,10 +12,9 @@ from Rules import set_inverted_big_bomb_rules
class TestInvertedBombRules(unittest.TestCase): class TestInvertedBombRules(unittest.TestCase):
def setUp(self): def setUp(self):
self.world = World(1, 'vanilla', 'noglitches', 'inverted', 'random', 'normal', 'normal', 'none', 'on', 'ganon', 'balanced', self.world = World(1, {1:'vanilla'}, {1:'noglitches'}, {1:'inverted'}, {1:'random'}, {1:'normal'}, {1:'normal'}, {1:False}, {1:'on'}, {1:'ganon'}, 'balanced', {1:'items'},
True, False, False, False, False, False, False, False, False, None, True, {1:False}, False, None, {1:False})
'none', False) self.world.difficulty_requirements[1] = difficulties['normal']
self.world.difficulty_requirements = difficulties['normal']
create_inverted_regions(self.world, 1) create_inverted_regions(self.world, 1)
create_dungeons(self.world, 1) create_dungeons(self.world, 1)
@ -26,13 +25,13 @@ class TestInvertedBombRules(unittest.TestCase):
for entrance_name in (entrances + must_exits): for entrance_name in (entrances + must_exits):
if entrance_name not in ['Desert Palace Entrance (East)', 'Spectacle Rock Cave', 'Spectacle Rock Cave (Bottom)']: 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 = self.world.get_entrance(entrance_name, 1)
connect_entrance(self.world, entrance, 'Inverted Big Bomb Shop', 1) connect_entrance(self.world, entrance_name, 'Inverted Big Bomb Shop', 1)
set_inverted_big_bomb_rules(self.world, 1) set_inverted_big_bomb_rules(self.world, 1)
entrance.connected_region.entrances.remove(entrance) entrance.connected_region.entrances.remove(entrance)
entrance.connected_region = None entrance.connected_region = None
def testInvalidEntrancesAreNotUsed(self): def testInvalidEntrancesAreNotUsed(self):
entrances = list(Inverted_Blacksmith_Multi_Cave_Doors + Inverted_Blacksmith_Single_Cave_Doors + Inverted_Bomb_Shop_Multi_Cave_Doors + Inverted_Bomb_Shop_Single_Cave_Doors) entrances = list(Inverted_Blacksmith_Multi_Cave_Doors + Blacksmith_Single_Cave_Doors + Inverted_Bomb_Shop_Multi_Cave_Doors + Inverted_Bomb_Shop_Single_Cave_Doors)
invalid_entrances = ['Desert Palace Entrance (East)', 'Spectacle Rock Cave', 'Spectacle Rock Cave (Bottom)', 'Pyramid Fairy'] invalid_entrances = ['Desert Palace Entrance (East)', 'Spectacle Rock Cave', 'Spectacle Rock Cave (Bottom)', 'Pyramid Fairy']
for invalid_entrance in invalid_entrances: for invalid_entrance in invalid_entrances:
self.assertNotIn(invalid_entrance, entrances) self.assertNotIn(invalid_entrance, entrances)
@ -40,7 +39,7 @@ class TestInvertedBombRules(unittest.TestCase):
def testInvalidEntrances(self): def testInvalidEntrances(self):
for entrance_name in ['Desert Palace Entrance (East)', 'Spectacle Rock Cave', 'Spectacle Rock Cave (Bottom)']: for entrance_name in ['Desert Palace Entrance (East)', 'Spectacle Rock Cave', 'Spectacle Rock Cave (Bottom)']:
entrance = self.world.get_entrance(entrance_name, 1) entrance = self.world.get_entrance(entrance_name, 1)
connect_entrance(self.world, entrance, 'Inverted Big Bomb Shop', 1) connect_entrance(self.world, entrance_name, 'Inverted Big Bomb Shop', 1)
with self.assertRaises(Exception): with self.assertRaises(Exception):
set_inverted_big_bomb_rules(self.world, 1) set_inverted_big_bomb_rules(self.world, 1)
entrance.connected_region.entrances.remove(entrance) entrance.connected_region.entrances.remove(entrance)

View File

@ -1,10 +1,10 @@
from test.inverted.TestInverted import TestInverted from test.inverted.TestInverted import TestInverted
class TestInvertedDeathMountain(TestInverted): class TestInvertedDarkWorld(TestInverted):
def testNorthWest(self): def testNorthWest(self):
self.run_tests([ self.run_location_tests([
["Brewery", True, []], ["Brewery", True, []],
["C-Shaped House", True, []], ["C-Shaped House", True, []],
@ -30,22 +30,18 @@ class TestInvertedDeathMountain(TestInverted):
["Blacksmith", False, []], ["Blacksmith", False, []],
["Blacksmith", False, [], ['Progressive Glove', 'Magic Mirror']], ["Blacksmith", False, [], ['Progressive Glove', 'Magic Mirror']],
["Blacksmith", True, ['Progressive Glove', 'Progressive Glove', 'Moon Pearl']], ["Blacksmith", True, ['Progressive Glove', 'Progressive Glove', 'Moon Pearl']],
#@todo: Can get this without moon pearl ["Blacksmith", True, ['Beat Agahnim 1', 'Magic Mirror']],
#["Blacksmith", True, ['Beat Agahnim 1', 'Magic Mirror']],
["Blacksmith", True, ['Beat Agahnim 1', 'Magic Mirror', 'Moon Pearl']],
["Blacksmith", True, ['Progressive Glove', 'Hammer', 'Magic Mirror', 'Moon Pearl']], ["Blacksmith", True, ['Progressive Glove', 'Hammer', 'Magic Mirror', 'Moon Pearl']],
["Purple Chest", False, []], ["Purple Chest", False, []],
["Purple Chest", False, [], ['Progressive Glove', 'Magic Mirror']], ["Purple Chest", False, [], ['Progressive Glove', 'Magic Mirror']],
["Purple Chest", True, ['Progressive Glove', 'Progressive Glove', 'Moon Pearl']], ["Purple Chest", True, ['Progressive Glove', 'Progressive Glove', 'Moon Pearl']],
# @todo: Can get this without moon pearl ["Purple Chest", True, ['Beat Agahnim 1', 'Magic Mirror']],
#["Purple Chest", True, ['Beat Agahnim 1', 'Magic Mirror']],
["Purple Chest", True, ['Beat Agahnim 1', 'Magic Mirror', 'Moon Pearl']],
["Purple Chest", True, ['Progressive Glove', 'Hammer', 'Magic Mirror', 'Moon Pearl']], ["Purple Chest", True, ['Progressive Glove', 'Hammer', 'Magic Mirror', 'Moon Pearl']],
]) ])
def testNorthEast(self): def testNorthEast(self):
self.run_tests([ self.run_location_tests([
["Catfish", False, []], ["Catfish", False, []],
["Catfish", False, [], ['Progressive Glove', 'Flippers']], ["Catfish", False, [], ['Progressive Glove', 'Flippers']],
["Catfish", False, [], ['Progressive Glove', 'Magic Mirror']], ["Catfish", False, [], ['Progressive Glove', 'Magic Mirror']],
@ -80,7 +76,7 @@ class TestInvertedDeathMountain(TestInverted):
]) ])
def testSouth(self): def testSouth(self):
self.run_tests([ self.run_location_tests([
["Hype Cave - Top", True, []], ["Hype Cave - Top", True, []],
["Hype Cave - Middle Right", True, []], ["Hype Cave - Middle Right", True, []],
@ -99,7 +95,7 @@ class TestInvertedDeathMountain(TestInverted):
]) ])
def testMireArea(self): def testMireArea(self):
self.run_tests([ self.run_location_tests([
["Mire Shed - Left", False, []], ["Mire Shed - Left", False, []],
["Mire Shed - Left", False, [], ['Flute', 'Magic Mirror']], ["Mire Shed - Left", False, [], ['Flute', 'Magic Mirror']],
["Mire Shed - Left", True, ['Moon Pearl', 'Flute', 'Progressive Glove', 'Progressive Glove']], ["Mire Shed - Left", True, ['Moon Pearl', 'Flute', 'Progressive Glove', 'Progressive Glove']],

View File

@ -4,7 +4,7 @@ from test.inverted.TestInverted import TestInverted
class TestInvertedDeathMountain(TestInverted): class TestInvertedDeathMountain(TestInverted):
def testWestDeathMountain(self): def testWestDeathMountain(self):
self.run_tests([ self.run_location_tests([
["Old Man", False, []], ["Old Man", False, []],
["Old Man", False, [], ['Progressive Glove', 'Flute']], ["Old Man", False, [], ['Progressive Glove', 'Flute']],
["Old Man", False, [], ['Lamp']], ["Old Man", False, [], ['Lamp']],
@ -23,7 +23,7 @@ class TestInvertedDeathMountain(TestInverted):
]) ])
def testEastDeathMountain(self): def testEastDeathMountain(self):
self.run_tests([ self.run_location_tests([
["Spiral Cave", False, []], ["Spiral Cave", False, []],
["Spiral Cave", False, [], ['Moon Pearl']], ["Spiral Cave", False, [], ['Moon Pearl']],
["Spiral Cave", False, [], ['Progressive Glove', 'Flute']], ["Spiral Cave", False, [], ['Progressive Glove', 'Flute']],
@ -158,7 +158,7 @@ class TestInvertedDeathMountain(TestInverted):
]) ])
def testEastDarkWorldDeathMountain(self): def testEastDarkWorldDeathMountain(self):
self.run_tests([ self.run_location_tests([
["Superbunny Cave - Top", False, []], ["Superbunny Cave - Top", False, []],
["Superbunny Cave - Top", False, [], ['Progressive Glove', 'Flute']], ["Superbunny Cave - Top", False, [], ['Progressive Glove', 'Flute']],
["Superbunny Cave - Top", True, ['Progressive Glove', 'Lamp']], ["Superbunny Cave - Top", True, ['Progressive Glove', 'Lamp']],
@ -204,18 +204,19 @@ class TestInvertedDeathMountain(TestInverted):
]) ])
def testWestDarkWorldDeathMountain(self): def testWestDarkWorldDeathMountain(self):
self.run_tests([ self.run_location_tests([
["Spike Cave", False, []], ["Spike Cave", False, []],
["Spike Cave", False, [], ['Progressive Glove']], ["Spike Cave", False, [], ['Progressive Glove']],
["Spike Cave", False, [], ['Hammer']], ["Spike Cave", False, [], ['Hammer']],
["Spike Cave", False, [], ['Cape', 'Cane of Byrna']], ["Spike Cave", False, [], ['Cape', 'Cane of Byrna']],
["Spike Cave", False, [], ['Cane of Byrna', 'AnyBottle', 'Magic Upgrade (1/2)']], ["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, [], ['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']],
["Spike Cave", True, ['Bottle', 'Hammer', 'Progressive Glove', 'Lamp', 'Moon Pearl', 'Cape']], # Change from base ER - this fork places a blue potion in dark world
#["Spike Cave", True, ['Bottle', 'Hammer', 'Progressive Glove', 'Lamp', 'Moon Pearl', 'Cape']],
["Spike Cave", True, ['Bottle', 'Hammer', 'Progressive Glove', 'Flute', 'Moon Pearl', 'Cape']], ["Spike Cave", True, ['Bottle', 'Hammer', 'Progressive Glove', 'Flute', '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']],
["Spike Cave", True, ['Bottle', 'Hammer', 'Progressive Glove', 'Lamp', 'Moon Pearl', 'Cane of Byrna']], #["Spike Cave", True, ['Bottle', 'Hammer', 'Progressive Glove', 'Lamp', 'Moon Pearl', 'Cane of Byrna']],
["Spike Cave", True, ['Bottle', 'Hammer', 'Progressive Glove', 'Flute', 'Moon Pearl', 'Cane of Byrna']], ["Spike Cave", True, ['Bottle', 'Hammer', 'Progressive Glove', 'Flute', 'Moon Pearl', 'Cane of Byrna']],
["Spike Cave", True, ['Magic Upgrade (1/2)', 'Hammer', 'Progressive Glove', 'Lamp', 'Cape']], ["Spike Cave", True, ['Magic Upgrade (1/2)', 'Hammer', 'Progressive Glove', 'Lamp', 'Cape']],
["Spike Cave", True, ['Magic Upgrade (1/2)', 'Hammer', 'Progressive Glove', 'Flute', 'Moon Pearl', 'Cape']], ["Spike Cave", True, ['Magic Upgrade (1/2)', 'Hammer', 'Progressive Glove', 'Flute', 'Moon Pearl', 'Cape']],

View 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, [], ["Flute", "Lamp"]],
["Tower of Hera", False, [], ["Flute", "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", "Flute"]],
["Tower of Hera", True, ["Moon Pearl", "Hammer", "Beat Agahnim 1", "Flute", "Hookshot"]],
["Inverted Agahnims Tower", False, []],
["Inverted Agahnims Tower", False, [], ["Flute", "Lamp"]],
["Inverted Agahnims Tower", False, [], ["Flute", "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, ["Flute", "Beat Agahnim 1", "Moon Pearl"]],
["Inverted Agahnims Tower", True, ["Flute", "Progressive Glove", "Progressive Glove", "Moon Pearl"]],
["Inverted Agahnims Tower", True, ["Flute", "Progressive Glove", "Hammer", "Moon Pearl"]],
["Palace of Darkness", False, []],
["Palace of Darkness", False, [], ["Hammer", "Flippers", "Magic Mirror", "Flute"]],
["Palace of Darkness", True, ["Hammer"]],
["Palace of Darkness", True, ["Flippers"]],
["Palace of Darkness", True, ["Progressive Glove", "Progressive Glove", "Moon Pearl", "Flute"]],
["Palace of Darkness", True, ["Progressive Glove", "Progressive Glove", "Moon Pearl", "Magic Mirror"]],
["Palace of Darkness", True, ["Beat Agahnim 1", "Moon Pearl", "Flute"]],
["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, [], ["Flute", "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", "Flute"]],
["Misery Mire", True, ["Progressive Sword", "Ether", "Moon Pearl", "Hammer", "Progressive Glove", "Magic Mirror"]],
["Misery Mire", True, ["Progressive Sword", "Ether", "Moon Pearl", "Hammer", "Progressive Glove", "Flute"]],
["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", "Flute"]],
["Turtle Rock", False, []],
["Turtle Rock", False, [], ["Quake"]],
["Turtle Rock", False, [], ["Progressive Sword"]],
["Turtle Rock", False, [], ["Lamp", "Flute"]],
["Turtle Rock", False, [], ["Progressive Glove", "Flute"]],
["Turtle Rock", True, ["Quake", "Progressive Sword", "Progressive Glove", "Lamp"]],
["Turtle Rock", True, ["Quake", "Progressive Sword", "Progressive Glove", "Progressive Glove", "Moon Pearl", "Flute"]],
["Turtle Rock", True, ["Quake", "Progressive Sword", "Progressive Glove", "Hammer", "Moon Pearl", "Flute"]],
["Turtle Rock", True, ["Quake", "Progressive Sword", "Beat Agahnim 1", "Moon Pearl", "Flute"]],
["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"]],
])

View File

@ -6,14 +6,12 @@ class TestInvertedLightWorld(TestInverted):
super().setUp() super().setUp()
def testLostWoods(self): def testLostWoods(self):
self.run_tests([ self.run_location_tests([
["Master Sword Pedestal", False, []], ["Master Sword Pedestal", False, []],
["Master Sword Pedestal", False, [], ['Green Pendant']], ["Master Sword Pedestal", False, [], ['Green Pendant']],
["Master Sword Pedestal", False, [], ['Red Pendant']], ["Master Sword Pedestal", False, [], ['Red Pendant']],
["Master Sword Pedestal", False, [], ['Blue Pendant']], ["Master Sword Pedestal", False, [], ['Blue Pendant']],
# @todo: Can get this without moon pearl ["Master Sword Pedestal", True, ['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1']],
# ["Master Sword Pedestal", True, ['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1']],
["Master Sword Pedestal", True, ['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1', 'Moon Pearl']],
["Master Sword Pedestal", True, ['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Moon Pearl', 'Progressive Glove', 'Hammer']], ["Master Sword Pedestal", True, ['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Moon Pearl', 'Progressive Glove', 'Hammer']],
["Master Sword Pedestal", True, ['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Moon Pearl', 'Progressive Glove', 'Progressive Glove']], ["Master Sword Pedestal", True, ['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Moon Pearl', 'Progressive Glove', 'Progressive Glove']],
@ -37,7 +35,7 @@ class TestInvertedLightWorld(TestInverted):
]) ])
def testKakariko(self): def testKakariko(self):
self.run_tests([ self.run_location_tests([
["Kakariko Tavern", False, []], ["Kakariko Tavern", False, []],
["Kakariko Tavern", False, [], ['Moon Pearl']], ["Kakariko Tavern", False, [], ['Moon Pearl']],
["Kakariko Tavern", True, ['Moon Pearl', 'Beat Agahnim 1']], ["Kakariko Tavern", True, ['Moon Pearl', 'Beat Agahnim 1']],
@ -111,9 +109,7 @@ class TestInvertedLightWorld(TestInverted):
["Blind's Hideout - Far Right", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], ["Blind's Hideout - Far Right", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']],
["Bottle Merchant", False, []], ["Bottle Merchant", False, []],
#@todo: Can get this without moon pearl ["Bottle Merchant", True, ['Beat Agahnim 1']],
#["Bottle Merchant", True, ['Beat Agahnim 1']],
["Bottle Merchant", True, ['Beat Agahnim 1', 'Moon Pearl']],
["Bottle Merchant", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']], ["Bottle Merchant", True, ['Moon Pearl', 'Progressive Glove', 'Hammer']],
["Bottle Merchant", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']], ["Bottle Merchant", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove']],
@ -171,7 +167,7 @@ class TestInvertedLightWorld(TestInverted):
]) ])
def testSouthLightWorld(self): def testSouthLightWorld(self):
self.run_tests([ self.run_location_tests([
["Desert Ledge", False, []], ["Desert Ledge", False, []],
["Desert Ledge", False, [], ['Book of Mudora']], ["Desert Ledge", False, [], ['Book of Mudora']],
["Desert Ledge", False, [], ['Moon Pearl']], ["Desert Ledge", False, [], ['Moon Pearl']],
@ -251,7 +247,7 @@ class TestInvertedLightWorld(TestInverted):
]) ])
def testZoraArea(self): def testZoraArea(self):
self.run_tests([ self.run_location_tests([
["King Zora", False, []], ["King Zora", False, []],
["King Zora", False, [], ['Progressive Glove', 'Flippers']], ["King Zora", False, [], ['Progressive Glove', 'Flippers']],
["King Zora", False, [], ['Moon Pearl']], ["King Zora", False, [], ['Moon Pearl']],
@ -284,7 +280,7 @@ class TestInvertedLightWorld(TestInverted):
]) ])
def testLightWorld(self): def testLightWorld(self):
self.run_tests([ self.run_location_tests([
["Link's Uncle", False, []], ["Link's Uncle", False, []],
["Link's Uncle", False, [], ['Moon Pearl']], ["Link's Uncle", False, [], ['Moon Pearl']],
["Link's Uncle", True, ['Moon Pearl', 'Beat Agahnim 1']], ["Link's Uncle", True, ['Moon Pearl', 'Beat Agahnim 1']],

View File

@ -4,7 +4,7 @@ from test.inverted.TestInverted import TestInverted
class TestInvertedTurtleRock(TestInverted): class TestInvertedTurtleRock(TestInverted):
def testTurtleRock(self): def testTurtleRock(self):
self.run_tests([ self.run_location_tests([
["Turtle Rock - Compass Chest", False, []], ["Turtle Rock - Compass Chest", False, []],
["Turtle Rock - Compass Chest", False, [], ['Cane of Somaria']], ["Turtle Rock - Compass Chest", False, [], ['Cane of Somaria']],
["Turtle Rock - Compass Chest", False, [], ['Quake', 'Magic Mirror']], ["Turtle Rock - Compass Chest", False, [], ['Quake', 'Magic Mirror']],

View File

@ -0,0 +1,79 @@
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, []],
#todo: Waterwalk
#["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']],
])

View File

@ -0,0 +1,116 @@
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", 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']],
#todo: Floating island clip
#["Hookshot Cave - Bottom Right", True, ['Pegasus Boots']],
["Hookshot Cave - Bottom Right", True, ['Pegasus Boots', 'Progressive Glove']],
["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 - Bottom Left", True, ['Pegasus Boots', 'Hookshot', 'Progressive Glove']],
["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 Left", True, ['Pegasus Boots', 'Hookshot', 'Progressive Glove']],
["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']],
["Hookshot Cave - Top Right", True, ['Pegasus Boots', 'Hookshot', 'Progressive Glove']],
])

View File

@ -0,0 +1,114 @@
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, Waterwalk
#["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', 'Magic Mirror', 'Fire Rod']],
["Ice Palace - Compass Chest", True, ['Pegasus Boots', 'Magic Mirror', 'Bombos', 'Progressive Sword']],
["Misery Mire - Bridge Chest", False, []],
["Misery Mire - Bridge Chest", False, [], ['Ether']],
["Misery Mire - Bridge Chest", False, [], ['Progressive Sword']],
["Misery Mire - Bridge Chest", True, ['Pegasus Boots', 'Ether', 'Progressive Sword']],
["Turtle Rock - Compass Chest", False, []],
["Turtle Rock - Compass Chest", False, [], ['Cane of Somaria']],
["Turtle Rock - Compass Chest", True, ['Pegasus Boots', 'Magic Mirror', 'Moon Pearl', 'Cane of Somaria', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)', 'Small Key (Turtle Rock)']],
["Turtle Rock - Compass Chest", True, ['Pegasus Boots', 'Quake', 'Progressive Sword', 'Cane of Somaria']],
["Turtle Rock - Chain Chomps", False, []],
["Turtle Rock - Chain Chomps", True, ['Pegasus Boots', 'Magic Mirror', 'Moon Pearl']],
["Turtle Rock - Crystaroller Room", False, []],
["Turtle Rock - Crystaroller Room", True, ['Pegasus Boots', 'Magic Mirror', 'Moon Pearl', 'Big Key (Turtle Rock)']],
["Turtle Rock - Crystaroller Room", True, ['Pegasus Boots', 'Magic Mirror', 'Moon Pearl', 'Lamp', 'Cane of Somaria']],
["Ganons Tower - Hope Room - Left", False, []],
["Ganons Tower - Hope Room - Left", False, [], ['Crystal 1']],
["Ganons Tower - Hope Room - Left", False, [], ['Crystal 2']],
["Ganons Tower - Hope Room - Left", False, [], ['Crystal 3']],
["Ganons Tower - Hope Room - Left", False, [], ['Crystal 4']],
["Ganons Tower - Hope Room - Left", False, [], ['Crystal 5']],
["Ganons Tower - Hope Room - Left", False, [], ['Crystal 6']],
["Ganons Tower - Hope Room - Left", False, [], ['Crystal 7']],
["Ganons Tower - Hope Room - Left", True, ['Beat Agahnim 1', 'Hookshot', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7']],
["Ganons Tower - Hope Room - Left", True, ['Pegasus Boots', 'Magic Mirror', 'Hookshot', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7']],
["Ganons Tower - Hope Room - Left", True, ['Pegasus Boots', 'Moon Pearl', 'Hookshot', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7']],
])

View File

@ -0,0 +1,30 @@
from BaseClasses import World
from Dungeons import create_dungeons, get_dungeon_item_pool
from EntranceShuffle import link_inverted_entrances
from InvertedRegions import create_inverted_regions
from ItemList import generate_itempool, difficulties
from Items import ItemFactory
from Regions import mark_light_world_regions, create_shops
from Rules import set_rules
from test.TestBase import TestBase
class TestInvertedOWG(TestBase):
def setUp(self):
self.world = World(1, {1:'vanilla'}, {1:'owglitches'}, {1:'inverted'}, {1:'random'}, {1:'normal'}, {1:'normal'}, {1:False}, {1:'on'}, {1:'ganon'}, 'balanced', {1:'items'},
True, {1:False}, False, None, {1:False})
self.world.difficulty_requirements[1] = difficulties['normal']
create_inverted_regions(self.world, 1)
create_dungeons(self.world, 1)
create_shops(self.world, 1)
link_inverted_entrances(self.world, 1)
generate_itempool(self.world, 1)
self.world.required_medallions[1] = ['Ether', 'Quake']
self.world.itempool.extend(get_dungeon_item_pool(self.world))
self.world.itempool.extend(ItemFactory(['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1', 'Beat Agahnim 2', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7'], 1))
self.world.get_location('Agahnim 1', 1).item = None
self.world.get_location('Agahnim 2', 1).item = None
self.world.precollected_items.clear()
self.world.itempool.append(ItemFactory('Pegasus Boots', 1))
mark_light_world_regions(self.world, 1)
set_rules(self.world, 1)

View File

@ -0,0 +1,292 @@
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', 'Magic Mirror']],
["Link's Uncle", True, ['Moon Pearl', 'Pegasus Boots']],
["Secret Passage", False, []],
["Secret Passage", False, [], ['Moon Pearl', 'Magic Mirror']],
["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", 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", True, ['Moon Pearl', 'Pegasus Boots']],
#todo: superbunny into sahasrahla in logic?
#["Sahasrahla's Hut - Left", True, ['Magic Mirror', 'Pegasus Boots']],
#["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", 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", 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, ['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, ['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, ['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, ['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", 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", 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", 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", 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 - 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']],
["Ice Rod Cave", False, []],
#["Ice Rod Cave", False, [], ['Moon Pearl', 'BigRedBomb']],
["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']],
["Sahasrahla", False, []],
["Sahasrahla", False, [], ['Green Pendant']],
["Sahasrahla", True, ['Green Pendant', 'Magic Mirror', 'Pegasus Boots']],
["Sahasrahla", True, ['Green Pendant', 'Moon Pearl', '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', 'Magic Mirror', 'Pegasus Boots']],
["Sick Kid", True, ['Bottle', 'Moon Pearl', 'Pegasus Boots']],
["Sick Kid", True, ['Bottle (Good Bee)', 'Magic Mirror', 'Pegasus Boots']],
["Sick Kid", True, ['Bottle (Good Bee)', 'Moon Pearl', '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']],
["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", 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']],
["Mini Moldorm Cave - Generous Guy", False, []],
["Mini Moldorm Cave - Generous Guy", False, [], ['Moon Pearl']],
["Mini Moldorm Cave - Generous Guy", True, ['Moon Pearl', 'Pegasus Boots']],
["Library", False, []],
["Library", False, [], ['Pegasus Boots']],
["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', '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", 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', 'Flippers']],
#todo: Waterwalking into caves not in logic
# ["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', 'Flippers']],
# ["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, []],
])

View File

204
test/owg/TestDarkWorld.py Normal file
View File

@ -0,0 +1,204 @@
from test.owg.TestVanillaOWG import TestVanillaOWG
class TestLightWorld(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', 'Flute', 'Lamp']],
["Pyramid", True, ['Moon Pearl', 'Pegasus Boots']],
["Pyramid", True, ['Magic Mirror', 'Pegasus Boots']],
["Pyramid", True, ['Magic Mirror', 'Flute']],
["Pyramid", True, ['Magic Mirror', 'Progressive Glove', 'Lamp']],
["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', 'Flute', 'Lamp']],
["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, ['Flute', 'Magic Mirror']],
["Pyramid Fairy - Left", True, ['Progressive Glove', 'Lamp', 'Magic Mirror']],
["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, [], ['Pegasus Boots', 'Moon Pearl', 'Flute', 'Lamp']],
["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, ['Flute', 'Magic Mirror']],
["Pyramid Fairy - Right", True, ['Progressive Glove', 'Lamp', 'Magic Mirror']],
["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 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', 'Flute', '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', 'Flute']],
["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', 'Flute']],
["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, [], ['Flute', 'Pegasus Boots']],
["Mire Shed - Left", True, ['Moon Pearl', 'Flute', 'Progressive Glove', 'Progressive Glove']],
["Mire Shed - Left", True, ['Moon Pearl', 'Pegasus Boots']],
["Mire Shed - Left", True, ['Magic Mirror', 'Flute', '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, [], ['Flute', 'Pegasus Boots']],
["Mire Shed - Right", True, ['Moon Pearl', 'Pegasus Boots']],
["Mire Shed - Right", True, ['Magic Mirror', 'Flute', 'Progressive Glove', 'Progressive Glove']],
["Mire Shed - Right", True, ['Moon Pearl', 'Flute', 'Progressive Glove', 'Progressive Glove']],
])

View File

@ -0,0 +1,205 @@
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', 'Flute']],
["Ether Tablet", False, [], ['Pegasus Boots', 'Lamp', 'Flute']],
["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, ['Flute', '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, ['Flute', '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', 'Flute']],
["Old Man", True, ['Pegasus Boots', 'Lamp']],
["Old Man", True, ['Flute', 'Lamp']],
["Old Man", True, ['Progressive Glove', 'Lamp']],
["Spectacle Rock Cave", False, []],
["Spectacle Rock Cave", False, [], ['Pegasus Boots', 'Progressive Glove', 'Flute']],
["Spectacle Rock Cave", False, [], ['Pegasus Boots', 'Lamp', 'Flute']],
["Spectacle Rock Cave", True, ['Pegasus Boots']],
["Spectacle Rock Cave", True, ['Flute']],
["Spectacle Rock Cave", True, ['Progressive Glove', 'Lamp']],
["Spectacle Rock", False, []],
["Spectacle Rock", False, [], ['Pegasus Boots', 'Progressive Glove', 'Flute']],
["Spectacle Rock", False, [], ['Pegasus Boots', 'Lamp', 'Flute']],
["Spectacle Rock", False, [], ['Pegasus Boots', 'Magic Mirror']],
["Spectacle Rock", True, ['Pegasus Boots']],
["Spectacle Rock", True, ['Flute', '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', 'Flute', 'Lamp']],
["Mimic Cave", False, [], ['Pegasus Boots', 'Flute', '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', 'Flute']],
["Spiral Cave", False, []],
["Spiral Cave", False, [], ['Pegasus Boots', 'Progressive Glove', 'Flute']],
["Spiral Cave", False, [], ['Pegasus Boots', 'Magic Mirror', 'Hookshot']],
["Spiral Cave", True, ['Pegasus Boots']],
["Spiral Cave", True, ['Flute', 'Hookshot']],
["Spiral Cave", True, ['Progressive Glove', 'Lamp', 'Hookshot']],
["Spiral Cave", True, ['Progressive Glove', 'Lamp', 'Magic Mirror']],
["Spiral Cave", True, ['Flute', 'Magic Mirror']],
["Paradox Cave Lower - Far Left", False, []],
["Paradox Cave Lower - Far Left", False, [], ['Pegasus Boots', 'Progressive Glove', 'Flute']],
["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, ['Flute', '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, ['Flute', 'Magic Mirror']],
["Paradox Cave Lower - Left", False, []],
["Paradox Cave Lower - Left", False, [], ['Pegasus Boots', 'Progressive Glove', 'Flute']],
["Paradox Cave Lower - Left", False, [], ['Pegasus Boots', 'Magic Mirror', 'Hookshot']],
["Paradox Cave Lower - Left", True, ['Pegasus Boots']],
["Paradox Cave Lower - Left", True, ['Flute', '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, ['Flute', 'Magic Mirror']],
["Paradox Cave Lower - Middle", False, []],
["Paradox Cave Lower - Middle", False, [], ['Pegasus Boots', 'Progressive Glove', 'Flute']],
["Paradox Cave Lower - Middle", False, [], ['Pegasus Boots', 'Magic Mirror', 'Hookshot']],
["Paradox Cave Lower - Middle", True, ['Pegasus Boots']],
["Paradox Cave Lower - Middle", True, ['Flute', '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, ['Flute', 'Magic Mirror']],
["Paradox Cave Lower - Right", False, []],
["Paradox Cave Lower - Right", False, [], ['Pegasus Boots', 'Progressive Glove', 'Flute']],
["Paradox Cave Lower - Right", False, [], ['Pegasus Boots', 'Magic Mirror', 'Hookshot']],
["Paradox Cave Lower - Right", True, ['Pegasus Boots']],
["Paradox Cave Lower - Right", True, ['Flute', '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, ['Flute', 'Magic Mirror']],
["Paradox Cave Lower - Far Right", False, []],
["Paradox Cave Lower - Far Right", False, [], ['Pegasus Boots', 'Progressive Glove', 'Flute']],
["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, ['Flute', '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, ['Flute', 'Magic Mirror']],
["Paradox Cave Upper - Left", False, []],
["Paradox Cave Upper - Left", False, [], ['Pegasus Boots', 'Progressive Glove', 'Flute']],
["Paradox Cave Upper - Left", False, [], ['Pegasus Boots', 'Magic Mirror', 'Hookshot']],
["Paradox Cave Upper - Left", True, ['Pegasus Boots']],
["Paradox Cave Upper - Left", True, ['Flute', '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, ['Flute', 'Magic Mirror']],
["Paradox Cave Upper - Right", False, []],
["Paradox Cave Upper - Right", False, [], ['Pegasus Boots', 'Progressive Glove', 'Flute']],
["Paradox Cave Upper - Right", False, [], ['Pegasus Boots', 'Magic Mirror', 'Hookshot']],
["Paradox Cave Upper - Right", True, ['Pegasus Boots']],
["Paradox Cave Upper - Right", True, ['Flute', '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, ['Flute', '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', 'Flute', 'Cape']],
["Spike Cave", True, ['Bottle', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Lamp', 'Cane of Byrna']],
["Spike Cave", True, ['Bottle', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Flute', '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', 'Flute', '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', 'Flute', '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', 'Flute', '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', 'Flute', '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', 'Flute']],
["Superbunny Cave - Top", True, ['Progressive Glove', 'Progressive Glove', 'Magic Mirror', 'Hammer', 'Flute']],
["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', 'Flute']],
["Superbunny Cave - Bottom", True, ['Progressive Glove', 'Progressive Glove', 'Magic Mirror', 'Hammer', 'Flute']],
["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']],
#todo: DW Floating island clip not in logic
#["Hookshot Cave - Bottom Right", True, ['Moon Pearl', 'Pegasus Boots']],
["Hookshot Cave - Bottom Right", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Hookshot', 'Flute']],
["Hookshot Cave - Bottom Right", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Magic Mirror', 'Hammer', 'Flute', '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']],
#todo: DW Floating island clip not in logic
#["Hookshot Cave - Bottom Left", True, ['Moon Pearl', 'Pegasus Boots', 'Hookshot']],
["Hookshot Cave - Bottom Left", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Hookshot', 'Flute']],
["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']],
#todo: DW Floating island clip not in logic
#["Hookshot Cave - Top Left", True, ['Moon Pearl', 'Pegasus Boots', 'Hookshot']],
["Hookshot Cave - Top Left", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Hookshot', 'Flute']],
["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']],
#todo: DW Floating island clip not in logic
#["Hookshot Cave - Top Right", True, ['Moon Pearl', 'Pegasus Boots', 'Hookshot']],
["Hookshot Cave - Top Right", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Hookshot', 'Flute']],
["Hookshot Cave - Top Right", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Hookshot', 'Lamp']],
])

131
test/owg/TestDungeons.py Normal file
View File

@ -0,0 +1,131 @@
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, ['Flute', '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', "Flute", "Progressive Glove"]],
["Tower of Hera - Basement Cage", False, [], ['Pegasus Boots', "Flute", "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, ["Flute", "Magic Mirror"]],
["Tower of Hera - Basement Cage", True, ["Progressive Glove", "Lamp", "Magic Mirror"]],
["Tower of Hera - Basement Cage", True, ["Flute", "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', 'Flute']],
["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']],
#todo: Missing clip?
#["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, ['Pegasus Boots', 'Magic Mirror', 'Hammer', 'Big Key (Turtle Rock)']],
["Ganons Tower - Hope Room - Left", False, []],
["Ganons Tower - Hope Room - Left", False, ['Moon Pearl', 'Crystal 1']],
["Ganons Tower - Hope Room - Left", False, ['Pegasus Boots', 'Crystal 1']],
["Ganons Tower - Hope Room - Left", True, ['Moon Pearl', 'Pegasus Boots']],
["Ganons Tower - Hope Room - Left", True, ['Pegasus Boots', 'Hammer', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7']],
])

196
test/owg/TestLightWorld.py Normal file
View File

@ -0,0 +1,196 @@
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', 'Flute', 'Lamp']],
["Cave 45", False, [], ['Pegasus Boots', 'Moon Pearl', 'Flute', 'Progressive Glove']],
["Cave 45", True, ['Pegasus Boots']],
["Cave 45", True, ['Flute', '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', 'Flute']],
["Checkerboard Cave", False, [], ['Pegasus Boots', 'Magic Mirror']],
["Checkerboard Cave", True, ['Pegasus Boots', 'Progressive Glove']],
["Checkerboard Cave", True, ['Flute', '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', 'Flute']],
["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, ['Flute', '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']],
#todo: not in logic yet - need to determine which caves are ok to waterwalk into
#["Waterfall Fairy - Left", True, ['Moon Pearl']],
#["Waterfall Fairy - Left", True, ['Pegasus Boots']],
["Waterfall Fairy - Right", False, []],
["Waterfall Fairy - Right", True, ['Flippers']],
#todo: not in logic yet - need to determine which caves are ok to waterwalk into
#["Waterfall Fairy - Right", True, ['Moon Pearl']],
#["Waterfall Fairy - Right", True, ['Pegasus Boots']]
])

View File

@ -0,0 +1,30 @@
from BaseClasses import World
from Dungeons import create_dungeons, get_dungeon_item_pool
from EntranceShuffle import link_entrances
from InvertedRegions import mark_dark_world_regions
from ItemList import difficulties, generate_itempool
from Items import ItemFactory
from Regions import create_regions, create_shops
from Rules import set_rules
from test.TestBase import TestBase
class TestVanillaOWG(TestBase):
def setUp(self):
self.world = World(1, {1:'vanilla'}, {1:'owglitches'}, {1:'open'}, {1:'random'}, {1:'normal'}, {1:'normal'}, {1:False}, {1:'on'}, {1:'ganon'}, 'balanced', {1:'items'},
True, {1:False}, False, None, {1:False})
self.world.difficulty_requirements[1] = difficulties['normal']
create_regions(self.world, 1)
create_dungeons(self.world, 1)
create_shops(self.world, 1)
link_entrances(self.world, 1)
generate_itempool(self.world, 1)
self.world.required_medallions[1] = ['Ether', 'Quake']
self.world.itempool.extend(get_dungeon_item_pool(self.world))
self.world.itempool.extend(ItemFactory(['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1', 'Beat Agahnim 2', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7'], 1))
self.world.get_location('Agahnim 1', 1).item = None
self.world.get_location('Agahnim 2', 1).item = None
self.world.precollected_items.clear()
self.world.itempool.append(ItemFactory('Pegasus Boots', 1))
mark_dark_world_regions(self.world, 1)
set_rules(self.world, 1)

0
test/owg/__init__.py Normal file
View File

View 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, [], ['Flute']],
["Mire Shed - Left", True, ['Moon Pearl', 'Flute', 'Progressive Glove', 'Progressive Glove']],
["Mire Shed - Right", False, []],
["Mire Shed - Right", False, [], ['Progressive Glove']],
["Mire Shed - Right", False, [], ['Moon Pearl']],
["Mire Shed - Right", False, [], ['Flute']],
["Mire Shed - Right", True, ['Moon Pearl', 'Flute', 'Progressive Glove', 'Progressive Glove']],
])

View 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', 'Flute']],
["Ether Tablet", False, [], ['Lamp', 'Flute']],
["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, ['Flute', '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, ['Flute', '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', 'Flute']],
["Old Man", False, [], ['Lamp']],
["Old Man", True, ['Flute', 'Lamp']],
["Old Man", True, ['Progressive Glove', 'Lamp']],
["Spectacle Rock Cave", False, []],
["Spectacle Rock Cave", False, [], ['Progressive Glove', 'Flute']],
["Spectacle Rock Cave", False, [], ['Lamp', 'Flute']],
["Spectacle Rock Cave", True, ['Flute']],
["Spectacle Rock Cave", True, ['Progressive Glove', 'Lamp']],
["Spectacle Rock", False, []],
["Spectacle Rock", False, [], ['Progressive Glove', 'Flute']],
["Spectacle Rock", False, [], ['Lamp', 'Flute']],
["Spectacle Rock", False, [], ['Magic Mirror']],
["Spectacle Rock", True, ['Flute', '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', 'Flute', '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', 'Flute']],
["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, ['Flute', 'Magic Mirror']],
["Spiral Cave", False, ['Flute', 'Hammer']],
["Spiral Cave", True, ['Flute', 'Hookshot']],
["Spiral Cave", True, ['Progressive Glove', 'Lamp', 'Hookshot']],
["Spiral Cave", True, ['Progressive Glove', 'Lamp', 'Magic Mirror', 'Hammer']],
["Spiral Cave", True, ['Flute', 'Magic Mirror', 'Hammer']],
["Paradox Cave Lower - Far Left", False, []],
["Paradox Cave Lower - Far Left", False, [], ['Progressive Glove', 'Flute']],
["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, ['Flute', 'Magic Mirror']],
["Paradox Cave Lower - Far Left", False, ['Flute', 'Hammer']],
["Paradox Cave Lower - Far Left", True, ['Flute', '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, ['Flute', 'Magic Mirror', 'Hammer']],
["Paradox Cave Lower - Left", False, []],
["Paradox Cave Lower - Left", False, [], ['Progressive Glove', 'Flute']],
["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, ['Flute', 'Magic Mirror']],
["Paradox Cave Lower - Left", False, ['Flute', 'Hammer']],
["Paradox Cave Lower - Left", True, ['Flute', '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, ['Flute', 'Magic Mirror', 'Hammer']],
["Paradox Cave Lower - Middle", False, []],
["Paradox Cave Lower - Middle", False, [], ['Progressive Glove', 'Flute']],
["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, ['Flute', 'Magic Mirror']],
["Paradox Cave Lower - Middle", False, ['Flute', 'Hammer']],
["Paradox Cave Lower - Middle", True, ['Flute', '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, ['Flute', 'Magic Mirror', 'Hammer']],
["Paradox Cave Lower - Right", False, []],
["Paradox Cave Lower - Right", False, [], ['Progressive Glove', 'Flute']],
["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, ['Flute', 'Magic Mirror']],
["Paradox Cave Lower - Right", False, ['Flute', 'Hammer']],
["Paradox Cave Lower - Right", True, ['Flute', '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, ['Flute', 'Magic Mirror', 'Hammer']],
["Paradox Cave Lower - Far Right", False, []],
["Paradox Cave Lower - Far Right", False, [], ['Progressive Glove', 'Flute']],
["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, ['Flute', 'Magic Mirror']],
["Paradox Cave Lower - Far Right", False, ['Flute', 'Hammer']],
["Paradox Cave Lower - Far Right", True, ['Flute', '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, ['Flute', 'Magic Mirror', 'Hammer']],
["Paradox Cave Upper - Left", False, []],
["Paradox Cave Upper - Left", False, [], ['Progressive Glove', 'Flute']],
["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, ['Flute', 'Magic Mirror']],
["Paradox Cave Upper - Left", False, ['Flute', 'Hammer']],
["Paradox Cave Upper - Left", True, ['Flute', '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, ['Flute', 'Magic Mirror', 'Hammer']],
["Paradox Cave Upper - Right", False, []],
["Paradox Cave Upper - Right", False, [], ['Progressive Glove', 'Flute']],
["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, ['Flute', 'Magic Mirror']],
["Paradox Cave Upper - Right", False, ['Flute', 'Hammer']],
["Paradox Cave Upper - Right", True, ['Flute', '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, ['Flute', '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', 'Flute', 'Cape']],
["Spike Cave", True, ['Bottle', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Lamp', 'Cane of Byrna']],
["Spike Cave", True, ['Bottle', 'Moon Pearl', 'Hammer', 'Progressive Glove', 'Flute', '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', 'Flute', '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', 'Flute', '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', 'Flute', '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', 'Flute', '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', 'Flute']],
["Superbunny Cave - Top", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Magic Mirror', 'Hammer', 'Flute']],
["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', 'Flute']],
["Superbunny Cave - Bottom", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Magic Mirror', 'Hammer', 'Flute']],
["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', 'Flute']],
["Hookshot Cave - Bottom Right", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Magic Mirror', 'Hammer', 'Flute', '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', 'Flute']],
["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', 'Flute']],
["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', 'Flute']],
["Hookshot Cave - Top Right", True, ['Moon Pearl', 'Progressive Glove', 'Progressive Glove', 'Hookshot', 'Lamp']],
])

View 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", "Flute"]],
["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, ["Flute", "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", "Flute"]],
["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, ["Flute", "Progressive Glove", "Progressive Glove", "Magic Mirror"]],
["Tower of Hera", False, []],
["Tower of Hera", False, [], ["Flute", "Progressive Glove"]],
["Tower of Hera", False, [], ["Flute", "Lamp"]],
["Tower of Hera", False, [], ["Magic Mirror", "Hammer"]],
["Tower of Hera", False, [], ["Magic Mirror", "Hookshot"]],
["Tower of Hera", True, ["Flute", "Magic Mirror"]],
["Tower of Hera", True, ["Progressive Glove", "Lamp", "Magic Mirror"]],
["Tower of Hera", True, ["Flute", "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, [], ["Flute"]],
["Misery Mire", False, [], ["Ether"]],
["Misery Mire", False, [], ["Progressive Sword"]],
["Misery Mire", False, ["Progressive Glove"], ["Progressive Glove"]],
["Misery Mire", True, ["Progressive Glove", "Progressive Glove", "Flute", "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", "Flute"]],
["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", "Flute", "Hookshot"]],
["Turtle Rock", True, ["Progressive Glove", "Progressive Glove", "Moon Pearl", "Hammer", "Quake", "Progressive Sword", "Flute", "Magic Mirror"]],
["Ganons Tower", False, []],
["Ganons Tower", False, ["Progressive Glove"], ["Progressive Glove"]],
["Ganons Tower", False, [], ["Lamp", "Flute"]],
["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, ["Flute", "Magic Mirror", "Hammer", "Progressive Glove", "Progressive Glove", "Crystal 1", "Crystal 2", "Crystal 3", "Crystal 4", "Crystal 5", "Crystal 6", "Crystal 7"]],
["Ganons Tower", True, ["Flute", "Hookshot", "Progressive Glove", "Progressive Glove", "Crystal 1", "Crystal 2", "Crystal 3", "Crystal 4", "Crystal 5", "Crystal 6", "Crystal 7"]],
])

View 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, [], ['Flute']],
["Checkerboard Cave", False, [], ['Magic Mirror']],
["Checkerboard Cave", True, ['Flute', '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', 'Flute']],
["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, ['Flute', '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']],
])

View File

@ -0,0 +1,28 @@
from BaseClasses import World
from Dungeons import create_dungeons, get_dungeon_item_pool
from EntranceShuffle import link_entrances
from InvertedRegions import mark_dark_world_regions
from ItemList import difficulties, generate_itempool
from Items import ItemFactory
from Regions import create_regions, create_shops
from Rules import set_rules
from test.TestBase import TestBase
class TestVanilla(TestBase):
def setUp(self):
self.world = World(1, {1:'vanilla'}, {1:'noglitches'}, {1:'open'}, {1:'random'}, {1:'normal'}, {1:'normal'}, {1:False}, {1:'on'}, {1:'ganon'}, 'balanced', {1:'items'},
True, {1:False}, False, None, {1:False})
self.world.difficulty_requirements[1] = difficulties['normal']
create_regions(self.world, 1)
create_dungeons(self.world, 1)
create_shops(self.world, 1)
link_entrances(self.world, 1)
generate_itempool(self.world, 1)
self.world.required_medallions[1] = ['Ether', 'Quake']
self.world.itempool.extend(get_dungeon_item_pool(self.world))
self.world.itempool.extend(ItemFactory(['Green Pendant', 'Red Pendant', 'Blue Pendant', 'Beat Agahnim 1', 'Beat Agahnim 2', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 5', 'Crystal 6', 'Crystal 7'], 1))
self.world.get_location('Agahnim 1', 1).item = None
self.world.get_location('Agahnim 2', 1).item = None
mark_dark_world_regions(self.world, 1)
set_rules(self.world, 1)

0
test/vanilla/__init__.py Normal file
View File