|
|
|
@@ -85,7 +85,7 @@ from Utils import int16_as_bytes, int32_as_bytes, local_path, snes_to_pc
|
|
|
|
|
from Versions import DRVersion, GKVersion, ORVersion
|
|
|
|
|
|
|
|
|
|
JAP10HASH = '03a63945398191337e896e5771f77173'
|
|
|
|
|
RANDOMIZERBASEHASH = '2eff237fff0085c5fdd80542e07778f2'
|
|
|
|
|
RANDOMIZERBASEHASH = '100c3e1da68680a0f3d8e1fc94568de6'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class JsonRom(object):
|
|
|
|
@@ -1789,44 +1789,30 @@ def patch_rom(world, rom, player, team, is_mystery=False, rom_header=None):
|
|
|
|
|
rom.write_bytes(0x6D2FB, [0x00, 0x00, 0xf7, 0xff, 0x02, 0x0E])
|
|
|
|
|
rom.write_bytes(0x6D313, [0x00, 0x00, 0xe4, 0xff, 0x08, 0x0E])
|
|
|
|
|
|
|
|
|
|
rom.write_byte(0x18004E, 0) # Escape Fill (nothing)
|
|
|
|
|
write_int16(rom, 0x180183, 300) # Escape fill rupee bow
|
|
|
|
|
rom.write_bytes(0x180185, [0, 0, 0]) # Uncle respawn refills (magic, bombs, arrows)
|
|
|
|
|
rom.write_bytes(0x180188, [0, 0, 0]) # Zelda respawn refills (magic, bombs, arrows)
|
|
|
|
|
rom.write_bytes(0x18018B, [0, 0, 0]) # Mantle respawn refills (magic, bombs, arrows)
|
|
|
|
|
bow_max, bomb_max, magic_max = 0, 0, 0
|
|
|
|
|
bow_small, bomb_small, magic_small = 10, 3, 0x20
|
|
|
|
|
write_int16(rom, 0x180183, 0) # Escape fill rupee bow
|
|
|
|
|
# Uncle / Zelda / Mantle respawn refills (magic, bombs, arrows)
|
|
|
|
|
rom.write_bytes(0x180185, [0] * 9)
|
|
|
|
|
|
|
|
|
|
if world.mode[player] == 'standard':
|
|
|
|
|
if world.doorShuffle[player] not in ['vanilla']:
|
|
|
|
|
# If door shuffle, give player small bit of all three ammos on respawn during escape
|
|
|
|
|
# Uncle / Zelda / Mantle respawn refills (magic, bombs, arrows)
|
|
|
|
|
rom.write_bytes(0x180185, [0x20, 3, 10] * 3)
|
|
|
|
|
|
|
|
|
|
# Always fully fill ammo of starting weapon on respawn during escape
|
|
|
|
|
if uncle_location.item is not None and uncle_location.item.name in ['Bow', 'Progressive Bow']:
|
|
|
|
|
rom.write_byte(0x18004E, 1) # Escape Fill (arrows)
|
|
|
|
|
write_int16(rom, 0x180183, 300) # Escape fill rupee bow
|
|
|
|
|
rom.write_bytes(0x180185, [0, 0, 70]) # Uncle respawn refills (magic, bombs, arrows)
|
|
|
|
|
rom.write_bytes(0x180188, [0, 0, 70]) # Zelda respawn refills (magic, bombs, arrows)
|
|
|
|
|
rom.write_bytes(0x18018B, [0, 0, 70]) # Mantle respawn refills (magic, bombs, arrows)
|
|
|
|
|
bow_max = 70
|
|
|
|
|
rom.write_byte(0x180187, 70) # Uncle respawn refill arrows
|
|
|
|
|
rom.write_byte(0x18018A, 70) # Zelda respawn refill arrows
|
|
|
|
|
rom.write_byte(0x18018D, 70) # Mantle respawn refill arrowss
|
|
|
|
|
elif uncle_location.item is not None and uncle_location.item.name in ['Bomb Upgrade (+10)' if world.bombbag[player] else 'Bombs (10)']:
|
|
|
|
|
rom.write_byte(0x18004E, 2) # Escape Fill (bombs)
|
|
|
|
|
rom.write_bytes(0x180185, [0, 50, 0]) # Uncle respawn refills (magic, bombs, arrows)
|
|
|
|
|
rom.write_bytes(0x180188, [0, 50, 0]) # Zelda respawn refills (magic, bombs, arrows)
|
|
|
|
|
rom.write_bytes(0x18018B, [0, 50, 0]) # Mantle respawn refills (magic, bombs, arrows)
|
|
|
|
|
bomb_max = 50
|
|
|
|
|
rom.write_byte(0x180186, 50) # Uncle respawn refill bombs
|
|
|
|
|
rom.write_byte(0x180189, 50) # Zelda respawn refill bombs
|
|
|
|
|
rom.write_byte(0x18018C, 50) # Mantle respawn refill bombs
|
|
|
|
|
elif uncle_location.item is not None and uncle_location.item.name in ['Cane of Somaria', 'Cane of Byrna', 'Fire Rod']:
|
|
|
|
|
rom.write_byte(0x18004E, 4) # Escape Fill (magic)
|
|
|
|
|
rom.write_bytes(0x180185, [0x80, 0, 0]) # Uncle respawn refills (magic, bombs, arrows)
|
|
|
|
|
rom.write_bytes(0x180188, [0x80, 0, 0]) # Zelda respawn refills (magic, bombs, arrows)
|
|
|
|
|
rom.write_bytes(0x18018B, [0x80, 0, 0]) # Mantle respawn refills (magic, bombs, arrows)
|
|
|
|
|
magic_max = 0x80
|
|
|
|
|
if world.doorShuffle[player] not in ['vanilla', 'basic']:
|
|
|
|
|
# Uncle respawn refills (magic, bombs, arrows)
|
|
|
|
|
rom.write_bytes(0x180185, [max(magic_small, magic_max), max(bomb_small, bomb_max), max(bow_small, bow_max)])
|
|
|
|
|
# Zelda respawn refills (magic, bombs, arrows)
|
|
|
|
|
rom.write_bytes(0x180188, [max(magic_small, magic_max), max(bomb_small, bomb_max), max(bow_small, bow_max)])
|
|
|
|
|
# Mantle respawn refills (magic, bombs, arrows)
|
|
|
|
|
rom.write_bytes(0x18018B, [max(magic_small, magic_max), max(bomb_small, bomb_max), max(bow_small, bow_max)])
|
|
|
|
|
elif world.doorShuffle[player] == 'basic': # just in case a bomb is needed to get to a chest
|
|
|
|
|
rom.write_bytes(0x180185, [max(magic_small, magic_max), max(bomb_small, bomb_max), max(bow_small, bow_max)])
|
|
|
|
|
rom.write_bytes(0x180188, [magic_small, max(bomb_small, bomb_max), bow_small]) # Zelda respawn refills (magic, bombs, arrows)
|
|
|
|
|
rom.write_bytes(0x18018B, [magic_small, max(bomb_small, bomb_max), bow_small]) # Mantle respawn refills (magic, bombs, arrows)
|
|
|
|
|
rom.write_byte(0x180185, 0x80) # Uncle respawn refill magic
|
|
|
|
|
rom.write_byte(0x180188, 0x80) # Zelda respawn refill magic
|
|
|
|
|
rom.write_byte(0x18018B, 0x80) # Mantle respawn refill magic
|
|
|
|
|
|
|
|
|
|
# patch swamp: Need to enable permanent drain of water as dam or swamp were moved
|
|
|
|
|
rom.write_byte(0x18003D, 0x01 if world.swamp_patch_required[player] else 0x00)
|
|
|
|
@@ -1946,7 +1932,7 @@ def patch_rom(world, rom, player, team, is_mystery=False, rom_header=None):
|
|
|
|
|
|
|
|
|
|
write_enemizer_tweaks(rom, world, player)
|
|
|
|
|
randomize_damage_table(rom, world, player)
|
|
|
|
|
write_strings(rom, world, player, team)
|
|
|
|
|
write_strings(rom, world, player, team, is_mystery)
|
|
|
|
|
|
|
|
|
|
# write initial sram
|
|
|
|
|
rom.write_initial_sram()
|
|
|
|
@@ -2448,7 +2434,7 @@ def write_string_to_rom(rom, target, string):
|
|
|
|
|
rom.write_bytes(address, MultiByteTextMapper.convert(string, maxbytes))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def write_strings(rom, world, player, team):
|
|
|
|
|
def write_strings(rom, world, player, team, is_mystery=False):
|
|
|
|
|
tt = TextTable()
|
|
|
|
|
tt.removeUnwantedText()
|
|
|
|
|
if world.shuffle[player] != 'vanilla':
|
|
|
|
@@ -2963,7 +2949,22 @@ def write_strings(rom, world, player, team):
|
|
|
|
|
sanc_text = "Dark Chapel"
|
|
|
|
|
tt['menu_start_2'] = "{MENU}\n{SPEED0}\n≥@'s " + lh_text + "\n " + sanc_text + "\n{CHOICE3}"
|
|
|
|
|
tt['menu_start_3'] = "{MENU}\n{SPEED0}\n≥@'s " + lh_text + "\n " + sanc_text + "\n Mountain Cave\n{CHOICE2}"
|
|
|
|
|
if world.mode[player] == 'inverted':
|
|
|
|
|
|
|
|
|
|
if is_mystery:
|
|
|
|
|
tt['intro_main'] = CompressedTextMapper.convert(
|
|
|
|
|
"{INTRO}\n Episode III"
|
|
|
|
|
+ "{PAUSE3}\n A Link to the Past"
|
|
|
|
|
+ "{PAUSE3}\n Mystery Randomizer"
|
|
|
|
|
+ "{PAUSE3}\n\n\n"
|
|
|
|
|
+ "{PAUSE3}\nAfter mostly disregarding what happened in the first two games,"
|
|
|
|
|
+ "{PAUSE3}\nLink awakens to a massive mystery."
|
|
|
|
|
+ "{PAUSE3}\nHe doesn't know why he's here, or what he must do."
|
|
|
|
|
+ "{PAUSE3} {CHANGEPIC}\nGanon has moved around all the items in Hyrule."
|
|
|
|
|
+ "{PAUSE7}\nYou will have to find all the items necessary to achieve your goal."
|
|
|
|
|
+ "{PAUSE7}\nThis is your chance to be a hero."
|
|
|
|
|
+ "{PAUSE3} {CHANGEPIC}\nYou must determine and achieve your goal."
|
|
|
|
|
+ "{PAUSE9} {CHANGEPIC}", False)
|
|
|
|
|
elif world.mode[player] == 'inverted':
|
|
|
|
|
tt['intro_main'] = CompressedTextMapper.convert(
|
|
|
|
|
"{INTRO}\n Episode III"
|
|
|
|
|
+ "{PAUSE3}\n A Link to the Past"
|
|
|
|
@@ -2977,6 +2978,7 @@ def write_strings(rom, world, player, team):
|
|
|
|
|
+ "{PAUSE7}\nThis is your chance to be a hero."
|
|
|
|
|
+ "{PAUSE3} {CHANGEPIC}\nYou must get the 7 crystals to beat Ganon."
|
|
|
|
|
+ "{PAUSE9} {CHANGEPIC}", False)
|
|
|
|
|
|
|
|
|
|
rom.write_bytes(0xE0000, tt.getBytes())
|
|
|
|
|
|
|
|
|
|
credits = Credits()
|
|
|
|
|