From 0a8892806e8c1915cfa435ffa9b644427dc25c45 Mon Sep 17 00:00:00 2001 From: compiling <8335770+compiling@users.noreply.github.com> Date: Tue, 21 Jan 2020 23:39:43 +1100 Subject: [PATCH] Fix some dungeon generation errors: TR fails if the Big Chest entrance is locked behind another dungeon Hyrule Castle fails if the only available entrance is Sanctuary --- DoorShuffle.py | 4 ++-- DungeonGenerator.py | 19 +++++++++++++++++++ Dungeons.py | 2 +- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/DoorShuffle.py b/DoorShuffle.py index b6f2069f..ba7c82eb 100644 --- a/DoorShuffle.py +++ b/DoorShuffle.py @@ -13,7 +13,7 @@ from Dungeons import dungeon_regions, region_starts, split_region_starts, flexib from Dungeons import drop_entrances, dungeon_bigs, dungeon_keys from Items import ItemFactory from RoomData import DoorKind, PairedDoor -from DungeonGenerator import ExplorationState, convert_regions, generate_dungeon +from DungeonGenerator import ExplorationState, convert_regions, generate_dungeon, validate_tr from DungeonGenerator import create_dungeon_builders, split_dungeon_builder, simple_dungeon_builder from KeyDoorShuffle import analyze_dungeon, validate_vanilla_key_logic, build_key_layout, validate_key_layout @@ -339,7 +339,7 @@ def main_dungeon_generation(dungeon_builders, recombinant_builders, connections_ origin_list = list(builder.entrance_list) find_enabled_origins(builder.sectors, enabled_entrances, origin_list, entrances_map, name) origin_list_sans_drops = remove_drop_origins(origin_list) - if len(origin_list_sans_drops) <= 0: + if len(origin_list_sans_drops) <= 0 or name == "Turtle Rock" and not validate_tr(name, builder.sectors, origin_list_sans_drops, world, player): if last_key == builder.name: raise Exception('Infinte loop detected %s' % builder.name) sector_queue.append(builder) diff --git a/DungeonGenerator.py b/DungeonGenerator.py index 1cedf455..a68b013b 100644 --- a/DungeonGenerator.py +++ b/DungeonGenerator.py @@ -31,6 +31,25 @@ class GraphPiece: self.possible_bk_locations = set() +# Turtle Rock shouldn't be generated until the Big Chest entrance is reachable +def validate_tr(name, available_sectors, entrance_region_names, world, player): + entrance_regions = convert_regions(entrance_region_names, world, player) + proposed_map = {} + doors_to_connect = {} + all_regions = set() + bk_needed = False + bk_special = False + for sector in available_sectors: + for door in sector.outstanding_doors: + doors_to_connect[door.name] = door + all_regions.update(sector.regions) + bk_needed = bk_needed or determine_if_bk_needed(sector, False, world, player) + bk_special = bk_special or check_for_special(sector) + dungeon, hangers, hooks = gen_dungeon_info(name, available_sectors, entrance_regions, proposed_map, + doors_to_connect, bk_needed, bk_special, world, player) + return check_valid(dungeon, hangers, hooks, proposed_map, doors_to_connect, all_regions, bk_needed, False) + + def generate_dungeon(name, available_sectors, entrance_region_names, split_dungeon, world, player): logger = logging.getLogger('') entrance_regions = convert_regions(entrance_region_names, world, player) diff --git a/Dungeons.py b/Dungeons.py index 447ff4a8..dc8f5629 100644 --- a/Dungeons.py +++ b/Dungeons.py @@ -350,7 +350,7 @@ flexible_starts = { } drop_entrances = [ - 'Sewers Rat Path', 'Skull Pinball', 'Skull Left Drop' # Pot circle, Back drop have unique access + 'Sewers Rat Path', 'Skull Pinball', 'Skull Left Drop', 'Sanctuary' # Pot circle, Back drop have unique access ] dungeon_keys = {