Core: Fix playthrough only checking half of the sphere 0 items (#4268)
* Core: Fix playthrough only checking half of the sphere 0 items The lists of precollected items were being mutated while iterating those same lists, causing playthrough to skip checking half of the sphere 0 advancement items. This patch ensures the lists are copied before they are iterated. * Replace chain.from_iterable with two for loops for better clarity Added a comment to `multiworld.push_precollected(item)` to explain that it is also modifying `precollected_items`.
This commit is contained in:
parent
5d30d16e09
commit
3cb5219e09
|
@ -1384,14 +1384,21 @@ class Spoiler:
|
||||||
|
|
||||||
# second phase, sphere 0
|
# second phase, sphere 0
|
||||||
removed_precollected: List[Item] = []
|
removed_precollected: List[Item] = []
|
||||||
for item in (i for i in chain.from_iterable(multiworld.precollected_items.values()) if i.advancement):
|
|
||||||
logging.debug('Checking if %s (Player %d) is required to beat the game.', item.name, item.player)
|
for precollected_items in multiworld.precollected_items.values():
|
||||||
multiworld.precollected_items[item.player].remove(item)
|
# The list of items is mutated by removing one item at a time to determine if each item is required to beat
|
||||||
multiworld.state.remove(item)
|
# the game, and re-adding that item if it was required, so a copy needs to be made before iterating.
|
||||||
if not multiworld.can_beat_game():
|
for item in precollected_items.copy():
|
||||||
multiworld.push_precollected(item)
|
if not item.advancement:
|
||||||
else:
|
continue
|
||||||
removed_precollected.append(item)
|
logging.debug('Checking if %s (Player %d) is required to beat the game.', item.name, item.player)
|
||||||
|
precollected_items.remove(item)
|
||||||
|
multiworld.state.remove(item)
|
||||||
|
if not multiworld.can_beat_game():
|
||||||
|
# Add the item back into `precollected_items` and collect it into `multiworld.state`.
|
||||||
|
multiworld.push_precollected(item)
|
||||||
|
else:
|
||||||
|
removed_precollected.append(item)
|
||||||
|
|
||||||
# we are now down to just the required progress items in collection_spheres. Unfortunately
|
# we are now down to just the required progress items in collection_spheres. Unfortunately
|
||||||
# the previous pruning stage could potentially have made certain items dependant on others
|
# the previous pruning stage could potentially have made certain items dependant on others
|
||||||
|
|
Loading…
Reference in New Issue