2017-05-20 12:06:53 +00:00
import random
2017-05-16 19:23:47 +00:00
def link_entrances ( world ) :
2017-05-20 12:06:53 +00:00
ret = [ ]
2017-05-15 18:28:04 +00:00
# setup mandatory connections
for exitname , regionname in mandatory_connections :
2017-05-20 12:06:53 +00:00
connect_simple ( world , exitname , regionname )
2017-05-15 18:28:04 +00:00
# if we do not shuffle, set default connections
2017-05-20 12:06:53 +00:00
if world . shuffle == ' default ' :
for exitname , regionname in default_connections :
connect_simple ( world , exitname , regionname )
for exitname , regionname in default_dungeon_connections :
connect_simple ( world , exitname , regionname )
elif world . shuffle == ' dungeonssimple ' :
ret . append ( ' Mixed Entrances: \n \n ' )
2017-05-15 18:28:04 +00:00
for exitname , regionname in default_connections :
2017-05-20 12:06:53 +00:00
connect_simple ( world , exitname , regionname )
ret . append ( simple_shuffle_dungeons ( world ) )
elif world . shuffle == ' dungeonsfull ' :
ret . append ( ' Mixed Entrances: \n \n ' )
for exitname , regionname in default_connections :
connect_simple ( world , exitname , regionname )
ret . append ( skull_woods_shuffle ( world ) )
dungeon_exits = list ( Dungeon_Exits )
lw_entrances = list ( LW_Dungeon_Entrances )
dw_entrances = list ( DW_Dungeon_Entrances )
if world . mode == ' standard ' :
# must connect front of hyrule castle to do escape
ret . append ( connect_two_way ( world , ' Hyrule Castle Entrance (South) ' , ' Hyrule Castle Exit (South) ' ) )
else :
dungeon_exits . append ( ( ' Hyrule Castle Exit (South) ' , ' Hyrule Castle Exit (West) ' , ' Hyrule Castle Exit (East) ' ) )
lw_entrances . append ( ' Hyrule Castle Entrance (South) ' )
2017-05-20 22:39:39 +00:00
if world . mode == ' standard ' :
# rest of hyrule castle must be in light world to avoid fake darkworld stuff, so it has to be the one connected to east exit of desert
ret . append ( connect_mandatory_exits ( world , lw_entrances , [ ( ' Hyrule Castle Exit (West) ' , ' Hyrule Castle Exit (East) ' ) ] , list ( LW_Dungeon_Entrances_Must_Exit ) ) )
else :
ret . append ( connect_mandatory_exits ( world , lw_entrances , dungeon_exits , list ( LW_Dungeon_Entrances_Must_Exit ) ) )
2017-05-20 12:06:53 +00:00
ret . append ( connect_mandatory_exits ( world , dw_entrances , dungeon_exits , list ( DW_Dungeon_Entrances_Must_Exit ) ) )
2017-05-21 14:32:34 +00:00
ret . append ( connect_caves ( world , lw_entrances , [ ] , list ( LW_Dungeon_Exits ) ) ) # Agahnim must be light world
2017-05-20 12:06:53 +00:00
ret . append ( connect_caves ( world , lw_entrances , dw_entrances , dungeon_exits ) )
elif world . shuffle == ' simple ' :
ret . append ( ' Mixed Entrances: \n \n ' )
ret . append ( simple_shuffle_dungeons ( world ) )
2017-05-21 14:05:55 +00:00
old_man_entrances = list ( Old_Man_Entrances )
caves = list ( Cave_Exits )
three_exit_caves = list ( Cave_Three_Exits )
single_doors = list ( Single_Cave_Doors )
bomb_shop_doors = list ( Bomb_Shop_Single_Cave_Doors )
blacksmith_doors = list ( Blacksmith_Single_Cave_Doors )
door_targets = list ( Single_Cave_Targets )
# we shuffle all 2 entrance caves as pairs as a start
# start with the ones that need to be directed
two_door_caves = list ( Two_Door_Caves_Directional )
random . shuffle ( two_door_caves )
random . shuffle ( caves )
while two_door_caves :
entrance1 , entrance2 = two_door_caves . pop ( )
exit1 , exit2 = caves . pop ( )
ret . append ( connect_two_way ( world , entrance1 , exit1 ) )
ret . append ( connect_two_way ( world , entrance2 , exit2 ) )
# now the remaining pairs
two_door_caves = list ( Two_Door_Caves )
random . shuffle ( two_door_caves )
while two_door_caves :
entrance1 , entrance2 = two_door_caves . pop ( )
exit1 , exit2 = caves . pop ( )
ret . append ( connect_two_way ( world , entrance1 , exit1 ) )
ret . append ( connect_two_way ( world , entrance2 , exit2 ) )
# at this point only Light World death mountain entrances remain
# place old man, has limited options
remaining_entrances = [ ' Old Man Cave (West) ' , ' Old Man House (Bottom) ' , ' Death Mountain Return Cave (West) ' , ' Death Mountain Climb (Bottom) ' , ' Death Mountain Climb (Middle) ' , ' Death Mountain Climb (Top) ' ,
' Death Mountain Fairy Drop Cave (Bottom) ' , ' Death Mountain Fairy Drop Cave (Top) ' , ' Spiral Cave ' , ' Spiral Cave (Bottom) ' ]
random . shuffle ( old_man_entrances )
old_man_exit = old_man_entrances . pop ( )
remaining_entrances . extend ( old_man_entrances )
random . shuffle ( remaining_entrances )
old_man_entrance = remaining_entrances . pop ( )
ret . append ( connect_two_way ( world , old_man_entrance , ' Old Man Cave Exit (West) ' ) )
ret . append ( connect_two_way ( world , old_man_exit , ' Old Man Cave Exit (East) ' ) )
# add old man house to ensure it is alwayxs somewhere on light death mountain
caves . append ( ( ' Old Man House Exit (Bottom) ' , ' Old Man House Exit (Top) ' ) )
caves . extend ( list ( three_exit_caves ) )
# connect rest
ret . append ( connect_caves ( world , remaining_entrances , [ ] , caves ) )
# scramble holes
ret . append ( scramble_holes ( world ) )
# place blacksmith, has limited options
random . shuffle ( blacksmith_doors )
blacksmith_hut = blacksmith_doors . pop ( )
ret . append ( connect_one_way ( world , blacksmith_hut , ' Blacksmiths Hut ' ) )
bomb_shop_doors . extend ( blacksmith_doors )
# place dam and pyramid fairy, have limited options
# ToDo Dam might be behind fat fairy if we later check for this when placing crystal 5 and 6
random . shuffle ( bomb_shop_doors )
bomb_shop = bomb_shop_doors . pop ( )
ret . append ( connect_one_way ( world , bomb_shop , ' Big Bomb Shop ' ) )
dam = bomb_shop_doors . pop ( )
ret . append ( connect_one_way ( world , dam , ' Dam ' ) )
single_doors . extend ( bomb_shop_doors )
# tavern back door cannot be shuffled yet
ret . append ( connect_doors ( world , [ ' Tavern North ' ] , [ ' Tavern ' ] ) )
# place remaining doors
ret . append ( connect_doors ( world , single_doors , door_targets ) )
elif world . shuffle == ' restricted ' :
ret . append ( ' Mixed Entrances: \n \n ' )
ret . append ( simple_shuffle_dungeons ( world ) )
2017-05-20 12:06:53 +00:00
lw_entrances = list ( LW_Entrances )
dw_entrances = list ( DW_Entrances )
dw_must_exits = list ( DW_Entrances_Must_Exit )
old_man_entrances = list ( Old_Man_Entrances )
caves = list ( Cave_Exits )
three_exit_caves = list ( Cave_Three_Exits )
single_doors = list ( Single_Cave_Doors )
bomb_shop_doors = list ( Bomb_Shop_Single_Cave_Doors )
blacksmith_doors = list ( Blacksmith_Single_Cave_Doors )
door_targets = list ( Single_Cave_Targets )
# only use two exit caves to do mandatory dw connections
ret . append ( connect_mandatory_exits ( world , dw_entrances , caves , dw_must_exits ) )
# add three exit doors to pool for remainder
caves . extend ( three_exit_caves )
# place old man, has limited options
2017-05-21 14:05:55 +00:00
# exit has to come from specific set of doors, the entrance is free to move about
random . shuffle ( old_man_entrances )
old_man_exit = old_man_entrances . pop ( )
2017-05-20 12:06:53 +00:00
lw_entrances . extend ( old_man_entrances )
2017-05-21 14:05:55 +00:00
random . shuffle ( lw_entrances )
old_man_entrance = lw_entrances . pop ( )
ret . append ( connect_two_way ( world , old_man_entrance , ' Old Man Cave Exit (West) ' ) )
ret . append ( connect_two_way ( world , old_man_exit , ' Old Man Cave Exit (East) ' ) )
2017-05-20 12:06:53 +00:00
# place Old Man House in Light World, so using the s&q point does not cause fake dark world
ret . append ( connect_caves ( world , lw_entrances , [ ] , [ ( ' Old Man House Exit (Bottom) ' , ' Old Man House Exit (Top) ' ) ] ) )
# connect rest. There's 2 dw entrances remaining, so we will not run into parity issue placing caves
ret . append ( connect_caves ( world , lw_entrances , dw_entrances , caves ) )
# scramble holes
ret . append ( scramble_holes ( world ) )
# place blacksmith, has limited options
random . shuffle ( blacksmith_doors )
blacksmith_hut = blacksmith_doors . pop ( )
ret . append ( connect_one_way ( world , blacksmith_hut , ' Blacksmiths Hut ' ) )
bomb_shop_doors . extend ( blacksmith_doors )
# place dam and pyramid fairy, have limited options
# ToDo Dam might be behind fat fairy if we later check for this when placing crystal 5 and 6
random . shuffle ( bomb_shop_doors )
bomb_shop = bomb_shop_doors . pop ( )
ret . append ( connect_one_way ( world , bomb_shop , ' Big Bomb Shop ' ) )
dam = bomb_shop_doors . pop ( )
ret . append ( connect_one_way ( world , dam , ' Dam ' ) )
single_doors . extend ( bomb_shop_doors )
# tavern back door cannot be shuffled yet
ret . append ( connect_doors ( world , [ ' Tavern North ' ] , [ ' Tavern ' ] ) )
# place remaining doors
ret . append ( connect_doors ( world , single_doors , door_targets ) )
elif world . shuffle == ' full ' :
ret . append ( ' Mixed Entrances: \n \n ' )
ret . append ( skull_woods_shuffle ( world ) )
lw_entrances = list ( LW_Entrances + LW_Dungeon_Entrances )
dw_entrances = list ( DW_Entrances + DW_Dungeon_Entrances )
dw_must_exits = list ( DW_Entrances_Must_Exit + DW_Dungeon_Entrances_Must_Exit )
lw_must_exits = list ( LW_Dungeon_Entrances_Must_Exit )
old_man_entrances = list ( Old_Man_Entrances )
caves = list ( Cave_Exits + Dungeon_Exits + Cave_Three_Exits ) # don't need to consider three exit caves, have one exit caves to avoid parity issues
single_doors = list ( Single_Cave_Doors )
bomb_shop_doors = list ( Bomb_Shop_Single_Cave_Doors )
blacksmith_doors = list ( Blacksmith_Single_Cave_Doors )
door_targets = list ( Single_Cave_Targets )
if world . mode == ' standard ' :
# must connect front of hyrule castle to do escape
ret . append ( connect_two_way ( world , ' Hyrule Castle Entrance (South) ' , ' Hyrule Castle Exit (South) ' ) )
else :
caves . append ( ( ' Hyrule Castle Exit (South) ' , ' Hyrule Castle Exit (West) ' , ' Hyrule Castle Exit (East) ' ) )
lw_entrances . append ( ' Hyrule Castle Entrance (South) ' )
2017-05-15 18:28:04 +00:00
2017-05-21 14:05:55 +00:00
# we randomize which world requirements we fulfill first so we get better dungeon distribution
if random . randint ( 0 , 1 ) == 0 :
ret . append ( connect_mandatory_exits ( world , lw_entrances , caves , lw_must_exits ) )
ret . append ( connect_mandatory_exits ( world , dw_entrances , caves , dw_must_exits ) )
else :
ret . append ( connect_mandatory_exits ( world , dw_entrances , caves , dw_must_exits ) )
ret . append ( connect_mandatory_exits ( world , lw_entrances , caves , lw_must_exits ) )
2017-05-20 22:39:39 +00:00
if world . mode == ' standard ' :
# rest of hyrule castle must be in light world to avoid fake darkworld stuff
ret . append ( connect_caves ( world , lw_entrances , [ ] , [ ( ' Hyrule Castle Exit (West) ' , ' Hyrule Castle Exit (East) ' ) ] ) )
2017-05-21 14:32:34 +00:00
ret . append ( connect_caves ( world , lw_entrances , [ ] , list ( LW_Dungeon_Exits ) ) ) # Agahnim must be light world
2017-05-15 18:28:04 +00:00
2017-05-20 12:06:53 +00:00
# place old man, has limited options
2017-05-21 14:05:55 +00:00
# exit has to come from specific set of doors, the entrance is free to move about
random . shuffle ( old_man_entrances )
old_man_exit = old_man_entrances . pop ( )
2017-05-20 12:06:53 +00:00
lw_entrances . extend ( old_man_entrances )
2017-05-21 14:05:55 +00:00
random . shuffle ( lw_entrances )
old_man_entrance = lw_entrances . pop ( )
ret . append ( connect_two_way ( world , old_man_entrance , ' Old Man Cave Exit (West) ' ) )
ret . append ( connect_two_way ( world , old_man_exit , ' Old Man Cave Exit (East) ' ) )
2017-05-15 18:28:04 +00:00
2017-05-20 12:06:53 +00:00
# place Old Man House in Light World, so using the s&q point does not cause fake dark world
ret . append ( connect_caves ( world , lw_entrances , [ ] , [ ( ' Old Man House Exit (Bottom) ' , ' Old Man House Exit (Top) ' ) ] ) )
# now scramble the rest
ret . append ( connect_caves ( world , lw_entrances , dw_entrances , caves ) )
# scramble holes
ret . append ( scramble_holes ( world ) )
# place blacksmith, has limited options
random . shuffle ( blacksmith_doors )
blacksmith_hut = blacksmith_doors . pop ( )
ret . append ( connect_one_way ( world , blacksmith_hut , ' Blacksmiths Hut ' ) )
bomb_shop_doors . extend ( blacksmith_doors )
# place dam and pyramid fairy, have limited options
# ToDo Dam might be behind fat fairy if we later check for this when placing crystal 5 and 6
random . shuffle ( bomb_shop_doors )
bomb_shop = bomb_shop_doors . pop ( )
ret . append ( connect_one_way ( world , bomb_shop , ' Big Bomb Shop ' ) )
dam = bomb_shop_doors . pop ( )
ret . append ( connect_one_way ( world , dam , ' Dam ' ) )
single_doors . extend ( bomb_shop_doors )
# tavern back door cannot be shuffled yet
ret . append ( connect_doors ( world , [ ' Tavern North ' ] , [ ' Tavern ' ] ) )
# place remaining doors
ret . append ( connect_doors ( world , single_doors , door_targets ) )
2017-05-21 14:05:55 +00:00
elif world . shuffle == ' madness ' :
# here lie dragons, connections are no longer two way
ret . append ( ' Mixed Entrances: \n \n ' )
lw_entrances = list ( LW_Entrances + LW_Dungeon_Entrances )
dw_entrances = list ( DW_Entrances + DW_Dungeon_Entrances )
dw_entrances_must_exits = list ( DW_Entrances_Must_Exit + DW_Dungeon_Entrances_Must_Exit )
lw_doors = list ( LW_Entrances + LW_Dungeon_Entrances + LW_Dungeon_Entrances_Must_Exit ) + [ ' Kakariko Well Cave ' , ' Bat Cave Cave ' , ' North Fairy Cave ' , ' Sanctuary ' , ' Thieves Forest Hideout Stump ' ,
' Lumberjack Tree Cave ' , ' Hyrule Castle Secret Entrance Stairs ' ] + list ( Old_Man_Entrances )
dw_doors = list ( DW_Entrances + DW_Dungeon_Entrances + DW_Entrances_Must_Exit + DW_Dungeon_Entrances_Must_Exit ) + [ ' Skull Woods First Section Door ' , ' Skull Woods Second Section Door (East) ' , ' Skull Woods Second Section Door (West) ' ]
random . shuffle ( lw_doors )
random . shuffle ( dw_doors )
dw_entrances_must_exits . append ( ' Skull Woods Second Section Door (West) ' )
dw_entrances . append ( ' Skull Woods Second Section Door (East) ' )
dw_entrances . append ( ' Skull Woods First Section Door ' )
lw_entrances . extend ( [ ' Kakariko Well Cave ' , ' Bat Cave Cave ' , ' North Fairy Cave ' , ' Sanctuary ' , ' Thieves Forest Hideout Stump ' , ' Lumberjack Tree Cave ' , ' Hyrule Castle Entrance (South) ' ] )
lw_entrances_must_exits = list ( LW_Dungeon_Entrances_Must_Exit )
old_man_entrances = list ( Old_Man_Entrances )
2017-05-21 14:32:34 +00:00
mandatory_light_world = [ ' Agahnims Tower Exit ' , ' Old Man House Exit (Bottom) ' , ' Old Man House Exit (Top) ' ]
2017-05-21 14:05:55 +00:00
mandatory_dark_world = [ ]
caves = list ( Cave_Exits + Dungeon_Exits + Cave_Three_Exits )
# shuffle up holes
lw_hole_entrances = [ ' Kakariko Well Drop ' , ' Bat Cave Drop ' , ' North Fairy Cave Drop ' , ' Thieves Forest Hideout Drop ' , ' Lumberjack Tree Tree ' , ' Sanctuary Grave ' ]
dw_hole_entrances = [ ' Skull Woods First Section Hole (East) ' , ' Skull Woods First Section Hole (West) ' , ' Skull Woods First Section Hole (North) ' , ' Skull Woods Second Section Hole ' ]
hole_targets = [ ( ' Kakariko Well Exit ' , ' Kakariko Well (top) ' ) ,
( ' Bat Cave Exit ' , ' Bat Cave (right) ' ) ,
( ' North Fairy Cave Exit ' , ' North Fairy Cave ' ) ,
( ' Thieves Forest Hideout Exit ' , ' Thieves Forest Hideout (top) ' ) ,
( ' Lumberjack Tree Exit ' , ' Lumberjack Tree (top) ' ) ,
( ( ' Skull Woods Second Section Exit (East) ' , ' Skull Woods Second Section Exit (West) ' ) , ' Skull Woods Second Section ' ) ]
if world . mode == ' standard ' :
# cannot move uncle cave
ret . append ( connect_one_way ( world , ' Hyrule Castle Secret Entrance Drop ' , ' Hyrule Castle Secret Entrance ' ) )
ret . append ( connect_exit ( world , ' Hyrule Castle Secret Entrance Exit ' , ' Hyrule Castle Secret Entrance Stairs ' ) )
ret . append ( connect_entrance ( world , lw_doors . pop ( ) , ' Hyrule Castle Secret Entrance Exit ' ) )
else :
lw_hole_entrances . append ( ' Hyrule Castle Secret Entrance Drop ' )
hole_targets . append ( ( ' Hyrule Castle Secret Entrance Exit ' , ' Hyrule Castle Secret Entrance ' ) )
lw_entrances . append ( ' Hyrule Castle Secret Entrance Stairs ' )
random . shuffle ( lw_hole_entrances )
random . shuffle ( dw_hole_entrances )
random . shuffle ( hole_targets )
# decide if skull woods first section should be in light or dark world
sw_light = random . randint ( 0 , 1 ) == 0
if sw_light :
sw_hole_pool = lw_hole_entrances
mandatory_light_world . append ( ' Skull Woods First Section Exit ' )
else :
sw_hole_pool = dw_hole_entrances
mandatory_dark_world . append ( ' Skull Woods First Section Exit ' )
for target in [ ' Skull Woods First Section (Left) ' , ' Skull Woods First Section (Right) ' , ' Skull Woods First Section (Top) ' ] :
ret . append ( connect_one_way ( world , sw_hole_pool . pop ( ) , target ) )
# sanctuary has to be in light world
ret . append ( connect_one_way ( world , lw_hole_entrances . pop ( ) , ' Sewer Drop ' ) )
mandatory_light_world . append ( ' Sanctuary Exit ' )
# fill up remaining holes
for hole in dw_hole_entrances :
exits , target = hole_targets . pop ( )
mandatory_dark_world . append ( exits )
ret . append ( connect_one_way ( world , hole , target ) )
for hole in lw_hole_entrances :
exits , target = hole_targets . pop ( )
mandatory_light_world . append ( exits )
ret . append ( connect_one_way ( world , hole , target ) )
# hyrule castle handling
if world . mode == ' standard ' :
# must connect front of hyrule castle to do escape
ret . append ( connect_entrance ( world , ' Hyrule Castle Entrance (South) ' , ' Hyrule Castle Exit (South) ' ) )
random . shuffle ( lw_entrances )
ret . append ( connect_exit ( world , ' Hyrule Castle Exit (South) ' , lw_entrances . pop ( ) ) )
mandatory_light_world . append ( ( ' Hyrule Castle Exit (West) ' , ' Hyrule Castle Exit (East) ' ) )
else :
lw_doors . append ( ' Hyrule Castle Entrance (South) ' )
caves . append ( ( ' Hyrule Castle Exit (South) ' , ' Hyrule Castle Exit (West) ' , ' Hyrule Castle Exit (East) ' ) )
# now let's deal with mandatory reachable stuff
def extract_reachable_exit ( cavelist ) :
random . shuffle ( cavelist )
candidate = None
for cave in cavelist :
if isinstance ( cave , tuple ) and len ( cave ) > 1 :
2017-05-22 19:38:10 +00:00
# special handling: TRock and Spectracle Rock cave have two entries that we should consider entrance only
# ToDo this should be handled in a more sensible manner
if cave [ 0 ] in [ ' Turtle Rock Exit (Front) ' , ' Spectacle Rock Cave Exit (Peak) ' ] and len ( cave ) == 2 :
2017-05-21 14:05:55 +00:00
continue
candidate = cave
break
if candidate is None :
raise RuntimeError ( ' No suitable cave. ' )
cavelist . remove ( candidate )
return candidate
def connect_reachable_exit ( entrance , general , worldspecific , worldoors ) :
# select which one is the primary option
if random . randint ( 0 , 1 ) == 0 :
primary = general
secondary = worldspecific
else :
primary = worldspecific
secondary = general
try :
cave = extract_reachable_exit ( primary )
except RuntimeError :
cave = extract_reachable_exit ( secondary )
exit = cave [ - 1 ]
cave = cave [ : - 1 ]
ret . append ( connect_exit ( world , exit , entrance ) )
ret . append ( connect_entrance ( world , worldoors . pop ( ) , exit ) )
# rest of cave now is forced to be in this world
worldspecific . append ( cave )
# we randomize which world requirements we fulfill first so we get better dungeon distribution
if random . randint ( 0 , 1 ) == 0 :
for entrance in lw_entrances_must_exits :
connect_reachable_exit ( entrance , caves , mandatory_light_world , lw_doors )
for entrance in dw_entrances_must_exits :
connect_reachable_exit ( entrance , caves , mandatory_dark_world , dw_doors )
else :
for entrance in dw_entrances_must_exits :
connect_reachable_exit ( entrance , caves , mandatory_dark_world , dw_doors )
for entrance in lw_entrances_must_exits :
connect_reachable_exit ( entrance , caves , mandatory_light_world , lw_doors )
# place old man, has limited options
# exit has to come from specific set of doors, the entrance is free to move about
random . shuffle ( old_man_entrances )
old_man_exit = old_man_entrances . pop ( )
lw_entrances . extend ( old_man_entrances )
random . shuffle ( lw_entrances )
ret . append ( connect_exit ( world , ' Old Man Cave Exit (East) ' , old_man_exit ) )
ret . append ( connect_entrance ( world , lw_doors . pop ( ) , ' Old Man Cave Exit (East) ' ) )
mandatory_light_world . append ( ' Old Man Cave Exit (West) ' )
# we connect up the mandatory associations we have found
for mandatory in mandatory_light_world :
if not isinstance ( mandatory , tuple ) :
mandatory = ( mandatory , )
for exit in mandatory :
# point out somewhere
ret . append ( connect_exit ( world , exit , lw_entrances . pop ( ) ) )
# point in from somewhere
ret . append ( connect_entrance ( world , lw_doors . pop ( ) , exit ) )
for mandatory in mandatory_dark_world :
if not isinstance ( mandatory , tuple ) :
mandatory = ( mandatory , )
for exit in mandatory :
# point out somewhere
ret . append ( connect_exit ( world , exit , dw_entrances . pop ( ) ) )
# point in from somewhere
ret . append ( connect_entrance ( world , dw_doors . pop ( ) , exit ) )
# handle remaining caves
while caves :
# connect highest exit count caves first, prevent issue where we have 2 or 3 exits accross worlds left to fill
cave_candidate = ( None , 0 )
for i , cave in enumerate ( caves ) :
if isinstance ( cave , str ) :
cave = ( cave , )
if len ( cave ) > cave_candidate [ 1 ] :
cave_candidate = ( i , len ( cave ) )
cave = caves . pop ( cave_candidate [ 0 ] )
place_lightworld = random . randint ( 0 , 1 ) == 0
if place_lightworld :
target_doors = lw_doors
target_entrances = lw_entrances
else :
target_doors = dw_doors
target_entrances = dw_entrances
if isinstance ( cave , str ) :
cave = ( cave , )
# check if we can still fit the cave into our target group
if len ( target_doors ) < len ( cave ) :
if not place_lightworld :
target_doors = lw_doors
target_entrances = lw_entrances
else :
target_doors = dw_doors
target_entrances = dw_entrances
for exit in cave :
ret . append ( connect_exit ( world , exit , target_entrances . pop ( ) ) )
ret . append ( connect_entrance ( world , target_doors . pop ( ) , exit ) )
# handle simple doors
single_doors = list ( Single_Cave_Doors )
bomb_shop_doors = list ( Bomb_Shop_Single_Cave_Doors )
blacksmith_doors = list ( Blacksmith_Single_Cave_Doors )
door_targets = list ( Single_Cave_Targets )
# place blacksmith, has limited options
random . shuffle ( blacksmith_doors )
blacksmith_hut = blacksmith_doors . pop ( )
ret . append ( connect_one_way ( world , blacksmith_hut , ' Blacksmiths Hut ' ) )
bomb_shop_doors . extend ( blacksmith_doors )
# place dam and pyramid fairy, have limited options
# ToDo Dam might be behind fat fairy if we later check for this when placing crystal 5 and 6
random . shuffle ( bomb_shop_doors )
bomb_shop = bomb_shop_doors . pop ( )
ret . append ( connect_one_way ( world , bomb_shop , ' Big Bomb Shop ' ) )
dam = bomb_shop_doors . pop ( )
ret . append ( connect_one_way ( world , dam , ' Dam ' ) )
single_doors . extend ( bomb_shop_doors )
# tavern back door cannot be shuffled yet
ret . append ( connect_doors ( world , [ ' Tavern North ' ] , [ ' Tavern ' ] ) )
# place remaining doors
ret . append ( connect_doors ( world , single_doors , door_targets ) )
2017-05-22 17:52:50 +00:00
elif world . shuffle == ' insanity ' :
# beware ye who enter here
ret . append ( ' Mixed Entrances: \n \n ' )
entrances = LW_Entrances + LW_Dungeon_Entrances + DW_Entrances + DW_Dungeon_Entrances + [ ' Skull Woods Second Section Door (East) ' , ' Skull Woods First Section Door ' , ' Kakariko Well Cave ' , ' Bat Cave Cave ' , ' North Fairy Cave ' , ' Sanctuary ' , ' Thieves Forest Hideout Stump ' , ' Lumberjack Tree Cave ' , ' Hyrule Castle Entrance (South) ' ]
entrances_must_exits = DW_Entrances_Must_Exit + DW_Dungeon_Entrances_Must_Exit + LW_Dungeon_Entrances_Must_Exit + [ ' Skull Woods Second Section Door (West) ' ]
doors = LW_Entrances + LW_Dungeon_Entrances + LW_Dungeon_Entrances_Must_Exit + [ ' Kakariko Well Cave ' , ' Bat Cave Cave ' , ' North Fairy Cave ' , ' Sanctuary ' , ' Thieves Forest Hideout Stump ' , ' Lumberjack Tree Cave ' , ' Hyrule Castle Secret Entrance Stairs ' ] + Old_Man_Entrances + \
DW_Entrances + DW_Dungeon_Entrances + DW_Entrances_Must_Exit + DW_Dungeon_Entrances_Must_Exit + [ ' Skull Woods First Section Door ' , ' Skull Woods Second Section Door (East) ' , ' Skull Woods Second Section Door (West) ' ]
random . shuffle ( doors )
old_man_entrances = list ( Old_Man_Entrances )
caves = Cave_Exits + Dungeon_Exits + Cave_Three_Exits + [ ' Old Man House Exit (Bottom) ' , ' Old Man House Exit (Top) ' , ' Skull Woods First Section Exit ' , ' Skull Woods Second Section Exit (East) ' , ' Skull Woods Second Section Exit (West) ' ,
' Kakariko Well Exit ' , ' Bat Cave Exit ' , ' North Fairy Cave Exit ' , ' Thieves Forest Hideout Exit ' , ' Lumberjack Tree Exit ' , ' Sanctuary Exit ' ]
# shuffle up holes
hole_entrances = [ ' Kakariko Well Drop ' , ' Bat Cave Drop ' , ' North Fairy Cave Drop ' , ' Thieves Forest Hideout Drop ' , ' Lumberjack Tree Tree ' , ' Sanctuary Grave ' ,
' Skull Woods First Section Hole (East) ' , ' Skull Woods First Section Hole (West) ' , ' Skull Woods First Section Hole (North) ' , ' Skull Woods Second Section Hole ' ]
hole_targets = [ ' Kakariko Well (top) ' , ' Bat Cave (right) ' , ' North Fairy Cave ' , ' Thieves Forest Hideout (top) ' , ' Lumberjack Tree (top) ' , ' Sewer Drop ' , ' Skull Woods Second Section ' ,
' Skull Woods First Section (Left) ' , ' Skull Woods First Section (Right) ' , ' Skull Woods First Section (Top) ' ]
if world . mode == ' standard ' :
# cannot move uncle cave
ret . append ( connect_one_way ( world , ' Hyrule Castle Secret Entrance Drop ' , ' Hyrule Castle Secret Entrance ' ) )
ret . append ( connect_exit ( world , ' Hyrule Castle Secret Entrance Exit ' , ' Hyrule Castle Secret Entrance Stairs ' ) )
ret . append ( connect_entrance ( world , doors . pop ( ) , ' Hyrule Castle Secret Entrance Exit ' ) )
else :
hole_entrances . append ( ' Hyrule Castle Secret Entrance Drop ' )
hole_targets . append ( ' Hyrule Castle Secret Entrance ' )
entrances . append ( ' Hyrule Castle Secret Entrance Stairs ' )
caves . append ( ' Hyrule Castle Secret Entrance Exit ' )
random . shuffle ( hole_entrances )
random . shuffle ( hole_targets )
random . shuffle ( entrances )
# fill up holes
for hole in hole_entrances :
ret . append ( connect_one_way ( world , hole , hole_targets . pop ( ) ) )
# hyrule castle handling
if world . mode == ' standard ' :
# must connect front of hyrule castle to do escape
ret . append ( connect_entrance ( world , ' Hyrule Castle Entrance (South) ' , ' Hyrule Castle Exit (South) ' ) )
ret . append ( connect_exit ( world , ' Hyrule Castle Exit (South) ' , entrances . pop ( ) ) )
caves . append ( ( ' Hyrule Castle Exit (West) ' , ' Hyrule Castle Exit (East) ' ) )
else :
doors . append ( ' Hyrule Castle Entrance (South) ' )
caves . append ( ( ' Hyrule Castle Exit (South) ' , ' Hyrule Castle Exit (West) ' , ' Hyrule Castle Exit (East) ' ) )
# now let's deal with mandatory reachable stuff
def extract_reachable_exit ( cavelist ) :
random . shuffle ( cavelist )
candidate = None
for cave in cavelist :
if isinstance ( cave , tuple ) and len ( cave ) > 1 :
# special handling: TRock has two entries that we should consider entrance only
2017-05-22 20:00:26 +00:00
# ToDo this should be handled in a more sensible manner
if cave [ 0 ] in [ ' Turtle Rock Exit (Front) ' , ' Spectacle Rock Cave Exit (Peak) ' ] and len ( cave ) == 2 :
2017-05-22 17:52:50 +00:00
continue
candidate = cave
break
if candidate is None :
raise RuntimeError ( ' No suitable cave. ' )
cavelist . remove ( candidate )
return candidate
def connect_reachable_exit ( entrance , caves , doors ) :
cave = extract_reachable_exit ( caves )
exit = cave [ - 1 ]
cave = cave [ : - 1 ]
ret . append ( connect_exit ( world , exit , entrance ) )
ret . append ( connect_entrance ( world , doors . pop ( ) , exit ) )
# rest of cave now is forced to be in this world
caves . append ( cave )
# connect mandatory exits
for entrance in entrances_must_exits :
connect_reachable_exit ( entrance , caves , doors )
# place old man, has limited options
# exit has to come from specific set of doors, the entrance is free to move about
random . shuffle ( old_man_entrances )
old_man_exit = old_man_entrances . pop ( )
entrances . extend ( old_man_entrances )
random . shuffle ( entrances )
ret . append ( connect_exit ( world , ' Old Man Cave Exit (East) ' , old_man_exit ) )
ret . append ( connect_entrance ( world , doors . pop ( ) , ' Old Man Cave Exit (East) ' ) )
caves . append ( ' Old Man Cave Exit (West) ' )
# Aghanim needs to be Light World to spawn
# find suitable LW Entrance
lw_entrances = LW_Entrances + LW_Dungeon_Entrances + LW_Dungeon_Entrances_Must_Exit + Old_Man_Entrances + \
[ ' Kakariko Well Cave ' , ' Bat Cave Cave ' , ' North Fairy Cave ' , ' Sanctuary ' , ' Thieves Forest Hideout Stump ' , ' Lumberjack Tree Cave ' , ' Hyrule Castle Entrance (South) ' , ' Hyrule Castle Secret Entrance Stairs ' ]
candidate = None
for entrance in entrances :
if entrance in lw_entrances :
candidate = entrance
break
# should always have enough candidates left here, should never happen
if candidate is None :
raise RuntimeError ( ' Your Algorithm is broken. ' )
entrances . remove ( candidate )
ret . append ( connect_exit ( world , ' Agahnims Tower Exit ' , candidate ) )
ret . append ( connect_entrance ( world , doors . pop ( ) , ' Agahnims Tower Exit ' ) )
# handle remaining caves
for cave in caves :
if isinstance ( cave , str ) :
cave = ( cave , )
for exit in cave :
ret . append ( connect_exit ( world , exit , entrances . pop ( ) ) )
ret . append ( connect_entrance ( world , doors . pop ( ) , exit ) )
# handle simple doors
single_doors = list ( Single_Cave_Doors )
bomb_shop_doors = list ( Bomb_Shop_Single_Cave_Doors )
blacksmith_doors = list ( Blacksmith_Single_Cave_Doors )
door_targets = list ( Single_Cave_Targets )
# place blacksmith, has limited options
random . shuffle ( blacksmith_doors )
blacksmith_hut = blacksmith_doors . pop ( )
ret . append ( connect_one_way ( world , blacksmith_hut , ' Blacksmiths Hut ' ) )
bomb_shop_doors . extend ( blacksmith_doors )
# place dam and pyramid fairy, have limited options
# ToDo Dam might be behind fat fairy if we later check for this when placing crystal 5 and 6
random . shuffle ( bomb_shop_doors )
bomb_shop = bomb_shop_doors . pop ( )
ret . append ( connect_one_way ( world , bomb_shop , ' Big Bomb Shop ' ) )
dam = bomb_shop_doors . pop ( )
ret . append ( connect_one_way ( world , dam , ' Dam ' ) )
single_doors . extend ( bomb_shop_doors )
# tavern back door cannot be shuffled yet
ret . append ( connect_doors ( world , [ ' Tavern North ' ] , [ ' Tavern ' ] ) )
# place remaining doors
ret . append ( connect_doors ( world , single_doors , door_targets ) )
2017-05-20 12:06:53 +00:00
else :
raise NotImplementedError ( ' Shuffling not supported yet ' )
2017-05-21 14:32:34 +00:00
if world . agahnim_fix_required :
# need to swap contents of Mimic Cave and TRock Ledge Right so Agahnim 1 is in Light World!
ret . append ( ' Fix to prevent Agahnim Softlock: Swap Contents of Turtle Rock Ledge (East) and Mimic Cave: ' )
2017-05-20 12:06:53 +00:00
mimic_cave_target = world . get_entrance ( ' Mimic Cave Mirror Spot ' ) . connected_region
ret . append ( connect_one_way ( world , ' Dark Death Mountain Ledge (East) ' , mimic_cave_target ) )
2017-05-21 14:32:34 +00:00
ret . append ( connect_one_way ( world , ' Mimic Cave Mirror Spot ' , ' Agahnims Tower ' ) )
2017-05-20 12:06:53 +00:00
# check for swamp palace fix
if world . get_entrance ( ' Dam ' ) . connected_region . name != ' Dam ' or world . get_entrance ( ' Swamp Palace ' ) . connected_region . name != ' Swamp Palace (Entrance) ' :
world . swamp_patch_required = True
return ' \n ' . join ( ret ) + ' \n \n '
def connect_simple ( world , exitname , regionname ) :
2017-05-15 18:28:04 +00:00
world . get_entrance ( exitname ) . connect ( world . get_region ( regionname ) )
2017-05-20 12:06:53 +00:00
def connect_one_way ( world , exitname , regionname ) :
entrance = world . get_entrance ( exitname )
region = world . get_region ( regionname )
target = cave_codes . get ( region . name , None )
entrance . connect ( region , target )
return ' %s => %s ' % ( entrance . name , region . name )
2017-05-21 14:05:55 +00:00
def connect_entrance ( world , entrancename , exitname ) :
entrance = world . get_entrance ( entrancename )
exit = world . get_entrance ( exitname )
target = ( exit_ids [ exit . name ] [ 0 ] , entrance . target [ 1 ] if entrance . target is not None else None )
entrance . connect ( exit . parent_region , target )
return ' %s => %s ' % ( entrance . name , exit . name )
def connect_exit ( world , exitname , entrancename ) :
entrance = world . get_entrance ( entrancename )
exit = world . get_entrance ( exitname )
target = ( entrance . target [ 0 ] if entrance . target is not None else None , exit_ids [ exit . name ] [ 1 ] )
entrance . target = target
exit . connect ( entrance . parent_region )
return ' %s <= %s ' % ( entrance . name , exit . name )
2017-05-20 12:06:53 +00:00
def connect_two_way ( world , entrancename , exitname ) :
entrance = world . get_entrance ( entrancename )
exit = world . get_entrance ( exitname )
entrance . connect ( exit . parent_region , exit_ids [ exit . name ] )
exit . connect ( entrance . parent_region )
return ' %s <=> %s ' % ( entrance . name , exit . name )
def scramble_holes ( world ) :
ret = [ ]
hole_entrances = [ ( ' Kakariko Well Cave ' , ' Kakariko Well Drop ' ) ,
( ' Bat Cave Cave ' , ' Bat Cave Drop ' ) ,
( ' North Fairy Cave ' , ' North Fairy Cave Drop ' ) ,
( ' Thieves Forest Hideout Stump ' , ' Thieves Forest Hideout Drop ' ) ,
( ' Lumberjack Tree Cave ' , ' Lumberjack Tree Tree ' ) ,
( ' Sanctuary ' , ' Sanctuary Grave ' ) ]
hole_targets = [ ( ' Kakariko Well Exit ' , ' Kakariko Well (top) ' ) ,
( ' Bat Cave Exit ' , ' Bat Cave (right) ' ) ,
( ' North Fairy Cave Exit ' , ' North Fairy Cave ' ) ,
( ' Thieves Forest Hideout Exit ' , ' Thieves Forest Hideout (top) ' ) ,
( ' Lumberjack Tree Exit ' , ' Lumberjack Tree (top) ' ) ,
( ' Sanctuary Exit ' , ' Sewer Drop ' ) ]
if world . mode == ' standard ' :
# cannot move uncle cave
ret . append ( connect_two_way ( world , ' Hyrule Castle Secret Entrance Stairs ' , ' Hyrule Castle Secret Entrance Exit ' ) )
ret . append ( connect_one_way ( world , ' Hyrule Castle Secret Entrance Drop ' , ' Hyrule Castle Secret Entrance ' ) )
else :
hole_entrances . append ( ( ' Hyrule Castle Secret Entrance Stairs ' , ' Hyrule Castle Secret Entrance Drop ' ) )
hole_targets . append ( ( ' Hyrule Castle Secret Entrance Exit ' , ' Hyrule Castle Secret Entrance ' ) )
random . shuffle ( hole_targets )
for entrance , drop in hole_entrances :
exit , target = hole_targets . pop ( )
ret . append ( connect_two_way ( world , entrance , exit ) )
ret . append ( connect_one_way ( world , drop , target ) )
return ' \n ' . join ( ret )
def connect_random ( world , exitlist , targetlist , two_way = False ) :
targetlist = list ( targetlist )
random . shuffle ( targetlist )
ret = [ ]
for exit , target in zip ( exitlist , targetlist ) :
if two_way :
ret . append ( connect_two_way ( world , exit , target ) )
else :
ret . append ( connect_one_way ( world , exit , target ) )
return ' \n ' . join ( ret )
def connect_mandatory_exits ( world , entrances , caves , must_be_exits ) :
""" This works inplace """
ret = [ ]
random . shuffle ( entrances )
random . shuffle ( caves )
while must_be_exits :
exit = must_be_exits . pop ( )
# find multi exit cave
cave = None
for candidate in caves :
if not isinstance ( candidate , str ) :
cave = candidate
break
if cave is None :
raise RuntimeError ( ' No more caves left. Should not happen! ' )
else :
caves . remove ( cave )
# all caves are sorted so that the last exit is always reachable
for i in range ( len ( cave ) - 1 ) :
entrance = entrances . pop ( )
# ToDo Better solution, this is a hot fix. Do not connect both sides of trock ledge to each other
if entrance == ' Dark Death Mountain Ledge (West) ' :
new_entrance = entrances . pop ( )
entrances . append ( entrance )
entrance = new_entrance
ret . append ( connect_two_way ( world , entrance , cave [ i ] ) )
ret . append ( connect_two_way ( world , exit , cave [ - 1 ] ) )
return ' \n ' . join ( ret )
def connect_caves ( world , lw_entrances , dw_entrances , caves ) :
""" This works inplace """
ret = [ ]
random . shuffle ( lw_entrances )
random . shuffle ( dw_entrances )
random . shuffle ( caves )
while caves :
# connect highest exit count caves first, prevent issue where we have 2 or 3 exits accross worlds left to fill
cave_candidate = ( None , 0 )
for i , cave in enumerate ( caves ) :
if isinstance ( cave , str ) :
cave = ( cave , )
if len ( cave ) > cave_candidate [ 1 ] :
cave_candidate = ( i , len ( cave ) )
cave = caves . pop ( cave_candidate [ 0 ] )
target = lw_entrances if random . randint ( 0 , 1 ) == 0 else dw_entrances
if isinstance ( cave , str ) :
cave = ( cave , )
# check if we can still fit the cave into our target group
if len ( target ) < len ( cave ) :
# need to use other set
target = lw_entrances if target is dw_entrances else dw_entrances
for exit in cave :
ret . append ( connect_two_way ( world , target . pop ( ) , exit ) )
return ' \n ' . join ( ret )
def connect_doors ( world , doors , targets ) :
""" This works inplace """
ret = [ ]
random . shuffle ( doors )
random . shuffle ( targets )
while doors :
door = doors . pop ( )
target = targets . pop ( )
ret . append ( connect_one_way ( world , door , target ) )
return ' \n ' . join ( ret )
def skull_woods_shuffle ( world ) :
ret = connect_random ( world , [ ' Skull Woods First Section Hole (East) ' , ' Skull Woods First Section Hole (West) ' , ' Skull Woods First Section Hole (North) ' , ' Skull Woods Second Section Hole ' ] ,
[ ' Skull Woods First Section (Left) ' , ' Skull Woods First Section (Right) ' , ' Skull Woods First Section (Top) ' , ' Skull Woods Second Section ' ] )
return ret + ' \n ' + connect_random ( world , [ ' Skull Woods First Section Door ' , ' Skull Woods Second Section Door (East) ' , ' Skull Woods Second Section Door (West) ' ] ,
[ ' Skull Woods First Section Exit ' , ' Skull Woods Second Section Exit (East) ' , ' Skull Woods Second Section Exit (West) ' ] , True )
def simple_shuffle_dungeons ( world ) :
ret = [ ]
ret . append ( skull_woods_shuffle ( world ) )
# shuffle up single entrance dungeons
ret . append ( connect_random ( world , [ ' Eastern Palace ' , ' Tower of Hera ' , ' Thieves Town ' , ' Skull Woods Final Section ' , ' Palace of Darkness ' , ' Ice Palace ' , ' Misery Mire ' , ' Swamp Palace ' ] ,
[ ' Eastern Palace Exit ' , ' Tower of Hera Exit ' , ' Thieves Town Exit ' , ' Skull Woods Final Section Exit ' , ' Dark Palace Exit ' , ' Ice Palace Exit ' , ' Misery Mire Exit ' , ' Swamp Palace Exit ' ] , True ) )
# mix up 4 door dungeons
multi_dungeons = [ ' Desert ' , ' Turtle Rock ' ]
if world . mode == ' open ' :
multi_dungeons . append ( ' Hyrule Castle ' )
random . shuffle ( multi_dungeons )
dp_target = multi_dungeons [ 0 ]
tr_target = multi_dungeons [ 1 ]
if world . mode != ' open ' :
# place hyrule castle as intended
hc_target = ' Hyrule Castle '
else :
hc_target = multi_dungeons [ 2 ]
# ToDo improve this?
if hc_target == ' Hyrule Castle ' :
ret . append ( connect_two_way ( world , ' Hyrule Castle Entrance (South) ' , ' Hyrule Castle Exit (South) ' ) )
ret . append ( connect_two_way ( world , ' Hyrule Castle Entrance (East) ' , ' Hyrule Castle Exit (East) ' ) )
ret . append ( connect_two_way ( world , ' Hyrule Castle Entrance (West) ' , ' Hyrule Castle Exit (West) ' ) )
2017-05-21 14:32:34 +00:00
ret . append ( connect_two_way ( world , ' Agahnims Tower ' , ' Agahnims Tower Exit ' ) )
2017-05-20 12:06:53 +00:00
elif hc_target == ' Desert ' :
ret . append ( connect_two_way ( world , ' Desert Palace Entrance (South) ' , ' Hyrule Castle Exit (South) ' ) )
ret . append ( connect_two_way ( world , ' Desert Palace Entrance (East) ' , ' Hyrule Castle Exit (East) ' ) )
ret . append ( connect_two_way ( world , ' Desert Palace Entrance (West) ' , ' Hyrule Castle Exit (West) ' ) )
2017-05-21 14:32:34 +00:00
ret . append ( connect_two_way ( world , ' Desert Palace Entrance (North) ' , ' Agahnims Tower Exit ' ) )
2017-05-20 12:06:53 +00:00
elif hc_target == ' Turtle Rock ' :
ret . append ( connect_two_way ( world , ' Turtle Rock ' , ' Hyrule Castle Exit (South) ' ) )
ret . append ( connect_two_way ( world , ' Turtle Rock Isolated Ledge Entrance ' , ' Hyrule Castle Exit (East) ' ) )
ret . append ( connect_two_way ( world , ' Dark Death Mountain Ledge (West) ' , ' Hyrule Castle Exit (West) ' ) )
2017-05-21 14:32:34 +00:00
ret . append ( connect_two_way ( world , ' Dark Death Mountain Ledge (East) ' , ' Agahnims Tower Exit ' ) )
world . agahnim_fix_required = True # need this for now
2017-05-20 12:06:53 +00:00
if dp_target == ' Hyrule Castle ' :
ret . append ( connect_two_way ( world , ' Hyrule Castle Entrance (South) ' , ' Desert Palace Exit (South) ' ) )
ret . append ( connect_two_way ( world , ' Hyrule Castle Entrance (East) ' , ' Desert Palace Exit (East) ' ) )
ret . append ( connect_two_way ( world , ' Hyrule Castle Entrance (West) ' , ' Desert Palace Exit (West) ' ) )
2017-05-21 14:32:34 +00:00
ret . append ( connect_two_way ( world , ' Agahnims Tower ' , ' Desert Palace Exit (North) ' ) )
2017-05-20 12:06:53 +00:00
elif dp_target == ' Desert ' :
ret . append ( connect_two_way ( world , ' Desert Palace Entrance (South) ' , ' Desert Palace Exit (South) ' ) )
ret . append ( connect_two_way ( world , ' Desert Palace Entrance (East) ' , ' Desert Palace Exit (East) ' ) )
ret . append ( connect_two_way ( world , ' Desert Palace Entrance (West) ' , ' Desert Palace Exit (West) ' ) )
ret . append ( connect_two_way ( world , ' Desert Palace Entrance (North) ' , ' Desert Palace Exit (North) ' ) )
elif dp_target == ' Turtle Rock ' :
ret . append ( connect_two_way ( world , ' Turtle Rock ' , ' Desert Palace Exit (South) ' ) )
ret . append ( connect_two_way ( world , ' Turtle Rock Isolated Ledge Entrance ' , ' Desert Palace Exit (East) ' ) )
ret . append ( connect_two_way ( world , ' Dark Death Mountain Ledge (West) ' , ' Desert Palace Exit (West) ' ) )
ret . append ( connect_two_way ( world , ' Dark Death Mountain Ledge (East) ' , ' Desert Palace Exit (North) ' ) )
if tr_target == ' Hyrule Castle ' :
ret . append ( connect_two_way ( world , ' Hyrule Castle Entrance (South) ' , ' Turtle Rock Exit (Front) ' ) )
ret . append ( connect_two_way ( world , ' Hyrule Castle Entrance (East) ' , ' Turtle Rock Ledge Exit (East) ' ) )
ret . append ( connect_two_way ( world , ' Hyrule Castle Entrance (West) ' , ' Turtle Rock Ledge Exit (West) ' ) )
2017-05-21 14:32:34 +00:00
ret . append ( connect_two_way ( world , ' Agahnims Tower ' , ' Turtle Rock Isolated Ledge Exit ' ) )
2017-05-20 12:06:53 +00:00
elif tr_target == ' Desert ' :
ret . append ( connect_two_way ( world , ' Desert Palace Entrance (South) ' , ' Turtle Rock Exit (Front) ' ) )
ret . append ( connect_two_way ( world , ' Desert Palace Entrance (North) ' , ' Turtle Rock Ledge Exit (East) ' ) )
ret . append ( connect_two_way ( world , ' Desert Palace Entrance (West) ' , ' Turtle Rock Ledge Exit (West) ' ) )
ret . append ( connect_two_way ( world , ' Desert Palace Entrance (East) ' , ' Turtle Rock Isolated Ledge Exit ' ) )
elif tr_target == ' Turtle Rock ' :
ret . append ( connect_two_way ( world , ' Turtle Rock ' , ' Turtle Rock Exit (Front) ' ) )
ret . append ( connect_two_way ( world , ' Turtle Rock Isolated Ledge Entrance ' , ' Turtle Rock Isolated Ledge Exit ' ) )
ret . append ( connect_two_way ( world , ' Dark Death Mountain Ledge (West) ' , ' Turtle Rock Ledge Exit (West) ' ) )
ret . append ( connect_two_way ( world , ' Dark Death Mountain Ledge (East) ' , ' Turtle Rock Ledge Exit (East) ' ) )
return ' \n ' . join ( ret )
LW_Dungeon_Entrances = [ ' Desert Palace Entrance (South) ' ,
' Desert Palace Entrance (West) ' ,
' Desert Palace Entrance (North) ' ,
' Eastern Palace ' ,
' Tower of Hera ' ,
' Hyrule Castle Entrance (West) ' ,
' Hyrule Castle Entrance (East) ' ,
2017-05-21 14:32:34 +00:00
' Agahnims Tower ' ]
2017-05-20 12:06:53 +00:00
LW_Dungeon_Entrances_Must_Exit = [ ' Desert Palace Entrance (East) ' ]
DW_Dungeon_Entrances = [ ' Thieves Town ' ,
' Skull Woods Final Section ' ,
' Ice Palace ' ,
' Misery Mire ' ,
' Palace of Darkness ' ,
' Swamp Palace ' ,
' Turtle Rock ' ,
' Dark Death Mountain Ledge (West) ' ]
DW_Dungeon_Entrances_Must_Exit = [ ' Dark Death Mountain Ledge (East) ' ,
' Turtle Rock Isolated Ledge Entrance ' ]
2017-05-21 14:32:34 +00:00
LW_Dungeon_Exits = [ ' Agahnims Tower Exit ' ]
2017-05-20 12:06:53 +00:00
Dungeon_Exits = [ ( ' Desert Palace Exit (South) ' , ' Desert Palace Exit (West) ' , ' Desert Palace Exit (East) ' ) ,
' Desert Palace Exit (North) ' ,
' Eastern Palace Exit ' ,
' Tower of Hera Exit ' ,
' Thieves Town Exit ' ,
' Skull Woods Final Section Exit ' ,
' Ice Palace Exit ' ,
' Misery Mire Exit ' ,
' Dark Palace Exit ' ,
' Swamp Palace Exit ' ,
( ' Turtle Rock Exit (Front) ' , ' Turtle Rock Ledge Exit (East) ' , ' Turtle Rock Ledge Exit (West) ' , ' Turtle Rock Isolated Ledge Exit ' ) ]
DW_Entrances_Must_Exit = [ ' Bumper Cave (Top) ' , ' Hookshot Cave Back Entrance ' ]
2017-05-21 14:05:55 +00:00
Two_Door_Caves_Directional = [ ( ' Bumper Cave (Bottom) ' , ' Bumper Cave (Top) ' ) ,
( ' Hookshot Cave ' , ' Hookshot Cave Back Entrance ' ) ]
Two_Door_Caves = [ ( ' Elder House (East) ' , ' Elder House (West) ' ) ,
( ' Two Brothers House (East) ' , ' Two Brothers House (West) ' ) ,
( ' Dark Death Mountain Climb (Bottom) ' , ' Dark Death Mountain Climb (Top) ' ) ]
2017-05-20 12:06:53 +00:00
Old_Man_Entrances = [ ' Old Man Cave (East) ' ,
' Old Man House (Top) ' ,
' Death Mountain Return Cave (East) ' ,
' Spectacle Rock Cave ' ,
' Spectacle Rock Cave Peak ' ,
' Spectacle Rock Cave (Bottom) ' ]
Cave_Exits = [ ( ' Elder House Exit (East) ' , ' Elder House Exit (West) ' ) ,
( ' Two Brothers House Exit (East) ' , ' Two Brothers House Exit (West) ' ) ,
( ' Death Mountain Return Cave Exit (West) ' , ' Death Mountain Return Cave Exit (East) ' ) ,
( ' Death Mountain Fairy Drop Cave Exit (Bottom) ' , ' Death Mountain Fairy Drop Cave Exit (Top) ' ) ,
( ' Spiral Cave Exit (Top) ' , ' Spiral Cave Exit ' ) ,
( ' Bumper Cave Exit (Top) ' , ' Bumper Cave Exit (Bottom) ' ) ,
( ' Dark Death Mountain Climb Exit (Bottom) ' , ' Dark Death Mountain Climb Exit (Top) ' ) ,
( ' Hookshot Cave Exit (South) ' , ' Hookshot Cave Exit (North) ' ) ]
Cave_Three_Exits = [ ( ' Spectacle Rock Cave Exit (Peak) ' , ' Spectacle Rock Cave Exit (Top) ' , ' Spectacle Rock Cave Exit ' ) ,
( ' Death Mountain Climb Exit (Top) ' , ' Death Mountain Climb Exit (Middle) ' , ' Death Mountain Climb Exit (Bottom) ' ) ]
LW_Entrances = [ ' Elder House (East) ' ,
' Elder House (West) ' ,
' Two Brothers House (East) ' ,
' Two Brothers House (West) ' ,
' Old Man Cave (West) ' ,
' Old Man House (Bottom) ' ,
' Death Mountain Return Cave (West) ' ,
' Death Mountain Climb (Bottom) ' ,
' Death Mountain Climb (Middle) ' ,
' Death Mountain Climb (Top) ' ,
' Death Mountain Fairy Drop Cave (Bottom) ' ,
' Death Mountain Fairy Drop Cave (Top) ' ,
' Spiral Cave ' ,
' Spiral Cave (Bottom) ' ]
DW_Entrances = [ ' Bumper Cave (Bottom) ' ,
' Dark Death Mountain Climb (Top) ' ,
' Dark Death Mountain Climb (Bottom) ' ,
' Hookshot Cave ' ]
Blacksmith_Single_Cave_Doors = [ ' Thiefs Hut ' ,
' Bonk Fairy (Light) ' ,
' Lake Hylia Fairy ' ,
' Swamp Fairy ' ,
' Desert Fairy ' ,
' Kings Grave ' ,
' Chicken House ' ,
' Aginahs Cave ' ,
' Sahasrahlas Hut ' ,
' Cave Shop (Lake Hylia) ' ,
' Blacksmiths Hut ' ,
' Sick Kids House ' ,
' Lost Woods Gamble ' ,
' Fortune Teller (Light) ' ,
' Snitch Lady (East) ' ,
' Snitch Lady (West) ' ,
' Bush Covered House ' ,
' Tavern (Front) ' ,
' Light World Bomb Hut ' ,
' Kakariko Shop ' ,
' Cave South of Haunted Grove ' ,
' Graveyard Cave ' ,
' Desert Cave ' ,
' Lake Hylia Cave ' ,
' Long Fairy Cave ' ,
' Good Bee Cave ' ,
' 20 Rupee Cave ' ,
' 50 Rupee Cave ' ,
' Ice Cave ' ,
' Bonk Rock Cave ' ,
' Library ' ,
' Witch Hut ' ,
' Hookshot Fairy ' ,
' Waterfall of Wishing ' ,
' Capacity Upgrade ' ,
' Dam ' ]
Bomb_Shop_Single_Cave_Doors = [ ' East Dark World Hint ' ,
' Palace of Darkness Hint ' ,
' Dark Lake Hylia Fairy ' ,
' Dark Lake Hylia Ledge Fairy ' ,
' Dark Lake Hylia Ledge Spike Cave ' ,
' Dark Lake Hylia Ledge Hint ' ,
' Dark Swamp Cave ' ,
' Bonk Fairy (Dark) ' ,
' Doorless Hut ' ,
' C-Shaped House ' ,
' Chest Game ' ,
' Dark World Hammer Peg Cave ' ,
' Red Shield Shop ' ,
' Dark Sanctuary Hint ' ,
' Fortune Teller (Dark) ' ,
' Dark World Shop ' ,
' Dark World Lumberjack Shop ' ,
' Dark World Potion Shop ' ,
' Archery Game ' ,
' Dark Desert Cave ' ,
' Dark Desert Hint ' ,
' Dark Desert Fairy ' ,
' Spike Cave ' ,
' Cave Shop (Dark Death Mountain) ' ,
' Dark Death Mountain Fairy ' ,
' Mimic Cave Mirror Spot ' ,
' Big Bomb Shop ' ,
' Dark Lake Hylia Shop ' ,
' Lumberjack House ' ,
' Lake Hylia Fortune Teller ' ,
' Kakariko Gamble Game ' ]
Single_Cave_Doors = [ ' Pyramid Fairy ' ]
Single_Cave_Targets = [ ' Thiefs Hut ' ,
' Bonk Fairy ' ,
' Healer Fairy ' ,
' Healer Fairy ' ,
' Healer Fairy ' ,
' Kings Grave ' ,
' Chicken House ' ,
' Aginahs Cave ' ,
' Sahasrahlas Hut ' ,
' Cave Shop ' ,
' Sick Kids House ' ,
' Lost Woods Gamble ' ,
' Fortune Teller (Light) ' ,
' Snitch Lady (East) ' ,
' Snitch Lady (West) ' ,
' Bush Covered House ' ,
' Tavern (Front) ' ,
' Light World Bomb Hut ' ,
' Kakariko Shop ' ,
' Cave South of Haunted Grove ' ,
' Graveyard Cave ' ,
' Desert Cave ' ,
' Lake Hylia Cave ' ,
' Long Fairy Cave ' ,
' Good Bee Cave ' ,
' 20 Rupee Cave ' ,
' 50 Rupee Cave ' ,
' Ice Cave ' ,
' Bonk Rock Cave ' ,
' Library ' ,
' Witch Hut ' ,
' Hookshot Fairy ' ,
' Waterfall of Wishing ' ,
' Capacity Upgrade ' ,
' Pyramid Fairy ' ,
' East Dark World Hint ' ,
' Palace of Darkness Hint ' ,
' Healer Fairy ' ,
' Healer Fairy ' ,
' Dark Lake Hylia Ledge Spike Cave ' ,
' Dark Lake Hylia Ledge Hint ' ,
' Dark Swamp Cave ' ,
' Bonk Fairy ' ,
' Doorless Hut ' ,
' C-Shaped House ' ,
' Chest Game ' ,
' Dark World Hammer Peg Cave ' ,
' Red Shield Shop ' ,
' Dark Sanctuary Hint ' ,
' Fortune Teller (Dark) ' ,
' Dark World Shop ' ,
' Dark World Shop ' ,
' Dark World Shop ' ,
' Archery Game ' ,
' Dark Desert Cave ' ,
' Dark Desert Hint ' ,
' Healer Fairy ' ,
' Spike Cave ' ,
' Cave Shop ' ,
' Healer Fairy ' ,
' Mimic Cave ' ,
' Dark World Shop ' ,
' Lumberjack House ' ,
' Fortune Teller (Light) ' ,
' Kakariko Gamble Game ' ]
2017-05-15 18:28:04 +00:00
# these are connections that cannot be shuffled and always exist. They link together separate parts of the world we need to divide into regions
2017-05-20 12:06:53 +00:00
mandatory_connections = [ ( ' Links House ' , ' Links House ' ) , # unshuffled. For now
( ' Links House Exit ' , ' Light World ' ) ,
2017-05-27 08:02:54 +00:00
( ' Lake Hylia Central Island Pier ' , ' Lake Hylia Central Island ' ) ,
( ' Lake Hylia Central Island Teleporter ' , ' Dark Lake Hylia Central Island ' ) ,
2017-05-20 12:06:53 +00:00
( ' Zoras River ' , ' Zoras River ' ) ,
2017-05-15 18:28:04 +00:00
( ' Kakariko Well (top to bottom) ' , ' Kakariko Well (bottom) ' ) ,
2017-05-20 12:06:53 +00:00
( ' Master Sword Meadow ' , ' Master Sword Meadow ' ) ,
2017-05-15 18:28:04 +00:00
( ' Hobo Bridge ' , ' Hobo Bridge ' ) ,
( ' Desert Palace East Wing ' , ' Desert Palace East ' ) ,
( ' Bat Cave Drop Ledge ' , ' Bat Cave Drop Ledge ' ) ,
( ' Bat Cave Door ' , ' Bat Cave (left) ' ) ,
( ' Thieves Forest Hideout (top to bottom) ' , ' Thieves Forest Hideout (bottom) ' ) ,
( ' Lumberjack Tree (top to bottom) ' , ' Lumberjack Tree (bottom) ' ) ,
( ' Desert Palace Stairs ' , ' Desert Palace Stairs ' ) ,
2017-05-20 12:06:53 +00:00
( ' Desert Palace Stairs Drop ' , ' Light World ' ) ,
2017-05-15 18:28:04 +00:00
( ' Desert Palace Entrance (North) Rocks ' , ' Desert Palace Entrance (North) Spot ' ) ,
2017-05-20 12:06:53 +00:00
( ' Desert Ledge Return Rocks ' , ' Desert Ledge ' ) ,
2017-05-16 19:23:47 +00:00
( ' Throne Room ' , ' Sewers (Dark) ' ) ,
( ' Sewers Door ' , ' Sewers ' ) ,
( ' Sanctuary Push Door ' , ' Sanctuary ' ) ,
( ' Sewer Drop ' , ' Sewers ' ) ,
( ' Sewers Back Door ' , ' Sewers (Dark) ' ) ,
2017-05-21 14:32:34 +00:00
( ' Agahnim 1 ' , ' Agahnim 1 ' ) ,
2017-05-15 18:28:04 +00:00
( ' Flute Spot 1 ' , ' Death Mountain ' ) ,
( ' Spectacle Rock Cave Drop ' , ' Spectacle Rock Cave (Bottom) ' ) ,
( ' Spectacle Rock Cave Peak Drop ' , ' Spectacle Rock Cave (Bottom) ' ) ,
2017-05-20 12:06:53 +00:00
( ' Death Mountain Return Ledge Drop ' , ' Light World ' ) ,
2017-05-15 18:28:04 +00:00
( ' Broken Bridge (West) ' , ' East Death Mountain (Bottom) ' ) ,
( ' Broken Bridge (East) ' , ' Death Mountain ' ) ,
( ' East Death Mountain Drop ' , ' East Death Mountain (Bottom) ' ) ,
2017-05-20 12:06:53 +00:00
( ' Spiral Cave Ledge Access ' , ' Spiral Cave Ledge ' ) ,
( ' Spiral Cave Ledge Drop ' , ' East Death Mountain (Bottom) ' ) ,
2017-05-15 18:28:04 +00:00
( ' Spiral Cave (top to bottom) ' , ' Spiral Cave (Bottom) ' ) ,
( ' East Death Mountain (Top) ' , ' East Death Mountain (Top) ' ) ,
( ' Death Mountain (Top) ' , ' Death Mountain (Top) ' ) ,
( ' Death Mountain Drop ' , ' Death Mountain ' ) ,
( ' Spectacle Rock Drop ' , ' Death Mountain (Top) ' ) ,
2017-05-20 12:06:53 +00:00
( ' Tower of Hera Small Key Door ' , ' Tower of Hera (Basement) ' ) ,
( ' Tower of Hera Big Key Door ' , ' Tower of Hera (Top) ' ) ,
2017-05-15 18:28:04 +00:00
( ' Top of Pyramid ' , ' East Dark World ' ) ,
( ' Dark Lake Hylia Drop (East) ' , ' Dark Lake Hylia ' ) ,
( ' Dark Lake Hylia Drop (South) ' , ' Dark Lake Hylia ' ) ,
2017-05-20 12:06:53 +00:00
( ' Dark Lake Hylia Teleporter ' , ' Dark Lake Hylia ' ) ,
( ' Dark Lake Hylia Ledge ' , ' Dark Lake Hylia Ledge ' ) ,
( ' Dark Lake Hylia Ledge Drop ' , ' Dark Lake Hylia ' ) ,
2017-05-15 18:28:04 +00:00
( ' East Dark World Pier ' , ' East Dark World ' ) ,
( ' Lake Hylia Island Mirror Spot ' , ' Lake Hylia Island ' ) ,
2017-05-27 08:02:54 +00:00
( ' Lake Hylia Central Island Mirror Spot ' , ' Lake Hylia Central Island ' ) ,
2017-05-15 18:28:04 +00:00
( ' Hyrule Castle Ledge Mirror Spot ' , ' Hyrule Castle Ledge ' ) ,
( ' South Dark World Bridge ' , ' South Dark World ' ) ,
( ' East Dark World Bridge ' , ' East Dark World ' ) ,
( ' Maze Race Mirror Spot ' , ' Maze Race Ledge ' ) ,
( ' Village of Outcasts Heavy Rock ' , ' West Dark World ' ) ,
( ' Village of Outcasts Drop ' , ' South Dark World ' ) ,
( ' Bat Cave Drop Ledge Mirror Spot ' , ' Bat Cave Drop Ledge ' ) ,
( ' East Dark World River Pier ' , ' East Dark World ' ) ,
( ' West Dark World Gap ' , ' West Dark World ' ) ,
( ' Bumper Cave Ledge Drop ' , ' West Dark World ' ) ,
2017-05-20 12:06:53 +00:00
( ' Bumper Cave Ledge Mirror Spot ' , ' Death Mountain Return Ledge ' ) ,
2017-05-15 18:28:04 +00:00
( ' Skull Woods Forest ' , ' Skull Woods Forest ' ) ,
( ' Desert Ledge Mirror Spot ' , ' Desert Ledge ' ) ,
( ' Desert Ledge (West) Mirror Spot ' , ' Desert Ledge (West) ' ) ,
( ' Desert Palace Entrance (North) Mirror Spot ' , ' Desert Palace Entrance (North) Spot ' ) ,
( ' Dark Desert Teleporter ' , ' Dark Desert ' ) ,
( ' Desert Palace Stairs Mirror Spot ' , ' Desert Palace Stairs ' ) ,
( ' East Hyrule Teleporter ' , ' East Dark World ' ) ,
( ' South Hyrule Teleporter ' , ' South Dark World ' ) ,
( ' Kakariko Teleporter ' , ' West Dark World ' ) ,
( ' Death Mountain Teleporter ' , ' Dark Death Mountain (West Bottom) ' ) ,
2017-05-20 12:06:53 +00:00
( ' Death Mountain Climb Push Block Reverse ' , ' Death Mountain Climb Cave Chest Area ' ) ,
( ' Death Mountain Climb Push Block ' , ' Death Mountain Climb Cave Front ' ) ,
( ' Death Mountain Climb Bomb Jump ' , ' Death Mountain Climb Cave ' ) ,
( ' Death Mountain Climb Drop ' , ' Death Mountain Climb Cave Chest Area ' ) ,
( ' Death Mountain Fairy Drop Area Rocks ' , ' Death Mountain Fairy Drop Area ' ) ,
( ' Death Mountain Fairy Drop Area Mirror Spot ' , ' Death Mountain Fairy Drop Area ' ) ,
( ' Death Mountain Fairy Drop Area Drop ' , ' East Death Mountain (Bottom) ' ) ,
( ' Death Mountain Fairy Drop Ledge Drop ' , ' Death Mountain Fairy Drop Area ' ) ,
( ' Death Mountain Fairy Drop Ledge ' , ' Death Mountain Fairy Drop Ledge ' ) ,
2017-05-15 18:28:04 +00:00
( ' Spectacle Rock Mirror Spot ' , ' Spectacle Rock ' ) ,
( ' Dark Death Mountain Drop (East) ' , ' Dark Death Mountain (East Bottom) ' ) ,
( ' Dark Death Mountain Drop (West) ' , ' Dark Death Mountain (West Bottom) ' ) ,
( ' East Death Mountain (Top) Mirror Spot ' , ' East Death Mountain (Top) ' ) ,
( ' Turtle Rock Teleporter ' , ' Turtle Rock (Top) ' ) ,
2017-05-21 14:05:55 +00:00
( ' Turtle Rock Open Skull ' , ' Turtle Rock Skull ' ) ,
( ' Turtle Rock Skull Reverse ' , ' Dark Death Mountain (Top) ' ) ,
( ' Turtle Rock Skull Mirror Spot ' , ' Turtle Rock (Top) ' ) ,
2017-05-15 18:28:04 +00:00
( ' Turtle Rock Drop ' , ' Dark Death Mountain (Top) ' ) ,
( ' Floating Island Drop ' , ' Dark Death Mountain (Top) ' ) ,
( ' East Death Mountain Teleporter ' , ' Dark Death Mountain (East Bottom) ' ) ,
2017-05-20 12:06:53 +00:00
( ' Isolated Ledge Mirror Spot ' , ' Death Mountain Fairy Drop Ledge ' ) ,
( ' Spiral Cave Mirror Spot ' , ' Spiral Cave Ledge ' ) ,
2017-05-15 18:28:04 +00:00
2017-05-22 17:52:50 +00:00
( ' Palace of Darkness Pay Kiki ' , ' Palace of Darkness Kiki Door ' ) ,
( ' Palace of Darkness Kiki Door Reverse ' , ' East Dark World ' ) ,
2017-05-15 18:28:04 +00:00
( ' Swamp Palace Moat ' , ' Swamp Palace (First Room) ' ) ,
( ' Swamp Palace Small Key Door ' , ' Swamp Palace (Starting Area) ' ) ,
( ' Swamp Palace (Center) ' , ' Swamp Palace (Center) ' ) ,
( ' Swamp Palace (North) ' , ' Swamp Palace (North) ' ) ,
( ' Thieves Town Big Key Door ' , ' Thieves Town (Deep) ' ) ,
2017-05-20 12:06:53 +00:00
( ' Skull Woods Torch Room ' , ' Skull Woods Final Section (Mothula) ' ) ,
2017-05-21 14:05:55 +00:00
( ' Skull Woods Burn Skull ' , ' Skull Woods Skull ' ) ,
( ' Skull Woods Skull Reverse ' , ' Skull Woods Forest (West) ' ) ,
2017-05-21 22:07:26 +00:00
( ' Skull Woods First Section (Right) ' , ' Skull Woods First Section ' ) , # exist only for unique hole reference points
( ' Skull Woods First Section (Left) ' , ' Skull Woods First Section ' ) ,
( ' Skull Woods First Section (Top) ' , ' Skull Woods First Section ' ) ,
2017-05-15 18:28:04 +00:00
( ' Blind Fight ' , ' Blind Fight ' ) ,
( ' Ice Palace Entrance Room ' , ' Ice Palace (Main) ' ) ,
( ' Ice Palace (East) ' , ' Ice Palace (East) ' ) ,
( ' Ice Palace (East Top) ' , ' Ice Palace (East Top) ' ) ,
( ' Ice Palace (Kholdstare) ' , ' Ice Palace (Kholdstare) ' ) ,
( ' Misery Mire Entrance Gap ' , ' Misery Mire (Main) ' ) ,
( ' Misery Mire (West) ' , ' Misery Mire (West) ' ) ,
( ' Misery Mire Big Key Door ' , ' Misery Mire (Final Area) ' ) ,
( ' Misery Mire (Vitreous) ' , ' Misery Mire (Vitreous) ' ) ,
( ' Turtle Rock Entrance Gap ' , ' Turtle Rock (First Section) ' ) ,
2017-05-20 12:06:53 +00:00
( ' Turtle Rock Entrance Gap Reverse ' , ' Turtle Rock (Entrance) ' ) ,
2017-05-15 18:28:04 +00:00
( ' Turtle Rock Pokey Room ' , ' Turtle Rock (Chain Chomp Room) ' ) ,
( ' Turtle Rock (Chain Chomp Room) (North) ' , ' Turtle Rock (Second Section) ' ) ,
( ' Turtle Rock (Chain Chomp Room) (South) ' , ' Turtle Rock (First Section) ' ) ,
( ' Turtle Rock Chain Chomp Staircase ' , ' Turtle Rock (Chain Chomp Room) ' ) ,
( ' Turtle Rock (Big Chest) (North) ' , ' Turtle Rock (Second Section) ' ) ,
( ' Turtle Rock Big Key Door ' , ' Turtle Rock (Roller Switch Room) ' ) ,
( ' Turtle Rock Dark Room Staircase ' , ' Turtle Rock (Dark Room) ' ) ,
( ' Turtle Rock (Dark Room) (North) ' , ' Turtle Rock (Roller Switch Room) ' ) ,
( ' Turtle Rock (Dark Room) (South) ' , ' Turtle Rock (Eye Bridge) ' ) ,
( ' Turtle Rock Dark Room (South) ' , ' Turtle Rock (Dark Room) ' ) ,
( ' Turtle Rock (Trinexx) ' , ' Turtle Rock (Trinexx) ' ) ,
( ' Dark Palace Bridge Room ' , ' Dark Palace (Center) ' ) ,
( ' Dark Palace Bonk Wall ' , ' Dark Palace (Bonk Section) ' ) ,
( ' Dark Palace Big Key Chest Staircase ' , ' Dark Palace (Big Key Chest) ' ) ,
( ' Dark Palace (North) ' , ' Dark Palace (North) ' ) ,
( ' Dark Palace Big Key Door ' , ' Dark Palace (Final Section) ' ) ,
( ' Dark Palace Hammer Peg Drop ' , ' Dark Palace (Center) ' ) ,
( ' Dark Palace Spike Statue Room Door ' , ' Dark Palace (Spike Statue Room) ' ) ,
( ' Dark Palace Maze Door ' , ' Dark Palace (Maze) ' ) ,
2017-05-20 12:06:53 +00:00
( ' Ganons Tower ' , ' Ganons Tower (Entrance) ' ) , # not shuffled, for now
( ' Ganons Tower Exit ' , ' Dark Death Mountain (Top) ' ) ,
2017-05-15 18:28:04 +00:00
( ' Ganons Tower (Tile Room) ' , ' Ganons Tower (Tile Room) ' ) ,
( ' Ganons Tower (Tile Room) Key Door ' , ' Ganons Tower (Compass Room) ' ) ,
( ' Ganons Tower (Bottom) (East) ' , ' Ganons Tower (Bottom) ' ) ,
( ' Ganons Tower (Hookshot Room) ' , ' Ganons Tower (Hookshot Room) ' ) ,
( ' Ganons Tower (Map Room) ' , ' Ganons Tower (Map Room) ' ) ,
( ' Ganons Tower (Double Switch Room) ' , ' Ganons Tower (Firesnake Room) ' ) ,
( ' Ganons Tower (Firesnake Room) ' , ' Ganons Tower (Teleport Room) ' ) ,
( ' Ganons Tower (Bottom) (West) ' , ' Ganons Tower (Bottom) ' ) ,
( ' Ganons Tower Big Key Door ' , ' Ganons Tower (Top) ' ) ,
( ' Ganons Tower Torch Rooms ' , ' Ganons Tower (Before Moldorm) ' ) ,
( ' Ganons Tower Moldorm Door ' , ' Ganons Tower (Moldorm) ' ) ,
2017-05-21 14:32:34 +00:00
( ' Ganons Tower Moldorm Gap ' , ' Agahnim 2 ' ) ,
2017-05-20 12:06:53 +00:00
( ' Pyramid Hole ' , ' Pyramid ' ) # not shuffled, for now
2017-05-15 18:28:04 +00:00
]
# non-shuffled entrance links
2017-05-20 12:06:53 +00:00
default_connections = [ ( ' Waterfall of Wishing ' , ' Waterfall of Wishing ' ) ,
( " Thiefs Hut " , " Thiefs Hut " ) ,
( ' Dam ' , ' Dam ' ) ,
( ' Lumberjack House ' , ' Lumberjack House ' ) ,
2017-05-15 18:28:04 +00:00
( " Hyrule Castle Secret Entrance Drop " , " Hyrule Castle Secret Entrance " ) ,
( " Hyrule Castle Secret Entrance Stairs " , " Hyrule Castle Secret Entrance " ) ,
2017-05-20 12:06:53 +00:00
( " Hyrule Castle Secret Entrance Exit " , " Light World " ) ,
( ' Bonk Fairy (Light) ' , ' Bonk Fairy ' ) ,
( ' Lake Hylia Fairy ' , ' Healer Fairy ' ) ,
( ' Lake Hylia Fortune Teller ' , ' Fortune Teller (Light) ' ) ,
( ' Swamp Fairy ' , ' Healer Fairy ' ) ,
( ' Desert Fairy ' , ' Healer Fairy ' ) ,
2017-05-15 18:28:04 +00:00
( ' Kings Grave ' , ' Kings Grave ' ) ,
( ' Tavern North ' , ' Tavern ' ) ,
( ' Chicken House ' , ' Chicken House ' ) ,
( ' Aginahs Cave ' , ' Aginahs Cave ' ) ,
( ' Sahasrahlas Hut ' , ' Sahasrahlas Hut ' ) ,
2017-05-20 12:06:53 +00:00
( ' Cave Shop (Lake Hylia) ' , ' Cave Shop ' ) ,
( ' Capacity Upgrade ' , ' Capacity Upgrade ' ) ,
2017-05-15 18:28:04 +00:00
( ' Kakariko Well Drop ' , ' Kakariko Well (top) ' ) ,
( ' Kakariko Well Cave ' , ' Kakariko Well (bottom) ' ) ,
2017-05-20 12:06:53 +00:00
( ' Kakariko Well Exit ' , ' Light World ' ) ,
2017-05-15 18:28:04 +00:00
( ' Blacksmiths Hut ' , ' Blacksmiths Hut ' ) ,
( ' Bat Cave Drop ' , ' Bat Cave (right) ' ) ,
( ' Bat Cave Cave ' , ' Bat Cave (left) ' ) ,
2017-05-20 12:06:53 +00:00
( ' Bat Cave Exit ' , ' Light World ' ) ,
2017-05-15 18:28:04 +00:00
( ' Sick Kids House ' , ' Sick Kids House ' ) ,
2017-05-20 12:06:53 +00:00
( ' Elder House (East) ' , ' Elder House ' ) ,
( ' Elder House (West) ' , ' Elder House ' ) ,
( ' Elder House Exit (East) ' , ' Light World ' ) ,
( ' Elder House Exit (West) ' , ' Light World ' ) ,
( ' North Fairy Cave Drop ' , ' North Fairy Cave ' ) ,
( ' North Fairy Cave ' , ' North Fairy Cave ' ) ,
( ' North Fairy Cave Exit ' , ' Light World ' ) ,
( ' Lost Woods Gamble ' , ' Lost Woods Gamble ' ) ,
( ' Fortune Teller (Light) ' , ' Fortune Teller (Light) ' ) ,
( ' Snitch Lady (East) ' , ' Snitch Lady (East) ' ) ,
( ' Snitch Lady (West) ' , ' Snitch Lady (West) ' ) ,
( ' Bush Covered House ' , ' Bush Covered House ' ) ,
( ' Tavern (Front) ' , ' Tavern (Front) ' ) ,
( ' Light World Bomb Hut ' , ' Light World Bomb Hut ' ) ,
( ' Kakariko Shop ' , ' Kakariko Shop ' ) ,
2017-05-15 18:28:04 +00:00
( ' Thieves Forest Hideout Drop ' , ' Thieves Forest Hideout (top) ' ) ,
( ' Thieves Forest Hideout Stump ' , ' Thieves Forest Hideout (bottom) ' ) ,
2017-05-20 12:06:53 +00:00
( ' Thieves Forest Hideout Exit ' , ' Light World ' ) ,
2017-05-15 18:28:04 +00:00
( ' Lumberjack Tree Tree ' , ' Lumberjack Tree (top) ' ) ,
( ' Lumberjack Tree Cave ' , ' Lumberjack Tree (bottom) ' ) ,
2017-05-20 12:06:53 +00:00
( ' Lumberjack Tree Exit ' , ' Light World ' ) ,
2017-05-15 18:28:04 +00:00
( ' Cave South of Haunted Grove ' , ' Cave South of Haunted Grove ' ) ,
( ' Graveyard Cave ' , ' Graveyard Cave ' ) ,
( ' Desert Cave ' , ' Desert Cave ' ) ,
( ' Lake Hylia Cave ' , ' Lake Hylia Cave ' ) ,
2017-05-20 12:06:53 +00:00
( ' Long Fairy Cave ' , ' Long Fairy Cave ' ) , # near East Light World Teleporter
( ' Good Bee Cave ' , ' Good Bee Cave ' ) ,
( ' 20 Rupee Cave ' , ' 20 Rupee Cave ' ) ,
( ' 50 Rupee Cave ' , ' 50 Rupee Cave ' ) ,
2017-05-15 18:28:04 +00:00
( ' Ice Cave ' , ' Ice Cave ' ) ,
( ' Bonk Rock Cave ' , ' Bonk Rock Cave ' ) ,
( ' Library ' , ' Library ' ) ,
2017-05-20 12:06:53 +00:00
( ' Kakariko Gamble Game ' , ' Kakariko Gamble Game ' ) ,
2017-05-15 18:28:04 +00:00
( ' Witch Hut ' , ' Witch Hut ' ) ,
2017-05-20 12:06:53 +00:00
( ' Two Brothers House (East) ' , ' Two Brothers House ' ) ,
( ' Two Brothers House (West) ' , ' Two Brothers House ' ) ,
( ' Two Brothers House Exit (East) ' , ' Light World ' ) ,
( ' Two Brothers House Exit (West) ' , ' Maze Race Ledge ' ) ,
2017-05-16 19:23:47 +00:00
( ' Sanctuary ' , ' Sanctuary ' ) ,
( ' Sanctuary Grave ' , ' Sewer Drop ' ) ,
( ' Sanctuary Exit ' , ' Light World ' ) ,
2017-05-15 18:28:04 +00:00
( ' Old Man Cave (West) ' , ' Old Man Cave ' ) ,
( ' Old Man Cave (East) ' , ' Old Man Cave ' ) ,
2017-05-20 12:06:53 +00:00
( ' Old Man Cave Exit (West) ' , ' Death Mountain ' ) ,
( ' Old Man Cave Exit (East) ' , ' Light World ' ) ,
( ' Old Man House (Bottom) ' , ' Old Man House ' ) ,
( ' Old Man House Exit (Bottom) ' , ' Death Mountain ' ) ,
2017-05-20 13:47:28 +00:00
( ' Old Man House (Top) ' , ' Old Man House Back ' ) ,
2017-05-20 12:06:53 +00:00
( ' Old Man House Exit (Top) ' , ' Death Mountain ' ) ,
( ' Death Mountain Return Cave (East) ' , ' Death Mountain Return Cave ' ) ,
( ' Death Mountain Return Cave (West) ' , ' Death Mountain Return Cave ' ) ,
( ' Death Mountain Return Cave Exit (West) ' , ' Death Mountain Return Ledge ' ) ,
2017-05-15 18:28:04 +00:00
( ' Death Mountain Return Cave Exit (East) ' , ' Death Mountain ' ) ,
( ' Spectacle Rock Cave Peak ' , ' Spectacle Rock Cave (Peak) ' ) ,
2017-05-21 01:00:08 +00:00
( ' Spectacle Rock Cave (Bottom) ' , ' Spectacle Rock Cave (Bottom) ' ) ,
2017-05-15 18:28:04 +00:00
( ' Spectacle Rock Cave ' , ' Spectacle Rock Cave (Top) ' ) ,
( ' Spectacle Rock Cave Exit ' , ' Death Mountain ' ) ,
2017-05-20 12:06:53 +00:00
( ' Spectacle Rock Cave Exit (Top) ' , ' Death Mountain ' ) ,
( ' Spectacle Rock Cave Exit (Peak) ' , ' Death Mountain ' ) ,
( ' Death Mountain Climb (Bottom) ' , ' Death Mountain Climb Cave Front ' ) ,
( ' Death Mountain Climb (Middle) ' , ' Death Mountain Climb Cave ' ) ,
2017-05-15 18:28:04 +00:00
( ' Death Mountain Climb (Top) ' , ' Death Mountain Climb Cave ' ) ,
( ' Death Mountain Climb Exit (Bottom) ' , ' East Death Mountain (Bottom) ' ) ,
2017-05-20 12:06:53 +00:00
( ' Death Mountain Climb Exit (Middle) ' , ' East Death Mountain (Bottom) ' ) ,
2017-05-15 18:28:04 +00:00
( ' Death Mountain Climb Exit (Top) ' , ' East Death Mountain (Top) ' ) ,
2017-05-20 12:06:53 +00:00
( ' Hookshot Fairy ' , ' Hookshot Fairy ' ) ,
( ' Death Mountain Fairy Drop Cave (Bottom) ' , ' Death Mountain Fairy Drop Cave ' ) ,
( ' Death Mountain Fairy Drop Cave (Top) ' , ' Death Mountain Fairy Drop Cave ' ) ,
( ' Death Mountain Fairy Drop Cave Exit (Bottom) ' , ' Death Mountain Fairy Drop Area ' ) ,
( ' Death Mountain Fairy Drop Cave Exit (Top) ' , ' Death Mountain Fairy Drop Ledge ' ) ,
2017-05-15 18:28:04 +00:00
( ' Spiral Cave ' , ' Spiral Cave (Top) ' ) ,
2017-05-20 12:06:53 +00:00
( ' Spiral Cave (Bottom) ' , ' Spiral Cave (Bottom) ' ) ,
2017-05-15 18:28:04 +00:00
( ' Spiral Cave Exit ' , ' East Death Mountain (Bottom) ' ) ,
2017-05-20 12:06:53 +00:00
( ' Spiral Cave Exit (Top) ' , ' Spiral Cave Ledge ' ) ,
2017-05-15 18:28:04 +00:00
( ' Pyramid Fairy ' , ' Pyramid Fairy ' ) ,
2017-05-20 12:06:53 +00:00
( ' East Dark World Hint ' , ' East Dark World Hint ' ) ,
( ' Palace of Darkness Hint ' , ' Palace of Darkness Hint ' ) ,
( ' Big Bomb Shop ' , ' Big Bomb Shop ' ) ,
( ' Dark Lake Hylia Shop ' , ' Dark World Shop ' ) ,
( ' Dark Lake Hylia Fairy ' , ' Healer Fairy ' ) ,
( ' Dark Lake Hylia Ledge Fairy ' , ' Healer Fairy ' ) ,
( ' Dark Lake Hylia Ledge Spike Cave ' , ' Dark Lake Hylia Ledge Spike Cave ' ) ,
( ' Dark Lake Hylia Ledge Hint ' , ' Dark Lake Hylia Ledge Hint ' ) ,
2017-05-15 18:28:04 +00:00
( ' Dark Swamp Cave ' , ' Dark Swamp Cave ' ) ,
2017-05-20 12:06:53 +00:00
( ' Bonk Fairy (Dark) ' , ' Bonk Fairy ' ) ,
2017-05-15 18:28:04 +00:00
( ' Doorless Hut ' , ' Doorless Hut ' ) ,
( ' C-Shaped House ' , ' C-Shaped House ' ) ,
( ' Chest Game ' , ' Chest Game ' ) ,
( ' Dark World Hammer Peg Cave ' , ' Dark World Hammer Peg Cave ' ) ,
2017-05-20 12:06:53 +00:00
( ' Bumper Cave (Bottom) ' , ' Bumper Cave ' ) ,
( ' Bumper Cave (Top) ' , ' Bumper Cave ' ) ,
( ' Red Shield Shop ' , ' Red Shield Shop ' ) ,
( ' Dark Sanctuary Hint ' , ' Dark Sanctuary Hint ' ) ,
( ' Fortune Teller (Dark) ' , ' Fortune Teller (Dark) ' ) ,
( ' Dark World Shop ' , ' Dark World Shop ' ) ,
( ' Dark World Lumberjack Shop ' , ' Dark World Shop ' ) ,
( ' Dark World Potion Shop ' , ' Dark World Shop ' ) ,
( ' Archery Game ' , ' Archery Game ' ) ,
( ' Bumper Cave Exit (Top) ' , ' Bumper Cave Ledge ' ) ,
( ' Bumper Cave Exit (Bottom) ' , ' West Dark World ' ) ,
2017-05-15 18:28:04 +00:00
( ' Dark Desert Cave ' , ' Dark Desert Cave ' ) ,
2017-05-20 12:06:53 +00:00
( ' Dark Desert Hint ' , ' Dark Desert Hint ' ) ,
( ' Dark Desert Fairy ' , ' Healer Fairy ' ) ,
2017-05-15 18:28:04 +00:00
( ' Spike Cave ' , ' Spike Cave ' ) ,
( ' Hookshot Cave ' , ' Hookshot Cave ' ) ,
( ' Dark Death Mountain Climb (Top) ' , ' Dark Death Mountain Climb ' ) ,
2017-05-20 12:06:53 +00:00
( ' Cave Shop (Dark Death Mountain) ' , ' Cave Shop ' ) ,
( ' Dark Death Mountain Fairy ' , ' Healer Fairy ' ) ,
2017-05-15 18:28:04 +00:00
( ' Dark Death Mountain Climb (Bottom) ' , ' Dark Death Mountain Climb ' ) ,
( ' Dark Death Mountain Climb Exit (Top) ' , ' Dark Death Mountain (Top) ' ) ,
( ' Dark Death Mountain Climb Exit (Bottom) ' , ' Dark Death Mountain (East Bottom) ' ) ,
( ' Hookshot Cave Exit (South) ' , ' Dark Death Mountain (Top) ' ) ,
( ' Hookshot Cave Exit (North) ' , ' Death Mountain Floating Island ' ) ,
2017-05-20 12:06:53 +00:00
( ' Hookshot Cave Back Entrance ' , ' Hookshot Cave ' ) ,
( ' Mimic Cave Mirror Spot ' , ' Mimic Cave ' )
2017-05-15 18:28:04 +00:00
]
2017-05-20 12:06:53 +00:00
# non shuffled dungeons
default_dungeon_connections = [ ( ' Desert Palace Entrance (South) ' , ' Desert Palace Main ' ) ,
( ' Desert Palace Entrance (West) ' , ' Desert Palace Main ' ) ,
( ' Desert Palace Entrance (North) ' , ' Desert Palace North ' ) ,
( ' Desert Palace Entrance (East) ' , ' Desert Palace Main ' ) ,
( ' Desert Palace Exit (South) ' , ' Desert Palace Stairs ' ) ,
( ' Desert Palace Exit (West) ' , ' Desert Ledge ' ) ,
( ' Desert Palace Exit (East) ' , ' Desert Palace Lone Stairs ' ) ,
( ' Desert Palace Exit (North) ' , ' Desert Palace Entrance (North) Spot ' ) ,
( ' Eastern Palace ' , ' Eastern Palace ' ) ,
( ' Eastern Palace Exit ' , ' Light World ' ) ,
( ' Tower of Hera ' , ' Tower of Hera (Bottom) ' ) ,
( ' Tower of Hera Exit ' , ' Death Mountain (Top) ' ) ,
( ' Hyrule Castle Entrance (South) ' , ' Hyrule Castle ' ) ,
( ' Hyrule Castle Entrance (West) ' , ' Hyrule Castle ' ) ,
( ' Hyrule Castle Entrance (East) ' , ' Hyrule Castle ' ) ,
( ' Hyrule Castle Exit (South) ' , ' Light World ' ) ,
( ' Hyrule Castle Exit (West) ' , ' Hyrule Castle Ledge ' ) ,
( ' Hyrule Castle Exit (East) ' , ' Hyrule Castle Ledge ' ) ,
2017-05-21 14:32:34 +00:00
( ' Agahnims Tower ' , ' Agahnims Tower ' ) ,
( ' Agahnims Tower Exit ' , ' Hyrule Castle Ledge ' ) ,
2017-05-20 12:06:53 +00:00
( ' Thieves Town ' , ' Thieves Town (Entrance) ' ) ,
( ' Thieves Town Exit ' , ' West Dark World ' ) ,
( ' Skull Woods First Section Hole (East) ' , ' Skull Woods First Section (Right) ' ) ,
( ' Skull Woods First Section Hole (West) ' , ' Skull Woods First Section (Left) ' ) ,
( ' Skull Woods First Section Hole (North) ' , ' Skull Woods First Section (Top) ' ) ,
( ' Skull Woods First Section Door ' , ' Skull Woods First Section ' ) ,
( ' Skull Woods First Section Exit ' , ' Skull Woods Forest ' ) ,
( ' Skull Woods Second Section Hole ' , ' Skull Woods Second Section ' ) ,
( ' Skull Woods Second Section Door (East) ' , ' Skull Woods Second Section ' ) ,
( ' Skull Woods Second Section Door (West) ' , ' Skull Woods Second Section ' ) ,
( ' Skull Woods Second Section Exit (East) ' , ' Skull Woods Forest ' ) ,
2017-05-21 14:05:55 +00:00
( ' Skull Woods Second Section Exit (West) ' , ' Skull Woods Forest (West) ' ) ,
2017-05-20 12:06:53 +00:00
( ' Skull Woods Final Section ' , ' Skull Woods Final Section (Entrance) ' ) ,
2017-05-21 14:05:55 +00:00
( ' Skull Woods Final Section Exit ' , ' Skull Woods Skull ' ) ,
2017-05-20 12:06:53 +00:00
( ' Ice Palace ' , ' Ice Palace (Entrance) ' ) ,
2017-05-27 08:02:54 +00:00
( ' Ice Palace Exit ' , ' Dark Lake Hylia Central Island ' ) ,
2017-05-20 12:06:53 +00:00
( ' Misery Mire ' , ' Misery Mire (Entrance) ' ) ,
( ' Misery Mire Exit ' , ' Dark Desert ' ) ,
( ' Palace of Darkness ' , ' Dark Palace (Entrance) ' ) ,
( ' Dark Palace Exit ' , ' East Dark World ' ) ,
( ' Swamp Palace ' , ' Swamp Palace (Entrance) ' ) , # requires additional patch for flooding moat if moved
( ' Swamp Palace Exit ' , ' South Dark World ' ) ,
( ' Turtle Rock ' , ' Turtle Rock (Entrance) ' ) ,
( ' Turtle Rock Exit (Front) ' , ' Dark Death Mountain (Top) ' ) ,
( ' Turtle Rock Ledge Exit (West) ' , ' Dark Death Mountain Ledge ' ) ,
( ' Turtle Rock Ledge Exit (East) ' , ' Dark Death Mountain Ledge ' ) ,
( ' Dark Death Mountain Ledge (West) ' , ' Turtle Rock (Second Section) ' ) ,
( ' Dark Death Mountain Ledge (East) ' , ' Turtle Rock (Big Chest) ' ) ,
( ' Turtle Rock Isolated Ledge Exit ' , ' Dark Death Mountain Isolated Ledge ' ) ,
( ' Turtle Rock Isolated Ledge Entrance ' , ' Turtle Rock (Eye Bridge) ' )
]
# ToDo somehow merge this with creation of the locations
door_addresses = { ' Desert Palace Entrance (South) ' : ( 0xDBB7B , 0x15B02 ) ,
' Desert Palace Entrance (West) ' : ( 0xDBB7D , 0x15B06 ) ,
' Desert Palace Entrance (North) ' : ( 0xDBB7E , 0x15B08 ) ,
' Desert Palace Entrance (East) ' : ( 0xDBB7C , 0x15B04 ) ,
' Eastern Palace ' : ( 0xDBB7A , 0x15B00 ) ,
' Tower of Hera ' : ( 0xDBBA5 , 0x15B48 ) ,
' Hyrule Castle Entrance (South) ' : ( 0xDBB76 , 0x15AF4 ) ,
' Hyrule Castle Entrance (West) ' : ( 0xDBB75 , 0x15AF2 ) ,
' Hyrule Castle Entrance (East) ' : ( 0xDBB77 , 0x15AF6 ) ,
2017-05-21 14:32:34 +00:00
' Agahnims Tower ' : ( 0xDBB96 , 0x15B38 ) ,
2017-05-20 12:06:53 +00:00
' Thieves Town ' : ( 0xDBBA6 , 0x15B58 ) ,
' Skull Woods First Section Door ' : ( 0xDBB9C , 0x15B44 ) ,
' Skull Woods Second Section Door (East) ' : ( 0xDBB9B , 0x15B42 ) ,
' Skull Woods Second Section Door (West) ' : ( 0xDBB9A , 0x15B40 ) ,
' Skull Woods Final Section ' : ( 0xDBB9D , 0x15B46 ) ,
' Ice Palace ' : ( 0xDBB9F , 0x15B4A ) ,
' Misery Mire ' : ( 0xDBB99 , 0x15B3E ) ,
' Palace of Darkness ' : ( 0xDBB98 , 0x15B3C ) ,
' Swamp Palace ' : ( 0xDBB97 , 0x15B3A ) ,
' Turtle Rock ' : ( 0xDBBA7 , 0x15B56 ) ,
' Dark Death Mountain Ledge (West) ' : ( 0xDBB87 , 0x15B1A ) ,
' Dark Death Mountain Ledge (East) ' : ( 0xDBB8B , 0x15B22 ) ,
' Turtle Rock Isolated Ledge Entrance ' : ( 0xDBB8A , 0x15B20 ) ,
' Hyrule Castle Secret Entrance Stairs ' : ( 0xDBBA4 , 0x15B54 ) ,
' Kakariko Well Cave ' : ( 0xDBBAB , 0x15B62 ) ,
' Bat Cave Cave ' : ( 0xDBB83 , 0x15B12 ) ,
' Elder House (East) ' : ( 0xDBB80 , 0x15B0C ) ,
' Elder House (West) ' : ( 0xDBB7F , 0x15B0A ) ,
' North Fairy Cave ' : ( 0xDBBAA , 0x15B60 ) ,
' Thieves Forest Hideout Stump ' : ( 0xDBB9E , 0x15B5A ) ,
' Lumberjack Tree Cave ' : ( 0xDBB84 , 0x15B14 ) ,
' Two Brothers House (East) ' : ( 0xDBB82 , 0x15B10 ) ,
' Two Brothers House (West) ' : ( 0xDBB81 , 0x15B0E ) ,
' Sanctuary ' : ( 0xDBB74 , 0x15AF0 ) ,
' Old Man Cave (West) ' : ( 0xDBB78 , 0x15AFC ) ,
' Old Man Cave (East) ' : ( 0xDBB79 , 0x15AFE ) ,
' Old Man House (Bottom) ' : ( 0xDBBA2 , 0x15B50 ) ,
' Old Man House (Top) ' : ( 0xDBBA3 , 0x15B52 ) ,
' Death Mountain Return Cave (East) ' : ( 0xDBBA1 , 0x15B4E ) ,
' Death Mountain Return Cave (West) ' : ( 0xDBBA0 , 0x15B4C ) ,
' Spectacle Rock Cave Peak ' : ( 0xDBB95 , 0x15B36 ) ,
' Spectacle Rock Cave ' : ( 0xDBB94 , 0x15B34 ) ,
' Spectacle Rock Cave (Bottom) ' : ( 0xDBB93 , 0x15B32 ) ,
' Death Mountain Climb (Bottom) ' : ( 0xDBB90 , 0x15B2C ) ,
' Death Mountain Climb (Middle) ' : ( 0xDBB91 , 0x15B2E ) ,
' Death Mountain Climb (Top) ' : ( 0xDBB92 , 0x15B30 ) ,
' Death Mountain Fairy Drop Cave (Bottom) ' : ( 0xDBB8C , 0x15B24 ) ,
' Death Mountain Fairy Drop Cave (Top) ' : ( 0xDBB8D , 0x15B26 ) ,
' Spiral Cave ' : ( 0xDBB8F , 0x15B2A ) ,
' Spiral Cave (Bottom) ' : ( 0xDBB8E , 0x15B28 ) ,
' Bumper Cave (Bottom) ' : ( 0xDBB88 , 0x15B1C ) ,
' Bumper Cave (Top) ' : ( 0xDBB89 , 0x15B1E ) ,
' Dark Death Mountain Climb (Top) ' : ( 0xDBB86 , 0x15B18 ) ,
' Dark Death Mountain Climb (Bottom) ' : ( 0xDBB85 , 0x15B16 ) ,
' Hookshot Cave ' : ( 0xDBBAC , 0x15B64 ) ,
' Hookshot Cave Back Entrance ' : ( 0xDBBAD , 0x15B66 ) }
exit_ids = { ' Desert Palace Exit (South) ' : ( 0x09 , 0x84 ) ,
' Desert Palace Exit (West) ' : ( 0x0B , 0x83 ) ,
' Desert Palace Exit (East) ' : ( 0x0A , 0x85 ) ,
' Desert Palace Exit (North) ' : ( 0x0C , 0x63 ) ,
' Eastern Palace Exit ' : ( 0x08 , 0xC9 ) ,
' Tower of Hera Exit ' : ( 0x33 , 0x77 ) ,
' Hyrule Castle Exit (South) ' : ( 0x04 , 0x61 ) ,
' Hyrule Castle Exit (West) ' : ( 0x03 , 0x60 ) ,
' Hyrule Castle Exit (East) ' : ( 0x05 , 0x62 ) ,
2017-05-21 14:32:34 +00:00
' Agahnims Tower Exit ' : ( 0x24 , 0xE0 ) ,
2017-05-20 12:06:53 +00:00
' Thieves Town Exit ' : ( 0x34 , 0xDB ) ,
' Skull Woods First Section Exit ' : ( 0x2A , 0x58 ) ,
' Skull Woods Second Section Exit (East) ' : ( 0x29 , 0x57 ) ,
' Skull Woods Second Section Exit (West) ' : ( 0x28 , 0x56 ) ,
' Skull Woods Final Section Exit ' : ( 0x2B , 0x59 ) ,
' Ice Palace Exit ' : ( 0x2D , 0x0E ) ,
' Misery Mire Exit ' : ( 0x27 , 0x98 ) ,
' Dark Palace Exit ' : ( 0x26 , 0x4A ) ,
' Swamp Palace Exit ' : ( 0x25 , 0x28 ) ,
' Turtle Rock Exit (Front) ' : ( 0x35 , 0xD6 ) ,
' Turtle Rock Ledge Exit (West) ' : ( 0x15 , 0x23 ) ,
' Turtle Rock Ledge Exit (East) ' : ( 0x19 , 0x24 ) ,
' Turtle Rock Isolated Ledge Exit ' : ( 0x18 , 0xD5 ) ,
' Hyrule Castle Secret Entrance Exit ' : ( 0x32 , 0x55 ) ,
' Kakariko Well Exit ' : ( 0x39 , 0x2F ) ,
' Bat Cave Exit ' : ( 0x11 , 0xE3 ) ,
' Elder House Exit (East) ' : ( 0x0E , 0xF3 ) ,
' Elder House Exit (West) ' : ( 0x0D , 0xF2 ) ,
' North Fairy Cave Exit ' : ( 0x38 , 0x08 ) ,
' Thieves Forest Hideout Exit ' : ( 0x2C , 0xE1 ) ,
' Lumberjack Tree Exit ' : ( 0x12 , 0xE2 ) ,
' Two Brothers House Exit (East) ' : ( 0x10 , 0xF5 ) ,
' Two Brothers House Exit (West) ' : ( 0x0F , 0xF4 ) ,
' Sanctuary Exit ' : ( 0x02 , 0x12 ) ,
' Old Man Cave Exit (East) ' : ( 0x07 , 0xF1 ) ,
' Old Man Cave Exit (West) ' : ( 0x06 , 0xF0 ) ,
' Old Man House Exit (Bottom) ' : ( 0x30 , 0xE4 ) ,
' Old Man House Exit (Top) ' : ( 0x31 , 0xE5 ) ,
' Death Mountain Return Cave Exit (West) ' : ( 0x2E , 0xE6 ) ,
' Death Mountain Return Cave Exit (East) ' : ( 0x2F , 0xE7 ) ,
' Spectacle Rock Cave Exit ' : ( 0x21 , 0xF9 ) ,
' Spectacle Rock Cave Exit (Top) ' : ( 0x22 , 0xFA ) ,
' Spectacle Rock Cave Exit (Peak) ' : ( 0x23 , 0xEA ) ,
' Death Mountain Climb Exit (Bottom) ' : ( 0x1E , 0xFF ) ,
' Death Mountain Climb Exit (Middle) ' : ( 0x1F , 0xEF ) ,
' Death Mountain Climb Exit (Top) ' : ( 0x20 , 0xDF ) ,
' Death Mountain Fairy Drop Cave Exit (Bottom) ' : ( 0x1A , 0xFD ) ,
' Death Mountain Fairy Drop Cave Exit (Top) ' : ( 0x1B , 0xED ) ,
' Spiral Cave Exit ' : ( 0x1C , 0xFE ) ,
' Spiral Cave Exit (Top) ' : ( 0x1D , 0xEE ) ,
' Bumper Cave Exit (Top) ' : ( 0x17 , 0xEB ) ,
' Bumper Cave Exit (Bottom) ' : ( 0x16 , 0xFB ) ,
2017-05-21 14:05:55 +00:00
' Dark Death Mountain Climb Exit (Top) ' : ( 0x14 , 0xE8 ) ,
' Dark Death Mountain Climb Exit (Bottom) ' : ( 0x13 , 0xF8 ) ,
2017-05-20 12:06:53 +00:00
' Hookshot Cave Exit (South) ' : ( 0x3A , 0x3C ) ,
' Hookshot Cave Exit (North) ' : ( 0x3B , 0x2C ) }
single_doors = { ' Skull Woods First Section Hole (East) ' : ( 0xDB84D , 0xDB84E ) ,
' Skull Woods First Section Hole (West) ' : ( 0xDB84F , 0xDB850 ) ,
' Skull Woods First Section Hole (North) ' : 0xDB84C ,
' Skull Woods Second Section Hole ' : ( 0xDB851 , 0xDB852 ) ,
' Waterfall of Wishing ' : 0xDBBCE ,
' Dam ' : 0xDBBC0 ,
' Thiefs Hut ' : 0xDBBD3 ,
' Hyrule Castle Secret Entrance Drop ' : 0xDB858 ,
' Bonk Fairy (Light) ' : 0xDBBE9 ,
' Lake Hylia Fairy ' : 0xDBBD0 ,
' Swamp Fairy ' : 0xDBBDE ,
' Desert Fairy ' : 0xDBBE4 ,
' Kings Grave ' : 0xDBBCD ,
' Tavern North ' : 0xDBBB5 , # do not use, buggy
' Chicken House ' : 0xDBBBD ,
' Aginahs Cave ' : 0xDBBE3 ,
' Sahasrahlas Hut ' : 0xDBBB7 ,
' Cave Shop (Lake Hylia) ' : 0xDBBCA ,
' Capacity Upgrade ' : 0xDBBCF ,
' Kakariko Well Drop ' : ( 0xDB85C , 0xDB85D ) ,
' Blacksmiths Hut ' : 0xDBBD6 ,
' Bat Cave Drop ' : ( 0xDB859 , 0xDB85A ) ,
' Sick Kids House ' : 0xDBBB2 ,
' North Fairy Cave Drop ' : 0xDB857 ,
' Lost Woods Gamble ' : 0xDBBAE ,
' Fortune Teller (Light) ' : 0xDBBD7 ,
' Snitch Lady (East) ' : 0xDBBB0 ,
' Snitch Lady (West) ' : 0xDBBB1 ,
' Bush Covered House ' : 0xDBBB6 ,
' Tavern (Front) ' : 0xDBBB4 ,
' Light World Bomb Hut ' : 0xDBBBC ,
' Kakariko Shop ' : 0xDBBB8 ,
' Thieves Forest Hideout Drop ' : 0xDB853 ,
' Lumberjack Tree Tree ' : 0xDB85B ,
' Cave South of Haunted Grove ' : 0xDBBC3 ,
' Graveyard Cave ' : 0xDBBC4 ,
' Desert Cave ' : 0xDBBF0 ,
' Lake Hylia Cave ' : 0xDBBEF ,
' Long Fairy Cave ' : 0xDBBC7 ,
' Good Bee Cave ' : 0xDBBDD ,
' 20 Rupee Cave ' : 0xDBBED ,
' 50 Rupee Cave ' : 0xDBBEB ,
' Ice Cave ' : 0xDBBF2 ,
' Bonk Rock Cave ' : 0xDBBEC ,
' Library ' : 0xDBBBB ,
' Witch Hut ' : 0xDBBBE ,
' Sanctuary Grave ' : 0xDB85E ,
' Hookshot Fairy ' : 0xDBBC2 ,
' Pyramid Fairy ' : 0xDBBD5 ,
' East Dark World Hint ' : 0xDBBDB ,
' Palace of Darkness Hint ' : 0xDBBDA ,
' Dark Lake Hylia Fairy ' : 0xDBBDF ,
' Dark Lake Hylia Ledge Fairy ' : 0xDBBF3 ,
' Dark Lake Hylia Ledge Spike Cave ' : 0xDBBEE ,
' Dark Lake Hylia Ledge Hint ' : 0xDBBDC ,
' Dark Swamp Cave ' : 0xDBBAF ,
' Bonk Fairy (Dark) ' : 0xDBBEA ,
' Doorless Hut ' : 0xDBBBA ,
' C-Shaped House ' : 0xDBBC6 ,
' Chest Game ' : 0xDBBB9 ,
' Dark World Hammer Peg Cave ' : 0xDBBF1 ,
' Red Shield Shop ' : 0xDBBE7 ,
' Dark Sanctuary Hint ' : 0xDBBCC ,
' Fortune Teller (Dark) ' : 0xDBBD8 ,
' Dark World Shop ' : 0xDBBD2 ,
' Dark World Lumberjack Shop ' : 0xDBBC9 ,
' Dark World Potion Shop ' : 0xDBBE1 ,
' Archery Game ' : 0xDBBCB ,
' Dark Desert Cave ' : 0xDBBD1 ,
' Dark Desert Hint ' : 0xDBBD4 ,
' Dark Desert Fairy ' : 0xDBBC8 ,
' Spike Cave ' : 0xDBBB3 ,
' Cave Shop (Dark Death Mountain) ' : 0xDBBE0 ,
' Dark Death Mountain Fairy ' : 0xDBBE2 ,
' Mimic Cave Mirror Spot ' : 0xDBBC1 ,
' Big Bomb Shop ' : 0xDBBC5 ,
' Dark Lake Hylia Shop ' : 0xDBBE6 ,
' Lumberjack House ' : 0xDBBE8 ,
' Lake Hylia Fortune Teller ' : 0xDBBE5 ,
' Kakariko Gamble Game ' : 0xDBBD9 }
cave_codes = { ' Waterfall of Wishing ' : 0x5C ,
' Dam ' : 0x4E ,
' Thiefs Hut ' : 0x61 ,
' Lumberjack House ' : 0x6B ,
' Bonk Fairy ' : 0x71 ,
' Healer Fairy ' : 0x5E ,
' Fortune Teller (Light) ' : 0x65 ,
' Kings Grave ' : 0x5B ,
' Tavern ' : 0x43 ,
' Chicken House ' : 0x4B ,
' Aginahs Cave ' : 0x4D ,
' Sahasrahlas Hut ' : 0x45 ,
' Cave Shop ' : 0x58 ,
' Capacity Upgrade ' : 0x5D ,
' Blacksmiths Hut ' : 0x64 ,
' Sick Kids House ' : 0x40 ,
' Lost Woods Gamble ' : 0x3C ,
' Snitch Lady (East) ' : 0x3E ,
' Snitch Lady (West) ' : 0x3F ,
' Bush Covered House ' : 0x44 ,
' Tavern (Front) ' : 0x42 ,
' Light World Bomb Hut ' : 0x4A ,
' Kakariko Shop ' : 0x46 ,
' Cave South of Haunted Grove ' : 0x51 ,
' Graveyard Cave ' : 0x52 ,
' Desert Cave ' : 0x72 ,
' Lake Hylia Cave ' : 0x6C ,
' Long Fairy Cave ' : 0x55 ,
' Good Bee Cave ' : 0x56 ,
' 20 Rupee Cave ' : 0x6F ,
' 50 Rupee Cave ' : 0x6D ,
' Ice Cave ' : 0x84 ,
' Bonk Rock Cave ' : 0x6E ,
' Library ' : 0x49 ,
' Kakariko Gamble Game ' : 0x67 ,
' Witch Hut ' : 0x4C ,
' Hookshot Fairy ' : 0x50 ,
' Pyramid Fairy ' : 0x63 ,
' East Dark World Hint ' : 0x69 ,
' Palace of Darkness Hint ' : 0x68 ,
' Big Bomb Shop ' : 0x53 ,
' Dark World Shop ' : 0x60 ,
' Dark Lake Hylia Ledge Spike Cave ' : 0x70 ,
' Dark Lake Hylia Ledge Hint ' : 0x6A ,
' Dark Swamp Cave ' : 0x3D ,
' Doorless Hut ' : 0x48 ,
' C-Shaped House ' : 0x54 ,
' Chest Game ' : 0x47 ,
' Dark World Hammer Peg Cave ' : 0x83 ,
' Red Shield Shop ' : 0x57 ,
' Dark Sanctuary Hint ' : 0x5A ,
' Fortune Teller (Dark) ' : 0x66 ,
' Archery Game ' : 0x59 ,
' Dark Desert Cave ' : 0x5F ,
' Dark Desert Hint ' : 0x62 ,
' Spike Cave ' : 0x41 ,
' Mimic Cave ' : 0x4F ,
' Kakariko Well (top) ' : 0x80 ,
' Hyrule Castle Secret Entrance ' : 0x7D ,
' Bat Cave (right) ' : 0x7E ,
' North Fairy Cave ' : 0x7C ,
' Thieves Forest Hideout (top) ' : 0x7A ,
' Lumberjack Tree (top) ' : 0x7F ,
' Sewer Drop ' : 0x81 ,
' Skull Woods Second Section ' : 0x79 ,
' Skull Woods First Section (Left) ' : 0x77 ,
' Skull Woods First Section (Right) ' : 0x78 ,
' Skull Woods First Section (Top) ' : 0x76 }