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