remove reachable cache. Seems I missed invalidations somewhere as the wrong state can be retained.

This commit is contained in:
Fabian Dill 2020-03-08 05:41:56 +01:00
parent 611f4d3fb2
commit 99e7d51f11
1 changed files with 10 additions and 18 deletions

View File

@ -344,7 +344,6 @@ class CollectionState(object):
self.stale = {player: True for player in range(1, parent.players + 1)} self.stale = {player: True for player in range(1, parent.players + 1)}
for item in parent.precollected_items: for item in parent.precollected_items:
self.collect(item, True) self.collect(item, True)
self._reachable_cache = set()
def update_reachable_regions(self, player: int): def update_reachable_regions(self, player: int):
player_regions = self.world.get_regions(player) player_regions = self.world.get_regions(player)
@ -371,22 +370,16 @@ class CollectionState(object):
return ret return ret
def can_reach(self, spot, resolution_hint=None, player=None): def can_reach(self, spot, resolution_hint=None, player=None):
if (player, getattr(spot, "name", spot)) in self._reachable_cache: if not hasattr(spot, "spot_type"):
return True # try to resolve a name
else: if resolution_hint == 'Location':
if not hasattr(spot, "spot_type"): spot = self.world.get_location(spot, player)
# try to resolve a name elif resolution_hint == 'Entrance':
if resolution_hint == 'Location': spot = self.world.get_entrance(spot, player)
spot = self.world.get_location(spot, player) else:
elif resolution_hint == 'Entrance': # default to Region
spot = self.world.get_entrance(spot, player) spot = self.world.get_region(spot, player)
else: return spot.can_reach(self)
# default to Region
spot = self.world.get_region(spot, player)
res = spot.can_reach(self)
if res:
self._reachable_cache.add((player, spot.name))
return spot.can_reach(self)
def sweep_for_events(self, key_only=False, locations=None): def sweep_for_events(self, key_only=False, locations=None):
# this may need improvement # this may need improvement
@ -662,7 +655,6 @@ class CollectionState(object):
if self.prog_items[to_remove, item.player] < 1: if self.prog_items[to_remove, item.player] < 1:
del (self.prog_items[to_remove, item.player]) del (self.prog_items[to_remove, item.player])
# invalidate caches, nothing can be trusted anymore now # invalidate caches, nothing can be trusted anymore now
self._reachable_cache = set()
self.reachable_regions[item.player] = set() self.reachable_regions[item.player] = set()
self.stale[item.player] = True self.stale[item.player] = True