mirror of
https://github.com/MarioSpore/Grinch-AP.git
synced 2025-10-21 12:11:33 -06:00

* - Use proper MD5 validation The method TLoZ was trying to validate it's baserom was different from basically every other ROM game. Almost all the other ROM games use the same method as each other (except for the external patchers like FF1 and SoE, and OoT has its own special handling that's vastly different), so updating TloZ to match. Also got rid of the checksum attribute for the TLoZDeltaPatch as it didn't seem to be used anywhere, so felt it was unnecessary and partially confusing to have it right next to the hash attribute that is actually used. * change error message to reference MD5
80 lines
2.1 KiB
Python
80 lines
2.1 KiB
Python
import hashlib
|
|
import zlib
|
|
import os
|
|
|
|
import Utils
|
|
from worlds.Files import APDeltaPatch
|
|
|
|
NA10CHECKSUM = '337bd6f1a1163df31bf2633665589ab0'
|
|
ROM_PLAYER_LIMIT = 65535
|
|
ROM_NAME = 0x10
|
|
bit_positions = [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80]
|
|
candle_shop = bit_positions[5]
|
|
arrow_shop = bit_positions[4]
|
|
potion_shop = bit_positions[1]
|
|
shield_shop = bit_positions[6]
|
|
ring_shop = bit_positions[7]
|
|
take_any = bit_positions[2]
|
|
first_quest_dungeon_items_early = 0x18910
|
|
first_quest_dungeon_items_late = 0x18C10
|
|
game_mode = 0x12
|
|
sword = 0x0657
|
|
bombs = 0x0658
|
|
arrow = 0x0659
|
|
bow = 0x065A
|
|
candle = 0x065B
|
|
recorder = 0x065C
|
|
food = 0x065D
|
|
potion = 0x065E
|
|
magical_rod = 0x065F
|
|
raft = 0x0660
|
|
book_of_magic = 0x0661
|
|
ring = 0x0662
|
|
stepladder = 0x0663
|
|
magical_key = 0x0664
|
|
power_bracelet = 0x0665
|
|
letter = 0x0666
|
|
heart_containers = 0x066F
|
|
triforce_fragments = 0x0671
|
|
boomerang = 0x0674
|
|
magical_boomerang = 0x0675
|
|
magical_shield = 0x0676
|
|
rupees_to_add = 0x067D
|
|
|
|
|
|
|
|
|
|
class TLoZDeltaPatch(APDeltaPatch):
|
|
hash = NA10CHECKSUM
|
|
game = "The Legend of Zelda"
|
|
patch_file_ending = ".aptloz"
|
|
result_file_ending = ".nes"
|
|
|
|
@classmethod
|
|
def get_source_data(cls) -> bytes:
|
|
return get_base_rom_bytes()
|
|
|
|
|
|
def get_base_rom_bytes(file_name: str = "") -> bytes:
|
|
base_rom_bytes = getattr(get_base_rom_bytes, "base_rom_bytes", None)
|
|
if not base_rom_bytes:
|
|
file_name = get_base_rom_path(file_name)
|
|
base_rom_bytes = bytes(Utils.read_snes_rom(open(file_name, "rb")))
|
|
|
|
basemd5 = hashlib.md5()
|
|
basemd5.update(base_rom_bytes)
|
|
if NA10CHECKSUM != basemd5.hexdigest():
|
|
raise Exception('Supplied Base Rom does not match known MD5 for NA (1.0) release. '
|
|
'Get the correct game and version, then dump it')
|
|
get_base_rom_bytes.base_rom_bytes = base_rom_bytes
|
|
return base_rom_bytes
|
|
|
|
|
|
def get_base_rom_path(file_name: str = "") -> str:
|
|
options = Utils.get_options()
|
|
if not file_name:
|
|
file_name = options["tloz_options"]["rom_file"]
|
|
if not os.path.exists(file_name):
|
|
file_name = Utils.user_path(file_name)
|
|
return file_name
|