From 3b8773ea33a38864b0983d346760da619c5482da Mon Sep 17 00:00:00 2001 From: aerinon Date: Sat, 13 Feb 2021 20:58:59 -0700 Subject: [PATCH] Update item counter for mystery Fixed bug with door restart Made retro keys more lenient with door shuffle --- DoorShuffle.py | 3 ++- ItemList.py | 5 +++++ Main.py | 2 +- Rom.py | 8 ++++++-- Rules.py | 6 ++++++ asm/hudadditions.asm | 18 ++++++++++++++---- 6 files changed, 34 insertions(+), 8 deletions(-) diff --git a/DoorShuffle.py b/DoorShuffle.py index 3a07ff1a..d2cf35f8 100644 --- a/DoorShuffle.py +++ b/DoorShuffle.py @@ -35,7 +35,7 @@ def link_doors(world, player): door.dest = None door.entranceFlag = False ent = door.entrance - if door.type != DoorType.Logical and ent.connected_region is not None: + if (door.type != DoorType.Logical or door.controller) and ent.connected_region is not None: ent.connected_region.entrances = [x for x in ent.connected_region.entrances if x != ent] ent.connected_region = None for portal in world.dungeon_portals[player]: @@ -2012,6 +2012,7 @@ class DROptions(Flag): OriginalPalettes = 0x20 Open_PoD_Wall = 0x40 # If on, pre opens the PoD wall, no bow required Open_Desert_Wall = 0x80 # If on, pre opens the desert wall, no fire required + Hide_Total = 0x100 # DATA GOES DOWN HERE diff --git a/ItemList.py b/ItemList.py index ddb629ab..9b2de617 100644 --- a/ItemList.py +++ b/ItemList.py @@ -596,6 +596,11 @@ def get_pool_core(progressive, shuffle, difficulty, timer, goal, mode, swords, r pool = [item.replace('Arrow Upgrade (+5)','Rupees (5)') for item in pool] pool = [item.replace('Arrow Upgrade (+10)','Rupees (5)') for item in pool] pool.extend(diff.retro) + if door_shuffle != 'vanilla': # door shuffle needs more keys for retro + replace = 'Rupees (20)' if difficulty == 'normal' else 'Rupees (5)' + indices = [i for i, x in enumerate(pool) if x == replace] + for i in range(0, min(10, len(indices))): + pool[indices[i]] = 'Small Key (Universal)' if mode == 'standard': if door_shuffle == 'vanilla': key_location = random.choice(['Secret Passage', 'Hyrule Castle - Boomerang Chest', 'Hyrule Castle - Map Chest', 'Hyrule Castle - Zelda\'s Chest', 'Sewers - Dark Cross']) diff --git a/Main.py b/Main.py index 42a45fdd..a11a6dc2 100644 --- a/Main.py +++ b/Main.py @@ -238,7 +238,7 @@ def main(args, seed=None, fish=None): logging.warning(enemizerMsg) raise EnemizerError(enemizerMsg) - patch_rom(world, rom, player, team, enemized) + patch_rom(world, rom, player, team, enemized, bool(args.outputname)) if args.race: patch_race_rom(rom) diff --git a/Rom.py b/Rom.py index a356fb08..27961b5d 100644 --- a/Rom.py +++ b/Rom.py @@ -518,7 +518,8 @@ class Sprite(object): # split into palettes of 15 colors return array_chunk(palette_as_colors, 15) -def patch_rom(world, rom, player, team, enemized): + +def patch_rom(world, rom, player, team, enemized, is_mystery=False): random.seed(world.rom_seeds[player]) # progressive bow silver arrow hint hack @@ -707,7 +708,10 @@ def patch_rom(world, rom, player, team, enemized): rom.write_byte(0x13f000+dungeon_id, opposite_door.roomIndex) elif not opposite_door: rom.write_byte(0x13f000+dungeon_id, 0) # no supertile preceeding boss - rom.write_byte(0x138004, dr_flags.value) + if is_mystery: + dr_flags |= DROptions.Hide_Total + rom.write_byte(0x138004, dr_flags.value & 0xff) + rom.write_byte(0x138005, (dr_flags.value & 0xff00) >> 8) if dr_flags & DROptions.Town_Portal and world.mode[player] == 'inverted': rom.write_byte(0x138006, 1) diff --git a/Rules.py b/Rules.py index 3049dd5b..dd00644f 100644 --- a/Rules.py +++ b/Rules.py @@ -1592,6 +1592,7 @@ def add_key_logic_rules(world, player): if keys.opposite: rule = or_rule(rule, create_advanced_key_rule(d_logic, player, keys.opposite)) add_rule(spot, rule) + for location in d_logic.bk_restricted: if not location.forced_item: forbid_item(location, d_logic.bk_name, player) @@ -1601,6 +1602,11 @@ def add_key_logic_rules(world, player): add_rule(world.get_entrance(door.name, player), create_rule(d_logic.bk_name, player)) for chest in d_logic.bk_chests: add_rule(world.get_location(chest.name, player), create_rule(d_logic.bk_name, player)) + if world.retro[player]: + for d_name, layout in world.key_layout[player].items(): + for door in layout.flat_prop: + if world.mode[player] != 'standard' or not retro_in_hc(door.entrance): + add_rule(door.entrance, create_key_rule('Small Key (Universal)', player, 1)) def retro_in_hc(spot): diff --git a/asm/hudadditions.asm b/asm/hudadditions.asm index 9b78a0a4..4568b12e 100644 --- a/asm/hudadditions.asm +++ b/asm/hudadditions.asm @@ -8,11 +8,21 @@ DrHudOverride: HudAdditions: { lda.l DRFlags : and #$0008 : beq ++ - lda $7EF423 : and #$00ff + LDA.w #$28A4 : STA !GOAL_DRAW_ADDRESS + lda $7EF423 jsr HudHexToDec4DigitCopy - LDX.b $05 : TXA : ORA.w #$2400 : STA !GOAL_DRAW_ADDRESS+10 ; draw 100's digit - LDX.b $06 : TXA : ORA.w #$2400 : STA !GOAL_DRAW_ADDRESS+12 ; draw 10's digit - LDX.b $07 : TXA : ORA.w #$2400 : STA !GOAL_DRAW_ADDRESS+14 ; draw 1's digit + LDX.b $05 : TXA : ORA.w #$2400 : STA !GOAL_DRAW_ADDRESS+2 ; draw 100's digit + LDX.b $06 : TXA : ORA.w #$2400 : STA !GOAL_DRAW_ADDRESS+4 ; draw 10's digit + LDX.b $07 : TXA : ORA.w #$2400 : STA !GOAL_DRAW_ADDRESS+6 ; draw 1's digit + LDA.w #$2830 : STA !GOAL_DRAW_ADDRESS+8 ; draw slash + LDA.l DRFlags : AND #$0100 : BNE + + lda $7EF33E + jsr HudHexToDec4DigitCopy + LDX.b $05 : TXA : ORA.w #$2400 : STA !GOAL_DRAW_ADDRESS+10 ; draw 100's digit + LDX.b $06 : TXA : ORA.w #$2400 : STA !GOAL_DRAW_ADDRESS+12 ; draw 10's digit + LDX.b $07 : TXA : ORA.w #$2400 : STA !GOAL_DRAW_ADDRESS+14 ; draw 1's digit + BRA ++ + + LDA.w #$2405 : STA !GOAL_DRAW_ADDRESS+10 : STA !GOAL_DRAW_ADDRESS+12 : STA !GOAL_DRAW_ADDRESS+14 ++ LDX $1B : BNE + : RTS : + ; Skip if outdoors