From 74c515eb166023801366615bfc40b000be863e2a Mon Sep 17 00:00:00 2001 From: compiling <8335770+compiling@users.noreply.github.com> Date: Mon, 20 Jan 2020 22:02:33 +1100 Subject: [PATCH] Handle standard mode, vanilla door shuffle. --- DoorShuffle.py | 39 ++++++++++++++++++++++++++++----------- KeyDoorShuffle.py | 16 ++++++++++------ Regions.py | 3 ++- 3 files changed, 40 insertions(+), 18 deletions(-) diff --git a/DoorShuffle.py b/DoorShuffle.py index 44f39775..915645ff 100644 --- a/DoorShuffle.py +++ b/DoorShuffle.py @@ -118,17 +118,34 @@ def vanilla_key_logic(world, player): overworld_prep(world, player) entrances_map, potentials, connections = determine_entrance_list(world, player) - for builder in builders: - start_regions = convert_regions(entrances_map[builder.name], 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: - raise Exception('Vanilla key layout not valid %s' % builder.name) - 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 + + enabled_entrances = {} + sector_queue = collections.deque(builders) + last_key = None + while len(sector_queue) > 0: + builder = sector_queue.popleft() + + origin_list = list(entrances_map[builder.name]) + find_enabled_origins(builder.sectors, enabled_entrances, origin_list, entrances_map, builder.name) + origin_list_sans_drops = remove_drop_origins(origin_list) + if len(origin_list_sans_drops) <= 0: + if last_key == builder.name: + raise Exception('Infinte loop detected %s' % builder.name) + sector_queue.append(builder) + last_key = builder.name + else: + find_new_entrances(builder.master_sector, 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: + raise Exception('Vanilla key layout not valid %s' % builder.name) + 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 + last_key = None validate_vanilla_key_logic(world, player) diff --git a/KeyDoorShuffle.py b/KeyDoorShuffle.py index 8ac1b4a3..b4c0a81d 100644 --- a/KeyDoorShuffle.py +++ b/KeyDoorShuffle.py @@ -1000,12 +1000,16 @@ def validate_vanilla_key_logic(world, player): def val_hyrule(key_logic, world, player): - val_rule(key_logic.door_rules['Sewers Secret Room Key Door S'], 2) - val_rule(key_logic.door_rules['Sewers Dark Cross Key Door N'], 2) - val_rule(key_logic.door_rules['Hyrule Dungeon Map Room Key Door S'], 2) - # why is allow_small actually false? - because chest key is forced elsewhere? - # val_rule(key_logic.door_rules['Hyrule Dungeon Armory Interior Key Door N'], 3, True, 'Hyrule Castle - Zelda\'s Chest') - val_rule(key_logic.door_rules['Hyrule Dungeon Armory Interior Key Door N'], 4) + if world.mode[player] == 'standard': + val_rule(key_logic.door_rules['Hyrule Dungeon Map Room Key Door S'], 1) + val_rule(key_logic.door_rules['Hyrule Dungeon Armory Interior Key Door N'], 2) + val_rule(key_logic.door_rules['Sewers Dark Cross Key Door N'], 3) + val_rule(key_logic.door_rules['Sewers Key Rat Key Door N'], 4) + else: + val_rule(key_logic.door_rules['Sewers Secret Room Key Door S'], 2) + val_rule(key_logic.door_rules['Sewers Dark Cross Key Door N'], 2) + val_rule(key_logic.door_rules['Hyrule Dungeon Map Room Key Door S'], 2) + val_rule(key_logic.door_rules['Hyrule Dungeon Armory Interior Key Door N'], 4) def val_eastern(key_logic, world, player): diff --git a/Regions.py b/Regions.py index 4ee82b5f..253fda78 100644 --- a/Regions.py +++ b/Regions.py @@ -846,7 +846,8 @@ dungeon_events = [ 'Attic Cracked Floor', 'Suspicious Maiden', 'Revealing Light', - 'Ice Block Drop' + 'Ice Block Drop', + 'Zelda Pickup' ] flooded_keys_reverse = {