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
 |