Fix a TT open edge (getting caught by door code)

Try to fix Skull exit again
Fix Hera stair key
Some vanilla fixes
This commit is contained in:
aerinon
2019-11-08 16:51:51 -07:00
parent 84851b3979
commit e7ddae0dfa
6 changed files with 22 additions and 8 deletions

View File

@@ -42,6 +42,7 @@ def link_doors(world, player):
connect_two_way(world, entrance, ext, player) connect_two_way(world, entrance, ext, player)
for ent, ext in default_one_way_connections: for ent, ext in default_one_way_connections:
connect_one_way(world, ent, ext, player) connect_one_way(world, ent, ext, player)
world.key_logic[player] = {} # todo: actual vanilla key logic
elif world.doorShuffle == 'basic': elif world.doorShuffle == 'basic':
within_dungeon(world, player) within_dungeon(world, player)
elif world.doorShuffle == 'crossed': elif world.doorShuffle == 'crossed':
@@ -1062,7 +1063,11 @@ def reassign_key_doors(current_doors, proposal, world, player):
while len(queue) > 0: while len(queue) > 0:
d = queue.pop() d = queue.pop()
if d.type is DoorType.SpiralStairs and d not in proposal: if d.type is DoorType.SpiralStairs and d not in proposal:
world.get_room(d.roomIndex, player).change(d.doorListPos, DoorKind.Waterfall) room = world.get_room(d.roomIndex, player)
if room.doorList[d.doorListPos][1] == DoorKind.StairKeyLow:
room.delete(d.doorListPos)
else:
room.change(d.doorListPos, DoorKind.Waterfall)
d.smallKey = False d.smallKey = False
elif d.type is DoorType.Interior and d not in flat_proposal and d.dest not in flat_proposal: elif d.type is DoorType.Interior and d not in flat_proposal and d.dest not in flat_proposal:
world.get_room(d.roomIndex, player).change(d.doorListPos, DoorKind.Normal) world.get_room(d.roomIndex, player).change(d.doorListPos, DoorKind.Normal)
@@ -1716,7 +1721,7 @@ default_door_connections = [
('Eastern Courtyard Ledge W', 'Eastern West Wing E'), ('Eastern Courtyard Ledge W', 'Eastern West Wing E'),
('Eastern Courtyard Ledge E', 'Eastern East Wing W'), ('Eastern Courtyard Ledge E', 'Eastern East Wing W'),
('Eastern Hint Tile EN', 'Eastern Courtyard WN'), ('Eastern Hint Tile EN', 'Eastern Courtyard WN'),
('Eastern Big Key NE', 'Eastern Hint Tile Blocked Path SW'), ('Eastern Big Key NE', 'Eastern Hint Tile Blocked Path SE'),
('Eastern Courtyard EN', 'Eastern Map Valley WN'), ('Eastern Courtyard EN', 'Eastern Map Valley WN'),
('Eastern Courtyard N', 'Eastern Darkness S'), ('Eastern Courtyard N', 'Eastern Darkness S'),
('Eastern Map Valley SW', 'Eastern Dark Square NW'), ('Eastern Map Valley SW', 'Eastern Dark Square NW'),
@@ -1766,7 +1771,7 @@ default_door_connections = [
('Ice Conveyor SW', 'Ice Bomb Jump NW'), ('Ice Conveyor SW', 'Ice Bomb Jump NW'),
('Ice Pengator Trap NE', 'Ice Spike Cross SE'), ('Ice Pengator Trap NE', 'Ice Spike Cross SE'),
('Ice Spike Cross ES', 'Ice Spike Room WS'), ('Ice Spike Cross ES', 'Ice Spike Room WS'),
('Ice Tall Hint SE', 'Ice Lonely Freezor NW'), ('Ice Tall Hint SE', 'Ice Lonely Freezor NE'),
('Ice Tall Hint EN', 'Ice Hookshot Ledge WN'), ('Ice Tall Hint EN', 'Ice Hookshot Ledge WN'),
('Iced T EN', 'Ice Catwalk WN'), ('Iced T EN', 'Ice Catwalk WN'),
('Ice Catwalk NW', 'Ice Many Pots SW'), ('Ice Catwalk NW', 'Ice Many Pots SW'),

View File

@@ -231,7 +231,7 @@ def create_doors(world, player):
# Hera # Hera
create_door(player, 'Hera Lobby Down Stairs', Sprl).dir(Dn, 0x77, 3, HTL).ss(Z, 0x21, 0x90, False, True), create_door(player, 'Hera Lobby Down Stairs', Sprl).dir(Dn, 0x77, 3, HTL).ss(Z, 0x21, 0x90, False, True),
create_door(player, 'Hera Lobby Key Stairs', Sprl).dir(Dn, 0x77, 1, HTL).ss(A, 0x12, 0x80).small_key().pos(0), create_door(player, 'Hera Lobby Key Stairs', Sprl).dir(Dn, 0x77, 1, HTL).ss(A, 0x12, 0x80).small_key().pos(1),
create_door(player, 'Hera Lobby Up Stairs', Sprl).dir(Up, 0x77, 2, HTL).ss(X, 0x2b, 0x5c, False, True), create_door(player, 'Hera Lobby Up Stairs', Sprl).dir(Up, 0x77, 2, HTL).ss(X, 0x2b, 0x5c, False, True),
create_door(player, 'Hera Basement Cage Up Stairs', Sprl).dir(Up, 0x87, 3, LTH).ss(Z, 0x42, 0x7c, True, True), create_door(player, 'Hera Basement Cage Up Stairs', Sprl).dir(Up, 0x87, 3, LTH).ss(Z, 0x42, 0x7c, True, True),
create_door(player, 'Hera Tile Room Up Stairs', Sprl).dir(Up, 0x87, 1, LTH).ss(A, 0x32, 0x6c, True, True), create_door(player, 'Hera Tile Room Up Stairs', Sprl).dir(Up, 0x87, 1, LTH).ss(A, 0x32, 0x6c, True, True),

8
Rom.py
View File

@@ -14,11 +14,11 @@ from Text import Uncle_texts, Ganon1_texts, TavernMan_texts, Sahasrahla2_texts,
from Text import KingsReturn_texts, Sanctuary_texts, Kakariko_texts, Blacksmiths_texts, DeathMountain_texts, LostWoods_texts, WishingWell_texts, DesertPalace_texts, MountainTower_texts, LinksHouse_texts, Lumberjacks_texts, SickKid_texts, FluteBoy_texts, Zora_texts, MagicShop_texts, Sahasrahla_names from Text import KingsReturn_texts, Sanctuary_texts, Kakariko_texts, Blacksmiths_texts, DeathMountain_texts, LostWoods_texts, WishingWell_texts, DesertPalace_texts, MountainTower_texts, LinksHouse_texts, Lumberjacks_texts, SickKid_texts, FluteBoy_texts, Zora_texts, MagicShop_texts, Sahasrahla_names
from Utils import output_path, local_path, int16_as_bytes, int32_as_bytes, snes_to_pc from Utils import output_path, local_path, int16_as_bytes, int32_as_bytes, snes_to_pc
from Items import ItemFactory, item_table from Items import ItemFactory, item_table
from EntranceShuffle import door_addresses from EntranceShuffle import door_addresses, exit_ids
JAP10HASH = '03a63945398191337e896e5771f77173' JAP10HASH = '03a63945398191337e896e5771f77173'
RANDOMIZERBASEHASH = '08d53b2249fc1598be1b94c537d0feb5' RANDOMIZERBASEHASH = 'f3f4b3e897857cc5fa9c138bfc4d3da0'
class JsonRom(object): class JsonRom(object):
@@ -506,6 +506,7 @@ def patch_rom(world, player, rom):
rom.write_int16(0x15DB5 + 2 * offset, link_y) # same as final else rom.write_int16(0x15DB5 + 2 * offset, link_y) # same as final else
elif room_id == 0x0059 and world.fix_skullwoods_exit: elif room_id == 0x0059 and world.fix_skullwoods_exit:
rom.write_int16(0x15DB5 + 2 * offset, 0x00F8) rom.write_int16(0x15DB5 + 2 * offset, 0x00F8)
world.fix_skullwoods_exit = False
elif room_id == 0x004a and world.fix_palaceofdarkness_exit: elif room_id == 0x004a and world.fix_palaceofdarkness_exit:
rom.write_int16(0x15DB5 + 2 * offset, 0x0640) rom.write_int16(0x15DB5 + 2 * offset, 0x0640)
elif room_id == 0x00d6 and world.fix_trock_exit: elif room_id == 0x00d6 and world.fix_trock_exit:
@@ -542,6 +543,9 @@ def patch_rom(world, player, rom):
for paired_door in world.paired_doors[player]: for paired_door in world.paired_doors[player]:
rom.write_bytes(paired_door.address_a(world, player), paired_door.rom_data_a(world, player)) rom.write_bytes(paired_door.address_a(world, player), paired_door.rom_data_a(world, player))
rom.write_bytes(paired_door.address_b(world, player), paired_door.rom_data_b(world, player)) rom.write_bytes(paired_door.address_b(world, player), paired_door.rom_data_b(world, player))
if world.fix_skullwoods_exit:
rom.write_int16(0x15DB5 + 2 * exit_ids['Skull Woods Final Section Exit'][1], 0x00F8)
# todo: fix other exits if ER enabled and similar situation happens
write_custom_shops(rom, world, player) write_custom_shops(rom, world, player)

View File

@@ -235,7 +235,9 @@ def create_rooms(world, player):
# fix some wonky things # fix some wonky things
world.get_room(0x60, player).swap(2, 4) # puts the exit at pos 2 - enables pos 3 world.get_room(0x60, player).swap(2, 4) # puts the exit at pos 2 - enables pos 3
world.get_room(0x61, player).swap(1, 6) # puts the WN door at pos 1 - enables it world.get_room(0x61, player).swap(1, 6) # puts the WN door at pos 1 - enables it
world.get_room(0x61, player).swap(5, 6) # puts the Incognito Entrance at the end, so it can be deleted
world.get_room(0x62, player).swap(1, 4) # puts the exit at pos 1 - enables pos 3 world.get_room(0x62, player).swap(1, 4) # puts the exit at pos 1 - enables pos 3
world.get_room(0x77, player).swap(0, 1) # fixes Hera Lobby Key Stairs - entrance now at pos 0
class Room(object): class Room(object):
@@ -262,6 +264,9 @@ class Room(object):
self.doorList[idx2] = item1 self.doorList[idx2] = item1
self.modified = True self.modified = True
def delete(self, list_idx):
self.doorList[list_idx] = (0xff, 0xff)
def address(self): def address(self):
return self.doorListAddress return self.doorListAddress

View File

@@ -55,7 +55,7 @@ Cleanup:
; This sets A (00,02,04) and stores half that at $04 for later use, (src door) ; This sets A (00,02,04) and stores half that at $04 for later use, (src door)
CalcIndex: ; A->low byte of Link's Coord, X-> Link's quadrant, DoorOffset x 2 -> A, DoorOffset -> $04 (vert/horz agnostic) CalcIndex: ; A->low byte of Link's Coord, X-> Link's quadrant, DoorOffset x 2 -> A, DoorOffset -> $04 (vert/horz agnostic)
cpx.b #00 : bne .largeDoor cpx.b #00 : bne .largeDoor
cmp.b #$90 : bcc .smallDoor cmp.b #$d0 : bcc .smallDoor
lda #$01 : bra .done ; Middle Door lda #$01 : bra .done ; Middle Door
.smallDoor lda #$00 : bra .done .smallDoor lda #$00 : bra .done
.largeDoor lda #$02 .largeDoor lda #$02

File diff suppressed because one or more lines are too long