From 60e032510d635468acef10b140a48085114691c8 Mon Sep 17 00:00:00 2001 From: CaitSith2 Date: Fri, 5 Mar 2021 02:50:40 -0800 Subject: [PATCH] Make pre_rolled safer by converting namespace/plandoitems/plandoconnections to/from dict. --- BaseClasses.py | 12 ++++++++++++ Mystery.py | 24 ++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index e226c453..76714117 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -1508,8 +1508,20 @@ class PlandoItem(NamedTuple): else: self.warn(warning) + def to_dict(self): + return {"item": self.item, + "location": self.location, + "world": self.world, + "from_pool": self.from_pool, + "force": self.force} + class PlandoConnection(NamedTuple): entrance: str exit: str direction: str # entrance, exit or both + + def to_dict(self): + return {"entrance": self.entrance, + "exit": self.exit, + "direction": self.direction} diff --git a/Mystery.py b/Mystery.py index d2a0fb09..eb423dce 100644 --- a/Mystery.py +++ b/Mystery.py @@ -193,7 +193,13 @@ def main(args=None, callback=ERmain): settings.shuffle += f"-{random.randint(0, 2 ** 64)}" pre_rolled = dict() - pre_rolled["pre_rolled"] = settings + pre_rolled["pre_rolled"] = vars(settings).copy() + if "plando_items" in pre_rolled["pre_rolled"]: + pre_rolled["pre_rolled"]["plando_items"] = [item.to_dict() for item in pre_rolled["pre_rolled"]["plando_items"]] + if "plando_connections" in pre_rolled["pre_rolled"]: + pre_rolled["pre_rolled"]["plando_connections"] = [connection.to_dict() for connection in pre_rolled["pre_rolled"]["plando_connections"]] + + with open(os.path.join(args.outputpath if args.outputpath else ".", f"{os.path.split(path)[-1].split('.')[0]}_pre_rolled_{seedname}.yaml"), "wt") as f: yaml.dump(pre_rolled, f) for k, v in vars(settings).items(): @@ -366,7 +372,21 @@ def roll_triggers(weights: dict) -> dict: def roll_settings(weights: dict, plando_options: typing.Set[str] = frozenset(("bosses"))): if "pre_rolled" in weights: - return weights["pre_rolled"] + pre_rolled = weights["pre_rolled"] + if isinstance(pre_rolled, argparse.Namespace): + return pre_rolled # Still accept old format pre-rolled, but only with unsafe loading. + + if "plando_items" in pre_rolled: + pre_rolled["plando_items"] = [PlandoItem(item["item"], + item["location"], + item["world"], + item["from_pool"], + item["force"]) for item in pre_rolled["plando_items"]] + if "plando_connections" in pre_rolled: + pre_rolled["plando_connections"] = [PlandoConnection(connection["entrance"], + connection["exit"], + connection["direction"]) for connection in pre_rolled["plando_connections"]] + return argparse.Namespace(**pre_rolled) if "linked_options" in weights: weights = roll_linked_options(weights)