diff --git a/soh/soh/Enhancements/randomizer/location_access.cpp b/soh/soh/Enhancements/randomizer/location_access.cpp index a45e27cd0..c89588d0f 100644 --- a/soh/soh/Enhancements/randomizer/location_access.cpp +++ b/soh/soh/Enhancements/randomizer/location_access.cpp @@ -263,7 +263,11 @@ void RegionTable_Init() { areaTable[RR_ROOT] = Region("Root", "", {RA_LINKS_POCKET}, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&logic->KakarikoVillageGateOpen, []{return ctx->GetOption(RSK_KAK_GATE).Is(RO_KAK_GATE_OPEN);}), + EventAccess(&logic->KakarikoVillageGateOpen, []{return ctx->GetOption(RSK_KAK_GATE).Is(RO_KAK_GATE_OPEN);}), + EventAccess(&logic->TH_CouldRescueF1SouthCarpenter, []{return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE);}), + EventAccess(&logic->TH_CouldRescueF2NorthCarpenter, []{return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE);}), + EventAccess(&logic->TH_CouldRescueF2SouthCarpenter, []{return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE);}), + EventAccess(&logic->TH_RescuedAllCarpenters, []{return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE);}), }, { //Locations LOCATION(RC_LINKS_POCKET, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp index 4fe3c6ed5..f3db0c7fe 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp @@ -16,7 +16,7 @@ void RegionTable_Init_GerudoValley() { Entrance(RR_GV_UPPER_STREAM, []{return logic->IsChild || logic->HasItem(RG_BRONZE_SCALE) || logic->TakeDamage();}), Entrance(RR_GV_CRATE_LEDGE, []{return logic->IsChild || logic->CanUse(RG_LONGSHOT);}), Entrance(RR_GV_GROTTO_LEDGE, []{return true;}), - Entrance(RR_GV_FORTRESS_SIDE, []{return (logic->IsAdult && (logic->CanUse(RG_EPONA) || logic->CanUse(RG_LONGSHOT) || ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE) || logic->CanFinishGerudoFortress())) || (logic->IsChild && logic->CanUse(RG_HOOKSHOT));}), + Entrance(RR_GV_FORTRESS_SIDE, []{return (logic->IsAdult && (logic->CanUse(RG_EPONA) || logic->CanUse(RG_LONGSHOT) || ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE) || logic->TH_RescuedAllCarpenters)) || (logic->IsChild && logic->CanUse(RG_HOOKSHOT));}), Entrance(RR_GV_LOWER_STREAM, []{return logic->IsChild;}), //can use cucco as child }); @@ -73,7 +73,7 @@ void RegionTable_Init_GerudoValley() { //Exits Entrance(RR_GF_GROUND_BOTTOM, []{return true;}), Entrance(RR_GV_UPPER_STREAM, []{return true;}), - Entrance(RR_GERUDO_VALLEY, []{return logic->IsChild || logic->CanUse(RG_EPONA) || logic->CanUse(RG_LONGSHOT) || ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE) || logic->CanFinishGerudoFortress();}), + Entrance(RR_GERUDO_VALLEY, []{return logic->IsChild || logic->CanUse(RG_EPONA) || logic->CanUse(RG_LONGSHOT) || ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE) || logic->TH_RescuedAllCarpenters;}), Entrance(RR_GV_CARPENTER_TENT, []{return logic->IsAdult;}), Entrance(RR_GV_STORMS_GROTTO, []{return logic->IsAdult && logic->CanOpenStormsGrotto();}), Entrance(RR_GV_CRATE_LEDGE, []{return ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives();}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/thieves_hideout.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/thieves_hideout.cpp index 5d4fded76..b73b283c1 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/thieves_hideout.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/thieves_hideout.cpp @@ -7,13 +7,14 @@ void RegionTable_Init_ThievesHideout() { areaTable[RR_TH_NORTH_F1_CARPENTER_AREA] = Region("Thieves Hideout North F1 Carpenter Area", "Thieves Hideout", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->TH_CouldRescueF1NorthCarpenter, []{return logic->CanKillEnemy(RE_GERUDO_WARRIOR);}), + EventAccess(&logic->TH_RescuedAllCarpenters, []{return ((ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FAST) && logic->SmallKeys(RR_GF_GROUND_BOTTOM, 1)) || (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) && logic->SmallKeys(RR_GF_GROUND_BOTTOM, 4))) && logic->TH_CouldRescueF1NorthCarpenter && logic->TH_CouldRescueF1SouthCarpenter && logic->TH_CouldRescueF2NorthCarpenter && logic->TH_CouldRescueF2SouthCarpenter;}), }, { //Locations LOCATION(RC_TH_NORTH_F1_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), LOCATION(RC_TH_NORTH_F1_CARPENTER_POT_1, logic->CanBreakPots()), LOCATION(RC_TH_NORTH_F1_CARPENTER_POT_2, logic->CanBreakPots()), LOCATION(RC_TH_NORTH_F1_CARPENTER_POT_3, logic->CanBreakPots()), - LOCATION(RC_TH_GERUDO_MEMBERSHIP_CARD, logic->CanFinishGerudoFortress()), + LOCATION(RC_TH_GERUDO_MEMBERSHIP_CARD, logic->TH_RescuedAllCarpenters), }, { //Exits Entrance(RR_GF_GROUND_RED, []{return true;}), @@ -23,6 +24,7 @@ void RegionTable_Init_ThievesHideout() { areaTable[RR_TH_SOUTH_F1_CARPENTER_AREA] = Region("Thieves Hideout South F1 Carpenter Area", "Thieves Hideout", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->TH_CouldRescueF1SouthCarpenter, []{return logic->CanKillEnemy(RE_GERUDO_WARRIOR);}), + EventAccess(&logic->TH_RescuedAllCarpenters, []{return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) && logic->SmallKeys(RR_GF_GROUND_BOTTOM, 4) && logic->TH_CouldRescueF1NorthCarpenter && logic->TH_CouldRescueF1SouthCarpenter && logic->TH_CouldRescueF2NorthCarpenter && logic->TH_CouldRescueF2SouthCarpenter;}), }, { //Locations LOCATION(RC_TH_SOUTH_F1_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), @@ -33,7 +35,7 @@ void RegionTable_Init_ThievesHideout() { LOCATION(RC_TH_SOUTH_F1_CARPENTER_CELL_POT_2, logic->CanBreakPots()), LOCATION(RC_TH_SOUTH_F1_CARPENTER_CELL_POT_3, logic->CanBreakPots()), LOCATION(RC_TH_SOUTH_F1_CARPENTER_CELL_POT_4, logic->CanBreakPots()), - LOCATION(RC_TH_GERUDO_MEMBERSHIP_CARD, logic->CanFinishGerudoFortress()), + LOCATION(RC_TH_GERUDO_MEMBERSHIP_CARD, logic->TH_RescuedAllCarpenters), }, { //Exits Entrance(RR_GF_GROUND_RED, []{return true;}), @@ -42,13 +44,14 @@ void RegionTable_Init_ThievesHideout() { areaTable[RR_TH_NORTH_F2_CARPENTER_AREA] = Region("Thieves Hideout North F2 Carpenter Area", "Thieves Hideout", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, { //Events - EventAccess(&logic->TH_CouldRescueF2NorhCarpenter, []{return logic->CanKillEnemy(RE_GERUDO_WARRIOR);}), + EventAccess(&logic->TH_CouldRescueF2NorthCarpenter, []{return logic->CanKillEnemy(RE_GERUDO_WARRIOR);}), + EventAccess(&logic->TH_RescuedAllCarpenters, []{return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) && logic->SmallKeys(RR_GF_GROUND_BOTTOM, 4) && logic->TH_CouldRescueF1NorthCarpenter && logic->TH_CouldRescueF1SouthCarpenter && logic->TH_CouldRescueF2NorthCarpenter && logic->TH_CouldRescueF2SouthCarpenter;}), }, { //Locations LOCATION(RC_TH_NORTH_F2_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), LOCATION(RC_TH_NORTH_F2_CARPENTER_POT_1, logic->CanBreakPots()), LOCATION(RC_TH_NORTH_F2_CARPENTER_POT_2, logic->CanBreakPots()), - LOCATION(RC_TH_GERUDO_MEMBERSHIP_CARD, logic->CanFinishGerudoFortress()), + LOCATION(RC_TH_GERUDO_MEMBERSHIP_CARD, logic->TH_RescuedAllCarpenters), }, { //Exits Entrance(RR_GF_ROOFTOP_MAGENTA, []{return true;}), @@ -57,10 +60,11 @@ void RegionTable_Init_ThievesHideout() { areaTable[RR_TH_SOUTH_F2_CARPENTER_AREA] = Region("Thieves Hideout South F2 Carpenter Area", "Thieves Hideout", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->TH_CouldRescueF2SouthCarpenter, []{return logic->CanKillEnemy(RE_GERUDO_WARRIOR);}), + EventAccess(&logic->TH_RescuedAllCarpenters, []{return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) && logic->SmallKeys(RR_GF_GROUND_BOTTOM, 4) && logic->TH_CouldRescueF1NorthCarpenter && logic->TH_CouldRescueF1SouthCarpenter && logic->TH_CouldRescueF2NorthCarpenter && logic->TH_CouldRescueF2SouthCarpenter;}), }, { //Locations LOCATION(RC_TH_SOUTH_F2_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), - LOCATION(RC_TH_GERUDO_MEMBERSHIP_CARD, logic->CanFinishGerudoFortress()), + LOCATION(RC_TH_GERUDO_MEMBERSHIP_CARD, logic->TH_RescuedAllCarpenters), }, { //Exits Entrance(RR_GF_ROOFTOP_WHITE, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index dee506cae..294fff292 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -1216,24 +1216,6 @@ namespace Rando { return hasState; } - bool Logic::CanFinishGerudoFortress() { - switch (ctx->GetOption(RSK_GERUDO_FORTRESS).Get()) { - case RO_GF_CARPENTERS_NORMAL: - return SmallKeys(RR_GF_GROUND_BOTTOM, 4) && - TH_CouldRescueF1NorthCarpenter && - TH_CouldRescueF1SouthCarpenter && - TH_CouldRescueF2NorthCarpenter && - TH_CouldRescueF2SouthCarpenter; - case RO_GF_CARPENTERS_FAST: - return SmallKeys(RR_GF_GROUND_BOTTOM, 1) && TH_CouldRescueF1NorthCarpenter; - case RO_GF_CARPENTERS_FREE: - return true; - default: - assert(false); - return true; - } - } - bool Logic::CanStandingShield(){ return CanUse(RG_MIRROR_SHIELD) || (IsAdult && HasItem(RG_HYLIAN_SHIELD)) || CanUse(RG_DEKU_SHIELD); } diff --git a/soh/soh/Enhancements/randomizer/logic.h b/soh/soh/Enhancements/randomizer/logic.h index 71f21aa31..a766737f8 100644 --- a/soh/soh/Enhancements/randomizer/logic.h +++ b/soh/soh/Enhancements/randomizer/logic.h @@ -116,6 +116,7 @@ class Logic { bool TH_CouldRescueF1SouthCarpenter = false; bool TH_CouldRescueF2NorthCarpenter = false; bool TH_CouldRescueF2SouthCarpenter = false; + bool TH_RescuedAllCarpenters = false; bool GF_GateOpen = false; bool GtG_GateOpen = false; bool DampesWindmillAccess = false; @@ -244,7 +245,6 @@ class Logic { bool HasFireSource(); bool HasFireSourceWithTorch(); bool TradeQuestStep(RandomizerGet rg); - bool CanFinishGerudoFortress(); bool CanStandingShield(); bool CanShield(); bool CanUseProjectile();