Merge branch 'OverworldShuffleDev' into OverworldShuffle

This commit is contained in:
codemann8
2022-11-19 17:03:44 -06:00
13 changed files with 75 additions and 38 deletions

View File

@@ -1546,7 +1546,10 @@ class Entrance(object):
# Destination Pickup OW Only No Ledges Can S&Q Allow Mirror # Destination Pickup OW Only No Ledges Can S&Q Allow Mirror
multi_step_locations = { 'Pyramid Crack': ('Big Bomb', True, True, False, True), multi_step_locations = { 'Pyramid Crack': ('Big Bomb', True, True, False, True),
'Missing Smith': ('Frog', True, False, True, True), 'Missing Smith': ('Frog', True, False, True, True),
'Middle Aged Man': ('Dark Blacksmith Ruins', True, False, True, True) } 'Middle Aged Man': ('Dark Blacksmith Ruins', True, False, True, True),
'Old Man Drop Off': ('Lost Old Man', True, False, False, False),
#'Revealing Light': ('Suspicious Maiden', False, False, False, False) }
}
if self.name in multi_step_locations: if self.name in multi_step_locations:
if self not in state.path: if self not in state.path:
@@ -2750,7 +2753,7 @@ class Spoiler(object):
self.shops = [] self.shops = []
self.bosses = OrderedDict() self.bosses = OrderedDict()
self.suppress_spoiler_locations = ['Big Bomb', 'Dark Blacksmith Ruins', 'Frog', 'Middle Aged Man'] self.suppress_spoiler_locations = ['Big Bomb', 'Frog', 'Dark Blacksmith Ruins', 'Middle Aged Man', 'Lost Old Man', 'Old Man Drop Off']
def set_overworld(self, entrance, exit, direction, player): def set_overworld(self, entrance, exit, direction, player):
if self.world.players == 1: if self.world.players == 1:

View File

@@ -1,5 +1,12 @@
# Changelog # Changelog
## 0.2.11.3
- Fixed error during multiworld generation
- Added proper Old Man pathing to the logic and spoiler playthru
- Removed the delay in spawning sprites when bonking items out of bonk locations
- Removed useless hints in Lite/Lean ER that are already categorically assumed
- Added GT and Links House entrance hints when either are shuffled in the pool
## 0.2.11.2 ## 0.2.11.2
- Implemented proper Districting with Mixed OWR, affecting Hints and District modes - Implemented proper Districting with Mixed OWR, affecting Hints and District modes
- Suppressed item locations in spoiler log that are junk or logical - Suppressed item locations in spoiler log that are junk or logical

View File

