Win/Clear could be just Clear & kept simple if bosses were in CanKillEnemy
This commit is contained in:
Demur Rumed 2025-01-26 15:03:19 +00:00
parent 53199d03af
commit 728fa9f285
33 changed files with 311 additions and 174 deletions

View File

@ -1083,23 +1083,11 @@ void GenerateItemPool() {
}
if (ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS)) {
AddItemToMainPool(RG_GOHMA_SOUL);
AddItemToMainPool(RG_KING_DODONGO_SOUL);
AddItemToMainPool(RG_BARINADE_SOUL);
AddItemToMainPool(RG_PHANTOM_GANON_SOUL);
AddItemToMainPool(RG_VOLVAGIA_SOUL);
AddItemToMainPool(RG_MORPHA_SOUL);
AddItemToMainPool(RG_BONGO_BONGO_SOUL);
AddItemToMainPool(RG_TWINROVA_SOUL);
for (int rg = RG_GOHMA_SOUL; rg <= RG_TWINROVA_SOUL; rg++) {
AddItemToMainPool((RandomizerGet)rg);
ctx->possibleIceTrapModels.push_back((RandomizerGet)rg);
}
ctx->possibleIceTrapModels.push_back(RG_GOHMA_SOUL);
ctx->possibleIceTrapModels.push_back(RG_KING_DODONGO_SOUL);
ctx->possibleIceTrapModels.push_back(RG_BARINADE_SOUL);
ctx->possibleIceTrapModels.push_back(RG_PHANTOM_GANON_SOUL);
ctx->possibleIceTrapModels.push_back(RG_VOLVAGIA_SOUL);
ctx->possibleIceTrapModels.push_back(RG_MORPHA_SOUL);
ctx->possibleIceTrapModels.push_back(RG_BONGO_BONGO_SOUL);
ctx->possibleIceTrapModels.push_back(RG_TWINROVA_SOUL);
if (ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS).Is(RO_BOSS_SOULS_ON_PLUS_GANON)) {
AddItemToMainPool(RG_GANON_SOUL);
ctx->possibleIceTrapModels.push_back(RG_GANON_SOUL);

View File

@ -325,7 +325,7 @@ void Rando::StaticData::InitItemTable() {
// NPC souls
itemTable[RG_ANJU_SOUL] = Item(RG_ANJU_SOUL, Text{ "Anju's Soul", "Âme de Anju", "Anjus Seele" }, ITEMTYPE_ITEM, 0xE5, true, LOGIC_CAN_SUMMON_MORPHA, RHT_MORPHA_SOUL, RG_ANJU_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER);
itemTable[RG_ANJU_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul);
itemTable[RG_TALON_SOUL] = Item(RG_ANJU_SOUL, Text{ "Talon's Soul" }, ITEMTYPE_ITEM, 0xE5, true, LOGIC_CAN_SUMMON_MORPHA, RHT_MORPHA_SOUL, RG_ANJU_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER);
itemTable[RG_TALON_SOUL] = Item(RG_TALON_SOUL, Text{ "Talon's Soul" }, ITEMTYPE_ITEM, 0xE5, true, LOGIC_CAN_SUMMON_MORPHA, RHT_MORPHA_SOUL, RG_TALON_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER);
itemTable[RG_TALON_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul);
itemTable[RG_GROG_SOUL] = Item(RG_GROG_SOUL, Text{ "Grog's Soul" }, ITEMTYPE_ITEM, 0xE5, true, LOGIC_CAN_SUMMON_MORPHA, RHT_MORPHA_SOUL, RG_GROG_SOUL, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER);
itemTable[RG_GROG_SOUL].SetCustomDrawFunc(Randomizer_DrawBossSoul);

View File

@ -350,7 +350,7 @@ void RegionTable_Init_DekuTree() {
areaTable[RR_DEKU_TREE_BOSS_ROOM] = Region("Deku Tree Boss Room", "Deku Tree", {}, NO_DAY_NIGHT_CYCLE, {
// Events
EventAccess(&logic->DekuTreeClear, []{return logic->DekuTreeClear || (logic->HasBossSoul(RG_GOHMA_SOUL) && (logic->CanJumpslashExceptHammer() && (logic->CanUse(RG_NUTS) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->HookshotOrBoomerang())));}),
EventAccess(&logic->DekuTreeClear, []{return logic->DekuTreeClear || (logic->HasSoul(RG_GOHMA_SOUL) && (logic->CanJumpslashExceptHammer() && (logic->CanUse(RG_NUTS) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->HookshotOrBoomerang())));}),
}, {
// Locations
LOCATION(RC_QUEEN_GOHMA, logic->DekuTreeClear),

View File

@ -528,7 +528,7 @@ void RegionTable_Init_DodongosCavern() {
areaTable[RR_DODONGOS_CAVERN_BOSS_ROOM] = Region("Dodongos Cavern Boss Room", "Dodongos Cavern", {}, NO_DAY_NIGHT_CYCLE, {
// Events
EventAccess(&logic->DodongosCavernClear, []{return logic->DodongosCavernClear || (logic->HasBossSoul(RG_KING_DODONGO_SOUL) && (Here(RR_DODONGOS_CAVERN_BOSS_ROOM, []{return logic->HasExplosives() || (logic->CanUse(RG_MEGATON_HAMMER) && ctx->GetTrickOption(RT_DC_HAMMER_FLOOR));}) && (logic->CanUse(RG_BOMB_BAG) || logic->HasItem(RG_GORONS_BRACELET)) && logic->CanJumpslashExceptHammer())); /*todo add chu kill to tricks*/}),
EventAccess(&logic->DodongosCavernClear, []{return logic->DodongosCavernClear || (logic->HasSoul(RG_KING_DODONGO_SOUL) && (Here(RR_DODONGOS_CAVERN_BOSS_ROOM, []{return logic->HasExplosives() || (logic->CanUse(RG_MEGATON_HAMMER) && ctx->GetTrickOption(RT_DC_HAMMER_FLOOR));}) && (logic->CanUse(RG_BOMB_BAG) || logic->HasItem(RG_GORONS_BRACELET)) && logic->CanJumpslashExceptHammer())); /*todo add chu kill to tricks*/}),
}, {
// Locations
LOCATION(RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, true),

View File

@ -705,14 +705,15 @@ void RegionTable_Init_FireTemple() {
areaTable[RR_FIRE_TEMPLE_BOSS_ROOM] = Region("Fire Temple Boss Room", "Fire Temple", {}, NO_DAY_NIGHT_CYCLE, {
// Events
EventAccess(&logic->FireTempleClear, []{return logic->FireTempleClear || (logic->HasBossSoul(RG_VOLVAGIA_SOUL) && (logic->FireTimer() >= 64 && logic->CanUse(RG_MEGATON_HAMMER)));}),
EventAccess(&logic->FireTempleWin, []{return logic->FireTempleWin || (logic->HasSoul(RG_VOLVAGIA_SOUL) && (logic->FireTimer() >= 64 && logic->CanUse(RG_MEGATON_HAMMER)));}),
EventAccess(&logic->FireTempleClear, []{return logic->FireTempleWin && logic->HasSoul(RG_DARUNIA_SOUL);}),
}, {
// Locations
LOCATION(RC_FIRE_TEMPLE_VOLVAGIA_HEART, logic->FireTempleClear),
LOCATION(RC_FIRE_TEMPLE_VOLVAGIA_HEART, logic->FireTempleWin),
LOCATION(RC_VOLVAGIA, logic->FireTempleClear),
}, {
// Exits
Entrance(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, []{return false;}),
Entrance(RR_DMC_CENTRAL_LOCAL, []{return logic->FireTempleClear;}, false),
Entrance(RR_DMC_CENTRAL_LOCAL, []{return logic->FireTempleWin;}, false),
});
}

View File

@ -600,14 +600,15 @@ void RegionTable_Init_ForestTemple() {
areaTable[RR_FOREST_TEMPLE_BOSS_ROOM] = Region("Forest Temple Boss Room", "Forest Temple", {}, NO_DAY_NIGHT_CYCLE, {
// Events
EventAccess(&logic->ForestTempleClear, []{return logic->ForestTempleClear || (logic->HasBossSoul(RG_PHANTOM_GANON_SOUL) && ((logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD)) && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT))));}),
EventAccess(&logic->ForestTempleWin, []{return logic->ForestTempleWin || (logic->HasSoul(RG_PHANTOM_GANON_SOUL) && ((logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD)) && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT))));}),
EventAccess(&logic->ForestTempleClear, []{return logic->ForestTempleWin && logic->HasSoul(RG_SARIA_SOUL);}),
}, {
// Locations
LOCATION(RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, logic->ForestTempleClear),
LOCATION(RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, logic->ForestTempleWin),
LOCATION(RC_PHANTOM_GANON, logic->ForestTempleClear),
}, {
// Exits
Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, []{return false;}),
Entrance(RR_SACRED_FOREST_MEADOW, []{return logic->ForestTempleClear;}, false),
Entrance(RR_SACRED_FOREST_MEADOW, []{return logic->ForestTempleWin;}, false),
});
}

View File

@ -480,7 +480,7 @@ void RegionTable_Init_GanonsCastle() {
areaTable[RR_GANONS_TOWER_GANONDORF_LAIR] = Region("Ganondorf's Lair", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_GANONDORF_HINT, logic->HasBossSoul(RG_GANON_SOUL)),
LOCATION(RC_GANONDORF_HINT, logic->HasSoul(RG_GANON_SOUL)),
}, {
//Exits
Entrance(RR_GANONS_CASTLE_ESCAPE, []{return logic->CanKillEnemy(RE_GANONDORF);}),

View File

@ -24,7 +24,7 @@ void RegionTable_Init_JabuJabusBelly() {
//Combines Lift room middle and lower, 1F holes room, the forked corridor, and it's side rooms
areaTable[RR_JABU_JABUS_BELLY_MAIN] = Region("Jabu Jabus Belly Main", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {
//Events
EventAccess(&logic->JabuRutoInB1, []{return true;}),
EventAccess(&logic->JabuRutoInB1, []{return logic->HasSoul(RG_RUTO_SOUL);}),
EventAccess(&logic->JabuWestTentacle, []{return logic->JabuRutoIn1F && logic->CanKillEnemy(RE_TENTACLE, ED_BOOMERANG);}),
}, {
//Locations
@ -46,7 +46,7 @@ void RegionTable_Init_JabuJabusBelly() {
//contains B1 of hole room (aside from the ledge leading to big octo), 2 octorock room and north water switch room
areaTable[RR_JABU_JABUS_BELLY_B1_NORTH] = Region("Jabu Jabus Belly B1 North", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {
//Events
EventAccess(&logic->JabuRutoIn1F, []{return logic->IsAdult || logic->HasItem(RG_BRONZE_SCALE);}),
EventAccess(&logic->JabuRutoIn1F, []{return logic->HasSoul(RG_RUTO_SOUL) && (logic->IsAdult || logic->HasItem(RG_BRONZE_SCALE));}),
EventAccess(&logic->FairyPot, []{return logic->CanUse(RG_BOOMERANG) || (logic->CanUse(RG_HOVER_BOOTS) && logic->CanKillEnemy(RE_OCTOROK));}),
}, {
//Locations
@ -341,7 +341,7 @@ void RegionTable_Init_JabuJabusBelly() {
areaTable[RR_JABU_JABUS_BELLY_BOSS_ROOM] = Region("Jabu Jabus Belly Boss Room", "Jabu Jabus Belly", {}, NO_DAY_NIGHT_CYCLE, {
// Events //todo: add pot kill trick
EventAccess(&logic->JabuJabusBellyClear, []{return logic->JabuJabusBellyClear || (logic->HasBossSoul(RG_BARINADE_SOUL) && (logic->CanUse(RG_BOOMERANG) && logic->CanJumpslashExceptHammer()));}),
EventAccess(&logic->JabuJabusBellyClear, []{return logic->JabuJabusBellyClear || (logic->HasSoul(RG_BARINADE_SOUL) && (logic->CanUse(RG_BOOMERANG) && logic->CanJumpslashExceptHammer()));}),
}, {
// Locations
LOCATION(RC_JABU_JABUS_BELLY_BARINADE_POT_1, logic->CanBreakPots()),

View File

@ -399,18 +399,19 @@ void RegionTable_Init_ShadowTemple() {
areaTable[RR_SHADOW_TEMPLE_BOSS_ROOM] = Region("Shadow Temple Boss Room", "Shadow Temple", {}, NO_DAY_NIGHT_CYCLE, {
// Events
EventAccess(&logic->ShadowTempleClear, []{
return logic->ShadowTempleClear || (logic->HasBossSoul(RG_BONGO_BONGO_SOUL) && ((logic->CanUse(RG_LENS_OF_TRUTH) || ctx->GetTrickOption(RT_LENS_BONGO)) &&
EventAccess(&logic->ShadowTempleWin, []{
return logic->ShadowTempleWin || (logic->HasSoul(RG_BONGO_BONGO_SOUL) && ((logic->CanUse(RG_LENS_OF_TRUTH) || ctx->GetTrickOption(RT_LENS_BONGO)) &&
(logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD)) &&
(logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT) || ctx->GetTrickOption(RT_SHADOW_BONGO))));
}),
EventAccess(&logic->ShadowTempleClear, []{ return logic->ShadowTempleWin && logic->HasSoul(RG_IMPA_SOUL); }),
}, {
// Locations
LOCATION(RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, logic->ShadowTempleClear),
LOCATION(RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, logic->ShadowTempleWin),
LOCATION(RC_BONGO_BONGO, logic->ShadowTempleClear),
}, {
// Exits
Entrance(RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, []{return false;}),
Entrance(RR_GRAVEYARD_WARP_PAD_REGION, []{return logic->ShadowTempleClear;}, false),
Entrance(RR_GRAVEYARD_WARP_PAD_REGION, []{return logic->ShadowTempleWin;}, false),
});
}

View File

@ -544,14 +544,15 @@ void RegionTable_Init_SpiritTemple() {
areaTable[RR_SPIRIT_TEMPLE_BOSS_ROOM] = Region("Spirit Temple Boss Room", "Spirit Temple", {}, NO_DAY_NIGHT_CYCLE, {
// Events
EventAccess(&logic->SpiritTempleClear, []{return logic->SpiritTempleClear || (logic->HasBossSoul(RG_TWINROVA_SOUL) && (logic->CanUse(RG_MIRROR_SHIELD) && (logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD))));}),
EventAccess(&logic->SpiritTempleWin, []{return logic->SpiritTempleWin || (logic->HasSoul(RG_TWINROVA_SOUL) && (logic->CanUse(RG_MIRROR_SHIELD) && (logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD))));}),
EventAccess(&logic->SpiritTempleClear, []{return logic->SpiritTempleWin && logic->HasSoul(RG_NABOORU_SOUL);}),
}, {
// Locations
LOCATION(RC_SPIRIT_TEMPLE_TWINROVA_HEART, logic->SpiritTempleClear),
LOCATION(RC_SPIRIT_TEMPLE_TWINROVA_HEART, logic->SpiritTempleWin),
LOCATION(RC_TWINROVA, logic->SpiritTempleClear),
}, {
// Exits
Entrance(RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, []{return false;}),
Entrance(RR_DESERT_COLOSSUS, []{return logic->SpiritTempleClear;}, false),
Entrance(RR_DESERT_COLOSSUS, []{return logic->SpiritTempleWin;}, false),
});
}

View File

@ -725,14 +725,15 @@ void RegionTable_Init_WaterTemple() {
areaTable[RR_WATER_TEMPLE_BOSS_ROOM] = Region("Water Temple Boss Room", "Water Temple", {}, NO_DAY_NIGHT_CYCLE, {
// Events
EventAccess(&logic->WaterTempleClear, []{return logic->WaterTempleClear || (logic->HasBossSoul(RG_MORPHA_SOUL) && (logic->CanUse(RG_HOOKSHOT) && (logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD))));}),
EventAccess(&logic->WaterTempleWin, []{return logic->WaterTempleWin || (logic->HasSoul(RG_MORPHA_SOUL) && (logic->CanUse(RG_HOOKSHOT) && (logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD))));}),
EventAccess(&logic->WaterTempleClear, []{return logic->WaterTempleWin && logic->HasSoul(RG_RUTO_SOUL);}),
}, {
// Locations
LOCATION(RC_WATER_TEMPLE_MORPHA_HEART, logic->WaterTempleClear),
LOCATION(RC_WATER_TEMPLE_MORPHA_HEART, logic->WaterTempleWin),
LOCATION(RC_MORPHA, logic->WaterTempleClear),
}, {
// Exits
Entrance(RR_WATER_TEMPLE_BOSS_ENTRYWAY, []{return false;}),
Entrance(RR_LAKE_HYLIA, []{return logic->WaterTempleClear;}, false),
Entrance(RR_LAKE_HYLIA, []{return logic->WaterTempleWin;}, false),
});
}

View File

@ -20,7 +20,7 @@ void RegionTable_Init_CastleGrounds() {
EventAccess(&logic->BugRock, []{return true;}),
}, {
//Locations
LOCATION(RC_HC_MALON_EGG, true),
LOCATION(RC_HC_MALON_EGG, logic->HasSoul(RG_MALON_SOUL)),
LOCATION(RC_HC_GS_TREE, logic->IsChild && logic->CanAttack()),
LOCATION(RC_HC_MALON_GOSSIP_STONE_FAIRY, logic->CallGossipFairy()),
LOCATION(RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)),
@ -47,7 +47,7 @@ void RegionTable_Init_CastleGrounds() {
areaTable[RR_HC_GREAT_FAIRY_FOUNTAIN] = Region("HC Great Fairy Fountain", "HC Great Fairy Fountain", {}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_HC_GREAT_FAIRY_REWARD, logic->CanUse(RG_ZELDAS_LULLABY)),
LOCATION(RC_HC_GREAT_FAIRY_REWARD, logic->HasSoul(RG_GREAT_FAIRY_SOUL) && logic->CanUse(RG_ZELDAS_LULLABY)),
}, {
//Exits
Entrance(RR_CASTLE_GROUNDS, []{return true;}),
@ -97,7 +97,7 @@ void RegionTable_Init_CastleGrounds() {
areaTable[RR_OGC_GREAT_FAIRY_FOUNTAIN] = Region("OGC Great Fairy Fountain", "OGC Great Fairy Fountain", {}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_OGC_GREAT_FAIRY_REWARD, logic->CanUse(RG_ZELDAS_LULLABY)),
LOCATION(RC_OGC_GREAT_FAIRY_REWARD, logic->HasSoul(RG_GREAT_FAIRY_SOUL) && logic->CanUse(RG_ZELDAS_LULLABY)),
}, {
//Exits
Entrance(RR_CASTLE_GROUNDS, []{return true;}),

View File

@ -98,7 +98,7 @@ void RegionTable_Init_DeathMountainCrater() {
areaTable[RR_DMC_GREAT_FAIRY_FOUNTAIN] = Region("DMC Great Fairy Fountain", "DMC Great Fairy Fountain", {}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_DMC_GREAT_FAIRY_REWARD, logic->CanUse(RG_ZELDAS_LULLABY)),
LOCATION(RC_DMC_GREAT_FAIRY_REWARD, logic->HasSoul(RG_GREAT_FAIRY_SOUL) && logic->CanUse(RG_ZELDAS_LULLABY)),
}, {
//Exits
Entrance(RR_DMC_LOWER_LOCAL, []{return true;}),

View File

@ -46,14 +46,14 @@ void RegionTable_Init_DeathMountainTrail() {
//Exits
Entrance(RR_DEATH_MOUNTAIN_TRAIL, []{return true;}),
Entrance(RR_DMC_UPPER_LOCAL, []{return true;}),
Entrance(RR_DMT_OWL_FLIGHT, []{return logic->IsChild;}, false),
Entrance(RR_DMT_OWL_FLIGHT, []{return logic->IsChild && logic->HasSoul(RG_KAEPORA_SOUL);}),
Entrance(RR_DMT_COW_GROTTO, []{return Here(RR_DEATH_MOUNTAIN_SUMMIT, []{return logic->BlastOrSmash();});}),
Entrance(RR_DMT_GREAT_FAIRY_FOUNTAIN, []{return Here(RR_DEATH_MOUNTAIN_SUMMIT, []{return logic->BlastOrSmash();});}),
});
areaTable[RR_DMT_OWL_FLIGHT] = Region("DMT Owl Flight", "Death Mountain", {RA_DEATH_MOUNTAIN_TRAIL}, NO_DAY_NIGHT_CYCLE, {}, {}, {
//Exits
Entrance(RR_KAK_IMPAS_ROOFTOP, []{return true;}),
Entrance(RR_KAK_IMPAS_ROOFTOP, []{return true;}, false),
});
areaTable[RR_DMT_COW_GROTTO] = Region("DMT Cow Grotto", "DMT Cow Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, {
@ -93,7 +93,7 @@ void RegionTable_Init_DeathMountainTrail() {
areaTable[RR_DMT_GREAT_FAIRY_FOUNTAIN] = Region("DMT Great Fairy Fountain", "DMT Great Fairy Fountain", {}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_DMT_GREAT_FAIRY_REWARD, logic->CanUse(RG_ZELDAS_LULLABY)),
LOCATION(RC_DMT_GREAT_FAIRY_REWARD, logic->HasSoul(RG_GREAT_FAIRY_SOUL) && logic->CanUse(RG_ZELDAS_LULLABY)),
}, {
//Exits
Entrance(RR_DEATH_MOUNTAIN_SUMMIT, []{return true;}),

View File

@ -59,7 +59,7 @@ void RegionTable_Init_DesertColossus() {
areaTable[RR_COLOSSUS_GREAT_FAIRY_FOUNTAIN] = Region("Colossus Great Fairy Fountain", "Colossus Great Fairy Fountain", {}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_COLOSSUS_GREAT_FAIRY_REWARD, logic->CanUse(RG_ZELDAS_LULLABY)),
LOCATION(RC_COLOSSUS_GREAT_FAIRY_REWARD, logic->HasSoul(RG_GREAT_FAIRY_SOUL) && logic->CanUse(RG_ZELDAS_LULLABY)),
}, {
//Exits
Entrance(RR_DESERT_COLOSSUS, []{return true;}),

View File

@ -63,7 +63,7 @@ void RegionTable_Init_GerudoValley() {
areaTable[RR_GV_FORTRESS_SIDE] = Region("GV Fortress Side", "Gerudo Valley", {RA_GERUDO_VALLEY}, DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_GV_CHEST, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)),
LOCATION(RC_GV_TRADE_SAW, logic->IsAdult && logic->CanUse(RG_POACHERS_SAW)),
LOCATION(RC_GV_TRADE_SAW, logic->IsAdult && logic->HasSoul(RG_CARPENTER_BOSS_SOUL) && logic->CanUse(RG_POACHERS_SAW)),
LOCATION(RC_GV_GS_BEHIND_TENT, logic->IsAdult && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()),
LOCATION(RC_GV_GS_PILLAR, logic->IsAdult && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()),
}, {

View File

@ -67,7 +67,7 @@ void RegionTable_Init_GoronCity() {
EventAccess(&logic->GoronCityChildFire, []{return logic->GoronCityChildFire || (logic->IsChild && logic->CanUse(RG_STICKS));}),
}, {
//Locations
LOCATION(RC_GC_DARUNIAS_JOY, logic->IsChild && logic->CanUse(RG_SARIAS_SONG)),
LOCATION(RC_GC_DARUNIAS_JOY, logic->IsChild && logic->HasSoul(RG_DARUNIA_SOUL) && logic->CanUse(RG_SARIAS_SONG)),
LOCATION(RC_GC_DARUNIA_POT_1, logic->CanBreakPots()),
LOCATION(RC_GC_DARUNIA_POT_2, logic->CanBreakPots()),
LOCATION(RC_GC_DARUNIA_POT_3, logic->CanBreakPots()),
@ -85,14 +85,14 @@ void RegionTable_Init_GoronCity() {
areaTable[RR_GC_SHOP] = Region("GC Shop", "GC Shop", {}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_GC_SHOP_ITEM_1, true),
LOCATION(RC_GC_SHOP_ITEM_2, true),
LOCATION(RC_GC_SHOP_ITEM_3, true),
LOCATION(RC_GC_SHOP_ITEM_4, true),
LOCATION(RC_GC_SHOP_ITEM_5, true),
LOCATION(RC_GC_SHOP_ITEM_6, true),
LOCATION(RC_GC_SHOP_ITEM_7, true),
LOCATION(RC_GC_SHOP_ITEM_8, true),
LOCATION(RC_GC_SHOP_ITEM_1, logic->HasSoul(RG_GORON_SHOPKEEPER_SOUL)),
LOCATION(RC_GC_SHOP_ITEM_2, logic->HasSoul(RG_GORON_SHOPKEEPER_SOUL)),
LOCATION(RC_GC_SHOP_ITEM_3, logic->HasSoul(RG_GORON_SHOPKEEPER_SOUL)),
LOCATION(RC_GC_SHOP_ITEM_4, logic->HasSoul(RG_GORON_SHOPKEEPER_SOUL)),
LOCATION(RC_GC_SHOP_ITEM_5, logic->HasSoul(RG_GORON_SHOPKEEPER_SOUL)),
LOCATION(RC_GC_SHOP_ITEM_6, logic->HasSoul(RG_GORON_SHOPKEEPER_SOUL)),
LOCATION(RC_GC_SHOP_ITEM_7, logic->HasSoul(RG_GORON_SHOPKEEPER_SOUL)),
LOCATION(RC_GC_SHOP_ITEM_8, logic->HasSoul(RG_GORON_SHOPKEEPER_SOUL)),
}, {
//Exits
Entrance(RR_GORON_CITY, []{return true;}),

View File

@ -12,7 +12,7 @@ void RegionTable_Init_Graveyard() {
}, {
//Locations
LOCATION(RC_GRAVEYARD_FREESTANDING_POH, (logic->IsAdult && CanPlantBean(RR_THE_GRAVEYARD)) || logic->CanUse(RG_LONGSHOT) || (ctx->GetTrickOption(RT_GY_POH) && logic->CanUse(RG_BOOMERANG))),
LOCATION(RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, logic->HasItem(RG_CHILD_WALLET) && logic->IsChild && logic->AtNight), //TODO: This needs to change
LOCATION(RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, logic->HasSoul(RG_DAMPE_SOUL) && logic->HasItem(RG_CHILD_WALLET) && logic->IsChild && logic->AtNight), //TODO: This needs to change
LOCATION(RC_GRAVEYARD_GS_WALL, logic->IsChild && logic->HookshotOrBoomerang() && logic->AtNight && logic->CanGetNightTimeGS()),
LOCATION(RC_GRAVEYARD_GS_BEAN_PATCH, logic->CanSpawnSoilSkull() && logic->CanAttack()),
LOCATION(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)),
@ -74,11 +74,11 @@ void RegionTable_Init_Graveyard() {
areaTable[RR_GRAVEYARD_DAMPES_GRAVE] = Region("Graveyard Dampes Grave", "Windmill and Dampes Grave", {}, NO_DAY_NIGHT_CYCLE, {
//Events
EventAccess(&logic->NutPot, []{return true;}),
EventAccess(&logic->DampesWindmillAccess, []{return logic->DampesWindmillAccess || (logic->IsAdult && logic->CanUse(RG_SONG_OF_TIME));}),
EventAccess(&logic->DampesWindmillAccess, []{return logic->DampesWindmillAccess || (logic->IsAdult && logic->HasSoul(RG_DAMPE_SOUL) && logic->CanUse(RG_SONG_OF_TIME));}),
}, {
//Locations
LOCATION(RC_GRAVEYARD_HOOKSHOT_CHEST, true),
LOCATION(RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, logic->IsAdult || ctx->GetTrickOption(RT_GY_CHILD_DAMPE_RACE_POH)),
LOCATION(RC_GRAVEYARD_HOOKSHOT_CHEST, logic->HasSoul(RG_DAMPE_SOUL)),
LOCATION(RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, logic->HasSoul(RG_DAMPE_SOUL) && (logic->IsAdult || ctx->GetTrickOption(RT_GY_CHILD_DAMPE_RACE_POH))),
LOCATION(RC_GY_DAMPES_GRAVE_POT_1, logic->CanBreakPots()),
LOCATION(RC_GY_DAMPES_GRAVE_POT_2, logic->CanBreakPots()),
LOCATION(RC_GY_DAMPES_GRAVE_POT_3, logic->CanBreakPots()),
@ -88,15 +88,15 @@ void RegionTable_Init_Graveyard() {
LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_1, true),
LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_2, true),
LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_3, true),
LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_4, true),
LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_5, true),
LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_6, true),
LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_7, true),
LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_8, true),
LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_4, logic->HasSoul(RG_DAMPE_SOUL)),
LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_5, logic->HasSoul(RG_DAMPE_SOUL)),
LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_6, logic->HasSoul(RG_DAMPE_SOUL)),
LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_7, logic->HasSoul(RG_DAMPE_SOUL)),
LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_8, logic->HasSoul(RG_DAMPE_SOUL)),
}, {
//Exits
Entrance(RR_THE_GRAVEYARD, []{return true;}),
Entrance(RR_KAK_WINDMILL, []{return logic->IsAdult && logic->CanUse(RG_SONG_OF_TIME);}, false),
Entrance(RR_KAK_WINDMILL, []{return logic->DampesWindmillAccess;}, false),
});
areaTable[RR_GRAVEYARD_DAMPES_HOUSE] = Region("Graveyard Dampes House", "Graveyard Dampes House", {}, NO_DAY_NIGHT_CYCLE, {}, {

View File

@ -14,11 +14,11 @@ void RegionTable_Init_HauntedWasteland() {
//Events
EventAccess(&logic->FairyPot, []{return true;}),
EventAccess(&logic->NutPot, []{return true;}),
EventAccess(&logic->CarpetMerchant, []{return logic->HasItem(RG_ADULT_WALLET) && CanBuyAnother(RC_WASTELAND_BOMBCHU_SALESMAN) && (logic->CanJumpslash() || logic->CanUse(RG_HOVER_BOOTS));}),
EventAccess(&logic->CarpetMerchant, []{return logic->HasSoul(RG_ARMS_DEALER_SOUL) && logic->HasItem(RG_ADULT_WALLET) && CanBuyAnother(RC_WASTELAND_BOMBCHU_SALESMAN) && (logic->CanJumpslash() || logic->CanUse(RG_HOVER_BOOTS));}),
}, {
//Locations
LOCATION(RC_WASTELAND_CHEST, logic->HasFireSource()),
LOCATION(RC_WASTELAND_BOMBCHU_SALESMAN, logic->CanJumpslash() || logic->CanUse(RG_HOVER_BOOTS)),
LOCATION(RC_WASTELAND_BOMBCHU_SALESMAN, logic->HasSoul(RG_ARMS_DEALER_SOUL) && (logic->CanJumpslash() || logic->CanUse(RG_HOVER_BOOTS))),
LOCATION(RC_WASTELAND_GS, logic->HookshotOrBoomerang()),
LOCATION(RC_WASTELAND_NEAR_GS_POT_1, logic->CanBreakPots()),
LOCATION(RC_WASTELAND_NEAR_GS_POT_2, logic->CanBreakPots()),

View File

@ -12,9 +12,9 @@ void RegionTable_Init_Kakariko() {
}, {
//Locations
LOCATION(RC_SHEIK_IN_KAKARIKO, logic->IsAdult && logic->HasItem(RG_FOREST_MEDALLION) && logic->HasItem(RG_FIRE_MEDALLION) && logic->HasItem(RG_WATER_MEDALLION)),
LOCATION(RC_KAK_ANJU_AS_CHILD, logic->IsChild && logic->AtDay),
LOCATION(RC_KAK_ANJU_AS_ADULT, logic->IsAdult && logic->AtDay),
LOCATION(RC_KAK_TRADE_POCKET_CUCCO, logic->IsAdult && logic->AtDay && (logic->CanUse(RG_POCKET_EGG) && logic->WakeUpAdultTalon)),
LOCATION(RC_KAK_ANJU_AS_CHILD, logic->IsChild && logic->AtDay && logic->HasSoul(RG_ANJU_SOUL)),
LOCATION(RC_KAK_ANJU_AS_ADULT, logic->IsAdult && logic->AtDay && logic->HasSoul(RG_ANJU_SOUL)),
LOCATION(RC_KAK_TRADE_POCKET_CUCCO, logic->IsAdult && logic->AtDay && logic->HasSoul(RG_ANJU_SOUL) && (logic->CanUse(RG_POCKET_EGG) && logic->WakeUpAdultTalon)),
//Can kill lower kak skulls with pots
LOCATION(RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, logic->IsChild && logic->CanGetNightTimeGS()),
LOCATION(RC_KAK_GS_SKULLTULA_HOUSE, logic->IsChild && logic->CanGetNightTimeGS()),
@ -44,7 +44,7 @@ void RegionTable_Init_Kakariko() {
Entrance(RR_KAK_REDEAD_GROTTO, []{return logic->CanOpenBombGrotto();}),
Entrance(RR_KAK_IMPAS_LEDGE, []{return (logic->IsChild && logic->AtDay) || (logic->IsAdult && ctx->GetTrickOption(RT_VISIBLE_COLLISION));}),
Entrance(RR_KAK_WATCHTOWER, []{return logic->IsAdult || logic->AtDay || logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_LONGSHOT) || (ctx->GetTrickOption(RT_KAK_TOWER_GS) && logic->CanJumpslashExceptHammer());}),
Entrance(RR_KAK_ROOFTOP, []{return logic->CanUse(RG_HOOKSHOT) || (ctx->GetTrickOption(RT_KAK_MAN_ON_ROOF) && logic->IsAdult);}),
Entrance(RR_KAK_ROOFTOP, []{return logic->HasSoul(RG_MAN_ON_ROOF_SOUL) && (logic->CanUse(RG_HOOKSHOT) || (ctx->GetTrickOption(RT_KAK_MAN_ON_ROOF) && logic->IsAdult));}),
Entrance(RR_KAK_IMPAS_ROOFTOP, []{return logic->CanUse(RG_HOOKSHOT) || (ctx->GetTrickOption(RT_KAK_ROOFTOP_GS) && logic->CanUse(RG_HOVER_BOOTS));}),
Entrance(RR_THE_GRAVEYARD, []{return true;}),
Entrance(RR_KAK_BEHIND_GATE, []{return logic->IsAdult || logic->KakarikoVillageGateOpen;}),
@ -101,7 +101,7 @@ void RegionTable_Init_Kakariko() {
areaTable[RR_KAK_CARPENTER_BOSS_HOUSE] = Region("Kak Carpenter Boss House", "Kak Carpenter Boss House", {}, NO_DAY_NIGHT_CYCLE, {
//Events
EventAccess(&logic->WakeUpAdultTalon, []{return logic->IsAdult && logic->CanUse(RG_POCKET_EGG);}),
EventAccess(&logic->WakeUpAdultTalon, []{return logic->IsAdult && logic->CanUse(RG_POCKET_EGG) && logic->HasSoul(RG_TALON_SOUL);}),
}, {}, {
//Exits
Entrance(RR_KAKARIKO_VILLAGE, []{return logic->CanOpenOverworldDoor(RG_BOSS_HOUSE_KEY);}),
@ -143,7 +143,7 @@ void RegionTable_Init_Kakariko() {
}, {
//Locations
LOCATION(RC_KAK_WINDMILL_FREESTANDING_POH, logic->CanUse(RG_BOOMERANG) || logic->DampesWindmillAccess || (logic->IsAdult && ctx->GetTrickOption(RT_KAK_ADULT_WINDMILL_POH)) || (logic->IsChild && logic->CanJumpslashExceptHammer() && ctx->GetTrickOption(RT_KAK_CHILD_WINDMILL_POH))),
LOCATION(RC_SONG_FROM_WINDMILL, logic->IsAdult && logic->HasItem(RG_FAIRY_OCARINA)),
LOCATION(RC_SONG_FROM_WINDMILL, logic->IsAdult && logic->HasSoul(RG_WINDMILL_MAN_SOUL) && logic->HasItem(RG_FAIRY_OCARINA)),
}, {
//Exits
Entrance(RR_KAKARIKO_VILLAGE, []{return logic->CanOpenOverworldDoor(RG_WINDMILL_KEY);}),
@ -151,14 +151,14 @@ void RegionTable_Init_Kakariko() {
areaTable[RR_KAK_BAZAAR] = Region("Kak Bazaar", "Kak Bazaar", {}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_KAK_BAZAAR_ITEM_1, true),
LOCATION(RC_KAK_BAZAAR_ITEM_2, true),
LOCATION(RC_KAK_BAZAAR_ITEM_3, true),
LOCATION(RC_KAK_BAZAAR_ITEM_4, true),
LOCATION(RC_KAK_BAZAAR_ITEM_5, true),
LOCATION(RC_KAK_BAZAAR_ITEM_6, true),
LOCATION(RC_KAK_BAZAAR_ITEM_7, true),
LOCATION(RC_KAK_BAZAAR_ITEM_8, true),
LOCATION(RC_KAK_BAZAAR_ITEM_1, logic->HasSoul(RG_BAZAAR_SHOPKEEPER_SOUL)),
LOCATION(RC_KAK_BAZAAR_ITEM_2, logic->HasSoul(RG_BAZAAR_SHOPKEEPER_SOUL)),
LOCATION(RC_KAK_BAZAAR_ITEM_3, logic->HasSoul(RG_BAZAAR_SHOPKEEPER_SOUL)),
LOCATION(RC_KAK_BAZAAR_ITEM_4, logic->HasSoul(RG_BAZAAR_SHOPKEEPER_SOUL)),
LOCATION(RC_KAK_BAZAAR_ITEM_5, logic->HasSoul(RG_BAZAAR_SHOPKEEPER_SOUL)),
LOCATION(RC_KAK_BAZAAR_ITEM_6, logic->HasSoul(RG_BAZAAR_SHOPKEEPER_SOUL)),
LOCATION(RC_KAK_BAZAAR_ITEM_7, logic->HasSoul(RG_BAZAAR_SHOPKEEPER_SOUL)),
LOCATION(RC_KAK_BAZAAR_ITEM_8, logic->HasSoul(RG_BAZAAR_SHOPKEEPER_SOUL)),
}, {
//Exits
Entrance(RR_KAKARIKO_VILLAGE, []{return true;}),
@ -166,7 +166,7 @@ void RegionTable_Init_Kakariko() {
areaTable[RR_KAK_SHOOTING_GALLERY] = Region("Kak Shooting Gallery", "Kak Shooting Gallery", {}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_KAK_SHOOTING_GALLERY_REWARD, logic->HasItem(RG_CHILD_WALLET) && logic->IsAdult && logic->CanUse(RG_FAIRY_BOW)),
LOCATION(RC_KAK_SHOOTING_GALLERY_REWARD, logic->HasItem(RG_CHILD_WALLET) && logic->IsAdult && logic->HasSoul(RG_SHOOTING_SOUL) && logic->CanUse(RG_FAIRY_BOW)),
}, {
//Exits
Entrance(RR_KAKARIKO_VILLAGE, []{return logic->CanOpenOverworldDoor(RG_KAK_SHOOTING_GALLERY_KEY);}),
@ -174,14 +174,14 @@ void RegionTable_Init_Kakariko() {
areaTable[RR_KAK_POTION_SHOP_FRONT] = Region("Kak Potion Shop Front", "Kak Potion Shop", {}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_KAK_POTION_SHOP_ITEM_1, logic->IsAdult),
LOCATION(RC_KAK_POTION_SHOP_ITEM_2, logic->IsAdult),
LOCATION(RC_KAK_POTION_SHOP_ITEM_3, logic->IsAdult),
LOCATION(RC_KAK_POTION_SHOP_ITEM_4, logic->IsAdult),
LOCATION(RC_KAK_POTION_SHOP_ITEM_5, logic->IsAdult),
LOCATION(RC_KAK_POTION_SHOP_ITEM_6, logic->IsAdult),
LOCATION(RC_KAK_POTION_SHOP_ITEM_7, logic->IsAdult),
LOCATION(RC_KAK_POTION_SHOP_ITEM_8, logic->IsAdult),
LOCATION(RC_KAK_POTION_SHOP_ITEM_1, logic->IsAdult && logic->HasSoul(RG_POTION_SHOPKEEPER_SOUL)),
LOCATION(RC_KAK_POTION_SHOP_ITEM_2, logic->IsAdult && logic->HasSoul(RG_POTION_SHOPKEEPER_SOUL)),
LOCATION(RC_KAK_POTION_SHOP_ITEM_3, logic->IsAdult && logic->HasSoul(RG_POTION_SHOPKEEPER_SOUL)),
LOCATION(RC_KAK_POTION_SHOP_ITEM_4, logic->IsAdult && logic->HasSoul(RG_POTION_SHOPKEEPER_SOUL)),
LOCATION(RC_KAK_POTION_SHOP_ITEM_5, logic->IsAdult && logic->HasSoul(RG_POTION_SHOPKEEPER_SOUL)),
LOCATION(RC_KAK_POTION_SHOP_ITEM_6, logic->IsAdult && logic->HasSoul(RG_POTION_SHOPKEEPER_SOUL)),
LOCATION(RC_KAK_POTION_SHOP_ITEM_7, logic->IsAdult && logic->HasSoul(RG_POTION_SHOPKEEPER_SOUL)),
LOCATION(RC_KAK_POTION_SHOP_ITEM_8, logic->IsAdult && logic->HasSoul(RG_POTION_SHOPKEEPER_SOUL)),
}, {
//Exits
Entrance(RR_KAKARIKO_VILLAGE, []{return true;}),
@ -199,8 +199,8 @@ void RegionTable_Init_Kakariko() {
// RANDOTODO blue pot access
}, {
//Locations
LOCATION(RC_KAK_TRADE_ODD_MUSHROOM, logic->IsAdult && logic->CanUse(RG_ODD_MUSHROOM)),
LOCATION(RC_KAK_GRANNYS_SHOP, logic->IsAdult && (logic->CanUse(RG_ODD_MUSHROOM) || logic->TradeQuestStep(RG_ODD_MUSHROOM))),
LOCATION(RC_KAK_TRADE_ODD_MUSHROOM, logic->IsAdult && logic->HasSoul(RG_GRANNY_SOUL) && logic->CanUse(RG_ODD_MUSHROOM)),
LOCATION(RC_KAK_GRANNYS_SHOP, logic->IsAdult && logic->HasSoul(RG_GRANNY_SOUL) && (logic->CanUse(RG_ODD_MUSHROOM) || logic->TradeQuestStep(RG_ODD_MUSHROOM))),
}, {
// Exits
Entrance(RR_KAK_BACKYARD, []{return logic->CanOpenOverworldDoor(RG_GRANNYS_POTION_SHOP_KEY);}),

View File

@ -123,14 +123,14 @@ void RegionTable_Init_KokiriForest() {
areaTable[RR_KF_KOKIRI_SHOP] = Region("KF Kokiri Shop", "KF Kokiri Shop", {}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_KF_SHOP_ITEM_1, true),
LOCATION(RC_KF_SHOP_ITEM_2, true),
LOCATION(RC_KF_SHOP_ITEM_3, true),
LOCATION(RC_KF_SHOP_ITEM_4, true),
LOCATION(RC_KF_SHOP_ITEM_5, true),
LOCATION(RC_KF_SHOP_ITEM_6, true),
LOCATION(RC_KF_SHOP_ITEM_7, true),
LOCATION(RC_KF_SHOP_ITEM_8, true),
LOCATION(RC_KF_SHOP_ITEM_1, logic->HasSoul(RG_KOKIRI_SHOPKEEPER_SOUL)),
LOCATION(RC_KF_SHOP_ITEM_2, logic->HasSoul(RG_KOKIRI_SHOPKEEPER_SOUL)),
LOCATION(RC_KF_SHOP_ITEM_3, logic->HasSoul(RG_KOKIRI_SHOPKEEPER_SOUL)),
LOCATION(RC_KF_SHOP_ITEM_4, logic->HasSoul(RG_KOKIRI_SHOPKEEPER_SOUL)),
LOCATION(RC_KF_SHOP_ITEM_5, logic->HasSoul(RG_KOKIRI_SHOPKEEPER_SOUL)),
LOCATION(RC_KF_SHOP_ITEM_6, logic->HasSoul(RG_KOKIRI_SHOPKEEPER_SOUL)),
LOCATION(RC_KF_SHOP_ITEM_7, logic->HasSoul(RG_KOKIRI_SHOPKEEPER_SOUL)),
LOCATION(RC_KF_SHOP_ITEM_8, logic->HasSoul(RG_KOKIRI_SHOPKEEPER_SOUL)),
}, {
//Exits
Entrance(RR_KOKIRI_FOREST, []{return true;}),

View File

@ -42,7 +42,7 @@ void RegionTable_Init_LakeHylia() {
//Exits
Entrance(RR_HYRULE_FIELD, []{return true;}),
Entrance(RR_ZORAS_DOMAIN, []{return logic->IsChild && (logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS));}),
Entrance(RR_LH_OWL_FLIGHT, []{return logic->IsChild;}),
Entrance(RR_LH_OWL_FLIGHT, []{return logic->IsChild && logic->HasSoul(RG_KAEPORA_SOUL);}),
Entrance(RR_LH_FISHING_ISLAND, []{return ((logic->IsChild || logic->WaterTempleClear) && logic->HasItem(RG_BRONZE_SCALE)) || (logic->IsAdult && (logic->CanUse(RG_SCARECROW) || CanPlantBean(RR_LAKE_HYLIA)));}),
Entrance(RR_LH_LAB, []{return logic->CanOpenOverworldDoor(RG_HYLIA_LAB_KEY);}),
Entrance(RR_WATER_TEMPLE_ENTRYWAY, []{return logic->CanUse(RG_HOOKSHOT) && ((logic->CanUse(RG_IRON_BOOTS) || (ctx->GetTrickOption(RT_LH_WATER_HOOKSHOT) && logic->HasItem(RG_GOLDEN_SCALE))) || (logic->IsAdult && logic->CanUse(RG_LONGSHOT) && logic->HasItem(RG_GOLDEN_SCALE)));}),
@ -62,8 +62,8 @@ void RegionTable_Init_LakeHylia() {
areaTable[RR_LH_LAB] = Region("LH Lab", "LH Lab", {}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_LH_LAB_DIVE, logic->HasItem(RG_GOLDEN_SCALE) || (ctx->GetTrickOption(RT_LH_LAB_DIVING) && logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT))),
LOCATION(RC_LH_TRADE_FROG, logic->IsAdult && logic->CanUse(RG_EYEBALL_FROG)),
LOCATION(RC_LH_LAB_DIVE, logic->HasSoul(RG_SCIENTIST_SOUL) && (logic->HasItem(RG_GOLDEN_SCALE) || (ctx->GetTrickOption(RT_LH_LAB_DIVING) && logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT)))),
LOCATION(RC_LH_TRADE_FROG, logic->IsAdult && logic->HasSoul(RG_SCIENTIST_SOUL) && logic->CanUse(RG_EYEBALL_FROG)),
LOCATION(RC_LH_GS_LAB_CRATE, logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT)),
LOCATION(RC_LH_LAB_FRONT_RUPEE, logic->CanUse(RG_IRON_BOOTS) || logic->HasItem(RG_GOLDEN_SCALE)),
LOCATION(RC_LH_LAB_LEFT_RUPEE, logic->CanUse(RG_IRON_BOOTS) || logic->HasItem(RG_GOLDEN_SCALE)),

View File

@ -7,10 +7,10 @@ void RegionTable_Init_LonLonRanch() {
areaTable[RR_LON_LON_RANCH] = Region("Lon Lon Ranch", "Lon Lon Ranch", {RA_LON_LON_RANCH}, NO_DAY_NIGHT_CYCLE, {
//Events
EventAccess(&logic->FreedEpona, []{return logic->FreedEpona || ((logic->HasItem(RG_CHILD_WALLET) || ctx->GetOption(RSK_SKIP_EPONA_RACE)) && logic->CanUse(RG_EPONAS_SONG) && logic->IsAdult && logic->AtDay);}),
EventAccess(&logic->LinksCow, []{return logic->LinksCow || (logic->HasItem(RG_CHILD_WALLET) && logic->CanUse(RG_EPONAS_SONG) && logic->IsAdult && logic->AtDay);}),
EventAccess(&logic->LinksCow, []{return logic->LinksCow || (logic->HasSoul(RG_MALON_SOUL) && logic->HasItem(RG_CHILD_WALLET) && logic->CanUse(RG_EPONAS_SONG) && logic->IsAdult && logic->AtDay);}),
}, {
//Locations
LOCATION(RC_SONG_FROM_MALON, logic->IsChild && logic->HasItem(RG_ZELDAS_LETTER) && logic->HasItem(RG_FAIRY_OCARINA) && logic->AtDay),
LOCATION(RC_SONG_FROM_MALON, logic->IsChild && logic->HasSoul(RG_MALON_SOUL) && logic->HasItem(RG_ZELDAS_LETTER) && logic->HasItem(RG_FAIRY_OCARINA) && logic->AtDay),
LOCATION(RC_LLR_GS_TREE, logic->IsChild),
LOCATION(RC_LLR_GS_RAIN_SHED, logic->IsChild && logic->CanGetNightTimeGS()),
LOCATION(RC_LLR_GS_HOUSE_WINDOW, logic->IsChild && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()),
@ -33,7 +33,7 @@ void RegionTable_Init_LonLonRanch() {
areaTable[RR_LLR_TALONS_HOUSE] = Region("LLR Talons House", "LLR Talons House", {}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_LLR_TALONS_CHICKENS, logic->HasItem(RG_CHILD_WALLET) && logic->IsChild && logic->AtDay && logic->HasItem(RG_ZELDAS_LETTER)),
LOCATION(RC_LLR_TALONS_CHICKENS, logic->HasItem(RG_CHILD_WALLET) && logic->IsChild && logic->AtDay && logic->HasSoul(RG_TALON_SOUL) && logic->HasItem(RG_ZELDAS_LETTER)),
LOCATION(RC_LLR_TALONS_HOUSE_POT_1, logic->CanBreakPots()),
LOCATION(RC_LLR_TALONS_HOUSE_POT_2, logic->CanBreakPots()),
LOCATION(RC_LLR_TALONS_HOUSE_POT_3, logic->CanBreakPots()),

View File

@ -17,9 +17,9 @@ void RegionTable_Init_LostWoods() {
}, {
//Locations
LOCATION(RC_LW_SKULL_KID, logic->IsChild && logic->CanUse(RG_SARIAS_SONG)),
LOCATION(RC_LW_TRADE_COJIRO, logic->IsAdult && logic->CanUse(RG_COJIRO)),
LOCATION(RC_LW_TRADE_COJIRO, logic->IsAdult && logic->HasSoul(RG_GROG_SOUL) && logic->CanUse(RG_COJIRO)),
//I cannot think of a case where you can use Odd pot but not Cojiro to reset the quadrant should you have both. If one exists, add it to logic
LOCATION(RC_LW_TRADE_ODD_POTION, logic->IsAdult && logic->CanUse(RG_ODD_POTION)),
LOCATION(RC_LW_TRADE_ODD_POTION, logic->IsAdult && logic->HasSoul(RG_FADO_SOUL) && logic->CanUse(RG_ODD_POTION)),
//all 5 buttons are logically required for memory game
//because the chances of being able to beat it
//every time you attempt it are as follows:
@ -116,7 +116,7 @@ void RegionTable_Init_LostWoods() {
areaTable[RR_LW_BRIDGE_FROM_FOREST] = Region("LW Bridge From Forest", "Lost Woods", {RA_THE_LOST_WOODS}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_LW_GIFT_FROM_SARIA, true),
LOCATION(RC_LW_GIFT_FROM_SARIA, logic->HasSoul(RG_SARIA_SOUL)),
}, {
//Exits
Entrance(RR_LW_BRIDGE, []{return true;}),

View File

@ -39,7 +39,7 @@ void RegionTable_Init_Market() {
EventAccess(&logic->CanEmptyBigPoes, []{return logic->IsAdult;}),
}, {
//Locations
LOCATION(RC_MARKET_10_BIG_POES, logic->IsAdult && logic->BigPoeKill),
LOCATION(RC_MARKET_10_BIG_POES, logic->IsAdult && logic->HasSoul(RG_POE_COLLECTOR_SOUL) && logic->BigPoeKill),
LOCATION(RC_MARKET_GS_GUARD_HOUSE, logic->IsChild),
LOCATION(RC_MK_GUARD_HOUSE_CHILD_POT_1, logic->IsChild && logic->CanBreakPots()),
LOCATION(RC_MK_GUARD_HOUSE_CHILD_POT_2, logic->IsChild && logic->CanBreakPots()),
@ -103,14 +103,14 @@ void RegionTable_Init_Market() {
areaTable[RR_MARKET_BAZAAR] = Region("Market Bazaar", "Market Bazaar", {}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_MARKET_BAZAAR_ITEM_1, true),
LOCATION(RC_MARKET_BAZAAR_ITEM_2, true),
LOCATION(RC_MARKET_BAZAAR_ITEM_3, true),
LOCATION(RC_MARKET_BAZAAR_ITEM_4, true),
LOCATION(RC_MARKET_BAZAAR_ITEM_5, true),
LOCATION(RC_MARKET_BAZAAR_ITEM_6, true),
LOCATION(RC_MARKET_BAZAAR_ITEM_7, true),
LOCATION(RC_MARKET_BAZAAR_ITEM_8, true),
LOCATION(RC_MARKET_BAZAAR_ITEM_1, logic->HasSoul(RG_BAZAAR_SHOPKEEPER_SOUL)),
LOCATION(RC_MARKET_BAZAAR_ITEM_2, logic->HasSoul(RG_BAZAAR_SHOPKEEPER_SOUL)),
LOCATION(RC_MARKET_BAZAAR_ITEM_3, logic->HasSoul(RG_BAZAAR_SHOPKEEPER_SOUL)),
LOCATION(RC_MARKET_BAZAAR_ITEM_4, logic->HasSoul(RG_BAZAAR_SHOPKEEPER_SOUL)),
LOCATION(RC_MARKET_BAZAAR_ITEM_5, logic->HasSoul(RG_BAZAAR_SHOPKEEPER_SOUL)),
LOCATION(RC_MARKET_BAZAAR_ITEM_6, logic->HasSoul(RG_BAZAAR_SHOPKEEPER_SOUL)),
LOCATION(RC_MARKET_BAZAAR_ITEM_7, logic->HasSoul(RG_BAZAAR_SHOPKEEPER_SOUL)),
LOCATION(RC_MARKET_BAZAAR_ITEM_8, logic->HasSoul(RG_BAZAAR_SHOPKEEPER_SOUL)),
}, {
//Exits
Entrance(RR_THE_MARKET, []{return true;}),
@ -118,7 +118,7 @@ void RegionTable_Init_Market() {
areaTable[RR_MARKET_MASK_SHOP] = Region("Market Mask Shop", "Market Mask Shop", {}, NO_DAY_NIGHT_CYCLE, {
//Events
EventAccess(&logic->SkullMask, []{return logic->SkullMask || (logic->HasItem(RG_ZELDAS_LETTER) && (ctx->GetOption(RSK_COMPLETE_MASK_QUEST) || ChildCanAccess(RR_KAKARIKO_VILLAGE)));}), //RANDOTODO Complete mask quest does not need this location, so should be tied to link's pocket
EventAccess(&logic->SkullMask, []{return logic->SkullMask || (logic->HasItem(RG_ZELDAS_LETTER) && logic->HasSoul(RG_MASK_SALESMAN_SOUL) && (ctx->GetOption(RSK_COMPLETE_MASK_QUEST) || ChildCanAccess(RR_KAKARIKO_VILLAGE)));}), //RANDOTODO Complete mask quest does not need this location, so should be tied to link's pocket
EventAccess(&logic->MaskOfTruth, []{return logic->MaskOfTruth || (logic->SkullMask && (ctx->GetOption(RSK_COMPLETE_MASK_QUEST) || (ChildCanAccess(RR_THE_LOST_WOODS) && logic->CanUse(RG_SARIAS_SONG) && RegionTable(RR_THE_GRAVEYARD)->childDay && ChildCanAccess(RR_HYRULE_FIELD) && logic->StoneCount() == 3)));}),
}, {
//Locations
@ -130,7 +130,7 @@ void RegionTable_Init_Market() {
areaTable[RR_MARKET_SHOOTING_GALLERY] = Region("Market Shooting Gallery", "Market Shooting Gallery", {}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_MARKET_SHOOTING_GALLERY_REWARD, logic->IsChild && logic->HasItem(RG_CHILD_WALLET)),
LOCATION(RC_MARKET_SHOOTING_GALLERY_REWARD, logic->IsChild && logic->HasSoul(RG_SHOOTING_SOUL) && logic->HasItem(RG_CHILD_WALLET)),
}, {
//Exits
Entrance(RR_THE_MARKET, []{return logic->CanOpenOverworldDoor(RG_MARKET_SHOOTING_GALLERY_KEY);}),
@ -138,7 +138,7 @@ void RegionTable_Init_Market() {
areaTable[RR_MARKET_BOMBCHU_BOWLING] = Region("Market Bombchu Bowling", "Market Bombchu Bowling", {}, NO_DAY_NIGHT_CYCLE, {
//Events
EventAccess(&logic->CouldPlayBowling, []{return (logic->HasItem(RG_CHILD_WALLET));}),
EventAccess(&logic->CouldPlayBowling, []{return logic->HasSoul(RG_BOMBCHU_LADY_SOUL) && logic->HasItem(RG_CHILD_WALLET);}),
}, {
//Locations
LOCATION(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, logic->CouldPlayBowling && logic->BombchusEnabled()),
@ -150,14 +150,14 @@ void RegionTable_Init_Market() {
areaTable[RR_MARKET_POTION_SHOP] = Region("Market Potion Shop", "Market Potion Shop", {}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_MARKET_POTION_SHOP_ITEM_1, true),
LOCATION(RC_MARKET_POTION_SHOP_ITEM_2, true),
LOCATION(RC_MARKET_POTION_SHOP_ITEM_3, true),
LOCATION(RC_MARKET_POTION_SHOP_ITEM_4, true),
LOCATION(RC_MARKET_POTION_SHOP_ITEM_5, true),
LOCATION(RC_MARKET_POTION_SHOP_ITEM_6, true),
LOCATION(RC_MARKET_POTION_SHOP_ITEM_7, true),
LOCATION(RC_MARKET_POTION_SHOP_ITEM_8, true),
LOCATION(RC_MARKET_POTION_SHOP_ITEM_1, logic->HasSoul(RG_POTION_SHOPKEEPER_SOUL)),
LOCATION(RC_MARKET_POTION_SHOP_ITEM_2, logic->HasSoul(RG_POTION_SHOPKEEPER_SOUL)),
LOCATION(RC_MARKET_POTION_SHOP_ITEM_3, logic->HasSoul(RG_POTION_SHOPKEEPER_SOUL)),
LOCATION(RC_MARKET_POTION_SHOP_ITEM_4, logic->HasSoul(RG_POTION_SHOPKEEPER_SOUL)),
LOCATION(RC_MARKET_POTION_SHOP_ITEM_5, logic->HasSoul(RG_POTION_SHOPKEEPER_SOUL)),
LOCATION(RC_MARKET_POTION_SHOP_ITEM_6, logic->HasSoul(RG_POTION_SHOPKEEPER_SOUL)),
LOCATION(RC_MARKET_POTION_SHOP_ITEM_7, logic->HasSoul(RG_POTION_SHOPKEEPER_SOUL)),
LOCATION(RC_MARKET_POTION_SHOP_ITEM_8, logic->HasSoul(RG_POTION_SHOPKEEPER_SOUL)),
}, {
//Exits
Entrance(RR_THE_MARKET, []{return true;}),
@ -165,18 +165,18 @@ void RegionTable_Init_Market() {
areaTable[RR_MARKET_TREASURE_CHEST_GAME] = Region("Market Treasure Chest Game", "Market Treasure Chest Game", {}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_GREG_HINT, logic->HasItem(RG_CHILD_WALLET)),
LOCATION(RC_MARKET_TREASURE_CHEST_GAME_REWARD, logic->HasItem(RG_CHILD_WALLET) && ((logic->CanUse(RG_LENS_OF_TRUTH) && !ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 6)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)))),
LOCATION(RC_MARKET_TREASURE_CHEST_GAME_KEY_1, logic->HasItem(RG_CHILD_WALLET) && ((ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (logic->CanUse(RG_LENS_OF_TRUTH) && !ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME)))),
LOCATION(RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, logic->HasItem(RG_CHILD_WALLET) && ((ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (logic->CanUse(RG_LENS_OF_TRUTH) && !ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME)))),
LOCATION(RC_MARKET_TREASURE_CHEST_GAME_KEY_2, logic->HasItem(RG_CHILD_WALLET) && ((ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 2)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (logic->CanUse(RG_LENS_OF_TRUTH) && !ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME)))),
LOCATION(RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, logic->HasItem(RG_CHILD_WALLET) && ((ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 2)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (logic->CanUse(RG_LENS_OF_TRUTH) && !ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME)))),
LOCATION(RC_MARKET_TREASURE_CHEST_GAME_KEY_3, logic->HasItem(RG_CHILD_WALLET) && ((ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 3)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (logic->CanUse(RG_LENS_OF_TRUTH) && !ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME)))),
LOCATION(RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, logic->HasItem(RG_CHILD_WALLET) && ((ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 3)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (logic->CanUse(RG_LENS_OF_TRUTH) && !ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME)))),
LOCATION(RC_MARKET_TREASURE_CHEST_GAME_KEY_4, logic->HasItem(RG_CHILD_WALLET) && ((ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 4)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (logic->CanUse(RG_LENS_OF_TRUTH) && !ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME)))),
LOCATION(RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, logic->HasItem(RG_CHILD_WALLET) && ((ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 4)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (logic->CanUse(RG_LENS_OF_TRUTH) && !ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME)))),
LOCATION(RC_MARKET_TREASURE_CHEST_GAME_KEY_5, logic->HasItem(RG_CHILD_WALLET) && ((ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 5)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (logic->CanUse(RG_LENS_OF_TRUTH) && !ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME)))),
LOCATION(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, logic->HasItem(RG_CHILD_WALLET) && ((ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 5)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (logic->CanUse(RG_LENS_OF_TRUTH) && !ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME)))),
LOCATION(RC_GREG_HINT, logic->HasSoul(RG_TREASURE_MAN_SOUL) && logic->HasItem(RG_CHILD_WALLET)),
LOCATION(RC_MARKET_TREASURE_CHEST_GAME_REWARD, logic->HasSoul(RG_TREASURE_MAN_SOUL) && logic->HasItem(RG_CHILD_WALLET) && ((logic->CanUse(RG_LENS_OF_TRUTH) && !ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 6)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)))),
LOCATION(RC_MARKET_TREASURE_CHEST_GAME_KEY_1, logic->HasSoul(RG_TREASURE_MAN_SOUL) && logic->HasItem(RG_CHILD_WALLET) && ((ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (logic->CanUse(RG_LENS_OF_TRUTH) && !ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME)))),
LOCATION(RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, logic->HasSoul(RG_TREASURE_MAN_SOUL) && logic->HasItem(RG_CHILD_WALLET) && ((ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (logic->CanUse(RG_LENS_OF_TRUTH) && !ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME)))),
LOCATION(RC_MARKET_TREASURE_CHEST_GAME_KEY_2, logic->HasSoul(RG_TREASURE_MAN_SOUL) && logic->HasItem(RG_CHILD_WALLET) && ((ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 2)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (logic->CanUse(RG_LENS_OF_TRUTH) && !ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME)))),
LOCATION(RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, logic->HasSoul(RG_TREASURE_MAN_SOUL) && logic->HasItem(RG_CHILD_WALLET) && ((ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 2)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (logic->CanUse(RG_LENS_OF_TRUTH) && !ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME)))),
LOCATION(RC_MARKET_TREASURE_CHEST_GAME_KEY_3, logic->HasSoul(RG_TREASURE_MAN_SOUL) && logic->HasItem(RG_CHILD_WALLET) && ((ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 3)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (logic->CanUse(RG_LENS_OF_TRUTH) && !ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME)))),
LOCATION(RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, logic->HasSoul(RG_TREASURE_MAN_SOUL) && logic->HasItem(RG_CHILD_WALLET) && ((ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 3)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (logic->CanUse(RG_LENS_OF_TRUTH) && !ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME)))),
LOCATION(RC_MARKET_TREASURE_CHEST_GAME_KEY_4, logic->HasSoul(RG_TREASURE_MAN_SOUL) && logic->HasItem(RG_CHILD_WALLET) && ((ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 4)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (logic->CanUse(RG_LENS_OF_TRUTH) && !ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME)))),
LOCATION(RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, logic->HasSoul(RG_TREASURE_MAN_SOUL) && logic->HasItem(RG_CHILD_WALLET) && ((ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 4)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (logic->CanUse(RG_LENS_OF_TRUTH) && !ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME)))),
LOCATION(RC_MARKET_TREASURE_CHEST_GAME_KEY_5, logic->HasSoul(RG_TREASURE_MAN_SOUL) && logic->HasItem(RG_CHILD_WALLET) && ((ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 5)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (logic->CanUse(RG_LENS_OF_TRUTH) && !ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME)))),
LOCATION(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, logic->HasSoul(RG_TREASURE_MAN_SOUL) && logic->HasItem(RG_CHILD_WALLET) && ((ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_SINGLE_KEYS) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 5)) || (ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME).Is(RO_CHEST_GAME_PACK) && logic->SmallKeys(RR_MARKET_TREASURE_CHEST_GAME, 1)) || (logic->CanUse(RG_LENS_OF_TRUTH) && !ctx->GetOption(RSK_SHUFFLE_CHEST_MINIGAME)))),
}, {
//Exits
Entrance(RR_THE_MARKET, []{return logic->CanOpenOverworldDoor(RG_TREASURE_CHEST_GAME_BUILDING_KEY);}),
@ -184,14 +184,14 @@ void RegionTable_Init_Market() {
areaTable[RR_MARKET_BOMBCHU_SHOP] = Region("Market Bombchu Shop", "Market Bombchu Shop", {}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_MARKET_BOMBCHU_SHOP_ITEM_1, true),
LOCATION(RC_MARKET_BOMBCHU_SHOP_ITEM_2, true),
LOCATION(RC_MARKET_BOMBCHU_SHOP_ITEM_3, true),
LOCATION(RC_MARKET_BOMBCHU_SHOP_ITEM_4, true),
LOCATION(RC_MARKET_BOMBCHU_SHOP_ITEM_5, true),
LOCATION(RC_MARKET_BOMBCHU_SHOP_ITEM_6, true),
LOCATION(RC_MARKET_BOMBCHU_SHOP_ITEM_7, true),
LOCATION(RC_MARKET_BOMBCHU_SHOP_ITEM_8, true),
LOCATION(RC_MARKET_BOMBCHU_SHOP_ITEM_1, logic->HasSoul(RG_BOMBCHU_SHOPKEEPER_SOUL)),
LOCATION(RC_MARKET_BOMBCHU_SHOP_ITEM_2, logic->HasSoul(RG_BOMBCHU_SHOPKEEPER_SOUL)),
LOCATION(RC_MARKET_BOMBCHU_SHOP_ITEM_3, logic->HasSoul(RG_BOMBCHU_SHOPKEEPER_SOUL)),
LOCATION(RC_MARKET_BOMBCHU_SHOP_ITEM_4, logic->HasSoul(RG_BOMBCHU_SHOPKEEPER_SOUL)),
LOCATION(RC_MARKET_BOMBCHU_SHOP_ITEM_5, logic->HasSoul(RG_BOMBCHU_SHOPKEEPER_SOUL)),
LOCATION(RC_MARKET_BOMBCHU_SHOP_ITEM_6, logic->HasSoul(RG_BOMBCHU_SHOPKEEPER_SOUL)),
LOCATION(RC_MARKET_BOMBCHU_SHOP_ITEM_7, logic->HasSoul(RG_BOMBCHU_SHOPKEEPER_SOUL)),
LOCATION(RC_MARKET_BOMBCHU_SHOP_ITEM_8, logic->HasSoul(RG_BOMBCHU_SHOPKEEPER_SOUL)),
}, {
//Exits
Entrance(RR_MARKET_BACK_ALLEY, []{return true;}),

View File

@ -16,7 +16,7 @@ void RegionTable_Init_SacredForestMeadow() {
EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairyExceptSuns();}),
}, {
//Locations
LOCATION(RC_SONG_FROM_SARIA, logic->IsChild && logic->HasItem(RG_ZELDAS_LETTER)),
LOCATION(RC_SONG_FROM_SARIA, logic->IsChild && logic->HasSoul(RG_SARIA_SOUL) && logic->HasItem(RG_ZELDAS_LETTER)),
LOCATION(RC_SHEIK_IN_FOREST, logic->IsAdult),
LOCATION(RC_SFM_GS, logic->IsAdult && logic->HookshotOrBoomerang() && logic->CanGetNightTimeGS()),
LOCATION(RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns()),

View File

@ -45,7 +45,7 @@ void RegionTable_Init_TempleOfTime() {
}, {
//Locations
LOCATION(RC_TOT_MASTER_SWORD, logic->IsAdult),
LOCATION(RC_GIFT_FROM_RAURU, logic->IsAdult),
LOCATION(RC_GIFT_FROM_RAURU, logic->IsAdult && logic->HasSoul(RG_RAURU_SOUL)),
LOCATION(RC_SHEIK_AT_TEMPLE, logic->HasItem(RG_FOREST_MEDALLION) && logic->IsAdult),
}, {
//Exits

View File

@ -21,7 +21,7 @@ void RegionTable_Init_ZoraRiver() {
EventAccess(&logic->BugShrub, []{return logic->BugShrub || logic->CanCutShrubs();}),
}, {
//Locations
LOCATION(RC_ZR_MAGIC_BEAN_SALESMAN, logic->HasItem(RG_CHILD_WALLET) && logic->IsChild),
LOCATION(RC_ZR_MAGIC_BEAN_SALESMAN, logic->HasItem(RG_CHILD_WALLET) && logic->IsChild && logic->HasSoul(RG_BEAN_SALESMAN_SOUL)),
LOCATION(RC_ZR_FROGS_OCARINA_GAME, logic->IsChild && logic->CanUse(RG_ZELDAS_LULLABY) && logic->CanUse(RG_SARIAS_SONG) && logic->CanUse(RG_SUNS_SONG) && logic->CanUse(RG_EPONAS_SONG) && logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_SONG_OF_STORMS)),
LOCATION(RC_ZR_FROGS_IN_THE_RAIN, logic->IsChild && logic->CanUse(RG_SONG_OF_STORMS)),
LOCATION(RC_ZR_FROGS_ZELDAS_LULLABY, logic->IsChild && logic->CanUse(RG_ZELDAS_LULLABY)),

View File

@ -14,7 +14,7 @@ void RegionTable_Init_ZorasDomain() {
EventAccess(&logic->DeliverLetter, []{return logic->DeliverLetter || (logic->CanUse(RG_RUTOS_LETTER) && logic->IsChild && ctx->GetOption(RSK_ZORAS_FOUNTAIN).IsNot(RO_ZF_OPEN));}),
}, {
//Locations
LOCATION(RC_ZD_DIVING_MINIGAME, logic->HasItem(RG_BRONZE_SCALE) && logic->HasItem(RG_CHILD_WALLET) && logic->IsChild),
LOCATION(RC_ZD_DIVING_MINIGAME, logic->IsChild && logic->HasSoul(RG_DIVING_SOUL) && logic->HasItem(RG_BRONZE_SCALE) && logic->HasItem(RG_CHILD_WALLET)),
LOCATION(RC_ZD_CHEST, logic->IsChild && logic->CanUse(RG_STICKS)),
LOCATION(RC_ZD_KING_ZORA_THAWED, logic->KingZoraThawed),
LOCATION(RC_ZD_TRADE_PRESCRIPTION, logic->KingZoraThawed && logic->CanUse(RG_PRESCRIPTION)),
@ -60,14 +60,14 @@ void RegionTable_Init_ZorasDomain() {
areaTable[RR_ZD_SHOP] = Region("ZD Shop", "ZD Shop", {}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_ZD_SHOP_ITEM_1, true),
LOCATION(RC_ZD_SHOP_ITEM_2, true),
LOCATION(RC_ZD_SHOP_ITEM_3, true),
LOCATION(RC_ZD_SHOP_ITEM_4, true),
LOCATION(RC_ZD_SHOP_ITEM_5, true),
LOCATION(RC_ZD_SHOP_ITEM_6, true),
LOCATION(RC_ZD_SHOP_ITEM_7, true),
LOCATION(RC_ZD_SHOP_ITEM_8, true),
LOCATION(RC_ZD_SHOP_ITEM_1, logic->HasSoul(RG_ZORA_SHOPKEEPER_SOUL)),
LOCATION(RC_ZD_SHOP_ITEM_2, logic->HasSoul(RG_ZORA_SHOPKEEPER_SOUL)),
LOCATION(RC_ZD_SHOP_ITEM_3, logic->HasSoul(RG_ZORA_SHOPKEEPER_SOUL)),
LOCATION(RC_ZD_SHOP_ITEM_4, logic->HasSoul(RG_ZORA_SHOPKEEPER_SOUL)),
LOCATION(RC_ZD_SHOP_ITEM_5, logic->HasSoul(RG_ZORA_SHOPKEEPER_SOUL)),
LOCATION(RC_ZD_SHOP_ITEM_6, logic->HasSoul(RG_ZORA_SHOPKEEPER_SOUL)),
LOCATION(RC_ZD_SHOP_ITEM_7, logic->HasSoul(RG_ZORA_SHOPKEEPER_SOUL)),
LOCATION(RC_ZD_SHOP_ITEM_8, logic->HasSoul(RG_ZORA_SHOPKEEPER_SOUL)),
}, {
//Exits
Entrance(RR_ZORAS_DOMAIN, []{return true;}),

View File

@ -56,7 +56,7 @@ void RegionTable_Init_ZorasFountain() {
areaTable[RR_ZF_GREAT_FAIRY_FOUNTAIN] = Region("ZF Great Fairy Fountain", "ZF Great Fairy Fountain", {}, NO_DAY_NIGHT_CYCLE, {}, {
//Locations
LOCATION(RC_ZF_GREAT_FAIRY_REWARD, logic->CanUse(RG_ZELDAS_LULLABY)),
LOCATION(RC_ZF_GREAT_FAIRY_REWARD, logic->HasSoul(RG_GREAT_FAIRY_SOUL) && logic->CanUse(RG_ZELDAS_LULLABY)),
}, {
//Exits
Entrance(RR_ZORAS_FOUNTAIN, []{return true;}),

View File

@ -139,8 +139,43 @@ namespace Rando {
case RG_BONGO_BONGO_SOUL:
case RG_TWINROVA_SOUL:
case RG_GANON_SOUL:
case RG_SKELETON_KEY:
// NPC Souls
case RG_ANJU_SOUL:
case RG_TALON_SOUL:
case RG_GROG_SOUL:
case RG_GRANNY_SOUL:
case RG_FADO_SOUL:
case RG_CARPENTER_BOSS_SOUL:
case RG_GREAT_FAIRY_SOUL:
case RG_POE_COLLECTOR_SOUL:
case RG_DAMPE_SOUL:
case RG_WINDMILL_MAN_SOUL:
case RG_MAN_ON_ROOF_SOUL:
case RG_MALON_SOUL:
case RG_RAURU_SOUL:
case RG_SARIA_SOUL:
case RG_DARUNIA_SOUL:
case RG_RUTO_SOUL:
case RG_NABOORU_SOUL:
case RG_IMPA_SOUL:
case RG_BEGGAR_SOUL:
case RG_ARMS_DEALER_SOUL:
case RG_BEAN_SALESMAN_SOUL:
case RG_SHOOTING_SOUL:
case RG_KOKIRI_SHOPKEEPER_SOUL:
case RG_POTION_SHOPKEEPER_SOUL:
case RG_BAZAAR_SHOPKEEPER_SOUL:
case RG_GORON_SHOPKEEPER_SOUL:
case RG_ZORA_SHOPKEEPER_SOUL:
case RG_BOMBCHU_SHOPKEEPER_SOUL:
case RG_MASK_SALESMAN_SOUL:
case RG_TREASURE_MAN_SOUL:
case RG_BOMBCHU_LADY_SOUL:
case RG_DIVING_SOUL:
case RG_SCIENTIST_SOUL:
case RG_KAEPORA_SOUL:
// Overworld Keys
case RG_SKELETON_KEY:
case RG_GUARD_HOUSE_KEY:
case RG_MARKET_BAZAAR_KEY:
case RG_MARKET_POTION_SHOP_KEY:
@ -386,10 +421,7 @@ namespace Rando {
(age == HasProjectileAge::Either && (CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_BOOMERANG) || CanUse(RG_HOOKSHOT) || CanUse(RG_FAIRY_BOW)));
}
bool Logic::HasBossSoul(RandomizerGet itemName) {
if (!ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS)) {
return true;
}
bool Logic::HasSoul(RandomizerGet itemName) {
switch(itemName) {
case RG_GOHMA_SOUL:
case RG_KING_DODONGO_SOUL:
@ -399,9 +431,44 @@ namespace Rando {
case RG_MORPHA_SOUL:
case RG_BONGO_BONGO_SOUL:
case RG_TWINROVA_SOUL:
return HasItem(itemName);
return !ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS) || HasItem(itemName);
case RG_GANON_SOUL:
return ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS).Is(RO_BOSS_SOULS_ON_PLUS_GANON) ? HasItem(RG_GANON_SOUL) : true;
return !ctx->GetOption(RSK_SHUFFLE_BOSS_SOULS).Is(RO_BOSS_SOULS_ON_PLUS_GANON) || HasItem(RG_GANON_SOUL);
case RG_ANJU_SOUL:
case RG_TALON_SOUL:
case RG_GROG_SOUL:
case RG_GRANNY_SOUL:
case RG_FADO_SOUL:
case RG_CARPENTER_BOSS_SOUL:
case RG_GREAT_FAIRY_SOUL:
case RG_POE_COLLECTOR_SOUL:
case RG_DAMPE_SOUL:
case RG_WINDMILL_MAN_SOUL:
case RG_MAN_ON_ROOF_SOUL:
case RG_MALON_SOUL:
case RG_RAURU_SOUL:
case RG_SARIA_SOUL:
case RG_DARUNIA_SOUL:
case RG_RUTO_SOUL:
case RG_NABOORU_SOUL:
case RG_IMPA_SOUL:
case RG_BEGGAR_SOUL:
case RG_ARMS_DEALER_SOUL:
case RG_BEAN_SALESMAN_SOUL:
case RG_SHOOTING_SOUL:
case RG_KOKIRI_SHOPKEEPER_SOUL:
case RG_POTION_SHOPKEEPER_SOUL:
case RG_BAZAAR_SHOPKEEPER_SOUL:
case RG_GORON_SHOPKEEPER_SOUL:
case RG_ZORA_SHOPKEEPER_SOUL:
case RG_BOMBCHU_SHOPKEEPER_SOUL:
case RG_MASK_SALESMAN_SOUL:
case RG_TREASURE_MAN_SOUL:
case RG_BOMBCHU_LADY_SOUL:
case RG_DIVING_SOUL:
case RG_SCIENTIST_SOUL:
case RG_KAEPORA_SOUL:
return !ctx->GetOption(RSK_SHUFFLE_NPC_SOULS) || HasItem(itemName);
default:
return false;
}
@ -679,9 +746,9 @@ namespace Rando {
// for killing ganondorf and all of those can reflect the energy ball
// This will not be the case once ammo logic in taken into account as
// sticks are limited and using a bottle might become a requirement in that case
return HasBossSoul(RG_GANON_SOUL) && CanUse(RG_LIGHT_ARROWS) && (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD));
return HasSoul(RG_GANON_SOUL) && CanUse(RG_LIGHT_ARROWS) && (CanUse(RG_KOKIRI_SWORD) || CanUse(RG_MASTER_SWORD) || CanUse(RG_BIGGORON_SWORD));
case RE_GANON:
return HasBossSoul(RG_GANON_SOUL) && CanUse(RG_MASTER_SWORD);
return HasSoul(RG_GANON_SOUL) && CanUse(RG_MASTER_SWORD);
case RE_DARK_LINK:
//RANDOTODO Dark link is buggy right now, retest when he is not
return CanJumpslash() || CanUse(RG_FAIRY_BOW);
@ -1323,6 +1390,40 @@ namespace Rando {
{ RG_BONGO_BONGO_SOUL, RAND_INF_BONGO_BONGO_SOUL },
{ RG_TWINROVA_SOUL, RAND_INF_TWINROVA_SOUL },
{ RG_GANON_SOUL, RAND_INF_GANON_SOUL },
{ RG_ANJU_SOUL, RAND_INF_ANJU_SOUL },
{ RG_TALON_SOUL, RAND_INF_TALON_SOUL },
{ RG_GROG_SOUL, RAND_INF_GROG_SOUL },
{ RG_GRANNY_SOUL, RAND_INF_GRANNY_SOUL },
{ RG_FADO_SOUL, RAND_INF_FADO_SOUL },
{ RG_CARPENTER_BOSS_SOUL, RAND_INF_CARPENTER_BOSS_SOUL },
{ RG_GREAT_FAIRY_SOUL, RAND_INF_GREAT_FAIRY_SOUL },
{ RG_POE_COLLECTOR_SOUL, RAND_INF_POE_COLLECTOR_SOUL },
{ RG_DAMPE_SOUL, RAND_INF_DAMPE_SOUL },
{ RG_WINDMILL_MAN_SOUL, RAND_INF_WINDMILL_MAN_SOUL },
{ RG_MAN_ON_ROOF_SOUL, RAND_INF_MAN_ON_ROOF_SOUL },
{ RG_MALON_SOUL, RAND_INF_MALON_SOUL },
{ RG_RAURU_SOUL, RAND_INF_RAURU_SOUL },
{ RG_SARIA_SOUL, RAND_INF_SARIA_SOUL },
{ RG_DARUNIA_SOUL, RAND_INF_DARUNIA_SOUL },
{ RG_RUTO_SOUL, RAND_INF_RUTO_SOUL },
{ RG_NABOORU_SOUL, RAND_INF_NABOORU_SOUL },
{ RG_IMPA_SOUL, RAND_INF_IMPA_SOUL },
{ RG_BEGGAR_SOUL, RAND_INF_BEGGAR_SOUL },
{ RG_ARMS_DEALER_SOUL, RAND_INF_ARMS_DEALER_SOUL },
{ RG_BEAN_SALESMAN_SOUL, RAND_INF_BEAN_SALESMAN_SOUL },
{ RG_SHOOTING_SOUL, RAND_INF_SHOOTING_SOUL },
{ RG_KOKIRI_SHOPKEEPER_SOUL, RAND_INF_KOKIRI_SHOPKEEPER_SOUL },
{ RG_POTION_SHOPKEEPER_SOUL, RAND_INF_POTION_SHOPKEEPER_SOUL },
{ RG_BAZAAR_SHOPKEEPER_SOUL, RAND_INF_BAZAAR_SHOPKEEPER_SOUL },
{ RG_GORON_SHOPKEEPER_SOUL, RAND_INF_GORON_SHOPKEEPER_SOUL },
{ RG_ZORA_SHOPKEEPER_SOUL, RAND_INF_ZORA_SHOPKEEPER_SOUL },
{ RG_BOMBCHU_SHOPKEEPER_SOUL, RAND_INF_BOMBCHU_SHOPKEEPER_SOUL },
{ RG_MASK_SALESMAN_SOUL, RAND_INF_MASK_SALESMAN_SOUL },
{ RG_TREASURE_MAN_SOUL, RAND_INF_TREASURE_MAN_SOUL },
{ RG_BOMBCHU_LADY_SOUL, RAND_INF_BOMBCHU_LADY_SOUL },
{ RG_DIVING_SOUL, RAND_INF_DIVING_SOUL },
{ RG_SCIENTIST_SOUL, RAND_INF_SCIENTIST_SOUL },
{ RG_KAEPORA_SOUL, RAND_INF_KAEPORA_SOUL },
{ RG_OCARINA_A_BUTTON, RAND_INF_HAS_OCARINA_A },
{ RG_OCARINA_C_UP_BUTTON, RAND_INF_HAS_OCARINA_C_UP },
{ RG_OCARINA_C_DOWN_BUTTON, RAND_INF_HAS_OCARINA_C_DOWN },
@ -1705,6 +1806,40 @@ namespace Rando {
case RG_BONGO_BONGO_SOUL:
case RG_TWINROVA_SOUL:
case RG_GANON_SOUL:
case RG_ANJU_SOUL:
case RG_TALON_SOUL:
case RG_GROG_SOUL:
case RG_GRANNY_SOUL:
case RG_FADO_SOUL:
case RG_CARPENTER_BOSS_SOUL:
case RG_GREAT_FAIRY_SOUL:
case RG_POE_COLLECTOR_SOUL:
case RG_DAMPE_SOUL:
case RG_WINDMILL_MAN_SOUL:
case RG_MAN_ON_ROOF_SOUL:
case RG_MALON_SOUL:
case RG_RAURU_SOUL:
case RG_SARIA_SOUL:
case RG_DARUNIA_SOUL:
case RG_RUTO_SOUL:
case RG_NABOORU_SOUL:
case RG_IMPA_SOUL:
case RG_BEGGAR_SOUL:
case RG_ARMS_DEALER_SOUL:
case RG_BEAN_SALESMAN_SOUL:
case RG_SHOOTING_SOUL:
case RG_KOKIRI_SHOPKEEPER_SOUL:
case RG_POTION_SHOPKEEPER_SOUL:
case RG_BAZAAR_SHOPKEEPER_SOUL:
case RG_GORON_SHOPKEEPER_SOUL:
case RG_ZORA_SHOPKEEPER_SOUL:
case RG_BOMBCHU_SHOPKEEPER_SOUL:
case RG_MASK_SALESMAN_SOUL:
case RG_TREASURE_MAN_SOUL:
case RG_BOMBCHU_LADY_SOUL:
case RG_DIVING_SOUL:
case RG_SCIENTIST_SOUL:
case RG_KAEPORA_SOUL:
case RG_OCARINA_A_BUTTON:
case RG_OCARINA_C_UP_BUTTON:
case RG_OCARINA_C_DOWN_BUTTON:

View File

@ -42,6 +42,14 @@ class Logic {
bool WakeUpAdultTalon = false;
// Dungeon Clears
bool DekuTreeWin = false;
bool DodongosCavernWin = false;
bool JabuJabusBellyWin = false;
bool ForestTempleWin = false;
bool FireTempleWin = false;
bool WaterTempleWin = false;
bool SpiritTempleWin = false;
bool ShadowTempleWin = false;
bool DekuTreeClear = false;
bool DodongosCavernClear = false;
bool JabuJabusBellyClear = false;
@ -185,7 +193,7 @@ class Logic {
bool CanUse(RandomizerGet itemName);
bool HasProjectile(HasProjectileAge age);
bool HasItem(RandomizerGet itemName);
bool HasBossSoul(RandomizerGet itemName);
bool HasSoul(RandomizerGet itemName);
bool CanOpenOverworldDoor(RandomizerGet itemName);
bool SmallKeys(RandomizerRegion dungeon, uint8_t requiredAmount);
bool SmallKeys(RandomizerRegion dungeon, uint8_t requiredAmountGlitchless, uint8_t requiredAmountGlitched);

View File

@ -3889,6 +3889,7 @@ std::map<RandomizerGet, RandomizerInf> randomizerGetToRandInf = {
{ RG_IMPA_SOUL, RAND_INF_IMPA_SOUL },
{ RG_BEGGAR_SOUL, RAND_INF_BEGGAR_SOUL },
{ RG_ARMS_DEALER_SOUL, RAND_INF_ARMS_DEALER_SOUL },
{ RG_BEAN_SALESMAN_SOUL, RAND_INF_BEAN_SALESMAN_SOUL },
{ RG_SHOOTING_SOUL, RAND_INF_SHOOTING_SOUL },
{ RG_KOKIRI_SHOPKEEPER_SOUL, RAND_INF_KOKIRI_SHOPKEEPER_SOUL },
{ RG_POTION_SHOPKEEPER_SOUL, RAND_INF_POTION_SHOPKEEPER_SOUL },