52 lines
2.2 KiB
Python
52 lines
2.2 KiB
Python
from argparse import Namespace
|
|
from typing import List, Optional, Tuple, Type, Union
|
|
|
|
from BaseClasses import CollectionState, MultiWorld
|
|
from worlds.AutoWorld import World, call_all
|
|
|
|
gen_steps = ("generate_early", "create_regions", "create_items", "set_rules", "generate_basic", "pre_fill")
|
|
|
|
|
|
def setup_solo_multiworld(
|
|
world_type: Type[World], steps: Tuple[str, ...] = gen_steps, seed: Optional[int] = None
|
|
) -> MultiWorld:
|
|
"""
|
|
Creates a multiworld with a single player of `world_type`, sets default options, and calls provided gen steps.
|
|
|
|
:param world_type: Type of the world to generate a multiworld for
|
|
:param steps: The gen steps that should be called on the generated multiworld before returning. Default calls
|
|
steps through pre_fill
|
|
:param seed: The seed to be used when creating this multiworld
|
|
"""
|
|
return setup_multiworld(world_type, steps, seed)
|
|
|
|
|
|
def setup_multiworld(worlds: Union[List[Type[World]], Type[World]], steps: Tuple[str, ...] = gen_steps,
|
|
seed: Optional[int] = None) -> MultiWorld:
|
|
"""
|
|
Creates a multiworld with a player for each provided world type, allowing duplicates, setting default options, and
|
|
calling the provided gen steps.
|
|
|
|
: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 seed: The seed to be used when creating this multiworld
|
|
"""
|
|
if not isinstance(worlds, list):
|
|
worlds = [worlds]
|
|
players = len(worlds)
|
|
multiworld = MultiWorld(players)
|
|
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.set_seed(seed)
|
|
multiworld.state = CollectionState(multiworld)
|
|
args = Namespace()
|
|
for player, world_type in enumerate(worlds, 1):
|
|
for key, option in world_type.options_dataclass.type_hints.items():
|
|
updated_options = getattr(args, key, {})
|
|
updated_options[player] = option.from_any(option.default)
|
|
setattr(args, key, updated_options)
|
|
multiworld.set_options(args)
|
|
for step in steps:
|
|
call_all(multiworld, step)
|
|
return multiworld
|