diff --git a/Generate.py b/Generate.py index f9607e32..5d65a688 100644 --- a/Generate.py +++ b/Generate.py @@ -166,19 +166,10 @@ def main(args=None) -> tuple[argparse.Namespace, int]: f"A mix is also permitted.") from worlds.AutoWorld import AutoWorldRegister - from worlds.alttp.EntranceRandomizer import parse_arguments - erargs = parse_arguments(['--multi', str(args.multi)]) - erargs.seed = seed - erargs.plando_options = args.plando - erargs.spoiler = args.spoiler - erargs.race = args.race - erargs.outputname = seed_name - erargs.outputpath = args.outputpath - erargs.skip_prog_balancing = args.skip_prog_balancing - erargs.skip_output = args.skip_output - erargs.spoiler_only = args.spoiler_only - erargs.name = {} - erargs.csv_output = args.csv_output + args.outputname = seed_name + args.sprite = dict.fromkeys(range(1, args.multi+1), None) + args.sprite_pool = dict.fromkeys(range(1, args.multi+1), None) + args.name = {} settings_cache: dict[str, tuple[argparse.Namespace, ...]] = \ {fname: (tuple(roll_settings(yaml, args.plando) for yaml in yamls) if args.sameoptions else None) @@ -205,7 +196,7 @@ def main(args=None) -> tuple[argparse.Namespace, int]: for player in range(1, args.multi + 1): player_path_cache[player] = player_files.get(player, args.weights_file_path) name_counter = Counter() - erargs.player_options = {} + args.player_options = {} player = 1 while player <= args.multi: @@ -218,21 +209,21 @@ def main(args=None) -> tuple[argparse.Namespace, int]: for k, v in vars(settingsObject).items(): if v is not None: try: - getattr(erargs, k)[player] = v + getattr(args, k)[player] = v except AttributeError: - setattr(erargs, k, {player: v}) + setattr(args, k, {player: v}) except Exception as e: raise Exception(f"Error setting {k} to {v} for player {player}") from e # name was not specified - if player not in erargs.name: + if player not in args.name: if path == args.weights_file_path: # weights file, so we need to make the name unique - erargs.name[player] = f"Player{player}" + args.name[player] = f"Player{player}" else: # use the filename - erargs.name[player] = os.path.splitext(os.path.split(path)[-1])[0] - erargs.name[player] = handle_name(erargs.name[player], player, name_counter) + args.name[player] = os.path.splitext(os.path.split(path)[-1])[0] + args.name[player] = handle_name(args.name[player], player, name_counter) player += 1 except Exception as e: @@ -240,10 +231,10 @@ def main(args=None) -> tuple[argparse.Namespace, int]: else: raise RuntimeError(f'No weights specified for player {player}') - if len(set(name.lower() for name in erargs.name.values())) != len(erargs.name): - raise Exception(f"Names have to be unique. Names: {Counter(name.lower() for name in erargs.name.values())}") + if len(set(name.lower() for name in args.name.values())) != len(args.name): + raise Exception(f"Names have to be unique. Names: {Counter(name.lower() for name in args.name.values())}") - return erargs, seed + return args, seed def read_weights_yamls(path) -> tuple[Any, ...]: diff --git a/Main.py b/Main.py index bc278757..6d81ff23 100644 --- a/Main.py +++ b/Main.py @@ -37,7 +37,7 @@ def main(args, seed=None, baked_server_options: dict[str, object] | None = None) logger = logging.getLogger() multiworld.set_seed(seed, args.race, str(args.outputname) if args.outputname else None) - multiworld.plando_options = args.plando_options + multiworld.plando_options = args.plando multiworld.game = args.game.copy() multiworld.player_name = args.name.copy() multiworld.sprite = args.sprite.copy() diff --git a/WebHost.py b/WebHost.py index 946eaa11..fd8daeb3 100644 --- a/WebHost.py +++ b/WebHost.py @@ -99,11 +99,11 @@ if __name__ == "__main__": multiprocessing.set_start_method('spawn') logging.basicConfig(format='[%(asctime)s] %(message)s', level=logging.INFO) - from WebHostLib.lttpsprites import update_sprites_lttp from WebHostLib.autolauncher import autohost, autogen, stop from WebHostLib.options import create as create_options_files try: + from WebHostLib.lttpsprites import update_sprites_lttp update_sprites_lttp() except Exception as e: logging.exception(e) diff --git a/WebHostLib/generate.py b/WebHostLib/generate.py index 02f5a037..6ca8c1c8 100644 --- a/WebHostLib/generate.py +++ b/WebHostLib/generate.py @@ -12,12 +12,11 @@ from flask import flash, redirect, render_template, request, session, url_for from pony.orm import commit, db_session from BaseClasses import get_seed, seeddigits -from Generate import PlandoOptions, handle_name +from Generate import PlandoOptions, handle_name, mystery_argparse from Main import main as ERmain from Utils import __version__, restricted_dumps from WebHostLib import app from settings import ServerOptions, GeneratorOptions -from worlds.alttp.EntranceRandomizer import parse_arguments from .check import get_yaml_data, roll_options from .models import Generation, STATE_ERROR, STATE_QUEUED, Seed, UUID from .upload import upload_zip_to_db @@ -129,36 +128,39 @@ def gen_game(gen_options: dict, meta: dict[str, Any] | None = None, owner=None, seedname = "W" + (f"{random.randint(0, pow(10, seeddigits) - 1)}".zfill(seeddigits)) - erargs = parse_arguments(['--multi', str(playercount)]) - erargs.seed = seed - erargs.name = {x: "" for x in range(1, playercount + 1)} # only so it can be overwritten in mystery - erargs.spoiler = meta["generator_options"].get("spoiler", 0) - erargs.race = race - erargs.outputname = seedname - erargs.outputpath = target.name - erargs.teams = 1 - erargs.plando_options = PlandoOptions.from_set(meta.setdefault("plando_options", - {"bosses", "items", "connections", "texts"})) - erargs.skip_prog_balancing = False - erargs.skip_output = False - erargs.spoiler_only = False - erargs.csv_output = False + args = mystery_argparse() + args.multi = playercount + args.seed = seed + args.name = {x: "" for x in range(1, playercount + 1)} # only so it can be overwritten in mystery + args.spoiler = meta["generator_options"].get("spoiler", 0) + args.race = race + args.outputname = seedname + args.outputpath = target.name + args.teams = 1 + args.plando_options = PlandoOptions.from_set(meta.setdefault("plando_options", + {"bosses", "items", "connections", "texts"})) + args.skip_prog_balancing = False + args.skip_output = False + args.spoiler_only = False + args.csv_output = False + args.sprite = dict.fromkeys(range(1, args.multi+1), None) + args.sprite_pool = dict.fromkeys(range(1, args.multi+1), None) name_counter = Counter() for player, (playerfile, settings) in enumerate(gen_options.items(), 1): for k, v in settings.items(): if v is not None: - if hasattr(erargs, k): - getattr(erargs, k)[player] = v + if hasattr(args, k): + getattr(args, k)[player] = v else: - setattr(erargs, k, {player: v}) + setattr(args, k, {player: v}) - if not erargs.name[player]: - erargs.name[player] = os.path.splitext(os.path.split(playerfile)[-1])[0] - erargs.name[player] = handle_name(erargs.name[player], player, name_counter) - if len(set(erargs.name.values())) != len(erargs.name): - raise Exception(f"Names have to be unique. Names: {Counter(erargs.name.values())}") - ERmain(erargs, seed, baked_server_options=meta["server_options"]) + if not args.name[player]: + args.name[player] = os.path.splitext(os.path.split(playerfile)[-1])[0] + args.name[player] = handle_name(args.name[player], player, name_counter) + if len(set(args.name.values())) != len(args.name): + raise Exception(f"Names have to be unique. Names: {Counter(args.name.values())}") + ERmain(args, seed, baked_server_options=meta["server_options"]) return upload_to_db(target.name, sid, owner, race) thread_pool = concurrent.futures.ThreadPoolExecutor(max_workers=1) diff --git a/WebHostLib/lttpsprites.py b/WebHostLib/lttpsprites.py index 9d780b13..3bf596db 100644 --- a/WebHostLib/lttpsprites.py +++ b/WebHostLib/lttpsprites.py @@ -3,10 +3,10 @@ import threading import json from Utils import local_path, user_path -from worlds.alttp.Rom import Sprite def update_sprites_lttp(): + from worlds.alttp.Rom import Sprite from tkinter import Tk from LttPAdjuster import get_image_for_sprite from LttPAdjuster import BackgroundTaskProgress diff --git a/worlds/bumpstik/Items.py b/worlds/bumpstik/Items.py index c714b743..c78668f7 100644 --- a/worlds/bumpstik/Items.py +++ b/worlds/bumpstik/Items.py @@ -6,7 +6,6 @@ import typing from BaseClasses import Item, ItemClassification -from worlds.alttp import ALTTPWorld class BumpStikLttPText(typing.NamedTuple): @@ -117,13 +116,17 @@ item_table = { item: offset + x for x, item in enumerate(LttPCreditsText.keys()) } -ALTTPWorld.pedestal_credit_texts.update({item_table[name]: f"and the {texts.pedestal}" - for name, texts in LttPCreditsText.items()}) -ALTTPWorld.sickkid_credit_texts.update( - {item_table[name]: texts.sickkid for name, texts in LttPCreditsText.items()}) -ALTTPWorld.magicshop_credit_texts.update( - {item_table[name]: texts.magicshop for name, texts in LttPCreditsText.items()}) -ALTTPWorld.zora_credit_texts.update( - {item_table[name]: texts.zora for name, texts in LttPCreditsText.items()}) -ALTTPWorld.fluteboy_credit_texts.update( - {item_table[name]: texts.fluteboy for name, texts in LttPCreditsText.items()}) +try: + from worlds.alttp import ALTTPWorld + ALTTPWorld.pedestal_credit_texts.update({item_table[name]: f"and the {texts.pedestal}" + for name, texts in LttPCreditsText.items()}) + ALTTPWorld.sickkid_credit_texts.update( + {item_table[name]: texts.sickkid for name, texts in LttPCreditsText.items()}) + ALTTPWorld.magicshop_credit_texts.update( + {item_table[name]: texts.magicshop for name, texts in LttPCreditsText.items()}) + ALTTPWorld.zora_credit_texts.update( + {item_table[name]: texts.zora for name, texts in LttPCreditsText.items()}) + ALTTPWorld.fluteboy_credit_texts.update( + {item_table[name]: texts.fluteboy for name, texts in LttPCreditsText.items()}) +except ModuleNotFoundError: + pass diff --git a/worlds/meritous/Items.py b/worlds/meritous/Items.py index 9f28c5d1..030c93dd 100644 --- a/worlds/meritous/Items.py +++ b/worlds/meritous/Items.py @@ -6,7 +6,6 @@ import typing from BaseClasses import Item, ItemClassification -from worlds.alttp import ALTTPWorld class MeritousLttPText(typing.NamedTuple): @@ -206,9 +205,13 @@ item_groups = { "Crystals": ["Crystals x500", "Crystals x1000", "Crystals x2000"] } -ALTTPWorld.pedestal_credit_texts.update({item_table[name]: f"and the {texts.pedestal}" - for name, texts in LttPCreditsText.items()}) -ALTTPWorld.sickkid_credit_texts.update({item_table[name]: texts.sickkid for name, texts in LttPCreditsText.items()}) -ALTTPWorld.magicshop_credit_texts.update({item_table[name]: texts.magicshop for name, texts in LttPCreditsText.items()}) -ALTTPWorld.zora_credit_texts.update({item_table[name]: texts.zora for name, texts in LttPCreditsText.items()}) -ALTTPWorld.fluteboy_credit_texts.update({item_table[name]: texts.fluteboy for name, texts in LttPCreditsText.items()}) +try: + from worlds.alttp import ALTTPWorld + ALTTPWorld.pedestal_credit_texts.update({item_table[name]: f"and the {texts.pedestal}" + for name, texts in LttPCreditsText.items()}) + ALTTPWorld.sickkid_credit_texts.update({item_table[name]: texts.sickkid for name, texts in LttPCreditsText.items()}) + ALTTPWorld.magicshop_credit_texts.update({item_table[name]: texts.magicshop for name, texts in LttPCreditsText.items()}) + ALTTPWorld.zora_credit_texts.update({item_table[name]: texts.zora for name, texts in LttPCreditsText.items()}) + ALTTPWorld.fluteboy_credit_texts.update({item_table[name]: texts.fluteboy for name, texts in LttPCreditsText.items()}) +except ModuleNotFoundError: + pass