Initialize region cache in initialize_regions() and make it a 2d map for more efficient player filtering
This commit is contained in:
		
							parent
							
								
									bf7a2d79fb
								
							
						
					
					
						commit
						e4fef05d53
					
				|  | @ -30,8 +30,7 @@ class World(object): | ||||||
|         self.required_medallions = dict([(player, ['Ether', 'Quake']) for player in range(1, players + 1)]) |         self.required_medallions = dict([(player, ['Ether', 'Quake']) for player in range(1, players + 1)]) | ||||||
|         self._cached_entrances = None |         self._cached_entrances = None | ||||||
|         self._cached_locations = None |         self._cached_locations = None | ||||||
|         self._entrance_cache = {} |         self._region_cache = {player: {} for player in range(1, players + 1)} | ||||||
|         self._region_cache = {} |  | ||||||
|         self._entrance_cache = {} |         self._entrance_cache = {} | ||||||
|         self._location_cache = {} |         self._location_cache = {} | ||||||
|         self.required_locations = [] |         self.required_locations = [] | ||||||
|  | @ -84,19 +83,23 @@ class World(object): | ||||||
|         self.spoiler = Spoiler(self) |         self.spoiler = Spoiler(self) | ||||||
|         self.lamps_needed_for_dark_rooms = 1 |         self.lamps_needed_for_dark_rooms = 1 | ||||||
| 
 | 
 | ||||||
|     def intialize_regions(self): |     def initialize_regions(self, regions=None): | ||||||
|         for region in self.regions: |         for region in regions if regions else self.regions: | ||||||
|             region.world = self |             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): |     def get_region(self, regionname, player): | ||||||
|         if isinstance(regionname, Region): |         if isinstance(regionname, Region): | ||||||
|             return regionname |             return regionname | ||||||
|         try: |         try: | ||||||
|             return self._region_cache[(regionname, player)] |             return self._region_cache[player][regionname] | ||||||
|         except KeyError: |         except KeyError: | ||||||
|             for region in self.regions: |             for region in self.regions: | ||||||
|                 if region.name == regionname and region.player == player: |                 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 |                     return region | ||||||
|             raise RuntimeError('No such region %s for player %d' % (regionname, player)) |             raise RuntimeError('No such region %s for player %d' % (regionname, player)) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -316,7 +316,7 @@ def create_inverted_regions(world, player): | ||||||
|     world.shops.append(shop) |     world.shops.append(shop) | ||||||
|     shop.add_inventory(0, 'Bomb Upgrade (+5)', 100, 7) |     shop.add_inventory(0, 'Bomb Upgrade (+5)', 100, 7) | ||||||
|     shop.add_inventory(1, 'Arrow 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): | def create_lw_region(player, name, locations=None, exits=None): | ||||||
|     return _create_region(player, name, RegionType.LightWorld, 'Light World', locations, exits) |     return _create_region(player, name, RegionType.LightWorld, 'Light World', locations, exits) | ||||||
|  |  | ||||||
|  | @ -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(0, 'Blue Potion', 0, 0) | ||||||
|         take_any.shop.add_inventory(1, 'Boss Heart Container', 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): | def create_dynamic_shop_locations(world, player): | ||||||
|     for shop in world.shops: |     for shop in world.shops: | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								Main.py
								
								
								
								
							
							
						
						
									
										2
									
								
								Main.py
								
								
								
								
							|  | @ -295,8 +295,8 @@ def copy_world(world): | ||||||
| def copy_dynamic_regions_and_locations(world, ret): | def copy_dynamic_regions_and_locations(world, ret): | ||||||
|     for region in world.dynamic_regions: |     for region in world.dynamic_regions: | ||||||
|         new_reg = Region(region.name, region.type, region.hint_text, region.player) |         new_reg = Region(region.name, region.type, region.hint_text, region.player) | ||||||
|         new_reg.world = ret |  | ||||||
|         ret.regions.append(new_reg) |         ret.regions.append(new_reg) | ||||||
|  |         ret.initialize_regions([new_reg]) | ||||||
|         ret.dynamic_regions.append(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 |         # Note: ideally exits should be copied here, but the current use case (Take anys) do not require this | ||||||
|  |  | ||||||
|  | @ -307,7 +307,7 @@ def create_regions(world, player): | ||||||
|     world.shops.append(shop) |     world.shops.append(shop) | ||||||
|     shop.add_inventory(0, 'Bomb Upgrade (+5)', 100, 7) |     shop.add_inventory(0, 'Bomb Upgrade (+5)', 100, 7) | ||||||
|     shop.add_inventory(1, 'Arrow 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): | def create_lw_region(player, name, locations=None, exits=None): | ||||||
|     return _create_region(player, name, RegionType.LightWorld, 'Light World', locations, exits) |     return _create_region(player, name, RegionType.LightWorld, 'Light World', locations, exits) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue