Merge pull request #103 from Berserker66/patch_changes
Allow patch.py to mass adjust roms. (It asks on first slot, and if yes is said, applies to ALL patches.) Allow patch.py store target server address for patch.
This commit is contained in:
commit
8a0bae0252
|
@ -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')
|
||||
|
@ -1284,26 +1286,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