Core: offer API hook to modify Group World creation

This commit is contained in:
Fabian Dill 2023-09-24 01:51:26 +02:00 committed by Fabian Dill
parent 5d47c5b316
commit e114ed5566
2 changed files with 16 additions and 8 deletions

View File

@ -202,14 +202,7 @@ class MultiWorld():
self.player_types[new_id] = NetUtils.SlotType.group
self._region_cache[new_id] = {}
world_type = AutoWorld.AutoWorldRegister.world_types[game]
for option_key, option in world_type.option_definitions.items():
getattr(self, option_key)[new_id] = option(option.default)
for option_key, option in Options.common_options.items():
getattr(self, option_key)[new_id] = option(option.default)
for option_key, option in Options.per_game_common_options.items():
getattr(self, option_key)[new_id] = option(option.default)
self.worlds[new_id] = world_type(self, new_id)
self.worlds[new_id] = world_type.create_group(self, new_id, players)
self.worlds[new_id].collect_item = classmethod(AutoWorld.World.collect_item).__get__(self.worlds[new_id])
self.player_name[new_id] = name

View File

@ -358,6 +358,21 @@ class World(metaclass=AutoWorldRegister):
logging.warning(f"World {self} is generating a filler item without custom filler pool.")
return self.multiworld.random.choice(tuple(self.item_name_to_id.keys()))
@classmethod
def create_group(cls, multiworld: "MultiWorld", new_player_id: int, players: Set[int]) -> World:
"""Creates a group, which is an instance of World that is responsible for multiple others.
An example case is ItemLinks creating these."""
import Options
for option_key, option in cls.option_definitions.items():
getattr(multiworld, option_key)[new_player_id] = option(option.default)
for option_key, option in Options.common_options.items():
getattr(multiworld, option_key)[new_player_id] = option(option.default)
for option_key, option in Options.per_game_common_options.items():
getattr(multiworld, option_key)[new_player_id] = option(option.default)
return cls(multiworld, new_player_id)
# decent place to implement progressive items, in most cases can stay as-is
def collect_item(self, state: "CollectionState", item: "Item", remove: bool = False) -> Optional[str]:
"""Collect an item name into state. For speed reasons items that aren't logically useful get skipped.