From 3b4e19b5dec2061f18e6f6bb49296c2e2049ffeb Mon Sep 17 00:00:00 2001 From: aerinon Date: Fri, 29 May 2020 16:19:32 -0600 Subject: [PATCH] Fixes for compatibility with compiling perf Couple fixes for standard+ER --- BaseClasses.py | 4 ++-- DoorShuffle.py | 10 +++++----- Dungeons.py | 4 ++++ EntranceShuffle.py | 2 +- Main.py | 11 +++++++++-- RELEASENOTES.md | 1 + Rules.py | 2 -- resources/app/cli/args.json | 10 +++++----- 8 files changed, 27 insertions(+), 17 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index 2a99cd0a..fa52809b 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -1787,8 +1787,8 @@ class Spoiler(object): for player in range(1, self.world.players + 1): if self.world.boss_shuffle[player] != 'none': bossmap = self.bosses[player] if self.world.players > 1 else self.bosses - outfile.write(f'\n\nBosses (Player {player}):\n\n') - outfile.write('\n'.join([f'{x}: {y}' for x, y in bossmap.items()])) + outfile.write(f'\n\nBosses ({self.world.get_player_names(player)}):\n\n') + outfile.write('\n'.join([f'{x}: {y}' for x, y in bossmap.items() if y not in ['Agahnim', 'Agahnim 2', 'Ganon']])) # locations: Change up location names; in the instance of a location with multiple sections, it'll try to translate the room name # items: Item names diff --git a/DoorShuffle.py b/DoorShuffle.py index c287a2c0..599bf231 100644 --- a/DoorShuffle.py +++ b/DoorShuffle.py @@ -8,7 +8,7 @@ from enum import unique, Flag from functools import reduce from BaseClasses import RegionType, Door, DoorType, Direction, Sector, CrystalBarrier from Regions import key_only_locations -from Dungeons import dungeon_regions, region_starts, split_region_starts, flexible_starts +from Dungeons import dungeon_regions, region_starts, standard_starts, split_region_starts, flexible_starts from Dungeons import dungeon_bigs, dungeon_keys, dungeon_hints from Items import ItemFactory from RoomData import DoorKind, PairedDoor @@ -148,9 +148,10 @@ def vanilla_key_logic(world, player): while len(sector_queue) > 0: builder = sector_queue.popleft() + split_dungeon = builder.name.startswith('Desert Palace') or builder.name.startswith('Skull Woods') origin_list = list(entrances_map[builder.name]) find_enabled_origins(builder.sectors, enabled_entrances, origin_list, entrances_map, builder.name) - if len(origin_list) <= 0 or not pre_validate(builder, origin_list, world, player): + if len(origin_list) <= 0 or not pre_validate(builder, origin_list, split_dungeon, world, player): if last_key == builder.name or loops > 1000: origin_name = world.get_region(origin_list[0], player).entrances[0].parent_region.name if len(origin_list) > 0 else 'no origin' raise Exception('Infinite loop detected for "%s" located at %s' % (builder.name, origin_name)) @@ -394,6 +395,8 @@ def determine_entrance_list(world, player): connections = {} for key, r_names in region_starts.items(): entrance_map[key] = [] + if world.mode[player] == 'standard' and key in standard_starts.keys(): + r_names = standard_starts[key] for region_name in r_names: region = world.get_region(region_name, player) for ent in region.entrances: @@ -1173,9 +1176,6 @@ def find_inaccessible_regions(world, player): if connect and connect.type is not RegionType.Dungeon and connect not in queue and connect not in visited_regions: queue.append(connect) world.inaccessible_regions[player].extend([r.name for r in all_regions.difference(visited_regions) if valid_inaccessible_region(r)]) - if world.mode[player] == 'standard': - world.inaccessible_regions[player].append('Hyrule Castle Ledge') - world.inaccessible_regions[player].append('Sewer Drop') logger = logging.getLogger('') logger.debug('Inaccessible Regions:') for r in world.inaccessible_regions[player]: diff --git a/Dungeons.py b/Dungeons.py index b39aa54b..b85b6b61 100644 --- a/Dungeons.py +++ b/Dungeons.py @@ -331,6 +331,10 @@ region_starts = { 'Ganons Tower': ['GT Lobby'] } +standard_starts = { + 'Hyrule Castle': ['Hyrule Castle Lobby'] +} + split_region_starts = { 'Desert Palace': { 'Back': ['Desert Back Lobby'], diff --git a/EntranceShuffle.py b/EntranceShuffle.py index c5424820..9d39613b 100644 --- a/EntranceShuffle.py +++ b/EntranceShuffle.py @@ -3498,7 +3498,6 @@ inverted_default_dungeon_connections = [('Desert Palace Entrance (South)', 'Dese ('Ice Palace Exit', 'Dark Lake Hylia') ] -# format: indirect_connections = { 'Turtle Rock (Top)': 'Turtle Rock', 'East Dark World': 'Pyramid Fairy', @@ -3509,6 +3508,7 @@ indirect_connections = { 'Light World': 'Pyramid Fairy', 'Old Man Cave': 'Old Man S&Q' } +# format: # Key=Name # addr = (door_index, exitdata) # multiexit # | ([addr], None) # holes diff --git a/Main.py b/Main.py index 88dc0353..94f5cb5c 100644 --- a/Main.py +++ b/Main.py @@ -8,7 +8,7 @@ import random import time import zlib -from BaseClasses import World, CollectionState, Item, Region, Location, Shop +from BaseClasses import World, CollectionState, Item, Region, Location, Shop, Entrance from Items import ItemFactory from KeyDoorShuffle import validate_key_placement from Regions import create_regions, create_shops, mark_light_world_regions, create_dungeon_regions @@ -24,7 +24,7 @@ from Fill import distribute_items_cutoff, distribute_items_staleness, distribute from ItemList import generate_itempool, difficulties, fill_prizes from Utils import output_path, parse_player_names -__version__ = '0.1.0.5-u' +__version__ = '0.1.0.6-u' class EnemizerError(RuntimeError): pass @@ -375,6 +375,13 @@ def copy_world(world): create_dungeons(ret, player) copy_dynamic_regions_and_locations(world, ret) + for player in range(1, world.players + 1): + if world.mode[player] == 'standard': + parent = ret.get_region('Menu', player) + target = ret.get_region('Hyrule Castle Secret Entrance', player) + connection = Entrance(player, 'Uncle S&Q', parent) + parent.exits.append(connection) + connection.connect(target) # copy bosses for dungeon in world.dungeons: diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 50f71788..d521422b 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -4,6 +4,7 @@ * Standard mode generation improvements * Spoiler lists bosses (multiworld compatible) * Bombs escape not valid for Crossed Dungeon +* Graph algorithm speed improvement for placements and playthrough ### Experimental features diff --git a/Rules.py b/Rules.py index 37af010e..9f6cf72b 100644 --- a/Rules.py +++ b/Rules.py @@ -204,8 +204,6 @@ def global_rules(world, player): set_rule(world.get_entrance('Swamp Drain WN', player), lambda state: state.has('Drained Swamp', player)) set_rule(world.get_entrance('Swamp Flooded Room WS', player), lambda state: state.has('Drained Swamp', player)) set_rule(world.get_entrance('Swamp Flooded Room Ladder', player), lambda state: state.has('Drained Swamp', player)) - set_rule(world.get_entrance('Swamp Flooded Spot Ladder', player), lambda state: state.has('Drained Swamp', player) or state.has('Flippers', player)) - set_rule(world.get_entrance('Swamp Drain Left Up Stairs', player), lambda state: state.has('Drained Swamp', player) or state.has('Flippers', player)) set_rule(world.get_location('Swamp Palace - Flooded Room - Left', player), lambda state: state.has('Drained Swamp', player)) set_rule(world.get_location('Swamp Palace - Flooded Room - Right', player), lambda state: state.has('Drained Swamp', player)) set_rule(world.get_entrance('Swamp Flooded Spot Ladder', player), lambda state: state.has('Flippers', player) or state.has('Drained Swamp', player)) diff --git a/resources/app/cli/args.json b/resources/app/cli/args.json index 11d14887..e4e5a277 100644 --- a/resources/app/cli/args.json +++ b/resources/app/cli/args.json @@ -284,16 +284,16 @@ "shufflebosses": { "choices": [ "none", - "basic", - "normal", - "chaos" + "simple", + "full", + "random" ] }, "shuffleenemies": { "choices": [ "none", "shuffled", - "chaos" + "random" ] }, "enemy_health": { @@ -309,7 +309,7 @@ "choices": [ "default", "shuffled", - "chaos" + "random" ] }, "shufflepots": {