New destinations now write to ROM

This commit is contained in:
codemann8
2021-04-12 12:23:26 -05:00
parent 894acbd939
commit ade6dfc416
12 changed files with 635 additions and 577 deletions

1
.gitignore vendored
View File

@@ -34,3 +34,4 @@ get-pip.py
venv
test
*.code-workspace

View File

@@ -71,6 +71,8 @@ class World(object):
self.dynamic_locations = []
self.spoiler = Spoiler(self)
self.lamps_needed_for_dark_rooms = 1
self.owedges = []
self._owedge_cache = {}
self.doors = []
self._door_cache = {}
self.paired_doors = {}
@@ -153,10 +155,20 @@ class World(object):
for r_location in region.locations:
self._location_cache[r_location.name, r_location.player] = r_location
def initialize_owedges(self, edges):
for edge in edges:
self._owedge_cache[(edge.name, edge.player)] = edge
def initialize_doors(self, doors):
for door in doors:
self._door_cache[(door.name, door.player)] = door
def remove_owedge(self, edge, player):
if (edge.name, player) in self._owedge_cache.keys():
del self._owedge_cache[(edge.name, player)]
if edge in self.owedges:
self.owedges.remove(edge)
def remove_door(self, door, player):
if (door.name, player) in self._door_cache.keys():
del self._door_cache[(door.name, player)]
@@ -178,6 +190,18 @@ class World(object):
return region
raise RuntimeError('No such region %s for player %d' % (regionname, player))
def get_owedge(self, edgename, player):
if isinstance(edgename, OWEdge):
return edgename
try:
return self._owedge_cache[(edgename, player)]
except KeyError:
for edge in self.owedges:
if edge.name == edgename and edge.player == player:
self._owedge_cache[(edgename, player)] = edge
return edge
raise RuntimeError('No such edge %s for player %d' % (edgename, player))
def get_entrance(self, entrance, player):
if isinstance(entrance, Entrance):
return entrance
@@ -241,6 +265,18 @@ class World(object):
return portal
raise RuntimeError('No such portal %s for player %d' % (portal_name, player))
def check_for_owedge(self, edgename, player):
if isinstance(edgename, OWEdge):
return edgename
try:
return self._owedge_cache[(edgename, player)]
except KeyError:
for edge in self.owedges:
if edge.name == edgename and edge.player == player:
self._owedge_cache[(edgename, player)] = edge
return edge
return None
def check_for_door(self, doorname, player):
if isinstance(doorname, Door):
return doorname
@@ -1391,6 +1427,60 @@ class Door(object):
return '%s' % self.name
class OWEdge(object):
def __init__(self, player, name, owIndex, direction, edge_id, owSlotIndex=0xff):
self.player = player
self.name = name
self.type = DoorType.Open
self.direction = direction
self.deadEnd = False
# rom properties
self.owIndex = owIndex
if owSlotIndex == 0xff:
self.owSlotIndex = owIndex
else:
self.owSlotIndex = owSlotIndex
self.shiftX = 78
self.shiftY = 78
self.zeroHzCam = False
self.zeroVtCam = False
self.edge_id = edge_id
# logical properties
# self.connected = False # combine with Dest?
self.dest = None
self.dependents = []
self.dead = False
def getAddress(self):
base_address = {
Direction.North: 0x153800,
Direction.South: 0x153800 + (0x41 * 12),
Direction.West: 0x153800 + (0x82 * 12),
Direction.East: 0x153800 + (0xcc * 12),
}
return base_address[self.direction] + (self.edge_id * 12)
def getTarget(self):
return self.dest.edge_id
def dead_end(self):
self.deadEnd = True
def __eq__(self, other):
return isinstance(other, self.__class__) and self.name == other.name
def __hash__(self):
return hash(self.name)
def __str__(self):
return str(self.__unicode__())
def __unicode__(self):
return '%s' % self.name
class Sector(object):
def __init__(self):

View File

