48 lines
1.5 KiB
Python
48 lines
1.5 KiB
Python
import os
|
|
|
|
import bsdiff4
|
|
|
|
from ..Rom import get_base_rom_bytes
|
|
|
|
|
|
def apply_basepatch(base_rom_bytes: bytes) -> bytes:
|
|
with open(os.path.join(os.path.dirname(__file__), "basepatch.bsdiff4"), "rb") as basepatch:
|
|
delta: bytes = basepatch.read()
|
|
return bsdiff4.patch(base_rom_bytes, delta)
|
|
|
|
|
|
def create_basepatch() -> None:
|
|
from .asar import close as asar_close, geterrors as asar_errors, getprints as asar_prints, \
|
|
getwarnings as asar_warnings, init as asar_init, patch as asar_patch
|
|
|
|
os.add_dll_directory(os.path.dirname(__file__))
|
|
print("Initializing Asar library")
|
|
asar_init()
|
|
|
|
print("Opening base ROM")
|
|
old_rom_data: bytes = get_base_rom_bytes()
|
|
|
|
print("Patching base ROM")
|
|
result, new_rom_data = asar_patch(os.path.join(os.path.dirname(__file__), "basepatch.asm"), old_rom_data)
|
|
|
|
warnings = asar_warnings()
|
|
print("\nWarnings: " + str(len(warnings)))
|
|
for w in warnings:
|
|
print(w)
|
|
|
|
if result:
|
|
print("Success")
|
|
for p in asar_prints():
|
|
print(p)
|
|
asar_close()
|
|
delta: bytes = bsdiff4.diff(old_rom_data, new_rom_data)
|
|
with open(os.path.join(os.path.dirname(__file__), "basepatch.bsdiff4"), "wb") as f:
|
|
f.write(delta)
|
|
else:
|
|
errors = asar_errors()
|
|
print("\nErrors: " + str(len(errors)))
|
|
for error in errors:
|
|
print(error)
|
|
asar_close()
|
|
raise RuntimeError("Asar errors while trying to create basepatch for Lufia II Ancient Cave.")
|