diff --git a/BaseClasses.py b/BaseClasses.py index 91bdc097..8698ce0f 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -894,17 +894,6 @@ class Door(object): return '%s' % self.name -class RegionChunk(object): - - def __init__(self): - self.regions = [] - self.outflow = 0 - self.paths_needed = [] - self.chests = 0 - self.entrance = False - self.unlinked_doors = set([]) - - class Sector(object): def __init__(self): diff --git a/DoorShuffle.py b/DoorShuffle.py index 5912f411..90d6e169 100644 --- a/DoorShuffle.py +++ b/DoorShuffle.py @@ -2,13 +2,13 @@ import random import collections import logging -from BaseClasses import RegionType, DoorType, Direction, RegionChunk, Sector, pol_idx -from Dungeons import hyrule_castle_regions, eastern_regions, desert_regions +from BaseClasses import RegionType, DoorType, Direction, Sector, pol_idx +from Dungeons import hyrule_castle_regions, eastern_regions, desert_regions, hera_regions def link_doors(world, player): # Drop-down connections & push blocks - for exitName, regionName in mandatory_connections: + for exitName, regionName in logical_connections: connect_simple_door(world, exitName, regionName, player) # These should all be connected for now as normal connections for edge_a, edge_b in interior_doors: @@ -71,7 +71,7 @@ def create_door_spoiler(world, player): if door_a.type in [DoorType.Normal, DoorType.SpiralStairs]: door_b = door_a.dest if door_b is not None: - logger.info('spoiler: %s connected to %s', door_a.name, door_b.name) + logger.debug('spoiler: %s connected to %s', door_a.name, door_b.name) if not door_a.blocked and not door_b.blocked: world.spoiler.set_door(door_a.name, door_b.name, 'both', player) elif door_a.blocked: @@ -83,21 +83,23 @@ def create_door_spoiler(world, player): if door_b in queue: queue.remove(door_b) else: - logger.info('Door not found in queue: %s connected to %s', door_b.name, door_a.name) + logger.debug('Door not found in queue: %s connected to %s', door_b.name, door_a.name) else: - logger.info('Door not connected: %s', door_a.name) + logger.warning('Door not connected: %s', door_a.name) # some useful functions +oppositemap = { + Direction.South: Direction.North, + Direction.North: Direction.South, + Direction.West: Direction.East, + Direction.East: Direction.West, + Direction.Up: Direction.Down, + Direction.Down: Direction.Up, +} + + def switch_dir(direction): - oppositemap = { - Direction.South: Direction.North, - Direction.North: Direction.South, - Direction.West: Direction.East, - Direction.East: Direction.West, - Direction.Up: Direction.Down, - Direction.Down: Direction.Up, - } return oppositemap[direction] @@ -154,14 +156,16 @@ def connect_one_way(world, entrancename, exitname, player): def within_dungeon(world, player): # TODO: The "starts" regions need access logic - # Aerinon's note: I think this is handled already by ER Rules + # Aerinon's note: I think this is handled already by ER Rules - may need to check correct requirements dungeon_region_starts_es = ['Hyrule Castle Lobby', 'Hyrule Castle West Lobby', 'Hyrule Castle East Lobby', 'Sewers Secret Room'] dungeon_region_starts_ep = ['Eastern Lobby'] dungeon_region_starts_dp = ['Desert Back Lobby', 'Desert Main Lobby', 'Desert West Lobby', 'Desert East Lobby'] + dungeon_region_starts_th = ['Hera Lobby'] dungeon_region_lists = [ (dungeon_region_starts_es, hyrule_castle_regions), (dungeon_region_starts_ep, eastern_regions), - (dungeon_region_starts_dp, desert_regions) + (dungeon_region_starts_dp, desert_regions), + (dungeon_region_starts_th, hera_regions) ] for start_list, region_list in dungeon_region_lists: shuffle_dungeon(world, player, start_list, region_list) @@ -320,7 +324,8 @@ def cross_dungeon(world, player): hc = convert_to_sectors(hyrule_castle_regions, world, player) ep = convert_to_sectors(eastern_regions, world, player) dp = convert_to_sectors(desert_regions, world, player) - world_split = split_up_sectors(hc + ep + dp, default_dungeon_sets) + th = convert_to_sectors(hera_regions, world, player) + world_split = split_up_sectors(hc + ep + dp + th, default_dungeon_sets) dp_split = split_up_sectors(world_split.pop(2), desert_default_entrance_sets) world_split.extend(dp_split) # todo - adjust dungeon item pools @@ -332,7 +337,8 @@ def experiment(world, player): hc = convert_to_sectors(hyrule_castle_regions, world, player) ep = convert_to_sectors(eastern_regions, world, player) dp = convert_to_sectors(desert_regions, world, player) - dungeon_sectors = [hc, ep] + th = convert_to_sectors(hera_regions, world, player) + dungeon_sectors = [hc, ep, th] dp_split = split_up_sectors(dp, desert_default_entrance_sets) dungeon_sectors.extend(dp_split) for sector_list in dungeon_sectors: @@ -461,11 +467,10 @@ def find_proposal_monte_carlo(proposal, buckets, candidates): collisions = 0 while collisions < 10000: + hash = '' for i in range(n): proposal[i] = random.randrange(k) - hash = '' - for value in proposal: - hash = hash + str(value) + hash = hash + str(proposal[i]) if hash not in hashes: collisions = 0 if is_proposal_valid(proposal, buckets, candidates): @@ -650,35 +655,13 @@ def are_there_outstanding_doors_of_type(door_a, door_b, sector_a, sector_b, avai # DATA GOES DOWN HERE -mandatory_connections = [ +logical_connections = [ ('Hyrule Dungeon North Abyss Catwalk Dropdown', 'Hyrule Dungeon North Abyss'), ('Sewers Secret Room Push Block', 'Sewers Secret Room Blocked Path'), - ('Eastern Hint Tile Push Block', 'Eastern Compass Area') + ('Eastern Hint Tile Push Block', 'Eastern Compass Area'), + ('Hera Big Chest Landing Exit', 'Hera 4F') ] -# todo: these path rules are more complicated I think... -# there may be a better way to do them if we randomize dungeon entrances -dungeon_paths = { - 'Hyrule Castle': [('Hyrule Castle Lobby', 'Hyrule Castle West Lobby'), - ('Hyrule Castle Lobby', 'Hyrule Castle East Lobby'), - ('Hyrule Castle Lobby', 'Hyrule Dungeon Cellblock'), # just for standard mode? - ('Hyrule Dungeon Cellblock', 'Sanctuary')], # again, standard mode? - 'Eastern Palace': [('Eastern Lobby', 'Eastern Boss')], - 'Desert Palace': [('Desert Main Lobby', 'Desert West Lobby'), - ('Desert Main Lobby', 'Desert East Lobby'), - ('Desert Back Lobby', 'Desert Boss')], # or Desert Main Lobby to Desert Boss would be fine I guess - 'Tower of Hera': [], - 'Agahnims Tower': [], - 'Palace of Darkness': [], - 'Thieves Town': [], - 'Skull Woods': [], - 'Swamp Palace': [], - 'Ice Palace': [], - 'Misery Mire': [], - 'Turtle Rock': [], - 'Ganons Tower': [] -} - spiral_staircases = [ ('Hyrule Castle Back Hall Down Stairs', 'Hyrule Dungeon Map Room Up Stairs'), ('Hyrule Dungeon Armory Down Stairs', 'Hyrule Dungeon Staircase Up Stairs'), @@ -686,7 +669,13 @@ spiral_staircases = [ ('Sewers Behind Tapestry Down Stairs', 'Sewers Rope Room Up Stairs'), ('Sewers Secret Room Up Stairs', 'Sewers Pull Switch Down Stairs'), ('Eastern Darkness Up Stairs', 'Eastern Attic Start Down Stairs'), - ('Desert Tiles 1 Up Stairs', 'Desert Bridge Down Stairs') + ('Desert Tiles 1 Up Stairs', 'Desert Bridge Down Stairs'), + ('Hera Lobby Down Stairs', 'Hera Basement Cage Up Stairs'), + ('Hera Lobby Key Stairs', 'Hera Tile Room Up Stairs'), + ('Hera Lobby Up Stairs', 'Hera Beetles Down Stairs'), + ('Hera Startile Wide Up Stairs', 'Hera 4F Down Stairs'), + ('Hera 4F Up Stairs', 'Hera 5F Down Stairs'), + ('Hera 5F Up Stairs', 'Hera Boss Down Stairs'), ] straight_staircases = [ @@ -709,10 +698,27 @@ open_edges = [ ('Desert Sandworm Corner E Edge', 'Desert West Wing N Edge') ] -falldown_pits = [('Eastern Courtyard Potholes', 'Eastern Fairies')] +falldown_pits = [ + ('Eastern Courtyard Potholes', 'Eastern Fairies'), + ('Hera Beetles Holes', 'Hera Lobby'), + ('Hera Startile Corner Holes', 'Hera Lobby'), + ('Hera Startile Wide Holes', 'Hera Lobby'), + ('Hera 4F Holes', 'Hera Lobby'), # failed bomb jump + ('Hera Big Chest Landing Holes', 'Hera Startile Wide'), # the other holes near big chest + ('Hera 5F Star Hole', 'Hera Big Chest Landing'), + ('Hera 5F Pothole Chain', 'Hera Fairies'), + ('Hera 5F Normal Holes', 'Hera 4F'), + ('Hera Boss Outer Hole', 'Hera 5F'), + ('Hera Boss Inner Hole', 'Hera 4F'), +] + falldown_pits_as_doors = [('Eastern Courtyard Potholes', 'Eastern Fairy Landing')] -dungeon_warps = [('Eastern Fairies\' Warp', 'Eastern Courtyard')] +dungeon_warps = [ + ('Eastern Fairies\' Warp', 'Eastern Courtyard'), + ('Hera Fairies\' Warp', 'Hera 5F') +] + dungeon_warps_as_doors = [('Eastern Fairies\' Warp', 'Eastern Courtyard Warp End')] interior_doors = [ @@ -730,6 +736,10 @@ interior_doors = [ ('Desert Bridge SW', 'Desert Four Statues NW'), ('Desert Four Statues ES', 'Desert Beamos Hall WS',), ('Desert Tiles 2 NE', 'Desert Wall Slide SE'), + ('Hera Tile Room EN', 'Hera Tridorm WN'), + ('Hera Tridorm SE', 'Hera Torches NE'), + ('Hera Beetles WS', 'Hera Startile Corner ES'), + ('Hera Startile Corner NW', 'Hera Startile Wide SW'), ] key_doors = [ @@ -743,7 +753,9 @@ key_doors = [ ('Desert Tiles 1 Up Stairs', 'Desert Bridge Down Stairs'), ('Desert Beamos Hall NE', 'Desert Tiles 2 SE'), ('Desert Tiles 2 NE', 'Desert Wall Slide SE'), - ('Desert Wall Slide NW', 'Desert Boss SW') + ('Desert Wall Slide NW', 'Desert Boss SW'), + ('Hera Lobby Key Stairs', 'Hera Tile Room Up Stairs'), + ('Hera Startile Corner NW', 'Hera Startile Wide SW'), ] default_door_connections = [ @@ -783,51 +795,36 @@ default_one_way_connections = [ ('Desert Wall Slide NW', 'Desert Boss SW') ] -experimental_connections = [('Eastern Boss SE', 'Eastern Eyegores NE'), - ('Eastern Eyegores ES', 'Eastern Map Valley WN'), - ('Eastern Lobby N', 'Eastern Courtyard Ledge S'), - ('Eastern Big Key EN', 'Eastern Courtyard Ledge W'), - ('Eastern Big Key NE', 'Eastern Compass Area SW'), - ('Eastern Compass Area EN', 'Eastern Courtyard WN'), - ('Eastern Courtyard N', 'Eastern Map Valley SW'), - ('Eastern Courtyard EN', 'Eastern Map Area W'), - - - ('Hyrule Castle Lobby W', 'Hyrule Castle Back Hall E'), - ('Hyrule Castle Throne Room N', 'Sewers Behind Tapestry S'), - ('Hyrule Castle Lobby WN', 'Hyrule Castle West Lobby EN'), - ('Hyrule Castle West Lobby N', 'Eastern Cannonball S'), - - ('Hyrule Castle Lobby E', 'Sewers Water W'), - ('Sewers Dark Cross Key Door S', 'Sanctuary N')] - -# experimental_connections = [('Eastern Boss SE', 'Eastern Courtyard N'), -# ('Eastern Courtyard EN', 'Eastern Attic Switches WS'), -# ('Eastern Lobby N', 'Eastern Darkness S'), -# ('Eastern Courtyard WN', 'Eastern Compass Area E'), -# ('Eastern Attic Switches ES', 'Eastern Cannonball Ledge WN'), -# ('Eastern Compass Area EN', 'Hyrule Castle Back Hall W'), -# ('Hyrule Castle Back Hall E', 'Eastern Map Area W'), -# ('Eastern Attic Start WS', 'Eastern Cannonball Ledge Key Door EN'), -# ('Eastern Compass Area SW', 'Hyrule Dungeon Guardroom N'), -# ('Hyrule Castle East Lobby NW', 'Hyrule Castle East Hall SW'), -# ('Hyrule Castle East Lobby N', 'Eastern Courtyard Ledge S'), -# ('Hyrule Castle Lobby E', 'Eastern Courtyard Ledge W'), -# ('Hyrule Castle Lobby WN', 'Eastern Courtyard Ledge E'), -# ('Hyrule Castle West Lobby EN', 'Hyrule Castle East Lobby W'), -# ('Hyrule Castle Throne Room N', 'Hyrule Castle East Hall S'), -# ('Hyrule Castle West Lobby E', 'Hyrule Castle East Hall W'), -# ('Hyrule Castle West Lobby N', 'Hyrule Dungeon Armory S'), -# ('Hyrule Castle Lobby W', 'Hyrule Castle West Hall E'), -# ('Hyrule Castle West Hall S', 'Sanctuary N')] - +# todo: these path rules are more complicated I think... +# there may be a better way to do them if we randomize dungeon entrances +dungeon_paths = { + 'Hyrule Castle': [('Hyrule Castle Lobby', 'Hyrule Castle West Lobby'), + ('Hyrule Castle Lobby', 'Hyrule Castle East Lobby'), + ('Hyrule Castle Lobby', 'Hyrule Dungeon Cellblock'), # just for standard mode? + ('Hyrule Dungeon Cellblock', 'Sanctuary')], # again, standard mode? + 'Eastern Palace': [('Eastern Lobby', 'Eastern Boss')], + 'Desert Palace': [('Desert Main Lobby', 'Desert West Lobby'), + ('Desert Main Lobby', 'Desert East Lobby'), + ('Desert Back Lobby', 'Desert Boss')], # or Desert Main Lobby to Desert Boss would be fine I guess + 'Tower of Hera': [], + 'Agahnims Tower': [], + 'Palace of Darkness': [], + 'Thieves Town': [], + 'Skull Woods': [], + 'Swamp Palace': [], + 'Ice Palace': [], + 'Misery Mire': [], + 'Turtle Rock': [], + 'Ganons Tower': [] +} # For crossed default_dungeon_sets = [ ['Hyrule Castle Lobby', 'Hyrule Castle West Lobby', 'Hyrule Castle East Lobby', 'Sewers Secret Room', 'Sanctuary', 'Hyrule Dungeon Cellblock'], ['Eastern Lobby', 'Eastern Boss'], - ['Desert Back Lobby', 'Desert Boss', 'Desert Main Lobby', 'Desert West Lobby', 'Desert East Lobby'] + ['Desert Back Lobby', 'Desert Boss', 'Desert Main Lobby', 'Desert West Lobby', 'Desert East Lobby'], + ['Hera Lobby', 'Hera Boss'] ] diff --git a/Doors.py b/Doors.py index 7c6fd890..502dd19b 100644 --- a/Doors.py +++ b/Doors.py @@ -53,6 +53,7 @@ def create_doors(world, player): small_key(create_dir_door(player, 'Hyrule Dungeon North Abyss Key Door N', DoorType.Interior, Direction.North, 0x72, Mid, High)), create_dir_door(player, 'Hyrule Dungeon North Abyss South Edge', DoorType.Open, Direction.South, 0x72, None, Low), create_dir_door(player, 'Hyrule Dungeon North Abyss Catwalk Edge', DoorType.Open, Direction.South, 0x72, None, High), + create_door(player, 'Hyrule Dungeon North Abyss Catwalk Dropdown', DoorType.Logical), create_dir_door(player, 'Hyrule Dungeon South Abyss North Edge', DoorType.Open, Direction.North, 0x82, None, Low), create_dir_door(player, 'Hyrule Dungeon South Abyss West Edge', DoorType.Open, Direction.West, 0x82, None, Low), create_dir_door(player, 'Hyrule Dungeon South Abyss Catwalk North Edge', DoorType.Open, Direction.North, 0x82, None, High), @@ -80,6 +81,7 @@ def create_doors(world, player): create_dir_door(player, 'Sewers Key Rat E', DoorType.Normal, Direction.East, 0x21, Bot, High), small_key(create_dir_door(player, 'Sewers Key Rat Key Door N', DoorType.Normal, Direction.North, 0x21, Right, High)), small_key(create_dir_door(player, 'Sewers Secret Room Key Door S', DoorType.Normal, Direction.South, 0x11, Right, High)), + create_door(player, 'Sewers Secret Room Push Block', DoorType.Logical), create_spiral_stairs(player, 'Sewers Secret Room Up Stairs', DoorType.SpiralStairs, Direction.Up, 0x11, 0, LTH, S, 0x33, 0x6c, True), create_spiral_stairs(player, 'Sewers Pull Switch Down Stairs', DoorType.SpiralStairs, Direction.Down, 0x02, 0, HTL, S, 0x12, 0x80), trap(toggle(create_dir_door(player, 'Sewers Pull Switch S', DoorType.Normal, Direction.South, 0x02, Mid, Low)), 0x2), @@ -99,6 +101,7 @@ def create_doors(world, player): create_dir_door(player, 'Eastern Compass Area E', DoorType.Normal, Direction.East, 0xa8, Mid, High), create_dir_door(player, 'Eastern Compass Area EN', DoorType.Normal, Direction.East, 0xa8, Top, Low), ugly_door(small_key(create_dir_door(player, 'Eastern Compass Area SW', DoorType.Normal, Direction.South, 0xa8, Right, High))), + create_door(player, 'Eastern Hint Tile Push Block', DoorType.Logical), create_dir_door(player, 'Eastern Courtyard WN', DoorType.Normal, Direction.West, 0xa9, Top, Low), create_dir_door(player, 'Eastern Courtyard EN', DoorType.Normal, Direction.East, 0xa9, Top, Low), big_key(create_dir_door(player, 'Eastern Courtyard N', DoorType.Normal, Direction.North, 0xa9, Mid, High)), @@ -173,8 +176,45 @@ def create_doors(world, player): small_key(create_dir_door(player, 'Desert Tiles 2 SE', DoorType.Normal, Direction.South, 0x43, Right, High)), create_dir_door(player, 'Desert Tiles 2 NE', DoorType.Interior, Direction.North, 0x43, Right, High), create_dir_door(player, 'Desert Wall Slide SE', DoorType.Interior, Direction.South, 0x43, Right, High), + # todo: we need a new flag for a door that has a wall on it - you have to traverse it one particular way first + # the above is not a problem until we get to crossed mode big_key(create_dir_door(player, 'Desert Wall Slide NW', DoorType.Normal, Direction.North, 0x43, Left, High)), trap(blocked(create_dir_door(player, 'Desert Boss SW', DoorType.Normal, Direction.South, 0x33, Left, High)), 0x2), + + # Hera + create_spiral_stairs(player, 'Hera Lobby Down Stairs', DoorType.SpiralStairs, Direction.Down, 0x77, 0, HTL, Z, 0x21, 0x90), + small_key(create_spiral_stairs(player, 'Hera Lobby Key Stairs', DoorType.SpiralStairs, Direction.Down, 0x77, 0, HTL, A, 0x12, 0x80)), + create_spiral_stairs(player, 'Hera Lobby Up Stairs', DoorType.SpiralStairs, Direction.Up, 0x77, 0, HTL, X, 0x2b, 0x5c), + create_spiral_stairs(player, 'Hera Basement Cage Up Stairs', DoorType.SpiralStairs, Direction.Up, 0x87, 0, LTH, Z, 0x42, 0x7c), + create_spiral_stairs(player, 'Hera Tile Room Up Stairs', DoorType.SpiralStairs, Direction.Up, 0x87, 0, LTH, A, 0x32, 0x6c), + create_dir_door(player, 'Hera Tile Room EN', DoorType.Interior, Direction.East, 0x87, Top, High), + create_dir_door(player, 'Hera Tridorm WN', DoorType.Interior, Direction.West, 0x87, Top, High), + create_dir_door(player, 'Hera Tridorm SE', DoorType.Interior, Direction.South, 0x87, Right, High), + create_dir_door(player, 'Hera Torches NE', DoorType.Interior, Direction.North, 0x87, Right, High), + create_spiral_stairs(player, 'Hera Beetles Down Stairs', DoorType.SpiralStairs, Direction.Down, 0x31, 0, LTH, X, 0x3a, 0x70), + create_dir_door(player, 'Hera Beetles WS', DoorType.Interior, Direction.West, 0x31, Bot, High), + create_door(player, 'Hera Beetles Holes', DoorType.Hole), + create_dir_door(player, 'Hera Startile Corner ES', DoorType.Interior, Direction.East, 0x31, Bot, High), + big_key(create_dir_door(player, 'Hera Startile Corner NW', DoorType.Interior, Direction.North, 0x31, Left, High)), + create_door(player, 'Hera Startile Corner Holes', DoorType.Hole), + # technically ugly but causes lots of failures in basic + create_dir_door(player, 'Hera Startile Wide SW', DoorType.Interior, Direction.South, 0x31, Left, High), + create_spiral_stairs(player, 'Hera Startile Wide Up Stairs', DoorType.SpiralStairs, Direction.Up, 0x31, 0, HTH, S, 0x6b, 0xac), + create_door(player, 'Hera Startile Wide Holes', DoorType.Hole), + create_spiral_stairs(player, 'Hera 4F Down Stairs', DoorType.SpiralStairs, Direction.Down, 0x27, 0, HTH, S, 0x62, 0xc0), + create_spiral_stairs(player, 'Hera 4F Up Stairs', DoorType.SpiralStairs, Direction.Up, 0x27, 0, HTH, A, 0x6b, 0x2c), + create_door(player, 'Hera 4F Holes', DoorType.Hole), + create_door(player, 'Hera Big Chest Landing Exit', DoorType.Logical), + create_door(player, 'Hera Big Chest Landing Holes', DoorType.Hole), + create_spiral_stairs(player, 'Hera 5F Down Stairs', DoorType.SpiralStairs, Direction.Down, 0x17, 0, HTH, A, 0x62, 0x40), + create_spiral_stairs(player, 'Hera 5F Up Stairs', DoorType.SpiralStairs, Direction.Up, 0x17, 0, HTH, S, 0x6a, 0x9c), + create_door(player, 'Hera 5F Star Hole', DoorType.Hole), + create_door(player, 'Hera 5F Pothole Chain', DoorType.Hole), + create_door(player, 'Hera 5F Normal Holes', DoorType.Hole), + create_door(player, 'Hera Fairies\' Warp', DoorType.Warp), + create_spiral_stairs(player, 'Hera Boss Down Stairs', DoorType.SpiralStairs, Direction.Down, 0x07, 0, HTH, S, 0x61, 0xb0), + create_door(player, 'Hera Boss Outer Hole', DoorType.Hole), + create_door(player, 'Hera Boss Inner Hole', DoorType.Hole), ] diff --git a/Dungeons.py b/Dungeons.py index 88b5b79c..afa24ed6 100644 --- a/Dungeons.py +++ b/Dungeons.py @@ -18,9 +18,9 @@ def create_dungeons(world, player): ES = make_dungeon('Hyrule Castle', None, hyrule_castle_regions, None, [ItemFactory('Small Key (Escape)', player)], [ItemFactory('Map (Escape)', player)]) EP = make_dungeon('Eastern Palace', 'Armos Knights', eastern_regions, ItemFactory('Big Key (Eastern Palace)', player), [], ItemFactory(['Map (Eastern Palace)', 'Compass (Eastern Palace)'], player)) DP = make_dungeon('Desert Palace', 'Lanmolas', desert_regions, ItemFactory('Big Key (Desert Palace)', player), [ItemFactory('Small Key (Desert Palace)', player)], ItemFactory(['Map (Desert Palace)', 'Compass (Desert Palace)'], player)) + ToH = make_dungeon('Tower of Hera', 'Moldorm', hera_regions, ItemFactory('Big Key (Tower of Hera)', player), [ItemFactory('Small Key (Tower of Hera)', player)], ItemFactory(['Map (Tower of Hera)', 'Compass (Tower of Hera)'], player)) #still standard dungeons - ToH = make_dungeon('Tower of Hera', 'Moldorm', ['Tower of Hera (Bottom)', 'Tower of Hera (Basement)', 'Tower of Hera (Top)'], ItemFactory('Big Key (Tower of Hera)', player), [ItemFactory('Small Key (Tower of Hera)', player)], ItemFactory(['Map (Tower of Hera)', 'Compass (Tower of Hera)'], player)) PoD = make_dungeon('Palace of Darkness', 'Helmasaur King', ['Palace of Darkness (Entrance)', 'Palace of Darkness (Center)', 'Palace of Darkness (Big Key Chest)', 'Palace of Darkness (Bonk Section)', 'Palace of Darkness (North)', 'Palace of Darkness (Maze)', 'Palace of Darkness (Harmless Hellway)', 'Palace of Darkness (Final Section)'], ItemFactory('Big Key (Palace of Darkness)', player), ItemFactory(['Small Key (Palace of Darkness)'] * 6, player), ItemFactory(['Map (Palace of Darkness)', 'Compass (Palace of Darkness)'], player)) TT = make_dungeon('Thieves Town', 'Blind', ['Thieves Town (Entrance)', 'Thieves Town (Deep)', 'Blind Fight'], ItemFactory('Big Key (Thieves Town)', player), [ItemFactory('Small Key (Thieves Town)', player)], ItemFactory(['Map (Thieves Town)', 'Compass (Thieves Town)'], player)) SW = make_dungeon('Skull Woods', 'Mothula', ['Skull Woods Final Section (Entrance)', 'Skull Woods First Section', 'Skull Woods Second Section', 'Skull Woods Second Section (Drop)', 'Skull Woods Final Section (Mothula)', 'Skull Woods First Section (Right)', 'Skull Woods First Section (Left)', 'Skull Woods First Section (Top)'], ItemFactory('Big Key (Skull Woods)', player), ItemFactory(['Small Key (Skull Woods)'] * 2, player), ItemFactory(['Map (Skull Woods)', 'Compass (Skull Woods)'], player)) @@ -191,3 +191,9 @@ desert_regions = [ 'Desert West Lobby', 'Desert Back Lobby', 'Desert Tiles 1', 'Desert Bridge', 'Desert Four Statues', 'Desert Beamos Hall', 'Desert Tiles 2', 'Desert Wall Slide', 'Desert Boss', ] + +hera_regions = [ + 'Hera Lobby', 'Hera Basement Cage', 'Hera Tile Room', 'Hera Tridorm', 'Hera Torches', 'Hera Beetles', + 'Hera Startile Corner', 'Hera Startile Wide', 'Hera 4F', 'Hera Big Chest Landing', 'Hera 5F', + 'Hera Fairies', 'Hera Boss' +] diff --git a/EntranceShuffle.py b/EntranceShuffle.py index 51373849..dd265d97 100644 --- a/EntranceShuffle.py +++ b/EntranceShuffle.py @@ -2867,8 +2867,6 @@ mandatory_connections = [('Lake Hylia Central Island Pier', 'Lake Hylia Central ('Death Mountain (Top)', 'Death Mountain (Top)'), ('Death Mountain Drop', 'Death Mountain'), ('Spectacle Rock Drop', 'Death Mountain (Top)'), - ('Tower of Hera Small Key Door', 'Tower of Hera (Basement)'), - ('Tower of Hera Big Key Door', 'Tower of Hera (Top)'), ('Top of Pyramid', 'East Dark World'), ('Dark Lake Hylia Drop (East)', 'Dark Lake Hylia'), @@ -3034,8 +3032,6 @@ inverted_mandatory_connections = [('Lake Hylia Central Island Pier', 'Lake Hylia ('East Death Mountain (Top)', 'East Death Mountain (Top)'), ('Death Mountain (Top)', 'Death Mountain (Top)'), ('Death Mountain Drop', 'Death Mountain'), - ('Tower of Hera Small Key Door', 'Tower of Hera (Basement)'), - ('Tower of Hera Big Key Door', 'Tower of Hera (Top)'), ('Dark Lake Hylia Drop (East)', 'Dark Lake Hylia'), ('Dark Lake Hylia Drop (South)', 'Dark Lake Hylia'), ('Dark Lake Hylia Teleporter', 'Dark Lake Hylia'), @@ -3522,7 +3518,7 @@ default_dungeon_connections = [('Desert Palace Entrance (South)', 'Desert Main L ('Eastern Palace', 'Eastern Lobby'), ('Eastern Palace Exit', 'Light World'), - ('Tower of Hera', 'Tower of Hera (Bottom)'), + ('Tower of Hera', 'Hera Lobby'), ('Tower of Hera Exit', 'Death Mountain (Top)'), ('Hyrule Castle Entrance (South)', 'Hyrule Castle Lobby'), diff --git a/Regions.py b/Regions.py index 885dd159..51213064 100644 --- a/Regions.py +++ b/Regions.py @@ -134,9 +134,6 @@ def create_regions(world, player): create_lw_region(player, 'Fairy Ascension Ledge', None, ['Fairy Ascension Ledge Drop', 'Fairy Ascension Cave (Top)']), create_lw_region(player, 'Death Mountain (Top)', ['Ether Tablet'], ['East Death Mountain (Top)', 'Tower of Hera', 'Death Mountain Drop']), create_lw_region(player, 'Spectacle Rock', ['Spectacle Rock'], ['Spectacle Rock Drop']), - create_dungeon_region(player, 'Tower of Hera (Bottom)', 'Tower of Hera', ['Tower of Hera - Basement Cage', 'Tower of Hera - Map Chest'], ['Tower of Hera Small Key Door', 'Tower of Hera Big Key Door', 'Tower of Hera Exit']), - create_dungeon_region(player, 'Tower of Hera (Basement)', 'Tower of Hera', ['Tower of Hera - Big Key Chest']), - create_dungeon_region(player, 'Tower of Hera (Top)', 'Tower of Hera', ['Tower of Hera - Compass Chest', 'Tower of Hera - Big Chest', 'Tower of Hera - Boss', 'Tower of Hera - Prize']), create_dw_region(player, 'East Dark World', ['Pyramid'], ['Pyramid Fairy', 'South Dark World Bridge', 'Palace of Darkness', 'Dark Lake Hylia Drop (East)', 'Dark Lake Hylia Teleporter', 'Hyrule Castle Ledge Mirror Spot', 'Dark Lake Hylia Fairy', 'Palace of Darkness Hint', 'East Dark World Hint', 'Pyramid Hole', 'Northeast Dark World Broken Bridge Pass']), @@ -361,6 +358,23 @@ def create_regions(world, player): create_dungeon_region(player, 'Desert Wall Slide', 'Desert Palace', None, ['Desert Wall Slide SE', 'Desert Wall Slide NW']), create_dungeon_region(player, 'Desert Boss', 'Desert Palace', ['Desert Palace - Boss', 'Desert Palace - Prize'], ['Desert Boss SW']), + # Hera + create_dungeon_region(player, 'Hera Lobby', 'Tower of Hera', ['Tower of Hera - Map Chest'], ['Hera Lobby Down Stairs', 'Hera Lobby Key Stairs', 'Hera Lobby Up Stairs', 'Tower of Hera Exit']), + create_dungeon_region(player, 'Hera Basement Cage', 'Tower of Hera', ['Tower of Hera - Basement Cage'], ['Hera Basement Cage Up Stairs']), + create_dungeon_region(player, 'Hera Tile Room', 'Tower of Hera', None, ['Hera Tile Room Up Stairs', 'Hera Tile Room EN']), + create_dungeon_region(player, 'Hera Tridorm', 'Tower of Hera', None, ['Hera Tridorm WN', 'Hera Tridorm SE']), + create_dungeon_region(player, 'Hera Torches', 'Tower of Hera', ['Tower of Hera - Big Key Chest'], ['Hera Torches NE']), + create_dungeon_region(player, 'Hera Beetles', 'Tower of Hera', None, ['Hera Beetles Down Stairs', 'Hera Beetles WS', 'Hera Beetles Holes']), + create_dungeon_region(player, 'Hera Startile Corner', 'Tower of Hera', None, ['Hera Startile Corner ES', 'Hera Startile Corner NW', 'Hera Startile Corner Holes']), + create_dungeon_region(player, 'Hera Startile Wide', 'Tower of Hera', None, ['Hera Startile Wide SW', 'Hera Startile Wide Up Stairs', 'Hera Startile Wide Holes']), + create_dungeon_region(player, 'Hera 4F', 'Tower of Hera', ['Tower of Hera - Compass Chest'], ['Hera 4F Down Stairs', 'Hera 4F Up Stairs', 'Hera 4F Holes']), + create_dungeon_region(player, 'Hera Big Chest Landing', 'Tower of Hera', ['Tower of Hera - Big Chest'], ['Hera Big Chest Landing Exit', 'Hera Big Chest Landing Holes']), + create_dungeon_region(player, 'Hera 5F', 'Tower of Hera', None, ['Hera 5F Down Stairs', 'Hera 5F Up Stairs', 'Hera 5F Star Hole', 'Hera 5F Pothole Chain', 'Hera 5F Normal Holes']), + create_dungeon_region(player, 'Hera Fairies', 'Tower of Hera', None, ['Hera Fairies\' Warp']), + create_dungeon_region(player, 'Hera Boss', 'Tower of Hera', ['Tower of Hera - Boss', 'Tower of Hera - Prize'], ['Hera Boss Down Stairs', 'Hera Boss Outer Hole', 'Hera Boss Inner Hole']), + + # AgaTower + # pod # tt # swamp @@ -370,8 +384,7 @@ def create_regions(world, player): # gt # sw - # hera - # AgaTower + ] for region_name, (room_id, shopkeeper, replaceable) in shop_table.items(): diff --git a/Rules.py b/Rules.py index ab9cdd37..e22a1311 100644 --- a/Rules.py +++ b/Rules.py @@ -330,8 +330,8 @@ def global_rules(world, player): for location in ['Desert Palace - Boss', 'Desert Palace - Big Key Chest', 'Desert Palace - Compass Chest']: forbid_item(world.get_location(location, player), 'Small Key (Desert Palace)', player) - set_rule(world.get_entrance('Tower of Hera Small Key Door', player), lambda state: state.has_key('Small Key (Tower of Hera)', player) or item_name(state, 'Tower of Hera - Big Key Chest', player) == ('Small Key (Tower of Hera)', player)) - set_rule(world.get_entrance('Tower of Hera Big Key Door', player), lambda state: state.has('Big Key (Tower of Hera)', player)) + # set_rule(world.get_entrance('Tower of Hera Small Key Door', player), lambda state: state.has_key('Small Key (Tower of Hera)', player) or item_name(state, 'Tower of Hera - Big Key Chest', player) == ('Small Key (Tower of Hera)', player)) + # set_rule(world.get_entrance('Tower of Hera Big Key Door', player), lambda state: state.has('Big Key (Tower of Hera)', player)) set_rule(world.get_location('Tower of Hera - Big Chest', player), lambda state: state.has('Big Key (Tower of Hera)', player)) set_rule(world.get_location('Tower of Hera - Big Key Chest', player), lambda state: state.has_fire_source(player)) if world.accessibility != 'locations':