Fixes for compatibility with compiling perf

Couple fixes for standard+ER
This commit is contained in:
aerinon
2020-05-29 16:19:32 -06:00
parent d9d497ba62
commit 3b4e19b5de
8 changed files with 27 additions and 17 deletions

View File

@@ -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

View File

@@ -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]:

View File

@@ -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'],

View File

@@ -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

11
Main.py
View File

@@ -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:

View File

@@ -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

View File

@@ -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))

View File

@@ -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": {