Recheck region access when sweeping for crystal state succeeds.

This commit is contained in:
compiling
2020-01-21 22:09:30 +11:00
parent d7beb1dfcf
commit 2c3f5a9aff

View File

@@ -465,6 +465,7 @@ class CollectionState(object):
def spread_crystal_access(self, region, crystal, rrp, ccr, player): def spread_crystal_access(self, region, crystal, rrp, ccr, player):
queue = deque([(region, crystal)]) queue = deque([(region, crystal)])
visited = set() visited = set()
updated = False
while len(queue) > 0: while len(queue) > 0:
region, crystal = queue.popleft() region, crystal = queue.popleft()
visited.add(region) visited.add(region)
@@ -478,8 +479,10 @@ class CollectionState(object):
current_crystal = ccr[connect] current_crystal = ccr[connect]
new_crystal = current_crystal | (crystal & (door.crystal or CrystalBarrier.Either)) new_crystal = current_crystal | (crystal & (door.crystal or CrystalBarrier.Either))
if current_crystal != new_crystal: if current_crystal != new_crystal:
updated = True
ccr[connect] = new_crystal ccr[connect] = new_crystal
queue.append((connect, new_crystal)) queue.append((connect, new_crystal))
return updated
def copy(self): def copy(self):
ret = CollectionState(self.world) ret = CollectionState(self.world)
@@ -509,13 +512,17 @@ class CollectionState(object):
def sweep_for_crystal_access(self): def sweep_for_crystal_access(self):
for player, rrp in self.reachable_regions.items(): for player, rrp in self.reachable_regions.items():
if self.stale[player]: updated = True
self.update_reachable_regions(player) while updated:
dungeon_regions = self.blocked_color_regions[player] if self.stale[player]:
ccr = self.colored_regions[player] self.update_reachable_regions(player)
for region in dungeon_regions.copy(): updated = False
if region in ccr.keys(): dungeon_regions = self.blocked_color_regions[player]
self.spread_crystal_access(region, ccr[region], rrp, ccr, player) ccr = self.colored_regions[player]
for region in dungeon_regions.copy():
if region in ccr.keys():
updated |= self.spread_crystal_access(region, ccr[region], rrp, ccr, player)
self.stale[player] = updated
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