From 8bc446fbc5d9ea59165c75b29b6fcc7581dbfbc7 Mon Sep 17 00:00:00 2001 From: aerinon Date: Tue, 29 Mar 2022 13:28:05 -0600 Subject: [PATCH] Logic refinements for Skull X Room and GT Falling Torches --- DoorShuffle.py | 2 ++ Doors.py | 2 ++ Dungeons.py | 8 ++++---- ItemList.py | 3 +++ Items.py | 1 + Main.py | 2 +- RELEASENOTES.md | 11 +++++++---- Regions.py | 9 ++++++--- Rules.py | 5 +++++ 9 files changed, 31 insertions(+), 12 deletions(-) diff --git a/DoorShuffle.py b/DoorShuffle.py index b2156357..63d50b21 100644 --- a/DoorShuffle.py +++ b/DoorShuffle.py @@ -2240,6 +2240,8 @@ logical_connections = [ ('Skull Pot Circle Star Path', 'Skull Map Room'), ('Skull Big Chest Hookpath', 'Skull 1 Lobby'), ('Skull Back Drop Star Path', 'Skull Small Hall'), + ('Skull 2 West Lobby Pits', 'Skull 2 West Lobby Ledge'), + ('Skull 2 West Lobby Ledge Pits', 'Skull 2 West Lobby'), ('Thieves Rail Ledge Drop Down', 'Thieves BK Corner'), ('Thieves Hellway Orange Barrier', 'Thieves Hellway S Crystal'), ('Thieves Hellway Crystal Orange Barrier', 'Thieves Hellway'), diff --git a/Doors.py b/Doors.py index de4de94c..26d474cc 100644 --- a/Doors.py +++ b/Doors.py @@ -614,6 +614,8 @@ def create_doors(world, player): create_door(player, 'Skull 2 West Lobby S', Nrml).dir(So, 0x56, Left, High).pos(1).portal(Z, 0x00), create_door(player, 'Skull 2 West Lobby ES', Intr).dir(Ea, 0x56, Bot, High).pos(2), create_door(player, 'Skull 2 West Lobby NW', Intr).dir(No, 0x56, Left, High).small_key().pos(0), + create_door(player, 'Skull 2 West Lobby Pits', Lgcl), + create_door(player, 'Skull 2 West Lobby Ledge Pits', Lgcl), create_door(player, 'Skull X Room SW', Intr).dir(So, 0x56, Left, High).small_key().pos(0), create_door(player, 'Skull Back Drop Star Path', Lgcl), create_door(player, 'Skull 3 Lobby SW', Nrml).dir(So, 0x59, Left, High).pos(1).portal(Z, 0x02), diff --git a/Dungeons.py b/Dungeons.py index d3f0c216..188cf59f 100644 --- a/Dungeons.py +++ b/Dungeons.py @@ -124,10 +124,10 @@ swamp_regions = [ skull_regions = [ 'Skull 1 Lobby', 'Skull Map Room', 'Skull Pot Circle', 'Skull Pull Switch', 'Skull Big Chest', 'Skull Pinball', 'Skull Pot Prison', 'Skull Compass Room', 'Skull Left Drop', 'Skull 2 East Lobby', 'Skull Big Key', - 'Skull Lone Pot', 'Skull Small Hall', 'Skull Back Drop', 'Skull 2 West Lobby', 'Skull X Room', 'Skull 3 Lobby', - 'Skull East Bridge', 'Skull West Bridge Nook', 'Skull Star Pits', 'Skull Torch Room', 'Skull Vines', - 'Skull Spike Corner', 'Skull Final Drop', 'Skull Boss', 'Skull 1 Portal', 'Skull 2 East Portal', - 'Skull 2 West Portal', 'Skull 3 Portal' + 'Skull Lone Pot', 'Skull Small Hall', 'Skull Back Drop', 'Skull 2 West Lobby', 'Skull 2 West Lobby Ledge', + 'Skull X Room', 'Skull 3 Lobby', 'Skull East Bridge', 'Skull West Bridge Nook', 'Skull Star Pits', + 'Skull Torch Room', 'Skull Vines', 'Skull Spike Corner', 'Skull Final Drop', 'Skull Boss', + 'Skull 1 Portal', 'Skull 2 East Portal', 'Skull 2 West Portal', 'Skull 3 Portal' ] thieves_regions = [ diff --git a/ItemList.py b/ItemList.py index ea35dd59..b10eb9ae 100644 --- a/ItemList.py +++ b/ItemList.py @@ -245,6 +245,9 @@ def generate_itempool(world, player): world.push_item(world.get_location('Ice Block Drop', player), ItemFactory('Convenient Block', player), False) world.get_location('Ice Block Drop', player).event = True world.get_location('Ice Block Drop', player).locked = True + world.push_item(world.get_location('Skull Star Tile', player), ItemFactory('Hidden Pits', player), False) + world.get_location('Skull Star Tile', player).event = True + world.get_location('Skull Star Tile', player).locked = True if world.mode[player] == 'standard': world.push_item(world.get_location('Zelda Pickup', player), ItemFactory('Zelda Herself', player), False) world.get_location('Zelda Pickup', player).event = True diff --git a/Items.py b/Items.py index 757fc8e5..c88bccf7 100644 --- a/Items.py +++ b/Items.py @@ -188,6 +188,7 @@ item_table = {'Bow': (True, False, None, 0x0B, 200, 'You have\nchosen the\narche 'Maiden Rescued': (True, False, 'Event', 999, None, None, None, None, None, None, None, None), 'Maiden Unmasked': (True, False, 'Event', 999, None, None, None, None, None, None, None, None), 'Convenient Block': (True, False, 'Event', 999, None, None, None, None, None, None, None, None), + 'Hidden Pits': (True, False, 'Event', 999, None, None, None, None, None, None, None, None), 'Zelda Herself': (True, False, 'Event', 999, None, None, None, None, None, None, None, None), 'Zelda Delivered': (True, False, 'Event', 999, None, None, None, None, None, None, None, None), } diff --git a/Main.py b/Main.py index bf49c2f8..347b3521 100644 --- a/Main.py +++ b/Main.py @@ -550,7 +550,7 @@ def create_playthrough(world): # get locations containing progress items prog_locations = [location for location in world.get_filled_locations() if location.item.advancement] - optional_locations = ['Trench 1 Switch', 'Trench 2 Switch', 'Ice Block Drop'] + optional_locations = ['Trench 1 Switch', 'Trench 2 Switch', 'Ice Block Drop', 'Skull Star Tile'] state_cache = [None] collection_spheres = [] state = CollectionState(world) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 52bc8b61..185ff5f8 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -152,10 +152,13 @@ Same as above but both small keys and bigs keys of the dungeon are not allowed o * Reworked GT Trash Fill. Base rate is 0-75% of locations fill with 7 crystals entrance requirements. Triforce hunt is 75%-100% of locations. The 75% number will decrease based on the crystal entrance requirement. Dungeon_only algorithm caps it based on how many items need to be placed in dungeons. Cross dungeon shuffle will now work with the trash fill. * MultiServer fix for ssl certs and python * Inverted bug - * Fix for hammerdashing pots, if sprite limit is reached, items won't spawn, error beep won't play either because of other SFX - * Arghus splash no longer used for pottery sprites (used apple instead) - * Killing enemies freeze + hammer results in the droppable item instead of the freeze prize - * Forbid certain doors from being dashable when you either can't dash them open (but bombs would work) or you'd fall into a pit from the recoil in OHKO + * Fix for hammerdashing pots, if sprite limit is reached, items won't spawn, but error beep won't play either because of other SFX + * Arrghus splash no longer used for pottery sprites (used apple instead) + * Killing enemies via freeze + hammer properly results in the droppable item instead of the freeze prize + * Forbid certain doors from being dashable when you either can't dash them open (but bombs would work) or you'd fall into a pit from the bonk recoil in OHKO + * Logic refinements + * Skull X Room requires Boots or access to Skull Back Drop + * GT Falling Torches requires Boots to get over the falling tile gap (this is a stop-gap measure until more sophisticated crystal switch traversal is possible) * 1.0.1.11 * Separated Collection Rate counter from experimental * Added MSU Resume option diff --git a/Regions.py b/Regions.py index f8cb447b..1d952189 100644 --- a/Regions.py +++ b/Regions.py @@ -523,8 +523,9 @@ def create_dungeon_regions(world, player): create_dungeon_region(player, 'Skull Big Key', 'Skull Woods', ['Skull Woods - Big Key Chest'], ['Skull Big Key SW', 'Skull Big Key EN']), create_dungeon_region(player, 'Skull Lone Pot', 'Skull Woods', None, ['Skull Lone Pot WN']), create_dungeon_region(player, 'Skull Small Hall', 'Skull Woods', None, ['Skull Small Hall ES', 'Skull Small Hall WS']), - create_dungeon_region(player, 'Skull Back Drop', 'Skull Woods', None, ['Skull Back Drop Star Path']), - create_dungeon_region(player, 'Skull 2 West Lobby', 'Skull Woods', ['Skull Woods - West Lobby Pot Key'], ['Skull 2 West Lobby ES', 'Skull 2 West Lobby NW', 'Skull 2 West Lobby S']), + create_dungeon_region(player, 'Skull Back Drop', 'Skull Woods', ['Skull Star Tile'], ['Skull Back Drop Star Path']), + create_dungeon_region(player, 'Skull 2 West Lobby', 'Skull Woods', ['Skull Woods - West Lobby Pot Key'], ['Skull 2 West Lobby ES', 'Skull 2 West Lobby Pits', 'Skull 2 West Lobby S']), + create_dungeon_region(player, 'Skull 2 West Lobby Ledge', 'Skull Woods', None, ['Skull 2 West Lobby NW', 'Skull 2 West Lobby Ledge Pits']), create_dungeon_region(player, 'Skull X Room', 'Skull Woods', None, ['Skull X Room SW']), create_dungeon_region(player, 'Skull 3 Lobby', 'Skull Woods', None, ['Skull 3 Lobby NW', 'Skull 3 Lobby EN', 'Skull 3 Lobby SW']), create_dungeon_region(player, 'Skull East Bridge', 'Skull Woods', None, ['Skull East Bridge WN', 'Skull East Bridge WS']), @@ -1045,7 +1046,7 @@ def adjust_locations(world, player): # unreal events: for l in ['Ganon', 'Agahnim 1', 'Agahnim 2', 'Dark Blacksmith Ruins', 'Frog', 'Missing Smith', 'Floodgate', 'Trench 1 Switch', 'Trench 2 Switch', 'Swamp Drain', 'Attic Cracked Floor', 'Suspicious Maiden', - 'Revealing Light', 'Ice Block Drop', 'Zelda Pickup', 'Zelda Drop Off']: + 'Revealing Light', 'Ice Block Drop', 'Zelda Pickup', 'Zelda Drop Off', 'Skull Star Tile']: location = world.get_location_unsafe(l, player) if location: location.type = LocationType.Logical @@ -1150,6 +1151,7 @@ dungeon_events = [ 'Suspicious Maiden', 'Revealing Light', 'Ice Block Drop', + 'Skull Star Tile', 'Zelda Pickup', 'Zelda Drop Off' ] @@ -1388,6 +1390,7 @@ location_table = {'Mushroom': (0x180013, 0x186338, False, 'in the woods'), 'Suspicious Maiden': (None, None, False, None), 'Revealing Light': (None, None, False, None), 'Ice Block Drop': (None, None, False, None), + 'Skull Star Tile': (None, None, False, None), 'Zelda Pickup': (None, None, False, None), 'Zelda Drop Off': (None, None, False, None), 'Eastern Palace - Prize': ([0x1209D, 0x53E76, 0x53E77, 0x180052, 0x180070, 0xC6FE, 0x186FE2], None, True, 'Eastern Palace'), diff --git a/Rules.py b/Rules.py index 7f9c0802..0572d679 100644 --- a/Rules.py +++ b/Rules.py @@ -273,6 +273,8 @@ def global_rules(world, player): set_rule(world.get_entrance('Skull Big Chest Hookpath', player), lambda state: state.has('Hookshot', player)) set_rule(world.get_entrance('Skull Torch Room WN', player), lambda state: state.has('Fire Rod', player)) set_rule(world.get_entrance('Skull Vines NW', player), lambda state: state.has_sword(player)) + set_rule(world.get_entrance('Skull 2 West Lobby Pits', player), lambda state: state.has_Boots(player) or state.has('Hidden Pits', player)) + set_rule(world.get_entrance('Skull 2 West Lobby Ledge Pits', player), lambda state: state.has('Hidden Pits', player)) set_defeat_dungeon_boss_rule(world.get_location('Skull Woods - Boss', player)) set_defeat_dungeon_boss_rule(world.get_location('Skull Woods - Prize', player)) @@ -398,6 +400,9 @@ def global_rules(world, player): set_rule(world.get_entrance('GT Lanmolas 2 NW', player), lambda state: world.get_region('GT Lanmolas 2', player).dungeon.bosses['middle'].can_defeat(state)) set_rule(world.get_entrance('GT Torch Cross ES', player), lambda state: state.has_fire_source(player)) set_rule(world.get_entrance('GT Falling Torches NE', player), lambda state: state.has_fire_source(player)) + # todo: the following only applies to crystal state propagation from this supertile + # you can also reset the supertile, but I'm not sure how to model that + set_rule(world.get_entrance('GT Falling Torches Down Ladder', player), lambda state: state.has_Boots(player)) set_rule(world.get_entrance('GT Moldorm Gap', player), lambda state: state.has('Hookshot', player) and world.get_region('GT Moldorm', player).dungeon.bosses['top'].can_defeat(state)) set_defeat_dungeon_boss_rule(world.get_location('Agahnim 2', player))