From c150af89b20101c5921c1b5bcc55326a96e600f2 Mon Sep 17 00:00:00 2001 From: VincentsSin Date: Thu, 15 Jan 2026 06:04:24 -0600 Subject: [PATCH 01/11] Minor edits to various sanity locations Also added a couple missing locations. Some have notes out of uncertainty. --- worlds/mm_recomp/NormalRules.py | 188 +++++++++++++++++++++----------- 1 file changed, 123 insertions(+), 65 deletions(-) diff --git a/worlds/mm_recomp/NormalRules.py b/worlds/mm_recomp/NormalRules.py index 4df78fa2..2776093c 100644 --- a/worlds/mm_recomp/NormalRules.py +++ b/worlds/mm_recomp/NormalRules.py @@ -17095,12 +17095,14 @@ def get_location_rules(player, options): lambda state: ( state.has("Small Key (Snowhead)", player, 3) and can_use_fire_arrows(state, player) and + has_soul_absurd(state, player, options, "Deku Flowers") and state.has("Deku Mask", player) ), "Snowhead Temple 4F Outside Wizzrobe Icicles (2)": lambda state: ( state.has("Small Key (Snowhead)", player, 3) and can_use_fire_arrows(state, player) and + has_soul_absurd(state, player, options, "Deku Flowers") and state.has("Deku Mask", player) ), @@ -17140,9 +17142,21 @@ def get_location_rules(player, options): # Well "Bottom of the Well Icicle (1)": - lambda state: state.can_reach("Ikana Well Rightside Torch Chest", "Location", player), + lambda state: ( + can_use_light_arrows(state, player) or + ( + can_plant_beans(state, player, options) and + state.has("Gibdo Mask", player) + ) + ), "Bottom of the Well Icicle (2)": - lambda state: state.can_reach("Ikana Well Rightside Torch Chest", "Location", player), + lambda state: ( + can_use_light_arrows(state, player) or + ( + can_plant_beans(state, player, options) and + state.has("Gibdo Mask", player) + ) + ), # Goron Trial @@ -17235,12 +17249,20 @@ def get_location_rules(player, options): lambda state: has_projectiles(state, player), "Woodfall Temple Push Block Hive (1)": - lambda state: has_projectiles(state, player), + lambda state: ( + state.has("Small Key (Woodfall)", player) and + has_projectiles(state, player) + ) or + state.has("Progressive Bow", player) + ), # Mountain Village Spring Hives "Mountain Village Spring Tree Hive (1)": - lambda state: can_clear_snowhead(state, player), + lambda state: ( + can_clear_snowhead(state, player) and + has_projectiles(state, player) + ), "Great Bay Coast Cow Grotto Hive": lambda state: ( has_soul_absurd(state, player, options, "Grottos") and @@ -17547,16 +17569,17 @@ def get_location_rules(player, options): # Ikana Canyon Gossip Fairy "Ikana Canyon Near Octoroks Gossip Fairy": - lambda state: ( - can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + lambda state: + ( + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Healing", state, player) ), - "Ikana Canyon Across Ocean Deed Ravine Gossip Fairy": lambda state: ( state.has("Zora Mask", player) and state.has("Ocean Title Deed", player) and + has_soul_npc(state, player, options, "Business Scrubs") and has_soul_absurd(state, player, options, "Deku Flowers") and state.has("Deku Mask", player) and ( @@ -17565,12 +17588,9 @@ def get_location_rules(player, options): ) ), "Ikana Canyon Near Ghost House Gossip Fairy": - lambda state: - ( - ( - can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) - ) + lambda state: ( + can_play_song("Song of Healing", state, player) or + can_play_song("Epona's Song", state, player) ), # Moon Gossip Fairies @@ -17765,6 +17785,8 @@ def get_location_rules(player, options): ( has_soul_npc(state, player, options, "Moon Kids") and state.has("Hookshot", player) and + has_bombchus(state, player) and + state.has("Progressive Bow", player, 1) ( can_play_song("Song of Healing", state, player) or can_play_song("Epona's Song", state, player) @@ -17772,14 +17794,14 @@ def get_location_rules(player, options): ), "Link Trial Gossip (4)": lambda state: - ( + ( has_soul_npc(state, player, options, "Moon Kids") and - state.can_reach("Link Trial Gossip (3)", "Location", player) and - can_use_fire_arrows(state, player) and + state.has("Hookshot", player) and has_bombchus(state, player) and - ( - can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + state.has("Progressive Bow", player, 1) + ( + can_play_song("Song of Healing", state, player) or + can_play_song("Epona's Song", state, player) ) ), @@ -17788,8 +17810,6 @@ def get_location_rules(player, options): ( has_soul_npc(state, player, options, "Moon Kids") and state.can_reach("Link Trial Gossip (3)", "Location", player) and - can_use_fire_arrows(state, player) and - has_bombchus(state, player) and ( can_play_song("Song of Healing", state, player) or can_play_song("Epona's Song", state, player) @@ -18121,6 +18141,7 @@ def get_location_rules(player, options): ), "Great Bay Temple Miniboss Frog": lambda state: ( + has_soul_enemy(state, player, options, "Jellied Gekko") and state.has("Zora Mask", player) and can_use_ice_arrows(state, player) and can_use_fire_arrows(state, player) and @@ -18173,7 +18194,8 @@ def get_location_rules(player, options): lambda state: ( state.has("Priority Mail", player) and has_soul_npc(state, player, options, "Madame Aroma") and - state.has("Kafei's Mask", player) + state.has("Kafei's Mask", player) and + state.has("Romani Mask", player) ), "Notebook Event Deposited Letter To Kafei": lambda state: ( @@ -18407,8 +18429,13 @@ def get_location_rules(player, options): state.has("Progressive Magic", player) and ( can_play_song("Epona's Song", state, player) or - options.owlsanity.value - and can_use_owl(state, player, options, "Ikana Canyon") + ( + options.owlsanity.value and + ( + can_use_owl(state, player, options, "Ikana Canyon") or + can_use_owl(state, player, options, "Stone Tower") + ) + ) ) ), @@ -18550,6 +18577,14 @@ def get_location_rules(player, options): lambda state: ( has_soul_absurd(state, player, options, "Trees & Bushes") and can_clear_snowhead(state, player) + and ( + state.has("Goron Mask", player) + or ( + state.has("Hookshot", player) + and state.has("Twin Islands Scarecrow", player) + and has_soul_npc(state, player, options, "Scarecrow") + ) + ) ), # Path To Snowhead - @@ -18568,6 +18603,11 @@ def get_location_rules(player, options): has_soul_absurd(state, player, options, "Trees & Bushes") and state.can_reach("Mountain Village", 'Region', player) ), + "Path To Snowhead Tree Near Ledge": + lambda.state: ( + has_soul_absurd(state, player, options, "Trees & Bushes") and + can_clear_snowhead(state, player) + ), # Goron Racetrack - "Goron Racetrack Trees (1)": @@ -19713,23 +19753,37 @@ def get_location_rules(player, options): lambda state: ( has_soul_absurd(state, player, options, "Deku Flowers") and state.has("Deku Mask", player) and - (can_use_fire_arrows(state, player) or - state.has("Small Key (Snowhead)", player, 2)) + state.has("Hookshot", player) and + can_reach_scarecrow(state, player, options) and + state.has("Snowhead Temple Hidden Scarecrow", player) and + ( + has_explosives(state, player) and + state.has("Small Key (Snowhead)", player, 2) + ) or + ( + can_use_fire_arrows(state, player) + ) or + ( + can_reach_scarecrow(state, player, options) and + state.has("Snowhead Temple Lower Scarecrow", player) + ) ), + # Is scarecrow needed below since fire arrows are already a hard requirement? It's not really adding anything alternative here. Suggested edit: "Snowhead Temple Flower Outside Goht": lambda state: ( has_soul_absurd(state, player, options, "Deku Flowers") and state.has("Deku Mask", player) and - can_use_fire_arrows(state, player) and - ( - state.has("Small Key (Snowhead)", player, 3) or - ( - state.has("Small Key (Snowhead)", player, 2) and - state.has("Hookshot", player) and - can_reach_scarecrow(state, player, options) and - state.has("Snowhead Temple Lower Scarecrow", player) - ) - ) + can_use_fire_arrows(state, player) and + state.has("Small Key (Snowhead)", player, 1) + #( + #state.has("Small Key (Snowhead)", player, 3) or + #( + #state.has("Small Key (Snowhead)", player, 2) and + #state.has("Hookshot", player) and + #can_reach_scarecrow(state, player, options) and + #state.has("Snowhead Temple Lower Scarecrow", player) + #) + #) ), #Great Bay Flowers "Zora Cape Lower Wall Flower Near Beavers": @@ -19741,6 +19795,7 @@ def get_location_rules(player, options): "Zora Hall Business Scrub Flower": lambda state: ( has_soul_absurd(state, player, options, "Deku Flowers") and + has_soul_npc(state, player, options, "Business Scrubs") and state.has("Deku Mask", player) and state.has("Zora Mask", player) and state.has("Goron Mask", player) and @@ -20076,7 +20131,8 @@ def get_location_rules(player, options): ( state.has("Goron Mask", player) or has_explosives(state, player) or - can_use_fire_arrows(state, player) + can_use_fire_arrows(state, player) or + can_use_owl("Mountain Village", player) ) ), "Mountain Village Owl Statue Cut the Sign": @@ -20205,7 +20261,11 @@ def get_location_rules(player, options): "Woodfall Temple Web Leading to Dark Room": lambda state: ( has_soul_absurd(state, player, options, "Deku Flowers") and - state.has("Deku Mask", player) + state.has("Deku Mask", player) and + ( + state.has("Small Key (Woodfall)", player, 1) or + state.has("Progressive Bow", player) + ) ), "Ocean Spider House Entrance Web (1)": lambda state: ( @@ -20222,8 +20282,7 @@ def get_location_rules(player, options): "Ocean Spider House Library Web": lambda state: ( state.has("Hookshot", player) and - has_explosives(state, player) and - can_use_fire_arrows(state, player) + has_explosives(state, player) ), "Ocean Spider House Web Above Door 1st Floor Door": lambda state: ( @@ -20234,8 +20293,7 @@ def get_location_rules(player, options): "Ocean Spider House Web Over 1st Floor Pot": lambda state: ( state.has("Hookshot", player) and - has_explosives(state, player) and - can_use_fire_arrows(state, player) + has_explosives(state, player) ), "Ocean Spider House Web 1st Floor Near Staircase": lambda state: ( @@ -20246,26 +20304,22 @@ def get_location_rules(player, options): "Ocean Spider House Web Basement Near Staircase": lambda state: ( state.has("Hookshot", player) and - has_explosives(state, player) and - can_use_fire_arrows(state, player) + has_explosives(state, player) ), "Ocean Spider House Web Basement Covering Crates": lambda state: ( state.has("Hookshot", player) and - has_explosives(state, player) and - can_use_fire_arrows(state, player) + has_explosives(state, player) ), "Ocean Spider House Web Basement Covering Hole": lambda state: ( state.has("Hookshot", player) and - has_explosives(state, player) and - can_use_fire_arrows(state, player) + has_explosives(state, player) ), "Ocean Spider House Web Basement Covering Door": lambda state: ( state.has("Hookshot", player) and - has_explosives(state, player) and - can_use_fire_arrows(state, player) + has_explosives(state, player) ), "Ocean Spider House Web Boat Room Covering Crate": lambda state: ( @@ -20331,20 +20385,15 @@ def get_location_rules(player, options): ), "Beneath the Well Right Side Web Near Milk Gibdo": lambda state: ( - has_soul_npc(state, player, options, "Gibdos") and - state.has("Gibdo Mask", player) and - has_soul_absurd(state, player, options, "Deku Flowers") and - state.has("Deku Mask", player) and - has_bottle(state, player) and ( - ( - can_afford_price(state, player, 100) and - has_soul_npc(state, player, options, "Business Scrubs") - ) or - ( - state.has("Mask of Scents", player) and - has_soul_npc(state, player, options, "Kotake") - ) + has_soul_npc(state, player, options, "Gibdos") and + state.has("Gibdo Mask", player) and + has_bottle(state, player) and + can_plant_beans(state, player, options) and + state.has("Progressive Bomb Bag", player) + ) or + ( + can_use_light_arrows(state, player) ) and can_use_fire_arrows(state, player) ), @@ -20410,8 +20459,17 @@ def get_location_rules(player, options): ), "Graveyard Day 2 Bombable Wall": lambda state: ( + state.has("Captain's Hat", player) and + has_soul_npc(state, player, options, "Stalchilden") and + state.has("Lens of Truth", player) and has_explosives(state, player) ), + # Has an associated address, but unsure if properly implemented. + #"Goron Trial Chests": + # lambda state: ( + # state.has{"Goron Mask", player) and + # state.has("Progressive Magic", player) + # ), "Link Trial Bombable Wall Iron Knuckle": lambda state: ( has_bombchus(state, player) @@ -20436,4 +20494,4 @@ def get_location_rules(player, options): state.has("Swamp Skulltula Token", player, 30) and state.has("Ocean Skulltula Token", player, 30) ), - } \ No newline at end of file + } From 8e648cd3f386b9b1c696b7b62102ce47a1964d3b Mon Sep 17 00:00:00 2001 From: VincentsSin Date: Thu, 15 Jan 2026 12:41:40 -0600 Subject: [PATCH 02/11] Correct addresses for Pirates' Fortress chests Sewers upper and lower were sending the other's location --- worlds/mm_recomp/Locations.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/worlds/mm_recomp/Locations.py b/worlds/mm_recomp/Locations.py index f4298f8b..404bc87d 100644 --- a/worlds/mm_recomp/Locations.py +++ b/worlds/mm_recomp/Locations.py @@ -1279,11 +1279,11 @@ def can_create_heart_location(shp, c_or_p, loc_index): region="Pirates' Fortress Sewers", address=0x3469420062301 ), - "Pirates' Fortress Sewers Underwater Lower Chest": MMRLocationData( + "Pirates' Fortress Sewers Underwater Upper Chest": MMRLocationData( region="Pirates' Fortress Sewers", address=0x3469420062306 ), - "Pirates' Fortress Sewers Underwater Upper Chest": MMRLocationData( + "Pirates' Fortress Sewers Underwater Lower Chest": MMRLocationData( region="Pirates' Fortress Sewers", address=0x3469420062304 ), From 2dd3059b47997df276e3996ae2c8c939d425f02e Mon Sep 17 00:00:00 2001 From: VincentsSin Date: Sat, 24 Jan 2026 17:54:48 -0600 Subject: [PATCH 03/11] Update NormalRules.py Added Song of Storms as viable method for gossip fairies --- worlds/mm_recomp/NormalRules.py | 136 +++++++++++++++++++++----------- 1 file changed, 91 insertions(+), 45 deletions(-) diff --git a/worlds/mm_recomp/NormalRules.py b/worlds/mm_recomp/NormalRules.py index 2776093c..f9b20b94 100644 --- a/worlds/mm_recomp/NormalRules.py +++ b/worlds/mm_recomp/NormalRules.py @@ -17410,41 +17410,48 @@ def get_location_rules(player, options): "Termina Field Southern Tree Gossip Fairy": lambda state: ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ), "Termina Field Near Thieving Bird Gossip Fairy": lambda state: ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ), "Termina Field Near Bombable Rock Grotto Gossip Fairy": lambda state: ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ), "Termina Field Gossip Grotto Gossip Fairy": lambda state: ( has_soul_absurd(state, player, options, "Grottos") and ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ) ), "Termina Field Near Songwall Gossip Fairy": lambda state: ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ), "Termina Field Eastern Corner Gossip Fairy": lambda state: ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ), "Termina Field Observatory Gossip Fairy": lambda state: ( state.can_reach("Bomber's Hideout Astral Observatory", "Location", player) and can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ), # Road to Southern Swamp Gossip Fairy @@ -17452,7 +17459,8 @@ def get_location_rules(player, options): "Road to Southern Swamp Gossip Fairy": lambda state: ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ), # Southern Swamp Gossip Fairies @@ -17460,7 +17468,8 @@ def get_location_rules(player, options): "Southern Swamp Near Witch Gossip Fairy": lambda state: ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ), "Southern Swamp Near Witch Post Dungeon Gossip Fairy": @@ -17468,7 +17477,8 @@ def get_location_rules(player, options): can_clear_woodfall(state, player) and ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ) ), @@ -17476,7 +17486,8 @@ def get_location_rules(player, options): "Swamp Spider House Gossip Fairy": lambda state: ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ), # Milk Road Gossip Fairy @@ -17484,7 +17495,8 @@ def get_location_rules(player, options): "Milk Road Gossip Fairy": lambda state: ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ), # Romani Ranch Gossip Fairies @@ -17492,27 +17504,32 @@ def get_location_rules(player, options): "Romani Ranch Entry Gossip Fairy": lambda state: ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ), "Romani Ranch Tree Gossip Fairy": lambda state: ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ), "Romani Ranch Near Barn Gossip Fairy": lambda state: ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ), "Romani Ranch Baby Cuccoos Gossip Fairy": lambda state: ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ), "Romani Ranch Doggy Racetrack Gossip Fairy": lambda state: ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ), # Path to Mountain Village Gossip Fairy @@ -17520,7 +17537,8 @@ def get_location_rules(player, options): "Path To Mountain Village Gossip Fairy": lambda state: ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ), # Mountain Village Gossip Fairies @@ -17530,7 +17548,8 @@ def get_location_rules(player, options): can_clear_snowhead(state, player) and ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ) ), "Mountain Village Spring Ramps To Goron Graveyard Gossip Fairy": @@ -17538,7 +17557,8 @@ def get_location_rules(player, options): can_clear_snowhead(state, player) and ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ) ), @@ -17547,7 +17567,8 @@ def get_location_rules(player, options): "Great Bay Coast Rock Wall Gossip Fairy": lambda state: ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ), # Zora Cape @@ -17555,7 +17576,8 @@ def get_location_rules(player, options): "Zora Cape Gossip Fairy": lambda state: ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ), # Road to Ikana Gossip Fairy @@ -17563,7 +17585,8 @@ def get_location_rules(player, options): "Road To Ikana Gossip Fairy": lambda state: ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ), # Ikana Canyon Gossip Fairy @@ -17572,7 +17595,8 @@ def get_location_rules(player, options): lambda state: ( can_play_song("Epona's Song", state, player) or - can_play_song("Song of Healing", state, player) + can_play_song("Song of Healing", state, player) or + can_play_song("Song of Storms", state, player ), "Ikana Canyon Across Ocean Deed Ravine Gossip Fairy": lambda state: @@ -17584,13 +17608,15 @@ def get_location_rules(player, options): state.has("Deku Mask", player) and ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ) ), "Ikana Canyon Near Ghost House Gossip Fairy": lambda state: ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ), # Moon Gossip Fairies @@ -17603,7 +17629,8 @@ def get_location_rules(player, options): state.has("Deku Mask", player) and ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ) ), "Deku Trial Back Left Gossip": @@ -17614,7 +17641,8 @@ def get_location_rules(player, options): state.has("Deku Mask", player) and ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ) ), "Deku Trial Front Right Gossip": @@ -17625,7 +17653,8 @@ def get_location_rules(player, options): state.has("Deku Mask", player) and ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ) ), "Deku Trial Back Right Gossip": @@ -17636,7 +17665,8 @@ def get_location_rules(player, options): state.has("Deku Mask", player) and ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ) ), "Deku Trial Furthest Back Gossip": @@ -17647,7 +17677,8 @@ def get_location_rules(player, options): state.has("Deku Mask", player) and ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ) ), @@ -17661,7 +17692,8 @@ def get_location_rules(player, options): state.has("Progressive Magic", player) and ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ) ), "Goron Trial 1st Gazebo Gossip (1)": @@ -17672,7 +17704,8 @@ def get_location_rules(player, options): state.has("Progressive Magic", player) and ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ) ), "Goron Trial 2nd Gazebo Gossip (0)": @@ -17683,7 +17716,8 @@ def get_location_rules(player, options): state.has("Progressive Magic", player) and ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ) ), "Goron Trial 2nd Gazebo Gossip (1)": @@ -17694,7 +17728,8 @@ def get_location_rules(player, options): state.has("Progressive Magic", player) and ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ) ), "Goron Trial Near Heart Piece Gossip (1)": @@ -17705,7 +17740,8 @@ def get_location_rules(player, options): state.has("Progressive Magic", player) and ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ) ), @@ -17737,7 +17773,8 @@ def get_location_rules(player, options): state.has("Zora Mask", player) and ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ) ), "Zora Trial LRLL Path Gossip": @@ -17747,7 +17784,8 @@ def get_location_rules(player, options): state.has("Zora Mask", player) and ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ) ), "Zora Trial LLL Path Gossip": @@ -17757,7 +17795,8 @@ def get_location_rules(player, options): state.has("Zora Mask", player) and ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ) ), @@ -17766,8 +17805,11 @@ def get_location_rules(player, options): "Link Trial Gossip (1)": lambda state: ( has_soul_npc(state, player, options, "Moon Kids") and - can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + ( + can_play_song("Song of Healing", state, player) or + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player + ) ), "Link Trial Gossip (2)": lambda state: @@ -17776,7 +17818,8 @@ def get_location_rules(player, options): state.has("Hookshot", player) and ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ) ), @@ -17789,7 +17832,8 @@ def get_location_rules(player, options): state.has("Progressive Bow", player, 1) ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ) ), "Link Trial Gossip (4)": @@ -17801,7 +17845,8 @@ def get_location_rules(player, options): state.has("Progressive Bow", player, 1) ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ) ), @@ -17812,7 +17857,8 @@ def get_location_rules(player, options): state.can_reach("Link Trial Gossip (3)", "Location", player) and ( can_play_song("Song of Healing", state, player) or - can_play_song("Epona's Song", state, player) + can_play_song("Epona's Song", state, player) or + can_play_song("Song of Storms", state, player ) ), From 21bb6e7d012537e7ae9aa25c447f1c77739cb414 Mon Sep 17 00:00:00 2001 From: VincentsSin Date: Sun, 25 Jan 2026 04:53:35 -0600 Subject: [PATCH 04/11] Add escape logic to Medigoron winter crate --- worlds/mm_recomp/NormalRules.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/worlds/mm_recomp/NormalRules.py b/worlds/mm_recomp/NormalRules.py index f9b20b94..feaa10e1 100644 --- a/worlds/mm_recomp/NormalRules.py +++ b/worlds/mm_recomp/NormalRules.py @@ -16311,7 +16311,11 @@ def get_location_rules(player, options): # Goron Village "Goron Village Keg Goron Crate (1)": - lambda state: can_use_fire_arrows(state,player), + lambda state: can_use_fire_arrows(state,player) and + ( + state.has("Goron Mask", player) or + can_warp_out(state, player, options) + ), "Goron Village Keg Goron Crate (Spring) (1)": lambda state: can_clear_snowhead(state, player), From 533f42e9bc269f75c0e97b44fdf12a614d5c6be0 Mon Sep 17 00:00:00 2001 From: VincentsSin Date: Sun, 25 Jan 2026 05:08:17 -0600 Subject: [PATCH 05/11] Add Deku employee soul to flower logic To make consistent w/ playground rupee logic. --- worlds/mm_recomp/NormalRules.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/worlds/mm_recomp/NormalRules.py b/worlds/mm_recomp/NormalRules.py index feaa10e1..3a29bbfe 100644 --- a/worlds/mm_recomp/NormalRules.py +++ b/worlds/mm_recomp/NormalRules.py @@ -19198,48 +19198,56 @@ def get_location_rules(player, options): "North Clock Town Deku Playground Flower (1)": lambda state: ( has_soul_absurd(state, player, options, "Grottos") and + has_soul_npc(state, player, options, "Deku Playground Employee") and has_soul_absurd(state, player, options, "Deku Flowers") and state.has("Deku Mask", player) ), "North Clock Town Deku Playground Flower (2)": lambda state: ( has_soul_absurd(state, player, options, "Grottos") and + has_soul_npc(state, player, options, "Deku Playground Employee") and has_soul_absurd(state, player, options, "Deku Flowers") and state.has("Deku Mask", player) ), "North Clock Town Deku Playground Flower (3)": lambda state: ( has_soul_absurd(state, player, options, "Grottos") and + has_soul_npc(state, player, options, "Deku Playground Employee") and has_soul_absurd(state, player, options, "Deku Flowers") and state.has("Deku Mask", player) ), "North Clock Town Deku Playground Flower (4)": lambda state: ( has_soul_absurd(state, player, options, "Grottos") and + has_soul_npc(state, player, options, "Deku Playground Employee") and has_soul_absurd(state, player, options, "Deku Flowers") and state.has("Deku Mask", player) ), "North Clock Town Deku Playground Flower (5)": lambda state: ( has_soul_absurd(state, player, options, "Grottos") and + has_soul_npc(state, player, options, "Deku Playground Employee") and has_soul_absurd(state, player, options, "Deku Flowers") and state.has("Deku Mask", player) ), "North Clock Town Deku Playground Flower (6)": lambda state: ( has_soul_absurd(state, player, options, "Grottos") and + has_soul_npc(state, player, options, "Deku Playground Employee") and has_soul_absurd(state, player, options, "Deku Flowers") and state.has("Deku Mask", player) ), "North Clock Town Deku Playground Flower (7)": lambda state: ( has_soul_absurd(state, player, options, "Grottos") and + has_soul_npc(state, player, options, "Deku Playground Employee") and has_soul_absurd(state, player, options, "Deku Flowers") and state.has("Deku Mask", player) ), "North Clock Town Deku Playground Flower (8)": lambda state: ( has_soul_absurd(state, player, options, "Grottos") and + has_soul_npc(state, player, options, "Deku Playground Employee") and has_soul_absurd(state, player, options, "Deku Flowers") and state.has("Deku Mask", player) ), From b47647f0a504bc9f37c95749db885040d8287490 Mon Sep 17 00:00:00 2001 From: VincentsSin Date: Sun, 25 Jan 2026 21:09:26 -0600 Subject: [PATCH 06/11] Add missing grass in Ikana Castle --- worlds/mm_recomp/Locations.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/worlds/mm_recomp/Locations.py b/worlds/mm_recomp/Locations.py index 404bc87d..4929c9b5 100644 --- a/worlds/mm_recomp/Locations.py +++ b/worlds/mm_recomp/Locations.py @@ -6743,7 +6743,12 @@ def can_create_heart_location(shp, c_or_p, loc_index): ), # Ikana Castle Grass - + + "Ikana Castle Grass (0)": MMRLocationData( + region="Ikana Castle", + address=0x3469420121D00, + can_create=lambda options: options.grasssanity.value + ), "Ikana Castle Grass (1)": MMRLocationData( region="Ikana Castle", address=0x3469420121D0B, From cbe6292b7939e025095cb2eec0ea3d841b5233c1 Mon Sep 17 00:00:00 2001 From: VincentsSin Date: Mon, 26 Jan 2026 20:54:03 -0600 Subject: [PATCH 07/11] Update ISTT Pre-Boss Rupees 4 were missing Zora Mask requirement --- worlds/mm_recomp/NormalRules.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/worlds/mm_recomp/NormalRules.py b/worlds/mm_recomp/NormalRules.py index 3a29bbfe..7302c3d6 100644 --- a/worlds/mm_recomp/NormalRules.py +++ b/worlds/mm_recomp/NormalRules.py @@ -14792,13 +14792,25 @@ def get_location_rules(player, options): state.has("Zora Mask", player) ), "Inverted Stone Tower Pre Boss Rupees (5)": - lambda state: state.can_reach("Stone Tower Temple Inverted Eyegore Chest", "Location", player), + lambda state: ( + state.can_reach("Stone Tower Temple Inverted Eyegore Chest", "Location", player) and + state.has("Zora Mask", player) + ), "Inverted Stone Tower Pre Boss Rupees (6)": - lambda state: state.can_reach("Stone Tower Temple Inverted Eyegore Chest", "Location", player), + lambda state: ( + state.can_reach("Stone Tower Temple Inverted Eyegore Chest", "Location", player) and + state.has("Zora Mask", player) + ), "Inverted Stone Tower Pre Boss Rupees (7)": - lambda state: state.can_reach("Stone Tower Temple Inverted Eyegore Chest", "Location", player), + lambda state: ( + state.can_reach("Stone Tower Temple Inverted Eyegore Chest", "Location", player) and + state.has("Zora Mask", player) + ), "Inverted Stone Tower Pre Boss Rupees (8)": - lambda state: state.can_reach("Stone Tower Temple Inverted Eyegore Chest", "Location", player), + lambda state: ( + state.can_reach("Stone Tower Temple Inverted Eyegore Chest", "Location", player) and + state.has("Zora Mask", player) + ), "Inverted Stone Tower Pre Boss Rupees (9)": lambda state: ( state.can_reach("Stone Tower Temple Inverted Eyegore Chest", "Location", player) and From ede2804581b1c314480621abbf98f4c8c9539bd6 Mon Sep 17 00:00:00 2001 From: VincentsSin Date: Tue, 27 Jan 2026 00:20:50 -0600 Subject: [PATCH 08/11] Add missing pot in springtime mountain village The one on the smithy roof --- worlds/mm_recomp/Locations.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/worlds/mm_recomp/Locations.py b/worlds/mm_recomp/Locations.py index 4929c9b5..7089645c 100644 --- a/worlds/mm_recomp/Locations.py +++ b/worlds/mm_recomp/Locations.py @@ -7754,6 +7754,11 @@ def can_create_heart_location(shp, c_or_p, loc_index): address=0x3469420205000, can_create=lambda options: options.potsanity.value ), + "Mountain Village Spring Rooftop Pot": MMRLocationData( + region="Mountain Village", + address=0x3469420205A00, + can_create=lambda options: options.potsanity.value + ), "Mountain Village Pots (1)": MMRLocationData( region="Mountain Village", address=0x34694202050F0, From 87bdf161b8810fb261458444f8534ab8a35f84b6 Mon Sep 17 00:00:00 2001 From: VincentsSin Date: Tue, 27 Jan 2026 00:31:03 -0600 Subject: [PATCH 09/11] Update NormalRules.py Added missing pot in spring mountain village --- worlds/mm_recomp/NormalRules.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/worlds/mm_recomp/NormalRules.py b/worlds/mm_recomp/NormalRules.py index 7302c3d6..cfbb33c7 100644 --- a/worlds/mm_recomp/NormalRules.py +++ b/worlds/mm_recomp/NormalRules.py @@ -9416,6 +9416,12 @@ def get_location_rules(player, options): has_soul_absurd(state, player, options, "Pots") and has_hard_projectiles(state, player) ), + "Mountain Village Spring Rooftop Pot": + lambda state: ( + can_clear_snowhead(state, player) and + has_soul_absurd(state, player, options, "Pots") and + has_hard_projectiles(state, player) + ), "Mountain Village Pots (1)": lambda state: has_soul_absurd(state, player, options, "Pots"), "Mountain Village Pots (2)": From 18dfc9ef79e5c388fbd4b549986179595fc31b78 Mon Sep 17 00:00:00 2001 From: VincentsSin Date: Tue, 27 Jan 2026 01:23:42 -0600 Subject: [PATCH 10/11] Adjusted trees on Path to Snowhead The 3 at the top were looking for village access rather than Snowhead. --- worlds/mm_recomp/NormalRules.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/worlds/mm_recomp/NormalRules.py b/worlds/mm_recomp/NormalRules.py index cfbb33c7..8fdf8ca5 100644 --- a/worlds/mm_recomp/NormalRules.py +++ b/worlds/mm_recomp/NormalRules.py @@ -18659,22 +18659,22 @@ def get_location_rules(player, options): "Path To Snowhead Tree (1)": lambda state: ( has_soul_absurd(state, player, options, "Trees & Bushes") and - state.can_reach("Mountain Village", 'Region', player) + state.can_reach("Snowhead", 'Region', player) ), "Path To Snowhead Tree (2)": lambda state: ( has_soul_absurd(state, player, options, "Trees & Bushes") and - state.can_reach("Mountain Village", 'Region', player) + state.can_reach("Snowhead", 'Region', player) ), "Path To Snowhead Tree (3)": lambda state: ( has_soul_absurd(state, player, options, "Trees & Bushes") and - state.can_reach("Mountain Village", 'Region', player) + state.can_reach("Snowhead", 'Region', player) ), "Path To Snowhead Tree Near Ledge": lambda.state: ( has_soul_absurd(state, player, options, "Trees & Bushes") and - can_clear_snowhead(state, player) + state.can_reach("Mountain Village", 'Region', player) ), # Goron Racetrack - From 39c8fbf662fade475820993e5184d288cd2b6dae Mon Sep 17 00:00:00 2001 From: VincentsSin Date: Tue, 27 Jan 2026 01:24:40 -0600 Subject: [PATCH 11/11] Add missing spring village sign --- worlds/mm_recomp/Locations.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/worlds/mm_recomp/Locations.py b/worlds/mm_recomp/Locations.py index 7089645c..7f70858d 100644 --- a/worlds/mm_recomp/Locations.py +++ b/worlds/mm_recomp/Locations.py @@ -16944,6 +16944,11 @@ def can_create_heart_location(shp, c_or_p, loc_index): address=0x3469420310315, can_create=lambda options: options.signsanity.value ), + "Mountain Village Pond Sring Cut the Sign": MMRLocationData( + region="Mountain Village", + address=0x3469420310318, + can_create=lambda options: options.signsanity.value + ), "Mountain Village Twin Island Entrance Cut the Sign": MMRLocationData( region="Mountain Village", address=0x3469420310313,