From e114ed5566abe4c51cae90b9215545dd5701315a Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Sun, 24 Sep 2023 01:51:26 +0200 Subject: [PATCH] Core: offer API hook to modify Group World creation --- BaseClasses.py | 9 +-------- worlds/AutoWorld.py | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index 26cdfb52..535338b4 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -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 diff --git a/worlds/AutoWorld.py b/worlds/AutoWorld.py index 217269aa..e2fda16b 100644 --- a/worlds/AutoWorld.py +++ b/worlds/AutoWorld.py @@ -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.