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