diff --git a/BaseClasses.py b/BaseClasses.py index 0989999d..5604596f 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -1,20 +1,20 @@ from __future__ import annotations -from argparse import Namespace import copy -from enum import unique, IntEnum, IntFlag -import logging -import json import functools -from collections import OrderedDict, Counter, deque -from typing import List, Dict, Optional, Set, Iterable, Union, Any, Tuple, TypedDict, Callable, NamedTuple -import typing # this can go away when Python 3.8 support is dropped -import secrets +import json +import logging import random +import secrets +import typing # this can go away when Python 3.8 support is dropped +from argparse import Namespace +from collections import OrderedDict, Counter, deque +from enum import unique, IntEnum, IntFlag +from typing import List, Dict, Optional, Set, Iterable, Union, Any, Tuple, TypedDict, Callable, NamedTuple +import NetUtils import Options import Utils -import NetUtils class Group(TypedDict, total=False): @@ -48,6 +48,7 @@ class MultiWorld(): precollected_items: Dict[int, List[Item]] state: CollectionState + plando_settings: PlandoSettings accessibility: Dict[int, Options.Accessibility] early_items: Dict[int, Dict[str, int]] local_early_items: Dict[int, Dict[str, int]] @@ -160,6 +161,7 @@ class MultiWorld(): self.custom_data = {} self.worlds = {} self.slot_seeds = {} + self.plando_settings = PlandoSettings.none def get_all_ids(self) -> Tuple[int, ...]: return self.player_ids + tuple(self.groups) @@ -1558,6 +1560,7 @@ class Spoiler(): Utils.__version__, self.multiworld.seed)) outfile.write('Filling Algorithm: %s\n' % self.multiworld.algorithm) outfile.write('Players: %d\n' % self.multiworld.players) + outfile.write(f'Plando Options: {self.multiworld.plando_settings}\n') AutoWorld.call_stage(self.multiworld, "write_spoiler_header", outfile) for player in range(1, self.multiworld.players + 1): @@ -1674,6 +1677,45 @@ class Tutorial(NamedTuple): authors: List[str] +class PlandoSettings(IntFlag): + none = 0b0000 + items = 0b0001 + connections = 0b0010 + texts = 0b0100 + bosses = 0b1000 + + @classmethod + def from_option_string(cls, option_string: str) -> PlandoSettings: + result = cls(0) + for part in option_string.split(","): + part = part.strip().lower() + if part: + result = cls._handle_part(part, result) + return result + + @classmethod + def from_set(cls, option_set: Set[str]) -> PlandoSettings: + result = cls(0) + for part in option_set: + result = cls._handle_part(part, result) + return result + + @classmethod + def _handle_part(cls, part: str, base: PlandoSettings) -> PlandoSettings: + try: + part = cls[part] + except Exception as e: + raise KeyError(f"{part} is not a recognized name for a plando module. " + f"Known options: {', '.join(flag.name for flag in cls)}") from e + else: + return base | part + + def __str__(self) -> str: + if self.value: + return ", ".join(flag.name for flag in PlandoSettings if self.value & flag.value) + return "None" + + seeddigits = 20 diff --git a/Generate.py b/Generate.py index 04c081b4..d7fe965d 100644 --- a/Generate.py +++ b/Generate.py @@ -2,14 +2,13 @@ from __future__ import annotations import argparse import logging -import random -import urllib.request -import urllib.parse -from typing import Set, Dict, Tuple, Callable, Any, Union import os -from collections import Counter, ChainMap +import random import string -import enum +import urllib.parse +import urllib.request +from collections import Counter, ChainMap +from typing import Dict, Tuple, Callable, Any, Union import ModuleUpdate @@ -18,52 +17,17 @@ ModuleUpdate.update() import Utils from worlds.alttp import Options as LttPOptions from worlds.generic import PlandoConnection -from Utils import parse_yamls, version_tuple, __version__, tuplize_version, get_options, local_path, user_path +from Utils import parse_yamls, version_tuple, __version__, tuplize_version, get_options, user_path from worlds.alttp.EntranceRandomizer import parse_arguments from Main import main as ERmain -from BaseClasses import seeddigits, get_seed +from BaseClasses import seeddigits, get_seed, PlandoSettings import Options from worlds.alttp.Text import TextTable from worlds.AutoWorld import AutoWorldRegister import copy -class PlandoSettings(enum.IntFlag): - items = 0b0001 - connections = 0b0010 - texts = 0b0100 - bosses = 0b1000 - @classmethod - def from_option_string(cls, option_string: str) -> PlandoSettings: - result = cls(0) - for part in option_string.split(","): - part = part.strip().lower() - if part: - result = cls._handle_part(part, result) - return result - - @classmethod - def from_set(cls, option_set: Set[str]) -> PlandoSettings: - result = cls(0) - for part in option_set: - result = cls._handle_part(part, result) - return result - - @classmethod - def _handle_part(cls, part: str, base: PlandoSettings) -> PlandoSettings: - try: - part = cls[part] - except Exception as e: - raise KeyError(f"{part} is not a recognized name for a plando module. " - f"Known options: {', '.join(flag.name for flag in cls)}") from e - else: - return base | part - - def __str__(self) -> str: - if self.value: - return ", ".join(flag.name for flag in PlandoSettings if self.value & flag.value) - return "Off" def mystery_argparse(): @@ -170,6 +134,7 @@ def main(args=None, callback=ERmain): f"A mix is also permitted.") erargs = parse_arguments(['--multi', str(args.multi)]) erargs.seed = seed + erargs.plando_settings = args.plando erargs.glitch_triforce = options["generator"]["glitch_triforce_room"] erargs.spoiler = args.spoiler erargs.race = args.race @@ -226,7 +191,7 @@ def main(args=None, callback=ERmain): elif not erargs.name[player]: # if name was not specified, generate it from filename erargs.name[player] = os.path.splitext(os.path.split(path)[-1])[0] erargs.name[player] = handle_name(erargs.name[player], player, name_counter) - + player += 1 except Exception as e: raise ValueError(f"File {path} is destroyed. Please fix your yaml.") from e diff --git a/Main.py b/Main.py index 78da5285..a623fb82 100644 --- a/Main.py +++ b/Main.py @@ -38,6 +38,7 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No logger = logging.getLogger() world.set_seed(seed, args.race, str(args.outputname if args.outputname else world.seed)) + world.plando_settings = args.plando_settings world.shuffle = args.shuffle.copy() world.logic = args.logic.copy()