remove keys option for get_all_state, collect dungeon-local keys, and fix all uses of the state

This commit is contained in:
espeon65536 2021-08-31 19:19:26 -05:00 committed by Fabian Dill
parent 7972aa6320
commit 631b6788c6
4 changed files with 11 additions and 25 deletions

View File

@ -213,9 +213,8 @@ class MultiWorld():
except KeyError as e: except KeyError as e:
raise KeyError('No such dungeon %s for player %d' % (dungeonname, player)) from e raise KeyError('No such dungeon %s for player %d' % (dungeonname, player)) from e
def get_all_state(self, keys=False) -> CollectionState: def get_all_state(self) -> CollectionState:
key = f"_all_state_{keys}" cached = getattr(self, "_all_state", None)
cached = getattr(self, key, None)
if cached: if cached:
return cached.copy() return cached.copy()
@ -223,27 +222,12 @@ class MultiWorld():
for item in self.itempool: for item in self.itempool:
self.worlds[item.player].collect(ret, item) self.worlds[item.player].collect(ret, item)
from worlds.alttp.Dungeons import get_dungeon_item_pool
if keys: for item in get_dungeon_item_pool(self):
for p in self.get_game_players("A Link to the Past"): subworld = self.worlds[item.player]
world = self.worlds[p] if item.name in subworld.dungeon_local_item_names:
from worlds.alttp.Items import ItemFactory subworld.collect(ret, item)
for item in ItemFactory(
['Small Key (Hyrule Castle)', 'Big Key (Eastern Palace)', 'Big Key (Desert Palace)',
'Small Key (Desert Palace)', 'Big Key (Tower of Hera)', 'Small Key (Tower of Hera)',
'Small Key (Agahnims Tower)', 'Small Key (Agahnims Tower)',
'Big Key (Palace of Darkness)'] + ['Small Key (Palace of Darkness)'] * 6 + [
'Big Key (Thieves Town)', 'Small Key (Thieves Town)', 'Big Key (Skull Woods)'] + [
'Small Key (Skull Woods)'] * 3 + ['Big Key (Swamp Palace)',
'Small Key (Swamp Palace)', 'Big Key (Ice Palace)'] + [
'Small Key (Ice Palace)'] * 2 + ['Big Key (Misery Mire)', 'Big Key (Turtle Rock)',
'Big Key (Ganons Tower)'] + [
'Small Key (Misery Mire)'] * 3 + ['Small Key (Turtle Rock)'] * 4 + [
'Small Key (Ganons Tower)'] * 4,
p):
world.collect(ret, item)
ret.sweep_for_events() ret.sweep_for_events()
setattr(self, key, ret)
return ret return ret
def get_items(self) -> list: def get_items(self) -> list:

View File

@ -157,6 +157,8 @@ def fill_dungeons_restrictive(autoworld, world):
in_dungeon_items.sort( in_dungeon_items.sort(
key=lambda item: sort_order.get(item.type, 1) + key=lambda item: sort_order.get(item.type, 1) +
(5 if (item.player, item.name) in dungeon_specific else 0)) (5 if (item.player, item.name) in dungeon_specific else 0))
for item in in_dungeon_items:
all_state_base.remove(item)
fill_restrictive(world, all_state_base, locations, in_dungeon_items, True, True) fill_restrictive(world, all_state_base, locations, in_dungeon_items, True, True)

View File

@ -853,7 +853,7 @@ def set_trock_key_rules(world, player):
for entrance in ['Turtle Rock Dark Room Staircase', 'Turtle Rock (Chain Chomp Room) (North)', 'Turtle Rock (Chain Chomp Room) (South)', 'Turtle Rock Pokey Room', 'Turtle Rock Big Key Door']: for entrance in ['Turtle Rock Dark Room Staircase', 'Turtle Rock (Chain Chomp Room) (North)', 'Turtle Rock (Chain Chomp Room) (South)', 'Turtle Rock Pokey Room', 'Turtle Rock Big Key Door']:
set_rule(world.get_entrance(entrance, player), lambda state: False) set_rule(world.get_entrance(entrance, player), lambda state: False)
all_state = world.get_all_state(True) all_state = world.get_all_state()
all_state.reachable_regions[player] = set() # wipe reachable regions so that the locked doors actually work all_state.reachable_regions[player] = set() # wipe reachable regions so that the locked doors actually work
# Check if each of the four main regions of the dungoen can be reached. The previous code section prevents key-costing moves within the dungeon. # Check if each of the four main regions of the dungoen can be reached. The previous code section prevents key-costing moves within the dungeon.

View File

@ -212,7 +212,7 @@ class ALTTPWorld(World):
attempts = 5 attempts = 5
world = self.world world = self.world
player = self.player player = self.player
all_state = world.get_all_state(keys=True) all_state = world.get_all_state()
crystals = [self.create_item(name) for name in ['Red Pendant', 'Blue Pendant', 'Green Pendant', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 7', 'Crystal 5', 'Crystal 6']] crystals = [self.create_item(name) for name in ['Red Pendant', 'Blue Pendant', 'Green Pendant', 'Crystal 1', 'Crystal 2', 'Crystal 3', 'Crystal 4', 'Crystal 7', 'Crystal 5', 'Crystal 6']]
crystal_locations = [world.get_location('Turtle Rock - Prize', player), crystal_locations = [world.get_location('Turtle Rock - Prize', player),
world.get_location('Eastern Palace - Prize', player), world.get_location('Eastern Palace - Prize', player),