diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_fortress.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_fortress.cpp index 31e8ae162..468f8d796 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_fortress.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_fortress.cpp @@ -6,242 +6,342 @@ using namespace Rando; void RegionTable_Init_GerudoFortress() { #pragma region Ground - areaTable[RR_GF_OUTSKIRTS] = Region("Gerudo Fortress Outskirts", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, { - //Events - EventAccess(&logic->GF_GateOpen, []{return logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD);}), //needs climb - }, { - //Locations - LOCATION(RC_GF_OUTSKIRTS_NE_CRATE, (logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD)) && logic->CanBreakCrates()), - LOCATION(RC_GF_OUTSKIRTS_NW_CRATE, logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD)), - }, { - //Exits - Entrance(RR_GV_FORTRESS_SIDE, []{return true;}), - Entrance(RR_GF_OUTSIDE_GATE, []{return logic->GF_GateOpen;}), - Entrance(RR_TH_1_TORCH_CELL, []{return true;}), - Entrance(RR_GF_NEAR_GROTTO, []{return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD);}), - Entrance(RR_GF_OUTSIDE_GTG, []{return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD);}), - //As of now there is no infinitly repeatable way to get thrown in jail, once one is added getting here only needs hookshot from jail - Entrance(RR_GF_JAIL_WINDOW, []{return logic->CanUse(RG_LONGSHOT);}), - }); + areaTable[RR_GF_OUTSKIRTS] = Region( + "Gerudo Fortress Outskirts", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, + { + // Events + EventAccess(&logic->GF_GateOpen, + [] { return logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD); }), // needs climb + }, + { + // Locations + LOCATION(RC_GF_OUTSKIRTS_NE_CRATE, + (logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_OUTSKIRTS_NW_CRATE, logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD)), + }, + { + // Exits + Entrance(RR_GV_FORTRESS_SIDE, [] { return true; }), + Entrance(RR_GF_OUTSIDE_GATE, [] { return logic->GF_GateOpen; }), + Entrance(RR_TH_1_TORCH_CELL, [] { return true; }), + Entrance(RR_GF_NEAR_GROTTO, [] { return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD); }), + Entrance(RR_GF_OUTSIDE_GTG, [] { return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD); }), + // As of now there is no infinitly repeatable way to get thrown in jail, once one is added getting here only + // needs hookshot from jail + Entrance(RR_GF_JAIL_WINDOW, [] { return logic->CanUse(RG_LONGSHOT); }), + }); - areaTable[RR_GF_NEAR_GROTTO] = Region("GF Near Grotto", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, { - //Locations - LOCATION(RC_GF_SOUTHMOST_CENTER_CRATE, logic->CanBreakCrates()), - LOCATION(RC_GF_MID_SOUTH_CENTER_CRATE, logic->CanBreakCrates()), - LOCATION(RC_GF_MID_NORTH_CENTER_CRATE, logic->CanBreakCrates()), - LOCATION(RR_GF_NORTHMOST_CENTER_CRATE, logic->CanBreakCrates()), - }, { - //Exits - Entrance(RR_TH_KITCHEN_CORRIDOR, []{return true;}), - Entrance(RR_TH_1_TORCH_CELL, []{return true;}), - Entrance(RR_TH_DOUBLE_CELL, []{return true;}), - Entrance(RR_GF_STORMS_GROTTO, []{return logic->IsAdult && logic->CanOpenStormsGrotto();}), - Entrance(RR_GF_TOP_OF_UPPER_VINES, []{return logic->CanUse(RG_LONGSHOT);}), - Entrance(RR_GF_OUTSIDE_GTG, []{return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD);}), - Entrance(RR_GF_OUTSKIRTS, []{return true;}), - }); + areaTable[RR_GF_NEAR_GROTTO] = + Region("GF Near Grotto", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, + { + // Locations + LOCATION(RC_GF_SOUTHMOST_CENTER_CRATE, logic->CanBreakCrates()), + LOCATION(RC_GF_MID_SOUTH_CENTER_CRATE, logic->CanBreakCrates()), + LOCATION(RC_GF_MID_NORTH_CENTER_CRATE, logic->CanBreakCrates()), + LOCATION(RR_GF_NORTHMOST_CENTER_CRATE, logic->CanBreakCrates()), + }, + { + // Exits + Entrance(RR_TH_KITCHEN_CORRIDOR, [] { return true; }), + Entrance(RR_TH_1_TORCH_CELL, [] { return true; }), + Entrance(RR_TH_DOUBLE_CELL, [] { return true; }), + Entrance(RR_GF_STORMS_GROTTO, [] { return logic->IsAdult && logic->CanOpenStormsGrotto(); }), + Entrance(RR_GF_TOP_OF_UPPER_VINES, [] { return logic->CanUse(RG_LONGSHOT); }), + Entrance(RR_GF_OUTSIDE_GTG, [] { return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD); }), + Entrance(RR_GF_OUTSKIRTS, [] { return true; }), + }); - areaTable[RR_GF_OUTSIDE_GTG] = Region("GF Outside GTG", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, { - //Events - EventAccess(&logic->GtG_GateOpen, []{return (logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->HasItem(RG_CHILD_WALLET));}), - }, {}, { - //Exits - Entrance(RR_GF_OUTSKIRTS, []{return true;}), - Entrance(RR_GTG_ENTRYWAY, []{return logic->GtG_GateOpen && (logic->IsAdult || ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES));}), - Entrance(RR_GF_NEAR_GROTTO, []{return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD);}), - // RANDTODO: Add tricks for getting past the gerudo guarding the hba range - Entrance(RR_GF_HBA_RANGE, []{return logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD);}), - Entrance(RR_GF_ABOVE_GTG, []{return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD);}), - Entrance(RR_GF_TOP_OF_UPPER_VINES, []{return logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->CanUse(RG_LONGSHOT);}), - }); + areaTable[RR_GF_OUTSIDE_GTG] = Region( + "GF Outside GTG", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, + { + // Events + EventAccess(&logic->GtG_GateOpen, + [] { + return (logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && + logic->HasItem(RG_CHILD_WALLET)); + }), + }, + {}, + { + // Exits + Entrance(RR_GF_OUTSKIRTS, [] { return true; }), + Entrance(RR_GTG_ENTRYWAY, + [] { + return logic->GtG_GateOpen && + (logic->IsAdult || ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES)); + }), + Entrance(RR_GF_NEAR_GROTTO, [] { return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD); }), + // RANDTODO: Add tricks for getting past the gerudo guarding the hba range + Entrance(RR_GF_HBA_RANGE, [] { return logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD); }), + Entrance(RR_GF_ABOVE_GTG, [] { return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD); }), + Entrance(RR_GF_TOP_OF_UPPER_VINES, + [] { return logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->CanUse(RG_LONGSHOT); }), + }); #pragma endregion #pragma region Rooftops - areaTable[RR_GF_BELOW_CHEST] = Region("GF Below Chest", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, {}, { - //Exits - Entrance(RR_TH_BREAK_ROOM, []{return true;}), - Entrance(RR_GF_OUTSKIRTS, []{return true;}), - }); + areaTable[RR_GF_BELOW_CHEST] = + Region("GF Below Chest", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, {}, + { + // Exits + Entrance(RR_TH_BREAK_ROOM, [] { return true; }), + Entrance(RR_GF_OUTSKIRTS, [] { return true; }), + }); - areaTable[RR_GF_LONG_ROOF] = Region("GF Long Roof", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, {}, { - //Exits - Entrance(RR_GF_BELOW_CHEST, []{return true;}), - Entrance(RR_GF_OUTSKIRTS, []{return true;}), - Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, []{return true;}), - Entrance(RR_GF_BELOW_GS, []{return true;}), - Entrance(RR_GF_NEAR_GS, []{return (logic->IsAdult && ctx->GetTrickOption(RT_GF_JUMP)) || logic->CanUse(RG_HOVER_BOOTS);}), - Entrance(RR_GF_NEAR_CHEST, []{return logic->CanUse(RG_LONGSHOT);}), - }); + areaTable[RR_GF_LONG_ROOF] = Region( + "GF Long Roof", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, {}, + { + // Exits + Entrance(RR_GF_BELOW_CHEST, [] { return true; }), + Entrance(RR_GF_OUTSKIRTS, [] { return true; }), + Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, [] { return true; }), + Entrance(RR_GF_BELOW_GS, [] { return true; }), + Entrance( + RR_GF_NEAR_GS, + [] { return (logic->IsAdult && ctx->GetTrickOption(RT_GF_JUMP)) || logic->CanUse(RG_HOVER_BOOTS); }), + Entrance(RR_GF_NEAR_CHEST, [] { return logic->CanUse(RG_LONGSHOT); }), + }); - areaTable[RR_GF_ABOVE_GTG] = Region("GF Above GTG", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, {}, { - //Exits - Entrance(RR_TH_KITCHEN_CORRIDOR, []{return true;}), - // need to explicitly convert it into a bool - Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, []{return ctx->GetTrickOption(RT_GF_JUMP).Get() != 0 ;}), - Entrance(RR_TH_DOUBLE_CELL, []{return true;}), - Entrance(RR_GF_NEAR_GROTTO, []{return true;}), - Entrance(RR_GF_OUTSKIRTS, []{return true;}), - Entrance(RR_GF_OUTSIDE_GTG, []{return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD);}), - }); + areaTable[RR_GF_ABOVE_GTG] = + Region("GF Above GTG", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, {}, + { + // Exits + Entrance(RR_TH_KITCHEN_CORRIDOR, [] { return true; }), + // need to explicitly convert it into a bool + Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, [] { return ctx->GetTrickOption(RT_GF_JUMP).Get() != 0; }), + Entrance(RR_TH_DOUBLE_CELL, [] { return true; }), + Entrance(RR_GF_NEAR_GROTTO, [] { return true; }), + Entrance(RR_GF_OUTSKIRTS, [] { return true; }), + Entrance(RR_GF_OUTSIDE_GTG, [] { return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD); }), + }); - areaTable[RR_GF_BOTTOM_OF_LOWER_VINES] = Region("GF Bottom of Lower Vines", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, {}, { - //Exits - Entrance(RR_TH_STEEP_SLOPE_CELL, []{return true;}), - Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true /* logic->CanClimb() */;}), - Entrance(RR_GF_ABOVE_GTG, []{return true;}), - Entrance(RR_GF_NEAR_GROTTO, []{return true;}), - Entrance(RR_GF_OUTSKIRTS, []{return true;}), - }); + areaTable[RR_GF_BOTTOM_OF_LOWER_VINES] = + Region("GF Bottom of Lower Vines", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, {}, + { + // Exits + Entrance(RR_TH_STEEP_SLOPE_CELL, [] { return true; }), + Entrance(RR_GF_TOP_OF_LOWER_VINES, [] { return true /* logic->CanClimb() */; }), + Entrance(RR_GF_ABOVE_GTG, [] { return true; }), + Entrance(RR_GF_NEAR_GROTTO, [] { return true; }), + Entrance(RR_GF_OUTSKIRTS, [] { return true; }), + }); - areaTable[RR_GF_TOP_OF_LOWER_VINES] = Region("GF Top of Lower Vines", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, {}, { - //Exits - Entrance(RR_TH_KITCHEN_TOP, []{return true;}), - Entrance(RR_TH_DOUBLE_CELL, []{return true;}), - // need to explicitly convert it into a bool - Entrance(RR_GF_BOTTOM_OF_UPPER_VINES, []{return ctx->GetTrickOption(RT_GF_JUMP).Get() != 0;}), - Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, []{return true;}), - Entrance(RR_GF_NEAR_GROTTO, []{return true;}), - Entrance(RR_GF_ABOVE_GTG, []{return true;}), - }); + areaTable[RR_GF_TOP_OF_LOWER_VINES] = + Region("GF Top of Lower Vines", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, {}, + { + // Exits + Entrance(RR_TH_KITCHEN_TOP, [] { return true; }), + Entrance(RR_TH_DOUBLE_CELL, [] { return true; }), + // need to explicitly convert it into a bool + Entrance(RR_GF_BOTTOM_OF_UPPER_VINES, [] { return ctx->GetTrickOption(RT_GF_JUMP).Get() != 0; }), + Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, [] { return true; }), + Entrance(RR_GF_NEAR_GROTTO, [] { return true; }), + Entrance(RR_GF_ABOVE_GTG, [] { return true; }), + }); - areaTable[RR_GF_BOTTOM_OF_UPPER_VINES] = Region("GF Bottom of Upper Vines", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, {}, { - //Exits - Entrance(RR_GF_TOP_OF_UPPER_VINES, []{return true /* logic->CanClimb() */;}), - Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true;}), - Entrance(RR_GF_OUTSIDE_GTG, []{return true;}), - Entrance(RR_GF_SLOPED_ROOF, []{return logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS);}), - }); + areaTable[RR_GF_BOTTOM_OF_UPPER_VINES] = + Region("GF Bottom of Upper Vines", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, {}, + { + // Exits + Entrance(RR_GF_TOP_OF_UPPER_VINES, [] { return true /* logic->CanClimb() */; }), + Entrance(RR_GF_TOP_OF_LOWER_VINES, [] { return true; }), + Entrance(RR_GF_OUTSIDE_GTG, [] { return true; }), + Entrance(RR_GF_SLOPED_ROOF, [] { return logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS); }), + }); - areaTable[RR_GF_BELOW_GS] = Region("GF Below GS", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, { - //Locations - LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_LONGSHOT) && logic->CanGetNightTimeGS()), - }, { - //Exits - Entrance(RR_TH_DEAD_END_CELL, []{return true;}), - Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, []{return true;}), - }); + areaTable[RR_GF_BELOW_GS] = Region( + "GF Below GS", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, + { + // Locations + LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_LONGSHOT) && + logic->CanGetNightTimeGS()), + }, + { + // Exits + Entrance(RR_TH_DEAD_END_CELL, [] { return true; }), + Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, [] { return true; }), + }); - areaTable[RR_GF_NEAR_GS] = Region("GF Near GS", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, { - //Locations - LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOMB_THROW) && logic->CanGetNightTimeGS()), - }, { - //Exits - Entrance(RR_TH_KITCHEN_TOP, []{return true;}), - Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, []{return true;}), - Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true;}), - Entrance(RR_GF_BELOW_GS, []{return true;}), - Entrance(RR_GF_LONG_ROOF, []{return logic->CanUse(RG_HOVER_BOOTS) /* || bunny hood jump */ || logic->IsAdult && ctx->GetTrickOption(RT_GF_JUMP);}), - Entrance(RR_GF_SLOPED_ROOF, []{return logic->IsAdult;}), - Entrance(RR_GF_NEAR_CHEST, []{return logic->CanUse(RG_LONGSHOT);}), - }); + areaTable[RR_GF_NEAR_GS] = Region( + "GF Near GS", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, + { + // Locations + LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOMB_THROW) && + logic->CanGetNightTimeGS()), + }, + { + // Exits + Entrance(RR_TH_KITCHEN_TOP, [] { return true; }), + Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, [] { return true; }), + Entrance(RR_GF_TOP_OF_LOWER_VINES, [] { return true; }), + Entrance(RR_GF_BELOW_GS, [] { return true; }), + Entrance(RR_GF_LONG_ROOF, + [] { + return logic->CanUse(RG_HOVER_BOOTS) /* || bunny hood jump */ || + logic->IsAdult && ctx->GetTrickOption(RT_GF_JUMP); + }), + Entrance(RR_GF_SLOPED_ROOF, [] { return logic->IsAdult; }), + Entrance(RR_GF_NEAR_CHEST, [] { return logic->CanUse(RG_LONGSHOT); }), + }); - areaTable[RR_GF_SLOPED_ROOF] = Region("GF Sloped Roof", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, {}, { - //Exits - Entrance(RR_GF_TOP_OF_UPPER_VINES, []{return logic->IsAdult;}), - Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true;}), - Entrance(RR_GF_NEAR_GS, []{return true;}), - Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, []{return true;}), - Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true;}), - }); + areaTable[RR_GF_SLOPED_ROOF] = + Region("GF Sloped Roof", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, {}, + { + // Exits + Entrance(RR_GF_TOP_OF_UPPER_VINES, [] { return logic->IsAdult; }), + Entrance(RR_GF_TOP_OF_LOWER_VINES, [] { return true; }), + Entrance(RR_GF_NEAR_GS, [] { return true; }), + Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, [] { return true; }), + Entrance(RR_GF_TOP_OF_LOWER_VINES, [] { return true; }), + }); - areaTable[RR_GF_TOP_OF_UPPER_VINES] = Region("GF Top of Upper Vines", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, { - //Locations - //if RR_GF_SLOPED_ROOF > RR_GF_TOP_OF_UPPER_VINES is ever made part of RT_GF_JUMP, climb is needed to get back up - LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_SHORT_JUMPSLASH) && logic->CanGetNightTimeGS()), - }, { - //Exits - Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true;}), - Entrance(RR_GF_BOTTOM_OF_UPPER_VINES, []{return true;}), - Entrance(RR_GF_NEAR_GS, []{return true;}), - Entrance(RR_GF_SLOPED_ROOF, []{return true;}), - Entrance(RR_GF_NEAR_CHEST, []{return logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && logic->CanUse(RG_SCARECROW) && logic->CanUse(RG_HOOKSHOT)) || logic->CanUse(RG_LONGSHOT);}), - }); + areaTable[RR_GF_TOP_OF_UPPER_VINES] = + Region("GF Top of Upper Vines", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, + { + // Locations + // if RR_GF_SLOPED_ROOF > RR_GF_TOP_OF_UPPER_VINES is ever made part of RT_GF_JUMP, climb is needed + // to get back up + LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && + logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_SHORT_JUMPSLASH) && + logic->CanGetNightTimeGS()), + }, + { + // Exits + Entrance(RR_GF_TOP_OF_LOWER_VINES, [] { return true; }), + Entrance(RR_GF_BOTTOM_OF_UPPER_VINES, [] { return true; }), + Entrance(RR_GF_NEAR_GS, [] { return true; }), + Entrance(RR_GF_SLOPED_ROOF, [] { return true; }), + Entrance(RR_GF_NEAR_CHEST, + [] { + return logic->CanUse(RG_HOVER_BOOTS) || + (logic->IsAdult && logic->CanUse(RG_SCARECROW) && logic->CanUse(RG_HOOKSHOT)) || + logic->CanUse(RG_LONGSHOT); + }), + }); - areaTable[RR_GF_NEAR_CHEST] = Region("GF Near Chest", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, { - //Locations - LOCATION(RC_GF_CHEST, true), - LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_LONG_JUMPSLASH) && logic->CanGetNightTimeGS()), - }, { - //Exits - Entrance(RR_GF_NEAR_GS, []{return true;}), - Entrance(RR_GF_BELOW_GS, []{return true;}), - Entrance(RR_GF_LONG_ROOF, []{return true;}), - Entrance(RR_GF_BELOW_CHEST, []{return true;}), - }); + areaTable[RR_GF_NEAR_CHEST] = + Region("GF Near Chest", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, + { + // Locations + LOCATION(RC_GF_CHEST, true), + LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && + logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_LONG_JUMPSLASH) && + logic->CanGetNightTimeGS()), + }, + { + // Exits + Entrance(RR_GF_NEAR_GS, [] { return true; }), + Entrance(RR_GF_BELOW_GS, [] { return true; }), + Entrance(RR_GF_LONG_ROOF, [] { return true; }), + Entrance(RR_GF_BELOW_CHEST, [] { return true; }), + }); #pragma endregion - areaTable[RR_GF_ABOVE_JAIL] = Region("GF Above Jail", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, { - //Locations - LOCATION(RC_GF_ABOVE_JAIL_CRATE, true), - }, { - //Exits - //you don't take fall damage if you land on the rock with the flag on for some reason - //there's a trick to reach RR_GF_LONG_ROOF but that's too intricate for GF_JUMP - Entrance(RR_GF_OUTSKIRTS, []{return ctx->GetTrickOption(RT_GF_JUMP).Get() != 0;}), - Entrance(RR_GF_BELOW_CHEST, []{return logic->TakeDamage();}), - Entrance(RR_GF_NEAR_CHEST, []{return logic->CanUse(RG_LONGSHOT);}), - Entrance(RR_GF_JAIL_WINDOW, []{return logic->CanUse(RG_HOOKSHOT);}), - }); + areaTable[RR_GF_ABOVE_JAIL] = + Region("GF Above Jail", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, + { + // Locations + LOCATION(RC_GF_ABOVE_JAIL_CRATE, true), + }, + { + // Exits + // you don't take fall damage if you land on the rock with the flag on for some reason + // there's a trick to reach RR_GF_LONG_ROOF but that's too intricate for GF_JUMP + Entrance(RR_GF_OUTSKIRTS, [] { return ctx->GetTrickOption(RT_GF_JUMP).Get() != 0; }), + Entrance(RR_GF_BELOW_CHEST, [] { return logic->TakeDamage(); }), + Entrance(RR_GF_NEAR_CHEST, [] { return logic->CanUse(RG_LONGSHOT); }), + Entrance(RR_GF_JAIL_WINDOW, [] { return logic->CanUse(RG_HOOKSHOT); }), + }); - areaTable[RR_GF_JAIL_WINDOW] = Region("GF Jail Window", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, {}, { - //Exits - //There's a trick where hovers backwalk into backflip gives access to RR_GF_LONG_ROOF from here - Entrance(RR_GF_OUTSKIRTS, []{return true;}), - Entrance(RR_GF_BELOW_CHEST, []{return true;}), - }); + areaTable[RR_GF_JAIL_WINDOW] = + Region("GF Jail Window", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, {}, + { + // Exits + // There's a trick where hovers backwalk into backflip gives access to RR_GF_LONG_ROOF from here + Entrance(RR_GF_OUTSKIRTS, [] { return true; }), + Entrance(RR_GF_BELOW_CHEST, [] { return true; }), + }); - areaTable[RR_GF_HBA_RANGE] = Region("GF HBA Range", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, { - //Locations - LOCATION(RC_GF_HBA_1000_POINTS, logic->IsAdult && logic->HasItem(RG_CHILD_WALLET) && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->CanUse(RG_EPONA) && logic->CanUse(RG_FAIRY_BOW) && logic->AtDay), - LOCATION(RC_GF_HBA_1500_POINTS, logic->IsAdult && logic->HasItem(RG_CHILD_WALLET) && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->CanUse(RG_EPONA) && logic->CanUse(RG_FAIRY_BOW) && logic->AtDay), - LOCATION(RC_GF_HBA_RANGE_GS, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG) && logic->CanGetNightTimeGS()), - LOCATION(RC_GF_HBA_RANGE_CRATE_1, logic->CanBreakCrates()), - LOCATION(RC_GF_HBA_RANGE_CRATE_2, logic->CanBreakCrates()), - LOCATION(RC_GF_HBA_RANGE_CRATE_3, logic->CanBreakCrates()), - LOCATION(RC_GF_HBA_RANGE_CRATE_4, logic->CanBreakCrates()), - LOCATION(RC_GF_HBA_RANGE_CRATE_5, logic->CanBreakCrates()), - LOCATION(RC_GF_HBA_RANGE_CRATE_6, logic->CanBreakCrates()), - LOCATION(RC_GF_HBA_RANGE_CRATE_7, logic->CanBreakCrates()), - LOCATION(RC_GF_HBA_CANOPY_EAST_CRATE, logic->CanBreakCrates()), - LOCATION(RC_GF_HBA_CANOPY_WEST_CRATE, logic->CanBreakCrates()), - LOCATION(RC_GF_NORTH_TARGET_EAST_CRATE, logic->CanBreakCrates()), - LOCATION(RC_GF_NORTH_TARGET_WEST_CRATE, logic->IsAdult || (logic->BlastOrSmash() || logic->HookshotOrBoomerang() || logic->CanUse(RG_HOVER_BOOTS))), - //implies logic->CanBreakCrates() - LOCATION(RC_GF_NORTH_TARGET_CHILD_CRATE, logic->IsChild && logic->BlastOrSmash()), - LOCATION(RC_GF_SOUTH_TARGET_EAST_CRATE, logic->CanBreakCrates()), - LOCATION(RC_GF_SOUTH_TARGET_WEST_CRATE, logic->CanBreakCrates()), - }, { - //Exits - Entrance(RR_GF_OUTSIDE_GTG, []{return logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD);}), - }); + areaTable[RR_GF_HBA_RANGE] = Region( + "GF HBA Range", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, + { + // Locations + LOCATION(RC_GF_HBA_1000_POINTS, logic->IsAdult && logic->HasItem(RG_CHILD_WALLET) && + logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->CanUse(RG_EPONA) && + logic->CanUse(RG_FAIRY_BOW) && logic->AtDay), + LOCATION(RC_GF_HBA_1500_POINTS, logic->IsAdult && logic->HasItem(RG_CHILD_WALLET) && + logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->CanUse(RG_EPONA) && + logic->CanUse(RG_FAIRY_BOW) && logic->AtDay), + LOCATION(RC_GF_HBA_RANGE_GS, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG) && + logic->CanGetNightTimeGS()), + LOCATION(RC_GF_HBA_RANGE_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_GF_HBA_RANGE_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_GF_HBA_RANGE_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_GF_HBA_RANGE_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_GF_HBA_RANGE_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_GF_HBA_RANGE_CRATE_6, logic->CanBreakCrates()), + LOCATION(RC_GF_HBA_RANGE_CRATE_7, logic->CanBreakCrates()), + LOCATION(RC_GF_HBA_CANOPY_EAST_CRATE, logic->CanBreakCrates()), + LOCATION(RC_GF_HBA_CANOPY_WEST_CRATE, logic->CanBreakCrates()), + LOCATION(RC_GF_NORTH_TARGET_EAST_CRATE, logic->CanBreakCrates()), + LOCATION(RC_GF_NORTH_TARGET_WEST_CRATE, + logic->IsAdult || + (logic->BlastOrSmash() || logic->HookshotOrBoomerang() || logic->CanUse(RG_HOVER_BOOTS))), + // implies logic->CanBreakCrates() + LOCATION(RC_GF_NORTH_TARGET_CHILD_CRATE, logic->IsChild && logic->BlastOrSmash()), + LOCATION(RC_GF_SOUTH_TARGET_EAST_CRATE, logic->CanBreakCrates()), + LOCATION(RC_GF_SOUTH_TARGET_WEST_CRATE, logic->CanBreakCrates()), + }, + { + // Exits + Entrance(RR_GF_OUTSIDE_GTG, [] { return logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD); }), + }); - areaTable[RR_GF_OUTSIDE_GATE] = Region("GF Outside Gate", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, { - //Events - EventAccess(&logic->GF_GateOpen, []{return logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && (ctx->GetOption(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD) || ctx->GetOption(RSK_SHUFFLE_OVERWORLD_ENTRANCES) /*|| ShuffleSpecialIndoorEntrances*/);}), - }, {}, { - //Exits - Entrance(RR_GF_OUTSKIRTS, []{return (logic->IsAdult && (logic->CanUse(RG_HOOKSHOT) || !ctx->GetOption(RSK_SHUFFLE_OVERWORLD_ENTRANCES))) || logic->GF_GateOpen;}), - Entrance(RR_WASTELAND_NEAR_FORTRESS, []{return true;}), - }); + areaTable[RR_GF_OUTSIDE_GATE] = + Region("GF Outside Gate", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, + { + // Events + EventAccess(&logic->GF_GateOpen, + [] { + return logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && + (ctx->GetOption(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD) || + ctx->GetOption( + RSK_SHUFFLE_OVERWORLD_ENTRANCES) /*|| ShuffleSpecialIndoorEntrances*/); + }), + }, + {}, + { + // Exits + Entrance(RR_GF_OUTSKIRTS, + [] { + return (logic->IsAdult && (logic->CanUse(RG_HOOKSHOT) || + !ctx->GetOption(RSK_SHUFFLE_OVERWORLD_ENTRANCES))) || + logic->GF_GateOpen; + }), + Entrance(RR_WASTELAND_NEAR_FORTRESS, [] { return true; }), + }); - areaTable[RR_GF_STORMS_GROTTO] = Region("GF Storms Grotto", "GF Storms Grotto", {}, NO_DAY_NIGHT_CYCLE, { - //Events - EventAccess(&logic->FreeFairies, []{return true;}), - }, { - //Locations - LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_1, true), - LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_2, true), - LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_3, true), - LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_4, true), - LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_5, true), - LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_6, true), - LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_7, true), - LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_8, true), - }, { - //Exits - Entrance(RR_GF_NEAR_GROTTO, []{return true;}), - }); + areaTable[RR_GF_STORMS_GROTTO] = Region("GF Storms Grotto", "GF Storms Grotto", {}, NO_DAY_NIGHT_CYCLE, + { + // Events + EventAccess(&logic->FreeFairies, [] { return true; }), + }, + { + // Locations + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_1, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_2, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_3, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_4, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_5, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_6, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_7, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_8, true), + }, + { + // Exits + Entrance(RR_GF_NEAR_GROTTO, [] { return true; }), + }); } \ No newline at end of file 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 e9a03407f..959fe77a6 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/thieves_hideout.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/thieves_hideout.cpp @@ -4,136 +4,199 @@ using namespace Rando; void RegionTable_Init_ThievesHideout() { - areaTable[RR_TH_1_TORCH_CELL] = Region("Thieves Hideout 1 Torch Cell", "Thieves Hideout", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, { - //Events - EventAccess(&logic->THCouldFree1TorchCarpenter, []{return logic->CanKillEnemy(RE_GERUDO_WARRIOR);}), - EventAccess(&logic->THRescuedAllCarpenters, []{return logic->SmallKeys(RR_GF_OUTSKIRTS, ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) ? 4 : 1) && logic->THCouldFree1TorchCarpenter && logic->THCouldFreeDoubleCellCarpenter && logic->TH_CouldFreeDeadEndCarpenter && logic->THCouldRescueSlopeCarpenter;}), - }, { - //Locations - LOCATION(RC_TH_1_TORCH_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), - LOCATION(RC_TH_1_TORCH_CELL_RIGHT_POT, logic->CanBreakPots()), - LOCATION(RC_TH_1_TORCH_CELL_MID_POT, logic->CanBreakPots()), - LOCATION(RC_TH_1_TORCH_CELL_LEFT_POT, logic->CanBreakPots()), - LOCATION(RC_TH_1_TORCH_CELL_CRATE, logic->CanBreakCrates()), - LOCATION(RC_TH_FREED_CARPENTERS, logic->THRescuedAllCarpenters), - }, { - //Exits - Entrance(RR_GF_OUTSKIRTS, []{return true;}), - Entrance(RR_GF_NEAR_GROTTO, []{return true;}), - }); + areaTable[RR_TH_1_TORCH_CELL] = Region( + "Thieves Hideout 1 Torch Cell", "Thieves Hideout", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, + { + // Events + EventAccess(&logic->THCouldFree1TorchCarpenter, [] { return logic->CanKillEnemy(RE_GERUDO_WARRIOR); }), + EventAccess(&logic->THRescuedAllCarpenters, + [] { + return logic->SmallKeys( + RR_GF_OUTSKIRTS, + ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) ? 4 : 1) && + logic->THCouldFree1TorchCarpenter && logic->THCouldFreeDoubleCellCarpenter && + logic->TH_CouldFreeDeadEndCarpenter && logic->THCouldRescueSlopeCarpenter; + }), + }, + { + // Locations + LOCATION(RC_TH_1_TORCH_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), + LOCATION(RC_TH_1_TORCH_CELL_RIGHT_POT, logic->CanBreakPots()), + LOCATION(RC_TH_1_TORCH_CELL_MID_POT, logic->CanBreakPots()), + LOCATION(RC_TH_1_TORCH_CELL_LEFT_POT, logic->CanBreakPots()), + LOCATION(RC_TH_1_TORCH_CELL_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_FREED_CARPENTERS, logic->THRescuedAllCarpenters), + }, + { + // Exits + Entrance(RR_GF_OUTSKIRTS, [] { return true; }), + Entrance(RR_GF_NEAR_GROTTO, [] { return true; }), + }); - areaTable[RR_TH_DOUBLE_CELL] = Region("Thieves Hideout Double Cell", "Thieves Hideout", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, { - //Events - EventAccess(&logic->THCouldFreeDoubleCellCarpenter, []{return logic->CanKillEnemy(RE_GERUDO_WARRIOR);}), - EventAccess(&logic->THRescuedAllCarpenters, []{return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) && logic->SmallKeys(RR_GF_OUTSKIRTS, 4) && logic->THCouldFree1TorchCarpenter && logic->THCouldFreeDoubleCellCarpenter && logic->TH_CouldFreeDeadEndCarpenter && logic->THCouldRescueSlopeCarpenter;}), - }, { - //Locations - LOCATION(RC_TH_DOUBLE_CELL_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), - LOCATION(RC_TH_NEAR_DOUBLE_CELL_RIGHT_POT, logic->CanBreakPots()), - LOCATION(RC_TH_NEAR_DOUBLE_CELL_MID_POT, logic->CanBreakPots()), - LOCATION(RC_TH_NEAR_DOUBLE_CELL_LEFT_POT, logic->CanBreakPots()), - LOCATION(RC_TH_RIGHTMOST_JAILED_POT, logic->CanBreakPots()), - LOCATION(RC_TH_RIGHT_MIDDLE_JAILED_POT, logic->CanBreakPots()), - LOCATION(RC_TH_LEFT_MIDDLE_JAILED_POT, logic->CanBreakPots()), - LOCATION(RC_TH_LEFTMOST_JAILED_POT, logic->CanBreakPots()), - LOCATION(RC_TH_DOUBLE_CELL_LEFT_CRATE, logic->CanBreakCrates()), - LOCATION(RC_TH_DOUBLE_CELL_RIGHT_CRATE, logic->CanBreakCrates()), - LOCATION(RC_TH_FREED_CARPENTERS, logic->THRescuedAllCarpenters), - }, { - //Exits - Entrance(RR_GF_OUTSKIRTS, []{return true;}), - Entrance(RR_GF_NEAR_GROTTO, []{return true;}), - }); + areaTable[RR_TH_DOUBLE_CELL] = Region( + "Thieves Hideout Double Cell", "Thieves Hideout", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, + { + // Events + EventAccess(&logic->THCouldFreeDoubleCellCarpenter, [] { return logic->CanKillEnemy(RE_GERUDO_WARRIOR); }), + EventAccess(&logic->THRescuedAllCarpenters, + [] { + return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) && + logic->SmallKeys(RR_GF_OUTSKIRTS, 4) && logic->THCouldFree1TorchCarpenter && + logic->THCouldFreeDoubleCellCarpenter && logic->TH_CouldFreeDeadEndCarpenter && + logic->THCouldRescueSlopeCarpenter; + }), + }, + { + // Locations + LOCATION(RC_TH_DOUBLE_CELL_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), + LOCATION(RC_TH_NEAR_DOUBLE_CELL_RIGHT_POT, logic->CanBreakPots()), + LOCATION(RC_TH_NEAR_DOUBLE_CELL_MID_POT, logic->CanBreakPots()), + LOCATION(RC_TH_NEAR_DOUBLE_CELL_LEFT_POT, logic->CanBreakPots()), + LOCATION(RC_TH_RIGHTMOST_JAILED_POT, logic->CanBreakPots()), + LOCATION(RC_TH_RIGHT_MIDDLE_JAILED_POT, logic->CanBreakPots()), + LOCATION(RC_TH_LEFT_MIDDLE_JAILED_POT, logic->CanBreakPots()), + LOCATION(RC_TH_LEFTMOST_JAILED_POT, logic->CanBreakPots()), + LOCATION(RC_TH_DOUBLE_CELL_LEFT_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_DOUBLE_CELL_RIGHT_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_FREED_CARPENTERS, logic->THRescuedAllCarpenters), + }, + { + // Exits + Entrance(RR_GF_OUTSKIRTS, [] { return true; }), + Entrance(RR_GF_NEAR_GROTTO, [] { return true; }), + }); - areaTable[RR_TH_DEAD_END_CELL] = Region("Thieves Hideout Dead End Cell", "Thieves Hideout", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, { - //Events - EventAccess(&logic->TH_CouldFreeDeadEndCarpenter, []{return logic->CanKillEnemy(RE_GERUDO_WARRIOR);}), - EventAccess(&logic->THRescuedAllCarpenters, []{return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) && logic->SmallKeys(RR_GF_OUTSKIRTS, 4) && logic->THCouldFree1TorchCarpenter && logic->THCouldFreeDoubleCellCarpenter && logic->TH_CouldFreeDeadEndCarpenter && logic->THCouldRescueSlopeCarpenter;}), - }, { - //Locations - LOCATION(RC_TH_DEAD_END_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), - LOCATION(RC_TH_DEAD_END_CELL_CRATE, logic->CanBreakCrates()), - LOCATION(RC_TH_FREED_CARPENTERS, logic->THRescuedAllCarpenters), - }, { - //Exits - Entrance(RR_GF_BELOW_GS, []{return true;}), - }); + areaTable[RR_TH_DEAD_END_CELL] = Region( + "Thieves Hideout Dead End Cell", "Thieves Hideout", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, + { + // Events + EventAccess(&logic->TH_CouldFreeDeadEndCarpenter, [] { return logic->CanKillEnemy(RE_GERUDO_WARRIOR); }), + EventAccess(&logic->THRescuedAllCarpenters, + [] { + return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) && + logic->SmallKeys(RR_GF_OUTSKIRTS, 4) && logic->THCouldFree1TorchCarpenter && + logic->THCouldFreeDoubleCellCarpenter && logic->TH_CouldFreeDeadEndCarpenter && + logic->THCouldRescueSlopeCarpenter; + }), + }, + { + // Locations + LOCATION(RC_TH_DEAD_END_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), + LOCATION(RC_TH_DEAD_END_CELL_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_FREED_CARPENTERS, logic->THRescuedAllCarpenters), + }, + { + // Exits + Entrance(RR_GF_BELOW_GS, [] { return true; }), + }); - areaTable[RR_TH_STEEP_SLOPE_CELL] = Region("Thieves Hideout Steep Slope Cell", "Thieves Hideout", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, { - //Events - EventAccess(&logic->THCouldRescueSlopeCarpenter, []{return logic->CanKillEnemy(RE_GERUDO_WARRIOR);}), - EventAccess(&logic->THRescuedAllCarpenters, []{return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) && logic->SmallKeys(RR_GF_OUTSKIRTS, 4) && logic->THCouldFree1TorchCarpenter && logic->THCouldFreeDoubleCellCarpenter && logic->TH_CouldFreeDeadEndCarpenter && logic->THCouldRescueSlopeCarpenter;}), - }, { - //Locations - LOCATION(RC_TH_STEEP_SLOPE_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), - LOCATION(RC_TH_STEEP_SLOPE_RIGHT_POT, logic->CanBreakPots()), - LOCATION(RC_TH_STEEP_SLOPE_LEFT_POT, logic->CanBreakPots()), - LOCATION(RC_TH_FREED_CARPENTERS, logic->THRescuedAllCarpenters), - }, { - //Exits - Entrance(RR_GF_ABOVE_GTG, []{return true;}), - Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true;}), - }); + areaTable[RR_TH_STEEP_SLOPE_CELL] = Region( + "Thieves Hideout Steep Slope Cell", "Thieves Hideout", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, + { + // Events + EventAccess(&logic->THCouldRescueSlopeCarpenter, [] { return logic->CanKillEnemy(RE_GERUDO_WARRIOR); }), + EventAccess(&logic->THRescuedAllCarpenters, + [] { + return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) && + logic->SmallKeys(RR_GF_OUTSKIRTS, 4) && logic->THCouldFree1TorchCarpenter && + logic->THCouldFreeDoubleCellCarpenter && logic->TH_CouldFreeDeadEndCarpenter && + logic->THCouldRescueSlopeCarpenter; + }), + }, + { + // Locations + LOCATION(RC_TH_STEEP_SLOPE_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), + LOCATION(RC_TH_STEEP_SLOPE_RIGHT_POT, logic->CanBreakPots()), + LOCATION(RC_TH_STEEP_SLOPE_LEFT_POT, logic->CanBreakPots()), + LOCATION(RC_TH_FREED_CARPENTERS, logic->THRescuedAllCarpenters), + }, + { + // Exits + Entrance(RR_GF_ABOVE_GTG, [] { return true; }), + Entrance(RR_GF_TOP_OF_LOWER_VINES, [] { return true; }), + }); - areaTable[RR_TH_KITCHEN_CORRIDOR] = Region("Thieves Hideout Kitchen Corridor", "Thieves Hideout", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, { - //Locations - LOCATION(RC_TH_NEAR_KITCHEN_LEFTMOST_CRATE, logic->CanBreakCrates()), - LOCATION(RC_TH_NEAR_KITCHEN_MID_LEFT_CRATE, logic->CanBreakCrates()), - LOCATION(RC_TH_NEAR_KITCHEN_MID_RIGHT_CRATE, logic->CanBreakCrates()), - LOCATION(RC_TH_NEAR_KITCHEN_RIGHTMOST_CRATE, logic->CanBreakCrates()), - }, { - //Exits - Entrance(RR_GF_NEAR_GROTTO, []{return true;}), - Entrance(RR_GF_ABOVE_GTG, []{return true;}), - Entrance(RR_TH_KITCHEN_MAIN, []{return logic->CanPassEnemy(RE_GERUDO_GUARD);}), - }); + areaTable[RR_TH_KITCHEN_CORRIDOR] = + Region("Thieves Hideout Kitchen Corridor", "Thieves Hideout", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, + { + // Locations + LOCATION(RC_TH_NEAR_KITCHEN_LEFTMOST_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_NEAR_KITCHEN_MID_LEFT_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_NEAR_KITCHEN_MID_RIGHT_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_NEAR_KITCHEN_RIGHTMOST_CRATE, logic->CanBreakCrates()), + }, + { + // Exits + Entrance(RR_GF_NEAR_GROTTO, [] { return true; }), + Entrance(RR_GF_ABOVE_GTG, [] { return true; }), + Entrance(RR_TH_KITCHEN_MAIN, [] { return logic->CanPassEnemy(RE_GERUDO_GUARD); }), + }); - areaTable[RR_TH_KITCHEN_MAIN] = Region("Thieves Hideout Kitchen Bottom", "Thieves Hideout", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, { - //Locations - LOCATION(RC_TH_KITCHEN_POT_1, logic->CanBreakPots() && logic->CanPassEnemy(RE_GERUDO_GUARD)), - LOCATION(RC_TH_KITCHEN_POT_2, logic->CanBreakPots() && logic->CanPassEnemy(RE_GERUDO_GUARD)), - LOCATION(RC_TH_KITCHEN_CRATE, logic->CanBreakCrates() && logic->CanPassEnemy(RE_GERUDO_GUARD)), - LOCATION(RC_TH_KITCHEN_SUN_FAIRY, logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->CanUse(RG_SUNS_SONG)), - }, { - //Exits - Entrance(RR_TH_KITCHEN_CORRIDOR, []{return logic->CanPassEnemy(RE_GERUDO_GUARD);}), - Entrance(RR_TH_KITCHEN_TOP, []{return logic->CanPassEnemy(RE_GERUDO_GUARD);}), - }); + areaTable[RR_TH_KITCHEN_MAIN] = Region( + "Thieves Hideout Kitchen Bottom", "Thieves Hideout", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, + { + // Locations + LOCATION(RC_TH_KITCHEN_POT_1, logic->CanBreakPots() && logic->CanPassEnemy(RE_GERUDO_GUARD)), + LOCATION(RC_TH_KITCHEN_POT_2, logic->CanBreakPots() && logic->CanPassEnemy(RE_GERUDO_GUARD)), + LOCATION(RC_TH_KITCHEN_CRATE, logic->CanBreakCrates() && logic->CanPassEnemy(RE_GERUDO_GUARD)), + LOCATION(RC_TH_KITCHEN_SUN_FAIRY, logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->CanUse(RG_SUNS_SONG)), + }, + { + // Exits + Entrance(RR_TH_KITCHEN_CORRIDOR, [] { return logic->CanPassEnemy(RE_GERUDO_GUARD); }), + Entrance(RR_TH_KITCHEN_TOP, [] { return logic->CanPassEnemy(RE_GERUDO_GUARD); }), + }); - areaTable[RR_TH_KITCHEN_TOP] = Region("Thieves Hideout Kitchen Top", "Thieves Hideout", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, { - //Locations - LOCATION(RC_TH_KITCHEN_POT_1, logic->CanUse(RG_BOOMERANG)), - LOCATION(RC_TH_KITCHEN_POT_2, logic->CanUse(RG_BOOMERANG)), - }, { - //Exits - Entrance(RR_TH_KITCHEN_MAIN, []{return true;}), - //hookshot to cross using the rafters is implied in logic->CanPassEnemy(RE_GERUDO_GUARD) - Entrance(RR_GF_NEAR_GS, []{return logic->CanPassEnemy(RE_GERUDO_GUARD) || logic->CanUse(RG_HOVER_BOOTS);}), - Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return logic->CanPassEnemy(RE_GERUDO_GUARD) || logic->CanUse(RG_HOVER_BOOTS);}), - }); + areaTable[RR_TH_KITCHEN_TOP] = + Region("Thieves Hideout Kitchen Top", "Thieves Hideout", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, + { + // Locations + LOCATION(RC_TH_KITCHEN_POT_1, logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_TH_KITCHEN_POT_2, logic->CanUse(RG_BOOMERANG)), + }, + { + // Exits + Entrance(RR_TH_KITCHEN_MAIN, [] { return true; }), + // hookshot to cross using the rafters is implied in logic->CanPassEnemy(RE_GERUDO_GUARD) + Entrance(RR_GF_NEAR_GS, + [] { return logic->CanPassEnemy(RE_GERUDO_GUARD) || logic->CanUse(RG_HOVER_BOOTS); }), + Entrance(RR_GF_TOP_OF_LOWER_VINES, + [] { return logic->CanPassEnemy(RE_GERUDO_GUARD) || logic->CanUse(RG_HOVER_BOOTS); }), + }); - areaTable[RR_TH_BREAK_ROOM] = Region("Thieves Hideout Break Room", "Thieves Hideout", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, { - //Locations - LOCATION(RC_TH_BREAK_ROOM_FRONT_POT, (logic->CanPassEnemy(RE_BREAK_ROOM_GUARD) && logic->CanBreakPots()) || - (logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->CanUse(RG_BOOMERANG))), - LOCATION(RC_TH_BREAK_ROOM_BACK_POT, (logic->CanPassEnemy(RE_BREAK_ROOM_GUARD) && logic->CanBreakPots()) || - (logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->CanUse(RG_BOOMERANG))), - LOCATION(RC_TH_BREAK_HALLWAY_OUTER_CRATE, logic->CanBreakCrates()), - LOCATION(RC_TH_BREAK_HALLWAY_INNER_CRATE, logic->CanBreakCrates()), - LOCATION(RC_TH_BREAK_ROOM_RIGHT_CRATE, (logic->CanPassEnemy(RE_BREAK_ROOM_GUARD) && logic->CanBreakCrates()) || - (logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->HasExplosives() && logic->CanUse(RG_BOOMERANG))), - LOCATION(RC_TH_BREAK_ROOM_LEFT_CRATE, (logic->CanPassEnemy(RE_BREAK_ROOM_GUARD) && logic->CanBreakCrates()) || - (logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->HasExplosives() && logic->CanUse(RG_BOOMERANG))), - }, { - //Exits - Entrance(RR_GF_BELOW_CHEST, []{return logic->CanPassEnemy(RE_GERUDO_GUARD);}), - //Implies logic->CanPassEnemy(RE_GERUDO_GUARD) - Entrance(RR_TH_BREAK_ROOM_CORRIDOR, []{return logic->CanUse(RG_HOOKSHOT);}), - }); + areaTable[RR_TH_BREAK_ROOM] = + Region("Thieves Hideout Break Room", "Thieves Hideout", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, + { + // Locations + LOCATION(RC_TH_BREAK_ROOM_FRONT_POT, + (logic->CanPassEnemy(RE_BREAK_ROOM_GUARD) && logic->CanBreakPots()) || + (logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_TH_BREAK_ROOM_BACK_POT, + (logic->CanPassEnemy(RE_BREAK_ROOM_GUARD) && logic->CanBreakPots()) || + (logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_TH_BREAK_HALLWAY_OUTER_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_BREAK_HALLWAY_INNER_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_BREAK_ROOM_RIGHT_CRATE, + (logic->CanPassEnemy(RE_BREAK_ROOM_GUARD) && logic->CanBreakCrates()) || + (logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->HasExplosives() && + logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_TH_BREAK_ROOM_LEFT_CRATE, + (logic->CanPassEnemy(RE_BREAK_ROOM_GUARD) && logic->CanBreakCrates()) || + (logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->HasExplosives() && + logic->CanUse(RG_BOOMERANG))), + }, + { + // Exits + Entrance(RR_GF_BELOW_CHEST, [] { return logic->CanPassEnemy(RE_GERUDO_GUARD); }), + // Implies logic->CanPassEnemy(RE_GERUDO_GUARD) + Entrance(RR_TH_BREAK_ROOM_CORRIDOR, [] { return logic->CanUse(RG_HOOKSHOT); }), + }); - areaTable[RR_TH_BREAK_ROOM_CORRIDOR] = Region("Thieves Hideout Break Room", "Thieves Hideout", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, {}, { - //Exits - Entrance(RR_TH_BREAK_ROOM, []{return logic->CanUse(RG_HOOKSHOT);}), - Entrance(RR_GF_ABOVE_JAIL, []{return true;}), - }); + areaTable[RR_TH_BREAK_ROOM_CORRIDOR] = + Region("Thieves Hideout Break Room", "Thieves Hideout", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, {}, + { + // Exits + Entrance(RR_TH_BREAK_ROOM, [] { return logic->CanUse(RG_HOOKSHOT); }), + Entrance(RR_GF_ABOVE_JAIL, [] { return true; }), + }); } \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index 7cb800aa0..cd9b271e6 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -846,7 +846,8 @@ bool Logic::CanPassEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wal case RE_OCTOROK: return true; case RE_GERUDO_GUARD: - return ctx->GetTrickOption(RT_PASS_GUARDS_WITH_NOTHING) || HasItem(RG_GERUDO_MEMBERSHIP_CARD) || CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT); + return ctx->GetTrickOption(RT_PASS_GUARDS_WITH_NOTHING) || HasItem(RG_GERUDO_MEMBERSHIP_CARD) || + CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT); case RE_BREAK_ROOM_GUARD: return HasItem(RG_GERUDO_MEMBERSHIP_CARD) || CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT); case RE_BIG_SKULLTULA: @@ -1275,48 +1276,49 @@ bool Logic::HasFireSourceWithTorch() { return HasFireSource() || CanUse(RG_STICKS); } -//Is this best off signaling what you have already traded, or what step you are currently on? - bool Logic::TradeQuestStep(RandomizerGet rg){ - if (ctx->GetOption(RSK_SHUFFLE_ADULT_TRADE)){ - return false; //This does not apply when we are shuffling trade items - } - bool hasState = false; - //Falling through each case to test each possibility - switch (rg){ - case RG_POCKET_EGG: - hasState = hasState || HasItem(RG_POCKET_EGG); - [[fallthrough]]; - case RG_COJIRO: - hasState = hasState || HasItem(RG_COJIRO); - [[fallthrough]]; - case RG_ODD_MUSHROOM: - hasState = hasState || HasItem(RG_ODD_MUSHROOM); - [[fallthrough]]; - case RG_ODD_POTION: - hasState = hasState || HasItem(RG_ODD_POTION); - [[fallthrough]]; - case RG_POACHERS_SAW: - hasState = hasState || HasItem(RG_POACHERS_SAW); - [[fallthrough]]; - case RG_BROKEN_SWORD: - hasState = hasState || HasItem(RG_BROKEN_SWORD); - [[fallthrough]]; - case RG_PRESCRIPTION: - hasState = hasState || HasItem(RG_PRESCRIPTION); - [[fallthrough]]; - case RG_EYEDROPS: - hasState = hasState || HasItem(RG_EYEDROPS); - [[fallthrough]]; - case RG_CLAIM_CHECK: - hasState = hasState || HasItem(RG_CLAIM_CHECK); - break; - default: - SPDLOG_ERROR("TradeQuestStep reached `return false;`. Missing case for RandomizerGet of {}", static_cast(rg)); - assert(false); - return false; - } - return hasState; +// Is this best off signaling what you have already traded, or what step you are currently on? +bool Logic::TradeQuestStep(RandomizerGet rg) { + if (ctx->GetOption(RSK_SHUFFLE_ADULT_TRADE)) { + return false; // This does not apply when we are shuffling trade items } + bool hasState = false; + // Falling through each case to test each possibility + switch (rg) { + case RG_POCKET_EGG: + hasState = hasState || HasItem(RG_POCKET_EGG); + [[fallthrough]]; + case RG_COJIRO: + hasState = hasState || HasItem(RG_COJIRO); + [[fallthrough]]; + case RG_ODD_MUSHROOM: + hasState = hasState || HasItem(RG_ODD_MUSHROOM); + [[fallthrough]]; + case RG_ODD_POTION: + hasState = hasState || HasItem(RG_ODD_POTION); + [[fallthrough]]; + case RG_POACHERS_SAW: + hasState = hasState || HasItem(RG_POACHERS_SAW); + [[fallthrough]]; + case RG_BROKEN_SWORD: + hasState = hasState || HasItem(RG_BROKEN_SWORD); + [[fallthrough]]; + case RG_PRESCRIPTION: + hasState = hasState || HasItem(RG_PRESCRIPTION); + [[fallthrough]]; + case RG_EYEDROPS: + hasState = hasState || HasItem(RG_EYEDROPS); + [[fallthrough]]; + case RG_CLAIM_CHECK: + hasState = hasState || HasItem(RG_CLAIM_CHECK); + break; + default: + SPDLOG_ERROR("TradeQuestStep reached `return false;`. Missing case for RandomizerGet of {}", + static_cast(rg)); + assert(false); + return false; + } + return hasState; +} bool Logic::CanStandingShield() { return CanUse(RG_MIRROR_SHIELD) || (IsAdult && HasItem(RG_HYLIAN_SHIELD)) || CanUse(RG_DEKU_SHIELD); @@ -2461,70 +2463,70 @@ void Logic::Reset() { AtNight = false; GetSaveContext()->linkAge = !ctx->GetOption(RSK_SELECTED_STARTING_AGE).Get(); - //Events - ShowedMidoSwordAndShield = false; - THCouldFree1TorchCarpenter = false; - THCouldFreeDoubleCellCarpenter = false; - TH_CouldFreeDeadEndCarpenter = false; - THCouldRescueSlopeCarpenter = false; - GF_GateOpen = false; - GtG_GateOpen = false; - DampesWindmillAccess = false; - DrainWell = false; - GoronCityChildFire = false; - GCWoodsWarpOpen = false; - GCDaruniasDoorOpenChild = false; - StopGCRollingGoronAsAdult = false; - CanWaterTempleLowFromHigh = false; - CanWaterTempleLowFromMid = false; - CanWaterTempleMiddle = false; - CanWaterTempleHigh = false; - KakarikoVillageGateOpen = false; - KingZoraThawed = false; - ForestTempleJoelle = false; - ForestTempleBeth = false; - ForestTempleAmy = false; - ForestTempleMeg = false; - FireLoopSwitch = false; - LinksCow = false; - DeliverLetter = false; - ClearMQDCUpperLobbyRocks = false; - LoweredWaterInsideBotw = false; - OpenedWestRoomMQBotw = false; - OpenedMiddleHoleMQBotw = false; - BrokeDeku1FWeb = false; - ClearedMQDekuSERoom = false; - MQDekuWaterRoomTorches = false; - PushedDekuBasementBlock = false; - OpenedLowestGoronCage = false; - OpenedUpperFireShortcut = false; - HitFireTemplePlatform = false; - OpenedFireMQFireMazeDoor = false; - MQForestBlockRoomTargets = false; - ForestCanTwistHallway = false; - ForestClearBelowBowChest = false; - ForestOpenBossCorridor = false; - ShadowTrialFirstChest = false; - MQGTGMazeSwitch = false; - GTGPlatformSilverRupees = false; - MQJabuHolesRoomDoor = false; - JabuWestTentacle = false; - JabuEastTentacle = false; - JabuNorthTentacle = false; - LoweredJabuPath = false; - MQJabuLiftRoomCow = false; - MQShadowFloorSpikeRupees = false; - ShadowShortcutBlock = false; - MQWaterStalfosPit = false; - MQWaterDragonTorches = false; - MQWaterB1Switch = false; - //MQWaterPillarSoTBlock = false; - MQWaterOpenedPillarB1 = false; - MQSpiritCrawlBoulder = false; - MQSpiritMapRoomEnemies = false; - MQSpirit3SunsEnemies = false; - Spirit1FSilverRupees = false; - JabuRutoIn1F = false; + // Events + ShowedMidoSwordAndShield = false; + THCouldFree1TorchCarpenter = false; + THCouldFreeDoubleCellCarpenter = false; + TH_CouldFreeDeadEndCarpenter = false; + THCouldRescueSlopeCarpenter = false; + GF_GateOpen = false; + GtG_GateOpen = false; + DampesWindmillAccess = false; + DrainWell = false; + GoronCityChildFire = false; + GCWoodsWarpOpen = false; + GCDaruniasDoorOpenChild = false; + StopGCRollingGoronAsAdult = false; + CanWaterTempleLowFromHigh = false; + CanWaterTempleLowFromMid = false; + CanWaterTempleMiddle = false; + CanWaterTempleHigh = false; + KakarikoVillageGateOpen = false; + KingZoraThawed = false; + ForestTempleJoelle = false; + ForestTempleBeth = false; + ForestTempleAmy = false; + ForestTempleMeg = false; + FireLoopSwitch = false; + LinksCow = false; + DeliverLetter = false; + ClearMQDCUpperLobbyRocks = false; + LoweredWaterInsideBotw = false; + OpenedWestRoomMQBotw = false; + OpenedMiddleHoleMQBotw = false; + BrokeDeku1FWeb = false; + ClearedMQDekuSERoom = false; + MQDekuWaterRoomTorches = false; + PushedDekuBasementBlock = false; + OpenedLowestGoronCage = false; + OpenedUpperFireShortcut = false; + HitFireTemplePlatform = false; + OpenedFireMQFireMazeDoor = false; + MQForestBlockRoomTargets = false; + ForestCanTwistHallway = false; + ForestClearBelowBowChest = false; + ForestOpenBossCorridor = false; + ShadowTrialFirstChest = false; + MQGTGMazeSwitch = false; + GTGPlatformSilverRupees = false; + MQJabuHolesRoomDoor = false; + JabuWestTentacle = false; + JabuEastTentacle = false; + JabuNorthTentacle = false; + LoweredJabuPath = false; + MQJabuLiftRoomCow = false; + MQShadowFloorSpikeRupees = false; + ShadowShortcutBlock = false; + MQWaterStalfosPit = false; + MQWaterDragonTorches = false; + MQWaterB1Switch = false; + // MQWaterPillarSoTBlock = false; + MQWaterOpenedPillarB1 = false; + MQSpiritCrawlBoulder = false; + MQSpiritMapRoomEnemies = false; + MQSpirit3SunsEnemies = false; + Spirit1FSilverRupees = false; + JabuRutoIn1F = false; StopPerformanceTimer(PT_LOGIC_RESET); } diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 4c845ee77..9cea95d11 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -573,9 +573,9 @@ void Settings::CreateOptions() { "Sneak Past Moving Gerudo Guards with No Items", "The logic normally guarantees Bow or Hookshot to stun them from a distance," "but every moving guard can be passed with basic movement and AI manipulation"); - OPT_TRICK(RT_GF_JUMP, RCQUEST_BOTH, RA_GERUDO_FORTRESS, { Tricks::Tag::NOVICE }, - "Gerudo\'s Fortress Ledge Jumps", - "It is possible to navigate the rooves of Fortress with unintuative jumps to reach additional areas without going inside."); + OPT_TRICK(RT_GF_JUMP, RCQUEST_BOTH, RA_GERUDO_FORTRESS, { Tricks::Tag::NOVICE }, "Gerudo\'s Fortress Ledge Jumps", + "It is possible to navigate the rooves of Fortress with unintuative jumps to reach additional areas " + "without going inside."); OPT_TRICK(RT_GF_WARRIOR_WITH_DIFFICULT_WEAPON, RCQUEST_BOTH, RA_GERUDO_FORTRESS, { Tricks::Tag::NOVICE }, "Gerudo\'s Fortress Warriors with Difficult Weapons", "Warriors can be defeated with Slingshot or Bombchus.");