changes
* Allow patch.py to mass adjust roms * Allow patch.py store target server address for patch.
This commit is contained in:
		
							parent
							
								
									ae289ec305
								
							
						
					
					
						commit
						91cb0630fa
					
				|  | @ -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") | ||||
|  |  | |||
							
								
								
									
										24
									
								
								Patch.py
								
								
								
								
							
							
						
						
									
										24
									
								
								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}") | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										37
									
								
								Utils.py
								
								
								
								
							
							
						
						
									
										37
									
								
								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 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue