apply clang format

This commit is contained in:
Pepper0ni 2025-04-05 23:43:05 +01:00
commit 232fa1ef61
4 changed files with 612 additions and 447 deletions

View file

@ -6,198 +6,277 @@ using namespace Rando;
void RegionTable_Init_GerudoFortress() { void RegionTable_Init_GerudoFortress() {
#pragma region Ground #pragma region Ground
areaTable[RR_GF_OUTSKIRTS] = Region("Gerudo Fortress Outskirts", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, { areaTable[RR_GF_OUTSKIRTS] = Region(
//Events "Gerudo Fortress Outskirts", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE,
EventAccess(&logic->GF_GateOpen, []{return logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD);}), //needs climb {
}, { // Events
//Locations EventAccess(&logic->GF_GateOpen,
LOCATION(RC_GF_OUTSKIRTS_NE_CRATE, (logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD)) && logic->CanBreakCrates()), [] { 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)), LOCATION(RC_GF_OUTSKIRTS_NW_CRATE, logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD)),
}, { },
//Exits {
Entrance(RR_GV_FORTRESS_SIDE, []{return true;}), // Exits
Entrance(RR_GF_OUTSIDE_GATE, []{return logic->GF_GateOpen;}), Entrance(RR_GV_FORTRESS_SIDE, [] { return true; }),
Entrance(RR_TH_1_TORCH_CELL, []{return true;}), Entrance(RR_GF_OUTSIDE_GATE, [] { return logic->GF_GateOpen; }),
Entrance(RR_GF_NEAR_GROTTO, []{return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD);}), Entrance(RR_TH_1_TORCH_CELL, [] { return true; }),
Entrance(RR_GF_OUTSIDE_GTG, []{return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD);}), Entrance(RR_GF_NEAR_GROTTO, [] { 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_OUTSIDE_GTG, [] { return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD); }),
Entrance(RR_GF_JAIL_WINDOW, []{return logic->CanUse(RG_LONGSHOT);}), // 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, {}, { areaTable[RR_GF_NEAR_GROTTO] =
//Locations 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_SOUTHMOST_CENTER_CRATE, logic->CanBreakCrates()),
LOCATION(RC_GF_MID_SOUTH_CENTER_CRATE, logic->CanBreakCrates()), LOCATION(RC_GF_MID_SOUTH_CENTER_CRATE, logic->CanBreakCrates()),
LOCATION(RC_GF_MID_NORTH_CENTER_CRATE, logic->CanBreakCrates()), LOCATION(RC_GF_MID_NORTH_CENTER_CRATE, logic->CanBreakCrates()),
LOCATION(RR_GF_NORTHMOST_CENTER_CRATE, logic->CanBreakCrates()), LOCATION(RR_GF_NORTHMOST_CENTER_CRATE, logic->CanBreakCrates()),
}, { },
//Exits {
Entrance(RR_TH_KITCHEN_CORRIDOR, []{return true;}), // Exits
Entrance(RR_TH_1_TORCH_CELL, []{return true;}), Entrance(RR_TH_KITCHEN_CORRIDOR, [] { return true; }),
Entrance(RR_TH_DOUBLE_CELL, []{return true;}), Entrance(RR_TH_1_TORCH_CELL, [] { return true; }),
Entrance(RR_GF_STORMS_GROTTO, []{return logic->IsAdult && logic->CanOpenStormsGrotto();}), Entrance(RR_TH_DOUBLE_CELL, [] { return true; }),
Entrance(RR_GF_TOP_OF_UPPER_VINES, []{return logic->CanUse(RG_LONGSHOT);}), Entrance(RR_GF_STORMS_GROTTO, [] { return logic->IsAdult && logic->CanOpenStormsGrotto(); }),
Entrance(RR_GF_OUTSIDE_GTG, []{return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD);}), Entrance(RR_GF_TOP_OF_UPPER_VINES, [] { return logic->CanUse(RG_LONGSHOT); }),
Entrance(RR_GF_OUTSKIRTS, []{return true;}), 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, { areaTable[RR_GF_OUTSIDE_GTG] = Region(
//Events "GF Outside GTG", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE,
EventAccess(&logic->GtG_GateOpen, []{return (logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->HasItem(RG_CHILD_WALLET));}), {
}, {}, { // Events
//Exits EventAccess(&logic->GtG_GateOpen,
Entrance(RR_GF_OUTSKIRTS, []{return true;}), [] {
Entrance(RR_GTG_ENTRYWAY, []{return logic->GtG_GateOpen && (logic->IsAdult || ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES));}), return (logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) &&
Entrance(RR_GF_NEAR_GROTTO, []{return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD);}), 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 // 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_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_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);}), Entrance(RR_GF_TOP_OF_UPPER_VINES,
[] { return logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->CanUse(RG_LONGSHOT); }),
}); });
#pragma endregion #pragma endregion
#pragma region Rooftops #pragma region Rooftops
areaTable[RR_GF_BELOW_CHEST] = Region("GF Below Chest", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, {}, { areaTable[RR_GF_BELOW_CHEST] =
//Exits Region("GF Below Chest", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, {},
Entrance(RR_TH_BREAK_ROOM, []{return true;}), {
Entrance(RR_GF_OUTSKIRTS, []{return true;}), // 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, {}, {}, { areaTable[RR_GF_LONG_ROOF] = Region(
//Exits "GF Long Roof", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, {},
Entrance(RR_GF_BELOW_CHEST, []{return true;}), {
Entrance(RR_GF_OUTSKIRTS, []{return true;}), // Exits
Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, []{return true;}), Entrance(RR_GF_BELOW_CHEST, [] { return true; }),
Entrance(RR_GF_BELOW_GS, []{return true;}), Entrance(RR_GF_OUTSKIRTS, [] { return true; }),
Entrance(RR_GF_NEAR_GS, []{return (logic->IsAdult && ctx->GetTrickOption(RT_GF_JUMP)) || logic->CanUse(RG_HOVER_BOOTS);}), Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, [] { return true; }),
Entrance(RR_GF_NEAR_CHEST, []{return logic->CanUse(RG_LONGSHOT);}), 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, {}, {}, { areaTable[RR_GF_ABOVE_GTG] =
//Exits Region("GF Above GTG", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, {},
Entrance(RR_TH_KITCHEN_CORRIDOR, []{return true;}), {
// Exits
Entrance(RR_TH_KITCHEN_CORRIDOR, [] { return true; }),
// need to explicitly convert it into a bool // 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_GF_BOTTOM_OF_LOWER_VINES, [] { return ctx->GetTrickOption(RT_GF_JUMP).Get() != 0; }),
Entrance(RR_TH_DOUBLE_CELL, []{return true;}), Entrance(RR_TH_DOUBLE_CELL, [] { return true; }),
Entrance(RR_GF_NEAR_GROTTO, []{return true;}), Entrance(RR_GF_NEAR_GROTTO, [] { return true; }),
Entrance(RR_GF_OUTSKIRTS, []{return true;}), Entrance(RR_GF_OUTSKIRTS, [] { return true; }),
Entrance(RR_GF_OUTSIDE_GTG, []{return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD);}), 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, {}, {}, { areaTable[RR_GF_BOTTOM_OF_LOWER_VINES] =
//Exits Region("GF Bottom of Lower Vines", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, {},
Entrance(RR_TH_STEEP_SLOPE_CELL, []{return true;}), {
Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true /* logic->CanClimb() */;}), // Exits
Entrance(RR_GF_ABOVE_GTG, []{return true;}), Entrance(RR_TH_STEEP_SLOPE_CELL, [] { return true; }),
Entrance(RR_GF_NEAR_GROTTO, []{return true;}), Entrance(RR_GF_TOP_OF_LOWER_VINES, [] { return true /* logic->CanClimb() */; }),
Entrance(RR_GF_OUTSKIRTS, []{return true;}), 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, {}, {}, { areaTable[RR_GF_TOP_OF_LOWER_VINES] =
//Exits Region("GF Top of Lower Vines", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, {},
Entrance(RR_TH_KITCHEN_TOP, []{return true;}), {
Entrance(RR_TH_DOUBLE_CELL, []{return true;}), // Exits
Entrance(RR_TH_KITCHEN_TOP, [] { return true; }),
Entrance(RR_TH_DOUBLE_CELL, [] { return true; }),
// need to explicitly convert it into a bool // 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_UPPER_VINES, [] { return ctx->GetTrickOption(RT_GF_JUMP).Get() != 0; }),
Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, []{return true;}), Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, [] { return true; }),
Entrance(RR_GF_NEAR_GROTTO, []{return true;}), Entrance(RR_GF_NEAR_GROTTO, [] { return true; }),
Entrance(RR_GF_ABOVE_GTG, []{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, {}, {}, { areaTable[RR_GF_BOTTOM_OF_UPPER_VINES] =
//Exits Region("GF Bottom of Upper Vines", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, {},
Entrance(RR_GF_TOP_OF_UPPER_VINES, []{return true /* logic->CanClimb() */;}), {
Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true;}), // Exits
Entrance(RR_GF_OUTSIDE_GTG, []{return true;}), Entrance(RR_GF_TOP_OF_UPPER_VINES, [] { return true /* logic->CanClimb() */; }),
Entrance(RR_GF_SLOPED_ROOF, []{return logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS);}), 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, {}, { areaTable[RR_GF_BELOW_GS] = Region(
//Locations "GF Below GS", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {},
LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_LONGSHOT) && logic->CanGetNightTimeGS()), {
}, { // Locations
//Exits LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_LONGSHOT) &&
Entrance(RR_TH_DEAD_END_CELL, []{return true;}), logic->CanGetNightTimeGS()),
Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, []{return true;}), },
{
// 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, {}, { areaTable[RR_GF_NEAR_GS] = Region(
//Locations "GF Near GS", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {},
LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOMB_THROW) && logic->CanGetNightTimeGS()), {
}, { // Locations
//Exits LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOMB_THROW) &&
Entrance(RR_TH_KITCHEN_TOP, []{return true;}), logic->CanGetNightTimeGS()),
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;}), // Exits
Entrance(RR_GF_LONG_ROOF, []{return logic->CanUse(RG_HOVER_BOOTS) /* || bunny hood jump */ || logic->IsAdult && ctx->GetTrickOption(RT_GF_JUMP);}), Entrance(RR_TH_KITCHEN_TOP, [] { return true; }),
Entrance(RR_GF_SLOPED_ROOF, []{return logic->IsAdult;}), Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, [] { return true; }),
Entrance(RR_GF_NEAR_CHEST, []{return logic->CanUse(RG_LONGSHOT);}), 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, {}, {}, { areaTable[RR_GF_SLOPED_ROOF] =
//Exits Region("GF Sloped Roof", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, {},
Entrance(RR_GF_TOP_OF_UPPER_VINES, []{return logic->IsAdult;}), {
Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true;}), // Exits
Entrance(RR_GF_NEAR_GS, []{return true;}), Entrance(RR_GF_TOP_OF_UPPER_VINES, [] { return logic->IsAdult; }),
Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, []{return true;}), Entrance(RR_GF_TOP_OF_LOWER_VINES, [] { return true; }),
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, {}, { areaTable[RR_GF_TOP_OF_UPPER_VINES] =
//Locations Region("GF Top of Upper Vines", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {},
//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()), // Locations
}, { // if RR_GF_SLOPED_ROOF > RR_GF_TOP_OF_UPPER_VINES is ever made part of RT_GF_JUMP, climb is needed
//Exits // to get back up
Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true;}), LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult &&
Entrance(RR_GF_BOTTOM_OF_UPPER_VINES, []{return true;}), logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_SHORT_JUMPSLASH) &&
Entrance(RR_GF_NEAR_GS, []{return true;}), logic->CanGetNightTimeGS()),
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);}), {
// 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, {}, { areaTable[RR_GF_NEAR_CHEST] =
//Locations Region("GF Near Chest", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {},
{
// Locations
LOCATION(RC_GF_CHEST, true), LOCATION(RC_GF_CHEST, true),
LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_LONG_JUMPSLASH) && logic->CanGetNightTimeGS()), LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult &&
}, { logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_LONG_JUMPSLASH) &&
//Exits logic->CanGetNightTimeGS()),
Entrance(RR_GF_NEAR_GS, []{return true;}), },
Entrance(RR_GF_BELOW_GS, []{return true;}), {
Entrance(RR_GF_LONG_ROOF, []{return true;}), // Exits
Entrance(RR_GF_BELOW_CHEST, []{return true;}), 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 #pragma endregion
areaTable[RR_GF_ABOVE_JAIL] = Region("GF Above Jail", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, {}, { areaTable[RR_GF_ABOVE_JAIL] =
//Locations Region("GF Above Jail", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {},
{
// Locations
LOCATION(RC_GF_ABOVE_JAIL_CRATE, true), 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 // Exits
//there's a trick to reach RR_GF_LONG_ROOF but that's too intricate for GF_JUMP // you don't take fall damage if you land on the rock with the flag on for some reason
Entrance(RR_GF_OUTSKIRTS, []{return ctx->GetTrickOption(RT_GF_JUMP).Get() != 0;}), // there's a trick to reach RR_GF_LONG_ROOF but that's too intricate for GF_JUMP
Entrance(RR_GF_BELOW_CHEST, []{return logic->TakeDamage();}), Entrance(RR_GF_OUTSKIRTS, [] { return ctx->GetTrickOption(RT_GF_JUMP).Get() != 0; }),
Entrance(RR_GF_NEAR_CHEST, []{return logic->CanUse(RG_LONGSHOT);}), Entrance(RR_GF_BELOW_CHEST, [] { return logic->TakeDamage(); }),
Entrance(RR_GF_JAIL_WINDOW, []{return logic->CanUse(RG_HOOKSHOT);}), 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, {}, {}, { areaTable[RR_GF_JAIL_WINDOW] =
//Exits Region("GF Jail Window", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, {},
//There's a trick where hovers backwalk into backflip gives access to RR_GF_LONG_ROOF from here {
Entrance(RR_GF_OUTSKIRTS, []{return true;}), // Exits
Entrance(RR_GF_BELOW_CHEST, []{return true;}), // 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, {}, { areaTable[RR_GF_HBA_RANGE] = Region(
//Locations "GF HBA Range", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {},
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), // Locations
LOCATION(RC_GF_HBA_RANGE_GS, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG) && logic->CanGetNightTimeGS()), 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_1, logic->CanBreakCrates()),
LOCATION(RC_GF_HBA_RANGE_CRATE_2, 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_3, logic->CanBreakCrates()),
@ -208,30 +287,50 @@ void RegionTable_Init_GerudoFortress() {
LOCATION(RC_GF_HBA_CANOPY_EAST_CRATE, logic->CanBreakCrates()), LOCATION(RC_GF_HBA_CANOPY_EAST_CRATE, logic->CanBreakCrates()),
LOCATION(RC_GF_HBA_CANOPY_WEST_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_EAST_CRATE, logic->CanBreakCrates()),
LOCATION(RC_GF_NORTH_TARGET_WEST_CRATE, logic->IsAdult || (logic->BlastOrSmash() || logic->HookshotOrBoomerang() || logic->CanUse(RG_HOVER_BOOTS))), LOCATION(RC_GF_NORTH_TARGET_WEST_CRATE,
//implies logic->CanBreakCrates() 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_NORTH_TARGET_CHILD_CRATE, logic->IsChild && logic->BlastOrSmash()),
LOCATION(RC_GF_SOUTH_TARGET_EAST_CRATE, logic->CanBreakCrates()), LOCATION(RC_GF_SOUTH_TARGET_EAST_CRATE, logic->CanBreakCrates()),
LOCATION(RC_GF_SOUTH_TARGET_WEST_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);}), // 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, { areaTable[RR_GF_OUTSIDE_GATE] =
//Events Region("GF Outside Gate", "Gerudo Fortress", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE,
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*/);}), {
}, {}, { // Events
//Exits EventAccess(&logic->GF_GateOpen,
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;}), 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, { areaTable[RR_GF_STORMS_GROTTO] = Region("GF Storms Grotto", "GF Storms Grotto", {}, NO_DAY_NIGHT_CYCLE,
//Events {
EventAccess(&logic->FreeFairies, []{return true;}), // Events
}, { EventAccess(&logic->FreeFairies, [] { return true; }),
//Locations },
{
// Locations
LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_1, true), LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_1, true),
LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_2, true), LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_2, true),
LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_3, true), LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_3, true),
@ -240,8 +339,9 @@ void RegionTable_Init_GerudoFortress() {
LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_6, true), LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_6, true),
LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_7, true), LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_7, true),
LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_8, true), LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_8, true),
}, { },
//Exits {
Entrance(RR_GF_NEAR_GROTTO, []{return true;}), // Exits
Entrance(RR_GF_NEAR_GROTTO, [] { return true; }),
}); });
} }

