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.")
 | 
