From 71cd0b917ca9c9d2a25032f8e4ba9a85edbc8361 Mon Sep 17 00:00:00 2001 From: Bonta-kun <40473493+Bonta0@users.noreply.github.com> Date: Tue, 14 Jan 2020 22:13:37 +0100 Subject: [PATCH] Rom: fix enemizer patching --- Main.py | 4 +--- Rom.py | 25 ++++++++++++++----------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Main.py b/Main.py index 166f966f..a7929769 100644 --- a/Main.py +++ b/Main.py @@ -161,9 +161,7 @@ def main(args, seed=None): if use_enemizer and (args.enemizercli or not args.jsonout): patch_enemizer(world, player, rom, args.rom, args.enemizercli, args.shufflepots[player], sprite_random_on_hit) if not args.jsonout: - patches = rom.patches - rom = LocalRom(args.rom) - rom.merge_enemizer_patches(patches) + rom = LocalRom.fromJsonRom(rom, args.rom, 0x400000) if args.race: patch_race_rom(rom) diff --git a/Rom.py b/Rom.py index 21c52125..a44696c5 100644 --- a/Rom.py +++ b/Rom.py @@ -25,9 +25,9 @@ JAP10HASH = '03a63945398191337e896e5771f77173' class JsonRom(object): - def __init__(self): - self.name = None - self.hash = None + def __init__(self, name=None, hash=None): + self.name = name + self.hash = hash self.orig_buffer = None self.patches = {} self.addresses = [] @@ -71,9 +71,9 @@ class JsonRom(object): class LocalRom(object): - def __init__(self, file, patch=True): - self.name = None - self.hash = None + def __init__(self, file, patch=True, name=None, hash=None): + self.name = name + self.hash = hash self.orig_buffer = None with open(file, 'rb') as stream: self.buffer = read_rom(stream) @@ -92,6 +92,14 @@ class LocalRom(object): with open(file, 'wb') as outfile: outfile.write(self.buffer) + @staticmethod + def fromJsonRom(rom, file, rom_size = 0x200000): + ret = LocalRom(file, True, rom.name, rom.hash) + ret.buffer.extend(bytearray([0x00] * (rom_size - len(ret.buffer)))) + for address, values in rom.patches.items(): + ret.write_bytes(int(address), values) + return ret + def patch_base_rom(self): # verify correct checksum of baserom basemd5 = hashlib.md5() @@ -116,11 +124,6 @@ class LocalRom(object): # if RANDOMIZERBASEHASH != patchedmd5.hexdigest(): # raise RuntimeError('Provided Base Rom unsuitable for patching. Please provide a JAP(1.0) "Zelda no Densetsu - Kamigami no Triforce (Japan).sfc" rom to use as a base.') - def merge_enemizer_patches(self, patches): - self.buffer.extend(bytearray([0x00] * (0x400000 - len(self.buffer)))) - for address, values in patches.items(): - self.write_bytes(int(address), values) - def write_crc(self): crc = (sum(self.buffer[:0x7FDC] + self.buffer[0x7FE0:]) + 0x01FE) & 0xFFFF inv = crc ^ 0xFFFF