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.player_types[new_id] = NetUtils.SlotType.group
self._region_cache[new_id] = {} self._region_cache[new_id] = {}
world_type = AutoWorld.AutoWorldRegister.world_types[game] world_type = AutoWorld.AutoWorldRegister.world_types[game]
for option_key, option in world_type.option_definitions.items(): self.worlds[new_id] = world_type.create_group(self, new_id, players)
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].collect_item = classmethod(AutoWorld.World.collect_item).__get__(self.worlds[new_id]) self.worlds[new_id].collect_item = classmethod(AutoWorld.World.collect_item).__get__(self.worlds[new_id])
self.player_name[new_id] = name 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.") 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())) 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 # 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]: 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. """Collect an item name into state. For speed reasons items that aren't logically useful get skipped.