From 4baaa2f44c8580e56eb1d85273088e48b25680cd Mon Sep 17 00:00:00 2001 From: kbranch Date: Mon, 24 Aug 2026 17:03:13 -0400 Subject: [PATCH 01/11] Allow boots bonking over richard's pit instead of damage boosting --- logic/overworld.py | 1 + 1 file changed, 1 insertion(+) diff --git a/logic/overworld.py b/logic/overworld.py index 89d65560..87afda2c 100644 --- a/logic/overworld.py +++ b/logic/overworld.py @@ -629,6 +629,7 @@ def __init__(self, options, world_setup, r): self._addEntranceRequirement("castle_jump_cave", r.pit_buffer_boots) # pit buffer to clip bottom wall and boots bonk across prairie_cave_secret_exit.connect(prairie_cave, AND(BOMB, OR(r.boots_bonk_pit, r.hookshot_spam_pit))) # hookshot spam or boots bonk across pits can go from left to right by pit buffering on top of the bottom wall then boots bonk across richard_cave_chest.connect(richard_cave, r.damage_boost) # use the zol on the other side of the pit to damage boost across (requires damage from pit + zol) + richard_cave_chest.connect(richard_cave, r.boots_bonk) # bonk over the pit instead of damage boosting castle_secret_entrance_right.connect(castle_secret_entrance_left, OR(r.boots_bonk_2d_spikepit, r.bracelet_bounce_2d_spikepit, r.toadstool_bounce_2d_spikepit)) # use bracelet or toadstool to damage boost off of spikes and get through passageway. Also need to hold A button when bouncing off spikes or goombas left_bay_area.connect(ghost_hut_outside, r.pit_buffer_boots) # multiple pit buffers to bonk across the bottom wall left_bay_area.connect(ukuku_prairie, r.hookshot_clip_block, back=False) # clip through the donuts blocking the path next to prairie plateau cave by hookshotting up and killing the two moblins that way which clips you further up two times. This is enough to move right From cb39d45cb449572fd6b5bf86cc6c1ceba9bdf116 Mon Sep 17 00:00:00 2001 From: kbranch Date: Mon, 24 Aug 2026 17:18:40 -0400 Subject: [PATCH 02/11] Boots bonk and jesus buffer your way across the bottom wall before D3 --- logic/overworld.py | 1 + 1 file changed, 1 insertion(+) diff --git a/logic/overworld.py b/logic/overworld.py index 87afda2c..b4881df2 100644 --- a/logic/overworld.py +++ b/logic/overworld.py @@ -630,6 +630,7 @@ def __init__(self, options, world_setup, r): prairie_cave_secret_exit.connect(prairie_cave, AND(BOMB, OR(r.boots_bonk_pit, r.hookshot_spam_pit))) # hookshot spam or boots bonk across pits can go from left to right by pit buffering on top of the bottom wall then boots bonk across richard_cave_chest.connect(richard_cave, r.damage_boost) # use the zol on the other side of the pit to damage boost across (requires damage from pit + zol) richard_cave_chest.connect(richard_cave, r.boots_bonk) # bonk over the pit instead of damage boosting + ukuku_prairie.connect(dungeon3_entrance, AND(r.pit_buffer_boots, r.jesus_buffer), back=False) castle_secret_entrance_right.connect(castle_secret_entrance_left, OR(r.boots_bonk_2d_spikepit, r.bracelet_bounce_2d_spikepit, r.toadstool_bounce_2d_spikepit)) # use bracelet or toadstool to damage boost off of spikes and get through passageway. Also need to hold A button when bouncing off spikes or goombas left_bay_area.connect(ghost_hut_outside, r.pit_buffer_boots) # multiple pit buffers to bonk across the bottom wall left_bay_area.connect(ukuku_prairie, r.hookshot_clip_block, back=False) # clip through the donuts blocking the path next to prairie plateau cave by hookshotting up and killing the two moblins that way which clips you further up two times. This is enough to move right From 70ab9fcc05571a49e941b35475f2df8bb1231b1d Mon Sep 17 00:00:00 2001 From: kbranch Date: Mon, 24 Aug 2026 17:23:05 -0400 Subject: [PATCH 03/11] Marin can be accessed from animal village --- logic/overworld.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/logic/overworld.py b/logic/overworld.py index b4881df2..940397ba 100644 --- a/logic/overworld.py +++ b/logic/overworld.py @@ -13,7 +13,8 @@ def __init__(self, options, world_setup, r): Location().add(FishingMinigame()).connect(mabe_village, AND(r.bush, FOUND("RUPEES", 50))) # fishing game, heart piece is directly done by the minigame. Location().add(Seashell(0x0A3)).connect(mabe_village, r.bush) # bushes below the shop Location().add(Seashell(0x0D2)).connect(mabe_village, PEGASUS_BOOTS) # smash into tree next to lv1 - Location().add(Song(0x092)).connect(mabe_village, OCARINA) # Marins song + marin_song = Location().add(Song(0x092)) + mabe_village.connect(marin_song, OCARINA, back=False) Location().add(KeyHole(0x0D3, TAIL_CAVE_OPENED)).connect(mabe_village, TAIL_KEY) # Marins song rooster_cave = Location("Rooster Cave") Location().add(DroppedKey(0x1E4)).connect(rooster_cave, AND(OCARINA, SONG3)) @@ -286,6 +287,7 @@ def __init__(self, options, world_setup, r): animal_village = Location("Animal Village") animal_village.connect(Location().add(TradeSequenceItem(0x0CD, TRADING_ITEM_FISHING_HOOK)), TRADING_ITEM_BROOM) + animal_village.connect(marin_song, OCARINA, back=False) cookhouse = Location("Bear Chef's House") cookhouse.connect(Location().add(TradeSequenceItem(0x2D7, TRADING_ITEM_PINEAPPLE)), TRADING_ITEM_HONEYCOMB) goathouse = Location("Goat's House") From d374d8ff565f9c9752564150f015622975a52a8c Mon Sep 17 00:00:00 2001 From: kbranch Date: Mon, 24 Aug 2026 19:16:40 -0400 Subject: [PATCH 04/11] Allow using a found real sword for bushes and switches in good boy mode --- logic/overworld.py | 2 +- logic/requirements.py | 28 +++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/logic/overworld.py b/logic/overworld.py index 940397ba..e6efdd48 100644 --- a/logic/overworld.py +++ b/logic/overworld.py @@ -632,7 +632,7 @@ def __init__(self, options, world_setup, r): prairie_cave_secret_exit.connect(prairie_cave, AND(BOMB, OR(r.boots_bonk_pit, r.hookshot_spam_pit))) # hookshot spam or boots bonk across pits can go from left to right by pit buffering on top of the bottom wall then boots bonk across richard_cave_chest.connect(richard_cave, r.damage_boost) # use the zol on the other side of the pit to damage boost across (requires damage from pit + zol) richard_cave_chest.connect(richard_cave, r.boots_bonk) # bonk over the pit instead of damage boosting - ukuku_prairie.connect(dungeon3_entrance, AND(r.pit_buffer_boots, r.jesus_buffer), back=False) + ukuku_prairie.connect(dungeon3_entrance, AND(r.pit_buffer_boots, r.jesus_buffer), back=False) # boots bonk from the right into a jesus buffer down to the bottom wall, then bonk all the way across castle_secret_entrance_right.connect(castle_secret_entrance_left, OR(r.boots_bonk_2d_spikepit, r.bracelet_bounce_2d_spikepit, r.toadstool_bounce_2d_spikepit)) # use bracelet or toadstool to damage boost off of spikes and get through passageway. Also need to hold A button when bouncing off spikes or goombas left_bay_area.connect(ghost_hut_outside, r.pit_buffer_boots) # multiple pit buffers to bonk across the bottom wall left_bay_area.connect(ukuku_prairie, r.hookshot_clip_block, back=False) # clip through the donuts blocking the path next to prairie plateau cave by hookshotting up and killing the two moblins that way which clips you further up two times. This is enough to move right diff --git a/logic/requirements.py b/logic/requirements.py index 3cf844c3..1874fbe0 100644 --- a/logic/requirements.py +++ b/logic/requirements.py @@ -26,6 +26,16 @@ def __repr__(self) -> str: def remove(self, item) -> None: if item in self.__items: self.__items.remove(item) + elif item in self.__children: + self.__children.remove(item) + + def add(self, item) -> None: + if isinstance(item, str): + if item not in self.__items: + self.__items.append(item) + else: + if item not in self.__children: + self.__children.append(item) def test(self, inventory) -> bool: for item in self.__items: @@ -70,6 +80,16 @@ def __repr__(self) -> str: def remove(self, item) -> None: if item in self.__items: self.__items.remove(item) + elif item in self.__children: + self.__children.remove(item) + + def add(self, item) -> None: + if isinstance(item, str): + if item not in self.__items: + self.__items.append(item) + else: + if item not in self.__children: + self.__children.append(item) def test(self, inventory) -> bool: for item in self.__items: @@ -374,11 +394,17 @@ def __init__(self, options): if options.hardmode == "ohko": self.miniboss_requirements["ROLLING_BONES"] = OR(BOW, MAGIC_ROD, BOOMERANG, AND(FEATHER, self.attack_hookshot)) # should not deal with roller damage if options.bowwow != "normal": - # We cheat in bowwow mode, we pretend we have the sword, as bowwow can pretty much do all what the sword ca$ # Except for taking out bushes (and crystal pillars are removed) + # We cheat in bowwow mode, we pretend we have the sword, as bowwow can pretty much do all what the sword can + # Except for taking out bushes (and crystal pillars are removed) self.bush.remove(SWORD) self.pit_bush.remove(SWORD) self.hit_switch.remove(SWORD) self.hit_switch_color.remove(SWORD) + # 2 swords means we picked up a real one + self.bush.add(COUNT(SWORD, 2)) + self.pit_bush.add(COUNT(SWORD, 2)) + self.hit_switch.add(COUNT(SWORD, 2)) + self.hit_switch_color.add(COUNT(SWORD, 2)) if options.logic == "casual": # In casual mode, remove the more complex kill methods self.bush.remove(MAGIC_POWDER) From 1e3bc651e22cbde2fd1f2efd4bbb2d060696cd8a Mon Sep 17 00:00:00 2001 From: kbranch Date: Mon, 24 Aug 2026 19:40:19 -0400 Subject: [PATCH 05/11] Remove a D7 switch hit from normal logic that should be hard, add a normal logic switch hit that was excluded for possibly messing with stair shuffle --- logic/dungeon7.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/logic/dungeon7.py b/logic/dungeon7.py index 5fc05c14..f7d6b624 100644 --- a/logic/dungeon7.py +++ b/logic/dungeon7.py @@ -100,7 +100,7 @@ def __init__(self, options, world_setup, r): # floor 2 north after_a_stairs.connect(ball_access, POWER_BRACELET, back=False) after_a_stairs.connect(ne_pillar, POWER_BRACELET, back=None) # intended method is to pull lever - after_a_stairs.connect(pegs_before_ball, "SWITCH7B_RANGE", back=False) + after_a_stairs.connect(pegs_before_ball, OR("SWITCH7A", "SWITCH7B_RANGE"), back=False) # SWITCH7A here might eventually cause trouble with stairs shuffle? after_b_stairs.connect(ne_pillar, "SWITCH7A", back=OR("SWITCH7B_RANGE", "SWITCH7C")) ne_pillar.connect(ne_pillar_chest5, POWER_BRACELET, back=False) ne_pillar.connect(ne_pillar_fall, "D7_BALL", back=False) @@ -120,7 +120,7 @@ def __init__(self, options, world_setup, r): after_d_stairs.connect(tile_room, back=False) after_d_stairs.connect(after_d_stairs_drop2, r.miniboss_requirements["HINOX"], back=False) after_d_stairs.connect(sw_pillar_toak_clear, r.enemy_requirements["THREE_OF_A_KIND"], back=False) #NOTE: add bracelet method if rom patched - after_d_stairs.connect((se_pillar_switch_midrange, se_pillar_switch_range), OR(BOOMERANG, BOW, BOMB, MAGIC_ROD), back=False) + after_d_stairs.connect(se_pillar_switch_midrange, OR(BOOMERANG, BOW, BOMB, MAGIC_ROD), back=False) after_d_stairs.connect(pegs_before_ball, "SWITCH7C_RANGE", back=None) after_d_stairs.connect(keylock_ledge, FOUND(KEY7, 3)) keylock_ledge.connect((se_pillar, pegs_before_ball, after_d_stairs), back=False) From 0dd0dc4d71eed3d6ff4ba8e44e3bcfe2716626fd Mon Sep 17 00:00:00 2001 From: kbranch Date: Mon, 24 Aug 2026 19:54:42 -0400 Subject: [PATCH 06/11] Oops, broke the item pool --- itempool.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/itempool.py b/itempool.py index c4c27dfe..43d09abe 100755 --- a/itempool.py +++ b/itempool.py @@ -72,7 +72,7 @@ 4: { "D4_BOSS_CLEAR": 1, "D4_PITKEY": 1, "D4_PUZZLE_CLUE": 1, }, 5: { "D5_ZOL_CLEAR": 1, "MS1_KILL": 1, "MS2_KILL": 1, "MS3_KILL": 1, }, 6: { "D6_THREE_WIZROBE_CLEAR": 1, "SWITCH6A": 1, "SWITCH6A_RANGE": 1, "SWITCH6B_MIDRANGE": 1, "SWITCH6B_RANGE": 1, "SWITCH6C": 1, "SWITCH6D": 1, "SWITCH6E": 1, "SWITCH6F": 1, }, - 7: { "D7_BALL": 1, "D7_BOSS_CLEAR": 1, "D7_PILLAR": 4, "D7_TOAK_CLEAR": 1, "SWITCH7A": 1, "SWITCH7A_RANGE": 1, "SWITCH7B": 1, "SWITCH7B_RANGE": 1, "SWITCH7C": 1, "SWITCH7C_MIDRANGE": 1, "SWITCH7C_RANGE": 1, }, + 7: { "D7_BALL": 1, "D7_BOSS_CLEAR": 1, "D7_PILLAR": 4, "D7_TOAK_CLEAR": 1, "SWITCH7A": 1, "SWITCH7A_RANGE": 1, "SWITCH7B": 1, "SWITCH7B_RANGE": 1, "SWITCH7C": 1, "SWITCH7C_MIDRANGE": 1, }, 8: { "SWITCH8": 1, }, } From 942ea6f40d953a8d9773aaeab9540b31e03ca2a0 Mon Sep 17 00:00:00 2001 From: kbranch Date: Mon, 24 Aug 2026 20:00:33 -0400 Subject: [PATCH 07/11] Surely this time --- itempool.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/itempool.py b/itempool.py index 43d09abe..2dfde4b3 100755 --- a/itempool.py +++ b/itempool.py @@ -285,6 +285,9 @@ def __setup(self, logic, settings, rnd): self.remove(MESSAGE, 1) self.add(RUPEES_500, 3) + if settings.logic in ("hard", "glitched", "hell"): + STATIC_DUNGEON_ITEMS[7]["SWITCH7C_RANGE"] = 1 + if settings.overworld not in {"dungeonchain", "nodungeons", "random"}: for dungeon,items in STATIC_DUNGEON_ITEMS.items(): for item, qty in items.items(): From 9fd4611247baf2d9f867bac801eac7150189d1b8 Mon Sep 17 00:00:00 2001 From: kbranch Date: Mon, 24 Aug 2026 21:57:58 -0400 Subject: [PATCH 08/11] Cleaned up the new switch addition --- itempool.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/itempool.py b/itempool.py index 2dfde4b3..34b4199a 100755 --- a/itempool.py +++ b/itempool.py @@ -285,9 +285,6 @@ def __setup(self, logic, settings, rnd): self.remove(MESSAGE, 1) self.add(RUPEES_500, 3) - if settings.logic in ("hard", "glitched", "hell"): - STATIC_DUNGEON_ITEMS[7]["SWITCH7C_RANGE"] = 1 - if settings.overworld not in {"dungeonchain", "nodungeons", "random"}: for dungeon,items in STATIC_DUNGEON_ITEMS.items(): for item, qty in items.items(): @@ -419,6 +416,8 @@ def __setup(self, logic, settings, rnd): if settings.logic == 'casual': self.remove("SWITCH7B_RANGE", self.get("SWITCH7B_RANGE")) + if settings.logic in ("hard", "glitched", "hell"): + self.add("SWITCH7C_RANGE", 1) def __randomizeRupees(self, options, rnd): # Remove rupees from the item pool and replace them with other items to create more variety From 190548f5884ef32895c2e62b8cea2c93a7f9e934 Mon Sep 17 00:00:00 2001 From: kbranch Date: Tue, 25 Aug 2026 19:33:04 -0400 Subject: [PATCH 09/11] The D3 bonk buffer needs hookshot --- logic/overworld.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logic/overworld.py b/logic/overworld.py index e6efdd48..9c215f05 100644 --- a/logic/overworld.py +++ b/logic/overworld.py @@ -632,7 +632,7 @@ def __init__(self, options, world_setup, r): prairie_cave_secret_exit.connect(prairie_cave, AND(BOMB, OR(r.boots_bonk_pit, r.hookshot_spam_pit))) # hookshot spam or boots bonk across pits can go from left to right by pit buffering on top of the bottom wall then boots bonk across richard_cave_chest.connect(richard_cave, r.damage_boost) # use the zol on the other side of the pit to damage boost across (requires damage from pit + zol) richard_cave_chest.connect(richard_cave, r.boots_bonk) # bonk over the pit instead of damage boosting - ukuku_prairie.connect(dungeon3_entrance, AND(r.pit_buffer_boots, r.jesus_buffer), back=False) # boots bonk from the right into a jesus buffer down to the bottom wall, then bonk all the way across + ukuku_prairie.connect(dungeon3_entrance, AND(r.pit_buffer_boots, r.jesus_buffer_hookshot), back=False) # boots bonk from the right into a jesus buffer down to the bottom wall, then bonk all the way across castle_secret_entrance_right.connect(castle_secret_entrance_left, OR(r.boots_bonk_2d_spikepit, r.bracelet_bounce_2d_spikepit, r.toadstool_bounce_2d_spikepit)) # use bracelet or toadstool to damage boost off of spikes and get through passageway. Also need to hold A button when bouncing off spikes or goombas left_bay_area.connect(ghost_hut_outside, r.pit_buffer_boots) # multiple pit buffers to bonk across the bottom wall left_bay_area.connect(ukuku_prairie, r.hookshot_clip_block, back=False) # clip through the donuts blocking the path next to prairie plateau cave by hookshotting up and killing the two moblins that way which clips you further up two times. This is enough to move right From 84432cb9ecc9a7483beb9a69677d624633ca6543 Mon Sep 17 00:00:00 2001 From: kbranch Date: Tue, 25 Aug 2026 20:08:11 -0400 Subject: [PATCH 10/11] Moved SWITCH7C_RANGE back to normal, except for MAGIC_ROD since that needs a wall clip --- itempool.py | 4 +--- logic/dungeon7.py | 3 ++- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/itempool.py b/itempool.py index 34b4199a..c4c27dfe 100755 --- a/itempool.py +++ b/itempool.py @@ -72,7 +72,7 @@ 4: { "D4_BOSS_CLEAR": 1, "D4_PITKEY": 1, "D4_PUZZLE_CLUE": 1, }, 5: { "D5_ZOL_CLEAR": 1, "MS1_KILL": 1, "MS2_KILL": 1, "MS3_KILL": 1, }, 6: { "D6_THREE_WIZROBE_CLEAR": 1, "SWITCH6A": 1, "SWITCH6A_RANGE": 1, "SWITCH6B_MIDRANGE": 1, "SWITCH6B_RANGE": 1, "SWITCH6C": 1, "SWITCH6D": 1, "SWITCH6E": 1, "SWITCH6F": 1, }, - 7: { "D7_BALL": 1, "D7_BOSS_CLEAR": 1, "D7_PILLAR": 4, "D7_TOAK_CLEAR": 1, "SWITCH7A": 1, "SWITCH7A_RANGE": 1, "SWITCH7B": 1, "SWITCH7B_RANGE": 1, "SWITCH7C": 1, "SWITCH7C_MIDRANGE": 1, }, + 7: { "D7_BALL": 1, "D7_BOSS_CLEAR": 1, "D7_PILLAR": 4, "D7_TOAK_CLEAR": 1, "SWITCH7A": 1, "SWITCH7A_RANGE": 1, "SWITCH7B": 1, "SWITCH7B_RANGE": 1, "SWITCH7C": 1, "SWITCH7C_MIDRANGE": 1, "SWITCH7C_RANGE": 1, }, 8: { "SWITCH8": 1, }, } @@ -416,8 +416,6 @@ def __setup(self, logic, settings, rnd): if settings.logic == 'casual': self.remove("SWITCH7B_RANGE", self.get("SWITCH7B_RANGE")) - if settings.logic in ("hard", "glitched", "hell"): - self.add("SWITCH7C_RANGE", 1) def __randomizeRupees(self, options, rnd): # Remove rupees from the item pool and replace them with other items to create more variety diff --git a/logic/dungeon7.py b/logic/dungeon7.py index f7d6b624..d21ce6aa 100644 --- a/logic/dungeon7.py +++ b/logic/dungeon7.py @@ -121,6 +121,7 @@ def __init__(self, options, world_setup, r): after_d_stairs.connect(after_d_stairs_drop2, r.miniboss_requirements["HINOX"], back=False) after_d_stairs.connect(sw_pillar_toak_clear, r.enemy_requirements["THREE_OF_A_KIND"], back=False) #NOTE: add bracelet method if rom patched after_d_stairs.connect(se_pillar_switch_midrange, OR(BOOMERANG, BOW, BOMB, MAGIC_ROD), back=False) + after_d_stairs.connect(se_pillar_switch_range, OR(BOOMERANG, BOW, BOMB), back=False) # hit switch and get on pegs by east exit after_d_stairs.connect(pegs_before_ball, "SWITCH7C_RANGE", back=None) after_d_stairs.connect(keylock_ledge, FOUND(KEY7, 3)) keylock_ledge.connect((se_pillar, pegs_before_ball, after_d_stairs), back=False) @@ -172,7 +173,7 @@ def __init__(self, options, world_setup, r): after_c_stairs.connect(after_c_stairs_chest2, BOMB, back=False) after_c_stairs.connect(spike_corridor, r.damage_boost) # forced damage so this cannot be in normal logic after_d_stairs.connect(se_pillar_switch_midrange, AND(FEATHER, SWORD), back=False) # jump and swing sword from below rail NOTE: add bracelet method if rom patched - after_d_stairs.connect(se_pillar_switch_range, OR(BOOMERANG, BOW, BOMB, MAGIC_ROD), back=False) # hit switch and get on pegs by east exit + after_d_stairs.connect(se_pillar_switch_range, MAGIC_ROD, back=False) # hit switch and get on pegs by east exit after_d_stairs.connect(sw_pillar_toak_clear, "D7_BALL", back=False) # throw the ball to solve three-of-a-kind and spawn the chest for location in (after_d_stairs, bombwall_pit, sw_pillar): location.connect(sw_pillar_toak_clear, BOMB, back=False) # push a block if needed and solve the three-of-a-kind puzzle with bombs From f730a383e3d08da1a12d258b3116ea6697e598ed Mon Sep 17 00:00:00 2001 From: kbranch Date: Tue, 25 Aug 2026 20:13:21 -0400 Subject: [PATCH 11/11] Oops, missed a PR comment for the D3 boots bonk --- logic/overworld.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logic/overworld.py b/logic/overworld.py index 9c215f05..35374add 100644 --- a/logic/overworld.py +++ b/logic/overworld.py @@ -632,7 +632,7 @@ def __init__(self, options, world_setup, r): prairie_cave_secret_exit.connect(prairie_cave, AND(BOMB, OR(r.boots_bonk_pit, r.hookshot_spam_pit))) # hookshot spam or boots bonk across pits can go from left to right by pit buffering on top of the bottom wall then boots bonk across richard_cave_chest.connect(richard_cave, r.damage_boost) # use the zol on the other side of the pit to damage boost across (requires damage from pit + zol) richard_cave_chest.connect(richard_cave, r.boots_bonk) # bonk over the pit instead of damage boosting - ukuku_prairie.connect(dungeon3_entrance, AND(r.pit_buffer_boots, r.jesus_buffer_hookshot), back=False) # boots bonk from the right into a jesus buffer down to the bottom wall, then bonk all the way across + ukuku_prairie.connect(dungeon3_entrance, AND(r.jesus_buffer, r.jesus_buffer_hookshot), back=False) # boots bonk from the right into a jesus buffer down to the bottom wall, then bonk all the way across. Hookshot is needed to restart the buffer after transitions castle_secret_entrance_right.connect(castle_secret_entrance_left, OR(r.boots_bonk_2d_spikepit, r.bracelet_bounce_2d_spikepit, r.toadstool_bounce_2d_spikepit)) # use bracelet or toadstool to damage boost off of spikes and get through passageway. Also need to hold A button when bouncing off spikes or goombas left_bay_area.connect(ghost_hut_outside, r.pit_buffer_boots) # multiple pit buffers to bonk across the bottom wall left_bay_area.connect(ukuku_prairie, r.hookshot_clip_block, back=False) # clip through the donuts blocking the path next to prairie plateau cave by hookshotting up and killing the two moblins that way which clips you further up two times. This is enough to move right