remove keys option for get_all_state, collect dungeon-local keys, and fix all uses of the state
This commit is contained in:
parent
7972aa6320
commit
631b6788c6
|
@ -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:
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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),
|
||||||
|
|
Loading…
Reference in New Issue