diff --git a/MultiClient.py b/MultiClient.py index 612e7403..245de3e6 100644 --- a/MultiClient.py +++ b/MultiClient.py @@ -786,6 +786,8 @@ async def process_server_cmd(ctx: Context, cmd, args): raise Exception( 'Invalid ROM detected, please verify that you have loaded the correct rom and reconnect your snes (/snes)') if 'SlotAlreadyTaken' in args: + Utils.persistent_store("servers", "default", ctx.server_address) + Utils.persistent_store("servers", "".join(chr(x) for x in ctx.rom), ctx.server_address) raise Exception('Player slot already in use for that team') if 'IncompatibleVersion' in args: raise Exception('Server reported your client version as incompatible') @@ -1281,26 +1283,15 @@ async def main(): meta, romfile = Patch.create_rom_file(args.diff_file) args.connect = meta["server"] logging.info(f"Wrote rom file to {romfile}") - adjuster_settings = Utils.persistent_load().get("adjuster", {}).get("last_settings", {}) - if adjuster_settings: - import pprint - adjuster_settings.rom = romfile - adjuster_settings.baserom = Patch.get_base_rom_path() - whitelist = {"disablemusic", "fastmenu", "heartbeep", "heartcolor", "ow_palettes", "quickswap", - "uw_palettes"} - printed_options = {name: value for name, value in vars(adjuster_settings).items() if name in whitelist} - sprite = getattr(adjuster_settings, "sprite", None) - if sprite: - printed_options["sprite"]: adjuster_settings.sprite.name - adjust_wanted = input(f"Last used adjuster settings were found. Would you like to apply these? \n" - f"{pprint.pformat(printed_options)}\n" - f"Enter yes or no: ") - if adjust_wanted and adjust_wanted.startswith("y"): - import AdjusterMain - _, romfile = AdjusterMain.adjust(adjuster_settings) - else: - logging.info("Skipping post-patch adjustment") - asyncio.create_task(run_game(romfile)) + adjustedromfile, adjusted = Utils.get_adjuster_settings(romfile) + if adjusted: + try: + import os + os.replace(adjustedromfile, romfile) + adjustedromfile = romfile + except Exception as e: + logging.exception(e) + asyncio.create_task(run_game(adjustedromfile if adjusted else romfile)) ctx = Context(args.snes, args.connect, args.password, args.founditems, port) input_task = create_named_task(console_loop(ctx), name="Input") diff --git a/Patch.py b/Patch.py index 132cc463..766d66a6 100644 --- a/Patch.py +++ b/Patch.py @@ -61,6 +61,8 @@ def create_patch_file(rom_file_to_patch: str, server: str = "") -> str: def create_rom_file(patch_file: str) -> Tuple[dict, str]: data = Utils.parse_yaml(lzma.decompress(load_bytes(patch_file)).decode("utf-8-sig")) patched_data = bsdiff4.patch(get_base_rom_bytes(), data["patch"]) + rom_hash = patched_data[int(0x7FC0):int(0x7FD5)] + data["meta"]["hash"] = "".join(chr(x) for x in rom_hash) target = os.path.splitext(patch_file)[0] + ".sfc" with open(target, "wb") as f: f.write(patched_data) @@ -96,7 +98,6 @@ if __name__ == "__main__": with concurrent.futures.ThreadPoolExecutor() as pool: for rom in sys.argv: try: - if rom.endswith(".sfc"): print(f"Creating patch for {rom}") result = pool.submit(create_patch_file, rom, address) @@ -105,10 +106,29 @@ if __name__ == "__main__": elif rom.endswith(".bmbp"): print(f"Applying patch {rom}") data, target = create_rom_file(rom) - print(f"Created rom {target}.") + romfile, adjusted = Utils.get_adjuster_settings(target) + if adjusted: + try: + os.replace(romfile, target) + romfile = target + except Exception as e: + print(e) + print(f"Created rom {romfile if adjusted else target}.") if 'server' in data: + Utils.persistent_store("servers", data['hash'], data['server']) print(f"Host is {data['server']}") + elif rom.endswith("_multidata"): + import json + import zlib + with open(rom, 'rb') as fr: + multidata = zlib.decompress(fr.read()).decode("utf-8") + with open(rom + '.txt', 'w') as fw: + fw.write(multidata) + multidata = json.loads(multidata) + for rom in multidata['roms']: + Utils.persistent_store("servers", "".join(chr(byte) for byte in rom[2]), address) + elif rom.endswith(".zip"): print(f"Updating host in patch files contained in {rom}") diff --git a/Utils.py b/Utils.py index 2e23c75a..825c3b79 100644 --- a/Utils.py +++ b/Utils.py @@ -244,6 +244,43 @@ def persistent_load() -> typing.Dict[dict]: return storage +def get_adjuster_settings(romfile: str): + if hasattr(get_adjuster_settings, "adjuster_settings"): + adjuster_settings = getattr(get_adjuster_settings, "adjuster_settings") + else: + adjuster_settings = persistent_load().get("adjuster", {}).get("last_settings", {}) + if adjuster_settings: + import pprint + import Patch + adjuster_settings.rom = romfile + adjuster_settings.baserom = Patch.get_base_rom_path() + whitelist = {"disablemusic", "fastmenu", "heartbeep", "heartcolor", "ow_palettes", "quickswap", + "uw_palettes"} + printed_options = {name: value for name, value in vars(adjuster_settings).items() if name in whitelist} + sprite = getattr(adjuster_settings, "sprite", None) + if sprite: + printed_options["sprite"] = adjuster_settings.sprite.name + if hasattr(get_adjuster_settings, "adjust_wanted"): + adjust_wanted = getattr(get_adjuster_settings, "adjust_wanted") + else: + adjust_wanted = input(f"Last used adjuster settings were found. Would you like to apply these? \n" + f"{pprint.pformat(printed_options)}\n" + f"Enter yes or no: ") + if adjust_wanted and adjust_wanted.startswith("y"): + adjusted = True + import AdjusterMain + _, romfile = AdjusterMain.adjust(adjuster_settings) + else: + adjusted = False + import logging + if not hasattr(get_adjuster_settings, "adjust_wanted"): + logging.info(f"Skipping post-patch adjustment") + get_adjuster_settings.adjuster_settings = adjuster_settings + get_adjuster_settings.adjust_wanted = adjust_wanted + return romfile, adjusted + + + class ReceivedItem(typing.NamedTuple): item: int location: int