Recheck region access when sweeping for crystal state succeeds.
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user