Fixes for compatibility with compiling perf
Couple fixes for standard+ER
This commit is contained in:
@@ -1787,8 +1787,8 @@ class Spoiler(object):
|
|||||||
for player in range(1, self.world.players + 1):
|
for player in range(1, self.world.players + 1):
|
||||||
if self.world.boss_shuffle[player] != 'none':
|
if self.world.boss_shuffle[player] != 'none':
|
||||||
bossmap = self.bosses[player] if self.world.players > 1 else self.bosses
|
bossmap = self.bosses[player] if self.world.players > 1 else self.bosses
|
||||||
outfile.write(f'\n\nBosses (Player {player}):\n\n')
|
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()]))
|
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
|
# 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
|
# items: Item names
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ from enum import unique, Flag
|
|||||||
from functools import reduce
|
from functools import reduce
|
||||||
from BaseClasses import RegionType, Door, DoorType, Direction, Sector, CrystalBarrier
|
from BaseClasses import RegionType, Door, DoorType, Direction, Sector, CrystalBarrier
|
||||||
from Regions import key_only_locations
|
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 Dungeons import dungeon_bigs, dungeon_keys, dungeon_hints
|
||||||
from Items import ItemFactory
|
from Items import ItemFactory
|
||||||
from RoomData import DoorKind, PairedDoor
|
from RoomData import DoorKind, PairedDoor
|
||||||
@@ -148,9 +148,10 @@ def vanilla_key_logic(world, player):
|
|||||||
while len(sector_queue) > 0:
|
while len(sector_queue) > 0:
|
||||||
builder = sector_queue.popleft()
|
builder = sector_queue.popleft()
|
||||||
|
|
||||||
|
split_dungeon = builder.name.startswith('Desert Palace') or builder.name.startswith('Skull Woods')
|
||||||
origin_list = list(entrances_map[builder.name])
|
origin_list = list(entrances_map[builder.name])
|
||||||
find_enabled_origins(builder.sectors, enabled_entrances, origin_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:
|
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'
|
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))
|
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 = {}
|
connections = {}
|
||||||
for key, r_names in region_starts.items():
|
for key, r_names in region_starts.items():
|
||||||
entrance_map[key] = []
|
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:
|
for region_name in r_names:
|
||||||
region = world.get_region(region_name, player)
|
region = world.get_region(region_name, player)
|
||||||
for ent in region.entrances:
|
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:
|
if connect and connect.type is not RegionType.Dungeon and connect not in queue and connect not in visited_regions:
|
||||||
queue.append(connect)
|
queue.append(connect)
|
||||||
world.inaccessible_regions[player].extend([r.name for r in all_regions.difference(visited_regions) if valid_inaccessible_region(r)])
|
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 = logging.getLogger('')
|
||||||
logger.debug('Inaccessible Regions:')
|
logger.debug('Inaccessible Regions:')
|
||||||
for r in world.inaccessible_regions[player]:
|
for r in world.inaccessible_regions[player]:
|
||||||
|
|||||||
@@ -331,6 +331,10 @@ region_starts = {
|
|||||||
'Ganons Tower': ['GT Lobby']
|
'Ganons Tower': ['GT Lobby']
|
||||||
}
|
}
|
||||||
|
|
||||||
|
standard_starts = {
|
||||||
|
'Hyrule Castle': ['Hyrule Castle Lobby']
|
||||||
|
}
|
||||||
|
|
||||||
split_region_starts = {
|
split_region_starts = {
|
||||||
'Desert Palace': {
|
'Desert Palace': {
|
||||||
'Back': ['Desert Back Lobby'],
|
'Back': ['Desert Back Lobby'],
|
||||||
|
|||||||
@@ -3498,7 +3498,6 @@ inverted_default_dungeon_connections = [('Desert Palace Entrance (South)', 'Dese
|
|||||||
('Ice Palace Exit', 'Dark Lake Hylia')
|
('Ice Palace Exit', 'Dark Lake Hylia')
|
||||||
]
|
]
|
||||||
|
|
||||||
# format:
|
|
||||||
indirect_connections = {
|
indirect_connections = {
|
||||||
'Turtle Rock (Top)': 'Turtle Rock',
|
'Turtle Rock (Top)': 'Turtle Rock',
|
||||||
'East Dark World': 'Pyramid Fairy',
|
'East Dark World': 'Pyramid Fairy',
|
||||||
@@ -3509,6 +3508,7 @@ indirect_connections = {
|
|||||||
'Light World': 'Pyramid Fairy',
|
'Light World': 'Pyramid Fairy',
|
||||||
'Old Man Cave': 'Old Man S&Q'
|
'Old Man Cave': 'Old Man S&Q'
|
||||||
}
|
}
|
||||||
|
# format:
|
||||||
# Key=Name
|
# Key=Name
|
||||||
# addr = (door_index, exitdata) # multiexit
|
# addr = (door_index, exitdata) # multiexit
|
||||||
# | ([addr], None) # holes
|
# | ([addr], None) # holes
|
||||||
|
|||||||
11
Main.py
11
Main.py
@@ -8,7 +8,7 @@ import random
|
|||||||
import time
|
import time
|
||||||
import zlib
|
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 Items import ItemFactory
|
||||||
from KeyDoorShuffle import validate_key_placement
|
from KeyDoorShuffle import validate_key_placement
|
||||||
from Regions import create_regions, create_shops, mark_light_world_regions, create_dungeon_regions
|
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 ItemList import generate_itempool, difficulties, fill_prizes
|
||||||
from Utils import output_path, parse_player_names
|
from Utils import output_path, parse_player_names
|
||||||
|
|
||||||
__version__ = '0.1.0.5-u'
|
__version__ = '0.1.0.6-u'
|
||||||
|
|
||||||
class EnemizerError(RuntimeError):
|
class EnemizerError(RuntimeError):
|
||||||
pass
|
pass
|
||||||
@@ -375,6 +375,13 @@ def copy_world(world):
|
|||||||
create_dungeons(ret, player)
|
create_dungeons(ret, player)
|
||||||
|
|
||||||
copy_dynamic_regions_and_locations(world, ret)
|
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
|
# copy bosses
|
||||||
for dungeon in world.dungeons:
|
for dungeon in world.dungeons:
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
* Standard mode generation improvements
|
* Standard mode generation improvements
|
||||||
* Spoiler lists bosses (multiworld compatible)
|
* Spoiler lists bosses (multiworld compatible)
|
||||||
* Bombs escape not valid for Crossed Dungeon
|
* Bombs escape not valid for Crossed Dungeon
|
||||||
|
* Graph algorithm speed improvement for placements and playthrough
|
||||||
|
|
||||||
### Experimental features
|
### Experimental features
|
||||||
|
|
||||||
|
|||||||
2
Rules.py
2
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 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 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 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 - 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_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))
|
set_rule(world.get_entrance('Swamp Flooded Spot Ladder', player), lambda state: state.has('Flippers', player) or state.has('Drained Swamp', player))
|
||||||
|
|||||||
@@ -284,16 +284,16 @@
|
|||||||
"shufflebosses": {
|
"shufflebosses": {
|
||||||
"choices": [
|
"choices": [
|
||||||
"none",
|
"none",
|
||||||
"basic",
|
"simple",
|
||||||
"normal",
|
"full",
|
||||||
"chaos"
|
"random"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"shuffleenemies": {
|
"shuffleenemies": {
|
||||||
"choices": [
|
"choices": [
|
||||||
"none",
|
"none",
|
||||||
"shuffled",
|
"shuffled",
|
||||||
"chaos"
|
"random"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"enemy_health": {
|
"enemy_health": {
|
||||||
@@ -309,7 +309,7 @@
|
|||||||
"choices": [
|
"choices": [
|
||||||
"default",
|
"default",
|
||||||
"shuffled",
|
"shuffled",
|
||||||
"chaos"
|
"random"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"shufflepots": {
|
"shufflepots": {
|
||||||
|
|||||||
Reference in New Issue
Block a user