View file

@ -4,30 +4,50 @@
using namespace Rando; using namespace Rando;
void RegionTable_Init_ThievesHideout() { 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, { areaTable[RR_TH_1_TORCH_CELL] = Region(
//Events "Thieves Hideout 1 Torch Cell", "Thieves Hideout", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE,
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;}), // Events
}, { EventAccess(&logic->THCouldFree1TorchCarpenter, [] { return logic->CanKillEnemy(RE_GERUDO_WARRIOR); }),
//Locations 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_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)),
LOCATION(RC_TH_1_TORCH_CELL_RIGHT_POT, logic->CanBreakPots()), 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_MID_POT, logic->CanBreakPots()),
LOCATION(RC_TH_1_TORCH_CELL_LEFT_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_1_TORCH_CELL_CRATE, logic->CanBreakCrates()),
LOCATION(RC_TH_FREED_CARPENTERS, logic->THRescuedAllCarpenters), LOCATION(RC_TH_FREED_CARPENTERS, logic->THRescuedAllCarpenters),
}, { },
//Exits {
Entrance(RR_GF_OUTSKIRTS, []{return true;}), // Exits
Entrance(RR_GF_NEAR_GROTTO, []{return true;}), 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, { areaTable[RR_TH_DOUBLE_CELL] = Region(
//Events "Thieves Hideout Double Cell", "Thieves Hideout", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE,
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;}), // Events
}, { EventAccess(&logic->THCouldFreeDoubleCellCarpenter, [] { return logic->CanKillEnemy(RE_GERUDO_WARRIOR); }),
//Locations 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_DOUBLE_CELL_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)),
LOCATION(RC_TH_NEAR_DOUBLE_CELL_RIGHT_POT, logic->CanBreakPots()), 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_MID_POT, logic->CanBreakPots()),
@ -39,101 +59,144 @@ void RegionTable_Init_ThievesHideout() {
LOCATION(RC_TH_DOUBLE_CELL_LEFT_CRATE, logic->CanBreakCrates()), LOCATION(RC_TH_DOUBLE_CELL_LEFT_CRATE, logic->CanBreakCrates()),
LOCATION(RC_TH_DOUBLE_CELL_RIGHT_CRATE, logic->CanBreakCrates()), LOCATION(RC_TH_DOUBLE_CELL_RIGHT_CRATE, logic->CanBreakCrates()),
LOCATION(RC_TH_FREED_CARPENTERS, logic->THRescuedAllCarpenters), LOCATION(RC_TH_FREED_CARPENTERS, logic->THRescuedAllCarpenters),
}, { },
//Exits {
Entrance(RR_GF_OUTSKIRTS, []{return true;}), // Exits
Entrance(RR_GF_NEAR_GROTTO, []{return true;}), 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, { areaTable[RR_TH_DEAD_END_CELL] = Region(
//Events "Thieves Hideout Dead End Cell", "Thieves Hideout", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE,
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;}), // Events
}, { EventAccess(&logic->TH_CouldFreeDeadEndCarpenter, [] { return logic->CanKillEnemy(RE_GERUDO_WARRIOR); }),
//Locations 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_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)),
LOCATION(RC_TH_DEAD_END_CELL_CRATE, logic->CanBreakCrates()), LOCATION(RC_TH_DEAD_END_CELL_CRATE, logic->CanBreakCrates()),
LOCATION(RC_TH_FREED_CARPENTERS, logic->THRescuedAllCarpenters), LOCATION(RC_TH_FREED_CARPENTERS, logic->THRescuedAllCarpenters),
}, { },
//Exits {
Entrance(RR_GF_BELOW_GS, []{return true;}), // 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, { areaTable[RR_TH_STEEP_SLOPE_CELL] = Region(
//Events "Thieves Hideout Steep Slope Cell", "Thieves Hideout", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE,
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;}), // Events
}, { EventAccess(&logic->THCouldRescueSlopeCarpenter, [] { return logic->CanKillEnemy(RE_GERUDO_WARRIOR); }),
//Locations 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_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)),
LOCATION(RC_TH_STEEP_SLOPE_RIGHT_POT, logic->CanBreakPots()), LOCATION(RC_TH_STEEP_SLOPE_RIGHT_POT, logic->CanBreakPots()),
LOCATION(RC_TH_STEEP_SLOPE_LEFT_POT, logic->CanBreakPots()), LOCATION(RC_TH_STEEP_SLOPE_LEFT_POT, logic->CanBreakPots()),
LOCATION(RC_TH_FREED_CARPENTERS, logic->THRescuedAllCarpenters), LOCATION(RC_TH_FREED_CARPENTERS, logic->THRescuedAllCarpenters),
}, { },
//Exits {
Entrance(RR_GF_ABOVE_GTG, []{return true;}), // Exits
Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true;}), 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, {}, { areaTable[RR_TH_KITCHEN_CORRIDOR] =
//Locations 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_LEFTMOST_CRATE, logic->CanBreakCrates()),
LOCATION(RC_TH_NEAR_KITCHEN_MID_LEFT_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_MID_RIGHT_CRATE, logic->CanBreakCrates()),
LOCATION(RC_TH_NEAR_KITCHEN_RIGHTMOST_CRATE, logic->CanBreakCrates()), LOCATION(RC_TH_NEAR_KITCHEN_RIGHTMOST_CRATE, logic->CanBreakCrates()),
}, { },
//Exits {
Entrance(RR_GF_NEAR_GROTTO, []{return true;}), // Exits
Entrance(RR_GF_ABOVE_GTG, []{return true;}), Entrance(RR_GF_NEAR_GROTTO, [] { return true; }),
Entrance(RR_TH_KITCHEN_MAIN, []{return logic->CanPassEnemy(RE_GERUDO_GUARD);}), 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, {}, { areaTable[RR_TH_KITCHEN_MAIN] = Region(
//Locations "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_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_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_CRATE, logic->CanBreakCrates() && logic->CanPassEnemy(RE_GERUDO_GUARD)),
LOCATION(RC_TH_KITCHEN_SUN_FAIRY, logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->CanUse(RG_SUNS_SONG)), 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);}), // Exits
Entrance(RR_TH_KITCHEN_TOP, []{return logic->CanPassEnemy(RE_GERUDO_GUARD);}), 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, {}, { areaTable[RR_TH_KITCHEN_TOP] =
//Locations 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_1, logic->CanUse(RG_BOOMERANG)),
LOCATION(RC_TH_KITCHEN_POT_2, logic->CanUse(RG_BOOMERANG)), LOCATION(RC_TH_KITCHEN_POT_2, logic->CanUse(RG_BOOMERANG)),
}, { },
//Exits {
Entrance(RR_TH_KITCHEN_MAIN, []{return true;}), // Exits
//hookshot to cross using the rafters is implied in logic->CanPassEnemy(RE_GERUDO_GUARD) Entrance(RR_TH_KITCHEN_MAIN, [] { return true; }),
Entrance(RR_GF_NEAR_GS, []{return logic->CanPassEnemy(RE_GERUDO_GUARD) || logic->CanUse(RG_HOVER_BOOTS);}), // hookshot to cross using the rafters is implied in logic->CanPassEnemy(RE_GERUDO_GUARD)
Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return logic->CanPassEnemy(RE_GERUDO_GUARD) || logic->CanUse(RG_HOVER_BOOTS);}), 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, {}, { areaTable[RR_TH_BREAK_ROOM] =
//Locations Region("Thieves Hideout Break Room", "Thieves Hideout", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {},
LOCATION(RC_TH_BREAK_ROOM_FRONT_POT, (logic->CanPassEnemy(RE_BREAK_ROOM_GUARD) && logic->CanBreakPots()) || {
// 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))), (logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->CanUse(RG_BOOMERANG))),
LOCATION(RC_TH_BREAK_ROOM_BACK_POT, (logic->CanPassEnemy(RE_BREAK_ROOM_GUARD) && logic->CanBreakPots()) || LOCATION(RC_TH_BREAK_ROOM_BACK_POT,
(logic->CanPassEnemy(RE_BREAK_ROOM_GUARD) && logic->CanBreakPots()) ||
(logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->CanUse(RG_BOOMERANG))), (logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->CanUse(RG_BOOMERANG))),
LOCATION(RC_TH_BREAK_HALLWAY_OUTER_CRATE, logic->CanBreakCrates()), LOCATION(RC_TH_BREAK_HALLWAY_OUTER_CRATE, logic->CanBreakCrates()),
LOCATION(RC_TH_BREAK_HALLWAY_INNER_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()) || LOCATION(RC_TH_BREAK_ROOM_RIGHT_CRATE,
(logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->HasExplosives() && logic->CanUse(RG_BOOMERANG))), (logic->CanPassEnemy(RE_BREAK_ROOM_GUARD) && logic->CanBreakCrates()) ||
LOCATION(RC_TH_BREAK_ROOM_LEFT_CRATE, (logic->CanPassEnemy(RE_BREAK_ROOM_GUARD) && logic->CanBreakCrates()) || (logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->HasExplosives() &&
(logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->HasExplosives() && logic->CanUse(RG_BOOMERANG))), logic->CanUse(RG_BOOMERANG))),
}, { LOCATION(RC_TH_BREAK_ROOM_LEFT_CRATE,
//Exits (logic->CanPassEnemy(RE_BREAK_ROOM_GUARD) && logic->CanBreakCrates()) ||
Entrance(RR_GF_BELOW_CHEST, []{return logic->CanPassEnemy(RE_GERUDO_GUARD);}), (logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->HasExplosives() &&
//Implies logic->CanPassEnemy(RE_GERUDO_GUARD) logic->CanUse(RG_BOOMERANG))),
Entrance(RR_TH_BREAK_ROOM_CORRIDOR, []{return logic->CanUse(RG_HOOKSHOT);}), },
{
// 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, {}, {}, { areaTable[RR_TH_BREAK_ROOM_CORRIDOR] =
//Exits Region("Thieves Hideout Break Room", "Thieves Hideout", { RA_GERUDO_FORTRESS }, NO_DAY_NIGHT_CYCLE, {}, {},
Entrance(RR_TH_BREAK_ROOM, []{return logic->CanUse(RG_HOOKSHOT);}), {
Entrance(RR_GF_ABOVE_JAIL, []{return true;}), // Exits
Entrance(RR_TH_BREAK_ROOM, [] { return logic->CanUse(RG_HOOKSHOT); }),
Entrance(RR_GF_ABOVE_JAIL, [] { return true; }),
}); });
} }

