From cf488fda36f724fdd36b921ebcb53f7ad2380ea1 Mon Sep 17 00:00:00 2001 From: hiimcody1 Date: Mon, 20 Oct 2025 17:53:34 -0400 Subject: [PATCH] Initial custom header implementation --- Main.py | 2 +- Plando.py | 2 +- Rom.py | 21 ++++++++++++++++++--- resources/app/cli/args.json | 5 +++-- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/Main.py b/Main.py index 41a46b11..6324f3bc 100644 --- a/Main.py +++ b/Main.py @@ -290,7 +290,7 @@ def main(args, seed=None, fish=None): for player in range(1, world.players + 1): rom = JsonRom() if args.jsonout else LocalRom(args.rom) - patch_rom(world, rom, player, team, bool(args.mystery)) + patch_rom(world, rom, player, team, bool(args.mystery), str(args.rom_header) if args.rom_header else None) if args.race: patch_race_rom(rom) diff --git a/Plando.py b/Plando.py index cc97562f..2c948435 100755 --- a/Plando.py +++ b/Plando.py @@ -74,7 +74,7 @@ def main(args): logger.info('Patching ROM.') rom = LocalRom(args.rom) - patch_rom(world, rom, 1, 1, False) + patch_rom(world, rom, 1, 1, False, str(args.rom_header) if args.rom_header else None) apply_rom_settings(rom, args.heartbeep, args.heartcolor, args.quickswap, args.fastmenu, args.disablemusic, args.sprite, args.ow_palettes, args.uw_palettes) diff --git a/Rom.py b/Rom.py index 8b5f595c..68855318 100644 --- a/Rom.py +++ b/Rom.py @@ -418,7 +418,7 @@ def handle_native_dungeon(location, itemid): return itemid -def patch_rom(world, rom, player, team, is_mystery=False): +def patch_rom(world, rom, player, team, is_mystery=False, rom_header=None): random.seed(world.rom_seeds[player]) # progressive bow silver arrow hint hack @@ -1744,8 +1744,23 @@ def patch_rom(world, rom, player, team, is_mystery=False): # 21 bytes from Main import __version__ from OverworldShuffle import __version__ as ORVersion - seedstring = f'{world.seed:09}' if isinstance(world.seed, int) else world.seed - rom.name = bytearray(f'OR{__version__.split("-")[0].replace(".","")[0:3]}_{team+1}_{player}_{seedstring}\0', 'utf8')[:21] + if rom_header: + if len(rom_header) > 21: + raise Exception('ROM header too long. Max 21 bytes, found %d bytes.' % len(rom_header)) + elif '|' in rom_header: + gen, seedstring = rom_header.split('|', 1) + gen = f'{gen:<3}' + seedstring = f'{int(seedstring):09}' if seedstring.isdigit() else seedstring[:9] + rom.name = bytearray(f'{gen}_{team+1}_{player}_{seedstring}\0', 'utf8')[:21] + elif len(rom_header) <= 9: + seedstring = f'{int(rom_header):09}' if rom_header.isdigit() else rom_header + rom.name = bytearray(f'OR{__version__.split("-")[0].replace(".","")[0:3]}_{team+1}_{player}_{seedstring}\0', 'utf8')[:21] + else: + rom.name = bytearray(rom_header, 'utf8')[:21] + else: + seedstring = f'{world.seed:09}' if isinstance(world.seed, int) else world.seed + rom.name = bytearray(f'OR{__version__.split("-")[0].replace(".","")[0:3]}_{team+1}_{player}_{seedstring}\0', 'utf8')[:21] + rom.name.extend([0] * (21 - len(rom.name))) rom.write_bytes(0x7FC0, rom.name) diff --git a/resources/app/cli/args.json b/resources/app/cli/args.json index d042d93b..b0dbf825 100644 --- a/resources/app/cli/args.json +++ b/resources/app/cli/args.json @@ -641,5 +641,6 @@ }, "outputname": {}, "notes": {}, - "code": {} -} \ No newline at end of file + "code": {}, + "rom_header" : {} +}