@@ -289,7 +289,7 @@ def link_entrances(world, player):
else: else:
caves.append(tuple(random.sample(['Hyrule Castle Exit (South)', 'Hyrule Castle Exit (West)', 'Hyrule Castle Exit (East)'], 3))) caves.append(tuple(random.sample(['Hyrule Castle Exit (South)', 'Hyrule Castle Exit (West)', 'Hyrule Castle Exit (East)'], 3)))
if not world.shuffle_ganon: if not world.shuffle_ganon[player]:
connect_two_way(world, 'Ganons Tower' if not world.is_atgt_swapped(player) else 'Agahnims Tower', 'Ganons Tower Exit', player) connect_two_way(world, 'Ganons Tower' if not world.is_atgt_swapped(player) else 'Agahnims Tower', 'Ganons Tower Exit', player)
else: else:
caves.append('Ganons Tower Exit') caves.append('Ganons Tower Exit')
@@ -362,7 +362,7 @@ def link_entrances(world, player):
else: else:
lw_dungeons.append(tuple(('Hyrule Castle Exit (West)', 'Hyrule Castle Exit (East)', 'Hyrule Castle Exit (South)'))) lw_dungeons.append(tuple(('Hyrule Castle Exit (West)', 'Hyrule Castle Exit (East)', 'Hyrule Castle Exit (South)')))
if not world.shuffle_ganon: if not world.shuffle_ganon[player]:
connect_two_way(world, 'Ganons Tower' if not world.is_atgt_swapped(player) else 'Agahnims Tower', 'Ganons Tower Exit', player) connect_two_way(world, 'Ganons Tower' if not world.is_atgt_swapped(player) else 'Agahnims Tower', 'Ganons Tower Exit', player)
else: else:
dw_dungeons.append('Ganons Tower Exit') dw_dungeons.append('Ganons Tower Exit')
@@ -448,7 +448,7 @@ def link_entrances(world, player):
else: else:
Dungeon_Exits.append(tuple(('Hyrule Castle Exit (West)', 'Hyrule Castle Exit (East)', 'Hyrule Castle Exit (South)'))) Dungeon_Exits.append(tuple(('Hyrule Castle Exit (West)', 'Hyrule Castle Exit (East)', 'Hyrule Castle Exit (South)')))
if not world.shuffle_ganon: if not world.shuffle_ganon[player]:
connect_two_way(world, 'Ganons Tower' if not world.is_atgt_swapped(player) else 'Agahnims Tower', 'Ganons Tower Exit', player) connect_two_way(world, 'Ganons Tower' if not world.is_atgt_swapped(player) else 'Agahnims Tower', 'Ganons Tower Exit', player)
else: else:
Dungeon_Exits.append('Ganons Tower Exit') Dungeon_Exits.append('Ganons Tower Exit')
@@ -498,7 +498,7 @@ def link_entrances(world, player):
else: else:
caves.append(tuple(random.sample(['Hyrule Castle Exit (South)', 'Hyrule Castle Exit (West)', 'Hyrule Castle Exit (East)'], 3))) caves.append(tuple(random.sample(['Hyrule Castle Exit (South)', 'Hyrule Castle Exit (West)', 'Hyrule Castle Exit (East)'], 3)))
if not world.shuffle_ganon: if not world.shuffle_ganon[player]:
connect_two_way(world, 'Ganons Tower' if not world.is_atgt_swapped(player) else 'Agahnims Tower', 'Ganons Tower Exit', player) connect_two_way(world, 'Ganons Tower' if not world.is_atgt_swapped(player) else 'Agahnims Tower', 'Ganons Tower Exit', player)
else: else:
caves.append('Ganons Tower Exit') caves.append('Ganons Tower Exit')
@@ -566,7 +566,7 @@ def link_entrances(world, player):
caves.append('Hyrule Castle Secret Entrance Exit') caves.append('Hyrule Castle Secret Entrance Exit')
caves.append(('Hyrule Castle Exit (South)', 'Hyrule Castle Exit (West)', 'Hyrule Castle Exit (East)')) caves.append(('Hyrule Castle Exit (South)', 'Hyrule Castle Exit (West)', 'Hyrule Castle Exit (East)'))
if not world.shuffle_ganon: if not world.shuffle_ganon[player]:
connect_two_way(world, 'Ganons Tower' if not world.is_atgt_swapped(player) else 'Agahnims Tower', 'Ganons Tower Exit', player) connect_two_way(world, 'Ganons Tower' if not world.is_atgt_swapped(player) else 'Agahnims Tower', 'Ganons Tower Exit', player)
connect_two_way(world, 'Pyramid Entrance' if not world.is_tile_swapped(0x1b, player) else 'Inverted Pyramid Entrance', 'Pyramid Exit', player) connect_two_way(world, 'Pyramid Entrance' if not world.is_tile_swapped(0x1b, player) else 'Inverted Pyramid Entrance', 'Pyramid Exit', player)
connect_entrance(world, 'Pyramid Hole' if not world.is_tile_swapped(0x1b, player) else 'Inverted Pyramid Hole', 'Pyramid', player) connect_entrance(world, 'Pyramid Hole' if not world.is_tile_swapped(0x1b, player) else 'Inverted Pyramid Hole', 'Pyramid', player)
@@ -1036,7 +1036,7 @@ def scramble_holes(world, player):
hole_entrances.append(('Hyrule Castle Secret Entrance Stairs', 'Hyrule Castle Secret Entrance Drop')) hole_entrances.append(('Hyrule Castle Secret Entrance Stairs', 'Hyrule Castle Secret Entrance Drop'))
hole_targets.append(('Hyrule Castle Secret Entrance Exit', 'Hyrule Castle Secret Entrance')) hole_targets.append(('Hyrule Castle Secret Entrance Exit', 'Hyrule Castle Secret Entrance'))
if world.shuffle_ganon: if world.shuffle_ganon[player]:
hole_entrances.append(('Pyramid Entrance', 'Pyramid Hole') if not world.is_tile_swapped(0x1b, player) else ('Inverted Pyramid Entrance', 'Inverted Pyramid Hole')) hole_entrances.append(('Pyramid Entrance', 'Pyramid Hole') if not world.is_tile_swapped(0x1b, player) else ('Inverted Pyramid Entrance', 'Inverted Pyramid Hole'))
hole_targets.append(('Pyramid Exit', 'Pyramid')) hole_targets.append(('Pyramid Exit', 'Pyramid'))
@@ -1078,7 +1078,7 @@ def scramble_holes(world, player):
hole_targets.append(('Sanctuary Exit', 'Sewer Drop')) hole_targets.append(('Sanctuary Exit', 'Sewer Drop'))
# place pyramid hole # place pyramid hole
if not world.shuffle_ganon: if not world.shuffle_ganon[player]:
exit, target = ('Pyramid Exit', 'Pyramid') exit, target = ('Pyramid Exit', 'Pyramid')
if not world.is_tile_swapped(0x1b, player): if not world.is_tile_swapped(0x1b, player):
connect_two_way(world, 'Pyramid Entrance', exit, player) connect_two_way(world, 'Pyramid Entrance', exit, player)
@@ -1112,7 +1112,7 @@ def simple_shuffle_dungeons(world, player):
dungeon_exits = ['Eastern Palace Exit', 'Tower of Hera Exit', 'Agahnims Tower Exit', 'Thieves Town Exit', 'Skull Woods Final Section Exit', 'Palace of Darkness Exit', 'Ice Palace Exit', 'Misery Mire Exit', 'Swamp Palace Exit'] dungeon_exits = ['Eastern Palace Exit', 'Tower of Hera Exit', 'Agahnims Tower Exit', 'Thieves Town Exit', 'Skull Woods Final Section Exit', 'Palace of Darkness Exit', 'Ice Palace Exit', 'Misery Mire Exit', 'Swamp Palace Exit']
if not invFlag: if not invFlag:
if not world.shuffle_ganon: if not world.shuffle_ganon[player]:
connect_two_way(world, 'Ganons Tower', 'Ganons Tower Exit', player) connect_two_way(world, 'Ganons Tower', 'Ganons Tower Exit', player)
else: else:
dungeon_entrances.append('Ganons Tower') dungeon_entrances.append('Ganons Tower')
@@ -1121,7 +1121,7 @@ def simple_shuffle_dungeons(world, player):
at_door = dungeon_exits.pop() at_door = dungeon_exits.pop()
else: else:
dungeon_entrances.append('Ganons Tower') dungeon_entrances.append('Ganons Tower')
if not world.shuffle_ganon: if not world.shuffle_ganon[player]:
at_door = 'Ganons Tower Exit' at_door = 'Ganons Tower Exit'
else: else:
dungeon_exits.append('Ganons Tower Exit') dungeon_exits.append('Ganons Tower Exit')
@@ -1234,7 +1234,7 @@ def full_shuffle_dungeons(world, Dungeon_Exits, player):
# must connect front of hyrule castle to do escape # must connect front of hyrule castle to do escape
connect_two_way(world, 'Hyrule Castle Entrance (South)', 'Hyrule Castle Exit (South)', player) connect_two_way(world, 'Hyrule Castle Entrance (South)', 'Hyrule Castle Exit (South)', player)
if not world.shuffle_ganon: if not world.shuffle_ganon[player]:
connect_two_way(world, 'Ganons Tower' if not world.is_atgt_swapped(player) else 'Agahnims Tower', 'Ganons Tower Exit', player) connect_two_way(world, 'Ganons Tower' if not world.is_atgt_swapped(player) else 'Agahnims Tower', 'Ganons Tower Exit', player)
else: else:
dungeon_exits.append('Ganons Tower Exit') dungeon_exits.append('Ganons Tower Exit')
@@ -2317,6 +2317,7 @@ indirect_connections = {
#'Blacksmith Area': 'Pyramid Fairy', # Hammerpegs #'Blacksmith Area': 'Pyramid Fairy', # Hammerpegs
#'Forgotten Forest Area': 'Pyramid Fairy', # Shield Shop #'Forgotten Forest Area': 'Pyramid Fairy', # Shield Shop
#'Desert Area': 'Pyramid Fairy', # Mire Area #'Desert Area': 'Pyramid Fairy', # Mire Area
'Old Man Drop Off': 'Old Man S&Q',
'Old Man Cave': 'Old Man S&Q' 'Old Man Cave': 'Old Man S&Q'
} }
# format: # format:

