Skip to content

Core: Skip directly collecting placed items in get_all_state() - #6335

Open
Mysteryem wants to merge 1 commit into
ArchipelagoMW:mainfrom
Mysteryem:patch-20
Open

Core: Skip directly collecting placed items in get_all_state()#6335
Mysteryem wants to merge 1 commit into
ArchipelagoMW:mainfrom
Mysteryem:patch-20

Conversation

@Mysteryem

@Mysteryem Mysteryem commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

What is this fixing or adding?

Depending on when get_all_state() is used, items in multiworld.itempool, or from a world's get_pre_fill_items() could already have been placed, meaning that get_all_state() could collect these item instances twice.

This changes MultiWorld.get_all_state() to skip directly collecting items that have already been placed.

This does not fix all issues with MultiWorld.get_all_state() at all generation steps because some worlds create new Item instances every time their get_pre_fill_items() is called, but collecting a few pre_fill-placed items twice generally doesn't cause problems, otherwise we would see many more generation failures from the vast number of worlds that currently use get_all_state() within the pre_fill step.

This fixes #6333.
This fixes #6334.
This fixes hiding some issues in worlds' pre_fill methods from test_default_all_state_can_reach_everything, that uses get_all_state() and would often collect items from get_pre_fill_items() twice. This notably reveals a potential bug in SMZ3 which now often fails test_default_all_state_can_reach_everything.

How was this tested?

Untested besides running the unit tests.

Depending on when get_all_state() is used, items in `multiworld.itempool`, or from a world's `get_pre_fill_items()` could already have been placed, meaning that `get_all_state()` could collect these item instances twice.

This changes `MultiWorld.get_all_state()` to skip directly collecting items that have already been placed.

This does not fix all issues with `MultiWorld.get_all_state()` at all generation steps because some worlds create new `Item` instances every time their `get_pre_fill_items()` is called, but collecting a few pre_fill items twice generally doesn't cause problems, otherwise we would see many more generation failures from the vast number of worlds that currently use `get_all_state()` within the `pre_fill` step.

This fixes ArchipelagoMW#6333.
This fixes ArchipelagoMW#6334.
@github-actions github-actions Bot added affects: core Issues/PRs that touch core and may need additional validation. waiting-on: peer-review Issue/PR has not been reviewed by enough people yet. labels Jul 18, 2026
Mysteryem added a commit to Mysteryem/Archipelago-ahit that referenced this pull request Jul 18, 2026
Similar to using `multiworld.get_all_state()` after core AP's main fill is complete (see ArchipelagoMW#6335), using `multiworld.get_items()` after core AP's main fill is complete is another common 'gotcha' that apworld developers fall for, not realising that it will end up returning a list containing most items twice.

This changes `multiworld.get_items()` to only return items from `self.itempool` that are not placed, therefore avoiding the issue of returning an item twice if it is both placed and in `self.itempool`, which often occurs after core AP's main fill is complete.

There are still potentially some issues from the fact that not necessarily all items from `self.itempool` will be placed somewhere, e.g. additional items could have been added into the multiworld through item plando. But, I don't know how `get_items()` is actually supposed to work due to it being undocumented. Additionally, changing `get_items()` to be aware of what it should return depending on which generation steps have been run would be a more involved change to parts of core AP.
@Silvris

Silvris commented Jul 18, 2026

Copy link
Copy Markdown
Collaborator

This notably reveals a potential bug in SMZ3 which now often fails test_default_all_state_can_reach_everything.

I believe this actually is more of a "bug" in test_default_all_state_can_reach_everything in that the test doesn't force full accessibility. SMZ3 has Items accessibility as default, and the "failing" pre-fill placements are self-locking keys.

@Jouramie

Copy link
Copy Markdown
Collaborator

I ran a quick 50 gen fuzzer on each of the world using get_all_state outside their tests. All fails are at a rate similar to what's on main. So, this does not seem to impact generation negatively.

  • pokemon_rb as failed 3 over 50 worlds.
  • sc2 as failed 48 and timed out 1 over 50 worlds. Probably because of the absurd starting inventory the fuzzer tries to generate.
  • shivers as timed out 4 over 50 worlds.
  • alttp, earthbound, meritous, messenger, smz3 and tunic and not failed the 50 gens.

@Jouramie Jouramie added the is: bug/fix Issues that are reporting bugs or pull requests that are fixing bugs. label Jul 24, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

affects: core Issues/PRs that touch core and may need additional validation. is: bug/fix Issues that are reporting bugs or pull requests that are fixing bugs. waiting-on: peer-review Issue/PR has not been reviewed by enough people yet.

Projects

None yet

3 participants