Improve handling of entrance addresses.
This commit is contained in:
parent
7949da8d07
commit
5bb8277ade
|
@ -397,6 +397,7 @@ class Entrance(object):
|
||||||
self.parent_region = parent
|
self.parent_region = parent
|
||||||
self.connected_region = None
|
self.connected_region = None
|
||||||
self.target = None
|
self.target = None
|
||||||
|
self.addresses = None
|
||||||
self.spot_type = 'Entrance'
|
self.spot_type = 'Entrance'
|
||||||
self.recursion_count = 0
|
self.recursion_count = 0
|
||||||
|
|
||||||
|
@ -409,9 +410,10 @@ class Entrance(object):
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def connect(self, region, target=None):
|
def connect(self, region, addresses=None, target=None):
|
||||||
self.connected_region = region
|
self.connected_region = region
|
||||||
self.target = target
|
self.target = target
|
||||||
|
self.addresses = addresses
|
||||||
region.entrances.append(self)
|
region.entrances.append(self)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
|
|
@ -109,16 +109,16 @@ def link_entrances(world):
|
||||||
# place blacksmith, has limited options
|
# place blacksmith, has limited options
|
||||||
random.shuffle(blacksmith_doors)
|
random.shuffle(blacksmith_doors)
|
||||||
blacksmith_hut = blacksmith_doors.pop()
|
blacksmith_hut = blacksmith_doors.pop()
|
||||||
ret.append(connect_one_way(world, blacksmith_hut, 'Blacksmiths Hut'))
|
ret.append(connect_entrance(world, blacksmith_hut, 'Blacksmiths Hut'))
|
||||||
bomb_shop_doors.extend(blacksmith_doors)
|
bomb_shop_doors.extend(blacksmith_doors)
|
||||||
|
|
||||||
# place dam and pyramid fairy, have limited options
|
# 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
|
# ToDo Dam might be behind fat fairy if we later check for this when placing crystal 5 and 6
|
||||||
random.shuffle(bomb_shop_doors)
|
random.shuffle(bomb_shop_doors)
|
||||||
bomb_shop = bomb_shop_doors.pop()
|
bomb_shop = bomb_shop_doors.pop()
|
||||||
ret.append(connect_one_way(world, bomb_shop, 'Big Bomb Shop'))
|
ret.append(connect_entrance(world, bomb_shop, 'Big Bomb Shop'))
|
||||||
dam = bomb_shop_doors.pop()
|
dam = bomb_shop_doors.pop()
|
||||||
ret.append(connect_one_way(world, dam, 'Dam'))
|
ret.append(connect_entrance(world, dam, 'Dam'))
|
||||||
single_doors.extend(bomb_shop_doors)
|
single_doors.extend(bomb_shop_doors)
|
||||||
|
|
||||||
# tavern back door cannot be shuffled yet
|
# tavern back door cannot be shuffled yet
|
||||||
|
@ -170,16 +170,16 @@ def link_entrances(world):
|
||||||
# place blacksmith, has limited options
|
# place blacksmith, has limited options
|
||||||
random.shuffle(blacksmith_doors)
|
random.shuffle(blacksmith_doors)
|
||||||
blacksmith_hut = blacksmith_doors.pop()
|
blacksmith_hut = blacksmith_doors.pop()
|
||||||
ret.append(connect_one_way(world, blacksmith_hut, 'Blacksmiths Hut'))
|
ret.append(connect_entrance(world, blacksmith_hut, 'Blacksmiths Hut'))
|
||||||
bomb_shop_doors.extend(blacksmith_doors)
|
bomb_shop_doors.extend(blacksmith_doors)
|
||||||
|
|
||||||
# place dam and pyramid fairy, have limited options
|
# 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
|
# ToDo Dam might be behind fat fairy if we later check for this when placing crystal 5 and 6
|
||||||
random.shuffle(bomb_shop_doors)
|
random.shuffle(bomb_shop_doors)
|
||||||
bomb_shop = bomb_shop_doors.pop()
|
bomb_shop = bomb_shop_doors.pop()
|
||||||
ret.append(connect_one_way(world, bomb_shop, 'Big Bomb Shop'))
|
ret.append(connect_entrance(world, bomb_shop, 'Big Bomb Shop'))
|
||||||
dam = bomb_shop_doors.pop()
|
dam = bomb_shop_doors.pop()
|
||||||
ret.append(connect_one_way(world, dam, 'Dam'))
|
ret.append(connect_entrance(world, dam, 'Dam'))
|
||||||
single_doors.extend(bomb_shop_doors)
|
single_doors.extend(bomb_shop_doors)
|
||||||
|
|
||||||
# tavern back door cannot be shuffled yet
|
# tavern back door cannot be shuffled yet
|
||||||
|
@ -245,16 +245,16 @@ def link_entrances(world):
|
||||||
# place blacksmith, has limited options
|
# place blacksmith, has limited options
|
||||||
random.shuffle(blacksmith_doors)
|
random.shuffle(blacksmith_doors)
|
||||||
blacksmith_hut = blacksmith_doors.pop()
|
blacksmith_hut = blacksmith_doors.pop()
|
||||||
ret.append(connect_one_way(world, blacksmith_hut, 'Blacksmiths Hut'))
|
ret.append(connect_entrance(world, blacksmith_hut, 'Blacksmiths Hut'))
|
||||||
bomb_shop_doors.extend(blacksmith_doors)
|
bomb_shop_doors.extend(blacksmith_doors)
|
||||||
|
|
||||||
# place dam and pyramid fairy, have limited options
|
# 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
|
# ToDo Dam might be behind fat fairy if we later check for this when placing crystal 5 and 6
|
||||||
random.shuffle(bomb_shop_doors)
|
random.shuffle(bomb_shop_doors)
|
||||||
bomb_shop = bomb_shop_doors.pop()
|
bomb_shop = bomb_shop_doors.pop()
|
||||||
ret.append(connect_one_way(world, bomb_shop, 'Big Bomb Shop'))
|
ret.append(connect_entrance(world, bomb_shop, 'Big Bomb Shop'))
|
||||||
dam = bomb_shop_doors.pop()
|
dam = bomb_shop_doors.pop()
|
||||||
ret.append(connect_one_way(world, dam, 'Dam'))
|
ret.append(connect_entrance(world, dam, 'Dam'))
|
||||||
single_doors.extend(bomb_shop_doors)
|
single_doors.extend(bomb_shop_doors)
|
||||||
|
|
||||||
# tavern back door cannot be shuffled yet
|
# tavern back door cannot be shuffled yet
|
||||||
|
@ -305,7 +305,7 @@ def link_entrances(world):
|
||||||
|
|
||||||
if world.mode == 'standard':
|
if world.mode == 'standard':
|
||||||
# cannot move uncle cave
|
# cannot move uncle cave
|
||||||
ret.append(connect_one_way(world, 'Hyrule Castle Secret Entrance Drop', 'Hyrule Castle Secret Entrance'))
|
ret.append(connect_entrance(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_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'))
|
ret.append(connect_entrance(world, lw_doors.pop(), 'Hyrule Castle Secret Entrance Exit'))
|
||||||
else:
|
else:
|
||||||
|
@ -326,22 +326,22 @@ def link_entrances(world):
|
||||||
sw_hole_pool = dw_hole_entrances
|
sw_hole_pool = dw_hole_entrances
|
||||||
mandatory_dark_world.append('Skull Woods First Section Exit')
|
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)']:
|
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))
|
ret.append(connect_entrance(world, sw_hole_pool.pop(), target))
|
||||||
|
|
||||||
# sanctuary has to be in light world
|
# sanctuary has to be in light world
|
||||||
ret.append(connect_one_way(world, lw_hole_entrances.pop(), 'Sewer Drop'))
|
ret.append(connect_entrance(world, lw_hole_entrances.pop(), 'Sewer Drop'))
|
||||||
mandatory_light_world.append('Sanctuary Exit')
|
mandatory_light_world.append('Sanctuary Exit')
|
||||||
|
|
||||||
# fill up remaining holes
|
# fill up remaining holes
|
||||||
for hole in dw_hole_entrances:
|
for hole in dw_hole_entrances:
|
||||||
exits, target = hole_targets.pop()
|
exits, target = hole_targets.pop()
|
||||||
mandatory_dark_world.append(exits)
|
mandatory_dark_world.append(exits)
|
||||||
ret.append(connect_one_way(world, hole, target))
|
ret.append(connect_entrance(world, hole, target))
|
||||||
|
|
||||||
for hole in lw_hole_entrances:
|
for hole in lw_hole_entrances:
|
||||||
exits, target = hole_targets.pop()
|
exits, target = hole_targets.pop()
|
||||||
mandatory_light_world.append(exits)
|
mandatory_light_world.append(exits)
|
||||||
ret.append(connect_one_way(world, hole, target))
|
ret.append(connect_entrance(world, hole, target))
|
||||||
|
|
||||||
# hyrule castle handling
|
# hyrule castle handling
|
||||||
if world.mode == 'standard':
|
if world.mode == 'standard':
|
||||||
|
@ -479,16 +479,16 @@ def link_entrances(world):
|
||||||
# place blacksmith, has limited options
|
# place blacksmith, has limited options
|
||||||
random.shuffle(blacksmith_doors)
|
random.shuffle(blacksmith_doors)
|
||||||
blacksmith_hut = blacksmith_doors.pop()
|
blacksmith_hut = blacksmith_doors.pop()
|
||||||
ret.append(connect_one_way(world, blacksmith_hut, 'Blacksmiths Hut'))
|
ret.append(connect_entrance(world, blacksmith_hut, 'Blacksmiths Hut'))
|
||||||
bomb_shop_doors.extend(blacksmith_doors)
|
bomb_shop_doors.extend(blacksmith_doors)
|
||||||
|
|
||||||
# place dam and pyramid fairy, have limited options
|
# 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
|
# ToDo Dam might be behind fat fairy if we later check for this when placing crystal 5 and 6
|
||||||
random.shuffle(bomb_shop_doors)
|
random.shuffle(bomb_shop_doors)
|
||||||
bomb_shop = bomb_shop_doors.pop()
|
bomb_shop = bomb_shop_doors.pop()
|
||||||
ret.append(connect_one_way(world, bomb_shop, 'Big Bomb Shop'))
|
ret.append(connect_entrance(world, bomb_shop, 'Big Bomb Shop'))
|
||||||
dam = bomb_shop_doors.pop()
|
dam = bomb_shop_doors.pop()
|
||||||
ret.append(connect_one_way(world, dam, 'Dam'))
|
ret.append(connect_entrance(world, dam, 'Dam'))
|
||||||
single_doors.extend(bomb_shop_doors)
|
single_doors.extend(bomb_shop_doors)
|
||||||
|
|
||||||
# tavern back door cannot be shuffled yet
|
# tavern back door cannot be shuffled yet
|
||||||
|
@ -524,7 +524,7 @@ def link_entrances(world):
|
||||||
|
|
||||||
if world.mode == 'standard':
|
if world.mode == 'standard':
|
||||||
# cannot move uncle cave
|
# cannot move uncle cave
|
||||||
ret.append(connect_one_way(world, 'Hyrule Castle Secret Entrance Drop', 'Hyrule Castle Secret Entrance'))
|
ret.append(connect_entrance(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_exit(world, 'Hyrule Castle Secret Entrance Exit', 'Hyrule Castle Secret Entrance Stairs'))
|
||||||
ret.append(connect_entrance(world, doors.pop(), 'Hyrule Castle Secret Entrance Exit'))
|
ret.append(connect_entrance(world, doors.pop(), 'Hyrule Castle Secret Entrance Exit'))
|
||||||
else:
|
else:
|
||||||
|
@ -539,7 +539,7 @@ def link_entrances(world):
|
||||||
|
|
||||||
# fill up holes
|
# fill up holes
|
||||||
for hole in hole_entrances:
|
for hole in hole_entrances:
|
||||||
ret.append(connect_one_way(world, hole, hole_targets.pop()))
|
ret.append(connect_entrance(world, hole, hole_targets.pop()))
|
||||||
|
|
||||||
# hyrule castle handling
|
# hyrule castle handling
|
||||||
if world.mode == 'standard':
|
if world.mode == 'standard':
|
||||||
|
@ -631,16 +631,16 @@ def link_entrances(world):
|
||||||
# place blacksmith, has limited options
|
# place blacksmith, has limited options
|
||||||
random.shuffle(blacksmith_doors)
|
random.shuffle(blacksmith_doors)
|
||||||
blacksmith_hut = blacksmith_doors.pop()
|
blacksmith_hut = blacksmith_doors.pop()
|
||||||
ret.append(connect_one_way(world, blacksmith_hut, 'Blacksmiths Hut'))
|
ret.append(connect_entrance(world, blacksmith_hut, 'Blacksmiths Hut'))
|
||||||
bomb_shop_doors.extend(blacksmith_doors)
|
bomb_shop_doors.extend(blacksmith_doors)
|
||||||
|
|
||||||
# place dam and pyramid fairy, have limited options
|
# 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
|
# ToDo Dam might be behind fat fairy if we later check for this when placing crystal 5 and 6
|
||||||
random.shuffle(bomb_shop_doors)
|
random.shuffle(bomb_shop_doors)
|
||||||
bomb_shop = bomb_shop_doors.pop()
|
bomb_shop = bomb_shop_doors.pop()
|
||||||
ret.append(connect_one_way(world, bomb_shop, 'Big Bomb Shop'))
|
ret.append(connect_entrance(world, bomb_shop, 'Big Bomb Shop'))
|
||||||
dam = bomb_shop_doors.pop()
|
dam = bomb_shop_doors.pop()
|
||||||
ret.append(connect_one_way(world, dam, 'Dam'))
|
ret.append(connect_entrance(world, dam, 'Dam'))
|
||||||
single_doors.extend(bomb_shop_doors)
|
single_doors.extend(bomb_shop_doors)
|
||||||
|
|
||||||
# tavern back door cannot be shuffled yet
|
# tavern back door cannot be shuffled yet
|
||||||
|
@ -657,17 +657,15 @@ def link_entrances(world):
|
||||||
ret.append('Fix to prevent Agahnim Softlock: Swap Contents of Turtle Rock Ledge (East) and Mimic Cave:')
|
ret.append('Fix to prevent Agahnim Softlock: Swap Contents of Turtle Rock Ledge (East) and Mimic Cave:')
|
||||||
|
|
||||||
mimic_cave_entrance = world.get_entrance('Mimic Cave Mirror Spot')
|
mimic_cave_entrance = world.get_entrance('Mimic Cave Mirror Spot')
|
||||||
mimic_cave_target = mimic_cave_entrance.connected_region
|
|
||||||
ddmle_entrance = world.get_entrance('Dark Death Mountain Ledge (East)')
|
ddmle_entrance = world.get_entrance('Dark Death Mountain Ledge (East)')
|
||||||
ddmle_entrance.connected_region = mimic_cave_target
|
|
||||||
mimic_cave_target.entrances.remove(mimic_cave_entrance)
|
|
||||||
mimic_cave_target.entrances.append(ddmle_entrance)
|
|
||||||
ret.append('Dark Death Mountain Ledge (East) => %s' % mimic_cave_target)
|
|
||||||
|
|
||||||
aga_tower = world.get_region('Agahnims Tower')
|
aga_tower = world.get_region('Agahnims Tower')
|
||||||
mimic_cave_entrance.connected_region = aga_tower
|
mimic_cave_target = mimic_cave_entrance.connected_region
|
||||||
|
mimic_cave_target.entrances.remove(mimic_cave_entrance)
|
||||||
aga_tower.entrances.remove(ddmle_entrance)
|
aga_tower.entrances.remove(ddmle_entrance)
|
||||||
aga_tower.entrances.append(mimic_cave_entrance)
|
|
||||||
|
ddmle_entrance.connect(mimic_cave_target, door_addresses['Dark Death Mountain Ledge (East)'][0], exit_ids[mimic_cave_target.name])
|
||||||
|
ret.append('Dark Death Mountain Ledge (East) => %s' % mimic_cave_target.name)
|
||||||
|
mimic_cave_entrance.connect(aga_tower, door_addresses['Mimic Cave Mirror Spot'], exit_ids['Agahnims Tower Exit'][0])
|
||||||
ret.append('Mimic Cave Mirror Spot => Agahnims Tower Exit')
|
ret.append('Mimic Cave Mirror Spot => Agahnims Tower Exit')
|
||||||
|
|
||||||
# check for swamp palace fix
|
# check for swamp palace fix
|
||||||
|
@ -681,36 +679,51 @@ def connect_simple(world, exitname, regionname):
|
||||||
world.get_entrance(exitname).connect(world.get_region(regionname))
|
world.get_entrance(exitname).connect(world.get_region(regionname))
|
||||||
|
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
|
|
||||||
def connect_entrance(world, entrancename, exitname):
|
def connect_entrance(world, entrancename, exitname):
|
||||||
entrance = world.get_entrance(entrancename)
|
entrance = world.get_entrance(entrancename)
|
||||||
|
# check if we got an entrance or a region to connect to
|
||||||
|
try:
|
||||||
|
region = world.get_region(exitname)
|
||||||
|
exit = None
|
||||||
|
except RuntimeError:
|
||||||
exit = world.get_entrance(exitname)
|
exit = world.get_entrance(exitname)
|
||||||
target = (exit_ids[exit.name][0], entrance.target[1] if entrance.target is not None else None)
|
region = exit.parent_region
|
||||||
entrance.connect(exit.parent_region, target)
|
|
||||||
return '%s => %s' % (entrance.name, exit.name)
|
# if this was already connected somewhere, remove the backreference
|
||||||
|
if entrance.connected_region is not None:
|
||||||
|
entrance.connected_region.entrances.remove(entrance)
|
||||||
|
|
||||||
|
target = exit_ids[exit.name][0] if exit is not None else exit_ids.get(region.name, None)
|
||||||
|
addresses = door_addresses[entrance.name][0] if exit is not None else door_addresses[entrance.name]
|
||||||
|
|
||||||
|
entrance.connect(region, addresses, target)
|
||||||
|
return '%s => %s' % (entrance.name, exit.name if exit is not None else region.name)
|
||||||
|
|
||||||
|
|
||||||
def connect_exit(world, exitname, entrancename):
|
def connect_exit(world, exitname, entrancename):
|
||||||
entrance = world.get_entrance(entrancename)
|
entrance = world.get_entrance(entrancename)
|
||||||
exit = world.get_entrance(exitname)
|
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
|
# if this was already connected somewhere, remove the backreference
|
||||||
exit.connect(entrance.parent_region)
|
if exit.connected_region is not None:
|
||||||
|
exit.connected_region.entrances.remove(exit)
|
||||||
|
|
||||||
|
exit.connect(entrance.parent_region, door_addresses[entrance.name][1], exit_ids[exit.name][1])
|
||||||
return '%s <= %s' % (entrance.name, exit.name)
|
return '%s <= %s' % (entrance.name, exit.name)
|
||||||
|
|
||||||
|
|
||||||
def connect_two_way(world, entrancename, exitname):
|
def connect_two_way(world, entrancename, exitname):
|
||||||
entrance = world.get_entrance(entrancename)
|
entrance = world.get_entrance(entrancename)
|
||||||
exit = world.get_entrance(exitname)
|
exit = world.get_entrance(exitname)
|
||||||
entrance.connect(exit.parent_region, exit_ids[exit.name])
|
|
||||||
exit.connect(entrance.parent_region)
|
# if these were already connected somewhere, remove the backreference
|
||||||
|
if entrance.connected_region is not None:
|
||||||
|
entrance.connected_region.entrances.remove(entrance)
|
||||||
|
if exit.connected_region is not None:
|
||||||
|
exit.connected_region.entrances.remove(exit)
|
||||||
|
|
||||||
|
entrance.connect(exit.parent_region, door_addresses[entrance.name][0], exit_ids[exit.name][0])
|
||||||
|
exit.connect(entrance.parent_region, door_addresses[entrance.name][1], exit_ids[exit.name][1])
|
||||||
return '%s <=> %s' % (entrance.name, exit.name)
|
return '%s <=> %s' % (entrance.name, exit.name)
|
||||||
|
|
||||||
|
|
||||||
|
@ -733,7 +746,7 @@ def scramble_holes(world):
|
||||||
if world.mode == 'standard':
|
if world.mode == 'standard':
|
||||||
# cannot move uncle cave
|
# cannot move uncle cave
|
||||||
ret.append(connect_two_way(world, 'Hyrule Castle Secret Entrance Stairs', 'Hyrule Castle Secret Entrance Exit'))
|
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'))
|
ret.append(connect_entrance(world, 'Hyrule Castle Secret Entrance Drop', 'Hyrule Castle Secret Entrance'))
|
||||||
else:
|
else:
|
||||||
hole_entrances.append(('Hyrule Castle Secret Entrance Stairs', 'Hyrule Castle Secret Entrance Drop'))
|
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'))
|
hole_targets.append(('Hyrule Castle Secret Entrance Exit', 'Hyrule Castle Secret Entrance'))
|
||||||
|
@ -742,7 +755,7 @@ def scramble_holes(world):
|
||||||
for entrance, drop in hole_entrances:
|
for entrance, drop in hole_entrances:
|
||||||
exit, target = hole_targets.pop()
|
exit, target = hole_targets.pop()
|
||||||
ret.append(connect_two_way(world, entrance, exit))
|
ret.append(connect_two_way(world, entrance, exit))
|
||||||
ret.append(connect_one_way(world, drop, target))
|
ret.append(connect_entrance(world, drop, target))
|
||||||
|
|
||||||
return '\n'.join(ret)
|
return '\n'.join(ret)
|
||||||
|
|
||||||
|
@ -757,7 +770,7 @@ def connect_random(world, exitlist, targetlist, two_way=False):
|
||||||
if two_way:
|
if two_way:
|
||||||
ret.append(connect_two_way(world, exit, target))
|
ret.append(connect_two_way(world, exit, target))
|
||||||
else:
|
else:
|
||||||
ret.append(connect_one_way(world, exit, target))
|
ret.append(connect_entrance(world, exit, target))
|
||||||
|
|
||||||
return '\n'.join(ret)
|
return '\n'.join(ret)
|
||||||
|
|
||||||
|
@ -836,7 +849,7 @@ def connect_doors(world, doors, targets):
|
||||||
while doors:
|
while doors:
|
||||||
door = doors.pop()
|
door = doors.pop()
|
||||||
target = targets.pop()
|
target = targets.pop()
|
||||||
ret.append(connect_one_way(world, door, target))
|
ret.append(connect_entrance(world, door, target))
|
||||||
|
|
||||||
return '\n'.join(ret)
|
return '\n'.join(ret)
|
||||||
|
|
||||||
|
@ -1565,66 +1578,8 @@ door_addresses = {'Desert Palace Entrance (South)': (0xDBB7B, 0x15B02),
|
||||||
'Dark Death Mountain Ascend (Top)': (0xDBB86, 0x15B18),
|
'Dark Death Mountain Ascend (Top)': (0xDBB86, 0x15B18),
|
||||||
'Dark Death Mountain Ascend (Bottom)': (0xDBB85, 0x15B16),
|
'Dark Death Mountain Ascend (Bottom)': (0xDBB85, 0x15B16),
|
||||||
'Hookshot Cave': (0xDBBAC, 0x15B64),
|
'Hookshot Cave': (0xDBBAC, 0x15B64),
|
||||||
'Hookshot Cave Back Entrance': (0xDBBAD, 0x15B66)}
|
'Hookshot Cave Back Entrance': (0xDBBAD, 0x15B66),
|
||||||
|
'Skull Woods First Section Hole (East)': (0xDB84D, 0xDB84E),
|
||||||
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),
|
|
||||||
'Agahnims Tower Exit': (0x24, 0xE0),
|
|
||||||
'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),
|
|
||||||
'7 Chest Cave Exit (Bottom)': (0x1E, 0xFF),
|
|
||||||
'7 Chest Cave Exit (Middle)': (0x1F, 0xEF),
|
|
||||||
'7 Chest Cave Exit (Top)': (0x20, 0xDF),
|
|
||||||
'Fairy Ascension Cave Exit (Bottom)': (0x1A, 0xFD),
|
|
||||||
'Fairy Ascension 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),
|
|
||||||
'Dark Death Mountain Ascend Exit (Top)': (0x14, 0xE8),
|
|
||||||
'Dark Death Mountain Ascend Exit (Bottom)': (0x13, 0xF8),
|
|
||||||
'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 (West)': (0xDB84F, 0xDB850),
|
||||||
'Skull Woods First Section Hole (North)': 0xDB84C,
|
'Skull Woods First Section Hole (North)': 0xDB84C,
|
||||||
'Skull Woods Second Section Hole': (0xDB851, 0xDB852),
|
'Skull Woods Second Section Hole': (0xDB851, 0xDB852),
|
||||||
|
@ -1705,8 +1660,63 @@ single_doors = {'Skull Woods First Section Hole (East)': (0xDB84D, 0xDB84E),
|
||||||
'Lake Hylia Fortune Teller': 0xDBBE5,
|
'Lake Hylia Fortune Teller': 0xDBBE5,
|
||||||
'Kakariko Gamble Game': 0xDBBD9}
|
'Kakariko Gamble Game': 0xDBBD9}
|
||||||
|
|
||||||
|
exit_ids = {'Desert Palace Exit (South)': (0x09, 0x84),
|
||||||
cave_codes = {'Waterfall of Wishing': 0x5C,
|
'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),
|
||||||
|
'Agahnims Tower Exit': (0x24, 0xE0),
|
||||||
|
'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),
|
||||||
|
'7 Chest Cave Exit (Bottom)': (0x1E, 0xFF),
|
||||||
|
'7 Chest Cave Exit (Middle)': (0x1F, 0xEF),
|
||||||
|
'7 Chest Cave Exit (Top)': (0x20, 0xDF),
|
||||||
|
'Fairy Ascension Cave Exit (Bottom)': (0x1A, 0xFD),
|
||||||
|
'Fairy Ascension 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),
|
||||||
|
'Dark Death Mountain Ascend Exit (Top)': (0x14, 0xE8),
|
||||||
|
'Dark Death Mountain Ascend Exit (Bottom)': (0x13, 0xF8),
|
||||||
|
'Hookshot Cave Exit (South)': (0x3A, 0x3C),
|
||||||
|
'Hookshot Cave Exit (North)': (0x3B, 0x2C),
|
||||||
|
'Waterfall of Wishing': 0x5C,
|
||||||
'Dam': 0x4E,
|
'Dam': 0x4E,
|
||||||
'Thiefs Hut': 0x61,
|
'Thiefs Hut': 0x61,
|
||||||
'Lumberjack House': 0x6B,
|
'Lumberjack House': 0x6B,
|
||||||
|
|
23
Rom.py
23
Rom.py
|
@ -1,5 +1,4 @@
|
||||||
from Dungeons import dungeon_music_addresses
|
from Dungeons import dungeon_music_addresses
|
||||||
from EntranceShuffle import door_addresses, single_doors
|
|
||||||
from Text import string_to_alttp_text, text_addresses, credits_addresses, string_to_credits
|
from Text import string_to_alttp_text, text_addresses, credits_addresses, string_to_credits
|
||||||
from Text import Uncle_texts, Ganon1_texts, PyramidFairy_texts, TavernMan_texts, Sahasrahla2_texts, Triforce_texts, Blind_texts, BombShop2_texts
|
from Text import Uncle_texts, Ganon1_texts, PyramidFairy_texts, TavernMan_texts, Sahasrahla2_texts, Triforce_texts, Blind_texts, BombShop2_texts
|
||||||
from Text import KingsReturn_texts, Sanctuary_texts, Kakariko_texts, Blacksmiths_texts, DeathMountain_texts, LostWoods_texts, WishingWell_texts, DesertPalace_texts, MountainTower_texts, LinksHouse_texts, Lumberjacks_texts, SickKid_texts, FluteBoy_texts, Zora_texts, MagicShop_texts
|
from Text import KingsReturn_texts, Sanctuary_texts, Kakariko_texts, Blacksmiths_texts, DeathMountain_texts, LostWoods_texts, WishingWell_texts, DesertPalace_texts, MountainTower_texts, LinksHouse_texts, Lumberjacks_texts, SickKid_texts, FluteBoy_texts, Zora_texts, MagicShop_texts
|
||||||
|
@ -40,27 +39,7 @@ def patch_rom(world, rom, hashtable, quickswap=False, beep='normal', sprite=None
|
||||||
for region in world.regions:
|
for region in world.regions:
|
||||||
for exit in region.exits:
|
for exit in region.exits:
|
||||||
if exit.target is not None:
|
if exit.target is not None:
|
||||||
try:
|
addresses = [exit.addresses] if isinstance(exit.addresses, int) else exit.addresses
|
||||||
# ugly fix for agahnim fix in simple dungeon shuffle mode
|
|
||||||
if world.agahnim_fix_required and exit.name == 'Dark Death Mountain Ledge (East)':
|
|
||||||
write_byte(rom, door_addresses[exit.name][0], world.get_entrance('Mimic Cave Mirror Spot').target)
|
|
||||||
continue
|
|
||||||
|
|
||||||
addresses = door_addresses[exit.name]
|
|
||||||
write_byte(rom, addresses[0], exit.target[0])
|
|
||||||
write_byte(rom, addresses[1], exit.target[1])
|
|
||||||
except KeyError:
|
|
||||||
# probably cave
|
|
||||||
|
|
||||||
# ugly fix for agahnim fix in simple dungeon shuffle mode
|
|
||||||
if world.agahnim_fix_required and exit.name == 'Mimic Cave Mirror Spot':
|
|
||||||
write_byte(rom, single_doors[exit.name], world.get_entrance('Dark Death Mountain Ledge (East)').target[0])
|
|
||||||
write_byte(rom, door_addresses['Dark Death Mountain Ledge (East)'][1], world.get_entrance('Dark Death Mountain Ledge (East)').target[1])
|
|
||||||
continue
|
|
||||||
|
|
||||||
addresses = single_doors[exit.name]
|
|
||||||
if not isinstance(addresses, tuple):
|
|
||||||
addresses = (addresses,)
|
|
||||||
for address in addresses:
|
for address in addresses:
|
||||||
write_byte(rom, address, exit.target)
|
write_byte(rom, address, exit.target)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue