From 4e8a8d28406a1fd59737cd2dcc5b69ad95e27054 Mon Sep 17 00:00:00 2001 From: aerinon Date: Thu, 26 Aug 2021 15:25:29 -0600 Subject: [PATCH] Compass/Map can be progressive Fixed filter_for_potential_bk_locations Changed rules to use dungeon_table --- BaseClasses.py | 8 ++++---- DungeonGenerator.py | 5 +++-- Rules.py | 11 ++++++----- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index b35e53da..67f2f93d 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -852,7 +852,7 @@ class CollectionState(object): reduced = Counter() for item, cnt in self.prog_items.items(): item_name, item_player = item - if item_player == player and self.check_if_progressive(item_name): + if item_player == player and self.check_if_progressive(item_name, player): if item_name.startswith('Bottle'): # I think magic requirements can require multiple bottles bottle_count += cnt elif item_name in ['Boss Heart Container', 'Sanctuary Heart Container', 'Piece of Heart']: @@ -868,8 +868,7 @@ class CollectionState(object): reduced[('Heart Container', player)] = 1 return frozenset(reduced.items()) - @staticmethod - def check_if_progressive(item_name): + def check_if_progressive(self, item_name, player): return (item_name in ['Bow', 'Progressive Bow', 'Progressive Bow (Alt)', 'Book of Mudora', 'Hammer', 'Hookshot', 'Magic Mirror', 'Ocarina', 'Pegasus Boots', 'Power Glove', 'Cape', 'Mushroom', 'Shovel', @@ -881,7 +880,8 @@ class CollectionState(object): 'Mirror Shield', 'Progressive Shield', 'Bug Catching Net', 'Cane of Byrna', 'Boss Heart Container', 'Sanctuary Heart Container', 'Piece of Heart', 'Magic Upgrade (1/2)', 'Magic Upgrade (1/4)'] - or item_name.startswith(('Bottle', 'Small Key', 'Big Key'))) + or item_name.startswith(('Bottle', 'Small Key', 'Big Key')) + or (self.world.restrict_boss_items[player] != 'none' and item_name.startswith(('Map', 'Compass')))) def can_reach(self, spot, resolution_hint=None, player=None): try: diff --git a/DungeonGenerator.py b/DungeonGenerator.py index 4be27692..a2c3df04 100644 --- a/DungeonGenerator.py +++ b/DungeonGenerator.py @@ -679,7 +679,8 @@ def create_graph_piece_from_state(door, o_state, b_state, proposed_map, exceptio def filter_for_potential_bk_locations(locations, world, player): - return count_locations_exclude_big_chest(locations, world, player) + return [x for x in locations if '- Big Chest' not in x.name and not not reserved_location(x, world, player) and + not x.forced_item and not prize_or_event(x) and not blind_boss_unavail(x, locations, world, player)] type_map = { @@ -1078,7 +1079,7 @@ def prize_or_event(loc): def reserved_location(loc, world, player): - return loc.name in world.item_pool_config.reserved_locations[player] + return hasattr(world, 'item_pool_config') and loc.name in world.item_pool_config.reserved_locations[player] def blind_boss_unavail(loc, locations, world, player): diff --git a/Rules.py b/Rules.py index f06328c5..dec41c79 100644 --- a/Rules.py +++ b/Rules.py @@ -4,7 +4,7 @@ from collections import deque import OverworldGlitchRules from BaseClasses import CollectionState, RegionType, DoorType, Entrance, CrystalBarrier, KeyRuleType -from Dungeons import dungeon_regions, dungeon_prize +from Dungeons import dungeon_table from RoomData import DoorKind from OverworldGlitchRules import overworld_glitches_rules @@ -562,10 +562,11 @@ def global_rules(world, player): map_name = f'Map ({d_name})' add_rule(boss_location, lambda state: state.has(compass_name, player) and state.has(map_name, player)) - for dungeon in dungeon_prize.keys(): - d_name = "Thieves' Town" if dungeon.startswith('Thieves') else dungeon - for loc in [dungeon_prize[dungeon], f'{d_name} - Boss']: - add_mc_rule(loc) + for dungeon, info in dungeon_table.items(): + if info.prize: + d_name = "Thieves' Town" if dungeon.startswith('Thieves') else dungeon + for loc in [info.prize, f'{d_name} - Boss']: + add_mc_rule(loc) if world.doorShuffle[player] == 'crossed': add_mc_rule('Agahnim 1') add_mc_rule('Agahnim 2')