From e345f253661e3f74de428b890095c7f1ca717d2c Mon Sep 17 00:00:00 2001 From: TheLynk Date: Sat, 24 May 2025 21:41:03 +0200 Subject: [PATCH] Add OCARINA ITEMS GLITCH DARUNIAS_CHAMBER And Fix Crash --- .../location_access/overworld/castle_grounds.cpp | 4 ++-- .../overworld/death_mountain_crater.cpp | 2 +- .../location_access/overworld/death_mountain_trail.cpp | 2 +- .../location_access/overworld/desert_colossus.cpp | 2 +- .../location_access/overworld/goron_city.cpp | 2 +- .../location_access/overworld/zoras_fountain.cpp | 2 +- .../location_access/overworld/zoras_river.cpp | 2 +- soh/soh/Enhancements/randomizer/logic.cpp | 10 +++++----- soh/soh/Enhancements/randomizer/logic.h | 4 ++-- soh/soh/Enhancements/randomizer/randomizerTypes.h | 1 + soh/soh/Enhancements/randomizer/settings.cpp | 2 ++ 11 files changed, 18 insertions(+), 15 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp index c8bf879e0..c8c381bef 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp @@ -50,7 +50,7 @@ void RegionTable_Init_CastleGrounds() { areaTable[RR_HC_GREAT_FAIRY_FOUNTAIN] = Region("HC Great Fairy Fountain", "HC Great Fairy Fountain", {}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_HC_GREAT_FAIRY_REWARD, (logic->CanUse(RG_ZELDAS_LULLABY) || (ctx->GetTrickOption(RT_OCARINA_ITEMS_GLITCH_GREAT_FAIRY) && logic->OcarinaItemGlitchZeldasLullaby()))), + LOCATION(RC_HC_GREAT_FAIRY_REWARD, (logic->CanUse(RG_ZELDAS_LULLABY) || (ctx->GetTrickOption(RT_OCARINA_ITEMS_GLITCH_GREAT_FAIRY) && logic->OcarinaItemsGlitchZeldasLullaby()))), }, { //Exits Entrance(RR_CASTLE_GROUNDS, []{return true;}), @@ -100,7 +100,7 @@ void RegionTable_Init_CastleGrounds() { areaTable[RR_OGC_GREAT_FAIRY_FOUNTAIN] = Region("OGC Great Fairy Fountain", "OGC Great Fairy Fountain", {}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_OGC_GREAT_FAIRY_REWARD, (logic->CanUse(RG_ZELDAS_LULLABY) || (ctx->GetTrickOption(RT_OCARINA_ITEMS_GLITCH_GREAT_FAIRY) && logic->OcarinaItemGlitchZeldasLullaby()))), + LOCATION(RC_OGC_GREAT_FAIRY_REWARD, (logic->CanUse(RG_ZELDAS_LULLABY) || (ctx->GetTrickOption(RT_OCARINA_ITEMS_GLITCH_GREAT_FAIRY) && logic->OcarinaItemsGlitchZeldasLullaby()))), }, { //Exits Entrance(RR_CASTLE_GROUNDS, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp index d332e9fa9..ad70bbe5e 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp @@ -101,7 +101,7 @@ void RegionTable_Init_DeathMountainCrater() { areaTable[RR_DMC_GREAT_FAIRY_FOUNTAIN] = Region("DMC Great Fairy Fountain", "DMC Great Fairy Fountain", {}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_DMC_GREAT_FAIRY_REWARD, (logic->CanUse(RG_ZELDAS_LULLABY) || (ctx->GetTrickOption(RT_OCARINA_ITEMS_GLITCH_GREAT_FAIRY) && logic->OcarinaItemGlitchZeldasLullaby()))), + LOCATION(RC_DMC_GREAT_FAIRY_REWARD, (logic->CanUse(RG_ZELDAS_LULLABY) || (ctx->GetTrickOption(RT_OCARINA_ITEMS_GLITCH_GREAT_FAIRY) && logic->OcarinaItemsGlitchZeldasLullaby()))), }, { //Exits Entrance(RR_DMC_LOWER_LOCAL, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp index b34972e8e..cda269d9b 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp @@ -100,7 +100,7 @@ void RegionTable_Init_DeathMountainTrail() { areaTable[RR_DMT_GREAT_FAIRY_FOUNTAIN] = Region("DMT Great Fairy Fountain", "DMT Great Fairy Fountain", {}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_DMT_GREAT_FAIRY_REWARD, (logic->CanUse(RG_ZELDAS_LULLABY) || (ctx->GetTrickOption(RT_OCARINA_ITEMS_GLITCH_GREAT_FAIRY) && logic->OcarinaItemGlitchZeldasLullaby()))), + LOCATION(RC_DMT_GREAT_FAIRY_REWARD, (logic->CanUse(RG_ZELDAS_LULLABY) || (ctx->GetTrickOption(RT_OCARINA_ITEMS_GLITCH_GREAT_FAIRY) && logic->OcarinaItemsGlitchZeldasLullaby()))), }, { //Exits Entrance(RR_DEATH_MOUNTAIN_SUMMIT, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/desert_colossus.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/desert_colossus.cpp index bc586aa8b..ad7b41728 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/desert_colossus.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/desert_colossus.cpp @@ -60,7 +60,7 @@ void RegionTable_Init_DesertColossus() { areaTable[RR_COLOSSUS_GREAT_FAIRY_FOUNTAIN] = Region("Colossus Great Fairy Fountain", "Colossus Great Fairy Fountain", {}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_COLOSSUS_GREAT_FAIRY_REWARD, (logic->CanUse(RG_ZELDAS_LULLABY) || (ctx->GetTrickOption(RT_OCARINA_ITEMS_GLITCH_GREAT_FAIRY) && logic->OcarinaItemGlitchZeldasLullaby()))), + LOCATION(RC_COLOSSUS_GREAT_FAIRY_REWARD, (logic->CanUse(RG_ZELDAS_LULLABY) || (ctx->GetTrickOption(RT_OCARINA_ITEMS_GLITCH_GREAT_FAIRY) && logic->OcarinaItemsGlitchZeldasLullaby()))), }, { //Exits Entrance(RR_DESERT_COLOSSUS, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp index 21daeaf21..8566610d6 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp @@ -41,7 +41,7 @@ void RegionTable_Init_GoronCity() { Entrance(RR_GC_MEDIGORON, []{return logic->CanBreakMudWalls() || logic->HasItem(RG_GORONS_BRACELET);}), Entrance(RR_GC_WOODS_WARP, []{return logic->GCWoodsWarpOpen;}), Entrance(RR_GC_SHOP, []{return (logic->IsAdult && logic->StopGCRollingGoronAsAdult) || (logic->IsChild && (logic->BlastOrSmash() || logic->HasItem(RG_GORONS_BRACELET) || logic->GoronCityChildFire || logic->CanUse(RG_FAIRY_BOW)));}), - Entrance(RR_GC_DARUNIAS_CHAMBER, []{return (logic->IsAdult && logic->StopGCRollingGoronAsAdult) || (logic->IsChild && logic->GCDaruniasDoorOpenChild);}), + Entrance(RR_GC_DARUNIAS_CHAMBER, []{return (logic->IsAdult && logic->StopGCRollingGoronAsAdult) || (logic->IsChild && (logic->GCDaruniasDoorOpenChild || (ctx->GetTrickOption(RT_GC_OCARINA_ITEMS_GLITCH_DARUNIAS_CHAMBER) && logic->OcarinaItemsGlitchZeldasLullaby())));}), Entrance(RR_GC_GROTTO_PLATFORM, []{return logic->IsAdult && ((logic->CanUse(RG_SONG_OF_TIME) && ((logic->EffectiveHealth() > 2) || logic->CanUse(RG_GORON_TUNIC) || logic->CanUse(RG_LONGSHOT) || logic->CanUse(RG_NAYRUS_LOVE))) || (logic->EffectiveHealth() > 1 && logic->CanUse(RG_GORON_TUNIC) && logic->CanUse(RG_HOOKSHOT)) || (logic->CanUse(RG_NAYRUS_LOVE) && logic->CanUse(RG_HOOKSHOT)) || (logic->EffectiveHealth() > 2 && logic->CanUse(RG_HOOKSHOT) && ctx->GetTrickOption(RT_GC_GROTTO)));}), }); diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp index 2f3e39b13..9f4998d43 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp @@ -112,7 +112,7 @@ void RegionTable_Init_ZorasFountain() { areaTable[RR_ZF_GREAT_FAIRY_FOUNTAIN] = Region("ZF Great Fairy Fountain", "ZF Great Fairy Fountain", {}, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_ZF_GREAT_FAIRY_REWARD, (logic->CanUse(RG_ZELDAS_LULLABY) || (ctx->GetTrickOption(RT_OCARINA_ITEMS_GLITCH_GREAT_FAIRY) && logic->OcarinaItemGlitchZeldasLullaby()))), + LOCATION(RC_ZF_GREAT_FAIRY_REWARD, (logic->CanUse(RG_ZELDAS_LULLABY) || (ctx->GetTrickOption(RT_OCARINA_ITEMS_GLITCH_GREAT_FAIRY) && logic->OcarinaItemsGlitchZeldasLullaby()))), }, { //Exits Entrance(RR_ZORAS_FOUNTAIN, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp index da4dbc99d..91a06d142 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp @@ -68,7 +68,7 @@ void RegionTable_Init_ZoraRiver() { Entrance(RR_ZR_FAIRY_GROTTO, []{return Here(RR_ZORAS_RIVER, []{return logic->BlastOrSmash();});}), Entrance(RR_THE_LOST_WOODS, []{return logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS);}), Entrance(RR_ZR_STORMS_GROTTO, []{return logic->CanOpenStormsGrotto();}), - Entrance(RR_ZR_BEHIND_WATERFALL, []{return ctx->GetOption(RSK_SLEEPING_WATERFALL).Is(RO_WATERFALL_OPEN) || Here(RR_ZORAS_RIVER, []{return logic->CanUse(RG_ZELDAS_LULLABY);}) || (logic->IsChild && ctx->GetTrickOption(RT_ZR_CUCCO)) || (logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS) && ctx->GetTrickOption(RT_ZR_HOVERS)) || (ctx->GetTrickOption(RT_ZR_OCARINA_ITEMS_GLITCH_WATERFALL) && logic->OcarinaItemGlitchZeldasLullaby());}), + Entrance(RR_ZR_BEHIND_WATERFALL, []{return ctx->GetOption(RSK_SLEEPING_WATERFALL).Is(RO_WATERFALL_OPEN) || Here(RR_ZORAS_RIVER, []{return logic->CanUse(RG_ZELDAS_LULLABY);}) || (logic->IsChild && ctx->GetTrickOption(RT_ZR_CUCCO)) || (logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS) && ctx->GetTrickOption(RT_ZR_HOVERS)) || (ctx->GetTrickOption(RT_ZR_OCARINA_ITEMS_GLITCH_WATERFALL) && logic->OcarinaItemsGlitchZeldasLullaby());}), }); areaTable[RR_ZR_BEHIND_WATERFALL] = Region("ZR Behind Waterfall", "Zora River", {RA_ZORAS_RIVER}, DAY_NIGHT_CYCLE, {}, {}, { diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index b151e0bf6..fa193f70c 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -1042,16 +1042,16 @@ uint8_t Logic::OcarinaButtons() { bool Logic::HasBottle() { return BottleCount() >= 1; } - -bool Logic::OcarinaItemGlitch() { +//It is logical allows you to manage just the logic of the glitch without any song or ocarina touch +bool Logic::OcarinaItemsGlitch() { return ((CanUse(RG_BOTTLE_WITH_BUGS) || CanUse(RG_BOTTLE_WITH_FISH)) && (CanUseSword() || CanUse(RG_STICKS) || CanUse(RG_NUTS) || CanUse(RG_BOMB_BAG) || CanUse(RG_FAIRY_BOW) || - CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOMBCHU_BAG) || CanUse(RG_HOOKSHOT) || CanUse(RG_LONGSHOT) || + CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOMBCHU_5) || CanUse(RG_HOOKSHOT) || CanUse(RG_LONGSHOT) || CanUse(RG_BOOMERANG) || CanUse(RG_MEGATON_HAMMER))); } -bool Logic::OcarinaItemGlitchZeldasLullaby() { - return OcarinaItemGlitch() && HasItem(RG_ZELDAS_LULLABY) && HasItem(RG_OCARINA_C_LEFT_BUTTON) && +bool Logic::OcarinaItemsGlitchZeldasLullaby() { + return OcarinaItemsGlitch() && HasItem(RG_ZELDAS_LULLABY) && HasItem(RG_OCARINA_C_LEFT_BUTTON) && HasItem(RG_OCARINA_C_RIGHT_BUTTON) && HasItem(RG_OCARINA_C_UP_BUTTON); } diff --git a/soh/soh/Enhancements/randomizer/logic.h b/soh/soh/Enhancements/randomizer/logic.h index 3ad4cd0ff..249437f91 100644 --- a/soh/soh/Enhancements/randomizer/logic.h +++ b/soh/soh/Enhancements/randomizer/logic.h @@ -203,8 +203,8 @@ class Logic { uint8_t BottleCount(); uint8_t OcarinaButtons(); bool HasBottle(); - bool OcarinaItemGlitch(); - bool OcarinaItemGlitchZeldasLullaby(); + bool OcarinaItemsGlitch(); + bool OcarinaItemsGlitchZeldasLullaby(); bool CanUseSword(); bool CanJumpslashExceptHammer(); bool CanJumpslash(); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 612eb311c..6188b7f48 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -3520,6 +3520,7 @@ typedef enum { RT_GC_LEFTMOST, RT_GC_GROTTO, RT_GC_LINK_GORON_DINS, + RT_GC_OCARINA_ITEMS_GLITCH_DARUNIAS_CHAMBER, RT_DMC_HOVER_BEAN_POH, RT_DMC_BOLERO_JUMP, RT_DMC_BOULDER_JS, diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 060c9c185..7c0469708 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -520,6 +520,8 @@ void Settings::CreateOptions() { "taking damage from the lava floor."); OPT_TRICK(RT_GC_LINK_GORON_DINS, RCQUEST_BOTH, RA_GORON_CITY, { Tricks::Tag::NOVICE }, "Stop Link the Goron with Din\'s Fire", "The timing is quite awkward."); + OPT_TRICK(RT_GC_OCARINA_ITEMS_GLITCH_DARUNIAS_CHAMBER, RCQUEST_BOTH, RA_GORON_CITY, { Tricks::Tag::NOVICE }, + "Open Darunia\'s Chamber with Ocarina Items Glitch", "With the Ocarina Items Glitch allows you to open the Darunia\'s Chamber."); OPT_TRICK(RT_DMC_HOVER_BEAN_POH, RCQUEST_BOTH, RA_DEATH_MOUNTAIN_CRATER, { Tricks::Tag::NOVICE }, "Crater\'s Bean PoH with Hover Boots", "Hover from the base of the bridge near Goron City and walk up the very steep slope.");