Merge in some PRs (Ganon hint and Vanilla key logic edit)

This commit is contained in:
aerinon
2020-10-27 11:52:19 -06:00
3 changed files with 61 additions and 37 deletions

17
.github/auto-assign.yml vendored Normal file
View File

@@ -0,0 +1,17 @@
# Set to true to add reviewers to pull requests
addReviewers: true
# Set to true to add assignees to pull requests
addAssignees: true
# A list of reviewers to be added to pull requests (GitHub user name)
reviewers:
- aerinon
# A list of keywords to be skipped the process that add reviewers if pull requests include it
skipKeywords:
- wip
# A number of reviewers added to the pull request
# Set 0 to add all the reviewers (default: 0)
numberOfReviewers: 0

View File

@@ -154,40 +154,21 @@ def vanilla_key_logic(world, player):
world.dungeon_layouts[player][builder.name] = builder world.dungeon_layouts[player][builder.name] = builder
add_inaccessible_doors(world, player) add_inaccessible_doors(world, player)
entrances_map, potentials, connections = determine_entrance_list_vanilla(world, player) for builder in builders:
origin_list = find_accessible_entrances(world, player, default_dungeon_entrances[builder.name])
enabled_entrances = {} start_regions = convert_regions(origin_list, world, player)
sector_queue = deque(builders) doors = convert_key_doors(default_small_key_doors[builder.name], world, player)
last_key, loops = None, 0 key_layout = build_key_layout(builder, start_regions, doors, world, player)
while len(sector_queue) > 0: valid = validate_key_layout(key_layout, world, player)
builder = sector_queue.popleft() if not valid:
logging.getLogger('').warning('Vanilla key layout not valid %s', builder.name)
split_dungeon = builder.name.startswith('Desert Palace') or builder.name.startswith('Skull Woods') builder.key_door_proposal = doors
origin_list = list(entrances_map[builder.name]) if player not in world.key_logic.keys():
find_enabled_origins(builder.sectors, enabled_entrances, origin_list, entrances_map, builder.name) world.key_logic[player] = {}
if len(origin_list) <= 0 or not pre_validate(builder, origin_list, split_dungeon, world, player): analyze_dungeon(key_layout, world, player)
if last_key == builder.name or loops > 1000: world.key_logic[player][builder.name] = key_layout.key_logic
origin_name = world.get_region(origin_list[0], player).entrances[0].parent_region.name if len(origin_list) > 0 else 'no origin' log_key_logic(builder.name, key_layout.key_logic)
raise Exception('Infinite loop detected for "%s" located at %s' % (builder.name, origin_name)) if world.shuffle[player] == 'vanilla' and world.accessibility[player] == 'items' and not world.retro[player]:
sector_queue.append(builder)
last_key = builder.name
loops += 1
else:
find_new_entrances(builder.master_sector, entrances_map, connections, potentials, enabled_entrances, world, player)
start_regions = convert_regions(origin_list, world, player)
doors = convert_key_doors(default_small_key_doors[builder.name], world, player)
key_layout = build_key_layout(builder, start_regions, doors, world, player)
valid = validate_key_layout(key_layout, world, player)
if not valid:
logging.getLogger('').warning('Vanilla key layout not valid %s', builder.name)
builder.key_door_proposal = doors
if player not in world.key_logic.keys():
world.key_logic[player] = {}
analyze_dungeon(key_layout, world, player)
world.key_logic[player][builder.name] = key_layout.key_logic
log_key_logic(builder.name, key_layout.key_logic)
last_key = None
if world.shuffle[player] == 'vanilla' and world.accessibility[player] == 'items' and not world.retro[player] and not world.keydropshuffle[player]:
validate_vanilla_key_logic(world, player) validate_vanilla_key_logic(world, player)
@@ -708,8 +689,7 @@ def main_dungeon_generation(dungeon_builders, recombinant_builders, connections_
combine_layouts(recombinant_builders, dungeon_builders, entrances_map) combine_layouts(recombinant_builders, dungeon_builders, entrances_map)
world.dungeon_layouts[player] = {} world.dungeon_layouts[player] = {}
for builder in dungeon_builders.values(): for builder in dungeon_builders.values():
find_enabled_origins([builder.master_sector], enabled_entrances, builder.layout_starts, entrances_map, builder.name) builder.entrance_list = builder.layout_starts = builder.path_entrances = find_accessible_entrances(world, player, builder.all_entrances)
builder.path_entrances = entrances_map[builder.name]
world.dungeon_layouts[player] = dungeon_builders world.dungeon_layouts[player] = dungeon_builders
@@ -1564,6 +1544,33 @@ def find_inaccessible_regions(world, player):
logger.debug('%s', r) logger.debug('%s', r)
def find_accessible_entrances(world, player, entrances):
if world.mode[player] != 'inverted':
start_regions = ['Links House', 'Sanctuary']
else:
start_regions = ['Inverted Links House', 'Inverted Dark Sanctuary']
regs = convert_regions(start_regions, world, player)
visited_regions = set()
visited_entrances = []
queue = deque(regs)
while len(queue) > 0:
next_region = queue.popleft()
visited_regions.add(next_region)
if world.mode[player] == 'inverted' and next_region.name == 'Tower Agahnim 1':
connect = world.get_region('Hyrule Castle Ledge', player)
if connect not in queue and connect not in visited_regions:
queue.append(connect)
for ext in next_region.exits:
connect = ext.connected_region
if connect is None or ext.door and ext.door.blocked:
continue
if connect.name in entrances:
visited_entrances.append(connect.name)
elif connect and connect not in queue and connect not in visited_regions:
queue.append(connect)
return visited_entrances
def valid_inaccessible_region(r): def valid_inaccessible_region(r):
return r.type is not RegionType.Cave or (len(r.exits) > 0 and r.name not in ['Links House', 'Chris Houlihan Room']) return r.type is not RegionType.Cave or (len(r.exits) > 0 and r.name not in ['Links House', 'Chris Houlihan Room'])

2
Rom.py
View File

@@ -2402,12 +2402,12 @@ HintLocations = ['telepathic_tile_eastern_palace',
InconvenientLocations = ['Spike Cave', InconvenientLocations = ['Spike Cave',
'Sahasrahla', 'Sahasrahla',
'Purple Chest', 'Purple Chest',
'Tower of Hera - Big Key Chest',
'Magic Bat'] 'Magic Bat']
InconvenientDungeonLocations = ['Swamp Left', InconvenientDungeonLocations = ['Swamp Left',
'Mire Left', 'Mire Left',
'Eastern Palace - Big Key Chest', 'Eastern Palace - Big Key Chest',
'Tower of Hera - Big Key Chest',
'Thieves\' Town - Big Chest', 'Thieves\' Town - Big Chest',
'Ice Palace - Big Chest', 'Ice Palace - Big Chest',
'Ganons Tower - Big Chest'] 'Ganons Tower - Big Chest']