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(
|
raise Exception(
|
||||||
'Invalid ROM detected, please verify that you have loaded the correct rom and reconnect your snes (/snes)')
|
'Invalid ROM detected, please verify that you have loaded the correct rom and reconnect your snes (/snes)')
|
||||||
if 'SlotAlreadyTaken' in args:
|
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')
|
raise Exception('Player slot already in use for that team')
|
||||||
if 'IncompatibleVersion' in args:
|
if 'IncompatibleVersion' in args:
|
||||||
raise Exception('Server reported your client version as incompatible')
|
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)
|
meta, romfile = Patch.create_rom_file(args.diff_file)
|
||||||
args.connect = meta["server"]
|
args.connect = meta["server"]
|
||||||
logging.info(f"Wrote rom file to {romfile}")
|
logging.info(f"Wrote rom file to {romfile}")
|
||||||
adjuster_settings = Utils.persistent_load().get("adjuster", {}).get("last_settings", {})
|
adjustedromfile, adjusted = Utils.get_adjuster_settings(romfile)
|
||||||
if adjuster_settings:
|
if adjusted:
|
||||||
import pprint
|
try:
|
||||||
adjuster_settings.rom = romfile
|
import os
|
||||||
adjuster_settings.baserom = Patch.get_base_rom_path()
|
os.replace(adjustedromfile, romfile)
|
||||||
whitelist = {"disablemusic", "fastmenu", "heartbeep", "heartcolor", "ow_palettes", "quickswap",
|
adjustedromfile = romfile
|
||||||
"uw_palettes"}
|
except Exception as e:
|
||||||
printed_options = {name: value for name, value in vars(adjuster_settings).items() if name in whitelist}
|
logging.exception(e)
|
||||||
sprite = getattr(adjuster_settings, "sprite", None)
|
asyncio.create_task(run_game(adjustedromfile if adjusted else romfile))
|
||||||
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))
|
|
||||||
|
|
||||||
ctx = Context(args.snes, args.connect, args.password, args.founditems, port)
|
ctx = Context(args.snes, args.connect, args.password, args.founditems, port)
|
||||||
input_task = create_named_task(console_loop(ctx), name="Input")
|
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]:
|
def create_rom_file(patch_file: str) -> Tuple[dict, str]:
|
||||||
data = Utils.parse_yaml(lzma.decompress(load_bytes(patch_file)).decode("utf-8-sig"))
|
data = Utils.parse_yaml(lzma.decompress(load_bytes(patch_file)).decode("utf-8-sig"))
|
||||||
patched_data = bsdiff4.patch(get_base_rom_bytes(), data["patch"])
|
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"
|
target = os.path.splitext(patch_file)[0] + ".sfc"
|
||||||
with open(target, "wb") as f:
|
with open(target, "wb") as f:
|
||||||
f.write(patched_data)
|
f.write(patched_data)
|
||||||
|
@ -96,7 +98,6 @@ if __name__ == "__main__":
|
||||||
with concurrent.futures.ThreadPoolExecutor() as pool:
|
with concurrent.futures.ThreadPoolExecutor() as pool:
|
||||||
for rom in sys.argv:
|
for rom in sys.argv:
|
||||||
try:
|
try:
|
||||||
|
|
||||||
if rom.endswith(".sfc"):
|
if rom.endswith(".sfc"):
|
||||||
print(f"Creating patch for {rom}")
|
print(f"Creating patch for {rom}")
|
||||||
result = pool.submit(create_patch_file, rom, address)
|
result = pool.submit(create_patch_file, rom, address)
|
||||||
|
@ -105,10 +106,29 @@ if __name__ == "__main__":
|
||||||
elif rom.endswith(".bmbp"):
|
elif rom.endswith(".bmbp"):
|
||||||
print(f"Applying patch {rom}")
|
print(f"Applying patch {rom}")
|
||||||
data, target = create_rom_file(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:
|
if 'server' in data:
|
||||||
|
Utils.persistent_store("servers", data['hash'], data['server'])
|
||||||
print(f"Host is {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"):
|
elif rom.endswith(".zip"):
|
||||||
print(f"Updating host in patch files contained in {rom}")
|
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
|
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):
|
class ReceivedItem(typing.NamedTuple):
|
||||||
item: int
|
item: int
|
||||||
location: int
|
location: int
|
||||||
|
|
Loading…
Reference in New Issue