Core: Add an "options" arg to setup_multiworld so that non-default options can be set in it #5414
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
from argparse import Namespace
|
from argparse import Namespace
|
||||||
from typing import List, Optional, Tuple, Type, Union
|
from typing import Any, List, Optional, Tuple, Type
|
||||||
|
|
||||||
from BaseClasses import CollectionState, Item, ItemClassification, Location, MultiWorld, Region
|
from BaseClasses import CollectionState, Item, ItemClassification, Location, MultiWorld, Region
|
||||||
from worlds import network_data_package
|
from worlds import network_data_package
|
||||||
@@ -31,8 +31,8 @@ def setup_solo_multiworld(
|
|||||||
return setup_multiworld(world_type, steps, seed)
|
return setup_multiworld(world_type, steps, seed)
|
||||||
|
|
||||||
|
|
||||||
def setup_multiworld(worlds: Union[List[Type[World]], Type[World]], steps: Tuple[str, ...] = gen_steps,
|
def setup_multiworld(worlds: list[type[World]] | type[World], steps: tuple[str, ...] = gen_steps,
|
||||||
seed: Optional[int] = None) -> MultiWorld:
|
seed: int | None = None, options: dict[str, Any] | list[dict[str, Any]] = None) -> MultiWorld:
|
||||||
"""
|
"""
|
||||||
Creates a multiworld with a player for each provided world type, allowing duplicates, setting default options, and
|
Creates a multiworld with a player for each provided world type, allowing duplicates, setting default options, and
|
||||||
calling the provided gen steps.
|
calling the provided gen steps.
|
||||||
@@ -40,20 +40,27 @@ def setup_multiworld(worlds: Union[List[Type[World]], Type[World]], steps: Tuple
|
|||||||
:param worlds: Type/s of worlds to generate a multiworld for
|
:param worlds: Type/s of worlds to generate a multiworld for
|
||||||
:param steps: Gen steps that should be called before returning. Default calls through pre_fill
|
:param steps: Gen steps that should be called before returning. Default calls through pre_fill
|
||||||
:param seed: The seed to be used when creating this multiworld
|
:param seed: The seed to be used when creating this multiworld
|
||||||
|
:param options: Options to set on each world. If just one dict of options is passed, it will be used for all worlds.
|
||||||
:return: The generated multiworld
|
:return: The generated multiworld
|
||||||
"""
|
"""
|
||||||
if not isinstance(worlds, list):
|
if not isinstance(worlds, list):
|
||||||
worlds = [worlds]
|
worlds = [worlds]
|
||||||
|
|
||||||
|
if options is None:
|
||||||
|
options = [{}] * len(worlds)
|
||||||
|
elif not isinstance(options, list):
|
||||||
|
options = [options] * len(worlds)
|
||||||
|
|
||||||
players = len(worlds)
|
players = len(worlds)
|
||||||
multiworld = MultiWorld(players)
|
multiworld = MultiWorld(players)
|
||||||
multiworld.game = {player: world_type.game for player, world_type in enumerate(worlds, 1)}
|
multiworld.game = {player: world_type.game for player, world_type in enumerate(worlds, 1)}
|
||||||
multiworld.player_name = {player: f"Tester{player}" for player in multiworld.player_ids}
|
multiworld.player_name = {player: f"Tester{player}" for player in multiworld.player_ids}
|
||||||
multiworld.set_seed(seed)
|
multiworld.set_seed(seed)
|
||||||
args = Namespace()
|
args = Namespace()
|
||||||
for player, world_type in enumerate(worlds, 1):
|
for player, (world_type, option_overrides) in enumerate(zip(worlds, options), 1):
|
||||||
for key, option in world_type.options_dataclass.type_hints.items():
|
for key, option in world_type.options_dataclass.type_hints.items():
|
||||||
updated_options = getattr(args, key, {})
|
updated_options = getattr(args, key, {})
|
||||||
updated_options[player] = option.from_any(option.default)
|
updated_options[player] = option.from_any(option_overrides.get(key, option.default))
|
||||||
setattr(args, key, updated_options)
|
setattr(args, key, updated_options)
|
||||||
multiworld.set_options(args)
|
multiworld.set_options(args)
|
||||||
multiworld.state = CollectionState(multiworld)
|
multiworld.state = CollectionState(multiworld)
|
||||||
|
|||||||
Reference in New Issue
Block a user