From 317d739dbe1fd0146dc8d31330c00beebdb3cfcc Mon Sep 17 00:00:00 2001 From: serprex <159546+serprex@users.noreply.github.com> Date: Sat, 5 Sep 2026 02:22:02 +0000 Subject: [PATCH 1/2] Fix logic around for fire near boss Adult with hood can jump from cage to boss door to upper with hood, reaching pots under 16s Also fix bunny / mask options being disabled outside rando file --- .../randomizer/location_access/dungeons/fire_temple.cpp | 8 ++++---- soh/soh/SohGui/SohMenuEnhancements.cpp | 5 +++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp index cb1046c1df7..fa0f34154c6 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp @@ -32,9 +32,9 @@ void RegionTable_Init_FireTemple() { //and I've only been able to get the nearest 2, regardless it's a trick and probably a specific one like GY crate freestanding with rang }, { //Exits - ENTRANCE(RR_FIRE_TEMPLE_FOYER, (logic->IsAdult || logic->CanUse(RG_HOVER_BOOTS) || (logic->BunnyHood() && logic->Get(LOGIC_FIRE_HIT_PLATFORM))) && (logic->FireTimer() >= 16 || (logic->Get(LOGIC_FIRE_HIT_PLATFORM) && logic->FireTimer() >= 8))), - ENTRANCE(RR_FIRE_TEMPLE_NEAR_BOSS_UPPER, logic->IsAdult && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS)) && logic->FireTimer() >= 16), - ENTRANCE(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, logic->FireTimer() >= 16 && (logic->CanUse(RG_HOVER_BOOTS) || (logic->BunnyHood() && logic->Get(LOGIC_FIRE_HIT_PLATFORM)) || (logic->IsAdult && (ctx->GetTrickOption(RT_UNINTUITIVE_JUMPS) || logic->Get(LOGIC_FIRE_HIT_PLATFORM))))), + ENTRANCE(RR_FIRE_TEMPLE_FOYER, true), + ENTRANCE(RR_FIRE_TEMPLE_NEAR_BOSS_UPPER, logic->IsAdult && ((logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS) || logic->BunnyHood()) && logic->FireTimer() >= 16)), + ENTRANCE(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, logic->FireTimer() >= 16 && (logic->CanUse(RG_HOVER_BOOTS) || (logic->Get(LOGIC_FIRE_HIT_PLATFORM) && logic->BunnyHood()) || (logic->IsAdult && (ctx->GetTrickOption(RT_UNINTUITIVE_JUMPS) || logic->BunnyHood() || logic->Get(LOGIC_FIRE_HIT_PLATFORM))))), }); //This region assumes tunic logic is handled on entry. @@ -575,7 +575,7 @@ void RegionTable_Init_FireTemple() { LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, logic->FireTimer() >= 24 && logic->CanBreakCrates()), }, { //Exits - ENTRANCE(RR_FIRE_TEMPLE_MQ_FOYER_UPPER, (logic->IsAdult || logic->CanUse(RG_HOVER_BOOTS) || (logic->Get(LOGIC_FIRE_HIT_PLATFORM) && logic->BunnyHood())) && (logic->FireTimer() >= 16 || (logic->Get(LOGIC_FIRE_HIT_PLATFORM) && logic->FireTimer() >= 8))), + ENTRANCE(RR_FIRE_TEMPLE_MQ_FOYER_UPPER, true), ENTRANCE(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_TARGET, logic->FireTimer() >= 32 && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && logic->BunnyHood()))), ENTRANCE(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, logic->FireTimer() >= 16 && (logic->CanUse(RG_HOVER_BOOTS) || (logic->Get(LOGIC_FIRE_HIT_PLATFORM) && logic->BunnyHood()) || (logic->IsAdult && (ctx->GetTrickOption(RT_UNINTUITIVE_JUMPS) || logic->BunnyHood() || logic->Get(LOGIC_FIRE_HIT_PLATFORM))))), }); diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index 52a93c2777c..a09edfc2324 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -991,7 +991,8 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Bunny Hood Effect", WIDGET_CVAR_COMBOBOX) .CVar(CVAR_BUNNY_HOOD_NAME) .PreFunc([](WidgetInfo& info) { - info.options->disabled = OTRGlobals::Instance->gRandoContext->GetOption(RSK_BUNNY_HOOD).Is(RO_GENERIC_ON); + info.options->disabled = + IS_RANDO && OTRGlobals::Instance->gRandoContext->GetOption(RSK_BUNNY_HOOD).Is(RO_GENERIC_ON); info.options->disabledTooltip = "This setting is forcefully enabled because a randomized savefile with " "\"Bunny Hood Effect\" is currently loaded."; }) @@ -1006,7 +1007,7 @@ void SohMenu::AddMenuEnhancements() { .CVar(CVAR_ADULT_MASKS_NAME) .PreFunc([](WidgetInfo& info) { info.options->disabled = - OTRGlobals::Instance->gRandoContext->GetOption(RSK_MASKS_AS_ADULT).Is(RO_GENERIC_ON); + IS_RANDO && OTRGlobals::Instance->gRandoContext->GetOption(RSK_MASKS_AS_ADULT).Is(RO_GENERIC_ON); info.options->disabledTooltip = "This setting is forcefully enabled because a randomized savefile with " "\"Masks as Adult\" is currently loaded."; }) From 82f75569c1a08b5e118c53b61c925c2a2b5a9af4 Mon Sep 17 00:00:00 2001 From: serprex <159546+serprex@users.noreply.github.com> Date: Sun, 6 Sep 2026 22:28:53 +0000 Subject: [PATCH 2/2] split out NEAR_BOSS_PILLAR / NEAR_BOSS_DOOR --- .../location_access/dungeons/fire_temple.cpp | 57 +++++++++++++++---- .../randomizerEnums/RandomizerRegion.h | 4 ++ 2 files changed, 49 insertions(+), 12 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp index fa0f34154c6..1e8d2af1c2c 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp @@ -32,9 +32,24 @@ void RegionTable_Init_FireTemple() { //and I've only been able to get the nearest 2, regardless it's a trick and probably a specific one like GY crate freestanding with rang }, { //Exits - ENTRANCE(RR_FIRE_TEMPLE_FOYER, true), - ENTRANCE(RR_FIRE_TEMPLE_NEAR_BOSS_UPPER, logic->IsAdult && ((logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS) || logic->BunnyHood()) && logic->FireTimer() >= 16)), - ENTRANCE(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, logic->FireTimer() >= 16 && (logic->CanUse(RG_HOVER_BOOTS) || (logic->Get(LOGIC_FIRE_HIT_PLATFORM) && logic->BunnyHood()) || (logic->IsAdult && (ctx->GetTrickOption(RT_UNINTUITIVE_JUMPS) || logic->BunnyHood() || logic->Get(LOGIC_FIRE_HIT_PLATFORM))))), + ENTRANCE(RR_FIRE_TEMPLE_FOYER, true), + ENTRANCE(RR_FIRE_TEMPLE_NEAR_BOSS_PILLAR, logic->FireTimer() >= 8 && logic->Get(LOGIC_FIRE_HIT_PLATFORM)), + ENTRANCE(RR_FIRE_TEMPLE_NEAR_BOSS_UPPER, logic->FireTimer() >= 16 && logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS)), + ENTRANCE(RR_FIRE_TEMPLE_NEAR_BOSS_DOOR, logic->FireTimer() >= 16 && (logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && (ctx->GetTrickOption(RT_UNINTUITIVE_JUMPS) || logic->BunnyHood())))), + }); + + areaTable[RR_FIRE_TEMPLE_NEAR_BOSS_PILLAR] = Region("Fire Temple Near Boss Pillar", SCENE_FIRE_TEMPLE, {}, {}, { + //Exits + ENTRANCE(RR_FIRE_TEMPLE_NEAR_BOSS_ROOM, logic->FireTimer() >= 8), + ENTRANCE(RR_FIRE_TEMPLE_NEAR_BOSS_UPPER, logic->FireTimer() >= 8 && logic->CanUse(RG_LONGSHOT)), + ENTRANCE(RR_FIRE_TEMPLE_NEAR_BOSS_DOOR, logic->FireTimer() >= 8 && (logic->IsAdult || logic->BunnyHood() || logic->CanUse(RG_HOVER_BOOTS))), + }); + + areaTable[RR_FIRE_TEMPLE_NEAR_BOSS_DOOR] = Region("Fire Temple Near Boss Door", SCENE_FIRE_TEMPLE, {}, {}, { + //Exits + ENTRANCE(RR_FIRE_TEMPLE_NEAR_BOSS_ROOM, logic->FireTimer() >= 8 && (logic->IsAdult || logic->CanUse(RG_HOVER_BOOTS))), + ENTRANCE(RR_FIRE_TEMPLE_NEAR_BOSS_UPPER, logic->FireTimer() >= 8 && logic->CanUse(RG_HOOKSHOT)), + ENTRANCE(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, true), }); //This region assumes tunic logic is handled on entry. @@ -331,8 +346,8 @@ void RegionTable_Init_FireTemple() { LOCATION(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4, logic->CanBreakPots()), }, { //Exits - //Accounting for either air-drifting to the platform you want and taking fall damage or landing on the platform and jumping off - ENTRANCE(RR_FIRE_TEMPLE_NEAR_BOSS_ROOM, logic->Get(LOGIC_FIRE_HIT_PLATFORM) && (logic->IsAdult || logic->CanUse(RG_HOVER_BOOTS) || logic->TakeDamage() || logic->BunnyHood())), + ENTRANCE(RR_FIRE_TEMPLE_NEAR_BOSS_PILLAR, logic->Get(LOGIC_FIRE_HIT_PLATFORM)), + ENTRANCE(RR_FIRE_TEMPLE_NEAR_BOSS_DOOR, logic->Get(LOGIC_FIRE_HIT_PLATFORM) && logic->FireTimer() >= 8 && logic->TakeDamage()), // sidehop towards boss door ENTRANCE(RR_FIRE_TEMPLE_CORRIDOR, true), ENTRANCE(RR_FIRE_TEMPLE_FIRE_MAZE_PLATFORMS, logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && (logic->Get(LOGIC_FIRE_HIT_ABOVE_MAZE_PLATFORM) || logic->CanGroundJump() || logic->BunnyHood()))), ENTRANCE(RR_FIRE_TEMPLE_CAGELESS_CHEST_ROOM, true), @@ -576,8 +591,24 @@ void RegionTable_Init_FireTemple() { }, { //Exits ENTRANCE(RR_FIRE_TEMPLE_MQ_FOYER_UPPER, true), - ENTRANCE(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_TARGET, logic->FireTimer() >= 32 && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && logic->BunnyHood()))), - ENTRANCE(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, logic->FireTimer() >= 16 && (logic->CanUse(RG_HOVER_BOOTS) || (logic->Get(LOGIC_FIRE_HIT_PLATFORM) && logic->BunnyHood()) || (logic->IsAdult && (ctx->GetTrickOption(RT_UNINTUITIVE_JUMPS) || logic->BunnyHood() || logic->Get(LOGIC_FIRE_HIT_PLATFORM))))), + ENTRANCE(RR_FIRE_TEMPLE_NEAR_BOSS_PILLAR, logic->FireTimer() >= 8 && logic->Get(LOGIC_FIRE_HIT_PLATFORM)), + ENTRANCE(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_TARGET, logic->FireTimer() >= 32 && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS))), + ENTRANCE(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_DOOR, logic->FireTimer() >= 16 && (logic->CanUse(RG_HOVER_BOOTS) || (logic->Get(LOGIC_FIRE_HIT_PLATFORM) && logic->BunnyHood()) || (logic->IsAdult && (ctx->GetTrickOption(RT_UNINTUITIVE_JUMPS) || logic->BunnyHood())))), + }); + + areaTable[RR_FIRE_TEMPLE_NEAR_BOSS_PILLAR] = Region("Fire Temple Near Boss Pillar", SCENE_FIRE_TEMPLE, {}, {}, { + //Exits + ENTRANCE(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM, logic->FireTimer() >= 8), + ENTRANCE(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_TARGET, logic->FireTimer() >= 8 && logic->CanUse(RG_LONGSHOT)), + ENTRANCE(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_DOOR, logic->FireTimer() >= 8 && (logic->IsAdult || logic->BunnyHood() || logic->CanUse(RG_HOVER_BOOTS))), + }); + + areaTable[RR_FIRE_TEMPLE_MQ_NEAR_BOSS_DOOR] = Region("Fire Temple MQ Near Boss Door", SCENE_FIRE_TEMPLE, {}, {}, { + //Exits + ENTRANCE(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM, logic->FireTimer() >= 8 && (logic->IsAdult || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS))), + ENTRANCE(RR_FIRE_TEMPLE_NEAR_BOSS_PILLAR, logic->FireTimer() >= 8 && logic->Get(LOGIC_FIRE_HIT_PLATFORM) && (logic->IsAdult || logic->BunnyHood() || logic->CanUse(RG_HOVER_BOOTS))), + ENTRANCE(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_TARGET, logic->FireTimer() >= 8 && logic->CanUse(RG_HOOKSHOT) || (logic->IsAdult && logic->BunnyHood())), + ENTRANCE(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, true), }); //This region assumes tunic logic is handled on entry. @@ -598,8 +629,8 @@ void RegionTable_Init_FireTemple() { LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, logic->CanBreakCrates()), }, { //Exits - ENTRANCE(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM, true), - ENTRANCE(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM_UPPER, logic->IsAdult || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS) || logic->BunnyHood()), + ENTRANCE(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM, logic->IsAdult && logic->TakeDamage()), + ENTRANCE(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM_UPPER, logic->IsAdult || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS) || logic->BunnyHood() || ctx->GetTrickOption(RT_UNINTUITIVE_JUMPS)), }); //This region assumes tunic logic is handled on entry. @@ -612,6 +643,7 @@ void RegionTable_Init_FireTemple() { LOCATION(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, logic->CanBreakCrates()), }, { //Exits + ENTRANCE(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM, true), ENTRANCE(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_TARGET, true), }); @@ -953,7 +985,8 @@ void RegionTable_Init_FireTemple() { LOCATION(RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_EAST_POT, logic->CanBreakPots()), }, { //Exits - ENTRANCE(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM, logic->Get(LOGIC_FIRE_HIT_PLATFORM)), + ENTRANCE(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_PILLAR, logic->Get(LOGIC_FIRE_HIT_PLATFORM)), + ENTRANCE(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_DOOR, logic->Get(LOGIC_FIRE_HIT_PLATFORM) && logic->FireTimer() >= 8 && logic->TakeDamage()), // sidehop towards boss door ENTRANCE(RR_FIRE_TEMPLE_MQ_CORRIDOR, true), ENTRANCE(RR_FIRE_TEMPLE_MQ_FIRE_MAZE_PLATFORMS, logic->IsAdult || logic->CanUse(RG_SONG_OF_TIME) || logic->CanUse(RG_HOVER_BOOTS)), //Hover boots get there via the platforms @@ -1132,8 +1165,8 @@ void RegionTable_Init_FireTemple() { LOCATION(RC_FIRE_BOSS_KEY_HINT, true), }, { // Exits - ENTRANCE(RR_FIRE_TEMPLE_NEAR_BOSS_ROOM, ctx->GetDungeon(FIRE_TEMPLE)->IsVanilla()), - ENTRANCE(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM, ctx->GetDungeon(FIRE_TEMPLE)->IsMQ()), + ENTRANCE(RR_FIRE_TEMPLE_NEAR_BOSS_DOOR, ctx->GetDungeon(FIRE_TEMPLE)->IsVanilla()), + ENTRANCE(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_DOOR, ctx->GetDungeon(FIRE_TEMPLE)->IsMQ()), ENTRANCE(RR_FIRE_TEMPLE_BOSS_ROOM, logic->HasItem(RG_FIRE_TEMPLE_BOSS_KEY)), }); diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerRegion.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerRegion.h index f0bd6aa85dc..44adc396746 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerRegion.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerRegion.h @@ -497,6 +497,8 @@ RANDO_ENUM_ITEM(RR_FOREST_TEMPLE_BOSS_ROOM) RANDO_ENUM_ITEM(RR_FIRE_TEMPLE_FOYER) RANDO_ENUM_ITEM(RR_FIRE_TEMPLE_NEAR_BOSS_ROOM) +RANDO_ENUM_ITEM(RR_FIRE_TEMPLE_NEAR_BOSS_PILLAR) +RANDO_ENUM_ITEM(RR_FIRE_TEMPLE_NEAR_BOSS_DOOR) RANDO_ENUM_ITEM(RR_FIRE_TEMPLE_NEAR_BOSS_UPPER) RANDO_ENUM_ITEM(RR_FIRE_TEMPLE_LOOP_HEXAGON_ROOM) RANDO_ENUM_ITEM(RR_FIRE_TEMPLE_LOOP_5_TILE_ROOM) @@ -555,6 +557,8 @@ RANDO_ENUM_ITEM(RR_FIRE_TEMPLE_MQ_LOOP_FLARE_DANCER) RANDO_ENUM_ITEM(RR_FIRE_TEMPLE_MQ_LOOP_CAGE_SWITCH) RANDO_ENUM_ITEM(RR_FIRE_TEMPLE_MQ_LOOP_GORON_CAGE) RANDO_ENUM_ITEM(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM) +RANDO_ENUM_ITEM(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_PILLAR) +RANDO_ENUM_ITEM(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_DOOR) RANDO_ENUM_ITEM(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_TARGET) RANDO_ENUM_ITEM(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM_UPPER) RANDO_ENUM_ITEM(RR_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM)