Core/Tests: No Locality Changes After generate_early (#4481)

* Change timing of locality option locking

* Update world api.md

* Remove whitespace
This commit is contained in:
Exempt-Medic
2025-07-26 16:30:55 -04:00
committed by GitHub
parent 774457b362
commit de4014f02c
3 changed files with 13 additions and 11 deletions

19
Main.py
View File

@@ -93,6 +93,15 @@ def main(args, seed=None, baked_server_options: dict[str, object] | None = None)
del local_early del local_early
del early del early
# items can't be both local and non-local, prefer local
multiworld.worlds[player].options.non_local_items.value -= multiworld.worlds[player].options.local_items.value
multiworld.worlds[player].options.non_local_items.value -= set(multiworld.local_early_items[player])
# Clear non-applicable local and non-local items.
if multiworld.players == 1:
multiworld.worlds[1].options.non_local_items.value = set()
multiworld.worlds[1].options.local_items.value = set()
logger.info('Creating MultiWorld.') logger.info('Creating MultiWorld.')
AutoWorld.call_all(multiworld, "create_regions") AutoWorld.call_all(multiworld, "create_regions")
@@ -100,12 +109,6 @@ def main(args, seed=None, baked_server_options: dict[str, object] | None = None)
AutoWorld.call_all(multiworld, "create_items") AutoWorld.call_all(multiworld, "create_items")
logger.info('Calculating Access Rules.') logger.info('Calculating Access Rules.')
for player in multiworld.player_ids:
# items can't be both local and non-local, prefer local
multiworld.worlds[player].options.non_local_items.value -= multiworld.worlds[player].options.local_items.value
multiworld.worlds[player].options.non_local_items.value -= set(multiworld.local_early_items[player])
AutoWorld.call_all(multiworld, "set_rules") AutoWorld.call_all(multiworld, "set_rules")
for player in multiworld.player_ids: for player in multiworld.player_ids:
@@ -126,11 +129,9 @@ def main(args, seed=None, baked_server_options: dict[str, object] | None = None)
multiworld.worlds[player].options.priority_locations.value -= world_excluded_locations multiworld.worlds[player].options.priority_locations.value -= world_excluded_locations
# Set local and non-local item rules. # Set local and non-local item rules.
# This function is called so late because worlds might otherwise overwrite item_rules which are how locality works
if multiworld.players > 1: if multiworld.players > 1:
locality_rules(multiworld) locality_rules(multiworld)
else:
multiworld.worlds[1].options.non_local_items.value = set()
multiworld.worlds[1].options.local_items.value = set()
multiworld.plando_item_blocks = parse_planned_blocks(multiworld) multiworld.plando_item_blocks = parse_planned_blocks(multiworld)

View File

@@ -515,6 +515,7 @@ In addition, the following methods can be implemented and are called in this ord
called per player before any items or locations are created. You can set properties on your called per player before any items or locations are created. You can set properties on your
world here. Already has access to player options and RNG. This is the earliest step where the world should start world here. Already has access to player options and RNG. This is the earliest step where the world should start
setting up for the current multiworld, as the multiworld itself is still setting up before this point. setting up for the current multiworld, as the multiworld itself is still setting up before this point.
You cannot modify `local_items`, or `non_local_items` after this step.
* `create_regions(self)` * `create_regions(self)`
called to place player's regions and their locations into the MultiWorld's regions list. called to place player's regions and their locations into the MultiWorld's regions list.
If it's hard to separate, this can be done during `generate_early` or `create_items` as well. If it's hard to separate, this can be done during `generate_early` or `create_items` as well.

View File

@@ -148,8 +148,8 @@ class TestBase(unittest.TestCase):
def test_locality_not_modified(self): def test_locality_not_modified(self):
"""Test that worlds don't modify the locality of items after duplicates are resolved""" """Test that worlds don't modify the locality of items after duplicates are resolved"""
gen_steps = ("generate_early", "create_regions", "create_items") gen_steps = ("generate_early",)
additional_steps = ("set_rules", "connect_entrances", "generate_basic", "pre_fill") additional_steps = ("create_regions", "create_items", "set_rules", "connect_entrances", "generate_basic", "pre_fill")
worlds_to_test = {game: world for game, world in AutoWorldRegister.world_types.items()} worlds_to_test = {game: world for game, world in AutoWorldRegister.world_types.items()}
for game_name, world_type in worlds_to_test.items(): for game_name, world_type in worlds_to_test.items():
with self.subTest("Game", game=game_name): with self.subTest("Game", game=game_name):