@@ -2849,251 +2849,8 @@ mandatory_connections = [('Links House S&Q', 'Links House'),
('Sanctuary S&Q', 'Sanctuary'),
('Old Man S&Q', 'Old Man House'),
('Flute Spot 1', 'West Death Mountain (Bottom)'),
('Flute Spot 2', 'Potion Shop Area'),
('Flute Spot 3', 'Kakariko Area'),
('Flute Spot 4', 'Links House Area'),
('Flute Spot 5', 'Eastern Nook Area'),
('Flute Spot 6', 'Desert Palace Teleporter Ledge'),
('Flute Spot 7', 'Dam Area'),
('Flute Spot 8', 'Octoballoon Area'),
# Special OW Areas
('Lost Woods NW', 'Master Sword Meadow'),
('Master Sword Meadow SC', 'Lost Woods Area'),
('Zora Approach NE', 'Zoras Domain'),
('Zoras Domain SW', 'Zora Approach Area'),
('Stone Bridge WC', 'Hobo Bridge'),
('Hobo EC', 'Stone Bridge Water'),
# Whirlpool Connections
('C Whirlpool', 'Useless Fairy Water'),
('Useless Fairy Whirlpool', 'C Whirlpool Area'),
('Lake Hylia Whirlpool', 'Zora Approach Area'),
('Zora Whirlpool', 'Lake Hylia Water'),
('Kakariko Pond Whirlpool', 'Octoballoon Water'),
('Octoballoon Whirlpool', 'Kakariko Pond Area'),
('Qirn Jump Whirlpool', 'Southeast DW Water'),
('Southeast DW Whirlpool', 'Qirn Jump Water'),
# Intra-tile OW Connections
('Death Mountain Entrance Rock', 'Death Mountain Entrance'),
('Death Mountain Entrance Drop', 'DM Ascent Area'),
('Death Mountain Return Drop', 'DM Ascent Area'),
('Bonk Rock Ledge Drop', 'Sanctuary Area'),
('Kings Grave Outer Rocks', 'Kings Grave Area'),
('Kings Grave Inner Rocks', 'Graveyard Area'),
('Graveyard Ledge Drop', 'Graveyard Area'),
('Useless Fairy Water Drop', 'Useless Fairy Water'),
('Useless Fairy East Water Drop', 'Useless Fairy Water'),
('Useless Fairy West Pier', 'Useless Fairy Area'),
('Useless Fairy East Pier', 'Useless Fairy East Bank'),
('Potion Shop Water Drop', 'Potion Shop Water'),
('Potion Shop Northeast Water Drop', 'Potion Shop Water'),
('Potion Shop Rock (South)', 'Potion Shop Northeast'),
('Potion Shop Rock (North)', 'Potion Shop Area'),
('Zora Warning Water Drop', 'Zora Warning Water'),
('Bat Cave Ledge Peg', 'Bat Cave Ledge'),
('Hyrule Castle Main Gate (South)', 'Hyrule Castle Courtyard'),
('Hyrule Castle Main Gate (North)', 'Hyrule Castle Area'),
('Hyrule Castle Ledge Drop', 'Hyrule Castle Area'),
('Hyrule Castle Ledge Courtyard Drop', 'Hyrule Castle Courtyard'),
('Hyrule Castle Inner East Rock', 'Hyrule Castle East Entry'),
('Hyrule Castle Outer East Rock', 'Hyrule Castle Area'),
('Wooden Bridge Water Drop', 'Wooden Bridge Water'),
('Maze Race Ledge Drop', 'Maze Race Area'),
('Cave 45 Ledge Drop', 'Cave 45 Area'),
('C Whirlpool Rock (Bottom)', 'C Whirlpool Outer Area'),
('C Whirlpool Rock (Top)', 'C Whirlpool Area'),
('Desert Palace Statue Move', 'Desert Palace Stairs'),
('Desert Ledge Drop', 'Desert Area'),
('Desert Ledge Outer Rocks', 'Desert Palace Entrance (North) Spot'),
('Desert Ledge Inner Rocks', 'Desert Ledge'),
('Checkerboard Ledge Drop', 'Desert Area'),
('Desert Mouth Drop', 'Desert Area'),
('Desert Teleporter Drop', 'Desert Area'),
('Bombos Tablet Drop', 'Desert Area'),
('Purple Chest Ledge Drop', 'Purple Chest Area'),
('Purple Chest Rocks (North)', 'Purple Chest Southeast'),
('Purple Chest Rocks (South)', 'Purple Chest Area'),
('Lake Hylia Water Drop', 'Lake Hylia Water'),
('Lake Hylia South Water Drop', 'Lake Hylia Water'),
('Lake Hylia Northeast Water Drop', 'Lake Hylia Water'),
('Lake Hylia Central Water Drop', 'Lake Hylia Water'),
('Lake Hylia Island Water Drop', 'Lake Hylia Water'),
('Lake Hylia Central Island Pier', 'Lake Hylia Central Island'),
('Lake Hylia West Pier', 'Lake Hylia Area'),
('Lake Hylia East Pier', 'Lake Hylia Northeast Bank'),
('Octoballoon Water Drop', 'Octoballoon Water'),
('Octoballoon Waterfall Water Drop', 'Octoballoon Water'),
('Octoballoon Pier', 'Octoballoon Area'),
('West Death Mountain Drop', 'West Death Mountain (Bottom)'),
('Spectacle Rock Drop', 'West Death Mountain (Top)'),
('DM Hammer Bridge (West)', 'East Death Mountain (Top West)'),
('DM Hammer Bridge (East)', 'East Death Mountain (Top East)'),
('East Death Mountain Spiral Drop', 'Spiral Cave Ledge'),
('East Death Mountain Fairy Drop', 'Fairy Ascension Ledge'),
('Spiral Ledge Drop', 'East Death Mountain (Bottom)'),
('Fairy Ascension Ledge Drop', 'Fairy Ascension Plateau'),
('Fairy Ascension Plateau Drop', 'East Death Mountain (Bottom)'),
('Fairy Ascension Rocks', 'Fairy Ascension Plateau'),
('DM Broken Bridge (West)', 'East Death Mountain (Bottom)'),
('DM Broken Bridge (East)', 'East Death Mountain (Bottom Left)'),
('Skull Woods Bush Rock (West)', 'Skull Woods Forest'),
('Skull Woods Bush Rock (East)', 'Skull Woods Portal Entry'),
('Skull Woods Forgotten Bush (West)', 'Skull Woods Forgotten Path (Northeast)'),
('Skull Woods Forgotten Bush (East)', 'Skull Woods Forgotten Path (Southwest)'),
('Bumper Cave Entrance Rock', 'Bumper Cave Entrance'),
('Bumper Cave Ledge Drop', 'Bumper Cave Area'),
('Bumper Cave Entrance Drop', 'Bumper Cave Area'),
('Skull Woods Pass Bush Row (West)', 'Skull Woods Pass East Top Area'),
('Skull Woods Pass Bush Row (East)', 'Skull Woods Pass West Area'),
('Skull Woods Pass Rock (Top)', 'Skull Woods Pass East Bottom Area'),
('Skull Woods Pass Rock (Bottom)', 'Skull Woods Pass East Top Area'),
('Qirn Jump Water Drop', 'Qirn Jump Water'),
('Qirn Jump East Water Drop', 'Qirn Jump Water'),
('Qirn Jump Pier', 'Qirn Jump East Bank'),
('Dark Witch Water Drop', 'Dark Witch Water'),
('Dark Witch Northeast Water Drop', 'Dark Witch Water'),
('Dark Witch Rock (North)', 'Dark Witch Area'),
('Dark Witch Rock (South)', 'Dark Witch Northeast'),
('Catfish Approach Water Drop', 'Catfish Approach Water'),
('Village of Outcasts Pegs', 'Dark Grassy Lawn'),
('Grassy Lawn Pegs', 'Village of Outcasts Area'),
('Peg Area Rocks (West)', 'Hammer Peg Area'),
('Peg Area Rocks (East)', 'Hammer Peg Entry'),
('Pyramid Exit Drop', 'Pyramid Area'),
('Broken Bridge Hammer Rock (South)', 'Broken Bridge Northeast'),
('Broken Bridge Hammer Rock (North)', 'Broken Bridge Area'),
('Broken Bridge Hookshot Gap', 'Broken Bridge West'),
('Broken Bridge Water Drop', 'Broken Bridge Water'),
('Broken Bridge Northeast Water Drop', 'Broken Bridge Water'),
('Broken Bridge West Water Drop', 'Broken Bridge Water'),
('Dig Game To Ledge Drop', 'Dig Game Ledge'),
('Dig Game Ledge Drop', 'Dig Game Area'),
('Frog Ledge Drop', 'Archery Game Area'),
('Archery Game Rock', 'Frog Area'),
('Dark C Whirlpool Rock (Bottom)', 'Dark C Whirlpool Outer Area'),
('Dark C Whirlpool Rock (Top)', 'Dark C Whirlpool Area'),
('Hammer Bridge Pegs (North)', 'Hammer Bridge South Area'),
('Hammer Bridge Pegs (South)', 'Hammer Bridge North Area'),
('Hammer Bridge Water Drop', 'Hammer Bridge Water'),
('Hammer Bridge Pier', 'Hammer Bridge North Area'),
('Dark Lake Hylia Water Drop', 'Dark Lake Hylia Water'),
('Dark Lake Hylia Northeast Water Drop', 'Dark Lake Hylia Water'),
('Dark Lake Hylia Southwest Water Drop', 'Dark Lake Hylia Water'),
('Dark Lake Hylia Southeast Water Drop', 'Dark Lake Hylia Water'),
('Dark Lake Hylia Northeast Pier', 'Dark Lake Hylia Northeast Bank'),
('Southeast DW Water Drop', 'Southeast DW Water'),
('Southeast DW Waterfall Water Drop', 'Southeast DW Water'),
('Southeast DW Pier', 'Southeast DW Area'),
('Dark Death Mountain Drop (West)', 'Dark Death Mountain (West Bottom)'),
('Dark Death Mountain Drop (East)', 'Dark Death Mountain (East Bottom)'),
('Floating Island Drop', 'Dark Death Mountain (Top East)'),
('Turtle Rock Ledge Drop', 'Turtle Rock Area'),
('Flute Away', 'Flute Sky'),
# Portal Connections
('Kakariko Teleporter (Hammer)', 'Skull Woods Pass East Top Area'),
('Kakariko Teleporter (Rock)', 'Skull Woods Pass East Top Area'),
('Top of Pyramid', 'Pyramid Area'),
('Top of Pyramid (Inner)', 'Pyramid Area'),
('East Hyrule Teleporter', 'Palace of Darkness Nook Area'),
('South Hyrule Teleporter', 'Dark C Whirlpool Area'),
('Desert Teleporter', 'Misery Mire Area'),
('Lake Hylia Teleporter', 'Ice Palace Area'),
('West Death Mountain Teleporter', 'Dark Death Mountain (West Bottom)'),
('East Death Mountain Teleporter', 'Dark Death Mountain (East Bottom)'),
('Turtle Rock Teleporter', 'Turtle Rock Ledge'),
# Mirror Connections
('Lost Woods Mirror Spot', 'Lost Woods Area'),
('Lost Woods Entry Mirror Spot', 'Lost Woods Area'),
('Lost Woods Pedestal Mirror Spot', 'Lost Woods Area'),
('Lost Woods Southwest Mirror Spot', 'Lost Woods Area'),
('Lost Woods Northeast Mirror Spot', 'Lost Woods Area'),
('Lumberjack Mirror Spot', 'Lumberjack Area'),
('DM Ascent Mirror Spot', 'DM Ascent Area'),
('DM Ascent Entrance Mirror Spot', 'Death Mountain Entrance'),
('DM Ascent Ledge Mirror Spot', 'Death Mountain Return Ledge'),
('Lost Woods Pass West Mirror Spot', 'Lost Woods Pass West Area'),
('Lost Woods Pass East Top Mirror Spot', 'Lost Woods Pass East Top Area'),
('Lost Woods East Bottom Mirror Spot', 'Lost Woods Pass East Bottom Area'),
('Kakariko Fortune Mirror Spot', 'Kakariko Fortune Area'),
('Kakariko Pond Mirror Spot', 'Kakariko Pond Area'),
('Forgotton Forest Mirror Spot', 'Forgotten Forest Area'),
('Bonk Rock Ledge Mirror Spot', 'Bonk Rock Ledge'),
('Graveyard Ledge Mirror Spot', 'Graveyard Ledge'),
('Kings Grave Mirror Spot', 'Kings Grave Area'),
('Useless Fairy Mirror Spot', 'Useless Fairy Area'),
('Useless Fairy East Mirror Spot', 'Useless Fairy East Bank'),
('Potion Shop Mirror Spot', 'Potion Shop Area'),
('Potion Shop Northeast Mirror Spot', 'Potion Shop Northeast'),
('Zora Warning Mirror Spot', 'Zora Warning Area'),
('Zora Approach Mirror Spot', 'Zora Approach Area'),
('Kakariko Mirror Spot', 'Kakariko Area'),
('Kakariko Grass Mirror Spot', 'Kakariko Area'),
('Blacksmith Mirror Spot', 'Blacksmith Area'),
('Blacksmith Entry Mirror Spot', 'Blacksmith Area'),
('Bat Cave Ledge Mirror Spot', 'Bat Cave Ledge'),
('HC Ledge Mirror Spot', 'Hyrule Castle Ledge'),
('HC Courtyard Mirror Spot', 'Hyrule Castle Courtyard'),
('HC Area Mirror Spot', 'Hyrule Castle Area'),
('HC Area South Mirror Spot', 'Hyrule Castle Area'),
('HC East Entry Mirror Spot', 'Hyrule Castle East Entry'),
('Wooden Bridge Mirror Spot', 'Wooden Bridge Area'),
('Wooden Bridge Northeast Mirror Spot', 'Wooden Bridge Area'),
('Wooden Bridge West Mirror Spot', 'Wooden Bridge Area'),
('Sand Dune Mirror Spot', 'Sand Dune Area'),
('Eastern Palace Mirror Spot', 'Eastern Palace Area'),
('Eastern Nook Mirror Spot', 'Eastern Nook Area'),
('Maze Race Mirror Spot', 'Maze Race Ledge'),
('Maze Race Ledge Mirror Spot', 'Maze Race Ledge'),
('Kakariko Suburb Mirror Spot', 'Kakariko Suburb Area'),
('Kakariko Suburb South Mirror Spot', 'Kakariko Suburb Area'),
('Flute Boy Mirror Spot', 'Flute Boy Area'),
('Flute Boy Pass Mirror Spot', 'Flute Boy Pass'),
('Cave 45 Mirror Spot', 'Cave 45 Ledge'),
('C Whirlpool Mirror Spot', 'C Whirlpool Area'),
('C Whirlpool Outer Mirror Spot', 'C Whirlpool Outer Area'),
('Central Bonk Rock Mirror Spot', 'Central Bonk Rock Area'),
('Links House Mirror Spot', 'Links House Area'),
('Stone Bridge Mirror Spot', 'Stone Bridge Area'),
('Stone Bridge South Mirror Spot', 'Stone Bridge Area'),
('Hobo Mirror Spot', 'Stone Bridge Water'),
('Tree Line Mirror Spot', 'Tree Line Area'),
('Desert Ledge Mirror Spot', 'Desert Ledge'),
('Checkerboard Mirror Spot', 'Desert Checkerboard Ledge'),
('DP Stairs Mirror Spot', 'Desert Palace Stairs'),
('DP Entrance (North) Mirror Spot', 'Desert Palace Entrance (North) Spot'),
('Bombos Tablet Mirror Spot', 'Purple Chest Ledge'),
('Purple Chest Mirror Spot', 'Purple Chest Area'),
('Dam Mirror Spot', 'Dam Area'),
('Statues Mirror Spot', 'Statues Area'),
('South Pass Mirror Spot', 'South Pass Area'),
('Lake Hylia Mirror Spot', 'Lake Hylia Area'),
('Lake Hylia Northeast Mirror Spot', 'Lake Hylia Northeast Bank'),
('South Shore Mirror Spot', 'Lake Hylia South Shore'),
('South Shore East Mirror Spot', 'Lake Hylia South Shore'),
('Lake Hylia Island Mirror Spot', 'Lake Hylia Island'),
('Lake Hylia Central Island Mirror Spot', 'Lake Hylia Central Island'),
('Octoballoon Mirror Spot', 'Octoballoon Area'),
('Ice Rod Cave Mirror Spot', 'Ice Rod Cave Area'),
('Spectacle Rock Mirror Spot', 'Spectacle Rock Ledge'),
('West Death Mountain (Top) Mirror Spot', 'West Death Mountain (Top)'),
('East Death Mountain (Top West) Mirror Spot', 'East Death Mountain (Top West)'),
('East Death Mountain (Top East) Mirror Spot', 'East Death Mountain (Top East)'),
('Spiral Cave Mirror Spot', 'Spiral Cave Ledge'),
('Mimic Cave Mirror Spot', 'Mimic Cave Ledge'),
('Isolated Ledge Mirror Spot', 'Fairy Ascension Ledge'),
('Fairy Ascension Mirror Spot', 'Fairy Ascension Plateau'),
('Floating Island Mirror Spot', 'Death Mountain Floating Island (Light World)'),
('TR Pegs Area Mirror Spot', 'Death Mountain TR Pegs'),
# UW Connections
('Lost Woods Hideout (top to bottom)', 'Lost Woods Hideout (bottom)'),
('Lumberjack Tree (top to bottom)', 'Lumberjack Tree (bottom)'),

View File

@@ -14,6 +14,7 @@ from KeyDoorShuffle import validate_key_placement
from PotShuffle import shuffle_pots
from Regions import create_regions, create_shops, mark_light_world_regions, create_dungeon_regions, adjust_locations
from InvertedRegions import create_inverted_regions, mark_dark_world_regions
from OWEdges import create_owedges
from OverworldShuffle import link_overworld
from EntranceShuffle import link_entrances, link_inverted_entrances
from Rom import patch_rom, patch_race_rom, patch_enemizer, apply_rom_settings, LocalRom, JsonRom, get_hash_string
@@ -115,6 +116,7 @@ def main(args, seed=None, fish=None):
create_regions(world, player)
else:
create_inverted_regions(world, player)
create_owedges(world, player)
create_dungeon_regions(world, player)
create_shops(world, player)
create_doors(world, player)
@@ -444,6 +446,11 @@ def copy_world(world):
ret.state.prog_items = world.state.prog_items.copy()
ret.state.stale = {player: True for player in range(1, world.players + 1)}
ret.owedges = world.owedges
for edge in ret.owedges:
transition = ret.check_for_owedge(edge.name, edge.player)
if transition is not None:
transition.dest = edge
ret.doors = world.doors
for door in ret.doors:
entrance = ret.check_for_entrance(door.name, door.player)

302
OWEdges.py Normal file
View File

@@ -0,0 +1,302 @@
from BaseClasses import OWEdge, Direction
# constants
We = Direction.West
Ea = Direction.East
So = Direction.South
No = Direction.North
def create_owedges(world, player):
edges = [
# player, name, owIndex, direction, edge_id, (owSlotIndex)
create_owedge(player, 'Lost Woods NW', 0x00, No, 0x00),
create_owedge(player, 'Lost Woods SW', 0x00, So, 0x01, 0x08),
create_owedge(player, 'Lost Woods SC', 0x00, So, 0x02, 0x08),
create_owedge(player, 'Lost Woods SE', 0x00, So, 0x03, 0x09),
create_owedge(player, 'Lost Woods EN', 0x00, Ea, 0x00, 0x01),
create_owedge(player, 'Lumberjack SW', 0x02, So, 0x00),
create_owedge(player, 'Lumberjack WN', 0x02, We, 0x00),
create_owedge(player, 'West Death Mountain EN', 0x03, Ea, 0x01, 0x04),
create_owedge(player, 'West Death Mountain ES', 0x03, Ea, 0x03, 0x0c),
create_owedge(player, 'East Death Mountain WN', 0x05, We, 0x01, 0x05),
create_owedge(player, 'East Death Mountain WS', 0x05, We, 0x03, 0x0d),
create_owedge(player, 'East Death Mountain EN', 0x05, Ea, 0x02, 0x06),
create_owedge(player, 'Death Mountain TR Pegs WN', 0x07, We, 0x02),
create_owedge(player, 'DM Ascent NW', 0x0a, No, 0x01),
create_owedge(player, 'DM Ascent SE', 0x0a, So, 0x04),
create_owedge(player, 'Zora Approach NE', 0x0f, No, 0x02),
create_owedge(player, 'Zora Approach SE', 0x0f, So, 0x05),
create_owedge(player, 'Lost Woods Pass NW', 0x10, No, 0x03),
create_owedge(player, 'Lost Woods Pass NE', 0x10, No, 0x04),
create_owedge(player, 'Lost Woods Pass SW', 0x10, So, 0x06),
create_owedge(player, 'Lost Woods Pass SE', 0x10, So, 0x07),
create_owedge(player, 'Kakariko Fortune NE', 0x11, No, 0x05),
create_owedge(player, 'Kakariko Fortune SC', 0x11, So, 0x08),
create_owedge(player, 'Kakariko Fortune EN', 0x11, Ea, 0x04),
create_owedge(player, 'Kakariko Fortune ES', 0x11, Ea, 0x05),
create_owedge(player, 'Kakariko Pond NE', 0x12, No, 0x06),
create_owedge(player, 'Kakariko Pond SW', 0x12, So, 0x09),
create_owedge(player, 'Kakariko Pond SE', 0x12, So, 0x0a),
create_owedge(player, 'Kakariko Pond WN', 0x12, We, 0x04),
create_owedge(player, 'Kakariko Pond WS', 0x12, We, 0x05),
create_owedge(player, 'Kakariko Pond EN', 0x12, Ea, 0x06),
create_owedge(player, 'Kakariko Pond ES', 0x12, Ea, 0x07),
create_owedge(player, 'Sanctuary WN', 0x13, We, 0x06),
create_owedge(player, 'Sanctuary WS', 0x13, We, 0x07),
create_owedge(player, 'Sanctuary EC', 0x13, Ea, 0x08),
create_owedge(player, 'Graveyard WC', 0x14, We, 0x08),
create_owedge(player, 'Graveyard EC', 0x14, Ea, 0x09),
create_owedge(player, 'Useless Fairy SW', 0x15, So, 0x0b),
create_owedge(player, 'Useless Fairy SC', 0x15, So, 0x0c),
create_owedge(player, 'Useless Fairy SE', 0x15, So, 0x0d),
create_owedge(player, 'Useless Fairy WC', 0x15, We, 0x09),
create_owedge(player, 'Useless Fairy EN', 0x15, Ea, 0x0a),
create_owedge(player, 'Useless Fairy EC', 0x15, Ea, 0x0b),
create_owedge(player, 'Useless Fairy ES', 0x15, Ea, 0x0c),
create_owedge(player, 'Potion Shop WN', 0x16, We, 0x0a),
create_owedge(player, 'Potion Shop WC', 0x16, We, 0x0b),
create_owedge(player, 'Potion Shop WS', 0x16, We, 0x0c),
create_owedge(player, 'Potion Shop EN', 0x16, Ea, 0x0d),
create_owedge(player, 'Potion Shop EC', 0x16, Ea, 0x0e),
create_owedge(player, 'Zora Warning NE', 0x17, No, 0x07),
create_owedge(player, 'Zora Warning WN', 0x17, We, 0x0d),
create_owedge(player, 'Zora Warning WC', 0x17, We, 0x0e),
create_owedge(player, 'Kakariko NW', 0x18, No, 0x08),
create_owedge(player, 'Kakariko NC', 0x18, No, 0x09),
create_owedge(player, 'Kakariko NE', 0x18, No, 0x0a, 0x19),
create_owedge(player, 'Kakariko SE', 0x18, So, 0x0f, 0x21),
create_owedge(player, 'Kakariko ES', 0x18, Ea, 0x10, 0x21),
create_owedge(player, 'Forgotten Forest NW', 0x1a, No, 0x0b),
create_owedge(player, 'Forgotten Forest NE', 0x1a, No, 0x0c),
create_owedge(player, 'Forgotten Forest ES', 0x1a, Ea, 0x0f),
create_owedge(player, 'Hyrule Castle SW', 0x1b, So, 0x10, 0x23),
create_owedge(player, 'Hyrule Castle SE', 0x1b, So, 0x11, 0x24),
create_owedge(player, 'Hyrule Castle WN', 0x1b, We, 0x0f),
create_owedge(player, 'Hyrule Castle ES', 0x1b, Ea, 0x11, 0x24),
create_owedge(player, 'Wooden Bridge NW', 0x1d, No, 0x0d),
create_owedge(player, 'Wooden Bridge NC', 0x1d, No, 0x0e),
create_owedge(player, 'Wooden Bridge NE', 0x1d, No, 0x0f),
create_owedge(player, 'Wooden Bridge SW', 0x1d, So, 0x0e),
create_owedge(player, 'Eastern Palace SW', 0x1e, So, 0x13, 0x26),
create_owedge(player, 'Eastern Palace SE', 0x1e, So, 0x14, 0x27),
create_owedge(player, 'Blacksmith WS', 0x22, We, 0x10),
create_owedge(player, 'Sand Dune NW', 0x25, No, 0x10),
create_owedge(player, 'Sand Dune SC', 0x25, So, 0x12),
create_owedge(player, 'Sand Dune WN', 0x25, We, 0x11),
create_owedge(player, 'Maze Race ES', 0x28, Ea, 0x12),
create_owedge(player, 'Kakariko Suburb NE', 0x29, No, 0x11),
create_owedge(player, 'Kakariko Suburb WS', 0x29, We, 0x12),
create_owedge(player, 'Kakariko Suburb ES', 0x29, Ea, 0x13),
create_owedge(player, 'Flute Boy SW', 0x2a, So, 0x15),
create_owedge(player, 'Flute Boy SC', 0x2a, So, 0x16),
create_owedge(player, 'Flute Boy WS', 0x2a, We, 0x13),
create_owedge(player, 'Central Bonk Rock NW', 0x2b, No, 0x12),
create_owedge(player, 'Central Bonk Rock SW', 0x2b, So, 0x17),
create_owedge(player, 'Central Bonk Rock EN', 0x2b, Ea, 0x14),
create_owedge(player, 'Central Bonk Rock EC', 0x2b, Ea, 0x15),
create_owedge(player, 'Central Bonk Rock ES', 0x2b, Ea, 0x16),
create_owedge(player, 'Links House NE', 0x2c, No, 0x13),
create_owedge(player, 'Links House SC', 0x2c, So, 0x18),
create_owedge(player, 'Links House WN', 0x2c, We, 0x14),
create_owedge(player, 'Links House WC', 0x2c, We, 0x15),
create_owedge(player, 'Links House WS', 0x2c, We, 0x16),
create_owedge(player, 'Links House ES', 0x2c, Ea, 0x17),
create_owedge(player, 'Stone Bridge NC', 0x2d, No, 0x14),
create_owedge(player, 'Stone Bridge SC', 0x2d, So, 0x19),
create_owedge(player, 'Stone Bridge WC', 0x2d, We, 0x17),
create_owedge(player, 'Stone Bridge WS', 0x2d, We, 0x18),
create_owedge(player, 'Stone Bridge EN', 0x2d, Ea, 0x18),
create_owedge(player, 'Stone Bridge EC', 0x2d, Ea, 0x19),
create_owedge(player, 'Tree Line NW', 0x2e, No, 0x15),
create_owedge(player, 'Tree Line SC', 0x2e, So, 0x1a),
create_owedge(player, 'Tree Line SE', 0x2e, So, 0x1b),
create_owedge(player, 'Tree Line WN', 0x2e, We, 0x19),
create_owedge(player, 'Tree Line WC', 0x2e, We, 0x1a),
create_owedge(player, 'Eastern Nook NE', 0x2f, No, 0x16),
create_owedge(player, 'Desert EC', 0x30, Ea, 0x1e, 0x39),
create_owedge(player, 'Desert ES', 0x30, Ea, 0x1f, 0x39),
create_owedge(player, 'Cave 45 NW', 0x32, No, 0x17),
create_owedge(player, 'Cave 45 NC', 0x32, No, 0x18),
create_owedge(player, 'Cave 45 EC', 0x32, Ea, 0x1a),
create_owedge(player, 'C Whirlpool NW', 0x33, No, 0x19),
create_owedge(player, 'C Whirlpool SC', 0x33, So, 0x1c),
create_owedge(player, 'C Whirlpool WC', 0x33, We, 0x1b),
create_owedge(player, 'C Whirlpool EN', 0x33, Ea, 0x1b),
create_owedge(player, 'C Whirlpool EC', 0x33, Ea, 0x1c),
create_owedge(player, 'C Whirlpool ES', 0x33, Ea, 0x1d),
create_owedge(player, 'Statues NC', 0x34, No, 0x1a),
create_owedge(player, 'Statues SC', 0x34, So, 0x1d),
create_owedge(player, 'Statues WN', 0x34, We, 0x1c),
create_owedge(player, 'Statues WC', 0x34, We, 0x1d),
create_owedge(player, 'Statues WS', 0x34, We, 0x1e),
create_owedge(player, 'Lake Hylia NW', 0x35, No, 0x1b),
create_owedge(player, 'Lake Hylia NC', 0x35, No, 0x1c, 0x36),
create_owedge(player, 'Lake Hylia NE', 0x35, No, 0x1d, 0x36),
create_owedge(player, 'Lake Hylia WS', 0x35, We, 0x24, 0x3d),
create_owedge(player, 'Lake Hylia EC', 0x35, Ea, 0x24, 0x3e),
create_owedge(player, 'Lake Hylia ES', 0x35, Ea, 0x25, 0x3e),
create_owedge(player, 'Ice Rod Cave SW', 0x37, So, 0x1e),
create_owedge(player, 'Ice Rod Cave SE', 0x37, So, 0x1f),
create_owedge(player, 'Purple Chest WC', 0x3a, We, 0x1f),
create_owedge(player, 'Purple Chest WS', 0x3a, We, 0x20),
create_owedge(player, 'Purple Chest EC', 0x3a, Ea, 0x20),
create_owedge(player, 'Purple Chest ES', 0x3a, Ea, 0x21),
create_owedge(player, 'Dam NC', 0x3b, No, 0x1e),
create_owedge(player, 'Dam WC', 0x3b, We, 0x21),
create_owedge(player, 'Dam WS', 0x3b, We, 0x22),
create_owedge(player, 'Dam EC', 0x3b, Ea, 0x22),
create_owedge(player, 'South Pass NC', 0x3c, No, 0x1f),
create_owedge(player, 'South Pass WC', 0x3c, We, 0x23),
create_owedge(player, 'South Pass ES', 0x3c, Ea, 0x23),
create_owedge(player, 'Octoballoon NW', 0x3f, No, 0x20),
create_owedge(player, 'Octoballoon NE', 0x3f, No, 0x21),
create_owedge(player, 'Octoballoon WC', 0x3f, We, 0x25),
create_owedge(player, 'Octoballoon WS', 0x3f, We, 0x26),
create_owedge(player, 'Skull Woods SW', 0x40, So, 0x21, 0x48),
create_owedge(player, 'Skull Woods SC', 0x40, So, 0x22, 0x48),
create_owedge(player, 'Skull Woods SE', 0x40, So, 0x23, 0x49),
create_owedge(player, 'Skull Woods EN', 0x40, Ea, 0x26, 0x41),
create_owedge(player, 'Dark Lumberjack SW', 0x42, So, 0x20),
create_owedge(player, 'Dark Lumberjack WN', 0x42, We, 0x27),
create_owedge(player, 'West Dark Death Mountain EN', 0x43, Ea, 0x27, 0x44),
create_owedge(player, 'West Dark Death Mountain ES', 0x43, Ea, 0x29, 0x4c),
create_owedge(player, 'East Dark Death Mountain WN', 0x45, We, 0x28),
create_owedge(player, 'East Dark Death Mountain WS', 0x45, We, 0x2a, 0x4d),
create_owedge(player, 'East Dark Death Mountain EN', 0x45, Ea, 0x28, 0x46),
create_owedge(player, 'Turtle Rock WN', 0x47, We, 0x29),
create_owedge(player, 'Bumper Cave NW', 0x4a, No, 0x22),
create_owedge(player, 'Bumper Cave SE', 0x4a, So, 0x24),
create_owedge(player, 'Catfish SE', 0x4f, So, 0x25),
create_owedge(player, 'Skull Woods Pass NW', 0x50, No, 0x23),
create_owedge(player, 'Skull Woods Pass NE', 0x50, No, 0x24),
create_owedge(player, 'Skull Woods Pass SW', 0x50, So, 0x26),
create_owedge(player, 'Skull Woods Pass SE', 0x50, So, 0x27),
create_owedge(player, 'Dark Fortune NE', 0x51, No, 0x25),
create_owedge(player, 'Dark Fortune SC', 0x51, So, 0x28),
create_owedge(player, 'Dark Fortune EN', 0x51, Ea, 0x2a),
create_owedge(player, 'Dark Fortune ES', 0x51, Ea, 0x2b),
create_owedge(player, 'Outcast Pond NE', 0x52, No, 0x26),
create_owedge(player, 'Outcast Pond SW', 0x52, So, 0x29),
create_owedge(player, 'Outcast Pond SE', 0x52, So, 0x2a),
create_owedge(player, 'Outcast Pond WN', 0x52, We, 0x2b),
create_owedge(player, 'Outcast Pond WS', 0x52, We, 0x2c),
create_owedge(player, 'Outcast Pond EN', 0x52, Ea, 0x2c),
create_owedge(player, 'Outcast Pond ES', 0x52, Ea, 0x2d),
create_owedge(player, 'Dark Chapel WN', 0x53, We, 0x2d),
create_owedge(player, 'Dark Chapel WS', 0x53, We, 0x2e),
create_owedge(player, 'Dark Chapel EC', 0x53, Ea, 0x2e),
create_owedge(player, 'Dark Graveyard WC', 0x54, We, 0x2f),
create_owedge(player, 'Dark Graveyard ES', 0x54, Ea, 0x2f),
create_owedge(player, 'Qirn Jump SW', 0x55, So, 0x2b),
create_owedge(player, 'Qirn Jump SC', 0x55, So, 0x2c),
create_owedge(player, 'Qirn Jump SE', 0x55, So, 0x2d),
create_owedge(player, 'Qirn Jump WC', 0x55, We, 0x30),
create_owedge(player, 'Qirn Jump EN', 0x55, Ea, 0x30),
create_owedge(player, 'Qirn Jump EC', 0x55, Ea, 0x31),
create_owedge(player, 'Qirn Jump ES', 0x55, Ea, 0x32),
create_owedge(player, 'Dark Witch WN', 0x56, We, 0x31),
create_owedge(player, 'Dark Witch WC', 0x56, We, 0x32),
create_owedge(player, 'Dark Witch WS', 0x56, We, 0x33),
create_owedge(player, 'Dark Witch EN', 0x56, Ea, 0x33),
create_owedge(player, 'Dark Witch EC', 0x56, Ea, 0x34),
create_owedge(player, 'Catfish Approach NE', 0x57, No, 0x27),
create_owedge(player, 'Catfish Approach WN', 0x57, We, 0x34),
create_owedge(player, 'Catfish Approach WC', 0x57, We, 0x35),
create_owedge(player, 'Village of Outcasts NW', 0x58, No, 0x28),
create_owedge(player, 'Village of Outcasts NC', 0x58, No, 0x29),
create_owedge(player, 'Village of Outcasts NE', 0x58, No, 0x2a, 0x59),
create_owedge(player, 'Village of Outcasts SE', 0x58, So, 0x2f, 0x61),
create_owedge(player, 'Village of Outcasts ES', 0x58, Ea, 0x35, 0x61),
create_owedge(player, 'Shield Shop NW', 0x5a, No, 0x2b),
create_owedge(player, 'Shield Shop NE', 0x5a, No, 0x2c),
create_owedge(player, 'Pyramid SW', 0x5b, So, 0x30, 0x63),
create_owedge(player, 'Pyramid SE', 0x5b, So, 0x31, 0x64),
create_owedge(player, 'Pyramid ES', 0x5b, Ea, 0x36, 0x64),
create_owedge(player, 'Broken Bridge NW', 0x5d, No, 0x2d),
create_owedge(player, 'Broken Bridge NC', 0x5d, No, 0x2e),
create_owedge(player, 'Broken Bridge NE', 0x5d, No, 0x2f),
create_owedge(player, 'Broken Bridge SW', 0x5d, So, 0x2e),
create_owedge(player, 'Palace of Darkness SW', 0x5e, So, 0x33, 0x66),
create_owedge(player, 'Palace of Darkness SE', 0x5e, So, 0x34, 0x67),
create_owedge(player, 'Hammer Pegs WS', 0x62, We, 0x36),
create_owedge(player, 'Dark Dune NW', 0x65, No, 0x30),
create_owedge(player, 'Dark Dune SC', 0x65, So, 0x32),
create_owedge(player, 'Dark Dune WN', 0x65, We, 0x37),
create_owedge(player, 'Dig Game EC', 0x68, Ea, 0x37),
create_owedge(player, 'Dig Game ES', 0x68, Ea, 0x38),
create_owedge(player, 'Frog NE', 0x69, No, 0x31),
create_owedge(player, 'Frog WC', 0x69, We, 0x38),
create_owedge(player, 'Frog WS', 0x69, We, 0x39),
create_owedge(player, 'Frog ES', 0x69, Ea, 0x39),
create_owedge(player, 'Stumpy SW', 0x6a, So, 0x35),
create_owedge(player, 'Stumpy SC', 0x6a, So, 0x36),
create_owedge(player, 'Stumpy WS', 0x6a, We, 0x3a),
create_owedge(player, 'Dark Bonk Rock NW', 0x6b, No, 0x32),
create_owedge(player, 'Dark Bonk Rock SW', 0x6b, So, 0x37),
create_owedge(player, 'Dark Bonk Rock EN', 0x6b, Ea, 0x3a),
create_owedge(player, 'Dark Bonk Rock EC', 0x6b, Ea, 0x3b),
create_owedge(player, 'Dark Bonk Rock ES', 0x6b, Ea, 0x3c),
create_owedge(player, 'Big Bomb Shop NE', 0x6c, No, 0x33),
create_owedge(player, 'Big Bomb Shop SC', 0x6c, So, 0x38),
create_owedge(player, 'Big Bomb Shop WN', 0x6c, We, 0x3b),
create_owedge(player, 'Big Bomb Shop WC', 0x6c, We, 0x3c),
create_owedge(player, 'Big Bomb Shop WS', 0x6c, We, 0x3d),
create_owedge(player, 'Big Bomb Shop ES', 0x6c, Ea, 0x3d),
create_owedge(player, 'Hammer Bridge NC', 0x6d, No, 0x34),
create_owedge(player, 'Hammer Bridge SC', 0x6d, So, 0x39),
create_owedge(player, 'Hammer Bridge WS', 0x6d, We, 0x3e),
create_owedge(player, 'Hammer Bridge EN', 0x6d, Ea, 0x3e),
create_owedge(player, 'Hammer Bridge EC', 0x6d, Ea, 0x3f),
create_owedge(player, 'Dark Tree Line NW', 0x6e, No, 0x35),
create_owedge(player, 'Dark Tree Line SC', 0x6e, So, 0x3a),
create_owedge(player, 'Dark Tree Line SE', 0x6e, So, 0x3b),
create_owedge(player, 'Dark Tree Line WN', 0x6e, We, 0x3f),
create_owedge(player, 'Dark Tree Line WC', 0x6e, We, 40),
create_owedge(player, 'Palace of Darkness Nook NE', 0x6f, No, 0x36),
create_owedge(player, 'Circle of Bushes NW', 0x72, No, 0x37),
create_owedge(player, 'Circle of Bushes NC', 0x72, No, 0x38),
create_owedge(player, 'Circle of Bushes EC', 0x72, Ea, 0x40),
create_owedge(player, 'Dark C Whirlpool NW', 0x73, No, 0x39),
create_owedge(player, 'Dark C Whirlpool SC', 0x73, So, 0x3c),
create_owedge(player, 'Dark C Whirlpool WC', 0x73, We, 0x41),
create_owedge(player, 'Dark C Whirlpool EN', 0x73, Ea, 0x41),
create_owedge(player, 'Dark C Whirlpool EC', 0x73, Ea, 0x42),
create_owedge(player, 'Dark C Whirlpool ES', 0x73, Ea, 0x43),
create_owedge(player, 'Hype Cave NC', 0x74, No, 0x3a),
create_owedge(player, 'Hype Cave SC', 0x74, So, 0x3d),
create_owedge(player, 'Hype Cave WN', 0x74, We, 0x42),
create_owedge(player, 'Hype Cave WC', 0x74, We, 0x43),
create_owedge(player, 'Hype Cave WS', 0x74, We, 0x44),
create_owedge(player, 'Dark Lake Hylia NW', 0x75, No, 0x3b),
create_owedge(player, 'Dark Lake Hylia NC', 0x75, No, 0x3c, 0x76),
create_owedge(player, 'Dark Lake Hylia NE', 0x75, No, 0x3d, 0x76),
create_owedge(player, 'Dark Lake Hylia WS', 0x75, We, 0x48, 0x7d),
create_owedge(player, 'Dark Lake Hylia EC', 0x75, Ea, 0x48, 0x7e),
create_owedge(player, 'Dark Lake Hylia ES', 0x75, Ea, 0x49, 0x7e),
create_owedge(player, 'Dark Shopping Mall SW', 0x77, So, 0x3e),
create_owedge(player, 'Dark Shopping Mall SE', 0x77, So, 0x3f),
create_owedge(player, 'Dark Purple Chest EC', 0x7a, Ea, 0x44),
create_owedge(player, 'Dark Purple Chest ES', 0x7a, Ea, 0x45),
create_owedge(player, 'Swamp Palace NC', 0x7b, No, 0x3e),
create_owedge(player, 'Swamp Palace WC', 0x7b, We, 0x45),
create_owedge(player, 'Swamp Palace WS', 0x7b, We, 0x46),
create_owedge(player, 'Swamp Palace EC', 0x7b, Ea, 0x46),
create_owedge(player, 'Dark South Pass NC', 0x7c, No, 0x3f),
create_owedge(player, 'Dark South Pass WC', 0x7c, We, 0x47),
create_owedge(player, 'Dark South Pass ES', 0x7c, Ea, 0x47),
create_owedge(player, 'Southeast DW NW', 0x7f, No, 0x40),
create_owedge(player, 'Southeast DW NE', 0x7f, No, 0x41),
create_owedge(player, 'Southeast DW WC', 0x7f, We, 0x49),
create_owedge(player, 'Southeast DW WS', 0x7f, We, 0x4a),
create_owedge(player, 'Master Sword Meadow SC', 0x80, So, 0x40),
create_owedge(player, 'Hobo EC', 0x80, Ea, 0x4a),
create_owedge(player, 'Zoras Domain SW', 0x81, So, 0x41)
]
world.owedges += edges
world.initialize_owedges(edges)
def create_owedge(player, name, owIndex, direction, edge_id, owSlotIndex=0xff):
return OWEdge(player, name, owIndex, direction, edge_id, owSlotIndex)

View File

@@ -4,16 +4,21 @@ def link_overworld(world, player):
# setup mandatory connections
for exitname, regionname in mandatory_connections:
connect_simple(world, exitname, regionname, player)
for exitname, destname in temporary_mandatory_connections:
connect_two_way(world, exitname, destname, player)
connect_custom(world, player)
# if we do not shuffle, set default connections
if world.owShuffle[player] == 'vanilla':
for exitname, regionname in default_overworld_connections:
connect_simple(world, exitname, regionname, player)
for exitname, destname in default_overworld_connections:
connect_two_way(world, exitname, destname, player)
elif world.owShuffle[player] == 'full':
for exitname, regionname in default_overworld_connections:
connect_simple(world, exitname, regionname, player)
for exitname, destname in default_overworld_connections:
connect_two_way(world, exitname, destname, player)
#TODO: Remove, just for testing
for exitname, destname in test_connections:
connect_two_way(world, exitname, destname, player)
else:
raise NotImplementedError('Shuffling not supported yet')
@@ -29,12 +34,41 @@ def connect_custom(world, player):
def connect_simple(world, exitname, regionname, player):
world.get_entrance(exitname, player).connect(world.get_region(regionname, player))
# these are connections that cannot be shuffled and always exist. They link together separate parts of the world we need to divide into regions
mandatory_connections = [('Links House S&Q', 'Links House'),
('Sanctuary S&Q', 'Sanctuary'),
('Old Man S&Q', 'Old Man House'),
def connect_two_way(world, entrancename, exitname, player):
entrance = world.get_entrance(entrancename, player)
exit = world.get_entrance(exitname, player)
('Flute Spot 1', 'West Death Mountain (Bottom)'),
# 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)
exit.connect(entrance.parent_region)
x = world.check_for_owedge(entrancename, player)
y = world.check_for_owedge(exitname, player)
if x is not None:
x.dest = y
if y is not None:
y.dest = x
world.spoiler.set_overworld(exitname, entrancename, 'both', player)
# these are connections that cannot be shuffled and always exist. They link together separate parts of the world we need to divide into regions
test_connections = [
#('Links House ES', 'Octoballoon WS'),
#('Links House NE', 'Lost Woods Pass SW')
]
temporary_mandatory_connections = [
# Special OW Areas
('Lost Woods NW', 'Master Sword Meadow SC'),
('Zora Approach NE', 'Zoras Domain SW'),
('Stone Bridge WC', 'Hobo EC'),
]
mandatory_connections = [('Flute Spot 1', 'West Death Mountain (Bottom)'),
('Flute Spot 2', 'Potion Shop Area'),
('Flute Spot 3', 'Kakariko Area'),
('Flute Spot 4', 'Links House Area'),
@@ -43,14 +77,6 @@ mandatory_connections = [('Links House S&Q', 'Links House'),
('Flute Spot 7', 'Dam Area'),
('Flute Spot 8', 'Octoballoon Area'),
# Special OW Areas
('Lost Woods NW', 'Master Sword Meadow'),
('Master Sword Meadow SC', 'Lost Woods Area'),
('Zora Approach NE', 'Zoras Domain'),
('Zoras Domain SW', 'Zora Approach Area'),
('Stone Bridge WC', 'Hobo Bridge'),
('Hobo EC', 'Stone Bridge Water'),
# Whirlpool Connections
('C Whirlpool', 'Useless Fairy Water'),
('Useless Fairy Whirlpool', 'C Whirlpool Area'),
@@ -180,8 +206,6 @@ mandatory_connections = [('Links House S&Q', 'Links House'),
('Floating Island Drop', 'Dark Death Mountain (Top East)'),
('Turtle Rock Ledge Drop', 'Turtle Rock Area'),
('Flute Away', 'Flute Sky'),
# Portal Connections
('Kakariko Teleporter (Hammer)', 'Skull Woods Pass East Top Area'),
('Kakariko Teleporter (Rock)', 'Skull Woods Pass East Top Area'),
@@ -276,308 +300,150 @@ mandatory_connections = [('Links House S&Q', 'Links House'),
('Mimic Cave Mirror Spot', 'Mimic Cave Ledge'),
('Isolated Ledge Mirror Spot', 'Fairy Ascension Ledge'),
('Fairy Ascension Mirror Spot', 'Fairy Ascension Plateau'),
('Death Mountain Bridge Mirror Spot', 'East Death Mountain (Bottom Left)'),
('Floating Island Mirror Spot', 'Death Mountain Floating Island (Light World)'),
('TR Pegs Area Mirror Spot', 'Death Mountain TR Pegs'),
# UW Connections
('Lost Woods Hideout (top to bottom)', 'Lost Woods Hideout (bottom)'),
('Lumberjack Tree (top to bottom)', 'Lumberjack Tree (bottom)'),
('Kakariko Well (top to bottom)', 'Kakariko Well (bottom)'),
('Bat Cave Door', 'Bat Cave (left)'),
('Sewer Drop', 'Sewers Rat Path'),
('Old Man Cave Dropdown', 'Old Man Cave'),
('Old Man House Front to Back', 'Old Man House Back'),
('Old Man House Back to Front', 'Old Man House'),
('Spectacle Rock Cave Drop', 'Spectacle Rock Cave (Bottom)'),
('Spectacle Rock Cave Peak Drop', 'Spectacle Rock Cave (Bottom)'),
('Spiral Cave (top to bottom)', 'Spiral Cave (Bottom)'),
('Light World Death Mountain Shop', 'Light World Death Mountain Shop'),
('Paradox Cave Push Block Reverse', 'Paradox Cave Chest Area'),
('Paradox Cave Push Block', 'Paradox Cave Front'),
('Paradox Cave Bomb Jump', 'Paradox Cave'),
('Paradox Cave Drop', 'Paradox Cave Chest Area'),
('Fairy Ascension Cave Climb', 'Fairy Ascension Cave (Top)'),
('Fairy Ascension Cave Pots', 'Fairy Ascension Cave (Bottom)'),
('Fairy Ascension Cave Drop', 'Fairy Ascension Cave (Drop)'),
('Ganon Drop', 'Bottom of Pyramid')
('TR Pegs Area Mirror Spot', 'Death Mountain TR Pegs')
]
# non shuffled overworld
default_overworld_connections = [('Lost Woods SW', 'Lost Woods Pass West Area'),
('Lost Woods SC', 'Lost Woods Pass East Top Area'),
('Lost Woods SE', 'Kakariko Fortune Area'),
('Lost Woods EN', 'Lumberjack Area'),
('Lumberjack WN', 'Lost Woods Area'),
('Lumberjack SW', 'DM Ascent Area'),
('DM Ascent NW', 'Lumberjack Area'),
('DM Ascent SE', 'Kakariko Pond Area'),
('Lost Woods Pass NW', 'Lost Woods Area'),
('Lost Woods Pass SW', 'Kakariko Area'),
('Lost Woods Pass NE', 'Lost Woods Area'),
('Lost Woods Pass SE', 'Kakariko Area'),
('Kakariko Fortune NE', 'Lost Woods Area'),
('Kakariko Fortune EN', 'Kakariko Pond Area'),
('Kakariko Fortune ES', 'Kakariko Pond Area'),
('Kakariko Fortune SC', 'Kakariko Area'),
('Kakariko Pond NE', 'DM Ascent Area'),
('Kakariko Pond WN', 'Kakariko Fortune Area'),
('Kakariko Pond WS', 'Kakariko Fortune Area'),
('Kakariko Pond SW', 'Forgotten Forest Area'),
('Kakariko Pond SE', 'Forgotten Forest Area'),
('Kakariko Pond EN', 'Bonk Rock Ledge'),
('Kakariko Pond ES', 'Sanctuary Area'),
('Forgotten Forest NW', 'Kakariko Pond Area'),
('Forgotten Forest NE', 'Kakariko Pond Area'),
('Forgotten Forest ES', 'Hyrule Castle Area'),
('Sanctuary WS', 'Kakariko Pond Area'),
('Sanctuary EC', 'Graveyard Area'),
('Sanctuary WN', 'Kakariko Pond Area'),
('Graveyard WC', 'Sanctuary Area'),
('Graveyard EC', 'Useless Fairy Area'),
('Useless Fairy WC', 'Graveyard Area'),
('Useless Fairy SW', 'Wooden Bridge Area'),
('Useless Fairy SE', 'Wooden Bridge Area'),
('Useless Fairy EC', 'Potion Shop Area'),
('Useless Fairy ES', 'Potion Shop Area'),
('Useless Fairy EN', 'Potion Shop Water'),
('Useless Fairy SC', 'Wooden Bridge Water'),
('Potion Shop WC', 'Useless Fairy East Bank'),
('Potion Shop WS', 'Useless Fairy East Bank'),
('Potion Shop EC', 'Zora Warning Area'),
('Potion Shop WN', 'Useless Fairy Water'),
('Potion Shop EN', 'Zora Warning Water'),
('Zora Warning WC', 'Potion Shop Northeast'),
('Zora Warning NE', 'Zora Approach Area'),
('Zora Warning WN', 'Potion Shop Water'),
('Zora Approach SE', 'Zora Warning Area'),
('Kakariko NW', 'Lost Woods Pass West Area'),
('Kakariko NC', 'Lost Woods Pass East Bottom Area'),
('Kakariko NE', 'Kakariko Fortune Area'),
('Kakariko ES', 'Blacksmith Area'),
('Kakariko SE', 'Kakariko Suburb Area'),
('Blacksmith WS', 'Kakariko Area'),
('Hyrule Castle WN', 'Forgotten Forest Area'),
('Hyrule Castle SW', 'Central Bonk Rock Area'),
('Hyrule Castle SE', 'Links House Area'),
('Hyrule Castle ES', 'Sand Dune Area'),
('Wooden Bridge NW', 'Useless Fairy Area'),
('Wooden Bridge NE', 'Useless Fairy East Bank'),
('Wooden Bridge SW', 'Sand Dune Area'),
('Wooden Bridge NC', 'Useless Fairy Water'),
('Sand Dune NW', 'Wooden Bridge Area'),
('Sand Dune WN', 'Hyrule Castle East Entry'),
('Sand Dune SC', 'Stone Bridge Area'),
('Eastern Palace SW', 'Tree Line Area'),
('Eastern Palace SE', 'Eastern Nook Area'),
('Eastern Nook NE', 'Eastern Palace Area'),
('Maze Race ES', 'Kakariko Suburb Area'),
('Kakariko Suburb NE', 'Kakariko Area'),
('Kakariko Suburb WS', 'Maze Race Area'),
('Kakariko Suburb ES', 'Flute Boy Pass'),
('Flute Boy SC', 'Cave 45 Area'),
('Flute Boy WS', 'Kakariko Suburb Area'),
('Flute Boy SW', 'Cave 45 Area'),
('Cave 45 NW', 'Flute Boy Pass'),
('Cave 45 NC', 'Flute Boy Area'),
('Cave 45 EC', 'C Whirlpool Outer Area'),
('C Whirlpool EN', 'Statues Area'),
('C Whirlpool EC', 'Statues Area'),
('C Whirlpool ES', 'Statues Area'),
('C Whirlpool SC', 'Dam Area'),
('C Whirlpool WC', 'Cave 45 Area'),
('C Whirlpool NW', 'Central Bonk Rock Area'),
('Central Bonk Rock NW', 'Hyrule Castle Area'),
('Central Bonk Rock SW', 'C Whirlpool Outer Area'),
('Central Bonk Rock EN', 'Links House Area'),
('Central Bonk Rock EC', 'Links House Area'),
('Central Bonk Rock ES', 'Links House Area'),
('Links House NE', 'Hyrule Castle Area'),
('Links House WN', 'Central Bonk Rock Area'),
('Links House WC', 'Central Bonk Rock Area'),
('Links House WS', 'Central Bonk Rock Area'),
('Links House SC', 'Statues Area'),
('Links House ES', 'Stone Bridge Area'),
('Stone Bridge NC', 'Sand Dune Area'),
('Stone Bridge EN', 'Tree Line Area'),
('Stone Bridge WS', 'Links House Area'),
('Stone Bridge SC', 'Lake Hylia Area'),
('Stone Bridge EC', 'Tree Line Water'),
('Tree Line WN', 'Stone Bridge Area'),
('Tree Line NW', 'Eastern Palace Area'),
('Tree Line SE', 'Lake Hylia Northeast Bank'),
('Tree Line WC', 'Stone Bridge Water'),
('Tree Line SC', 'Lake Hylia Water'),
('Desert ES', 'Purple Chest Area'),
('Purple Chest WS', 'Desert Area'),
('Purple Chest EC', 'Dam Area'),
('Purple Chest ES', 'Dam Area'),
('Purple Chest WC', 'Bombos Tablet Ledge'),
('Dam WC', 'Purple Chest Area'),
('Dam WS', 'Purple Chest Area'),
('Dam NC', 'C Whirlpool Area'),
('Dam EC', 'South Pass Area'),
('Statues NC', 'Links House Area'),
('Statues WN', 'C Whirlpool Area'),
('Statues WC', 'C Whirlpool Area'),
('Statues WS', 'C Whirlpool Area'),
('Statues SC', 'South Pass Area'),
('South Pass WC', 'Dam Area'),
('South Pass NC', 'Statues Area'),
('South Pass ES', 'Lake Hylia South Shore'),
('Lake Hylia NW', 'Stone Bridge Area'),
('Lake Hylia WS', 'South Pass Area'),
('Lake Hylia ES', 'Octoballoon Area'),
('Lake Hylia NE', 'Tree Line Area'),
('Lake Hylia NC', 'Tree Line Water'),
('Lake Hylia EC', 'Octoballoon Water'),
('Octoballoon WS', 'Lake Hylia South Shore'),
('Octoballoon NE', 'Ice Rod Cave Area'),
('Octoballoon WC', 'Lake Hylia Water'),
('Octoballoon NW', 'Ice Rod Cave Area'),
('Ice Rod Cave SE', 'Octoballoon Area'),
('Ice Rod Cave SW', 'Octoballoon Water Ledge'),
default_overworld_connections = [('Lost Woods SW', 'Lost Woods Pass NW'),
('Lost Woods SC', 'Lost Woods Pass NE'),
('Lost Woods SE', 'Kakariko Fortune NE'),
('Lost Woods EN', 'Lumberjack WN'),
('Lumberjack SW', 'DM Ascent NW'),
('DM Ascent SE', 'Kakariko Pond NE'),
('Lost Woods Pass SW', 'Kakariko NW'),
('Lost Woods Pass SE', 'Kakariko NC'),
('Kakariko Fortune SC', 'Kakariko NE'),
('Kakariko Fortune EN', 'Kakariko Pond WN'),
('Kakariko Fortune ES', 'Kakariko Pond WS'),
('Kakariko Pond SW', 'Forgotten Forest NW'),
('Kakariko Pond SE', 'Forgotten Forest NE'),
('Kakariko Pond EN', 'Sanctuary WN'),
('Kakariko Pond ES', 'Sanctuary WS'),
('Forgotten Forest ES', 'Hyrule Castle WN'),
('Sanctuary EC', 'Graveyard WC'),
('Graveyard EC', 'Useless Fairy WC'),
('Useless Fairy SW', 'Wooden Bridge NW'),
('Useless Fairy SC', 'Wooden Bridge NC'),
('Useless Fairy SE', 'Wooden Bridge NE'),
('Useless Fairy EN', 'Potion Shop WN'),
('Useless Fairy EC', 'Potion Shop WC'),
('Useless Fairy ES', 'Potion Shop WS'),
('Potion Shop EN', 'Zora Warning WN'),
('Potion Shop EC', 'Zora Warning WC'),
('Zora Warning NE', 'Zora Approach SE'),
('Kakariko SE', 'Kakariko Suburb NE'),
('Kakariko ES', 'Blacksmith WS'),
('Hyrule Castle SW', 'Central Bonk Rock NW'),
('Hyrule Castle SE', 'Links House NE'),
('Hyrule Castle ES', 'Sand Dune WN'),
('Wooden Bridge SW', 'Sand Dune NW'),
('Sand Dune SC', 'Stone Bridge NC'),
('Eastern Palace SW', 'Tree Line NW'),
('Eastern Palace SE', 'Eastern Nook NE'),
('Maze Race ES', 'Kakariko Suburb WS'),
('Kakariko Suburb ES', 'Flute Boy WS'),
('Flute Boy SW', 'Cave 45 NW'),
('Flute Boy SC', 'Cave 45 NC'),
('Cave 45 EC', 'C Whirlpool WC'),
('C Whirlpool NW', 'Central Bonk Rock SW'),
('C Whirlpool SC', 'Dam NC'),
('C Whirlpool EN', 'Statues WN'),
('C Whirlpool EC', 'Statues WC'),
('C Whirlpool ES', 'Statues WS'),
('Central Bonk Rock EN', 'Links House WN'),
('Central Bonk Rock EC', 'Links House WC'),
('Central Bonk Rock ES', 'Links House WS'),
('Links House SC', 'Statues NC'),
('Links House ES', 'Stone Bridge WS'),
('Stone Bridge SC', 'Lake Hylia NW'),
('Stone Bridge EN', 'Tree Line WN'),
('Stone Bridge EC', 'Tree Line WC'),
('Tree Line SC', 'Lake Hylia NC'),
('Tree Line SE', 'Lake Hylia NE'),
('Desert EC', 'Purple Chest WC'),
('Desert ES', 'Purple Chest WS'),
('Purple Chest EC', 'Dam WC'),
('Purple Chest ES', 'Dam WS'),
('Dam EC', 'South Pass WC'),
('Statues SC', 'South Pass NC'),
('South Pass ES', 'Lake Hylia WS'),
('Lake Hylia EC', 'Octoballoon WC'),
('Lake Hylia ES', 'Octoballoon WS'),
('Octoballoon NW', 'Ice Rod Cave SW'),
('Octoballoon NE', 'Ice Rod Cave SE'),
('West Death Mountain EN', 'East Death Mountain WN'),
('West Death Mountain ES', 'East Death Mountain WS'),
('East Death Mountain EN', 'Death Mountain TR Pegs WN'),
('West Death Mountain ES', 'East Death Mountain (Bottom Left)'),
('West Death Mountain EN', 'East Death Mountain (Top West)'),
('East Death Mountain WN', 'West Death Mountain (Top)'),
('East Death Mountain EN', 'Death Mountain TR Pegs'),
('East Death Mountain WS', 'West Death Mountain (Bottom)'),
('Death Mountain TR Pegs WN', 'East Death Mountain (Top East)'),
('Skull Woods SE', 'Dark Fortune Area'),
('Skull Woods SC', 'Skull Woods Pass East Top Area'),
('Skull Woods SW', 'Skull Woods Pass West Area'),
('Skull Woods WN', 'Dark Lumberjack Area'),
('Dark Lumberjack WN', 'Skull Woods Forgotten Path (Northeast)'),
('Dark Lumberjack SW', 'Bumper Cave Area'),
('Bumper Cave NW', 'Dark Lumberjack Area'),
('Bumper Cave SE', 'Outcast Pond Area'),
('Skull Woods Pass NW', 'Skull Woods Forgotten Path (Southwest)'),
('Skull Woods Pass SW', 'Village of Outcasts Area'),
('Skull Woods Pass NE', 'Skull Woods Portal Entry'),
('Skull Woods Pass SE', 'Village of Outcasts Area'),
('Dark Fortune NE', 'Skull Woods Forest'),
('Dark Fortune EN', 'Outcast Pond Area'),
('Dark Fortune ES', 'Outcast Pond Area'),
('Dark Fortune SC', 'Village of Outcasts Area'),
('Outcast Pond NE', 'Bumper Cave Area'),
('Outcast Pond WN', 'Dark Fortune Area'),
('Outcast Pond WS', 'Dark Fortune Area'),
('Outcast Pond SW', 'Shield Shop Area'),
('Outcast Pond SE', 'Shield Shop Area'),
('Outcast Pond EN', 'Dark Chapel Area'),
('Outcast Pond ES', 'Dark Chapel Area'),
('Shield Shop NW', 'Outcast Pond Area'),
('Shield Shop NE', 'Outcast Pond Area'),
('Dark Chapel WN', 'Outcast Pond Area'),
('Dark Chapel WS', 'Outcast Pond Area'),
('Dark Chapel EC', 'Dark Graveyard Area'),
('Dark Graveyard WC', 'Dark Chapel Area'),
('Dark Graveyard ES', 'Qirn Jump Area'),
('Qirn Jump WC', 'Dark Graveyard Area'),
('Qirn Jump SW', 'Broken Bridge West'),
('Qirn Jump SE', 'Broken Bridge Northeast'),
('Qirn Jump EC', 'Dark Witch Area'),
('Qirn Jump ES', 'Dark Witch Area'),
('Qirn Jump EN', 'Dark Witch Water'),
('Qirn Jump SC', 'Broken Bridge Water'),
('Dark Witch WC', 'Qirn Jump East Bank'),
('Dark Witch WS', 'Qirn Jump East Bank'),
('Dark Witch EC', 'Catfish Approach Area'),
('Dark Witch WN', 'Qirn Jump Water'),
('Dark Witch EN', 'Catfish Approach Water'),
('Catfish Approach WC', 'Dark Witch Northeast'),
('Catfish Approach NE', 'Catfish Area'),
('Catfish Approach WN', 'Dark Witch Water'),
('Catfish SE', 'Catfish Approach Area'),
('Village of Outcasts NW', 'Skull Woods Pass West Area'),
('Village of Outcasts NC', 'Skull Woods Pass East Bottom Area'),
('Village of Outcasts NE', 'Dark Fortune Area'),
('Village of Outcasts ES', 'Hammer Peg Entry'),
('Village of Outcasts SE', 'Frog Area'),
('Hammer Pegs WS', 'Village of Outcasts Area'),
('Pyramid ES', 'Dark Dune Area'),
('Pyramid SW', 'Dark Bonk Rock Area'),
('Pyramid SE', 'Big Bomb Shop Area'),
('Broken Bridge SW', 'Dark Dune Area'),
('Broken Bridge NE', 'Qirn Jump East Bank'),
('Broken Bridge NW', 'Qirn Jump Area'),
('Broken Bridge NC', 'Qirn Jump Water'),
('Dark Dune NW', 'Broken Bridge Area'),
('Dark Dune WN', 'Pyramid Area'),
('Dark Dune SC', 'Hammer Bridge North Area'),
('Palace of Darkness SW', 'Dark Tree Line Area'),
('Palace of Darkness SE', 'Palace of Darkness Nook Area'),
('Palace of Darkness Nook NE', 'Palace of Darkness Area'),
('Dig Game ES', 'Archery Game Area'),
('Dig Game EC', 'Archery Game Area'),
('Frog NE', 'Village of Outcasts Area'),
('Frog WC', 'Dig Game Ledge'),
('Frog WS', 'Dig Game Area'),
('Frog ES', 'Stumpy Pass'),
('Stumpy SC', 'Circle of Bushes Area'),
('Stumpy WS', 'Archery Game Area'),
('Stumpy SW', 'Circle of Bushes Area'),
('Circle of Bushes NW', 'Stumpy Pass'),
('Circle of Bushes NC', 'Stumpy Area'),
('Circle of Bushes EC', 'Dark C Whirlpool Outer Area'),
('Dark C Whirlpool EN', 'Hype Cave Area'),
('Dark C Whirlpool EC', 'Hype Cave Area'),
('Dark C Whirlpool ES', 'Hype Cave Area'),
('Dark C Whirlpool SC', 'Swamp Palace Area'),
('Dark C Whirlpool WC', 'Circle of Bushes Area'),
('Dark C Whirlpool NW', 'Dark Bonk Rock Area'),
('Dark Bonk Rock NW', 'Pyramid Pass'),
('Dark Bonk Rock SW', 'Dark C Whirlpool Outer Area'),
('Dark Bonk Rock EN', 'Big Bomb Shop Area'),
('Dark Bonk Rock EC', 'Big Bomb Shop Area'),
('Dark Bonk Rock ES', 'Big Bomb Shop Area'),
('Big Bomb Shop NE', 'Pyramid Pass'),
('Big Bomb Shop WN', 'Dark Bonk Rock Area'),
('Big Bomb Shop WC', 'Dark Bonk Rock Area'),
('Big Bomb Shop WS', 'Dark Bonk Rock Area'),
('Big Bomb Shop SC', 'Hype Cave Area'),
('Big Bomb Shop ES', 'Hammer Bridge South Area'),
('Hammer Bridge NC', 'Dark Dune Area'),
('Hammer Bridge EN', 'Dark Tree Line Area'),
('Hammer Bridge WS', 'Big Bomb Shop Area'),
('Hammer Bridge SC', 'Dark Lake Hylia Area'),
('Hammer Bridge EC', 'Dark Tree Line Water'),
('Dark Tree Line WN', 'Hammer Bridge North Area'),
('Dark Tree Line NW', 'Palace of Darkness Area'),
('Dark Tree Line SE', 'Dark Lake Hylia Northeast Bank'),
('Dark Tree Line WC', 'Hammer Bridge Water'),
('Dark Tree Line SC', 'Dark Lake Hylia Water'),
('Dark Purple Chest EC', 'Swamp Palace Area'),
('Dark Purple Chest ES', 'Swamp Palace Area'),
('Swamp Palace WC', 'Dark Purple Chest Area'),
('Swamp Palace WS', 'Dark Purple Chest Area'),
('Swamp Palace NC', 'Dark C Whirlpool Area'),
('Swamp Palace EC', 'Dark South Pass Area'),
('Hype Cave NC', 'Big Bomb Shop Area'),
('Hype Cave WN', 'Dark C Whirlpool Area'),
('Hype Cave WC', 'Dark C Whirlpool Area'),
('Hype Cave WS', 'Dark C Whirlpool Area'),
('Hype Cave SC', 'Dark South Pass Area'),
('Dark South Pass WC', 'Swamp Palace Area'),
('Dark South Pass NC', 'Hype Cave Area'),
('Dark South Pass ES', 'Dark Lake Hylia Ledge (West)'),
('Dark Lake Hylia NW', 'Hammer Bridge South Area'),
('Dark Lake Hylia NE', 'Dark Tree Line Area'),
('Dark Lake Hylia WS', 'Dark South Pass Area'),
('Dark Lake Hylia ES', 'Southeast DW Area'),
('Dark Lake Hylia NC', 'Dark Tree Line Water'),
('Dark Lake Hylia EC', 'Southeast DW Water'),
('Southeast DW WS', 'Dark Lake Hylia Ledge (East)'),
('Southeast DW NE', 'Dark Shopping Mall Area'),
('Southeast DW WC', 'Dark Lake Hylia Water'),
('Southeast DW NW', 'Dark Shopping Mall Area'),
('Dark Shopping Mall SE', 'Southeast DW Area'),
('Dark Shopping Mall SW', 'Southeast DW Water Ledge'),
('Dark Death Mountain EN', 'Dark Death Mountain (Top East)'),
('East Dark Death Mountain WN', 'Dark Death Mountain (Top West)'),
('East Dark Death Mountain EN', 'Turtle Rock Area'),
('Turtle Rock WN', 'Dark Death Mountain (Top East)')
('Skull Woods SW', 'Skull Woods Pass NW'),
('Skull Woods SC', 'Skull Woods Pass NE'),
('Skull Woods SE', 'Dark Fortune NE'),
('Skull Woods EN', 'Dark Lumberjack WN'),
('Dark Lumberjack SW', 'Bumper Cave NW'),
('Bumper Cave SE', 'Outcast Pond NE'),
('Skull Woods Pass SW', 'Village of Outcasts NW'),
('Skull Woods Pass SE', 'Village of Outcasts NC'),
('Dark Fortune SC', 'Village of Outcasts NE'),
('Dark Fortune EN', 'Outcast Pond WN'),
('Dark Fortune ES', 'Outcast Pond WS'),
('Outcast Pond SW', 'Shield Shop NW'),
('Outcast Pond SE', 'Shield Shop NE'),
('Outcast Pond EN', 'Dark Chapel WN'),
('Outcast Pond ES', 'Dark Chapel WS'),
('Dark Chapel EC', 'Dark Graveyard WC'),
('Dark Graveyard ES', 'Qirn Jump WC'),
('Qirn Jump SW', 'Broken Bridge NW'),
('Qirn Jump SC', 'Broken Bridge NC'),
('Qirn Jump SE', 'Broken Bridge NE'),
('Qirn Jump EN', 'Dark Witch WN'),
('Qirn Jump EC', 'Dark Witch WC'),
('Qirn Jump ES', 'Dark Witch WS'),
('Dark Witch EN', 'Catfish Approach WN'),
('Dark Witch EC', 'Catfish Approach WC'),
('Catfish Approach NE', 'Catfish SE'),
('Village of Outcasts SE', 'Frog NE'),
('Village of Outcasts ES', 'Hammer Pegs WS'),
('Pyramid SW', 'Dark Bonk Rock NW'),
('Pyramid SE', 'Big Bomb Shop NE'),
('Pyramid ES', 'Dark Dune WN'),
('Broken Bridge SW', 'Dark Dune NW'),
('Dark Dune SC', 'Hammer Bridge NC'),
('Palace of Darkness SW', 'Dark Tree Line NW'),
('Palace of Darkness SE', 'Palace of Darkness Nook NE'),
('Dig Game EC', 'Frog WC'),
('Dig Game ES', 'Frog WS'),
('Frog ES', 'Stumpy WS'),
('Stumpy SW', 'Circle of Bushes NW'),
('Stumpy SC', 'Circle of Bushes NC'),
('Circle of Bushes EC', 'Dark C Whirlpool WC'),
('Dark C Whirlpool NW', 'Dark Bonk Rock SW'),
('Dark C Whirlpool SC', 'Swamp Palace NC'),
('Dark C Whirlpool EN', 'Hype Cave WN'),
('Dark C Whirlpool EC', 'Hype Cave WC'),
('Dark C Whirlpool ES', 'Hype Cave WS'),
('Dark Bonk Rock EN', 'Big Bomb Shop WN'),
('Dark Bonk Rock EC', 'Big Bomb Shop WC'),
('Dark Bonk Rock ES', 'Big Bomb Shop WS'),
('Big Bomb Shop SC', 'Hype Cave NC'),
('Big Bomb Shop ES', 'Hammer Bridge WS'),
('Hammer Bridge SC', 'Dark Lake Hylia NW'),
('Hammer Bridge EN', 'Dark Tree Line WN'),
('Hammer Bridge EC', 'Dark Tree Line WC'),
('Dark Tree Line SC', 'Dark Lake Hylia NC'),
('Dark Tree Line SE', 'Dark Lake Hylia NE'),
('Dark Purple Chest EC', 'Swamp Palace WC'),
('Dark Purple Chest ES', 'Swamp Palace WS'),
('Swamp Palace EC', 'Dark South Pass WC'),
('Hype Cave SC', 'Dark South Pass NC'),
('Dark South Pass ES', 'Dark Lake Hylia WS'),
('Dark Lake Hylia EC', 'Southeast DW WC'),
('Dark Lake Hylia ES', 'Southeast DW WS'),
('Southeast DW NW', 'Dark Shopping Mall SW'),
('Southeast DW NE', 'Dark Shopping Mall SE'),
('West Dark Death Mountain EN', 'East Dark Death Mountain WN'),
('West Dark Death Mountain ES', 'East Dark Death Mountain WS'),
('East Dark Death Mountain EN', 'Turtle Rock WN')
]

View File

@@ -201,7 +201,7 @@ def create_regions(world, player):
create_dw_region(player, 'Skull Woods Portal Entry', None, ['Skull Woods Bush Rock (West)', 'Lost Woods Entry Mirror Spot', 'Skull Woods SC']),
create_dw_region(player, 'Skull Woods Forest (West)', None, ['Skull Woods Second Section Hole', 'Skull Woods Second Section Door (West)', 'Skull Woods Final Section', 'Lost Woods Pedestal Mirror Spot']),
create_dw_region(player, 'Skull Woods Forgotten Path (Southwest)', None, ['Skull Woods Forgotten Bush (West)', 'Lost Woods Southwest Mirror Spot', 'Skull Woods SW']),
create_dw_region(player, 'Skull Woods Forgotten Path (Northeast)', None, ['Skull Woods Forgotten Bush (East)', 'Lost Woods Northeast Mirror Spot', 'Skull Woods WN']),
create_dw_region(player, 'Skull Woods Forgotten Path (Northeast)', None, ['Skull Woods Forgotten Bush (East)', 'Lost Woods Northeast Mirror Spot', 'Skull Woods EN']),
create_dw_region(player, 'Dark Lumberjack Area', None, ['Dark World Lumberjack Shop', 'Lumberjack Mirror Spot', 'Dark Lumberjack WN', 'Dark Lumberjack SW']),
create_dw_region(player, 'Bumper Cave Area', None, ['Bumper Cave Entrance Rock', 'DM Ascent Mirror Spot', 'Bumper Cave NW', 'Bumper Cave SE']),
create_dw_region(player, 'Bumper Cave Entrance', None, ['Bumper Cave (Bottom)', 'DM Ascent Entrance Mirror Spot', 'Bumper Cave Ledge Drop']),
@@ -294,10 +294,11 @@ def create_regions(world, player):
create_cave_region(player, 'Pyramid', 'a drop\'s exit', ['Ganon'], ['Ganon Drop']),
create_cave_region(player, 'Bottom of Pyramid', 'a drop\'s exit', None, ['Pyramid Exit']),
create_dw_region(player, 'Dark Death Mountain (West Bottom)', None, ['Spike Cave', 'Dark Death Mountain Fairy', 'Spectacle Rock Mirror Spot']),
create_dw_region(player, 'Dark Death Mountain (Top West)', None, ['Ganons Tower', 'Dark Death Mountain Drop (West)', 'West Death Mountain (Top) Mirror Spot', 'Dark Death Mountain EN']),
create_dw_region(player, 'Dark Death Mountain (West Bottom)', None, ['Spike Cave', 'Dark Death Mountain Fairy', 'Spectacle Rock Mirror Spot', 'West Dark Death Mountain ES']),
create_dw_region(player, 'Dark Death Mountain (Top West)', None, ['Ganons Tower', 'Dark Death Mountain Drop (West)', 'West Death Mountain (Top) Mirror Spot', 'West Dark Death Mountain EN']),
create_dw_region(player, 'Dark Death Mountain (Top East)', None, ['Superbunny Cave (Top)', 'Hookshot Cave', 'Dark Death Mountain Drop (East)', 'East Death Mountain (Top West) Mirror Spot', 'East Death Mountain (Top East) Mirror Spot', 'East Dark Death Mountain WN', 'East Dark Death Mountain EN']),
create_dw_region(player, 'Dark Death Mountain (East Bottom)', None, ['Superbunny Cave (Bottom)', 'Cave Shop (Dark Death Mountain)', 'Fairy Ascension Mirror Spot']),
create_dw_region(player, 'Dark Death Mountain (West Lip)', None, ['Death Mountain Bridge Mirror Spot', 'East Dark Death Mountain WS']),
create_dw_region(player, 'Dark Death Mountain Ledge', None, ['Dark Death Mountain Ledge (East)', 'Dark Death Mountain Ledge (West)', 'Spiral Cave Mirror Spot', 'Mimic Cave Mirror Spot']),
create_dw_region(player, 'Dark Death Mountain Isolated Ledge', None, ['Turtle Rock Isolated Ledge Entrance', 'Isolated Ledge Mirror Spot']),
create_dw_region(player, 'Dark Death Mountain Floating Island', None, ['Floating Island Drop', 'Hookshot Cave Back Entrance', 'Floating Island Mirror Spot']),

13
Rom.py
View File

@@ -12,7 +12,7 @@ import subprocess
import bps.apply
import bps.io
from BaseClasses import CollectionState, ShopType, Region, Location, Door, DoorType, RegionType, PotItem
from BaseClasses import CollectionState, ShopType, Region, Location, OWEdge, Door, DoorType, RegionType, PotItem
from DoorShuffle import compass_data, DROptions, boss_indicator
from Dungeons import dungeon_music_addresses
from KeyDoorShuffle import count_locations_exclude_logic
@@ -27,7 +27,7 @@ from EntranceShuffle import door_addresses, exit_ids
JAP10HASH = '03a63945398191337e896e5771f77173'
RANDOMIZERBASEHASH = '5c4f3e34c9179f6fea697a01bef48724'
RANDOMIZERBASEHASH = 'a456755918d95d4bc1cbcc209242332a'
class JsonRom(object):
@@ -590,8 +590,13 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False):
write_pots_to_rom(rom, world.pot_contents[player])
# patch overworld edges
if world.owShuffle[player] == 'full':
rom.write_byte(0x150002, 2)
if world.owShuffle[player] != 'vanilla':
if world.owShuffle[player] == 'full':
rom.write_byte(0x150002, 2)
for edge in world.owedges:
if edge.dest is not None and isinstance(edge.dest, OWEdge) and edge.player == player:
rom.write_byte(edge.getAddress() + 0x0a, edge.getTarget())
# patch entrance/exits/holes
for region in world.regions:

View File

@@ -633,6 +633,7 @@ def default_rules(world, player):
set_rule(world.get_entrance('Spiral Cave Mirror Spot', player), lambda state: state.has_Mirror(player))
set_rule(world.get_entrance('Fairy Ascension Mirror Spot', player), lambda state: state.has_Mirror(player) and state.has_Pearl(player)) # need to lift flowers
set_rule(world.get_entrance('Isolated Ledge Mirror Spot', player), lambda state: state.has_Mirror(player))
set_rule(world.get_entrance('Death Mountain Bridge Mirror Spot', player), lambda state: state.has_Mirror(player))
set_rule(world.get_entrance('Floating Island Mirror Spot', player), lambda state: state.has_Mirror(player))
set_rule(world.get_entrance('TR Pegs Area Mirror Spot', player), lambda state: state.has_Mirror(player))

View File

@@ -16,12 +16,20 @@ jsl OWEdgeTransition : nop #4 ;LDA $02A4E3,X : ORA $7EF3CA
org $aaa000
OWCoordIndex: ; Horizontal 1st
db 2, 2, 0, 0 ; Coordinate Index $20-$23
OWOppCoordIndex: ; Horizontal 1st
db 0, 0, 2, 2 ; Coordinate Index $20-$23
OWBGIndex: ; Horizontal 1st
db 0, 0, 6, 6 ; BG Scroll Index $e2-$ea
OWOppBGIndex: ; Horizontal 1st
db 6, 6, 0, 0 ; BG Scroll Index $e2-$ea
OWCameraIndex: ; Horizontal 1st
db 4, 4, 0, 0 ; Camera Index $0618-$61f
OWOppCameraIndex: ; Horizontal 1st
db 0, 0, 4, 4 ; Camera Index $0618-$61f
OWOppSlotOffset: ; Amount to offset OW Slot
db 8, -8, 1, -1 ; OW Slot x2 $700
OWOppDirectionOffset: ; Amount to offset coord calc
db $10, $f0, $02, $fe
OWEdgeTransition:
{
php
@@ -183,13 +191,33 @@ OWNewDestination:
sep #$10 : ldy $418
;;22 e0 e2 61c 61e - X
;;20 e6 e8 618 61a - Y
ldx OWCoordIndex,y : lda $20,x : and #$01ff : pha
lda $06 : and #$01ff : !sub 1,s : pha : lda $06 : sta $20,x ;set coord, a = diff
ldx OWBGIndex,y : lda $e2,x : !add 1,s : sta $e2,x
ldx OWCameraIndex,y : lda $618,x : !add 1,s : sta $618,x
ldx OWCameraIndex,y : lda $61a,x : !add 1,s : sta $61a,x
ldx OWCoordIndex,y : lda $20,x : and #$fe00 : pha : lda $20,x : and #$01ff : pha ;s1 = relative cur, s3 = ow cur
lda $06 : and #$fe00 : !sub 3,s : pha ;set coord, s1 = ow diff, s3 = relative cur, s5 = ow cur
lda $06 : and #$01ff : !sub 3,s : pha ;s1 = rel diff, s3 = ow diff, s5 = relative cur, s7 = ow cur
lda $06 : sta $20,x ;set coord
ldx OWBGIndex,y : lda $e2,x : !add 1,s : !add 3,s : sta $e2,x
ldx OWCameraIndex,y : lda $618,x : !add 1,s : !add 3,s : sta $618,x
ldx OWCameraIndex,y : lda $61a,x : !add 1,s : !add 3,s : sta $61a,x
pla : lsr : pha : ldx OWBGIndex,y : lda $e0,x : !add 1,s : sta $e0,x
pla : pla : sep #$30
pla : pla : lsr : pha : ldx OWBGIndex,y : lda $e0,x : !add 1,s : sta $e0,x
pla : pla : pla
;opposite coord stuff
rep #$30 : lda OWOppDirectionOffset,y : and #$00ff : pha
cpy #$0002 : !bge +
lda $700 : and #$00f0 : pha : lda $04 : asl : and #$00f0 : !sub 1,s : tax : pla : txa
!sub 1,s : tax : pla : txa : asl : asl : asl : asl : pha : bra ++
+ lda $700 : and #$000f : pha : lda $04 : asl : and #$000f : !sub 1,s : !add 3,s
sep #$10 : tax : phx : ldx #$0 : phx : rep #$10 : pla : plx : plx : pha
++ ;ldy #$0
ldx OWOppCoordIndex,y : lda $20,x : !add 1,s : sta $20,x ;set coord
ldx OWOppBGIndex,y : lda $e2,x : !add 1,s : sta $e2,x
ldx OWOppCameraIndex,y : lda $618,x : !add 1,s : sta $618,x
ldx OWOppCameraIndex,y : lda $61a,x : !add 1,s : sta $61a,x
ldx OWOppBGIndex,y : lda $e0,x : !add 1,s : sta $e0,x : pla
sep #$30 ;: ldy $418 :
lda OWOppSlotOffset,y : !add $04 : asl : sta $700
;;;tempfixes
;;lda #$08e8 : sta $0e
@@ -439,7 +467,7 @@ dw $0000, $4001, $0000, $0000
dw $0000, $0000, $0000, $4a01
dw $0000, $4101, $0000, $0000
org $aab800
org $aab800 ;PC 153800
OWNorthEdges:
;Min Coord, Max Coord, Width, Midpoint, OW Slot/OWID, Dest Index
dw $00a0, $00a0, $0000, $00a0, $0000, $0040 ;Lost Woods
@@ -560,8 +588,8 @@ dw $0350, $0390, $0040, $0370, $5861, $0031
dw $0670, $06a8, $0038, $068c, $5b63, $0032
dw $0898, $09b0, $0118, $0924, $5b64, $0033
dw $0a40, $0ba0, $0160, $0af0, $6565, $0034
dw $0c70, $0c90, $0020, $0c80, $5f66, $0035
dw $0f70, $0f80, $0010, $0f78, $5f67, $0036
dw $0c70, $0c90, $0020, $0c80, $5e66, $0035
dw $0f70, $0f80, $0010, $0f78, $5e67, $0036
dw $0430, $0468, $0038, $044c, $6a6a, $0037
dw $04d8, $04f8, $0020, $04e8, $6a6a, $0038
dw $0688, $06b0, $0028, $069c, $6b6b, $0039

Binary file not shown.

File diff suppressed because one or more lines are too long