diff --git a/BaseClasses.py b/BaseClasses.py index 45017752..2fc04482 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -1378,6 +1378,11 @@ class Door(object): else: self.passage = False + def kind(self, world): + if self.roomIndex != -1 and self.doorListPos != -1: + return world.get_room(self.roomIndex, self.player).kind(self) + return None + def __eq__(self, other): return isinstance(other, self.__class__) and self.name == other.name diff --git a/CLI.py b/CLI.py index 0ceec234..6f9bd097 100644 --- a/CLI.py +++ b/CLI.py @@ -6,7 +6,6 @@ import textwrap import shlex import sys -import source.classes.constants as CONST from source.classes.BabelFish import BabelFish from Utils import update_deprecated_args @@ -28,44 +27,49 @@ def parse_cli(argv, no_defaults=False): fish = BabelFish(lang=lang) # we need to know how many players we have first + # also if we're loading our own settings file, we should do that now parser = argparse.ArgumentParser(add_help=False) + parser.add_argument('--settingsfile', help="input json file of settings", type=str) parser.add_argument('--multi', default=defval(settings["multi"]), type=lambda value: min(max(int(value), 1), 255)) multiargs, _ = parser.parse_known_args(argv) + if multiargs.settingsfile: + settings = apply_settings_file(settings, multiargs.settingsfile) + parser = argparse.ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter) # get args args = [] - with open(os.path.join("resources","app","cli","args.json")) as argsFile: - args = json.load(argsFile) - for arg in args: - argdata = args[arg] - argname = "--" + arg - argatts = {} - argatts["help"] = "(default: %(default)s)" - if "action" in argdata: - argatts["action"] = argdata["action"] - if "choices" in argdata: - argatts["choices"] = argdata["choices"] - argatts["const"] = argdata["choices"][0] - argatts["default"] = argdata["choices"][0] - argatts["nargs"] = "?" - if arg in settings: - default = settings[arg] - if "type" in argdata and argdata["type"] == "bool": - default = settings[arg] != 0 - argatts["default"] = defval(default) - arghelp = fish.translate("cli","help",arg) - if "help" in argdata and argdata["help"] == "suppress": - argatts["help"] = argparse.SUPPRESS - elif not isinstance(arghelp,str): - argatts["help"] = '\n'.join(arghelp).replace("\\'","'") - else: - argatts["help"] = arghelp + " " + argatts["help"] - parser.add_argument(argname,**argatts) + with open(os.path.join("resources", "app", "cli", "args.json")) as argsFile: + args = json.load(argsFile) + for arg in args: + argdata = args[arg] + argname = "--" + arg + argatts = {} + argatts["help"] = "(default: %(default)s)" + if "action" in argdata: + argatts["action"] = argdata["action"] + if "choices" in argdata: + argatts["choices"] = argdata["choices"] + argatts["const"] = argdata["choices"][0] + argatts["default"] = argdata["choices"][0] + argatts["nargs"] = "?" + if arg in settings: + default = settings[arg] + if "type" in argdata and argdata["type"] == "bool": + default = settings[arg] != 0 + argatts["default"] = defval(default) + arghelp = fish.translate("cli", "help", arg) + if "help" in argdata and argdata["help"] == "suppress": + argatts["help"] = argparse.SUPPRESS + elif not isinstance(arghelp, str): + argatts["help"] = '\n'.join(arghelp).replace("\\'", "'") + else: + argatts["help"] = arghelp + " " + argatts["help"] + parser.add_argument(argname, **argatts) - parser.add_argument('--seed', default=defval(int(settings["seed"]) if settings["seed"] != "" and settings["seed"] is not None else None), help="\n".join(fish.translate("cli","help","seed")), type=int) - parser.add_argument('--count', default=defval(int(settings["count"]) if settings["count"] != "" and settings["count"] is not None else 1), help="\n".join(fish.translate("cli","help","count")), type=int) + parser.add_argument('--seed', default=defval(int(settings["seed"]) if settings["seed"] != "" and settings["seed"] is not None else None), help="\n".join(fish.translate("cli", "help", "seed")), type=int) + parser.add_argument('--count', default=defval(int(settings["count"]) if settings["count"] != "" and settings["count"] is not None else 1), help="\n".join(fish.translate("cli", "help", "count")), type=int) parser.add_argument('--customitemarray', default={}, help=argparse.SUPPRESS) # included for backwards compatibility @@ -73,6 +77,7 @@ def parse_cli(argv, no_defaults=False): parser.add_argument('--multi', default=defval(settings["multi"]), type=lambda value: min(max(int(value), 1), 255)) parser.add_argument('--securerandom', default=defval(settings["securerandom"]), action='store_true') parser.add_argument('--teams', default=defval(1), type=lambda value: max(int(value), 1)) + parser.add_argument('--settingsfile', dest="filename", help="input json file of settings", type=str) if multiargs.multi: for player in range(1, multiargs.multi + 1): @@ -86,7 +91,7 @@ def parse_cli(argv, no_defaults=False): if multiargs.multi: defaults = copy.deepcopy(ret) for player in range(1, multiargs.multi + 1): - playerargs = parse_cli(shlex.split(getattr(ret,f"p{player}")), True) + playerargs = parse_cli(shlex.split(getattr(ret, f"p{player}")), True) for name in ['logic', 'mode', 'swords', 'goal', 'difficulty', 'item_functionality', 'shuffle', 'door_shuffle', 'intensity', 'crystals_ganon', 'crystals_gt', 'openpyramid', @@ -104,6 +109,16 @@ def parse_cli(argv, no_defaults=False): getattr(ret, name)[player] = value return ret + + +def apply_settings_file(settings, settings_path): + if os.path.exists(settings_path): + with open(settings_path) as json_file: + data = json.load(json_file) + for k, v in data.items(): + settings[k] = v + return settings + def parse_settings(): @@ -171,7 +186,7 @@ def parse_settings(): "quickswap": False, "heartcolor": "red", "heartbeep": "normal", - "sprite": os.path.join(".","data","sprites","official","001.link.1.zspr"), + "sprite": os.path.join(".", "data", "sprites", "official", "001.link.1.zspr"), "fastmenu": "normal", "ow_palettes": "default", "uw_palettes": "default", @@ -277,17 +292,15 @@ def parse_settings(): # read saved settings file if it exists and set these settings_path = os.path.join(".", "resources", "user", "settings.json") - if os.path.exists(settings_path): - with(open(settings_path)) as json_file: - data = json.load(json_file) - for k, v in data.items(): - settings[k] = v + settings = apply_settings_file(settings, settings_path) return settings # Priority fallback is: # 1: CLI -# 2: Settings file +# 2: Settings file(s) # 3: Canned defaults + + def get_args_priority(settings_args, gui_args, cli_args): args = {} args["settings"] = parse_settings() if settings_args is None else settings_args @@ -314,7 +327,7 @@ def get_args_priority(settings_args, gui_args, cli_args): for k in vars(args["cli"]): load_doesnt_have_key = k not in args["load"] cli_val = cli[k] - if isinstance(cli_val,dict) and 1 in cli_val: + if isinstance(cli_val, dict) and 1 in cli_val: cli_val = cli_val[1] different_val = (k in args["load"] and k in cli) and (str(args["load"][k]) != str(cli_val)) cli_has_empty_dict = k in cli and isinstance(cli_val, dict) and len(cli_val) == 0 @@ -323,9 +336,9 @@ def get_args_priority(settings_args, gui_args, cli_args): args["load"][k] = cli_val newArgs = {} - for key in [ "settings", "gui", "cli", "load" ]: + for key in ["settings", "gui", "cli", "load"]: if args[key]: - if isinstance(args[key],dict): + if isinstance(args[key], dict): newArgs[key] = argparse.Namespace(**args[key]) else: newArgs[key] = args[key]