View File

@@ -216,6 +216,12 @@ def generate_itempool(world, player):
world.push_item(world.get_location('Agahnim 2', player), ItemFactory('Beat Agahnim 2', player), False) world.push_item(world.get_location('Agahnim 2', player), ItemFactory('Beat Agahnim 2', player), False)
world.get_location('Agahnim 2', player).event = True world.get_location('Agahnim 2', player).event = True
world.get_location('Agahnim 2', player).locked = True world.get_location('Agahnim 2', player).locked = True
world.push_item(world.get_location('Lost Old Man', player), ItemFactory('Escort Old Man', player), False)
world.get_location('Lost Old Man', player).event = True
world.get_location('Lost Old Man', player).locked = True
world.push_item(world.get_location('Old Man Drop Off', player), ItemFactory('Return Old Man', player), False)
world.get_location('Old Man Drop Off', player).event = True
world.get_location('Old Man Drop Off', player).locked = True
world.push_item(world.get_location('Dark Blacksmith Ruins', player), ItemFactory('Pick Up Purple Chest', player), False) world.push_item(world.get_location('Dark Blacksmith Ruins', player), ItemFactory('Pick Up Purple Chest', player), False)
world.get_location('Dark Blacksmith Ruins', player).event = True world.get_location('Dark Blacksmith Ruins', player).event = True
world.get_location('Dark Blacksmith Ruins', player).locked = True world.get_location('Dark Blacksmith Ruins', player).locked = True

View File

