111 lines
4.7 KiB
Python
111 lines
4.7 KiB
Python
from BaseClasses import RegionType, Entrance
|
|
|
|
def get_mirror_exit_name(from_region, to_region):
|
|
if from_region in mirror_connections and to_region in mirror_connections[from_region]:
|
|
if len(mirror_connections[from_region]) == 1:
|
|
return f'Mirror From {from_region}'
|
|
else:
|
|
return f'Mirror To {to_region}'
|
|
return None
|
|
|
|
def create_mirror_exits(world, player):
|
|
mirror_exits = set()
|
|
for region in (r for r in world.regions if r.player == player and r.name not in ['Zoras Domain', 'Master Sword Meadow', 'Hobo Bridge']):
|
|
if region.type == (RegionType.DarkWorld if world.mode[player] != 'inverted' else RegionType.LightWorld):
|
|
if region.name in mirror_connections:
|
|
for region_dest_name in mirror_connections[region.name]:
|
|
exitname = get_mirror_exit_name(region.name, region_dest_name)
|
|
|
|
assert exitname not in mirror_exits, f'Mirror Exit with name already exists: {exitname}'
|
|
|
|
exit = Entrance(region.player, exitname, region)
|
|
exit.spot_type = 'Mirror'
|
|
to_region = world.get_region(region_dest_name, player)
|
|
# if region.terrain == Terrain.Water or to_region.terrain == Terrain.Water:
|
|
if region.name == 'Dark Lake Hylia Water': # TODO: Uncomment line above when Terrain type is modeled
|
|
exit.access_rule = lambda state: state.has('Flippers', player) and state.has_Pearl(player) and state.has_Mirror(player)
|
|
else:
|
|
exit.access_rule = lambda state: state.has_Mirror(player)
|
|
exit.connect(to_region)
|
|
region.exits.append(exit)
|
|
|
|
mirror_exits.add(exitname)
|
|
|
|
def create_dynamic_exits(world, player):
|
|
create_mirror_exits(world, player)
|
|
world.initialize_regions()
|
|
|
|
|
|
mirror_connections = {
|
|
'Skull Woods Forest (West)': ['Light World'],
|
|
|
|
'West Dark Death Mountain (Bottom)': ['Spectacle Rock'],
|
|
'Dark Death Mountain (Top)': ['East Death Mountain (Top)'],
|
|
|
|
'Dark Death Mountain Floating Island': ['Death Mountain Floating Island'],
|
|
'Dark Death Mountain Ledge': ['Spiral Cave Ledge', 'Mimic Cave Ledge'],
|
|
'Dark Death Mountain Isolated Ledge': ['Fairy Ascension Ledge'],
|
|
'East Dark Death Mountain (Bushes)': ['Fairy Ascension Plateau'],
|
|
'East Dark Death Mountain (Bottom)': ['East Death Mountain (Bottom)'],
|
|
|
|
'Dark Graveyard North': ['Graveyard Ledge', 'Kings Grave Area'],
|
|
|
|
'Bumper Cave Ledge': ['Death Mountain Return Ledge'],
|
|
'Bumper Cave Entrance': ['Death Mountain Entrance'],
|
|
|
|
'Northeast Dark World': ['Potion Shop Area'],
|
|
|
|
'Dark Grassy Lawn': ['Bush Covered Lawn'],
|
|
|
|
'Hammer Peg Area': ['Bat Cave Ledge'],
|
|
|
|
'East Dark World': ['Hyrule Castle Ledge', 'Hyrule Castle Courtyard'],
|
|
|
|
'Dark Desert': ['Desert Ledge', 'Desert Checkerboard Ledge', 'Desert Palace Stairs', 'Desert Palace Entrance (North) Spot'],
|
|
|
|
'South Dark World': ['Maze Race Ledge', 'Cave 45 Ledge', 'Bombos Tablet Ledge'],
|
|
|
|
'Dark Lake Hylia Water': ['Lake Hylia Island'],
|
|
'Dark Lake Hylia Central Island': ['Lake Hylia Central Island'],
|
|
|
|
'Southeast Dark World': ['Light World'],
|
|
|
|
|
|
'Light World': ['Skull Woods Forest (West)', 'West Dark World', 'Hammer Peg Area', 'East Dark World', 'South Dark World', 'Dark Desert', 'Southeast Dark World'],
|
|
|
|
'West Death Mountain (Top)': ['Dark Death Mountain (Top)'],
|
|
'West Death Mountain (Bottom)': ['West Dark Death Mountain (Bottom)'],
|
|
|
|
'East Death Mountain (Top)': ['Dark Death Mountain (Top)'],
|
|
'Death Mountain Floating Island': ['Dark Death Mountain Floating Island'],
|
|
'Spiral Cave Ledge': ['Dark Death Mountain Ledge'],
|
|
'Mimic Cave Ledge': ['Dark Death Mountain Ledge'],
|
|
'Fairy Ascension Ledge': ['Dark Death Mountain Isolated Ledge'],
|
|
'East Death Mountain (Bottom)': ['East Dark Death Mountain (Bottom)'],
|
|
|
|
'Death Mountain Return Ledge': ['Bumper Cave Ledge'],
|
|
'Death Mountain Entrance': ['Bumper Cave Entrance'],
|
|
|
|
'Northeast Light World': ['Catfish Area'],
|
|
|
|
'Graveyard Ledge': ['West Dark World'],
|
|
'Kings Grave Area': ['West Dark World'],
|
|
|
|
'Potion Shop Area': ['Northeast Dark World'],
|
|
|
|
'Bush Covered Lawn': ['Dark Grassy Lawn'],
|
|
'Bomb Hut Area': ['West Dark World'],
|
|
|
|
'Hyrule Castle Secret Entrance Area': ['East Dark World'],
|
|
|
|
'Maze Race Ledge': ['South Dark World'],
|
|
|
|
'Cave 45 Ledge': ['South Dark World'],
|
|
|
|
'Desert Palace Stairs': ['Dark Desert'],
|
|
'Desert Ledge': ['Dark Desert'],
|
|
'Desert Palace Entrance (North) Spot': ['Dark Desert'],
|
|
'Desert Checkerboard Ledge': ['Dark Desert'],
|
|
|
|
'Lake Hylia Central Island': ['Dark Lake Hylia Central Island']
|
|
} |