diff --git a/BaseClasses.py b/BaseClasses.py index 83a14058..b9d65297 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -30,8 +30,7 @@ class World(object): self.required_medallions = dict([(player, ['Ether', 'Quake']) for player in range(1, players + 1)]) self._cached_entrances = None self._cached_locations = None - self._entrance_cache = {} - self._region_cache = {} + self._region_cache = {player: {} for player in range(1, players + 1)} self._entrance_cache = {} self._location_cache = {} self.required_locations = [] @@ -84,19 +83,23 @@ class World(object): self.spoiler = Spoiler(self) self.lamps_needed_for_dark_rooms = 1 - def intialize_regions(self): - for region in self.regions: + def initialize_regions(self, regions=None): + for region in regions if regions else self.regions: region.world = self + self._region_cache[region.player][region.name] = region + + def get_regions(self, player=None): + return self.regions if player is None else self._region_cache[player].values() def get_region(self, regionname, player): if isinstance(regionname, Region): return regionname try: - return self._region_cache[(regionname, player)] + return self._region_cache[player][regionname] except KeyError: for region in self.regions: if region.name == regionname and region.player == player: - self._region_cache[(regionname, player)] = region + assert not region.world # this should only happen before initialization return region raise RuntimeError('No such region %s for player %d' % (regionname, player)) diff --git a/InvertedRegions.py b/InvertedRegions.py index c03e979f..61c257ff 100644 --- a/InvertedRegions.py +++ b/InvertedRegions.py @@ -316,7 +316,7 @@ def create_inverted_regions(world, player): world.shops.append(shop) shop.add_inventory(0, 'Bomb Upgrade (+5)', 100, 7) shop.add_inventory(1, 'Arrow Upgrade (+5)', 100, 7) - world.intialize_regions() + world.initialize_regions() def create_lw_region(player, name, locations=None, exits=None): return _create_region(player, name, RegionType.LightWorld, 'Light World', locations, exits) diff --git a/ItemList.py b/ItemList.py index 55eaf730..dba4a38f 100644 --- a/ItemList.py +++ b/ItemList.py @@ -303,7 +303,7 @@ def set_up_take_anys(world, player): take_any.shop.add_inventory(0, 'Blue Potion', 0, 0) take_any.shop.add_inventory(1, 'Boss Heart Container', 0, 0) - world.intialize_regions() + world.initialize_regions() def create_dynamic_shop_locations(world, player): for shop in world.shops: diff --git a/Main.py b/Main.py index b2eb57b3..32a43246 100644 --- a/Main.py +++ b/Main.py @@ -295,8 +295,8 @@ def copy_world(world): def copy_dynamic_regions_and_locations(world, ret): for region in world.dynamic_regions: new_reg = Region(region.name, region.type, region.hint_text, region.player) - new_reg.world = ret ret.regions.append(new_reg) + ret.initialize_regions([new_reg]) ret.dynamic_regions.append(new_reg) # Note: ideally exits should be copied here, but the current use case (Take anys) do not require this diff --git a/Regions.py b/Regions.py index fed6abab..b74d399b 100644 --- a/Regions.py +++ b/Regions.py @@ -307,7 +307,7 @@ def create_regions(world, player): world.shops.append(shop) shop.add_inventory(0, 'Bomb Upgrade (+5)', 100, 7) shop.add_inventory(1, 'Arrow Upgrade (+5)', 100, 7) - world.intialize_regions() + world.initialize_regions() def create_lw_region(player, name, locations=None, exits=None): return _create_region(player, name, RegionType.LightWorld, 'Light World', locations, exits)