View file

@ -846,7 +846,8 @@ bool Logic::CanPassEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wal
case RE_OCTOROK: case RE_OCTOROK:
return true; return true;
case RE_GERUDO_GUARD: 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: case RE_BREAK_ROOM_GUARD:
return HasItem(RG_GERUDO_MEMBERSHIP_CARD) || CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT); return HasItem(RG_GERUDO_MEMBERSHIP_CARD) || CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT);
case RE_BIG_SKULLTULA: case RE_BIG_SKULLTULA:
@ -1275,14 +1276,14 @@ bool Logic::HasFireSourceWithTorch() {
return HasFireSource() || CanUse(RG_STICKS); return HasFireSource() || CanUse(RG_STICKS);
} }
//Is this best off signaling what you have already traded, or what step you are currently on? // Is this best off signaling what you have already traded, or what step you are currently on?
bool Logic::TradeQuestStep(RandomizerGet rg){ bool Logic::TradeQuestStep(RandomizerGet rg) {
if (ctx->GetOption(RSK_SHUFFLE_ADULT_TRADE)){ if (ctx->GetOption(RSK_SHUFFLE_ADULT_TRADE)) {
return false; //This does not apply when we are shuffling trade items return false; // This does not apply when we are shuffling trade items
} }
bool hasState = false; bool hasState = false;
//Falling through each case to test each possibility // Falling through each case to test each possibility
switch (rg){ switch (rg) {
case RG_POCKET_EGG: case RG_POCKET_EGG:
hasState = hasState || HasItem(RG_POCKET_EGG); hasState = hasState || HasItem(RG_POCKET_EGG);
[[fallthrough]]; [[fallthrough]];
@ -1311,12 +1312,13 @@ bool Logic::HasFireSourceWithTorch() {
hasState = hasState || HasItem(RG_CLAIM_CHECK); hasState = hasState || HasItem(RG_CLAIM_CHECK);
break; break;
default: default:
SPDLOG_ERROR("TradeQuestStep reached `return false;`. Missing case for RandomizerGet of {}", static_cast<uint32_t>(rg)); SPDLOG_ERROR("TradeQuestStep reached `return false;`. Missing case for RandomizerGet of {}",
static_cast<uint32_t>(rg));
assert(false); assert(false);
return false; return false;
} }
return hasState; return hasState;
} }
bool Logic::CanStandingShield() { bool Logic::CanStandingShield() {
return CanUse(RG_MIRROR_SHIELD) || (IsAdult && HasItem(RG_HYLIAN_SHIELD)) || CanUse(RG_DEKU_SHIELD); return CanUse(RG_MIRROR_SHIELD) || (IsAdult && HasItem(RG_HYLIAN_SHIELD)) || CanUse(RG_DEKU_SHIELD);
@ -2461,7 +2463,7 @@ void Logic::Reset() {
AtNight = false; AtNight = false;
GetSaveContext()->linkAge = !ctx->GetOption(RSK_SELECTED_STARTING_AGE).Get(); GetSaveContext()->linkAge = !ctx->GetOption(RSK_SELECTED_STARTING_AGE).Get();
//Events // Events
ShowedMidoSwordAndShield = false; ShowedMidoSwordAndShield = false;
THCouldFree1TorchCarpenter = false; THCouldFree1TorchCarpenter = false;
THCouldFreeDoubleCellCarpenter = false; THCouldFreeDoubleCellCarpenter = false;
@ -2518,7 +2520,7 @@ void Logic::Reset() {
MQWaterStalfosPit = false; MQWaterStalfosPit = false;
MQWaterDragonTorches = false; MQWaterDragonTorches = false;
MQWaterB1Switch = false; MQWaterB1Switch = false;
//MQWaterPillarSoTBlock = false; // MQWaterPillarSoTBlock = false;
MQWaterOpenedPillarB1 = false; MQWaterOpenedPillarB1 = false;
MQSpiritCrawlBoulder = false; MQSpiritCrawlBoulder = false;
MQSpiritMapRoomEnemies = false; MQSpiritMapRoomEnemies = false;

View file

@ -573,9 +573,9 @@ void Settings::CreateOptions() {
"Sneak Past Moving Gerudo Guards with No Items", "Sneak Past Moving Gerudo Guards with No Items",
"The logic normally guarantees Bow or Hookshot to stun them from a distance," "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"); "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 }, OPT_TRICK(RT_GF_JUMP, RCQUEST_BOTH, RA_GERUDO_FORTRESS, { Tricks::Tag::NOVICE }, "Gerudo\'s Fortress Ledge Jumps",
"Gerudo\'s Fortress Ledge Jumps", "It is possible to navigate the rooves of Fortress with unintuative jumps to reach additional areas "
"It is possible to navigate the rooves of Fortress with unintuative jumps to reach additional areas without going inside."); "without going inside.");
OPT_TRICK(RT_GF_WARRIOR_WITH_DIFFICULT_WEAPON, RCQUEST_BOTH, RA_GERUDO_FORTRESS, { Tricks::Tag::NOVICE }, OPT_TRICK(RT_GF_WARRIOR_WITH_DIFFICULT_WEAPON, RCQUEST_BOTH, RA_GERUDO_FORTRESS, { Tricks::Tag::NOVICE },
"Gerudo\'s Fortress Warriors with Difficult Weapons", "Gerudo\'s Fortress Warriors with Difficult Weapons",
"Warriors can be defeated with Slingshot or Bombchus."); "Warriors can be defeated with Slingshot or Bombchus.");