@@ -198,6 +198,8 @@ item_table = {'Bow': (True, False, None, 0x0B, 200, 'You have\nchosen the\narche
'Hidden Pits': (True, False, 'Event', 999, None, None, None, None, None, None, None, None), 'Hidden Pits': (True, False, 'Event', 999, None, None, None, None, None, None, None, None),
'Zelda Herself': (True, False, 'Event', 999, None, None, None, None, None, None, None, None), 'Zelda Herself': (True, False, 'Event', 999, None, None, None, None, None, None, None, None),
'Zelda Delivered': (True, False, 'Event', 999, None, None, None, None, None, None, None, None), 'Zelda Delivered': (True, False, 'Event', 999, None, None, None, None, None, None, None, None),
'Escort Old Man': (True, False, 'Event', 999, None, None, None, None, None, None, None, None),
'Return Old Man': (True, False, 'Event', 999, None, None, None, None, None, None, None, None),
'Farmable Bombs': (True, False, 'Event', 999, None, None, None, None, None, None, None, None), 'Farmable Bombs': (True, False, 'Event', 999, None, None, None, None, None, None, None, None),
'Farmable Rupees': (True, False, 'Event', 999, None, None, None, None, None, None, None, None), 'Farmable Rupees': (True, False, 'Event', 999, None, None, None, None, None, None, None, None),
} }

View File

@@ -694,8 +694,7 @@ def copy_world_premature(world, player):
copied_entrance.door = copied_door copied_entrance.door = copied_door
if copied_door: if copied_door:
copied_door.entrance = copied_entrance copied_door.entrance = copied_entrance
for player, portals in world.dungeon_portals.items(): for portal in world.dungeon_portals[player]:
for portal in portals:
connect_portal(portal, ret, player) connect_portal(portal, ret, player)
set_rules(ret, player) set_rules(ret, player)

View File

@@ -1024,6 +1024,7 @@ OWTileRegions = bidict({
'West Death Mountain (Top)': 0x03, 'West Death Mountain (Top)': 0x03,
'Spectacle Rock Ledge': 0x03, 'Spectacle Rock Ledge': 0x03,
'West Death Mountain (Bottom)': 0x03, 'West Death Mountain (Bottom)': 0x03,
'Old Man Drop Off': 0x03,
'East Death Mountain (Top West)': 0x05, 'East Death Mountain (Top West)': 0x05,
'East Death Mountain (Top East)': 0x05, 'East Death Mountain (Top East)': 0x05,
@@ -1553,6 +1554,7 @@ OWExitTypes = {
], ],
'OWTerrain': ['Lost Woods Bush (West)', 'OWTerrain': ['Lost Woods Bush (West)',
'Lost Woods Bush (East)', 'Lost Woods Bush (East)',
'Old Man Drop Off',
'Spectacle Rock Approach', 'Spectacle Rock Approach',
'Spectacle Rock Leave', 'Spectacle Rock Leave',
'DM Hammer Bridge (West)', 'DM Hammer Bridge (West)',

View File

@@ -7,7 +7,7 @@ from OWEdges import OWTileRegions, OWEdgeGroups, OWEdgeGroupsTerrain, OWExitType
from OverworldGlitchRules import create_owg_connections from OverworldGlitchRules import create_owg_connections
from Utils import bidict from Utils import bidict
version_number = '0.2.11.2' version_number = '0.2.11.3'
# branch indicator is intentionally different across branches # branch indicator is intentionally different across branches
version_branch = '' version_branch = ''
@@ -613,7 +613,7 @@ def shuffle_tiles(world, groups, result_list, do_grouped, player):
parity[5] += 1 parity[5] += 1
if 0x1b in group and world.mode[player] != 'standard': if 0x1b in group and world.mode[player] != 'standard':
parity[5] += 1 parity[5] += 1
if 0x1b in group and world.shuffle_ganon: if 0x1b in group and world.shuffle_ganon[player]:
parity[5] -= 1 parity[5] -= 1
group_parity[group[0]] = parity group_parity[group[0]] = parity
@@ -1154,6 +1154,7 @@ mandatory_connections = [# Intra-tile OW Connections
('Lost Woods Bush (East)', 'Lost Woods West Area'), #pearl ('Lost Woods Bush (East)', 'Lost Woods West Area'), #pearl
('West Death Mountain Drop', 'West Death Mountain (Bottom)'), ('West Death Mountain Drop', 'West Death Mountain (Bottom)'),
('Spectacle Rock Drop', 'West Death Mountain (Top)'), ('Spectacle Rock Drop', 'West Death Mountain (Top)'),
('Old Man Drop Off', 'Old Man Drop Off'),
('DM Hammer Bridge (West)', 'East Death Mountain (Top East)'), #hammer ('DM Hammer Bridge (West)', 'East Death Mountain (Top East)'), #hammer
('DM Hammer Bridge (East)', 'East Death Mountain (Top West)'), #hammer ('DM Hammer Bridge (East)', 'East Death Mountain (Top West)'), #hammer
('East Death Mountain Spiral Ledge Drop', 'Spiral Cave Ledge'), ('East Death Mountain Spiral Ledge Drop', 'Spiral Cave Ledge'),

View File

@@ -15,7 +15,8 @@ def create_regions(world, player):
create_lw_region(player, 'Lumberjack Area', None, ['Lumberjack Tree Tree', 'Lumberjack Tree Cave', 'Lumberjack House', 'Dark Lumberjack Mirror Spot', 'Lumberjack WN', 'Lumberjack SW']), create_lw_region(player, 'Lumberjack Area', None, ['Lumberjack Tree Tree', 'Lumberjack Tree Cave', 'Lumberjack House', 'Dark Lumberjack Mirror Spot', 'Lumberjack WN', 'Lumberjack SW']),
create_lw_region(player, 'West Death Mountain (Top)', ['Ether Tablet'], ['Spectacle Rock Approach', 'West Death Mountain Drop', 'Tower of Hera', 'West Dark Death Mountain (Top) Mirror Spot', 'West Death Mountain EN']), create_lw_region(player, 'West Death Mountain (Top)', ['Ether Tablet'], ['Spectacle Rock Approach', 'West Death Mountain Drop', 'Tower of Hera', 'West Dark Death Mountain (Top) Mirror Spot', 'West Death Mountain EN']),
create_lw_region(player, 'Spectacle Rock Ledge', ['Spectacle Rock'], ['Spectacle Rock Leave', 'Spectacle Rock Drop', 'Bubble Boy Mirror Spot']), create_lw_region(player, 'Spectacle Rock Ledge', ['Spectacle Rock'], ['Spectacle Rock Leave', 'Spectacle Rock Drop', 'Bubble Boy Mirror Spot']),
create_lw_region(player, 'West Death Mountain (Bottom)', None, ['Old Man Cave (East)', 'Old Man House (Bottom)', 'Old Man House (Top)', 'Death Mountain Return Cave (East)', 'Spectacle Rock Cave', 'Spectacle Rock Cave Peak', 'Spectacle Rock Cave (Bottom)', 'West Dark Death Mountain (Bottom) Mirror Spot', 'West Death Mountain Teleporter', 'West Death Mountain ES']), create_lw_region(player, 'West Death Mountain (Bottom)', ['Old Man Drop Off'], ['Old Man Drop Off', 'Old Man Cave (East)', 'Old Man House (Bottom)', 'Old Man House (Top)', 'Death Mountain Return Cave (East)', 'Spectacle Rock Cave', 'Spectacle Rock Cave Peak', 'Spectacle Rock Cave (Bottom)', 'West Dark Death Mountain (Bottom) Mirror Spot', 'West Death Mountain Teleporter', 'West Death Mountain ES']),
create_dw_region(player, 'Old Man Drop Off', ['Old Man'], None),
create_lw_region(player, 'East Death Mountain (Top West)', None, ['DM Hammer Bridge (West)', 'East Dark Death Mountain (Top West) Mirror Spot', 'East Death Mountain WN']), create_lw_region(player, 'East Death Mountain (Top West)', None, ['DM Hammer Bridge (West)', 'East Dark Death Mountain (Top West) Mirror Spot', 'East Death Mountain WN']),
create_lw_region(player, 'East Death Mountain (Top East)', None, ['DM Hammer Bridge (East)', 'Floating Island Bridge (East)', 'East Death Mountain Spiral Ledge Drop', 'East Death Mountain Fairy Ledge Drop', 'East Death Mountain Mimic Ledge Drop', 'Paradox Cave (Top)', 'East Dark Death Mountain (Top East) Mirror Spot', 'East Death Mountain EN']), create_lw_region(player, 'East Death Mountain (Top East)', None, ['DM Hammer Bridge (East)', 'Floating Island Bridge (East)', 'East Death Mountain Spiral Ledge Drop', 'East Death Mountain Fairy Ledge Drop', 'East Death Mountain Mimic Ledge Drop', 'Paradox Cave (Top)', 'East Dark Death Mountain (Top East) Mirror Spot', 'East Death Mountain EN']),
create_lw_region(player, 'Spiral Cave Ledge', None, ['Spiral Ledge Drop', 'Spiral Mimic Bridge (West)', 'Spiral Cave', 'TR Ledge (West) Mirror Spot']), create_lw_region(player, 'Spiral Cave Ledge', None, ['Spiral Ledge Drop', 'Spiral Mimic Bridge (West)', 'Spiral Cave', 'TR Ledge (West) Mirror Spot']),
@@ -233,7 +234,7 @@ def create_regions(world, player):
create_cave_region(player, 'Lumberjack Tree (top)', 'a drop\'s exit', ['Lumberjack Tree'], ['Lumberjack Tree (top to bottom)']), create_cave_region(player, 'Lumberjack Tree (top)', 'a drop\'s exit', ['Lumberjack Tree'], ['Lumberjack Tree (top to bottom)']),
create_cave_region(player, 'Lumberjack Tree (bottom)', 'a drop\'s exit', None, ['Lumberjack Tree Exit']), create_cave_region(player, 'Lumberjack Tree (bottom)', 'a drop\'s exit', None, ['Lumberjack Tree Exit']),
create_cave_region(player, 'Lumberjack House', 'a boring house'), create_cave_region(player, 'Lumberjack House', 'a boring house'),
create_cave_region(player, 'Old Man Cave', 'a connector', ['Old Man'], ['Old Man Cave Exit (East)']), create_cave_region(player, 'Old Man Cave', 'a connector', ['Lost Old Man'], ['Old Man Cave Exit (East)']),
create_cave_region(player, 'Old Man Cave Ledge', 'a connector', None, ['Old Man Cave Exit (West)', 'Old Man Cave Dropdown']), create_cave_region(player, 'Old Man Cave Ledge', 'a connector', None, ['Old Man Cave Exit (West)', 'Old Man Cave Dropdown']),
create_cave_region(player, 'Old Man House', 'a connector', None, ['Old Man House Exit (Bottom)', 'Old Man House Front to Back']), create_cave_region(player, 'Old Man House', 'a connector', None, ['Old Man House Exit (Bottom)', 'Old Man House Front to Back']),
create_cave_region(player, 'Old Man House Back', 'a connector', None, ['Old Man House Exit (Top)', 'Old Man House Back to Front']), create_cave_region(player, 'Old Man House Back', 'a connector', None, ['Old Man House Exit (Top)', 'Old Man House Back to Front']),
@@ -1200,7 +1201,7 @@ def adjust_locations(world, player):
for l in ['Ganon', 'Agahnim 1', 'Agahnim 2', 'Dark Blacksmith Ruins', 'Middle Aged Man', for l in ['Ganon', 'Agahnim 1', 'Agahnim 2', 'Dark Blacksmith Ruins', 'Middle Aged Man',
'Frog', 'Missing Smith', 'Floodgate', 'Trench 1 Switch', 'Trench 2 Switch', 'Swamp Drain', 'Frog', 'Missing Smith', 'Floodgate', 'Trench 1 Switch', 'Trench 2 Switch', 'Swamp Drain',
'Attic Cracked Floor', 'Suspicious Maiden', 'Revealing Light', 'Big Bomb', 'Pyramid Crack', 'Attic Cracked Floor', 'Suspicious Maiden', 'Revealing Light', 'Big Bomb', 'Pyramid Crack',
'Ice Block Drop', 'Zelda Pickup', 'Zelda Drop Off', 'Skull Star Tile']: 'Ice Block Drop', 'Lost Old Man', 'Old Man Drop Off', 'Zelda Pickup', 'Zelda Drop Off', 'Skull Star Tile']:
location = world.get_location_unsafe(l, player) location = world.get_location_unsafe(l, player)
if location: if location:
location.type = LocationType.Logical location.type = LocationType.Logical
@@ -1585,6 +1586,8 @@ location_table = {'Mushroom': (0x180013, 0x186338, False, 'in the woods'),
'Ganon': (None, None, False, 'from me'), 'Ganon': (None, None, False, 'from me'),
'Agahnim 1': (None, None, False, 'from Ganon\'s wizardry form'), 'Agahnim 1': (None, None, False, 'from Ganon\'s wizardry form'),
'Agahnim 2': (None, None, False, 'from Ganon\'s wizardry form'), 'Agahnim 2': (None, None, False, 'from Ganon\'s wizardry form'),
'Lost Old Man': (None, None, False, None),
'Old Man Drop Off': (None, None, False, None),
'Floodgate': (None, None, False, None), 'Floodgate': (None, None, False, None),
'Frog': (None, None, False, None), 'Frog': (None, None, False, None),
'Missing Smith': (None, None, False, None), 'Missing Smith': (None, None, False, None),

31
Rom.py
View File

@@ -38,7 +38,7 @@ from source.dungeon.RoomList import Room0127
JAP10HASH = '03a63945398191337e896e5771f77173' JAP10HASH = '03a63945398191337e896e5771f77173'
RANDOMIZERBASEHASH = 'ff9c003ee6c1277437a4480d583282fd' RANDOMIZERBASEHASH = '3954c4e449c908a9e086a1fd5797c98b'
class JsonRom(object): class JsonRom(object):
@@ -2170,7 +2170,7 @@ def write_strings(rom, world, player, team):
# First we take care of the one inconvenient dungeon in the appropriately simple shuffles. # First we take care of the one inconvenient dungeon in the appropriately simple shuffles.
entrances_to_hint = {} entrances_to_hint = {}
entrances_to_hint.update(InconvenientDungeonEntrances) entrances_to_hint.update(InconvenientDungeonEntrances)
if world.shuffle_ganon: if world.shuffle_ganon[player]:
if world.is_atgt_swapped(player): if world.is_atgt_swapped(player):
entrances_to_hint.update({'Agahnims Tower': 'The sealed castle door'}) entrances_to_hint.update({'Agahnims Tower': 'The sealed castle door'})
else: else:
@@ -2183,8 +2183,9 @@ def write_strings(rom, world, player, team):
entrances_to_hint = {} entrances_to_hint = {}
break break
# Now we write inconvenient locations for most shuffles and finish taking care of the less chaotic ones. # Now we write inconvenient locations for most shuffles and finish taking care of the less chaotic ones.
if world.shuffle[player] not in ['lite', 'lean']:
entrances_to_hint.update(InconvenientOtherEntrances) entrances_to_hint.update(InconvenientOtherEntrances)
if world.shuffle[player] in ['vanilla', 'dungeonssimple', 'dungeonsfull']: if world.shuffle[player] in ['vanilla', 'dungeonssimple', 'dungeonsfull', 'lite', 'lean']:
hint_count = 0 hint_count = 0
elif world.shuffle[player] in ['simple', 'restricted', 'restricted_legacy']: elif world.shuffle[player] in ['simple', 'restricted', 'restricted_legacy']:
hint_count = 2 hint_count = 2
@@ -2204,27 +2205,37 @@ def write_strings(rom, world, player, team):
if world.shuffle[player] not in ['simple', 'restricted', 'restricted_legacy']: if world.shuffle[player] not in ['simple', 'restricted', 'restricted_legacy']:
entrances_to_hint.update(ConnectorEntrances) entrances_to_hint.update(ConnectorEntrances)
entrances_to_hint.update(DungeonEntrances) entrances_to_hint.update(DungeonEntrances)
if world.is_atgt_swapped(player): if world.shuffle_ganon[player]:
entrances_to_hint.update({'Agahnims Tower': 'The sealed castle door'})
entrances_to_hint.update({'Ganons Tower': 'The dark mountain tower'})
elif world.is_atgt_swapped(player):
entrances_to_hint.update({'Ganons Tower': 'The dark mountain tower'}) entrances_to_hint.update({'Ganons Tower': 'The dark mountain tower'})
else: else:
entrances_to_hint.update({'Agahnims Tower': 'The sealed castle door'}) entrances_to_hint.update({'Agahnims Tower': 'The sealed castle door'})
elif world.shuffle[player] == 'restricted': elif world.shuffle[player] == 'restricted':
entrances_to_hint.update(ConnectorEntrances) entrances_to_hint.update(ConnectorEntrances)
if world.shuffle[player] in ['lite', 'lean']:
# all inconvenient dungeons + AT/GT stay in hint pool, but the remaining should exclude non-specific connector hints
for entrance in all_entrances:
if entrance.spot_type == 'Entrance' and entrance.connected_region \
and entrance.connected_region.type != RegionType.Dungeon and entrance.name in list(ConnectorEntrances) + list(DungeonEntrances):
entrances_to_hint.pop(entrance.name)
else:
entrances_to_hint.update(ItemEntrances) entrances_to_hint.update(ItemEntrances)
if world.shuffle[player] not in ['lite', 'lean']:
entrances_to_hint.update(ShopEntrances) entrances_to_hint.update(ShopEntrances)
entrances_to_hint.update(OtherEntrances) entrances_to_hint.update(OtherEntrances)
elif world.shopsanity[player]: if world.shuffle[player] not in ['vanilla', 'dungeonssimple', 'dungeonsfull', 'lite', 'lean']:
entrances_to_hint.update(ShopEntrances) if world.shufflelinks[player]:
if world.shuffle[player] not in ['vanilla', 'dungeonssimple', 'dungeonsfull']: entrances_to_hint.update({'Big Bomb Shop': 'The old bomb shop'})
if not world.is_bombshop_start(player): entrances_to_hint.update({'Links House': 'The hero\'s old residence'})
elif not world.is_bombshop_start(player):
entrances_to_hint.update({'Big Bomb Shop': 'The old bomb shop'}) entrances_to_hint.update({'Big Bomb Shop': 'The old bomb shop'})
else: else:
entrances_to_hint.update({'Links House': 'The hero\'s old residence'}) entrances_to_hint.update({'Links House': 'The hero\'s old residence'})
entrances_to_hint.update({'Dark Sanctuary Hint': 'The dark sanctuary cave'}) entrances_to_hint.update({'Dark Sanctuary Hint': 'The dark sanctuary cave'})
if world.shuffle[player] in ['insanity', 'madness_legacy', 'insanity_legacy']: if world.shuffle[player] in ['insanity', 'madness_legacy', 'insanity_legacy']:
entrances_to_hint.update(InsanityEntrances) entrances_to_hint.update(InsanityEntrances)
if world.shuffle_ganon: if world.shuffle_ganon[player]:
if world.is_tile_swapped(0x1b, player): if world.is_tile_swapped(0x1b, player):
entrances_to_hint.update({'Inverted Pyramid Entrance': 'The extra castle passage'}) entrances_to_hint.update({'Inverted Pyramid Entrance': 'The extra castle passage'})
else: else:

View File

@@ -180,7 +180,7 @@ def global_rules(world, player):
#for exit in world.get_region('Flute Sky', player).exits: #for exit in world.get_region('Flute Sky', player).exits:
# exit.hide_path = True # exit.hide_path = True
set_rule(world.get_entrance('Old Man S&Q', player), lambda state: state.can_reach('Old Man', 'Location', player)) set_rule(world.get_entrance('Old Man S&Q', player), lambda state: state.has('Return Old Man', player))
set_rule(world.get_entrance('Flute Spot 1', player), lambda state: state.can_flute(player)) set_rule(world.get_entrance('Flute Spot 1', player), lambda state: state.can_flute(player))
set_rule(world.get_entrance('Flute Spot 2', player), lambda state: state.can_flute(player)) set_rule(world.get_entrance('Flute Spot 2', player), lambda state: state.can_flute(player))
@@ -193,6 +193,8 @@ def global_rules(world, player):
set_rule(world.get_location('Sunken Treasure', player), lambda state: state.has('Open Floodgate', player)) set_rule(world.get_location('Sunken Treasure', player), lambda state: state.has('Open Floodgate', player))
set_rule(world.get_location('Dark Blacksmith Ruins', player), lambda state: state.has('Return Smith', player)) set_rule(world.get_location('Dark Blacksmith Ruins', player), lambda state: state.has('Return Smith', player))
set_rule(world.get_location('Old Man', player), lambda state: state.has('Return Old Man', player))
set_rule(world.get_location('Old Man Drop Off', player), lambda state: state.has('Escort Old Man', player))
set_rule(world.get_location('Middle Aged Man', player), lambda state: state.has('Pick Up Purple Chest', player)) # Can S&Q with chest set_rule(world.get_location('Middle Aged Man', player), lambda state: state.has('Pick Up Purple Chest', player)) # Can S&Q with chest
set_rule(world.get_location('Purple Chest', player), lambda state: state.has('Deliver Purple Chest', player)) # Can S&Q with chest set_rule(world.get_location('Purple Chest', player), lambda state: state.has('Deliver Purple Chest', player)) # Can S&Q with chest
set_rule(world.get_location('Big Bomb', player), lambda state: state.has('Crystal 5', player) and state.has('Crystal 6', player)) set_rule(world.get_location('Big Bomb', player), lambda state: state.has('Crystal 5', player) and state.has('Crystal 6', player))
@@ -1805,7 +1807,7 @@ def set_bunny_rules(world, player, inverted):
'Hookshot Cave (Middle)', 'Pyramid', 'Spiral Cave (Top)', 'Fairy Ascension Cave (Drop)'] 'Hookshot Cave (Middle)', 'Pyramid', 'Spiral Cave (Top)', 'Fairy Ascension Cave (Drop)']
bunny_accessible_locations = ['Link\'s Uncle', 'Sahasrahla', 'Sick Kid', 'Lost Woods Hideout', 'Lumberjack Tree', bunny_accessible_locations = ['Link\'s Uncle', 'Sahasrahla', 'Sick Kid', 'Lost Woods Hideout', 'Lumberjack Tree',
'Checkerboard Cave', 'Potion Shop', 'Spectacle Rock Cave', 'Pyramid', 'Checkerboard Cave', 'Potion Shop', 'Spectacle Rock Cave', 'Pyramid',
'Hype Cave - Generous Guy', 'Peg Cave', 'Bumper Cave Ledge', 'Hype Cave - Generous Guy', 'Peg Cave', 'Bumper Cave Ledge', 'Old Man',
'Frog', 'Missing Smith', 'Dark Blacksmith Ruins', 'Purple Chest', 'Pyramid Crack', 'Big Bomb', 'Frog', 'Missing Smith', 'Dark Blacksmith Ruins', 'Purple Chest', 'Pyramid Crack', 'Big Bomb',
'Spectacle Rock', 'Bombos Tablet', 'Ether Tablet', 'Blacksmith', 'Spectacle Rock', 'Bombos Tablet', 'Ether Tablet', 'Blacksmith',
'Master Sword Pedestal', 'Bottle Merchant', 'Sunken Treasure', 'Desert Ledge', 'Master Sword Pedestal', 'Bottle Merchant', 'Sunken Treasure', 'Desert Ledge',

View File

@@ -632,7 +632,7 @@ OWShuffle:
;offset is (8bytes * OW Slot ID) + (2bytes * direction) ;offset is (8bytes * OW Slot ID) + (2bytes * direction)
asl : rep #$20 : and.w #$00ff : pha : sep #$20 ;2 bytes per direction asl : rep #$20 : and.w #$00ff : pha : sep #$20 ;2 bytes per direction
lda $8a : tax : lda.l OWTileWorldAssoc,X : eor.l CurrentWorld : beq + ldx $8a : lda.l OWTileWorldAssoc,X : eor.l CurrentWorld : beq +
; fake world, will treat this OW area as opposite world ; fake world, will treat this OW area as opposite world
txa : eor.b #$40 : tax txa : eor.b #$40 : tax
+ txa : and #$40 : !add $700 : rep #$30 : and #$00ff : asl #3 + txa : and #$40 : !add $700 : rep #$30 : and #$00ff : asl #3

Binary file not shown.