Compare commits
7 Commits
b2d2aae61a
...
6fe0c233a8
| Author | SHA1 | Date | |
|---|---|---|---|
| 6fe0c233a8 | |||
| 5f1c08920f | |||
| 57db996f27 | |||
| 5af7073ed1 | |||
| 33cd2d076c | |||
| cd5bc9a206 | |||
| 78819bbd9d |
1
Main.py
1
Main.py
@@ -1293,6 +1293,7 @@ def create_playthrough(world):
|
||||
continue # every location for that player is required
|
||||
if location.item.type == "SmallKey":
|
||||
continue
|
||||
|
||||
# we remove the item at location and check if game is still beatable
|
||||
logging.getLogger('').debug('Checking if %s (Player %d) is required to beat the game.', location.item.name, location.item.player)
|
||||
old_item = location.item
|
||||
|
||||
76
Rom.py
76
Rom.py
@@ -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()
|
||||
|
||||
5
Rules.py
5
Rules.py
@@ -505,7 +505,7 @@ def global_rules(world, player):
|
||||
set_rule(world.get_entrance('Skull Woods Rock (West)', player), lambda state: state.can_lift_rocks(player))
|
||||
set_rule(world.get_entrance('Skull Woods Rock (East)', player), lambda state: state.can_lift_rocks(player))
|
||||
# this more like an ohko rule - dependent on bird being present too - so enemizer could turn this off?
|
||||
set_rule(world.get_entrance('Bumper Cave Ledge Drop', player), lambda state: world.can_take_damage or state.has('Cape', player) or state.has('Cane of Byrna', player) or state.has_sword(player))
|
||||
set_rule(world.get_entrance('Bumper Cave Ledge Drop', player), lambda state: state.has('Cape', player) or state.has('Cane of Byrna', player) or state.has_sword(player))
|
||||
set_rule(world.get_entrance('Bumper Cave Rock (Outer)', player), lambda state: state.can_lift_rocks(player))
|
||||
set_rule(world.get_entrance('Bumper Cave Rock (Inner)', player), lambda state: state.can_lift_rocks(player))
|
||||
set_rule(world.get_entrance('Skull Woods Pass Rock (North)', player), lambda state: state.can_lift_heavy_rocks(player))
|
||||
@@ -1404,8 +1404,7 @@ def ow_bunny_rules(world, player):
|
||||
add_bunny_rule(world.get_entrance('Skull Woods Forgotten Bush (East)', player), player)
|
||||
add_bunny_rule(world.get_entrance('Skull Woods Second Section Hole', player), player)
|
||||
add_bunny_rule(world.get_entrance('East Dark Death Mountain Bushes', player), player)
|
||||
if not world.can_take_damage:
|
||||
add_bunny_rule(world.get_entrance('Bumper Cave Ledge Drop', player), player)
|
||||
add_bunny_rule(world.get_entrance('Bumper Cave Ledge Drop', player), player)
|
||||
add_bunny_rule(world.get_entrance('Bumper Cave Rock (Outer)', player), player)
|
||||
add_bunny_rule(world.get_entrance('Bumper Cave Rock (Inner)', player), player)
|
||||
add_bunny_rule(world.get_entrance('Skull Woods Pass Bush Row (West)', player), player)
|
||||
|
||||
Binary file not shown.
@@ -309,7 +309,7 @@ UwGeneralDeny:
|
||||
- [0x00b0, 7, [ "StalfosKnight", "Blob", "Stal", "Wizzrobe"]] # blocked, but Geldmen are probably okay
|
||||
- [0x00b0, 8, [ "StalfosKnight", "Blob", "Stal", "Wizzrobe"]] # blocked, but Geldmen are probably okay
|
||||
- [ 0x00b1, 2, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Misery Mire - Hourglass - Spike Trap 1"
|
||||
- [ 0x00b1, 3, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Misery Mire - Hourglass - Spike Trap 2"
|
||||
- [ 0x00b1, 3, [ "RollerVerticalUp", "RollerVerticalDown", "Bumper" ] ] #"Misery Mire - Hourglass - Spike Trap 2"
|
||||
- [0x00b1, 4, ["Bumper", "BigSpike", "AntiFairyCircle", "Statue"]] # Wizzrobe near door
|
||||
- [ 0x00b2, 1, [ "Wizzrobe", "Statue" ] ] # Wizzrobes can't spawn on pots
|
||||
- [ 0x00b2, 3, [ "Wizzrobe", "Statue" ] ] # Wizzrobes can't spawn on pots
|
||||
|
||||
Reference in New Issue
Block a user