diff --git a/MultiMystery.py b/MultiMystery.py index 15a041f7..fc1a7167 100644 --- a/MultiMystery.py +++ b/MultiMystery.py @@ -91,7 +91,7 @@ if __name__ == "__main__": elif os.path.exists("BerserkerMultiServer"): basemysterycommand = "BerserkerMystery" # compiled linux else: - basemysterycommand = f"py -{py_version} Mystery.py" #source + basemysterycommand = f"py -{py_version} Mystery.py" # source command = f"{basemysterycommand} --multi {len(player_files)} {player_string} " \ f"--rom \"{rom_file}\" --enemizercli \"{enemizer_path}\" " \ @@ -101,6 +101,8 @@ if __name__ == "__main__": command += " --create_spoiler" if create_spoiler == 2: command += " --skip_playthrough" + if zip_diffs: + command += " --create_diff" if race: command += " --race" if os.path.exists(os.path.join(player_files_path, meta_file_path)): @@ -108,9 +110,10 @@ if __name__ == "__main__": print(command) import time + start = time.perf_counter() text = subprocess.check_output(command, shell=True).decode() - print(f"Took {time.perf_counter()-start:.3f} seconds to generate rom(s).") + print(f"Took {time.perf_counter() - start:.3f} seconds to generate multiworld.") seedname = "" for segment in text.split(): @@ -161,25 +164,29 @@ if __name__ == "__main__": ipv4 = (host if host else get_public_ipv4()) + ":" + str(port) - def _handle_file(file: str): - if zip_diffs: - # the main reason for using threading, the patch is created using bsdiff4, which frees the GIL - diff = os.path.split(create_patch_file(os.path.join(output_path, file), ipv4))[1] - pack_file(diff) - if zip_diffs == 2: - remove_zipped_file(diff) + def _handle_sfc_file(file: str): if zip_roms: pack_file(file) if zip_roms == 2 and player_name.lower() not in file.lower(): remove_zipped_file(file) + def _handle_diff_file(file: str): + if zip_diffs > 0: + pack_file(file) + if zip_diffs == 2: + remove_zipped_file(file) + + with concurrent.futures.ThreadPoolExecutor() as pool: futures = [] with zipfile.ZipFile(zipname, "w", compression=compression, compresslevel=9) as zf: for file in os.listdir(output_path): - if file.endswith(".sfc") and seedname in file: - futures.append(pool.submit(_handle_file, file)) + if seedname in file: + if file.endswith(".sfc"): + futures.append(pool.submit(_handle_sfc_file, file)) + elif file.endswith(".bmbp"): + futures.append(pool.submit(_handle_diff_file, file)) if zip_multidata and os.path.exists(os.path.join(output_path, multidataname)): pack_file(multidataname) diff --git a/Mystery.py b/Mystery.py index dc89e4b2..7c08377e 100644 --- a/Mystery.py +++ b/Mystery.py @@ -40,6 +40,7 @@ def mystery_argparse(): parser.add_argument('--meta', default=None) parser.add_argument('--log_output_path', help='Path to store output log') parser.add_argument('--loglevel', default='info', help='Sets log level') + parser.add_argument('--create_diff', action="store_true") parser.add_argument('--yaml_output', default=0, type=lambda value: min(max(int(value), 0), 255), help='Output rolled mystery results to yaml up to specified number (made for async multiworld)') @@ -93,6 +94,7 @@ def main(args=None, callback = ERmain): erargs.seed = seed erargs.name = {x: "" for x in range(1, args.multi + 1)} # only so it can be overwrittin in mystery erargs.create_spoiler = args.create_spoiler + erargs.create_diff = args.create_diff erargs.race = args.race erargs.skip_playthrough = args.skip_playthrough erargs.outputname = seedname diff --git a/host.yaml b/host.yaml index 6d6931d4..1956199c 100644 --- a/host.yaml +++ b/host.yaml @@ -71,7 +71,7 @@ multi_mystery_options: #1 -> Create a zip #2 -> Create a zip and delete the ROMs that will be in it, except the hosts (requires player_name to be set correctly) zip_roms: 0 - # zip diff files, 2-> delete the non-zipped one. Note that diffs are only created if they are placed in a zip. + # zip diff files, 2 -> delete the non-zipped one. -1 -> create them without zipping zip_diffs: 2 #include the spoiler log in the zip, 2 -> delete the non-zipped one zip_spoiler: 0