From 5bf3761a18160c298d29d98c6094840cb0a47eaa Mon Sep 17 00:00:00 2001 From: Pepper0ni <93387759+Pepper0ni@users.noreply.github.com> Date: Wed, 21 May 2025 16:51:34 +0100 Subject: [PATCH 01/67] Fix Boss and Tower entryways skipping requirements in decoupled (#5484) * Fix boss and tower entryways in decoupled * Add patches to child boss room entryways * Apply fixes * remember to set ALL the new exits --- soh/soh/Enhancements/randomizer/entrance.cpp | 44 +++++++++---------- .../location_access/dungeons/deku_tree.cpp | 11 +++-- .../dungeons/dodongos_cavern.cpp | 11 +++-- .../location_access/dungeons/fire_temple.cpp | 6 +-- .../dungeons/forest_temple.cpp | 6 +-- .../dungeons/ganons_castle.cpp | 23 ++++------ .../dungeons/jabujabus_belly.cpp | 10 +++-- .../dungeons/shadow_temple.cpp | 6 +-- .../dungeons/spirit_temple.cpp | 6 +-- .../location_access/dungeons/water_temple.cpp | 6 +-- .../Enhancements/randomizer/randomizerTypes.h | 4 ++ 11 files changed, 73 insertions(+), 60 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/entrance.cpp b/soh/soh/Enhancements/randomizer/entrance.cpp index 40eaca212..66da4ee18 100644 --- a/soh/soh/Enhancements/randomizer/entrance.cpp +++ b/soh/soh/Enhancements/randomizer/entrance.cpp @@ -1131,22 +1131,22 @@ int EntranceShuffler::ShuffleAllEntrances() { { { EntranceType::WarpSong, RR_PRELUDE_OF_LIGHT_WARP, RR_TEMPLE_OF_TIME, ENTR_TEMPLE_OF_TIME_WARP_PAD }, NO_RETURN_ENTRANCE }, - { { EntranceType::ChildBoss, RR_DEKU_TREE_BOSS_ENTRYWAY, RR_DEKU_TREE_BOSS_ROOM, ENTR_DEKU_TREE_BOSS_ENTRANCE }, - { EntranceType::ChildBoss, RR_DEKU_TREE_BOSS_ROOM, RR_DEKU_TREE_BOSS_ENTRYWAY, ENTR_DEKU_TREE_BOSS_DOOR } }, - { { EntranceType::ChildBoss, RR_DODONGOS_CAVERN_BOSS_ENTRYWAY, RR_DODONGOS_CAVERN_BOSS_ROOM, ENTR_DODONGOS_CAVERN_BOSS_ENTRANCE }, - { EntranceType::ChildBoss, RR_DODONGOS_CAVERN_BOSS_ROOM, RR_DODONGOS_CAVERN_BOSS_ENTRYWAY, ENTR_DODONGOS_CAVERN_BOSS_DOOR } }, - { { EntranceType::ChildBoss, RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY, RR_JABU_JABUS_BELLY_BOSS_ROOM, ENTR_JABU_JABU_BOSS_ENTRANCE }, - { EntranceType::ChildBoss, RR_JABU_JABUS_BELLY_BOSS_ROOM, RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY, ENTR_JABU_JABU_BOSS_DOOR } }, - { { EntranceType::AdultBoss, RR_FOREST_TEMPLE_BOSS_ENTRYWAY, RR_FOREST_TEMPLE_BOSS_ROOM, ENTR_FOREST_TEMPLE_BOSS_ENTRANCE }, - { EntranceType::AdultBoss, RR_FOREST_TEMPLE_BOSS_ROOM, RR_FOREST_TEMPLE_BOSS_ENTRYWAY, ENTR_FOREST_TEMPLE_BOSS_DOOR } }, - { { EntranceType::AdultBoss, RR_FIRE_TEMPLE_BOSS_ENTRYWAY, RR_FIRE_TEMPLE_BOSS_ROOM, ENTR_FIRE_TEMPLE_BOSS_ENTRANCE }, - { EntranceType::AdultBoss, RR_FIRE_TEMPLE_BOSS_ROOM, RR_FIRE_TEMPLE_BOSS_ENTRYWAY, ENTR_FIRE_TEMPLE_BOSS_DOOR } }, - { { EntranceType::AdultBoss, RR_WATER_TEMPLE_BOSS_ENTRYWAY, RR_WATER_TEMPLE_BOSS_ROOM, ENTR_WATER_TEMPLE_BOSS_ENTRANCE }, - { EntranceType::AdultBoss, RR_WATER_TEMPLE_BOSS_ROOM, RR_WATER_TEMPLE_BOSS_ENTRYWAY, ENTR_WATER_TEMPLE_BOSS_DOOR } }, - { { EntranceType::AdultBoss, RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, RR_SPIRIT_TEMPLE_BOSS_ROOM, ENTR_SPIRIT_TEMPLE_BOSS_ENTRANCE }, - { EntranceType::AdultBoss, RR_SPIRIT_TEMPLE_BOSS_ROOM, RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, ENTR_SPIRIT_TEMPLE_BOSS_DOOR } }, - { { EntranceType::AdultBoss, RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, RR_SHADOW_TEMPLE_BOSS_ROOM, ENTR_SHADOW_TEMPLE_BOSS_ENTRANCE }, - { EntranceType::AdultBoss, RR_SHADOW_TEMPLE_BOSS_ROOM, RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, ENTR_SHADOW_TEMPLE_BOSS_DOOR } }, + { { EntranceType::ChildBoss, RR_DEKU_TREE_BOSS_ENTRYWAY, RR_DEKU_TREE_BOSS_ROOM, ENTR_DEKU_TREE_BOSS_ENTRANCE }, + { EntranceType::ChildBoss, RR_DEKU_TREE_BOSS_ROOM, RR_DEKU_TREE_BOSS_EXIT, ENTR_DEKU_TREE_BOSS_DOOR } }, + { { EntranceType::ChildBoss, RR_DODONGOS_CAVERN_BOSS_ENTRYWAY, RR_DODONGOS_CAVERN_BOSS_ROOM, ENTR_DODONGOS_CAVERN_BOSS_ENTRANCE }, + { EntranceType::ChildBoss, RR_DODONGOS_CAVERN_BOSS_ROOM, RR_DODONGOS_CAVERN_BOSS_EXIT, ENTR_DODONGOS_CAVERN_BOSS_DOOR } }, + { { EntranceType::ChildBoss, RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY, RR_JABU_JABUS_BELLY_BOSS_ROOM, ENTR_JABU_JABU_BOSS_ENTRANCE }, + { EntranceType::ChildBoss, RR_JABU_JABUS_BELLY_BOSS_ROOM, RR_JABU_JABUS_BELLY_BOSS_EXIT, ENTR_JABU_JABU_BOSS_DOOR } }, + { { EntranceType::AdultBoss, RR_FOREST_TEMPLE_BOSS_ENTRYWAY, RR_FOREST_TEMPLE_BOSS_ROOM, ENTR_FOREST_TEMPLE_BOSS_ENTRANCE }, + { EntranceType::AdultBoss, RR_FOREST_TEMPLE_BOSS_ROOM, RR_FOREST_TEMPLE_BOSS_ENTRYWAY, ENTR_FOREST_TEMPLE_BOSS_DOOR } }, + { { EntranceType::AdultBoss, RR_FIRE_TEMPLE_BOSS_ENTRYWAY, RR_FIRE_TEMPLE_BOSS_ROOM, ENTR_FIRE_TEMPLE_BOSS_ENTRANCE }, + { EntranceType::AdultBoss, RR_FIRE_TEMPLE_BOSS_ROOM, RR_FIRE_TEMPLE_BOSS_ENTRYWAY, ENTR_FIRE_TEMPLE_BOSS_DOOR } }, + { { EntranceType::AdultBoss, RR_WATER_TEMPLE_BOSS_ENTRYWAY, RR_WATER_TEMPLE_BOSS_ROOM, ENTR_WATER_TEMPLE_BOSS_ENTRANCE }, + { EntranceType::AdultBoss, RR_WATER_TEMPLE_BOSS_ROOM, RR_WATER_TEMPLE_BOSS_ENTRYWAY, ENTR_WATER_TEMPLE_BOSS_DOOR } }, + { { EntranceType::AdultBoss, RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, RR_SPIRIT_TEMPLE_BOSS_ROOM, ENTR_SPIRIT_TEMPLE_BOSS_ENTRANCE }, + { EntranceType::AdultBoss, RR_SPIRIT_TEMPLE_BOSS_ROOM, RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, ENTR_SPIRIT_TEMPLE_BOSS_DOOR } }, + { { EntranceType::AdultBoss, RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, RR_SHADOW_TEMPLE_BOSS_ROOM, ENTR_SHADOW_TEMPLE_BOSS_ENTRANCE }, + { EntranceType::AdultBoss, RR_SHADOW_TEMPLE_BOSS_ROOM, RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, ENTR_SHADOW_TEMPLE_BOSS_DOOR } }, { { EntranceType::BlueWarp, RR_DEKU_TREE_BOSS_ROOM, RR_KF_OUTSIDE_DEKU_TREE, ENTR_KOKIRI_FOREST_DEKU_TREE_BLUE_WARP }, NO_RETURN_ENTRANCE }, @@ -1488,11 +1488,11 @@ int EntranceShuffler::ShuffleAllEntrances() { if (true /* ctx->GetOption(RSK_SHUFFLE_BLUEWARP_ENTRANCES).Is(RO_BLUEWARP_ENTRANCE_SHUFFLE_DUNGEON) */) { // If a boss room is inside a boss door, make the blue warp go outside the dungeon's entrance std::map bossExits = { - { EntranceNameByRegions(RR_DEKU_TREE_BOSS_ROOM, RR_DEKU_TREE_BOSS_ENTRYWAY), + { EntranceNameByRegions(RR_DEKU_TREE_BOSS_ROOM, RR_DEKU_TREE_BOSS_EXIT), GetEntrance(EntranceNameByRegions(RR_DEKU_TREE_ENTRYWAY, RR_KF_OUTSIDE_DEKU_TREE)) }, - { EntranceNameByRegions(RR_DODONGOS_CAVERN_BOSS_ROOM, RR_DODONGOS_CAVERN_BOSS_ENTRYWAY), + { EntranceNameByRegions(RR_DODONGOS_CAVERN_BOSS_ROOM, RR_DODONGOS_CAVERN_BOSS_EXIT), GetEntrance(EntranceNameByRegions(RR_DODONGOS_CAVERN_ENTRYWAY, RR_DEATH_MOUNTAIN_TRAIL)) }, - { EntranceNameByRegions(RR_JABU_JABUS_BELLY_BOSS_ROOM, RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY), + { EntranceNameByRegions(RR_JABU_JABUS_BELLY_BOSS_ROOM, RR_JABU_JABUS_BELLY_BOSS_EXIT), GetEntrance(EntranceNameByRegions(RR_JABU_JABUS_BELLY_ENTRYWAY, RR_ZORAS_FOUNTAIN)) }, { EntranceNameByRegions(RR_FOREST_TEMPLE_BOSS_ROOM, RR_FOREST_TEMPLE_BOSS_ENTRYWAY), GetEntrance(EntranceNameByRegions(RR_FOREST_TEMPLE_ENTRYWAY, RR_SACRED_FOREST_MEADOW)) }, @@ -1530,11 +1530,11 @@ int EntranceShuffler::ShuffleAllEntrances() { // Pair std::vector bossRoomExitPairs = { { GetEntrance(EntranceNameByRegions(RR_DEKU_TREE_BOSS_ROOM, RR_KF_OUTSIDE_DEKU_TREE)), - GetEntrance(EntranceNameByRegions(RR_DEKU_TREE_BOSS_ROOM, RR_DEKU_TREE_BOSS_ENTRYWAY)) }, + GetEntrance(EntranceNameByRegions(RR_DEKU_TREE_BOSS_ROOM, RR_DEKU_TREE_BOSS_EXIT)) }, { GetEntrance(EntranceNameByRegions(RR_DODONGOS_CAVERN_BOSS_ROOM, RR_DEATH_MOUNTAIN_TRAIL)), - GetEntrance(EntranceNameByRegions(RR_DODONGOS_CAVERN_BOSS_ROOM, RR_DODONGOS_CAVERN_BOSS_ENTRYWAY)) }, + GetEntrance(EntranceNameByRegions(RR_DODONGOS_CAVERN_BOSS_ROOM, RR_DODONGOS_CAVERN_BOSS_EXIT)) }, { GetEntrance(EntranceNameByRegions(RR_JABU_JABUS_BELLY_BOSS_ROOM, RR_ZORAS_FOUNTAIN)), - GetEntrance(EntranceNameByRegions(RR_JABU_JABUS_BELLY_BOSS_ROOM, RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY)) }, + GetEntrance(EntranceNameByRegions(RR_JABU_JABUS_BELLY_BOSS_ROOM, RR_JABU_JABUS_BELLY_BOSS_EXIT)) }, { GetEntrance(EntranceNameByRegions(RR_FOREST_TEMPLE_BOSS_ROOM, RR_SACRED_FOREST_MEADOW)), GetEntrance(EntranceNameByRegions(RR_FOREST_TEMPLE_BOSS_ROOM, RR_FOREST_TEMPLE_BOSS_ENTRYWAY)) }, { GetEntrance(EntranceNameByRegions(RR_FIRE_TEMPLE_BOSS_ROOM, RR_DMC_CENTRAL_LOCAL)), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp index f327c9992..c829d1bc9 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp @@ -436,11 +436,16 @@ void RegionTable_Init_DekuTree() { #pragma endregion // Boss Room + // RANDOTODO make it so entrance randomiser can properly handle more than 1 access to that entrance areaTable[RR_DEKU_TREE_BOSS_ENTRYWAY] = Region("Deku Tree Boss Entryway", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + // Exits + Entrance(RR_DEKU_TREE_BOSS_ROOM, []{return true;}), + }); + + areaTable[RR_DEKU_TREE_BOSS_EXIT] = Region("Deku Tree Boss Exit", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, { // Exits Entrance(RR_DEKU_TREE_OUTSIDE_BOSS_ROOM, []{return ctx->GetDungeon(DEKU_TREE)->IsVanilla();}), Entrance(RR_DEKU_TREE_MQ_OUTSIDE_BOSS_ROOM, []{return ctx->GetDungeon(DEKU_TREE)->IsMQ();}), - Entrance(RR_DEKU_TREE_BOSS_ROOM, []{return true;}), }); areaTable[RR_DEKU_TREE_BOSS_ROOM] = Region("Deku Tree Boss Room", "Deku Tree", {}, NO_DAY_NIGHT_CYCLE, { @@ -460,8 +465,8 @@ void RegionTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_QUEEN_GOHMA_GRASS_8, logic->CanCutShrubs()), }, { // Exits - Entrance(RR_DEKU_TREE_BOSS_ENTRYWAY, []{return true;}), - Entrance(RR_KF_OUTSIDE_DEKU_TREE, []{return logic->DekuTreeClear;}, false), + Entrance(RR_DEKU_TREE_BOSS_EXIT, []{return true;}), + Entrance(RR_KF_OUTSIDE_DEKU_TREE, []{return logic->DekuTreeClear;}, false), }); // clang-format on diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp index 8cd60f268..9488f2d82 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp @@ -558,11 +558,16 @@ void RegionTable_Init_DodongosCavern() { #pragma endregion // Boss Room + // RANDOTODO make it so entrance randomiser can properly handle more than 1 access to that entrance areaTable[RR_DODONGOS_CAVERN_BOSS_ENTRYWAY] = Region("Dodongos Cavern Boss Entryway", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, { + // Exits + Entrance(RR_DODONGOS_CAVERN_BOSS_ROOM, []{return true;}), + }); + + areaTable[RR_DODONGOS_CAVERN_BOSS_EXIT] = Region("Dodongos Cavern Boss Exit", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, { // Exits Entrance(RR_DODONGOS_CAVERN_BOSS_AREA, []{return ctx->GetDungeon(DODONGOS_CAVERN)->IsVanilla();}), Entrance(RR_DODONGOS_CAVERN_MQ_BEHIND_MOUTH, []{return ctx->GetDungeon(DODONGOS_CAVERN)->IsMQ();}), - Entrance(RR_DODONGOS_CAVERN_BOSS_ROOM, []{return true;}), }); areaTable[RR_DODONGOS_CAVERN_BOSS_ROOM] = Region("Dodongos Cavern Boss Room", "Dodongos Cavern", {}, NO_DAY_NIGHT_CYCLE, { @@ -575,8 +580,8 @@ void RegionTable_Init_DodongosCavern() { LOCATION(RC_KING_DODONGO, logic->DodongosCavernClear), }, { // Exits - Entrance(RR_DODONGOS_CAVERN_BOSS_ENTRYWAY, []{return true;}), - Entrance(RR_DEATH_MOUNTAIN_TRAIL, []{return logic->DodongosCavernClear;}, false), + Entrance(RR_DODONGOS_CAVERN_BOSS_EXIT, []{return true;}), + Entrance(RR_DEATH_MOUNTAIN_TRAIL, []{return logic->DodongosCavernClear;}, false), }); // clang-format on diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp index 70cf890b0..2e1a6ef14 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp @@ -38,7 +38,7 @@ void RegionTable_Init_FireTemple() { }, { //Exits Entrance(RR_FIRE_TEMPLE_FIRST_ROOM, []{return true;}), - Entrance(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, []{return logic->HasItem(RG_FIRE_TEMPLE_BOSS_KEY) && ((logic->IsAdult && (ctx->GetTrickOption(RT_FIRE_BOSS_DOOR_JUMP) || Here(RR_FIRE_TEMPLE_FIRE_MAZE_UPPER, []{return logic->CanUse(RG_MEGATON_HAMMER);}))) || logic->CanUse(RG_HOVER_BOOTS));}), + Entrance(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, []{return logic->IsAdult && (ctx->GetTrickOption(RT_FIRE_BOSS_DOOR_JUMP) || Here(RR_FIRE_TEMPLE_FIRE_MAZE_UPPER, []{return logic->CanUse(RG_MEGATON_HAMMER);}) || logic->CanUse(RG_HOVER_BOOTS));}), }); areaTable[RR_FIRE_TEMPLE_LOOP_ENEMIES] = Region("Fire Temple Loop Enemies", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { @@ -445,7 +445,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_FIRST_ROOM_UPPER, []{return true;}), //Child cannot make it to the north side torches without a hook without specifically bunny hood speed + hover boots Entrance(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM_NORTH, []{return logic->FireTimer() > 32 && (logic->CanUse(RG_HOOKSHOT) || (logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)));}), - Entrance(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, []{return logic->HasItem(RG_FIRE_TEMPLE_BOSS_KEY) && logic->FireTimer() >= 15 && ((logic->IsAdult && (ctx->GetTrickOption(RT_FIRE_BOSS_DOOR_JUMP) || logic->CanUse(RG_HOVER_BOOTS))) || (logic->IsAdult && logic->HitFireTemplePlatform) || (logic->HitFireTemplePlatform && logic->CanUse(RG_HOVER_BOOTS)));}), + Entrance(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, []{return logic->FireTimer() >= 15 && ((logic->IsAdult && (ctx->GetTrickOption(RT_FIRE_BOSS_DOOR_JUMP) || logic->CanUse(RG_HOVER_BOOTS))) || (logic->IsAdult && logic->HitFireTemplePlatform) || (logic->HitFireTemplePlatform && logic->CanUse(RG_HOVER_BOOTS)));}), }); //This room assumes tunic logic is handled on entry. @@ -740,7 +740,7 @@ void RegionTable_Init_FireTemple() { // Exits Entrance(RR_FIRE_TEMPLE_NEAR_BOSS_ROOM, []{return ctx->GetDungeon(FIRE_TEMPLE)->IsVanilla() && false;}), Entrance(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM, []{return ctx->GetDungeon(FIRE_TEMPLE)->IsMQ() && false;}), - Entrance(RR_FIRE_TEMPLE_BOSS_ROOM, []{return true;}), + Entrance(RR_FIRE_TEMPLE_BOSS_ROOM, []{return logic->HasItem(RG_FIRE_TEMPLE_BOSS_KEY);}), }); areaTable[RR_FIRE_TEMPLE_BOSS_ROOM] = Region("Fire Temple Boss Room", "Fire Temple", {}, NO_DAY_NIGHT_CYCLE, { diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp index 2f5ba96bf..c8d80f98d 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp @@ -298,7 +298,7 @@ void RegionTable_Init_ForestTemple() { }, { //Exits Entrance(RR_FOREST_TEMPLE_LOBBY, []{return true;}), - Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, []{return logic->HasItem(RG_FOREST_TEMPLE_BOSS_KEY);}), + Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, []{return true;}), }); #pragma endregion @@ -593,7 +593,7 @@ void RegionTable_Init_ForestTemple() { areaTable[RR_FOREST_TEMPLE_MQ_BOSS_REGION] = Region("Forest Temple MQ Boss Region", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_MQ_BASEMENT, []{return logic->ForestOpenBossCorridor;}), - Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, []{return logic->HasItem(RG_FOREST_TEMPLE_BOSS_KEY);}), + Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, []{return true;}), }); #pragma endregion @@ -603,7 +603,7 @@ void RegionTable_Init_ForestTemple() { // Exits Entrance(RR_FOREST_TEMPLE_BOSS_REGION, []{return ctx->GetDungeon(FOREST_TEMPLE)->IsVanilla() && false;}), Entrance(RR_FOREST_TEMPLE_MQ_BOSS_REGION, []{return ctx->GetDungeon(FOREST_TEMPLE)->IsMQ() && false;}), - Entrance(RR_FOREST_TEMPLE_BOSS_ROOM, []{return true;}), + Entrance(RR_FOREST_TEMPLE_BOSS_ROOM, []{return logic->HasItem(RG_FOREST_TEMPLE_BOSS_KEY);}), }); areaTable[RR_FOREST_TEMPLE_BOSS_ROOM] = Region("Forest Temple Boss Room", "Forest Temple", {}, NO_DAY_NIGHT_CYCLE, { diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp index 451225273..e4c33b49a 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp @@ -29,12 +29,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_SHADOW_TRIAL, []{return true;}), Entrance(RR_GANONS_CASTLE_SPIRIT_TRIAL, []{return true;}), Entrance(RR_GANONS_CASTLE_LIGHT_TRIAL, []{return logic->CanUse(RG_GOLDEN_GAUNTLETS);}), - Entrance(RR_GANONS_TOWER_ENTRYWAY, []{return (logic->ForestTrialClear || ctx->GetTrial(TK_FOREST_TRIAL)->IsSkipped()) && - (logic->FireTrialClear || ctx->GetTrial(TK_FIRE_TRIAL)->IsSkipped()) && - (logic->WaterTrialClear || ctx->GetTrial(TK_WATER_TRIAL)->IsSkipped()) && - (logic->ShadowTrialClear || ctx->GetTrial(TK_SHADOW_TRIAL)->IsSkipped()) && - (logic->SpiritTrialClear || ctx->GetTrial(TK_SPIRIT_TRIAL)->IsSkipped()) && - (logic->LightTrialClear || ctx->GetTrial(TK_LIGHT_TRIAL)->IsSkipped());}), + Entrance(RR_GANONS_TOWER_ENTRYWAY, []{return true;}), Entrance(RR_GANONS_CASTLE_DEKU_SCRUBS, []{return ctx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH);}), }); @@ -162,13 +157,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_STARTING_LEDGE, []{return true;}), Entrance(RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_CHAIRS_ROOM, []{return true;}), Entrance(RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_DINOLFOS_ROOM, []{return Here(RR_GANONS_CASTLE_MQ_MAIN, []{return logic->CanUse(RG_GOLDEN_GAUNTLETS);});}), - //RANDOTODO could we just set these events automatically based on the setting? - Entrance(RR_GANONS_TOWER_ENTRYWAY, []{return (logic->ForestTrialClear || ctx->GetTrial(TK_FOREST_TRIAL)->IsSkipped()) && - (logic->FireTrialClear || ctx->GetTrial(TK_FIRE_TRIAL)->IsSkipped()) && - (logic->WaterTrialClear || ctx->GetTrial(TK_WATER_TRIAL)->IsSkipped()) && - (logic->ShadowTrialClear || ctx->GetTrial(TK_SHADOW_TRIAL)->IsSkipped()) && - (logic->SpiritTrialClear || ctx->GetTrial(TK_SPIRIT_TRIAL)->IsSkipped()) && - (logic->LightTrialClear || ctx->GetTrial(TK_LIGHT_TRIAL)->IsSkipped());}), + Entrance(RR_GANONS_TOWER_ENTRYWAY, []{return true;}), Entrance(RR_GANONS_CASTLE_MQ_DEKU_SCRUBS, []{return ctx->GetTrickOption(RT_LENS_GANON_MQ) || logic->CanUse(RG_LENS_OF_TRUTH);}), }); @@ -436,7 +425,13 @@ void RegionTable_Init_GanonsCastle() { //Exits Entrance(RR_GANONS_CASTLE_LOBBY, []{return ctx->GetDungeon(GANONS_CASTLE)->IsVanilla();}), Entrance(RR_GANONS_CASTLE_MQ_MAIN, []{return ctx->GetDungeon(GANONS_CASTLE)->IsMQ();}), - Entrance(RR_GANONS_TOWER_FLOOR_1, []{return true;}), + //RANDOTODO could we just set these events automatically based on the setting? + Entrance(RR_GANONS_TOWER_FLOOR_1, []{return (logic->ForestTrialClear || ctx->GetTrial(TK_FOREST_TRIAL)->IsSkipped()) && + (logic->FireTrialClear || ctx->GetTrial(TK_FIRE_TRIAL)->IsSkipped()) && + (logic->WaterTrialClear || ctx->GetTrial(TK_WATER_TRIAL)->IsSkipped()) && + (logic->ShadowTrialClear || ctx->GetTrial(TK_SHADOW_TRIAL)->IsSkipped()) && + (logic->SpiritTrialClear || ctx->GetTrial(TK_SPIRIT_TRIAL)->IsSkipped()) && + (logic->LightTrialClear || ctx->GetTrial(TK_LIGHT_TRIAL)->IsSkipped());}), }); areaTable[RR_GANONS_TOWER_FLOOR_1] = Region("Ganon's Tower Floor 1", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp index 3c45682ae..95494212a 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp @@ -351,10 +351,14 @@ void RegionTable_Init_JabuJabusBelly() { // Boss Room areaTable[RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY] = Region("Jabu Jabus Belly Boss Entryway", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, {}, { + // Exits + Entrance(RR_JABU_JABUS_BELLY_BOSS_ROOM, []{return true;}), + }); + + areaTable[RR_JABU_JABUS_BELLY_BOSS_EXIT] = Region("Jabu Jabus Belly Boss Exit", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, {}, { // Exits Entrance(RR_JABU_JABUS_BELLY_NEAR_BOSS_ROOM, []{return ctx->GetDungeon(JABU_JABUS_BELLY)->IsVanilla();}), Entrance(RR_JABU_JABUS_BELLY_MQ_EAST_ROOM, []{return ctx->GetDungeon(JABU_JABUS_BELLY)->IsMQ();}), - Entrance(RR_JABU_JABUS_BELLY_BOSS_ROOM, []{return true;}), }); areaTable[RR_JABU_JABUS_BELLY_BOSS_ROOM] = Region("Jabu Jabus Belly Boss Room", "Jabu Jabus Belly", {}, NO_DAY_NIGHT_CYCLE, { @@ -372,8 +376,8 @@ void RegionTable_Init_JabuJabusBelly() { LOCATION(RC_BARINADE, logic->JabuJabusBellyClear), }, { // Exits - Entrance(RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY, []{return false;}), - Entrance(RR_ZORAS_FOUNTAIN, []{return logic->JabuJabusBellyClear;}, false), + Entrance(RR_JABU_JABUS_BELLY_BOSS_EXIT, []{return false;}), + Entrance(RR_ZORAS_FOUNTAIN, []{return logic->JabuJabusBellyClear;}, false), }); // clang-format on diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp index 3be1acac4..eef68c78b 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp @@ -112,7 +112,7 @@ void RegionTable_Init_ShadowTemple() { LOCATION(RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DISTANT_SCARECROW) || (ctx->GetTrickOption(RT_SHADOW_STATUE) && logic->CanUse(RG_BOMBCHU_5))) && logic->CanUse(RG_SONG_OF_TIME) || (logic->CanUse(RG_DISTANT_SCARECROW) && logic->CanUse(RG_HOVER_BOOTS))), }, { //Exits - Entrance(RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, []{return (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DISTANT_SCARECROW) || (ctx->GetTrickOption(RT_SHADOW_STATUE) && logic->CanUse(RG_BOMBCHU_5))) && logic->SmallKeys(RR_SHADOW_TEMPLE, 5) && logic->CanUse(RG_HOVER_BOOTS) && logic->HasItem(RG_SHADOW_TEMPLE_BOSS_KEY);}) + Entrance(RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, []{return (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DISTANT_SCARECROW) || (ctx->GetTrickOption(RT_SHADOW_STATUE) && logic->CanUse(RG_BOMBCHU_5))) && logic->SmallKeys(RR_SHADOW_TEMPLE, 5) && logic->CanUse(RG_HOVER_BOOTS);}) }); #pragma endregion @@ -370,7 +370,7 @@ void RegionTable_Init_ShadowTemple() { }, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_ACROSS_CHASM, []{return logic->CanUse(RG_HOVER_BOOTS) && (ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->CanUse(RG_LENS_OF_TRUTH));}), - Entrance(RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, []{return logic->HasItem(RG_SHADOW_TEMPLE_BOSS_KEY);}), + Entrance(RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, []{return true;}), }); //Assumes lens is checked on entry @@ -403,7 +403,7 @@ void RegionTable_Init_ShadowTemple() { // Exits Entrance(RR_SHADOW_TEMPLE_BEYOND_BOAT, []{return ctx->GetDungeon(SHADOW_TEMPLE)->IsVanilla() && false;}), Entrance(RR_SHADOW_TEMPLE_MQ_BEYOND_BOAT, []{return ctx->GetDungeon(SHADOW_TEMPLE)->IsMQ() && false;}), - Entrance(RR_SHADOW_TEMPLE_BOSS_ROOM, []{return true;}), + Entrance(RR_SHADOW_TEMPLE_BOSS_ROOM, []{return logic->HasItem(RG_SHADOW_TEMPLE_BOSS_KEY);}), }); areaTable[RR_SHADOW_TEMPLE_BOSS_ROOM] = Region("Shadow Temple Boss Room", "Shadow Temple", {}, NO_DAY_NIGHT_CYCLE, { diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp index e7f9c0ee6..72aa9974b 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp @@ -145,7 +145,7 @@ void RegionTable_Init_SpiritTemple() { areaTable[RR_SPIRIT_TEMPLE_INSIDE_STATUE_HEAD] = Region("Spirit Temple Inside Statue Head", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { // Exits Entrance(RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER, []{return true;}), - Entrance(RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, []{return logic->HasItem(RG_SPIRIT_TEMPLE_BOSS_KEY);}), + Entrance(RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, []{return true;}), }); #pragma endregion @@ -541,7 +541,7 @@ void RegionTable_Init_SpiritTemple() { areaTable[RR_SPIRIT_TEMPLE_MQ_INSIDE_STATUE_HEAD] = Region("Spirit Temple MQ Inside Statue Head", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { // Exits Entrance(RR_SPIRIT_TEMPLE_MQ_LOBBY, []{return true;}), - Entrance(RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, []{return logic->HasItem(RG_SPIRIT_TEMPLE_BOSS_KEY);}), + Entrance(RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, []{return true;}), }); #pragma endregion @@ -551,7 +551,7 @@ void RegionTable_Init_SpiritTemple() { // Exits Entrance(RR_SPIRIT_TEMPLE_INSIDE_STATUE_HEAD, []{return ctx->GetDungeon(SPIRIT_TEMPLE)->IsVanilla() && false;}), Entrance(RR_SPIRIT_TEMPLE_MQ_INSIDE_STATUE_HEAD, []{return ctx->GetDungeon(SPIRIT_TEMPLE)->IsMQ() && false;}), - Entrance(RR_SPIRIT_TEMPLE_BOSS_ROOM, []{return true;}), + Entrance(RR_SPIRIT_TEMPLE_BOSS_ROOM, []{return logic->HasItem(RG_SPIRIT_TEMPLE_BOSS_KEY);}), }); areaTable[RR_SPIRIT_TEMPLE_BOSS_ROOM] = Region("Spirit Temple Boss Room", "Spirit Temple", {}, NO_DAY_NIGHT_CYCLE, { diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp index 04c1279bd..ccbc2f688 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp @@ -277,7 +277,7 @@ void RegionTable_Init_WaterTemple() { }, { //Exits Entrance(RR_WATER_TEMPLE_LOBBY, []{return true;}), - Entrance(RR_WATER_TEMPLE_BOSS_ENTRYWAY, []{return logic->HasItem(RG_WATER_TEMPLE_BOSS_KEY);}), + Entrance(RR_WATER_TEMPLE_BOSS_ENTRYWAY, []{return true;}), }); #pragma endregion @@ -365,7 +365,7 @@ void RegionTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_MQ_BOSS_DOOR] = Region("Water Temple MQ Main", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_MQ_3F_NORTH_LEDGE, []{return logic->CanUse(RG_ICE_ARROWS) || logic->TakeDamage();}), - Entrance(RR_WATER_TEMPLE_BOSS_ENTRYWAY, []{return logic->HasItem(RG_WATER_TEMPLE_BOSS_KEY);}), + Entrance(RR_WATER_TEMPLE_BOSS_ENTRYWAY, []{return true;}), }); areaTable[RR_WATER_TEMPLE_MQ_EAST_TOWER] = Region("Water Temple MQ East Tower", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { @@ -843,7 +843,7 @@ void RegionTable_Init_WaterTemple() { // Exits Entrance(RR_WATER_TEMPLE_PRE_BOSS_ROOM, []{return ctx->GetDungeon(WATER_TEMPLE)->IsVanilla() && false;}), Entrance(RR_WATER_TEMPLE_MQ_BOSS_DOOR, []{return ctx->GetDungeon(WATER_TEMPLE)->IsMQ() && false;}), - Entrance(RR_WATER_TEMPLE_BOSS_ROOM, []{return true;}), + Entrance(RR_WATER_TEMPLE_BOSS_ROOM, []{return logic->HasItem(RG_WATER_TEMPLE_BOSS_KEY);}), }); areaTable[RR_WATER_TEMPLE_BOSS_ROOM] = Region("Water Temple Boss Room", "Water Temple", {}, NO_DAY_NIGHT_CYCLE, { diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index ce074bf4c..396a37b23 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -566,6 +566,7 @@ typedef enum { RR_DEKU_TREE_MQ_OUTSIDE_BOSS_ROOM, RR_DEKU_TREE_BOSS_ENTRYWAY, + RR_DEKU_TREE_BOSS_EXIT, RR_DEKU_TREE_BOSS_ROOM, RR_DODONGOS_CAVERN_BEGINNING, @@ -613,7 +614,9 @@ typedef enum { RR_DODONGOS_CAVERN_MQ_BEHIND_MOUTH, RR_DODONGOS_CAVERN_MQ_BACK_BEHIND_FIRE, RR_DODONGOS_CAVERN_MQ_BACK_SWITCH_GRAVE, + RR_DODONGOS_CAVERN_BOSS_ENTRYWAY, + RR_DODONGOS_CAVERN_BOSS_EXIT, RR_DODONGOS_CAVERN_BOSS_ROOM, RR_JABU_JABUS_BELLY_BEGINNING, @@ -642,6 +645,7 @@ typedef enum { RR_JABU_JABUS_BELLY_MQ_EAST_ROOM, RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY, + RR_JABU_JABUS_BELLY_BOSS_EXIT, RR_JABU_JABUS_BELLY_BOSS_ROOM, RR_FOREST_TEMPLE_FIRST_ROOM, From 01ce1eeac8d8dacfc962c52666e622e77f720eba Mon Sep 17 00:00:00 2001 From: Pepper0ni <93387759+Pepper0ni@users.noreply.github.com> Date: Wed, 21 May 2025 16:51:43 +0100 Subject: [PATCH 02/67] Fix oversight in lab boots trick, you need to be able to swim back up (#5524) --- .../randomizer/location_access/overworld/lake_hylia.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp index 36d3ee1a3..19e0497f0 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp @@ -105,7 +105,7 @@ 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_LAB_DIVE, logic->HasItem(RG_GOLDEN_SCALE) || (ctx->GetTrickOption(RT_LH_LAB_DIVING) && logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT) && logic->HasItem(RG_BRONZE_SCALE))), LOCATION(RC_LH_TRADE_FROG, logic->IsAdult && logic->CanUse(RG_EYEBALL_FROG)), LOCATION(RC_LH_GS_LAB_CRATE, logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT) && logic->CanBreakCrates()), LOCATION(RC_LH_LAB_FRONT_RUPEE, logic->CanUse(RG_IRON_BOOTS) || logic->HasItem(RG_GOLDEN_SCALE)), From 2511275b8ba11f5e2149c312f42e402e23891ae8 Mon Sep 17 00:00:00 2001 From: Pepper0ni <93387759+Pepper0ni@users.noreply.github.com> Date: Wed, 21 May 2025 23:01:54 +0100 Subject: [PATCH 03/67] Fix getting heart containers on pocket and skipped impas song (#5518) * fix getting heart containers on pocket and skipped impas song * curse you clang! CURSE YOU! --- soh/soh/Enhancements/randomizer/savefile.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/savefile.cpp b/soh/soh/Enhancements/randomizer/savefile.cpp index 1bed22a71..91b5a50fc 100644 --- a/soh/soh/Enhancements/randomizer/savefile.cpp +++ b/soh/soh/Enhancements/randomizer/savefile.cpp @@ -232,6 +232,8 @@ extern "C" void Randomizer_InitSaveFile() { // Reset triforce pieces collected. gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected = 0; + SetStartingItems(); + // Set Cutscene flags and texts to skip them. Flags_SetEventChkInf(EVENTCHKINF_FIRST_SPOKE_TO_MIDO); Flags_SetInfTable(INFTABLE_SPOKE_TO_KAEPORA_IN_LAKE_HYLIA); @@ -430,6 +432,4 @@ extern "C" void Randomizer_InitSaveFile() { gSaveContext.itemGetInf[3] |= 0x800; // Bunny Hood related gSaveContext.itemGetInf[3] |= 0x8000; // Obtained Mask of Truth } - - SetStartingItems(); } From a9fc317a5a916389449d68d666ff2e2965a0b023 Mon Sep 17 00:00:00 2001 From: Pepper0ni <93387759+Pepper0ni@users.noreply.github.com> Date: Thu, 22 May 2025 23:23:14 +0100 Subject: [PATCH 04/67] Fix crash when no valid enemies are selected (#5519) * fix crash when no valid enemies are selected * Clanged --- soh/soh/Enhancements/enemyrandomizer.cpp | 29 ++++++++++++------------ soh/soh/Enhancements/enemyrandomizer.h | 3 ++- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/soh/soh/Enhancements/enemyrandomizer.cpp b/soh/soh/Enhancements/enemyrandomizer.cpp index 84e1d040e..bdb259719 100644 --- a/soh/soh/Enhancements/enemyrandomizer.cpp +++ b/soh/soh/Enhancements/enemyrandomizer.cpp @@ -270,15 +270,7 @@ extern "C" uint8_t GetRandomizedEnemy(PlayState* play, int16_t* actorId, f32* po // Get randomized enemy ID and parameter. uint32_t seed = play->sceneNum + *actorId + (int)*posX + (int)*posY + (int)*posZ + *rotX + *rotY + *rotZ + *params; - EnemyEntry randomEnemy = GetRandomizedEnemyEntry(seed); - - int8_t timesRandomized = 1; - - // While randomized enemy isn't allowed in certain situations, randomize again. - while (!IsEnemyAllowedToSpawn(play->sceneNum, play->roomCtx.curRoom.num, randomEnemy)) { - randomEnemy = GetRandomizedEnemyEntry(seed + timesRandomized); - timesRandomized++; - } + EnemyEntry randomEnemy = GetRandomizedEnemyEntry(seed, play); *actorId = randomEnemy.id; *params = randomEnemy.params; @@ -334,19 +326,28 @@ void GetSelectedEnemies() { } } -EnemyEntry GetRandomizedEnemyEntry(uint32_t seed) { +EnemyEntry GetRandomizedEnemyEntry(uint32_t seed, PlayState* play) { + std::vector filteredEnemyList = {}; if (selectedEnemyList.size() == 0) { GetSelectedEnemies(); } + for (EnemyEntry enemy : selectedEnemyList) { + if (IsEnemyAllowedToSpawn(play->sceneNum, play->roomCtx.curRoom.num, enemy)) { + filteredEnemyList.push_back(enemy); + } + } + if (filteredEnemyList.size() == 0) { + filteredEnemyList = selectedEnemyList; + } if (CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), ENEMY_RANDOMIZER_OFF) == ENEMY_RANDOMIZER_RANDOM_SEEDED) { uint32_t finalSeed = seed + (IS_RANDO ? Rando::Context::GetInstance()->GetSeed() : gSaveContext.ship.stats.fileCreatedAt); Random_Init(finalSeed); - uint32_t randomNumber = Random(0, selectedEnemyList.size()); - return selectedEnemyList[randomNumber]; + uint32_t randomNumber = Random(0, filteredEnemyList.size()); + return filteredEnemyList[randomNumber]; } else { - uint32_t randomSelectedEnemy = Random(0, selectedEnemyList.size()); - return selectedEnemyList[randomSelectedEnemy]; + uint32_t randomSelectedEnemy = Random(0, filteredEnemyList.size()); + return filteredEnemyList[randomSelectedEnemy]; } } diff --git a/soh/soh/Enhancements/enemyrandomizer.h b/soh/soh/Enhancements/enemyrandomizer.h index 4c4fd5576..6f80503df 100644 --- a/soh/soh/Enhancements/enemyrandomizer.h +++ b/soh/soh/Enhancements/enemyrandomizer.h @@ -1,6 +1,7 @@ #pragma once #include +#include "item-tables/ItemTableTypes.h" typedef struct EnemyEntry { int16_t id; @@ -11,7 +12,7 @@ typedef struct EnemyEntry { bool IsEnemyFoundToRandomize(int16_t sceneNum, int8_t roomNum, int16_t actorId, int16_t params, float posX); bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy); -EnemyEntry GetRandomizedEnemyEntry(uint32_t seed); +EnemyEntry GetRandomizedEnemyEntry(uint32_t seed, PlayState* play); extern const char* enemyCVarList[]; extern const char* enemyNameList[]; From d69a45674f7641eae3764f8bbbc6f016314c8854 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Fri, 23 May 2025 14:06:25 -0700 Subject: [PATCH 05/67] Adds a check for "OneDrive" in the execution path to the startup errors that prevent running. (#5522) --- soh/soh/OTRGlobals.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index dcabfca70..3195bf2b7 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1145,6 +1145,13 @@ extern "C" void InitOTR() { "Error", "SoH does not have proper file permissions. Please move it to a folder that does and run again."); exit(1); } + if (ownPath.string().find("OneDrive") != std::string::npos) { + Extractor::ShowErrorBox( + "Error", + "SoH appears to be in a OneDrive folder, which will cause issues. " + "Please move it to a folder outside of OneDrive, like the root of a drive (e.g. \"C:\\Games\\SoH\")."); + exit(1); + } #endif #if not defined(__SWITCH__) && not defined(__WIIU__) From d330f22071e4257759dc5e04f2b47a069b68e29b Mon Sep 17 00:00:00 2001 From: xxAtrain223 Date: Fri, 23 May 2025 19:49:01 -0500 Subject: [PATCH 06/67] Available Checks Entrance Shuffle (#5363) * EntranceShuffler ApplyEntranceOverrides. * Updated ApplyEntranceOverrides. * Updated ApplyEntranceOverrides. * Initial Entrance Discovery. * Added Randomizer_EntranceDiscovered. * Updated Randomizer_DiscoverRegion to discover unshuffled connected regions. * Removed extra semi-colon. * Update to latest entranceShuffleTable. * Format fixes. * Updated EntranceDiscovered to account for entrances not in the entranceShuffleTable. * Rediscover regions when loading a game. * Rediscover entrances when enabling Available Checks. * Added Rando::Context::ParseTricksJson. * Updated ApplyEntranceOverrides to skip default (unset) overrides. * Fix clang-format failed check. * Set mLACSCondition when loading a Randomizer game. * Updated rediscover loop to use MAX_ENTRANCE_RANDO_USED_INDEX. * Move entrance discovered into ProcessExits. * Discover spawns when pulling/placing the master sword. * Discover adult/child spawn when using Song of Time to switch age. * Reset logic and ApplyOrStoreItems without applying the item effects to the save when calculating available checks. * Removed !itemLoc->IsAddedToPool() from the check tracker. * Remove region discovery as its not needed anymore. * Cleanup changed files for PR. * Added Available Checks - Process Undiscovered Exits DebugConsole command. * Added initial Available Checks - Recalculate DebugConsole command. * ACPUE, recalculate only if save loaded. ACR, set age and times for the starting region. --- soh/soh/Enhancements/debugconsole.cpp | 60 ++ soh/soh/Enhancements/mods.cpp | 7 + .../Enhancements/randomizer/3drando/fill.cpp | 45 +- .../Enhancements/randomizer/3drando/fill.hpp | 4 +- soh/soh/Enhancements/randomizer/context.cpp | 16 + soh/soh/Enhancements/randomizer/context.h | 10 + soh/soh/Enhancements/randomizer/entrance.cpp | 648 +++++++++--------- soh/soh/Enhancements/randomizer/entrance.h | 1 + soh/soh/Enhancements/randomizer/item.cpp | 14 +- .../Enhancements/randomizer/location_access.h | 1 - soh/soh/Enhancements/randomizer/logic.cpp | 66 +- soh/soh/Enhancements/randomizer/logic.h | 5 +- .../randomizer/randomizer_check_tracker.cpp | 48 +- .../randomizer/randomizer_check_tracker.h | 2 +- .../randomizer/randomizer_entrance.c | 1 + soh/soh/Enhancements/randomizer/settings.cpp | 8 + soh/soh/Enhancements/randomizer/settings.h | 8 + soh/soh/OTRGlobals.cpp | 5 +- soh/soh/OTRGlobals.h | 1 + .../actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c | 6 + 20 files changed, 583 insertions(+), 373 deletions(-) diff --git a/soh/soh/Enhancements/debugconsole.cpp b/soh/soh/Enhancements/debugconsole.cpp index db5cc824f..32fc8e72f 100644 --- a/soh/soh/Enhancements/debugconsole.cpp +++ b/soh/soh/Enhancements/debugconsole.cpp @@ -11,6 +11,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/cosmetics/CosmeticsEditor.h" #include "soh/Enhancements/audio/AudioEditor.h" +#include "soh/Enhancements/randomizer/logic.h" #define Path _Path #define PATH_HACK @@ -1450,6 +1451,55 @@ static bool SfxHandler(std::shared_ptr Console, const std::vector return 0; } +static bool AvailabeChecksProcessUndiscoveredExitsHandler(std::shared_ptr Console, + const std::vector& args, std::string* output) { + const auto& logic = Rando::Context::GetInstance()->GetLogic(); + bool enabled = false; + + if (args.size() == 1) { + enabled = !logic->ACProcessUndiscoveredExits; + } else { + try { + enabled = std::stoi(args[1]); + } catch (std::invalid_argument const& ex) { + ERROR_MESSAGE("[SOH] Enable should be 0 or 1"); + return 1; + } + } + + logic->ACProcessUndiscoveredExits = enabled; + INFO_MESSAGE("[SOH] Available Checks - Process Undiscovered Exits %s", + logic->ACProcessUndiscoveredExits ? "enabled" : "disabled"); + + if (GameInteractor::IsSaveLoaded(true)) { + CheckTracker::RecalculateAvailableChecks(); + } + + return 0; +} + +static bool AvailabeChecksRecalculateHandler(std::shared_ptr Console, + const std::vector& args, std::string* output) { + RandomizerRegion startingRegion = RR_ROOT; + + if (args.size() > 1) { + try { + startingRegion = static_cast(std::stoi(args[1])); + } catch (std::invalid_argument const& ex) { + ERROR_MESSAGE("[SOH] Region should be a number"); + return 1; + } + + if (startingRegion <= RR_NONE || startingRegion >= RR_MAX) { + ERROR_MESSAGE("[SOH] Region should be between 1 and %d", RR_MAX - 1); + return 1; + } + } + + CheckTracker::RecalculateAvailableChecks(startingRegion); + return 0; +} + void DebugConsole_Init(void) { // Console CMD_REGISTER("file_select", { FileSelectHandler, "Returns to the file select." }); @@ -1708,5 +1758,15 @@ void DebugConsole_Init(void) { { "group_name", Ship::ArgumentType::TEXT, true }, } }); + CMD_REGISTER("acpue", { AvailabeChecksProcessUndiscoveredExitsHandler, + "Available Checks - Process Undiscovered Exits", + { { "enable", Ship::ArgumentType::NUMBER, true } } }); + + CMD_REGISTER("acr", { AvailabeChecksRecalculateHandler, + "Available Checks - Recalculate", + { + { "starting_region", Ship::ArgumentType::NUMBER, true }, + } }); + Ship::Context::GetInstance()->GetWindow()->GetGui()->SaveConsoleVariablesNextFrame(); } diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 2c357fd34..180ba4f5e 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -99,6 +99,13 @@ void SwitchAge() { gSaveContext.nextTransitionType = TRANS_TYPE_FADE_BLACK_FAST; gPlayState->linkAgeOnLoad ^= 1; + // Discover adult/child spawns + if (gPlayState->linkAgeOnLoad == LINK_AGE_ADULT) { + Entrance_SetEntranceDiscovered(ENTR_HYRULE_FIELD_10, false); + } else { + Entrance_SetEntranceDiscovered(ENTR_LINKS_HOUSE_CHILD_SPAWN, false); + } + static HOOK_ID hookId = 0; hookId = REGISTER_VB_SHOULD(VB_INFLICT_VOID_DAMAGE, { *should = false; diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.cpp b/soh/soh/Enhancements/randomizer/3drando/fill.cpp index 8885117c3..f2b0e782c 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.cpp @@ -209,6 +209,13 @@ void ProcessExits(Region* region, GetAccessibleLocationsStruct& gals, Randomizer bool stopOnBeatable = false, bool addToPlaythrough = false) { auto ctx = Rando::Context::GetInstance(); for (auto& exit : region->exits) { + int16_t entranceIndex = exit.GetIndex(); + if (!logic->ACProcessUndiscoveredExits && logic->CalculatingAvailableChecks && + ctx->GetOption(RSK_SHUFFLE_ENTRANCES).Get() && exit.IsShuffled() && entranceIndex != -1 && + !Entrance_GetIsEntranceDiscovered(entranceIndex)) { + continue; + } + Region* exitRegion = exit.GetConnectedRegion(); // Update Time of Day Access for the exit if (UpdateToDAccess(&exit, exitRegion)) { @@ -421,18 +428,13 @@ bool AddCheckToLogic(LocationAccess& locPair, GetAccessibleLocationsStruct& gals Rando::ItemLocation* location = ctx->GetItemLocation(loc); RandomizerGet locItem = location->GetPlacedRandomizerGet(); - if (!location->IsAddedToPool() && locPair.ConditionsMet(parentRegion, gals.calculatingAvailableChecks)) { - if (gals.calculatingAvailableChecks) { - gals.accessibleLocations.push_back(loc); - StopPerformanceTimer(PT_LOCATION_LOGIC); - return false; - } - + if (!location->IsAddedToPool() && locPair.ConditionsMet(parentRegion, logic->CalculatingAvailableChecks)) { location->AddToPool(); - if (locItem == RG_NONE) { + if (locItem == RG_NONE || logic->CalculatingAvailableChecks) { gals.accessibleLocations.push_back(loc); // Empty location, consider for placement - } else { + } + if (locItem != RG_NONE) { // If ignore has a value, we want to check if the item location should be considered or not // This is necessary due to the below preprocessing for playthrough generation if (ignore != RG_NONE) { @@ -528,11 +530,32 @@ void ProcessRegion(Region* region, GetAccessibleLocationsStruct& gals, Randomize // Return any of the targetLocations that are accessible in logic std::vector ReachabilitySearch(const std::vector& targetLocations, RandomizerGet ignore /* = RG_NONE*/, - bool calculatingAvailableChecks /* = false */) { + bool calculatingAvailableChecks /* = false */, + RandomizerRegion startingRegion /* = RR_ROOT */) { auto ctx = Rando::Context::GetInstance(); GetAccessibleLocationsStruct gals(0); - gals.calculatingAvailableChecks = calculatingAvailableChecks; ResetLogic(ctx, gals, !calculatingAvailableChecks); + if (startingRegion != RR_ROOT) { + gals.regionPool.insert(gals.regionPool.begin(), startingRegion); + + const auto& region = RegionTable(startingRegion); + if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { + region->childDay = true; + } else { + region->adultDay = true; + } + if (region->timePass) { + if (ctx->GetOption(RSK_SELECTED_STARTING_AGE).Is(RO_AGE_CHILD)) { + region->childNight = true; + } else { + region->adultNight = true; + } + } + } + if (calculatingAvailableChecks) { + logic->Reset(false); + logic->CalculatingAvailableChecks = true; + } do { gals.InitLoop(); for (size_t i = 0; i < gals.regionPool.size(); i++) { diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.hpp b/soh/soh/Enhancements/randomizer/3drando/fill.hpp index a9b864ce2..67043952f 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.hpp @@ -34,8 +34,6 @@ struct GetAccessibleLocationsStruct { std::vector itemSphere; std::list entranceSphere; - bool calculatingAvailableChecks = false; - GetAccessibleLocationsStruct(int _maxGsCount){ regionPool = {RR_ROOT}; gsCount = 0; @@ -64,7 +62,7 @@ std::vector GetEmptyLocations(std::vector allo void ProcessRegion(Region* region, GetAccessibleLocationsStruct& gals, RandomizerGet ignore = RG_NONE, bool stopOnBeatable = false, bool addToPlaythrough = false); -std::vector ReachabilitySearch(const std::vector& allowedLocations, RandomizerGet ignore=RG_NONE, bool calculatingAvailableChecks=false); +std::vector ReachabilitySearch(const std::vector& allowedLocations, RandomizerGet ignore=RG_NONE, bool calculatingAvailableChecks=false, RandomizerRegion startingRegion=RR_ROOT); void GeneratePlaythrough(); diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index fa755325e..7178dd18d 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -401,6 +401,7 @@ void Context::ParseSpoiler(const char* spoilerFileName) { Rando::Settings::GetInstance()->ParseJson(spoilerFileJson); ParseItemLocationsJson(spoilerFileJson); ParseHintJson(spoilerFileJson); + ParseTricksJson(spoilerFileJson); mEntranceShuffler->ParseJson(spoilerFileJson); mDungeons->ParseJson(spoilerFileJson); mTrials->ParseJson(spoilerFileJson); @@ -469,6 +470,17 @@ void Context::ParseHintJson(nlohmann::json spoilerFileJson) { CreateStaticHints(); } +void Context::ParseTricksJson(nlohmann::json spoilerFileJson) { + nlohmann::json enabledTricksJson = spoilerFileJson["enabledTricks"]; + const auto& settings = Rando::Settings::GetInstance(); + for (auto it : enabledTricksJson) { + int rt = settings->GetRandomizerTrickByName(it); + if (rt != -1) { + mTrickOptions[rt].Set(RO_GENERIC_ON); + } + } +} + std::shared_ptr Context::GetEntranceShuffler() { return mEntranceShuffler; } @@ -524,6 +536,10 @@ RandoOptionLACSCondition Context::LACSCondition() const { return mLACSCondition; } +void Context::LACSCondition(RandoOptionLACSCondition lacsCondition) { + mLACSCondition = lacsCondition; +} + std::shared_ptr Context::GetKaleido() { if (mKaleido == nullptr) { mKaleido = std::make_shared(); diff --git a/soh/soh/Enhancements/randomizer/context.h b/soh/soh/Enhancements/randomizer/context.h index 7f18f7a9d..c7e3b3c19 100644 --- a/soh/soh/Enhancements/randomizer/context.h +++ b/soh/soh/Enhancements/randomizer/context.h @@ -104,12 +104,22 @@ class Context { * @return RandoOptionLACSCondition */ RandoOptionLACSCondition LACSCondition() const; + + /** + * @brief Sets the resolved Light Arrow CutScene check condition. + * There is no direct option for this, it is inferred based on the value of a few other options. + * + * @param lacsCondition + */ + void LACSCondition(RandoOptionLACSCondition lacsCondition); + GetItemEntry GetFinalGIEntry(RandomizerCheck rc, bool checkObtainability = true, GetItemID ogItemId = GI_NONE); void ParseSpoiler(const char* spoilerFileName); void ParseHashIconIndexesJson(nlohmann::json spoilerFileJson); void ParseItemLocationsJson(nlohmann::json spoilerFileJson); void WriteHintJson(nlohmann::ordered_json& spoilerFileJson); void ParseHintJson(nlohmann::json spoilerFileJson); + void ParseTricksJson(nlohmann::json spoilerFileJson); std::map overrides = {}; std::vector> playthroughLocations = {}; std::vector everyPossibleLocation = {}; diff --git a/soh/soh/Enhancements/randomizer/entrance.cpp b/soh/soh/Enhancements/randomizer/entrance.cpp index 66da4ee18..45cde2f6f 100644 --- a/soh/soh/Enhancements/randomizer/entrance.cpp +++ b/soh/soh/Enhancements/randomizer/entrance.cpp @@ -250,7 +250,319 @@ std::string EntranceNameByRegions(RandomizerRegion parentRegion, RandomizerRegio return RegionTable(parentRegion)->regionName + " -> " + RegionTable(connectedRegion)->regionName; } -void SetAllEntrancesData(std::vector& entranceShuffleTable) { +std::unordered_map entranceMap; + +void SetAllEntrancesData() { + std::vector entranceShuffleTable = { + // clang-format off + // Type Parent Region Connected Region Index + { { EntranceType::Dungeon, RR_KF_OUTSIDE_DEKU_TREE, RR_DEKU_TREE_ENTRYWAY, ENTR_DEKU_TREE_ENTRANCE }, + { EntranceType::Dungeon, RR_DEKU_TREE_ENTRYWAY, RR_KF_OUTSIDE_DEKU_TREE, ENTR_KOKIRI_FOREST_OUTSIDE_DEKU_TREE } }, + { { EntranceType::Dungeon, RR_DEATH_MOUNTAIN_TRAIL, RR_DODONGOS_CAVERN_ENTRYWAY, ENTR_DODONGOS_CAVERN_ENTRANCE }, + { EntranceType::Dungeon, RR_DODONGOS_CAVERN_ENTRYWAY, RR_DEATH_MOUNTAIN_TRAIL, ENTR_DEATH_MOUNTAIN_TRAIL_OUTSIDE_DODONGOS_CAVERN } }, + { { EntranceType::Dungeon, RR_ZORAS_FOUNTAIN, RR_JABU_JABUS_BELLY_ENTRYWAY, ENTR_JABU_JABU_ENTRANCE }, + { EntranceType::Dungeon, RR_JABU_JABUS_BELLY_ENTRYWAY, RR_ZORAS_FOUNTAIN, ENTR_ZORAS_FOUNTAIN_OUTSIDE_JABU_JABU } }, + { { EntranceType::Dungeon, RR_SACRED_FOREST_MEADOW, RR_FOREST_TEMPLE_ENTRYWAY, ENTR_FOREST_TEMPLE_ENTRANCE }, + { EntranceType::Dungeon, RR_FOREST_TEMPLE_ENTRYWAY, RR_SACRED_FOREST_MEADOW, ENTR_SACRED_FOREST_MEADOW_OUTSIDE_TEMPLE } }, + { { EntranceType::Dungeon, RR_DMC_CENTRAL_LOCAL, RR_FIRE_TEMPLE_ENTRYWAY, ENTR_FIRE_TEMPLE_ENTRANCE }, + { EntranceType::Dungeon, RR_FIRE_TEMPLE_ENTRYWAY, RR_DMC_CENTRAL_LOCAL, ENTR_DEATH_MOUNTAIN_CRATER_OUTSIDE_TEMPLE } }, + { { EntranceType::Dungeon, RR_LAKE_HYLIA, RR_WATER_TEMPLE_ENTRYWAY, ENTR_WATER_TEMPLE_ENTRANCE }, + { EntranceType::Dungeon, RR_WATER_TEMPLE_ENTRYWAY, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE } }, + { { EntranceType::Dungeon, RR_DESERT_COLOSSUS, RR_SPIRIT_TEMPLE_ENTRYWAY, ENTR_SPIRIT_TEMPLE_ENTRANCE }, + { EntranceType::Dungeon, RR_SPIRIT_TEMPLE_ENTRYWAY, RR_DESERT_COLOSSUS_OUTSIDE_TEMPLE, ENTR_DESERT_COLOSSUS_OUTSIDE_TEMPLE } }, + { { EntranceType::Dungeon, RR_GRAVEYARD_WARP_PAD_REGION, RR_SHADOW_TEMPLE_ENTRYWAY, ENTR_SHADOW_TEMPLE_ENTRANCE }, + { EntranceType::Dungeon, RR_SHADOW_TEMPLE_ENTRYWAY, RR_GRAVEYARD_WARP_PAD_REGION, ENTR_GRAVEYARD_OUTSIDE_TEMPLE } }, + { { EntranceType::Dungeon, RR_KAK_WELL, RR_BOTTOM_OF_THE_WELL_ENTRYWAY, ENTR_BOTTOM_OF_THE_WELL_ENTRANCE }, + { EntranceType::Dungeon, RR_BOTTOM_OF_THE_WELL_ENTRYWAY, RR_KAK_WELL, ENTR_KAKARIKO_VILLAGE_OUTSIDE_BOTTOM_OF_THE_WELL } }, + { { EntranceType::Dungeon, RR_ZF_LEDGE, RR_ICE_CAVERN_ENTRYWAY, ENTR_ICE_CAVERN_ENTRANCE }, + { EntranceType::Dungeon, RR_ICE_CAVERN_ENTRYWAY, RR_ZF_LEDGE, ENTR_ZORAS_FOUNTAIN_OUTSIDE_ICE_CAVERN } }, + { { EntranceType::Dungeon, RR_GERUDO_FORTRESS, RR_GERUDO_TRAINING_GROUND_ENTRYWAY, ENTR_GERUDO_TRAINING_GROUND_ENTRANCE }, + { EntranceType::Dungeon, RR_GERUDO_TRAINING_GROUND_ENTRYWAY, RR_GERUDO_FORTRESS, ENTR_GERUDOS_FORTRESS_OUTSIDE_GERUDO_TRAINING_GROUND } }, + { { EntranceType::GanonDungeon, RR_GANONS_CASTLE_LEDGE, RR_GANONS_CASTLE_ENTRYWAY, ENTR_INSIDE_GANONS_CASTLE_ENTRANCE }, + { EntranceType::GanonDungeon, RR_GANONS_CASTLE_ENTRYWAY, RR_CASTLE_GROUNDS_FROM_GANONS_CASTLE, ENTR_CASTLE_GROUNDS_RAINBOW_BRIDGE_EXIT } }, + + { { EntranceType::Interior, RR_KOKIRI_FOREST, RR_KF_MIDOS_HOUSE, ENTR_MIDOS_HOUSE_0 }, + { EntranceType::Interior, RR_KF_MIDOS_HOUSE, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_OUTSIDE_MIDOS_HOUSE } }, + { { EntranceType::Interior, RR_KOKIRI_FOREST, RR_KF_SARIAS_HOUSE, ENTR_SARIAS_HOUSE_0 }, + { EntranceType::Interior, RR_KF_SARIAS_HOUSE, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_OUTSIDE_SARIAS_HOUSE } }, + { { EntranceType::Interior, RR_KOKIRI_FOREST, RR_KF_HOUSE_OF_TWINS, ENTR_TWINS_HOUSE_0 }, + { EntranceType::Interior, RR_KF_HOUSE_OF_TWINS, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_OUTSIDE_TWINS_HOUSE } }, + { { EntranceType::Interior, RR_KOKIRI_FOREST, RR_KF_KNOW_IT_ALL_HOUSE, ENTR_KNOW_IT_ALL_BROS_HOUSE_0 }, + { EntranceType::Interior, RR_KF_KNOW_IT_ALL_HOUSE, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_OUTSIDE_KNOW_IT_ALL_HOUSE } }, + { { EntranceType::Interior, RR_KOKIRI_FOREST, RR_KF_KOKIRI_SHOP, ENTR_KOKIRI_SHOP_0 }, + { EntranceType::Interior, RR_KF_KOKIRI_SHOP, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_OUTSIDE_SHOP } }, + { { EntranceType::Interior, RR_LAKE_HYLIA, RR_LH_LAB, ENTR_LAKESIDE_LABORATORY_0 }, + { EntranceType::Interior, RR_LH_LAB, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_OUTSIDE_LAB } }, + { { EntranceType::Interior, RR_LH_FISHING_ISLAND, RR_LH_FISHING_POND, ENTR_FISHING_POND_0 }, + { EntranceType::Interior, RR_LH_FISHING_POND, RR_LH_FISHING_ISLAND, ENTR_LAKE_HYLIA_OUTSIDE_FISHING_POND } }, + { { EntranceType::Interior, RR_GV_FORTRESS_SIDE, RR_GV_CARPENTER_TENT, ENTR_CARPENTERS_TENT_0 }, + { EntranceType::Interior, RR_GV_CARPENTER_TENT, RR_GV_FORTRESS_SIDE, ENTR_GERUDO_VALLEY_OUTSIDE_TENT } }, + { { EntranceType::Interior, RR_MARKET_ENTRANCE, RR_MARKET_GUARD_HOUSE, ENTR_MARKET_GUARD_HOUSE_0 }, + { EntranceType::Interior, RR_MARKET_GUARD_HOUSE, RR_MARKET_ENTRANCE, ENTR_MARKET_ENTRANCE_OUTSIDE_GUARD_HOUSE } }, + { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_MASK_SHOP, ENTR_HAPPY_MASK_SHOP_0 }, + { EntranceType::Interior, RR_MARKET_MASK_SHOP, RR_THE_MARKET, ENTR_MARKET_DAY_OUTSIDE_HAPPY_MASK_SHOP } }, + { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_BOMBCHU_BOWLING, ENTR_BOMBCHU_BOWLING_ALLEY_0 }, + { EntranceType::Interior, RR_MARKET_BOMBCHU_BOWLING, RR_THE_MARKET, ENTR_MARKET_DAY_OUTSIDE_BOMBCHU_BOWLING } }, + { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_POTION_SHOP, ENTR_POTION_SHOP_MARKET_0 }, + { EntranceType::Interior, RR_MARKET_POTION_SHOP, RR_THE_MARKET, ENTR_MARKET_DAY_OUTSIDE_POTION_SHOP } }, + { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_TREASURE_CHEST_GAME, ENTR_TREASURE_BOX_SHOP_0 }, + { EntranceType::Interior, RR_MARKET_TREASURE_CHEST_GAME, RR_THE_MARKET, ENTR_MARKET_DAY_OUTSIDE_TREASURE_BOX_SHOP } }, + { { EntranceType::Interior, RR_MARKET_BACK_ALLEY, RR_MARKET_BOMBCHU_SHOP, ENTR_BOMBCHU_SHOP_1 }, + { EntranceType::Interior, RR_MARKET_BOMBCHU_SHOP, RR_MARKET_BACK_ALLEY, ENTR_BACK_ALLEY_DAY_OUTSIDE_BOMBCHU_SHOP } }, + { { EntranceType::Interior, RR_MARKET_BACK_ALLEY, RR_MARKET_MAN_IN_GREEN_HOUSE, ENTR_BACK_ALLEY_MAN_IN_GREEN_HOUSE }, + { EntranceType::Interior, RR_MARKET_MAN_IN_GREEN_HOUSE, RR_MARKET_BACK_ALLEY, ENTR_BACK_ALLEY_DAY_OUTSIDE_MAN_IN_GREEN_HOUSE } }, + { { EntranceType::Interior, RR_KAKARIKO_VILLAGE, RR_KAK_CARPENTER_BOSS_HOUSE, ENTR_KAKARIKO_CENTER_GUEST_HOUSE_0 }, + { EntranceType::Interior, RR_KAK_CARPENTER_BOSS_HOUSE, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_CENTER_GUEST_HOUSE } }, + { { EntranceType::Interior, RR_KAKARIKO_VILLAGE, RR_KAK_HOUSE_OF_SKULLTULA, ENTR_HOUSE_OF_SKULLTULA_0 }, + { EntranceType::Interior, RR_KAK_HOUSE_OF_SKULLTULA, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_SKULKLTULA_HOUSE } }, + { { EntranceType::Interior, RR_KAKARIKO_VILLAGE, RR_KAK_IMPAS_HOUSE, ENTR_IMPAS_HOUSE_FRONT }, + { EntranceType::Interior, RR_KAK_IMPAS_HOUSE, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_IMPAS_HOUSE_FRONT } }, + { { EntranceType::Interior, RR_KAK_IMPAS_LEDGE, RR_KAK_IMPAS_HOUSE_BACK, ENTR_IMPAS_HOUSE_BACK }, + { EntranceType::Interior, RR_KAK_IMPAS_HOUSE_BACK, RR_KAK_IMPAS_LEDGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_IMPAS_HOUSE_BACK } }, + { { EntranceType::Interior, RR_KAK_BACKYARD, RR_KAK_ODD_POTION_BUILDING, ENTR_POTION_SHOP_GRANNY_0 }, + { EntranceType::Interior, RR_KAK_ODD_POTION_BUILDING, RR_KAK_BACKYARD, ENTR_KAKARIKO_VILLAGE_OUTSIDE_SHOP_GRANNY } }, + { { EntranceType::Interior, RR_THE_GRAVEYARD, RR_GRAVEYARD_DAMPES_HOUSE, ENTR_GRAVEKEEPERS_HUT_0 }, + { EntranceType::Interior, RR_GRAVEYARD_DAMPES_HOUSE, RR_THE_GRAVEYARD, ENTR_GRAVEYARD_OUTSIDE_DAMPES_HUT } }, + { { EntranceType::Interior, RR_GORON_CITY, RR_GC_SHOP, ENTR_GORON_SHOP_0 }, + { EntranceType::Interior, RR_GC_SHOP, RR_GORON_CITY, ENTR_GORON_CITY_OUTSIDE_SHOP } }, + { { EntranceType::Interior, RR_ZORAS_DOMAIN, RR_ZD_SHOP, ENTR_ZORA_SHOP_0 }, + { EntranceType::Interior, RR_ZD_SHOP, RR_ZORAS_DOMAIN, ENTR_ZORAS_DOMAIN_OUTSIDE_SHOP } }, + { { EntranceType::Interior, RR_LON_LON_RANCH, RR_LLR_TALONS_HOUSE, ENTR_LON_LON_BUILDINGS_TALONS_HOUSE }, + { EntranceType::Interior, RR_LLR_TALONS_HOUSE, RR_LON_LON_RANCH, ENTR_LON_LON_RANCH_OUTSIDE_TALONS_HOUSE } }, + { { EntranceType::Interior, RR_LON_LON_RANCH, RR_LLR_STABLES, ENTR_STABLE_0 }, + { EntranceType::Interior, RR_LLR_STABLES, RR_LON_LON_RANCH, ENTR_LON_LON_RANCH_OUTSIDE_STABLES } }, + { { EntranceType::Interior, RR_LON_LON_RANCH, RR_LLR_TOWER, ENTR_LON_LON_BUILDINGS_TOWER }, + { EntranceType::Interior, RR_LLR_TOWER, RR_LON_LON_RANCH, ENTR_LON_LON_RANCH_OUTSIDE_TOWER } }, + { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_BAZAAR, ENTR_BAZAAR_1 }, + { EntranceType::Interior, RR_MARKET_BAZAAR, RR_THE_MARKET, ENTR_MARKET_DAY_OUTSIDE_BAZAAR } }, + { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_SHOOTING_GALLERY, ENTR_SHOOTING_GALLERY_1 }, + { EntranceType::Interior, RR_MARKET_SHOOTING_GALLERY, RR_THE_MARKET, ENTR_MARKET_DAY_OUTSIDE_SHOOTING_GALLERY } }, + { { EntranceType::Interior, RR_KAKARIKO_VILLAGE, RR_KAK_BAZAAR, ENTR_BAZAAR_0 }, + { EntranceType::Interior, RR_KAK_BAZAAR, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_BAZAAR } }, + { { EntranceType::Interior, RR_KAKARIKO_VILLAGE, RR_KAK_SHOOTING_GALLERY, ENTR_SHOOTING_GALLERY_0 }, + { EntranceType::Interior, RR_KAK_SHOOTING_GALLERY, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_SHOOTING_GALLERY } }, + { { EntranceType::Interior, RR_DESERT_COLOSSUS, RR_COLOSSUS_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_NAYRUS_COLOSSUS }, + { EntranceType::Interior, RR_COLOSSUS_GREAT_FAIRY_FOUNTAIN, RR_DESERT_COLOSSUS, ENTR_DESERT_COLOSSUS_GREAT_FAIRY_EXIT } }, + { { EntranceType::Interior, RR_HYRULE_CASTLE_GROUNDS, RR_HC_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_DINS_HC }, + { EntranceType::Interior, RR_HC_GREAT_FAIRY_FOUNTAIN, RR_CASTLE_GROUNDS, ENTR_CASTLE_GROUNDS_GREAT_FAIRY_EXIT } }, + { { EntranceType::Interior, RR_GANONS_CASTLE_GROUNDS, RR_OGC_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_OGC_DD }, + // 0x3E8 is an unused entrance index repruposed to differentiate between the HC and OGC fairy + // fountain exits (normally they both use 0x340) + { EntranceType::Interior, RR_OGC_GREAT_FAIRY_FOUNTAIN, RR_CASTLE_GROUNDS, ENTR_POTION_SHOP_KAKARIKO_1 } }, + { { EntranceType::Interior, RR_DMC_LOWER_NEARBY, RR_DMC_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_DMC }, + { EntranceType::Interior, RR_DMC_GREAT_FAIRY_FOUNTAIN, RR_DMC_LOWER_LOCAL, ENTR_DEATH_MOUNTAIN_CRATER_GREAT_FAIRY_EXIT } }, + { { EntranceType::Interior, RR_DEATH_MOUNTAIN_SUMMIT, RR_DMT_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_DMT }, + { EntranceType::Interior, RR_DMT_GREAT_FAIRY_FOUNTAIN, RR_DEATH_MOUNTAIN_SUMMIT, ENTR_DEATH_MOUNTAIN_TRAIL_GREAT_FAIRY_EXIT } }, + { { EntranceType::Interior, RR_ZORAS_FOUNTAIN, RR_ZF_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_FARORES_ZF }, + { EntranceType::Interior, RR_ZF_GREAT_FAIRY_FOUNTAIN, RR_ZORAS_FOUNTAIN, ENTR_ZORAS_FOUNTAIN_OUTSIDE_GREAT_FAIRY } }, + + { { EntranceType::SpecialInterior, RR_KOKIRI_FOREST, RR_KF_LINKS_HOUSE, ENTR_LINKS_HOUSE_1 }, + { EntranceType::SpecialInterior, RR_KF_LINKS_HOUSE, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_OUTSIDE_LINKS_HOUSE } }, + { { EntranceType::SpecialInterior, RR_TOT_ENTRANCE, RR_TEMPLE_OF_TIME, ENTR_TEMPLE_OF_TIME_ENTRANCE }, + { EntranceType::SpecialInterior, RR_TEMPLE_OF_TIME, RR_TOT_ENTRANCE, ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_OUTSIDE_TEMPLE } }, + { { EntranceType::SpecialInterior, RR_KAKARIKO_VILLAGE, RR_KAK_WINDMILL, ENTR_WINDMILL_AND_DAMPES_GRAVE_WINDMILL }, + { EntranceType::SpecialInterior, RR_KAK_WINDMILL, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_WINDMILL } }, + { { EntranceType::SpecialInterior, RR_KAKARIKO_VILLAGE, RR_KAK_POTION_SHOP_FRONT, ENTR_POTION_SHOP_KAKARIKO_FRONT }, + { EntranceType::SpecialInterior, RR_KAK_POTION_SHOP_FRONT, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_POTION_SHOP_FRONT } }, + { { EntranceType::SpecialInterior, RR_KAK_BACKYARD, RR_KAK_POTION_SHOP_BACK, ENTR_POTION_SHOP_KAKARIKO_BACK }, + { EntranceType::SpecialInterior, RR_KAK_POTION_SHOP_BACK, RR_KAK_BACKYARD, ENTR_KAKARIKO_VILLAGE_OUTSIDE_POTION_SHOP_BACK } }, + + // Grotto Loads use an entrance index of 0x0700 + their grotto id. The id is used as index for the + // grottoLoadTable in soh/soh/Enhancements/randomizer/randomizer_grotto.c + // Grotto Returns use an entrance index of 0x0800 + their grotto id. The id is used as index for the + // grottoReturnTable in soh/soh/Enhancements/randomizer/randomizer_grotto.c + { { EntranceType::GrottoGrave, RR_DESERT_COLOSSUS, RR_COLOSSUS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_COLOSSUS_OFFSET) }, + { EntranceType::GrottoGrave, RR_COLOSSUS_GROTTO, RR_DESERT_COLOSSUS, ENTRANCE_GROTTO_EXIT(GROTTO_COLOSSUS_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_LAKE_HYLIA, RR_LH_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_LH_OFFSET) }, + { EntranceType::GrottoGrave, RR_LH_GROTTO, RR_LAKE_HYLIA, ENTRANCE_GROTTO_EXIT(GROTTO_LH_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_ZORAS_RIVER, RR_ZR_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_ZR_STORMS_OFFSET) }, + { EntranceType::GrottoGrave, RR_ZR_STORMS_GROTTO, RR_ZORAS_RIVER, ENTRANCE_GROTTO_EXIT(GROTTO_ZR_STORMS_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_ZORAS_RIVER, RR_ZR_FAIRY_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_ZR_FAIRY_OFFSET) }, + { EntranceType::GrottoGrave, RR_ZR_FAIRY_GROTTO, RR_ZORAS_RIVER, ENTRANCE_GROTTO_EXIT(GROTTO_ZR_FAIRY_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_ZORAS_RIVER, RR_ZR_OPEN_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_ZR_OPEN_OFFSET) }, + { EntranceType::GrottoGrave, RR_ZR_OPEN_GROTTO, RR_ZORAS_RIVER, ENTRANCE_GROTTO_EXIT(GROTTO_ZR_OPEN_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_DMC_LOWER_NEARBY, RR_DMC_HAMMER_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_DMC_HAMMER_OFFSET) }, + { EntranceType::GrottoGrave, RR_DMC_HAMMER_GROTTO, RR_DMC_LOWER_LOCAL, ENTRANCE_GROTTO_EXIT(GROTTO_DMC_HAMMER_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_DMC_UPPER_NEARBY, RR_DMC_UPPER_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_DMC_UPPER_OFFSET) }, + { EntranceType::GrottoGrave, RR_DMC_UPPER_GROTTO, RR_DMC_UPPER_LOCAL, ENTRANCE_GROTTO_EXIT(GROTTO_DMC_UPPER_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_GC_GROTTO_PLATFORM, RR_GC_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_GORON_CITY_OFFSET) }, + { EntranceType::GrottoGrave, RR_GC_GROTTO, RR_GC_GROTTO_PLATFORM, ENTRANCE_GROTTO_EXIT(GROTTO_GORON_CITY_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_DEATH_MOUNTAIN_TRAIL, RR_DMT_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_DMT_STORMS_OFFSET) }, + { EntranceType::GrottoGrave, RR_DMT_STORMS_GROTTO, RR_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROTTO_EXIT(GROTTO_DMT_STORMS_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_DEATH_MOUNTAIN_SUMMIT, RR_DMT_COW_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_DMT_COW_OFFSET) }, + { EntranceType::GrottoGrave, RR_DMT_COW_GROTTO, RR_DEATH_MOUNTAIN_SUMMIT, ENTRANCE_GROTTO_EXIT(GROTTO_DMT_COW_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_KAK_BACKYARD, RR_KAK_OPEN_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_KAK_OPEN_OFFSET) }, + { EntranceType::GrottoGrave, RR_KAK_OPEN_GROTTO, RR_KAK_BACKYARD, ENTRANCE_GROTTO_EXIT(GROTTO_KAK_OPEN_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_KAKARIKO_VILLAGE, RR_KAK_REDEAD_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_KAK_REDEAD_OFFSET) }, + { EntranceType::GrottoGrave, RR_KAK_REDEAD_GROTTO, RR_KAKARIKO_VILLAGE, ENTRANCE_GROTTO_EXIT(GROTTO_KAK_REDEAD_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_HYRULE_CASTLE_GROUNDS, RR_HC_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HC_STORMS_OFFSET) }, + { EntranceType::GrottoGrave, RR_HC_STORMS_GROTTO, RR_CASTLE_GROUNDS, ENTRANCE_GROTTO_EXIT(GROTTO_HC_STORMS_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_TEKTITE_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_TEKTITE_OFFSET) }, + { EntranceType::GrottoGrave, RR_HF_TEKTITE_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_TEKTITE_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_NEAR_KAK_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_NEAR_KAK_OFFSET) }, + { EntranceType::GrottoGrave, RR_HF_NEAR_KAK_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_NEAR_KAK_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_FAIRY_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_FAIRY_OFFSET) }, + { EntranceType::GrottoGrave, RR_HF_FAIRY_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_FAIRY_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_NEAR_MARKET_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_NEAR_MARKET_OFFSET) }, + { EntranceType::GrottoGrave, RR_HF_NEAR_MARKET_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_NEAR_MARKET_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_COW_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_COW_OFFSET) }, + { EntranceType::GrottoGrave, RR_HF_COW_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_COW_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_INSIDE_FENCE_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_INSIDE_FENCE_OFFSET) }, + { EntranceType::GrottoGrave, RR_HF_INSIDE_FENCE_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_INSIDE_FENCE_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_OPEN_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_OPEN_OFFSET) }, + { EntranceType::GrottoGrave, RR_HF_OPEN_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_OPEN_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_SOUTHEAST_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_SOUTHEAST_OFFSET) }, + { EntranceType::GrottoGrave, RR_HF_SOUTHEAST_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_SOUTHEAST_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_LON_LON_RANCH, RR_LLR_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_LLR_OFFSET) }, + { EntranceType::GrottoGrave, RR_LLR_GROTTO, RR_LON_LON_RANCH, ENTRANCE_GROTTO_EXIT(GROTTO_LLR_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_SFM_ENTRYWAY, RR_SFM_WOLFOS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_SFM_WOLFOS_OFFSET) }, + { EntranceType::GrottoGrave, RR_SFM_WOLFOS_GROTTO, RR_SFM_ENTRYWAY, ENTRANCE_GROTTO_EXIT(GROTTO_SFM_WOLFOS_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_SACRED_FOREST_MEADOW, RR_SFM_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_SFM_STORMS_OFFSET) }, + { EntranceType::GrottoGrave, RR_SFM_STORMS_GROTTO, RR_SACRED_FOREST_MEADOW, ENTRANCE_GROTTO_EXIT(GROTTO_SFM_STORMS_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_SACRED_FOREST_MEADOW, RR_SFM_FAIRY_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_SFM_FAIRY_OFFSET) }, + { EntranceType::GrottoGrave, RR_SFM_FAIRY_GROTTO, RR_SACRED_FOREST_MEADOW, ENTRANCE_GROTTO_EXIT(GROTTO_SFM_FAIRY_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_LW_BEYOND_MIDO, RR_LW_SCRUBS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_LW_SCRUBS_OFFSET) }, + { EntranceType::GrottoGrave, RR_LW_SCRUBS_GROTTO, RR_LW_BEYOND_MIDO, ENTRANCE_GROTTO_EXIT(GROTTO_LW_SCRUBS_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_THE_LOST_WOODS, RR_LW_NEAR_SHORTCUTS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_LW_NEAR_SHORTCUTS_OFFSET) }, + { EntranceType::GrottoGrave, RR_LW_NEAR_SHORTCUTS_GROTTO, RR_THE_LOST_WOODS, ENTRANCE_GROTTO_EXIT(GROTTO_LW_NEAR_SHORTCUTS_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_KOKIRI_FOREST, RR_KF_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_KF_STORMS_OFFSET) }, + { EntranceType::GrottoGrave, RR_KF_STORMS_GROTTO, RR_KOKIRI_FOREST, ENTRANCE_GROTTO_EXIT(GROTTO_KF_STORMS_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_ZORAS_DOMAIN_ISLAND, RR_ZD_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_ZD_STORMS_OFFSET) }, + { EntranceType::GrottoGrave, RR_ZD_STORMS_GROTTO, RR_ZORAS_DOMAIN_ISLAND, ENTRANCE_GROTTO_EXIT(GROTTO_ZD_STORMS_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_GERUDO_FORTRESS, RR_GF_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_GF_STORMS_OFFSET) }, + { EntranceType::GrottoGrave, RR_GF_STORMS_GROTTO, RR_GERUDO_FORTRESS, ENTRANCE_GROTTO_EXIT(GROTTO_GF_STORMS_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_GV_FORTRESS_SIDE, RR_GV_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_GV_STORMS_OFFSET) }, + { EntranceType::GrottoGrave, RR_GV_STORMS_GROTTO, RR_GV_FORTRESS_SIDE, ENTRANCE_GROTTO_EXIT(GROTTO_GV_STORMS_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_GV_GROTTO_LEDGE, RR_GV_OCTOROK_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_GV_OCTOROK_OFFSET) }, + { EntranceType::GrottoGrave, RR_GV_OCTOROK_GROTTO, RR_GV_GROTTO_LEDGE, ENTRANCE_GROTTO_EXIT(GROTTO_GV_OCTOROK_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_LW_BEYOND_MIDO, RR_DEKU_THEATER, ENTRANCE_GROTTO_LOAD(GROTTO_LW_DEKU_THEATRE_OFFSET) }, + { EntranceType::GrottoGrave, RR_DEKU_THEATER, RR_LW_BEYOND_MIDO, ENTRANCE_GROTTO_EXIT(GROTTO_LW_DEKU_THEATRE_OFFSET) } }, + + // Graves have their own specified entrance indices + { { EntranceType::GrottoGrave, RR_THE_GRAVEYARD, RR_GRAVEYARD_SHIELD_GRAVE, ENTR_GRAVE_WITH_FAIRYS_FOUNTAIN_0 }, + { EntranceType::GrottoGrave, RR_GRAVEYARD_SHIELD_GRAVE, RR_THE_GRAVEYARD, ENTR_GRAVEYARD_SHIELD_GRAVE_EXIT } }, + { { EntranceType::GrottoGrave, RR_THE_GRAVEYARD, RR_GRAVEYARD_HEART_PIECE_GRAVE, ENTR_REDEAD_GRAVE_0 }, + { EntranceType::GrottoGrave, RR_GRAVEYARD_HEART_PIECE_GRAVE, RR_THE_GRAVEYARD, ENTR_GRAVEYARD_HEART_PIECE_GRAVE_EXIT } }, + { { EntranceType::GrottoGrave, RR_THE_GRAVEYARD, RR_GRAVEYARD_COMPOSERS_GRAVE, ENTR_ROYAL_FAMILYS_TOMB_0 }, + { EntranceType::GrottoGrave, RR_GRAVEYARD_COMPOSERS_GRAVE, RR_THE_GRAVEYARD, ENTR_GRAVEYARD_ROYAL_TOMB_EXIT } }, + { { EntranceType::GrottoGrave, RR_THE_GRAVEYARD, RR_GRAVEYARD_DAMPES_GRAVE, ENTR_WINDMILL_AND_DAMPES_GRAVE_GRAVE }, + { EntranceType::GrottoGrave, RR_GRAVEYARD_DAMPES_GRAVE, RR_THE_GRAVEYARD, ENTR_GRAVEYARD_DAMPES_GRAVE_EXIT } }, + + { { EntranceType::Overworld, RR_KOKIRI_FOREST, RR_LW_BRIDGE_FROM_FOREST, ENTR_LOST_WOODS_BRIDGE_EAST_EXIT }, + { EntranceType::Overworld, RR_LW_BRIDGE, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_LOWER_EXIT } }, + { { EntranceType::Overworld, RR_KOKIRI_FOREST, RR_THE_LOST_WOODS, ENTR_LOST_WOODS_SOUTH_EXIT }, + { EntranceType::Overworld, RR_LW_FOREST_EXIT, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_UPPER_EXIT } }, + { { EntranceType::Overworld, RR_THE_LOST_WOODS, RR_GC_WOODS_WARP, ENTR_GORON_CITY_TUNNEL_SHORTCUT }, + { EntranceType::Overworld, RR_GC_WOODS_WARP, RR_THE_LOST_WOODS, ENTR_LOST_WOODS_TUNNEL_SHORTCUT } }, + { { EntranceType::Overworld, RR_THE_LOST_WOODS, RR_ZORAS_RIVER, ENTR_ZORAS_RIVER_UNDERWATER_SHORTCUT }, + { EntranceType::Overworld, RR_ZORAS_RIVER, RR_THE_LOST_WOODS, ENTR_LOST_WOODS_UNDERWATER_SHORTCUT } }, + { { EntranceType::Overworld, RR_LW_BEYOND_MIDO, RR_SFM_ENTRYWAY, ENTR_SACRED_FOREST_MEADOW_SOUTH_EXIT }, + { EntranceType::Overworld, RR_SFM_ENTRYWAY, RR_LW_BEYOND_MIDO, ENTR_LOST_WOODS_NORTH_EXIT } }, + { { EntranceType::Overworld, RR_LW_BRIDGE, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_WOODED_EXIT }, + { EntranceType::Overworld, RR_HYRULE_FIELD, RR_LW_BRIDGE, ENTR_LOST_WOODS_BRIDGE_WEST_EXIT } }, + { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_NORTH_EXIT }, + { EntranceType::Overworld, RR_LAKE_HYLIA, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_FENCE_EXIT } }, + { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_GERUDO_VALLEY, ENTR_GERUDO_VALLEY_EAST_EXIT }, + { EntranceType::Overworld, RR_GERUDO_VALLEY, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_ROCKY_PATH } }, + { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_MARKET_ENTRANCE, ENTR_MARKET_ENTRANCE_NEAR_GUARD_EXIT }, + { EntranceType::Overworld, RR_MARKET_ENTRANCE, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_ON_BRIDGE_SPAWN } }, + { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_FRONT_GATE }, + { EntranceType::Overworld, RR_KAKARIKO_VILLAGE, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_STAIRS_EXIT } }, + { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_ZR_FRONT, ENTR_ZORAS_RIVER_WEST_EXIT }, + { EntranceType::Overworld, RR_ZR_FRONT, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_RIVER_EXIT } }, + { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_LON_LON_RANCH, ENTR_LON_LON_RANCH_ENTRANCE }, + { EntranceType::Overworld, RR_LON_LON_RANCH, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_CENTER_EXIT } }, + { { EntranceType::Overworld, RR_LAKE_HYLIA, RR_ZORAS_DOMAIN, ENTR_ZORAS_DOMAIN_UNDERWATER_SHORTCUT }, + { EntranceType::Overworld, RR_ZORAS_DOMAIN, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_UNDERWATER_SHORTCUT } }, + { { EntranceType::Overworld, RR_GV_FORTRESS_SIDE, RR_GERUDO_FORTRESS, ENTR_GERUDOS_FORTRESS_EAST_EXIT }, + { EntranceType::Overworld, RR_GERUDO_FORTRESS, RR_GV_FORTRESS_SIDE, ENTR_GERUDO_VALLEY_WEST_EXIT } }, + { { EntranceType::Overworld, RR_GF_OUTSIDE_GATE, RR_WASTELAND_NEAR_FORTRESS, ENTR_HAUNTED_WASTELAND_EAST_EXIT }, + { EntranceType::Overworld, RR_WASTELAND_NEAR_FORTRESS, RR_GF_OUTSIDE_GATE, ENTR_GERUDOS_FORTRESS_GATE_EXIT } }, + { { EntranceType::Overworld, RR_WASTELAND_NEAR_COLOSSUS, RR_DESERT_COLOSSUS, ENTR_DESERT_COLOSSUS_EAST_EXIT }, + { EntranceType::Overworld, RR_DESERT_COLOSSUS, RR_WASTELAND_NEAR_COLOSSUS, ENTR_HAUNTED_WASTELAND_WEST_EXIT } }, + { { EntranceType::Overworld, RR_MARKET_ENTRANCE, RR_THE_MARKET, ENTR_MARKET_SOUTH_EXIT }, + { EntranceType::Overworld, RR_THE_MARKET, RR_MARKET_ENTRANCE, ENTR_MARKET_ENTRANCE_NORTH_EXIT } }, + { { EntranceType::Overworld, RR_THE_MARKET, RR_CASTLE_GROUNDS, ENTR_CASTLE_GROUNDS_SOUTH_EXIT }, + { EntranceType::Overworld, RR_CASTLE_GROUNDS, RR_THE_MARKET, ENTR_MARKET_DAY_CASTLE_EXIT } }, + { { EntranceType::Overworld, RR_THE_MARKET, RR_TOT_ENTRANCE, ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_GOSSIP_STONE_EXIT }, + { EntranceType::Overworld, RR_TOT_ENTRANCE, RR_THE_MARKET, ENTR_MARKET_DAY_TEMPLE_EXIT } }, + { { EntranceType::Overworld, RR_KAKARIKO_VILLAGE, RR_THE_GRAVEYARD, ENTR_GRAVEYARD_ENTRANCE }, + { EntranceType::Overworld, RR_THE_GRAVEYARD, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_SOUTHEAST_EXIT } }, + { { EntranceType::Overworld, RR_KAK_BEHIND_GATE, RR_DEATH_MOUNTAIN_TRAIL, ENTR_DEATH_MOUNTAIN_TRAIL_BOTTOM_EXIT }, + { EntranceType::Overworld, RR_DEATH_MOUNTAIN_TRAIL, RR_KAK_BEHIND_GATE, ENTR_KAKARIKO_VILLAGE_GUARD_GATE } }, + { { EntranceType::Overworld, RR_DEATH_MOUNTAIN_TRAIL, RR_GORON_CITY, ENTR_GORON_CITY_UPPER_EXIT }, + { EntranceType::Overworld, RR_GORON_CITY, RR_DEATH_MOUNTAIN_TRAIL, ENTR_DEATH_MOUNTAIN_TRAIL_GC_EXIT } }, + { { EntranceType::Overworld, RR_GC_DARUNIAS_CHAMBER, RR_DMC_LOWER_LOCAL, ENTR_DEATH_MOUNTAIN_CRATER_GC_EXIT }, + { EntranceType::Overworld, RR_DMC_LOWER_NEARBY, RR_GC_DARUNIAS_CHAMBER, ENTR_GORON_CITY_DARUNIA_ROOM_EXIT } }, + { { EntranceType::Overworld, RR_DEATH_MOUNTAIN_SUMMIT, RR_DMC_UPPER_LOCAL, ENTR_DEATH_MOUNTAIN_CRATER_UPPER_EXIT }, + { EntranceType::Overworld, RR_DMC_UPPER_NEARBY, RR_DEATH_MOUNTAIN_SUMMIT, ENTR_DEATH_MOUNTAIN_TRAIL_SUMMIT_EXIT } }, + { { EntranceType::Overworld, RR_ZR_BEHIND_WATERFALL, RR_ZORAS_DOMAIN, ENTR_ZORAS_DOMAIN_ENTRANCE }, + { EntranceType::Overworld, RR_ZORAS_DOMAIN, RR_ZR_BEHIND_WATERFALL, ENTR_ZORAS_RIVER_WATERFALL_EXIT } }, + { { EntranceType::Overworld, RR_ZD_BEHIND_KING_ZORA, RR_ZORAS_FOUNTAIN, ENTR_ZORAS_FOUNTAIN_TUNNEL_EXIT }, + { EntranceType::Overworld, RR_ZORAS_FOUNTAIN, RR_ZD_BEHIND_KING_ZORA, ENTR_ZORAS_DOMAIN_KING_ZORA_EXIT } }, + + { { EntranceType::Overworld, RR_GV_LOWER_STREAM, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_RIVER_EXIT }, + NO_RETURN_ENTRANCE }, + + { { EntranceType::OwlDrop, RR_LH_OWL_FLIGHT, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_OWL_DROP }, + NO_RETURN_ENTRANCE }, + { { EntranceType::OwlDrop, RR_DMT_OWL_FLIGHT, RR_KAK_IMPAS_ROOFTOP, ENTR_KAKARIKO_VILLAGE_OWL_DROP }, + NO_RETURN_ENTRANCE }, + + { { EntranceType::Spawn, RR_CHILD_SPAWN, RR_KF_LINKS_HOUSE, ENTR_LINKS_HOUSE_CHILD_SPAWN }, + NO_RETURN_ENTRANCE }, + { { EntranceType::Spawn, RR_ADULT_SPAWN, RR_TEMPLE_OF_TIME, ENTR_HYRULE_FIELD_10 }, + NO_RETURN_ENTRANCE }, // 0x282 is an unused entrance index repurposed to differentiate between + // Adult Spawn and prelude of light (normally they both use 0x5F4) + { { EntranceType::WarpSong, RR_MINUET_OF_FOREST_WARP, RR_SACRED_FOREST_MEADOW, ENTR_SACRED_FOREST_MEADOW_WARP_PAD }, + NO_RETURN_ENTRANCE }, + { { EntranceType::WarpSong, RR_BOLERO_OF_FIRE_WARP, RR_DMC_CENTRAL_LOCAL, ENTR_DEATH_MOUNTAIN_CRATER_WARP_PAD }, + NO_RETURN_ENTRANCE }, + { { EntranceType::WarpSong, RR_SERENADE_OF_WATER_WARP, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_WARP_PAD }, + NO_RETURN_ENTRANCE }, + { { EntranceType::WarpSong, RR_REQUIEM_OF_SPIRIT_WARP, RR_DESERT_COLOSSUS, ENTR_DESERT_COLOSSUS_WARP_PAD }, + NO_RETURN_ENTRANCE }, + { { EntranceType::WarpSong, RR_NOCTURNE_OF_SHADOW_WARP, RR_GRAVEYARD_WARP_PAD_REGION, ENTR_GRAVEYARD_WARP_PAD }, + NO_RETURN_ENTRANCE }, + { { EntranceType::WarpSong, RR_PRELUDE_OF_LIGHT_WARP, RR_TEMPLE_OF_TIME, ENTR_TEMPLE_OF_TIME_WARP_PAD }, + NO_RETURN_ENTRANCE }, + + { { EntranceType::ChildBoss, RR_DEKU_TREE_BOSS_ENTRYWAY, RR_DEKU_TREE_BOSS_ROOM, ENTR_DEKU_TREE_BOSS_ENTRANCE }, + { EntranceType::ChildBoss, RR_DEKU_TREE_BOSS_ROOM, RR_DEKU_TREE_BOSS_EXIT, ENTR_DEKU_TREE_BOSS_DOOR } }, + { { EntranceType::ChildBoss, RR_DODONGOS_CAVERN_BOSS_ENTRYWAY, RR_DODONGOS_CAVERN_BOSS_ROOM, ENTR_DODONGOS_CAVERN_BOSS_ENTRANCE }, + { EntranceType::ChildBoss, RR_DODONGOS_CAVERN_BOSS_ROOM, RR_DODONGOS_CAVERN_BOSS_EXIT, ENTR_DODONGOS_CAVERN_BOSS_DOOR } }, + { { EntranceType::ChildBoss, RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY, RR_JABU_JABUS_BELLY_BOSS_ROOM, ENTR_JABU_JABU_BOSS_ENTRANCE }, + { EntranceType::ChildBoss, RR_JABU_JABUS_BELLY_BOSS_ROOM, RR_JABU_JABUS_BELLY_BOSS_EXIT, ENTR_JABU_JABU_BOSS_DOOR } }, + { { EntranceType::AdultBoss, RR_FOREST_TEMPLE_BOSS_ENTRYWAY, RR_FOREST_TEMPLE_BOSS_ROOM, ENTR_FOREST_TEMPLE_BOSS_ENTRANCE }, + { EntranceType::AdultBoss, RR_FOREST_TEMPLE_BOSS_ROOM, RR_FOREST_TEMPLE_BOSS_ENTRYWAY, ENTR_FOREST_TEMPLE_BOSS_DOOR } }, + { { EntranceType::AdultBoss, RR_FIRE_TEMPLE_BOSS_ENTRYWAY, RR_FIRE_TEMPLE_BOSS_ROOM, ENTR_FIRE_TEMPLE_BOSS_ENTRANCE }, + { EntranceType::AdultBoss, RR_FIRE_TEMPLE_BOSS_ROOM, RR_FIRE_TEMPLE_BOSS_ENTRYWAY, ENTR_FIRE_TEMPLE_BOSS_DOOR } }, + { { EntranceType::AdultBoss, RR_WATER_TEMPLE_BOSS_ENTRYWAY, RR_WATER_TEMPLE_BOSS_ROOM, ENTR_WATER_TEMPLE_BOSS_ENTRANCE }, + { EntranceType::AdultBoss, RR_WATER_TEMPLE_BOSS_ROOM, RR_WATER_TEMPLE_BOSS_ENTRYWAY, ENTR_WATER_TEMPLE_BOSS_DOOR } }, + { { EntranceType::AdultBoss, RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, RR_SPIRIT_TEMPLE_BOSS_ROOM, ENTR_SPIRIT_TEMPLE_BOSS_ENTRANCE }, + { EntranceType::AdultBoss, RR_SPIRIT_TEMPLE_BOSS_ROOM, RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, ENTR_SPIRIT_TEMPLE_BOSS_DOOR } }, + { { EntranceType::AdultBoss, RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, RR_SHADOW_TEMPLE_BOSS_ROOM, ENTR_SHADOW_TEMPLE_BOSS_ENTRANCE }, + { EntranceType::AdultBoss, RR_SHADOW_TEMPLE_BOSS_ROOM, RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, ENTR_SHADOW_TEMPLE_BOSS_DOOR } }, + + { { EntranceType::BlueWarp, RR_DEKU_TREE_BOSS_ROOM, RR_KF_OUTSIDE_DEKU_TREE, ENTR_KOKIRI_FOREST_DEKU_TREE_BLUE_WARP }, + NO_RETURN_ENTRANCE }, + { { EntranceType::BlueWarp, RR_DODONGOS_CAVERN_BOSS_ROOM, RR_DEATH_MOUNTAIN_TRAIL, ENTR_DEATH_MOUNTAIN_TRAIL_DODONGO_BLUE_WARP }, + NO_RETURN_ENTRANCE }, + { { EntranceType::BlueWarp, RR_JABU_JABUS_BELLY_BOSS_ROOM, RR_ZORAS_FOUNTAIN, ENTR_ZORAS_FOUNTAIN_JABU_JABU_BLUE_WARP }, + NO_RETURN_ENTRANCE }, + { { EntranceType::BlueWarp, RR_FOREST_TEMPLE_BOSS_ROOM, RR_SACRED_FOREST_MEADOW, ENTR_SACRED_FOREST_MEADOW_FOREST_TEMPLE_BLUE_WARP }, + NO_RETURN_ENTRANCE }, + { { EntranceType::BlueWarp, RR_FIRE_TEMPLE_BOSS_ROOM, RR_DMC_CENTRAL_LOCAL, ENTR_DEATH_MOUNTAIN_CRATER_FIRE_TEMPLE_BLUE_WARP }, + NO_RETURN_ENTRANCE }, + { { EntranceType::BlueWarp, RR_WATER_TEMPLE_BOSS_ROOM, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_WATER_TEMPLE_BLUE_WARP }, + NO_RETURN_ENTRANCE }, + { { EntranceType::BlueWarp, RR_SPIRIT_TEMPLE_BOSS_ROOM, RR_DESERT_COLOSSUS, ENTR_DESERT_COLOSSUS_SPIRIT_TEMPLE_BLUE_WARP }, + NO_RETURN_ENTRANCE }, + { { EntranceType::BlueWarp, RR_SHADOW_TEMPLE_BOSS_ROOM, RR_GRAVEYARD_WARP_PAD_REGION, ENTR_GRAVEYARD_SHADOW_TEMPLE_BLUE_WARP }, + NO_RETURN_ENTRANCE }, + // clang-format on + }; + auto ctx = Rando::Context::GetInstance(); for (auto& entrancePair : entranceShuffleTable) { @@ -262,6 +574,7 @@ void SetAllEntrancesData(std::vector& entranceShuffleTable) { forwardEntrance->SetIndex(forwardEntry.index); forwardEntrance->SetType(forwardEntry.type); forwardEntrance->SetAsPrimary(); + entranceMap[forwardEntry.index] = forwardEntrance; // When decouple entrances is on, mark the forward entrance if (ctx->GetOption(RSK_DECOUPLED_ENTRANCES)) { @@ -273,6 +586,7 @@ void SetAllEntrancesData(std::vector& entranceShuffleTable) { returnEntrance->SetIndex(returnEntry.index); returnEntrance->SetType(returnEntry.type); forwardEntrance->BindTwoWay(returnEntrance); + entranceMap[returnEntry.index] = returnEntrance; // Mark reverse entrance as decoupled if (ctx->GetOption(RSK_DECOUPLED_ENTRANCES)) { @@ -857,316 +1171,6 @@ int EntranceShuffler::ShuffleAllEntrances() { mTotalRandomizableEntrances = 0; mCurNumRandomizedEntrances = 0; - std::vector entranceShuffleTable = { - // clang-format off - // Type Parent Region Connected Region Index - { { EntranceType::Dungeon, RR_KF_OUTSIDE_DEKU_TREE, RR_DEKU_TREE_ENTRYWAY, ENTR_DEKU_TREE_ENTRANCE }, - { EntranceType::Dungeon, RR_DEKU_TREE_ENTRYWAY, RR_KF_OUTSIDE_DEKU_TREE, ENTR_KOKIRI_FOREST_OUTSIDE_DEKU_TREE } }, - { { EntranceType::Dungeon, RR_DEATH_MOUNTAIN_TRAIL, RR_DODONGOS_CAVERN_ENTRYWAY, ENTR_DODONGOS_CAVERN_ENTRANCE }, - { EntranceType::Dungeon, RR_DODONGOS_CAVERN_ENTRYWAY, RR_DEATH_MOUNTAIN_TRAIL, ENTR_DEATH_MOUNTAIN_TRAIL_OUTSIDE_DODONGOS_CAVERN } }, - { { EntranceType::Dungeon, RR_ZORAS_FOUNTAIN, RR_JABU_JABUS_BELLY_ENTRYWAY, ENTR_JABU_JABU_ENTRANCE }, - { EntranceType::Dungeon, RR_JABU_JABUS_BELLY_ENTRYWAY, RR_ZORAS_FOUNTAIN, ENTR_ZORAS_FOUNTAIN_OUTSIDE_JABU_JABU } }, - { { EntranceType::Dungeon, RR_SACRED_FOREST_MEADOW, RR_FOREST_TEMPLE_ENTRYWAY, ENTR_FOREST_TEMPLE_ENTRANCE }, - { EntranceType::Dungeon, RR_FOREST_TEMPLE_ENTRYWAY, RR_SACRED_FOREST_MEADOW, ENTR_SACRED_FOREST_MEADOW_OUTSIDE_TEMPLE } }, - { { EntranceType::Dungeon, RR_DMC_CENTRAL_LOCAL, RR_FIRE_TEMPLE_ENTRYWAY, ENTR_FIRE_TEMPLE_ENTRANCE }, - { EntranceType::Dungeon, RR_FIRE_TEMPLE_ENTRYWAY, RR_DMC_CENTRAL_LOCAL, ENTR_DEATH_MOUNTAIN_CRATER_OUTSIDE_TEMPLE } }, - { { EntranceType::Dungeon, RR_LAKE_HYLIA, RR_WATER_TEMPLE_ENTRYWAY, ENTR_WATER_TEMPLE_ENTRANCE }, - { EntranceType::Dungeon, RR_WATER_TEMPLE_ENTRYWAY, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE } }, - { { EntranceType::Dungeon, RR_DESERT_COLOSSUS, RR_SPIRIT_TEMPLE_ENTRYWAY, ENTR_SPIRIT_TEMPLE_ENTRANCE }, - { EntranceType::Dungeon, RR_SPIRIT_TEMPLE_ENTRYWAY, RR_DESERT_COLOSSUS_OUTSIDE_TEMPLE, ENTR_DESERT_COLOSSUS_OUTSIDE_TEMPLE } }, - { { EntranceType::Dungeon, RR_GRAVEYARD_WARP_PAD_REGION, RR_SHADOW_TEMPLE_ENTRYWAY, ENTR_SHADOW_TEMPLE_ENTRANCE }, - { EntranceType::Dungeon, RR_SHADOW_TEMPLE_ENTRYWAY, RR_GRAVEYARD_WARP_PAD_REGION, ENTR_GRAVEYARD_OUTSIDE_TEMPLE } }, - { { EntranceType::Dungeon, RR_KAK_WELL, RR_BOTTOM_OF_THE_WELL_ENTRYWAY, ENTR_BOTTOM_OF_THE_WELL_ENTRANCE }, - { EntranceType::Dungeon, RR_BOTTOM_OF_THE_WELL_ENTRYWAY, RR_KAK_WELL, ENTR_KAKARIKO_VILLAGE_OUTSIDE_BOTTOM_OF_THE_WELL } }, - { { EntranceType::Dungeon, RR_ZF_LEDGE, RR_ICE_CAVERN_ENTRYWAY, ENTR_ICE_CAVERN_ENTRANCE }, - { EntranceType::Dungeon, RR_ICE_CAVERN_ENTRYWAY, RR_ZF_LEDGE, ENTR_ZORAS_FOUNTAIN_OUTSIDE_ICE_CAVERN } }, - { { EntranceType::Dungeon, RR_GERUDO_FORTRESS, RR_GERUDO_TRAINING_GROUND_ENTRYWAY, ENTR_GERUDO_TRAINING_GROUND_ENTRANCE }, - { EntranceType::Dungeon, RR_GERUDO_TRAINING_GROUND_ENTRYWAY, RR_GERUDO_FORTRESS, ENTR_GERUDOS_FORTRESS_OUTSIDE_GERUDO_TRAINING_GROUND } }, - { { EntranceType::GanonDungeon, RR_GANONS_CASTLE_LEDGE, RR_GANONS_CASTLE_ENTRYWAY, ENTR_INSIDE_GANONS_CASTLE_ENTRANCE }, - { EntranceType::GanonDungeon, RR_GANONS_CASTLE_ENTRYWAY, RR_CASTLE_GROUNDS_FROM_GANONS_CASTLE, ENTR_CASTLE_GROUNDS_RAINBOW_BRIDGE_EXIT } }, - - { { EntranceType::Interior, RR_KOKIRI_FOREST, RR_KF_MIDOS_HOUSE, ENTR_MIDOS_HOUSE_0 }, - { EntranceType::Interior, RR_KF_MIDOS_HOUSE, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_OUTSIDE_MIDOS_HOUSE } }, - { { EntranceType::Interior, RR_KOKIRI_FOREST, RR_KF_SARIAS_HOUSE, ENTR_SARIAS_HOUSE_0 }, - { EntranceType::Interior, RR_KF_SARIAS_HOUSE, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_OUTSIDE_SARIAS_HOUSE } }, - { { EntranceType::Interior, RR_KOKIRI_FOREST, RR_KF_HOUSE_OF_TWINS, ENTR_TWINS_HOUSE_0 }, - { EntranceType::Interior, RR_KF_HOUSE_OF_TWINS, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_OUTSIDE_TWINS_HOUSE } }, - { { EntranceType::Interior, RR_KOKIRI_FOREST, RR_KF_KNOW_IT_ALL_HOUSE, ENTR_KNOW_IT_ALL_BROS_HOUSE_0 }, - { EntranceType::Interior, RR_KF_KNOW_IT_ALL_HOUSE, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_OUTSIDE_KNOW_IT_ALL_HOUSE } }, - { { EntranceType::Interior, RR_KOKIRI_FOREST, RR_KF_KOKIRI_SHOP, ENTR_KOKIRI_SHOP_0 }, - { EntranceType::Interior, RR_KF_KOKIRI_SHOP, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_OUTSIDE_SHOP } }, - { { EntranceType::Interior, RR_LAKE_HYLIA, RR_LH_LAB, ENTR_LAKESIDE_LABORATORY_0 }, - { EntranceType::Interior, RR_LH_LAB, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_OUTSIDE_LAB } }, - { { EntranceType::Interior, RR_LH_FISHING_ISLAND, RR_LH_FISHING_POND, ENTR_FISHING_POND_0 }, - { EntranceType::Interior, RR_LH_FISHING_POND, RR_LH_FISHING_ISLAND, ENTR_LAKE_HYLIA_OUTSIDE_FISHING_POND } }, - { { EntranceType::Interior, RR_GV_FORTRESS_SIDE, RR_GV_CARPENTER_TENT, ENTR_CARPENTERS_TENT_0 }, - { EntranceType::Interior, RR_GV_CARPENTER_TENT, RR_GV_FORTRESS_SIDE, ENTR_GERUDO_VALLEY_OUTSIDE_TENT } }, - { { EntranceType::Interior, RR_MARKET_ENTRANCE, RR_MARKET_GUARD_HOUSE, ENTR_MARKET_GUARD_HOUSE_0 }, - { EntranceType::Interior, RR_MARKET_GUARD_HOUSE, RR_MARKET_ENTRANCE, ENTR_MARKET_ENTRANCE_OUTSIDE_GUARD_HOUSE } }, - { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_MASK_SHOP, ENTR_HAPPY_MASK_SHOP_0 }, - { EntranceType::Interior, RR_MARKET_MASK_SHOP, RR_THE_MARKET, ENTR_MARKET_DAY_OUTSIDE_HAPPY_MASK_SHOP } }, - { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_BOMBCHU_BOWLING, ENTR_BOMBCHU_BOWLING_ALLEY_0 }, - { EntranceType::Interior, RR_MARKET_BOMBCHU_BOWLING, RR_THE_MARKET, ENTR_MARKET_DAY_OUTSIDE_BOMBCHU_BOWLING } }, - { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_POTION_SHOP, ENTR_POTION_SHOP_MARKET_0 }, - { EntranceType::Interior, RR_MARKET_POTION_SHOP, RR_THE_MARKET, ENTR_MARKET_DAY_OUTSIDE_POTION_SHOP } }, - { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_TREASURE_CHEST_GAME, ENTR_TREASURE_BOX_SHOP_0 }, - { EntranceType::Interior, RR_MARKET_TREASURE_CHEST_GAME, RR_THE_MARKET, ENTR_MARKET_DAY_OUTSIDE_TREASURE_BOX_SHOP } }, - { { EntranceType::Interior, RR_MARKET_BACK_ALLEY, RR_MARKET_BOMBCHU_SHOP, ENTR_BOMBCHU_SHOP_1 }, - { EntranceType::Interior, RR_MARKET_BOMBCHU_SHOP, RR_MARKET_BACK_ALLEY, ENTR_BACK_ALLEY_DAY_OUTSIDE_BOMBCHU_SHOP } }, - { { EntranceType::Interior, RR_MARKET_BACK_ALLEY, RR_MARKET_MAN_IN_GREEN_HOUSE, ENTR_BACK_ALLEY_MAN_IN_GREEN_HOUSE }, - { EntranceType::Interior, RR_MARKET_MAN_IN_GREEN_HOUSE, RR_MARKET_BACK_ALLEY, ENTR_BACK_ALLEY_DAY_OUTSIDE_MAN_IN_GREEN_HOUSE } }, - { { EntranceType::Interior, RR_KAKARIKO_VILLAGE, RR_KAK_CARPENTER_BOSS_HOUSE, ENTR_KAKARIKO_CENTER_GUEST_HOUSE_0 }, - { EntranceType::Interior, RR_KAK_CARPENTER_BOSS_HOUSE, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_CENTER_GUEST_HOUSE } }, - { { EntranceType::Interior, RR_KAKARIKO_VILLAGE, RR_KAK_HOUSE_OF_SKULLTULA, ENTR_HOUSE_OF_SKULLTULA_0 }, - { EntranceType::Interior, RR_KAK_HOUSE_OF_SKULLTULA, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_SKULKLTULA_HOUSE } }, - { { EntranceType::Interior, RR_KAKARIKO_VILLAGE, RR_KAK_IMPAS_HOUSE, ENTR_IMPAS_HOUSE_FRONT }, - { EntranceType::Interior, RR_KAK_IMPAS_HOUSE, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_IMPAS_HOUSE_FRONT } }, - { { EntranceType::Interior, RR_KAK_IMPAS_LEDGE, RR_KAK_IMPAS_HOUSE_BACK, ENTR_IMPAS_HOUSE_BACK }, - { EntranceType::Interior, RR_KAK_IMPAS_HOUSE_BACK, RR_KAK_IMPAS_LEDGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_IMPAS_HOUSE_BACK } }, - { { EntranceType::Interior, RR_KAK_BACKYARD, RR_KAK_ODD_POTION_BUILDING, ENTR_POTION_SHOP_GRANNY_0 }, - { EntranceType::Interior, RR_KAK_ODD_POTION_BUILDING, RR_KAK_BACKYARD, ENTR_KAKARIKO_VILLAGE_OUTSIDE_SHOP_GRANNY } }, - { { EntranceType::Interior, RR_THE_GRAVEYARD, RR_GRAVEYARD_DAMPES_HOUSE, ENTR_GRAVEKEEPERS_HUT_0 }, - { EntranceType::Interior, RR_GRAVEYARD_DAMPES_HOUSE, RR_THE_GRAVEYARD, ENTR_GRAVEYARD_OUTSIDE_DAMPES_HUT } }, - { { EntranceType::Interior, RR_GORON_CITY, RR_GC_SHOP, ENTR_GORON_SHOP_0 }, - { EntranceType::Interior, RR_GC_SHOP, RR_GORON_CITY, ENTR_GORON_CITY_OUTSIDE_SHOP } }, - { { EntranceType::Interior, RR_ZORAS_DOMAIN, RR_ZD_SHOP, ENTR_ZORA_SHOP_0 }, - { EntranceType::Interior, RR_ZD_SHOP, RR_ZORAS_DOMAIN, ENTR_ZORAS_DOMAIN_OUTSIDE_SHOP } }, - { { EntranceType::Interior, RR_LON_LON_RANCH, RR_LLR_TALONS_HOUSE, ENTR_LON_LON_BUILDINGS_TALONS_HOUSE }, - { EntranceType::Interior, RR_LLR_TALONS_HOUSE, RR_LON_LON_RANCH, ENTR_LON_LON_RANCH_OUTSIDE_TALONS_HOUSE } }, - { { EntranceType::Interior, RR_LON_LON_RANCH, RR_LLR_STABLES, ENTR_STABLE_0 }, - { EntranceType::Interior, RR_LLR_STABLES, RR_LON_LON_RANCH, ENTR_LON_LON_RANCH_OUTSIDE_STABLES } }, - { { EntranceType::Interior, RR_LON_LON_RANCH, RR_LLR_TOWER, ENTR_LON_LON_BUILDINGS_TOWER }, - { EntranceType::Interior, RR_LLR_TOWER, RR_LON_LON_RANCH, ENTR_LON_LON_RANCH_OUTSIDE_TOWER } }, - { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_BAZAAR, ENTR_BAZAAR_1 }, - { EntranceType::Interior, RR_MARKET_BAZAAR, RR_THE_MARKET, ENTR_MARKET_DAY_OUTSIDE_BAZAAR } }, - { { EntranceType::Interior, RR_THE_MARKET, RR_MARKET_SHOOTING_GALLERY, ENTR_SHOOTING_GALLERY_1 }, - { EntranceType::Interior, RR_MARKET_SHOOTING_GALLERY, RR_THE_MARKET, ENTR_MARKET_DAY_OUTSIDE_SHOOTING_GALLERY } }, - { { EntranceType::Interior, RR_KAKARIKO_VILLAGE, RR_KAK_BAZAAR, ENTR_BAZAAR_0 }, - { EntranceType::Interior, RR_KAK_BAZAAR, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_BAZAAR } }, - { { EntranceType::Interior, RR_KAKARIKO_VILLAGE, RR_KAK_SHOOTING_GALLERY, ENTR_SHOOTING_GALLERY_0 }, - { EntranceType::Interior, RR_KAK_SHOOTING_GALLERY, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_SHOOTING_GALLERY } }, - { { EntranceType::Interior, RR_DESERT_COLOSSUS, RR_COLOSSUS_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_NAYRUS_COLOSSUS }, - { EntranceType::Interior, RR_COLOSSUS_GREAT_FAIRY_FOUNTAIN, RR_DESERT_COLOSSUS, ENTR_DESERT_COLOSSUS_GREAT_FAIRY_EXIT } }, - { { EntranceType::Interior, RR_HYRULE_CASTLE_GROUNDS, RR_HC_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_DINS_HC }, - { EntranceType::Interior, RR_HC_GREAT_FAIRY_FOUNTAIN, RR_CASTLE_GROUNDS, ENTR_CASTLE_GROUNDS_GREAT_FAIRY_EXIT } }, - { { EntranceType::Interior, RR_GANONS_CASTLE_GROUNDS, RR_OGC_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_OGC_DD }, - // 0x3E8 is an unused entrance index repruposed to differentiate between the HC and OGC fairy - // fountain exits (normally they both use 0x340) - { EntranceType::Interior, RR_OGC_GREAT_FAIRY_FOUNTAIN, RR_CASTLE_GROUNDS, ENTR_POTION_SHOP_KAKARIKO_1 } }, - { { EntranceType::Interior, RR_DMC_LOWER_NEARBY, RR_DMC_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_DMC }, - { EntranceType::Interior, RR_DMC_GREAT_FAIRY_FOUNTAIN, RR_DMC_LOWER_LOCAL, ENTR_DEATH_MOUNTAIN_CRATER_GREAT_FAIRY_EXIT } }, - { { EntranceType::Interior, RR_DEATH_MOUNTAIN_SUMMIT, RR_DMT_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_DMT }, - { EntranceType::Interior, RR_DMT_GREAT_FAIRY_FOUNTAIN, RR_DEATH_MOUNTAIN_SUMMIT, ENTR_DEATH_MOUNTAIN_TRAIL_GREAT_FAIRY_EXIT } }, - { { EntranceType::Interior, RR_ZORAS_FOUNTAIN, RR_ZF_GREAT_FAIRY_FOUNTAIN, ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_FARORES_ZF }, - { EntranceType::Interior, RR_ZF_GREAT_FAIRY_FOUNTAIN, RR_ZORAS_FOUNTAIN, ENTR_ZORAS_FOUNTAIN_OUTSIDE_GREAT_FAIRY } }, - - { { EntranceType::SpecialInterior, RR_KOKIRI_FOREST, RR_KF_LINKS_HOUSE, ENTR_LINKS_HOUSE_1 }, - { EntranceType::SpecialInterior, RR_KF_LINKS_HOUSE, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_OUTSIDE_LINKS_HOUSE } }, - { { EntranceType::SpecialInterior, RR_TOT_ENTRANCE, RR_TEMPLE_OF_TIME, ENTR_TEMPLE_OF_TIME_ENTRANCE }, - { EntranceType::SpecialInterior, RR_TEMPLE_OF_TIME, RR_TOT_ENTRANCE, ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_OUTSIDE_TEMPLE } }, - { { EntranceType::SpecialInterior, RR_KAKARIKO_VILLAGE, RR_KAK_WINDMILL, ENTR_WINDMILL_AND_DAMPES_GRAVE_WINDMILL }, - { EntranceType::SpecialInterior, RR_KAK_WINDMILL, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_WINDMILL } }, - { { EntranceType::SpecialInterior, RR_KAKARIKO_VILLAGE, RR_KAK_POTION_SHOP_FRONT, ENTR_POTION_SHOP_KAKARIKO_FRONT }, - { EntranceType::SpecialInterior, RR_KAK_POTION_SHOP_FRONT, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_OUTSIDE_POTION_SHOP_FRONT } }, - { { EntranceType::SpecialInterior, RR_KAK_BACKYARD, RR_KAK_POTION_SHOP_BACK, ENTR_POTION_SHOP_KAKARIKO_BACK }, - { EntranceType::SpecialInterior, RR_KAK_POTION_SHOP_BACK, RR_KAK_BACKYARD, ENTR_KAKARIKO_VILLAGE_OUTSIDE_POTION_SHOP_BACK } }, - - // Grotto Loads use an entrance index of 0x0700 + their grotto id. The id is used as index for the - // grottoLoadTable in soh/soh/Enhancements/randomizer/randomizer_grotto.c - // Grotto Returns use an entrance index of 0x0800 + their grotto id. The id is used as index for the - // grottoReturnTable in soh/soh/Enhancements/randomizer/randomizer_grotto.c - { { EntranceType::GrottoGrave, RR_DESERT_COLOSSUS, RR_COLOSSUS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_COLOSSUS_OFFSET) }, - { EntranceType::GrottoGrave, RR_COLOSSUS_GROTTO, RR_DESERT_COLOSSUS, ENTRANCE_GROTTO_EXIT(GROTTO_COLOSSUS_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_LAKE_HYLIA, RR_LH_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_LH_OFFSET) }, - { EntranceType::GrottoGrave, RR_LH_GROTTO, RR_LAKE_HYLIA, ENTRANCE_GROTTO_EXIT(GROTTO_LH_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_ZORAS_RIVER, RR_ZR_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_ZR_STORMS_OFFSET) }, - { EntranceType::GrottoGrave, RR_ZR_STORMS_GROTTO, RR_ZORAS_RIVER, ENTRANCE_GROTTO_EXIT(GROTTO_ZR_STORMS_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_ZORAS_RIVER, RR_ZR_FAIRY_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_ZR_FAIRY_OFFSET) }, - { EntranceType::GrottoGrave, RR_ZR_FAIRY_GROTTO, RR_ZORAS_RIVER, ENTRANCE_GROTTO_EXIT(GROTTO_ZR_FAIRY_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_ZORAS_RIVER, RR_ZR_OPEN_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_ZR_OPEN_OFFSET) }, - { EntranceType::GrottoGrave, RR_ZR_OPEN_GROTTO, RR_ZORAS_RIVER, ENTRANCE_GROTTO_EXIT(GROTTO_ZR_OPEN_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_DMC_LOWER_NEARBY, RR_DMC_HAMMER_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_DMC_HAMMER_OFFSET) }, - { EntranceType::GrottoGrave, RR_DMC_HAMMER_GROTTO, RR_DMC_LOWER_LOCAL, ENTRANCE_GROTTO_EXIT(GROTTO_DMC_HAMMER_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_DMC_UPPER_NEARBY, RR_DMC_UPPER_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_DMC_UPPER_OFFSET) }, - { EntranceType::GrottoGrave, RR_DMC_UPPER_GROTTO, RR_DMC_UPPER_LOCAL, ENTRANCE_GROTTO_EXIT(GROTTO_DMC_UPPER_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_GC_GROTTO_PLATFORM, RR_GC_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_GORON_CITY_OFFSET) }, - { EntranceType::GrottoGrave, RR_GC_GROTTO, RR_GC_GROTTO_PLATFORM, ENTRANCE_GROTTO_EXIT(GROTTO_GORON_CITY_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_DEATH_MOUNTAIN_TRAIL, RR_DMT_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_DMT_STORMS_OFFSET) }, - { EntranceType::GrottoGrave, RR_DMT_STORMS_GROTTO, RR_DEATH_MOUNTAIN_TRAIL, ENTRANCE_GROTTO_EXIT(GROTTO_DMT_STORMS_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_DEATH_MOUNTAIN_SUMMIT, RR_DMT_COW_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_DMT_COW_OFFSET) }, - { EntranceType::GrottoGrave, RR_DMT_COW_GROTTO, RR_DEATH_MOUNTAIN_SUMMIT, ENTRANCE_GROTTO_EXIT(GROTTO_DMT_COW_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_KAK_BACKYARD, RR_KAK_OPEN_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_KAK_OPEN_OFFSET) }, - { EntranceType::GrottoGrave, RR_KAK_OPEN_GROTTO, RR_KAK_BACKYARD, ENTRANCE_GROTTO_EXIT(GROTTO_KAK_OPEN_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_KAKARIKO_VILLAGE, RR_KAK_REDEAD_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_KAK_REDEAD_OFFSET) }, - { EntranceType::GrottoGrave, RR_KAK_REDEAD_GROTTO, RR_KAKARIKO_VILLAGE, ENTRANCE_GROTTO_EXIT(GROTTO_KAK_REDEAD_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_HYRULE_CASTLE_GROUNDS, RR_HC_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HC_STORMS_OFFSET) }, - { EntranceType::GrottoGrave, RR_HC_STORMS_GROTTO, RR_CASTLE_GROUNDS, ENTRANCE_GROTTO_EXIT(GROTTO_HC_STORMS_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_TEKTITE_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_TEKTITE_OFFSET) }, - { EntranceType::GrottoGrave, RR_HF_TEKTITE_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_TEKTITE_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_NEAR_KAK_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_NEAR_KAK_OFFSET) }, - { EntranceType::GrottoGrave, RR_HF_NEAR_KAK_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_NEAR_KAK_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_FAIRY_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_FAIRY_OFFSET) }, - { EntranceType::GrottoGrave, RR_HF_FAIRY_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_FAIRY_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_NEAR_MARKET_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_NEAR_MARKET_OFFSET) }, - { EntranceType::GrottoGrave, RR_HF_NEAR_MARKET_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_NEAR_MARKET_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_COW_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_COW_OFFSET) }, - { EntranceType::GrottoGrave, RR_HF_COW_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_COW_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_INSIDE_FENCE_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_INSIDE_FENCE_OFFSET) }, - { EntranceType::GrottoGrave, RR_HF_INSIDE_FENCE_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_INSIDE_FENCE_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_OPEN_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_OPEN_OFFSET) }, - { EntranceType::GrottoGrave, RR_HF_OPEN_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_OPEN_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_HYRULE_FIELD, RR_HF_SOUTHEAST_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_HF_SOUTHEAST_OFFSET) }, - { EntranceType::GrottoGrave, RR_HF_SOUTHEAST_GROTTO, RR_HYRULE_FIELD, ENTRANCE_GROTTO_EXIT(GROTTO_HF_SOUTHEAST_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_LON_LON_RANCH, RR_LLR_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_LLR_OFFSET) }, - { EntranceType::GrottoGrave, RR_LLR_GROTTO, RR_LON_LON_RANCH, ENTRANCE_GROTTO_EXIT(GROTTO_LLR_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_SFM_ENTRYWAY, RR_SFM_WOLFOS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_SFM_WOLFOS_OFFSET) }, - { EntranceType::GrottoGrave, RR_SFM_WOLFOS_GROTTO, RR_SFM_ENTRYWAY, ENTRANCE_GROTTO_EXIT(GROTTO_SFM_WOLFOS_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_SACRED_FOREST_MEADOW, RR_SFM_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_SFM_STORMS_OFFSET) }, - { EntranceType::GrottoGrave, RR_SFM_STORMS_GROTTO, RR_SACRED_FOREST_MEADOW, ENTRANCE_GROTTO_EXIT(GROTTO_SFM_STORMS_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_SACRED_FOREST_MEADOW, RR_SFM_FAIRY_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_SFM_FAIRY_OFFSET) }, - { EntranceType::GrottoGrave, RR_SFM_FAIRY_GROTTO, RR_SACRED_FOREST_MEADOW, ENTRANCE_GROTTO_EXIT(GROTTO_SFM_FAIRY_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_LW_BEYOND_MIDO, RR_LW_SCRUBS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_LW_SCRUBS_OFFSET) }, - { EntranceType::GrottoGrave, RR_LW_SCRUBS_GROTTO, RR_LW_BEYOND_MIDO, ENTRANCE_GROTTO_EXIT(GROTTO_LW_SCRUBS_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_THE_LOST_WOODS, RR_LW_NEAR_SHORTCUTS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_LW_NEAR_SHORTCUTS_OFFSET) }, - { EntranceType::GrottoGrave, RR_LW_NEAR_SHORTCUTS_GROTTO, RR_THE_LOST_WOODS, ENTRANCE_GROTTO_EXIT(GROTTO_LW_NEAR_SHORTCUTS_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_KOKIRI_FOREST, RR_KF_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_KF_STORMS_OFFSET) }, - { EntranceType::GrottoGrave, RR_KF_STORMS_GROTTO, RR_KOKIRI_FOREST, ENTRANCE_GROTTO_EXIT(GROTTO_KF_STORMS_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_ZORAS_DOMAIN_ISLAND, RR_ZD_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_ZD_STORMS_OFFSET) }, - { EntranceType::GrottoGrave, RR_ZD_STORMS_GROTTO, RR_ZORAS_DOMAIN_ISLAND, ENTRANCE_GROTTO_EXIT(GROTTO_ZD_STORMS_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_GERUDO_FORTRESS, RR_GF_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_GF_STORMS_OFFSET) }, - { EntranceType::GrottoGrave, RR_GF_STORMS_GROTTO, RR_GERUDO_FORTRESS, ENTRANCE_GROTTO_EXIT(GROTTO_GF_STORMS_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_GV_FORTRESS_SIDE, RR_GV_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_GV_STORMS_OFFSET) }, - { EntranceType::GrottoGrave, RR_GV_STORMS_GROTTO, RR_GV_FORTRESS_SIDE, ENTRANCE_GROTTO_EXIT(GROTTO_GV_STORMS_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_GV_GROTTO_LEDGE, RR_GV_OCTOROK_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_GV_OCTOROK_OFFSET) }, - { EntranceType::GrottoGrave, RR_GV_OCTOROK_GROTTO, RR_GV_GROTTO_LEDGE, ENTRANCE_GROTTO_EXIT(GROTTO_GV_OCTOROK_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_LW_BEYOND_MIDO, RR_DEKU_THEATER, ENTRANCE_GROTTO_LOAD(GROTTO_LW_DEKU_THEATRE_OFFSET) }, - { EntranceType::GrottoGrave, RR_DEKU_THEATER, RR_LW_BEYOND_MIDO, ENTRANCE_GROTTO_EXIT(GROTTO_LW_DEKU_THEATRE_OFFSET) } }, - - // Graves have their own specified entrance indices - { { EntranceType::GrottoGrave, RR_THE_GRAVEYARD, RR_GRAVEYARD_SHIELD_GRAVE, ENTR_GRAVE_WITH_FAIRYS_FOUNTAIN_0 }, - { EntranceType::GrottoGrave, RR_GRAVEYARD_SHIELD_GRAVE, RR_THE_GRAVEYARD, ENTR_GRAVEYARD_SHIELD_GRAVE_EXIT } }, - { { EntranceType::GrottoGrave, RR_THE_GRAVEYARD, RR_GRAVEYARD_HEART_PIECE_GRAVE, ENTR_REDEAD_GRAVE_0 }, - { EntranceType::GrottoGrave, RR_GRAVEYARD_HEART_PIECE_GRAVE, RR_THE_GRAVEYARD, ENTR_GRAVEYARD_HEART_PIECE_GRAVE_EXIT } }, - { { EntranceType::GrottoGrave, RR_THE_GRAVEYARD, RR_GRAVEYARD_COMPOSERS_GRAVE, ENTR_ROYAL_FAMILYS_TOMB_0 }, - { EntranceType::GrottoGrave, RR_GRAVEYARD_COMPOSERS_GRAVE, RR_THE_GRAVEYARD, ENTR_GRAVEYARD_ROYAL_TOMB_EXIT } }, - { { EntranceType::GrottoGrave, RR_THE_GRAVEYARD, RR_GRAVEYARD_DAMPES_GRAVE, ENTR_WINDMILL_AND_DAMPES_GRAVE_GRAVE }, - { EntranceType::GrottoGrave, RR_GRAVEYARD_DAMPES_GRAVE, RR_THE_GRAVEYARD, ENTR_GRAVEYARD_DAMPES_GRAVE_EXIT } }, - - { { EntranceType::Overworld, RR_KOKIRI_FOREST, RR_LW_BRIDGE_FROM_FOREST, ENTR_LOST_WOODS_BRIDGE_EAST_EXIT }, - { EntranceType::Overworld, RR_LW_BRIDGE, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_LOWER_EXIT } }, - { { EntranceType::Overworld, RR_KOKIRI_FOREST, RR_THE_LOST_WOODS, ENTR_LOST_WOODS_SOUTH_EXIT }, - { EntranceType::Overworld, RR_LW_FOREST_EXIT, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_UPPER_EXIT } }, - { { EntranceType::Overworld, RR_THE_LOST_WOODS, RR_GC_WOODS_WARP, ENTR_GORON_CITY_TUNNEL_SHORTCUT }, - { EntranceType::Overworld, RR_GC_WOODS_WARP, RR_THE_LOST_WOODS, ENTR_LOST_WOODS_TUNNEL_SHORTCUT } }, - { { EntranceType::Overworld, RR_THE_LOST_WOODS, RR_ZORAS_RIVER, ENTR_ZORAS_RIVER_UNDERWATER_SHORTCUT }, - { EntranceType::Overworld, RR_ZORAS_RIVER, RR_THE_LOST_WOODS, ENTR_LOST_WOODS_UNDERWATER_SHORTCUT } }, - { { EntranceType::Overworld, RR_LW_BEYOND_MIDO, RR_SFM_ENTRYWAY, ENTR_SACRED_FOREST_MEADOW_SOUTH_EXIT }, - { EntranceType::Overworld, RR_SFM_ENTRYWAY, RR_LW_BEYOND_MIDO, ENTR_LOST_WOODS_NORTH_EXIT } }, - { { EntranceType::Overworld, RR_LW_BRIDGE, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_WOODED_EXIT }, - { EntranceType::Overworld, RR_HYRULE_FIELD, RR_LW_BRIDGE, ENTR_LOST_WOODS_BRIDGE_WEST_EXIT } }, - { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_NORTH_EXIT }, - { EntranceType::Overworld, RR_LAKE_HYLIA, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_FENCE_EXIT } }, - { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_GERUDO_VALLEY, ENTR_GERUDO_VALLEY_EAST_EXIT }, - { EntranceType::Overworld, RR_GERUDO_VALLEY, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_ROCKY_PATH } }, - { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_MARKET_ENTRANCE, ENTR_MARKET_ENTRANCE_NEAR_GUARD_EXIT }, - { EntranceType::Overworld, RR_MARKET_ENTRANCE, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_ON_BRIDGE_SPAWN } }, - { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_FRONT_GATE }, - { EntranceType::Overworld, RR_KAKARIKO_VILLAGE, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_STAIRS_EXIT } }, - { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_ZR_FRONT, ENTR_ZORAS_RIVER_WEST_EXIT }, - { EntranceType::Overworld, RR_ZR_FRONT, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_RIVER_EXIT } }, - { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_LON_LON_RANCH, ENTR_LON_LON_RANCH_ENTRANCE }, - { EntranceType::Overworld, RR_LON_LON_RANCH, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_CENTER_EXIT } }, - { { EntranceType::Overworld, RR_LAKE_HYLIA, RR_ZORAS_DOMAIN, ENTR_ZORAS_DOMAIN_UNDERWATER_SHORTCUT }, - { EntranceType::Overworld, RR_ZORAS_DOMAIN, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_UNDERWATER_SHORTCUT } }, - { { EntranceType::Overworld, RR_GV_FORTRESS_SIDE, RR_GERUDO_FORTRESS, ENTR_GERUDOS_FORTRESS_EAST_EXIT }, - { EntranceType::Overworld, RR_GERUDO_FORTRESS, RR_GV_FORTRESS_SIDE, ENTR_GERUDO_VALLEY_WEST_EXIT } }, - { { EntranceType::Overworld, RR_GF_OUTSIDE_GATE, RR_WASTELAND_NEAR_FORTRESS, ENTR_HAUNTED_WASTELAND_EAST_EXIT }, - { EntranceType::Overworld, RR_WASTELAND_NEAR_FORTRESS, RR_GF_OUTSIDE_GATE, ENTR_GERUDOS_FORTRESS_GATE_EXIT } }, - { { EntranceType::Overworld, RR_WASTELAND_NEAR_COLOSSUS, RR_DESERT_COLOSSUS, ENTR_DESERT_COLOSSUS_EAST_EXIT }, - { EntranceType::Overworld, RR_DESERT_COLOSSUS, RR_WASTELAND_NEAR_COLOSSUS, ENTR_HAUNTED_WASTELAND_WEST_EXIT } }, - { { EntranceType::Overworld, RR_MARKET_ENTRANCE, RR_THE_MARKET, ENTR_MARKET_SOUTH_EXIT }, - { EntranceType::Overworld, RR_THE_MARKET, RR_MARKET_ENTRANCE, ENTR_MARKET_ENTRANCE_NORTH_EXIT } }, - { { EntranceType::Overworld, RR_THE_MARKET, RR_CASTLE_GROUNDS, ENTR_CASTLE_GROUNDS_SOUTH_EXIT }, - { EntranceType::Overworld, RR_CASTLE_GROUNDS, RR_THE_MARKET, ENTR_MARKET_DAY_CASTLE_EXIT } }, - { { EntranceType::Overworld, RR_THE_MARKET, RR_TOT_ENTRANCE, ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_GOSSIP_STONE_EXIT }, - { EntranceType::Overworld, RR_TOT_ENTRANCE, RR_THE_MARKET, ENTR_MARKET_DAY_TEMPLE_EXIT } }, - { { EntranceType::Overworld, RR_KAKARIKO_VILLAGE, RR_THE_GRAVEYARD, ENTR_GRAVEYARD_ENTRANCE }, - { EntranceType::Overworld, RR_THE_GRAVEYARD, RR_KAKARIKO_VILLAGE, ENTR_KAKARIKO_VILLAGE_SOUTHEAST_EXIT } }, - { { EntranceType::Overworld, RR_KAK_BEHIND_GATE, RR_DEATH_MOUNTAIN_TRAIL, ENTR_DEATH_MOUNTAIN_TRAIL_BOTTOM_EXIT }, - { EntranceType::Overworld, RR_DEATH_MOUNTAIN_TRAIL, RR_KAK_BEHIND_GATE, ENTR_KAKARIKO_VILLAGE_GUARD_GATE } }, - { { EntranceType::Overworld, RR_DEATH_MOUNTAIN_TRAIL, RR_GORON_CITY, ENTR_GORON_CITY_UPPER_EXIT }, - { EntranceType::Overworld, RR_GORON_CITY, RR_DEATH_MOUNTAIN_TRAIL, ENTR_DEATH_MOUNTAIN_TRAIL_GC_EXIT } }, - { { EntranceType::Overworld, RR_GC_DARUNIAS_CHAMBER, RR_DMC_LOWER_LOCAL, ENTR_DEATH_MOUNTAIN_CRATER_GC_EXIT }, - { EntranceType::Overworld, RR_DMC_LOWER_NEARBY, RR_GC_DARUNIAS_CHAMBER, ENTR_GORON_CITY_DARUNIA_ROOM_EXIT } }, - { { EntranceType::Overworld, RR_DEATH_MOUNTAIN_SUMMIT, RR_DMC_UPPER_LOCAL, ENTR_DEATH_MOUNTAIN_CRATER_UPPER_EXIT }, - { EntranceType::Overworld, RR_DMC_UPPER_NEARBY, RR_DEATH_MOUNTAIN_SUMMIT, ENTR_DEATH_MOUNTAIN_TRAIL_SUMMIT_EXIT } }, - { { EntranceType::Overworld, RR_ZR_BEHIND_WATERFALL, RR_ZORAS_DOMAIN, ENTR_ZORAS_DOMAIN_ENTRANCE }, - { EntranceType::Overworld, RR_ZORAS_DOMAIN, RR_ZR_BEHIND_WATERFALL, ENTR_ZORAS_RIVER_WATERFALL_EXIT } }, - { { EntranceType::Overworld, RR_ZD_BEHIND_KING_ZORA, RR_ZORAS_FOUNTAIN, ENTR_ZORAS_FOUNTAIN_TUNNEL_EXIT }, - { EntranceType::Overworld, RR_ZORAS_FOUNTAIN, RR_ZD_BEHIND_KING_ZORA, ENTR_ZORAS_DOMAIN_KING_ZORA_EXIT } }, - - { { EntranceType::Overworld, RR_GV_LOWER_STREAM, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_RIVER_EXIT }, - NO_RETURN_ENTRANCE }, - - { { EntranceType::OwlDrop, RR_LH_OWL_FLIGHT, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_OWL_DROP }, - NO_RETURN_ENTRANCE }, - { { EntranceType::OwlDrop, RR_DMT_OWL_FLIGHT, RR_KAK_IMPAS_ROOFTOP, ENTR_KAKARIKO_VILLAGE_OWL_DROP }, - NO_RETURN_ENTRANCE }, - - { { EntranceType::Spawn, RR_CHILD_SPAWN, RR_KF_LINKS_HOUSE, ENTR_LINKS_HOUSE_CHILD_SPAWN }, - NO_RETURN_ENTRANCE }, - { { EntranceType::Spawn, RR_ADULT_SPAWN, RR_TEMPLE_OF_TIME, ENTR_HYRULE_FIELD_10 }, - NO_RETURN_ENTRANCE }, // 0x282 is an unused entrance index repurposed to differentiate between - // Adult Spawn and prelude of light (normally they both use 0x5F4) - { { EntranceType::WarpSong, RR_MINUET_OF_FOREST_WARP, RR_SACRED_FOREST_MEADOW, ENTR_SACRED_FOREST_MEADOW_WARP_PAD }, - NO_RETURN_ENTRANCE }, - { { EntranceType::WarpSong, RR_BOLERO_OF_FIRE_WARP, RR_DMC_CENTRAL_LOCAL, ENTR_DEATH_MOUNTAIN_CRATER_WARP_PAD }, - NO_RETURN_ENTRANCE }, - { { EntranceType::WarpSong, RR_SERENADE_OF_WATER_WARP, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_WARP_PAD }, - NO_RETURN_ENTRANCE }, - { { EntranceType::WarpSong, RR_REQUIEM_OF_SPIRIT_WARP, RR_DESERT_COLOSSUS, ENTR_DESERT_COLOSSUS_WARP_PAD }, - NO_RETURN_ENTRANCE }, - { { EntranceType::WarpSong, RR_NOCTURNE_OF_SHADOW_WARP, RR_GRAVEYARD_WARP_PAD_REGION, ENTR_GRAVEYARD_WARP_PAD }, - NO_RETURN_ENTRANCE }, - { { EntranceType::WarpSong, RR_PRELUDE_OF_LIGHT_WARP, RR_TEMPLE_OF_TIME, ENTR_TEMPLE_OF_TIME_WARP_PAD }, - NO_RETURN_ENTRANCE }, - - { { EntranceType::ChildBoss, RR_DEKU_TREE_BOSS_ENTRYWAY, RR_DEKU_TREE_BOSS_ROOM, ENTR_DEKU_TREE_BOSS_ENTRANCE }, - { EntranceType::ChildBoss, RR_DEKU_TREE_BOSS_ROOM, RR_DEKU_TREE_BOSS_EXIT, ENTR_DEKU_TREE_BOSS_DOOR } }, - { { EntranceType::ChildBoss, RR_DODONGOS_CAVERN_BOSS_ENTRYWAY, RR_DODONGOS_CAVERN_BOSS_ROOM, ENTR_DODONGOS_CAVERN_BOSS_ENTRANCE }, - { EntranceType::ChildBoss, RR_DODONGOS_CAVERN_BOSS_ROOM, RR_DODONGOS_CAVERN_BOSS_EXIT, ENTR_DODONGOS_CAVERN_BOSS_DOOR } }, - { { EntranceType::ChildBoss, RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY, RR_JABU_JABUS_BELLY_BOSS_ROOM, ENTR_JABU_JABU_BOSS_ENTRANCE }, - { EntranceType::ChildBoss, RR_JABU_JABUS_BELLY_BOSS_ROOM, RR_JABU_JABUS_BELLY_BOSS_EXIT, ENTR_JABU_JABU_BOSS_DOOR } }, - { { EntranceType::AdultBoss, RR_FOREST_TEMPLE_BOSS_ENTRYWAY, RR_FOREST_TEMPLE_BOSS_ROOM, ENTR_FOREST_TEMPLE_BOSS_ENTRANCE }, - { EntranceType::AdultBoss, RR_FOREST_TEMPLE_BOSS_ROOM, RR_FOREST_TEMPLE_BOSS_ENTRYWAY, ENTR_FOREST_TEMPLE_BOSS_DOOR } }, - { { EntranceType::AdultBoss, RR_FIRE_TEMPLE_BOSS_ENTRYWAY, RR_FIRE_TEMPLE_BOSS_ROOM, ENTR_FIRE_TEMPLE_BOSS_ENTRANCE }, - { EntranceType::AdultBoss, RR_FIRE_TEMPLE_BOSS_ROOM, RR_FIRE_TEMPLE_BOSS_ENTRYWAY, ENTR_FIRE_TEMPLE_BOSS_DOOR } }, - { { EntranceType::AdultBoss, RR_WATER_TEMPLE_BOSS_ENTRYWAY, RR_WATER_TEMPLE_BOSS_ROOM, ENTR_WATER_TEMPLE_BOSS_ENTRANCE }, - { EntranceType::AdultBoss, RR_WATER_TEMPLE_BOSS_ROOM, RR_WATER_TEMPLE_BOSS_ENTRYWAY, ENTR_WATER_TEMPLE_BOSS_DOOR } }, - { { EntranceType::AdultBoss, RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, RR_SPIRIT_TEMPLE_BOSS_ROOM, ENTR_SPIRIT_TEMPLE_BOSS_ENTRANCE }, - { EntranceType::AdultBoss, RR_SPIRIT_TEMPLE_BOSS_ROOM, RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, ENTR_SPIRIT_TEMPLE_BOSS_DOOR } }, - { { EntranceType::AdultBoss, RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, RR_SHADOW_TEMPLE_BOSS_ROOM, ENTR_SHADOW_TEMPLE_BOSS_ENTRANCE }, - { EntranceType::AdultBoss, RR_SHADOW_TEMPLE_BOSS_ROOM, RR_SHADOW_TEMPLE_BOSS_ENTRYWAY, ENTR_SHADOW_TEMPLE_BOSS_DOOR } }, - - { { EntranceType::BlueWarp, RR_DEKU_TREE_BOSS_ROOM, RR_KF_OUTSIDE_DEKU_TREE, ENTR_KOKIRI_FOREST_DEKU_TREE_BLUE_WARP }, - NO_RETURN_ENTRANCE }, - { { EntranceType::BlueWarp, RR_DODONGOS_CAVERN_BOSS_ROOM, RR_DEATH_MOUNTAIN_TRAIL, ENTR_DEATH_MOUNTAIN_TRAIL_DODONGO_BLUE_WARP }, - NO_RETURN_ENTRANCE }, - { { EntranceType::BlueWarp, RR_JABU_JABUS_BELLY_BOSS_ROOM, RR_ZORAS_FOUNTAIN, ENTR_ZORAS_FOUNTAIN_JABU_JABU_BLUE_WARP }, - NO_RETURN_ENTRANCE }, - { { EntranceType::BlueWarp, RR_FOREST_TEMPLE_BOSS_ROOM, RR_SACRED_FOREST_MEADOW, ENTR_SACRED_FOREST_MEADOW_FOREST_TEMPLE_BLUE_WARP }, - NO_RETURN_ENTRANCE }, - { { EntranceType::BlueWarp, RR_FIRE_TEMPLE_BOSS_ROOM, RR_DMC_CENTRAL_LOCAL, ENTR_DEATH_MOUNTAIN_CRATER_FIRE_TEMPLE_BLUE_WARP }, - NO_RETURN_ENTRANCE }, - { { EntranceType::BlueWarp, RR_WATER_TEMPLE_BOSS_ROOM, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_WATER_TEMPLE_BLUE_WARP }, - NO_RETURN_ENTRANCE }, - { { EntranceType::BlueWarp, RR_SPIRIT_TEMPLE_BOSS_ROOM, RR_DESERT_COLOSSUS, ENTR_DESERT_COLOSSUS_SPIRIT_TEMPLE_BLUE_WARP }, - NO_RETURN_ENTRANCE }, - { { EntranceType::BlueWarp, RR_SHADOW_TEMPLE_BOSS_ROOM, RR_GRAVEYARD_WARP_PAD_REGION, ENTR_GRAVEYARD_SHADOW_TEMPLE_BLUE_WARP }, - NO_RETURN_ENTRANCE }, - // clang-format on - }; - std::map priorityEntranceTable = { { "Bolero", { { RR_DMC_CENTRAL_LOCAL }, { EntranceType::OwlDrop, EntranceType::WarpSong } } }, { "Nocturne", @@ -1178,7 +1182,7 @@ int EntranceShuffler::ShuffleAllEntrances() { }; mEntranceShuffleFailure = false; - SetAllEntrancesData(entranceShuffleTable); + SetAllEntrancesData(); EntrancePools oneWayEntrancePools = {}; EntrancePools entrancePools = {}; @@ -1663,6 +1667,26 @@ void EntranceShuffler::ParseJson(nlohmann::json spoilerFileJson) { } } catch (const std::exception& e) { throw e; } } + +void EntranceShuffler::ApplyEntranceOverrides() { + SetAllEntrancesData(); + + for (size_t i = 0; i < entranceOverrides.size(); i++) { + EntranceOverride entranceOverride = entranceOverrides[i]; + + if (entranceOverride.index == 0 && entranceOverride.destination == 0 && entranceOverride.override == 0 && + entranceOverride.overrideDestination == 0) { + continue; + } + + Entrance* entrance = entranceMap[entranceOverride.index]; + Entrance* overrideEntrance = entranceMap[entranceOverride.override]; + + entrance->Disconnect(); + entrance->Connect(overrideEntrance->GetOriginalConnectedRegionKey()); + entrance->SetAsShuffled(); + } +} } // namespace Rando extern "C" EntranceOverride* Randomizer_GetEntranceOverrides() { diff --git a/soh/soh/Enhancements/randomizer/entrance.h b/soh/soh/Enhancements/randomizer/entrance.h index 026da7426..6cb631db3 100644 --- a/soh/soh/Enhancements/randomizer/entrance.h +++ b/soh/soh/Enhancements/randomizer/entrance.h @@ -128,6 +128,7 @@ class EntranceShuffler { void CreateEntranceOverrides(); void UnshuffleAllEntrances(); void ParseJson(nlohmann::json spoilerFileJson); + void ApplyEntranceOverrides(); private: std::vector AssumeEntrancePool(std::vector& entrancePool); diff --git a/soh/soh/Enhancements/randomizer/item.cpp b/soh/soh/Enhancements/randomizer/item.cpp index ee0dc9403..3b75a0c95 100644 --- a/soh/soh/Enhancements/randomizer/item.cpp +++ b/soh/soh/Enhancements/randomizer/item.cpp @@ -46,14 +46,20 @@ Item::~Item() = default; void Item::ApplyEffect() const { auto ctx = Rando::Context::GetInstance(); - ctx->GetLogic()->ApplyItemEffect(StaticData::RetrieveItem(randomizerGet), true); - ctx->GetLogic()->SetInLogic(logicVal, true); + auto logic = ctx->GetLogic(); + if (!logic->CalculatingAvailableChecks) { + logic->ApplyItemEffect(StaticData::RetrieveItem(randomizerGet), true); + } + logic->SetInLogic(logicVal, true); } void Item::UndoEffect() const { auto ctx = Rando::Context::GetInstance(); - ctx->GetLogic()->ApplyItemEffect(StaticData::RetrieveItem(randomizerGet), false); - ctx->GetLogic()->SetInLogic(logicVal, false); + auto logic = ctx->GetLogic(); + if (!logic->CalculatingAvailableChecks) { + logic->ApplyItemEffect(StaticData::RetrieveItem(randomizerGet), false); + } + logic->SetInLogic(logicVal, false); } const Text& Item::GetName() const { diff --git a/soh/soh/Enhancements/randomizer/location_access.h b/soh/soh/Enhancements/randomizer/location_access.h index 9c8df0e9b..8f7bb82d3 100644 --- a/soh/soh/Enhancements/randomizer/location_access.h +++ b/soh/soh/Enhancements/randomizer/location_access.h @@ -137,7 +137,6 @@ class Region { bool adultDay = false; bool adultNight = false; bool addedToPool = false; - ; void ApplyTimePass(); diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index 7f4b7e102..597feb463 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -2332,8 +2332,10 @@ void Logic::SetInLogic(LogicVal logicVal, bool value) { inLogic[logicVal] = value; } -void Logic::Reset() { - NewSaveContext(); +void Logic::Reset(bool resetSaveContext /*= true*/) { + if (resetSaveContext) { + NewSaveContext(); + } StartPerformanceTimer(PT_LOGIC_RESET); memset(inLogic, false, sizeof(inLogic)); // Settings-dependent variables @@ -2372,37 +2374,39 @@ void Logic::Reset() { ShadowTrialClear = false; LightTrialClear = false; - // Ocarina C Buttons - bool ocBtnShuffle = ctx->GetOption(RSK_SHUFFLE_OCARINA_BUTTONS).Is(true); - SetRandoInf(RAND_INF_HAS_OCARINA_A, !ocBtnShuffle); - SetRandoInf(RAND_INF_HAS_OCARINA_C_UP, !ocBtnShuffle); - SetRandoInf(RAND_INF_HAS_OCARINA_C_DOWN, !ocBtnShuffle); - SetRandoInf(RAND_INF_HAS_OCARINA_C_LEFT, !ocBtnShuffle); - SetRandoInf(RAND_INF_HAS_OCARINA_C_RIGHT, !ocBtnShuffle); + if (resetSaveContext) { + // Ocarina C Buttons + bool ocBtnShuffle = ctx->GetOption(RSK_SHUFFLE_OCARINA_BUTTONS).Is(true); + SetRandoInf(RAND_INF_HAS_OCARINA_A, !ocBtnShuffle); + SetRandoInf(RAND_INF_HAS_OCARINA_C_UP, !ocBtnShuffle); + SetRandoInf(RAND_INF_HAS_OCARINA_C_DOWN, !ocBtnShuffle); + SetRandoInf(RAND_INF_HAS_OCARINA_C_LEFT, !ocBtnShuffle); + SetRandoInf(RAND_INF_HAS_OCARINA_C_RIGHT, !ocBtnShuffle); - // Progressive Items - SetUpgrade(UPG_STICKS, ctx->GetOption(RSK_SHUFFLE_DEKU_STICK_BAG).Is(true) ? 0 : 1); - SetUpgrade(UPG_NUTS, ctx->GetOption(RSK_SHUFFLE_DEKU_NUT_BAG).Is(true) ? 0 : 1); + // Progressive Items + SetUpgrade(UPG_STICKS, ctx->GetOption(RSK_SHUFFLE_DEKU_STICK_BAG).Is(true) ? 0 : 1); + SetUpgrade(UPG_NUTS, ctx->GetOption(RSK_SHUFFLE_DEKU_NUT_BAG).Is(true) ? 0 : 1); - // If we're not shuffling swim, we start with it - if (ctx->GetOption(RSK_SHUFFLE_SWIM).Is(false)) { - SetRandoInf(RAND_INF_CAN_SWIM, true); - } + // If we're not shuffling swim, we start with it + if (ctx->GetOption(RSK_SHUFFLE_SWIM).Is(false)) { + SetRandoInf(RAND_INF_CAN_SWIM, true); + } - // If we're not shuffling child's wallet, we start with it - if (ctx->GetOption(RSK_SHUFFLE_CHILD_WALLET).Is(false)) { - SetRandoInf(RAND_INF_HAS_WALLET, true); - } + // If we're not shuffling child's wallet, we start with it + if (ctx->GetOption(RSK_SHUFFLE_CHILD_WALLET).Is(false)) { + SetRandoInf(RAND_INF_HAS_WALLET, true); + } - // If we're not shuffling fishing pole, we start with it - if (ctx->GetOption(RSK_SHUFFLE_FISHING_POLE).Is(false)) { - SetRandoInf(RAND_INF_FISHING_POLE_FOUND, true); - } + // If we're not shuffling fishing pole, we start with it + if (ctx->GetOption(RSK_SHUFFLE_FISHING_POLE).Is(false)) { + SetRandoInf(RAND_INF_FISHING_POLE_FOUND, true); + } - // If not keysanity, start with 1 logical key to account for automatically unlocking the basement door in vanilla - // FiT - if (!IsFireLoopLocked && ctx->GetDungeon(Rando::FIRE_TEMPLE)->IsVanilla()) { - SetSmallKeyCount(SCENE_FIRE_TEMPLE, 1); + // If not keysanity, start with 1 logical key to account for automatically unlocking the basement door in + // vanilla FiT + if (!IsFireLoopLocked && ctx->GetDungeon(Rando::FIRE_TEMPLE)->IsVanilla()) { + SetSmallKeyCount(SCENE_FIRE_TEMPLE, 1); + } } // Bottle Count @@ -2455,7 +2459,9 @@ void Logic::Reset() { // Other AtDay = false; AtNight = false; - GetSaveContext()->linkAge = !ctx->GetOption(RSK_SELECTED_STARTING_AGE).Get(); + if (resetSaveContext) { + GetSaveContext()->linkAge = !ctx->GetOption(RSK_SELECTED_STARTING_AGE).Get(); + } // Events ShowedMidoSwordAndShield = false; @@ -2520,6 +2526,8 @@ void Logic::Reset() { Spirit1FSilverRupees = false; JabuRutoIn1F = false; + CalculatingAvailableChecks = false; + StopPerformanceTimer(PT_LOGIC_RESET); } } // namespace Rando diff --git a/soh/soh/Enhancements/randomizer/logic.h b/soh/soh/Enhancements/randomizer/logic.h index 77c49d25f..0c138a3eb 100644 --- a/soh/soh/Enhancements/randomizer/logic.h +++ b/soh/soh/Enhancements/randomizer/logic.h @@ -183,6 +183,9 @@ class Logic { /* --- END OF HELPERS AND LOCATION ACCESS --- */ + bool CalculatingAvailableChecks = false; + bool ACProcessUndiscoveredExits = false; + SaveContext* mSaveContext = nullptr; Logic(); bool CanUse(RandomizerGet itemName); @@ -254,7 +257,7 @@ class Logic { bool CanUseProjectile(); bool CanBuildRainbowBridge(); bool CanTriggerLACS(); - void Reset(); + void Reset(bool resetSaveContext = true); void SetContext(std::shared_ptr _ctx); bool GetInLogic(LogicVal logicVal); void SetInLogic(LogicVal logicVal, bool remove); diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index 8648c9826..3a2c5e475 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -580,6 +580,13 @@ void CheckTrackerLoadGame(int32_t fileNum) { UpdateAllOrdering(); UpdateInventoryChecks(); UpdateFilters(); + + RegionTable_Init(); + + if (Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_ENTRANCES).Get()) { + Rando::Context::GetInstance()->GetEntranceShuffler()->ApplyEntranceOverrides(); + } + RecalculateAvailableChecks(); } @@ -898,7 +905,6 @@ void LoadFile() { SaveManager::Instance->LoadData("areasSpoiled", areasSpoiled, (uint32_t)0); UpdateAllOrdering(); UpdateAllAreas(); - RegionTable_Init(); } void Teardown() { @@ -1481,6 +1487,27 @@ void LoadSettings() { showOverworldFreestanding = false; showDungeonFreestanding = true; } + + switch (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_GANONS_BOSS_KEY)) { + case RO_GANON_BOSS_KEY_LACS_STONES: + Rando::Context::GetInstance()->LACSCondition(RO_LACS_STONES); + break; + case RO_GANON_BOSS_KEY_LACS_MEDALLIONS: + Rando::Context::GetInstance()->LACSCondition(RO_LACS_MEDALLIONS); + break; + case RO_GANON_BOSS_KEY_LACS_REWARDS: + Rando::Context::GetInstance()->LACSCondition(RO_LACS_REWARDS); + break; + case RO_GANON_BOSS_KEY_LACS_DUNGEONS: + Rando::Context::GetInstance()->LACSCondition(RO_LACS_DUNGEONS); + break; + case RO_GANON_BOSS_KEY_LACS_TOKENS: + Rando::Context::GetInstance()->LACSCondition(RO_LACS_TOKENS); + break; + default: + Rando::Context::GetInstance()->LACSCondition(RO_LACS_VANILLA); + break; + } } bool IsCheckShuffled(RandomizerCheck rc) { @@ -1820,7 +1847,7 @@ void DrawLocation(RandomizerCheck rc) { case RCSHOW_IDENTIFIED: case RCSHOW_SEEN: if (IS_RANDO) { - if (itemLoc->GetPlacedRandomizerGet() == RG_ICE_TRAP && !mystery && !itemLoc->IsAddedToPool()) { + if (itemLoc->GetPlacedRandomizerGet() == RG_ICE_TRAP && !mystery) { if (status == RCSHOW_IDENTIFIED) { txt = OTRGlobals::Instance->gRandoContext->overrides[rc].GetTrickName().GetForLanguage( gSaveContext.language); @@ -1830,11 +1857,10 @@ void DrawLocation(RandomizerCheck rc) { .GetName() .GetForLanguage(gSaveContext.language); } - } else if (!mystery && !itemLoc->IsAddedToPool()) { + } else if (!mystery) { txt = itemLoc->GetPlacedItem().GetName().GetForLanguage(gSaveContext.language); } - if (IsVisibleInCheckTracker(rc) && status == RCSHOW_IDENTIFIED && !mystery && - !itemLoc->IsAddedToPool()) { + if (IsVisibleInCheckTracker(rc) && status == RCSHOW_IDENTIFIED && !mystery) { auto price = OTRGlobals::Instance->gRandoContext->GetItemLocation(rc)->GetPrice(); if (price) { txt += fmt::format(" - {}", price); @@ -1958,7 +1984,7 @@ void ImGuiDrawTwoColorPickerSection(const char* text, const char* cvarMainName, UIWidgets::PopStyleCombobox(); } -void RecalculateAvailableChecks() { +void RecalculateAvailableChecks(RandomizerRegion startingRegion /* = RR_ROOT */) { if (!enableAvailableChecks) { return; } @@ -1966,20 +1992,22 @@ void RecalculateAvailableChecks() { ResetPerformanceTimer(PT_RECALCULATE_AVAILABLE_CHECKS); StartPerformanceTimer(PT_RECALCULATE_AVAILABLE_CHECKS); + const auto& ctx = Rando::Context::GetInstance(); + std::vector targetLocations; targetLocations.reserve(RC_MAX); for (auto& location : Rando::StaticData::GetLocationTable()) { RandomizerCheck rc = location.GetRandomizerCheck(); - Rando::ItemLocation* itemLocation = OTRGlobals::Instance->gRandoContext->GetItemLocation(rc); + Rando::ItemLocation* itemLocation = ctx->GetItemLocation(rc); itemLocation->SetAvailable(false); if (!itemLocation->HasObtained()) { targetLocations.emplace_back(rc); } } - std::vector availableChecks = ReachabilitySearch(targetLocations, RG_NONE, true); + std::vector availableChecks = ReachabilitySearch(targetLocations, RG_NONE, true, startingRegion); for (auto& rc : availableChecks) { - const auto& itemLocation = OTRGlobals::Instance->gRandoContext->GetItemLocation(rc); + const auto& itemLocation = ctx->GetItemLocation(rc); itemLocation->SetAvailable(true); } @@ -1987,7 +2015,7 @@ void RecalculateAvailableChecks() { for (auto& [rcArea, vec] : checksByArea) { areaChecksAvailable[rcArea] = 0; for (auto& rc : vec) { - Rando::ItemLocation* itemLocation = OTRGlobals::Instance->gRandoContext->GetItemLocation(rc); + Rando::ItemLocation* itemLocation = ctx->GetItemLocation(rc); if (itemLocation->IsAvailable() && IsVisibleInCheckTracker(rc) && !IsCheckHidden(rc)) { areaChecksAvailable[rcArea]++; } diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h index d6fd503b3..7966c4b37 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.h @@ -61,5 +61,5 @@ void UpdateAllOrdering(); void UpdateAllAreas(); void RecalculateAllAreaTotals(); void SpoilAreaFromCheck(RandomizerCheck rc); -void RecalculateAvailableChecks(); +void RecalculateAvailableChecks(RandomizerRegion startingRegion = RR_ROOT); } // namespace CheckTracker diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance.c b/soh/soh/Enhancements/randomizer/randomizer_entrance.c index 11d17e621..faec117eb 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance.c +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance.c @@ -809,6 +809,7 @@ void Entrance_SetEntranceDiscovered(u16 entranceIndex, u8 isReversedEntrance) { if (idx < SAVEFILE_ENTRANCES_DISCOVERED_IDX_COUNT) { u32 entranceBit = 1 << (entranceIndex - (idx * bitsPerIndex)); gSaveContext.ship.stats.entrancesDiscovered[idx] |= entranceBit; + CheckTracker_RecalculateAvailableChecks(); // Set reverse entrance when not decoupled if (!Randomizer_GetSettingValue(RSK_DECOUPLED_ENTRANCES) && !isReversedEntrance) { diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 6e494a6b5..a2db7ee0e 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -1739,6 +1739,14 @@ TrickOption& Settings::GetTrickOption(const RandomizerTrick key) { return mTrickOptions[key]; } +int Settings::GetRandomizerTrickByName(const std::string& name) { + const auto& it = mTrickNameToEnum.find(name); + if (it == mTrickNameToEnum.end()) { + return -1; + } + return it->second; +} + void Context::ResetTrickOptions() { for (int count = 0; count < RT_MAX; count++) { mTrickOptions[count].Set(0); // RANDOTODO this can probably be done better diff --git a/soh/soh/Enhancements/randomizer/settings.h b/soh/soh/Enhancements/randomizer/settings.h index c820a9df9..ed214471a 100644 --- a/soh/soh/Enhancements/randomizer/settings.h +++ b/soh/soh/Enhancements/randomizer/settings.h @@ -50,6 +50,14 @@ class Settings { */ TrickOption& GetTrickOption(RandomizerTrick key); + /** + * @brief Get the RandomizerTrick corresponding to the provided name. + * + * @param name + * @return int RandomizerTrick index or -1 if not found + */ + int GetRandomizerTrickByName(const std::string& name); + /** * @brief Returns a reference to the entire array of options. * diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 3195bf2b7..9bd3008f8 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -2615,4 +2615,7 @@ void SoH_ProcessDroppedFiles(std::string filePath) { return; } } -// #endregion + +extern "C" void CheckTracker_RecalculateAvailableChecks() { + CheckTracker::RecalculateAvailableChecks(); +} diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index b14d322d2..bcc5c8657 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -163,6 +163,7 @@ void Gfx_UnregisterBlendedTexture(const char* name); void Gfx_TextureCacheDelete(const uint8_t* addr); void SaveManager_ThreadPoolWait(); void CheckTracker_OnMessageClose(); +void CheckTracker_RecalculateAvailableChecks(); GetItemID RetrieveGetItemIDFromItemID(ItemID itemID); RandomizerGet RetrieveRandomizerGetFromItemID(ItemID itemID); diff --git a/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c b/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c index 81542eaad..a11180a7b 100644 --- a/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c +++ b/soh/src/overlays/actors/ovl_Bg_Toki_Swd/z_bg_toki_swd.c @@ -131,8 +131,14 @@ void func_808BAF40(BgTokiSwd* this, PlayState* play) { Item_Give(play, ITEM_SWORD_MASTER); } play->csCtx.segment = D_808BB2F0; + + // Discover adult spawn + Entrance_SetEntranceDiscovered(ENTR_HYRULE_FIELD_10, false); } else { play->csCtx.segment = D_808BB7A0; + + // Discover child spawn + Entrance_SetEntranceDiscovered(ENTR_LINKS_HOUSE_CHILD_SPAWN, false); } Audio_QueueSeqCmd(SEQ_PLAYER_BGM_MAIN << 24 | NA_BGM_STOP); Audio_QueueSeqCmd(SEQ_PLAYER_BGM_MAIN << 24 | NA_BGM_MASTER_SWORD); From 8b4cad17106e4d749d2e2a6b01843e83f0942538 Mon Sep 17 00:00:00 2001 From: Rozelette Date: Fri, 23 May 2025 20:47:08 -0500 Subject: [PATCH 07/67] Rework ActorViewer to use hooks (#5474) * Rework ActorViewer to use hooks * Rework ActorViewer to use hooks * Remove ResetData --- soh/soh/Enhancements/debugger/actorViewer.cpp | 270 ++++++++---------- soh/soh/Enhancements/debugger/actorViewer.h | 11 +- .../GameInteractor_HookTable.h | 1 + .../game-interactor/GameInteractor_Hooks.cpp | 7 + .../game-interactor/GameInteractor_Hooks.h | 1 + soh/src/code/z_actor.c | 2 + 6 files changed, 142 insertions(+), 150 deletions(-) diff --git a/soh/soh/Enhancements/debugger/actorViewer.cpp b/soh/soh/Enhancements/debugger/actorViewer.cpp index ae4e498b5..d21d9449e 100644 --- a/soh/soh/Enhancements/debugger/actorViewer.cpp +++ b/soh/soh/Enhancements/debugger/actorViewer.cpp @@ -7,6 +7,7 @@ #include "soh/Enhancements/nametag.h" #include "soh/ShipInit.hpp" +#include #include #include #include @@ -45,13 +46,6 @@ typedef struct { Vec3s rot; } ActorInfo; -typedef enum { - LIST, - TARGET, - HELD, - INTERACT, -} RetrievalMethod; - std::array acMapping = { "Switch", "Background (Prop type 1)", "Player", "Bomb", @@ -873,37 +867,14 @@ void ActorViewer_AddTagForAllActors() { void ActorViewerWindow::DrawElement() { ImGui::BeginDisabled(CVarGetInteger(CVAR_SETTING("DisableChanges"), 0)); - static Actor* display; - static Actor empty{}; - static Actor* fetch = NULL; static ActorInfo newActor = { 0, 0, { 0, 0, 0 }, { 0, 0, 0 } }; - static bool needs_reset = false; static ImU16 one = 1; - static int actor; - static int category = 0; - static RetrievalMethod rm; static std::string filler = "Please select"; - static std::vector list; - static u16 lastSceneId = 0; static std::string searchString = ""; - static s16 currentSelectedInDropdown; - static std::vector actors; + static s16 currentSelectedInDropdown = -1; + static std::vector actorSearchResults; if (gPlayState != nullptr) { - needs_reset = lastSceneId != gPlayState->sceneNum; - if (needs_reset) { - display = ∅ - fetch = nullptr; - actor = category = 0; - filler = "Please Select"; - list.clear(); - needs_reset = false; - searchString = ""; - currentSelectedInDropdown = -1; - actors.clear(); - } - lastSceneId = gPlayState->sceneNum; - if (ImGui::BeginChild("options", ImVec2(0, 0), ImGuiChildFlags_Border | ImGuiChildFlags_AutoResizeY)) { bool toggled = false; bool optionChange = false; @@ -967,21 +938,19 @@ void ActorViewerWindow::DrawElement() { ImGui::EndCombo(); } + if (display == nullptr) { + filler = "Please select"; + } + if (ImGui::BeginCombo("Actor", filler.c_str())) { - if (gPlayState != nullptr && lastSceneId != gPlayState->sceneNum) { - PopulateActorDropdown(category, list); - lastSceneId = gPlayState->sceneNum; - } for (int i = 0; i < list.size(); i++) { std::string label = std::to_string(i) + ": " + ActorDB::Instance->RetrieveEntry(list[i]->id).name; std::string description = GetActorDescription(list[i]->id); if (description != "") label += " (" + description + ")"; - if (ImGui::Selectable(label.c_str())) { - rm = LIST; + if (ImGui::Selectable(label.c_str(), list[i] == display)) { display = list[i]; - actor = i; filler = label; break; } @@ -992,88 +961,76 @@ void ActorViewerWindow::DrawElement() { PushStyleHeader(THEME_COLOR); if (ImGui::TreeNode("Selected Actor")) { - DrawGroupWithBorder( - [&]() { - ImGui::Text("Name: %s", ActorDB::Instance->RetrieveEntry(display->id).name.c_str()); - ImGui::Text("Description: %s", GetActorDescription(display->id).c_str()); - ImGui::Text("Category: %s", acMapping[display->category]); - ImGui::Text("ID: %d", display->id); - ImGui::Text("Parameters: %d", display->params); - ImGui::Text("Actor List Index: %d", GetActorListIndex(display)); - }, - "Selected Actor"); - ImGui::SameLine(); - ImGui::PushItemWidth(ImGui::GetFontSize() * 6); + if (display != nullptr) { + DrawGroupWithBorder( + [&]() { + ImGui::Text("Name: %s", ActorDB::Instance->RetrieveEntry(display->id).name.c_str()); + ImGui::Text("Description: %s", GetActorDescription(display->id).c_str()); + ImGui::Text("Category: %s", acMapping[display->category]); + ImGui::Text("ID: %d", display->id); + ImGui::Text("Parameters: %d", display->params); + ImGui::Text("Actor List Index: %d", GetActorListIndex(display)); + }, + "Selected Actor"); + ImGui::SameLine(); + ImGui::PushItemWidth(ImGui::GetFontSize() * 6); - DrawGroupWithBorder( - [&]() { - ImGui::PushItemWidth(ImGui::GetFontSize() * 6); + DrawGroupWithBorder( + [&]() { + ImGui::PushItemWidth(ImGui::GetFontSize() * 6); + PushStyleInput(THEME_COLOR); + ImGui::Text("Actor Position"); + ImGui::InputScalar("X##CurPos", ImGuiDataType_Float, &display->world.pos.x); + ImGui::InputScalar("Y##CurPos", ImGuiDataType_Float, &display->world.pos.y); + ImGui::InputScalar("Z##CurPos", ImGuiDataType_Float, &display->world.pos.z); + ImGui::PopItemWidth(); + PopStyleInput(); + }, + "Actor Position"); + ImGui::SameLine(); + DrawGroupWithBorder( + [&]() { + PushStyleInput(THEME_COLOR); + ImGui::PushItemWidth(ImGui::GetFontSize() * 6); + ImGui::Text("Actor Rotation"); + ImGui::InputScalar("X##CurRot", ImGuiDataType_S16, &display->world.rot.x); + ImGui::InputScalar("Y##CurRot", ImGuiDataType_S16, &display->world.rot.y); + ImGui::InputScalar("Z##CurRot", ImGuiDataType_S16, &display->world.rot.z); + ImGui::PopItemWidth(); + PopStyleInput(); + }, + "Actor Rotation"); + + if (display->category == ACTORCAT_BOSS || display->category == ACTORCAT_ENEMY) { PushStyleInput(THEME_COLOR); - ImGui::Text("Actor Position"); - ImGui::InputScalar("X##CurPos", ImGuiDataType_Float, &display->world.pos.x); - ImGui::InputScalar("Y##CurPos", ImGuiDataType_Float, &display->world.pos.y); - ImGui::InputScalar("Z##CurPos", ImGuiDataType_Float, &display->world.pos.z); - ImGui::PopItemWidth(); + ImGui::InputScalar("Enemy Health", ImGuiDataType_U8, &display->colChkInfo.health); PopStyleInput(); - }, - "Actor Position"); - ImGui::SameLine(); - DrawGroupWithBorder( - [&]() { - PushStyleInput(THEME_COLOR); - ImGui::PushItemWidth(ImGui::GetFontSize() * 6); - ImGui::Text("Actor Rotation"); - ImGui::InputScalar("X##CurRot", ImGuiDataType_S16, &display->world.rot.x); - ImGui::InputScalar("Y##CurRot", ImGuiDataType_S16, &display->world.rot.y); - ImGui::InputScalar("Z##CurRot", ImGuiDataType_S16, &display->world.rot.z); - ImGui::PopItemWidth(); - PopStyleInput(); - }, - "Actor Rotation"); - - if (display->category == ACTORCAT_BOSS || display->category == ACTORCAT_ENEMY) { - PushStyleInput(THEME_COLOR); - ImGui::InputScalar("Enemy Health", ImGuiDataType_U8, &display->colChkInfo.health); - PopStyleInput(); - UIWidgets::InsertHelpHoverText("Some actors might not use this!"); - } - - DrawGroupWithBorder( - [&]() { - ImGui::Text("flags"); - UIWidgets::DrawFlagArray32("flags", display->flags); - }, - "flags"); - - ImGui::SameLine(); - - DrawGroupWithBorder( - [&]() { - ImGui::Text("bgCheckFlags"); - UIWidgets::DrawFlagArray16("bgCheckFlags", display->bgCheckFlags); - }, - "bgCheckFlags"); - - if (Button("Refresh", ButtonOptions().Color(THEME_COLOR))) { - PopulateActorDropdown(category, list); - switch (rm) { - case INTERACT: - case HELD: - case TARGET: - display = fetch; - break; - case LIST: - display = list[actor]; - break; - default: - break; + UIWidgets::InsertHelpHoverText("Some actors might not use this!"); } - } - if (Button("Go to Actor", ButtonOptions().Color(THEME_COLOR))) { - Player* player = GET_PLAYER(gPlayState); - Math_Vec3f_Copy(&player->actor.world.pos, &display->world.pos); - Math_Vec3f_Copy(&player->actor.home.pos, &player->actor.world.pos); + DrawGroupWithBorder( + [&]() { + ImGui::Text("flags"); + UIWidgets::DrawFlagArray32("flags", display->flags); + }, + "flags"); + + ImGui::SameLine(); + + DrawGroupWithBorder( + [&]() { + ImGui::Text("bgCheckFlags"); + UIWidgets::DrawFlagArray16("bgCheckFlags", display->bgCheckFlags); + }, + "bgCheckFlags"); + + if (Button("Go to Actor", ButtonOptions().Color(THEME_COLOR))) { + Player* player = GET_PLAYER(gPlayState); + Math_Vec3f_Copy(&player->actor.world.pos, &display->world.pos); + Math_Vec3f_Copy(&player->actor.home.pos, &player->actor.world.pos); + } + } else { + ImGui::Text("Select an actor to display information."); } if (Button("Fetch from Target", @@ -1081,34 +1038,28 @@ void ActorViewerWindow::DrawElement() { .Color(THEME_COLOR) .Tooltip("Grabs actor with target arrow above it. You might need C-Up for enemies"))) { Player* player = GET_PLAYER(gPlayState); - fetch = player->talkActor; - if (fetch != NULL) { - display = fetch; - category = fetch->category; + if (player->talkActor != NULL) { + display = player->talkActor; + category = display->category; PopulateActorDropdown(category, list); - rm = TARGET; } } if (Button("Fetch from Held", ButtonOptions().Color(THEME_COLOR).Tooltip("Grabs actor that Link is holding"))) { Player* player = GET_PLAYER(gPlayState); - fetch = player->heldActor; - if (fetch != NULL) { - display = fetch; - category = fetch->category; + if (player->heldActor != NULL) { + display = player->heldActor; + category = display->category; PopulateActorDropdown(category, list); - rm = HELD; } } if (Button("Fetch from Interaction", ButtonOptions().Color(THEME_COLOR).Tooltip("Grabs actor from \"interaction range\""))) { Player* player = GET_PLAYER(gPlayState); - fetch = player->interactRangeActor; - if (fetch != NULL) { - display = fetch; - category = fetch->category; + if (player->interactRangeActor != NULL) { + display = player->interactRangeActor; + category = display->category; PopulateActorDropdown(category, list); - rm = INTERACT; } } @@ -1119,21 +1070,22 @@ void ActorViewerWindow::DrawElement() { // ImGui::PushItemWidth(ImGui::GetFontSize() * 10); if (InputString("Search Actor", &searchString, InputOptions().Color(THEME_COLOR))) { - actors = GetActorsWithDescriptionContainingString(searchString); + actorSearchResults = GetActorsWithDescriptionContainingString(searchString); currentSelectedInDropdown = -1; } - if (!SohUtils::IsStringEmpty(searchString) && !actors.empty()) { - std::string preview = currentSelectedInDropdown == -1 - ? "Please Select" - : ActorDB::Instance->RetrieveEntry(actors[currentSelectedInDropdown]).desc; + if (!SohUtils::IsStringEmpty(searchString) && !actorSearchResults.empty()) { + std::string preview = + currentSelectedInDropdown == -1 + ? "Please Select" + : ActorDB::Instance->RetrieveEntry(actorSearchResults[currentSelectedInDropdown]).desc; PushStyleCombobox(THEME_COLOR); if (ImGui::BeginCombo("Results", preview.c_str())) { - for (u8 i = 0; i < actors.size(); i++) { - if (ImGui::Selectable(ActorDB::Instance->RetrieveEntry(actors[i]).desc.c_str(), + for (u8 i = 0; i < actorSearchResults.size(); i++) { + if (ImGui::Selectable(ActorDB::Instance->RetrieveEntry(actorSearchResults[i]).desc.c_str(), i == currentSelectedInDropdown)) { currentSelectedInDropdown = i; - newActor.id = actors[i]; + newActor.id = actorSearchResults[i]; } } ImGui::EndCombo(); @@ -1237,20 +1189,40 @@ void ActorViewerWindow::DrawElement() { PopStyleHeader(); } else { ImGui::Text("Global Context needed for actor info!"); - if (needs_reset) { - fetch = nullptr; - actor = category = 0; - filler = "Please Select"; - list.clear(); - needs_reset = false; - searchString = ""; - currentSelectedInDropdown = -1; - actors.clear(); - } } ImGui::EndDisabled(); } +void ActorViewerWindow::InitElement() { + GameInteractor::Instance->RegisterGameHook([this](void* refActor) { + Actor* actor = static_cast(refActor); + + // Reload actor list if the new actor belongs to the selected category + if (category == actor->category) { + PopulateActorDropdown(actor->category, list); + } + }); + + GameInteractor::Instance->RegisterGameHook([this](void* refActor) { + Actor* actor = static_cast(refActor); + + // If the actor belongs to the selected category, we need to manually remove it, as it has not been removed from + // the global actor array yet + if (category == actor->category) { + list.erase(std::remove(list.begin(), list.end(), actor), list.end()); + } + if (display == actor) { + display = nullptr; + } + }); + + GameInteractor::Instance->RegisterGameHook([this](int16_t sceneNum) { + display = nullptr; + category = ACTORCAT_SWITCH; + list.clear(); + }); +} + void ActorViewer_RegisterNameTagHooks() { COND_HOOK(OnActorInit, CVAR_ACTOR_NAME_TAGS_ENABLED, [](void* actor) { ActorViewer_AddTagForActor(static_cast(actor)); }); diff --git a/soh/soh/Enhancements/debugger/actorViewer.h b/soh/soh/Enhancements/debugger/actorViewer.h index 709380544..07c7e5e24 100644 --- a/soh/soh/Enhancements/debugger/actorViewer.h +++ b/soh/soh/Enhancements/debugger/actorViewer.h @@ -2,11 +2,20 @@ #include +#include "z64actor.h" + +#include + class ActorViewerWindow final : public Ship::GuiWindow { public: using GuiWindow::GuiWindow; void DrawElement() override; - void InitElement() override{}; + void InitElement() override; void UpdateElement() override{}; + + private: + Actor* display = nullptr; + int category = ACTORCAT_SWITCH; + std::vector list; }; diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h index 10655cc35..8d5a8f4e5 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h @@ -27,6 +27,7 @@ DEFINE_HOOK(OnOcarinaSongAction, ()); DEFINE_HOOK(OnCuccoOrChickenHatch, ()); DEFINE_HOOK(OnShopSlotChange, (uint8_t cursorIndex, int16_t price)); DEFINE_HOOK(OnActorInit, (void* actor)); +DEFINE_HOOK(OnActorSpawn, (void* actor)); DEFINE_HOOK(OnActorUpdate, (void* actor)); DEFINE_HOOK(OnActorKill, (void* actor)); DEFINE_HOOK(OnActorDestroy, (void* actor)); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp index b31c38b48..120ca4e99 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp @@ -108,6 +108,13 @@ void GameInteractor_ExecuteOnActorInit(void* actor) { GameInteractor::Instance->ExecuteHooksForFilter(actor); } +void GameInteractor_ExecuteOnActorSpawn(void* actor) { + GameInteractor::Instance->ExecuteHooks(actor); + GameInteractor::Instance->ExecuteHooksForID(((Actor*)actor)->id, actor); + GameInteractor::Instance->ExecuteHooksForPtr((uintptr_t)actor, actor); + GameInteractor::Instance->ExecuteHooksForFilter(actor); +} + void GameInteractor_ExecuteOnActorUpdate(void* actor) { GameInteractor::Instance->ExecuteHooks(actor); GameInteractor::Instance->ExecuteHooksForID(((Actor*)actor)->id, actor); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h index a8133820b..9bb47868f 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h @@ -29,6 +29,7 @@ void GameInteractor_ExecuteOnSetDoAction(uint16_t action); void GameInteractor_ExecuteOnOcarinaSongAction(); void GameInteractor_ExecuteOnCuccoOrChickenHatch(); void GameInteractor_ExecuteOnActorInit(void* actor); +void GameInteractor_ExecuteOnActorSpawn(void* actor); void GameInteractor_ExecuteOnActorUpdate(void* actor); void GameInteractor_ExecuteOnActorKill(void* actor); void GameInteractor_ExecuteOnActorDestroy(void* actor); diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index b70408d8f..0b9d20bc5 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -3401,6 +3401,8 @@ Actor* Actor_Spawn(ActorContext* actorCtx, PlayState* play, s16 actorId, f32 pos Actor_Init(actor, play); gSegments[6] = temp; + GameInteractor_ExecuteOnActorSpawn(actor); + return actor; } From 4e8e6d2313bc0a09a86c0a5d6573a985d33998c8 Mon Sep 17 00:00:00 2001 From: Jordan Longstaff Date: Fri, 23 May 2025 23:29:43 -0400 Subject: [PATCH 08/67] Move Rupee Dash Mode hook to its own file (#5178) * Move Rupee Dash Mode hook to its own file * Rename initFunc --- soh/soh/Enhancements/ExtraModes/RupeeDash.cpp | 42 +++++++++++++++++++ soh/soh/Enhancements/mods.cpp | 26 ------------ 2 files changed, 42 insertions(+), 26 deletions(-) create mode 100644 soh/soh/Enhancements/ExtraModes/RupeeDash.cpp diff --git a/soh/soh/Enhancements/ExtraModes/RupeeDash.cpp b/soh/soh/Enhancements/ExtraModes/RupeeDash.cpp new file mode 100644 index 000000000..3e7660b84 --- /dev/null +++ b/soh/soh/Enhancements/ExtraModes/RupeeDash.cpp @@ -0,0 +1,42 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include "functions.h" +#include "macros.h" +#include "variables.h" + +extern "C" PlayState* gPlayState; + +static constexpr int32_t CVAR_RUPEE_DASH_DEFAULT = 0; +#define CVAR_RUPEE_DASH_NAME CVAR_ENHANCEMENT("RupeeDash") +#define CVAR_RUPEE_DASH_VALUE CVarGetInteger(CVAR_RUPEE_DASH_NAME, CVAR_RUPEE_DASH_DEFAULT) + +static constexpr int32_t CVAR_RUPEE_DASH_INTERVAL_DEFAULT = 5; +#define CVAR_RUPEE_DASH_INTERVAL_NAME CVAR_ENHANCEMENT("RupeeDashInterval") +#define CVAR_RUPEE_DASH_INTERVAL_TIME \ + CVarGetInteger(CVAR_RUPEE_DASH_INTERVAL_NAME, CVAR_RUPEE_DASH_INTERVAL_DEFAULT) * 20 + +void UpdateRupeeDash() { + // Initialize Timer + static uint16_t rupeeDashTimer = 0; + + // Did time change by DashInterval? + if (rupeeDashTimer < CVAR_RUPEE_DASH_INTERVAL_TIME) { + rupeeDashTimer++; + return; + } + + rupeeDashTimer = 0; + if (gSaveContext.rupees > 0) { + uint16_t walletSize = (CUR_UPG_VALUE(UPG_WALLET) + 1) * -1; + Rupees_ChangeBy(walletSize); + } else { + Health_ChangeBy(gPlayState, -16); + } +} + +void RegisterRupeeDash() { + COND_HOOK(OnPlayerUpdate, CVAR_RUPEE_DASH_VALUE, UpdateRupeeDash); +} + +static RegisterShipInitFunc initFunc_RupeeDash(RegisterRupeeDash, { CVAR_RUPEE_DASH_NAME }); diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 2e302ea1d..64c4265d0 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -134,31 +134,6 @@ void RegisterOcarinaTimeTravel() { }); } -void RegisterRupeeDash() { - GameInteractor::Instance->RegisterGameHook([]() { - if (!CVarGetInteger(CVAR_ENHANCEMENT("RupeeDash"), 0)) { - return; - } - - // Initialize Timer - static uint16_t rupeeDashTimer = 0; - uint16_t rdmTime = CVarGetInteger(CVAR_ENHANCEMENT("RupeeDashInterval"), 5) * 20; - - // Did time change by DashInterval? - if (rupeeDashTimer >= rdmTime) { - rupeeDashTimer = 0; - if (gSaveContext.rupees > 0) { - uint16_t walletSize = (CUR_UPG_VALUE(UPG_WALLET) + 1) * -1; - Rupees_ChangeBy(walletSize); - } else { - Health_ChangeBy(gPlayState, -16); - } - } else { - rupeeDashTimer++; - } - }); -} - static bool hasAffectedHealth = false; void UpdatePermanentHeartLossState() { if (!GameInteractor::IsSaveLoaded()) @@ -982,7 +957,6 @@ void InitMods() { TimeSavers_Register(); RegisterTTS(); RegisterOcarinaTimeTravel(); - RegisterRupeeDash(); RegisterPermanentHeartLoss(); RegisterDeleteFileOnDeath(); RegisterHyperBosses(); From de96f3cd0a7f6d6adf4bf7e20719f0ef7b843843 Mon Sep 17 00:00:00 2001 From: xxAtrain223 Date: Sat, 24 May 2025 12:39:53 -0500 Subject: [PATCH 09/67] Typo Fixes (#5533) * Fixed a couple typos. * Ran clang format. --- soh/soh/Enhancements/debugconsole.cpp | 12 ++++++------ soh/soh/Enhancements/randomizer/ShuffleCrates.cpp | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/soh/soh/Enhancements/debugconsole.cpp b/soh/soh/Enhancements/debugconsole.cpp index 32fc8e72f..d25c3cfff 100644 --- a/soh/soh/Enhancements/debugconsole.cpp +++ b/soh/soh/Enhancements/debugconsole.cpp @@ -1451,8 +1451,8 @@ static bool SfxHandler(std::shared_ptr Console, const std::vector return 0; } -static bool AvailabeChecksProcessUndiscoveredExitsHandler(std::shared_ptr Console, - const std::vector& args, std::string* output) { +static bool AvailableChecksProcessUndiscoveredExitsHandler(std::shared_ptr Console, + const std::vector& args, std::string* output) { const auto& logic = Rando::Context::GetInstance()->GetLogic(); bool enabled = false; @@ -1478,8 +1478,8 @@ static bool AvailabeChecksProcessUndiscoveredExitsHandler(std::shared_ptr Console, - const std::vector& args, std::string* output) { +static bool AvailableChecksRecalculateHandler(std::shared_ptr Console, + const std::vector& args, std::string* output) { RandomizerRegion startingRegion = RR_ROOT; if (args.size() > 1) { @@ -1758,11 +1758,11 @@ void DebugConsole_Init(void) { { "group_name", Ship::ArgumentType::TEXT, true }, } }); - CMD_REGISTER("acpue", { AvailabeChecksProcessUndiscoveredExitsHandler, + CMD_REGISTER("acpue", { AvailableChecksProcessUndiscoveredExitsHandler, "Available Checks - Process Undiscovered Exits", { { "enable", Ship::ArgumentType::NUMBER, true } } }); - CMD_REGISTER("acr", { AvailabeChecksRecalculateHandler, + CMD_REGISTER("acr", { AvailableChecksRecalculateHandler, "Available Checks - Recalculate", { { "starting_region", Ship::ArgumentType::NUMBER, true }, diff --git a/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp b/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp index 3cb341980..fa88d455b 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp @@ -362,7 +362,7 @@ void Rando::StaticData::RegisterCrateLocations() { locationTable[RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1] = Location::Crate(RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-389, 1518), "Near Impas House Adult Crate 1", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1)); locationTable[RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-389, 1470), "Near Impas House Adult Crate 2", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2)); locationTable[RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1] = Location::Crate(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-433, -401), "Near Bazaar Adult Crate 1", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_1)); - locationTable[RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-489, -424), "Near Bazaar Adult Crate 2`", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_2)); + locationTable[RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-489, -424), "Near Bazaar Adult Crate 2", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_2)); locationTable[RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE] = Location::Crate(RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-724, 871), "Behind GS House Adult Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_BEHIND_GS_HOUSE_ADULT_CRATE)); locationTable[RC_KAK_NEAR_GY_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_GY_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1732, 1366), "Near Graveyard Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GY_CHILD_CRATE)); locationTable[RC_KAK_NEAR_WINDMILL_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_WINDMILL_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1170, 601), "Near Windmill Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_WINDMILL_CHILD_CRATE)); From fa6f45bde53e4df1bf274635f980342ed3d28c59 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Tue, 27 May 2025 13:19:14 -0700 Subject: [PATCH 10/67] Fix Preset List with no customs available (#5535) * Surround preset file processing with the fs::exists check rather than returning early. * clang --- soh/soh/Enhancements/Presets/Presets.cpp | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/soh/soh/Enhancements/Presets/Presets.cpp b/soh/soh/Enhancements/Presets/Presets.cpp index b5c364251..d50b45360 100644 --- a/soh/soh/Enhancements/Presets/Presets.cpp +++ b/soh/soh/Enhancements/Presets/Presets.cpp @@ -193,23 +193,22 @@ void ParsePreset(nlohmann::json& json, std::string name) { } void LoadPresets() { - if (!fs::exists(presetFolder)) { - return; - } if (!presets.empty()) { presets.clear(); } - for (auto const& preset : fs::directory_iterator(presetFolder)) { - std::ifstream ifs(preset.path()); + if (fs::exists(presetFolder)) { + for (auto const& preset : fs::directory_iterator(presetFolder)) { + std::ifstream ifs(preset.path()); - auto json = nlohmann::json::parse(ifs); - if (!json.contains("presetName")) { - spdlog::error(fmt::format("Attempted to load file {} as a preset, but was not a preset file.", - preset.path().filename().string())); - } else { - ParsePreset(json, preset.path().filename().stem().string()); + auto json = nlohmann::json::parse(ifs); + if (!json.contains("presetName")) { + spdlog::error(fmt::format("Attempted to load file {} as a preset, but was not a preset file.", + preset.path().filename().string())); + } else { + ParsePreset(json, preset.path().filename().stem().string()); + } + ifs.close(); } - ifs.close(); } auto initData = std::make_shared(); initData->Format = RESOURCE_FORMAT_BINARY; From f0e36c2694fe004cbadaa45d9149c8b67c8eba88 Mon Sep 17 00:00:00 2001 From: Pepper0ni <93387759+Pepper0ni@users.noreply.github.com> Date: Tue, 27 May 2025 21:19:30 +0100 Subject: [PATCH 11/67] Fix failure to assign areas to regions on initial spoiler load (#5540) --- soh/soh/Enhancements/randomizer/3drando/fill.hpp | 1 + soh/soh/Enhancements/randomizer/context.cpp | 2 +- soh/soh/Enhancements/randomizer/entrance.cpp | 4 ++++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.hpp b/soh/soh/Enhancements/randomizer/3drando/fill.hpp index 67043952f..e8124c0dc 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.hpp @@ -56,6 +56,7 @@ struct GetAccessibleLocationsStruct { void ClearProgress(); void VanillaFill(); int Fill(); +void SetAreas(); std::vector GetEmptyLocations(std::vector allowedLocations); diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index 7178dd18d..550cd0e93 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -400,9 +400,9 @@ void Context::ParseSpoiler(const char* spoilerFileName) { ParseHashIconIndexesJson(spoilerFileJson); Rando::Settings::GetInstance()->ParseJson(spoilerFileJson); ParseItemLocationsJson(spoilerFileJson); - ParseHintJson(spoilerFileJson); ParseTricksJson(spoilerFileJson); mEntranceShuffler->ParseJson(spoilerFileJson); + ParseHintJson(spoilerFileJson); mDungeons->ParseJson(spoilerFileJson); mTrials->ParseJson(spoilerFileJson); mSpoilerLoaded = true; diff --git a/soh/soh/Enhancements/randomizer/entrance.cpp b/soh/soh/Enhancements/randomizer/entrance.cpp index 45cde2f6f..ea9b80ee3 100644 --- a/soh/soh/Enhancements/randomizer/entrance.cpp +++ b/soh/soh/Enhancements/randomizer/entrance.cpp @@ -1666,6 +1666,10 @@ void EntranceShuffler::ParseJson(nlohmann::json spoilerFileJson) { } } } catch (const std::exception& e) { throw e; } + // We may need to reset more things here or elsewhere in spoiler loading + RegionTable_Init(); + ApplyEntranceOverrides(); + SetAreas(); } void EntranceShuffler::ApplyEntranceOverrides() { From fc10e36cdb72e39235852d059580761ae78a0954 Mon Sep 17 00:00:00 2001 From: Hunter Marshall Date: Tue, 27 May 2025 16:34:36 -0500 Subject: [PATCH 12/67] Fix minor mistakes in region table (#5545) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix minor mistakes in region table * Update soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp Co-authored-by: Philip DubΓ© --------- Co-authored-by: Philip DubΓ© --- .../randomizer/location_access/dungeons/dodongos_cavern.cpp | 5 +++-- .../randomizer/location_access/dungeons/fire_temple.cpp | 2 +- .../randomizer/location_access/dungeons/forest_temple.cpp | 2 +- .../location_access/dungeons/gerudo_training_ground.cpp | 2 +- .../randomizer/location_access/dungeons/ice_cavern.cpp | 2 +- .../randomizer/location_access/dungeons/spirit_temple.cpp | 6 +++--- .../randomizer/location_access/dungeons/water_temple.cpp | 6 +++--- .../randomizer/location_access/overworld/kakariko.cpp | 2 +- 8 files changed, 14 insertions(+), 13 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp index 9488f2d82..bffc6c290 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp @@ -268,6 +268,7 @@ void RegionTable_Init_DodongosCavern() { LOCATION(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, logic->CanStunDeku()), }, { //Exits + Entrance(RR_DODONGOS_CAVERN_MQ_BEGINNING, []{return true;}), Entrance(RR_DODONGOS_CAVERN_MQ_GOSSIP_STONE, []{return Here(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return logic->CanBreakMudWalls() || logic->HasItem(RG_GORONS_BRACELET);});}), Entrance(RR_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE, []{return Here(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return logic->BlastOrSmash() || logic->HasItem(RG_GORONS_BRACELET);});}), Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER, []{return Here(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return logic->BlastOrSmash() || logic->HasItem(RG_GORONS_BRACELET);});}), @@ -386,7 +387,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS, []{return logic->CanUse(RG_STICKS) && logic->HasItem(RG_GORONS_BRACELET);}), //Implies access to RR_DODONGOS_CAVERN_MQ_BIG_BLOCK_ROOM from here }); - areaTable[RR_DODONGOS_CAVERN_MQ_BIG_BLOCK_ROOM] = Region("Dodongos Cavern MQ Torch Puzzle Lower", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_BIG_BLOCK_ROOM] = Region("Dodongos Cavern MQ Big Block Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_1, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_2, logic->CanBreakPots()), @@ -426,7 +427,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_TWO_FIRES_ROOM, []{return Here(RR_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS, []{return logic->CanKillEnemy(RE_LIZALFOS);});}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_TWO_FIRES_ROOM] = Region("Dodongos Cavern MQ Before Upper Lizalfos", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_TWO_FIRES_ROOM] = Region("Dodongos Cavern MQ Two Fires Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, logic->CanBreakPots()), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp index 2e1a6ef14..978f5eabf 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp @@ -701,7 +701,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_UPPER_FLARE_DANCER, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_MQ_UPPER_FLARE_DANCER] = Region("Fire Temple MQ North Fire Maze", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_UPPER_FLARE_DANCER] = Region("Fire Temple MQ Upper Flare Dancer", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY, logic->CanKillEnemy(RE_FLARE_DANCER)), }, { diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp index c8d80f98d..3deacb042 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp @@ -481,7 +481,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_FALLING_ROOM, []{return logic->CanUse(RG_SONG_OF_TIME);}), }); - areaTable[RR_FOREST_TEMPLE_MQ_JOELLE_ROOM] = Region("Forest Temple MQ Joelle room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_JOELLE_ROOM] = Region("Forest Temple MQ Joelle Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->ForestTempleJoelle, []{return logic->CanUse(RG_FAIRY_BOW);}), }, { diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp index 5466c598c..f1a0ebee7 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp @@ -149,7 +149,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_MAZE_CENTER, []{return logic->SmallKeys(RR_GERUDO_TRAINING_GROUND, 3);}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAZE_CENTER] = Region("Gerudo Training Ground MQ Center", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAZE_CENTER] = Region("Gerudo Training Ground MQ Maze Center", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->MQGTGMazeSwitch, []{return logic->CanUse(RG_MEGATON_HAMMER);}), }, diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp index 7aa2066ca..20ff9b1e1 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp @@ -84,7 +84,7 @@ void RegionTable_Init_IceCavern() { //Exits //the switch for the glass blocking the entrance is linked to the switch that controls the glass around the skulltulla in RR_ICE_CAVERN_MQ_SCARECROW_ROOM //if you clear the ice, you can hit it with a pot from here. - Entrance(RR_ICE_CAVERN_BEGINNING, []{return logic->BlueFire();}), + Entrance(RR_ICE_CAVERN_MQ_BEGINNING, []{return logic->BlueFire();}), Entrance(RR_ICE_CAVERN_MQ_MAP_ROOM, []{return Here(RR_ICE_CAVERN_MQ_BEGINNING, []{return logic->CanKillEnemy(RE_WHITE_WOLFOS) && logic->CanKillEnemy(RE_FREEZARD);});}), Entrance(RR_ICE_CAVERN_MQ_COMPASS_ROOM, []{return logic->IsAdult && logic->BlueFire();}), Entrance(RR_ICE_CAVERN_MQ_SCARECROW_ROOM, []{return logic->BlueFire();}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp index 72aa9974b..7589c7b74 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp @@ -194,13 +194,13 @@ void RegionTable_Init_SpiritTemple() { }); // Room to store the 2 pots in to handle glitch logic going backwards around the loop later - areaTable[RR_SPIRIT_TEMPLE_MQ_1F_GIBDO_ROOM_NORTH] = Region("Spirit Temple MQ Gibdo Room North", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_1F_GIBDO_ROOM_NORTH] = Region("Spirit Temple MQ 1F Gibdo Room North", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1, logic->CanBreakPots()), LOCATION(RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2, logic->CanBreakPots()), }, {}); - areaTable[RR_SPIRIT_TEMPLE_MQ_TURNTABLE_ROOM] = Region("Spirit Temple Turntable Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SPIRIT_TEMPLE_MQ_TURNTABLE_ROOM] = Region("Spirit Temple MQ Turntable Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, { //Events //For non-fairy pot items, you can also get them with rang without killing the stalfos EventAccess(&logic->FairyPot, []{return Here(RR_SPIRIT_TEMPLE_MQ_TURNTABLE_ROOM, []{return logic->CanKillEnemy(RE_STALFOS);});}), @@ -315,7 +315,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_WEST_IRON_KNUCKLE, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 7);}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_WEST_IRON_KNUCKLE] = Region("Spirit Temple MQ East Iron Knuckle", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_WEST_IRON_KNUCKLE] = Region("Spirit Temple MQ West Iron Knuckle", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 7);}), Entrance(RR_SPIRIT_TEMPLE_MQ_SILVER_GAUNTLETS_HAND, []{return logic->CanKillEnemy(RE_IRON_KNUCKLE);}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp index ccbc2f688..61fb0962d 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp @@ -362,7 +362,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_BOSS_DOOR, []{return logic->CanUse(RG_LONGSHOT) || logic->CanUse(RG_ICE_ARROWS) || logic->CanUse(RG_NAYRUS_LOVE);}), }); - areaTable[RR_WATER_TEMPLE_MQ_BOSS_DOOR] = Region("Water Temple MQ Main", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_BOSS_DOOR] = Region("Water Temple MQ Boss Door", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_MQ_3F_NORTH_LEDGE, []{return logic->CanUse(RG_ICE_ARROWS) || logic->TakeDamage();}), Entrance(RR_WATER_TEMPLE_BOSS_ENTRYWAY, []{return true;}), @@ -507,7 +507,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_BEHIND_BLUE_SWITCH_3F, []{return logic->CanUse(RG_LONGSHOT);}), }); - areaTable[RR_WATER_TEMPLE_MQ_BEHIND_BLUE_SWITCH_3F] = Region("Water Temple MQ Behind Blue Switch 2F", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_BEHIND_BLUE_SWITCH_3F] = Region("Water Temple MQ Behind Blue Switch 3F", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), }, { @@ -552,7 +552,7 @@ void RegionTable_Init_WaterTemple() { }, {}); //This room exists to hold the wonderitems that drop from the emblems here. Specifically this assumes you are standing on the final ledge - areaTable[RR_WATER_TEMPLE_MQ_WATERFALL] = Region("Water Temple Waterfall", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_WATERFALL] = Region("Water Temple MQ Waterfall", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_MQ_3F_CENTRAL, []{return logic->SmallKeys(RR_WATER_TEMPLE, 1) && logic->CanUse(RG_LONGSHOT);}), Entrance(RR_WATER_TEMPLE_MQ_STALFOS_PIT, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp index 777e29050..3e84bb72a 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp @@ -265,7 +265,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_DEATH_MOUNTAIN_TRAIL, []{return true;}), }); - areaTable[RR_KAK_WELL] = Region("Kak Behind Gate", "Kakariko Village", {RA_KAKARIKO_VILLAGE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_KAK_WELL] = Region("Kak Well", "Kakariko Village", {RA_KAKARIKO_VILLAGE}, NO_DAY_NIGHT_CYCLE, {}, {}, { //Exits Entrance(RR_KAKARIKO_VILLAGE, []{return logic->IsAdult || logic->HasItem(RG_BRONZE_SCALE) || logic->DrainWell;}), Entrance(RR_BOTTOM_OF_THE_WELL_ENTRYWAY, []{return logic->IsChild || (logic->DrainWell && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).IsNot(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF));}), From 2b360d4bbe73ecdef32adec479ad74c87caf8204 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Thu, 29 May 2025 14:06:53 +0000 Subject: [PATCH 13/67] Rebottle Blue Fire (#5375) * Rebottle Blue Fire * hookify --- soh/soh/Enhancements/RebottleBlueFire.cpp | 25 +++++++++++++++++++++++ soh/soh/SohGui/SohMenuEnhancements.cpp | 5 +++++ 2 files changed, 30 insertions(+) create mode 100644 soh/soh/Enhancements/RebottleBlueFire.cpp diff --git a/soh/soh/Enhancements/RebottleBlueFire.cpp b/soh/soh/Enhancements/RebottleBlueFire.cpp new file mode 100644 index 000000000..8ca11e4e6 --- /dev/null +++ b/soh/soh/Enhancements/RebottleBlueFire.cpp @@ -0,0 +1,25 @@ +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "src/overlays/actors/ovl_En_Ice_Hono/z_en_ice_hono.h" +void EnIceHono_CapturableFlame(EnIceHono* thisx, PlayState* play); +u32 EnIceHono_InBottleRange(EnIceHono* thisx, PlayState* play); +} + +extern PlayState* gPlayState; + +void OnEnIceHonoUpdate(void* actor) { + EnIceHono* thisx = (EnIceHono*)actor; + if (thisx->actionFunc != EnIceHono_CapturableFlame && EnIceHono_InBottleRange(thisx, gPlayState)) { + // GI_MAX in this case allows the player to catch the actor in a bottle + Actor_OfferGetItem(&thisx->actor, gPlayState, GI_MAX, 60.0f, 100.0f); + } +} + +void RegisterRebottleBlueFire() { + COND_ID_HOOK(OnActorUpdate, ACTOR_EN_ICE_HONO, CVarGetInteger(CVAR_ENHANCEMENT("RebottleBlueFire"), 0), + OnEnIceHonoUpdate); +} + +static RegisterShipInitFunc initFunc(RegisterRebottleBlueFire, { CVAR_ENHANCEMENT("RebottleBlueFire") }); \ No newline at end of file diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index 4aaf1fb67..de3bb6be8 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -792,6 +792,11 @@ void SohMenu::AddMenuEnhancements() { .CVar(CVAR_ENHANCEMENT("FastFarores")) .Options(CheckboxOptions().Tooltip("Greatly decreases cast time of Farore's Wind magic spell.")); + AddWidget(path, "Bottles", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Rebottle Blue Fire", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("RebottleBlueFire")) + .Options(CheckboxOptions().Tooltip("Blue Fire dropped from bottle can be bottled.")); + // Fixes path.sidebarName = "Fixes"; AddSidebarEntry("Enhancements", path.sidebarName, 3); From 40da9997c59436d9acc52ba8a86b6c77a050b913 Mon Sep 17 00:00:00 2001 From: Pepe20129 <72659707+Pepe20129@users.noreply.github.com> Date: Thu, 29 May 2025 16:51:35 +0200 Subject: [PATCH 14/67] Fix some dark link issues (#5532) --- soh/soh/Enhancements/enemyrandomizer.cpp | 49 ++++++++++++++++++- .../vanilla-behavior/GIVanillaBehavior.h | 32 ++++++++++++ soh/src/overlays/actors/ovl_En_Rr/z_en_rr.c | 2 +- .../actors/ovl_En_Torch2/z_en_torch2.c | 2 +- .../actors/ovl_player_actor/z_player.c | 20 ++++++-- 5 files changed, 97 insertions(+), 8 deletions(-) diff --git a/soh/soh/Enhancements/enemyrandomizer.cpp b/soh/soh/Enhancements/enemyrandomizer.cpp index bdb259719..682ef026c 100644 --- a/soh/soh/Enhancements/enemyrandomizer.cpp +++ b/soh/soh/Enhancements/enemyrandomizer.cpp @@ -11,8 +11,13 @@ extern "C" { #include +#include "src/overlays/actors/ovl_En_Rr/z_en_rr.h" } +#define CVAR_ENEMY_RANDOMIZER_NAME CVAR_ENHANCEMENT("RandomizedEnemies") +#define CVAR_ENEMY_RANDOMIZER_DEFAULT ENEMY_RANDOMIZER_OFF +#define CVAR_ENEMY_RANDOMIZER_VALUE CVarGetInteger(CVAR_ENEMY_RANDOMIZER_NAME, CVAR_ENEMY_RANDOMIZER_DEFAULT) + const char* enemyCVarList[] = { CVAR_ENHANCEMENT("RandomizedEnemyList.Armos"), CVAR_ENHANCEMENT("RandomizedEnemyList.Arwing"), CVAR_ENHANCEMENT("RandomizedEnemyList.BabyDodongo"), CVAR_ENHANCEMENT("RandomizedEnemyList.Bari"), @@ -339,7 +344,7 @@ EnemyEntry GetRandomizedEnemyEntry(uint32_t seed, PlayState* play) { if (filteredEnemyList.size() == 0) { filteredEnemyList = selectedEnemyList; } - if (CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), ENEMY_RANDOMIZER_OFF) == ENEMY_RANDOMIZER_RANDOM_SEEDED) { + if (CVAR_ENEMY_RANDOMIZER_VALUE == ENEMY_RANDOMIZER_RANDOM_SEEDED) { uint32_t finalSeed = seed + (IS_RANDO ? Rando::Context::GetInstance()->GetSeed() : gSaveContext.ship.stats.fileCreatedAt); Random_Init(finalSeed); @@ -533,3 +538,45 @@ bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy) { return 1; } } + +void RegisterEnemyRandomizer() { + // prevent dark link from triggering a voidout + COND_VB_SHOULD(VB_TRIGGER_VOIDOUT, CVAR_ENEMY_RANDOMIZER_VALUE != CVAR_ENEMY_RANDOMIZER_DEFAULT, { + Actor* actor = va_arg(args, Actor*); + + if (actor->category != ACTORCAT_PLAYER) { + *should = false; + Actor_Kill(actor); + } + }); + + // prevent dark link dealing fall damage to the player + COND_VB_SHOULD(VB_RECIEVE_FALL_DAMAGE, CVAR_ENEMY_RANDOMIZER_VALUE != CVAR_ENEMY_RANDOMIZER_DEFAULT, { + Actor* actor = va_arg(args, Actor*); + + if (actor->category != ACTORCAT_PLAYER) { + *should = false; + } + }); + + // prevent dark link from interfering with HESS/recoil/etc when at more than 100 away from him + COND_VB_SHOULD(VB_TORCH2_HANDLE_CLANKING, CVAR_ENEMY_RANDOMIZER_VALUE != CVAR_ENEMY_RANDOMIZER_DEFAULT, { + Actor* darkLink = va_arg(args, Actor*); + + if (darkLink->xzDistToPlayer > 100.0f) { + *should = false; + } + }); + + // prevent dark link from being grabbed by like likes and therefore grabbing the player + COND_VB_SHOULD(VB_LIKE_LIKE_GRAB_PLAYER, CVAR_ENEMY_RANDOMIZER_VALUE != CVAR_ENEMY_RANDOMIZER_DEFAULT, { + EnRr* likeLike = va_arg(args, EnRr*); + + if (!(likeLike->collider1.base.oc != NULL && likeLike->collider1.base.oc->category == ACTORCAT_PLAYER) && + !(likeLike->collider2.base.oc != NULL && likeLike->collider2.base.oc->category == ACTORCAT_PLAYER)) { + *should = false; + } + }); +} + +static RegisterShipInitFunc initFunc(RegisterEnemyRandomizer, { CVAR_ENEMY_RANDOMIZER_NAME }); \ No newline at end of file diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index 223001711..e624515b4 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -2011,6 +2011,38 @@ typedef enum { // #### `args` // - `*EnWonderTalk2` VB_WONDER_TALK, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*Actor` + VB_TRIGGER_VOIDOUT, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*Actor` + VB_TORCH2_HANDLE_CLANKING, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*Actor` + VB_RECIEVE_FALL_DAMAGE, + + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnRr` + VB_LIKE_LIKE_GRAB_PLAYER, } GIVanillaBehavior; #endif diff --git a/soh/src/overlays/actors/ovl_En_Rr/z_en_rr.c b/soh/src/overlays/actors/ovl_En_Rr/z_en_rr.c index 3797adafe..831e11b8c 100644 --- a/soh/src/overlays/actors/ovl_En_Rr/z_en_rr.c +++ b/soh/src/overlays/actors/ovl_En_Rr/z_en_rr.c @@ -507,7 +507,7 @@ void EnRr_CollisionCheck(EnRr* this, PlayState* play) { this->collider2.base.ocFlags1 &= ~OC1_HIT; // "catch" osSyncPrintf(VT_FGCOL(GREEN) "キャッチ(%d)!!" VT_RST "\n", this->frameCount); - if (play->grabPlayer(play, player)) { + if (GameInteractor_Should(VB_LIKE_LIKE_GRAB_PLAYER, true, this) && play->grabPlayer(play, player)) { player->actor.parent = &this->actor; this->stopScroll = false; EnRr_SetupGrabPlayer(this, player); diff --git a/soh/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c b/soh/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c index 4925e73cb..ceca597df 100644 --- a/soh/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c +++ b/soh/src/overlays/actors/ovl_En_Torch2/z_en_torch2.c @@ -706,7 +706,7 @@ void EnTorch2_Update(Actor* thisx, PlayState* play2) { sStaggerCount = 0; } } - if (player->linearVelocity == -18.0f) { + if (GameInteractor_Should(VB_TORCH2_HANDLE_CLANKING, player->linearVelocity == -18.0f, this)) { if (this->actor.xzDistToPlayer > 80.0f) { player->linearVelocity = 1.2f; } else if (this->actor.xzDistToPlayer < 70.0f) { diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 6638893f5..b2ebcbb88 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -4764,7 +4764,9 @@ s32 func_808382DC(Player* this, PlayState* play) { gSaveContext.respawn[RESPAWN_MODE_DOWN].yaw = respawnInfo->yaw; } - Play_TriggerVoidOut(play); + if (GameInteractor_Should(VB_TRIGGER_VOIDOUT, true, this)) { + Play_TriggerVoidOut(play); + } } Player_PlayVoiceSfx(this, NA_SE_VO_LI_TAKEN_AWAY); @@ -5129,7 +5131,9 @@ s32 Player_HandleExitsAndVoids(PlayState* play, Player* this, CollisionPoly* pol } if (exitIndex == 0) { - Play_TriggerVoidOut(play); + if (GameInteractor_Should(VB_TRIGGER_VOIDOUT, true, this)) { + Play_TriggerVoidOut(play); + } Scene_SetTransitionForNextEntrance(play); } else { play->nextEntranceIndex = play->setupExitList[exitIndex - 1]; @@ -5163,7 +5167,9 @@ s32 Player_HandleExitsAndVoids(PlayState* play, Player* this, CollisionPoly* pol SurfaceType_GetSlope(&play->colCtx, poly, bgId) == 2, play->setupExitList[exitIndex - 1])) { gSaveContext.respawn[RESPAWN_MODE_DOWN].entranceIndex = play->nextEntranceIndex; - Play_TriggerVoidOut(play); + if (GameInteractor_Should(VB_TRIGGER_VOIDOUT, true, this)) { + Play_TriggerVoidOut(play); + } gSaveContext.respawnFlag = -2; } gSaveContext.retainWeatherMode = 1; @@ -5226,7 +5232,7 @@ s32 Player_HandleExitsAndVoids(PlayState* play, Player* this, CollisionPoly* pol if (this->actor.bgCheckFlags & 1) { if (this->floorProperty == 5) { Play_TriggerRespawn(play); - } else { + } else if (GameInteractor_Should(VB_TRIGGER_VOIDOUT, true, this)) { Play_TriggerVoidOut(play); } play->transitionType = TRANS_TYPE_FADE_BLACK_FAST; @@ -9613,6 +9619,10 @@ static FallImpactInfo D_80854600[] = { s32 func_80843E64(PlayState* play, Player* this) { s32 sp34; + if (!GameInteractor_Should(VB_RECIEVE_FALL_DAMAGE, true, this)) { + return 0; + } + if ((sFloorType == 6) || (sFloorType == 9)) { sp34 = 0; } else { @@ -15009,7 +15019,7 @@ void Player_Action_8084F88C(Player* this, PlayState* play) { if (IS_RANDO && Randomizer_GetSettingValue(RSK_SHUFFLE_ENTRANCES)) { Grotto_ForceRegularVoidOut(); } - } else { + } else if (GameInteractor_Should(VB_TRIGGER_VOIDOUT, true, this)) { Play_TriggerVoidOut(play); } From 40fa3c8d64e8e3c6c8a50f9b902f40ae5de4319f Mon Sep 17 00:00:00 2001 From: Malkierian Date: Thu, 29 May 2025 19:14:32 -0700 Subject: [PATCH 15/67] Convert `RandomizerInf` to the dynamic `#define` model to allow for automatic string names. (#5537) --- soh/include/functions.h | 1 - soh/include/z64save.h | 1 - .../Enhancements/debugger/debugSaveEditor.cpp | 4 + .../Enhancements/debugger/debugSaveEditor.h | 1329 +----- .../Enhancements/randomizer/ShuffleFairies.h | 2 +- .../Enhancements/randomizer/randomizerTypes.h | 10 +- .../Enhancements/randomizer/randomizer_inf.h | 3820 ++++++++--------- 7 files changed, 1926 insertions(+), 3241 deletions(-) diff --git a/soh/include/functions.h b/soh/include/functions.h index 3d1319907..8deb36953 100644 --- a/soh/include/functions.h +++ b/soh/include/functions.h @@ -12,7 +12,6 @@ extern "C" #include "luslog.h" #include -#include #if defined(INCLUDE_GAME_PRINTF) && defined(_DEBUG) #define osSyncPrintf(fmt, ...) lusprintf(__FILE__, __LINE__, 0, fmt, ##__VA_ARGS__) diff --git a/soh/include/z64save.h b/soh/include/z64save.h index 751ad0b0f..63a9b1d10 100644 --- a/soh/include/z64save.h +++ b/soh/include/z64save.h @@ -5,7 +5,6 @@ #include "z64math.h" #include "z64audio.h" #include "soh/Enhancements/randomizer/randomizerTypes.h" -#include "soh/Enhancements/randomizer/randomizer_inf.h" #include "soh/Enhancements/gameplaystats.h" #include "soh/Enhancements/randomizer/randomizer_entrance.h" #include "soh/Enhancements/boss-rush/BossRushTypes.h" diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp index 5aa5833ef..547d1907a 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp @@ -554,6 +554,10 @@ void DrawFlagTableArray16(const FlagTable& flagTable, uint16_t row, uint16_t& fl uint32_t bitMask = 1 << flagIndex; ImVec4 themeColor = ColorValues.at(THEME_COLOR); ImVec4 colorDark = { themeColor.x * 0.4f, themeColor.y * 0.4f, themeColor.z * 0.4f, themeColor.z }; + ImVec4& color = themeColor; + if (!hasDescription) { + color = colorDark; + } PushStyleCheckbox(hasDescription ? themeColor : colorDark); ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(4.0f, 3.0f)); bool flag = (flags & bitMask) != 0; diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.h b/soh/soh/Enhancements/debugger/debugSaveEditor.h index c3b14ba91..e8bdeb00a 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.h +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.h @@ -5,7 +5,7 @@ #include #include #include -#include +#include "soh/Enhancements/randomizer/randomizerTypes.h" #include typedef enum { @@ -23,6 +23,8 @@ typedef struct { std::map flagDescriptions; } FlagTable; +#define DEFINE_RAND_INF(rand_inf) { rand_inf, #rand_inf }, + // Reference https://tcrf.net/Proto:The_Legend_of_Zelda:_Ocarina_of_Time_Master_Quest/Event_Editor // The source was last referenced on 2022-09-03 and had a last updated value of 2020-05-02 const std::vector flagTables = { @@ -364,1331 +366,12 @@ const std::vector flagTables = { RANDOMIZER_INF, (RAND_INF_MAX + 15) / 16, { - { RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE, "DUNGEONS_DONE_SPIRIT_TEMPLE" }, - { RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE, "DUNGEONS_DONE_SHADOW_TEMPLE" }, - - { RAND_INF_COWS_MILKED_KF_LINKS_HOUSE_COW, "COWS_MILKED_KF_LINKS_HOUSE_COW" }, - { RAND_INF_COWS_MILKED_HF_COW_GROTTO_COW, "COWS_MILKED_HF_COW_GROTTO_COW" }, - { RAND_INF_COWS_MILKED_LLR_STABLES_LEFT_COW, "COWS_MILKED_LLR_STABLES_LEFT_COW" }, - { RAND_INF_COWS_MILKED_LLR_STABLES_RIGHT_COW, "COWS_MILKED_LLR_STABLES_RIGHT_COW" }, - { RAND_INF_COWS_MILKED_LLR_TOWER_LEFT_COW, "COWS_MILKED_LLR_TOWER_LEFT_COW" }, - { RAND_INF_COWS_MILKED_LLR_TOWER_RIGHT_COW, "COWS_MILKED_LLR_TOWER_RIGHT_COW" }, - { RAND_INF_COWS_MILKED_KAK_IMPAS_HOUSE_COW, "COWS_MILKED_KAK_IMPAS_HOUSE_COW" }, - { RAND_INF_COWS_MILKED_DMT_COW_GROTTO_COW, "COWS_MILKED_DMT_COW_GROTTO_COW" }, - { RAND_INF_COWS_MILKED_GV_COW, "COWS_MILKED_GV_COW" }, - { RAND_INF_COWS_MILKED_JABU_JABUS_BELLY_MQ_COW, "COWS_MILKED_JABU_JABUS_BELLY_MQ_COW" }, - - { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, - "SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, - "SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS" }, - { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, - "SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, - "SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY" }, - { RAND_INF_SCRUBS_PURCHASED_JABU_JABUS_BELLY_DEKU_SCRUB, "SCRUBS_PURCHASED_JABU_JABUS_BELLY_DEKU_SCRUB" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, - "SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, - "SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_RIGHT, - "SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_LEFT, "SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_HF_DEKU_SCRUB_GROTTO, "SCRUBS_PURCHASED_HF_DEKU_SCRUB_GROTTO" }, - { RAND_INF_SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_REAR, "SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_REAR" }, - { RAND_INF_SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_FRONT, "SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_FRONT" }, - { RAND_INF_SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_REAR, "SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_REAR" }, - { RAND_INF_SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_FRONT, "SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_FRONT" }, - { RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_LEFT, "SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_RIGHT, "SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_CENTER, "SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_CENTER" }, - { RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_REAR, "SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_REAR" }, - { RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_FRONT, "SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_FRONT" }, - { RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_REAR, "SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_REAR" }, - { RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_FRONT, "SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_FRONT" }, - { RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_LEFT, "SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_RIGHT, "SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_CENTER, "SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_CENTER" }, - { RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_LEFT, "SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_RIGHT, "SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_CENTER, "SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_CENTER" }, - { RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_LEFT, "SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_RIGHT, "SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_CENTER, "SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_CENTER" }, - { RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, - "SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_REAR" }, - { RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, - "SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT" }, - { RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, - "SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, - "SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_BRIDGE, "SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_BRIDGE" }, - { RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB, "SCRUBS_PURCHASED_DMC_DEKU_SCRUB" }, - { RAND_INF_SCRUBS_PURCHASED_DEKU_TREE_MQ_DEKU_SCRUB, "SCRUBS_PURCHASED_DEKU_TREE_MQ_DEKU_SCRUB" }, - { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, - "SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR" }, - { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, - "SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT" }, - { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, - "SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE" }, - { RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, - "SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, - "SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, - "SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, - "SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, - "SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT" }, - { RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, - "SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT" }, - - { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1, "SHOP_ITEMS_KF_SHOP_ITEM_1" }, - { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_2, "SHOP_ITEMS_KF_SHOP_ITEM_2" }, - { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_3, "SHOP_ITEMS_KF_SHOP_ITEM_3" }, - { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_4, "SHOP_ITEMS_KF_SHOP_ITEM_4" }, - { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_5, "SHOP_ITEMS_KF_SHOP_ITEM_5" }, - { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_6, "SHOP_ITEMS_KF_SHOP_ITEM_6" }, - { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_7, "SHOP_ITEMS_KF_SHOP_ITEM_7" }, - { RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_8, "SHOP_ITEMS_KF_SHOP_ITEM_8" }, - { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_1, "SHOP_ITEMS_GC_SHOP_ITEM_1" }, - { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_2, "SHOP_ITEMS_GC_SHOP_ITEM_2" }, - { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_3, "SHOP_ITEMS_GC_SHOP_ITEM_3" }, - { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_4, "SHOP_ITEMS_GC_SHOP_ITEM_4" }, - { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_5, "SHOP_ITEMS_GC_SHOP_ITEM_5" }, - { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_6, "SHOP_ITEMS_GC_SHOP_ITEM_6" }, - { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_7, "SHOP_ITEMS_GC_SHOP_ITEM_7" }, - { RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_8, "SHOP_ITEMS_GC_SHOP_ITEM_8" }, - { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_1, "SHOP_ITEMS_ZD_SHOP_ITEM_1" }, - { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_2, "SHOP_ITEMS_ZD_SHOP_ITEM_2" }, - { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_3, "SHOP_ITEMS_ZD_SHOP_ITEM_3" }, - { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_4, "SHOP_ITEMS_ZD_SHOP_ITEM_4" }, - { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_5, "SHOP_ITEMS_ZD_SHOP_ITEM_5" }, - { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_6, "SHOP_ITEMS_ZD_SHOP_ITEM_6" }, - { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_7, "SHOP_ITEMS_ZD_SHOP_ITEM_7" }, - { RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_8, "SHOP_ITEMS_ZD_SHOP_ITEM_8" }, - { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_1, "SHOP_ITEMS_KAK_BAZAAR_ITEM_1" }, - { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_2, "SHOP_ITEMS_KAK_BAZAAR_ITEM_2" }, - { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_3, "SHOP_ITEMS_KAK_BAZAAR_ITEM_3" }, - { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_4, "SHOP_ITEMS_KAK_BAZAAR_ITEM_4" }, - { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_5, "SHOP_ITEMS_KAK_BAZAAR_ITEM_5" }, - { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_6, "SHOP_ITEMS_KAK_BAZAAR_ITEM_6" }, - { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_7, "SHOP_ITEMS_KAK_BAZAAR_ITEM_7" }, - { RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_8, "SHOP_ITEMS_KAK_BAZAAR_ITEM_8" }, - { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_1, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_1" }, - { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_2, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_2" }, - { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_3, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_3" }, - { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_4, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_4" }, - { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_5, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_5" }, - { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_6, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_6" }, - { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_7, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_7" }, - { RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_8, "SHOP_ITEMS_KAK_POTION_SHOP_ITEM_8" }, - { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_1, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_1" }, - { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_2, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_2" }, - { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_3, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_3" }, - { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_4, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_4" }, - { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_5, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_5" }, - { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_6, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_6" }, - { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_7, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_7" }, - { RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_8, "SHOP_ITEMS_MARKET_BAZAAR_ITEM_8" }, - { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_1, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_1" }, - { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_2, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_2" }, - { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_3, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_3" }, - { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_4, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_4" }, - { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_5, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_5" }, - { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_6, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_6" }, - { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_7, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_7" }, - { RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_8, "SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_8" }, - { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_1, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_1" }, - { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_2, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_2" }, - { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_3, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_3" }, - { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_4, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_4" }, - { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_5, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_5" }, - { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_6, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_6" }, - { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_7, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_7" }, - { RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_8, "SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_8" }, - - { RAND_INF_MERCHANTS_CARPET_SALESMAN, "RAND_INF_MERCHANTS_CARPET_SALESMAN" }, - { RAND_INF_MERCHANTS_MEDIGORON, "RAND_INF_MERCHANTS_MEDIGORON" }, - { RAND_INF_MERCHANTS_GRANNYS_SHOP, "RAND_INF_MERCHANTS_GRANNY_SHOP" }, - { RAND_INF_MERCHANTS_MAGIC_BEAN_SALESMAN, "RAND_INF_MERCHANTS_MAGIC_BEAN_SALESMAN" }, - - { RAND_INF_ADULT_TRADES_LW_TRADE_COJIRO, "ADULT_TRADES_LW_TRADE_COJIRO" }, - { RAND_INF_ADULT_TRADES_GV_TRADE_SAW, "ADULT_TRADES_GV_TRADE_SAW" }, - { RAND_INF_ADULT_TRADES_DMT_TRADE_BROKEN_SWORD, "ADULT_TRADES_DMT_TRADE_BROKEN_SWORD" }, - { RAND_INF_ADULT_TRADES_LH_TRADE_FROG, "ADULT_TRADES_LH_TRADE_FROG" }, - { RAND_INF_ADULT_TRADES_DMT_TRADE_EYEDROPS, "ADULT_TRADES_DMT_TRADE_EYEDROPS" }, - - { RAND_INF_KAK_100_GOLD_SKULLTULA_REWARD, "KAK_100_GOLD_SKULLTULA_REWARD" }, - { RAND_INF_GREG_FOUND, "RAND_INF_GREG_FOUND" }, - - { RAND_INF_TOT_MASTER_SWORD, "RAND_INF_TOT_MASTER_SWORD" }, - { RAND_INF_CHILD_FISHING, "RAND_INF_CHILD_FISHING" }, - { RAND_INF_ADULT_FISHING, "RAND_INF_ADULT_FISHING" }, - { RAND_INF_10_BIG_POES, "RAND_INF_10_BIG_POES" }, - { RAND_INF_GRANT_GANONS_BOSSKEY, "RAND_INF_GRANT_GANONS_BOSSKEY" }, - - { RAND_INF_GOHMA_SOUL, "RAND_INF_GOHMA_SOUL" }, - { RAND_INF_KING_DODONGO_SOUL, "RAND_INF_KING_DODONGO_SOUL" }, - { RAND_INF_BARINADE_SOUL, "RAND_INF_BARINADE_SOUL" }, - { RAND_INF_PHANTOM_GANON_SOUL, "RAND_INF_PHANTOM_GANON_SOUL" }, - { RAND_INF_VOLVAGIA_SOUL, "RAND_INF_VOLVAGIA_SOUL" }, - { RAND_INF_MORPHA_SOUL, "RAND_INF_MORPHA_SOUL" }, - { RAND_INF_BONGO_BONGO_SOUL, "RAND_INF_BONGO_BONGO_SOUL" }, - { RAND_INF_TWINROVA_SOUL, "RAND_INF_TWINROVA_SOUL" }, - { RAND_INF_GANON_SOUL, "RAND_INF_GANON_SOUL" }, - - { RAND_INF_HAS_OCARINA_A, "RAND_INF_HAS_OCARINA_A" }, - { RAND_INF_HAS_OCARINA_C_UP, "RAND_INF_HAS_OCARINA_C_UP" }, - { RAND_INF_HAS_OCARINA_C_DOWN, "RAND_INF_HAS_OCARINA_C_DOWN" }, - { RAND_INF_HAS_OCARINA_C_LEFT, "RAND_INF_HAS_OCARINA_C_LEFT" }, - { RAND_INF_HAS_OCARINA_C_RIGHT, "RAND_INF_HAS_OCARINA_C_RIGHT" }, - - { RAND_INF_KF_LINKS_HOUSE_POT, "RAND_INF_KF_LINKS_HOUSE_POT" }, - { RAND_INF_KF_TWINS_HOUSE_POT_1, "RAND_INF_KF_TWINS_HOUSE_POT_1" }, - { RAND_INF_KF_TWINS_HOUSE_POT_2, "RAND_INF_KF_TWINS_HOUSE_POT_2" }, - { RAND_INF_KF_BROTHERS_HOUSE_POT_1, "RAND_INF_KF_BROTHERS_HOUSE_POT_1" }, - { RAND_INF_KF_BROTHERS_HOUSE_POT_2, "RAND_INF_KF_BROTHERS_HOUSE_POT_2" }, - { RAND_INF_GF_BREAK_ROOM_POT_1, "RAND_INF_GF_BREAK_ROOM_POT_1" }, - { RAND_INF_GF_BREAK_ROOM_POT_2, "RAND_INF_GF_BREAK_ROOM_POT_2" }, - { RAND_INF_GF_KITCHEN_POT_1, "RAND_INF_GF_KITCHEN_POT_1" }, - { RAND_INF_GF_KITCHEN_POT_2, "RAND_INF_GF_KITCHEN_POT_2" }, - { RAND_INF_GF_NORTH_F1_CARPENTER_POT_1, "RAND_INF_GF_NORTH_F1_CARPENTER_POT_1" }, - { RAND_INF_GF_NORTH_F1_CARPENTER_POT_2, "RAND_INF_GF_NORTH_F1_CARPENTER_POT_2" }, - { RAND_INF_GF_NORTH_F1_CARPENTER_POT_3, "RAND_INF_GF_NORTH_F1_CARPENTER_POT_3" }, - { RAND_INF_GF_NORTH_F2_CARPENTER_POT_1, "RAND_INF_GF_NORTH_F2_CARPENTER_POT_1" }, - { RAND_INF_GF_NORTH_F2_CARPENTER_POT_2, "RAND_INF_GF_NORTH_F2_CARPENTER_POT_2" }, - { RAND_INF_GF_SOUTH_F1_CARPENTER_POT_1, "RAND_INF_GF_SOUTH_F1_CARPENTER_POT_1" }, - { RAND_INF_GF_SOUTH_F1_CARPENTER_POT_2, "RAND_INF_GF_SOUTH_F1_CARPENTER_POT_2" }, - { RAND_INF_GF_SOUTH_F1_CARPENTER_POT_3, "RAND_INF_GF_SOUTH_F1_CARPENTER_POT_3" }, - { RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_1, "RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_1" }, - { RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_2, "RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_2" }, - { RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_3, "RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_3" }, - { RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_4, "RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_4" }, - { RAND_INF_WASTELAND_NEAR_GS_POT_1, "RAND_INF_WASTELAND_NEAR_GS_POT_1" }, - { RAND_INF_WASTELAND_NEAR_GS_POT_2, "RAND_INF_WASTELAND_NEAR_GS_POT_2" }, - { RAND_INF_WASTELAND_NEAR_GS_POT_3, "RAND_INF_WASTELAND_NEAR_GS_POT_3" }, - { RAND_INF_WASTELAND_NEAR_GS_POT_4, "RAND_INF_WASTELAND_NEAR_GS_POT_4" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_1, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_1" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_2, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_2" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_3, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_3" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_4, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_4" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_5, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_5" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_6, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_6" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_7, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_7" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_8, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_8" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_9, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_9" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_10, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_10" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_11, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_11" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_12, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_12" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_13, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_13" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_14, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_14" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_15, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_15" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_16, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_16" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_17, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_17" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_18, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_18" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_19, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_19" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_20, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_20" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_21, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_21" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_22, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_22" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_23, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_23" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_24, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_24" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_25, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_25" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_26, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_26" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_27, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_27" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_28, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_28" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_29, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_29" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_30, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_30" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_31, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_31" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_32, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_32" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_33, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_33" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_34, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_34" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_35, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_35" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_36, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_36" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_37, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_37" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_38, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_38" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_39, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_39" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_40, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_40" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_41, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_41" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_42, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_42" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_43, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_43" }, - { RAND_INF_MK_GUARD_HOUSE_CHILD_POT_44, "RAND_INF_MK_GUARD_HOUSE_CHILD_POT_44" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_1, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_1" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_2, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_2" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_3, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_3" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_4, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_4" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_5, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_5" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_6, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_6" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_7, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_7" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_8, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_8" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_9, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_9" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_10, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_10" }, - { RAND_INF_MK_GUARD_HOUSE_ADULT_POT_11, "RAND_INF_MK_GUARD_HOUSE_ADULT_POT_11" }, - { RAND_INF_MK_BACK_ALLEY_HOUSE_POT_1, "RAND_INF_MK_BACK_ALLEY_HOUSE_POT_1" }, - { RAND_INF_MK_BACK_ALLEY_HOUSE_POT_2, "RAND_INF_MK_BACK_ALLEY_HOUSE_POT_2" }, - { RAND_INF_MK_BACK_ALLEY_HOUSE_POT_3, "RAND_INF_MK_BACK_ALLEY_HOUSE_POT_3" }, - { RAND_INF_KAK_NEAR_POTION_SHOP_POT_1, "RAND_INF_KAK_NEAR_POTION_SHOP_POT_1" }, - { RAND_INF_KAK_NEAR_POTION_SHOP_POT_2, "RAND_INF_KAK_NEAR_POTION_SHOP_POT_2" }, - { RAND_INF_KAK_NEAR_POTION_SHOP_POT_3, "RAND_INF_KAK_NEAR_POTION_SHOP_POT_3" }, - { RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_1, "RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_1" }, - { RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_2, "RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_2" }, - { RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_3, "RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_3" }, - { RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_1, "RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_1" }, - { RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_2, "RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_2" }, - { RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_3, "RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_3" }, - { RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_1, "RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_1" }, - { RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_2, "RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_2" }, - { RAND_INF_GY_DAMPES_GRAVE_POT_1, "RAND_INF_GY_DAMPES_GRAVE_POT_1" }, - { RAND_INF_GY_DAMPES_GRAVE_POT_2, "RAND_INF_GY_DAMPES_GRAVE_POT_2" }, - { RAND_INF_GY_DAMPES_GRAVE_POT_3, "RAND_INF_GY_DAMPES_GRAVE_POT_3" }, - { RAND_INF_GY_DAMPES_GRAVE_POT_4, "RAND_INF_GY_DAMPES_GRAVE_POT_4" }, - { RAND_INF_GY_DAMPES_GRAVE_POT_5, "RAND_INF_GY_DAMPES_GRAVE_POT_5" }, - { RAND_INF_GY_DAMPES_GRAVE_POT_6, "RAND_INF_GY_DAMPES_GRAVE_POT_6" }, - { RAND_INF_GC_LOWER_STAIRCASE_POT_1, "RAND_INF_GC_LOWER_STAIRCASE_POT_1" }, - { RAND_INF_GC_LOWER_STAIRCASE_POT_2, "RAND_INF_GC_LOWER_STAIRCASE_POT_2" }, - { RAND_INF_GC_UPPER_STAIRCASE_POT_1, "RAND_INF_GC_UPPER_STAIRCASE_POT_1" }, - { RAND_INF_GC_UPPER_STAIRCASE_POT_2, "RAND_INF_GC_UPPER_STAIRCASE_POT_2" }, - { RAND_INF_GC_UPPER_STAIRCASE_POT_3, "RAND_INF_GC_UPPER_STAIRCASE_POT_3" }, - { RAND_INF_GC_MEDIGORON_POT_1, "RAND_INF_GC_MEDIGORON_POT_1" }, - { RAND_INF_GC_DARUNIA_POT_1, "RAND_INF_GC_DARUNIA_POT_1" }, - { RAND_INF_GC_DARUNIA_POT_2, "RAND_INF_GC_DARUNIA_POT_2" }, - { RAND_INF_GC_DARUNIA_POT_3, "RAND_INF_GC_DARUNIA_POT_3" }, - { RAND_INF_DMC_NEAR_GC_POT_1, "RAND_INF_DMC_NEAR_GC_POT_1" }, - { RAND_INF_DMC_NEAR_GC_POT_2, "RAND_INF_DMC_NEAR_GC_POT_2" }, - { RAND_INF_DMC_NEAR_GC_POT_3, "RAND_INF_DMC_NEAR_GC_POT_3" }, - { RAND_INF_DMC_NEAR_GC_POT_4, "RAND_INF_DMC_NEAR_GC_POT_4" }, - { RAND_INF_ZD_NEAR_SHOP_POT_1, "RAND_INF_ZD_NEAR_SHOP_POT_1" }, - { RAND_INF_ZD_NEAR_SHOP_POT_2, "RAND_INF_ZD_NEAR_SHOP_POT_2" }, - { RAND_INF_ZD_NEAR_SHOP_POT_3, "RAND_INF_ZD_NEAR_SHOP_POT_3" }, - { RAND_INF_ZD_NEAR_SHOP_POT_4, "RAND_INF_ZD_NEAR_SHOP_POT_4" }, - { RAND_INF_ZD_NEAR_SHOP_POT_5, "RAND_INF_ZD_NEAR_SHOP_POT_5" }, - { RAND_INF_ZF_HIDDEN_CAVE_POT_1, "RAND_INF_ZF_HIDDEN_CAVE_POT_1" }, - { RAND_INF_ZF_HIDDEN_CAVE_POT_2, "RAND_INF_ZF_HIDDEN_CAVE_POT_2" }, - { RAND_INF_ZF_HIDDEN_CAVE_POT_3, "RAND_INF_ZF_HIDDEN_CAVE_POT_3" }, - { RAND_INF_ZF_NEAR_JABU_POT_1, "RAND_INF_ZF_NEAR_JABU_POT_1" }, - { RAND_INF_ZF_NEAR_JABU_POT_2, "RAND_INF_ZF_NEAR_JABU_POT_2" }, - { RAND_INF_ZF_NEAR_JABU_POT_3, "RAND_INF_ZF_NEAR_JABU_POT_3" }, - { RAND_INF_ZF_NEAR_JABU_POT_4, "RAND_INF_ZF_NEAR_JABU_POT_4" }, - { RAND_INF_LLR_FRONT_POT_1, "RAND_INF_LLR_FRONT_POT_1" }, - { RAND_INF_LLR_FRONT_POT_2, "RAND_INF_LLR_FRONT_POT_2" }, - { RAND_INF_LLR_FRONT_POT_3, "RAND_INF_LLR_FRONT_POT_3" }, - { RAND_INF_LLR_FRONT_POT_4, "RAND_INF_LLR_FRONT_POT_4" }, - { RAND_INF_LLR_RAIN_SHED_POT_1, "RAND_INF_LLR_RAIN_SHED_POT_1" }, - { RAND_INF_LLR_RAIN_SHED_POT_2, "RAND_INF_LLR_RAIN_SHED_POT_2" }, - { RAND_INF_LLR_RAIN_SHED_POT_3, "RAND_INF_LLR_RAIN_SHED_POT_3" }, - { RAND_INF_LLR_TALONS_HOUSE_POT_1, "RAND_INF_LLR_TALONS_HOUSE_POT_1" }, - { RAND_INF_LLR_TALONS_HOUSE_POT_2, "RAND_INF_LLR_TALONS_HOUSE_POT_2" }, - { RAND_INF_LLR_TALONS_HOUSE_POT_3, "RAND_INF_LLR_TALONS_HOUSE_POT_3" }, - { RAND_INF_HF_COW_GROTTO_POT_1, "RAND_INF_HF_COW_GROTTO_POT_1" }, - { RAND_INF_HF_COW_GROTTO_POT_2, "RAND_INF_HF_COW_GROTTO_POT_2" }, - { RAND_INF_HC_STORMS_GROTTO_POT_1, "RAND_INF_HC_STORMS_GROTTO_POT_1" }, - { RAND_INF_HC_STORMS_GROTTO_POT_2, "RAND_INF_HC_STORMS_GROTTO_POT_2" }, - { RAND_INF_HC_STORMS_GROTTO_POT_3, "RAND_INF_HC_STORMS_GROTTO_POT_3" }, - { RAND_INF_HC_STORMS_GROTTO_POT_4, "RAND_INF_HC_STORMS_GROTTO_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_1, "RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_2, "RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_3, "RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_4, "RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_1, "RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_2, "RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_3, "RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_4, "RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_5, "RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_5" }, - { RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_6, "RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_6" }, - { RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_1, "RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_2, "RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_3, "RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_4, "RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_1, "RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_2, "RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_3, "RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_4, "RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_1, "RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_2, "RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_BLADE_POT_1, "RAND_INF_DODONGOS_CAVERN_BLADE_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_BLADE_POT_2, "RAND_INF_DODONGOS_CAVERN_BLADE_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_1, "RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_2, "RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_1, "RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_2, "RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_3, "RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_4, "RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_4" }, - { RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1, "RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1" }, - { RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2, "RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2" }, - { RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3, "RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3" }, - { RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_1, "RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_1" }, - { RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_2, "RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_2" }, - { RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_3, "RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_3" }, - { RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_4, "RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_4" }, - { RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_5, "RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_5" }, - { RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_6, "RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_6" }, - { RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_1, "RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_1" }, - { RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_2, "RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_2" }, - { RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_3, "RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_3" }, - { RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1, "RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1" }, - { RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2, "RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2" }, - { RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3, "RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3" }, - { RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4, "RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4" }, - { RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5, "RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5" }, - { RAND_INF_FOREST_TEMPLE_LOBBY_POT_1, "RAND_INF_FOREST_TEMPLE_LOBBY_POT_1" }, - { RAND_INF_FOREST_TEMPLE_LOBBY_POT_2, "RAND_INF_FOREST_TEMPLE_LOBBY_POT_2" }, - { RAND_INF_FOREST_TEMPLE_LOBBY_POT_3, "RAND_INF_FOREST_TEMPLE_LOBBY_POT_3" }, - { RAND_INF_FOREST_TEMPLE_LOBBY_POT_4, "RAND_INF_FOREST_TEMPLE_LOBBY_POT_4" }, - { RAND_INF_FOREST_TEMPLE_LOBBY_POT_5, "RAND_INF_FOREST_TEMPLE_LOBBY_POT_5" }, - { RAND_INF_FOREST_TEMPLE_LOBBY_POT_6, "RAND_INF_FOREST_TEMPLE_LOBBY_POT_6" }, - { RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_1, "RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_1" }, - { RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_2, "RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_2" }, - { RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_1, "RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_1" }, - { RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_2, "RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_2" }, - { RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_1, "RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_1" }, - { RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_2, "RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_2" }, - { RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_3, "RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_3" }, - { RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_4, "RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_4" }, - { RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_1, "RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_1" }, - { RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_2, "RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_2" }, - { RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_3, "RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_3" }, - { RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_1, "RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_1" }, - { RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_2, "RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_2" }, - { RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_1, "RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_1" }, - { RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_2, "RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_2" }, - { RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_3, "RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_3" }, - { RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_4, "RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_4" }, - { RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_1, "RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_1" }, - { RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_2, "RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_2" }, - { RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_3, "RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_3" }, - { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1" }, - { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2" }, - { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3" }, - { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4" }, - { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1" }, - { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2" }, - { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3" }, - { RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4, "RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4" }, - { RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_1, "RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_1" }, - { RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_2, "RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_2" }, - { RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_1, "RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_1" }, - { RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_2, "RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_2" }, - { RAND_INF_WATER_TEMPLE_TORCH_POT_1, "RAND_INF_WATER_TEMPLE_TORCH_POT_1" }, - { RAND_INF_WATER_TEMPLE_TORCH_POT_2, "RAND_INF_WATER_TEMPLE_TORCH_POT_2" }, - { RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_1, "RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_1" }, - { RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_2, "RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_2" }, - { RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_3, "RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_3" }, - { RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_1, "RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_1" }, - { RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_2, "RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_2" }, - { RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_1, "RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_1" }, - { RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_2, "RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_2" }, - { RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_3, "RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_3" }, - { RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_4, "RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_4" }, - { RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1, "RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1" }, - { RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2, "RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2" }, - { RAND_INF_WATER_TEMPLE_RIVER_POT_1, "RAND_INF_WATER_TEMPLE_RIVER_POT_1" }, - { RAND_INF_WATER_TEMPLE_RIVER_POT_2, "RAND_INF_WATER_TEMPLE_RIVER_POT_2" }, - { RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_1, "RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_1" }, - { RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_2, "RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_2" }, - { RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_1, "RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_1" }, - { RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_2, "RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1, "RAND_INF_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1, "RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2, "RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3, "RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3" }, - { RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4, "RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4" }, - { RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5, "RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5" }, - { RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_1, "RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_2, "RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_1, "RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_2, "RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_3, "RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_3" }, - { RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_4, "RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_4" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_1, "RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_2, "RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_SPIKE_WALLS_POT_1, "RAND_INF_SHADOW_TEMPLE_SPIKE_WALLS_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_1, "RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_2, "RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_1, "RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_2, "RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_3, "RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_3" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_4, "RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_4" }, - { RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_1, "RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_2, "RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_1, "RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_2, "RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_3, "RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_3" }, - { RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_4, "RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_4" }, - { RAND_INF_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1, "RAND_INF_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1, "RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2, "RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1, "RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2, "RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3, "RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3" }, - { RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4, "RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4" }, - { RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5, "RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5" }, - { RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6, "RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6" }, - { RAND_INF_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1, "RAND_INF_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1" }, - { RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_3, "RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_3" }, - { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_3, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_3" }, - { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_4, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_4" }, - { RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1, "RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1" }, - { RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_1, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_1" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_2, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_2" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_3, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_3" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_4, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_4" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_5, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_5" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_6, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_6" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_7, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_7" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_8, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_8" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_9, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_9" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_10, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_10" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_11, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_11" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_12, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_12" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_13, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_13" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_14, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_14" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_15, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_15" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_16, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_16" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_17, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_17" }, - { RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_18, "RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_18" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_1" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_2" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_3" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_4" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_5" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_6" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_7" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_8" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_9" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_10" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_11" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_12" }, - { RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1, "RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1" }, - { RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2, "RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2" }, - { RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3, "RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3" }, - { RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1, "RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1" }, - { RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2, "RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2" }, - { RAND_INF_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1, "RAND_INF_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1" }, - { RAND_INF_BOTTOM_OF_THE_WELL_UNDERWATER_POT, "RAND_INF_BOTTOM_OF_THE_WELL_UNDERWATER_POT" }, - { RAND_INF_ICE_CAVERN_HALL_POT_1, "RAND_INF_ICE_CAVERN_HALL_POT_1" }, - { RAND_INF_ICE_CAVERN_HALL_POT_2, "RAND_INF_ICE_CAVERN_HALL_POT_2" }, - { RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_1, "RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_1" }, - { RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_2, "RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_2" }, - { RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_3, "RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_3" }, - { RAND_INF_ICE_CAVERN_NEAR_END_POT_1, "RAND_INF_ICE_CAVERN_NEAR_END_POT_1" }, - { RAND_INF_ICE_CAVERN_NEAR_END_POT_2, "RAND_INF_ICE_CAVERN_NEAR_END_POT_2" }, - { RAND_INF_ICE_CAVERN_FROZEN_POT_1, "RAND_INF_ICE_CAVERN_FROZEN_POT_1" }, - - { RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1, "RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2, "RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_1, "RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_1" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_2, "RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_2" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, "RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, "RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, "RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, "RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, "RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1" }, - { RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_1, "RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_1" }, - { RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_2, "RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_2" }, - { RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_3, "RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_3" }, - { RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_4, "RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_4" }, - { RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_5, "RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_5" }, - { RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_6, "RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_6" }, - { RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_1, "RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_1" }, - { RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_2, "RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_2" }, - { RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1, "RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1" }, - { RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2, "RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2" }, - { RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3, "RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3" }, - { RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4, "RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4" }, - { RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_1, "RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_1" }, - { RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_2, "RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_2" }, - { RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_3, "RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_3" }, - { RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_1, "RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_1" }, - { RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_2, "RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_2" }, - { RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_1, "RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_1" }, - { RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_2, "RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_2" }, - { RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_3, "RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_3" }, - { RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_4, "RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3, "RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4, "RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3, "RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4, "RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, "RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, "RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, "RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, "RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_3, "RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_3" }, - { RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_4, "RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_4" }, - { RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_2" }, - { RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_1, "RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_1" }, - { RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_2, "RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_2" }, - { RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2" }, - { RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1, "RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1" }, - { RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2, "RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1, "RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2, "RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1, "RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2, "RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_1, "RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_2, "RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_3, "RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_3" }, - { RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_4, "RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_4" }, - { RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1, "RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2, "RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_1, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_2, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_2" }, - { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_3, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_3" }, - { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_4, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_4" }, - { RAND_INF_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT, "RAND_INF_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT" }, - { RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1, "RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1" }, - { RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2, "RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_1, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_1" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_2, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_2" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_3, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_3" }, - { RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_1" }, - { RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_2" }, - { RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1" }, - { RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2" }, - { RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_1" }, - { RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_2" }, - { RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_3, "RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_3" }, - { RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1" }, - { RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2" }, - { RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1" }, - { RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2" }, - { RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3, "RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3" }, - { RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1" }, - { RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_1" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_2" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_3, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_3" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_4, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_4" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_5, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_5" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_6, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_6" }, - { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1" }, - { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2" }, - { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3" }, - { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4" }, - { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5" }, - { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6" }, - { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7" }, - { RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8, "RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8" }, - { RAND_INF_ICE_CAVERN_MQ_ENTRANCE_POT, "RAND_INF_ICE_CAVERN_MQ_ENTRANCE_POT" }, - { RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1, "RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1" }, - { RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2, "RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2" }, - { RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1, "RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1" }, - { RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2, "RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2" }, - { RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3, "RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3" }, - { RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4, "RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4" }, - { RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1, "RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1" }, - { RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2, "RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2" }, - { RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_1, "RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_1" }, - { RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_2, "RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3, "RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4, "RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4, "RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_3, "RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_3" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_4, "RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_4" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_5, "RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_5" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, "RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, "RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1, "RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2, "RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_1, "RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_2, "RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_3, "RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_3" }, - { RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_4, "RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_4" }, - { RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_5, "RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_5" }, - { RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, "RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, "RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, "RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3" }, - { RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1, "RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2, "RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_3, "RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_3" }, - { RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_4, "RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_4" }, - { RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_5, "RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_5" }, - { RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1, "RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2, "RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_1, "RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_2, "RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, "RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, "RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, "RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, "RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, "RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, "RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, "RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3" }, - { RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1, "RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2, "RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, "RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_1" }, - { RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, "RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_2" }, - { RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, "RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_3" }, - { RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, "RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_4" }, - { RAND_INF_WATER_TEMPLE_MQ_BOSS_KEY_POT, "RAND_INF_WATER_TEMPLE_MQ_BOSS_KEY_POT" }, - { RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1, - "RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1" }, - { RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2, - "RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2" }, - { RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, - "RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1" }, - { RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, - "RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2" }, - - { RAND_INF_CAUGHT_LOACH, "RAND_INF_CAUGHT_LOACH" }, - - { RAND_INF_CAN_SWIM, "RAND_INF_CAN_SWIM" }, - - { RAND_INF_HAS_WALLET, "RAND_INF_HAS_WALLET" }, - - { RAND_INF_BEEHIVE_KF_STORMS_GROTTO_LEFT, "RAND_INF_BEEHIVE_KF_STORMS_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_KF_STORMS_GROTTO_RIGHT, "RAND_INF_BEEHIVE_KF_STORMS_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_LEFT, "RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_RIGHT, "RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_LW_DEKU_SCRUB_GROTTO, "RAND_INF_BEEHIVE_LW_DEKU_SCRUB_GROTTO" }, - { RAND_INF_BEEHIVE_SFM_STORMS_GROTTO, "RAND_INF_BEEHIVE_SFM_STORMS_GROTTO" }, - { RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_LEFT, "RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_RIGHT, "RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_HF_OPEN_GROTTO_LEFT, "RAND_INF_BEEHIVE_HF_OPEN_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_HF_OPEN_GROTTO_RIGHT, "RAND_INF_BEEHIVE_HF_OPEN_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_LEFT, "RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_RIGHT, "RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_HF_INSIDE_FENCE_GROTTO, "RAND_INF_BEEHIVE_HF_INSIDE_FENCE_GROTTO" }, - { RAND_INF_BEEHIVE_LLR_GROTTO, "RAND_INF_BEEHIVE_LLR_GROTTO" }, - { RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_LEFT, "RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_RIGHT, "RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_DMT_COW_GROTTO, "RAND_INF_BEEHIVE_DMT_COW_GROTTO" }, - { RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_LEFT, "RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_RIGHT, "RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_GC_GROTTO, "RAND_INF_BEEHIVE_GC_GROTTO" }, - { RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_LEFT, "RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_RIGHT, "RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_DMC_HAMMER_GROTTO, "RAND_INF_BEEHIVE_DMC_HAMMER_GROTTO" }, - { RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_LEFT, "RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_LEFT" }, - { RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_RIGHT, "RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_RIGHT" }, - { RAND_INF_BEEHIVE_ZR_STORMS_GROTTO, "RAND_INF_BEEHIVE_ZR_STORMS_GROTTO" }, - { RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_LEFT, "RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_LEFT" }, - { RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_RIGHT, "RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_RIGHT" }, - { RAND_INF_BEEHIVE_ZD_BEHIND_KING_ZORA, "RAND_INF_BEEHIVE_ZD_BEHIND_KING_ZORA" }, - { RAND_INF_BEEHIVE_LH_GROTTO, "RAND_INF_BEEHIVE_LH_GROTTO" }, - { RAND_INF_BEEHIVE_GV_DEKU_SCRUB_GROTTO, "RAND_INF_BEEHIVE_GV_DEKU_SCRUB_GROTTO" }, - { RAND_INF_BEEHIVE_COLOSSUS_GROTTO, "RAND_INF_BEEHIVE_COLOSSUS_GROTTO" }, - - { RAND_INF_CHILD_FISH_1, "RAND_INF_CHILD_FISH_1" }, - { RAND_INF_CHILD_FISH_2, "RAND_INF_CHILD_FISH_2" }, - { RAND_INF_CHILD_FISH_3, "RAND_INF_CHILD_FISH_3" }, - { RAND_INF_CHILD_FISH_4, "RAND_INF_CHILD_FISH_4" }, - { RAND_INF_CHILD_FISH_5, "RAND_INF_CHILD_FISH_5" }, - { RAND_INF_CHILD_FISH_6, "RAND_INF_CHILD_FISH_6" }, - { RAND_INF_CHILD_FISH_7, "RAND_INF_CHILD_FISH_7" }, - { RAND_INF_CHILD_FISH_8, "RAND_INF_CHILD_FISH_8" }, - { RAND_INF_CHILD_FISH_9, "RAND_INF_CHILD_FISH_9" }, - { RAND_INF_CHILD_FISH_10, "RAND_INF_CHILD_FISH_10" }, - { RAND_INF_CHILD_FISH_11, "RAND_INF_CHILD_FISH_11" }, - { RAND_INF_CHILD_FISH_12, "RAND_INF_CHILD_FISH_12" }, - { RAND_INF_CHILD_FISH_13, "RAND_INF_CHILD_FISH_13" }, - { RAND_INF_CHILD_FISH_14, "RAND_INF_CHILD_FISH_14" }, - { RAND_INF_CHILD_FISH_15, "RAND_INF_CHILD_FISH_15" }, - { RAND_INF_CHILD_LOACH_1, "RAND_INF_CHILD_LOACH_1" }, - { RAND_INF_CHILD_LOACH_2, "RAND_INF_CHILD_LOACH_2" }, - { RAND_INF_ADULT_FISH_1, "RAND_INF_ADULT_FISH_1" }, - { RAND_INF_ADULT_FISH_2, "RAND_INF_ADULT_FISH_2" }, - { RAND_INF_ADULT_FISH_3, "RAND_INF_ADULT_FISH_3" }, - { RAND_INF_ADULT_FISH_4, "RAND_INF_ADULT_FISH_4" }, - { RAND_INF_ADULT_FISH_5, "RAND_INF_ADULT_FISH_5" }, - { RAND_INF_ADULT_FISH_6, "RAND_INF_ADULT_FISH_6" }, - { RAND_INF_ADULT_FISH_7, "RAND_INF_ADULT_FISH_7" }, - { RAND_INF_ADULT_FISH_8, "RAND_INF_ADULT_FISH_8" }, - { RAND_INF_ADULT_FISH_9, "RAND_INF_ADULT_FISH_9" }, - { RAND_INF_ADULT_FISH_10, "RAND_INF_ADULT_FISH_10" }, - { RAND_INF_ADULT_FISH_11, "RAND_INF_ADULT_FISH_11" }, - { RAND_INF_ADULT_FISH_12, "RAND_INF_ADULT_FISH_12" }, - { RAND_INF_ADULT_FISH_13, "RAND_INF_ADULT_FISH_13" }, - { RAND_INF_ADULT_FISH_14, "RAND_INF_ADULT_FISH_14" }, - { RAND_INF_ADULT_FISH_15, "RAND_INF_ADULT_FISH_15" }, - { RAND_INF_ADULT_LOACH, "RAND_INF_ADULT_LOACH" }, - { RAND_INF_GROTTO_FISH_ZR_OPEN_GROTTO, "RAND_INF_GROTTO_FISH_ZR_OPEN_GROTTO" }, - { RAND_INF_GROTTO_FISH_DMC_UPPER_GROTTO, "RAND_INF_GROTTO_FISH_DMC_UPPER_GROTTO" }, - { RAND_INF_GROTTO_FISH_DMT_STORMS_GROTTO, "RAND_INF_GROTTO_FISH_DMT_STORMS_GROTTO" }, - { RAND_INF_GROTTO_FISH_KAK_OPEN_GROTTO, "RAND_INF_GROTTO_FISH_KAK_OPEN_GROTTO" }, - { RAND_INF_GROTTO_FISH_HF_NEAR_MARKET_GROTTO, "RAND_INF_GROTTO_FISH_HF_NEAR_MARKET_GROTTO" }, - { RAND_INF_GROTTO_FISH_HF_OPEN_GROTTO, "RAND_INF_GROTTO_FISH_HF_OPEN_GROTTO" }, - { RAND_INF_GROTTO_FISH_HF_SOUTHEAST_GROTTO, "RAND_INF_GROTTO_FISH_HF_SOUTHEAST_GROTTO" }, - { RAND_INF_GROTTO_FISH_LW_NEAR_SHORTCUTS_GROTTO, "RAND_INF_GROTTO_FISH_LW_NEAR_SHORTCUTS_GROTTO" }, - { RAND_INF_GROTTO_FISH_KF_STORMS_GROTTO, "RAND_INF_GROTTO_FISH_KF_STORMS_GROTTO" }, - { RAND_INF_FISHING_POLE_FOUND, "RAND_INF_FISHING_POLE_FOUND" }, - { RAND_INF_ZD_FISH_1, "RAND_INF_ZD_FISH_1" }, - { RAND_INF_ZD_FISH_2, "RAND_INF_ZD_FISH_2" }, - { RAND_INF_ZD_FISH_3, "RAND_INF_ZD_FISH_3" }, - { RAND_INF_ZD_FISH_4, "RAND_INF_ZD_FISH_4" }, - { RAND_INF_ZD_FISH_5, "RAND_INF_ZD_FISH_5" }, - - { RAND_INF_HAS_INFINITE_QUIVER, "RAND_INF_HAS_INFINITE_QUIVER" }, - { RAND_INF_HAS_INFINITE_BOMB_BAG, "RAND_INF_HAS_INFINITE_BOMB_BAG" }, - { RAND_INF_HAS_INFINITE_BULLET_BAG, "RAND_INF_HAS_INFINITE_BULLET_BAG" }, - { RAND_INF_HAS_INFINITE_STICK_UPGRADE, "RAND_INF_HAS_INFINITE_STICK_UPGRADE" }, - { RAND_INF_HAS_INFINITE_NUT_UPGRADE, "RAND_INF_HAS_INFINITE_NUT_UPGRADE" }, - { RAND_INF_HAS_INFINITE_MAGIC_METER, "RAND_INF_HAS_INFINITE_MAGIC_METER" }, - { RAND_INF_HAS_INFINITE_BOMBCHUS, "RAND_INF_HAS_INFINITE_BOMBCHUS" }, - { RAND_INF_HAS_INFINITE_MONEY, "RAND_INF_HAS_INFINITE_MONEY" }, - - { RAND_INF_HAS_SKELETON_KEY, "RAND_INF_HAS_SKELETON_KEY" }, - - { RAND_INF_LINKS_POCKET, "RAND_INF_LINKS_POCKET" }, - { RAND_INF_LEARNED_EPONA_SONG, "RAND_INF_LEARNED_EPONA_SONG" }, - { RAND_INF_DARUNIAS_JOY, "RAND_INF_DARUNIAS_JOY" }, - { RAND_INF_KING_ZORA_THAWED, "RAND_INF_KING_ZORA_THAWED" }, - - { RAND_INF_HC_GREAT_FAIRY_REWARD, "RAND_INF_HC_GREAT_FAIRY_REWARD" }, - { RAND_INF_DMT_GREAT_FAIRY_REWARD, "RAND_INF_DMT_GREAT_FAIRY_REWARD" }, - { RAND_INF_DMC_GREAT_FAIRY_REWARD, "RAND_INF_DMC_GREAT_FAIRY_REWARD" }, - { RAND_INF_ZF_GREAT_FAIRY_REWARD, "RAND_INF_ZF_GREAT_FAIRY_REWARD" }, - { RAND_INF_COLOSSUS_GREAT_FAIRY_REWARD, "RAND_INF_COLOSSUS_GREAT_FAIRY_REWARD" }, - { RAND_INF_OGC_GREAT_FAIRY_REWARD, "RAND_INF_OGC_GREAT_FAIRY_REWARD" }, - - { RAND_INF_ZELDAS_LETTER, "RAND_INF_ZELDAS_LETTER" }, - { RAND_INF_WEIRD_EGG, "RAND_INF_WEIRD_EGG" }, - - { RAND_INF_KF_SOUTH_GRASS_WEST_RUPEE, "RAND_INF_KF_SOUTH_GRASS_WEST_RUPEE" }, - { RAND_INF_KF_NORTH_GRASS_WEST_RUPEE, "RAND_INF_KF_NORTH_GRASS_WEST_RUPEE" }, - { RAND_INF_KF_NORTH_GRASS_EAST_RUPEE, "RAND_INF_KF_NORTH_GRASS_EAST_RUPEE" }, - { RAND_INF_KF_SOUTH_GRASS_EAST_RUPEE, "RAND_INF_KF_SOUTH_GRASS_EAST_RUPEE" }, - { RAND_INF_KF_SARIAS_TOP_LEFT_HEART, "RAND_INF_KF_SARIAS_TOP_LEFT_HEART" }, - { RAND_INF_KF_SARIAS_TOP_RIGHT_HEART, "RAND_INF_KF_SARIAS_TOP_RIGHT_HEART" }, - { RAND_INF_KF_SARIAS_BOTTOM_LEFT_HEART, "RAND_INF_KF_SARIAS_BOTTOM_LEFT_HEART" }, - { RAND_INF_KF_SARIAS_BOTTOM_RIGHT_HEART, "RAND_INF_KF_SARIAS_BOTTOM_RIGHT_HEART" }, - { RAND_INF_KF_BEAN_RUPEE_1, "RAND_INF_KF_BEAN_RUPEE_1" }, - { RAND_INF_KF_BEAN_RUPEE_2, "RAND_INF_KF_BEAN_RUPEE_2" }, - { RAND_INF_KF_BEAN_RUPEE_3, "RAND_INF_KF_BEAN_RUPEE_3" }, - { RAND_INF_KF_BEAN_RUPEE_4, "RAND_INF_KF_BEAN_RUPEE_4" }, - { RAND_INF_KF_BEAN_RUPEE_5, "RAND_INF_KF_BEAN_RUPEE_5" }, - { RAND_INF_KF_BEAN_RUPEE_6, "RAND_INF_KF_BEAN_RUPEE_6" }, - { RAND_INF_KF_BEAN_RED_RUPEE, "RAND_INF_KF_BEAN_RED_RUPEE" }, - { RAND_INF_LW_SHORTCUT_RUPEE_1, "RAND_INF_LW_SHORTCUT_RUPEE_1" }, - { RAND_INF_LW_SHORTCUT_RUPEE_2, "RAND_INF_LW_SHORTCUT_RUPEE_2" }, - { RAND_INF_LW_SHORTCUT_RUPEE_3, "RAND_INF_LW_SHORTCUT_RUPEE_3" }, - { RAND_INF_LW_SHORTCUT_RUPEE_4, "RAND_INF_LW_SHORTCUT_RUPEE_4" }, - { RAND_INF_LW_SHORTCUT_RUPEE_5, "RAND_INF_LW_SHORTCUT_RUPEE_5" }, - { RAND_INF_LW_SHORTCUT_RUPEE_6, "RAND_INF_LW_SHORTCUT_RUPEE_6" }, - { RAND_INF_LW_SHORTCUT_RUPEE_7, "RAND_INF_LW_SHORTCUT_RUPEE_7" }, - { RAND_INF_LW_SHORTCUT_RUPEE_8, "RAND_INF_LW_SHORTCUT_RUPEE_8" }, - { RAND_INF_LH_FRONT_RUPEE, "RAND_INF_LH_FRONT_RUPEE" }, - { RAND_INF_LH_MIDDLE_RUPEE, "RAND_INF_LH_MIDDLE_RUPEE" }, - { RAND_INF_LH_BACK_RUPEE, "RAND_INF_LH_BACK_RUPEE" }, - { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_1, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_1" }, - { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_2, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_2" }, - { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_3, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_3" }, - { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_4, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_4" }, - { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_5, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_5" }, - { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_6, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_6" }, - { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_7, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_7" }, - { RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_8, "RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_8" }, - { RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE" }, - { RAND_INF_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE" }, - { RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE" }, - { RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE" }, - { RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE" }, - { RAND_INF_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE" }, - { RAND_INF_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE" }, - { RAND_INF_GV_OCTOROK_GROTTO_RED_RUPEE, "RAND_INF_GV_OCTOROK_GROTTO_RED_RUPEE" }, - { RAND_INF_DMT_BLUE_RUPEE, "RAND_INF_DMT_BLUE_RUPEE" }, - { RAND_INF_DMT_COW_GROTTO_LEFT_HEART, "RAND_INF_DMT_COW_GROTTO_LEFT_HEART" }, - { RAND_INF_DMT_COW_GROTTO_MIDDLE_LEFT_HEART, "RAND_INF_DMT_COW_GROTTO_MIDDLE_LEFT_HEART" }, - { RAND_INF_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART, "RAND_INF_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART" }, - { RAND_INF_DMT_COW_GROTTO_RIGHT_HEART, "RAND_INF_DMT_COW_GROTTO_RIGHT_HEART" }, - { RAND_INF_DMT_COW_GROTTO_RUPEE_1, "RAND_INF_DMT_COW_GROTTO_RUPEE_1" }, - { RAND_INF_DMT_COW_GROTTO_RUPEE_2, "RAND_INF_DMT_COW_GROTTO_RUPEE_2" }, - { RAND_INF_DMT_COW_GROTTO_RUPEE_3, "RAND_INF_DMT_COW_GROTTO_RUPEE_3" }, - { RAND_INF_DMT_COW_GROTTO_RUPEE_4, "RAND_INF_DMT_COW_GROTTO_RUPEE_4" }, - { RAND_INF_DMT_COW_GROTTO_RUPEE_5, "RAND_INF_DMT_COW_GROTTO_RUPEE_5" }, - { RAND_INF_DMT_COW_GROTTO_RUPEE_6, "RAND_INF_DMT_COW_GROTTO_RUPEE_6" }, - { RAND_INF_DMT_COW_GROTTO_RED_RUPEE, "RAND_INF_DMT_COW_GROTTO_RED_RUPEE" }, - { RAND_INF_DMC_NEAR_PLATFORM_RED_RUPEE, "RAND_INF_DMC_NEAR_PLATFORM_RED_RUPEE" }, - { RAND_INF_DMC_MIDDLE_PLATFORM_RED_RUPEE, "RAND_INF_DMC_MIDDLE_PLATFORM_RED_RUPEE" }, - { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1" }, - { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2" }, - { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3" }, - { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4" }, - { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5" }, - { RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6, "RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6" }, - { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_1, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_1" }, - { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_2, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_2" }, - { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_3, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_3" }, - { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_4, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_4" }, - { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_5, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_5" }, - { RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_6, "RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_6" }, - { RAND_INF_DMC_DISTANT_PLATFORM_RED_RUPEE, "RAND_INF_DMC_DISTANT_PLATFORM_RED_RUPEE" }, - { RAND_INF_ZR_BENEATH_WATERFALL_LEFT_RUPEE, "RAND_INF_ZR_BENEATH_WATERFALL_LEFT_RUPEE" }, - { RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE, "RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE" }, - { RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE, "RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE" }, - { RAND_INF_ZR_BENEATH_WATERFALL_RIGHT_RUPEE, "RAND_INF_ZR_BENEATH_WATERFALL_RIGHT_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTH_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTH_INNER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTHEAST_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHEAST_INNER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTH_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTH_INNER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTHWEST_INNER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHWEST_INNER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTH_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_NORTH_MIDDLE_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTH_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTH_OUTER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTH_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTH_OUTER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE" }, - { RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, "RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE" }, - { RAND_INF_DEKU_TREE_LOBBY_LOWER_HEART, "RAND_INF_DEKU_TREE_LOBBY_LOWER_HEART" }, - { RAND_INF_DEKU_TREE_LOBBY_UPPER_HEART, "RAND_INF_DEKU_TREE_LOBBY_UPPER_HEART" }, - { RAND_INF_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, "RAND_INF_DEKU_TREE_BEFORE_BOSS_LEFT_HEART" }, - { RAND_INF_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, "RAND_INF_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART" }, - { RAND_INF_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, "RAND_INF_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART" }, - { RAND_INF_DODONGOS_CAVERN_BLADE_ROOM_HEART, "RAND_INF_DODONGOS_CAVERN_BLADE_ROOM_HEART" }, - { RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, "RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART" }, - { RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, - "RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART" }, - { RAND_INF_FOREST_TEMPLE_COURTYARD_RIGHT_HEART, "RAND_INF_FOREST_TEMPLE_COURTYARD_RIGHT_HEART" }, - { RAND_INF_FOREST_TEMPLE_COURTYARD_LEFT_HEART, "RAND_INF_FOREST_TEMPLE_COURTYARD_LEFT_HEART" }, - { RAND_INF_FOREST_TEMPLE_WELL_WEST_HEART, "RAND_INF_FOREST_TEMPLE_WELL_WEST_HEART" }, - { RAND_INF_FOREST_TEMPLE_WELL_EAST_HEART, "RAND_INF_FOREST_TEMPLE_WELL_EAST_HEART" }, - { RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART" }, - { RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART" }, - { RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART" }, - { RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART, "RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART" }, - { RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART, "RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART" }, - { RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART, "RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART" }, - { RAND_INF_FIRE_TEMPLE_FIRE_WALL_EAST_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_WALL_EAST_HEART" }, - { RAND_INF_FIRE_TEMPLE_FIRE_WALL_WEST_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_WALL_WEST_HEART" }, - { RAND_INF_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART, "RAND_INF_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART" }, - { RAND_INF_WATER_TEMPLE_RIVER_HEART_1, "RAND_INF_WATER_TEMPLE_RIVER_HEART_1" }, - { RAND_INF_WATER_TEMPLE_RIVER_HEART_2, "RAND_INF_WATER_TEMPLE_RIVER_HEART_2" }, - { RAND_INF_WATER_TEMPLE_RIVER_HEART_3, "RAND_INF_WATER_TEMPLE_RIVER_HEART_3" }, - { RAND_INF_WATER_TEMPLE_RIVER_HEART_4, "RAND_INF_WATER_TEMPLE_RIVER_HEART_4" }, - { RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART, "RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART" }, - { RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART, - "RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART" }, - { RAND_INF_SHADOW_TEMPLE_SCARECROW_NORTH_HEART, "RAND_INF_SHADOW_TEMPLE_SCARECROW_NORTH_HEART" }, - { RAND_INF_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART, "RAND_INF_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, "RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, - "RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART" }, - { RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, "RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART" }, - { RAND_INF_ICE_CAVERN_LOBBY_RUPEE, "RAND_INF_ICE_CAVERN_LOBBY_RUPEE" }, - { RAND_INF_ICE_CAVERN_MAP_ROOM_LEFT_HEART, "RAND_INF_ICE_CAVERN_MAP_ROOM_LEFT_HEART" }, - { RAND_INF_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, "RAND_INF_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART" }, - { RAND_INF_ICE_CAVERN_MAP_ROOM_RIGHT_HEART, "RAND_INF_ICE_CAVERN_MAP_ROOM_RIGHT_HEART" }, - { RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1, "RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1" }, - { RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, "RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2" }, - { RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, "RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3" }, - { RAND_INF_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART, - "RAND_INF_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART" }, - { RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, "RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART" }, - { RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, "RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART" }, - { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_1, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_1" }, - { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_2, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_2" }, - { RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_3, "RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_3" }, - { RAND_INF_GANONS_CASTLE_FIRE_TRIAL_HEART, "RAND_INF_GANONS_CASTLE_FIRE_TRIAL_HEART" }, - { RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_HEART, "RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_HEART" }, - { RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART, "RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART" }, - { RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART, "RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART" }, - { RAND_INF_DEKU_TREE_MQ_LOBBY_HEART, "RAND_INF_DEKU_TREE_MQ_LOBBY_HEART" }, - { RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART, "RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART" }, - { RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART, "RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART" }, - { RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART, "RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART" }, - { RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART, "RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART" }, - { RAND_INF_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART, - "RAND_INF_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, "RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_1" }, - { RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, "RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_2" }, - { RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART, "RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART" }, - { RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART, "RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART" }, - { RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART, "RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART" }, - { RAND_INF_FOREST_TEMPLE_WELL_MQ_WEST_HEART, "RAND_INF_FOREST_TEMPLE_WELL_MQ_WEST_HEART" }, - { RAND_INF_FOREST_TEMPLE_WELL_MQ_MIDDLE_HEART, "RAND_INF_FOREST_TEMPLE_WELL_MQ_MIDDLE_HEART" }, - { RAND_INF_FOREST_TEMPLE_WELL_MQ_EAST_HEART, "RAND_INF_FOREST_TEMPLE_WELL_MQ_EAST_HEART" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART" }, - { RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART, "RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART" }, - { RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART, - "RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART" }, - { RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART, - "RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART" }, - { RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART" }, - { RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART" }, - { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART, - "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART" }, - { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART, - "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART" }, - { RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, "RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, - "RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART, - "RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART, - "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART, - "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART, - "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART" }, - { RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_HEART, "RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_HEART" }, - { RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART, "RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART" }, - { RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART, "RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART" }, - - { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1" }, - { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2" }, - { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3" }, - { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_4, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_4" }, - { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_5, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_5" }, - { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_6, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_6" }, - { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_7, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_7" }, - { RAND_INF_SFM_FAIRY_GROTTO_FAIRY_8, "RAND_INF_SFM_FAIRY_GROTTO_FAIRY_8" }, - { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_1, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_1" }, - { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_2, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_2" }, - { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_3, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_3" }, - { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_4, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_4" }, - { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_5, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_5" }, - { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_6, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_6" }, - { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_7, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_7" }, - { RAND_INF_ZR_FAIRY_GROTTO_FAIRY_8, "RAND_INF_ZR_FAIRY_GROTTO_FAIRY_8" }, - { RAND_INF_HF_FAIRY_GROTTO_FAIRY_1, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_1" }, - { RAND_INF_HF_FAIRY_GROTTO_FAIRY_2, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_2" }, - { RAND_INF_HF_FAIRY_GROTTO_FAIRY_3, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_3" }, - { RAND_INF_HF_FAIRY_GROTTO_FAIRY_4, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_4" }, - { RAND_INF_HF_FAIRY_GROTTO_FAIRY_5, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_5" }, - { RAND_INF_HF_FAIRY_GROTTO_FAIRY_6, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_6" }, - { RAND_INF_HF_FAIRY_GROTTO_FAIRY_7, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_7" }, - { RAND_INF_HF_FAIRY_GROTTO_FAIRY_8, "RAND_INF_HF_FAIRY_GROTTO_FAIRY_8" }, - { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_1, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_1" }, - { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_2, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_2" }, - { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_3, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_3" }, - { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_4, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_4" }, - { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_5, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_5" }, - { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_6, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_6" }, - { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_7, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_7" }, - { RAND_INF_ZD_FAIRY_GROTTO_FAIRY_8, "RAND_INF_ZD_FAIRY_GROTTO_FAIRY_8" }, - { RAND_INF_GF_FAIRY_GROTTO_FAIRY_1, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_1" }, - { RAND_INF_GF_FAIRY_GROTTO_FAIRY_2, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_2" }, - { RAND_INF_GF_FAIRY_GROTTO_FAIRY_3, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_3" }, - { RAND_INF_GF_FAIRY_GROTTO_FAIRY_4, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_4" }, - { RAND_INF_GF_FAIRY_GROTTO_FAIRY_5, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_5" }, - { RAND_INF_GF_FAIRY_GROTTO_FAIRY_6, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_6" }, - { RAND_INF_GF_FAIRY_GROTTO_FAIRY_7, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_7" }, - { RAND_INF_GF_FAIRY_GROTTO_FAIRY_8, "RAND_INF_GF_FAIRY_GROTTO_FAIRY_8" }, - { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_1" }, - { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_2" }, - { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_3, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_3" }, - { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_4, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_4" }, - { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_5, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_5" }, - { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_6" }, - { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_7" }, - { RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, "RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_8" }, - { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_1, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_1" }, - { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_2, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_2" }, - { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_3, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_3" }, - { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_4, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_4" }, - { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_5, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_5" }, - { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_6, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_6" }, - { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_7, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_7" }, - { RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_8, "RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_8" }, - { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1" }, - { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2" }, - { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3" }, - { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4" }, - { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5" }, - { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6" }, - { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7" }, - { RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, "RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8" }, - { RAND_INF_COLOSSUS_OASIS_FAIRY_1, "RAND_INF_COLOSSUS_OASIS_FAIRY_1" }, - { RAND_INF_COLOSSUS_OASIS_FAIRY_2, "RAND_INF_COLOSSUS_OASIS_FAIRY_2" }, - { RAND_INF_COLOSSUS_OASIS_FAIRY_3, "RAND_INF_COLOSSUS_OASIS_FAIRY_3" }, - { RAND_INF_COLOSSUS_OASIS_FAIRY_4, "RAND_INF_COLOSSUS_OASIS_FAIRY_4" }, - { RAND_INF_COLOSSUS_OASIS_FAIRY_5, "RAND_INF_COLOSSUS_OASIS_FAIRY_5" }, - { RAND_INF_COLOSSUS_OASIS_FAIRY_6, "RAND_INF_COLOSSUS_OASIS_FAIRY_6" }, - { RAND_INF_COLOSSUS_OASIS_FAIRY_7, "RAND_INF_COLOSSUS_OASIS_FAIRY_7" }, - { RAND_INF_COLOSSUS_OASIS_FAIRY_8, "RAND_INF_COLOSSUS_OASIS_FAIRY_8" }, - - { RAND_INF_ZR_BEAN_SPROUT_FAIRY_1, "RAND_INF_ZR_BEAN_SPROUT_FAIRY_1" }, - { RAND_INF_ZR_BEAN_SPROUT_FAIRY_2, "RAND_INF_ZR_BEAN_SPROUT_FAIRY_2" }, - { RAND_INF_ZR_BEAN_SPROUT_FAIRY_3, "RAND_INF_ZR_BEAN_SPROUT_FAIRY_3" }, - { RAND_INF_KF_BEAN_SPROUT_FAIRY_1, "RAND_INF_KF_BEAN_SPROUT_FAIRY_1" }, - { RAND_INF_KF_BEAN_SPROUT_FAIRY_2, "RAND_INF_KF_BEAN_SPROUT_FAIRY_2" }, - { RAND_INF_KF_BEAN_SPROUT_FAIRY_3, "RAND_INF_KF_BEAN_SPROUT_FAIRY_3" }, - { RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, "RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1" }, - { RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, "RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2" }, - { RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, "RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3" }, - { RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, "RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1" }, - { RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, "RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2" }, - { RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, "RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3" }, - { RAND_INF_LH_BEAN_SPROUT_FAIRY_1, "RAND_INF_LH_BEAN_SPROUT_FAIRY_1" }, - { RAND_INF_LH_BEAN_SPROUT_FAIRY_2, "RAND_INF_LH_BEAN_SPROUT_FAIRY_2" }, - { RAND_INF_LH_BEAN_SPROUT_FAIRY_3, "RAND_INF_LH_BEAN_SPROUT_FAIRY_3" }, - { RAND_INF_GV_BEAN_SPROUT_FAIRY_1, "RAND_INF_GV_BEAN_SPROUT_FAIRY_1" }, - { RAND_INF_GV_BEAN_SPROUT_FAIRY_2, "RAND_INF_GV_BEAN_SPROUT_FAIRY_2" }, - { RAND_INF_GV_BEAN_SPROUT_FAIRY_3, "RAND_INF_GV_BEAN_SPROUT_FAIRY_3" }, - { RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_1, "RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_1" }, - { RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_2, "RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_2" }, - { RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_3, "RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_3" }, - { RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_1, "RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_1" }, - { RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_2, "RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_2" }, - { RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_3, "RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_3" }, - { RAND_INF_DMC_BEAN_SPROUT_FAIRY_1, "RAND_INF_DMC_BEAN_SPROUT_FAIRY_1" }, - { RAND_INF_DMC_BEAN_SPROUT_FAIRY_2, "RAND_INF_DMC_BEAN_SPROUT_FAIRY_2" }, - { RAND_INF_DMC_BEAN_SPROUT_FAIRY_3, "RAND_INF_DMC_BEAN_SPROUT_FAIRY_3" }, - { RAND_INF_DMT_BEAN_SPROUT_FAIRY_1, "RAND_INF_DMT_BEAN_SPROUT_FAIRY_1" }, - { RAND_INF_DMT_BEAN_SPROUT_FAIRY_2, "RAND_INF_DMT_BEAN_SPROUT_FAIRY_2" }, - { RAND_INF_DMT_BEAN_SPROUT_FAIRY_3, "RAND_INF_DMT_BEAN_SPROUT_FAIRY_3" }, - - { RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, "RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY" }, - { RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, "RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY" }, - { RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, "RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY" }, - { RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, "RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY" }, - { RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_DMC_GOSSIP_STONE_FAIRY, "RAND_INF_DMC_GOSSIP_STONE_FAIRY" }, - { RAND_INF_DMC_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DMC_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_DMT_GOSSIP_STONE_FAIRY, "RAND_INF_DMT_GOSSIP_STONE_FAIRY" }, - { RAND_INF_DMT_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DMT_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY, "RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY" }, - { RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, "RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY" }, - { RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, "RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY" }, - { RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_GV_GOSSIP_STONE_FAIRY, "RAND_INF_GV_GOSSIP_STONE_FAIRY" }, - { RAND_INF_GV_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_GV_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY, "RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY" }, - { RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY, "RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY" }, - { RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY, "RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY" }, - { RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY, "RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY" }, - { RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, "RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY" }, - { RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, "RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY" }, - { RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY, "RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY" }, - { RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_KF_GOSSIP_STONE_FAIRY, "RAND_INF_KF_GOSSIP_STONE_FAIRY" }, - { RAND_INF_KF_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_KF_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY, "RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY" }, - { RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, "RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY" }, - { RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, "RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY" }, - { RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_LW_GOSSIP_STONE_FAIRY, "RAND_INF_LW_GOSSIP_STONE_FAIRY" }, - { RAND_INF_LW_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_LW_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, "RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY" }, - { RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY, "RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY" }, - { RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY, "RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY" }, - { RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_ZD_GOSSIP_STONE_FAIRY, "RAND_INF_ZD_GOSSIP_STONE_FAIRY" }, - { RAND_INF_ZD_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZD_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY, "RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY" }, - { RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY, "RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY" }, - { RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, "RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY" }, - { RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, "RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY" }, - { RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, - "RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, - "RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, - "RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, - "RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - { RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, "RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY" }, - { RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, "RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG" }, - - { RAND_INF_LH_ISLAND_SUN_FAIRY, "RAND_INF_LH_ISLAND_SUN_FAIRY" }, - { RAND_INF_HF_POND_STORMS_FAIRY, "RAND_INF_HF_POND_STORMS_FAIRY" }, - { RAND_INF_DMT_FLAG_SUN_FAIRY, "RAND_INF_DMT_FLAG_SUN_FAIRY" }, - { RAND_INF_LW_SHORTCUT_STORMS_FAIRY, "RAND_INF_LW_SHORTCUT_STORMS_FAIRY" }, - { RAND_INF_GF_KITCHEN_SUN_FAIRY, "RAND_INF_GF_KITCHEN_SUN_FAIRY" }, - { RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, "RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY" }, - { RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, "RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY" }, - { RAND_INF_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, "RAND_INF_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY" }, - { RAND_INF_SHADOW_TEMPLE_PIT_STORM_FAIRY, "RAND_INF_SHADOW_TEMPLE_PIT_STORM_FAIRY" }, - { RAND_INF_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, "RAND_INF_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY" }, - { RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, "RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY" }, - { RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, "RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY" }, - { RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, - "RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY" }, - { RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, "RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY" }, - { RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, "RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY" }, - { RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, "RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY" }, - { RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, "RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY" }, - { RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, - "RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY" }, - { RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, "RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY" }, - { RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, "RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY" }, - { RAND_INF_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, "RAND_INF_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY" }, - { RAND_INF_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, "RAND_INF_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY" }, - { RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, "RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY" }, - { RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, "RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY" }, - - { RAND_INF_GUARD_HOUSE_UNLOCKED, "RAND_INF_GUARD_HOUSE_UNLOCKED" }, - { RAND_INF_GUARD_HOUSE_KEY_OBTAINED, "RAND_INF_GUARD_HOUSE_KEY_OBTAINED" }, - { RAND_INF_MARKET_BAZAAR_UNLOCKED, "RAND_INF_MARKET_BAZAAR_UNLOCKED" }, - { RAND_INF_MARKET_BAZAAR_KEY_OBTAINED, "RAND_INF_MARKET_BAZAAR_KEY_OBTAINED" }, - { RAND_INF_MARKET_POTION_SHOP_UNLOCKED, "RAND_INF_MARKET_POTION_SHOP_UNLOCKED" }, - { RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED, "RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED" }, - { RAND_INF_MASK_SHOP_UNLOCKED, "RAND_INF_MASK_SHOP_UNLOCKED" }, - { RAND_INF_MASK_SHOP_KEY_OBTAINED, "RAND_INF_MASK_SHOP_KEY_OBTAINED" }, - { RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED, "RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED" }, - { RAND_INF_MARKET_SHOOTING_GALLERY_KEY_OBTAINED, "RAND_INF_MARKET_SHOOTING_GALLERY_KEY_OBTAINED" }, - { RAND_INF_BOMBCHU_BOWLING_UNLOCKED, "RAND_INF_BOMBCHU_BOWLING_UNLOCKED" }, - { RAND_INF_BOMBCHU_BOWLING_KEY_OBTAINED, "RAND_INF_BOMBCHU_BOWLING_KEY_OBTAINED" }, - { RAND_INF_TREASURE_CHEST_GAME_BUILDING_UNLOCKED, "RAND_INF_TREASURE_CHEST_GAME_BUILDING_UNLOCKED" }, - { RAND_INF_TREASURE_CHEST_GAME_BUILDING_KEY_OBTAINED, "RAND_INF_TREASURE_CHEST_GAME_BUILDING_KEY_OBTAINED" }, - { RAND_INF_BOMBCHU_SHOP_UNLOCKED, "RAND_INF_BOMBCHU_SHOP_UNLOCKED" }, - { RAND_INF_BOMBCHU_SHOP_KEY_OBTAINED, "RAND_INF_BOMBCHU_SHOP_KEY_OBTAINED" }, - { RAND_INF_RICHARDS_HOUSE_UNLOCKED, "RAND_INF_RICHARDS_HOUSE_UNLOCKED" }, - { RAND_INF_RICHARDS_HOUSE_KEY_OBTAINED, "RAND_INF_RICHARDS_HOUSE_KEY_OBTAINED" }, - { RAND_INF_ALLEY_HOUSE_UNLOCKED, "RAND_INF_ALLEY_HOUSE_UNLOCKED" }, - { RAND_INF_ALLEY_HOUSE_KEY_OBTAINED, "RAND_INF_ALLEY_HOUSE_KEY_OBTAINED" }, - { RAND_INF_KAK_BAZAAR_UNLOCKED, "RAND_INF_KAK_BAZAAR_UNLOCKED" }, - { RAND_INF_KAK_BAZAAR_KEY_OBTAINED, "RAND_INF_KAK_BAZAAR_KEY_OBTAINED" }, - { RAND_INF_KAK_POTION_SHOP_UNLOCKED, "RAND_INF_KAK_POTION_SHOP_UNLOCKED" }, - { RAND_INF_KAK_POTION_SHOP_KEY_OBTAINED, "RAND_INF_KAK_POTION_SHOP_KEY_OBTAINED" }, - { RAND_INF_BOSS_HOUSE_UNLOCKED, "RAND_INF_BOSS_HOUSE_UNLOCKED" }, - { RAND_INF_BOSS_HOUSE_KEY_OBTAINED, "RAND_INF_BOSS_HOUSE_KEY_OBTAINED" }, - { RAND_INF_GRANNYS_POTION_SHOP_UNLOCKED, "RAND_INF_GRANNYS_POTION_SHOP_UNLOCKED" }, - { RAND_INF_GRANNYS_POTION_SHOP_KEY_OBTAINED, "RAND_INF_GRANNYS_POTION_SHOP_KEY_OBTAINED" }, - { RAND_INF_SKULLTULA_HOUSE_UNLOCKED, "RAND_INF_SKULLTULA_HOUSE_UNLOCKED" }, - { RAND_INF_SKULLTULA_HOUSE_KEY_OBTAINED, "RAND_INF_SKULLTULA_HOUSE_KEY_OBTAINED" }, - { RAND_INF_IMPAS_HOUSE_UNLOCKED, "RAND_INF_IMPAS_HOUSE_UNLOCKED" }, - { RAND_INF_IMPAS_HOUSE_KEY_OBTAINED, "RAND_INF_IMPAS_HOUSE_KEY_OBTAINED" }, - { RAND_INF_WINDMILL_UNLOCKED, "RAND_INF_WINDMILL_UNLOCKED" }, - { RAND_INF_WINDMILL_KEY_OBTAINED, "RAND_INF_WINDMILL_KEY_OBTAINED" }, - { RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED, "RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED" }, - { RAND_INF_KAK_SHOOTING_GALLERY_KEY_OBTAINED, "RAND_INF_KAK_SHOOTING_GALLERY_KEY_OBTAINED" }, - { RAND_INF_DAMPES_HUT_UNLOCKED, "RAND_INF_DAMPES_HUT_UNLOCKED" }, - { RAND_INF_DAMPES_HUT_KEY_OBTAINED, "RAND_INF_DAMPES_HUT_KEY_OBTAINED" }, - { RAND_INF_TALONS_HOUSE_UNLOCKED, "RAND_INF_TALONS_HOUSE_UNLOCKED" }, - { RAND_INF_TALONS_HOUSE_KEY_OBTAINED, "RAND_INF_TALONS_HOUSE_KEY_OBTAINED" }, - { RAND_INF_STABLES_UNLOCKED, "RAND_INF_STABLES_UNLOCKED" }, - { RAND_INF_STABLES_KEY_OBTAINED, "RAND_INF_STABLES_KEY_OBTAINED" }, - { RAND_INF_BACK_TOWER_UNLOCKED, "RAND_INF_BACK_TOWER_UNLOCKED" }, - { RAND_INF_BACK_TOWER_KEY_OBTAINED, "RAND_INF_BACK_TOWER_KEY_OBTAINED" }, - { RAND_INF_HYLIA_LAB_UNLOCKED, "RAND_INF_HYLIA_LAB_UNLOCKED" }, - { RAND_INF_HYLIA_LAB_KEY_OBTAINED, "RAND_INF_HYLIA_LAB_KEY_OBTAINED" }, - { RAND_INF_FISHING_HOLE_UNLOCKED, "RAND_INF_FISHING_HOLE_UNLOCKED" }, - { RAND_INF_FISHING_HOLE_KEY_OBTAINED, "RAND_INF_FISHING_HOLE_KEY_OBTAINED" }, - - { RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG, "RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG" }, - { RAND_INF_CHILD_TRADES_HAS_CHICKEN, "RAND_INF_CHILD_TRADES_HAS_CHICKEN" }, - { RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA, "RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA" }, - { RAND_INF_CHILD_TRADES_HAS_MASK_KEATON, "RAND_INF_CHILD_TRADES_HAS_MASK_KEATON" }, - { RAND_INF_CHILD_TRADES_HAS_MASK_SKULL, "RAND_INF_CHILD_TRADES_HAS_MASK_SKULL" }, - { RAND_INF_CHILD_TRADES_HAS_MASK_SPOOKY, "RAND_INF_CHILD_TRADES_HAS_MASK_SPOOKY" }, - { RAND_INF_CHILD_TRADES_HAS_MASK_BUNNY, "RAND_INF_CHILD_TRADES_HAS_MASK_BUNNY" }, - { RAND_INF_CHILD_TRADES_HAS_MASK_GORON, "RAND_INF_CHILD_TRADES_HAS_MASK_GORON" }, - { RAND_INF_CHILD_TRADES_HAS_MASK_ZORA, "RAND_INF_CHILD_TRADES_HAS_MASK_ZORA" }, - { RAND_INF_CHILD_TRADES_HAS_MASK_GERUDO, "RAND_INF_CHILD_TRADES_HAS_MASK_GERUDO" }, - { RAND_INF_CHILD_TRADES_HAS_MASK_TRUTH, "RAND_INF_CHILD_TRADES_HAS_MASK_TRUTH" }, - - { RAND_INF_ADULT_TRADES_HAS_POCKET_EGG, "RAND_INF_ADULT_TRADES_HAS_POCKET_EGG" }, - { RAND_INF_ADULT_TRADES_HAS_POCKET_CUCCO, "RAND_INF_ADULT_TRADES_HAS_POCKET_CUCCO" }, - { RAND_INF_ADULT_TRADES_HAS_COJIRO, "RAND_INF_ADULT_TRADES_HAS_COJIRO" }, - { RAND_INF_ADULT_TRADES_HAS_ODD_MUSHROOM, "RAND_INF_ADULT_TRADES_HAS_ODD_MUSHROOM" }, - { RAND_INF_ADULT_TRADES_HAS_ODD_POTION, "RAND_INF_ADULT_TRADES_HAS_ODD_POTION" }, - { RAND_INF_ADULT_TRADES_HAS_SAW, "RAND_INF_ADULT_TRADES_HAS_SAW" }, - { RAND_INF_ADULT_TRADES_HAS_SWORD_BROKEN, "RAND_INF_ADULT_TRADES_HAS_SWORD_BROKEN" }, - { RAND_INF_ADULT_TRADES_HAS_PRESCRIPTION, "RAND_INF_ADULT_TRADES_HAS_PRESCRIPTION" }, - { RAND_INF_ADULT_TRADES_HAS_FROG, "RAND_INF_ADULT_TRADES_HAS_FROG" }, - { RAND_INF_ADULT_TRADES_HAS_EYEDROPS, "RAND_INF_ADULT_TRADES_HAS_EYEDROPS" }, - { RAND_INF_ADULT_TRADES_HAS_CLAIM_CHECK, "RAND_INF_ADULT_TRADES_HAS_CLAIM_CHECK" }, +#include "soh/Enhancements/randomizer/randomizer_inf.h" } }, }; +#undef DEFINE_RAND_INF + const std::vector state1 = { "Loading", "Swinging Bottle", diff --git a/soh/soh/Enhancements/randomizer/ShuffleFairies.h b/soh/soh/Enhancements/randomizer/ShuffleFairies.h index 9fcd9ba52..2b29a6146 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleFairies.h +++ b/soh/soh/Enhancements/randomizer/ShuffleFairies.h @@ -2,7 +2,7 @@ #include #include "soh/Enhancements/item-tables/ItemTableTypes.h" -#include "randomizer_inf.h" +#include "randomizerTypes.h" typedef struct FairyIdentity { RandomizerInf randomizerInf; diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 941402dbb..43935bc8e 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -2,7 +2,6 @@ #include #include "z64item.h" -#include "randomizer_inf.h" #define MAX_TRICK_NAME_SIZE 50 @@ -214,6 +213,15 @@ typedef enum { LOGIC_MAX } LogicVal; +#define DEFINE_RAND_INF(enum) enum, + +typedef enum { +#include "randomizer_inf.h" + RAND_INF_MAX, +} RandomizerInf; + +#undef DEFINE_RAND_INF + typedef enum { RA_NONE, RA_LINKS_POCKET, diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 1e92acbef..f36a7f8b8 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -1,1962 +1,1954 @@ -#pragma once +DEFINE_RAND_INF(RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE) +DEFINE_RAND_INF(RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE) -typedef enum { - RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE, - RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE, +DEFINE_RAND_INF(RAND_INF_COWS_MILKED_KF_LINKS_HOUSE_COW) +DEFINE_RAND_INF(RAND_INF_COWS_MILKED_HF_COW_GROTTO_COW) +DEFINE_RAND_INF(RAND_INF_COWS_MILKED_LLR_STABLES_LEFT_COW) +DEFINE_RAND_INF(RAND_INF_COWS_MILKED_LLR_STABLES_RIGHT_COW) +DEFINE_RAND_INF(RAND_INF_COWS_MILKED_LLR_TOWER_LEFT_COW) +DEFINE_RAND_INF(RAND_INF_COWS_MILKED_LLR_TOWER_RIGHT_COW) +DEFINE_RAND_INF(RAND_INF_COWS_MILKED_KAK_IMPAS_HOUSE_COW) +DEFINE_RAND_INF(RAND_INF_COWS_MILKED_DMT_COW_GROTTO_COW) +DEFINE_RAND_INF(RAND_INF_COWS_MILKED_GV_COW) +DEFINE_RAND_INF(RAND_INF_COWS_MILKED_JABU_JABUS_BELLY_MQ_COW) - RAND_INF_COWS_MILKED_KF_LINKS_HOUSE_COW, - RAND_INF_COWS_MILKED_HF_COW_GROTTO_COW, - RAND_INF_COWS_MILKED_LLR_STABLES_LEFT_COW, - RAND_INF_COWS_MILKED_LLR_STABLES_RIGHT_COW, - RAND_INF_COWS_MILKED_LLR_TOWER_LEFT_COW, - RAND_INF_COWS_MILKED_LLR_TOWER_RIGHT_COW, - RAND_INF_COWS_MILKED_KAK_IMPAS_HOUSE_COW, - RAND_INF_COWS_MILKED_DMT_COW_GROTTO_COW, - RAND_INF_COWS_MILKED_GV_COW, - RAND_INF_COWS_MILKED_JABU_JABUS_BELLY_MQ_COW, +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_JABU_JABUS_BELLY_DEKU_SCRUB) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_RIGHT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_LEFT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_HF_DEKU_SCRUB_GROTTO) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_REAR) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_FRONT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_REAR) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_FRONT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_LEFT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_RIGHT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_CENTER) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_REAR) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_FRONT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_REAR) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_FRONT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_LEFT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_RIGHT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_CENTER) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_LEFT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_RIGHT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_CENTER) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_LEFT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_RIGHT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_CENTER) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_REAR) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_BRIDGE) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_DEKU_TREE_MQ_DEKU_SCRUB) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT) +DEFINE_RAND_INF(RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT) - RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, - RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, - RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, - RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, - RAND_INF_SCRUBS_PURCHASED_JABU_JABUS_BELLY_DEKU_SCRUB, - RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, - RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, - RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_RIGHT, - RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_DEKU_SCRUB_LEFT, - RAND_INF_SCRUBS_PURCHASED_HF_DEKU_SCRUB_GROTTO, - RAND_INF_SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_REAR, - RAND_INF_SCRUBS_PURCHASED_ZR_DEKU_SCRUB_GROTTO_FRONT, - RAND_INF_SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_REAR, - RAND_INF_SCRUBS_PURCHASED_SFM_DEKU_SCRUB_GROTTO_FRONT, - RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_LEFT, - RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_RIGHT, - RAND_INF_SCRUBS_PURCHASED_LH_DEKU_SCRUB_GROTTO_CENTER, - RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_REAR, - RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_FRONT, - RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_REAR, - RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_GROTTO_FRONT, - RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_LEFT, - RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_RIGHT, - RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB_GROTTO_CENTER, - RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_LEFT, - RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_RIGHT, - RAND_INF_SCRUBS_PURCHASED_GC_DEKU_SCRUB_GROTTO_CENTER, - RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_LEFT, - RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_RIGHT, - RAND_INF_SCRUBS_PURCHASED_LLR_DEKU_SCRUB_GROTTO_CENTER, - RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, - RAND_INF_SCRUBS_PURCHASED_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, - RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, - RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, - RAND_INF_SCRUBS_PURCHASED_LW_DEKU_SCRUB_NEAR_BRIDGE, - RAND_INF_SCRUBS_PURCHASED_DMC_DEKU_SCRUB, - RAND_INF_SCRUBS_PURCHASED_DEKU_TREE_MQ_DEKU_SCRUB, - RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, - RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, - RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, - RAND_INF_SCRUBS_PURCHASED_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, - RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, - RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, - RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, - RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, - RAND_INF_SCRUBS_PURCHASED_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_2) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_3) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_4) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_5) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_6) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_7) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_8) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_1) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_2) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_3) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_4) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_5) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_6) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_7) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_8) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_1) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_2) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_3) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_4) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_5) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_6) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_7) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_8) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_1) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_2) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_3) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_4) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_5) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_6) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_7) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_8) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_1) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_2) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_3) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_4) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_5) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_6) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_7) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_8) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_1) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_2) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_3) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_4) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_5) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_6) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_7) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_8) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_1) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_2) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_3) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_4) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_5) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_6) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_7) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_8) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_1) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_2) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_3) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_4) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_5) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_6) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_7) +DEFINE_RAND_INF(RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_8) - RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1, - RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_2, - RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_3, - RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_4, - RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_5, - RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_6, - RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_7, - RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_8, - RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_1, - RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_2, - RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_3, - RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_4, - RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_5, - RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_6, - RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_7, - RAND_INF_SHOP_ITEMS_GC_SHOP_ITEM_8, - RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_1, - RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_2, - RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_3, - RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_4, - RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_5, - RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_6, - RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_7, - RAND_INF_SHOP_ITEMS_ZD_SHOP_ITEM_8, - RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_1, - RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_2, - RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_3, - RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_4, - RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_5, - RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_6, - RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_7, - RAND_INF_SHOP_ITEMS_KAK_BAZAAR_ITEM_8, - RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_1, - RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_2, - RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_3, - RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_4, - RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_5, - RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_6, - RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_7, - RAND_INF_SHOP_ITEMS_KAK_POTION_SHOP_ITEM_8, - RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_1, - RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_2, - RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_3, - RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_4, - RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_5, - RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_6, - RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_7, - RAND_INF_SHOP_ITEMS_MARKET_BAZAAR_ITEM_8, - RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_1, - RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_2, - RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_3, - RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_4, - RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_5, - RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_6, - RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_7, - RAND_INF_SHOP_ITEMS_MARKET_POTION_SHOP_ITEM_8, - RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_1, - RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_2, - RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_3, - RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_4, - RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_5, - RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_6, - RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_7, - RAND_INF_SHOP_ITEMS_MARKET_BOMBCHU_SHOP_ITEM_8, +DEFINE_RAND_INF(RAND_INF_MERCHANTS_CARPET_SALESMAN) +DEFINE_RAND_INF(RAND_INF_MERCHANTS_MEDIGORON) +DEFINE_RAND_INF(RAND_INF_MERCHANTS_GRANNYS_SHOP) +DEFINE_RAND_INF(RAND_INF_MERCHANTS_MAGIC_BEAN_SALESMAN) - RAND_INF_MERCHANTS_CARPET_SALESMAN, - RAND_INF_MERCHANTS_MEDIGORON, - RAND_INF_MERCHANTS_GRANNYS_SHOP, - RAND_INF_MERCHANTS_MAGIC_BEAN_SALESMAN, +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_LW_TRADE_COJIRO) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_GV_TRADE_SAW) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_DMT_TRADE_BROKEN_SWORD) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_ZD_TRADE_PRESCRIPTION) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_LH_TRADE_FROG) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_DMT_TRADE_EYEDROPS) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_DMT_TRADE_CLAIM_CHECK) - RAND_INF_ADULT_TRADES_LW_TRADE_COJIRO, - RAND_INF_ADULT_TRADES_GV_TRADE_SAW, - RAND_INF_ADULT_TRADES_DMT_TRADE_BROKEN_SWORD, - RAND_INF_ADULT_TRADES_ZD_TRADE_PRESCRIPTION, - RAND_INF_ADULT_TRADES_LH_TRADE_FROG, - RAND_INF_ADULT_TRADES_DMT_TRADE_EYEDROPS, - RAND_INF_ADULT_TRADES_DMT_TRADE_CLAIM_CHECK, +DEFINE_RAND_INF(RAND_INF_KAK_100_GOLD_SKULLTULA_REWARD) - RAND_INF_KAK_100_GOLD_SKULLTULA_REWARD, +DEFINE_RAND_INF(RAND_INF_GREG_FOUND) - RAND_INF_GREG_FOUND, +DEFINE_RAND_INF(RAND_INF_TOT_MASTER_SWORD) - RAND_INF_TOT_MASTER_SWORD, +DEFINE_RAND_INF(RAND_INF_CHILD_FISHING) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_1) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_2) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_3) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_4) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_5) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_6) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_7) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_8) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_9) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_10) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_11) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_12) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_13) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_14) +DEFINE_RAND_INF(RAND_INF_CHILD_FISH_15) +DEFINE_RAND_INF(RAND_INF_CHILD_LOACH_1) +DEFINE_RAND_INF(RAND_INF_CHILD_LOACH_2) +DEFINE_RAND_INF(RAND_INF_ADULT_FISHING) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_1) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_2) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_3) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_4) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_5) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_6) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_7) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_8) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_9) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_10) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_11) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_12) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_13) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_14) +DEFINE_RAND_INF(RAND_INF_ADULT_FISH_15) +DEFINE_RAND_INF(RAND_INF_ADULT_LOACH) - RAND_INF_CHILD_FISHING, - RAND_INF_CHILD_FISH_1, - RAND_INF_CHILD_FISH_2, - RAND_INF_CHILD_FISH_3, - RAND_INF_CHILD_FISH_4, - RAND_INF_CHILD_FISH_5, - RAND_INF_CHILD_FISH_6, - RAND_INF_CHILD_FISH_7, - RAND_INF_CHILD_FISH_8, - RAND_INF_CHILD_FISH_9, - RAND_INF_CHILD_FISH_10, - RAND_INF_CHILD_FISH_11, - RAND_INF_CHILD_FISH_12, - RAND_INF_CHILD_FISH_13, - RAND_INF_CHILD_FISH_14, - RAND_INF_CHILD_FISH_15, - RAND_INF_CHILD_LOACH_1, - RAND_INF_CHILD_LOACH_2, - RAND_INF_ADULT_FISHING, - RAND_INF_ADULT_FISH_1, - RAND_INF_ADULT_FISH_2, - RAND_INF_ADULT_FISH_3, - RAND_INF_ADULT_FISH_4, - RAND_INF_ADULT_FISH_5, - RAND_INF_ADULT_FISH_6, - RAND_INF_ADULT_FISH_7, - RAND_INF_ADULT_FISH_8, - RAND_INF_ADULT_FISH_9, - RAND_INF_ADULT_FISH_10, - RAND_INF_ADULT_FISH_11, - RAND_INF_ADULT_FISH_12, - RAND_INF_ADULT_FISH_13, - RAND_INF_ADULT_FISH_14, - RAND_INF_ADULT_FISH_15, - RAND_INF_ADULT_LOACH, +DEFINE_RAND_INF(RAND_INF_10_BIG_POES) +DEFINE_RAND_INF(RAND_INF_GRANT_GANONS_BOSSKEY) - RAND_INF_10_BIG_POES, - RAND_INF_GRANT_GANONS_BOSSKEY, +DEFINE_RAND_INF(RAND_INF_GOHMA_SOUL) +DEFINE_RAND_INF(RAND_INF_KING_DODONGO_SOUL) +DEFINE_RAND_INF(RAND_INF_BARINADE_SOUL) +DEFINE_RAND_INF(RAND_INF_PHANTOM_GANON_SOUL) +DEFINE_RAND_INF(RAND_INF_VOLVAGIA_SOUL) +DEFINE_RAND_INF(RAND_INF_MORPHA_SOUL) +DEFINE_RAND_INF(RAND_INF_BONGO_BONGO_SOUL) +DEFINE_RAND_INF(RAND_INF_TWINROVA_SOUL) +DEFINE_RAND_INF(RAND_INF_GANON_SOUL) - RAND_INF_GOHMA_SOUL, - RAND_INF_KING_DODONGO_SOUL, - RAND_INF_BARINADE_SOUL, - RAND_INF_PHANTOM_GANON_SOUL, - RAND_INF_VOLVAGIA_SOUL, - RAND_INF_MORPHA_SOUL, - RAND_INF_BONGO_BONGO_SOUL, - RAND_INF_TWINROVA_SOUL, - RAND_INF_GANON_SOUL, +DEFINE_RAND_INF(RAND_INF_HAS_OCARINA_A) +DEFINE_RAND_INF(RAND_INF_HAS_OCARINA_C_UP) +DEFINE_RAND_INF(RAND_INF_HAS_OCARINA_C_DOWN) +DEFINE_RAND_INF(RAND_INF_HAS_OCARINA_C_LEFT) +DEFINE_RAND_INF(RAND_INF_HAS_OCARINA_C_RIGHT) - RAND_INF_HAS_OCARINA_A, - RAND_INF_HAS_OCARINA_C_UP, - RAND_INF_HAS_OCARINA_C_DOWN, - RAND_INF_HAS_OCARINA_C_LEFT, - RAND_INF_HAS_OCARINA_C_RIGHT, +DEFINE_RAND_INF(RAND_INF_KF_LINKS_HOUSE_POT) +DEFINE_RAND_INF(RAND_INF_KF_TWINS_HOUSE_POT_1) +DEFINE_RAND_INF(RAND_INF_KF_TWINS_HOUSE_POT_2) +DEFINE_RAND_INF(RAND_INF_KF_BROTHERS_HOUSE_POT_1) +DEFINE_RAND_INF(RAND_INF_KF_BROTHERS_HOUSE_POT_2) +DEFINE_RAND_INF(RAND_INF_GF_BREAK_ROOM_POT_1) +DEFINE_RAND_INF(RAND_INF_GF_BREAK_ROOM_POT_2) +DEFINE_RAND_INF(RAND_INF_GF_KITCHEN_POT_1) +DEFINE_RAND_INF(RAND_INF_GF_KITCHEN_POT_2) +DEFINE_RAND_INF(RAND_INF_GF_NORTH_F1_CARPENTER_POT_1) +DEFINE_RAND_INF(RAND_INF_GF_NORTH_F1_CARPENTER_POT_2) +DEFINE_RAND_INF(RAND_INF_GF_NORTH_F1_CARPENTER_POT_3) +DEFINE_RAND_INF(RAND_INF_GF_NORTH_F2_CARPENTER_POT_1) +DEFINE_RAND_INF(RAND_INF_GF_NORTH_F2_CARPENTER_POT_2) +DEFINE_RAND_INF(RAND_INF_GF_SOUTH_F1_CARPENTER_POT_1) +DEFINE_RAND_INF(RAND_INF_GF_SOUTH_F1_CARPENTER_POT_2) +DEFINE_RAND_INF(RAND_INF_GF_SOUTH_F1_CARPENTER_POT_3) +DEFINE_RAND_INF(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_1) +DEFINE_RAND_INF(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_2) +DEFINE_RAND_INF(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_3) +DEFINE_RAND_INF(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_4) +DEFINE_RAND_INF(RAND_INF_WASTELAND_NEAR_GS_POT_1) +DEFINE_RAND_INF(RAND_INF_WASTELAND_NEAR_GS_POT_2) +DEFINE_RAND_INF(RAND_INF_WASTELAND_NEAR_GS_POT_3) +DEFINE_RAND_INF(RAND_INF_WASTELAND_NEAR_GS_POT_4) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_1) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_2) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_3) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_4) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_5) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_6) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_7) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_8) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_9) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_10) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_11) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_12) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_13) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_14) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_15) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_16) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_17) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_18) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_19) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_20) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_21) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_22) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_23) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_24) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_25) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_26) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_27) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_28) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_29) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_30) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_31) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_32) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_33) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_34) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_35) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_36) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_37) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_38) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_39) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_40) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_41) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_42) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_43) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_44) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_1) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_2) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_3) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_4) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_5) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_6) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_7) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_8) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_9) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_10) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_11) +DEFINE_RAND_INF(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_1) +DEFINE_RAND_INF(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_2) +DEFINE_RAND_INF(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_3) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_POTION_SHOP_POT_1) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_POTION_SHOP_POT_2) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_POTION_SHOP_POT_3) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_1) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_2) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_3) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_1) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_2) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_3) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_1) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_2) +DEFINE_RAND_INF(RAND_INF_GY_DAMPES_GRAVE_POT_1) +DEFINE_RAND_INF(RAND_INF_GY_DAMPES_GRAVE_POT_2) +DEFINE_RAND_INF(RAND_INF_GY_DAMPES_GRAVE_POT_3) +DEFINE_RAND_INF(RAND_INF_GY_DAMPES_GRAVE_POT_4) +DEFINE_RAND_INF(RAND_INF_GY_DAMPES_GRAVE_POT_5) +DEFINE_RAND_INF(RAND_INF_GY_DAMPES_GRAVE_POT_6) +DEFINE_RAND_INF(RAND_INF_GC_LOWER_STAIRCASE_POT_1) +DEFINE_RAND_INF(RAND_INF_GC_LOWER_STAIRCASE_POT_2) +DEFINE_RAND_INF(RAND_INF_GC_UPPER_STAIRCASE_POT_1) +DEFINE_RAND_INF(RAND_INF_GC_UPPER_STAIRCASE_POT_2) +DEFINE_RAND_INF(RAND_INF_GC_UPPER_STAIRCASE_POT_3) +DEFINE_RAND_INF(RAND_INF_GC_MEDIGORON_POT_1) +DEFINE_RAND_INF(RAND_INF_GC_DARUNIA_POT_1) +DEFINE_RAND_INF(RAND_INF_GC_DARUNIA_POT_2) +DEFINE_RAND_INF(RAND_INF_GC_DARUNIA_POT_3) +DEFINE_RAND_INF(RAND_INF_DMC_NEAR_GC_POT_1) +DEFINE_RAND_INF(RAND_INF_DMC_NEAR_GC_POT_2) +DEFINE_RAND_INF(RAND_INF_DMC_NEAR_GC_POT_3) +DEFINE_RAND_INF(RAND_INF_DMC_NEAR_GC_POT_4) +DEFINE_RAND_INF(RAND_INF_ZD_NEAR_SHOP_POT_1) +DEFINE_RAND_INF(RAND_INF_ZD_NEAR_SHOP_POT_2) +DEFINE_RAND_INF(RAND_INF_ZD_NEAR_SHOP_POT_3) +DEFINE_RAND_INF(RAND_INF_ZD_NEAR_SHOP_POT_4) +DEFINE_RAND_INF(RAND_INF_ZD_NEAR_SHOP_POT_5) +DEFINE_RAND_INF(RAND_INF_ZF_HIDDEN_CAVE_POT_1) +DEFINE_RAND_INF(RAND_INF_ZF_HIDDEN_CAVE_POT_2) +DEFINE_RAND_INF(RAND_INF_ZF_HIDDEN_CAVE_POT_3) +DEFINE_RAND_INF(RAND_INF_ZF_NEAR_JABU_POT_1) +DEFINE_RAND_INF(RAND_INF_ZF_NEAR_JABU_POT_2) +DEFINE_RAND_INF(RAND_INF_ZF_NEAR_JABU_POT_3) +DEFINE_RAND_INF(RAND_INF_ZF_NEAR_JABU_POT_4) +DEFINE_RAND_INF(RAND_INF_LLR_FRONT_POT_1) +DEFINE_RAND_INF(RAND_INF_LLR_FRONT_POT_2) +DEFINE_RAND_INF(RAND_INF_LLR_FRONT_POT_3) +DEFINE_RAND_INF(RAND_INF_LLR_FRONT_POT_4) +DEFINE_RAND_INF(RAND_INF_LLR_RAIN_SHED_POT_1) +DEFINE_RAND_INF(RAND_INF_LLR_RAIN_SHED_POT_2) +DEFINE_RAND_INF(RAND_INF_LLR_RAIN_SHED_POT_3) +DEFINE_RAND_INF(RAND_INF_LLR_TALONS_HOUSE_POT_1) +DEFINE_RAND_INF(RAND_INF_LLR_TALONS_HOUSE_POT_2) +DEFINE_RAND_INF(RAND_INF_LLR_TALONS_HOUSE_POT_3) +DEFINE_RAND_INF(RAND_INF_HF_COW_GROTTO_POT_1) +DEFINE_RAND_INF(RAND_INF_HF_COW_GROTTO_POT_2) +DEFINE_RAND_INF(RAND_INF_HC_STORMS_GROTTO_POT_1) +DEFINE_RAND_INF(RAND_INF_HC_STORMS_GROTTO_POT_2) +DEFINE_RAND_INF(RAND_INF_HC_STORMS_GROTTO_POT_3) +DEFINE_RAND_INF(RAND_INF_HC_STORMS_GROTTO_POT_4) - RAND_INF_KF_LINKS_HOUSE_POT, - RAND_INF_KF_TWINS_HOUSE_POT_1, - RAND_INF_KF_TWINS_HOUSE_POT_2, - RAND_INF_KF_BROTHERS_HOUSE_POT_1, - RAND_INF_KF_BROTHERS_HOUSE_POT_2, - RAND_INF_GF_BREAK_ROOM_POT_1, - RAND_INF_GF_BREAK_ROOM_POT_2, - RAND_INF_GF_KITCHEN_POT_1, - RAND_INF_GF_KITCHEN_POT_2, - RAND_INF_GF_NORTH_F1_CARPENTER_POT_1, - RAND_INF_GF_NORTH_F1_CARPENTER_POT_2, - RAND_INF_GF_NORTH_F1_CARPENTER_POT_3, - RAND_INF_GF_NORTH_F2_CARPENTER_POT_1, - RAND_INF_GF_NORTH_F2_CARPENTER_POT_2, - RAND_INF_GF_SOUTH_F1_CARPENTER_POT_1, - RAND_INF_GF_SOUTH_F1_CARPENTER_POT_2, - RAND_INF_GF_SOUTH_F1_CARPENTER_POT_3, - RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_1, - RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_2, - RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_3, - RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_4, - RAND_INF_WASTELAND_NEAR_GS_POT_1, - RAND_INF_WASTELAND_NEAR_GS_POT_2, - RAND_INF_WASTELAND_NEAR_GS_POT_3, - RAND_INF_WASTELAND_NEAR_GS_POT_4, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_1, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_2, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_3, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_4, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_5, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_6, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_7, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_8, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_9, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_10, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_11, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_12, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_13, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_14, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_15, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_16, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_17, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_18, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_19, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_20, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_21, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_22, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_23, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_24, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_25, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_26, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_27, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_28, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_29, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_30, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_31, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_32, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_33, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_34, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_35, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_36, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_37, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_38, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_39, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_40, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_41, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_42, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_43, - RAND_INF_MK_GUARD_HOUSE_CHILD_POT_44, - RAND_INF_MK_GUARD_HOUSE_ADULT_POT_1, - RAND_INF_MK_GUARD_HOUSE_ADULT_POT_2, - RAND_INF_MK_GUARD_HOUSE_ADULT_POT_3, - RAND_INF_MK_GUARD_HOUSE_ADULT_POT_4, - RAND_INF_MK_GUARD_HOUSE_ADULT_POT_5, - RAND_INF_MK_GUARD_HOUSE_ADULT_POT_6, - RAND_INF_MK_GUARD_HOUSE_ADULT_POT_7, - RAND_INF_MK_GUARD_HOUSE_ADULT_POT_8, - RAND_INF_MK_GUARD_HOUSE_ADULT_POT_9, - RAND_INF_MK_GUARD_HOUSE_ADULT_POT_10, - RAND_INF_MK_GUARD_HOUSE_ADULT_POT_11, - RAND_INF_MK_BACK_ALLEY_HOUSE_POT_1, - RAND_INF_MK_BACK_ALLEY_HOUSE_POT_2, - RAND_INF_MK_BACK_ALLEY_HOUSE_POT_3, - RAND_INF_KAK_NEAR_POTION_SHOP_POT_1, - RAND_INF_KAK_NEAR_POTION_SHOP_POT_2, - RAND_INF_KAK_NEAR_POTION_SHOP_POT_3, - RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_1, - RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_2, - RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_3, - RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_1, - RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_2, - RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_3, - RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_1, - RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_2, - RAND_INF_GY_DAMPES_GRAVE_POT_1, - RAND_INF_GY_DAMPES_GRAVE_POT_2, - RAND_INF_GY_DAMPES_GRAVE_POT_3, - RAND_INF_GY_DAMPES_GRAVE_POT_4, - RAND_INF_GY_DAMPES_GRAVE_POT_5, - RAND_INF_GY_DAMPES_GRAVE_POT_6, - RAND_INF_GC_LOWER_STAIRCASE_POT_1, - RAND_INF_GC_LOWER_STAIRCASE_POT_2, - RAND_INF_GC_UPPER_STAIRCASE_POT_1, - RAND_INF_GC_UPPER_STAIRCASE_POT_2, - RAND_INF_GC_UPPER_STAIRCASE_POT_3, - RAND_INF_GC_MEDIGORON_POT_1, - RAND_INF_GC_DARUNIA_POT_1, - RAND_INF_GC_DARUNIA_POT_2, - RAND_INF_GC_DARUNIA_POT_3, - RAND_INF_DMC_NEAR_GC_POT_1, - RAND_INF_DMC_NEAR_GC_POT_2, - RAND_INF_DMC_NEAR_GC_POT_3, - RAND_INF_DMC_NEAR_GC_POT_4, - RAND_INF_ZD_NEAR_SHOP_POT_1, - RAND_INF_ZD_NEAR_SHOP_POT_2, - RAND_INF_ZD_NEAR_SHOP_POT_3, - RAND_INF_ZD_NEAR_SHOP_POT_4, - RAND_INF_ZD_NEAR_SHOP_POT_5, - RAND_INF_ZF_HIDDEN_CAVE_POT_1, - RAND_INF_ZF_HIDDEN_CAVE_POT_2, - RAND_INF_ZF_HIDDEN_CAVE_POT_3, - RAND_INF_ZF_NEAR_JABU_POT_1, - RAND_INF_ZF_NEAR_JABU_POT_2, - RAND_INF_ZF_NEAR_JABU_POT_3, - RAND_INF_ZF_NEAR_JABU_POT_4, - RAND_INF_LLR_FRONT_POT_1, - RAND_INF_LLR_FRONT_POT_2, - RAND_INF_LLR_FRONT_POT_3, - RAND_INF_LLR_FRONT_POT_4, - RAND_INF_LLR_RAIN_SHED_POT_1, - RAND_INF_LLR_RAIN_SHED_POT_2, - RAND_INF_LLR_RAIN_SHED_POT_3, - RAND_INF_LLR_TALONS_HOUSE_POT_1, - RAND_INF_LLR_TALONS_HOUSE_POT_2, - RAND_INF_LLR_TALONS_HOUSE_POT_3, - RAND_INF_HF_COW_GROTTO_POT_1, - RAND_INF_HF_COW_GROTTO_POT_2, - RAND_INF_HC_STORMS_GROTTO_POT_1, - RAND_INF_HC_STORMS_GROTTO_POT_2, - RAND_INF_HC_STORMS_GROTTO_POT_3, - RAND_INF_HC_STORMS_GROTTO_POT_4, +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_5) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_6) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_BLADE_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_BLADE_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_4) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_3) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_4) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_5) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_6) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_3) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_LOBBY_POT_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_LOBBY_POT_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_LOBBY_POT_3) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_LOBBY_POT_4) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_LOBBY_POT_5) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_LOBBY_POT_6) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_3) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_4) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_3) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_4) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_TORCH_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_TORCH_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_RIVER_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_RIVER_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_4) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_SPIKE_WALLS_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_4) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_4) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_3) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_3) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_4) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_3) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_4) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_5) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_6) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_7) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_8) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_9) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_10) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_11) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_12) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_13) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_14) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_15) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_16) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_17) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_18) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_1) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_2) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_3) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_4) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_5) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_6) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_7) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_8) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_9) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_10) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_11) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_12) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_UNDERWATER_POT) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_HALL_POT_1) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_HALL_POT_2) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_1) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_2) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_3) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_NEAR_END_POT_1) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_NEAR_END_POT_2) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_FROZEN_POT_1) - RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_1, - RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_2, - RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_3, - RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_4, - RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_1, - RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_2, - RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_3, - RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_4, - RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_5, - RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_6, - RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_1, - RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_2, - RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_3, - RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_4, - RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_1, - RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_2, - RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_3, - RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_4, - RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_1, - RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_2, - RAND_INF_DODONGOS_CAVERN_BLADE_POT_1, - RAND_INF_DODONGOS_CAVERN_BLADE_POT_2, - RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_1, - RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_2, - RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_1, - RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_2, - RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_3, - RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_4, - RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1, - RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2, - RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3, - RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_1, - RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_2, - RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_3, - RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_4, - RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_5, - RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_6, - RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_1, - RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_2, - RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_3, - RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1, - RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2, - RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3, - RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4, - RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5, - RAND_INF_FOREST_TEMPLE_LOBBY_POT_1, - RAND_INF_FOREST_TEMPLE_LOBBY_POT_2, - RAND_INF_FOREST_TEMPLE_LOBBY_POT_3, - RAND_INF_FOREST_TEMPLE_LOBBY_POT_4, - RAND_INF_FOREST_TEMPLE_LOBBY_POT_5, - RAND_INF_FOREST_TEMPLE_LOBBY_POT_6, - RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_1, - RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_2, - RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_1, - RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_2, - RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_1, - RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_2, - RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_3, - RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_4, - RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_1, - RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_2, - RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_3, - RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_1, - RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_2, - RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_1, - RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_2, - RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_3, - RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_4, - RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_1, - RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_2, - RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_3, - RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1, - RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2, - RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3, - RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4, - RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1, - RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2, - RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3, - RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4, - RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_1, - RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_2, - RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_1, - RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_2, - RAND_INF_WATER_TEMPLE_TORCH_POT_1, - RAND_INF_WATER_TEMPLE_TORCH_POT_2, - RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_1, - RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_2, - RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_3, - RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_1, - RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_2, - RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_1, - RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_2, - RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_3, - RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_4, - RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1, - RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2, - RAND_INF_WATER_TEMPLE_RIVER_POT_1, - RAND_INF_WATER_TEMPLE_RIVER_POT_2, - RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_1, - RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_2, - RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_1, - RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_2, - RAND_INF_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1, - RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1, - RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2, - RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3, - RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4, - RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5, - RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_1, - RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_2, - RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_1, - RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_2, - RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_3, - RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_4, - RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_1, - RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_2, - RAND_INF_SHADOW_TEMPLE_SPIKE_WALLS_POT_1, - RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_1, - RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_2, - RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_1, - RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_2, - RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_3, - RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_4, - RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_1, - RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_2, - RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_1, - RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_2, - RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_3, - RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_4, - RAND_INF_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1, - RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1, - RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2, - RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1, - RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2, - RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3, - RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4, - RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5, - RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6, - RAND_INF_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1, - RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_1, - RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_2, - RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_1, - RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_2, - RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_1, - RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_2, - RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_3, - RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_1, - RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_2, - RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_3, - RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_4, - RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_1, - RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_2, - RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1, - RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_1, - RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_2, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_1, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_2, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_3, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_4, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_5, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_6, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_7, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_8, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_9, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_10, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_11, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_12, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_13, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_14, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_15, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_16, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_17, - RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_18, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, - RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1, - RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2, - RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3, - RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1, - RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2, - RAND_INF_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1, - RAND_INF_BOTTOM_OF_THE_WELL_UNDERWATER_POT, - RAND_INF_ICE_CAVERN_HALL_POT_1, - RAND_INF_ICE_CAVERN_HALL_POT_2, - RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_1, - RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_2, - RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_3, - RAND_INF_ICE_CAVERN_NEAR_END_POT_1, - RAND_INF_ICE_CAVERN_NEAR_END_POT_2, - RAND_INF_ICE_CAVERN_FROZEN_POT_1, +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_3) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_4) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_5) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_6) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_3) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_3) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_4) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_4) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_1) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_2) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_4) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_5) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_6) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MQ_ENTRANCE_POT) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_1) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_4) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_5) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_5) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_5) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_BOSS_KEY_POT) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2) - RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1, - RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2, - RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_1, - RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_2, - RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, - RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, - RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, - RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, - RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, - RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_1, - RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_2, - RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_3, - RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_4, - RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_5, - RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_6, - RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_1, - RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_2, - RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1, - RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2, - RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3, - RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4, - RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_1, - RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_2, - RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_3, - RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_1, - RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_2, - RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_1, - RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_2, - RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_3, - RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_4, - RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1, - RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2, - RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3, - RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4, - RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1, - RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2, - RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3, - RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4, - RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, - RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, - RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, - RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, - RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_1, - RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_2, - RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, - RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, - RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_1, - RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_2, - RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, - RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, - RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, - RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, - RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_1, - RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_2, - RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_3, - RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_4, - RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_1, - RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_2, - RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_1, - RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_2, - RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1, - RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2, - RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1, - RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2, - RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1, - RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2, - RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1, - RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2, - RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1, - RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2, - RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1, - RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2, - RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1, - RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2, - RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1, - RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2, - RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_1, - RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_2, - RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_3, - RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_4, - RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1, - RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2, - RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_1, - RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_2, - RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_3, - RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_4, - RAND_INF_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT, - RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1, - RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_1, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_2, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_3, - RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_1, - RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_2, - RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, - RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, - RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_1, - RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_2, - RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_3, - RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1, - RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2, - RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1, - RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2, - RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3, - RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, - RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, - RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_1, - RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_2, - RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_3, - RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_4, - RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_5, - RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_6, - RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1, - RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2, - RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3, - RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4, - RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5, - RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6, - RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7, - RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8, - RAND_INF_ICE_CAVERN_MQ_ENTRANCE_POT, - RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1, - RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2, - RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1, - RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2, - RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3, - RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4, - RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1, - RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2, - RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_1, - RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_2, - RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1, - RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2, - RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3, - RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4, - RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT, - RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1, - RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2, - RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT, - RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1, - RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2, - RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3, - RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4, - RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_1, - RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_2, - RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_3, - RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_4, - RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_5, - RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1, - RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2, - RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1, - RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2, - RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, - RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, - RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, - RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, - RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1, - RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2, - RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1, - RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2, - RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_1, - RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_2, - RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_3, - RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_4, - RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_5, - RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, - RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, - RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, - RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1, - RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2, - RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_3, - RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_4, - RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_5, - RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1, - RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2, - RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_1, - RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_2, - RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, - RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, - RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, - RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, - RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, - RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, - RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, - RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1, - RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2, - RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, - RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, - RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, - RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, - RAND_INF_WATER_TEMPLE_MQ_BOSS_KEY_POT, - RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1, - RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2, - RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, - RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, +DEFINE_RAND_INF(RAND_INF_GV_FREESTANDING_POH_CRATE) +DEFINE_RAND_INF(RAND_INF_GV_NEAR_COW_CRATE) +DEFINE_RAND_INF(RAND_INF_GV_CRATE_BRIDGE_1) +DEFINE_RAND_INF(RAND_INF_GV_CRATE_BRIDGE_2) +DEFINE_RAND_INF(RAND_INF_GV_CRATE_BRIDGE_3) +DEFINE_RAND_INF(RAND_INF_GV_CRATE_BRIDGE_4) +DEFINE_RAND_INF(RAND_INF_GF_ABOVE_JAIL_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_OUTSIDE_CENTER_CRATE_1) +DEFINE_RAND_INF(RAND_INF_GF_OUTSIDE_CENTER_CRATE_2) +DEFINE_RAND_INF(RAND_INF_GF_OUTSIDE_CENTER_CRATE_3) +DEFINE_RAND_INF(RAND_INF_GF_OUTSIDE_CENTER_CRATE_4) +DEFINE_RAND_INF(RAND_INF_GF_OUTSIDE_LEFT_CRATE_1) +DEFINE_RAND_INF(RAND_INF_GF_OUTSIDE_LEFT_CRATE_2) +DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_RANGE_CRATE_1) +DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_RANGE_CRATE_2) +DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_RANGE_CRATE_3) +DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_RANGE_CRATE_4) +DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_RANGE_CRATE_5) +DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_RANGE_CRATE_6) +DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_RANGE_CRATE_7) +DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_START_CRATE_1) +DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_START_CRATE_2) +DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_LEFT_END_CRATE_1) +DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_LEFT_END_CRATE_2) +DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_LEFT_END_CHILD_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_1) +DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_2) +DEFINE_RAND_INF(RAND_INF_GF_KITCHEN_CRATE_1) +DEFINE_RAND_INF(RAND_INF_GF_KITCHEN_CRATE_2) +DEFINE_RAND_INF(RAND_INF_GF_KITCHEN_CRATE_3) +DEFINE_RAND_INF(RAND_INF_GF_KITCHEN_CRATE_4) +DEFINE_RAND_INF(RAND_INF_GF_KITCHEN_CRATE_5) +DEFINE_RAND_INF(RAND_INF_GF_BREAK_ROOM_CRATE_1) +DEFINE_RAND_INF(RAND_INF_GF_BREAK_ROOM_CRATE_2) +DEFINE_RAND_INF(RAND_INF_GF_BREAK_ROOM_CRATE_3) +DEFINE_RAND_INF(RAND_INF_GF_BREAK_ROOM_CRATE_4) +DEFINE_RAND_INF(RAND_INF_GF_NORTH_F1_CARPENTER_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_NORTH_F3_CARPENTER_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_1) +DEFINE_RAND_INF(RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_2) +DEFINE_RAND_INF(RAND_INF_HW_BEFORE_QUICKSAND_CRATE) +DEFINE_RAND_INF(RAND_INF_HW_AFTER_QUICKSAND_CRATE_1) +DEFINE_RAND_INF(RAND_INF_HW_AFTER_QUICKSAND_CRATE_2) +DEFINE_RAND_INF(RAND_INF_HW_AFTER_QUICKSAND_CRATE_3) +DEFINE_RAND_INF(RAND_INF_HW_NEAR_COLOSSUS_CRATE) +DEFINE_RAND_INF(RAND_INF_MK_NEAR_BAZAAR_CRATE_1) +DEFINE_RAND_INF(RAND_INF_MK_NEAR_BAZAAR_CRATE_2) +DEFINE_RAND_INF(RAND_INF_MK_SHOOTING_GALLERY_CRATE_1) +DEFINE_RAND_INF(RAND_INF_MK_SHOOTING_GALLERY_CRATE_2) +DEFINE_RAND_INF(RAND_INF_MK_LOST_DOG_HOUSE_CRATE) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CRATE_1) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CRATE_2) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CRATE_3) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CRATE_4) +DEFINE_RAND_INF(RAND_INF_MK_GUARD_HOUSE_CRATE_5) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_POTION_SHOP_ADULT_CRATE) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_1) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_2) +DEFINE_RAND_INF(RAND_INF_KAK_BEHIND_GS_HOUSE_ADULT_CRATE) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_GY_CHILD_CRATE) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_WINDMILL_CHILD_CRATE) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_FENCE_CHILD_CRATE) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE) +DEFINE_RAND_INF(RAND_INF_KAK_NEAR_BAZAAR_CHILD_CRATE) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_CRATE) +DEFINE_RAND_INF(RAND_INF_GC_MAZE_CRATE) +DEFINE_RAND_INF(RAND_INF_DMC_CRATE) +DEFINE_RAND_INF(RAND_INF_LLR_NEAR_TREE_CRATE) +DEFINE_RAND_INF(RAND_INF_LH_LAB_CRATE) - RAND_INF_GV_FREESTANDING_POH_CRATE, - RAND_INF_GV_NEAR_COW_CRATE, - RAND_INF_GV_CRATE_BRIDGE_1, - RAND_INF_GV_CRATE_BRIDGE_2, - RAND_INF_GV_CRATE_BRIDGE_3, - RAND_INF_GV_CRATE_BRIDGE_4, - RAND_INF_GF_ABOVE_JAIL_CRATE, - RAND_INF_GF_OUTSIDE_CENTER_CRATE_1, - RAND_INF_GF_OUTSIDE_CENTER_CRATE_2, - RAND_INF_GF_OUTSIDE_CENTER_CRATE_3, - RAND_INF_GF_OUTSIDE_CENTER_CRATE_4, - RAND_INF_GF_OUTSIDE_LEFT_CRATE_1, - RAND_INF_GF_OUTSIDE_LEFT_CRATE_2, - RAND_INF_GF_ARCHERY_RANGE_CRATE_1, - RAND_INF_GF_ARCHERY_RANGE_CRATE_2, - RAND_INF_GF_ARCHERY_RANGE_CRATE_3, - RAND_INF_GF_ARCHERY_RANGE_CRATE_4, - RAND_INF_GF_ARCHERY_RANGE_CRATE_5, - RAND_INF_GF_ARCHERY_RANGE_CRATE_6, - RAND_INF_GF_ARCHERY_RANGE_CRATE_7, - RAND_INF_GF_ARCHERY_START_CRATE_1, - RAND_INF_GF_ARCHERY_START_CRATE_2, - RAND_INF_GF_ARCHERY_LEFT_END_CRATE_1, - RAND_INF_GF_ARCHERY_LEFT_END_CRATE_2, - RAND_INF_GF_ARCHERY_LEFT_END_CHILD_CRATE, - RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_1, - RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_2, - RAND_INF_GF_KITCHEN_CRATE_1, - RAND_INF_GF_KITCHEN_CRATE_2, - RAND_INF_GF_KITCHEN_CRATE_3, - RAND_INF_GF_KITCHEN_CRATE_4, - RAND_INF_GF_KITCHEN_CRATE_5, - RAND_INF_GF_BREAK_ROOM_CRATE_1, - RAND_INF_GF_BREAK_ROOM_CRATE_2, - RAND_INF_GF_BREAK_ROOM_CRATE_3, - RAND_INF_GF_BREAK_ROOM_CRATE_4, - RAND_INF_GF_NORTH_F1_CARPENTER_CRATE, - RAND_INF_GF_NORTH_F3_CARPENTER_CRATE, - RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_1, - RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_2, - RAND_INF_HW_BEFORE_QUICKSAND_CRATE, - RAND_INF_HW_AFTER_QUICKSAND_CRATE_1, - RAND_INF_HW_AFTER_QUICKSAND_CRATE_2, - RAND_INF_HW_AFTER_QUICKSAND_CRATE_3, - RAND_INF_HW_NEAR_COLOSSUS_CRATE, - RAND_INF_MK_NEAR_BAZAAR_CRATE_1, - RAND_INF_MK_NEAR_BAZAAR_CRATE_2, - RAND_INF_MK_SHOOTING_GALLERY_CRATE_1, - RAND_INF_MK_SHOOTING_GALLERY_CRATE_2, - RAND_INF_MK_LOST_DOG_HOUSE_CRATE, - RAND_INF_MK_GUARD_HOUSE_CRATE_1, - RAND_INF_MK_GUARD_HOUSE_CRATE_2, - RAND_INF_MK_GUARD_HOUSE_CRATE_3, - RAND_INF_MK_GUARD_HOUSE_CRATE_4, - RAND_INF_MK_GUARD_HOUSE_CRATE_5, - RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, - RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, - RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, - RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, - RAND_INF_KAK_NEAR_POTION_SHOP_ADULT_CRATE, - RAND_INF_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, - RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, - RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, - RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, - RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, - RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_1, - RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_2, - RAND_INF_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, - RAND_INF_KAK_NEAR_GY_CHILD_CRATE, - RAND_INF_KAK_NEAR_WINDMILL_CHILD_CRATE, - RAND_INF_KAK_NEAR_FENCE_CHILD_CRATE, - RAND_INF_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, - RAND_INF_KAK_NEAR_BAZAAR_CHILD_CRATE, - RAND_INF_GRAVEYARD_CRATE, - RAND_INF_GC_MAZE_CRATE, - RAND_INF_DMC_CRATE, - RAND_INF_LLR_NEAR_TREE_CRATE, - RAND_INF_LH_LAB_CRATE, +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_LOBBY_CRATE) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE) - RAND_INF_DEKU_TREE_MQ_LOBBY_CRATE, - RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, - RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, - RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, - RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, - RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, - RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, - RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, - RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, - RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, - RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, - RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, - RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, - RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, - RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, - RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, - RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, - RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, - RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, - RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, - RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, - RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, - RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, - RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, - RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, - RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, - RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, - RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, - RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, - RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, - RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, - RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, - RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, - RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, - RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, - RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, - RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, - RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, - RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, - RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, - RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, - RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, - RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, - RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, - RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, - RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, - RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, - RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, - RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, - RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, - RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, - RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, - RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, - RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, - RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, - RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, - RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, - RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, - RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, - RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, - RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, - RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, - RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, - RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, - RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, - RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, - RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, - RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, - RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, - RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, - RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, - RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, - RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, - RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, - RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, - RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, - RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, - RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, - RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, - RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, - RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, - RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, - RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, - RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, - RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, - RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, - RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, - RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, - RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, - RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, - RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, - RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, - RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, - RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, - RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, - RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, - RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, - RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, - RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, - RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, - RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, - RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, - RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, - RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, - RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, - RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, - RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, - RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, - RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, - RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, - RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, - RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, - RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, - RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, - RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, - RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, - RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, - RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, - RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, - RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, - RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, - RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, - RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, - RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, - RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, - RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, - RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, - RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, - RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, - RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, - RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, - RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, - RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, - RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, - RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, - RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, - RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, - RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, - RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, - RAND_INF_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2) - RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, - RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, - RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, - RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, - RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, - RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE) - RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, - RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, - RAND_INF_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_1, - RAND_INF_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_2, - RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, - RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, - RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, - RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, - RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, - RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, - RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, - RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, - RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, - RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, - RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, - RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, - RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, - RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, - RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, - RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, - RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, - RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, - RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, - RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, - RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, - RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, - RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, - RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, - RAND_INF_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, +DEFINE_RAND_INF(RAND_INF_CAUGHT_LOACH) - RAND_INF_CAUGHT_LOACH, +DEFINE_RAND_INF(RAND_INF_CAN_SWIM) - RAND_INF_CAN_SWIM, +DEFINE_RAND_INF(RAND_INF_HAS_WALLET) - RAND_INF_HAS_WALLET, +DEFINE_RAND_INF(RAND_INF_BEEHIVE_KF_STORMS_GROTTO_LEFT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_KF_STORMS_GROTTO_RIGHT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_LEFT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_RIGHT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_LW_DEKU_SCRUB_GROTTO) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_SFM_STORMS_GROTTO) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_LEFT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_RIGHT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_HF_OPEN_GROTTO_LEFT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_HF_OPEN_GROTTO_RIGHT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_LEFT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_RIGHT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_HF_INSIDE_FENCE_GROTTO) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_LLR_GROTTO) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_LEFT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_RIGHT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_DMT_COW_GROTTO) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_LEFT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_RIGHT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_GC_GROTTO) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_LEFT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_RIGHT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_DMC_HAMMER_GROTTO) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_LEFT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_RIGHT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_ZR_STORMS_GROTTO) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_LEFT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_RIGHT) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_ZD_BEHIND_KING_ZORA) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_LH_GROTTO) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_GV_DEKU_SCRUB_GROTTO) +DEFINE_RAND_INF(RAND_INF_BEEHIVE_COLOSSUS_GROTTO) - RAND_INF_BEEHIVE_KF_STORMS_GROTTO_LEFT, - RAND_INF_BEEHIVE_KF_STORMS_GROTTO_RIGHT, - RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_LEFT, - RAND_INF_BEEHIVE_LW_NEAR_SHORTCUTS_GROTTO_RIGHT, - RAND_INF_BEEHIVE_LW_DEKU_SCRUB_GROTTO, - RAND_INF_BEEHIVE_SFM_STORMS_GROTTO, - RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_LEFT, - RAND_INF_BEEHIVE_HF_NEAR_MARKET_GROTTO_RIGHT, - RAND_INF_BEEHIVE_HF_OPEN_GROTTO_LEFT, - RAND_INF_BEEHIVE_HF_OPEN_GROTTO_RIGHT, - RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_LEFT, - RAND_INF_BEEHIVE_HF_SOUTHEAST_GROTTO_RIGHT, - RAND_INF_BEEHIVE_HF_INSIDE_FENCE_GROTTO, - RAND_INF_BEEHIVE_LLR_GROTTO, - RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_LEFT, - RAND_INF_BEEHIVE_KAK_OPEN_GROTTO_RIGHT, - RAND_INF_BEEHIVE_DMT_COW_GROTTO, - RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_LEFT, - RAND_INF_BEEHIVE_DMT_STORMS_GROTTO_RIGHT, - RAND_INF_BEEHIVE_GC_GROTTO, - RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_LEFT, - RAND_INF_BEEHIVE_DMC_UPPER_GROTTO_RIGHT, - RAND_INF_BEEHIVE_DMC_HAMMER_GROTTO, - RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_LEFT, - RAND_INF_BEEHIVE_ZR_OPEN_GROTTO_RIGHT, - RAND_INF_BEEHIVE_ZR_STORMS_GROTTO, - RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_LEFT, - RAND_INF_BEEHIVE_ZD_IN_FRONT_OF_KING_ZORA_RIGHT, - RAND_INF_BEEHIVE_ZD_BEHIND_KING_ZORA, - RAND_INF_BEEHIVE_LH_GROTTO, - RAND_INF_BEEHIVE_GV_DEKU_SCRUB_GROTTO, - RAND_INF_BEEHIVE_COLOSSUS_GROTTO, +DEFINE_RAND_INF(RAND_INF_GROTTO_FISH_ZR_OPEN_GROTTO) +DEFINE_RAND_INF(RAND_INF_GROTTO_FISH_DMC_UPPER_GROTTO) +DEFINE_RAND_INF(RAND_INF_GROTTO_FISH_DMT_STORMS_GROTTO) +DEFINE_RAND_INF(RAND_INF_GROTTO_FISH_KAK_OPEN_GROTTO) +DEFINE_RAND_INF(RAND_INF_GROTTO_FISH_HF_NEAR_MARKET_GROTTO) +DEFINE_RAND_INF(RAND_INF_GROTTO_FISH_HF_OPEN_GROTTO) +DEFINE_RAND_INF(RAND_INF_GROTTO_FISH_HF_SOUTHEAST_GROTTO) +DEFINE_RAND_INF(RAND_INF_GROTTO_FISH_LW_NEAR_SHORTCUTS_GROTTO) +DEFINE_RAND_INF(RAND_INF_GROTTO_FISH_KF_STORMS_GROTTO) - RAND_INF_GROTTO_FISH_ZR_OPEN_GROTTO, - RAND_INF_GROTTO_FISH_DMC_UPPER_GROTTO, - RAND_INF_GROTTO_FISH_DMT_STORMS_GROTTO, - RAND_INF_GROTTO_FISH_KAK_OPEN_GROTTO, - RAND_INF_GROTTO_FISH_HF_NEAR_MARKET_GROTTO, - RAND_INF_GROTTO_FISH_HF_OPEN_GROTTO, - RAND_INF_GROTTO_FISH_HF_SOUTHEAST_GROTTO, - RAND_INF_GROTTO_FISH_LW_NEAR_SHORTCUTS_GROTTO, - RAND_INF_GROTTO_FISH_KF_STORMS_GROTTO, +DEFINE_RAND_INF(RAND_INF_FISHING_POLE_FOUND) - RAND_INF_FISHING_POLE_FOUND, +DEFINE_RAND_INF(RAND_INF_ZD_FISH_1) +DEFINE_RAND_INF(RAND_INF_ZD_FISH_2) +DEFINE_RAND_INF(RAND_INF_ZD_FISH_3) +DEFINE_RAND_INF(RAND_INF_ZD_FISH_4) +DEFINE_RAND_INF(RAND_INF_ZD_FISH_5) - RAND_INF_ZD_FISH_1, - RAND_INF_ZD_FISH_2, - RAND_INF_ZD_FISH_3, - RAND_INF_ZD_FISH_4, - RAND_INF_ZD_FISH_5, +DEFINE_RAND_INF(RAND_INF_HAS_INFINITE_QUIVER) +DEFINE_RAND_INF(RAND_INF_HAS_INFINITE_BOMB_BAG) +DEFINE_RAND_INF(RAND_INF_HAS_INFINITE_BULLET_BAG) +DEFINE_RAND_INF(RAND_INF_HAS_INFINITE_STICK_UPGRADE) +DEFINE_RAND_INF(RAND_INF_HAS_INFINITE_NUT_UPGRADE) +DEFINE_RAND_INF(RAND_INF_HAS_INFINITE_MAGIC_METER) +DEFINE_RAND_INF(RAND_INF_HAS_INFINITE_BOMBCHUS) +DEFINE_RAND_INF(RAND_INF_HAS_INFINITE_MONEY) - RAND_INF_HAS_INFINITE_QUIVER, - RAND_INF_HAS_INFINITE_BOMB_BAG, - RAND_INF_HAS_INFINITE_BULLET_BAG, - RAND_INF_HAS_INFINITE_STICK_UPGRADE, - RAND_INF_HAS_INFINITE_NUT_UPGRADE, - RAND_INF_HAS_INFINITE_MAGIC_METER, - RAND_INF_HAS_INFINITE_BOMBCHUS, - RAND_INF_HAS_INFINITE_MONEY, +DEFINE_RAND_INF(RAND_INF_HAS_SKELETON_KEY) - RAND_INF_HAS_SKELETON_KEY, +DEFINE_RAND_INF(RAND_INF_LINKS_POCKET) +DEFINE_RAND_INF(RAND_INF_LEARNED_EPONA_SONG) +DEFINE_RAND_INF(RAND_INF_DARUNIAS_JOY) +DEFINE_RAND_INF(RAND_INF_KING_ZORA_THAWED) - RAND_INF_LINKS_POCKET, - RAND_INF_LEARNED_EPONA_SONG, - RAND_INF_DARUNIAS_JOY, - RAND_INF_KING_ZORA_THAWED, +DEFINE_RAND_INF(RAND_INF_HC_GREAT_FAIRY_REWARD) +DEFINE_RAND_INF(RAND_INF_DMT_GREAT_FAIRY_REWARD) +DEFINE_RAND_INF(RAND_INF_DMC_GREAT_FAIRY_REWARD) +DEFINE_RAND_INF(RAND_INF_ZF_GREAT_FAIRY_REWARD) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_GREAT_FAIRY_REWARD) +DEFINE_RAND_INF(RAND_INF_OGC_GREAT_FAIRY_REWARD) - RAND_INF_HC_GREAT_FAIRY_REWARD, - RAND_INF_DMT_GREAT_FAIRY_REWARD, - RAND_INF_DMC_GREAT_FAIRY_REWARD, - RAND_INF_ZF_GREAT_FAIRY_REWARD, - RAND_INF_COLOSSUS_GREAT_FAIRY_REWARD, - RAND_INF_OGC_GREAT_FAIRY_REWARD, +DEFINE_RAND_INF(RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_1) +DEFINE_RAND_INF(RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_2) +DEFINE_RAND_INF(RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_3) +DEFINE_RAND_INF(RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_4) +DEFINE_RAND_INF(RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_5) +DEFINE_RAND_INF(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_1) +DEFINE_RAND_INF(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_2) +DEFINE_RAND_INF(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_3) +DEFINE_RAND_INF(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_4) +DEFINE_RAND_INF(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_5) - RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_1, - RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_2, - RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_3, - RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_4, - RAND_INF_MARKET_TREASURE_CHEST_GAME_ITEM_5, - RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_1, - RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_2, - RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_3, - RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_4, - RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_5, +DEFINE_RAND_INF(RAND_INF_GF_ITEM_FROM_LEADER_OF_FORTRESS) +DEFINE_RAND_INF(RAND_INF_GF_GTG_GATE_PERMANENTLY_OPEN) - RAND_INF_GF_ITEM_FROM_LEADER_OF_FORTRESS, - RAND_INF_GF_GTG_GATE_PERMANENTLY_OPEN, +DEFINE_RAND_INF(RAND_INF_ZELDAS_LETTER) +DEFINE_RAND_INF(RAND_INF_WEIRD_EGG) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_MASK_KEATON) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_MASK_SKULL) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_MASK_SPOOKY) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_MASK_BUNNY) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_MASK_GORON) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_MASK_ZORA) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_MASK_GERUDO) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_MASK_TRUTH) - RAND_INF_ZELDAS_LETTER, - RAND_INF_WEIRD_EGG, - RAND_INF_CHILD_TRADES_MASK_KEATON, - RAND_INF_CHILD_TRADES_MASK_SKULL, - RAND_INF_CHILD_TRADES_MASK_SPOOKY, - RAND_INF_CHILD_TRADES_MASK_BUNNY, - RAND_INF_CHILD_TRADES_MASK_GORON, - RAND_INF_CHILD_TRADES_MASK_ZORA, - RAND_INF_CHILD_TRADES_MASK_GERUDO, - RAND_INF_CHILD_TRADES_MASK_TRUTH, +DEFINE_RAND_INF(RAND_INF_KF_BOULDER_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_KF_BOULDER_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_KF_BRIDGE_RUPEE) +DEFINE_RAND_INF(RAND_INF_KF_BEHIND_MIDOS_RUPEE) +DEFINE_RAND_INF(RAND_INF_KF_SARIAS_ROOF_WEST_HEART) +DEFINE_RAND_INF(RAND_INF_KF_SARIAS_ROOF_EAST_HEART) +DEFINE_RAND_INF(RAND_INF_KF_SARIAS_ROOF_NORTH_HEART) +DEFINE_RAND_INF(RAND_INF_KF_SOUTH_GRASS_WEST_RUPEE) +DEFINE_RAND_INF(RAND_INF_KF_NORTH_GRASS_WEST_RUPEE) +DEFINE_RAND_INF(RAND_INF_KF_NORTH_GRASS_EAST_RUPEE) +DEFINE_RAND_INF(RAND_INF_KF_SOUTH_GRASS_EAST_RUPEE) +DEFINE_RAND_INF(RAND_INF_KF_SARIAS_TOP_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_KF_SARIAS_TOP_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_KF_SARIAS_BOTTOM_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_KF_SARIAS_BOTTOM_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_KF_BEAN_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_KF_BEAN_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_KF_BEAN_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_KF_BEAN_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_KF_BEAN_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_KF_BEAN_RUPEE_6) +DEFINE_RAND_INF(RAND_INF_KF_BEAN_RED_RUPEE) +DEFINE_RAND_INF(RAND_INF_LW_BOULDER_RUPEE) +DEFINE_RAND_INF(RAND_INF_LW_SHORTCUT_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_LW_SHORTCUT_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_LW_SHORTCUT_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_LW_SHORTCUT_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_LW_SHORTCUT_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_LW_SHORTCUT_RUPEE_6) +DEFINE_RAND_INF(RAND_INF_LW_SHORTCUT_RUPEE_7) +DEFINE_RAND_INF(RAND_INF_LW_SHORTCUT_RUPEE_8) +DEFINE_RAND_INF(RAND_INF_LH_FRONT_RUPEE) +DEFINE_RAND_INF(RAND_INF_LH_MIDDLE_RUPEE) +DEFINE_RAND_INF(RAND_INF_LH_BACK_RUPEE) +DEFINE_RAND_INF(RAND_INF_LH_LAB_FRONT_RUPEE) +DEFINE_RAND_INF(RAND_INF_LH_LAB_LEFT_RUPEE) +DEFINE_RAND_INF(RAND_INF_LH_LAB_RIGHT_RUPEE) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_6) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_7) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_8) - RAND_INF_KF_BOULDER_RUPEE_2, - RAND_INF_KF_BOULDER_RUPEE_1, - RAND_INF_KF_BRIDGE_RUPEE, - RAND_INF_KF_BEHIND_MIDOS_RUPEE, - RAND_INF_KF_SARIAS_ROOF_WEST_HEART, - RAND_INF_KF_SARIAS_ROOF_EAST_HEART, - RAND_INF_KF_SARIAS_ROOF_NORTH_HEART, - RAND_INF_KF_SOUTH_GRASS_WEST_RUPEE, - RAND_INF_KF_NORTH_GRASS_WEST_RUPEE, - RAND_INF_KF_NORTH_GRASS_EAST_RUPEE, - RAND_INF_KF_SOUTH_GRASS_EAST_RUPEE, - RAND_INF_KF_SARIAS_TOP_LEFT_HEART, - RAND_INF_KF_SARIAS_TOP_RIGHT_HEART, - RAND_INF_KF_SARIAS_BOTTOM_LEFT_HEART, - RAND_INF_KF_SARIAS_BOTTOM_RIGHT_HEART, - RAND_INF_KF_BEAN_RUPEE_1, - RAND_INF_KF_BEAN_RUPEE_2, - RAND_INF_KF_BEAN_RUPEE_3, - RAND_INF_KF_BEAN_RUPEE_4, - RAND_INF_KF_BEAN_RUPEE_5, - RAND_INF_KF_BEAN_RUPEE_6, - RAND_INF_KF_BEAN_RED_RUPEE, - RAND_INF_LW_BOULDER_RUPEE, - RAND_INF_LW_SHORTCUT_RUPEE_1, - RAND_INF_LW_SHORTCUT_RUPEE_2, - RAND_INF_LW_SHORTCUT_RUPEE_3, - RAND_INF_LW_SHORTCUT_RUPEE_4, - RAND_INF_LW_SHORTCUT_RUPEE_5, - RAND_INF_LW_SHORTCUT_RUPEE_6, - RAND_INF_LW_SHORTCUT_RUPEE_7, - RAND_INF_LW_SHORTCUT_RUPEE_8, - RAND_INF_LH_FRONT_RUPEE, - RAND_INF_LH_MIDDLE_RUPEE, - RAND_INF_LH_BACK_RUPEE, - RAND_INF_LH_LAB_FRONT_RUPEE, - RAND_INF_LH_LAB_LEFT_RUPEE, - RAND_INF_LH_LAB_RIGHT_RUPEE, - RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_1, - RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_2, - RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_3, - RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_4, - RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_5, - RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_6, - RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_7, - RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_8, +DEFINE_RAND_INF(RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE) +DEFINE_RAND_INF(RAND_INF_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE) +DEFINE_RAND_INF(RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE) +DEFINE_RAND_INF(RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE) +DEFINE_RAND_INF(RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE) +DEFINE_RAND_INF(RAND_INF_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE) +DEFINE_RAND_INF(RAND_INF_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE) +DEFINE_RAND_INF(RAND_INF_GV_OCTOROK_GROTTO_RED_RUPEE) - RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE, - RAND_INF_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE, - RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE, - RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE, - RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE, - RAND_INF_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE, - RAND_INF_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE, - RAND_INF_GV_OCTOROK_GROTTO_RED_RUPEE, +DEFINE_RAND_INF(RAND_INF_DMT_RED_RUPEE) +DEFINE_RAND_INF(RAND_INF_DMT_BLUE_RUPEE) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_MIDDLE_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_RUPEE_6) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_RED_RUPEE) - RAND_INF_DMT_RED_RUPEE, - RAND_INF_DMT_BLUE_RUPEE, - RAND_INF_DMT_COW_GROTTO_LEFT_HEART, - RAND_INF_DMT_COW_GROTTO_MIDDLE_LEFT_HEART, - RAND_INF_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART, - RAND_INF_DMT_COW_GROTTO_RIGHT_HEART, - RAND_INF_DMT_COW_GROTTO_RUPEE_1, - RAND_INF_DMT_COW_GROTTO_RUPEE_2, - RAND_INF_DMT_COW_GROTTO_RUPEE_3, - RAND_INF_DMT_COW_GROTTO_RUPEE_4, - RAND_INF_DMT_COW_GROTTO_RUPEE_5, - RAND_INF_DMT_COW_GROTTO_RUPEE_6, - RAND_INF_DMT_COW_GROTTO_RED_RUPEE, +DEFINE_RAND_INF(RAND_INF_DMC_NEAR_PLATFORM_RED_RUPEE) +DEFINE_RAND_INF(RAND_INF_DMC_MIDDLE_PLATFORM_RED_RUPEE) +DEFINE_RAND_INF(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6) +DEFINE_RAND_INF(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_4) +DEFINE_RAND_INF(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_5) +DEFINE_RAND_INF(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_6) +DEFINE_RAND_INF(RAND_INF_DMC_DISTANT_PLATFORM_RED_RUPEE) - RAND_INF_DMC_NEAR_PLATFORM_RED_RUPEE, - RAND_INF_DMC_MIDDLE_PLATFORM_RED_RUPEE, - RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1, - RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2, - RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3, - RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4, - RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5, - RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6, - RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_1, - RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_2, - RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_3, - RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_4, - RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_5, - RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_6, - RAND_INF_DMC_DISTANT_PLATFORM_RED_RUPEE, +DEFINE_RAND_INF(RAND_INF_ZR_BENEATH_WATERFALL_LEFT_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZR_BENEATH_WATERFALL_RIGHT_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_NORTH_INNER_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_NORTHEAST_INNER_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_SOUTH_INNER_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_NORTHWEST_INNER_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_NORTH_MIDDLE_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_NORTH_OUTER_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_SOUTH_OUTER_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE) +DEFINE_RAND_INF(RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE) - RAND_INF_ZR_BENEATH_WATERFALL_LEFT_RUPEE, - RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE, - RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE, - RAND_INF_ZR_BENEATH_WATERFALL_RIGHT_RUPEE, - RAND_INF_ZF_BOTTOM_NORTH_INNER_RUPEE, - RAND_INF_ZF_BOTTOM_NORTHEAST_INNER_RUPEE, - RAND_INF_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE, - RAND_INF_ZF_BOTTOM_SOUTH_INNER_RUPEE, - RAND_INF_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE, - RAND_INF_ZF_BOTTOM_NORTHWEST_INNER_RUPEE, - RAND_INF_ZF_BOTTOM_NORTH_MIDDLE_RUPEE, - RAND_INF_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE, - RAND_INF_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE, - RAND_INF_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE, - RAND_INF_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE, - RAND_INF_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE, - RAND_INF_ZF_BOTTOM_NORTH_OUTER_RUPEE, - RAND_INF_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE, - RAND_INF_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE, - RAND_INF_ZF_BOTTOM_SOUTH_OUTER_RUPEE, - RAND_INF_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, - RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_LOBBY_LOWER_HEART) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_LOBBY_UPPER_HEART) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BEFORE_BOSS_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_BLADE_ROOM_HEART) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_COURTYARD_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_COURTYARD_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_WELL_WEST_HEART) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_WELL_EAST_HEART) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FIRE_WALL_EAST_HEART) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FIRE_WALL_WEST_HEART) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_RIVER_HEART_1) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_RIVER_HEART_2) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_RIVER_HEART_3) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_RIVER_HEART_4) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_SCARECROW_NORTH_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_ADULT_CLIMB_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_ADULT_CLIMB_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_LOBBY_RUPEE) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MAP_ROOM_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_MAP_ROOM_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_RIGHT_RUPEE) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_RIGHT_RUPEE) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_COFFIN_ROOM_FRONT_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_3) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_FIRE_TRIAL_HEART) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_HEART) - RAND_INF_DEKU_TREE_LOBBY_LOWER_HEART, - RAND_INF_DEKU_TREE_LOBBY_UPPER_HEART, - RAND_INF_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, - RAND_INF_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, - RAND_INF_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, - RAND_INF_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART, - RAND_INF_DODONGOS_CAVERN_BLADE_ROOM_HEART, - RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, - RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, - RAND_INF_FOREST_TEMPLE_COURTYARD_RIGHT_HEART, - RAND_INF_FOREST_TEMPLE_COURTYARD_LEFT_HEART, - RAND_INF_FOREST_TEMPLE_WELL_WEST_HEART, - RAND_INF_FOREST_TEMPLE_WELL_EAST_HEART, - RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART, - RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART, - RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART, - RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART, - RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART, - RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART, - RAND_INF_FIRE_TEMPLE_FIRE_WALL_EAST_HEART, - RAND_INF_FIRE_TEMPLE_FIRE_WALL_WEST_HEART, - RAND_INF_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART, - RAND_INF_WATER_TEMPLE_RIVER_HEART_1, - RAND_INF_WATER_TEMPLE_RIVER_HEART_2, - RAND_INF_WATER_TEMPLE_RIVER_HEART_3, - RAND_INF_WATER_TEMPLE_RIVER_HEART_4, - RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART, - RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART, - RAND_INF_SHADOW_TEMPLE_SCARECROW_NORTH_HEART, - RAND_INF_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART, - RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, - RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, - RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, - RAND_INF_SPIRIT_TEMPLE_ADULT_CLIMB_LEFT_HEART, - RAND_INF_SPIRIT_TEMPLE_ADULT_CLIMB_RIGHT_HEART, - RAND_INF_ICE_CAVERN_LOBBY_RUPEE, - RAND_INF_ICE_CAVERN_MAP_ROOM_LEFT_HEART, - RAND_INF_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, - RAND_INF_ICE_CAVERN_MAP_ROOM_RIGHT_HEART, - RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1, - RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, - RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_RIGHT_RUPEE, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_RIGHT_RUPEE, - RAND_INF_BOTTOM_OF_THE_WELL_COFFIN_ROOM_FRONT_LEFT_HEART, - RAND_INF_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART, - RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, - RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, - RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_1, - RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_2, - RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_3, - RAND_INF_GANONS_CASTLE_FIRE_TRIAL_HEART, - RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_HEART, +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_LOBBY_HEART) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_HEART) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_2) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_WELL_MQ_WEST_HEART) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_WELL_MQ_MIDDLE_HEART) +DEFINE_RAND_INF(RAND_INF_FOREST_TEMPLE_WELL_MQ_EAST_HEART) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_HEART) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART) - RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART, - RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART, - RAND_INF_DEKU_TREE_MQ_LOBBY_HEART, - RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART, - RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART, - RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART, - RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART, - RAND_INF_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_HEART, - RAND_INF_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART, - RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_1, - RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_2, - RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3, - RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, - RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, - RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART, - RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART, - RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART, - RAND_INF_FOREST_TEMPLE_WELL_MQ_WEST_HEART, - RAND_INF_FOREST_TEMPLE_WELL_MQ_MIDDLE_HEART, - RAND_INF_FOREST_TEMPLE_WELL_MQ_EAST_HEART, - RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART, - RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART, - RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART, - RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART, - RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART, - RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART, - RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART, - RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART, - RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART, - RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, - RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LEFT_HEART, - RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_RIGHT_HEART, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART, - RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_HEART, - RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART, - RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART, +DEFINE_RAND_INF(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_4) +DEFINE_RAND_INF(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_5) +DEFINE_RAND_INF(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_6) +DEFINE_RAND_INF(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_7) +DEFINE_RAND_INF(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_8) +DEFINE_RAND_INF(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_4) +DEFINE_RAND_INF(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_5) +DEFINE_RAND_INF(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_6) +DEFINE_RAND_INF(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_7) +DEFINE_RAND_INF(RAND_INF_ZR_FAIRY_GROTTO_FAIRY_8) +DEFINE_RAND_INF(RAND_INF_HF_FAIRY_GROTTO_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_HF_FAIRY_GROTTO_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_HF_FAIRY_GROTTO_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_HF_FAIRY_GROTTO_FAIRY_4) +DEFINE_RAND_INF(RAND_INF_HF_FAIRY_GROTTO_FAIRY_5) +DEFINE_RAND_INF(RAND_INF_HF_FAIRY_GROTTO_FAIRY_6) +DEFINE_RAND_INF(RAND_INF_HF_FAIRY_GROTTO_FAIRY_7) +DEFINE_RAND_INF(RAND_INF_HF_FAIRY_GROTTO_FAIRY_8) +DEFINE_RAND_INF(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_4) +DEFINE_RAND_INF(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_5) +DEFINE_RAND_INF(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_6) +DEFINE_RAND_INF(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_7) +DEFINE_RAND_INF(RAND_INF_ZD_FAIRY_GROTTO_FAIRY_8) +DEFINE_RAND_INF(RAND_INF_GF_FAIRY_GROTTO_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_GF_FAIRY_GROTTO_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_GF_FAIRY_GROTTO_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_GF_FAIRY_GROTTO_FAIRY_4) +DEFINE_RAND_INF(RAND_INF_GF_FAIRY_GROTTO_FAIRY_5) +DEFINE_RAND_INF(RAND_INF_GF_FAIRY_GROTTO_FAIRY_6) +DEFINE_RAND_INF(RAND_INF_GF_FAIRY_GROTTO_FAIRY_7) +DEFINE_RAND_INF(RAND_INF_GF_FAIRY_GROTTO_FAIRY_8) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_4) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_5) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_6) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_7) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_8) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_4) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_5) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_6) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_7) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_8) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_OASIS_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_OASIS_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_OASIS_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_OASIS_FAIRY_4) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_OASIS_FAIRY_5) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_OASIS_FAIRY_6) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_OASIS_FAIRY_7) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_OASIS_FAIRY_8) - RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1, - RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2, - RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3, - RAND_INF_SFM_FAIRY_GROTTO_FAIRY_4, - RAND_INF_SFM_FAIRY_GROTTO_FAIRY_5, - RAND_INF_SFM_FAIRY_GROTTO_FAIRY_6, - RAND_INF_SFM_FAIRY_GROTTO_FAIRY_7, - RAND_INF_SFM_FAIRY_GROTTO_FAIRY_8, - RAND_INF_ZR_FAIRY_GROTTO_FAIRY_1, - RAND_INF_ZR_FAIRY_GROTTO_FAIRY_2, - RAND_INF_ZR_FAIRY_GROTTO_FAIRY_3, - RAND_INF_ZR_FAIRY_GROTTO_FAIRY_4, - RAND_INF_ZR_FAIRY_GROTTO_FAIRY_5, - RAND_INF_ZR_FAIRY_GROTTO_FAIRY_6, - RAND_INF_ZR_FAIRY_GROTTO_FAIRY_7, - RAND_INF_ZR_FAIRY_GROTTO_FAIRY_8, - RAND_INF_HF_FAIRY_GROTTO_FAIRY_1, - RAND_INF_HF_FAIRY_GROTTO_FAIRY_2, - RAND_INF_HF_FAIRY_GROTTO_FAIRY_3, - RAND_INF_HF_FAIRY_GROTTO_FAIRY_4, - RAND_INF_HF_FAIRY_GROTTO_FAIRY_5, - RAND_INF_HF_FAIRY_GROTTO_FAIRY_6, - RAND_INF_HF_FAIRY_GROTTO_FAIRY_7, - RAND_INF_HF_FAIRY_GROTTO_FAIRY_8, - RAND_INF_ZD_FAIRY_GROTTO_FAIRY_1, - RAND_INF_ZD_FAIRY_GROTTO_FAIRY_2, - RAND_INF_ZD_FAIRY_GROTTO_FAIRY_3, - RAND_INF_ZD_FAIRY_GROTTO_FAIRY_4, - RAND_INF_ZD_FAIRY_GROTTO_FAIRY_5, - RAND_INF_ZD_FAIRY_GROTTO_FAIRY_6, - RAND_INF_ZD_FAIRY_GROTTO_FAIRY_7, - RAND_INF_ZD_FAIRY_GROTTO_FAIRY_8, - RAND_INF_GF_FAIRY_GROTTO_FAIRY_1, - RAND_INF_GF_FAIRY_GROTTO_FAIRY_2, - RAND_INF_GF_FAIRY_GROTTO_FAIRY_3, - RAND_INF_GF_FAIRY_GROTTO_FAIRY_4, - RAND_INF_GF_FAIRY_GROTTO_FAIRY_5, - RAND_INF_GF_FAIRY_GROTTO_FAIRY_6, - RAND_INF_GF_FAIRY_GROTTO_FAIRY_7, - RAND_INF_GF_FAIRY_GROTTO_FAIRY_8, - RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, - RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, - RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_3, - RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_4, - RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_5, - RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, - RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, - RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, - RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_1, - RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_2, - RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_3, - RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_4, - RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_5, - RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_6, - RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_7, - RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_8, - RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, - RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, - RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, - RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, - RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, - RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, - RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, - RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, - RAND_INF_COLOSSUS_OASIS_FAIRY_1, - RAND_INF_COLOSSUS_OASIS_FAIRY_2, - RAND_INF_COLOSSUS_OASIS_FAIRY_3, - RAND_INF_COLOSSUS_OASIS_FAIRY_4, - RAND_INF_COLOSSUS_OASIS_FAIRY_5, - RAND_INF_COLOSSUS_OASIS_FAIRY_6, - RAND_INF_COLOSSUS_OASIS_FAIRY_7, - RAND_INF_COLOSSUS_OASIS_FAIRY_8, +DEFINE_RAND_INF(RAND_INF_ZR_BEAN_SPROUT_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_ZR_BEAN_SPROUT_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_ZR_BEAN_SPROUT_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_KF_BEAN_SPROUT_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_KF_BEAN_SPROUT_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_KF_BEAN_SPROUT_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_LH_BEAN_SPROUT_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_LH_BEAN_SPROUT_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_LH_BEAN_SPROUT_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_GV_BEAN_SPROUT_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_GV_BEAN_SPROUT_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_GV_BEAN_SPROUT_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_DMC_BEAN_SPROUT_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_DMC_BEAN_SPROUT_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_DMC_BEAN_SPROUT_FAIRY_3) +DEFINE_RAND_INF(RAND_INF_DMT_BEAN_SPROUT_FAIRY_1) +DEFINE_RAND_INF(RAND_INF_DMT_BEAN_SPROUT_FAIRY_2) +DEFINE_RAND_INF(RAND_INF_DMT_BEAN_SPROUT_FAIRY_3) - RAND_INF_ZR_BEAN_SPROUT_FAIRY_1, - RAND_INF_ZR_BEAN_SPROUT_FAIRY_2, - RAND_INF_ZR_BEAN_SPROUT_FAIRY_3, - RAND_INF_KF_BEAN_SPROUT_FAIRY_1, - RAND_INF_KF_BEAN_SPROUT_FAIRY_2, - RAND_INF_KF_BEAN_SPROUT_FAIRY_3, - RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, - RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, - RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, - RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, - RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, - RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, - RAND_INF_LH_BEAN_SPROUT_FAIRY_1, - RAND_INF_LH_BEAN_SPROUT_FAIRY_2, - RAND_INF_LH_BEAN_SPROUT_FAIRY_3, - RAND_INF_GV_BEAN_SPROUT_FAIRY_1, - RAND_INF_GV_BEAN_SPROUT_FAIRY_2, - RAND_INF_GV_BEAN_SPROUT_FAIRY_3, - RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_1, - RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_2, - RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_3, - RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_1, - RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_2, - RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_3, - RAND_INF_DMC_BEAN_SPROUT_FAIRY_1, - RAND_INF_DMC_BEAN_SPROUT_FAIRY_2, - RAND_INF_DMC_BEAN_SPROUT_FAIRY_3, - RAND_INF_DMT_BEAN_SPROUT_FAIRY_1, - RAND_INF_DMT_BEAN_SPROUT_FAIRY_2, - RAND_INF_DMT_BEAN_SPROUT_FAIRY_3, +DEFINE_RAND_INF(RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_DMC_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_DMC_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_DMT_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_DMT_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_GV_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_GV_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_KF_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_KF_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_LW_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_LW_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_ZD_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_ZD_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG) +DEFINE_RAND_INF(RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY) +DEFINE_RAND_INF(RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG) - RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, - RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, - RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, - RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, - RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_DMC_GOSSIP_STONE_FAIRY, - RAND_INF_DMC_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_DMT_GOSSIP_STONE_FAIRY, - RAND_INF_DMT_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY, - RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, - RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, - RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_GV_GOSSIP_STONE_FAIRY, - RAND_INF_GV_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY, - RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY, - RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY, - RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY, - RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, - RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, - RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, - RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY, - RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_KF_GOSSIP_STONE_FAIRY, - RAND_INF_KF_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, - RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY, - RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, - RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, - RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_LW_GOSSIP_STONE_FAIRY, - RAND_INF_LW_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, - RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY, - RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY, - RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_ZD_GOSSIP_STONE_FAIRY, - RAND_INF_ZD_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY, - RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY, - RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, - RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, - RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, - RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, - RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, - RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, - RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, - RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, - RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, - RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, - RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, - RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, - RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, +DEFINE_RAND_INF(RAND_INF_LH_ISLAND_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_HF_POND_STORMS_FAIRY) +DEFINE_RAND_INF(RAND_INF_DMT_FLAG_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_STORMS_FAIRY) +DEFINE_RAND_INF(RAND_INF_HF_FENCE_GROTTO_STORMS_FAIRY) +DEFINE_RAND_INF(RAND_INF_LW_SHORTCUT_STORMS_FAIRY) +DEFINE_RAND_INF(RAND_INF_GF_KITCHEN_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_PIT_STORM_FAIRY) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY) +DEFINE_RAND_INF(RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY) +DEFINE_RAND_INF(RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY) +DEFINE_RAND_INF(RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY) - RAND_INF_LH_ISLAND_SUN_FAIRY, - RAND_INF_HF_POND_STORMS_FAIRY, - RAND_INF_DMT_FLAG_SUN_FAIRY, - RAND_INF_DMT_COW_GROTTO_STORMS_FAIRY, - RAND_INF_HF_FENCE_GROTTO_STORMS_FAIRY, - RAND_INF_LW_SHORTCUT_STORMS_FAIRY, - RAND_INF_GF_KITCHEN_SUN_FAIRY, - RAND_INF_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY, - RAND_INF_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY, - RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, - RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, - RAND_INF_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, - RAND_INF_SHADOW_TEMPLE_PIT_STORM_FAIRY, - RAND_INF_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, - RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, - RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, - RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, - RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, - RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, - RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, - RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, - RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, - RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, - RAND_INF_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, - RAND_INF_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, - RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, +DEFINE_RAND_INF(RAND_INF_GUARD_HOUSE_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_GUARD_HOUSE_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_MARKET_BAZAAR_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_MARKET_BAZAAR_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_MARKET_POTION_SHOP_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_MASK_SHOP_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_MASK_SHOP_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_MARKET_SHOOTING_GALLERY_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_BOMBCHU_BOWLING_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_BOMBCHU_BOWLING_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_TREASURE_CHEST_GAME_BUILDING_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_TREASURE_CHEST_GAME_BUILDING_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_BOMBCHU_SHOP_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_BOMBCHU_SHOP_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_RICHARDS_HOUSE_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_RICHARDS_HOUSE_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_ALLEY_HOUSE_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_ALLEY_HOUSE_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_KAK_BAZAAR_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_KAK_BAZAAR_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_KAK_POTION_SHOP_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_KAK_POTION_SHOP_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_BOSS_HOUSE_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_BOSS_HOUSE_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_GRANNYS_POTION_SHOP_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_GRANNYS_POTION_SHOP_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_SKULLTULA_HOUSE_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_SKULLTULA_HOUSE_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_IMPAS_HOUSE_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_IMPAS_HOUSE_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_WINDMILL_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_WINDMILL_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_KAK_SHOOTING_GALLERY_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_DAMPES_HUT_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_DAMPES_HUT_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_TALONS_HOUSE_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_TALONS_HOUSE_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_STABLES_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_STABLES_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_BACK_TOWER_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_BACK_TOWER_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_HYLIA_LAB_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_HYLIA_LAB_KEY_OBTAINED) +DEFINE_RAND_INF(RAND_INF_FISHING_HOLE_UNLOCKED) +DEFINE_RAND_INF(RAND_INF_FISHING_HOLE_KEY_OBTAINED) - RAND_INF_GUARD_HOUSE_UNLOCKED, - RAND_INF_GUARD_HOUSE_KEY_OBTAINED, - RAND_INF_MARKET_BAZAAR_UNLOCKED, - RAND_INF_MARKET_BAZAAR_KEY_OBTAINED, - RAND_INF_MARKET_POTION_SHOP_UNLOCKED, - RAND_INF_MARKET_POTION_SHOP_KEY_OBTAINED, - RAND_INF_MASK_SHOP_UNLOCKED, - RAND_INF_MASK_SHOP_KEY_OBTAINED, - RAND_INF_MARKET_SHOOTING_GALLERY_UNLOCKED, - RAND_INF_MARKET_SHOOTING_GALLERY_KEY_OBTAINED, - RAND_INF_BOMBCHU_BOWLING_UNLOCKED, - RAND_INF_BOMBCHU_BOWLING_KEY_OBTAINED, - RAND_INF_TREASURE_CHEST_GAME_BUILDING_UNLOCKED, - RAND_INF_TREASURE_CHEST_GAME_BUILDING_KEY_OBTAINED, - RAND_INF_BOMBCHU_SHOP_UNLOCKED, - RAND_INF_BOMBCHU_SHOP_KEY_OBTAINED, - RAND_INF_RICHARDS_HOUSE_UNLOCKED, - RAND_INF_RICHARDS_HOUSE_KEY_OBTAINED, - RAND_INF_ALLEY_HOUSE_UNLOCKED, - RAND_INF_ALLEY_HOUSE_KEY_OBTAINED, - RAND_INF_KAK_BAZAAR_UNLOCKED, - RAND_INF_KAK_BAZAAR_KEY_OBTAINED, - RAND_INF_KAK_POTION_SHOP_UNLOCKED, - RAND_INF_KAK_POTION_SHOP_KEY_OBTAINED, - RAND_INF_BOSS_HOUSE_UNLOCKED, - RAND_INF_BOSS_HOUSE_KEY_OBTAINED, - RAND_INF_GRANNYS_POTION_SHOP_UNLOCKED, - RAND_INF_GRANNYS_POTION_SHOP_KEY_OBTAINED, - RAND_INF_SKULLTULA_HOUSE_UNLOCKED, - RAND_INF_SKULLTULA_HOUSE_KEY_OBTAINED, - RAND_INF_IMPAS_HOUSE_UNLOCKED, - RAND_INF_IMPAS_HOUSE_KEY_OBTAINED, - RAND_INF_WINDMILL_UNLOCKED, - RAND_INF_WINDMILL_KEY_OBTAINED, - RAND_INF_KAK_SHOOTING_GALLERY_UNLOCKED, - RAND_INF_KAK_SHOOTING_GALLERY_KEY_OBTAINED, - RAND_INF_DAMPES_HUT_UNLOCKED, - RAND_INF_DAMPES_HUT_KEY_OBTAINED, - RAND_INF_TALONS_HOUSE_UNLOCKED, - RAND_INF_TALONS_HOUSE_KEY_OBTAINED, - RAND_INF_STABLES_UNLOCKED, - RAND_INF_STABLES_KEY_OBTAINED, - RAND_INF_BACK_TOWER_UNLOCKED, - RAND_INF_BACK_TOWER_KEY_OBTAINED, - RAND_INF_HYLIA_LAB_UNLOCKED, - RAND_INF_HYLIA_LAB_KEY_OBTAINED, - RAND_INF_FISHING_HOLE_UNLOCKED, - RAND_INF_FISHING_HOLE_KEY_OBTAINED, +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_HAS_CHICKEN) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_HAS_MASK_KEATON) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_HAS_MASK_SKULL) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_HAS_MASK_SPOOKY) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_HAS_MASK_BUNNY) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_HAS_MASK_GORON) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_HAS_MASK_ZORA) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_HAS_MASK_GERUDO) +DEFINE_RAND_INF(RAND_INF_CHILD_TRADES_HAS_MASK_TRUTH) - RAND_INF_CHILD_TRADES_HAS_WEIRD_EGG, - RAND_INF_CHILD_TRADES_HAS_CHICKEN, - RAND_INF_CHILD_TRADES_HAS_LETTER_ZELDA, - RAND_INF_CHILD_TRADES_HAS_MASK_KEATON, - RAND_INF_CHILD_TRADES_HAS_MASK_SKULL, - RAND_INF_CHILD_TRADES_HAS_MASK_SPOOKY, - RAND_INF_CHILD_TRADES_HAS_MASK_BUNNY, - RAND_INF_CHILD_TRADES_HAS_MASK_GORON, - RAND_INF_CHILD_TRADES_HAS_MASK_ZORA, - RAND_INF_CHILD_TRADES_HAS_MASK_GERUDO, - RAND_INF_CHILD_TRADES_HAS_MASK_TRUTH, +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_HAS_POCKET_EGG) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_HAS_POCKET_CUCCO) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_HAS_COJIRO) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_HAS_ODD_MUSHROOM) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_HAS_ODD_POTION) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_HAS_SAW) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_HAS_SWORD_BROKEN) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_HAS_PRESCRIPTION) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_HAS_FROG) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_HAS_EYEDROPS) +DEFINE_RAND_INF(RAND_INF_ADULT_TRADES_HAS_CLAIM_CHECK) - RAND_INF_ADULT_TRADES_HAS_POCKET_EGG, - RAND_INF_ADULT_TRADES_HAS_POCKET_CUCCO, - RAND_INF_ADULT_TRADES_HAS_COJIRO, - RAND_INF_ADULT_TRADES_HAS_ODD_MUSHROOM, - RAND_INF_ADULT_TRADES_HAS_ODD_POTION, - RAND_INF_ADULT_TRADES_HAS_SAW, - RAND_INF_ADULT_TRADES_HAS_SWORD_BROKEN, - RAND_INF_ADULT_TRADES_HAS_PRESCRIPTION, - RAND_INF_ADULT_TRADES_HAS_FROG, - RAND_INF_ADULT_TRADES_HAS_EYEDROPS, - RAND_INF_ADULT_TRADES_HAS_CLAIM_CHECK, - - // Overworld Grass - RAND_INF_KF_CHILD_GRASS_1, - RAND_INF_KF_CHILD_GRASS_2, - RAND_INF_KF_CHILD_GRASS_3, - RAND_INF_KF_CHILD_GRASS_4, - RAND_INF_KF_CHILD_GRASS_5, - RAND_INF_KF_CHILD_GRASS_6, - RAND_INF_KF_CHILD_GRASS_7, - RAND_INF_KF_CHILD_GRASS_8, - RAND_INF_KF_CHILD_GRASS_9, - RAND_INF_KF_CHILD_GRASS_10, - RAND_INF_KF_CHILD_GRASS_11, - RAND_INF_KF_CHILD_GRASS_12, - RAND_INF_KF_CHILD_GRASS_MAZE_1, - RAND_INF_KF_CHILD_GRASS_MAZE_2, - RAND_INF_KF_CHILD_GRASS_MAZE_3, - RAND_INF_KF_ADULT_GRASS_1, - RAND_INF_KF_ADULT_GRASS_2, - RAND_INF_KF_ADULT_GRASS_3, - RAND_INF_KF_ADULT_GRASS_4, - RAND_INF_KF_ADULT_GRASS_5, - RAND_INF_KF_ADULT_GRASS_6, - RAND_INF_KF_ADULT_GRASS_7, - RAND_INF_KF_ADULT_GRASS_8, - RAND_INF_KF_ADULT_GRASS_9, - RAND_INF_KF_ADULT_GRASS_10, - RAND_INF_KF_ADULT_GRASS_11, - RAND_INF_KF_ADULT_GRASS_12, - RAND_INF_KF_ADULT_GRASS_13, - RAND_INF_KF_ADULT_GRASS_14, - RAND_INF_KF_ADULT_GRASS_15, - RAND_INF_KF_ADULT_GRASS_16, - RAND_INF_KF_ADULT_GRASS_17, - RAND_INF_KF_ADULT_GRASS_18, - RAND_INF_KF_ADULT_GRASS_19, - RAND_INF_KF_ADULT_GRASS_20, - RAND_INF_LW_GRASS_1, - RAND_INF_LW_GRASS_2, - RAND_INF_LW_GRASS_3, - RAND_INF_LW_GRASS_4, - RAND_INF_LW_GRASS_5, - RAND_INF_LW_GRASS_6, - RAND_INF_LW_GRASS_7, - RAND_INF_LW_GRASS_8, - RAND_INF_LW_GRASS_9, - RAND_INF_MARKET_GRASS_1, - RAND_INF_MARKET_GRASS_2, - RAND_INF_MARKET_GRASS_3, - RAND_INF_MARKET_GRASS_4, - RAND_INF_MARKET_GRASS_5, - RAND_INF_MARKET_GRASS_6, - RAND_INF_MARKET_GRASS_7, - RAND_INF_MARKET_GRASS_8, - RAND_INF_HC_GRASS_1, - RAND_INF_HC_GRASS_2, - RAND_INF_KAK_GRASS_1, - RAND_INF_KAK_GRASS_2, - RAND_INF_KAK_GRASS_3, - RAND_INF_KAK_GRASS_4, - RAND_INF_KAK_GRASS_5, - RAND_INF_KAK_GRASS_6, - RAND_INF_KAK_GRASS_7, - RAND_INF_KAK_GRASS_8, - RAND_INF_GY_GRASS_1, - RAND_INF_GY_GRASS_2, - RAND_INF_GY_GRASS_3, - RAND_INF_GY_GRASS_4, - RAND_INF_GY_GRASS_5, - RAND_INF_GY_GRASS_6, - RAND_INF_GY_GRASS_7, - RAND_INF_GY_GRASS_8, - RAND_INF_GY_GRASS_9, - RAND_INF_GY_GRASS_10, - RAND_INF_GY_GRASS_11, - RAND_INF_GY_GRASS_12, - RAND_INF_LH_GRASS_1, - RAND_INF_LH_GRASS_2, - RAND_INF_LH_GRASS_3, - RAND_INF_LH_GRASS_4, - RAND_INF_LH_GRASS_5, - RAND_INF_LH_GRASS_6, - RAND_INF_LH_GRASS_7, - RAND_INF_LH_GRASS_8, - RAND_INF_LH_GRASS_9, - RAND_INF_LH_GRASS_10, - RAND_INF_LH_GRASS_11, - RAND_INF_LH_GRASS_12, - RAND_INF_LH_GRASS_13, - RAND_INF_LH_GRASS_14, - RAND_INF_LH_GRASS_15, - RAND_INF_LH_GRASS_16, - RAND_INF_LH_GRASS_17, - RAND_INF_LH_GRASS_18, - RAND_INF_LH_GRASS_19, - RAND_INF_LH_GRASS_20, - RAND_INF_LH_GRASS_21, - RAND_INF_LH_GRASS_22, - RAND_INF_LH_GRASS_23, - RAND_INF_LH_GRASS_24, - RAND_INF_LH_GRASS_25, - RAND_INF_LH_GRASS_26, - RAND_INF_LH_GRASS_27, - RAND_INF_LH_GRASS_28, - RAND_INF_LH_GRASS_29, - RAND_INF_LH_GRASS_30, - RAND_INF_LH_GRASS_31, - RAND_INF_LH_GRASS_32, - RAND_INF_LH_GRASS_33, - RAND_INF_LH_GRASS_34, - RAND_INF_LH_GRASS_35, - RAND_INF_LH_GRASS_36, - RAND_INF_LH_CHILD_GRASS_1, - RAND_INF_LH_CHILD_GRASS_2, - RAND_INF_LH_CHILD_GRASS_3, - RAND_INF_LH_CHILD_GRASS_4, - RAND_INF_LH_WARP_PAD_GRASS_1, - RAND_INF_LH_WARP_PAD_GRASS_2, - RAND_INF_HF_NEAR_KF_GRASS_1, - RAND_INF_HF_NEAR_KF_GRASS_2, - RAND_INF_HF_NEAR_KF_GRASS_3, - RAND_INF_HF_NEAR_KF_GRASS_4, - RAND_INF_HF_NEAR_KF_GRASS_5, - RAND_INF_HF_NEAR_KF_GRASS_6, - RAND_INF_HF_NEAR_KF_GRASS_7, - RAND_INF_HF_NEAR_KF_GRASS_8, - RAND_INF_HF_NEAR_KF_GRASS_9, - RAND_INF_HF_NEAR_KF_GRASS_10, - RAND_INF_HF_NEAR_KF_GRASS_11, - RAND_INF_HF_NEAR_KF_GRASS_12, - RAND_INF_HF_NEAR_MARKET_GRASS_1, - RAND_INF_HF_NEAR_MARKET_GRASS_2, - RAND_INF_HF_NEAR_MARKET_GRASS_3, - RAND_INF_HF_NEAR_MARKET_GRASS_4, - RAND_INF_HF_NEAR_MARKET_GRASS_5, - RAND_INF_HF_NEAR_MARKET_GRASS_6, - RAND_INF_HF_NEAR_MARKET_GRASS_7, - RAND_INF_HF_NEAR_MARKET_GRASS_8, - RAND_INF_HF_NEAR_MARKET_GRASS_9, - RAND_INF_HF_NEAR_MARKET_GRASS_10, - RAND_INF_HF_NEAR_MARKET_GRASS_11, - RAND_INF_HF_NEAR_MARKET_GRASS_12, - RAND_INF_HF_SOUTH_GRASS_1, - RAND_INF_HF_SOUTH_GRASS_2, - RAND_INF_HF_SOUTH_GRASS_3, - RAND_INF_HF_SOUTH_GRASS_4, - RAND_INF_HF_SOUTH_GRASS_5, - RAND_INF_HF_SOUTH_GRASS_6, - RAND_INF_HF_SOUTH_GRASS_7, - RAND_INF_HF_SOUTH_GRASS_8, - RAND_INF_HF_SOUTH_GRASS_9, - RAND_INF_HF_SOUTH_GRASS_10, - RAND_INF_HF_SOUTH_GRASS_11, - RAND_INF_HF_SOUTH_GRASS_12, - RAND_INF_HF_CENTRAL_GRASS_1, - RAND_INF_HF_CENTRAL_GRASS_2, - RAND_INF_HF_CENTRAL_GRASS_3, - RAND_INF_HF_CENTRAL_GRASS_4, - RAND_INF_HF_CENTRAL_GRASS_5, - RAND_INF_HF_CENTRAL_GRASS_6, - RAND_INF_HF_CENTRAL_GRASS_7, - RAND_INF_HF_CENTRAL_GRASS_8, - RAND_INF_HF_CENTRAL_GRASS_9, - RAND_INF_HF_CENTRAL_GRASS_10, - RAND_INF_HF_CENTRAL_GRASS_11, - RAND_INF_HF_CENTRAL_GRASS_12, - RAND_INF_ZR_GRASS_1, - RAND_INF_ZR_GRASS_2, - RAND_INF_ZR_GRASS_3, - RAND_INF_ZR_GRASS_4, - RAND_INF_ZR_GRASS_5, - RAND_INF_ZR_GRASS_6, - RAND_INF_ZR_GRASS_7, - RAND_INF_ZR_GRASS_8, - RAND_INF_ZR_GRASS_9, - RAND_INF_ZR_GRASS_10, - RAND_INF_ZR_GRASS_11, - RAND_INF_ZR_GRASS_12, - RAND_INF_ZR_NEAR_FREESTANDING_POH_GRASS, - // Grotto Grass - RAND_INF_KF_STORMS_GROTTO_GRASS_1, - RAND_INF_KF_STORMS_GROTTO_GRASS_2, - RAND_INF_KF_STORMS_GROTTO_GRASS_3, - RAND_INF_KF_STORMS_GROTTO_GRASS_4, - RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1, - RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2, - RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3, - RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4, - RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_1, - RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_2, - RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_3, - RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_4, - RAND_INF_HF_OPEN_GROTTO_GRASS_1, - RAND_INF_HF_OPEN_GROTTO_GRASS_2, - RAND_INF_HF_OPEN_GROTTO_GRASS_3, - RAND_INF_HF_OPEN_GROTTO_GRASS_4, - RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_1, - RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_2, - RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_3, - RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_4, - RAND_INF_HF_COW_GROTTO_GRASS_1, - RAND_INF_HF_COW_GROTTO_GRASS_2, - RAND_INF_KAK_OPEN_GROTTO_GRASS_1, - RAND_INF_KAK_OPEN_GROTTO_GRASS_2, - RAND_INF_KAK_OPEN_GROTTO_GRASS_3, - RAND_INF_KAK_OPEN_GROTTO_GRASS_4, - RAND_INF_DMT_STORMS_GROTTO_GRASS_1, - RAND_INF_DMT_STORMS_GROTTO_GRASS_2, - RAND_INF_DMT_STORMS_GROTTO_GRASS_3, - RAND_INF_DMT_STORMS_GROTTO_GRASS_4, - RAND_INF_DMT_COW_GROTTO_GRASS_1, - RAND_INF_DMT_COW_GROTTO_GRASS_2, - RAND_INF_DMC_UPPER_GROTTO_GRASS_1, - RAND_INF_DMC_UPPER_GROTTO_GRASS_2, - RAND_INF_DMC_UPPER_GROTTO_GRASS_3, - RAND_INF_DMC_UPPER_GROTTO_GRASS_4, - RAND_INF_ZR_OPEN_GROTTO_GRASS_1, - RAND_INF_ZR_OPEN_GROTTO_GRASS_2, - RAND_INF_ZR_OPEN_GROTTO_GRASS_3, - RAND_INF_ZR_OPEN_GROTTO_GRASS_4, - // Dungeon Grass - RAND_INF_DEKU_TREE_LOBBY_GRASS_1, - RAND_INF_DEKU_TREE_LOBBY_GRASS_2, - RAND_INF_DEKU_TREE_LOBBY_GRASS_3, - RAND_INF_DEKU_TREE_LOBBY_GRASS_4, - RAND_INF_DEKU_TREE_LOBBY_GRASS_5, - RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_1, - RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_2, - RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_3, - RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_4, - RAND_INF_DEKU_TREE_COMPASS_GRASS_1, - RAND_INF_DEKU_TREE_COMPASS_GRASS_2, - RAND_INF_DEKU_TREE_BASEMENT_GRASS_1, - RAND_INF_DEKU_TREE_BASEMENT_GRASS_2, - RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1, - RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2, - RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3, - RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4, - RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1, - RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2, - RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_1, - RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_2, - RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_1, - RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_2, - RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_1, - RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_2, - RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_3, - RAND_INF_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS, - RAND_INF_DODONGOS_CAVERN_BLADE_GRASS, - RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_GRASS, - RAND_INF_DODONGOS_CAVERN_BEFORE_BOSS_GRASS, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3, - // MQ Dungeon Grass - RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_1, - RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_2, - RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_3, - RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_4, - RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_5, - RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_6, - RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_7, - RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_1, - RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_2, - RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_3, - RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_4, - RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1, - RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2, - RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3, - RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4, - RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5, - RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6, - RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7, - RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_1, - RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_2, - RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_3, - RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_4, - RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1, - RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2, - RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3, - RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4, - RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1, - RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2, - RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3, - RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1, - RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2, - RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3, - RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1, - RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2, - RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1, - RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2, - RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3, - RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4, - RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1, - RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2, - RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1, - RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2, - RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3, - RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4, - RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5, - RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1, - RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2, - RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3, - RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1, - RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2, - RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3, - RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1, - RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2, - RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3, - RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4, - RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_GRASS, - RAND_INF_DODONGOS_CAVERN_MQ_BACK_POE_GRASS, - RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1, - RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2, - RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1, - RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2, - RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_1, - RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_2, - RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1, - RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2, - RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3, - RAND_INF_JABU_JABUS_BELLY_MQ_JIGGLIES_GRASS, - RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1, - RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2, - RAND_INF_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS, - RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS, - RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1, - RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3, - RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4, - // Shared Dungeon Grass - RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_1, - RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_2, - RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_3, - RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_4, - RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_5, - RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_6, - RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_7, - RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_8, - // End Grass - RAND_INF_OBTAINED_RUTOS_LETTER, - // If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be - // ceil(RAND_INF_MAX / 16) - - RAND_INF_MAX, -} RandomizerInf; +// Overworld Grass +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_1) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_2) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_3) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_4) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_5) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_6) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_7) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_8) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_9) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_10) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_11) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_12) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_MAZE_1) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_MAZE_2) +DEFINE_RAND_INF(RAND_INF_KF_CHILD_GRASS_MAZE_3) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_1) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_2) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_3) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_4) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_5) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_6) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_7) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_8) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_9) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_10) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_11) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_12) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_13) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_14) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_15) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_16) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_17) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_18) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_19) +DEFINE_RAND_INF(RAND_INF_KF_ADULT_GRASS_20) +DEFINE_RAND_INF(RAND_INF_LW_GRASS_1) +DEFINE_RAND_INF(RAND_INF_LW_GRASS_2) +DEFINE_RAND_INF(RAND_INF_LW_GRASS_3) +DEFINE_RAND_INF(RAND_INF_LW_GRASS_4) +DEFINE_RAND_INF(RAND_INF_LW_GRASS_5) +DEFINE_RAND_INF(RAND_INF_LW_GRASS_6) +DEFINE_RAND_INF(RAND_INF_LW_GRASS_7) +DEFINE_RAND_INF(RAND_INF_LW_GRASS_8) +DEFINE_RAND_INF(RAND_INF_LW_GRASS_9) +DEFINE_RAND_INF(RAND_INF_MARKET_GRASS_1) +DEFINE_RAND_INF(RAND_INF_MARKET_GRASS_2) +DEFINE_RAND_INF(RAND_INF_MARKET_GRASS_3) +DEFINE_RAND_INF(RAND_INF_MARKET_GRASS_4) +DEFINE_RAND_INF(RAND_INF_MARKET_GRASS_5) +DEFINE_RAND_INF(RAND_INF_MARKET_GRASS_6) +DEFINE_RAND_INF(RAND_INF_MARKET_GRASS_7) +DEFINE_RAND_INF(RAND_INF_MARKET_GRASS_8) +DEFINE_RAND_INF(RAND_INF_HC_GRASS_1) +DEFINE_RAND_INF(RAND_INF_HC_GRASS_2) +DEFINE_RAND_INF(RAND_INF_KAK_GRASS_1) +DEFINE_RAND_INF(RAND_INF_KAK_GRASS_2) +DEFINE_RAND_INF(RAND_INF_KAK_GRASS_3) +DEFINE_RAND_INF(RAND_INF_KAK_GRASS_4) +DEFINE_RAND_INF(RAND_INF_KAK_GRASS_5) +DEFINE_RAND_INF(RAND_INF_KAK_GRASS_6) +DEFINE_RAND_INF(RAND_INF_KAK_GRASS_7) +DEFINE_RAND_INF(RAND_INF_KAK_GRASS_8) +DEFINE_RAND_INF(RAND_INF_GY_GRASS_1) +DEFINE_RAND_INF(RAND_INF_GY_GRASS_2) +DEFINE_RAND_INF(RAND_INF_GY_GRASS_3) +DEFINE_RAND_INF(RAND_INF_GY_GRASS_4) +DEFINE_RAND_INF(RAND_INF_GY_GRASS_5) +DEFINE_RAND_INF(RAND_INF_GY_GRASS_6) +DEFINE_RAND_INF(RAND_INF_GY_GRASS_7) +DEFINE_RAND_INF(RAND_INF_GY_GRASS_8) +DEFINE_RAND_INF(RAND_INF_GY_GRASS_9) +DEFINE_RAND_INF(RAND_INF_GY_GRASS_10) +DEFINE_RAND_INF(RAND_INF_GY_GRASS_11) +DEFINE_RAND_INF(RAND_INF_GY_GRASS_12) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_1) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_2) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_3) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_4) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_5) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_6) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_7) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_8) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_9) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_10) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_11) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_12) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_13) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_14) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_15) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_16) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_17) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_18) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_19) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_20) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_21) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_22) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_23) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_24) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_25) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_26) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_27) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_28) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_29) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_30) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_31) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_32) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_33) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_34) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_35) +DEFINE_RAND_INF(RAND_INF_LH_GRASS_36) +DEFINE_RAND_INF(RAND_INF_LH_CHILD_GRASS_1) +DEFINE_RAND_INF(RAND_INF_LH_CHILD_GRASS_2) +DEFINE_RAND_INF(RAND_INF_LH_CHILD_GRASS_3) +DEFINE_RAND_INF(RAND_INF_LH_CHILD_GRASS_4) +DEFINE_RAND_INF(RAND_INF_LH_WARP_PAD_GRASS_1) +DEFINE_RAND_INF(RAND_INF_LH_WARP_PAD_GRASS_2) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_KF_GRASS_1) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_KF_GRASS_2) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_KF_GRASS_3) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_KF_GRASS_4) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_KF_GRASS_5) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_KF_GRASS_6) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_KF_GRASS_7) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_KF_GRASS_8) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_KF_GRASS_9) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_KF_GRASS_10) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_KF_GRASS_11) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_KF_GRASS_12) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GRASS_1) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GRASS_2) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GRASS_3) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GRASS_4) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GRASS_5) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GRASS_6) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GRASS_7) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GRASS_8) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GRASS_9) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GRASS_10) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GRASS_11) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GRASS_12) +DEFINE_RAND_INF(RAND_INF_HF_SOUTH_GRASS_1) +DEFINE_RAND_INF(RAND_INF_HF_SOUTH_GRASS_2) +DEFINE_RAND_INF(RAND_INF_HF_SOUTH_GRASS_3) +DEFINE_RAND_INF(RAND_INF_HF_SOUTH_GRASS_4) +DEFINE_RAND_INF(RAND_INF_HF_SOUTH_GRASS_5) +DEFINE_RAND_INF(RAND_INF_HF_SOUTH_GRASS_6) +DEFINE_RAND_INF(RAND_INF_HF_SOUTH_GRASS_7) +DEFINE_RAND_INF(RAND_INF_HF_SOUTH_GRASS_8) +DEFINE_RAND_INF(RAND_INF_HF_SOUTH_GRASS_9) +DEFINE_RAND_INF(RAND_INF_HF_SOUTH_GRASS_10) +DEFINE_RAND_INF(RAND_INF_HF_SOUTH_GRASS_11) +DEFINE_RAND_INF(RAND_INF_HF_SOUTH_GRASS_12) +DEFINE_RAND_INF(RAND_INF_HF_CENTRAL_GRASS_1) +DEFINE_RAND_INF(RAND_INF_HF_CENTRAL_GRASS_2) +DEFINE_RAND_INF(RAND_INF_HF_CENTRAL_GRASS_3) +DEFINE_RAND_INF(RAND_INF_HF_CENTRAL_GRASS_4) +DEFINE_RAND_INF(RAND_INF_HF_CENTRAL_GRASS_5) +DEFINE_RAND_INF(RAND_INF_HF_CENTRAL_GRASS_6) +DEFINE_RAND_INF(RAND_INF_HF_CENTRAL_GRASS_7) +DEFINE_RAND_INF(RAND_INF_HF_CENTRAL_GRASS_8) +DEFINE_RAND_INF(RAND_INF_HF_CENTRAL_GRASS_9) +DEFINE_RAND_INF(RAND_INF_HF_CENTRAL_GRASS_10) +DEFINE_RAND_INF(RAND_INF_HF_CENTRAL_GRASS_11) +DEFINE_RAND_INF(RAND_INF_HF_CENTRAL_GRASS_12) +DEFINE_RAND_INF(RAND_INF_ZR_GRASS_1) +DEFINE_RAND_INF(RAND_INF_ZR_GRASS_2) +DEFINE_RAND_INF(RAND_INF_ZR_GRASS_3) +DEFINE_RAND_INF(RAND_INF_ZR_GRASS_4) +DEFINE_RAND_INF(RAND_INF_ZR_GRASS_5) +DEFINE_RAND_INF(RAND_INF_ZR_GRASS_6) +DEFINE_RAND_INF(RAND_INF_ZR_GRASS_7) +DEFINE_RAND_INF(RAND_INF_ZR_GRASS_8) +DEFINE_RAND_INF(RAND_INF_ZR_GRASS_9) +DEFINE_RAND_INF(RAND_INF_ZR_GRASS_10) +DEFINE_RAND_INF(RAND_INF_ZR_GRASS_11) +DEFINE_RAND_INF(RAND_INF_ZR_GRASS_12) +DEFINE_RAND_INF(RAND_INF_ZR_NEAR_FREESTANDING_POH_GRASS) +// Grotto Grass +DEFINE_RAND_INF(RAND_INF_KF_STORMS_GROTTO_GRASS_1) +DEFINE_RAND_INF(RAND_INF_KF_STORMS_GROTTO_GRASS_2) +DEFINE_RAND_INF(RAND_INF_KF_STORMS_GROTTO_GRASS_3) +DEFINE_RAND_INF(RAND_INF_KF_STORMS_GROTTO_GRASS_4) +DEFINE_RAND_INF(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_1) +DEFINE_RAND_INF(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_2) +DEFINE_RAND_INF(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_3) +DEFINE_RAND_INF(RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GRASS_4) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_1) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_2) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_3) +DEFINE_RAND_INF(RAND_INF_HF_NEAR_MARKET_GROTTO_GRASS_4) +DEFINE_RAND_INF(RAND_INF_HF_OPEN_GROTTO_GRASS_1) +DEFINE_RAND_INF(RAND_INF_HF_OPEN_GROTTO_GRASS_2) +DEFINE_RAND_INF(RAND_INF_HF_OPEN_GROTTO_GRASS_3) +DEFINE_RAND_INF(RAND_INF_HF_OPEN_GROTTO_GRASS_4) +DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_1) +DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_2) +DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_3) +DEFINE_RAND_INF(RAND_INF_HF_SOUTHEAST_GROTTO_GRASS_4) +DEFINE_RAND_INF(RAND_INF_HF_COW_GROTTO_GRASS_1) +DEFINE_RAND_INF(RAND_INF_HF_COW_GROTTO_GRASS_2) +DEFINE_RAND_INF(RAND_INF_KAK_OPEN_GROTTO_GRASS_1) +DEFINE_RAND_INF(RAND_INF_KAK_OPEN_GROTTO_GRASS_2) +DEFINE_RAND_INF(RAND_INF_KAK_OPEN_GROTTO_GRASS_3) +DEFINE_RAND_INF(RAND_INF_KAK_OPEN_GROTTO_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DMT_STORMS_GROTTO_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DMT_STORMS_GROTTO_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DMT_STORMS_GROTTO_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DMT_STORMS_GROTTO_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DMC_UPPER_GROTTO_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DMC_UPPER_GROTTO_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DMC_UPPER_GROTTO_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DMC_UPPER_GROTTO_GRASS_4) +DEFINE_RAND_INF(RAND_INF_ZR_OPEN_GROTTO_GRASS_1) +DEFINE_RAND_INF(RAND_INF_ZR_OPEN_GROTTO_GRASS_2) +DEFINE_RAND_INF(RAND_INF_ZR_OPEN_GROTTO_GRASS_3) +DEFINE_RAND_INF(RAND_INF_ZR_OPEN_GROTTO_GRASS_4) +// Dungeon Grass +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_LOBBY_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_LOBBY_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_LOBBY_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_LOBBY_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_LOBBY_GRASS_5) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_SLINGSHOT_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_COMPASS_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_COMPASS_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BASEMENT_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BASEMENT_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BASEMENT_TORCHES_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BASEMENT_LARVAE_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_BEFORE_BOSS_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_FIRST_BRIDGE_GRASS) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_BLADE_GRASS) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_GRASS) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_BEFORE_BOSS_GRASS) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_1) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_2) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_3) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_4) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_5) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_6) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_1) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_2) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_GRASS_3) +// MQ Dungeon Grass +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_5) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_6) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_LOBBY_GRASS_7) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_5) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_6) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_7) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_COMPASS_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_LOWER_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_UPPER_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_FRONT_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_SPIKE_ROLLER_BACK_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_TORCHES_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_GRAVES_GRASS_5) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_COMPASS_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_GRASS) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_BACK_POE_GRASS) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_SCRUB_GRASS_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_FIRST_GRASS_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_PIT_GRASS_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_GRASS_3) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_JIGGLIES_GRASS) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_AFTER_BIG_OCTO_GRASS_2) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_GRASS) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_BASEMENT_BOOMERANG_GRASS) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_1) +DEFINE_RAND_INF(RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_GRASS_2) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_1) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_2) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_3) +DEFINE_RAND_INF(RAND_INF_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_GRASS_4) +// Shared Dungeon Grass +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_1) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_2) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_3) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_4) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_5) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_6) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_7) +DEFINE_RAND_INF(RAND_INF_DEKU_TREE_QUEEN_GOHMA_GRASS_8) +// End Grass +DEFINE_RAND_INF(RAND_INF_OBTAINED_RUTOS_LETTER) \ No newline at end of file From f5d8f1eece7642eed7125f731da66a83ef236585 Mon Sep 17 00:00:00 2001 From: Pepe20129 <72659707+Pepe20129@users.noreply.github.com> Date: Fri, 30 May 2025 21:51:21 +0200 Subject: [PATCH 16/67] Add `ShuffleSongs.cpp` & `RO_SONG_SHUFFLE_OFF` (#5534) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ShuffleSongs.cpp * Address review and fix build * Update soh/soh/Enhancements/randomizer/settings.cpp Co-authored-by: Philip DubΓ© * Change back to "Off" --------- Co-authored-by: Philip DubΓ© --- .../Enhancements/randomizer/3drando/fill.cpp | 7 ++--- .../randomizer/3drando/item_pool.cpp | 25 ++++++++++++++---- .../Enhancements/randomizer/ShuffleSongs.cpp | 26 +++++++++++++++++++ soh/soh/Enhancements/randomizer/context.cpp | 1 + .../Enhancements/randomizer/location_list.cpp | 14 ---------- .../randomizer/option_descriptions.cpp | 2 ++ .../Enhancements/randomizer/randomizerTypes.h | 1 + .../randomizer/randomizer_check_objects.cpp | 6 +++-- .../randomizer/randomizer_check_tracker.cpp | 5 ++++ soh/soh/Enhancements/randomizer/settings.cpp | 2 +- soh/soh/Enhancements/randomizer/static_data.h | 1 + soh/soh/ShipInit.hpp | 1 + soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c | 11 -------- 13 files changed, 66 insertions(+), 36 deletions(-) create mode 100644 soh/soh/Enhancements/randomizer/ShuffleSongs.cpp diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.cpp b/soh/soh/Enhancements/randomizer/3drando/fill.cpp index 0fe779cf1..55fba1740 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.cpp @@ -1015,7 +1015,8 @@ static void RandomizeOwnDungeon(const Rando::DungeonInfo* dungeon) { // filter out locations that may be required to have songs placed at them dungeonLocations = FilterFromPool(dungeonLocations, [ctx](const auto loc) { - if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_SONG_LOCATIONS)) { + if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_SONG_LOCATIONS) || + ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_OFF)) { return !(Rando::StaticData::GetLocation(loc)->GetRCType() == RCTYPE_SONG_LOCATION); } if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_DUNGEON_REWARDS)) { @@ -1344,8 +1345,8 @@ int Fill() { StartPerformanceTimer(PT_LIMITED_CHECKS); // Then Place songs if song shuffle is set to specific locations - if (ctx->GetOption(RSK_SHUFFLE_SONGS).IsNot(RO_SONG_SHUFFLE_ANYWHERE)) { - + if (ctx->GetOption(RSK_SHUFFLE_SONGS).IsNot(RO_SONG_SHUFFLE_ANYWHERE) && + ctx->GetOption(RSK_SHUFFLE_SONGS).IsNot(RO_SONG_SHUFFLE_OFF)) { // Get each song std::vector songs = FilterAndEraseFromPool(ItemPool, [](const auto i) { return Rando::StaticData::RetrieveItem(i).GetItemType() == ITEMTYPE_SONG; diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 9a858e059..fbe800662 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -1133,11 +1133,26 @@ void GenerateItemPool() { } } - // add extra songs only if song shuffle is anywhere - AddItemsToPool(ItemPool, songList); - if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_ANYWHERE) && - ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { - AddItemsToPool(PendingJunkPool, songList); + if (ctx->GetOption(RSK_SHUFFLE_SONGS).IsNot(RO_SONG_SHUFFLE_OFF)) { + AddItemsToPool(ItemPool, songList); + // add extra songs only if song shuffle is anywhere + if (ctx->GetOption(RSK_SHUFFLE_SONGS).Is(RO_SONG_SHUFFLE_ANYWHERE) && + ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) { + AddItemsToPool(PendingJunkPool, songList); + } + } else { + ctx->PlaceItemInLocation(RC_SHEIK_IN_FOREST, RG_MINUET_OF_FOREST, false, true); + ctx->PlaceItemInLocation(RC_SHEIK_IN_CRATER, RG_BOLERO_OF_FIRE, false, true); + ctx->PlaceItemInLocation(RC_SHEIK_IN_ICE_CAVERN, RG_SERENADE_OF_WATER, false, true); + ctx->PlaceItemInLocation(RC_SHEIK_AT_COLOSSUS, RG_REQUIEM_OF_SPIRIT, false, true); + ctx->PlaceItemInLocation(RC_SHEIK_IN_KAKARIKO, RG_NOCTURNE_OF_SHADOW, false, true); + ctx->PlaceItemInLocation(RC_SHEIK_AT_TEMPLE, RG_PRELUDE_OF_LIGHT, false, true); + ctx->PlaceItemInLocation(RC_SONG_FROM_IMPA, RG_ZELDAS_LULLABY, false, true); + ctx->PlaceItemInLocation(RC_SONG_FROM_MALON, RG_EPONAS_SONG, false, true); + ctx->PlaceItemInLocation(RC_SONG_FROM_SARIA, RG_SARIAS_SONG, false, true); + ctx->PlaceItemInLocation(RC_SONG_FROM_ROYAL_FAMILYS_TOMB, RG_SUNS_SONG, false, true); + ctx->PlaceItemInLocation(RC_SONG_FROM_OCARINA_OF_TIME, RG_SONG_OF_TIME, false, true); + ctx->PlaceItemInLocation(RC_SONG_FROM_WINDMILL, RG_SONG_OF_STORMS, false, true); } /*For item pool generation, dungeon items are either placed in their vanilla diff --git a/soh/soh/Enhancements/randomizer/ShuffleSongs.cpp b/soh/soh/Enhancements/randomizer/ShuffleSongs.cpp new file mode 100644 index 000000000..8bece13a1 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleSongs.cpp @@ -0,0 +1,26 @@ +#include "soh/ShipInit.hpp" +#include "location.h" +#include "static_data.h" + +void Rando::StaticData::RegisterSongLocations() { + static bool registered = false; + if (registered) + return; + registered = true; + // clang-format off + locationTable[RC_SHEIK_IN_FOREST] = Location::Base(RC_SHEIK_IN_FOREST, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_SACRED_FOREST_MEADOW, 0x00, "Sheik in Forest", "Sheik in Forest", RHT_SHEIK_IN_FOREST, RG_MINUET_OF_FOREST, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_MINUET_OF_FOREST), true); + locationTable[RC_SHEIK_IN_CRATER] = Location::Base(RC_SHEIK_IN_CRATER, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_DEATH_MOUNTAIN_CRATER, 0x00, "Sheik in Crater", "Sheik in Crater", RHT_SHEIK_IN_CRATER, RG_BOLERO_OF_FIRE, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_BOLERO_OF_FIRE), true); + locationTable[RC_SHEIK_IN_ICE_CAVERN] = Location::Base(RC_SHEIK_IN_ICE_CAVERN, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_ICE_CAVERN, 0x00, "Sheik in Ice Cavern", "Sheik in Ice Cavern", RHT_SHEIK_IN_ICE_CAVERN, RG_SERENADE_OF_WATER, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER), true); + locationTable[RC_SHEIK_AT_COLOSSUS] = Location::Base(RC_SHEIK_AT_COLOSSUS, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_DESERT_COLOSSUS, 0x00, "Sheik at Colossus", "Sheik at Colossus", RHT_SHEIK_AT_COLOSSUS, RG_REQUIEM_OF_SPIRIT, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_REQUIEM_OF_SPIRIT), true); + locationTable[RC_SHEIK_IN_KAKARIKO] = Location::Base(RC_SHEIK_IN_KAKARIKO, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_KAKARIKO_VILLAGE, 0x00, "Sheik in Kakariko", "Sheik in Kakariko", RHT_SHEIK_IN_KAKARIKO, RG_NOCTURNE_OF_SHADOW, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_BONGO_BONGO_ESCAPED_FROM_WELL), true); + locationTable[RC_SHEIK_AT_TEMPLE] = Location::Base(RC_SHEIK_AT_TEMPLE, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_TEMPLE_OF_TIME, 0x00, "Sheik at Temple", "Sheik at Temple", RHT_SHEIK_AT_TEMPLE, RG_PRELUDE_OF_LIGHT, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT), true); + locationTable[RC_SONG_FROM_IMPA] = Location::Base(RC_SONG_FROM_IMPA, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, RCAREA_HYRULE_CASTLE, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, "Song from Impa", "Song from Impa", RHT_SONG_FROM_IMPA, RG_ZELDAS_LULLABY, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_ZELDAS_LULLABY), true); + locationTable[RC_SONG_FROM_MALON] = Location::Base(RC_SONG_FROM_MALON, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_LON_LON_RANCH, 0x00, "Song from Malon", "Song from Malon", RHT_SONG_FROM_MALON, RG_EPONAS_SONG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LEARNED_EPONA_SONG), true); + locationTable[RC_SONG_FROM_SARIA] = Location::Base(RC_SONG_FROM_SARIA, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_SACRED_FOREST_MEADOW, 0x00, "Song from Saria", "Song from Saria", RHT_SONG_FROM_SARIA, RG_SARIAS_SONG, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_SARIAS_SONG), true); + locationTable[RC_SONG_FROM_ROYAL_FAMILYS_TOMB] = Location::Base(RC_SONG_FROM_ROYAL_FAMILYS_TOMB, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_ROYAL_FAMILYS_TOMB, 0x00, "Song from Royal Family's Tomb", "Song from Royal Family's Tomb", RHT_SONG_FROM_ROYAL_FAMILYS_TOMB, RG_SUNS_SONG, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_SUNS_SONG), true); + locationTable[RC_SONG_FROM_OCARINA_OF_TIME] = Location::Base(RC_SONG_FROM_OCARINA_OF_TIME, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_HYRULE_FIELD, 0x00, "Song from Ocarina of Time", "Song from Ocarina of Time", RHT_SONG_FROM_OCARINA_OF_TIME, RG_SONG_OF_TIME, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_SONG_OF_TIME), true); + locationTable[RC_SONG_FROM_WINDMILL] = Location::Base(RC_SONG_FROM_WINDMILL, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_WINDMILL_AND_DAMPES_GRAVE, 0x00, "Song from Windmill", "Song from Windmill", RHT_SONG_FROM_WINDMILL, RG_SONG_OF_STORMS, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_SONG_OF_STORMS), true); + // clang-format-on +} + +static RegisterShipInitFunc initSongLocations(Rando::StaticData::RegisterSongLocations); diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index e3a914e87..cdba9ef38 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -179,6 +179,7 @@ void Context::GenerateLocationPool() { location.GetRandomizerCheck() == RC_LW_DEKU_SCRUB_NEAR_BRIDGE || location.GetRandomizerCheck() == RC_HF_DEKU_SCRUB_GROTTO)) || (location.GetRCType() == RCTYPE_ADULT_TRADE && mOptions[RSK_SHUFFLE_ADULT_TRADE].Is(RO_GENERIC_OFF)) || + (location.GetRCType() == RCTYPE_SONG_LOCATION && mOptions[RSK_SHUFFLE_SONGS].Is(RO_SONG_SHUFFLE_OFF)) || (location.GetRCType() == RCTYPE_COW && mOptions[RSK_SHUFFLE_COWS].Is(RO_GENERIC_OFF)) || (location.GetRandomizerCheck() == RC_LH_HYRULE_LOACH && mOptions[RSK_FISHSANITY].IsNot(RO_FISHSANITY_HYRULE_LOACH)) || diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 2812b0135..597828e34 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -828,20 +828,6 @@ void Rando::StaticData::InitLocationTable() { locationTable[RC_DMC_GREAT_FAIRY_REWARD] = Location::Base(RC_DMC_GREAT_FAIRY_REWARD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_BG_DY_YOSEIZO, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 2, "Great Fairy Reward", RHT_DMC_GREAT_FAIRY_REWARD, RG_PROGRESSIVE_MAGIC_METER, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_GREAT_FAIRY_REWARD), true); locationTable[RC_OGC_GREAT_FAIRY_REWARD] = Location::Base(RC_OGC_GREAT_FAIRY_REWARD, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, ACTOR_BG_DY_YOSEIZO, SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, 3, "OGC Great Fairy Reward", "OGC Great Fairy Reward", RHT_OGC_GREAT_FAIRY_REWARD, RG_DOUBLE_DEFENSE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_OGC_GREAT_FAIRY_REWARD), true); - // Songs - locationTable[RC_SHEIK_IN_FOREST] = Location::Base(RC_SHEIK_IN_FOREST, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_SACRED_FOREST_MEADOW, 0x00, "Sheik in Forest", "Sheik in Forest", RHT_SHEIK_IN_FOREST, RG_MINUET_OF_FOREST, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_MINUET_OF_FOREST), true); - locationTable[RC_SHEIK_IN_CRATER] = Location::Base(RC_SHEIK_IN_CRATER, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_DEATH_MOUNTAIN_CRATER, 0x00, "Sheik in Crater", "Sheik in Crater", RHT_SHEIK_IN_CRATER, RG_BOLERO_OF_FIRE, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_BOLERO_OF_FIRE), true); - locationTable[RC_SHEIK_IN_ICE_CAVERN] = Location::Base(RC_SHEIK_IN_ICE_CAVERN, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_ICE_CAVERN, 0x00, "Sheik in Ice Cavern", "Sheik in Ice Cavern", RHT_SHEIK_IN_ICE_CAVERN, RG_SERENADE_OF_WATER, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_SERENADE_OF_WATER), true); - locationTable[RC_SHEIK_AT_COLOSSUS] = Location::Base(RC_SHEIK_AT_COLOSSUS, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_DESERT_COLOSSUS, 0x00, "Sheik at Colossus", "Sheik at Colossus", RHT_SHEIK_AT_COLOSSUS, RG_REQUIEM_OF_SPIRIT, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_REQUIEM_OF_SPIRIT), true); - locationTable[RC_SHEIK_IN_KAKARIKO] = Location::Base(RC_SHEIK_IN_KAKARIKO, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_KAKARIKO_VILLAGE, 0x00, "Sheik in Kakariko", "Sheik in Kakariko", RHT_SHEIK_IN_KAKARIKO, RG_NOCTURNE_OF_SHADOW, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_BONGO_BONGO_ESCAPED_FROM_WELL), true); - locationTable[RC_SHEIK_AT_TEMPLE] = Location::Base(RC_SHEIK_AT_TEMPLE, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_TEMPLE_OF_TIME, 0x00, "Sheik at Temple", "Sheik at Temple", RHT_SHEIK_AT_TEMPLE, RG_PRELUDE_OF_LIGHT, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_PRELUDE_OF_LIGHT), true); - locationTable[RC_SONG_FROM_IMPA] = Location::Base(RC_SONG_FROM_IMPA, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, RCAREA_HYRULE_CASTLE, ACTOR_ID_MAX, SCENE_ID_MAX, 0x00, "Song from Impa", "Song from Impa", RHT_SONG_FROM_IMPA, RG_ZELDAS_LULLABY, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_ZELDAS_LULLABY), true); - locationTable[RC_SONG_FROM_MALON] = Location::Base(RC_SONG_FROM_MALON, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_LON_LON_RANCH, 0x00, "Song from Malon", "Song from Malon", RHT_SONG_FROM_MALON, RG_EPONAS_SONG, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LEARNED_EPONA_SONG), true); - locationTable[RC_SONG_FROM_SARIA] = Location::Base(RC_SONG_FROM_SARIA, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_SACRED_FOREST_MEADOW, 0x00, "Song from Saria", "Song from Saria", RHT_SONG_FROM_SARIA, RG_SARIAS_SONG, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_SARIAS_SONG), true); - locationTable[RC_SONG_FROM_ROYAL_FAMILYS_TOMB] = Location::Base(RC_SONG_FROM_ROYAL_FAMILYS_TOMB, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_ROYAL_FAMILYS_TOMB, 0x00, "Song from Royal Family's Tomb", "Song from Royal Family's Tomb", RHT_SONG_FROM_ROYAL_FAMILYS_TOMB, RG_SUNS_SONG, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_SUNS_SONG), true); - locationTable[RC_SONG_FROM_OCARINA_OF_TIME] = Location::Base(RC_SONG_FROM_OCARINA_OF_TIME, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, ACTOR_ID_MAX, SCENE_HYRULE_FIELD, 0x00, "Song from Ocarina of Time", "Song from Ocarina of Time", RHT_SONG_FROM_OCARINA_OF_TIME, RG_SONG_OF_TIME, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_SONG_OF_TIME), true); - locationTable[RC_SONG_FROM_WINDMILL] = Location::Base(RC_SONG_FROM_WINDMILL, RCQUEST_BOTH, RCTYPE_SONG_LOCATION, RCAREA_KAKARIKO_VILLAGE, ACTOR_ID_MAX, SCENE_WINDMILL_AND_DAMPES_GRAVE, 0x00, "Song from Windmill", "Song from Windmill", RHT_SONG_FROM_WINDMILL, RG_SONG_OF_STORMS, SpoilerCollectionCheck::EventChkInf(EVENTCHKINF_LEARNED_SONG_OF_STORMS), true); - /*------------------------------- --- SHOPS --- 8 6 2 4 diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index 8dc07ce7a..ff068943b 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -196,6 +196,8 @@ void Settings::CreateOptionDescriptions() { mOptionDescriptions[RSK_MIX_INTERIOR_ENTRANCES] = "Interior entrances will be part of the mixed pool."; mOptionDescriptions[RSK_MIX_GROTTO_ENTRANCES] = "Grotto entrances will be part of the mixed pool."; mOptionDescriptions[RSK_SHUFFLE_SONGS] = + "Off - Songs will appear at their vanilla locations.\n" + "\n" "Song locations - Songs will only appear at locations that normally teach songs.\n" "\n" "Dungeon rewards - Songs appear after beating a major dungeon boss.\n" diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 43935bc8e..e5d82b18b 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -6149,6 +6149,7 @@ typedef enum { // Song shuffle Settings (Song locations, Dungeon rewards, anywhere) typedef enum { + RO_SONG_SHUFFLE_OFF, RO_SONG_SHUFFLE_SONG_LOCATIONS, RO_SONG_SHUFFLE_DUNGEON_REWARDS, RO_SONG_SHUFFLE_ANYWHERE, diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index 4d7d7a59a..1a8eca6dc 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -137,8 +137,10 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() { CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleMerchants"), RO_SHUFFLE_MERCHANTS_OFF) != RO_SHUFFLE_MERCHANTS_OFF) && (location.GetRCType() != RCTYPE_SONG_LOCATION || - CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleSongs"), RO_SONG_SHUFFLE_SONG_LOCATIONS) != - RO_SONG_SHUFFLE_SONG_LOCATIONS) && // song locations + (CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleSongs"), RO_SONG_SHUFFLE_SONG_LOCATIONS) != + RO_SONG_SHUFFLE_SONG_LOCATIONS && + CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleSongs"), RO_SONG_SHUFFLE_SONG_LOCATIONS) != + RO_SONG_SHUFFLE_OFF)) && // song locations ((location.GetRCType() != RCTYPE_BOSS_HEART_OR_OTHER_REWARD && location.GetRandomizerCheck() != RC_SONG_FROM_IMPA && location.GetRandomizerCheck() != RC_SHEIK_IN_ICE_CAVERN) || diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index 52b977032..de5e87289 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -51,6 +51,7 @@ bool showBeans; bool showScrubs; bool showMajorScrubs; bool showMerchants; +bool showSongs; bool showBeehives; bool showCows; bool showOverworldFreestanding; @@ -1306,6 +1307,9 @@ void LoadSettings() { OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MERCHANTS) == RO_SHUFFLE_MERCHANTS_ALL : true; + showSongs = IS_RANDO + ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_SONGS) != RO_SONG_SHUFFLE_OFF + : false; showBeehives = IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_BEEHIVES) == RO_GENERIC_YES : false; @@ -1516,6 +1520,7 @@ bool IsCheckShuffled(RandomizerCheck rc) { (showMajorScrubs && (rc == RC_LW_DEKU_SCRUB_NEAR_BRIDGE || // The 3 scrubs that are always randomized rc == RC_HF_DEKU_SCRUB_GROTTO || rc == RC_LW_DEKU_SCRUB_GROTTO_FRONT))) && (loc->GetRCType() != RCTYPE_MERCHANT || showMerchants) && + (loc->GetRCType() != RCTYPE_SONG_LOCATION || showSongs) && (loc->GetRCType() != RCTYPE_BEEHIVE || showBeehives) && (loc->GetRCType() != RCTYPE_OCARINA || showOcarinas) && (loc->GetRCType() != RCTYPE_SKULL_TOKEN || alwaysShowGS || diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index d94df9ae5..1c81e2d58 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -177,7 +177,7 @@ void Settings::CreateOptions() { OPT_U8(RSK_MQ_GANONS_CASTLE, "Ganon's Castle Quest", {"Vanilla", "Master Quest", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("MQDungeonsGanonsCastle"), "", WidgetType::Combobox, RO_MQ_SET_VANILLA); OPT_U8(RSK_SHUFFLE_DUNGEON_REWARDS, "Shuffle Dungeon Rewards", {"Vanilla", "End of Dungeons", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleDungeonReward"), mOptionDescriptions[RSK_SHUFFLE_DUNGEON_REWARDS], WidgetType::Combobox, RO_DUNGEON_REWARDS_END_OF_DUNGEON); OPT_U8(RSK_LINKS_POCKET, "Link's Pocket", {"Dungeon Reward", "Advancement", "Anything", "Nothing"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("LinksPocket"), "", WidgetType::Combobox, RO_LINKS_POCKET_DUNGEON_REWARD); - OPT_U8(RSK_SHUFFLE_SONGS, "Shuffle Songs", {"Song Locations", "Dungeon Rewards", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleSongs"), mOptionDescriptions[RSK_SHUFFLE_SONGS], WidgetType::Combobox, RO_SONG_SHUFFLE_SONG_LOCATIONS); + OPT_U8(RSK_SHUFFLE_SONGS, "Shuffle Songs", {"Off", "Song Locations", "Dungeon Rewards", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleSongs"), mOptionDescriptions[RSK_SHUFFLE_SONGS], WidgetType::Combobox, RO_SONG_SHUFFLE_SONG_LOCATIONS); OPT_U8(RSK_SHOPSANITY, "Shop Shuffle", {"Off", "Specific Count", "Random"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("Shopsanity"), mOptionDescriptions[RSK_SHOPSANITY], WidgetType::Combobox, RO_SHOPSANITY_OFF); OPT_U8(RSK_SHOPSANITY_COUNT, "Shops Item Count", {NumOpts(0, 7/*8*/)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShopsanityCount"), mOptionDescriptions[RSK_SHOPSANITY_COUNT], WidgetType::Slider, 0, false, IMFLAG_NONE); OPT_U8(RSK_SHOPSANITY_PRICES, "Shops Prices", {"Vanilla", "Cheap Balanced", "Balanced", "Fixed", "Range", "Set By Wallet"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShopsanityPrices"), mOptionDescriptions[RSK_SHOPSANITY_PRICES], WidgetType::Combobox, RO_PRICE_VANILLA, false, IMFLAG_NONE); diff --git a/soh/soh/Enhancements/randomizer/static_data.h b/soh/soh/Enhancements/randomizer/static_data.h index 1be34e772..7bdec17c1 100644 --- a/soh/soh/Enhancements/randomizer/static_data.h +++ b/soh/soh/Enhancements/randomizer/static_data.h @@ -49,6 +49,7 @@ class StaticData { static std::vector GetPondFishLocations(); static std::vector GetOverworldFishLocations(); static std::vector GetOverworldFairyLocations(); + static void RegisterSongLocations(); static void RegisterBeehiveLocations(); static void RegisterCowLocations(); static void RegisterFishLocations(); diff --git a/soh/soh/ShipInit.hpp b/soh/soh/ShipInit.hpp index 2341a1024..e96e77f91 100644 --- a/soh/soh/ShipInit.hpp +++ b/soh/soh/ShipInit.hpp @@ -3,6 +3,7 @@ #ifdef __cplusplus +#include #include #include #include diff --git a/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c b/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c index f6cccaf3b..24c6ff5de 100644 --- a/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c +++ b/soh/src/overlays/actors/ovl_En_Fu/z_en_fu.c @@ -154,17 +154,6 @@ void EnFu_WaitChild(EnFu* this, PlayState* play) { } } -void GivePlayerRandoRewardSongOfStorms(EnFu* windmillGuy, PlayState* play, RandomizerCheck check) { - if (windmillGuy->actor.parent != NULL && windmillGuy->actor.parent->id == GET_PLAYER(play)->actor.id && - !Flags_GetTreasure(play, 0x1F)) { - Flags_SetTreasure(play, 0x1F); - windmillGuy->actionFunc = func_80A1DBD4; - } else if (!Flags_GetTreasure(play, 0x1F)) { - GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_SONG_OF_STORMS); - GiveItemEntryFromActor(&windmillGuy->actor, play, getItemEntry, 10000.0f, 100.0f); - } -} - void func_80A1DB60(EnFu* this, PlayState* play) { if (play->csCtx.state == CS_STATE_IDLE) { this->actionFunc = EnFu_WaitAdult; From 56a53e9facf4753752b8c0fda93e9d64a015cc35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Thu, 5 Jun 2025 00:08:27 +0000 Subject: [PATCH 17/67] consolidate RAND_GET_OPTION (#5553) --- .../TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp | 2 -- soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp | 2 -- soh/soh/Enhancements/randomizer/ShuffleBeehives.cpp | 8 +++----- soh/soh/Enhancements/randomizer/ShuffleCows.cpp | 2 +- soh/soh/Enhancements/randomizer/ShuffleCrates.cpp | 8 +++----- .../Enhancements/randomizer/ShuffleFreestanding.cpp | 2 +- soh/soh/Enhancements/randomizer/ShuffleGrass.cpp | 4 +--- soh/soh/Enhancements/randomizer/ShufflePots.cpp | 4 ++-- soh/soh/Enhancements/randomizer/context.h | 2 ++ soh/soh/Enhancements/randomizer/fishsanity.cpp | 10 +++------- soh/soh/Enhancements/randomizer/hook_handlers.cpp | 2 -- soh/soh/Enhancements/randomizer/randomizer.cpp | 2 +- soh/soh/Enhancements/timesaver_hook_handlers.cpp | 2 -- 13 files changed, 17 insertions(+), 33 deletions(-) diff --git a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp index 674adcdfb..e15b8abd8 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp @@ -10,8 +10,6 @@ extern "C" { #include "variables.h" } -#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get() - static bool sEnteredBlueWarp = false; /** diff --git a/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp b/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp index 642fa7f42..04e0e4ea5 100644 --- a/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp +++ b/soh/soh/Enhancements/randomizer/LockOverworldDoors.cpp @@ -9,8 +9,6 @@ extern PlayState* gPlayState; #include "src/overlays/actors/ovl_En_Door/z_en_door.h" } -#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get() - using SceneDoorParamsPair = std::pair; std::map lookupTable = { // clang-format off diff --git a/soh/soh/Enhancements/randomizer/ShuffleBeehives.cpp b/soh/soh/Enhancements/randomizer/ShuffleBeehives.cpp index 60969a0c0..03f6dfa65 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleBeehives.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleBeehives.cpp @@ -11,8 +11,7 @@ extern void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play); void ObjComb_RandomizerChooseItemDrop(ObjComb* objComb, PlayState* play) { s16 params = objComb->actor.params & 0x1F; - if (Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_BEEHIVES).Get() && - !Flags_GetRandomizerInf(objComb->beehiveIdentity.randomizerInf)) { + if (RAND_GET_OPTION(RSK_SHUFFLE_BEEHIVES) && !Flags_GetRandomizerInf(objComb->beehiveIdentity.randomizerInf)) { EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &objComb->actor.world.pos, ITEM00_SOH_DUMMY); item00->randoInf = objComb->beehiveIdentity.randomizerInf; item00->itemEntry = @@ -41,8 +40,7 @@ void ObjComb_RandomizerWait(ObjComb* objComb, PlayState* play) { s32 dmgFlags; objComb->unk_1B0 -= 50; - if (Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_BEEHIVES).Get() && - !Flags_GetRandomizerInf(objComb->beehiveIdentity.randomizerInf)) { + if (RAND_GET_OPTION(RSK_SHUFFLE_BEEHIVES) && !Flags_GetRandomizerInf(objComb->beehiveIdentity.randomizerInf)) { if (objComb->unk_1B0 <= -5000) { objComb->unk_1B0 = 1500; } @@ -85,7 +83,7 @@ void ObjComb_RandomizerUpdate(void* actor) { } void RegisterShuffleBeehives() { - bool shouldRegister = IS_RANDO && Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_BEEHIVES).Get(); + bool shouldRegister = IS_RANDO && RAND_GET_OPTION(RSK_SHUFFLE_BEEHIVES); COND_ID_HOOK(OnActorInit, ACTOR_OBJ_COMB, shouldRegister, ObjComb_RandomizerInit); COND_ID_HOOK(OnActorUpdate, ACTOR_OBJ_COMB, shouldRegister, ObjComb_RandomizerUpdate); diff --git a/soh/soh/Enhancements/randomizer/ShuffleCows.cpp b/soh/soh/Enhancements/randomizer/ShuffleCows.cpp index ac2e9529e..17ae3a834 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleCows.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleCows.cpp @@ -34,7 +34,7 @@ void EnCow_MoveForRandomizer(EnCow* enCow, PlayState* play) { } void RegisterShuffleCows() { - bool shouldRegister = IS_RANDO && Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_COWS).Get(); + bool shouldRegister = IS_RANDO && RAND_GET_OPTION(RSK_SHUFFLE_COWS); COND_VB_SHOULD(VB_GIVE_ITEM_FROM_COW, shouldRegister, { EnCow* enCow = va_arg(args, EnCow*); diff --git a/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp b/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp index 343221d63..f49081c59 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp @@ -15,8 +15,6 @@ extern "C" { extern PlayState* gPlayState; } -#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get() - extern void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play); extern "C" void ObjKibako2_RandomizerDraw(Actor* thisx, PlayState* play) { @@ -158,7 +156,7 @@ extern "C" void ObjKibako_RandomizerDraw(Actor* thisx, PlayState* play) { uint8_t ObjKibako2_RandomizerHoldsItem(ObjKibako2* crateActor, PlayState* play) { RandomizerCheck rc = crateActor->crateIdentity.randomizerCheck; uint8_t isDungeon = Rando::StaticData::GetLocation(rc)->IsDungeon(); - uint8_t crateSetting = Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_CRATES).Get(); + uint8_t crateSetting = RAND_GET_OPTION(RSK_SHUFFLE_CRATES); // Don't pull randomized item if crate isn't randomized or is already checked if (!IS_RANDO || (crateSetting == RO_SHUFFLE_CRATES_OVERWORLD && isDungeon) || @@ -174,7 +172,7 @@ uint8_t ObjKibako2_RandomizerHoldsItem(ObjKibako2* crateActor, PlayState* play) uint8_t ObjKibako_RandomizerHoldsItem(ObjKibako* smallCrateActor, PlayState* play) { RandomizerCheck rc = smallCrateActor->smallCrateIdentity.randomizerCheck; uint8_t isDungeon = Rando::StaticData::GetLocation(rc)->IsDungeon(); - uint8_t crateSetting = Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_CRATES).Get(); + uint8_t crateSetting = RAND_GET_OPTION(RSK_SHUFFLE_CRATES); // Don't pull randomized item if crate isn't randomized or is already checked if (!IS_RANDO || (crateSetting == RO_SHUFFLE_CRATES_OVERWORLD && isDungeon) || @@ -211,7 +209,7 @@ void ObjKibako_RandomizerSpawnCollectible(ObjKibako* smallCrateActor, PlayState* void ObjKibako2_RandomizerInit(void* actorRef) { Actor* actor = static_cast(actorRef); - uint8_t logicSetting = Rando::Context::GetInstance()->GetOption(RSK_LOGIC_RULES).Get(); + uint8_t logicSetting = RAND_GET_OPTION(RSK_LOGIC_RULES); // don't shuffle two OOB crates in GF and don't shuffle child GV/GF crates when not in no logic if (actor->id != ACTOR_OBJ_KIBAKO2 || diff --git a/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp b/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp index 03fd33981..fbd459458 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp @@ -23,7 +23,7 @@ void ShuffleFreestanding_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* sh Rando::Location* loc = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(item00->actor.id, gPlayState->sceneNum, params); uint8_t isDungeon = loc->IsDungeon(); - uint8_t freestandingSetting = Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_FREESTANDING).Get(); + uint8_t freestandingSetting = RAND_GET_OPTION(RSK_SHUFFLE_FREESTANDING); RandomizerCheck randomizerCheck = loc->GetRandomizerCheck(); bool checkObtained = Rando::Context::GetInstance()->GetItemLocation(randomizerCheck)->HasObtained(); diff --git a/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp b/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp index 1aa0970d2..28f06e9d4 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp @@ -11,8 +11,6 @@ extern "C" { extern PlayState* gPlayState; } -#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get() - extern void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play); void DrawTypeOfGrass(EnKusa* grassActor, Gfx* bushDList, Gfx* grassDList, PlayState* play) { @@ -96,7 +94,7 @@ uint8_t EnKusa_RandomizerHoldsItem(EnKusa* grassActor, PlayState* play) { RandomizerCheck rc = grassActor->grassIdentity.randomizerCheck; uint8_t isDungeon = Rando::StaticData::GetLocation(rc)->IsDungeon(); - uint8_t grassSetting = Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_GRASS).Get(); + uint8_t grassSetting = RAND_GET_OPTION(RSK_SHUFFLE_GRASS); // Don't pull randomized item if grass isn't randomized or is already checked if (!IS_RANDO || (grassSetting == RO_SHUFFLE_GRASS_OVERWORLD && isDungeon) || diff --git a/soh/soh/Enhancements/randomizer/ShufflePots.cpp b/soh/soh/Enhancements/randomizer/ShufflePots.cpp index 2021d225a..319237b98 100644 --- a/soh/soh/Enhancements/randomizer/ShufflePots.cpp +++ b/soh/soh/Enhancements/randomizer/ShufflePots.cpp @@ -27,7 +27,7 @@ extern "C" void ObjTsubo_RandomizerDraw(Actor* thisx, PlayState* play) { uint8_t ObjTsubo_RandomizerHoldsItem(ObjTsubo* potActor, PlayState* play) { RandomizerCheck rc = potActor->potIdentity.randomizerCheck; uint8_t isDungeon = Rando::StaticData::GetLocation(rc)->IsDungeon(); - uint8_t potSetting = Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_POTS).Get(); + uint8_t potSetting = RAND_GET_OPTION(RSK_SHUFFLE_POTS); // Don't pull randomized item if pot isn't randomized or is already checked if (!IS_RANDO || (potSetting == RO_SHUFFLE_POTS_OVERWORLD && isDungeon) || @@ -85,7 +85,7 @@ void ShufflePots_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va // Unlock early Ganon's Boss Key doors to allow access to the pots there when pots are shuffled in dungeon if (id == VB_LOCK_BOSS_DOOR) { DoorShutter* doorActor = va_arg(args, DoorShutter*); - uint8_t shufflePotSetting = Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_POTS).Get(); + uint8_t shufflePotSetting = RAND_GET_OPTION(RSK_SHUFFLE_POTS); if (gPlayState->sceneNum == SCENE_GANONS_TOWER && doorActor->dyna.actor.world.pos.y == 800 && (shufflePotSetting == RO_SHUFFLE_POTS_DUNGEONS || shufflePotSetting == RO_SHUFFLE_POTS_ALL)) { *should = false; diff --git a/soh/soh/Enhancements/randomizer/context.h b/soh/soh/Enhancements/randomizer/context.h index 7f18f7a9d..8e9346069 100644 --- a/soh/soh/Enhancements/randomizer/context.h +++ b/soh/soh/Enhancements/randomizer/context.h @@ -14,6 +14,8 @@ #include #include +#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get() + /** * @brief Singleton for storing and accessing dynamic Randomizer-related data * diff --git a/soh/soh/Enhancements/randomizer/fishsanity.cpp b/soh/soh/Enhancements/randomizer/fishsanity.cpp index 1b7eb7b92..e34799156 100644 --- a/soh/soh/Enhancements/randomizer/fishsanity.cpp +++ b/soh/soh/Enhancements/randomizer/fishsanity.cpp @@ -15,10 +15,6 @@ extern SaveContext gSaveContext; extern PlayState* gPlayState; } -#define FSi OTRGlobals::Instance->gRandoContext->GetFishsanity() - -#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get() - /** * @brief Parallel list of pond fish checks for both ages */ @@ -488,15 +484,15 @@ void Fishsanity::OnItemReceiveHandler(GetItemEntry itemEntry) { // C interface extern "C" { bool Randomizer_GetPondFishShuffled() { - return FSi->GetPondFishShuffled(); + return Rando::Context::GetInstance()->GetFishsanity()->GetPondFishShuffled(); } bool Randomizer_GetOverworldFishShuffled() { - return FSi->GetOverworldFishShuffled(); + return Rando::Context::GetInstance()->GetFishsanity()->GetOverworldFishShuffled(); } bool Randomizer_IsAdultPond() { - return FSi->IsAdultPond(); + return Rando::Context::GetInstance()->GetFishsanity()->IsAdultPond(); } void Fishsanity_DrawEffShadow(Actor* actor, Lights* lights, PlayState* play) { diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 5da887494..1ba931513 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -71,8 +71,6 @@ extern void EnGe1_Wait_Archery(EnGe1* enGe1, PlayState* play); extern void EnGe1_SetAnimationIdle(EnGe1* enGe1); } -#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get() - bool LocMatchesQuest(Rando::Location loc) { if (loc.GetQuest() == RCQUEST_BOTH) { return true; diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index f7279ff80..1e05bc60b 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4393,7 +4393,7 @@ CustomMessage Randomizer::GetFishingPondOwnerMessage(u16 originalTextId) { "fischen!", "DΓ©solΓ©, mais l'Γ©tang est fermΓ©.&J'ai perdu ma bonne %rCanne Γ  PΓͺche%w...&Impossible de pΓͺcher sans elle!"); - if (Rando::Context::GetInstance()->GetOption(RSK_FISHING_POLE_HINT)) { + if (GetRandoSettingValue(RSK_FISHING_POLE_HINT)) { messageEntry = messageEntry + CustomMessage(ctx->GetHint(RH_FISHING_POLE)->GetHintMessage()); } diff --git a/soh/soh/Enhancements/timesaver_hook_handlers.cpp b/soh/soh/Enhancements/timesaver_hook_handlers.cpp index 9f488efce..1b28638b9 100644 --- a/soh/soh/Enhancements/timesaver_hook_handlers.cpp +++ b/soh/soh/Enhancements/timesaver_hook_handlers.cpp @@ -49,8 +49,6 @@ extern void EnRu2_SetEncounterSwitchFlag(EnRu2* enRu2, PlayState* play); extern void EnDaiku_EscapeSuccess(EnDaiku* enDaiku, PlayState* play); } -#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get() - void EnMa1_EndTeachSong(EnMa1* enMa1, PlayState* play) { if (Message_GetState(&gPlayState->msgCtx) == TEXT_STATE_CLOSING) { Flags_SetRandomizerInf(RAND_INF_LEARNED_EPONA_SONG); From 3a60c3f6513a0bd68015e7bd282cda6039a8d061 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Thu, 5 Jun 2025 00:08:36 +0000 Subject: [PATCH 18/67] SkipAmyPuzzle (#5550) --- soh/soh/Enhancements/SkipAmyPuzzle.cpp | 8 ++++++++ .../game-interactor/vanilla-behavior/GIVanillaBehavior.h | 8 ++++++++ soh/soh/SohGui/SohMenuEnhancements.cpp | 5 +++++ soh/src/overlays/actors/ovl_Bg_Po_Event/z_bg_po_event.c | 4 +++- 4 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 soh/soh/Enhancements/SkipAmyPuzzle.cpp diff --git a/soh/soh/Enhancements/SkipAmyPuzzle.cpp b/soh/soh/Enhancements/SkipAmyPuzzle.cpp new file mode 100644 index 000000000..27486e04c --- /dev/null +++ b/soh/soh/Enhancements/SkipAmyPuzzle.cpp @@ -0,0 +1,8 @@ +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/ShipInit.hpp" + +void RegisterSkipAmyPuzzle() { + COND_VB_SHOULD(VB_AMY_SOLVE, CVarGetInteger(CVAR_ENHANCEMENT("SkipAmyPuzzle"), 0), { *should = true; }); +} + +static RegisterShipInitFunc initFunc(RegisterSkipAmyPuzzle, { CVAR_ENHANCEMENT("SkipAmyPuzzle") }); \ No newline at end of file diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index c2b8c1756..fea114198 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -20,6 +20,14 @@ typedef enum { // - `int32_t` (entrance index) (promoted from `uint16_t` by va_arg) VB_ALLOW_ENTRANCE_CS_FOR_EITHER_AGE, + // #### `result` + // ```c + // sBgPoEventPuzzleState == 0xF + // ``` + // #### `args` + // - None + VB_AMY_SOLVE, + // #### `result` // ```c // this->actor.textId == 0x401A diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index de3bb6be8..3ffa9cfed 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -1312,6 +1312,11 @@ void SohMenu::AddMenuEnhancements() { .Format("%d notes") .Tooltip("Adjust the number of notes you need to play to end the third round.")); + AddWidget(path, "Forest Temple", WIDGET_SEPARATOR_TEXT); + AddWidget(path, "Solve Amy's Puzzle", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("SkipAmyPuzzle")) + .Options(CheckboxOptions().Tooltip("Amy's block pushing puzzle instantly solved.")); + path.column = SECTION_COLUMN_3; AddWidget(path, "Fishing", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Customize Behavior##Fishing", WIDGET_CVAR_CHECKBOX) diff --git a/soh/src/overlays/actors/ovl_Bg_Po_Event/z_bg_po_event.c b/soh/src/overlays/actors/ovl_Bg_Po_Event/z_bg_po_event.c index 88f4c7c12..ae9c9ab21 100644 --- a/soh/src/overlays/actors/ovl_Bg_Po_Event/z_bg_po_event.c +++ b/soh/src/overlays/actors/ovl_Bg_Po_Event/z_bg_po_event.c @@ -6,6 +6,8 @@ #include "z_bg_po_event.h" #include "objects/object_po_sisters/object_po_sisters.h" +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS 0 @@ -333,7 +335,7 @@ void BgPoEvent_BlockIdle(BgPoEvent* this, PlayState* play) { Player* player = GET_PLAYER(play); Actor* amy; - if (sBgPoEventPuzzleState == 0xF) { + if (GameInteractor_Should(VB_AMY_SOLVE, sBgPoEventPuzzleState == 0xF)) { this->actionFunc = BgPoEvent_BlockSolved; if ((this->type == 0) && (this->index == 0)) { amy = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_PO_SISTERS, this->dyna.actor.world.pos.x + 30.0f, From 3377dc636a66bc346f9a489399f457693d364f77 Mon Sep 17 00:00:00 2001 From: nclok1405 <155463060+nclok1405@users.noreply.github.com> Date: Thu, 5 Jun 2025 09:08:50 +0900 Subject: [PATCH 19/67] Default to Hiragana keyboard when playing in Japanese (#5543) * Default to Hiragana keyboard in Name Entry screen when playing in Japanese (NTSC behavior) * clang-formated --- soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c index 78b167442..2b6e9fd5d 100644 --- a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c +++ b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c @@ -1374,7 +1374,8 @@ void FileChoose_UpdateQuestMenu(GameState* thisx) { } else { defaultName = &emptyNameNES; } - } else { // GAME_REGION_NTSC + this->charPage = FS_CHAR_PAGE_HIRA; // Default to Hiragana Keyboard + } else { // GAME_REGION_NTSC defaultName = CVarGetInteger(CVAR_ENHANCEMENT("LinkDefaultName"), 0) ? &linkNameNES : &emptyNameNES; } memcpy(Save_GetSaveMetaInfo(this->buttonIndex)->playerName, defaultName, 8); @@ -1575,7 +1576,8 @@ void FileChoose_UpdateRandomizerMenu(GameState* thisx) { } else { defaultName = &emptyNameNES; } - } else { // GAME_REGION_NTSC + this->charPage = FS_CHAR_PAGE_HIRA; // Default to Hiragana Keyboard + } else { // GAME_REGION_NTSC defaultName = CVarGetInteger(CVAR_ENHANCEMENT("LinkDefaultName"), 0) ? &linkNameNES : &emptyNameNES; } memcpy(Save_GetSaveMetaInfo(this->buttonIndex)->playerName, defaultName, 8); From 5b2c30edb008ca019871e4423b60ddb548b110cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Thu, 5 Jun 2025 00:09:06 +0000 Subject: [PATCH 20/67] Faster water temple gate (#5556) * rando: faster water temple gate * move to time saver --- soh/soh/Enhancements/randomizer/hook_handlers.cpp | 2 +- soh/soh/Enhancements/timesaver_hook_handlers.cpp | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 1ba931513..fca4dfae7 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -2142,7 +2142,7 @@ void RandomizerOnActorUpdateHandler(void* refActor) { shutterDoor->unk_16E = 0; } } else if (actor->id == ACTOR_DOOR_GERUDO) { - DoorGerudo* gerudoDoor = (DoorGerudo*)actor; + DoorGerudo* gerudoDoor = reinterpret_cast(actor); gerudoDoor->actionFunc = func_8099485C; gerudoDoor->dyna.actor.world.pos.y = gerudoDoor->dyna.actor.home.pos.y + 200.0f; } diff --git a/soh/soh/Enhancements/timesaver_hook_handlers.cpp b/soh/soh/Enhancements/timesaver_hook_handlers.cpp index 1b28638b9..dd8185c1d 100644 --- a/soh/soh/Enhancements/timesaver_hook_handlers.cpp +++ b/soh/soh/Enhancements/timesaver_hook_handlers.cpp @@ -28,6 +28,7 @@ extern "C" { #include "src/overlays/actors/ovl_En_Daiku/z_en_daiku.h" #include "src/overlays/actors/ovl_Bg_Spot02_Objects/z_bg_spot02_objects.h" #include "src/overlays/actors/ovl_Bg_Spot03_Taki/z_bg_spot03_taki.h" +#include "src/overlays/actors/ovl_Bg_Spot06_Objects/z_bg_spot06_objects.h" #include "src/overlays/actors/ovl_Bg_Hidan_Kousi/z_bg_hidan_kousi.h" #include "src/overlays/actors/ovl_Bg_Dy_Yoseizo/z_bg_dy_yoseizo.h" #include "src/overlays/actors/ovl_En_Dnt_Demo/z_en_dnt_demo.h" @@ -1384,3 +1385,15 @@ void TimeSaverRegisterHooks() { GameInteractor::Instance->RegisterGameHook(TimeSaverOnItemReceiveHandler); }); } + +void RegisterSkipWaterTempleGateDelay() { + COND_ID_HOOK(OnActorUpdate, ACTOR_BG_SPOT06_OBJECTS, + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO), [](void* actor) { + BgSpot06Objects* spot06 = static_cast(actor); + if (spot06->dyna.actor.params == 0) { + spot06->timer = 0; + } + }) +} + +static RegisterShipInitFunc skipWaterTempleGateDelay(RegisterSkipWaterTempleGateDelay); From abb0a93945b1888f3c2d322d5c9890fb6d19d33d Mon Sep 17 00:00:00 2001 From: Pepe20129 <72659707+Pepe20129@users.noreply.github.com> Date: Thu, 5 Jun 2025 03:07:57 +0200 Subject: [PATCH 21/67] Add Anubis, Flare Dancer, Skull Kid & Spear Moblin to enemy randomizer (#5483) * Add Anubis, Flare Dancer, Skull Kid & Spear Moblin * Include spear moblins and exclude flare dancer in clear rooms * Exclude anubis from clear rooms * Fix skull kill issues * Clang format * Address review * Use hook * Update z_en_mb.c --- soh/soh/Enhancements/enemyrandomizer.cpp | 263 ++++++++++-------- soh/soh/Enhancements/enemyrandomizer.h | 17 +- soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c | 5 +- 3 files changed, 162 insertions(+), 123 deletions(-) diff --git a/soh/soh/Enhancements/enemyrandomizer.cpp b/soh/soh/Enhancements/enemyrandomizer.cpp index 84e1d040e..5b0d97cad 100644 --- a/soh/soh/Enhancements/enemyrandomizer.cpp +++ b/soh/soh/Enhancements/enemyrandomizer.cpp @@ -13,15 +13,29 @@ extern "C" { #include } -const char* enemyCVarList[] = { - CVAR_ENHANCEMENT("RandomizedEnemyList.Armos"), CVAR_ENHANCEMENT("RandomizedEnemyList.Arwing"), - CVAR_ENHANCEMENT("RandomizedEnemyList.BabyDodongo"), CVAR_ENHANCEMENT("RandomizedEnemyList.Bari"), - CVAR_ENHANCEMENT("RandomizedEnemyList.Beamos"), CVAR_ENHANCEMENT("RandomizedEnemyList.BigSkulltula"), - CVAR_ENHANCEMENT("RandomizedEnemyList.BigStalchild"), CVAR_ENHANCEMENT("RandomizedEnemyList.Biri"), - CVAR_ENHANCEMENT("RandomizedEnemyList.BlackKnuckle"), CVAR_ENHANCEMENT("RandomizedEnemyList.BlueTektite"), - CVAR_ENHANCEMENT("RandomizedEnemyList.Bubble"), CVAR_ENHANCEMENT("RandomizedEnemyList.ClubMoblin"), - CVAR_ENHANCEMENT("RandomizedEnemyList.DarkLink"), CVAR_ENHANCEMENT("RandomizedEnemyList.Dinolfos"), - CVAR_ENHANCEMENT("RandomizedEnemyList.Dodongo"), CVAR_ENHANCEMENT("RandomizedEnemyList.FireKeese"), +#define CVAR_ENEMY_RANDOMIZER_NAME CVAR_ENHANCEMENT("RandomizedEnemies") +#define CVAR_ENEMY_RANDOMIZER_DEFAULT ENEMY_RANDOMIZER_OFF +#define CVAR_ENEMY_RANDOMIZER_VALUE CVarGetInteger(CVAR_ENEMY_RANDOMIZER_NAME, CVAR_ENEMY_RANDOMIZER_DEFAULT) + +typedef struct EnemyEntry { + int16_t id; + int16_t params; +} EnemyEntry; + +bool IsEnemyFoundToRandomize(int16_t sceneNum, int8_t roomNum, int16_t actorId, int16_t params, float posX); +bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy); +EnemyEntry GetRandomizedEnemyEntry(uint32_t seed); + +const char* enemyCVarList[RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE] = { + CVAR_ENHANCEMENT("RandomizedEnemyList.Anubis"), CVAR_ENHANCEMENT("RandomizedEnemyList.Armos"), + CVAR_ENHANCEMENT("RandomizedEnemyList.Arwing"), CVAR_ENHANCEMENT("RandomizedEnemyList.BabyDodongo"), + CVAR_ENHANCEMENT("RandomizedEnemyList.Bari"), CVAR_ENHANCEMENT("RandomizedEnemyList.Beamos"), + CVAR_ENHANCEMENT("RandomizedEnemyList.BigSkulltula"), CVAR_ENHANCEMENT("RandomizedEnemyList.BigStalchild"), + CVAR_ENHANCEMENT("RandomizedEnemyList.Biri"), CVAR_ENHANCEMENT("RandomizedEnemyList.BlackKnuckle"), + CVAR_ENHANCEMENT("RandomizedEnemyList.BlueTektite"), CVAR_ENHANCEMENT("RandomizedEnemyList.Bubble"), + CVAR_ENHANCEMENT("RandomizedEnemyList.ClubMoblin"), CVAR_ENHANCEMENT("RandomizedEnemyList.DarkLink"), + CVAR_ENHANCEMENT("RandomizedEnemyList.Dinolfos"), CVAR_ENHANCEMENT("RandomizedEnemyList.Dodongo"), + CVAR_ENHANCEMENT("RandomizedEnemyList.FireKeese"), /*CVAR_ENHANCEMENT("RandomizedEnemyList.FlareDancer"),*/ CVAR_ENHANCEMENT("RandomizedEnemyList.FloorTile"), CVAR_ENHANCEMENT("RandomizedEnemyList.Floormaster"), CVAR_ENHANCEMENT("RandomizedEnemyList.FlyingPeahat"), CVAR_ENHANCEMENT("RandomizedEnemyList.FlyingPot"), CVAR_ENHANCEMENT("RandomizedEnemyList.Freezard"), CVAR_ENHANCEMENT("RandomizedEnemyList.Gibdo"), @@ -30,18 +44,20 @@ const char* enemyCVarList[] = { CVAR_ENHANCEMENT("RandomizedEnemyList.Keese"), CVAR_ENHANCEMENT("RandomizedEnemyList.LargeBaba"), CVAR_ENHANCEMENT("RandomizedEnemyList.LikeLike"), CVAR_ENHANCEMENT("RandomizedEnemyList.Lizalfos"), CVAR_ENHANCEMENT("RandomizedEnemyList.MadScrub"), CVAR_ENHANCEMENT("RandomizedEnemyList.NormalWolfos"), - CVAR_ENHANCEMENT("RandomizedEnemyList.PeahatLarva"), CVAR_ENHANCEMENT("RandomizedEnemyList.Redead"), - CVAR_ENHANCEMENT("RandomizedEnemyList.RedTektite"), CVAR_ENHANCEMENT("RandomizedEnemyList.Shabom"), - CVAR_ENHANCEMENT("RandomizedEnemyList.ShellBlade"), CVAR_ENHANCEMENT("RandomizedEnemyList.Skulltula"), + CVAR_ENHANCEMENT("RandomizedEnemyList.PeahatLarva"), /*CVAR_ENHANCEMENT("RandomizedEnemyList.Poe"),*/ + CVAR_ENHANCEMENT("RandomizedEnemyList.Redead"), CVAR_ENHANCEMENT("RandomizedEnemyList.RedTektite"), + CVAR_ENHANCEMENT("RandomizedEnemyList.Shabom"), CVAR_ENHANCEMENT("RandomizedEnemyList.ShellBlade"), + CVAR_ENHANCEMENT("RandomizedEnemyList.Skulltula"), CVAR_ENHANCEMENT("RandomizedEnemyList.SkullKid"), CVAR_ENHANCEMENT("RandomizedEnemyList.SmallBaba"), CVAR_ENHANCEMENT("RandomizedEnemyList.SmallStalchild"), - CVAR_ENHANCEMENT("RandomizedEnemyList.Spike"), CVAR_ENHANCEMENT("RandomizedEnemyList.Stalfos"), - CVAR_ENHANCEMENT("RandomizedEnemyList.Stinger"), CVAR_ENHANCEMENT("RandomizedEnemyList.Tailparasan"), - CVAR_ENHANCEMENT("RandomizedEnemyList.TorchSlug"), CVAR_ENHANCEMENT("RandomizedEnemyList.Wallmaster"), - CVAR_ENHANCEMENT("RandomizedEnemyList.WhiteKnuckle"), CVAR_ENHANCEMENT("RandomizedEnemyList.WhiteWolfos"), - CVAR_ENHANCEMENT("RandomizedEnemyList.WitheredBaba"), + CVAR_ENHANCEMENT("RandomizedEnemyList.SpearMoblin"), CVAR_ENHANCEMENT("RandomizedEnemyList.Spike"), + CVAR_ENHANCEMENT("RandomizedEnemyList.Stalfos"), CVAR_ENHANCEMENT("RandomizedEnemyList.Stinger"), + CVAR_ENHANCEMENT("RandomizedEnemyList.Tailparasan"), CVAR_ENHANCEMENT("RandomizedEnemyList.TorchSlug"), + CVAR_ENHANCEMENT("RandomizedEnemyList.Wallmaster"), CVAR_ENHANCEMENT("RandomizedEnemyList.WhiteKnuckle"), + CVAR_ENHANCEMENT("RandomizedEnemyList.WhiteWolfos"), CVAR_ENHANCEMENT("RandomizedEnemyList.WitheredBaba"), }; -const char* enemyNameList[] = { +const char* enemyNameList[RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE] = { + "Anubis", "Armos", "Arwing", "Baby Dodongo", @@ -58,6 +74,7 @@ const char* enemyNameList[] = { "Dinolfos", "Dodongo", "Fire Keese", + //"Flare Dancer", "Floor Tile", "Floormaster", "Flying Peahat", @@ -75,13 +92,16 @@ const char* enemyNameList[] = { "Mad Scrub", "Wolfos (Normal)", "Peahat Larva", + //"Poe", "Redead", "Red Tektite", "Shabom", "Shell Blade", "Skulltula", + "Skull Kid", "Small Deku Baba", "Stalchild (Small)", + "Spear Moblin", "Spike", "Stalfos", "Stinger", @@ -94,98 +114,105 @@ const char* enemyNameList[] = { }; static EnemyEntry randomizedEnemySpawnTable[RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE] = { - { ACTOR_EN_AM, -1 }, // Armos - { ACTOR_EN_CLEAR_TAG, 1 }, // Arwing - { ACTOR_EN_DODOJR, 0 }, // Baby Dodongo - { ACTOR_EN_VALI, -1 }, // Bari (big jellyfish) - { ACTOR_EN_VM, 1280 }, // Beamos - { ACTOR_EN_ST, 1 }, // Skulltula (big) - { ACTOR_EN_SKB, 20 }, // Stalchild (big) - { ACTOR_EN_BILI, 0 }, // Biri (jellyfish) - { ACTOR_EN_IK, 2 }, // Iron Knuckle (black, standing) - { ACTOR_EN_TITE, -2 }, // Tektite (blue) - { ACTOR_EN_BB, -1 }, // Bubble (flying skull enemy) (blue) - { ACTOR_EN_MB, 0 }, // Moblins (Club) - { ACTOR_EN_TORCH2, 0 }, // Dark Link - { ACTOR_EN_ZF, -2 }, // Dinolfos - { ACTOR_EN_DODONGO, -1 }, // Dodongo - { ACTOR_EN_FIREFLY, 1 }, // Fire Keese - { ACTOR_EN_YUKABYUN, 0 }, // Flying Floor Tile - { ACTOR_EN_FLOORMAS, 0 }, // Floormaster - { ACTOR_EN_PEEHAT, -1 }, // Flying Peahat (big grounded, doesn't spawn larva) - { ACTOR_EN_TUBO_TRAP, 0 }, // Flying pot - { ACTOR_EN_FZ, 0 }, // Freezard - { ACTOR_EN_RD, 32766 }, // Gibdo (standing) - { ACTOR_EN_GOMA, 7 }, // Gohma Larva (Non-Gohma rooms) - { ACTOR_EN_CROW, 0 }, // Guay - { ACTOR_EN_FIREFLY, 4 }, // Ice Keese - { ACTOR_EN_ST, 2 }, // Skulltula (invisible) - { ACTOR_EN_FIREFLY, 2 }, // Regular Keese - { ACTOR_EN_DEKUBABA, 1 }, // Deku Baba (large) + { ACTOR_EN_ANUBICE_TAG, 1 }, // Anubis + { ACTOR_EN_AM, -1 }, // Armos + { ACTOR_EN_CLEAR_TAG, 1 }, // Arwing + { ACTOR_EN_DODOJR, 0 }, // Baby Dodongo + { ACTOR_EN_VALI, -1 }, // Bari (big jellyfish) + { ACTOR_EN_VM, 1280 }, // Beamos + { ACTOR_EN_ST, 1 }, // Skulltula (big) + { ACTOR_EN_SKB, 20 }, // Stalchild (big) + { ACTOR_EN_BILI, 0 }, // Biri (jellyfish) + { ACTOR_EN_IK, 2 }, // Iron Knuckle (black, standing) + { ACTOR_EN_TITE, -2 }, // Tektite (blue) + { ACTOR_EN_BB, -1 }, // Bubble (flying skull enemy) (blue) + { ACTOR_EN_MB, 0 }, // Club Moblin + { ACTOR_EN_TORCH2, 0 }, // Dark Link + { ACTOR_EN_ZF, -2 }, // Dinolfos + { ACTOR_EN_DODONGO, -1 }, // Dodongo + { ACTOR_EN_FIREFLY, 1 }, // Fire Keese + // { ACTOR_EN_FD, 0 }, // Flare Dancer (possible cause of crashes because of spawning flame actors on + // sloped ground) + { ACTOR_EN_YUKABYUN, 0 }, // Flying Floor Tile + { ACTOR_EN_FLOORMAS, 0 }, // Floormaster + { ACTOR_EN_PEEHAT, -1 }, // Flying Peahat (big grounded, doesn't spawn larva) + { ACTOR_EN_TUBO_TRAP, 0 }, // Flying pot + { ACTOR_EN_FZ, 0 }, // Freezard + { ACTOR_EN_RD, 32766 }, // Gibdo (standing) + { ACTOR_EN_GOMA, 7 }, // Gohma Larva (Non-Gohma rooms) + { ACTOR_EN_CROW, 0 }, // Guay + { ACTOR_EN_FIREFLY, 4 }, // Ice Keese + { ACTOR_EN_ST, 2 }, // Skulltula (invisible) + { ACTOR_EN_FIREFLY, 2 }, // Regular Keese + { ACTOR_EN_DEKUBABA, 1 }, // Deku Baba (large) + // Doesn't work (reliant on surface and also normally used in tandem with a leever spawner, kills itself too quickly + // otherwise) { ACTOR_EN_REEBA, 0 }, // Leever { ACTOR_EN_RR, 0 }, // Like-Like { ACTOR_EN_ZF, -1 }, // Lizalfos { ACTOR_EN_DEKUNUTS, 768 }, // Mad Scrub (triple attack) (projectiles don't work) { ACTOR_EN_WF, 0 }, // Wolfos (normal) - { ACTOR_EN_PEEHAT, 1 }, // Flying Peahat Larva - { ACTOR_EN_RD, 1 }, // Redead (standing) - { ACTOR_EN_TITE, -1 }, // Tektite (red) - { ACTOR_EN_BUBBLE, 0 }, // Shabom (bubble) - { ACTOR_EN_SB, 0 }, // Shell Blade - { ACTOR_EN_ST, 0 }, // Skulltula (normal) - { ACTOR_EN_DEKUBABA, 0 }, // Deku Baba (small) - { ACTOR_EN_SKB, 1 }, // Stalchild (small) - { ACTOR_EN_NY, 0 }, // Spike (rolling enemy) - { ACTOR_EN_TEST, 2 }, // Stalfos - { ACTOR_EN_EIYER, 10 }, // Stinger (land) (One in formation, sink under floor and do not activate) - { ACTOR_EN_TP, -1 }, // Electric Tailpasaran - { ACTOR_EN_BW, 0 }, // Torch Slug - { ACTOR_EN_WALLMAS, 1 }, // Wallmaster - { ACTOR_EN_IK, 3 }, // Iron Knuckle (white, standing) - { ACTOR_EN_WF, 1 }, // Wolfos (white) - { ACTOR_EN_KAREBABA, 0 }, // Withered Deku Baba - - // Doesn't work {ACTOR_EN_POH, 0}, // Poe (Seems to rely on other objects?) - // Doesn't work {ACTOR_EN_POH, 2}, // Poe (composer Sharp) (Seems to rely on other objects?) - // Doesn't work {ACTOR_EN_POH, 3}, // Poe (composer Flat) (Seems to rely on other objects?) - // Doesn't work {ACTOR_EN_OKUTA, 0}, // Octorok (actor directly uses water box collision to handle hiding/popping - // up) Doesn't work {ACTOR_EN_REEBA, 0}, // Leever (reliant on surface and also normally used in tandem with a - // leever spawner, kills itself too quickly otherwise) Kinda doesn't work { ACTOR_EN_FD, 0 }, // Flare Dancer (jumps - // out of bounds a lot, and possible cause of crashes because of spawning a ton of flame actors) + // Doesn't work (actor directly uses water box collision to handle hiding/popping up) + // { ACTOR_EN_OKUTA, 0 }, // Octorok + { ACTOR_EN_PEEHAT, 1 }, // Flying Peahat Larva + // Doesn't work (Seems to rely on other objects?) + // { ACTOR_EN_POH, 0 }, // Poe + // Doesn't work (Seems to rely on other objects?) + // { ACTOR_EN_POH, 2 }, // Poe (composer Sharp) + // Doesn't work (Seems to rely on other objects?) + // { ACTOR_EN_POH, 3 }, // Poe (composer Flat) + { ACTOR_EN_RD, 1 }, // Redead (standing) + { ACTOR_EN_TITE, -1 }, // Tektite (red) + { ACTOR_EN_BUBBLE, 0 }, // Shabom (bubble) + { ACTOR_EN_SB, 0 }, // Shell Blade + { ACTOR_EN_ST, 0 }, // Skulltula (normal) + { ACTOR_EN_SKJ, 4159 }, // Skull Kid + { ACTOR_EN_DEKUBABA, 0 }, // Deku Baba (small) + { ACTOR_EN_SKB, 1 }, // Stalchild (small) + { ACTOR_EN_MB, -1 }, // Spear Moblin + { ACTOR_EN_NY, 0 }, // Spike (rolling enemy) + { ACTOR_EN_TEST, 2 }, // Stalfos + { ACTOR_EN_EIYER, 10 }, // Stinger (land) (One in formation, sink under floor and do not activate) + { ACTOR_EN_TP, -1 }, // Electric Tailpasaran + { ACTOR_EN_BW, 0 }, // Torch Slug + { ACTOR_EN_WALLMAS, 1 }, // Wallmaster + { ACTOR_EN_IK, 3 }, // Iron Knuckle (white, standing) + { ACTOR_EN_WF, 1 }, // Wolfos (white) + { ACTOR_EN_KAREBABA, 0 }, // Withered Deku Baba }; static int enemiesToRandomize[] = { - ACTOR_EN_FIREFLY, // Keese (including fire/ice) - ACTOR_EN_TEST, // Stalfos - ACTOR_EN_TITE, // Tektite - ACTOR_EN_POH, // Poe (normal, blue rupee, composers) - ACTOR_EN_OKUTA, // Octorok - ACTOR_EN_WALLMAS, // Wallmaster - ACTOR_EN_DODONGO, // Dodongo - // ACTOR_EN_REEBA, // Leever (reliant on spawner (z_e_encount1.c) - ACTOR_EN_PEEHAT, // Flying Peahat, big one spawning larva, larva - ACTOR_EN_ZF, // Lizalfos, Dinolfos - ACTOR_EN_GOMA, // Gohma Larva (normal, eggs, gohma eggs) - ACTOR_EN_BUBBLE, // Shabom (bubble) - ACTOR_EN_DODOJR, // Baby Dodongo - ACTOR_EN_TORCH2, // Dark Link - ACTOR_EN_BILI, // Biri (small jellyfish) - ACTOR_EN_TP, // Electric Tailpasaran - ACTOR_EN_ST, // Skulltula (normal, big, invisible) - ACTOR_EN_BW, // Torch Slug - ACTOR_EN_EIYER, // Stinger (land) - ACTOR_EN_MB, // Moblins (Club, spear) - ACTOR_EN_DEKUBABA, // Deku Baba (small, large) - ACTOR_EN_AM, // Armos (enemy variant) - ACTOR_EN_DEKUNUTS, // Mad Scrub (single attack, triple attack) - ACTOR_EN_VALI, // Bari (big jellyfish) (spawns very high up) - ACTOR_EN_BB, // Bubble (flying skull enemy) (all colors) - ACTOR_EN_YUKABYUN, // Flying Floor Tile - ACTOR_EN_VM, // Beamos - ACTOR_EN_FLOORMAS, // Floormaster - ACTOR_EN_RD, // Redead, Gibdo - ACTOR_EN_SW, // Skullwalltula - // ACTOR_EN_FD, // Flare Dancer (can be randomized, but not randomized to, so keeping it in vanilla locations - // means it at least shows up in the game) + ACTOR_EN_ANUBICE_TAG, // Anubis + ACTOR_EN_FIREFLY, // Keese (including fire/ice) + ACTOR_EN_TEST, // Stalfos + ACTOR_EN_TITE, // Tektite + ACTOR_EN_POH, // Poe (normal, blue rupee, composers) + ACTOR_EN_OKUTA, // Octorok + ACTOR_EN_WALLMAS, // Wallmaster + ACTOR_EN_DODONGO, // Dodongo + // ACTOR_EN_REEBA, // Leever (reliant on spawner (z_en_encount1.c)) + ACTOR_EN_PEEHAT, // Flying Peahat, big one spawning larva, larva + ACTOR_EN_ZF, // Lizalfos, Dinolfos + ACTOR_EN_GOMA, // Gohma Larva (normal, eggs, gohma eggs) + ACTOR_EN_BUBBLE, // Shabom (bubble) + ACTOR_EN_DODOJR, // Baby Dodongo + ACTOR_EN_TORCH2, // Dark Link + ACTOR_EN_BILI, // Biri (small jellyfish) + ACTOR_EN_TP, // Electric Tailpasaran + ACTOR_EN_ST, // Skulltula (normal, big, invisible) + ACTOR_EN_BW, // Torch Slug + ACTOR_EN_EIYER, // Stinger (land) + ACTOR_EN_MB, // Moblins (Club, spear) + ACTOR_EN_DEKUBABA, // Deku Baba (small, large) + ACTOR_EN_AM, // Armos (enemy variant) + ACTOR_EN_DEKUNUTS, // Mad Scrub (single attack, triple attack) + ACTOR_EN_VALI, // Bari (big jellyfish) (spawns very high up) + ACTOR_EN_BB, // Bubble (flying skull enemy) (all colors) + ACTOR_EN_YUKABYUN, // Flying Floor Tile + ACTOR_EN_VM, // Beamos + ACTOR_EN_FLOORMAS, // Floormaster + ACTOR_EN_RD, // Redead, Gibdo + ACTOR_EN_SW, // Skullwalltula + ACTOR_EN_FD, // Flare Dancer ACTOR_EN_SB, // Shell Blade ACTOR_EN_KAREBABA, // Withered Deku Baba ACTOR_EN_RR, // Like-Like @@ -198,6 +225,7 @@ static int enemiesToRandomize[] = { ACTOR_EN_WF, // Wolfos ACTOR_EN_SKB, // Stalchild ACTOR_EN_CROW, // Guay + ACTOR_EN_SKJ, // Skull Kid }; extern "C" uint8_t GetRandomizedEnemy(PlayState* play, int16_t* actorId, f32* posX, f32* posY, f32* posZ, int16_t* rotX, @@ -322,7 +350,7 @@ static std::vector selectedEnemyList; void GetSelectedEnemies() { selectedEnemyList.clear(); - for (int i = 0; i < 49; i++) { + for (int i = 0; i < RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE; i++) { if (CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemyList.All"), 0)) { selectedEnemyList.push_back(randomizedEnemySpawnTable[i]); } else if (CVarGetInteger(enemyCVarList[i], 1)) { @@ -408,6 +436,8 @@ bool IsEnemyFoundToRandomize(int16_t sceneNum, int8_t roomNum, int16_t actorId, case ACTOR_EN_SB: case ACTOR_EN_NY: return (!(!isMQ && sceneNum == SCENE_WATER_TEMPLE && roomNum == 2)); + case ACTOR_EN_SKJ: + return !(sceneNum == SCENE_LOST_WOODS && LINK_IS_CHILD); default: return 1; } @@ -419,19 +449,19 @@ bool IsEnemyFoundToRandomize(int16_t sceneNum, int8_t roomNum, int16_t actorId, } bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy) { - uint32_t isMQ = ResourceMgr_IsSceneMasterQuest(sceneNum); // Freezard - Child Link can only kill this with jump slash Deku Sticks or other equipment like bombs. // Beamos - Needs bombs. + // Anubis - Needs fire. // Shell Blade & Spike - Child Link can't kill these with sword or Deku Stick. - // Arwing & Dark Link - Both go out of bounds way too easily, softlocking the player. + // Flare dancer, Arwing & Dark Link - Both go out of bounds way too easily, softlocking the player. // Wallmaster - Not easily visible, often makes players think they're softlocked and that there's no enemies left. // Club Moblin - Many issues with them falling or placing out of bounds. Maybe fixable in the future? - bool enemiesToExcludeClearRooms = enemy.id == ACTOR_EN_FZ || enemy.id == ACTOR_EN_VM || enemy.id == ACTOR_EN_SB || - enemy.id == ACTOR_EN_NY || enemy.id == ACTOR_EN_CLEAR_TAG || - enemy.id == ACTOR_EN_WALLMAS || enemy.id == ACTOR_EN_TORCH2 || - enemy.id == ACTOR_EN_MB; + bool enemiesToExcludeClearRooms = + enemy.id == ACTOR_EN_FZ || enemy.id == ACTOR_EN_VM || enemy.id == ACTOR_EN_SB || enemy.id == ACTOR_EN_NY || + enemy.id == ACTOR_EN_CLEAR_TAG || enemy.id == ACTOR_EN_WALLMAS || enemy.id == ACTOR_EN_TORCH2 || + (enemy.id == ACTOR_EN_MB && enemy.params == 0) || enemy.id == ACTOR_EN_FD || enemy.id == ACTOR_EN_ANUBICE_TAG; // Bari - Spawns 3 more enemies, potentially extremely difficult in timed rooms. bool enemiesToExcludeTimedRooms = enemiesToExcludeClearRooms || enemy.id == ACTOR_EN_VALI; @@ -532,3 +562,16 @@ bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy) { return 1; } } + +void FixClubMoblinScale(void* ptr) { + Actor* actor = (Actor*)ptr; + if (actor->params == -1) { + Actor_SetScale(actor, 0.014f); + } +} + +void RegisterEnemyRandomizer() { + COND_ID_HOOK(OnActorInit, ACTOR_EN_MB, CVAR_ENEMY_RANDOMIZER_VALUE, FixClubMoblinScale); +} + +static RegisterShipInitFunc initFunc(RegisterEnemyRandomizer, { CVAR_ENEMY_RANDOMIZER_NAME }); \ No newline at end of file diff --git a/soh/soh/Enhancements/enemyrandomizer.h b/soh/soh/Enhancements/enemyrandomizer.h index 4c4fd5576..d73930831 100644 --- a/soh/soh/Enhancements/enemyrandomizer.h +++ b/soh/soh/Enhancements/enemyrandomizer.h @@ -1,23 +1,16 @@ #pragma once -#include +#include -typedef struct EnemyEntry { - int16_t id; - int16_t params; -} EnemyEntry; - -#define RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE 49 - -bool IsEnemyFoundToRandomize(int16_t sceneNum, int8_t roomNum, int16_t actorId, int16_t params, float posX); -bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy); -EnemyEntry GetRandomizedEnemyEntry(uint32_t seed); +#define RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE 52 extern const char* enemyCVarList[]; extern const char* enemyNameList[]; extern void GetSelectedEnemies(); #ifndef __cplusplus -uint8_t GetRandomizedEnemy(PlayState* play, int16_t* actorId, f32* posX, f32* posY, f32* posZ, int16_t* rotX, +struct PlayState; + +uint8_t GetRandomizedEnemy(struct PlayState* play, int16_t* actorId, f32* posX, f32* posY, f32* posZ, int16_t* rotX, int16_t* rotY, int16_t* rotZ, int16_t* params); #endif diff --git a/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c b/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c index dc629c0b7..e5407bf67 100644 --- a/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c +++ b/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c @@ -1,6 +1,7 @@ #include "z_en_skj.h" #include "overlays/actors/ovl_En_Skjneedle/z_en_skjneedle.h" #include "objects/object_skj/object_skj.h" +#include "soh/Enhancements/enhancementTypes.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" @@ -404,7 +405,9 @@ void EnSkj_Init(Actor* thisx, PlayState* play2) { default: this->actor.params = type; if (((this->actor.params != 0) && (this->actor.params != 1)) && (this->actor.params != 2)) { - if (INV_CONTENT(ITEM_TRADE_ADULT) < ITEM_SAW) { + if (INV_CONTENT(ITEM_TRADE_ADULT) < ITEM_SAW && + CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), ENEMY_RANDOMIZER_OFF) == + ENEMY_RANDOMIZER_OFF) { Actor_Kill(&this->actor); return; } From ad850e50b10f75df541dad5e8bf1ff506be5befa Mon Sep 17 00:00:00 2001 From: Eric Hoey <121978037+A-Green-Spoon@users.noreply.github.com> Date: Wed, 11 Jun 2025 17:35:49 -0400 Subject: [PATCH 22/67] prevent OOB write for BGM fix in grotto mixed pools (#5572) --- soh/soh/Enhancements/randomizer/randomizer_entrance.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer_entrance.c b/soh/soh/Enhancements/randomizer/randomizer_entrance.c index faec117eb..e32223124 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_entrance.c +++ b/soh/soh/Enhancements/randomizer/randomizer_entrance.c @@ -253,7 +253,9 @@ void Entrance_Init(void) { for (s16 i = 0; i < 4; i++) { // Zero out the bit in the field which tells the game to keep playing // background music for all four scene setups at each index - gEntranceTable[override + i].field &= ~ENTRANCE_INFO_CONTINUE_BGM_FLAG; + if (override + i < ENTRANCE_TABLE_SIZE) { + gEntranceTable[override + i].field &= ~ENTRANCE_INFO_CONTINUE_BGM_FLAG; + } } } } From 0b9fe2d9b967737d643cca55de936547d6749c18 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Wed, 11 Jun 2025 14:35:57 -0700 Subject: [PATCH 23/67] Fix Search Crash from Scrolling (#5571) * Fix search crashing when section child scrolled too far. * clang --- soh/soh/SohGui/Menu.cpp | 54 +++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/soh/soh/SohGui/Menu.cpp b/soh/soh/SohGui/Menu.cpp index 87c362496..5a609a935 100644 --- a/soh/soh/SohGui/Menu.cpp +++ b/soh/soh/SohGui/Menu.cpp @@ -185,33 +185,35 @@ bool ModernMenuHeaderEntry(std::string label) { } uint32_t Menu::DrawSearchResults(std::string& menuSearchText) { - ImGui::BeginChild("Search Results"); int searchCount = 0; - for (auto& menuLabel : menuOrder) { - auto& menuEntry = menuEntries.at(menuLabel); - for (auto& sidebarLabel : menuEntry.sidebarOrder) { - auto& sidebar = menuEntry.sidebars[sidebarLabel]; - for (int i = 0; i < sidebar.columnWidgets.size(); i++) { - auto& column = sidebar.columnWidgets.at(i); - for (auto& info : column) { - if (info.type == WIDGET_SEARCH || info.type == WIDGET_SEPARATOR || - info.type == WIDGET_SEPARATOR_TEXT || info.isHidden) { - continue; - } - const char* tooltip = info.options->tooltip; - std::string widgetStr = std::string(info.name) + std::string(tooltip != NULL ? tooltip : ""); - std::transform(menuSearchText.begin(), menuSearchText.end(), menuSearchText.begin(), ::tolower); - menuSearchText.erase(std::remove(menuSearchText.begin(), menuSearchText.end(), ' '), - menuSearchText.end()); - std::transform(widgetStr.begin(), widgetStr.end(), widgetStr.begin(), ::tolower); - widgetStr.erase(std::remove(widgetStr.begin(), widgetStr.end(), ' '), widgetStr.end()); - if (widgetStr.find(menuSearchText) != std::string::npos) { - MenuDrawItem(info, 90 / sidebar.columnCount, menuThemeIndex); - ImGui::PushStyleColor(ImGuiCol_Text, UIWidgets::ColorValues.at(UIWidgets::Colors::Gray)); - std::string origin = fmt::format(" ({} -> {}, Col {})", menuEntry.label, sidebarLabel, i + 1); - ImGui::Text("%s", origin.c_str()); - ImGui::PopStyleColor(); - searchCount++; + if (ImGui::BeginChild("Search Results")) { + for (auto& menuLabel : menuOrder) { + auto& menuEntry = menuEntries.at(menuLabel); + for (auto& sidebarLabel : menuEntry.sidebarOrder) { + auto& sidebar = menuEntry.sidebars[sidebarLabel]; + for (int i = 0; i < sidebar.columnWidgets.size(); i++) { + auto& column = sidebar.columnWidgets.at(i); + for (auto& info : column) { + if (info.type == WIDGET_SEARCH || info.type == WIDGET_SEPARATOR || + info.type == WIDGET_SEPARATOR_TEXT || info.isHidden) { + continue; + } + const char* tooltip = info.options->tooltip; + std::string widgetStr = std::string(info.name) + std::string(tooltip != NULL ? tooltip : ""); + std::transform(menuSearchText.begin(), menuSearchText.end(), menuSearchText.begin(), ::tolower); + menuSearchText.erase(std::remove(menuSearchText.begin(), menuSearchText.end(), ' '), + menuSearchText.end()); + std::transform(widgetStr.begin(), widgetStr.end(), widgetStr.begin(), ::tolower); + widgetStr.erase(std::remove(widgetStr.begin(), widgetStr.end(), ' '), widgetStr.end()); + if (widgetStr.find(menuSearchText) != std::string::npos) { + MenuDrawItem(info, 90 / sidebar.columnCount, menuThemeIndex); + ImGui::PushStyleColor(ImGuiCol_Text, UIWidgets::ColorValues.at(UIWidgets::Colors::Gray)); + std::string origin = + fmt::format(" ({} -> {}, Col {})", menuEntry.label, sidebarLabel, i + 1); + ImGui::Text("%s", origin.c_str()); + ImGui::PopStyleColor(); + searchCount++; + } } } } From dbc2ff09b5bfe845055161e28ca6510649aad3ef Mon Sep 17 00:00:00 2001 From: Rozelette Date: Wed, 11 Jun 2025 16:37:34 -0500 Subject: [PATCH 24/67] Convert actor health bars to use ObjectExtension (#5565) --- soh/include/z64actor.h | 3 -- .../ObjectExtension/ActorMaximumHealth.cpp | 29 +++++++++++++++++++ soh/soh/ObjectExtension/ActorMaximumHealth.h | 17 +++++++++++ soh/src/code/z_actor.c | 10 ------- soh/src/code/z_parameter.c | 3 +- soh/src/overlays/actors/ovl_En_Fz/z_en_fz.c | 3 +- 6 files changed, 50 insertions(+), 15 deletions(-) create mode 100644 soh/soh/ObjectExtension/ActorMaximumHealth.cpp create mode 100644 soh/soh/ObjectExtension/ActorMaximumHealth.h diff --git a/soh/include/z64actor.h b/soh/include/z64actor.h index 6d8fd3ca0..77172bda4 100644 --- a/soh/include/z64actor.h +++ b/soh/include/z64actor.h @@ -266,9 +266,6 @@ typedef struct Actor { /* 0x134 */ ActorFunc draw; // Draw Routine. Called by `Actor_Draw` /* 0x138 */ ActorResetFunc reset; /* 0x13C */ char dbgPad[0x10]; // Padding that only exists in the debug rom - // #region SOH [General] - /* */ u8 maximumHealth; // Max health value for use with health bars, set on actor init - // #endregion } Actor; // size = 0x14C typedef enum { diff --git a/soh/soh/ObjectExtension/ActorMaximumHealth.cpp b/soh/soh/ObjectExtension/ActorMaximumHealth.cpp new file mode 100644 index 000000000..9c710822f --- /dev/null +++ b/soh/soh/ObjectExtension/ActorMaximumHealth.cpp @@ -0,0 +1,29 @@ +#include "ActorMaximumHealth.h" +#include "soh/ObjectExtension/ObjectExtension.h" +#include "soh/ShipInit.hpp" +#include "soh/Enhancements/game-interactor/GameInteractor.h" + +struct ActorMaximumHealth { + u8 maximumHealth = 0; +}; +static ObjectExtension::Register ActorMaximumHealthRegister; + +u8 GetActorMaximumHealth(const Actor* actor) { + const ActorMaximumHealth* maxHealth = ObjectExtension::GetInstance().Get(actor); + return maxHealth != nullptr ? maxHealth->maximumHealth : ActorMaximumHealth{}.maximumHealth; +} + +void SetActorMaximumHealth(const Actor* actor, u8 maximumHealth) { + ObjectExtension::GetInstance().Set(actor, ActorMaximumHealth{ maximumHealth }); +} + +static void ActorMaximumHealth_Register() { + COND_HOOK(OnActorInit, true, [](void* ptr) { + Actor* actor = static_cast(ptr); + if (actor->category == ACTORCAT_ENEMY) { + SetActorMaximumHealth(actor, actor->colChkInfo.health); + } + }); +} + +RegisterShipInitFunc actorMaximumHealthInit(ActorMaximumHealth_Register); \ No newline at end of file diff --git a/soh/soh/ObjectExtension/ActorMaximumHealth.h b/soh/soh/ObjectExtension/ActorMaximumHealth.h new file mode 100644 index 000000000..d3ee67acd --- /dev/null +++ b/soh/soh/ObjectExtension/ActorMaximumHealth.h @@ -0,0 +1,17 @@ +#ifndef ACTOR_MAXIMUM_HEALTH_H +#define ACTOR_MAXIMUM_HEALTH_H + +#ifdef __cplusplus +extern "C" { +#include "z64actor.h" +#endif + +// Max health value for use with health bars, set on actor init +u8 GetActorMaximumHealth(const Actor* actor); +void SetActorMaximumHealth(const Actor* actor, u8 maximumHealth); + +#ifdef __cplusplus +} +#endif + +#endif // ACTOR_MAXIMUM_HEALTH_H \ No newline at end of file diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c index 0b9d20bc5..3933f263d 100644 --- a/soh/src/code/z_actor.c +++ b/soh/src/code/z_actor.c @@ -1260,11 +1260,6 @@ void Actor_Init(Actor* actor, PlayState* play) { actor->init = NULL; GameInteractor_ExecuteOnActorInit(actor); - - // For enemy health bar we need to know the max health during init - if (actor->category == ACTORCAT_ENEMY) { - actor->maximumHealth = actor->colChkInfo.health; - } } } @@ -2625,11 +2620,6 @@ void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx) { actor->init = NULL; GameInteractor_ExecuteOnActorInit(actor); - - // For enemy health bar we need to know the max health during init - if (actor->category == ACTORCAT_ENEMY) { - actor->maximumHealth = actor->colChkInfo.health; - } } actor = actor->next; } else if (!Object_IsLoaded(&play->objectCtx, actor->objBankIndex)) { diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index cc6245241..0fc923070 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -24,6 +24,7 @@ #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/gameplaystats.h" +#include "soh/ObjectExtension/ActorMaximumHealth.h" #include "message_data_static.h" extern MessageTableEntry* sNesMessageEntryTablePtr; @@ -3643,7 +3644,7 @@ void Interface_DrawEnemyHealthBar(TargetContext* targetCtx, PlayState* play) { f32 scaleY = -0.75f; f32 scaledHeight = -texHeight * scaleY; f32 halfBarWidth = endTexWidth + ((f32)healthbar_fillWidth / 2); - s16 healthBarFill = ((f32)actor->colChkInfo.health / actor->maximumHealth) * healthbar_fillWidth; + s16 healthBarFill = ((f32)actor->colChkInfo.health / GetActorMaximumHealth(actor)) * healthbar_fillWidth; if (anchorType == ENEMYHEALTH_ANCHOR_ACTOR) { // Get actor projected position diff --git a/soh/src/overlays/actors/ovl_En_Fz/z_en_fz.c b/soh/src/overlays/actors/ovl_En_Fz/z_en_fz.c index 217afe31f..13afa66f6 100644 --- a/soh/src/overlays/actors/ovl_En_Fz/z_en_fz.c +++ b/soh/src/overlays/actors/ovl_En_Fz/z_en_fz.c @@ -2,6 +2,7 @@ #include "objects/object_fz/object_fz.h" #include "soh/frame_interpolation.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ObjectExtension/ActorMaximumHealth.h" #define FLAGS \ (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_HOSTILE | ACTOR_FLAG_UPDATE_CULLING_DISABLED | \ @@ -725,7 +726,7 @@ void EnFz_Draw(Actor* thisx, PlayState* play) { // displayLists, so we need to recompute the index based on the scaled health (using the maximum health value) and // clamp the final result for safety. if (CVarGetInteger(CVAR_ENHANCEMENT("EnemySizeScalesHealth"), 0)) { - u8 scaledHealth = (u8)(((f32)this->actor.colChkInfo.health / this->actor.maximumHealth) * 6); + u8 scaledHealth = (u8)(((f32)this->actor.colChkInfo.health / GetActorMaximumHealth(this)) * 6); index = (6 - scaledHealth) >> 1; index = CLAMP(index, 0, 2); } From af99ef8e07e5d19f9750b53cbd6024b314a046e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Wed, 11 Jun 2025 21:38:12 +0000 Subject: [PATCH 25/67] Hookify TreesDropSticks (#5566) * Hookify TreesDropSticks * fix off by one --- soh/soh/Enhancements/TreesDropSticks.cpp | 31 +++++++++++++++++++ .../vanilla-behavior/GIVanillaBehavior.h | 16 ++++++++++ soh/src/code/z_en_item00.c | 4 +-- .../actors/ovl_En_Wood02/z_en_wood02.c | 9 ++---- 4 files changed, 51 insertions(+), 9 deletions(-) create mode 100644 soh/soh/Enhancements/TreesDropSticks.cpp diff --git a/soh/soh/Enhancements/TreesDropSticks.cpp b/soh/soh/Enhancements/TreesDropSticks.cpp new file mode 100644 index 000000000..7fdc4eb0a --- /dev/null +++ b/soh/soh/Enhancements/TreesDropSticks.cpp @@ -0,0 +1,31 @@ +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "src/overlays/actors/ovl_En_Wood02/z_en_wood02.h" +} + +extern PlayState* gPlayState; + +void RegisterTreesDropSticks() { + COND_VB_SHOULD(VB_TREE_DROP_COLLECTIBLE, CVarGetInteger(CVAR_ENHANCEMENT("TreesDropSticks"), 0), { + if (INV_CONTENT(ITEM_STICK) != ITEM_NONE) { + EnWood02* tree = va_arg(args, EnWood02*); + Vec3f dropsSpawnPt = tree->actor.world.pos; + dropsSpawnPt.y += 200.0f; + + *should = false; + for (s32 numDrops = Rand_Next() % 4; numDrops > 0; numDrops--) { + Item_DropCollectible(gPlayState, &dropsSpawnPt, ITEM00_STICK); + } + } + }); + + COND_VB_SHOULD(VB_PREVENT_ADULT_STICK, CVarGetInteger(CVAR_ENHANCEMENT("TreesDropSticks"), 0), { + if (INV_CONTENT(ITEM_STICK) != ITEM_NONE) { + *should = false; + } + }); +} + +static RegisterShipInitFunc initFunc(RegisterTreesDropSticks, { CVAR_ENHANCEMENT("TreesDropSticks") }); diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index fea114198..5159118b1 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -1697,6 +1697,15 @@ typedef enum { // - `*ObjTsubo` VB_POT_SETUP_DRAW, + // #### `result` + // ```c + // dropId == ITEM00_STICK + // ``` + // #### `args` + // - None + VB_PREVENT_ADULT_STICK, + + // #### `result` // #### `result` // ```c // true @@ -2073,6 +2082,13 @@ typedef enum { VB_TRANSITION_TO_SAVE_SCREEN_ON_DEATH, // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnWood02` + VB_TREE_DROP_COLLECTIBLE, + // ```c // true // ``` diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index 040549466..b6bf5ecdf 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -4,8 +4,8 @@ #include "overlays/effects/ovl_Effect_Ss_Dead_Sound/z_eff_ss_dead_sound.h" #include "textures/icon_item_static/icon_item_static.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" -#include "soh/OTRGlobals.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/OTRGlobals.h" #define FLAGS 0 @@ -1536,7 +1536,7 @@ s16 func_8001F404(s16 dropId) { if (LINK_IS_ADULT) { if (dropId == ITEM00_SEEDS) { dropId = ITEM00_ARROWS_SMALL; - } else if ((dropId == ITEM00_STICK) && !(CVarGetInteger(CVAR_ENHANCEMENT("TreesDropSticks"), 0))) { + } else if (GameInteractor_Should(VB_PREVENT_ADULT_STICK, dropId == ITEM00_STICK)) { dropId = ITEM00_RUPEE_GREEN; } } else { diff --git a/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c b/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c index 72218e3b4..2fe2445a6 100644 --- a/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c +++ b/soh/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c @@ -6,6 +6,7 @@ #include "z_en_wood02.h" #include "objects/object_wood02/object_wood02.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS 0 @@ -327,7 +328,6 @@ void EnWood02_Update(Actor* thisx, PlayState* play2) { Vec3f dropsSpawnPt; s32 i; s32 leavesParams; - s32 numDrops; // Despawn extra trees in a group if out of range if ((this->spawnType == WOOD_SPAWN_SPAWNED) && (this->actor.parent != NULL)) { @@ -358,12 +358,7 @@ void EnWood02_Update(Actor* thisx, PlayState* play2) { dropsSpawnPt.y += 200.0f; if ((this->unk_14C >= 0) && (this->unk_14C < 0x64)) { - if (CVarGetInteger(CVAR_ENHANCEMENT("TreesDropSticks"), 0) && INV_CONTENT(ITEM_STICK) != ITEM_NONE) { - numDrops = Rand_ZeroOne() * 4; - for (i = 0; i < numDrops; ++i) { - Item_DropCollectible(play, &dropsSpawnPt, ITEM00_STICK); - } - } else { + if (GameInteractor_Should(VB_TREE_DROP_COLLECTIBLE, true, this)) { Item_DropCollectibleRandom(play, &this->actor, &dropsSpawnPt, this->unk_14C << 4); } } else if (this->actor.home.rot.z != 0) { From 07328a0ecb8f80882d4b585e0f748e59588d1b21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Wed, 11 Jun 2025 21:38:34 +0000 Subject: [PATCH 26/67] remove leftover No Dampe Fire checkbox (#5561) got moved to difficulty dropdown --- soh/soh/SohGui/SohMenuEnhancements.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index 3ffa9cfed..feb36eebb 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -1586,9 +1586,6 @@ void SohMenu::AddMenuEnhancements() { .Options(CheckboxOptions().Tooltip( "Keese and Guay no longer target you and simply ignore you as if you were wearing the " "Skull Mask.")); - AddWidget(path, "No Dampe Fire", WIDGET_CVAR_CHECKBOX) - .CVar(CVAR_CHEAT("NoDampeFire")) - .Options(CheckboxOptions().Tooltip("Dampe won't drop fireballs during race.")); AddWidget(path, "Glitch Aids", WIDGET_SEPARATOR_TEXT); AddWidget(path, "Easy Frame Advancing with Pause", WIDGET_CVAR_CHECKBOX) From 69792e9717c582cfce0be8a14ead95154e74a907 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Wed, 11 Jun 2025 14:39:15 -0700 Subject: [PATCH 27/67] Save and Randomizer Version Control (#5557) * Add version control for Rachael saves and old rando saves. * Change spoiler drop success sound to puzzle success chime. Add spoiler drop fail sound (sys_error). Improve path sanitizer operation. Add check for a spoiler having a version and it equaling running version. Deletes spoiler CVar if spoiler becomes unusuable while running, and prevents loading dropped spoilers that don't match. * clang * Remove backslash escaping from Sanitize. Remove duplicate Sanitize from Context and make it use SohUtils. Fix typo. --- soh/soh/Enhancements/randomizer/context.cpp | 21 +- .../Enhancements/randomizer/randomizer.cpp | 18 +- soh/soh/SaveManager.cpp | 286 ++++-------------- soh/soh/SaveManager.h | 6 +- soh/soh/util.cpp | 11 - .../ovl_file_choose/z_file_choose.c | 16 +- 6 files changed, 83 insertions(+), 275 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/context.cpp b/soh/soh/Enhancements/randomizer/context.cpp index 550cd0e93..a0f7f223b 100644 --- a/soh/soh/Enhancements/randomizer/context.cpp +++ b/soh/soh/Enhancements/randomizer/context.cpp @@ -11,6 +11,7 @@ #include "fishsanity.h" #include "macros.h" #include "3drando/hints.hpp" +#include "soh/util.h" #include "../kaleido.h" #include @@ -370,25 +371,8 @@ GetItemEntry Context::GetFinalGIEntry(const RandomizerCheck rc, const bool check return giEntry; } -std::string sanitize(std::string stringValue) { - // Add backslashes. - for (auto i = stringValue.begin();;) { - auto const pos = - std::find_if(i, stringValue.end(), [](char const c) { return '\\' == c || '\'' == c || '"' == c; }); - if (pos == stringValue.end()) { - break; - } - i = std::next(stringValue.insert(pos, '\\'), 2); - } - - // Removes others. - std::erase_if(stringValue, [](char const c) { return '\n' == c || '\r' == c || '\0' == c || '\x1A' == c; }); - - return stringValue; -} - void Context::ParseSpoiler(const char* spoilerFileName) { - std::ifstream spoilerFileStream(sanitize(spoilerFileName)); + std::ifstream spoilerFileStream(SohUtils::Sanitize(spoilerFileName)); if (!spoilerFileStream) { return; } @@ -397,6 +381,7 @@ void Context::ParseSpoiler(const char* spoilerFileName) { try { nlohmann::json spoilerFileJson; spoilerFileStream >> spoilerFileJson; + spoilerFileStream.close(); ParseHashIconIndexesJson(spoilerFileJson); Rando::Settings::GetInstance()->ParseJson(spoilerFileJson); ParseItemLocationsJson(spoilerFileJson); diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 18a23df53..7809a39c1 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -361,10 +361,20 @@ std::unordered_map getItemIdToItemId = { bool Randomizer::SpoilerFileExists(const char* spoilerFileName) { if (strcmp(spoilerFileName, "") != 0) { std::ifstream spoilerFileStream(SohUtils::Sanitize(spoilerFileName)); - if (!spoilerFileStream) { - return false; - } else { - return true; + if (spoilerFileStream) { + nlohmann::json contents; + spoilerFileStream >> contents; + spoilerFileStream.close(); + if (contents.contains("version") && + strcmp(std::string(contents["version"]).c_str(), (char*)gBuildVersion) == 0) { + return true; + } else { + SohGui::RegisterPopup( + "Old Spoiler Version", + "The spoiler file located at\n" + std::string(spoilerFileName) + + "\nwas made by a version that doesn't match the currently running version.\n" + + "Loading for this file has been cancelled."); + } } } diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index 97ab6a52a..e023f9afe 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -119,10 +119,8 @@ SaveManager::SaveManager() { AddLoadFunction("base", 4, LoadBaseVersion4); AddSaveFunction("base", 4, SaveBase, true, SECTION_PARENT_NONE); - AddLoadFunction("randomizer", 1, LoadRandomizerVersion1); - AddLoadFunction("randomizer", 2, LoadRandomizerVersion2); - AddLoadFunction("randomizer", 3, LoadRandomizerVersion3); - AddSaveFunction("randomizer", 3, SaveRandomizer, true, SECTION_PARENT_NONE); + AddLoadFunction("randomizer", 1, LoadRandomizer); + AddSaveFunction("randomizer", 1, SaveRandomizer, true, SECTION_PARENT_NONE); AddInitFunction(InitFileImpl); @@ -157,234 +155,7 @@ SaveManager::SaveManager() { } } -// RANDOTODO should we just have dummy functions that raise warnings instead if these aren't supported? -void SaveManager::LoadRandomizerVersion1() { - auto randoContext = Rando::Context::GetInstance(); - RandomizerCheck location = RC_UNKNOWN_CHECK; - for (int i = 0; i < RC_MAX; i++) { - SaveManager::Instance->LoadData("check" + std::to_string(i), location); - SaveManager::Instance->LoadStruct("get" + std::to_string(i), [&]() { - SaveManager::Instance->LoadData("rgID", randoContext->GetItemLocation(location)->RefPlacedItem()); - if (randoContext->GetItemLocation(location)->GetPlacedRandomizerGet() == RG_ICE_TRAP) { - randoContext->overrides[location].SetLocation(location); - SaveManager::Instance->LoadData("fakeRgID", randoContext->overrides[location].RefLooksLike()); - SaveManager::Instance->LoadData("trickName", randoContext->overrides[location].GetTrickName().english); - SaveManager::Instance->LoadData("trickName", randoContext->overrides[location].GetTrickName().french); - } - }); - } - - for (uint32_t i = 0; i < randoContext->hashIconIndexes.size(); i++) { - SaveManager::Instance->LoadData("seed" + std::to_string(i), randoContext->hashIconIndexes[i]); - } - - for (int i = 0; i < RSK_MAX; i++) { - int key, value; - SaveManager::Instance->LoadData("sk" + std::to_string(i), key); - SaveManager::Instance->LoadData("sv" + std::to_string(i), value); - randoContext->GetOption(RandomizerSettingKey(key)).Set(value); - } - - for (int i = 0; i < 50; i++) { - RandomizerCheck check; - char hintText[200]; - SaveManager::Instance->LoadData("hc" + std::to_string(i), check); - for (int j = 0; j < ARRAY_COUNT(hintText); j++) { - SaveManager::Instance->LoadData("ht" + std::to_string(i) + "-" + std::to_string(j), hintText[j]); - } - RandomizerHint stoneHint = Rando::StaticData::oldVerHintOrder[i - Rando::StaticData::oldVerGossipStoneStart]; - randoContext->AddHint(stoneHint, Rando::Hint(stoneHint, { CustomMessage(hintText) })); - } - - char childAltarText[250]; - for (int i = 0; i < ARRAY_COUNT(childAltarText); i++) { - SaveManager::Instance->LoadData("cat" + std::to_string(i), childAltarText[i]); - } - randoContext->AddHint(RH_ALTAR_CHILD, Rando::Hint(RH_ALTAR_CHILD, { CustomMessage(childAltarText) })); - - char adultAltarText[750]; - for (int i = 0; i < ARRAY_COUNT(adultAltarText); i++) { - SaveManager::Instance->LoadData("aat" + std::to_string(i), adultAltarText[i]); - } - randoContext->AddHint(RH_ALTAR_ADULT, Rando::Hint(RH_ALTAR_ADULT, { CustomMessage(adultAltarText) })); - - char ganonHintText[150]; - for (int i = 0; i < ARRAY_COUNT(ganonHintText); i++) { - SaveManager::Instance->LoadData("ght" + std::to_string(i), ganonHintText[i]); - } - randoContext->AddHint(RH_GANONDORF_HINT, Rando::Hint(RH_GANONDORF_HINT, { CustomMessage(ganonHintText) })); - - char ganonText[250]; - for (int i = 0; i < ARRAY_COUNT(ganonText); i++) { - SaveManager::Instance->LoadData("gt" + std::to_string(i), ganonText[i]); - } - randoContext->AddHint(RH_GANONDORF_JOKE, Rando::Hint(RH_GANONDORF_JOKE, { CustomMessage(ganonText) })); - - SaveManager::Instance->LoadData("triforcePiecesCollected", - gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected); - - SaveManager::Instance->LoadData("pendingIceTrapCount", gSaveContext.ship.pendingIceTrapCount); - - size_t merchantPricesSize = 0; - if (randoContext->GetOption(RSK_SHUFFLE_SCRUBS).Is(RO_SCRUBS_OFF)) { - merchantPricesSize += NUM_SCRUBS; - } - if (randoContext->GetOption(RSK_SHOPSANITY).Is(RO_SHOPSANITY_OFF)) { - merchantPricesSize += NUM_SHOP_ITEMS; - } - - SaveManager::Instance->LoadArray("merchantPrices", merchantPricesSize, [&](size_t i) { - SaveManager::Instance->LoadStruct("", [&]() { - RandomizerCheck rc; - SaveManager::Instance->LoadData("check", rc); - uint32_t price; - SaveManager::Instance->LoadData("price", price); - randoContext->GetItemLocation(rc)->SetCustomPrice(price); - }); - }); -} - -// RANDOTODO if we actually support this, be less lazy -void SaveManager::LoadRandomizerVersion2() { - auto randoContext = Rando::Context::GetInstance(); - SaveManager::Instance->LoadArray("itemLocations", RC_MAX, [&](size_t i) { - SaveManager::Instance->LoadStruct("", [&]() { - SaveManager::Instance->LoadData("rgID", randoContext->GetItemLocation(i)->RefPlacedItem()); - RandomizerGet rg = RG_NONE; - SaveManager::Instance->LoadData("fakeRgID", rg, RG_NONE); - if (rg != RG_NONE) { - randoContext->overrides[static_cast(i)] = - Rando::ItemOverride(static_cast(i), rg); - SaveManager::Instance->LoadData( - "trickName", randoContext->overrides[static_cast(i)].GetTrickName().english); - SaveManager::Instance->LoadData( - "trickName", randoContext->overrides[static_cast(i)].GetTrickName().french); - } - }); - }); - - auto entranceCtx = randoContext->GetEntranceShuffler(); - SaveManager::Instance->LoadArray("entrances", ARRAY_COUNT(entranceCtx->entranceOverrides), [&](size_t i) { - SaveManager::Instance->LoadStruct("", [&]() { - SaveManager::Instance->LoadData("type", entranceCtx->entranceOverrides[i].type); - SaveManager::Instance->LoadData("index", entranceCtx->entranceOverrides[i].index); - SaveManager::Instance->LoadData("destination", entranceCtx->entranceOverrides[i].destination); - SaveManager::Instance->LoadData("override", entranceCtx->entranceOverrides[i].override); - SaveManager::Instance->LoadData("overrideDestination", - entranceCtx->entranceOverrides[i].overrideDestination); - }); - }); - - SaveManager::Instance->LoadArray("seed", randoContext->hashIconIndexes.size(), [&](size_t i) { - SaveManager::Instance->LoadData("", randoContext->hashIconIndexes[i]); - }); - - std::string inputSeed; - SaveManager::Instance->LoadData("inputSeed", inputSeed); - randoContext->SetSeedString(inputSeed); - - uint32_t finalSeed; - SaveManager::Instance->LoadData("finalSeed", finalSeed); - randoContext->SetSeed(finalSeed); - - SaveManager::Instance->LoadArray("randoSettings", RSK_MAX, [&](size_t i) { - int value = 0; - SaveManager::Instance->LoadData("", value); - randoContext->GetOption(RandomizerSettingKey(i)).Set(value); - }); - - SaveManager::Instance->LoadArray("hintLocations", RH_ZR_OPEN_GROTTO_GOSSIP_STONE + 1, [&](size_t i) { - SaveManager::Instance->LoadStruct("", [&]() { - RandomizerCheck rc = RC_UNKNOWN_CHECK; - SaveManager::Instance->LoadData("check", rc); - if (rc != RC_UNKNOWN_CHECK) { - std::string hintText; - SaveManager::Instance->LoadData("hintText", hintText); - RandomizerHint stoneHint = - Rando::StaticData::oldVerHintOrder[rc - Rando::StaticData::oldVerGossipStoneStart]; - randoContext->AddHint(stoneHint, Rando::Hint(stoneHint, { CustomMessage(hintText) })); - } - }); - }); - - std::string childAltarText; - SaveManager::Instance->LoadData("childAltarText", childAltarText); - randoContext->AddHint(RH_ALTAR_CHILD, Rando::Hint(RH_ALTAR_CHILD, { CustomMessage(childAltarText) })); - std::string adultAltarText; - SaveManager::Instance->LoadData("adultAltarText", adultAltarText); - randoContext->AddHint(RH_ALTAR_ADULT, Rando::Hint(RH_ALTAR_ADULT, { CustomMessage(adultAltarText) })); - std::string ganonHintText; - SaveManager::Instance->LoadData("ganonHintText", ganonHintText); - randoContext->AddHint(RH_GANONDORF_HINT, Rando::Hint(RH_GANONDORF_HINT, { CustomMessage(ganonHintText) })); - std::string ganonText; - SaveManager::Instance->LoadData("ganonText", ganonText); - randoContext->AddHint(RH_GANONDORF_JOKE, Rando::Hint(RH_GANONDORF_JOKE, { CustomMessage(ganonText) })); - std::string dampeText; - SaveManager::Instance->LoadData("dampeText", dampeText); - randoContext->AddHint(RH_DAMPES_DIARY, Rando::Hint(RH_DAMPES_DIARY, { CustomMessage(dampeText) })); - std::string gregHintText; - SaveManager::Instance->LoadData("gregHintText", gregHintText); - randoContext->AddHint(RH_GREG_RUPEE, Rando::Hint(RH_GREG_RUPEE, { CustomMessage(gregHintText) })); - std::string sheikText; - SaveManager::Instance->LoadData("sheikText", sheikText); - randoContext->AddHint(RH_SHEIK_HINT, Rando::Hint(RH_SHEIK_HINT, { CustomMessage(sheikText) })); - std::string sariaText; - SaveManager::Instance->LoadData("sariaText", sariaText); - randoContext->AddHint(RH_SARIA_HINT, Rando::Hint(RH_SARIA_HINT, { CustomMessage(sariaText) })); - std::string fishingPoleText; - SaveManager::Instance->LoadData("fishingPoleText", fishingPoleText); - randoContext->AddHint(RH_FISHING_POLE, Rando::Hint(RH_FISHING_POLE, { CustomMessage(fishingPoleText) })); - std::string warpMinuetText; - SaveManager::Instance->LoadData("warpMinuetText", warpMinuetText); - randoContext->AddHint(RH_MINUET_WARP_LOC, Rando::Hint(RH_MINUET_WARP_LOC, { CustomMessage(warpMinuetText) })); - std::string warpBoleroText; - SaveManager::Instance->LoadData("warpBoleroText", warpBoleroText); - randoContext->AddHint(RH_BOLERO_WARP_LOC, Rando::Hint(RH_BOLERO_WARP_LOC, { CustomMessage(warpBoleroText) })); - std::string warpSerenadeText; - SaveManager::Instance->LoadData("warpSerenadeText", warpSerenadeText); - randoContext->AddHint(RH_SERENADE_WARP_LOC, Rando::Hint(RH_SERENADE_WARP_LOC, { CustomMessage(warpSerenadeText) })); - std::string warpRequiemText; - SaveManager::Instance->LoadData("warpRequiemText", warpRequiemText); - randoContext->AddHint(RH_REQUIEM_WARP_LOC, Rando::Hint(RH_REQUIEM_WARP_LOC, { CustomMessage(warpRequiemText) })); - std::string warpNocturneText; - SaveManager::Instance->LoadData("warpNocturneText", warpNocturneText); - randoContext->AddHint(RH_NOCTURNE_WARP_LOC, Rando::Hint(RH_NOCTURNE_WARP_LOC, { CustomMessage(warpNocturneText) })); - std::string warpPreludeText; - SaveManager::Instance->LoadData("warpPreludeText", warpPreludeText); - randoContext->AddHint(RH_PRELUDE_WARP_LOC, Rando::Hint(RH_PRELUDE_WARP_LOC, { CustomMessage(warpPreludeText) })); - - SaveManager::Instance->LoadData("triforcePiecesCollected", - gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected); - - SaveManager::Instance->LoadData("pendingIceTrapCount", gSaveContext.ship.pendingIceTrapCount); - - std::shared_ptr randomizer = OTRGlobals::Instance->gRandomizer; - - size_t merchantPricesSize = 0; - SaveManager::Instance->LoadData("merchantPricesSize", merchantPricesSize); - - SaveManager::Instance->LoadArray("merchantPrices", merchantPricesSize, [&](size_t i) { - SaveManager::Instance->LoadStruct("", [&]() { - RandomizerCheck rc; - SaveManager::Instance->LoadData("check", rc); - uint32_t price; - SaveManager::Instance->LoadData("price", price); - randoContext->GetItemLocation(rc)->SetCustomPrice(price); - }); - }); - - size_t mqDungeonCount; - SaveManager::Instance->LoadData("masterQuestDungeonCount", mqDungeonCount, (size_t)0); - - randoContext->GetDungeons()->ClearAllMQ(); - SaveManager::Instance->LoadArray("masterQuestDungeons", mqDungeonCount, [&](size_t i) { - uint16_t scene; - SaveManager::Instance->LoadData("", scene); - randoContext->GetDungeons()->GetDungeonFromScene(SceneID(scene))->SetMQ(); - }); -} - -void SaveManager::LoadRandomizerVersion3() { +void SaveManager::LoadRandomizer() { auto randoContext = Rando::Context::GetInstance(); SaveManager::Instance->LoadArray("itemLocations", RC_MAX, [&](size_t i) { SaveManager::Instance->LoadStruct("", [&]() { @@ -1343,8 +1114,57 @@ void SaveManager::LoadFile(int fileNum) { switch (saveBlock["version"].get()) { case 1: for (auto& block : saveBlock["sections"].items()) { - int sectionVersion = block.value()["version"]; std::string sectionName = block.key(); + if (sectionName == "randomizer") { + bool hasStats = saveBlock["sections"].contains("sohStats"); + if (block.value()["data"].contains("aat0") || !hasStats) { // Rachael rando data + SohGui::RegisterPopup( + "Loading old file", + "The file in slot " + std::to_string(fileNum + 1) + + " appears to contain randomizer data, but is a very old format.\n" + + "The randomizer data has been removed, and this file will be treated as a vanilla " + "file.\n" + + "If this was a randomizer file, the file will not work, and should be deleted."); + input.close(); + saveMtx.unlock(); + SaveFile(fileNum); + return; + } + s16 major = saveBlock["sections"]["sohStats"]["data"]["buildVersionMajor"]; + s16 minor = saveBlock["sections"]["sohStats"]["data"]["buildVersionMinor"]; + s16 patch = saveBlock["sections"]["sohStats"]["data"]["buildVersionPatch"]; + // block loading outdated rando save + if (!(major == gBuildVersionMajor && minor == gBuildVersionMinor && + patch == gBuildVersionPatch)) { + input.close(); + std::string newFileName = Ship::Context::GetPathRelativeToAppDirectory("Save") + + ("/file" + std::to_string(fileNum + 1) + "-" + + std::to_string(GetUnixTimestamp()) + ".bak"); + std::filesystem::path newFile(newFileName); + +#if defined(__SWITCH__) || defined(__WIIU__) + copy_file(fileName.c_str(), newFile.c_str()); +#else + std::filesystem::copy_file(fileName, newFile); +#endif + + std::filesystem::remove(fileName); + SohGui::RegisterPopup( + "Outdated Randomizer Save", + "The SoH version in the file in slot " + std::to_string(fileNum + 1) + + " does not match the currently running version.\n" + + "Non-matching rando saves are unsupported, and the file has been renamed to\n" + + " " + newFileName + "\n" + + "If this was not in error, the file should be deleted."); + saveMtx.unlock(); + SaveFile(fileNum); + return; + } + } + int sectionVersion = block.value()["version"]; + if (sectionName == "randomizer" && sectionVersion != 1) { + sectionVersion = 1; + } if (!sectionLoadHandlers.contains(sectionName)) { // Unloadable sections aren't necessarily errors, they are probably mods that were unloaded // TODO report in a more noticeable manner diff --git a/soh/soh/SaveManager.h b/soh/soh/SaveManager.h index 3c4a31243..6d7ef3b33 100644 --- a/soh/soh/SaveManager.h +++ b/soh/soh/SaveManager.h @@ -166,11 +166,7 @@ class SaveManager { static void InitFileDebug(); static void InitFileMaxed(); - static void LoadRandomizerVersion1(); - static void LoadRandomizerVersion2(); - static void LoadRandomizerVersion3(); - static void LoadTrackerData(); - static void SaveTrackerData(SaveContext* saveContext, int sectionID, bool fullSave); + static void LoadRandomizer(); static void SaveRandomizer(SaveContext* saveContext, int sectionID, bool fullSave); static void LoadBaseVersion1(); diff --git a/soh/soh/util.cpp b/soh/soh/util.cpp index 1e5bb2ae8..a991c35ca 100644 --- a/soh/soh/util.cpp +++ b/soh/soh/util.cpp @@ -369,17 +369,6 @@ void SohUtils::CopyStringToCharArray(char* destination, std::string source, size } std::string SohUtils::Sanitize(std::string stringValue) { - // Add backslashes. - for (auto i = stringValue.begin();;) { - auto const pos = - std::find_if(i, stringValue.end(), [](char const c) { return '\\' == c || '\'' == c || '"' == c; }); - if (pos == stringValue.end()) { - break; - } - i = std::next(stringValue.insert(pos, '\\'), 2); - } - - // Removes others. stringValue.erase(std::remove_if(stringValue.begin(), stringValue.end(), [](char const c) { return '\n' == c || '\r' == c || '\0' == c || '\x1A' == c; }), stringValue.end()); diff --git a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c index 6dae312ac..d170beb95 100644 --- a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c +++ b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c @@ -26,6 +26,7 @@ #include "soh/SaveManager.h" #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/ShipUtils.h" typedef struct { s16 left; @@ -1053,20 +1054,27 @@ void FileChoose_UpdateRandomizer() { if (!SpoilerFileExists(CVarGetString(CVAR_GENERAL("SpoilerLog"), "")) && !CVarGetInteger(CVAR_RANDOMIZER_SETTING("DontGenerateSpoiler"), 0)) { CVarSetString(CVAR_GENERAL("SpoilerLog"), ""); + Randomizer_SetSpoilerLoaded(false); } if (CVarGetInteger(CVAR_GENERAL("RandomizerNewFileDropped"), 0) != 0 || !(Randomizer_IsSeedGenerated() || Randomizer_IsSpoilerLoaded()) && SpoilerFileExists(CVarGetString(CVAR_GENERAL("SpoilerLog"), "")) && !fileSelectSpoilerFileLoaded) { if (CVarGetInteger(CVAR_GENERAL("RandomizerNewFileDropped"), 0) != 0) { - CVarSetString(CVAR_GENERAL("SpoilerLog"), CVarGetString(CVAR_GENERAL("RandomizerDroppedFile"), "")); - Audio_PlayFanfare(NA_BGM_HORSE_GOAL); + if (SpoilerFileExists(CVarGetString(CVAR_GENERAL("RandomizerDroppedFile"), ""))) { + CVarSetString(CVAR_GENERAL("SpoilerLog"), CVarGetString(CVAR_GENERAL("RandomizerDroppedFile"), "")); + Sfx_PlaySfxCentered(NA_SE_SY_CORRECT_CHIME); + } else { + Sfx_PlaySfxCentered(NA_SE_SY_ERROR); + } } const char* fileLoc = CVarGetString(CVAR_GENERAL("SpoilerLog"), ""); CVarSetInteger(CVAR_GENERAL("RandomizerNewFileDropped"), 0); CVarSetString(CVAR_GENERAL("RandomizerDroppedFile"), ""); - Randomizer_ParseSpoiler(fileLoc); - fileSelectSpoilerFileLoaded = true; + if (!Ship_IsCStringEmpty(fileLoc)) { + Randomizer_ParseSpoiler(fileLoc); + fileSelectSpoilerFileLoaded = true; + } if (SpoilerFileExists(CVarGetString(CVAR_GENERAL("SpoilerLog"), "")) && CVarGetInteger(CVAR_RANDOMIZER_SETTING("DontGenerateSpoiler"), 0)) { From 52debea44b19b034822ee812958ff6c2c563cea3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Wed, 11 Jun 2025 21:41:54 +0000 Subject: [PATCH 28/67] Difficulty: CuccosToReturn (#5552) * Difficulty: CuccosToReturn Mirrors rando option * remove RSK_CUCCO_COUNT * revert forcing rando to at least 1 --- soh/soh/Enhancements/CuccosToReturn.cpp | 19 +++++++++++++++++++ .../Enhancements/randomizer/hook_handlers.cpp | 7 ------- .../randomizer/option_descriptions.cpp | 1 - .../Enhancements/randomizer/randomizerTypes.h | 1 - soh/soh/Enhancements/randomizer/settings.cpp | 11 +++-------- soh/soh/SohGui/SohMenuEnhancements.cpp | 4 ++++ 6 files changed, 26 insertions(+), 17 deletions(-) create mode 100644 soh/soh/Enhancements/CuccosToReturn.cpp diff --git a/soh/soh/Enhancements/CuccosToReturn.cpp b/soh/soh/Enhancements/CuccosToReturn.cpp new file mode 100644 index 000000000..317437216 --- /dev/null +++ b/soh/soh/Enhancements/CuccosToReturn.cpp @@ -0,0 +1,19 @@ +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include "soh/Enhancements/randomizer/context.h" + +extern "C" { +extern PlayState* gPlayState; +#include "src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.h" +} + +void RegisterCuccosToReturn() { + COND_VB_SHOULD(VB_SET_CUCCO_COUNT, CVarGetInteger(CVAR_ENHANCEMENT("CuccosToReturn"), 7) != 7, { + EnNiwLady* enNiwLady = va_arg(args, EnNiwLady*); + // Override starting Cucco count using setting value + enNiwLady->cuccosInPen = 7 - CVarGetInteger(CVAR_ENHANCEMENT("CuccosToReturn"), 7); + *should = false; + }); +} + +static RegisterShipInitFunc initFunc(RegisterCuccosToReturn, { CVAR_ENHANCEMENT("CuccosToReturn") }); diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index fca4dfae7..ea8ce1e12 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -925,13 +925,6 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l *should = Flags_GetRandomizerInf(RAND_INF_LEARNED_EPONA_SONG); break; } - case VB_SET_CUCCO_COUNT: { - EnNiwLady* enNiwLady = va_arg(args, EnNiwLady*); - // Override starting Cucco count using setting value - enNiwLady->cuccosInPen = 7 - RAND_GET_OPTION(RSK_CUCCO_COUNT); - *should = false; - break; - } case VB_KING_ZORA_THANK_CHILD: { // Allow turning in Ruto's letter even if you have already rescued her if (!Flags_GetEventChkInf(EVENTCHKINF_KING_ZORA_MOVED)) { diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index ff068943b..16c89a1c4 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -595,7 +595,6 @@ void Settings::CreateOptionDescriptions() { "\n" "Greg as Wildcard - Greg does not change logic, Greg helps obtain GBK, max number of " "rewards on slider does not change."; - mOptionDescriptions[RSK_CUCCO_COUNT] = "The amount of cuccos needed to claim the reward from Anju the Cucco Lady."; mOptionDescriptions[RSK_BIG_POE_COUNT] = "The Poe collector will give a reward for turning in this many Big Poes."; mOptionDescriptions[RSK_SKIP_CHILD_STEALTH] = "The crawlspace into Hyrule Castle goes straight to Zelda, skipping the guards."; diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index e5d82b18b..2e3d1f86e 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -5805,7 +5805,6 @@ typedef enum { RSK_STARTING_NUTS, RSK_FULL_WALLETS, RSK_SHUFFLE_CHEST_MINIGAME, - RSK_CUCCO_COUNT, RSK_BIG_POE_COUNT, RSK_SKIP_EPONA_RACE, RSK_COMPLETE_MASK_QUEST, diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 1c81e2d58..dbd29409f 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -269,7 +269,6 @@ void Settings::CreateOptions() { OPT_BOOL(RSK_SKIP_EPONA_RACE, "Skip Epona Race", {"Don't Skip", "Skip"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("SkipEponaRace"), mOptionDescriptions[RSK_SKIP_EPONA_RACE], WidgetType::Checkbox, RO_GENERIC_DONT_SKIP); OPT_BOOL(RSK_SKIP_SCARECROWS_SONG, "Skip Scarecrow's Song", CVAR_RANDOMIZER_SETTING("SkipScarecrowsSong"), mOptionDescriptions[RSK_SKIP_SCARECROWS_SONG]); OPT_U8(RSK_BIG_POE_COUNT, "Big Poe Target Count", {NumOpts(0, 10)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("BigPoeTargetCount"), mOptionDescriptions[RSK_BIG_POE_COUNT], WidgetType::Slider, 10); - OPT_U8(RSK_CUCCO_COUNT, "Cuccos to return", {NumOpts(0, 7)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("CuccosToReturn"), mOptionDescriptions[RSK_CUCCO_COUNT], WidgetType::Slider, 7); OPT_BOOL(RSK_COMPLETE_MASK_QUEST, "Complete Mask Quest", CVAR_RANDOMIZER_SETTING("CompleteMaskQuest"), mOptionDescriptions[RSK_COMPLETE_MASK_QUEST]); OPT_U8(RSK_GOSSIP_STONE_HINTS, "Gossip Stone Hints", {"No Hints", "Need Nothing", "Mask of Truth", "Stone of Agony"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("GossipStoneHints"), mOptionDescriptions[RSK_GOSSIP_STONE_HINTS], WidgetType::Combobox, RO_GOSSIP_STONES_NEED_NOTHING, false, IMFLAG_NONE); OPT_U8(RSK_HINT_CLARITY, "Hint Clarity", {"Obscure", "Ambiguous", "Clear"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("HintClarity"), mOptionDescriptions[RSK_HINT_CLARITY], WidgetType::Combobox, RO_HINT_CLARITY_CLEAR, true, IMFLAG_INDENT); @@ -1316,8 +1315,8 @@ void Settings::CreateOptions() { WidgetContainerType::TABLE); mOptionGroups[RSG_TIMESAVERS_IMGUI] = OptionGroup::SubGroup( "Timesavers", - { &mOptions[RSK_CUCCO_COUNT], &mOptions[RSK_BIG_POE_COUNT], &mOptions[RSK_SKIP_CHILD_ZELDA], - &mOptions[RSK_SKIP_EPONA_RACE], &mOptions[RSK_COMPLETE_MASK_QUEST], &mOptions[RSK_SKIP_SCARECROWS_SONG] }, + { &mOptions[RSK_BIG_POE_COUNT], &mOptions[RSK_SKIP_CHILD_ZELDA], &mOptions[RSK_SKIP_EPONA_RACE], + &mOptions[RSK_COMPLETE_MASK_QUEST], &mOptions[RSK_SKIP_SCARECROWS_SONG] }, WidgetContainerType::COLUMN); mOptionGroups[RSG_ITEM_POOL_HINTS_IMGUI] = OptionGroup::SubGroup("", { @@ -1582,7 +1581,6 @@ void Settings::CreateOptions() { &mOptions[RSK_SKIP_EPONA_RACE], &mOptions[RSK_SKIP_SCARECROWS_SONG], &mOptions[RSK_BIG_POE_COUNT], - &mOptions[RSK_CUCCO_COUNT], &mOptions[RSK_COMPLETE_MASK_QUEST], }); mOptionGroups[RSG_MISC] = OptionGroup("Miscellaneous Settings", @@ -2878,11 +2876,8 @@ void Context::FinalizeSettings(const std::set& excludedLocation if (mOptions[RSK_FISHSANITY].IsNot(RO_FISHSANITY_HYRULE_LOACH)) { mOptions[RSK_LOACH_HINT].Set(RO_GENERIC_OFF); } - - if (mOptions[RSK_CUCCO_COUNT].Is(0)) { - mOptions[RSK_CHICKENS_HINT].Set(RO_GENERIC_OFF); - } } + void Settings::ParseJson(nlohmann::json spoilerFileJson) { mContext->SetSeedString(spoilerFileJson["seed"].get()); mContext->SetSeed(spoilerFileJson["finalSeed"].get()); diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index feb36eebb..58f197512 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -1138,6 +1138,10 @@ void SohMenu::AddMenuEnhancements() { .CVar(CVAR_ENHANCEMENT("CuccoStayDurationMult")) .Options(IntSliderOptions().Min(1).Max(5).DefaultValue(1).Format("%dx").Tooltip( "Cuccos will stay in place longer after putting them down, by a multiple of the value of the slider.")); + AddWidget(path, "Cuccos Needed By Anju: %d", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("CuccosToReturn")) + .Options(IntSliderOptions().Min(0).Max(7).DefaultValue(7).Format("%d").Tooltip( + "The amount of cuccos needed to receive bottle from Anju the Cucco Lady.")); path.column = SECTION_COLUMN_3; AddWidget(path, "Enemies", WIDGET_SEPARATOR_TEXT); From c7e3e08f8df387c5545f06d247856de8446c4520 Mon Sep 17 00:00:00 2001 From: Pepper0ni <93387759+Pepper0ni@users.noreply.github.com> Date: Thu, 12 Jun 2025 21:23:42 +0100 Subject: [PATCH 29/67] Fix club moblins moving out of bounds and remove them from the no-clear-room list (#5569) --- soh/soh/Enhancements/enemyrandomizer.cpp | 4 +--- soh/src/overlays/actors/ovl_En_Mb/z_en_mb.c | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/soh/soh/Enhancements/enemyrandomizer.cpp b/soh/soh/Enhancements/enemyrandomizer.cpp index 682ef026c..227a84127 100644 --- a/soh/soh/Enhancements/enemyrandomizer.cpp +++ b/soh/soh/Enhancements/enemyrandomizer.cpp @@ -433,11 +433,9 @@ bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy) { // Shell Blade & Spike - Child Link can't kill these with sword or Deku Stick. // Arwing & Dark Link - Both go out of bounds way too easily, softlocking the player. // Wallmaster - Not easily visible, often makes players think they're softlocked and that there's no enemies left. - // Club Moblin - Many issues with them falling or placing out of bounds. Maybe fixable in the future? bool enemiesToExcludeClearRooms = enemy.id == ACTOR_EN_FZ || enemy.id == ACTOR_EN_VM || enemy.id == ACTOR_EN_SB || enemy.id == ACTOR_EN_NY || enemy.id == ACTOR_EN_CLEAR_TAG || - enemy.id == ACTOR_EN_WALLMAS || enemy.id == ACTOR_EN_TORCH2 || - enemy.id == ACTOR_EN_MB; + enemy.id == ACTOR_EN_WALLMAS || enemy.id == ACTOR_EN_TORCH2; // Bari - Spawns 3 more enemies, potentially extremely difficult in timed rooms. bool enemiesToExcludeTimedRooms = enemiesToExcludeClearRooms || enemy.id == ACTOR_EN_VALI; diff --git a/soh/src/overlays/actors/ovl_En_Mb/z_en_mb.c b/soh/src/overlays/actors/ovl_En_Mb/z_en_mb.c index 50ac7e11b..78f75dabd 100644 --- a/soh/src/overlays/actors/ovl_En_Mb/z_en_mb.c +++ b/soh/src/overlays/actors/ovl_En_Mb/z_en_mb.c @@ -303,7 +303,7 @@ void EnMb_Init(Actor* thisx, PlayState* play) { relYawFromPlayer = this->actor.world.rot.y - Math_Vec3f_Yaw(&this->actor.world.pos, &player->actor.world.pos); - if (ABS(relYawFromPlayer) > 0x4000) { + if (ABS(relYawFromPlayer) > 0x4000 && !CVarGetInteger(CVAR_ENHANCEMENT("RandomizedEnemies"), 0)) { this->actor.world.rot.y = thisx->world.rot.y + 0x8000; this->actor.shape.rot.y = thisx->world.rot.y; this->actor.world.pos.z = thisx->world.pos.z + 600.0f; From 9432b3420ba328c12aec285d901999d129728cfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Thu, 12 Jun 2025 20:23:47 +0000 Subject: [PATCH 30/67] tts: only announce timer at 10s intervals (#5559) * tts: only announce timer at 30s 1. reading out every second doesn't have enough time to even say more than a number 2. tts is hard to hear the rest of the game over while it's counting non stop * under a minute announce every 10s --- soh/soh/Enhancements/tts/tts.cpp | 39 +++++++++++++++----------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/soh/soh/Enhancements/tts/tts.cpp b/soh/soh/Enhancements/tts/tts.cpp index b8a43453f..978e5ca24 100644 --- a/soh/soh/Enhancements/tts/tts.cpp +++ b/soh/soh/Enhancements/tts/tts.cpp @@ -147,28 +147,25 @@ void RegisterOnInterfaceUpdateHook() { timer = gSaveContext.subTimerSeconds; } - if (timer > 0) { - if (timer > prevTimer || (timer % 30 == 0 && prevTimer != timer)) { - uint32_t minutes = timer / 60; - uint32_t seconds = timer % 60; - char* announceBuf = ttsAnnounceBuf; - char arg[8]; // at least big enough where no s8 string will overflow - if (minutes > 0) { - snprintf(arg, sizeof(arg), "%d", minutes); - auto translation = GetParameritizedText((minutes > 1) ? "minutes_plural" : "minutes_singular", - TEXT_BANK_MISC, arg); - announceBuf += snprintf(announceBuf, sizeof(ttsAnnounceBuf), "%s ", translation.c_str()); - } - if (seconds > 0) { - snprintf(arg, sizeof(arg), "%d", seconds); - auto translation = GetParameritizedText((seconds > 1) ? "seconds_plural" : "seconds_singular", - TEXT_BANK_MISC, arg); - announceBuf += snprintf(announceBuf, sizeof(ttsAnnounceBuf), "%s", translation.c_str()); - } - assert(announceBuf < ttsAnnounceBuf + sizeof(ttsAnnounceBuf)); - SpeechSynthesizer::Instance->Speak(ttsAnnounceBuf, GetLanguageCode()); - prevTimer = timer; + if (timer > 0 && timer % (timer < 60 ? 10 : 30) == 0 && timer != prevTimer) { + uint32_t minutes = timer / 60; + uint32_t seconds = timer % 60; + char* announceBuf = ttsAnnounceBuf; + char arg[8]; // at least big enough where no s8 string will overflow + if (minutes > 0) { + snprintf(arg, sizeof(arg), "%d", minutes); + auto translation = + GetParameritizedText((minutes > 1) ? "minutes_plural" : "minutes_singular", TEXT_BANK_MISC, arg); + announceBuf += snprintf(announceBuf, sizeof(ttsAnnounceBuf), "%s ", translation.c_str()); } + if (seconds > 0) { + snprintf(arg, sizeof(arg), "%d", seconds); + auto translation = + GetParameritizedText((seconds > 1) ? "seconds_plural" : "seconds_singular", TEXT_BANK_MISC, arg); + announceBuf += snprintf(announceBuf, sizeof(ttsAnnounceBuf), "%s", translation.c_str()); + } + assert(announceBuf < ttsAnnounceBuf + sizeof(ttsAnnounceBuf)); + SpeechSynthesizer::Instance->Speak(ttsAnnounceBuf, GetLanguageCode()); } prevTimer = timer; From bf3add7a7228f6ccc067d9a80b47c511c1af2cd0 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Thu, 12 Jun 2025 13:24:19 -0700 Subject: [PATCH 31/67] Re-add `ShipInit::InitAll()` to the end of `applyPreset()`. (#5574) --- soh/soh/Enhancements/Presets/Presets.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/soh/soh/Enhancements/Presets/Presets.cpp b/soh/soh/Enhancements/Presets/Presets.cpp index d50b45360..b84cb95ca 100644 --- a/soh/soh/Enhancements/Presets/Presets.cpp +++ b/soh/soh/Enhancements/Presets/Presets.cpp @@ -110,6 +110,7 @@ void applyPreset(std::string presetName, std::vector includeSecti } } } + ShipInit::InitAll(); } void DrawPresetSelector(std::vector includeSections, std::string presetLoc, bool disabled) { From 62c03abfd47fb57a3b137687555c38ebfd592a1e Mon Sep 17 00:00:00 2001 From: Jason <125489486+UchuuJ@users.noreply.github.com> Date: Thu, 12 Jun 2025 21:39:21 +0100 Subject: [PATCH 32/67] Updates docs/MODDING.md example to reflect current codebase (#5558) * Update docs/MODDING.md change example to reflect current codebase * Changes to MODDING.md (#5558): fixes slight typo * Changes to MODDING.md (#5558): fix typo and remove uneeded explanation that minimum and maximum are floats --- docs/MODDING.md | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/docs/MODDING.md b/docs/MODDING.md index 1f4f4b607..d410a0d06 100644 --- a/docs/MODDING.md +++ b/docs/MODDING.md @@ -41,15 +41,28 @@ You can name your branch whatever you want, but it's recommended to name it some The limit is your imagination. You can add new features, fix bugs, add new mods, or even change the way the game works. We will demonstrate this by creating a mod that changes the speed of the day/night cycle. -Let's being by finding where the time is updated. Thankfully in the save editor we have a slider already hooked up to the time of day so we can check there for reference. The save editor file is at `soh/soh/Enhancements/debugger/debugSaveEditor.cpp`, if we do a quick search within that file for time we will find the following at line 400: +Let's begin by finding where the time is updated. Thankfully in the save editor we have a slider already hooked up to the time of day so we can check there for reference. The save editor file is at `soh/soh/Enhancements/debugger/debugSaveEditor.cpp`, if we do a quick search within that file for time we will find the following at around line 217: ```cpp -const uint16_t dayTimeMin = 0; -const uint16_t dayTimeMax = 0xFFFF; -ImGui::SliderScalar("Time", ImGuiDataType_U16, &gSaveContext.dayTime, &dayTimeMin, &dayTimeMax); + SliderInt("Time", (int32_t*)&gSaveContext.dayTime, intSliderOptionsBase.Min(0).Max(0xFFFF).Tooltip("Time of day")); + if (Button("Dawn", buttonOptionsBase)) { + gSaveContext.dayTime = 0x4000; + } + ImGui::SameLine(); + if (Button("Noon", buttonOptionsBase)) { + gSaveContext.dayTime = 0x8000; + } + ImGui::SameLine(); + if (Button("Sunset", buttonOptionsBase)) { + gSaveContext.dayTime = 0xC001; + } + ImGui::SameLine(); + if (Button("Midnight", buttonOptionsBase)) { + gSaveContext.dayTime = 0; + } ``` -So this tells us that `gSaveContext.dayTime` is what we're looking for. Let's now do a global search for this to see if we can find where it is updated. We find the following in `soh/src/code/z_kankyo.c` line 925: +So this tells us that `gSaveContext.dayTime` is what we're looking for. Let's now do a global search for this to see if we can find where it is updated. We find the following in `soh/src/code/z_kankyo.c` around line 925: ```cpp if (IS_DAY || gTimeIncrement >= 0x190) { @@ -71,16 +84,19 @@ if (IS_DAY || gTimeIncrement >= 0x190) { } ``` -Rebuild the game and launch it, then load a save file. You should see that the time of day is now moving much faster. Terrific! While we could wrap this up and call it a day, we could make this user configurable by making a few more changes. I think a slider would be good for this, there's a slider in the cheat menu that we can use as a reference. Let's find it in `soh/soh/SohMenuBar.cpp` around line 1120: +Rebuild the game and launch it, then load a save file. You should see that the time of day is now moving much faster. Terrific! While we could wrap this up and call it a day, we could make this user configurable by making a few more changes. I think a slider would be good for this, there's a slider in the cheat menu that we can use as a reference. Let's find it in `soh/soh/SohGui/SohMenuEnhancements.cpp` around line 1565: ```cpp -UIWidgets::EnhancementSliderFloat("Hookshot Reach Multiplier: %.1fx", "##gCheatHookshotReachMultiplier", "gCheatHookshotReachMultiplier", 1.0f, 5.0f, "", 1.0f, false); + AddWidget(path, "Hookshot Reach Multiplier: %.2fx", WIDGET_CVAR_SLIDER_FLOAT) + .CVar(CVAR_CHEAT("HookshotReachMultiplier")) + .Options(FloatSliderOptions().Format("%.2f").Min(1.0f).Max(5.0f)); ``` - -The float values being passed in here are `minimum`, `maximum`, and `default` respectively. We'll make our minimum 0.2 to allow it to move slower, and our maximum 5.0 to allow it to move up to 5x faster. We'll also set the default to 1.0 so that it doesn't change the behavior by default. Copy this line and paste it below, then make the relevant changes: +This adds a `Widget` which sets a CVar, which then sets the options of the slider. We'll make our minimum 0.2 to allow it to move slower, and our maximum 5.0 to allow it to move up to 5x faster. We'll also set the default to 1.0 so that it doesn't change the behavior by default. Copy this line and paste it below, then make the relevant changes: ```cpp -UIWidgets::EnhancementSliderFloat("Time Multiplier: %.1fx", "##gCheatTimeMultiplier", "gCheatTimeMultiplier", 0.2f, 5.0f, "", 1.0f, false); + AddWidget(path, "Time Multiplier: %.2fx", WIDGET_CVAR_SLIDER_FLOAT) + .CVar(CVAR_CHEAT("TimeOfDayMultiplier")) + .Options(FloatSliderOptions().Format("%.2f").Min(0.2f).Max(5.0f).DefaultValue(1.0f)); ``` Now we need to replace our hard coded values with the new variable. We can do this by replacing the `10` with a cvar call @@ -88,10 +104,10 @@ Now we need to replace our hard coded values with the new variable. We can do th ```diff if (IS_DAY || gTimeIncrement >= 0x190) { - gSaveContext.dayTime += gTimeIncrement * 10; -+ gSaveContext.dayTime += gTimeIncrement * CVarGetFloat("gCheatTimeMultiplier", 1.0f); ++ gSaveContext.dayTime += gTimeIncrement * CVarGetFloat(CVAR_CHEAT("TimeOfDayMultiplier"),1.0f); } else { - gSaveContext.dayTime += gTimeIncrement * 2 * 10; -+ gSaveContext.dayTime += gTimeIncrement * 2 * CVarGetFloat("gCheatTimeMultiplier", 1.0f); ++ gSaveContext.dayTime += gTimeIncrement * 2 * CVarGetFloat(CVAR_CHEAT("TimeOfDayMultiplier"),1.0f); } ``` From c2b6942282b2780ea474e239a127ba80ce6cecca Mon Sep 17 00:00:00 2001 From: Malkierian Date: Thu, 12 Jun 2025 17:57:29 -0700 Subject: [PATCH 33/67] clang --- soh/soh/Enhancements/randomizer/3drando/fill.hpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.hpp b/soh/soh/Enhancements/randomizer/3drando/fill.hpp index 75c378095..0e032985e 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.hpp @@ -66,8 +66,7 @@ void ProcessRegion(Region* region, GetAccessibleLocationsStruct& gals, Randomize bool stopOnBeatable = false, bool addToPlaythrough = false); std::vector ReachabilitySearch(const std::vector& allowedLocations, - RandomizerGet ignore = RG_NONE, - bool calculatingAvailableChecks = false, + RandomizerGet ignore = RG_NONE, bool calculatingAvailableChecks = false, RandomizerRegion startingRegion = RR_ROOT); void GeneratePlaythrough(); From cd32181415c748bd42e010727a02f436e9dfa3ad Mon Sep 17 00:00:00 2001 From: Malkierian Date: Thu, 12 Jun 2025 22:41:19 -0700 Subject: [PATCH 34/67] Fix incorrect merge conflict resolution. --- soh/soh/Enhancements/enemyrandomizer.cpp | 7 ++++++- soh/soh/Enhancements/enemyrandomizer.h | 9 --------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/soh/soh/Enhancements/enemyrandomizer.cpp b/soh/soh/Enhancements/enemyrandomizer.cpp index 2191563f5..2e15a9ed9 100644 --- a/soh/soh/Enhancements/enemyrandomizer.cpp +++ b/soh/soh/Enhancements/enemyrandomizer.cpp @@ -18,9 +18,14 @@ extern "C" { #define CVAR_ENEMY_RANDOMIZER_DEFAULT ENEMY_RANDOMIZER_OFF #define CVAR_ENEMY_RANDOMIZER_VALUE CVarGetInteger(CVAR_ENEMY_RANDOMIZER_NAME, CVAR_ENEMY_RANDOMIZER_DEFAULT) +typedef struct EnemyEntry { + int16_t id; + int16_t params; +} EnemyEntry; + bool IsEnemyFoundToRandomize(int16_t sceneNum, int8_t roomNum, int16_t actorId, int16_t params, float posX); bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy); -EnemyEntry GetRandomizedEnemyEntry(uint32_t seed); +EnemyEntry GetRandomizedEnemyEntry(uint32_t seed, PlayState* play); const char* enemyCVarList[RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE] = { CVAR_ENHANCEMENT("RandomizedEnemyList.Anubis"), CVAR_ENHANCEMENT("RandomizedEnemyList.Armos"), diff --git a/soh/soh/Enhancements/enemyrandomizer.h b/soh/soh/Enhancements/enemyrandomizer.h index cf01eec03..9220f2db0 100644 --- a/soh/soh/Enhancements/enemyrandomizer.h +++ b/soh/soh/Enhancements/enemyrandomizer.h @@ -3,17 +3,8 @@ #include #include "item-tables/ItemTableTypes.h" -typedef struct EnemyEntry { - int16_t id; - int16_t params; -} EnemyEntry; - #define RANDOMIZED_ENEMY_SPAWN_TABLE_SIZE 52 -bool IsEnemyFoundToRandomize(int16_t sceneNum, int8_t roomNum, int16_t actorId, int16_t params, float posX); -bool IsEnemyAllowedToSpawn(int16_t sceneNum, int8_t roomNum, EnemyEntry enemy); -EnemyEntry GetRandomizedEnemyEntry(uint32_t seed, PlayState* play); - extern const char* enemyCVarList[]; extern const char* enemyNameList[]; extern void GetSelectedEnemies(); From 213ea742eb7dac6111f63ee43994e1106334cafd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Sat, 14 Jun 2025 05:43:25 +0000 Subject: [PATCH 35/67] Gerudo Guards: offer to throw you in jail (#5390) * Gerudo Guards: offer to throw you in jail Necessary for logic to use being captured in routing * don't intercept Ge3 * TODO_TRANSLATE * cleanup --- .../custom-message/CustomMessageTypes.h | 1 + .../vanilla-behavior/GIVanillaBehavior.h | 8 ++++++ .../Enhancements/randomizer/hook_handlers.cpp | 11 +++++++- soh/soh/OTRGlobals.cpp | 10 ++++--- soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c | 27 ++++++++++--------- 5 files changed, 40 insertions(+), 17 deletions(-) diff --git a/soh/soh/Enhancements/custom-message/CustomMessageTypes.h b/soh/soh/Enhancements/custom-message/CustomMessageTypes.h index 3bcbaf7b0..b5bc0fd6e 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageTypes.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageTypes.h @@ -163,6 +163,7 @@ typedef enum { TEXT_ANJU_ROUND_THEM_UP_OR_YOULL_PAY = 0x503C, TEXT_ANJU_DONT_TEASE_MY_CUCCOS = 0x503D, TEXT_BIG_POE_COLLECTED_RANDO = 0x5090, + TEXT_GERUDO_GUARD_FRIENDLY = 0x6005, TEXT_HBA_NOT_ON_HORSE = 0x603F, TEXT_HBA_INITIAL_EXPLAINATION = 0x6040, TEXT_HBA_WANT_TO_TRY_AGAIN_YES_NO = 0x6041, diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index 5159118b1..e76a806ab 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -575,6 +575,14 @@ typedef enum { // - None VB_GANON_HEAL_BEFORE_FIGHT, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnGe2` + VB_GERUDO_GUARD_SET_ACTION_AFTER_TALK, + // #### `result` // See logic in // ```c diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index ea8ce1e12..994e0fba6 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -46,6 +46,7 @@ extern "C" { #include "src/overlays/actors/ovl_En_Hy/z_en_hy.h" #include "src/overlays/actors/ovl_En_Bom_Bowl_Pit/z_en_bom_bowl_pit.h" #include "src/overlays/actors/ovl_En_Ge1/z_en_ge1.h" +#include "src/overlays/actors/ovl_En_Ge2/z_en_ge2.h" #include "src/overlays/actors/ovl_En_Ds/z_en_ds.h" #include "src/overlays/actors/ovl_En_Gm/z_en_gm.h" #include "src/overlays/actors/ovl_En_Js/z_en_js.h" @@ -55,7 +56,6 @@ extern "C" { #include "src/overlays/actors/ovl_En_Xc/z_en_xc.h" #include "src/overlays/actors/ovl_Fishing/z_fishing.h" #include "src/overlays/actors/ovl_En_Mk/z_en_mk.h" -#include "src/overlays/actors/ovl_En_Ge1/z_en_ge1.h" #include "draw.h" extern SaveContext gSaveContext; @@ -69,6 +69,8 @@ extern void EnMk_Wait(EnMk* enMk, PlayState* play); extern void func_80ABA778(EnNiwLady* enNiwLady, PlayState* play); extern void EnGe1_Wait_Archery(EnGe1* enGe1, PlayState* play); extern void EnGe1_SetAnimationIdle(EnGe1* enGe1); +extern void EnGe1_SetAnimationIdle(EnGe1* enGe1); +extern void EnGe2_SetupCapturePlayer(EnGe2* enGe2, PlayState* play); } bool LocMatchesQuest(Rando::Location loc) { @@ -1435,6 +1437,13 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } break; } + case VB_GERUDO_GUARD_SET_ACTION_AFTER_TALK: + if (gPlayState->msgCtx.choiceIndex == 0) { + EnGe2* enGe2 = va_arg(args, EnGe2*); + EnGe2_SetupCapturePlayer(enGe2, gPlayState); + *should = false; + } + break; case VB_GERUDOS_BE_FRIENDLY: { *should = CHECK_QUEST_ITEM(QUEST_GERUDO_CARD); break; diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index a2135006a..9ac03b48e 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -2236,7 +2236,7 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) { (Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) == RO_GOSSIP_STONES_NEED_STONE && CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)))) { - Actor* stone = GET_PLAYER(play)->talkActor; + Actor* stone = player->talkActor; RandomizerHint stoneHint = RH_NONE; s16 hintParams = stone->params & 0xFF; @@ -2294,7 +2294,7 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) { (RandomizerInf)((textId - TEXT_SHOP_ITEM_RANDOM_CONFIRM) + RAND_INF_SHOP_ITEMS_KF_SHOP_ITEM_1)); messageEntry = OTRGlobals::Instance->gRandomizer->GetMerchantMessage(rc, TEXT_SHOP_ITEM_RANDOM_CONFIRM); } else if (textId == TEXT_SCRUB_RANDOM) { - EnDns* enDns = (EnDns*)GET_PLAYER(play)->talkActor; + EnDns* enDns = (EnDns*)player->talkActor; RandomizerCheck rc = OTRGlobals::Instance->gRandomizer->GetCheckFromRandomizerInf( (RandomizerInf)enDns->sohScrubIdentity.randomizerInf); messageEntry = OTRGlobals::Instance->gRandomizer->GetMerchantMessage( @@ -2344,7 +2344,7 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) { messageEntry = CustomMessageManager::Instance->RetrieveMessage(Randomizer::merchantMessageTableID, textId, MF_AUTO_FORMAT); } else if (textId == TEXT_SKULLTULA_PEOPLE_IM_CURSED) { - actorParams = GET_PLAYER(play)->talkActor->params; + actorParams = player->talkActor->params; if (actorParams == 1 && ctx->GetOption(RSK_KAK_10_SKULLS_HINT)) { messageEntry = ctx->GetHint(RH_KAK_10_SKULLS_HINT)->GetHintMessage(MF_AUTO_FORMAT); } else if (actorParams == 2 && ctx->GetOption(RSK_KAK_20_SKULLS_HINT)) { @@ -2443,6 +2443,10 @@ extern "C" int CustomMessage_RetrieveIfExists(PlayState* play) { } else if (textId == TEXT_BIG_POE_COLLECTED_RANDO) { messageEntry = CustomMessageManager::Instance->RetrieveMessage(customMessageTableID, textId, MF_AUTO_FORMAT); + } else if (textId == TEXT_GERUDO_GUARD_FRIENDLY && player->talkActor->id == ACTOR_EN_GE2) { + // TODO_TRANSLATE Translate into french and german + messageEntry = CustomMessage("Want me to throw you in jail?&\x1B#Yes please&No thanks#", { QM_GREEN }); + messageEntry.AutoFormat(); } } if (textId == TEXT_GS_NO_FREEZE || textId == TEXT_GS_FREEZE) { diff --git a/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c b/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c index 89e846a23..776a241b1 100644 --- a/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c +++ b/soh/src/overlays/actors/ovl_En_Ge2/z_en_ge2.c @@ -439,20 +439,21 @@ void EnGe2_LookAtPlayer(EnGe2* this, PlayState* play) { void EnGe2_SetActionAfterTalk(EnGe2* this, PlayState* play) { if (Actor_TextboxIsClosing(&this->actor, play)) { - - switch (this->actor.params & 0xFF) { - case GE2_TYPE_PATROLLING: - EnGe2_ChangeAction(this, GE2_ACTION_ABOUTTURN); - break; - case GE2_TYPE_STATIONARY: - EnGe2_ChangeAction(this, GE2_ACTION_STAND); - break; - case GE2_TYPE_GERUDO_CARD_GIVER: - this->actionFunc = EnGe2_WaitLookAtPlayer; - break; + if (GameInteractor_Should(VB_GERUDO_GUARD_SET_ACTION_AFTER_TALK, true, this)) { + switch (this->actor.params & 0xFF) { + case GE2_TYPE_PATROLLING: + EnGe2_ChangeAction(this, GE2_ACTION_ABOUTTURN); + break; + case GE2_TYPE_STATIONARY: + EnGe2_ChangeAction(this, GE2_ACTION_STAND); + break; + case GE2_TYPE_GERUDO_CARD_GIVER: + this->actionFunc = EnGe2_WaitLookAtPlayer; + break; + } + this->actor.update = EnGe2_UpdateFriendly; + this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; } - this->actor.update = EnGe2_UpdateFriendly; - this->actor.flags &= ~ACTOR_FLAG_TALK_OFFER_AUTO_ACCEPTED; } EnGe2_TurnToFacePlayer(this, play); } From 330e64180cb3cc8c94b65c434717aa2fa7b32911 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Sun, 15 Jun 2025 17:19:58 +0000 Subject: [PATCH 36/67] Difficulty: SwitchTimerMultiplier (#5555) * Difficulty: FireTimerMultiplier Introduces slider to adjust timer on fire walls resetting switches * rename, add more timers * also shadow trial, dampe race, deku water * avoid decrementing timer to 0, which with BgMizu can cause timer to go below 0 & break * gtg eye statue * also scale torches * tooltip * Limit difficulty: torches stop at -3 & shadow temple torch puzzle stops at -4 * put timer condition as should when convenient --- .../Enhancements/SwitchTimerMultiplier.cpp | 29 +++++++++++++++++++ .../vanilla-behavior/GIVanillaBehavior.h | 9 ++++++ soh/soh/SohGui/SohMenuEnhancements.cpp | 5 ++++ .../ovl_Bg_Gnd_Darkmeiro/z_bg_gnd_darkmeiro.c | 9 ++++-- .../ovl_Bg_Hidan_Curtain/z_bg_hidan_curtain.c | 6 +++- .../ovl_Bg_Hidan_Fwbig/z_bg_hidan_fwbig.c | 4 ++- .../ovl_Bg_Menkuri_Eye/z_bg_menkuri_eye.c | 4 ++- .../ovl_Bg_Mizu_Shutter/z_bg_mizu_shutter.c | 5 +++- .../ovl_Bg_Relay_Objects/z_bg_relay_objects.c | 5 ++-- .../actors/ovl_Bg_Ydan_Hasi/z_bg_ydan_hasi.c | 7 +++-- .../actors/ovl_En_Siofuki/z_en_siofuki.c | 6 +++- .../actors/ovl_Obj_Syokudai/z_obj_syokudai.c | 3 +- 12 files changed, 80 insertions(+), 12 deletions(-) create mode 100644 soh/soh/Enhancements/SwitchTimerMultiplier.cpp diff --git a/soh/soh/Enhancements/SwitchTimerMultiplier.cpp b/soh/soh/Enhancements/SwitchTimerMultiplier.cpp new file mode 100644 index 000000000..94982837d --- /dev/null +++ b/soh/soh/Enhancements/SwitchTimerMultiplier.cpp @@ -0,0 +1,29 @@ +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +extern PlayState* gPlayState; +} + +void RegisterSwitchTimerMultiplier() { + COND_VB_SHOULD(VB_SWITCH_TIMER_TICK, CVarGetInteger(CVAR_ENHANCEMENT("SwitchTimerMultiplier"), 0) != 0, { + int multiplier = CVarGetInteger(CVAR_ENHANCEMENT("SwitchTimerMultiplier"), 0); + if (multiplier != 0) { + Actor* actor = va_arg(args, Actor*); + if (multiplier < -3 && actor->id == ACTOR_OBJ_SYOKUDAI) { + multiplier = -3; + } else if (multiplier < -4 && actor->id == ACTOR_BG_GND_DARKMEIRO) { + multiplier = -4; + } + + if (multiplier > 0 && gPlayState->gameplayFrames % (multiplier + 1) != 0) { + *should = false; + } else if (gPlayState->gameplayFrames % (6 + multiplier) == 0) { + s16* timer = va_arg(args, s16*); + *timer -= *timer > 1; + } + } + }); +} + +static RegisterShipInitFunc initFunc(RegisterSwitchTimerMultiplier, { CVAR_ENHANCEMENT("SwitchTimerMultiplier") }); diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index e76a806ab..eb7bf6e23 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -2000,6 +2000,15 @@ typedef enum { // - `*ShotSun` VB_SPAWN_SONG_FAIRY, + // #### `result` + // ```c + // varies, never set should to true + // ``` + // #### `args` + // - `*Actor` + // - `*s16` - timer value + VB_SWITCH_TIMER_TICK, + // #### `result` // ```c // (this->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR) && (this->heldActor != NULL) && diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index 58f197512..15cb81f9d 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -1123,6 +1123,11 @@ void SohMenu::AddMenuEnhancements() { .Options(CheckboxOptions().Tooltip("Dying will delete your file.\n\n" ICON_FA_EXCLAMATION_TRIANGLE " WARNING " ICON_FA_EXCLAMATION_TRIANGLE "\nTHIS IS NOT REVERSIBLE!\nUSE AT YOUR OWN RISK!")); + AddWidget(path, "Switch Timer Multiplier", WIDGET_CVAR_SLIDER_INT) + .CVar(CVAR_ENHANCEMENT("SwitchTimerMultiplier")) + .Options(IntSliderOptions().Min(-5).Max(5).DefaultValue(0).Format("%+d").Tooltip( + "-5 will be half as much time, +5 will be 6x as much time. Affects timed switches, torches, GTG statue " + "eyes, & doors in race with Dampe.")); AddWidget(path, "Always Win Goron Pot", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("GoronPot")) .Options(CheckboxOptions().Tooltip("Always get the Heart Piece/Purple Rupee from the Spinning Goron Pot.")); diff --git a/soh/src/overlays/actors/ovl_Bg_Gnd_Darkmeiro/z_bg_gnd_darkmeiro.c b/soh/src/overlays/actors/ovl_Bg_Gnd_Darkmeiro/z_bg_gnd_darkmeiro.c index 620bf18ab..4ade8918c 100644 --- a/soh/src/overlays/actors/ovl_Bg_Gnd_Darkmeiro/z_bg_gnd_darkmeiro.c +++ b/soh/src/overlays/actors/ovl_Bg_Gnd_Darkmeiro/z_bg_gnd_darkmeiro.c @@ -6,6 +6,7 @@ #include "z_bg_gnd_darkmeiro.h" #include "objects/object_demo_kekkai/object_demo_kekkai.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) @@ -115,7 +116,9 @@ void BgGndDarkmeiro_UpdateBlockTimer(BgGndDarkmeiro* this, PlayState* play) { if (Flags_GetSwitch(play, ((this->dyna.actor.params >> 8) & 0x3F) + 1)) { if (this->actionFlags & 4) { if (this->timer1 > 0) { - this->timer1--; + if (GameInteractor_Should(VB_SWITCH_TIMER_TICK, true, this, &this->timer1)) { + this->timer1--; + } } else { Flags_UnsetSwitch(play, ((this->dyna.actor.params >> 8) & 0x3F) + 1); this->actionFlags &= ~4; @@ -131,7 +134,9 @@ void BgGndDarkmeiro_UpdateBlockTimer(BgGndDarkmeiro* this, PlayState* play) { if (Flags_GetSwitch(play, ((this->dyna.actor.params >> 8) & 0x3F) + 2)) { if (this->actionFlags & 8) { if (this->timer2 > 0) { - this->timer2--; + if (GameInteractor_Should(VB_SWITCH_TIMER_TICK, true, &this->timer2)) { + this->timer2--; + } } else { Flags_UnsetSwitch(play, ((this->dyna.actor.params >> 8) & 0x3F) + 2); this->actionFlags &= ~8; diff --git a/soh/src/overlays/actors/ovl_Bg_Hidan_Curtain/z_bg_hidan_curtain.c b/soh/src/overlays/actors/ovl_Bg_Hidan_Curtain/z_bg_hidan_curtain.c index d818bf03e..de1578b24 100644 --- a/soh/src/overlays/actors/ovl_Bg_Hidan_Curtain/z_bg_hidan_curtain.c +++ b/soh/src/overlays/actors/ovl_Bg_Hidan_Curtain/z_bg_hidan_curtain.c @@ -6,6 +6,7 @@ #include "z_bg_hidan_curtain.h" #include "objects/gameplay_keep/gameplay_keep.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED @@ -191,7 +192,10 @@ void BgHidanCurtain_TurnOff(BgHidanCurtain* this, PlayState* play) { } void BgHidanCurtain_WaitForTimer(BgHidanCurtain* this, PlayState* play) { - DECR(this->timer); + if (GameInteractor_Should(VB_SWITCH_TIMER_TICK, true, this, &this->timer)) { + DECR(this->timer); + } + if (this->timer == 0) { this->actionFunc = BgHidanCurtain_TurnOn; } diff --git a/soh/src/overlays/actors/ovl_Bg_Hidan_Fwbig/z_bg_hidan_fwbig.c b/soh/src/overlays/actors/ovl_Bg_Hidan_Fwbig/z_bg_hidan_fwbig.c index 2caf4183d..3d46f41c5 100644 --- a/soh/src/overlays/actors/ovl_Bg_Hidan_Fwbig/z_bg_hidan_fwbig.c +++ b/soh/src/overlays/actors/ovl_Bg_Hidan_Fwbig/z_bg_hidan_fwbig.c @@ -8,6 +8,7 @@ #include "z_bg_hidan_fwbig.h" #include "objects/gameplay_keep/gameplay_keep.h" #include "objects/object_hidan_objects/object_hidan_objects.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED @@ -165,9 +166,10 @@ void BgHidanFwbig_Lower(BgHidanFwbig* this, PlayState* play) { } void BgHidanFwbig_WaitForTimer(BgHidanFwbig* this, PlayState* play) { - if (this->timer != 0) { + if (GameInteractor_Should(VB_SWITCH_TIMER_TICK, this->timer != 0, this, &this->timer)) { this->timer--; } + if (this->timer == 0) { this->actionFunc = BgHidanFwbig_Rise; } diff --git a/soh/src/overlays/actors/ovl_Bg_Menkuri_Eye/z_bg_menkuri_eye.c b/soh/src/overlays/actors/ovl_Bg_Menkuri_Eye/z_bg_menkuri_eye.c index 981e13839..20851b200 100644 --- a/soh/src/overlays/actors/ovl_Bg_Menkuri_Eye/z_bg_menkuri_eye.c +++ b/soh/src/overlays/actors/ovl_Bg_Menkuri_Eye/z_bg_menkuri_eye.c @@ -6,6 +6,7 @@ #include "z_bg_menkuri_eye.h" #include "objects/object_menkuri_objects/object_menkuri_objects.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS ACTOR_FLAG_DRAW_CULLING_DISABLED @@ -90,7 +91,8 @@ void BgMenkuriEye_Update(Actor* thisx, PlayState* play) { if (!Flags_GetSwitch(play, this->actor.params)) { if (this->framesUntilDisable != -1) { - if (this->framesUntilDisable != 0) { + if (GameInteractor_Should(VB_SWITCH_TIMER_TICK, this->framesUntilDisable != 0, this, + &this->framesUntilDisable)) { this->framesUntilDisable -= 1; } if (this->framesUntilDisable == 0) { diff --git a/soh/src/overlays/actors/ovl_Bg_Mizu_Shutter/z_bg_mizu_shutter.c b/soh/src/overlays/actors/ovl_Bg_Mizu_Shutter/z_bg_mizu_shutter.c index ffa56a074..19985b2ce 100644 --- a/soh/src/overlays/actors/ovl_Bg_Mizu_Shutter/z_bg_mizu_shutter.c +++ b/soh/src/overlays/actors/ovl_Bg_Mizu_Shutter/z_bg_mizu_shutter.c @@ -1,5 +1,6 @@ #include "z_bg_mizu_shutter.h" #include "objects/object_mizu_objects/object_mizu_objects.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED @@ -137,7 +138,9 @@ void BgMizuShutter_Move(BgMizuShutter* this, PlayState* play) { void BgMizuShutter_WaitForTimer(BgMizuShutter* this, PlayState* play) { if (this->timerMax != 0x3F * 20) { - this->timer--; + if (GameInteractor_Should(VB_SWITCH_TIMER_TICK, true, this, &this->timer)) { + this->timer--; + } func_8002F994(&this->dyna.actor, this->timer); if (this->timer == 0) { Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_METALDOOR_CLOSE); diff --git a/soh/src/overlays/actors/ovl_Bg_Relay_Objects/z_bg_relay_objects.c b/soh/src/overlays/actors/ovl_Bg_Relay_Objects/z_bg_relay_objects.c index f7b663cf9..40887b202 100644 --- a/soh/src/overlays/actors/ovl_Bg_Relay_Objects/z_bg_relay_objects.c +++ b/soh/src/overlays/actors/ovl_Bg_Relay_Objects/z_bg_relay_objects.c @@ -6,6 +6,7 @@ #include "z_bg_relay_objects.h" #include "objects/object_relay_objects/object_relay_objects.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS ACTOR_FLAG_UPDATE_CULLING_DISABLED @@ -133,7 +134,7 @@ void func_808A90F4(BgRelayObjects* this, PlayState* play) { void func_808A91AC(BgRelayObjects* this, PlayState* play) { if (this->unk_169 != 5) { - if (this->timer != 0) { + if (GameInteractor_Should(VB_SWITCH_TIMER_TICK, this->timer != 0, this, &this->timer)) { this->timer--; } func_8002F994(&this->dyna.actor, this->timer); @@ -168,7 +169,7 @@ void BgRelayObjects_DoNothing(BgRelayObjects* this, PlayState* play) { } void func_808A932C(BgRelayObjects* this, PlayState* play) { - if (this->timer != 0) { + if (GameInteractor_Should(VB_SWITCH_TIMER_TICK, this->timer != 0, &this->timer)) { this->timer--; } if (this->timer == 0) { diff --git a/soh/src/overlays/actors/ovl_Bg_Ydan_Hasi/z_bg_ydan_hasi.c b/soh/src/overlays/actors/ovl_Bg_Ydan_Hasi/z_bg_ydan_hasi.c index 4c8ca0050..6715d140c 100644 --- a/soh/src/overlays/actors/ovl_Bg_Ydan_Hasi/z_bg_ydan_hasi.c +++ b/soh/src/overlays/actors/ovl_Bg_Ydan_Hasi/z_bg_ydan_hasi.c @@ -6,6 +6,7 @@ #include "z_bg_ydan_hasi.h" #include "objects/object_ydan_objects/object_ydan_objects.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) @@ -126,9 +127,10 @@ void BgYdanHasi_MoveWater(BgYdanHasi* this, PlayState* play) { } void BgYdanHasi_DecWaterTimer(BgYdanHasi* this, PlayState* play) { - if (this->timer != 0) { + if (GameInteractor_Should(VB_SWITCH_TIMER_TICK, this->timer != 0, this, &this->timer)) { this->timer--; } + func_8002F994(&this->dyna.actor, this->timer); if (this->timer == 0) { this->actionFunc = BgYdanHasi_MoveWater; @@ -145,9 +147,10 @@ void BgYdanHasi_SetupThreeBlocks(BgYdanHasi* this, PlayState* play) { } void BgYdanHasi_UpdateThreeBlocks(BgYdanHasi* this, PlayState* play) { - if (this->timer != 0) { + if (GameInteractor_Should(VB_SWITCH_TIMER_TICK, this->timer != 0, this, &this->timer)) { this->timer--; } + if (this->timer == 0) { if (Math_StepToF(&this->dyna.actor.world.pos.y, this->dyna.actor.home.pos.y, 3.0f) != 0) { Flags_UnsetSwitch(play, this->type); diff --git a/soh/src/overlays/actors/ovl_En_Siofuki/z_en_siofuki.c b/soh/src/overlays/actors/ovl_En_Siofuki/z_en_siofuki.c index 664c75f82..7587b7a8b 100644 --- a/soh/src/overlays/actors/ovl_En_Siofuki/z_en_siofuki.c +++ b/soh/src/overlays/actors/ovl_En_Siofuki/z_en_siofuki.c @@ -6,6 +6,7 @@ #include "z_en_siofuki.h" #include "objects/object_siofuki/object_siofuki.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) @@ -188,7 +189,10 @@ void func_80AFC218(EnSiofuki* this, PlayState* play) { func_80AFBE8C(this, play); func_80AFC1D0(this, play); - this->timer--; + if (GameInteractor_Should(VB_SWITCH_TIMER_TICK, true, this, &this->timer)) { + this->timer--; + } + if (this->timer < 0) { Flags_UnsetSwitch(play, ((u16)this->dyna.actor.params >> 6) & 0x3F); switch (((u16)this->dyna.actor.params >> 0xC) & 0xF) { diff --git a/soh/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c b/soh/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c index 4758066e2..ab81c8421 100644 --- a/soh/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c +++ b/soh/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c @@ -8,6 +8,7 @@ #include "overlays/actors/ovl_En_Arrow/z_en_arrow.h" #include "objects/gameplay_keep/gameplay_keep.h" #include "objects/object_syokudai/object_syokudai.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_HOOKSHOT_PULLS_PLAYER) @@ -239,7 +240,7 @@ void ObjSyokudai_Update(Actor* thisx, PlayState* play2) { Collider_UpdateCylinder(&this->actor, &this->colliderFlame); CollisionCheck_SetAC(play, &play->colChkCtx, &this->colliderFlame.base); - if (this->litTimer > 0) { + if (GameInteractor_Should(VB_SWITCH_TIMER_TICK, this->litTimer > 0, this, &this->litTimer)) { this->litTimer--; if ((this->litTimer == 0) && (torchType != 0)) { sLitTorchCount--; From 4c547416cc31c9146cabd70285e368e1f8b37fb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Thu, 19 Jun 2025 20:31:35 +0000 Subject: [PATCH 37/67] replace MT RNG with PCG (#4973) replace boost hashing with FNV-1a removes boost as a dependency --- .github/workflows/test-builds-on-distros.yml | 12 +- docs/BUILDING.md | 12 +- soh/CMakeLists.txt | 27 --- .../container_hash/detail/hash_mix_32.hpp | 47 ----- .../container_hash/detail/hash_range_32.hpp | 128 ------------ .../boost_custom/container_hash/hash_32.hpp | 188 ------------------ .../container_hash/hash_fwd_32.hpp | 25 --- .../boost_custom/container_hash/version.hpp | 11 - .../Enhancements/randomizer/3drando/menu.cpp | 7 +- .../randomizer/3drando/playthrough.cpp | 9 +- .../randomizer/3drando/random.cpp | 45 +++-- .../randomizer/3drando/random.hpp | 2 +- .../Enhancements/randomizer/randomizer.cpp | 1 - soh/soh/OTRGlobals.cpp | 3 +- soh/soh/util.cpp | 11 + soh/soh/util.h | 1 + 16 files changed, 63 insertions(+), 466 deletions(-) delete mode 100644 soh/include/boost_custom/container_hash/detail/hash_mix_32.hpp delete mode 100644 soh/include/boost_custom/container_hash/detail/hash_range_32.hpp delete mode 100644 soh/include/boost_custom/container_hash/hash_32.hpp delete mode 100644 soh/include/boost_custom/container_hash/hash_fwd_32.hpp delete mode 100644 soh/include/boost_custom/container_hash/version.hpp diff --git a/.github/workflows/test-builds-on-distros.yml b/.github/workflows/test-builds-on-distros.yml index 476bdf2f3..8b6ded6d6 100644 --- a/.github/workflows/test-builds-on-distros.yml +++ b/.github/workflows/test-builds-on-distros.yml @@ -23,24 +23,24 @@ jobs: if: ${{ matrix.image == 'archlinux:base' }} run: | echo arch - echo pacman -S ${{ matrix.cc }} git cmake ninja lsb-release sdl2 libpng libzip nlohmann-json tinyxml2 spdlog sdl2_net boost + echo pacman -S ${{ matrix.cc }} git cmake ninja lsb-release sdl2 libpng libzip nlohmann-json tinyxml2 spdlog sdl2_net pacman -Syu --noconfirm - pacman -S --noconfirm ${{ matrix.cc }} git cmake ninja lsb-release sdl2 libpng libzip nlohmann-json tinyxml2 spdlog sdl2_net boost + pacman -S --noconfirm ${{ matrix.cc }} git cmake ninja lsb-release sdl2 libpng libzip nlohmann-json tinyxml2 spdlog sdl2_net - name: Install dependencies (dnf) if: ${{ matrix.image == 'fedora:39' }} run: | echo fedora - echo dnf install ${{ matrix.cc }} ${{ (matrix.cxx == 'g++' && 'gcc-c++') || '' }} wget git cmake ninja-build lsb_release SDL2-devel libpng-devel libzip-devel libzip-tools tinyxml2-devel spdlog-devel boost-devel + echo dnf install ${{ matrix.cc }} ${{ (matrix.cxx == 'g++' && 'gcc-c++') || '' }} wget git cmake ninja-build lsb_release SDL2-devel libpng-devel libzip-devel libzip-tools tinyxml2-devel spdlog-devel dnf -y upgrade - dnf -y install ${{ matrix.cc }} ${{ (matrix.cxx == 'g++' && 'gcc-c++') || '' }} wget git cmake ninja-build lsb_release SDL2-devel libpng-devel libzip-devel libzip-tools tinyxml2-devel spdlog-devel boost-devel + dnf -y install ${{ matrix.cc }} ${{ (matrix.cxx == 'g++' && 'gcc-c++') || '' }} wget git cmake ninja-build lsb_release SDL2-devel libpng-devel libzip-devel libzip-tools tinyxml2-devel spdlog-devel - name: Install dependencies (apt) if: ${{ matrix.image == 'ubuntu:mantic' || matrix.image == 'debian:bookworm' }} run: | echo debian based - echo apt-get install ${{ matrix.cc }} ${{ (matrix.cxx == 'g++' && 'g++') || '' }} git cmake ninja-build lsb-release libsdl2-dev libpng-dev libsdl2-net-dev libzip-dev zipcmp zipmerge ziptool nlohmann-json3-dev libtinyxml2-dev libspdlog-dev libboost-dev libopengl-dev + echo apt-get install ${{ matrix.cc }} ${{ (matrix.cxx == 'g++' && 'g++') || '' }} git cmake ninja-build lsb-release libsdl2-dev libpng-dev libsdl2-net-dev libzip-dev zipcmp zipmerge ziptool nlohmann-json3-dev libtinyxml2-dev libspdlog-dev libopengl-dev apt-get update apt-get -y full-upgrade - apt-get -y install ${{ matrix.cc }} ${{ (matrix.cxx == 'g++' && 'g++') || '' }} git cmake ninja-build lsb-release libsdl2-dev libpng-dev libsdl2-net-dev libzip-dev zipcmp zipmerge ziptool nlohmann-json3-dev libtinyxml2-dev libspdlog-dev libboost-dev libopengl-dev + apt-get -y install ${{ matrix.cc }} ${{ (matrix.cxx == 'g++' && 'g++') || '' }} git cmake ninja-build lsb-release libsdl2-dev libpng-dev libsdl2-net-dev libzip-dev zipcmp zipmerge ziptool nlohmann-json3-dev libtinyxml2-dev libspdlog-dev libopengl-dev - name: Install dependencies (zypper) if: ${{ matrix.image == 'opensuse/tumbleweed:latest' }} run: | diff --git a/docs/BUILDING.md b/docs/BUILDING.md index 4e37a27e9..f8347b9b6 100644 --- a/docs/BUILDING.md +++ b/docs/BUILDING.md @@ -90,26 +90,26 @@ C:\Program Files\CMake\bin\cmake.exe --build build-cmake --target ExtractAssetHe #### Debian/Ubuntu ```sh # using gcc -apt-get install gcc g++ git cmake ninja-build lsb-release libsdl2-dev libpng-dev libsdl2-net-dev libzip-dev zipcmp zipmerge ziptool nlohmann-json3-dev libtinyxml2-dev libspdlog-dev libboost-dev libopengl-dev +apt-get install gcc g++ git cmake ninja-build lsb-release libsdl2-dev libpng-dev libsdl2-net-dev libzip-dev zipcmp zipmerge ziptool nlohmann-json3-dev libtinyxml2-dev libspdlog-dev libopengl-dev # or using clang -apt-get install clang git cmake ninja-build lsb-release libsdl2-dev libpng-dev libsdl2-net-dev libzip-dev zipcmp zipmerge ziptool nlohmann-json3-dev libtinyxml2-dev libspdlog-dev libboost-dev libopengl-dev +apt-get install clang git cmake ninja-build lsb-release libsdl2-dev libpng-dev libsdl2-net-dev libzip-dev zipcmp zipmerge ziptool nlohmann-json3-dev libtinyxml2-dev libspdlog-dev libopengl-dev ``` #### Arch ```sh # using gcc -pacman -S gcc git cmake ninja lsb-release sdl2 libpng libzip nlohmann-json tinyxml2 spdlog sdl2_net boost +pacman -S gcc git cmake ninja lsb-release sdl2 libpng libzip nlohmann-json tinyxml2 spdlog sdl2_net # or using clang -pacman -S clang git cmake ninja lsb-release sdl2 libpng libzip nlohmann-json tinyxml2 spdlog sdl2_net boost +pacman -S clang git cmake ninja lsb-release sdl2 libpng libzip nlohmann-json tinyxml2 spdlog sdl2_net ``` #### Fedora ```sh # using gcc -dnf install gcc gcc-c++ git cmake ninja-build lsb_release SDL2-devel libpng-devel libzip-devel libzip-tools nlohmann-json-devel tinyxml2-devel spdlog-devel boost-devel +dnf install gcc gcc-c++ git cmake ninja-build lsb_release SDL2-devel libpng-devel libzip-devel libzip-tools nlohmann-json-devel tinyxml2-devel spdlog-devel # or using clang -dnf install clang git cmake ninja-build lsb_release SDL2-devel libpng-devel libzip-devel libzip-tools nlohmann-json-devel tinyxml2-devel spdlog-devel boost-devel +dnf install clang git cmake ninja-build lsb_release SDL2-devel libpng-devel libzip-devel libzip-tools nlohmann-json-devel tinyxml2-devel spdlog-devel ``` #### openSUSE ```sh diff --git a/soh/CMakeLists.txt b/soh/CMakeLists.txt index 19851f690..461c28ca5 100644 --- a/soh/CMakeLists.txt +++ b/soh/CMakeLists.txt @@ -276,32 +276,6 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Windows") set_target_properties(${PROJECT_NAME} PROPERTIES MSVC_RUNTIME_LIBRARY ${MSVC_RUNTIME_LIBRARY_STR}) endif() ################################################################################ -# Find/download Boost -################################################################################ -include(FetchContent) -FetchContent_Declare( - Boost - URL https://archives.boost.io/release/1.81.0/source/boost_1_81_0.tar.gz - URL_HASH SHA256=205666dea9f6a7cfed87c7a6dfbeb52a2c1b9de55712c9c1a87735d7181452b6 - SOURCE_SUBDIR "null" # Set to a nonexistent directory so boost is not built (we don't need to build it) - DOWNLOAD_EXTRACT_TIMESTAMP false # supress timestamp warning, not needed since the url wont change -) - -set(Boost_NO_BOOST_CMAKE false) -set(BOOST_INCLUDEDIR ${FETCHCONTENT_BASE_DIR}/boost-src) # Location where FetchContent stores the source -message("Searching for Boost installation") -find_package(Boost) - -if (NOT ${Boost_FOUND}) - message("Boost not found. Downloading now...") - FetchContent_MakeAvailable(Boost) - message("Boost downloaded to " ${FETCHCONTENT_BASE_DIR}/boost-src) - set(BOOST-INCLUDE ${FETCHCONTENT_BASE_DIR}/boost-src) -else() - message("Boost found in " ${Boost_INCLUDE_DIRS}) - set(BOOST-INCLUDE ${Boost_INCLUDE_DIRS}) -endif() -################################################################################ # Compile definitions ################################################################################ find_package(SDL2) @@ -349,7 +323,6 @@ target_include_directories(${PROJECT_NAME} PRIVATE assets ${CMAKE_CURRENT_SOURCE_DIR}/../ZAPDTR/ZAPD/resource/type ${SDL2-INCLUDE} ${SDL2-NET-INCLUDE} - ${BOOST-INCLUDE} ${CMAKE_CURRENT_SOURCE_DIR}/assets/ . ) diff --git a/soh/include/boost_custom/container_hash/detail/hash_mix_32.hpp b/soh/include/boost_custom/container_hash/detail/hash_mix_32.hpp deleted file mode 100644 index 95cfdcd77..000000000 --- a/soh/include/boost_custom/container_hash/detail/hash_mix_32.hpp +++ /dev/null @@ -1,47 +0,0 @@ -// 32 bit implementation based off of Boost hash - -#ifndef BOOST_HASH_DETAIL_HASH_MIX_32_HPP -#define BOOST_HASH_DETAIL_HASH_MIX_32_HPP - -#include -#include -#include - -namespace boost -{ -namespace hash_detail -{ - -template struct hash_mix_impl_32; - -// hash_mix for 32 bit -// -// We use the "best xmxmx" implementation from -// https://github.com/skeeto/hash-prospector/issues/19 - -template<> struct hash_mix_impl_32<32> -{ - inline static boost::uint32_t fn( boost::uint32_t x ) - { - boost::uint32_t const m1 = 0x21f0aaad; - boost::uint32_t const m2 = 0x735a2d97; - - x ^= x >> 16; - x *= m1; - x ^= x >> 15; - x *= m2; - x ^= x >> 15; - - return x; - } -}; - -inline uint32_t hash_mix_32( uint32_t v ) -{ - return hash_mix_impl_32<32>::fn( v ); -} - -} // namespace hash_detail -} // namespace boost - -#endif // #ifndef BOOST_HASH_DETAIL_HASH_MIX_32_HPP diff --git a/soh/include/boost_custom/container_hash/detail/hash_range_32.hpp b/soh/include/boost_custom/container_hash/detail/hash_range_32.hpp deleted file mode 100644 index cfa0a2a2d..000000000 --- a/soh/include/boost_custom/container_hash/detail/hash_range_32.hpp +++ /dev/null @@ -1,128 +0,0 @@ -// 32 bit implementation based off of Boost hash -// Only implementing 32 bit version of char based ranges - -#ifndef BOOST_HASH_DETAIL_HASH_RANGE_32_HPP -#define BOOST_HASH_DETAIL_HASH_RANGE_32_HPP - -#include -#include - -#if BOOST_VERSION_HAS_HASH_RANGE -#include -#else -#include -#include -#include -#include -#include -#include -#include -#endif // #if BOOST_VERSION_HAS_HASH_RANGE - -namespace boost -{ -namespace hash_detail -{ - -#if !BOOST_VERSION_HAS_HASH_RANGE - -template struct is_char_type: public boost::false_type {}; - -#if CHAR_BIT == 8 - -template<> struct is_char_type: public boost::true_type {}; -template<> struct is_char_type: public boost::true_type {}; -template<> struct is_char_type: public boost::true_type {}; - -#if defined(__cpp_char8_t) && __cpp_char8_t >= 201811L -template<> struct is_char_type: public boost::true_type {}; -#endif - -#if defined(__cpp_lib_byte) && __cpp_lib_byte >= 201603L -template<> struct is_char_type: public boost::true_type {}; -#endif - -#endif - -#endif // #if !BOOST_VERSION_HAS_HASH_RANGE - -#if BOOST_USE_STD_TYPES -#define BOOST_ENABLE_IF std::enable_if -#define BOOST_IS_SAME std::is_same -#else -#define BOOST_ENABLE_IF boost::enable_if_ -#define BOOST_IS_SAME is_same -#endif - -template -inline typename BOOST_ENABLE_IF< - is_char_type::value_type>::value && - BOOST_IS_SAME::iterator_category, std::random_access_iterator_tag>::value, -std::size_t>::type - hash_range_32( uint32_t seed, It first, It last ) -{ - std::size_t n = static_cast( last - first ); - - for( ; n >= 4; first += 4, n -= 4 ) - { - // clang 5+, gcc 5+ figure out this pattern and use a single mov on x86 - // gcc on s390x and power BE even knows how to use load-reverse - - boost::uint32_t w = - static_cast( static_cast( first[0] ) ) | - static_cast( static_cast( first[1] ) ) << 8 | - static_cast( static_cast( first[2] ) ) << 16 | - static_cast( static_cast( first[3] ) ) << 24; - - hash_combine_32( seed, w ); - } - - { - // add a trailing suffix byte of 0x01 because otherwise sequences of - // trailing zeroes are indistinguishable from end of string - - boost::uint32_t w = 0x01u; - - switch( n ) - { - case 1: - - w = - static_cast( static_cast( first[0] ) ) | - 0x0100u; - - break; - - case 2: - - w = - static_cast( static_cast( first[0] ) ) | - static_cast( static_cast( first[1] ) ) << 8 | - 0x010000u; - - break; - - case 3: - - w = - static_cast( static_cast( first[0] ) ) | - static_cast( static_cast( first[1] ) ) << 8 | - static_cast( static_cast( first[2] ) ) << 16 | - 0x01000000u; - - break; - } - - hash_combine_32( seed, w ); - } - - return seed; -} - -} // namespace hash_detail -} // namespace boost - -#undef BOOST_ENABLE_IF -#undef BOOST_IS_SAME - -#endif // #ifndef BOOST_HASH_DETAIL_HASH_RANGE_32_HPP diff --git a/soh/include/boost_custom/container_hash/hash_32.hpp b/soh/include/boost_custom/container_hash/hash_32.hpp deleted file mode 100644 index eaf459a34..000000000 --- a/soh/include/boost_custom/container_hash/hash_32.hpp +++ /dev/null @@ -1,188 +0,0 @@ -// 32 bit implementation based off of Boost hash -// Only implementing 32 bit versions integral and string based hashes - -#ifndef BOOST_FUNCTIONAL_HASH_HASH_32_HPP -#define BOOST_FUNCTIONAL_HASH_HASH_32_HPP - -#include -#include -#include -#include -#include - -#if !BOOST_VERSION_HAS_HASH_RANGE -#include -#include - -#if BOOST_WORKAROUND(__GNUC__, < 3) \ - && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION) -#define BOOST_HASH_CHAR_TRAITS string_char_traits -#else -#define BOOST_HASH_CHAR_TRAITS char_traits -#endif - -#endif // #if !BOOST_VERSION_HAS_HASH_RANGE - -#if BOOST_USE_STD_TYPES -#define BOOST_ENABLE_IF std::enable_if -#define BOOST_IS_INTEGRAL hash_detail::is_integral -#define BOOST_IS_UNSIGNED is_unsigned -#define BOOST_MAKE_UNSIGNED make_unsigned -#else -#define BOOST_ENABLE_IF boost::enable_if_ -#define BOOST_IS_INTEGRAL boost::is_integral -#define BOOST_IS_UNSIGNED boost::is_unsigned -#define BOOST_MAKE_UNSIGNED boost::make_unsigned -#endif - -namespace boost -{ - - // - // boost::hash_value - // - - // integral types - - namespace hash_detail - { - template sizeof(uint32_t)), - bool is_unsigned = BOOST_IS_UNSIGNED::value, - std::size_t size_t_bits = sizeof(uint32_t) * CHAR_BIT, - std::size_t type_bits = sizeof(T) * CHAR_BIT> - struct hash_integral_impl_32; - - template struct hash_integral_impl_32 - { - static uint32_t fn( T v ) - { - return static_cast( v ); - } - }; - - template struct hash_integral_impl_32 - { - static uint32_t fn( T v ) - { - typedef typename BOOST_MAKE_UNSIGNED::type U; - - if( v >= 0 ) - { - return hash_integral_impl_32::fn( static_cast( v ) ); - } - else - { - return ~hash_integral_impl_32::fn( static_cast( ~static_cast( v ) ) ); - } - } - }; - - template struct hash_integral_impl_32 - { - static uint32_t fn( T v ) - { - uint32_t seed = 0; - - seed = static_cast( v >> 32 ) + hash_detail::hash_mix_32( seed ); - seed = static_cast( v ) + hash_detail::hash_mix_32( seed ); - - return seed; - } - }; - - template struct hash_integral_impl_32 - { - static uint32_t fn( T v ) - { - uint32_t seed = 0; - - seed = static_cast( v >> 96 ) + hash_detail::hash_mix_32( seed ); - seed = static_cast( v >> 64 ) + hash_detail::hash_mix_32( seed ); - seed = static_cast( v >> 32 ) + hash_detail::hash_mix_32( seed ); - seed = static_cast( v ) + hash_detail::hash_mix_32( seed ); - - return seed; - } - }; - - } // namespace hash_detail - - template - typename BOOST_ENABLE_IF::value, uint32_t>::type - hash_value_32( T v ) - { - return hash_detail::hash_integral_impl_32::fn( v ); - } - - // contiguous ranges (string, vector, array) -#if BOOST_VERSION_HAS_HASH_RANGE - template - typename BOOST_ENABLE_IF::value, uint32_t>::type - hash_value_32( T const& v ) - { - return boost::hash_range_32( v.data(), v.data() + v.size() ); - } -#else - template - inline uint32_t hash_value_32( - std::basic_string, A> const& v) - { - return boost::hash_range_32( v.data(), v.data() + v.size() ); - } -#endif - - // - // boost::hash_combine - // - - template - inline void hash_combine_32( uint32_t& seed, T const& v ) - { - seed = boost::hash_detail::hash_mix_32( seed + 0x9e3779b9 + boost::hash_32()( v ) ); - } - - // - // boost::hash_range - // - - template - inline void hash_range_32( uint32_t& seed, It first, It last ) - { - seed = hash_detail::hash_range_32( seed, first, last ); - } - - template - inline uint32_t hash_range_32( It first, It last ) - { - uint32_t seed = 0; - - hash_range_32( seed, first, last ); - - return seed; - } - - // - // boost::hash - // - - template struct hash_32 - { - typedef T argument_type; - typedef uint32_t result_type; - - uint32_t operator()( T const& val ) const - { - return hash_value_32( val ); - } - }; - -} // namespace boost - -#undef BOOST_HASH_CHAR_TRAITS -#undef BOOST_ENABLE_IF -#undef BOOST_IS_INTEGRAL -#undef BOOST_IS_UNSIGNED -#undef BOOST_MAKE_UNSIGNED - -#endif // #ifndef BOOST_FUNCTIONAL_HASH_HASH_32_HPP diff --git a/soh/include/boost_custom/container_hash/hash_fwd_32.hpp b/soh/include/boost_custom/container_hash/hash_fwd_32.hpp deleted file mode 100644 index 2ad101f2b..000000000 --- a/soh/include/boost_custom/container_hash/hash_fwd_32.hpp +++ /dev/null @@ -1,25 +0,0 @@ -// 32 bit implementation based off of Boost hash - -#ifndef BOOST_FUNCTIONAL_HASH_FWD_32_HPP -#define BOOST_FUNCTIONAL_HASH_FWD_32_HPP - -#include - -namespace boost -{ - -namespace container_hash -{ - -} // namespace container_hash - -template struct hash_32; - -template void hash_combine_32( uint32_t& seed, T const& v ); - -template void hash_range_32( uint32_t&, It, It ); -template uint32_t hash_range_32( It, It ); - -} // namespace boost - -#endif // #ifndef BOOST_FUNCTIONAL_HASH_FWD_32_HPP diff --git a/soh/include/boost_custom/container_hash/version.hpp b/soh/include/boost_custom/container_hash/version.hpp deleted file mode 100644 index 3863b507c..000000000 --- a/soh/include/boost_custom/container_hash/version.hpp +++ /dev/null @@ -1,11 +0,0 @@ - -#ifndef BOOST_CONTAINER_HASH_VERSION_HPP -#define BOOST_CONTAINER_HASH_VERSION_HPP - -#include - -#define BOOST_VERSION_HAS_HASH_RANGE ((BOOST_VERSION / 100 % 1000) >= 81) - -#define BOOST_USE_STD_TYPES ((BOOST_VERSION / 100 % 1000) >= 84) - -#endif // #ifndef BOOST_CONTAINER_HASH_VERSION_HPP diff --git a/soh/soh/Enhancements/randomizer/3drando/menu.cpp b/soh/soh/Enhancements/randomizer/3drando/menu.cpp index cf3a0bc3d..35f21ce20 100644 --- a/soh/soh/Enhancements/randomizer/3drando/menu.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/menu.cpp @@ -12,7 +12,6 @@ #include "soh/Enhancements/debugger/performanceTimer.h" #include #include "../../randomizer/randomizerTypes.h" -#include namespace { bool seedChanged; @@ -30,7 +29,7 @@ bool GenerateRandomizer(std::set excludedLocations, std::set(time(NULL))); // if a blank seed was entered, make a random one if (seedInput.empty()) { - seedInput = std::to_string(rand() % 0xFFFFFFFF); + seedInput = std::to_string(rand()); } else if (seedInput.rfind("seed_testing_count", 0) == 0 && seedInput.length() > 18) { int count; try { @@ -43,8 +42,8 @@ bool GenerateRandomizer(std::set excludedLocations, std::setSetSeedString(seedInput); - uint32_t seedHash = boost::hash_32{}(ctx->GetSeedString()); - ctx->SetSeed(seedHash & 0xFFFFFFFF); + uint32_t seedHash = SohUtils::Hash(ctx->GetSeedString()); + ctx->SetSeed(seedHash); ctx->ClearItemLocations(); int ret = Playthrough::Playthrough_Init(ctx->GetSeed(), excludedLocations, enabledTricks); diff --git a/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp b/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp index cfd451976..1e4a3db38 100644 --- a/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp @@ -1,7 +1,6 @@ #include "playthrough.hpp" #include -#include #include "fill.hpp" #include "../location_access.h" #include "random.hpp" @@ -62,7 +61,7 @@ int Playthrough_Init(uint32_t seed, std::set excludedLocations, settingsStr += (char*)gBuildVersion; } - uint32_t finalHash = boost::hash_32{}(std::to_string(ctx->GetSeed()) + settingsStr); + uint32_t finalHash = SohUtils::Hash(std::to_string(ctx->GetSeed()) + settingsStr); Random_Init(finalHash); ctx->SetHash(std::to_string(finalHash)); @@ -104,9 +103,9 @@ int Playthrough_Repeat(std::set excludedLocations, std::setSetSeedString(std::to_string(rand() % 0xFFFFFFFF)); - repeatedSeed = boost::hash_32{}(ctx->GetSeedString()); - ctx->SetSeed(repeatedSeed % 0xFFFFFFFF); + ctx->SetSeedString(std::to_string(rand())); + repeatedSeed = SohUtils::Hash(ctx->GetSeedString()); + ctx->SetSeed(repeatedSeed); SPDLOG_DEBUG("testing seed: %d", repeatedSeed); ClearProgress(); Playthrough_Init(ctx->GetSeed(), excludedLocations, enabledTricks); diff --git a/soh/soh/Enhancements/randomizer/3drando/random.cpp b/soh/soh/Enhancements/randomizer/3drando/random.cpp index 97e57dbec..4cac19818 100644 --- a/soh/soh/Enhancements/randomizer/3drando/random.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/random.cpp @@ -1,40 +1,55 @@ #include "random.hpp" +#include #include -#include -#include -#include +#include static bool init = false; -static boost::random::mt19937 generator; +static uint64_t state = 0; +const uint64_t multiplier = 6364136223846793005ULL; +const uint64_t increment = 11634580027462260723ULL; // Initialize with seed specified -void Random_Init(uint32_t seed) { +void Random_Init(uint64_t seed) { init = true; - generator = boost::random::mt19937{ seed }; + state = seed; } -void Random_InitSeed() { +uint32_t next32() { if (!init) { // No seed given, get a random number from device to seed #if !defined(__SWITCH__) && !defined(__WIIU__) - const auto seed = static_cast(std::random_device{}()); + uint64_t seed = static_cast(std::random_device{}()); #else - uint32_t seed = static_cast(std::hash{}(std::to_string(rand()))); + uint64_t seed = static_cast(std::hash{}(std::to_string(rand()))); #endif Random_Init(seed); } + + state = state * multiplier + increment; + uint32_t xorshifted = static_cast(((state >> 18) ^ state) >> 27); + uint32_t rot = static_cast(state >> 59); + return std::rotr(xorshifted, rot); } -// Returns a random unsigned integer in range [min, max-1] +// Returns a random integer in range [min, max-1] uint32_t Random(uint32_t min, uint32_t max) { - Random_InitSeed(); - boost::random::uniform_int_distribution distribution(min, max - 1); - return distribution(generator); + if (min == max) { + return min; + } + assert(max > min); + + uint32_t n = max - min; + uint32_t cutoff = UINT32_MAX - UINT32_MAX % static_cast(n); + for (;;) { + uint32_t r = next32(); + if (r <= cutoff) { + return min + r % n; + } + } } // Returns a random floating point number in [0.0, 1.0) double RandomDouble() { - boost::random::uniform_real_distribution distribution(0.0, 1.0); - return distribution(generator); + return ldexp(next32(), -32); } diff --git a/soh/soh/Enhancements/randomizer/3drando/random.hpp b/soh/soh/Enhancements/randomizer/3drando/random.hpp index b4f780332..514389471 100644 --- a/soh/soh/Enhancements/randomizer/3drando/random.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/random.hpp @@ -7,7 +7,7 @@ #include #include -void Random_Init(uint32_t seed); +void Random_Init(uint64_t seed); uint32_t Random(uint32_t min, uint32_t max); double RandomDouble(); diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 623aa01f9..a7205b8c8 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -30,7 +30,6 @@ #include "soh/SohGui/UIWidgets.hpp" #include "static_data.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" -#include #include "randomizer_settings_window.h" #include "savefile.h" #include "entrance.h" diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 501af673e..df3919274 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -46,7 +46,6 @@ #include "Enhancements/custom-message/CustomMessageManager.h" #include "Enhancements/Presets/Presets.h" #include "util.h" -#include #if not defined(__SWITCH__) && not defined(__WIIU__) #include "Extractor/Extract.h" @@ -2640,7 +2639,7 @@ void SoH_ProcessDroppedFiles(std::string filePath) { gui->SaveConsoleVariablesNextFrame(); ShipInit::Init("*"); - uint32_t finalHash = boost::hash_32{}(configJson.dump()); + uint32_t finalHash = SohUtils::Hash(configJson.dump()); gui->GetGameOverlay()->TextDrawNotification(30.0f, true, "Configuration Loaded. Hash: %d", finalHash); } catch (std::exception& e) { SPDLOG_ERROR("Failed to load config file: {}", e.what()); diff --git a/soh/soh/util.cpp b/soh/soh/util.cpp index 374e2f602..f1405abbb 100644 --- a/soh/soh/util.cpp +++ b/soh/soh/util.cpp @@ -398,3 +398,14 @@ bool SohUtils::IsStringEmpty(std::string str) { // Check if the string is empty after stripping spaces return start == std::string::npos || end == std::string::npos; } + +uint32_t SohUtils::Hash(std::string str) { + // FNV-1a + const size_t len = str.size(); + uint32_t hval = 0x811c9dc5; + for (size_t pos = 0; pos < len; pos++) { + hval ^= (uint32_t)str[pos]; + hval *= 0x01000193; + } + return hval; +} diff --git a/soh/soh/util.h b/soh/soh/util.h index 21cf0c77f..9a31d4be4 100644 --- a/soh/soh/util.h +++ b/soh/soh/util.h @@ -22,4 +22,5 @@ std::string Sanitize(std::string stringValue); size_t CopyStringToCharBuffer(char* buffer, const std::string& source, size_t maxBufferSize); bool IsStringEmpty(std::string str); +uint32_t Hash(std::string str); } // namespace SohUtils From 87c971372d74e1270408e7a28e8a616149d2cfda Mon Sep 17 00:00:00 2001 From: Pepe20129 <72659707+Pepe20129@users.noreply.github.com> Date: Thu, 19 Jun 2025 22:32:39 +0200 Subject: [PATCH 38/67] Change `Region`'s scene string with a `SceneId` (#5398) * Change region scene from string to sceneid * Deduce `timePass` from scene * Deduce `areas` from scene where possible No possible for `RR_CASTLE_GROUNDS` & "link's pocket" areas * Update zoras_fountain.cpp * Applied clang format * Address review * Address review * Clang format * Fix pseudo regions * Format * Address review * Address review --- .../Enhancements/randomizer/3drando/fill.cpp | 2 +- soh/soh/Enhancements/randomizer/entrance.cpp | 17 +- .../randomizer/location_access.cpp | 325 +++++++++++++++++- .../Enhancements/randomizer/location_access.h | 16 +- .../dungeons/bottom_of_the_well.cpp | 40 +-- .../location_access/dungeons/deku_tree.cpp | 65 ++-- .../dungeons/dodongos_cavern.cpp | 97 +++--- .../location_access/dungeons/fire_temple.cpp | 141 ++++---- .../dungeons/forest_temple.cpp | 108 +++--- .../dungeons/ganons_castle.cpp | 86 ++--- .../dungeons/gerudo_training_ground.cpp | 60 ++-- .../location_access/dungeons/ice_cavern.cpp | 20 +- .../dungeons/jabujabus_belly.cpp | 54 +-- .../dungeons/shadow_temple.cpp | 62 ++-- .../dungeons/spirit_temple.cpp | 94 ++--- .../location_access/dungeons/water_temple.cpp | 142 ++++---- .../location_access/gerudo_fortress.cpp | 6 +- .../overworld/castle_grounds.cpp | 22 +- .../overworld/death_mountain_crater.cpp | 22 +- .../overworld/death_mountain_trail.cpp | 12 +- .../overworld/desert_colossus.cpp | 10 +- .../overworld/gerudo_valley.cpp | 20 +- .../location_access/overworld/goron_city.cpp | 14 +- .../location_access/overworld/graveyard.cpp | 18 +- .../overworld/haunted_wasteland.cpp | 13 +- .../overworld/hyrule_field.cpp | 20 +- .../location_access/overworld/kakariko.cpp | 40 +-- .../overworld/kokiri_forest.cpp | 18 +- .../location_access/overworld/lake_hylia.cpp | 28 +- .../overworld/lon_lon_ranch.cpp | 10 +- .../location_access/overworld/lost_woods.cpp | 18 +- .../location_access/overworld/market.cpp | 26 +- .../overworld/sacred_forest_meadow.cpp | 10 +- .../overworld/temple_of_time.cpp | 6 +- .../overworld/zoras_domain.cpp | 12 +- .../overworld/zoras_fountain.cpp | 16 +- .../location_access/overworld/zoras_river.cpp | 18 +- .../Enhancements/randomizer/randomizerTypes.h | 3 + 38 files changed, 1008 insertions(+), 683 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/fill.cpp b/soh/soh/Enhancements/randomizer/3drando/fill.cpp index bc90ab270..2ac5a3592 100644 --- a/soh/soh/Enhancements/randomizer/3drando/fill.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/fill.cpp @@ -478,7 +478,7 @@ void ProcessRegion(Region* region, GetAccessibleLocationsStruct& gals, Randomize // without the aid of TimePass. During this mode, TimePass won't update ToD access // in any region. // RANDOTODO can probably be removed after a ToD rework that accounts for having Dampe time access - if (region->timePass) { + if (region->TimePass()) { if (region->childDay) { gals.timePassChildDay = true; } diff --git a/soh/soh/Enhancements/randomizer/entrance.cpp b/soh/soh/Enhancements/randomizer/entrance.cpp index 153bb6df4..52657a6ab 100644 --- a/soh/soh/Enhancements/randomizer/entrance.cpp +++ b/soh/soh/Enhancements/randomizer/entrance.cpp @@ -666,8 +666,21 @@ std::vector EntranceShuffler::AssumeEntrancePool(std::vector& rollbacks) { // Entrances shouldn't connect to their own scene, fail in this situation - if (entrance->GetParentRegion()->scene != "" && - entrance->GetParentRegion()->scene == target->GetConnectedRegion()->scene) { + if ( + // allow "special" areas to connect to eachother + entrance->GetParentRegion()->scene != SCENE_ID_MAX && + // allow grottos and fairy fountains to connect to eachother + entrance->GetParentRegion()->scene != SCENE_GROTTOS && + entrance->GetParentRegion()->scene != SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC && + entrance->GetParentRegion()->scene != SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS && + + (entrance->GetParentRegion()->scene == target->GetConnectedRegion()->scene || + + // prevent SCENE_HYRULE_CASTLE & SCENE_OUTSIDE_GANONS_CASTLE from connecting to eachother + (entrance->GetParentRegion()->scene == SCENE_HYRULE_CASTLE && + target->GetConnectedRegion()->scene == SCENE_OUTSIDE_GANONS_CASTLE) || + (entrance->GetParentRegion()->scene == SCENE_OUTSIDE_GANONS_CASTLE && + target->GetConnectedRegion()->scene == SCENE_HYRULE_CASTLE))) { auto message = "Entrance " + entrance->GetName() + " attempted to connect with own scene target " + target->to_string() + ". Connection failed.\n"; SPDLOG_DEBUG(message); diff --git a/soh/soh/Enhancements/randomizer/location_access.cpp b/soh/soh/Enhancements/randomizer/location_access.cpp index c7e98dca2..d12cfc47a 100644 --- a/soh/soh/Enhancements/randomizer/location_access.cpp +++ b/soh/soh/Enhancements/randomizer/location_access.cpp @@ -123,18 +123,310 @@ bool CanBuyAnother(uint16_t price) { return true; } +std::set CalculateAreas(SceneID scene) { + switch (scene) { + case SCENE_DEKU_TREE: + return { RA_DEKU_TREE }; + case SCENE_DODONGOS_CAVERN: + return { RA_DODONGOS_CAVERN }; + case SCENE_JABU_JABU: + return { RA_JABU_JABUS_BELLY }; + case SCENE_FOREST_TEMPLE: + return { RA_FOREST_TEMPLE }; + case SCENE_FIRE_TEMPLE: + return { RA_FIRE_TEMPLE }; + case SCENE_WATER_TEMPLE: + return { RA_WATER_TEMPLE }; + case SCENE_SPIRIT_TEMPLE: + return { RA_SPIRIT_TEMPLE }; + case SCENE_SHADOW_TEMPLE: + return { RA_SHADOW_TEMPLE }; + case SCENE_BOTTOM_OF_THE_WELL: + return { RA_BOTTOM_OF_THE_WELL }; + case SCENE_ICE_CAVERN: + return { RA_ICE_CAVERN }; + case SCENE_INSIDE_GANONS_CASTLE: + return { RA_GANONS_CASTLE }; + case SCENE_GERUDO_TRAINING_GROUND: + return { RA_GERUDO_TRAINING_GROUND }; + case SCENE_THIEVES_HIDEOUT: + case SCENE_GERUDOS_FORTRESS: + return { RA_GERUDO_FORTRESS }; + case SCENE_MARKET_ENTRANCE_DAY: + case SCENE_MARKET_ENTRANCE_NIGHT: + case SCENE_MARKET_ENTRANCE_RUINS: + case SCENE_BACK_ALLEY_DAY: + case SCENE_BACK_ALLEY_NIGHT: + case SCENE_MARKET_DAY: + case SCENE_MARKET_NIGHT: + case SCENE_MARKET_RUINS: + case SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY: + case SCENE_TEMPLE_OF_TIME_EXTERIOR_NIGHT: + case SCENE_TEMPLE_OF_TIME_EXTERIOR_RUINS: + return { RA_THE_MARKET }; + case SCENE_TEMPLE_OF_TIME: + return { RA_TEMPLE_OF_TIME }; + case SCENE_HYRULE_FIELD: + return { RA_HYRULE_FIELD }; + case SCENE_KAKARIKO_VILLAGE: + return { RA_KAKARIKO_VILLAGE }; + case SCENE_GRAVEYARD: + return { RA_THE_GRAVEYARD }; + case SCENE_ZORAS_RIVER: + return { RA_ZORAS_RIVER }; + case SCENE_KOKIRI_FOREST: + return { RA_KOKIRI_FOREST }; + case SCENE_SACRED_FOREST_MEADOW: + return { RA_SACRED_FOREST_MEADOW }; + case SCENE_LAKE_HYLIA: + return { RA_LAKE_HYLIA }; + case SCENE_ZORAS_DOMAIN: + return { RA_ZORAS_DOMAIN }; + case SCENE_ZORAS_FOUNTAIN: + return { RA_ZORAS_FOUNTAIN }; + case SCENE_GERUDO_VALLEY: + return { RA_GERUDO_VALLEY }; + case SCENE_LOST_WOODS: + return { RA_THE_LOST_WOODS }; + case SCENE_DESERT_COLOSSUS: + return { RA_DESERT_COLOSSUS }; + case SCENE_HAUNTED_WASTELAND: + return { RA_HAUNTED_WASTELAND }; + case SCENE_HYRULE_CASTLE: + return { RA_HYRULE_CASTLE }; + case SCENE_DEATH_MOUNTAIN_TRAIL: + return { RA_DEATH_MOUNTAIN_TRAIL }; + case SCENE_DEATH_MOUNTAIN_CRATER: + return { RA_DEATH_MOUNTAIN_CRATER }; + case SCENE_GORON_CITY: + return { RA_GORON_CITY }; + case SCENE_LON_LON_RANCH: + return { RA_LON_LON_RANCH }; + case SCENE_OUTSIDE_GANONS_CASTLE: + return { RA_OUTSIDE_GANONS_CASTLE }; + case SCENE_TREASURE_BOX_SHOP: + case SCENE_DEKU_TREE_BOSS: + case SCENE_DODONGOS_CAVERN_BOSS: + case SCENE_JABU_JABU_BOSS: + case SCENE_FOREST_TEMPLE_BOSS: + case SCENE_FIRE_TEMPLE_BOSS: + case SCENE_WATER_TEMPLE_BOSS: + case SCENE_SPIRIT_TEMPLE_BOSS: + case SCENE_SHADOW_TEMPLE_BOSS: + case SCENE_GANONS_TOWER: + case SCENE_GANONDORF_BOSS: + case SCENE_KNOW_IT_ALL_BROS_HOUSE: + case SCENE_TWINS_HOUSE: + case SCENE_MIDOS_HOUSE: + case SCENE_SARIAS_HOUSE: + case SCENE_KAKARIKO_CENTER_GUEST_HOUSE: + case SCENE_BACK_ALLEY_HOUSE: + case SCENE_BAZAAR: + case SCENE_KOKIRI_SHOP: + case SCENE_GORON_SHOP: + case SCENE_ZORA_SHOP: + case SCENE_POTION_SHOP_KAKARIKO: + case SCENE_POTION_SHOP_MARKET: + case SCENE_BOMBCHU_SHOP: + case SCENE_HAPPY_MASK_SHOP: + case SCENE_LINKS_HOUSE: + case SCENE_DOG_LADY_HOUSE: + case SCENE_STABLE: + case SCENE_IMPAS_HOUSE: + case SCENE_LAKESIDE_LABORATORY: + case SCENE_CARPENTERS_TENT: + case SCENE_GRAVEKEEPERS_HUT: + case SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC: + case SCENE_FAIRYS_FOUNTAIN: + case SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS: + case SCENE_GROTTOS: + case SCENE_REDEAD_GRAVE: + case SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN: + case SCENE_ROYAL_FAMILYS_TOMB: + case SCENE_SHOOTING_GALLERY: + case SCENE_CASTLE_COURTYARD_GUARDS_DAY: + case SCENE_CASTLE_COURTYARD_GUARDS_NIGHT: + case SCENE_WINDMILL_AND_DAMPES_GRAVE: + case SCENE_FISHING_POND: + case SCENE_CASTLE_COURTYARD_ZELDA: + case SCENE_BOMBCHU_BOWLING_ALLEY: + case SCENE_LON_LON_BUILDINGS: + case SCENE_MARKET_GUARD_HOUSE: + case SCENE_POTION_SHOP_GRANNY: + case SCENE_HOUSE_OF_SKULLTULA: + case SCENE_GANONS_TOWER_COLLAPSE_INTERIOR: + case SCENE_INSIDE_GANONS_CASTLE_COLLAPSE: + case SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR: + case SCENE_GANON_BOSS: + return {}; + case SCENE_CHAMBER_OF_THE_SAGES: + case SCENE_CUTSCENE_MAP: + case SCENE_TEST01: + case SCENE_BESITU: + case SCENE_DEPTH_TEST: + case SCENE_SYOTES: + case SCENE_SYOTES2: + case SCENE_SUTARU: + case SCENE_HAIRAL_NIWA2: + case SCENE_SASATEST: + case SCENE_TESTROOM: + case SCENE_ID_MAX: + default: + assert(false); + return {}; + } +} + +bool GetTimePassFromScene(SceneID scene) { + switch (scene) { + case SCENE_DEKU_TREE: + case SCENE_DODONGOS_CAVERN: + case SCENE_JABU_JABU: + case SCENE_FOREST_TEMPLE: + case SCENE_FIRE_TEMPLE: + case SCENE_WATER_TEMPLE: + case SCENE_SPIRIT_TEMPLE: + case SCENE_SHADOW_TEMPLE: + case SCENE_BOTTOM_OF_THE_WELL: + case SCENE_ICE_CAVERN: + case SCENE_GANONS_TOWER: + case SCENE_GERUDO_TRAINING_GROUND: + case SCENE_THIEVES_HIDEOUT: + case SCENE_INSIDE_GANONS_CASTLE: + case SCENE_GANONS_TOWER_COLLAPSE_INTERIOR: + case SCENE_INSIDE_GANONS_CASTLE_COLLAPSE: + case SCENE_TREASURE_BOX_SHOP: + case SCENE_DEKU_TREE_BOSS: + case SCENE_DODONGOS_CAVERN_BOSS: + case SCENE_JABU_JABU_BOSS: + case SCENE_FOREST_TEMPLE_BOSS: + case SCENE_FIRE_TEMPLE_BOSS: + case SCENE_WATER_TEMPLE_BOSS: + case SCENE_SPIRIT_TEMPLE_BOSS: + case SCENE_SHADOW_TEMPLE_BOSS: + case SCENE_GANONDORF_BOSS: + case SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR: + case SCENE_MARKET_ENTRANCE_DAY: + case SCENE_MARKET_ENTRANCE_NIGHT: + case SCENE_MARKET_ENTRANCE_RUINS: + case SCENE_BACK_ALLEY_DAY: + case SCENE_BACK_ALLEY_NIGHT: + case SCENE_MARKET_DAY: + case SCENE_MARKET_NIGHT: + case SCENE_MARKET_RUINS: + case SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY: + case SCENE_TEMPLE_OF_TIME_EXTERIOR_NIGHT: + case SCENE_TEMPLE_OF_TIME_EXTERIOR_RUINS: + case SCENE_KNOW_IT_ALL_BROS_HOUSE: + case SCENE_TWINS_HOUSE: + case SCENE_MIDOS_HOUSE: + case SCENE_SARIAS_HOUSE: + case SCENE_KAKARIKO_CENTER_GUEST_HOUSE: + case SCENE_BACK_ALLEY_HOUSE: + case SCENE_BAZAAR: + case SCENE_KOKIRI_SHOP: + case SCENE_GORON_SHOP: + case SCENE_ZORA_SHOP: + case SCENE_POTION_SHOP_KAKARIKO: + case SCENE_POTION_SHOP_MARKET: + case SCENE_BOMBCHU_SHOP: + case SCENE_HAPPY_MASK_SHOP: + case SCENE_LINKS_HOUSE: + case SCENE_DOG_LADY_HOUSE: + case SCENE_STABLE: + case SCENE_IMPAS_HOUSE: + case SCENE_LAKESIDE_LABORATORY: + case SCENE_CARPENTERS_TENT: + case SCENE_GRAVEKEEPERS_HUT: + case SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC: + case SCENE_FAIRYS_FOUNTAIN: + case SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS: + case SCENE_GROTTOS: + case SCENE_REDEAD_GRAVE: + case SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN: + case SCENE_ROYAL_FAMILYS_TOMB: + case SCENE_SHOOTING_GALLERY: + case SCENE_TEMPLE_OF_TIME: + case SCENE_CHAMBER_OF_THE_SAGES: + case SCENE_CASTLE_COURTYARD_GUARDS_DAY: + case SCENE_CASTLE_COURTYARD_GUARDS_NIGHT: + case SCENE_CUTSCENE_MAP: + case SCENE_WINDMILL_AND_DAMPES_GRAVE: + case SCENE_CASTLE_COURTYARD_ZELDA: + case SCENE_BOMBCHU_BOWLING_ALLEY: + case SCENE_LON_LON_BUILDINGS: + case SCENE_MARKET_GUARD_HOUSE: + case SCENE_POTION_SHOP_GRANNY: + case SCENE_GANON_BOSS: + case SCENE_HOUSE_OF_SKULLTULA: + case SCENE_KOKIRI_FOREST: + case SCENE_SACRED_FOREST_MEADOW: + case SCENE_LOST_WOODS: + case SCENE_GORON_CITY: + case SCENE_OUTSIDE_GANONS_CASTLE: + case SCENE_GRAVEYARD: + case SCENE_ZORAS_DOMAIN: + case SCENE_ZORAS_FOUNTAIN: + case SCENE_GERUDOS_FORTRESS: + case SCENE_HAUNTED_WASTELAND: + case SCENE_DEATH_MOUNTAIN_CRATER: + case SCENE_ID_MAX: + return false; + + // Time does pass in the fishing pond but it's + // extremely slow (more than 2 IRL seconds per in-game minute) + // maybe in the future there could be a trick to count it + case SCENE_FISHING_POND: + return false; + + case SCENE_HYRULE_FIELD: + case SCENE_KAKARIKO_VILLAGE: + case SCENE_ZORAS_RIVER: + case SCENE_LAKE_HYLIA: + case SCENE_GERUDO_VALLEY: + case SCENE_DESERT_COLOSSUS: + case SCENE_HYRULE_CASTLE: + case SCENE_DEATH_MOUNTAIN_TRAIL: + case SCENE_LON_LON_RANCH: + return true; + + case SCENE_TEST01: + case SCENE_BESITU: + case SCENE_DEPTH_TEST: + case SCENE_SYOTES: + case SCENE_SYOTES2: + case SCENE_SUTARU: + case SCENE_HAIRAL_NIWA2: + case SCENE_SASATEST: + case SCENE_TESTROOM: + default: + assert(false); + return false; + } +} + Region::Region() = default; -Region::Region(std::string regionName_, std::string scene_, std::set areas, bool timePass_, +Region::Region(std::string regionName_, SceneID scene_, bool timePass_, std::set areas, std::vector events_, std::vector locations_, std::list exits_) - : regionName(std::move(regionName_)), scene(std::move(scene_)), areas(areas), timePass(timePass_), - events(std::move(events_)), locations(std::move(locations_)), exits(std::move(exits_)) { + : regionName(std::move(regionName_)), scene(scene_), timePass(timePass_), areas(areas), events(std::move(events_)), + locations(std::move(locations_)), exits(std::move(exits_)) { +} +Region::Region(std::string regionName_, SceneID scene_, std::vector events_, + std::vector locations_, std::list exits_) + : regionName(std::move(regionName_)), scene(scene_), timePass(GetTimePassFromScene(scene_)), + areas(CalculateAreas(scene_)), events(std::move(events_)), locations(std::move(locations_)), + exits(std::move(exits_)) { } Region::~Region() = default; +bool Region::TimePass() { + return timePass; +} + void Region::ApplyTimePass() { - if (timePass) { + if (TimePass()) { StartPerformanceTimer(PT_TOD_ACCESS); if (Child()) { childDay = true; @@ -322,6 +614,7 @@ bool BeanPlanted(const RandomizerRegion region) { default: sceneID = SCENE_ID_MAX; swchFlag = 0; + assert(false); break; } @@ -373,10 +666,10 @@ void RegionTable_Init() { }; // Clear the array from any previous playthrough attempts. This is important so that // locations which appear in both MQ and Vanilla dungeons don't get set in both areas. - areaTable.fill(Region("Invalid Region", "Invalid Region", {}, NO_DAY_NIGHT_CYCLE, {}, {}, {})); + areaTable.fill(Region("Invalid Region", SCENE_ID_MAX, {}, {}, {})); // clang-format off - areaTable[RR_ROOT] = Region("Root", "", {RA_LINKS_POCKET}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_ROOT] = Region("Root", SCENE_ID_MAX, TIME_DOESNT_PASS, {RA_LINKS_POCKET}, { //Events EventAccess(&logic->KakarikoVillageGateOpen, []{return ctx->GetOption(RSK_KAK_GATE).Is(RO_KAK_GATE_OPEN);}), }, { @@ -389,7 +682,7 @@ void RegionTable_Init() { Entrance(RR_ROOT_EXITS, []{return true;}), }); - areaTable[RR_ROOT_EXITS] = Region("Root Exits", "", {RA_LINKS_POCKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_ROOT_EXITS] = Region("Root Exits", SCENE_ID_MAX, TIME_DOESNT_PASS, {RA_LINKS_POCKET}, {}, {}, { //Exits Entrance(RR_CHILD_SPAWN, []{return logic->IsChild;}), Entrance(RR_ADULT_SPAWN, []{return logic->IsAdult;}), @@ -401,42 +694,42 @@ void RegionTable_Init() { Entrance(RR_PRELUDE_OF_LIGHT_WARP, []{return logic->CanUse(RG_PRELUDE_OF_LIGHT) && logic->CanLeaveForest();}), }); - areaTable[RR_CHILD_SPAWN] = Region("Child Spawn", "", {RA_LINKS_POCKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_CHILD_SPAWN] = Region("Child Spawn", SCENE_ID_MAX, TIME_DOESNT_PASS, {RA_LINKS_POCKET}, {}, {}, { //Exits Entrance(RR_KF_LINKS_HOUSE, []{return true;}), }); - areaTable[RR_ADULT_SPAWN] = Region("Adult Spawn", "", {RA_LINKS_POCKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_ADULT_SPAWN] = Region("Adult Spawn", SCENE_ID_MAX, TIME_DOESNT_PASS, {RA_LINKS_POCKET}, {}, {}, { //Exits Entrance(RR_TEMPLE_OF_TIME, []{return true;}), }); - areaTable[RR_MINUET_OF_FOREST_WARP] = Region("Minuet of Forest Warp", "", {RA_LINKS_POCKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_MINUET_OF_FOREST_WARP] = Region("Minuet of Forest Warp", SCENE_ID_MAX, TIME_DOESNT_PASS, {RA_LINKS_POCKET}, {}, {}, { //Exits Entrance(RR_SACRED_FOREST_MEADOW, []{return true;}), }); - areaTable[RR_BOLERO_OF_FIRE_WARP] = Region("Bolero of Fire Warp", "", {RA_LINKS_POCKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_BOLERO_OF_FIRE_WARP] = Region("Bolero of Fire Warp", SCENE_ID_MAX, TIME_DOESNT_PASS, {RA_LINKS_POCKET}, {}, {}, { //Exits Entrance(RR_DMC_CENTRAL_LOCAL, []{return true;}), }); - areaTable[RR_SERENADE_OF_WATER_WARP] = Region("Serenade of Water Warp", "", {RA_LINKS_POCKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SERENADE_OF_WATER_WARP] = Region("Serenade of Water Warp", SCENE_ID_MAX, TIME_DOESNT_PASS, {RA_LINKS_POCKET}, {}, {}, { //Exits Entrance(RR_LAKE_HYLIA, []{return true;}), }); - areaTable[RR_REQUIEM_OF_SPIRIT_WARP] = Region("Requiem of Spirit Warp", "", {RA_LINKS_POCKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_REQUIEM_OF_SPIRIT_WARP] = Region("Requiem of Spirit Warp", SCENE_ID_MAX, TIME_DOESNT_PASS, {RA_LINKS_POCKET}, {}, {}, { //Exits Entrance(RR_DESERT_COLOSSUS, []{return true;}), }); - areaTable[RR_NOCTURNE_OF_SHADOW_WARP] = Region("Nocturne of Shadow Warp", "", {RA_LINKS_POCKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_NOCTURNE_OF_SHADOW_WARP] = Region("Nocturne of Shadow Warp", SCENE_ID_MAX, TIME_DOESNT_PASS, {RA_LINKS_POCKET}, {}, {}, { //Exits Entrance(RR_GRAVEYARD_WARP_PAD_REGION, []{return true;}), }); - areaTable[RR_PRELUDE_OF_LIGHT_WARP] = Region("Prelude of Light Warp", "", {RA_LINKS_POCKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_PRELUDE_OF_LIGHT_WARP] = Region("Prelude of Light Warp", SCENE_ID_MAX, TIME_DOESNT_PASS, {RA_LINKS_POCKET}, {}, {}, { //Exits Entrance(RR_TEMPLE_OF_TIME, []{return true;}), }); @@ -599,7 +892,7 @@ void ResetAllLocations() { bool HasTimePassAccess(uint8_t age) { for (const RandomizerRegion regionKey : GetAllRegions()) { auto region = RegionTable(regionKey); - if (region->timePass && + if (region->TimePass() && ((age == RO_AGE_CHILD && region->Child()) || (age == RO_AGE_ADULT && region->Adult()))) { return true; } diff --git a/soh/soh/Enhancements/randomizer/location_access.h b/soh/soh/Enhancements/randomizer/location_access.h index 733623cb4..2b491f907 100644 --- a/soh/soh/Enhancements/randomizer/location_access.h +++ b/soh/soh/Enhancements/randomizer/location_access.h @@ -9,6 +9,9 @@ #include "soh/Enhancements/randomizer/context.h" #include "soh/Enhancements/randomizer/logic.h" +#define TIME_PASSES true +#define TIME_DOESNT_PASS false + typedef bool (*ConditionFn)(); // I hate this but every alternative I can think of right now is worse @@ -114,14 +117,16 @@ enum class EntranceType; class Region { public: Region(); - Region(std::string regionName_, std::string scene_, std::set areas, bool timePass_, + Region(std::string regionName_, SceneID scene_, bool timePass, std::set areas, std::vector events_, std::vector locations_, std::list exits_); + Region(std::string regionName_, SceneID scene_, std::vector events_, + std::vector locations_, std::list exits_); ~Region(); std::string regionName; - std::string scene; - std::set areas; + SceneID scene; bool timePass; + std::set areas; std::vector events; std::vector locations; std::list exits; @@ -138,6 +143,8 @@ class Region { bool adultNight = false; bool addedToPool = false; + bool TimePass(); + void ApplyTimePass(); bool UpdateEvents(); @@ -337,9 +344,6 @@ bool ChildCanAccess(const RandomizerRegion region); bool AdultCanAccess(const RandomizerRegion region); bool HasAccessTo(const RandomizerRegion region); -#define DAY_NIGHT_CYCLE true -#define NO_DAY_NIGHT_CYCLE false - namespace Regions { extern void AccessReset(); extern void ResetAllLocations(); diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp index 8a8393ba1..e352db5d8 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp @@ -7,7 +7,7 @@ using namespace Rando; void RegionTable_Init_BottomOfTheWell() { // clang-format off // Vanilla/MQ Decider - areaTable[RR_BOTTOM_OF_THE_WELL_ENTRYWAY] = Region("Bottom of the Well Entryway", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_ENTRYWAY] = Region("Bottom of the Well Entryway", SCENE_BOTTOM_OF_THE_WELL, {}, {}, { //Exits //Technically involves an fake wall, but passing it lensless is intended in vanilla and it is well telegraphed Entrance(RR_BOTTOM_OF_THE_WELL_PERIMETER, []{return ctx->GetDungeon(Rando::BOTTOM_OF_THE_WELL)->IsVanilla() && logic->IsChild && logic->CanPassEnemy(RE_BIG_SKULLTULA);}), @@ -17,7 +17,7 @@ void RegionTable_Init_BottomOfTheWell() { #pragma region Vanilla - areaTable[RR_BOTTOM_OF_THE_WELL_PERIMETER] = Region("Bottom of the Well Perimeter", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_BOTTOM_OF_THE_WELL_PERIMETER] = Region("Bottom of the Well Perimeter", SCENE_BOTTOM_OF_THE_WELL, { //Events EventAccess(&logic->StickPot, []{return true;}), EventAccess(&logic->NutPot, []{return true;}), @@ -44,7 +44,7 @@ void RegionTable_Init_BottomOfTheWell() { }); //This region combines the Middle with the perimeter's hidden areas. If a warp puts link into the middle without crossing the perimeter or using lens, it will need it's own region - areaTable[RR_BOTTOM_OF_THE_WELL_BEHIND_FAKE_WALLS] = Region("Bottom of the Well Behind Fake Walls", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_BEHIND_FAKE_WALLS] = Region("Bottom of the Well Behind Fake Walls", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations LOCATION(RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, true), LOCATION(RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, true), @@ -62,7 +62,7 @@ void RegionTable_Init_BottomOfTheWell() { }); //This area can be reached without lens in logic from basement, but that could require silver rupees if they are shuffled. - areaTable[RR_BOTTOM_OF_THE_WELL_SOUTHWEST_ROOM] = Region("Bottom of the Well Southwest Room", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_SOUTHWEST_ROOM] = Region("Bottom of the Well Southwest Room", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations LOCATION(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1, logic->CanBreakPots()), LOCATION(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2, logic->CanBreakPots()), @@ -73,7 +73,7 @@ void RegionTable_Init_BottomOfTheWell() { }); //Passing through this area needs lens, but entering doesn't, so that the fire keese can be killed without crossing the pits if enemy drops are ever shuffled - areaTable[RR_BOTTOM_OF_THE_WELL_KEESE_BEAMOS_ROOM] = Region("Bottom of the Well Keese-Beamos Room", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_KEESE_BEAMOS_ROOM] = Region("Bottom of the Well Keese-Beamos Room", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations LOCATION(RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, ctx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)), LOCATION(RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1, logic->CanBreakPots() && (ctx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH))), @@ -85,7 +85,7 @@ void RegionTable_Init_BottomOfTheWell() { Entrance(RR_BOTTOM_OF_THE_WELL_BASEMENT_USEFUL_BOMB_FLOWERS, []{return ctx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH);}), }); - areaTable[RR_BOTTOM_OF_THE_WELL_LIKE_LIKE_CAGE] = Region("Bottom of the Well Like-Like Cage", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_LIKE_LIKE_CAGE] = Region("Bottom of the Well Like-Like Cage", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations LOCATION(RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, true), LOCATION(RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), @@ -95,7 +95,7 @@ void RegionTable_Init_BottomOfTheWell() { }); //If the player can voidwarp into one of these rooms they will need splitting up, and Fake walls will need specifying into middle and the rest moved to perimeter - areaTable[RR_BOTTOM_OF_THE_WELL_INNER_ROOMS] = Region("Bottom of the Well Inner Rooms", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_BOTTOM_OF_THE_WELL_INNER_ROOMS] = Region("Bottom of the Well Inner Rooms", SCENE_BOTTOM_OF_THE_WELL, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), @@ -108,7 +108,7 @@ void RegionTable_Init_BottomOfTheWell() { Entrance(RR_BOTTOM_OF_THE_WELL_BEHIND_FAKE_WALLS, []{return logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 3);}), }); - areaTable[RR_BOTTOM_OF_THE_WELL_COFFIN_ROOM] = Region("Bottom of the Well Coffin Room", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_COFFIN_ROOM] = Region("Bottom of the Well Coffin Room", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations LOCATION(RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW)), LOCATION(RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_FRONT_LEFT_HEART, true), @@ -118,7 +118,7 @@ void RegionTable_Init_BottomOfTheWell() { Entrance(RR_BOTTOM_OF_THE_WELL_PERIMETER, []{return logic->LoweredWaterInsideBotw || logic->HasItem(RG_BRONZE_SCALE);}), }); - areaTable[RR_BOTTOM_OF_THE_WELL_DEAD_HAND_ROOM] = Region("Bottom of the Well Dead Hand Room", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_DEAD_HAND_ROOM] = Region("Bottom of the Well Dead Hand Room", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations LOCATION(RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, logic->CanKillEnemy(RE_DEAD_HAND)), LOCATION(RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, (ctx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH))), @@ -128,7 +128,7 @@ void RegionTable_Init_BottomOfTheWell() { Entrance(RR_BOTTOM_OF_THE_WELL_PERIMETER, []{return logic->IsChild && logic->CanKillEnemy(RE_DEAD_HAND);}), }); - areaTable[RR_BOTTOM_OF_THE_WELL_BASEMENT] = Region("Bottom of the Well Basement", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_BASEMENT] = Region("Bottom of the Well Basement", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations LOCATION(RC_BOTTOM_OF_THE_WELL_MAP_CHEST, logic->BlastOrSmash()), LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, logic->CanBreakPots()), @@ -164,7 +164,7 @@ void RegionTable_Init_BottomOfTheWell() { Entrance(RR_BOTTOM_OF_THE_WELL_BASEMENT_USEFUL_BOMB_FLOWERS, []{return Here(RR_BOTTOM_OF_THE_WELL_BASEMENT, []{return logic->BlastOrSmash() || logic->CanUse(RG_DINS_FIRE) || (logic->CanUse(RG_STICKS) && ctx->GetTrickOption(RT_BOTW_BASEMENT));});}), }); - areaTable[RR_BOTTOM_OF_THE_WELL_BASEMENT_USEFUL_BOMB_FLOWERS] = Region("Bottom of the Well Basement Useful Bomb Flowers", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_BASEMENT_USEFUL_BOMB_FLOWERS] = Region("Bottom of the Well Basement Useful Bomb Flowers", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations //Assumes RR_BOTTOM_OF_THE_WELL_BASEMENT access LOCATION(RC_BOTTOM_OF_THE_WELL_MAP_CHEST, logic->HasItem(RG_GORONS_BRACELET)), @@ -173,7 +173,7 @@ void RegionTable_Init_BottomOfTheWell() { Entrance(RR_BOTTOM_OF_THE_WELL_BASEMENT, []{return logic->CanDetonateUprightBombFlower();}), }); - areaTable[RR_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM] = Region("Bottom of the Well Basement Platform", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM] = Region("Bottom of the Well Basement Platform", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, true), LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, true), @@ -189,7 +189,7 @@ void RegionTable_Init_BottomOfTheWell() { #pragma region MQ - areaTable[RR_BOTTOM_OF_THE_WELL_MQ_PERIMETER] = Region("Bottom of the Well MQ Perimeter", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_BOTTOM_OF_THE_WELL_MQ_PERIMETER] = Region("Bottom of the Well MQ Perimeter", SCENE_BOTTOM_OF_THE_WELL, { //Events //technically obsolete due to a wonder item fairy which only needs a projectile, but we don't have an event var for it yet EventAccess(&logic->FairyPot, []{return Here(RR_BOTTOM_OF_THE_WELL_MQ_PERIMETER, []{return logic->BlastOrSmash();}) && logic->CanHitEyeTargets();}), @@ -214,7 +214,7 @@ void RegionTable_Init_BottomOfTheWell() { Entrance(RR_BOTTOM_OF_THE_WELL_MQ_BASEMENT, []{return true;}), }); - areaTable[RR_BOTTOM_OF_THE_WELL_MQ_WEST_ROOM_SWITCH] = Region("Bottom of the Well MQ West Room Switch", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_BOTTOM_OF_THE_WELL_MQ_WEST_ROOM_SWITCH] = Region("Bottom of the Well MQ West Room Switch", SCENE_BOTTOM_OF_THE_WELL, { //Events EventAccess(&logic->OpenedWestRoomMQBotw, []{return true;}), }, {}, { @@ -224,7 +224,7 @@ void RegionTable_Init_BottomOfTheWell() { Entrance(RR_BOTTOM_OF_THE_WELL_MQ_BASEMENT, []{return true;}), }); - areaTable[RR_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM] = Region("Bottom of the Well MQ Coffin Room", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM] = Region("Bottom of the Well MQ Coffin Room", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW)), @@ -234,7 +234,7 @@ void RegionTable_Init_BottomOfTheWell() { Entrance(RR_BOTTOM_OF_THE_WELL_MQ_PERIMETER, []{return (logic->LoweredWaterInsideBotw || logic->HasItem(RG_BRONZE_SCALE)) && logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 2);}), }); - areaTable[RR_BOTTOM_OF_THE_WELL_MQ_LOCKED_CAGE] = Region("Bottom of the Well MQ Locked Cage", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_BOTTOM_OF_THE_WELL_MQ_LOCKED_CAGE] = Region("Bottom of the Well MQ Locked Cage", SCENE_BOTTOM_OF_THE_WELL, { //Events EventAccess(&logic->OpenedMiddleHoleMQBotw, []{return logic->HasExplosives();}), }, {}, { @@ -242,7 +242,7 @@ void RegionTable_Init_BottomOfTheWell() { Entrance(RR_BOTTOM_OF_THE_WELL_MQ_PERIMETER, []{return logic->IsChild && logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 2);}), }); - areaTable[RR_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_ROOM] = Region("Bottom of the Well MQ Dead Hand Room", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_ROOM] = Region("Bottom of the Well MQ Dead Hand Room", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, logic->CanKillEnemy(RE_DEAD_HAND)), LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, logic->HasExplosives() || (ctx->GetTrickOption(RT_BOTW_MQ_DEADHAND_KEY) && logic->CanUse(RG_BOOMERANG))), @@ -256,7 +256,7 @@ void RegionTable_Init_BottomOfTheWell() { Entrance(RR_BOTTOM_OF_THE_WELL_MQ_PERIMETER, []{return logic->IsChild && logic->CanKillEnemy(RE_DEAD_HAND);}), }); - areaTable[RR_BOTTOM_OF_THE_WELL_MQ_MIDDLE] = Region("Bottom of the Well MQ Middle", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_MQ_MIDDLE] = Region("Bottom of the Well MQ Middle", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, true), //This location technically involves an invisible platform, but it's intended to do lensless in vanilla and is clearly signposted by pots. @@ -283,7 +283,7 @@ void RegionTable_Init_BottomOfTheWell() { Entrance(RR_BOTTOM_OF_THE_WELL_MQ_BASEMENT, []{return true;}), }); - areaTable[RR_BOTTOM_OF_THE_WELL_MQ_BASEMENT] = Region("Bottom of the Well MQ Basement", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_MQ_BASEMENT] = Region("Bottom of the Well MQ Basement", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations //behind invisible big skulltulas, but with navi spotting it's easy to avoid them, or at worst, tank your way through as they do not block the path LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), @@ -296,7 +296,7 @@ void RegionTable_Init_BottomOfTheWell() { Entrance(RR_BOTTOM_OF_THE_WELL_MQ_PERIMETER, []{return true;}), }); - areaTable[RR_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SWITCH_PLATFORM] = Region("Bottom of the Well MQ Basement Switch Platform", "Bottom of the Well", {RA_BOTTOM_OF_THE_WELL}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SWITCH_PLATFORM] = Region("Bottom of the Well MQ Basement Switch Platform", SCENE_BOTTOM_OF_THE_WELL, {}, { //Locations //Assumes RR_BOTTOM_OF_THE_WELL_MQ_BASEMENT access //it is technically possible to get the chest before you get screamed at without rolling, but hard enough to be a trick if that is the requirement for something to be logical diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp index 487e9678a..1d98e861a 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/deku_tree.cpp @@ -7,7 +7,7 @@ using namespace Rando; void RegionTable_Init_DekuTree() { // clang-format off // Vanilla/MQ Decider - areaTable[RR_DEKU_TREE_ENTRYWAY] = Region("Deku Tree Entryway", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DEKU_TREE_ENTRYWAY] = Region("Deku Tree Entryway", SCENE_DEKU_TREE, {}, {}, { //Exits Entrance(RR_DEKU_TREE_LOBBY, []{return ctx->GetDungeon(DEKU_TREE)->IsVanilla();}), Entrance(RR_DEKU_TREE_MQ_1F, []{return ctx->GetDungeon(DEKU_TREE)->IsMQ();}), @@ -16,7 +16,7 @@ void RegionTable_Init_DekuTree() { #pragma region Vanilla - areaTable[RR_DEKU_TREE_LOBBY] = Region("Deku Tree Lobby", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_LOBBY] = Region("Deku Tree Lobby", SCENE_DEKU_TREE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), @@ -40,13 +40,13 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_BOSS_ENTRYWAY, []{return false;}), }); - areaTable[RR_DEKU_TREE_2F_MIDDLE_ROOM] = Region("Deku Tree 2F Middle Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DEKU_TREE_2F_MIDDLE_ROOM] = Region("Deku Tree 2F Middle Room", SCENE_DEKU_TREE, {}, {}, { //Exits Entrance(RR_DEKU_TREE_LOBBY, []{return Here(RR_DEKU_TREE_2F_MIDDLE_ROOM, []{return logic->CanReflectNuts() || logic->CanUse(RG_MEGATON_HAMMER);});}), Entrance(RR_DEKU_TREE_SLINGSHOT_ROOM, []{return Here(RR_DEKU_TREE_2F_MIDDLE_ROOM, []{return logic->CanReflectNuts() || logic->CanUse(RG_MEGATON_HAMMER);});}), }); - areaTable[RR_DEKU_TREE_SLINGSHOT_ROOM] = Region("Deku Tree Slingshot Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_SLINGSHOT_ROOM] = Region("Deku Tree Slingshot Room", SCENE_DEKU_TREE, {}, { //Locations LOCATION(RC_DEKU_TREE_SLINGSHOT_CHEST, true), LOCATION(RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, true), @@ -59,7 +59,7 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_2F_MIDDLE_ROOM, []{return logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_HOVER_BOOTS);}), }); - areaTable[RR_DEKU_TREE_COMPASS_ROOM] = Region("Deku Tree Compass Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_COMPASS_ROOM] = Region("Deku Tree Compass Room", SCENE_DEKU_TREE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), @@ -76,7 +76,7 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_BOSS_ENTRYWAY, []{return false;}), }); - areaTable[RR_DEKU_TREE_BASEMENT_LOWER] = Region("Deku Tree Basement Lower", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_BASEMENT_LOWER] = Region("Deku Tree Basement Lower", SCENE_DEKU_TREE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), @@ -95,7 +95,7 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_OUTSIDE_BOSS_ROOM, []{return false;}), }); - areaTable[RR_DEKU_TREE_BASEMENT_SCRUB_ROOM] = Region("Deku Tree Basement Scrub Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_BASEMENT_SCRUB_ROOM] = Region("Deku Tree Basement Scrub Room", SCENE_DEKU_TREE, {}, { //Location LOCATION(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_1, logic->CanCutShrubs()), LOCATION(RC_DEKU_TREE_BASEMENT_SCRUB_ROOM_GRASS_2, logic->CanCutShrubs()), @@ -107,13 +107,13 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_BASEMENT_WATER_ROOM_FRONT, []{return Here(RR_DEKU_TREE_BASEMENT_SCRUB_ROOM, []{return logic->CanHitEyeTargets();});}), }); - areaTable[RR_DEKU_TREE_BASEMENT_WATER_ROOM_FRONT] = Region("Deku Tree Basement Water Room Front", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DEKU_TREE_BASEMENT_WATER_ROOM_FRONT] = Region("Deku Tree Basement Water Room Front", SCENE_DEKU_TREE, {}, {}, { //Exits Entrance(RR_DEKU_TREE_BASEMENT_SCRUB_ROOM, []{return true;}), Entrance(RR_DEKU_TREE_BASEMENT_WATER_ROOM_BACK, []{return logic->HasItem(RG_BRONZE_SCALE) || ctx->GetTrickOption(RT_DEKU_B1_BACKFLIP_OVER_SPIKED_LOG);}), }); - areaTable[RR_DEKU_TREE_BASEMENT_WATER_ROOM_BACK] = Region("Deku Tree Basement Water Room Back", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_BASEMENT_WATER_ROOM_BACK] = Region("Deku Tree Basement Water Room Back", SCENE_DEKU_TREE, {}, { //Locations LOCATION(RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_1, logic->CanCutShrubs()), LOCATION(RC_DEKU_TREE_BASEMENT_SPIKE_ROLLER_GRASS_2, logic->CanCutShrubs()), @@ -123,7 +123,7 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_BASEMENT_TORCH_ROOM, []{return true;}), }); - areaTable[RR_DEKU_TREE_BASEMENT_TORCH_ROOM] = Region("Deku Tree Basement Torch Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_BASEMENT_TORCH_ROOM] = Region("Deku Tree Basement Torch Room", SCENE_DEKU_TREE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), @@ -137,7 +137,7 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_BASEMENT_BACK_LOBBY, []{return Here(RR_DEKU_TREE_BASEMENT_TORCH_ROOM, []{return logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW);});}), }); - areaTable[RR_DEKU_TREE_BASEMENT_BACK_LOBBY] = Region("Deku Tree Basement Back Lobby", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_BASEMENT_BACK_LOBBY] = Region("Deku Tree Basement Back Lobby", SCENE_DEKU_TREE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), @@ -152,7 +152,7 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_BASEMENT_UPPER, []{return Here(RR_DEKU_TREE_BASEMENT_BACK_LOBBY, []{return logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW);}) && logic->IsChild;}), }); - areaTable[RR_DEKU_TREE_BASEMENT_BACK_ROOM] = Region("Deku Tree Basement Back Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_BASEMENT_BACK_ROOM] = Region("Deku Tree Basement Back Room", SCENE_DEKU_TREE, {}, { //Locations LOCATION(RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM, logic->HookshotOrBoomerang()), }, { @@ -160,7 +160,7 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_BASEMENT_BACK_LOBBY, []{return true;}), }); - areaTable[RR_DEKU_TREE_BASEMENT_UPPER] = Region("Deku Tree Basement Upper", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_BASEMENT_UPPER] = Region("Deku Tree Basement Upper", SCENE_DEKU_TREE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), @@ -171,7 +171,7 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_OUTSIDE_BOSS_ROOM, []{return Here(RR_DEKU_TREE_BASEMENT_UPPER, []{return logic->HasFireSourceWithTorch() || (ctx->GetTrickOption(RT_DEKU_B1_BOW_WEBS) && logic->IsAdult && logic->CanUse(RG_FAIRY_BOW));});}), }); - areaTable[RR_DEKU_TREE_OUTSIDE_BOSS_ROOM] = Region("Deku Tree Outside Boss Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_OUTSIDE_BOSS_ROOM] = Region("Deku Tree Outside Boss Room", SCENE_DEKU_TREE, {}, { //Locations LOCATION(RC_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), LOCATION(RC_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), @@ -189,7 +189,7 @@ void RegionTable_Init_DekuTree() { #pragma region MQ - areaTable[RR_DEKU_TREE_MQ_1F] = Region("Deku Tree MQ 1F", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_MQ_1F] = Region("Deku Tree MQ 1F", SCENE_DEKU_TREE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanKillEnemy(RE_WITHERED_DEKU_BABA);}), EventAccess(&logic->BrokeDeku1FWeb, []{return logic->HasFireSource();}), @@ -212,7 +212,7 @@ void RegionTable_Init_DekuTree() { //is it possible to recoil from here to the ledge with a trick? }); - areaTable[RR_DEKU_TREE_MQ_2F] = Region("Deku Tree MQ 2F", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_MQ_2F] = Region("Deku Tree MQ 2F", SCENE_DEKU_TREE, {}, { //Locations LOCATION(RC_DEKU_TREE_MQ_MAP_CHEST, true), LOCATION(RC_DEKU_TREE_MQ_GS_LOBBY, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), @@ -228,7 +228,7 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_MQ_EYE_TARGET_ROOM, []{return Here(RR_DEKU_TREE_MQ_2F, []{return logic->HasFireSource();});}), }); - areaTable[RR_DEKU_TREE_MQ_3F] = Region("Deku Tree MQ 3F", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_MQ_3F] = Region("Deku Tree MQ 3F", SCENE_DEKU_TREE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), @@ -253,7 +253,7 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_MQ_BASEMENT, []{return true;}), }); - areaTable[RR_DEKU_TREE_MQ_EYE_TARGET_ROOM] = Region("Deku Tree MQ Eye Target Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_MQ_EYE_TARGET_ROOM] = Region("Deku Tree MQ Eye Target Room", SCENE_DEKU_TREE, {}, { //Locations LOCATION(RC_DEKU_TREE_MQ_DEKU_BABA_HEART, true), LOCATION(RC_DEKU_TREE_MQ_BEFORE_COMPASS_GRASS_1, logic->CanCutShrubs()), @@ -269,7 +269,7 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_MQ_2F, []{return true;}), }); - areaTable[RR_DEKU_TREE_MQ_COMPASS_ROOM] = Region("Deku Tree MQ Compass Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_MQ_COMPASS_ROOM] = Region("Deku Tree MQ Compass Room", SCENE_DEKU_TREE, {}, { //Locations LOCATION(RC_DEKU_TREE_MQ_COMPASS_CHEST, true), LOCATION(RC_DEKU_TREE_MQ_COMPASS_GRASS_1, logic->CanCutShrubs()), @@ -282,7 +282,7 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_MQ_PAST_BOULDER_VINES, []{return Here(RR_DEKU_TREE_MQ_COMPASS_ROOM, []{return logic->CanUse(RG_BOMBCHU_5) || (logic->CanUse(RG_BOMB_BAG) && (logic->CanUse(RG_SONG_OF_TIME) || logic->IsAdult || logic->CanUse(RG_HOVER_BOOTS))) || (logic->CanUse(RG_MEGATON_HAMMER) && (logic->CanUse(RG_SONG_OF_TIME) || ctx->GetTrickOption(RT_DEKU_MQ_COMPASS_GS)));});}), }); - areaTable[RR_DEKU_TREE_MQ_PAST_BOULDER_VINES] = Region("Deku Tree MQ Past Boulder Vines", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_MQ_PAST_BOULDER_VINES] = Region("Deku Tree MQ Past Boulder Vines", SCENE_DEKU_TREE, {}, { //Locations LOCATION(RC_DEKU_TREE_MQ_GS_PAST_BOULDER_VINES, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), LOCATION(RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, true), @@ -291,7 +291,7 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_MQ_COMPASS_ROOM, []{return logic->BlastOrSmash();}), }); - areaTable[RR_DEKU_TREE_MQ_BASEMENT] = Region("Deku Tree MQ Basement", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_MQ_BASEMENT] = Region("Deku Tree MQ Basement", SCENE_DEKU_TREE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), @@ -311,7 +311,7 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_MQ_BASEMENT_LEDGE, []{return ctx->GetTrickOption(RT_DEKU_B1_SKIP) || logic->PushedDekuBasementBlock || logic->IsAdult || logic->CanUse(RG_HOVER_BOOTS);}), }); - areaTable[RR_DEKU_TREE_MQ_BASEMENT_SOUTHEAST_ROOM] = Region("Deku Tree MQ Southeast Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_MQ_BASEMENT_SOUTHEAST_ROOM] = Region("Deku Tree MQ Southeast Room", SCENE_DEKU_TREE, { //Events //Implies CanKillEnemy(RE_GOHMA_LARVA) EventAccess(&logic->ClearedMQDekuSERoom, []{return logic->CanKillEnemy(RE_MAD_SCRUB);}), @@ -327,7 +327,7 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_MQ_BASEMENT, []{return logic->ClearedMQDekuSERoom;}), }); - areaTable[RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_FRONT] = Region("Deku Tree MQ Basement Water Room Front", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_FRONT] = Region("Deku Tree MQ Basement Water Room Front", SCENE_DEKU_TREE, { //Events //It's possible to get this with bow if you have move while in first person and one-point skips on, noticeably harder and jankier as child, but that's a trick EventAccess(&logic->MQDekuWaterRoomTorches, []{return logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_STICKS) && (ctx->GetTrickOption(RT_DEKU_MQ_LOG) || (logic->IsChild && logic->CanShield())));}), @@ -343,7 +343,7 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_MQ_BASEMENT_SOUTHEAST_ROOM, []{return true;}), }); - areaTable[RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_BACK] = Region("Deku Tree MQ Basement Water Room Back", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_BACK] = Region("Deku Tree MQ Basement Water Room Back", SCENE_DEKU_TREE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanKillEnemy(RE_WITHERED_DEKU_BABA);}), EventAccess(&logic->MQDekuWaterRoomTorches, []{return logic->HasFireSource();}), @@ -359,7 +359,7 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_FRONT, []{return ctx->GetTrickOption(RT_DEKU_MQ_LOG) || (logic->IsChild && logic->CanShield()) || logic->CanUse(RG_LONGSHOT) || logic->HasItem(RG_BRONZE_SCALE) || (logic->CanUse(RG_IRON_BOOTS) && (logic->IsAdult || logic->CanUse(RG_HOOKSHOT)));}), }); - areaTable[RR_DEKU_TREE_MQ_BASEMENT_SOUTHWEST_ROOM] = Region("Deku Tree MQ Basement Southwest Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_MQ_BASEMENT_SOUTHWEST_ROOM] = Region("Deku Tree MQ Basement Southwest Room", SCENE_DEKU_TREE, {}, { //Locations LOCATION(RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_1, logic->CanCutShrubs()), LOCATION(RC_DEKU_TREE_MQ_BASEMENT_LARVAE_GRASS_2, logic->CanCutShrubs()), @@ -370,7 +370,7 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_MQ_BASEMENT_WATER_ROOM_BACK, []{return Here(RR_DEKU_TREE_MQ_BASEMENT_SOUTHWEST_ROOM, []{return logic->CanKillEnemy(RE_MAD_SCRUB) && logic->CanKillEnemy(RE_KEESE);});}), }); - areaTable[RR_DEKU_TREE_MQ_BASEMENT_GRAVE_ROOM] = Region("Deku Tree MQ Basement Grave Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_MQ_BASEMENT_GRAVE_ROOM] = Region("Deku Tree MQ Basement Grave Room", SCENE_DEKU_TREE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}) @@ -390,7 +390,7 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_MQ_BASEMENT_BACK_ROOM, []{return Here(RR_DEKU_TREE_MQ_BASEMENT_GRAVE_ROOM, []{return logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW);});}), }); - areaTable[RR_DEKU_TREE_MQ_BASEMENT_BACK_ROOM] = Region("Deku Tree MQ Basement Back Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_MQ_BASEMENT_BACK_ROOM] = Region("Deku Tree MQ Basement Back Room", SCENE_DEKU_TREE, {}, { //Locations LOCATION(RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), LOCATION(RC_DEKU_TREE_MQ_BASEMENT_BACK_GRASS_1, logic->CanCutShrubs()), @@ -401,7 +401,7 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_MQ_BASEMENT_GRAVE_ROOM, []{return true;}), }); - areaTable[RR_DEKU_TREE_MQ_BASEMENT_LEDGE] = Region("Deku Tree MQ Basement Ledge", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_MQ_BASEMENT_LEDGE] = Region("Deku Tree MQ Basement Ledge", SCENE_DEKU_TREE, { //Events EventAccess(&logic->PushedDekuBasementBlock, []{return true;}), }, { @@ -419,7 +419,7 @@ void RegionTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_MQ_OUTSIDE_BOSS_ROOM, []{return Here(RR_DEKU_TREE_MQ_BASEMENT_LEDGE, []{return logic->HasFireSource() || (/*logic->PushedDekuBasementBlock && */logic->CanUse(RG_STICKS));}) && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS));}), }); - areaTable[RR_DEKU_TREE_MQ_OUTSIDE_BOSS_ROOM] = Region("Deku Tree MQ Outside Boss Room", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_TREE_MQ_OUTSIDE_BOSS_ROOM] = Region("Deku Tree MQ Outside Boss Room", SCENE_DEKU_TREE, {}, { //Locations LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), @@ -436,19 +436,18 @@ void RegionTable_Init_DekuTree() { #pragma endregion // Boss Room - // RANDOTODO make it so entrance randomiser can properly handle more than 1 access to that entrance - areaTable[RR_DEKU_TREE_BOSS_ENTRYWAY] = Region("Deku Tree Boss Entryway", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DEKU_TREE_BOSS_ENTRYWAY] = Region("Deku Tree Boss Entryway", SCENE_DEKU_TREE, {}, {}, { // Exits Entrance(RR_DEKU_TREE_BOSS_ROOM, []{return true;}), }); - areaTable[RR_DEKU_TREE_BOSS_EXIT] = Region("Deku Tree Boss Exit", "Deku Tree", {RA_DEKU_TREE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DEKU_TREE_BOSS_EXIT] = Region("Deku Tree Boss Exit", SCENE_DEKU_TREE, {}, {}, { // Exits Entrance(RR_DEKU_TREE_OUTSIDE_BOSS_ROOM, []{return ctx->GetDungeon(DEKU_TREE)->IsVanilla();}), Entrance(RR_DEKU_TREE_MQ_OUTSIDE_BOSS_ROOM, []{return ctx->GetDungeon(DEKU_TREE)->IsMQ();}), }); - areaTable[RR_DEKU_TREE_BOSS_ROOM] = Region("Deku Tree Boss Room", "Deku Tree", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DEKU_TREE_BOSS_ROOM] = Region("Deku Tree Boss Room", SCENE_DEKU_TREE_BOSS, { // Events EventAccess(&logic->DekuTreeClear, []{return logic->CanKillEnemy(RE_GOHMA);}), }, { diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp index 763a3398a..4f56d0f65 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp @@ -7,7 +7,7 @@ using namespace Rando; void RegionTable_Init_DodongosCavern() { // clang-format off // Vanilla/MQ Decider - areaTable[RR_DODONGOS_CAVERN_ENTRYWAY] = Region("Dodongos Cavern Entryway", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_ENTRYWAY] = Region("Dodongos Cavern Entryway", SCENE_DODONGOS_CAVERN, {}, {}, { //Exits Entrance(RR_DODONGOS_CAVERN_BEGINNING, []{return ctx->GetDungeon(DODONGOS_CAVERN)->IsVanilla();}), Entrance(RR_DODONGOS_CAVERN_MQ_BEGINNING, []{return ctx->GetDungeon(DODONGOS_CAVERN)->IsMQ();}), @@ -16,13 +16,13 @@ void RegionTable_Init_DodongosCavern() { #pragma region Vanilla - areaTable[RR_DODONGOS_CAVERN_BEGINNING] = Region("Dodongos Cavern Beginning", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_BEGINNING] = Region("Dodongos Cavern Beginning", SCENE_DODONGOS_CAVERN, {}, {}, { //Exits Entrance(RR_DODONGOS_CAVERN_ENTRYWAY, []{return true;}), Entrance(RR_DODONGOS_CAVERN_LOBBY, []{return Here(RR_DODONGOS_CAVERN_BEGINNING, []{return logic->CanBreakMudWalls() || logic->HasItem(RG_GORONS_BRACELET);});}), }); - areaTable[RR_DODONGOS_CAVERN_LOBBY] = Region("Dodongos Cavern Lobby", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DODONGOS_CAVERN_LOBBY] = Region("Dodongos Cavern Lobby", SCENE_DODONGOS_CAVERN, { //Events EventAccess(&logic->GossipStoneFairy, []{return (Here(RR_DODONGOS_CAVERN_LOBBY, []{return logic->CanBreakMudWalls();}) || logic->HasItem(RG_GORONS_BRACELET)) && logic->CallGossipFairy();}), }, { @@ -43,13 +43,13 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_BOSS_ENTRYWAY, []{return false;}), }); - areaTable[RR_DODONGOS_CAVERN_LOBBY_SWITCH] = Region("Dodongos Cavern Lobby Switch", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_LOBBY_SWITCH] = Region("Dodongos Cavern Lobby Switch", SCENE_DODONGOS_CAVERN, {}, {}, { //Exits Entrance(RR_DODONGOS_CAVERN_LOBBY, []{return true;}), Entrance(RR_DODONGOS_CAVERN_DODONGO_ROOM, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_SE_CORRIDOR] = Region("Dodongos Cavern SE Corridor", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_SE_CORRIDOR] = Region("Dodongos Cavern SE Corridor", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_GS_SCARECROW, logic->CanUse(RG_SCARECROW) || (logic->IsAdult && logic->CanUse(RG_LONGSHOT)) || (ctx->GetTrickOption(RT_DC_SCARECROW_GS) && (logic->CanAttack()))), LOCATION(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_1, logic->CanBreakPots()), @@ -66,7 +66,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_NEAR_LOWER_LIZALFOS, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_SE_ROOM] = Region("Dodongos Cavern SE Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_SE_ROOM] = Region("Dodongos Cavern SE Room", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, logic->CanAttack()), }, { @@ -74,13 +74,13 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_SE_CORRIDOR, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_NEAR_LOWER_LIZALFOS] = Region("Dodongos Cavern Near Lower Lizalfos", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_NEAR_LOWER_LIZALFOS] = Region("Dodongos Cavern Near Lower Lizalfos", SCENE_DODONGOS_CAVERN, {}, {}, { //Exits Entrance(RR_DODONGOS_CAVERN_SE_CORRIDOR, []{return true;}), Entrance(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_LOWER_LIZALFOS] = Region("Dodongos Cavern Lower Lizalfos", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_LOWER_LIZALFOS] = Region("Dodongos Cavern Lower Lizalfos", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_LIZALFOS_POT_1, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_LIZALFOS_POT_2, logic->CanBreakPots()), @@ -93,7 +93,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_DODONGO_ROOM, []{return Here(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, []{return logic->CanKillEnemy(RE_LIZALFOS, ED_CLOSE, true, 2);});}), }); - areaTable[RR_DODONGOS_CAVERN_DODONGO_ROOM] = Region("Dodongos Cavern Dodongo Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_DODONGO_ROOM] = Region("Dodongos Cavern Dodongo Room", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_1, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_2, logic->CanBreakPots()), @@ -106,7 +106,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_NEAR_DODONGO_ROOM, []{return Here(RR_DODONGOS_CAVERN_DODONGO_ROOM, []{return logic->CanBreakMudWalls() || logic->HasItem(RG_GORONS_BRACELET);});}), }); - areaTable[RR_DODONGOS_CAVERN_NEAR_DODONGO_ROOM] = Region("Dodongos Cavern Near Dodongo Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_NEAR_DODONGO_ROOM] = Region("Dodongos Cavern Near Dodongo Room", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, logic->CanStunDeku()), }, { @@ -114,14 +114,14 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_DODONGO_ROOM, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_STAIRS_LOWER] = Region("Dodongos Cavern Stairs Lower", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_STAIRS_LOWER] = Region("Dodongos Cavern Stairs Lower", SCENE_DODONGOS_CAVERN, {}, {}, { //Exits Entrance(RR_DODONGOS_CAVERN_LOBBY, []{return true;}), Entrance(RR_DODONGOS_CAVERN_STAIRS_UPPER, []{return logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET) || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_DC_STAIRCASE) && logic->CanUse(RG_FAIRY_BOW));}), Entrance(RR_DODONGOS_CAVERN_COMPASS_ROOM, []{return Here(RR_DODONGOS_CAVERN_STAIRS_LOWER, []{return logic->CanBreakMudWalls() || logic->HasItem(RG_GORONS_BRACELET);});}), }); - areaTable[RR_DODONGOS_CAVERN_STAIRS_UPPER] = Region("Dodongos Cavern Stairs Upper", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_STAIRS_UPPER] = Region("Dodongos Cavern Stairs Upper", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, Here(RR_DODONGOS_CAVERN_FAR_BRIDGE, []{return logic->HookshotOrBoomerang();}) || logic->CanUse(RG_LONGSHOT)), LOCATION(RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, logic->IsAdult || logic->CanAttack() || (HasAccessTo(RR_DODONGOS_CAVERN_STAIRS_LOWER) && logic->CanUse(RG_LONGSHOT) && ctx->GetTrickOption(RT_DC_VINES_GS))), @@ -135,7 +135,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_ARMOS_ROOM, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_COMPASS_ROOM] = Region("Dodongos Cavern Compass Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_COMPASS_ROOM] = Region("Dodongos Cavern Compass Room", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_COMPASS_CHEST, true), }, { @@ -143,13 +143,13 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_STAIRS_LOWER, []{return logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_MEGATON_HAMMER) || logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET);}), }); - areaTable[RR_DODONGOS_CAVERN_ARMOS_ROOM] = Region("Dodongos Cavern Armos Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_ARMOS_ROOM] = Region("Dodongos Cavern Armos Room", SCENE_DODONGOS_CAVERN, {}, {}, { //Exits Entrance(RR_DODONGOS_CAVERN_STAIRS_UPPER, []{return true;}), Entrance(RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER] = Region("Dodongos Cavern Bomb Room Lower", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER] = Region("Dodongos Cavern Bomb Room Lower", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, true), LOCATION(RC_DODONGOS_CAVERN_BLADE_ROOM_HEART, true), @@ -163,7 +163,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_BOMB_ROOM_UPPER, []{return (logic->IsAdult && ctx->GetTrickOption(RT_DC_JUMP)) || logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && logic->CanUse(RG_LONGSHOT)) || (ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives() && logic->CanJumpslash());}), }); - areaTable[RR_DODONGOS_CAVERN_2F_SIDE_ROOM] = Region("Dodongos Cavern 2F Side Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_2F_SIDE_ROOM] = Region("Dodongos Cavern 2F Side Room", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, logic->CanStunDeku()), LOCATION(RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, logic->CanStunDeku()), @@ -172,7 +172,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_FIRST_SLINGSHOT_ROOM] = Region("Dodongos Cavern First Slingshot Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_FIRST_SLINGSHOT_ROOM] = Region("Dodongos Cavern First Slingshot Room", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_SINGLE_EYE_POT_1, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_SINGLE_EYE_POT_2, logic->CanBreakPots()), @@ -183,7 +183,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_UPPER_LIZALFOS, []{return logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW) || ctx->GetTrickOption(RT_DC_SLINGSHOT_SKIP);}), }); - areaTable[RR_DODONGOS_CAVERN_UPPER_LIZALFOS] = Region("Dodongos Cavern Upper Lizalfos", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_UPPER_LIZALFOS] = Region("Dodongos Cavern Upper Lizalfos", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART, true), LOCATION(RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, true), @@ -195,7 +195,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_SECOND_SLINGSHOT_ROOM, []{return Here(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, []{return logic->CanKillEnemy(RE_LIZALFOS, ED_CLOSE, true, 2);});}), }); - areaTable[RR_DODONGOS_CAVERN_SECOND_SLINGSHOT_ROOM] = Region("Dodongos Cavern Second Slingshot Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_SECOND_SLINGSHOT_ROOM] = Region("Dodongos Cavern Second Slingshot Room", SCENE_DODONGOS_CAVERN, {}, { //Location LOCATION(RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_1, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_2, logic->CanBreakPots()), @@ -205,7 +205,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_BOMB_ROOM_UPPER, []{return logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW) || ctx->GetTrickOption(RT_DC_SLINGSHOT_SKIP);}), }); - areaTable[RR_DODONGOS_CAVERN_BOMB_ROOM_UPPER] = Region("Dodongos Cavern Bomb Room Upper", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_BOMB_ROOM_UPPER] = Region("Dodongos Cavern Bomb Room Upper", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_BOMB_BAG_CHEST, true), LOCATION(RC_DODONGOS_CAVERN_BLADE_POT_1, logic->CanBreakPots()), @@ -217,7 +217,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_FAR_BRIDGE, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_FAR_BRIDGE] = Region("Dodongos Cavern Far Bridge", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_FAR_BRIDGE] = Region("Dodongos Cavern Far Bridge", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, Here(RR_DODONGOS_CAVERN_FAR_BRIDGE, []{return logic->CanBreakMudWalls();})), }, { @@ -226,7 +226,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_BOMB_ROOM_UPPER, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_BOSS_AREA] = Region("Dodongos Cavern Boss Region", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DODONGOS_CAVERN_BOSS_AREA] = Region("Dodongos Cavern Boss Region", SCENE_DODONGOS_CAVERN, { //Events EventAccess(&logic->FairyPot, []{return true;}), }, { @@ -239,7 +239,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_BOSS_ENTRYWAY, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_BACK_ROOM] = Region("Dodongos Cavern Back Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_BACK_ROOM] = Region("Dodongos Cavern Back Room", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_GS_BACK_ROOM, logic->CanAttack()), LOCATION(RC_DODONGOS_CAVERN_BACK_ROOM_POT_1, logic->CanBreakPots()), @@ -255,13 +255,13 @@ void RegionTable_Init_DodongosCavern() { #pragma region MQ - areaTable[RR_DODONGOS_CAVERN_MQ_BEGINNING] = Region("Dodongos Cavern MQ Beginning", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_BEGINNING] = Region("Dodongos Cavern MQ Beginning", SCENE_DODONGOS_CAVERN, {}, {}, { //Exits Entrance(RR_DODONGOS_CAVERN_ENTRYWAY, []{return true;}), Entrance(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return Here(RR_DODONGOS_CAVERN_MQ_BEGINNING, []{return logic->CanBreakMudWalls() || logic->HasItem(RG_GORONS_BRACELET);});}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_LOBBY] = Region("Dodongos Cavern MQ Lobby", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_LOBBY] = Region("Dodongos Cavern MQ Lobby", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_MAP_CHEST, logic->CanBreakMudWalls() || logic->HasItem(RG_GORONS_BRACELET)), LOCATION(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, logic->CanStunDeku()), @@ -277,7 +277,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_BEHIND_MOUTH, []{return Here(RR_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE, []{return logic->HasExplosives() || (logic->ClearMQDCUpperLobbyRocks && logic->HasItem(RG_GORONS_BRACELET) && ((logic->IsAdult && ctx->GetTrickOption(RT_DC_MQ_ADULT_EYES)) || (logic->IsChild && ctx->GetTrickOption(RT_DC_MQ_CHILD_EYES))));});}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_GOSSIP_STONE] = Region("Dodongos Cavern MQ Gossip Stone", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DODONGOS_CAVERN_MQ_GOSSIP_STONE] = Region("Dodongos Cavern MQ Gossip Stone", SCENE_DODONGOS_CAVERN, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairy();}), }, { @@ -290,7 +290,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE] = Region("Dodongos Cavern MQ Mouth Side Bridge", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DODONGOS_CAVERN_MQ_MOUTH_SIDE_BRIDGE] = Region("Dodongos Cavern MQ Mouth Side Bridge", SCENE_DODONGOS_CAVERN, { //Events EventAccess(&logic->ClearMQDCUpperLobbyRocks, []{return logic->BlastOrSmash() || logic->CanUse(RG_DINS_FIRE);}), }, {}, { @@ -302,7 +302,7 @@ void RegionTable_Init_DodongosCavern() { //it is possible to use bunny hood speed, hovers and a jumpslash to go between here and the other bridge (included with TORCH_ROOM_LOWER), but this would be a trick }); - areaTable[RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER] = Region("Dodongos Cavern MQ Stairs Lower", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER] = Region("Dodongos Cavern MQ Stairs Lower", SCENE_DODONGOS_CAVERN, { //Events //EventAccess(&logic->CanClimbDCStairs, []{return logic->HasExplosives || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_DC_STAIRCASE) && logic->CanUse(RG_FAIRY_BOW));}), }, { @@ -321,7 +321,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_PAST_MUD_WALL, []{return Here(RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER, []{return logic->CanBreakMudWalls();});}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_STAIRS_PAST_MUD_WALL] = Region("Dodongos Cavern MQ Stairs Past Mud Wall", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DODONGOS_CAVERN_MQ_STAIRS_PAST_MUD_WALL] = Region("Dodongos Cavern MQ Stairs Past Mud Wall", SCENE_DODONGOS_CAVERN, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), //EventAccess(&logic->CanClimbDCStairs, []{return logic->HasItem(RG_GORONS_BRACELET) && (logic->CanUse(RG_STICKS));}), @@ -334,7 +334,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_STAIRS_UPPER] = Region("Dodongos Cavern MQ Stairs Upper", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_STAIRS_UPPER] = Region("Dodongos Cavern MQ Stairs Upper", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, logic->CanStunDeku()), LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, logic->CanBreakCrates()), @@ -347,7 +347,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_PAST_BIG_SKULLTULAS, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA) || logic->CanUse(RG_HOVER_BOOTS);}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_STAIRS_PAST_BIG_SKULLTULAS] = Region("Dodongos Cavern MQ Past Big Skulltulas", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_STAIRS_PAST_BIG_SKULLTULAS] = Region("Dodongos Cavern MQ Past Big Skulltulas", SCENE_DODONGOS_CAVERN, {}, {}, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_UPPER, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA) || logic->CanUse(RG_HOVER_BOOTS);}), Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER, []{return logic->TakeDamage();}), @@ -357,7 +357,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_DODONGO_ROOM, []{return true;}),//if we add BONKO or other crate logic, logic for silver rupees goes here }); - areaTable[RR_DODONGOS_CAVERN_MQ_DODONGO_ROOM] = Region("Dodongos Cavern MQ Dodongo Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_DODONGO_ROOM] = Region("Dodongos Cavern MQ Dodongo Room", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, logic->CanKillEnemy(RE_DODONGO) || logic->HasItem(RG_GORONS_BRACELET)), LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_GRASS_1, logic->CanCutShrubs()), @@ -370,7 +370,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_LOWER, []{return Here(RR_DODONGOS_CAVERN_MQ_DODONGO_ROOM, []{return logic->CanKillEnemy(RE_DODONGO) || logic->HasItem(RG_GORONS_BRACELET);});}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_LOWER] = Region("Dodongos Cavern MQ Torch Puzzle Lower", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_LOWER] = Region("Dodongos Cavern MQ Torch Puzzle Lower", SCENE_DODONGOS_CAVERN, { //Events EventAccess(&logic->ClearMQDCUpperLobbyRocks, []{return (((logic->IsAdult /*or bunny hood jump*/) && ctx->GetTrickOption(RT_DC_JUMP)) || logic->CanUse(RG_HOVER_BOOTS)) && logic->CanUse(RG_STICKS);}), }, { @@ -387,7 +387,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS, []{return logic->CanUse(RG_STICKS) && logic->HasItem(RG_GORONS_BRACELET);}), //Implies access to RR_DODONGOS_CAVERN_MQ_BIG_BLOCK_ROOM from here }); - areaTable[RR_DODONGOS_CAVERN_MQ_BIG_BLOCK_ROOM] = Region("Dodongos Cavern MQ Big Block Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_BIG_BLOCK_ROOM] = Region("Dodongos Cavern MQ Torch Puzzle Lower", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_1, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_2, logic->CanBreakPots()), @@ -397,7 +397,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS, []{return (logic->HasFireSource() && logic->HasItem(RG_GORONS_BRACELET)) || logic->CanBreakMudWalls();}), //Requires stregnth 0, If you can somehow warp into this room, add logic->CanPassEnemy(RE_BIG_SKULLTULA) }); - areaTable[RR_DODONGOS_CAVERN_MQ_LARVAE_ROOM] = Region("Dodongos Cavern MQ Larvae Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_LARVAE_ROOM] = Region("Dodongos Cavern MQ Larvae Room", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, true), //implied logic->CanKillEnemy(RE_GOHMA_LARVA) based on entry reqs with a trick to kill with nuts LOCATION(RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, logic->CanBreakCrates()), //implied logic->CanKillEnemy(RE_GOLD_SKULTULLA) based on entry reqs. Add crate logic when BONKO is added @@ -412,7 +412,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_LOWER, []{return true;}), //implied logic->CanKillEnemy(RE_GOHMA_LARVA) based on entry reqs with a trick to kill with nuts }); - areaTable[RR_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS] = Region("Dodongos Cavern MQ Before Upper Lizalfos", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS] = Region("Dodongos Cavern MQ Before Upper Lizalfos", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, logic->BlastOrSmash()), //Implied CanGetEnemyDrop(RE_GOLD_SKULLTULA) LOCATION(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1, logic->CanBreakPots()), @@ -427,7 +427,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_TWO_FIRES_ROOM, []{return Here(RR_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS, []{return logic->CanKillEnemy(RE_LIZALFOS);});}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_TWO_FIRES_ROOM] = Region("Dodongos Cavern MQ Two Fires Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_TWO_FIRES_ROOM] = Region("Dodongos Cavern MQ Before Upper Lizalfos", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, logic->CanBreakPots()), @@ -439,7 +439,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_UPPER, []{return logic->IsAdult || (Here(RR_DODONGOS_CAVERN_MQ_TWO_FIRES_ROOM, []{return logic->BlastOrSmash() || (logic->CanAttack() && logic->HasItem(RG_GORONS_BRACELET));}));}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_UPPER] = Region("Dodongos Cavern MQ Torch Puzzle Upper", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_UPPER] = Region("Dodongos Cavern MQ Torch Puzzle Upper", SCENE_DODONGOS_CAVERN, { //Events EventAccess(&logic->ClearMQDCUpperLobbyRocks, []{return logic->CanDetonateUprightBombFlower() || logic->CanUse(RG_MEGATON_HAMMER);}), }, { @@ -454,7 +454,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_TWO_FIRES_ROOM, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_LOWER_RIGHT_SIDE] = Region("Dodongos Cavern MQ Lower Right Side", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_LOWER_RIGHT_SIDE] = Region("Dodongos Cavern MQ Lower Right Side", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, (logic->CanBreakMudWalls() || logic->HasItem(RG_GORONS_BRACELET)) && logic->CanStunDeku()), LOCATION(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1, logic->CanBreakPots()), @@ -467,7 +467,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_LOWER_LIZALFOS, []{return Here(RR_DODONGOS_CAVERN_MQ_LOWER_RIGHT_SIDE, []{return logic->CanDetonateBombFlowers() || logic->HasItem(RG_GORONS_BRACELET);}) && logic->CanHitEyeTargets();}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_LOWER_LIZALFOS] = Region("Dodongos Cavern MQ Lower Lizalfos", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_LOWER_LIZALFOS] = Region("Dodongos Cavern MQ Lower Lizalfos", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_HEART, true), }, { @@ -476,7 +476,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return Here(RR_DODONGOS_CAVERN_MQ_LOWER_LIZALFOS, []{return logic->CanKillEnemy(RE_LIZALFOS);});}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_POES_ROOM] = Region("Dodongos Cavern MQ Poes Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_POES_ROOM] = Region("Dodongos Cavern MQ Poes Room", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, true), //If you can get to the locked part of POES_ROOM without a way to open it or passing the chest, this will need it's own room LOCATION(RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, (Here(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return logic->CanDetonateBombFlowers() || logic->HasItem(RG_GORONS_BRACELET);}) && //could be a seperate room if it gets busy @@ -501,7 +501,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_MAD_SCRUB_ROOM, []{return Here(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return logic->CanDetonateBombFlowers() || logic->HasItem(RG_GORONS_BRACELET);});}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_MAD_SCRUB_ROOM] = Region("Dodongos Cavern Mad Scrub Room", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_MAD_SCRUB_ROOM] = Region("Dodongos Cavern Mad Scrub Room", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, (logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG, true))), //Implies you can avoid/kill the enemies with what you use on the skull, if this assumption is broken, add //&& (Here(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return logic->CanKillEnemy(RE_FIRE_KEESE) && logic->CanKillEnemy(RE_MAD_SCRUB);}) || (logic->CanAvoidEnemy(RE_FIRE_KEESE) && logic->CanAvoidEnemy(RE_MAD_SCRUB))) @@ -512,7 +512,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_POES_ROOM, []{return Here(RR_DODONGOS_CAVERN_MQ_MAD_SCRUB_ROOM, []{return logic->CanKillEnemy(RE_FIRE_KEESE) && logic->CanKillEnemy(RE_MAD_SCRUB);});}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_BEHIND_MOUTH] = Region("Dodongos Cavern MQ Behind Mouth", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_BEHIND_MOUTH] = Region("Dodongos Cavern MQ Behind Mouth", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_SW_POT, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_NE_POT, logic->CanBreakPots()), @@ -527,7 +527,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_BACK_SWITCH_GRAVE, []{return logic->IsAdult;}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_BACK_BEHIND_FIRE] = Region("Dodongos Cavern MQ Back Behind Fire", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DODONGOS_CAVERN_MQ_BACK_BEHIND_FIRE] = Region("Dodongos Cavern MQ Back Behind Fire", SCENE_DODONGOS_CAVERN, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, true), //pulling the grave isn't required, as you can open the chest through it LOCATION(RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1, logic->CanBreakPots()), @@ -540,7 +540,7 @@ void RegionTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_MQ_BACK_SWITCH_GRAVE, []{return Here(RR_DODONGOS_CAVERN_MQ_BACK_BEHIND_FIRE, []{return logic->CanDetonateBombFlowers();}) || Here(RR_DODONGOS_CAVERN_MQ_BACK_SWITCH_GRAVE, []{return logic->CanAttack();});}), }); - areaTable[RR_DODONGOS_CAVERN_MQ_BACK_SWITCH_GRAVE] = Region("Dodongos Cavern MQ BossArea", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DODONGOS_CAVERN_MQ_BACK_SWITCH_GRAVE] = Region("Dodongos Cavern MQ BossArea", SCENE_DODONGOS_CAVERN, { //Events EventAccess(&logic->FairyPot, []{return true;}), }, { @@ -559,19 +559,18 @@ void RegionTable_Init_DodongosCavern() { #pragma endregion // Boss Room - // RANDOTODO make it so entrance randomiser can properly handle more than 1 access to that entrance - areaTable[RR_DODONGOS_CAVERN_BOSS_ENTRYWAY] = Region("Dodongos Cavern Boss Entryway", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_BOSS_ENTRYWAY] = Region("Dodongos Cavern Boss Entryway", SCENE_DODONGOS_CAVERN, {}, {}, { // Exits Entrance(RR_DODONGOS_CAVERN_BOSS_ROOM, []{return true;}), }); - areaTable[RR_DODONGOS_CAVERN_BOSS_EXIT] = Region("Dodongos Cavern Boss Exit", "Dodongos Cavern", {RA_DODONGOS_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_BOSS_EXIT] = Region("Dodongos Cavern Boss Exit", SCENE_DODONGOS_CAVERN, {}, {}, { // Exits Entrance(RR_DODONGOS_CAVERN_BOSS_AREA, []{return ctx->GetDungeon(DODONGOS_CAVERN)->IsVanilla();}), Entrance(RR_DODONGOS_CAVERN_MQ_BEHIND_MOUTH, []{return ctx->GetDungeon(DODONGOS_CAVERN)->IsMQ();}), }); - areaTable[RR_DODONGOS_CAVERN_BOSS_ROOM] = Region("Dodongos Cavern Boss Room", "Dodongos Cavern", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DODONGOS_CAVERN_BOSS_ROOM] = Region("Dodongos Cavern Boss Room", SCENE_DODONGOS_CAVERN_BOSS, { // Events EventAccess(&logic->DodongosCavernClear, []{return Here(RR_DODONGOS_CAVERN_BOSS_ROOM, []{return logic->HasExplosives() || (logic->CanUse(RG_MEGATON_HAMMER) && ctx->GetTrickOption(RT_DC_HAMMER_FLOOR));}) && logic->CanKillEnemy(RE_KING_DODONGO); /*todo add chu kill to tricks*/}), }, { diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp index 834e8a3c3..f57d6bd21 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/fire_temple.cpp @@ -7,7 +7,7 @@ using namespace Rando; void RegionTable_Init_FireTemple() { // clang-format off // Vanilla/MQ Decider - areaTable[RR_FIRE_TEMPLE_ENTRYWAY] = Region("Fire Temple Entryway", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_ENTRYWAY] = Region("Fire Temple Entryway", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_FIRST_ROOM, []{return ctx->GetDungeon(FIRE_TEMPLE)->IsVanilla();}), Entrance(RR_FIRE_TEMPLE_MQ_FIRST_ROOM_LOWER, []{return ctx->GetDungeon(FIRE_TEMPLE)->IsMQ();}), @@ -16,7 +16,7 @@ void RegionTable_Init_FireTemple() { #pragma region Vanilla - areaTable[RR_FIRE_TEMPLE_FIRST_ROOM] = Region("Fire Temple First Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_FIRST_ROOM] = Region("Fire Temple First Room", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_ENTRYWAY, []{return true;}), Entrance(RR_FIRE_TEMPLE_NEAR_BOSS_ROOM, []{return logic->FireTimer() >= 24;}), @@ -25,7 +25,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_BIG_LAVA_ROOM, []{return logic->SmallKeys(RR_FIRE_TEMPLE, 2) && logic->FireTimer() >= 24;}), }); - areaTable[RR_FIRE_TEMPLE_NEAR_BOSS_ROOM] = Region("Fire Temple Near Boss Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FIRE_TEMPLE_NEAR_BOSS_ROOM] = Region("Fire Temple Near Boss Room", SCENE_FIRE_TEMPLE, { //Events EventAccess(&logic->FairyPot, []{return logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT);}), }, { @@ -41,13 +41,13 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, []{return logic->IsAdult && (ctx->GetTrickOption(RT_FIRE_BOSS_DOOR_JUMP) || Here(RR_FIRE_TEMPLE_FIRE_MAZE_UPPER, []{return logic->CanUse(RG_MEGATON_HAMMER);}) || logic->CanUse(RG_HOVER_BOOTS));}), }); - areaTable[RR_FIRE_TEMPLE_LOOP_ENEMIES] = Region("Fire Temple Loop Enemies", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_LOOP_ENEMIES] = Region("Fire Temple Loop Enemies", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_FIRST_ROOM, []{return logic->SmallKeys(RR_FIRE_TEMPLE, 8) || !logic->IsFireLoopLocked;}), Entrance(RR_FIRE_TEMPLE_LOOP_TILES, []{return Here(RR_FIRE_TEMPLE_LOOP_ENEMIES, []{return logic->CanKillEnemy(RE_TORCH_SLUG) && logic->CanKillEnemy(RE_FIRE_KEESE);});}), }); - areaTable[RR_FIRE_TEMPLE_LOOP_TILES] = Region("Fire Temple Loop Tiles", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_LOOP_TILES] = Region("Fire Temple Loop Tiles", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, logic->CanAttack()), }, { @@ -56,7 +56,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_LOOP_FLARE_DANCER, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_LOOP_FLARE_DANCER] = Region("Fire Temple Loop Flare Dancer", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_LOOP_FLARE_DANCER] = Region("Fire Temple Loop Flare Dancer", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_FLARE_DANCER_CHEST, (logic->HasExplosives() || logic->CanUse(RG_MEGATON_HAMMER)) && logic->IsAdult), }, { @@ -65,7 +65,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_LOOP_HAMMER_SWITCH, []{return Here(RR_FIRE_TEMPLE_LOOP_FLARE_DANCER, []{return logic->CanKillEnemy(RE_FLARE_DANCER);});}), }); - areaTable[RR_FIRE_TEMPLE_LOOP_HAMMER_SWITCH] = Region("Fire Temple Loop Hammer Switch", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FIRE_TEMPLE_LOOP_HAMMER_SWITCH] = Region("Fire Temple Loop Hammer Switch", SCENE_FIRE_TEMPLE, { //Events EventAccess(&logic->FireLoopSwitch, []{return logic->CanUse(RG_MEGATON_HAMMER);}), }, {}, { @@ -74,7 +74,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_LOOP_GORON_ROOM, []{return logic->FireLoopSwitch;}), }); - areaTable[RR_FIRE_TEMPLE_LOOP_GORON_ROOM] = Region("Fire Temple Loop Goron Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_LOOP_GORON_ROOM] = Region("Fire Temple Loop Goron Room", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_BOSS_KEY_CHEST, true), }, { @@ -83,13 +83,13 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_LOOP_EXIT, []{return logic->FireLoopSwitch;}), }); - areaTable[RR_FIRE_TEMPLE_LOOP_EXIT] = Region("Fire Temple Loop Exit", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_LOOP_EXIT] = Region("Fire Temple Loop Exit", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_FIRST_ROOM, []{return true;}), Entrance(RR_FIRE_TEMPLE_LOOP_GORON_ROOM, []{return logic->FireLoopSwitch;}), }); - areaTable[RR_FIRE_TEMPLE_BIG_LAVA_ROOM] = Region("Fire Temple Big Lava Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_BIG_LAVA_ROOM] = Region("Fire Temple Big Lava Room", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_BIG_LAVA_POT_1, logic->CanBreakPots()), LOCATION(RC_FIRE_TEMPLE_BIG_LAVA_POT_2, logic->CanBreakPots()), @@ -103,7 +103,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_FIRE_PILLAR_ROOM, []{return logic->SmallKeys(RR_FIRE_TEMPLE, 3);}), }); - areaTable[RR_FIRE_TEMPLE_BIG_LAVA_ROOM_NORTH_GORON] = Region("Fire Temple Big Lava Room North Goron", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_BIG_LAVA_ROOM_NORTH_GORON] = Region("Fire Temple Big Lava Room North Goron", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, true), }, { @@ -111,7 +111,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_BIG_LAVA_ROOM, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_BIG_LAVA_ROOM_NORTH_TILES] = Region("Fire Temple Big Lava Room North Tiles", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_BIG_LAVA_ROOM_NORTH_TILES] = Region("Fire Temple Big Lava Room North Tiles", SCENE_FIRE_TEMPLE, {}, { //Locations //RANDOTODO check if child can reach LOCATION(RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, (logic->IsAdult && logic->CanAttack()) || logic->HookshotOrBoomerang()), @@ -120,7 +120,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_BIG_LAVA_ROOM, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_BIG_LAVA_ROOM_SOUTH_GORON] = Region("Fire Temple Big Lava Room South Goron", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_BIG_LAVA_ROOM_SOUTH_GORON] = Region("Fire Temple Big Lava Room South Goron", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, true), }, { @@ -128,7 +128,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_BIG_LAVA_ROOM, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_FIRE_PILLAR_ROOM] = Region("Fire Temple Fire Pillar Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_FIRE_PILLAR_ROOM] = Region("Fire Temple Fire Pillar Room", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART, logic->FireTimer() >= 56), LOCATION(RC_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART, logic->FireTimer() >= 56), @@ -139,7 +139,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_SHORTCUT_ROOM, []{return logic->FireTimer() >= 56 && logic->SmallKeys(RR_FIRE_TEMPLE, 4);}), }); - areaTable[RR_FIRE_TEMPLE_SHORTCUT_ROOM] = Region("Fire Temple Shortcut Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_SHORTCUT_ROOM] = Region("Fire Temple Shortcut Room", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, Here(RR_FIRE_TEMPLE_SHORTCUT_CLIMB, []{return true;})), }, { @@ -149,13 +149,13 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_BOULDER_MAZE_LOWER, []{return logic->IsAdult && (logic->HasItem(RG_GORONS_BRACELET) || ctx->GetTrickOption(RT_FIRE_STRENGTH)) && (logic->HasExplosives() || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_FAIRY_SLINGSHOT));}), }); - areaTable[RR_FIRE_TEMPLE_SHORTCUT_CLIMB] = Region("Fire Temple Shortcut Climb", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_SHORTCUT_CLIMB] = Region("Fire Temple Shortcut Climb", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_SHORTCUT_ROOM, []{return true;}), Entrance(RR_FIRE_TEMPLE_BOULDER_MAZE_UPPER, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_BOULDER_MAZE_LOWER] = Region("Fire Temple Boulder Maze Lower", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_BOULDER_MAZE_LOWER] = Region("Fire Temple Boulder Maze Lower", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, true), LOCATION(RC_FIRE_TEMPLE_GS_BOULDER_MAZE, logic->HasExplosives() && (logic->IsAdult || logic->HookshotOrBoomerang())), @@ -167,7 +167,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_BOULDER_MAZE_UPPER, []{return false;}), }); - areaTable[RR_FIRE_TEMPLE_BOULDER_MAZE_LOWER_SIDE_ROOM] = Region("Fire Temple Boulder Maze Lower Side Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_BOULDER_MAZE_LOWER_SIDE_ROOM] = Region("Fire Temple Boulder Maze Lower Side Room", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, true), }, { @@ -175,7 +175,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_BOULDER_MAZE_LOWER, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_EAST_CENTRAL_ROOM] = Region("Fire Temple East Central Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_EAST_CENTRAL_ROOM] = Region("Fire Temple East Central Room", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART, true), LOCATION(RC_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART, true), @@ -188,7 +188,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MAP_AREA, []{return logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW);}), }); - areaTable[RR_FIRE_TEMPLE_FIRE_WALL_CHASE] = Region("Fire Temple Fire Wall Chase", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_FIRE_WALL_CHASE] = Region("Fire Temple Fire Wall Chase", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_FIRE_WALL_EAST_HEART, logic->FireTimer() >= 24 && (logic->IsAdult || logic->CanUse(RG_BOOMERANG))), LOCATION(RC_FIRE_TEMPLE_FIRE_WALL_WEST_HEART, logic->FireTimer() >= 24 && (logic->IsAdult || logic->CanUse(RG_BOOMERANG))), @@ -201,7 +201,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_CORRIDOR, []{return logic->FireTimer() >= 24 && logic->IsAdult && logic->SmallKeys(RR_FIRE_TEMPLE, 7);}), }); - areaTable[RR_FIRE_TEMPLE_MAP_AREA] = Region("Fire Temple Map Region", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MAP_AREA] = Region("Fire Temple Map Region", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MAP_CHEST, true), }, { @@ -209,7 +209,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_EAST_CENTRAL_ROOM, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_BOULDER_MAZE_UPPER] = Region("Fire Temple Boulder Maze Upper", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_BOULDER_MAZE_UPPER] = Region("Fire Temple Boulder Maze Upper", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, true), }, { @@ -220,7 +220,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_SCARECROW_ROOM, []{return logic->CanUse(RG_SCARECROW) || (ctx->GetTrickOption(RT_FIRE_SCARECROW) && logic->IsAdult && logic->CanUse(RG_LONGSHOT));}), }); - areaTable[RR_FIRE_TEMPLE_SCARECROW_ROOM] = Region("Fire Temple Scarecrow Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_SCARECROW_ROOM] = Region("Fire Temple Scarecrow Room", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, logic->CanJumpslashExceptHammer() || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG) || logic->HasExplosives() || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_DINS_FIRE)), }, { @@ -229,7 +229,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_EAST_PEAK, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_EAST_PEAK] = Region("Fire Temple East Peak", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_EAST_PEAK] = Region("Fire Temple East Peak", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_SCARECROW_CHEST, true), LOCATION(RC_FIRE_TEMPLE_GS_SCARECROW_TOP, logic->CanUseProjectile()), @@ -239,13 +239,13 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_EAST_CENTRAL_ROOM, []{return logic->TakeDamage();}), }); - areaTable[RR_FIRE_TEMPLE_CORRIDOR] = Region("Fire Temple Corridor", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_CORRIDOR] = Region("Fire Temple Corridor", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_FIRE_WALL_CHASE, []{return logic->SmallKeys(RR_FIRE_TEMPLE, 7);}), Entrance(RR_FIRE_TEMPLE_FIRE_MAZE_ROOM, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_FIRE_MAZE_ROOM] = Region("Fire Temple Fire Maze Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_FIRE_MAZE_ROOM] = Region("Fire Temple Fire Maze Room", SCENE_FIRE_TEMPLE, {}, { // Locations LOCATION(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1, logic->CanBreakPots()), LOCATION(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2, logic->CanBreakPots()), @@ -260,14 +260,14 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_LATE_FIRE_MAZE, []{return ctx->GetTrickOption(RT_FIRE_FLAME_MAZE) || false;}), }); - areaTable[RR_FIRE_TEMPLE_FIRE_MAZE_UPPER] = Region("Fire Temple Fire Maze Upper", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_FIRE_MAZE_UPPER] = Region("Fire Temple Fire Maze Upper", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_NEAR_BOSS_ROOM, []{return logic->CanUse(RG_MEGATON_HAMMER);}), Entrance(RR_FIRE_TEMPLE_FIRE_MAZE_ROOM, []{return true;}), Entrance(RR_FIRE_TEMPLE_WEST_CENTRAL_UPPER, []{return logic->CanUse(RG_MEGATON_HAMMER);}), }); - areaTable[RR_FIRE_TEMPLE_FIRE_MAZE_SIDE_ROOM] = Region("Fire Temple Fire Maze Side Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_FIRE_MAZE_SIDE_ROOM] = Region("Fire Temple Fire Maze Side Room", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_COMPASS_CHEST, true), }, { @@ -275,7 +275,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_FIRE_MAZE_ROOM, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_WEST_CENTRAL_LOWER] = Region("Fire Temple West Central Lower", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_WEST_CENTRAL_LOWER] = Region("Fire Temple West Central Lower", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, Here(RR_FIRE_TEMPLE_WEST_CENTRAL_UPPER, []{return (logic->CanUse(RG_SONG_OF_TIME) || ctx->GetTrickOption(RT_RUSTED_SWITCHES)) && logic->CanUse(RG_MEGATON_HAMMER);})), }, { @@ -285,14 +285,14 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_LATE_FIRE_MAZE, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_WEST_CENTRAL_UPPER] = Region("Fire Temple West Central Upper", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_WEST_CENTRAL_UPPER] = Region("Fire Temple West Central Upper", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_BOSS_ENTRYWAY, []{return false;}), Entrance(RR_FIRE_TEMPLE_FIRE_MAZE_UPPER, []{return true;}), Entrance(RR_FIRE_TEMPLE_WEST_CENTRAL_LOWER, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_LATE_FIRE_MAZE] = Region("Fire Temple Late Fire Maze", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_LATE_FIRE_MAZE] = Region("Fire Temple Late Fire Maze", SCENE_FIRE_TEMPLE, {}, { // Locations LOCATION(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1, logic->CanBreakPots()), LOCATION(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2, logic->CanBreakPots()), @@ -305,19 +305,19 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_UPPER_FLARE_DANCER, []{return logic->HasExplosives();}), }); - areaTable[RR_FIRE_TEMPLE_UPPER_FLARE_DANCER] = Region("Fire Temple Upper Flare Dancer", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_UPPER_FLARE_DANCER] = Region("Fire Temple Upper Flare Dancer", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_LATE_FIRE_MAZE, []{return Here(RR_FIRE_TEMPLE_UPPER_FLARE_DANCER, []{return logic->CanKillEnemy(RE_FLARE_DANCER);});}), Entrance(RR_FIRE_TEMPLE_WEST_CLIMB, []{return Here(RR_FIRE_TEMPLE_UPPER_FLARE_DANCER, []{return logic->CanKillEnemy(RE_FLARE_DANCER);});}), }); - areaTable[RR_FIRE_TEMPLE_WEST_CLIMB] = Region("Fire Temple West Climb", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_WEST_CLIMB] = Region("Fire Temple West Climb", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_UPPER_FLARE_DANCER, []{return true;}), Entrance(RR_FIRE_TEMPLE_WEST_PEAK, []{return logic->CanUseProjectile();}), }); - areaTable[RR_FIRE_TEMPLE_WEST_PEAK] = Region("Fire Temple West Peak", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_WEST_PEAK] = Region("Fire Temple West Peak", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, true), }, { @@ -327,18 +327,17 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_HAMMER_RETURN_PATH, []{return logic->CanUse(RG_MEGATON_HAMMER);}), }); - areaTable[RR_FIRE_TEMPLE_HAMMER_RETURN_PATH] = Region("Fire Temple Hammer Return Path", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, - { + areaTable[RR_FIRE_TEMPLE_HAMMER_RETURN_PATH] = Region("Fire Temple Hammer Return Path", SCENE_FIRE_TEMPLE, {}, { // Locations LOCATION(RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, logic->CanBreakSmallCrates()), LOCATION(RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, logic->CanBreakSmallCrates()), - }, + }, { //Exits Entrance(RR_FIRE_TEMPLE_ABOVE_FIRE_MAZE, []{return logic->CanUse(RG_MEGATON_HAMMER);}), }); - areaTable[RR_FIRE_TEMPLE_ABOVE_FIRE_MAZE] = Region("Fire Temple Above Fire Maze", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_ABOVE_FIRE_MAZE] = Region("Fire Temple Above Fire Maze", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_HAMMER_RETURN_PATH, []{return true;}), Entrance(RR_FIRE_TEMPLE_FIRE_MAZE_UPPER, []{return logic->CanUse(RG_MEGATON_HAMMER);}), @@ -349,7 +348,7 @@ void RegionTable_Init_FireTemple() { #pragma region MQ //potentially dangerous temp flag on the first room's torches, should be made permanent if possible - areaTable[RR_FIRE_TEMPLE_MQ_FIRST_ROOM_LOWER] = Region("Fire Temple MQ First Room Lower", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_FIRST_ROOM_LOWER] = Region("Fire Temple MQ First Room Lower", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_1, logic->CanBreakPots()), LOCATION(RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_2, logic->CanBreakPots()), @@ -361,14 +360,14 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_STALFOS_ROOM, []{return logic->SmallKeys(RR_FIRE_TEMPLE, 5);}), }); - areaTable[RR_FIRE_TEMPLE_MQ_FIRST_ROOM_UPPER] = Region("Fire Temple MQ First Room Upper", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_FIRST_ROOM_UPPER] = Region("Fire Temple MQ First Room Upper", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_MQ_FIRST_ROOM_LOWER, []{return true;}), Entrance(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM, []{return logic->HasFireSource();}), Entrance(RR_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM, []{return Here(RR_FIRE_TEMPLE_MQ_FIRST_ROOM_UPPER, []{return logic->CanUse(RG_MEGATON_HAMMER);});}), }); - areaTable[RR_FIRE_TEMPLE_MQ_MAP_ROOM_SOUTH] = Region("Fire Temple MQ Map Room South", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_MAP_ROOM_SOUTH] = Region("Fire Temple MQ Map Room South", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, logic->CanKillEnemy(RE_LIKE_LIKE)), }, { @@ -377,7 +376,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_MAP_ROOM_CAGE, []{return logic->OpenedLowestGoronCage;}), }); - areaTable[RR_FIRE_TEMPLE_MQ_STALFOS_ROOM] = Region("Fire Temple MQ Stalfos Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_STALFOS_ROOM] = Region("Fire Temple MQ Stalfos Room", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), }, { @@ -386,7 +385,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_IRON_KNUCKLE_ROOM, []{return Here(RR_FIRE_TEMPLE_MQ_FIRST_ROOM_LOWER, []{return logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2);});}), }); - areaTable[RR_FIRE_TEMPLE_MQ_IRON_KNUCKLE_ROOM] = Region("Fire Temple MQ Iron Knuckle Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FIRE_TEMPLE_MQ_IRON_KNUCKLE_ROOM] = Region("Fire Temple MQ Iron Knuckle Room", SCENE_FIRE_TEMPLE, { //Events EventAccess(&logic->FairyPot, []{return true;}), }, { @@ -406,7 +405,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_LOWER_FLARE_DANCER, []{return Here(RR_FIRE_TEMPLE_MQ_FIRST_ROOM_LOWER, []{return logic->CanKillEnemy(RE_IRON_KNUCKLE);});}), }); - areaTable[RR_FIRE_TEMPLE_MQ_LOWER_FLARE_DANCER] = Region("Fire Temple MQ Lower Flare Dancer", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_LOWER_FLARE_DANCER] = Region("Fire Temple MQ Lower Flare Dancer", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, (logic->IsAdult || logic->CanUse(RG_HOOKSHOT)) && Here(RR_FIRE_TEMPLE_MQ_LOWER_FLARE_DANCER, []{return logic->CanKillEnemy(RE_FLARE_DANCER);})), }, { @@ -415,7 +414,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_MAP_ROOM_NORTH, []{return Here(RR_FIRE_TEMPLE_MQ_LOWER_FLARE_DANCER, []{return logic->CanKillEnemy(RE_FLARE_DANCER);});}), }); - areaTable[RR_FIRE_TEMPLE_MQ_MAP_ROOM_NORTH] = Region("Fire Temple MQ Map Room North", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FIRE_TEMPLE_MQ_MAP_ROOM_NORTH] = Region("Fire Temple MQ Map Room North", SCENE_FIRE_TEMPLE, { //Events EventAccess(&logic->OpenedLowestGoronCage, []{return logic->CanUse(RG_MEGATON_HAMMER);}), }, {}, { @@ -424,7 +423,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_MAP_ROOM_CAGE, []{return logic->OpenedLowestGoronCage;}), }); - areaTable[RR_FIRE_TEMPLE_MQ_MAP_ROOM_CAGE] = Region("Fire Temple MQ Map Room Cage", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_MAP_ROOM_CAGE] = Region("Fire Temple MQ Map Room Cage", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_MAP_CHEST, true), }, { @@ -433,7 +432,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_MAP_ROOM_SOUTH, []{return logic->OpenedLowestGoronCage;}), }); - areaTable[RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM] = Region("Fire Temple MQ Near Boss Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM] = Region("Fire Temple MQ Near Boss Room", SCENE_FIRE_TEMPLE, {}, { //Locations //If we're using the south torch as the initial torch, or using FAs, we either have to cross to the north to remove the crate, or use a trick to ignore it LOCATION(RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, logic->FireTimer() > 25 && ctx->GetTrickOption(RT_FIRE_MQ_NEAR_BOSS) && (logic->CanUse(RG_FIRE_ARROWS) || (logic->IsAdult && logic->CanUse(RG_DINS_FIRE) && logic->CanUse(RG_FAIRY_BOW)))), @@ -450,7 +449,7 @@ void RegionTable_Init_FireTemple() { //This room assumes tunic logic is handled on entry. //Covers the upper section too, as all methods to reach this can climb up somehow - areaTable[RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM_NORTH] = Region("Fire Temple MQ Near Boss Room North", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM_NORTH] = Region("Fire Temple MQ Near Boss Room North", SCENE_FIRE_TEMPLE, {}, { //Locations //If we have FAs, we can just remove the crate and use those to light the torches. //otherwise, with Dins, we first light them with dins and then either use a bow shot or to cross back over to light the other torch @@ -473,7 +472,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_NEAR_BOSS_ROOM, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM] = Region("Fire Temple MQ Big Lava Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM] = Region("Fire Temple MQ Big Lava Room", SCENE_FIRE_TEMPLE, {}, { //Locations //I'm currently assuming the oversight version of RT_FIRE_MQ_BK_CHEST for the fire timer logic LOCATION(RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, logic->FireTimer() >= 40 && logic->HasFireSource() && logic->HasExplosives() && (logic->CanUse(RG_HOOKSHOT) || (logic->IsAdult && ctx->GetTrickOption(RT_FIRE_MQ_BLOCKED_CHEST)))), @@ -490,7 +489,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_TORCH_FIREWALL_ROOM, []{return logic->HasFireSource() && ((logic->CanUse(RG_FAIRY_BOW) && logic->FireTimer() >= 25) || (ctx->GetTrickOption(RT_FIRE_MQ_BK_CHEST) && logic->FireTimer() >= 50)) && (logic->CanUse(RG_HOOKSHOT) || (logic->IsAdult && ctx->GetTrickOption(RT_FIRE_SOT)));}), }); - areaTable[RR_FIRE_TEMPLE_MQ_TORCH_FIREWALL_ROOM] = Region("Fire Temple MQ Torch Firewall Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FIRE_TEMPLE_MQ_TORCH_FIREWALL_ROOM] = Region("Fire Temple MQ Torch Firewall Room", SCENE_FIRE_TEMPLE, { //Events EventAccess(&logic->FairyPot, []{return logic->CanUse(RG_HOOKSHOT);}), }, { @@ -504,7 +503,7 @@ void RegionTable_Init_FireTemple() { }); //This room assumes Goron Tunic until looser tunic requirements tricks are made - areaTable[RR_FIRE_TEMPLE_MQ_ELEVATOR_ROOM] = Region("Fire Temple MQ Elevator Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_ELEVATOR_ROOM] = Region("Fire Temple MQ Elevator Room", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART, true), LOCATION(RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART, true), @@ -515,14 +514,14 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_BIG_TORCH_ROOM, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_MQ_BIG_TORCH_ROOM] = Region("Fire Temple MQ Big Torch Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_BIG_TORCH_ROOM] = Region("Fire Temple MQ Big Torch Room", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_MQ_LOWER_MAZE, []{return (logic->HasFireSource() && logic->CanUse(RG_HOOKSHOT)) || (ctx->GetTrickOption(RT_FIRE_MQ_CLIMB) && logic->CanUse(RG_HOVER_BOOTS));}), Entrance(RR_FIRE_TEMPLE_MQ_ELEVATOR_ROOM, []{return logic->CanUse(RG_GORON_TUNIC);}), Entrance(RR_FIRE_TEMPLE_MQ_MAZE_SHORTCUT_CAGE, []{return logic->OpenedUpperFireShortcut;}), }); - areaTable[RR_FIRE_TEMPLE_MQ_LOWER_MAZE] = Region("Fire Temple MQ Lower Maze", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_LOWER_MAZE] = Region("Fire Temple MQ Lower Maze", SCENE_FIRE_TEMPLE, {}, { //Locations //Check handled on both floors LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, logic->HasExplosives() && ctx->GetTrickOption(RT_FIRE_MQ_MAZE_SIDE_ROOM)), @@ -535,7 +534,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_UPPER_MAZE, []{return logic->HasExplosives() && logic->CanUse(RG_MEGATON_HAMMER) && logic->CanUse(RG_HOOKSHOT);}), }); - areaTable[RR_FIRE_TEMPLE_MQ_LOWER_MAZE_CRATE_CAGE] = Region("Fire Temple MQ Lower Maze Crate Cage", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_LOWER_MAZE_CRATE_CAGE] = Region("Fire Temple MQ Lower Maze Crate Cage", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, true), LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, logic->CanBreakCrates()), @@ -548,7 +547,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_UPPER_MAZE, []{return logic->IsAdult && ((ctx->GetTrickOption(RT_FIRE_MQ_MAZE_HOVERS) && logic->CanUse(RG_HOVER_BOOTS)) || ctx->GetTrickOption(RT_FIRE_MQ_MAZE_JUMP));}), }); - areaTable[RR_FIRE_TEMPLE_MQ_UPPER_MAZE] = Region("Fire Temple MQ Upper Maze", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_UPPER_MAZE] = Region("Fire Temple MQ Upper Maze", SCENE_FIRE_TEMPLE, {}, {}, { //Exits Entrance(RR_FIRE_TEMPLE_MQ_LOWER_MAZE, []{return true;}), //this cage is much more lenient than the lower cage as the switch is close to the front. sling, rang and bow all hit the switch easily, though might be too unintuitive for default logic @@ -560,7 +559,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_HIGH_TORCH_ROOM, []{return logic->SmallKeys(RR_FIRE_TEMPLE, 3) && logic->CanUse(RG_GORON_TUNIC);}), }); - areaTable[RR_FIRE_TEMPLE_MQ_UPPER_MAZE_BOX_CAGE] = Region("Fire Temple MQ Upper Maze Box Cage", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_UPPER_MAZE_BOX_CAGE] = Region("Fire Temple MQ Upper Maze Box Cage", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, true), LOCATION(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, logic->CanBreakCrates()), @@ -575,7 +574,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_UPPER_MAZE, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_MQ_MAZE_SHORTCUT] = Region("Fire Temple MQ Maze Shortcut", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FIRE_TEMPLE_MQ_MAZE_SHORTCUT] = Region("Fire Temple MQ Maze Shortcut", SCENE_FIRE_TEMPLE, { //Events EventAccess(&logic->OpenedUpperFireShortcut, []{return logic->CanUse(RG_MEGATON_HAMMER);}), }, {}, { @@ -584,7 +583,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_MAZE_SHORTCUT_CAGE, []{return logic->OpenedUpperFireShortcut;}), }); - areaTable[RR_FIRE_TEMPLE_MQ_MAZE_SHORTCUT_CAGE] = Region("Fire Temple MQ Maze Shortcut Cage", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_MAZE_SHORTCUT_CAGE] = Region("Fire Temple MQ Maze Shortcut Cage", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, logic->OpenedUpperFireShortcut;), LOCATION(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, logic->OpenedUpperFireShortcut && logic->CanBreakCrates()), @@ -600,7 +599,7 @@ void RegionTable_Init_FireTemple() { }); - areaTable[RR_FIRE_TEMPLE_MQ_BURNING_BLOCK_CLIMB] = Region("Fire Temple MQ Burning Block Climb", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FIRE_TEMPLE_MQ_BURNING_BLOCK_CLIMB] = Region("Fire Temple MQ Burning Block Climb", SCENE_FIRE_TEMPLE, { //Events //EventAccess(&WallFairy, []{return logic->CanUse(RG_HOOKSHOT);}), }, { @@ -613,7 +612,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_NARROW_PATH_ROOM, []{return logic->TakeDamage();}), }); - areaTable[RR_FIRE_TEMPLE_MQ_NARROW_PATH_ROOM] = Region("Fire Temple MQ Narrow Path Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FIRE_TEMPLE_MQ_NARROW_PATH_ROOM] = Region("Fire Temple MQ Narrow Path Room", SCENE_FIRE_TEMPLE, { //Events EventAccess(&logic->FairyPot, []{return true;}), }, { @@ -627,7 +626,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM, []{return logic->TakeDamage();}), }); - areaTable[RR_FIRE_TEMPLE_MQ_HIGH_TORCH_ROOM] = Region("Fire Temple MQ High Torch Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_HIGH_TORCH_ROOM] = Region("Fire Temple MQ High Torch Room", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, logic->CanBreakPots()), LOCATION(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, logic->CanBreakPots()), @@ -649,7 +648,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE, []{return Here(RR_FIRE_TEMPLE_MQ_HIGH_TORCH_ROOM, []{return logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_HOOKSHOT));}) && (logic->IsAdult || logic->CanUse(RG_HOOKSHOT));}), }); - areaTable[RR_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE] = Region("Fire Temple MQ South Fire Maze", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE] = Region("Fire Temple MQ South Fire Maze", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, logic->HasExplosives()), LOCATION(RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_WEST_POT, logic->CanBreakPots()), @@ -664,7 +663,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_WEST_FIRE_MAZE, []{return logic->OpenedFireMQFireMazeDoor;}), }); - areaTable[RR_FIRE_TEMPLE_MQ_FIRE_MAZE_PLATFORMS] = Region("Fire Temple MQ Fire Maze Platforms", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FIRE_TEMPLE_MQ_FIRE_MAZE_PLATFORMS] = Region("Fire Temple MQ Fire Maze Platforms", SCENE_FIRE_TEMPLE, { //Events EventAccess(&logic->HitFireTemplePlatform, []{return logic->CanUse(RG_MEGATON_HAMMER);}), EventAccess(&logic->OpenedFireMQFireMazeDoor, []{return logic->CanUse(RG_MEGATON_HAMMER) && logic->CanUse(RG_HOOKSHOT);}), @@ -674,7 +673,7 @@ void RegionTable_Init_FireTemple() { //trick to get to RR_FIRE_TEMPLE_MQ_WEST_FIRE_MAZE with hovers + taking damage is plausible }); - areaTable[RR_FIRE_TEMPLE_MQ_NORTH_FIRE_MAZE] = Region("Fire Temple MQ North Fire Maze", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_NORTH_FIRE_MAZE] = Region("Fire Temple MQ North Fire Maze", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), LOCATION(RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT, logic->CanUse(RG_BOOMERANG)), @@ -686,13 +685,13 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_WEST_FIRE_MAZE, []{return (bool)ctx->GetTrickOption(RT_FIRE_MQ_FLAME_MAZE);}), }); - areaTable[RR_FIRE_TEMPLE_MQ_WEST_FIRE_MAZE] = Region("Fire Temple MQ West Fire Maze", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_WEST_FIRE_MAZE] = Region("Fire Temple MQ West Fire Maze", SCENE_FIRE_TEMPLE, {}, {}, { Entrance(RR_FIRE_TEMPLE_MQ_FIRE_MAZE_PAST_WALL, []{return true;}), Entrance(RR_FIRE_TEMPLE_MQ_NORTH_FIRE_MAZE, []{return (bool)ctx->GetTrickOption(RT_FIRE_MQ_FLAME_MAZE);}), }); //this area exists for the pots in case we void warp to the top of fire somehow, because there's no way to get back the way we came - areaTable[RR_FIRE_TEMPLE_MQ_FIRE_MAZE_PAST_WALL] = Region("Fire Temple MQ Fire Maze Past Wall", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_FIRE_MAZE_PAST_WALL] = Region("Fire Temple MQ Fire Maze Past Wall", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT, logic->CanBreakPots()), LOCATION(RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_NORTH_POT, logic->CanBreakPots()), @@ -701,7 +700,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_UPPER_FLARE_DANCER, []{return true;}), }); - areaTable[RR_FIRE_TEMPLE_MQ_UPPER_FLARE_DANCER] = Region("Fire Temple MQ Upper Flare Dancer", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_UPPER_FLARE_DANCER] = Region("Fire Temple MQ North Fire Maze", SCENE_FIRE_TEMPLE, {}, { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY, logic->CanKillEnemy(RE_FLARE_DANCER)), }, { @@ -709,7 +708,7 @@ void RegionTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_MQ_SCARECROW_ROOM, []{return logic->CanKillEnemy(RE_FLARE_DANCER) && logic->SmallKeys(RR_FIRE_TEMPLE, 4);}), }); - areaTable[RR_FIRE_TEMPLE_MQ_SCARECROW_ROOM] = Region("Fire Temple MQ Scarecrow Room", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_SCARECROW_ROOM] = Region("Fire Temple MQ Scarecrow Room", SCENE_FIRE_TEMPLE, {}, { //Locations //This requires nothing in N64 logic, but is tight enough to need rollspam with the one-point on which is stricter than I would normally consider in logic //Child basically needs the scarecrow or a bunny hood though due to a worse ledge grab. @@ -724,7 +723,7 @@ void RegionTable_Init_FireTemple() { }); //The peg knocked down from here could have logical implications for child in the fire maze if tricks to gain height like bomb jumps exist - areaTable[RR_FIRE_TEMPLE_MQ_COLLAPSED_STAIRS] = Region("Fire Temple MQ Collapsed Stairs", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FIRE_TEMPLE_MQ_COLLAPSED_STAIRS] = Region("Fire Temple MQ Collapsed Stairs", SCENE_FIRE_TEMPLE, {}, { //Locations //If someone manages to make a trick to get here from fire maze, this needs to be in a separate room as the door back is barred LOCATION(RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_MAZE, logic->CanUse(RG_HOOKSHOT)), @@ -736,14 +735,14 @@ void RegionTable_Init_FireTemple() { #pragma endregion // Boss Room - areaTable[RR_FIRE_TEMPLE_BOSS_ENTRYWAY] = Region("Fire Temple Boss Entryway", "Fire Temple", {RA_FIRE_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_BOSS_ENTRYWAY] = Region("Fire Temple Boss Entryway", SCENE_FIRE_TEMPLE, {}, {}, { // Exits Entrance(RR_FIRE_TEMPLE_NEAR_BOSS_ROOM, []{return ctx->GetDungeon(FIRE_TEMPLE)->IsVanilla() && false;}), Entrance(RR_FIRE_TEMPLE_MQ_NEAR_BOSS_ROOM, []{return ctx->GetDungeon(FIRE_TEMPLE)->IsMQ() && false;}), Entrance(RR_FIRE_TEMPLE_BOSS_ROOM, []{return logic->HasItem(RG_FIRE_TEMPLE_BOSS_KEY);}), }); - areaTable[RR_FIRE_TEMPLE_BOSS_ROOM] = Region("Fire Temple Boss Room", "Fire Temple", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FIRE_TEMPLE_BOSS_ROOM] = Region("Fire Temple Boss Room", SCENE_FIRE_TEMPLE_BOSS, { // Events EventAccess(&logic->FireTempleClear, []{return logic->FireTimer() >= 64 && logic->CanKillEnemy(RE_VOLVAGIA);}), }, { diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp index 05413a2c9..d3149c009 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp @@ -7,7 +7,7 @@ using namespace Rando; void RegionTable_Init_ForestTemple() { // clang-format off // Vanilla/MQ Decider - areaTable[RR_FOREST_TEMPLE_ENTRYWAY] = Region("Forest Temple Entryway", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_ENTRYWAY] = Region("Forest Temple Entryway", SCENE_FOREST_TEMPLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_FIRST_ROOM, []{return ctx->GetDungeon(FOREST_TEMPLE)->IsVanilla();}), Entrance(RR_FOREST_TEMPLE_MQ_LOBBY, []{return ctx->GetDungeon(FOREST_TEMPLE)->IsMQ();}), @@ -16,7 +16,7 @@ void RegionTable_Init_ForestTemple() { #pragma region Vanilla - areaTable[RR_FOREST_TEMPLE_FIRST_ROOM] = Region("Forest Temple First Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_FIRST_ROOM] = Region("Forest Temple First Room", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, true), LOCATION(RC_FOREST_TEMPLE_GS_FIRST_ROOM, (logic->IsAdult && logic->CanUse(RG_BOMB_BAG)) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOMBCHU_5) || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_FOREST_FIRST_GS) && (logic->CanJumpslashExceptHammer() || (logic->IsChild && logic->CanUse(RG_BOMB_BAG))))), @@ -26,13 +26,13 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_SOUTH_CORRIDOR, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_SOUTH_CORRIDOR] = Region("Forest Temple South Corridor", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_SOUTH_CORRIDOR] = Region("Forest Temple South Corridor", SCENE_FOREST_TEMPLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_FIRST_ROOM, []{return true;}), Entrance(RR_FOREST_TEMPLE_LOBBY, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA);}), }); - areaTable[RR_FOREST_TEMPLE_LOBBY] = Region("Forest Temple Lobby", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_LOBBY] = Region("Forest Temple Lobby", SCENE_FOREST_TEMPLE, { //Events EventAccess(&logic->ForestTempleMeg, []{return logic->ForestTempleJoelle && logic->ForestTempleBeth && logic->ForestTempleAmy && logic->CanUse(RG_FAIRY_BOW);}), }, { @@ -56,13 +56,13 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, []{return false;}), }); - areaTable[RR_FOREST_TEMPLE_NORTH_CORRIDOR] = Region("Forest Temple North Corridor", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_NORTH_CORRIDOR] = Region("Forest Temple North Corridor", SCENE_FOREST_TEMPLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_LOBBY, []{return true;}), Entrance(RR_FOREST_TEMPLE_LOWER_STALFOS, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_LOWER_STALFOS] = Region("Forest Temple Lower Stalfos", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_LOWER_STALFOS] = Region("Forest Temple Lower Stalfos", SCENE_FOREST_TEMPLE, { //Events EventAccess(&logic->FairyPot, []{return true;}), }, { @@ -75,7 +75,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_NORTH_CORRIDOR, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_NW_OUTDOORS_LOWER] = Region("Forest Temple NW Outdoors Lower", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_NW_OUTDOORS_LOWER] = Region("Forest Temple NW Outdoors Lower", SCENE_FOREST_TEMPLE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), @@ -93,7 +93,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, []{return false;}), }); - areaTable[RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER] = Region("Forest Temple NW Outdoors Upper", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER] = Region("Forest Temple NW Outdoors Upper", SCENE_FOREST_TEMPLE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), @@ -109,7 +109,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_NE_OUTDOORS_LOWER] = Region("Forest Temple NE Outdoors Lower", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_NE_OUTDOORS_LOWER] = Region("Forest Temple NE Outdoors Lower", SCENE_FOREST_TEMPLE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), @@ -125,7 +125,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_FALLING_ROOM, []{return false;}), }); - areaTable[RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER] = Region("Forest Temple NE Outdoors Upper", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER] = Region("Forest Temple NE Outdoors Upper", SCENE_FOREST_TEMPLE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), @@ -136,7 +136,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_FALLING_ROOM, []{return ctx->GetTrickOption(RT_FOREST_DOORFRAME) && logic->CanJumpslashExceptHammer() && logic->CanUse(RG_HOVER_BOOTS) && logic->CanUse(RG_SCARECROW);}), }); - areaTable[RR_FOREST_TEMPLE_MAP_ROOM] = Region("Forest Temple Map Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_MAP_ROOM] = Region("Forest Temple Map Room", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_MAP_CHEST, logic->CanKillEnemy(RE_BLUE_BUBBLE)), }, { @@ -145,7 +145,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER, []{return Here(RR_FOREST_TEMPLE_MAP_ROOM, []{return logic->CanKillEnemy(RE_BLUE_BUBBLE);});}), }); - areaTable[RR_FOREST_TEMPLE_SEWER] = Region("Forest Temple Sewer", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_SEWER] = Region("Forest Temple Sewer", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_WELL_CHEST, HasAccessTo(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER)), LOCATION(RC_FOREST_TEMPLE_WELL_WEST_HEART, HasAccessTo(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8)), @@ -156,12 +156,12 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_NE_OUTDOORS_LOWER, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST] = Region("Forest Temple Below Boss Key Chest", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST] = Region("Forest Temple Below Boss Key Chest", SCENE_FOREST_TEMPLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER, []{return Here(RR_FOREST_TEMPLE_BELOW_BOSS_KEY_CHEST, []{return logic->CanKillEnemy(RE_BLUE_BUBBLE);});}), }); - areaTable[RR_FOREST_TEMPLE_FLOORMASTER_ROOM] = Region("Forest Temple Floormaster Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_FLOORMASTER_ROOM] = Region("Forest Temple Floormaster Room", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_FLOORMASTER_CHEST, logic->CanDamage()), }, { @@ -169,13 +169,13 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_WEST_CORRIDOR] = Region("Forest Temple West Corridor", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_WEST_CORRIDOR] = Region("Forest Temple West Corridor", SCENE_FOREST_TEMPLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_LOBBY, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 1, 5);}), Entrance(RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM, []{return logic->CanAttack() || logic->CanUse(RG_NUTS);}), }); - areaTable[RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM] = Region("Forest Temple Block Push Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM] = Region("Forest Temple Block Push Room", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, logic->HasItem(RG_GORONS_BRACELET) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT))), }, { @@ -186,13 +186,13 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_NW_CORRIDOR_STRAIGHTENED, []{return logic->IsAdult && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT)) && logic->HasItem(RG_GORONS_BRACELET) && logic->SmallKeys(RR_FOREST_TEMPLE, 2);}), }); - areaTable[RR_FOREST_TEMPLE_NW_CORRIDOR_TWISTED] = Region("Forest Temple NW Corridor Twisted", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_NW_CORRIDOR_TWISTED] = Region("Forest Temple NW Corridor Twisted", SCENE_FOREST_TEMPLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 2);}), Entrance(RR_FOREST_TEMPLE_RED_POE_ROOM, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 3);}), }); - areaTable[RR_FOREST_TEMPLE_NW_CORRIDOR_STRAIGHTENED] = Region("Forest Temple NW Corridor Straightened", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_NW_CORRIDOR_STRAIGHTENED] = Region("Forest Temple NW Corridor Straightened", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_BOSS_KEY_CHEST, true), }, { @@ -201,7 +201,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_BLOCK_PUSH_ROOM, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 2);}), }); - areaTable[RR_FOREST_TEMPLE_RED_POE_ROOM] = Region("Forest Temple Red Poe Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_RED_POE_ROOM] = Region("Forest Temple Red Poe Room", SCENE_FOREST_TEMPLE, { //Events EventAccess(&logic->ForestTempleJoelle, []{return logic->CanUse(RG_FAIRY_BOW);}), }, { @@ -213,7 +213,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_UPPER_STALFOS, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_UPPER_STALFOS] = Region("Forest Temple Upper Stalfos", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_UPPER_STALFOS] = Region("Forest Temple Upper Stalfos", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_BOW_CHEST, logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 3)), LOCATION(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_1, logic->CanBreakPots()), @@ -226,7 +226,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_BLUE_POE_ROOM, []{return logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 3);}), }); - areaTable[RR_FOREST_TEMPLE_BLUE_POE_ROOM] = Region("Forest Temple Blue Poe Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_BLUE_POE_ROOM] = Region("Forest Temple Blue Poe Room", SCENE_FOREST_TEMPLE, { //Events EventAccess(&logic->ForestTempleBeth, []{return logic->CanUse(RG_FAIRY_BOW);}), }, { @@ -241,19 +241,19 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_NE_CORRIDOR_STRAIGHTENED, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 4);}), }); - areaTable[RR_FOREST_TEMPLE_NE_CORRIDOR_STRAIGHTENED] = Region("Forest Temple NE Corridor Straightened", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_NE_CORRIDOR_STRAIGHTENED] = Region("Forest Temple NE Corridor Straightened", SCENE_FOREST_TEMPLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_BLUE_POE_ROOM, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 4);}), Entrance(RR_FOREST_TEMPLE_FROZEN_EYE_ROOM, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 5);}), }); - areaTable[RR_FOREST_TEMPLE_NE_CORRIDOR_TWISTED] = Region("Forest Temple NE Corridor Twisted", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_NE_CORRIDOR_TWISTED] = Region("Forest Temple NE Corridor Twisted", SCENE_FOREST_TEMPLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_FROZEN_EYE_ROOM, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 5);}), Entrance(RR_FOREST_TEMPLE_FALLING_ROOM, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_FROZEN_EYE_ROOM] = Region("Forest Temple Frozen Eye Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_FROZEN_EYE_ROOM] = Region("Forest Temple Frozen Eye Room", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_FROZEN_EYE_POT_1, logic->CanBreakPots()), LOCATION(RC_FOREST_TEMPLE_FROZEN_EYE_POT_2, logic->CanBreakPots()), @@ -263,7 +263,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_NE_CORRIDOR_TWISTED, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 5) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DINS_FIRE));}), }); - areaTable[RR_FOREST_TEMPLE_FALLING_ROOM] = Region("Forest Temple Falling Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_FALLING_ROOM] = Region("Forest Temple Falling Room", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, true), }, { @@ -272,7 +272,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_GREEN_POE_ROOM, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_GREEN_POE_ROOM] = Region("Forest Temple Green Poe Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_GREEN_POE_ROOM] = Region("Forest Temple Green Poe Room", SCENE_FOREST_TEMPLE, { //Events EventAccess(&logic->ForestTempleAmy, []{return logic->CanUse(RG_FAIRY_BOW);}), }, { @@ -285,13 +285,13 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_EAST_CORRIDOR, []{return logic->ForestTempleAmy;}), }); - areaTable[RR_FOREST_TEMPLE_EAST_CORRIDOR] = Region("Forest Temple East Corridor", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_EAST_CORRIDOR] = Region("Forest Temple East Corridor", SCENE_FOREST_TEMPLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_LOBBY, []{return logic->CanAttack() || logic->CanUse(RG_NUTS);}), Entrance(RR_FOREST_TEMPLE_GREEN_POE_ROOM, []{return logic->CanAttack() || logic->CanUse(RG_NUTS);}), }); - areaTable[RR_FOREST_TEMPLE_BOSS_REGION] = Region("Forest Temple Boss Region", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_BOSS_REGION] = Region("Forest Temple Boss Region", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_BASEMENT_CHEST, true), LOCATION(RC_FOREST_TEMPLE_GS_BASEMENT, logic->HookshotOrBoomerang()), @@ -305,7 +305,7 @@ void RegionTable_Init_ForestTemple() { #pragma region MQ - areaTable[RR_FOREST_TEMPLE_MQ_LOBBY] = Region("Forest Temple MQ Lobby", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_LOBBY] = Region("Forest Temple MQ Lobby", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, logic->CanPassEnemy(RE_BIG_SKULLTULA, ED_SHORT_JUMPSLASH, false) || logic->CanUse(RG_HOVER_BOOTS)), //Implies CanPassEnemy(RE_BIG_SKULLTULA) @@ -316,7 +316,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_CENTRAL_AREA, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 1) && logic->CanPassEnemy(RE_BIG_SKULLTULA);}), }); - areaTable[RR_FOREST_TEMPLE_MQ_CENTRAL_AREA] = Region("Forest Temple MQ Central Region", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_CENTRAL_AREA] = Region("Forest Temple MQ Central Region", SCENE_FOREST_TEMPLE, { //Events EventAccess(&logic->ForestTempleMeg, []{return logic->ForestTempleJoelle && logic->ForestTempleBeth && logic->ForestTempleAmy && logic->CanKillEnemy(RE_MEG);}), }, { @@ -337,7 +337,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_BASEMENT, []{return logic->ForestTempleMeg;}), }); - areaTable[RR_FOREST_TEMPLE_MQ_WOLFOS_ROOM] = Region("Forest Temple MQ Wolfos Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_WOLFOS_ROOM] = Region("Forest Temple MQ Wolfos Room", SCENE_FOREST_TEMPLE, { //Events EventAccess(&logic->FairyPot, []{return true;}), EventAccess(&logic->ForestClearBelowBowChest, []{return logic->CanKillEnemy(RE_WOLFOS);}), @@ -351,7 +351,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_CENTRAL_AREA, []{return logic->ForestClearBelowBowChest && (logic->IsChild || logic->CanUse(RG_SONG_OF_TIME));}), }); - areaTable[RR_FOREST_TEMPLE_MQ_LOWER_BLOCK_PUZZLE] = Region("Forest Temple MQ Lower Block Puzzle", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_LOWER_BLOCK_PUZZLE] = Region("Forest Temple MQ Lower Block Puzzle", SCENE_FOREST_TEMPLE, { //longshot is capable of hitting the switch, but some invisible collision makes the shot harder than you would think, so it may be trickworthy EventAccess(&logic->MQForestBlockRoomTargets, []{return (ctx->GetTrickOption(RT_FOREST_MQ_BLOCK_PUZZLE) && logic->CanUse(RG_BOMBCHU_5));}), //It is barely possible to get this as child with master + hovers, but it's tight without bunny speed @@ -368,7 +368,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE, []{return logic->ForestCanTwistHallway && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS));}), }); - areaTable[RR_FOREST_TEMPLE_MQ_MIDDLE_BLOCK_PUZZLE] = Region("Forest Temple MQ Middle Block Puzzle", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_MIDDLE_BLOCK_PUZZLE] = Region("Forest Temple MQ Middle Block Puzzle", SCENE_FOREST_TEMPLE, { //longshot is capable of hitting the switch, but some invisible collision makes the shot more annoying than you would think, so it may be trickworthy EventAccess(&logic->MQForestBlockRoomTargets, []{return (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_LONGSHOT));}), EventAccess(&logic->ForestCanTwistHallway, []{return ctx->GetTrickOption(RT_FOREST_MQ_JS_HALLWAY_SWITCH) && (logic->IsAdult && logic->CanJumpslash()) || (logic->CanUse(RG_HOVER_BOOTS) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_MASTER_SWORD)));}), @@ -380,7 +380,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE, []{return logic->ForestCanTwistHallway && logic->CanUse(RG_HOVER_BOOTS) || (ctx->GetTrickOption(RT_FOREST_OUTSIDE_BACKDOOR) && (logic->CanJumpslashExceptHammer() || (logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER))));}), }); - areaTable[RR_FOREST_TEMPLE_MQ_UPPER_BLOCK_PUZZLE] = Region("Forest Temple MQ After Block Puzzle", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_UPPER_BLOCK_PUZZLE] = Region("Forest Temple MQ After Block Puzzle", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, logic->SmallKeys(RR_FOREST_TEMPLE, 3)), }, { @@ -394,7 +394,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_NW_OUTDOORS, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 2) && Here(RR_FOREST_TEMPLE_MQ_UPPER_BLOCK_PUZZLE, []{return logic->CanKillEnemy(RE_FLOORMASTER);});}), }); - areaTable[RR_FOREST_TEMPLE_MQ_STRAIGHT_HALLWAY] = Region("Forest Temple MQ Straight Hallway", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_STRAIGHT_HALLWAY] = Region("Forest Temple MQ Straight Hallway", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, logic->SmallKeys(RR_FOREST_TEMPLE, 3)), }, { @@ -402,12 +402,12 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_FLOORMASTER_ROOM, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_MQ_FLOORMASTER_ROOM] = Region("Forest Temple MQ Floormaster Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_FLOORMASTER_ROOM] = Region("Forest Temple MQ Floormaster Room", SCENE_FOREST_TEMPLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE, []{return Here(RR_FOREST_TEMPLE_MQ_FLOORMASTER_ROOM, []{return logic->CanKillEnemy(RE_FLOORMASTER);});}), }); - areaTable[RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE] = Region("Forest Temple MQ Outdoor Ledge", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE] = Region("Forest Temple MQ Outdoor Ledge", SCENE_FOREST_TEMPLE, { EventAccess(&logic->ForestCanTwistHallway, []{return logic->CanHitSwitch();}), }, { //Locations @@ -420,7 +420,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_NW_OUTDOORS, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_MQ_NW_OUTDOORS] = Region("Forest Temple MQ NW Outdoors", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_NW_OUTDOORS] = Region("Forest Temple MQ NW Outdoors", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), //the well checks are considered from both areas instead of being a region because the draining is a temp flag and the skull (as well as the chest with hook glitch) has different breath timers from each side @@ -438,7 +438,7 @@ void RegionTable_Init_ForestTemple() { }); //The well only coniders the eye target here because the eye target is a temp flag, making it unwieldy to use as an EventAccess to make it it's own room - areaTable[RR_FOREST_TEMPLE_MQ_NE_OUTDOORS] = Region("Forest Temple MQ NE Outdoors", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_NE_OUTDOORS] = Region("Forest Temple MQ NE Outdoors", SCENE_FOREST_TEMPLE, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), @@ -458,7 +458,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_NE_OUTDOORS_LEDGE, []{return logic->CanUse(RG_LONGSHOT);}), }); - areaTable[RR_FOREST_TEMPLE_MQ_OUTDOORS_TOP_LEDGES] = Region("Forest Temple MQ Outdoors Top Ledges", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_OUTDOORS_TOP_LEDGES] = Region("Forest Temple MQ Outdoors Top Ledges", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, true), //Actually killing the skull from the doorframe with melee is annoying. Hammer swing hits low enough unaided, other swords need to crouch stab but the spot is precise based on range. kokiri sword doesn't reach at all for adult. @@ -471,7 +471,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_NE_OUTDOORS_LEDGE, []{return ctx->GetTrickOption(RT_FOREST_OUTDOORS_LEDGE) && logic->CanUse(RG_HOVER_BOOTS) && logic->CanJumpslash() && logic->TakeDamage();}), }); - areaTable[RR_FOREST_TEMPLE_MQ_NE_OUTDOORS_LEDGE] = Region("Forest Temple MQ NE Outdoors Ledge", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_NE_OUTDOORS_LEDGE] = Region("Forest Temple MQ NE Outdoors Ledge", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, true), }, { @@ -481,7 +481,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_FALLING_ROOM, []{return logic->CanUse(RG_SONG_OF_TIME);}), }); - areaTable[RR_FOREST_TEMPLE_MQ_JOELLE_ROOM] = Region("Forest Temple MQ Joelle Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_JOELLE_ROOM] = Region("Forest Temple MQ Joelle room", SCENE_FOREST_TEMPLE, { //Events EventAccess(&logic->ForestTempleJoelle, []{return logic->CanUse(RG_FAIRY_BOW);}), }, { @@ -493,7 +493,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_3_STALFOS_ROOM, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_MQ_3_STALFOS_ROOM] = Region("Forest Temple MQ 3 Stalfos Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_3_STALFOS_ROOM] = Region("Forest Temple MQ 3 Stalfos Room", SCENE_FOREST_TEMPLE, { //Events //technically happens in RR_FOREST_TEMPLE_MQ_WOLFOS_ROOM, but the way this room blocks the hole means it cannot be logical to do anything else there. EventAccess(&logic->ForestClearBelowBowChest, []{return logic->CanKillEnemy(RE_WOLFOS);}), @@ -510,7 +510,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_BETH_ROOM, []{return logic->ForestClearBelowBowChest && logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 3);}), }); - areaTable[RR_FOREST_TEMPLE_MQ_BETH_ROOM] = Region("Forest Temple MQ Beth Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_BETH_ROOM] = Region("Forest Temple MQ Beth Room", SCENE_FOREST_TEMPLE, { //Events EventAccess(&logic->ForestTempleBeth, []{return logic->CanUse(RG_FAIRY_BOW);}), }, { @@ -530,20 +530,18 @@ void RegionTable_Init_ForestTemple() { }); //This room exists to show the actual map layout, and for when the crates get added to logic - areaTable[RR_FOREST_TEMPLE_MQ_TORCH_SHOT_ROOM] = Region("Forest Temple MQ Torch Shot Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, - { + areaTable[RR_FOREST_TEMPLE_MQ_TORCH_SHOT_ROOM] = Region("Forest Temple MQ Torch Shot Room", SCENE_FOREST_TEMPLE, {}, { // Locations LOCATION(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, logic->CanBreakSmallCrates()), LOCATION(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, logic->CanBreakSmallCrates()), LOCATION(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, logic->CanBreakSmallCrates()), - }, - { + }, { //Exits Entrance(RR_FOREST_TEMPLE_MQ_FALLING_ROOM, []{return logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DINS_FIRE);}), Entrance(RR_FOREST_TEMPLE_MQ_BETH_ROOM, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 6);}), }); - areaTable[RR_FOREST_TEMPLE_MQ_FALLING_ROOM] = Region("Forest Temple MQ Falling Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_FALLING_ROOM] = Region("Forest Temple MQ Falling Room", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, true), }, { @@ -552,7 +550,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_AMY_ROOM, []{return logic->SmallKeys(RR_FOREST_TEMPLE, 6);}), }); - areaTable[RR_FOREST_TEMPLE_MQ_AMY_ROOM] = Region("Forest Temple MQ Amy Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_AMY_ROOM] = Region("Forest Temple MQ Amy Room", SCENE_FOREST_TEMPLE, { //Events EventAccess(&logic->ForestTempleAmy, []{return logic->CanUse(RG_FAIRY_BOW);}), }, { @@ -565,7 +563,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_FALLING_ROOM, []{return true;}), }); - areaTable[RR_FOREST_TEMPLE_MQ_BASEMENT] = Region("Forest Temple MQ Basement", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_MQ_BASEMENT] = Region("Forest Temple MQ Basement", SCENE_FOREST_TEMPLE, { //Events //Implies CanHitSwitch() EventAccess(&logic->ForestOpenBossCorridor, []{return logic->CanHitEyeTargets();}), @@ -579,7 +577,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_BOSS_REGION, []{return logic->ForestOpenBossCorridor;}), }); - areaTable[RR_FOREST_TEMPLE_MQ_BASEMENT_POT_ROOM] = Region("Forest Temple MQ Basement Pot Room", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_BASEMENT_POT_ROOM] = Region("Forest Temple MQ Basement Pot Room", SCENE_FOREST_TEMPLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_1, logic->CanBreakPots()), LOCATION(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_2, logic->CanBreakPots()), @@ -590,7 +588,7 @@ void RegionTable_Init_ForestTemple() { Entrance(RR_FOREST_TEMPLE_MQ_BASEMENT, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA);}), }); - areaTable[RR_FOREST_TEMPLE_MQ_BOSS_REGION] = Region("Forest Temple MQ Boss Region", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_MQ_BOSS_REGION] = Region("Forest Temple MQ Boss Region", SCENE_FOREST_TEMPLE, {}, {}, { //Exits Entrance(RR_FOREST_TEMPLE_MQ_BASEMENT, []{return logic->ForestOpenBossCorridor;}), Entrance(RR_FOREST_TEMPLE_BOSS_ENTRYWAY, []{return true;}), @@ -599,14 +597,14 @@ void RegionTable_Init_ForestTemple() { #pragma endregion // Boss Room - areaTable[RR_FOREST_TEMPLE_BOSS_ENTRYWAY] = Region("Forest Temple Boss Entryway", "Forest Temple", {RA_FOREST_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FOREST_TEMPLE_BOSS_ENTRYWAY] = Region("Forest Temple Boss Entryway", SCENE_FOREST_TEMPLE, {}, {}, { // Exits Entrance(RR_FOREST_TEMPLE_BOSS_REGION, []{return ctx->GetDungeon(FOREST_TEMPLE)->IsVanilla() && false;}), Entrance(RR_FOREST_TEMPLE_MQ_BOSS_REGION, []{return ctx->GetDungeon(FOREST_TEMPLE)->IsMQ() && false;}), Entrance(RR_FOREST_TEMPLE_BOSS_ROOM, []{return logic->HasItem(RG_FOREST_TEMPLE_BOSS_KEY);}), }); - areaTable[RR_FOREST_TEMPLE_BOSS_ROOM] = Region("Forest Temple Boss Room", "Forest Temple", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_FOREST_TEMPLE_BOSS_ROOM] = Region("Forest Temple Boss Room", SCENE_FOREST_TEMPLE_BOSS, { // Events EventAccess(&logic->ForestTempleClear, []{return logic->CanKillEnemy(RE_PHANTOM_GANON);}), }, { diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp index cc0c9767d..8571ba384 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp @@ -8,7 +8,7 @@ using namespace Rando; void RegionTable_Init_GanonsCastle() { // clang-format off // Vanilla/MQ Decider - areaTable[RR_GANONS_CASTLE_ENTRYWAY] = Region("Ganon's Castle Entryway", "Ganon's Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GANONS_CASTLE_ENTRYWAY] = Region("Ganon's Castle Entryway", SCENE_INSIDE_GANONS_CASTLE, {}, {}, { //Exits Entrance(RR_GANONS_CASTLE_LOBBY, []{return ctx->GetDungeon(GANONS_CASTLE)->IsVanilla();}), Entrance(RR_GANONS_CASTLE_MQ_LOBBY, []{return ctx->GetDungeon(GANONS_CASTLE)->IsMQ();}), @@ -17,7 +17,7 @@ void RegionTable_Init_GanonsCastle() { #pragma region Vanilla - areaTable[RR_GANONS_CASTLE_LOBBY] = Region("Ganon's Castle Lobby", "Ganon's Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_CASTLE_LOBBY] = Region("Ganon's Castle Lobby", SCENE_INSIDE_GANONS_CASTLE, {}, { //Locations LOCATION(RC_SHEIK_HINT_GC, true), }, { @@ -33,7 +33,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_DEKU_SCRUBS, []{return ctx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH);}), }); - areaTable[RR_GANONS_CASTLE_DEKU_SCRUBS] = Region("Ganon's Castle Deku Scrubs", "Ganon's Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_DEKU_SCRUBS] = Region("Ganon's Castle Deku Scrubs", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->FreeFairies, []{return true;}), }, { @@ -52,7 +52,7 @@ void RegionTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_SCRUBS_FAIRY_8, true), }, {}); - areaTable[RR_GANONS_CASTLE_FOREST_TRIAL] = Region("Ganon's Castle Forest Trial", "Ganon's Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_FOREST_TRIAL] = Region("Ganon's Castle Forest Trial", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->ForestTrialClear, []{return logic->CanUse(RG_LIGHT_ARROWS) && (logic->CanUse(RG_FIRE_ARROWS) || logic->CanUse(RG_DINS_FIRE));}), }, { @@ -62,7 +62,7 @@ void RegionTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_FOREST_TRIAL_POT_2, logic->CanBreakPots() && (logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_DINS_FIRE) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT))))), }, {}); - areaTable[RR_GANONS_CASTLE_FIRE_TRIAL] = Region("Ganon's Castle Fire Trial", "Ganon's Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_FIRE_TRIAL] = Region("Ganon's Castle Fire Trial", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->FireTrialClear, []{return logic->CanUse(RG_GORON_TUNIC) && logic->CanUse(RG_GOLDEN_GAUNTLETS) && logic->CanUse(RG_LIGHT_ARROWS) && logic->CanUse(RG_LONGSHOT);}), }, { @@ -72,7 +72,7 @@ void RegionTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_FIRE_TRIAL_HEART, logic->CanUse(RG_GORON_TUNIC)), }, {}); - areaTable[RR_GANONS_CASTLE_WATER_TRIAL] = Region("Ganon's Castle Water Trial", "Ganon's Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_WATER_TRIAL] = Region("Ganon's Castle Water Trial", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->BlueFireAccess, []{return true;}), EventAccess(&logic->FairyPot, []{return logic->BlueFire() && logic->CanKillEnemy(RE_FREEZARD);}), @@ -86,7 +86,7 @@ void RegionTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_POT_3, logic->CanBreakPots() && logic->BlueFire() && logic->CanKillEnemy(RE_FREEZARD)), }, {}); - areaTable[RR_GANONS_CASTLE_SHADOW_TRIAL] = Region("Ganon's Castle Shadow Trial", "Ganon's Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_SHADOW_TRIAL] = Region("Ganon's Castle Shadow Trial", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->ShadowTrialClear, []{return logic->CanUse(RG_LIGHT_ARROWS) && logic->CanUse(RG_MEGATON_HAMMER) && ((logic->CanUse(RG_FIRE_ARROWS) && (ctx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH))) || (logic->CanUse(RG_LONGSHOT) && (logic->CanUse(RG_HOVER_BOOTS) || (logic->CanUse(RG_DINS_FIRE) && (ctx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH))))));}), }, { @@ -102,7 +102,7 @@ void RegionTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_3, (logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_LONGSHOT) && (logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_DINS_FIRE)))) && (ctx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH) || logic->CanUse(RG_BOOMERANG))), }, {}); - areaTable[RR_GANONS_CASTLE_SPIRIT_TRIAL] = Region("Ganon's Castle Spirit Trial", "Ganon's Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_SPIRIT_TRIAL] = Region("Ganon's Castle Spirit Trial", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->NutPot, []{return ((ctx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) && logic->CanJumpslashExceptHammer()) || logic->CanUse(RG_HOOKSHOT)) && logic->CanUse(RG_BOMBCHU_5) && logic->CanUse(RG_FAIRY_BOW) && (logic->CanUse(RG_MIRROR_SHIELD) || (ctx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS)));}), EventAccess(&logic->SpiritTrialClear, []{return logic->CanUse(RG_LIGHT_ARROWS) && (logic->CanUse(RG_MIRROR_SHIELD) || ctx->GetOption(RSK_SUNLIGHT_ARROWS)) && logic->CanUse(RG_BOMBCHU_5) && ((ctx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) && logic->CanJumpslashExceptHammer()) || logic->CanUse(RG_HOOKSHOT));}), @@ -116,7 +116,7 @@ void RegionTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_HEART, true), }, {}); - areaTable[RR_GANONS_CASTLE_LIGHT_TRIAL] = Region("Ganon's Castle Light Trial", "Ganon's Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_LIGHT_TRIAL] = Region("Ganon's Castle Light Trial", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->LightTrialClear, []{return logic->CanUse(RG_LIGHT_ARROWS) && logic->CanUse(RG_HOOKSHOT) && logic->SmallKeys(RR_GANONS_CASTLE, 2) && (ctx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH));}), }, { @@ -138,14 +138,14 @@ void RegionTable_Init_GanonsCastle() { #pragma region MQ - areaTable[RR_GANONS_CASTLE_MQ_LOBBY] = Region("Ganon's Castle MQ Lobby", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GANONS_CASTLE_MQ_LOBBY] = Region("Ganon's Castle MQ Lobby", SCENE_INSIDE_GANONS_CASTLE, {}, {}, { //Exits Entrance(RR_GANONS_CASTLE_ENTRYWAY, []{return logic->CanPassEnemy(RE_GREEN_BUBBLE) || Here(RR_GANONS_CASTLE_MQ_LOBBY, []{return logic->CanKillEnemy(RE_IRON_KNUCKLE) && logic->CanKillEnemy(RE_ARMOS);});}), //Implies CanKillEnemy(RE_GREEN_BUBBLE) Entrance(RR_GANONS_CASTLE_MQ_MAIN, []{return Here(RR_GANONS_CASTLE_MQ_LOBBY, []{return logic->CanKillEnemy(RE_IRON_KNUCKLE) && logic->CanKillEnemy(RE_ARMOS);});}), }); - areaTable[RR_GANONS_CASTLE_MQ_MAIN] = Region("Ganon's Castle MQ Main", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_CASTLE_MQ_MAIN] = Region("Ganon's Castle MQ Main", SCENE_INSIDE_GANONS_CASTLE, {}, { //Locations LOCATION(RC_SHEIK_HINT_MQ_GC, true), }, { @@ -161,7 +161,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_DEKU_SCRUBS, []{return ctx->GetTrickOption(RT_LENS_GANON_MQ) || logic->CanUse(RG_LENS_OF_TRUTH);}), }); - areaTable[RR_GANONS_CASTLE_MQ_DEKU_SCRUBS] = Region("Ganon's Castle MQ Deku Scrubs", "Ganon's Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_DEKU_SCRUBS] = Region("Ganon's Castle MQ Deku Scrubs", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->FreeFairies, []{return true;}), }, { @@ -184,7 +184,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_MAIN, []{return true;}), }); - areaTable[RR_GANONS_CASTLE_MQ_FOREST_TRIAL_STALFOS_ROOM] = Region("Ganon's Castle MQ Forest Trial Stalfos Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_CASTLE_MQ_FOREST_TRIAL_STALFOS_ROOM] = Region("Ganon's Castle MQ Forest Trial Stalfos Room", SCENE_INSIDE_GANONS_CASTLE, {}, { //Locations LOCATION(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, logic->HookshotOrBoomerang()), }, { @@ -194,7 +194,7 @@ void RegionTable_Init_GanonsCastle() { }); //If it is ever possible to warp into the RR_GANONS_CASTLE_MQ_FOREST_TRIAL_FINAL_ROOM, this needs splitting up as the requirements to reach things from the other side are more complex - areaTable[RR_GANONS_CASTLE_MQ_FOREST_TRIAL_BEAMOS_ROOM] = Region("Ganon's Castle MQ Forest Trial Beamos Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_CASTLE_MQ_FOREST_TRIAL_BEAMOS_ROOM] = Region("Ganon's Castle MQ Forest Trial Beamos Room", SCENE_INSIDE_GANONS_CASTLE, {}, { //Locations LOCATION(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, logic->CanHitEyeTargets()), LOCATION(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, logic->HasFireSource()), @@ -204,7 +204,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_FOREST_TRIAL_FINAL_ROOM, []{return logic->IsAdult && logic->CanUse(RG_SONG_OF_TIME);}), }); - areaTable[RR_GANONS_CASTLE_MQ_FOREST_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Forest Trial Final Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_FOREST_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Forest Trial Final Room", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->ForestTrialClear, []{return logic->CanUse(RG_LIGHT_ARROWS);}), }, { @@ -216,14 +216,14 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_FOREST_TRIAL_BEAMOS_ROOM, []{return true;}), }); - areaTable[RR_GANONS_CASTLE_MQ_FIRE_TRIAL_MAIN_ROOM] = Region("Ganon's Castle MQ Fire Trial Main Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GANONS_CASTLE_MQ_FIRE_TRIAL_MAIN_ROOM] = Region("Ganon's Castle MQ Fire Trial Main Room", SCENE_INSIDE_GANONS_CASTLE, {}, {}, { //Exits Entrance(RR_GANONS_CASTLE_MQ_MAIN, []{return true;}), //2 checks, 1 for the rupees, 1 for actually making it, as the rupees are permanent but throwing a pillar is not Entrance(RR_GANONS_CASTLE_MQ_FIRE_TRIAL_FINAL_ROOM, []{return Here(RR_GANONS_CASTLE_MQ_FIRE_TRIAL_MAIN_ROOM, []{return logic->CanUse(RG_GORON_TUNIC) && logic->CanUse(RG_GOLDEN_GAUNTLETS);}) && logic->CanUse(RG_GORON_TUNIC) && (logic->CanUse(RG_LONGSHOT) || (logic->CanUse(RG_GOLDEN_GAUNTLETS) && (logic->CanUse(RG_HOVER_BOOTS) || (ctx->GetTrickOption(RT_GANON_MQ_FIRE_TRIAL) && logic->IsAdult && logic->CanUse(RG_HOOKSHOT)))));}), }); - areaTable[RR_GANONS_CASTLE_MQ_FIRE_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Fire Trial Final Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_FIRE_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Fire Trial Final Room", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->FireTrialClear, []{return logic->CanUse(RG_LIGHT_ARROWS);}), //There's no way back across the lava without glitches @@ -233,7 +233,7 @@ void RegionTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2, logic->CanBreakPots()), }, {}); - areaTable[RR_GANONS_CASTLE_MQ_WATER_TRIAL_GEYSER_ROOM] = Region("Ganon's Castle MQ Water Trial Geyser Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_WATER_TRIAL_GEYSER_ROOM] = Region("Ganon's Castle MQ Water Trial Geyser Room", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->BlueFireAccess, []{return logic->CanJumpslash() || logic->HasExplosives();}), }, { @@ -246,14 +246,14 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_WATER_TRIAL_BLOCK_ROOM, []{return logic->SmallKeys(RR_GANONS_CASTLE, 3) && Here(RR_GANONS_CASTLE_MQ_WATER_TRIAL_GEYSER_ROOM, []{return logic->BlueFire();});}), }); - areaTable[RR_GANONS_CASTLE_MQ_WATER_TRIAL_BLOCK_ROOM] = Region("Ganon's Castle MQ Water Trial Block Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GANONS_CASTLE_MQ_WATER_TRIAL_BLOCK_ROOM] = Region("Ganon's Castle MQ Water Trial Block Room", SCENE_INSIDE_GANONS_CASTLE, {}, {}, { //Exits Entrance(RR_GANONS_CASTLE_MQ_WATER_TRIAL_GEYSER_ROOM, []{return logic->SmallKeys(RR_GANONS_CASTLE, 3);}), //This assumes there's no way for child to have blue fire and not adult. Entrance(RR_GANONS_CASTLE_MQ_WATER_TRIAL_FINAL_ROOM, []{return logic->IsAdult && logic->BlueFire();}), }); - areaTable[RR_GANONS_CASTLE_MQ_WATER_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Water Trial Final Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_WATER_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Water Trial Final Room", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->WaterTrialClear, []{return logic->CanUse(RG_LIGHT_ARROWS);}), }, { @@ -265,7 +265,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_WATER_TRIAL_BLOCK_ROOM, []{return Here(RR_GANONS_CASTLE_MQ_WATER_TRIAL_FINAL_ROOM, []{return logic->BlueFire();});}), }); - areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_STARTING_LEDGE] = Region("Ganon's Castle MQ Shadow Trial Starting Ledge", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_STARTING_LEDGE] = Region("Ganon's Castle MQ Shadow Trial Starting Ledge", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->ShadowTrialFirstChest, []{return logic->CanUse(RG_FAIRY_BOW);}), }, {}, { @@ -274,7 +274,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_CHEST_PLATFORM, []{return (logic->ShadowTrialFirstChest && logic->CanUse(RG_HOOKSHOT)) || (logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS));}), }); - areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_CHEST_PLATFORM] = Region("Ganon's Castle MQ Shadow Trial Chest Platform", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_CHEST_PLATFORM] = Region("Ganon's Castle MQ Shadow Trial Chest Platform", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->ShadowTrialFirstChest, []{return logic->CanUse(RG_FAIRY_BOW);}), }, { @@ -287,7 +287,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_MOVING_PLATFORM, []{return (ctx->GetTrickOption(RT_LENS_GANON_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)) && (logic->IsAdult || logic->CanUse(RG_HOVER_BOOTS));}), }); - areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_MOVING_PLATFORM] = Region("Ganon's Castle MQ Shadow Trial Moving Platform", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_MOVING_PLATFORM] = Region("Ganon's Castle MQ Shadow Trial Moving Platform", SCENE_INSIDE_GANONS_CASTLE, { //Events //A torch run from RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_STARTING_LEDGE is possible but tight, so would be a trick EventAccess(&logic->ShadowTrialFirstChest, []{return logic->CanDetonateUprightBombFlower();}), @@ -298,7 +298,7 @@ void RegionTable_Init_GanonsCastle() { }); - areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_BEAMOS_TORCH] = Region("Ganon's Castle MQ Shadow Trial Beamos Torch", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_BEAMOS_TORCH] = Region("Ganon's Castle MQ Shadow Trial Beamos Torch", SCENE_INSIDE_GANONS_CASTLE, {}, {}, { //Exits Entrance(RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_MOVING_PLATFORM, []{return ctx->GetTrickOption(RT_LENS_GANON_MQ) || logic->CanUse(RG_LENS_OF_TRUTH);}), //A torch run from RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_STARTING_LEDGE is possible but very tight, so would be a trick @@ -307,7 +307,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_FAR_SIDE, []{return logic->HasFireSource() || logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && ctx->GetTrickOption(RT_GANON_MQ_SHADOW_TRIAL) && logic->CanUse(RG_FAIRY_BOW));}), }); - areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_FAR_SIDE] = Region("Ganon's Castle MQ Shadow Trial Far Side", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_FAR_SIDE] = Region("Ganon's Castle MQ Shadow Trial Far Side", SCENE_INSIDE_GANONS_CASTLE, {}, { //Locations LOCATION(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, logic->CanHitEyeTargets()), }, { @@ -321,7 +321,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_FINAL_ROOM, []{return (ctx->GetTrickOption(RT_LENS_GANON_MQ) || logic->CanUse(RG_LENS_OF_TRUTH));}), }); - areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Shadow Trial Final Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Shadow Trial Final Room", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->ShadowTrialClear, []{return logic->CanUse(RG_LIGHT_ARROWS);}), }, { @@ -333,13 +333,13 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_FAR_SIDE, []{return (ctx->GetTrickOption(RT_LENS_GANON_MQ) || logic->CanUse(RG_LENS_OF_TRUTH));}), }); - areaTable[RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_CHAIRS_ROOM] = Region("Ganon's Castle MQ Spirit Trial Chairs Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_CHAIRS_ROOM] = Region("Ganon's Castle MQ Spirit Trial Chairs Room", SCENE_INSIDE_GANONS_CASTLE, {}, {}, { //Exits Entrance(RR_GANONS_CASTLE_MQ_MAIN, []{return true;}), Entrance(RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_BEFORE_SWITCH, []{return Here(RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_CHAIRS_ROOM, []{return (logic->CanHitEyeTargets() || ctx->GetTrickOption(RT_RUSTED_SWITCHES)) && logic->CanUse(RG_MEGATON_HAMMER);});}), }); - areaTable[RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_BEFORE_SWITCH] = Region("Ganon's Castle MQ Spirit Trial Before Switch", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_BEFORE_SWITCH] = Region("Ganon's Castle MQ Spirit Trial Before Switch", SCENE_INSIDE_GANONS_CASTLE, {}, { //Locations LOCATION(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, logic->CanPassEnemy(RE_GREEN_BUBBLE)), }, { @@ -348,7 +348,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_AFTER_SWITCH, []{return Here(RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_BEFORE_SWITCH, []{return logic->CanUse(RG_BOMBCHU_5);});}), }); - areaTable[RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_AFTER_SWITCH] = Region("Ganon's Castle MQ Spirit Trial After Switch", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_AFTER_SWITCH] = Region("Ganon's Castle MQ Spirit Trial After Switch", SCENE_INSIDE_GANONS_CASTLE, {}, { //Locations LOCATION(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, ctx->GetTrickOption(RT_LENS_GANON_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)), //better names for these would be nice. @@ -363,7 +363,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FINAL_ROOM, []{return Here(RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_AFTER_SWITCH, []{return (logic->CanUse(RG_FIRE_ARROWS) && logic->CanUse(RG_MIRROR_SHIELD));}) || (ctx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS));}), }); - areaTable[RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Spirit Trial Final Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Spirit Trial Final Room", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->SpiritTrialClear, []{return logic->CanUse(RG_LIGHT_ARROWS);}), EventAccess(&logic->NutPot, []{return true;}), @@ -376,13 +376,13 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_SPIRIT_TRIAL_AFTER_SWITCH, []{return true;}), }); - areaTable[RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_DINOLFOS_ROOM] = Region("Ganon's Castle MQ Light Trial Dinolfos Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_DINOLFOS_ROOM] = Region("Ganon's Castle MQ Light Trial Dinolfos Room", SCENE_INSIDE_GANONS_CASTLE, {}, {}, { //Exits Entrance(RR_GANONS_CASTLE_MQ_MAIN, []{return true;}), Entrance(RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_TRIFORCE_ROOM, []{return Here(RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_DINOLFOS_ROOM, []{return logic->CanKillEnemy(RE_DINOLFOS) && logic->CanKillEnemy(RE_TORCH_SLUG);});}), }); - areaTable[RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_TRIFORCE_ROOM] = Region("Ganon's Castle MQ Light Trial Triforce Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_TRIFORCE_ROOM] = Region("Ganon's Castle MQ Light Trial Triforce Room", SCENE_INSIDE_GANONS_CASTLE, {}, { //Locations LOCATION(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, logic->CanUse(RG_ZELDAS_LULLABY)), }, { @@ -391,13 +391,13 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_BOULDER_ROOM_FRONT, []{return logic->SmallKeys(RR_GANONS_CASTLE, 2);}), }); - areaTable[RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_BOULDER_ROOM_FRONT] = Region("Ganon's Castle MQ Light Trial Boulder Room Front", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_BOULDER_ROOM_FRONT] = Region("Ganon's Castle MQ Light Trial Boulder Room Front", SCENE_INSIDE_GANONS_CASTLE, {}, {}, { //Exits Entrance(RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_TRIFORCE_ROOM, []{return logic->SmallKeys(RR_GANONS_CASTLE, 2);}), Entrance(RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_BOULDER_ROOM_BACK, []{return logic->CanUse(RG_HOOKSHOT) || ctx->GetTrickOption(RT_GANON_MQ_LIGHT_TRIAL);}), }); - areaTable[RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_BOULDER_ROOM_BACK] = Region("Ganon's Castle MQ Light Trial Boulder Room Back", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_BOULDER_ROOM_BACK] = Region("Ganon's Castle MQ Light Trial Boulder Room Back", SCENE_INSIDE_GANONS_CASTLE, {}, { //Locations LOCATION(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART, true), LOCATION(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART, true), @@ -408,7 +408,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_FINAL_ROOM, []{return logic->SmallKeys(RR_GANONS_CASTLE, 3) && (ctx->GetTrickOption(RT_LENS_GANON_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)) && (logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanJumpslash() || logic->HasExplosives() || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_BOOMERANG));}), }); - areaTable[RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Light Trial Final Room", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_MQ_LIGHT_TRIAL_FINAL_ROOM] = Region("Ganon's Castle MQ Light Trial Final Room", SCENE_INSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->LightTrialClear, []{return logic->CanUse(RG_LIGHT_ARROWS);}), }, { @@ -421,7 +421,7 @@ void RegionTable_Init_GanonsCastle() { #pragma region Tower and Escape - areaTable[RR_GANONS_TOWER_ENTRYWAY] = Region("Ganon's Tower Entryway", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GANONS_TOWER_ENTRYWAY] = Region("Ganon's Tower Entryway", SCENE_INSIDE_GANONS_CASTLE, {}, {}, { //Exits Entrance(RR_GANONS_CASTLE_LOBBY, []{return ctx->GetDungeon(GANONS_CASTLE)->IsVanilla();}), Entrance(RR_GANONS_CASTLE_MQ_MAIN, []{return ctx->GetDungeon(GANONS_CASTLE)->IsMQ();}), @@ -434,13 +434,13 @@ void RegionTable_Init_GanonsCastle() { (logic->LightTrialClear || ctx->GetTrial(TK_LIGHT_TRIAL)->IsSkipped());}), }); - areaTable[RR_GANONS_TOWER_FLOOR_1] = Region("Ganon's Tower Floor 1", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GANONS_TOWER_FLOOR_1] = Region("Ganon's Tower Floor 1", SCENE_GANONS_TOWER, {}, {}, { //Exits Entrance(RR_GANONS_TOWER_ENTRYWAY, []{return Here(RR_GANONS_TOWER_FLOOR_1, []{return logic->CanKillEnemy(RE_DINOLFOS, ED_CLOSE, true, 2);});}), Entrance(RR_GANONS_TOWER_FLOOR_2, []{return Here(RR_GANONS_TOWER_FLOOR_1, []{return logic->CanKillEnemy(RE_DINOLFOS, ED_CLOSE, true, 2);});}), }); - areaTable[RR_GANONS_TOWER_FLOOR_2] = Region("Ganon's Tower Floor 2", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_TOWER_FLOOR_2] = Region("Ganon's Tower Floor 2", SCENE_GANONS_TOWER, {}, { //Locations LOCATION(RC_GANONS_TOWER_BOSS_KEY_CHEST, logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2)), }, { @@ -449,13 +449,13 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_TOWER_FLOOR_3, []{return Here(RR_GANONS_TOWER_FLOOR_2, []{return logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2);});}), }); - areaTable[RR_GANONS_TOWER_FLOOR_3] = Region("Ganon's Tower Floor 3", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GANONS_TOWER_FLOOR_3] = Region("Ganon's Tower Floor 3", SCENE_GANONS_TOWER, {}, {}, { //Exits Entrance(RR_GANONS_TOWER_FLOOR_2, []{return Here(RR_GANONS_TOWER_FLOOR_3, []{return logic->CanKillEnemy(RE_IRON_KNUCKLE, ED_CLOSE, true, 2);});}), Entrance(RR_GANONS_TOWER_BEFORE_GANONDORF_LAIR, []{return Here(RR_GANONS_TOWER_FLOOR_3, []{return logic->CanKillEnemy(RE_IRON_KNUCKLE, ED_CLOSE, true, 2);});}), }); - areaTable[RR_GANONS_TOWER_BEFORE_GANONDORF_LAIR] = Region("Ganon's Tower Before Ganondorf's Lair", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_TOWER_BEFORE_GANONDORF_LAIR] = Region("Ganon's Tower Before Ganondorf's Lair", SCENE_GANONS_TOWER, {}, { // Locations LOCATION(RC_GANONS_CASTLE_GANONS_TOWER_POT_1, logic->CanBreakPots()), LOCATION(RC_GANONS_CASTLE_GANONS_TOWER_POT_2, logic->CanBreakPots()), @@ -481,7 +481,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_TOWER_GANONDORF_LAIR, []{return Here(RR_GANONS_TOWER_BEFORE_GANONDORF_LAIR, []{return logic->HasItem(RG_GANONS_CASTLE_BOSS_KEY);});}), }); - areaTable[RR_GANONS_TOWER_GANONDORF_LAIR] = Region("Ganondorf's Lair", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_TOWER_GANONDORF_LAIR] = Region("Ganondorf's Lair", SCENE_GANONDORF_BOSS, {}, { //Locations LOCATION(RC_GANONDORF_HINT, logic->HasBossSoul(RG_GANON_SOUL)), }, { @@ -489,7 +489,7 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_ESCAPE, []{return logic->CanKillEnemy(RE_GANONDORF);}), }); - areaTable[RR_GANONS_CASTLE_ESCAPE] = Region("Ganon's Castle Escape", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_CASTLE_ESCAPE] = Region("Ganon's Castle Escape", SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR, {}, { //Locations //10 pots //RANDOTODO hook potsanity pots up to escape. @@ -501,7 +501,7 @@ void RegionTable_Init_GanonsCastle() { //Entrance(RR_GANONS_CASTLE_GANON_ARENA, []{return logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2, true);}), }); - areaTable[RR_GANONS_CASTLE_GANON_ARENA] = Region("Ganon's Arena", "Ganons Castle", {RA_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GANONS_CASTLE_GANON_ARENA] = Region("Ganon's Arena", SCENE_GANON_BOSS, {}, { //Locations LOCATION(RC_GANON, logic->CanKillEnemy(RE_GANON)), }, {}); diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp index f1a0ebee7..fc0febf8b 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp @@ -7,7 +7,7 @@ using namespace Rando; void RegionTable_Init_GerudoTrainingGround() { // clang-format off // Vanilla/MQ Decider - areaTable[RR_GERUDO_TRAINING_GROUND_ENTRYWAY] = Region("Gerudo Training Ground Entryway", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_ENTRYWAY] = Region("Gerudo Training Ground Entryway", SCENE_GERUDO_TRAINING_GROUND, {}, {}, { //Exits Entrance(RR_GERUDO_TRAINING_GROUND_LOBBY, []{return ctx->GetDungeon(GERUDO_TRAINING_GROUND)->IsVanilla();}), Entrance(RR_GERUDO_TRAINING_GROUND_MQ_LOBBY, []{return ctx->GetDungeon(GERUDO_TRAINING_GROUND)->IsMQ();}), @@ -16,7 +16,7 @@ void RegionTable_Init_GerudoTrainingGround() { #pragma region Vanilla - areaTable[RR_GERUDO_TRAINING_GROUND_LOBBY] = Region("Gerudo Training Ground Lobby", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_LOBBY] = Region("Gerudo Training Ground Lobby", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, logic->CanHitEyeTargets()), LOCATION(RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, logic->CanHitEyeTargets()), @@ -33,7 +33,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_CENTRAL_MAZE, []{return true;}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_CENTRAL_MAZE] = Region("Gerudo Training Ground Central Maze", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_CENTRAL_MAZE] = Region("Gerudo Training Ground Central Maze", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, logic->SmallKeys(RR_GERUDO_TRAINING_GROUND, 3) && (ctx->GetTrickOption(RT_LENS_GTG) || logic->CanUse(RG_LENS_OF_TRUTH))), LOCATION(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, logic->SmallKeys(RR_GERUDO_TRAINING_GROUND, 4)), @@ -45,7 +45,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_CENTRAL_MAZE_RIGHT, []{return logic->SmallKeys(RR_GERUDO_TRAINING_GROUND, 9);}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_CENTRAL_MAZE_RIGHT] = Region("Gerudo Training Ground Central Maze Right", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_CENTRAL_MAZE_RIGHT] = Region("Gerudo Training Ground Central Maze Right", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST, true), LOCATION(RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, true), @@ -56,7 +56,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_LAVA_ROOM, []{return true;}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_LAVA_ROOM] = Region("Gerudo Training Ground Lava Room", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_LAVA_ROOM] = Region("Gerudo Training Ground Lava Room", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 24), }, { @@ -65,7 +65,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_HAMMER_ROOM, []{return logic->CanUse(RG_LONGSHOT) || (logic->CanUse(RG_HOVER_BOOTS) && logic->CanUse(RG_HOOKSHOT));}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_HAMMER_ROOM] = Region("Gerudo Training Ground Hammer Room", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_HAMMER_ROOM] = Region("Gerudo Training Ground Hammer Room", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, logic->CanAttack()), LOCATION(RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, logic->CanUse(RG_MEGATON_HAMMER) || (logic->TakeDamage() && ctx->GetTrickOption(RT_FLAMING_CHESTS))), @@ -75,7 +75,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_LAVA_ROOM, []{return true;}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_EYE_STATUE_LOWER] = Region("Gerudo Training Ground Eye Statue Lower", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_EYE_STATUE_LOWER] = Region("Gerudo Training Ground Eye Statue Lower", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, logic->CanUse(RG_FAIRY_BOW)), }, { @@ -83,7 +83,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_HAMMER_ROOM, []{return true;}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_EYE_STATUE_UPPER] = Region("Gerudo Training Ground Eye Statue Upper", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_EYE_STATUE_UPPER] = Region("Gerudo Training Ground Eye Statue Upper", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, logic->CanUse(RG_FAIRY_BOW)), }, { @@ -91,7 +91,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_EYE_STATUE_LOWER, []{return true;}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_ROOM] = Region("Gerudo Training Ground Heavy Block Room", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_ROOM] = Region("Gerudo Training Ground Heavy Block Room", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, logic->CanKillEnemy(RE_WOLFOS, ED_CLOSE, true, 4, true)), }, { @@ -100,7 +100,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_LIKE_LIKE_ROOM, []{return (ctx->GetTrickOption(RT_LENS_GTG) || logic->CanUse(RG_LENS_OF_TRUTH)) && (logic->CanUse(RG_HOOKSHOT) || (ctx->GetTrickOption(RT_GTG_FAKE_WALL) && logic->CanUse(RG_HOVER_BOOTS))) && logic->CanUse(RG_SILVER_GAUNTLETS);}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_LIKE_LIKE_ROOM] = Region("Gerudo Training Ground Like Like Room", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_LIKE_LIKE_ROOM] = Region("Gerudo Training Ground Like Like Room", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, logic->CanJumpslashExceptHammer()), LOCATION(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, logic->CanJumpslashExceptHammer()), @@ -112,7 +112,7 @@ void RegionTable_Init_GerudoTrainingGround() { #pragma region MQ - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_LOBBY] = Region("Gerudo Training Ground MQ Lobby", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_LOBBY] = Region("Gerudo Training Ground MQ Lobby", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, true), LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, true), @@ -132,7 +132,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_ROOM, []{return Here(RR_GERUDO_TRAINING_GROUND_MQ_LOBBY, []{return (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW)) || (logic->IsChild && logic->CanUse(RG_FAIRY_SLINGSHOT));});}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAZE_HIDDEN_ROOM] = Region("Gerudo Training Ground MQ Maze Hidden Room", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAZE_HIDDEN_ROOM] = Region("Gerudo Training Ground MQ Maze Hidden Room", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, true), }, { @@ -140,7 +140,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_LOBBY, []{return true;}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAZE_FIRST_LOCK] = Region("Gerudo Training Ground MQ Maze First Lock", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAZE_FIRST_LOCK] = Region("Gerudo Training Ground MQ Maze First Lock", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, true), }, { @@ -149,7 +149,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_MAZE_CENTER, []{return logic->SmallKeys(RR_GERUDO_TRAINING_GROUND, 3);}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAZE_CENTER] = Region("Gerudo Training Ground MQ Maze Center", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAZE_CENTER] = Region("Gerudo Training Ground MQ Center", SCENE_GERUDO_TRAINING_GROUND, { //Events EventAccess(&logic->MQGTGMazeSwitch, []{return logic->CanUse(RG_MEGATON_HAMMER);}), }, @@ -161,7 +161,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_MAZE_FIRST_LOCK, []{return logic->SmallKeys(RR_GERUDO_TRAINING_GROUND, 3);}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_SAND_ROOM] = Region("Gerudo Training Ground MQ Sand Room", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_SAND_ROOM] = Region("Gerudo Training Ground MQ Sand Room", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, logic->CanKillEnemy(RE_IRON_KNUCKLE)), }, { @@ -170,13 +170,13 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_LEFT_SIDE, []{return Here(RR_GERUDO_TRAINING_GROUND_MQ_SAND_ROOM, []{return logic->CanKillEnemy(RE_IRON_KNUCKLE);});}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_LEFT_SIDE] = Region("Gerudo Training Ground MQ Left Side", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_LEFT_SIDE] = Region("Gerudo Training Ground MQ Left Side", SCENE_GERUDO_TRAINING_GROUND, {}, {}, { //Exits Entrance(RR_GERUDO_TRAINING_GROUND_MQ_SAND_ROOM, []{return true;}), Entrance(RR_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM, []{return Here(RR_GERUDO_TRAINING_GROUND_MQ_LEFT_SIDE, []{return logic->CanUse(RG_LONGSHOT) || ctx->GetTrickOption(RT_GTG_MQ_WIHTOUT_HOOKSHOT) || (ctx->GetTrickOption(RT_GTG_MQ_WITH_HOOKSHOT) && logic->IsAdult && logic->CanJumpslash() && logic->CanUse(RG_HOOKSHOT));});}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM] = Region("Gerudo Training Ground MQ Stalfos Room", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM] = Region("Gerudo Training Ground MQ Stalfos Room", SCENE_GERUDO_TRAINING_GROUND, { //Events EventAccess(&logic->BlueFireAccess, []{return true;}), }, { @@ -189,13 +189,13 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_STATUE_ROOM_LEDGE, []{return logic->IsAdult && Here(RR_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM, []{return logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2, true);}) && (ctx->GetTrickOption(RT_LENS_GTG_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->BlueFire() && (logic->CanUse(RG_SONG_OF_TIME) || (ctx->GetTrickOption(RT_GTG_FAKE_WALL) && logic->CanUse(RG_HOVER_BOOTS)));}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_BEHIND_BLOCK] = Region("Gerudo Training Ground MQ Behind Block", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_BEHIND_BLOCK] = Region("Gerudo Training Ground MQ Behind Block", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations //implies logic->CanKillEnemy(RE_SPIKE) LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, logic->CanKillEnemy(RE_FREEZARD)), }, {}); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_STATUE_ROOM_LEDGE] = Region("Gerudo Training Ground MQ Statue Room Ledge", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_STATUE_ROOM_LEDGE] = Region("Gerudo Training Ground MQ Statue Room Ledge", SCENE_GERUDO_TRAINING_GROUND, {}, {}, { //Exits Entrance(RR_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM, []{return true;}), //implies dropping down to hit the switch. Using swords, especially master, is a bit awkward, may be trick worthy, but is only relevant with other tricks @@ -203,7 +203,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_STATUE_ROOM, []{return true;}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAGENTA_FIRE_ROOM] = Region("Gerudo Training Ground MQ Magenta Fire Room", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAGENTA_FIRE_ROOM] = Region("Gerudo Training Ground MQ Magenta Fire Room", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, logic->MQGTGMazeSwitch), }, { @@ -211,7 +211,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_STATUE_ROOM_LEDGE, []{return true;}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_STATUE_ROOM] = Region("Gerudo Training Ground MQ Statue ROom", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_STATUE_ROOM] = Region("Gerudo Training Ground MQ Statue ROom", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, logic->CanUse(RG_FAIRY_BOW)), }, { @@ -220,7 +220,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_TORCH_SLUG_ROOM, []{return true;}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_TORCH_SLUG_ROOM] = Region("Gerudo Training Ground MQ Torch Slug Room", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_TORCH_SLUG_ROOM] = Region("Gerudo Training Ground MQ Torch Slug Room", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations //implies logic->CanKillEnemy(RE_TORCH_SLUG) LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, logic->CanKillEnemy(RE_IRON_KNUCKLE)), @@ -231,7 +231,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_SWITCH_LEDGE, []{return Here(RR_GERUDO_TRAINING_GROUND_MQ_TORCH_SLUG_ROOM, []{return logic->CanKillEnemy(RE_IRON_KNUCKLE);});}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_SWITCH_LEDGE] = Region("Gerudo Training Ground MQ Switch Ledge", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_SWITCH_LEDGE] = Region("Gerudo Training Ground MQ Switch Ledge", SCENE_GERUDO_TRAINING_GROUND, { //Events EventAccess(&logic->MQGTGRightSideSwitch, []{return logic->CanUse(RG_MEGATON_HAMMER);}), EventAccess(&logic->GTGPlatformSilverRupees, []{return logic->CanUse(RG_FIRE_ARROWS) && logic->CanUse(RG_HOVER_BOOTS);}), @@ -246,7 +246,7 @@ void RegionTable_Init_GerudoTrainingGround() { //this region exists to place silver rupee items on later, normally it's all on fire and cannot be stood on without access from another area //This covers the 2 platforms that can be jumped to directly from RR_GERUDO_TRAINING_GROUND_MQ_SWITCH_LEDGE //the unshuffled rupee collection is handled by the event GTGPlatformSilverRupees - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_LEDGE_SIDE_PLATFORMS] = Region("Gerudo Training Ground MQ Ledge Side Platforms", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_LEDGE_SIDE_PLATFORMS] = Region("Gerudo Training Ground MQ Ledge Side Platforms", SCENE_GERUDO_TRAINING_GROUND, {}, {}, { //Exits //This is merely to extend this region's logic if you have hovers Entrance(RR_GERUDO_TRAINING_GROUND_MQ_FURTHEST_PLATFORM, []{return logic->CanUse(RG_HOVER_BOOTS);}), @@ -255,13 +255,13 @@ void RegionTable_Init_GerudoTrainingGround() { //this region exists to place silver rupee items on later, normally it's all on fire and cannot be stood on without access from another area //This covers the platform that needs hover boots or the spawned targets to reach from any starting point other than RR_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT //the unshuffled rupee collection is handled by the event GTGPlatformSilverRupees - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_FURTHEST_PLATFORM] = Region("Gerudo Training Ground MQ Furthest Platform", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_FURTHEST_PLATFORM] = Region("Gerudo Training Ground MQ Furthest Platform", SCENE_GERUDO_TRAINING_GROUND, {}, {}, { //Exits //This is merely to extend this region's logic if you have hovers Entrance(RR_GERUDO_TRAINING_GROUND_MQ_LEDGE_SIDE_PLATFORMS, []{return logic->CanUse(RG_HOVER_BOOTS);}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_PLATFORMS_UNLIT_TORCH] = Region("Gerudo Training Ground MQ Platforms Unlit Torch", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_PLATFORMS_UNLIT_TORCH] = Region("Gerudo Training Ground MQ Platforms Unlit Torch", SCENE_GERUDO_TRAINING_GROUND, { //Events EventAccess(&logic->GTGPlatformSilverRupees, []{return logic->HasFireSource() && logic->CanUse(RG_HOVER_BOOTS);}), }, {}, { @@ -272,7 +272,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT, []{return logic->MQGTGRightSideSwitch && (logic->CanUse(RG_LONGSHOT) || (logic->CanUse(RG_HOOKSHOT) && logic->HasFireSource()));}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_TORCH_SIDE_PLATFORMS] = Region("Gerudo Training Ground Torch Side Platforms", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_TORCH_SIDE_PLATFORMS] = Region("Gerudo Training Ground Torch Side Platforms", SCENE_GERUDO_TRAINING_GROUND, { //Events //this torch shot is possible as child but tight and obtuse enough to be a trick EventAccess(&logic->GTGPlatformSilverRupees, []{return ((logic->CanUse(RG_FAIRY_BOW) && logic->IsAdult) || logic->CanUse(RG_FIRE_ARROWS)) && logic->CanUse(RG_HOVER_BOOTS);}), @@ -284,7 +284,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_ROOM, []{return true;}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_UNDERWATER] = Region("Gerudo Training Ground MQ Underwater", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_UNDERWATER] = Region("Gerudo Training Ground MQ Underwater", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations //it is possible to snipe the stingers with bow or sling before dropping in, or just get really lucky, and avoid needing to take damage, but that might be trick worthy LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, logic->HasFireSource() && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 24 && logic->TakeDamage()), @@ -294,7 +294,7 @@ void RegionTable_Init_GerudoTrainingGround() { }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT] = Region("Gerudo Training Ground MQ Maze Right", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT] = Region("Gerudo Training Ground MQ Maze Right", SCENE_GERUDO_TRAINING_GROUND, { //Events EventAccess(&logic->GTGPlatformSilverRupees, []{return logic->CanUse(RG_FIRE_ARROWS) && logic->CanUse(RG_HOVER_BOOTS);}), }, { @@ -310,7 +310,7 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_FURTHEST_PLATFORM, []{return logic->CanUse(RG_FIRE_ARROWS);}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_ROOM] = Region("Gerudo Training Ground MQ Dinolfos Room", "Gerudo Training Ground", {RA_GERUDO_TRAINING_GROUND}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_ROOM] = Region("Gerudo Training Ground MQ Dinolfos Room", SCENE_GERUDO_TRAINING_GROUND, { //Events //EventAccess(&WallFairy, []{return WallFairy || (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW));}), }, { diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp index 20ff9b1e1..5151377ce 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp @@ -7,7 +7,7 @@ using namespace Rando; void RegionTable_Init_IceCavern() { // clang-format off // Vanilla/MQ Decider - areaTable[RR_ICE_CAVERN_ENTRYWAY] = Region("Ice Cavern Entryway", "Ice Cavern", {RA_ICE_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_ICE_CAVERN_ENTRYWAY] = Region("Ice Cavern Entryway", SCENE_ICE_CAVERN, {}, {}, { //Exits Entrance(RR_ICE_CAVERN_BEGINNING, []{return ctx->GetDungeon(ICE_CAVERN)->IsVanilla();}), Entrance(RR_ICE_CAVERN_MQ_BEGINNING, []{return ctx->GetDungeon(ICE_CAVERN)->IsMQ() && logic->CanUseProjectile();}), @@ -16,7 +16,7 @@ void RegionTable_Init_IceCavern() { #pragma region Vanilla - areaTable[RR_ICE_CAVERN_BEGINNING] = Region("Ice Cavern Beginning", "Ice Cavern", {RA_ICE_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ICE_CAVERN_BEGINNING] = Region("Ice Cavern Beginning", SCENE_ICE_CAVERN, {}, { //Locations LOCATION(RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), }, { @@ -25,7 +25,7 @@ void RegionTable_Init_IceCavern() { Entrance(RR_ICE_CAVERN_MAIN, []{return Here(RR_ICE_CAVERN_BEGINNING, []{return logic->CanKillEnemy(RE_FREEZARD, ED_CLOSE, true, 4);});}), }); - areaTable[RR_ICE_CAVERN_MAIN] = Region("Ice Cavern", "Ice Cavern", {RA_ICE_CAVERN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_ICE_CAVERN_MAIN] = Region("Ice Cavern", SCENE_ICE_CAVERN, { //Events EventAccess(&logic->BlueFireAccess, []{return logic->IsAdult;}), }, { @@ -59,7 +59,7 @@ void RegionTable_Init_IceCavern() { #pragma region MQ - areaTable[RR_ICE_CAVERN_MQ_BEGINNING] = Region("Ice Cavern MQ Beginning", "Ice Cavern", {RA_ICE_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ICE_CAVERN_MQ_BEGINNING] = Region("Ice Cavern MQ Beginning", SCENE_ICE_CAVERN, {}, { //Locations LOCATION(RC_ICE_CAVERN_MQ_ENTRANCE_POT, logic->CanBreakPots()), }, { @@ -69,7 +69,7 @@ void RegionTable_Init_IceCavern() { Entrance(RR_ICE_CAVERN_MQ_HUB, []{return true;}), }); - areaTable[RR_ICE_CAVERN_MQ_HUB] = Region("Ice Cavern MQ Hub", "Ice Cavern", {RA_ICE_CAVERN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_ICE_CAVERN_MQ_HUB] = Region("Ice Cavern MQ Hub", SCENE_ICE_CAVERN, { //Events EventAccess(&logic->FairyPot, []{return true;}), }, { @@ -90,7 +90,7 @@ void RegionTable_Init_IceCavern() { Entrance(RR_ICE_CAVERN_MQ_SCARECROW_ROOM, []{return logic->BlueFire();}), }); - areaTable[RR_ICE_CAVERN_MQ_MAP_ROOM] = Region("Ice Cavern MQ Map Room", "Ice Cavern", {RA_ICE_CAVERN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_ICE_CAVERN_MQ_MAP_ROOM] = Region("Ice Cavern MQ Map Room", SCENE_ICE_CAVERN, { //Events //Child can fit between the stalagmites on the left hand side EventAccess(&logic->BlueFireAccess, []{return logic->IsChild || logic->CanJumpslash() || logic->HasExplosives();}), @@ -99,7 +99,7 @@ void RegionTable_Init_IceCavern() { LOCATION(RC_ICE_CAVERN_MQ_MAP_CHEST, logic->BlueFire() && Here(RR_ICE_CAVERN_MQ_MAP_ROOM, []{return logic->CanHitSwitch();})), }, {}); - areaTable[RR_ICE_CAVERN_MQ_SCARECROW_ROOM] = Region("Ice Cavern MQ Scarecrow Room", "Ice Cavern", {RA_ICE_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ICE_CAVERN_MQ_SCARECROW_ROOM] = Region("Ice Cavern MQ Scarecrow Room", SCENE_ICE_CAVERN, {}, { //Locations LOCATION(RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, (logic->BlueFire() && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)) || (logic->IsAdult && logic->CanHitSwitch(ED_LONG_JUMPSLASH))), LOCATION(RC_ICE_CAVERN_MQ_GS_SCARECROW, logic->CanUse(RG_SCARECROW) || (logic->IsAdult && (logic->CanUse(RG_LONGSHOT) || ctx->GetTrickOption(RT_ICE_MQ_SCARECROW)))), @@ -110,7 +110,7 @@ void RegionTable_Init_IceCavern() { Entrance(RR_ICE_CAVERN_MQ_WEST_CORRIDOR, []{return logic->IsAdult && logic->BlueFire();}), }); - areaTable[RR_ICE_CAVERN_MQ_WEST_CORRIDOR] = Region("Ice Cavern MQ West Corridor", "Ice Cavern", {RA_ICE_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ICE_CAVERN_MQ_WEST_CORRIDOR] = Region("Ice Cavern MQ West Corridor", SCENE_ICE_CAVERN, {}, { //Locations LOCATION(RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1, logic->CanBreakPots()), LOCATION(RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2, logic->CanBreakPots()), @@ -120,7 +120,7 @@ void RegionTable_Init_IceCavern() { Entrance(RR_ICE_CAVERN_MQ_STALFOS_ROOM, []{return true;}), }); - areaTable[RR_ICE_CAVERN_MQ_STALFOS_ROOM] = Region("Ice Cavern MQ Stalfos Room", "Ice Cavern", {RA_ICE_CAVERN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ICE_CAVERN_MQ_STALFOS_ROOM] = Region("Ice Cavern MQ Stalfos Room", SCENE_ICE_CAVERN, {}, { //Locations LOCATION(RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, logic->CanKillEnemy(RE_STALFOS)), LOCATION(RC_SHEIK_IN_ICE_CAVERN, logic->CanKillEnemy(RE_STALFOS)), @@ -130,7 +130,7 @@ void RegionTable_Init_IceCavern() { Entrance(RR_ICE_CAVERN_MQ_BEGINNING, []{return logic->CanUse(RG_IRON_BOOTS) && Here(RR_ICE_CAVERN_MQ_STALFOS_ROOM, []{return logic->CanKillEnemy(RE_STALFOS);});}), }); - areaTable[RR_ICE_CAVERN_MQ_COMPASS_ROOM] = Region("Ice Cavern MQ Compass Room", "Ice Cavern", {RA_ICE_CAVERN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_ICE_CAVERN_MQ_COMPASS_ROOM] = Region("Ice Cavern MQ Compass Room", SCENE_ICE_CAVERN, { //Events EventAccess(&logic->BlueFireAccess, []{return true;}), }, { diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp index 84d6ce7e5..c40ccf805 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/jabujabus_belly.cpp @@ -7,7 +7,7 @@ using namespace Rando; void RegionTable_Init_JabuJabusBelly() { // clang-format off // Vanilla/MQ Decider - areaTable[RR_JABU_JABUS_BELLY_ENTRYWAY] = Region("Jabu Jabus Belly Entryway", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_JABU_JABUS_BELLY_ENTRYWAY] = Region("Jabu Jabus Belly Entryway", SCENE_JABU_JABU, {}, {}, { //Exits Entrance(RR_JABU_JABUS_BELLY_BEGINNING, []{return ctx->GetDungeon(JABU_JABUS_BELLY)->IsVanilla();}), Entrance(RR_JABU_JABUS_BELLY_MQ_BEGINNING, []{return ctx->GetDungeon(JABU_JABUS_BELLY)->IsMQ();}), @@ -16,14 +16,14 @@ void RegionTable_Init_JabuJabusBelly() { #pragma region Vanilla - areaTable[RR_JABU_JABUS_BELLY_BEGINNING] = Region("Jabu Jabus Belly Beginning", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_JABU_JABUS_BELLY_BEGINNING] = Region("Jabu Jabus Belly Beginning", SCENE_JABU_JABU, {}, {}, { //Exits Entrance(RR_JABU_JABUS_BELLY_ENTRYWAY, []{return true;}), Entrance(RR_JABU_JABUS_BELLY_MAIN, []{return logic->CanUseProjectile();}), }); //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, { + areaTable[RR_JABU_JABUS_BELLY_MAIN] = Region("Jabu Jabus Belly Main", SCENE_JABU_JABU, { //Events EventAccess(&logic->JabuWestTentacle, []{return logic->JabuRutoIn1F && logic->CanKillEnemy(RE_TENTACLE, ED_BOOMERANG);}), }, { @@ -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, { + areaTable[RR_JABU_JABUS_BELLY_B1_NORTH] = Region("Jabu Jabus Belly B1 North", SCENE_JABU_JABU, { //Events EventAccess(&logic->JabuRutoIn1F, []{return logic->IsAdult || logic->HasItem(RG_BRONZE_SCALE);}), EventAccess(&logic->FairyPot, []{return logic->CanUse(RG_BOOMERANG) || (logic->CanUse(RG_HOVER_BOOTS) && logic->CanKillEnemy(RE_OCTOROK));}), @@ -68,7 +68,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_WATER_SWITCH_ROOM_SOUTH, []{return logic->IsAdult || logic->HasItem(RG_BRONZE_SCALE);}), }); - areaTable[RR_JABU_JABUS_BELLY_WATER_SWITCH_ROOM_LEDGE] = Region("Jabu Jabus Belly Water Switch Room Ledge", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_WATER_SWITCH_ROOM_LEDGE] = Region("Jabu Jabus Belly Water Switch Room Ledge", SCENE_JABU_JABU, { //Events EventAccess(&logic->FairyPot, []{return true;}), }, { @@ -84,7 +84,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_WATER_SWITCH_ROOM_SOUTH, []{return true;}), }); - areaTable[RR_JABU_JABUS_BELLY_WATER_SWITCH_ROOM_SOUTH] = Region("Jabu Jabus Belly Water Switch Room South", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_JABU_JABUS_BELLY_WATER_SWITCH_ROOM_SOUTH] = Region("Jabu Jabus Belly Water Switch Room South", SCENE_JABU_JABU, {}, { //Locations LOCATION(RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, logic->HookshotOrBoomerang()), }, { @@ -94,7 +94,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_MAIN, []{return logic->CanUseProjectile();}), }); - areaTable[RR_JABU_JABUS_BELLY_COMPASS_ROOM] = Region("Jabu Jabus Belly Compass Room", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_JABU_JABUS_BELLY_COMPASS_ROOM] = Region("Jabu Jabus Belly Compass Room", SCENE_JABU_JABU, {}, { //Locations //ruto could theoretically clear this room, but it's hard because of the timer and she doesn't appear with you when you respawn after failing, which would force a savewarp LOCATION(RC_JABU_JABUS_BELLY_COMPASS_CHEST, logic->CanKillEnemy(RE_SHABOM)), @@ -103,7 +103,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_MAIN, []{return Here(RR_JABU_JABUS_BELLY_COMPASS_ROOM, []{return logic->CanKillEnemy(RE_SHABOM);});}), }); - areaTable[RR_JABU_JABUS_BELLY_BLUE_TENTACLE] = Region("Jabu Jabus Belly Blue Tentacle", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_BLUE_TENTACLE] = Region("Jabu Jabus Belly Blue Tentacle", SCENE_JABU_JABU, { //Events EventAccess(&logic->JabuEastTentacle, []{return logic->CanKillEnemy(RE_TENTACLE, ED_BOOMERANG);}), }, {}, { @@ -111,7 +111,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_MAIN, []{return logic->JabuEastTentacle;}), }); - areaTable[RR_JABU_JABUS_BELLY_GREEN_TENTACLE] = Region("Jabu Jabus Belly Green Tentacle", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_GREEN_TENTACLE] = Region("Jabu Jabus Belly Green Tentacle", SCENE_JABU_JABU, { //Events EventAccess(&logic->JabuNorthTentacle, []{return logic->CanKillEnemy(RE_TENTACLE, ED_BOOMERANG);}), }, {}, { @@ -120,7 +120,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_MAIN, []{return logic->JabuNorthTentacle;}), }); - areaTable[RR_JABU_JABUS_BELLY_BIGOCTO_LEDGE] = Region("Jabu Jabus Belly Bigocto Room", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_JABU_JABUS_BELLY_BIGOCTO_LEDGE] = Region("Jabu Jabus Belly Bigocto Room", SCENE_JABU_JABU, {}, { //Locations //Only adult can get the token without assistance LOCATION(RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_SHORT_JUMPSLASH)), @@ -131,7 +131,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_ABOVE_BIGOCTO, []{return logic->JabuRutoIn1F && Here(RR_JABU_JABUS_BELLY_BIGOCTO_LEDGE, []{return logic->CanKillEnemy(RE_BIG_OCTO);});}), }); - areaTable[RR_JABU_JABUS_BELLY_ABOVE_BIGOCTO] = Region("Jabu Jabus Belly Above Bigocto", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_ABOVE_BIGOCTO] = Region("Jabu Jabus Belly Above Bigocto", SCENE_JABU_JABU, { //Events EventAccess(&logic->FairyPot, []{return true;}), EventAccess(&logic->NutPot, []{return true;}), @@ -145,7 +145,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_LIFT_UPPER, []{return logic->CanUse(RG_BOOMERANG);}), }); - areaTable[RR_JABU_JABUS_BELLY_LIFT_UPPER] = Region("Jabu Jabus Belly Lift Upper", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_LIFT_UPPER] = Region("Jabu Jabus Belly Lift Upper", SCENE_JABU_JABU, { //Events EventAccess(&logic->LoweredJabuPath, []{return true;}), }, {}, { @@ -153,7 +153,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_MAIN, []{return true;}), }); - areaTable[RR_JABU_JABUS_BELLY_NEAR_BOSS_ROOM] = Region("Jabu Jabus Belly Near Boss Room", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_JABU_JABUS_BELLY_NEAR_BOSS_ROOM] = Region("Jabu Jabus Belly Near Boss Room", SCENE_JABU_JABU, {}, { //Locations LOCATION(RC_JABU_JABUS_BELLY_GS_NEAR_BOSS, logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_BOMB_THROW)), }, { @@ -166,7 +166,7 @@ void RegionTable_Init_JabuJabusBelly() { #pragma region MQ - areaTable[RR_JABU_JABUS_BELLY_MQ_BEGINNING] = Region("Jabu Jabus Belly MQ Beginning", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_MQ_BEGINNING] = Region("Jabu Jabus Belly MQ Beginning", SCENE_JABU_JABU, { //Events EventAccess(&logic->NutPot, []{return true;}), }, { @@ -183,7 +183,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM, []{return Here(RR_JABU_JABUS_BELLY_MQ_BEGINNING, []{return logic->CanUse(RG_FAIRY_SLINGSHOT);});}), }); - areaTable[RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM] = Region("Jabu Jabus Belly MQ Lift Room", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM] = Region("Jabu Jabus Belly MQ Lift Room", SCENE_JABU_JABU, { //Events EventAccess(&logic->MQJabuLiftRoomCow, []{return logic->CanUse(RG_FAIRY_SLINGSHOT);}), }, { @@ -203,7 +203,7 @@ void RegionTable_Init_JabuJabusBelly() { //If opening RR_JABU_JABUS_BELLY_MQ_WATER_SWITCH_ROOM by lowering the geyser as 1 age is to let the other through is relevant, it needs an eventAccess }); - areaTable[RR_JABU_JABUS_BELLY_MQ_UNDERWATER_ALCOVE] = Region("Jabu Jabus Belly MQ Underwater Alcove", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_MQ_UNDERWATER_ALCOVE] = Region("Jabu Jabus Belly MQ Underwater Alcove", SCENE_JABU_JABU, { //Events EventAccess(&logic->MQJabuHolesRoomDoor, []{return true;}), }, { @@ -220,7 +220,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM, []{return logic->HasItem(RG_BRONZE_SCALE);}), }); - areaTable[RR_JABU_JABUS_BELLY_MQ_HOLES_ROOM] = Region("Jabu Jabus Belly MQ Holes Room", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_JABU_JABUS_BELLY_MQ_HOLES_ROOM] = Region("Jabu Jabus Belly MQ Holes Room", SCENE_JABU_JABU, {}, { //Locations LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)), LOCATION(RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, logic->CanUse(RG_FAIRY_SLINGSHOT)), @@ -238,7 +238,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_MQ_PAST_OCTO, []{return logic->JabuWestTentacle && Here(RR_JABU_JABUS_BELLY_MQ_HOLES_ROOM, []{return logic->CanKillEnemy(RE_BIG_OCTO);}) && logic->CanUse(RG_FAIRY_SLINGSHOT);}), }); - areaTable[RR_JABU_JABUS_BELLY_MQ_WATER_SWITCH_ROOM] = Region("Jabu Jabus Belly MQ Water Switch Room", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_JABU_JABUS_BELLY_MQ_WATER_SWITCH_ROOM] = Region("Jabu Jabus Belly MQ Water Switch Room", SCENE_JABU_JABU, {}, { //Locations LOCATION(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, true), //Implies logic->CanKillEnemy(RE_LIKE_LIKE) && logic->CanKillEnemy(RE_STINGER). Without swim, jump from the song of time block to the vines. @@ -255,7 +255,7 @@ void RegionTable_Init_JabuJabusBelly() { }); //Includes Like Like room - areaTable[RR_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR] = Region("Jabu Jabus Belly MQ Forked Corridor", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR] = Region("Jabu Jabus Belly MQ Forked Corridor", SCENE_JABU_JABU, { //Events EventAccess(&logic->JabuNorthTentacle, []{return Here(RR_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR, []{return logic->BlastOrSmash();}) && logic->CanUse(RG_BOOMERANG);}), }, { @@ -274,7 +274,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_MQ_WEST_FORKED_ROOMS, []{return Here(RR_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR, []{return logic->CanUse(RG_BOOMERANG);}) && (Here(RR_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR, []{return logic->CanUse(RG_FAIRY_SLINGSHOT) && logic->CanUse(RG_STICKS);}) || Here(RR_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR, []{return logic->HasFireSource();}));}), }); - areaTable[RR_JABU_JABUS_BELLY_MQ_WEST_FORKED_ROOMS] = Region("Jabu Jabus Belly MQ West Forked Rooms", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_MQ_WEST_FORKED_ROOMS] = Region("Jabu Jabus Belly MQ West Forked Rooms", SCENE_JABU_JABU, { //Events EventAccess(&logic->JabuWestTentacle, []{return logic->CanKillEnemy(RE_TENTACLE, ED_BOOMERANG);}), }, { @@ -285,7 +285,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_MQ_FORKED_CORRIDOR, []{return true;}), }); - areaTable[RR_JABU_JABUS_BELLY_MQ_INVISIBLE_KEESE_ROOM] = Region("Jabu Jabus Belly MQ Invisible Keese Room", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_JABU_JABUS_BELLY_MQ_INVISIBLE_KEESE_ROOM] = Region("Jabu Jabus Belly MQ Invisible Keese Room", SCENE_JABU_JABU, {}, { //Locations LOCATION(RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, //firstly, we can just use FAs to clear the web and then longshot the skull logic->CanUse(RG_FIRE_ARROWS) && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_LONGSHOT) || @@ -305,7 +305,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_MQ_HOLES_ROOM, []{return (logic->JabuNorthTentacle || logic->TakeDamage()) && logic->HasItem(RG_BRONZE_SCALE);}), }); - areaTable[RR_JABU_JABUS_BELLY_MQ_PAST_OCTO] = Region("Jabu Jabus Belly MQ Past Octo", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_MQ_PAST_OCTO] = Region("Jabu Jabus Belly MQ Past Octo", SCENE_JABU_JABU, { //Events //if a hover up to the path is added, this will want it's own room EventAccess(&logic->LoweredJabuPath, []{return logic->CanUse(RG_BOOMERANG) && logic->CanUse(RG_FAIRY_SLINGSHOT);}), @@ -324,7 +324,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_MQ_HOLES_ROOM, []{return logic->TakeDamage() && Here(RR_JABU_JABUS_BELLY_MQ_PAST_OCTO, []{return logic->CanKillEnemy(RE_BIG_OCTO);});}), }); - areaTable[RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM_EAST_LEDGE] = Region("Jabu Jabus Belly MQ Lift Room East Ledge", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_JABU_JABUS_BELLY_MQ_LIFT_ROOM_EAST_LEDGE] = Region("Jabu Jabus Belly MQ Lift Room East Ledge", SCENE_JABU_JABU, {}, { //Locations LOCATION(RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, logic->MQJabuLiftRoomCow), }, { @@ -333,7 +333,7 @@ void RegionTable_Init_JabuJabusBelly() { Entrance(RR_JABU_JABUS_BELLY_MQ_EAST_ROOM, []{return logic->JabuNorthTentacle;}), }); - areaTable[RR_JABU_JABUS_BELLY_MQ_EAST_ROOM] = Region("Jabu Jabus Belly MQ Boss Region", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_MQ_EAST_ROOM] = Region("Jabu Jabus Belly MQ Boss Region", SCENE_JABU_JABU, { //Events EventAccess(&logic->FairyPot, []{return true;}), }, { @@ -352,18 +352,18 @@ void RegionTable_Init_JabuJabusBelly() { #pragma endregion // Boss Room - areaTable[RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY] = Region("Jabu Jabus Belly Boss Entryway", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_JABU_JABUS_BELLY_BOSS_ENTRYWAY] = Region("Jabu Jabus Belly Boss Entryway", SCENE_JABU_JABU, {}, {}, { // Exits Entrance(RR_JABU_JABUS_BELLY_BOSS_ROOM, []{return true;}), }); - areaTable[RR_JABU_JABUS_BELLY_BOSS_EXIT] = Region("Jabu Jabus Belly Boss Exit", "Jabu Jabus Belly", {RA_JABU_JABUS_BELLY}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_JABU_JABUS_BELLY_BOSS_EXIT] = Region("Jabu Jabus Belly Boss Exit", SCENE_JABU_JABU, {}, {}, { // Exits Entrance(RR_JABU_JABUS_BELLY_NEAR_BOSS_ROOM, []{return ctx->GetDungeon(JABU_JABUS_BELLY)->IsVanilla();}), Entrance(RR_JABU_JABUS_BELLY_MQ_EAST_ROOM, []{return ctx->GetDungeon(JABU_JABUS_BELLY)->IsMQ();}), }); - areaTable[RR_JABU_JABUS_BELLY_BOSS_ROOM] = Region("Jabu Jabus Belly Boss Room", "Jabu Jabus Belly", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_JABU_JABUS_BELLY_BOSS_ROOM] = Region("Jabu Jabus Belly Boss Room", SCENE_JABU_JABU_BOSS, { // Events //todo: add pot kill trick EventAccess(&logic->JabuJabusBellyClear, []{return logic->CanKillEnemy(RE_BARINADE);}), }, { diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp index c91e011ea..127320129 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp @@ -7,7 +7,7 @@ using namespace Rando; void RegionTable_Init_ShadowTemple() { // clang-format off // Vanilla/MQ Decider - areaTable[RR_SHADOW_TEMPLE_ENTRYWAY] = Region("Shadow Temple Entryway", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SHADOW_TEMPLE_ENTRYWAY] = Region("Shadow Temple Entryway", SCENE_SHADOW_TEMPLE, {}, {}, { //Exits Entrance(RR_SHADOW_TEMPLE_BEGINNING, []{return ctx->GetDungeon(SHADOW_TEMPLE)->IsVanilla() && (ctx->GetTrickOption(RT_LENS_SHADOW) || logic->CanUse(RG_LENS_OF_TRUTH)) && (logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT));}), Entrance(RR_SHADOW_TEMPLE_MQ_BEGINNING, []{return ctx->GetDungeon(SHADOW_TEMPLE)->IsMQ();}), @@ -16,7 +16,7 @@ void RegionTable_Init_ShadowTemple() { #pragma region Vanilla - areaTable[RR_SHADOW_TEMPLE_BEGINNING] = Region("Shadow Temple Beginning", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SHADOW_TEMPLE_BEGINNING] = Region("Shadow Temple Beginning", SCENE_SHADOW_TEMPLE, { //Events EventAccess(&logic->NutPot, []{return true;}), }, { @@ -37,7 +37,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_FIRST_BEAMOS, []{return logic->CanUse(RG_HOVER_BOOTS);}), }); - areaTable[RR_SHADOW_TEMPLE_FIRST_BEAMOS] = Region("Shadow Temple First Beamos", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SHADOW_TEMPLE_FIRST_BEAMOS] = Region("Shadow Temple First Beamos", SCENE_SHADOW_TEMPLE, { //Events EventAccess(&logic->FairyPot, []{return true;}), //This fairy pot is only on 3DS }, { @@ -52,7 +52,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_BEYOND_BOAT, []{return false;}), }); - areaTable[RR_SHADOW_TEMPLE_HUGE_PIT] = Region("Shadow Temple Huge Pit", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_HUGE_PIT] = Region("Shadow Temple Huge Pit", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, logic->CanJumpslashExceptHammer()), LOCATION(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, logic->CanJumpslashExceptHammer()), @@ -77,7 +77,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_WIND_TUNNEL, []{return ((ctx->GetTrickOption(RT_LENS_SHADOW_PLATFORM) && ctx->GetTrickOption(RT_LENS_SHADOW)) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->CanUse(RG_HOOKSHOT) && logic->SmallKeys(RR_SHADOW_TEMPLE, 3, 4);}), }); - areaTable[RR_SHADOW_TEMPLE_WIND_TUNNEL] = Region("Shadow Temple Wind Tunnel", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_WIND_TUNNEL] = Region("Shadow Temple Wind Tunnel", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_WIND_HINT_CHEST, true), LOCATION(RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, logic->CanKillEnemy(RE_GIBDO, ED_CLOSE, true, 2)), @@ -93,7 +93,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_BEYOND_BOAT, []{return logic->CanJumpslashExceptHammer() && logic->CanUse(RG_ZELDAS_LULLABY) && logic->SmallKeys(RR_SHADOW_TEMPLE, 4, 5);}), }); - areaTable[RR_SHADOW_TEMPLE_BEYOND_BOAT] = Region("Shadow Temple Beyond Boat", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_BEYOND_BOAT] = Region("Shadow Temple Beyond Boat", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, logic->CanUse(RG_DINS_FIRE)), LOCATION(RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, logic->CanUse(RG_DINS_FIRE)), @@ -120,13 +120,13 @@ void RegionTable_Init_ShadowTemple() { #pragma region MQ //RANDOTODO doublecheck CanAttack when rewriting, as I assumed it only checked adult due to the entrance - areaTable[RR_SHADOW_TEMPLE_MQ_BEGINNING] = Region("Shadow Temple MQ Beginning", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_BEGINNING] = Region("Shadow Temple MQ Beginning", SCENE_SHADOW_TEMPLE, {}, {}, { //Exits Entrance(RR_SHADOW_TEMPLE_ENTRYWAY, []{return true;}), Entrance(RR_SHADOW_TEMPLE_MQ_SPINNER_ROOM, []{return logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT);}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_SPINNER_ROOM] = Region("Shadow Temple MQ Spinner Room", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + areaTable[RR_SHADOW_TEMPLE_MQ_SPINNER_ROOM] = Region("Shadow Temple MQ Spinner Room", SCENE_SHADOW_TEMPLE, {}, { // Locations LOCATION(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, logic->CanBreakSmallCrates()), @@ -142,7 +142,7 @@ void RegionTable_Init_ShadowTemple() { }); //Assumes we're in the "main" area and needed lens to enter. logic will need changes if a void warp puts us somewhere weird - areaTable[RR_SHADOW_TEMPLE_MQ_DEAD_HAND_AREA] = Region("Shadow Temple MQ Dead Hand Region", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_DEAD_HAND_AREA] = Region("Shadow Temple MQ Dead Hand Region", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST, logic->CanKillEnemy(RE_REDEAD)), //There's a shared flag tied to some glass here. eye target here and killing an enemy group later in the dungeon toggles. I'm building the logic as "intended", assuming the switch needs flipping @@ -157,7 +157,7 @@ void RegionTable_Init_ShadowTemple() { }); //also includes the B2 gibdo room - areaTable[RR_SHADOW_TEMPLE_MQ_FIRST_BEAMOS] = Region("Shadow Temple MQ First Beamos", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_FIRST_BEAMOS] = Region("Shadow Temple MQ First Beamos", SCENE_SHADOW_TEMPLE, {}, { //Locations //Doing this sets the shared flag for the glass in RR_SHADOW_TEMPLE_MQ_DEAD_HAND_AREA, but doesn't seem to affect the chest LOCATION(RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, logic->CanKillEnemy(RE_GIBDO) && (ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->CanUse(RG_LENS_OF_TRUTH))), @@ -168,7 +168,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_B2_SPINNING_BLADE_ROOM, []{return ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->CanUse(RG_LENS_OF_TRUTH);}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_B2_SPINNING_BLADE_ROOM] = Region("Shadow Temple MQ B2 Spinning Blade Room", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_B2_SPINNING_BLADE_ROOM] = Region("Shadow Temple MQ B2 Spinning Blade Room", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_MAP_CHEST, logic->CanPassEnemy(RE_BIG_SKULLTULA) && (logic->CanUse(RG_HOOKSHOT) || (logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)))), }, { @@ -177,7 +177,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_SHORTCUT_PATH, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA);}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_SHORTCUT_PATH] = Region("Shadow Temple MQ Shortcut Path", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_SHORTCUT_PATH] = Region("Shadow Temple MQ Shortcut Path", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)), }, { @@ -188,14 +188,14 @@ void RegionTable_Init_ShadowTemple() { }); //Room exists for if it's ever possible to go backwards or void warp into the middle of shadow - areaTable[RR_SHADOW_TEMPLE_MQ_B2_TO_B3_CORRIDOR] = Region("Shadow Temple MQ B2 to B3 Corridor", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_B2_TO_B3_CORRIDOR] = Region("Shadow Temple MQ B2 to B3 Corridor", SCENE_SHADOW_TEMPLE, {}, {}, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_FIRST_BEAMOS, []{return logic->SmallKeys(RR_SHADOW_TEMPLE, 2);}), Entrance(RR_SHADOW_TEMPLE_MQ_UPPER_HUGE_PIT, []{return true;}), //bunnyhovers + lens lets you go from the very top of upper pit to the stationary invisible platform below quite easily }); - areaTable[RR_SHADOW_TEMPLE_MQ_UPPER_HUGE_PIT] = Region("Shadow Temple MQ Upper Huge Pit", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_UPPER_HUGE_PIT] = Region("Shadow Temple MQ Upper Huge Pit", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), }, { @@ -204,7 +204,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_ROOM, []{return ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->CanUse(RG_LENS_OF_TRUTH);}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_ROOM] = Region("Shadow Temple MQ Invisible Blades Room", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_ROOM] = Region("Shadow Temple MQ Invisible Blades Room", SCENE_SHADOW_TEMPLE, {}, { //Locations //RT_SHADOW_MQ_INVISIBLE_BLADES does not work with NL as like-likes will not swallow you, likewise like-likes will not spit you with a fairy revive //you take half a heart base from a spit out, double check EffectiveHealth when damage logic gets reworked @@ -220,7 +220,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_UPPER_HUGE_PIT, []{return true;}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_LOWER_HUGE_PIT] = Region("Shadow Temple MQ Lower Huge Pit", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_LOWER_HUGE_PIT] = Region("Shadow Temple MQ Lower Huge Pit", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, logic->CanUse(RG_LONGSHOT)), }, { @@ -229,7 +229,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_FLOOR_SPIKES_ROOM, []{return logic->CanUse(RG_HOVER_BOOTS) && (ctx->GetTrickOption(RT_LENS_SHADOW_MQ_PLATFORM) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->SmallKeys(RR_SHADOW_TEMPLE, 3);}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_STONE_UMBRELLA_ROOM] = Region("Shadow Temple MQ Stone Umbrella Room", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_STONE_UMBRELLA_ROOM] = Region("Shadow Temple MQ Stone Umbrella Room", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, true), //Assuming the known setup for RT_SHADOW_UMBRELLA and RT_SHADOW_UMBRELLA_GS, probably possible without sword + shield. @@ -246,7 +246,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_UPPER_STONE_UMBRELLA, []{return logic->IsAdult && (logic->HasItem(RG_GORONS_BRACELET) || (ctx->GetTrickOption(RT_SHADOW_UMBRELLA) && logic->CanUse(RG_HOVER_BOOTS) && logic->CanStandingShield() && logic->CanUse(RG_MASTER_SWORD)));}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_UPPER_STONE_UMBRELLA] = Region("Shadow Temple MQ Upper Stone Umbrella", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_UPPER_STONE_UMBRELLA] = Region("Shadow Temple MQ Upper Stone Umbrella", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, true), LOCATION(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, true), @@ -258,7 +258,7 @@ void RegionTable_Init_ShadowTemple() { }); //while the spikes here are annoying, they don't really stop you doing anything, so I'll assume either lens trick, lens to see them, or taking damage from them. Not hovers though as a new player won't see the threat without lens to react properly - areaTable[RR_SHADOW_TEMPLE_MQ_FLOOR_SPIKES_ROOM] = Region("Shadow Temple MQ Floor Spikes Room", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SHADOW_TEMPLE_MQ_FLOOR_SPIKES_ROOM] = Region("Shadow Temple MQ Floor Spikes Room", SCENE_SHADOW_TEMPLE, { //Events //lens or trick is always required for hookshot targets. We handle it here to not complicate the RR_SHADOW_TEMPLE_MQ_FLOOR_SPIKES_UPPER_DOOR logic EventAccess(&logic->MQShadowFloorSpikeRupees, []{return (ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)) && //Upper door side high rupee needs (hookshot and redead kill(as either age) for chest and adult) or longshot. hovers can cross from the left side with a backflip but that would be a trick @@ -277,7 +277,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_WIND_TUNNEL, []{return logic->SmallKeys(RR_SHADOW_TEMPLE, 4) && (logic->CanUse(RG_LONGSHOT) || (logic->IsAdult && logic->CanUse(RG_HOOKSHOT) && (logic->MQShadowFloorSpikeRupees || Here(RR_SHADOW_TEMPLE_MQ_FLOOR_SPIKES_ROOM, []{return logic->CanKillEnemy(RE_REDEAD);})))) && (logic->CanJumpslash() || logic->CanUse(RG_HOVER_BOOTS));}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_STALFOS_ROOM] = Region("Shadow Temple MQ Stalfos Room", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_STALFOS_ROOM] = Region("Shadow Temple MQ Stalfos Room", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2)), }, { @@ -285,14 +285,14 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_FLOOR_SPIKES_ROOM, []{return Here(RR_SHADOW_TEMPLE_MQ_STALFOS_ROOM, []{return logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2);});}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_WIND_TUNNEL] = Region("Shadow Temple MQ Wind Tunnel", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_WIND_TUNNEL] = Region("Shadow Temple MQ Wind Tunnel", SCENE_SHADOW_TEMPLE, {}, {}, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_FLOOR_SPIKES_ROOM, []{return logic->SmallKeys(RR_SHADOW_TEMPLE, 4) && logic->CanPassEnemy(RE_BIG_SKULLTULA) && (logic->CanUse(RG_HOOKSHOT));}), Entrance(RR_SHADOW_TEMPLE_MQ_WIND_HINT_ROOM, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA) && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS));}), Entrance(RR_SHADOW_TEMPLE_MQ_B4_GIBDO_ROOM, []{return logic->CanPassEnemy(RE_BIG_SKULLTULA) && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS));}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_WIND_HINT_ROOM] = Region("Shadow Temple MQ Wind Hint Room", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_WIND_HINT_ROOM] = Region("Shadow Temple MQ Wind Hint Room", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, (ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->CanPassEnemy(RE_REDEAD)), LOCATION(RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), @@ -302,7 +302,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_WIND_TUNNEL, []{return true;}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_B4_GIBDO_ROOM] = Region("Shadow Temple MQ B4 Gibdo Room", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SHADOW_TEMPLE_MQ_B4_GIBDO_ROOM] = Region("Shadow Temple MQ B4 Gibdo Room", SCENE_SHADOW_TEMPLE, { //Events EventAccess(&logic->NutPot, []{return true;}), }, { @@ -319,7 +319,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_DOCK, []{return logic->SmallKeys(RR_SHADOW_TEMPLE, 5);}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_DOCK] = Region("Shadow Temple MQ Dock", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SHADOW_TEMPLE_MQ_DOCK] = Region("Shadow Temple MQ Dock", SCENE_SHADOW_TEMPLE, { //Events EventAccess(&logic->ShadowShortcutBlock, []{return logic->HasItem(RG_GORONS_BRACELET);}), }, { @@ -334,7 +334,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_BEYOND_BOAT, []{return (logic->IsAdult || logic->CanUse(RG_HOOKSHOT)) && logic->CanUse(RG_ZELDAS_LULLABY);}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_BEYOND_BOAT] = Region("Shadow Temple MQ Beyond Boat", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_BEYOND_BOAT] = Region("Shadow Temple MQ Beyond Boat", SCENE_SHADOW_TEMPLE, {}, { //Locations //It's a trick on N64 to kill this and drop down to collect this with normal weapons, as doing so without the statue being dropped voids you to before the boat //hilariously, you can also hit this with a pot before you bring down the statue, but there's no great way to reset it without crossing. the statues collision is very inconvenient afterwards @@ -346,7 +346,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_ACROSS_CHASM, []{return Here(RR_SHADOW_TEMPLE_MQ_BEYOND_BOAT, []{return logic->CanUse(RG_FAIRY_BOW) || (ctx->GetTrickOption(RT_SHADOW_STATUE) && logic->CanUse(RG_BOMBCHU_5));});}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_ACROSS_CHASM] = Region("Shadow Temple MQ Across Chasm", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_ACROSS_CHASM] = Region("Shadow Temple MQ Across Chasm", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_WEST_POT, logic->CanBreakPots()), LOCATION(RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_EAST_POT, logic->CanBreakPots()), @@ -363,7 +363,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_BOSS_DOOR, []{return logic->CanUse(RG_HOVER_BOOTS) && (ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->CanUse(RG_LENS_OF_TRUTH));}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_BOSS_DOOR] = Region("Shadow Temple MQ Boss Door", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_BOSS_DOOR] = Region("Shadow Temple MQ Boss Door", SCENE_SHADOW_TEMPLE, {}, { //Locations //you can drop onto this and the respawn is reasonable LOCATION(RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, (logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_BOMB_THROW) || logic->CanUse(RG_MEGATON_HAMMER)) && (ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->CanUse(RG_LENS_OF_TRUTH))), @@ -374,7 +374,7 @@ void RegionTable_Init_ShadowTemple() { }); //Assumes lens is checked on entry - areaTable[RR_SHADOW_TEMPLE_MQ_INVISIBLE_MAZE] = Region("Shadow Temple MQ Invisible Maze", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_INVISIBLE_MAZE] = Region("Shadow Temple MQ Invisible Maze", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, (logic->CanUse(RG_LENS_OF_TRUTH) || ctx->GetTrickOption(RT_LENS_SHADOW_MQ_DEADHAND)) && logic->CanKillEnemy(RE_DEAD_HAND) && logic->CanDetonateUprightBombFlower()), LOCATION(RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, true), @@ -386,7 +386,7 @@ void RegionTable_Init_ShadowTemple() { Entrance(RR_SHADOW_TEMPLE_MQ_SPIKE_WALLS_ROOM, []{return logic->SmallKeys(RR_SHADOW_TEMPLE, 6);}), }); - areaTable[RR_SHADOW_TEMPLE_MQ_SPIKE_WALLS_ROOM] = Region("Shadow Temple MQ Spike Walls Room", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SHADOW_TEMPLE_MQ_SPIKE_WALLS_ROOM] = Region("Shadow Temple MQ Spike Walls Room", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, logic->CanUse(RG_DINS_FIRE)), LOCATION(RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, logic->CanUse(RG_DINS_FIRE)), @@ -399,14 +399,14 @@ void RegionTable_Init_ShadowTemple() { #pragma endregion // Boss Room - areaTable[RR_SHADOW_TEMPLE_BOSS_ENTRYWAY] = Region("Shadow Temple Boss Entryway", "Shadow Temple", {RA_SHADOW_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SHADOW_TEMPLE_BOSS_ENTRYWAY] = Region("Shadow Temple Boss Entryway", SCENE_SHADOW_TEMPLE, {}, {}, { // Exits Entrance(RR_SHADOW_TEMPLE_BEYOND_BOAT, []{return ctx->GetDungeon(SHADOW_TEMPLE)->IsVanilla() && false;}), Entrance(RR_SHADOW_TEMPLE_MQ_BEYOND_BOAT, []{return ctx->GetDungeon(SHADOW_TEMPLE)->IsMQ() && false;}), Entrance(RR_SHADOW_TEMPLE_BOSS_ROOM, []{return logic->HasItem(RG_SHADOW_TEMPLE_BOSS_KEY);}), }); - areaTable[RR_SHADOW_TEMPLE_BOSS_ROOM] = Region("Shadow Temple Boss Room", "Shadow Temple", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SHADOW_TEMPLE_BOSS_ROOM] = Region("Shadow Temple Boss Room", SCENE_SHADOW_TEMPLE_BOSS, { // Events EventAccess(&logic->ShadowTempleClear, []{return logic->CanKillEnemy(RE_BONGO_BONGO);}), }, { diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp index c78a6bb49..98c783e20 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp @@ -7,7 +7,7 @@ using namespace Rando; void RegionTable_Init_SpiritTemple() { // clang-format off // Vanilla/MQ Decider - areaTable[RR_SPIRIT_TEMPLE_ENTRYWAY] = Region("Spirit Temple Entryway", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SPIRIT_TEMPLE_ENTRYWAY] = Region("Spirit Temple Entryway", SCENE_SPIRIT_TEMPLE, {}, {}, { //Exits Entrance(RR_SPIRIT_TEMPLE_LOBBY, []{return ctx->GetDungeon(SPIRIT_TEMPLE)->IsVanilla();}), Entrance(RR_SPIRIT_TEMPLE_MQ_LOBBY, []{return ctx->GetDungeon(SPIRIT_TEMPLE)->IsMQ();}), @@ -16,7 +16,7 @@ void RegionTable_Init_SpiritTemple() { #pragma region Vanilla - areaTable[RR_SPIRIT_TEMPLE_LOBBY] = Region("Spirit Temple Lobby", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_LOBBY] = Region("Spirit Temple Lobby", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_LOBBY_POT_1, logic->CanBreakPots()), LOCATION(RC_SPIRIT_TEMPLE_LOBBY_POT_2, logic->CanBreakPots()), @@ -27,7 +27,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_EARLY_ADULT, []{return logic->CanUse(RG_SILVER_GAUNTLETS);}), }); - areaTable[RR_SPIRIT_TEMPLE_CHILD] = Region("Child Spirit Temple", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SPIRIT_TEMPLE_CHILD] = Region("Child Spirit Temple", SCENE_SPIRIT_TEMPLE, { //Events EventAccess(&logic->NutCrate, []{return true;}), }, { @@ -46,7 +46,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_CHILD_CLIMB, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 1);}), }); - areaTable[RR_SPIRIT_TEMPLE_CHILD_CLIMB] = Region("Child Spirit Temple Climb", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_CHILD_CLIMB] = Region("Child Spirit Temple Climb", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, logic->HasProjectile(HasProjectileAge::Both) || ((logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHU_BAG) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) && logic->CanUse(RG_SILVER_GAUNTLETS) && logic->HasProjectile(HasProjectileAge::Adult)) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->IsChild && logic->HasProjectile(HasProjectileAge::Child))), LOCATION(RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, logic->HasProjectile(HasProjectileAge::Both) || ((logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHU_BAG) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) && logic->CanUse(RG_SILVER_GAUNTLETS) && logic->HasProjectile(HasProjectileAge::Adult)) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->IsChild && logic->HasProjectile(HasProjectileAge::Child))), @@ -60,7 +60,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER, []{return logic->HasExplosives() || (ctx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS));}), }); - areaTable[RR_SPIRIT_TEMPLE_EARLY_ADULT] = Region("Early Adult Spirit Temple", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_EARLY_ADULT] = Region("Early Adult Spirit Temple", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_COMPASS_CHEST, logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_ZELDAS_LULLABY)), LOCATION(RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_BOMBCHU_5) || (logic->CanUse(RG_BOMB_BAG) && logic->IsAdult && ctx->GetTrickOption(RT_SPIRIT_LOWER_ADULT_SWITCH))) && (logic->CanUse(RG_HOVER_BOOTS) || logic->CanJumpslashExceptHammer())), @@ -73,7 +73,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 1);}), }); - areaTable[RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER] = Region("Spirit Temple Central Chamber", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER] = Region("Spirit Temple Central Chamber", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MAP_CHEST, ((logic->HasExplosives() || logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && ctx->GetOption(RSK_BOMBCHU_BAG) && logic->BombchuRefill() && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).Is(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF))) && (logic->CanUse(RG_DINS_FIRE) || ((logic->CanUse(RG_FIRE_ARROWS) || ctx->GetTrickOption(RT_SPIRIT_MAP_CHEST)) && logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_STICKS) ))) || @@ -110,7 +110,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_INSIDE_STATUE_HEAD, []{return ctx->GetTrickOption(RT_SPIRIT_PLATFORM_HOOKSHOT) && logic->CanUse(RG_HOOKSHOT);}), }); - areaTable[RR_SPIRIT_TEMPLE_OUTDOOR_HANDS] = Region("Spirit Temple Outdoor Hands", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_OUTDOOR_HANDS] = Region("Spirit Temple Outdoor Hands", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, (logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) && logic->CanUse(RG_LONGSHOT) && logic->HasExplosives()) || logic->SmallKeys(RR_SPIRIT_TEMPLE, 5)), LOCATION(RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, logic->SmallKeys(RR_SPIRIT_TEMPLE, 4) && logic->CanUse(RG_SILVER_GAUNTLETS) && logic->HasExplosives()), @@ -119,7 +119,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_DESERT_COLOSSUS, []{return (logic->IsChild && logic->SmallKeys(RR_SPIRIT_TEMPLE, 5)) || (logic->CanUse(RG_SILVER_GAUNTLETS) && ((logic->SmallKeys(RR_SPIRIT_TEMPLE, 3) && logic->HasExplosives()) || logic->SmallKeys(RR_SPIRIT_TEMPLE, 5)));}), }); - areaTable[RR_SPIRIT_TEMPLE_BEYOND_CENTRAL_LOCKED_DOOR] = Region("Spirit Temple Beyond Central Locked Door", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_BEYOND_CENTRAL_LOCKED_DOOR] = Region("Spirit Temple Beyond Central Locked Door", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, (logic->CanUse(RG_MIRROR_SHIELD) || (ctx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS))) && logic->HasExplosives()), LOCATION(RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, (ctx->GetTrickOption(RT_LENS_SPIRIT) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->HasExplosives()), @@ -131,7 +131,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_BEYOND_FINAL_LOCKED_DOOR, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && (ctx->GetTrickOption(RT_SPIRIT_WALL) || logic->CanUse(RG_LONGSHOT) || logic->CanUse(RG_BOMBCHU_5) || ((logic->CanUse(RG_BOMB_BAG) || logic->CanUse(RG_NUTS) || logic->CanUse(RG_DINS_FIRE)) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_MEGATON_HAMMER))));}), }); - areaTable[RR_SPIRIT_TEMPLE_BEYOND_FINAL_LOCKED_DOOR] = Region("Spirit Temple Beyond Final Locked Door", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_BEYOND_FINAL_LOCKED_DOOR] = Region("Spirit Temple Beyond Final Locked Door", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, logic->CanUse(RG_ZELDAS_LULLABY) && ((logic->TakeDamage() && ctx->GetTrickOption(RT_FLAMING_CHESTS)) || (logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_HOOKSHOT)))), LOCATION(RC_SPIRIT_TEMPLE_TOPMOST_CHEST, (logic->CanUse(RG_MIRROR_SHIELD) && logic->CanAttack()) || (ctx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS))), @@ -142,7 +142,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_INSIDE_STATUE_HEAD, []{return logic->CanUse(RG_MIRROR_SHIELD) && logic->HasExplosives() && logic->CanUse(RG_HOOKSHOT);}), }); - areaTable[RR_SPIRIT_TEMPLE_INSIDE_STATUE_HEAD] = Region("Spirit Temple Inside Statue Head", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SPIRIT_TEMPLE_INSIDE_STATUE_HEAD] = Region("Spirit Temple Inside Statue Head", SCENE_SPIRIT_TEMPLE, {}, {}, { // Exits Entrance(RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER, []{return true;}), Entrance(RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, []{return true;}), @@ -152,7 +152,7 @@ void RegionTable_Init_SpiritTemple() { #pragma region MQ - areaTable[RR_SPIRIT_TEMPLE_MQ_LOBBY] = Region("Spirit Temple MQ Lobby", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_LOBBY] = Region("Spirit Temple MQ Lobby", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, true), LOCATION(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, Here(RR_SPIRIT_TEMPLE_MQ_LOBBY, []{return logic->BlastOrSmash();}) && logic->CanHitEyeTargets()), @@ -169,7 +169,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_BIG_BLOCK_ROOM_SOUTH, []{return logic->CanUse(RG_LONGSHOT) && logic->CanUse(RG_BOMBCHU_5);}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_1F_WEST] = Region("Spirit Temple MQ 1F West", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SPIRIT_TEMPLE_MQ_1F_WEST] = Region("Spirit Temple MQ 1F West", SCENE_SPIRIT_TEMPLE, { //Events //not technically a rusted switch, but a boulder through a wall, but is part of the same trick on N64 EventAccess(&logic->MQSpiritCrawlBoulder, []{return logic->CanUse(RG_BOMBCHU_5) || (ctx->GetTrickOption(RT_RUSTED_SWITCHES) && logic->CanUse(RG_MEGATON_HAMMER));}), @@ -186,7 +186,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_WEST_1F_RUSTED_SWITCH, []{return logic->IsChild && logic->MQSpiritCrawlBoulder;}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_1F_GIBDO_ROOM_SOUTH] = Region("Spirit Temple MQ 1F Gibdo Room South", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_1F_GIBDO_ROOM_SOUTH] = Region("Spirit Temple MQ 1F Gibdo Room South", SCENE_SPIRIT_TEMPLE, {}, {}, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_1F_WEST, []{return true;}), Entrance(RR_SPIRIT_TEMPLE_MQ_1F_GIBDO_ROOM_NORTH, []{return logic->CanUse(RG_BOMBCHU_5) && logic->CanHitEyeTargets();}), @@ -194,13 +194,13 @@ void RegionTable_Init_SpiritTemple() { }); // Room to store the 2 pots in to handle glitch logic going backwards around the loop later - areaTable[RR_SPIRIT_TEMPLE_MQ_1F_GIBDO_ROOM_NORTH] = Region("Spirit Temple MQ 1F Gibdo Room North", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_1F_GIBDO_ROOM_NORTH] = Region("Spirit Temple MQ Gibdo Room North", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1, logic->CanBreakPots()), LOCATION(RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2, logic->CanBreakPots()), }, {}); - areaTable[RR_SPIRIT_TEMPLE_MQ_TURNTABLE_ROOM] = Region("Spirit Temple MQ Turntable Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SPIRIT_TEMPLE_MQ_TURNTABLE_ROOM] = Region("Spirit Temple Turntable Room", SCENE_SPIRIT_TEMPLE, { //Events //For non-fairy pot items, you can also get them with rang without killing the stalfos EventAccess(&logic->FairyPot, []{return Here(RR_SPIRIT_TEMPLE_MQ_TURNTABLE_ROOM, []{return logic->CanKillEnemy(RE_STALFOS);});}), @@ -217,7 +217,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_MAP_ROOM_NORTH, []{return Here(RR_SPIRIT_TEMPLE_MQ_TURNTABLE_ROOM, []{return logic->CanKillEnemy(RE_STALFOS);});}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_MAP_ROOM_NORTH] = Region("Spirit Temple MQ Map Room North", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SPIRIT_TEMPLE_MQ_MAP_ROOM_NORTH] = Region("Spirit Temple MQ Map Room North", SCENE_SPIRIT_TEMPLE, { //Events EventAccess(&logic->MQSpiritMapRoomEnemies, []{return logic->CanKillEnemy(RE_ANUBIS) && logic->CanKillEnemy(RE_KEESE);}), }, { @@ -229,7 +229,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_MAP_ROOM_SOUTH, []{return true;}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_MAP_ROOM_SOUTH] = Region("Spirit Temple MQ Map Room South", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SPIRIT_TEMPLE_MQ_MAP_ROOM_SOUTH] = Region("Spirit Temple MQ Map Room South", SCENE_SPIRIT_TEMPLE, { //Events //You can lure the keese over by aggroing them with dins if you use it as close to the torch keese as possible, but it's a trick as it's not intuitive and basically never comes up EventAccess(&logic->MQSpiritMapRoomEnemies, []{return logic->CanKillEnemy(RE_ANUBIS) && logic->CanKillEnemy(RE_KEESE, ED_BOOMERANG);}), @@ -243,7 +243,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_1F_WEST, []{return true;}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_WEST_1F_RUSTED_SWITCH] = Region("Spirit Temple MQ West 1F Rusted Switch", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SPIRIT_TEMPLE_MQ_WEST_1F_RUSTED_SWITCH] = Region("Spirit Temple MQ West 1F Rusted Switch", SCENE_SPIRIT_TEMPLE, { //Events EventAccess(&logic->MQSpiritTimeTravelChest, []{return logic->CanUse(RG_MEGATON_HAMMER);}), EventAccess(&logic->MQSpiritCrawlBoulder, []{return logic->CanUse(RG_BOMBCHU_5) || (ctx->GetTrickOption(RT_RUSTED_SWITCHES) && logic->CanUse(RG_MEGATON_HAMMER));}), @@ -254,7 +254,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_UNDER_LIKE_LIKE, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 1);}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_UNDER_LIKE_LIKE] = Region("Spirit Temple MQ Under Like Like", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_UNDER_LIKE_LIKE] = Region("Spirit Temple MQ Under Like Like", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT, MQSpiritSharedBrokenWallRoom(RR_SPIRIT_TEMPLE_MQ_UNDER_LIKE_LIKE, []{return logic->CanBreakPots();})), }, { @@ -264,7 +264,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_BROKEN_WALL_ROOM, []{return logic->CanHitSwitch();}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_BROKEN_WALL_ROOM] = Region("Spirit Temple MQ Broken Wall Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_BROKEN_WALL_ROOM] = Region("Spirit Temple MQ Broken Wall Room", SCENE_SPIRIT_TEMPLE, {}, { //Locations //Implies CanKillEnemy(RE_LIKE_LIKE) LOCATION(RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, MQSpiritSharedBrokenWallRoom(RR_SPIRIT_TEMPLE_MQ_BROKEN_WALL_ROOM, []{return logic->CanKillEnemy(RE_BEAMOS);})), @@ -278,7 +278,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 2);}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM] = Region("Spirit Temple MQ Statue Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM] = Region("Spirit Temple MQ Statue Room", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return logic->CanHitEyeTargets();})), LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_3F_EAST_POT, MQSpiritSharedStatueRoom(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return ((logic->IsAdult || logic->CanJumpslash()) && logic->CanUse(RG_BOOMERANG)) || ((logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_SONG_OF_TIME) || (logic->IsAdult && ctx->GetTrickOption(RT_SPIRIT_LOBBY_JUMP))) && logic->CanBreakPots());})), @@ -301,7 +301,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM_EAST, []{return logic->IsAdult && logic->CanUse(RG_HOOKSHOT);}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM] = Region("Spirit Temple MQ Sun Block Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM] = Region("Spirit Temple MQ Sun Block Room", SCENE_SPIRIT_TEMPLE, {}, { //Locations //We don't need Shared here because If we are checking as child, universe 2 adult access needs nothing so it always passes, and if we are checking as adult, it is Certain Access LOCATION(RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, true), @@ -315,13 +315,13 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_WEST_IRON_KNUCKLE, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 7);}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_WEST_IRON_KNUCKLE] = Region("Spirit Temple MQ West Iron Knuckle", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_WEST_IRON_KNUCKLE] = Region("Spirit Temple MQ East Iron Knuckle", SCENE_SPIRIT_TEMPLE, {}, {}, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 7);}), Entrance(RR_SPIRIT_TEMPLE_MQ_SILVER_GAUNTLETS_HAND, []{return logic->CanKillEnemy(RE_IRON_KNUCKLE);}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_SILVER_GAUNTLETS_HAND] = Region("Spirit Temple MQ Silver Gauntlets Hand", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_SILVER_GAUNTLETS_HAND] = Region("Spirit Temple MQ Silver Gauntlets Hand", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, true), }, { @@ -331,7 +331,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_DESERT_COLOSSUS, []{return true;}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_BIG_BLOCK_ROOM_SOUTH] = Region("Spirit Temple MQ Block Room South", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_BIG_BLOCK_ROOM_SOUTH] = Region("Spirit Temple MQ Block Room South", SCENE_SPIRIT_TEMPLE, {}, {}, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_LOBBY, []{return true;}), //The block here is unusual in that it is a permanent flag, but reset anyway as child. This is because there's a check that would be blocked off by pushing them otherwise @@ -339,7 +339,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_BIG_BLOCK_ROOM_NORTH, []{return logic->IsChild ? logic->CanUse(RG_SILVER_GAUNTLETS) : Here(RR_SPIRIT_TEMPLE_MQ_LOBBY, []{return logic->CanUse(RG_SILVER_GAUNTLETS);});}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_BIG_BLOCK_ROOM_NORTH] = Region("Spirit Temple MQ Block Room North", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_BIG_BLOCK_ROOM_NORTH] = Region("Spirit Temple MQ Block Room North", SCENE_SPIRIT_TEMPLE, {}, { //Locations //Does not need to be shared as it's hard child locked, because adult pushing the block is a permanent flag that blocks the eye target and cannot be undone LOCATION(RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, logic->IsChild && logic->SmallKeys(RR_SPIRIT_TEMPLE, 7) && logic->CanHitEyeTargets()), @@ -349,7 +349,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return true;}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM_EAST] = Region("Spirit Temple MQ Statue Room East", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM_EAST] = Region("Spirit Temple MQ Statue Room East", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, logic->CanUse(RG_HOOKSHOT) & logic->CanUse(RG_ZELDAS_LULLABY) && (logic->CanJumpslash() || logic->CanUse(RG_HOVER_BOOTS))), LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, (ctx->GetTrickOption(RT_LENS_SPIRIT_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)) && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS))), @@ -370,7 +370,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_THREE_SUNS_ROOM_2F, []{return logic->CanUse(RG_FIRE_ARROWS) || (ctx->GetTrickOption(RT_SPIRIT_MQ_LOWER_ADULT) && logic->CanUse(RG_DINS_FIRE));}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_THREE_SUNS_ROOM_2F] = Region("Spirit Temple MQ Three Suns Room 2F", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SPIRIT_TEMPLE_MQ_THREE_SUNS_ROOM_2F] = Region("Spirit Temple MQ Three Suns Room 2F", SCENE_SPIRIT_TEMPLE, { //Events //implies logic->CanKillEnemy(RE_WALLMASTER). If we have lights, we can kill stalfos and wallmasters with bow EventAccess(&logic->MQSpirit3SunsEnemies, []{return (logic->CanUse(RG_MIRROR_SHIELD) && logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2)) || (ctx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS));}), @@ -380,13 +380,13 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_THREE_SUNS_ROOM_1F, []{return logic->MQSpirit3SunsEnemies;}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_THREE_SUNS_ROOM_1F] = Region("Spirit Temple MQ Three Suns Room 1F", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_THREE_SUNS_ROOM_1F] = Region("Spirit Temple MQ Three Suns Room 1F", SCENE_SPIRIT_TEMPLE, {}, {}, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_THREE_SUNS_ROOM_2F, []{return logic->MQSpirit3SunsEnemies;}), Entrance(RR_SPIRIT_TEMPLE_MQ_1F_EAST, []{return true;}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_1F_EAST] = Region("Spirit Temple MQ 1F East", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SPIRIT_TEMPLE_MQ_1F_EAST] = Region("Spirit Temple MQ 1F East", SCENE_SPIRIT_TEMPLE, { //Events //Assumes RR_SPIRIT_TEMPLE_MQ_LOBBY access EventAccess(&logic->Spirit1FSilverRupees, []{return logic->CanUse(RG_MEGATON_HAMMER);}), @@ -402,7 +402,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 7);}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_LEEVER_ROOM] = Region("Spirit Temple MQ Leever Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_LEEVER_ROOM] = Region("Spirit Temple MQ Leever Room", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, logic->CanKillEnemy(RE_PURPLE_LEEVER) && logic->CanUse(RG_HOOKSHOT)), LOCATION(RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), @@ -411,14 +411,14 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_1F_EAST, []{return logic->CanUse(RG_ZELDAS_LULLABY);}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM] = Region("Spirit Temple MQ Symphony Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM] = Region("Spirit Temple MQ Symphony Room", SCENE_SPIRIT_TEMPLE, {}, {}, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_1F_EAST, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 7);}), //Implies CanPassEnemy(RE_MOBLIN_CHIEF) Entrance(RR_SPIRIT_TEMPLE_MQ_AFTER_SYMPHONY_ROOM, []{return logic->CanUse(RG_MEGATON_HAMMER) && logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_EPONAS_SONG) && logic->CanUse(RG_SUNS_SONG) && logic->CanUse(RG_SONG_OF_STORMS) && logic->CanUse(RG_ZELDAS_LULLABY);}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_AFTER_SYMPHONY_ROOM] = Region("Spirit Temple MQ After Symphony Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_AFTER_SYMPHONY_ROOM] = Region("Spirit Temple MQ After Symphony Room", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, logic->CanPassEnemy(RE_BIG_SKULLTULA)), LOCATION(RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), @@ -427,7 +427,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM, []{return true;}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_FOUR_BEAMOS_ROOM] = Region("Spirit Temple MQ Four Beamos Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_FOUR_BEAMOS_ROOM] = Region("Spirit Temple MQ Four Beamos Room", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, logic->CanKillEnemy(RE_BEAMOS)), LOCATION(RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, logic->CanKillEnemy(RE_BEAMOS) && logic->CanUse(RG_SONG_OF_TIME) && logic->CanBreakSmallCrates()), @@ -438,7 +438,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_BIG_WALL, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 6);}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_SOT_SUN_ROOM] = Region("Spirit Temple MQ SoT Sun Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_SOT_SUN_ROOM] = Region("Spirit Temple MQ SoT Sun Room", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, true), LOCATION(RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), @@ -449,19 +449,19 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_3F_GIBDO_ROOM, []{return Here(RR_SPIRIT_TEMPLE_MQ_SOT_SUN_ROOM, []{return (logic->IsAdult || logic->CanUse(RG_SONG_OF_TIME)) && logic->CanUse(RG_MIRROR_SHIELD);});}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_EAST_STAIRS_TO_HAND] = Region("Spirit Temple MQ East Stairs to Hand", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_EAST_STAIRS_TO_HAND] = Region("Spirit Temple MQ East Stairs to Hand", SCENE_SPIRIT_TEMPLE, {}, {}, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_SOT_SUN_ROOM, []{return true;}), Entrance(RR_SPIRIT_TEMPLE_MQ_EAST_IRON_KNUCKLE, []{return (ctx->GetTrickOption(RT_LENS_SPIRIT_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)) && Here(RR_SPIRIT_TEMPLE_MQ_EAST_STAIRS_TO_HAND, []{return logic->CanKillEnemy(RE_FLOORMASTER);});}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_EAST_IRON_KNUCKLE] = Region("Spirit Temple MQ East Iron Knuckle", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_EAST_IRON_KNUCKLE] = Region("Spirit Temple MQ East Iron Knuckle", SCENE_SPIRIT_TEMPLE, {}, {}, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_EAST_STAIRS_TO_HAND, []{return true;}), Entrance(RR_SPIRIT_TEMPLE_MQ_MIRROR_SHIELD_HAND, []{return Here(RR_SPIRIT_TEMPLE_MQ_EAST_STAIRS_TO_HAND, []{return logic->CanKillEnemy(RE_IRON_KNUCKLE);});}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_MIRROR_SHIELD_HAND] = Region("Spirit Temple MQ Mirror Shield Hand", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_MIRROR_SHIELD_HAND] = Region("Spirit Temple MQ Mirror Shield Hand", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, true), }, { @@ -471,7 +471,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_DESERT_COLOSSUS, []{return true;}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_3F_GIBDO_ROOM] = Region("Spirit Temple MQ 3F Gibdo Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_3F_GIBDO_ROOM] = Region("Spirit Temple MQ 3F Gibdo Room", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, true), }, { @@ -479,7 +479,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_SOT_SUN_ROOM, []{return true;}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_BIG_WALL] = Region("Spirit Temple MQ Big Wall", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_BIG_WALL] = Region("Spirit Temple MQ Big Wall", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1, logic->CanBreakPots()), LOCATION(RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2, logic->CanBreakPots()), @@ -491,7 +491,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_4F_CENTRAL, []{return logic->CanKillEnemy(RE_KEESE);}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_4F_CENTRAL] = Region("Spirit Temple MQ 4F Central", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_4F_CENTRAL] = Region("Spirit Temple MQ 4F Central", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1, logic->CanBreakPots()), LOCATION(RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2, logic->CanBreakPots()), @@ -502,7 +502,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_BIG_MIRROR_ROOM, []{return logic->CanUse(RG_ZELDAS_LULLABY);}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_NINE_CHAIRS_ROOM] = Region("Spirit Temple MQ Nine Chairs Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_NINE_CHAIRS_ROOM] = Region("Spirit Temple MQ Nine Chairs Room", SCENE_SPIRIT_TEMPLE, {}, { //Locations //These skulls rely on the iron knuckle existing without a trick to shoot through the chairs LOCATION(RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), @@ -512,7 +512,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_4F_CENTRAL, []{return true;}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_BIG_MIRROR_ROOM] = Region("Spirit Temple MQ Big Mirror Room", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_BIG_MIRROR_ROOM] = Region("Spirit Temple MQ Big Mirror Room", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, logic->CanBreakPots()), LOCATION(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, logic->CanBreakPots()), @@ -528,7 +528,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CAVE, []{return Here(RR_SPIRIT_TEMPLE_MQ_BIG_MIRROR_ROOM, []{return logic->CanUse(RG_MEGATON_HAMMER);});}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CAVE] = Region("Spirit Temple MQ Big Mirror Cave", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CAVE] = Region("Spirit Temple MQ Big Mirror Cave", SCENE_SPIRIT_TEMPLE, {}, { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, ctx->GetTrickOption(RT_LENS_SPIRIT_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)), }, { @@ -538,7 +538,7 @@ void RegionTable_Init_SpiritTemple() { Entrance(RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM, []{return Here(RR_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CAVE, []{return logic->CanUse(RG_MIRROR_SHIELD);});}), }); - areaTable[RR_SPIRIT_TEMPLE_MQ_INSIDE_STATUE_HEAD] = Region("Spirit Temple MQ Inside Statue Head", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SPIRIT_TEMPLE_MQ_INSIDE_STATUE_HEAD] = Region("Spirit Temple MQ Inside Statue Head", SCENE_SPIRIT_TEMPLE, {}, {}, { // Exits Entrance(RR_SPIRIT_TEMPLE_MQ_LOBBY, []{return true;}), Entrance(RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY, []{return true;}), @@ -547,14 +547,14 @@ void RegionTable_Init_SpiritTemple() { #pragma endregion // Boss Room - areaTable[RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY] = Region("Spirit Temple Boss Entryway", "Spirit Temple", {RA_SPIRIT_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY] = Region("Spirit Temple Boss Entryway", SCENE_SPIRIT_TEMPLE, {}, {}, { // Exits Entrance(RR_SPIRIT_TEMPLE_INSIDE_STATUE_HEAD, []{return ctx->GetDungeon(SPIRIT_TEMPLE)->IsVanilla() && false;}), Entrance(RR_SPIRIT_TEMPLE_MQ_INSIDE_STATUE_HEAD, []{return ctx->GetDungeon(SPIRIT_TEMPLE)->IsMQ() && false;}), Entrance(RR_SPIRIT_TEMPLE_BOSS_ROOM, []{return logic->HasItem(RG_SPIRIT_TEMPLE_BOSS_KEY);}), }); - areaTable[RR_SPIRIT_TEMPLE_BOSS_ROOM] = Region("Spirit Temple Boss Room", "Spirit Temple", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SPIRIT_TEMPLE_BOSS_ROOM] = Region("Spirit Temple Boss Room", SCENE_SPIRIT_TEMPLE_BOSS, { // Events EventAccess(&logic->SpiritTempleClear, []{return logic->CanKillEnemy(RE_TWINROVA);}), }, { diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp index d490b1650..e8fb4e6b6 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp @@ -7,7 +7,7 @@ using namespace Rando; void RegionTable_Init_WaterTemple() { // clang-format off // Vanilla/MQ Decider - areaTable[RR_WATER_TEMPLE_ENTRYWAY] = Region("Water Temple Entryway", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_ENTRYWAY] = Region("Water Temple Entryway", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_LOBBY, []{return logic->HasItem(RG_BRONZE_SCALE) && ctx->GetDungeon(WATER_TEMPLE)->IsVanilla();}), Entrance(RR_WATER_TEMPLE_MQ_3F_CENTRAL, []{return logic->HasItem(RG_BRONZE_SCALE) && ctx->GetDungeon(WATER_TEMPLE)->IsMQ();}), @@ -17,7 +17,7 @@ void RegionTable_Init_WaterTemple() { #pragma region Vanilla //Water Temple logic currently assumes that the locked door leading to the upper water raising location is unlocked from the start - areaTable[RR_WATER_TEMPLE_LOBBY] = Region("Water Temple Lobby", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_LOBBY] = Region("Water Temple Lobby", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_1, logic->CanBreakPots() && (logic->CanWaterTempleLowFromHigh || logic->CanWaterTempleMiddle || (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT)))), LOCATION(RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_2, logic->CanBreakPots() && (logic->CanWaterTempleLowFromHigh || logic->CanWaterTempleMiddle || (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT)))), @@ -38,7 +38,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_PRE_BOSS_ROOM, []{return (logic->CanWaterTempleHigh && logic->CanUse(RG_LONGSHOT)) || (ctx->GetTrickOption(RT_HOVER_BOOST_SIMPLE) && ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives() && logic->CanUse(RG_HOVER_BOOTS));}), }); - areaTable[RR_WATER_TEMPLE_EAST_LOWER] = Region("Water Temple East Lower", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_EAST_LOWER] = Region("Water Temple East Lower", SCENE_WATER_TEMPLE, { //Events EventAccess(&logic->CanWaterTempleLowFromHigh, []{return logic->CanUse(RG_ZELDAS_LULLABY);}), }, { @@ -53,7 +53,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_TORCH_ROOM, []{return logic->CanWaterTempleLowFromHigh && (logic->HasFireSourceWithTorch() || logic->CanUse(RG_FAIRY_BOW));}), }); - areaTable[RR_WATER_TEMPLE_MAP_ROOM] = Region("Water Temple Map Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MAP_ROOM] = Region("Water Temple Map Room", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MAP_CHEST, logic->CanKillEnemy(RE_SPIKE, ED_CLOSE, true, 3)), }, { @@ -61,7 +61,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_EAST_LOWER, []{return logic->CanKillEnemy(RE_SPIKE, ED_CLOSE, true, 3);}), }); - areaTable[RR_WATER_TEMPLE_CRACKED_WALL] = Region("Water Temple Cracked Wall", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_CRACKED_WALL] = Region("Water Temple Cracked Wall", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_CRACKED_WALL_CHEST, logic->HasExplosives()), }, { @@ -69,7 +69,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_EAST_LOWER, []{return true;}), }); - areaTable[RR_WATER_TEMPLE_TORCH_ROOM] = Region("Water Temple Torch Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_TORCH_ROOM] = Region("Water Temple Torch Room", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_TORCHES_CHEST, logic->CanKillEnemy(RE_SHELL_BLADE, ED_CLOSE, true, 3)), }, { @@ -77,13 +77,13 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_EAST_LOWER, []{return logic->CanKillEnemy(RE_SHELL_BLADE, ED_CLOSE, true, 3);}), }); - areaTable[RR_WATER_TEMPLE_NORTH_LOWER] = Region("Water Temple North Lower", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_NORTH_LOWER] = Region("Water Temple North Lower", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_LOBBY, []{return true;}), Entrance(RR_WATER_TEMPLE_BOULDERS_LOWER, []{return (logic->CanUse(RG_LONGSHOT) || (ctx->GetTrickOption(RT_WATER_BK_REGION) && logic->CanUse(RG_HOVER_BOOTS))) && logic->SmallKeys(RR_WATER_TEMPLE, 4);}), }); - areaTable[RR_WATER_TEMPLE_BOULDERS_LOWER] = Region("Water Temple Boulders Lower", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_BOULDERS_LOWER] = Region("Water Temple Boulders Lower", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, logic->CanUse(RG_LONGSHOT) || Here(RR_WATER_TEMPLE_BOULDERS_UPPER, []{return (logic->IsAdult && logic->HookshotOrBoomerang()) || (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT));})), }, { @@ -93,7 +93,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_BOULDERS_UPPER, []{return (logic->IsAdult && (logic->CanUse(RG_HOVER_BOOTS) || ctx->GetTrickOption(RT_WATER_NORTH_BASEMENT_LEDGE_JUMP))) || (logic->CanUse(RG_HOVER_BOOTS) && logic->CanUse(RG_IRON_BOOTS));}), }); - areaTable[RR_WATER_TEMPLE_BLOCK_ROOM] = Region("Water Temple Block Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_BLOCK_ROOM] = Region("Water Temple Block Room", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1, logic->CanBreakPots()), LOCATION(RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2, logic->CanBreakPots()), @@ -103,20 +103,20 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_JETS_ROOM, []{return (logic->HasItem(RG_GORONS_BRACELET) && logic->HasExplosives()) || (logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_HOVER_BOOTS));}), }); - areaTable[RR_WATER_TEMPLE_JETS_ROOM] = Region("Water Temple Jets Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_JETS_ROOM] = Region("Water Temple Jets Room", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_BLOCK_ROOM, []{return logic->CanUse(RG_HOOKSHOT);}), Entrance(RR_WATER_TEMPLE_BOULDERS_UPPER, []{return true;}), }); - areaTable[RR_WATER_TEMPLE_BOULDERS_UPPER] = Region("Water Temple Boulders Upper", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_BOULDERS_UPPER] = Region("Water Temple Boulders Upper", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_BOULDERS_LOWER, []{return true;}), Entrance(RR_WATER_TEMPLE_JETS_ROOM, []{return logic->IsAdult;}), Entrance(RR_WATER_TEMPLE_BOSS_KEY_ROOM, []{return (logic->CanUse(RG_IRON_BOOTS) || (logic->IsAdult && ctx->GetTrickOption(RT_WATER_BK_JUMP_DIVE))) && logic->SmallKeys(RR_WATER_TEMPLE, 5);}), }); - areaTable[RR_WATER_TEMPLE_BOSS_KEY_ROOM] = Region("Water Temple Boss Key Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_BOSS_KEY_ROOM] = Region("Water Temple Boss Key Room", SCENE_WATER_TEMPLE, { //Events EventAccess(&logic->FairyPot, []{return true;}), }, { @@ -129,7 +129,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_BOULDERS_UPPER, []{return (logic->CanUse(RG_IRON_BOOTS) || (logic->IsAdult && ctx->GetTrickOption(RT_WATER_BK_JUMP_DIVE)) || logic->IsChild || logic->HasItem(RG_SILVER_SCALE)) && logic->SmallKeys(RR_WATER_TEMPLE, 5);}), }); - areaTable[RR_WATER_TEMPLE_SOUTH_LOWER] = Region("Water Temple South Lower", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_SOUTH_LOWER] = Region("Water Temple South Lower", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_GS_BEHIND_GATE, logic->CanJumpslash() && (logic->CanUse(RG_HOOKSHOT) || (logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)))), LOCATION(RC_WATER_TEMPLE_BEHIND_GATE_POT_1, logic->CanJumpslash() && (logic->CanUse(RG_HOOKSHOT) || (logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)))), @@ -141,13 +141,13 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_LOBBY, []{return logic->CanUse(RG_IRON_BOOTS);}), }); - areaTable[RR_WATER_TEMPLE_WEST_LOWER] = Region("Water Temple West Lower", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_WEST_LOWER] = Region("Water Temple West Lower", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_LOBBY, []{return logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_IRON_BOOTS) && logic->HasItem(RG_GORONS_BRACELET);}), Entrance(RR_WATER_TEMPLE_DRAGON_ROOM, []{return logic->CanJumpslashExceptHammer() || logic->CanUseProjectile();}), }); - areaTable[RR_WATER_TEMPLE_DRAGON_ROOM] = Region("Water Temple Dragon Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_DRAGON_ROOM] = Region("Water Temple Dragon Room", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_DRAGON_CHEST, (logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_IRON_BOOTS)) || (((logic->IsAdult && ctx->GetTrickOption(RT_WATER_ADULT_DRAGON) && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_BOMBCHU_5))) || (logic->IsChild && ctx->GetTrickOption(RT_WATER_CHILD_DRAGON) && (logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_BOMBCHU_5)))) && (logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS))) || Here(RR_WATER_TEMPLE_RIVER, []{return logic->IsAdult && logic->CanUse(RG_FAIRY_BOW) && ((ctx->GetTrickOption(RT_WATER_ADULT_DRAGON) && (logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS))) || ctx->GetTrickOption(RT_WATER_DRAGON_JUMP_DIVE));})), @@ -156,14 +156,14 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_WEST_LOWER, []{return true;}), }); - areaTable[RR_WATER_TEMPLE_CENTRAL_PILLAR_LOWER] = Region("Water Temple Central Pillar Lower", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_CENTRAL_PILLAR_LOWER] = Region("Water Temple Central Pillar Lower", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_LOBBY, []{return logic->SmallKeys(RR_WATER_TEMPLE, 5);}), Entrance(RR_WATER_TEMPLE_CENTRAL_PILLAR_UPPER, []{return logic->CanUse(RG_HOOKSHOT);}), Entrance(RR_WATER_TEMPLE_CENTRAL_PILLAR_BASEMENT, []{return logic->CanWaterTempleMiddle && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 40;}), }); - areaTable[RR_WATER_TEMPLE_CENTRAL_PILLAR_UPPER] = Region("Water Temple Central Pillar Upper", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_CENTRAL_PILLAR_UPPER] = Region("Water Temple Central Pillar Upper", SCENE_WATER_TEMPLE, { //Events EventAccess(&logic->CanWaterTempleMiddle, []{return logic->CanUse(RG_ZELDAS_LULLABY);}), }, { @@ -175,7 +175,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_CENTRAL_PILLAR_LOWER, []{return true;}), }); - areaTable[RR_WATER_TEMPLE_CENTRAL_PILLAR_BASEMENT] = Region("Water Temple Central Pillar Basement", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_CENTRAL_PILLAR_BASEMENT] = Region("Water Temple Central Pillar Basement", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 40), }, { @@ -183,7 +183,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_CENTRAL_PILLAR_LOWER, []{return logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16;}), }); - areaTable[RR_WATER_TEMPLE_EAST_MIDDLE] = Region("Water Temple East Middle", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_EAST_MIDDLE] = Region("Water Temple East Middle", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_COMPASS_CHEST, logic->CanUseProjectile()), LOCATION(RC_WATER_TEMPLE_NEAR_COMPASS_POT_1, logic->CanBreakPots()), @@ -194,13 +194,13 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_LOBBY, []{return logic->CanUse(RG_IRON_BOOTS);}), }); - areaTable[RR_WATER_TEMPLE_WEST_MIDDLE] = Region("Water Temple West Middle", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_WEST_MIDDLE] = Region("Water Temple West Middle", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_LOBBY, []{return true;}), Entrance(RR_WATER_TEMPLE_HIGH_WATER, []{return logic->CanUseProjectile();}), }); - areaTable[RR_WATER_TEMPLE_HIGH_WATER] = Region("Water Temple High Water", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_HIGH_WATER] = Region("Water Temple High Water", SCENE_WATER_TEMPLE, { //Events EventAccess(&logic->CanWaterTempleHigh, []{return logic->CanUse(RG_ZELDAS_LULLABY);}), }, {}, { @@ -208,7 +208,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_LOBBY, []{return true;}), }); - areaTable[RR_WATER_TEMPLE_BLOCK_CORRIDOR] = Region("Water Temple Block Corridor", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_BLOCK_CORRIDOR] = Region("Water Temple Block Corridor", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, logic->HasItem(RG_GORONS_BRACELET) && (logic->CanWaterTempleLowFromHigh || logic->CanWaterTempleMiddle)), LOCATION(RC_WATER_TEMPLE_CENTRAL_BOW_POT_1, logic->CanBreakPots() && logic->HasItem(RG_GORONS_BRACELET) && (logic->CanWaterTempleLowFromHigh || logic->CanWaterTempleMiddle)), @@ -218,7 +218,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_LOBBY, []{return logic->CanUse(RG_HOOKSHOT);}), }); - areaTable[RR_WATER_TEMPLE_FALLING_PLATFORM_ROOM] = Region("Water Temple Falling Platform Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_FALLING_PLATFORM_ROOM] = Region("Water Temple Falling Platform Room", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, logic->CanUse(RG_LONGSHOT) || (ctx->GetTrickOption(RT_WATER_RANG_FALLING_PLATFORM_GS) && logic->IsChild && logic->CanUse(RG_BOOMERANG)) || (ctx->GetTrickOption(RT_WATER_HOOKSHOT_FALLING_PLATFORM_GS) && logic->IsAdult && logic->CanUse(RG_HOOKSHOT))), }, { @@ -227,7 +227,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_DRAGON_PILLARS_ROOM, []{return logic->CanUse(RG_HOOKSHOT) && logic->SmallKeys(RR_WATER_TEMPLE, 5);}), }); - areaTable[RR_WATER_TEMPLE_DRAGON_PILLARS_ROOM] = Region("Water Temple Dragon Pillars Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_DRAGON_PILLARS_ROOM] = Region("Water Temple Dragon Pillars Room", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_LIKE_LIKE_POT_1, logic->CanUse(RG_HOOKSHOT)), LOCATION(RC_WATER_TEMPLE_LIKE_LIKE_POT_2, logic->CanUse(RG_HOOKSHOT)), @@ -237,13 +237,13 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_DARK_LINK_ROOM, []{return logic->CanUse(RG_HOOKSHOT);}), }); - areaTable[RR_WATER_TEMPLE_DARK_LINK_ROOM] = Region("Water Temple Dark Link Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_DARK_LINK_ROOM] = Region("Water Temple Dark Link Room", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_DRAGON_PILLARS_ROOM, []{return logic->CanKillEnemy(RE_DARK_LINK);}), Entrance(RR_WATER_TEMPLE_LONGSHOT_ROOM, []{return logic->CanKillEnemy(RE_DARK_LINK);}), }); - areaTable[RR_WATER_TEMPLE_LONGSHOT_ROOM] = Region("Water Temple Longshot Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_LONGSHOT_ROOM] = Region("Water Temple Longshot Room", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_LONGSHOT_CHEST, true), }, { @@ -252,7 +252,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_RIVER, []{return logic->IsChild || logic->CanUse(RG_SONG_OF_TIME);}), }); - areaTable[RR_WATER_TEMPLE_RIVER] = Region("Water Temple River", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_RIVER] = Region("Water Temple River", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_RIVER_CHEST, (logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW)) && (logic->IsAdult || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT))), LOCATION(RC_WATER_TEMPLE_GS_RIVER, (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT)) || (ctx->GetTrickOption(RT_WATER_RIVER_GS) && logic->CanUse(RG_LONGSHOT))), @@ -267,7 +267,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_DRAGON_ROOM, []{return (logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW)) && (logic->IsAdult || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT));}), }); - areaTable[RR_WATER_TEMPLE_PRE_BOSS_ROOM] = Region("Water Temple Pre Boss Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_PRE_BOSS_ROOM] = Region("Water Temple Pre Boss Room", SCENE_WATER_TEMPLE, { //Events EventAccess(&logic->FairyPot, []{return true;}), }, { @@ -284,7 +284,7 @@ void RegionTable_Init_WaterTemple() { #pragma region MQ - areaTable[RR_WATER_TEMPLE_MQ_3F_SOUTH_LEDGE] = Region("Water Temple MQ 3F South Ledge", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_3F_SOUTH_LEDGE] = Region("Water Temple MQ 3F South Ledge", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_ENTRYWAY, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS);}), Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return true;}), @@ -297,7 +297,7 @@ void RegionTable_Init_WaterTemple() { //Entry should only include being in the correct area, taking any possible fall damage, and floating up to the surface of WL_HIGH if coming from below //This area then leads to others based on level and worst-case water timers for follow-up exits from the water's surface //remember that any solution that works for any level doesn't need to be given a level, even if that solution is overkill for a lower level - areaTable[RR_WATER_TEMPLE_MQ_MAIN] = Region("Water Temple MQ Main", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_MAIN] = Region("Water Temple MQ Main", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_MQ_3F_SOUTH_LEDGE, []{return logic->HasItem(RG_BRONZE_SCALE) && logic->MQWaterLevel(WL_HIGH);}), //Jumping across is possible but a trick due to the janky ledge @@ -317,7 +317,7 @@ void RegionTable_Init_WaterTemple() { }); //This region specifically covers the topmost platform around central pillar - areaTable[RR_WATER_TEMPLE_MQ_3F_CENTRAL] = Region("Water Temple MQ 3F Central", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_3F_CENTRAL] = Region("Water Temple MQ 3F Central", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return true;}), Entrance(RR_WATER_TEMPLE_MQ_3F_SOUTH_LEDGE, []{return logic->CanUse(RG_LONGSHOT) || logic->CanUse(RG_HOVER_BOOTS);}), @@ -334,7 +334,7 @@ void RegionTable_Init_WaterTemple() { //This region specifically covers walking on the lower platform around central pillar. This is underwater when WL_HIGH //RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_HIGH should be accessed directly to use the central pillar door while at WL_HIGH - areaTable[RR_WATER_TEMPLE_MQ_2F_CENTRAL] = Region("Water Temple MQ 2F Central", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_2F_CENTRAL] = Region("Water Temple MQ 2F Central", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return true;}), Entrance(RR_WATER_TEMPLE_MQ_3F_CENTRAL, []{return logic->CanUse(RG_HOOKSHOT);}), @@ -344,7 +344,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY, []{return logic->MQWaterLevel(WL_LOW_OR_MID) && logic->CanUse(RG_HOVER_BOOTS);}), }); - areaTable[RR_WATER_TEMPLE_MQ_HIGH_EMBLEM] = Region("Water Temple MQ High Emblem", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_MQ_HIGH_EMBLEM] = Region("Water Temple MQ High Emblem", SCENE_WATER_TEMPLE, { //Events EventAccess(&logic->ReachedWaterHighEmblem, []{return true;}), EventAccess(&logic->CanWaterTempleHigh, []{return logic->CanUse(RG_ZELDAS_LULLABY);}), @@ -354,7 +354,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return true;}), }); - areaTable[RR_WATER_TEMPLE_MQ_3F_NORTH_LEDGE] = Region("Water Temple MQ 3F North Ledge", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_3F_NORTH_LEDGE] = Region("Water Temple MQ 3F North Ledge", SCENE_WATER_TEMPLE, {}, {}, { //Exits //what we need if WL_LOW, we can't guarantee repeated access otherwise. Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->TakeDamage();}), @@ -362,13 +362,13 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_BOSS_DOOR, []{return logic->CanUse(RG_LONGSHOT) || logic->CanUse(RG_ICE_ARROWS) || logic->CanUse(RG_NAYRUS_LOVE);}), }); - areaTable[RR_WATER_TEMPLE_MQ_BOSS_DOOR] = Region("Water Temple MQ Boss Door", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_BOSS_DOOR] = Region("Water Temple MQ Main", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_MQ_3F_NORTH_LEDGE, []{return logic->CanUse(RG_ICE_ARROWS) || logic->TakeDamage();}), Entrance(RR_WATER_TEMPLE_BOSS_ENTRYWAY, []{return true;}), }); - areaTable[RR_WATER_TEMPLE_MQ_EAST_TOWER] = Region("Water Temple MQ East Tower", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_MQ_EAST_TOWER] = Region("Water Temple MQ East Tower", SCENE_WATER_TEMPLE, { //Events //if we can't reach these, we can't move the water at all, so no need to specify level or account for WL_LOW access here //review is some way to play ocarina underwater exists @@ -388,7 +388,7 @@ void RegionTable_Init_WaterTemple() { }); //Raising the targets by clearing this room achieves nothing logically because it requires WL_LOW to do and hookshot to use, which implies access to WL_MID and WL_HIGH already - areaTable[RR_WATER_TEMPLE_MQ_EAST_TOWER_1F_ROOM] = Region("Water Temple MQ East Tower 1F Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_EAST_TOWER_1F_ROOM] = Region("Water Temple MQ East Tower 1F Room", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_COMPASS_CHEST, logic->CanKillEnemy(RE_LIZALFOS) && logic->CanKillEnemy(RE_SPIKE)), }, { @@ -396,7 +396,7 @@ void RegionTable_Init_WaterTemple() { }); //This area assumes we entered through the lower door, so water is low and cannot be changed without leaving. - areaTable[RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_1F] = Region("Water Temple MQ Central Pillar 1F", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_1F] = Region("Water Temple MQ Central Pillar 1F", SCENE_WATER_TEMPLE, { //Events //This is harder than the other possibilities as you have to move between shots on top of the extra range, but there's basically no universe this should matter. EventAccess(&logic->MQWaterB1Switch, []{return ctx->GetTrickOption(RT_WATER_MQ_CENTRAL_PILLAR) && logic->CanUse(RG_FIRE_ARROWS);}), @@ -410,7 +410,7 @@ void RegionTable_Init_WaterTemple() { }); //If we enter here in WL_HIGH, go to RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_HIGH instead, Assumes WL_MID_OR_LOW - areaTable[RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_2F] = Region("Water Temple MQ Central Pillar 2F", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_2F] = Region("Water Temple MQ Central Pillar 2F", SCENE_WATER_TEMPLE, { //Events EventAccess(&logic->CouldWaterTempleMiddle, []{return true;}), EventAccess(&logic->CanWaterTempleMiddle, []{return logic->CanUse(RG_ZELDAS_LULLABY);}), @@ -424,7 +424,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_B1, []{return logic->MQWaterOpenedPillarB1 && logic->MQWaterLevel(WL_MID) && logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_ZORA_TUNIC);}), }); - areaTable[RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_HIGH] = Region("Water Temple MQ Central Pillar High", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_HIGH] = Region("Water Temple MQ Central Pillar High", SCENE_WATER_TEMPLE, { //Events EventAccess(&logic->MQWaterOpenedPillarB1, []{return ((logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_DINS_FIRE)) || (ctx->GetTrickOption(RT_WATER_MQ_CENTRAL_PILLAR) && logic->CanUse(RG_FIRE_ARROWS))) && (logic->HasItem(RG_BRONZE_SCALE) || (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_LONGSHOT) && logic->CanJumpslash()));}), }, { @@ -437,7 +437,7 @@ void RegionTable_Init_WaterTemple() { }); //Assuming tunic and irons was checked on entry - areaTable[RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_B1] = Region("Water Temple MQ Central Pillar B1", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_B1] = Region("Water Temple MQ Central Pillar B1", SCENE_WATER_TEMPLE, {}, {}, { //Exits //Can't know water level, so we'll just assume any possibility and skip to MAIN Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return logic->MQWaterOpenedPillarB1 && logic->CanUse(RG_IRON_BOOTS) && logic->HasItem(RG_BRONZE_SCALE);}), @@ -445,7 +445,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_B1_FINAL, []{return ((logic->IsAdult && logic->CanUse(RG_LONGSHOT)) || (logic->CanUse(RG_HOOKSHOT) && logic->HasItem(RG_BRONZE_SCALE)));}), }); - areaTable[RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_B1_FINAL] = Region("Water Temple MQ Central Pillar B1 Final", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_CENTRAL_PILLAR_B1_FINAL] = Region("Water Temple MQ Central Pillar B1 Final", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, logic->CanUse(RG_HOOKSHOT)), LOCATION(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, logic->CanBreakCrates()), @@ -465,7 +465,7 @@ void RegionTable_Init_WaterTemple() { }, {}); //Region exists to add crate/pot/box locations - areaTable[RR_WATER_TEMPLE_MQ_STORAGE_ROOM] = Region("Water Temple MQ Storage Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_STORAGE_ROOM] = Region("Water Temple MQ Storage Room", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, logic->CanBreakPots()), LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, logic->CanBreakPots()), @@ -486,7 +486,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return logic->MQWaterLevel(WL_LOW_OR_MID) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8);}), }); - areaTable[RR_WATER_TEMPLE_MQ_BEHIND_BLUE_SWITCH_2F] = Region("Water Temple MQ Behind Blue Switch 2F", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_BEHIND_BLUE_SWITCH_2F] = Region("Water Temple MQ Behind Blue Switch 2F", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, logic->CanBreakPots()), LOCATION(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, logic->CanBreakPots()), @@ -507,7 +507,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_BEHIND_BLUE_SWITCH_3F, []{return logic->CanUse(RG_LONGSHOT);}), }); - areaTable[RR_WATER_TEMPLE_MQ_BEHIND_BLUE_SWITCH_3F] = Region("Water Temple MQ Behind Blue Switch 3F", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_BEHIND_BLUE_SWITCH_3F] = Region("Water Temple MQ Behind Blue Switch 2F", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), }, { @@ -516,7 +516,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_HIGH_EMBLEM, []{return true;}), }); - areaTable[RR_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY] = Region("Water Temple MQ Lizalfos Hallway", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY] = Region("Water Temple MQ Lizalfos Hallway", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT, logic->CanBreakPots()), LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT, logic->CanBreakPots()), @@ -536,13 +536,13 @@ void RegionTable_Init_WaterTemple() { /*Entrance(RR_WATER_TEMPLE_MQ_3F_EAST_LEDGE, []{return (logic->CanUse(RG_HOOKSHOT) && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS))) || (logic->MQWaterLevel(WL_LOW_OR_MID) && logic->CanUse(RG_HOOKSHOT)) || logic->MQWaterLevel(WL_HIGH) && (logic->HasItem(RG_BRONZE_SCALE));}), }); - areaTable[RR_WATER_TEMPLE_MQ_3F_EAST_LEDGE] = Region("Water Temple MQ 3F East Ledge", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_3F_EAST_LEDGE] = Region("Water Temple MQ 3F East Ledge", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_MQ_MAIN, []{return true;}), Entrance(RR_WATER_TEMPLE_MQ_3F_CENTRAL, []{return logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS);}),*/ }); - areaTable[RR_WATER_TEMPLE_MQ_LIZALFOS_CAGE] = Region("Water Temple MQ Lizalfos Cage", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_LIZALFOS_CAGE] = Region("Water Temple MQ Lizalfos Cage", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, logic->CanKillEnemy(RE_GOLD_SKULLTULA)), LOCATION(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT, logic->CanBreakPots()), @@ -552,7 +552,7 @@ void RegionTable_Init_WaterTemple() { }, {}); //This room exists to hold the wonderitems that drop from the emblems here. Specifically this assumes you are standing on the final ledge - areaTable[RR_WATER_TEMPLE_MQ_WATERFALL] = Region("Water Temple MQ Waterfall", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_WATERFALL] = Region("Water Temple Waterfall", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_MQ_3F_CENTRAL, []{return logic->SmallKeys(RR_WATER_TEMPLE, 1) && logic->CanUse(RG_LONGSHOT);}), Entrance(RR_WATER_TEMPLE_MQ_STALFOS_PIT, []{return true;}), @@ -560,7 +560,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_STALFOS_PIT_UPPER, []{return logic->MQWaterStalfosPit && logic->CanUse(RG_LONGSHOT);}), }); - areaTable[RR_WATER_TEMPLE_MQ_STALFOS_PIT] = Region("Water Temple MQ Stalfos Pit", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_MQ_STALFOS_PIT] = Region("Water Temple MQ Stalfos Pit", SCENE_WATER_TEMPLE, { //Events EventAccess(&logic->MQWaterStalfosPit, []{return ((logic->IsAdult && logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 3, false, true)) || (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT) && logic->CanKillEnemy(RE_STALFOS, ED_BOMB_THROW, true, 3, false, true)));}), }, {}, { @@ -571,7 +571,7 @@ void RegionTable_Init_WaterTemple() { }); //also includes the suns fairy in the middle - areaTable[RR_WATER_TEMPLE_MQ_STALFOS_PIT_POTS] = Region("Water Temple MQ Stalfos Pit Pots", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_MQ_STALFOS_PIT_POTS] = Region("Water Temple MQ Stalfos Pit Pots", SCENE_WATER_TEMPLE, { //Events EventAccess(&logic->FairyPot, []{return true;}), EventAccess(&logic->NutPot, []{return true;}), @@ -589,7 +589,7 @@ void RegionTable_Init_WaterTemple() { }); //specifically the area past the spikes - areaTable[RR_WATER_TEMPLE_MQ_STALFOS_PIT_UPPER] = Region("Water Temple MQ Stalfos Pit Upper", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_STALFOS_PIT_UPPER] = Region("Water Temple MQ Stalfos Pit Upper", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1, logic->CanBreakPots()), LOCATION(RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2, logic->CanBreakPots()), @@ -602,7 +602,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_AFTER_DARK_LINK, []{return logic->CanKillEnemy(RE_DARK_LINK);}), }); - areaTable[RR_WATER_TEMPLE_MQ_AFTER_DARK_LINK] = Region("Water Temple MQ After Dark Link", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_MQ_AFTER_DARK_LINK] = Region("Water Temple MQ After Dark Link", SCENE_WATER_TEMPLE, { //Events EventAccess(&logic->FairyPot, []{return true;}), }, { @@ -616,7 +616,7 @@ void RegionTable_Init_WaterTemple() { }); //if we can use hookshot, we are standing on the targets, otherwise assume we're in the water - areaTable[RR_WATER_TEMPLE_MQ_RIVER_SKULL] = Region("Water Temple MQ River Skull", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_RIVER_SKULL] = Region("Water Temple MQ River Skull", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_GS_RIVER, logic->CanUse(RG_LONGSHOT) || (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT))), }, { @@ -624,7 +624,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_RIVER_POTS, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_LONGSHOT);}), }); - areaTable[RR_WATER_TEMPLE_MQ_RIVER_POTS] = Region("Water Temple MQ River Pots", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_MQ_RIVER_POTS] = Region("Water Temple MQ River Pots", SCENE_WATER_TEMPLE, { //Events EventAccess(&logic->FairyPot, []{return true;}), }, { @@ -641,7 +641,7 @@ void RegionTable_Init_WaterTemple() { }); //This region assumes Iron boots to access - areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_TUNNEL] = Region("Water Temple MQ Dragon Room Tunnel", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_TUNNEL] = Region("Water Temple MQ Dragon Room Tunnel", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, logic->CanBreakCrates()), @@ -656,7 +656,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_LONGSHOT);}), }); - areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_ALCOVE] = Region("Water Temple MQ Dragon Room Alcove", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_ALCOVE] = Region("Water Temple MQ Dragon Room Alcove", SCENE_WATER_TEMPLE, { //Events EventAccess(&logic->MQWaterDragonTorches, []{return logic->HasFireSource();}), }, @@ -674,7 +674,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR, []{return logic->HasItem(RG_SILVER_SCALE);}), }); - areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR] = Region("Water Temple MQ Dragon Room Door", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + areaTable[RR_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR] = Region("Water Temple MQ Dragon Room Door", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, logic->CanBreakCrates()), @@ -688,7 +688,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_SWITCH, []{return logic->MQWaterDragonTorches;}), }); - areaTable[RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_SWITCH] = Region("Water Temple MQ Boss Key Room Switch", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_SWITCH] = Region("Water Temple MQ Boss Key Room Switch", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_BOSS_KEY_POT, logic->CanBreakPots()), LOCATION(RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, logic->CanBreakCrates()), @@ -700,7 +700,7 @@ void RegionTable_Init_WaterTemple() { }); //this exists for the crates in preparation for clips through the grate - areaTable[RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_PIT] = Region("Water Temple MQ Boss Key Room Pit", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + areaTable[RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_PIT] = Region("Water Temple MQ Boss Key Room Pit", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, logic->CanBreakCrates()), @@ -713,7 +713,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_SWITCH, []{return logic->CanHitSwitch(ED_BOOMERANG);}), }); - areaTable[RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_CHEST] = Region("Water Temple MQ Boss Key Room Chest", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_CHEST] = Region("Water Temple MQ Boss Key Room Chest", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, true), }, { @@ -723,7 +723,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_B1_GATE_SWITCH, []{return logic->HasItem(RG_SILVER_SCALE) || (logic->CanUse(RG_IRON_BOOTS) && (logic->HasItem(RG_BRONZE_SCALE) || (logic->WaterTimer() >= 24 && logic->CanUse(RG_LONGSHOT))));}), }); - areaTable[RR_WATER_TEMPLE_MQ_B1_GATE_SWITCH] = Region("Water Temple MQ B1 Gate Switch", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_MQ_B1_GATE_SWITCH] = Region("Water Temple MQ B1 Gate Switch", SCENE_WATER_TEMPLE, { //Events //If the water is low, the switch is underwater and needs irons to press, otherwise, the water is too low to climb up and you need irons to hookshot a target //If a glitch clips through the gate on low, have it logically press the switch and let entrance logic enter @@ -734,7 +734,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_BOSS_KEY_ROOM_CHEST, []{return logic->CanUse(RG_IRON_BOOTS) && logic->HasItem(RG_BRONZE_SCALE) && (logic->MQWaterLevel(WL_LOW) || logic->WaterTimer() >= 24);}) }); - areaTable[RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_ROOM] = Region("Water Temple MQ Triangle Torch Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + areaTable[RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_ROOM] = Region("Water Temple MQ Triangle Torch Room", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16 && logic->CanBreakCrates()), @@ -750,7 +750,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_CAGE, []{return logic->CanUse(RG_FIRE_ARROWS) && ((logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)) || (logic->CanUse(RG_LONGSHOT) && Here(RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_CAGE, []{return logic->ScarecrowsSong();})));}) }); - areaTable[RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_CAGE] = Region("Water Temple MQ Triangle Torch Cage", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_TRIANGLE_TORCH_CAGE] = Region("Water Temple MQ Triangle Torch Cage", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG)), LOCATION(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, logic->CanBreakPots()), @@ -762,7 +762,7 @@ void RegionTable_Init_WaterTemple() { LOCATION(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, logic->CanBreakCrates()), }, {}); - areaTable[RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_ROOM] = Region("Water Temple MQ Crates Whirlpools Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, + areaTable[RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_ROOM] = Region("Water Temple MQ Crates Whirlpools Room", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, logic->CanBreakCrates()), @@ -788,7 +788,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_CAGE, []{return ctx->GetTrickOption(RT_WATER_MQ_LOCKED_GS) && (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT));}), }); - areaTable[RR_WATER_TEMPLE_MQ_SINGLE_STALFOS_ROOM] = Region("Water Temple MQ Single Stalfos Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_SINGLE_STALFOS_ROOM] = Region("Water Temple MQ Single Stalfos Room", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, logic->CanBreakCrates()), LOCATION(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, logic->CanBreakPots()), @@ -804,13 +804,13 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_ROOM, []{return logic->HasItem(RG_SILVER_SCALE) || (logic->IsChild && logic->HasItem(RG_BRONZE_SCALE)) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8 && (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_HOOKSHOT)));}) }); - areaTable[RR_WATER_TEMPLE_MQ_4_TORCH_ROOM] = Region("Water Temple MQ 4 Torch Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_4_TORCH_ROOM] = Region("Water Temple MQ 4 Torch Room", SCENE_WATER_TEMPLE, {}, {}, { //Exits Entrance(RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_ROOM, []{return (logic->IsAdult && (logic->CanUse(RG_HOVER_BOOTS) || logic->CanJumpslash())) || (logic->HasItem(RG_BRONZE_SCALE) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8 && logic->CanUse(RG_HOOKSHOT) ));}), Entrance(RR_WATER_TEMPLE_MQ_DODONGO_ROOM, []{return logic->CanHitSwitch() && logic->HasFireSource();}) }); - areaTable[RR_WATER_TEMPLE_MQ_DODONGO_ROOM] = Region("Water Temple MQ Dodongo Room", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_DODONGO_ROOM] = Region("Water Temple MQ Dodongo Room", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, logic->CanBreakPots()), LOCATION(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, logic->CanBreakPots()), @@ -825,7 +825,7 @@ void RegionTable_Init_WaterTemple() { Entrance(RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_CAGE, []{return (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS)) && Here(RR_WATER_TEMPLE_MQ_DODONGO_ROOM, []{return logic->CanKillEnemy(RE_DODONGO, ED_CLOSE, true, 5);});}) }); - areaTable[RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_CAGE] = Region("Water Temple MQ Basement Gated Areas", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_WATER_TEMPLE_MQ_CRATES_WHIRLPOOLS_CAGE] = Region("Water Temple MQ Basement Gated Areas", SCENE_WATER_TEMPLE, {}, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA) && logic->CanBreakCrates()), LOCATION(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, logic->CanBreakCrates()), @@ -839,14 +839,14 @@ void RegionTable_Init_WaterTemple() { #pragma endregion // Boss Room - areaTable[RR_WATER_TEMPLE_BOSS_ENTRYWAY] = Region("Water Temple Boss Entryway", "Water Temple", {RA_WATER_TEMPLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_BOSS_ENTRYWAY] = Region("Water Temple Boss Entryway", SCENE_WATER_TEMPLE, {}, {}, { // Exits Entrance(RR_WATER_TEMPLE_PRE_BOSS_ROOM, []{return ctx->GetDungeon(WATER_TEMPLE)->IsVanilla() && false;}), Entrance(RR_WATER_TEMPLE_MQ_BOSS_DOOR, []{return ctx->GetDungeon(WATER_TEMPLE)->IsMQ() && false;}), Entrance(RR_WATER_TEMPLE_BOSS_ROOM, []{return logic->HasItem(RG_WATER_TEMPLE_BOSS_KEY);}), }); - areaTable[RR_WATER_TEMPLE_BOSS_ROOM] = Region("Water Temple Boss Room", "Water Temple", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_WATER_TEMPLE_BOSS_ROOM] = Region("Water Temple Boss Room", SCENE_WATER_TEMPLE_BOSS, { // Events EventAccess(&logic->WaterTempleClear, []{return logic->CanKillEnemy(RE_MORPHA);}), }, { diff --git a/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp b/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp index 20d7817d8..1a55e6829 100644 --- a/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp @@ -10,7 +10,7 @@ using namespace Rando; void RegionTable_Init_GerudoFortress() { // clang-format off - areaTable[RR_GERUDO_FORTRESS] = Region("Gerudo Fortress", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GERUDO_FORTRESS] = Region("Gerudo Fortress", SCENE_GERUDOS_FORTRESS, { //Events EventAccess(&logic->CarpenterRescue, []{return logic->CanFinishGerudoFortress();}), EventAccess(&logic->GF_GateOpen, []{return logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD);}), @@ -89,7 +89,7 @@ void RegionTable_Init_GerudoFortress() { Entrance(RR_GF_STORMS_GROTTO, []{return logic->IsAdult && logic->CanOpenStormsGrotto();}), }); - areaTable[RR_GF_OUTSIDE_GATE] = Region("GF Outside Gate", "Gerudo Fortress", {RA_GERUDO_FORTRESS}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GF_OUTSIDE_GATE] = Region("GF Outside Gate", SCENE_GERUDOS_FORTRESS, { //Events EventAccess(&logic->GF_GateOpen, []{return logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && (ctx->GetOption(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD) || ctx->GetOption(RSK_SHUFFLE_OVERWORLD_ENTRANCES) /*|| ShuffleSpecialIndoorEntrances*/);}), }, {}, { @@ -98,7 +98,7 @@ void RegionTable_Init_GerudoFortress() { 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", SCENE_GROTTOS, { //Events EventAccess(&logic->FreeFairies, []{return true;}), }, { diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp index fb9676f50..b9525386c 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/castle_grounds.cpp @@ -7,14 +7,16 @@ void RegionTable_Init_CastleGrounds() { // clang-format off //With multi-area support {RA_CASTLE_GROUNDS} is not strictly required anymore, as any interior here could inherit both //{RA_HYRULE_CASTLE} and {RA_OUTSIDE_GANONS_CASTLE}, but a setting to merge the latter 2 into the former may be preferred - areaTable[RR_CASTLE_GROUNDS] = Region("Castle Grounds", "Castle Grounds", {RA_CASTLE_GROUNDS}, NO_DAY_NIGHT_CYCLE, {}, {}, { + // + //Temporarily uses SCENE_OUTSIDE_GANONS_CASTLE to avoid self connection between ages + areaTable[RR_CASTLE_GROUNDS] = Region("Castle Grounds", SCENE_OUTSIDE_GANONS_CASTLE, TIME_DOESNT_PASS, {RA_CASTLE_GROUNDS}, {}, {}, { //Exits Entrance(RR_THE_MARKET, []{return true;}), Entrance(RR_HYRULE_CASTLE_GROUNDS, []{return logic->IsChild;}), Entrance(RR_GANONS_CASTLE_GROUNDS, []{return logic->IsAdult;}), }); - areaTable[RR_HYRULE_CASTLE_GROUNDS] = Region("Hyrule Castle Grounds", "Castle Grounds", {RA_HYRULE_CASTLE}, DAY_NIGHT_CYCLE, { + areaTable[RR_HYRULE_CASTLE_GROUNDS] = Region("Hyrule Castle Grounds", SCENE_HYRULE_CASTLE, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairy();}), EventAccess(&logic->ButterflyFairy, []{return logic->CanUse(RG_STICKS);}), @@ -39,7 +41,7 @@ void RegionTable_Init_CastleGrounds() { Entrance(RR_HC_STORMS_GROTTO, []{return logic->CanOpenStormsGrotto();}), }); - areaTable[RR_HC_GARDEN] = Region("HC Garden", "Castle Grounds", {RA_HYRULE_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_HC_GARDEN] = Region("HC Garden", SCENE_CASTLE_COURTYARD_ZELDA, {}, { //Locations LOCATION(RC_HC_ZELDAS_LETTER, true), LOCATION(RC_SONG_FROM_IMPA, true), @@ -48,7 +50,7 @@ void RegionTable_Init_CastleGrounds() { Entrance(RR_HYRULE_CASTLE_GROUNDS, []{return true;}), }); - areaTable[RR_HC_GREAT_FAIRY_FOUNTAIN] = Region("HC Great Fairy Fountain", "HC Great Fairy Fountain", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_HC_GREAT_FAIRY_FOUNTAIN] = Region("HC Great Fairy Fountain", SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, {}, { //Locations LOCATION(RC_HC_GREAT_FAIRY_REWARD, logic->CanUse(RG_ZELDAS_LULLABY)), }, { @@ -56,7 +58,7 @@ void RegionTable_Init_CastleGrounds() { Entrance(RR_CASTLE_GROUNDS, []{return true;}), }); - areaTable[RR_HC_STORMS_GROTTO] = Region("HC Storms Grotto", "HC Storms Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_HC_STORMS_GROTTO] = Region("HC Storms Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_HC_GS_STORMS_GROTTO, logic->CanUse(RG_BOOMERANG) && ctx->GetTrickOption(RT_HC_STORMS_GS)), }, { @@ -65,7 +67,7 @@ void RegionTable_Init_CastleGrounds() { Entrance(RR_HC_STORMS_GROTTO_BEHIND_WALLS, []{return logic->CanBreakMudWalls();}), }); - areaTable[RR_HC_STORMS_GROTTO_BEHIND_WALLS] = Region("HC Storms Grotto Behind Walls", "HC Storms Grotto", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_HC_STORMS_GROTTO_BEHIND_WALLS] = Region("HC Storms Grotto Behind Walls", SCENE_GROTTOS, { //Events EventAccess(&logic->NutPot, []{return true;}), EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairy();}), @@ -85,7 +87,7 @@ void RegionTable_Init_CastleGrounds() { Entrance(RR_HC_STORMS_GROTTO, []{return true;}), }); - areaTable[RR_GANONS_CASTLE_GROUNDS] = Region("Ganon's Castle Grounds", "Castle Grounds", {RA_OUTSIDE_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GANONS_CASTLE_GROUNDS] = Region("Ganon's Castle Grounds", SCENE_OUTSIDE_GANONS_CASTLE, { //Events EventAccess(&logic->BuiltRainbowBridge, []{return logic->CanBuildRainbowBridge();}), }, { @@ -98,7 +100,7 @@ void RegionTable_Init_CastleGrounds() { Entrance(RR_GANONS_CASTLE_LEDGE, []{return logic->BuiltRainbowBridge;}), }); - areaTable[RR_OGC_GREAT_FAIRY_FOUNTAIN] = Region("OGC Great Fairy Fountain", "OGC Great Fairy Fountain", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_OGC_GREAT_FAIRY_FOUNTAIN] = Region("OGC Great Fairy Fountain", SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, {}, { //Locations LOCATION(RC_OGC_GREAT_FAIRY_REWARD, logic->CanUse(RG_ZELDAS_LULLABY)), }, { @@ -106,13 +108,13 @@ void RegionTable_Init_CastleGrounds() { Entrance(RR_CASTLE_GROUNDS, []{return true;}), }); - areaTable[RR_CASTLE_GROUNDS_FROM_GANONS_CASTLE] = Region("Castle Grounds From Ganon's Castle", "Castle Grounds From Ganon's Castle", {RA_CASTLE_GROUNDS}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_CASTLE_GROUNDS_FROM_GANONS_CASTLE] = Region("Castle Grounds From Ganon's Castle", SCENE_OUTSIDE_GANONS_CASTLE, {}, {}, { // Exits Entrance(RR_HYRULE_CASTLE_GROUNDS, []{return logic->IsChild;}), Entrance(RR_GANONS_CASTLE_LEDGE, []{return logic->IsAdult;}), }); - areaTable[RR_GANONS_CASTLE_LEDGE] = Region("Ganon's Castle Ledge", "OGC Ganon's Castle Ledge", {RA_OUTSIDE_GANONS_CASTLE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GANONS_CASTLE_LEDGE] = Region("Ganon's Castle Ledge", SCENE_OUTSIDE_GANONS_CASTLE, {}, {}, { // Exits Entrance(RR_GANONS_CASTLE_GROUNDS, []{return logic->BuiltRainbowBridge;}), Entrance(RR_GANONS_CASTLE_ENTRYWAY, []{return logic->IsAdult;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp index 29ab7cb41..be1b2043a 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_crater.cpp @@ -5,14 +5,14 @@ using namespace Rando; void RegionTable_Init_DeathMountainCrater() { // clang-format off - areaTable[RR_DMC_UPPER_NEARBY] = Region("DMC Upper Nearby", "Death Mountain Crater", {RA_DEATH_MOUNTAIN_CRATER}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DMC_UPPER_NEARBY] = Region("DMC Upper Nearby", SCENE_DEATH_MOUNTAIN_CRATER, {}, {}, { //Exits Entrance(RR_DMC_UPPER_LOCAL, []{return logic->FireTimer() >= 48;}), Entrance(RR_DEATH_MOUNTAIN_SUMMIT, []{return true;}), Entrance(RR_DMC_UPPER_GROTTO, []{return Here(RR_DMC_UPPER_NEARBY, []{return logic->BlastOrSmash() && (logic->FireTimer() >= 8 || logic->Hearts() >= 3);});}) }); - areaTable[RR_DMC_UPPER_LOCAL] = Region("DMC Upper Local", "Death Mountain Crater", {RA_DEATH_MOUNTAIN_CRATER}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DMC_UPPER_LOCAL] = Region("DMC Upper Local", SCENE_DEATH_MOUNTAIN_CRATER, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->HasExplosives() && logic->CallGossipFairyExceptSuns() && (logic->FireTimer() >= 16 || logic->Hearts() >= 3);}), }, { @@ -33,7 +33,7 @@ void RegionTable_Init_DeathMountainCrater() { Entrance(RR_DMC_DISTANT_PLATFORM, []{return (logic->FireTimer() >= 48 && logic->Hearts() >= 2) || logic->Hearts() >= 3;}), }); - areaTable[RR_DMC_LADDER_AREA_NEARBY] = Region("DMC Ladder Region Nearby", "Death Mountain Crater", {RA_DEATH_MOUNTAIN_CRATER}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DMC_LADDER_AREA_NEARBY] = Region("DMC Ladder Region Nearby", SCENE_DEATH_MOUNTAIN_CRATER, {}, { //Locations LOCATION(RC_DMC_DEKU_SCRUB, logic->IsChild && logic->CanStunDeku()), }, { @@ -42,7 +42,7 @@ void RegionTable_Init_DeathMountainCrater() { Entrance(RR_DMC_LOWER_NEARBY, []{return logic->Hearts() >= 3 && (logic->CanUse(RG_HOVER_BOOTS) || (ctx->GetTrickOption(RT_DMC_BOULDER_JS) && logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)) || (ctx->GetTrickOption(RT_DMC_BOULDER_SKIP) && logic->IsAdult));}), }); - areaTable[RR_DMC_LOWER_NEARBY] = Region("DMC Lower Nearby", "Death Mountain Crater", {RA_DEATH_MOUNTAIN_CRATER}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DMC_LOWER_NEARBY] = Region("DMC Lower Nearby", SCENE_DEATH_MOUNTAIN_CRATER, {}, { // Locations LOCATION(RC_DMC_NEAR_GC_POT_1, logic->CanBreakPots()), LOCATION(RC_DMC_NEAR_GC_POT_2, logic->CanBreakPots()), @@ -56,7 +56,7 @@ void RegionTable_Init_DeathMountainCrater() { Entrance(RR_DMC_HAMMER_GROTTO, []{return logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER);}), }); - areaTable[RR_DMC_LOWER_LOCAL] = Region("DMC Lower Local", "Death Mountain Crater", {RA_DEATH_MOUNTAIN_CRATER}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DMC_LOWER_LOCAL] = Region("DMC Lower Local", SCENE_DEATH_MOUNTAIN_CRATER, {}, {}, { //Exits Entrance(RR_DMC_LOWER_NEARBY, []{return true;}), Entrance(RR_DMC_LADDER_AREA_NEARBY, []{return logic->FireTimer() >= 8 || logic->Hearts() >= 3;}), @@ -64,7 +64,7 @@ void RegionTable_Init_DeathMountainCrater() { Entrance(RR_DMC_CENTRAL_LOCAL, []{return (logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT) || (logic->IsAdult && logic->CanShield() && ctx->GetTrickOption(RT_DMC_BOLERO_JUMP))) && logic->FireTimer() >= 24;}), }); - areaTable[RR_DMC_CENTRAL_NEARBY] = Region("DMC Central Nearby", "Death Mountain Crater", {RA_DEATH_MOUNTAIN_CRATER}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DMC_CENTRAL_NEARBY] = Region("DMC Central Nearby", SCENE_DEATH_MOUNTAIN_CRATER, {}, { //Locations LOCATION(RC_DMC_VOLCANO_FREESTANDING_POH, logic->IsAdult && logic->Hearts() >= 3 && (CanPlantBean(RR_DMC_CENTRAL_LOCAL) || (ctx->GetTrickOption(RT_DMC_HOVER_BEAN_POH) && logic->CanUse(RG_HOVER_BOOTS)))), LOCATION(RC_SHEIK_IN_CRATER, logic->IsAdult && (logic->FireTimer() >= 8 || logic->Hearts() >= 3)), @@ -73,7 +73,7 @@ void RegionTable_Init_DeathMountainCrater() { Entrance(RR_DMC_CENTRAL_LOCAL, []{return logic->FireTimer() >= 48;}), }); - areaTable[RR_DMC_CENTRAL_LOCAL] = Region("DMC Central Local", "Death Mountain Crater", {RA_DEATH_MOUNTAIN_CRATER}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_DMC_CENTRAL_LOCAL] = Region("DMC Central Local", SCENE_DEATH_MOUNTAIN_CRATER, { //Events EventAccess(&logic->BeanPlantFairy, []{return logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->FireTimer() >= 8 || logic->Hearts() >= 3);}), }, { @@ -99,7 +99,7 @@ void RegionTable_Init_DeathMountainCrater() { Entrance(RR_DMC_DISTANT_PLATFORM, []{return logic->FireTimer() >= 48 && logic->CanUse(RG_DISTANT_SCARECROW);}), }); - areaTable[RR_DMC_GREAT_FAIRY_FOUNTAIN] = Region("DMC Great Fairy Fountain", "DMC Great Fairy Fountain", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DMC_GREAT_FAIRY_FOUNTAIN] = Region("DMC Great Fairy Fountain", SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, {}, { //Locations LOCATION(RC_DMC_GREAT_FAIRY_REWARD, logic->CanUse(RG_ZELDAS_LULLABY)), }, { @@ -107,7 +107,7 @@ void RegionTable_Init_DeathMountainCrater() { Entrance(RR_DMC_LOWER_LOCAL, []{return true;}), }); - areaTable[RR_DMC_UPPER_GROTTO] = Region("DMC Upper Grotto", "DMC Upper Grotto", {}, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_DMC_UPPER_GROTTO] = Region("DMC Upper Grotto", SCENE_GROTTOS, grottoEvents, { //Locations LOCATION(RC_DMC_UPPER_GROTTO_CHEST, true), LOCATION(RC_DMC_UPPER_GROTTO_FISH, logic->HasBottle()), @@ -125,7 +125,7 @@ void RegionTable_Init_DeathMountainCrater() { Entrance(RR_DMC_UPPER_LOCAL, []{return true;}), }); - areaTable[RR_DMC_HAMMER_GROTTO] = Region("DMC Hammer Grotto", "DMC Hammer Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DMC_HAMMER_GROTTO] = Region("DMC Hammer Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_DMC_DEKU_SCRUB_GROTTO_LEFT, logic->CanStunDeku()), LOCATION(RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, logic->CanStunDeku()), @@ -136,7 +136,7 @@ void RegionTable_Init_DeathMountainCrater() { Entrance(RR_DMC_LOWER_LOCAL, []{return true;}), }); - areaTable[RR_DMC_DISTANT_PLATFORM] = Region("DMC Distant Platform", "Death Mountain Crater", {RA_DEATH_MOUNTAIN_CRATER}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DMC_DISTANT_PLATFORM] = Region("DMC Distant Platform", SCENE_DEATH_MOUNTAIN_CRATER, {}, { //Locations LOCATION(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_1, logic->IsAdult), LOCATION(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_2, logic->IsAdult), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp index 5a0ae001c..dbf218947 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/death_mountain_trail.cpp @@ -5,7 +5,7 @@ using namespace Rando; void RegionTable_Init_DeathMountainTrail() { // clang-format off - areaTable[RR_DEATH_MOUNTAIN_TRAIL] = Region("Death Mountain", "Death Mountain", {RA_DEATH_MOUNTAIN_TRAIL}, DAY_NIGHT_CYCLE, { + areaTable[RR_DEATH_MOUNTAIN_TRAIL] = Region("Death Mountain", SCENE_DEATH_MOUNTAIN_TRAIL, { //Events EventAccess(&logic->BeanPlantFairy, []{return logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET));}), }, { @@ -30,7 +30,7 @@ void RegionTable_Init_DeathMountainTrail() { Entrance(RR_DMT_STORMS_GROTTO, []{return logic->CanOpenStormsGrotto();}), }); - areaTable[RR_DEATH_MOUNTAIN_SUMMIT] = Region("Death Mountain Summit", "Death Mountain", {RA_DEATH_MOUNTAIN_TRAIL}, DAY_NIGHT_CYCLE, { + areaTable[RR_DEATH_MOUNTAIN_SUMMIT] = Region("Death Mountain Summit", SCENE_DEATH_MOUNTAIN_TRAIL, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairy();}), EventAccess(&logic->BugRock, []{return logic->IsChild;}), @@ -52,12 +52,12 @@ void RegionTable_Init_DeathMountainTrail() { 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, {}, {}, { + areaTable[RR_DMT_OWL_FLIGHT] = Region("DMT Owl Flight", SCENE_DEATH_MOUNTAIN_TRAIL, {}, {}, { //Exits Entrance(RR_KAK_IMPAS_ROOFTOP, []{return true;}), }); - areaTable[RR_DMT_COW_GROTTO] = Region("DMT Cow Grotto", "DMT Cow Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DMT_COW_GROTTO] = Region("DMT Cow Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_DMT_COW_GROTTO_COW, logic->CanUse(RG_EPONAS_SONG)), LOCATION(RC_DMT_COW_GROTTO_BEEHIVE, logic->CanBreakLowerBeehives()), @@ -80,7 +80,7 @@ void RegionTable_Init_DeathMountainTrail() { Entrance(RR_DEATH_MOUNTAIN_SUMMIT, []{return true;}), }); - areaTable[RR_DMT_STORMS_GROTTO] = Region("DMT Storms Grotto", "DMT Storms Grotto", {}, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_DMT_STORMS_GROTTO] = Region("DMT Storms Grotto", SCENE_GROTTOS, grottoEvents, { //Locations LOCATION(RC_DMT_STORMS_GROTTO_CHEST, true), LOCATION(RC_DMT_STORMS_GROTTO_FISH, logic->HasBottle()), @@ -98,7 +98,7 @@ void RegionTable_Init_DeathMountainTrail() { Entrance(RR_DEATH_MOUNTAIN_TRAIL, []{return true;}), }); - areaTable[RR_DMT_GREAT_FAIRY_FOUNTAIN] = Region("DMT Great Fairy Fountain", "DMT Great Fairy Fountain", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DMT_GREAT_FAIRY_FOUNTAIN] = Region("DMT Great Fairy Fountain", SCENE_GREAT_FAIRYS_FOUNTAIN_MAGIC, {}, { //Locations LOCATION(RC_DMT_GREAT_FAIRY_REWARD, logic->CanUse(RG_ZELDAS_LULLABY)), }, { diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/desert_colossus.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/desert_colossus.cpp index ea0af20c0..f4b8b01c3 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/desert_colossus.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/desert_colossus.cpp @@ -5,7 +5,7 @@ using namespace Rando; void RegionTable_Init_DesertColossus() { // clang-format off - areaTable[RR_DESERT_COLOSSUS] = Region("Desert Colossus", "Desert Colossus", {RA_DESERT_COLOSSUS}, DAY_NIGHT_CYCLE, { + areaTable[RR_DESERT_COLOSSUS] = Region("Desert Colossus", SCENE_DESERT_COLOSSUS, { //Events EventAccess(&logic->FairyPond, []{return logic->CanUse(RG_SONG_OF_STORMS);}), EventAccess(&logic->BugRock, []{return true;}), @@ -32,7 +32,7 @@ void RegionTable_Init_DesertColossus() { }); //specifically the full oasis, after the fairies have spawned - areaTable[RR_DESERT_COLOSSUS_OASIS] = Region("Desert Colossus Oasis", "Desert Colossus", {RA_DESERT_COLOSSUS}, DAY_NIGHT_CYCLE, { + areaTable[RR_DESERT_COLOSSUS_OASIS] = Region("Desert Colossus Oasis", SCENE_DESERT_COLOSSUS, { //Events EventAccess(&logic->FairyPond, []{return true;}), }, { @@ -50,7 +50,7 @@ void RegionTable_Init_DesertColossus() { Entrance(RR_DESERT_COLOSSUS, []{return true;}), }); - areaTable[RR_DESERT_COLOSSUS_OUTSIDE_TEMPLE] = Region("Desert Colossus From Spirit Entryway", "Desert Colossus", {RA_DESERT_COLOSSUS}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DESERT_COLOSSUS_OUTSIDE_TEMPLE] = Region("Desert Colossus From Spirit Entryway", SCENE_DESERT_COLOSSUS, {}, { //Locations LOCATION(RC_SHEIK_AT_COLOSSUS, true), }, { @@ -58,7 +58,7 @@ void RegionTable_Init_DesertColossus() { Entrance(RR_DESERT_COLOSSUS, []{return true;}), }); - areaTable[RR_COLOSSUS_GREAT_FAIRY_FOUNTAIN] = Region("Colossus Great Fairy Fountain", "Colossus Great Fairy Fountain", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_COLOSSUS_GREAT_FAIRY_FOUNTAIN] = Region("Colossus Great Fairy Fountain", SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, {}, { //Locations LOCATION(RC_COLOSSUS_GREAT_FAIRY_REWARD, logic->CanUse(RG_ZELDAS_LULLABY)), }, { @@ -66,7 +66,7 @@ void RegionTable_Init_DesertColossus() { Entrance(RR_DESERT_COLOSSUS, []{return true;}), }); - areaTable[RR_COLOSSUS_GROTTO] = Region("Colossus Grotto", "Colossus Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_COLOSSUS_GROTTO] = Region("Colossus Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, logic->CanStunDeku()), LOCATION(RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, logic->CanStunDeku()), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp index e4e43ac18..4959636e2 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp @@ -5,7 +5,7 @@ using namespace Rando; void RegionTable_Init_GerudoValley() { // clang-format off - areaTable[RR_GERUDO_VALLEY] = Region("Gerudo Valley", "Gerudo Valley", {RA_GERUDO_VALLEY}, DAY_NIGHT_CYCLE, { + areaTable[RR_GERUDO_VALLEY] = Region("Gerudo Valley", SCENE_GERUDO_VALLEY, { //Events EventAccess(&logic->BugRock, []{return logic->IsChild;}), }, { @@ -21,7 +21,7 @@ void RegionTable_Init_GerudoValley() { Entrance(RR_GV_LOWER_STREAM, []{return logic->IsChild;}), //can use cucco as child }); - areaTable[RR_GV_UPPER_STREAM] = Region("GV Upper Stream", "Gerudo Valley", {RA_GERUDO_VALLEY}, DAY_NIGHT_CYCLE, { + areaTable[RR_GV_UPPER_STREAM] = Region("GV Upper Stream", SCENE_GERUDO_VALLEY, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairy();}), EventAccess(&logic->BeanPlantFairy, []{return logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS);}), @@ -43,12 +43,12 @@ void RegionTable_Init_GerudoValley() { }); // scale/boots logic is outside lower stream, as lower stream combines access to lake hylia for entrance randomizer's sake - areaTable[RR_GV_LOWER_STREAM] = Region("GV Lower Stream", "Gerudo Valley", {RA_GERUDO_VALLEY}, DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GV_LOWER_STREAM] = Region("GV Lower Stream", SCENE_GERUDO_VALLEY, {}, {}, { //Exits Entrance(RR_LAKE_HYLIA, []{return true;}), }); - areaTable[RR_GV_GROTTO_LEDGE] = Region("GV Grotto Ledge", "Gerudo Valley", {RA_GERUDO_VALLEY}, DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GV_GROTTO_LEDGE] = Region("GV Grotto Ledge", SCENE_GERUDO_VALLEY, {}, {}, { //Exits Entrance(RR_GV_UPPER_STREAM, []{return ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives();}), Entrance(RR_GV_LOWER_STREAM, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS);}), @@ -56,9 +56,9 @@ void RegionTable_Init_GerudoValley() { Entrance(RR_GV_CRATE_LEDGE, []{return logic->CanUse(RG_LONGSHOT);}), }); - areaTable[RR_GV_CRATE_LEDGE] = Region("GV Crate Ledge", "Gerudo Valley", {RA_GERUDO_VALLEY}, DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GV_CRATE_LEDGE] = Region("GV Crate Ledge", SCENE_GERUDO_VALLEY, {}, { //Locations - LOCATION(RC_GV_CRATE_FREESTANDING_POH, logic->CanBreakCrates()), + LOCATION(RC_GV_CRATE_FREESTANDING_POH, logic->CanBreakCrates()), LOCATION(RC_GV_FREESTANDING_POH_CRATE, logic->CanBreakCrates()), }, { //Exits @@ -66,7 +66,7 @@ void RegionTable_Init_GerudoValley() { Entrance(RR_GV_LOWER_STREAM, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS);}), }); - areaTable[RR_GV_FORTRESS_SIDE] = Region("GV Fortress Side", "Gerudo Valley", {RA_GERUDO_VALLEY}, DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GV_FORTRESS_SIDE] = Region("GV Fortress Side", SCENE_GERUDO_VALLEY, {}, { //Locations LOCATION(RC_GV_CHEST, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), LOCATION(RC_GV_TRADE_SAW, logic->IsAdult && logic->CanUse(RG_POACHERS_SAW)), @@ -86,12 +86,12 @@ void RegionTable_Init_GerudoValley() { Entrance(RR_GV_CRATE_LEDGE, []{return ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives();}), }); - areaTable[RR_GV_CARPENTER_TENT] = Region("GV Carpenter Tent", "GV Carpenter Tent", {}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GV_CARPENTER_TENT] = Region("GV Carpenter Tent", SCENE_CARPENTERS_TENT, {}, {}, { //Exits Entrance(RR_GV_FORTRESS_SIDE, []{return true;}), }); - areaTable[RR_GV_OCTOROK_GROTTO] = Region("GV Octorok Grotto", "GV Octorok Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GV_OCTOROK_GROTTO] = Region("GV Octorok Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), LOCATION(RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE, logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_BOOMERANG)), @@ -106,7 +106,7 @@ void RegionTable_Init_GerudoValley() { Entrance(RR_GV_GROTTO_LEDGE, []{return true;}), }); - areaTable[RR_GV_STORMS_GROTTO] = Region("GV Storms Grotto", "GV Storms Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GV_STORMS_GROTTO] = Region("GV Storms Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_GV_DEKU_SCRUB_GROTTO_REAR, logic->CanStunDeku()), LOCATION(RC_GV_DEKU_SCRUB_GROTTO_FRONT, logic->CanStunDeku()), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp index 21daeaf21..92c218997 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp @@ -5,7 +5,7 @@ using namespace Rando; void RegionTable_Init_GoronCity() { // clang-format off - areaTable[RR_GORON_CITY] = Region("Goron City", "Goron City", {RA_GORON_CITY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GORON_CITY] = Region("Goron City", SCENE_GORON_CITY, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairyExceptSuns();}), EventAccess(&logic->StickPot, []{return logic->IsChild;}), @@ -45,7 +45,7 @@ void RegionTable_Init_GoronCity() { Entrance(RR_GC_GROTTO_PLATFORM, []{return logic->IsAdult && ((logic->CanUse(RG_SONG_OF_TIME) && ((logic->EffectiveHealth() > 2) || logic->CanUse(RG_GORON_TUNIC) || logic->CanUse(RG_LONGSHOT) || logic->CanUse(RG_NAYRUS_LOVE))) || (logic->EffectiveHealth() > 1 && logic->CanUse(RG_GORON_TUNIC) && logic->CanUse(RG_HOOKSHOT)) || (logic->CanUse(RG_NAYRUS_LOVE) && logic->CanUse(RG_HOOKSHOT)) || (logic->EffectiveHealth() > 2 && logic->CanUse(RG_HOOKSHOT) && ctx->GetTrickOption(RT_GC_GROTTO)));}), }); - areaTable[RR_GC_MEDIGORON] = Region("GC Medigoron", "Goron City", {RA_GORON_CITY}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GC_MEDIGORON] = Region("GC Medigoron", SCENE_GORON_CITY, {}, { //Locations LOCATION(RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY, logic->CallGossipFairyExceptSuns()), LOCATION(RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), @@ -56,7 +56,7 @@ void RegionTable_Init_GoronCity() { Entrance(RR_GORON_CITY, []{return true;}), }); - areaTable[RR_GC_WOODS_WARP] = Region("GC Woods Warp", "Goron City", {RA_GORON_CITY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GC_WOODS_WARP] = Region("GC Woods Warp", SCENE_GORON_CITY, { //Events EventAccess(&logic->GCWoodsWarpOpen, []{return logic->BlastOrSmash() || logic->CanUse(RG_DINS_FIRE);}), }, {}, { @@ -65,7 +65,7 @@ void RegionTable_Init_GoronCity() { Entrance(RR_THE_LOST_WOODS, []{return true;}), }); - areaTable[RR_GC_DARUNIAS_CHAMBER] = Region("GC Darunias Chamber", "Goron City", {RA_GORON_CITY}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GC_DARUNIAS_CHAMBER] = Region("GC Darunias Chamber", SCENE_GORON_CITY, { //Events EventAccess(&logic->GoronCityChildFire, []{return logic->IsChild && logic->CanUse(RG_STICKS);}), }, { @@ -80,13 +80,13 @@ void RegionTable_Init_GoronCity() { Entrance(RR_DMC_LOWER_LOCAL, []{return logic->IsAdult;}), }); - areaTable[RR_GC_GROTTO_PLATFORM] = Region("GC Grotto Platform", "Goron City", {RA_GORON_CITY}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GC_GROTTO_PLATFORM] = Region("GC Grotto Platform", SCENE_GORON_CITY, {}, {}, { //Exits Entrance(RR_GC_GROTTO, []{return true;}), Entrance(RR_GORON_CITY, []{return logic->EffectiveHealth() > 2 || logic->CanUse(RG_GORON_TUNIC) || logic->CanUse(RG_NAYRUS_LOVE) || ((logic->IsChild || logic->CanUse(RG_SONG_OF_TIME)) && logic->CanUse(RG_LONGSHOT));}), }); - areaTable[RR_GC_SHOP] = Region("GC Shop", "GC Shop", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GC_SHOP] = Region("GC Shop", SCENE_GORON_SHOP, {}, { //Locations LOCATION(RC_GC_SHOP_ITEM_1, true), LOCATION(RC_GC_SHOP_ITEM_2, true), @@ -101,7 +101,7 @@ void RegionTable_Init_GoronCity() { Entrance(RR_GORON_CITY, []{return true;}), }); - areaTable[RR_GC_GROTTO] = Region("GC Grotto", "GC Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GC_GROTTO] = Region("GC Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_GC_DEKU_SCRUB_GROTTO_LEFT, logic->CanStunDeku()), LOCATION(RC_GC_DEKU_SCRUB_GROTTO_RIGHT, logic->CanStunDeku()), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp index 046b5334c..763d12575 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/graveyard.cpp @@ -5,7 +5,7 @@ using namespace Rando; void RegionTable_Init_Graveyard() { // clang-format off - areaTable[RR_THE_GRAVEYARD] = Region("The Graveyard", "The Graveyard", {RA_THE_GRAVEYARD}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_THE_GRAVEYARD] = Region("The Graveyard", SCENE_GRAVEYARD, { //Events EventAccess(&logic->ButterflyFairy, []{return logic->CanUse(RG_STICKS) && logic->AtDay;}), EventAccess(&logic->BeanPlantFairy, []{return logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS);}), @@ -43,7 +43,7 @@ void RegionTable_Init_Graveyard() { Entrance(RR_GRAVEYARD_WARP_PAD_REGION, []{return false;}), }); - areaTable[RR_GRAVEYARD_SHIELD_GRAVE] = Region("Graveyard Shield Grave", "Graveyard Shield Grave", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GRAVEYARD_SHIELD_GRAVE] = Region("Graveyard Shield Grave", SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, {}, { //Locations LOCATION(RC_GRAVEYARD_SHIELD_GRAVE_CHEST, true), }, { @@ -52,7 +52,7 @@ void RegionTable_Init_Graveyard() { Entrance(RR_GRAVEYARD_SHIELD_GRAVE_BACK, []{return Here(RR_GRAVEYARD_SHIELD_GRAVE, []{return logic->CanBreakMudWalls();});}), }); - areaTable[RR_GRAVEYARD_SHIELD_GRAVE_BACK] = Region("Graveyard Shield Grave Back", "Graveyard Shield Grave", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GRAVEYARD_SHIELD_GRAVE_BACK] = Region("Graveyard Shield Grave Back", SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, {}, { //Locations LOCATION(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, true), LOCATION(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, true), @@ -67,7 +67,7 @@ void RegionTable_Init_Graveyard() { Entrance(RR_GRAVEYARD_SHIELD_GRAVE, []{return true;}), }); - areaTable[RR_GRAVEYARD_HEART_PIECE_GRAVE] = Region("Graveyard Heart Piece Grave", "Graveyard Heart Piece Grave", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GRAVEYARD_HEART_PIECE_GRAVE] = Region("Graveyard Heart Piece Grave", SCENE_REDEAD_GRAVE, {}, { //Locations LOCATION(RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, logic->CanUse(RG_SUNS_SONG)), }, { @@ -75,17 +75,17 @@ void RegionTable_Init_Graveyard() { Entrance(RR_THE_GRAVEYARD, []{return true;}), }); - areaTable[RR_GRAVEYARD_COMPOSERS_GRAVE] = Region("Graveyard Composers Grave", "Graveyard Composers Grave", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GRAVEYARD_COMPOSERS_GRAVE] = Region("Graveyard Composers Grave", SCENE_ROYAL_FAMILYS_TOMB, {}, { //Locations LOCATION(RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, logic->HasFireSource()), - LOCATION(RC_SONG_FROM_ROYAL_FAMILYS_TOMB, logic->CanUseProjectile() || logic->CanJumpslash()), + LOCATION(RC_SONG_FROM_ROYAL_FAMILYS_TOMB, logic->CanUseProjectile() || logic->CanJumpslash()), LOCATION(RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), }, { //Exits Entrance(RR_THE_GRAVEYARD, []{return true;}), }); - areaTable[RR_GRAVEYARD_DAMPES_GRAVE] = Region("Graveyard Dampes Grave", "Windmill and Dampes Grave", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GRAVEYARD_DAMPES_GRAVE] = Region("Graveyard Dampes Grave", SCENE_WINDMILL_AND_DAMPES_GRAVE, { //Events EventAccess(&logic->NutPot, []{return true;}), EventAccess(&logic->DampesWindmillAccess, []{return logic->IsAdult && logic->CanUse(RG_SONG_OF_TIME);}), @@ -113,7 +113,7 @@ void RegionTable_Init_Graveyard() { Entrance(RR_KAK_WINDMILL, []{return logic->IsAdult && logic->CanUse(RG_SONG_OF_TIME);}, false), }); - areaTable[RR_GRAVEYARD_DAMPES_HOUSE] = Region("Graveyard Dampes House", "Graveyard Dampes House", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_GRAVEYARD_DAMPES_HOUSE] = Region("Graveyard Dampes House", SCENE_GRAVEKEEPERS_HUT, {}, { //Locations LOCATION(RC_DAMPE_HINT, logic->IsAdult), }, { @@ -121,7 +121,7 @@ void RegionTable_Init_Graveyard() { Entrance(RR_THE_GRAVEYARD, []{return true;}), }); - areaTable[RR_GRAVEYARD_WARP_PAD_REGION] = Region("Graveyard Warp Pad Region", "Graveyard", {RA_THE_GRAVEYARD}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_GRAVEYARD_WARP_PAD_REGION] = Region("Graveyard Warp Pad Region", SCENE_GRAVEYARD, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairyExceptSuns();}), }, { diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp index a9b238292..930ffcb4f 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/haunted_wasteland.cpp @@ -5,18 +5,17 @@ using namespace Rando; void RegionTable_Init_HauntedWasteland() { // clang-format off - areaTable[RR_WASTELAND_NEAR_FORTRESS] = Region("Wasteland Near Fortress", "Haunted Wasteland", {RA_HAUNTED_WASTELAND}, NO_DAY_NIGHT_CYCLE, {}, + areaTable[RR_WASTELAND_NEAR_FORTRESS] = Region("Wasteland Near Fortress", SCENE_HAUNTED_WASTELAND, {}, { //Locations LOCATION(RC_HW_BEFORE_QUICKSAND_CRATE, logic->CanBreakCrates()), - }, - { + }, { //Exits Entrance(RR_GF_OUTSIDE_GATE, []{return true;}), Entrance(RR_HAUNTED_WASTELAND, []{return logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_LONGSHOT) || ctx->GetTrickOption(RT_HW_CROSSING);}), }); - areaTable[RR_HAUNTED_WASTELAND] = Region("Haunted Wasteland", "Haunted Wasteland", {RA_HAUNTED_WASTELAND}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_HAUNTED_WASTELAND] = Region("Haunted Wasteland", SCENE_HAUNTED_WASTELAND, { //Events EventAccess(&logic->FairyPot, []{return true;}), EventAccess(&logic->NutPot, []{return true;}), @@ -39,12 +38,10 @@ void RegionTable_Init_HauntedWasteland() { Entrance(RR_WASTELAND_NEAR_FORTRESS, []{return logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_LONGSHOT) || ctx->GetTrickOption(RT_HW_CROSSING);}), }); - areaTable[RR_WASTELAND_NEAR_COLOSSUS] = Region("Wasteland Near Colossus", "Haunted Wasteland", {RA_HAUNTED_WASTELAND}, NO_DAY_NIGHT_CYCLE, {}, - { + areaTable[RR_WASTELAND_NEAR_COLOSSUS] = Region("Wasteland Near Colossus", SCENE_HAUNTED_WASTELAND, {}, { //Locations LOCATION(RC_HW_NEAR_COLOSSUS_CRATE, logic->CanBreakCrates()), - }, - { + }, { //Exits Entrance(RR_DESERT_COLOSSUS, []{return true;}), Entrance(RR_HAUNTED_WASTELAND, []{return ctx->GetTrickOption(RT_HW_REVERSE) || false;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp index add3a2f86..9ee999914 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp @@ -5,7 +5,7 @@ using namespace Rando; void RegionTable_Init_HyruleField() { // clang-format off - areaTable[RR_HYRULE_FIELD] = Region("Hyrule Field", "Hyrule Field", {RA_HYRULE_FIELD}, DAY_NIGHT_CYCLE, { + areaTable[RR_HYRULE_FIELD] = Region("Hyrule Field", SCENE_HYRULE_FIELD, { //Events EventAccess(&logic->BigPoeKill, []{return logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_EPONA) && logic->HasBottle();}), }, { @@ -80,7 +80,7 @@ void RegionTable_Init_HyruleField() { Entrance(RR_HF_TEKTITE_GROTTO, []{return logic->CanOpenBombGrotto();}), }); - areaTable[RR_HF_SOUTHEAST_GROTTO] = Region("HF Southeast Grotto", "HF Southeast Grotto", {}, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_HF_SOUTHEAST_GROTTO] = Region("HF Southeast Grotto", SCENE_GROTTOS, grottoEvents, { //Locations LOCATION(RC_HF_SOUTHEAST_GROTTO_CHEST, true), LOCATION(RC_HF_SOUTHEAST_GROTTO_FISH, logic->HasBottle()), @@ -98,7 +98,7 @@ void RegionTable_Init_HyruleField() { Entrance(RR_HYRULE_FIELD, []{return true;}), }); - areaTable[RR_HF_OPEN_GROTTO] = Region("HF Open Grotto", "HF Open Grotto", {}, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_HF_OPEN_GROTTO] = Region("HF Open Grotto", SCENE_GROTTOS, grottoEvents, { //Locations LOCATION(RC_HF_OPEN_GROTTO_CHEST, true), LOCATION(RC_HF_OPEN_GROTTO_FISH, logic->HasBottle()), @@ -116,7 +116,7 @@ void RegionTable_Init_HyruleField() { Entrance(RR_HYRULE_FIELD, []{return true;}), }); - areaTable[RR_HF_INSIDE_FENCE_GROTTO] = Region("HF Inside Fence Grotto", "HF Inside Fence Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_HF_INSIDE_FENCE_GROTTO] = Region("HF Inside Fence Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_HF_DEKU_SCRUB_GROTTO, logic->CanStunDeku()), LOCATION(RC_HF_INSIDE_FENCE_GROTTO_BEEHIVE, logic->CanBreakLowerBeehives()), @@ -126,13 +126,13 @@ void RegionTable_Init_HyruleField() { Entrance(RR_HYRULE_FIELD, []{return true;}), }); - areaTable[RR_HF_COW_GROTTO] = Region("HF Cow Grotto", "HF Cow Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_HF_COW_GROTTO] = Region("HF Cow Grotto", SCENE_GROTTOS, {}, {}, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}), Entrance(RR_HF_COW_GROTTO_BEHIND_WEBS, []{return logic->HasFireSource();}), }); - areaTable[RR_HF_COW_GROTTO_BEHIND_WEBS] = Region("HF Cow Grotto Behind Webs", "HF Cow Grotto", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_HF_COW_GROTTO_BEHIND_WEBS] = Region("HF Cow Grotto Behind Webs", SCENE_GROTTOS, { //Events EventAccess(&logic->BugShrub, []{return logic->CanCutShrubs();}), EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairy();}), @@ -152,7 +152,7 @@ void RegionTable_Init_HyruleField() { Entrance(RR_HF_COW_GROTTO, []{return true;}), }); - areaTable[RR_HF_NEAR_MARKET_GROTTO] = Region("HF Near Market Grotto", "HF Near Market Grotto", {}, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_HF_NEAR_MARKET_GROTTO] = Region("HF Near Market Grotto", SCENE_GROTTOS, grottoEvents, { //Locations LOCATION(RC_HF_NEAR_MARKET_GROTTO_CHEST, true), LOCATION(RC_HF_NEAR_MARKET_GROTTO_FISH, logic->HasBottle()), @@ -170,7 +170,7 @@ void RegionTable_Init_HyruleField() { Entrance(RR_HYRULE_FIELD, []{return true;}), }); - areaTable[RR_HF_FAIRY_GROTTO] = Region("HF Fairy Grotto", "HF Fairy Grotto", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_HF_FAIRY_GROTTO] = Region("HF Fairy Grotto", SCENE_GROTTOS, { //Events EventAccess(&logic->FreeFairies, []{return true;}), }, { @@ -188,7 +188,7 @@ void RegionTable_Init_HyruleField() { Entrance(RR_HYRULE_FIELD, []{return true;}), }); - areaTable[RR_HF_NEAR_KAK_GROTTO] = Region("HF Near Kak Grotto", "HF Near Kak Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_HF_NEAR_KAK_GROTTO] = Region("HF Near Kak Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_HF_GS_NEAR_KAK_GROTTO, logic->HookshotOrBoomerang()), }, { @@ -196,7 +196,7 @@ void RegionTable_Init_HyruleField() { Entrance(RR_HYRULE_FIELD, []{return true;}), }); - areaTable[RR_HF_TEKTITE_GROTTO] = Region("HF Tektite Grotto", "HF Tektite Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_HF_TEKTITE_GROTTO] = Region("HF Tektite Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_HF_TEKTITE_GROTTO_FREESTANDING_POH, logic->HasItem(RG_GOLDEN_SCALE) || logic->CanUse(RG_IRON_BOOTS)), }, { diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp index c5ac0c02c..13490c9a4 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kakariko.cpp @@ -5,7 +5,7 @@ using namespace Rando; void RegionTable_Init_Kakariko() { // clang-format off - areaTable[RR_KAKARIKO_VILLAGE] = Region("Kakariko Village", "Kakariko Village", {RA_KAKARIKO_VILLAGE}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_KAKARIKO_VILLAGE] = Region("Kakariko Village", SCENE_KAKARIKO_VILLAGE, { //Events EventAccess(&logic->BugRock, []{return true;}), //Open Gate setting is applied in RR_ROOT @@ -79,13 +79,13 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAK_BACKYARD, []{return logic->IsAdult || logic->AtDay;}), }); - areaTable[RR_KAK_IMPAS_LEDGE] = Region("Kak Impas Ledge", "Kakariko Village", {RA_KAKARIKO_VILLAGE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_KAK_IMPAS_LEDGE] = Region("Kak Impas Ledge", SCENE_KAKARIKO_VILLAGE, {}, {}, { //Exits Entrance(RR_KAK_IMPAS_HOUSE_BACK, []{return true;}), Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), }); - areaTable[RR_KAK_IMPAS_ROOFTOP] = Region("Kak Impas Rooftop", "Kakariko Village", {RA_KAKARIKO_VILLAGE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_IMPAS_ROOFTOP] = Region("Kak Impas Rooftop", SCENE_KAKARIKO_VILLAGE, {}, { //Locations LOCATION(RC_KAK_GS_ABOVE_IMPAS_HOUSE, logic->IsAdult && logic->CanGetNightTimeGS() && logic->CanKillEnemy(RE_GOLD_SKULLTULA)), }, { @@ -94,7 +94,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), }); - areaTable[RR_KAK_WATCHTOWER] = Region("Kak Watchtower", "Kakariko Village", {RA_KAKARIKO_VILLAGE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_WATCHTOWER] = Region("Kak Watchtower", SCENE_KAKARIKO_VILLAGE, {}, { //Locations //exists for when age change is in logic. LOCATION(RC_KAK_GS_WATCHTOWER, logic->IsChild && logic->CanUse(RG_DINS_FIRE) && logic->CanGetNightTimeGS()), @@ -104,7 +104,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAK_ROOFTOP, []{return ctx->GetTrickOption(RT_KAK_MAN_ON_ROOF) && logic->IsChild;}), }); - areaTable[RR_KAK_ROOFTOP] = Region("Kak Rooftop", "Kakariko Village", {RA_KAKARIKO_VILLAGE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_ROOFTOP] = Region("Kak Rooftop", SCENE_KAKARIKO_VILLAGE, {}, { //Locations LOCATION(RC_KAK_MAN_ON_ROOF, true), }, { @@ -113,7 +113,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), }); - areaTable[RR_KAK_BACKYARD] = Region("Kak Backyard", "Kakariko Village", {RA_KAKARIKO_VILLAGE}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_BACKYARD] = Region("Kak Backyard", SCENE_KAKARIKO_VILLAGE, {}, { //Locations //There's probably a trick to get these with rang from the main region LOCATION(RC_KAK_NEAR_MEDICINE_SHOP_POT_1, logic->IsChild && logic->CanBreakPots()), @@ -126,7 +126,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAK_POTION_SHOP_BACK, []{return logic->IsAdult && logic->AtDay && logic->CanOpenOverworldDoor(RG_KAK_POTION_SHOP_KEY);}), }); - areaTable[RR_KAK_CARPENTER_BOSS_HOUSE] = Region("Kak Carpenter Boss House", "Kak Carpenter Boss House", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_KAK_CARPENTER_BOSS_HOUSE] = Region("Kak Carpenter Boss House", SCENE_KAKARIKO_CENTER_GUEST_HOUSE, { //Events EventAccess(&logic->WakeUpAdultTalon, []{return logic->IsAdult && logic->CanUse(RG_POCKET_EGG);}), }, {}, { @@ -134,7 +134,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), }); - areaTable[RR_KAK_HOUSE_OF_SKULLTULA] = Region("Kak House of Skulltula", "Kak House of Skulltula", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_HOUSE_OF_SKULLTULA] = Region("Kak House of Skulltula", SCENE_HOUSE_OF_SKULLTULA, {}, { //Locations LOCATION(RC_KAK_10_GOLD_SKULLTULA_REWARD, logic->GetGSCount() >= 10), LOCATION(RC_KAK_20_GOLD_SKULLTULA_REWARD, logic->GetGSCount() >= 20), @@ -147,7 +147,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), }); - areaTable[RR_KAK_IMPAS_HOUSE] = Region("Kak Impas House", "Kak Impas House", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_IMPAS_HOUSE] = Region("Kak Impas House", SCENE_IMPAS_HOUSE, {}, { //Locations LOCATION(RC_KAK_IMPAS_HOUSE_COW, logic->CanUse(RG_EPONAS_SONG)), }, { @@ -155,7 +155,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), }); - areaTable[RR_KAK_IMPAS_HOUSE_BACK] = Region("Kak Impas House Back", "Kak Impas House", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_IMPAS_HOUSE_BACK] = Region("Kak Impas House Back", SCENE_IMPAS_HOUSE, {}, { //Locations LOCATION(RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, true), LOCATION(RC_KAK_IMPAS_HOUSE_COW, logic->CanUse(RG_EPONAS_SONG)), @@ -164,7 +164,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAK_IMPAS_LEDGE, []{return true;}), }); - areaTable[RR_KAK_WINDMILL] = Region("Kak Windmill", "Windmill and Dampes Grave", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_KAK_WINDMILL] = Region("Kak Windmill", SCENE_WINDMILL_AND_DAMPES_GRAVE, { //Events EventAccess(&logic->DrainWell, []{return logic->IsChild && logic->CanUse(RG_SONG_OF_STORMS);}), }, { @@ -176,7 +176,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), }); - areaTable[RR_KAK_BAZAAR] = Region("Kak Bazaar", "Kak Bazaar", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_BAZAAR] = Region("Kak Bazaar", SCENE_BAZAAR, {}, { //Locations LOCATION(RC_KAK_BAZAAR_ITEM_1, true), LOCATION(RC_KAK_BAZAAR_ITEM_2, true), @@ -191,7 +191,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), }); - areaTable[RR_KAK_SHOOTING_GALLERY] = Region("Kak Shooting Gallery", "Kak Shooting Gallery", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_SHOOTING_GALLERY] = Region("Kak Shooting Gallery", SCENE_SHOOTING_GALLERY, {}, { //Locations LOCATION(RC_KAK_SHOOTING_GALLERY_REWARD, logic->HasItem(RG_CHILD_WALLET) && logic->IsAdult && logic->CanUse(RG_FAIRY_BOW)), }, { @@ -199,7 +199,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), }); - areaTable[RR_KAK_POTION_SHOP_FRONT] = Region("Kak Potion Shop Front", "Kak Potion Shop", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_POTION_SHOP_FRONT] = Region("Kak Potion Shop Front", SCENE_POTION_SHOP_KAKARIKO, {}, { //Locations LOCATION(RC_KAK_POTION_SHOP_ITEM_1, logic->IsAdult), LOCATION(RC_KAK_POTION_SHOP_ITEM_2, logic->IsAdult), @@ -215,13 +215,13 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAK_POTION_SHOP_BACK, []{return logic->IsAdult;}), }); - areaTable[RR_KAK_POTION_SHOP_BACK] = Region("Kak Potion Shop Back", "Kak Potion Shop", {}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_KAK_POTION_SHOP_BACK] = Region("Kak Potion Shop Back", SCENE_POTION_SHOP_KAKARIKO, {}, {}, { //Exits Entrance(RR_KAK_BACKYARD, []{return logic->IsAdult;}), Entrance(RR_KAK_POTION_SHOP_FRONT, []{return true;}), }); - areaTable[RR_KAK_ODD_POTION_BUILDING] = Region("Kak Granny's Potion Shop", "Kak Granny's Potion Shop", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_KAK_ODD_POTION_BUILDING] = Region("Kak Granny's Potion Shop", SCENE_POTION_SHOP_GRANNY, { //Events // RANDOTODO blue pot access }, { @@ -233,7 +233,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAK_BACKYARD, []{return true;}), }); - areaTable[RR_KAK_REDEAD_GROTTO] = Region("Kak Redead Grotto", "Kak Redead Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KAK_REDEAD_GROTTO] = Region("Kak Redead Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_KAK_REDEAD_GROTTO_CHEST, logic->CanKillEnemy(RE_REDEAD, ED_CLOSE, true, 2)), }, { @@ -241,7 +241,7 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAKARIKO_VILLAGE, []{return true;}), }); - areaTable[RR_KAK_OPEN_GROTTO] = Region("Kak Open Grotto", "Kak Open Grotto", {}, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_KAK_OPEN_GROTTO] = Region("Kak Open Grotto", SCENE_GROTTOS, grottoEvents, { //Locations LOCATION(RC_KAK_OPEN_GROTTO_CHEST, true), LOCATION(RC_KAK_OPEN_GROTTO_FISH, logic->HasBottle()), @@ -259,13 +259,13 @@ void RegionTable_Init_Kakariko() { Entrance(RR_KAK_BACKYARD, []{return true;}), }); - areaTable[RR_KAK_BEHIND_GATE] = Region("Kak Behind Gate", "Kakariko Village", {RA_KAKARIKO_VILLAGE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_KAK_BEHIND_GATE] = Region("Kak Behind Gate", SCENE_KAKARIKO_VILLAGE, {}, {}, { //Exits Entrance(RR_KAKARIKO_VILLAGE, []{return logic->IsAdult || ctx->GetTrickOption(RT_VISIBLE_COLLISION) || logic->KakarikoVillageGateOpen;}), Entrance(RR_DEATH_MOUNTAIN_TRAIL, []{return true;}), }); - areaTable[RR_KAK_WELL] = Region("Kak Well", "Kakariko Village", {RA_KAKARIKO_VILLAGE}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_KAK_WELL] = Region("Kak Well", SCENE_KAKARIKO_VILLAGE, {}, {}, { //Exits Entrance(RR_KAKARIKO_VILLAGE, []{return logic->IsAdult || logic->HasItem(RG_BRONZE_SCALE) || logic->DrainWell;}), Entrance(RR_BOTTOM_OF_THE_WELL_ENTRYWAY, []{return logic->IsChild || (logic->DrainWell && ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).IsNot(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF));}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp index 06bdcc268..525e22200 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/kokiri_forest.cpp @@ -5,7 +5,7 @@ using namespace Rando; void RegionTable_Init_KokiriForest() { // clang-format off - areaTable[RR_KOKIRI_FOREST] = Region("Kokiri Forest", "Kokiri Forest", {RA_KOKIRI_FOREST}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_KOKIRI_FOREST] = Region("Kokiri Forest", SCENE_KOKIRI_FOREST, { //Events EventAccess(&logic->BeanPlantFairy, []{return logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS);}), EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairyExceptSuns();}), @@ -89,7 +89,7 @@ void RegionTable_Init_KokiriForest() { Entrance(RR_KF_STORMS_GROTTO, []{return logic->CanOpenStormsGrotto();}), }); - areaTable[RR_KF_OUTSIDE_DEKU_TREE] = Region("KF Outside Deku Tree", "Kokiri Forest", {RA_KOKIRI_FOREST}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_KF_OUTSIDE_DEKU_TREE] = Region("KF Outside Deku Tree", SCENE_KOKIRI_FOREST, { //Events EventAccess(&logic->DekuBabaSticks, []{return logic->CanGetDekuBabaSticks();}), EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), @@ -108,7 +108,7 @@ void RegionTable_Init_KokiriForest() { Entrance(RR_KOKIRI_FOREST, []{return (logic->IsAdult && (logic->CanPassEnemy(RE_BIG_SKULLTULA) || logic->ForestTempleClear)) || ctx->GetOption(RSK_FOREST).Is(RO_CLOSED_FOREST_OFF) || logic->ShowedMidoSwordAndShield;}), }); - areaTable[RR_KF_LINKS_HOUSE] = Region("KF Link's House", "KF Link's House", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KF_LINKS_HOUSE] = Region("KF Link's House", SCENE_LINKS_HOUSE, {}, { //Locations LOCATION(RC_KF_LINKS_HOUSE_COW, logic->IsAdult && logic->CanUse(RG_EPONAS_SONG) && logic->LinksCow), LOCATION(RC_KF_LINKS_HOUSE_POT, logic->CanBreakPots()), @@ -117,7 +117,7 @@ void RegionTable_Init_KokiriForest() { Entrance(RR_KOKIRI_FOREST, []{return true;}) }); - areaTable[RR_KF_MIDOS_HOUSE] = Region("KF Mido's House", "KF Mido's House", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KF_MIDOS_HOUSE] = Region("KF Mido's House", SCENE_MIDOS_HOUSE, {}, { //Locations LOCATION(RC_KF_MIDOS_TOP_LEFT_CHEST, true), LOCATION(RC_KF_MIDOS_TOP_RIGHT_CHEST, true), @@ -128,7 +128,7 @@ void RegionTable_Init_KokiriForest() { Entrance(RR_KOKIRI_FOREST, []{return true;}), }); - areaTable[RR_KF_SARIAS_HOUSE] = Region("KF Saria's House", "KF Saria's House", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KF_SARIAS_HOUSE] = Region("KF Saria's House", SCENE_SARIAS_HOUSE, {}, { //Locations LOCATION(RC_KF_SARIAS_TOP_LEFT_HEART, true), LOCATION(RC_KF_SARIAS_TOP_RIGHT_HEART, true), @@ -139,7 +139,7 @@ void RegionTable_Init_KokiriForest() { Entrance(RR_KOKIRI_FOREST, []{return true;}), }); - areaTable[RR_KF_HOUSE_OF_TWINS] = Region("KF House of Twins", "KF House of Twins", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KF_HOUSE_OF_TWINS] = Region("KF House of Twins", SCENE_TWINS_HOUSE, {}, { //Locations LOCATION(RC_KF_TWINS_HOUSE_POT_1, logic->CanBreakPots()), LOCATION(RC_KF_TWINS_HOUSE_POT_2, logic->CanBreakPots()), @@ -148,7 +148,7 @@ void RegionTable_Init_KokiriForest() { Entrance(RR_KOKIRI_FOREST, []{return true;}), }); - areaTable[RR_KF_KNOW_IT_ALL_HOUSE] = Region("KF Know It All House", "KF Know It All House", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KF_KNOW_IT_ALL_HOUSE] = Region("KF Know It All House", SCENE_KNOW_IT_ALL_BROS_HOUSE, {}, { // Locations LOCATION(RC_KF_BROTHERS_HOUSE_POT_1, logic->CanBreakPots()), LOCATION(RC_KF_BROTHERS_HOUSE_POT_2, logic->CanBreakPots()), @@ -157,7 +157,7 @@ void RegionTable_Init_KokiriForest() { Entrance(RR_KOKIRI_FOREST, []{return true;}), }); - areaTable[RR_KF_KOKIRI_SHOP] = Region("KF Kokiri Shop", "KF Kokiri Shop", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_KF_KOKIRI_SHOP] = Region("KF Kokiri Shop", SCENE_KOKIRI_SHOP, {}, { //Locations LOCATION(RC_KF_SHOP_ITEM_1, true), LOCATION(RC_KF_SHOP_ITEM_2, true), @@ -172,7 +172,7 @@ void RegionTable_Init_KokiriForest() { Entrance(RR_KOKIRI_FOREST, []{return true;}), }); - areaTable[RR_KF_STORMS_GROTTO] = Region("KF Storms Grotto", "KF Storms Grotto", {}, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_KF_STORMS_GROTTO] = Region("KF Storms Grotto", SCENE_GROTTOS, grottoEvents, { //Locations LOCATION(RC_KF_STORMS_GROTTO_CHEST, true), LOCATION(RC_KF_STORMS_GROTTO_FISH, logic->HasBottle()), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp index 96875975f..964b781ce 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lake_hylia.cpp @@ -5,7 +5,7 @@ using namespace Rando; void RegionTable_Init_LakeHylia() { // clang-format off - areaTable[RR_LAKE_HYLIA] = Region("Lake Hylia", "Lake Hylia", {RA_LAKE_HYLIA}, DAY_NIGHT_CYCLE, { + areaTable[RR_LAKE_HYLIA] = Region("Lake Hylia", SCENE_LAKE_HYLIA, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairy();}), EventAccess(&logic->BeanPlantFairy, []{return logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS);}), @@ -84,26 +84,38 @@ 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_FROM_SHORTCUT, []{return true;}), Entrance(RR_LH_OWL_FLIGHT, []{return logic->IsChild;}), 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)));}), + Entrance(RR_LH_FROM_WATER_TEMPLE, []{return true;}), Entrance(RR_LH_GROTTO, []{return true;}), }); - areaTable[RR_LH_FISHING_ISLAND] = Region("LH Fishing Island", "Lake Hylia", {RA_LAKE_HYLIA}, DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_LH_FROM_SHORTCUT] = Region("LH From Shortcut", SCENE_LAKE_HYLIA, TIME_DOESNT_PASS, {RA_LAKE_HYLIA}, {}, {}, { + //Exits + Entrance(RR_LAKE_HYLIA, []{return logic->Hearts() > 1 || logic->HasItem(RG_BOTTLE_WITH_FAIRY) || logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_IRON_BOOTS);}), + Entrance(RR_ZORAS_DOMAIN, []{return logic->IsChild && (logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS));}), + }); + + areaTable[RR_LH_FROM_WATER_TEMPLE] = Region("LH From Water Temple", SCENE_LAKE_HYLIA, TIME_DOESNT_PASS, {RA_LAKE_HYLIA}, {}, {}, { + //Exits + Entrance(RR_LAKE_HYLIA, []{return logic->HasItem(RG_BRONZE_SCALE) || logic->HasItem(RG_BOTTLE_WITH_FAIRY) || logic->CanUse(RG_IRON_BOOTS);}), + 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)));}), + }); + + areaTable[RR_LH_FISHING_ISLAND] = Region("LH Fishing Island", SCENE_LAKE_HYLIA, {}, {}, { //Exits Entrance(RR_LAKE_HYLIA, []{return logic->HasItem(RG_BRONZE_SCALE);}), Entrance(RR_LH_FISHING_POND, []{return logic->CanOpenOverworldDoor(RG_FISHING_HOLE_KEY);}), }); - areaTable[RR_LH_OWL_FLIGHT] = Region("LH Owl Flight", "Lake Hylia", {RA_LAKE_HYLIA}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_LH_OWL_FLIGHT] = Region("LH Owl Flight", SCENE_LAKE_HYLIA, {}, {}, { //Exits Entrance(RR_HYRULE_FIELD, []{return true;}, false), }); - areaTable[RR_LH_LAB] = Region("LH Lab", "LH Lab", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_LH_LAB] = Region("LH Lab", SCENE_LAKESIDE_LABORATORY, {}, { //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) && logic->HasItem(RG_BRONZE_SCALE))), LOCATION(RC_LH_TRADE_FROG, logic->IsAdult && logic->CanUse(RG_EYEBALL_FROG)), @@ -118,7 +130,7 @@ void RegionTable_Init_LakeHylia() { }); // TODO: should some of these helpers be done via events instead? - areaTable[RR_LH_FISHING_POND] = Region("LH Fishing Hole", "LH Fishing Hole", {}, DAY_NIGHT_CYCLE, {}, { + areaTable[RR_LH_FISHING_POND] = Region("LH Fishing Hole", SCENE_FISHING_POND, {}, { //Locations LOCATION(RC_LH_CHILD_FISHING, logic->CanUse(RG_FISHING_POLE) && logic->IsChild), LOCATION(RC_LH_CHILD_FISH_1, logic->CanUse(RG_FISHING_POLE) && (logic->IsChild || !ctx->GetOption(RSK_FISHSANITY_AGE_SPLIT))), @@ -162,7 +174,7 @@ void RegionTable_Init_LakeHylia() { Entrance(RR_LH_FISHING_ISLAND, []{return true;}), }); - areaTable[RR_LH_GROTTO] = Region("LH Grotto", "LH Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_LH_GROTTO] = Region("LH Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_LH_DEKU_SCRUB_GROTTO_LEFT, logic->CanStunDeku()), LOCATION(RC_LH_DEKU_SCRUB_GROTTO_RIGHT, logic->CanStunDeku()), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp index 0d5e90c70..c29a5924e 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lon_lon_ranch.cpp @@ -5,7 +5,7 @@ using namespace Rando; void RegionTable_Init_LonLonRanch() { // clang-format off - areaTable[RR_LON_LON_RANCH] = Region("Lon Lon Ranch", "Lon Lon Ranch", {RA_LON_LON_RANCH}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_LON_LON_RANCH] = Region("Lon Lon Ranch", SCENE_LON_LON_RANCH, { //Events EventAccess(&logic->FreedEpona, []{return (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->HasItem(RG_CHILD_WALLET) && logic->CanUse(RG_EPONAS_SONG) && logic->IsAdult && logic->AtDay;}), @@ -33,7 +33,7 @@ void RegionTable_Init_LonLonRanch() { Entrance(RR_LLR_GROTTO, []{return logic->IsChild;}), }); - areaTable[RR_LLR_TALONS_HOUSE] = Region("LLR Talons House", "LLR Talons House", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_LLR_TALONS_HOUSE] = Region("LLR Talons House", SCENE_LON_LON_BUILDINGS, {}, { //Locations LOCATION(RC_LLR_TALONS_CHICKENS, logic->HasItem(RG_CHILD_WALLET) && logic->IsChild && logic->AtDay && logic->HasItem(RG_ZELDAS_LETTER)), LOCATION(RC_LLR_TALONS_HOUSE_POT_1, logic->CanBreakPots()), @@ -44,7 +44,7 @@ void RegionTable_Init_LonLonRanch() { Entrance(RR_LON_LON_RANCH, []{return true;}), }); - areaTable[RR_LLR_STABLES] = Region("LLR Stables", "LLR Stables", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_LLR_STABLES] = Region("LLR Stables", SCENE_STABLE, {}, { //Locations LOCATION(RC_LLR_STABLES_LEFT_COW, logic->CanUse(RG_EPONAS_SONG)), LOCATION(RC_LLR_STABLES_RIGHT_COW, logic->CanUse(RG_EPONAS_SONG)), @@ -53,7 +53,7 @@ void RegionTable_Init_LonLonRanch() { Entrance(RR_LON_LON_RANCH, []{return true;}), }); - areaTable[RR_LLR_TOWER] = Region("LLR Tower", "LLR Tower", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_LLR_TOWER] = Region("LLR Tower", SCENE_LON_LON_BUILDINGS, {}, { //Locations LOCATION(RC_LLR_FREESTANDING_POH, logic->IsChild), LOCATION(RC_LLR_TOWER_LEFT_COW, logic->CanUse(RG_EPONAS_SONG)), @@ -63,7 +63,7 @@ void RegionTable_Init_LonLonRanch() { Entrance(RR_LON_LON_RANCH, []{return true;}), }); - areaTable[RR_LLR_GROTTO] = Region("LLR Grotto", "LLR Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_LLR_GROTTO] = Region("LLR Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_LLR_DEKU_SCRUB_GROTTO_LEFT, logic->CanStunDeku()), LOCATION(RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, logic->CanStunDeku()), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp index 56ad88df4..e949a7b1e 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/lost_woods.cpp @@ -5,12 +5,12 @@ using namespace Rando; void RegionTable_Init_LostWoods() { // clang-format off - areaTable[RR_LW_FOREST_EXIT] = Region("LW Forest Exit", "Lost Woods", {RA_THE_LOST_WOODS}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_LW_FOREST_EXIT] = Region("LW Forest Exit", SCENE_LOST_WOODS, {}, {}, { //Exits Entrance(RR_KOKIRI_FOREST, []{return true;}) }); - areaTable[RR_THE_LOST_WOODS] = Region("Lost Woods", "Lost Woods", {RA_THE_LOST_WOODS}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_THE_LOST_WOODS] = Region("Lost Woods", SCENE_LOST_WOODS, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairyExceptSuns();}), EventAccess(&logic->BeanPlantFairy, []{return logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS);}), @@ -57,12 +57,12 @@ void RegionTable_Init_LostWoods() { Entrance(RR_LW_FOREST_EXIT, []{return true;}), Entrance(RR_GC_WOODS_WARP, []{return true;}), Entrance(RR_LW_BRIDGE, []{return logic->CanLeaveForest() && ((logic->IsAdult && (CanPlantBean(RR_THE_LOST_WOODS) || ctx->GetTrickOption(RT_LW_BRIDGE))) || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_LONGSHOT));}), - Entrance(RR_ZORAS_RIVER, []{return logic->CanLeaveForest() && (logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS) || (ctx->GetTrickOption(RT_BOTTOM_OF_THE_WELL_NAVI_DIVE) && logic->IsChild && logic->HasItem(RG_BRONZE_SCALE) && logic->CanJumpslash()));}), + Entrance(RR_ZR_FROM_SHORTCUT, []{return logic->CanLeaveForest() && (logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS) || (ctx->GetTrickOption(RT_LOST_WOOD_NAVI_DIVE) && logic->IsChild && logic->HasItem(RG_BRONZE_SCALE) && logic->CanJumpslash()));}), Entrance(RR_LW_BEYOND_MIDO, []{return logic->IsChild || logic->CanUse(RG_SARIAS_SONG) || ctx->GetTrickOption(RT_LW_MIDO_BACKFLIP);}), Entrance(RR_LW_NEAR_SHORTCUTS_GROTTO, []{return Here(RR_THE_LOST_WOODS, []{return logic->BlastOrSmash();});}), }); - areaTable[RR_LW_BEYOND_MIDO] = Region("LW Beyond Mido", "Lost Woods", {RA_THE_LOST_WOODS}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_LW_BEYOND_MIDO] = Region("LW Beyond Mido", SCENE_LOST_WOODS, { //Events EventAccess(&logic->ButterflyFairy, []{return logic->CanUse(RG_STICKS);}), }, { @@ -90,7 +90,7 @@ void RegionTable_Init_LostWoods() { Entrance(RR_LW_SCRUBS_GROTTO, []{return Here(RR_LW_BEYOND_MIDO, []{return logic->BlastOrSmash();});}), }); - areaTable[RR_LW_NEAR_SHORTCUTS_GROTTO] = Region("LW Near Shortcuts Grotto", "LW Near Shortcuts Grotto", {}, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_LW_NEAR_SHORTCUTS_GROTTO] = Region("LW Near Shortcuts Grotto", SCENE_GROTTOS, grottoEvents, { //Locations LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, true), LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_FISH, logic->HasBottle()), @@ -108,7 +108,7 @@ void RegionTable_Init_LostWoods() { Entrance(RR_THE_LOST_WOODS, []{return true;}), }); - areaTable[RR_DEKU_THEATER] = Region("Deku Theater", "Deku Theater", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_DEKU_THEATER] = Region("Deku Theater", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_DEKU_THEATER_SKULL_MASK, logic->IsChild && logic->SkullMask), LOCATION(RC_DEKU_THEATER_MASK_OF_TRUTH, logic->IsChild && logic->MaskOfTruth), @@ -117,7 +117,7 @@ void RegionTable_Init_LostWoods() { Entrance(RR_LW_BEYOND_MIDO, []{return true;}), }); - areaTable[RR_LW_SCRUBS_GROTTO] = Region("LW Scrubs Grotto", "LW Scrubs Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_LW_SCRUBS_GROTTO] = Region("LW Scrubs Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_LW_DEKU_SCRUB_GROTTO_REAR, logic->CanStunDeku()), LOCATION(RC_LW_DEKU_SCRUB_GROTTO_FRONT, logic->CanStunDeku()), @@ -128,7 +128,7 @@ void RegionTable_Init_LostWoods() { Entrance(RR_LW_BEYOND_MIDO, []{return true;}), }); - areaTable[RR_LW_BRIDGE_FROM_FOREST] = Region("LW Bridge From Forest", "Lost Woods", {RA_THE_LOST_WOODS}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_LW_BRIDGE_FROM_FOREST] = Region("LW Bridge From Forest", SCENE_LOST_WOODS, {}, { //Locations LOCATION(RC_LW_GIFT_FROM_SARIA, true), }, { @@ -136,7 +136,7 @@ void RegionTable_Init_LostWoods() { Entrance(RR_LW_BRIDGE, []{return true;}), }); - areaTable[RR_LW_BRIDGE] = Region("LW Bridge", "Lost Woods", {RA_THE_LOST_WOODS}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_LW_BRIDGE] = Region("LW Bridge", SCENE_LOST_WOODS, {}, {}, { //Exits Entrance(RR_KOKIRI_FOREST, []{return true;}), Entrance(RR_HYRULE_FIELD, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp index dc6058832..7d7655ef0 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/market.cpp @@ -5,14 +5,14 @@ using namespace Rando; void RegionTable_Init_Market() { // clang-format off - areaTable[RR_MARKET_ENTRANCE] = Region("Market Entrance", "Market Entrance", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_MARKET_ENTRANCE] = Region("Market Entrance", SCENE_MARKET_ENTRANCE_DAY, {}, {}, { //Exits Entrance(RR_HYRULE_FIELD, []{return logic->IsAdult || logic->AtDay;}), Entrance(RR_THE_MARKET, []{return true;}), Entrance(RR_MARKET_GUARD_HOUSE, []{return logic->CanOpenOverworldDoor(RG_GUARD_HOUSE_KEY);}), }); - areaTable[RR_THE_MARKET] = Region("Market", "Market", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_THE_MARKET] = Region("Market", SCENE_MARKET_DAY, {}, { //Locations //RANDOTODO add item avalibility to regions to remove need to hardcode logic in limited item use situations LOCATION(RC_MARKET_GRASS_1, logic->IsChild && (logic->CanUseSword() || logic->HasItem(RG_GORONS_BRACELET))), @@ -41,7 +41,7 @@ void RegionTable_Init_Market() { Entrance(RR_MARKET_BACK_ALLEY, []{return logic->IsChild;}), }); - areaTable[RR_MARKET_BACK_ALLEY] = Region("Market Back Alley", "Market", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_MARKET_BACK_ALLEY] = Region("Market Back Alley", SCENE_BACK_ALLEY_DAY, {}, {}, { //Exits Entrance(RR_THE_MARKET, []{return true;}), Entrance(RR_MARKET_BOMBCHU_SHOP, []{return logic->AtNight && logic->CanOpenOverworldDoor(RG_BOMBCHU_SHOP_KEY);}), @@ -49,7 +49,7 @@ void RegionTable_Init_Market() { Entrance(RR_MARKET_MAN_IN_GREEN_HOUSE, []{return logic->AtNight && logic->CanOpenOverworldDoor(RG_ALLEY_HOUSE_KEY);}), }); - areaTable[RR_MARKET_GUARD_HOUSE] = Region("Market Guard House", "Market Guard House", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_MARKET_GUARD_HOUSE] = Region("Market Guard House", SCENE_MARKET_GUARD_HOUSE, { //Events EventAccess(&logic->CanEmptyBigPoes, []{return logic->IsAdult;}), }, { @@ -121,7 +121,7 @@ void RegionTable_Init_Market() { Entrance(RR_MARKET_ENTRANCE, []{return true;}), }); - areaTable[RR_MARKET_BAZAAR] = Region("Market Bazaar", "Market Bazaar", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_MARKET_BAZAAR] = Region("Market Bazaar", SCENE_BAZAAR, {}, { //Locations LOCATION(RC_MARKET_BAZAAR_ITEM_1, true), LOCATION(RC_MARKET_BAZAAR_ITEM_2, true), @@ -136,7 +136,7 @@ void RegionTable_Init_Market() { Entrance(RR_THE_MARKET, []{return true;}), }); - areaTable[RR_MARKET_MASK_SHOP] = Region("Market Mask Shop", "Market Mask Shop", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_MARKET_MASK_SHOP] = Region("Market Mask Shop", SCENE_HAPPY_MASK_SHOP, { //Events EventAccess(&logic->SkullMask, []{return 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->MaskOfTruth, []{return 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));}), @@ -148,7 +148,7 @@ void RegionTable_Init_Market() { Entrance(RR_THE_MARKET, []{return true;}), }); - areaTable[RR_MARKET_SHOOTING_GALLERY] = Region("Market Shooting Gallery", "Market Shooting Gallery", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_MARKET_SHOOTING_GALLERY] = Region("Market Shooting Gallery", SCENE_SHOOTING_GALLERY, {}, { //Locations LOCATION(RC_MARKET_SHOOTING_GALLERY_REWARD, logic->IsChild && logic->HasItem(RG_CHILD_WALLET)), }, { @@ -156,7 +156,7 @@ void RegionTable_Init_Market() { Entrance(RR_THE_MARKET, []{return true;}), }); - areaTable[RR_MARKET_BOMBCHU_BOWLING] = Region("Market Bombchu Bowling", "Market Bombchu Bowling", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_MARKET_BOMBCHU_BOWLING] = Region("Market Bombchu Bowling", SCENE_BOMBCHU_BOWLING_ALLEY, { //Events EventAccess(&logic->CouldPlayBowling, []{return (logic->HasItem(RG_CHILD_WALLET));}), }, { @@ -168,7 +168,7 @@ void RegionTable_Init_Market() { Entrance(RR_THE_MARKET, []{return true;}), }); - areaTable[RR_MARKET_POTION_SHOP] = Region("Market Potion Shop", "Market Potion Shop", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_MARKET_POTION_SHOP] = Region("Market Potion Shop", SCENE_POTION_SHOP_MARKET, {}, { //Locations LOCATION(RC_MARKET_POTION_SHOP_ITEM_1, true), LOCATION(RC_MARKET_POTION_SHOP_ITEM_2, true), @@ -183,7 +183,7 @@ void RegionTable_Init_Market() { Entrance(RR_THE_MARKET, []{return true;}), }); - areaTable[RR_MARKET_TREASURE_CHEST_GAME] = Region("Market Treasure Chest Game", "Market Treasure Chest Game", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_MARKET_TREASURE_CHEST_GAME] = Region("Market Treasure Chest Game", SCENE_TREASURE_BOX_SHOP, {}, { //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)))), @@ -202,7 +202,7 @@ void RegionTable_Init_Market() { Entrance(RR_THE_MARKET, []{return true;}), }); - areaTable[RR_MARKET_BOMBCHU_SHOP] = Region("Market Bombchu Shop", "Market Bombchu Shop", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_MARKET_BOMBCHU_SHOP] = Region("Market Bombchu Shop", SCENE_BOMBCHU_SHOP, {}, { //Locations LOCATION(RC_MARKET_BOMBCHU_SHOP_ITEM_1, true), LOCATION(RC_MARKET_BOMBCHU_SHOP_ITEM_2, true), @@ -217,7 +217,7 @@ void RegionTable_Init_Market() { Entrance(RR_MARKET_BACK_ALLEY, []{return true;}), }); - areaTable[RR_MARKET_DOG_LADY_HOUSE] = Region("Market Dog Lady House", "Market Dog Lady House", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_MARKET_DOG_LADY_HOUSE] = Region("Market Dog Lady House", SCENE_DOG_LADY_HOUSE, {}, { //Locations LOCATION(RC_MARKET_LOST_DOG, logic->IsChild && logic->AtNight), LOCATION(RC_MK_LOST_DOG_HOUSE_CRATE, logic->CanBreakCrates()), @@ -226,7 +226,7 @@ void RegionTable_Init_Market() { Entrance(RR_MARKET_BACK_ALLEY, []{return true;}), }); - areaTable[RR_MARKET_MAN_IN_GREEN_HOUSE] = Region("Market Man in Green House", "Market Man in Green House", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_MARKET_MAN_IN_GREEN_HOUSE] = Region("Market Man in Green House", SCENE_BACK_ALLEY_HOUSE, {}, { // Locations LOCATION(RC_MK_BACK_ALLEY_HOUSE_POT_1, logic->CanBreakPots()), LOCATION(RC_MK_BACK_ALLEY_HOUSE_POT_2, logic->CanBreakPots()), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/sacred_forest_meadow.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/sacred_forest_meadow.cpp index 9df62afd7..9d641ac98 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/sacred_forest_meadow.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/sacred_forest_meadow.cpp @@ -5,14 +5,14 @@ using namespace Rando; void RegionTable_Init_SacredForestMeadow() { // clang-format off - areaTable[RR_SFM_ENTRYWAY] = Region("SFM Entryway", "Sacred Forest Meadow", {RA_SACRED_FOREST_MEADOW}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_SFM_ENTRYWAY] = Region("SFM Entryway", SCENE_SACRED_FOREST_MEADOW, {}, {}, { //Exits Entrance(RR_LW_BEYOND_MIDO, []{return true;}), Entrance(RR_SACRED_FOREST_MEADOW, []{return logic->IsAdult || logic->CanKillEnemy(RE_WOLFOS);}), Entrance(RR_SFM_WOLFOS_GROTTO, []{return logic->CanOpenBombGrotto();}), }); - areaTable[RR_SACRED_FOREST_MEADOW] = Region("Sacred Forest Meadow", "Sacred Forest Meadow", {RA_SACRED_FOREST_MEADOW}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SACRED_FOREST_MEADOW] = Region("Sacred Forest Meadow", SCENE_SACRED_FOREST_MEADOW, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairyExceptSuns();}), }, { @@ -37,7 +37,7 @@ void RegionTable_Init_SacredForestMeadow() { Entrance(RR_SFM_STORMS_GROTTO, []{return logic->CanOpenStormsGrotto();}), }); - areaTable[RR_SFM_FAIRY_GROTTO] = Region("SFM Fairy Grotto", "SFM Fairy Grotto", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_SFM_FAIRY_GROTTO] = Region("SFM Fairy Grotto", SCENE_GROTTOS, { //Events EventAccess(&logic->FreeFairies, []{return true;}), }, { @@ -55,7 +55,7 @@ void RegionTable_Init_SacredForestMeadow() { Entrance(RR_SACRED_FOREST_MEADOW, []{return true;}), }); - areaTable[RR_SFM_WOLFOS_GROTTO] = Region("SFM Wolfos Grotto", "SFM Wolfos Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SFM_WOLFOS_GROTTO] = Region("SFM Wolfos Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_SFM_WOLFOS_GROTTO_CHEST, logic->CanKillEnemy(RE_WOLFOS, ED_CLOSE, true, 2)), }, { @@ -63,7 +63,7 @@ void RegionTable_Init_SacredForestMeadow() { Entrance(RR_SFM_ENTRYWAY, []{return true;}), }); - areaTable[RR_SFM_STORMS_GROTTO] = Region("SFM Storms Grotto", "SFM Storms Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_SFM_STORMS_GROTTO] = Region("SFM Storms Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_SFM_DEKU_SCRUB_GROTTO_REAR, logic->CanStunDeku()), LOCATION(RC_SFM_DEKU_SCRUB_GROTTO_FRONT, logic->CanStunDeku()), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/temple_of_time.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/temple_of_time.cpp index be2d8e33f..07efc4326 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/temple_of_time.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/temple_of_time.cpp @@ -5,7 +5,7 @@ using namespace Rando; void RegionTable_Init_TempleOfTime() { // clang-format off - areaTable[RR_TOT_ENTRANCE] = Region("ToT Entrance", "ToT Entrance", {RA_THE_MARKET}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_TOT_ENTRANCE] = Region("ToT Entrance", SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairyExceptSuns();}), }, { @@ -28,7 +28,7 @@ void RegionTable_Init_TempleOfTime() { Entrance(RR_TEMPLE_OF_TIME, []{return true;}), }); - areaTable[RR_TEMPLE_OF_TIME] = Region("Temple of Time", "Temple of Time", {RA_TEMPLE_OF_TIME}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_TEMPLE_OF_TIME] = Region("Temple of Time", SCENE_TEMPLE_OF_TIME, {}, { //Locations LOCATION(RC_TOT_LIGHT_ARROWS_CUTSCENE, logic->IsAdult && logic->CanTriggerLACS()), LOCATION(RC_ALTAR_HINT_CHILD, logic->IsChild), @@ -40,7 +40,7 @@ void RegionTable_Init_TempleOfTime() { Entrance(RR_TOT_BEYOND_DOOR_OF_TIME, []{return ctx->GetOption(RSK_DOOR_OF_TIME).Is(RO_DOOROFTIME_OPEN) || (logic->CanUse(RG_SONG_OF_TIME) && (ctx->GetOption(RSK_DOOR_OF_TIME).Is(RO_DOOROFTIME_SONGONLY) || (logic->StoneCount() == 3 && logic->HasItem(RG_OCARINA_OF_TIME))));}), }); - areaTable[RR_TOT_BEYOND_DOOR_OF_TIME] = Region("Beyond Door of Time", "Beyond Door of Time", {RA_TEMPLE_OF_TIME}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_TOT_BEYOND_DOOR_OF_TIME] = Region("Beyond Door of Time", SCENE_TEMPLE_OF_TIME, { //Events //EventAccess(&logic->TimeTravel, []{return true;}), }, { diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp index 2e75be23a..3a626a2f9 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp @@ -5,7 +5,7 @@ using namespace Rando; void RegionTable_Init_ZorasDomain() { // clang-format off - areaTable[RR_ZORAS_DOMAIN] = Region("Zoras Domain", "Zoras Domain", {RA_ZORAS_DOMAIN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_ZORAS_DOMAIN] = Region("Zoras Domain", SCENE_ZORAS_DOMAIN, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairyExceptSuns();}), EventAccess(&logic->NutPot, []{return true;}), @@ -38,19 +38,19 @@ void RegionTable_Init_ZorasDomain() { }, { //Exits Entrance(RR_ZR_BEHIND_WATERFALL, []{return true;}), - Entrance(RR_LAKE_HYLIA, []{return logic->IsChild && (logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS));}), + Entrance(RR_LH_FROM_SHORTCUT, []{return logic->IsChild && (logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS));}), Entrance(RR_ZD_BEHIND_KING_ZORA, []{return logic->DeliverLetter || ctx->GetOption(RSK_ZORAS_FOUNTAIN).Is(RO_ZF_OPEN) || (ctx->GetOption(RSK_ZORAS_FOUNTAIN).Is(RO_ZF_CLOSED_CHILD) && logic->IsAdult) || (ctx->GetTrickOption(RT_ZD_KING_ZORA_SKIP) && logic->IsAdult);}), Entrance(RR_ZD_SHOP, []{return logic->IsChild || logic->BlueFire();}), Entrance(RR_ZORAS_DOMAIN_ISLAND, []{return true;}), }); - areaTable[RR_ZORAS_DOMAIN_ISLAND] = Region("Zoras Domain Island", "Zoras Domain", {RA_ZORAS_DOMAIN}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_ZORAS_DOMAIN_ISLAND] = Region("Zoras Domain Island", SCENE_ZORAS_DOMAIN, {}, {}, { //Exits Entrance(RR_ZORAS_DOMAIN, []{return logic->IsAdult || logic->HasItem(RG_BRONZE_SCALE);}), Entrance(RR_ZD_STORMS_GROTTO, []{return logic->CanOpenStormsGrotto();}), }); - areaTable[RR_ZD_BEHIND_KING_ZORA] = Region("ZD Behind King Zora", "Zoras Domain", {RA_ZORAS_DOMAIN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_ZD_BEHIND_KING_ZORA] = Region("ZD Behind King Zora", SCENE_ZORAS_DOMAIN, { //Events EventAccess(&logic->KingZoraThawed, []{return logic->IsAdult && logic->BlueFire();}), }, { @@ -62,7 +62,7 @@ void RegionTable_Init_ZorasDomain() { Entrance(RR_ZORAS_FOUNTAIN, []{return true;}), }); - areaTable[RR_ZD_SHOP] = Region("ZD Shop", "ZD Shop", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ZD_SHOP] = Region("ZD Shop", SCENE_ZORA_SHOP, {}, { //Locations LOCATION(RC_ZD_SHOP_ITEM_1, true), LOCATION(RC_ZD_SHOP_ITEM_2, true), @@ -77,7 +77,7 @@ void RegionTable_Init_ZorasDomain() { Entrance(RR_ZORAS_DOMAIN, []{return true;}), }); - areaTable[RR_ZD_STORMS_GROTTO] = Region("ZD Storms Grotto", "ZD Storms Grotto", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_ZD_STORMS_GROTTO] = Region("ZD Storms Grotto", SCENE_GROTTOS, { //Events EventAccess(&logic->FreeFairies, []{return true;}), }, { diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp index 9ab099625..cfd2125c1 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_fountain.cpp @@ -5,7 +5,7 @@ using namespace Rando; void RegionTable_Init_ZorasFountain() { // clang-format off - areaTable[RR_ZORAS_FOUNTAIN] = Region("Zoras Fountain", "Zoras Fountain", {RA_ZORAS_FOUNTAIN}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_ZORAS_FOUNTAIN] = Region("Zoras Fountain", SCENE_ZORAS_FOUNTAIN, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairyExceptSuns();}), EventAccess(&logic->ButterflyFairy, []{return logic->CanUse(RG_STICKS) && logic->AtDay;}), @@ -35,7 +35,7 @@ void RegionTable_Init_ZorasFountain() { Entrance(RR_ZF_GREAT_FAIRY_FOUNTAIN, []{return logic->HasExplosives() || (ctx->GetTrickOption(RT_ZF_GREAT_FAIRY_WITHOUT_EXPLOSIVES) && logic->CanUse(RG_MEGATON_HAMMER) && logic->CanUse(RG_SILVER_GAUNTLETS));}), }); - areaTable[RR_ZF_ICEBERGS] = Region("ZF Icebergs", "Zoras Fountain", {RA_ZORAS_FOUNTAIN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ZF_ICEBERGS] = Region("ZF Icebergs", SCENE_ZORAS_FOUNTAIN, {}, { //Locations LOCATION(RC_ZF_ICEBERG_FREESTANDING_POH, logic->IsAdult), }, { @@ -46,7 +46,7 @@ void RegionTable_Init_ZorasFountain() { Entrance(RR_ZF_LEDGE, []{return true;}), }); - areaTable[RR_ZF_LAKEBED] = Region("ZF Lakebed", "Zoras Fountain", {RA_ZORAS_FOUNTAIN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ZF_LAKEBED] = Region("ZF Lakebed", SCENE_ZORAS_FOUNTAIN, {}, { //Locations LOCATION(RC_ZF_BOTTOM_FREESTANDING_POH, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16), LOCATION(RC_ZF_BOTTOM_NORTH_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 16), @@ -72,7 +72,7 @@ void RegionTable_Init_ZorasFountain() { Entrance(RR_ZORAS_FOUNTAIN, []{return logic->HasItem(RG_BRONZE_SCALE);}), }); - areaTable[RR_ZF_LEDGE] = Region("ZF Ledge", "Zoras Fountain", {RA_ZORAS_FOUNTAIN}, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_ZF_LEDGE] = Region("ZF Ledge", SCENE_ZORAS_FOUNTAIN, {}, {}, { //Exits Entrance(RR_ZORAS_FOUNTAIN, []{return logic->HasItem(RG_BRONZE_SCALE);}), Entrance(RR_ZF_ICEBERGS, []{return logic->IsAdult;}), @@ -80,7 +80,7 @@ void RegionTable_Init_ZorasFountain() { Entrance(RR_ICE_CAVERN_ENTRYWAY, []{return true;}), }); - areaTable[RR_ZF_HIDDEN_CAVE] = Region("ZF Hidden Cave", "Zoras Fountain", {RA_ZORAS_FOUNTAIN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ZF_HIDDEN_CAVE] = Region("ZF Hidden Cave", SCENE_ZORAS_FOUNTAIN, {}, { //Locations LOCATION(RC_ZF_HIDDEN_CAVE_POT_1, logic->IsAdult && logic->CanBreakPots()), LOCATION(RC_ZF_HIDDEN_CAVE_POT_2, logic->IsAdult && logic->CanBreakPots()), @@ -92,7 +92,7 @@ void RegionTable_Init_ZorasFountain() { Entrance(RR_ZF_HIDDEN_LEDGE, []{return true;}), }); - areaTable[RR_ZF_HIDDEN_LEDGE] = Region("ZF Hidden Ledge", "Zoras Fountain", {RA_ZORAS_FOUNTAIN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ZF_HIDDEN_LEDGE] = Region("ZF Hidden Ledge", SCENE_ZORAS_FOUNTAIN, {}, { //Locations LOCATION(RC_ZF_GS_HIDDEN_CAVE, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOMB_THROW) && logic->CanGetNightTimeGS()), }, { @@ -102,7 +102,7 @@ void RegionTable_Init_ZorasFountain() { Entrance(RR_ZF_HIDDEN_CAVE, []{return true;}), }); - areaTable[RR_ZF_ROCK] = Region("ZF Rock", "Zoras Fountain", {RA_ZORAS_FOUNTAIN}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ZF_ROCK] = Region("ZF Rock", SCENE_ZORAS_FOUNTAIN, {}, { //Locations //Has a wonder item }, { @@ -110,7 +110,7 @@ void RegionTable_Init_ZorasFountain() { Entrance(RR_ZORAS_FOUNTAIN, []{return true;}), }); - areaTable[RR_ZF_GREAT_FAIRY_FOUNTAIN] = Region("ZF Great Fairy Fountain", "ZF Great Fairy Fountain", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ZF_GREAT_FAIRY_FOUNTAIN] = Region("ZF Great Fairy Fountain", SCENE_GREAT_FAIRYS_FOUNTAIN_SPELLS, {}, { //Locations LOCATION(RC_ZF_GREAT_FAIRY_REWARD, logic->CanUse(RG_ZELDAS_LULLABY)), }, { diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp index 212c61c70..5473ee2ca 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_river.cpp @@ -5,7 +5,7 @@ using namespace Rando; void RegionTable_Init_ZoraRiver() { // clang-format off - areaTable[RR_ZR_FRONT] = Region("ZR Front", "Zora River", {RA_ZORAS_RIVER}, DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ZR_FRONT] = Region("ZR Front", SCENE_ZORAS_RIVER, {}, { //Locations LOCATION(RC_ZR_GS_TREE, logic->IsChild && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_CLOSE)), LOCATION(RC_ZR_GRASS_1, logic->CanCutShrubs()), @@ -26,7 +26,7 @@ void RegionTable_Init_ZoraRiver() { Entrance(RR_HYRULE_FIELD, []{return true;}), }); - areaTable[RR_ZORAS_RIVER] = Region("Zora River", "Zora River", {RA_ZORAS_RIVER}, DAY_NIGHT_CYCLE, { + areaTable[RR_ZORAS_RIVER] = Region("Zora River", SCENE_ZORAS_RIVER, { //Events EventAccess(&logic->GossipStoneFairy, []{return logic->CallGossipFairy();}), EventAccess(&logic->BeanPlantFairy, []{return logic->IsChild && logic->CanUse(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS);}), @@ -71,13 +71,19 @@ void RegionTable_Init_ZoraRiver() { Entrance(RR_ZR_BEHIND_WATERFALL, []{return ctx->GetOption(RSK_SLEEPING_WATERFALL).Is(RO_WATERFALL_OPEN) || Here(RR_ZORAS_RIVER, []{return logic->CanUse(RG_ZELDAS_LULLABY);}) || (logic->IsChild && ctx->GetTrickOption(RT_ZR_CUCCO)) || (logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS) && ctx->GetTrickOption(RT_ZR_HOVERS));}), }); - areaTable[RR_ZR_BEHIND_WATERFALL] = Region("ZR Behind Waterfall", "Zora River", {RA_ZORAS_RIVER}, DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_ZR_FROM_SHORTCUT] = Region("ZR From Shortcut", SCENE_ZORAS_RIVER, TIME_DOESNT_PASS, {RA_ZORAS_RIVER}, {}, {}, { + //Exits + Entrance(RR_ZORAS_RIVER, []{return logic->Hearts() > 1 || logic->HasItem(RG_BOTTLE_WITH_FAIRY) || logic->HasItem(RG_BRONZE_SCALE);}), + Entrance(RR_THE_LOST_WOODS, []{return logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS);}), + }); + + areaTable[RR_ZR_BEHIND_WATERFALL] = Region("ZR Behind Waterfall", SCENE_ZORAS_RIVER, {}, {}, { //Exits Entrance(RR_ZORAS_RIVER, []{return true;}), Entrance(RR_ZORAS_DOMAIN, []{return true;}), }); - areaTable[RR_ZR_OPEN_GROTTO] = Region("ZR Open Grotto", "ZR Open Grotto", {}, NO_DAY_NIGHT_CYCLE, grottoEvents, { + areaTable[RR_ZR_OPEN_GROTTO] = Region("ZR Open Grotto", SCENE_GROTTOS, grottoEvents, { //Locations LOCATION(RC_ZR_OPEN_GROTTO_CHEST, true), LOCATION(RC_ZR_OPEN_GROTTO_FISH, logic->HasBottle()), @@ -95,7 +101,7 @@ void RegionTable_Init_ZoraRiver() { Entrance(RR_ZORAS_RIVER, []{return true;}), }); - areaTable[RR_ZR_FAIRY_GROTTO] = Region("ZR Fairy Grotto", "ZR Fairy Grotto", {}, NO_DAY_NIGHT_CYCLE, { + areaTable[RR_ZR_FAIRY_GROTTO] = Region("ZR Fairy Grotto", SCENE_GROTTOS, { //Event EventAccess(&logic->FreeFairies, []{return true;}), }, { @@ -113,7 +119,7 @@ void RegionTable_Init_ZoraRiver() { Entrance(RR_ZORAS_RIVER, []{return true;}), }); - areaTable[RR_ZR_STORMS_GROTTO] = Region("ZR Storms Grotto", "ZR Storms Grotto", {}, NO_DAY_NIGHT_CYCLE, {}, { + areaTable[RR_ZR_STORMS_GROTTO] = Region("ZR Storms Grotto", SCENE_GROTTOS, {}, { //Locations LOCATION(RC_ZR_DEKU_SCRUB_GROTTO_REAR, logic->CanStunDeku()), LOCATION(RC_ZR_DEKU_SCRUB_GROTTO_FRONT, logic->CanStunDeku()), diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 7942f6b04..5075182b3 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -402,6 +402,8 @@ typedef enum { RR_HF_NEAR_KAK_GROTTO, RR_HF_TEKTITE_GROTTO, RR_LAKE_HYLIA, + RR_LH_FROM_SHORTCUT, + RR_LH_FROM_WATER_TEMPLE, RR_LH_FISHING_ISLAND, RR_LH_OWL_FLIGHT, RR_LH_LAB, @@ -507,6 +509,7 @@ typedef enum { RR_DMC_DISTANT_PLATFORM, RR_ZR_FRONT, RR_ZORAS_RIVER, + RR_ZR_FROM_SHORTCUT, RR_ZR_BEHIND_WATERFALL, RR_ZR_OPEN_GROTTO, RR_ZR_FAIRY_GROTTO, From 81b3123586c3ced801546fe94df6d85cf956232a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Thu, 19 Jun 2025 20:34:11 +0000 Subject: [PATCH 39/67] timesavers: shipinit (#5416) * timesavers: shipinit * feedback * intro skip not unconditional --- .../TimeSavers/FasterHeavyBlockLift.cpp | 41 ++- .../TimeSavers/FasterRupeeAccumulator.cpp | 13 +- .../TimeSavers/SkipCutscene/SkipIntro.cpp | 14 +- .../SkipCutscene/Story/SkipBlueWarp.cpp | 275 +++++++++--------- .../SkipCutscene/Story/SkipDekuTreeIntro.cpp | 27 +- .../Story/SkipLostWoodsBridge.cpp | 30 +- .../Story/SkipToGivingZeldasLetter.cpp | 22 +- .../Story/SkipZeldaFleeingCastle.cpp | 38 ++- .../MoveJabuJabuElevator.cpp | 36 +-- .../MoveMidoInKokiriForest.cpp | 26 +- .../SkipChildRutoInteractions.cpp | 149 +++++----- .../Enhancements/TimeSavers/TimeSavers.cpp | 18 -- soh/soh/Enhancements/TimeSavers/TimeSavers.h | 21 -- soh/soh/Enhancements/mods.cpp | 2 - 14 files changed, 328 insertions(+), 384 deletions(-) delete mode 100644 soh/soh/Enhancements/TimeSavers/TimeSavers.cpp delete mode 100644 soh/soh/Enhancements/TimeSavers/TimeSavers.h diff --git a/soh/soh/Enhancements/TimeSavers/FasterHeavyBlockLift.cpp b/soh/soh/Enhancements/TimeSavers/FasterHeavyBlockLift.cpp index 97c253073..05a98fd80 100644 --- a/soh/soh/Enhancements/TimeSavers/FasterHeavyBlockLift.cpp +++ b/soh/soh/Enhancements/TimeSavers/FasterHeavyBlockLift.cpp @@ -1,7 +1,5 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" -#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/OTRGlobals.h" -#include "spdlog/spdlog.h" +#include "soh/ShipInit.hpp" extern "C" { #include "z64save.h" @@ -12,29 +10,29 @@ extern PlayState* gPlayState; extern SaveContext gSaveContext; } +#define CVAR_BLOCKLIFT_NAME CVAR_ENHANCEMENT("FasterHeavyBlockLift") +#define CVAR_BLOCKLIFT_VALUE CVarGetInteger(CVAR_BLOCKLIFT_NAME, 0) + +#define CVAR_SKIP_CUTSCENE_NAME CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint") +#define CVAR_SKIP_CUTSCENE_VALUE CVarGetInteger(CVAR_SKIP_CUTSCENE_NAME, IS_RANDO) + /** * This primarily handles speeding up the heavy block lifts (OGC and in the Fire Trial) but also handles skipping * the one point cutscene since the two options are so similar in what they do. */ -void FasterHeavyBlockLift_Register() { - REGISTER_VB_SHOULD(VB_PLAY_ONEPOINT_ACTOR_CS, { +void RegisterFasterHeavyBlockLift() { + COND_VB_SHOULD(VB_PLAY_ONEPOINT_ACTOR_CS, CVAR_BLOCKLIFT_VALUE || CVAR_SKIP_CUTSCENE_VALUE, { Actor* actor = va_arg(args, Actor*); - if (actor->id == ACTOR_BG_HEAVY_BLOCK && - (CVarGetInteger(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 0) || - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), IS_RANDO))) { + if (actor->id == ACTOR_BG_HEAVY_BLOCK) { *should = false; } }); - REGISTER_VB_SHOULD(VB_FREEZE_LINK_FOR_BLOCK_THROW, { - if (CVarGetInteger(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 0) || - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), IS_RANDO)) { - *should = false; - } - }); + COND_VB_SHOULD(VB_FREEZE_LINK_FOR_BLOCK_THROW, CVAR_BLOCKLIFT_VALUE || CVAR_SKIP_CUTSCENE_VALUE, + { *should = false; }); - REGISTER_VB_SHOULD(VB_PLAY_THROW_ANIMATION, { + COND_VB_SHOULD(VB_PLAY_THROW_ANIMATION, CVAR_BLOCKLIFT_VALUE, { Player* player = GET_PLAYER(gPlayState); Actor* interactRangeActor = player->interactRangeActor; s32 interactActorId = interactRangeActor->id; @@ -42,18 +40,17 @@ void FasterHeavyBlockLift_Register() { // Same actor is used for small and large silver rocks, use actor params to identify large ones bool isLargeSilverRock = (interactActorId == ACTOR_EN_ISHI) && ((interactRangeActor->params & 1) == 1); - if (CVarGetInteger(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 0) && - (isLargeSilverRock || interactActorId == ACTOR_BG_HEAVY_BLOCK)) { + if (isLargeSilverRock || interactActorId == ACTOR_BG_HEAVY_BLOCK) { *should = false; LinkAnimation_PlayOnceSetSpeed(gPlayState, &player->skelAnime, anim, 5.0f); } }); - REGISTER_VB_SHOULD(VB_MOVE_THROWN_ACTOR, { - if (CVarGetInteger(CVAR_ENHANCEMENT("FasterHeavyBlockLift"), 0)) { - Actor* heldActor = va_arg(args, Actor*); + COND_VB_SHOULD(VB_MOVE_THROWN_ACTOR, CVAR_BLOCKLIFT_VALUE, { + Actor* heldActor = va_arg(args, Actor*); - heldActor->shape.rot.x -= 3510; - } + heldActor->shape.rot.x -= 3510; }); } + +static RegisterShipInitFunc initFunc(RegisterFasterHeavyBlockLift, { CVAR_BLOCKLIFT_NAME, CVAR_SKIP_CUTSCENE_NAME }); diff --git a/soh/soh/Enhancements/TimeSavers/FasterRupeeAccumulator.cpp b/soh/soh/Enhancements/TimeSavers/FasterRupeeAccumulator.cpp index 36a780b6a..5fcfb0d26 100644 --- a/soh/soh/Enhancements/TimeSavers/FasterRupeeAccumulator.cpp +++ b/soh/soh/Enhancements/TimeSavers/FasterRupeeAccumulator.cpp @@ -1,7 +1,5 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" -#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/OTRGlobals.h" -#include "spdlog/spdlog.h" +#include "soh/ShipInit.hpp" extern "C" { #include "z64save.h" @@ -12,11 +10,8 @@ extern PlayState* gPlayState; extern SaveContext gSaveContext; } -void FasterRupeeAccumulator_Register() { - GameInteractor::Instance->RegisterGameHook([]() { - if (!CVarGetInteger(CVAR_ENHANCEMENT("FasterRupeeAccumulator"), 0)) - return; - +void RegisterFasterRupeeAccumulator() { + COND_HOOK(OnInterfaceUpdate, CVarGetInteger(CVAR_ENHANCEMENT("FasterRupeeAccumulator"), 0), []() { if (gSaveContext.rupeeAccumulator == 0) { return; } @@ -46,3 +41,5 @@ void FasterRupeeAccumulator_Register() { } }); } + +static RegisterShipInitFunc initFunc(RegisterFasterRupeeAccumulator, { CVAR_ENHANCEMENT("FasterRupeeAccumulator") }); diff --git a/soh/soh/Enhancements/TimeSavers/SkipCutscene/SkipIntro.cpp b/soh/soh/Enhancements/TimeSavers/SkipCutscene/SkipIntro.cpp index f7db9de32..26eae8097 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipCutscene/SkipIntro.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipCutscene/SkipIntro.cpp @@ -1,6 +1,6 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" -#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/OTRGlobals.h" +#include "soh/Enhancements/randomizer/context.h" +#include "soh/ShipInit.hpp" extern "C" { #include "z64save.h" @@ -10,12 +10,13 @@ extern PlayState* gPlayState; extern SaveContext gSaveContext; } -void SkipIntro_Register() { - REGISTER_VB_SHOULD(VB_PLAY_TRANSITION_CS, { +void RegisterSkipIntro() { + bool shouldRegister = CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Intro"), 0) || IS_RANDO; + COND_VB_SHOULD(VB_PLAY_TRANSITION_CS, shouldRegister, { // If we're playing rando and if starting age is adult and/or overworld spawns are shuffled we need to skip // the cutscene regardless of the enhancement being on. bool adultStart = gSaveContext.linkAge == LINK_AGE_ADULT; - bool shuffleEntrances = OTRGlobals::Instance->gRandoContext->GetOption(RSK_SHUFFLE_ENTRANCES).Is(true); + bool shuffleEntrances = Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_ENTRANCES).Is(true); if ((CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Intro"), IS_RANDO) || (IS_RANDO && (adultStart || shuffleEntrances))) && gSaveContext.cutsceneIndex == 0xFFF1) { @@ -45,3 +46,6 @@ void SkipIntro_Register() { } }); } + +static RegisterShipInitFunc initFunc(RegisterSkipIntro, + { CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Intro"), "IS_RANDO" }); diff --git a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp index e15b8abd8..cc136b14f 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipBlueWarp.cpp @@ -1,6 +1,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/OTRGlobals.h" +#include "soh/Enhancements/randomizer/context.h" +#include "soh/ShipInit.hpp" extern "C" { #include "macros.h" @@ -12,120 +13,6 @@ extern "C" { static bool sEnteredBlueWarp = false; -/** - * This will override the transitions into the blue warp cutscenes, set any appropriate flags, and - * set the entrance index to where you would normally end up after the blue warp cutscene. This - * should also account for the difference between your first and following visits to the blue warp. - */ -void SkipBlueWarp_ShouldPlayTransitionCS(GIVanillaBehavior _, bool* should, va_list originalArgs) { - // Do nothing when in a boss rush - if (IS_BOSS_RUSH) { - return; - } - - bool overrideBlueWarpDestinations = - IS_RANDO && (RAND_GET_OPTION(RSK_SHUFFLE_DUNGEON_ENTRANCES) != RO_DUNGEON_ENTRANCE_SHUFFLE_OFF || - RAND_GET_OPTION(RSK_SHUFFLE_BOSS_ENTRANCES) != RO_BOSS_ROOM_ENTRANCE_SHUFFLE_OFF); - - // Force blue warp skip on when ER needs to place Link somewhere else. - // This is preferred over having story cutscenes play in the overworld and then reloading Link somewhere else after. - if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO) || overrideBlueWarpDestinations) { - bool isBlueWarpCutscene = false; - // Deku Tree Blue warp - if (gSaveContext.entranceIndex == ENTR_KOKIRI_FOREST_0 && gSaveContext.cutsceneIndex == 0xFFF1) { - gSaveContext.entranceIndex = ENTR_KOKIRI_FOREST_DEKU_TREE_BLUE_WARP; - isBlueWarpCutscene = true; - // Dodongo's Cavern Blue warp - } else if (gSaveContext.entranceIndex == ENTR_DEATH_MOUNTAIN_TRAIL_BOTTOM_EXIT && - gSaveContext.cutsceneIndex == 0xFFF1) { - gSaveContext.entranceIndex = ENTR_DEATH_MOUNTAIN_TRAIL_DODONGO_BLUE_WARP; - isBlueWarpCutscene = true; - // Jabu Jabu's Blue warp - } else if (gSaveContext.entranceIndex == ENTR_ZORAS_FOUNTAIN_JABU_JABU_BLUE_WARP && - gSaveContext.cutsceneIndex == 0xFFF0) { - gSaveContext.entranceIndex = ENTR_ZORAS_FOUNTAIN_JABU_JABU_BLUE_WARP; - isBlueWarpCutscene = true; - // Forest Temple Blue warp - } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && - gSaveContext.chamberCutsceneNum == CHAMBER_CS_FOREST) { - // Normally set in the blue warp cutscene - Flags_SetEventChkInf(EVENTCHKINF_SPOKE_TO_DEKU_TREE_SPROUT); - - if (IS_RANDO) { - gSaveContext.entranceIndex = ENTR_SACRED_FOREST_MEADOW_FOREST_TEMPLE_BLUE_WARP; - } else { - gSaveContext.entranceIndex = ENTR_KOKIRI_FOREST_12; - } - - isBlueWarpCutscene = true; - // Fire Temple Blue warp - } else if (gSaveContext.entranceIndex == ENTR_KAKARIKO_VILLAGE_FRONT_GATE && - gSaveContext.cutsceneIndex == 0xFFF3) { - // Normally set in the blue warp cutscene - Flags_SetEventChkInf(EVENTCHKINF_DEATH_MOUNTAIN_ERUPTED); - - gSaveContext.entranceIndex = ENTR_DEATH_MOUNTAIN_CRATER_FIRE_TEMPLE_BLUE_WARP; - isBlueWarpCutscene = true; - // Water Temple Blue warp - } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && - gSaveContext.chamberCutsceneNum == CHAMBER_CS_WATER) { - // Normally set in the blue warp cutscene - gSaveContext.dayTime = gSaveContext.skyboxTime = 0x4800; - Flags_SetEventChkInf(EVENTCHKINF_RAISED_LAKE_HYLIA_WATER); - - gSaveContext.entranceIndex = ENTR_LAKE_HYLIA_WATER_TEMPLE_BLUE_WARP; - isBlueWarpCutscene = true; - // Spirit Temple Blue warp - } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && - gSaveContext.chamberCutsceneNum == CHAMBER_CS_SPIRIT) { - gSaveContext.entranceIndex = ENTR_DESERT_COLOSSUS_SPIRIT_TEMPLE_BLUE_WARP; - isBlueWarpCutscene = true; - // Shadow Temple Blue warp - } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && - gSaveContext.chamberCutsceneNum == CHAMBER_CS_SHADOW) { - gSaveContext.entranceIndex = ENTR_GRAVEYARD_SHADOW_TEMPLE_BLUE_WARP; - isBlueWarpCutscene = true; - } - - if (isBlueWarpCutscene) { - if (gSaveContext.entranceIndex != ENTR_LAKE_HYLIA_WATER_TEMPLE_BLUE_WARP) { - // Normally set in the blue warp cutscene - gSaveContext.dayTime = gSaveContext.skyboxTime = 0x8000; - } - - *should = false; - gSaveContext.cutsceneIndex = 0; - } - - // This is outside the above condition because we want to handle both first and following visits to the blue - // warp - if (sEnteredBlueWarp && overrideBlueWarpDestinations) { - Entrance_OverrideBlueWarp(); - } - } - - sEnteredBlueWarp = false; -} - -/** - * Using this hook to simply observe that Link has entered a bluewarp - * This way we know to allow entrance rando overrides to be processed on the next tranisition hook - */ -void SkipBlueWarp_ShouldPlayBlueWarpCS(GIVanillaBehavior _, bool* should, va_list originalArgs) { - sEnteredBlueWarp = true; -} - -/** - * While we could rely on the Item_Give that's normally called, it's not very clear to the player that they - * received the item when skipping the blue warp cutscene, so we'll prevent that and queue it up to be given - * to the player instead. - */ -void SkipBlueWarp_ShouldGiveItem(GIVanillaBehavior _, bool* should, va_list originalArgs) { - if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { - *should = false; - } -} - // Todo: Move item queueing here /** @@ -148,35 +35,143 @@ void EnKo_MoveWhenReady(EnKo* enKo, PlayState* play) { void SkipBlueWarp_OnActorUpdate(void* actorPtr) { EnKo* enKo = static_cast(actorPtr); - if ((enKo->actor.params & 0xFF) == ENKO_TYPE_CHILD_3 && enKo->actionFunc == func_80A995CC && - CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { + if ((enKo->actor.params & 0xFF) == ENKO_TYPE_CHILD_3 && enKo->actionFunc == func_80A995CC) { enKo->actionFunc = EnKo_MoveWhenReady; } } -/** - * This will ensure that the Deku Tree Sprout considers the Forest Temple finished when you skip the blue warp cutscene. - * Typically this checks for if you have the medallion, and when skipping the cutscene at this point you don't have it - * yet. - */ -void SkipBlueWarp_ShouldDekuJrConsiderForestTempleFinished(GIVanillaBehavior _, bool* should, va_list originalArgs) { - if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { - if (gSaveContext.entranceIndex == ENTR_KOKIRI_FOREST_DEKU_TREE_BLUE_WARP && - gSaveContext.cutsceneIndex == 0xFFF1) { - *should = Flags_GetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP); - } - } +void RegisterSkipBlueWarp() { + COND_ID_HOOK(OnActorUpdate, ACTOR_EN_KO, + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO), + SkipBlueWarp_OnActorUpdate); + + /** + * This will ensure that the Deku Tree Sprout considers the Forest Temple finished when you skip the blue warp + * cutscene. Typically this checks for if you have the medallion, and when skipping the cutscene at this point you + * don't have it yet. + */ + COND_VB_SHOULD(VB_DEKU_JR_CONSIDER_FOREST_TEMPLE_FINISHED, + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO), { + if (gSaveContext.entranceIndex == ENTR_KOKIRI_FOREST_DEKU_TREE_BLUE_WARP && + gSaveContext.cutsceneIndex == 0xFFF1) { + *should = Flags_GetEventChkInf(EVENTCHKINF_USED_FOREST_TEMPLE_BLUE_WARP); + } + }); + + /** + * While we could rely on the Item_Give that's normally called, it's not very clear to the player that they + * received the item when skipping the blue warp cutscene, so we'll prevent that and queue it up to be given + * to the player instead. + */ + COND_VB_SHOULD(VB_GIVE_ITEM_FROM_BLUE_WARP, + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO), { *should = false; }); } -void SkipBlueWarp_Register() { - GameInteractor::Instance->RegisterGameHookForID(ACTOR_EN_KO, - SkipBlueWarp_OnActorUpdate); - GameInteractor::Instance->RegisterGameHookForID( - VB_PLAY_TRANSITION_CS, SkipBlueWarp_ShouldPlayTransitionCS); - GameInteractor::Instance->RegisterGameHookForID( - VB_PLAY_BLUE_WARP_CS, SkipBlueWarp_ShouldPlayBlueWarpCS); - GameInteractor::Instance->RegisterGameHookForID( - VB_DEKU_JR_CONSIDER_FOREST_TEMPLE_FINISHED, SkipBlueWarp_ShouldDekuJrConsiderForestTempleFinished); - GameInteractor::Instance->RegisterGameHookForID(VB_GIVE_ITEM_FROM_BLUE_WARP, - SkipBlueWarp_ShouldGiveItem); +void RegisterShouldPlayBlueWarp() { + /** + * This will override the transitions into the blue warp cutscenes, set any appropriate flags, and + * set the entrance index to where you would normally end up after the blue warp cutscene. This + * should also account for the difference between your first and following visits to the blue warp. + */ + REGISTER_VB_SHOULD(VB_PLAY_TRANSITION_CS, { + // Do nothing when in a boss rush + if (IS_BOSS_RUSH) { + return; + } + + bool overrideBlueWarpDestinations = + IS_RANDO && (RAND_GET_OPTION(RSK_SHUFFLE_DUNGEON_ENTRANCES) != RO_DUNGEON_ENTRANCE_SHUFFLE_OFF || + RAND_GET_OPTION(RSK_SHUFFLE_BOSS_ENTRANCES) != RO_BOSS_ROOM_ENTRANCE_SHUFFLE_OFF); + + // Force blue warp skip on when ER needs to place Link somewhere else. + // This is preferred over having story cutscenes play in the overworld and then reloading Link somewhere else + // after. + if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO) || + overrideBlueWarpDestinations) { + bool isBlueWarpCutscene = false; + // Deku Tree Blue warp + if (gSaveContext.entranceIndex == ENTR_KOKIRI_FOREST_0 && gSaveContext.cutsceneIndex == 0xFFF1) { + gSaveContext.entranceIndex = ENTR_KOKIRI_FOREST_DEKU_TREE_BLUE_WARP; + isBlueWarpCutscene = true; + // Dodongo's Cavern Blue warp + } else if (gSaveContext.entranceIndex == ENTR_DEATH_MOUNTAIN_TRAIL_BOTTOM_EXIT && + gSaveContext.cutsceneIndex == 0xFFF1) { + gSaveContext.entranceIndex = ENTR_DEATH_MOUNTAIN_TRAIL_DODONGO_BLUE_WARP; + isBlueWarpCutscene = true; + // Jabu Jabu's Blue warp + } else if (gSaveContext.entranceIndex == ENTR_ZORAS_FOUNTAIN_JABU_JABU_BLUE_WARP && + gSaveContext.cutsceneIndex == 0xFFF0) { + gSaveContext.entranceIndex = ENTR_ZORAS_FOUNTAIN_JABU_JABU_BLUE_WARP; + isBlueWarpCutscene = true; + // Forest Temple Blue warp + } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && + gSaveContext.chamberCutsceneNum == CHAMBER_CS_FOREST) { + // Normally set in the blue warp cutscene + Flags_SetEventChkInf(EVENTCHKINF_SPOKE_TO_DEKU_TREE_SPROUT); + + if (IS_RANDO) { + gSaveContext.entranceIndex = ENTR_SACRED_FOREST_MEADOW_FOREST_TEMPLE_BLUE_WARP; + } else { + gSaveContext.entranceIndex = ENTR_KOKIRI_FOREST_12; + } + + isBlueWarpCutscene = true; + // Fire Temple Blue warp + } else if (gSaveContext.entranceIndex == ENTR_KAKARIKO_VILLAGE_FRONT_GATE && + gSaveContext.cutsceneIndex == 0xFFF3) { + // Normally set in the blue warp cutscene + Flags_SetEventChkInf(EVENTCHKINF_DEATH_MOUNTAIN_ERUPTED); + + gSaveContext.entranceIndex = ENTR_DEATH_MOUNTAIN_CRATER_FIRE_TEMPLE_BLUE_WARP; + isBlueWarpCutscene = true; + // Water Temple Blue warp + } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && + gSaveContext.chamberCutsceneNum == CHAMBER_CS_WATER) { + // Normally set in the blue warp cutscene + gSaveContext.dayTime = gSaveContext.skyboxTime = 0x4800; + Flags_SetEventChkInf(EVENTCHKINF_RAISED_LAKE_HYLIA_WATER); + + gSaveContext.entranceIndex = ENTR_LAKE_HYLIA_WATER_TEMPLE_BLUE_WARP; + isBlueWarpCutscene = true; + // Spirit Temple Blue warp + } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && + gSaveContext.chamberCutsceneNum == CHAMBER_CS_SPIRIT) { + gSaveContext.entranceIndex = ENTR_DESERT_COLOSSUS_SPIRIT_TEMPLE_BLUE_WARP; + isBlueWarpCutscene = true; + // Shadow Temple Blue warp + } else if (gSaveContext.entranceIndex == ENTR_CHAMBER_OF_THE_SAGES_0 && gSaveContext.cutsceneIndex == 0x0 && + gSaveContext.chamberCutsceneNum == CHAMBER_CS_SHADOW) { + gSaveContext.entranceIndex = ENTR_GRAVEYARD_SHADOW_TEMPLE_BLUE_WARP; + isBlueWarpCutscene = true; + } + + if (isBlueWarpCutscene) { + if (gSaveContext.entranceIndex != ENTR_LAKE_HYLIA_WATER_TEMPLE_BLUE_WARP) { + // Normally set in the blue warp cutscene + gSaveContext.dayTime = gSaveContext.skyboxTime = 0x8000; + } + + *should = false; + gSaveContext.cutsceneIndex = 0; + } + + // This is outside the above condition because we want to handle both first and following visits to the blue + // warp + if (sEnteredBlueWarp && overrideBlueWarpDestinations) { + Entrance_OverrideBlueWarp(); + } + } + + sEnteredBlueWarp = false; + }); + + /** + * Using this hook to simply observe that Link has entered a bluewarp + * This way we know to allow entrance rando overrides to be processed on the next tranisition hook + */ + REGISTER_VB_SHOULD(VB_PLAY_BLUE_WARP_CS, { sEnteredBlueWarp = true; }); } + +static RegisterShipInitFunc initHooks(RegisterSkipBlueWarp, + { CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), "IS_RANDO" }); +static RegisterShipInitFunc initUnconditionalHooks(RegisterShouldPlayBlueWarp); diff --git a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipDekuTreeIntro.cpp b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipDekuTreeIntro.cpp index 361f69d68..9faa312a1 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipDekuTreeIntro.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipDekuTreeIntro.cpp @@ -1,6 +1,5 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" -#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/OTRGlobals.h" +#include "soh/ShipInit.hpp" extern "C" { #include "src/overlays/actors/ovl_Bg_Treemouth/z_bg_treemouth.h" @@ -9,15 +8,17 @@ extern "C" { /** * This will skip the Deku Tree intro, and simply open the mouth as you approach it. */ -void SkipDekuTreeIntro_Register() { - REGISTER_VB_SHOULD(VB_PLAY_DEKU_TREE_INTRO_CS, { - if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { - BgTreemouth* treeMouth = va_arg(args, BgTreemouth*); - Flags_SetEventChkInf(EVENTCHKINF_DEKU_TREE_OPENED_MOUTH); - Audio_PlaySoundGeneral(NA_SE_EV_WOODDOOR_OPEN, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, - &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); - BgTreemouth_SetupAction(treeMouth, func_808BC6F8); - *should = false; - } - }); +void RegisterSkipDekuTreeIntro() { + COND_VB_SHOULD(VB_PLAY_DEKU_TREE_INTRO_CS, + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO), { + BgTreemouth* treeMouth = va_arg(args, BgTreemouth*); + Flags_SetEventChkInf(EVENTCHKINF_DEKU_TREE_OPENED_MOUTH); + Audio_PlaySoundGeneral(NA_SE_EV_WOODDOOR_OPEN, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, + &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); + BgTreemouth_SetupAction(treeMouth, func_808BC6F8); + *should = false; + }); } + +static RegisterShipInitFunc initFunc(RegisterSkipDekuTreeIntro, + { CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), "IS_RANDO" }); diff --git a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipLostWoodsBridge.cpp b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipLostWoodsBridge.cpp index 9485bdb0f..d743bead9 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipLostWoodsBridge.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipLostWoodsBridge.cpp @@ -1,6 +1,6 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/OTRGlobals.h" +#include "soh/ShipInit.hpp" extern "C" { #include "z64save.h" @@ -9,21 +9,19 @@ extern PlayState* gPlayState; extern SaveContext gSaveContext; } -void SkipLostWoodsBridge_Register() { +void RegisterSkipLostWoodsBridge() { /** * This skips the cutscene where you speak to Saria on the bridge in Lost Woods, where she gives you the Fairy * Ocarina. */ - REGISTER_VB_SHOULD(VB_PLAY_TRANSITION_CS, { - if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { - if ((gSaveContext.entranceIndex == ENTR_LOST_WOODS_BRIDGE_EAST_EXIT) && - !Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_SARIA_ON_BRIDGE)) { - Flags_SetEventChkInf(EVENTCHKINF_SPOKE_TO_SARIA_ON_BRIDGE); - if (GameInteractor_Should(VB_GIVE_ITEM_FAIRY_OCARINA, true)) { - Item_Give(gPlayState, ITEM_OCARINA_FAIRY); - } - *should = false; + COND_VB_SHOULD(VB_PLAY_TRANSITION_CS, CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO), { + if ((gSaveContext.entranceIndex == ENTR_LOST_WOODS_BRIDGE_EAST_EXIT) && + !Flags_GetEventChkInf(EVENTCHKINF_SPOKE_TO_SARIA_ON_BRIDGE)) { + Flags_SetEventChkInf(EVENTCHKINF_SPOKE_TO_SARIA_ON_BRIDGE); + if (GameInteractor_Should(VB_GIVE_ITEM_FAIRY_OCARINA, true)) { + Item_Give(gPlayState, ITEM_OCARINA_FAIRY); } + *should = false; } }); @@ -32,11 +30,11 @@ void SkipLostWoodsBridge_Register() { * player that they received the item when skipping the cutscene, so we'll prevent it, and queue it up to be given * instead. */ - REGISTER_VB_SHOULD(VB_GIVE_ITEM_FAIRY_OCARINA, { - if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { - *should = false; - } - }); + COND_VB_SHOULD(VB_GIVE_ITEM_FAIRY_OCARINA, + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO), { *should = false; }); // Todo: Move item queueing here } + +static RegisterShipInitFunc initFunc(RegisterSkipLostWoodsBridge, + { CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), "IS_RANDO" }); diff --git a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipToGivingZeldasLetter.cpp b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipToGivingZeldasLetter.cpp index c623d46d2..1acd6dabe 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipToGivingZeldasLetter.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipToGivingZeldasLetter.cpp @@ -1,6 +1,5 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" -#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/OTRGlobals.h" +#include "soh/ShipInit.hpp" extern "C" { #include "src/overlays/actors/ovl_En_Zl4/z_en_zl4.h" @@ -33,16 +32,17 @@ void EnZl4_SkipToGivingZeldasLetter(EnZl4* enZl4, PlayState* play) { } void SkipToGivingZeldasLetter_OnActorInit(void* actorPtr) { - if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { - EnZl4* enZl4 = static_cast(actorPtr); - if (enZl4->actionFunc != EnZl4_Cutscene || enZl4->csState != 0) - return; + EnZl4* enZl4 = static_cast(actorPtr); + if (enZl4->actionFunc != EnZl4_Cutscene || enZl4->csState != 0) + return; - enZl4->actionFunc = EnZl4_SkipToGivingZeldasLetter; - } + enZl4->actionFunc = EnZl4_SkipToGivingZeldasLetter; } -void SkipToGivingZeldasLetter_Register() { - GameInteractor::Instance->RegisterGameHookForID(ACTOR_EN_ZL4, - SkipToGivingZeldasLetter_OnActorInit); +void RegisterSkipToGivingZeldasLetter() { + COND_ID_HOOK(OnActorInit, ACTOR_EN_ZL4, CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO), + SkipToGivingZeldasLetter_OnActorInit); } + +static RegisterShipInitFunc initFunc(RegisterSkipToGivingZeldasLetter, + { CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), "IS_RANDO" }); diff --git a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipZeldaFleeingCastle.cpp b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipZeldaFleeingCastle.cpp index 56d26f01d..ae82ff9f0 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipZeldaFleeingCastle.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipCutscene/Story/SkipZeldaFleeingCastle.cpp @@ -1,6 +1,5 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" -#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/OTRGlobals.h" +#include "soh/ShipInit.hpp" extern "C" { #include "z64save.h" @@ -8,18 +7,6 @@ extern "C" { extern SaveContext gSaveContext; } -void SkipZeldaFleeingCastle_ShouldPlayTransitionCS(GIVanillaBehavior _, bool* should, va_list originalArgs) { - if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { - if (gSaveContext.entranceIndex == ENTR_HYRULE_FIELD_PAST_BRIDGE_SPAWN && gSaveContext.cutsceneIndex == 0xFFF1) { - // Normally set in the cutscene - gSaveContext.dayTime = gSaveContext.skyboxTime = 0x4AAA; - - gSaveContext.cutsceneIndex = 0; - *should = false; - } - } -} - /** * When this cutscene is skipped, walking up to the bridge to castle town triggers a quick fade in/out * which can be confusing to beginners, because they need to then fetch the Ocarina of Time from the water. @@ -46,7 +33,7 @@ void SkipZeldaFleeingCastle_OnActorUpdate(void* actorPtr) { void SkipZeldaFleeingCastle_OnActorInit(void* actorPtr) { Actor* actor = static_cast(actorPtr); - if (actor->params == 3 && CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) { + if (actor->params == 3) { framesSinceSpawn = 0; itemOcarinaUpdateHook = GameInteractor::Instance->RegisterGameHookForPtr( (uintptr_t)actorPtr, SkipZeldaFleeingCastle_OnActorUpdate); @@ -59,9 +46,20 @@ void SkipZeldaFleeingCastle_OnActorInit(void* actorPtr) { } } -void SkipZeldaFleeingCastle_Register() { - GameInteractor::Instance->RegisterGameHookForID(ACTOR_ITEM_OCARINA, - SkipZeldaFleeingCastle_OnActorInit); - GameInteractor::Instance->RegisterGameHookForID( - VB_PLAY_TRANSITION_CS, SkipZeldaFleeingCastle_ShouldPlayTransitionCS); +void RegisterSkipZeldaFleeingCastle() { + COND_ID_HOOK(OnActorInit, ACTOR_ITEM_OCARINA, + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO), + SkipZeldaFleeingCastle_OnActorInit); + COND_VB_SHOULD(VB_PLAY_TRANSITION_CS, CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO), { + if (gSaveContext.entranceIndex == ENTR_HYRULE_FIELD_PAST_BRIDGE_SPAWN && gSaveContext.cutsceneIndex == 0xFFF1) { + // Normally set in the cutscene + gSaveContext.dayTime = gSaveContext.skyboxTime = 0x4AAA; + + gSaveContext.cutsceneIndex = 0; + *should = false; + } + }); } + +static RegisterShipInitFunc initFunc(RegisterSkipZeldaFleeingCastle, + { CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), "IS_RANDO" }); diff --git a/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/MoveJabuJabuElevator.cpp b/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/MoveJabuJabuElevator.cpp index 704339424..34e2fdf61 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/MoveJabuJabuElevator.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/MoveJabuJabuElevator.cpp @@ -1,28 +1,28 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" -#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/OTRGlobals.h" +#include "soh/ShipInit.hpp" extern "C" { #include "src/overlays/actors/ovl_Bg_Bdan_Objects/z_bg_bdan_objects.h" } +void BdanInit(void* actorRef) { + Player* player = GET_PLAYER(gPlayState); + BgBdanObjects* bgBdanObjects = static_cast(actorRef); + + if (bgBdanObjects->dyna.actor.params == 1) { + if (player->actor.world.pos.y < -500.0f) { + bgBdanObjects->timer = 220; + } + } +} + /** * Adjusts the behavior of the elevator to start near the bottom if you are entering the room from the bottom */ -void MoveJabuJabuElevator_Register() { - GameInteractor::Instance->RegisterGameHookForID( - ACTOR_BG_BDAN_OBJECTS, [](void* actorRef) { - Player* player = GET_PLAYER(gPlayState); - BgBdanObjects* bgBdanObjects = static_cast(actorRef); - - if (!CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO)) { - return; - } - - if (bgBdanObjects->dyna.actor.params == 1) { - if (player->actor.world.pos.y < -500.0f) { - bgBdanObjects->timer = 220; - } - } - }); +void RegisterMoveJabuJabuElevator() { + COND_ID_HOOK(OnActorInit, ACTOR_BG_BDAN_OBJECTS, + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO), BdanInit); } + +static RegisterShipInitFunc initFunc(RegisterMoveJabuJabuElevator, + { CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), "IS_RANDO" }); diff --git a/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/MoveMidoInKokiriForest.cpp b/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/MoveMidoInKokiriForest.cpp index 6e9b94b4a..1e4e77d44 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/MoveMidoInKokiriForest.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/MoveMidoInKokiriForest.cpp @@ -1,6 +1,5 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" -#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/OTRGlobals.h" +#include "soh/ShipInit.hpp" extern "C" { #include "z64save.h" @@ -15,14 +14,17 @@ extern SaveContext gSaveContext; * This simply skips the Mido interaction in Kokiri Forest, once you equip the Kokiri * Sword and Deku Shield he will move out of the way without you needing to talk to him. */ -void MoveMidoInKokiriForest_Register() { - REGISTER_VB_SHOULD(VB_MOVE_MIDO_IN_KOKIRI_FOREST, { - if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO) && - !Flags_GetEventChkInf(EVENTCHKINF_SHOWED_MIDO_SWORD_SHIELD) && - (CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) == EQUIP_VALUE_SHIELD_DEKU) && - (CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) == EQUIP_VALUE_SWORD_KOKIRI) && gSaveContext.cutsceneIndex == 0) { - Flags_SetEventChkInf(EVENTCHKINF_SHOWED_MIDO_SWORD_SHIELD); - *should = true; - } - }); +void RegisterMoveMidoInKokiriForest() { + COND_VB_SHOULD( + VB_MOVE_MIDO_IN_KOKIRI_FOREST, CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO), { + if (!Flags_GetEventChkInf(EVENTCHKINF_SHOWED_MIDO_SWORD_SHIELD) && + (CUR_EQUIP_VALUE(EQUIP_TYPE_SHIELD) == EQUIP_VALUE_SHIELD_DEKU) && + (CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) == EQUIP_VALUE_SWORD_KOKIRI) && gSaveContext.cutsceneIndex == 0) { + Flags_SetEventChkInf(EVENTCHKINF_SHOWED_MIDO_SWORD_SHIELD); + *should = true; + } + }); } + +static RegisterShipInitFunc initFunc(RegisterMoveMidoInKokiriForest, + { CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), "IS_RANDO" }); diff --git a/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/SkipChildRutoInteractions.cpp b/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/SkipChildRutoInteractions.cpp index 97b65a543..39417d5de 100644 --- a/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/SkipChildRutoInteractions.cpp +++ b/soh/soh/Enhancements/TimeSavers/SkipMiscInteractions/SkipChildRutoInteractions.cpp @@ -1,6 +1,5 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" -#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/OTRGlobals.h" +#include "soh/ShipInit.hpp" extern "C" { #include "overlays/actors/ovl_En_Ru1/z_en_ru1.h" @@ -9,93 +8,87 @@ extern "C" { Actor* func_80AEB124(PlayState* play); } -void SkipChildRutoInteractions_Register() { - // Skips the Child Ruto introduction cutscene, where she drops down into the hole in Jabu-Jabu's Belly - REGISTER_VB_SHOULD(VB_PLAY_CHILD_RUTO_INTRO, { - EnRu1* enRu1 = va_arg(args, EnRu1*); +void Ru1Init(void* actorRef) { + EnRu1* enRu1 = static_cast(actorRef); - if (!CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO)) { - return; - } - - Flags_SetInfTable(INFTABLE_RUTO_IN_JJ_MEET_RUTO); - Flags_SetInfTable(INFTABLE_RUTO_IN_JJ_TALK_FIRST_TIME); - Flags_SetInfTable(INFTABLE_143); + if (enRu1->action == 22) { + enRu1->action = 27; enRu1->drawConfig = 1; - enRu1->actor.world.pos.x = 127.0f; - enRu1->actor.world.pos.y = -340.0f; - enRu1->actor.world.pos.z = -3041.0f; - enRu1->actor.shape.rot.y = enRu1->actor.world.rot.y = -5098; + enRu1->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY; + Animation_Change(&enRu1->skelAnime, (AnimationHeader*)&gRutoChildSittingAnim, 1.0f, 0.0f, + Animation_GetLastFrame((void*)&gRutoChildSittingAnim), ANIMMODE_LOOP, 0.0f); + } +} - if (*should) { - Animation_Change(&enRu1->skelAnime, (AnimationHeader*)&gRutoChildTurnAroundAnim, 1.0f, 0, - Animation_GetLastFrame((void*)&gRutoChildTurnAroundAnim), ANIMMODE_ONCE, -8.0f); - enRu1->action = 10; - } +void RegisterSkipChildRutoInteractions() { + // Skips the Child Ruto introduction cutscene, where she drops down into the hole in Jabu-Jabu's Belly + COND_VB_SHOULD( + VB_PLAY_CHILD_RUTO_INTRO, CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO), { + EnRu1* enRu1 = va_arg(args, EnRu1*); - *should = false; - }); + Flags_SetInfTable(INFTABLE_RUTO_IN_JJ_MEET_RUTO); + Flags_SetInfTable(INFTABLE_RUTO_IN_JJ_TALK_FIRST_TIME); + Flags_SetInfTable(INFTABLE_143); + enRu1->drawConfig = 1; + enRu1->actor.world.pos.x = 127.0f; + enRu1->actor.world.pos.y = -340.0f; + enRu1->actor.world.pos.z = -3041.0f; + enRu1->actor.shape.rot.y = enRu1->actor.world.rot.y = -5098; + + if (*should) { + Animation_Change(&enRu1->skelAnime, (AnimationHeader*)&gRutoChildTurnAroundAnim, 1.0f, 0, + Animation_GetLastFrame((void*)&gRutoChildTurnAroundAnim), ANIMMODE_ONCE, -8.0f); + enRu1->action = 10; + } + + *should = false; + }); // Skips a short dialogue sequence where Ruto tells you to throw her to the Sapphire - REGISTER_VB_SHOULD(VB_RUTO_WANT_TO_BE_TOSSED_TO_SAPPHIRE, { - if (!CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO)) { - return; - } - - if (*should) { - Flags_SetInfTable(INFTABLE_RUTO_IN_JJ_WANTS_TO_BE_TOSSED_TO_SAPPHIRE); - *should = false; - } - }); + COND_VB_SHOULD(VB_RUTO_WANT_TO_BE_TOSSED_TO_SAPPHIRE, + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO), { + if (*should) { + Flags_SetInfTable(INFTABLE_RUTO_IN_JJ_WANTS_TO_BE_TOSSED_TO_SAPPHIRE); + *should = false; + } + }); // Prevents Ruto from running to the Sapphire when she wants to be tossed to it, instead she just stands up and // waits for link to get closer - REGISTER_VB_SHOULD(VB_RUTO_RUN_TO_SAPPHIRE, { - EnRu1* enRu1 = va_arg(args, EnRu1*); - DynaPolyActor* dynaPolyActor = va_arg(args, DynaPolyActor*); + COND_VB_SHOULD(VB_RUTO_RUN_TO_SAPPHIRE, + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO), { + EnRu1* enRu1 = va_arg(args, EnRu1*); + DynaPolyActor* dynaPolyActor = va_arg(args, DynaPolyActor*); - if (!CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO)) { - return; - } - - if (*should) { - enRu1->unk_28C = (BgBdanObjects*)dynaPolyActor; - Flags_SetInfTable(INFTABLE_145); - Flags_SetSwitch(gPlayState, 0x02); - Flags_SetSwitch(gPlayState, 0x1F); - enRu1->action = 42; - Animation_Change(&enRu1->skelAnime, (AnimationHeader*)&gRutoChildWait2Anim, 1.0f, 0, - Animation_GetLastFrame((void*)&gRutoChildWait2Anim), ANIMMODE_LOOP, -8.0f); - // If we aren't skipping one point cutscenes and BgBdan objects has set the camera setting - // to CAM_SET_NORMAL1 (2), don't reset the camera setting to 1. This prevents the One Point - // Cutscene of Ruto getting lifted up from getting queued up twice. - if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), IS_RANDO) || - enRu1->unk_28C->cameraSetting != 2) { - enRu1->unk_28C->cameraSetting = 1; - } - Actor* sapphire = func_80AEB124(gPlayState); - if (sapphire != NULL) { - Actor_Kill(sapphire); - } - enRu1->actor.room = gPlayState->roomCtx.curRoom.num; - *should = false; - } - }); + if (*should) { + enRu1->unk_28C = (BgBdanObjects*)dynaPolyActor; + Flags_SetInfTable(INFTABLE_145); + Flags_SetSwitch(gPlayState, 0x02); + Flags_SetSwitch(gPlayState, 0x1F); + enRu1->action = 42; + Animation_Change(&enRu1->skelAnime, (AnimationHeader*)&gRutoChildWait2Anim, 1.0f, 0, + Animation_GetLastFrame((void*)&gRutoChildWait2Anim), ANIMMODE_LOOP, -8.0f); + // If we aren't skipping one point cutscenes and BgBdan objects has set the camera setting + // to CAM_SET_NORMAL1 (2), don't reset the camera setting to 1. This prevents the One Point + // Cutscene of Ruto getting lifted up from getting queued up twice. + if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.OnePoint"), IS_RANDO) || + enRu1->unk_28C->cameraSetting != 2) { + enRu1->unk_28C->cameraSetting = 1; + } + Actor* sapphire = func_80AEB124(gPlayState); + if (sapphire != NULL) { + Actor_Kill(sapphire); + } + enRu1->actor.room = gPlayState->roomCtx.curRoom.num; + *should = false; + } + }); // This overrides the behavior that causes Ruto to get upset at you before sitting back down again when // INFTABLE_RUTO_IN_JJ_TALK_FIRST_TIME is set - GameInteractor::Instance->RegisterGameHookForID(ACTOR_EN_RU1, [](void* actorRef) { - EnRu1* enRu1 = static_cast(actorRef); - if (!CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO)) { - return; - } - - if (enRu1->action == 22) { - enRu1->action = 27; - enRu1->drawConfig = 1; - enRu1->actor.flags |= ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY; - Animation_Change(&enRu1->skelAnime, (AnimationHeader*)&gRutoChildSittingAnim, 1.0f, 0.0f, - Animation_GetLastFrame((void*)&gRutoChildSittingAnim), ANIMMODE_LOOP, 0.0f); - } - }); + COND_ID_HOOK(OnActorInit, ACTOR_EN_RU1, + CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO), Ru1Init); } + +static RegisterShipInitFunc initFunc(RegisterSkipChildRutoInteractions, + { CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), "IS_RANDO" }); diff --git a/soh/soh/Enhancements/TimeSavers/TimeSavers.cpp b/soh/soh/Enhancements/TimeSavers/TimeSavers.cpp deleted file mode 100644 index a881675d6..000000000 --- a/soh/soh/Enhancements/TimeSavers/TimeSavers.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "TimeSavers.h" - -void TimeSavers_Register() { - // SkipCutscene - // Story - SkipBlueWarp_Register(); - SkipDekuTreeIntro_Register(); - SkipLostWoodsBridge_Register(); - SkipToGivingZeldasLetter_Register(); - SkipZeldaFleeingCastle_Register(); - SkipIntro_Register(); - // SkipMiscInteractions - MoveJabuJabuElevator_Register(); - MoveMidoInKokiriForest_Register(); - SkipChildRutoInteractions_Register(); - FasterHeavyBlockLift_Register(); - FasterRupeeAccumulator_Register(); -} diff --git a/soh/soh/Enhancements/TimeSavers/TimeSavers.h b/soh/soh/Enhancements/TimeSavers/TimeSavers.h deleted file mode 100644 index 9448260d6..000000000 --- a/soh/soh/Enhancements/TimeSavers/TimeSavers.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef TIME_SAVERS_H -#define TIME_SAVERS_H - -void TimeSavers_Register(); - -// SkipCutscene -// Story -void SkipBlueWarp_Register(); -void SkipDekuTreeIntro_Register(); -void SkipLostWoodsBridge_Register(); -void SkipToGivingZeldasLetter_Register(); -void SkipZeldaFleeingCastle_Register(); -void SkipIntro_Register(); -// SkipMiscInteractions -void MoveJabuJabuElevator_Register(); -void MoveMidoInKokiriForest_Register(); -void SkipChildRutoInteractions_Register(); -void FasterHeavyBlockLift_Register(); -void FasterRupeeAccumulator_Register(); - -#endif // TIME_SAVERS_H diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 05e9d3d74..6c547db08 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -13,7 +13,6 @@ #include "soh/Enhancements/cosmetics/authenticGfxPatches.h" #include #include "soh/Enhancements/timesaver_hook_handlers.h" -#include "soh/Enhancements/TimeSavers/TimeSavers.h" #include "soh/Enhancements/randomizer/hook_handlers.h" #include "src/overlays/actors/ovl_En_Bb/z_en_bb.h" @@ -961,7 +960,6 @@ void InitMods() { BossRush_RegisterHooks(); RandomizerRegisterHooks(); TimeSaverRegisterHooks(); - TimeSavers_Register(); RegisterTTS(); RegisterOcarinaTimeTravel(); RegisterPermanentHeartLoss(); From be22c02d0050828836ca04eedb30083591cd2a39 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Thu, 19 Jun 2025 13:34:47 -0700 Subject: [PATCH 40/67] Reapply "Set Sample Rate to 32000 hz (#4780)" (#5234) (#5508) This reverts commit feea29929125d9496c7a17037250532a8d3e3bfd. Also applies rupee screech fix LL provided to 2ship. --- soh/soh/OTRGlobals.cpp | 13 +++--------- soh/src/code/audio_init_params.c | 36 ++++++++++++++++---------------- soh/src/code/audio_playback.c | 2 +- 3 files changed, 22 insertions(+), 29 deletions(-) diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index df3919274..67f4c49e3 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -346,7 +346,7 @@ OTRGlobals::OTRGlobals() { overlay->LoadFont("Fipps", 32.0f, "fonts/Fipps-Regular.otf"); overlay->SetCurrentFont(CVarGetString(CVAR_GAME_OVERLAY_FONT, "Press Start 2P")); - context->InitAudio({ .SampleRate = 44100, .SampleLength = 1024, .DesiredBuffered = 2480 }); + context->InitAudio({ .SampleRate = 32000, .SampleLength = 1024, .DesiredBuffered = 1680 }); SPDLOG_INFO("Starting Ship of Harkinian version {} (Branch: {} | Commit: {})", (char*)gBuildVersion, (char*)gGitBranch, (char*)gGitCommitHash); @@ -564,15 +564,8 @@ void OTRAudio_Thread() { // AudioMgr_ThreadEntry(&gAudioMgr); // 528 and 544 relate to 60 fps at 32 kHz 32000/60 = 533.333.. // in an ideal world, one third of the calls should use num_samples=544 and two thirds num_samples=528 -//#define SAMPLES_HIGH 560 -//#define SAMPLES_LOW 528 -// PAL values -//#define SAMPLES_HIGH 656 -//#define SAMPLES_LOW 624 - -// 44KHZ values -#define SAMPLES_HIGH 752 -#define SAMPLES_LOW 720 +#define SAMPLES_HIGH 560 +#define SAMPLES_LOW 528 #define AUDIO_FRAMES_PER_UPDATE (R_UPDATE_RATE > 0 ? R_UPDATE_RATE : 1) #define NUM_AUDIO_CHANNELS 2 diff --git a/soh/src/code/audio_init_params.c b/soh/src/code/audio_init_params.c index 12653c6dc..77b826ca9 100644 --- a/soh/src/code/audio_init_params.c +++ b/soh/src/code/audio_init_params.c @@ -68,22 +68,22 @@ ReverbSettings D_80133420[][3] = { }; AudioSpec gAudioSpecs[18] = { - { 44100, 1, 24, 4, 0, 0, 2, D_80133420[0], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 44100, 1, 24, 4, 0, 0, 2, D_80133420[1], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 44100, 1, 24, 4, 0, 0, 2, D_80133420[2], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 44100, 1, 23, 4, 0, 0, 2, D_80133420[4], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 44100, 1, 23, 4, 0, 0, 2, D_80133420[5], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 44100, 1, 24, 4, 0, 0, 2, D_80133420[6], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 44100, 1, 24, 4, 0, 0, 2, D_80133420[7], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 44100, 1, 23, 4, 0, 0, 2, D_80133420[8], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 44100, 1, 24, 4, 0, 0, 2, D_80133420[9], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 44100, 1, 23, 4, 0, 0, 2, D_80133420[8], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 44100, 1, 28, 3, 0, 0, 2, D_80133420[10], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 44100, 1, 28, 3, 0, 0, 1, D_80133420[11], 0x300, 0x200, 0x7FFF, 0, 0x4800, 0, 0x5000, 0, 0, 0, 0 }, - { 44100, 1, 28, 3, 0, 0, 1, D_80133420[11], 0x300, 0x200, 0x7FFF, 0, 0, 0, 0x5000, 0x4800, 0, 0, 0 }, - { 44100, 1, 22, 4, 0, 0, 2, D_80133420[0], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 44100, 1, 22, 4, 0, 0, 2, D_80133420[8], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 44100, 1, 16, 4, 0, 0, 2, D_80133420[0], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 22050, 1, 24, 4, 0, 0, 2, D_80133420[0], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2880, 0, 0, 0 }, - { 44100, 1, 24, 4, 0, 0, 2, D_80133420[2], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x5000, 0x2600, 0, 0, 0 }, + { 32000, 1, 24, 4, 0, 0, 2, D_80133420[0], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x4000, 0x2880, 0, 0, 0 }, + { 32000, 1, 24, 4, 0, 0, 2, D_80133420[1], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 }, + { 32000, 1, 24, 4, 0, 0, 2, D_80133420[2], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 }, + { 32000, 1, 23, 4, 0, 0, 2, D_80133420[4], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 }, + { 32000, 1, 23, 4, 0, 0, 2, D_80133420[5], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 }, + { 32000, 1, 24, 4, 0, 0, 2, D_80133420[6], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 }, + { 32000, 1, 24, 4, 0, 0, 2, D_80133420[7], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 }, + { 32000, 1, 23, 4, 0, 0, 2, D_80133420[8], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 }, + { 32000, 1, 24, 4, 0, 0, 2, D_80133420[9], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 }, + { 32000, 1, 23, 4, 0, 0, 2, D_80133420[8], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 }, + { 32000, 1, 28, 3, 0, 0, 2, D_80133420[10], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x2800, 0x2880, 0, 0, 0 }, + { 32000, 1, 28, 3, 0, 0, 1, D_80133420[11], 0x300, 0x200, 0x7FFF, 0, 0x4800, 0, 0x4000, 0, 0, 0, 0 }, + { 32000, 1, 28, 3, 0, 0, 1, D_80133420[11], 0x300, 0x200, 0x7FFF, 0, 0, 0, 0x4000, 0x4800, 0, 0, 0 }, + { 32000, 1, 22, 4, 0, 0, 2, D_80133420[0], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 }, + { 32000, 1, 22, 4, 0, 0, 2, D_80133420[8], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 }, + { 32000, 1, 16, 4, 0, 0, 2, D_80133420[0], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 }, + { 22050, 1, 24, 4, 0, 0, 2, D_80133420[0], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 }, + { 32000, 1, 24, 4, 0, 0, 2, D_80133420[2], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3600, 0x2600, 0, 0, 0 }, }; diff --git a/soh/src/code/audio_playback.c b/soh/src/code/audio_playback.c index 9fe588878..122823fde 100644 --- a/soh/src/code/audio_playback.c +++ b/soh/src/code/audio_playback.c @@ -121,7 +121,7 @@ void Audio_NoteSetResamplingRate(NoteSubEu* noteSubEu, f32 resamplingRateInput) } else { noteSubEu->bitField1.hasTwoParts = true; if (3.99996f < resamplingRateInput) { - if (CVarGetInteger(CVAR_AUDIO("ExperimentalOctaveDrop"), 0)) { + if (CVarGetInteger(CVAR_AUDIO("ExperimentalOctaveDrop"), 0) || noteSubEu->bitField1.isSyntheticWave) { resamplingRate = resamplingRateInput * 0.25; } else { resamplingRate = 1.99998f; From a9ede7d46e8d884b0d2c79e28553f2fb293565fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Thu, 19 Jun 2025 20:37:48 +0000 Subject: [PATCH 41/67] SwitchTimerMultiplier: fix crash due to missing actor param (#5593) --- .../overlays/actors/ovl_Bg_Gnd_Darkmeiro/z_bg_gnd_darkmeiro.c | 2 +- .../overlays/actors/ovl_Bg_Relay_Objects/z_bg_relay_objects.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/soh/src/overlays/actors/ovl_Bg_Gnd_Darkmeiro/z_bg_gnd_darkmeiro.c b/soh/src/overlays/actors/ovl_Bg_Gnd_Darkmeiro/z_bg_gnd_darkmeiro.c index 4ade8918c..00f61c7fc 100644 --- a/soh/src/overlays/actors/ovl_Bg_Gnd_Darkmeiro/z_bg_gnd_darkmeiro.c +++ b/soh/src/overlays/actors/ovl_Bg_Gnd_Darkmeiro/z_bg_gnd_darkmeiro.c @@ -134,7 +134,7 @@ void BgGndDarkmeiro_UpdateBlockTimer(BgGndDarkmeiro* this, PlayState* play) { if (Flags_GetSwitch(play, ((this->dyna.actor.params >> 8) & 0x3F) + 2)) { if (this->actionFlags & 8) { if (this->timer2 > 0) { - if (GameInteractor_Should(VB_SWITCH_TIMER_TICK, true, &this->timer2)) { + if (GameInteractor_Should(VB_SWITCH_TIMER_TICK, true, this, &this->timer2)) { this->timer2--; } } else { diff --git a/soh/src/overlays/actors/ovl_Bg_Relay_Objects/z_bg_relay_objects.c b/soh/src/overlays/actors/ovl_Bg_Relay_Objects/z_bg_relay_objects.c index 40887b202..ce37bfd13 100644 --- a/soh/src/overlays/actors/ovl_Bg_Relay_Objects/z_bg_relay_objects.c +++ b/soh/src/overlays/actors/ovl_Bg_Relay_Objects/z_bg_relay_objects.c @@ -169,7 +169,7 @@ void BgRelayObjects_DoNothing(BgRelayObjects* this, PlayState* play) { } void func_808A932C(BgRelayObjects* this, PlayState* play) { - if (GameInteractor_Should(VB_SWITCH_TIMER_TICK, this->timer != 0, &this->timer)) { + if (GameInteractor_Should(VB_SWITCH_TIMER_TICK, this->timer != 0, this, &this->timer)) { this->timer--; } if (this->timer == 0) { From c0ea595fa5adbce20bd24834a18ecf64858dde3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Thu, 19 Jun 2025 20:38:11 +0000 Subject: [PATCH 42/67] rando: always spawn gerudo guard behind gate (also fix gaurd typos) (#5399) * rando: always spawn guard behind gate (also fix gaurd typos) someone had seed where they had card so couldn't be caught to pass gate in reverse wasteland * move guard spawn logic to hook --- .../Enhancements/randomizer/hook_handlers.cpp | 6 +++++- soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c | 16 ---------------- soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.h | 1 - 3 files changed, 5 insertions(+), 18 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 994e0fba6..58fc9123b 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -971,7 +971,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l break; } case VB_BIGGORON_CONSIDER_TRADE_COMPLETE: { - // This being true will prevent other biggoron trades, there are already safegaurds in place to prevent + // This being true will prevent other biggoron trades, there are already safeguards in place to prevent // claim check from being traded multiple times, so we don't really need the quest to ever be considered // "complete" *should = false; @@ -1982,6 +1982,10 @@ void RandomizerOnActorInitHandler(void* actorRef) { if (ge1Type == GE1_TYPE_TRAINING_GROUND_GUARD && Flags_GetRandomizerInf(RAND_INF_GF_GTG_GATE_PERMANENTLY_OPEN)) { enGe1->actionFunc = (EnGe1ActionFunc)EnGe1_SetNormalText; + } else if (ge1Type == GE1_TYPE_GATE_OPERATOR && enGe1->actor.world.pos.x != -1358.0f) { + // When spawning the gate operator, also spawn an extra gate operator on the wasteland side + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_GE1, -1358.0f, 88.0f, -3018.0f, 0, 0x95B0, 0, + 0x0300 | GE1_TYPE_GATE_OPERATOR, true); } } diff --git a/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c b/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c index 1becdcf6a..eadd847b5 100644 --- a/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c +++ b/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.c @@ -97,22 +97,6 @@ void EnGe1_Init(Actor* thisx, PlayState* play) { s32 pad; EnGe1* this = (EnGe1*)thisx; - // When spawning the gate operator, also spawn an extra gate operator on the wasteland side - if (IS_RANDO && - (Randomizer_GetSettingValue(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD) || - Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_ENTRANCES)) && - (this->actor.params & 0xFF) == GE1_TYPE_GATE_OPERATOR) { - // Spawn the extra gaurd with params matching the custom type added (0x0300 + 0x02) - Actor_Spawn(&play->actorCtx, play, ACTOR_EN_GE1, -1358.0f, 88.0f, -3018.0f, 0, 0x95B0, 0, - 0x0300 | GE1_TYPE_EXTRA_GATE_OPERATOR, true); - } - - // Convert the "extra" gate operator into a normal one so it matches the same params - if ((this->actor.params & 0xFF) == GE1_TYPE_EXTRA_GATE_OPERATOR) { - this->actor.params &= ~0xFF; - this->actor.params |= GE1_TYPE_GATE_OPERATOR; - } - ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 30.0f); SkelAnime_InitFlex(play, &this->skelAnime, &gGerudoWhiteSkel, &gGerudoWhiteIdleAnim, this->jointTable, this->morphTable, GE1_LIMB_MAX); diff --git a/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.h b/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.h index 2c0c6d4f9..c85b20deb 100644 --- a/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.h +++ b/soh/src/overlays/actors/ovl_En_Ge1/z_en_ge1.h @@ -12,7 +12,6 @@ typedef void (*EnGe1ActionFunc)(struct EnGe1*, PlayState*); typedef enum { /* 0x00 */ GE1_TYPE_GATE_GUARD, /* 0x01 */ GE1_TYPE_GATE_OPERATOR, - /* 0x02 */ GE1_TYPE_EXTRA_GATE_OPERATOR, // Custom guard type for entrance randomizer to open the gate /* 0x04 */ GE1_TYPE_NORMAL = 4, /* 0x05 */ GE1_TYPE_VALLEY_FLOOR, /* 0x45 */ GE1_TYPE_HORSEBACK_ARCHERY = 0x45, From 4f95ab3f46b1e6d5d6ce34e5b400de16683e2c87 Mon Sep 17 00:00:00 2001 From: nclok1405 <155463060+nclok1405@users.noreply.github.com> Date: Fri, 20 Jun 2025 05:39:03 +0900 Subject: [PATCH 43/67] Add/Restore the option to automatically boot into Debug Warp Screen (#5485) * Added/Restored the option to automatically boot into Debug Warp Screen * clang-formated * Added a new hook and moved Boot To Debug Warp Screen to it * clang * Added DebugEnabled to initFunc's CVar list. This should prevent Debug Warp from being triggered when Boot to Debug Warp option is enabled but Debug Mode option is disabled. * No longer hijacks CustomLogoTitle * Disable "Boot Sequence" dropdown when Boot to Debug Warp Screen is enabled --- .../Enhancements/BootToDebugWarpScreen.cpp | 47 +++++++++++++++++++ .../GameInteractor_HookTable.h | 1 + .../game-interactor/GameInteractor_Hooks.cpp | 4 ++ .../game-interactor/GameInteractor_Hooks.h | 1 + soh/soh/SohGui/MenuTypes.h | 1 + soh/soh/SohGui/SohMenu.cpp | 6 +++ soh/soh/SohGui/SohMenuDevTools.cpp | 6 +++ soh/soh/SohGui/SohMenuSettings.cpp | 4 ++ .../ovl_file_choose/z_file_choose.c | 3 ++ 9 files changed, 73 insertions(+) create mode 100644 soh/soh/Enhancements/BootToDebugWarpScreen.cpp diff --git a/soh/soh/Enhancements/BootToDebugWarpScreen.cpp b/soh/soh/Enhancements/BootToDebugWarpScreen.cpp new file mode 100644 index 000000000..a2b8c6b60 --- /dev/null +++ b/soh/soh/Enhancements/BootToDebugWarpScreen.cpp @@ -0,0 +1,47 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/ShipInit.hpp" +#include "functions.h" + +extern "C" { +#include "z64.h" +#include "overlays/gamestates/ovl_file_choose/file_choose.h" +} + +static constexpr int32_t CVAR_DEBUG_ENABLED_DEFAULT = 0; +#define CVAR_DEBUG_ENABLED_NAME CVAR_DEVELOPER_TOOLS("DebugEnabled") +#define CVAR_DEBUG_ENABLED_VALUE CVarGetInteger(CVAR_DEBUG_ENABLED_NAME, CVAR_DEBUG_ENABLED_DEFAULT) + +static constexpr int32_t CVAR_BOOT_TO_DEBUG_WARP_SCREEN_DEFAULT = 0; +#define CVAR_BOOT_TO_DEBUG_WARP_SCREEN_NAME CVAR_DEVELOPER_TOOLS("BootToDebugWarpScreen") +#define CVAR_BOOT_TO_DEBUG_WARP_SCREEN_VALUE \ + CVarGetInteger(CVAR_BOOT_TO_DEBUG_WARP_SCREEN_NAME, CVAR_BOOT_TO_DEBUG_WARP_SCREEN_DEFAULT) + +void OnFileChooseMainBootToDebugWarpScreen(void* gameState) { + FileChooseContext* fileChooseContext = (FileChooseContext*)gameState; + fileChooseContext->buttonIndex = 0xFF; + fileChooseContext->menuMode = FS_MENU_MODE_SELECT; + fileChooseContext->selectMode = SM_LOAD_GAME; +} + +void OnZTitleUpdateBootToDebugWarpScreen(void* gameState) { + TitleContext* titleContext = (TitleContext*)gameState; + + gSaveContext.seqId = (u8)NA_BGM_DISABLED; + gSaveContext.natureAmbienceId = 0xFF; + gSaveContext.gameMode = GAMEMODE_FILE_SELECT; + titleContext->state.running = false; + + SET_NEXT_GAMESTATE(&titleContext->state, FileChoose_Init, FileChooseContext); +} + +void RegisterBootToDebugWarpScreen() { + COND_HOOK(OnFileChooseMain, CVAR_DEBUG_ENABLED_VALUE && CVAR_BOOT_TO_DEBUG_WARP_SCREEN_VALUE, + OnFileChooseMainBootToDebugWarpScreen); + COND_HOOK(OnZTitleUpdate, CVAR_DEBUG_ENABLED_VALUE && CVAR_BOOT_TO_DEBUG_WARP_SCREEN_VALUE, + OnZTitleUpdateBootToDebugWarpScreen); +} + +static RegisterShipInitFunc initFunc_BootToDebugWarpScreen(RegisterBootToDebugWarpScreen, + { CVAR_DEBUG_ENABLED_NAME, + CVAR_BOOT_TO_DEBUG_WARP_SCREEN_NAME }); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h index 8d5a8f4e5..2c94d27a4 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h @@ -66,6 +66,7 @@ DEFINE_HOOK(OnUpdateFileLanguageSelection, (uint8_t optionIndex)); DEFINE_HOOK(OnUpdateFileQuestSelection, (uint8_t questIndex)); DEFINE_HOOK(OnUpdateFileBossRushOptionSelection, (uint8_t optionIndex, uint8_t optionValue)); DEFINE_HOOK(OnUpdateFileNameSelection, (int16_t charCode)); +DEFINE_HOOK(OnFileChooseMain, (void* gameState)); DEFINE_HOOK(OnSetGameLanguage, ()); DEFINE_HOOK(OnFileDropped, (std::string filePath)); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp index 120ca4e99..21f1a9c09 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp @@ -298,6 +298,10 @@ void GameInteractor_ExecuteOnUpdateFileNameSelection(int16_t charCode) { GameInteractor::Instance->ExecuteHooks(charCode); } +void GameInteractor_ExecuteOnFileChooseMain(void* gameState) { + GameInteractor::Instance->ExecuteHooks(gameState); +} + // MARK: - Game void GameInteractor_ExecuteOnSetGameLanguage() { diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h index 9bb47868f..b32dada61 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h @@ -73,6 +73,7 @@ void GameInteractor_ExecuteOnUpdateFileLanguageSelection(uint8_t optionIndex); void GameInteractor_ExecuteOnUpdateFileQuestSelection(uint8_t questIndex); void GameInteractor_ExecuteOnUpdateFileBossRushOptionSelection(uint8_t optionIndex, uint8_t optionValue); void GameInteractor_ExecuteOnUpdateFileNameSelection(int16_t charCode); +void GameInteractor_ExecuteOnFileChooseMain(void* gameState); // MARK: - Game void GameInteractor_ExecuteOnSetGameLanguage(); diff --git a/soh/soh/SohGui/MenuTypes.h b/soh/soh/SohGui/MenuTypes.h index de78e8961..e96d015ef 100644 --- a/soh/soh/SohGui/MenuTypes.h +++ b/soh/soh/SohGui/MenuTypes.h @@ -19,6 +19,7 @@ typedef enum { DISABLE_FOR_FRAME_ADVANCE_OFF, DISABLE_FOR_ADVANCED_RESOLUTION_OFF, DISABLE_FOR_VERTICAL_RESOLUTION_OFF, + DISABLE_FOR_BOOT_TO_DEBUG_WARP_SCREEN_ON, } DisableOption; struct WidgetInfo; diff --git a/soh/soh/SohGui/SohMenu.cpp b/soh/soh/SohGui/SohMenu.cpp index 61967087b..a71fd1cad 100644 --- a/soh/soh/SohGui/SohMenu.cpp +++ b/soh/soh/SohGui/SohMenu.cpp @@ -155,6 +155,12 @@ void SohMenu::InitElement() { return !CVarGetInteger(CVAR_PREFIX_ADVANCED_RESOLUTION ".VerticalResolutionToggle", 0); }, "Vertical Resolution Toggle is Off" } }, + { DISABLE_FOR_BOOT_TO_DEBUG_WARP_SCREEN_ON, + { [](disabledInfo& info) -> bool { + return CVarGetInteger(CVAR_DEVELOPER_TOOLS("DebugEnabled"), 0) && + CVarGetInteger(CVAR_DEVELOPER_TOOLS("BootToDebugWarpScreen"), 0); + }, + "\"Boot To Debug Warp Screen\" Enabled (see Dev Tools -> General)" } }, }; } diff --git a/soh/soh/SohGui/SohMenuDevTools.cpp b/soh/soh/SohGui/SohMenuDevTools.cpp index 6a5c292eb..3e87af890 100644 --- a/soh/soh/SohGui/SohMenuDevTools.cpp +++ b/soh/soh/SohGui/SohMenuDevTools.cpp @@ -21,6 +21,12 @@ void SohMenu::AddMenuDevTools() { .Options( CheckboxOptions().Tooltip("Enables Debug Mode, allowing you to select maps with L + R + Z, noclip " "with L + D-pad Right, and open the debug menu with L on the pause screen.")); + AddWidget(path, "Boot To Debug Warp Screen", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_DEVELOPER_TOOLS("BootToDebugWarpScreen")) + .PreFunc([](WidgetInfo& info) { info.isHidden = !CVarGetInteger(CVAR_DEVELOPER_TOOLS("DebugEnabled"), 0); }) + .Options( + CheckboxOptions().Tooltip("Automatically shows Debug Warp Screen when starting or resetting the game.\n" + "This option takes precedence over \"Boot Sequence\" option.")); AddWidget(path, "OoT Registry Editor", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_DEVELOPER_TOOLS("RegEditEnabled")) .PreFunc([](WidgetInfo& info) { info.isHidden = !CVarGetInteger(CVAR_DEVELOPER_TOOLS("DebugEnabled"), 0); }) diff --git a/soh/soh/SohGui/SohMenuSettings.cpp b/soh/soh/SohGui/SohMenuSettings.cpp index 23bee56dc..c3c5bdfa1 100644 --- a/soh/soh/SohGui/SohMenuSettings.cpp +++ b/soh/soh/SohGui/SohMenuSettings.cpp @@ -159,6 +159,10 @@ void SohMenu::AddMenuSettings() { AddWidget(path, "Boot Sequence", WIDGET_CVAR_COMBOBOX) .CVar(CVAR_SETTING("BootSequence")) .RaceDisable(false) + .PreFunc([](WidgetInfo& info) { + if (mSohMenu->disabledMap.at(DISABLE_FOR_BOOT_TO_DEBUG_WARP_SCREEN_ON).active) + info.activeDisables.push_back(DISABLE_FOR_BOOT_TO_DEBUG_WARP_SCREEN_ON); + }) .Options(ComboboxOptions() .DefaultIndex(BOOTSEQUENCE_DEFAULT) .LabelPosition(LabelPositions::Far) diff --git a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c index b715b488e..736616fc9 100644 --- a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c +++ b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c @@ -3565,6 +3565,9 @@ void FileChoose_Main(GameState* thisx) { Input* input = &this->state.input[0]; Color_RGB8 helpTextColor = { 100, 255, 255 }; + + GameInteractor_ExecuteOnFileChooseMain(thisx); + if (CVarGetInteger(CVAR_COSMETIC("Title.FileChoose.Changed"), 0)) { Color_RGB8 backgroundColor = CVarGetColor24(CVAR_COSMETIC("Title.FileChoose.Value"), (Color_RGB8){ 100, 150, 255 }); From 073205c862c3aa460300c299efe807bd6584ee2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Thu, 19 Jun 2025 20:40:24 +0000 Subject: [PATCH 44/67] ShufflePots: ShipInit (#5584) --- .../Enhancements/randomizer/ShufflePots.cpp | 37 +++++++++---------- soh/soh/Enhancements/randomizer/ShufflePots.h | 17 --------- .../Enhancements/randomizer/hook_handlers.cpp | 19 ---------- 3 files changed, 17 insertions(+), 56 deletions(-) delete mode 100644 soh/soh/Enhancements/randomizer/ShufflePots.h diff --git a/soh/soh/Enhancements/randomizer/ShufflePots.cpp b/soh/soh/Enhancements/randomizer/ShufflePots.cpp index 319237b98..e37b9ee16 100644 --- a/soh/soh/Enhancements/randomizer/ShufflePots.cpp +++ b/soh/soh/Enhancements/randomizer/ShufflePots.cpp @@ -1,4 +1,4 @@ -#include "ShufflePots.h" +#include "soh/OTRGlobals.h" #include "soh_assets.h" #include "static_data.h" @@ -51,48 +51,44 @@ void ObjTsubo_RandomizerSpawnCollectible(ObjTsubo* potActor, PlayState* play) { item00->actor.world.rot.y = static_cast(Rand_CenteredFloat(65536.0f)); } -void ObjTsubo_RandomizerInit(void* actorRef) { - Actor* actor = static_cast(actorRef); +void RegisterShufflePots() { + bool shouldRegister = IS_RANDO && RAND_GET_OPTION(RSK_SHUFFLE_POTS); - ObjTsubo* potActor = static_cast(actorRef); + COND_ID_HOOK(OnActorInit, ACTOR_OBJ_TSUBO, shouldRegister, [](void* actorRef) { + Actor* actor = static_cast(actorRef); + ObjTsubo* potActor = static_cast(actorRef); - potActor->potIdentity = OTRGlobals::Instance->gRandomizer->IdentifyPot( - gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z); -} - -void ShufflePots_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs) { - va_list args; - va_copy(args, originalArgs); + potActor->potIdentity = OTRGlobals::Instance->gRandomizer->IdentifyPot( + gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z); + }); // Draw custom model for pot to indicate it holding a randomized item. - if (id == VB_POT_SETUP_DRAW) { + COND_VB_SHOULD(VB_POT_SETUP_DRAW, shouldRegister, { ObjTsubo* potActor = va_arg(args, ObjTsubo*); if (ObjTsubo_RandomizerHoldsItem(potActor, gPlayState)) { potActor->actor.draw = (ActorFunc)ObjTsubo_RandomizerDraw; *should = false; } - } + }); // Do not spawn vanilla item from pot, instead spawn the ranomized item. - if (id == VB_POT_DROP_ITEM) { + COND_VB_SHOULD(VB_POT_DROP_ITEM, shouldRegister, { ObjTsubo* potActor = va_arg(args, ObjTsubo*); if (ObjTsubo_RandomizerHoldsItem(potActor, gPlayState)) { ObjTsubo_RandomizerSpawnCollectible(potActor, gPlayState); *should = false; } - } + }); // Unlock early Ganon's Boss Key doors to allow access to the pots there when pots are shuffled in dungeon - if (id == VB_LOCK_BOSS_DOOR) { + COND_VB_SHOULD(VB_LOCK_BOSS_DOOR, shouldRegister, { DoorShutter* doorActor = va_arg(args, DoorShutter*); uint8_t shufflePotSetting = RAND_GET_OPTION(RSK_SHUFFLE_POTS); if (gPlayState->sceneNum == SCENE_GANONS_TOWER && doorActor->dyna.actor.world.pos.y == 800 && (shufflePotSetting == RO_SHUFFLE_POTS_DUNGEONS || shufflePotSetting == RO_SHUFFLE_POTS_ALL)) { *should = false; } - } - - va_end(args); + }); } void Rando::StaticData::RegisterPotLocations() { @@ -653,4 +649,5 @@ void Rando::StaticData::RegisterPotLocations() { // clang-format on } -static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterPotLocations); +static RegisterShipInitFunc registerShufflePots(RegisterShufflePots, { "IS_RANDO" }); +static RegisterShipInitFunc registerShufflePotLocations(Rando::StaticData::RegisterPotLocations); diff --git a/soh/soh/Enhancements/randomizer/ShufflePots.h b/soh/soh/Enhancements/randomizer/ShufflePots.h deleted file mode 100644 index cbe6ddaf5..000000000 --- a/soh/soh/Enhancements/randomizer/ShufflePots.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef SHUFFLEPOTS_H -#define SHUFFLEPOTS_H - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif -void ObjTsubo_RandomizerInit(void* actorRef); -#ifdef __cplusplus -}; -#endif - -void ShufflePots_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs); - -#endif // SHUFFLEPOTS_H diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 58fc9123b..508979eaf 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -8,7 +8,6 @@ #include "soh/Enhancements/randomizer/dungeon.h" #include "soh/Enhancements/randomizer/fishsanity.h" #include "soh/Enhancements/randomizer/static_data.h" -#include "soh/Enhancements/randomizer/ShufflePots.h" #include "soh/Enhancements/randomizer/ShuffleFreestanding.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" @@ -2332,9 +2331,6 @@ void RandomizerRegisterHooks() { static uint32_t fishsanityOnVanillaBehaviorHook = 0; static uint32_t fishsanityOnItemReceiveHook = 0; - static uint32_t shufflePotsOnActorInitHook = 0; - static uint32_t shufflePotsOnVanillaBehaviorHook = 0; - static uint32_t shuffleFreestandingOnVanillaBehaviorHook = 0; GameInteractor::Instance->RegisterGameHook([](int32_t fileNum) { @@ -2370,10 +2366,6 @@ void RandomizerRegisterHooks() { fishsanityOnVanillaBehaviorHook); GameInteractor::Instance->UnregisterGameHook(fishsanityOnItemReceiveHook); - GameInteractor::Instance->UnregisterGameHookForID(shufflePotsOnActorInitHook); - GameInteractor::Instance->UnregisterGameHook( - shufflePotsOnVanillaBehaviorHook); - GameInteractor::Instance->UnregisterGameHook( shuffleFreestandingOnVanillaBehaviorHook); @@ -2402,9 +2394,6 @@ void RandomizerRegisterHooks() { fishsanityOnVanillaBehaviorHook = 0; fishsanityOnItemReceiveHook = 0; - shufflePotsOnActorInitHook = 0; - shufflePotsOnVanillaBehaviorHook = 0; - shuffleFreestandingOnVanillaBehaviorHook = 0; ShuffleFairies_UnregisterHooks(); @@ -2474,14 +2463,6 @@ void RandomizerRegisterHooks() { Rando::Fishsanity::OnItemReceiveHandler); } - if (RAND_GET_OPTION(RSK_SHUFFLE_POTS) != RO_SHUFFLE_POTS_OFF) { - shufflePotsOnActorInitHook = GameInteractor::Instance->RegisterGameHookForID( - ACTOR_OBJ_TSUBO, ObjTsubo_RandomizerInit); - shufflePotsOnVanillaBehaviorHook = - GameInteractor::Instance->RegisterGameHook( - ShufflePots_OnVanillaBehaviorHandler); - } - if (RAND_GET_OPTION(RSK_SHUFFLE_FREESTANDING) != RO_SHUFFLE_FREESTANDING_OFF) { shuffleFreestandingOnVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook( From 7f4c570a47613e1ab65e23d71afd6c63800c4335 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Thu, 19 Jun 2025 20:40:37 +0000 Subject: [PATCH 45/67] ShuffleFairies: ShipInit (#5582) * ShuffleFairies: ShipInit * fix big fairy items --- .../randomizer/ShuffleFairies.cpp | 95 +++++++++---------- .../Enhancements/randomizer/ShuffleFairies.h | 13 --- .../Enhancements/randomizer/hook_handlers.cpp | 7 -- .../Enhancements/randomizer/randomizerTypes.h | 5 + soh/src/overlays/actors/ovl_En_Elf/z_en_elf.h | 1 - 5 files changed, 49 insertions(+), 72 deletions(-) delete mode 100644 soh/soh/Enhancements/randomizer/ShuffleFairies.h diff --git a/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp b/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp index ea34d1414..ffd9a60b4 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp @@ -1,18 +1,19 @@ -#include "ShuffleFairies.h" #include "randomizer_grotto.h" #include "draw.h" #include "src/overlays/actors/ovl_En_Elf/z_en_elf.h" #include "src/overlays/actors/ovl_Obj_Bean/z_obj_bean.h" #include "src/overlays/actors/ovl_En_Gs/z_en_gs.h" #include "src/overlays/actors/ovl_Shot_Sun/z_shot_sun.h" -#include "../../OTRGlobals.h" -#include "../../cvar_prefixes.h" +#include "soh/OTRGlobals.h" +#include "soh/cvar_prefixes.h" +#include "soh/Enhancements/item-tables/ItemTableTypes.h" #include "static_data.h" #define FAIRY_FLAG_TIMED (1 << 8) void ShuffleFairies_DrawRandomizedItem(EnElf* enElf, PlayState* play) { - GetItemEntry randoGetItem = enElf->sohFairyIdentity.itemEntry; + GetItemEntry randoGetItem = + Rando::Context::GetInstance()->GetFinalGIEntry(enElf->sohFairyIdentity.randomizerCheck, true, GI_FAIRY); if (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0)) { randoGetItem = GET_ITEM_MYSTERY; } @@ -60,18 +61,17 @@ FairyIdentity ShuffleFairies_GetFairyIdentity(int32_t params) { assert(false); } else { fairyIdentity.randomizerInf = static_cast(location->GetCollectionCheck().flag); - fairyIdentity.itemEntry = - Rando::Context::GetInstance()->GetFinalGIEntry(location->GetRandomizerCheck(), true, GI_FAIRY); + fairyIdentity.randomizerCheck = location->GetRandomizerCheck(); } return fairyIdentity; } -bool ShuffleFairies_SpawnFairy(f32 posX, f32 posY, f32 posZ, int32_t params) { +static bool SpawnFairy(f32 posX, f32 posY, f32 posZ, int32_t params, FairyType fairyType) { FairyIdentity fairyIdentity = ShuffleFairies_GetFairyIdentity(params); if (!Flags_GetRandomizerInf(fairyIdentity.randomizerInf)) { EnElf* fairy = (EnElf*)Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_ELF, posX, posY - 30.0f, posZ, 0, - 0, 0, FAIRY_HEAL, true); + 0, 0, fairyType, true); fairy->sohFairyIdentity = fairyIdentity; fairy->actor.draw = (ActorFunc)ShuffleFairies_DrawRandomizedItem; return true; @@ -79,58 +79,62 @@ bool ShuffleFairies_SpawnFairy(f32 posX, f32 posY, f32 posZ, int32_t params) { return false; } -void ShuffleFairies_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs) { - va_list args; - va_copy(args, originalArgs); - - Actor* actor = va_arg(args, Actor*); - - va_end(args); +void RegisterShuffleFairies() { + bool shouldRegister = IS_RANDO && RAND_GET_OPTION(RSK_SHUFFLE_FAIRIES); // Grant item when picking up fairy. - if (id == VB_FAIRY_HEAL) { - EnElf* enElf = (EnElf*)(actor); + COND_VB_SHOULD(VB_FAIRY_HEAL, shouldRegister, { + EnElf* enElf = va_arg(args, EnElf*); if (enElf->sohFairyIdentity.randomizerInf && enElf->sohFairyIdentity.randomizerInf != RAND_INF_MAX) { Flags_SetRandomizerInf(enElf->sohFairyIdentity.randomizerInf); } - // Spawn fairies in fairy fountains - } else if (id == VB_SPAWN_FOUNTAIN_FAIRIES) { + }); + + // Spawn fairies in fairy fountains + COND_VB_SHOULD(VB_SPAWN_FOUNTAIN_FAIRIES, shouldRegister, { + Actor* actor = va_arg(args, Actor*); bool fairySpawned = false; s16 grottoId = (gPlayState->sceneNum == SCENE_FAIRYS_FOUNTAIN) ? Grotto_CurrentGrotto() : 0; for (s16 index = 0; index < 8; index++) { int32_t params = (grottoId << 8) | index; - if (ShuffleFairies_SpawnFairy(actor->world.pos.x, actor->world.pos.y, actor->world.pos.z, params)) { + if (SpawnFairy(actor->world.pos.x, actor->world.pos.y, actor->world.pos.z, params, FAIRY_HEAL)) { fairySpawned = true; } } if (fairySpawned) { *should = false; } - // Spawn 3 fairies when playing Song of Storms next to a planted bean - } else if (id == VB_SPAWN_BEAN_STALK_FAIRIES) { - ObjBean* objBean = (ObjBean*)(actor); + }); + + // Spawn 3 fairies when playing Song of Storms next to a planted bean + COND_VB_SHOULD(VB_SPAWN_BEAN_STALK_FAIRIES, shouldRegister, { + ObjBean* objBean = va_arg(args, ObjBean*); bool fairySpawned = false; for (s16 index = 0; index < 3; index++) { int32_t params = ((objBean->dyna.actor.params & 0x3F) << 8) | index; - if (ShuffleFairies_SpawnFairy(objBean->dyna.actor.world.pos.x, objBean->dyna.actor.world.pos.y, - objBean->dyna.actor.world.pos.z, params)) { + if (SpawnFairy(objBean->dyna.actor.world.pos.x, objBean->dyna.actor.world.pos.y, + objBean->dyna.actor.world.pos.z, params, FAIRY_HEAL)) { fairySpawned = true; } } if (fairySpawned) { *should = false; } - // Spawn a fairy from a ShotSun when playing the right song near it - } else if (id == VB_SPAWN_SONG_FAIRY) { - ShotSun* shotSun = (ShotSun*)(actor); - if (ShuffleFairies_SpawnFairy(shotSun->actor.world.pos.x, shotSun->actor.world.pos.y, - shotSun->actor.world.pos.z, - TWO_ACTOR_PARAMS(0x1000, (int32_t)shotSun->actor.world.pos.z))) { + }); + + // Spawn a fairy from a ShotSun when playing the right song near it + COND_VB_SHOULD(VB_SPAWN_SONG_FAIRY, shouldRegister, { + ShotSun* shotSun = va_arg(args, ShotSun*); + if (SpawnFairy(shotSun->actor.world.pos.x, shotSun->actor.world.pos.y, shotSun->actor.world.pos.z, + TWO_ACTOR_PARAMS(0x1000, (int32_t)shotSun->actor.world.pos.z), FAIRY_HEAL_BIG)) { *should = false; } - // Handle playing both misc songs and song of storms in front of a gossip stone. - } else if (id == VB_SPAWN_GOSSIP_STONE_FAIRY) { - EnGs* gossipStone = (EnGs*)(actor); + }); + + // Handle playing both misc songs and song of storms in front of a gossip stone. + COND_VB_SHOULD(VB_SPAWN_GOSSIP_STONE_FAIRY, shouldRegister, { + EnGs* gossipStone = va_arg(args, EnGs*); + FairyType fairyType = FAIRY_HEAL; // Mimic vanilla behaviour, only go into this path if song played is one of the ones normally spawning a fairy. // Otherwise fall back to vanilla behaviour. @@ -144,6 +148,7 @@ void ShuffleFairies_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, // Distinguish storms fairies from the normal song fairies if (gPlayState->msgCtx.unk_E3F2 == OCARINA_SONG_STORMS) { params |= 0x1000; + fairyType = FAIRY_HEAL_BIG; } // Combine actor + song params with position to get the right randomizer check @@ -156,8 +161,8 @@ void ShuffleFairies_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, // collected, the vanilla code will handle that part automatically. FairyIdentity fairyIdentity = ShuffleFairies_GetFairyIdentity(params); if (!ShuffleFairies_FairyExists(fairyIdentity)) { - if (ShuffleFairies_SpawnFairy(gossipStone->actor.world.pos.x, gossipStone->actor.world.pos.y, - gossipStone->actor.world.pos.z, params)) { + if (SpawnFairy(gossipStone->actor.world.pos.x, gossipStone->actor.world.pos.y, + gossipStone->actor.world.pos.z, params, fairyType)) { Audio_PlayActorSound2(&gossipStone->actor, NA_SE_EV_BUTTERFRY_TO_FAIRY); // Set vanilla check for fairy spawned so it doesn't spawn the vanilla fairy afterwards as well. gossipStone->unk_19D = 0; @@ -167,20 +172,7 @@ void ShuffleFairies_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, *should = false; } } - } -} - -uint32_t onVanillaBehaviorHook = 0; - -void ShuffleFairies_RegisterHooks() { - onVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook( - ShuffleFairies_OnVanillaBehaviorHandler); -} - -void ShuffleFairies_UnregisterHooks() { - GameInteractor::Instance->UnregisterGameHook(onVanillaBehaviorHook); - - onVanillaBehaviorHook = 0; + }); } void Rando::StaticData::RegisterFairyLocations() { @@ -412,4 +404,5 @@ void Rando::StaticData::RegisterFairyLocations() { // clang-format on } -static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterFairyLocations); +static RegisterShipInitFunc registerShuffleFairies(RegisterShuffleFairies, { "IS_RANDO" }); +static RegisterShipInitFunc registerShuffleFairiesLocations(Rando::StaticData::RegisterFairyLocations); diff --git a/soh/soh/Enhancements/randomizer/ShuffleFairies.h b/soh/soh/Enhancements/randomizer/ShuffleFairies.h deleted file mode 100644 index 2b29a6146..000000000 --- a/soh/soh/Enhancements/randomizer/ShuffleFairies.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include -#include "soh/Enhancements/item-tables/ItemTableTypes.h" -#include "randomizerTypes.h" - -typedef struct FairyIdentity { - RandomizerInf randomizerInf; - GetItemEntry itemEntry; -} FairyIdentity; - -void ShuffleFairies_RegisterHooks(); -void ShuffleFairies_UnregisterHooks(); \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 508979eaf..7f23f60cc 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -14,7 +14,6 @@ #include "soh/SohGui/ImGuiUtils.h" #include "soh/Notification/Notification.h" #include "soh/SaveManager.h" -#include "soh/Enhancements/randomizer/ShuffleFairies.h" extern "C" { #include "macros.h" @@ -2396,8 +2395,6 @@ void RandomizerRegisterHooks() { shuffleFreestandingOnVanillaBehaviorHook = 0; - ShuffleFairies_UnregisterHooks(); - if (!IS_RANDO) return; @@ -2468,9 +2465,5 @@ void RandomizerRegisterHooks() { GameInteractor::Instance->RegisterGameHook( ShuffleFreestanding_OnVanillaBehaviorHandler); } - - if (RAND_GET_OPTION(RSK_SHUFFLE_FAIRIES)) { - ShuffleFairies_RegisterHooks(); - } }); } diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 5075182b3..c3bda412a 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -6361,6 +6361,11 @@ typedef struct FishIdentity { RandomizerCheck randomizerCheck; } FishIdentity; +typedef struct FairyIdentity { + RandomizerInf randomizerInf; + RandomizerCheck randomizerCheck; +} FairyIdentity; + typedef struct GrassIdentity { RandomizerInf randomizerInf; RandomizerCheck randomizerCheck; diff --git a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.h b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.h index da77ac778..8a5368768 100644 --- a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.h +++ b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.h @@ -4,7 +4,6 @@ #include #include "global.h" #include "overlays/actors/ovl_Elf_Msg/z_elf_msg.h" -#include "soh/Enhancements/randomizer/ShuffleFairies.h" struct EnElf; From 565d57112e12b8ea134fa38c890cf92b4f59355a Mon Sep 17 00:00:00 2001 From: nclok1405 <155463060+nclok1405@users.noreply.github.com> Date: Fri, 20 Jun 2025 05:41:41 +0900 Subject: [PATCH 46/67] Japanese translation for Better Debug Warp Screen (#5491) * Japanese translation for Better Debug Warp Screen * Incorporate fixes by balloondude2 (except Shield/Treasure Chest Grave inconsistencies which I'm unsure how to handle that) * Localize "Scene Selection" header for each language * Added/Restored the ability to render Hiragana characters using GFXP_HIRAGANA macro --- soh/include/z64.h | 6 +- soh/soh/OTRGlobals.cpp | 49 +- .../overlays/gamestates/ovl_select/z_select.c | 758 +++++++++--------- 3 files changed, 443 insertions(+), 370 deletions(-) diff --git a/soh/include/z64.h b/soh/include/z64.h index 53b76e8fb..79ecdabcd 100644 --- a/soh/include/z64.h +++ b/soh/include/z64.h @@ -1339,9 +1339,9 @@ typedef struct { /* */ char* frenchAge; } BetterSceneSelectAgeLabels; -// NTSC TODO: japanese bettersceneselect + typedef struct { -// /* */ char* japaneseName; + /* */ char* japaneseName; /* */ char* englishName; /* */ char* germanName; /* */ char* frenchName; @@ -1350,7 +1350,7 @@ typedef struct { } BetterSceneSelectEntrancePair; typedef struct { - // /* */ char* japaneseName; + /* */ char* japaneseName; /* */ char* englishName; /* */ char* germanName; /* */ char* frenchName; diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 67f4c49e3..e869bbc05 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1703,6 +1703,7 @@ extern "C" void Ctx_WriteSaveFile(uintptr_t addr, void* dramAddr, size_t size) { std::wstring StringToU16(const std::string& s) { std::vector result; size_t i = 0; + while (i < s.size()) { unsigned long uni; size_t nbytes = 0; @@ -1711,7 +1712,13 @@ std::wstring StringToU16(const std::string& s) { if (c < 0x80) { // ascii uni = c; nbytes = 0; - } else if (c <= 0xBF) { // assuming kata/hiragana delimiter + } else if (c == GFXP_HIRAGANA_CHAR) { // Start Hiragana Mode + uni = c; + nbytes = 0; + } else if (c == GFXP_KATAKANA_CHAR) { // Start Katakana Mode + uni = c; + nbytes = 0; + } else if (c <= 0xBF) { // Invalid Characters (Skipped) nbytes = 0; uni = '\1'; } else if (c <= 0xDF) { @@ -1757,24 +1764,56 @@ extern "C" void OTRGfxPrint(const char* str, void* printer, void (*printImpl)(vo u'み', u'γ‚€', u'め', u'γ‚‚', u'γ‚„', u'ゆ', u'γ‚ˆ', u'ら', u'γ‚Š', u'γ‚‹', u'γ‚Œ', u'ろ', u'わ', u'γ‚“', u'γ‚›', u'γ‚œ', }; + const std::vector kata1 = { + u'ヲ', u'γ‚‘', u'γ‚£', u'γ‚₯', u'γ‚§', u'γ‚©', u'ャ', u'γƒ₯', u'ョ', u'ッ', u'γƒΌ', + }; + + const std::vector kata2 = { + u'γ‚’', u'γ‚€', u'ウ', u'エ', u'γ‚ͺ', u'γ‚«', u'γ‚­', u'γ‚―', u'γ‚±', u'γ‚³', u'γ‚΅', u'γ‚·', u'γ‚Ή', u'γ‚»', u'γ‚½', + u'γ‚Ώ', u'チ', u'ツ', u'テ', u'γƒˆ', u'γƒŠ', u'ニ', u'γƒŒ', u'ネ', u'γƒŽ', u'ハ', u'γƒ’', u'フ', u'γƒ˜', u'ホ', + u'γƒž', u'γƒŸ', u'γƒ ', u'パ', u'γƒ’', u'ダ', u'ユ', u'ヨ', u'ラ', u'γƒͺ', u'ル', u'レ', u'γƒ­', u'γƒ―', u'ン', + }; + std::wstring wstr = StringToU16(str); + bool hiraganaMode = false; for (const auto& c : wstr) { - unsigned char convt = ' '; if (c < 0x80) { printImpl(printer, c); - } else if (c >= u'q' && c <= u'゚') { // katakana - printImpl(printer, c - 0xFEC0); + } else if (c == GFXP_HIRAGANA_CHAR) { + hiraganaMode = true; + } else if (c == GFXP_KATAKANA_CHAR) { + hiraganaMode = false; + } else if (c >= u'q' && c <= u'゚') { // katakana (hankaku) + if (hiraganaMode && c >= u'ヲ' && c <= u'ο½Ώ') { + printImpl(printer, c - 0xFEC0 - 0x20); // Hiragana Mode, Block 1 + } else if (hiraganaMode && c >= u'οΎ€' && c <= u'ン') { + printImpl(printer, c - 0xFEC0 + 0x20); // Hiragana Mode, Block 2 + } else { + printImpl(printer, c - 0xFEC0); + } + } else if (c == u'γ€€') { // zenkaku space + printImpl(printer, u' '); } else { auto it = std::find(hira1.begin(), hira1.end(), c); if (it != hira1.end()) { // hiragana block 1 - printImpl(printer, 0x88 + std::distance(hira1.begin(), it)); + printImpl(printer, 0x86 + std::distance(hira1.begin(), it)); } auto it2 = std::find(hira2.begin(), hira2.end(), c); if (it2 != hira2.end()) { // hiragana block 2 printImpl(printer, 0xe0 + std::distance(hira2.begin(), it2)); } + + auto it3 = std::find(kata1.begin(), kata1.end(), c); + if (it3 != kata1.end()) { // katakana zenkaku block 1 + printImpl(printer, 0xa6 + std::distance(kata1.begin(), it3)); + } + + auto it4 = std::find(kata2.begin(), kata2.end(), c); + if (it4 != kata2.end()) { // katakana zenkaku block 2 + printImpl(printer, 0xb1 + std::distance(kata2.begin(), it4)); + } } } } diff --git a/soh/src/overlays/gamestates/ovl_select/z_select.c b/soh/src/overlays/gamestates/ovl_select/z_select.c index e08ba7c97..a057ebbd5 100644 --- a/soh/src/overlays/gamestates/ovl_select/z_select.c +++ b/soh/src/overlays/gamestates/ovl_select/z_select.c @@ -385,407 +385,413 @@ static SceneSelectEntry sScenes[] = { { "title", "title", "Titelbildschirm", "Ecran-titre", Select_LoadTitle, 0 }, }; +// Note about Japanese scene names: +// * SoH originally lacked the ability to render Hiragana characters using GFXP_HIRAGANA macro. +// This is not the case anymore, but Hiragana characters are still written directly here +// for the sake of readability and editability. +// * Dakuten (濁点) characters must be explicitly written using 'γ‚›' or 'γ‚œ'. +// Combined characters (such as 'が', 'げ', 'ば', etc) won't render. static BetterSceneSelectEntry sBetterScenes[] = { // clang-format off - { " 1:Hyrule Field", " 1:Hylianische Steppe", " 1:Plaine d'Hyrule", Select_LoadGame, 8, { - { "Near Drawbridge", "Nahe der Zugbruecke", "Pres du Pont-levis", ENTR_HYRULE_FIELD_PAST_BRIDGE_SPAWN, 0 }, - { "From Drawbridge", "Von der Zugbruecke", "Depuis le Pont-levis", ENTR_HYRULE_FIELD_ON_BRIDGE_SPAWN, 0 }, - { "From Kakariko Village", "Von Kakariko", "Depuis le Village Cocorico", ENTR_HYRULE_FIELD_STAIRS_EXIT, 0 }, - { "From Zora River", "Vom Zora-Fluss", "Depuis la Riviere Zora", ENTR_HYRULE_FIELD_RIVER_EXIT, 0 }, - { "From Lost Woods", "Von den verlorenen Waeldern", "Depuis les Bois Perdus", ENTR_HYRULE_FIELD_WOODED_EXIT, 0 }, - { "From Lake Hylia", "Vom Hylia-See", "Depuis le Lac Hylia", ENTR_HYRULE_FIELD_FENCE_EXIT, 0 }, - { "From Gerudo Valley", "Vom Gerudotal", "Depuis la Vallee Gerudo", ENTR_HYRULE_FIELD_ROCKY_PATH, 0 }, - { "From Lon Lon Ranch", "Von der Lon Lon-Farm", "Depuis le Ranch Lon Lon", ENTR_HYRULE_FIELD_CENTER_EXIT, 0 }, + { "1:ハむラルへいけ゛ん", " 1:Hyrule Field", " 1:Hylianische Steppe", " 1:Plaine d'Hyrule", Select_LoadGame, 8, { + { "はねは゛しγγ‘かく", "Near Drawbridge", "Nahe der Zugbruecke", "Pres du Pont-levis", ENTR_HYRULE_FIELD_PAST_BRIDGE_SPAWN, 0 }, + { "はねは゛し から", "From Drawbridge", "Von der Zugbruecke", "Depuis le Pont-levis", ENTR_HYRULE_FIELD_ON_BRIDGE_SPAWN, 0 }, + { "γ‚«γ‚«γƒͺコむら から", "From Kakariko Village", "Von Kakariko", "Depuis le Village Cocorico", ENTR_HYRULE_FIELD_STAIRS_EXIT, 0 }, + { "ソ゛ーラかわ から", "From Zora River", "Vom Zora-Fluss", "Depuis la Riviere Zora", ENTR_HYRULE_FIELD_RIVER_EXIT, 0 }, + { "γΎγ‚ˆγ„γγ‚‚γ‚Šγ€€γ‹γ‚‰", "From Lost Woods", "Von den verlorenen Waeldern", "Depuis les Bois Perdus", ENTR_HYRULE_FIELD_WOODED_EXIT, 0 }, + { "ハむγƒͺをこはん から", "From Lake Hylia", "Vom Hylia-See", "Depuis le Lac Hylia", ENTR_HYRULE_FIELD_FENCE_EXIT, 0 }, + { "γ‚±γ‚›γƒ«γƒˆγ‚›γγŸγ«γ€€γ‹γ‚‰", "From Gerudo Valley", "Vom Gerudotal", "Depuis la Vallee Gerudo", ENTR_HYRULE_FIELD_ROCKY_PATH, 0 }, + { "ロンロンほ゛くし゛ょう から", "From Lon Lon Ranch", "Von der Lon Lon-Farm", "Depuis le Ranch Lon Lon", ENTR_HYRULE_FIELD_CENTER_EXIT, 0 }, }}, - { " 2:Kokiri Forest", " 2:Kokiri-Wald", " 2:Foret Kokiri", Select_LoadGame, 9, { - { "From Links House", "Von Links Haus", "Depuis la Cabane de Link", ENTR_KOKIRI_FOREST_OUTSIDE_LINKS_HOUSE, 0 }, - { "From Bridge", "Von der Bruecke", "Depuis le Pont", ENTR_KOKIRI_FOREST_LOWER_EXIT, 0 }, - { "From Lost Woods", "Von den verlorenen Waeldern", "Depuis les Bois Perdus", ENTR_KOKIRI_FOREST_UPPER_EXIT, 0 }, - { "From Deku Tree", "Vom Deku-Baum", "Depuis l'Arbre Mojo", ENTR_KOKIRI_FOREST_OUTSIDE_DEKU_TREE, 0 }, - { "From Kokiri Shop", "Vom Kokiri-Laden", "Depuis la Boutique Kokiri", ENTR_KOKIRI_FOREST_OUTSIDE_SHOP, 0 }, - { "From Know-It-All Brothers House", "Vom Haus der Allwissenden Brueder", "Depuis la Cabane des Freres Je-Sais-Tout", ENTR_KOKIRI_FOREST_OUTSIDE_KNOW_IT_ALL_HOUSE, 0 }, - { "From Twins House", "Vom Haus der Zwillinge", "Depuis la Cabane des Jumeaux", ENTR_KOKIRI_FOREST_OUTSIDE_TWINS_HOUSE, 0 }, - { "From Midos House", "Von Midos Haus", "Depuis la Cabane du Grand Mido", ENTR_KOKIRI_FOREST_OUTSIDE_MIDOS_HOUSE, 0 }, - { "From Sarias House", "Von Salias Haus", "Depuis la Cabane de Saria", ENTR_KOKIRI_FOREST_OUTSIDE_SARIAS_HOUSE, 0 }, + { "2:γ‚³γ‚­γƒͺγγ‚‚γ‚Š", " 2:Kokiri Forest", " 2:Kokiri-Wald", " 2:Foret Kokiri", Select_LoadGame, 9, { + { "γƒͺンクγγŠγ†γ‘ から", "From Links House", "Von Links Haus", "Depuis la Cabane de Link", ENTR_KOKIRI_FOREST_OUTSIDE_LINKS_HOUSE, 0 }, + { "はし から", "From Bridge", "Von der Bruecke", "Depuis le Pont", ENTR_KOKIRI_FOREST_LOWER_EXIT, 0 }, + { "γΎγ‚ˆγ„γγ‚‚γ‚Šγ€€γ‹γ‚‰", "From Lost Woods", "Von den verlorenen Waeldern", "Depuis les Bois Perdus", ENTR_KOKIRI_FOREST_UPPER_EXIT, 0 }, + { "テ゛クγγγ‚΅γƒžγ€€γ‹γ‚‰", "From Deku Tree", "Vom Deku-Baum", "Depuis l'Arbre Mojo", ENTR_KOKIRI_FOREST_OUTSIDE_DEKU_TREE, 0 }, + { "γ‚³γ‚­γƒͺγγŠγΏγ›γ€€γ‹γ‚‰", "From Kokiri Shop", "Vom Kokiri-Laden", "Depuis la Boutique Kokiri", ENTR_KOKIRI_FOREST_OUTSIDE_SHOP, 0 }, + { "γ‚‚γγ—γ‚Šγγ‚‡γ†γŸγ‚›γ„γγŠγ†γ‘ から", "From Know-It-All Brothers House", "Vom Haus der Allwissenden Brueder", "Depuis la Cabane des Freres Je-Sais-Tout", ENTR_KOKIRI_FOREST_OUTSIDE_KNOW_IT_ALL_HOUSE, 0 }, + { "γ΅γŸγ“γ‚›γγŠγ†γ‘ から", "From Twins House", "Vom Haus der Zwillinge", "Depuis la Cabane des Jumeaux", ENTR_KOKIRI_FOREST_OUTSIDE_TWINS_HOUSE, 0 }, + { "γƒŸγƒˆγ‚›γ•γΎγγŠγ‚„しき から", "From Midos House", "Von Midos Haus", "Depuis la Cabane du Grand Mido", ENTR_KOKIRI_FOREST_OUTSIDE_MIDOS_HOUSE, 0 }, + { "γ‚΅γƒͺγ‚’γγŠγ†γ‘ から", "From Sarias House", "Von Salias Haus", "Depuis la Cabane de Saria", ENTR_KOKIRI_FOREST_OUTSIDE_SARIAS_HOUSE, 0 }, }}, - { " 3:Kokiri Buildings", " 3:Kokiri Gebaeude", " 3:Cabanes des Kokiris", Select_LoadGame, 6, { - { "Links Bed", "Links Bett", "Lit de Link", ENTR_LINKS_HOUSE_CHILD_SPAWN, 0 }, - { "Kokiri Shop", "Kokiri-Laden", "Boutique Kokiri", ENTR_KOKIRI_SHOP_0, 0 }, - { "Twins House", "Haus der Zwillinge", "Cabane des Jumeaux", ENTR_TWINS_HOUSE_0, 0 }, - { "Know-It-All Brothers House", "Haus der Allwissenden Brueder", "Cabane des Freres Je-Sais-Tout", ENTR_KNOW_IT_ALL_BROS_HOUSE_0, 0 }, - { "Midos House", "Midos Haus", "Cabane du Grand Mido", ENTR_MIDOS_HOUSE_0, 0 }, - { "Sarias House", "Salias Haus", "Cabane de Sara", ENTR_SARIAS_HOUSE_0, 0 }, + { "3:γ‚³γ‚­γƒͺγγŸγ¦γ‚‚γ", " 3:Kokiri Buildings", " 3:Kokiri Gebaeude", " 3:Cabanes des Kokiris", Select_LoadGame, 6, { + { "γƒͺンクγγŠγ†γ‘", "Links Bed", "Links Bett", "Lit de Link", ENTR_LINKS_HOUSE_CHILD_SPAWN, 0 }, + { "γ‚³γ‚­γƒͺγγŠγΏγ›", "Kokiri Shop", "Kokiri-Laden", "Boutique Kokiri", ENTR_KOKIRI_SHOP_0, 0 }, + { "γ΅γŸγ“γ‚›γγŠγ†γ‘", "Twins House", "Haus der Zwillinge", "Cabane des Jumeaux", ENTR_TWINS_HOUSE_0, 0 }, + { "γ‚‚γγ—γ‚Šγγ‚‡γ†γŸγ‚›γ„γγŠγ†γ‘", "Know-It-All Brothers House", "Haus der Allwissenden Brueder", "Cabane des Freres Je-Sais-Tout", ENTR_KNOW_IT_ALL_BROS_HOUSE_0, 0 }, + { "γƒŸγƒˆγ‚›γ•γΎγγŠγ‚„しき", "Midos House", "Midos Haus", "Cabane du Grand Mido", ENTR_MIDOS_HOUSE_0, 0 }, + { "γ‚΅γƒͺγ‚’γγŠγ†γ‘", "Sarias House", "Salias Haus", "Cabane de Sara", ENTR_SARIAS_HOUSE_0, 0 }, }}, - { " 4:Lost Woods", " 4:Verlorene Waelder", " 4:Bois Perdus", Select_LoadGame, 5, { - { "From Kokiri Forest", "Vom Kokiri-Wald", "Depuis la Foret Kokiri", ENTR_LOST_WOODS_SOUTH_EXIT, 0 }, - { "From Sacred Meadow", "Von der Waldlichtung", "Depuis le Bosquet Sacre", ENTR_LOST_WOODS_NORTH_EXIT, 0 }, - { "From Goron City", "Vom Goronia", "Depuis le Village Goron", ENTR_LOST_WOODS_TUNNEL_SHORTCUT, 0 }, - { "From Zora River", "Vom Zora-Fluss", "Depuis la Riviere Zora", ENTR_LOST_WOODS_UNDERWATER_SHORTCUT, 0 }, - { "Bridge", "Bruecke", "Pont", ENTR_LOST_WOODS_BRIDGE_EAST_EXIT, 0 }, + { "4:γΎγ‚ˆγ„γγ‚‚γ‚Š", " 4:Lost Woods", " 4:Verlorene Waelder", " 4:Bois Perdus", Select_LoadGame, 5, { + { "γ‚³γ‚­γƒͺγγ‚‚γ‚Šγ€€γ‹γ‚‰", "From Kokiri Forest", "Vom Kokiri-Wald", "Depuis la Foret Kokiri", ENTR_LOST_WOODS_SOUTH_EXIT, 0 }, + { "γ‚‚γ‚Šγγ›γ„いき から", "From Sacred Meadow", "Von der Waldlichtung", "Depuis le Bosquet Sacre", ENTR_LOST_WOODS_NORTH_EXIT, 0 }, + { "コ゛ロンシティ から", "From Goron City", "Vom Goronia", "Depuis le Village Goron", ENTR_LOST_WOODS_TUNNEL_SHORTCUT, 0 }, + { "ソ゛ーラかわ から", "From Zora River", "Vom Zora-Fluss", "Depuis la Riviere Zora", ENTR_LOST_WOODS_UNDERWATER_SHORTCUT, 0 }, + { "はし", "Bridge", "Bruecke", "Pont", ENTR_LOST_WOODS_BRIDGE_EAST_EXIT, 0 }, }}, - { " 5:Sacred Forest Meadow", " 5:Waldlichtung", " 5:Bosquet Sacre", Select_LoadGame, 3, { - { "From Lost Woods", "Von den Verlorenen Waeldern", "Depuis les Bois Perdus", ENTR_SACRED_FOREST_MEADOW_SOUTH_EXIT, 0 }, - { "From Forest Temple", "Vom Waldtempel", "Depuis le Temple de la Foret", ENTR_SACRED_FOREST_MEADOW_OUTSIDE_TEMPLE, 0 }, - { "Minuet of Forest Warp", "Menuett des Waldes Teleport", "Teleporteur du Menuet des Bois", ENTR_SACRED_FOREST_MEADOW_WARP_PAD, 0 }, + { "5:γ‚‚γ‚Šγγ›γ„いき", " 5:Sacred Forest Meadow", " 5:Waldlichtung", " 5:Bosquet Sacre", Select_LoadGame, 3, { + { "γΎγ‚ˆγ„γγ‚‚γ‚Šγ€€γ‹γ‚‰", "From Lost Woods", "Von den Verlorenen Waeldern", "Depuis les Bois Perdus", ENTR_SACRED_FOREST_MEADOW_SOUTH_EXIT, 0 }, + { "γ‚‚γ‚Šγγ—んて゛ん から", "From Forest Temple", "Vom Waldtempel", "Depuis le Temple de la Foret", ENTR_SACRED_FOREST_MEADOW_OUTSIDE_TEMPLE, 0 }, + { "γ‚‚γ‚Šγγƒ‘γƒŒγ‚¨γƒƒγƒˆγ€€γƒ―γƒΌγƒ•γ‚œ", "Minuet of Forest Warp", "Menuett des Waldes Teleport", "Teleporteur du Menuet des Bois", ENTR_SACRED_FOREST_MEADOW_WARP_PAD, 0 }, }}, - { " 6:Castle Town Entrance", " 6:Eingang zum Marktplatz", " 6:Entree du Bourg d'Hyrule", Select_LoadGame, 3, { - { "From Hyrule Field", "Von der Hylianischen Steppe", "Depuis la Plaine d'Hyrule", ENTR_MARKET_ENTRANCE_NEAR_GUARD_EXIT, 0 }, - { "From Market", "Vom Marktplatz", "Depuis la Place du Marche", ENTR_MARKET_ENTRANCE_NORTH_EXIT, 0 }, - { "From Pot House", "Vom Wachposten", "Depuis la Maison des Jarres", ENTR_MARKET_ENTRANCE_OUTSIDE_GUARD_HOUSE, 0 }, + { "6:γ—γ‚›γ‚‡γ†γ‹γΎγ‘γ€€γ„γ‚Šγγ‚›γ‘", " 6:Castle Town Entrance", " 6:Eingang zum Marktplatz", " 6:Entree du Bourg d'Hyrule", Select_LoadGame, 3, { + { "ハむラルへいけ゛ん から", "From Hyrule Field", "Von der Hylianischen Steppe", "Depuis la Plaine d'Hyrule", ENTR_MARKET_ENTRANCE_NEAR_GUARD_EXIT, 0 }, + { "し゛ょうかまけ から", "From Market", "Vom Marktplatz", "Depuis la Place du Marche", ENTR_MARKET_ENTRANCE_NORTH_EXIT, 0 }, + { "぀ほ゛γγ“や から", "From Pot House", "Vom Wachposten", "Depuis la Maison des Jarres", ENTR_MARKET_ENTRANCE_OUTSIDE_GUARD_HOUSE, 0 }, }}, - { " 7:Market", " 7:Marktplatz", " 7:Place du Marche", Select_LoadGame, 11, { - { "From Castle Town Entrance", "Vom Eingang zum Marktplatz", "Depuis l'Entree du Bourg d'Hyrule", ENTR_MARKET_SOUTH_EXIT, 0 }, - { "From Shooting Gallery", "Von der Schiessbude", "Depuis le Jeu d'adresse", ENTR_MARKET_DAY_OUTSIDE_SHOOTING_GALLERY, 0 }, - { "From Happy Mask Shop", "Vom Maskenhaendler", "Depuis la Foire aux Masques", ENTR_MARKET_DAY_OUTSIDE_HAPPY_MASK_SHOP, 0 }, - { "From Treasure Box Minigame", "Von der Truhenlotterie", "Depuis le Bowling Teigneux", ENTR_MARKET_DAY_OUTSIDE_TREASURE_BOX_SHOP, 0 }, - { "From Castle", "Vom Schloss", "Depuis le Chateau d'Hyrule", ENTR_MARKET_DAY_CASTLE_EXIT, 0 }, - { "From Temple of Time", "Von der Zitadelle der Zeit", "Depuis le Temple du Temps", ENTR_MARKET_DAY_TEMPLE_EXIT, 0 }, - { "From Back Alley (Right)", "Von der Seitenstrasse (Rechts)", "Depuis la Ruelle (Droite)", ENTR_MARKET_DAY_3, 0 }, - { "From Back Alley (Left)", "Von der Seitenstrasse (Links)", "Depuis la Ruelle (Gauche)", ENTR_MARKET_DAY_4, 0 }, - { "From Potion Shop", "Vom Magie-Laden", "Depuis l'Apothicaire", ENTR_MARKET_DAY_OUTSIDE_POTION_SHOP, 0 }, - { "From Bazaar Shop", "Vom Basar", "Depuis le Bazar", ENTR_MARKET_DAY_OUTSIDE_BAZAAR, 0 }, - { "From Bomchu Bowling Minigame", "Von der Minenbowlingbahn", "Depuis le Bowling Teigneux", ENTR_MARKET_DAY_OUTSIDE_BOMBCHU_BOWLING, 0 }, + { "7:し゛ょうかまけ", " 7:Market", " 7:Marktplatz", " 7:Place du Marche", Select_LoadGame, 11, { + { "γ—γ‚›γ‚‡γ†γ‹γΎγ‘γ€€γ„γ‚Šγγ‚›γ‘γ€€γ‹γ‚‰", "From Castle Town Entrance", "Vom Eingang zum Marktplatz", "Depuis l'Entree du Bourg d'Hyrule", ENTR_MARKET_SOUTH_EXIT, 0 }, + { "まとあてや から", "From Shooting Gallery", "Von der Schiessbude", "Depuis le Jeu d'adresse", ENTR_MARKET_DAY_OUTSIDE_SHOOTING_GALLERY, 0 }, + { "γŠγ‚γ‚“γ‚„γ€€γ‹γ‚‰", "From Happy Mask Shop", "Vom Maskenhaendler", "Depuis la Foire aux Masques", ENTR_MARKET_DAY_OUTSIDE_HAPPY_MASK_SHOP, 0 }, + { "γŸγ‹γ‚‰γ―γ‚›γ“γ‚„γ€€γ‹γ‚‰", "From Treasure Box Minigame", "Von der Truhenlotterie", "Depuis le Bowling Teigneux", ENTR_MARKET_DAY_OUTSIDE_TREASURE_BOX_SHOP, 0 }, + { "γŠγ—γ‚γ€€γ‹γ‚‰", "From Castle", "Vom Schloss", "Depuis le Chateau d'Hyrule", ENTR_MARKET_DAY_CASTLE_EXIT, 0 }, + { "ときγγ—んて゛ん から", "From Temple of Time", "Von der Zitadelle der Zeit", "Depuis le Temple du Temps", ENTR_MARKET_DAY_TEMPLE_EXIT, 0 }, + { "ろし゛うら から (みき゛)", "From Back Alley (Right)", "Von der Seitenstrasse (Rechts)", "Depuis la Ruelle (Droite)", ENTR_MARKET_DAY_3, 0 }, + { "ろし゛うら から (γ²γŸγ‚›γ‚Š)", "From Back Alley (Left)", "Von der Seitenstrasse (Links)", "Depuis la Ruelle (Gauche)", ENTR_MARKET_DAY_4, 0 }, + { "γγ™γ‚Šγ‚„γ€€γ‹γ‚‰", "From Potion Shop", "Vom Magie-Laden", "Depuis l'Apothicaire", ENTR_MARKET_DAY_OUTSIDE_POTION_SHOP, 0 }, + { "γͺンて゛もや から", "From Bazaar Shop", "Vom Basar", "Depuis le Bazar", ENTR_MARKET_DAY_OUTSIDE_BAZAAR, 0 }, + { "ホ゛ムチγƒ₯ウホ゛ウγƒͺンク゛から", "From Bomchu Bowling Minigame", "Von der Minenbowlingbahn", "Depuis le Bowling Teigneux", ENTR_MARKET_DAY_OUTSIDE_BOMBCHU_BOWLING, 0 }, }}, - { " 8:Castle Town Alley", " 8:Seitenstrasse", " 8:Ruelle du Bourg d'Hyrule", Select_LoadGame, 5, { - { "From Market (Right)", "Vom Marktplatz (Rechts)", "Depuis la Place du Marche (Droite)", ENTR_BACK_ALLEY_DAY_0, 0 }, - { "From Market (Left)", "Vom Marktplatz (Links)", "Depuis la Place du Marche (Gauche)", ENTR_BACK_ALLEY_DAY_1, 0 }, - { "From Alley House", "Vom Seitenstrassenhaus", "Depuis la Maison de la Ruelle", ENTR_BACK_ALLEY_DAY_OUTSIDE_MAN_IN_GREEN_HOUSE, 0 }, - { "From Dog House", "Vom Haus der Hunde-Dame", "Depuis la Maison du Chien", ENTR_BACK_ALLEY_DAY_4, 0 }, - { "From Bombchu Shop", "Vom Krabbelminen-Laden", "Depuis le Magasin de Missiles", ENTR_BACK_ALLEY_DAY_OUTSIDE_BOMBCHU_SHOP, 0 }, + { "8:し゛ょうかまけ ろし゛うら", " 8:Castle Town Alley", " 8:Seitenstrasse", " 8:Ruelle du Bourg d'Hyrule", Select_LoadGame, 5, { + { "し゛ょうかまけ から (みき゛)", "From Market (Right)", "Vom Marktplatz (Rechts)", "Depuis la Place du Marche (Droite)", ENTR_BACK_ALLEY_DAY_0, 0 }, + { "し゛ょうかまけ から (γ²γŸγ‚›γ‚Š)", "From Market (Left)", "Vom Marktplatz (Links)", "Depuis la Place du Marche (Gauche)", ENTR_BACK_ALLEY_DAY_1, 0 }, + { "ろし゛うらγγ„γˆγ€€γ‹γ‚‰", "From Alley House", "Vom Seitenstrassenhaus", "Depuis la Maison de la Ruelle", ENTR_BACK_ALLEY_DAY_OUTSIDE_MAN_IN_GREEN_HOUSE, 0 }, + { "いぬγγ„γˆγ€€γ‹γ‚‰", "From Dog House", "Vom Haus der Hunde-Dame", "Depuis la Maison du Chien", ENTR_BACK_ALLEY_DAY_4, 0 }, + { "ホ゛ムチγƒ₯ウや から", "From Bombchu Shop", "Vom Krabbelminen-Laden", "Depuis le Magasin de Missiles", ENTR_BACK_ALLEY_DAY_OUTSIDE_BOMBCHU_SHOP, 0 }, }}, - { " 9:Castle Town Buildings", " 9:Marktplatz Gebaeude", " 9:Batiments du Bourg d'Hyrule", Select_LoadGame, 10, { - { "Pot House", "Wachposten", "Maison des Jarres", ENTR_MARKET_GUARD_HOUSE_0, 0 }, - { "Shooting Gallery Minigame", "Schiessbude", "Jeu d'adresse", ENTR_SHOOTING_GALLERY_1, 0 }, - { "Treasure Box Minigame", "Truhenlotterie", "Chasse aux Tresors", ENTR_TREASURE_BOX_SHOP_0, 0 }, - { "Potion Shop", "Magie-Laden", "Apothicaire", ENTR_POTION_SHOP_MARKET_0, 0 }, - { "Bombchu Bowling Minigame", "Minenbowlingbahn", "Bowling Teigneux", ENTR_BOMBCHU_BOWLING_ALLEY_0, 0 }, - { "Bazaar Shop", "Basar", "Bazar", ENTR_BAZAAR_1, 0 }, - { "Happy Mask Shop", "Maskenhaendler", "Foire aux Masques", ENTR_HAPPY_MASK_SHOP_0, 0 }, - { "Bombchu Shop", "Krabbelminen-Laden", "Boutique de Missiles", ENTR_BOMBCHU_SHOP_1, 0 }, - { "Dog House", "Haus der Hunde-Dame", "Maison du Chien", ENTR_DOG_LADY_HOUSE_0, 0 }, - { "Alley House", "Seitenstrassenhaus", "Maison de la Ruelle", ENTR_BACK_ALLEY_MAN_IN_GREEN_HOUSE, 0 }, + { "9:し゛ょうかまけγγŸγ¦γ‚‚γ", " 9:Castle Town Buildings", " 9:Marktplatz Gebaeude", " 9:Batiments du Bourg d'Hyrule", Select_LoadGame, 10, { + { "぀ほ゛γγ“γ‚„", "Pot House", "Wachposten", "Maison des Jarres", ENTR_MARKET_GUARD_HOUSE_0, 0 }, + { "まとあてや", "Shooting Gallery Minigame", "Schiessbude", "Jeu d'adresse", ENTR_SHOOTING_GALLERY_1, 0 }, + { "γŸγ‹γ‚‰γ―γ‚›γ“γ‚„", "Treasure Box Minigame", "Truhenlotterie", "Chasse aux Tresors", ENTR_TREASURE_BOX_SHOP_0, 0 }, + { "γγ™γ‚Šγ‚„", "Potion Shop", "Magie-Laden", "Apothicaire", ENTR_POTION_SHOP_MARKET_0, 0 }, + { "ホ゛ムチγƒ₯ウホ゛ウγƒͺンク゛", "Bombchu Bowling Minigame", "Minenbowlingbahn", "Bowling Teigneux", ENTR_BOMBCHU_BOWLING_ALLEY_0, 0 }, + { "γͺンて゛もや", "Bazaar Shop", "Basar", "Bazar", ENTR_BAZAAR_1, 0 }, + { "γŠγ‚γ‚“γ‚„", "Happy Mask Shop", "Maskenhaendler", "Foire aux Masques", ENTR_HAPPY_MASK_SHOP_0, 0 }, + { "ホ゛ムチγƒ₯ウや", "Bombchu Shop", "Krabbelminen-Laden", "Boutique de Missiles", ENTR_BOMBCHU_SHOP_1, 0 }, + { "いぬγγ„γˆ", "Dog House", "Haus der Hunde-Dame", "Maison du Chien", ENTR_DOG_LADY_HOUSE_0, 0 }, + { "ろし゛うらγγ„γˆ", "Alley House", "Seitenstrassenhaus", "Maison de la Ruelle", ENTR_BACK_ALLEY_MAN_IN_GREEN_HOUSE, 0 }, }}, - { "10:Temple of Time", "10:Zitadelle der Zeit", "10:Temple du Temps", Select_LoadGame, 5, { - { "From Outside", "Von draussen", "Depuis l'Entree", ENTR_TEMPLE_OF_TIME_ENTRANCE, 0 }, - { "From Master Sword Pedestal", "Vom Podest des Master-Schwerts", "Depuis le Piedestal de l'Epee de Legende", ENTR_TEMPLE_OF_TIME_2, 0 }, - { "Prelude of Light Warp", "Kantate des Lichts Teleport", "Teleporteur du Prelude de la Lumiere", ENTR_TEMPLE_OF_TIME_WARP_PAD, 0 }, - { "Outside Temple of Time - From Market", "Vor der Zitadelle der Zeit - Vom Marktplatz", "Exterieur du Temple - Depuis la Place du Marche", ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_GOSSIP_STONE_EXIT, 0 }, - { "Outside Temple of Time - From Temple of Time", "Vor der Zitadelle der Zeit - Von der Zitadelle der Zeit", "Exterieur du Temple - Depuis le Temple", ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_OUTSIDE_TEMPLE, 0 }, + { "10:ときγγ—んて゛ん", "10:Temple of Time", "10:Zitadelle der Zeit", "10:Temple du Temps", Select_LoadGame, 5, { + { "そと から", "From Outside", "Von draussen", "Depuis l'Entree", ENTR_TEMPLE_OF_TIME_ENTRANCE, 0 }, + { "γƒžγ‚Ήγ‚ΏγƒΌγ‚½γƒΌγƒˆγ‚›γγŸγ‚›γ„さ゛ から", "From Master Sword Pedestal", "Vom Podest des Master-Schwerts", "Depuis le Piedestal de l'Epee de Legende", ENTR_TEMPLE_OF_TIME_2, 0 }, + { "γ²γ‹γ‚Šγγƒ•γ‚œγƒ¬γƒͺγƒ₯γƒΌγƒˆγ‚›γ€€γƒ―γƒΌγƒ•γ‚œ", "Prelude of Light Warp", "Kantate des Lichts Teleport", "Teleporteur du Prelude de la Lumiere", ENTR_TEMPLE_OF_TIME_WARP_PAD, 0 }, + { "ときγγ—γ‚“γ¦γ‚›γ‚“γΎγˆ - し゛ょうかまけ から", "Outside Temple of Time - From Market", "Vor der Zitadelle der Zeit - Vom Marktplatz", "Exterieur du Temple - Depuis la Place du Marche", ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_GOSSIP_STONE_EXIT, 0 }, + { "ときγγ—γ‚“γ¦γ‚›γ‚“γΎγˆ - ときγγ—んて゛ん から", "Outside Temple of Time - From Temple of Time", "Vor der Zitadelle der Zeit - Von der Zitadelle der Zeit", "Exterieur du Temple - Depuis le Temple", ENTR_TEMPLE_OF_TIME_EXTERIOR_DAY_OUTSIDE_TEMPLE, 0 }, }}, - { "11:Hyrule Castle", "11:Schloss Hyrule", "11:Chateau d'Hyrule", Select_LoadGame, 5, { - { "From Market", "Vom Marktplatz", "Depuis la Place du Marche", ENTR_CASTLE_GROUNDS_SOUTH_EXIT, 0 }, - { "From Castle Courtyard", "Vom Burghof", "Depuis la Cour du Chateau", ENTR_CASTLE_GROUNDS_RAINBOW_BRIDGE_EXIT, 0 }, - { "From Great Fairy", "Von der Feen-Quelle", "Depuis la Grande Fee", ENTR_CASTLE_GROUNDS_GREAT_FAIRY_EXIT, 0 }, - { "From Courtyard Guard Capture", "Von der Wachen-Festnahme", "Depuis la capture d'un Garde de la Cour", ENTR_HYRULE_CASTLE_3, 0 }, - { "Great Fairy", "Feen-Quelle", "Grande Fee", ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_DINS_HC, 0 }, + { "11:ハむラルし゛ょう", "11:Hyrule Castle", "11:Schloss Hyrule", "11:Chateau d'Hyrule", Select_LoadGame, 5, { + { "し゛ょうかまけ から", "From Market", "Vom Marktplatz", "Depuis la Place du Marche", ENTR_CASTLE_GROUNDS_SOUTH_EXIT, 0 }, + { "γͺかにわ から", "From Castle Courtyard", "Vom Burghof", "Depuis la Cour du Chateau", ENTR_CASTLE_GROUNDS_RAINBOW_BRIDGE_EXIT, 0 }, + { "γŸγ‚›γ„γ‚ˆγ†γ›γ„γ€€γ‹γ‚‰", "From Great Fairy", "Von der Feen-Quelle", "Depuis la Grande Fee", ENTR_CASTLE_GROUNDS_GREAT_FAIRY_EXIT, 0 }, + { "γ€γ‹γΎγ£γŸγ¨γ", "From Courtyard Guard Capture", "Von der Wachen-Festnahme", "Depuis la capture d'un Garde de la Cour", ENTR_HYRULE_CASTLE_3, 0 }, + { "γŸγ‚›γ„γ‚ˆγ†γ›γ„", "Great Fairy", "Feen-Quelle", "Grande Fee", ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_DINS_HC, 0 }, }}, - { "12:Hyrule Castle Courtyard", "12:Burghof", "12:Cour du Chateau", Select_LoadGame, 3, { - { "From Crawlspace", "Vom Kriechtunnel", "Depuis l'Entree", ENTR_CASTLE_COURTYARD_GUARDS_DAY_0, 0 }, - { "From Zelda", "Von Zelda", "Depuis Zelda", ENTR_CASTLE_COURTYARD_GUARDS_DAY_1, 0 }, - { "Zeldas Courtyard", "Zeldas Burghof", "Depuis la Cour de Zelda", ENTR_CASTLE_COURTYARD_ZELDA_0, 0 }, + { "12:ハむラルし゛ょう γͺかにわ", "12:Hyrule Castle Courtyard", "12:Burghof", "12:Cour du Chateau", Select_LoadGame, 3, { + { "けいさγͺあγͺ から", "From Crawlspace", "Vom Kriechtunnel", "Depuis l'Entree", ENTR_CASTLE_COURTYARD_GUARDS_DAY_0, 0 }, + { "セ゛ルタ゛ひめγγ€€γͺかにわ から", "From Zelda", "Von Zelda", "Depuis Zelda", ENTR_CASTLE_COURTYARD_GUARDS_DAY_1, 0 }, + { "セ゛ルタ゛ひめγγ€€γͺかにわ", "Zeldas Courtyard", "Zeldas Burghof", "Depuis la Cour de Zelda", ENTR_CASTLE_COURTYARD_ZELDA_0, 0 }, }}, - { "13:Lon Lon Ranch", "13:Lon Lon-Farm", "13:Ranch Lon Lon", Select_LoadGame, 5, { - { "From Hyrule Field", "Von der Hylianischen Steppe", "Depuis la Plaine d'Hyrule", ENTR_LON_LON_RANCH_ENTRANCE, 0 }, - { "From Ranch House", "Vom Farmhaus", "Depuis la Maison du Ranch", ENTR_LON_LON_RANCH_OUTSIDE_TALONS_HOUSE, 0 }, - { "From Stables", "Vom Stall", "Depuis l'Etable", ENTR_LON_LON_RANCH_OUTSIDE_STABLES, 0 }, - { "From Back Tower", "Vom Silo", "Depuis Silo du Ranch", ENTR_LON_LON_RANCH_OUTSIDE_TOWER, 0 }, - { "Epona Song Cutscene", "Eponas Song Sequenz", "Cinematique du Chant d'Epona", ENTR_LON_LON_RANCH_1, 0 }, + { "13:ロンロンほ゛くし゛ょう", "13:Lon Lon Ranch", "13:Lon Lon-Farm", "13:Ranch Lon Lon", Select_LoadGame, 5, { + { "ハむラルへいけ゛ん から", "From Hyrule Field", "Von der Hylianischen Steppe", "Depuis la Plaine d'Hyrule", ENTR_LON_LON_RANCH_ENTRANCE, 0 }, + { "タロンγγ„γˆγ€€γ‹γ‚‰", "From Ranch House", "Vom Farmhaus", "Depuis la Maison du Ranch", ENTR_LON_LON_RANCH_OUTSIDE_TALONS_HOUSE, 0 }, + { "うまこ゛や から", "From Stables", "Vom Stall", "Depuis l'Etable", ENTR_LON_LON_RANCH_OUTSIDE_STABLES, 0 }, + { "γͺや から", "From Back Tower", "Vom Silo", "Depuis Silo du Ranch", ENTR_LON_LON_RANCH_OUTSIDE_TOWER, 0 }, + { "γ‚¨γƒ›γ‚œγƒŠγγ†γŸγ€€γ‚«γƒƒγƒˆγ‚·γƒΌγƒ³", "Epona Song Cutscene", "Eponas Song Sequenz", "Cinematique du Chant d'Epona", ENTR_LON_LON_RANCH_1, 0 }, }}, - { "14:Lon Lon Ranch Buildings", "14:Lon Lon-Farm Gebaeude", "14:Batiments du Ranch Lon Lon", Select_LoadGame, 3, { - { "Ranch House", "Farmhaus", "Maison du Ranch", ENTR_LON_LON_BUILDINGS_TALONS_HOUSE, 0 }, - { "Stables", "Stall", "Etable du Ranch", ENTR_STABLE_0, 0 }, - { "Back Tower", "Silo", "Silo du Ranch", ENTR_LON_LON_BUILDINGS_TOWER, 0 }, + { "14:ロンロンほ゛くし゛ょうγγŸγ¦γ‚‚γ", "14:Lon Lon Ranch Buildings", "14:Lon Lon-Farm Gebaeude", "14:Batiments du Ranch Lon Lon", Select_LoadGame, 3, { + { "タロンγγ„γˆ", "Ranch House", "Farmhaus", "Maison du Ranch", ENTR_LON_LON_BUILDINGS_TALONS_HOUSE, 0 }, + { "うまこ゛や", "Stables", "Stall", "Etable du Ranch", ENTR_STABLE_0, 0 }, + { "γͺγ‚„", "Back Tower", "Silo", "Silo du Ranch", ENTR_LON_LON_BUILDINGS_TOWER, 0 }, }}, - { "15:Kakariko Village", "15:Kakariko", "15:Village Cocorico", Select_LoadGame, 15, { - { "From Hyrule Field", "Von der Hylianischen Steppe", "Depuis la Plaine d'Hyrule", ENTR_KAKARIKO_VILLAGE_FRONT_GATE, 0 }, - { "From Death Mountain", "Vom Todesberg", "Depuis le Mont du Peril", ENTR_KAKARIKO_VILLAGE_GUARD_GATE, 0 }, - { "From Graveyard", "Vom Friedhof", "Depuis le Cimetiere", ENTR_KAKARIKO_VILLAGE_SOUTHEAST_EXIT, 0 }, - { "From Bazaar", "Vom Basar", "Depuis le Bazar", ENTR_KAKARIKO_VILLAGE_OUTSIDE_BAZAAR, 0 }, - { "From Bottom of Well", "Vom Grund des Brunnens", "Depuis le Puits", ENTR_KAKARIKO_VILLAGE_OUTSIDE_BOTTOM_OF_THE_WELL, 0 }, - { "From Boss House", "Vom Haus des Bosses", "Depuis la Maison du Boss", ENTR_KAKARIKO_VILLAGE_OUTSIDE_CENTER_GUEST_HOUSE, 0 }, - { "From Potion Shop", "Vom Magie-Laden", "Depuis l'Apothicaire", ENTR_KAKARIKO_VILLAGE_OUTSIDE_POTION_SHOP_FRONT, 0 }, - { "From Potion Shop (Back Entrance)", "Vom Magie-Laden (Hintereingang)", "Depuis l'Apothicaire (Entree Arriere)", ENTR_KAKARIKO_VILLAGE_OUTSIDE_POTION_SHOP_BACK, 0 }, - { "From Grannys Potion Shop", "Von Omas Magie-Laden", "Depuis l'Apothicaire (Vieille Femme)", ENTR_KAKARIKO_VILLAGE_OUTSIDE_SHOP_GRANNY, 0 }, - { "From Impas House", "Von Impas Haus", "Depuis la Maison d'Impa", ENTR_KAKARIKO_VILLAGE_OUTSIDE_IMPAS_HOUSE_FRONT, 0 }, - { "From Impas House (Cow)", "Von Impas Haus (Kuh)", "Depuis la Maison d'Impa (Vache)", ENTR_KAKARIKO_VILLAGE_OUTSIDE_IMPAS_HOUSE_BACK, 0 }, - { "From Windmill", "Von der Windmuehle", "Depuis le Moulin", ENTR_KAKARIKO_VILLAGE_OUTSIDE_WINDMILL, 0 }, - { "From Shooting Gallery", "Von der Schiessbude", "Depuis le Jeu d'adresse", ENTR_KAKARIKO_VILLAGE_OUTSIDE_SHOOTING_GALLERY, 0 }, - { "From Skulltula House", "Vom Haus der Skulltulas", "Depuis la Maison des Skulltulas", ENTR_KAKARIKO_VILLAGE_OUTSIDE_SKULKLTULA_HOUSE, 0 }, - { "Owl Drop Spot from Death Mountain", "Eulen-Absetzpunkt vom Todesberg", "Point de chute du Hibou depuis le Mont du Peril", ENTR_KAKARIKO_VILLAGE_OWL_DROP, 0 }, + { "15:γ‚«γ‚«γƒͺコむら", "15:Kakariko Village", "15:Kakariko", "15:Village Cocorico", Select_LoadGame, 15, { + { "ハむラルへいけ゛ん から", "From Hyrule Field", "Von der Hylianischen Steppe", "Depuis la Plaine d'Hyrule", ENTR_KAKARIKO_VILLAGE_FRONT_GATE, 0 }, + { "γƒ†γ‚›γ‚Ήγƒžγ‚¦γƒ³γƒ†γƒ³γ€€γ‹γ‚‰", "From Death Mountain", "Vom Todesberg", "Depuis le Mont du Peril", ENTR_KAKARIKO_VILLAGE_GUARD_GATE, 0 }, + { "ほ゛け から", "From Graveyard", "Vom Friedhof", "Depuis le Cimetiere", ENTR_KAKARIKO_VILLAGE_SOUTHEAST_EXIT, 0 }, + { "γͺンて゛もや から", "From Bazaar", "Vom Basar", "Depuis le Bazar", ENTR_KAKARIKO_VILLAGE_OUTSIDE_BAZAAR, 0 }, + { "いと゛γγγ“ から", "From Bottom of Well", "Vom Grund des Brunnens", "Depuis le Puits", ENTR_KAKARIKO_VILLAGE_OUTSIDE_BOTTOM_OF_THE_WELL, 0 }, + { "γͺか゛や から", "From Boss House", "Vom Haus des Bosses", "Depuis la Maison du Boss", ENTR_KAKARIKO_VILLAGE_OUTSIDE_CENTER_GUEST_HOUSE, 0 }, + { "γγ™γ‚Šγ‚„γ€€γ‹γ‚‰", "From Potion Shop", "Vom Magie-Laden", "Depuis l'Apothicaire", ENTR_KAKARIKO_VILLAGE_OUTSIDE_POTION_SHOP_FRONT, 0 }, + { "γγ™γ‚Šγ‚„γ€€γ‹γ‚‰(うらく゛け)", "From Potion Shop (Back Entrance)", "Vom Magie-Laden (Hintereingang)", "Depuis l'Apothicaire (Entree Arriere)", ENTR_KAKARIKO_VILLAGE_OUTSIDE_POTION_SHOP_BACK, 0 }, + { "γ‚ͺハ゛ハ゛γγγ™γ‚Šγ‚„ から", "From Grannys Potion Shop", "Von Omas Magie-Laden", "Depuis l'Apothicaire (Vieille Femme)", ENTR_KAKARIKO_VILLAGE_OUTSIDE_SHOP_GRANNY, 0 }, + { "γ‚€γƒ³γƒγ‚œγγŠγ‚„しき から", "From Impas House", "Von Impas Haus", "Depuis la Maison d'Impa", ENTR_KAKARIKO_VILLAGE_OUTSIDE_IMPAS_HOUSE_FRONT, 0 }, + { "γ‚€γƒ³γƒγ‚œγγŠγ‚„しき(ウシ) から", "From Impas House (Cow)", "Von Impas Haus (Kuh)", "Depuis la Maison d'Impa (Vache)", ENTR_KAKARIKO_VILLAGE_OUTSIDE_IMPAS_HOUSE_BACK, 0 }, + { "ちうしゃ から", "From Windmill", "Von der Windmuehle", "Depuis le Moulin", ENTR_KAKARIKO_VILLAGE_OUTSIDE_WINDMILL, 0 }, + { "まとあてや から", "From Shooting Gallery", "Von der Schiessbude", "Depuis le Jeu d'adresse", ENTR_KAKARIKO_VILLAGE_OUTSIDE_SHOOTING_GALLERY, 0 }, + { "スタルチγƒ₯ラハウス から", "From Skulltula House", "Vom Haus der Skulltulas", "Depuis la Maison des Skulltulas", ENTR_KAKARIKO_VILLAGE_OUTSIDE_SKULKLTULA_HOUSE, 0 }, + { "γƒ†γ‚›γ‚Ήγƒžγ‚¦γƒ³γƒ†γƒ³γ‹γ‚‰γ€€γƒ•γ‚―γƒ­γ‚¦γ¦γ‚›γ€€γ¨γ‚“γ¦γ‚›γγ‚‹γ―γ‚›γ—γ‚‡", "Owl Drop Spot from Death Mountain", "Eulen-Absetzpunkt vom Todesberg", "Point de chute du Hibou depuis le Mont du Peril", ENTR_KAKARIKO_VILLAGE_OWL_DROP, 0 }, }}, - { "16:Kakariko Buildings", "16:Kakariko Gebaeude", "16:Batiments du Village Cocorico", Select_LoadGame, 9, { - { "Shooting Gallery Minigame", "Schiessbude", "Jeu d'adresse", ENTR_SHOOTING_GALLERY_0, 0 }, - { "Grannys Potion Shop", "Omas Magie-Laden", "Apothicaire (Vieille Femme)", ENTR_POTION_SHOP_GRANNY_0, 0 }, - { "Bazaar Shop", "Basar", "Bazar", ENTR_BAZAAR_0, 0 }, - { "Potion Shop", "Magie-Laden", "Apothicaire", ENTR_POTION_SHOP_KAKARIKO_FRONT, 0 }, - { "Impas House", "Impas Haus", "Maison d'Impa", ENTR_IMPAS_HOUSE_FRONT, 0 }, - { "Impas House (Near Cow)", "Impas Haus (Kuh)", "Maison d'Impa (Vache)", ENTR_IMPAS_HOUSE_BACK, 0 }, - { "Boss House", "Haus des Bosses", "Maison du Boss", ENTR_KAKARIKO_CENTER_GUEST_HOUSE_0, 0 }, - { "Windmill", "Windmuehle", "Moulin", ENTR_WINDMILL_AND_DAMPES_GRAVE_WINDMILL, 0 }, - { "Skulltula House", "Haus der Skulltulas", "Maison des Skulltulas", ENTR_HOUSE_OF_SKULLTULA_0, 0 }, + { "16:γ‚«γ‚«γƒͺコむらγγŸγ¦γ‚‚γ", "16:Kakariko Buildings", "16:Kakariko Gebaeude", "16:Batiments du Village Cocorico", Select_LoadGame, 9, { + { "まとあてや", "Shooting Gallery Minigame", "Schiessbude", "Jeu d'adresse", ENTR_SHOOTING_GALLERY_0, 0 }, + { "γ‚ͺハ゛ハ゛γγγ™γ‚Šγ‚„", "Grannys Potion Shop", "Omas Magie-Laden", "Apothicaire (Vieille Femme)", ENTR_POTION_SHOP_GRANNY_0, 0 }, + { "γͺンて゛もや", "Bazaar Shop", "Basar", "Bazar", ENTR_BAZAAR_0, 0 }, + { "γγ™γ‚Šγ‚„", "Potion Shop", "Magie-Laden", "Apothicaire", ENTR_POTION_SHOP_KAKARIKO_FRONT, 0 }, + { "γ‚€γƒ³γƒγ‚œγγŠγ‚„しき", "Impas House", "Impas Haus", "Maison d'Impa", ENTR_IMPAS_HOUSE_FRONT, 0 }, + { "γ‚€γƒ³γƒγ‚œγγŠγ‚„しき(ウシγγ‘かく)", "Impas House (Near Cow)", "Impas Haus (Kuh)", "Maison d'Impa (Vache)", ENTR_IMPAS_HOUSE_BACK, 0 }, + { "γͺか゛や", "Boss House", "Haus des Bosses", "Maison du Boss", ENTR_KAKARIKO_CENTER_GUEST_HOUSE_0, 0 }, + { "ちうしゃ", "Windmill", "Windmuehle", "Moulin", ENTR_WINDMILL_AND_DAMPES_GRAVE_WINDMILL, 0 }, + { "スタルチγƒ₯ラハウス", "Skulltula House", "Haus der Skulltulas", "Maison des Skulltulas", ENTR_HOUSE_OF_SKULLTULA_0, 0 }, }}, - { "17:Graveyard", "17:Friedhof", "17:Cimetiere", Select_LoadGame, 9, { - { "From Kakariko", "Von Kakariko", "Depuis l'Apothicaire", ENTR_GRAVEYARD_ENTRANCE, 0 }, - { "From Shadow Temple", "Vom Schattentempel", "Depuis le Temple de l'Ombre", ENTR_GRAVEYARD_OUTSIDE_TEMPLE, 0 }, - { "From Gravekeepers Hut", "Von der Huette des Totengraebers", "Depuis la Cabane du Fossoyeur", ENTR_GRAVEYARD_OUTSIDE_DAMPES_HUT, 0 }, - { "From Dampes Grave", "Von Boris' Grab", "Depuis la Tombe d'Igor", ENTR_GRAVEYARD_DAMPES_GRAVE_EXIT, 0 }, - { "From Shield Grave", "Vom Schild-Grab", "Depuis la Tombe au Bouclier", ENTR_GRAVEYARD_SHIELD_GRAVE_EXIT, 0 }, - { "From Redead Grave", "Vom Zombie-Grab", "Depuis la Tombe au Effrois", ENTR_GRAVEYARD_HEART_PIECE_GRAVE_EXIT, 0 }, - { "From Royal Familys Tomb", "Vom Koenigsgrab", "Depuis la Tombe Royale", ENTR_GRAVEYARD_ROYAL_TOMB_EXIT, 0 }, - { "Inside Dampe's Hut", "Huette des Totengraebers", "A l'interieur de la Cabane du Fossoyeur", ENTR_GRAVEKEEPERS_HUT_0, 0 }, - { "Nocturne of Shadow Warp", "Nocturne des Schattens Teleport", "Teleporteur du Nocturne de l'Ombre", ENTR_GRAVEYARD_WARP_PAD, 0 }, + { "17:ほ゛け", "17:Graveyard", "17:Friedhof", "17:Cimetiere", Select_LoadGame, 9, { + { "γ‚«γ‚«γƒͺコむら から", "From Kakariko", "Von Kakariko", "Depuis l'Apothicaire", ENTR_GRAVEYARD_ENTRANCE, 0 }, + { "やみγγ—んて゛ん から", "From Shadow Temple", "Vom Schattentempel", "Depuis le Temple de l'Ombre", ENTR_GRAVEYARD_OUTSIDE_TEMPLE, 0 }, + { "γ―γ‹γ‚‚γ‚Šγγ“や から", "From Gravekeepers Hut", "Von der Huette des Totengraebers", "Depuis la Cabane du Fossoyeur", ENTR_GRAVEYARD_OUTSIDE_DAMPES_HUT, 0 }, + { "γ‚Ώγ‚›γƒ³γƒ˜γ‚œγ‚€γγ―か から", "From Dampes Grave", "Von Boris' Grab", "Depuis la Tombe d'Igor", ENTR_GRAVEYARD_DAMPES_GRAVE_EXIT, 0 }, + { "たてγγ―か から", "From Shield Grave", "Vom Schild-Grab", "Depuis la Tombe au Bouclier", ENTR_GRAVEYARD_SHIELD_GRAVE_EXIT, 0 }, + { "γƒͺγƒΌγƒ†γ‚›γƒƒγƒˆγγ―か から", "From Redead Grave", "Vom Zombie-Grab", "Depuis la Tombe au Effrois", ENTR_GRAVEYARD_HEART_PIECE_GRAVE_EXIT, 0 }, + { "γŠγ†γ‘γγ―かあγͺ から", "From Royal Familys Tomb", "Vom Koenigsgrab", "Depuis la Tombe Royale", ENTR_GRAVEYARD_ROYAL_TOMB_EXIT, 0 }, + { "γ―γ‹γ‚‚γ‚Šγγ“γ‚„", "Inside Dampe's Hut", "Huette des Totengraebers", "A l'interieur de la Cabane du Fossoyeur", ENTR_GRAVEKEEPERS_HUT_0, 0 }, + { "やみγγƒŽγ‚―γ‚ΏγƒΌγƒ³γ€€γƒ―γƒΌγƒ•γ‚œ", "Nocturne of Shadow Warp", "Nocturne des Schattens Teleport", "Teleporteur du Nocturne de l'Ombre", ENTR_GRAVEYARD_WARP_PAD, 0 }, }}, - { "18:Graves", "18:Graeber", "18:Tombes", Select_LoadGame, 5, { - { "Dampes Grave Minigame", "Boris' Grab-Minispiel", "Tour du Cimetiere d'Igor", ENTR_WINDMILL_AND_DAMPES_GRAVE_GRAVE, 0 }, - { "Royal Familys Tomb", "Koenigsgrab", "Tombe Royale", ENTR_ROYAL_FAMILYS_TOMB_0, 0 }, - { "Royal Familys Tomb, Suns Song Cutscene", "Koenigsgrab, Hymne der Sonne Sequenz", "Tombe Royale, Cinematique du Chant du Soleil", ENTR_ROYAL_FAMILYS_TOMB_1, 0 }, - { "Treasure Chest Grave", "Schatzkisten Grab", "Tombe au Coffre", ENTR_GRAVE_WITH_FAIRYS_FOUNTAIN_0, 0 }, - { "ReDead Grave", "Zombie Grab", "Tombe au Effrois", ENTR_REDEAD_GRAVE_0, 0 }, + { "18:はかあγͺ", "18:Graves", "18:Graeber", "18:Tombes", Select_LoadGame, 5, { + { "γ‚Ώγ‚›γƒ³γƒ˜γ‚œγ‚€γγ―か", "Dampes Grave Minigame", "Boris' Grab-Minispiel", "Tour du Cimetiere d'Igor", ENTR_WINDMILL_AND_DAMPES_GRAVE_GRAVE, 0 }, + { "γŠγ†γ‘γγ―かあγͺ", "Royal Familys Tomb", "Koenigsgrab", "Tombe Royale", ENTR_ROYAL_FAMILYS_TOMB_0, 0 }, + { "γŠγ†γ‘γγ―かあγͺγ€€γŸγ„γ‚ˆγ†γγ†γŸγ‚«γƒƒγƒˆγ‚·γƒΌγƒ³", "Royal Familys Tomb, Suns Song Cutscene", "Koenigsgrab, Hymne der Sonne Sequenz", "Tombe Royale, Cinematique du Chant du Soleil", ENTR_ROYAL_FAMILYS_TOMB_1, 0 }, + { "γŸγ‹γ‚‰γ―γ‚›γ“γγ―かあγͺ", "Treasure Chest Grave", "Schatzkisten Grab", "Tombe au Coffre", ENTR_GRAVE_WITH_FAIRYS_FOUNTAIN_0, 0 }, + { "γƒͺγƒΌγƒ†γ‚›γƒƒγƒˆγγ―か", "ReDead Grave", "Zombie Grab", "Tombe au Effrois", ENTR_REDEAD_GRAVE_0, 0 }, }}, - { "19:Death Mountain Trail", "19:Gebirgspfad", "19:Mont du Peril", Select_LoadGame, 6, { - { "From Kakariko Village", "Von Kakariko", "Depuis le Village Cocorico", ENTR_DEATH_MOUNTAIN_TRAIL_BOTTOM_EXIT, 0 }, - { "From Goron City", "Von Goronia", "Depuis le Village Goron", ENTR_DEATH_MOUNTAIN_TRAIL_GC_EXIT, 0 }, - { "From Death Mountain Crater", "Vom Todeskrater", "Depuis le Cratere du Peril", ENTR_DEATH_MOUNTAIN_TRAIL_SUMMIT_EXIT, 0 }, - { "From Dodongos Cavern", "Von Dodongos Hoehle", "Depuis la Caverne Dodongo", ENTR_DEATH_MOUNTAIN_TRAIL_OUTSIDE_DODONGOS_CAVERN, 0 }, - { "From Great Fairy", "Von der Feen-Quelle", "Depuis la Grande Fee", ENTR_DEATH_MOUNTAIN_TRAIL_GREAT_FAIRY_EXIT, 0 }, - { "Great Fairy", "Feen-Quelle", "Grande Fee", ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_DMT, 0 }, + { "19:γƒ†γ‚›γ‚Ήγƒžγ‚¦γƒ³γƒ†γƒ³γ¨γ•γ‚›γ‚“γ¨γ‚›γ†", "19:Death Mountain Trail", "19:Gebirgspfad", "19:Mont du Peril", Select_LoadGame, 6, { + { "γ‚«γ‚«γƒͺコむら から", "From Kakariko Village", "Von Kakariko", "Depuis le Village Cocorico", ENTR_DEATH_MOUNTAIN_TRAIL_BOTTOM_EXIT, 0 }, + { "コ゛ロンシティ から", "From Goron City", "Von Goronia", "Depuis le Village Goron", ENTR_DEATH_MOUNTAIN_TRAIL_GC_EXIT, 0 }, + { "γƒ†γ‚›γ‚Ήγƒžγ‚¦γƒ³γƒ†γƒ³γ‹γ“γ†γ€€γ‹γ‚‰", "From Death Mountain Crater", "Vom Todeskrater", "Depuis le Cratere du Peril", ENTR_DEATH_MOUNTAIN_TRAIL_SUMMIT_EXIT, 0 }, + { "γƒˆγ‚›γƒˆγ‚›γƒ³γ‚³γ‚›γγ¨γ‚›γ†γγ€γ€€γ‹γ‚‰", "From Dodongos Cavern", "Von Dodongos Hoehle", "Depuis la Caverne Dodongo", ENTR_DEATH_MOUNTAIN_TRAIL_OUTSIDE_DODONGOS_CAVERN, 0 }, + { "γŸγ‚›γ„γ‚ˆγ†γ›γ„γ€€γ‹γ‚‰", "From Great Fairy", "Von der Feen-Quelle", "Depuis la Grande Fee", ENTR_DEATH_MOUNTAIN_TRAIL_GREAT_FAIRY_EXIT, 0 }, + { "γŸγ‚›γ„γ‚ˆγ†γ›γ„", "Great Fairy", "Feen-Quelle", "Grande Fee", ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_DMT, 0 }, }}, - { "20:Goron City", "20:Goronia", "20:Village Goron", Select_LoadGame, 5, { - { "From Death Mountain Trail", "Vom Gebirgspfad", "Depuis le Mont du Peril", ENTR_GORON_CITY_UPPER_EXIT, 0 }, - { "From Death Mountain Crater", "Vom Todeskrater", "Depuis le Cratere du Peril", ENTR_GORON_CITY_DARUNIA_ROOM_EXIT, 0 }, - { "From Goron City Shop", "Vom Goronen-Laden", "Depuis la Boutique Goron", ENTR_GORON_CITY_OUTSIDE_SHOP, 0 }, - { "From Lost Woods", "Von den Verlorenen Waeldern", "Depuis les Bois Perdus", ENTR_GORON_CITY_TUNNEL_SHORTCUT, 0 }, - { "Goron City Shop", "Goronen-Laden", "Boutique Goron", ENTR_GORON_SHOP_0, 0 }, + { "20:コ゛ロンシティ", "20:Goron City", "20:Goronia", "20:Village Goron", Select_LoadGame, 5, { + { "γƒ†γ‚›γ‚Ήγƒžγ‚¦γƒ³γƒ†γƒ³γ¨γ•γ‚›γ‚“γ¨γ‚›γ†γ€€γ‹γ‚‰", "From Death Mountain Trail", "Vom Gebirgspfad", "Depuis le Mont du Peril", ENTR_GORON_CITY_UPPER_EXIT, 0 }, + { "γƒ†γ‚›γ‚Ήγƒžγ‚¦γƒ³γƒ†γƒ³γ‹γ“γ†γ€€γ‹γ‚‰", "From Death Mountain Crater", "Vom Todeskrater", "Depuis le Cratere du Peril", ENTR_GORON_CITY_DARUNIA_ROOM_EXIT, 0 }, + { "コ゛ロンγγŠγΏγ›γ€€γ‹γ‚‰", "From Goron City Shop", "Vom Goronen-Laden", "Depuis la Boutique Goron", ENTR_GORON_CITY_OUTSIDE_SHOP, 0 }, + { "γΎγ‚ˆγ„γγ‚‚γ‚Šγ€€γ‹γ‚‰", "From Lost Woods", "Von den Verlorenen Waeldern", "Depuis les Bois Perdus", ENTR_GORON_CITY_TUNNEL_SHORTCUT, 0 }, + { "コ゛ロンγγŠγΏγ›", "Goron City Shop", "Goronen-Laden", "Boutique Goron", ENTR_GORON_SHOP_0, 0 }, }}, - { "21:Death Mountain Crater", "21:Todeskrater", "21:Cratere du Peril", Select_LoadGame, 6, { - { "From Death Mountain Trail", "Vom Gebirgspfad", "Depuis le Mont du Peril", ENTR_DEATH_MOUNTAIN_CRATER_UPPER_EXIT, 0 }, - { "From Goron City", "Von Goronia", "Depuis le Village Goron", ENTR_DEATH_MOUNTAIN_CRATER_GC_EXIT, 0 }, - { "From Fire Temple", "Vom Feuertempel", "Depuis le Temple du Feu", ENTR_DEATH_MOUNTAIN_CRATER_OUTSIDE_TEMPLE, 0 }, - { "From Fairy Fountain", "Von der Feen-Quelle", "Depuis la Fontaine des Fees", ENTR_DEATH_MOUNTAIN_CRATER_GREAT_FAIRY_EXIT, 0 }, - { "Great Fairy", "Feen-Quelle", "Depuis la Grande Fee", ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_DMC, 0 }, - { "Bolero of Fire Warp", "Bolero des Feuers Teleport", "Teleporteur du Bolero du Feu", ENTR_DEATH_MOUNTAIN_CRATER_WARP_PAD, 0 }, + { "21:γƒ†γ‚›γ‚Ήγƒžγ‚¦γƒ³γƒ†γƒ³γ‹γ“γ†", "21:Death Mountain Crater", "21:Todeskrater", "21:Cratere du Peril", Select_LoadGame, 6, { + { "γƒ†γ‚›γ‚Ήγƒžγ‚¦γƒ³γƒ†γƒ³γ¨γ•γ‚›γ‚“γ¨γ‚›γ†γ€€γ‹γ‚‰", "From Death Mountain Trail", "Vom Gebirgspfad", "Depuis le Mont du Peril", ENTR_DEATH_MOUNTAIN_CRATER_UPPER_EXIT, 0 }, + { "コ゛ロンシティ から", "From Goron City", "Von Goronia", "Depuis le Village Goron", ENTR_DEATH_MOUNTAIN_CRATER_GC_EXIT, 0 }, + { "ほγγŠγγ—んて゛ん から", "From Fire Temple", "Vom Feuertempel", "Depuis le Temple du Feu", ENTR_DEATH_MOUNTAIN_CRATER_OUTSIDE_TEMPLE, 0 }, + { "γŸγ‚›γ„γ‚ˆγ†γ›γ„γ€€γ‹γ‚‰", "From Fairy Fountain", "Von der Feen-Quelle", "Depuis la Fontaine des Fees", ENTR_DEATH_MOUNTAIN_CRATER_GREAT_FAIRY_EXIT, 0 }, + { "γŸγ‚›γ„γ‚ˆγ†γ›γ„", "Great Fairy", "Feen-Quelle", "Depuis la Grande Fee", ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_DMC, 0 }, + { "ほγγŠγγƒ›γ‚›γƒ¬γƒ­γ€€γƒ―γƒΌγƒ•γ‚œ", "Bolero of Fire Warp", "Bolero des Feuers Teleport", "Teleporteur du Bolero du Feu", ENTR_DEATH_MOUNTAIN_CRATER_WARP_PAD, 0 }, }}, - { "22:Zora River", "22:Zora-Fluss", "22:Riviere Zora", Select_LoadGame, 3, { - { "From Hyrule Field", "Von der Hylianischen Steppe", "Depuis la Plaine d'Hyrule", ENTR_ZORAS_RIVER_WEST_EXIT, 0 }, - { "From Zoras Domain", "Von Zoras Reich", "Depuis le Domaine Zora", ENTR_ZORAS_RIVER_WATERFALL_EXIT, 0 }, - { "From Lost Woods", "Von den Verlorenen Waeldern", "Depuis les Bois Perdus", ENTR_ZORAS_RIVER_UNDERWATER_SHORTCUT, 0 }, + { "22:ソ゛ーラかわ", "22:Zora River", "22:Zora-Fluss", "22:Riviere Zora", Select_LoadGame, 3, { + { "ハむラルへいけ゛ん から", "From Hyrule Field", "Von der Hylianischen Steppe", "Depuis la Plaine d'Hyrule", ENTR_ZORAS_RIVER_WEST_EXIT, 0 }, + { "ソ゛ーラγγ•と から", "From Zoras Domain", "Von Zoras Reich", "Depuis le Domaine Zora", ENTR_ZORAS_RIVER_WATERFALL_EXIT, 0 }, + { "γΎγ‚ˆγ„γγ‚‚γ‚Šγ€€γ‹γ‚‰", "From Lost Woods", "Von den Verlorenen Waeldern", "Depuis les Bois Perdus", ENTR_ZORAS_RIVER_UNDERWATER_SHORTCUT, 0 }, }}, - { "23:Zoras Domain", "23:Zoras Reich", "23:Domaine Zora", Select_LoadGame, 5, { - { "From Zora River", "Vom Zora-Fluss", "Depuis la Riviere Zora", ENTR_ZORAS_DOMAIN_ENTRANCE, 0 }, - { "From Zoras Fountain", "Von Zoras Quelle", "Depuis la Fontaine Zora", ENTR_ZORAS_DOMAIN_KING_ZORA_EXIT, 0 }, - { "From Lake Hylia", "Vom Hylia-See", "Depuis le Lac Hylia", ENTR_ZORAS_DOMAIN_UNDERWATER_SHORTCUT, 0 }, - { "From Zora Shop", "Vom Zora-Laden", "Depuis la Boutique Zora", ENTR_ZORAS_DOMAIN_OUTSIDE_SHOP, 0 }, - { "Zora Shop", "Zora-Laden", "Boutique Zora", ENTR_ZORA_SHOP_0, 0 }, + { "23:ソ゛ーラγγ•と", "23:Zoras Domain", "23:Zoras Reich", "23:Domaine Zora", Select_LoadGame, 5, { + { "ソ゛ーラかわ から", "From Zora River", "Vom Zora-Fluss", "Depuis la Riviere Zora", ENTR_ZORAS_DOMAIN_ENTRANCE, 0 }, + { "ソ゛ーラγγ„す゛み から", "From Zoras Fountain", "Von Zoras Quelle", "Depuis la Fontaine Zora", ENTR_ZORAS_DOMAIN_KING_ZORA_EXIT, 0 }, + { "ハむγƒͺをこはん から", "From Lake Hylia", "Vom Hylia-See", "Depuis le Lac Hylia", ENTR_ZORAS_DOMAIN_UNDERWATER_SHORTCUT, 0 }, + { "ソ゛ーラγγŠγΏγ›γ€€γ‹γ‚‰", "From Zora Shop", "Vom Zora-Laden", "Depuis la Boutique Zora", ENTR_ZORAS_DOMAIN_OUTSIDE_SHOP, 0 }, + { "ソ゛ーラγγŠγΏγ›", "Zora Shop", "Zora-Laden", "Boutique Zora", ENTR_ZORA_SHOP_0, 0 }, }}, - { "24:Zoras Fountain", "24:Zoras Quelle", "24:Fontaine Zora", Select_LoadGame, 5, { - { "From Zoras Domain", "Von Zoras Reich", "Depuis le Domaine Zora", ENTR_ZORAS_FOUNTAIN_TUNNEL_EXIT, 0 }, - { "From Jabu Jabu", "Von Jabu-Jabu", "Depuis Jabu-Jabu", ENTR_ZORAS_FOUNTAIN_OUTSIDE_JABU_JABU, 0 }, - { "From Ice Cavern", "Von der Eishoehle", "Depuis la Caverne Polaire", ENTR_ZORAS_FOUNTAIN_OUTSIDE_ICE_CAVERN, 0 }, - { "From Fairy Fountain", "Von der Feen-Quelle", "Depuis la Fontaine des Fees", ENTR_ZORAS_FOUNTAIN_OUTSIDE_GREAT_FAIRY, 0 }, - { "Great Fairy", "Feen-Quelle", "Grande Fee", ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_FARORES_ZF, 0 }, + { "24:ソ゛ーラγγ„す゛み", "24:Zoras Fountain", "24:Zoras Quelle", "24:Fontaine Zora", Select_LoadGame, 5, { + { "ソ゛ーラγγ•と から", "From Zoras Domain", "Von Zoras Reich", "Depuis le Domaine Zora", ENTR_ZORAS_FOUNTAIN_TUNNEL_EXIT, 0 }, + { "シ゛ャフ゛シ゛ャフ゛さま から", "From Jabu Jabu", "Von Jabu-Jabu", "Depuis Jabu-Jabu", ENTR_ZORAS_FOUNTAIN_OUTSIDE_JABU_JABU, 0 }, + { "γ“γŠγ‚Šγγ¨γ‚›γ†γγ€γ€€γ‹γ‚‰", "From Ice Cavern", "Von der Eishoehle", "Depuis la Caverne Polaire", ENTR_ZORAS_FOUNTAIN_OUTSIDE_ICE_CAVERN, 0 }, + { "γŸγ‚›γ„γ‚ˆγ†γ›γ„γ€€γ‹γ‚‰", "From Fairy Fountain", "Von der Feen-Quelle", "Depuis la Fontaine des Fees", ENTR_ZORAS_FOUNTAIN_OUTSIDE_GREAT_FAIRY, 0 }, + { "γŸγ‚›γ„γ‚ˆγ†γ›γ„", "Great Fairy", "Feen-Quelle", "Grande Fee", ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_FARORES_ZF, 0 }, }}, - { "25:Lake Hylia", "25:Hylia-See", "25:Lac Hylia", Select_LoadGame, 7, { - { "From Hyrule Field", "Von der Hylianischen Steppe", "Depuis la Plaine d'Hyrule", ENTR_LAKE_HYLIA_NORTH_EXIT, 0 }, - { "From Gerudo Valley", "Vom Gerudotal", "Depuis la Vallee Gerudo", ENTR_LAKE_HYLIA_RIVER_EXIT, 0 }, - { "From Water Temple", "Vom Wassertempel", "Depuis le Temple de l'Eau", ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE, 0 }, - { "From Fishing Pond", "Vom Fischweiher", "Depuis l'Etang", ENTR_LAKE_HYLIA_OUTSIDE_FISHING_POND, 0 }, - { "From Laboratory", "Vom Laboratorium", "Depuis le Laboratoire du Lac", ENTR_LAKE_HYLIA_OUTSIDE_LAB, 0 }, - { "From Zoras Domain", "Von Zoras Reich", "Depuis le Domaine Zora", ENTR_LAKE_HYLIA_UNDERWATER_SHORTCUT, 0 }, - { "Serenade Of Water Warp", "Serenade des Wassers Teleport", "Teleporteur de la Serenade de l'Eau", ENTR_LAKE_HYLIA_WARP_PAD, 0 }, + { "25:ハむγƒͺをこはん", "25:Lake Hylia", "25:Hylia-See", "25:Lac Hylia", Select_LoadGame, 7, { + { "ハむラルへいけ゛ん から", "From Hyrule Field", "Von der Hylianischen Steppe", "Depuis la Plaine d'Hyrule", ENTR_LAKE_HYLIA_NORTH_EXIT, 0 }, + { "γ‚±γ‚›γƒ«γƒˆγ‚›γγŸγ«γ€€γ‹γ‚‰", "From Gerudo Valley", "Vom Gerudotal", "Depuis la Vallee Gerudo", ENTR_LAKE_HYLIA_RIVER_EXIT, 0 }, + { "みす゛γγ—んて゛ん から", "From Water Temple", "Vom Wassertempel", "Depuis le Temple de l'Eau", ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE, 0 }, + { "γ€γ‚Šγ»γ‚›γ‚Šγ€€γ‹γ‚‰", "From Fishing Pond", "Vom Fischweiher", "Depuis l'Etang", ENTR_LAKE_HYLIA_OUTSIDE_FISHING_POND, 0 }, + { "みす゛うみけんきゅうし゛ょ から", "From Laboratory", "Vom Laboratorium", "Depuis le Laboratoire du Lac", ENTR_LAKE_HYLIA_OUTSIDE_LAB, 0 }, + { "ソ゛ーラγγ•と から", "From Zoras Domain", "Von Zoras Reich", "Depuis le Domaine Zora", ENTR_LAKE_HYLIA_UNDERWATER_SHORTCUT, 0 }, + { "みす゛γγ‚»γƒ¬γƒŠγƒΌγƒ†γ‚›γ€€γƒ―γƒΌγƒ•γ‚œ", "Serenade Of Water Warp", "Serenade des Wassers Teleport", "Teleporteur de la Serenade de l'Eau", ENTR_LAKE_HYLIA_WARP_PAD, 0 }, }}, - { "26:Lake Hylia Buildings", "26:Hylia-See Gebaeude", "26:Batiments du Lac Hylia", Select_LoadGame, 2, { - { "Laboratory", "Laboratorium", "Laboratoire du Lac", ENTR_LAKESIDE_LABORATORY_0, 0 }, - { "Fishing Pond Minigame", "Fischweiher", "Etang", ENTR_FISHING_POND_0, 0 }, + { "26:ハむγƒͺをこはんγγŸγ¦γ‚‚γ", "26:Lake Hylia Buildings", "26:Hylia-See Gebaeude", "26:Batiments du Lac Hylia", Select_LoadGame, 2, { + { "みす゛うみけんきゅうし゛ょ", "Laboratory", "Laboratorium", "Laboratoire du Lac", ENTR_LAKESIDE_LABORATORY_0, 0 }, + { "γ€γ‚Šγ»γ‚›γ‚Š", "Fishing Pond Minigame", "Fischweiher", "Etang", ENTR_FISHING_POND_0, 0 }, }}, - { "27:Gerudo Valley", "27:Gerudotal", "27:Vallee Gerudo", Select_LoadGame, 5, { - { "From Hyrule Field", "Von der Hylianischen Steppe", "Depuis la Plaine d'Hyrule", ENTR_GERUDO_VALLEY_EAST_EXIT, 0 }, - { "From Gerudo Fortress", "Von der Gerudo-Festung", "Depuis la Forteresse Gerudo", ENTR_GERUDO_VALLEY_WEST_EXIT, 0 }, - { "From Carpenter's Tent", "Vom Zelt der Zimmerleute", "Depuis la Tente du Charpentier", ENTR_GERUDO_VALLEY_OUTSIDE_TENT, 0 }, - { "Carpenter's Tent/ Running Man Minigame", "Zelt der Zimmerleute/ Rennlaeufer Minispiel", "Tente du Charpentier/ Marathonien", ENTR_CARPENTERS_TENT_0, 0 }, - { "Thrown out of Fortress", "Aus der Festung geworfen", "Expulse de la Forteresse", ENTR_GERUDO_VALLEY_1, 0 }, + { "27:γ‚±γ‚›γƒ«γƒˆγ‚›γγŸγ«", "27:Gerudo Valley", "27:Gerudotal", "27:Vallee Gerudo", Select_LoadGame, 5, { + { "ハむラルへいけ゛ん から", "From Hyrule Field", "Von der Hylianischen Steppe", "Depuis la Plaine d'Hyrule", ENTR_GERUDO_VALLEY_EAST_EXIT, 0 }, + { "γ‚±γ‚›γƒ«γƒˆγ‚›γγ¨γ‚Šγ¦γ‚›γ€€γ‹γ‚‰", "From Gerudo Fortress", "Von der Gerudo-Festung", "Depuis la Forteresse Gerudo", ENTR_GERUDO_VALLEY_WEST_EXIT, 0 }, + { "γŸγ‚›γ„γγγƒ†γƒ³γƒˆγ€€γ‹γ‚‰", "From Carpenter's Tent", "Vom Zelt der Zimmerleute", "Depuis la Tente du Charpentier", ENTR_GERUDO_VALLEY_OUTSIDE_TENT, 0 }, + { "γŸγ‚›γ„γγγƒ†γƒ³γƒˆ/γƒžγƒ©γ‚½γƒ³γƒžγƒ³γƒŸγƒ‹γ‚±γ‚›γƒΌγƒ ", "Carpenter's Tent/ Running Man Minigame", "Zelt der Zimmerleute/ Rennlaeufer Minispiel", "Tente du Charpentier/ Marathonien", ENTR_CARPENTERS_TENT_0, 0 }, + { "γ¨γ‚Šγ¦γ‚›γ‹γ‚‰γ»γ†γ‚ŠγŸγ‚›γ•γ‚ŒγŸγ¨γ", "Thrown out of Fortress", "Aus der Festung geworfen", "Expulse de la Forteresse", ENTR_GERUDO_VALLEY_1, 0 }, }}, - { "28:Gerudo Fortress", "28:Gerudo-Festung", "28:Forteresse Gerudo", Select_LoadGame, 18, { - { "From Gerudo Valley", "Vom Gerudotal", "Depuis la Vallee Gerudo", ENTR_GERUDOS_FORTRESS_EAST_EXIT, 0 }, - { "From Gerudo Training Ground", "Von der Gerudo-Trainingsarena", "Depuis le Gymnase Gerudo", ENTR_GERUDOS_FORTRESS_OUTSIDE_GERUDO_TRAINING_GROUND, 0 }, - { "From Haunted Wasteland", "Von der Gespensterwueste", "Depuis le Desert Hante", ENTR_GERUDOS_FORTRESS_GATE_EXIT, 0 }, - { "Horseback Riding Minigame", "Bogen zu Pferde Minispiel", "Archerie Montee", ENTR_GERUDOS_FORTRESS_16, 0 }, - { "Gerudo Fortress Jail", "Gerudo-Festung Gefaengnis", "Prison de la Forteresse Gerudo", ENTR_GERUDOS_FORTRESS_17, 0 }, - { "From Thieves Hideout (1)", "Vom Diebesversteck (1)", "Depuis le Repaire des Voleurs (1)", ENTR_GERUDOS_FORTRESS_1, 0 }, - { "From Thieves Hideout (2)", "Vom Diebesversteck (2)", "Depuis le Repaire des Voleurs (2)", ENTR_GERUDOS_FORTRESS_2, 0 }, - { "From Thieves Hideout (3)", "Vom Diebesversteck (3)", "Depuis le Repaire des Voleurs (3)", ENTR_GERUDOS_FORTRESS_3, 0 }, - { "From Thieves Hideout (4)", "Vom Diebesversteck (4)", "Depuis le Repaire des Voleurs (4)", ENTR_GERUDOS_FORTRESS_4, 0 }, - { "From Thieves Hideout (5)", "Vom Diebesversteck (5)", "Depuis le Repaire des Voleurs (5)", ENTR_GERUDOS_FORTRESS_5, 0 }, - { "From Thieves Hideout (6)", "Vom Diebesversteck (6)", "Depuis le Repaire des Voleurs (6)", ENTR_GERUDOS_FORTRESS_6, 0 }, - { "From Thieves Hideout (7)", "Vom Diebesversteck (7)", "Depuis le Repaire des Voleurs (7)", ENTR_GERUDOS_FORTRESS_7, 0 }, - { "From Thieves Hideout (8)", "Vom Diebesversteck (8)", "Depuis le Repaire des Voleurs (8)", ENTR_GERUDOS_FORTRESS_8, 0 }, - { "From Thieves Hideout (9)", "Vom Diebesversteck (9)", "Depuis le Repaire des Voleurs (9)", ENTR_GERUDOS_FORTRESS_9, 0 }, - { "From Thieves Hideout (10)", "Vom Diebesversteck (10)", "Depuis le Repaire des Voleurs (10)", ENTR_GERUDOS_FORTRESS_10, 0 }, - { "From Thieves Hideout (11)", "Vom Diebesversteck (11)", "Depuis le Repaire des Voleurs (11)", ENTR_GERUDOS_FORTRESS_11, 0 }, - { "From Thieves Hideout (12)", "Vom Diebesversteck (12)", "Depuis le Repaire des Voleurs (12)", ENTR_GERUDOS_FORTRESS_12, 0 }, - { "From Thieves Hideout (13)", "Vom Diebesversteck (13)", "Depuis le Repaire des Voleurs (13)", ENTR_GERUDOS_FORTRESS_13, 0 }, + { "28:γ‚±γ‚›γƒ«γƒˆγ‚›γγ¨γ‚Šγ¦γ‚›", "28:Gerudo Fortress", "28:Gerudo-Festung", "28:Forteresse Gerudo", Select_LoadGame, 18, { + { "γ‚±γ‚›γƒ«γƒˆγ‚›γγŸγ«γ€€γ‹γ‚‰", "From Gerudo Valley", "Vom Gerudotal", "Depuis la Vallee Gerudo", ENTR_GERUDOS_FORTRESS_EAST_EXIT, 0 }, + { "γ‚±γ‚›γƒ«γƒˆγ‚›γγ—γ‚…γ†γ‚Œγ‚“γ—γ‚›γ‚‡γ†γ€€γ‹γ‚‰", "From Gerudo Training Ground", "Von der Gerudo-Trainingsarena", "Depuis le Gymnase Gerudo", ENTR_GERUDOS_FORTRESS_OUTSIDE_GERUDO_TRAINING_GROUND, 0 }, + { "γ‘γ‚›γ‚“γˆγ„γγ•は゛く から", "From Haunted Wasteland", "Von der Gespensterwueste", "Depuis le Desert Hante", ENTR_GERUDOS_FORTRESS_GATE_EXIT, 0 }, + { "やち゛さめ", "Horseback Riding Minigame", "Bogen zu Pferde Minispiel", "Archerie Montee", ENTR_GERUDOS_FORTRESS_16, 0 }, + { "ろうや", "Gerudo Fortress Jail", "Gerudo-Festung Gefaengnis", "Prison de la Forteresse Gerudo", ENTR_GERUDOS_FORTRESS_17, 0 }, + { "γ‚’γ‚·γ‚›γƒˆγ€€γ‹γ‚‰(1)", "From Thieves Hideout (1)", "Vom Diebesversteck (1)", "Depuis le Repaire des Voleurs (1)", ENTR_GERUDOS_FORTRESS_1, 0 }, + { "γ‚’γ‚·γ‚›γƒˆγ€€γ‹γ‚‰(2)", "From Thieves Hideout (2)", "Vom Diebesversteck (2)", "Depuis le Repaire des Voleurs (2)", ENTR_GERUDOS_FORTRESS_2, 0 }, + { "γ‚’γ‚·γ‚›γƒˆγ€€γ‹γ‚‰(3)", "From Thieves Hideout (3)", "Vom Diebesversteck (3)", "Depuis le Repaire des Voleurs (3)", ENTR_GERUDOS_FORTRESS_3, 0 }, + { "γ‚’γ‚·γ‚›γƒˆγ€€γ‹γ‚‰(4)", "From Thieves Hideout (4)", "Vom Diebesversteck (4)", "Depuis le Repaire des Voleurs (4)", ENTR_GERUDOS_FORTRESS_4, 0 }, + { "γ‚’γ‚·γ‚›γƒˆγ€€γ‹γ‚‰(5)", "From Thieves Hideout (5)", "Vom Diebesversteck (5)", "Depuis le Repaire des Voleurs (5)", ENTR_GERUDOS_FORTRESS_5, 0 }, + { "γ‚’γ‚·γ‚›γƒˆγ€€γ‹γ‚‰(6)", "From Thieves Hideout (6)", "Vom Diebesversteck (6)", "Depuis le Repaire des Voleurs (6)", ENTR_GERUDOS_FORTRESS_6, 0 }, + { "γ‚’γ‚·γ‚›γƒˆγ€€γ‹γ‚‰(7)", "From Thieves Hideout (7)", "Vom Diebesversteck (7)", "Depuis le Repaire des Voleurs (7)", ENTR_GERUDOS_FORTRESS_7, 0 }, + { "γ‚’γ‚·γ‚›γƒˆγ€€γ‹γ‚‰(8)", "From Thieves Hideout (8)", "Vom Diebesversteck (8)", "Depuis le Repaire des Voleurs (8)", ENTR_GERUDOS_FORTRESS_8, 0 }, + { "γ‚’γ‚·γ‚›γƒˆγ€€γ‹γ‚‰(9)", "From Thieves Hideout (9)", "Vom Diebesversteck (9)", "Depuis le Repaire des Voleurs (9)", ENTR_GERUDOS_FORTRESS_9, 0 }, + { "γ‚’γ‚·γ‚›γƒˆγ€€γ‹γ‚‰(10)", "From Thieves Hideout (10)", "Vom Diebesversteck (10)", "Depuis le Repaire des Voleurs (10)", ENTR_GERUDOS_FORTRESS_10, 0 }, + { "γ‚’γ‚·γ‚›γƒˆγ€€γ‹γ‚‰(11)", "From Thieves Hideout (11)", "Vom Diebesversteck (11)", "Depuis le Repaire des Voleurs (11)", ENTR_GERUDOS_FORTRESS_11, 0 }, + { "γ‚’γ‚·γ‚›γƒˆγ€€γ‹γ‚‰(12)", "From Thieves Hideout (12)", "Vom Diebesversteck (12)", "Depuis le Repaire des Voleurs (12)", ENTR_GERUDOS_FORTRESS_12, 0 }, + { "γ‚’γ‚·γ‚›γƒˆγ€€γ‹γ‚‰(13)", "From Thieves Hideout (13)", "Vom Diebesversteck (13)", "Depuis le Repaire des Voleurs (13)", ENTR_GERUDOS_FORTRESS_13, 0 }, }}, - { "29:Thieves Hideout", "29:Diebesversteck", "29:Repaire des Voleurs", Select_LoadGame, 13, { - { "From Gerudo Fortress (1)", "Von der Gerudo-Festung (1)", "Depuis la Forteresse Gerudo (1)", ENTR_THIEVES_HIDEOUT_0, 0 }, - { "From Gerudo Fortress (2)", "Von der Gerudo-Festung (2)", "Depuis la Forteresse Gerudo (2)", ENTR_THIEVES_HIDEOUT_1, 0 }, - { "From Gerudo Fortress (3)", "Von der Gerudo-Festung (3)", "Depuis la Forteresse Gerudo (3)", ENTR_THIEVES_HIDEOUT_2, 0 }, - { "From Gerudo Fortress (4)", "Von der Gerudo-Festung (4)", "Depuis la Forteresse Gerudo (4)", ENTR_THIEVES_HIDEOUT_3, 0 }, - { "From Gerudo Fortress (5)", "Von der Gerudo-Festung (5)", "Depuis la Forteresse Gerudo (5)", ENTR_THIEVES_HIDEOUT_4, 0 }, - { "From Gerudo Fortress (6)", "Von der Gerudo-Festung (6)", "Depuis la Forteresse Gerudo (6)", ENTR_THIEVES_HIDEOUT_5, 0 }, - { "From Gerudo Fortress (7)", "Von der Gerudo-Festung (7)", "Depuis la Forteresse Gerudo (7)", ENTR_THIEVES_HIDEOUT_6, 0 }, - { "From Gerudo Fortress (8)", "Von der Gerudo-Festung (8)", "Depuis la Forteresse Gerudo (8)", ENTR_THIEVES_HIDEOUT_7, 0 }, - { "From Gerudo Fortress (9)", "Von der Gerudo-Festung (9)", "Depuis la Forteresse Gerudo (9)", ENTR_THIEVES_HIDEOUT_8, 0 }, - { "From Gerudo Fortress (10)", "Von der Gerudo-Festung (10)", "Depuis la Forteresse Gerudo (10)", ENTR_THIEVES_HIDEOUT_9, 0 }, - { "From Gerudo Fortress (11)", "Von der Gerudo-Festung (11)", "Depuis la Forteresse Gerudo (11)", ENTR_THIEVES_HIDEOUT_10, 0 }, - { "From Gerudo Fortress (12)", "Von der Gerudo-Festung (12)", "Depuis la Forteresse Gerudo (12)", ENTR_THIEVES_HIDEOUT_11, 0 }, - { "From Gerudo Fortress (13)", "Von der Gerudo-Festung (13)", "Depuis la Forteresse Gerudo (13)", ENTR_THIEVES_HIDEOUT_12, 0 }, + { "29:γ¨γ†γγ‚›γγŸγ‚›γ‚“γγ‚’γ‚·γ‚›γƒˆ", "29:Thieves Hideout", "29:Diebesversteck", "29:Repaire des Voleurs", Select_LoadGame, 13, { + { "γ‚±γ‚›γƒ«γƒˆγ‚›γγ¨γ‚Šγ¦γ‚›γ€€γ‹γ‚‰(1)", "From Gerudo Fortress (1)", "Von der Gerudo-Festung (1)", "Depuis la Forteresse Gerudo (1)", ENTR_THIEVES_HIDEOUT_0, 0 }, + { "γ‚±γ‚›γƒ«γƒˆγ‚›γγ¨γ‚Šγ¦γ‚›γ€€γ‹γ‚‰(2)", "From Gerudo Fortress (2)", "Von der Gerudo-Festung (2)", "Depuis la Forteresse Gerudo (2)", ENTR_THIEVES_HIDEOUT_1, 0 }, + { "γ‚±γ‚›γƒ«γƒˆγ‚›γγ¨γ‚Šγ¦γ‚›γ€€γ‹γ‚‰(3)", "From Gerudo Fortress (3)", "Von der Gerudo-Festung (3)", "Depuis la Forteresse Gerudo (3)", ENTR_THIEVES_HIDEOUT_2, 0 }, + { "γ‚±γ‚›γƒ«γƒˆγ‚›γγ¨γ‚Šγ¦γ‚›γ€€γ‹γ‚‰(4)", "From Gerudo Fortress (4)", "Von der Gerudo-Festung (4)", "Depuis la Forteresse Gerudo (4)", ENTR_THIEVES_HIDEOUT_3, 0 }, + { "γ‚±γ‚›γƒ«γƒˆγ‚›γγ¨γ‚Šγ¦γ‚›γ€€γ‹γ‚‰(5)", "From Gerudo Fortress (5)", "Von der Gerudo-Festung (5)", "Depuis la Forteresse Gerudo (5)", ENTR_THIEVES_HIDEOUT_4, 0 }, + { "γ‚±γ‚›γƒ«γƒˆγ‚›γγ¨γ‚Šγ¦γ‚›γ€€γ‹γ‚‰(6)", "From Gerudo Fortress (6)", "Von der Gerudo-Festung (6)", "Depuis la Forteresse Gerudo (6)", ENTR_THIEVES_HIDEOUT_5, 0 }, + { "γ‚±γ‚›γƒ«γƒˆγ‚›γγ¨γ‚Šγ¦γ‚›γ€€γ‹γ‚‰(7)", "From Gerudo Fortress (7)", "Von der Gerudo-Festung (7)", "Depuis la Forteresse Gerudo (7)", ENTR_THIEVES_HIDEOUT_6, 0 }, + { "γ‚±γ‚›γƒ«γƒˆγ‚›γγ¨γ‚Šγ¦γ‚›γ€€γ‹γ‚‰(8)", "From Gerudo Fortress (8)", "Von der Gerudo-Festung (8)", "Depuis la Forteresse Gerudo (8)", ENTR_THIEVES_HIDEOUT_7, 0 }, + { "γ‚±γ‚›γƒ«γƒˆγ‚›γγ¨γ‚Šγ¦γ‚›γ€€γ‹γ‚‰(9)", "From Gerudo Fortress (9)", "Von der Gerudo-Festung (9)", "Depuis la Forteresse Gerudo (9)", ENTR_THIEVES_HIDEOUT_8, 0 }, + { "γ‚±γ‚›γƒ«γƒˆγ‚›γγ¨γ‚Šγ¦γ‚›γ€€γ‹γ‚‰(10)", "From Gerudo Fortress (10)", "Von der Gerudo-Festung (10)", "Depuis la Forteresse Gerudo (10)", ENTR_THIEVES_HIDEOUT_9, 0 }, + { "γ‚±γ‚›γƒ«γƒˆγ‚›γγ¨γ‚Šγ¦γ‚›γ€€γ‹γ‚‰(11)", "From Gerudo Fortress (11)", "Von der Gerudo-Festung (11)", "Depuis la Forteresse Gerudo (11)", ENTR_THIEVES_HIDEOUT_10, 0 }, + { "γ‚±γ‚›γƒ«γƒˆγ‚›γγ¨γ‚Šγ¦γ‚›γ€€γ‹γ‚‰(12)", "From Gerudo Fortress (12)", "Von der Gerudo-Festung (12)", "Depuis la Forteresse Gerudo (12)", ENTR_THIEVES_HIDEOUT_11, 0 }, + { "γ‚±γ‚›γƒ«γƒˆγ‚›γγ¨γ‚Šγ¦γ‚›γ€€γ‹γ‚‰(13)", "From Gerudo Fortress (13)", "Von der Gerudo-Festung (13)", "Depuis la Forteresse Gerudo (13)", ENTR_THIEVES_HIDEOUT_12, 0 }, }}, - { "30:Haunted Wasteland", "30:Geisterwueste", "30:Desert Hante", Select_LoadGame, 2, { - { "From Gerudo Fortress", "Von der Gerudo-Festung", "Depuis la Forteresse Gerudo", ENTR_HAUNTED_WASTELAND_EAST_EXIT, 0 }, - { "From Desert Colossus", "Vom Wuestenkoloss", "Depuis le Colosse du Desert", ENTR_HAUNTED_WASTELAND_WEST_EXIT, 0 }, + { "30:γ‘γ‚›γ‚“γˆγ„γγ•は゛く", "30:Haunted Wasteland", "30:Geisterwueste", "30:Desert Hante", Select_LoadGame, 2, { + { "γ‚±γ‚›γƒ«γƒˆγ‚›γγ¨γ‚Šγ¦γ‚›γ€€γ‹γ‚‰", "From Gerudo Fortress", "Von der Gerudo-Festung", "Depuis la Forteresse Gerudo", ENTR_HAUNTED_WASTELAND_EAST_EXIT, 0 }, + { "γγ‚‡γŸγ‚›γ„γ—γ‚›γ‚ƒγ—γ‚“γγ‚›γ†γ€€γ‹γ‚‰", "From Desert Colossus", "Vom Wuestenkoloss", "Depuis le Colosse du Desert", ENTR_HAUNTED_WASTELAND_WEST_EXIT, 0 }, }}, - { "31:Desert Colossus", "31:Wuestenkoloss", "31:Colosse du Desert", Select_LoadGame, 7, { - { "From Haunted Wasteland", "Von der Geisterwueste", "Depuis le Desert Hante", ENTR_DESERT_COLOSSUS_EAST_EXIT, 0 }, - { "From Spirit Temple", "Vom Geistertempel", "Depuis le Temple de l'Esprit", ENTR_DESERT_COLOSSUS_OUTSIDE_TEMPLE, 0 }, - { "From Spirit Temple (Left Hand)", "Vom Geistertempel (Linke Hand)", "Depuis le Temple de l'Esprit (Main Gauche)", ENTR_DESERT_COLOSSUS_2, 0 }, - { "From Spirit Temple (Right Hand)", "Vom Geistertempel (Rechte Hand)", "Depuis le Temple de l'Esprit (Main Droite)", ENTR_DESERT_COLOSSUS_3, 0 }, - { "From Fairy Fountain", "Von der Feen-Quelle", "Depuis la Fontaine des Fees", ENTR_DESERT_COLOSSUS_GREAT_FAIRY_EXIT, 0 }, - { "Great Fairy", "Feen-Quelle", "Grande Fee", ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_NAYRUS_COLOSSUS, 0 }, - { "Requiem of Spirit Warp", "Requiem der Geister Teleport", "Teleporteur du Requiem de l'Esprit", ENTR_DESERT_COLOSSUS_WARP_PAD, 0 }, + { "31:γγ‚‡γŸγ‚›γ„γ—γ‚›γ‚ƒγ—γ‚“γγ‚›γ†", "31:Desert Colossus", "31:Wuestenkoloss", "31:Colosse du Desert", Select_LoadGame, 7, { + { "γ‘γ‚›γ‚“γˆγ„γγ•は゛く から", "From Haunted Wasteland", "Von der Geisterwueste", "Depuis le Desert Hante", ENTR_DESERT_COLOSSUS_EAST_EXIT, 0 }, + { "γŸγΎγ—γ„γγ—んて゛ん から", "From Spirit Temple", "Vom Geistertempel", "Depuis le Temple de l'Esprit", ENTR_DESERT_COLOSSUS_OUTSIDE_TEMPLE, 0 }, + { "γŸγΎγ—γ„γγ—んて゛ん から(γ²γŸγ‚›γ‚Šγ¦)", "From Spirit Temple (Left Hand)", "Vom Geistertempel (Linke Hand)", "Depuis le Temple de l'Esprit (Main Gauche)", ENTR_DESERT_COLOSSUS_2, 0 }, + { "γŸγΎγ—γ„γγ—んて゛ん から(みき゛て)", "From Spirit Temple (Right Hand)", "Vom Geistertempel (Rechte Hand)", "Depuis le Temple de l'Esprit (Main Droite)", ENTR_DESERT_COLOSSUS_3, 0 }, + { "γŸγ‚›γ„γ‚ˆγ†γ›γ„γ€€γ‹γ‚‰", "From Fairy Fountain", "Von der Feen-Quelle", "Depuis la Fontaine des Fees", ENTR_DESERT_COLOSSUS_GREAT_FAIRY_EXIT, 0 }, + { "γŸγ‚›γ„γ‚ˆγ†γ›γ„", "Great Fairy", "Feen-Quelle", "Grande Fee", ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_NAYRUS_COLOSSUS, 0 }, + { "γŸγΎγ—γ„γγƒ¬γ‚―γ‚€γ‚¨γƒ γ€€γƒ―γƒΌγƒ•γ‚œ", "Requiem of Spirit Warp", "Requiem der Geister Teleport", "Teleporteur du Requiem de l'Esprit", ENTR_DESERT_COLOSSUS_WARP_PAD, 0 }, }}, - { "32:Deku Tree", "32:Deku-Baum", "32:Arbre Mojo", Select_LoadGame, 3, { - { "Entrance", "Eingang", "Entree", ENTR_DEKU_TREE_ENTRANCE, 1 }, - { "From Gohma's Lair", "Von Gohmas Kampf", "Depuis le Repaire de Gohma", ENTR_DEKU_TREE_BOSS_DOOR, 1 }, - { "Gohma's Lair", "Gohmas Kampf", "Repaire de Gohma", ENTR_DEKU_TREE_BOSS_ENTRANCE, 0 }, + { "32:テ゛クγγγ‚΅γƒžγγͺか", "32:Deku Tree", "32:Deku-Baum", "32:Arbre Mojo", Select_LoadGame, 3, { + { "γ„γ‚Šγγ‚›γ‘", "Entrance", "Eingang", "Entree", ENTR_DEKU_TREE_ENTRANCE, 1 }, + { "γ‚³γ‚›γƒΌγƒžγγΈγ‚„ から", "From Gohma's Lair", "Von Gohmas Kampf", "Depuis le Repaire de Gohma", ENTR_DEKU_TREE_BOSS_DOOR, 1 }, + { "γ‚³γ‚›γƒΌγƒžγγΈγ‚„", "Gohma's Lair", "Gohmas Kampf", "Repaire de Gohma", ENTR_DEKU_TREE_BOSS_ENTRANCE, 0 }, }}, - { "33:Dodongos Cavern", "33:Dodongos Hoehle", "33:Caverne Dodongo", Select_LoadGame, 3, { - { "Entrance", "Eingang", "Entree", ENTR_DODONGOS_CAVERN_ENTRANCE, 1 }, - { "From King Dodongo", "Von Koenig Dodongo", "Depuis le Repaire du Roi Dodongo", ENTR_DODONGOS_CAVERN_BOSS_DOOR, 1 }, - { "King Dodongo's Lair", "Koenig Dodongos Kampf", "Repaire du Roi Dodongo", ENTR_DODONGOS_CAVERN_BOSS_ENTRANCE, 0 }, + { "33:γƒˆγ‚›γƒˆγ‚›γƒ³γ‚³γ‚›γγ¨γ‚›γ†γγ€", "33:Dodongos Cavern", "33:Dodongos Hoehle", "33:Caverne Dodongo", Select_LoadGame, 3, { + { "γ„γ‚Šγγ‚›γ‘", "Entrance", "Eingang", "Entree", ENTR_DODONGOS_CAVERN_ENTRANCE, 1 }, + { "γ‚­γƒ³γ‚―γ‚›γƒˆγ‚›γƒˆγ‚›γƒ³γ‚³γ‚›γγΈγ‚„ から", "From King Dodongo", "Von Koenig Dodongo", "Depuis le Repaire du Roi Dodongo", ENTR_DODONGOS_CAVERN_BOSS_DOOR, 1 }, + { "γ‚­γƒ³γ‚―γ‚›γƒˆγ‚›γƒˆγ‚›γƒ³γ‚³γ‚›γγΈγ‚„", "King Dodongo's Lair", "Koenig Dodongos Kampf", "Repaire du Roi Dodongo", ENTR_DODONGOS_CAVERN_BOSS_ENTRANCE, 0 }, }}, - { "34:Jabu Jabu", "34:Jabu-Jabu", "34:Jabu-Jabu", Select_LoadGame, 2, { - { "Entrance", "Eingang", "Entree", ENTR_JABU_JABU_ENTRANCE, 1 }, - { "Barinade's Lair", "Barinades Kampf", "Repaire de Barinade", ENTR_JABU_JABU_BOSS_ENTRANCE, 0 }, + { "34:シ゛ャフ゛シ゛ャフ゛さまγγŠγͺか", "34:Jabu Jabu", "34:Jabu-Jabu", "34:Jabu-Jabu", Select_LoadGame, 2, { + { "γ„γ‚Šγγ‚›γ‘", "Entrance", "Eingang", "Entree", ENTR_JABU_JABU_ENTRANCE, 1 }, + { "ハ゛γƒͺγƒγƒΌγƒˆγ‚›γγΈγ‚„", "Barinade's Lair", "Barinades Kampf", "Repaire de Barinade", ENTR_JABU_JABU_BOSS_ENTRANCE, 0 }, }}, - { "35:Forest Temple", "35:Waldtempel", "35:Temple de la Foret", Select_LoadGame, 4, { - { "Entrance", "Eingang", "Entree", ENTR_FOREST_TEMPLE_ENTRANCE, 1 }, - { "Crushing Room", "Der Fallende Decke Raum", "Salle de Broyage", ENTR_FOREST_TEMPLE_2, 1 }, - { "Before Phantom Ganon", "Vor Phantom-Ganon", "Avant Ganon Spectral", ENTR_FOREST_TEMPLE_BOSS_DOOR, 1 }, - { "Phantom Ganon's Lair", "Phantom-Ganons Kampf", "Repaire de Ganon Spectral", ENTR_FOREST_TEMPLE_BOSS_ENTRANCE, 0 }, + { "35:γ‚‚γ‚Šγγ—んて゛ん", "35:Forest Temple", "35:Waldtempel", "35:Temple de la Foret", Select_LoadGame, 4, { + { "γ„γ‚Šγγ‚›γ‘", "Entrance", "Eingang", "Entree", ENTR_FOREST_TEMPLE_ENTRANCE, 1 }, + { "γ¦γ‚“γ—γ‚›γ‚‡γ†γ‹γ‚›γŠγ‘γ¦γγ‚‹γΈγ‚„", "Crushing Room", "Der Fallende Decke Raum", "Salle de Broyage", ENTR_FOREST_TEMPLE_2, 1 }, + { "γƒ•γ‚‘γƒ³γƒˆγƒ γ‚«γ‚›γƒŽγƒ³γΎγˆ", "Before Phantom Ganon", "Vor Phantom-Ganon", "Avant Ganon Spectral", ENTR_FOREST_TEMPLE_BOSS_DOOR, 1 }, + { "γƒ•γ‚‘γƒ³γƒˆγƒ γ‚«γ‚›γƒŽγƒ³γγΈγ‚„", "Phantom Ganon's Lair", "Phantom-Ganons Kampf", "Repaire de Ganon Spectral", ENTR_FOREST_TEMPLE_BOSS_ENTRANCE, 0 }, }}, - { "36:Fire Temple", "36:Feuertempel", "36:Temple du Feu", Select_LoadGame, 3, { - { "Entrance", "Eingang", "Entrance", ENTR_FIRE_TEMPLE_ENTRANCE, 1 }, - { "Before Volvagia", "Vor Volvagia", "Avant Volvagia", ENTR_FIRE_TEMPLE_BOSS_DOOR, 1 }, - { "Volvagia's Lair", "Volvagias Kampf", "Repaire de Volcania", ENTR_FIRE_TEMPLE_BOSS_ENTRANCE, 0 }, + { "36:ほγγŠγγ—んて゛ん", "36:Fire Temple", "36:Feuertempel", "36:Temple du Feu", Select_LoadGame, 3, { + { "γ„γ‚Šγγ‚›γ‘", "Entrance", "Eingang", "Entrance", ENTR_FIRE_TEMPLE_ENTRANCE, 1 }, + { "γ‚¦γ‚›γ‚‘γƒ«γƒγ‚›γ‚·γ‚›γ‚’γΎγˆ", "Before Volvagia", "Vor Volvagia", "Avant Volvagia", ENTR_FIRE_TEMPLE_BOSS_DOOR, 1 }, + { "ウ゛ゑルハ゛シ゛をγγΈγ‚„", "Volvagia's Lair", "Volvagias Kampf", "Repaire de Volcania", ENTR_FIRE_TEMPLE_BOSS_ENTRANCE, 0 }, }}, - { "37:Water Temple", "37:Wassertempel", "37:Temple de l'Eau", Select_LoadGame, 2, { - { "Entrance", "Eingang", "Entree", ENTR_WATER_TEMPLE_ENTRANCE, 1 }, - { "Morpha's Lair", "Morphas Kampf", "Repaire de Morpha", ENTR_WATER_TEMPLE_BOSS_ENTRANCE, 0 }, + { "37:みす゛γγ—んて゛ん", "37:Water Temple", "37:Wassertempel", "37:Temple de l'Eau", Select_LoadGame, 2, { + { "γ„γ‚Šγγ‚›γ‘", "Entrance", "Eingang", "Entree", ENTR_WATER_TEMPLE_ENTRANCE, 1 }, + { "ヒーフゑγγΈγ‚„", "Morpha's Lair", "Morphas Kampf", "Repaire de Morpha", ENTR_WATER_TEMPLE_BOSS_ENTRANCE, 0 }, }}, - { "38:Shadow Temple", "38:Schattentempel", "38:Temple de l'Ombre", Select_LoadGame, 3, { - { "Entrance", "Eingang", "Entree", ENTR_SHADOW_TEMPLE_ENTRANCE, 1 }, - { "Outside Bongo Bongo", "Vor Bongo Bongo", "Avant Bongo Bongo", ENTR_SHADOW_TEMPLE_BOSS_DOOR, 1 }, - { "Bongo Bongo's Lair", "Bongo Bongos Kampf", "Repaire de Bongo Bongo", ENTR_SHADOW_TEMPLE_BOSS_ENTRANCE, 1 }, + { "38:やみγγ—んて゛ん", "38:Shadow Temple", "38:Schattentempel", "38:Temple de l'Ombre", Select_LoadGame, 3, { + { "γ„γ‚Šγγ‚›γ‘", "Entrance", "Eingang", "Entree", ENTR_SHADOW_TEMPLE_ENTRANCE, 1 }, + { "γƒ›γ‚›γƒ³γ‚³γ‚›γƒ›γ‚›γƒ³γ‚³γ‚›γΎγˆ", "Outside Bongo Bongo", "Vor Bongo Bongo", "Avant Bongo Bongo", ENTR_SHADOW_TEMPLE_BOSS_DOOR, 1 }, + { "ホ゛ンコ゛ホ゛ンコ゛γγΈγ‚„", "Bongo Bongo's Lair", "Bongo Bongos Kampf", "Repaire de Bongo Bongo", ENTR_SHADOW_TEMPLE_BOSS_ENTRANCE, 1 }, }}, - { "39:Spirit Temple", "39:Geistertempel", "39:Temple de l'Esprit", Select_LoadGame, 6, { - { "Entrance", "Eingang", "Entree", ENTR_SPIRIT_TEMPLE_ENTRANCE, 1 }, - { "From Left Hand", "Von der linken Hand", "Depuis la Main Gauche", ENTR_SPIRIT_TEMPLE_2, 1 }, - { "From Right Hand", "Von der rechten Hand", "Depuis la Main Droite", ENTR_SPIRIT_TEMPLE_3, 1 }, - { "Before Twinrova", "Vor den Killa Ohmaz", "Avant le Duo Malefique", ENTR_SPIRIT_TEMPLE_BOSS_DOOR, 1 }, - { "Nabooru Fight", "Naborus Kampf", "Combat contre Nabooru", ENTR_SPIRIT_TEMPLE_BOSS_ENTRANCE, 0 }, - { "Twinrova's Lair", "Killa Ohmaz' Kampf", "Repaire du Duo Malefique", ENTR_SPIRIT_TEMPLE_BOSS_2, 0 }, + { "39:γŸγΎγ—γ„γγ—んて゛ん", "39:Spirit Temple", "39:Geistertempel", "39:Temple de l'Esprit", Select_LoadGame, 6, { + { "γ„γ‚Šγγ‚›γ‘", "Entrance", "Eingang", "Entree", ENTR_SPIRIT_TEMPLE_ENTRANCE, 1 }, + { "γ²γŸγ‚›γ‚Šγ¦γ€€γ‹γ‚‰", "From Left Hand", "Von der linken Hand", "Depuis la Main Gauche", ENTR_SPIRIT_TEMPLE_2, 1 }, + { "みき゛て から", "From Right Hand", "Von der rechten Hand", "Depuis la Main Droite", ENTR_SPIRIT_TEMPLE_3, 1 }, + { "γƒ„γ‚€γƒ³γƒ­γƒΌγƒγ‚›γΎγˆ", "Before Twinrova", "Vor den Killa Ohmaz", "Avant le Duo Malefique", ENTR_SPIRIT_TEMPLE_BOSS_DOOR, 1 }, + { "γƒŠγƒ›γ‚›γƒΌγƒ«γ›γ‚“", "Nabooru Fight", "Naborus Kampf", "Combat contre Nabooru", ENTR_SPIRIT_TEMPLE_BOSS_ENTRANCE, 0 }, + { "ツむンローハ゛γγΈγ‚„", "Twinrova's Lair", "Killa Ohmaz' Kampf", "Repaire du Duo Malefique", ENTR_SPIRIT_TEMPLE_BOSS_2, 0 }, }}, - { "40:Ganons Castle", "40:Ganons Schloss", "40:Chateau de Ganon", Select_LoadGame, 9, { - { "Entrance", "Eingang", "Entree", ENTR_INSIDE_GANONS_CASTLE_ENTRANCE, 1 }, - { "From Tower", "Vom Tower", "Depuis la Tour", ENTR_INSIDE_GANONS_CASTLE_1, 1 }, - { "Stairs to Lair - From Castle", "Stufen zum Verlies - Vom Schloss", "Escaliers vers Repaire - Depuis le Chateau", ENTR_GANONS_TOWER_0, 0 }, - { "Stairs to Lair - From Ganondorf's Lair", "Stufen zum Verlies - Von Ganondorfs Verlies", "Escaliers vers Repaire - Depuis le Repaire de Ganondorf", ENTR_GANONS_TOWER_1, 0 }, - { "Ganondorf's Lair", "Ganondorfs Verlies", "Repaire de Ganondorf", ENTR_GANONDORF_BOSS_0, 0 }, - { "Ganondorf Defeated", "Ganondorf Besiegt", "Ganondorf Vaincu", ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_5, 0 }, - { "Ganondorf Defeated (2)", "Ganondorf Besiegt (2)", "Ganondorf Vaincu (2)", ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_1, 0 }, - { "Ganon's Lair", "Ganons Kampf", "Repaire de Ganon", ENTR_GANON_BOSS_0, 0 }, - { "Ganon Death Cutscene", "Ganons Todessequenz", "Cinematique de la Mort de Ganon", ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_0, 0 }, + { "40:γ‚«γ‚›γƒŽγƒ³γ—γ‚›γ‚‡γ†", "40:Ganons Castle", "40:Ganons Schloss", "40:Chateau de Ganon", Select_LoadGame, 9, { + { "γ„γ‚Šγγ‚›γ‘", "Entrance", "Eingang", "Entree", ENTR_INSIDE_GANONS_CASTLE_ENTRANCE, 1 }, + { "γ‚«γ‚›γƒŽγƒ³γγ¨γ†γ€€γ‹γ‚‰", "From Tower", "Vom Tower", "Depuis la Tour", ENTR_INSIDE_GANONS_CASTLE_1, 1 }, + { "γ‚«γ‚›γƒŽγƒ³γΈγγ‹γ„γŸγ‚›γ‚“ - しろから", "Stairs to Lair - From Castle", "Stufen zum Verlies - Vom Schloss", "Escaliers vers Repaire - Depuis le Chateau", ENTR_GANONS_TOWER_0, 0 }, + { "γ‚«γ‚›γƒŽγƒ³γΈγγ‹γ„γŸγ‚›γ‚“ - γ‚«γ‚›γƒŽγƒ³γƒˆγ‚›γƒ­γƒ•γγΈγ‚„から", "Stairs to Lair - From Ganondorf's Lair", "Stufen zum Verlies - Von Ganondorfs Verlies", "Escaliers vers Repaire - Depuis le Repaire de Ganondorf", ENTR_GANONS_TOWER_1, 0 }, + { "γ‚«γ‚›γƒŽγƒ³γƒˆγ‚›γƒ­γƒ•γγΈγ‚„", "Ganondorf's Lair", "Ganondorfs Verlies", "Repaire de Ganondorf", ENTR_GANONDORF_BOSS_0, 0 }, + { "γ‚«γ‚›γƒŽγƒ³γƒˆγ‚›γƒ­γƒ•γ‚’γŸγŠγ—γŸγ‚γ¨", "Ganondorf Defeated", "Ganondorf Besiegt", "Ganondorf Vaincu", ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_5, 0 }, + { "γ‚«γ‚›γƒŽγƒ³γƒˆγ‚›γƒ­γƒ•γ‚’γŸγŠγ—γŸγ‚γ¨(2)", "Ganondorf Defeated (2)", "Ganondorf Besiegt (2)", "Ganondorf Vaincu (2)", ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_1, 0 }, + { "γ‚«γ‚›γƒŽγƒ³γγΈγ‚„", "Ganon's Lair", "Ganons Kampf", "Repaire de Ganon", ENTR_GANON_BOSS_0, 0 }, + { "γ‚«γ‚›γƒŽγƒ³γγ•γ„γ“γ‚›γ‚«γƒƒγƒˆγ‚·γƒΌγƒ³", "Ganon Death Cutscene", "Ganons Todessequenz", "Cinematique de la Mort de Ganon", ENTR_GANONS_TOWER_COLLAPSE_EXTERIOR_0, 0 }, }}, - { "41:Bottom of the Well", "41:Grund des Brunnens", "41:Puits", Select_LoadGame, 1, { - { "Entrance", "Eingang", "Entree", ENTR_BOTTOM_OF_THE_WELL_ENTRANCE, 1 }, + { "41:いと゛γγγ“", "41:Bottom of the Well", "41:Grund des Brunnens", "41:Puits", Select_LoadGame, 1, { + { "γ„γ‚Šγγ‚›γ‘", "Entrance", "Eingang", "Entree", ENTR_BOTTOM_OF_THE_WELL_ENTRANCE, 1 }, }}, - { "42:Ice Cavern", "42:Eishoehle", "42:Caverne Polaire", Select_LoadGame, 1, { - { "Entrance", "Eingang", "Entree", ENTR_ICE_CAVERN_ENTRANCE, 1 }, + { "42:γ“γŠγ‚Šγγ¨γ‚›γ†γγ€", "42:Ice Cavern", "42:Eishoehle", "42:Caverne Polaire", Select_LoadGame, 1, { + { "γ„γ‚Šγγ‚›γ‘", "Entrance", "Eingang", "Entree", ENTR_ICE_CAVERN_ENTRANCE, 1 }, }}, - { "43:Gerudo Training Ground", "43:Gerudo-Trainingsarena", "43:Gymnase Gerudo", Select_LoadGame, 1, { - { "Entrance", "Eingang", "Entree", ENTR_GERUDO_TRAINING_GROUND_ENTRANCE, 1 }, + { "43:γ‚±γ‚›γƒ«γƒˆγ‚›γγ—γ‚…γ†γ‚Œγ‚“γ—γ‚›γ‚‡γ†", "43:Gerudo Training Ground", "43:Gerudo-Trainingsarena", "43:Gymnase Gerudo", Select_LoadGame, 1, { + { "γ„γ‚Šγγ‚›γ‘", "Entrance", "Eingang", "Entree", ENTR_GERUDO_TRAINING_GROUND_ENTRANCE, 1 }, }}, - { "44:Warps", "44:Teleportpunkte", "44:Teleporteurs", Select_LoadGame, 6, { - { "Prelude of Light Warp", "Kantate des Lichts Teleport", "Teleporteur du Prelude de la Lumiere", ENTR_TEMPLE_OF_TIME_WARP_PAD, 0 }, - { "Minuet of Forest Warp", "Menuett des Waldes Teleport", "Teleporteur du Menuet des Bois", ENTR_SACRED_FOREST_MEADOW_WARP_PAD, 0 }, - { "Bolero of Fire Warp", "Bolero des Feuers Teleport", "Teleporteur du Bolero du Feu", ENTR_DEATH_MOUNTAIN_CRATER_WARP_PAD, 0 }, - { "Serenade Of Water Warp", "Serenade des Wassers Teleport", "Teleporteur de la Serenade de l'Eau", ENTR_LAKE_HYLIA_WARP_PAD, 0 }, - { "Nocturne of Shadow Warp", "Nocturne des Schattens Teleport", "Teleporteur du Nocturne de l'Ombre", ENTR_GRAVEYARD_WARP_PAD, 0 }, - { "Requiem of Spirit Warp", "Requiem der Geister Teleport", "Teleporteur du Requiem de l'Esprit", ENTR_DESERT_COLOSSUS_WARP_PAD, 0 }, + { "44:γƒ―γƒΌγƒ•γ‚œ", "44:Warps", "44:Teleportpunkte", "44:Teleporteurs", Select_LoadGame, 6, { + { "γ²γ‹γ‚Šγγƒ•γ‚œγƒ¬γƒͺγƒ₯γƒΌγƒˆγ‚›γ€€γƒ―γƒΌγƒ•γ‚œ", "Prelude of Light Warp", "Kantate des Lichts Teleport", "Teleporteur du Prelude de la Lumiere", ENTR_TEMPLE_OF_TIME_WARP_PAD, 0 }, + { "γ‚‚γ‚Šγγƒ‘γƒŒγ‚¨γƒƒγƒˆγ€€γƒ―γƒΌγƒ•γ‚œ", "Minuet of Forest Warp", "Menuett des Waldes Teleport", "Teleporteur du Menuet des Bois", ENTR_SACRED_FOREST_MEADOW_WARP_PAD, 0 }, + { "ほγγŠγγƒ›γ‚›γƒ¬γƒ­γ€€γƒ―γƒΌγƒ•γ‚œ", "Bolero of Fire Warp", "Bolero des Feuers Teleport", "Teleporteur du Bolero du Feu", ENTR_DEATH_MOUNTAIN_CRATER_WARP_PAD, 0 }, + { "みす゛γγ‚»γƒ¬γƒŠγƒΌγƒ†γ‚›γ€€γƒ―γƒΌγƒ•γ‚œ", "Serenade Of Water Warp", "Serenade des Wassers Teleport", "Teleporteur de la Serenade de l'Eau", ENTR_LAKE_HYLIA_WARP_PAD, 0 }, + { "やみγγƒŽγ‚―γ‚ΏγƒΌγƒ³γ€€γƒ―γƒΌγƒ•γ‚œ", "Nocturne of Shadow Warp", "Nocturne des Schattens Teleport", "Teleporteur du Nocturne de l'Ombre", ENTR_GRAVEYARD_WARP_PAD, 0 }, + { "γŸγΎγ—γ„γγƒ¬γ‚―γ‚€γ‚¨γƒ γ€€γƒ―γƒΌγƒ•γ‚œ", "Requiem of Spirit Warp", "Requiem der Geister Teleport", "Teleporteur du Requiem de l'Esprit", ENTR_DESERT_COLOSSUS_WARP_PAD, 0 }, }}, - { "45:Shops", "45:Laeden", "45:Boutiques", Select_LoadGame, 9, { - { "Kokiri Shop", "Kokiri-Laden", "Boutique Kokiri", ENTR_KOKIRI_SHOP_0 }, - { "Potion Shop (Market)", "Magie-Laden (Marktplatz)", "Apothicaire (Place du Marche)", ENTR_POTION_SHOP_MARKET_0, 0 }, - { "Bazaar Shop (Market)", "Basar (Marktplatz)", "Bazar (Place du Marche)", ENTR_BAZAAR_1, 0 }, - { "Happy Mask Shop", "Maskenhaendler", "Foire aux Masques", ENTR_HAPPY_MASK_SHOP_0, 0 }, - { "Bombchu Shop", "Krabbelminen-Laden", "Boutique de Missiles", ENTR_BOMBCHU_SHOP_1, 0 }, - { "Bazaar Shop (Kakariko)", "Basar (Kakariko)", "Bazar (Village Cocorico)", ENTR_BAZAAR_0, 0 }, - { "Potion Shop (Kakariko)", "Magie-Laden (Kakariko)", "Apothicaire (Village Cocorico)", ENTR_POTION_SHOP_KAKARIKO_FRONT, 0 }, - { "Goron City Shop", "Goronen-Laden", "Boutique Goron", ENTR_GORON_SHOP_0, 0 }, - { "Zora Shop", "Zora-Laden", "Boutique Zora", ENTR_ZORA_SHOP_0, 0 }, + { "45:γŠγΏγ›", "45:Shops", "45:Laeden", "45:Boutiques", Select_LoadGame, 9, { + { "γ‚³γ‚­γƒͺγγŠγΏγ›", "Kokiri Shop", "Kokiri-Laden", "Boutique Kokiri", ENTR_KOKIRI_SHOP_0 }, + { "γγ™γ‚Šγ‚„(し゛ょうかまけ)", "Potion Shop (Market)", "Magie-Laden (Marktplatz)", "Apothicaire (Place du Marche)", ENTR_POTION_SHOP_MARKET_0, 0 }, + { "γͺンて゛もや(し゛ょうかまけ)", "Bazaar Shop (Market)", "Basar (Marktplatz)", "Bazar (Place du Marche)", ENTR_BAZAAR_1, 0 }, + { "γŠγ‚γ‚“γ‚„", "Happy Mask Shop", "Maskenhaendler", "Foire aux Masques", ENTR_HAPPY_MASK_SHOP_0, 0 }, + { "ホ゛ムチγƒ₯ウや", "Bombchu Shop", "Krabbelminen-Laden", "Boutique de Missiles", ENTR_BOMBCHU_SHOP_1, 0 }, + { "γͺンて゛もや(γ‚«γ‚«γƒͺコむら)", "Bazaar Shop (Kakariko)", "Basar (Kakariko)", "Bazar (Village Cocorico)", ENTR_BAZAAR_0, 0 }, + { "γγ™γ‚Šγ‚„(γ‚«γ‚«γƒͺコむら)", "Potion Shop (Kakariko)", "Magie-Laden (Kakariko)", "Apothicaire (Village Cocorico)", ENTR_POTION_SHOP_KAKARIKO_FRONT, 0 }, + { "コ゛ロンγγŠγΏγ›", "Goron City Shop", "Goronen-Laden", "Boutique Goron", ENTR_GORON_SHOP_0, 0 }, + { "ソ゛ーラγγŠγΏγ›", "Zora Shop", "Zora-Laden", "Boutique Zora", ENTR_ZORA_SHOP_0, 0 }, }}, - { "46:Great Fairies", "46:Feen-Quellen", "46:Grandes Fees", Select_LoadGame, 6, { - { "Hyrule Castle (Child)", "Schloss Hyrule (Kind)", "Chateau d'Hyrule (Enfant)", ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_DINS_HC, 0 }, - { "Hyrule Castle (Adult)", "Schloss Hyrule (Erwachsener)", "Chateau d'Hyrule (Adult)", ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_OGC_DD, 0 }, - { "Death Mountain Trail", "Gebirgspfad", "Mont du Peril", ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_DMT, 0 }, - { "Death Mountain Crater", "Todeskrater", "Cratere du Peril", ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_DMC, 0 }, - { "Zoras Fountain", "Zoras Quelle", "Fontaine Zora", ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_FARORES_ZF, 0 }, - { "Desert Colossus", "Wuestenkoloss", "Colosse du Desert", ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_NAYRUS_COLOSSUS, 0 }, + { "46:γŸγ‚›γ„γ‚ˆγ†γ›γ„", "46:Great Fairies", "46:Feen-Quellen", "46:Grandes Fees", Select_LoadGame, 6, { + { "ハむラルし゛ょう(こと゛も)", "Hyrule Castle (Child)", "Schloss Hyrule (Kind)", "Chateau d'Hyrule (Enfant)", ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_DINS_HC, 0 }, + { "ハむラルし゛ょう(おとγͺ)", "Hyrule Castle (Adult)", "Schloss Hyrule (Erwachsener)", "Chateau d'Hyrule (Adult)", ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_OGC_DD, 0 }, + { "γƒ†γ‚›γ‚Ήγƒžγ‚¦γƒ³γƒ†γƒ³γ¨γ•γ‚›γ‚“γ¨γ‚›γ†", "Death Mountain Trail", "Gebirgspfad", "Mont du Peril", ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_DMT, 0 }, + { "γƒ†γ‚›γ‚Ήγƒžγ‚¦γƒ³γƒ†γƒ³γ‹γ“γ†", "Death Mountain Crater", "Todeskrater", "Cratere du Peril", ENTR_GREAT_FAIRYS_FOUNTAIN_MAGIC_DMC, 0 }, + { "ソ゛ーラγγ„す゛み", "Zoras Fountain", "Zoras Quelle", "Fontaine Zora", ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_FARORES_ZF, 0 }, + { "γγ‚‡γŸγ‚›γ„γ—γ‚›γ‚ƒγ—γ‚“γγ‚›γ†", "Desert Colossus", "Wuestenkoloss", "Colosse du Desert", ENTR_GREAT_FAIRYS_FOUNTAIN_SPELLS_NAYRUS_COLOSSUS, 0 }, }}, - { "47:Chest Grottos", "47:Truhengrotten", "47:Grottes a Coffres", Select_Grotto_LoadGame, 11, { - { "Kokiri Forest (Song of Storms)", "Kokiri-Wald (Hymne des Sturms)", "Foret Kokiri (Chant des Tempetes)", 0x00, 0 }, - { "Lost Woods", "Verlorene Waelder", "Bois Perdus", 0x01, 0 }, - { "Sacred Forest Meadow", "Waldlichtung", "Bosquet Sacre", 0x02, 0 }, - { "Hyrule Field (Near Market)", "Hylianische Steppe (Nahe Marktplatz)", "Plaine d'Hyrule (Pres de la Place du Marche)", 0x03, 0 }, - { "Hyrule Field (Open Near Lake)", "Hylianische Steppe (Offen, beim Hylia-See)", "Plaine d'Hyrule (Deja ouverte pres du Lac)", 0x04, 0 }, - { "Hyrule Field (SE Boulder)", "Hylianische Steppe (Felsen, S-O)", "Plaine d'Hyrule (Rocher a Gantelets)", 0x05, 0 }, - { "Kakariko (Open)", "Kakariko (Offen)", "Village Cocorico (Deja Ouverte)", 0x06, 0 }, - { "Kakariko (Redead)", "Kakariko (Zombies)", "Village Cocorico (Effrois)", 0x07, 0 }, - { "Death Mountain Trail (Song of Storms)", "Gebirgspfad (Hymne des Sturms)", "Mont du Peril (Chant des Tempetes)", 0x08, 0 }, - { "Death Mountain Crater", "Todeskrater", "Cratere du Peril", 0x09, 0 }, - { "Zora River (Open)", "Zora-Fluss (Offen)", "Riviere Zora (Deja Ouverte)", 0x0A, 0 }, + { "47:γŸγ‹γ‚‰γ―γ‚›γ“γγ€€γ‚γͺ", "47:Chest Grottos", "47:Truhengrotten", "47:Grottes a Coffres", Select_Grotto_LoadGame, 11, { + { "γ‚³γ‚­γƒͺγγ‚‚γ‚Š(あらしγγ†γŸ)", "Kokiri Forest (Song of Storms)", "Kokiri-Wald (Hymne des Sturms)", "Foret Kokiri (Chant des Tempetes)", 0x00, 0 }, + { "γΎγ‚ˆγ„γγ‚‚γ‚Š", "Lost Woods", "Verlorene Waelder", "Bois Perdus", 0x01, 0 }, + { "γ‚‚γ‚Šγγ›γ„いき", "Sacred Forest Meadow", "Waldlichtung", "Bosquet Sacre", 0x02, 0 }, + { "ハむラルへいけ゛ん(し゛ょうかまけγγ‘かく)", "Hyrule Field (Near Market)", "Hylianische Steppe (Nahe Marktplatz)", "Plaine d'Hyrule (Pres de la Place du Marche)", 0x03, 0 }, + { "ハむラルへいけ゛ん(γ‚ͺγƒΌγƒ•γ‚œγƒ³ いけけかく)", "Hyrule Field (Open Near Lake)", "Hylianische Steppe (Offen, beim Hylia-See)", "Plaine d'Hyrule (Deja ouverte pres du Lac)", 0x04, 0 }, + { "ハむラルへいけ゛ん(γͺんとうγγ„わ)", "Hyrule Field (SE Boulder)", "Hylianische Steppe (Felsen, S-O)", "Plaine d'Hyrule (Rocher a Gantelets)", 0x05, 0 }, + { "γ‚«γ‚«γƒͺコむら(γ‚ͺγƒΌγƒ•γ‚œγƒ³)", "Kakariko (Open)", "Kakariko (Offen)", "Village Cocorico (Deja Ouverte)", 0x06, 0 }, + { "γ‚«γ‚«γƒͺコむら(γƒͺγƒΌγƒ†γ‚›γƒƒγƒˆ)", "Kakariko (Redead)", "Kakariko (Zombies)", "Village Cocorico (Effrois)", 0x07, 0 }, + { "γƒ†γ‚›γ‚Ήγƒžγ‚¦γƒ³γƒ†γƒ³γ¨γ•γ‚›γ‚“γ¨γ‚›γ†(あらしγγ†γŸ)", "Death Mountain Trail (Song of Storms)", "Gebirgspfad (Hymne des Sturms)", "Mont du Peril (Chant des Tempetes)", 0x08, 0 }, + { "γƒ†γ‚›γ‚Ήγƒžγ‚¦γƒ³γƒ†γƒ³γ‹γ“γ†", "Death Mountain Crater", "Todeskrater", "Cratere du Peril", 0x09, 0 }, + { "ソ゛ーラかわ(γ‚ͺγƒΌγƒ•γ‚œγƒ³)", "Zora River (Open)", "Zora-Fluss (Offen)", "Riviere Zora (Deja Ouverte)", 0x0A, 0 }, }}, - { "48:Scrub Grottos", "48:Laubkerlgrotten", "48:Grottes des Pestes Marchandes", Select_Grotto_LoadGame, 10, { - { "Hyrule Field (Near Lake)", "Hylianische Steppe (beim Hylia-See)", "Plaine d'Hyrule (Pres du Lac)", 0x0B, 0 }, - { "Death Mountain Crater", "Todeskrater", "Cratere du Peril", 0x0C, 0 }, - { "Goron City", "Goronia", "Village Goron", 0x0D, 0 }, - { "Lon Lon Ranch", "Lon Lon-Farm", "Ranch Lon Lon", 0x0E, 0 }, - { "Lake Hylia", "Hylia-See", "Lac Hylia", 0x0F, 0 }, - { "Lost Woods", "Verlorene Waelder", "Bois Perdus", 0x10, 0 }, - { "Zora River (Song of Storms)", "Zora-Fluss (Hymne des Sturms)", "Rivere Zora (Chant des Tempetes)", 0x11, 0 }, - { "Sacred Forest Meadow (Song of Storms)", "Waldlichtung (Hymne des Sturms)", "Bosquet Scare (Chant des Tempetes)", 0x12, 0 }, - { "Gerudo Valley (Song of Storms)", "Gerudotal (Hymne des Sturms)", "Vallee Gerudo (Chant des Tempetes)", 0x13, 0 }, - { "Desert Colossus", "Wuestenkoloss", "Colosse du Desert", 0x14, 0 }, + { "48:γ‚’γ‚­γƒ³γƒˆγ‚›γƒŠγƒƒγƒ„γγ€€γ‚γͺ", "48:Scrub Grottos", "48:Laubkerlgrotten", "48:Grottes des Pestes Marchandes", Select_Grotto_LoadGame, 10, { + { "ハむラルへいけ゛ん(いけけかく)", "Hyrule Field (Near Lake)", "Hylianische Steppe (beim Hylia-See)", "Plaine d'Hyrule (Pres du Lac)", 0x0B, 0 }, + { "γƒ†γ‚›γ‚Ήγƒžγ‚¦γƒ³γƒ†γƒ³γ‹γ“γ†", "Death Mountain Crater", "Todeskrater", "Cratere du Peril", 0x0C, 0 }, + { "コ゛ロンシティ", "Goron City", "Goronia", "Village Goron", 0x0D, 0 }, + { "ロンロンほ゛くし゛ょう", "Lon Lon Ranch", "Lon Lon-Farm", "Ranch Lon Lon", 0x0E, 0 }, + { "ハむγƒͺをこはん", "Lake Hylia", "Hylia-See", "Lac Hylia", 0x0F, 0 }, + { "γΎγ‚ˆγ„γγ‚‚γ‚Š", "Lost Woods", "Verlorene Waelder", "Bois Perdus", 0x10, 0 }, + { "ソ゛ーラかわ(あらしγγ†γŸ)", "Zora River (Song of Storms)", "Zora-Fluss (Hymne des Sturms)", "Rivere Zora (Chant des Tempetes)", 0x11, 0 }, + { "γ‚‚γ‚Šγγ›γ„いき(あらしγγ†γŸ)", "Sacred Forest Meadow (Song of Storms)", "Waldlichtung (Hymne des Sturms)", "Bosquet Scare (Chant des Tempetes)", 0x12, 0 }, + { "γ‚±γ‚›γƒ«γƒˆγ‚›γγŸγ«(あらしγγ†γŸ)", "Gerudo Valley (Song of Storms)", "Gerudotal (Hymne des Sturms)", "Vallee Gerudo (Chant des Tempetes)", 0x13, 0 }, + { "γγ‚‡γŸγ‚›γ„γ—γ‚›γ‚ƒγ—γ‚“γγ‚›γ†", "Desert Colossus", "Wuestenkoloss", "Colosse du Desert", 0x14, 0 }, }}, - { "49:Other Grottos", "49:Andere Grotten", "49:Autres Grottes", Select_Grotto_LoadGame, 7, { - { "Scrub Theatre", "Waldbuehne", "Theatre Mojo", 0x15, 0 }, - { "Spider Grotto (Hyrule Field)", "Spinnen-Grotte (Hylianische Steppe)", "Spider Araignee (Plaine d'Hyrule)", 0x16, 0 }, - { "Spider Grotto (Hyrule Castle)", "Spinnen-Grotte (Schloss Hyrule)", "Grotte Araignee (Chateau d'Hyrule)", 0x17, 0 }, - { "Cow Grotto (Hyrule Field)", "Kuh-Grotte (Hylianische Steppe)", "Grotte a Vache (Plaine d'Hyrule)", 0x18, 0 }, - { "Cow Grotto (Death Mountain Trail)", "Kuh-Grotte (Gebirgspfad)", "Grotte a Vache (Chemin du Peril)", 0x19, 0 }, - { "Flooded Grotto (Gerudo Valley)", "Geflutete Grotte (Gerudotal)", "Grotte Inondee (Vallee Gerudo)", 0x1A, 0 }, - { "Flooded Grotto (Hyrule Field)", "Geflutete Grotte (Hylianische Steppe)", "Grotte Inondee (Plaine d'Hyrule)", 0x1B, 0 }, + { "49:そγγŸγγ€€γ‚γͺ", "49:Other Grottos", "49:Andere Grotten", "49:Autres Grottes", Select_Grotto_LoadGame, 7, { + { "γ‚‚γ‚Šγγ‚Ήγƒ†γƒΌγ‚·γ‚›", "Scrub Theatre", "Waldbuehne", "Theatre Mojo", 0x15, 0 }, + { "γ‚―γƒ’γγ‚γͺ(ハむラルへいけ゛ん)", "Spider Grotto (Hyrule Field)", "Spinnen-Grotte (Hylianische Steppe)", "Spider Araignee (Plaine d'Hyrule)", 0x16, 0 }, + { "γ‚―γƒ’γγ‚γͺ(ハむラルし゛ょう)", "Spider Grotto (Hyrule Castle)", "Spinnen-Grotte (Schloss Hyrule)", "Grotte Araignee (Chateau d'Hyrule)", 0x17, 0 }, + { "ウシγγ‚γͺ(ハむラルへいけ゛ん)", "Cow Grotto (Hyrule Field)", "Kuh-Grotte (Hylianische Steppe)", "Grotte a Vache (Plaine d'Hyrule)", 0x18, 0 }, + { "ウシγγ‚γͺ(γƒ†γ‚›γ‚Ήγƒžγ‚¦γƒ³γƒ†γƒ³γ¨γ•γ‚›γ‚“γ¨γ‚›γ†)", "Cow Grotto (Death Mountain Trail)", "Kuh-Grotte (Gebirgspfad)", "Grotte a Vache (Chemin du Peril)", 0x19, 0 }, + { "みす゛γγ‚γͺ(γ‚±γ‚›γƒ«γƒˆγ‚›γγŸγ«)", "Flooded Grotto (Gerudo Valley)", "Geflutete Grotte (Gerudotal)", "Grotte Inondee (Vallee Gerudo)", 0x1A, 0 }, + { "みす゛γγ‚γͺ(ハむラルへいけ゛ん)", "Flooded Grotto (Hyrule Field)", "Geflutete Grotte (Hylianische Steppe)", "Grotte Inondee (Plaine d'Hyrule)", 0x1B, 0 }, }}, - { "50:Debug (Use with caution)", "50:Debug (Mit Vorsicht benutzen)", "50:Debug (A utiliser avec prudence)", Select_LoadGame, 10, { - { "Test Room", "Test Raum", "Salle de Test", ENTR_BESITU_0, 0 }, - { "SRD Map", "SRD Karte", "Carte SRD", ENTR_SASATEST_0, 0 }, - { "Test Map", "Test Karte", "Carte de Test", ENTR_TEST01_0, 0 }, - { "Treasure Chest Warp", "Schatzkisten Teleport", "Salle de Test - Objets", ENTR_TESTROOM_0, 0 }, - { "Stalfos Miniboss Room", "Stalfos-Ritter Miniboss-Raum", "Salle du Minoboss Stalfos", ENTR_SYOTES_0, 0 }, - { "Stalfos Boss Room", "Stalfos-Ritter Boss-Raum", "Salle de Boss Stalfos", ENTR_SYOTES2_0, 0 }, - { "Dark Link Room", "Schwarzer Link Raum", "Salle de Dark Link", ENTR_SUTARU_0, 0 }, - { "Shooting Gallery Duplicate", "Schiessbude (Duplikat)", "Jeu d'Adresse (Duplicata)", ENTR_TEST_SHOOTING_GALLERY_0, 0 }, - { "Depth Test", "Tiefen Test", "Test de Profondeur", ENTR_DEPTH_TEST_0, 0 }, - { "Hyrule Garden Game (Broken)", "Burghof - Wachen-Minispiel (Kaputt)", "Cour du chateau (Non Fonctionnel)", ENTR_HAIRAL_NIWA2_0, 0 }, + { "50:テ゛ハ゛ック゛(γ—γ‚ˆγ†γ‘γ‚…γ†γ„)", "50:Debug (Use with caution)", "50:Debug (Mit Vorsicht benutzen)", "50:Debug (A utiliser avec prudence)", Select_LoadGame, 10, { + { "γƒ†γ‚Ήγƒˆγƒ«γƒΌγƒ ", "Test Room", "Test Raum", "Salle de Test", ENTR_BESITU_0, 0 }, + { "SRDγƒžγƒƒγƒ•γ‚œ(γ•γ•γƒ†γ‚Ήγƒˆ)", "SRD Map", "SRD Karte", "Carte SRD", ENTR_SASATEST_0, 0 }, + { "γƒ†γ‚Ήγƒˆγƒžγƒƒγƒ•γ‚œ", "Test Map", "Test Karte", "Carte de Test", ENTR_TEST01_0, 0 }, + { "γŸγ‹γ‚‰γ―γ‚›γ“γƒ―γƒΌγƒ•γ‚œ", "Treasure Chest Warp", "Schatzkisten Teleport", "Salle de Test - Objets", ENTR_TESTROOM_0, 0 }, + { "けゅうスタルフォスへ゛や", "Stalfos Miniboss Room", "Stalfos-Ritter Miniboss-Raum", "Salle du Minoboss Stalfos", ENTR_SYOTES_0, 0 }, + { "ホ゛ススタルフォスへ゛や", "Stalfos Boss Room", "Stalfos-Ritter Boss-Raum", "Salle de Boss Stalfos", ENTR_SYOTES2_0, 0 }, + { "γ‚Ώγ‚›γƒΌγ‚―γƒͺンクへ゛や(Sutaru)", "Dark Link Room", "Schwarzer Link Raum", "Salle de Dark Link", ENTR_SUTARU_0, 0 }, + { "まとあてやγγ‚³γƒ’γ‚œγƒΌ(jikkenjyou)", "Shooting Gallery Duplicate", "Schiessbude (Duplikat)", "Jeu d'Adresse (Duplicata)", ENTR_TEST_SHOOTING_GALLERY_0, 0 }, + { "depthγƒ†γ‚Ήγƒˆ", "Depth Test", "Tiefen Test", "Test de Profondeur", ENTR_DEPTH_TEST_0, 0 }, + { "ハむラルにわケ゛ーム2(γ“γ‚γ‚Œγ¦γΎγ™)", "Hyrule Garden Game (Broken)", "Burghof - Wachen-Minispiel (Kaputt)", "Cour du chateau (Non Fonctionnel)", ENTR_HAIRAL_NIWA2_0, 0 }, }}, // clang-format on }; @@ -1306,7 +1312,25 @@ void Better_Select_PrintMenu(SelectContext* this, GfxPrint* printer) { GfxPrint_SetColor(printer, 255, 255, 255, 255); GfxPrint_SetPos(printer, 12, 2); - GfxPrint_Printf(printer, "Scene Selection"); + if (CVarGetInteger(CVAR_DEVELOPER_TOOLS("DebugWarpScreenTranslation"), 1)) { + switch (gSaveContext.language) { + case LANGUAGE_ENG: + default: + GfxPrint_Printf(printer, "Scene Selection"); + break; + case LANGUAGE_GER: + GfxPrint_Printf(printer, "Szenenauswahl"); + break; + case LANGUAGE_FRA: + GfxPrint_Printf(printer, "Selection de Scene"); + break; + case LANGUAGE_JPN: + GfxPrint_Printf(printer, "γ‚·γƒΌγƒ³γ‚»γƒ¬γ‚―γƒˆ"); + break; + } + } else { + GfxPrint_Printf(printer, "Scene Selection"); + } GfxPrint_SetColor(printer, 255, 255, 255, 255); for (i = 0; i < 20; i++) { @@ -1331,9 +1355,8 @@ void Better_Select_PrintMenu(SelectContext* this, GfxPrint* printer) { case LANGUAGE_FRA: name = this->betterScenes[scene].frenchName; break; - // NTSC TODO: Support JPN Better Select case LANGUAGE_JPN: - name = this->betterScenes[scene].englishName; + name = this->betterScenes[scene].japaneseName; break; } } else { @@ -1364,10 +1387,9 @@ void Better_Select_PrintMenu(SelectContext* this, GfxPrint* printer) { GfxPrint_Printf(printer, "%s", this->betterScenes[this->currentScene].entrancePairs[this->pageDownIndex].frenchName); break; - // NTSC TODO: Support JPN Better Select case LANGUAGE_JPN: GfxPrint_Printf(printer, "%s", - this->betterScenes[this->currentScene].entrancePairs[this->pageDownIndex].englishName); + this->betterScenes[this->currentScene].entrancePairs[this->pageDownIndex].japaneseName); break; } } else { @@ -1432,8 +1454,8 @@ static SceneSelectAgeLabels sAgeLabels[] = { }; static BetterSceneSelectAgeLabels sBetterAgeLabels[] = { - { "οΎœο½ΆοΎ“οΎ‰", "Adult", "Erwachsener", "Adulte" }, - { "ワ「スギ", "Child", "Kind", "Enfant" }, + { "おとγͺ", "Adult", "Erwachsener", "Adulte" }, + { "こと゛も", "Child", "Kind", "Enfant" }, }; void Select_PrintAgeSetting(SelectContext* this, GfxPrint* printer, s32 age) { @@ -1461,19 +1483,25 @@ void Select_PrintAgeSetting(SelectContext* this, GfxPrint* printer, s32 age) { } void Better_Select_PrintAgeSetting(SelectContext* this, GfxPrint* printer, s32 age) { - GfxPrint_SetPos(printer, 25, 25); + if (gSaveContext.language == LANGUAGE_JPN) { + GfxPrint_SetPos(printer, 22, 25); // For better alignment for Japanese menu + } else { + GfxPrint_SetPos(printer, 25, 25); + } GfxPrint_SetColor(printer, 100, 100, 100, 255); if (CVarGetInteger(CVAR_DEVELOPER_TOOLS("DebugWarpScreenTranslation"), 1)) { switch (gSaveContext.language) { case LANGUAGE_ENG: case LANGUAGE_FRA: - case LANGUAGE_JPN: default: GfxPrint_Printf(printer, "(B)Age:"); break; case LANGUAGE_GER: GfxPrint_Printf(printer, "(B)Alter:"); break; + case LANGUAGE_JPN: + GfxPrint_Printf(printer, "(B)γ—γ‚›γŸγ‚›γ„:"); + break; } } else { GfxPrint_Printf(printer, "(B)Age:"); @@ -1586,7 +1614,6 @@ void Better_Select_PrintTimeSetting(SelectContext* this, GfxPrint* printer) { if (CVarGetInteger(CVAR_DEVELOPER_TOOLS("DebugWarpScreenTranslation"), 1)) { switch (gSaveContext.language) { case LANGUAGE_ENG: - case LANGUAGE_JPN: default: label = "Night"; break; @@ -1596,6 +1623,9 @@ void Better_Select_PrintTimeSetting(SelectContext* this, GfxPrint* printer) { case LANGUAGE_FRA: label = "Nuit"; break; + case LANGUAGE_JPN: + label = "γ‚ˆγ‚‹"; + break; } } else { label = "Night"; @@ -1604,7 +1634,6 @@ void Better_Select_PrintTimeSetting(SelectContext* this, GfxPrint* printer) { if (CVarGetInteger(CVAR_DEVELOPER_TOOLS("DebugWarpScreenTranslation"), 1)) { switch (gSaveContext.language) { case LANGUAGE_ENG: - case LANGUAGE_JPN: default: label = "Day"; break; @@ -1614,6 +1643,9 @@ void Better_Select_PrintTimeSetting(SelectContext* this, GfxPrint* printer) { case LANGUAGE_FRA: label = "Jour"; break; + case LANGUAGE_JPN: + label = "ひる"; + break; } } else { label = "Day"; @@ -1622,7 +1654,6 @@ void Better_Select_PrintTimeSetting(SelectContext* this, GfxPrint* printer) { if (CVarGetInteger(CVAR_DEVELOPER_TOOLS("DebugWarpScreenTranslation"), 1)) { switch (gSaveContext.language) { case LANGUAGE_ENG: - case LANGUAGE_JPN: default: GfxPrint_Printf(printer, "(Z/R)Time:"); break; @@ -1632,6 +1663,9 @@ void Better_Select_PrintTimeSetting(SelectContext* this, GfxPrint* printer) { case LANGUAGE_FRA: GfxPrint_Printf(printer, "(Z/R)Temps:"); break; + case LANGUAGE_JPN: + GfxPrint_Printf(printer, "(Z/R)し゛かん:"); + break; } } else { GfxPrint_Printf(printer, "(Z/R)Time:"); From 561f15161525898ad6b4f3854d0705304cccc0c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Thu, 19 Jun 2025 20:42:00 +0000 Subject: [PATCH 47/67] a11y: tts integration with randomizer start menu (#5414) --- .../game-interactor/GameInteractor_HookTable.h | 1 + .../game-interactor/GameInteractor_Hooks.cpp | 4 ++++ .../game-interactor/GameInteractor_Hooks.h | 1 + soh/soh/Enhancements/tts/tts.cpp | 11 +++++++++++ .../gamestates/ovl_file_choose/z_file_choose.c | 2 ++ 5 files changed, 19 insertions(+) diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h index 2c94d27a4..51a6ab5a8 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_HookTable.h @@ -65,6 +65,7 @@ DEFINE_HOOK(OnUpdateFileTargetSelection, (uint8_t optionIndex)); DEFINE_HOOK(OnUpdateFileLanguageSelection, (uint8_t optionIndex)); DEFINE_HOOK(OnUpdateFileQuestSelection, (uint8_t questIndex)); DEFINE_HOOK(OnUpdateFileBossRushOptionSelection, (uint8_t optionIndex, uint8_t optionValue)); +DEFINE_HOOK(OnUpdateFileRandomizerOptionSelection, (uint8_t optionIndex)); DEFINE_HOOK(OnUpdateFileNameSelection, (int16_t charCode)); DEFINE_HOOK(OnFileChooseMain, (void* gameState)); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp index 21f1a9c09..f69cc29af 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.cpp @@ -294,6 +294,10 @@ void GameInteractor_ExecuteOnUpdateFileBossRushOptionSelection(uint8_t optionInd optionValue); } +void GameInteractor_ExecuteOnUpdateFileRandomizerOptionSelection(uint8_t optionIndex) { + GameInteractor::Instance->ExecuteHooks(optionIndex); +} + void GameInteractor_ExecuteOnUpdateFileNameSelection(int16_t charCode) { GameInteractor::Instance->ExecuteHooks(charCode); } diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h index b32dada61..a6f1563f2 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_Hooks.h @@ -72,6 +72,7 @@ void GameInteractor_ExecuteOnUpdateFileTargetSelection(uint8_t optionIndex); void GameInteractor_ExecuteOnUpdateFileLanguageSelection(uint8_t optionIndex); void GameInteractor_ExecuteOnUpdateFileQuestSelection(uint8_t questIndex); void GameInteractor_ExecuteOnUpdateFileBossRushOptionSelection(uint8_t optionIndex, uint8_t optionValue); +void GameInteractor_ExecuteOnUpdateFileRandomizerOptionSelection(uint8_t optionIndex); void GameInteractor_ExecuteOnUpdateFileNameSelection(int16_t charCode); void GameInteractor_ExecuteOnFileChooseMain(void* gameState); diff --git a/soh/soh/Enhancements/tts/tts.cpp b/soh/soh/Enhancements/tts/tts.cpp index 978e5ca24..13dd9f183 100644 --- a/soh/soh/Enhancements/tts/tts.cpp +++ b/soh/soh/Enhancements/tts/tts.cpp @@ -12,6 +12,7 @@ #include "message_data_static.h" #include "overlays/gamestates/ovl_file_choose/file_choose.h" #include "soh/Enhancements/boss-rush/BossRush.h" +#include "soh/Enhancements/FileSelectEnhancements.h" #include "soh/resource/type/SohResourceType.h" extern "C" { @@ -839,6 +840,16 @@ void RegisterOnUpdateMainMenuSelection() { SpeechSynthesizer::Instance->Speak(translation.c_str(), GetLanguageCode()); }); + GameInteractor::Instance->RegisterGameHook( + [](uint8_t optionIndex) { + if (!CVarGetInteger(CVAR_SETTING("A11yTTS"), 0)) + return; + uint8_t language = (gSaveContext.language == LANGUAGE_JPN) ? LANGUAGE_ENG : gSaveContext.language; + + auto optionName = SohFileSelect_GetSettingText(optionIndex, language); + SpeechSynthesizer::Instance->Speak(optionName, GetLanguageCode()); + }); + GameInteractor::Instance->RegisterGameHook([](int16_t charCode) { if (!CVarGetInteger(CVAR_SETTING("A11yTTS"), 0)) return; diff --git a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c index 736616fc9..a212085ae 100644 --- a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c +++ b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c @@ -1540,6 +1540,8 @@ void FileChoose_UpdateRandomizerMenu(GameState* thisx) { } } + GameInteractor_ExecuteOnUpdateFileRandomizerOptionSelection(this->randomizerIndex); + Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); } From 180d6a1b90068f60969b534ee4433b32b047f689 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Thu, 19 Jun 2025 20:42:53 +0000 Subject: [PATCH 48/67] FasterShadowShip.cpp (#5114) Makes boat 25x faster --- .../TimeSavers/FasterShadowShip.cpp | 26 +++++++++++++++++++ .../vanilla-behavior/GIVanillaBehavior.h | 9 +++++++ soh/soh/SohGui/SohMenuEnhancements.cpp | 3 +++ .../actors/ovl_Bg_Haka_Ship/z_bg_haka_ship.c | 4 ++- 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 soh/soh/Enhancements/TimeSavers/FasterShadowShip.cpp diff --git a/soh/soh/Enhancements/TimeSavers/FasterShadowShip.cpp b/soh/soh/Enhancements/TimeSavers/FasterShadowShip.cpp new file mode 100644 index 000000000..c59ccc603 --- /dev/null +++ b/soh/soh/Enhancements/TimeSavers/FasterShadowShip.cpp @@ -0,0 +1,26 @@ +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "functions.h" +#include "src/overlays/actors/ovl_Bg_Haka_Ship/z_bg_haka_ship.h" +} + +void RegisterFasterShadowShip() { + COND_VB_SHOULD(VB_SHADOW_SHIP_SET_SPEED, CVarGetInteger(CVAR_ENHANCEMENT("FasterShadowShip"), 0), { + BgHakaShip* ship = va_arg(args, BgHakaShip*); + PlayState* play = va_arg(args, PlayState*); + if (!Play_InCsMode(play)) { + if (Actor_FindNearby(play, &ship->dyna.actor, ACTOR_EN_TEST, ACTORCAT_ENEMY, 800.0) == NULL && + Actor_FindNearby(play, &ship->dyna.actor, ACTOR_PLAYER, ACTORCAT_PLAYER, 450.0) != NULL) { + *should = false; + ship->dyna.actor.speedXZ = 25.0f; + } else if (ship->dyna.actor.speedXZ > 4.0f) { + *should = false; + ship->dyna.actor.speedXZ = 4.0f; + } + } + }); +} + +static RegisterShipInitFunc initFunc(RegisterFasterShadowShip, { CVAR_ENHANCEMENT("FasterShadowShip") }); diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index f4c05f98c..973c10b17 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -1806,6 +1806,15 @@ typedef enum { // - `*int16_t` - original next entrance index (`play->setupExitList[exitIndex - 1]`) VB_SET_VOIDOUT_FROM_SURFACE, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - BgHakaShip* + // - PlayState* + VB_SHADOW_SHIP_SET_SPEED, + // #### `result` // ```c // (!CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS, EQUIP_INV_BOOTS_IRON) && diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index 15cb81f9d..6d64b0a60 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -320,6 +320,9 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "Faster Heavy Block Lift", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("FasterHeavyBlockLift")) .Options(CheckboxOptions().Tooltip("Speeds up lifting Silver Rocks and Obelisks.")); + AddWidget(path, "Faster Shadow Ship", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FasterShadowShip")) + .Options(CheckboxOptions().Tooltip("Speeds up ship in Shadow Temple.")); AddWidget(path, "Fast Chests", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("FastChests")) .Options(CheckboxOptions().Tooltip("Makes Link always kick the chest to open it, instead of doing the longer " diff --git a/soh/src/overlays/actors/ovl_Bg_Haka_Ship/z_bg_haka_ship.c b/soh/src/overlays/actors/ovl_Bg_Haka_Ship/z_bg_haka_ship.c index bdca027bc..e595b8e62 100644 --- a/soh/src/overlays/actors/ovl_Bg_Haka_Ship/z_bg_haka_ship.c +++ b/soh/src/overlays/actors/ovl_Bg_Haka_Ship/z_bg_haka_ship.c @@ -7,6 +7,8 @@ #include "z_bg_haka_ship.h" #include "objects/object_haka_objects/object_haka_objects.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" + #define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) void BgHakaShip_Init(Actor* thisx, PlayState* play); @@ -133,7 +135,7 @@ void BgHakaShip_Move(BgHakaShip* this, PlayState* play) { this->dyna.actor.speedXZ = 0.0f; Message_StartTextbox(play, 0x5071, NULL); this->actionFunc = BgHakaShip_SetupCrash; - } else { + } else if (GameInteractor_Should(VB_SHADOW_SHIP_SET_SPEED, true, this, play)) { Math_StepToF(&this->dyna.actor.speedXZ, 4.0f, 0.2f); } child = this->dyna.actor.child; From 4c31f2bc8822bc87d59abc29997b15e210d66538 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Thu, 19 Jun 2025 20:43:39 +0000 Subject: [PATCH 49/67] Extend RT_BLUE_FIRE_MUD_WALLS (#5215) Co-authored-by: Pepper0ni <93387759+Pepper0ni@users.noreply.github.com> --- .../location_access/dungeons/dodongos_cavern.cpp | 6 +++++- .../randomizer/location_access/dungeons/shadow_temple.cpp | 3 ++- .../randomizer/location_access/overworld/goron_city.cpp | 6 ++++-- soh/soh/Enhancements/randomizer/logic.cpp | 4 +++- soh/soh/Enhancements/randomizer/settings.cpp | 7 +++++-- 5 files changed, 19 insertions(+), 7 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp index 4f56d0f65..bef3b58ae 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp @@ -572,7 +572,11 @@ void RegionTable_Init_DodongosCavern() { areaTable[RR_DODONGOS_CAVERN_BOSS_ROOM] = Region("Dodongos Cavern Boss Room", SCENE_DODONGOS_CAVERN_BOSS, { // Events - EventAccess(&logic->DodongosCavernClear, []{return Here(RR_DODONGOS_CAVERN_BOSS_ROOM, []{return logic->HasExplosives() || (logic->CanUse(RG_MEGATON_HAMMER) && ctx->GetTrickOption(RT_DC_HAMMER_FLOOR));}) && logic->CanKillEnemy(RE_KING_DODONGO); /*todo add chu kill to tricks*/}), + // Blue Fire Arrows need similar accuracy as hammer trick, only put in logic when both hammer & blue fire tricks enabled + EventAccess(&logic->DodongosCavernClear, []{return Here(RR_DODONGOS_CAVERN_BOSS_ROOM, []{return logic->HasExplosives() || + (ctx->GetTrickOption(RT_DC_HAMMER_FLOOR) ? logic->CanUse(RG_MEGATON_HAMMER) || (ctx->GetTrickOption(RT_BLUE_FIRE_MUD_WALLS) && logic->BlueFire()) : + ctx->GetTrickOption(RT_BLUE_FIRE_MUD_WALLS) && logic->CanUse(RG_BOTTLE_WITH_BLUE_FIRE));}) + && logic->CanKillEnemy(RE_KING_DODONGO);}), }, { // Locations LOCATION(RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, true), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp index 127320129..d276fc418 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp @@ -376,7 +376,8 @@ void RegionTable_Init_ShadowTemple() { //Assumes lens is checked on entry areaTable[RR_SHADOW_TEMPLE_MQ_INVISIBLE_MAZE] = Region("Shadow Temple MQ Invisible Maze", SCENE_SHADOW_TEMPLE, {}, { //Locations - LOCATION(RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, (logic->CanUse(RG_LENS_OF_TRUTH) || ctx->GetTrickOption(RT_LENS_SHADOW_MQ_DEADHAND)) && logic->CanKillEnemy(RE_DEAD_HAND) && logic->CanDetonateUprightBombFlower()), + //don't use CanDetonateUprightBombFlower as blue fire logic would need to account for player having multiple bottles & taking damage multiple times + LOCATION(RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, (logic->CanUse(RG_LENS_OF_TRUTH) || ctx->GetTrickOption(RT_LENS_SHADOW_MQ_DEADHAND)) && logic->CanKillEnemy(RE_DEAD_HAND) && (logic->CanDetonateBombFlowers() || logic->HasItem(RG_GORONS_BRACELET))), LOCATION(RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, true), LOCATION(RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1, logic->CanBreakPots()), LOCATION(RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2, logic->CanBreakPots()), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp index 92c218997..7027ab6c6 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/goron_city.cpp @@ -11,9 +11,11 @@ void RegionTable_Init_GoronCity() { EventAccess(&logic->StickPot, []{return logic->IsChild;}), EventAccess(&logic->BugRock, []{return logic->BlastOrSmash() || logic->CanUse(RG_SILVER_GAUNTLETS);}), EventAccess(&logic->GoronCityChildFire, []{return logic->IsChild && logic->CanUse(RG_DINS_FIRE);}), - EventAccess(&logic->GCWoodsWarpOpen, []{return logic->BlastOrSmash() || logic->CanUse(RG_DINS_FIRE) || logic->CanUse(RG_FAIRY_BOW) || logic->HasItem(RG_GORONS_BRACELET) || logic->GoronCityChildFire;}), + EventAccess(&logic->GCWoodsWarpOpen, []{return logic->CanDetonateUprightBombFlower() || logic->CanUse(RG_MEGATON_HAMMER) || logic->GoronCityChildFire;}), EventAccess(&logic->GCDaruniasDoorOpenChild, []{return logic->IsChild && logic->CanUse(RG_ZELDAS_LULLABY);}), - EventAccess(&logic->StopGCRollingGoronAsAdult, []{return logic->IsAdult && (logic->HasItem(RG_GORONS_BRACELET) || logic->HasExplosives() || logic->CanUse(RG_FAIRY_BOW) || (ctx->GetTrickOption(RT_GC_LINK_GORON_DINS) && logic->CanUse(RG_DINS_FIRE)));}), + // bottle animation causes similar complications as stopping goron with Din's Fire, only put in logic when both din's & blue fire tricks enabled + EventAccess(&logic->StopGCRollingGoronAsAdult, []{return logic->IsAdult && (logic->HasItem(RG_GORONS_BRACELET) || logic->HasExplosives() || logic->CanUse(RG_FAIRY_BOW) || + (ctx->GetTrickOption(RT_GC_LINK_GORON_DINS) && (logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_BLUE_FIRE_MUD_WALLS) && logic->CanUse(RG_BOTTLE_WITH_BLUE_FIRE)))));}), }, { //Locations LOCATION(RC_GC_MAZE_LEFT_CHEST, logic->CanUse(RG_MEGATON_HAMMER) || logic->CanUse(RG_SILVER_GAUNTLETS) || (ctx->GetTrickOption(RT_GC_LEFTMOST) && logic->HasExplosives() && logic->CanUse(RG_HOVER_BOOTS))), diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index da20315a2..d4c3efd1d 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -964,7 +964,9 @@ bool Logic::CanDetonateBombFlowers() { } bool Logic::CanDetonateUprightBombFlower() { - return CanDetonateBombFlowers() || HasItem(RG_GORONS_BRACELET); + return CanDetonateBombFlowers() || HasItem(RG_GORONS_BRACELET) || + (ctx->GetTrickOption(RT_BLUE_FIRE_MUD_WALLS) && CanUse(RG_BOTTLE_WITH_BLUE_FIRE) && + (EffectiveHealth() != 1 || CanUse(RG_NAYRUS_LOVE))); } bool Logic::MQWaterLevel(RandoWaterLevel level) { diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 7715e332d..6ddf0f53e 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -398,8 +398,11 @@ void Settings::CreateOptions() { "combined with \"Simple damage boosts\" for greater uses."); OPT_TRICK(RT_BOMBCHU_BEEHIVES, RCQUEST_BOTH, RA_NONE, { Tricks::Tag::NOVICE }, "Bombchu Beehives", "Allows exploding beehives with Bombchus."); - OPT_TRICK(RT_BLUE_FIRE_MUD_WALLS, RCQUEST_BOTH, RA_NONE, { Tricks::Tag::NOVICE }, "Break Mud Walls with Blue Fire", - "Use Blue Fire to break mud walls."); + OPT_TRICK(RT_BLUE_FIRE_MUD_WALLS, RCQUEST_BOTH, RA_NONE, { Tricks::Tag::NOVICE }, "Blue Fire Beyond Red Ice", + "Use Blue Fire to break mud walls, detonate bomb flowers, and break floor to King Dodongo.\nDoes not " + "apply to MQ Dead Hand bomb flowers.\nUsing blue fire on bombflower to stop rolling goron also requires " + "\"Stop Link the Goron with Din's Fire\".\nUsing blue fire arrows to break floor in King Dodongo's " + "chamber also requires \"Dodongo\'s Cavern Smash the Boss Lobby Floor\"."); OPT_TRICK(RT_KF_ADULT_GS, RCQUEST_BOTH, RA_KOKIRI_FOREST, { Tricks::Tag::NOVICE }, "Adult Kokiri Forest GS with Hover Boots", "Can be obtained without Hookshot by using the Hover Boots off of one of the roots."); From 1e60c48e3a513a3674fdae08a673ee7012fd7a98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Thu, 19 Jun 2025 21:27:56 +0000 Subject: [PATCH 50/67] a11y: linux tts with espeak-ng (#5428) * a11y: linux tts with espeak-ng * dlopen * Show setting on Linux --- .github/workflows/apt-deps.txt | 2 +- soh/CMakeLists.txt | 29 +++++++---- .../ESpeakSpeechSynthesizer.cpp | 49 +++++++++++++++++++ .../ESpeakSpeechSynthesizer.h | 34 +++++++++++++ .../speechsynthesizer/SpeechSynthesizer.h | 2 + soh/soh/OTRGlobals.cpp | 6 +-- soh/soh/SohGui/SohMenuSettings.cpp | 2 +- 7 files changed, 109 insertions(+), 15 deletions(-) create mode 100644 soh/soh/Enhancements/speechsynthesizer/ESpeakSpeechSynthesizer.cpp create mode 100644 soh/soh/Enhancements/speechsynthesizer/ESpeakSpeechSynthesizer.h diff --git a/.github/workflows/apt-deps.txt b/.github/workflows/apt-deps.txt index 51e9574f8..3461cdbac 100644 --- a/.github/workflows/apt-deps.txt +++ b/.github/workflows/apt-deps.txt @@ -1 +1 @@ -libusb-dev libusb-1.0-0-dev libsdl2-dev libsdl2-net-dev libpng-dev libglew-dev nlohmann-json3-dev libtinyxml2-dev libspdlog-dev ninja-build +libusb-dev libusb-1.0-0-dev libsdl2-dev libsdl2-net-dev libpng-dev libglew-dev nlohmann-json3-dev libtinyxml2-dev libspdlog-dev libespeak-ng-dev ninja-build diff --git a/soh/CMakeLists.txt b/soh/CMakeLists.txt index 461c28ca5..1f8383664 100644 --- a/soh/CMakeLists.txt +++ b/soh/CMakeLists.txt @@ -142,16 +142,21 @@ endif() # handle Network removals if (!BUILD_REMOTE_CONTROL) - list(FILTER soh__ EXCLUDE REGEX "soh/Enhancements/crowd-control/*") + list(FILTER soh__ EXCLUDE REGEX "soh/Enhancements/crowd-control/") endif() # handle speechsynthesizer removals if (CMAKE_SYSTEM_NAME STREQUAL "Windows") - list(FILTER soh__ EXCLUDE REGEX "soh/Enhancements/speechsynthesizer/Darwin*") + list(FILTER soh__ EXCLUDE REGEX "soh/Enhancements/speechsynthesizer/Darwin") elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin") - list(FILTER soh__ EXCLUDE REGEX "soh/Enhancements/speechsynthesizer/SAPI*") + list(FILTER soh__ EXCLUDE REGEX "soh/Enhancements/speechsynthesizer/SAPI") else() - list(FILTER soh__ EXCLUDE REGEX "soh/Enhancements/speechsynthesizer/(Darwin|SAPI).*") + list(FILTER soh__ EXCLUDE REGEX "soh/Enhancements/speechsynthesizer/(Darwin|SAPI)") +endif() + +find_library(ESPEAK espeak-ng) +if (NOT ESPEAK) + list(FILTER soh__ EXCLUDE REGEX "soh/Enhancements/speechsynthesizer/ESpeak") endif() # soh/Extractor {{{ @@ -177,12 +182,12 @@ file(GLOB_RECURSE src__ RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/*.c" "src/*.h" set_source_files_properties(${src__} PROPERTIES COMPILE_OPTIONS "${WARNING_OVERRIDE}") list(APPEND src__ ${CMAKE_CURRENT_SOURCE_DIR}/Resource.rc) -list(FILTER src__ EXCLUDE REGEX "src/dmadata/*") -list(FILTER src__ EXCLUDE REGEX "src/elf_message/*") -list(FILTER src__ EXCLUDE REGEX "src/libultra/io/*") -list(FILTER src__ EXCLUDE REGEX "src/libultra/libc/*") -list(FILTER src__ EXCLUDE REGEX "src/libultra/os/*") -list(FILTER src__ EXCLUDE REGEX "src/libultra/rmon/*") +list(FILTER src__ EXCLUDE REGEX "src/dmadata/") +list(FILTER src__ EXCLUDE REGEX "src/elf_message/") +list(FILTER src__ EXCLUDE REGEX "src/libultra/io/") +list(FILTER src__ EXCLUDE REGEX "src/libultra/libc/") +list(FILTER src__ EXCLUDE REGEX "src/libultra/os/") +list(FILTER src__ EXCLUDE REGEX "src/libultra/rmon/") list(APPEND src__ "src/libultra/libc/sprintf.c") list(REMOVE_ITEM src__ "src/libultra/gu/cosf.c") list(REMOVE_ITEM src__ "src/libultra/gu/lookat.c") @@ -292,6 +297,10 @@ if (BUILD_REMOTE_CONTROL) endif() endif() +if (ESPEAK) + add_compile_definitions(ESPEAK=1) +endif() + target_include_directories(${PROJECT_NAME} PRIVATE assets ${CMAKE_CURRENT_SOURCE_DIR}/include/ ${CMAKE_CURRENT_SOURCE_DIR}/src/ diff --git a/soh/soh/Enhancements/speechsynthesizer/ESpeakSpeechSynthesizer.cpp b/soh/soh/Enhancements/speechsynthesizer/ESpeakSpeechSynthesizer.cpp new file mode 100644 index 000000000..f92959ff1 --- /dev/null +++ b/soh/soh/Enhancements/speechsynthesizer/ESpeakSpeechSynthesizer.cpp @@ -0,0 +1,49 @@ +#include "ESpeakSpeechSynthesizer.h" +#include +#include + +ESpeakSpeechSynthesizer::ESpeakSpeechSynthesizer() { +} + +bool ESpeakSpeechSynthesizer::DoInit() { + void* espeak = dlopen("libespeak-ng.so", RTLD_LAZY | RTLD_LOCAL); + if (espeak != NULL) { + this->Initialize = (speak_Initialize)dlsym(espeak, "espeak_Initialize"); + this->SetVoiceByProperties = (speak_SetVoiceByProperties)dlsym(espeak, "espeak_SetVoiceByProperties"); + this->Synth = (speak_Synth)dlsym(espeak, "espeak_Synth"); + this->Terminate = (speak_Terminate)dlsym(espeak, "espeak_Terminate"); + if (this->Initialize == NULL || this->SetVoiceByProperties == NULL || this->Synth == NULL || + this->Terminate == NULL) { + lusprintf(__FILE__, __LINE__, 2, "Failed to load espeak-ng"); + dlclose(espeak); + return false; + } else { + this->espeak = espeak; + return this->Initialize(AUDIO_OUTPUT_PLAYBACK, 100, NULL, 0) != -1; + } + } + return true; +} + +void ESpeakSpeechSynthesizer::DoUninitialize() { + if (this->espeak != NULL) { + this->Terminate(); + dlclose(this->espeak); + this->espeak = NULL; + } +} + +void ESpeakSpeechSynthesizer::Speak(const char* text, const char* language) { + if (this->espeak == NULL) { + lusprintf(__FILE__, __LINE__, 2, "Spoken Text (%s): %s", language, text); + } else { + if (language != this->mLanguage) { + espeak_VOICE voice = { .languages = language }; + if (this->SetVoiceByProperties(&voice)) { + return; + } + this->mLanguage = language; + } + this->Synth(text, 100, 0, POS_CHARACTER, 0, espeakCHARS_UTF8, NULL, NULL); + } +} diff --git a/soh/soh/Enhancements/speechsynthesizer/ESpeakSpeechSynthesizer.h b/soh/soh/Enhancements/speechsynthesizer/ESpeakSpeechSynthesizer.h new file mode 100644 index 000000000..0844b9293 --- /dev/null +++ b/soh/soh/Enhancements/speechsynthesizer/ESpeakSpeechSynthesizer.h @@ -0,0 +1,34 @@ +#pragma once + +#include "SpeechSynthesizer.h" + +extern "C" { +#include + +// C23 typeof could help here +typedef ESPEAK_API int (*speak_Initialize)(espeak_AUDIO_OUTPUT output, int buflength, const char* path, int options); +typedef ESPEAK_API espeak_ERROR (*speak_Terminate)(void); +typedef ESPEAK_API espeak_ERROR (*speak_SetVoiceByProperties)(espeak_VOICE* voice_spec); +typedef ESPEAK_API espeak_ERROR (*speak_Synth)(const void* text, size_t size, unsigned int position, + espeak_POSITION_TYPE position_type, unsigned int end_position, + unsigned int flags, unsigned int* unique_identifier, void* user_data); +} + +class ESpeakSpeechSynthesizer : public SpeechSynthesizer { + public: + ESpeakSpeechSynthesizer(); + + void Speak(const char* text, const char* language); + + protected: + bool DoInit(void); + void DoUninitialize(void); + + private: + const char* mLanguage = NULL; + void* espeak = NULL; + speak_Initialize Initialize = NULL; + speak_SetVoiceByProperties SetVoiceByProperties = NULL; + speak_Synth Synth = NULL; + speak_Terminate Terminate = NULL; +}; diff --git a/soh/soh/Enhancements/speechsynthesizer/SpeechSynthesizer.h b/soh/soh/Enhancements/speechsynthesizer/SpeechSynthesizer.h index 29d209b5f..e82da907f 100644 --- a/soh/soh/Enhancements/speechsynthesizer/SpeechSynthesizer.h +++ b/soh/soh/Enhancements/speechsynthesizer/SpeechSynthesizer.h @@ -35,6 +35,8 @@ class SpeechSynthesizer { #include "SAPISpeechSynthesizer.h" #elif defined(__APPLE__) #include "DarwinSpeechSynthesizer.h" +#elif ESPEAK +#include "ESpeakSpeechSynthesizer.h" #endif #include "SpeechLogger.h" diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index e869bbc05..4b3042072 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -1229,14 +1229,14 @@ extern "C" void InitOTR() { ActorDB::Instance = new ActorDB(); #ifdef __APPLE__ SpeechSynthesizer::Instance = new DarwinSpeechSynthesizer(); - SpeechSynthesizer::Instance->Init(); #elif defined(_WIN32) SpeechSynthesizer::Instance = new SAPISpeechSynthesizer(); - SpeechSynthesizer::Instance->Init(); +#elif ESPEAK + SpeechSynthesizer::Instance = new ESpeakSpeechSynthesizer(); #else SpeechSynthesizer::Instance = new SpeechLogger(); - SpeechSynthesizer::Instance->Init(); #endif + SpeechSynthesizer::Instance->Init(); #ifdef ENABLE_REMOTE_CONTROL CrowdControl::Instance = new CrowdControl(); diff --git a/soh/soh/SohGui/SohMenuSettings.cpp b/soh/soh/SohGui/SohMenuSettings.cpp index c3c5bdfa1..0221ae3f7 100644 --- a/soh/soh/SohGui/SohMenuSettings.cpp +++ b/soh/soh/SohGui/SohMenuSettings.cpp @@ -190,7 +190,7 @@ void SohMenu::AddMenuSettings() { .ComboMap(languages) .DefaultIndex(LANGUAGE_ENG)); AddWidget(path, "Accessibility", WIDGET_SEPARATOR_TEXT); -#if defined(_WIN32) || defined(__APPLE__) +#if defined(_WIN32) || defined(__APPLE__) || defined(ESPEAK) AddWidget(path, "Text to Speech", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_SETTING("A11yTTS")) .RaceDisable(false) From 7f3aac36b223b383444d8f2239b9a0f3f601d2ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Thu, 19 Jun 2025 21:53:15 +0000 Subject: [PATCH 51/67] ShuffleFreestanding: ShipInit (#5583) --- .../randomizer/ShuffleFreestanding.cpp | 23 +++++++++++-------- .../randomizer/ShuffleFreestanding.h | 9 -------- .../Enhancements/randomizer/hook_handlers.cpp | 14 ----------- 3 files changed, 13 insertions(+), 33 deletions(-) delete mode 100644 soh/soh/Enhancements/randomizer/ShuffleFreestanding.h diff --git a/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp b/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp index fbd459458..7291fdbef 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleFreestanding.cpp @@ -1,17 +1,17 @@ -#include "ShuffleFreestanding.h" +#include extern "C" { +#include "variables.h" #include "functions.h" extern PlayState* gPlayState; } extern void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play); -void ShuffleFreestanding_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs) { - va_list args; - va_copy(args, originalArgs); +void RegisterShuffleFreestanding() { + bool shouldRegister = IS_RANDO && RAND_GET_OPTION(RSK_SHUFFLE_FREESTANDING); - if (id == VB_ITEM00_DESPAWN) { + COND_VB_SHOULD(VB_ITEM00_DESPAWN, shouldRegister, { EnItem00* item00 = va_arg(args, EnItem00*); // Heart pieces and small keys are handled by default non-freestanding shuffles. @@ -22,14 +22,16 @@ void ShuffleFreestanding_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* sh uint32_t params = TWO_ACTOR_PARAMS((int32_t)item00->actor.world.pos.x, (int32_t)item00->actor.world.pos.z); Rando::Location* loc = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(item00->actor.id, gPlayState->sceneNum, params); + RandomizerCheck randomizerCheck = loc->GetRandomizerCheck(); + if (Rando::Context::GetInstance()->GetItemLocation(randomizerCheck)->HasObtained()) { + return; + } uint8_t isDungeon = loc->IsDungeon(); uint8_t freestandingSetting = RAND_GET_OPTION(RSK_SHUFFLE_FREESTANDING); - RandomizerCheck randomizerCheck = loc->GetRandomizerCheck(); - bool checkObtained = Rando::Context::GetInstance()->GetItemLocation(randomizerCheck)->HasObtained(); // Don't change to randomized item if current freestanding item isn't shuffled or already obtained. if ((freestandingSetting == RO_SHUFFLE_FREESTANDING_OVERWORLD && isDungeon) || - (freestandingSetting == RO_SHUFFLE_FREESTANDING_DUNGEONS && !isDungeon) || checkObtained || + (freestandingSetting == RO_SHUFFLE_FREESTANDING_DUNGEONS && !isDungeon) || randomizerCheck == RC_UNKNOWN_CHECK) { return; } @@ -41,7 +43,7 @@ void ShuffleFreestanding_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* sh item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; *should = false; - } + }); } void Rando::StaticData::RegisterFreestandingLocations() { @@ -284,4 +286,5 @@ void Rando::StaticData::RegisterFreestandingLocations() { // clang-format on } -static RegisterShipInitFunc initFunc(Rando::StaticData::RegisterFreestandingLocations); +static RegisterShipInitFunc registerShuffleFreestanding(RegisterShuffleFreestanding, { "IS_RANDO" }); +static RegisterShipInitFunc registerShuffleFreestandingLocations(Rando::StaticData::RegisterFreestandingLocations); diff --git a/soh/soh/Enhancements/randomizer/ShuffleFreestanding.h b/soh/soh/Enhancements/randomizer/ShuffleFreestanding.h deleted file mode 100644 index 9234f76fa..000000000 --- a/soh/soh/Enhancements/randomizer/ShuffleFreestanding.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef SHUFFLE_FREESTANDING_H -#define SHUFFLE_FREESTANDING_H - -#include -#include - -void ShuffleFreestanding_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs); - -#endif diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 7f23f60cc..a6bbae638 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -8,7 +8,6 @@ #include "soh/Enhancements/randomizer/dungeon.h" #include "soh/Enhancements/randomizer/fishsanity.h" #include "soh/Enhancements/randomizer/static_data.h" -#include "soh/Enhancements/randomizer/ShuffleFreestanding.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/SohGui/ImGuiUtils.h" @@ -2330,8 +2329,6 @@ void RandomizerRegisterHooks() { static uint32_t fishsanityOnVanillaBehaviorHook = 0; static uint32_t fishsanityOnItemReceiveHook = 0; - static uint32_t shuffleFreestandingOnVanillaBehaviorHook = 0; - GameInteractor::Instance->RegisterGameHook([](int32_t fileNum) { ShipInit::Init("IS_RANDO"); @@ -2365,9 +2362,6 @@ void RandomizerRegisterHooks() { fishsanityOnVanillaBehaviorHook); GameInteractor::Instance->UnregisterGameHook(fishsanityOnItemReceiveHook); - GameInteractor::Instance->UnregisterGameHook( - shuffleFreestandingOnVanillaBehaviorHook); - onFlagSetHook = 0; onSceneFlagSetHook = 0; onPlayerUpdateForRCQueueHook = 0; @@ -2393,8 +2387,6 @@ void RandomizerRegisterHooks() { fishsanityOnVanillaBehaviorHook = 0; fishsanityOnItemReceiveHook = 0; - shuffleFreestandingOnVanillaBehaviorHook = 0; - if (!IS_RANDO) return; @@ -2459,11 +2451,5 @@ void RandomizerRegisterHooks() { fishsanityOnItemReceiveHook = GameInteractor::Instance->RegisterGameHook( Rando::Fishsanity::OnItemReceiveHandler); } - - if (RAND_GET_OPTION(RSK_SHUFFLE_FREESTANDING) != RO_SHUFFLE_FREESTANDING_OFF) { - shuffleFreestandingOnVanillaBehaviorHook = - GameInteractor::Instance->RegisterGameHook( - ShuffleFreestanding_OnVanillaBehaviorHandler); - } }); } From 517b52176c7bec5a43b669acd9ff9e0242259ea2 Mon Sep 17 00:00:00 2001 From: Schicksal88 Date: Thu, 19 Jun 2025 23:53:50 +0200 Subject: [PATCH 52/67] German translation cleanup (#5471) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * German translation cleanup - German ice trap names and code for it to show up. Changed the order of translations to english/french/german to make it consistent with item_list.cpp. - German shops as those are now complete. - German translation for ingame fileselect rando menu. - Added function to mark an item as plural. This is necessary to have proper grammar in most german sentences. If an item has a € at the end of it and the sentence it get's inserted into has |singular|plural| forms defined, the singular part get's removed. - Added the plural markers & |singular|plural| parts to the entire german script where it was necessary. - Fixed grammar, typos, inconsistencies and now everything uses official Zelda-game names. - Fixed vanilla/master quest map text * ice trap fix accidentally commented out french twice instead of spanish. fixed. * German Randomizer Some fix for Schicksal * Fix number 2 Fix number 2 for Schicksal * Update soh/soh/Enhancements/custom-message/CustomMessageManager.cpp Co-authored-by: Philip DubΓ© * clang format --------- Co-authored-by: amafresh Co-authored-by: Philip DubΓ© --- .../Enhancements/FileSelectEnhancements.cpp | 12 +- .../custom-message/CustomMessageManager.cpp | 23 + .../custom-message/CustomMessageManager.h | 7 + .../randomizer/3drando/hint_list.cpp | 765 ++++++----- .../hint_list/hint_list_exclude_dungeon.cpp | 490 +++---- .../hint_list/hint_list_exclude_overworld.cpp | 624 ++++----- .../3drando/hint_list/hint_list_item.cpp | 790 +++++------ .../Enhancements/randomizer/3drando/shops.cpp | 1154 +++++++++-------- .../randomizer/3drando/spoiler_log.cpp | 16 + .../Enhancements/randomizer/3drando/text.hpp | 64 +- soh/soh/Enhancements/randomizer/hint.cpp | 1 + soh/soh/Enhancements/randomizer/item_list.cpp | 285 ++-- .../Enhancements/randomizer/randomizer.cpp | 471 +++++-- soh/soh/SaveManager.cpp | 4 +- 14 files changed, 2518 insertions(+), 2188 deletions(-) diff --git a/soh/soh/Enhancements/FileSelectEnhancements.cpp b/soh/soh/Enhancements/FileSelectEnhancements.cpp index f9e993b6a..ec8810d02 100644 --- a/soh/soh/Enhancements/FileSelectEnhancements.cpp +++ b/soh/soh/Enhancements/FileSelectEnhancements.cpp @@ -11,7 +11,7 @@ std::array RandomizerSettingsMenuText[RSM_MAX] = { // English "Start Randomizer", // German - "Start Randomizer", + "Randomizer starten", // French "Commencer le Randomizer", }, @@ -19,7 +19,7 @@ std::array RandomizerSettingsMenuText[RSM_MAX] = { // English "Generate New Randomizer Seed", // German - "Generate New Randomizer Seed", + "Neuen Randomizer Seed generieren", // French "GΓ©nΓ©rer une nouvelle seed pour le Randomizer", }, @@ -27,7 +27,7 @@ std::array RandomizerSettingsMenuText[RSM_MAX] = { // English "Open Randomizer Settings", // German - "Open Randomizer Settings", + "Randomizer Optionen ΓΆffnen", // French "Ouvrir les paramΓ¨tres du Randomizer", }, @@ -35,7 +35,7 @@ std::array RandomizerSettingsMenuText[RSM_MAX] = { // English "Generating...", // German - "Generating...", + "Generiere...", // French "GΓ©nΓ©ration en cours...", }, @@ -47,11 +47,11 @@ std::array RandomizerSettingsMenuText[RSM_MAX] = { ",\nor drop a spoiler log on the game window.", #endif // German - "No randomizer seed loaded.\nPlease generate one first" + "Kein Randomizer Seed gefunden.\nBitte generiere zuerst einen" #if defined(__WIIU__) || defined(__SWITCH__) ".", #else - ",\nor drop a spoiler log on the game window.", + ",\noder ziehe ein Spoiler Log\nauf das Spielfenster.", #endif // French "Aucune Seed de Randomizer actuellement disponible.\nGΓ©nΓ©rez-en une dans les \"Randomizer Settings\"" diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp index 27b080358..0ebba19ec 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.cpp @@ -623,6 +623,29 @@ void CustomMessage::InsertNumber(uint8_t num) { Replace("[[d]]", std::to_string(num)); } +void CustomMessage::SetSingularPlural() { + for (std::string& str : messages) { + size_t firstBar = str.find('|'); + if (firstBar != std::string::npos) { + size_t euroSign = str.find("€"); + size_t secondBar = str.find('|', firstBar + 1); + if (secondBar != std::string::npos) { + size_t thirdBar = str.find('|', secondBar + 1); + if (thirdBar != std::string::npos) { + if (euroSign == std::string::npos) { + str.erase(secondBar, thirdBar - secondBar); + } else { + str.erase(firstBar, secondBar - firstBar); + } + } + } + } + } + // remove the remaining bar + this->Replace("|", ""); + this->Replace("€", ""); +} + void CustomMessage::Capitalize() { for (std::string str : messages) { (str)[0] = std::toupper((str)[0]); diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.h b/soh/soh/Enhancements/custom-message/CustomMessageManager.h index 3fbd7dfb5..f0edd3079 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.h @@ -153,6 +153,13 @@ class CustomMessage { */ void InsertNumber(uint8_t num); + /** + * @brief A € sign at the end of an item name signals that it is plural. + * If a hint text has |singular|plural| forms specified, the unused one get's deleted. + * If no € sign is present, the singular form is used. + */ + void SetSingularPlural(); + /** * @brief Replaces various symbols with the control codes necessary to * display them in OoT's textboxes. i.e. special characters, colors, newlines, diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp index 734ab00bf..2d597bc95 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list.cpp @@ -9,7 +9,7 @@ using namespace std::literals::string_literals; // Big thanks to Lioncache, Gabyelnuevo, Danius88, and Charade for their translations! -// Text is {english, french, spanish} +// Text is {english, german, french} // there are special characters that are read for certain in game commands: // ^ is a box break @@ -19,6 +19,9 @@ using namespace std::literals::string_literals; // - OoT Randomizer // '[[d]]' indicates a number will be placed there, numbers in [[]] will be replaced by other text in hints +// '€' at the end of an item name indicates that it's plural. +// '|' separates singular and plural form |singular|plural|. + namespace Rando { void StaticData::HintTable_Init() { @@ -29,24 +32,24 @@ void StaticData::HintTable_Init() { hintTextTable[RHT_NONE] = HintText(CustomMessage("No Hint", "Kein Hinweis", "Pas d'Indice" )); hintTextTable[RHT_WAY_OF_THE_HERO] = HintText(CustomMessage( "They say that #[[1]]# is on #the way of the hero#.", - "Man erzΓ€hlt sich, daß #[[1]]# auf #dem Weg des Helden# sei.", + /*german*/ "Man erzΓ€hlt sich, daß #[[1]]# #der Weg des Helden# verlaufe.", /*french*/ "Selon moi, #[[1]]# est sur #la voie du hΓ©ros#.", {QM_RED, QM_LBLUE})); // /*spanish*/ "SegΓΊn dicen, #[[1]]# conduce a la senda del hΓ©roe." hintTextTable[RHT_FOOLISH] = HintText(CustomMessage( "They say that plundering #[[1]]# is #a foolish choice#.", - "Man erzΓ€hlt sich, daß das PlΓΌndern von #[[1]]# #eine tΓΆrichte Entscheidung# sei.", - /*french*/ "Selon moi, explorer #[[1]]# est #futile#.", {QM_RED, QM_PINK})); - // /*spanish*/ "SegΓΊn dicen, inspeccionar #[[1]]# #no es una sabia decisiΓ³n#." + /*german*/ "Man erzΓ€hlt sich, daß es #eine tΓΆrichte Entscheidung# sei #[[1]]# SchΓ€tze zu plΓΌndern.", + /*french*/ "Selon moi, explorer #[[1]]# est #futile#.", {QM_RED, QM_PINK})); + // /*spanish*/ "SegΓΊn dicen, inspeccionar #[[1]]# #no es una sabia decisiΓ³n#." hintTextTable[RHT_CAN_BE_FOUND_AT] = HintText(CustomMessage( "They say that #[[1]]# can be found at #[[2]]#.", - "Man erzΓ€hlt sich, daß #[[1]]# bei #[[2]]# gefunden werden kΓΆnne.", - /*french*/ "Selon moi, #[[1]]# se trouve dans #[[2]]#.", {QM_GREEN, QM_RED})); - // /*spanish*/ "SegΓΊn dicen, #[[1]]# aguarda en #[[2]]#." + /*german*/ "Man erzΓ€hlt sich, daß #[[1]]# #[[2]]# zu finden |sei|seien|.", + /*french*/ "Selon moi, #[[1]]# se trouve dans #[[2]]#.", {QM_GREEN, QM_RED})); + // /*spanish*/ "SegΓΊn dicen, #[[1]]# aguarda en #[[2]]#." hintTextTable[RHT_HOARDS] = HintText(CustomMessage( "They say that #[[2]]# hoards #[[1]]#.", - "Man erzΓ€hlt sich, daß #[[2]]# #[[1]]# horte.", + /*german*/ "Man erzΓ€hlt sich, daß #[[2]]# #[[1]]# |horte|horten|.", /*french*/ "Selon moi, #[[2]]# recΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); - // /*spanish*/ "SegΓΊn dicen, #[[2]]# acapara #[[1]]#." + // /*spanish*/ "SegΓΊn dicen, #[[2]]# acapara #[[1]]#." // clang-format on HintTable_Init_Item(); @@ -59,12 +62,12 @@ void StaticData::HintTable_Init() { ---------------------------*/ hintTextTable[RHT_KF_LINKS_HOUSE_COW] = HintText(CustomMessage("They say that #Malon's obstacle course# leads to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Malons Hinderniskurs# zu #[[1]]# fΓΌhre.", + /*german*/ "Man erzΓ€hlt sich, daß das Erzielen eines neuen Rekordes bei #Malons Hindernisparcours# #[[1]]# gewΓ€hre.", /*french*/ "Selon moi, la #course Γ  obstacle de Malon# amΓ¨ne Γ  #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/la #carrera de obstΓ‘culos de Malon# brinda #[[1]]#. {}, {CustomMessage("They say that the #bovine bounty of a horseback hustle# gifts #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #bovine Schatz einer Pferdehast# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß der #bovine Schatz einer Pferdehast# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le cadeau #qui dΓ©coule d'une rΓ©ussite Γ©questre# est #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/la #recompensa bovina de un paseo a caballo# brinda #[[1]]#. @@ -74,15 +77,15 @@ void StaticData::HintTable_Init() { // /*spanish*/exterminar #100 skulltulas doradas# revela #[[1]]#. {}, {CustomMessage("They say that #100 bug badges# rewards #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #100 Insektenplaketten# mit #[[1]]# belohnt wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß die Belohnung fΓΌr #100 Insektenplaketten# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #100 Γ©cussons# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#100 medallas de insectos# otorgan #[[1]]#. CustomMessage("They say that #100 spider souls# yields #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #100 Spinnenseelen# #[[1]]# einbrΓ€chte.", + /*german*/ "Man erzΓ€hlt sich, daß #100 Spinnenseelen# #[[1]]# einbrΓ€chten.", /*french*/ "Selon moi, #100 Γ’mes d'arachnide# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#100 almas de araΓ±a# otorgan #[[1]]#. CustomMessage("They say that #100 auriferous arachnids# lead to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #100 goldhaltige Arachniden# zu #[[1]]# fΓΌhren wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß #100 goldhaltige Arachniden# #[[1]]# gewΓ€hren.", /*french*/ "Selon moi, #100 arachnides aurifΓ¨res# donnent #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#100 arΓ‘cnidos aurΓ­feros# otorgan #[[1]]#. @@ -92,7 +95,7 @@ void StaticData::HintTable_Init() { // /*spanish*/la #Ocarina del Tiempo# enseΓ±a #[[1]]#. hintTextTable[RHT_SONG_FROM_ROYAL_FAMILYS_TOMB] = HintText(CustomMessage("They say that #ReDead in the Composers' Grave# guard #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Zombies im Grab des Komponisten# #[[1]]# bewache.", + /*german*/ "Man erzΓ€hlt sich, daß #Remorts im Grab des Komponisten# #[[1]]# bewachen.", /*french*/ "Selon moi, les #Γ‰ffrois du tombeau des compositeurs# protΓ¨gent #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/los #ReDeads del PanteΓ³n Real# guardan #[[1]]#. @@ -107,17 +110,17 @@ void StaticData::HintTable_Init() { // /*spanish*/Sheik espera en el #momumento del tiempo# para enseΓ±ar #[[1]]#. hintTextTable[RHT_SHEIK_IN_CRATER] = HintText(CustomMessage("They say that the #crater's melody# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #Melodie eines Kraters# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß die #Melodie des Kraters# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, Sheik confiera, #entourΓ© de lave#, #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/la #melodΓ­a del crΓ‘ter# otorga #[[1]]#. hintTextTable[RHT_SHEIK_IN_ICE_CAVERN] = HintText(CustomMessage("They say that the #frozen cavern# echoes with #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #gefrorene Kaverne# mit #[[1]]# echoe.", + /*german*/ "Man erzΓ€hlt sich, daß die #gefrorene Kaverne# #[[1]]# ertΓΆnen lasse.", /*french*/ "Selon moi, Sheik confiera, #dans une caverne enneigΓ©e#, #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/en la #caverna de hielo# retumban los ecos de #[[1]]#. hintTextTable[RHT_SHEIK_IN_KAKARIKO] = HintText(CustomMessage("They say that a #ravaged village# mourns with #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #verwΓΌstetes Dorf# mit #[[1]]# trauere.", + /*german*/ "Man erzΓ€hlt sich, daß ein #verwΓΌstetes Dorf# um #[[1]]# trauere.", /*french*/ "Selon moi, Sheik confirera, #au coeur d'un village ravagΓ©#, #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/un #arrasado pueblo# llora #[[1]]#. @@ -127,12 +130,12 @@ void StaticData::HintTable_Init() { // /*spanish*/el hΓ©roe que se adentre #mΓ‘s allΓ‘ del desierto# aprenderΓ‘ #[[1]]#. hintTextTable[RHT_MARKET_10_BIG_POES] = HintText(CustomMessage("They say that catching #Big Poes# leads to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das Fangen #großer Irrlichter# zu #[[1]]# fΓΌhre.", + /*german*/ "Man erzΓ€hlt sich, daß die Belohnung fΓΌr das Fangen von #NachtschwΓ€rmern# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #d'attraper des Γ€mes# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/hacerte con #Grandes Poes# conduce a #[[1]]#. {}, {CustomMessage("They say that #ghost hunters# will be rewarded with #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #GeisterjΓ€ger# mit #[[1]]# belohnt wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß die Belohnung fΓΌr #GeisterjΓ€ger# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #les chasseurs de fantΓ΄mes# sont rΓ©compensΓ©s avec #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/los #cazafantasmas# son premiados con #[[1]]#. @@ -147,12 +150,12 @@ void StaticData::HintTable_Init() { // /*spanish*/la #mΓ‘scara de la verdad# premia #[[1]]#. {}, {CustomMessage("They say that showing a #truthful eye to the crowd# rewards #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das Zeigen eines #wahrhaftigen Auges zu der Menge# mit #[[1]]# belohnt wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß der #Menge ein wahrhaftiges Auge# zu zeigen #[[1]]# einbrΓ€chte.", /*french*/ "Selon moi, montrer #l'oeil de vΓ©ritΓ© Γ  la foule# donne #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#mostrarle el ojo verdadero# a una multitud brinda #[[1]]#. hintTextTable[RHT_HF_OCARINA_OF_TIME_ITEM] = HintText(CustomMessage("They say that the #treasure thrown by Princess Zelda# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #von Prinzessin Zelda geworfene Schatz# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß der #von Prinzessin Zelda geworfene Schatz# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le trΓ©sor #laissΓ© par la princesse# est #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/el #tesoro arrojado por la Princesa Zelda# se trata de #[[1]]#. @@ -177,7 +180,7 @@ void StaticData::HintTable_Init() { // /*spanish*/exterminar #50 skulltulas doradas# revela #[[1]]#. {}, {CustomMessage("They say that #50 bug badges# rewards #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #50 Insektenplaketten# mit #[[1]]# belohnt wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß die Belohnung fΓΌr #50 Insektenplaketten# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #50 Γ©cussons# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#50 medallas de insectos# otorgan #[[1]]#. CustomMessage("They say that #50 spider souls# yields #[[1]]#.", @@ -185,7 +188,7 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #50 Γ’mes d'arachnide# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#50 almas de araΓ±a# otorgan #[[1]]#. CustomMessage("They say that #50 auriferous arachnids# lead to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #50 goldhaltige Arachniden# zu #[[1]]# fΓΌhren wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß #50 goldhaltige Arachniden# #[[1]]# gewΓ€hren.", /*french*/ "Selon moi, #50 arachnides aurifΓ¨res# donnent #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#50 arΓ‘cnidos aurΓ­feros# otorgan #[[1]]#. @@ -195,7 +198,7 @@ void StaticData::HintTable_Init() { // /*spanish*/exterminar #40 skulltulas doradas# revela #[[1]]#. {}, {CustomMessage("They say that #40 bug badges# rewards #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #40 Insektenplaketten# mit #[[1]]# belohnt wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß die Belohnung fΓΌr #40 Insektenplaketten# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #40 Γ©cussons# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#40 medallas de insectos# otorgan #[[1]]#. CustomMessage("They say that #40 spider souls# yields #[[1]]#.", @@ -203,7 +206,7 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #40 Γ’mes d'arachnide# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#40 almas de araΓ±a# otorgan #[[1]]#. CustomMessage("They say that #40 auriferous arachnids# lead to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #40 goldhaltige Arachniden# zu #[[1]]# fΓΌhren wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß #40 goldhaltige Arachniden# #[[1]]# gewΓ€hren.", /*french*/ "Selon moi, #40 arachnides aurifΓ¨res# donnent #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#40 arΓ‘cnidos aurΓ­feros# otorgan #[[1]]#. @@ -213,7 +216,7 @@ void StaticData::HintTable_Init() { // /*spanish*/exterminar #30 skulltulas doradas# revela #[[1]]#. {}, {CustomMessage("They say that #30 bug badges# rewards #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #30 Insektenplaketten# mit #[[1]]# belohnt wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß die Belohnung fΓΌr #30 Insektenplaketten# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #30 Γ©cussons# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#30 medallas de insectos# otorgan #[[1]]#. CustomMessage("They say that #30 spider souls# yields #[[1]]#.", @@ -221,7 +224,7 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #30 Γ’mes d'arachnide# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#30 almas de araΓ±a# otorgan #[[1]]#. CustomMessage("They say that #30 auriferous arachnids# lead to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #30 goldhaltige Arachniden# zu #[[1]]# fΓΌhren wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß #30 goldhaltige Arachniden# #[[1]]# gewΓ€hren.", /*french*/ "Selon moi, #30 arachnides aurifΓ¨res# donnent #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#30 arΓ‘cnidos aurΓ­feros# otorgan #[[1]]#. @@ -231,7 +234,7 @@ void StaticData::HintTable_Init() { // /*spanish*/exterminar #20 skulltulas doradas# revela #[[1]]#. {}, {CustomMessage("They say that #20 bug badges# rewards #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #20 Insektenplaketten# mit #[[1]]# belohnt wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß die Belohnung fΓΌr #20 Insektenplaketten# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #20 Γ©cussons# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#20 medallas de insectos# otorgan #[[1]]#. CustomMessage("They say that #20 spider souls# yields #[[1]]#.", @@ -239,21 +242,21 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #20 Γ’mes d'arachnide# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#20 almas de araΓ±a# otorgan #[[1]]#. CustomMessage("They say that #20 auriferous arachnids# lead to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #20 goldhaltige Arachniden# zu #[[1]]# fΓΌhren wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß #20 goldhaltige Arachniden# #[[1]]# gewΓ€hren.", /*french*/ "Selon moi, #20 arachnides aurifΓ¨res# donnent #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#20 arΓ‘cnidos aurΓ­feros# otorgan #[[1]]#. hintTextTable[RHT_KAK_ANJU_AS_CHILD] = HintText(CustomMessage("They say that #collecting cuccos# rewards #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Sammeln von HΓΌhnern# mit #[[1]]# belohnt wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß das #Sammeln von HΓΌhnern# #[[1]]# einbrΓ€chte.", /*french*/ "Selon moi, #rapporter les Cocottes# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#hacerte con todos los cucos# premia #[[1]]#. {}, {CustomMessage("They say that #wrangling roosters# rewards #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Rangeln mit HΓ€hnen# mit #[[1]]# belohnt wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß das #Rangeln mit HΓ€hnen# #[[1]]# einbrΓ€chte.", /*french*/ "Selon moi, #plumer des poulets# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#atrapar a las gallinas# premia #[[1]]#. CustomMessage("They say that #chucking chickens# gifts #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Werfen von HΓΌhnchen# mit #[[1]]# belohnt wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß das #Werfen von HΓΌhnchen# #[[1]]# einbrΓ€chte.", /*french*/ "Selon moi, #lancer des poulets# donne #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#reunir a unos emplumados# premia #[[1]]#. @@ -263,12 +266,12 @@ void StaticData::HintTable_Init() { // /*spanish*/un #alegre cuco# en la madurez otorga #[[1]]#. hintTextTable[RHT_KAK_TRADE_ODD_MUSHROOM] = HintText(CustomMessage("They say that the #potion shop lady# entrusts #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #Dame des Trankladens# #[[1]]# anvertraue.", + /*german*/ "Man erzΓ€hlt sich, daß die #Dame des Hexenladens# #[[1]]# anvertraue.", /*french*/ "Selon moi, la #gribiche du magasin de potion# confie #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/la #seΓ±ora de la tienda de pociones# otorga #[[1]]#. hintTextTable[RHT_GC_DARUNIAS_JOY] = HintText(CustomMessage("They say that #Darunia's dance# leads to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Darunias Tanz# zu #[[1]]# fΓΌhre.", + /*german*/ "Man erzΓ€hlt sich, daß #Darunias Tanz# #[[1]]# gewΓ€hre.", /*french*/ "Selon moi, #la dance de Darunia# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#el baile de Darunia# conduce a #[[1]]#. {}, @@ -308,7 +311,7 @@ void StaticData::HintTable_Init() { // /*spanish*/el #cientΓ­fico del Lago Hylia# otorga con prisa #[[1]]#. hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_REWARD] = HintText(CustomMessage("They say that the #treasure chest game# grants #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Schatzkisten-Poker# #[[1]]# gewΓ€hre.", + /*german*/ "Man erzΓ€hlt sich, daß die #Truhenlotterie# #[[1]]# gewΓ€hre.", /*french*/ "Selon moi, la #Chasse-aux-TrΓ©sors# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#el Cofre del Tesoro# premia #[[1]]#. {}, @@ -317,12 +320,12 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #parier# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#los juegos de azar# revelan #[[1]]#. CustomMessage("They say that there is a #1/32 chance# to win #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß es eine #Chance von 1 zu 32# gΓ€be, um #[[1]]# zu gewinnen.", + /*german*/ "Man erzΓ€hlt sich, daß es eine #Chance von 1 zu 32# gΓ€be um #[[1]]# zu gewinnen.", /*french*/ "Selon moi, Γͺtre #le gagnant parmi 32# donne #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/hay una #probabilidad de 1/32# de ganar #[[1]]#. hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_ITEM_1] = HintText(CustomMessage("They say that the #first locked room# in the chest game contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #erste verschlossene Raum# im Schatzkisten-Poker #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß der #erste verschloßene Raum# in der Truhenlotterie #[[1]]# enthielte.", /*french*/ "Selon moi, la #premiΓ¨re salle# de la Chasse-aux-TrΓ©sors contient #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#en la primera sala del Cofre del Tesoro# aguarda #[[1]]#. {}, @@ -331,12 +334,12 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #parier une fois# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#apostar solo una vez# revelarΓ‘ #[[1]]#. CustomMessage("They say that the #first or second game chest# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #erste oder zweite Schatzkiste im Spiel# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß die #erste oder zweite Spieltruhe# #[[1]]# enthielte.", /*french*/ "Selon moi, le #premier ou deuxiΓ¨me coffre Γ  jeu# contient #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#el primer o segundo cofre del azar# revela #[[1]]#. hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_ITEM_2] = HintText(CustomMessage("They say that the #second locked room# in the chest game contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #zweite verschlossene Raum# im Schatzkisten-Poker #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß der #zweite verschloßene Raum# in der Truhenlotterie #[[1]]# enthielte.", /*french*/ "Selon moi, la #deuxiΓ¨me salle# de la Chasse-aux-TrΓ©sors contient #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#en la segunda sala del Cofre del Tesoro# aguarda #[[1]]#. {}, @@ -345,12 +348,12 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #parier deux fois# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#apostar dos veces# revelarΓ‘ #[[1]]#. CustomMessage("They say that the #third or fourth game chest# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #dritte oder vierte Schatzkiste im Spiel# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß die #dritte oder vierte Spieltruhe# #[[1]]# enthielte.", /*french*/ "Selon moi, le #troisiΓ¨me ou quatriΓ¨me coffre Γ  jeu# contient #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#el tercer o cuarto cofre del azar# revela #[[1]]#. hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_ITEM_3] = HintText(CustomMessage("They say that the #third locked room# in the chest game contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #dritte verschlossene Raum# im Schatzkisten-Poker #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß der #dritte verschloßene Raum# in der Truhenlotterie #[[1]]# enthielte.", /*french*/ "Selon moi, la #troisiΓ¨me salle# de la Chasse-aux-TrΓ©sors contient #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#en la tercera sala del Cofre del Tesoro# aguarda #[[1]]#. {}, @@ -359,12 +362,12 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #parier trois fois# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#apostar tres veces# revelarΓ‘ #[[1]]#. CustomMessage("They say that the #fifth or sixth game chest# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #fΓΌnfte oder sechste Schatzkiste im Spiel# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß die #fΓΌnfte oder sechste Spieltruhe# #[[1]]# enthielte.", /*french*/ "Selon moi, le #cinquiΓ¨me ou sixiΓ¨me coffre Γ  jeu# contient #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#el quinto o sexto cofre del azar# revela #[[1]]#. hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_ITEM_4] = HintText(CustomMessage("They say that the #fourth locked room# in the chest game contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #vierte verschlossene Raum# im Schatzkisten-Poker #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß der #vierte verschloßene Raum# in der Truhenlotterie #[[1]]# enthielte.", /*french*/ "Selon moi, la #quatriΓ¨me salle# de la Chasse-aux-TrΓ©sors contient #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#en la cuarta sala del Cofre del Tesoro# aguarda #[[1]]#. {}, @@ -373,12 +376,12 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #parier quatre fois# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#apostar cuatro veces# revelarΓ‘ #[[1]]#. CustomMessage("They say that the #seventh or eighth game chest# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #siebente oder achte Schatzkiste im Spiel# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß die #siebente oder achte Spieltruhe# #[[1]]# enthielte.", /*french*/ "Selon moi, le #septiΓ¨me ou huitiΓ¨me coffre Γ  jeu# contient #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#el sΓ©ptimo u octavo cofre del azar# revela #[[1]]#. hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_ITEM_5] = HintText(CustomMessage("They say that the #fifth locked room# in the chest game contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #fΓΌnfte verschlossene Raum# im Schatzkisten-Poker #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß der #fΓΌnfte verschloßene Raum# in der Truhenlotterie #[[1]]# enthielte.", /*french*/ "Selon moi, la #cinquiΓ¨me salle# de la Chasse-aux-TrΓ©sors contient #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#en la quinta sala del Cofre del Tesoro# aguarda #[[1]]#. {}, @@ -387,12 +390,12 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #parier cinq fois# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#apostar cinco veces# revelarΓ‘ #[[1]]#. CustomMessage("They say that the #ninth or tenth game chest# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #neunte oder zehnte Schatzkiste im Spiel# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß die #neunte oder zehnte Spieltruhe# #[[1]]# enthielte.", /*french*/ "Selon moi, le #neuviΓ¨me ou dixiΓ¨me coffre Γ  jeu# contient #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#el noveno o dΓ©cimo cofre del azar# revela #[[1]]#. hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_KEY_1] = HintText(CustomMessage("They say that the #first locked room# in the chest game contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #erste verschlossene Raum# im Schatzkisten-Poker #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß der #erste verschloßene Raum# in der Truhenlotterie #[[1]]# enthielte.", /*french*/ "Selon moi, la #premiΓ¨re salle# de la Chasse-aux-TrΓ©sors contient #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#en la primera sala del Cofre del Tesoro# aguarda #[[1]]#. {}, @@ -401,12 +404,12 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #parier une fois# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#apostar solo una vez# revelarΓ‘ #[[1]]#. CustomMessage("They say that the #first or second game chest# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #erste oder zweite Schatzkiste im Spiel# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß die #erste oder zweite Spieltruhe# #[[1]]# enthielte.", /*french*/ "Selon moi, le #premier ou deuxiΓ¨me coffre Γ  jeu# contient #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#el primer o segundo cofre del azar# revela #[[1]]#. hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_KEY_2] = HintText(CustomMessage("They say that the #second locked room# in the chest game contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #zweite verschlossene Raum# im Schatzkisten-Poker #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß der #zweite verschloßene Raum# in der Truhenlotterie #[[1]]# enthielte.", /*french*/ "Selon moi, la #deuxiΓ¨me salle# de la Chasse-aux-TrΓ©sors contient #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#en la segunda sala del Cofre del Tesoro# aguarda #[[1]]#. {}, @@ -415,12 +418,12 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #parier deux fois# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#apostar dos veces# revelarΓ‘ #[[1]]#. CustomMessage("They say that the #third or fourth game chest# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #dritte oder vierte Schatzkiste im Spiel# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß die #dritte oder vierte Spieltruhe# #[[1]]# enthielte.", /*french*/ "Selon moi, le #troisiΓ¨me ou quatriΓ¨me coffre Γ  jeu# contient #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#el tercer o cuarto cofre del azar# revela #[[1]]#. hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_KEY_3] = HintText(CustomMessage("They say that the #third locked room# in the chest game contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #dritte verschlossene Raum# im Schatzkisten-Poker #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß der #dritte verschloßene Raum# in der Truhenlotterie, #[[1]]# enthielte.", /*french*/ "Selon moi, la #troisiΓ¨me salle# de la Chasse-aux-TrΓ©sors contient #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#en la tercera sala del Cofre del Tesoro# aguarda #[[1]]#. {}, @@ -429,12 +432,12 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #parier trois fois# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#apostar tres veces# revelarΓ‘ #[[1]]#. CustomMessage("They say that the #fifth or sixth game chest# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #fΓΌnfte oder sechste Schatzkiste im Spiel# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß die #fΓΌnfte oder sechste Spieltruhe# #[[1]]# enthielte.", /*french*/ "Selon moi, le #cinquiΓ¨me ou sixiΓ¨me coffre Γ  jeu# contient #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#el quinto o sexto cofre del azar# revela #[[1]]#. hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_KEY_4] = HintText(CustomMessage("They say that the #fourth locked room# in the chest game contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #vierte verschlossene Raum# im Schatzkisten-Poker #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß der #vierte verschloßene Raum# in der Truhenlotterie #[[1]]# enthielte.", /*french*/ "Selon moi, la #quatriΓ¨me salle# de la Chasse-aux-TrΓ©sors contient #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#en la cuarta sala del Cofre del Tesoro# aguarda #[[1]]#. {}, @@ -443,12 +446,12 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #parier quatre fois# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#apostar cuatro veces# revelarΓ‘ #[[1]]#. CustomMessage("They say that the #seventh or eighth game chest# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #siebente oder achte Schatzkiste im Spiel# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß die #siebente oder achte Spieltruhe# #[[1]]# enthielte.", /*french*/ "Selon moi, le #septiΓ¨me ou huitiΓ¨me coffre Γ  jeu# contient #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#el sΓ©ptimo u octavo cofre del azar# revela #[[1]]#. hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME_KEY_5] = HintText(CustomMessage("They say that the #fifth locked room# in the chest game contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #fΓΌnfte verschlossene Raum# im Schatzkisten-Poker #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß der #fΓΌnfte verschloßene Raum# in der Truhenlotterie #[[1]]# enthielte.", /*french*/ "Selon moi, la #cinquiΓ¨me salle# de la Chasse-aux-TrΓ©sors contient #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#en la quinta sala del Cofre del Tesoro# aguarda #[[1]]#. {}, @@ -457,12 +460,12 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, #parier cinq fois# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#apostar cinco veces# revelarΓ‘ #[[1]]#. CustomMessage("They say that the #ninth or tenth game chest# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #neunte oder zehnte Schatzkiste im Spiel# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß die #neunte oder zehnte Spieltruhe# #[[1]]# enthielte.", /*french*/ "Selon moi, le #neuviΓ¨me ou dixiΓ¨me coffre Γ  jeu# contient #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/#el noveno o dΓ©cimo cofre del azar# revela #[[1]]#. hintTextTable[RHT_GF_HBA_1500_POINTS] = HintText(CustomMessage("They say that scoring 1500 in #horseback archery# grants #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das Erzielen von 1500 Punkten beim #Bogenschießen zu Pferde# #[[1]]# gewΓ€hre.", + /*german*/ "Man erzΓ€hlt sich, daß das Erzielen von 1.500 Punkten beim #Bogenschießen zu Pferde# #[[1]]# gewΓ€hre.", /*french*/ "Selon moi, obtenir 1500 points dans l'#archerie Γ©questre# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/conseguir 1500 puntos en el #tiro con arco a caballo# premia #[[1]]#. {}, @@ -472,17 +475,17 @@ void StaticData::HintTable_Init() { // /*spanish*/dominar el #tiro con arco a caballo# premia con #[[1]]#. hintTextTable[RHT_GRAVEYARD_HEART_PIECE_GRAVE_CHEST] = HintText(CustomMessage("They say that playing #Sun's Song# in a grave spawns #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das Spielen der #Hymne der Sonne# in einem Grab, #[[1]]# erscheinen ließe.", + /*german*/ "Man erzΓ€hlt sich, daß das Spielen der #Hymne der Sonne# in einem Grab #[[1]]# erscheinen ließe.", /*french*/ "Selon moi, jouer le #chant du soleil# dans un tombeau donne #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/#tocar la CanciΓ³n del Sol# en una cripta conduce a #[[1]]#. hintTextTable[RHT_GC_MAZE_LEFT_CHEST] = HintText(CustomMessage("They say that in #Goron City# the hammer unlocks #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der Hammer in #Goronia# #[[1]]# freilege.", + /*german*/ "Man erzΓ€hlt sich, daß der Stahlhammer in #Goronia# #[[1]]# freilege.", /*french*/ "Selon moi, dans le #village Goron#, le marteau donne accΓ¨s Γ  #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/en la #Ciudad Goron# el martillo desbloquea #[[1]]#. hintTextTable[RHT_GV_CHEST] = HintText(CustomMessage("They say that in #Gerudo Valley# the hammer unlocks #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der Hammer im #Gerudotal# #[[1]]# freilege.", + /*german*/ "Man erzΓ€hlt sich, daß der Stahlhammer im #Gerudotal# #[[1]]# freilege.", /*french*/ "Selon moi, dans la #VallΓ©e Gerudo#, le marteau donne accΓ¨s Γ  #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/en el #Valle Gerudo# el martillo desbloquea #[[1]]#. @@ -507,7 +510,7 @@ void StaticData::HintTable_Init() { // /*spanish*/una #Skulltula tras la telaraΓ±a# de una cueva otorga #[[1]]#. hintTextTable[RHT_HF_COW_GROTTO_COW] = HintText(CustomMessage("They say that a #cow behind webs# in a grotto gifts #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Kuh hinter Weben# in einer Grotte #[[1]]# hielte.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Kuh, hinter Weben# in einer Grotte, #[[1]]# hielte.", /*french*/ "Selon moi, la #vache derriΓ¨re les toiles# d'une grotte donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/una #vaca tras la telaraΓ±a# de una cueva brinda #[[1]]#. {}, @@ -517,7 +520,7 @@ void StaticData::HintTable_Init() { // /*spanish*/una #vaca tras una telaraΓ±a# brinda #[[1]]#. hintTextTable[RHT_ZR_FROGS_OCARINA_GAME] = HintText(CustomMessage("They say that the final reward from the #Frogs of Zora's River# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die letzte Belohnung der #FrΓΆsche des Zora-Flußes# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß die letzte Belohnung der #FrΓΆsche des Zora-Flußes# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, la derniΓ¨re rΓ©compense des #grenouilles de la RiviΓ¨re Zora# est #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/la recompensa final de las #ranas del RΓ­o Zora# premia #[[1]]#. {}, @@ -540,7 +543,7 @@ void StaticData::HintTable_Init() { // /*spanish*/una Skulltula en lo #alto de las congeladas aguas# otorga #[[1]]#. hintTextTable[RHT_WASTELAND_CHEST] = HintText(CustomMessage("They say that #deep in the wasteland# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #tief im Γ–dland# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß #tief im Γ–dland# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #loin dans le dΓ©sert# gΓt #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/en lo #profundo del desierto encantado# yace #[[1]]#. @@ -550,12 +553,12 @@ void StaticData::HintTable_Init() { // /*spanish*/una #Skulltula del desierto encantado# otorga #[[1]]#. hintTextTable[RHT_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST] = HintText(CustomMessage("They say that #flames in the Composers' Grave# reveal #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #Flammen im Grab des Komponisten# #[[1]]# enthΓΌllen wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß die #Flammen im Grab des Komponisten# #[[1]]# enthΓΌllen wΓΌrden.", /*french*/ "Selon moi, #les flammes dans le tombeau des compositeurs# cachent #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/#las llamas del PanteΓ³n Real# revelan #[[1]]#. hintTextTable[RHT_ZF_BOTTOM_FREESTANDING_POH] = HintText(CustomMessage("They say that #under the icy waters# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #unter den eisigen GewΓ€ssern# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß #unter den eisigen GewΓ€ssern# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, #sous les eaux glacΓ©es# se cache #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/#bajo las congeladas aguas# yace #[[1]]#. @@ -580,7 +583,7 @@ void StaticData::HintTable_Init() { // /*spanish*/el #Rey Zora# otorga con prisa #[[1]]#. hintTextTable[RHT_DMC_DEKU_SCRUB] = HintText(CustomMessage("They say that a single #scrub in the crater# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein einzelner #Deku im Krater# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein einzelner #Deku-HΓ€ndler im Krater# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #peste Mojo dans le cratΓ¨re# vend #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/un solitario #deku del crΓ‘ter# vende #[[1]]#. hintTextTable[RHT_DMC_GS_CRATE] = HintText(CustomMessage("They say that a spider under a #crate in the crater# holds #[[1]]#.", @@ -589,12 +592,12 @@ void StaticData::HintTable_Init() { // /*spanish*/una Skulltula bajo una #caja del crΓ‘ter# otorga #[[1]]#. hintTextTable[RHT_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST] = HintText(CustomMessage("They say that a #temporal stone within the Deku Tree# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #zeitlicher Stein innerhalb des Deku-Baums# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #zeitlicher Stein innerhalb des Deku-Baumes# #[[1]]# enthielte.", /*french*/ "Selon moi, la #pierre temporelle dans l'Arbre Mojo# cache #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/un #bloque temporal del Gran Árbol Deku# contiene #[[1]]#. {}, {CustomMessage("They say that a #temporal stone within a tree# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #zeitlicher Stein innerhalb eines Baums# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #zeitlicher Stein innerhalb eines Baumes# #[[1]]# enthielte.", /*french*/ "Selon moi, la #pierre bleue dans un arbre# mΓ¨ne Γ  #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/un #bloque temporal de un Γ‘rbol# contiene #[[1]]#. @@ -629,12 +632,12 @@ void StaticData::HintTable_Init() { // /*spanish*/unos de #stingers engullidos por cierta deidad# guardan #[[1]]#. hintTextTable[RHT_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM] = HintText(CustomMessage("They say that a spider surrounded by #shadows in Jabu-Jabu's Belly# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine von #Schatten in Jabu-Jabus Bauch# umgebene Spinne #[[1]]# hielte.", + /*german*/ "Man erzΓ€hlt sich, daß eine von #Schatten umgebene Spinne in Jabu-Jabus Bauch# #[[1]]# hielte.", /*french*/ "Selon moi, la Skulltula entourΓ©e d'#ombres dans Jabu-Jabu# possΓ¨de #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/una Skulltula rodeada de #sombras en la Tripa de Jabu-Jabu# otorga #[[1]]#. {}, {CustomMessage("They say that a spider surrounded by #shadows in the belly of a deity# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine von #Schatten im Bauch einer Gottheit# umgebene Spinne #[[1]]# hielte.", + /*german*/ "Man erzΓ€hlt sich, daß eine von #Schatten umgebene Spinne im Bauche einer Gottheit#, #[[1]]# hielte.", /*french*/ "Selon moi, l'araignΓ©e entourΓ©e d'#ombres dans le ventre du gardien# possΓ¨de #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/una Skulltula rodeada de #sombras en la tripa de cierta diedad# otorga #[[1]]#. @@ -649,32 +652,32 @@ void StaticData::HintTable_Init() { // /*spanish*/una #vaca engullida por cierta deidad# brinda #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_SCARECROW_CHEST] = HintText(CustomMessage("They say that #Pierre atop the Fire Temple# hides #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Pierre auf der Spitze des Feuertempels# #[[1]]# verstecke.", + /*german*/ "Man erzΓ€hlt sich, daß #Pierre, an der Spitze des Feuertempels#, #[[1]]# verstecke.", /*french*/ "Selon moi, #Pierre au sommet du Temple du Feu# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/#Pierre en lo alto del Templo del Fuego# esconde #[[1]]#. {}, {CustomMessage("They say that a #scarecrow atop the volcano# hides #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Vogelscheuche auf der Spitze des Vulkans# #[[1]]# verstecke.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Vogelscheuche, an der Spitze des Vulkans#, #[[1]]# verstecke.", /*french*/ "Selon moi, l'#Γ©pouvantail au sommet d'un volcan# donne #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/un #espantapΓ‘jaros en lo alto del volcΓ‘n# esconde #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MEGATON_HAMMER_CHEST] = HintText(CustomMessage("They say that the #Flare Dancer atop the Fire Temple# guards a chest containing #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Flammenderwisch auf der Spitze des Feuertempels# eine Truhe bewache, welche #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß der #Flammenderwisch, an der Spitze des Feuertempels#, eine Truhe bewache welche #[[1]]# enthielte.", /*french*/ "Selon moi, le #Danse-Flamme au sommet du Temple du Feu# protΓ¨ge #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/el #Bailaguego en lo alto del Templo del Fuego# otorga #[[1]]#. {}, {CustomMessage("They say that the #Flare Dancer atop the volcano# guards a chest containing #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Flammenderwisch auf der Spitze des Vulkans# eine Truhe bewache, welche #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß der #Flammenderwisch, an der Spitze des Vulkans#, eine Truhe bewache welche #[[1]]# enthielte.", /*french*/ "Selon moi, le #danseur au sommet du volcan# protΓ¨ge #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/el #Bailafuego en lo alto del volcΓ‘n# otorga #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_CHEST_ON_FIRE] = HintText(CustomMessage("They say that the #Flare Dancer atop the Fire Temple# guards a chest containing #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Flammenderwisch auf der Spitze des Feuertempels# eine Truhe bewache, welche #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß der #Flammenderwisch, an der Spitze des Feuertempels#, eine Truhe bewache welche #[[1]]# enthielte.", /*french*/ "Selon moi, le #Danse-Flamme au sommet du Temple du Feu# protΓ¨ge #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/el #Bailafuego en lo alto del Templo del Fuego# otorga #[[1]]#. {}, {CustomMessage("They say that the #Flare Dancer atop the volcano# guards a chest containing #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Flammenderwisch auf der Spitze des Vulkans# eine Truhe bewache, welche #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß der #Flammenderwisch, an der Spitze des Vulkans#, eine Truhe bewache welche #[[1]]# enthielte.", /*french*/ "Selon moi, le #danseur au sommet du volcan# protΓ¨ge #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/el #Bailafuego en lo alto del volcΓ‘n# otorga #[[1]]#. @@ -689,22 +692,22 @@ void StaticData::HintTable_Init() { // /*spanish*/una #Skulltula bajo el bloque de un volcΓ‘n# otorga #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_RIVER_CHEST] = HintText(CustomMessage("They say that beyond the #river in the Water Temple# waits #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß jenseits des #Flußes im Wassertempel# #[[1]]# warte.", + /*german*/ "Man erzΓ€hlt sich, daß jenseits des #Flußes im Wassertempel# #[[1]]# |warte|warten|.", /*french*/ "Selon moi, au delΓ  de #la riviΓ¨re dans le Temple de l'Eau# se cache #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/tras el #rΓ­o del Templo del Agua# yace #[[1]]#. {}, {CustomMessage("They say that beyond the #river under the lake# waits #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß jenseits des #Flußes unter dem See# #[[1]]# warte.", + /*german*/ "Man erzΓ€hlt sich, daß jenseits des #Flußes unterhalb des Sees# #[[1]]# |warte|warten|.", /*french*/ "Selon moi, au delΓ  de #la riviΓ¨re sous le lac# se cache #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/tras el #rΓ­o bajo el lago# yace #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that dodging #rolling boulders in the Water Temple# leads to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das Ausweichen von #rollenden Felsen im Wassertempel# zu #[[1]]# fΓΌhre.", + /*german*/ "Man erzΓ€hlt sich, daß das Ausweichen von #rollenden Felsen im Wassertempel# #[[1]]# einbrΓ€chte.", /*french*/ "Selon moi, Γ©viter des #rochers roulants dans le Temple de l'Eau# mΓ¨ne Γ  #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/esquivar #rocas rondantes del Templo del Agua# conduce a #[[1]]#. {}, {CustomMessage("They say that dodging #rolling boulders under the lake# leads to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das Ausweichen von #rollenden Felsen unter einem See# zu #[[1]]# fΓΌhre.", + /*german*/ "Man erzΓ€hlt sich, daß das Ausweichen von #rollenden Felsen unterhalb eines Sees# #[[1]]# einbrΓ€chte.", /*french*/ "Selon moi, Γ©viter des #rochers roulants sous le lac# mΓ¨ne Γ  #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/esquivar #rocas rodantes bajo el lago# conduce a #[[1]]#. @@ -714,27 +717,27 @@ void StaticData::HintTable_Init() { // /*spanish*/una Skulltula tras #una valla del Templo del Agua# otorga #[[1]]#. {}, {CustomMessage("They say that a spider behind a #gate under the lake# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine Spinne hinter einem #Tor unter dem See# #[[1]]# hielte.", + /*german*/ "Man erzΓ€hlt sich, daß eine Spinne hinter einem #Tor unterhalb des Sees# #[[1]]# hielte.", /*french*/ "Selon moi, l'araignΓ©e derriΓ¨re une #barriΓ¨re sous le lac# a #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/una Skulltula tras #una valla bajo el lago# otorga #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_MQ_FREESTANDING_KEY] = HintText(CustomMessage("They say that hidden in a #box in the Water Temple# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß versteckt in einem #Kasten im Wassertempel# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß versteckt in einem #Kasten im Wassertempel# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, dans une #boΓte dans le Temple de l'Eau# gΓt #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/en una #caja del Templo del Agua# yace #[[1]]#. {}, {CustomMessage("They say that hidden in a #box under the lake# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß versteckt in einem #Kasten unter dem See# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß versteckt in einem #Kasten unterhalb des Sees# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, dans une #boΓte sous le lac# gΓt #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/en una #caja bajo el lago# yace #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA] = HintText(CustomMessage("They say that the #locked spider in the Water Temple# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #eingeschlossene Spinne im Wassertempel# #[[1]]# hielte.", + /*german*/ "Man erzΓ€hlt sich, daß eine #eingeschloßene Spinne im Wassertempel# #[[1]]# hielte.", /*french*/ "Selon moi, une #Skulltula emprisonnΓ©e dans le Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/la #Skulltula enjaulada del Templo del Agua# otorga #[[1]]#. {}, {CustomMessage("They say that the #locked spider under the lake# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #eingeschlossene Spinne unter dem See# #[[1]]# hielte.", + /*german*/ "Man erzΓ€hlt sich, daß eine #eingeschloßene Spinne unterhalb des Sees# #[[1]]# hielte.", /*french*/ "Selon moi, l'#araignΓ©e emprisonnΓ©e sous le lac# a #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/la #Skulltula enjaulada bajo el lago# otorga #[[1]]#. @@ -744,7 +747,7 @@ void StaticData::HintTable_Init() { // /*spanish*/una Skulltula tras una #valla del Templo del Agua# #[[1]]#. {}, {CustomMessage("They say that a spider behind a #gate under the lake# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine Spinne hinter einem #Tor unter dem See# #[[1]]# hielte.", + /*german*/ "Man erzΓ€hlt sich, daß eine Spinne hinter einem #Tor unterhalb des Sees# #[[1]]# hielte.", /*french*/ "Selon moi, l'#araignΓ©e derriΓ¨re une barriΓ¨re sous le lac# a #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/una Skulltula tras una #valla bajo el lago# otorga #[[1]]#. @@ -759,12 +762,12 @@ void StaticData::HintTable_Init() { // /*spanish*/aquellos que busquen las #rupias plateadas sumergidas# encontrarΓ‘n #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST] = HintText(CustomMessage("They say that the final prize of #the thieves' training# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der letzte Preis des #Diebestrainings# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß der letzte Preis des #Diebestrainings# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, la rΓ©compense ultime de #l'Γ©preuve des voleurs# est #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/la recompensa final de la #instrucciΓ³n de las bandida# brinda #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST] = HintText(CustomMessage("They say that the final prize of #the thieves' training# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der letzte Preis des #Diebestrainings# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß der letzte Preis des #Diebestrainings# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, la rΓ©compense ultime de #l'Γ©preuve des voleurs# est #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/el premio final de la #instrucciΓ³n de las bandidas# brinda #[[1]]#. @@ -778,12 +781,12 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, la #terreur du Puits# cache #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/en las #profundidades del pozo# se esconde #[[1]]#. CustomMessage("They say that a #nether dweller in the well# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Unterweltbewohner im Brunnen# #[[1]]# hielte.", + /*german*/ "Man erzΓ€hlt sich, daß der #Unterweltbewohner des Brunnens# #[[1]]# hielte.", /*french*/ "Selon moi, le #spectre qui rΓ©side dans le Puits# a #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/el #temido morador del pozo# concede #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST] = HintText(CustomMessage("They say that #Dead Hand in the well# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Hirnsauger im Brunnen# #[[1]]# hielte.", + /*german*/ "Man erzΓ€hlt sich, daß der #Hirnsauger des Brunnens# #[[1]]# hielte.", /*french*/ "Selon moi, le #Poigneur dans le Puits# cache #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/la #Mano Muerta del pozo# concede #[[1]]#. {}, @@ -792,22 +795,22 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, la #terreur du Puits# cache #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/en las #profundidades del pozo# se esconde #[[1]]#. CustomMessage("They say that a #nether dweller in the well# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Unterweltbewohner im Brunnen# #[[1]]# hielte.", + /*german*/ "Man erzΓ€hlt sich, daß der #Unterweltbewohner des Brunnens# #[[1]]# hielte.", /*french*/ "Selon moi, le #spectre qui rΓ©side dans le Puits# a #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/el #temido morador del pozo# concede #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST] = HintText(CustomMessage("They say that upon the #Colossus's right hand# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf der #rechten Hand des Koloßes# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß auf der #rechten Hand des Kolosses# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, sur la #main droite du colosse# repose #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/en la #mano derecha del Coloso# yace #[[1]]#. {}, {CustomMessage("They say that the treasure #sought by Nabooru# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #von Naboru gesuchte Schatz# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß der #von Naboru gesuchte Schatz# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le trΓ©sor que #recherche Nabooru# est #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/el #ansiado tesoro de Nabooru# brinda #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST] = HintText(CustomMessage("They say that upon the #Colossus's left hand# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf der #linken Hand des Koloßes# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß auf der #linken Hand des Kolosses# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, sur la #main gauche du colosse# repose #[[1]]#.", {QM_RED, QM_GREEN})), // /*spanish*/en la #mano izquierda del Coloso# yace #[[1]]#. @@ -817,27 +820,27 @@ void StaticData::HintTable_Init() { // /*spanish*/una #paradoja temporal del Coloso# conduce a #[[1]]#. {}, {CustomMessage("They say that a #temporal paradox in the Colossus# yields #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #zeitliches Paradox im Koloß# #[[1]]# einbrΓ€chte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #zeitliches Paradox im Koloss# #[[1]]# einbrΓ€chte.", /*french*/ "Selon moi, un #paradoxe temporel dans le colosse# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/una #paradoja temporal del Coloso# conduce a #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST] = HintText(CustomMessage("They say that a #symphony in the Spirit Temple# yields #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Sinfonie im Geistertempel# #[[1]]# einbrΓ€chte.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Symphonie im Geistertempel# #[[1]]# einbrΓ€chte.", /*french*/ "Selon moi, les #cinq chansons du Temple de l'Esprit# rΓ©vΓ¨lent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/una #sinfonΓ­a del Coloso# conduce a #[[1]]#. {}, {CustomMessage("They say that a #symphony in the Colossus# yields #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Sinfonie im Koloß# #[[1]]# einbrΓ€chte.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Symphonie im Koloss# #[[1]]# einbrΓ€chte.", /*french*/ "Selon moi, la #symphonie du colosse# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/una #sinfonΓ­a del Coloso# conduce a #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM] = HintText(CustomMessage("They say that a #spider's symphony in the Spirit Temple# yields #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Spinnensinfonie im Geistertempel# #[[1]]# einbrΓ€chte.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Spinnensymphonie im Geistertempel# #[[1]]# einbrΓ€chte.", /*french*/ "Selon moi, la #mΓ©lodie de la Skulltula du Temple de l'Esprit# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/la #Skulltula de la sinfonΓ­a del Coloso# otorga #[[1]]#. {}, {CustomMessage("They say that a #spider's symphony in the Colossus# yields #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Spinnensinfonie im Koloß# #[[1]]# einbrΓ€chte.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Spinnensymphonie im Koloss# #[[1]]# einbrΓ€chte.", /*french*/ "Selon moi, la #mΓ©lodie de l'araignΓ©e du colosse# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/la #Skulltula de la sinfonΓ­a del Coloso# otorga #[[1]]#. @@ -861,12 +864,12 @@ void StaticData::HintTable_Init() { // /*spanish*/levantar una #roca del desierto# revela #[[1]]#. hintTextTable[RHT_GV_GROTTO_LEDGE_TO_GV_OCTOROK_GROTTO] = HintText(CustomMessage("They say that a rock on #a ledge in the valley# hides #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein Felsen auf #einem Vorsprung im Tal# #[[1]]# verstecke.", + /*german*/ "Man erzΓ€hlt sich, daß ein Felsen auf #einem Vorsprung des Tals# #[[1]]# verstecke.", /*french*/ "Selon moi, soulever une #roche dans la vallΓ©e# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_BLUE})), // /*spanish*/levantar una #roca al borde del valle# esconde #[[1]]#. hintTextTable[RHT_GC_GROTTO_PLATFORM_TO_GC_GROTTO] = HintText(CustomMessage("They say that a #pool of lava# in Goron City blocks the way to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Lavateich# in Goronia den Weg zu #[[1]]# blockiere.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Lavateich# in Goronia #[[1]]# blockiere.", /*french*/ "Selon moi, l'#Γ©tang de lave# dans le village Goron renferme #[[1]]#.", {QM_RED, QM_BLUE})), // /*spanish*/un #estanque de lava# en la Ciudad Goron bloquea el paso a #[[1]]#. @@ -911,27 +914,27 @@ void StaticData::HintTable_Init() { // /*spanish*/una #tienda de campaΓ±a del valle# cubre #[[1]]#. hintTextTable[RHT_GRAVEYARD_WARP_PAD_REGION_TO_SHADOW_TEMPLE_ENTRYWAY] = HintText(CustomMessage("They say that at the #back of the Graveyard#, there is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß sich #hinter dem Friedhof, #[[1]]# befΓ€nde.", + /*german*/ "Man erzΓ€hlt sich, daß sich #hinter dem Friedhof# #[[1]]# |befΓ€nde|befΓ€nden|.", /*french*/ "Selon moi, #derriΓ¨re le CimetiΓ¨re# gΓt #[[1]]#.", {QM_RED, QM_BLUE})), // /*spanish*/en la #parte trasera del cementerio# se halla #[[1]]#. hintTextTable[RHT_LAKE_HYLIA_TO_WATER_TEMPLE_LOBBY] = HintText(CustomMessage("They say that deep #under a vast lake#, one can find #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß man tief #unter einem gewaltigen See#, #[[1]]# finden kΓΆnne.", + /*german*/ "Man erzΓ€hlt sich, daß man tief #unterhalb eines gewaltigen Sees# #[[1]]# finden kΓΆnne.", /*french*/ "Selon moi, #sous le lac# gΓt #[[1]]#.", {QM_RED, QM_BLUE})), // /*spanish*/en las #profundidades de un lago inmenso# se halla #[[1]]#. hintTextTable[RHT_GERUDO_FORTRESS_TO_GERUDO_TRAINING_GROUND_LOBBY] = HintText(CustomMessage("They say that paying a #fee to the Gerudos# grants access to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das Bezahlen einer #GebΓΌhr an die Gerudos#, Zugang zu #[[1]]# gewΓ€hre.", + /*german*/ "Man erzΓ€hlt sich, daß das Bezahlen einer #GebΓΌhr an die Gerudos# #[[1]]# gewΓ€hre.", /*french*/ "Selon moi, l'#entrΓ©e payante des Gerudo# donne accΓ¨s Γ  #[[1]]#.", {QM_RED, QM_BLUE})), // /*spanish*/pagarle una #tasa a las gerudo# da acceso a #[[1]]#. hintTextTable[RHT_ZORAS_FOUNTAIN_TO_JABU_JABUS_BELLY_BEGINNING] = HintText(CustomMessage("They say that inside #Jabu-Jabu#, one can find #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß man #in Jabu-Jabu#, #[[1]]# finden kΓΆnne.", + /*german*/ "Man erzΓ€hlt sich, daß man #in Jabu-Jabu# #[[1]]# finden kΓΆnne.", /*french*/ "Selon moi, #dans Jabu-Jabu# se trouve #[[1]]#.", {QM_RED, QM_BLUE})), // /*spanish*/dentro de #Jabu-Jabu# se halla #[[1]]#. hintTextTable[RHT_KAKARIKO_VILLAGE_TO_BOTTOM_OF_THE_WELL] = HintText(CustomMessage("They say that a #village well# leads to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Dorfbrunnen# zu #[[1]]# fΓΌhre.", + /*german*/ "Man erzΓ€hlt sich, daß man #in einem Dorfbrunnen# #[[1]]# finden kΓΆnne.", /*french*/ "Selon moi, dans le fond du #Puits du village# gΓt #[[1]]#.", {QM_RED, QM_BLUE})), // /*spanish*/el #pozo de un pueblo# conduce a #[[1]]#. @@ -940,72 +943,72 @@ void StaticData::HintTable_Init() { ---------------------------*/ hintTextTable[RHT_LINKS_POCKET] = HintText(CustomMessage("Link's Pocket", - /*german*/ "Links Taschen", + /*german*/ "in Links Tasche", /*french*/ "les Poches de @")); // /*spanish*/el bolsillo de @ hintTextTable[RHT_KOKIRI_FOREST] = HintText(CustomMessage("Kokiri Forest", - /*german*/ "Kokiri-Wald", + /*german*/ "im Kokiri-Wald", /*french*/ "la ForΓͺt Kokiri")); // /*spanish*/el Bosque Kokiri hintTextTable[RHT_THE_LOST_WOODS] = HintText(CustomMessage("the Lost Woods", - /*german*/ "Verlorene WΓ€lder", + /*german*/ "in den Verlorenen WΓ€ldern", /*french*/ "les Bois Perdus")); // /*spanish*/el Bosque Perdido hintTextTable[RHT_SACRED_FOREST_MEADOW] = HintText(CustomMessage("Sacred Forest Meadow", - /*german*/ "Heilige Lichtung", + /*german*/ "auf der Heiligen Lichtung", /*french*/ "le Bosquet SacrΓ©")); // /*spanish*/la pradera sagrada del bosque hintTextTable[RHT_HYRULE_FIELD] = HintText(CustomMessage("Hyrule Field", - /*german*/ "Hylianische Steppe", + /*german*/ "in der Hylianischen Steppe", /*french*/ "la Plaine d'Hyrule")); // /*spanish*/la Llanura de Hyrule hintTextTable[RHT_LAKE_HYLIA] = HintText(CustomMessage("Lake Hylia", - /*german*/ "Hylia-See", + /*german*/ "am Hylia-See", /*french*/ "le Lac Hylia")); // /*spanish*/el Lago Hylia hintTextTable[RHT_GERUDO_VALLEY] = HintText(CustomMessage("Gerudo Valley", - /*german*/ "Gerudotal", + /*german*/ "im Gerudotal", /*french*/ "la VallΓ©e Gerudo")); // /*spanish*/el Valle Gerudo hintTextTable[RHT_GERUDO_FORTRESS] = HintText(CustomMessage("Gerudo's Fortress", - /*german*/ "Gerudo-Festung", + /*german*/ "in der Gerudo-Festung", /*french*/ "le Repaire des Voleurs")); // /*spanish*/la Fortaleza Gerudo hintTextTable[RHT_HAUNTED_WASTELAND] = HintText(CustomMessage("Haunted Wasteland", - /*german*/ "GespensterwΓΌste", + /*german*/ "in der GespensterwΓΌste", /*french*/ "le DΓ©sert HantΓ©")); // /*spanish*/el desierto encantado hintTextTable[RHT_DESERT_COLOSSUS] = HintText(CustomMessage("Desert Colossus", - /*german*/ "WΓΌstenkoloß", + /*german*/ "am WΓΌstenkoloss", /*french*/ "le Colosse du DΓ©sert")); // /*spanish*/el Coloso del Desierto hintTextTable[RHT_THE_MARKET] = HintText(CustomMessage("the Market", - /*german*/ "Markt", + /*german*/ "auf dem Markt", /*french*/ "la Place du MarchΓ©")); // /*spanish*/la plaza del mercado hintTextTable[RHT_TEMPLE_OF_TIME] = HintText(CustomMessage("Temple of Time", - /*german*/ "Zitadelle der Zeit", + /*german*/ "in der Zitadelle der Zeit", /*french*/ "le Temple du Temps")); // /*spanish*/el Templo del Tiempo hintTextTable[RHT_CASTLE_GROUNDS] = HintText(CustomMessage("the Castle Grounds", - /*german*/ "Anlage von Schloß Hyrule", + /*german*/ "auf dem SchloßgelΓ€nde", /*french*/ "le ChΓ’teau d'Hyrule")); // /*spanish*/ hintTextTable[RHT_HYRULE_CASTLE] = HintText(CustomMessage("Hyrule Castle", - /*german*/ "Schloß Hyrule", + /*german*/ "in Schloß Hyrule", /*french*/ "le ChΓ’teau d'Hyrule")); // /*spanish*/el Castillo de Hyrule @@ -1014,53 +1017,48 @@ void StaticData::HintTable_Init() { /*french*/ "les alentours du ChΓ’teau de Ganon")); // /*spanish*/el exterior del Castillo de Ganon - hintTextTable[RHT_CASTLE_GROUNDS] = HintText(CustomMessage("the Castle Grounds", - /*german*/ "Anlage von Schloß Hyrule", - /*french*/ "le ChΓ’teau d'Hyrule")); - // /*spanish*/ - hintTextTable[RHT_KAKARIKO_VILLAGE] = HintText(CustomMessage("Kakariko Village", - /*german*/ "Kakariko", + /*german*/ "in Kakariko", /*french*/ "le Village Cocorico")); // /*spanish*/Kakariko hintTextTable[RHT_THE_GRAVEYARD] = HintText(CustomMessage("the Graveyard", - /*german*/ "Friedhof", + /*german*/ "auf dem Friedhof", /*french*/ "le CimetiΓ¨re")); // /*spanish*/el cementerio hintTextTable[RHT_DEATH_MOUNTAIN_TRAIL] = HintText(CustomMessage("Death Mountain Trail", - /*german*/ "Gebirgspfad", + /*german*/ "auf dem Gebirgspfad", /*french*/ "le Chemin du PΓ©ril")); // /*spanish*/el sendero de la MontaΓ±a de la Muerte hintTextTable[RHT_GORON_CITY] = HintText(CustomMessage("Goron City", - /*german*/ "Goronia", + /*german*/ "in Goronia", /*french*/ "le Village Goron")); // /*spanish*/la Ciudad Goron hintTextTable[RHT_DEATH_MOUNTAIN_CRATER] = HintText(CustomMessage("Death Mountain Crater", - /*german*/ "Todeskrater", + /*german*/ "im Todeskrater", /*french*/ "le CratΓ¨re du PΓ©ril")); // /*spanish*/el crΓ‘ter de la MontaΓ±a de la Muerte hintTextTable[RHT_ZORAS_RIVER] = HintText(CustomMessage("Zora's River", - /*german*/ "Zoras Fluß", + /*german*/ "am Zora-Fluß", /*french*/ "la RiviΓ¨re Zora")); // /*spanish*/el RΓ­o Zora hintTextTable[RHT_ZORAS_DOMAIN] = HintText(CustomMessage("Zora's Domain", - /*german*/ "Zoras Reich", + /*german*/ "in Zoras Reich", /*french*/ "le Domaine Zora")); // /*spanish*/la RegiΓ³n de los Zora hintTextTable[RHT_ZORAS_FOUNTAIN] = HintText(CustomMessage("Zora's Fountain", - /*german*/ "Zoras Quelle", + /*german*/ "an Zoras Quelle", /*french*/ "la Fontaine Zora")); // /*spanish*/la Fuente Zora hintTextTable[RHT_LON_LON_RANCH] = HintText(CustomMessage("Lon Lon Ranch", - /*german*/ "Lon Lon-Farm", + /*german*/ "auf der Lon Lon-Farm", /*french*/ "le Ranch Lon Lon")); // /*spanish*/el Rancho Lon Lon @@ -1069,387 +1067,387 @@ void StaticData::HintTable_Init() { ---------------------------*/ hintTextTable[RHT_KF_LINKS_HOUSE] = HintText(CustomMessage("Link's House", - /*german*/ "Links Haus", + /*german*/ "in #Links Haus#", /*french*/ "la #maison de @#")); // /*spanish*/la casa de @ hintTextTable[RHT_KF_MIDOS_HOUSE] = HintText(CustomMessage("Mido's house", - /*german*/ "Midos Haus", + /*german*/ "in #Midos Haus#", /*french*/ "la Cabane du Grand Mido")); // /*spanish*/la casa de Mido hintTextTable[RHT_KF_SARIAS_HOUSE] = HintText(CustomMessage("Saria's House", - /*german*/ "Salias Haus", + /*german*/ "in #Salias Haus#", /*french*/ "la Cabane de Saria")); // /*spanish*/la casa de Saria hintTextTable[RHT_KF_HOUSE_OF_TWINS] = HintText(CustomMessage("the #House of Twins#", - /*german*/ "das #Haus der Zwillinge#", + /*german*/ "im #Haus der Zwillinge#", /*french*/ "la Cabane des Jumelles")); // /*spanish*/la casa de las gemelas hintTextTable[RHT_KF_KNOW_IT_ALL_HOUSE] = HintText(CustomMessage("Know-It-All Brothers' House", - /*german*/ "das #Haus der allwissenden BrΓΌder#", + /*german*/ "im #Haus der allwissenden BrΓΌder#", /*french*/ "la Cabane des frΓ¨res Je-Sais-Tout")); // /*spanish*/la casa de los hermanos Sabelotodo hintTextTable[RHT_KF_KOKIRI_SHOP] = HintText(CustomMessage("the #Kokiri Shop#", - /*german*/ "der #Kokiri-Laden#", + /*german*/ "im #Kokiri-Laden#", /*french*/ "le #Magasin Kokiri#")); // /*spanish*/la tienda kokiri hintTextTable[RHT_LH_LAB] = HintText(CustomMessage("the #Lakeside Laboratory#", - /*german*/ "das #Laboratorium des Sees#", + /*german*/ "im #Labor am See#", /*french*/ "le #Laboratoire du Lac#")); // /*spanish*/el laboratorio del lago hintTextTable[RHT_LH_FISHING_POND] = HintText(CustomMessage("the #Fishing Pond#", - /*german*/ "der #Angelteich#", + /*german*/ "am #Fischweiher#", /*french*/ "l'#Γ‰tang#")); // /*spanish*/el estanque hintTextTable[RHT_GV_CARPENTER_TENT] = HintText(CustomMessage("the #Carpenters' tent#", - /*german*/ "das #Zelt der Zimmerleute#", + /*german*/ "im #Zelt der Zimmerleute#", /*french*/ "la #Tente des charpentiers#")); // /*spanish*/la #tienda de campaΓ±a de los carpinteros# hintTextTable[RHT_MARKET_GUARD_HOUSE] = HintText(CustomMessage("the #Guard House#", - /*german*/ "das #Haus der Wachen#", + /*german*/ "im #Wachhaus#", /*french*/ "le #poste de garde#")); // /*spanish*/la caseta de guardia hintTextTable[RHT_MARKET_MASK_SHOP] = HintText(CustomMessage("the #Happy Mask Shop#", - /*german*/ "der #FrΓΆhliche Maskenladen#", + /*german*/ "beim #MaskenhΓ€ndler#", /*french*/ "la #Foire Aux Masques#")); // /*spanish*/la tienda de La MΓ‘scara Feliz hintTextTable[RHT_MARKET_BOMBCHU_BOWLING] = HintText(CustomMessage("the #Bombchu Bowling Alley#", - /*german*/ "die #Krabbelminenbowlingbahn", + /*german*/ "bei der #Minenbowlingbahn", /*french*/ "le #Bowling Teigneux#")); // /*spanish*/la Bolera Bombchu hintTextTable[RHT_MARKET_POTION_SHOP] = HintText(CustomMessage("the #Market Potion Shop#", - /*german*/ "der #Magie-Laden des Marktes#", + /*german*/ "im #Magie-Laden des Marktes#", /*french*/ "l'#apothicaire de la Place du MarchΓ©#")); // /*spanish*/la tienda de pociones de la plaza del mercado hintTextTable[RHT_MARKET_TREASURE_CHEST_GAME] = HintText(CustomMessage("the #Treasure Chest Shop#", - /*german*/ "der #Schatztruhen-Laden#", + /*german*/ "in der #Truhenlotterie#", /*french*/ "la #Chasse-aux-TrΓ©sors#")); // /*spanish*/el Cofre del Tesoro hintTextTable[RHT_MARKET_BOMBCHU_SHOP] = HintText(CustomMessage("the #Bombchu Shop#", - /*german*/ "der #Krabbelminen-Laden#", + /*german*/ "im #Krabbelminen-Laden#", /*french*/ "le #Magasin de Missiles#")); // /*spanish*/la Tienda Bombchu hintTextTable[RHT_MARKET_MAN_IN_GREEN_HOUSE] = HintText(CustomMessage("Man in Green's House", - /*german*/ "das #Haus des Mannes in grΓΌn#", + /*german*/ "im #Haus des Mannes in grΓΌn#", /*french*/ "la #Maison de l'Homme en Vert#")); // /*spanish*/la casa del hombre de verde hintTextTable[RHT_KAK_WINDMILL] = HintText(CustomMessage("the #Windmill#", - /*german*/ "die #WindmΓΌhle#", + /*german*/ "in der #WindmΓΌhle#", /*french*/ "le #Moulin#")); // /*spanish*/el #molino# hintTextTable[RHT_KAK_CARPENTER_BOSS_HOUSE] = HintText(CustomMessage("the #Carpenters' Boss House#", - /*german*/ "das #Haus des Chefs der Zimmerleute#", + /*german*/ "im #Haus des Chefs der Zimmerleute#", /*french*/ "la #Maison du Chef des ouvriers#")); // /*spanish*/la casa del capataz de los carpinteros hintTextTable[RHT_KAK_HOUSE_OF_SKULLTULA] = HintText(CustomMessage("the #House of Skulltula#", - /*german*/ "das #Haus der Skulltula#", + /*german*/ "im #Haus der Skulltula#", /*french*/ "la #Maison des Skulltulas#")); // /*spanish*/la casa de las Skulltulas hintTextTable[RHT_KAK_IMPAS_HOUSE] = HintText(CustomMessage("Impa's House", - /*german*/ "das #Haus von Impa#", + /*german*/ "in #Impas Haus#", /*french*/ "la #Maison d'Impa#")); // /*spanish*/la casa de Impa hintTextTable[RHT_KAK_IMPAS_HOUSE_BACK] = HintText(CustomMessage("Impa's cow cage", - /*german*/ "der #KuhkΓ€fig von Impa#", + /*german*/ "in #Impas KuhkΓ€fig#", /*french*/ "la #cage Γ  vache d'Impa#")); // /*spanish*/la jaula de la vaca de Impa hintTextTable[RHT_KAK_ODD_POTION_BUILDING] = HintText(CustomMessage("Granny's Potion Shop", - /*german*/ "Asas Hexenladen", + /*german*/ "in Asas Hexenladen", /*french*/ "la #maison bleue de Cocorico#")); // /*spanish*/la tienda de pociones de la abuela hintTextTable[RHT_GRAVEYARD_DAMPES_HOUSE] = HintText(CustomMessage("DampΓ©'s Hut", - /*german*/ "die #HΓΌtte von Boris#", + /*german*/ "in der #HΓΌtte des TotengrΓ€bers#", /*french*/ "la #Cabane du Fossoyeur#")); // /*spanish*/la cabaΓ±a de DampΓ© hintTextTable[RHT_GC_SHOP] = HintText(CustomMessage("the #Goron Shop#", - /*german*/ "der #Goronen-Laden#", + /*german*/ "im #Goronen-Laden#", /*french*/ "la #Boutique Goron#")); // /*spanish*/la #tienda goron# hintTextTable[RHT_ZD_SHOP] = HintText(CustomMessage("the #Zora Shop#", - /*german*/ "der #Zora-Laden#", + /*german*/ "im #Zora-Laden#", /*french*/ "la #Boutique Zora#")); // /*spanish*/la #tienda zora# hintTextTable[RHT_LLR_TALONS_HOUSE] = HintText(CustomMessage("Talon's House", - /*german*/ "das #Haus von Talon#", + /*german*/ "im #Haus von Talon#", /*french*/ "la #Maison de Talon#")); // /*spanish*/la casa de Talon hintTextTable[RHT_LLR_STABLES] = HintText(CustomMessage("a #stable#", - /*german*/ "ein #Stall#", + /*german*/ "in den #StΓ€llen#", /*french*/ "l'#Γ‰table#")); // /*spanish*/el establo hintTextTable[RHT_LLR_TOWER] = HintText(CustomMessage("the #Lon Lon Tower#", - /*german*/ "der #Lon Lon-Turm#", + /*german*/ "im #Lon Lon-Turm#", /*french*/ "le #silo du Ranch Lon Lon#")); // /*spanish*/la torre Lon Lon hintTextTable[RHT_MARKET_BAZAAR] = HintText(CustomMessage("the #Market Bazaar#", - /*german*/ "der #Basar des Marktes#", + /*german*/ "im #Basar des Marktes#", /*french*/ "le #Bazar de la Place du MarchΓ©#")); // /*spanish*/el bazar de la plaza del mercado hintTextTable[RHT_MARKET_SHOOTING_GALLERY] = HintText(CustomMessage("a #Slingshot Shooting Gallery#", - /*german*/ "die #Schießbude des Marktes#", + /*german*/ "in der #Schießbude des Marktes#", /*french*/ "le #Jeu d'Adresse de la Place du MarchΓ©#")); // /*spanish*/el Tiro al Blanco con tirachinas hintTextTable[RHT_KAK_BAZAAR] = HintText(CustomMessage("the #Kakariko Bazaar#", - /*german*/ "der #Basar von Kakariko#", + /*german*/ "im #Basar von Kakariko#", /*french*/ "le #Bazar de Cocorico#")); // /*spanish*/el bazar de Kakariko hintTextTable[RHT_KAK_POTION_SHOP_FRONT] = HintText(CustomMessage("the #Kakariko Potion Shop#", - /*german*/ "der #Magie-Laden von Kakariko#", + /*german*/ "im #Magie-Laden von Kakariko#", /*french*/ "l'#apothicaire de Cocorico#")); // /*spanish*/la tienda de pociones de Kakariko hintTextTable[RHT_KAK_POTION_SHOP_BACK] = HintText(CustomMessage("the #Kakariko Potion Shop#", - /*german*/ "der #Magie-Laden von Kakariko#", + /*german*/ "im #Magie-Laden von Kakariko#", /*french*/ "l'#apothicaire de Cocorico#")); // /*spanish*/la tienda de pociones de Kakariko hintTextTable[RHT_KAK_SHOOTING_GALLERY] = HintText(CustomMessage("a #Bow Shooting Gallery#", - /*german*/ "eine #Schießbude von Kakariko#", + /*german*/ "in der #Schießbude von Kakariko#", /*french*/ "le #jeu d'adresse de Cocorico#")); // /*spanish*/el Tiro al Blanco con arco hintTextTable[RHT_COLOSSUS_GREAT_FAIRY_FOUNTAIN] = HintText(CustomMessage("a #Great Fairy Fountain#", - /*german*/ "eine #Feen-Quelle#", + /*german*/ "in einer #Feen-Quelle#", /*french*/ "une #Fontaine Royale des FΓ©es#")); // /*spanish*/una fuente de la Gran Hada hintTextTable[RHT_HC_GREAT_FAIRY_FOUNTAIN] = HintText(CustomMessage("a #Great Fairy Fountain#", - /*german*/ "eine #Feen-Quelle#", + /*german*/ "in einer #Feen-Quelle#", /*french*/ "une #Fontaine Royale des FΓ©es#")); // /*spanish*/una fuente de la Gran Hada hintTextTable[RHT_OGC_GREAT_FAIRY_FOUNTAIN] = HintText(CustomMessage("a #Great Fairy Fountain#", - /*german*/ "eine #Feen-Quelle#", + /*german*/ "in einer #Feen-Quelle#", /*french*/ "une #Fontaine Royale des FΓ©es#")); // /*spanish*/una fuente de la Gran Hada hintTextTable[RHT_DMC_GREAT_FAIRY_FOUNTAIN] = HintText(CustomMessage("a #Great Fairy Fountain#", - /*german*/ "eine #Feen-Quelle#", + /*german*/ "in einer #Feen-Quelle#", /*french*/ "une #Fontaine Royale des FΓ©es#")); // /*spanish*/una fuente de la Gran Hada hintTextTable[RHT_DMT_GREAT_FAIRY_FOUNTAIN] = HintText(CustomMessage("a #Great Fairy Fountain#", - /*german*/ "eine #Feen-Quelle#", + /*german*/ "in einer #Feen-Quelle#", /*french*/ "une #Fontaine Royale des FΓ©es#")); // /*spanish*/una fuente de la Gran Hada hintTextTable[RHT_ZF_GREAT_FAIRY_FOUNTAIN] = HintText(CustomMessage("a #Great Fairy Fountain#", - /*german*/ "eine #Feen-Quelle#", + /*german*/ "in einer #Feen-Quelle#", /*french*/ "une #Fontaine Royale des FΓ©es#")); // /*spanish*/una fuente de la Gran Hada hintTextTable[RHT_GRAVEYARD_SHIELD_GRAVE] = HintText(CustomMessage("a #grave with a free chest#", - /*german*/ "ein #Grab mit einer Gratistruhe#", + /*german*/ "in einem #Grab mit einer Gratistruhe#", /*french*/ "le #tombeau avec un trΓ©sor#")); // /*spanish*/la #tumba con un cofre# hintTextTable[RHT_GRAVEYARD_HEART_PIECE_GRAVE] = HintText(CustomMessage("a chest spawned by #Sun's Song#", - /*german*/ "eine von der #Hymne der Sonne# geschaffene Truhe", + /*german*/ "in einer von der #Hymne der Sonne# geschaffenen Truhe", /*french*/ "un #coffre apparaΓt avec le Chant du Soleil#")); // /*spanish*/la #tumba de la CanciΓ³n del Sol# hintTextTable[RHT_GRAVEYARD_COMPOSERS_GRAVE] = HintText(CustomMessage("the #Composers' Grave#", - /*german*/ "das #KΓΆnigsgrab#", + /*german*/ "im #KΓΆnigsgrab#", /*french*/ "la #Tombe royale#")); // /*spanish*/el #PanteΓ³n Real# hintTextTable[RHT_GRAVEYARD_DAMPES_GRAVE] = HintText(CustomMessage("DampΓ©'s Grave", - /*german*/ "das #Grab von Boris#", + /*german*/ "im #Grab des TotengrΓ€bers#", /*french*/ "la #Tombe d'Igor#")); // /*spanish*/la #tumba de DampΓ©# hintTextTable[RHT_DMT_COW_GROTTO] = HintText(CustomMessage("a solitary #Cow#", - /*german*/ "eine solitΓ€re #Kuh#", + /*german*/ "bei einer einsamen #Kuh#", /*french*/ "la #grotte avec une vache#")); // /*spanish*/una #vaca# solitaria hintTextTable[RHT_HC_STORMS_GROTTO] = HintText(CustomMessage("a sandy grotto with #fragile walls#", - /*german*/ "eine sandige Grotte mit #fragilen WΓ€nden#", + /*german*/ "in einer sandige Grotte mit #fragilen WΓ€nden#", /*french*/ "la #grotte avec des murs fragiles#")); // /*spanish*/la arenosa gruta de #frΓ‘giles paredes# hintTextTable[RHT_HF_TEKTITE_GROTTO] = HintText(CustomMessage("a pool guarded by a #Tektite#", - /*german*/ "ein poolbewachender #Arachno#", + /*german*/ "in einem #Schwimmbecken mit einem Arachno#", /*french*/ "l'#Γ©tang sous-terrain avec un Araknon#")); // /*spanish*/un charco custodiado por un #Tektite# hintTextTable[RHT_HF_NEAR_KAK_GROTTO] = HintText(CustomMessage("a #Big Skulltula# guarding a Gold one", - /*german*/ "eine goldene Skulltula bewachende #große Skulltula#", + /*german*/ "bei #zwei unterirdischen Skulltulas#", /*french*/ "la #grotte d'araignΓ©es#")); // /*spanish*/una #gran Skulltula# custodiando una dorada hintTextTable[RHT_HF_COW_GROTTO] = HintText(CustomMessage("a grotto full of #spider webs#", - /*german*/ "eine mit #Spinnweben# gefΓΌllte Grotte", + /*german*/ "in einer Grotte voller #Spinnweben#", /*french*/ "la #grotte couverte de toiles d'araignΓ©es#")); // /*spanish*/una gruta llena de #telaraΓ±as# hintTextTable[RHT_KAK_REDEAD_GROTTO] = HintText(CustomMessage("#ReDeads# guarding a chest", - /*german*/ "truhenbewachende #Remorts#", + /*german*/ "in einer Grotte mit #zwei Remorts#", /*french*/ "le tombeau de #deux morts#")); // /*spanish*/los #ReDeads# que custodian un cofre hintTextTable[RHT_SFM_WOLFOS_GROTTO] = HintText(CustomMessage("#Wolfos# guarding a chest", - /*german*/ "truhenbewachende #Wolfos#", + /*german*/ "in einer Grotte mit #zwei Wolfos#", /*french*/ "la #grotte iridescente#")); // /*spanish*/los #Wolfos# que custodian un cofre hintTextTable[RHT_GV_OCTOROK_GROTTO] = HintText(CustomMessage("an #Octorok# guarding a rich pool", - /*german*/ "ein poolbewachender #Oktorok#", + /*german*/ "in einem #Schwimmbecken mit einem Oktorok#", /*french*/ "un #Γ©tang sous-terrain avec un Octorok#")); // /*spanish*/un #Octorok# que custodia un lujoso charco hintTextTable[RHT_DEKU_THEATER] = HintText(CustomMessage("the #Lost Woods Stage#", - /*german*/ "die #Verlorenen WΓ€lder#", + /*german*/ "auf der #WaldbΓΌhne#", /*french*/ "le #théÒtre sylvestre#")); // /*spanish*/el #escenario del Bosque Perdido# hintTextTable[RHT_ZR_OPEN_GROTTO] = HintText(CustomMessage("a #generic grotto#", - /*german*/ "eine #generische Grotte#", + /*german*/ "in einer #gewΓΆhnlichen Grotte#", /*french*/ "une #grotte avec un trΓ©sor#")); // /*spanish*/una #cueva genΓ©rica# hintTextTable[RHT_DMC_UPPER_GROTTO] = HintText(CustomMessage("a #generic grotto#", - /*german*/ "eine #generische Grotte#", + /*german*/ "in einer #gewΓΆhnlichen Grotte#", /*french*/ "une #grotte avec un trΓ©sor#")); // /*spanish*/una #cueva genΓ©rica# hintTextTable[RHT_DMT_STORMS_GROTTO] = HintText(CustomMessage("a #generic grotto#", - /*german*/ "eine #generische Grotte#", + /*german*/ "in einer #gewΓΆhnlichen Grotte#", /*french*/ "une #grotte avec un trΓ©sor#")); // /*spanish*/una #cueva genΓ©rica# hintTextTable[RHT_KAK_OPEN_GROTTO] = HintText(CustomMessage("a #generic grotto#", - /*german*/ "eine #generische Grotte#", + /*german*/ "in einer #gewΓΆhnlichen Grotte#", /*french*/ "une #grotte avec un trΓ©sor#")); // /*spanish*/una #cueva genΓ©rica# hintTextTable[RHT_HF_NEAR_MARKET_GROTTO] = HintText(CustomMessage("a #generic grotto#", - /*german*/ "eine #generische Grotte#", + /*german*/ "in einer #gewΓΆhnlichen Grotte#", /*french*/ "une #grotte avec un trΓ©sor#")); // /*spanish*/una #cueva genΓ©rica# hintTextTable[RHT_HF_OPEN_GROTTO] = HintText(CustomMessage("a #generic grotto#", - /*german*/ "eine #generische Grotte#", + /*german*/ "in einer #gewΓΆhnlichen Grotte#", /*french*/ "une #grotte avec un trΓ©sor#")); // /*spanish*/una #cueva genΓ©rica# hintTextTable[RHT_HF_SOUTHEAST_GROTTO] = HintText(CustomMessage("a #generic grotto#", - /*german*/ "eine #generische Grotte#", + /*german*/ "in einer #gewΓΆhnlichen Grotte#", /*french*/ "une #grotte avec un trΓ©sor#")); // /*spanish*/una #cueva genΓ©rica# hintTextTable[RHT_KF_STORMS_GROTTO] = HintText(CustomMessage("a #generic grotto#", - /*german*/ "eine #generische Grotte#", + /*german*/ "in einer #gewΓΆhnlichen Grotte#", /*french*/ "une #grotte avec un trΓ©sor#")); // /*spanish*/una #cueva genΓ©rica# hintTextTable[RHT_LW_NEAR_SHORTCUTS_GROTTO] = HintText(CustomMessage("a #generic grotto#", - /*german*/ "eine #generische Grotte#", + /*german*/ "in einer #gewΓΆhnlichen Grotte#", /*french*/ "une #grotte avec un trΓ©sor#")); // /*spanish*/una #cueva genΓ©rica# hintTextTable[RHT_HF_INSIDE_FENCE_GROTTO] = HintText(CustomMessage("a #single Upgrade Deku Scrub#", - /*german*/ "ein #einzelner Upgrade-Deku#", + /*german*/ "bei einem #Deku-HΓ€ndler mit guter Ware#", /*french*/ "une #grotte avec une peste Mojo#")); // /*spanish*/una cueva con un #solitario mercader deku# hintTextTable[RHT_LW_SCRUBS_GROTTO] = HintText(CustomMessage("#2 Deku Scrubs# including an Upgrade one", - /*german*/ "#zwei Dekus# inklusive einem Upgrade-Deku", + /*german*/ "bei #zwei Deku-HΓ€ndlern mit guter Ware#", /*french*/ "une #grotte avec deux pestes Mojo#")); // /*spanish*/una cueva con #dos mercaderes deku# hintTextTable[RHT_COLOSSUS_GROTTO] = HintText(CustomMessage("2 Deku Scrubs", - /*german*/ "zwei Dekus", + /*german*/ "in einer Grotte mit #zwei Deku-HΓ€ndlern#", /*french*/ "une #grotte avec deux pestes Mojo#")); // /*spanish*/una cueva con #dos mercaderes deku# hintTextTable[RHT_ZR_STORMS_GROTTO] = HintText(CustomMessage("2 Deku Scrubs", - /*german*/ "zwei Dekus", + /*german*/ "in einer Grotte mit #zwei Deku-HΓ€ndlern#", /*french*/ "une #grotte avec deux pestes Mojo#")); // /*spanish*/una cueva con #dos mercaderes deku# hintTextTable[RHT_SFM_STORMS_GROTTO] = HintText(CustomMessage("2 Deku Scrubs", - /*german*/ "zwei Dekus", + /*german*/ "in einer Grotte mit #zwei Deku-HΓ€ndlern#", /*french*/ "une #grotte avec deux pestes Mojo#")); // /*spanish*/una cueva con #dos mercaderes deku# hintTextTable[RHT_GV_STORMS_GROTTO] = HintText(CustomMessage("2 Deku Scrubs", - /*german*/ "zwei Dekus", + /*german*/ "in einer Grotte mit #zwei Deku-HΓ€ndlern#", /*french*/ "une #grotte avec deux pestes Mojo#")); // /*spanish*/una cueva con #dos mercaderes deku# hintTextTable[RHT_LH_GROTTO] = HintText(CustomMessage("3 Deku Scrubs", - /*german*/ "drei Dekus", + /*german*/ "in einer Grotte mit #drei Deku-HΓ€ndlern#", /*french*/ "une #grotte avec trois pestes Mojo#")); // /*spanish*/una cueva con #tres mercaderes deku# hintTextTable[RHT_DMC_HAMMER_GROTTO] = HintText(CustomMessage("3 Deku Scrubs", - /*german*/ "drei Dekus", + /*german*/ "in einer Grotte mit #drei Deku-HΓ€ndlern#", /*french*/ "une #grotte avec trois pestes Mojo#")); // /*spanish*/una cueva con #tres mercaderes deku# hintTextTable[RHT_GC_GROTTO] = HintText(CustomMessage("3 Deku Scrubs", - /*german*/ "drei Dekus", + /*german*/ "in einer Grotte mit #drei Deku-HΓ€ndlern#", /*french*/ "une #grotte avec trois pestes Mojo#")); // /*spanish*/una cueva con #tres mercaderes deku# hintTextTable[RHT_LLR_GROTTO] = HintText(CustomMessage("3 Deku Scrubs", - /*german*/ "drei Dekus", + /*german*/ "in einer Grotte mit #drei Deku-HΓ€ndlern#", /*french*/ "une #grotte avec trois pestes Mojo#")); // /*spanish*/una cueva con #tres mercaderes deku# hintTextTable[RHT_ZR_FAIRY_GROTTO] = HintText(CustomMessage("a small #Fairy Fountain#", - /*german*/ "ein kleiner #Feen-Brunnen#", + /*german*/ "in einem #Feen-Brunnen#", /*french*/ "une #fontaine de fΓ©es#")); // /*spanish*/una pequeΓ±a #fuente de hadas# hintTextTable[RHT_HF_FAIRY_GROTTO] = HintText(CustomMessage("a small #Fairy Fountain#", - /*german*/ "ein kleiner #Feen-Brunnen#", + /*german*/ "in einem #Feen-Brunnen#", /*french*/ "une #fontaine de fΓ©es#")); // /*spanish*/una pequeΓ±a #fuente de hadas# hintTextTable[RHT_SFM_FAIRY_GROTTO] = HintText(CustomMessage("a small #Fairy Fountain#", - /*german*/ "ein kleiner #Feen-Brunnen#", + /*german*/ "in einem #Feen-Brunnen#", /*french*/ "une #fontaine de fΓ©es#")); // /*spanish*/una pequeΓ±a #fuente de hadas# hintTextTable[RHT_ZD_STORMS_GROTTO] = HintText(CustomMessage("a small #Fairy Fountain#", - /*german*/ "ein kleiner #Feen-Brunnen#", + /*german*/ "in einem #Feen-Brunnen#", /*french*/ "une #fontaine de fΓ©es#")); // /*spanish*/una pequeΓ±a #fuente de hadas# hintTextTable[RHT_GF_STORMS_GROTTO] = HintText(CustomMessage("a small #Fairy Fountain#", - /*german*/ "ein kleiner #Feen-Brunnen#", + /*german*/ "in einem #Feen-Brunnen#", /*french*/ "une #fontaine de fΓ©es#")); // /*spanish*/una pequeΓ±a #fuente de hadas# @@ -1458,43 +1456,43 @@ void StaticData::HintTable_Init() { ---------------------------*/ hintTextTable[RHT_JUNK01] = HintText(CustomMessage("They say you must read the names of \"Special Deal\" shop items carefully.", - /*german*/ "Man erzΓ€hlt sich, dass man die \"Sonderangebote\" im Laden sorgfΓ€ltig lesen sollte!", + /*german*/ "Man erzΓ€hlt sich, daß man die \"Sonderangebote\" in LΓ€den sorgfΓ€ltig lesen sollte!", /*french*/ "Selon moi, les \"Offres spΓ©ciales\" sont parfois trompeuses... Lisez les attentivement!")); hintTextTable[RHT_JUNK02] = HintText(CustomMessage("They say that Zelda is a poor leader.", - /*german*/ "Man erzΓ€hlt sich, dass Zelda eine schlechte AnfΓΌhrerin ist.", + /*german*/ "Man erzΓ€hlt sich, daß Zelda eine schlechte AnfΓΌhrerin sei.", /*french*/ "Selon moi, Zelda ne ferait pas un bon monarque.")); hintTextTable[RHT_JUNK03] = HintText(CustomMessage("These hints can be quite useful. This is an exception.", - /*german*/ "Die Hinweise kΓΆnnen sehr nΓΌtzlich sein. Dies ist eine Ausnahme.", + /*german*/ "Die Hinweise von uns Mythensteinen kΓΆnnen sehr nΓΌtzlich sein. Dies ist eine Ausnahme.", /*french*/ "Ces indices sont trΓ¨s utiles, Γ  l'exception de celui-ci.")); hintTextTable[RHT_JUNK04] = HintText(CustomMessage("They say that the Lizalfos in Dodongo's Cavern like to play in lava.", - /*german*/ "Man erzΓ€hlt sich, dass die Echsalfos in Dodongo's Cavern gerne in der Lava spielen.", + /*german*/ "Man erzΓ€hlt sich, daß die Echsalfos in Dodongos HΓΆhle gerne in Lava spielen.", /*french*/ "Selon moi, les LΓ©zalfos de la Caverne Dodongo aiment patauger dans la lave.")); hintTextTable[RHT_JUNK05] = HintText(CustomMessage("They say that all the Zora drowned in Wind Waker.", - /*german*/ "Man erzΓ€hlt sich, dass alle Zoras in Wind Waker ertrunken sind.", + /*german*/ "Man erzΓ€hlt sich, daß alle Zoras in Wind Waker ertrunken wΓ€ren.", /*french*/ "Selon moi, les Zoras se sont noyΓ©s dans Wind Waker.")); hintTextTable[RHT_JUNK06] = HintText(CustomMessage("If Gorons eat rocks, does that mean I'm in danger?", - /*german*/ "Goronen essen doch Steine… heißt das, ich sollte mir Sorgen machen?", + /*german*/ "Da Goronen Steine essen… heißt das, ich sollte mir Sorgen machen?", /*french*/ "Ne dis pas au Gorons que je suis ici. Ils mangent des roches, tu sais!")); hintTextTable[RHT_JUNK07] = HintText(CustomMessage("'Member when Ganon was a blue pig?^I 'member.", - /*german*/ "Erinnert ihr euch noch, als Ganon ein blauer Schwein war?^Ich erinnere mich!β€œ", + /*german*/ "Weißte noch als Ganon nur n' blaues Schwein war?^Damals war alles besser. Kein unnΓΆtiger Schnickschnack!", /*french*/ "Dans mon temps, Ganon Γ©tait un cochon bleu...^Pff! Les jeunes de nos jours, et leur Ganondorf!")); hintTextTable[RHT_JUNK08] = HintText(CustomMessage("One who does not have Triforce can't go in.", - /*german*/ "Jemand, der nicht im Besitz der Triforce ist, kann nicht eintreten!", + /*german*/ "Jemand, der nicht im Besitz des Triforce ist, darf nicht eintreten!", /*french*/ "Ceux sans Triforce doivent rebrousser chemin.")); hintTextTable[RHT_JUNK09] = HintText(CustomMessage("Save your future, end the Happy Mask Salesman.", - /*german*/ "Man erzΓ€hlt sich, dass der MaskenverkΓ€ufer aufgehalten werden muss, wenn man eine sichere Zukunft will.", + /*german*/ "Rette die Zukunft, stoppe den MaskenhΓ€ndler solange Du noch kannst.", /*french*/ "Selon moi, tu t'Γ©viteras des jours de malheur si tu vaincs le vendeur de masques...")); hintTextTable[RHT_JUNK10] = HintText(CustomMessage("Glitches are a pathway to many abilities some consider to be... Unnatural.", - /*german*/ "Glitches sind ein Weg zu vielen FΓ€higkeiten, die manche als... unnatΓΌrlich betrachten.", + /*german*/ "Glitches ermΓΆglichen viele FΓ€higkeiten, die manche als... unnatΓΌrlich betrachten wΓΌrden.", /*french*/ "Les glitchs sont un moyen d'acquΓ©rir de nombreuses facultΓ©s considΓ©rΓ©es par certains comme... contraire ")); hintTextTable[RHT_JUNK11] = HintText(CustomMessage("I'm stoned. Get it?", @@ -1502,19 +1500,19 @@ void StaticData::HintTable_Init() { /*french*/ "J'ai Γ©tΓ© pΓ©trifiΓ©.&Tu as compris?")); hintTextTable[RHT_JUNK12] = HintText(CustomMessage("Hoot! Hoot! Would you like me to repeat that?", - /*german*/ "Sei willkommen! Soll ich meine Worte wiederholen?", + /*german*/ "Uhuuu! Uhu! Soll ich mich noch einmal wiederholen?", /*french*/ "Hou hou! Veux-tu que je rΓ©pΓ¨te tout Γ§a?")); hintTextTable[RHT_JUNK13] = HintText(CustomMessage("Gorons are stupid. They eat rocks.", - /*german*/ "Goronen sind dumm. Sie essen Felsen.", + /*german*/ "Goronen sind doof. Sie essen Felsen.", /*french*/ "Les Gorons sont des vraies tΓͺtes dures.")); hintTextTable[RHT_JUNK14] = HintText(CustomMessage("They say that Lon Lon Ranch prospered under Ingo.", - /*german*/ "Man erzΓ€hlt sich, dass Ingo der Lon-Lon-Farm zu neuem Glanz verholfen hat.", + /*german*/ "Man erzΓ€hlt sich, daß Basil der Lon Lon-Farm zu neuem Glanz verholfen hat.", /*french*/ "Selon moi, le Ranch Lon Lon Γ©tait plus prospΓ¨re sous Ingo.")); hintTextTable[RHT_JUNK15] = HintText(CustomMessage("They say without the Lens of Truth, the Treasure Chest Mini-Game is a 1 out of 32 chance.^Good luck!", - /*german*/ "Man erzΓ€hlt sich, dass du ohne das Auge der Wahrheit beim Schatzkisten-Minispiel nur eine 1-zu-32-Chance hast.^Na dann, viel GlΓΌck.", + /*german*/ "Man erzΓ€hlt sich, daß Du ohne das Auge der Wahrheit bei der Truhenlotterie nur eine 1-zu-32-Chance hast.^Na dann, viel GlΓΌck.", /*french*/ "Selon moi, les chances de gagner la Chasse-aux-TrΓ©sors sans Monocle de VΓ©ritΓ© est de 1 chance sur 32.^Bonne chance!")); hintTextTable[RHT_JUNK16] = HintText(CustomMessage("Use bombs wisely.", @@ -1522,7 +1520,7 @@ void StaticData::HintTable_Init() { /*french*/ "Utilise les bombes avec prΓ©caution.")); hintTextTable[RHT_JUNK17] = HintText(CustomMessage("They say that players who select the \"ON\" option for \"MOTION CONTROL\" are the real \"Zelda players!\"", - /*german*/ "Man erzΓ€hlt sich, dass Spieler, die die Option β€šBEWEGUNGSSTEUERUNGβ€˜ auf β€šEINβ€˜ stellen, die wahren β€šZelda-Spielerβ€˜ sind.", + /*german*/ "Man erzΓ€hlt sich, daß Spieler, die die Option \"BEWEGUNGSSTEUERUNG\" auf \"EIN\" stellen, die wahren \"Zelda-Spieler\" sind.", /*french*/ "Selon moi, ceux qui utilisent les contrΓ΄les gyroscopiques sont les VRAIS joueurs.")); hintTextTable[RHT_JUNK18] = HintText(CustomMessage("L2P @.", @@ -1530,7 +1528,7 @@ void StaticData::HintTable_Init() { /*french*/ "ArrΓͺte de lire les indices et joue comme un grand, @.")); hintTextTable[RHT_JUNK19] = HintText(CustomMessage("I bet you'd like to have more bombs.", - /*german*/ "Ich wette, du wΓΌrdest jetzt gerne mehr Bomben haben.", + /*german*/ "MΓΆchtest Du zur Strafe mehr Bomben tragen kΓΆnnen?", /*french*/ "Je parie que tu veux plus de bombes.")); hintTextTable[RHT_JUNK20] = HintText(CustomMessage("When all else fails, use Fire.", @@ -1542,23 +1540,23 @@ void StaticData::HintTable_Init() { /*french*/ "Selon moi, la #Triforce# n'est pas dans le jeu... Duh!")); hintTextTable[RHT_JUNK22] = HintText(CustomMessage("Game Over. Return of Ganon.", - /*german*/ "Game Over. Die RΓΌckkehr von Ganon.", + /*german*/ "Game Over. Ganons RΓΌckkehr.", /*french*/ "Partie terminΓ©e. RETour de Ganon.")); hintTextTable[RHT_JUNK23] = HintText(CustomMessage("May the way of the Hero lead to the Triforce.", - /*german*/ "MΓΆge der Weg des Helden zur Triforce fΓΌhren.", + /*german*/ "MΓΆge der Weg des Helden zum Triforce fΓΌhren.", /*french*/ "Que le chemin du hΓ©ros te mΓ¨ne Γ  la Triforce.")); hintTextTable[RHT_JUNK24] = HintText(CustomMessage("Can't find an item? Scan an Amiibo.", - /*german*/ "Du kannst einen Gegenstand nicht finden? Scanne einen Amiibo.", + /*german*/ "Du kannst einen Gegenstand nicht finden? Scanne ein Amiibo.", /*french*/ "Tu cherches de quoi? Utilise un Amiibo!")); hintTextTable[RHT_JUNK25] = HintText(CustomMessage("They say this game has just a few glitches.", - /*german*/ "Man erzΓ€hlt sich, dass dieses Spiel nur ein paar Glitches hat.", + /*german*/ "Man erzΓ€hlt sich, daß dieses Spiel nur ein paar Glitches hat.", /*french*/ "Selon moi, ce jeu est complΓ¨tement exempt de glitchs.")); hintTextTable[RHT_JUNK26] = HintText(CustomMessage("BRRING BRRING This is Ulrira. Wrong number?", - /*german*/ "BRRING BRRING, hier ist Ulrira. Falsche Nummer.", + /*german*/ "TUUUUT! TUUUUT! Ja? Hier Ulrira! Muss sich wohl verwΓ€hlt haben.", /*french*/ "DRING DRING!! PΓ©pΓ© le Ramollo Γ  l'appareil... Quoi? Faux numΓ©ro?")); hintTextTable[RHT_JUNK27] = HintText(CustomMessage("Tingle Tingle Kooloo Limpah!", @@ -1570,43 +1568,43 @@ void StaticData::HintTable_Init() { /*french*/ "L is real 2401")); hintTextTable[RHT_JUNK29] = HintText(CustomMessage("They say that Ganondorf will appear in the next Mario Tennis.", - /*german*/ "Man erzΓ€hlt sich, dass Ganondorf im nΓ€chsten Mario Tennis erscheinen wird.", + /*german*/ "Man erzΓ€hlt sich, daß Ganondorf im nΓ€chsten Mario Tennis erscheinen wird.", /*french*/ "Selon moi, Ganondorf sera la nouvelle recrue dans Mario Tennis.")); hintTextTable[RHT_JUNK30] = HintText(CustomMessage("They say Medigoron sells the earliest Breath of the Wild demo.", - /*german*/ "Man erzΓ€hlt sich, dass Medigoron die frΓΌheste Breath of the Wild-Demo verkauft.", + /*german*/ "Man erzΓ€hlt sich, daß Medigoron die frΓΌheste Breath of the Wild-Demo verkauft.", /*french*/ "Selon moi, Medigoron vend une dΓ©mo de #Breath of the Wild#.")); hintTextTable[RHT_JUNK31] = HintText(CustomMessage("Can you move me? I don't get great service here.", - /*german*/ "Kannst du mich bewegen? Der Service hier ist nicht gerade gut.", + /*german*/ "Kannst Du mich bewegen? Ich habe schlechten Empfang.", /*french*/ "Peux-tu me dΓ©placer? J'ai pas une bonne rΓ©ception ici.")); hintTextTable[RHT_JUNK32] = HintText(CustomMessage("They say if you use Strength on the truck, you can find Mew.", - /*german*/ "Man erzΓ€hlt sich, dass man mit StΓ€rke am Truck Mew finden kann.", + /*german*/ "Man erzΓ€hlt sich, daß man mit StΓ€rke, unter dem Truck Mew finden kann.", /*french*/ "Selon moi, #Mew# se trouve dessous le camion... Duh!")); hintTextTable[RHT_JUNK33] = HintText(CustomMessage("I'm a helpful hint Gossip Stone!^See, I'm helping.", - /*german*/ "Ich bin ein hilfreicher Stein!^Siehst du, ich helfe.", + /*german*/ "Ich bin ein hilfreicher Mythenstein!^Siehst du? Ich helfe.", /*french*/ "Salut! Je suis une pierre de bons conseils!^Tiens, tu vois? J'aide bien, hein?")); hintTextTable[RHT_JUNK34] = HintText(CustomMessage("Dear @, please come to the castle. I've baked a cake for you.&Yours truly, Princess Zelda.", - /*german*/ "Lieber @, bitte komm ins Schloss. Ich habe einen Kuchen fΓΌr dich gebacken. Mit freundlichen Grüßen,^Prinzessin Zelda.", + /*german*/ "Lieber @!&Komm mich doch einmal im Schloß besuchen! Der Kuchen steht bereit!&In Freundschaft, Prinzessin Zelda.", /*french*/ "Mon trΓ¨s cher @:&Viens vite au chΓ’teau, je t'ai prΓ©parΓ©&un dΓ©licieux gΓ’teau...^Γ€ bientΓ΄t, Princesse Zelda")); hintTextTable[RHT_JUNK35] = HintText(CustomMessage("They say all toasters toast toast.", - /*german*/ "Man erzΓ€hlt sich, dass alle Toaster Toast toasten.", + /*german*/ "Man erzΓ€hlt sich, daß alle Toaster Toast toasten.", /*french*/ "Selon moi, les grille-pains grillent du pain.")); hintTextTable[RHT_JUNK36] = HintText(CustomMessage("You thought it would be a useful hint, but it was me, junk hint!", - /*german*/ "Du dachtest, es wΓ€re ein nΓΌtzlicher Hinweis, aber es war ich, der MΓΌll-Hinweis.", + /*german*/ "Du dachtest dies wΓ€re ein nΓΌtzlicher Hinweis. Doch hier bin ich, der MΓΌll-Hinweis!", /*french*/ "Tu t'attendais Γ  un bon indice... Mais c'Γ©tait moi, un mauvais indice!")); hintTextTable[RHT_JUNK37] = HintText(CustomMessage("They say that quest guidance can be found at a talking rock.", - /*german*/ "Man erzΓ€hlt sich, dass man Quest-Hinweise bei einem sprechenden Stein finden kann.", + /*german*/ "Man erzΓ€hlt sich, daß man Quest-Hinweise bei einem sprechenden Stein finden kann.", /*french*/ "Selon moi, des #indices# se trouvent auprΓ¨s d'une pierre parlante... Duh!")); hintTextTable[RHT_JUNK38] = HintText(CustomMessage("They say that the final item you're looking for can be found somewhere in Hyrule.", - /*german*/ "Man erzΓ€hlt sich, dass das letzte Item, nach dem du suchst, irgendwo in Hyrule zu finden ist.", + /*german*/ "Man erzΓ€hlt sich, daß der letzte Gegenstand nachdem Du gerade suchst, irgendwo in Hyrule zu finden sei.", /*french*/ "Selon moi, le #dernier objet# se trouve quelque part dans Hyrule... Duh!")); hintTextTable[RHT_JUNK39] = HintText(CustomMessage("Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.^Mweep.", @@ -1614,102 +1612,102 @@ void StaticData::HintTable_Init() { /*french*/ "Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.^Mwip.")); hintTextTable[RHT_JUNK40] = HintText(CustomMessage("They say that Barinade fears Deku Nuts.", - /*german*/ "Man erzΓ€hlt sich, dass Barinade Angst vor Deku-NΓΌssen hat.", + /*german*/ "Man erzΓ€hlt sich, daß Barinade Angst vor Deku-NΓΌssen hat.", /*french*/ "Selon moi, Barinade a la frousse des noix Mojo.")); hintTextTable[RHT_JUNK41] = HintText(CustomMessage("They say that Flare Dancers do not fear Goron-crafted blades.", - /*german*/ "Man erzΓ€hlt sich, dass Flammenderwische keine Angst vor von Goronen geschmiedeten Klingen haben.", + /*german*/ "Man erzΓ€hlt sich, daß Flammenderwische keine Angst vor goronengeschmiedeten Klingen haben.", /*french*/ "Selon moi, le danse-flamme n'a pas peur des armes de Goron.")); hintTextTable[RHT_JUNK42] = HintText(CustomMessage("They say that Morpha is easily trapped in a corner.", - /*german*/ "Man erzΓ€hlt sich, dass man Morpha ganz leicht in die Ecke drΓ€ngen kann.", + /*german*/ "Man erzΓ€hlt sich, daß man Morpha ganz leicht in die Ecke drΓ€ngen kann.", /*french*/ "Selon moi, Morpha est facilement coincΓ©.")); hintTextTable[RHT_JUNK43] = HintText(CustomMessage("They say that Bongo Bongo really hates the cold.", - /*german*/ "Man erzΓ€hlt sich, dass Bongo Bongo die KΓ€lte wirklich hasst.", + /*german*/ "Man erzΓ€hlt sich, daß Bongo Bongo die KΓ€lte wirklich hasst.", /*french*/ "Selon moi, Bongo Bongo a facilement froid aux doigts.")); hintTextTable[RHT_JUNK44] = HintText(CustomMessage("They say that your sword is most powerful when you put it away.", - /*german*/ "Man erzΓ€hlt sich, dass dein Schwert am mΓ€chtigsten ist, wenn du es wegsteckst.", + /*german*/ "Man erzΓ€hlt sich, daß Dein Schwert am mΓ€chtigsten ist, wenn Du es wegsteckst.", /*french*/ "Selon moi, ton Γ©pΓ©e est Γ  pleine puissance quand tu la rengaines.")); hintTextTable[RHT_JUNK45] = HintText(CustomMessage("They say that bombing the hole Volvagia last flew into can be rewarding.", - /*german*/ "Man erzΓ€hlt sich, dass es sich lohnt, das Loch zu bombardieren, in das Volvagia zuletzt geflogen ist.", + /*german*/ "Man erzΓ€hlt sich, daß es sich lohnt das Loch zu bombardieren, in das Volvagia zuletzt geflogen ist.", /*french*/ "Selon moi, le trou oΓΉ se creuse Volvagia est vulnΓ©rable aux bombes.")); hintTextTable[RHT_JUNK46] = HintText(CustomMessage("They say that invisible ghosts can be exposed with Deku Nuts.", - /*german*/ "Man erzΓ€hlt sich, dass unsichtbare Geister mit Deku-NΓΌssen sichtbar gemacht werden kΓΆnnen.", + /*german*/ "Man erzΓ€hlt sich, daß unsichtbare Geister mit Deku-NΓΌssen sichtbar gemacht werden kΓΆnnen.", /*french*/ "Selon moi, des fantΓ΄mes invisibles apparaissent avec des noix Mojo.")); hintTextTable[RHT_JUNK47] = HintText(CustomMessage("They say that the real Phantom Ganon is bright and loud.", - /*german*/ "Man erzΓ€hlt sich, dass der wahre Phantom-Ganon durch Helligkeit und LΓ€rm auffΓ€llt.", + /*german*/ "Man erzΓ€hlt sich, daß der wahre Phantom-Ganon durch Helligkeit und LΓ€rm auffΓ€llt.", /*french*/ "Selon moi, le vrai spectre de Ganon est clair et bruyant.")); hintTextTable[RHT_JUNK48] = HintText(CustomMessage("They say that walking backwards is very fast.", - /*german*/ "Man erzΓ€hlt sich, dass rΓΌckwΓ€rts laufen sehr schnell ist.", + /*german*/ "Man erzΓ€hlt sich, daß rΓΌckwΓ€rts laufen sehr schnell ist.", /*french*/ "Selon moi, tu fais marche arriΓ¨re trΓ¨s rapidement pour un hΓ©ros.")); hintTextTable[RHT_JUNK49] = HintText(CustomMessage("They say Ingo is not very good at planning ahead.", - /*german*/ "Man erzΓ€hlt sich, dass Ingo nicht besonders gut darin ist, vorauszuplanen.", + /*german*/ "Man erzΓ€hlt sich, daß Basil nicht besonders gut darin ist vorauszuplanen.", /*french*/ "Selon moi, Ingo ne fait pas un trΓ¨s bon geΓ΄lier.")); hintTextTable[RHT_JUNK50] = HintText(CustomMessage("You found a spiritual Stone! By which I mean, I worship Nayru.", - /*german*/ "Du hast einen heiligen Stein gefunden! Also... eigentlich heißt das nur, dass ich Nayru verehre.", + /*german*/ "Du hast einen Heiligen Stein gefunden!^Also... eigentlich heißt das nur, daß ich Nayru verehre.", /*french*/ "Vous avez trouvΓ© une Pierre Ancestrale! En effet, je vΓ©nΓ¨re la dΓ©esse Hylia.")); hintTextTable[RHT_JUNK51] = HintText(CustomMessage("Open your eyes.^Open your eyes.^Wake up, @.", - /*german*/ "Γ–ffne deine Augen.^Γ–ffne deine Augen.^Wach auf, @.", + /*german*/ "Γ–ffne die Augen...^Γ–ffne die Augen...^Wach auf, @.", /*french*/ "RΓ©veille-toi...^RΓ©veille-toi.^Ouvre les yeux, @.")); hintTextTable[RHT_JUNK52] = HintText(CustomMessage("They say that the Nocturne of Shadow can bring you very close to Ganon.", - /*german*/ "Man erzΓ€hlt sich, dass das Nocturne des Schattens dich Ganon sehr nahe bringen kann.", + /*german*/ "Man erzΓ€hlt sich, daß die Nocturne des Schattens dich Ganon sehr nahe bringen kann.", /*french*/ "Selon moi, le Nocturne de l'Ombre peut t'amener trΓ¨s prΓ¨s de Ganon.")); hintTextTable[RHT_JUNK53] = HintText(CustomMessage("They say that Twinrova always casts the same spell the first three times.", - /*german*/ "Man erzΓ€hlt sich, dass Twinrova die ersten drei Male immer denselben Zauber benutzt.", + /*german*/ "Man erzΓ€hlt sich, daß Twinrova die ersten drei Male immer denselben Zauber benutzt.", /*french*/ "Selon moi, le Duo MalΓ©fique lance toujours les mΓͺmes trois premiers sorts.")); hintTextTable[RHT_JUNK54] = HintText(CustomMessage("They say that the nightly builds may be unstable.", - /*german*/ "Man erzΓ€hlt sich, dass die \"nightly builds\" instabil sein kΓΆnnten.", + /*german*/ "Man erzΓ€hlt sich, daß die \"Nightly Builds\" instabil sein kΓΆnnten.", /*french*/ "Selon moi, les \"nightly builds\" peuvent Γͺtre instables.")); hintTextTable[RHT_JUNK55] = HintText(CustomMessage("You're playing a Randomizer. I'm randomized!^Here's a random number: #4#.&Enjoy your Randomizer!", - /*german*/ "Du spielst einen Randomizer. Ich bin randomisiert!^Hier ist eine zufΓ€llige Zahl: #4#.&Viel Spaß mit dem Randomizer!", + /*german*/ "Du spielst einen Randomizer. Ich wurde zufΓ€llig generiert!^Hier ist eine zufΓ€llige Zahl: #4#.&Viel Spaß mit dem Randomizer!", /*french*/ "Tu joues Γ  un randomizer. Je suis alΓ©atoire!^Voici un nombre alΓ©atoire: #4#.&Bonne partie!")); hintTextTable[RHT_JUNK56] = HintText(CustomMessage("They say Ganondorf's bolts can be reflected with glass or steel.", - /*german*/ "Man erzΓ€hlt sich, dass man Ganondorfs Blitze mit Glas oder Stahl reflektieren kann.", + /*german*/ "Man erzΓ€hlt sich, daß man Ganondorfs Blitze mit Glas oder Stahl reflektieren kann.", /*french*/ "Selon moi, les Γ©clairs de Ganon se reflΓ¨tent sur l'acier et le verre.")); hintTextTable[RHT_JUNK57] = HintText(CustomMessage("They say Ganon's tail is vulnerable to nuts, arrows, swords, explosives, hammers...^...sticks, seeds, " "boomerangs...^...rods, shovels, iron balls, angry bees...", - /*german*/ "Man erzΓ€hlt sich, dass Ganons Schwanz verwundbar ist durch NΓΌsse, Pfeile, Schwerter...^...Sprengstoffe, HΓ€mmer, " + /*german*/ "Man erzΓ€hlt sich, Ganons Schwanz sei verwundbar durch NΓΌsse, Pfeile, Schwerter...^...Explosives, HΓ€mmer, " "StΓΆcke...^...Kerne, Bumerangs, Schaufeln, Eisenkugeln, wΓΌtende Bienen...", /*french*/ "Selon moi, la queue de Ganon est vulnΓ©rable aux noix, flΓ¨ches, Γ©pΓ©es, bombes, marteaux...^...bΓ’tons, " "graines, boomerangs...^...baguettes, pelles, boulets de fer, abeilles enragΓ©es...")); hintTextTable[RHT_JUNK58] = HintText(CustomMessage("They say that you're wasting time reading this hint, but I disagree. Talk to me again!", - /*german*/ "Man erzΓ€hlt sich, dass du deine Zeit mit dem Lesen dieses Hinweises verschwendest, aber ich bin anderer Meinung. Sprich noch einmal mit mir.", + /*german*/ "Man erzΓ€hlt sich, daß Du deine Zeit mit dem Lesen dieses Hinweises verschwendest, aber ich bin anderer Meinung. Sprich noch einmal mit mir.", /*french*/ "Selon moi... tu sais quoi? Parle-moi encore, et je te le dirai!")); hintTextTable[RHT_JUNK59] = HintText(CustomMessage("They say Ganondorf knows where to find the instrument of his doom.", - /*german*/ "Man erzΓ€hlt sich, dass Ganondorf weiß, wo er das Instrument seines Untergangs finden kann.", + /*german*/ "Man erzΓ€hlt sich, daß Ganondorf weiß, wo man das Instrument seines Untergangs finden kann.", /*french*/ "Selon moi, Ganondorf sait oΓΉ il a cachΓ© son point faible.")); hintTextTable[RHT_JUNK60] = HintText(CustomMessage("I heard @ is pretty good at Zelda.", - /*german*/ "Ich habe gehΓΆrt, dass @ ziemlich gut in Zelda ist.", + /*german*/ "Ich habe gehΓΆrt, daß @ ziemlich gut in Zelda Spielen ist.", /*french*/ "Apparemment, @ est super bon Γ  Zelda.")); hintTextTable[RHT_JUNK61] = HintText(CustomMessage("Hi @, we've been trying to reach you about your car's extended warranty. ", - /*german*/ "Hallo @, wir haben versucht, dich wegen der erweiterten Garantie fΓΌr dein Auto zu erreichen.", + /*german*/ "Hallo @, wir haben versucht, Dich wegen der erweiterten Garantie fΓΌr Dein Auto zu erreichen.", /*french*/ "Bonjour, @. Vous avez une voiture? Vous savez, nous offrons des assurances abordables...")); hintTextTable[RHT_JUNK62] = HintText(CustomMessage("They say that it's actually possible to beat the running man.", - /*german*/ "Man erzΓ€hlt sich, dass es tatsΓ€chlich mΓΆglich ist, den Laufenden Mann zu besiegen.", + /*german*/ "Man erzΓ€hlt sich, daß es tatsΓ€chlich mΓΆglich sei, den Marathon-LΓ€ufer zu besiegen.", /*french*/ "Selon moi, il est possible de battre le coureur.&Donc, tu prends ton arc, et...")); hintTextTable[RHT_JUNK63] = HintText(CustomMessage("They say this hint makes more sense in other languages.", - /*german*/ "Man erzΓ€hlt sich, dass diese Hinweise besser ΓΌbersetzt werden kΓΆnnten… na ja, wer hΓ€tte das gedacht.", + /*german*/ "Man erzΓ€hlt sich, daß dieser Hinweis in anderen Sprachen mehr Sinn macht.", /*french*/ "Selon moi, ces indices auraient pu Γͺtre mieux traduits... Duh!")); // ^ Junk hints above are from 3drando @@ -1719,35 +1717,35 @@ void StaticData::HintTable_Init() { // And nothing that's super obscure that no one's going to understand. hintTextTable[RHT_JUNK64] = HintText(CustomMessage("They say Greg is special.", - /*german*/ "Man erzΓ€hlt sich, dass Greg etwas Besonderes ist.", + /*german*/ "Man erzΓ€hlt sich, daß Greg etwas Besonderes ist.", /*french*/ "Selon moi, Greg est spΓ©cial.")); hintTextTable[RHT_JUNK65] = HintText(CustomMessage("They say the longer the Goron's neck, the wiser they are.", - /*german*/ "Man erzΓ€hlt sich, dass ein Gorone umso weiser wird, je lΓ€nger sein Hals ist.", + /*german*/ "Man erzΓ€hlt sich, daß ein Gorone umso weiser wird, je lΓ€nger sein Hals ist.", /*french*/ "Selon moi, plus le cou des Gorons est long, plus ils sont sage." )); hintTextTable[RHT_JUNK66] = HintText(CustomMessage("They say this ship is what all true gamers strive for.", - /*german*/ "Man erzΓ€hlt sich, dass dieses \"ship\" das ist, wonach alle echten Gamer streben.", + /*german*/ "Man erzΓ€hlt sich, daß dieses \"Ship\" das ist, wonach alle echten Gamer streben.", /*french*/ "Selon moi, cette version du port est ce pour quoi luttent tous les vrais gamers.")); hintTextTable[RHT_JUNK67] = HintText(CustomMessage("They say that Glowsticks can be found in the Raveyard.", - /*german*/ "Man erzΓ€hlt sich, dass LeuchtstΓ€be auf dem Partyfriedhof zu finden sind.", + /*german*/ "Man erzΓ€hlt sich, daß LeuchtstΓ€be auf dem Partyfriedhof zu finden wΓ€ren.", /*french*/ "Selon moi, on peut trouver des BΓ’tons Lumineux sur le dancefloor du cimetiΓ¨re.")); hintTextTable[RHT_JUNK68] = HintText(CustomMessage("They say @'s uncle works for Nintendo.", - /*german*/ "Man erzΓ€hlt sich, dass @'s Onkel bei Nintendo arbeitet.", + /*german*/ "Man erzΓ€hlt sich, daß @'s Onkel bei Nintendo arbeitet.", /*french*/ "Selon moi, l'oncle de @ travaille chez Nintendo.")); hintTextTable[RHT_JUNK69] = HintText(CustomMessage("They say pulling all gravestones in the graveyard leads to something magical.", - /*german*/ "Man erzΓ€hlt sich, dass das Ziehen aller Grabsteine auf dem Friedhof zu etwas Magischem fΓΌhrt.", + /*german*/ "Man erzΓ€hlt sich, daß das Ziehen aller Grabsteine auf dem Friedhof zu etwas Magischem fΓΌhre.", /*french*/ "Selon moi, tirer toutes les tombes du CimetiΓ¨re dΓ©clanche un truc magique.")); hintTextTable[RHT_JUNK70] = HintText(CustomMessage("They say holding L while pausing makes you win the game.", - /*german*/ "Man erzΓ€hlt sich, dass man das Spiel gewinnt, wenn man L gedrΓΌckt hΓ€lt, wΓ€hrend man pausiert.", + /*german*/ "Man erzΓ€hlt sich, daß man das Spiel gewinnt, wenn man L gedrΓΌckt hΓ€lt, wΓ€hrend man pausiert.", /*french*/ "Selon moi, maintenir L pendant que vous appuyez sur START vous permet de terminer le jeu.")); hintTextTable[RHT_JUNK71] = HintText(CustomMessage("They say @'s body is ready.", - /*german*/ "Man erzΓ€hlt sich... nein weisst du was, ich hab keine lust mehr.", + /*german*/ "Man erzΓ€hlt sich... nein weißt Du was, ich habe keine Lust mehr.", /*french*/ "Selon moi, ce junk hint ne se traduirait pas bien en franΓ§ais.")); /*-------------------------- @@ -1756,122 +1754,122 @@ void StaticData::HintTable_Init() { hintTextTable[RHT_DEKU_TREE] = HintText(CustomMessage("Deku Tree", - /*german*/ "Deku-Baum", + /*german*/ "im Deku-Baum", /*french*/ "l'Arbre Mojo"), // /*spanish*/el Gran Árbol Deku {}, {CustomMessage("an ancient tree", - /*german*/ "ein antiker Baum", + /*german*/ "in einem antiken Baum", /*french*/ "le vieil arbre")}); // /*spanish*/un ancestral Γ‘rbol hintTextTable[RHT_DODONGOS_CAVERN] = HintText(CustomMessage("Dodongo's Cavern", - /*german*/ "Dodongos Kaverne", + /*german*/ "in Dodongos HΓΆhle", /*french*/ "la Caverne Dodongo"), // /*spanish*/la Cueva de los Dodongos {}, {CustomMessage("an immense cavern", - /*german*/ "eine riesige Kaverne", + /*german*/ "in einer riesigen Kaverne", /*french*/ "l'immense caverne")}); // /*spanish*/una descomunal cueva hintTextTable[RHT_JABU_JABUS_BELLY] = HintText(CustomMessage("Jabu-Jabu's Belly", - /*german*/ "Jabu-Jabus Bauch", + /*german*/ "in Jabu-Jabus Bauch", /*french*/ "le Ventre de Jabu-Jabu"), // /*spanish*/tripa de Jabu-Jabu {}, {CustomMessage("the belly of a deity", - /*german*/ "der Bauch einer Gottheit", + /*german*/ "im Bauche einer Gottheit", /*french*/ "le ventre d'un gardien")}); // /*spanish*/la tripa de cierta deidad hintTextTable[RHT_FOREST_TEMPLE] = HintText(CustomMessage("Forest Temple", - /*german*/ "Waldtempel", + /*german*/ "im Waldtempel", /*french*/ "le Temple de la ForΓͺt"), // /*spanish*/el Templo del Bosque {}, {CustomMessage("a deep forest", - /*german*/ "ein tiefer Wald", + /*german*/ "in dunklen WΓ€ldern", /*french*/ "la profonde forΓͺt")}); // /*spanish*/las profundidades del bosque hintTextTable[RHT_FIRE_TEMPLE] = HintText(CustomMessage("Fire Temple", - /*german*/ "Feuertempel", + /*german*/ "im Feuertempel", /*french*/ "le Temple du Feu"), // /*spanish*/el Templo del Fuego {}, {CustomMessage("a high mountain", - /*german*/ "ein hoher Berg", + /*german*/ "auf hohem Berge", /*french*/ "la grande montagne")}); // /*spanish*/una alta montaΓ±a hintTextTable[RHT_WATER_TEMPLE] = HintText(CustomMessage("Water Temple", - /*german*/ "Wassertempel", + /*german*/ "im Wassertempel", /*french*/ "le Temple de l'Eau"), // /*spanish*/el Templo del Agua {}, {CustomMessage("a vast lake", - /*german*/ "ein gewaltiger See", + /*german*/ "in einem riesigen See", /*french*/ "le vaste lac")}); // /*spanish*/un lago inmenso hintTextTable[RHT_SPIRIT_TEMPLE] = HintText(CustomMessage("Spirit Temple", - /*german*/ "Geistertempel", + /*german*/ "im Geistertempel", /*french*/ "le Temple de l'Esprit"), // /*spanish*/el Templo del EspΓ­ritu {}, {CustomMessage("the goddess of the sand", - /*german*/ "die GΓΆttin des Sandes", + /*german*/ "innerhalb der GΓΆttin des Sandes", /*french*/ "la dΓ©esse des sables")}); // /*spanish*/la diosa de las arenas hintTextTable[RHT_SHADOW_TEMPLE] = HintText(CustomMessage("Shadow Temple", - /*german*/ "Schattentempel", + /*german*/ "im Schattentempel", /*french*/ "le Temple de l'Ombre"), // /*spanish*/el Templo de las Sombras {}, {CustomMessage("the house of the dead", - /*german*/ "das Haus der Toten", + /*german*/ "an der StΓ€tte der Toten", /*french*/ "la maison des morts")}); // /*spanish*/la casa de la muerte hintTextTable[RHT_ICE_CAVERN] = HintText(CustomMessage("Ice Cavern", - /*german*/ "EishΓΆhle", + /*german*/ "in der EishΓΆhle", /*french*/ "la caverne de glace"), // /*spanish*/la caverna de hielo {}, {CustomMessage("a frozen maze", - /*german*/ "ein gefrorenes Labyrinth", + /*german*/ "in einem gefrorenen Labyrinth", /*french*/ "le dΓ©dale glacΓ©")}); // /*spanish*/un gΓ©lido laberinto hintTextTable[RHT_BOTTOM_OF_THE_WELL] = HintText(CustomMessage("Bottom of the Well", - /*german*/ "Grund des Brunnens", + /*german*/ "auf dem Grund des Brunnens", /*french*/ "le fonds du Puits"), // /*spanish*/el fondo del pozo {}, {CustomMessage("a shadow\'s prison", - /*german*/ "das GefΓ€ngnis eines Schattens", + /*german*/ "im GefΓ€ngnis eines DΓ€mons", /*french*/ "la prison d'une ombre")}); // /*spanish*/la prisiΓ³n de las sombras hintTextTable[RHT_GERUDO_TRAINING_GROUND] = HintText(CustomMessage("Gerudo Training Ground", - /*german*/ "Gerudo-TrainingsgelΓ€nde", + /*german*/ "in der Gerudo-Trainingsarena", /*french*/ "le Gymnase Gerudo"), // /*spanish*/el Centro de InstrucciΓ³n Gerudo {}, {CustomMessage("the test of thieves", - /*german*/ "die PrΓΌfung der Diebe", + /*german*/ "bei der PrΓΌfung der Diebe", /*french*/ "l'Γ©preuve des voleurs")}); // /*spanish*/la prueba de las bandidas hintTextTable[RHT_GANONS_CASTLE] = HintText(CustomMessage("Inside Ganon's Castle", - /*german*/ "In Ganons Schloß", + /*german*/ "in Ganons Schloß", /*french*/ "l'intΓ©rieur du ChΓ’teau de Ganon"), // /*spanish*/el interior del Castillo de Ganon {}, {CustomMessage("a conquered citadel", - /*german*/ "eine eroberte Zitadelle", + /*german*/ "in einer gefallenen Zitadelle", /*french*/ "la citadelle assiΓ©gΓ©e")}); // /*spanish*/una conquistada ciudadela @@ -1885,7 +1883,7 @@ void StaticData::HintTable_Init() { // /*spanish*/la #Reina Goma# porta #[[1]]#. {}, {CustomMessage("They say that the #Parasitic Armored Arachnid# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #gepanzerte parasitΓ€re Spinne# #[[1]]# hielte.", + /*german*/ "Man erzΓ€hlt sich, daß der #gepanzerte Spinnenparasit# #[[1]]# hielte.", /*french*/ "Selon moi, le #monstre insectoΓ―de gΓ©ant# possΓ¨de #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/el #arΓ‘cnido parasitario acorazado# porta #[[1]]#. @@ -1895,7 +1893,7 @@ void StaticData::HintTable_Init() { // /*spanish*/el #Rey Dodongo# porta #[[1]]#. {}, {CustomMessage("They say that the #Infernal Dinosaur# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #infernalische Dinosaurier# #[[1]]# hielte.", + /*german*/ "Man erzΓ€hlt sich, daß der #Infernosaurus# #[[1]]# hielte.", /*french*/ "Selon moi, le #dinosaure infernal# possΓ¨de #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/el #dinosaurio infernal# porta #[[1]]#. @@ -1905,7 +1903,7 @@ void StaticData::HintTable_Init() { // /*spanish*/#Barinade# porta #[[1]]#. {}, {CustomMessage("They say that the #Bio-Electric Anemone# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #bioelektrische Anemone# #[[1]]# hielte.", + /*german*/ "Man erzΓ€hlt sich, daß der #elektroterrestrische Biotentakel# #[[1]]# hielte.", /*french*/ "Selon moi, l'#anΓ©mone bioΓ©lectrique# possΓ¨de #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/la #anΓ©mona bioelΓ©ctrica# porta #[[1]]#. @@ -1915,7 +1913,7 @@ void StaticData::HintTable_Init() { // /*spanish*/#Ganon Fantasma# porta #[[1]]#. {}, {CustomMessage("They say that the #Evil Spirit from Beyond# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #bΓΆse Geist aus dem Jenseits# #[[1]]# hielte.", + /*german*/ "Man erzΓ€hlt sich, daß das #reitende Unheil# #[[1]]# hielte.", /*french*/ "Selon moi, l'#esprit malΓ©fique de l'au-delΓ # possΓ¨de #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/el #espΓ­ritu maligno de ultratumba# porta #[[1]]#. @@ -1925,7 +1923,7 @@ void StaticData::HintTable_Init() { // /*spanish*/#Volvagia# porta #[[1]]#. {}, {CustomMessage("They say that the #Subterranean Lava Dragon# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #subterrane Lavadrache# #[[1]]# hielte.", + /*german*/ "Man erzΓ€hlt sich, daß der #subterrane Lavadrachoid# #[[1]]# hielte.", /*french*/ "Selon moi, le #dragon des profondeurs# possΓ¨de #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/el #dragΓ³n de lava subterrΓ‘neo# porta #[[1]]#. @@ -1935,7 +1933,7 @@ void StaticData::HintTable_Init() { // /*spanish*/#Morpha# porta #[[1]]#. {}, {CustomMessage("They say that the #Giant Aquatic Amoeba# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #gigantische aquatische AmΓΆbe# #[[1]]# hielte.", + /*german*/ "Man erzΓ€hlt sich, daß der #aquamΓΆbe Wassertentakel# #[[1]]# hielte.", /*french*/ "Selon moi, l'#amibe aquatique gΓ©ante# possΓ¨de #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/la #ameba acuΓ‘tica gigante# porta #[[1]]#. @@ -1945,7 +1943,7 @@ void StaticData::HintTable_Init() { // /*spanish*/#Bongo Bongo# porta #[[1]]#. {}, {CustomMessage("They say that the #Phantom Shadow Beast# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Phantomschattenbiest# #[[1]]# hielte.", + /*german*/ "Man erzΓ€hlt sich, daß die #bestialische SchattenmonstrositΓ€t# #[[1]]# hielte.", /*french*/ "Selon moi, le #monstre de l'ombre# possΓ¨de #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/la #alimaΓ±a oscura espectral# porta #[[1]]#. @@ -1955,7 +1953,7 @@ void StaticData::HintTable_Init() { // /*spanish*/#Birova# porta #[[1]]#. {}, {CustomMessage("They say that the #Sorceress Sisters# hold #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #Hexenschwestern# #[[1]]# hielten.", + /*german*/ "Man erzΓ€hlt sich, daß die #hΓΆllische Hexenarmada# #[[1]]# hielte.", /*french*/ "Selon moi, #les sorciΓ¨res jumelles# possΓ¨de #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/las #hermanas hechiceras# portan #[[1]]#. @@ -1979,27 +1977,27 @@ void StaticData::HintTable_Init() { hintTextTable[RHT_BRIDGE_VANILLA_HINT] = HintText(CustomMessage("$6The awakened ones require the #Shadow and Spirit Medallions# as well as the #Light Arrows#.^", - /*german*/ "$6Die Weisen werden darauf warten, daß der Held das #Amulett des Schattens, Amulett der Geister# und die #Licht-Pfeile# sammelt.^", + /*german*/ "$6Die Weisen, die darauf warten,&daß der Held das #Amulett des Schattens, Amulett der Geister#&und die #Licht-Pfeile# sammelt.^", /*french*/ "$6Les Γͺtres de sagesse attendront le hΓ©ros muni des #MΓ©daillons de l'Ombre et l'Esprit# et des #FlΓ¨ches de LumiΓ¨re#.^", {QM_RED, QM_YELLOW})); // /*spanish*/$6Los sabios aguardarΓ‘n a que el hΓ©roe obtenga tanto el #MedallΓ³n de las Sombras y el del EspΓ­ritu# junto // a la #flecha de luz#.^ hintTextTable[RHT_BRIDGE_STONES_HINT] = HintText(CustomMessage("$0The awakened ones will await for the Hero to collect #[[d]] Spiritual Stone||s|#.^", - /*german*/ "$0Die Weisen werden darauf warten, daß der Held #[[d]] |Heiligen Stein|Heilige Steine|# sammelt.^", + /*german*/ "$0Die Weisen werden darauf&warten, daß der Held&#[[d]] |Heiligen Stein|Heilige Steine|# sammelt.^", /*french*/ "$0Les Γͺtres de sagesse attendront le hΓ©ros muni de #[[d]] |Pierre Ancestrale|Pierres Ancestrales|#.^", {QM_BLUE})); // /*spanish*/$0Los sabios aguardarΓ‘n a que el hΓ©roe&obtenga #[[d]] |piedra espiritual|piedras espirituales|#.^ hintTextTable[RHT_BRIDGE_MEDALLIONS_HINT] = HintText(CustomMessage("$8The awakened ones will await for the Hero to collect #[[d]] Medallion||s|#.^", - /*german*/ "$8Die Weisen werden darauf warten, daß der Held #[[d]] Amulett||e|# sammelt.^", + /*german*/ "$8Die Weisen werden darauf&warten, daß der Held&#[[d]] Amulett||e|# sammelt.^", /*french*/ "$8Les Γͺtres de sagesse attendront le hΓ©ros muni de #[[d]] MΓ©daillon||s|#.^", {QM_RED})); // /*spanish*/$8Los sabios aguardarΓ‘n a que el hΓ©roe&obtenga #[[d]] |medallΓ³n|medallones|#.^ hintTextTable[RHT_BRIDGE_REWARDS_HINT] = HintText(CustomMessage("$CThe awakened ones will await for the Hero to collect #[[d]]# |#Spiritual Stone# or #Medallion#|" "#Spiritual Stones# and #Medallions#|.^", - /*german*/ "$CDie Weisen werden darauf warten, daß der Held #[[d]]# |#Heiligen Stein# oder #Amulett#|" + /*german*/ "$CDie Weisen werden darauf&warten, daß der Held&#[[d]]# |#Heiligen Stein# oder #Amulett#|" "#Heilige Steine# oder #Amulette#| sammelt.^", /*french*/ "$CLes Γͺtres de sagesse attendront le hΓ©ros muni de #[[d]]# |#Pierre Ancestrale# ou #MΓ©daillon#" "|#Pierres Ancestrales# ou #MΓ©daillons#|.^", @@ -2008,19 +2006,19 @@ void StaticData::HintTable_Init() { //#piedras espirtuales# y #medallones#|.^ hintTextTable[RHT_BRIDGE_DUNGEONS_HINT] = HintText(CustomMessage("$mThe awakened ones will await for the Hero to conquer #[[d]] Dungeon||s|#.^", - /*german*/ "$mDie Weisen werden darauf warten, daß der Held #[[d]] Labyrinth||e|# abschließt.^", + /*german*/ "$mDie Weisen werden darauf&warten, daß der Held&#[[d]] Labyrinth||e|# abschließt.^", /*french*/ "$mLes Γͺtres de sagesse attendront la conquΓͺte de #[[d]] Donjon||s|#.^", {QM_PINK})); // /*spanish*/$mLos sabios aguardarΓ‘n a que el hΓ©roe complete #[[d]] mazmorra||s|#.^ hintTextTable[RHT_BRIDGE_TOKENS_HINT] = HintText(CustomMessage("$sThe awakened ones will await for the Hero to collect #[[d]] Gold Skulltula Token||s|#.^", - /*german*/ "$sDie Weisen werden darauf warten, daß der Held #[[d]] Skulltula-Symbol||e|# sammelt.^", + /*german*/ "$sDie Weisen werden darauf&warten, daß der Held&#[[d]] Skulltula-Symbol||e|# sammelt.^", /*french*/ "$sLes Γͺtres de sagesse attendront le hΓ©ros muni de #[[d]] Symbole||s| de Skulltula d'or#.^", {QM_YELLOW})); // /*spanish*/$sLos sabios aguardarΓ‘n a que el hΓ©roe obtenga #[[d]] sΓ­mbolo||s| de skulltula dorada#.^ hintTextTable[RHT_BRIDGE_GREG_HINT] = HintText(CustomMessage("$gThe awakened ones will await for the Hero to find #Greg#.^", - /*german*/ "$gDie Erwachten werden darauf warten, dass der Held #Greg# findet.^", + /*german*/ "$gDie Weisen werden darauf&warten, daß der Held&#Greg# findet.^", /*french*/ "$gLes Γͺtres de sagesse attendront le hΓ©ros muni de #Greg#.^", {QM_GREEN})); @@ -2036,7 +2034,7 @@ void StaticData::HintTable_Init() { // /*spanish*/$bY obtendrΓ‘s la llave del #seΓ±or del mal# desde el #inicio#.^ hintTextTable[RHT_GANON_BK_VANILLA_HINT] = HintText(CustomMessage("$bAnd the #evil one#'s key will be kept in a big chest #inside its tower#.^", - /*german*/ "$bUnd der #SchlΓΌssel des BΓΆsen#, wird in der großen Truhe #im Teufelsturm# zu finden sein.^", + /*german*/ "$bUnd der #SchlΓΌssel des BΓΆsen#,&wird in der großen Truhe&#im Teufelsturm# zu finden sein.^", /*french*/ "$bAussi, la #clΓ© du Malin# sera encoffrΓ©e #dans sa tour#.^", {QM_PINK, QM_LBLUE})); // /*spanish*/$bY la llave del #seΓ±or del mal# aguardarΓ‘ en un gran cofre de #su torre#.^ @@ -2072,7 +2070,7 @@ void StaticData::HintTable_Init() { // /*spanish*/$bY el hΓ©roe recibirΓ‘ la llave del #seΓ±or del mal# cuando haya completado la #Trifuerza#.^ hintTextTable[RHT_GANON_BK_SKULLTULA_HINT] = HintText(CustomMessage("$bAnd the #evil one#'s key will be provided by the cursed rich man once #100 Gold Skulltula Tokens# are retrieved.^", - /*german*/ "$bUnd der #SchlΓΌssel des BΓΆsen# wird von einem verfluchten reichen Mann verliehen, sobald #100 Goldene Skulltula-Symbole# wiedererlangt wurden.^", + /*german*/ "$bUnd der #SchlΓΌssel des BΓΆsen# wird von einem verfluchten reichen Mann verliehen, sobald #100 Skulltula-Symbole# gesammelt wurden.^", /*french*/ "$bAussi, la #clΓ© du Malin# sera&donnΓ©e par l'homme maudit une fois que #100 Symboles de Skulltula d'or# auront Γ©tΓ© trouvΓ©s.^", {QM_PINK, QM_YELLOW})); // /*spanish*/$bY el rico maldito entregarΓ‘ la llave&del #seΓ±or de mal# tras obtener&100 sΓ­mbolos de skulltula dorada#.^ @@ -2102,7 +2100,7 @@ void StaticData::HintTable_Init() { // /*spanish*/$bY #Zelda# entregarΓ‘ la llave del #seΓ±or del mal# tras obtener #[[d]]# piedra| espiritual o medallΓ³n|s espirituales o medallones|#.^ hintTextTable[RHT_LACS_DUNGEONS_HINT] = HintText(CustomMessage("$bAnd the #evil one#'s key will be provided by #Zelda# once #[[d]] Dungeon|# is|s# are| conquered.^", - /*german*/ "$bUnd der #SchlΓΌssel des BΓΆsen# wird von #Zelda# verliehen, sobald #[[d]] Labyrinth|# abgeschlossen wurde|e# abgeschlossen wurden|.^", + /*german*/ "$bUnd der #SchlΓΌssel des BΓΆsen# wird von #Zelda# verliehen, sobald #[[d]] Labyrinth|# abgeschloßen wurde|e# abgeschloßen wurden|.^", /*french*/ "$bAussi, la #clΓ© du Malin# sera fournie par #Zelda# une fois qu|' #[[d]] donjon #sera conquis|e #[[d]] donjons# seront conquis|.^", {QM_PINK, QM_YELLOW, QM_PINK})); // /*spanish*/$bY #Zelda# entregarΓ‘ la llave del #seΓ±or del mal# tras completar #[[d]] mazmorra||s|#.^ @@ -2140,32 +2138,32 @@ void StaticData::HintTable_Init() { // /*spanish*/SegΓΊn dicen, #[[1]]# protege la torre de Ganon hintTextTable[RHT_LIGHT_TRIAL] = HintText(CustomMessage("the Light Trial", - /*german*/ "die PrΓΌfung des Lichts", + /*german*/ "das Licht-Siegel", /*french*/ "l'Γ©preuve de la LumiΓ¨re")); // /*spanish*/la prueba de la luz hintTextTable[RHT_FOREST_TRIAL] = HintText(CustomMessage("the Forest Trial", - /*german*/ "die PrΓΌfung des Waldes", + /*german*/ "das Wald-Siegel", /*french*/ "l'Γ©preuve de la ForΓͺt")); // /*spanish*/la prueba del bosque hintTextTable[RHT_FIRE_TRIAL] = HintText(CustomMessage("the Fire Trial", - /*german*/ "die PrΓΌfung des Feuers", + /*german*/ "das Feuer-Siegel", /*french*/ "l'Γ©preuve du Feu")); // /*spanish*/la prueba del fuego hintTextTable[RHT_WATER_TRIAL] = HintText(CustomMessage("the Water Trial", - /*german*/ "die PrΓΌfung des Wassers", + /*german*/ "das Wasser-Siegel", /*french*/ "l'Γ©preuve de l'Eau")); // /*spanish*/la prueba del agua hintTextTable[RHT_SPIRIT_TRIAL] = HintText(CustomMessage("the Spirit Trial", - /*german*/ "die PrΓΌfung der Geister", + /*german*/ "das Geister-Siegel", /*french*/ "l'Γ©preuve de l'Esprit")); // /*spanish*/la prueba del espΓ­ritu hintTextTable[RHT_SHADOW_TRIAL] = HintText(CustomMessage("the Shadow Trial", - /*german*/ "die PrΓΌfung des Schattens", + /*german*/ "das Schatten-Siegel", /*french*/ "l'Γ©preuve de l'Ombre")); // /*spanish*/la prueba de las sombras @@ -2174,7 +2172,7 @@ void StaticData::HintTable_Init() { ---------------------------*/ hintTextTable[RHT_CHILD_ALTAR_STONES] = HintText(CustomMessage("3 Spiritual Stones found in Hyrule...^$0#[[1]]#...^$1#[[2]]#...^$2#[[3]]#...^", - /*german*/ "Drei Heilige Steine, zu finden in Hyrule...$0#[[1]]#...^$1#[[2]]#...^$2#[[3]]#...^", + /*german*/ "Drei Heilige Steine, zu finden in Hyrule...^$0#[[1]]#...^$1#[[2]]#...^$2#[[3]]#...^", /*french*/ "Les trois Pierres Ancestrales cachΓ©es&dans Hyrule...$0#[[1]]#...^$1#[[2]]#...^$2#[[3]]#...^", {QM_GREEN, QM_RED, QM_BLUE}, {true, true, true})); // /*spanish*/ Tres piedras espirituales halladas por Hyrule...$0#[[1]]#...^$1#[[2]]#...^$2#[[3]]#...^ @@ -2185,18 +2183,18 @@ void StaticData::HintTable_Init() { // /*spanish*/$oPara aquel que se convierta en el hΓ©roe...&La puerta al futuro estΓ‘ a su disposiciΓ³n... hintTextTable[RHT_CHILD_ALTAR_TEXT_END_DOTSONGONLY] = HintText(CustomMessage("$cYe who may become a Hero...&Stand with the Ocarina and&play the Song of Time.", - /*german*/ "$cJener auf dem Weg des Helden...&Nehme er seine Okarina zur Hand und&spiele hier die Hymne der Zeit.", + /*german*/ "$cJener auf dem Weg des Helden...&Nehme er seine Okarina zur Hand und spiele hier die Hymne der Zeit.", /*french*/ "$cΓ€ celui qui a quΓͺte de devenir&hΓ©ros...&Portez l'Ocarina et jouez&le chant du temps.")); // /*spanish*/$cPara aquel que se convierta en el hΓ©roe...&Tome la ocarina y&entone la CanciΓ³n del Tiempo. hintTextTable[RHT_CHILD_ALTAR_TEXT_END_DOTCLOSED] = HintText(CustomMessage("$iYe who may become a Hero...&Offer the spiritual stones and&play the Song of Time.", - /*german*/ "$iJener mit den drei Heiligen Steinen&nehme seine Okarina zur Hand und&spiele hier die Hymne der Zeit.", + /*german*/ "$iJener mit den drei Heiligen Steinen nehme er seine Okarina zur Hand und spiele hier die Hymne der Zeit.", /*french*/ "$iΓ€ celui qui a quΓͺte de devenir&hΓ©ros... PrΓ©sentez les Pierres&Ancestrales et jouez&le chant du temps.")); // /*spanish*/$iPara aquel que se convierta en el hΓ©roe...&Tome las piedras espirituales y&entone la CanciΓ³n del Tiempo. hintTextTable[RHT_ADULT_ALTAR_MEDALLIONS] = HintText(CustomMessage("An awakening voice from the Sacred Realm will call those destined to be Sages, who dwell in the #five temples#.^" "$8#[[1]]#...^$3#[[2]]#...^$4#[[3]]#...^$5#[[4]]#...^$6#[[5]]#...^$7#[[6]]#...^" , - /*german*/ "Beherrscht das BΓΆse die Welt, weilen&jene Weisen, die von der Stimme des Heiligen Reiches erweckt werden, noch&in den #fΓΌnf Tempeln#.^" + /*german*/ "Beherrscht das BΓΆse die Welt, verweilen die Weisen, erweckt von der Stimme des Heiligen Reiches, noch in den #fΓΌnf Tempeln#.^" "$8#[[1]]#...^$3#[[2]]#...^$4#[[3]]#...^$5#[[4]]#...^$6#[[5]]#...^$7#[[6]]#...^", /*french*/ "Quand le mal aura triomphΓ©, une voix du Saint Royaume appellera ceux cachΓ©s dans les #cinq temples#, destinΓ©s^Γ  Γͺtre Sages.^" "$8#[[1]]#...^$3#[[2]]#...^$4#[[3]]#...^$5#[[4]]#...^$6#[[5]]#...^$7#[[6]]#...^", @@ -2205,7 +2203,7 @@ void StaticData::HintTable_Init() { // $8#[[1]]#...^$3#[[2]]#...^$4#[[3]]#...^$5#[[4]]#...^$6#[[5]]#...^$7#[[6]]#...^ hintTextTable[RHT_ADULT_ALTAR_TEXT_END] = HintText(CustomMessage("$kTogether with the Hero of Time, the awakened ones will return the light of peace to the world...", - /*german*/ "$kZusammen mit dem AuserwΓ€hlten werden diese ihre KrΓ€fte einsetzen, um der Welt den Frieden wiederzugeben.", + /*german*/ "$kZusammen mit dem AuserwΓ€hlten werden diese ihre KrΓ€fte&einsetzen, um der Welt den&Frieden wiederzugeben.", /*french*/ "$kEnsemble avec le HΓ©ros du Temps, ces Sages emprisonneront le mal et rΓ©instaureront la lumiΓ¨re de paix dans le monde...")); // /*spanish*/Con el HΓ©roe del Tiempo, aquellos&que despierten detendrΓ‘n el mal y&volverΓ‘n al mundo de luz la paz... @@ -2214,20 +2212,20 @@ void StaticData::HintTable_Init() { ---------------------------*/ hintTextTable[RHT_GANONDORF_HINT_LA_ONLY] = HintText(CustomMessage("Ha ha ha... You'll never beat me by reflecting my lightning bolts and unleashing the arrows from #[[1]]#!", - /*german*/ "Ha ha ha... Du wirst mich nie besiegen, indem du meine Blitze zurΓΌckschlΓ€gst und die Pfeile aus #[[1]]# entfesselts!", + /*german*/ "Ha ha ha... Du wirst mich niemals besiegen, indem Du meine Blitze zurΓΌckschlΓ€gst...^und die Pfeile entfesselst, die #[[1]]# zu finden sind!", /*french*/ "Ha ha ha... Pauvre fou! Tu ne pourras jamais me vaincre sans les flΓ¨ches que j'ai cachΓ©es dans #[[1]]#!", {QM_RED})); // /*spanish*/Ja, ja, ja... Nunca me derrotarΓ‘s reflejando mis esferas de energΓ­a y desplegando la flecha de luz de #[[1]]#! hintTextTable[RHT_GANONDORF_HINT_MS_ONLY] = HintText(CustomMessage("Ha ha ha... You'll never defeat me, drop a castle on me and finish me off with the sacred blade from #[[2]]#!", - /*german*/ "Ha ha ha... Du wirst mich nie besiegen, wirf ein Schloss auf mich und beende mich mit dem heiligen Schwert von #[[2]]#!", + /*german*/ "Ha ha ha... Du wirst mich niemals besiegen, ein Schloß auf mich werfen...^und mich mit der legendΓ€ren Klinge niederstrecken, die #[[2]]# versteckt ist!", /*french*/ "Ha ha ha... Pauvre fou! Tu ne pourras jamais me vaincre sans l'Γ‰pΓ©e de LΓ©gende cachΓ©e dans #[[2]]#!", {QM_RED})); hintTextTable[RHT_GANONDORF_HINT_LA_AND_MS] = HintText(CustomMessage("Ha ha ha... You'll never beat me by reflecting my lightning bolts and unleashing the arrows from #[[1]]#!" "^And even if you do, you'll never find the legendary blade hidden in #[[2]]#!", - /*german*/ "Ha ha ha... Du wirst mich nie besiegen, indem du meine Blitze zurΓΌckschlΓ€gst und die Pfeile aus #[[1]]# entfesselts!" - "^Und selbst wenn du es tust, wirst du nie das legendΓ€re Schwert finden, das in #[[2]]# versteckt ist!", + /*german*/ "Ha ha ha... Du wirst mich niemals besiegen, indem Du meine Blitze zurΓΌckschlΓ€gst...^und die Pfeile entfesselst, die #[[1]]# zu finden sind!" + "^Und selbst wenn Du es tust,&wirst Du niemals die legendΓ€re&Klinge finden, die #[[2]]# versteckt ist!", /*french*/ "Ha ha ha... Pauvre fou! Tu ne pourras jamais me vaincre sans les flΓ¨ches que j'ai cachΓ©es dans #[[1]]#!" "^Et mΓͺme si tu les trouves, tu ne touveras jamais l'Γ‰pΓ©e de LΓ©gende cachΓ©e dans #[[2]]#!", {QM_RED, QM_RED})); @@ -2235,38 +2233,38 @@ void StaticData::HintTable_Init() { // ^E incluso si lo haces, nunca encontrarΓ‘s la espada legendaria escondida en #[[2]]#! hintTextTable[RHT_SHEIK_HINT_LA_ONLY] = HintText(CustomMessage("I overheard Ganondorf say that he misplaced the #Light Arrows# in #[[1]]#.", - /*german*/ "Ich habe Ganondorf sagen hΓΆren, dass er die #Lichtpfeile# in #[[1]]# verlegt hat.", + /*german*/ "Ich habe Ganondorf sagen hΓΆren, daß er die #Licht-Pfeile# #[[1]]# verlegt hat.", /*french*/ "J'ai entendu dire que Ganondorf aurait cachΓ© les #FlΓ¨ches de LumiΓ¨re# dans #[[1]]#.", {QM_YELLOW, QM_RED})); hintTextTable[RHT_DAMPE_DIARY] = HintText(CustomMessage("Whoever reads this, please enter #[[1]]#. I will let you have my #stretching, shrinking keepsake#.^I'm waiting for you.&--DampΓ©", - /*german*/ "Wer immer dies liest, der mΓΆge folgenden Ort aufsuchen: #[[1]]#. Ihm gebe ich meinen #dehnenden, schrumpfenden Schatz#.^Ich warte!&Boris", + /*german*/ "Wer immer dies liest, der mΓΆge #[[1]]# nach meinem #langen, kurzen Schatz# suchen.^Ich warte!&Boris", /*french*/ "Toi qui lit ce journal, rends-toi dans #[[1]]#. Et peut-Γͺtre auras-tu droit Γ  mon prΓ©cieux #trΓ©sor#.^Je t'attends...&--Igor", {QM_RED, QM_RED})); hintTextTable[RHT_GREG_HINT] = HintText(CustomMessage("By the way, if you're interested, I saw the shiniest #Green Rupee# somewhere in #[[1]]#.^It's said to have #mysterious powers#...^But then, it could just be another regular rupee.&Oh well.", - /*german*/ "Übrigens, falls es dich interessiert, ich habe irgendwo in #[[1]]# den glΓ€nzendsten #GrΓΌnen Rubinen# gesehen.^Es soll #mysteriΓΆse KrΓ€fte# haben...^Aber na ja, es kΓΆnnte auch einfach nur ein normaler Rubin sein. Tja", + /*german*/ "Übrigens, falls es Dich interessiert, ich habe #[[1]]# den glΓ€nzendsten #GrΓΌnen Rubin# gesehen.^Er soll #mysteriΓΆse KrΓ€fte# haben...^Aber naja, es kΓΆnnte auch einfach nur ein normaler Rubin sein.", /*french*/ "Au fait, si Γ§a t'intΓ©resse, j'ai aperΓ§u le plus Γ©clatant des #Rubis Verts# quelque part Γ  #[[1]]#.^On dit qu'il possΓ¨de des #pouvoirs mystΓ©rieux#...^Mais bon, Γ§a pourrait juste Γͺtre un autre rubis ordinaire.", {QM_GREEN, QM_RED, QM_RED})); hintTextTable[RHT_SARIA_TALK_HINT] = HintText(CustomMessage("Did you feel the #surge of magic# recently? A mysterious bird told me it came from #[[1]]#.^You should check that place out, @!", - /*german*/ "Hast du kΓΌrzlich den #Magieschub# gespΓΌrt? Ein geheimnisvoller Vogel hat mir erzΓ€hlt, dass er aus #[[1]]# kam.^Du solltest dir diesen Ort mal ansehen, @!", + /*german*/ "Hast Du kΓΌrzlich den #Magieschub# gespΓΌrt? Ein geheimnisvoller Vogel meinte, daß er #[[1]]# am stΓ€rksten zu spΓΌren war.^Du solltest Dir diesen Ort mal ansehen, @!", /*french*/ "As-tu rΓ©cemment ressenti une vague de #puissance magique#? Un mystΓ©rieux hibou m'a dit qu'elle provenait du #[[1]]#.^Tu devrais aller y jeter un coup d'oeil, @!", {QM_GREEN, QM_RED})); hintTextTable[RHT_SARIA_SONG_HINT] = HintText(CustomMessage("Did you feel the #surge of magic# recently? A mysterious bird told me it came from #[[1]]#.^You should check that place out, @!\x0B", - /*german*/ "Hast du kΓΌrzlich den #Magieschub# gespΓΌrt? Ein geheimnisvoller Vogel hat mir erzΓ€hlt, dass er aus #[[1]]# kam.^Du solltest dir diesen Ort mal ansehen, @!\x0B", + /*german*/ "Hast Du kΓΌrzlich den #Magieschub# gespΓΌrt? Ein geheimnisvoller Vogel meinte, daß er #[[1]]# am stΓ€rksten zu spΓΌren war.^Du solltest Dir diesen Ort mal ansehen, @!\x0B", /*french*/ "As-tu rΓ©cemment ressenti une vague de #puissance magique#? Un mystΓ©rieux hibou m'a dit qu'elle provenait du #[[1]]#.^Tu devrais aller y jeter un coup d'oeil, @!\x0B", {QM_GREEN, QM_RED}, {}, TEXTBOX_TYPE_BLUE)); hintTextTable[RHT_LOACH_HINT] = HintText(CustomMessage("What?^You wanna know about the&%rHyrule Loach%w?^It's a big fish, but it's so rare that I'll give my %g[[1]]%w to anyone who catches it. Seriously!", - /*german*/ "Was?^Du willst was ΓΌber den&%rHyrule-Schleicher%w wissen?^Das ist ein riesiger Fisch, aber&so selten, dass ich jedem mein&%g[[1]]%w gebe, der ihn fΓ€ngt.&Im Ernst." + /*german*/ "Was?^Du willst etwas ΓΌber die&%rhylianische Forelle%w wissen?&Es ist ein riesiger Fisch,&der unfassbar selten ist!^Wenn Du mir eine bringst, |springt|springen| fΓΌr Dich&%g[[1]]%w dabei raus.&Ganz im Ernst!", /*french*/ "Quoi?&Tu veux en savoir plus sur le&%rBrochet d'Hyrule%w?^C'est un gros poisson, mais il&est si rare que je donne&%g[[1]]%w&Γ  celui qui l'attrape.^Ouais, j'suis sΓ©rieux!", {QM_RED})); hintTextTable[RHT_FISHING_POLE_HINT] = HintText(CustomMessage("^If I remember correctly, I lost it somewhere in #[[1]]#...&Let me know if you find it!", - /*german*/ "Wenn ich mich recht erinnere,&hab ich es irgendwo in #[[1]]#&verloren...&Sag mir Bescheid, wenn du es findest." - /*french*/ "Si je me souviens bien, il me&semble que je l'ai perdue&quelque part dans&#[[1]]#...^Fais-moi signe si jamais&tu la trouves!", + /*german*/ "Wenn ich mich recht erinnere,&habe ich sie irgendwo&#[[1]]#&verloren...&Sag mir Bescheid, wenn Du sie findest!", + /*french*/ "Si je me souviens bien, il me&semble que je l'ai perdue&quelque part dans&#[[1]]#...^Fais-moi signe si jamais&tu la trouves!", {QM_RED})); /*-------------------------- @@ -2274,91 +2272,89 @@ void StaticData::HintTable_Init() { ---------------------------*/ hintTextTable[RHT_WARP_SONG] = HintText(CustomMessage("Warp to&#[[1]]#?&" + TWO_WAY_CHOICE() + "#OK&No#", - /*german*/ "Zu&#[[1]]#?&" + TWO_WAY_CHOICE() + "#OK&No#", + /*german*/ "Das Ziel liegt&#[[1]]#!&" + TWO_WAY_CHOICE() + "#Ja!&Nein!#", /*french*/ "Se tΓ©lΓ©porter vers&#[[1]]#?&" + TWO_WAY_CHOICE() + "#OK!&Non#", {QM_RED, QM_GREEN})); - /*-------------------------- - | STATIC LOCATION HINTS | - ---------------------------*/ - /*-------------------------- | STATIC LOCATION HINTS | ---------------------------*/ hintTextTable[RHT_HBA_HINT_SIGN] = HintText(CustomMessage("#Horseback Archery# Range Prizes:&1000: #[[1]]#&1500: #[[2]]#^@'s Record: #" + CustomMessage::POINTS(HS_HORSE_ARCHERY) + "#", - /*german*/ "#Bogenschießen zu Pferde#&Schießstandpreise:&1000: #[[1]]#&1500: #[[2]]#^@'s Record: #" + CustomMessage::POINTS(HS_HORSE_ARCHERY) + "#", + /*german*/ "#Bogenschießen zu Pferde#&Schießstandpreise:&1000: #[[1]]#^1500: #[[2]]#^@'s Rekord: #" + CustomMessage::POINTS(HS_HORSE_ARCHERY) + "#", /*french*/ "RΓ©compenses de l'#Archerie MontΓ©e#:&1000: #[[1]]#&1500: #[[2]]#^Record de @: #" + CustomMessage::POINTS(HS_HORSE_ARCHERY) + "#", {QM_RED, QM_GREEN, QM_GREEN, QM_GREEN}, {}, TEXTBOX_TYPE_WOODEN)); hintTextTable[RHT_HBA_HINT_NOT_ON_HORSE] = HintText(CustomMessage("Hey, rookie!&Come back on your #horse# and take on the #Horseback Archery# challenge!^" "Impress me with a high score of 1000 to win a #[[1]]# or score 1500 for #[[2]]#!", - /*german*/ "Hey, Neuling!&Komm mit deinem #Pferd# zurΓΌck und stell dich der #Pferdebogenschießen#-Herausforderung!^" - "Beeindruck mich mit 1000 Punkten und gewinne #[[1]]#! Oder hol dir 1500 Punkte fΓΌr #[[2]]#!", + /*german*/ "Hey, Kleiner! Das ist die %rArena fΓΌr Bogenschießen zu Pferde%w.^" + "Wenn Du reiten kannst, beeindrucke mich mit #1.000 Punkten# und gewinne #[[1]]#!^Knackst Du #1.500 Punkte# gibt es #[[2]]#!", /*french*/ "HΓ©, l'nouveau!&Reviens avec ton #cheval# et essaie notre #Terrain d'Archerie MontΓ©e#^" "Impressionne-moi avec un score de 1000 pour gagner #[[1]]# ou atteins 1500 pour #[[2]]#!", {QM_RED, QM_RED, QM_GREEN, QM_GREEN})); hintTextTable[RHT_HBA_HINT_INITIAL] = HintText(CustomMessage("Hey, rookie!&Want to take on the #Horseback Archery# challenge?^" "Impress me with a high score of 1000 to win a #[[1]]# or score 1500 for #[[2]]#!\x0B", - /*german*/ "Hey, Neuling!&Willst du dich der #Pferdebogenschießen#-Herausforderung stellen?^" - "Zeig, was du drauf hast - hol 1000 Punkte fΓΌr #[[1]]#! Oder knack die 1500 und kassier #[[2]]#!\x0B", + /*german*/ "Hey, Kleiner! Wie wΓ€re es mit einer Runde %rBogenschießen zu Pferde%w!?^" + "Wenn Du mich mit #1.000 Punkten# beeindruckst, erhΓ€ltst Du #[[1]]#!^Knackst Du #1.500 Punkte# gibt es #[[2]]#!\x0B", /*french*/ "HΓ©, l'nouveau!&Tu veux essayer notre #Terrain d'Archerie MontΓ©e#^" "Impressionne-moi avec un score de 1000 pour gagner #[[1]]# ou atteins 1500 pour #[[2]]#!\x0B", {QM_RED, QM_GREEN, QM_GREEN})); hintTextTable[RHT_HBA_HINT_HAVE_1000] = HintText(CustomMessage("Hey, newcomer!&Want to take on the #Horseback Archery# challenge?^" "Prove yourself to be a horsemaster by scoring 1500 points to win #[[2]]#!\x0B", - /*german*/ "Hey, Neuling!&Willst du dich der #Pferdebogenschießen#-Herausforderung stellen?^" - "Beweise dein KΓΆnnen als Reitmeister - hol 1500 Punkte und gewinne #[[2]]#!\x0B", + /*german*/ "Hey, Kleiner! Wie wΓ€re es mit einer Runde %rBogenschießen zu Pferde%w!?^" + "Versuche doch jetzt, #1.500 Punkte# zu erreichen fΓΌr #[[2]]#!\x0B", /*french*/ "HΓ©, l'nouveau!&Tu veux essayer notre #Terrain d'Archerie MontΓ©e#^" "Prouve que tu es un vΓ©ritable cavalier en obtenant 1500 points pour gagner #[[2]]#!\x0B", {QM_RED, QM_GREEN})); hintTextTable[RHT_MALON_HINT_HOW_IS_EPONA] = HintText(CustomMessage("@! You should come back with Epona and try to beat my time on the #Obstacle Course#!^" "If you beat my time, I'll give you my favourite #cow# Elsie and her toy #[[1]]#!", - /*german*/ "@! Du solltest mit Epona zurΓΌckkommen und versuchen, meine Zeit im #Hindernisparcours# zu schlagen!^" - "Wenn du meine Zeit schlΓ€gst, gebe ich dir meine #Lieblingskuh# Elsie und ihr Spielzeug #[[1]]#!", + /*german*/ "@! Warum kommst Du nicht mit Epona zurΓΌck und versuchst Dich an dem #Hindernisparcours#?^" + "Gelingt es Dir den Rekord zu brechen, bekommst Du meine #Lieblingskuh# Elsie^und ihr Lieblingsspielzeug, #[[1]]#!", /*french*/ "@! Tu devrais revenir avec Epona et essayer de battre mon temps sur le #Parcours d'Obstacles#!^" "Si tu bats mon temps, je te donnerai ma vache prΓ©fΓ©rΓ©e, Elsie, ainsi que son jouet #[[1]]#!", {QM_RED, QM_BLUE, QM_GREEN})); hintTextTable[RHT_MALON_HINT_OBSTICLE_COURSE] = HintText(CustomMessage("How about trying the #Obstacle Course?# If you beat my time I'll let you keep my favourite #cow# Elsie and her toy #[[1]]#!^" "Challenge the #Obstacle Course?#&\x1B&#Let's go&No thanks#", - /*german*/ "Wie wΓ€rs mit dem #Hindernisparcours#? Wenn du meine Zeit schlΓ€gst, lasse ich dir meine #LieblingsKuh# Elsie und ihr Spielzeug #[[1]]#!^" - "Herausforderung: #Hindernisparcours?#&\x1B&#Los geht's!&nein, danke#", + /*german*/ "Warum versuchst Du Dich nicht mit Epona an dem #Hindernisparcours#?^" + "Gelingt es Dir den Rekord zu brechen, bekommst Du meine #Lieblingskuh# Elsie^und ihr Lieblingsspielzeug, #[[1]]#!^" + "Wie sieht's aus?&MΓΆchtest Du es versuchen?\x1B&#Ja!&Nein!#", /*french*/ "Que dirais-tu d'essayer le #Parcours d'Obstacles#? Si tu bats mon temps, je te donnerai ma vache prΓ©fΓ©rΓ©e, Elsie, et son jouet #[[1]]#!^" "Tenter le #Parcours d'Obstacles#?&\x1B&#Allons-y&Non merci#", {QM_RED, QM_BLUE, QM_GREEN, QM_RED, QM_GREEN})); hintTextTable[RHT_MALON_HINT_TURNING_EVIL] = HintText(CustomMessage("@? Is that you? ^If I ran the ranch, I'd build an #Obstacle Course#, and whoever gets the best time would win a #cow#!^" "Elsie loves sharing her #[[1]]# with new people, It'll be fun!^...But Ingo won't let me...", - /*german*/ "@? Bist du das? ^Wenn ich die Ranch leiten wΓΌrde, wΓΌrde ich einen #Hindernisparcours# bauen, und wer die beste Zeit schafft, gewinnt eine #Kuh#!^" - "Elsie liebt es, ihr #[[1]]# mit neuen Leuten zu teilen. Es wird Spaß machen^...Aber Ingo lΓ€sst mich nicht", + /*german*/ "@? Bist Du das?^Wenn ich die Farm leiten wΓΌrde, wΓΌrde ich einen #Hindernisparcours# bauen, und wer die beste Zeit schafft, gewinnt eine #Kuh#!^" + "Elsie wΓΌrde es lieben, #[[1]]# mit neuen Leuten zu teilen, es wΓΌrde Spaß machen!^...Aber Basil lÀßt mich nicht...", /*french*/ "@? C'est toi?^Si je dirigeais le ranch, je construirais un #Parcours d'Obstacles#, et celui qui obtiendrait le meilleur temps gagnerait une #vache#!^" "Elsie adore partager son #[[1]]# avec de nouvelles personnes, ce serait amusant!^... Mais Ingo ne me laisse pas faire...", {QM_RED, QM_BLUE, QM_GREEN})); hintTextTable[RHT_MALON_HINT_INGO_TEMPTED] = HintText(CustomMessage("@! You should come back in the morning and try to beat my time on the #Obstacle Course#!^" "If you beat my time, I'll give you my favourite #cow# Elsie and her toy #[[1]]#!", - /*german*/ "@! Du solltest morgens zurΓΌckkommen und versuchen, meine Zeit im #Hindernisparcours# zu schlagen!^" - "Wenn du meine Zeit schlΓ€gst, gebe ich dir meine #Lieblingskuh# Elsie und ihr Spielzeug #[[1]]#!", + /*german*/ "@! Warum kommst Du nicht morgens wieder und versuchst Dich an dem #Hindernisparcours#?^" + "Gelingt es Dir den Rekord zu brechen, bekommst Du meine #Lieblingskuh# Elsie^und ihr Lieblingsspielzeug, #[[1]]#!", /*french*/ "@! Tu devrais revenir le matin et essayer de battre mon temps sur le #Parcours d'Obstacles#!^" "Si tu bats mon temps, je te donnerai ma vache prΓ©fΓ©rΓ©e, Elsie, ainsi que son jouet #[[1]]#!", {QM_RED, QM_BLUE, QM_GREEN})); hintTextTable[RHT_CHICKENS_HINT] = HintText(CustomMessage("You! Please!&Bring my Cucco's back to my pen!&I'll give you my #[[1]]#!", - /*german*/ "Du! Bitte!&Bring meine HΓΌhner zurΓΌck in ihren&Stall! Ich gebe dir meine #[[1]]#!", + /*german*/ "Was soll ich nur tun?! Bitte!&Hilf mir, die HΓΌhner wieder einzusammeln!^Ich gebe Dir auch #[[1]]#, wenn du mir hilfst!", /*french*/ "Mes Cocottes sont perdues!&DΓ©pose toutes les cocottes dans cet enclos!&Je te donnerai #[[1]]#!", {QM_GREEN})); hintTextTable[RHT_BIG_POES_HINT] = HintText(CustomMessage("You have #\x1E\x01 Poe Points#! Reach 1000 and you'll get a #[[1]]#!", - /*german*/ "Du hast #\x1E\x01 NachtschwΓ€rmer-Punkte#! Erreiche 1000 und du bekommst ein #[[1]]#!", + /*german*/ "Du hast nun #\x1E\x01 Punkte# auf dem NachtschwΓ€rmer-Konto gut!^" + "Hast Du %y1.000 Punkte%w gesammelt dann |wartet|warten| #[[1]]# auf Dich! Hehehe...", /*french*/ "Tu as #\x1E\x01 Points d'Γ‚me#! Atteins 1000 et tu recevras #[[1]]#!", {QM_YELLOW, QM_GREEN})); hintTextTable[RHT_BIGGORON_HINT] = HintText(CustomMessage("Arrrrrre you here to claim my finest #[[1]]#? Shoooooow me your #Claim Check#.", - /*german*/ "Arrrrr, bist du hier, um mein feinsten #[[1]]# zu beanspruchen? Zeig mir deinen #Zertifikat#!", + /*german*/ "Arrrrr, bist Du hier, um etwas von mir schmieden zu lassen? Zeig mir das #Zertifikat# und #[[1]]# |gehΓΆrt|gehΓΆren| Dir!", /*french*/ "Eeeeeees-tu ici pour rΓ©claaaaaamer mon plus beau #[[1]]#? Moooooontre-moi ton #Certificat#.", {QM_GREEN, QM_RED})); @@ -2368,19 +2364,20 @@ void StaticData::HintTable_Init() { {QM_GREEN})); hintTextTable[RHT_OOT_HINT] = HintText(CustomMessage("Bring the #Spiritual Stones# to the past so you can receive #[[1]]# from Zelda and learn #[[2]]#!", - /*german*/ "Bringe die #Spirituellen Steine# in die Vergangenheit, damit du #[[1]]# von Zelda erhΓ€ltst und #[[2]]#! lernst", + /*german*/ "Bringe die #Heiligen Steine# in die Vergangenheit, damit Du #[[1]]# von...^" + "Prinzessin Zelda erhΓ€ltst und #[[2]]# lernst, um Hyrule vor dem Untergang zu bewahren!", /*french*/ "AmΓ¨ne les #Pierres Spirituelles# dans le passΓ© et Zelda te donnera #[[1]]# et t'apprendra #[[2]]# !", {QM_BLUE, QM_GREEN, QM_GREEN})); hintTextTable[RHT_SKULLS_HINT] = HintText(CustomMessage("Yeaaarrgh! I'm cursed!!^Please save me by destroying #[[d]] Spiders of the Curse# and I will give you my #[[1]]#!", - /*german*/ "Yeaaarrgh! Ich bin verflucht!^Bitte rette mich, indem Du #[[d]] Skulltulas# zerstΓΆrst und ich werde Dir dafΓΌr #[[1]]# geben!", + /*german*/ "Aarrrgh! Ich bin verflucht!^Bitte rette mich, indem Du&#[[d]] Skulltulas# zerstΓΆrst und ich&werde Dir dafΓΌr #[[1]]# geben!", /*french*/ "Yeaaarrgh! Je suis maudit!^DΓ©truit encore #[[d]] AraignΓ©es de la MalΓ©diction# et j'aurai quelque chose Γ  te donner! #([[1]])#", {QM_YELLOW, QM_GREEN})); hintTextTable[RHT_MASK_SHOP_HINT] = HintText(CustomMessage("Some young scrubs in the #Deku Theatre# love seeing Masks!^" "They'll give you #[[1]]# if you show them the #Skull Mask#, and #[[2]]# if you show them the #Mask of Truth#!", - /*german*/ "Ein paar junge GΓΆren in der #WaldbΓΌhne# lieben es, Masken zu sehen!^" - "Sie geben dir #[[1]]#, wenn du ihnen die #SchΓ€del-Maske# zeigst, und #[[2]]#, wenn du ihnen die #Maske des Wissens# zeigst!", + /*german*/ "Ein paar junge Dekus in der #WaldbΓΌhne# lieben es, Masken anzuschauen!^" + "Sie geben Dir #[[1]]#, wenn Du ihnen die #SchΓ€del-Maske# zeigst,^und #[[2]]#, wenn Du ihnen die #Maske des Wissens# zeigst!", /*french*/ "De jeunes Pestes Mojo qui se trouvent dans le #ThéÒtre Mojo# adorent voir des masques !^" "Elles te donneront #[[1]]# si tu leur montres le #Masque de Mort#, et #[[2]]# si tu leur montres le #Masque de VΓ©ritΓ©#.", {QM_GREEN, QM_GREEN, QM_RED, QM_GREEN, QM_RED})); @@ -2390,12 +2387,12 @@ void StaticData::HintTable_Init() { ---------------------------*/ hintTextTable[RHT_GANON_JOKE01] = HintText(CustomMessage("Oh! It's @.&I was expecting someone called Sheik.&Do you know what happened to them?", - /*german*/ "Oh! Da ist @.&Ich hatte eigentlich jemanden namens&Sheik erwartet. Weißt du, was mit&ihnen passiert ist?", + /*german*/ "Oh! Du bist es @.&Ich habe eigentlich jemanden namens Shiek erwartet. Weißt Du, was mit ihm passiert ist?", /*french*/ "Ah, c'est @.&J'attendais un certain Sheik.&Tu sais ce qui lui est arrivΓ©?")); // /*spanish*/Β‘Oh! Pero si es @.&Estaba esperando a alguien llamado Sheik. ΒΏSabes quΓ© puede haberle pasado? hintTextTable[RHT_GANON_JOKE02] = HintText(CustomMessage("I knew I shouldn't have put the key on the other side of my door.", - /*german*/ "Ich wusste, dass ich den SchlΓΌssel nicht auf der anderen Seite meiner TΓΌr legen sollte.", + /*german*/ "Ich wußte, ich hΓ€tte den SchlΓΌssel nicht draußen liegen lassen sollen.", /*french*/ "J'aurais dΓ» garder la clΓ© ici. HΓ©las...")); // /*spanish*/SabΓ­a que no tendrΓ­a que haber dejado la llave al otro lado de la puerta. @@ -2405,19 +2402,19 @@ void StaticData::HintTable_Init() { // /*spanish*/Parece que es hora de una pachanga de tenis. hintTextTable[RHT_GANON_JOKE04] = HintText(CustomMessage("You'll never deflect my bolts of energy with your sword, then shoot me with those Light Arrows you happen to have.", - /*german*/ "Du wirst meine Energiestrahlen nie mit deinem Schwert abwehren und mich dann mit den Lichtpfeilen beschießen, die du zufΓ€llig hast.", + /*german*/ "Du wirst mich niemals besiegen, indem Du meine Blitze zurΓΌckschlΓ€gst und mich dann mit Licht-Pfeilen beschießt!", /*french*/ "Ne perds pas ton temps Γ  frapper mes Γ©clairs d'Γ©nergie avec ton Γ©pΓ©e et me tirer avec tes flΓ¨ches de LumiΓ¨re!")); // /*spanish*/Nunca reflejarΓ‘s mis esferas de energΓ­a con tu espada, para despuΓ©s dispararme con las flechas de luz que tendrΓ‘s. hintTextTable[RHT_GANON_JOKE05] = HintText(CustomMessage("Why did I leave my trident back in the desert?", - /*german*/ "Warum habe ich meinen Dreizack wieder in der WΓΌste gelassen?", + /*german*/ "Verdammt... Warum habe ich meinen Dreizack in der WΓΌste gelassen?", /*french*/ "Sale bΓͺtise... Et j'ai oubliΓ© mon trident dans le dΓ©sert!")); // /*spanish*/Santa Hylia... ΒΏPor quΓ© me habrΓ© dejado el tridente en el desierto? hintTextTable[RHT_GANON_JOKE06] = HintText(CustomMessage("Zelda is probably going to do something stupid, like send you back to your own timeline.^So this is " "quite meaningless. Do you really want to save this moron?", - /*german*/ "Zelda wird wahrscheinlich wieder etwas Dummes tun, wie dich zurΓΌck in deine eigene Timeline schicken " - "^Das ist also ziemlich bedeutungslos. Willst du wirklich diese Idiotin retten?", + /*german*/ "Zelda wird wahrscheinlich wieder etwas Dummes tun, wie Dich in Deine eigene Zeit zurΓΌck zu schicken." + "^Ziemlich sinnlos wenn Du mich fragst. Willst Du diesen Schwachkopf wirklich retten?", /*french*/ "MΓͺme si je suis vaincu... Zelda te renverra dans ton Γ¨re, et je reviendrai conquΓ©rir!^Telle est la " "prophΓ©cie d'Hyrule Historia!")); // /*spanish*/Seguro que Zelda trata de hacer alguna tonterΓ­a, como enviarte de vuelta a tu lΓ­nea temporal.^No tiene @@ -2425,31 +2422,31 @@ void StaticData::HintTable_Init() { hintTextTable[RHT_GANON_JOKE07] = HintText(CustomMessage("What about Zelda makes you think&she'd be a better ruler than I?^I saved Lon Lon Ranch,&fed the " "hungry,&and my castle floats.", - /*german*/ "Was an Zelda lΓ€sst dich glauben&sie wΓ€re eine bessere&Herrscherin als ich?^Ich rettete die Lon Lon Ranch,&fΓΌtterte die Hungrigen" - "&und mein Schloss schwebt.", + /*german*/ "Was an Zelda lΓ€sst Dich glauben, sie wΓ€re eine bessere Herrscherin als ich?^" + "^Ich habe die Lon Lon-Farm gerettet, den Hungrigen etwas zu Essen gegeben, und mein Schloß schwebt!", /*french*/ "Zelda ne sera jamais un meilleur monarque que moi!^J'ai un chΓ’teau volant, mes sujets sont des belles " "amazones... et mes Moblins sont clairement plus puissants que jamais!")); // /*spanish*/ΒΏQuΓ© te hace pensar que Zelda gobierna mejor que yo?^Yo he salvado el Rancho Lon Lon,&he alimentado a // los hambrientos&y hasta hago que mi castillo flote. hintTextTable[RHT_GANON_JOKE08] = HintText(CustomMessage("I've learned this spell,&it's really neat,&I'll keep it later&for your treat!", - /*german*/ "Ich hab' diesen Zauber gelernt,&er ist wirklich ziemlich fein,&ich heb' ihn auf fΓΌr spΓ€ter,&und dann soll er dein Geschenk sein!", + /*german*/ "Zelda weint, das arme Kind, ihr Retter lΓ€uft herum wie blind!", /*french*/ "Gamin, ton destin achΓ¨ve,&sous mon sort tu pΓ©riras!&Cette partie ne fut pas brΓ¨ve,&et cette mort, tu subiras!")); // /*spanish*/Veamos ahora que harΓ‘s,&la batalla ha de comenzar,&te enviarΓ© de una vez al mΓ‘s allΓ‘,&ΒΏlisto para // afrontar la verdad? hintTextTable[RHT_GANON_JOKE09] = HintText(CustomMessage("Many tricks are up my sleeve,&to save yourself&you'd better leave!", - /*german*/ "Viele Tricks hab' ich im GepΓ€ck,&und um dich zu retten,&solltest du lieber weg.", + /*german*/ "Da hilft kein Flehen und kein Flennen, bald wird dieses Weltlein brennen!", /*french*/ "Sale petit garnement,&tu fais erreur!&C'est maintenant que marque&ta derniΓ¨re heure!")); // /*spanish*/ΒΏNo osarΓ‘s a mΓ­ enfrentarte?&Rimas aparte,&Β‘voy a matarte! hintTextTable[RHT_GANON_JOKE10] = HintText(CustomMessage("After what you did to Koholint Island, how can you call me the bad guy?", - /*german*/ "Nach dem, was du auf Insel Cocolint getan hast, wie kannst du mich da den BΓΆsewicht nennen?", + /*german*/ "Nach allem was Du auf Kokolint angerichtet hast, wie kannst Du mich den BΓΆsewicht nennen?", /*french*/ "J'admire ce que tu as fait Γ  l'Île Koholint... Toi et moi, nous devrions faire Γ©quipe!")); // /*spanish*/DespuΓ©s de lo que le hiciste a la Isla Koholint, ΒΏcΓ³mo te atreves a llamarme malvado? hintTextTable[RHT_GANON_JOKE11] = HintText(CustomMessage("Today, let's begin down&'The Hero is Defeated' timeline.", - /*german*/ "Heute beginnen wir in der&β€šDer Held ist besiegtβ€˜-Timeline", + /*german*/ "Heute beginnen wir die&'Der Held wurde besiegt'-Zeitlinie.", /*french*/ "Si tu me vaincs, Hyrule sera englouti... mais si tu meurs, on aura A Link to the Past, le meilleur opus " "de la sΓ©rie!")); // /*spanish*/Hoy daremos lugar a la lΓ­nea temporal del HΓ©roe Derrotado.&Β‘PrepΓ‘rate para el culmen de esta saga! @@ -2459,20 +2456,20 @@ void StaticData::HintTable_Init() { ---------------------------*/ hintTextTable[RHT_YOUR_POCKET] = HintText(CustomMessage("your pocket", - /*german*/ "deine Tasche", + /*german*/ "in deiner Tasche", /*french*/ "tes poches")); // /*spanish*/tu bolsillo hintTextTable[RHT_ISOLATED_PLACE] = HintText(CustomMessage("an Isolated Place", - /*german*/ "ein abgelegener Ort", + /*german*/ "an einem abgelegenen Ort", /*french*/ "un lieu isolΓ©")); hintTextTable[RHT_DUNGEON_ORDINARY] = HintText(CustomMessage("&It's %gordinary%w.", - /*german*/ "&Sieht aus %gwie immer%w.", + /*german*/ "&Man kann darauf die Worte&%gOcarina of Time%w entziffern...", /*french*/ "&Elle vous semble %gordinaire%w.")); hintTextTable[RHT_DUNGEON_MASTERFUL] = HintText(CustomMessage("&It's %rmasterful%w!", - /*german*/ "&Man kann darauf die Worte %r\"Master_Quest\"%w entziffern...", + /*german*/ "&Man kann darauf die Worte&%rMaster Quest%w entziffern...", /*french*/ "&Γ‰trange... les mots %r\"Master_Quest\"%w sont gravΓ©s dessus.")); // clang-format on diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp index 066bde6e9..aa375716f 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp @@ -10,62 +10,62 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { | DEKU TREE | ---------------------------*/ hintTextTable[RHT_DEKU_TREE_MAP_CHEST] = HintText(CustomMessage("They say that in the #center of the Deku Tree# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß im #Zentrum des Deku-Baums# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß im #Zentrum des Deku-Baumes# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, #le centre de l'Arbre Mojo# recΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, al #centro del Gran Árbol Deku# yace #[[1]]#. hintTextTable[RHT_DEKU_TREE_SLINGSHOT_CHEST] = HintText(CustomMessage("They say that the #treasure guarded by a scrub# in the Deku Tree is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #von einem Deku bewachter Schatz# im Deku-Baum #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß ein #von einem Deku bewachter Schatz# im Deku-Baum #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #trΓ©sor protΓ©gΓ© par une peste# dans l'Arbre Mojo est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #deku del Gran Árbol Deku# esconde #[[1]]#. hintTextTable[RHT_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST] = HintText(CustomMessage("They say that the #treasure guarded by a scrub# in the Deku Tree is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #von einem Deku bewachter Schatz# im Deku-Baum #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß ein #von einem Deku bewachter Schatz# im Deku-Baum #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #trΓ©sor protΓ©gΓ© par une peste# dans l'Arbre Mojo est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #deku del Gran Árbol Deku# esconde #[[1]]#. hintTextTable[RHT_DEKU_TREE_COMPASS_CHEST] = HintText(CustomMessage("They say that #pillars of wood# in the Deku Tree lead to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #SΓ€ulen aus Holz# im Deku-Baum zu #[[1]]# fΓΌhren wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß die #SΓ€ulen aus Holz# im Deku-Baum #[[1]]# versperren wΓΌrden.", /*french*/ "Selon moi, les #piliers de bois# dans l'Arbre Mojo indiquent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, los #salientes del Gran Árbol Deku# conducen a #[[1]]#. hintTextTable[RHT_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST] = HintText(CustomMessage("They say that #pillars of wood# in the Deku Tree lead to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #SΓ€ulen aus Holz# im Deku-Baum zu #[[1]]# fΓΌhren wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß die #SΓ€ulen aus Holz# im Deku-Baum #[[1]]# versperren wΓΌrden.", /*french*/ "Selon moi, les #piliers de bois# dans l'Arbre Mojo indiquent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, los #salientes del Gran Árbol Deku# conducen a #[[1]]#. hintTextTable[RHT_DEKU_TREE_BASEMENT_CHEST] = HintText(CustomMessage("They say that #webs in the Deku Tree# hide #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Spinnweben im Deku-Baum# #[[1]]# verbergen wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #Weben im Deku-Baum# #[[1]]# verbergen wΓΌrden.", /*french*/ "Selon moi, les #toiles dans l'Arbre Mojo# cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, entre #telaraΓ±as del Gran Árbol Deku# yace #[[1]]#. hintTextTable[RHT_DEKU_TREE_MQ_MAP_CHEST] = HintText(CustomMessage("They say that in the #center of the Deku Tree# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß im #Zentrum des Deku-Baums# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß im #Zentrum des Deku-Baumes# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, #le centre de l'Arbre Mojo# recΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, al #centro del Gran Árbol Deku# yace #[[1]]#. hintTextTable[RHT_DEKU_TREE_MQ_COMPASS_CHEST] = HintText(CustomMessage("They say that a #treasure guarded by a large spider# in the Deku Tree is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #von einer großen Spinne bewachter Schatz# im Deku-Baum #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß ein #von einer großen Spinne bewachter Schatz#, im Deku-Baum, #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #trΓ©sor protΓ©gΓ© par une grosse araignΓ©e# dans l'Arbre Mojo est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #gran araΓ±a del Gran Árbol Deku# esconde #[[1]]#. hintTextTable[RHT_DEKU_TREE_MQ_SLINGSHOT_CHEST] = HintText(CustomMessage("They say that #pillars of wood# in the Deku Tree lead to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #SΓ€ulen aus Holz# im Deku-Baum zu #[[1]]# fΓΌhren wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß die #SΓ€ulen aus Holz# im Deku-Baum #[[1]]# versperren wΓΌrden.", /*french*/ "Selon moi, les #piliers de bois# dans l'Arbre Mojo indiquent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, los #salientes del Gran Árbol Deku# conducen a #[[1]]#. hintTextTable[RHT_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST] = HintText(CustomMessage("They say that #pillars of wood# in the Deku Tree lead to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #SΓ€ulen aus Holz# im Deku-Baum zu #[[1]]# fΓΌhren wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß die #SΓ€ulen aus Holz# im Deku-Baum #[[1]]# versperren wΓΌrden.", /*french*/ "Selon moi, les #piliers de bois# dans l'Arbre Mojo indiquent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, los #salientes del Gran Árbol Deku# conducen a #[[1]]#. hintTextTable[RHT_DEKU_TREE_MQ_BASEMENT_CHEST] = HintText(CustomMessage("They say that #webs in the Deku Tree# hide #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Spinnweben im Deku-Baum# #[[1]]# verbergen wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #Weben im Deku-Baum# #[[1]]# verbergen wΓΌrden.", /*french*/ "Selon moi, les #toiles dans l'Arbre Mojo# cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, entre #telaraΓ±as del Gran Árbol Deku# yace #[[1]]#. hintTextTable[RHT_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST] = HintText(CustomMessage("They say that #magical fire in the Deku Tree# leads to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #magisches Feuer im Deku-Baum# zu #[[1]]# fΓΌhre.", + /*german*/ "Man erzΓ€hlt sich, daß #magisches Feuer im Deku-Baum# #[[1]]# blockiere.", /*french*/ "Selon moi, le #feu magique dans l'Arbre Mojo# Γ©claire #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #fuego mΓ‘gico en el Gran Árbol Deku# conduce a #[[1]]#. @@ -75,47 +75,47 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, la #Reina Goma# porta #[[1]]#. {}, { CustomMessage("They say that the #Parasitic Armored Arachnid# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #gepanzerte parasitΓ€re Spinne# #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß der #gepanzerte Spinnenparasit# #[[1]]# besÀße.", /*french*/ "Selon moi, le #monstre insectoΓ―de gΓ©ant# possΓ¨de #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ SegΓΊn dicen, el #arΓ‘cnido parasitario acorazado# porta #[[1]]#. hintTextTable[RHT_DEKU_TREE_GS_BASEMENT_BACK_ROOM] = HintText(CustomMessage("They say that a #spider deep within the Deku Tree# hides #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne tief innerhalb des Deku-Baums# #[[1]]# verstecke.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne tief im Inneren des Deku-Baumes# #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula au centre de l'Arbre Mojo# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula en las profundidades del Árbol Deku# otorga #[[1]]#. hintTextTable[RHT_DEKU_TREE_GS_BASEMENT_GATE] = HintText(CustomMessage("They say that a #web protects a spider# within the Deku Tree holding #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #von einer Webe geschΓΌtzte Spinne# innerhalb des Deku-Baums #[[1]]# hielte.", + /*german*/ "Man erzΓ€hlt sich, daß eine #von Weben geschΓΌtzte Spinne# innerhalb des Deku-Baumes #[[1]]# hielte.", /*french*/ "Selon moi, une #Skulltula derriΓ¨re une toile dans l'Arbre Mojo# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula protegida por su tela# del Árbol Deku otorga #[[1]]#. hintTextTable[RHT_DEKU_TREE_GS_BASEMENT_VINES] = HintText(CustomMessage("They say that a #web protects a spider# within the Deku Tree holding #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #von einer Webe geschΓΌtzte Spinne# innerhalb des Deku-Baums #[[1]]# hielte.", + /*german*/ "Man erzΓ€hlt sich, daß eine #von Weben geschΓΌtzte Spinne# innerhalb des Deku-Baumes #[[1]]# hielte.", /*french*/ "Selon moi, une #Skulltula derriΓ¨re une toile dans l'Arbre Mojo# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula protegida por su tela# del Árbol Deku otorga #[[1]]#. hintTextTable[RHT_DEKU_TREE_GS_COMPASS_ROOM] = HintText(CustomMessage("They say that a #spider atop the Deku Tree# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne auf der Spitze des Deku-Baums# #[[1]]# hielte.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne an der Spitze des Deku-Baumes# #[[1]]# hielte.", /*french*/ "Selon moi, une #Skulltula au sommet de l'Arbre Mojo# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula en lo alto del Árbol Deku# otorga #[[1]]#. hintTextTable[RHT_DEKU_TREE_MQ_GS_LOBBY] = HintText(CustomMessage("They say that a #spider in a crate# within the Deku Tree hides #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne in einer Kiste# innerhalb des Deku-Baums #[[1]]# verstecke.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne in einer Kiste# innerhalb des Deku-Baumes #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula dans une boΓte dans l'Arbre Mojo# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula bajo una caja# del Árbol Deku otorga #[[1]]#. hintTextTable[RHT_DEKU_TREE_MQ_GS_PAST_BOULDER_VINES] = HintText(CustomMessage("They say that a #wall of rock protects a spider# within the Deku Tree holding #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #von einer Steinwand geschΓΌtzte Spinne# innerhalb des Deku-Baums #[[1]]# hielte.", + /*german*/ "Man erzΓ€hlt sich, daß eine #von einer Steinwand geschΓΌtzte Spinne# innerhalb des Deku-Baumes #[[1]]# hielte.", /*french*/ "Selon moi, une #Skulltula derriΓ¨re des rochers dans l'Arbre Mojo# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula protegida por una pared rocosa# del Árbol Deku otorga #[[1]]#. hintTextTable[RHT_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM] = HintText(CustomMessage("They say that a #spider deep within the Deku Tree# hides #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne tief innerhalb des Deku-Baums# #[[1]]# verstecke.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne tief im Inneren des Deku-Baumes# #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula au centre de l'Arbre Mojo# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula en las profundidades del Árbol Deku# otorga #[[1]]#. hintTextTable[RHT_DEKU_TREE_MQ_DEKU_SCRUB] = HintText(CustomMessage("They say that a #scrub in the Deku Tree# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku im Deku-Baum# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler im Deku-Baum# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #peste Mojo dans l'Arbre Mojo# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #deku del Gran Árbol Deku# vende #[[1]]#. @@ -135,7 +135,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { | DODONGOS CAVERN | ---------------------------*/ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("They say that #above King Dodongo# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #auf KΓΆnig Dodongo# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß #ΓΌberhalb von KΓΆnig Dodongo# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, #par dessus le Roi Dodongo# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #sobre el Rey Dodongo# yace #[[1]]#. @@ -150,17 +150,17 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, una #estatua de la Cueva de los Dodongos# esconde #[[1]]#. hintTextTable[RHT_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST] = HintText(CustomMessage("They say that above a #maze of stone# in Dodongo's Cavern lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf einem #Labyrinth aus Stein# in Dodongos HΓΆhle #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß ΓΌberhalb eines #Labyrinths aus Stein# in Dodongos HΓΆhle #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, sur #un labyrinthe de pierre# dans la Caverne Dodongo gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, entre un #laberinto de piedra# en la Cueva de los Dodongos yace #[[1]]#. hintTextTable[RHT_DODONGOS_CAVERN_BOMB_BAG_CHEST] = HintText(CustomMessage("They say that the #second lizard cavern battle# yields #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #zweite Reptilienkampf der HΓΆhle# #[[1]]# brΓ€chte.", + /*german*/ "Man erzΓ€hlt sich, daß der #zweite Reptilienkampf der Kaverne# #[[1]]# einbrΓ€chte.", /*french*/ "Selon moi, le #deuxiΓ¨me duel de lΓ©zards de caverne# octroie #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #luchar dos veces contra reptiles en una cueva# conduce a #[[1]]#. hintTextTable[RHT_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST] = HintText(CustomMessage("They say that a #chest at the end of a bridge# yields #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Truhe am Ende der BrΓΌcke# #[[1]]# brΓ€chte.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Truhe am Ende einer BrΓΌcke# #[[1]]# einbrΓ€chte.", /*french*/ "Selon moi, le #trΓ©sor Γ  l'extrΓ©mitΓ© d'un pont# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #cofre al final de un quebrado puente# contiene #[[1]]#. @@ -185,12 +185,12 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, unas #pequeΓ±as larvas# en la Cueva de los Dodongos esconden #[[1]]#. hintTextTable[RHT_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST] = HintText(CustomMessage("They say that above a #maze of stone# in Dodongo's Cavern lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf einem #Labyrinth aus Stein# in Dodongos HΓΆhle #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß ΓΌberhalb eines #Labyrinths aus Stein# in Dodongos HΓΆhle #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, sur #un labyrinthe de pierre# dans la Caverne Dodongo gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, sobre un #laberinto de piedra# en la Cueva de los Dodongos yace #[[1]]#. hintTextTable[RHT_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST] = HintText(CustomMessage("They say that #beneath a headstone# in Dodongo's Cavern lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #unterhalb eines Grabsteins# in Dodongos HΓΆhle #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß #unterhalb eines Grabsteins# in Dodongos HΓΆhle #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, #sous une pierre tombale# dans la Caverne Dodongo gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #bajo una lΓ‘pida# en la Cueva de los Dodongos yace #[[1]]#. @@ -200,7 +200,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, el #Rey Dodongo# porta #[[1]]#. {}, { CustomMessage("They say that the #Infernal Dinosaur# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #infernalische Dinosaurier# #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß der #Infernosaurus# #[[1]]# besÀße.", /*french*/ "Selon moi, le #dinosaure infernal# possΓ¨de #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ SegΓΊn dicen, el #dinosaurio infernal# porta #[[1]]#. @@ -250,47 +250,47 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, una #Skulltula entre lΓ‘pidas# en la Cueva de los Dodongos otorga #[[1]]#. hintTextTable[RHT_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT] = HintText(CustomMessage("They say that a pair of #scrubs in Dodongo's Cavern# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Paar in Dodongos HΓΆhle# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler Paar in Dodongos HΓΆhle# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo dans la Caverne Dodongo# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #par de dekus en la Cueva de los Dodongos# venden #[[1]]#. hintTextTable[RHT_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS] = HintText(CustomMessage("They say that a #scrub guarded by Lizalfos# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #von Lizalfos bewachter Deku# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #von Lizalfos bewachter Deku-HΓ€ndler# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #peste Mojo au coeur de la Caverne Dodongo# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #deku custodiado por Lizalfos# vende #[[1]]#. hintTextTable[RHT_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT] = HintText(CustomMessage("They say that a pair of #scrubs in Dodongo's Cavern# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Paar in Dodongos HΓΆhle# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler Paar in Dodongos HΓΆhle# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo dans la Caverne Dodongo# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #par de dekus en la Cueva de los Dodongos# venden #[[1]]#. hintTextTable[RHT_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY] = HintText(CustomMessage("They say that a #scrub in Dodongo's Cavern# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku in Dodongos HΓΆhle# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler in Dodongos HΓΆhle# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #peste Mojo dans l'entrΓ©e de la Caverne Dodongo# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #deku en la Cueva de los Dodongos# vende #[[1]]#. hintTextTable[RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR] = HintText(CustomMessage("They say that a pair of #scrubs in Dodongo's Cavern# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Paar in Dodongos HΓΆhle# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler Paar in Dodongos HΓΆhle# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo dans l'entrΓ©e de la Caverne Dodongo# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #par de dekus en la Cueva de los Dodongos# venden #[[1]]#. hintTextTable[RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT] = HintText(CustomMessage("They say that a pair of #scrubs in Dodongo's Cavern# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Paar in Dodongos HΓΆhle# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler Paar in Dodongos HΓΆhle# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo dans l'entrΓ©e de la Caverne Dodongo# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #par de dekus en la Cueva de los Dodongos# venden #[[1]]#. hintTextTable[RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE] = HintText(CustomMessage("They say that a #scrub in Dodongo's Cavern# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Paar in Dodongos HΓΆhle# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler Paar in Dodongos HΓΆhle# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #peste Mojo au sommet des escaliers dans la Caverne Dodongo# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #deku en la Cueva de los Dodongos# vende #[[1]]#. hintTextTable[RHT_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS] = HintText(CustomMessage("They say that a #scrub guarded by Lizalfos# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #von Lizalfos bewachter Deku# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #von Lizalfos bewachter Deku-HΓ€ndler# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #peste Mojo au coeur de la Caverne Dodongo# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #deku custodiado por Lizalfos# vende #[[1]]#. hintTextTable[RHT_POT_DODONGOS_CAVERN] = HintText(CustomMessage("They say that a #pot in Dodongo's Cavern# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Vase in Dodongos HΓΆhle# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Krug in Dodongos HΓΆhle# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la Caverne Dodongo# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DODONGOS_CAVERN_HEART] = HintText(CustomMessage("They say that a #heart in Dodongo's Cavern# hides #[[1]]#.", @@ -298,11 +298,11 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*french*/ "Selon moi, un #coeur# dans la Caverne Dodongo# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone in Dodongo's Cavern# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein in Dodongos HΓΆhle# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein in Dodongos HΓΆhle#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer un air pour une pierre Γ©trange dans la Caverne Dodongo# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone in Dodongo's Cavern# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein in Dodongos HΓΆhle# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein in Dodongos HΓΆhle#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange dans la Caverne Dodongo# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DODONGOS_CAVERN_GRASS] = HintText(CustomMessage("They say that some #grass in Dodongo's Cavern# hides #[[1]]#.", @@ -322,7 +322,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, un #tentΓ‘culo parasitario# protege #[[1]]#. {}, { CustomMessage("They say that #tentacle trouble# in a deity's belly guards #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Tentakel# im Bauch einer Gottheit #[[1]]# bewachen wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #Tentakel# im Bauche einer Gottheit #[[1]]# bewachen wΓΌrden.", /*french*/ "Selon moi, la #membrane# dans le ventre du gardien protΓ¨ge #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ SegΓΊn dicen, un #problema tentaculoso# en la tripa de cierta deidad esconde #[[1]]#. @@ -332,7 +332,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, unas #burbujas# protegen #[[1]]#. {}, { CustomMessage("They say that #bubble trouble# in a deity's belly guards #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Blasen# im Bauch einer Gottheit #[[1]]# bewachen wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #Blasen# im Bauche einer Gottheit #[[1]]# bewachen wΓΌrden.", /*french*/ "Selon moi, un #horde de bulles# dans le ventre du gardien protΓ¨gent #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ SegΓΊn dicen, un #problema burbujesco# en la tripa de cierta deidad esconde #[[1]]#. @@ -342,7 +342,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, #dispararle a una vaca# revela #[[1]]#. hintTextTable[RHT_JABU_JABUS_BELLY_MQ_MAP_CHEST] = HintText(CustomMessage("They say that a #boulder before cows# hides #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Findling vor KΓΌhen# #[[1]]# verstecke.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Felsen vor KΓΌhen# #[[1]]# verstecke.", /*french*/ "Selon moi, des #rochers prΓ¨s des vaches# cachent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, cierta #roca rodeada de vacas# esconde #[[1]]#. {}, { @@ -356,7 +356,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, un #paladar explosivo# esconde #[[1]]#. hintTextTable[RHT_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST] = HintText(CustomMessage("They say that near a #spiked elevator# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß in der NΓ€he eines #stachligen Aufzugs# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß in der NΓ€he eines #stachligen Aufzugs# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, prΓ¨s d'un #ascenseur visqueux# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, cerca de un #ascensor puntiagudo# yace #[[1]]#. @@ -366,7 +366,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, una #vaca sumergida# revela #[[1]]#. hintTextTable[RHT_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST] = HintText(CustomMessage("They say that #moving anatomy# creates a path to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #sich bewegende Anatomie# einen Pfad zu #[[1]]# kreiere.", + /*german*/ "Man erzΓ€hlt sich, daß hinter #sich bewegender Anatomie# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, un #organe descendant# mΓ¨ne Γ  #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #ser movedizo entre paredes# conduce a #[[1]]#. @@ -381,12 +381,12 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, un #par de digeridas vacas# otorgan #[[1]]#. hintTextTable[RHT_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST] = HintText(CustomMessage("They say that the #final cows' reward# in a deity's belly is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #Belohnung der letzten Kuh# im Bauch einer Gottheit #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß die #Belohnung der letzten Kuh# im Bauche einer Gottheit #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #cadeau des derniΓ¨res vaches# estomacales est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, las #vacas al final# de la tripa de cierta deidad otorgan #[[1]]#. hintTextTable[RHT_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST] = HintText(CustomMessage("They say that #cows protected by falling monsters# in a deity's belly guard hide #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #von fallenden Monstern bewachte KΓΌhe# im Bauch einer Gottheit #[[1]]# verstecken wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #von fallenden Monstern bewachte KΓΌhe# im Bauche einer Gottheit #[[1]]# verstecken wΓΌrden.", /*french*/ "Selon moi, des #vaches protΓ©gΓ©es par des monstres tombants# cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, unas #vacas custodiadas por monstruos del techo# de la tripa de cierta deidad otorgan #[[1]]#. @@ -416,7 +416,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, #Barinade# porta #[[1]]#. {}, { CustomMessage("They say that the #Bio-Electric Anemone# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #bioelektrische Anemone# #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß der #elektroterrestrische Biotentakel# #[[1]]# besÀße.", /*french*/ "Selon moi, l'#anΓ©mone bioΓ©lectrique# possΓ¨de #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ SegΓΊn dicen, la #anΓ©mona bioelΓ©ctrica# porta #[[1]]#. @@ -451,25 +451,25 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, una #Skulltula protegida por unos stingers# en la Tripa de Jabu-Jabu otorga #[[1]]#. hintTextTable[RHT_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS] = HintText(CustomMessage("They say that a #spider in a web within Jabu-Jabu's Belly# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne innerhalb einer Webe in Jabu-Jabus Bauch# #[[1]]# hielte.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne in Weben innerhalb von Jabu-Jabus Bauch# #[[1]]# hielte.", /*french*/ "Selon moi, une #Skulltula sur une toile dans le Ventre de Jabu-Jabu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula sobre una red# en la Tripa de Jabu-Jabu otorga #[[1]]#. hintTextTable[RHT_JABU_JABUS_BELLY_DEKU_SCRUB] = HintText(CustomMessage("They say that a #scrub in a deity# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku in einer Gottheit #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler in einer Gottheit #[[1]]# verkaufe.", /*french*/ "Selon moi, la #peste Mojo dans le ventre du gardien# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #deku dentro de cierta deidad# vende #[[1]]#. hintTextTable[RHT_POT_JABU_JABUS_BELLY] = HintText(CustomMessage("They say that a #pot in Jabu Jabu's Belly# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Vase in Jabu-Jabus Bauch# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Krug in Jabu-Jabus Bauch# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Ventre de Jabu-Jabu# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_JABU_JABU_RUPEE] = HintText(CustomMessage("They say that #underwater in Jabu-Jabu's Belly# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #unter Wasser in Jabu-Jabus Bauch# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß #unter Wasser in Jabu-Jabus Bauch# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, #[[1]]# se trouve #sous l'eau dans le Ventre de Jabu Jabu#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_JABU_JABU_HEART] = HintText(CustomMessage("They say that near a #central lift in Jabu-Jabu's Belly# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß sich #nahe des zentralen Lifts in Jabu-Jabus Bauch# #[[1]]# befΓ€nde.", + /*german*/ "Man erzΓ€hlt sich, daß sich #nahe des zentralen Aufzugs in Jabu-Jabus Bauch# #[[1]]# |befΓ€nde|befΓ€nden|.", /*french*/ "Selon moi, prΓ¨s d'un #ascenceur central dans le Ventre de Jabu-Jabu# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_JABU_JABUS_BELLY_GRASS] = HintText(CustomMessage("They say that some #grass in Jabu Jabu's Belly# hides #[[1]]#.", @@ -489,7 +489,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, sobre un #Γ‘rbol del Templo del Bosque# yace #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_FIRST_STALFOS_CHEST] = HintText(CustomMessage("They say that #defeating enemies beneath a falling ceiling# in Forest Temple yields #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Besiegen von Gegnern unter einer fallenden Decke# im Waldtempel #[[1]]# brΓ€chte.", + /*german*/ "Man erzΓ€hlt sich, daß das #Besiegen von Gegnern, unter einer fallenden Decke# im Waldtempel, #[[1]]# einbrΓ€chte.", /*french*/ "Selon moi, #deux squelettes# dans le Temple de la ForΓͺt protΓ¨gent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #derrotar enemigos caΓ­dos de lo alto# del Templo del Bosque revela #[[1]]#. @@ -504,12 +504,12 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, una #ardiente calavera# del Templo del Bosque esconde #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST] = HintText(CustomMessage("They say that a #chest on a small island# in the Forest Temple holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine ##Truhe auf einer kleinen Insel# im Waldtempel #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß eine ##Truhe, auf einer kleinen Insel# im Waldtempel, #[[1]]# enthielte.", /*french*/ "Selon moi, le #coffre sur l'Γlot# du Temple de la ForΓͺt contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #cofre sobre una isla# del Templo del Bosque contiene #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST] = HintText(CustomMessage("They say that beneath a #checkerboard falling ceiling# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß unter einer #fallenden Schachbrettdecke# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß unter einer #fallenden Schachbrettdecke# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, sous #l'Γ©chiquier tombant# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, tras un #techo de ajedrez# yace #[[1]]#. @@ -529,7 +529,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, en una #sala con otro punto de vista# se esconde #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_FLOORMASTER_CHEST] = HintText(CustomMessage("They say that deep in the forest #shadows guard a chest# containing #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß tief im Wald, #Schatten eine Truhe bewachen#, welche [[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß tief im Wald, #Schatten eine Truhe bewachen# welche [[1]]# enthielte.", /*french*/ "Selon moi, l'#ombre de la forΓͺt# protΓ¨ge un coffre contenant #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, en lo profundo del bosque #unas sombras# esconden #[[1]]#. @@ -539,7 +539,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, los #Stalfos en lo profundo del Templo del Bosque# guardan #[[1]]#. {}, { CustomMessage("They say that an #army of the dead# guards #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Armee der Toten# #[[1]]# bewachen wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Armee der Toten# #[[1]]# bewachen wΓΌrde.", /*french*/ "Selon moi, des #squelettes sylvestres# protΓ¨gent #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ SegΓΊn dicen, un #ejΓ©rcito de soldados caΓ­dos# guarda #[[1]]#. @@ -549,7 +549,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, un #espectro rojo# guarda #[[1]]#. {}, { CustomMessage("They say that #Joelle# guards #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Joelle# #[[1]]# bewachen wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß #Hetti# #[[1]]# bewachen wΓΌrde.", /*french*/ "Selon moi, #Joelle# protΓ¨ge #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ SegΓΊn dicen, #Joelle# guarda #[[1]]#. @@ -559,7 +559,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, un #espectro azul# guarda #[[1]]#. {}, { CustomMessage("They say that #Beth# guards #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Beth# #[[1]]# bewachen wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß #Netti# #[[1]]# bewachen wΓΌrde.", /*french*/ "Selon moi, #Beth# protΓ¨ge #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ SegΓΊn dicen, #Beth# guarda #[[1]]#. @@ -574,7 +574,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, sobre un #Γ‘rbol del Templo del Bosque# yace #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_MQ_WOLFOS_CHEST] = HintText(CustomMessage("They say that #defeating enemies beneath a falling ceiling# in Forest Temple yields #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Besiegen von Gegnern unter einer fallenden Decke# im Waldtempel #[[1]]# brΓ€chte.", + /*german*/ "Man erzΓ€hlt sich, daß das #Besiegen von Gegnern, unter einer fallenden Decke# im Waldtempel, #[[1]]# einbrΓ€chte.", /*french*/ "Selon moi, #deux squelettes# dans le Temple de la ForΓͺt protΓ¨gent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #derrotar enemigos caΓ­dos de lo alto# del Templo del Bosque revela #[[1]]#. @@ -584,17 +584,17 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, los #Stalfos en lo profundo del Templo del Bosque# guardan #[[1]]#. {}, { CustomMessage("They say that an #army of the dead# guards #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Armee der Toten# #[[1]]# bewachen wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Armee der Toten# #[[1]]# bewachen wΓΌrde.", /*french*/ "Selon moi, des #squelettes sylvestres# protΓ¨gent #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ SegΓΊn dicen, un #ejΓ©rcito de soldados caΓ­dos# guarda #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST] = HintText(CustomMessage("They say that a #chest on a small island# in the Forest Temple holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine ##Truhe auf einer kleinen Insel# im Waldtempel #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Truhe, auf einer kleinen Insel# im Waldtempel, #[[1]]# enthielte.", /*french*/ "Selon moi, le #coffre sur l'Γlot# du Temple de la ForΓͺt contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #cofre sobre una isla# del Templo del Bosque contiene #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST] = HintText(CustomMessage("They say that #high in a courtyard# within the Forest Temple is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #hoch in einem Hof# innerhalb des Waldtempels #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß #hoch in einem Hof# innerhalb des Waldtempels #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #haut perchΓ© dans le jardin# du Temple de la ForΓͺt gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #cofre en lo alto de un patio# del Templo del Bosque contiene #[[1]]#. @@ -609,7 +609,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, un #fantasma rojo# guarda #[[1]]#. {}, { CustomMessage("They say that #Joelle# guards #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Joelle# #[[1]]# bewachen wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß #Hetti# #[[1]]# bewachen wΓΌrde.", /*french*/ "Selon moi, #Joelle# protΓ¨ge #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ SegΓΊn dicen, #Joelle# guarda #[[1]]#. @@ -619,12 +619,12 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, un #fantasma azul# guarda #[[1]]#. {}, { CustomMessage("They say that #Beth# guards #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Beth# #[[1]]# bewachen wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß #Netti# #[[1]]# bewachen wΓΌrde.", /*french*/ "Selon moi, #Beth# protΓ¨ge #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ SegΓΊn dicen, #Beth# guarda #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST] = HintText(CustomMessage("They say that beneath a #checkerboard falling ceiling# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß unter einer #fallenden Schachbrettdecke# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß unter einer #fallenden Schachbrettdecke# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, sous #l'Γ©chiquier tombant# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, tras un #techo de ajedrez# yace #[[1]]#. @@ -634,7 +634,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, las #paredes giratorias# del Templo del Bosque conceden #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_MQ_REDEAD_CHEST] = HintText(CustomMessage("They say that deep in the forest #undead guard a chest# containing #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß tief im Wald #Untote eine Truhe bewachen#, welche #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß tief im Wald, #Untote eine Truhe bewachen#, welche #[[1]]# enthielte.", /*french*/ "Selon moi, des #revenants dans le Temple de la ForΓͺt# protΓ¨gent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, en lo profundo del bosque #guardias del mΓ‘s allΓ‘# guardan #[[1]]#. @@ -649,17 +649,17 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, #Ganon Fantasma# porta #[[1]]#. {}, { CustomMessage("They say that the #Evil Spirit from Beyond# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #bΓΆse Geist aus dem Jenseits# #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß #das reitende Unheil# #[[1]]# besÀße.", /*french*/ "Selon moi, l'#esprit malΓ©fique de l'au-delΓ # possΓ¨de #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ SegΓΊn dicen, el #espΓ­ritu maligno de ultratumba# porta #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD] = HintText(CustomMessage("They say that a #spider on a small island# in the Forest Temple holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne auf einer kleinen Insel# im Waldtempel #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne, auf einer kleinen Insel# im Waldtempel, #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula sur l'Γlot du Temple de la ForΓͺt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula sobre una pequeΓ±a isla# del Templo del Bosque otorga #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_GS_FIRST_ROOM] = HintText(CustomMessage("They say that a #spider high on a wall of vines# in the Forest Temple holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne hoch auf einer Wand aus Reben# im Waldtempel #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne, hoch auf einer Wand aus Reben# im Waldtempel, #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula sur un mur de vignes du Temple de la ForΓͺt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula en lo alto de una pared de cepas# del Templo del Bosque otorga #[[1]]#. @@ -674,7 +674,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, una #Skulltula rodeada de fantasmas# del Templo del Bosque otorga #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_GS_BASEMENT] = HintText(CustomMessage("They say that a #spider within revolving walls# in the Forest Temple holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne inmitten drehender WΓ€nde# im Waldtempel #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne inmitten drehender WΓ€nde# innerhalb des Waldtempels #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula derriΓ¨re les murs pivotants du Temple de la ForΓͺt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula entre paredes giratorias# del Templo del Bosque otorga #[[1]]#. @@ -684,26 +684,26 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, una #Skulltula escondida entre cepas# del Templo del Bosque otorga #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM] = HintText(CustomMessage("They say that a #spider in a hidden nook# within the Forest Temple holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne in einem versteckten Winkel# im Waldtempel #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne in einem versteckten Winkel# innerhalb des Waldtempels #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula dans un recoin cachΓ© du Temple de la ForΓͺt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula en una esquina oculta# del Templo del Bosque otorga #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD] = HintText(CustomMessage("They say that a #spider on an arch# in the Forest Temple holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne auf einem Bogen# im Waldtempel #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne, auf einem Bogen# im Waldtempel, #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula sur une arche du Temple de la ForΓͺt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula sobre un arco# del Templo del Bosque otorga #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD] = HintText(CustomMessage("They say that a #spider on a ledge# in the Forest Temple holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne auf einem Vorsprung# im Waldtempel #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne, auf einem Vorsprung# im Waldtempel, #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula dans le jardin du Temple de la ForΓͺt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula en un borde# del Templo del Bosque otorga #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_MQ_GS_WELL] = HintText(CustomMessage("They say that #draining a well# in Forest Temple uncovers a spider with #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Entleeren eines Brunnens# im Waldtempel eine Spinne mit #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Entleeren eines Brunnens# im Waldtempel, eine Spinne enthΓΌlle, welche #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula au fond du Puits du Temple de la ForΓͺt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #vaciar el pozo# del Templo del Bosque desvela una Skulltula que otorga #[[1]]#. hintTextTable[RHT_POT_FOREST_TEMPLE] = HintText(CustomMessage("They say that a #pot in Forest Temple# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Vase im Waldtempel# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Krug im Waldtempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Temple de la FΓ΄ret# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_FOREST_TEMPLE_HEART] = HintText(CustomMessage("They say that a #heart in the Forest Temple# hides #[[1]]#.", @@ -718,7 +718,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { | FIRE TEMPLE | ---------------------------*/ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They say that #near a dragon# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #nahe eines Drachens# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß #nahe eines Drachens# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #prΓ¨s d'un dragon# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #cerca de un dragΓ³n# yace #[[1]]#. @@ -738,7 +738,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, los #explosivos en un mar de llamas# revelan #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST] = HintText(CustomMessage("They say that a #Goron trapped near lava# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #nahe der Lava gefangene Gorone# #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß ein #nahe der Lava gefangener Gorone# #[[1]]# besÀße.", /*french*/ "Selon moi, le #Goron emprisonnΓ© prΓ¨s de la lave# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #goron atrapado cerca de un mar de llamas# guarda #[[1]]#. @@ -773,12 +773,12 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, un #cofre de un ardiente laberinto# contiene #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_HIGHEST_GORON_CHEST] = HintText(CustomMessage("They say that a #Goron atop the Fire Temple# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Gorone auf der Spitze des Feuertempels# #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Gorone an der Spitze des Feuertempels# #[[1]]# besÀße.", /*french*/ "Selon moi, le #Goron au sommet du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #goron en lo alto del Templo del Fuego# guarda #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST] = HintText(CustomMessage("They say that #near a dragon# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #nahe eines Drachens# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß #nahe eines Drachens# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #prΓ¨s d'un dragon# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #cerca de un dragΓ³n# yace #[[1]]#. @@ -818,7 +818,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, usar el #martillo en lo profundo del Templo del Fuego# revela #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that #illuminating a lava pit# reveals the path to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #Illumination einer Lavagrube# den Pfad zu #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß die #Beleuchtung einer Lavagrube# einen Pfad offenbare, welcher #[[1]]# enthielte.", /*french*/ "Selon moi, #Γ©clairer le lac de lave# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #iluminar un mar de llamas# revela #[[1]]#. @@ -833,7 +833,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, un #goron cerca de un laberinto# guarda #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_FREESTANDING_KEY] = HintText(CustomMessage("They say that hidden #beneath a block of stone# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß versteckt #unter einem Steinblock# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß versteckt #unter einem Steinblock# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, cachΓ© #derriΓ¨re un bloc de pierre# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #bajo unos bloques de piedra# yace #[[1]]#. @@ -843,17 +843,17 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, #Volvagia# porta #[[1]]#. {}, { CustomMessage("They say that the #Subterranean Lava Dragon# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #subterrane Lavadrache# #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß der #subterrane Lavadrachoid# #[[1]]# besÀße.", /*french*/ "Selon moi, le #dragon des profondeurs# possΓ¨de #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ SegΓΊn dicen, el #dragΓ³n de lava subterrΓ‘neo# porta #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM] = HintText(CustomMessage("They say that #eight tiles of malice# guard a spider holding #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #acht Kacheln der Arglist# eine Spinne bewachen wΓΌrden, welche #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß #acht Fliesen der Arglist# eine Spinne bewachen wΓΌrden, welche #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula protΓ©gΓ©e par huit tuiles dans le Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #ocho baldosas de maldad# custodian una Skulltula que otorga #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_GS_BOSS_KEY_LOOP] = HintText(CustomMessage("They say that #five tiles of malice# guard a spider holding #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #fΓΌnf Kacheln der Arglist# eine Spinne bewachen wΓΌrden, welche #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß #fΓΌnf Fliesen der Arglist# eine Spinne bewachen wΓΌrden, welche #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula protΓ©gΓ©e par cinq tuiles dans le Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #cinco baldosas de maldad# custodian una Skulltula que otorga #[[1]]#. @@ -863,27 +863,27 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, los #explosivos en un laberinto# desvelan una Skulltula que otorga #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_GS_SCARECROW_TOP] = HintText(CustomMessage("They say that a #spider-friendly scarecrow# atop the Fire Temple hides #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #spinnenfreundliche Vogelscheuche# auf der Spitze des Feuertempels #[[1]]# verstecke.", + /*german*/ "Man erzΓ€hlt sich, daß eine #spinnenfreundliche Vogelscheuche#, an der Spitze des Feuertempels, #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula repΓ©rΓ©e par l'Γ©pouvantail du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, un #espantapΓ‘jaros del Templo del Fuego# custodia una Skulltula que otorga #[[1]]#. {}, { CustomMessage("They say that a #spider-friendly scarecrow# atop a volcano hides #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #spinnenfreundliche Vogelscheuche# auf der Spitze eines Vulkans #[[1]]# verstecke.", + /*german*/ "Man erzΓ€hlt sich, daß eine #spinnenfreundliche Vogelscheuche#, an der Spitze eines Vulkans, #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula repΓ©rΓ©e par l'Γ©pouvantail du volcan# a #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ SegΓΊn dicen, un #espantapΓ‘jaros en lo alto de un volcΓ‘n# custodia una Skulltula que otorga #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_GS_SCARECROW_CLIMB] = HintText(CustomMessage("They say that a #spider-friendly scarecrow# atop the Fire Temple hides #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #spinnenfreundliche Vogelscheuche# auf der der Spitze des Feuertempels #[[1]]# verstecke.", + /*german*/ "Man erzΓ€hlt sich, daß eine #spinnenfreundliche Vogelscheuche#, an der der Spitze des Feuertempels, #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula repΓ©rΓ©e par l'Γ©pouvantail du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, un #espantapΓ‘jaros del Templo del Fuego# custodia una Skulltula que otorga #[[1]]#. {}, { CustomMessage("They say that a #spider-friendly scarecrow# atop a volcano hides #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #spinnenfreundliche Vogelscheuche# auf der Spitze eines Vulkans #[[1]]# verstecke.", + /*german*/ "Man erzΓ€hlt sich, daß eine #spinnenfreundliche Vogelscheuche#, an der Spitze eines Vulkans, #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula repΓ©rΓ©e par l'Γ©pouvantail du volcan# a #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ SegΓΊn dicen, un #espantapΓ‘jaros en lo alto de un volcΓ‘n# custodia una Skulltula que otorga #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE] = HintText(CustomMessage("They say that a #spider above a fiery maze# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne oberhalb eines feurigen Labyrinths #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne, oberhalb eines feurigen Labyrinths#, #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula au dessus du labyrinthe enflammΓ© du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula sobre un ardiente laberinto# otorga #[[1]]#. @@ -893,17 +893,17 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, una #Skulltula en el interior de un ardiente laberinto# otorga #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR] = HintText(CustomMessage("They say that a #Goron trapped near lava# befriended a spider with #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #nahe der Lava gefangener Gorone# sich mit einer Spinne angefreundet hat, welche #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß ein #nahe Lava gefangener Gorone# sich mit einer Spinne angefreundet hat, welche #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula emprisonnΓ©e prΓ¨s du lac de lave du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula amiga de un Goron atrapado junto a la lava# otorga #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM] = HintText(CustomMessage("They say that a #spider beside a fiery maze# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne neben einem feurigen Labyrinth# #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne, neben einem feurigen Labyrinth#, #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula prΓ¨s du labyrinthe enflammΓ© du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula junto a un ardiente laberinto# otorga #[[1]]#. hintTextTable[RHT_POT_FIRE_TEMPLE] = HintText(CustomMessage("They say that a #pot in Fire Temple# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Vase im Feuertempel# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Krug im Feuertempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Temple du Feu# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_FIRE_TEMPLE_HEART] = HintText(CustomMessage("They say that a #heart in the Fire Temple# hides #[[1]]#.", @@ -915,7 +915,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*french*/ "Selon moi, #appeler le soleil dans une arΓ¨ne chaude# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun behind a knight's throne in a volcano# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Anrufen der Sonne hinter dem Thron eines Ritters in einem Vulkan# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Anrufen der Sonne, hinter dem Thron eines Ritters in einem Vulkan#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #appeler le soleil derriΓ¨re le trΓ΄ne d’un chevalier dans un volcan# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_FIRE_TEMPLE] = HintText(CustomMessage("They say that a #crate in Fire Temple# contains #[[1]]#.", @@ -941,22 +941,22 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, el #fuego en el Templo del Agua# revela #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_DRAGON_CHEST] = HintText(CustomMessage("They say that a #serpent's prize# in the Water Temple is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Preis einer Schlange# im Wassertempel #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß der #Preis einer Schlange# im Wassertempel #[[1]]# |sei|seien|.", /*french*/ "Selon moi, la #rΓ©compense du dragon submergΓ©# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #escamado premio# del Templo del Agua se trata de #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST] = HintText(CustomMessage("They say that #blinding an eye# in the Water Temple leads to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Erblinden eines Auges# im Wassertempel zu #[[1]]# fΓΌhre.", + /*german*/ "Man erzΓ€hlt sich, daß das #Erblinden eines Auges# im Wassertempel #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #l'oeil# du Temple de l'Eau voit #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #cegar un ojo# del Templo del Agua conduce a #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_CENTRAL_PILLAR_CHEST] = HintText(CustomMessage("They say that in the #depths of the Water Temple# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß in den #Tiefen des Wassertempels# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß in den #Tiefen des Wassertempels# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, le #coeur du Temple de l'Eau# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, en las #profundidades del Templo del Agua# yace #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_CRACKED_WALL_CHEST] = HintText(CustomMessage("They say that #through a crack# in the Water Temple is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #in einem Spalt# im Wassertempel #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß #hinter einem Spalt# im Wassertempel #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #mur fragile# du Temple de l'Eau cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, tras una #agrietada pared# del Templo del Agua yace #[[1]]#. @@ -975,17 +975,17 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, el #oscuro reflejo de ti mismo# guarda #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST] = HintText(CustomMessage("They say that in the #depths of the Water Temple# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß in den #Tiefen des Wassertempels# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß in den #Tiefen des Wassertempels# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, le #coeur du Temple de l'Eau# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, en las #profundidades del Templo del Agua# yace #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that fire in the Water Temple unlocks a #vast gate# revealing a chest with #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß Feuer im Wassertempel ein #großes Tor# entschlΓΌssele, welches eine Truhe mit #[[1]]# offenbare.", + /*german*/ "Man erzΓ€hlt sich, daß Feuer im Wassertempel, ein #großes Tor# entriegele und #[[1]]# in einer Truhe offenbare.", /*french*/ "Selon moi, des #flammes au coeur du Temple de l'Eau# rΓ©vΓ¨lent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el fuego en el Templo del Agua alza una #gran valla# con #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_MQ_LONGSHOT_CHEST] = HintText(CustomMessage("They say that #through a crack# in the Water Temple is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #in einem Spalt# im Wassertempel #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß #hinter einem Spalt# im Wassertempel #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #mur fragile# du Temple de l'Eau cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, tras una #agrietada pared# del Templo del Agua yace #[[1]]#. @@ -1005,12 +1005,12 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, #Morpha# porta #[[1]]#. {}, { CustomMessage("They say that the #Giant Aquatic Amoeba# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #gigantische aquatische AmΓΆbe# #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß der #aquamΓΆbe Wassertentakel# #[[1]]# besÀße.", /*french*/ "Selon moi, l'#amibe aquatique gΓ©ante# possΓ¨de #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ SegΓΊn dicen, la #ameba acuΓ‘tica gigante# porta #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM] = HintText(CustomMessage("They say that a #spider over a waterfall# in the Water Temple holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne ΓΌber einem Wasserfall# im Wassertempel #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne, ΓΌber einem Wasserfall# im Wassertempel, #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula au dessus d'une cascade du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula tras una cascada# del Templo del Agua otorga #[[1]]#. @@ -1020,17 +1020,17 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, una #Skulltula en el centro del Templo del Agua# otorga #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that a spider protected by #rolling boulders in the Water Temple# hides #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine Spinne, welche von #rollenden Felsbrocken im Wassertempel# geschΓΌtzt werde, #[[1]]# verstecke.", + /*german*/ "Man erzΓ€hlt sich, daß eine Spinne, welche von #rollenden Felsen im Wassertempel# geschΓΌtzt werde, #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula derriΓ¨re les rochers roulants du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, una #Skulltula protegida por rocas rodantes# del Templo del Agua otorga #[[1]]#. {}, { CustomMessage("They say that a spider protected by #rolling boulders under the lake# hides #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine Spinne, welche von #rollenden Felsbrocken unterhalb eines Flusses# geschΓΌtzt werde, #[[1]]# verstecke.", + /*german*/ "Man erzΓ€hlt sich, daß eine Spinne, welche von #rollenden Felsen unterhalb eines Sees# geschΓΌtzt werde, #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula derriΓ¨re les rochers roulants sous le lac# a #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ SegΓΊn dicen, una #Skulltula protegida por rocas rodantes# bajo el lago otorga #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_GS_RIVER] = HintText(CustomMessage("They say that a #spider over a river# in the Water Temple holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne ΓΌber einem Fluß# im Wassertempel #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne, ΓΌber einem Fluß# im Wassertempel, #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula au dessus de la riviΓ¨re du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula sobre un rΓ­o# del Templo del Agua otorga #[[1]]#. @@ -1045,28 +1045,28 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, unos #reptiles custodian una Skulltula# del Templo del Agua que otorga #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_MQ_GS_RIVER] = HintText(CustomMessage("They say that a #spider over a river# in the Water Temple holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne oberhalb eines Flusses# im Wassertempel #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne, ΓΌber einem Fluß# im Wassertempel, #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula au dessus de la riviΓ¨re du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula sobre un rΓ­o# del Templo del Agua otorga #[[1]]#. hintTextTable[RHT_POT_WATER_TEMPLE] = HintText(CustomMessage("They say that a #pot in Water Temple# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Vase im Wassertempel# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Krug im Wassertempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Temple de l'Eau# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_WATER_TEMPLE_HEART] = HintText(CustomMessage("They say that in a #river in the Water Temple# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß in einem #Fluß im Wassertempel# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß in einem #Fluß im Wassertempel# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, une #riviΓ¨re dans le Temple de l'Eau# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun atop a small pillar before a duel with one's shadow# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Anrufen der Sonne auf einer kleinen SΓ€ule vor einem Duell mit seinem Schatten# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Anrufen der Sonne auf einer kleinen SΓ€ule, vor einem Duell mit seinem Schatten#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #appeler le soleil au sommet d’un petit pilier avant un duel avec son ombre# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY] = HintText(CustomMessage("They say that #calling the rain before a duel with one's shadow# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Anrufen des Regens vor einem Duell mit seinem Schatten# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Anrufen des Regens, vor einem Duell mit seinem Schatten#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #appeler la pluie avant un duel avec son ombre# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun before a duel with one's shadow# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Anrufen der Sonne vor einem Duell mit seinem Schatten# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Anrufen der Sonne, vor einem Duell mit seinem Schatten#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #appeler le soleil avant un duel avec son ombre# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_WATER_TEMPLE] = HintText(CustomMessage("They say that a #crate in Water Temple# contains #[[1]]#.", @@ -1077,7 +1077,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { | SPIRIT TEMPLE | ---------------------------*/ hintTextTable[RHT_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST] = HintText(CustomMessage("They say that a child conquers a #skull in green fire# in the Spirit Temple to reach #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein Kind einen #SchΓ€del in grΓΌnem Feuer# im Geistertempel erobere, um #[[1]]# zu erreichen.", + /*german*/ "Man erzΓ€hlt sich, daß ein Kind einen #SchΓ€del in grΓΌnem Feuer# im Geistertempel ΓΌberwΓ€ltige, um #[[1]]# zu erreichen.", /*french*/ "Selon moi, le #crΓ’ne au halo vert dans le colosse# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el joven que #baje el puente# del Templo del EspΓ­ritu encontrarΓ‘ #[[1]]#. @@ -1087,12 +1087,12 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, un joven puede encontrar un #cofre entre rejas# del Templo del EspΓ­ritu con #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_COMPASS_CHEST] = HintText(CustomMessage("They say that #across a pit of sand# in the Spirit Temple lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #jenseits einer Sandgrube# im Geistertempel #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß #jenseits einer Sandgrube# im Geistertempel #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, le #trou sableux dans le colosse# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, tras un #pozo de arena# del Templo del EspΓ­ritu yace #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST] = HintText(CustomMessage("They say that #dodging boulders to collect silver rupees# in the Spirit Temple yields #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Ausweichen von Felsbrocken um silberne Rubine zu sammeln# im Geistertempel #[[1]]# einbrΓ€chte.", + /*german*/ "Man erzΓ€hlt sich, daß das #Ausweichen von Felsen, um im Geistertempel silberne Rubine zu sammeln#, #[[1]]# einbrΓ€chte.", /*french*/ "Selon moi, les #piΓ¨ces argentΓ©es entourΓ©es de rochers dans le colosse# rΓ©vΓ¨lent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #esquivar rocas y conseguir plateadas rupias# en el Templo del EspΓ­ritu conduce a #[[1]]#. @@ -1107,7 +1107,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, un #cΓ­rculo de reflectante luz# del Templo del EspΓ­ritu guarda #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say that #before a giant statue# in the Spirit Temple lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #vor einer riesigen Statue# im Geistertempel #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß #vor einer riesigen Statue# im Geistertempel #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, #devant la statue# dans le colosse gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #ante una gran estatua# del Templo del EspΓ­ritu aguarda #[[1]]#. @@ -1132,7 +1132,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, una #estatua del Templo del EspΓ­ritu# esconde #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST] = HintText(CustomMessage("They say that on a #ledge by a statue# in the Spirit Temple rests #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf einem #Vorsprung einer Statue# im Geistertempel #[[1]]# ruhe.", + /*german*/ "Man erzΓ€hlt sich, daß auf einem #Vorsprung, bei einer Statue# im Geistertempel, #[[1]]# |ruhe|ruhen|.", /*french*/ "Selon moi, #haut perchΓ© prΓ¨s de la statue# dans le colosse gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, al #borde de una estatua# del Templo del EspΓ­ritu yace #[[1]]#. @@ -1157,12 +1157,12 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, un #cofre rodeado de llamas# del Templo del EspΓ­ritu contiene #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_TOPMOST_CHEST] = HintText(CustomMessage("They say that those who #show the light above the Colossus# find #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß jene, welche #das Licht auf dem Koloss# zeigen wΓΌrden, #[[1]]# fΓ€nden.", + /*german*/ "Man erzΓ€hlt sich, daß jene, welche #das Licht oberhalb des Kolosses# zeigen wΓΌrden, #[[1]]# fΓ€nden.", /*french*/ "Selon moi, le #soleil au sommet du colosse# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, aquellos que #iluminen en lo alto del Coloso# encontrarΓ‘n #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST] = HintText(CustomMessage("They say that #lying unguarded# in the Spirit Temple is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #unbewacht liegend# im Geistertempel #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß #unbewacht liegend# im Geistertempel #[[1]]# |sei|seien|.", /*french*/ "Selon moi, dans #l'entrΓ©e du colosse# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, en la #entrada del Templo del EspΓ­ritu# yace #[[1]]#. @@ -1172,17 +1172,17 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, el #interruptor de un pilar# del Templo del EspΓ­ritu revela #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST] = HintText(CustomMessage("They say that #collecting rupees through a water jet# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Sammeln von Rubin durch einen Wasserstrom# #[[1]]# enthΓΌllen wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß das #Sammeln von Rubinen durch einen Wasserstrom# #[[1]]# enthΓΌllen wΓΌrde.", /*french*/ "Selon moi, les #piΓ¨ces argentΓ©es dans le jet d'eau# du colosse rΓ©vΓ¨lent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #hacerte con rupias tras un gΓ©iser# revela #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST] = HintText(CustomMessage("They say that an #eye blinded by stone# within the Spirit Temple conceals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #durch einen Stein erblindetes Auge# im Geistertempel #[[1]]# verberge.", + /*german*/ "Man erzΓ€hlt sich, daß ein, #durch einen Stein erblindetes, Auge# innerhalb des Geistertempels #[[1]]# verberge.", /*french*/ "Selon moi, #l'oeil derriΓ¨re le rocher# dans le colosse voit #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #cegar a un ojo# del Templo del EspΓ­ritu revela #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_MAP_CHEST] = HintText(CustomMessage("They say that surrounded by #fire and wrappings# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß umgeben von #Feuer umhΓΌllt# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß umgeben von #Feuer und Bandagen# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, prΓ¨s des #pierres tombales dans le colosse# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, rodeado de #fuego y vendas# yace #[[1]]#. @@ -1197,7 +1197,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, una #explosiva luz solar# del Templo del EspΓ­ritu revela #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST] = HintText(CustomMessage("They say that #trapped by falling enemies# within the Spirit Temple is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß sich #gefangen von fallenden Feinden# im Geistertempel #[[1]]# befΓ€nde.", + /*german*/ "Man erzΓ€hlt sich, daß sich #gefangen von herabfallenden Feinden# innerhalb des Geistertempels #[[1]]# |befΓ€nde|befΓ€nden|.", /*french*/ "Selon moi, des #ennemis tombants# dans le colosse protΓ¨gent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #rodeado de enemigos del cielo# del Templo del EspΓ­ritu yace #[[1]]#. @@ -1212,7 +1212,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, la #melodΓ­a real que despierte al coloso# revelarΓ‘ #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth# finds the colossus's hidden #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Auge der Wahrheit# des Kolosses verborgene #[[1]]# fΓ€nde.", + /*german*/ "Man erzΓ€hlt sich, daß das #Auge der Wahrheit#, Verborgenes im Koloss enthΓΌlle und #[[1]]# offenbare.", /*french*/ "Selon moi, #l'oeil de vΓ©ritΓ©# verra dans le colosse #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #Ojo de la Verdad# en el Templo del EspΓ­ritu encontrarΓ‘ #[[1]]#. @@ -1227,12 +1227,12 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, la #luz solar de un Γ­gneo laberinto# esconde #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST] = HintText(CustomMessage("They say that #across a pit of sand# in the Spirit Temple lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #jenseits einer Sandgrube# im Geistertempel #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß #jenseits einer Sandgrube# im Geistertempel #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, le #trou sableux# dans le colosse a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #a travΓ©s del pozo de arena# del Templo del EspΓ­ritu yace #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST] = HintText(CustomMessage("They say that where #temporal stone blocks the path# within the Spirit Temple lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß wo #zeitlicher Stein den Pfad blockiere# im Geistertempel #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß ein #zeitlicher Stein, der innerhalb des Geistertempels den Pfad blockiere#, #[[1]]# verstecke.", /*french*/ "Selon moi, les #pierres temporelles# dans le colosse cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, donde los #bloques temporales bloquean# en el Templo del EspΓ­ritu yace #[[1]]#. @@ -1242,12 +1242,12 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, un #cofre de doble uso# contiene #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that a #temporal stone blocks the light# leading to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #zeitlicher Stein das Licht blockiere#, was zu #[[1]]# fΓΌhre.", + /*german*/ "Man erzΓ€hlt sich, daß ein #zeitlicher Stein das Licht blockiere# und deshalb #[[1]]# verstecke.", /*french*/ "Selon moi, la #pierre temporelle# le colosse fait ombre sur #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #bloque temporal bloquea la luz# que conduce a #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST] = HintText(CustomMessage("They say that those who #show the light above the Colossus# find #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß jene, welche #das Licht auf dem Koloss# zeigen wΓΌrden, #[[1]]# fΓ€nden.", + /*german*/ "Man erzΓ€hlt sich, daß jene, welche #das Licht oberhalb des Kolosses# zeigen wΓΌrden, #[[1]]# fΓ€nden.", /*french*/ "Selon moi, le trΓ©sor invisible #au sommet du colosse# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, aquellos que #revelen la luz sobre el Coloso# encontrarΓ‘n #[[1]]#. @@ -1257,7 +1257,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, #Birova# porta #[[1]]#. {}, { CustomMessage("They say that the #Sorceress Sisters# hold #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #Hexenschwestern# #[[1]]# besÀßen.", + /*german*/ "Man erzΓ€hlt sich, daß die #hΓΆllische Hexenarmada# #[[1]]# besÀße.", /*french*/ "Selon moi, #les sorciΓ¨res jumelles# possΓ¨de #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ SegΓΊn dicen, las #hermanas hechiceras# portan #[[1]]#. @@ -1267,7 +1267,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, una #Skulltula en el salΓ³n de un guerrero# otorga #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_GS_BOULDER_ROOM] = HintText(CustomMessage("They say that a #spider behind a temporal stone# in the Spirit Temple yields #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne hinter einem zeitlichen Stein# im Geistertempel #[[1]]# einbrΓ€chte.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne, hinter einem zeitlichen Stein# im Geistertempel, #[[1]]# einbrΓ€chte.", /*french*/ "Selon moi, une #Skulltula derriΓ¨re une pierre temporelle du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula tras un bloque temporal# del Templo del EspΓ­ritu otorga #[[1]]#. @@ -1277,17 +1277,17 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, una #Skulltula junto a una estatua# del Templo del EspΓ­ritu otorga #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM] = HintText(CustomMessage("They say that a #spider at the top of a deep shaft# in the Spirit Temple holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne auf der Spitze eines tiefen Stiels# im Geistertempel #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne, an der Spitze eines tiefen Schachts# im Geistertempel, #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula prΓ¨s d'un mur d'escalade du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula en lo alto de un gran hueco# del Templo del EspΓ­ritu otorga #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_GS_METAL_FENCE] = HintText(CustomMessage("They say that a child defeats a #spider among bats# in the Spirit Temple to gain #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein Kind #eine Spinne inmitten von FledermΓ€usen# im Geistertempel besiege und #[[1]]# erhielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein Kind, #eine Spinne inmitten von FledermΓ€usen# im Geistertempel, besiege und #[[1]]# erhielte.", /*french*/ "Selon moi, une #Skulltula sur le grillage du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el joven que derrote la #Skulltula entre murciΓ©lagos# del Templo del EspΓ­ritu hallarΓ‘ #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM] = HintText(CustomMessage("They say that #above a pit of sand# in the Spirit Temple hides #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß sich #oberhalb einer Sandgrube# im Geistertempel #[[1]]# verstecke.", + /*german*/ "Man erzΓ€hlt sich, daß sich #ΓΌber einer Sandgrube# im Geistertempel #[[1]]# |verstecke|verstecken|.", /*french*/ "Selon moi, une #Skulltula au dessus du trou sableux du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula sobre un pozo de arena# del Templo del EspΓ­ritu otorga #[[1]]#. @@ -1302,20 +1302,20 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, una #Skulltula en el salΓ³n de un guerrero# otorga #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM] = HintText(CustomMessage("They say that #upon a web of glass# in the Spirit Temple sits a spider holding #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #auf einer Webe aus Glas# im Geistertempel eine Spinne sÀße, welche #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß #auf einem Weben aus Glas# im Geistertempel eine Spinne sÀße, welche #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula sur une paroi de verre du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #sobre una plataforma de cristal# yace una Skulltula que otorga #[[1]]#. hintTextTable[RHT_POT_SPIRIT_TEMPLE] = HintText(CustomMessage("They say that a #pot in Spirit Temple# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Vase im Geistertempel# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Krug im Geistertempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Temple de l'Esprit# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_SPIRIT_TEMPLE_HEART] = HintText(CustomMessage("They say that on a #small platform# in the Spirit Temple lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf einer #kleinen Plattform# im Geistertempel #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß auf einer #kleinen Plattform# im Geistertempel #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, sur une #petite plateforme# dans le Temple de l'Esprit repose #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_SPIRIT_TEMPLE_MQ_HEART] = HintText(CustomMessage("They say that guarded by a #ring of flame# in the Spirit Temple is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß sich bewacht von einem #Ring der Flammen# im Geistertempel #[[1]]# befΓ€nde.", + /*german*/ "Man erzΓ€hlt sich, daß sich bewacht von einem #Ring der Flammen#, im Geistertempel #[[1]]# |befΓ€nde|befΓ€nden|.", /*french*/ "Selon moi, protΓ©gΓ© par un #cercle de flammes# dans le Temple de l'Esprit se trouve #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_SPIRIT_TEMPLE] = HintText(CustomMessage("They say that a #crate in Spirit Temple# contains #[[1]]#.", @@ -1331,7 +1331,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, el #Ojo de la Verdad# descubrirΓ‘ un pasillo de facetas con #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_HOVER_BOOTS_CHEST] = HintText(CustomMessage("They say that #Dead Hand in the Shadow Temple# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #tote Hand im Schattentempel# #[[1]]# hielte.", + /*german*/ "Man erzΓ€hlt sich, daß der #Hirnsauger im Schattentempel# #[[1]]# hielte.", /*french*/ "Selon moi, le #Poigneur dans le Temple de l'Ombre# cache #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, la #Mano Muerta del Templo de las Sombras# guarda #[[1]]#. {}, { @@ -1341,7 +1341,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, un #temido morador del Templo de las Sombras# guarda #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_COMPASS_CHEST] = HintText(CustomMessage("They say that #mummies revealed by the Eye of Truth# guard #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #durch das Auge der Wahrheit offenbarte Mumien# #[[1]]# bewachen wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #vom Auge der Wahrheit offenbarte Mumien# #[[1]]# bewachen wΓΌrden.", /*french*/ "Selon moi, les #Gibdos dans les couloirs# du Temple de l'Ombre protΓ¨gent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, las #momias reveladas por el Ojo de la Verdad# guardan #[[1]]#. @@ -1361,17 +1361,17 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, las #hojas invisibles# guardan #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST] = HintText(CustomMessage("They say that #falling spikes# block the path to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #fallende Stacheln# den Pfad zu #[[1]]# blockieren wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß ein von #fallenden Stacheln# blockierter Pfad #[[1]]# enthielte.", /*french*/ "Selon moi, la #pluie de clous# surplombe #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, los #pinchos de un techo# conducen a #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST] = HintText(CustomMessage("They say that #falling spikes# block the path to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #fallende Stacheln# den Pfad zu #[[1]]# blockieren wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß ein von #fallenden Stacheln# blockierter Pfad #[[1]]# enthielte.", /*french*/ "Selon moi, la #pluie de clous# surplombe #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, los #pinchos de un techo# conducen a #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST] = HintText(CustomMessage("They say that #falling spikes# block the path to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #fallende Stacheln# den Pfad zu #[[1]]# blockieren wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß ein von #fallenden Stacheln# blockierter Pfad #[[1]]# enthielte.", /*french*/ "Selon moi, la #pluie de clous# surplombe #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, los #pinchos de un techo# conducen a #[[1]]#. @@ -1386,12 +1386,12 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, un #cofre invisible custodiado por los del mΓ‘s allΓ‘# contiene #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST] = HintText(CustomMessage("They say that #mummies guarding a ferry# hide #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #eine FΓ€hre bewachende Mumien# #[[1]]# verstecken wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #Mumien die eine FΓ€hre bewachen# #[[1]]# verstecken wΓΌrden.", /*french*/ "Selon moi, les #Gibdos qui bloquent le traversier# cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, las #momias que protegen un navΓ­o# esconden #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST] = HintText(CustomMessage("They say that #mummies guarding a ferry# hide #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #eine FΓ€hre bewachende Mumien# #[[1]]# verstecken wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #Mumien die eine FΓ€hre bewachen# #[[1]]# verstecken wΓΌrden.", /*french*/ "Selon moi, les #Gibdos qui bloquent le traversier# cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, las #momias que protegen un navΓ­o# esconden #[[1]]#. @@ -1406,7 +1406,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, las #paredes consumidas por una esfera Γ­gnea# revelan #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_FREESTANDING_KEY] = HintText(CustomMessage("They say that #inside a burning skull# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #innerhalb eines brennenden SchΓ€dels# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß #innerhalb eines brennenden SchΓ€dels# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, #dans un crΓ’ne enflammΓ©# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, en el #interior de una calavera en llamas# aguarda #[[1]]#. @@ -1416,12 +1416,12 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, el #Ojo de la Verdad# descubre un pasillo de facetas con #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST] = HintText(CustomMessage("They say that #Dead Hand in the Shadow Temple# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #tote Hand im Schattentempel# #[[1]]# hielte.", + /*german*/ "Man erzΓ€hlt sich, daß der #Hirnsauger im Schattentempel# #[[1]]# hielte.", /*french*/ "Selon moi, le #Poigneur dans le Temple de l'Ombre# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la #Mano Muerta del Templo de las Sombras# guarda #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST] = HintText(CustomMessage("They say that #mummies revealed by the Eye of Truth# guard #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #durch das Auge der Wahrheit offenbarte Mumien# #[[1]]# bewachen wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #vom Auge der Wahrheit offenbarte Mumien# #[[1]]# bewachen wΓΌrden.", /*french*/ "Selon moi, les #Gibdos dans les couloirs# du Temple de l'Ombre protΓ¨gent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, las #momias reveladas por el Ojo de la Verdad# guardan #[[1]]#. @@ -1436,17 +1436,17 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, hacerte con las #rupias en una gran caverna# del Templo de las Sombras revela #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST] = HintText(CustomMessage("They say that #falling spikes# block the path to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #fallende Stachel# den Pfad zu #[[1]]# blockieren wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß ein von #fallenden Stacheln# blockierter Pfad #[[1]]# enthielte.", /*french*/ "Selon moi, la #pluie de clous# surplombe #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, los #pinchos de un techo# conducen a #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST] = HintText(CustomMessage("They say that #falling spikes# block the path to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #fallende Stachel# den Pfad zu #[[1]]# blockieren wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß ein von #fallenden Stacheln# blockierter Pfad #[[1]]# enthielte.", /*french*/ "Selon moi, la #pluie de clous# surplombe #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, los #pinchos de un techo# conducen a #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST] = HintText(CustomMessage("They say that #falling spikes# block the path to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #fallende Stachel# den Pfad zu #[[1]]# blockieren wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß ein von #fallenden Stacheln# blockierter Pfad #[[1]]# enthielte.", /*french*/ "Selon moi, la #pluie de clous# surplombe #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, los #pinchos de un techo# conducen a #[[1]]#. @@ -1466,7 +1466,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, las #paredes consumidas por una esfera Γ­gnea# revelan #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST] = HintText(CustomMessage("They say that near an #empty pedestal# within the Shadow Temple lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß nahe einem #leeren Sockel# im Schattentempel #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß nahe eines #leeren Podests# innerhalb des Schattentempels #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, #prΓ¨s d'un pΓ©destal vide du Temple de l'Ombre# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, cerca de un #vacΓ­o pedestal# del Templo de las Sombras yace #[[1]]#. @@ -1486,22 +1486,22 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, un #cofre invisible custodiado por los del mΓ‘s allΓ‘# contiene #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST] = HintText(CustomMessage("They say that #mummies guarding a ferry# hide #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #eine FΓ€hre bewachende Mumien# #[[1]]# verstecken wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #Mumien die eine FΓ€hre bewachen# #[[1]]# verstecken wΓΌrden.", /*french*/ "Selon moi, les #Gibdos qui bloquent le traversier# cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, las #momias que protegen un navΓ­o# esconden #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST] = HintText(CustomMessage("They say that #mummies guarding a ferry# hide #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #eine FΓ€hre bewachende Mumien# #[[1]]# verstecken wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #Mumien die eine FΓ€hre bewachen# #[[1]]# verstecken wΓΌrden.", /*french*/ "Selon moi, les #Gibdos qui bloquent le traversier# cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, las #momias que protegen un navΓ­o# esconden #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST] = HintText(CustomMessage("They say that #caged near a ship# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #in der NΓ€he eines Schiffes eingesperrt# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß #in der NΓ€he eines Schiffes eingesperrt# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, #dans une cage prΓ¨s du traversier# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #entre rejas al lado de un navΓ­o# yace #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_FREESTANDING_KEY] = HintText(CustomMessage("They say that #behind three burning skulls# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #hinter drei brennenden SchΓ€deln# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß #hinter drei brennenden SchΓ€deln# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, #derriΓ¨re trois crΓ’nes enflammΓ©s# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, tras #tres ardientes calaveras# yace #[[1]]#. @@ -1511,7 +1511,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, #Bongo Bongo# porta #[[1]]#. {}, { CustomMessage("They say that the #Phantom Shadow Beast# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Phantomschattenbiest# #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß die #bestialische SchattenmonstrositΓ€t# #[[1]]# besÀße.", /*french*/ "Selon moi, le #monstre de l'ombre# possΓ¨de #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ SegΓΊn dicen, la #alimaΓ±a oscura espectral# porta #[[1]]#. @@ -1536,7 +1536,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, una #Skulltula custodiada por hojas invisibles# otorga #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_GS_NEAR_SHIP] = HintText(CustomMessage("They say that a spider near a #docked ship# hoards #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine Spinne nahe eines #geankerten Schiffs# #[[1]]# horte.", + /*german*/ "Man erzΓ€hlt sich, daß eine Spinne nahe eines #geankerten Schiffes# #[[1]]# horte.", /*french*/ "Selon moi, une #Skulltula prΓ¨s du traversier du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula cercana a un navΓ­o# otorga #[[1]]#. @@ -1551,7 +1551,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, una #Skulltula entre ventarrones# del Templo de las Sombras otorga #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_GS_AFTER_WIND] = HintText(CustomMessage("They say that a #spider beneath gruesome debris# in the Shadow Temple hides #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne unterhalb grauenvoller TrΓΌmmer# im Schattentempel #[[1]]# verstecke.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne, unterhalb grauenvoller TrΓΌmmer# im Schattentempel, #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula sous des dΓ©bris du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula bajo unos horripilantes escombros# del Templo de las Sombras otorga #[[1]]#. @@ -1561,12 +1561,12 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, una #estatua caΓ­da# revelarΓ‘ una Skulltula que otorgue #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS] = HintText(CustomMessage("They say that a #suspended spider# guards #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #hΓ€ngende Spinne# #[[1]]# bewache.", + /*german*/ "Man erzΓ€hlt sich, daß eine #schwebende Spinne# #[[1]]# bewache.", /*french*/ "Selon moi, une #Skulltula prΓ¨s du repΓ¨re du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula flotante# del Templo de las Sombras otorga #[[1]]#. hintTextTable[RHT_POT_SHADOW_TEMPLE] = HintText(CustomMessage("They say that a #pot in Shadow Temple# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Vase im Schattentempel# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Krug im Schattentempel# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Temple de l'Ombre# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_SHADOW_TEMPLE_HEART] = HintText(CustomMessage("They say that a #heart in the Shadow Temple# hides #[[1]]#.", @@ -1574,15 +1574,15 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*french*/ "Selon moi, un #coeur dans le Temple de l'Ombre# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY] = HintText(CustomMessage("They say that an #calling the rain for a sentry guarding a house of the dead# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Anrufen des Regens fΓΌr einen ΓΌber ein Haus der Toten wachenden Posten# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Anrufen des Regens, nahe eines Wachpostens des Hauses der Toten#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #appeler la pluie pour une sentinelle gardant une maison des morts# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_SHADOW_TEMPLE_PIT_STORM_FAIRY] = HintText(CustomMessage("They say that an #calling the rain on a platform suspended above a bottomless pit# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Anrufen des Regens auf einer ΓΌber einer bodenlosen Grube hΓ€ngenden Plattform# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Anrufen des Regens, auf einer Plattform, welche ΓΌber einer bodenlosen Grube schwebt#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #appeler la pluie sur une plateforme suspendue au-dessus d’un gouffre sans fond# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY] = HintText(CustomMessage("They say that an #calling the sun near an invisible chest guarded by the dead# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Anrufen der Sonne nahe einer von Toten bewachten unsichtbaren Truhe# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Anrufen der Sonne, nahe einer von Toten bewachten unsichtbaren Truhe#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #appeler le soleil prΓ¨s d’un coffre invisible gardΓ© par les morts# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_SHADOW_TEMPLE] = HintText(CustomMessage("They say that a #crate in Shadow Temple# contains #[[1]]#.", @@ -1608,72 +1608,72 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, el #Ojo de la Verdad en el pozo# revela #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_COMPASS_CHEST] = HintText(CustomMessage("They say that a #hidden entrance to a cage# in the well leads to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #verborgener Eingang zu einem KΓ€fig# im Brunnen zu #[[1]]# fΓΌhre.", + /*german*/ "Man erzΓ€hlt sich, daß ein #verborgener Eingang zu einem KΓ€fig# im Brunnen #[[1]]# verstecke.", /*french*/ "Selon moi, dans un #chemin cachΓ© dans le Puits# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la #entrada oculta de una celda# del pozo conduce a #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST] = HintText(CustomMessage("They say that a #spider guarding a cage# in the well protects #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #einen KΓ€fig schΓΌtzende Spinne# im Brunnen #[[1]]# schΓΌtze.", + /*german*/ "Man erzΓ€hlt sich, daß eine #KΓ€fig schΓΌtzende Spinne# im Brunnen #[[1]]# schΓΌtze.", /*french*/ "Selon moi, l'#araignΓ©e dans la cage du Puits# protΓ¨ge #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #araΓ±a protegiendo una celda# del pozo guarda #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST] = HintText(CustomMessage("They say that #gruesome debris# in the well hides #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #grauenvolle TrΓΌmmer# im Brunnen #[[1]]# verbergen wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß #grauenvolle TrΓΌmmer# im Brunnen #[[1]]# verbergen wΓΌrden.", /*french*/ "Selon moi, des #dΓ©bris dans le Puits# cachent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, unos #horripilantes escombros# del pozo esconden #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST] = HintText(CustomMessage("They say that #Dead Hand's invisible secret# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #unsichtbare Geheimnis der toten Hand# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß das #unsichtbare Geheimnis des Hirnsaugers# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #trΓ©sor invisible du Poigneur# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #secreto invisible de la Mano Muerta# esconde #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST] = HintText(CustomMessage("They say that a #royal melody in the well# uncovers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #kΓΆnigliche Melodie im Brunnen# #[[1]]# enthΓΌllen wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß eine #kΓΆnigliche Melodie im Brunnen# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, la #mΓ©lodie royale rΓ©vΓ¨le dans le Puits# #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #melodΓ­a real en el pozo# revela #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST] = HintText(CustomMessage("They say that a #royal melody in the well# uncovers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #kΓΆnigliche Melodie im Brunnen# #[[1]]# enthΓΌllen wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß eine #kΓΆnigliche Melodie im Brunnen# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, la #mΓ©lodie royale rΓ©vΓ¨le dans le Puits# #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #melodΓ­a real en el pozo# revela #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_MAP_CHEST] = HintText(CustomMessage("They say that in the #depths of the well# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß in den #Tiefen des Brunnens# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß in den #Tiefen des Brunnens# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, #dans le coeur du Puits# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, en las #profundidades del pozo# yace #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST] = HintText(CustomMessage("They say that #perilous pits# in the well guard the path to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #gefΓ€hrliche Gruben# im Brunnen den Pfad zu #[[1]]# bewachen wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß der von #gefΓ€hrlichen Gruben# bewachte Pfad im Brunnen #[[1]]# enthielte.", /*french*/ "Selon moi, #trois trous# dans le Puits protΓ¨gent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #peligrosos fosos# del pozo conducen a #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST] = HintText(CustomMessage("They say that #locked in a cage# in the well lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #in einem KΓ€fig eingeschlossen# im Brunnen #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß #in einem KΓ€fig eingeschlossen#, im Brunnen #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, #dans une cage# du Puits gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #entre rejas# en el pozo yace #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_FREESTANDING_KEY] = HintText(CustomMessage("They say that #inside a coffin# hides #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #in einem Sarg# #[[1]]# verborgen lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß #in einem Sarg# #[[1]]# verborgen |sei|seien|.", /*french*/ "Selon moi, dans #un cercueil# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, en el #interior de un ataΓΊd# yace #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST] = HintText(CustomMessage("They say that a #royal melody in the well# uncovers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #kΓΆnigliche Melodie im Brunnen# #[[1]]# enthΓΌllen wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß eine #kΓΆnigliche Melodie im Brunnen# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, la #mΓ©lodie royale rΓ©vΓ¨le dans le Puits# #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #melodΓ­a real en el pozo# revela #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST] = HintText(CustomMessage("They say that an #army of the dead# in the well guards #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Armee der Toten# im Brunnen #[[1]]# bewachen wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Armee der Toten# im Brunnen #[[1]]# bewache.", /*french*/ "Selon moi, l'#armΓ©e des morts# dans le Puits protΓ¨ge #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #ejΓ©rcito del mΓ‘s allΓ‘# del pozo guarda #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY] = HintText(CustomMessage("They say that #Dead Hand's explosive secret# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #explosive Geheimnis der toten Hand# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß das #explosive Geheimnis des Hirnsaugers# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #secret explosif du Poigneur# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #explosivo secreto de la Mano Muerta# esconde #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY] = HintText(CustomMessage("They say that an #invisible path in the well# leads to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #unsichtbarer Pfad im Brunnen# zu #[[1]]# fΓΌhre.", + /*german*/ "Man erzΓ€hlt sich, daß ein #unsichtbarer Pfad im Brunnen# #[[1]]# verschleiere.", /*french*/ "Selon moi, dans un #chemin cachΓ© dans le Puits# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #camino invisible del pozo# conduce a #[[1]]#. @@ -1683,12 +1683,12 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, una #Skulltula enjaulada# del pozo otorga #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM] = HintText(CustomMessage("They say that an #invisible path in the well# leads to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #unsichtbarer Pfad im Brunnen# zu #[[1]]# fΓΌhre.", + /*german*/ "Man erzΓ€hlt sich, daß ein #unsichtbarer Pfad im Brunnen# #[[1]]# verschleiere.", /*french*/ "Selon moi, une #Skulltula dans le chemin invisible au fonds du Puits# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #camino invisible del pozo# conduce a una Skulltula que otorga #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM] = HintText(CustomMessage("They say that a #spider locked in a crypt# within the well guards #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #in einer Krypta eingeschlossene Spinne# im Brunnen #[[1]]# bewache.", + /*german*/ "Man erzΓ€hlt sich, daß eine #in einer Krypta eingeschlossene Spinne# innerhalb des Brunnens #[[1]]# bewache.", /*french*/ "Selon moi, une #Skulltula embarrΓ©e dans la crypte au fonds du Puits# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula encerrada en una cripta# del pozo otorga #[[1]]#. @@ -1703,20 +1703,20 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, una #Skulltula junto a los muertos# del pozo otorga #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM] = HintText(CustomMessage("They say that a #spider locked in a crypt# within the well guards #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #in einer Krypta eingeschlossene Spinne# im Brunnen #[[1]]# bewache.", + /*german*/ "Man erzΓ€hlt sich, daß eine #in einer Krypta eingeschlossene Spinne# innerhalb des Brunnens #[[1]]# bewache.", /*french*/ "Selon moi, une #Skulltula embarrΓ©e dans la crypte au fonds du Puits# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula encerrada en una cripta# del pozo otorga #[[1]]#. hintTextTable[RHT_POT_BOTTOM_OF_THE_WELL] = HintText(CustomMessage("They say that a #pot in Bottom of the Well# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Vase auf dem Grund des Brunnens# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Krug auf dem Grund des Brunnens# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Puits# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_BOTTOM_OF_THE_WELL_HEART] = HintText(CustomMessage("They say that a #heart within the well# hides #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Herz im Brunnen# #[[1]]# verstecke.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Herz innerhalb des Brunnens# #[[1]]# verstecke.", /*french*/ "Selon moi, un #coeur dans le Puits# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_BOTTOM_OF_THE_WELL_RUPEE] = HintText(CustomMessage("They say that a #hidden path through the floor# in the well leads to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #versteckter Pfad durch den Boden# im Brunnen zu #[[1]]# fΓΌhre.", + /*german*/ "Man erzΓ€hlt sich, daß ein #im Boden versteckter Pfad# im Brunnen #[[1]]# enthielte.", /*french*/ "Selon moi, un #passage cachΓ© sous le sol# dans le puits mΓ¨ne Γ  #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY] = HintText(CustomMessage("They say that an #calling the sun a dead end# within the well reveals #[[1]]#.", @@ -1800,7 +1800,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, una #Skulltula sobre gΓ©lidos vacΓ­os# otorga #[[1]]#. hintTextTable[RHT_ICE_CAVERN_MQ_GS_ICE_BLOCK] = HintText(CustomMessage("They say that a #web of ice# surrounds a spider with #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Webe aus Eis# eine Spinne umgebe, welche #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Weben aus Eis# eine Spinne umgebe, welche #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula protΓ©gΓ©e d'une toile glacΓ©e# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #gΓ©lida red# rodea a una Skulltula que otorga #[[1]]#. @@ -1810,11 +1810,11 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, una #Skulltula tras un ardiente hielo# otorga #[[1]]#. hintTextTable[RHT_POT_ICE_CAVERN] = HintText(CustomMessage("They say that a #pot in Ice Cavern# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Vase in der Eiskaverne# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Krug in der EishΓΆhle# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la Caverne Polaire# contient #[[1]]#.", { QM_RED, QM_GREEN })); hintTextTable[RHT_ICE_CAVERN_HEART] = HintText(CustomMessage("They say that atop on a #frozen pillar# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf einer #gefrorenen SΓ€ule# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß auf einer #gefrorenen SΓ€ule# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, le dessus d'un #pilier de glace# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_ICE_CAVERN_RUPEE] = HintText(CustomMessage("They say that a #rupee in a frozen cavern# hides #[[1]]#.", @@ -1822,7 +1822,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*french*/ "Selon moi, un #rubis dans la Caverne Polaire# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling the rain near the entrance to a frozen cave# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Anrufen des Regens in der NΓ€he des Eingangs zu einer gefrorenen Kaverne# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Anrufen des Regens in der NΓ€he des Eingangs einer gefrorenen HΓΆhle# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #appeler la pluie prΓ¨s de l’entrΓ©e d’une grotte gelΓ©e# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula tras un ardiente hielo# otorga #[[1]]#. @@ -1830,62 +1830,62 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { | Gerudo Training Ground | ---------------------------*/ hintTextTable[RHT_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST] = HintText(CustomMessage("They say that a #blinded eye in the Gerudo Training Ground# drops #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #erblindetes Auge auf dem Gerudo-TrainingsgelΓ€nde# #[[1]]# fallen ließe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #erblindetes Auge in der Gerudo-Trainingsarena# #[[1]]# fallen ließe.", /*french*/ "Selon moi, l'#Oeil dans le Gymnase Gerudo# voit #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #cegar un ojo en el Centro de InstrucciΓ³n Gerudo# revela #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST] = HintText(CustomMessage("They say that a #blinded eye in the Gerudo Training Ground# drops #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #erblindetes Auge auf dem Gerudo-TrainingsgelΓ€nde# #[[1]]# fallen ließe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #erblindetes Auge in der Gerudo-Trainingsarena# #[[1]]# fallen ließe.", /*french*/ "Selon moi, l'#Oeil dans le Gymnase Gerudo# voit #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #cegar un ojo en el Centro de InstrucciΓ³n Gerudo# revela #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_STALFOS_CHEST] = HintText(CustomMessage("They say that #soldiers walking on shifting sands# in the Gerudo Training Ground guard #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #auf verΓ€nderlichen Sanden laufende Soldaten# auf dem Gerudo-TrainingsgelΓ€nde #[[1]]# bewachen wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #auf Treibsand laufende Soldaten# in der Gerudo-Trainingsarena #[[1]]# bewachen wΓΌrden.", /*french*/ "Selon moi, les #squelettes# du Gymnase Gerudo protΓ¨gent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #soldados en resbaladizas arenas# del Centro de InstrucciΓ³n Gerudo protegen #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_BEAMOS_CHEST] = HintText(CustomMessage("They say that #reptilian warriors# in the Gerudo Training Ground protect #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #reptilienartige Krieger# auf dem Gerudo-TrainingsgelΓ€nde #[[1]]# schΓΌtzen wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #reptilienartige Krieger# in der Gerudo-Trainingsarena #[[1]]# schΓΌtzen wΓΌrden.", /*french*/ "Selon moi, les #lΓ©zards# dans le Gymnase Gerudo protΓ¨gent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #unos escamosos guerreros# del Centro de InstrucciΓ³n Gerudo protegen #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth# in the Gerudo Training Ground reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Auge der Wahrheit# auf dem Gerudo-TrainingsgelΓ€nde #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Auge der Wahrheit# in der Gerudo-Trainingsarena #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #bien cachΓ©# dans le Gymnase Gerudo gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #Ojo de la Verdad# en el Centro de InstrucciΓ³n Gerudo revela #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST] = HintText(CustomMessage("They say that the first prize of #the thieves' training# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der erste Preis des #Diebestrainings# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß der erste Preis des #Diebestrainings# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #premier trΓ©sor du Gymnase Gerudo# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el primer premio de la #instrucciΓ³n bandida# se trata de #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST] = HintText(CustomMessage("They say that the second prize of #the thieves' training# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der zweite Preis des #Diebestrainings# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß der zweite Preis des #Diebestrainings# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #deuxiΓ¨me trΓ©sor du Gymnase Gerudo# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el segundo premio de la #instrucciΓ³n bandida# se trata de #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST] = HintText(CustomMessage("They say that the third prize of #the thieves' training# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der dritte Preis des #Diebestrainings# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß der dritte Preis des #Diebestrainings# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #troisiΓ¨me trΓ©sor du Gymnase Gerudo# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el tercer premio de la #instrucciΓ³n bandida# se trata de #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST] = HintText(CustomMessage("They say that the #Song of Time# in the Gerudo Training Ground leads to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #Hymne der Zeit# auf dem Gerudo-TrainingsgelΓ€nde zu #[[1]]# fΓΌhre.", + /*german*/ "Man erzΓ€hlt sich, daß die #Hymne der Zeit# in der Gerudo-Trainingsarena #[[1]]# gewΓ€hre.", /*french*/ "Selon moi, le #chant du temps# rΓ©vΓ¨le dans le Gymnase Gerudo #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la #CanciΓ³n del Tiempo# en el Centro de InstrucciΓ³n Gerudo conduce a #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST] = HintText(CustomMessage("They say that the #Song of Time# in the Gerudo Training Ground leads to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #Hymne der Zeit# auf dem Gerudo-TrainingsgelΓ€nde zu #[[1]]# fΓΌhre.", + /*german*/ "Man erzΓ€hlt sich, daß die #Hymne der Zeit# in der Gerudo-Trainingsarena #[[1]]# gewΓ€hre.", /*french*/ "Selon moi, le #chant du temps# rΓ©vΓ¨le dans le Gymnase Gerudo #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la #CanciΓ³n del Tiempo# en el Centro de InstrucciΓ³n Gerudo conduce a #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST] = HintText(CustomMessage("They say that #fiery foes# in the Gerudo Training Ground guard #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #feurige Feinde# auf dem Gerudo-TrainingsgelΓ€nde #[[1]]# bewachen wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #feurige Feinde# in der Gerudo-Trainingsarena #[[1]]# bewachen wΓΌrden.", /*french*/ "Selon moi, les #limaces de feu# du Gymnase Gerudo protΓ¨gent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, unos #flamΓ­geros enemigos# del Centro de InstrucciΓ³n Gerudo guardan #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST] = HintText(CustomMessage("They say that #engulfed in flame# where thieves train lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #von Flammen umschlungen# wo Diebe trainieren #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß #von Flammen umschlungen# wo Diebe trainieren #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, le #trΓ©sor enflammΓ©# du Gymnase Gerudo est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, donde entrenan las bandidas #entre llamas# yace #[[1]]#. @@ -1900,56 +1900,56 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, las bandidas #ciegan cuatro bustos# para hallar #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST] = HintText(CustomMessage("They say that #before a block of silver# thieves can find #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #vor einem Block aus Silber# Diebe #[[1]]# finden kΓΆnnten.", + /*german*/ "Man erzΓ€hlt sich, daß Diebe #vor einem Block aus Silber# #[[1]]# finden kΓΆnnten.", /*french*/ "Selon moi, #prΓ¨s d'un bloc argent# dans le Gymnase Gerudo gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #ante un plateado bloque# las bandidas hallan #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST] = HintText(CustomMessage("They say that a #feat of strength# rewards thieves with #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #MeisterstΓΌck der StΓ€rke# Diebe mit #[[1]]# belohnen wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß Diebe durch einen #Kraftakt# #[[1]]# plΓΌndern kΓΆnnten.", /*french*/ "Selon moi, #derriΓ¨re un bloc argent# dans le Gymnase Gerudo gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #hazaΓ±a de fuerza# premia a las bandidas con #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST] = HintText(CustomMessage("They say that a #feat of strength# rewards thieves with #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #MeisterstΓΌck der StΓ€rke# Diebe mit #[[1]]# belohnen wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß Diebe durch einen #Kraftakt# #[[1]]# plΓΌndern kΓΆnnten.", /*french*/ "Selon moi, #derriΓ¨re un bloc argent# dans le Gymnase Gerudo gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #hazaΓ±a de fuerza# premia a las bandidas con #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST] = HintText(CustomMessage("They say that a #feat of strength# rewards thieves with #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #MeisterstΓΌck der StΓ€rke# Diebe mit #[[1]]# belohnen wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß Diebe durch einen #Kraftakt# #[[1]]# plΓΌndern kΓΆnnten.", /*french*/ "Selon moi, #derriΓ¨re un bloc argent# dans le Gymnase Gerudo gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #hazaΓ±a de fuerza# premia a las bandidas con #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST] = HintText(CustomMessage("They say that a #feat of strength# rewards thieves with #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #MeisterstΓΌck der StΓ€rke# Diebe mit #[[1]]# belohnen wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß Diebe durch einen #Kraftakt# #[[1]]# plΓΌndern kΓΆnnten.", /*french*/ "Selon moi, #derriΓ¨re un bloc argent# dans le Gymnase Gerudo gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #hazaΓ±a de fuerza# premia a las bandidas con #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling the rain near the entrance to the Gerudo Training Ground# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Anrufen des Regens in der NΓ€he des Eingangs zum Gerudo-TrainingsgelΓ€nde #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Anrufen des Regens in der NΓ€he des Eingangs der Gerudo-Trainingsarena #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #appeler la pluie prΓ¨s de l’entrΓ©e du Gymnase Gerudo# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GERUDO_TRAINING_GROUND_FREESTANDING_KEY] = HintText(CustomMessage("They say that the #Song of Time# in the Gerudo Training Ground leads to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #Hymne der Zeit# auf dem Gerudo-TrainingsgelΓ€nde zu #[[1]]# fΓΌhre.", + /*german*/ "Man erzΓ€hlt sich, daß die #Hymne der Zeit# in der Gerudo-Trainingsarena #[[1]]# gewΓ€hre.", /*french*/ "Selon moi, le #chant du temps# rΓ©vΓ¨le dans le Gymnase Gerudo #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la #CanciΓ³n del Tiempo# en el Centro de InstrucciΓ³n Gerudo conduce a #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST] = HintText(CustomMessage("They say that #thieves prepare for training# with #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß sich #Diebe auf das Training vorbereiteten# mit #[[1]]#.", + /*german*/ "Man erzΓ€hlt sich, daß #Diebe sich auf das Training vorbereiteten# und #[[1]]# ergattern.", /*french*/ "Selon moi, dans #l'entrΓ©e du Gymnase Gerudo# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, las #bandidas se instruyen# con #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST] = HintText(CustomMessage("They say that #thieves prepare for training# with #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß sich #Diebe auf das Training vorbereiteten# mit #[[1]]#.", + /*german*/ "Man erzΓ€hlt sich, daß #Diebe sich auf das Training vorbereiteten# und #[[1]]# ergattern.", /*french*/ "Selon moi, dans #l'entrΓ©e du Gymnase Gerudo# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, las #bandidas se instruyen# con #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST] = HintText(CustomMessage("They say that #soldiers walking on shifting sands# in the Gerudo Training Ground guard #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #auf verΓ€nderlichen Sanden laufende Soldaten# auf dem Gerudo-TrainingsgelΓ€nde #[[1]]# bewachen wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #auf Treibsand laufende Soldaten# in der Gerudo-Trainingsarena #[[1]]# bewachen wΓΌrden.", /*french*/ "Selon moi, les #squelettes# du Gymnase Gerudo protΓ¨gent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #soldados en resbaladizas arenas# del Centro de InstrucciΓ³n Gerudo protegen #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST] = HintText(CustomMessage("They say that #before a block of silver# thieves can find #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #vor einem Block aus Silber# Diebe #[[1]]# finden kΓΆnnten.", + /*german*/ "Man erzΓ€hlt sich, daß Diebe #vor einem Block aus Silber# #[[1]]# finden kΓΆnnten.", /*french*/ "Selon moi, #prΓ¨s d'un bloc argent# dans le Gymnase Gerudo gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #ante un plateado bloque# las bandidas hallan #[[1]]#. @@ -1959,68 +1959,68 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, las bandidas #ciegan cuatro bustos# para hallar #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST] = HintText(CustomMessage("They say that #engulfed in flame# where thieves train lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #von Flammen umschlungen# wo Diebe trainieren #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß #von Flammen umschlungen# wo Diebe trainieren #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, le #trΓ©sor enflammΓ©# du Gymnase Gerudo est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, donde entrenan las bandidas #entre llamas# yace #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST] = HintText(CustomMessage("They say that #fiery foes# in the Gerudo Training Ground guard #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #feurige Feinde# auf dem Gerudo-TrainingsgelΓ€nde #[[1]]# bewachen wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #feurige Feinde# in der Gerudo-Trainingsarena #[[1]]# bewachen wΓΌrden.", /*french*/ "Selon moi, les #ennemis de feu# du Gymnase Gerudo protΓ¨gent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, unos #flamΓ­geros enemigos# del Centro de InstrucciΓ³n Gerudo guardan #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST] = HintText(CustomMessage("They say that #reptilian warriors# in the Gerudo Training Ground protect #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #reptilienartige Krieger# auf dem Gerudo-TrainingsgelΓ€nde #[[1]]# schΓΌtzen wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #reptilienartige Krieger# in der Gerudo-Trainingsarena #[[1]]# schΓΌtzen wΓΌrden.", /*french*/ "Selon moi, les #lΓ©zards# dans le Gymnase Gerudo protΓ¨gent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #unos escamosos guerreros# del Centro de InstrucciΓ³n Gerudo protegen #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST] = HintText(CustomMessage("They say that a #path of fire# leads thieves to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Pfad des Feuers# Diebe zu #[[1]]# fΓΌhre.", + /*german*/ "Man erzΓ€hlt sich, daß Diebe den #Pfad des Feuers# beschreiten und #[[1]]# finden wΓΌrden.", /*french*/ "Selon moi, dans le #chemin enflammΓ©# dans le Gymnase Gerudo gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #camino de fuego# conduce a las bandidas a #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST] = HintText(CustomMessage("They say that the first prize of #the thieves' training# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der erste Preis des #Diebestrainings# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß der erste Preis des #Diebestrainings# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #premier trΓ©sor du Gymnase Gerudo# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el primer premio de la #instrucciΓ³n bandida# se trata de #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST] = HintText(CustomMessage("They say that a #path of fire# leads thieves to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Pfad des Feuers# Diebe zu #[[1]]# fΓΌhre.", + /*german*/ "Man erzΓ€hlt sich, daß Diebe den #Pfad des Feuers# beschreiten und #[[1]]# finden wΓΌrden.", /*french*/ "Selon moi, dans le #chemin enflammΓ©# dans le Gymnase Gerudo gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #camino de fuego# conduce a las bandidas a #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST] = HintText(CustomMessage("They say that the third prize of #the thieves' training# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der dritte Preis des #Diebestrainings# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß der dritte Preis des #Diebestrainings# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #troisiΓ¨me trΓ©sor du Gymnase Gerudo# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el tercer premio de la #instrucciΓ³n bandida# se trata de #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST] = HintText(CustomMessage("They say that the second prize of #the thieves' training# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der zweite Preis des #Diebestrainings# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß der zweite Preis des #Diebestrainings# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #deuxiΓ¨me trΓ©sor du Gymnase Gerudo# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el segundo premio de la #instrucciΓ³n bandida# se trata de #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth# in the Gerudo Training Ground reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Auge der Wahrheit# auf dem Gerudo-TrainingsgelΓ€nde #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Auge der Wahrheit# in der Gerudo-Trainingsarena #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #bien cachΓ©# dans le Gymnase Gerudo gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #Ojo de la Verdad# en el Centro de InstrucciΓ³n Gerudo revela #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST] = HintText(CustomMessage("They say that a #feat of strength# rewards thieves with #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #MeisterstΓΌck der StΓ€rke# Diebe mit #[[1]]# belohnen wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß Diebe durch einen #Kraftakt# #[[1]]# plΓΌndern kΓΆnnten.", /*french*/ "Selon moi, #derriΓ¨re un bloc argent# dans le Gymnase Gerudo gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #hazaΓ±a de fuerza# premia a las bandidas con #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUNDS_HEART] = HintText(CustomMessage("They say that a watching a #trial with Dinolfos# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das Sehen einer #PrΓΌfung mit Dinodorus# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß einer #PrΓΌfung mit Dinodorus# zuzuschauen #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, dans #une Γ©preuve avec un Dinolfos# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_GERUDO_TRAINING_GROUND] = HintText(CustomMessage("They say that a #crate in Gerudo Training Ground# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Kiste auf dem Gerudo-TrainingsgelΓ€nde# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Kiste in der Gerudo-Trainingsarena# #[[1]]# enthielte.", /*french*/ "Selon moi, une #caisse dans le Gymnase Gerudo# contient #[[1]]#.", {QM_RED, QM_GREEN})); /*-------------------------- | GANONS CASTLE | ---------------------------*/ hintTextTable[RHT_GANONS_TOWER_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that the #Evil King# hoards #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #bΓΆse KΓΆnig# #[[1]]# horte.", + /*german*/ "Man erzΓ€hlt sich, daß der #Großmeister des BΓΆsen# #[[1]]# horte.", /*french*/ "Selon moi, le #Roi du Mal# possΓ¨de #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #Rey del Mal# acapara #[[1]]#. @@ -2040,7 +2040,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, la #prueba del mar# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST] = HintText(CustomMessage("They say that #music in the test of darkness# unveils #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Musik in der PrΓΌfung des Dunkelheit# #[[1]]# enthΓΌllen wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß #Musik in der PrΓΌfung der Dunkelheit# #[[1]]# enthΓΌllen wΓΌrde.", /*french*/ "Selon moi, la #musique dans l'Γ©preuve des tΓ©nΓ¨bres# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la #mΓΊsica en la prueba de la oscuridad# revela #[[1]]#. @@ -2060,51 +2060,51 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, la #prueba de las arenas# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #PrΓΌfung des Glanzes# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß die #PrΓΌfung der Strahlen# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#Γ©preuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la #prueba del resplandor# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #PrΓΌfung des Glanzes# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß die #PrΓΌfung der Strahlen# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#Γ©preuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la #prueba del resplandor# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #PrΓΌfung des Glanzes# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß die #PrΓΌfung der Strahlen# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#Γ©preuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la #prueba del resplandor# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #PrΓΌfung des Glanzes# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß die #PrΓΌfung der Strahlen# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#Γ©preuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la #prueba del resplandor# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #PrΓΌfung des Glanzes# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß die #PrΓΌfung der Strahlen# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#Γ©preuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la #prueba del resplandor# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #PrΓΌfung des Glanzes# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß die #PrΓΌfung der Strahlen# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#Γ©preuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la #prueba del resplandor# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST] = HintText(CustomMessage("They say that the #test of radiance# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #PrΓΌfung des Glanzes# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß die #PrΓΌfung der Strahlen# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#Γ©preuve du ciel# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la #prueba del resplandor# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST] = HintText(CustomMessage("They say that #music in the test of radiance# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Musik in der PrΓΌfung des Glanzes# #[[1]]# enthΓΌllen wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß #Musik in der PrΓΌfung der Strahlen# #[[1]]# enthΓΌllen wΓΌrde.", /*french*/ "Selon moi, la #musique dans l'Γ©preuve du ciel# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la #mΓΊsica en la prueba del resplandor# revela #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun for a sentry in the test of the sands# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Anrufen der Sonne fΓΌr eine Wache in einer PrΓΌfung der Sande# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Anrufen der Sonne, fΓΌr einen Wachposten in der PrΓΌfung der Sande#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #appeler le soleil pour une sentinelle dans l’épreuve des sables# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GANONS_CASTLE_SCRUBS_FAIRY] = HintText(CustomMessage("They say that within a #sanctuary before the final trial# rests #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß innerhalb eines #Heiligtum vor der finalen PrΓΌfung# #[[1]]# ruhe.", + /*german*/ "Man erzΓ€hlt sich, daß innerhalb eines #Heiligtums vor der finalen PrΓΌfung# #[[1]]# |ruhe|ruhen|.", /*french*/ "Selon moi, #dans un sanctuaire avant l’épreuve finale# repose #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST] = HintText(CustomMessage("They say that the #test of the seas# holds #[[1]]#.", @@ -2123,7 +2123,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, la #prueba de la naturaleza# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST] = HintText(CustomMessage("They say that #music in the test of radiance# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Musik in der PrΓΌfung des Glanzes# #[[1]]# enthΓΌllen wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß #Musik in der PrΓΌfung der Strahlen# #[[1]]# enthΓΌllen wΓΌrde.", /*french*/ "Selon moi, la #musique dans l'Γ©preuve du ciel# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la #mΓΊsica en la prueba del resplandor# revela #[[1]]#. @@ -2173,52 +2173,52 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*spanish*/ SegΓΊn dicen, la #prueba de la naturaleza# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #Deku-HΓ€ndler in Ganons Schloß# #[[1]]# verkaufen wΓΌrden.", /*french*/ "Selon moi, les #pestes Mojo dans le ChΓ’teau de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #Deku-HΓ€ndler in Ganons Schloß# #[[1]]# verkaufen wΓΌrden.", /*french*/ "Selon moi, les #pestes Mojo dans le ChΓ’teau de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_DEKU_SCRUB_RIGHT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #Deku-HΓ€ndler in Ganons Schloß# #[[1]]# verkaufen wΓΌrden.", /*french*/ "Selon moi, les #pestes Mojo dans le ChΓ’teau de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_DEKU_SCRUB_LEFT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #Deku-HΓ€ndler in Ganons Schloß# #[[1]]# verkaufen wΓΌrden.", /*french*/ "Selon moi, les #pestes Mojo dans le ChΓ’teau de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #Deku-HΓ€ndler in Ganons Schloß# #[[1]]# verkaufen wΓΌrden.", /*french*/ "Selon moi, les #pestes Mojo dans le ChΓ’teau de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #Deku-HΓ€ndler in Ganons Schloß# #[[1]]# verkaufen wΓΌrden.", /*french*/ "Selon moi, les #pestes Mojo dans le ChΓ’teau de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #Deku-HΓ€ndler in Ganons Schloß# #[[1]]# verkaufen wΓΌrden.", /*french*/ "Selon moi, les #pestes Mojo dans le ChΓ’teau de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #Deku-HΓ€ndler in Ganons Schloß# #[[1]]# verkaufen wΓΌrden.", /*french*/ "Selon moi, les #pestes Mojo dans le ChΓ’teau de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT] = HintText(CustomMessage("They say that #scrubs in Ganon's Castle# sell #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Dekus in Ganons Schloß# #[[1]]# verkaufen wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #Deku-HΓ€ndler in Ganons Schloß# #[[1]]# verkaufen wΓΌrden.", /*french*/ "Selon moi, les #pestes Mojo dans le ChΓ’teau de Ganon# vendent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, los #dekus del Castillo de Ganon# venden #[[1]]#. hintTextTable[RHT_POT_GANONS_CASTLE] = HintText(CustomMessage("They say that a #pot in Ganon's Castle# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Vase in Ganons Schloß# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Krug in Ganons Schloß# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le ChΓ’teau de Ganon# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GANONS_CASTLE_HEART] = HintText(CustomMessage("They say that a #heart in Ganon's Castle# hides #[[1]]#.", diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp index cf7921eac..efe72b5cf 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp @@ -7,12 +7,12 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // clang-format off hintTextTable[RHT_KF_KOKIRI_SWORD_CHEST] = HintText(CustomMessage("They say that the #hidden treasure of the Kokiri# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #versteckte Schatz der Kokiri# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß der #versteckte Schatz der Kokiri# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #trΓ©sor des Kokiri# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #tesoro oculto de los Kokiri# esconde #[[1]]#. hintTextTable[RHT_KF_MIDOS_TOP_LEFT_CHEST] = HintText(CustomMessage("They say that #inside Mido's house# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #in Midos Haus# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß #in Midos Haus# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #dans la maison de Mido# gΓt #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, en la #casa de Mido# yace #[[1]]#. {}, { @@ -22,7 +22,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, el #lΓ­der de los Kokiri# esconde #[[1]]#. hintTextTable[RHT_KF_MIDOS_TOP_RIGHT_CHEST] = HintText(CustomMessage("They say that #inside Mido's house# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #in Midos Haus# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß #in Midos Haus# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #dans la maison de Mido# gΓt #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, en la #casa de Mido# yace #[[1]]#. {}, { @@ -32,7 +32,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, el #lΓ­der de los Kokiri# esconde #[[1]]#. hintTextTable[RHT_KF_MIDOS_BOTTOM_LEFT_CHEST] = HintText(CustomMessage("They say that #inside Mido's house# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #in Midos Haus# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß #in Midos Haus# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #dans la maison de Mido# gΓt #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, en la #casa de Mido# yace #[[1]]#. {}, { @@ -42,7 +42,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, el #lΓ­der de los Kokiri# esconde #[[1]]#. hintTextTable[RHT_KF_MIDOS_BOTTOM_RIGHT_CHEST] = HintText(CustomMessage("They say that #inside Mido's house# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #in Midos Haus# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß #in Midos Haus# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #dans la maison de Mido# gΓt #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, en la #casa de Mido# yace #[[1]]#. {}, { @@ -52,22 +52,22 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, el #lΓ­der de los Kokiri# esconde #[[1]]#. hintTextTable[RHT_GRAVEYARD_SHIELD_GRAVE_CHEST] = HintText(CustomMessage("They say that the #treasure of a fallen soldier# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Schatz eines gefallenen Soldaten# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß der #Schatz eines gefallenen Soldaten# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #trΓ©sor du soldat mort# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #tesoro de un soldado caΓ­do# esconde #[[1]]#. hintTextTable[RHT_DMT_CHEST] = HintText(CustomMessage("They say that hidden behind a wall on a #mountain trail# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß hinter einer Wand des #Gebirgspfads# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß hinter einer Wand eines #Gebirgspfades# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, derriΓ¨re une faΓ§ade du #chemin montagneux# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, tras una pared del #sendero de la montaΓ±a# yace #[[1]]#. hintTextTable[RHT_GC_MAZE_RIGHT_CHEST] = HintText(CustomMessage("They say that in #Goron City# explosives unlock #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß in #Goronia# Explosionen #[[1]]# freischalten wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß Explosionen in #Goronia# #[[1]]# freilegen wΓΌrden.", /*french*/ "Selon moi, des explosions dans le #village Goron# rΓ©vΓ¨lent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, en la #Ciudad Goron# unos explosivos desbloquean #[[1]]#. hintTextTable[RHT_GC_MAZE_CENTER_CHEST] = HintText(CustomMessage("They say that in #Goron City# explosives unlock #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß in #Goronia# Explosionen #[[1]]# freischalten wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß Explosionen in #Goronia# #[[1]]# freilegen wΓΌrden.", /*french*/ "Selon moi, des explosions dans le #village Goron# rΓ©vΓ¨lent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, en la #Ciudad Goron# unos explosivos desbloquean #[[1]]#. @@ -77,7 +77,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, las #llamas tras una una cascada# revelan #[[1]]#. hintTextTable[RHT_GRAVEYARD_HOOKSHOT_CHEST] = HintText(CustomMessage("They say that #dead DampΓ©'s first prize# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Igors erster Preis# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß #Boris' erster Preis# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, la #premiΓ¨re course d'Igor# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, el primer premio de #la carrera de DampΓ©# se trata de #[[1]]#. {}, { @@ -87,136 +87,136 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, un cofre custodiado por un #espectro veloz# contiene #[[1]]#. hintTextTable[RHT_GF_CHEST] = HintText(CustomMessage("They say that on a #rooftop in the desert# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf einem #Dach in der WΓΌste# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß auf einem #Dach in der WΓΌste# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, sur un #toit du dΓ©sert# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, en una #azotea del desierto# yace #[[1]]#. hintTextTable[RHT_KAK_REDEAD_GROTTO_CHEST] = HintText(CustomMessage("They say that #zombies beneath the earth# guard #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #Untoten unter der Erde# #[[1]]# bewachen wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #Untote unter der Erde# #[[1]]# bewachen wΓΌrden.", /*french*/ "Selon moi, les #revenants sous terre# protΓ¨gent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, unos #zombis subterrΓ‘neos# esconden #[[1]]#. hintTextTable[RHT_SFM_WOLFOS_GROTTO_CHEST] = HintText(CustomMessage("They say that #wolves beneath the earth# guard #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #WΓΆlfe unter der Erde# #[[1]]# bewachen wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #WΓΆlfe unter der Erde# #[[1]]# bewachen wΓΌrden.", /*french*/ "Selon moi, les #loups sous terre# protΓ¨gent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, unos #lobos subterrΓ‘neos# esconden #[[1]]#. hintTextTable[RHT_HF_NEAR_MARKET_GROTTO_CHEST] = HintText(CustomMessage("They say that a #hole in a field near a drawbridge# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Loch in einem Feld nahe der ZugbrΓΌcke# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Erdloch nahe der ZugbrΓΌcke in einer Steppe# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte prΓ¨s d'un pont# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, bajo el #hoyo de una llanura cercano a un puente# yace #[[1]]#. hintTextTable[RHT_HF_NEAR_MARKET_GROTTO_FISH] = HintText(CustomMessage("They say that a #fish in a hole in a field near a drawbridge# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Fisch in einem Loch in einem Feld nahe der ZugbrΓΌcke# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Fisch in einem Erdloch nahe der ZugbrΓΌcke einer Steppe# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte prΓ¨s d'un pont# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, bajo el #hoyo de una llanura cercano a un puente# yace #[[1]]#. hintTextTable[RHT_HF_SOUTHEAST_GROTTO_CHEST] = HintText(CustomMessage("They say that a #hole amongst trees in a field# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Loch inmitten der BΓ€ume in einem Feld# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Erdloch inmitten von BΓ€umen einer Steppe# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte prΓ¨s des arbres# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, bajo el #hoyo de una llanura rodeado de Γ‘rboles# yace #[[1]]#. hintTextTable[RHT_HF_SOUTHEAST_GROTTO_FISH] = HintText(CustomMessage("They say that a #fish in a hole amongst trees in a field# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Fisch in einem Loch inmitten von BΓ€umen in einem Feld# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Fisch in einem Erdloch inmitten von BΓ€umen einer Steppe# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte prΓ¨s des arbres# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, bajo el #hoyo de una llanura rodeado de Γ‘rboles# yace #[[1]]#. hintTextTable[RHT_HF_OPEN_GROTTO_CHEST] = HintText(CustomMessage("They say that an #open hole in a field# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #offenes Loch in einem Feld# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #offenes Erdloch einer Steppe# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte dans les plaines# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, bajo el #hoyo descubierto de una llanura# yace #[[1]]#. hintTextTable[RHT_HF_OPEN_GROTTO_FISH] = HintText(CustomMessage("They say that a #fish in an open hole in a field# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Fisch in einem offenen Loch auf einem Feld# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Fisch in einem offenen Erdloch einer Steppe# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte dans les plaines# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, bajo el #hoyo descubierto de una llanura# yace #[[1]]#. hintTextTable[RHT_KAK_OPEN_GROTTO_CHEST] = HintText(CustomMessage("They say that an #open hole in a town# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #offenes Loch in einer Stadt# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #offenes Erdloch eines Dorfes# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte dans le village# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, bajo el #hoyo descubierto de un pueblo# yace #[[1]]#. hintTextTable[RHT_KAK_OPEN_GROTTO_FISH] = HintText(CustomMessage("They say that a #fish in an open hole in a town# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Fisch in einem Loch in einer Stadt# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Fisch in einem offenen Erdloch eines Dorfes# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte dans le village# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, bajo el #hoyo descubierto de un pueblo# yace #[[1]]#. hintTextTable[RHT_ZR_OPEN_GROTTO_CHEST] = HintText(CustomMessage("They say that a #hole along a river# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Loch entlang eines Flusses# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Erdloch nahe eines Flußes# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte prΓ¨s du fleuve# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, bajo un #hoyo junto a un rΓ­o# yace #[[1]]#. hintTextTable[RHT_ZR_OPEN_GROTTO_FISH] = HintText(CustomMessage("They say that a #fish in a hole along a river# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Fisch in einem Loch entlang eines Flusses# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Fisch in einem Erdloch nahe eines Flußes# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte prΓ¨s du fleuve# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, bajo un #hoyo junto a un rΓ­o# yace #[[1]]#. hintTextTable[RHT_KF_STORMS_GROTTO_CHEST] = HintText(CustomMessage("They say that a #hole in a forest village# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Loch in einem Dorf des Waldes# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Erdloch eines Dorfes im Wald# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte inondΓ©e de pluie dans le Village Kokiri# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, bajo el #hoyo de una tribu del bosque# yace #[[1]]#. hintTextTable[RHT_KF_STORMS_GROTTO_FISH] = HintText(CustomMessage("They say that a #fish in a hole in a forest village# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Fisch in einem Loch in einem Dorf des Waldes# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Fisch in einem Erdloch eines Dorfes im Wald# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte inondΓ©e de pluie dans le Village Kokiri# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, bajo el #hoyo de una tribu del bosque# yace #[[1]]#. hintTextTable[RHT_LW_NEAR_SHORTCUTS_GROTTO_CHEST] = HintText(CustomMessage("They say that a #hole in a wooded maze# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Loch in einem hΓΆlzernen Labyrinth# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Erdloch eines hΓΆlzernen Labyrinths# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte dans le labyrinthe sylvestre# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, bajo un #hoyo de un laberinto forestal# yace #[[1]]#. hintTextTable[RHT_LW_NEAR_SHORTCUTS_GROTTO_FISH] = HintText(CustomMessage("They say that a #fish in a hole in a wooded maze# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Fisch in einem Loch in einem hΓΆlzernen Labyrinth# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Fisch in einem Erdloch eines hΓΆlzernen Labyrinths# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte dans le labyrinthe sylvestre# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, bajo un #hoyo de un laberinto forestal# yace #[[1]]#. hintTextTable[RHT_DMT_STORMS_GROTTO_CHEST] = HintText(CustomMessage("They say that #hole flooded with rain on a mountain# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #durch Regen geflutetes Loch auf einem Berg# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #durch Regen geflutetes Erdloch eines Berges# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte inondΓ©e de pluie sur la montagne# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, bajo un #hoyo de una montaΓ±a inundado de lluvia# yace #[[1]]#. hintTextTable[RHT_DMT_STORMS_GROTTO_FISH] = HintText(CustomMessage("They say that #fish in a hole flooded with rain on a mountain# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Fisch in einem durch Regen geflutetes Loch auf einem Berg# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Fisch in einem durch Regen geflutetem Erdloch eines Berges# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte inondΓ©e de pluie sur la montagne# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, bajo un #hoyo de una montaΓ±a inundado de lluvia# yace #[[1]]#. hintTextTable[RHT_DMC_UPPER_GROTTO_CHEST] = HintText(CustomMessage("They say that a #hole in a volcano# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Loch in einem Vulkan# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Erdloch eines Vulkans# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte dans le volcan# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, bajo el #hoyo de un volcΓ‘n# yace #[[1]]#. hintTextTable[RHT_DMC_UPPER_GROTTO_FISH] = HintText(CustomMessage("They say that a #fish in a hole in a volcano# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Fisch in einem Loch in einem Vulkan# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Fisch in einem Erdloch eines Vulkans# #[[1]]# enthielte.", /*french*/ "Selon moi, la #grotte dans le volcan# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, bajo el #hoyo de un volcΓ‘n# yace #[[1]]#. hintTextTable[RHT_TOT_MASTER_SWORD] = HintText(CustomMessage("They say that a #pedestal in a temple# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß sich auf einem #Podest in einem Tempel# #[[1]]# befΓ€nde.", + /*german*/ "Man erzΓ€hlt sich, daß sich auf einem #Podest eines Tempels# #[[1]]# |befΓ€nde|befΓ€nden|.", /*french*/ "Selon moi, un #piΓ©destal dans un temple# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #pedestal en un templo# sostiene #[[1]]#. hintTextTable[RHT_TOT_LIGHT_ARROWS_CUTSCENE] = HintText(CustomMessage("They say that the #final gift of a princess# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #letzte Geschenk einer Prinzessin# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß das #letzte Geschenk einer Prinzessin# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #cadeau d'adieu de la princesse# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #obsequio final de la princesa# se trata de #[[1]]#. hintTextTable[RHT_LW_GIFT_FROM_SARIA] = HintText(CustomMessage("They say that #Saria's Gift# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #Salias Geschenk# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß #Salias Geschenk# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #cadeau de Saria# est #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, el #regalo de Saria# se trata de #[[1]]#. {}, { CustomMessage("They say that a #potato hoarder# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Kartoffelhortender# #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Kartoffelhorter# #[[1]]# besÀße.", /*french*/ "Selon moi, le #panini mΓ©lodieux# est en fait #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, cierta #jovencita verde# concede #[[1]]#. CustomMessage("They say that a rooty tooty #flutey cutey# gifts #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #musikalische Kartoffel# #[[1]]# schenke.", + /*german*/ "Man erzΓ€hlt sich, daß die #musikalische Kartoffel# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, la #patate musicale# est en fait #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ SegΓΊn dicen, una #gran amiga# concede #[[1]]#. hintTextTable[RHT_ZF_GREAT_FAIRY_REWARD] = HintText(CustomMessage("They say that the #fairy of winds# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #Fee der Winde# #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß die #Fee des Sturmes# #[[1]]# besÀße.", /*french*/ "Selon moi, la #fΓ©e du vent# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #hada del viento# brinda #[[1]]#. @@ -231,17 +231,17 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, el #hada del amor# brinda #[[1]]#. hintTextTable[RHT_DMT_GREAT_FAIRY_REWARD] = HintText(CustomMessage("They say that a #magical fairy# gifts #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #magische Fee# #[[1]]# schenke.", + /*german*/ "Man erzΓ€hlt sich, daß die #Fee der FΓ€higkeiten# #[[1]]# schenke.", /*french*/ "Selon moi, la #fΓ©e de la magie# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #hada mΓ‘gica# brinda #[[1]]#. hintTextTable[RHT_DMC_GREAT_FAIRY_REWARD] = HintText(CustomMessage("They say that a #magical fairy# gifts #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #magische Fee# #[[1]]# schenke.", + /*german*/ "Man erzΓ€hlt sich, daß die #Fee der Weisheit# #[[1]]# schenke.", /*french*/ "Selon moi, la #fΓ©e de la magie# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #hada mΓ‘gica# brinda #[[1]]#. hintTextTable[RHT_OGC_GREAT_FAIRY_REWARD] = HintText(CustomMessage("They say that the #fairy of strength# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #Fee der StΓ€rke# #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß die #Fee des Mutes# #[[1]]# besÀße.", /*french*/ "Selon moi, la #fΓ©e de la force# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #hada de la fuerza# brinda #[[1]]#. @@ -251,7 +251,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, en el #jardΓ­n del castillo Impa enseΓ±a# #[[1]]#. hintTextTable[RHT_SONG_FROM_MALON] = HintText(CustomMessage("They say that #a farm girl# sings #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #MΓ€dchen des Landes# #[[1]]# singe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #MΓ€dchen vom Lande# #[[1]]# singe.", /*french*/ "Selon moi, la #fillette de la ferme# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #chica rupestre# canta #[[1]]#. @@ -261,17 +261,17 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, al #fondo del bosque# Saria enseΓ±a #[[1]]#. hintTextTable[RHT_SONG_FROM_WINDMILL] = HintText(CustomMessage("They say that a man #in a windmill# is obsessed with #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein Mann #in einer WindmΓΌhle# von #[[1]]# besessen sei.", + /*german*/ "Man erzΓ€hlt sich, daß ein besessener Mann #in einer WindmΓΌhle# #[[1]]# lehre.", /*french*/ "Selon moi, l'#homme du moulin# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #hombre del molino# estΓ‘ obsesionado con #[[1]]#. hintTextTable[RHT_HC_MALON_EGG] = HintText(CustomMessage("They say that a #girl looking for her father# gives #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #nach ihrem Vater suchenden MΓ€dchen# #[[1]]# gΓ€be.", + /*german*/ "Man erzΓ€hlt sich, daß ein #nach ihrem Vater suchendes MΓ€dchen# #[[1]]# gΓ€be.", /*french*/ "Selon moi, la #fillette qui cherche son pΓ¨re# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #chica en busca de su padre# otorga #[[1]]#. hintTextTable[RHT_HC_ZELDAS_LETTER] = HintText(CustomMessage("They say that a #princess in a castle# gifts #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Prinzessin in einem Schloß# #[[1]]# schenke.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Prinzessin eines Schloßes# #[[1]]# schenke.", /*french*/ "Selon moi, la #princesse dans le chΓ’teau# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la #princesa de un castillo# otorga #[[1]]#. @@ -286,7 +286,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, un #mal modelo de negocio# premia con #[[1]]#. hintTextTable[RHT_LH_CHILD_FISHING] = HintText(CustomMessage("They say that #fishing in youth# bestows #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Fischen in der Jugend# #[[1]]# verleihe.", + /*german*/ "Man erzΓ€hlt sich, daß das #Fischen der Jugend# #[[1]]# verleihe.", /*french*/ "Selon moi, #pΓͺcher dans sa jeunesse# promet #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #pescar en la juventud# conduce a #[[1]]#. @@ -295,7 +295,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { /*french*/ "Selon moi, #aller Γ  l'Γ©tang# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_HYRULE_LOACH] = HintText(CustomMessage("They say that #fishing the hyrule loach# will give you #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Fischen der hylianischen Schmerle# #[[1]]# einbrΓ€chte.", + /*german*/ "Man erzΓ€hlt sich, daß das #Fischen der hylianischen Forelle# #[[1]]# einbrΓ€chte.", /*french*/ "Selon moi, #pΓͺcher le brochet Hylien# vous donnera #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, si #pescas a la Locha de Hyrule# encontrarΓ‘s #[[1]]#. {}, { @@ -305,12 +305,12 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, #pescar a la leyenda# conduce a #[[1]]#. hintTextTable[RHT_LH_ADULT_FISHING] = HintText(CustomMessage("They say that #fishing in maturity# bestows #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Fischen im Alter# #[[1]]# verleihe.", + /*german*/ "Man erzΓ€hlt sich, daß das #Fischen des Alters# #[[1]]# verleihe.", /*french*/ "Selon moi, #pΓͺcher dans sa maturitΓ©# promet #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #pescar en la madurez# conduce a #[[1]]#. hintTextTable[RHT_LH_LAB_DIVE] = HintText(CustomMessage("They say that a #diving experiment# is rewarded with #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Tauchexperiment# mit #[[1]]# belohnt wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Tauchexperiment# #[[1]]# einbrΓ€chte.", /*french*/ "Selon moi, l'#expΓ©rience de plongΓ©e# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #bucear para un experimento# se premia con #[[1]]#. // RANDOTODO: needs translation @@ -321,27 +321,27 @@ void StaticData::HintTable_Init_Exclude_Overworld() { hintTextTable[RHT_GC_ROLLING_GORON_AS_ADULT] = HintText(CustomMessage("They say that #reassuring a young Goron# is rewarded with #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Beruhigen eines jungen Goronen# mit #[[1]]# belohnt wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß das #Beruhigen eines jungen Goronen# #[[1]]# einbrΓ€chte.", /*french*/ "Selon moi, #rassurer un jeune Goron# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, #calmar a un joven Goron# otorga #[[1]]#. {}, { CustomMessage("They say that #comforting yourself# provides #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #Ermutigung von einem Selbst# #[[1]]# einbrΓ€chte.", + /*german*/ "Man erzΓ€hlt sich, daß #sich selbst zu trΓΆsten# #[[1]]# einbrΓ€chte.", /*french*/ "Selon moi, se #rΓ©conforter soi-mΓͺme# donne #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ SegΓΊn dicen, #confrontarte a ti mismo# otorga #[[1]]#. hintTextTable[RHT_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE] = HintText(CustomMessage("They say that the #first explosive prize# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #erste explosive Preis# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß der #erste explosive Preis# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #premier prix explosif# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #primer premio explosivo# se trata de #[[1]]#. hintTextTable[RHT_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE] = HintText(CustomMessage("They say that the #second explosive prize# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #zweite explosive Preis# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß der #zweite explosive Preis# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #deuxiΓ¨me prix explosif# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #segundo premio explosivo# se trata de #[[1]]#. hintTextTable[RHT_MARKET_LOST_DOG] = HintText(CustomMessage("They say that #rescuing Richard the Dog# is rewarded with #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #Rettung des Hundes Richard# mit #[[1]]# belohnt wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß die #Rettung des Hundes Richard# #[[1]]# einbrΓ€chte.", /*french*/ "Selon moi, #retrouver Kiki le chien# promet #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, #rescatar al perrito Ricardo# conduce a #[[1]]#. {}, { @@ -351,12 +351,12 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, los #amantes caninos# encontrarΓ‘n #[[1]]#. hintTextTable[RHT_LW_OCARINA_MEMORY_GAME] = HintText(CustomMessage("They say that #playing an Ocarina in Lost Woods# is rewarded with #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen der Okarina in den verlorenen WΓ€ldern# mit #[[1]]# belohnt wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen der Okarina in den verlorenen WΓ€ldern# #[[1]]# gewΓ€hre.", /*french*/ "Selon moi, #jouer l'ocarina dans les Bois Perdus# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, #tocar la ocarina en el Bosque Perdido# otorga #[[1]]#. {}, { CustomMessage("They say that the prize for a #game of Simon Says# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der Preis fΓΌr eine Partie #Simon sagt# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß der Preis fΓΌr eine Partie #Simon sagt# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, la #rΓ©compense de Jean Dit# est #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, #repetir ciertas melodΓ­as# otorga #[[1]]#. CustomMessage("They say that a #child sing-a-long# holds #[[1]]#.", @@ -365,12 +365,12 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, #tocar junto a otros# otorga #[[1]]#. hintTextTable[RHT_KAK_10_GOLD_SKULLTULA_REWARD] = HintText(CustomMessage("They say that slaying #10 Gold Skulltulas# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das Besiegen von #10 Goldenen Skulltulas# #[[1]]# enthΓΌllen wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß das Vernichten von #10 Goldenen Skulltulas# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, dΓ©truire #10 Skulltulas d'or# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, #exterminar 10 skulltulas doradas# revela #[[1]]#. {}, { CustomMessage("They say that #10 bug badges# rewards #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #10 KΓ€ferabzeichen# mit #[[1]]# belohnt wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß die Belohnung fΓΌr #10 Insektenplaketten# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #10 Γ©cussons# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, #10 medallas de insectos# otorgan #[[1]]#. CustomMessage("They say that #10 spider souls# yields #[[1]]#.", @@ -378,7 +378,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { /*french*/ "Selon moi, #10 Γ’mes# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, #10 almas de araΓ±a# otorgan #[[1]]#. CustomMessage("They say that #10 auriferous arachnids# lead to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #10 goldhaltige Arachniden# zu #[[1]]# fΓΌhren wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #10 goldhaltige Arachniden# #[[1]]# gewΓ€hren.", /*french*/ "Selon moi, #10 arachnides aurifΓ¨res# donnent #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ SegΓΊn dicen, #10 arΓ‘cnidos aurΓ­feros# otorgan #[[1]]#. @@ -388,7 +388,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, #alguien sobre un tejado# otorga #[[1]]#. hintTextTable[RHT_ZR_MAGIC_BEAN_SALESMAN] = HintText(CustomMessage("They say that a #bean seller# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #BohnenverkΓ€ufer# #[[1]]# offeriere.", + /*german*/ "Man erzΓ€hlt sich, daß ein #ErbsenverkΓ€ufer# #[[1]]# offeriere.", /*french*/ "Selon moi, le #marchand de haricots magiques# vend en fait #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, el #vendedor de judΓ­as# ofrece #[[1]]#. {}, { @@ -403,7 +403,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, las #ancas bajo la tormenta# otorgan #[[1]]#. hintTextTable[RHT_ZR_FROGS_ZELDAS_LULLABY] = HintText(CustomMessage("They say that after hearing #Zelda's Lullaby, the frogs# gift #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #FrΓΆsche nach dem HΓΆren von Zeldas Wiegenlied# #[[1]]# schenken wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #FrΓΆsche die Zeldas Wiegenlied# hΓΆren #[[1]]# schenken wΓΌrden.", /*french*/ "Selon moi, Γ  l'Γ©coute de #la berceuse de Zelda, les grenouilles# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, despuΓ©s de escuchar #la Nana de Zelda, las ranas# regalan #[[1]]#. {}, { @@ -417,7 +417,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, el #Sapo Tenore al fondo, a la izquierda#, regala #[[1]]#. hintTextTable[RHT_ZR_FROGS_EPONAS_SONG] = HintText(CustomMessage("They say that after hearing #Epona's Song, the frogs# gift #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #FrΓΆsche nach dem HΓΆren von Eponas Lied# #[[1]]# schenken wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #FrΓΆsche die Eponas Lied# hΓΆren #[[1]]# schenken wΓΌrden.", /*french*/ "Selon moi, Γ  l'Γ©coute du #chant d'Epona, les grenouilles# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, despuΓ©s de escuchar #la CanciΓ³n de Epona, las ranas# regalan #[[1]]#. {}, { @@ -431,7 +431,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, el #Sapo Tenore al fondo, a la derecha#, regala #[[1]]#. hintTextTable[RHT_ZR_FROGS_SARIAS_SONG] = HintText(CustomMessage("They say that after hearing #Saria's Song, the frogs# gift #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #FrΓΆsche nach dem HΓΆren von Salias Lied# #[[1]]# schenken wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #FrΓΆsche die Salias Lied# hΓΆren #[[1]]# schenken wΓΌrden.", /*french*/ "Selon moi, Γ  l'Γ©coute du #chant de Saria, les grenouilles# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, despuΓ©s de escuchar #la CanciΓ³n de Saria, las ranas# regalan #[[1]]#. {}, { @@ -445,7 +445,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, el #Sapo Tenore en el centro# regala #[[1]]#. hintTextTable[RHT_ZR_FROGS_SUNS_SONG] = HintText(CustomMessage("They say that after hearing #the Sun's Song, the frogs# gift #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #FrΓΆsche nach dem HΓΆren der Hymne der Sonne# #[[1]]# schenken wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #FrΓΆsche die die Hymne der Sonne# hΓΆren #[[1]]# schenken wΓΌrden.", /*french*/ "Selon moi, Γ  l'Γ©coute du #chant du soleil, les grenouilles# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, despuΓ©s de escuchar #la CanciΓ³n del Sol, las ranas# regalan #[[1]]#. {}, { @@ -459,7 +459,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, el #Sapo Tenore al frente, a la izquierda#, regala #[[1]]#. hintTextTable[RHT_ZR_FROGS_SONG_OF_TIME] = HintText(CustomMessage("They say that after hearing #the Song of Time, the frogs# gift #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die #FrΓΆsche nach dem HΓΆren der Hymne der Zeit# #[[1]]# schenken wΓΌrden.", + /*german*/ "Man erzΓ€hlt sich, daß #FrΓΆsche die die Hymne der Zeit# hΓΆren #[[1]]# schenken wΓΌrden.", /*french*/ "Selon moi, Γ  l'Γ©coute du #chant du temps, les grenouilles# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, despuΓ©s de escuchar #la CanciΓ³n del tiempo, las ranas# regalan #[[1]]#. {}, { @@ -473,17 +473,17 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, el #Sapo Tenore al frente, a la derecha#, regala #[[1]]#. hintTextTable[RHT_GF_HBA_1000_POINTS] = HintText(CustomMessage("They say that scoring 1000 in #horseback archery# grants #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das Erzielen von 1000 Punkten beim #Pferdebogenschießen# #[[1]]# einbrΓ€chte.", + /*german*/ "Man erzΓ€hlt sich, daß das Erzielen von 1.000 Punkten beim #Bogenschießen zu Pferde# #[[1]]# gewΓ€hre.", /*french*/ "Selon moi, obtenir 1000 points dans l'#archerie Γ©questre# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, conseguir 1000 puntos en el #tiro con arco a caballo# premia #[[1]]#. hintTextTable[RHT_MARKET_SHOOTING_GALLERY_REWARD] = HintText(CustomMessage("They say that #shooting in youth# grants #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Schießen in der Jugend# #[[1]]# einbrΓ€chte.", + /*german*/ "Man erzΓ€hlt sich, daß das #Schießen der Jugend# #[[1]]# einbrΓ€chte.", /*french*/ "Selon moi, #faire du tir dans sa jeunesse# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #disparar en la juventud# otorga #[[1]]#. hintTextTable[RHT_KAK_SHOOTING_GALLERY_REWARD] = HintText(CustomMessage("They say that #shooting in maturity# grants #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Schießen im Alter# #[[1]]# einbrΓ€chte.", + /*german*/ "Man erzΓ€hlt sich, daß das #Schießen des Alters# #[[1]]# einbrΓ€chte.", /*french*/ "Selon moi, #faire du tir dans sa maturitΓ©# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #disparar en la madurez# otorga #[[1]]#. @@ -498,27 +498,27 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, una #cuidadora de emplumados# le ofrece a los mayores #[[1]]#. hintTextTable[RHT_LLR_TALONS_CHICKENS] = HintText(CustomMessage("They say that #finding Super Cuccos# is rewarded with #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Finden von SuperhΓΌhnchen# mit #[[1]]# belohnt wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß das #Finden von Super-HΓΌhnern# #[[1]]# einbrΓ€chte.", /*french*/ "Selon moi, #trouver des Super Cocottes# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #hallar los supercucos# conduce a #[[1]]#. hintTextTable[RHT_GC_ROLLING_GORON_AS_CHILD] = HintText(CustomMessage("They say that the prize offered by a #large rolling Goron# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der angebotene Preis eines #großen rollenden Goronen# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß der angebotene Preis eines #großen rollenden Goronen# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, la rΓ©compense d'un #gros Goron roulant# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #gran Goron rodante# otorga #[[1]]#. hintTextTable[RHT_LH_UNDERWATER_ITEM] = HintText(CustomMessage("They say that the #sunken treasure in a lake# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #versunkene Schatz in einem See# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß der #versunkene Schatz eines Sees# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, le #trΓ©sor au fond du lac# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #tesoro hundido del lago# se trata de #[[1]]#. hintTextTable[RHT_GF_GERUDO_MEMBERSHIP_CARD] = HintText(CustomMessage("They say that #rescuing captured carpenters# is rewarded with #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Retten gefangener Zimmerleute# mit #[[1]]# belohnt wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß das #Retten gefangener Zimmerleute# #[[1]]# einbrΓ€chte.", /*french*/ "Selon moi, #secourir les charpentiers capturΓ©s# assure #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #rescatar los apresados carpinteros# se premia con #[[1]]#. hintTextTable[RHT_WASTELAND_BOMBCHU_SALESMAN] = HintText(CustomMessage("They say that a #carpet guru# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Teppichguru# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #fliegender Einsiedler# #[[1]]# verkaufe.", /*french*/ "Selon moi, #un marchand du dΓ©sert# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #genio de una alfombra# vende #[[1]]#. @@ -533,32 +533,32 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, la #seΓ±ora de la tienda de pociones# vende #[[1]]#. hintTextTable[RHT_KAK_IMPAS_HOUSE_FREESTANDING_POH] = HintText(CustomMessage("They say that #imprisoned in a house# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #eingesperrt in einem Haus# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß #eingesperrt in einem Haus# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, #encagΓ© dans une maison# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #en una casa entre rejas# yace #[[1]]#. hintTextTable[RHT_HF_TEKTITE_GROTTO_FREESTANDING_POH] = HintText(CustomMessage("They say that #deep underwater in a hole# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #tief unter Wasser in einem Loch# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß #tief unter Wasser in einem Erdloch# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #dans les profondeurs d'une grotte# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #en lo hondo bajo un hoyo# yace #[[1]]#. hintTextTable[RHT_KAK_WINDMILL_FREESTANDING_POH] = HintText(CustomMessage("They say that on a #windmill ledge# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf einem #Vorsprung in einer WindmΓΌhle# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß auf einem #Vorsprung einer WindmΓΌhle# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, #haut perchΓ© dans le moulin# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, al #borde de un molino# yace #[[1]]#. hintTextTable[RHT_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH] = HintText(CustomMessage("They say that #dead Dampe's second# prize is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #zweite Preis des toten Boris# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß der #zweite Preis des toten Boris# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, la #deuxiΓ¨me course d'Igor# donne #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, el segundo premio de #la carrera de DampΓ©# se trata de #[[1]]#. {}, { CustomMessage("They say that #racing a ghost# leads to #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Rennen gegen einen Geist# zu #[[1]]# fΓΌhren wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß der #Wettlauf gegen einen Geist# #[[1]]# gewΓ€hre.", /*french*/ "Selon moi, le dΓ©fi du #revenant rapide# donne #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ SegΓΊn dicen, #perseguir a un fantasma# conduce a #[[1]]#. hintTextTable[RHT_LLR_FREESTANDING_POH] = HintText(CustomMessage("They say that in a #ranch silo# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß in einem #lΓ€ndlichen Silo# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß in einem #Farmsilo# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, #dans l'entrepΓ΄t de la ferme# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, en un #granero rupestre# yace #[[1]]#. @@ -573,27 +573,27 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, cierto #sepultero desentierra# #[[1]]#. hintTextTable[RHT_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH] = HintText(CustomMessage("They say that on top of a #pillar in a river# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf der Spitze einer #SΓ€ule in einem Fluß# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß auf einer #SΓ€ule in einem Fluß# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, #sur un pilier au dessus du fleuve# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, en lo alto del #pilar de un rΓ­o# yace #[[1]]#. hintTextTable[RHT_ZR_NEAR_DOMAIN_FREESTANDING_POH] = HintText(CustomMessage("They say that on a #river ledge by a waterfall# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf einem #Vorsprung von einem Fluß nahe eines Wasserfalls# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß auf einem #Vorsprung eines Flußes nahe eines Wasserfalls# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, #sur la falaise au dessus du fleuve# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, al borde de #la entrada a una cascada# yace #[[1]]#. hintTextTable[RHT_LH_FREESTANDING_POH] = HintText(CustomMessage("They say that high on a #lab rooftop# one can find #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß man auf dem #Dach eines Laboratoriums# #[[1]]# finden kΓΆnne.", + /*german*/ "Man erzΓ€hlt sich, daß man auf dem #Dach eines Labors# #[[1]]# finden kΓΆnne.", /*french*/ "Selon moi, #la tour d'observation du lac# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, en lo #alto de un laboratorio# yace #[[1]]#. hintTextTable[RHT_ZF_ICEBERG_FREESTANDING_POH] = HintText(CustomMessage("They say that #floating on ice# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß sich schwebend auf Eis #[[1]]# befΓ€nde.", + /*german*/ "Man erzΓ€hlt sich, daß sich auf einer Eisscholle #[[1]]# |befΓ€nde|befΓ€nden|.", /*french*/ "Selon moi, #gisant sur la glace# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, #flotando sobre hielo# yace #[[1]]#. hintTextTable[RHT_GV_WATERFALL_FREESTANDING_POH] = HintText(CustomMessage("They say that behind a #valley waterfall# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß hinter einem #Wasserfall in einem Tal# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß hinter einem #Wasserfall eines Tals# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, #derriΓ¨re la cascade du dΓ©sert# se cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, tras una #desierta cascada# yace #[[1]]#. @@ -603,22 +603,22 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, bajo la #caja de un valle# yace #[[1]]#. hintTextTable[RHT_COLOSSUS_FREESTANDING_POH] = HintText(CustomMessage("They say that on top of an #arch of stone# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf der Spitze eines #Steinbogens# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß auf einem #Steinbogen# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, #gisant sur une arche de pierre# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, en lo alto de un #arco de piedra# yace #[[1]]#. hintTextTable[RHT_DMT_FREESTANDING_POH] = HintText(CustomMessage("They say that above a #mountain cavern entrance# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß oberhalb eines #BerghΓΆhleneingangs# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß oberhalb eines #BerghΓΆhleneingangs# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, gisant #au dessus de la caverne montagneuse# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, en lo alto de la #entrada de una cueva en la montaΓ±a# yace #[[1]]#. hintTextTable[RHT_DMC_WALL_FREESTANDING_POH] = HintText(CustomMessage("They say that nestled in a #volcanic wall# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß in einem #vulkanischen Alkoven# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß in einer #vulkanischen Wand# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, dans une #alcove volcanique# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, entre unas #murallas volcΓ‘nicas# yace #[[1]]#. hintTextTable[RHT_DMC_VOLCANO_FREESTANDING_POH] = HintText(CustomMessage("They say that obscured by #volcanic ash# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß #[[1]]# von #Vulkanasche# verdeckt sei.", + /*german*/ "Man erzΓ€hlt sich, daß #Vulkanasche# #[[1]]# verdecke.", /*french*/ "Selon moi, #recouvert de cendres volcaniques# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, bajo la #ceniza volcΓ‘nica# yace #[[1]]#. @@ -643,7 +643,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, #derrotar a las guardas Gerudo# revela #[[1]]#. hintTextTable[RHT_HF_GS_NEAR_KAK_GROTTO] = HintText(CustomMessage("They say that a #spider-guarded spider in a hole# hoards #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #spinnenbewachte Spinne in einem Loch #[[1]]# horte.", + /*german*/ "Man erzΓ€hlt sich, daß eine #spinnenbewachte Spinne in einem Erdloch #[[1]]# horte.", /*french*/ "Selon moi, une #Skulltula dans un trou d'arachnides# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula custodiada por otra# de un hoyo otorga #[[1]]#. @@ -698,17 +698,17 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, la noche revela una #Skulltula del laberinto forestal# que otorga #[[1]]#. hintTextTable[RHT_SFM_GS] = HintText(CustomMessage("They say that night reveals a #spider in a forest meadow# holding #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die Nacht eine #Spinne auf einer Waldwiese# enthΓΌlle, welche #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß die Nacht eine #Spinne auf einer Waldlichtung# enthΓΌlle, welche #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula dans le sanctuaire des bois# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la noche revela una #Skulltula de la pradera del bosque# que otorga #[[1]]#. hintTextTable[RHT_OGC_GS] = HintText(CustomMessage("They say that a #spider outside a tyrant's tower# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne außerhalb eines Turms eines Tyrannen# #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Spinne außerhalb eines Turmes eines Tyrannen# #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula parmi les ruines du chΓ’teau# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula a las afueras de la torre de un tirano# otorga #[[1]]#. hintTextTable[RHT_HC_GS_TREE] = HintText(CustomMessage("They say that a spider hiding in a #tree outside of a castle# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine in einem #Baum außerhalb von einem Schloß befindliche Spinne# #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß eine in einem #Baum außerhalb eines Schloßes befindliche Spinne# #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula dans l'arbre prΓ¨s du chΓ’teau# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una Skulltula escondida en el #Γ‘rbol de las afueras de un castillo# otorga #[[1]]#. @@ -718,17 +718,17 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, una #Skulltula bajo una custodiada caja# otorga #[[1]]#. hintTextTable[RHT_DMC_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried in a volcano# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #in einem Vulkan begrabene Spinne# #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß eine #in einem Vulkan vergrabene Spinne# #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula enterrΓ©e dans un volcan# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula enterrada en un volcΓ‘n# otorga #[[1]]#. hintTextTable[RHT_DMT_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried outside a cavern# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #außerhalb einer HΓΆhle begrabene Spinne# #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß eine #außerhalb einer HΓΆhle vergrabene Spinne# #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula enterrΓ©e prΓ¨s d'une caverne# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula enterrada a la entrada de una cueva# otorga #[[1]]#. hintTextTable[RHT_DMT_GS_NEAR_KAK] = HintText(CustomMessage("They say that a #spider hidden in a mountain nook# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #in einem Bergwinkel versteckte Spinne# #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß eine #in einer Bergnische versteckte Spinne# #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula cachΓ©e dans le flanc d'une montagne# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula oculta en el rincΓ³n de la montaΓ±a# otorga #[[1]]#. @@ -753,32 +753,32 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, una #Skulltula bajo una caja# de la Ciudad Goron otorga #[[1]]#. hintTextTable[RHT_KAK_GS_HOUSE_UNDER_CONSTRUCTION] = HintText(CustomMessage("They say that night in the past reveals a #spider in a town# holding #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die Nacht in der Vergangenheit eine #Spinne in einer Stadt# enthΓΌlle, welche #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß die Nacht in der Vergangenheit eine #Spinne in einem Dorf# enthΓΌlle, welche #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula dans le chantier de construction# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la noche del pasado revela una #Skulltula del pueblo# que otorga #[[1]]#. hintTextTable[RHT_KAK_GS_SKULLTULA_HOUSE] = HintText(CustomMessage("They say that night in the past reveals a #spider in a town# holding #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die Nacht in der Vergangenheit eine #Spinne in einer Stadt# enthΓΌlle, welche #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß die Nacht in der Vergangenheit eine #Spinne in einem Dorf# enthΓΌlle, welche #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula sur une maison maudite# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la noche del pasado revela una #Skulltula del pueblo# que otorga #[[1]]#. hintTextTable[RHT_KAK_GS_GUARDS_HOUSE] = HintText(CustomMessage("They say that night in the past reveals a #spider in a town# holding #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die Nacht in der Vergangenheit eine #Spinne in einer Stadt# enthΓΌlle, welche #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß die Nacht in der Vergangenheit eine #Spinne in einem Dorf# enthΓΌlle, welche #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula sur une maison de village# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la noche del pasado revela una #Skulltula del pueblo# que otorga #[[1]]#. hintTextTable[RHT_KAK_GS_TREE] = HintText(CustomMessage("They say that night in the past reveals a #spider in a town# holding #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die Nacht in der Vergangenheit eine #Spinne in einer Stadt# enthΓΌlle, welche #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß die Nacht in der Vergangenheit eine #Spinne in einem Dorf# enthΓΌlle, welche #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula dans un arbre de village# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la noche del pasado revela una #Skulltula del pueblo# que otorga #[[1]]#. hintTextTable[RHT_KAK_GS_WATCHTOWER] = HintText(CustomMessage("They say that night in the past reveals a #spider in a town# holding #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die Nacht in der Vergangenheit eine #Spinne in einer Stadt# enthΓΌlle, welche #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß die Nacht in der Vergangenheit eine #Spinne in einem Dorf# enthΓΌlle, welche #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula sur une Γ©chelle dans un village# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la noche del pasado revela una #Skulltula del pueblo# que otorga #[[1]]#. hintTextTable[RHT_KAK_GS_ABOVE_IMPAS_HOUSE] = HintText(CustomMessage("They say that night in the future reveals a #spider in a town# holding #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die Nacht in der Zukunft eine #Spinne in einer Stadt# enthΓΌlle, welche #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß die Nacht in der Zukunft eine #Spinne in einem Dorf# enthΓΌlle, welche #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula au dessus d'une grande maison# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la noche del futuro revela una #Skulltula del pueblo# que otorga #[[1]]#. @@ -788,32 +788,32 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, la noche revela una #Skulltula del cementerio# que otorga #[[1]]#. hintTextTable[RHT_GRAVEYARD_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried in a graveyard# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #auf einem Friedhof begrabene Spinne# #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß eine #auf einem Friedhof vergrabene Spinne# #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula enterrΓ©e dans le CimetiΓ¨re# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula enterrada en el cementerio# otorga #[[1]]#. hintTextTable[RHT_ZR_GS_LADDER] = HintText(CustomMessage("They say that night in the past reveals a #spider in a river# holding #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die Nacht in der Vergangenheit eine #Spinne in einem Fluß# enthΓΌlle, welche #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß die Nacht in der Vergangenheit eine #Spinne an einem Fluß# enthΓΌlle, welche #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula sur une Γ©chelle prΓ¨s d'une cascade# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la noche del pasado revela una #Skulltula del rΓ­o# que otorga #[[1]]#. hintTextTable[RHT_ZR_GS_TREE] = HintText(CustomMessage("They say that a spider hiding in a #tree by a river# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine in einem #Baum bei einem Fluß# versteckte Spinne #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß eine in einem #Baum an einem Fluß# versteckte Spinne #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula dans un arbre prΓ¨s du fleuve# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una Skulltula escondida en el #Γ‘rbol de un rΓ­o# otorga #[[1]]#. hintTextTable[RHT_ZR_GS_ABOVE_BRIDGE] = HintText(CustomMessage("They say that night in the future reveals a #spider in a river# holding #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die Nacht in der Zukunft eine #Spinne in einem Fluß# enthΓΌlle, welche #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß die Nacht in der Zukunft eine #Spinne an einem Fluß# enthΓΌlle, welche #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula sur une faΓ§ade prΓ¨s d'une cascade# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la noche del futuro revela una #Skulltula del rΓ­o# que otorga #[[1]]#. hintTextTable[RHT_ZR_GS_NEAR_RAISED_GROTTOS] = HintText(CustomMessage("They say that night in the future reveals a #spider in a river# holding #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die Nacht in der Zukunft eine #Spinne in einem Fluß# enthΓΌlle, welche #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß die Nacht in der Zukunft eine #Spinne an einem Fluß# enthΓΌlle, welche #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula sur une faΓ§ade prΓ¨s d'une grotte du fleuve# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la noche del futuro revela una #Skulltula del rΓ­o# que otorga #[[1]]#. hintTextTable[RHT_ZD_GS_FROZEN_WATERFALL] = HintText(CustomMessage("They say that night reveals a #spider by a frozen waterfall# holding #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die Nacht eine #Spinne bei einem gefrorenen Wasserfall# enthΓΌlle, welche #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß die Nacht eine #Spinne an einem gefrorenen Wasserfall# enthΓΌlle, welche #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula prΓ¨s d'une cascade gelΓ©e# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la noche revela una #Skulltula junto a una congelada cascada# que otorga #[[1]]#. @@ -828,32 +828,32 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, una Skulltula escondida en el #Γ‘rbol junto a cierta deidad# otorga #[[1]]#. hintTextTable[RHT_LH_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried by a lake# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #bei einem Fluß begrabene Spinne# #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß eine #an einem Fluß vergrabene Spinne# #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula enterrΓ©e prΓ¨s d'un lac# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula enterrada junto a un lago# otorga #[[1]]#. hintTextTable[RHT_LH_GS_SMALL_ISLAND] = HintText(CustomMessage("They say that night reveals a #spider by a lake# holding #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die Nacht eine #Spinne bei einem Fluß# enthΓΌlle, welche #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß die Nacht eine #Spinne an einem Fluß# enthΓΌlle, welche #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula sur un Γlot du lac# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la noche revela una #Skulltula junto a un lago# que otorga #[[1]]#. hintTextTable[RHT_LH_GS_LAB_WALL] = HintText(CustomMessage("They say that night reveals a #spider by a lake# holding #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die Nacht eine #Spinne bei einem Fluß# enthΓΌlle, welche #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß die Nacht eine #Spinne an einem Fluß# enthΓΌlle, welche #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula sur le mur d'un centre de recherche# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la noche revela una #Skulltula junto a un lago# que otorga #[[1]]#. hintTextTable[RHT_LH_GS_LAB_CRATE] = HintText(CustomMessage("They say that a spider deed underwater in a #lab crate# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß einer Spinne in einer #Laborkiste# unter Wasser #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß eine Spinne in einer #Laborkiste# unter Wasser #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula dans une boΓte au fond d'une cuve d'eau# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula bajo la sumergida caja de un laboratorio# otorga #[[1]]#. hintTextTable[RHT_LH_GS_TREE] = HintText(CustomMessage("They say that night reveals a #spider by a lake high in a tree# holding #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß die Nacht eine #Spinne in einem Baum bei einem Fluß# enthΓΌlle, welche #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß die Nacht eine #Spinne in einem Baum an einem Fluß# enthΓΌlle, welche #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula dans un grand arbre du lac# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, la noche revela #una Skulltula del lago sobre un Γ‘rbol# que otorga #[[1]]#. hintTextTable[RHT_GV_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried in a valley# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #in einem Tal begrabene Spinne# #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß eine #in einem Tal vergrabene Spinne# #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula enterrΓ© dans une vallΓ©e# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula enterrada en un valle# otorga #[[1]]#. @@ -883,7 +883,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, la noche revela una #Skulltula de una fortaleza# que otorga #[[1]]#. hintTextTable[RHT_COLOSSUS_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried in the desert# holds #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #in der WΓΌste begrabene Spinne# #[[1]]# besÀße.", + /*german*/ "Man erzΓ€hlt sich, daß eine #in der WΓΌste vergrabene Spinne# #[[1]]# besÀße.", /*french*/ "Selon moi, une #Skulltula enterrΓ©e au pied du colosse# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #Skulltula enterrada en el desierto# otorga #[[1]]#. @@ -898,47 +898,47 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, la noche revela una #Skulltula en las profundidades del desierto# que otorga #[[1]]#. hintTextTable[RHT_KF_SHOP_ITEM_1] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Inhaber des Kokiri-Ladens# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #kindlicher Ladenbesitzer# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #joven dependiente# vende #[[1]]#. hintTextTable[RHT_KF_SHOP_ITEM_2] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Inhaber des Kokiri-Ladens# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #kindlicher Ladenbesitzer# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #joven dependiente# vende #[[1]]#. hintTextTable[RHT_KF_SHOP_ITEM_3] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Inhaber des Kokiri-Ladens# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #kindlicher Ladenbesitzer# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #joven dependiente# vende #[[1]]#. hintTextTable[RHT_KF_SHOP_ITEM_4] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Inhaber des Kokiri-Ladens# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #kindlicher Ladenbesitzer# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #joven dependiente# vende #[[1]]#. hintTextTable[RHT_KF_SHOP_ITEM_5] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Inhaber des Kokiri-Ladens# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #kindlicher Ladenbesitzer# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #joven dependiente# vende #[[1]]#. hintTextTable[RHT_KF_SHOP_ITEM_6] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Inhaber des Kokiri-Ladens# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #kindlicher Ladenbesitzer# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #joven dependiente# vende #[[1]]#. hintTextTable[RHT_KF_SHOP_ITEM_7] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Inhaber des Kokiri-Ladens# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #kindlicher Ladenbesitzer# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #joven dependiente# vende #[[1]]#. hintTextTable[RHT_KF_SHOP_ITEM_8] = HintText(CustomMessage("They say that a #child shopkeeper# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Inhaber des Kokiri-Ladens# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #kindlicher Ladenbesitzer# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #boutique Kokiri# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #joven dependiente# vende #[[1]]#. hintTextTable[RHT_KAK_POTION_SHOP_ITEM_1] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden in Kakariko# #[[1]]# offeriere.", + /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden von Kakariko# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. {}, { @@ -948,7 +948,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_KAK_POTION_SHOP_ITEM_2] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden in Kakariko# #[[1]]# offeriere.", + /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden von Kakariko# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. {}, { @@ -958,7 +958,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_KAK_POTION_SHOP_ITEM_3] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden in Kakariko# #[[1]]# offeriere.", + /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden von Kakariko# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. {}, { @@ -968,7 +968,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_KAK_POTION_SHOP_ITEM_4] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden in Kakariko# #[[1]]# offeriere.", + /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden von Kakariko# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. {}, { @@ -978,7 +978,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_KAK_POTION_SHOP_ITEM_5] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden in Kakariko# #[[1]]# offeriere.", + /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden von Kakariko# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. {}, { @@ -988,7 +988,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_KAK_POTION_SHOP_ITEM_6] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden in Kakariko# #[[1]]# offeriere.", + /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden von Kakariko# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. {}, { @@ -998,7 +998,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_KAK_POTION_SHOP_ITEM_7] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden in Kakariko# #[[1]]# offeriere.", + /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden von Kakariko# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. {}, { @@ -1008,7 +1008,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_KAK_POTION_SHOP_ITEM_8] = HintText(CustomMessage("They say that the #Kakariko Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden in Kakariko# #[[1]]# offeriere.", + /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden von Kakariko# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, la #tienda de pociones de Kakariko# ofrece #[[1]]#. {}, { @@ -1058,7 +1058,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, un #mercader de bombchus# vende #[[1]]#. hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_1] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden auf dem Markt# #[[1]]# offeriere.", + /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden des Marktes# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire dans la Place du MarchΓ©# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. {}, { @@ -1068,7 +1068,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_2] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden auf dem Markt# #[[1]]# offeriere.", + /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden des Marktes# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire dans la Place du MarchΓ©# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. {}, { @@ -1078,7 +1078,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_3] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden auf dem Markt# #[[1]]# offeriere.", + /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden des Marktes# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire dans la Place du MarchΓ©# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. {}, { @@ -1088,7 +1088,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_4] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden auf dem Markt# #[[1]]# offeriere.", + /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden des Marktes# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire dans la Place du MarchΓ©# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. {}, { @@ -1098,7 +1098,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_5] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden auf dem Markt# #[[1]]# offeriere.", + /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden des Marktes# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire dans la Place du MarchΓ©# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. {}, { @@ -1108,7 +1108,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_6] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden auf dem Markt# #[[1]]# offeriere.", + /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden des Marktes# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire dans la Place du MarchΓ©# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. {}, { @@ -1118,7 +1118,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_7] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden auf dem Markt# #[[1]]# offeriere.", + /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden des Marktes# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire dans la Place du MarchΓ©# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. {}, { @@ -1128,7 +1128,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_MARKET_POTION_SHOP_ITEM_8] = HintText(CustomMessage("They say that the #Market Potion Shop# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden auf dem Markt# #[[1]]# offeriere.", + /*german*/ "Man erzΓ€hlt sich, daß der #Magie-Laden des Marktes# #[[1]]# offeriere.", /*french*/ "Selon moi, l'#apothicaire dans la Place du MarchΓ©# vend #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ SegΓΊn dicen, la #tienda de pociones del mercado# ofrece #[[1]]#. {}, { @@ -1138,82 +1138,82 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_MARKET_BAZAAR_ITEM_1] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf dem #Marktbasar# #[[1]]# angeboten wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß auf dem #Marktbasar# #[[1]]# angeboten |wΓΌrde|wΓΌrden|.", /*french*/ "Selon moi, le #bazar de la Place du MarchΓ©# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #bazar del mercado# ofrece #[[1]]#. hintTextTable[RHT_MARKET_BAZAAR_ITEM_2] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf dem #Marktbasar# #[[1]]# angeboten wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß auf dem #Marktbasar# #[[1]]# angeboten |wΓΌrde|wΓΌrden|.", /*french*/ "Selon moi, le #bazar de la Place du MarchΓ©# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #bazar del mercado# ofrece #[[1]]#. hintTextTable[RHT_MARKET_BAZAAR_ITEM_3] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf dem #Marktbasar# #[[1]]# angeboten wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß auf dem #Marktbasar# #[[1]]# angeboten |wΓΌrde|wΓΌrden|.", /*french*/ "Selon moi, le #bazar de la Place du MarchΓ©# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #bazar del mercado# ofrece #[[1]]#. hintTextTable[RHT_MARKET_BAZAAR_ITEM_4] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf dem #Marktbasar# #[[1]]# angeboten wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß auf dem #Marktbasar# #[[1]]# angeboten |wΓΌrde|wΓΌrden|.", /*french*/ "Selon moi, le #bazar de la Place du MarchΓ©# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #bazar del mercado# ofrece #[[1]]#. hintTextTable[RHT_MARKET_BAZAAR_ITEM_5] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf dem #Marktbasar# #[[1]]# angeboten wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß auf dem #Marktbasar# #[[1]]# angeboten |wΓΌrde|wΓΌrden|.", /*french*/ "Selon moi, le #bazar de la Place du MarchΓ©# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #bazar del mercado# ofrece #[[1]]#. hintTextTable[RHT_MARKET_BAZAAR_ITEM_6] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf dem #Marktbasar# #[[1]]# angeboten wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß auf dem #Marktbasar# #[[1]]# angeboten |wΓΌrde|wΓΌrden|.", /*french*/ "Selon moi, le #bazar de la Place du MarchΓ©# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #bazar del mercado# ofrece #[[1]]#. hintTextTable[RHT_MARKET_BAZAAR_ITEM_7] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf dem #Marktbasar# #[[1]]# angeboten wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß auf dem #Marktbasar# #[[1]]# angeboten |wΓΌrde|wΓΌrden|.", /*french*/ "Selon moi, le #bazar de la Place du MarchΓ©# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #bazar del mercado# ofrece #[[1]]#. hintTextTable[RHT_MARKET_BAZAAR_ITEM_8] = HintText(CustomMessage("They say that the #Market Bazaar# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf dem #Marktbasar# #[[1]]# angeboten wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß auf dem #Marktbasar# #[[1]]# angeboten |wΓΌrde|wΓΌrden|.", /*french*/ "Selon moi, le #bazar de la Place du MarchΓ©# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #bazar del mercado# ofrece #[[1]]#. hintTextTable[RHT_KAK_BAZAAR_ITEM_1] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß auf dem #Basar von Kakariko# #[[1]]# angeboten |wΓΌrde|wΓΌrden|.", /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #bazar de Kakariko# ofrece #[[1]]#. hintTextTable[RHT_KAK_BAZAAR_ITEM_2] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß auf dem #Basar von Kakariko# #[[1]]# angeboten |wΓΌrde|wΓΌrden|.", /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #bazar de Kakariko# ofrece #[[1]]#. hintTextTable[RHT_KAK_BAZAAR_ITEM_3] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß auf dem #Basar von Kakariko# #[[1]]# angeboten |wΓΌrde|wΓΌrden|.", /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #bazar de Kakariko# ofrece #[[1]]#. hintTextTable[RHT_KAK_BAZAAR_ITEM_4] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß auf dem #Basar von Kakariko# #[[1]]# angeboten |wΓΌrde|wΓΌrden|.", /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #bazar de Kakariko# ofrece #[[1]]#. hintTextTable[RHT_KAK_BAZAAR_ITEM_5] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß auf dem #Basar von Kakariko# #[[1]]# angeboten |wΓΌrde|wΓΌrden|.", /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #bazar de Kakariko# ofrece #[[1]]#. hintTextTable[RHT_KAK_BAZAAR_ITEM_6] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß auf dem #Basar von Kakariko# #[[1]]# angeboten |wΓΌrde|wΓΌrden|.", /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #bazar de Kakariko# ofrece #[[1]]#. hintTextTable[RHT_KAK_BAZAAR_ITEM_7] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß auf dem #Basar von Kakariko# #[[1]]# angeboten |wΓΌrde|wΓΌrden|.", /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #bazar de Kakariko# ofrece #[[1]]#. hintTextTable[RHT_KAK_BAZAAR_ITEM_8] = HintText(CustomMessage("They say that the #Kakariko Bazaar# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten wΓΌrde.", + /*german*/ "Man erzΓ€hlt sich, daß auf dem #Basar von Kakariko# #[[1]]# angeboten |wΓΌrde|wΓΌrden|.", /*french*/ "Selon moi, le #bazar de Kakariko# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #bazar de Kakariko# ofrece #[[1]]#. @@ -1298,132 +1298,132 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, el #dependiente Goron# vende #[[1]]#. hintTextTable[RHT_HF_DEKU_SCRUB_GROTTO] = HintText(CustomMessage("They say that a lonely #scrub in a hole# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #einsamer Deku in einem Loch# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #einsamer Deku-HΓ€ndler in einem Erdloch# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #peste Mojo dans une grotte de la plaine# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #singular deku bajo un hoyo# de la llanura vende #[[1]]#. hintTextTable[RHT_LLR_DEKU_SCRUB_GROTTO_LEFT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo Γ  la ferme# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #trΓ­o de dekus# de una granja venden #[[1]]#. hintTextTable[RHT_LLR_DEKU_SCRUB_GROTTO_RIGHT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo Γ  la ferme# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #trΓ­o de dekus# de una granja venden #[[1]]#. hintTextTable[RHT_LLR_DEKU_SCRUB_GROTTO_CENTER] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo Γ  la ferme# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #trΓ­o de dekus# de una granja venden #[[1]]#. hintTextTable[RHT_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT] = HintText(CustomMessage("They say that a pair of #scrubs in the woods# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Paar in den WΓ€ldern# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler-Paar in den WΓ€ldern# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo prΓ¨s du théÒtre# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un par de #dekus del bosque# venden #[[1]]#. hintTextTable[RHT_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT] = HintText(CustomMessage("They say that a pair of #scrubs in the woods# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Paar in den WΓ€ldern# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler-Paar in den WΓ€ldern# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo prΓ¨s du théÒtre# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un par de #dekus del bosque# venden #[[1]]#. hintTextTable[RHT_LW_DEKU_SCRUB_NEAR_BRIDGE] = HintText(CustomMessage("They say that a #scrub by a bridge# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku bei einer BrΓΌcke# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler an einer BrΓΌcke# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #peste Mojo prΓ¨s du pont dans les bois# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #deku bajo un puente# del bosque venden #[[1]]#. hintTextTable[RHT_LW_DEKU_SCRUB_GROTTO_REAR] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo dans les sous-bois# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #par de dekus subterrΓ‘neos# del bosque venden #[[1]]#. hintTextTable[RHT_LW_DEKU_SCRUB_GROTTO_FRONT] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo dans les sous-bois# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #par de dekus subterrΓ‘neos# del bosque venden #[[1]]#. hintTextTable[RHT_SFM_DEKU_SCRUB_GROTTO_REAR] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo au coeur du sanctuaire sylvestre# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #par de dekus subterrΓ‘neos# de la pradera sagrada venden #[[1]]#. hintTextTable[RHT_SFM_DEKU_SCRUB_GROTTO_FRONT] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo au coeur du sanctuaire sylvestre# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #par de dekus subterrΓ‘neos# de la pradera sagrada venden #[[1]]#. hintTextTable[RHT_GC_DEKU_SCRUB_GROTTO_LEFT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo dans le village Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #trΓ­o de dekus# de la Ciudad Goron venden #[[1]]#. hintTextTable[RHT_GC_DEKU_SCRUB_GROTTO_RIGHT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo dans le village Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #trΓ­o de dekus# de la Ciudad Goron venden #[[1]]#. hintTextTable[RHT_GC_DEKU_SCRUB_GROTTO_CENTER] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo dans le village Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #trΓ­o de dekus# de la Ciudad Goron venden #[[1]]#. hintTextTable[RHT_DMC_DEKU_SCRUB_GROTTO_LEFT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo dans le volcan# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #trΓ­o de dekus# del volcΓ‘n venden #[[1]]#. hintTextTable[RHT_DMC_DEKU_SCRUB_GROTTO_RIGHT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo dans le volcan# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #trΓ­o de dekus# del volcΓ‘n venden #[[1]]#. hintTextTable[RHT_DMC_DEKU_SCRUB_GROTTO_CENTER] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo dans le volcan# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #trΓ­o de dekus# del volcΓ‘n venden #[[1]]#. hintTextTable[RHT_ZR_DEKU_SCRUB_GROTTO_REAR] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo prΓ¨s du fleuve# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #par de dekus subterrΓ‘neos# del rΓ­o venden #[[1]]#. hintTextTable[RHT_ZR_DEKU_SCRUB_GROTTO_FRONT] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo prΓ¨s du fleuve# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #par de dekus subterrΓ‘neos# del rΓ­o venden #[[1]]#. hintTextTable[RHT_LH_DEKU_SCRUB_GROTTO_LEFT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo prΓ¨s du lac# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #trΓ­o de dekus# del lago venden #[[1]]#. hintTextTable[RHT_LH_DEKU_SCRUB_GROTTO_RIGHT] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo prΓ¨s du lac# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #trΓ­o de dekus# del lago venden #[[1]]#. hintTextTable[RHT_LH_DEKU_SCRUB_GROTTO_CENTER] = HintText(CustomMessage("They say that a #trio of scrubs# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Trio# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler-Trio# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #trio de peste Mojo prΓ¨s du lac# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #trΓ­o de dekus# del lago venden #[[1]]#. hintTextTable[RHT_GV_DEKU_SCRUB_GROTTO_REAR] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo prΓ¨s de la vallΓ©e# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #par de dekus subterrΓ‘neos# del valle venden #[[1]]#. hintTextTable[RHT_GV_DEKU_SCRUB_GROTTO_FRONT] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo prΓ¨s de la vallΓ©e# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #par de dekus subterrΓ‘neos# del valle venden #[[1]]#. hintTextTable[RHT_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo dans le dΓ©sert# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #par de dekus subterrΓ‘neos# del desierto venden #[[1]]#. hintTextTable[RHT_COLOSSUS_DEKU_SCRUB_GROTTO_REAR] = HintText(CustomMessage("They say that a #scrub underground duo# sells #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Deku-HΓ€ndler-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo dans le dΓ©sert# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, un #par de dekus subterrΓ‘neos# del desierto venden #[[1]]#. @@ -1438,12 +1438,12 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, una #vaca del establo# brinda #[[1]]#. hintTextTable[RHT_LLR_TOWER_RIGHT_COW] = HintText(CustomMessage("They say that a #cow in a ranch silo# gifts #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Kuh in einem Silo# #[[1]]# schenke.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Kuh in einem Farmsilo# #[[1]]# schenke.", /*french*/ "Selon moi, la #vache dans le silo de la ferme# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #vaca del granero# brinda #[[1]]#. hintTextTable[RHT_LLR_TOWER_LEFT_COW] = HintText(CustomMessage("They say that a #cow in a ranch silo# gifts #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Kuh in einem Silo# #[[1]]# schenke.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Kuh in einem Farmsilo# #[[1]]# schenke.", /*french*/ "Selon moi, la #vache dans le silo de la ferme# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #vaca del granero# brinda #[[1]]#. @@ -1453,7 +1453,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, una #vaca enjaulada de una casa# brinda #[[1]]#. hintTextTable[RHT_DMT_COW_GROTTO_COW] = HintText(CustomMessage("They say that a #cow in a luxurious hole# offers #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Kuh in einem luxuriΓΆsen Loch# #[[1]]# offeriere.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Kuh in einem luxuriΓΆsen Erdloch# #[[1]]# offeriere.", /*french*/ "Selon moi, la #vache dans une grotte luxueuse# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #vaca de un lujoso hoyo# brinda #[[1]]#. @@ -1463,17 +1463,17 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, una #colmena sobre un cofre# esconde #[[1]]#. hintTextTable[RHT_BEEHIVE_LONELY_SCRUB_GROTTO] = HintText(CustomMessage("They say that a #beehive above a lonely scrub# hides #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Bienenstock oberhalb eines einsamen Deku# #[[1]]# verberge.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Bienenstock oberhalb eines einsamen Deku-HΓ€ndlers# #[[1]]# verberge.", /*french*/ "Selon moi, une #ruche au dessus d'une Peste Mojo solitaire# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #colmena sobre un deku solitario# esconde #[[1]]#. hintTextTable[RHT_BEEHIVE_SCRUB_PAIR_GROTTO] = HintText(CustomMessage("They say that a #beehive above a pair of scrubs# hides #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Bienenstock oberhalb eines Deku-Paars# #[[1]]# verberge.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Bienenstock oberhalb eines Deku-HΓ€ndler-Paars# #[[1]]# verberge.", /*french*/ "Selon moi, une #ruche au dessus d'un duo de Pestes Mojo# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #colmena sobre un par de dekus# esconde #[[1]]#. hintTextTable[RHT_BEEHIVE_SCRUB_TRIO_GROTTO] = HintText(CustomMessage("They say that a #beehive above a trio of scrubs# hides #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Bienenstock oberhalb eines Deku-Trios# #[[1]]# verberge.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Bienenstock oberhalb eines Deku-HΓ€ndler-Trios# #[[1]]# verberge.", /*french*/ "Selon moi, une #ruche au dessus d'un trio de Pestes Mojo# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #colmena sobre un trΓ­o de dekus# esconde #[[1]]#. @@ -1483,65 +1483,65 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*spanish*/ SegΓΊn dicen, una #colmena sobre una vaca# esconde #[[1]]#. hintTextTable[RHT_BEEHIVE_IN_FRONT_OF_KING_ZORA] = HintText(CustomMessage("They say that a #beehive in front of the king of the zoras# hides #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Bienenstock vor dem Zora-KΓΆnig# #[[1]]# verberge.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Bienenstock vor dem KΓΆnig der Zoras# #[[1]]# verberge.", /*french*/ "Selon moi, une #ruche devant le Roi des Zoras# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #colmena delante del rey de los zoras# esconde #[[1]]#. hintTextTable[RHT_BEEHIVE_BEHIND_KING_ZORA] = HintText(CustomMessage("They say that a #beehive behind the king of the zoras# hides #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Bienenstock hinter dem Zora-KΓΆnig# #[[1]]# verberge.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Bienenstock hinter dem KΓΆnig der Zoras# #[[1]]# verberge.", /*french*/ "Selon moi, une #rucheau derriΓ¨re le Roi des Zoras# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, una #colmena detrΓ‘s del rey de los zoras# esconde #[[1]]#. hintTextTable[RHT_POT_KOKIRI_FOREST] = HintText(CustomMessage("They say that a #pot in Kokiri Forest# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Vase im Kokiri-Wald# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Krug im Kokiri-Wald# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la FΓ΄ret Kokiri# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_GERUDO_FORTRESS] = HintText(CustomMessage("They say that a #pot in Gerudo Fortress# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Vase in der Gerudo-Festung# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Krug in der Gerudo-Festung# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la Forteresse Gerudo# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_WASTELAND] = HintText(CustomMessage("They say that a #pot in Haunted Wasteland# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Vase in der GespensterwΓΌste# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Krug in der GespensterwΓΌste# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le DΓ©sert HantΓ©# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_MARKET] = HintText(CustomMessage("They say that a #pot in Market# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Vase auf dem Markt# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Krug auf dem Markt# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la Place du MarchΓ©# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_KAKARIKO] = HintText(CustomMessage("They say that a #pot in Kakariko Village# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Vase in Kakariko# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Krug in Kakariko# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Village de Cocorico# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_GRAVEYARD] = HintText(CustomMessage("They say that a #pot in Graveyard# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Vase auf dem Friedhof# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Krug auf dem Friedhof# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le CimetiΓ¨re# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_GORON_CITY] = HintText(CustomMessage("They say that a #pot in Goron City# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Vase in Goronia# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Krug in Goronia# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Village Goron# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_DEATH_MOUNTAIN_CRATER] = HintText(CustomMessage("They say that a #pot in Death Mountain Crater# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Vase im Todeskrater# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Krug im Todeskrater# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre sur le Mont du PΓ©ril# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_ZORAS_DOMAIN] = HintText(CustomMessage("They say that a #pot in Zora's Domain# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Vase in Zoras Reich# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Krug in Zoras Reich# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Domaine Zora# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_ZORAS_FOUNTAIN] = HintText(CustomMessage("They say that a #pot in Zora's Fountain# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Vase in Zoras Quelle# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Krug in Zoras Quelle# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la Fontaine Zora# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_LON_LON_RANCH] = HintText(CustomMessage("They say that a #pot in Lon Lon Ranch# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Vase auf der Lon Lon-Farm# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Krug auf der Lon Lon-Farm# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le Ranch Lon Lon# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_HYRULE_FIELD] = HintText(CustomMessage("They say that a #pot in Hyrule Field# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Vase in der Hylianischen Steppe# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Krug in der Hylianischen Steppe# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la Plaine d'Hyrule# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_POT_HYRULE_CASTLE] = HintText(CustomMessage("They say that a #pot in Hyrule Castle# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Vase in Schloß Hyrule# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß ein #Krug in Schloß Hyrule# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans le ChΓ’teau d'Hyrule# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_KOKIRI_FOREST_RUPEE] = HintText(CustomMessage("They say that a rupee in a #tranquil forest# hides #[[1]]#.", @@ -1557,23 +1557,23 @@ void StaticData::HintTable_Init_Exclude_Overworld() { /*french*/ "Selon moi, un cΕ“ur dans la #maison d'une amie chΓ¨re# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_LOST_WOODS_RUPEE] = HintText(CustomMessage("They say that under a #boulder in the woods# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß unter einem #Felsen in den WΓ€ldern# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß unter einem #Felsen in den WΓ€ldern# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, sous un #rocher dans les bois# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_LOST_WOODS_SHORTCUT_RUPEE] = HintText(CustomMessage("They say that in a #pool of water in the woods# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß in einem #Wasserbecken in den WΓ€ldern# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß in einem #Wasserbecken in den WΓ€ldern# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, dans une #mare d'eau dans les bois# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_LAKE_HYLIA_RUPEE] = HintText(CustomMessage("They say that just off the #coast of a lake# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß an der #KΓΌste eines Sees# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß vor dem #Ufer eines Sees# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, juste au large de la #cΓ΄te d'un lac# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_LABORATORY_RUPEE] = HintText(CustomMessage("They say that at the #bottom of a tank# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf dem #Grund eines Reservoirs# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß auf dem #Grund eines Reservoirs# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, au #fond d'un rΓ©servoir# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_DAMPES_GRAVE_RUPEE] = HintText(CustomMessage("They say that within a #quick-footed spirit's grave# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß innerhalb eines #Grabes eines leichtfüßigen Geistes# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß innerhalb eines #Grabes eines leichtfüßigen Geistes# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, dans la #tombe d'un esprit Γ  pieds rapides# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_GERUDO_VALLEY_GROTTO_RUPEE] = HintText(CustomMessage("They say that an Octarok in an #underground spring# guards #[[1]]#.", @@ -1581,360 +1581,360 @@ void StaticData::HintTable_Init_Exclude_Overworld() { /*french*/ "Selon moi, un Octrocher dans une #source souterraine# garde #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_DEATH_MOUNTAIN_TRAIL_RUPEE] = HintText(CustomMessage("They say that beneath a boulder on a #mountain's cliffside# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß unterhalb eines Felsens an einem #abfallenden Felswand eines Berges# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß unterhalb eines Felsens an der #Klippe eines Berges# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, sous un rocher sur la #falaise d'une montagne# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_HEART] = HintText(CustomMessage("They say that accompanying a #cow in a small cave# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß unterhalb eines Felsens an einem #abfallenden Felswand eines Berges# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß neben einer #Kuh in einer kleinen HΓΆhle# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, accompagner une #vache dans une petite grotte# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE] = HintText(CustomMessage("They say that accompanying a #cow in a small cave# is #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das Begleiten einer #Kuh in einer kleinen HΓΆhle# #[[1]]# sei.", + /*german*/ "Man erzΓ€hlt sich, daß neben einer #Kuh in einer kleinen HΓΆhle# #[[1]]# |sei|seien|.", /*french*/ "Selon moi, accompagner une #vache dans une petite grotte# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_DEATH_MOUNTAIN_CRATER_RUPEE] = HintText(CustomMessage("They say that on a #small platform suspended above lava# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf einer #oberhalb von Lava hΓ€ngenden kleinen Plattform# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß auf einer #auf Lava schwimmenden kleinen Plattform# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, sur une #petite plateforme suspendue au-dessus de la lave# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_ZORAS_RIVER_WATERFALL_RUPEE] = HintText(CustomMessage("They say that beneath a #waterfall feeding a narrow river# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß unterhalb eines #einen schmalen Fluss nΓ€hrenden Wasserfall# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß unterhalb eines #Wasserfalls der einen schmalen Fluß nΓ€hre# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, sous une #cascade alimentant une riviΓ¨re Γ©troite# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_ZORAS_FOUNTAIN_RUPEE] = HintText(CustomMessage("They say that at the bottom of a #partially-frozen spring# lies #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß auf dem Grund einer #teilweise gefrorenen Quelle# #[[1]]# lΓ€ge.", + /*german*/ "Man erzΓ€hlt sich, daß auf dem Grund einer #teilweise gefrorenen Quelle# #[[1]]# |lΓ€ge|lΓ€gen|.", /*french*/ "Selon moi, au fond d'une #source partiellement gelΓ©e# se trouve #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ hintTextTable[RHT_SFM_FAIRY_GROTTO_FAIRY] = HintText(CustomMessage("They say that within #a fountain beneath a forest meadow# rests #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß innerhalb #eines Brunnens unter einer Waldwiese# #[[1]]# ruhe.", + /*german*/ "Man erzΓ€hlt sich, daß innerhalb #eines Brunnens unter einer Waldlichtung# #[[1]]# |ruhe|ruhen|.", /*french*/ "Selon moi, dans #une fontaine sous un bosquet forestier# repose #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZR_FAIRY_GROTTO_FAIRY] = HintText(CustomMessage("They say that within #a fountain beneath a river# rests #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß innerhalb #eines Brunnens unter einem Fluß# #[[1]]# ruhe.", + /*german*/ "Man erzΓ€hlt sich, daß innerhalb #eines Brunnens unter einem Fluß# #[[1]]# |ruhe|ruhen|.", /*french*/ "Selon moi, dans #une fontaine sous une riviΓ¨re# repose #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_HF_FAIRY_GROTTO_FAIRY] = HintText(CustomMessage("They say that within #a fountain beneath a few trees bordering a wide field# rests #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß innerhalb #eines Brunnens unter ein weites Feld angrenzenden BΓ€umen# #[[1]]# ruhe.", + /*german*/ "Man erzΓ€hlt sich, daß innerhalb #eines Brunnens, unter BΓ€umen auf einer weiten Steppe#, #[[1]]# |ruhe|ruhen|.", /*french*/ "Selon moi, dans #une fontaine sous quelques arbres bordant un vaste champ# repose #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZD_FAIRY_GROTTO_FAIRY] = HintText(CustomMessage("They say that within #a fountain beneath the home of the Zoras# rests #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß innerhalb #eines Brunnens unter der Heimat der Zoras# #[[1]]# ruhe.", + /*german*/ "Man erzΓ€hlt sich, daß innerhalb #eines Brunnens unter der Heimat der Zoras# #[[1]]# |ruhe|ruhen|.", /*french*/ "Selon moi, dans #une fontaine sous la maison des Zora# repose #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GF_FAIRY_GROTTO_FAIRY] = HintText(CustomMessage("They say that within #a fountain beneath the home of thieves# rests #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß innerhalb #eines Brunnens unter der Heimat von Dieben# #[[1]]# ruhe.", + /*german*/ "Man erzΓ€hlt sich, daß innerhalb #eines Brunnens unter der Heimat der Diebe# #[[1]]# |ruhe|ruhen|.", /*french*/ "Selon moi, dans #une fontaine sous la maison des voleurs# repose #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY] = HintText(CustomMessage("They say that within #a fountain behind a wall within a grave# rests #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß innerhalb #eines Brunnens unter einer Mauer innerhalb eines Grabes# #[[1]]# ruhe.", + /*german*/ "Man erzΓ€hlt sich, daß innerhalb #eines Brunnens, hinter einer Mauer eines Grabes#, #[[1]]# |ruhe|ruhen|.", /*french*/ "Selon moi, dans #une fontaine derriΓ¨re un mur dans une tombe# repose #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_COLOSSUS_OASIS_FAIRY] = HintText(CustomMessage("They say that #restoring water to a dried oasis# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Wiederbringen von Wasser zu einer ausgetrockneten Oase# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß eine #ausgetrockneten Oase wieder aufzufΓΌllen# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #restaurer l'eau dans un oasis assΓ©chΓ©# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZR_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout on the riverside# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #WΓ€ssern eines jungen Sprosses am Flußufer# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #WΓ€ssern eines jungen Sproßes am Flußufer# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #arroser une jeune pousse au bord de la riviΓ¨re# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_KF_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout near a forest shop# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #WΓ€ssern eines jungen Sprosses nahe des Waldladens# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #WΓ€ssern eines jungen Sproßes nahe des Kokiri-Ladens# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #arroser une jeune pousse prΓ¨s d'un magasin forestier# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout near the entrance to the forest# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #WΓ€ssern eines jungen Sprosses nahe des Eingangs zum Wald# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #WΓ€ssern eines jungen Sproßes nahe des Waldeingangs# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #arroser une jeune pousse prΓ¨s de l'entrΓ©e de la forΓͺt# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout above a sylvan theatre# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #WΓ€ssern eines jungen Sprosses oberhalb eines waldigen Theaters# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #WΓ€ssern eines jungen Sproßes oberhalb eines waldigen Theaters# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #arroser une jeune pousse au-dessus d'un théÒtre sylvestre# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout on the lakeside# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #WΓ€ssern eines jungen Sprosses am Seeufer# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #WΓ€ssern eines jungen Sproßes am Seeufer# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #arroser une jeune pousse au bord du lac# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GV_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout on the side of a canyon# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #WΓ€ssern eines jungen Sprosses an der Seite einer Schlucht# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #WΓ€ssern eines jungen Sproßes an der Seite einer Schlucht# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #arroser une jeune pousse sur le cΓ΄tΓ© d'un canyon# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_COLOSSUS_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout near a temple of the sand# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #WΓ€ssern eines jungen Sprosses nahe eines Tempels des Sandes# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #WΓ€ssern eines jungen Sproßes nahe eines Tempels des Sandes# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #arroser une jeune pousse prΓ¨s d'un temple du sable# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GRAVEYARD_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout within a graveyard# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #WΓ€ssern eines jungen Sprosses auf einem Friedhof# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #WΓ€ssern eines jungen Sproßes auf einem Friedhof# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #arroser une jeune pousse dans un cimetiΓ¨re# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMC_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout within a volcano# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #WΓ€ssern eines jungen Sprosses innerhalb eines Vulkans# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #WΓ€ssern eines jungen Sproßes innerhalb eines Vulkans# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #arroser une jeune pousse dans un volcan# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMT_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout on the mountainside# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #WΓ€ssern eines jungen Sprosses an einem Berghang# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #WΓ€ssern eines jungen Sproßes an einem Berghang# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #arroser une jeune pousse sur le flanc d'une montagne# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_TOT_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone in the outskirts of the market# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein am Rand des Marktes# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein am Rand des Marktes#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange en pΓ©riphΓ©rie du marchΓ©# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_TOT_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone in the outskirts of the market# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein am Rand des Marktes# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein am Rand des Marktes#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange en pΓ©riphΓ©rie du marchΓ©# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMC_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone within a volcano# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein innerhalb eines Vulkans# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein innerhalb eines Vulkans#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange dans un volcan# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMC_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone within a volcano# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein innerhalb eines Vulkans# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein innerhalb eines Vulkans#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange dans un volcan# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMT_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone on a mountain cliff face# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein an einer Bergklippe# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein an einer Bergklippe#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange sur une falaise de montagne# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMT_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone on a mountain cliff face# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein an einer Bergklippe# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein an einer Bergklippe#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange sur une falaise de montagne# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_COLOSSUS_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone near the temple of the sand# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein nahe des Tempels des Sandes# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein nahe des Tempels des Sandes#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange prΓ¨s du temple du sable# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_COLOSSUS_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone near the temple of the sand# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein nahe des Tempels des Sandes# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein nahe des Tempels des Sandes#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange prΓ¨s du temple du sable# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GV_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone near a canyon waterfall# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein nahe eines Wasserfalls in einer Schlucht# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein nahe eines Wasserfalls in einer Schlucht#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange prΓ¨s d'une cascade de canyon# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GV_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone near a canyon waterfall# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein nahe eines Wasserfalls in einer Schlucht# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein nahe eines Wasserfalls in einer Schlucht#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange prΓ¨s d'une cascade de canyon# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GC_MAZE_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone behind a maze of rock# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein hinter einem Felslabyrinth# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein hinter einem Felslabyrinth#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange derriΓ¨re un labyrinthe de roches# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GC_MAZE_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone behind a maze of rock# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein hinter einem Felslabyrinth# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein hinter einem Felslabyrinth#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange derriΓ¨re un labyrinthe de roches# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone near a blacksmith# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein nahe eines Schmiedes# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein nahe eines Schmiedes#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange prΓ¨s d'un forgeron# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone near a blacksmith# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein nahe eines Schmiedes# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein nahe eines Schmiedes#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange prΓ¨s d'un forgeron# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GRAVEYARD_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone overlooking the graveyard# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein, welcher den Friedhof ΓΌberblickt#, #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein, welcher den Friedhof ΓΌberblickt#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange surplombant le cimetiΓ¨re# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone overlooking the graveyard# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein, welcher den Friedhof ΓΌberblickt#, #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein, welcher den Friedhof ΓΌberblickt#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange surplombant le cimetiΓ¨re# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_HC_MALON_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone overlooking the path to the castle# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein, welcher den Pfad zum Schloß ΓΌberblickt#, #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein, welcher den Pfad zum Schloß ΓΌberblickt#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange surplombant le chemin du chΓ’teau# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_HC_MALON_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone overlooking the path to the castle# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein, welcher den Pfad zum Schloß ΓΌberblickt#, #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein, welcher den Pfad zum Schloß ΓΌberblickt#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange surplombant le chemin du chΓ’teau# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone near a secret path to the castle# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein nahe eines geheimen Pfades zum Schloß# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein nahe eines geheimen Pfades zum Schloß#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange prΓ¨s d'un chemin secret vers le chΓ’teau# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone near a secret path to the castle# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein nahe eines geheimen Pfades zum Schloß# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein nahe eines geheimen Pfades zum Schloß#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange prΓ¨s d'un chemin secret vers le chΓ’teau# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath the castle# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein unterhalb des Schloßes# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein unterhalb des Schloßes#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange sous le chΓ’teau# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath the castle# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein unterhalb des Schloßes# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein unterhalb des Schloßes#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange sous le chΓ’teau# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone near an ancient tree# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein nahe eines antiken Baumes# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein nahe eines antiken Baumes#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange prΓ¨s d'un arbre ancien# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone near an ancient tree# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein nahe eines antiken Baumes# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein nahe eines antiken Baumes#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange prΓ¨s d'un arbre ancien# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_KF_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone overlooking a forest village# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein, welcher ein Dorf im Wald ΓΌberblickt#, #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein, welcher ein Dorf im Wald ΓΌberblickt#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange surplombant un village forestier# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_KF_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone overlooking a forest village# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein, welcher ein Dorf im Wald ΓΌberblickt#, #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein, welcher ein Dorf im Wald ΓΌberblickt#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange surplombant un village forestier# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath a forest village# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein unterhalb eines Dorfes im Wald# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein unterhalb eines Dorfes im Wald#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange sous un village forestier# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath a forest village# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein unterhalb eines Dorfes im Wald# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein unterhalb eines Dorfes im Wald#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange sous un village forestier# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_LAB_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone overlooking the river feeding a lake# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein, welcher einen See nΓ€hrenden Fluß ΓΌberblickt#, #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein, welcher einen See nΓ€hrenden Fluß ΓΌberblickt#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange surplombant la riviΓ¨re qui alimente un lac# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_LAB_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone overlooking the river feeding a lake# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein, welcher einen See nΓ€hrenden Fluß ΓΌberblickt#, #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein, welcher einen See nΓ€hrenden Fluß ΓΌberblickt#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange surplombant la riviΓ¨re qui alimente un lac# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone at the back of a lake# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein am RΓΌcken eines Sees# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein am RΓΌcken eines Sees#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange au fond d'un lac# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone at the back of a lake# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein am RΓΌcken eines Sees# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein am RΓΌcken eines Sees#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange au fond d'un lac# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone at the back of a lake# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein am RΓΌcken eines Sees# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein am RΓΌcken eines Sees#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange au fond d'un lac# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone at the back of a lake# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein am RΓΌcken eines Sees# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein am RΓΌcken eines Sees#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange au fond d'un lac# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LW_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone within a perplexing wood# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein innerhalb eines verwirrenden Waldes# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein innerhalb eines verwirrenden Waldes#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange dans un bois dΓ©routant# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LW_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone within a perplexing wood# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein innerhalb eines verwirrenden Waldes# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein innerhalb eines verwirrenden Waldes#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange dans un bois dΓ©routant# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_SFM_MAZE_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone overlooking a forest maze# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein, welcher ein Waldlabyrinth ΓΌberblickt#, #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein, welcher ein Waldlabyrinth ΓΌberblickt#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange surplombant un labyrinthe forestier# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_SFM_MAZE_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone overlooking a forest maze# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein, welcher ein Waldlabyrinth ΓΌberblickt#, #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein, welcher ein Waldlabyrinth ΓΌberblickt#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange surplombant un labyrinthe forestier# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_SFM_SARIA_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone watching a hiding place in the woods# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein, welcher ein Versteck im Wald ΓΌberblickt#, #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein, welcher ein Versteck im Wald ΓΌberblickt#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange surveillant une cachette dans les bois# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone watching a hiding place in the woods# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein, welcher ein Versteck im Wald ΓΌberblickt#, #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein, welcher ein Versteck im Wald ΓΌberblickt#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange surveillant une cachette dans les bois# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZD_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone listening to an aquatic king# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein, welcher einem aquatischen KΓΆnig zuhΓΆrt#, #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein, welcher einem aquatischen KΓΆnig zuhΓΆrt#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange Γ©coutant un roi aquatique# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZD_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone listening to an aquatic king# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein, welcher einem aquatischen KΓΆnig zuhΓΆrt#, #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein, welcher einem aquatischen KΓΆnig zuhΓΆrt#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange Γ©coutant un roi aquatique# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone in the outskirts of a deep fountain# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein am Rand eines tiefen Brunnens# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein am Rand eines tiefen Brunnens#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange en pΓ©riphΓ©rie d'une profonde fontaine# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone in the outskirts of a deep fountain# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein am Rand eines tiefen Brunnens# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein am Rand eines tiefen Brunnens#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange en pΓ©riphΓ©rie d'une profonde fontaine# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZF_JABU_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone watching a guardian of the sea# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein, welcher einen WΓ€chter des Meeres beobachtet#, #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein, welcher einen WΓ€chter des Meeres beobachtet#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange surveillant un gardien de la mer# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZF_JABU_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone watching a guardian of the sea# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein, welcher einen WΓ€chter des Meeres beobachtet#, #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein, welcher einen WΓ€chter des Meeres beobachtet#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange surveillant un gardien de la mer# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone overwatching a river# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein, welcher einen Fluß ΓΌberblickt#, #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein, welcher einen Fluß ΓΌberblickt#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange surplombant une riviΓ¨re# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone overwatching a river# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein, welcher einen Fluß ΓΌberblickt#, #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein, welcher einen Fluß ΓΌberblickt#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange surplombant une riviΓ¨re# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath a waterfall# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein unterhalb eines Wasserfalls# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein unterhalb eines Wasserfalls#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange sous une cascade# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath a waterfall# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein unterhalb eines Wasserfalls# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein unterhalb eines Wasserfalls#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange sous une cascade# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone hiding near a cow# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein, welcher sich nahe einer Kuh versteckt#, #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein, welcher sich nahe einer Kuh versteckt#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange cachΓ©e prΓ¨s d'une vache# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone hiding near a cow# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein, welcher sich nahe einer Kuh versteckt#, #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein, welcher sich nahe einer Kuh versteckt#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange cachΓ©e prΓ¨s d'une vache# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath the entrance to the market# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein unterhalb des Eingangs zum Markt# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein unterhalb des Eingangs zum Markt# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange sous l'entrΓ©e du marchΓ©# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath the entrance to the market# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein unterhalb des Eingangs zum Markt# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein unterhalb des Eingangs zum Markt#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange sous l'entrΓ©e du marchΓ©# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath trees guarded by a Peahat# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein unterhalb von Killeranas bewachten BΓ€umen# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein unterhalb von Killeranas bewachten BΓ€umen#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange sous des arbres gardΓ©s par un Peahat# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath trees guarded by a Peahat# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein unterhalb von Killeranas bewachten BΓ€umen# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein unterhalb von Killeranas bewachten BΓ€umen#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange sous des arbres gardΓ©s par un Peahat# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath a village at the base of a mountain# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein unterhalb eines Dorfes am Fuße eines Berges# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein unterhalb eines Dorfes am Fuße eines Berges#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange sous un village au pied d'une montagne# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath a village at the base of a mountain# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein unterhalb eines Dorfes am Fuße eines Berges# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein unterhalb eines Dorfes am Fuße eines Berges#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange sous un village au pied d'une montagne# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone within a plateau by a river# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein auf einem Plateau von einem Fluß# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein auf einem Plateau an einem Fluß#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange dans un plateau prΓ¨s d'une riviΓ¨re# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone within a plateau by a river# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein auf einem Plateau bei einem Fluß# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein auf einem Plateau an einem Fluß#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange dans un plateau prΓ¨s d'une riviΓ¨re# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath an escape from the forest# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein unterhalb eines Auswegs des Waldes# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein unterhalb eines Auswegs des Waldes#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange sous une issue de la forΓͺt# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath an escape from the forest# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein unterhalb eines Auswegs des Waldes# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein unterhalb eines Auswegs des Waldes#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange sous une issue de la forΓͺt# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone beneath the entrance to a village within a mountain# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein unterhalb eines Eingangs zu einem Dorf innerhalb eines Berges# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein unterhalb eines Eingangs zu einem Dorf innerhalb eines Berges#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange sous l'entrΓ©e d'un village dans une montagne# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone beneath the entrance to a village within a mountain# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein unterhalb eines Eingangs zu einem Dorf innerhalb eines Berges# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein unterhalb eines Eingangs zu einem Dorf innerhalb eines Berges#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange sous l'entrΓ©e d'un village dans une montagne# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone within the side of a crater# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie fΓΌr einen seltsamen Stein innerhalb der Seite eines Kraters# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer Melodie, fΓΌr einen seltsamen Stein innerhalb der Seite eines Kraters#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie pour une pierre Γ©trange dans le cΓ΄tΓ© d'un cratΓ¨re# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG] = HintText(CustomMessage("They say that #playing a stormy tune for an odd stone within the side of a crater# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie fΓΌr einen seltsamen Stein innerhalb der Seite eines Kraters# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Spielen einer stΓΌrmischen Melodie, fΓΌr einen seltsamen Stein innerhalb der Seite eines Kraters#, #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse pour une pierre Γ©trange dans le cΓ΄tΓ© d'un cratΓ¨re# rΓ©vΓ¨le [[1]].", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_ISLAND_SUN_FAIRY] = HintText(CustomMessage("They say that #summoning the sun on the lake's island# calls #[[1]]#.", @@ -1942,11 +1942,11 @@ void StaticData::HintTable_Init_Exclude_Overworld() { /*french*/ "Selon moi, #appeler le soleil sur l'Γle du lac # rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_HF_POND_STORMS_FAIRY] = HintText(CustomMessage("They say that #calling rain to the field's pond# summons #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Anrufen des Regens fΓΌr den TΓΌmpel eines Feldes# #[[1]]# beschwΓΆre.", + /*german*/ "Man erzΓ€hlt sich, daß das #Anrufen des Regens fΓΌr den TΓΌmpel einer Steppe# #[[1]]# beschwΓΆre.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse dans l'Γ©tang d'une plaine# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_HF_FENCE_GROTTO_STORMS_FAIRY] = HintText(CustomMessage("They say that #making it rain in a scrub's cave# wakes #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Machen von Regen in der HΓΆhle eines Dekus# #[[1]]# erwecke.", + /*german*/ "Man erzΓ€hlt sich, daß das #Machen von Regen in der HΓΆhle eines Deku-HΓ€ndlers# #[[1]]# erwecke.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse dans la grotte d'une Peste Mojo# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_DMT_FLAG_SUN_FAIRY] = HintText(CustomMessage("They say that #changing the time in front of the trail's flag# reveals #[[1]]#.", @@ -1966,7 +1966,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { /*french*/ "Selon moi, #appeler le soleil dans une cuisine gardΓ©e# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun for scrubs in the Lost Woods# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Anrufen der Sonne fΓΌr Dekus in den verlorenen WΓ€ldern# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #Anrufen der Sonne fΓΌr Deku-HΓ€ndler in den verlorenen WΓ€ldern# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #appeler le soleil pour les Pestes dans les Bois Perdus # rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun in a royal tomb# reveals #[[1]]#.", @@ -1974,43 +1974,43 @@ void StaticData::HintTable_Init_Exclude_Overworld() { /*french*/ "Selon moi, #appeler le soleil dans une tombe royale# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_KF_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a forest# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Schneiden einiger GrΓ€ser in einem Wald# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #MΓ€hen von Gras in einem Wald# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, de l'#herbe dans un fΓ΄ret# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_LW_GRASS] = HintText(CustomMessage("They say that #cutting some grass in the woods# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Schneiden einiger GrΓ€ser in den WΓ€ldern# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #MΓ€hen von Gras in den WΓ€ldern# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, de l'#herbe dans des bois# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_MARKET_GRASS] = HintText(CustomMessage("They say that #cutting some grass in the market# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Schneiden einiger GrΓ€ser auf dem Markt# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #MΓ€hen von Gras auf dem Markt# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, de l'#herbe dans un marchΓ©# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_HC_GRASS] = HintText(CustomMessage("They say that #cutting some grass near the castle# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Schneiden einiger GrΓ€ser in der NΓ€he vom Schloß# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #MΓ€hen von Gras in der NΓ€he des Schloßes# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, de l'#herbe prΓ¨s du chΓ’teau# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_KAK_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a village# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Schneiden einiger GrΓ€ser in einem Dorf# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #MΓ€hen von Gras in einem Dorf# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, de l'#herbe dans un village# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GY_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a graveyard# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Schneiden einiger GrΓ€ser auf einem Friedhof# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #MΓ€hen von Gras auf einem Friedhof# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, de l'#herbe dans un cimetΓ¨re# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_GRASS] = HintText(CustomMessage("They say that #cutting some grass near a lake# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Schneiden einiger GrΓ€ser nahe eines Sees# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #MΓ€hen von Gras nahe eines Sees# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, de l'#herbe prΓ¨s d'un lac# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_HF_GRASS] = HintText(CustomMessage("They say that #cutting some grass on a field# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Schneiden einiger GrΓ€ser auf einem Feld# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #MΓ€hen von Gras auf einer Steppe# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, de l'#herbe dans une plaine# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_ZR_GRASS] = HintText(CustomMessage("They say that #cutting some grass near a river# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Schneiden einiger GrΓ€ser in der NΓ€he von einem Fluß# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #MΓ€hen von Gras in der NΓ€he eines Flußes# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, de l'#herbe prΓ¨s d'une riviΓ¨re# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_GROTTO_GRASS] = HintText(CustomMessage("They say that #cutting some grass in a grotto# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Schneiden einiger GrΓ€ser in einer Grotte# #[[1]]# enthΓΌlle.", + /*german*/ "Man erzΓ€hlt sich, daß das #MΓ€hen von Gras in einer Grotte# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, de l'#herbe# cache #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_GERUDO_VALLEY] = HintText(CustomMessage("They say that a #crate in Gerudo Valley# contains #[[1]]#.", @@ -2018,19 +2018,19 @@ void StaticData::HintTable_Init_Exclude_Overworld() { /*french*/ "Selon moi, une #caisse dans une vallΓ©e# a #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_GERUDOS_FORTRESS] = HintText(CustomMessage("They say that a #crate in Gerudo Fortress# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Kiste in der Gerudofestung# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Kiste in der Gerudo-Festung# #[[1]]# enthielte.", /*french*/ "Selon moi, une #caisse dans la Forteresse Gerudo# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_WASTELAND] = HintText(CustomMessage("They say that a #crate in Haunted Wasteland# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Kiste im Gerudotal# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Kiste in der GespensterwΓΌste# #[[1]]# enthielte.", /*french*/ "Selon moi, une #caisse dans le DΓ©sert HantΓ©# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_MARKET] = HintText(CustomMessage("They say that a #crate in the Market# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Kiste in der GespensterwΓΌste# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Kiste auf dem Markt# #[[1]]# enthielte.", /*french*/ "Selon moi, une #caisse dans la Place du MarchΓ©# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_KAKARIKO_VILLAGE] = HintText(CustomMessage("They say that a #crate in Kakariko Village# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Kiste im Dorf von Kakariko# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Kiste in Kakariko# #[[1]]# enthielte.", /*french*/ "Selon moi, une #caisse dans le Village de Cocorico# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_GRAVEYARD] = HintText(CustomMessage("They say that a #crate in the Graveyard# contains #[[1]]#.", @@ -2050,7 +2050,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { /*french*/ "Selon moi, une #caisse dans le Ranch Lon Lon# contient #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_CRATE_LAKESIDE_LABORATORY] = HintText(CustomMessage("They say that a #crate in the Laboratory# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß eine #Kiste im Laboratorium# #[[1]]# enthielte.", + /*german*/ "Man erzΓ€hlt sich, daß eine #Kiste im Labor am See# #[[1]]# enthielte.", /*french*/ "Selon moi, une #caisse dans un laboratoire# contient #[[1]]#.", {QM_RED, QM_GREEN})); // clang-format on diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp index 5afa0f847..f5195c91d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp @@ -15,9 +15,9 @@ void StaticData::HintTable_Init_Item() { }, { CustomMessage("a butter knife", /*german*/"ein Buttermesser", /*french*/"un couteau Γ  beurre"), // /*spanish*/un Γ‘gil puΓ±al - CustomMessage("a starter slasher", /*german*/"ein AnfΓ€ngerschwert", /*french*/"une arme de dΓ©butant"), + CustomMessage("a starter slasher", /*german*/"ein Schlitzer fΓΌr AnfΓ€nger", /*french*/"une arme de dΓ©butant"), // /*spanish*/una hoja de principiantes - CustomMessage("a switchblade", /*german*/"ein Stellmesser", /*french*/"un canif")}); + CustomMessage("a switchblade", /*german*/"ein Taschenmesser", /*french*/"un canif")}); // /*spanish*/una navaja hintTextTable[RHT_MASTER_SWORD] = HintText(CustomMessage("the Master Sword", /*german*/"das Master-Schwert", /*french*/"l'Γ‰pΓ©e de LΓ©gende"), @@ -26,7 +26,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a sword", /*german*/"ein Schwert", /*french*/"une Γ©pΓ©e") // /*spanish*/una espada }, { - CustomMessage("evil's bane", /*german*/"der bΓΆse Fluch", /*french*/"le flΓ©au du mal"), + CustomMessage("evil's bane", /*german*/"der Ruin des BΓΆsen", /*french*/"le flΓ©au du mal"), // /*spanish*/la destructora del mal CustomMessage("a seven year limbo", /*german*/"eine siebenjΓ€hrige Erwartung", /*french*/"une stase de sept ans")}); // /*spanish*/unos siete aΓ±os de espera @@ -37,7 +37,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a sword", /*german*/"ein Schwert", /*french*/"une Γ©pΓ©e") // /*spanish*/una espada }, { - CustomMessage("a fragile blade", /*german*/"ein fragiles Schwert", /*french*/"une lame fragile"), + CustomMessage("a fragile blade", /*german*/"eine fragile Klinge", /*french*/"une lame fragile"), // /*spanish*/una frΓ‘gil hoja CustomMessage("a breakable cleaver", /*german*/"ein brΓΌchiger Spalter", /*french*/"un espadon de verre")}); // /*spanish*/un rompible acero @@ -48,7 +48,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a sword", /*german*/"ein Schwert", /*french*/"une Γ©pΓ©e") // /*spanish*/una espada }, { - CustomMessage("the biggest blade", /*german*/"das grâßte Schwert", /*french*/"une lame gigantesque"), + CustomMessage("the biggest blade", /*german*/"die grâßte Klinge", /*french*/"une lame gigantesque"), // /*spanish*/el mayor mandoble CustomMessage("a colossal cleaver", /*german*/"ein kolossaler Spalter", /*french*/"un espadon colossal")}); // /*spanish*/un estoque colosal @@ -59,7 +59,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a shield", /*german*/"ein Schild", /*french*/"un bouclier") // /*spanish*/un escudo }, { - CustomMessage("a wooden ward", /*german*/"eine hΓΆlzerne Abwehr", /*french*/"un Γ©cu d'Γ©corce"), + CustomMessage("a wooden ward", /*german*/"ein hΓΆlzerner Schutz", /*french*/"un Γ©cu d'Γ©corce"), // /*spanish*/una protecciΓ³n del bosque CustomMessage("a burnable barrier", /*german*/"eine brennbare Barriere", /*french*/"une protection inflammable")}); // /*spanish*/una barrera quemable @@ -75,7 +75,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("Like Like's metal meal", /*german*/"Raubschleims Metallmahlzeit", /*french*/"un amuse-gueule de Pudding")}); // /*spanish*/un alimento de Like Like - hintTextTable[RHT_MIRROR_SHIELD] = HintText(CustomMessage("the Mirror Shield", /*german*/"das Spiegelschild", /*french*/"le Bouclier Miroir"), + hintTextTable[RHT_MIRROR_SHIELD] = HintText(CustomMessage("the Mirror Shield", /*german*/"der Spiegel-Schild", /*french*/"le Bouclier Miroir"), // /*spanish*/el escudo espejo { CustomMessage("a shield", /*german*/"ein Schild", /*french*/"un bouclier") @@ -88,23 +88,23 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a silvered surface", /*german*/"eine silberne OberflΓ€che", /*french*/"une surface argentΓ©e")}); // /*spanish*/una superficie plateada - hintTextTable[RHT_GORON_TUNIC] = HintText(CustomMessage("a Goron Tunic", /*german*/"eine Goronen-Tunika", /*french*/"une Tunique Goron"), + hintTextTable[RHT_GORON_TUNIC] = HintText(CustomMessage("a Goron Tunic", /*german*/"eine Goronen-RΓΌstung", /*french*/"une Tunique Goron"), // /*spanish*/un sayo goron { - CustomMessage("a tunic", /*german*/"eine Tunika", /*french*/"une tunique") + CustomMessage("a tunic", /*german*/"eine RΓΌstung", /*french*/"une tunique") // /*spanish*/un sayo }, { - CustomMessage("ruby robes", /*german*/"Rubinroben", /*french*/"un pigment rouge"), + CustomMessage("ruby robes", /*german*/"Rubinroben€", /*french*/"un pigment rouge"), // /*spanish*/una vestimenta rubΓ­ CustomMessage("fireproof fabric", /*german*/"feuerfestes Gewebe", /*french*/"un trΓ©sor anti-flamme"), // /*spanish*/una ignΓ­fuga prenda - CustomMessage("cooking clothes", /*german*/"KochschΓΌrze", /*french*/"une tenue de cuisine")}); + CustomMessage("cooking clothes", /*german*/"eine KochschΓΌrze", /*french*/"une tenue de cuisine")}); // /*spanish*/unos abrasantes ropajes - hintTextTable[RHT_ZORA_TUNIC] = HintText(CustomMessage("a Zora Tunic", /*german*/"eine Zora-Tunika", /*french*/"une Tunique Zora"), + hintTextTable[RHT_ZORA_TUNIC] = HintText(CustomMessage("a Zora Tunic", /*german*/"eine Zora-RΓΌstung", /*french*/"une Tunique Zora"), // /*spanish*/un sayo zora { - CustomMessage("a tunic", /*german*/"eine Tunika", /*french*/"une tunique"), + CustomMessage("a tunic", /*german*/"eine RΓΌstung", /*french*/"une tunique"), // /*spanish*/un sayo CustomMessage("something expensive", /*german*/"etwas Teures", /*french*/"une chose dispendieuse") // /*spanish*/algo caro @@ -116,42 +116,42 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a swimsuit", /*german*/"ein Badeanzug", /*french*/"un costume de baignade")}); // /*spanish*/unos ropajes sumergibles - hintTextTable[RHT_IRON_BOOTS] = HintText(CustomMessage("the Iron Boots", /*german*/"die Eisenstiefel", /*french*/"une paire de Bottes de plomb"), + hintTextTable[RHT_IRON_BOOTS] = HintText(CustomMessage("the Iron Boots", /*german*/"die Eisenstiefel€", /*french*/"une paire de Bottes de plomb"), // /*spanish*/las botas de hierro { - CustomMessage("some boots", /*german*/"ein paar Stiefel", /*french*/"une paire de bottes"), + CustomMessage("some boots", /*german*/"ein Paar Stiefel€", /*french*/"une paire de bottes"), // /*spanish*/un par de botas CustomMessage("a feature of the Water Temple", /*german*/"ein Merkmal des Wassertempels", /*french*/"une particularitΓ© du Temple de l'Eau"), // /*spanish*/algo particular del Templo del Agua CustomMessage("something heavy", /*german*/"etwas Schweres", /*french*/"une chose pesante") // /*spanish*/algo de lo mΓ‘s pesado }, { - CustomMessage("sink shoes", /*german*/"Sinkschuhe", /*french*/"un boulet de fer"), + CustomMessage("sink shoes", /*german*/"Sinkschuhe€", /*french*/"un boulet de fer"), // /*spanish*/un calzado de las profundidades - CustomMessage("clank cleats", /*german*/"klirrende Knacken", /*french*/"une paire de talons bruyants")}); + CustomMessage("clank cleats", /*german*/"scheppernde Stollen€", /*french*/"une paire de talons bruyants")}); // /*spanish*/unas suelas fΓ©rreas - hintTextTable[RHT_HOVER_BOOTS] = HintText(CustomMessage("the Hover Boots", /*german*/"die Gleitstiefel", /*french*/"une paire de Bottes des airs"), + hintTextTable[RHT_HOVER_BOOTS] = HintText(CustomMessage("the Hover Boots", /*german*/"die Gleitstiefel€", /*french*/"une paire de Bottes des airs"), // /*spanish*/las botas voladoras { - CustomMessage("some boots", /*german*/"ein paar Stiefel", /*french*/"une paire de bottes") + CustomMessage("some boots", /*german*/"ein Paar Stiefel€", /*french*/"une paire de bottes") // /*spanish*/un par de botas }, { - CustomMessage("butter boots", /*german*/"Butterstiefel", /*french*/"une paire de patins de beurre"), + CustomMessage("butter boots", /*german*/"Butterstiefel€", /*french*/"une paire de patins de beurre"), // /*spanish*/unas suelas resvaladizas - CustomMessage("sacred slippers", /*german*/"heilige Pantoffeln", /*french*/"une paire de pantoufles sacrΓ©es"), + CustomMessage("sacred slippers", /*german*/"heilige Pantoffeln€", /*french*/"une paire de pantoufles sacrΓ©es"), // /*spanish*/unos escurridizos botines - CustomMessage("spacewalkers", /*german*/"Weltraumstiefel", /*french*/"une paire de bottes spatiales")}); + CustomMessage("spacewalkers", /*german*/"Weltraumstiefel€", /*french*/"une paire de bottes spatiales")}); // /*spanish*/un calzado antigravitatorio hintTextTable[RHT_ZELDAS_LETTER] = HintText(CustomMessage("Zelda's Letter", /*german*/"Zeldas Brief", /*french*/"la Lettre de Zelda"), // /*spanish*/la carta de Zelda {}, { - CustomMessage("an autograph", /*german*/"ein Autograph", /*french*/"un autographe"), + CustomMessage("an autograph", /*german*/"ein Autogramm", /*french*/"un autographe"), // /*spanish*/un autΓ³grafo - CustomMessage("royal stationery", /*german*/"royales Briefpapier", /*french*/"du papier royal"), + CustomMessage("royal stationery", /*german*/"kΓΆnigliches Briefpapier", /*french*/"du papier royal"), // /*spanish*/un escrito real - CustomMessage("royal snail mail", /*german*/"ein royaler Umschlag", /*french*/"une enveloppe royale")}); + CustomMessage("royal snail mail", /*german*/"kΓΆnigliche Schneckenpost", /*french*/"une enveloppe royale")}); // /*spanish*/correo de la realeza hintTextTable[RHT_WEIRD_EGG] = HintText(CustomMessage("the Weird Egg", /*german*/"ein seltsames Ei", /*french*/"l'Oeuf Curieux"), @@ -163,17 +163,17 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a chicken dilemma", /*german*/"ein HΓΌhnerdilemma", /*french*/"un drΓ΄le d'ovale")}); // /*spanish*/el dilema de la gallina - hintTextTable[RHT_BOOMERANG] = HintText(CustomMessage("the Boomerang", /*german*/"ein Bumerang", /*french*/"le Boomerang"), + hintTextTable[RHT_BOOMERANG] = HintText(CustomMessage("the Boomerang", /*german*/"der Bumerang", /*french*/"le Boomerang"), // /*spanish*/el bumerΓ‘n { - CustomMessage("something that can grab things", /*german*/"etwas, das Dinge greifen kann", /*french*/"une chose qui peut attraper"), + CustomMessage("something that can grab things", /*german*/"etwas zum Greifen", /*french*/"une chose qui peut attraper"), // /*spanish*/algo que pueda agarrar cosas - CustomMessage("something that can stun", /*german*/"etwas, das paralysieren kann", /*french*/"une chose qui peut paralyser") + CustomMessage("something that can stun", /*german*/"etwas zum BetΓ€uben", /*french*/"une chose qui peut paralyser") // /*spanish*/algo que pueda paralizar }, { CustomMessage("a banana", /*german*/"eine Banane", /*french*/"une banane"), // /*spanish*/un plΓ‘tano - CustomMessage("a stun stick", /*german*/"ein paralysierender Stab", /*french*/"un bΓ’ton Γ©tourdissant"), + CustomMessage("a stun stick", /*german*/"ein BetΓ€ubungswerkzeug", /*french*/"un bΓ’ton Γ©tourdissant"), // /*spanish*/un palo aturdidor CustomMessage("a yellow angle", /*german*/"ein gelber Winkel", /*french*/"un angle jaune")}); // /*spanish*/un Γ‘ngulo amarillo @@ -196,10 +196,10 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_MEGATON_HAMMER] = HintText(CustomMessage("the Megaton Hammer", /*german*/"der Stahlhammer", /*french*/"la Masse des Titans"), // /*spanish*/el martillo MegatΓ³n { - CustomMessage("something that can remove boulders", /*german*/"etwas, das GerΓΆll entfernen kann", /*french*/"une chose qui enlΓ¨ve les rochers") + CustomMessage("something that can remove boulders", /*german*/"etwas zum GerΓΆll entfernen", /*french*/"une chose qui enlΓ¨ve les rochers") // /*spanish*/algo que pueda quitar rocas }, { - CustomMessage("the dragon smasher", /*german*/"ein DrachenschlΓ€ger", /*french*/"le tueur de dragons"), + CustomMessage("the dragon smasher", /*german*/"der DrachenschlΓ€ger", /*french*/"le tueur de dragons"), // /*spanish*/un destructor de dragones CustomMessage("the metal mallet", /*german*/"ein stΓ€hlerner SchlΓ€gel", /*french*/"un outil de construction"), // /*spanish*/un mazo de metal @@ -216,7 +216,7 @@ void StaticData::HintTable_Init_Item() { }, { CustomMessage("the shake stone", /*german*/"der SchΓΌttelstein", /*french*/"le fragment vibrant"), // /*spanish*/el fragmento tintineante - CustomMessage("a gray alarm", /*german*/"der graue Alarm", /*french*/"une alerte bleue")}); + CustomMessage("a gray alarm", /*german*/"ein grauer Alarm", /*french*/"une alerte bleue")}); // /*spanish*/una azul alarma hintTextTable[RHT_DINS_FIRE] = HintText(CustomMessage("Din's Fire", /*german*/"Dins Feuerinferno", /*french*/"le Feu de Din"), @@ -258,47 +258,47 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a blue barrier", /*german*/"eine blaue Barriere", /*french*/"une toison bleu")}); // /*spanish*/una barrera azul - hintTextTable[RHT_FIRE_ARROWS] = HintText(CustomMessage("the Fire Arrows", /*german*/"die Feuerpfeile", /*french*/"les FlΓ¨ches de Feu"), + hintTextTable[RHT_FIRE_ARROWS] = HintText(CustomMessage("the Fire Arrows", /*german*/"die Feuer-Pfeile€", /*french*/"les FlΓ¨ches de Feu"), // /*spanish*/la flecha de fuego { - CustomMessage("a magic arrow", /*german*/"ein magischer Pfeil", /*french*/"une flΓ¨che magique") + CustomMessage("a magic arrow", /*german*/"magische Pfeile€", /*french*/"une flΓ¨che magique") // /*spanish*/una flecha mΓ‘gica }, { CustomMessage("the furnace firearm", /*german*/"die Ofenwaffe", /*french*/"une fusΓ©e solaire"), // /*spanish*/el ardiente aguijΓ³n - CustomMessage("the burning bolts", /*german*/"die Brennstifte", /*french*/"un obus enflammΓ©"), + CustomMessage("the burning bolts", /*german*/"die Brennstifte€", /*french*/"un obus enflammΓ©"), // /*spanish*/las puntas Γ­gneas CustomMessage("a magma missile", /*german*/"eine vulkanische Rakete", /*french*/"un missile volcanique")}); // /*spanish*/el misil abrasador - hintTextTable[RHT_ICE_ARROWS] = HintText(CustomMessage("the Ice Arrows", /*german*/"die Eispfeile", /*french*/"les FlΓ¨ches de Glace"), + hintTextTable[RHT_ICE_ARROWS] = HintText(CustomMessage("the Ice Arrows", /*german*/"die Eis-Pfeile€", /*french*/"les FlΓ¨ches de Glace"), // /*spanish*/la flecha de hielo { - CustomMessage("a magic arrow", /*german*/"ein magischer Pfeil", /*french*/"une flΓ¨che magique"), + CustomMessage("a magic arrow", /*german*/"magische Pfeile€", /*french*/"une flΓ¨che magique"), // /*spanish*/una flecha mΓ‘gica - CustomMessage("something that can stun", /*german*/"etwas, das paralysieren kann", /*french*/"une chose qui peut paralyser") + CustomMessage("something that can stun", /*german*/"etwas zum BetΓ€uben", /*french*/"une chose qui peut paralyser") // /*spanish*/algo que pueda paralizar }, { - CustomMessage("the refrigerator rocket", /*german*/"die KΓΌhlschrankrakete", /*french*/"un missile pΓ©trifiant"), + CustomMessage("the refrigerator rocket", /*german*/"die KΓΌhlschrankraketen€", /*french*/"un missile pΓ©trifiant"), // /*spanish*/el misil congelador - CustomMessage("the frostbite bolts", /*german*/"die Froststifte", /*french*/"un froid mordant"), + CustomMessage("the frostbite bolts", /*german*/"die Froststifte€", /*french*/"un froid mordant"), // /*spanish*/las puntas gΓ©lidas CustomMessage("an iceberg maker", /*german*/"ein Eisbergmacher", /*french*/"une aiguille glaciale")}); // /*spanish*/el control de escarcha - hintTextTable[RHT_LIGHT_ARROWS] = HintText(CustomMessage("the Light Arrows", /*german*/"die Lichtpfeile", /*french*/"les FlΓ¨ches de LumiΓ¨re"), + hintTextTable[RHT_LIGHT_ARROWS] = HintText(CustomMessage("the Light Arrows", /*german*/"die Licht-Pfeile€", /*french*/"les FlΓ¨ches de LumiΓ¨re"), // /*spanish*/la flecha de luz { - CustomMessage("a magic arrow", /*german*/"ein magischer Pfeil", /*french*/"une flΓ¨che magique") + CustomMessage("a magic arrow", /*german*/"magische Pfeile€", /*french*/"une flΓ¨che magique") // /*spanish*/una flecha mΓ‘gica }, { CustomMessage("the shining shot", /*german*/"der strahlende Schuss", /*french*/"l'arme brillante"), // /*spanish*/el haz de luz - CustomMessage("the luminous launcher", /*german*/"der leuchtende Werfer", /*french*/"un jet de lumiΓ¨re"), + CustomMessage("the luminous launcher", /*german*/"die Scheinwerfer€", /*french*/"un jet de lumiΓ¨re"), // /*spanish*/el disparo luminoso CustomMessage("Ganondorf's bane", /*german*/"Ganondorfs Verderben", /*french*/"le flΓ©au de Ganondorf"), // /*spanish*/la perdiciΓ³n de Ganondorf - CustomMessage("the lighting bolts", /*german*/"die Lichtstifte", /*french*/"l'Γ©clair sacrΓ©")}); + CustomMessage("the lighting bolts", /*german*/"die Lichtstifte€", /*french*/"l'Γ©clair sacrΓ©")}); // /*spanish*/las puntas resplandecientes hintTextTable[RHT_GERUDO_MEMBERSHIP_CARD] = HintText(CustomMessage("the Gerudo Membership Card", /*german*/"der Gerudo-Pass", /*french*/"la Carte Gerudo"), @@ -315,16 +315,16 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_MAGIC_BEAN] = HintText(CustomMessage("a Magic Bean", /*german*/"eine Wundererbse", /*french*/"un Haricot Magique"), // /*spanish*/una judΓ­a mΓ‘gica { - CustomMessage("something sometimes buried", /*german*/"etwas, das manchmal begraben ist", /*french*/"une chose parfois enterrΓ©e") + CustomMessage("something sometimes buried", /*german*/"etwas gelegentlich Vergrabenes", /*french*/"une chose parfois enterrΓ©e") // /*spanish*/algo a veces enterrado }, { CustomMessage("a wizardly legume", /*german*/"eine zauberhafte HΓΌlse", /*french*/"un lΓ©gume ensorcelΓ©")}); // /*spanish*/una legumbre hechizada - hintTextTable[RHT_MAGIC_BEAN_PACK] = HintText(CustomMessage("Magic Beans", /*german*/"Wundererbsen", /*french*/"un Paquet de Haricots Magiques"), + hintTextTable[RHT_MAGIC_BEAN_PACK] = HintText(CustomMessage("Magic Beans", /*german*/"Wundererbsen-Packung", /*french*/"un Paquet de Haricots Magiques"), // /*spanish*/unas judΓ­as mΓ‘gicas { - CustomMessage("something sometimes buried", /*german*/"etwas, das manchmal begraben ist", /*french*/"une chose parfois enterrΓ©e") + CustomMessage("something sometimes buried", /*german*/"etwas gelegentlich Vergrabenes", /*french*/"une chose parfois enterrΓ©e") // /*spanish*/algo a veces enterrado }, { CustomMessage("wizardly legumes", /*german*/"zauberhafte HΓΌlsen", /*french*/"un paquet de lΓ©gumes ensorcelΓ©s")}); @@ -345,27 +345,27 @@ void StaticData::HintTable_Init_Item() { CustomMessage("strengthened love", /*german*/"gestΓ€rkte Liebe", /*french*/"un amour coriace")}); // /*spanish*/un amor fortalecido - hintTextTable[RHT_GOLD_SKULLTULA_TOKEN] = HintText(CustomMessage("a Gold Skulltula Token", /*german*/"ein goldenes Skulltula-Symbol", /*french*/"un Symbole de Skulltula d'or"), + hintTextTable[RHT_GOLD_SKULLTULA_TOKEN] = HintText(CustomMessage("a Gold Skulltula Token", /*german*/"ein Skulltula-Symbol", /*french*/"un Symbole de Skulltula d'or"), // /*spanish*/un sΓ­mbolo de skulltula dorada { CustomMessage("a token of recognition", /*german*/"ein Zeichen der Anerkennung", /*french*/"une preuve de reconnaissance"), // /*spanish*/una prueba de reconocimiento - CustomMessage("something sometimes buried", /*german*/"etwas, das manchmal begraben ist", /*french*/"une chose parfois enterrΓ©e") + CustomMessage("something sometimes buried", /*german*/"etwas gelegentlich Vergrabenes", /*french*/"une chose parfois enterrΓ©e") // /*spanish*/algo a veces enterrado }, { CustomMessage("proof of destruction", /*german*/"Nachweis der ZerstΓΆrung", /*french*/"un certificat d'Γ©limination"), // /*spanish*/una prueba de la destrucciΓ³n CustomMessage("an arachnid chip", /*german*/"ein spinnenartiges Symbol", /*french*/"un symbole cranien"), // /*spanish*/una figura arΓ‘cnida - CustomMessage("spider remains", /*german*/"SpinnenΓΌberreste", /*french*/"une dΓ©pouille dorΓ©e"), + CustomMessage("spider remains", /*german*/"SpinnenΓΌberreste€", /*french*/"une dΓ©pouille dorΓ©e"), // /*spanish*/unos restos dorados - CustomMessage("one percent of a curse", /*german*/"ein Prozent eines Fluchs", /*french*/"un centiΓ¨me de malΓ©diction")}); + CustomMessage("one percent of a curse", /*german*/"ein Prozent eines Fluches", /*french*/"un centiΓ¨me de malΓ©diction")}); // /*spanish*/una centΓ©sima de una maldiciΓ³n hintTextTable[RHT_POCKET_EGG] = HintText(CustomMessage("the Pocket Egg", /*german*/"das Ei", /*french*/"l'Oeuf de Poche"), // /*spanish*/el huevo de bolsillo { - CustomMessage("a trade quest item", /*german*/"ein Gegenstand einer Handelsmission", /*french*/"un objet de quΓͺte d'Γ©changes"), + CustomMessage("a trade quest item", /*german*/"ein Handelsgegenstand", /*french*/"un objet de quΓͺte d'Γ©changes"), // /*spanish*/un objeto de una misiΓ³n secundaria CustomMessage("an egg", /*german*/"ein Ei", /*french*/"un oeuf") // /*spanish*/un huevo @@ -380,7 +380,7 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_POCKET_CUCCO] = HintText(CustomMessage("the Pocket Cucco", /*german*/"Kiki", /*french*/"la Cocotte de Poche"), // /*spanish*/el cuco de bolsillo { - CustomMessage("a trade quest item", /*german*/"ein Gegenstand einer Handelsmission", /*french*/"un objet de quΓͺte d'Γ©changes") + CustomMessage("a trade quest item", /*german*/"ein Handelsgegenstand", /*french*/"un objet de quΓͺte d'Γ©changes") // /*spanish*/un objeto de una misiΓ³n secundaria }, { CustomMessage("a little clucker", /*german*/"ein kleiner Gackerer", /*french*/"un petit glousseur")}); @@ -389,38 +389,38 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_COJIRO] = HintText(CustomMessage("Cojiro", /*german*/"Henni", /*french*/"le p'tit poulet"), // /*spanish*/a Cojiro { - CustomMessage("a trade quest item", /*german*/"ein Gegenstand einer Handelsmission", /*french*/"un objet de quΓͺte d'Γ©changes") + CustomMessage("a trade quest item", /*german*/"ein Handelsgegenstand", /*french*/"un objet de quΓͺte d'Γ©changes") // /*spanish*/un objeto de una misiΓ³n secundaria }, { - CustomMessage("a cerulean capon", /*german*/"ein coelinblaues Kapaun", /*french*/"un paon azur")}); + CustomMessage("a cerulean capon", /*german*/"ein himmelsblauer Hahn", /*french*/"un paon azur")}); // /*spanish*/un cerΓΊleo capΓ³n hintTextTable[RHT_ODD_MUSHROOM] = HintText(CustomMessage("an Odd Mushroom", /*german*/"ein Schimmelpilz", /*french*/"un Champignon Suspect"), // /*spanish*/un champiΓ±Γ³n extraΓ±o { - CustomMessage("a trade quest item", /*german*/"ein Gegenstand einer Handelsmission", /*french*/"un objet de quΓͺte d'Γ©changes") + CustomMessage("a trade quest item", /*german*/"ein Handelsgegenstand", /*french*/"un objet de quΓͺte d'Γ©changes") // /*spanish*/un objeto de una misiΓ³n secundaria }, { - CustomMessage("a powder ingredient", /*german*/"eine Puderingredienz", /*french*/"un ingrΓ©dient Γ  poudre")}); + CustomMessage("a powder ingredient", /*german*/"eine Puderzutat", /*french*/"un ingrΓ©dient Γ  poudre")}); // /*spanish*/un oloroso ingrediente hintTextTable[RHT_ODD_POTION] = HintText(CustomMessage("an Odd Potion", /*german*/"ein Modertrank", /*french*/"une Mixture Suspecte"), // /*spanish*/una medicina rara { - CustomMessage("something that contains medicine", /*german*/"etwas, das Medizin enthΓ€lt", /*french*/"une chose mΓ©dicamenteuse"), + CustomMessage("something that contains medicine", /*german*/"etwas das Medizin enthΓ€lt", /*french*/"une chose mΓ©dicamenteuse"), // /*spanish*/algo que contenga medicina - CustomMessage("something with a strange smell", /*german*/"etwas, das streng riecht", /*french*/"une chose qui sent bizarre"), + CustomMessage("something with a strange smell", /*german*/"etwas seltsam Riechendes", /*french*/"une chose qui sent bizarre"), // /*spanish*/algo con un olor extraΓ±o - CustomMessage("a trade quest item", /*german*/"ein Gegenstand einer Handelsmission", /*french*/"un objet de quΓͺte d'Γ©changes") + CustomMessage("a trade quest item", /*german*/"ein Handelsgegenstand", /*french*/"un objet de quΓͺte d'Γ©changes") // /*spanish*/un objeto de una misiΓ³n secundaria }, { - CustomMessage("Granny's goodies", /*german*/"Omas Zuckerwerk", /*french*/"la confiserie de mamie")}); + CustomMessage("Granny's goodies", /*german*/"Omas Leckereien€", /*french*/"la confiserie de mamie")}); // /*spanish*/la especialidad de la abuela hintTextTable[RHT_POACHERS_SAW] = HintText(CustomMessage("the Poacher's Saw", /*german*/"eine SΓ€ge", /*french*/"la Scie du Chasseur"), // /*spanish*/la sierra del furtivo { - CustomMessage("a trade quest item", /*german*/"ein Gegenstand einer Handelsmission", /*french*/"un objet de quΓͺte d'Γ©changes") + CustomMessage("a trade quest item", /*german*/"ein Handelsgegenstand", /*french*/"un objet de quΓͺte d'Γ©changes") // /*spanish*/un objeto de una misiΓ³n secundaria }, { CustomMessage("a tree killer", /*german*/"ein BaumtΓΆter", /*french*/"un coupeur d'arbres")}); @@ -429,7 +429,7 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_BROKEN_SWORD] = HintText(CustomMessage("the Broken Goron's Sword", /*german*/"das zerbrochene Goronen-Schwert", /*french*/"l'Γ‰pΓ©e BrisΓ©e de Goron"), // /*spanish*/la espada goron rota { - CustomMessage("a trade quest item", /*german*/"ein Gegenstand einer Handelsmission", /*french*/"un objet de quΓͺte d'Γ©changes"), + CustomMessage("a trade quest item", /*german*/"ein Handelsgegenstand", /*french*/"un objet de quΓͺte d'Γ©changes"), // /*spanish*/un objeto de una misiΓ³n secundaria CustomMessage("a sword", /*german*/"ein Schwert", /*french*/"une Γ©pΓ©e") // /*spanish*/una espada @@ -440,27 +440,27 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_PRESCRIPTION] = HintText(CustomMessage("the Prescription", /*german*/"ein Rezept", /*french*/"une Ordonnance"), // /*spanish*/la receta { - CustomMessage("a trade quest item", /*german*/"ein Gegenstand einer Handelsmission", /*french*/"un objet de quΓͺte d'Γ©changes") + CustomMessage("a trade quest item", /*german*/"ein Handelsgegenstand", /*french*/"un objet de quΓͺte d'Γ©changes") // /*spanish*/un objeto de una misiΓ³n secundaria }, { - CustomMessage("a pill pamphlet", /*german*/"ein Pillenpamphlet", /*french*/"un document urgent"), + CustomMessage("a pill pamphlet", /*german*/"eine PillenbroschΓΌre", /*french*/"un document urgent"), // /*spanish*/un instructivo medicinal - CustomMessage("a doctor's note", /*german*/"eine Notiz eines Doktors", /*french*/"un papier mΓ©dical")}); + CustomMessage("a doctor's note", /*german*/"ein Γ€rztliches Attest", /*french*/"un papier mΓ©dical")}); // /*spanish*/unas notas del doctor - hintTextTable[RHT_EYEBALL_FROG] = HintText(CustomMessage("the Eyeball Frog", /*german*/"der Glotzfrosch", /*french*/"le Crapaud-qui-louche"), + hintTextTable[RHT_EYEBALL_FROG] = HintText(CustomMessage("the Eyeball Frog", /*german*/"ein Glotzfrosch", /*french*/"le Crapaud-qui-louche"), // /*spanish*/la rana de ojos saltones { - CustomMessage("a trade quest item", /*german*/"ein Gegenstand einer Handelsmission", /*french*/"un objet de quΓͺte d'Γ©changes") + CustomMessage("a trade quest item", /*german*/"ein Handelsgegenstand", /*french*/"un objet de quΓͺte d'Γ©changes") // /*spanish*/un objeto de una misiΓ³n secundaria }, { CustomMessage("a perceiving polliwog", /*german*/"eine wahrnehmende Kaulquappe", /*french*/"un amphibien")}); // /*spanish*/un variopinto batracio - hintTextTable[RHT_EYEDROPS] = HintText(CustomMessage("the Eyedrops", /*german*/"die Augentropfen", /*french*/"une phiole de Super-Gouttes"), + hintTextTable[RHT_EYEDROPS] = HintText(CustomMessage("the Eyedrops", /*german*/"Augentropfen", /*french*/"une phiole de Super-Gouttes"), // /*spanish*/las supergotas oculares { - CustomMessage("a trade quest item", /*german*/"ein Gegenstand einer Handelsmission", /*french*/"un objet de quΓͺte d'Γ©changes") + CustomMessage("a trade quest item", /*german*/"ein Handelsgegenstand", /*french*/"un objet de quΓͺte d'Γ©changes") // /*spanish*/un objeto de una misiΓ³n secundaria }, { CustomMessage("a vision vial", /*german*/"eine Sichtphiole", /*french*/"une solution oculaire")}); @@ -469,46 +469,46 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_CLAIM_CHECK] = HintText(CustomMessage("the Claim Check", /*german*/"ein Zertifikat", /*french*/"un Certificat"), // /*spanish*/el recibo { - CustomMessage("a trade quest item", /*german*/"ein Gegenstand einer Handelsmission", /*french*/"un objet de quΓͺte d'Γ©changes") + CustomMessage("a trade quest item", /*german*/"ein Handelsgegenstand", /*french*/"un objet de quΓͺte d'Γ©changes") // /*spanish*/un objeto de una misiΓ³n secundaria }, { CustomMessage("a three day wait", /*german*/"eine dreitΓ€gige Erwartung", /*french*/"un rendez-vous dans trois jours")}); // /*spanish*/unos tres dΓ­as de espera - hintTextTable[RHT_PROGRESSIVE_HOOKSHOT] = HintText(CustomMessage("a Hookshot", /*german*/"ein Enterhaken", /*french*/"un Grappin"), + hintTextTable[RHT_PROGRESSIVE_HOOKSHOT] = HintText(CustomMessage("a Hookshot", /*german*/"ein Fanghaken", /*french*/"un Grappin"), // /*spanish*/un gancho { - CustomMessage("something that can grab things", /*german*/"etwas, das Dinge greifen kann", /*french*/"une chose qui peut attraper"), + CustomMessage("something that can grab things", /*german*/"etwas zum Greifen", /*french*/"une chose qui peut attraper"), // /*spanish*/algo que pueda agarrar cosas - CustomMessage("something that can stun", /*german*/"etwas, das paralysieren kann", /*french*/"une chose qui peut paralyser") + CustomMessage("something that can stun", /*german*/"etwas zum BetΓ€uben", /*french*/"une chose qui peut paralyser") // /*spanish*/algo que pueda paralizar }, { - CustomMessage("DampΓ©'s keepsake", /*german*/"DampΓ©s Andenken", /*french*/"l'hΓ©ritage d'Igor"), + CustomMessage("DampΓ©'s keepsake", /*german*/"Boris' Andenken", /*french*/"l'hΓ©ritage d'Igor"), // /*spanish*/un recuerdo de DampΓ© - CustomMessage("the Grapple Beam", /*german*/"der Greifstrahl", /*french*/"le rayon grippeur"), + CustomMessage("the Grapple Beam", /*german*/"der Grapple Beam", /*french*/"le rayon grippeur"), // /*spanish*/una garra metΓ‘lica - CustomMessage("the RHT_BOING! chain", /*german*/"die Kette des RHT_BOING!", /*french*/"la chaΓne de RHT_BOING!")}); + CustomMessage("the BOING! chain", /*german*/"die BOING!-Kette", /*french*/"la chaΓne de BOING!")}); // /*spanish*/una cadena retrΓ‘ctil - hintTextTable[RHT_PROGRESSIVE_STRENGTH] = HintText(CustomMessage("a Strength Upgrade", /*german*/"eine StΓ€rkeverbesserung", /*french*/"une AmΓ©lioration de Force"), + hintTextTable[RHT_PROGRESSIVE_STRENGTH] = HintText(CustomMessage("a Strength Upgrade", /*german*/"eine Kraftsteigerung", /*french*/"une AmΓ©lioration de Force"), // /*spanish*/un aumento de fuerza { - CustomMessage("something that can remove boulders", /*german*/"etwas, das GerΓΆll entfernen kann", /*french*/"une chose qui enlΓ¨ve les rochers") + CustomMessage("something that can remove boulders", /*german*/"etwas zum GerΓΆll entfernen", /*french*/"une chose qui enlΓ¨ve les rochers") // /*spanish*/algo que pueda quitar rocas }, { - CustomMessage("power gloves", /*german*/"Krafthandschuhe", /*french*/"une paire de gants de travail"), + CustomMessage("power gloves", /*german*/"Krafthandschuhe€", /*french*/"une paire de gants de travail"), // /*spanish*/unos poderosos guanteletes - CustomMessage("metal mittens", /*german*/"MetallfΓ€ustlinge", /*french*/"une paire de mitaines"), + CustomMessage("metal mittens", /*german*/"Metall-FΓ€ustlinge€", /*french*/"une paire de mitaines"), // /*spanish*/unas manoplas metΓ‘licas CustomMessage("the heavy lifty", /*german*/"der Schwerlastheber", /*french*/"la puissance de dix hommes")}); // /*spanish*/un levantamiento pesado - hintTextTable[RHT_PROGRESSIVE_BOMB_BAG] = HintText(CustomMessage("a Bomb Bag", /*german*/"ein Bombenbeutel", /*french*/"un Sac de Bombes"), + hintTextTable[RHT_PROGRESSIVE_BOMB_BAG] = HintText(CustomMessage("a Bomb Bag", /*german*/"eine Bombentasche", /*french*/"un Sac de Bombes"), // /*spanish*/un saco de bombas { - CustomMessage("explosives", /*german*/"ein Explosivpaket", /*french*/"un paquet d'explosifs"), + CustomMessage("explosives", /*german*/"Explosives", /*french*/"un paquet d'explosifs"), // /*spanish*/un montΓ³n de explosivos - CustomMessage("something that can remove boulders", /*german*/"etwas, das GerΓΆll entfernen kann", /*french*/"une chose qui enlΓ¨ve les rochers") + CustomMessage("something that can remove boulders", /*german*/"etwas zum GerΓΆll entfernen", /*french*/"une chose qui enlΓ¨ve les rochers") // /*spanish*/algo que pueda quitar rocas }, { CustomMessage("an explosive container", /*german*/"ein ExplosivbehΓ€lter", /*french*/"un porte-grenade"), @@ -527,20 +527,20 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a danger dart launcher", /*german*/"ein Pfeilwerfer", /*french*/"un tire-flΓ©chette")}); // /*spanish*/un peligroso lanzadardos - hintTextTable[RHT_PROGRESSIVE_SLINGSHOT] = HintText(CustomMessage("a Slingshot", /*german*/"eine Schleuder", /*french*/"un Lance-Pierre"), + hintTextTable[RHT_PROGRESSIVE_SLINGSHOT] = HintText(CustomMessage("a Slingshot", /*german*/"eine Feen-Schleuder", /*french*/"un Lance-Pierre"), // /*spanish*/una resortera de las hadas { CustomMessage("a projectile shooter", /*german*/"ein Projektilwerfer", /*french*/"un tire-projectile") // /*spanish*/un arma de proyectil }, { - CustomMessage("a seed shooter", /*german*/"ein Nusswerfer", /*french*/"un lance-noix"), + CustomMessage("a seed shooter", /*german*/"ein Kernwerfer", /*french*/"un lance-noix"), // /*spanish*/un lanzasemillas CustomMessage("a rubberband", /*german*/"ein Gummiband", /*french*/"un Γ©lastique"), // /*spanish*/un tirachinas CustomMessage("a child's catapult", /*german*/"ein Kinderkatapult", /*french*/"un jouet d'enfant")}); // /*spanish*/una catapulta infantil - hintTextTable[RHT_PROGRESSIVE_WALLET] = HintText(CustomMessage("a Wallet", /*german*/"eine BΓΆrse", /*french*/"une Bourse"), + hintTextTable[RHT_PROGRESSIVE_WALLET] = HintText(CustomMessage("a Wallet", /*german*/"eine GeldbΓΆrse", /*french*/"une Bourse"), // /*spanish*/una bolsa de rupias { CustomMessage("a prize of the House of Skulltulas", /*german*/"ein Preis des Skulltula-Hauses", /*french*/"un prix de la maison des Skulltulas") @@ -569,10 +569,10 @@ void StaticData::HintTable_Init_Item() { { CustomMessage("some Deku munitions", /*german*/"etwas Deku-Munition", /*french*/"un paquet de munitions Mojo"), // /*spanish*/un montΓ³n de municiones Deku - CustomMessage("something that can stun", /*german*/"etwas, das paralysieren kann", /*french*/"une chose qui peut paralyser") + CustomMessage("something that can stun", /*german*/"etwas zum BetΓ€uben", /*french*/"une chose qui peut paralyser") // /*spanish*/algo que pueda paralizar }, { - CustomMessage("more nuts", /*german*/"mehr NΓΌsse", /*french*/"encore plus de noix"), + CustomMessage("more nuts", /*german*/"mehr NΓΌsse€", /*french*/"encore plus de noix"), // /*spanish*/mΓ‘s semillas de nogal CustomMessage("flashbang storage", /*german*/"Blendgranatenvorrat", /*french*/"un sac Γ  noix")}); // /*spanish*/mΓ‘s frutos aturdidores @@ -583,12 +583,12 @@ void StaticData::HintTable_Init_Item() { CustomMessage("some Deku munitions", /*german*/"etwas Deku-Munition", /*french*/"un paquet de munitions Mojo") // /*spanish*/un montΓ³n de municiones Deku }, { - CustomMessage("lumber racks", /*german*/"Holzgestelle", /*french*/"un paquet de bois"), + CustomMessage("lumber racks", /*german*/"Holzgestelle€", /*french*/"un paquet de bois"), // /*spanish*/mΓ‘s bastones CustomMessage("more flammable twigs", /*german*/"mehr entflammbare Zweige", /*french*/"beaucoup de branches")}); // /*spanish*/mΓ‘s varas - hintTextTable[RHT_PROGRESSIVE_MAGIC_METER] = HintText(CustomMessage("a Magic Meter", /*german*/"ein Magieabmaß", /*french*/"une Jauge de Magie"), + hintTextTable[RHT_PROGRESSIVE_MAGIC_METER] = HintText(CustomMessage("a Magic Meter", /*german*/"Magische Kraft", /*french*/"une Jauge de Magie"), // /*spanish*/un aumento de poder mΓ‘gico { CustomMessage("a Great Fairy's power", /*german*/"eine Kraft einer großen Fee", /*french*/"le pouvoir d'une grande fΓ©e") @@ -606,7 +606,7 @@ void StaticData::HintTable_Init_Item() { { CustomMessage("something given by Saria", /*german*/"ein Geschenk von Salia", /*french*/"un cadeau de Saria"), // /*spanish*/un obsequio de Saria - CustomMessage("something kept by the royal family", /*german*/"etwas, das von der royalen Familie bewahrt wird", /*french*/"une chose qui paralyse") + CustomMessage("something kept by the royal family", /*german*/"etwas aus dem Besitz der KΓΆnigsfamilie", /*french*/"une chose qui paralyse") // /*spanish*/algo guardado por la familia real }, { CustomMessage("a flute", /*german*/"eine FlΓΆte", /*french*/"un bec musical"), @@ -614,21 +614,21 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a music maker", /*german*/"ein Musikmacher", /*french*/"un porteur de chansons")}); // /*spanish*/un instrumento - hintTextTable[RHT_PROGRESSIVE_BOMBCHUS] = HintText(CustomMessage("Bombchus", /*german*/"Krabbelminen", /*french*/"un paquet de Missiles"), + hintTextTable[RHT_PROGRESSIVE_BOMBCHUS] = HintText(CustomMessage("Bombchus", /*german*/"Krabbelminen€", /*french*/"un paquet de Missiles"), // /*spanish*/unos bombchus { CustomMessage("a prize of the House of Skulltulas", /*german*/"ein Preis des Skulltula-Hauses", /*french*/"un prix de la maison des Skulltulas"), // /*spanish*/un obsequio de la Casa Skulltula - CustomMessage("explosives", /*german*/"ein Explosivpaket", /*french*/"un paquet d'explosifs") + CustomMessage("explosives", /*german*/"Explosives", /*french*/"un paquet d'explosifs") // /*spanish*/un montΓ³n de explosivos }, { - CustomMessage("mice bombs", /*german*/"MΓ€usebomben", /*french*/"un adorable explosif"), + CustomMessage("mice bombs", /*german*/"MΓ€usebomben€", /*french*/"un adorable explosif"), // /*spanish*/unas bombas roedoras - CustomMessage("proximity mice", /*german*/"NΓ€herungsmΓ€use", /*french*/"une mine anti-rongeur"), + CustomMessage("proximity mice", /*german*/"NΓ€herungsmΓ€use€", /*french*/"une mine anti-rongeur"), // /*spanish*/unos explosivos ratoncitos - CustomMessage("wall crawlers", /*german*/"Wandkrabbler", /*french*/"un rapide grimpeur"), + CustomMessage("wall crawlers", /*german*/"Wandkrabbler€", /*french*/"un rapide grimpeur"), // /*spanish*/unos trepaparedes - CustomMessage("trail blazers", /*german*/"Vorreiter", /*french*/"un zigzag Γ©clatant")}); + CustomMessage("trail blazers", /*german*/"Vorreiter€", /*french*/"un zigzag Γ©clatant")}); // /*spanish*/unas ratas propulsadas hintTextTable[RHT_PROGRESSIVE_GORONSWORD] = HintText(CustomMessage("a Goron Sword", /*german*/"ein Goronen-Schwert", /*french*/"une Γ©pΓ©e Goron"), @@ -642,7 +642,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a Goron weapon", /*german*/"eine Goronenwaffe", /*french*/"une arme Goron")}); // /*spanish*/un arma goron - hintTextTable[RHT_EMPTY_BOTTLE] = HintText(CustomMessage("a bottle", /*german*/"eine Flasche", /*french*/"un flacon vide"), + hintTextTable[RHT_EMPTY_BOTTLE] = HintText(CustomMessage("a bottle", /*german*/"eine leere Flasche", /*french*/"un flacon vide"), // /*spanish*/una botella { CustomMessage("a bottle", /*german*/"eine Flasche", /*french*/"un flacon") @@ -650,12 +650,12 @@ void StaticData::HintTable_Init_Item() { }, { CustomMessage("a glass container", /*german*/"ein GlasbehΓ€lter", /*french*/"un cylindre de cristal"), // /*spanish*/un recipiente de cristal - CustomMessage("an empty jar", /*german*/"ein leerer Krug", /*french*/"une jarre incassable"), + CustomMessage("an empty jar", /*german*/"ein leeres GefÀß", /*french*/"une jarre incassable"), // /*spanish*/un frasco vacΓ­o CustomMessage("encased air", /*german*/"eingeschlossene Luft", /*french*/"un bocal d'air")}); // /*spanish*/aire a presiΓ³n - hintTextTable[RHT_BOTTLE_WITH_MILK] = HintText(CustomMessage("a Milk Bottle", /*german*/"eine Milchflasche", /*french*/"un flacon de lait"), + hintTextTable[RHT_BOTTLE_WITH_MILK] = HintText(CustomMessage("a Milk Bottle", /*german*/"eine Flasche mit Milch", /*french*/"un flacon de lait"), // /*spanish*/una botella de leche { CustomMessage("a bottle", /*german*/"eine Flasche", /*french*/"un flacon") @@ -696,12 +696,12 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a bottle", /*german*/"eine Flasche", /*french*/"un flacon") // /*spanish*/una botella }, { - CustomMessage("an ailment antidote", /*german*/"ein Krankheitsantidot", /*french*/"l'Γ©lixir ultime"), + CustomMessage("an ailment antidote", /*german*/"ein Allheilmittel", /*french*/"l'Γ©lixir ultime"), // /*spanish*/un antΓ­doto para el dolor CustomMessage("a blue liquid", /*german*/"eine blaue FlΓΌssigkeit", /*french*/"un liquide bleu")}); // /*spanish*/un remedio Γ­ndigo - hintTextTable[RHT_BOTTLE_WITH_FAIRY] = HintText(CustomMessage("a Fairy Bottle", /*german*/"eine Feenflasche", /*french*/"une fΓ©e en flacon"), + hintTextTable[RHT_BOTTLE_WITH_FAIRY] = HintText(CustomMessage("a Fairy Bottle", /*german*/"eine Flasche mit Fee", /*french*/"une fΓ©e en flacon"), // /*spanish*/un hada en una botella { CustomMessage("a bottle", /*german*/"eine Flasche", /*french*/"un flacon") @@ -711,10 +711,10 @@ void StaticData::HintTable_Init_Item() { // /*spanish*/un hada atrapada CustomMessage("an extra life", /*german*/"ein Extraleben", /*french*/"une vie de rechange"), // /*spanish*/una oportunidad mΓ‘s - CustomMessage("Navi's cousin", /*german*/"Navis Vetter", /*french*/"le cousin de Navi")}); + CustomMessage("Navi's cousin", /*german*/"Navis Cousine", /*french*/"le cousin de Navi")}); // /*spanish*/una prima de Navi - hintTextTable[RHT_BOTTLE_WITH_FISH] = HintText(CustomMessage("a Fish Bottle", /*german*/"eine Fischflasche", /*french*/"un poisson en flacon"), + hintTextTable[RHT_BOTTLE_WITH_FISH] = HintText(CustomMessage("a Fish Bottle", /*german*/"eine Flasche mit Fisch", /*french*/"un poisson en flacon"), // /*spanish*/un pez en una botella { CustomMessage("a bottle", /*german*/"eine Flasche", /*french*/"un flacon") @@ -722,7 +722,7 @@ void StaticData::HintTable_Init_Item() { }, { CustomMessage("an aquarium", /*german*/"ein Aquarium", /*french*/"un aquarium"), // /*spanish*/un escamado ser - CustomMessage("a deity's snack", /*german*/"ein Gottheitssnack", /*french*/"le repas d'un dieu marin")}); + CustomMessage("a deity's snack", /*german*/"ein gΓΆttlicher Snack", /*french*/"le repas d'un dieu marin")}); // /*spanish*/un tentempiΓ© de cierta deidad hintTextTable[RHT_BOTTLE_WITH_BLUE_FIRE] = HintText(CustomMessage("a Blue Fire Bottle", /*german*/"eine Flasche mit blauem Feuer", /*french*/"une flamme bleue en flacon"), @@ -733,10 +733,10 @@ void StaticData::HintTable_Init_Item() { }, { CustomMessage("a conflagration canteen", /*german*/"eine Brandfeldflasche", /*french*/"une mystΓ©rieuse flamme"), // /*spanish*/un incendio retenido - CustomMessage("an icemelt jar", /*german*/"ein eisschmelzender Krug", /*french*/"un brasier glacial")}); + CustomMessage("an icemelt jar", /*german*/"ein eisschmelzendes GefÀß", /*french*/"un brasier glacial")}); // /*spanish*/unas brasas enfrascadas - hintTextTable[RHT_BOTTLE_WITH_BUGS] = HintText(CustomMessage("a Bug Bottle", /*german*/"eine Wanzenflasche", /*french*/"un insecte en flacon"), + hintTextTable[RHT_BOTTLE_WITH_BUGS] = HintText(CustomMessage("a Bug Bottle", /*german*/"eine Flasche mit KΓ€fern", /*french*/"un insecte en flacon"), // /*spanish*/unos insectos en una botella { CustomMessage("a bottle", /*german*/"eine Flasche", /*french*/"un flacon") @@ -747,24 +747,24 @@ void StaticData::HintTable_Init_Item() { CustomMessage("Skulltula finders", /*german*/"Skulltula-Finder", /*french*/"une poignΓ©e de trouve-Skulltula")}); // /*spanish*/unos rastreadores de skulltulas - hintTextTable[RHT_BOTTLE_WITH_POE] = HintText(CustomMessage("a Poe Bottle", /*german*/"eine Irrlichtflasche", /*french*/"un Esprit en flacon"), + hintTextTable[RHT_BOTTLE_WITH_POE] = HintText(CustomMessage("a Poe Bottle", /*german*/"eine Flasche mit Irrlicht", /*french*/"un Esprit en flacon"), // /*spanish*/un Poe en una botella { CustomMessage("a bottle", /*german*/"eine Flasche", /*french*/"un flacon") // /*spanish*/una botella }, { - CustomMessage("a spooky ghost", /*german*/"ein spukhafter Geist", /*french*/"un effroyable fantΓ΄me"), + CustomMessage("a spooky ghost", /*german*/"ein gruseliger Geist", /*french*/"un effroyable fantΓ΄me"), // /*spanish*/un espantoso espectro - CustomMessage("a face in the jar", /*german*/"ein Gesicht im Krug", /*french*/"un visage dans un bocal")}); + CustomMessage("a face in the jar", /*german*/"ein Gesicht im GefÀß", /*french*/"un visage dans un bocal")}); // /*spanish*/una expresiΓ³n enfrascada - hintTextTable[RHT_BOTTLE_WITH_BIG_POE] = HintText(CustomMessage("a Big Poe Bottle", /*german*/"eine NachtschwΓ€rmerflasche", /*french*/"une Ame en flacon"), + hintTextTable[RHT_BOTTLE_WITH_BIG_POE] = HintText(CustomMessage("a Big Poe Bottle", /*german*/"eine Flasche mit NachtschwΓ€rmer", /*french*/"une Ame en flacon"), // /*spanish*/un Gran Poe en una botella { CustomMessage("a bottle", /*german*/"eine Flasche", /*french*/"un flacon") // /*spanish*/una botella }, { - CustomMessage("the spookiest ghost", /*german*/"der spukhafteste Geist", /*french*/"un Γ©pouvantable spectre"), + CustomMessage("the spookiest ghost", /*german*/"der gruseligste Geist", /*french*/"un Γ©pouvantable spectre"), // /*spanish*/el espectro mΓ‘s espeluznante CustomMessage("a sidequest spirit", /*german*/"ein Nebenmissionsgeist", /*french*/"un prΓ©cieux esprit")}); // /*spanish*/un buen valorado espΓ­ritu @@ -779,28 +779,28 @@ void StaticData::HintTable_Init_Item() { // /*spanish*/una llamada de auxilio CustomMessage("the note that Mweeps", /*german*/"eine Notiz, die Mweeps", /*french*/"un message qui fait mwip"), // /*spanish*/un escrito mweep - CustomMessage("an RHT_SOS call", /*german*/"ein RHT_SOS Signal", /*french*/"un signal RHT_SOS"), + CustomMessage("an SOS call", /*german*/"ein Notrufsignal", /*french*/"un signal SOS"), // /*spanish*/una nota de socorro - CustomMessage("a fishy stationery", /*german*/"ein nasses Papier", /*french*/"un papier mouillΓ©")}); + CustomMessage("a fishy stationery", /*german*/"fischiges Briefpapier", /*french*/"un papier mouillΓ©")}); // /*spanish*/un mensaje de ayuda hintTextTable[RHT_ZELDAS_LULLABY] = HintText(CustomMessage("Zelda's Lullaby", /*german*/"Zeldas Wiegenlied", /*french*/"la berceuse de Zelda"), // /*spanish*/la Nana de Zelda { - CustomMessage("a regular song", /*german*/"ein normales Lied", /*french*/"une chanson normale"), + CustomMessage("a regular song", /*german*/"ein gewΓΆhnliches Lied", /*french*/"une chanson normale"), // /*spanish*/una cancion normal - CustomMessage("something kept by the royal family", /*german*/"etwas, das von der royalen Familie bewahrt wird", /*french*/"une chose qui paralyse") + CustomMessage("something kept by the royal family", /*german*/"etwas aus dem Besitz der KΓΆnigsfamilie", /*french*/"une chose qui paralyse") // /*spanish*/algo guardado por la familia real }, { - CustomMessage("a song of royal slumber", /*german*/"ein royales Lied", /*french*/"une chanson royale"), + CustomMessage("a song of royal slumber", /*german*/"ein kΓΆnigliches Schlaflied", /*french*/"une chanson royale"), // /*spanish*/la canciΓ³n real - CustomMessage("a triforce tune", /*german*/"eine heilige Musik", /*french*/"la musique sacrΓ©e")}); + CustomMessage("a triforce tune", /*german*/"die Melodie des Triforce", /*french*/"la musique sacrΓ©e")}); // /*spanish*/la melodΓ­a de la trifuerza hintTextTable[RHT_EPONAS_SONG] = HintText(CustomMessage("Epona's Song", /*german*/"Eponas Lied", /*french*/"le chant d'Epona"), // /*spanish*/la CanciΓ³n de Epona { - CustomMessage("a regular song", /*german*/"ein normales Lied", /*french*/"une chanson normale") + CustomMessage("a regular song", /*german*/"ein gewΓΆhnliches Lied", /*french*/"une chanson normale") // /*spanish*/una cancion normal }, { CustomMessage("an equestrian etude", /*german*/"eine Reiterhymne", /*french*/"une hymne Γ©questre"), @@ -813,7 +813,7 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_SARIAS_SONG] = HintText(CustomMessage("Saria's Song", /*german*/"Salias Lied", /*french*/"le chant de Saria"), // /*spanish*/la CanciΓ³n de Saria { - CustomMessage("a regular song", /*german*/"ein normales Lied", /*french*/"une chanson normale"), + CustomMessage("a regular song", /*german*/"ein gewΓΆhnliches Lied", /*french*/"une chanson normale"), // /*spanish*/una cancion normal CustomMessage("something given by Saria", /*german*/"ein Geschenk von Salia", /*french*/"un cadeau de Saria") // /*spanish*/un obsequio de Saria @@ -823,236 +823,236 @@ void StaticData::HintTable_Init_Item() { CustomMessage("Saria's phone number", /*german*/"Salias Telefonnummer", /*french*/"le tΓ©lΓ©phone d'une amie")}); // /*spanish*/una consulta de asistencia - hintTextTable[RHT_SUNS_SONG] = HintText(CustomMessage("the Sun's Song", /*german*/"Hymne der Sonne", /*french*/"le chant du soleil"), + hintTextTable[RHT_SUNS_SONG] = HintText(CustomMessage("the Sun's Song", /*german*/"die Hymne der Sonne", /*french*/"le chant du soleil"), // /*spanish*/la CanciΓ³n del Sol { - CustomMessage("a regular song", /*german*/"ein normales Lied", /*french*/"une chanson normale"), + CustomMessage("a regular song", /*german*/"ein gewΓΆhnliches Lied", /*french*/"une chanson normale"), // /*spanish*/una cancion normal - CustomMessage("something that can stun", /*german*/"etwas, das paralysieren kann", /*french*/"une chose qui peut paralyser") + CustomMessage("something that can stun", /*german*/"etwas zum BetΓ€uben", /*french*/"une chose qui peut paralyser") // /*spanish*/algo que pueda paralizar }, { - CustomMessage("Sunny Day", /*german*/"sonniger Tag", /*french*/"ZΓ©nith"), + CustomMessage("Sunny Day", /*german*/"ein sonniger Tag", /*french*/"ZΓ©nith"), // /*spanish*/un dΓ­a soleado CustomMessage("the ReDead's bane", /*german*/"das Verderben der Remorts", /*french*/"le flΓ©au des Γ‰ffrois"), // /*spanish*/la destructora de Redeads CustomMessage("the Gibdo's bane", /*german*/"das Verderben der Gibdos", /*french*/"le flΓ©au des Gibdo")}); // /*spanish*/la destructora de Gibdos - hintTextTable[RHT_SONG_OF_TIME] = HintText(CustomMessage("the Song of Time", /*german*/"Hymne der Zeit", /*french*/"le chant du temps"), + hintTextTable[RHT_SONG_OF_TIME] = HintText(CustomMessage("the Song of Time", /*german*/"die Hymne der Zeit", /*french*/"le chant du temps"), // /*spanish*/la CanciΓ³n del tiempo { - CustomMessage("a regular song", /*german*/"ein normales Lied", /*french*/"une chanson normale") + CustomMessage("a regular song", /*german*/"ein gewΓΆhnliches Lied", /*french*/"une chanson normale") // /*spanish*/una cancion normal }, { CustomMessage("a song 7 years long", /*german*/"ein sieben Jahre langes Lied", /*french*/"le flot du temps"), // /*spanish*/la setenada canciΓ³n - CustomMessage("the tune of ages", /*german*/"Hymne des Γ„ons", /*french*/"le Chant des Γ‚ges")}); + CustomMessage("the tune of ages", /*german*/"die Melodie der Γ„onen", /*french*/"le Chant des Γ‚ges")}); // /*spanish*/la melodΓ­a eΓ³nica - hintTextTable[RHT_SONG_OF_STORMS] = HintText(CustomMessage("the Song of Storms", /*german*/"Hymne des Sturms", /*french*/"le chant des tempΓͺtes"), + hintTextTable[RHT_SONG_OF_STORMS] = HintText(CustomMessage("the Song of Storms", /*german*/"die Hymne des Sturms", /*french*/"le chant des tempΓͺtes"), // /*spanish*/la CanciΓ³n de la Tormenta { - CustomMessage("a regular song", /*german*/"ein normales Lied", /*french*/"une chanson normale") + CustomMessage("a regular song", /*german*/"ein gewΓΆhnliches Lied", /*french*/"une chanson normale") // /*spanish*/una cancion normal }, { - CustomMessage("Rain Dance", /*german*/"Regentanz", /*french*/"Danse Pluie"), + CustomMessage("Rain Dance", /*german*/"ein Regentanz", /*french*/"Danse Pluie"), // /*spanish*/la danza de la lluvia - CustomMessage("a thunderstorm tune", /*german*/"eine Gewitterhymne", /*french*/"une hymne foudroyante"), + CustomMessage("a thunderstorm tune", /*german*/"die Melodie des Gewitters", /*french*/"une hymne foudroyante"), // /*spanish*/una sonata tormentosa - CustomMessage("windmill acceleration", /*german*/"WindmΓΌhlenbeschleunigung", /*french*/"l'accΓ©lΓ©rateur de moulins")}); + CustomMessage("windmill acceleration", /*german*/"eine WindmΓΌhlenbeschleunigung", /*french*/"l'accΓ©lΓ©rateur de moulins")}); // /*spanish*/el arranque de molinos - hintTextTable[RHT_MINUET_OF_FOREST] = HintText(CustomMessage("the Minuet of Forest", /*german*/"Menuett des Waldes", /*french*/"le menuet de la forΓͺt"), + hintTextTable[RHT_MINUET_OF_FOREST] = HintText(CustomMessage("the Minuet of Forest", /*german*/"das Menuett des Waldes", /*french*/"le menuet de la forΓͺt"), // /*spanish*/el Minueto del bosque { CustomMessage("a warp song", /*german*/"ein Teleportationslied", /*french*/"une chanson de tΓ©lΓ©portation") // /*spanish*/una canciΓ³n de teletransportaciΓ³n }, { - CustomMessage("the song of tall trees", /*german*/"Lied der großen BΓ€ume", /*french*/"le bruit des arbres"), + CustomMessage("the song of tall trees", /*german*/"das Lied der großen BΓ€ume", /*french*/"le bruit des arbres"), // /*spanish*/la canciΓ³n de las copas CustomMessage("an arboreal anthem", /*german*/"eine baumartige Hymne", /*french*/"l'hymne sylvestre"), // /*spanish*/el himno forestal - CustomMessage("a green spark trail", /*german*/"ein grΓΌner Komet", /*french*/"une comΓ¨te verte")}); + CustomMessage("a green spark trail", /*german*/"grΓΌne Funken€", /*french*/"une comΓ¨te verte")}); // /*spanish*/el sendero esmeralda - hintTextTable[RHT_BOLERO_OF_FIRE] = HintText(CustomMessage("the Bolero of Fire", /*german*/"Bolero des Feuers", /*french*/"le bolΓ©ro du feu"), + hintTextTable[RHT_BOLERO_OF_FIRE] = HintText(CustomMessage("the Bolero of Fire", /*german*/"der Bolero des Feuers", /*french*/"le bolΓ©ro du feu"), // /*spanish*/el Bolero del fuego { CustomMessage("a warp song", /*german*/"ein Teleportationslied", /*french*/"une chanson de tΓ©lΓ©portation") // /*spanish*/una canciΓ³n de teletransportaciΓ³n }, { - CustomMessage("a song of lethal lava", /*german*/"Lied der tΓΆdlichen Lava", /*french*/"une musique enflammΓ©e"), + CustomMessage("a song of lethal lava", /*german*/"das Lied der tΓΆdlichen Lava", /*french*/"une musique enflammΓ©e"), // /*spanish*/la canciΓ³n de la lava - CustomMessage("a red spark trail", /*german*/"ein roter Komet", /*french*/"une comΓ¨te rouge"), + CustomMessage("a red spark trail", /*german*/"rote Funken€", /*french*/"une comΓ¨te rouge"), // /*spanish*/el sendero rubΓ­ CustomMessage("a volcanic verse", /*german*/"ein vulkanischer Vers", /*french*/"le souffle du volcan")}); // /*spanish*/el verso volcΓ‘nico - hintTextTable[RHT_SERENADE_OF_WATER] = HintText(CustomMessage("the Serenade of Water", /*german*/"Serenade des Wassers", /*french*/"la sΓ©rΓ©nade de l'eau"), + hintTextTable[RHT_SERENADE_OF_WATER] = HintText(CustomMessage("the Serenade of Water", /*german*/"die Serenade des Wassers", /*french*/"la sΓ©rΓ©nade de l'eau"), // /*spanish*/la Serenata del agua { CustomMessage("a warp song", /*german*/"ein Teleportationslied", /*french*/"une chanson de tΓ©lΓ©portation") // /*spanish*/una canciΓ³n de teletransportaciΓ³n }, { - CustomMessage("a song of a damp ditch", /*german*/"die Stille des Wassers", /*french*/"le calme de l'eau"), + CustomMessage("a song of a damp ditch", /*german*/"ein Lied der GewΓ€sser", /*french*/"le calme de l'eau"), // /*spanish*/la canciΓ³n del estanque - CustomMessage("a blue spark trail", /*german*/"ein blauer Komet", /*french*/"une comΓ¨te bleue"), + CustomMessage("a blue spark trail", /*german*/"blaue Funken€", /*french*/"une comΓ¨te bleue"), // /*spanish*/el sendero zafiro CustomMessage("the lake's lyric", /*german*/"die Lyrik des Sees", /*french*/"la voix du lac")}); // /*spanish*/la letra del lago - hintTextTable[RHT_REQUIEM_OF_SPIRIT] = HintText(CustomMessage("the Requiem of Spirit", /*german*/"Requiem der Geister", /*french*/"le requiem des esprits"), + hintTextTable[RHT_REQUIEM_OF_SPIRIT] = HintText(CustomMessage("the Requiem of Spirit", /*german*/"das Requiem der Geister", /*french*/"le requiem des esprits"), // /*spanish*/el RΓ©quiem del espΓ­ritu { CustomMessage("a warp song", /*german*/"ein Teleportationslied", /*french*/"une chanson de tΓ©lΓ©portation") // /*spanish*/una canciΓ³n de teletransportaciΓ³n }, { - CustomMessage("a song of sandy statues", /*german*/"Lied der sandigen Statuen", /*french*/"la mΓ©lodie d'une grande statue"), + CustomMessage("a song of sandy statues", /*german*/"ein Lied der sandigen Statuen", /*french*/"la mΓ©lodie d'une grande statue"), // /*spanish*/la canciΓ³n de la gran estatua - CustomMessage("an orange spark trail", /*german*/"ein oranger Komet", /*french*/"une comΓ¨te orange"), + CustomMessage("an orange spark trail", /*german*/"orangene Funken€", /*french*/"une comΓ¨te orange"), // /*spanish*/el sendero Γ‘mbar CustomMessage("the desert ditty", /*german*/"der Wind der WΓΌste", /*french*/"le vent du dΓ©sert")}); // /*spanish*/la estrofa del desierto - hintTextTable[RHT_NOCTURNE_OF_SHADOW] = HintText(CustomMessage("the Nocturne of Shadow", /*german*/"Nocturne des Schattens", /*french*/"le nocturne de l'ombre"), + hintTextTable[RHT_NOCTURNE_OF_SHADOW] = HintText(CustomMessage("the Nocturne of Shadow", /*german*/"die Nocturne des Schattens", /*french*/"le nocturne de l'ombre"), // /*spanish*/el Nocturno de la sombra { CustomMessage("a warp song", /*german*/"ein Teleportationslied", /*french*/"une chanson de tΓ©lΓ©portation") // /*spanish*/una canciΓ³n de teletransportaciΓ³n }, { - CustomMessage("a song of spooky spirits", /*german*/"Lied der spukhaften Geister", /*french*/"une hymne de chair de poule"), + CustomMessage("a song of spooky spirits", /*german*/"das Lied der spukenden Geister", /*french*/"une hymne de chair de poule"), // /*spanish*/la canciΓ³n de los espectros CustomMessage("a graveyard boogie", /*german*/"ein Friedhofsboogie", /*french*/"un boogie de fantΓ΄mes"), // /*spanish*/una honra fΓΊnebre - CustomMessage("a haunted hymn", /*german*/"eine Spukhymne", /*french*/"une chanson lugubre"), + CustomMessage("a haunted hymn", /*german*/"eine heimgesuchte Hymne", /*french*/"une chanson lugubre"), // /*spanish*/una estrofa encantada - CustomMessage("a purple spark trail", /*german*/"ein violetter Komet", /*french*/"une comΓ¨te mauve")}); + CustomMessage("a purple spark trail", /*german*/"violette Funken€", /*french*/"une comΓ¨te mauve")}); // /*spanish*/el sendero malva - hintTextTable[RHT_PRELUDE_OF_LIGHT] = HintText(CustomMessage("the Prelude of Light", /*german*/"Kantate des Lichts", /*french*/"le prΓ©lude de la lumiΓ¨re"), + hintTextTable[RHT_PRELUDE_OF_LIGHT] = HintText(CustomMessage("the Prelude of Light", /*german*/"die Kantate des Lichts", /*french*/"le prΓ©lude de la lumiΓ¨re"), // /*spanish*/el Preludio de la luz { CustomMessage("a warp song", /*german*/"ein Teleportationslied", /*french*/"une chanson de tΓ©lΓ©portation") // /*spanish*/una canciΓ³n de teletransportaciΓ³n }, { - CustomMessage("a luminous prologue melody", /*german*/"eine leuchtende Melodie", /*french*/"une matine illuminΓ©e"), + CustomMessage("a luminous prologue melody", /*german*/"der leuchtende Prolog", /*french*/"une matine illuminΓ©e"), // /*spanish*/la melodΓ­a refulgente - CustomMessage("a yellow spark trail", /*german*/"ein gelber Komet", /*french*/"une comΓ¨te jaune"), + CustomMessage("a yellow spark trail", /*german*/"gelbe Funken€", /*french*/"une comΓ¨te jaune"), // /*spanish*/el sendero resplandeciente CustomMessage("the temple traveler", /*german*/"ein Tempelreisender", /*french*/"un chant de sanctuaire")}); // /*spanish*/la ruta del templo - hintTextTable[RHT_DEKU_TREE_MAP] = HintText(CustomMessage("the Deku Tree Map", /*german*/"die Karte des Deku-Baums", /*french*/"la carte de l'Arbre Mojo"), + hintTextTable[RHT_DEKU_TREE_MAP] = HintText(CustomMessage("the Deku Tree Map", /*german*/"die Labyrinth-Karte des Deku-Baumes", /*french*/"la carte de l'Arbre Mojo"), // /*spanish*/el mapa del Gran Árbol Deku { - CustomMessage("a dungeon map", /*german*/"eine Karte", /*french*/"une carte") + CustomMessage("a dungeon map", /*german*/"eine Labyrinth-Karte", /*french*/"une carte") // /*spanish*/un mapa }, { CustomMessage("a mossy atlas", /*german*/"ein moosiger Atlas", /*french*/"un atlas boisΓ©"), // /*spanish*/un atlas musgoso - CustomMessage("some mossy blueprints", /*german*/"einige moosige Blaupausen", /*french*/"un plan boisΓ©")}); + CustomMessage("some mossy blueprints", /*german*/"moosige BauplΓ€ne€", /*french*/"un plan boisΓ©")}); // /*spanish*/unos planos musgosos - hintTextTable[RHT_DODONGOS_CAVERN_MAP] = HintText(CustomMessage("the Dodongo's Cavern Map", /*german*/"die Karte der Dodongo-HΓΆhle", /*french*/"la carte de la Caverne Dodongo"), + hintTextTable[RHT_DODONGOS_CAVERN_MAP] = HintText(CustomMessage("the Dodongo's Cavern Map", /*german*/"die Labyrinth-Karte von Dodongos HΓΆhle", /*french*/"la carte de la Caverne Dodongo"), // /*spanish*/el mapa de la Cueva de los Dodongos { - CustomMessage("a dungeon map", /*german*/"eine Karte", /*french*/"une carte") + CustomMessage("a dungeon map", /*german*/"eine Labyrinth-Karte", /*french*/"une carte") // /*spanish*/un mapa }, { CustomMessage("a rocky atlas", /*german*/"eine felsiger Atlas", /*french*/"un atlas rocheux"), // /*spanish*/un atlas rocoso - CustomMessage("some rocky blueprints", /*german*/"einige felsige Blaupausen", /*french*/"un plan rocheux")}); + CustomMessage("some rocky blueprints", /*german*/"felsige BauplΓ€ne€", /*french*/"un plan rocheux")}); // /*spanish*/unos planos rocosos - hintTextTable[RHT_JABU_JABUS_BELLY_MAP] = HintText(CustomMessage("the Jabu-Jabu's Belly Map", /*german*/"die Karte des Jabu-Jabu-Bauchs", /*french*/"la carte de Jabu-Jabu"), + hintTextTable[RHT_JABU_JABUS_BELLY_MAP] = HintText(CustomMessage("the Jabu-Jabu's Belly Map", /*german*/"die Labyrinth-Karte von Jabu-Jabus Bauch", /*french*/"la carte de Jabu-Jabu"), // /*spanish*/el mapa de la Tripa de Jabu-Jabu { - CustomMessage("a dungeon map", /*german*/"eine Karte", /*french*/"une carte") + CustomMessage("a dungeon map", /*german*/"eine Labyrinth-Karte", /*french*/"une carte") // /*spanish*/un mapa }, { CustomMessage("a fishy atlas", /*german*/"ein fischiger Atlas", /*french*/"un atlas digΓ©rΓ©"), // /*spanish*/un atlas digesto - CustomMessage("some fishy blueprints", /*german*/"einige fischige Blaupausen", /*french*/"un plan digΓ©rΓ©")}); + CustomMessage("some fishy blueprints", /*german*/"fischige BauplΓ€ne€", /*french*/"un plan digΓ©rΓ©")}); // /*spanish*/unos planos digestos - hintTextTable[RHT_FOREST_TEMPLE_MAP] = HintText(CustomMessage("the Forest Temple Map", /*german*/"die Karte des Waldtempels", /*french*/"la carte du Temple de la ForΓͺt"), + hintTextTable[RHT_FOREST_TEMPLE_MAP] = HintText(CustomMessage("the Forest Temple Map", /*german*/"die Labyrinth-Karte des Waldtempels", /*french*/"la carte du Temple de la ForΓͺt"), // /*spanish*/el mapa del Templo del Bosque { - CustomMessage("a dungeon map", /*german*/"eine Karte", /*french*/"une carte") + CustomMessage("a dungeon map", /*german*/"eine Labyrinth-Karte", /*french*/"une carte") // /*spanish*/un mapa }, { CustomMessage("a sylvan atlas", /*german*/"ein waldiger Atlas", /*french*/"un atlas sylvestre"), // /*spanish*/un atlas enselvado - CustomMessage("some sylvan blueprints", /*german*/"einige waldige Blaupausen", /*french*/"un plan sylvestre")}); + CustomMessage("some sylvan blueprints", /*german*/"waldige BauplΓ€ne€", /*french*/"un plan sylvestre")}); // /*spanish*/unos planos enselvados - hintTextTable[RHT_FIRE_TEMPLE_MAP] = HintText(CustomMessage("the Fire Temple Map", /*german*/"die Karte des Feuertempels", /*french*/"la carte du Temple du Feu"), + hintTextTable[RHT_FIRE_TEMPLE_MAP] = HintText(CustomMessage("the Fire Temple Map", /*german*/"die Labyrinth-Karte des Feuertempels", /*french*/"la carte du Temple du Feu"), // /*spanish*/el mapa del Templo del Fuego { - CustomMessage("a dungeon map", /*german*/"eine Karte", /*french*/"une carte") + CustomMessage("a dungeon map", /*german*/"eine Labyrinth-Karte", /*french*/"une carte") // /*spanish*/un mapa }, { CustomMessage("a molten atlas", /*german*/"ein geschmolzener Atlas", /*french*/"un atlas fondu"), // /*spanish*/un atlas fundido - CustomMessage("some molten blueprints", /*german*/"einige geschmolzene Blaupausen", /*french*/"un plan fondu")}); + CustomMessage("some molten blueprints", /*german*/"geschmolzene BauplΓ€ne€", /*french*/"un plan fondu")}); // /*spanish*/unos planos fundidos - hintTextTable[RHT_WATER_TEMPLE_MAP] = HintText(CustomMessage("the Water Temple Map", /*german*/"die Karte des Wassertempels", /*french*/"la carte du Temple de l'Eau"), + hintTextTable[RHT_WATER_TEMPLE_MAP] = HintText(CustomMessage("the Water Temple Map", /*german*/"die Labyrinth-Karte des Wassertempels", /*french*/"la carte du Temple de l'Eau"), // /*spanish*/el mapa del Templo del Agua { - CustomMessage("a dungeon map", /*german*/"eine Karte", /*french*/"une carte") + CustomMessage("a dungeon map", /*german*/"eine Labyrinth-Karte", /*french*/"une carte") // /*spanish*/un mapa }, { CustomMessage("a wet atlas", /*german*/"ein nasser Atlas", /*french*/"un atlas humide"), // /*spanish*/un atlas mojado - CustomMessage("some wet blueprints", /*german*/"einige nasse Blaupausen", /*french*/"un plan humide")}); + CustomMessage("some wet blueprints", /*german*/"nasse BauplΓ€ne€", /*french*/"un plan humide")}); // /*spanish*/unos planos mojados - hintTextTable[RHT_SPIRIT_TEMPLE_MAP] = HintText(CustomMessage("the Spirit Temple Map", /*german*/"die Karte des Geistertempels", /*french*/"la carte du Temple de l'Esprit"), + hintTextTable[RHT_SPIRIT_TEMPLE_MAP] = HintText(CustomMessage("the Spirit Temple Map", /*german*/"die Labyrinth-Karte des Geistertempels", /*french*/"la carte du Temple de l'Esprit"), // /*spanish*/el mapa del Templo del EspΓ­ritu { - CustomMessage("a dungeon map", /*german*/"eine Karte", /*french*/"une carte") + CustomMessage("a dungeon map", /*german*/"eine Labyrinth-Karte", /*french*/"une carte") // /*spanish*/un mapa }, { CustomMessage("a sandy atlas", /*german*/"ein sandiger Atlas", /*french*/"un atlas sableux"), // /*spanish*/un atlas arenoso - CustomMessage("some sandy blueprints", /*german*/"einige sandige Blaupausen", /*french*/"un plan sableux")}); + CustomMessage("some sandy blueprints", /*german*/"sandige BauplΓ€ne€", /*french*/"un plan sableux")}); // /*spanish*/unos planos arenosos - hintTextTable[RHT_SHADOW_TEMPLE_MAP] = HintText(CustomMessage("the Shadow Temple Map", /*german*/"die Karte des Schattentempels", /*french*/"la carte du Temple de l'Ombre"), + hintTextTable[RHT_SHADOW_TEMPLE_MAP] = HintText(CustomMessage("the Shadow Temple Map", /*german*/"die Labyrinth-Karte des Schattentempels", /*french*/"la carte du Temple de l'Ombre"), // /*spanish*/el mapa del Templo de las Sombras { - CustomMessage("a dungeon map", /*german*/"eine Karte", /*french*/"une carte") + CustomMessage("a dungeon map", /*german*/"eine Labyrinth-Karte", /*french*/"une carte") // /*spanish*/un mapa }, { CustomMessage("a creepy atlas", /*german*/"eine gruseliger Atlas", /*french*/"un atlas sinistre"), // /*spanish*/un atlas siniestra - CustomMessage("some creepy blueprints", /*german*/"einige gruselige Blaupausen", /*french*/"un plan sinistre")}); + CustomMessage("some creepy blueprints", /*german*/"gruselige BauplΓ€ne€", /*french*/"un plan sinistre")}); // /*spanish*/unos planos siniestras - hintTextTable[RHT_BOTTOM_OF_THE_WELL_MAP] = HintText(CustomMessage("the Bottom of the Well Map", /*german*/"die Karte des Grund des Brunnens", /*french*/"la carte du fond du Puits"), + hintTextTable[RHT_BOTTOM_OF_THE_WELL_MAP] = HintText(CustomMessage("the Bottom of the Well Map", /*german*/"die Labyrinth-Karte vom Grund des Brunnens", /*french*/"la carte du fond du Puits"), // /*spanish*/el mapa del Fondo del pozo { - CustomMessage("a dungeon map", /*german*/"eine Karte", /*french*/"une carte") + CustomMessage("a dungeon map", /*german*/"eine Labyrinth-Karte", /*french*/"une carte") // /*spanish*/un mapa }, { CustomMessage("a moldy atlas", /*german*/"ein schimmeliger Atlas", /*french*/"un atlas moisi"), // /*spanish*/un atlas mohoso - CustomMessage("some moldy blueprints", /*german*/"einige schimmelige Blaupausen", /*french*/"un plan moisi")}); + CustomMessage("some moldy blueprints", /*german*/"schimmelige BauplΓ€ne€", /*french*/"un plan moisi")}); // /*spanish*/unos planos mohosos - hintTextTable[RHT_ICE_CAVERN_MAP] = HintText(CustomMessage("the Ice Cavern Map", /*german*/"die Karte der EishΓΆhle", /*french*/"la carte de la Caverne Polaire"), + hintTextTable[RHT_ICE_CAVERN_MAP] = HintText(CustomMessage("the Ice Cavern Map", /*german*/"die Labyrinth-Karte der EishΓΆhle", /*french*/"la carte de la Caverne Polaire"), // /*spanish*/el mapa de la Caverna de hielo { - CustomMessage("a dungeon map", /*german*/"eine Karte", /*french*/"une carte") + CustomMessage("a dungeon map", /*german*/"eine Labyrinth-Karte", /*french*/"une carte") // /*spanish*/un mapa }, { CustomMessage("a polar atlas", /*german*/"ein polarer Atlas", /*french*/"un atlas polaire"), // /*spanish*/un atlas polar - CustomMessage("some polar blueprints", /*german*/"einige polare Blaupausen", /*french*/"un plan polaire")}); + CustomMessage("some polar blueprints", /*german*/"polare BauplΓ€ne€", /*french*/"un plan polaire")}); // /*spanish*/unos planos polars - hintTextTable[RHT_DEKU_TREE_COMPASS] = HintText(CustomMessage("the Deku Tree Compass", /*german*/"der Kompaß des Deku-Baums", /*french*/"la boussole de l'Arbre Mojo"), + hintTextTable[RHT_DEKU_TREE_COMPASS] = HintText(CustomMessage("the Deku Tree Compass", /*german*/"der Kompaß des Deku-Baumes", /*french*/"la boussole de l'Arbre Mojo"), // /*spanish*/la brΓΊjula del Gran Árbol Deku { CustomMessage("a compass", /*german*/"ein Kompaß", /*french*/"une boussole") @@ -1063,7 +1063,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a mossy magnetic needle", /*german*/"eine moosige Magnetnadel", /*french*/"une aimant boisΓ©e")}); // /*spanish*/un imΓ‘n musgoso - hintTextTable[RHT_DODONGOS_CAVERN_COMPASS] = HintText(CustomMessage("the Dodongo's Cavern Compass", /*german*/"der Kompaß der Dodongo-HΓΆhle", /*french*/"la boussole de la Caverne Dodongo"), + hintTextTable[RHT_DODONGOS_CAVERN_COMPASS] = HintText(CustomMessage("the Dodongo's Cavern Compass", /*german*/"der Kompaß von Dodongos HΓΆhle", /*french*/"la boussole de la Caverne Dodongo"), // /*spanish*/la brΓΊjula de la Cueva de los Dodongos { CustomMessage("a compass", /*german*/"ein Kompaß", /*french*/"une boussole") @@ -1074,7 +1074,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a rocky magnetic needle", /*german*/"eine felsige Magnetnadel", /*french*/"une aimant rocheux")}); // /*spanish*/un imΓ‘n rocoso - hintTextTable[RHT_JABU_JABUS_BELLY_COMPASS] = HintText(CustomMessage("the Jabu-Jabu's Belly Compass", /*german*/"der Kompaß des Jabu-Jabu-Bauchs", /*french*/"la boussole de Jabu-Jabu"), + hintTextTable[RHT_JABU_JABUS_BELLY_COMPASS] = HintText(CustomMessage("the Jabu-Jabu's Belly Compass", /*german*/"der Kompaß von Jabu-Jabus Bauch", /*french*/"la boussole de Jabu-Jabu"), // /*spanish*/la brΓΊjula de la Tripa de Jabu-Jabu { CustomMessage("a compass", /*german*/"ein Kompaß", /*french*/"une boussole") @@ -1140,15 +1140,15 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a creepy magnetic needle", /*german*/"eine gruselige Magnetnadel", /*french*/"une aimant sinistre")}); // /*spanish*/un imΓ‘n siniestra - hintTextTable[RHT_BOTTOM_OF_THE_WELL_COMPASS] = HintText(CustomMessage("the Bottom of the Well Compass", /*german*/"der Kompaß des Grund des Brunnens", /*french*/"la boussole du fond du Puits"), + hintTextTable[RHT_BOTTOM_OF_THE_WELL_COMPASS] = HintText(CustomMessage("the Bottom of the Well Compass", /*german*/"der Kompaß vom Grund des Brunnens", /*french*/"la boussole du fond du Puits"), // /*spanish*/la brΓΊjula del Fondo del pozo { CustomMessage("a compass", /*german*/"ein Kompaß", /*french*/"une boussole") // /*spanish*/una brΓΊjula }, { - CustomMessage("a dank treasure tracker", /*german*/"ein feuchter Schatzfinder", /*french*/"un cherche-trΓ©sor moisi"), + CustomMessage("a dank treasure tracker", /*german*/"ein schimmeliger Schatzfinder", /*french*/"un cherche-trΓ©sor moisi"), // /*spanish*/un zahorΓ­ mohoso - CustomMessage("a dank magnetic needle", /*german*/"eine feuchte Magnetnadel", /*french*/"une aimant moisi")}); + CustomMessage("a dank magnetic needle", /*german*/"eine schimmelige Magnetnadel", /*french*/"une aimant moisi")}); // /*spanish*/un imΓ‘n mohoso hintTextTable[RHT_ICE_CAVERN_COMPASS] = HintText(CustomMessage("the Ice Cavern Compass", /*german*/"der Kompaß der EishΓΆhle", /*french*/"la Boussole de la Caverne Polaire"), @@ -1162,207 +1162,208 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a polar magnetic needle", /*german*/"eine polare Magnetnadel", /*french*/"une aimant polaire")}); // /*spanish*/un imΓ‘n polar - hintTextTable[RHT_FOREST_TEMPLE_BOSS_KEY] = HintText(CustomMessage("the Forest Temple Boss Key", /*german*/"der Waldtempel-Master-SchlΓΌssel", /*french*/"la ClΓ© d'Or du Temple de la ForΓͺt"), + hintTextTable[RHT_FOREST_TEMPLE_BOSS_KEY] = HintText(CustomMessage("the Forest Temple Boss Key", /*german*/"der Master-SchlΓΌssel des Waldtempels", /*french*/"la ClΓ© d'Or du Temple de la ForΓͺt"), // /*spanish*/la gran llave del Templo del Bosque { CustomMessage("a boss key", /*german*/"ein Master-SchlΓΌssel", /*french*/"une ClΓ© d'Or") // /*spanish*/una gran llave }, { - CustomMessage("a sylvan master of unlocking", /*german*/"ein waldiger Meister des EntschlΓΌsselns", /*french*/"un anti-grosse porte sylvestre"), + CustomMessage("a sylvan master of unlocking", /*german*/"ein waldiger Meister der Entriegelung", /*french*/"un anti-grosse porte sylvestre"), // /*spanish*/la clave enselvada de un jefe - CustomMessage("a sylvan dungeon's master pass", /*german*/"ein waldiger Dungeon-Meisterpass", /*french*/"une clΓ© malΓ©fique sylvestre")}); + CustomMessage("a sylvan dungeon's master pass", /*german*/"ein waldiger Labyrinth-Meisterpass", /*french*/"une clΓ© malΓ©fique sylvestre")}); // /*spanish*/el pase maestro enselvado - hintTextTable[RHT_FIRE_TEMPLE_BOSS_KEY] = HintText(CustomMessage("the Fire Temple Boss Key", /*german*/"der Feuertempel-Master-SchlΓΌssel", /*french*/"la ClΓ© d'Or du Temple du Feu"), + hintTextTable[RHT_FIRE_TEMPLE_BOSS_KEY] = HintText(CustomMessage("the Fire Temple Boss Key", /*german*/"der Master-SchlΓΌssel des Feuertempels", /*french*/"la ClΓ© d'Or du Temple du Feu"), // /*spanish*/la gran llave del Templo del Fuego { CustomMessage("a boss key", /*german*/"ein Master-SchlΓΌssel", /*french*/"une ClΓ© d'Or") // /*spanish*/una gran llave }, { - CustomMessage("a molten master of unlocking", /*german*/"ein geschmolzener Meister des EntschlΓΌsselns", /*french*/"un anti-grosse porte fondu"), + CustomMessage("a molten master of unlocking", /*german*/"ein geschmolzener Meister der Entriegelung", /*french*/"un anti-grosse porte fondu"), // /*spanish*/la clave fundido de un jefe - CustomMessage("a molten dungeon's master pass", /*german*/"ein geschmolzener Dungeon-Meisterpass", /*french*/"une clΓ© malΓ©fique fondu")}); + CustomMessage("a molten dungeon's master pass", /*german*/"ein geschmolzener Labyrinth-Meisterpass", /*french*/"une clΓ© malΓ©fique fondu")}); // /*spanish*/el pase maestro fundido - hintTextTable[RHT_WATER_TEMPLE_BOSS_KEY] = HintText(CustomMessage("the Water Temple Boss Key", /*german*/"der Wassertempel-Master-SchlΓΌssel", /*french*/"la ClΓ© d'Or du Temple de l'Eau"), + hintTextTable[RHT_WATER_TEMPLE_BOSS_KEY] = HintText(CustomMessage("the Water Temple Boss Key", /*german*/"der Master-SchlΓΌssel des Wassertempels", /*french*/"la ClΓ© d'Or du Temple de l'Eau"), // /*spanish*/la gran llave del Templo del Agua { CustomMessage("a boss key", /*german*/"ein Master-SchlΓΌssel", /*french*/"une ClΓ© d'Or") // /*spanish*/una gran llave }, { - CustomMessage("a wet master of unlocking", /*german*/"ein nasser Meister des EntschlΓΌsselns", /*french*/"un anti-grosse porte humide"), + CustomMessage("a wet master of unlocking", /*german*/"ein nasser Meister der Entriegelung", /*french*/"un anti-grosse porte humide"), // /*spanish*/la clave mojado de un jefe - CustomMessage("a wet dungeon's master pass", /*german*/"ein nasser Dungeon-Meisterpass", /*french*/"une clΓ© malΓ©fique humide")}); + CustomMessage("a wet dungeon's master pass", /*german*/"ein nasser Labyrinth-Meisterpass", /*french*/"une clΓ© malΓ©fique humide")}); // /*spanish*/el pase maestro mojado - hintTextTable[RHT_SPIRIT_TEMPLE_BOSS_KEY] = HintText(CustomMessage("the Spirit Temple Boss Key", /*german*/"der Geistertempel-Master-SchlΓΌssel", /*french*/"la ClΓ© d'Or du Temple de l'Esprit"), + hintTextTable[RHT_SPIRIT_TEMPLE_BOSS_KEY] = HintText(CustomMessage("the Spirit Temple Boss Key", /*german*/"der Master-SchlΓΌssel des Geistertempels", /*french*/"la ClΓ© d'Or du Temple de l'Esprit"), // /*spanish*/la gran llave del Templo del EspΓ­ritu { CustomMessage("a boss key", /*german*/"ein Master-SchlΓΌssel", /*french*/"une ClΓ© d'Or") // /*spanish*/una gran llave }, { - CustomMessage("a sandy master of unlocking", /*german*/"ein sandiger Meister des EntschlΓΌsselns", /*french*/"un anti-grosse porte sableux"), + CustomMessage("a sandy master of unlocking", /*german*/"ein sandiger Meister der Entriegelung", /*french*/"un anti-grosse porte sableux"), // /*spanish*/la clave arenoso de un jefe - CustomMessage("a sandy dungeon's master pass", /*german*/"ein sandiger Dungeon-Meisterpass", /*french*/"une clΓ© malΓ©fique sableux")}); + CustomMessage("a sandy dungeon's master pass", /*german*/"ein sandiger Labyrinth-Meisterpass", /*french*/"une clΓ© malΓ©fique sableux")}); // /*spanish*/el pase maestro arenoso - hintTextTable[RHT_SHADOW_TEMPLE_BOSS_KEY] = HintText(CustomMessage("the Shadow Temple Boss Key", /*german*/"der Schattentempel-Master-SchlΓΌssel", /*french*/"la ClΓ© d'Or du Temple de l'Ombre"), + hintTextTable[RHT_SHADOW_TEMPLE_BOSS_KEY] = HintText(CustomMessage("the Shadow Temple Boss Key", /*german*/"der Master-SchlΓΌssel des Schattentempels", /*french*/"la ClΓ© d'Or du Temple de l'Ombre"), // /*spanish*/la gran llave del Templo de las Sombras { CustomMessage("a boss key", /*german*/"ein Master-SchlΓΌssel", /*french*/"une ClΓ© d'Or") // /*spanish*/una gran llave }, { - CustomMessage("a creepy master of unlocking", /*german*/"ein gruseliger Meister des EntschlΓΌsselns", /*french*/"un anti-grosse porte sinistre"), + CustomMessage("a creepy master of unlocking", /*german*/"ein gruseliger Meister der Entriegelung", /*french*/"un anti-grosse porte sinistre"), // /*spanish*/la clave siniestra de un jefe - CustomMessage("a creepy dungeon's master pass", /*german*/"ein gruseliger Dungeon-Meisterpass", /*french*/"une clΓ© malΓ©fique sinistre")}); + CustomMessage("a creepy dungeon's master pass", /*german*/"ein gruseliger Labyrinth-Meisterpass", /*french*/"une clΓ© malΓ©fique sinistre")}); // /*spanish*/el pase maestro siniestra - hintTextTable[RHT_GANONS_CASTLE_BOSS_KEY] = HintText(CustomMessage("the Ganon's Castle Boss Key", /*german*/"der Master-SchlΓΌssel fΓΌr Ganons Schloß", /*french*/"la ClΓ© d'Or du ChΓ’teau de Ganon"), + hintTextTable[RHT_GANONS_CASTLE_BOSS_KEY] = HintText(CustomMessage("the Ganon's Castle Boss Key", /*german*/"der Master-SchlΓΌssel von Ganons Schloß", /*french*/"la ClΓ© d'Or du ChΓ’teau de Ganon"), // /*spanish*/la gran llave del Castillo de Ganon { CustomMessage("a boss key", /*german*/"ein Master-SchlΓΌssel", /*french*/"une ClΓ© d'Or") // /*spanish*/una gran llave }, { - CustomMessage("a final master of unlocking", /*german*/"ein finaler Meister des EntschlΓΌsselns", /*french*/"un anti-grosse porte final"), + CustomMessage("a final master of unlocking", /*german*/"ein finaler Meister der Entriegelung", /*french*/"un anti-grosse porte final"), // /*spanish*/la clave final de un jefe - CustomMessage("a final dungeon's master pass", /*german*/"ein finaler Dungeon-Meisterpass", /*french*/"une clΓ© malΓ©fique final")}); + CustomMessage("a final dungeon's master pass", /*german*/"ein finaler Labyrinth-Meisterpass", /*french*/"une clΓ© malΓ©fique final")}); // /*spanish*/el pase maestro final - hintTextTable[RHT_FOREST_TEMPLE_SMALL_KEY] = HintText(CustomMessage("a Forest Temple Small Key", /*german*/"ein kleiner Waldtempel-SchlΓΌssel", /*french*/"une petite clΓ© du Temple de la ForΓͺt"), + hintTextTable[RHT_FOREST_TEMPLE_SMALL_KEY] = HintText(CustomMessage("a Forest Temple Small Key", /*german*/"ein kleiner SchlΓΌssel des Waldtempels", /*french*/"une petite clΓ© du Temple de la ForΓͺt"), // /*spanish*/una llave pequeΓ±a del Templo del Bosque { CustomMessage("a small key", /*german*/"ein kleiner SchlΓΌssel", /*french*/"une petite clΓ©") // /*spanish*/una llave pequeΓ±a }, { - CustomMessage("a sylvan tool for unlocking", /*german*/"ein waldiges Werkzeug zur EntschlΓΌsselung", /*french*/"un anti-porte sylvestre"), + CustomMessage("a sylvan tool for unlocking", /*german*/"ein waldiges Werkzeug zur Entriegelung", /*french*/"un anti-porte sylvestre"), // /*spanish*/una clave de una entrada enselvada - CustomMessage("a sylvan dungeon pass", /*german*/"ein waldiger Dungeon-Pass", /*french*/"le rΓͺve sylvestre d'un prisonnier"), + CustomMessage("a sylvan dungeon pass", /*german*/"ein waldiger Labyrinth-Pass", /*french*/"le rΓͺve sylvestre d'un prisonnier"), // /*spanish*/un pase de una mazmorra enselvada CustomMessage("a sylvan lock remover", /*german*/"ein waldiger Schlossentferner", /*french*/"un efface-serrure sylvestre"), // /*spanish*/un destructor de cerraduras enselvada CustomMessage("a sylvan lockpick", /*german*/"ein waldiger Dietrich", /*french*/"un crochet Γ  porte sylvestre")}); // /*spanish*/una apertura portentosa enselvada - hintTextTable[RHT_FIRE_TEMPLE_SMALL_KEY] = HintText(CustomMessage("a Fire Temple Small Key", /*german*/"ein kleiner Feuertempel-SchlΓΌssel", /*french*/"une petite clΓ© du Temple du Feu"), + hintTextTable[RHT_FIRE_TEMPLE_SMALL_KEY] = HintText(CustomMessage("a Fire Temple Small Key", /*german*/"ein kleiner SchlΓΌssel des Feuertempels", /*french*/"une petite clΓ© du Temple du Feu"), // /*spanish*/una llave pequeΓ±a del Templo del Fuego { CustomMessage("a small key", /*german*/"ein kleiner SchlΓΌssel", /*french*/"une petite clΓ©") // /*spanish*/una llave pequeΓ±a }, { - CustomMessage("a molten tool for unlocking", /*german*/"ein geschmolzenes Werkzeug zur EntschlΓΌsselung", /*french*/"un anti-porte fondu"), + CustomMessage("a molten tool for unlocking", /*german*/"ein geschmolzenes Werkzeug zur Entriegelung", /*french*/"un anti-porte fondu"), // /*spanish*/una clave de una entrada fundida - CustomMessage("a molten dungeon pass", /*german*/"ein geschmolzener Dungeon-Pass", /*french*/"le rΓͺve fondu d'un prisonnier"), + CustomMessage("a molten dungeon pass", /*german*/"ein geschmolzener Labyrinth-Pass", /*french*/"le rΓͺve fondu d'un prisonnier"), // /*spanish*/un pase de una mazmorra fundida CustomMessage("a molten lock remover", /*german*/"ein geschmolzener Schlossentferner", /*french*/"un efface-serrure fondu"), // /*spanish*/un destructor de cerraduras fundida CustomMessage("a molten lockpick", /*german*/"ein geschmolzener Dietrich", /*french*/"un crochet Γ  porte fondu")}); // /*spanish*/una apertura portentosa fundida - hintTextTable[RHT_WATER_TEMPLE_SMALL_KEY] = HintText(CustomMessage("a Water Temple Small Key", /*german*/"ein kleiner Wassertempel-SchlΓΌssel", /*french*/"une petite clΓ© du Temple de l'Eau"), + hintTextTable[RHT_WATER_TEMPLE_SMALL_KEY] = HintText(CustomMessage("a Water Temple Small Key", /*german*/"ein kleiner SchlΓΌssel des Wassertempels", /*french*/"une petite clΓ© du Temple de l'Eau"), // /*spanish*/una llave pequeΓ±a del Templo del Agua { CustomMessage("a small key", /*german*/"ein kleiner SchlΓΌssel", /*french*/"une petite clΓ©") // /*spanish*/una llave pequeΓ±a }, { - CustomMessage("a wet tool for unlocking", /*german*/"ein nasses Werkzeug zur EntschlΓΌsselung", /*french*/"un anti-porte humide"), + CustomMessage("a wet tool for unlocking", /*german*/"ein nasses Werkzeug zur Entriegelung", /*french*/"un anti-porte humide"), // /*spanish*/una clave de una entrada mojada - CustomMessage("a wet dungeon pass", /*german*/"ein nasser Dungeon-Pass", /*french*/"le rΓͺve humide d'un prisonnier"), + CustomMessage("a wet dungeon pass", /*german*/"ein nasser Labyrinth-Pass", /*french*/"le rΓͺve humide d'un prisonnier"), // /*spanish*/un pase de una mazmorra mojada CustomMessage("a wet lock remover", /*german*/"ein nasser Schlossentferner", /*french*/"un efface-serrure humide"), // /*spanish*/un destructor de cerraduras mojada CustomMessage("a wet lockpick", /*german*/"ein nasser Dietrich", /*french*/"un crochet Γ  porte humide")}); // /*spanish*/una apertura portentosa mojada - hintTextTable[RHT_SPIRIT_TEMPLE_SMALL_KEY] = HintText(CustomMessage("a Spirit Temple Small Key", /*german*/"ein kleiner Geistertempel-SchlΓΌssel", /*french*/"une petite clΓ© du Temple de l'Esprit"), + hintTextTable[RHT_SPIRIT_TEMPLE_SMALL_KEY] = HintText(CustomMessage("a Spirit Temple Small Key", /*german*/"ein kleiner SchlΓΌssel des Geistertempels", /*french*/"une petite clΓ© du Temple de l'Esprit"), // /*spanish*/una llave pequeΓ±a del Templo del EspΓ­ritu { CustomMessage("a small key", /*german*/"ein kleiner SchlΓΌssel", /*french*/"une petite clΓ©") // /*spanish*/una llave pequeΓ±a }, { - CustomMessage("a sandy tool for unlocking", /*german*/"ein sandiges Werkzeug zur EntschlΓΌsselung", /*french*/"un anti-porte sableux"), + CustomMessage("a sandy tool for unlocking", /*german*/"ein sandiges Werkzeug zur Entriegelung", /*french*/"un anti-porte sableux"), // /*spanish*/una clave de una entrada arenosa - CustomMessage("a sandy dungeon pass", /*german*/"ein sandiger Dungeon-Pass", /*french*/"le rΓͺve sableux d'un prisonnier"), + CustomMessage("a sandy dungeon pass", /*german*/"ein sandiger Labyrinth-Pass", /*french*/"le rΓͺve sableux d'un prisonnier"), // /*spanish*/un pase de una mazmorra arenosa CustomMessage("a sandy lock remover", /*german*/"ein sandiger Schlossentferner", /*french*/"un efface-serrure sableux"), // /*spanish*/un destructor de cerraduras arenosa CustomMessage("a sandy lockpick", /*german*/"ein sandiger Dietrich", /*french*/"un crochet Γ  porte sableux")}); // /*spanish*/una apertura portentosa arenosa - hintTextTable[RHT_SHADOW_TEMPLE_SMALL_KEY] = HintText(CustomMessage("a Shadow Temple Small Key", /*german*/"ein kleiner Schattentempel-SchlΓΌssel", /*french*/"une petite clΓ© du Temple de l'Ombre"), + hintTextTable[RHT_SHADOW_TEMPLE_SMALL_KEY] = HintText(CustomMessage("a Shadow Temple Small Key", /*german*/"ein kleiner SchlΓΌssel des Schattentempels", /*french*/"une petite clΓ© du Temple de l'Ombre"), // /*spanish*/una llave pequeΓ±a del Templo de las Sombras { CustomMessage("a small key", /*german*/"ein kleiner SchlΓΌssel", /*french*/"une petite clΓ©") // /*spanish*/una llave pequeΓ±a }, { - CustomMessage("a creepy tool for unlocking", /*german*/"ein gruseliges Werkzeug zur EntschlΓΌsselung", /*french*/"un anti-porte sinistre"), + CustomMessage("a creepy tool for unlocking", /*german*/"ein gruseliges Werkzeug zur Entriegelung", /*french*/"un anti-porte sinistre"), // /*spanish*/una clave de una entrada siniestra:a - CustomMessage("a creepy dungeon pass", /*german*/"ein gruseliger Dungeon-Pass", /*french*/"le rΓͺve sinistre d'un prisonnier"), + CustomMessage("a creepy dungeon pass", /*german*/"ein gruseliger Labyrinth-Pass", /*french*/"le rΓͺve sinistre d'un prisonnier"), // /*spanish*/un pase de una mazmorra siniestra:a CustomMessage("a creepy lock remover", /*german*/"ein gruseliger Schlossentferner", /*french*/"un efface-serrure sinistre"), // /*spanish*/un destructor de cerraduras siniestra:a CustomMessage("a creepy lockpick", /*german*/"ein gruseliger Dietrich", /*french*/"un crochet Γ  porte sinistre")}); // /*spanish*/una apertura portentosa siniestra:a - hintTextTable[RHT_GERUDO_TRAINING_GROUND_SMALL_KEY] = HintText(CustomMessage("a Gerudo Training Ground Small Key", /*german*/"ein kleiner SchlΓΌssel des Gerudo-TrainingsgelΓ€ndes", /*french*/"une petite clΓ© du Gymnase Gerudo"), + hintTextTable[RHT_GERUDO_TRAINING_GROUND_SMALL_KEY] = HintText(CustomMessage("a Gerudo Training Ground Small Key", /*german*/"ein kleiner SchlΓΌssel der Gerudo-Trainingsarena", /*french*/"une petite clΓ© du Gymnase Gerudo"), // /*spanish*/una llave pequeΓ±a del Centro de InstrucciΓ³n Gerudo { CustomMessage("a small key", /*german*/"ein kleiner SchlΓΌssel", /*french*/"une petite clΓ©") // /*spanish*/una llave pequeΓ±a }, { - CustomMessage("a labyrinthian tool for unlocking", /*german*/"ein labyrinthisches Werkzeug zur EntschlΓΌsselung", /*french*/"un anti-porte labyrinthique"), + CustomMessage("a labyrinthian tool for unlocking", /*german*/"ein verwirrendes Werkzeug zur Entriegelung", /*french*/"un anti-porte labyrinthique"), // /*spanish*/una clave de una entrada laberΓ­ntica - CustomMessage("a labyrinthian dungeon pass", /*german*/"ein labyrinthischer Dungeon-Pass", /*french*/"le rΓͺve labyrinthique d'un prisonnier"), + CustomMessage("a labyrinthian dungeon pass", /*german*/"ein verwirrender Labyrinth-Pass", /*french*/"le rΓͺve labyrinthique d'un prisonnier"), // /*spanish*/un pase de una mazmorra laberΓ­ntica - CustomMessage("a labyrinthian lock remover", /*german*/"ein labyrinthischer Schlossentferner", /*french*/"un efface-serrure labyrinthique"), + CustomMessage("a labyrinthian lock remover", /*german*/"ein verwirrender Schlossentferner", /*french*/"un efface-serrure labyrinthique"), // /*spanish*/un destructor de cerraduras laberΓ­ntica - CustomMessage("a labyrinthian lockpick", /*german*/"ein labyrinthischer Dietrich", /*french*/"un crochet Γ  porte labyrinthique")}); + CustomMessage("a labyrinthian lockpick", /*german*/"ein verwirrender Dietrich", /*french*/"un crochet Γ  porte labyrinthique")}); // /*spanish*/una apertura portentosa laberΓ­ntica - hintTextTable[RHT_GERUDO_FORTRESS_SMALL_KEY] = HintText(CustomMessage("a Gerudo Fortress Small Key", /*german*/"ein kleiner SchlΓΌssel fΓΌr die Gerudo-Festung", /*french*/"une petite clΓ© de la Repaire des Voleurs"), + hintTextTable[RHT_GERUDO_FORTRESS_SMALL_KEY] = HintText(CustomMessage("a Gerudo Fortress Small Key", /*german*/"ein kleiner SchlΓΌssel des Diebesverstecks", /*french*/"une petite clΓ© de la Repaire des Voleurs"), // /*spanish*/una llave pequeΓ±a de la Fortaleza Gerudo { CustomMessage("a small key", /*german*/"ein kleiner SchlΓΌssel", /*french*/"une petite clΓ©") // /*spanish*/una llave pequeΓ±a }, { - CustomMessage("an imprisoned tool for unlocking", /*german*/"ein gefangenes Werkzeug zur EntschlΓΌsselung", /*french*/"un anti-porte emprisonnΓ©"), + CustomMessage("an imprisoned tool for unlocking", /*german*/"ein gefangenes Werkzeug zur Entriegelung", /*french*/"un anti-porte emprisonnΓ©"), // /*spanish*/una clave de una entrada encarcelada - CustomMessage("an imprisoned dungeon pass", /*german*/"ein gefangener Dungeon-Pass", /*french*/"le rΓͺve emprisonnΓ© d'un prisonnier"), + CustomMessage("an imprisoned dungeon pass", /*german*/"ein gefangener Labyrinth-Pass", /*french*/"le rΓͺve emprisonnΓ© d'un prisonnier"), // /*spanish*/un pase de una mazmorra encarcelada CustomMessage("an imprisoned lock remover", /*german*/"ein gefangener Schlossentferner", /*french*/"un efface-serrure emprisonnΓ©"), // /*spanish*/un destructor de cerraduras encarcelada CustomMessage("an imprisoned lockpick", /*german*/"ein gefangener Dietrich", /*french*/"un crochet Γ  porte emprisonnΓ©")}); // /*spanish*/una apertura portentosa encarcelada - hintTextTable[RHT_BOTTOM_OF_THE_WELL_SMALL_KEY] = HintText(CustomMessage("a Bottom of the Well Small Key", /*german*/"ein kleiner SchlΓΌssel des Grund des Brunnens", /*french*/"une petite clΓ© du fond du Puits"), + hintTextTable[RHT_BOTTOM_OF_THE_WELL_SMALL_KEY] = HintText(CustomMessage("a Bottom of the Well Small Key", /*german*/"ein kleiner SchlΓΌssel vom Grund des Brunnens", /*french*/"une petite clΓ© du fond du Puits"), // /*spanish*/una llave pequeΓ±a del Fondo del pozo { CustomMessage("a small key", /*german*/"ein kleiner SchlΓΌssel", /*french*/"une petite clΓ©") // /*spanish*/una llave pequeΓ±a }, { - CustomMessage("a moldy tool for unlocking", /*german*/"ein schimmeliges Werkzeug zur EntschlΓΌsselung", /*french*/"un anti-porte moisi"), + CustomMessage("a moldy tool for unlocking", /*german*/"ein schimmeliges Werkzeug zur Entriegelung", /*french*/"un anti-porte moisi"), // /*spanish*/una clave de una entrada mohosa - CustomMessage("a moldy dungeon pass", /*german*/"ein schimmeliger Dungeon-Pass", /*french*/"le rΓͺve moisi d'un prisonnier"), + CustomMessage("a moldy dungeon pass", /*german*/"ein schimmeliger Labyrinth-Pass", /*french*/"le rΓͺve moisi d'un prisonnier"), // /*spanish*/un pase de una mazmorra mohosa CustomMessage("a moldy lock remover", /*german*/"ein schimmeliger Schlossentferner", /*french*/"un efface-serrure moisi"), // /*spanish*/un destructor de cerraduras mohosa CustomMessage("a moldy lockpick", /*german*/"ein schimmeliger Dietrich", /*french*/"un crochet Γ  porte moisi")}); // /*spanish*/una apertura portentosa mohosa - hintTextTable[RHT_GANONS_CASTLE_SMALL_KEY] = HintText(CustomMessage("a Ganon's Castle Small Key", /*german*/"ein kleiner SchlΓΌssel fΓΌr Ganons Schloß", /*french*/"une petite clΓ© du ChΓ’teau de Ganon"), + hintTextTable[RHT_GANONS_CASTLE_SMALL_KEY] = HintText(CustomMessage("a Ganon's Castle Small Key", /*german*/"ein kleiner SchlΓΌssel von Ganons Schloß", /*french*/"une petite clΓ© du ChΓ’teau de Ganon"), // /*spanish*/una llave pequeΓ±a del Castillo de Ganon { CustomMessage("a small key", /*german*/"ein kleiner SchlΓΌssel", /*french*/"une petite clΓ©") // /*spanish*/una llave pequeΓ±a }, { - CustomMessage("a final tool for unlocking", /*german*/"ein finales Werkzeug zur EntschlΓΌsselung", /*french*/"un anti-porte final"), + CustomMessage("a final tool for unlocking", /*german*/"ein finales Werkzeug zur Entriegelung", /*french*/"un anti-porte final"), // /*spanish*/una clave de una entrada final - CustomMessage("a final dungeon pass", /*german*/"ein finaler Dungeon-Pass", /*french*/"le rΓͺve final d'un prisonnier"), + CustomMessage("a final dungeon pass", /*german*/"ein finaler Labyrinth-Pass", /*french*/"le rΓͺve final d'un prisonnier"), // /*spanish*/un pase de una mazmorra final CustomMessage("a final lock remover", /*german*/"ein finaler Schlossentferner", /*french*/"un efface-serrure final"), // /*spanish*/un destructor de cerraduras final CustomMessage("a final lockpick", /*german*/"ein finaler Dietrich", /*french*/"un crochet Γ  porte final")}); // /*spanish*/una apertura portentosa final - hintTextTable[RHT_OVERWORLD_KEY] = HintText(CustomMessage("an Overworld Key", /*german*/"ein Überwelt-SchlΓΌssel", /*french*/"une clΓ© de l'Overworld"), + + hintTextTable[RHT_OVERWORLD_KEY] = HintText(CustomMessage("an Overworld Key", /*german*/"ein SchlΓΌssel der Oberwelt", /*french*/"une clΓ© de l'Overworld"), // /*spanish*/una llave del mundo exterior { CustomMessage("a small key", /*german*/"ein kleiner SchlΓΌssel", /*french*/"une petite clΓ©") @@ -1374,170 +1375,171 @@ void StaticData::HintTable_Init_Item() { // /*spanish*/una llave al reino CustomMessage("a key to the universe", /*german*/"ein SchlΓΌssel zum Universum", /*french*/"une clΓ© de l'univers")}); // /*spanish*/una llave al universo - hintTextTable[RHT_FOREST_TEMPLE_KEY_RING] = HintText(CustomMessage("a Forest Temple Key Ring", /*german*/"ein SchlΓΌsselbund des Waldtempels", /*french*/"un trousseau de clΓ©s du Temple de la ForΓͺt"), + + hintTextTable[RHT_FOREST_TEMPLE_KEY_RING] = HintText(CustomMessage("a Forest Temple Key Ring", /*german*/"das SchlΓΌsselbund des Waldtempels", /*french*/"un trousseau de clΓ©s du Temple de la ForΓͺt"), // /*spanish*/un llavero del Templo del Bosque { CustomMessage("a key ring", /*german*/"ein SchlΓΌsselbund", /*french*/"un trousseau de clΓ©s") // /*spanish*/un llavero }, { - CustomMessage("a sylvan toolbox for unlocking", /*german*/"eine waldige Werkzeugkiste zur EntschlΓΌsselung", /*french*/"des anti-portes sylvestres"), + CustomMessage("a sylvan toolbox for unlocking", /*german*/"eine waldige Werkzeugkiste zur Entriegelung", /*french*/"des anti-portes sylvestres"), // /*spanish*/un conjunto silvestre de cerrajero - CustomMessage("a sylvan dungeon season pass", /*german*/"ein waldiger Dungeon-Season-Pass", /*french*/"les rΓͺves sylvestres d'un prisonnier"), + CustomMessage("a sylvan dungeon season pass", /*german*/"ein waldiger Labyrinth-Season-Pass", /*french*/"les rΓͺves sylvestres d'un prisonnier"), // /*spanish*/un pase vip de mazmorras silvestre CustomMessage("a sylvan jingling ring", /*german*/"ein waldiger MultifunktionsschlΓΌssel", /*french*/"des efface-serrures sylvestres"), // /*spanish*/una cadena multiusos silvestre CustomMessage("a sylvan skeleton key", /*german*/"ein waldiger SkelettschlΓΌssel", /*french*/"des crochets Γ  porte sylvestres")}); // /*spanish*/un anillo silvestre contra cerrojos - hintTextTable[RHT_FIRE_TEMPLE_KEY_RING] = HintText(CustomMessage("a Fire Temple Key Ring", /*german*/"ein SchlΓΌsselbund des Feuertempels", /*french*/"un trousseau de clΓ©s du Temple du Feu"), + hintTextTable[RHT_FIRE_TEMPLE_KEY_RING] = HintText(CustomMessage("a Fire Temple Key Ring", /*german*/"das SchlΓΌsselbund des Feuertempels", /*french*/"un trousseau de clΓ©s du Temple du Feu"), // /*spanish*/un llavero del Templo del Fuego { CustomMessage("a key ring", /*german*/"ein SchlΓΌsselbund", /*french*/"un trousseau de clΓ©s") // /*spanish*/un llavero }, { - CustomMessage("a molten toolbox for unlocking", /*german*/"eine geschmolzene Werkzeugkiste zur EntschlΓΌsselung", /*french*/"des anti-portes fondus"), + CustomMessage("a molten toolbox for unlocking", /*german*/"eine geschmolzene Werkzeugkiste zur Entriegelung", /*french*/"des anti-portes fondus"), // /*spanish*/un conjunto fundido de cerrajero - CustomMessage("a molten dungeon season pass", /*german*/"ein geschmolzener Dungeon-Season-Pass", /*french*/"les rΓͺves fondus d'un prisonnier"), + CustomMessage("a molten dungeon season pass", /*german*/"ein geschmolzener Labyrinth-Season-Pass", /*french*/"les rΓͺves fondus d'un prisonnier"), // /*spanish*/un pase vip de mazmorras fundido CustomMessage("a molten jingling ring", /*german*/"ein geschmolzener MultifunktionsschlΓΌssel", /*french*/"des efface-serrures fondus"), // /*spanish*/una cadena multiusos fundida CustomMessage("a molten skeleton key", /*german*/"ein geschmolzener SkelettschlΓΌssel", /*french*/"des crochets Γ  porte fondus")}); // /*spanish*/un anillo fundido contra cerrojos - hintTextTable[RHT_WATER_TEMPLE_KEY_RING] = HintText(CustomMessage("a Water Temple Key Ring", /*german*/"ein SchlΓΌsselbund des Wassertempels", /*french*/"un trousseau de clΓ©s du Temple de l'Eau"), + hintTextTable[RHT_WATER_TEMPLE_KEY_RING] = HintText(CustomMessage("a Water Temple Key Ring", /*german*/"das SchlΓΌsselbund des Wassertempels", /*french*/"un trousseau de clΓ©s du Temple de l'Eau"), // /*spanish*/un llavero del Templo del Agua { CustomMessage("a key ring", /*german*/"ein SchlΓΌsselbund", /*french*/"un trousseau de clΓ©s") // /*spanish*/un llavero }, { - CustomMessage("a wet toolbox for unlocking", /*german*/"eine nasse Werkzeugkiste zur EntschlΓΌsselung", /*french*/"des anti-portes humides"), + CustomMessage("a wet toolbox for unlocking", /*german*/"eine nasse Werkzeugkiste zur Entriegelung", /*french*/"des anti-portes humides"), // /*spanish*/un conjunto abisal de cerrajero - CustomMessage("a wet dungeon season pass", /*german*/"ein nasser Dungeon-Season-Pass", /*french*/"les rΓͺves humides d'un prisonnier"), + CustomMessage("a wet dungeon season pass", /*german*/"ein nasser Labyrinth-Season-Pass", /*french*/"les rΓͺves humides d'un prisonnier"), // /*spanish*/un pase vip de mazmorras abisal CustomMessage("a wet jingling ring", /*german*/"ein nasser MultifunktionsschlΓΌssel", /*french*/"des efface-serrures humides"), // /*spanish*/una cadena multiusos abisal CustomMessage("a wet skeleton key", /*german*/"ein nasser SkelettschlΓΌssel", /*french*/"des crochets Γ  porte humides")}); // /*spanish*/un anillo abisal contra cerrojos - hintTextTable[RHT_SPIRIT_TEMPLE_KEY_RING] = HintText(CustomMessage("a Spirit Temple Key Ring", /*german*/"ein SchlΓΌsselbund des Geistertempels", /*french*/"un trousseau de clΓ©s du Temple de l'Esprit"), + hintTextTable[RHT_SPIRIT_TEMPLE_KEY_RING] = HintText(CustomMessage("a Spirit Temple Key Ring", /*german*/"das SchlΓΌsselbund des Geistertempels", /*french*/"un trousseau de clΓ©s du Temple de l'Esprit"), // /*spanish*/un llavero del Templo del EspΓ­ritu { CustomMessage("a key ring", /*german*/"ein SchlΓΌsselbund", /*french*/"un trousseau de clΓ©s") // /*spanish*/un llavero }, { - CustomMessage("a sandy toolbox for unlocking", /*german*/"eine sandige Werkzeugkiste zur EntschlΓΌsselung", /*french*/"des anti-portes sableux"), + CustomMessage("a sandy toolbox for unlocking", /*german*/"eine sandige Werkzeugkiste zur Entriegelung", /*french*/"des anti-portes sableux"), // /*spanish*/un conjunto arenoso de cerrajero - CustomMessage("a sandy dungeon season pass", /*german*/"ein sandiger Dungeon-Season-Pass", /*french*/"les rΓͺves sableux d'un prisonnier"), + CustomMessage("a sandy dungeon season pass", /*german*/"ein sandiger Labyrinth-Season-Pass", /*french*/"les rΓͺves sableux d'un prisonnier"), // /*spanish*/un pase vip de mazmorras arenoso CustomMessage("a sandy jingling ring", /*german*/"ein sandiger MultifunktionsschlΓΌssel", /*french*/"des efface-serrures sableux"), // /*spanish*/una cadena multiusos arenosa CustomMessage("a sandy skeleton key", /*german*/"ein sandiger SkelettschlΓΌssel", /*french*/"des crochets Γ  porte sableux")}); // /*spanish*/un anillo arenoso contra cerrojos - hintTextTable[RHT_SHADOW_TEMPLE_KEY_RING] = HintText(CustomMessage("a Shadow Temple Key Ring", /*german*/"ein SchlΓΌsselbund des Schattentempels", /*french*/"un trousseau de clΓ©s du Temple de l'Ombre"), + hintTextTable[RHT_SHADOW_TEMPLE_KEY_RING] = HintText(CustomMessage("a Shadow Temple Key Ring", /*german*/"das SchlΓΌsselbund des Schattentempels", /*french*/"un trousseau de clΓ©s du Temple de l'Ombre"), // /*spanish*/un llavero del Templo de las Sombras { CustomMessage("a key ring", /*german*/"ein SchlΓΌsselbund", /*french*/"un trousseau de clΓ©s") // /*spanish*/un llavero }, { - CustomMessage("a creepy toolbox for unlocking", /*german*/"eine gruselige Werkzeugkiste zur EntschlΓΌsselung", /*french*/"des anti-portes sinistres"), + CustomMessage("a creepy toolbox for unlocking", /*german*/"eine gruselige Werkzeugkiste zur Entriegelung", /*french*/"des anti-portes sinistres"), // /*spanish*/un conjunto tenebroso de cerrajero - CustomMessage("a creepy dungeon season pass", /*german*/"ein gruseliger Dungeon-Season-Pass", /*french*/"les rΓͺves sinistres d'un prisonnier"), + CustomMessage("a creepy dungeon season pass", /*german*/"ein gruseliger Labyrinth-Season-Pass", /*french*/"les rΓͺves sinistres d'un prisonnier"), // /*spanish*/un pase vip de mazmorras tenebroso CustomMessage("a creepy jingling ring", /*german*/"ein gruseliger MultifunktionsschlΓΌssel", /*french*/"des efface-serrures sinistres"), // /*spanish*/una cadena multiusos tenebrosa CustomMessage("a creepy skeleton key", /*german*/"ein gruseliger SkelettschlΓΌssel", /*french*/"des crochets Γ  porte sinistres")}); // /*spanish*/un anillo tenebroso contra cerrojos - hintTextTable[RHT_GERUDO_TRAINING_GROUND_KEY_RING] = HintText(CustomMessage("a Gerudo Training Ground Key Ring", /*german*/"ein SchlΓΌsselbund des Gerudo-TrainingsgelΓ€ndes", /*french*/"un trousseau de clΓ©s du Gymnase Gerudo"), + hintTextTable[RHT_GERUDO_TRAINING_GROUND_KEY_RING] = HintText(CustomMessage("a Gerudo Training Ground Key Ring", /*german*/"das SchlΓΌsselbund der Gerudo-Trainingsarena", /*french*/"un trousseau de clΓ©s du Gymnase Gerudo"), // /*spanish*/un llavero del Centro de InstrucciΓ³n Gerudo { CustomMessage("a key ring", /*german*/"ein SchlΓΌsselbund", /*french*/"un trousseau de clΓ©s") // /*spanish*/un llavero }, { - CustomMessage("a labyrinthian toolbox for unlocking", /*german*/"eine labyrinthische Werkzeugkiste zur EntschlΓΌsselung", /*french*/"des anti-portes labyrinthiques"), + CustomMessage("a labyrinthian toolbox for unlocking", /*german*/"eine verwirrende Werkzeugkiste zur Entriegelung", /*french*/"des anti-portes labyrinthiques"), // /*spanish*/un conjunto laberΓ­ntico de cerrajero - CustomMessage("a labyrinthian dungeon season pass", /*german*/"ein labyrinthischer Dungeon-Season-Pass", /*french*/"les rΓͺves labyrinthiques d'un prisonnier"), + CustomMessage("a labyrinthian dungeon season pass", /*german*/"ein verwirrender Labyrinth-Season-Pass", /*french*/"les rΓͺves labyrinthiques d'un prisonnier"), // /*spanish*/un pase vip de mazmorras laberΓ­ntico - CustomMessage("a labyrinthian jingling ring", /*german*/"ein labyrinthischer MultifunktionsschlΓΌssel", /*french*/"des efface-serrures labyrinthiques"), + CustomMessage("a labyrinthian jingling ring", /*german*/"ein verwirrender MultifunktionsschlΓΌssel", /*french*/"des efface-serrures labyrinthiques"), // /*spanish*/una cadena multiusos laberΓ­ntica - CustomMessage("a labyrinthian skeleton key", /*german*/"ein labyrinthischer SkelettschlΓΌssel", /*french*/"des crochets Γ  porte labyrinthiques")}); + CustomMessage("a labyrinthian skeleton key", /*german*/"ein verwirrender SkelettschlΓΌssel", /*french*/"des crochets Γ  porte labyrinthiques")}); // /*spanish*/un anillo laberΓ­ntico contra cerrojos - hintTextTable[RHT_GERUDO_FORTRESS_KEY_RING] = HintText(CustomMessage("a Gerudo Fortress Key Ring", /*german*/"ein SchlΓΌsselbund der Gerudo-Festung", /*french*/"un trousseau de clΓ©s de la Repaire des Voleurs"), + hintTextTable[RHT_GERUDO_FORTRESS_KEY_RING] = HintText(CustomMessage("a Gerudo Fortress Key Ring", /*german*/"das SchlΓΌsselbund des Diebesverstecks", /*french*/"un trousseau de clΓ©s de la Repaire des Voleurs"), // /*spanish*/un llavero de la Fortaleza Gerudo { CustomMessage("a key ring", /*german*/"ein SchlΓΌsselbund", /*french*/"un trousseau de clΓ©s") // /*spanish*/un llavero }, { - CustomMessage("an imprisoned toolbox for unlocking", /*german*/"eine gefangene Werkzeugkiste zur EntschlΓΌsselung", /*french*/"des anti-portes emprisonnΓ©s"), + CustomMessage("an imprisoned toolbox for unlocking", /*german*/"eine gefangene Werkzeugkiste zur Entriegelung", /*french*/"des anti-portes emprisonnΓ©s"), // /*spanish*/un conjunto enjaulado de cerrajero - CustomMessage("an imprisoned dungeon season pass", /*german*/"ein gefangener Dungeon-Season-Pass", /*french*/"les rΓͺves emprisonnΓ©s d'un prisonnier"), + CustomMessage("an imprisoned dungeon season pass", /*german*/"ein gefangener Labyrinth-Season-Pass", /*french*/"les rΓͺves emprisonnΓ©s d'un prisonnier"), // /*spanish*/un pase vip de una mazmorra enjaulado CustomMessage("an imprisoned jingling ring", /*german*/"ein gefangener MultifunktionsschlΓΌssel", /*french*/"des efface-serrures emprisonnΓ©s"), // /*spanish*/una cadena multiusos enjaulada CustomMessage("an imprisoned skeleton key", /*german*/"ein gefangener SkelettschlΓΌssel", /*french*/"des crochets Γ  porte emprisonnΓ©s")}); // /*spanish*/un anillo enjaulado contra cerrojos - hintTextTable[RHT_BOTTOM_OF_THE_WELL_KEY_RING] = HintText(CustomMessage("a Bottom of the Well Key Ring", /*german*/"ein SchlΓΌsselbund des Grund des Brunnens", /*french*/"un trousseau de clΓ©s du fond du Puits"), + hintTextTable[RHT_BOTTOM_OF_THE_WELL_KEY_RING] = HintText(CustomMessage("a Bottom of the Well Key Ring", /*german*/"das SchlΓΌsselbund vom Grund des Brunnens", /*french*/"un trousseau de clΓ©s du fond du Puits"), // /*spanish*/un llavero del Fondo del pozo { CustomMessage("a key ring", /*german*/"ein SchlΓΌsselbund", /*french*/"un trousseau de clΓ©s") // /*spanish*/un llavero }, { - CustomMessage("a moldy toolbox for unlocking", /*german*/"eine schimmelige Werkzeugkiste zur EntschlΓΌsselung", /*french*/"des anti-portes moisis"), + CustomMessage("a moldy toolbox for unlocking", /*german*/"eine schimmelige Werkzeugkiste zur Entriegelung", /*french*/"des anti-portes moisis"), // /*spanish*/un conjunto subterrΓ‘neo de cerrajero - CustomMessage("a moldy dungeon season pass", /*german*/"ein schimmeliger Dungeon-Season-Pass", /*french*/"les rΓͺves moisis d'un prisonnier"), + CustomMessage("a moldy dungeon season pass", /*german*/"ein schimmeliger Labyrinth-Season-Pass", /*french*/"les rΓͺves moisis d'un prisonnier"), // /*spanish*/un pase vip de una mazmorra subterrΓ‘neo CustomMessage("a moldy jingling ring", /*german*/"ein schimmeliger MultifunktionsschlΓΌssel", /*french*/"des efface-serrures moisis"), // /*spanish*/una cadena multiusos subterrΓ‘nea CustomMessage("a moldy skeleton key", /*german*/"ein schimmeliger SkelettschlΓΌssel", /*french*/"des crochets Γ  porte moisis")}); // /*spanish*/un anillo subterrΓ‘neo contra cerrojos - hintTextTable[RHT_GANONS_CASTLE_KEY_RING] = HintText(CustomMessage("a Ganon's Castle Key Ring", /*german*/"ein SchlΓΌsselbund von Ganons Schloß", /*french*/"un trousseau de clΓ©s du ChΓ’teau de Ganon"), + hintTextTable[RHT_GANONS_CASTLE_KEY_RING] = HintText(CustomMessage("a Ganon's Castle Key Ring", /*german*/"das SchlΓΌsselbund von Ganons Schloß", /*french*/"un trousseau de clΓ©s du ChΓ’teau de Ganon"), // /*spanish*/un llavero del Castillo de Ganon { CustomMessage("a key ring", /*german*/"ein SchlΓΌsselbund", /*french*/"un trousseau de clΓ©s") // /*spanish*/un llavero }, { - CustomMessage("a final toolbox for unlocking", /*german*/"eine finale Werkzeugkiste zur EntschlΓΌsselung", /*french*/"des anti-portes finaux"), + CustomMessage("a final toolbox for unlocking", /*german*/"eine finale Werkzeugkiste zur Entriegelung", /*french*/"des anti-portes finaux"), // /*spanish*/un conjunto decisivo de cerrajero - CustomMessage("a final dungeon season pass", /*german*/"ein finaler Dungeon-Season-Pass", /*french*/"les rΓͺves finaux d'un prisonnier"), + CustomMessage("a final dungeon season pass", /*german*/"ein finaler Labyrinth-Season-Pass", /*french*/"les rΓͺves finaux d'un prisonnier"), // /*spanish*/un pase vip de una mazmorra decisivo CustomMessage("a final jingling ring", /*german*/"ein finaler MultifunktionsschlΓΌssel", /*french*/"des efface-serrures finaux"), // /*spanish*/una cadena multiusos decisiva CustomMessage("a final skeleton key", /*german*/"ein finaler SkelettschlΓΌssel", /*french*/"des crochets Γ  porte finaux")}); // /*spanish*/un anillo decisivo multiusos - hintTextTable[RHT_TREASURE_GAME_SMALL_KEY] = HintText(CustomMessage("a Treasure Chest Shop Small Key", /*german*/"ein kleiner SchlΓΌssel des Schatztruhenladens", /*french*/"une petite clΓ© de la chasse aux trΓ©sors"), + hintTextTable[RHT_TREASURE_GAME_SMALL_KEY] = HintText(CustomMessage("a Treasure Chest Shop Small Key", /*german*/"ein kleiner SchlΓΌssel der Truhenlotterie", /*french*/"une petite clΓ© de la chasse aux trΓ©sors"), // /*spanish*/una llave pequeΓ±a del Cofre del Tesoro { CustomMessage("a small key", /*german*/"ein kleiner SchlΓΌssel", /*french*/"une petite clΓ©") // /*spanish*/una llave pequeΓ±a }, { - CustomMessage("a gambler's tool for unlocking", /*german*/"ein Spieler-Werkzeug zur EntschlΓΌsselung", /*french*/"un anti-porte de parieur"), + CustomMessage("a gambler's tool for unlocking", /*german*/"ein Zocker-Werkzeug zur Entriegelung", /*french*/"un anti-porte de parieur"), // /*spanish*/una clave de un juego de azar - CustomMessage("a gambler's dungeon pass", /*german*/"ein Spieler-Dungeon-Pass", /*french*/"le rΓͺve d'un prisonnier parieur"), + CustomMessage("a gambler's dungeon pass", /*german*/"ein Zocker-Labyrinth-Pass", /*french*/"le rΓͺve d'un prisonnier parieur"), // /*spanish*/un pase de un juego de azar - CustomMessage("a gambler's lock remover", /*german*/"ein Spieler-Schlossentferner", /*french*/"un efface-serrure de parieur"), + CustomMessage("a gambler's lock remover", /*german*/"ein Zocker-Schlossentferner", /*french*/"un efface-serrure de parieur"), // /*spanish*/un destructor de cerraduras del juego de azar - CustomMessage("a gambler's lockpick", /*german*/"ein Spieler-Dietrich", /*french*/"un crochet Γ  serrure de parieur")}); + CustomMessage("a gambler's lockpick", /*german*/"ein Zocker-Dietrich", /*french*/"un crochet Γ  serrure de parieur")}); // /*spanish*/una apertura portentosa del juego de azar - hintTextTable[RHT_TREASURE_GAME_KEY_RING] = HintText(CustomMessage("a Chest Game Key Ring"), + hintTextTable[RHT_TREASURE_GAME_KEY_RING] = HintText(CustomMessage("a Chest Game Key Ring", /*german*/ "das SchlΓΌsselbund der Truhenlotterie", /*french*/ "TRANSLATE THIS"), { CustomMessage("a key ring", /*german*/"ein SchlΓΌsselbund", /*french*/"un trousseau de clΓ©s") // /*spanish*/un llavero }, { - CustomMessage("a gambler's toolbox for unlocking"), - CustomMessage("a gambler's season pass"), - CustomMessage("a gambler's jingling ring"), - CustomMessage("a gambler's skeleton key")}); + CustomMessage("a gambler's toolbox for unlocking", /*german*/ "eine Zocker-Werkzeugkiste zur Entriegelung", /*french*/ "TRANSLATE THIS"), + CustomMessage("a gambler's season pass", /*german*/ "ein Zocker-Labyrinth-Season-Pass", /*french*/ "TRANSLATE THIS"), + CustomMessage("a gambler's jingling ring", /*german*/ "ein Zocker-MultifunktionsschlΓΌssel", /*french*/ "TRANSLATE THIS"), + CustomMessage("a gambler's skeleton key", /*german*/ "ein Zocker-SkelettschlΓΌssel", /*french*/ "TRANSLATE THIS")}); hintTextTable[RHT_KOKIRI_EMERALD] = HintText(CustomMessage("the Kokiri Emerald", /*german*/"der Kokiri-Smaragd", /*french*/"l'Γ‰meraude Kokiri"), // /*spanish*/la Esmeralda de los Kokiri { - CustomMessage("a spiritual stone", /*german*/"ein spiritueller Stein", /*french*/"une Pierre Ancestrale") + CustomMessage("a spiritual stone", /*german*/"ein Heiliger Stein", /*french*/"une Pierre Ancestrale") // /*spanish*/una piedra espiritual }, { CustomMessage("a green stone", /*german*/"ein grΓΌner Stein", /*french*/"une pierre verte"), @@ -1548,18 +1550,18 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_GORON_RUBY] = HintText(CustomMessage("the Goron Ruby", /*german*/"der Goronen-Rubin", /*french*/"le Rubis Goron"), // /*spanish*/el RubΓ­ de los Goron { - CustomMessage("a spiritual stone", /*german*/"ein spiritueller Stein", /*french*/"une Pierre Ancestrale") + CustomMessage("a spiritual stone", /*german*/"ein Heiliger Stein", /*french*/"une Pierre Ancestrale") // /*spanish*/una piedra espiritual }, { CustomMessage("a red stone", /*german*/"ein roter Stein", /*french*/"une pierre rouge"), // /*spanish*/una piedra carmΓ­n - CustomMessage("sworn brotherhood", /*german*/"verschworene Bruderschaft", /*french*/"un serment de fraternitΓ©")}); + CustomMessage("sworn brotherhood", /*german*/"die geschworene Bruderschaft", /*french*/"un serment de fraternitΓ©")}); // /*spanish*/el juramento de hermanos de sangre hintTextTable[RHT_ZORA_SAPPHIRE] = HintText(CustomMessage("the Zora Sapphire", /*german*/"der Zora-Saphir", /*french*/"le Saphir Zora"), // /*spanish*/el Zafiro de los Zora { - CustomMessage("a spiritual stone", /*german*/"ein spiritueller Stein", /*french*/"une Pierre Ancestrale") + CustomMessage("a spiritual stone", /*german*/"ein Heiliger Stein", /*french*/"une Pierre Ancestrale") // /*spanish*/una piedra espiritual }, { CustomMessage("a blue stone", /*german*/"ein blauer Stein", /*french*/"une pierre bleue"), @@ -1567,7 +1569,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("an engagement gift", /*german*/"ein Verlobungsgeschenk", /*french*/"un cadeau de mariage")}); // /*spanish*/un regalo de compromiso - hintTextTable[RHT_FOREST_MEDALLION] = HintText(CustomMessage("the Forest Medallion", /*german*/"Amulett des Waldes", /*french*/"le MΓ©daillon de la ForΓͺt"), + hintTextTable[RHT_FOREST_MEDALLION] = HintText(CustomMessage("the Forest Medallion", /*german*/"das Amulett des Waldes", /*french*/"le MΓ©daillon de la ForΓͺt"), // /*spanish*/el MedallΓ³n del Bosque { CustomMessage("a medallion", /*german*/"ein Amulett", /*french*/"un mΓ©daillon") @@ -1578,7 +1580,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("Saria's friendship", /*german*/"Salias Freundschaft", /*french*/"l'amitiΓ© de Saria")}); // /*spanish*/la amistad de Saria - hintTextTable[RHT_FIRE_MEDALLION] = HintText(CustomMessage("the Fire Medallion", /*german*/"Amulett des Feuers", /*french*/"le MΓ©daillon du Feu"), + hintTextTable[RHT_FIRE_MEDALLION] = HintText(CustomMessage("the Fire Medallion", /*german*/"das Amulett des Feuers", /*french*/"le MΓ©daillon du Feu"), // /*spanish*/el MedallΓ³n del Fuego { CustomMessage("a medallion", /*german*/"ein Amulett", /*french*/"un mΓ©daillon") @@ -1589,7 +1591,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("Darunia's power", /*german*/"Darunias Kraft", /*french*/"la fraternitΓ© de Darunia")}); // /*spanish*/la fraternidad de Darunia - hintTextTable[RHT_WATER_MEDALLION] = HintText(CustomMessage("the Water Medallion", /*german*/"Amulett des Wassers", /*french*/"le MΓ©daillon de l'Eau"), + hintTextTable[RHT_WATER_MEDALLION] = HintText(CustomMessage("the Water Medallion", /*german*/"das Amulett des Wassers", /*french*/"le MΓ©daillon de l'Eau"), // /*spanish*/el MedallΓ³n del Agua { CustomMessage("a medallion", /*german*/"ein Amulett", /*french*/"un mΓ©daillon") @@ -1597,21 +1599,21 @@ void StaticData::HintTable_Init_Item() { }, { CustomMessage("a blue coin", /*german*/"eine blaue MΓΌnze", /*french*/"une piΓ¨ce bleue"), // /*spanish*/una moneda zafiro - CustomMessage("Ruto's power", /*german*/"Rutos Macht", /*french*/"l'amour de Ruto")}); + CustomMessage("Ruto's power", /*german*/"Rutos Liebe", /*french*/"l'amour de Ruto")}); // /*spanish*/el amor de Ruto - hintTextTable[RHT_SPIRIT_MEDALLION] = HintText(CustomMessage("the Spirit Medallion", /*german*/"Amulett der Geister", /*french*/"le MΓ©daillon de l'Esprit"), + hintTextTable[RHT_SPIRIT_MEDALLION] = HintText(CustomMessage("the Spirit Medallion", /*german*/"das Amulett der Geister", /*french*/"le MΓ©daillon de l'Esprit"), // /*spanish*/el MedallΓ³n del EspΓ­ritu { CustomMessage("a medallion", /*german*/"ein Amulett", /*french*/"un mΓ©daillon") // /*spanish*/un medallΓ³n }, { - CustomMessage("an orange coin", /*german*/"eine orange MΓΌnze", /*french*/"une piΓ¨ce orange"), + CustomMessage("an orange coin", /*german*/"eine orangene MΓΌnze", /*french*/"une piΓ¨ce orange"), // /*spanish*/una moneda Γ‘mbar - CustomMessage("Nabooru's power", /*german*/"Naborus Macht", /*french*/"le respect de Nabooru")}); + CustomMessage("Nabooru's power", /*german*/"Naborus Respekt", /*french*/"le respect de Nabooru")}); // /*spanish*/el respeto de Nabooru - hintTextTable[RHT_SHADOW_MEDALLION] = HintText(CustomMessage("the Shadow Medallion", /*german*/"Amulett des Schattens", /*french*/"le MΓ©daillon de l'Ombre"), + hintTextTable[RHT_SHADOW_MEDALLION] = HintText(CustomMessage("the Shadow Medallion", /*german*/"das Amulett des Schattens", /*french*/"le MΓ©daillon de l'Ombre"), // /*spanish*/el MedallΓ³n de la Sombra { CustomMessage("a medallion", /*german*/"ein Amulett", /*french*/"un mΓ©daillon") @@ -1619,10 +1621,10 @@ void StaticData::HintTable_Init_Item() { }, { CustomMessage("a purple coin", /*german*/"eine violette MΓΌnze", /*french*/"une piΓ¨ce pourpre"), // /*spanish*/una moneda malva - CustomMessage("Impa's power", /*german*/"Impas Macht", /*french*/"la confiance d'Impa")}); + CustomMessage("Impa's power", /*german*/"Impas Vertrauen", /*french*/"la confiance d'Impa")}); // /*spanish*/la confianza de Impa - hintTextTable[RHT_LIGHT_MEDALLION] = HintText(CustomMessage("the Light Medallion", /*german*/"Amulett des Lichts", /*french*/"le MΓ©daillon de la LumiΓ¨re"), + hintTextTable[RHT_LIGHT_MEDALLION] = HintText(CustomMessage("the Light Medallion", /*german*/"das Amulett des Lichts", /*french*/"le MΓ©daillon de la LumiΓ¨re"), // /*spanish*/el MedallΓ³n de la Luz { CustomMessage("a medallion", /*german*/"ein Amulett", /*french*/"un mΓ©daillon") @@ -1630,7 +1632,7 @@ void StaticData::HintTable_Init_Item() { }, { CustomMessage("a yellow coin", /*german*/"eine gelbe MΓΌnze", /*french*/"une piΓ¨ce jaune"), // /*spanish*/una moneda resplandeciente - CustomMessage("Rauru's power", /*german*/"Raurus Macht", /*french*/"la foi de Rauru")}); + CustomMessage("Rauru's power", /*german*/"Raurus Glaube", /*french*/"la foi de Rauru")}); // /*spanish*/la fe de Rauru hintTextTable[RHT_RECOVERY_HEART] = HintText(CustomMessage("a Recovery Heart", /*german*/"ein Herz", /*french*/"un coeur de vie"), @@ -1649,7 +1651,7 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_GREEN_RUPEE] = HintText(CustomMessage("a Green Rupee", /*german*/"ein grΓΌner Rubin", /*french*/"un rubis vert"), // /*spanish*/una rupia verde { - CustomMessage("some rupees", /*german*/"einige Rubine", /*french*/"une quantitΓ© de rubis") + CustomMessage("some rupees", /*german*/"einige Rubine€", /*french*/"une quantitΓ© de rubis") // /*spanish*/una cantidad de rupias }, { CustomMessage("a unique coin", /*german*/"eine einzigartige MΓΌnze", /*french*/"un rubis bien mΓ©ritΓ©"), @@ -1673,7 +1675,7 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_BLUE_RUPEE] = HintText(CustomMessage("a Blue Rupee", /*german*/"ein blauer Rubin", /*french*/"un rubis bleu"), // /*spanish*/una rupia azul { - CustomMessage("some rupees", /*german*/"einige Rubine", /*french*/"une quantitΓ© de rubis") + CustomMessage("some rupees", /*german*/"einige Rubine€", /*french*/"une quantitΓ© de rubis") // /*spanish*/una cantidad de rupias }, { CustomMessage("a common coin", /*german*/"eine gewΓΆhnliche MΓΌnze", /*french*/"quelques sous"), @@ -1684,7 +1686,7 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_RED_RUPEE] = HintText(CustomMessage("a Red Rupee", /*german*/"ein roter Rubin", /*french*/"un rubis rouge"), // /*spanish*/una rupia roja { - CustomMessage("some rupees", /*german*/"einige Rubine", /*french*/"une quantitΓ© de rubis") + CustomMessage("some rupees", /*german*/"einige Rubine€", /*french*/"une quantitΓ© de rubis") // /*spanish*/una cantidad de rupias }, { CustomMessage("couch cash", /*german*/"ein wenig Zaster", /*french*/"un peu de fric"), @@ -1695,7 +1697,7 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_PURPLE_RUPEE] = HintText(CustomMessage("a Purple Rupee", /*german*/"ein violetter Rubin", /*french*/"un rubis pourpre"), // /*spanish*/una rupia morada { - CustomMessage("some rupees", /*german*/"einige Rubine", /*french*/"une quantitΓ© de rubis") + CustomMessage("some rupees", /*german*/"einige Rubine€", /*french*/"une quantitΓ© de rubis") // /*spanish*/una cantidad de rupias }, { CustomMessage("big bucks", /*german*/"ordentlich Zaster", /*french*/"plein de fric"), @@ -1705,19 +1707,19 @@ void StaticData::HintTable_Init_Item() { CustomMessage("wealth", /*german*/"Wohlstand", /*french*/"la richesse")}); // /*spanish*/una buena riqueza - hintTextTable[RHT_HUGE_RUPEE] = HintText(CustomMessage("a Huge Rupee", /*german*/"ein riesiger Rubin", /*french*/"un Γ©norme rubis"), + hintTextTable[RHT_HUGE_RUPEE] = HintText(CustomMessage("a Huge Rupee", /*german*/"ein goldener Rubin", /*french*/"un Γ©norme rubis"), // /*spanish*/una rupia gigante { - CustomMessage("some rupees", /*german*/"einige Rubine", /*french*/"une quantitΓ© de rubis") + CustomMessage("some rupees", /*german*/"einige Rubine€", /*french*/"une quantitΓ© de rubis") // /*spanish*/una cantidad de rupias }, { CustomMessage("a juicy jackpot", /*german*/"ein saftiger Jackpot", /*french*/"le jackpot"), // /*spanish*/el premio gordo - CustomMessage("a yellow gem", /*german*/"ein gelber Edelstein", /*french*/"un joyau dorΓ©"), + CustomMessage("a yellow gem", /*german*/"ein goldener Edelstein", /*french*/"un joyau dorΓ©"), // /*spanish*/una gema amarilla CustomMessage("a giant gem", /*german*/"ein riesiger Edelstein", /*french*/"un gros joyau"), // /*spanish*/una gema descomunal - CustomMessage("great wealth", /*german*/"großer Wohlstand", /*french*/"l'aisance financiΓ¨re")}); + CustomMessage("great wealth", /*german*/"Reichtum", /*french*/"l'aisance financiΓ¨re")}); // /*spanish*/dinero a caudales hintTextTable[RHT_PIECE_OF_HEART] = HintText(CustomMessage("a Piece of Heart", /*german*/"ein Herzteil", /*french*/"un Quart de Coeur"), @@ -1749,170 +1751,170 @@ void StaticData::HintTable_Init_Item() { { CustomMessage("a Great Fairy's power", /*german*/"eine Kraft einer großen Fee", /*french*/"le pouvoir d'une grande fΓ©e"), // /*spanish*/el poder de una Gran Hada - CustomMessage("a magic arrow", /*german*/"ein magischer Pfeil", /*french*/"une flΓ¨che magique"), + CustomMessage("a magic arrow", /*german*/"magische Pfeile€", /*french*/"une flΓ¨che magique"), // /*spanish*/una flecha mΓ‘gica CustomMessage("a medallion", /*german*/"ein Amulett", /*french*/"un mΓ©daillon"), // /*spanish*/un medallΓ³n - CustomMessage("a spiritual stone", /*german*/"ein spiritueller Stein", /*french*/"une Pierre Ancestrale"), + CustomMessage("a spiritual stone", /*german*/"ein Heiliger Stein", /*french*/"une Pierre Ancestrale"), // /*spanish*/una piedra espiritual - CustomMessage("something that can stun", /*german*/"etwas, das paralysieren kann", /*french*/"une chose qui peut paralyser") + CustomMessage("something that can stun", /*german*/"etwas zum BetΓ€uben", /*french*/"une chose qui peut paralyser") // /*spanish*/algo que pueda paralizar }, { - CustomMessage("a gift from Ganon", /*german*/"ein Geschenk von Ganon", /*french*/"un cadeau de Ganon"), + CustomMessage("a gift from Ganon", /*german*/"ein Geschenk Ganons", /*french*/"un cadeau de Ganon"), // /*spanish*/un regalo de Ganon - CustomMessage("a chilling discovery", /*german*/"eine frΓΆstelnde Entdeckung", /*french*/"une frissonante dΓ©couverte"), + CustomMessage("a chilling discovery", /*german*/"eine kΓΌhle Entdeckung", /*french*/"une frissonante dΓ©couverte"), // /*spanish*/un escalofriante hallazgo CustomMessage("frosty fun", /*german*/"frostiger Spaß", /*french*/"une engelure")}); // /*spanish*/una gΓ©lida diversiΓ³n - hintTextTable[RHT_BOMBS_5] = HintText(CustomMessage("Bombs (5 pieces)", /*german*/"Bomben (5 StΓΌck)", /*french*/"une demi-dizaine de bombes"), + hintTextTable[RHT_BOMBS_5] = HintText(CustomMessage("Bombs (5 pieces)", /*german*/"Bomben (5 StΓΌck)€", /*french*/"une demi-dizaine de bombes"), // /*spanish*/unas (5) bombas { - CustomMessage("explosives", /*german*/"Explosivpakete", /*french*/"un paquet d'explosifs") + CustomMessage("explosives", /*german*/"Explosives", /*french*/"un paquet d'explosifs") // /*spanish*/un montΓ³n de explosivos }, { - CustomMessage("a few explosives", /*german*/"ein paar ExplosivbehΓ€lter", /*french*/"une poignΓ©e de pΓ©tards"), + CustomMessage("a few explosives", /*german*/"wenig Explosives", /*french*/"une poignΓ©e de pΓ©tards"), // /*spanish*/un par de explosivos - CustomMessage("a few blast balls", /*german*/"ein paar ExplosionsbΓ€lle", /*french*/"une poignΓ©e de boules bleues")}); + CustomMessage("a few blast balls", /*german*/"ein paar Explosionskugeln€", /*french*/"une poignΓ©e de boules bleues")}); // /*spanish*/un par de estallidos - hintTextTable[RHT_BOMBS_10] = HintText(CustomMessage("Bombs (10 pieces)", /*german*/"Bomben (10 StΓΌck)", /*french*/"une dizaine de bombes"), + hintTextTable[RHT_BOMBS_10] = HintText(CustomMessage("Bombs (10 pieces)", /*german*/"Bomben (10 StΓΌck)€", /*french*/"une dizaine de bombes"), // /*spanish*/unas (10) bombas { - CustomMessage("explosives", /*german*/"Explosivpakete", /*french*/"un paquet d'explosifs") + CustomMessage("explosives", /*german*/"Explosives", /*french*/"un paquet d'explosifs") // /*spanish*/un montΓ³n de explosivos }, { - CustomMessage("some explosives", /*german*/"einige ExplosivbehΓ€lter", /*french*/"un paquet de pΓ©tards"), + CustomMessage("some explosives", /*german*/"etwas Explosives", /*french*/"un paquet de pΓ©tards"), // /*spanish*/unos cuantos explosivos - CustomMessage("some blast balls", /*german*/"einige ExplosionsbΓ€lle", /*french*/"un paquet de boules bleues")}); + CustomMessage("some blast balls", /*german*/"einige Explosionskugeln€", /*french*/"un paquet de boules bleues")}); // /*spanish*/unos cuantos estallidos - hintTextTable[RHT_BOMBS_20] = HintText(CustomMessage("Bombs (20 pieces)", /*german*/"Bomben (20 StΓΌck)", /*french*/"une vingtaine de bombes"), + hintTextTable[RHT_BOMBS_20] = HintText(CustomMessage("Bombs (20 pieces)", /*german*/"Bomben (20 StΓΌck)€", /*french*/"une vingtaine de bombes"), // /*spanish*/unas (20) bombas { - CustomMessage("explosives", /*german*/"Explosivpakete", /*french*/"un paquet d'explosifs") + CustomMessage("explosives", /*german*/"Explosives", /*french*/"un paquet d'explosifs") // /*spanish*/un montΓ³n de explosivos }, { - CustomMessage("lots-o-explosives", /*german*/"viele ExplosivbehΓ€lter", /*french*/"une abondance de pΓ©tards"), + CustomMessage("lots-o-explosives", /*german*/"viel Explosives", /*french*/"une abondance de pΓ©tards"), // /*spanish*/un puΓ±ado de explosivos - CustomMessage("plenty of blast balls", /*german*/"viele ExplosionsbΓ€lle", /*french*/"une abondance de boules bleues")}); + CustomMessage("plenty of blast balls", /*german*/"viele Explosionskugeln€", /*french*/"une abondance de boules bleues")}); // /*spanish*/bastantes estallidos - hintTextTable[RHT_BOMBCHUS_5] = HintText(CustomMessage("Bombchus (5 pieces)", /*german*/"Krabbelminen (5 StΓΌck)", /*french*/"une demi-dizaine de Missiles"), + hintTextTable[RHT_BOMBCHUS_5] = HintText(CustomMessage("Bombchus (5 pieces)", /*german*/"Krabbelminen (5 StΓΌck)€", /*french*/"une demi-dizaine de Missiles"), // /*spanish*/unos (5) bombchus { CustomMessage("a prize of the House of Skulltulas", /*german*/"ein Preis des Skulltula-Hauses", /*french*/"un prix de la maison des Skulltulas"), // /*spanish*/un obsequio de la Casa Skulltula - CustomMessage("explosives", /*german*/"Explosivpakete", /*french*/"un paquet d'explosifs") + CustomMessage("explosives", /*german*/"Explosives", /*french*/"un paquet d'explosifs") // /*spanish*/un montΓ³n de explosivos }, { - CustomMessage("a few mice bombs", /*german*/"ein paar MΓ€usebomben", /*french*/"une poignΓ©e de mignons explosifs"), + CustomMessage("a few mice bombs", /*german*/"ein paar MΓ€usebomben€", /*french*/"une poignΓ©e de mignons explosifs"), // /*spanish*/un par de bombas roedoras - CustomMessage("a few proximity mice", /*german*/"ein paar NΓ€herungsmΓ€use", /*french*/"une poignΓ©e de jouets Γ  remonter"), + CustomMessage("a few proximity mice", /*german*/"ein paar NΓ€herungsmΓ€use€", /*french*/"une poignΓ©e de jouets Γ  remonter"), // /*spanish*/un par de explosivos ratoncitos - CustomMessage("a few wall crawlers", /*german*/"ein paar Wandkrabbler", /*french*/"une poignΓ©e de rapides grimpeurs"), + CustomMessage("a few wall crawlers", /*german*/"ein paar Wandkrabbler€", /*french*/"une poignΓ©e de rapides grimpeurs"), // /*spanish*/un par de trepaparedes - CustomMessage("a few trail blazers", /*german*/"ein paar Vorreiter", /*french*/"une poignΓ©e de zigzags Γ©clatants")}); + CustomMessage("a few trail blazers", /*german*/"ein paar Vorreiter€", /*french*/"une poignΓ©e de zigzags Γ©clatants")}); // /*spanish*/un par de ratas propulsadas - hintTextTable[RHT_BOMBCHUS_10] = HintText(CustomMessage("Bombchus (10 pieces)", /*german*/"Krabbelminen (10 StΓΌck)", /*french*/"une dizaine de Missiles"), + hintTextTable[RHT_BOMBCHUS_10] = HintText(CustomMessage("Bombchus (10 pieces)", /*german*/"Krabbelminen (10 StΓΌck)€", /*french*/"une dizaine de Missiles"), // /*spanish*/unos (10) bombchus { CustomMessage("a prize of the House of Skulltulas", /*german*/"ein Preis des Skulltula-Hauses", /*french*/"un prix de la maison des Skulltulas"), // /*spanish*/un obsequio de la Casa Skulltula - CustomMessage("explosives", /*german*/"Explosivpakete", /*french*/"un paquet d'explosifs") + CustomMessage("explosives", /*german*/"Explosives", /*french*/"un paquet d'explosifs") // /*spanish*/un montΓ³n de explosivos }, { - CustomMessage("some mice bombs", /*german*/"einige MΓ€usebomben", /*french*/"un paquet de mignons explosifs"), + CustomMessage("some mice bombs", /*german*/"einige MΓ€usebomben€", /*french*/"un paquet de mignons explosifs"), // /*spanish*/unas cuantas bombas roedoras - CustomMessage("some proximity mice", /*german*/"einige NΓ€herungsmΓ€use", /*french*/"un paquet de jouets Γ  remonter"), + CustomMessage("some proximity mice", /*german*/"einige NΓ€herungsmΓ€use€", /*french*/"un paquet de jouets Γ  remonter"), // /*spanish*/unos cuantos explosivos ratoncitos - CustomMessage("some wall crawlers", /*german*/"einige Wandkrabbler", /*french*/"un paquet de rapides grimpeurs"), + CustomMessage("some wall crawlers", /*german*/"einige Wandkrabbler€", /*french*/"un paquet de rapides grimpeurs"), // /*spanish*/unos cuantos trepaparedes - CustomMessage("some trail blazers", /*german*/"einige Vorreiter", /*french*/"un paquet de zigzags Γ©clatants")}); + CustomMessage("some trail blazers", /*german*/"einige Vorreiter€", /*french*/"un paquet de zigzags Γ©clatants")}); // /*spanish*/unas cuantas ratas propulsadas - hintTextTable[RHT_BOMBCHUS_20] = HintText(CustomMessage("Bombchus (20 pieces)", /*german*/"Krabbelminen (20 StΓΌck)", /*french*/"une vingtaine de Missiles"), + hintTextTable[RHT_BOMBCHUS_20] = HintText(CustomMessage("Bombchus (20 pieces)", /*german*/"Krabbelminen (20 StΓΌck)€", /*french*/"une vingtaine de Missiles"), // /*spanish*/unos (20) bombchus { CustomMessage("a prize of the House of Skulltulas", /*german*/"ein Preis des Skulltula-Hauses", /*french*/"un prix de la maison des Skulltulas"), // /*spanish*/un obsequio de la Casa Skulltula - CustomMessage("explosives", /*german*/"Explosivpakete", /*french*/"un paquet d'explosifs") + CustomMessage("explosives", /*german*/"Explosives", /*french*/"un paquet d'explosifs") // /*spanish*/un montΓ³n de explosivos }, { - CustomMessage("plenty of mice bombs", /*german*/"viele MΓ€usebomben", /*french*/"une abondance de mignons explosifs"), + CustomMessage("plenty of mice bombs", /*german*/"viele MΓ€usebomben€", /*french*/"une abondance de mignons explosifs"), // /*spanish*/bastantes bombas roedoras - CustomMessage("plenty of proximity mice", /*german*/"viele NΓ€herungsmΓ€use", /*french*/"une abondance de jouets Γ  remonter"), + CustomMessage("plenty of proximity mice", /*german*/"viele NΓ€herungsmΓ€use€", /*french*/"une abondance de jouets Γ  remonter"), // /*spanish*/bastantes explosivos ratoncitos - CustomMessage("plenty of wall crawlers", /*german*/"viele Wandkrabbler", /*french*/"une abondance de rapides grimpeurs"), + CustomMessage("plenty of wall crawlers", /*german*/"viele Wandkrabbler€", /*french*/"une abondance de rapides grimpeurs"), // /*spanish*/bastantes trepaparedes - CustomMessage("plenty of trail blazers", /*german*/"viele Vorreiter", /*french*/"une abondance de zigzags Γ©clatants")}); + CustomMessage("plenty of trail blazers", /*german*/"viele Vorreiter€", /*french*/"une abondance de zigzags Γ©clatants")}); // /*spanish*/bastantes ratas propulsadas - hintTextTable[RHT_ARROWS_5] = HintText(CustomMessage("Arrows (5 pieces)", /*german*/"Pfeile (5 StΓΌck)", /*french*/"une demi-dizaine de flΓ¨ches"), + hintTextTable[RHT_ARROWS_5] = HintText(CustomMessage("Arrows (5 pieces)", /*german*/"Pfeile (5 StΓΌck)€", /*french*/"une demi-dizaine de flΓ¨ches"), // /*spanish*/unas (5) flechas { CustomMessage("a projectile", /*german*/"ein Projektil", /*french*/"un projectile") // /*spanish*/un proyectil }, { - CustomMessage("a few danger darts", /*german*/"ein paar gefΓ€hrliche Spitzen", /*french*/"une poignΓ©e d'obus"), + CustomMessage("a few danger darts", /*german*/"ein paar gefΓ€hrliche Spitzen€", /*french*/"une poignΓ©e d'obus"), // /*spanish*/un par de peligrosos dardos - CustomMessage("a few sharp shafts", /*german*/"ein paar scharfe Stifte", /*french*/"une poignΓ©e de piquets")}); + CustomMessage("a few sharp shafts", /*german*/"ein paar scharfe Stifte€", /*french*/"une poignΓ©e de piquets")}); // /*spanish*/un par de puntas afiladas - hintTextTable[RHT_ARROWS_10] = HintText(CustomMessage("Arrows (10 pieces)", /*german*/"Pfeile (10 StΓΌck)", /*french*/"une dizaine de flΓ¨ches"), + hintTextTable[RHT_ARROWS_10] = HintText(CustomMessage("Arrows (10 pieces)", /*german*/"Pfeile (10 StΓΌck)€", /*french*/"une dizaine de flΓ¨ches"), // /*spanish*/unas (10) flechas { CustomMessage("a projectile", /*german*/"ein Projektil", /*french*/"un projectile") // /*spanish*/un proyectil }, { - CustomMessage("some danger darts", /*german*/"einige gefΓ€hrliche Spitzen", /*french*/"un paquet d'obus"), + CustomMessage("some danger darts", /*german*/"einige gefΓ€hrliche Spitzen€", /*french*/"un paquet d'obus"), // /*spanish*/unos cuantos peligrosos dardos - CustomMessage("some sharp shafts", /*german*/"einige scharfe Stifte", /*french*/"un paquet de piquets")}); + CustomMessage("some sharp shafts", /*german*/"einige scharfe Stifte€", /*french*/"un paquet de piquets")}); // /*spanish*/unas cuantas puntas afiladas - hintTextTable[RHT_ARROWS_30] = HintText(CustomMessage("Arrows (30 pieces)", /*german*/"Pfeile (30 StΓΌck)", /*french*/"une trentaine de flΓ¨ches"), + hintTextTable[RHT_ARROWS_30] = HintText(CustomMessage("Arrows (30 pieces)", /*german*/"Pfeile (30 StΓΌck)€", /*french*/"une trentaine de flΓ¨ches"), // /*spanish*/unas (30) flechas { CustomMessage("a projectile", /*german*/"ein Projektil", /*french*/"un projectile") // /*spanish*/un proyectil }, { - CustomMessage("plenty of danger darts", /*german*/"viele gefΓ€hrliche Spitzen", /*french*/"une abondance d'obus"), + CustomMessage("plenty of danger darts", /*german*/"viele gefΓ€hrliche Spitzen€", /*french*/"une abondance d'obus"), // /*spanish*/bastantes peligrosos dardos - CustomMessage("plenty of sharp shafts", /*german*/"viele scharfe Stifte", /*french*/"une abondance de piquets")}); + CustomMessage("plenty of sharp shafts", /*german*/"viele scharfe Stifte€", /*french*/"une abondance de piquets")}); // /*spanish*/bastantes puntas afiladas - hintTextTable[RHT_DEKU_NUTS_5] = HintText(CustomMessage("Deku Nuts (5 pieces)", /*german*/"Deku-NΓΌsse (5 StΓΌck)", /*french*/"une demi-dizaine de noix Mojo"), + hintTextTable[RHT_DEKU_NUTS_5] = HintText(CustomMessage("Deku Nuts (5 pieces)", /*german*/"Deku-NΓΌsse (5 StΓΌck)€", /*french*/"une demi-dizaine de noix Mojo"), // /*spanish*/unas (5) nueces deku { - CustomMessage("some Deku munitions", /*german*/"ein wenig Deku-Munition", /*french*/"un paquet de munitions Mojo"), + CustomMessage("some Deku munitions", /*german*/"etwas Deku-Munition", /*french*/"un paquet de munitions Mojo"), // /*spanish*/un montΓ³n de municiones Deku - CustomMessage("something that can stun", /*german*/"etwas, das paralysieren kann", /*french*/"une chose qui peut paralyser") + CustomMessage("something that can stun", /*german*/"etwas zum BetΓ€uben", /*french*/"une chose qui peut paralyser") // /*spanish*/algo que pueda paralizar }, { - CustomMessage("some nuts", /*german*/"ein paar NΓΌsse", /*french*/"une poignΓ©e de noisettes"), + CustomMessage("some nuts", /*german*/"ein paar NΓΌsse€", /*french*/"une poignΓ©e de noisettes"), // /*spanish*/un par de nueces - CustomMessage("some flashbangs", /*german*/"ein paar Blendgranaten", /*french*/"une poignΓ©e d'Γ©clats"), + CustomMessage("some flashbangs", /*german*/"ein paar Blendgranaten€", /*french*/"une poignΓ©e d'Γ©clats"), // /*spanish*/un par de semillas aturdidoras - CustomMessage("some scrub spit", /*german*/"ein wenig Buschspucke", /*french*/"une poignΓ©e de crachats Mojo")}); + CustomMessage("some scrub spit", /*german*/"etwas Deku-Spucke€", /*french*/"une poignΓ©e de crachats Mojo")}); // /*spanish*/un par de escupitajos deku - hintTextTable[RHT_DEKU_NUTS_10] = HintText(CustomMessage("Deku Nuts (10 pieces)", /*german*/"Deku-NΓΌsse (10 StΓΌck)", /*french*/"une dizaine de noix Mojo"), + hintTextTable[RHT_DEKU_NUTS_10] = HintText(CustomMessage("Deku Nuts (10 pieces)", /*german*/"Deku-NΓΌsse (10 StΓΌck)€", /*french*/"une dizaine de noix Mojo"), // /*spanish*/unas (10) nueces deku { CustomMessage("some Deku munitions", /*german*/"etwas Deku-Munition", /*french*/"un paquet de munitions Mojo"), // /*spanish*/un montΓ³n de municiones Deku - CustomMessage("something that can stun", /*german*/"etwas, das paralysieren kann", /*french*/"une chose qui peut paralyser") + CustomMessage("something that can stun", /*german*/"etwas zum BetΓ€uben", /*french*/"une chose qui peut paralyser") // /*spanish*/algo que pueda paralizar }, { - CustomMessage("lots-o-nuts", /*german*/"einige NΓΌsse", /*french*/"un paquet de noisettes"), + CustomMessage("lots-o-nuts", /*german*/"einige NΓΌsse€", /*french*/"un paquet de noisettes"), // /*spanish*/un puΓ±ado de nueces - CustomMessage("plenty of flashbangs", /*german*/"einige Blendgranaten", /*french*/"un paquet d'Γ©clats"), + CustomMessage("plenty of flashbangs", /*german*/"einige Blendgranaten€", /*french*/"un paquet d'Γ©clats"), // /*spanish*/unas cuantas semillas aturdidoras - CustomMessage("plenty of scrub spit", /*german*/"einige Buschspucke", /*french*/"un paquet de crachats Mojo")}); + CustomMessage("plenty of scrub spit", /*german*/"einiges an Deku-Spucke€", /*french*/"un paquet de crachats Mojo")}); // /*spanish*/unos cuantos escupitajos deku - hintTextTable[RHT_DEKU_SEEDS_30] = HintText(CustomMessage("Deku Seeds (30 pieces)", /*german*/"Deku-Samen (30 StΓΌck)", /*french*/"une trentaine de graines Mojo"), + hintTextTable[RHT_DEKU_SEEDS_30] = HintText(CustomMessage("Deku Seeds (30 pieces)", /*german*/"Deku-Kerne (30 StΓΌck)€", /*french*/"une trentaine de graines Mojo"), // /*spanish*/unas (30) semillas deku { CustomMessage("a projectile", /*german*/"ein Projektil", /*french*/"un projectile"), @@ -1922,13 +1924,13 @@ void StaticData::HintTable_Init_Item() { }, { CustomMessage("catapult ammo", /*german*/"Katapultmunition", /*french*/"un paquet de dΓ©licieuses munitions"), // /*spanish*/un par de municiΓ³n infantil - CustomMessage("lots-o-seeds", /*german*/"viele Samen", /*french*/"un paquet de germes sΓ©chΓ©s")}); + CustomMessage("lots-o-seeds", /*german*/"viele Kerne€", /*french*/"un paquet de germes sΓ©chΓ©s")}); // /*spanish*/un puΓ±ado de semillas hintTextTable[RHT_DEKU_STICK_1] = HintText(CustomMessage("a Deku Stick", /*german*/"ein Deku-Stab", /*french*/"un bΓ’ton Mojo"), // /*spanish*/un palo deku { - CustomMessage("some Deku munitions", /*german*/"ein wenig Deku-Munition", /*french*/"un paquet de munitions Mojo") + CustomMessage("some Deku munitions", /*german*/"etwas Deku-Munition", /*french*/"un paquet de munitions Mojo") // /*spanish*/un montΓ³n de municiones Deku }, { CustomMessage("a breakable branch", /*german*/"ein brΓΌchiger Zweig", /*french*/"un bout de bois")}); @@ -1946,44 +1948,44 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_TREASURE_GAME_GREEN_RUPEE] = HintText(CustomMessage("a Green Rupee", /*german*/"ein grΓΌner Rubin", /*french*/"un rubis vert"), // /*spanish*/una rupia verde { - CustomMessage("some rupees", /*german*/"einige Rubine", /*french*/"une quantitΓ© de rubis") + CustomMessage("some rupees", /*german*/"einige Rubine€", /*french*/"une quantitΓ© de rubis") // /*spanish*/una cantidad de rupias }, { CustomMessage("the dollar of defeat", /*german*/"der Rubin der Niederlage", /*french*/"le rubis de la dΓ©faite")}); // /*spanish*/el peso de la derrota - hintTextTable[RHT_TRIFORCE_PIECE] = HintText(CustomMessage("a Piece of the Triforce", /*german*/"ein Triforce-Fragment", /*french*/"un fragment de la Triforce"), + hintTextTable[RHT_TRIFORCE_PIECE] = HintText(CustomMessage("a Piece of the Triforce", /*german*/"ein Triforce-Splitter", /*french*/"un fragment de la Triforce"), // /*spanish*/un fragmento de la Trifuerza {}, { CustomMessage("a triumph fork", /*german*/"ein Dreieck des Triumphs", /*french*/"la Tribosse"), // /*spanish*/un trΓ­gono del triunfo CustomMessage("cheese", /*german*/"KΓ€se", /*french*/"du fromage"), // /*spanish*/un porciΓ³n de queso - CustomMessage("a gold fragment", /*german*/"ein goldenes Fragment", /*french*/"un fragment d'or")}); + CustomMessage("a gold fragment", /*german*/"ein Goldfragment", /*french*/"un fragment d'or")}); // /*spanish*/un fragmento dorado - hintTextTable[RHT_GOHMA_SOUL] = HintText(CustomMessage("the soul of Gohma", /*german*/"die Seele Gohmas", /*french*/"l'Γ‚me de Gohma"), + hintTextTable[RHT_GOHMA_SOUL] = HintText(CustomMessage("the soul of Gohma", /*german*/"Gohmas Seele", /*french*/"l'Γ‚me de Gohma"), { CustomMessage("something webbed", /*german*/"etwas Verwobenes", /*french*/"un truc entoilΓ©") }, { - CustomMessage("an invasive soul", /*german*/"eine invasive Seele", /*french*/"une Γ’me invasive"), + CustomMessage("an invasive soul", /*german*/"eine parasitΓ€re Seele", /*french*/"une Γ’me invasive"), CustomMessage("some spider essence", /*german*/"etwas spinnenartige Essenz", /*french*/"une essence d'araignΓ©e")}); - hintTextTable[RHT_KING_DODONGO_SOUL] = HintText(CustomMessage("the soul of King Dodongo", /*german*/"die Seele KΓΆnig Dodongos", /*french*/"l'Γ‚me du Roi Dodongo"), + hintTextTable[RHT_KING_DODONGO_SOUL] = HintText(CustomMessage("the soul of King Dodongo", /*german*/"KΓΆnig Dodongos Seele", /*french*/"l'Γ‚me du Roi Dodongo"), { CustomMessage("something explosive", /*german*/"etwas Explosives", /*french*/"un truc dΓ©tonnant") }, { - CustomMessage("a royal soul", /*german*/"eine royale Seele", /*french*/"une Γ’me royale"), + CustomMessage("a royal soul", /*german*/"eine kΓΆnigliche Seele", /*french*/"une Γ’me royale"), CustomMessage("some reptile essence", /*german*/"etwas reptilienartige Essenz", /*french*/"une essence de reptile")}); - hintTextTable[RHT_BARINADE_SOUL] = HintText(CustomMessage("the soul of Barinade", /*german*/"die Seele Barinades", /*french*/"l'Γ‚me de Barinade"), + hintTextTable[RHT_BARINADE_SOUL] = HintText(CustomMessage("the soul of Barinade", /*german*/"Barinades Seele", /*french*/"l'Γ‚me de Barinade"), { CustomMessage("something fishy", /*german*/"etwas Fischiges", /*french*/"un truc gluant") }, { CustomMessage("an infectuous soul", /*german*/"eine infektiΓΆse Seele", /*french*/"une Γ’me infectieuse"), - CustomMessage("some parasitic essence", /*german*/"etwas parasitΓ€re Essenz", /*french*/"une essence parasitique")}); + CustomMessage("some parasitic essence", /*german*/"etwas elektrische Essenz", /*french*/"une essence parasitique")}); - hintTextTable[RHT_PHANTOM_GANON_SOUL] = HintText(CustomMessage("the soul of Phantom Ganon", /*german*/"die Seele Phantom-Ganons", /*french*/"l'Γ‚me de Ganon Spectral"), + hintTextTable[RHT_PHANTOM_GANON_SOUL] = HintText(CustomMessage("the soul of Phantom Ganon", /*german*/"Phantom-Ganons Seele", /*french*/"l'Γ‚me de Ganon Spectral"), { CustomMessage("something spectral", /*german*/"etwas Spektrales", /*french*/"un truc spectral") }, { @@ -1991,42 +1993,42 @@ void StaticData::HintTable_Init_Item() { CustomMessage("some illusionary essence", /*german*/"etwas illusionΓ€re Essenz", /*french*/"une essence illusoire")}); - hintTextTable[RHT_VOLVAGIA_SOUL] = HintText(CustomMessage("the soul of Volvagia", /*german*/"die Seele Volvagias", /*french*/"l'Γ‚me de Volcania"), + hintTextTable[RHT_VOLVAGIA_SOUL] = HintText(CustomMessage("the soul of Volvagia", /*german*/"Volvagias Seele", /*french*/"l'Γ‚me de Volcania"), { CustomMessage("something hot", /*german*/"etwas Heißes", /*french*/"quelque chose de trΓ¨s chaud") }, { CustomMessage("a draconic soul", /*german*/"eine drakonische Seele", /*french*/"une essence draconique"), CustomMessage("some magmatic essence", /*german*/"etwas magmatische Essenz", /*french*/"une essence magmatique")}); - hintTextTable[RHT_MORPHA_SOUL] = HintText(CustomMessage("the soul of Morpha", /*german*/"die Seele Morphas", /*french*/"l'Γ‚me de Morpha"), + hintTextTable[RHT_MORPHA_SOUL] = HintText(CustomMessage("the soul of Morpha", /*german*/"Morphas Seele", /*french*/"l'Γ‚me de Morpha"), { CustomMessage("something wet", /*german*/"etwas Nasses", /*french*/"un truc mouillΓ©") }, { CustomMessage("an aquatic soul", /*german*/"eine aquatische Seele", /*french*/"une Γ’me aquatique"), CustomMessage("some liquid essence", /*german*/"etwas flΓΌssige Essenz", /*french*/"une essence liquide")}); - hintTextTable[RHT_BONGO_BONGO_SOUL] = HintText(CustomMessage("the soul of Bongo Bongo", /*german*/"die Seele Bongo Bongos", /*french*/"l'Γ‚me de Bongo Bongo"), + hintTextTable[RHT_BONGO_BONGO_SOUL] = HintText(CustomMessage("the soul of Bongo Bongo", /*german*/"Bongo Bongos Seele", /*french*/"l'Γ‚me de Bongo Bongo"), { CustomMessage("something dark", /*german*/"etwas Dunkles", /*french*/"quelque chose de sombre") }, { CustomMessage("a shadowy soul", /*german*/"eine schattige Seele", /*french*/"une Γ’me tΓ©nΓ©breuse"), - CustomMessage("some handy essence", /*german*/"etwas praktische Essenz", /*french*/"l'Γ’me du tape m'en cinq")}); + CustomMessage("some handy essence", /*german*/"etwas bestialische Essenz", /*french*/"l'Γ’me du tape m'en cinq")}); - hintTextTable[RHT_TWINROVA_SOUL] = HintText(CustomMessage("the soul of Twinrova", /*german*/"die Seele Twinrovas", /*french*/"l'Γ‚me du Duo MalΓ©fique"), + hintTextTable[RHT_TWINROVA_SOUL] = HintText(CustomMessage("the soul of Twinrova", /*german*/"Twinrovas Seele", /*french*/"l'Γ‚me du Duo MalΓ©fique"), { - CustomMessage("something spiritual", /*german*/"etwas Spirituelles", /*french*/"un truc spirituel") + CustomMessage("something spiritual", /*german*/"etwas Geisterhaftes", /*french*/"un truc spirituel") }, { CustomMessage("old souls", /*german*/"alte Seelen", /*french*/"deux vieilles Γ’mes"), - CustomMessage("twin essences", /*german*/"Zwillingsessenzen", /*french*/"des essences jumelles")}); + CustomMessage("twin essences", /*german*/"Zwillingsessenzen€", /*french*/"des essences jumelles")}); - hintTextTable[RHT_GANON_SOUL] = HintText(CustomMessage("the soul of Ganon", /*german*/"die Seele Ganons", /*french*/"l'Γ‚me de Ganon"), + hintTextTable[RHT_GANON_SOUL] = HintText(CustomMessage("the soul of Ganon", /*german*/"Ganons Seele", /*french*/"l'Γ‚me de Ganon"), { CustomMessage("something strong", /*german*/"etwas Starkes", /*french*/"un truc de fort") }, { CustomMessage("an evil soul", /*german*/"eine bΓΆse Seele", /*french*/"une Γ’me malΓ©fique"), CustomMessage("some powerful essence", /*german*/"etwas mΓ€chtige Essenz", /*french*/"une essence incroyablement puissante")}); - hintTextTable[RHT_OCARINA_A_BUTTON] = HintText(CustomMessage("an Ocarina A Button", /*german*/"eine Okarina A Taste", /*french*/"la Touche A de l'Ocarina"), + hintTextTable[RHT_OCARINA_A_BUTTON] = HintText(CustomMessage("an Ocarina A Button", /*german*/"die A-Taste der Okarina", /*french*/"la Touche A de l'Ocarina"), // /*spanish*/un botΓ³n A de Ocarina { CustomMessage("something melodic", /*german*/"etwas Melodisches", /*french*/"quelque chose de mΓ©lodieux") @@ -2035,7 +2037,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a musical letter", /*german*/"ein musikalischer Brief", /*french*/"une lettre musicale")}); // /*spanish*/una letra musical - hintTextTable[RHT_OCARINA_C_UP_BUTTON] = HintText(CustomMessage("an Ocarina C Up Button", /*german*/"eine Okarina C-Oben Taste", /*french*/"la Touche C-Haut de l'Ocarina"), + hintTextTable[RHT_OCARINA_C_UP_BUTTON] = HintText(CustomMessage("an Ocarina C Up Button", /*german*/"die C-Oben-Taste der Okarina", /*french*/"la Touche C-Haut de l'Ocarina"), // /*spanish*/un botΓ³n C superior de Ocarina { CustomMessage("something melodic", /*german*/"etwas Melodisches", /*french*/"quelque chose de mΓ©lodieux") @@ -2044,7 +2046,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a high tone", /*german*/"ein hoher Ton", /*french*/"une tonalitΓ© Γ©levΓ©e")}); // /*spanish*/un tono alto - hintTextTable[RHT_OCARINA_C_DOWN_BUTTON] = HintText(CustomMessage("an Ocarina C Down Button", /*german*/"eine Okarina C-Unten Taste", /*french*/"la Touche C-Bas de l'Ocarina"), + hintTextTable[RHT_OCARINA_C_DOWN_BUTTON] = HintText(CustomMessage("an Ocarina C Down Button", /*german*/"die C-Unten-Taste der Okarina", /*french*/"la Touche C-Bas de l'Ocarina"), // /*spanish*/un botΓ³n C inferior de Ocarina { CustomMessage("something melodic", /*german*/"etwas Melodisches", /*french*/"quelque chose de mΓ©lodieux") @@ -2053,7 +2055,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a low tone", /*german*/"ein tiefer Ton", /*french*/"une tonalitΓ© basse")}); // /*spanish*/un tono bajo - hintTextTable[RHT_OCARINA_C_LEFT_BUTTON] = HintText(CustomMessage("an Ocarina C Left Button", /*german*/"eine Okarina C-Links Taste", /*french*/"la Touche C-Gauche de l'Ocarina"), + hintTextTable[RHT_OCARINA_C_LEFT_BUTTON] = HintText(CustomMessage("an Ocarina C Left Button", /*german*/"die C-Links-Taste der Okarina", /*french*/"la Touche C-Gauche de l'Ocarina"), // /*spanish*/un botΓ³n C izquierdo de Ocarina { CustomMessage("something melodic", /*german*/"etwas Melodisches", /*french*/"quelque chose de mΓ©lodieux") @@ -2062,7 +2064,7 @@ void StaticData::HintTable_Init_Item() { CustomMessage("a leftward tone", /*german*/"ein linksseitiger Ton", /*french*/"une tonalitΓ© vers la gauche")}); // /*spanish*/un tono hacia la izquierda - hintTextTable[RHT_OCARINA_C_RIGHT_BUTTON] = HintText(CustomMessage("an Ocarina C Right Button", /*german*/"eine Okarina C-Rechts Taste", /*french*/"la Touche C-Droit de l'Ocarina"), + hintTextTable[RHT_OCARINA_C_RIGHT_BUTTON] = HintText(CustomMessage("an Ocarina C Right Button", /*german*/"die C-Rechts-Taste der Okarina", /*french*/"la Touche C-Droit de l'Ocarina"), // /*spanish*/un botΓ³n C derecho de Ocarina { CustomMessage("something melodic", /*german*/"etwas Melodisches", /*french*/"quelque chose de mΓ©lodieux") @@ -2074,7 +2076,7 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_FISHING_POLE] = HintText(CustomMessage("a fishing pole", /*german*/"eine Angelrute", /*french*/"une canne Γ  pΓͺche"), // /*spanish*/caΓ±a de pescar { - CustomMessage("the pond owner's property", /*german*/"der Besitz des Teicheigners", /*french*/"(un truc qui appartient au propriΓ©taire de l'Γ©tang)") + CustomMessage("the pond owner's property", /*german*/"das Eigentum des Fischweiherbesitzers", /*french*/"(un truc qui appartient au propriΓ©taire de l'Γ©tang)") // /*spanish*/(caΓ±a de pescar) }, { CustomMessage("a fish-puller", /*german*/"ein Fischzieher", /*french*/"(un aimant Γ  poisson)")}); @@ -2082,14 +2084,14 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_BOMBCHU_BAG] = HintText(CustomMessage("a Bombchu Bag", /*german*/"eine Krabbelminentasche", /*french*/"un Sac de Missiles Teigneux"), { - CustomMessage("explosives", /*german*/"ein Explosivpaket", /*french*/"un paquet d'explosifs"), + CustomMessage("explosives", /*german*/"Explosives", /*french*/"un paquet d'explosifs"), // /*spanish*/un montΓ³n de explosivos - CustomMessage("something that can remove boulders", /*german*/"etwas, das GerΓΆll entfernen kann", /*french*/"une chose qui enlΓ¨ve les rochers") + CustomMessage("something that can remove boulders", /*german*/"etwas zum GerΓΆll entfernen", /*french*/"une chose qui enlΓ¨ve les rochers") // /*spanish*/algo que pueda quitar rocas }, { CustomMessage("sack of mice", /*german*/"ein Sack MΓ€use", /*french*/"un Sac rempli de souris")}); - hintTextTable[RHT_SKELETON_KEY] = HintText(CustomMessage("a Skeleton Key", /*german*/ "ein UniversalschlΓΌssel", /*french*/ "une ClΓ© Squelette"), + hintTextTable[RHT_SKELETON_KEY] = HintText(CustomMessage("a Skeleton Key", /*german*/ "der SkelettschlΓΌssel", /*french*/ "une ClΓ© Squelette"), // /*spanish*/una Llave Maestra { CustomMessage("a key", /*german*/ "ein SchlΓΌssel", /*french*/ "une clΓ©") @@ -2099,30 +2101,30 @@ void StaticData::HintTable_Init_Item() { // /*spanish*/un desbloqueador maestro //RANDOTODO if these are ever used for anything other than name, they want abscure and ambiguous hints - hintTextTable[RHT_QUIVER_INF] = HintText(CustomMessage("an infinite Quiver", /*german*/"ein unendlicher KΓΆcher", /*french*/"un Carquois Infini")); + hintTextTable[RHT_QUIVER_INF] = HintText(CustomMessage("an infinite Quiver", /*german*/"der unendliche KΓΆcher", /*french*/"un Carquois Infini")); - hintTextTable[RHT_BOMB_BAG_INF] = HintText(CustomMessage("an infinite Bomb Bag", /*german*/"eine unendliche Bombentasche", /*french*/"un Sac de Bombe sans fond")); + hintTextTable[RHT_BOMB_BAG_INF] = HintText(CustomMessage("an infinite Bomb Bag", /*german*/"die unendliche Bombentasche", /*french*/"un Sac de Bombe sans fond")); - hintTextTable[RHT_BULLET_BAG_INF] = HintText(CustomMessage("an infinite Bullet Bag", /*german*/"eine unendliche Samentasche", /*french*/"un Sac de Graine sans fond")); + hintTextTable[RHT_BULLET_BAG_INF] = HintText(CustomMessage("an infinite Bullet Bag", /*german*/"die unendliche Munitionstasche", /*french*/"un Sac de Graine sans fond")); - hintTextTable[RHT_STICK_UPGRADE_INF] = HintText(CustomMessage("infinite Deku Sticks", /*german*/"unendliche Deku-StΓ€be", /*french*/"des BΓ’tons Mojo illimitΓ©s")); + hintTextTable[RHT_STICK_UPGRADE_INF] = HintText(CustomMessage("infinite Deku Sticks", /*german*/"unendliche Deku-Stab-KapazitΓ€t", /*french*/"des BΓ’tons Mojo illimitΓ©s")); - hintTextTable[RHT_NUT_UPGRADE_INF] = HintText(CustomMessage("infinite Deku Nuts", /*german*/"unendliche Deku-NΓΌsse", /*french*/"des Noix Mojo illimitΓ©es")); + hintTextTable[RHT_NUT_UPGRADE_INF] = HintText(CustomMessage("infinite Deku Nuts", /*german*/"unendliche Deku-Nuß-KapazitΓ€t", /*french*/"des Noix Mojo illimitΓ©es")); - hintTextTable[RHT_MAGIC_INF] = HintText(CustomMessage("unlimited Magic", /*german*/"unendliche Magie", /*french*/"de la Magie infinie")); + hintTextTable[RHT_MAGIC_INF] = HintText(CustomMessage("unlimited Magic", /*german*/"unendliche Magische Kraft", /*french*/"de la Magie infinie")); - hintTextTable[RHT_BOMBCHU_INF] = HintText(CustomMessage("infinite Bombchus", /*german*/"unendliche Krabbelminen", /*french*/"des Missiles Teigneux illimitΓ©s")); + hintTextTable[RHT_BOMBCHU_INF] = HintText(CustomMessage("infinite Bombchus", /*german*/"die unendliche Krabbelminentasche", /*french*/"des Missiles Teigneux illimitΓ©s")); - hintTextTable[RHT_WALLET_INF] = HintText(CustomMessage("an infinite Wallet", /*german*/"eine unendliche GeldbΓΆrse", /*french*/"une Bourse sans fond")); + hintTextTable[RHT_WALLET_INF] = HintText(CustomMessage("an infinite Wallet", /*german*/"die unendliche GeldbΓΆrse", /*french*/"une Bourse sans fond")); hintTextTable[RHT_EPONA] = HintText(CustomMessage("Epona", /*german*/"Epona", /*french*/"Epona"), // /*spanish*/a Epona { CustomMessage("something from Malon", /*german*/"ein Geschenk von Malon", /*french*/"un cadeau de Malon"), // /*spanish*/un obsequio de Malon - CustomMessage("a song sung by frogs", /*german*/"ein von FrΓΆschen gesungenes Lied", /*french*/"une chanson aimΓ©e des grenouilles"), + CustomMessage("a song sung by frogs", /*german*/"ein von FrΓΆschen gesungenes Lied,", /*french*/"une chanson aimΓ©e des grenouilles"), // /*spanish*/una melodΓ­a de ranas - CustomMessage("something to cross a broken bridge", /*german*/"etwas, um eine kaputte BrΓΌcke zu ΓΌberqueren", /*french*/"une chose pour traverser un pont brisΓ©") + CustomMessage("something to cross a broken bridge", /*german*/"etwas um eine kaputte BrΓΌcke zu ΓΌberqueren,", /*french*/"une chose pour traverser un pont brisΓ©") // /*spanish*/algo para cruzar un puente roto }, { CustomMessage("a horse", /*german*/"ein Pferd", /*french*/"un fidΓ¨le destrier"), @@ -2134,7 +2136,7 @@ void StaticData::HintTable_Init_Item() { hintTextTable[RHT_HINT_MYSTERIOUS] = HintText(CustomMessage("something mysterious", /*german*/"etwas MysteriΓΆses", /*french*/"un sacrΓ© mystΓ¨re")); // /*spanish*/algo misterioso - hintTextTable[RHT_MYSTERIOUS_ITEM] = HintText(CustomMessage("mysterious item", /*german*/"mysteriΓΆser Gegenstand", /*french*/"objet mystΓ©rieux")); + hintTextTable[RHT_MYSTERIOUS_ITEM] = HintText(CustomMessage("mysterious item", /*german*/"ein mysteriΓΆser Gegenstand", /*french*/"objet mystΓ©rieux")); // /*spanish*/algo misterioso hintTextTable[RHT_MYSTERIOUS_ITEM_CAPITAL] = HintText(CustomMessage("Mysterious Item", /*german*/"MysteriΓΆser Gegenstand", /*french*/"Objet MystΓ©rieux")); diff --git a/soh/soh/Enhancements/randomizer/3drando/shops.cpp b/soh/soh/Enhancements/randomizer/3drando/shops.cpp index 115f36394..441454cd0 100644 --- a/soh/soh/Enhancements/randomizer/3drando/shops.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/shops.cpp @@ -236,842 +236,926 @@ int GetShopsanityReplaceAmount() { } } -// Initialize the table of trick names with an easy, medium, and hard name for each language +/* Initialize the table of trick names with an easy, medium, and hard name for each language. + english, french, german // spanish */ void InitTrickNames() { trickNameTable[RG_KOKIRI_SWORD] = { - Text{ "Korok Sword", "Γ‰pΓ©e Korok", "Espada Korok" }, - Text{ "Hero's Sword", "Γ‰pΓ©e du HΓ©ros", "Espada del hΓ©roe" }, - Text{ "Razor Sword", "Lame Rasoir", "Espada de esmeril" }, + Text{ "Korok Sword", "Γ‰pΓ©e Korok", "Korok-Schwert" }, // "Espada Korok" + Text{ "Hero's Sword", "Γ‰pΓ©e du HΓ©ros", "Heroenschwert" }, // "Espada del hΓ©roe" + Text{ "Razor Sword", "Lame Rasoir", "Elfenschwert" }, // "Espada de esmeril" }; trickNameTable[RG_MASTER_SWORD] = { - Text{ "Goddess Sword", "Γ‰pΓ©e de la dΓ©esse", "Espada Divina" }, - Text{ "Gilded Sword", "Excalibur", "Espada de los Sabios" }, - Text{ "Magical Sword", "Lame dorΓ©e", "Fay" }, + Text{ "Goddess Sword", "Γ‰pΓ©e de la dΓ©esse", "Schwert der GΓΆttin" }, // "Espada Divina" + Text{ "Gilded Sword", "Excalibur", "Schmirgelklinge" }, // "Espada de los Sabios" + Text{ "Magical Sword", "Lame dorΓ©e", "Magisches Schwert" }, // "Fay" }; trickNameTable[RG_GIANTS_KNIFE] = { - Text{ "Medigoron's Sword", "l'Γ‰pΓ©e de Medigoron", "La espada de Medigoron" }, - Text{ "Razor Sword", "Lame Rasoir", "Espada de esmeril" }, - Text{ "Royal Claymore", "Claymore Royale", "Royal Claymore" }, + Text{ "Medigoron's Sword", "l'Γ‰pΓ©e de Medigoron", "Medigoron-Schwert" }, // "La espada de Medigoron" + Text{ "Razor Sword", "Lame Rasoir", "Elfenschwert" }, // "Espada de esmeril" + Text{ "Royal Claymore", "Claymore Royale", "KΓΆnigs-ZweihΓ€nder" }, // "Royal Claymore" }; trickNameTable[RG_BIGGORON_SWORD] = { - Text{ "Power Sword", "Γ‰pΓ©e de Puissance", "Espada de poder" }, - Text{ "Fierce Deity Sword", "Γ‰pΓ©e du dieu dΓ©mon", "Espada de la Fiera Deidad" }, - Text{ "Tempered Sword", "Γ‰pΓ©e de LΓ©gende Nv.2", "Espada Maestra mejorada" }, - Text{ "Biggoron's Knife", "Lame de Grogoron", "Daga de Biggoron" }, + Text{ "Power Sword", "Γ‰pΓ©e de Puissance", "Schwert der Macht" }, // "Espada de poder", + Text{ "Fierce Deity Sword", "Γ‰pΓ©e du dieu dΓ©mon", + "Schwert der grimmischen Gottheit" }, // "Espada de la Fiera Deidad" + Text{ "Tempered Sword", "Γ‰pΓ©e de LΓ©gende Nv.2", "Master-Schwert Lv.2" }, // "Espada Maestra mejorada" + Text{ "Biggoron's Knife", "Lame de Grogoron", "Biggoron-Messer" }, // "Daga de Biggoron" }; trickNameTable[RG_DEKU_SHIELD] = { - Text{ "Boko Shield", "Bouclier Boko", "Escudo Boko" }, - Text{ "Ordon Shield", "Bouclier de Toal", "Escudo de Ordon" }, - Text{ "Wooden Shield", "Bouclier de Bois", "Escudo de madera" }, + Text{ "Boko Shield", "Bouclier Boko", "Bokschild" }, // "Escudo Boko" + Text{ "Ordon Shield", "Bouclier de Toal", "Ordon-Schild" }, // "Escudo de Ordon" + Text{ "Wooden Shield", "Bouclier de Bois", "Holzschild" }, // "Escudo de madera" }; trickNameTable[RG_HYLIAN_SHIELD] = { - Text{ "Hyrule Shield", "Bouclier d'Hyrule", "Escudo Hylian" }, - Text{ "Goddess Shield", "Bouclier SacrΓ©", "Escudo Divino" }, - Text{ "Hero's Shield", "Bouclier du HΓ©ros", "Escudo del hΓ©roe" }, + Text{ "Hyrule Shield", "Bouclier d'Hyrule", "Hyrule-Schild" }, // "Escudo Hylian" + Text{ "Goddess Shield", "Bouclier SacrΓ©", "GΓΆttlicher Schild" }, // "Escudo Divino" + Text{ "Hero's Shield", "Bouclier du HΓ©ros", "Heroenschild" }, // "Escudo del hΓ©roe" }; trickNameTable[RG_MIRROR_SHIELD] = { - Text{ "Magic Mirror", "Miroir Magique", "Escudo mΓ‘gico" }, - Text{ "Magical Shield", "Bouclier Magique", "Escudo arcano" }, - Text{ "Mirror of Twilight", "Miroir des Ombres", "Espejo del CrepΓΊsculo" }, + Text{ "Magic Mirror", "Miroir Magique", "Magiespiegel" }, // "Escudo mΓ‘gico" + Text{ "Magical Shield", "Bouclier Magique", "Magischer Schild" }, // "Escudo arcano" + Text{ "Mirror of Twilight", "Miroir des Ombres", "Schattenspiegel" }, // "Espejo del CrepΓΊsculo" }; trickNameTable[RG_GORON_TUNIC] = { - Text{ "Gerudo Top", "Tunique Gerudo", "Pechera gerudo" }, - Text{ "Flamebreaker Armor", "Armure de Pierre", " Armadura ignΓ­fuga" }, - Text{ "Red Mail", "Habits Rouges", "Ropas rojas" }, + Text{ "Gerudo Top", "Tunique Gerudo", "Damengewand" }, // "Pechera gerudo" + Text{ "Flamebreaker Armor", "Armure de Pierre", "Anti-Feuer-RΓΌstung" }, // "Armadura ignΓ­fuga" + Text{ "Red Mail", "Habits Rouges", "Rotes Gewand" }, // "Ropas rojas" }; trickNameTable[RG_ZORA_TUNIC] = { - Text{ "Rito Tunic", "Tunique Rito", "Sayo rito" }, - Text{ "Mermaid Suit", "Costume de sirΓ¨ne", "Costume de sirΓ¨ne" }, - Text{ "Zora Armor", "Armure Zora", "TΓΊnica Zora" }, - Text{ "Blue Mail", "Habits Bleus", "Ropas azules" }, + Text{ "Rito Tunic", "Tunique Rito", "Orni-Gewand" }, // "Sayo rito" + Text{ "Mermaid Suit", "Costume de sirΓ¨ne", "Nixenanzug" }, // "Costume de sirΓ¨ne" + Text{ "Zora Armor", "Armure Zora", "Zora-Panzer" }, // "TΓΊnica Zora" + Text{ "Blue Mail", "Habits Bleus", "Blaues Gewand" }, // "Ropas azules" }; trickNameTable[RG_IRON_BOOTS] = { - Text{ "Iron Hoofs", "Patins de Plomb", "Botas fΓ©rreas" }, - Text{ "Snow Boots", "Bottes de Neige", "Botas de nieve" }, - Text{ "Red Boots", "Bottes rouges", "Botas rojas" }, - Text{ "Zora Greaves", "Bottes Zora", "Zora Greaves" }, - Text{ "Boots of Power", "Bottes de Puissance", "Botas de plomo" }, + Text{ "Iron Hoofs", "Patins de Plomb", "Eisenhufe€" }, // "Botas fΓ©rreas" + Text{ "Snow Boots", "Bottes de Neige", "Schneestiefel€" }, // "Botas de nieve" + Text{ "Red Boots", "Bottes rouges", "Rote Stiefel€" }, // "Botas rojas" + Text{ "Zora Greaves", "Bottes Zora", "Zora-Beinschutz" }, // "Zora Greaves" + Text{ "Boots of Power", "Bottes de Puissance", "StΓ€rkestiefel€" }, // "Botas de plomo" }; trickNameTable[RG_HOVER_BOOTS] = { - Text{ "Hover Hoofs", "Patins des airs", "Botas flotadoras" }, - Text{ "Golden Boots", "Bottes dorΓ©es", "Botas de Oro" }, - Text{ "Pegasus Boots", "Bottes pΓ©gase", "Botas de Pegaso" }, - Text{ "Boots of Speed", "Bottes de vitesse", "Botas del desierto" }, + Text{ "Hover Hoofs", "Patins des airs", "Gleithufe€" }, // "Botas flotadoras" + Text{ "Golden Boots", "Bottes dorΓ©es", "Goldstiefel€" }, // "Botas de Oro" + Text{ "Pegasus Boots", "Bottes pΓ©gase", "Pegasus-Stiefel€" }, // "Botas de Pegaso" + Text{ "Boots of Speed", "Bottes de vitesse", "Tempostiefel€" }, // "Botas del desierto" }; trickNameTable[RG_WEIRD_EGG] = { - Text{ "Poached Egg", "Oeuf Γ  la coque", "Huevo pasado" }, - Text{ "Lon Lon Egg", "Oeuf Lon Lon", "Huevo Lon Lon" }, - Text{ "Zora Egg", "Oeuf Zora", "Huevo Zora" }, + Text{ "Poached Egg", "Oeuf Γ  la coque", "Spiegelei" }, // "Huevo pasado" + Text{ "Lon Lon Egg", "Oeuf Lon Lon", "Lon Lon-Ei" }, // "Huevo Lon Lon" + Text{ "Zora Egg", "Oeuf Zora", "Zora-Ei" }, // "Huevo Zora" }; trickNameTable[RG_ZELDAS_LETTER] = { - Text{ "Ruto's Letter", "Lettre de Ruto", "Carta de Ruto" }, - Text{ "Royal Letter", "Lettre Eoyale", "Carta para Kafei" }, - Text{ "Zelda's Business Card", "Carte d'affaires de Zelda", "Carta" }, - Text{ "Letter to Kafei", "Lettre pour Kafei", "Carta para Kafei " }, - Text{ "Goat's Letter", "Lettre de la ChΓ¨vre", "Carta de la Cabra" }, - Text{ "Maggie's Letter", "Lettre de Maggy", "Carta de Dolores" }, + Text{ "Ruto's Letter", "Lettre de Ruto", "Rutos Brief" }, // "Carta de Ruto" + Text{ "Royal Letter", "Lettre Eoyale", "Royaler Brief" }, // "Carta para Kafei" + Text{ "Zelda's Business Card", "Carte d'affaires de Zelda", "Zeldas Visitenkarte" }, // "Carta" + Text{ "Letter to Kafei", "Lettre pour Kafei", "Brief an Kafei" }, // "Carta para Kafei" + Text{ "Goat's Letter", "Lettre de la ChΓ¨vre", "Brief der Ziege" }, // "Carta de la Cabra" + Text{ "Maggie's Letter", "Lettre de Maggy", "Dolores' Brief" }, // "Carta de Dolores" }; trickNameTable[RG_BOOMERANG] = { - Text{ "Banana", "Banane", "PlΓ‘tano" }, - Text{ "Prank Fetch Toy", "InsΓ©parable BΓ’tonnet", "Bumerang" }, - Text{ "Gale Boomerang", "Boomerang Tornade", "BumerΓ‘n tornado" }, - Text{ "Magic Boomerang", "Boomerang Magique", "BumerΓ‘n mΓ‘gico" }, + Text{ "Banana", "Banane", "Banane" }, // "PlΓ‘tano" + Text{ "Prank Fetch Toy", "InsΓ©parable BΓ’tonnet", "Boomerang" }, // "Bumerang" + Text{ "Gale Boomerang", "Boomerang Tornade", "Sturmbumerang" }, // "BumerΓ‘n tornado" + Text{ "Magic Boomerang", "Boomerang Magique", "Magischer Bumerang" }, // "BumerΓ‘n mΓ‘gico" }; trickNameTable[RG_LENS_OF_TRUTH] = { - Text{ "Sheikah-leidoscope", "Sheikah-lΓ©idoscope", "MonΓ³culo de la Verdad" }, - Text{ "Sheikah Sensor", "Sonar Sheikah", "Sensor Sheikah" }, - Text{ "Crystal of Vision", "Cristal de Vision", "Cristal de VisiΓ³n" }, - Text{ "Magnifying Lens", "Loupe", "Lente Aumentadora" }, + Text{ "Sheikah-leidoscope", "Sheikah-lΓ©idoscope", "Shiekah-leidoskop" }, // "MonΓ³culo de la Verdad" + Text{ "Sheikah Sensor", "Sonar Sheikah", "Shiekah-Sensor" }, // "Sensor Sheikah" + Text{ "Crystal of Vision", "Cristal de Vision", "Kristall der Sicht" }, // "Cristal de VisiΓ³n" + Text{ "Magnifying Lens", "Loupe", "Magische Lupe" }, // "Lente Aumentadora" }; trickNameTable[RG_MEGATON_HAMMER] = { - Text{ "Goron Gavel", "Masse Perforatrice", "Mazo Goron" }, - Text{ "Magic Hammer", "Marteau Magique", "Martillo mΓ‘gico" }, - Text{ "Skull Hammer", "Maillet Ressort", "Martillo de hierro" }, + Text{ "Goron Gavel", "Masse Perforatrice", "Goronen-Hammer" }, // "Mazo Goron" + Text{ "Magic Hammer", "Marteau Magique", "Magischer Hammer" }, // "Martillo mΓ‘gico" + Text{ "Skull Hammer", "Maillet Ressort", "SchΓ€del-Hammer" }, // "Martillo de hierro" }; trickNameTable[RG_STONE_OF_AGONY] = { - Text{ "Cave Charm", "Charme de grotte", "Amuleto de la cueva" }, - Text{ "Stone of Agahnim", "Fragment d'Agahnim", "Piedra de Agahnim" }, - Text{ "Shard of Agony", "Fragment de Souffrance", "Piedra de la AgonΓ­a" }, - Text{ "Pirate's Charm", "Pierre de Pirate", "Amuleto Pirata" }, + Text{ "Cave Charm", "Charme de grotte", "HΓΆhlenamulett" }, // "Amuleto de la cueva" + Text{ "Stone of Agahnim", "Fragment d'Agahnim", "Stein des Agahnim" }, // "Piedra de Agahnim" + Text{ "Shard of Agony", "Fragment de Souffrance", "Scherbe des Wissens" }, // "Piedra de la AgonΓ­a" + Text{ "Pirate's Charm", "Pierre de Pirate", "Links Talisman" }, // "Amuleto Pirata" }; trickNameTable[RG_DINS_FIRE] = { - Text{ "Eldin's Fire", "Feu d'Eldin", "Fuego de Eldin" }, - Text{ "Din's Blaze", "Flamme de Din", "Poder de Din" }, - Text{ "Magic Lantern", "Lanterne Magique", "Linterna mΓ‘gica" }, - Text{ "Ether Medallion", "MΓ©daillon d'Γ‰ther", "MedallΓ³n de Tesoro" }, - Text{ "Bombos Medallion", "MΓ©daillon des Flammes", "MedallΓ³n del Temblor" }, + Text{ "Eldin's Fire", "Feu d'Eldin", "Eldins Feuerinferno" }, // "Fuego de Eldin" + Text{ "Din's Blaze", "Flamme de Din", "Dins Flammen" }, // "Poder de Din" + Text{ "Magic Lantern", "Lanterne Magique", "Magische Laterne" }, // "Linterna mΓ‘gica" + Text{ "Ether Medallion", "MΓ©daillon d'Γ‰ther", "Luft-Medaillon" }, // "MedallΓ³n de Tesoro" + Text{ "Bombos Medallion", "MΓ©daillon des Flammes", "Feuer-Medaillon" }, // "MedallΓ³n del Temblor" }; trickNameTable[RG_FARORES_WIND] = { - Text{ "Faron's Wind", "Vent de Firone", "Viento de Farone" }, - Text{ "Farore's Windfall", "ZΓ©phyr de Farore", "Valor de Farore" }, - Text{ "Tingle Air", "Tingle Air", "Tingle de aire" }, - Text{ "Travel Medallion", "Amulette de tΓ©lΓ©portation", "MedallΓ³n Maligno" }, - Text{ "Irene's Taxi", "Le taxi d'AΓ«line", "El taxi de AirΓ­n" }, + Text{ "Faron's Wind", "Vent de Firone", "Phirones Donnersturm" }, // "Viento de Farone" + Text{ "Farore's Windfall", "ZΓ©phyr de Farore", "Farores Wind" }, // "Valor de Farore" + Text{ "Tingle Air", "Tingle de aire", "Tingle Luft" }, // "Tingle Air" + Text{ "Travel Medallion", "Amulette de tΓ©lΓ©portation", "Teleport-Medaillon" }, // "MedallΓ³n Maligno" + Text{ "Irene's Taxi", "Le taxi d'AΓ«line", "Irenes Taxi" }, // "El taxi de AirΓ­n" }; trickNameTable[RG_NAYRUS_LOVE] = { - Text{ "Lanayru's Love", "Amour de Lanelle", "Amor de Lanayru" }, - Text{ "Nayru's Passion", "Passion de Nayru", "SabidurΓ­a de Nayru" }, - Text{ "Tingle Shield", "Bouclier Tingle", "Escudo de hormigueo" }, - Text{ "Shield Spell", "Bouclier Magique", "Hechizo de ProtecciΓ³n" }, - Text{ "Magic Armor", "Armure Magique", "Armadura mΓ‘gica" }, + Text{ "Lanayru's Love", "Amour de Lanelle", "Ranelles Umarmung" }, // "Amor de Lanayru" + Text{ "Nayru's Passion", "Passion de Nayru", "Nayrus Hingabe" }, // "SabidurΓ­a de Nayru" + Text{ "Tingle Shield", "Bouclier Tingle", "Tingleschild" }, // "Escudo de hormigueo" + Text{ "Shield Spell", "Bouclier Magique", "Schildzauber" }, // "Hechizo de ProtecciΓ³n" + Text{ "Magic Armor", "Armure Magique", "Magie-RΓΌstung" }, // "Armadura mΓ‘gica" }; trickNameTable[RG_FIRE_ARROWS] = { - Text{ "Fire Rod", "Baguette de feu", "Cetro de fuego" }, - Text{ "Bomb Arrow", "FlΓ¨che-Bombe", "Flecha bomba" }, - Text{ "Red Candle", "Bougie Rouge", "Vela roja" }, + Text{ "Fire Rod", "Baguette de feu", "Feuerstab" }, // "Cetro de fuego" + Text{ "Bomb Arrow", "FlΓ¨che-Bombe", "Bomben-Pfeile€" }, // "Flecha bomba" + Text{ "Red Candle", "Bougie Rouge", "Rote Kerze" }, // "Vela roja" }; trickNameTable[RG_ICE_ARROWS] = { - Text{ "Ice Rod", "Baguette des Glaces", "Cetro de Hielo" }, - Text{ "Ancient Arrow", "FlΓ¨che ArchΓ©onique", "Flecha ancestral" }, - Text{ "Ice Trap Arrow", "FlΓ¨che de PiΓ¨ge de Glace", "Cetro de hielo" }, + Text{ "Ice Rod", "Baguette des Glaces", "Eisstab" }, // "Cetro de Hielo" + Text{ "Ancient Arrow", "FlΓ¨che ArchΓ©onique", "Antike Pfeile€" }, // "Flecha ancestral" + Text{ "Ice Trap Arrow", "FlΓ¨che de PiΓ¨ge de Glace", "Eisfallen-Pfeile€" }, // "Cetro de hielo" }; trickNameTable[RG_LIGHT_ARROWS] = { - Text{ "Wind Arrow", "FlΓ¨che de Vent", "Flecha del Viento" }, - Text{ "Wand of Gamelon", "Baguette de Gamelon", "Varita de GamelΓ³n" }, - Text{ "Shock Arrow", "FlΓ¨ches Γ‰lectriques", "Flecha elΓ©ctrica" }, - Text{ "Silver Arrow", "FlΓ¨ches d'Argent", "Flecha de plata" }, + Text{ "Wind Arrow", "FlΓ¨che de Vent", "Wind-Pfeile€" }, // "Flecha del Viento" + Text{ "Wand of Gamelon", "Baguette de Gamelon", "Zauberstab von Gamelon" }, // "Varita de GamelΓ³n" + Text{ "Shock Arrow", "FlΓ¨ches Γ‰lectriques", "Elektro-Pfeile€" }, // "Flecha elΓ©ctrica" + Text{ "Silver Arrow", "FlΓ¨ches d'Argent", "Silber-Pfeile€" }, // "Flecha de plata" }; trickNameTable[RG_GERUDO_MEMBERSHIP_CARD] = { - Text{ "Desert Title Deed", "Abonnement Gerudo", "Escritura del desierto" }, - Text{ "Sickle Moon Flag", "Drapeau du croissant de lune", "Bandera de la Luna Creciente" }, - Text{ "Complimentary ID", "Bon de fΓ©licitation", "CupΓ³n especial" }, - Text{ "Gerudo's Card", "Carte Goron", "TΓ³ken Gerudo" }, - Text{ "Gerudo's Membership Card", "Autographe de Nabooru", "Tarjeta Gerudo" }, + Text{ "Desert Title Deed", "Abonnement Gerudo", "WΓΌsten-Urkunde" }, // "Escritura del desierto" + Text{ "Sickle Moon Flag", "Drapeau du croissant de lune", + "Mondsichel-Fahne" }, // "Bandera de la Luna Creciente" + Text{ "Complimentary ID", "Bon de fΓ©licitation", "Laudatio-Schein" }, // "CupΓ³n especial" + Text{ "Gerudo's Card", "Carte Goron", "Gerudo-Symbol" }, // "TΓ³ken Gerudo" + Text{ "Gerudo's Membership Card", "Autographe de Nabooru", "Gerudo-Mitgliedskarte" }, // "Tarjeta Gerudo" }; trickNameTable[RG_MAGIC_BEAN_PACK] = { - Text{ "Funky Bean Pack", "Paquet de FΓ¨ves Magiques", "Lote de frijoles mΓ‘gicos" }, - Text{ "Grapple Berries", "Baies de grappin", "Bayas de garfio" }, - Text{ "Crenel Bean Pack", "Paquet de Haricots Gonggle", "Lote de alubias mΓ‘gicas" }, - Text{ "Mystical Seed Pack", "Pack de graines mystiques", "Paquete de semillas mΓ­sticas" }, + Text{ "Funky Bean Pack", "Paquet de FΓ¨ves Magiques", "Wunderbohnen-Packung" }, // "Lote de frijoles mΓ‘gicos" + Text{ "Grapple Berries", "Baies de grappin", "Grapple-Beeren€" }, // "Bayas de garfio" + Text{ "Crenel Bean Pack", "Paquet de Haricots Gonggle", "Gongolerbsen-Packung" }, // "Lote de alubias mΓ‘gicas" + Text{ "Mystical Seed Pack", "Pack de graines mystiques", "Saatbeutel" }, // "Paquete de semillas mΓ­sticas" }; trickNameTable[RG_DOUBLE_DEFENSE] = { - Text{ "Diamond Hearts", "Coeurs de Diamant", "Contenedor de diamante" }, - Text{ "Double Damage", "Double Souffrance", "Doble daΓ±o receptivo" }, - Text{ "Quadruple Defence", "Quadruple DΓ©fence", "Defensa cuΓ‘druple" }, + Text{ "Diamond Hearts", "Coeurs de Diamant", "Diamantherzen€" }, // "Contenedor de diamante" + Text{ "Double Damage", "Double Souffrance", "Doppelte Angriffskraft" }, // "Doble daΓ±o receptivo" + Text{ "Quadruple Defence", "Quadruple DΓ©fence", "Vierfache Verteidigung" }, // "Defensa cuΓ‘druple" }; trickNameTable[RG_POCKET_EGG] = { - Text{ "Arpagos Egg", "Oeuf d'Arpagos", "Huevo de Arpagos" }, - Text{ "Lon Lon Egg", "oeuf Lon Lon", "Huevo Lon Lon" }, - Text{ "Zora Egg", "oeuf Zora", "Huevo del Pez Viento" }, + Text{ "Arpagos Egg", "Oeuf d'Arpagos", "Arpagos-Ei" }, // "Huevo de Arpagos" + Text{ "Lon Lon Egg", "oeuf Lon Lon", "Lon Lon-Ei" }, // "Huevo Lon Lon" + Text{ "Zora Egg", "oeuf Zora", "Zora-Ei" }, // "Huevo del Pez Viento" }; trickNameTable[RG_POCKET_EGG] = { - Text{ "D.I.Y. Alarm Clock", "RΓ©veille-matin improvisΓ©", "Alarma emplumada portΓ‘til" }, - Text{ "Kakariko Cucco", "Cocotte Cocorico", "Cuco de Kakariko" }, - Text{ "Hatched Cucco", "Cocotte Γ©close", "Pollo de bolsillo" }, + Text{ "D.I.Y. Alarm Clock", "RΓ©veille-matin improvisΓ©", + "Improvisierter Wecker" }, // "Alarma emplumada portΓ‘til" + Text{ "Kakariko Cucco", "Cocotte Cocorico", "Kakariko-Huhn" }, // "Cuco de Kakariko" + Text{ "Hatched Cucco", "Cocotte Γ©close", "GeschlΓΌpftes KΓΌken" }, // "Pollo de bolsillo" }; trickNameTable[RG_COJIRO] = { - Text{ "Blucco", "Chair-Qui-Poule", "Cucazul" }, - Text{ "Piyoko", "Piyoko", "Piyoko" }, - Text{ "Dark Cucco", "Cocotte Sombre", "Cucco oscuro" }, - Text{ "Grog's Cucco", "Cocotte de Grog", "Cuco de Grog" }, + Text{ "Blucco", "Chair-Qui-Poule", "Blenni" }, // "Cucazul" + Text{ "Piyoko", "Piyoko", "Piyoko" }, // "Piyoko" + Text{ "Dark Cucco", "Cocotte Sombre", "Dunkles Huhn" }, // "Cucco oscuro" + Text{ "Grog's Cucco", "Cocotte de Grog", "Grogs Huhn" }, // "Cuco de Grog" }; trickNameTable[RG_ODD_MUSHROOM] = { - Text{ "Magic Mushroom", "Champignon magique", "ChampiΓ±Γ³n mΓ‘gico" }, - Text{ "Endura Shroom", "Champi Vigueur", "ChampiΓ±Γ³n del bosque" }, - Text{ "Sleepy Toadstool", "Crapaud FatiguΓ©", "Seta durmiente" }, - Text{ "Mushroom", "Champignon", "Seta" }, + Text{ "Magic Mushroom", "Champignon magique", "Magischer Pilz" }, // "ChampiΓ±Γ³n mΓ‘gico" + Text{ "Endura Shroom", "Champi Vigueur", "Fittling" }, // "ChampiΓ±Γ³n del bosque" + Text{ "Sleepy Toadstool", "Crapaud FatiguΓ©", "Schlummermorchel" }, // "Seta durmiente" + Text{ "Mushroom", "Champignon", "Pilz" }, // "Seta" }; trickNameTable[RG_ODD_POTION] = { - Text{ "Odd Medicine", "Γ‰lixir suspect", "PociΓ³n rara" }, - Text{ "Granny's Poultice", "Mixture de Granny", "Medicina de la abuela" }, - Text{ "Mushroom Poultice", "Mixture de champignon", "Medicina de champiΓ±ones" }, - Text{ "Secret Medicine", "MΓ©dicament", "PΓ³cima secreta" }, - Text{ "Mushroom Spores", "Spores de Champignons", "Esporas de hongos" }, - Text{ "Hanyu Spore", "Hanyu Spore", "Espora Hanyu" }, + Text{ "Odd Medicine", "Γ‰lixir suspect", "Moderpaket" }, // "PociΓ³n rara" + Text{ "Granny's Poultice", "Mixture de Granny", "Omas Mixtur" }, // "Medicina de la abuela" + Text{ "Mushroom Poultice", "Mixture de champignon", "Pilzumschlag" }, // "Medicina de champiΓ±ones" + Text{ "Secret Medicine", "MΓ©dicament", "Geheime Medizin" }, // "PΓ³cima secreta" + Text{ "Mushroom Spores", "Spores de Champignons", "Pilzsporen" }, // "Esporas de hongos" + Text{ "Hanyu Spore", "Hanyu Spore", "Hanyu-Sporen" }, // "Espora Hanyu" }; trickNameTable[RG_POACHERS_SAW] = { - Text{ "Carpenter's Saw", "Scie du charpentier", "Sierra del carpintero" }, - Text{ "Poacher's Sword", "Hache du chasseur", "Espada del capataz" }, - Text{ "Ancient Bladesaw", "Longue Γ‰pΓ©e ArchΓ©onique", "Mandoble ancestral" }, - Text{ "Woodcutter's Axe", "Hache du BΓ»cheron", "Hacha de leΓ±ador" }, - Text{ "Grog's Saw", "Scie de Grog", "Sierra del Cazador Furtivo" }, + Text{ "Carpenter's Saw", "Scie du charpentier", "ZimmermannssΓ€ge" }, // "Sierra del carpintero" + Text{ "Poacher's Sword", "Hache du chasseur", "Wildererschwert" }, // "Espada del capataz" + Text{ "Ancient Bladesaw", "Longue Γ‰pΓ©e ArchΓ©onique", "Antike GroßsΓ€ge" }, // "Mandoble ancestral" + Text{ "Woodcutter's Axe", "Hache du BΓ»cheron", "HolzfΓ€lleraxt" }, // "Hacha de leΓ±ador" + Text{ "Grog's Saw", "Scie de Grog", "Grogs SΓ€ge" }, // "Sierra del Cazador Furtivo" }; trickNameTable[RG_BROKEN_SWORD] = { - Text{ "Broken Biggoron's Sword", "Γ‰pΓ©e brisΓ©e de Grogoron", "Espada de Biggoron rota" }, - Text{ "Broken Giant's Knife", "Lame des GΓ©ants brisΓ©e", "Daga gigante rota" }, - Text{ "Broken Noble Sword", "Γ‰pΓ©e noble brisΓ©e", "Espada noble rota" }, - Text{ "Broken Picori Blade", "Γ‰pΓ©e Minish brisΓ©e", "Espada minish rota" }, - Text{ "Decayed Master Sword", "Γ‰pΓ©e de lΓ©gende pourrie", "Espada decadente de leyenda" }, + Text{ "Broken Biggoron's Sword", "Γ‰pΓ©e brisΓ©e de Grogoron", + "zerbr. Biggoron-Schwert" }, // "Espada de Biggoron rota" + Text{ "Broken Giant's Knife", "Lame des GΓ©ants brisΓ©e", "zerbr. Langschwert" }, // "Daga gigante rota" + Text{ "Broken Noble Sword", "Γ‰pΓ©e noble brisΓ©e", "zerbr. Edelschwert" }, // "Espada noble rota" + Text{ "Broken Picori Blade", "Γ‰pΓ©e Minish brisΓ©e", "zerbr. Schwert der Minish" }, // "Espada minish rota" + Text{ "Decayed Master Sword", "Γ‰pΓ©e de lΓ©gende pourrie", + "zerfr. Master-Schwert" }, // "Espada decadente de leyenda" }; trickNameTable[RG_PRESCRIPTION] = { - Text{ "Biggoron's Prescription", "Ordonnance de Grogoron", "Receta de Biggoron" }, - Text{ "Eyedrop Prescription", "Ordonnance de gouttes", "Receta ocular" }, - Text{ "Urgent Prescription", "Ordonnance urgente", "PrescripciΓ³n" }, - Text{ "Swordsman's Scroll", "PrΓ©cis d'escrime", "Esgrimidorium" }, - Text{ "Portrait of Oren", "Portrait d'OrlΓ¨ne", "Retrato de Oren" }, - Text{ "Letter to King Zora", "Lettre au roi Zora", "Carta al Rey Zora" }, + Text{ "Biggoron's Prescription", "Ordonnance de Grogoron", "Biggorons Rezept" }, // "Receta de Biggoron" + Text{ "Eyedrop Prescription", "Ordonnance de gouttes", "Augentropfen-Rezept" }, // "Receta ocular" + Text{ "Urgent Prescription", "Ordonnance urgente", "Dringendes Rezept" }, // "PrescripciΓ³n" + Text{ "Swordsman's Scroll", "PrΓ©cis d'escrime", "Schwert-Rolle" }, // "Esgrimidorium" + Text{ "Portrait of Oren", "Portrait d'OrlΓ¨ne", "Portrait von Oreen" }, // "Retrato de Oren" + Text{ "Letter to King Zora", "Lettre au roi Zora", "Brief an KΓΆnig Zora" }, // "Carta al Rey Zora" }; trickNameTable[RG_EYEBALL_FROG] = { - Text{ "Don Gero", "Don Gero", "Don Gero" }, - Text{ "Hot-Footed Frog", "Grenouille Γ  pieds chauds", "Rana de patas calientes" }, - Text{ "Lost Swordsmith", "Forgeron perdu", "EspadachΓ­n perdido" }, - Text{ "Eyedrop Frog", "Grenouille-qui-louche", "Globo Ocular de Rana" }, + Text{ "Don Gero", "Don Gero", "Don Gero" }, // "Don Gero" + Text{ "Hot-Footed Frog", "Grenouille Γ  pieds chauds", "SpurtkrΓΆte" }, // "Rana de patas calientes" + Text{ "Lost Swordsmith", "Forgeron perdu", "Vermisster Schmied" }, // "EspadachΓ­n perdido" + Text{ "Eyedrop Frog", "Grenouille-qui-louche", "Augentropfen-Frosch" }, // "Globo Ocular de Rana" }; trickNameTable[RG_EYEDROPS] = { - Text{ "Biggoron's Eyedrops", "Gouttes de Grogoron", "Gotas de Biggoron" }, - Text{ "Hyrule's Finest Eyedrops", "Eau du Lac Hylia", "Gotas oculares" }, - Text{ "Moon's Tear", "Larme de Lune", "LΓ‘grima de Luna" }, - Text{ "Engine Grease", "Graisse moteur", "Grasa del motor" }, - Text{ "Zora Perfume", "Parfum Zora", "Perfume Zora" }, + Text{ "Biggoron's Eyedrops", "Gouttes de Grogoron", "Biggorons Augentropfen" }, // "Gotas de Biggoron" + Text{ "Hyrule's Finest Eyedrops", "Eau du Lac Hylia", "Hyrules beste Augentropfen" }, // "Gotas oculares" + Text{ "Moon's Tear", "Larme de Lune", "MondtrΓ€ne" }, // "LΓ‘grima de Luna" + Text{ "Engine Grease", "Graisse moteur", "Schmierfett" }, // "Grasa del motor" + Text{ "Zora Perfume", "Parfum Zora", "Zora-ParfΓΌm" }, // "Perfume Zora" }; trickNameTable[RG_CLAIM_CHECK] = { - Text{ "Clay Check", "Certificat Grogoron", "Comprobante de ReclamaciΓ³n" }, - Text{ "Ancient Tablet", "StΓ¨le ancienne", "LitografΓ­a arcana" }, - Text{ "Sheikah Slate", "Tablette Sheikah", "Piedra Sheikah" }, - Text{ "Cyclone Slate", "Ardoise des tornades", "Pizarra de los Torbellinos" }, + Text{ "Clay Check", "Certificat Grogoron", "Berg-Urkunde" }, // "Comprobant e de ReclamaciΓ³n" + Text{ "Ancient Tablet", "StΓ¨le ancienne", "Alte Steintafel" }, // "LitografΓ­a arcana" + Text{ "Sheikah Slate", "Tablette Sheikah", "Shiekah-Stein" }, // "Piedra Sheikah" + Text{ "Cyclone Slate", "Ardoise des tornades", "Froschkompass" }, // "Pizarra de los Torbellinos" }; trickNameTable[RG_GOLD_SKULLTULA_TOKEN] = { - Text{ "Skulltula Token", "Bon de Skulltula dorΓ©e", "SΓ­mbolo de Skulltula" }, - Text{ "Golden Skulltula Spirit", "PiΓ¨ce de Skulltula dorΓ©e", "TΓ³ken de Skulltula Dorada" }, - Text{ "Gold Walltula Token", "Jeton de Walltula dorΓ©e", "Skulltula dorada" }, - Text{ "Maiamai", "Ti'gorneau", "Maimai" }, - Text{ "Gratitude Crystal", "Cristal de gratitude", "Gema de gratitud" }, - Text{ "Korok Seed", "Noix korogu", "Semilla de kolog" }, + Text{ "Skulltula Token", "Bon de Skulltula dorΓ©e", "Skulltula-Beweis" }, // "SΓ­mbolo de Skulltula" + Text{ "Golden Skulltula Spirit", "PiΓ¨ce de Skulltula dorΓ©e", "Skulltula-Seele" }, // "TΓ³ken de Skulltula Dorada" + Text{ "Gold Walltula Token", "Jeton de Walltula dorΓ©e", "Walltula-Symbol" }, // "Skulltula dorada" + Text{ "Maiamai", "Ti'gorneau", "Maimai" }, // "Maimai" + Text{ "Gratitude Crystal", "Cristal de gratitude", "Juwel der GΓΌte" }, // "Gema de gratitud" + Text{ "Korok Seed", "Noix korogu", "Krog-Samen" }, // "Semilla de kolog" }; trickNameTable[RG_PROGRESSIVE_HOOKSHOT] = { - Text{ "Progressive Grappling Hook", "Lance-chaΓne (prog.)", "Garra progresiva" }, - Text{ "Progressive Clawshot", "Grappin-griffe (prog.)", "Zarpa progresiva" }, - Text{ "Progressive Gripshot", "Grappince (prog.)", "Enganchador progresivo" }, - Text{ "Progressive Rope", "Corde (prog.)", "Cuerda progresivo" }, + Text{ "Progressive Grappling Hook", "Lance-chaΓne (prog.)", "Enterhaken (prog.)" }, // "Garra progresiva" + Text{ "Progressive Clawshot", "Grappin-griffe (prog.)", "Greifhaken (prog.)" }, // "Zarpa progresiva" + Text{ "Progressive Gripshot", "Grappince (prog.)", "Tauschhaken (prog.)" }, // "Enganchador progresivo" + Text{ "Progressive Rope", "Corde (prog.)", "Giftwurm (prog.)" }, // "Cuerda progresivo" }; trickNameTable[RG_PROGRESSIVE_STRENGTH] = { - Text{ "Power Glove", "Gant de Puissance (prog.)", "Guanteletes progresivos" }, - Text{ "Power Bracelet", "Bracelet de Force (prog.)", "Brasaletes progresivos" }, - Text{ "Magic Bracelet", "Bracelet Magique (prog.)", "Manoplas progresivas" }, + Text{ "Power Glove", "Gant de Puissance (prog.)", "Krafthandschuh (prog.)" }, // "Guanteletes progresivos" + Text{ "Power Bracelet", "Bracelet de Force (prog.)", "Kraftarmband (prog.)" }, // "Brasaletes progresivos" + Text{ "Magic Bracelet", "Bracelet Magique (prog.)", "Magiearmband (prog.)" }, // "Manoplas progresivas" }; trickNameTable[RG_PROGRESSIVE_BOMB_BAG] = { - Text{ "Progressive Bomb Capacity", "CapacitΓ© de bombes (prog.)", "Mayor capacidad de bombas" }, - Text{ "Progressive Bomb Pack", "Paquet de bombes (prog.)", "ZurrΓ³n de bombas progresivo" }, - Text{ "Progressive Bomb Box", "BoΓte Γ  bombes (prog.)", "Bolsa de bombas progresiva" }, - Text{ "Progressive Blast Mask", "Masque d'Explosion (prog.)", "MΓ‘scara explosiva progresiva" }, - Text{ "Progressive Powder Kegs", "Baril de Poudre (prog.)", "Barril de polvo progresivo" }, - Text{ "Progressive Remote Bombs", "Bombes Γ  distance (prog.)", "Bombas remotas progresivas" }, + Text{ "Progressive Bomb Capacity", "CapacitΓ© de bombes (prog.)", + "Bomben-KapazitΓ€t (prog.)" }, // "Mayor capacidad de bombas" + Text{ "Progressive Bomb Pack", "Paquet de bombes (prog.)", + "Bombenrucksack (prog.)" }, // "ZurrΓ³n de bombas progresivo" + Text{ "Progressive Bomb Box", "BoΓte Γ  bombes (prog.)", + "Bombenschachtel (prog.)" }, // "Bolsa de bombas progresiva" + Text{ "Progressive Blast Mask", "Masque d'Explosion (prog.)", + "Ka-Bumm-Maske (prog.)" }, // "MΓ‘scara explosiva progresiva" + Text{ "Progressive Powder Kegs", "Baril de Poudre (prog.)", + "Pulverfass (prog.)" }, // "Barril de polvo progresivo" + Text{ "Progressive Remote Bombs", "Bombes Γ  distance (prog.)", + "FernzΓΌnderbomben (prog.)€" }, // "Bombas remotas progresivas" }; trickNameTable[RG_PROGRESSIVE_BOW] = { - Text{ "Progressive Arrow Capacity", "CapacitΓ© de flΓ¨ches (prog.)", "Mayor capacidad de flechas" }, - Text{ "Progressive Hero's Bow", "Arc du hΓ©ros (prog.)", "Arco del hΓ©roe progresivo" }, - Text{ "Progressive Arrow Holder", "ArbalΓ¨te (prog.)", "Ballesta progresiva" }, - Text{ "Progressive Crossbow", "ArbalΓ¨te (prog.)", "Ballesta progresiva" }, - Text{ "Progressive Sacred Bow", "Arc sacrΓ© (prog)", "Arco Sagrado Progresivo" }, - Text{ "Progressive Lynel Bow", "Arc de Lynel (prog.)", "Arco de centaleΓ³n Progresivo" }, + Text{ "Progressive Arrow Capacity", "CapacitΓ© de flΓ¨ches (prog.)", + "Pfeil-KapazitΓ€t (prog.)" }, // "Mayor capacidad de flechas" + Text{ "Progressive Hero's Bow", "Arc du hΓ©ros (prog.)", "Heroenbogen (prog.)" }, // "Arco del hΓ©roe progresivo" + Text{ "Progressive Arrow Holder", "ArbalΓ¨te (prog.)", "KΓΆcher (prog.)" }, // "Ballesta progresiva" + Text{ "Progressive Crossbow", "ArbalΓ¨te (prog.)", "Armbrust (prog.)" }, // "Ballesta progresiva" + Text{ "Progressive Sacred Bow", "Arc sacrΓ© (prog)", "Heiliger Bogen (prog.)" }, // "Arco Sagrado Progresivo" + Text{ "Progressive Lynel Bow", "Arc de Lynel (prog.)", + "Leunenbogen (prog.)" }, // "Arco de centaleΓ³n Progresivo" }; trickNameTable[RG_PROGRESSIVE_SLINGSHOT] = { - Text{ "Progressive Seed Capacity", "CapacitΓ© de graines (prog.)", "Mayor capacidad de semillas" }, - Text{ "Progressive Catapult", "Catapulte (prog.)", "Catapulta progresiva" }, - Text{ "Progressive Scattershot", "Lance-Pierre rafale (prog.)", "Resortera mΓΊltiple progresiva" }, - Text{ "Progressive Seed Launcher", "Lanceur de semences (prog.)", "Lanzador de semillas progresivo" }, - Text{ "Progressive Seed Satchel", "Sac de graines (prog.)", "Bolsa de semillas progresiva" }, + Text{ "Progressive Seed Capacity", "CapacitΓ© de graines (prog.)", + "Kern-KapazitΓ€t (prog.)" }, // "Mayor capacidad de semillas" + Text{ "Progressive Catapult", "Catapulte (prog.)", "Katapult (prog.)" }, // "Catapulta progresiva" + Text{ "Progressive Scattershot", "Lance-Pierre rafale (prog.)", + "Streuschleuder (prog.)" }, // "Resortera mΓΊltiple progresiva" + Text{ "Progressive Seed Launcher", "Lanceur de semences (prog.)", + "Blasrohr (prog.)" }, // "Lanzador de semillas progresivo" + Text{ "Progressive Seed Satchel", "Sac de graines (prog.)", + "Saatbeutel (prog.)" }, // "Bolsa de semillas progresiva" }; trickNameTable[RG_PROGRESSIVE_WALLET] = { - Text{ "Progressive Rupee Capacity", "CapacitΓ© de rubis (prog.)", "Mayor capacidad de rupias" }, - Text{ "Progressive Purse", "Sacoche (prog.)", "Cartera de rupias progresiva" }, - Text{ "Progressive Rupee Bag", "Sac Γ  rubis (prog.)", "ZurrΓ³n de rupias progresivo" }, - Text{ "Progressive Rupoor Capacity", "CapacitΓ© de Roupir (prog.)", "Capacidad progresiva Rupobre" }, - Text{ "Progressive Spoils Bag", "Sac Γ  Butin (prog.)", "Bolsa de trofeos progresiva" }, - Text{ "Progressive Ruby Bag", "CapacitΓ© du sac Ruby (prog.)", "Bolso Ruby progresivo" }, + Text{ "Progressive Rupee Capacity", "CapacitΓ© de rubis (prog.)", + "Rubin-KapazitΓ€t (prog.)" }, // "Mayor capacidad de rupias" + Text{ "Progressive Purse", "Sacoche (prog.)", "Portemonnaie (prog.)" }, // "Cartera de rupias progresiva" + Text{ "Progressive Rupee Bag", "Sac Γ  rubis (prog.)", "Rubintasche (prog.)" }, // "ZurrΓ³n de rupias progresivo" + Text{ "Progressive Rupoor Capacity", "CapacitΓ© de Roupir (prog.)", + "Rubinfalle (prog.)" }, // "Capacidad progresiva Rupobre" + Text{ "Progressive Spoils Bag", "Sac Γ  Butin (prog.)", "Beutetasche (prog.)" }, // "Bolsa de trofeos progresiva" + Text{ "Progressive Ruby Bag", "CapacitΓ© du sac Ruby (prog.)", "Rubytasche (prog.)" }, // "Bolso Ruby progresivo" }; trickNameTable[RG_PROGRESSIVE_SCALE] = { - Text{ "Progressive Flippers", "Palmes de Zora (prog.)", "Aletas de zora progresiva" }, - Text{ "Progressive Dragon's Scale", "Γ‰caille du dragon d'eau (prog.)", "Escama dragΓ³n acuΓ‘tico progresiva" }, - Text{ "Progressive Diving Ability", "PlongΓ©e (prog.)", "Buceo progresivo" }, - Text{ "Progressive Pearl", "Perle (prog.)", "Perla progresiva" }, - Text{ "Progressive Scute", "Bulle (prog.)", "Fragmento Zora progresivo" }, + Text{ "Progressive Flippers", "Palmes de Zora (prog.)", + "Schwimmflossen (prog.)€" }, // "Aletas de zora progresiva" + Text{ "Progressive Dragon's Scale", "Γ‰caille du dragon d'eau (prog.)", + "Drachen-Schuppe (prog.)" }, // "Escama dragΓ³n acuΓ‘tico progresiva" + Text{ "Progressive Diving Ability", "PlongΓ©e (prog.)", "TauchfΓ€higkeit (prog.)" }, // "Buceo progresivo" + Text{ "Progressive Pearl", "Perle (prog.)", "Perle (prog.)" }, // "Perla progresiva" + Text{ "Progressive Scute", "Bulle (prog.)", "Schuppe (prog.)" }, // "Fragmento Zora progresivo" }; trickNameTable[RG_PROGRESSIVE_NUT_UPGRADE] = { - Text{ "Progressive Nut Pack", "Paquet de noix (prog.)", "Mayor capacidad de semillas" }, - Text{ "Progressive Bait Bag", "Sac Γ  AppΓ’ts (prog.)", "Bolsa de cebo progresiva" }, - Text{ "Progressive Pear Capacity", "CapacitΓ© de poire (prog.)", "Capacidad progresiva de pera" }, - Text{ "Progressive Nut Bag", "Sac de noix (prog.)", "Bolsa de nueces progresiva" }, - Text{ "Progressive Husk Capacity", "CapacitΓ© de noisettes (prog.)", "Mayor capacidad de castaΓ±as" }, + Text{ "Progressive Nut Pack", "Paquet de noix (prog.)", + "Nußrucksack (prog.)" }, // "Mayor capacidad de semillas" + Text{ "Progressive Bait Bag", "Sac Γ  AppΓ’ts (prog.)", "Futtertasche (prog.)" }, // "Bolsa de cebo progresiva" + Text{ "Progressive Pear Capacity", "CapacitΓ© de poire (prog.)", + "Putput-KapazitΓ€t (prog.)" }, // "Capacidad progresiva de pera" + Text{ "Progressive Nut Bag", "Sac de noix (prog.)", "Nußbeutel (prog.)" }, // "Bolsa de nueces progresiva" + Text{ "Progressive Husk Capacity", "CapacitΓ© de noisettes (prog.)", + "Schalen-KapazitΓ€t (prog.)€" }, // "Mayor capacidad de castaΓ±as" }; trickNameTable[RG_PROGRESSIVE_STICK_UPGRADE] = { - Text{ "Progressive Stick Bag", "Sac de bΓ’tons (prog.)", "Mayor capacidad de ramas deku" }, - Text{ "Progressive Stick Pack", "Paquet de bΓ’tons Mojo (prog.)", "Mayor capacidad de bastones" }, + Text{ "Progressive Stick Bag", "Sac de bΓ’tons (prog.)", + "Stabbeutel (prog.)" }, // "Mayor capacidad de ramas deku" + Text{ "Progressive Stick Pack", "Paquet de bΓ’tons Mojo (prog.)", + "Stabrucksack (prog.)" }, // "Mayor capacidad de bastones" Text{ "Progressive Branch Capacity", "CapacitΓ© de la succursale (prog.)", - "Capacidad progresiva de la sucursal" }, - Text{ "Progressive Rod Capacity", "CapacitΓ© de tiges (prog.)", "Mayor capacidad de cetros deku" }, + "Ast-KapazitΓ€t (prog.)" }, // "Capacidad progresiva de la sucursal" + Text{ "Progressive Rod Capacity", "CapacitΓ© de tiges (prog.)", + "Stock-KapazitΓ€t (prog.)" }, // "Mayor capacidad de cetros deku" }; trickNameTable[RG_PROGRESSIVE_BOMBCHUS] = { - Text{ "Progressive Bomblings", "Bombinsectes (prog.)", "Bombinsectos progresivos" }, - Text{ "Progressive Sentrobe Bombs", "Bombe de SphΓ©rodrone (prog.)", "Bomba de helicobot progresivo" }, - Text{ "Progressive Bomb-ombs", "Bombe Soldat (prog.)", "Soldado bomba progresivo" }, - Text{ "Progressive Missiles", "Missiles (prog.)", "Misiles progresivos" }, - Text{ "Progressive Bombchu Bag", "Sac Γ  Bombchu (prog.)", "Bombachus progresivos" }, + Text{ "Progressive Bomblings", "Bombinsectes (prog.)", "BombenmΓ€use (prog.)€" }, // "Bombinsectos progresivos" + Text{ "Progressive Sentrobe Bombs", "Bombe de SphΓ©rodrone (prog.)", + "Rokopterbomben (prog.)€" }, // "Bomba de helicobot progresivo" + Text{ "Progressive Bomb-ombs", "Bombe Soldat (prog.)", "Bob-omb (prog.)" }, // "Soldado bomba progresivo" + Text{ "Progressive Missiles", "Missiles (prog.)", "Missiles (prog.)€" }, // "Misiles progresivos" + Text{ "Progressive Bombchu Bag", "Sac Γ  Bombchu (prog.)", + "Krabbelminenbeutel (prog.)" }, // "Bombachus progresivos" }; trickNameTable[RG_PROGRESSIVE_MAGIC_METER] = { - Text{ "Progressive Stamina Meter", "Jauge d'endurance (prog.)", "Medidor de vigor progresivo" }, - Text{ "Progressive Energy Gauge", "Jauge d'Γ©nergie (prog.)", "Medidor de energΓ­a progresivo" }, - Text{ "Progressive Magic Powder", "Poudre magique (prog.)", "Medidor de carga progresivo" }, + Text{ "Progressive Stamina Meter", "Jauge d'endurance (prog.)", + "Ausdauer (prog.)" }, // "Medidor de vigor progresivo" + Text{ "Progressive Energy Gauge", "Jauge d'Γ©nergie (prog.)", + "Energie (prog.)" }, // "Medidor de energΓ­a progresivo" + Text{ "Progressive Magic Powder", "Poudre magique (prog.)", + "Zauberpulver (prog.)" }, // "Medidor de carga progresivo" }; trickNameTable[RG_PROGRESSIVE_OCARINA] = { - Text{ "Progressive Memento", "Souvenir (prog.)", "Silbato progresivo" }, - Text{ "Progressive Whistle", "Siffler (prog.)", "Silbido progresivo" }, - Text{ "Progressive Flute", "FlΓ»te (prog.)", "Flauta progresiva" }, - Text{ "Progressive Recorder", "Harmonica (prog.)", "ArmΓ³nica progresiva" }, + Text{ "Progressive Memento", "Souvenir (prog.)", "Souvenir (prog.)" }, // "Silbato progresivo" + Text{ "Progressive Whistle", "Siffler (prog.)", "Pfeife (prog.)" }, // "Silbido progresivo" + Text{ "Progressive Flute", "FlΓ»te (prog.)", "FlΓΆte (prog.)" }, // "Flauta progresiva" + Text{ "Progressive Recorder", "Harmonica (prog.)", "Rekorder (prog.)" }, // "ArmΓ³nica progresiva" }; trickNameTable[RG_PROGRESSIVE_GORONSWORD] = { - Text{ "Progressive Titan Blade", "Lame des Titans (prog.)", "Hoja del TitΓ‘n progresiva" }, - Text{ "Progressive Goron Knife", "Lame Goron (prog.)", "Daga Goron progresiva" }, - Text{ "Progressive Giant Sword", "Γ‰pΓ©e gΓ©ante (prog.)", "Espada gigante progresiva" }, - Text{ "Progressive Darknut Sword", "Γ‰pΓ©e de Darknut (prog.)", "Espada Darknut progresiva" }, - Text{ "Progressive Power Sword", "Γ‰pΓ©e de Puissance (prog.)", "Espada de poder progresiva" }, - Text{ "Progressive Big Stabby", "Gros coup de poignard (prog.)", "Gran puΓ±alada progresiva" }, + Text{ "Progressive Titan Blade", "Lame des Titans (prog.)", + "Titanenklinge (prog.)" }, // "Hoja del TitΓ‘n progresiva" + Text{ "Progressive Goron Knife", "Lame Goron (prog.)", "Goronenmesser (prog.)" }, // "Daga Goron progresiva" + Text{ "Progressive Giant Sword", "Γ‰pΓ©e gΓ©ante (prog.)", + "Riesenschwert (prog.)" }, // "Espada gigante progresiva" + Text{ "Progressive Darknut Sword", "Γ‰pΓ©e de Darknut (prog.)", + "Gardeschwert (prog.)" }, // "Espada Darknut progresiva" + Text{ "Progressive Power Sword", "Γ‰pΓ©e de Puissance (prog.)", + "Schwert der Macht (prog.)" }, // "Espada de poder progresiva" + Text{ "Progressive Big Stabby", "Gros coup de poignard (prog.)", + "Großschwert (prog.)" }, // "Gran puΓ±alada progresiva" }; trickNameTable[RG_EMPTY_BOTTLE] = { - Text{ "Empty Canteen", "Cantine vide", "cantimplora vacΓ­a" }, - Text{ "Vial of Winds", "Fiole de vents", "Vial de Vientos" }, - Text{ "Tingle Bottle", "Flacon de Tingle", "Botella de Tingle" }, - Text{ "Magic Bottle", "Flacon magique", "Frasco feΓ©rico" }, - Text{ "Glass Bottle", "Flacon de verre", "Botella de cristal" }, - Text{ "Bottle with Water", "Flacon d'eau", "Botella Tingle" }, + Text{ "Empty Canteen", "Cantine vide", "Leere Feldflasche" }, // "cantimplora vacΓ­a" + Text{ "Vial of Winds", "Fiole de vents", "Phiole der Winde" }, // "Vial de Vientos" + Text{ "Tingle Bottle", "Flacon de Tingle", "Tingle-Flasche" }, // "Botella de Tingle" + Text{ "Magic Bottle", "Flacon magique", "Magische Flasche" }, // "Frasco feΓ©rico" + Text{ "Glass Bottle", "Flacon de verre", "Glasflasche" }, // "Botella de cristal" + Text{ "Bottle with Water", "Flacon d'eau", "Flasche (Wasser)" }, // "Botella Tingle" }; trickNameTable[RG_BOTTLE_WITH_MILK] = { - Text{ "Bottle with Chateau Romani", "Flacon de cuvΓ©e Romani", "Botella de Reserva Romani" }, - Text{ "Bottle with Premium Milk", "Flacon avec lait de qualitΓ© supΓ©rieure", "BiberΓ³n con leche Premium" }, - Text{ "Bottle with Mystery Milk", "Flacon de lait grand cru", "Botella de leche extra" }, - Text{ "Bottle with Fresh Milk", "Flacon de lait frais", "Botella de leche fresca" }, + Text{ "Bottle with Chateau Romani", "Flacon de cuvΓ©e Romani", + "Flasche (Chateau Romani)" }, // "Botella de Reserva Romani" + Text{ "Bottle with Premium Milk", "Flacon avec lait de qualitΓ© supΓ©rieure", + "Flasche (Vollmilch)" }, // "BiberΓ³n con leche Premium" + Text{ "Bottle with Mystery Milk", "Flacon de lait grand cru", + "Flasche (VerdΓ€chtige Milch)" }, // "Botella de leche extra" + Text{ "Bottle with Fresh Milk", "Flacon de lait frais", + "Flasche (Frische Milch)" }, // "Botella de leche fresca" }; trickNameTable[RG_BOTTLE_WITH_RED_POTION] = { - Text{ "Bottle with Red Chu Jelly", "Flacon de gelΓ©e Chuchu rouge", "Jugo de Chuchu Rojo" }, - Text{ "Bottle with Hibiscus Potion", "Flacon de potion de Hibiscus", "Botella de pociΓ³n de Hibisco" }, - Text{ "Bottle with Medicine of Life", "Flacon d'Γ©lixir rouge", "Botella de medicina de la vida" }, - Text{ "Bottle with Heart Potion", "Flacon de potion de soin", "Botella de pociΓ³n de salud" }, + Text{ "Bottle with Red Chu Jelly", "Flacon de gelΓ©e Chuchu rouge", + "Flasche (Rotes Schleim-Gelee)" }, // "Jugo de Chuchu Rojo" + Text{ "Bottle with Hibiscus Potion", "Flacon de potion de Hibiscus", + "Flasche (Hibiskus-Trank)" }, // "Botella de pociΓ³n de Hibisco" + Text{ "Bottle with Medicine of Life", "Flacon d'Γ©lixir rouge", + "Flasche (Roter Trank)" }, // "Botella de medicina de la vida" + Text{ "Bottle with Heart Potion", "Flacon de potion de soin", + "Flasche (Herztrank)" }, // "Botella de pociΓ³n de salud" }; trickNameTable[RG_BOTTLE_WITH_GREEN_POTION] = { - Text{ "Bottle with Green Chu Jelly", "Flacon de gelΓ©e Chuchu verte", "Jugo de Chuchu Verde" }, - Text{ "Bottle with Lamp Oil", "Flacon de Huile Γ  lanterne", "Botella de Aceite de candil " }, - Text{ "Bottle with Medicine of Magic", "Flacon d'Γ©lixir vert", "Botella de medicina mΓ‘gica" }, - Text{ "Bottle with Stamina Potion", "Flacon d'Endurol", "Botella de elixir vigorizante" }, + Text{ "Bottle with Green Chu Jelly", "Flacon de gelΓ©e Chuchu verte", + "Flasche (GrΓΌnes Schleim-Gelee)" }, // "Jugo de Chuchu Verde" + Text{ "Bottle with Lamp Oil", "Flacon de Huile Γ  lanterne", + "Flasche (LampenΓΆl)" }, // "Botella de Aceite de candil" + Text{ "Bottle with Medicine of Magic", "Flacon d'Γ©lixir vert", + "Flasche (GrΓΌner Trank)" }, // "Botella de medicina mΓ‘gica" + Text{ "Bottle with Stamina Potion", "Flacon d'Endurol", + "Flasche (Ausdauertrank)" }, // "Botella de elixir vigorizante" }; trickNameTable[RG_BOTTLE_WITH_BLUE_POTION] = { - Text{ "Bottle with Blue Chu Jelly", "Flacon de gelΓ©e Chuchu bleue", "Jugo de Chuchu Azul" }, - Text{ "Bottle with Water of Life", "Flacon d'Γ©lixir bleu", "Botella de agua de la vida" }, - Text{ "Bottle with Air Potion", "Flacon de potion d'oxygΓ¨ne", "Botella de oxΓ­geno" }, + Text{ "Bottle with Blue Chu Jelly", "Flacon de gelΓ©e Chuchu bleue", + "Flasche (Blaues Schleim-Gelee)" }, // "Jugo de Chuchu Azul" + Text{ "Bottle with Water of Life", "Flacon d'Γ©lixir bleu", + "Flasche (Blauer Trank)" }, // "Botella de agua de la vida" + Text{ "Bottle with Air Potion", "Flacon de potion d'oxygΓ¨ne", "Flasche (Lufttrank)" }, // "Botella de oxΓ­geno" }; trickNameTable[RG_BOTTLE_WITH_FAIRY] = { - Text{ "Bottle with Forest Firefly", "Flacon avec une luciole", "LuciΓ©rnaga del bosque" }, - Text{ "Bottle with Deku Princess", "Flacon avec Deku Princess", "Botella con Deku Princess" }, - Text{ "Bottle with Stray Fairy", "Flacon avec une fΓ©e perdue", "Hada perdida en una botella" }, + Text{ "Bottle with Forest Firefly", "Flacon avec une luciole", + "Flasche (GlΓΌhwΓΌrmchen)" }, // "LuciΓ©rnaga del bosque" + Text{ "Bottle with Deku Princess", "Flacon avec Deku Princess", + "Flasche (Deku-Prinzessin)" }, // "Botella con Deku Princess" + Text{ "Bottle with Stray Fairy", "Flacon avec une fΓ©e perdue", + "Flasche (Verirrte Fee)" }, // "Hada perdida en una botella" }; trickNameTable[RG_BOTTLE_WITH_FISH] = { - Text{ "Bottle with Small Jabu-Jabu", "Flacon avec mini Jabu-Jabu", "Lord Chapu-Chapu embotellado" }, - Text{ "Bottle with Reekfish", "Flacon avec Reekfish", "Reekfish embotellada" }, - Text{ "Bottle with Hyrule Bass", "Flacon avec perche d'Hyrule", "Locha de Hyrule embotellada" }, - Text{ "Bottle with Hyrule Loach", "Flacon avec loche d'Hyrule", "Perca de TΓ©rmina embotellada" }, + Text{ "Bottle with Small Jabu-Jabu", "Flacon avec mini Jabu-Jabu", + "Flasche (Baby Jabu)" }, // "Lord Chapu-Chapu embotellado" + Text{ "Bottle with Reekfish", "Flacon avec Reekfish", "Flasche (Dunstforelle)" }, // "Reekfish embotellada" + Text{ "Bottle with Hyrule Bass", "Flacon avec perche d'Hyrule", + "Flasche (Hyrulebarsch)" }, // "Locha de Hyrule embotellada" + Text{ "Bottle with Hyrule Loach", "Flacon avec loche d'Hyrule", + "Flasche (Hylianische Forelle)" }, // "Perca de TΓ©rmina embotellada" }; trickNameTable[RG_BOTTLE_WITH_BLUE_FIRE] = { - Text{ "Bottle with Will-O-Wisp", "Flacon avec feu follet", "Botella de llama azul" }, - Text{ "Bottle with Ancient Flame", "Flacon de flamme ancienne", "Botella de fuego ancestral" }, - Text{ "Bottle with a Blue Candle", "Flacon avec une bougie bleue", "Botella con una vela azul" }, - Text{ "Bottle with Red Ice", "Flacon de Glace Rouge", "Botella de Hielo rojo" }, - Text{ "Bottle with Nayru's Flame", "Flacon de flamme de Nayru", "Botella de llamas de Nayru" }, + Text{ "Bottle with Will-O-Wisp", "Flacon avec feu follet", "Flasche (Rotes Feuer)" }, // "Botella de llama azul" + Text{ "Bottle with Ancient Flame", "Flacon de flamme ancienne", + "Flasche (Antike Flamme)" }, // "Botella de fuego ancestral" + Text{ "Bottle with a Blue Candle", "Flacon avec une bougie bleue", + "Flasche (Blaue Kerze)" }, // "Botella con una vela azul" + Text{ "Bottle with Red Ice", "Flacon de Glace Rouge", "Flasche (Rotes Eis)" }, // "Botella de Hielo rojo" + Text{ "Bottle with Nayru's Flame", "Flacon de flamme de Nayru", + "Flasche (Nayrus Flamme)" }, // "Botella de llamas de Nayru" }; trickNameTable[RG_BOTTLE_WITH_BUGS] = { - Text{ "Bottle with Baby Tektites", "Flacon de bΓ©bΓ© Araknon", "Tektites en una botella" }, - Text{ "Bottle with A Beetle", "Flacon avec un scarabΓ©e", "Botella con un escarabajo" }, - Text{ "Bottle with Lanayru Ants", "Flacon de fourmis de Lanelle", "Celestarabajo embotellado" }, - Text{ "Bottle with Insects", "Flacon de bibittes", "Saltabosques embotellados" }, - Text{ "Bottle with a Golden Bee", "Flacon avec une abeille dorΓ©e", "Botella con una abeja dorada" }, + Text{ "Bottle with Baby Tektites", "Flacon de bΓ©bΓ© Araknon", + "Flasche (Baby Arachno)" }, // "Tektites en una botella" + Text{ "Bottle with A Beetle", "Flacon avec un scarabΓ©e", "Flasche (Wanze)" }, // "Botella con un escarabajo" + Text{ "Bottle with Lanayru Ants", "Flacon de fourmis de Lanelle", + "Flasche (Ranelle-Ameise)" }, // "Celestarabajo embotellado" + Text{ "Bottle with Insects", "Flacon de bibittes", "Flasche (Insekt)" }, // "Saltabosques embotellados" + Text{ "Bottle with a Golden Bee", "Flacon avec une abeille dorΓ©e", + "Flasche (Goldene Biene)" }, // "Botella con una abeja dorada" }; trickNameTable[RG_BOTTLE_WITH_POE] = { - Text{ "Bottle with Ghini", "Flacon avec Ghini", "Ghini en una botella" }, - Text{ "Bottle with Reapling", "Flacon avec Γ‚me DamnΓ©e", "Reapling en una botella" }, - Text{ "Bottle with Imp Poe", "Flacon avec Spectre", "Espectro en una botella" }, - Text{ "Bottle with Anti-Fairy", "Flacon avec Tetdoss", "Whisp en una botella" }, + Text{ "Bottle with Ghini", "Flacon avec Ghini", "Flasche (Ghini)" }, // "Ghini en una botella" + Text{ "Bottle with Reapling", "Flacon avec Γ‚me DamnΓ©e", "Flasche (Zombie)" }, // "Reapling en una botella" + Text{ "Bottle with Imp Poe", "Flacon avec Spectre", "Flasche (Geist)" }, // "Espectro en una botella" + Text{ "Bottle with Anti-Fairy", "Flacon avec Tetdoss", "Flasche (Knochenfratze)" }, // "Whisp en una botella" }; trickNameTable[RG_RUTOS_LETTER] = { - Text{ "Bottle with Maggie's Letter", "Flacon avec lettre de Maggy", "Carta de Dolores" }, - Text{ "Bottle with Letter to Kafei", "Flacon avec lettre pour Kafei", "Carta para Kafei" }, - Text{ "Bottle with Zelda's Letter", "Flacon avec Lettre de Zelda", "Carta nΓ‘utica" }, + Text{ "Bottle with Maggie's Letter", "Flacon avec lettre de Maggy", + "Flasche (Dolores Brief)" }, // "Carta de Dolores" + Text{ "Bottle with Letter to Kafei", "Flacon avec lettre pour Kafei", + "Flasche (Brief an Kafei)" }, // "Carta para Kafei" + Text{ "Bottle with Zelda's Letter", "Flacon avec Lettre de Zelda", + "Flasche (Zeldas Brief)" }, // "Carta nΓ‘utica" }; trickNameTable[RG_BOTTLE_WITH_BIG_POE] = { - Text{ "Bottle with Composer Brother", "Flacon avec un compositeur", "Hermana Poe embotellada" }, - Text{ "Bottle with Jalhalla", "Flacon avec Jalhalla", "Yaihalla embotellado" }, - Text{ "Bottle with Grim Repoe", "Flacon avec le Faucheur", "Bubble en una botella" }, + Text{ "Bottle with Composer Brother", "Flacon avec un compositeur", + "Flasche (Ludwig Brahmstein)" }, // "Hermana Poe embotellada" + Text{ "Bottle with Jalhalla", "Flacon avec Jalhalla", "Flasche (Jalhalla)" }, // "Yaihalla embotellado" + Text{ "Bottle with Grim Repoe", "Flacon avec le Faucheur", + "Flasche (TagschwΓ€rmer)" }, // "Bubble en una botella" }; trickNameTable[RG_ZELDAS_LULLABY] = { - Text{ "Ballad of the Goddess", "Chant de la dΓ©esse", "CΓ‘ntico de la Diosa" }, - Text{ "Song of Healing", "Chant de l'apaisement", "CanciΓ³n de curaciΓ³n" }, - Text{ "Song of the Hero", "Chant du hΓ©ros", "CanciΓ³n del hΓ©roe" }, + Text{ "Ballad of the Goddess", "Chant de la dΓ©esse", "Hymne der GΓΆttin" }, // "CΓ‘ntico de la Diosa" + Text{ "Song of Healing", "Chant de l'apaisement", "Lied der Befreiung" }, // "CanciΓ³n de curaciΓ³n" + Text{ "Song of the Hero", "Chant du hΓ©ros", "Heldenlied" }, // "CanciΓ³n del hΓ©roe" }; trickNameTable[RG_EPONAS_SONG] = { - Text{ "Song of Birds", "Chant des oiseaux", "Cantar del ave" }, - Text{ "Song of Soaring", "Chant de l'envol", "CanciΓ³n del viento" }, - Text{ "Song of Horse", "Chant du cheval", "Chant du cheval" }, + Text{ "Song of Birds", "Chant des oiseaux", "Vogelruf" }, // "Cantar del ave" + Text{ "Song of Soaring", "Chant de l'envol", "Lied der Schwingen" }, // "CanciΓ³n del viento" + Text{ "Song of Horse", "Chant du cheval", "Lied des Pferdes" }, // "Chant du cheval" }; trickNameTable[RG_SARIAS_SONG] = { - Text{ "Mido's Song", "La chanson de Mido", "La canciΓ³n de Mido" }, - Text{ "Kass' Theme", "Le thΓ¨me de Kass", "El tema de Kass" }, - Text{ "Tune of Echoes", "Chant des Γ‰chos ", "MelodΓ­a del Eco " }, + Text{ "Mido's Song", "La chanson de Mido", "Midos Lied" }, // "La canciΓ³n de Mido" + Text{ "Kass' Theme", "Le thΓ¨me de Kass", "Kashiwa Thema" }, // "El tema de Kass" + Text{ "Tune of Echoes", "Chant des Γ‰chos ", "Melodie des Echos" }, // "MelodΓ­a del Eco" }; trickNameTable[RG_SUNS_SONG] = { - Text{ "Song of Passing", "Mambo de Manbo", "MelodΓ­a del transcurrir" }, - Text{ "Command Melody", "Air du marionnettiste", "Cara al Sol" }, - Text{ "Moon's Song", "La chanson de Moon", "La canciΓ³n de la luna" }, + Text{ "Song of Passing", "Mambo de Manbo", "Kleine Tag- und Nachtmusik" }, // "MelodΓ­a del transcurrir" + Text{ "Command Melody", "Air du marionnettiste", "Sonate des Puppenspielers" }, // "Cara al Sol" + Text{ "Moon's Song", "La chanson de Moon", "Lied des Mondes" }, // "La canciΓ³n de la luna" }; trickNameTable[RG_SONG_OF_TIME] = { - Text{ "Song of Double Time", "Chant accΓ©lΓ©rΓ©", "CanciΓ³n del doble tiempo" }, - Text{ "Inverted Song of Time", "Chant du temps inversΓ©", "CanciΓ³n del tiempo invertida" }, - Text{ "Tune of Ages", "Chant du Temps", "MelodΓ­a del Tiempo" }, + Text{ "Song of Double Time", "Chant accΓ©lΓ©rΓ©", "Thema der Zeit im Wind" }, // "CanciΓ³n del doble tiempo" + Text{ "Inverted Song of Time", "Chant du temps inversΓ©", + "Ballade des Kronos" }, // "CanciΓ³n del tiempo invertida" + Text{ "Tune of Ages", "Chant du Temps", "Melodie der Zeit" }, // "MelodΓ­a del Tiempo" }; trickNameTable[RG_SONG_OF_STORMS] = { - Text{ "Ballad of Gales", "Requiem de la tornade", "MelodΓ­a del Tornado" }, - Text{ "Frog's Song of Soul", "Rap des grenouilles", "CanciΓ³n del alma de la rana" }, - Text{ "Wind's Requiem", "MΓ©lodie du vent", "MelodΓ­a del Viento" }, + Text{ "Ballad of Gales", "Requiem de la tornade", "Kanon des Sturmes" }, // "MelodΓ­a del Tornado" + Text{ "Frog's Song of Soul", "Rap des grenouilles", "KrΓΆtenrap" }, // "CanciΓ³n del alma de la rana" + Text{ "Wind's Requiem", "MΓ©lodie du vent", "Lied des Windes" }, // "MelodΓ­a del Viento" }; trickNameTable[RG_MINUET_OF_FOREST] = { - Text{ "Saria's Karaoke", "KaraokΓ© de Saria", "Dueto del bosque" }, - Text{ "Sonata of Awakening", "Sonate de l'Γ©veil", "Sonata del despertar" }, - Text{ "Wind God's Aria", "Hymne du dieu du vent", "MelodΓ­a del EspΓ­ritu del Viento" }, + Text{ "Saria's Karaoke", "KaraokΓ© de Saria", "Salias Karaoke" }, // "Dueto del bosque" + Text{ "Sonata of Awakening", "Sonate de l'Γ©veil", "Sonate des Erwachens" }, // "Sonata del despertar" + Text{ "Wind God's Aria", "Hymne du dieu du vent", + "Hymne des Zephirgottes" }, // "MelodΓ­a del EspΓ­ritu del Viento" }; trickNameTable[RG_BOLERO_OF_FIRE] = { - Text{ "Darunia's Tango", "Tango de Darunia", "Coro del fuego" }, - Text{ "Tune of Currents", "Chants des Flux", "MelodΓ­a de las Corrientes" }, - Text{ "Goron Lullaby", "Berceuse des Gorons", "Nana goron" }, + Text{ "Darunia's Tango", "Tango de Darunia", "Darunias Tango" }, // "Coro del fuego" + Text{ "Tune of Currents", "Chants des Flux", "Lied des Zeitstroms" }, // "MelodΓ­a de las Corrientes" + Text{ "Goron Lullaby", "Berceuse des Gorons", "Goronisches Schlummerlied" }, // "Nana goron" }; trickNameTable[RG_SERENADE_OF_WATER] = { - Text{ "Ruto's Blues", "Blues de Ruto", "Sonata del agua" }, - Text{ "New Wave Bossa Nova", "Bossa-nova des flots", "Bossanova de las olas" }, - Text{ "Manbo's Mambo", "Mambo de Manbo", "Mambo de Manbo" }, + Text{ "Ruto's Blues", "Blues de Ruto", "Rutos Blues" }, // "Sonata del agua" + Text{ "New Wave Bossa Nova", "Bossa-nova des flots", "Bossa Nova der Kaskaden" }, // "Bossanova de las olas" + Text{ "Manbo's Mambo", "Mambo de Manbo", "Manbos Mambo" }, // "Mambo de Manbo" }; trickNameTable[RG_REQUIEM_OF_SPIRIT] = { - Text{ "Nabooru's Reggae", "Reggae de Nabooru", "Reggae del espΓ­ritu" }, - Text{ "Elegy of Emptiness", "Hymne du vide", "ElegΓ­a al vacΓ­o" }, - Text{ "Earth God's Lyric", "Hymne du dieu de la terre", "MelodΓ­a del EspΓ­ritu de la Tierra" }, + Text{ "Nabooru's Reggae", "Reggae de Nabooru", "Naborus Reggae" }, // "Reggae del espΓ­ritu" + Text{ "Elegy of Emptiness", "Hymne du vide", "Elegie des leeren Herzens" }, // "ElegΓ­a al vacΓ­o" + Text{ "Earth God's Lyric", "Hymne du dieu de la terre", + "Hymne des Terragottes" }, // "MelodΓ­a del EspΓ­ritu de la Tierra" }; trickNameTable[RG_NOCTURNE_OF_SHADOW] = { - Text{ "Impa's Death Metal", "Death mΓ©tal d'Impa", "Diurno de la sombra" }, - Text{ "Oath to Order", "Ode de l'appel", "Oda al orden" }, - Text{ "Song of Discovery", "Chant des secrets", "Canto revelador" }, + Text{ "Impa's Death Metal", "Death mΓ©tal d'Impa", "Impas Death Metal" }, // "Diurno de la sombra" + Text{ "Oath to Order", "Ode de l'appel", "Gesang des Himmels" }, // "Oda al orden" + Text{ "Song of Discovery", "Chant des secrets", "Schatzsucherlied" }, // "Canto revelador" }; trickNameTable[RG_PRELUDE_OF_LIGHT] = { - Text{ "Rauru's Sing-Along", "Chansonnette de Rauru", "Predulio de luz" }, - Text{ "Ballad of the Wind Fish", "Ballade sur Poisson-RΓͺve", "Balada del Piez Viento" }, - Text{ "Song of Light", "Chant de la lumiΓ¨re", "Sonidos de la luz" }, + Text{ "Rauru's Sing-Along", "Chansonnette de Rauru", "Raurus Singalong" }, // "Predulio de luz" + Text{ "Ballad of the Wind Fish", "Ballade sur Poisson-RΓͺve", + "Ballade vom Windfisch" }, // "Balada del Piez Viento" + Text{ "Song of Light", "Chant de la lumiΓ¨re", "Lied des Lichts" }, // "Sonidos de la luz" }; trickNameTable[RG_KOKIRI_EMERALD] = { - Text{ "Pendant of Courage", "Pendentif du courage", "Colgante del valor" }, - Text{ "Farore's Pearl", "Perle de Farore", "Orbe de Farore" }, - Text{ "Aquanine", "Smaragdine", "YerbΓ‘nida" }, - Text{ "Farore's Emerald", "Γ‰meraude de Farore", "Esmeralda de Farore" }, - Text{ "Kokiri's Peridot", "PΓ©ridot Kokiri", "Ágata de los Kokiri" }, + Text{ "Pendant of Courage", "Pendentif du courage", "Amulett des Mutes" }, // "Colgante del valor" + Text{ "Farore's Pearl", "Perle de Farore", "Farores Deamont" }, // "Orbe de Farore" + Text{ "Aquanine", "Smaragdine", "Smaragdstahl" }, // "YerbΓ‘nida" + Text{ "Farore's Emerald", "Γ‰meraude de Farore", "Farore-Smaragd" }, // "Esmeralda de Farore" + Text{ "Kokiri's Peridot", "PΓ©ridot Kokiri", "Kokiri-Peridot" }, // "Ágata de los Kokiri" }; trickNameTable[RG_GORON_RUBY] = { - Text{ "Pendant of Power", "Pendentif de la force", "Colgante del poder" }, - Text{ "Din's Pearl", "Perle de Din", "Orbe de Din" }, - Text{ "Crimsonine", "Alzanine", "Bermellina" }, - Text{ "Din's Ruby", "Rubis de Din", "RubΓ­ de Din" }, - Text{ "Goron's Garnet", "Grenat Goron", "Topacio de los Goron" }, + Text{ "Pendant of Power", "Pendentif de la force", "Amulett der StΓ€rke" }, // "Colgante del poder" + Text{ "Din's Pearl", "Perle de Din", "Dins Deamont" }, // "Orbe de Din" + Text{ "Crimsonine", "Alzanine", "Scharlachstahl" }, // "Bermellina" + Text{ "Din's Ruby", "Rubis de Din", "Din-Rubin" }, // "RubΓ­ de Din" + Text{ "Goron's Garnet", "Grenat Goron", "Goronen-Granat" }, // "Topacio de los Goron" }; trickNameTable[RG_ZORA_SAPPHIRE] = { - Text{ "Pendant of Wisdom", "Pendentif de la sagesse", "Colgante de la sabidurΓ­a" }, - Text{ "Nayru's Pearl", "Perle de Nayru", "Orbe de Nayru" }, - Text{ "Azurine", "Aquanine", "Azurina" }, - Text{ "Nayru's Sapphire", "Saphir de Nayru", "Zafiro de Nayru" }, - Text{ "Zora's Aquamarine", "Aquamarine Zora", "LapislΓ‘zuli de los Zora" }, + Text{ "Pendant of Wisdom", "Pendentif de la sagesse", "Amulett der Weisheit" }, // "Colgante de la sabidurΓ­a" + Text{ "Nayru's Pearl", "Perle de Nayru", "Nayrus Deamont" }, // "Orbe de Nayru" + Text{ "Azurine", "Aquanine", "Azurstahl" }, // "Azurina" + Text{ "Nayru's Sapphire", "Saphir de Nayru", "Nayru-Saphir" }, // "Zafiro de Nayru" + Text{ "Zora's Aquamarine", "Aquamarine Zora", "Zora-Aquamarin" }, // "LapislΓ‘zuli de los Zora" }; trickNameTable[RG_FOREST_MEDALLION] = { - Text{ "Wind Medallion", "MΓ©daillon du vent", "MedallΓ³n del Viento" }, - Text{ "Wind Element", "ElΓ©ment Vent", "Elemento de aire" }, - Text{ "Saria's Medallion", "MΓ©daillon de Saria", "MedallΓ³n de Saria" }, - Text{ "Sign of Air", "Glyphe de l'air", "Glifo de aire" }, - Text{ "Medallion of Forest", "MΓ©daillon du Temple de la ForΓͺt", "Medalla del Bosque" }, + Text{ "Wind Medallion", "MΓ©daillon du vent", "Amulett des Windes" }, // "MedallΓ³n del Viento" + Text{ "Wind Element", "ElΓ©ment Vent", "Wind-Element" }, // "Elemento de aire" + Text{ "Saria's Medallion", "MΓ©daillon de Saria", "Salias Amulett" }, // "MedallΓ³n de Saria" + Text{ "Sign of Air", "Glyphe de l'air", "Zeichen der Luft" }, // "Glifo de aire" + Text{ "Medallion of Forest", "MΓ©daillon du Temple de la ForΓͺt", + "Medaillon des Waldes" }, // "Medalla del Bosque" }; trickNameTable[RG_FIRE_MEDALLION] = { - Text{ "Fire Element", "ElΓ©ment Feu", "Elemento de fuego" }, - Text{ "Darunia's Medallion", "MΓ©daillon de Darunia", "MedallΓ³n de Darunia" }, - Text{ "Sign of Fire", "Glyphe de feu", "Glifo de fuego" }, - Text{ "Medallion of Fire", "MΓ©daillon du Temple du Feu", "Medalla del Fuego" }, + Text{ "Fire Element", "ElΓ©ment Feu", "Flammen-Element" }, // "Elemento de fuego" + Text{ "Darunia's Medallion", "MΓ©daillon de Darunia", "Darunias Amulett" }, // "MedallΓ³n de Darunia" + Text{ "Sign of Fire", "Glyphe de feu", "Zeichen des Feuers" }, // "Glifo de fuego" + Text{ "Medallion of Fire", "MΓ©daillon du Temple du Feu", "Medaillon des Feuers" }, // "Medalla del Fuego" }; trickNameTable[RG_WATER_MEDALLION] = { - Text{ "Water Element", "ElΓ©ment Eau", "Elemento de agua" }, - Text{ "Ice Medallion", "MΓ©daillon de glace", "MedallΓ³n Helado" }, - Text{ "Ruto's Medallion", "MΓ©daillon de Ruto", "MedallΓ³n de Ruto" }, - Text{ "Sign of Water", "Glyphe de l'eau", "Glifo de agua" }, - Text{ "Medallion of Water", "MΓ©daillon du Temple de l'Eau", "Medalla del Agua" }, + Text{ "Water Element", "ElΓ©ment Eau", "Tropfen-Element" }, // "Elemento de agua" + Text{ "Ice Medallion", "MΓ©daillon de glace", "Amulett des Eises" }, // "MedallΓ³n Helado" + Text{ "Ruto's Medallion", "MΓ©daillon de Ruto", "Rutos Amulett" }, // "MedallΓ³n de Ruto" + Text{ "Sign of Water", "Glyphe de l'eau", "Zeichen des Wassers" }, // "Glifo de agua" + Text{ "Medallion of Water", "MΓ©daillon du Temple de l'Eau", "Medaillon des Wassers" }, // "Medalla del Agua" }; trickNameTable[RG_SPIRIT_MEDALLION] = { - Text{ "Earth Element", "ElΓ©ment Terre", "Elemento de tierra" }, - Text{ "Nabooru's Medallion", "MΓ©daillon de Nabooru", "MedallΓ³n de Nabooru" }, - Text{ "Sign of Earth", "Glyphe de la Terre", "Glifo de la tierra" }, - Text{ "Medallion of Spirit", "MΓ©daillon du Temple de l'Esprit", "Medalla del EspΓ­ritu" }, + Text{ "Earth Element", "ElΓ©ment Terre", "Erd-Element" }, // "Elemento de tierra" + Text{ "Nabooru's Medallion", "MΓ©daillon de Nabooru", "Naborus Amulett" }, // "MedallΓ³n de Nabooru" + Text{ "Sign of Earth", "Glyphe de la Terre", "Zeichen der Erde" }, // "Glifo de la tierra" + Text{ "Medallion of Spirit", "MΓ©daillon du Temple de l'Esprit", + "Medaillon der Geister" }, // "Medalla del EspΓ­ritu" }; trickNameTable[RG_SHADOW_MEDALLION] = { - Text{ "Fused Shadow", "Cristal d'ombre", "Sombra Fundida" }, - Text{ "Impa's Medallion", "MΓ©daillon d'Impa", "MedallΓ³n de Impa" }, - Text{ "Sign of Illusion", "Glyphe de l'illusion", "Glifo de ilusiΓ³n" }, - Text{ "Medallion of Shadow", "MΓ©daillon du Temple de l'Ombre", "Medalla de la Sombra" }, + Text{ "Fused Shadow", "Cristal d'ombre", "Schattenkristall" }, // "Sombra Fundida" + Text{ "Impa's Medallion", "MΓ©daillon d'Impa", "Impas Amulett" }, // "MedallΓ³n de Impa" + Text{ "Sign of Illusion", "Glyphe de l'illusion", "Zeichen der Illusionen" }, // "Glifo de ilusiΓ³n" + Text{ "Medallion of Shadow", "MΓ©daillon du Temple de l'Ombre", + "Medaillon des Schattens" }, // "Medalla de la Sombra" }; trickNameTable[RG_LIGHT_MEDALLION] = { - Text{ "Compass of Light", "Boussole de lumiΓ¨re", "BrΓΊjula de Luz" }, - Text{ "Rauru's Medallion", "MΓ©daillon de Rauru", "MedallΓ³n de Rauru" }, - Text{ "Sign of Destiny", "Glyphe du destin", "Glifo del destino" }, - Text{ "Medallion of Light", "MΓ©daillon du temple de lumiΓ¨re", "Medalla de la Luz" }, + Text{ "Compass of Light", "Boussole de lumiΓ¨re", "Licht-Kompaß" }, // "BrΓΊjula de Luz" + Text{ "Rauru's Medallion", "MΓ©daillon de Rauru", "Raurus Amulett" }, // "MedallΓ³n de Rauru" + Text{ "Sign of Destiny", "Glyphe du destin", "Zeichen des Schicksals" }, // "Glifo del destino" + Text{ "Medallion of Light", "MΓ©daillon du temple de lumiΓ¨re", "Medaillon des Lichts" }, // "Medalla de la Luz" }; trickNameTable[RG_RECOVERY_HEART] = { - Text{ "Love", "Bisou", "Te amo" }, - Text{ "Life", "Vie", "vida" }, - Text{ "HP", "PV", "VP" }, + Text{ "Love", "Bisou", "Liebe" }, // "Te amo" + Text{ "Life", "Vie", "Leben" }, // "vida" + Text{ "HP", "PV", "KP" }, // "VP" }; trickNameTable[RG_GREEN_RUPEE] = { - Text{ "False Greg", "Faux Greg", "Falso Greg" }, Text{ "One Ruby", "Un rubis", "Un rubΓ­" }, - Text{ "Rupoor (1)", "Roupir (1)", "Rupobre (1)" }, Text{ "One Rupee", "Un rubis", "GuaranΓ­ hyliano" }, - Text{ "Rupee (1)", "Rubis (1)", "Peso hyliano" }, + Text{ "Rupee (1)", "Rubis (1)", "Rubin (1)" }, // "Peso hyliano" + Text{ "One Ruby", "Un rubis", "ein Ruby" }, // "Un rubΓ­" + Text{ "One Rupee", "Un rubis", "ein Rubin" }, // "GuaranΓ­ hyliano" + Text{ "False Greg", "Faux Greg", "falscher Greg" }, // "Falso Greg" + Text{ "Rupoor (1)", "Roupir (1)", "Rubinfalle (1)" }, // "Rupobre (1)" }; trickNameTable[RG_BLUE_RUPEE] = { - Text{ "Blupee", "Bleubi", "Azupia" }, - Text{ "Five Rubies", "Cinq Rubys", "Cinco rubΓ­es" }, - Text{ "Five Rupees", "Cinq rubis", "BolΓ­var hyliano" }, - Text{ "Rupee (5)", "Rubis (5)", "Peso hyliano" }, - Text{ "Rupoor (5)", "Roupir (5)", "Rupobre (5)" }, + Text{ "Blupee", "Bleubi", "FΓΌnfer" }, // "Azupia" + Text{ "Five Rubies", "Cinq Rubys", "fΓΌnf Rubies€" }, // "Cinco rubΓ­es" + Text{ "Five Rupees", "Cinq rubis", "fΓΌnf Rubine€" }, // "BolΓ­var hyliano" + Text{ "Rupee (5)", "Rubis (5)", "Rubin (5)" }, // "Peso hyliano" + Text{ "Rupoor (5)", "Roupir (5)", "Rubinfalle (5)" }, // "Rupobre (5)" }; trickNameTable[RG_RED_RUPEE] = { - Text{ "Big 20", "Grand 20", "Los 20 grandes" }, Text{ "Twenty Rubies", "vingt rubis", "Veinte rubΓ­es" }, - Text{ "Rupoor (20)", "Roupir (20)", "Rupobre (20)" }, Text{ "Twenty Rupees", "Vingt rubis", "Colon hyliano" }, - Text{ "Rupee (20)", "Rubis (20)", "Peso hyliano" }, + Text{ "Big 20", "Grand 20", "Zwanni" }, // "Los 20 grandes" + Text{ "Twenty Rubies", "vingt rubis", "zwanzig Rubies€" }, // "Veinte rubΓ­es" + Text{ "Twenty Rupees", "Vingt rubis", "zwanzig Rubine€" }, // "Colon hyliano" + Text{ "Rupee (20)", "Rubis (20)", "Rubin (20)" }, // "Peso hyliano" + Text{ "Rupoor (20)", "Roupir (20)", "Rubinfalle (20)" }, // "Rupobre (20)" }; trickNameTable[RG_PURPLE_RUPEE] = { - Text{ "Purpee", "Pourbi", "morupiua" }, - Text{ "Fifty Rubies", "Cinquante rubis", "Cincuenta rubΓ­es" }, - Text{ "Rupoor (50)", "Roupir (50)", "Rupobre (50)" }, - Text{ "Fifty Rupees", "Cinquante rubis", "Balboa hyliano" }, - Text{ "Rupee (50)", "Rubis (50)", "Peso hyliano" }, + Text{ "Purpee", "Pourbi", "Fuffi" }, // "morupiua" + Text{ "Fifty Rubies", "Cinquante rubis", "fΓΌnfzig Rubies€" }, // "Cincuenta rubΓ­es" + Text{ "Fifty Rupees", "Cinquante rubis", "fΓΌnfzig Rubine€" }, // "Balboa hyliano" + Text{ "Rupee (50)", "Rubis (50)", "Rubin (50)" }, // "Peso hyliano" + Text{ "Rupoor (50)", "Roupir (50)", "Rubinfalle (50)" }, // "Rupobre (50)" }; trickNameTable[RG_HUGE_RUPEE] = { - Text{ "Hugo", "Or Rubi", "Oro Rubi" }, - Text{ "Two Hundred Rubies", "Deux cents rubis", "Doscientos rubΓ­es" }, - Text{ "Diamond", "Diamant", "Diamante" }, - Text{ "Huge Ruby", "Γ‰norme rubis", "Rubi gigante" }, - Text{ "Two Hundred Rupees", "Deux cent rubis", "Euro hyliano" }, - Text{ "Rupee (200)", "Rubis (200)", "DΓ³lar hyliano" }, + Text{ "Hugo", "Or Rubi", "zwei Hunnis€" }, // "Oro Rubi" + Text{ "Two Hundred Rubies", "Deux cents rubis", "zweihundert Rubies€" }, // "Doscientos rubΓ­es" + Text{ "Diamond", "Diamant", "Diamant" }, // "Diamante" + Text{ "Huge Ruby", "Γ‰norme rubis", "großer Ruby" }, // "Rubi gigante" + Text{ "Two Hundred Rupees", "Deux cent rubis", "zweihundert Rubine€" }, // "Euro hyliano" + Text{ "Rupee (200)", "Rubis (200)", "Rubin (200)" }, // "DΓ³lar hyliano" }; trickNameTable[RG_PIECE_OF_HEART] = { - Text{ "Pizza Heart", "Fromage de cΕ“ur", "Pieza de Chorizo" }, - Text{ "Little Bit Of Love", "Un peu d'amour", "Un poco de amor" }, - Text{ "Rare Peach Stone", "Pierre de pΓͺche rare", "Pierre de pΓͺche rare" }, + Text{ "Pizza Heart", "Fromage de cΕ“ur", "Harzteil" }, // "Pieza de Chorizo" + Text{ "Little Bit Of Love", "Un peu d'amour", "etwas Liebe" }, // "Un poco de amor" + Text{ "Rare Peach Stone", "Pierre de pΓͺche rare", "ein seltener Pfirsichstein" }, // "Pierre de pΓͺche rare" }; trickNameTable[RG_HEART_CONTAINER] = { - Text{ "Crystal Heart", "CΕ“ur de cristal", "CorazΓ³n de cristal" }, - Text{ "Life Heart", "CΕ“ur de vie", "Vida CorazΓ³n" }, - Text{ "Lots of Love", "Beaucoup d'amour", "Mucho amor" }, + Text{ "Crystal Heart", "CΕ“ur de cristal", "Kristallherz" }, // "CorazΓ³n de cristal" + Text{ "Life Heart", "CΕ“ur de vie", "Lebensherz" }, // "Vida CorazΓ³n" + Text{ "Lots of Love", "Beaucoup d'amour", "viel Liebe" }, // "Mucho amor" }; trickNameTable[RG_TRIFORCE_PIECE] = { - Text{ "Piece of Cheese", "Morceau de Fromage", "Piece of Cheese" }, - Text{ "Triforce Shard", "Γ‰clat de Triforce", "Triforce Shard" }, - Text{ "Shiny Rock", "Caillou Brillant", "Shiny Rock" }, + Text{ "Piece of Cheese", "Morceau de Fromage", "KΓ€seteil" }, // "Piece of Cheese" + Text{ "Triforce Shard", "Γ‰clat de Triforce", "Triforce-Fragment" }, // "Triforce Shard" + Text{ "Shiny Rock", "Caillou Brillant", "glΓ€nzender Stein" }, // "Shiny Rock" }; - - // TODO_TRANSLATE trickNameTable[RG_GOHMA_SOUL] = { - Text{ "Spider Sense", "Sens de l'AraignΓ©e", "" }, - Text{ "Deku Spirit", "Parasite Mojo", "" }, - Text{ "Ghost of Ghoma", "FantΓ΄me de Gohma", "" }, + Text{ "Spider Sense", "Sens de l'AraignΓ©e", "Spinnensinn" }, + Text{ "Deku Spirit", "Parasite Mojo", "Deku Geist" }, + Text{ "Ghost of Ghoma", "FantΓ΄me de Gohma", "Gohmas Geist" }, }; trickNameTable[RG_KING_DODONGO_SOUL] = { - Text{ "Lizard Soul", "Γ‚me d'un LΓ©zard", "" }, - Text{ "Regal Remains", "Restes DΓ©licieux", "" }, - Text{ "Dodongo's Core", "Coeur de Dodongo", "" }, + Text{ "Lizard Soul", "Γ‚me d'un LΓ©zard", "Reptilienseele" }, + Text{ "Regal Remains", "Restes DΓ©licieux", "royale Überreste€" }, + Text{ "Dodongo's Core", "Coeur de Dodongo", "Dodongos Kern" }, }; trickNameTable[RG_BARINADE_SOUL] = { - Text{ "Parasitic Poltergeist", "Poltergeist Parasite", "" }, - Text{ "Jabu Insides", "Entrailles de Jabu-Jabu", "" }, - Text{ "Barinade Bacteria", "BactΓ©rie de Barinade", "" }, + Text{ "Parasitic Poltergeist", "Poltergeist Parasite", "infektiΓΆser Poltergeist" }, + Text{ "Jabu Insides", "Entrailles de Jabu-Jabu", "Jabus Innereien" }, + Text{ "Barinade Bacteria", "BactΓ©rie de Barinade", "Barinades Bakterien" }, }; trickNameTable[RG_PHANTOM_GANON_SOUL] = { - Text{ "Bigger Poe", "Γ‚me Gigantesque", "" }, - Text{ "Sacred Forest Pine Tree", "Grande Perche du Bosquet SacrΓ©", "" }, - Text{ "Ganon's Phantom", "FantΓ΄me de Ganon", "" }, + Text{ "Bigger Poe", "Γ‚me Gigantesque", "ein großer NachtschwΓ€rmer" }, + Text{ "Sacred Forest Pine Tree", "Grande Perche du Bosquet SacrΓ©", "Kiefer der Heiligen Lichtung" }, + Text{ "Ganon's Phantom", "FantΓ΄me de Ganon", "Ganons Phantom" }, }; trickNameTable[RG_VOLVAGIA_SOUL] = { - Text{ "Dragon Roast", "Friture du Dragon", "" }, - Text{ "Hot n' Ready", "Sauce Barbecue", "" }, - Text{ "Volvagia's Vitality", "VitalitΓ© de Volcania", "" }, + Text{ "Dragon Roast", "Friture du Dragon", "Drachenbraten" }, + Text{ "Hot n' Ready", "Sauce Barbecue", "Barbecue Sauce" }, + Text{ "Volvagia's Vitality", "VitalitΓ© de Volcania", "Volvagias VitalitΓ€t" }, }; trickNameTable[RG_MORPHA_SOUL] = { - Text{ "Dihydrogen Monoxide", "Monoxyde de DihydrogΓ¨ne", "" }, - Text{ "Morpha Molecules", "MolΓ©cule de Morpha", "" }, - Text{ "Wet Stuff", "Truc MouillΓ©", "" }, + Text{ "Dihydrogen Monoxide", "Monoxyde de DihydrogΓ¨ne", "Dihydrogenmonoxid" }, + Text{ "Morpha Molecules", "MolΓ©cule de Morpha", "Morphas Molekyle" }, + Text{ "Wet Stuff", "Truc MouillΓ©", "nasses Zeug" }, }; trickNameTable[RG_BONGO_BONGO_SOUL] = { - Text{ "Shadow Soul", "Γ‚me de l'Ombre", "" }, - Text{ "Dark Essence", "Essence Sombre", "" }, - Text{ "Bongo Bongo's Bongo", "Bongo de Bongo Bongo", "" }, + Text{ "Shadow Soul", "Γ‚me de l'Ombre", "Schattenseele" }, + Text{ "Dark Essence", "Essence Sombre", "Dunkle Essenz" }, + Text{ "Bongo Bongo's Bongo", "Bongo de Bongo Bongo", "Bongo Bongos Bongo" }, }; trickNameTable[RG_TWINROVA_SOUL] = { - Text{ "Sandy Ashes", "Cendres des Vieilles", "" }, - Text{ "Spiritual Spirit", "Esprit Spirituel", "" }, - Text{ "Twin Rovers", "Duo AngΓ©lique", "" }, + Text{ "Sandy Ashes", "Cendres des Vieilles", "Sandige Asche" }, + Text{ "Spiritual Spirit", "Esprit Spirituel", "Geisterhafter Geist" }, + Text{ "Twin Rovers", "Duo AngΓ©lique", "Twinrovas Seile" }, }; trickNameTable[RG_GANON_SOUL] = { - Text{ "Pure Evil", "Mal IncarnΓ©", "" }, - Text{ "Ganon's Ghost", "Le Malin", "" }, - Text{ "Pork", "Porc", "" }, + Text{ "Pure Evil", "Mal IncarnΓ©", "Das pure BΓΆse" }, + Text{ "Ganon's Ghost", "Le Malin", "Ganons Geist" }, + Text{ "Pork", "Porc", "Schweinefleisch" }, }; - trickNameTable[RG_FISHING_POLE] = { - Text{ "Fish Tickler", "Fish Tickler", "Fish Tickler" }, - Text{ "Floating Lure", "Floating Lure", "Floating Lure" }, - Text{ "Fishing Reel", "Fishing Reel", "Fishing Reel" }, + Text{ "Fish Tickler", "Fish Tickler", "Fischkitzler" }, + Text{ "Floating Lure", "Floating Lure", "Schwimmer" }, + Text{ "Fishing Reel", "Fishing Reel", "Angelschnur" }, }; - trickNameTable[RG_OCARINA_A_BUTTON] = { - Text{ "Ocarina J Button", "Touche Ha de l'Ocarina", "" }, - Text{ "Ocarina Ayy Button", "Touche Ah de l'Ocarina", "" }, - Text{ "Ocarina A Trigger", "Bumper A de l'Ocarina", "" }, + Text{ "Ocarina J Button", "Touche Ha de l'Ocarina", "J-Taste der Okarina" }, + Text{ "Ocarina Ayy Button", "Touche Ah de l'Ocarina", "A-Taste der FlΓΆte" }, + Text{ "Ocarina A Trigger", "Bumper A de l'Ocarina", "A-Trigger der Okarina" }, }; trickNameTable[RG_OCARINA_C_UP_BUTTON] = { - Text{ "Ocarina C North Button", "Touche C Nord de l'Ocarina", "" }, - Text{ "Ocarina C App Button", "Touche C'est Haut de l'Ocarina", "" }, - Text{ "Ocarina Sup Button", "Touche O de l'Ocarina", "" }, + Text{ "Ocarina C North Button", "Touche C Nord de l'Ocarina", "C-Nord-Taste der Okarina" }, + Text{ "Ocarina C App Button", "Touche C'est Haut de l'Ocarina", "C-Oben-Taste des Rekorders" }, + Text{ "Ocarina Sup Button", "Touche O de l'Ocarina", "C-Oben-Trigger der Okarina" }, }; trickNameTable[RG_OCARINA_C_DOWN_BUTTON] = { - Text{ "Ocarina C South Button", "Touche C Sud de l'Ocarina", "" }, - Text{ "Ocarina Z Down Button", "Touche Z Bas de l'Ocarina", "" }, - Text{ "Ocarina See Down Button", "Touche C'est Bas de l'Ocarina", "" }, - Text{ "Ocarina C Dawn Button", "Touche SΓ©ba de l'Ocarina", "" }, + Text{ "Ocarina C South Button", "Touche C Sud de l'Ocarina", "C-SΓΌd-Taste der Okarina" }, + Text{ "Ocarina Z Down Button", "Touche Z Bas de l'Ocarina", "Z-Unten-Taste der Okarina" }, + Text{ "Ocarina See Down Button", "Touche C'est Bas de l'Ocarina", "C-Unten-Taste der Harfe" }, + Text{ "Ocarina C Dawn Button", "Touche SΓ©ba de l'Ocarina", "C-Unten-Trigger der Okarina" }, }; trickNameTable[RG_OCARINA_C_LEFT_BUTTON] = { - Text{ "Ocarina C West Button", "Touche C Ouest de l'Ocarina", "" }, - Text{ "Ocarina Sea Left Button", "Touche CΓ©goche de L'Ocarina", "" }, - Text{ "Ocarina C Lift Button", "Touche C'est Gauche de l'Ocarina", "" }, - Text{ "Ocarina Rewind Button", "Touche Rembobiner de l'Ocarina", "" }, + Text{ "Ocarina C West Button", "Touche C Ouest de l'Ocarina", "C-West-Taste der Okarina" }, + Text{ "Ocarina Sea Left Button", "Touche CΓ©goche de L'Ocarina", "C-Links-Taste der Nixenglocke" }, + Text{ "Ocarina C Lift Button", "Touche C'est Gauche de l'Ocarina", "C-Zelda-Taste der Okarina" }, + Text{ "Ocarina Rewind Button", "Touche Rembobiner de l'Ocarina", "C-Links-Trigger der Okarina" }, }; trickNameTable[RG_OCARINA_C_RIGHT_BUTTON] = { - Text{ "Ocarina C East Button", "Touche C Est de l'Ocarina", "" }, - Text{ "Ocarina C Wright Button", "Touche C'est Droite de l'Ocarina", "" }, - Text{ "Overworld C Right Button", "Trou Droit de l'Ocarina", "" }, + Text{ "Ocarina C East Button", "Touche C Est de l'Ocarina", "C-Ost-Taste der Okarina" }, + Text{ "Ocarina C Wright Button", "Touche C'est Droite de l'Ocarina", "C-Rechts-Trigger der Okarina" }, + Text{ "Overworld C Right Button", "Trou Droit de l'Ocarina", "C-Rechts-Taste der E-Gitarre" }, }; /* //Names for individual upgrades, in case progressive names are replaced trickNameTable[GI_HOOKSHOT] = { - Text{"Grappling Hook", "Grappin-griffe", "Gancho lanzable"}, - Text{"Clawshot", "Lance-chaΓne", "Zarpa"}, - Text{"Gripshot", "Grappince", "Enganchador"}, + Text{"Grappling Hook", "Grappin-griffe", "Enterhaken" }, // "Gancho lanzable" + Text{"Clawshot", "Lance-chaΓne", "Greifhaken" }, // "Zarpa" + Text{"Gripshot", "Grappince", "Tauschhaken" }, // "Enganchador" }; trickNameTable[GI_LONGSHOT] = { - Text{"Longshot, no strings attached", "Grappin sans attrape", "Gancho lanzable mΓ‘s largo"}, - Text{"Double Clawshot", "Double-grappin", "Superzarpa"}, - Text{"Switch Hook", "Great grappin", "Gancho chulo"}, + Text{"Longshot, no strings attached", "Grappin sans attrape", "Enterhaken, Umtausch ausgeschloßen"}, // "Gancho + lanzable mΓ‘s largo" Text{"Double Clawshot", "Double-grappin", "Doppelhaken" }, // "Superzarpa" Text{"Switch Hook", + "Great grappin", "Tauschhaken" }, // "Gancho chulo" }; trickNameTable[GI_BOMB_BAG_1] = { - Text{"Bomb Capacity (20)", "CapacitΓ© de bombes (20)", "Bolsa de bombas (contiene 20)"}, - Text{"Bronze Bomb Bag", "Sac de Bombes de bronze", "Saco de bronce de bombas"}, - Text{"Small Bomb Bag", "Petit Sac de Bombes", "ZurrΓ³n de bombas pequeΓ±o"}, + Text{"Bomb Capacity (20)", "CapacitΓ© de bombes (20)", "Bomben-KapazitΓ€t (20)" }, // "Bolsa de bombas (contiene + 20)" Text{"Bronze Bomb Bag", "Sac de Bombes de bronze", "Bronzene Bombentasche" }, // "Saco de bronce de bombas" + Text{"Small Bomb Bag", "Petit Sac de Bombes", "Kleine Bombentasche" }, // "ZurrΓ³n de bombas pequeΓ±o" }; trickNameTable[GI_BOMB_BAG_2] = { - Text{"Bomb Capacity (30)", "CapacitΓ© de bombes (30)", "Bolsa de bombas (contiene 30)"}, - Text{"Silver Bomb Bag", "Sac de Bombes d'argent", "Saco plateado de bombas"}, - Text{"Medium Bomb Bag", "Sac de Bombes moyen", "ZurrΓ³n de bombas mediano"}, + Text{"Bomb Capacity (30)", "CapacitΓ© de bombes (30)", "Bomben-KapazitΓ€t (30)" }, // "Bolsa de bombas (contiene + 30)" Text{"Silver Bomb Bag", "Sac de Bombes d'argent", "Silberne Bombentasche" }, // "Saco plateado de bombas" + Text{"Medium Bomb Bag", "Sac de Bombes moyen", "Mittlere Bombentasche" }, // "ZurrΓ³n de bombas mediano" }; trickNameTable[GI_BOMB_BAG_3] = { - Text{"Bomb Capacity (40)", "CapacitΓ© de bombes (40)", "Bolsa de bombas (contiene 40)"}, - Text{"Golden Bomb Bag", "Sac de Bombes d'or", "Saco dorado de bombas"}, - Text{"Large Bomb Bag", "Gros Sac de Bombes", "ZurrΓ³n de bombas grande"}, + Text{"Bomb Capacity (40)", "CapacitΓ© de bombes (40)", "Bomben-KapazitΓ€t (40)" }, // "Bolsa de bombas (contiene + 40)" Text{"Golden Bomb Bag", "Sac de Bombes d'or", "Goldene Bombentasche" }, // "Saco dorado de bombas" Text{"Large + Bomb Bag", "Gros Sac de Bombes", "Gigantische Bombentasche" }, // "ZurrΓ³n de bombas grande" }; trickNameTable[GI_BOW_1] = { - Text{"Bow", "Arc", "Arco del Hada"}, - Text{"Hero's Bow", "Arc du hΓ©ros", "Arco del hΓ©roe"}, - Text{"Small Quiver", "Petit carquois", "Saco de flechas pequeΓ±o"}, + Text{"Bow", "Arc", "Bogen" }, // "Arco del Hada" + Text{"Hero's Bow", "Arc du hΓ©ros", "Heroenbogen" }, // "Arco del hΓ©roe" + Text{"Small Quiver", "Petit carquois", "Kleiner KΓΆcher" }, // "Saco de flechas pequeΓ±o" }; trickNameTable[GI_BOW_2] = { - Text{"Arrow Capacity (40)", "CapacitΓ© de flΓ¨ches (40)", "Capacidad de flechas (40)"}, - Text{"Silver Quiver", "Carquois d'argent", "Carcaj plateado"}, - Text{"Medium Quiver", "Carquois moyen", "Saco de flechas mediano"}, + Text{"Arrow Capacity (40)", "CapacitΓ© de flΓ¨ches (40)", "Pfeil-KapazitΓ€t (40)" }, // "Capacidad de flechas (40)" + Text{"Silver Quiver", "Carquois d'argent", "Silberner KΓΆcher" }, // "Carcaj plateado" + Text{"Medium Quiver", "Carquois moyen", "Mittlerer KΓΆcher" }, // "Saco de flechas mediano" }; trickNameTable[GI_BOW_3] = { - Text{"Arrow Capacity (50)", "CapacitΓ© de flΓ¨ches (50)", "Capacidad de flechas (50)"}, - Text{"Golden Quiver", "Carquois d'or", "Carcaj dorado"}, - Text{"Large Quiver", "Gros carquois", "Saco de flechas grande"}, + Text{"Arrow Capacity (50)", "CapacitΓ© de flΓ¨ches (50)", "Pfeil-KapazitΓ€t (50)" }, // "Capacidad de flechas (50)" + Text{"Golden Quiver", "Carquois d'or", "Goldener KΓΆcher" }, // "Carcaj dorado" + Text{"Large Quiver", "Gros carquois", "Gigantischer KΓΆcher" }, // "Saco de flechas grande" }; trickNameTable[GI_SLINGSHOT_1] = { - Text{"Slingshot", "Lance-Pierre", "Tirachinas del Hada"}, - Text{"Scattershot", "Lance-Pierre rafale", "Tirachinas mΓΊltiple"}, - Text{"Small Seed Satchel", "Petit sac de graines", "Bolsa de semillas pequeΓ±a"}, + Text{"Slingshot", "Lance-Pierre", "Schleuder" }, // "Tirachinas del Hada" + Text{"Scattershot", "Lance-Pierre rafale", "Streuschleuder" }, // "Tirachinas mΓΊltiple" + Text{"Small Seed Satchel", "Petit sac de graines", "Kleine Munitionstasche" }, // "Bolsa de semillas pequeΓ±a" }; trickNameTable[GI_SLINGSHOT_2] = { - Text{"Deku Seed Capacity (40)", "CapacitΓ© de graines (40)", "Capacidad de semillas (40)"}, - Text{"Silver Deku Seed Bullet Bag", "Sac de graines d'argent", "Bolsa de balas (contiene 40)"}, - Text{"Medium Seed Satchel", "Sac de graines moyen", "Bolsa de semillas mediana"}, + Text{"Deku Seed Capacity (40)", "CapacitΓ© de graines (40)", "Deku-Kern-KapazitΓ€t (40)" }, // "Capacidad de + semillas (40)" Text{"Silver Deku Seed Bullet Bag", "Sac de graines d'argent", "Silberne Munitionstasche" }, // + "Bolsa de balas (contiene 40)" Text{"Medium Seed Satchel", "Sac de graines moyen", "Mittlere Munitionstasche" }, // + "Bolsa de semillas mediana" }; trickNameTable[GI_SLINGSHOT_3] = { - Text{"Deku Seed Capacity (50)", "CapacitΓ© de graines (50)", "Capacidad de semillas (50)"}, - Text{"Golden Deku Seed Bullet Bag", "Sac de graines d'or", "Bolsa de balas (contiene 50)"}, - Text{"Large Seed Satchel", "Gros sac de graines", "Bolsa de semillas grande"}, + Text{"Deku Seed Capacity (50)", "CapacitΓ© de graines (50)", "Deku-Kern-KapazitΓ€t (50)" }, // "Capacidad de + semillas (50)" Text{"Golden Deku Seed Bullet Bag", "Sac de graines d'or", "Goldene Munitionstasche" }, // "Bolsa de + balas (contiene 50)" Text{"Large Seed Satchel", "Gros sac de graines", "Gigantische Munitionstasche" }, // "Bolsa de + semillas grande" }; trickNameTable[GI_STRENGTH_1] = { - Text{"Goron's Gauntlet", "Gantelet Goron", "Brazalete amarillo"}, - Text{"Power Bracelet", "Bracelet de force", "Brazalete de fuerza"}, - Text{"Magic Bracelet", "Bracelet de Lavio", "Brazalete de Ravio"}, + Text{"Goron's Gauntlet", "Gantelet Goron", "Goronen-Handschuhe€" }, // "Brazalete amarillo" + Text{"Power Bracelet", "Bracelet de force", "Kraftarmband" }, // "Brazalete de fuerza" + Text{"Magic Bracelet", "Bracelet de Lavio", "Magiearmband" }, // "Brazalete de Ravio" }; trickNameTable[GI_STRENGTH_2] = { - Text{"Silver Bracelets", "Bracelets d'argent", "Guantes Moguma"}, - Text{"Power Gloves", "Gant de puissance", "Guante del Poder"}, - Text{"Magic Gauntlets", "Gantelet magique", "Guante mΓ‘gico"}, + Text{"Silver Bracelets", "Bracelets d'argent", "Silberarmband" }, // "Guantes Moguma" + Text{"Power Gloves", "Gant de puissance", "Silberhandschuhe€" }, // "Guante del Poder" + Text{"Magic Gauntlets", "Gantelet magique", "Magiehandschuhe€" }, // "Guante mΓ‘gico" }; trickNameTable[GI_STRENGTH_3] = { - Text{"Golden Bracelets", "Bracelets d'or", "Guantelete de Thanos"}, - Text{"Titan's Mitts", "Moufle de titan", "Guantes de TitΓ‘n"}, - Text{"Magnetic Gloves", "MagnΓ©to-gants", "Guantes de fuego"}, + Text{"Golden Bracelets", "Bracelets d'or", "Goldarmband" }, // "Guantelete de Thanos" + Text{"Titan's Mitts", "Moufle de titan", "Goldhandschuhe€" }, // "Guantes de TitΓ‘n" + Text{"Magnetic Gloves", "MagnΓ©to-gants", "Magnethandschuhe€" }, // "Guantes de fuego" }; trickNameTable[GI_SCALE_1] = { - Text{"Silver Pearl", "Perle d'argent", "Perla de Plata progresiva"}, - Text{"Adult Scale", "Γ‰caille d'adulte", "Bola de bolos zora"}, - Text{"Zora Scale", "Γ‰caille Zora", "Escama de Zora"}, + Text{"Silver Pearl", "Perle d'argent", "Silberne Perle" }, // "Perla de Plata progresiva" + Text{"Adult Scale", "Γ‰caille d'adulte", "Große Schuppe" }, // "Bola de bolos zora" + Text{"Zora Scale", "Γ‰caille Zora", "Zora-Schuppe" }, // "Escama de Zora" }; trickNameTable[GI_SCALE_2] = { - Text{"Golden Pearl", "Perle d'or", "Perla de Oro progresiva"}, - Text{"Giant Scale", "Γ‰caille de gΓ©ant", "Escama de Faren"}, - Text{"Water Dragon Scale", "Γ‰caille du dragon de l'eau", "Escama de dragΓ³n acuΓ‘tico"}, + Text{"Golden Pearl", "Perle d'or", "Goldene Perle" }, // "Perla de Oro progresiva" + Text{"Giant Scale", "Γ‰caille de gΓ©ant", "Riesenschuppe" }, // "Escama de Faren" + Text{"Water Dragon Scale", "Γ‰caille du dragon de l'eau", "Wasserdrachenschuppe" }, // "Escama de dragΓ³n + acuΓ‘tico" }; trickNameTable[GI_WALLET_1] = { - Text{"Rupee Capacity (200)", "CapacitΓ© de rubis (200)", "Capacidad de rupias (200)"}, - Text{"Silver Wallet", "Bourse d'argent", "Cartera de rupias de adulto"}, - Text{"Medium Wallet", "Bourse moyenne", "ZurrΓ³n de rupias mediano"}, + Text{"Rupee Capacity (200)", "CapacitΓ© de rubis (200)", "RubinkapazitΓ€t (200)" }, // "Capacidad de rupias (200)" + Text{"Silver Wallet", "Bourse d'argent", "Silberne GeldbΓΆrse" }, // "Cartera de rupias de adulto" + Text{"Medium Wallet", "Bourse moyenne", "Mittlere GeldbΓΆrse" }, // "ZurrΓ³n de rupias mediano" }; trickNameTable[GI_WALLET_2] = { - Text{"Rupee Capacity (500)", "CapacitΓ© de rubis (500)", "Capacidad de rupias (500)"}, - Text{"Golden Wallet", "Bourse d'or", "Cartera de rupias gigante"}, - Text{"Large Wallet", "Grosse Bourse", "ZurrΓ³n de rupias grande"}, + Text{"Rupee Capacity (500)", "CapacitΓ© de rubis (500)", "Rubin-KapazitΓ€t (500)" }, // "Capacidad de rupias + (500)" Text{"Golden Wallet", "Bourse d'or", "Riesenportemonnaie" }, // "Cartera de rupias gigante" Text{"Large + Wallet", "Grosse Bourse", "Gigantische GeldbΓΆrse" }, // "ZurrΓ³n de rupias grande" }; trickNameTable[GI_WALLET_3] = { - Text{"Rupee Capacity (999)", "CapacitΓ© de rubis (999)", "Capacidad de rupias (999)"}, - Text{"Golden Wallet", "Bourse d'or", "Cartera de ricachΓ³n"}, - Text{"Large Wallet", "Grosse Bourse", "ZurrΓ³n de rupias gigante"}, + Text{"Rupee Capacity (999)", "CapacitΓ© de rubis (999)", "Rubin-KapazitΓ€t (999) }, // "Capacidad de rupias (999)" + Text{"Golden Wallet", "Bourse d'or", "Goldenes Portemonnaie" }, // "Cartera de ricachΓ³n" + Text{"Large Wallet", "Grosse Bourse", "Gigantische GeldbΓΆrse" }, // "ZurrΓ³n de rupias gigante" }; trickNameTable[GI_DEKU_NUT_UPGRADE_1] = { - Text{"Deku Bomb Capacity (30)", "CapacitΓ© de bombes Mojo (30)", "Capacidad de semillas deku (40)"}, - Text{"Baba Nut Capacity (30)", "CapacitΓ© de noix Baba (30)", "Capacidad de nueces baba (40)"}, - Text{"Deku Nut Pack (30)", "Paquet de noix Mojo (30)", "Capacidad de nueces mojo (40)"}, + Text{"Deku Bomb Capacity (30)", "CapacitΓ© de bombes Mojo (30)", "Deku-Bomben-KapazitΓ€t (30)" }, // "Capacidad de + semillas deku (40)" Text{"Baba Nut Capacity (30)", "CapacitΓ© de noix Baba (30)", "Ranha-Nuß-KapazitΓ€t (30)" }, // + "Capacidad de nueces baba (40)" Text{"Deku Nut Pack (30)", "Paquet de noix Mojo (30)", "Deku-Nußrucksack (30)" }, // + "Capacidad de nueces mojo (40)" }; trickNameTable[GI_DEKU_NUT_UPGRADE_2] = { - Text{"Deku Bomb Capacity (40)", "CapacitΓ© de bombes Mojo (40)", "Capacidad de semillas deku (50)"}, - Text{"Baba Nut Capacity (40)", "CapacitΓ© de noix Baba (40)", "Capacidad de nueces baba (50)"}, - Text{"Deku Nut Pack (40)", "Paquet de noix Mojo (40)", "Capacidad de nueces mojo (50)"}, + Text{"Deku Bomb Capacity (40)", "CapacitΓ© de bombes Mojo (40)", "Deku-Bomben-KapazitΓ€t (40)" }, // "Capacidad de + semillas deku (50)" Text{"Baba Nut Capacity (40)", "CapacitΓ© de noix Baba (40)", "Ranha-Nuß-KapazitΓ€t (40)" }, // + "Capacidad de nueces baba (50)" Text{"Deku Nut Pack (40)", "Paquet de noix Mojo (40)", "Deku-Nußrucksack (40)" }, // + "Capacidad de nueces mojo (50)" }; trickNameTable[GI_DEKU_STICK_UPGRADE_1] = { - Text{"Deku Rod Capacity (20)", "CapacitΓ© de tiges Mojo (20)", "Capacidad de palos mojo (20)"}, - Text{"Boko Stick Capacity (20)", "CapacitΓ© de BΓ’tons Boko (20)", "Capacidad de palos boko (20)"}, - Text{"Deku Stick Pack (20)", "Paquet de bΓ’tons Mojo (20)", "Capacidad de bastones deku (20)"}, + Text{"Deku Rod Capacity (20)", "CapacitΓ© de tiges Mojo (20)", "Deku-Stock-KapazitΓ€t (20)" }, // "Capacidad de + palos mojo (20)" Text{"Boko Stick Capacity (20)", "CapacitΓ© de BΓ’tons Boko (20)", "Bokstock-KapazitΓ€t (20)" }, // + "Capacidad de palos boko (20)" Text{"Deku Stick Pack (20)", "Paquet de bΓ’tons Mojo (20)", "Deku-Stabrucksack (20)" + }, // "Capacidad de bastones deku (20)" }; trickNameTable[GI_DEKU_STICK_UPGRADE_2] = { - Text{"Deku Rod Capacity (30)", "CapacitΓ© de tiges Mojo (30)", "Capacidad de palos mojo (30)"}, - Text{"Boko Stick Capacity (30)", "CapacitΓ© de BΓ’tons Boko (30)", "Capacidad de palos boko (30)"}, - Text{"Deku Stick Pack (30)", "Paquet de bΓ’tons Mojo (30)", "Capacidad de bastones deku (30)"}, + Text{"Deku Rod Capacity (30)", "CapacitΓ© de tiges Mojo (30)", "Deku-Stock-KapazitΓ€t (30)" }, // "Capacidad de + palos mojo (30)" Text{"Boko Stick Capacity (30)", "CapacitΓ© de BΓ’tons Boko (30)", "Bokstock-KapazitΓ€t (30)" }, // + "Capacidad de palos boko (30)" Text{"Deku Stick Pack (30)", "Paquet de bΓ’tons Mojo (30)", "Deku-Stabrucksack (30)" + }, // "Capacidad de bastones deku (30)" }; trickNameTable[GI_MAGIC_1] = { - Text{"Stamina Meter", "Jauge d'endurance", "Medidor de vigor"}, - Text{"Energy Meter", "Jauge d'Γ©nergie", "Medidor de energΓ­a"}, - Text{"Magic Powder", "Poudre magique", "Medidor de carga"}, + Text{"Stamina Meter", "Jauge d'endurance", "Ausdauerleiste" }, // "Medidor de vigor" + Text{"Energy Meter", "Jauge d'Γ©nergie", "Energieleiste" }, // "Medidor de energΓ­a" + Text{"Magic Powder", "Poudre magique", "Zauberpulver" }, // "Medidor de carga" }; trickNameTable[GI_MAGIC_2] = { - Text{"Enhanced Stamina Meter", "Jauge d'endurance amΓ©liorΓ©e", "Medidor de vigor mejorado"}, - Text{"Enhanced Energy Meter", "Jauge d'Γ©nergie amΓ©liorΓ©e", "Medidor de energΓ­a mejorado"}, - Text{"Enhanced Magic Powder", "Poudre magique amΓ©liorΓ©e", "Medidor de carga mejorado"}, + Text{"Enhanced Stamina Meter", "Jauge d'endurance amΓ©liorΓ©e", "Verb. Ausdauerleiste" }, // "Medidor de vigor + mejorado" Text{"Enhanced Energy Meter", "Jauge d'Γ©nergie amΓ©liorΓ©e", "Verb. Energieleiste" }, // "Medidor de energΓ­a + mejorado" Text{"Enhanced Magic Powder", "Poudre magique amΓ©liorΓ©e", "Verb. Zauberpulver" }, // "Medidor de carga + mejorado" }; trickNameTable[GI_OCARINA_1] = { - Text{"Ocarina", "Ocarina", "Ocarina"}, - Text{"Saria's Ocarina", "Ocarina de Saria", "Ocarina de Saria"}, - Text{"Wood Ocarina", "Ocarina de bois", "Ocarina del Hada"}, + Text{"Ocarina", "Ocarina", "Okarina" }, // "Ocarina" + Text{"Saria's Ocarina", "Ocarina de Saria", "Salias Okarina" }, // "Ocarina de Saria" + Text{"Wood Ocarina", "Ocarina de bois", "Holzokarina" }, // "Ocarina del Hada" }; trickNameTable[GI_OCARINA_2] = { - Text{"Flute", "FlΓ»te", "Flauta"}, - Text{"Zelda's Ocarina", "Ocarina de Zelda", "Ocarina de Zelda"}, - Text{"Ocarina of Winds", "Ocarina des vents", "Ocarina del Viento"}, + Text{"Flute", "FlΓ»te", "FlΓΆte" }, // "Flauta" + Text{"Zelda's Ocarina", "Ocarina de Zelda", "Zeldas Okarina" }, // "Ocarina de Zelda" + Text{"Ocarina of Winds", "Ocarina des vents", "Okarina des Windes" }, // "Ocarina del Viento" }; trickNameTable[GI_CUCCO] = { - Text{"D.I.Y. Alarm Clock", "RΓ©veille-matin improvisΓ©", "Alarma emplumada"}, - Text{"Kakariko Cucco", "Cocotte Cocorico", "Cuco de Kakariko"}, - Text{"Hatched Cucco", "Cocotte Γ©close", "Pollo"}, + Text{"D.I.Y. Alarm Clock", "RΓ©veille-matin improvisΓ©", "Improvisierter Wecker"}, // "Alarma emplumada" + Text{"Kakariko Cucco", "Cocotte Cocorico", "Kakariko Huhn" }, // "Cuco de Kakariko" + Text{"Hatched Cucco", "Cocotte Γ©close", "GeschlΓΌpftes KΓΌken" }, // "Pollo" }; trickNameTable[GI_MASK_KEATON] = { - Text{"Kee... Something Mask", "Masque de Quiche", "MΓ‘scara Kealgo"}, - Text{"Kitsune Mask", "Masque de Kitsune", "MΓ‘scara Kitsune"}, - Text{"Kafei's Mask", "Masque de Kafei", "MΓ‘scara de Kafei"}, + Text{"Kee... Something Mask", "Masque de Quiche", "Keaton-Maske" }, // "MΓ‘scara Kealgo" + Text{"Kitsune Mask", "Masque de Kitsune", "Kitsune-Maske" }, // "MΓ‘scara Kitsune" + Text{"Kafei's Mask", "Masque de Kafei", "Kafeis Maske" }, // "MΓ‘scara de Kafei" }; trickNameTable[GI_MASK_SKULL] = { - Text{"Skull Kid's Mask", "Masque de Skull Kid", "MΓ‘scara de Skull Kid"}, - Text{"Stalfos Mask", "Masque de squelette", "MΓ‘scara de Stalfos"}, - Text{"Captain's Hat", "Heaume du capitaine", "Casco del capitΓ‘n"}, + Text{"Skull Kid's Mask", "Masque de Skull Kid", "Horror-Kids-Maske" }, // "MΓ‘scara de Skull Kid" + Text{"Stalfos Mask", "Masque de squelette", "Stalfos-Maske" }, // "MΓ‘scara de Stalfos" + Text{"Captain's Hat", "Heaume du capitaine", "Helm des Hauptmanns" }, // "Casco del capitΓ‘n" }; trickNameTable[GI_MASK_SPOOKY] = { - Text{"Skrik Mask", "Masque Skrik", "MΓ‘scara Escalofriante"}, - Text{"ReDead Mask", "Masque de Remort", "MΓ‘scara de ReDead"}, - Text{"Gibdo Mask", "Masque de Gibdo", "Careta de Gibdo"}, + Text{"Skrik Mask", "Masque Skrik", "Grusel-Maske" }, // "MΓ‘scara Escalofriante" + Text{"ReDead Mask", "Masque de Remort", "Remort-Maske" }, // "MΓ‘scara de ReDead" + Text{"Gibdo Mask", "Masque de Gibdo", "Gibdo-Maske" }, // "Careta de Gibdo" }; trickNameTable[GI_MASK_BUNNY] = { - Text{"Peppy Mask", "Masque de Peppy", "Capucha de Pascua"}, - Text{"Bunny Ears", "Oreilles de lapin", "Orejas de conejo"}, - Text{"Postman's Hat", "Casquette du facteur", "Gorra de cartero"}, + Text{"Peppy Mask", "Masque de Peppy", "Peppy-Maske" }, // "Capucha de Pascua" + Text{"Bunny Ears", "Oreilles de lapin", "OhrlΓΆffel" }, // "Orejas de conejo" + Text{"Postman's Hat", "Casquette du facteur", "MΓΌtze des Postboten" }, // "Gorra de cartero" }; trickNameTable[GI_MASK_GORON] = { - Text{"Goro Mask", "Masque Goro", "MΓ‘scara Goro"}, - Text{"Mask of Goron", "Masque des Gorons", "MΓ‘scara de los Goron"}, - Text{"Darunia Mask", "Masque de Darunia", "MΓ‘scara de Darmani"}, + Text{"Goro Mask", "Masque Goro", "Garos Maske" }, // "MΓ‘scara Goro" + Text{"Mask of Goron", "Masque des Gorons", "Goronen-Haut" }, // "MΓ‘scara de los Goron" + Text{"Darunia Mask", "Masque de Darunia", }, "Darunias Maske" // "MΓ‘scara de Darmani" }; trickNameTable[GI_MASK_ZORA] = { - Text{"Zola Mask", "Masque Zola", "MΓ‘scara Zola"}, - Text{"Mask of Zora", "Masque des Zoras", "MΓ‘scara de los Zora"}, - Text{"Ruto Mask", "Masque de Ruto", "MΓ‘scara de Mikau"}, + Text{"Zola Mask", "Masque Zola", "Zola-Maske" }, // "MΓ‘scara Zola" + Text{"Mask of Zora", "Masque des Zoras", "Zora-Schuppen€" }, // "MΓ‘scara de los Zora" + Text{"Ruto Mask", "Masque de Ruto", "Rutos Maske" }, // "MΓ‘scara de Mikau" }; trickNameTable[GI_MASK_GERUDO] = { - Text{"Ganguro Mask", "Masque de Ganguro", "MΓ‘scara Canguro"}, - Text{"Mask of Gerudo", "Masque des Gerudos", "MΓ‘scara de las Gerudo"}, - Text{"Nabooru Mask", "Masque de Nabooru", "MΓ‘scara de Nabooru"}, + Text{"Ganguro Mask", "Masque de Ganguro", "Ganguro-Maske" }, // "MΓ‘scara Canguro" + Text{"Mask of Gerudo", "Masque des Gerudos", "Gerudo-PerΓΌcke" }, // "MΓ‘scara de las Gerudo" + Text{"Nabooru Mask", "Masque de Nabooru", "Naborus Maske" }, // "MΓ‘scara de Nabooru" }; trickNameTable[GI_MASK_TRUTH] = { - Text{"Sheikah Mask", "Masque Sheikah", "MΓ‘scara Sheikah"}, - Text{"Mask of Gossip", "Masque de potins", "MΓ‘scara chismosa"}, - Text{"Eye of Truth", "oeil de vΓ©ritΓ©", "Ojo de la Verdad"}, + Text{"Sheikah Mask", "Masque Sheikah", "Shiekah-Maske" }, // "MΓ‘scara Sheikah" + Text{"Mask of Gossip", "Masque de potins", "Maske der Mythen" }, // "MΓ‘scara chismosa" + Text{"Eye of Truth", "oeil de vΓ©ritΓ©", "Auge der Wahrheit" }, // "Ojo de la Verdad" }; */ } diff --git a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp index a1c912773..3c91a1f70 100644 --- a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp @@ -79,6 +79,9 @@ static void WriteLocation(std::string sphere, const RandomizerCheck locationKey, default: jsonData["playthrough"][sphere][location->GetName()] = itemLocation->GetPlacedItemName().GetEnglish(); break; + case LANGUAGE_GER: + jsonData["playthrough"][sphere][location->GetName()] = itemLocation->GetPlacedItemName().GetGerman(); + break; case LANGUAGE_FRA: jsonData["playthrough"][sphere][location->GetName()] = itemLocation->GetPlacedItemName().GetFrench(); break; @@ -128,6 +131,7 @@ static void WriteShuffledEntrance(std::string sphereString, Entrance* entrance) switch (gSaveContext.language) { case LANGUAGE_ENG: + case LANGUAGE_GER: case LANGUAGE_FRA: default: jsonData["entrancesMap"][sphereString][name] = text; @@ -269,6 +273,9 @@ static void WriteAllLocations() { default: placedItemName = location->GetPlacedItemName().GetEnglish(); break; + case 1: + placedItemName = location->GetPlacedItemName().GetGerman(); + break; case 2: placedItemName = location->GetPlacedItemName().GetFrench(); break; @@ -307,6 +314,15 @@ static void WriteAllLocations() { jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()] ["trickName"] = ctx->overrides[location->GetRandomizerCheck()].GetTrickName().GetEnglish(); break; + case 1: + jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()] + ["model"] = Rando::StaticData::RetrieveItem( + ctx->overrides[location->GetRandomizerCheck()].LooksLike()) + .GetName() + .GetGerman(); + jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()] + ["trickName"] = ctx->overrides[location->GetRandomizerCheck()].GetTrickName().GetGerman(); + break; case 2: jsonData["locations"][Rando::StaticData::GetLocation(location->GetRandomizerCheck())->GetName()] ["model"] = Rando::StaticData::RetrieveItem( diff --git a/soh/soh/Enhancements/randomizer/3drando/text.hpp b/soh/soh/Enhancements/randomizer/3drando/text.hpp index 1196ac928..6e53ac11b 100644 --- a/soh/soh/Enhancements/randomizer/3drando/text.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/text.hpp @@ -9,18 +9,16 @@ class Text { public: Text() = default; - Text(std::string english_, std::string french_, std::string spanish_) - : english(std::move(english_)), french(std::move(french_)), spanish(std::move(spanish_)), - german(std::move("")) { - // german defaults to english text until a translation is provided. - german = english; + Text(std::string english_, std::string french_, std::string german_) + : english(std::move(english_)), french(std::move(french_)), german(std::move(german_)), spanish(std::move("")) { + // spanish defaults to english text until a translation is provided. + spanish = english; } - Text(std::string english_, std::string french_, std::string spanish_, std::string german_) - : english(std::move(english_)), french(std::move(french_)), spanish(std::move(spanish_)), - german(std::move(german_)) { + Text(std::string english_, std::string french_, std::string german_, std::string spanish_) + : english(std::move(english_)), french(std::move(french_)), german(std::move(german_)), spanish(std::move("")) { } Text(std::string english_) - : english(std::move(english_)), french(std::move("")), spanish(std::move("")), german(std::move("")) { + : english(std::move(english_)), french(std::move("")), german(std::move("")), spanish(std::move("")) { // default unprovided languages to english text french = spanish = german = english; } @@ -36,19 +34,18 @@ class Text { return english; } - const std::string& GetSpanish() const { - if (spanish.length() > 0) { - return spanish; - } - return english; - } - const std::string& GetGerman() const { if (german.length() > 0) { return german; } return english; } + const std::string& GetSpanish() const { + if (spanish.length() > 0) { + return spanish; + } + return english; + } const std::string& GetForLanguage(uint8_t language) const { switch (language) { @@ -64,12 +61,21 @@ class Text { } Text operator+(const Text& right) const { - return Text{ english + right.GetEnglish(), french + right.GetFrench(), spanish + right.GetSpanish(), - german + right.GetGerman() }; + return Text{ + english + right.GetEnglish(), + french + right.GetFrench(), + german + right.GetGerman(), + spanish + right.GetSpanish(), + }; } Text operator+(const std::string& right) const { - return Text{ english + right, french + right, spanish + right, german + right }; + return Text{ + english + right, + french + right, + german + right, + spanish + right, + }; } bool operator==(const Text& right) const { @@ -77,7 +83,7 @@ class Text { } bool operator==(const std::string& right) const { - return english == right || french == right || spanish == right || german == right; + return english == right || french == right || german == right || spanish == right; } bool operator!=(const Text& right) const { @@ -86,7 +92,7 @@ class Text { void Replace(std::string oldStr, std::string newStr) { - for (std::string* str : { &english, &french, &spanish, &german }) { + for (std::string* str : { &english, &french, &german, &spanish }) { size_t position = str->find(oldStr); while (position != std::string::npos) { str->replace(position, oldStr.length(), newStr); @@ -106,22 +112,22 @@ class Text { french.replace(position, oldStr.length(), newText.GetFrench()); position = french.find(oldStr); } - position = spanish.find(oldStr); - while (position != std::string::npos) { - spanish.replace(position, oldStr.length(), newText.GetSpanish()); - position = spanish.find(oldStr); - } position = german.find(oldStr); while (position != std::string::npos) { german.replace(position, oldStr.length(), newText.GetGerman()); position = german.find(oldStr); } + position = spanish.find(oldStr); + while (position != std::string::npos) { + spanish.replace(position, oldStr.length(), newText.GetSpanish()); + position = spanish.find(oldStr); + } } // Convert first char to upper case Text Capitalize(void) const { Text cap = *this + ""; - for (std::string* str : { &cap.english, &cap.french, &cap.spanish, &cap.german }) { + for (std::string* str : { &cap.english, &cap.french, &cap.german, &cap.spanish }) { (*str)[0] = std::toupper((*str)[0]); } return cap; @@ -129,7 +135,7 @@ class Text { // find the appropriate bars that separate singular from plural void SetForm(int form) { - for (std::string* str : { &english, &french, &spanish, &german }) { + for (std::string* str : { &english, &french, &german, &spanish }) { size_t firstBar = str->find('|'); if (firstBar != std::string::npos) { @@ -155,6 +161,6 @@ class Text { std::string english = ""; std::string french = ""; - std::string spanish = ""; std::string german = ""; + std::string spanish = ""; }; diff --git a/soh/soh/Enhancements/randomizer/hint.cpp b/soh/soh/Enhancements/randomizer/hint.cpp index 4c3de9770..c98ecea15 100644 --- a/soh/soh/Enhancements/randomizer/hint.cpp +++ b/soh/soh/Enhancements/randomizer/hint.cpp @@ -358,6 +358,7 @@ const CustomMessage Hint::GetHintMessage(MessageFormat format, size_t id) const } hintText.InsertNames(toInsert); + hintText.SetSingularPlural(); if (num != 0) { hintText.InsertNumber(num); diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp index 56001db48..786717c80 100644 --- a/soh/soh/Enhancements/randomizer/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -23,9 +23,9 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_BIGGORON_SWORD] = Item(RG_BIGGORON_SWORD, Text{ "Biggoron's Sword", "Γ‰pΓ©e de Biggoron", "Biggoron-Schwert" }, ITEMTYPE_EQUIP, GI_SWORD_BGS, true, LOGIC_BIGGORON_SWORD, RHT_BIGGORON_SWORD, ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x0C, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_DEKU_SHIELD] = Item(RG_DEKU_SHIELD, Text{ "Deku Shield", "Bouclier Mojo", "Deku-Schild" }, ITEMTYPE_EQUIP, GI_SHIELD_DEKU, false, LOGIC_DEKU_SHIELD, RHT_DEKU_SHIELD, ITEM_SHIELD_DEKU, OBJECT_GI_SHIELD_1, GID_SHIELD_DEKU, 0x4C, 0xA0, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_HYLIAN_SHIELD] = Item(RG_HYLIAN_SHIELD, Text{ "Hylian Shield", "Bouclier Hylien", "Hylia-Schild" }, ITEMTYPE_EQUIP, GI_SHIELD_HYLIAN, false, LOGIC_HYLIAN_SHIELD, RHT_HYLIAN_SHIELD, ITEM_SHIELD_HYLIAN, OBJECT_GI_SHIELD_2, GID_SHIELD_HYLIAN, 0x4D, 0xA0, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); - itemTable[RG_MIRROR_SHIELD] = Item(RG_MIRROR_SHIELD, Text{ "Mirror Shield", "Bouclier Miroir", "Spiegelschild" }, ITEMTYPE_EQUIP, GI_SHIELD_MIRROR, true, LOGIC_MIRROR_SHIELD, RHT_MIRROR_SHIELD, ITEM_SHIELD_MIRROR, OBJECT_GI_SHIELD_3, GID_SHIELD_MIRROR, 0x4E, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_GORON_TUNIC] = Item(RG_GORON_TUNIC, Text{ "Goron Tunic", "Tunique Goron", "Goronen-Tunika" }, ITEMTYPE_EQUIP, GI_TUNIC_GORON, true, LOGIC_GORON_TUNIC, RHT_GORON_TUNIC, ITEM_TUNIC_GORON, OBJECT_GI_CLOTHES, GID_TUNIC_GORON, 0x50, 0xA0, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); - itemTable[RG_ZORA_TUNIC] = Item(RG_ZORA_TUNIC, Text{ "Zora Tunic", "Tunique Zora", "Zora-Tunika" }, ITEMTYPE_EQUIP, GI_TUNIC_ZORA, true, LOGIC_ZORA_TUNIC, RHT_ZORA_TUNIC, ITEM_TUNIC_ZORA, OBJECT_GI_CLOTHES, GID_TUNIC_ZORA, 0x51, 0xA0, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_MIRROR_SHIELD] = Item(RG_MIRROR_SHIELD, Text{ "Mirror Shield", "Bouclier Miroir", "Spiegel-Schild" }, ITEMTYPE_EQUIP, GI_SHIELD_MIRROR, true, LOGIC_MIRROR_SHIELD, RHT_MIRROR_SHIELD, ITEM_SHIELD_MIRROR, OBJECT_GI_SHIELD_3, GID_SHIELD_MIRROR, 0x4E, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_GORON_TUNIC] = Item(RG_GORON_TUNIC, Text{ "Goron Tunic", "Tunique Goron", "Goronen-RΓΌstung" }, ITEMTYPE_EQUIP, GI_TUNIC_GORON, true, LOGIC_GORON_TUNIC, RHT_GORON_TUNIC, ITEM_TUNIC_GORON, OBJECT_GI_CLOTHES, GID_TUNIC_GORON, 0x50, 0xA0, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_ZORA_TUNIC] = Item(RG_ZORA_TUNIC, Text{ "Zora Tunic", "Tunique Zora", "Zora-RΓΌstung" }, ITEMTYPE_EQUIP, GI_TUNIC_ZORA, true, LOGIC_ZORA_TUNIC, RHT_ZORA_TUNIC, ITEM_TUNIC_ZORA, OBJECT_GI_CLOTHES, GID_TUNIC_ZORA, 0x51, 0xA0, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_IRON_BOOTS] = Item(RG_IRON_BOOTS, Text{ "Iron Boots", "Bottes de plomb", "Eisenstiefel" }, ITEMTYPE_EQUIP, GI_BOOTS_IRON, true, LOGIC_IRON_BOOTS, RHT_IRON_BOOTS, ITEM_BOOTS_IRON, OBJECT_GI_BOOTS_2, GID_BOOTS_IRON, 0x53, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_HOVER_BOOTS] = Item(RG_HOVER_BOOTS, Text{ "Hover Boots", "Bottes de airs", "Gleitstiefel" }, ITEMTYPE_EQUIP, GI_BOOTS_HOVER, true, LOGIC_HOVER_BOOTS, RHT_HOVER_BOOTS, ITEM_BOOTS_HOVER, OBJECT_GI_HOVERBOOTS, GID_BOOTS_HOVER, 0x54, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_BOOMERANG] = Item(RG_BOOMERANG, Text{ "Boomerang", "Boomerang", "Bumerang" }, ITEMTYPE_ITEM, GI_BOOMERANG, true, LOGIC_BOOMERANG, RHT_BOOMERANG, ITEM_BOOMERANG, OBJECT_GI_BOOMERANG, GID_BOOMERANG, 0x35, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); @@ -35,9 +35,9 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_DINS_FIRE] = Item(RG_DINS_FIRE, Text{ "Din's Fire", "Feu de Din", "Dins Feuerinferno" }, ITEMTYPE_ITEM, GI_DINS_FIRE, true, LOGIC_DINS_FIRE, RHT_DINS_FIRE, ITEM_DINS_FIRE, OBJECT_GI_GODDESS, GID_DINS_FIRE, 0xAD, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_FARORES_WIND] = Item(RG_FARORES_WIND, Text{ "Farore's Wind", "Vent de Farore", "Farores Donnersturm" }, ITEMTYPE_ITEM, GI_FARORES_WIND, true, LOGIC_FARORES_WIND, RHT_FARORES_WIND, ITEM_FARORES_WIND, OBJECT_GI_GODDESS, GID_FARORES_WIND, 0xAE, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_NAYRUS_LOVE] = Item(RG_NAYRUS_LOVE, Text{ "Nayru's Love", "Amour de Nayru", "Nayrus Umarmung" }, ITEMTYPE_ITEM, GI_NAYRUS_LOVE, true, LOGIC_NAYRUS_LOVE, RHT_NAYRUS_LOVE, ITEM_NAYRUS_LOVE, OBJECT_GI_GODDESS, GID_NAYRUS_LOVE, 0xAF, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_FIRE_ARROWS] = Item(RG_FIRE_ARROWS, Text{ "Fire Arrow", "FlΓ¨che de Feu", "Feuerpfeil" }, ITEMTYPE_ITEM, GI_ARROW_FIRE, true, LOGIC_FIRE_ARROWS, RHT_FIRE_ARROWS, ITEM_ARROW_FIRE, OBJECT_GI_M_ARROW, GID_ARROW_FIRE, 0x70, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_ICE_ARROWS] = Item(RG_ICE_ARROWS, Text{ "Ice Arrow", "FlΓ¨che de Glace", "Eispfeil" }, ITEMTYPE_ITEM, GI_ARROW_ICE, true, LOGIC_ICE_ARROWS, RHT_ICE_ARROWS, ITEM_ARROW_ICE, OBJECT_GI_M_ARROW, GID_ARROW_ICE, 0x71, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_LIGHT_ARROWS] = Item(RG_LIGHT_ARROWS, Text{ "Light Arrow", "FlΓ¨che de LumiΓ¨re", "Lichtpfeil" }, ITEMTYPE_ITEM, GI_ARROW_LIGHT, true, LOGIC_LIGHT_ARROWS, RHT_LIGHT_ARROWS, ITEM_ARROW_LIGHT, OBJECT_GI_M_ARROW, GID_ARROW_LIGHT, 0x72, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_FIRE_ARROWS] = Item(RG_FIRE_ARROWS, Text{ "Fire Arrow", "FlΓ¨che de Feu", "Feuer-Pfeile" }, ITEMTYPE_ITEM, GI_ARROW_FIRE, true, LOGIC_FIRE_ARROWS, RHT_FIRE_ARROWS, ITEM_ARROW_FIRE, OBJECT_GI_M_ARROW, GID_ARROW_FIRE, 0x70, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_ICE_ARROWS] = Item(RG_ICE_ARROWS, Text{ "Ice Arrow", "FlΓ¨che de Glace", "Eis-Pfeile" }, ITEMTYPE_ITEM, GI_ARROW_ICE, true, LOGIC_ICE_ARROWS, RHT_ICE_ARROWS, ITEM_ARROW_ICE, OBJECT_GI_M_ARROW, GID_ARROW_ICE, 0x71, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_LIGHT_ARROWS] = Item(RG_LIGHT_ARROWS, Text{ "Light Arrow", "FlΓ¨che de LumiΓ¨re", "Licht-Pfeile" }, ITEMTYPE_ITEM, GI_ARROW_LIGHT, true, LOGIC_LIGHT_ARROWS, RHT_LIGHT_ARROWS, ITEM_ARROW_LIGHT, OBJECT_GI_M_ARROW, GID_ARROW_LIGHT, 0x72, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_GERUDO_MEMBERSHIP_CARD] = Item(RG_GERUDO_MEMBERSHIP_CARD, Text{ "Gerudo Membership Card", "Carte Gerudo", "Gerudo-Pass" }, ITEMTYPE_ITEM, GI_GERUDO_CARD, true, LOGIC_GERUDO_CARD, RHT_GERUDO_MEMBERSHIP_CARD, ITEM_GERUDO_CARD, OBJECT_GI_GERUDO, GID_GERUDO_CARD, 0x7B, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_MAGIC_BEAN] = Item(RG_MAGIC_BEAN, Text{ "Magic Bean", "Haricots Magiques", "Wundererbse" }, ITEMTYPE_ITEM, GI_BEAN, true, LOGIC_MAGIC_BEAN, RHT_MAGIC_BEAN, ITEM_BEAN, OBJECT_GI_BEAN, GID_BEAN, 0x48, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_MAGIC_BEAN_PACK] = Item(RG_MAGIC_BEAN_PACK, Text{ "Magic Bean Pack", "Paquet de Haricots Magiques", "Wundererbsen-Packung" }, ITEMTYPE_ITEM, RG_MAGIC_BEAN_PACK, true, LOGIC_MAGIC_BEAN, RHT_MAGIC_BEAN_PACK, RG_MAGIC_BEAN_PACK, OBJECT_GI_BEAN, GID_BEAN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); @@ -51,40 +51,40 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_ODD_MUSHROOM] = Item(RG_ODD_MUSHROOM, Text{ "Odd Mushroom", "Champigon Suspect", "Schimmelpilz" }, ITEMTYPE_ITEM, GI_ODD_MUSHROOM, true, LOGIC_ODD_MUSHROOM, RHT_ODD_MUSHROOM, ITEM_ODD_MUSHROOM, OBJECT_GI_MUSHROOM, GID_ODD_MUSHROOM, 0x03, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_ODD_POTION] = Item(RG_ODD_POTION, Text{ "Odd Potion", "Mixture Suspecte", "Modertrank" }, ITEMTYPE_ITEM, GI_ODD_POTION, true, LOGIC_ODD_POULTICE, RHT_ODD_POTION, ITEM_ODD_POTION, OBJECT_GI_POWDER, GID_ODD_POTION, 0x04, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_POACHERS_SAW] = Item(RG_POACHERS_SAW, Text{ "Poacher's Saw", "Scie du Chasseur", "SΓ€ge" }, ITEMTYPE_ITEM, GI_SAW, true, LOGIC_POACHERS_SAW, RHT_POACHERS_SAW, ITEM_SAW, OBJECT_GI_SAW, GID_SAW, 0x05, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_BROKEN_SWORD] = Item(RG_BROKEN_SWORD, Text{ "Broken Goron's Sword", "Γ‰pΓ©e BrisΓ©e de Goron", "Zerbrochenes Goronen-Schwert" }, ITEMTYPE_ITEM, GI_SWORD_BROKEN, true, LOGIC_BROKEN_SWORD, RHT_BROKEN_SWORD, ITEM_SWORD_BROKEN, OBJECT_GI_BROKENSWORD, GID_SWORD_BROKEN, 0x08, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_BROKEN_SWORD] = Item(RG_BROKEN_SWORD, Text{ "Broken Goron's Sword", "Γ‰pΓ©e BrisΓ©e de Goron", "zerbr. Goronen-Schwert" }, ITEMTYPE_ITEM, GI_SWORD_BROKEN, true, LOGIC_BROKEN_SWORD, RHT_BROKEN_SWORD, ITEM_SWORD_BROKEN, OBJECT_GI_BROKENSWORD, GID_SWORD_BROKEN, 0x08, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_PRESCRIPTION] = Item(RG_PRESCRIPTION, Text{ "Prescription", "Ordonnance", "Rezept" }, ITEMTYPE_ITEM, GI_PRESCRIPTION, true, LOGIC_PRESCRIPTION, RHT_PRESCRIPTION, ITEM_PRESCRIPTION, OBJECT_GI_PRESCRIPTION, GID_PRESCRIPTION, 0x09, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_EYEBALL_FROG] = Item(RG_EYEBALL_FROG, Text{ "Eyeball Frog", "Crapaud-qui-louche", "Glotzfrosch" }, ITEMTYPE_ITEM, GI_FROG, true, LOGIC_EYEBALL_FROG, RHT_EYEBALL_FROG, ITEM_FROG, OBJECT_GI_FROG, GID_FROG, 0x0D, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_EYEDROPS] = Item(RG_EYEDROPS, Text{ "World's Finest Eyedrops", "Super Gouttes", "Augentropfen" }, ITEMTYPE_ITEM, GI_EYEDROPS, true, LOGIC_EYEDROPS, RHT_EYEDROPS, ITEM_EYEDROPS, OBJECT_GI_EYE_LOTION, GID_EYEDROPS, 0x0E, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_CLAIM_CHECK] = Item(RG_CLAIM_CHECK, Text{ "Claim Check", "Certificat", "Zertifikat" }, ITEMTYPE_ITEM, GI_CLAIM_CHECK, true, LOGIC_CLAIM_CHECK, RHT_CLAIM_CHECK, ITEM_CLAIM_CHECK, OBJECT_GI_TICKETSTONE, GID_CLAIM_CHECK, 0x0A, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); // Skulltula Token - itemTable[RG_GOLD_SKULLTULA_TOKEN] = Item(RG_GOLD_SKULLTULA_TOKEN, Text{ "Gold Skulltula Token", "Symbole de Skulltula d'Or", "Goldenes Skulltula-Symbol" }, ITEMTYPE_TOKEN, GI_SKULL_TOKEN, true, LOGIC_GOLD_SKULLTULA_TOKENS, RHT_GOLD_SKULLTULA_TOKEN, ITEM_SKULL_TOKEN, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, 0xB4, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SKULLTULA_TOKEN, MOD_NONE); + itemTable[RG_GOLD_SKULLTULA_TOKEN] = Item(RG_GOLD_SKULLTULA_TOKEN, Text{ "Gold Skulltula Token", "Symbole de Skulltula d'Or", "Skulltula-Symbol" }, ITEMTYPE_TOKEN, GI_SKULL_TOKEN, true, LOGIC_GOLD_SKULLTULA_TOKENS, RHT_GOLD_SKULLTULA_TOKEN, ITEM_SKULL_TOKEN, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, 0xB4, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SKULLTULA_TOKEN, MOD_NONE); // Progressive Items - itemTable[RG_PROGRESSIVE_HOOKSHOT] = Item(RG_PROGRESSIVE_HOOKSHOT, Text{ "Progressive Hookshot", "Grappin (prog.)", "Progressiver Fanghaken" }, ITEMTYPE_ITEM, 0x80, true, LOGIC_PROGRESSIVE_HOOKSHOT, RHT_PROGRESSIVE_HOOKSHOT, true); - itemTable[RG_PROGRESSIVE_STRENGTH] = Item(RG_PROGRESSIVE_STRENGTH, Text{ "Strength Upgrade", "AmΓ©lioration de Force (prog.)", "Progressives Kraft-Upgrade" }, ITEMTYPE_ITEM, 0x81, true, LOGIC_PROGRESSIVE_STRENGTH, RHT_PROGRESSIVE_STRENGTH, true); - itemTable[RG_PROGRESSIVE_BOMB_BAG] = Item(RG_PROGRESSIVE_BOMB_BAG, Text{ "Progressive Bomb Bag", "Sac de Bombes (prog.)", "Progressive Bombentasche" }, ITEMTYPE_ITEM, 0x82, true, LOGIC_PROGRESSIVE_BOMB_BAG, RHT_PROGRESSIVE_BOMB_BAG, true); - itemTable[RG_PROGRESSIVE_BOW] = Item(RG_PROGRESSIVE_BOW, Text{ "Progressive Bow", "Arc (prog.)", "Progressiver Bogen" }, ITEMTYPE_ITEM, 0x83, true, LOGIC_PROGRESSIVE_BOW, RHT_PROGRESSIVE_BOW, true); - itemTable[RG_PROGRESSIVE_SLINGSHOT] = Item(RG_PROGRESSIVE_SLINGSHOT, Text{ "Progressive Slingshot", "Lance-Pierre (prog.)", "Progressive Steinschleuder" }, ITEMTYPE_ITEM, 0x84, true, LOGIC_PROGRESSIVE_BULLET_BAG, RHT_PROGRESSIVE_SLINGSHOT, true); - itemTable[RG_PROGRESSIVE_WALLET] = Item(RG_PROGRESSIVE_WALLET, Text{ "Progressive Wallet", "Bourse (prog.)", "Progressive GeldbΓΆrse" }, ITEMTYPE_ITEM, 0x85, true, LOGIC_PROGRESSIVE_WALLET, RHT_PROGRESSIVE_WALLET, true); - itemTable[RG_PROGRESSIVE_SCALE] = Item(RG_PROGRESSIVE_SCALE, Text{ "Progressive Scale", "Γ‰caille (prog.)", "Progressive Schuppe" }, ITEMTYPE_ITEM, 0x86, true, LOGIC_PROGRESSIVE_SCALE, RHT_PROGRESSIVE_SCALE, true); - itemTable[RG_PROGRESSIVE_NUT_UPGRADE] = Item(RG_PROGRESSIVE_NUT_UPGRADE, Text{ "Progressive Nut Capacity", "CapacitΓ© de Noix (prog.)", "Progressive Nuß-KapazitΓ€t" }, ITEMTYPE_ITEM, 0x87, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_PROGRESSIVE_NUT_UPGRADE, true); - itemTable[RG_PROGRESSIVE_STICK_UPGRADE] = Item(RG_PROGRESSIVE_STICK_UPGRADE, Text{ "Progressive Stick Capacity", "CapacitΓ© de BΓ’tons (prog.)", "Progressive Stab-KapazitΓ€t" }, ITEMTYPE_ITEM, 0x88, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_PROGRESSIVE_STICK_UPGRADE, true); - itemTable[RG_PROGRESSIVE_BOMBCHUS] = Item(RG_PROGRESSIVE_BOMBCHUS, Text{ "Progressive Bombchu", "Missiles (prog.)", "Progressive Krabbelminen" }, ITEMTYPE_ITEM, 0x89, true, LOGIC_BOMBCHUS, RHT_PROGRESSIVE_BOMBCHUS, true); - itemTable[RG_PROGRESSIVE_MAGIC_METER] = Item(RG_PROGRESSIVE_MAGIC_METER, Text{ "Progressive Magic Meter", "Jauge de Magie (prog.)", "Progressives Magisches Maß" }, ITEMTYPE_ITEM, 0x8A, true, LOGIC_PROGRESSIVE_MAGIC, RHT_PROGRESSIVE_MAGIC_METER, true); - itemTable[RG_PROGRESSIVE_OCARINA] = Item(RG_PROGRESSIVE_OCARINA, Text{ "Progressive Ocarina", "Ocarina (prog.)", "Progressive Okarina" }, ITEMTYPE_ITEM, 0x8B, true, LOGIC_PROGRESSIVE_OCARINA, RHT_PROGRESSIVE_OCARINA, true); - itemTable[RG_PROGRESSIVE_GORONSWORD] = Item(RG_PROGRESSIVE_GORONSWORD, Text{ "Progressive Goron Sword", "Γ‰pΓ©e Goron (prog.)", "Progressives Goronen-Schwert" }, ITEMTYPE_ITEM, 0xD4, true, LOGIC_PROGRESSIVE_GIANT_KNIFE, RHT_PROGRESSIVE_GORONSWORD, true); + itemTable[RG_PROGRESSIVE_HOOKSHOT] = Item(RG_PROGRESSIVE_HOOKSHOT, Text{ "Progressive Hookshot", "Grappin (prog.)", "Fanghaken (prog.)" }, ITEMTYPE_ITEM, 0x80, true, LOGIC_PROGRESSIVE_HOOKSHOT, RHT_PROGRESSIVE_HOOKSHOT, true); + itemTable[RG_PROGRESSIVE_STRENGTH] = Item(RG_PROGRESSIVE_STRENGTH, Text{ "Strength Upgrade", "AmΓ©lioration de Force (prog.)", "StΓ€rke (prog.)" }, ITEMTYPE_ITEM, 0x81, true, LOGIC_PROGRESSIVE_STRENGTH, RHT_PROGRESSIVE_STRENGTH, true); + itemTable[RG_PROGRESSIVE_BOMB_BAG] = Item(RG_PROGRESSIVE_BOMB_BAG, Text{ "Progressive Bomb Bag", "Sac de Bombes (prog.)", "Bombentasche (prog.)" }, ITEMTYPE_ITEM, 0x82, true, LOGIC_PROGRESSIVE_BOMB_BAG, RHT_PROGRESSIVE_BOMB_BAG, true); + itemTable[RG_PROGRESSIVE_BOW] = Item(RG_PROGRESSIVE_BOW, Text{ "Progressive Bow", "Arc (prog.)", "Bogen (prog.)" }, ITEMTYPE_ITEM, 0x83, true, LOGIC_PROGRESSIVE_BOW, RHT_PROGRESSIVE_BOW, true); + itemTable[RG_PROGRESSIVE_SLINGSHOT] = Item(RG_PROGRESSIVE_SLINGSHOT, Text{ "Progressive Slingshot", "Lance-Pierre (prog.)", "Schleuder (prog.)" }, ITEMTYPE_ITEM, 0x84, true, LOGIC_PROGRESSIVE_BULLET_BAG, RHT_PROGRESSIVE_SLINGSHOT, true); + itemTable[RG_PROGRESSIVE_WALLET] = Item(RG_PROGRESSIVE_WALLET, Text{ "Progressive Wallet", "Bourse (prog.)", "GeldbΓΆrse (prog.)" }, ITEMTYPE_ITEM, 0x85, true, LOGIC_PROGRESSIVE_WALLET, RHT_PROGRESSIVE_WALLET, true); + itemTable[RG_PROGRESSIVE_SCALE] = Item(RG_PROGRESSIVE_SCALE, Text{ "Progressive Scale", "Γ‰caille (prog.)", "Zora-Schuppe (prog.)" }, ITEMTYPE_ITEM, 0x86, true, LOGIC_PROGRESSIVE_SCALE, RHT_PROGRESSIVE_SCALE, true); + itemTable[RG_PROGRESSIVE_NUT_UPGRADE] = Item(RG_PROGRESSIVE_NUT_UPGRADE, Text{ "Progressive Nut Capacity", "CapacitΓ© de Noix (prog.)", "Nuß-KapazitΓ€t (prog.)" }, ITEMTYPE_ITEM, 0x87, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_PROGRESSIVE_NUT_UPGRADE, true); + itemTable[RG_PROGRESSIVE_STICK_UPGRADE] = Item(RG_PROGRESSIVE_STICK_UPGRADE, Text{ "Progressive Stick Capacity", "CapacitΓ© de BΓ’tons (prog.)", "Stab-KapazitΓ€t (prog.)" }, ITEMTYPE_ITEM, 0x88, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_PROGRESSIVE_STICK_UPGRADE, true); + itemTable[RG_PROGRESSIVE_BOMBCHUS] = Item(RG_PROGRESSIVE_BOMBCHUS, Text{ "Progressive Bombchu", "Missiles (prog.)", "Krabbelminen (prog.)" }, ITEMTYPE_ITEM, 0x89, true, LOGIC_BOMBCHUS, RHT_PROGRESSIVE_BOMBCHUS, true); + itemTable[RG_PROGRESSIVE_MAGIC_METER] = Item(RG_PROGRESSIVE_MAGIC_METER, Text{ "Progressive Magic Meter", "Jauge de Magie (prog.)", "Magische Kraft (prog.)" }, ITEMTYPE_ITEM, 0x8A, true, LOGIC_PROGRESSIVE_MAGIC, RHT_PROGRESSIVE_MAGIC_METER, true); + itemTable[RG_PROGRESSIVE_OCARINA] = Item(RG_PROGRESSIVE_OCARINA, Text{ "Progressive Ocarina", "Ocarina (prog.)", "Okarina (prog.)" }, ITEMTYPE_ITEM, 0x8B, true, LOGIC_PROGRESSIVE_OCARINA, RHT_PROGRESSIVE_OCARINA, true); + itemTable[RG_PROGRESSIVE_GORONSWORD] = Item(RG_PROGRESSIVE_GORONSWORD, Text{ "Progressive Goron Sword", "Γ‰pΓ©e Goron (prog.)", "Goronen-Schwert (prog.)" }, ITEMTYPE_ITEM, 0xD4, true, LOGIC_PROGRESSIVE_GIANT_KNIFE, RHT_PROGRESSIVE_GORONSWORD, true); // Bottles itemTable[RG_EMPTY_BOTTLE] = Item(RG_EMPTY_BOTTLE, Text{ "Empty Bottle", "Bouteille Vide", "Leere Flasche" }, ITEMTYPE_ITEM, GI_BOTTLE, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_MILK, ITEM_BOTTLE, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x42, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_BOTTLE_WITH_MILK] = Item(RG_BOTTLE_WITH_MILK, Text{ "Bottle with Milk", "Bouteille avec du Lait", "Flasche mit Milch" }, ITEMTYPE_ITEM, GI_MILK_BOTTLE, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_MILK, ITEM_MILK_BOTTLE, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_BOTTLE_WITH_RED_POTION] = Item(RG_BOTTLE_WITH_RED_POTION, Text{ "Bottle with Red Potion", "Bouteille avec une Potion Rouge", "Flasche mit rotem Elixier" }, ITEMTYPE_ITEM, 0x8C, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_RED_POTION, RG_BOTTLE_WITH_RED_POTION, OBJECT_GI_LIQUID, GID_POTION_RED, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); - itemTable[RG_BOTTLE_WITH_GREEN_POTION] = Item(RG_BOTTLE_WITH_GREEN_POTION, Text{ "Bottle with Green Potion", "Bouteille avec une Potion Verte", "Flasche mit grΓΌnem Elixier" }, ITEMTYPE_ITEM, 0x8D, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_GREEN_POTION, RG_BOTTLE_WITH_GREEN_POTION, OBJECT_GI_LIQUID, GID_POTION_GREEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); - itemTable[RG_BOTTLE_WITH_BLUE_POTION] = Item(RG_BOTTLE_WITH_BLUE_POTION, Text{ "Bottle with Blue Potion", "Bouteille avec une Potion Bleue", "Flasche mit blauem Elixier" }, ITEMTYPE_ITEM, 0x8E, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_BLUE_POTION, RG_BOTTLE_WITH_BLUE_POTION, OBJECT_GI_LIQUID, GID_POTION_BLUE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); - itemTable[RG_BOTTLE_WITH_FAIRY] = Item(RG_BOTTLE_WITH_FAIRY, Text{ "Bottle with Fairy", "Bouteille avec une FΓ©e", "Flasche mit Fee" }, ITEMTYPE_ITEM, 0x8F, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_FAIRY, RG_BOTTLE_WITH_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); - itemTable[RG_BOTTLE_WITH_FISH] = Item(RG_BOTTLE_WITH_FISH, Text{ "Bottle with Fish", "Bouteille avec un Poisson", "Flasche mit Fisch" }, ITEMTYPE_ITEM, 0x90, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_FISH, RG_BOTTLE_WITH_FISH, OBJECT_GI_FISH, GID_FISH, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); - itemTable[RG_BOTTLE_WITH_BLUE_FIRE] = Item(RG_BOTTLE_WITH_BLUE_FIRE, Text{ "Bottle with Blue Fire", "Bouteille avec une Flamme Bleue", "Flasche mit blauem Feuer" }, ITEMTYPE_ITEM, 0x91, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_BLUE_FIRE, RG_BOTTLE_WITH_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); - itemTable[RG_BOTTLE_WITH_BUGS] = Item(RG_BOTTLE_WITH_BUGS, Text{ "Bottle with Bugs", "Bouteille avec des Insectes", "Flasche mit Wanzen" }, ITEMTYPE_ITEM, 0x92, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_BUGS, RG_BOTTLE_WITH_BUGS, OBJECT_GI_INSECT, GID_BUG, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); - itemTable[RG_BOTTLE_WITH_POE] = Item(RG_BOTTLE_WITH_POE, Text{ "Bottle with Poe", "Bouteille avec un Esprit", "Flasche mit einem Geist" }, ITEMTYPE_ITEM, 0x94, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_POE, RG_BOTTLE_WITH_POE, OBJECT_GI_GHOST, GID_POE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); - itemTable[RG_RUTOS_LETTER] = Item(RG_RUTOS_LETTER, Text{ "Bottle with Ruto's Letter", "Bouteille avec la Lettre de Ruto", "Flasche mit Rutos Brief" }, ITEMTYPE_ITEM, GI_LETTER_RUTO, true, LOGIC_RUTOS_LETTER, RHT_RUTOS_LETTER, ITEM_LETTER_RUTO, OBJECT_GI_BOTTLE_LETTER, GID_LETTER_RUTO, 0x99, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_BOTTLE_WITH_BIG_POE] = Item(RG_BOTTLE_WITH_BIG_POE, Text{ "Bottle with Big Poe", "Bouteille avec une Γ‚me", "Flasche mit Seele" }, ITEMTYPE_ITEM, 0x93, true, LOGIC_BOTTLE_WITH_BIG_POE, RHT_BOTTLE_WITH_BIG_POE, RG_BOTTLE_WITH_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BOTTLE_WITH_MILK] = Item(RG_BOTTLE_WITH_MILK, Text{ "Bottle with Milk", "Bouteille avec du Lait", "Flasche (Milch)" }, ITEMTYPE_ITEM, GI_MILK_BOTTLE, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_MILK, ITEM_MILK_BOTTLE, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_BOTTLE_WITH_RED_POTION] = Item(RG_BOTTLE_WITH_RED_POTION, Text{ "Bottle with Red Potion", "Bouteille avec une Potion Rouge", "Flasche (Rotes Elixier)" }, ITEMTYPE_ITEM, 0x8C, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_RED_POTION, RG_BOTTLE_WITH_RED_POTION, OBJECT_GI_LIQUID, GID_POTION_RED, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BOTTLE_WITH_GREEN_POTION] = Item(RG_BOTTLE_WITH_GREEN_POTION, Text{ "Bottle with Green Potion", "Bouteille avec une Potion Verte", "Flasche (GrΓΌnes Elixier)" }, ITEMTYPE_ITEM, 0x8D, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_GREEN_POTION, RG_BOTTLE_WITH_GREEN_POTION, OBJECT_GI_LIQUID, GID_POTION_GREEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BOTTLE_WITH_BLUE_POTION] = Item(RG_BOTTLE_WITH_BLUE_POTION, Text{ "Bottle with Blue Potion", "Bouteille avec une Potion Bleue", "Flasche (Blaues Elixier)" }, ITEMTYPE_ITEM, 0x8E, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_BLUE_POTION, RG_BOTTLE_WITH_BLUE_POTION, OBJECT_GI_LIQUID, GID_POTION_BLUE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BOTTLE_WITH_FAIRY] = Item(RG_BOTTLE_WITH_FAIRY, Text{ "Bottle with Fairy", "Bouteille avec une FΓ©e", "Flasche (Fee)" }, ITEMTYPE_ITEM, 0x8F, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_FAIRY, RG_BOTTLE_WITH_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BOTTLE_WITH_FISH] = Item(RG_BOTTLE_WITH_FISH, Text{ "Bottle with Fish", "Bouteille avec un Poisson", "Flasche (Fisch)" }, ITEMTYPE_ITEM, 0x90, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_FISH, RG_BOTTLE_WITH_FISH, OBJECT_GI_FISH, GID_FISH, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BOTTLE_WITH_BLUE_FIRE] = Item(RG_BOTTLE_WITH_BLUE_FIRE, Text{ "Bottle with Blue Fire", "Bouteille avec une Flamme Bleue", "Flasche (Blaues Feuer)" }, ITEMTYPE_ITEM, 0x91, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_BLUE_FIRE, RG_BOTTLE_WITH_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BOTTLE_WITH_BUGS] = Item(RG_BOTTLE_WITH_BUGS, Text{ "Bottle with Bugs", "Bouteille avec des Insectes", "Flasche (KΓ€fer)" }, ITEMTYPE_ITEM, 0x92, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_BUGS, RG_BOTTLE_WITH_BUGS, OBJECT_GI_INSECT, GID_BUG, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BOTTLE_WITH_POE] = Item(RG_BOTTLE_WITH_POE, Text{ "Bottle with Poe", "Bouteille avec un Esprit", "Flasche (Irrlicht)" }, ITEMTYPE_ITEM, 0x94, true, LOGIC_BOTTLES, RHT_BOTTLE_WITH_POE, RG_BOTTLE_WITH_POE, OBJECT_GI_GHOST, GID_POE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_RUTOS_LETTER] = Item(RG_RUTOS_LETTER, Text{ "Bottle with Ruto's Letter", "Bouteille avec la Lettre de Ruto", "Flasche (Rutos Brief)" }, ITEMTYPE_ITEM, GI_LETTER_RUTO, true, LOGIC_RUTOS_LETTER, RHT_RUTOS_LETTER, ITEM_LETTER_RUTO, OBJECT_GI_BOTTLE_LETTER, GID_LETTER_RUTO, 0x99, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_BOTTLE_WITH_BIG_POE] = Item(RG_BOTTLE_WITH_BIG_POE, Text{ "Bottle with Big Poe", "Bouteille avec une Γ‚me", "Flasche (NachtschwΓ€rmer)" }, ITEMTYPE_ITEM, 0x93, true, LOGIC_BOTTLE_WITH_BIG_POE, RHT_BOTTLE_WITH_BIG_POE, RG_BOTTLE_WITH_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); // Songs itemTable[RG_ZELDAS_LULLABY] = Item(RG_ZELDAS_LULLABY, Text{ "Zelda's Lullaby", "Berceuse de Zelda", "Zeldas Wiegenlied" }, ITEMTYPE_SONG, 0xC1, true, LOGIC_ZELDAS_LULLABY, RHT_ZELDAS_LULLABY, ITEM_SONG_LULLABY, OBJECT_GI_MELODY, GID_SONG_ZELDA, 0xD4, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_EPONAS_SONG] = Item(RG_EPONAS_SONG, Text{ "Epona's Song", "Chant d'Epona", "Eponas Lied" }, ITEMTYPE_SONG, 0xC2, true, LOGIC_EPONAS_SONG, RHT_EPONAS_SONG, ITEM_SONG_EPONA, OBJECT_GI_MELODY, GID_SONG_EPONA, 0xD2, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); @@ -99,147 +99,147 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_REQUIEM_OF_SPIRIT] = Item(RG_REQUIEM_OF_SPIRIT, Text{ "Requiem of Spirit", "Requiem des Esprits", "Requiem der Geister" }, ITEMTYPE_SONG, 0xBE, true, LOGIC_REQUIEM_OF_SPIRIT, RHT_REQUIEM_OF_SPIRIT, ITEM_SONG_REQUIEM, OBJECT_GI_MELODY, GID_SONG_REQUIEM, 0x76, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_PRELUDE_OF_LIGHT] = Item(RG_PRELUDE_OF_LIGHT, Text{ "Prelude of Light", "PrΓ©lude de la LumiΓ¨re", "Kantate des Lichts" }, ITEMTYPE_SONG, 0xC0, true, LOGIC_PRELUDE_OF_LIGHT, RHT_PRELUDE_OF_LIGHT, ITEM_SONG_PRELUDE, OBJECT_GI_MELODY, GID_SONG_PRELUDE, 0x78, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); // Maps and Compasses - itemTable[RG_DEKU_TREE_MAP] = Item(RG_DEKU_TREE_MAP, Text{ "Great Deku Tree Map", "Carte de l'Arbre Mojo", "Karte des Deku-Baums" }, ITEMTYPE_MAP, 0xA5, false, LOGIC_MAP_DEKU_TREE, RHT_DEKU_TREE_MAP, RG_DEKU_TREE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_DEKU_TREE_MAP] = Item(RG_DEKU_TREE_MAP, Text{ "Great Deku Tree Map", "Carte de l'Arbre Mojo", "Karte (Deku-Baum)" }, ITEMTYPE_MAP, 0xA5, false, LOGIC_MAP_DEKU_TREE, RHT_DEKU_TREE_MAP, RG_DEKU_TREE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_DEKU_TREE_MAP].SetCustomDrawFunc(Randomizer_DrawMap); - itemTable[RG_DODONGOS_CAVERN_MAP] = Item(RG_DODONGOS_CAVERN_MAP, Text{ "Dodongo's Cavern Map", "Carte de la Caverne Dodongo", "Karte der Dodongo-HΓΆhle" }, ITEMTYPE_MAP, 0xA6, false, LOGIC_MAP_DODONGOS_CAVERN, RHT_DODONGOS_CAVERN_MAP, RG_DODONGOS_CAVERN_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_DODONGOS_CAVERN_MAP] = Item(RG_DODONGOS_CAVERN_MAP, Text{ "Dodongo's Cavern Map", "Carte de la Caverne Dodongo", "Karte (Dodongos HΓΆhle)" }, ITEMTYPE_MAP, 0xA6, false, LOGIC_MAP_DODONGOS_CAVERN, RHT_DODONGOS_CAVERN_MAP, RG_DODONGOS_CAVERN_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_DODONGOS_CAVERN_MAP].SetCustomDrawFunc(Randomizer_DrawMap); - itemTable[RG_JABU_JABUS_BELLY_MAP] = Item(RG_JABU_JABUS_BELLY_MAP, Text{ "Jabu-Jabu's Belly Map", "Carte du Ventre de Jabu-Jabu", "Karte des Jabu-Jabu-Bauchs" }, ITEMTYPE_MAP, 0xA7, false, LOGIC_MAP_JABU_JABUS_BELLY, RHT_JABU_JABUS_BELLY_MAP, RG_JABU_JABUS_BELLY_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_JABU_JABUS_BELLY_MAP] = Item(RG_JABU_JABUS_BELLY_MAP, Text{ "Jabu-Jabu's Belly Map", "Carte du Ventre de Jabu-Jabu", "Karte (Jabu-Jabus Bauch)" }, ITEMTYPE_MAP, 0xA7, false, LOGIC_MAP_JABU_JABUS_BELLY, RHT_JABU_JABUS_BELLY_MAP, RG_JABU_JABUS_BELLY_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_JABU_JABUS_BELLY_MAP].SetCustomDrawFunc(Randomizer_DrawMap); - itemTable[RG_FOREST_TEMPLE_MAP] = Item(RG_FOREST_TEMPLE_MAP, Text{ "Forest Temple Map", "Carte du Temple de la ForΓͺt", "Karte des Waldtempels" }, ITEMTYPE_MAP, 0xA8, false, LOGIC_MAP_FOREST_TEMPLE, RHT_FOREST_TEMPLE_MAP, RG_FOREST_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_FOREST_TEMPLE_MAP] = Item(RG_FOREST_TEMPLE_MAP, Text{ "Forest Temple Map", "Carte du Temple de la ForΓͺt", "Karte (Waldtempel)" }, ITEMTYPE_MAP, 0xA8, false, LOGIC_MAP_FOREST_TEMPLE, RHT_FOREST_TEMPLE_MAP, RG_FOREST_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_FOREST_TEMPLE_MAP].SetCustomDrawFunc(Randomizer_DrawMap); - itemTable[RG_FIRE_TEMPLE_MAP] = Item(RG_FIRE_TEMPLE_MAP, Text{ "Fire Temple Map", "Carte due Temple de Feu", "Karte des Feuertempels" }, ITEMTYPE_MAP, 0xA9, false, LOGIC_MAP_FIRE_TEMPLE, RHT_FIRE_TEMPLE_MAP, RG_FIRE_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_FIRE_TEMPLE_MAP] = Item(RG_FIRE_TEMPLE_MAP, Text{ "Fire Temple Map", "Carte due Temple de Feu", "Karte (Feuertempel)" }, ITEMTYPE_MAP, 0xA9, false, LOGIC_MAP_FIRE_TEMPLE, RHT_FIRE_TEMPLE_MAP, RG_FIRE_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_FIRE_TEMPLE_MAP].SetCustomDrawFunc(Randomizer_DrawMap); - itemTable[RG_WATER_TEMPLE_MAP] = Item(RG_WATER_TEMPLE_MAP, Text{ "Water Temple Map", "Carte du Temple de l'Eau", "Karte des Wassertempels" }, ITEMTYPE_MAP, 0xAA, false, LOGIC_MAP_WATER_TEMPLE, RHT_WATER_TEMPLE_MAP, RG_WATER_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_WATER_TEMPLE_MAP] = Item(RG_WATER_TEMPLE_MAP, Text{ "Water Temple Map", "Carte du Temple de l'Eau", "Karte (Wassertempel)" }, ITEMTYPE_MAP, 0xAA, false, LOGIC_MAP_WATER_TEMPLE, RHT_WATER_TEMPLE_MAP, RG_WATER_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_WATER_TEMPLE_MAP].SetCustomDrawFunc(Randomizer_DrawMap); - itemTable[RG_SPIRIT_TEMPLE_MAP] = Item(RG_SPIRIT_TEMPLE_MAP, Text{ "Spirit Temple Map", "Carte due Temple de l'Esprit", "Karte des Geistertempels" }, ITEMTYPE_MAP, 0xAB, false, LOGIC_MAP_SPIRIT_TEMPLE, RHT_SPIRIT_TEMPLE_MAP, RG_SPIRIT_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_SPIRIT_TEMPLE_MAP] = Item(RG_SPIRIT_TEMPLE_MAP, Text{ "Spirit Temple Map", "Carte due Temple de l'Esprit", "Karte (Geistertempel)" }, ITEMTYPE_MAP, 0xAB, false, LOGIC_MAP_SPIRIT_TEMPLE, RHT_SPIRIT_TEMPLE_MAP, RG_SPIRIT_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_SPIRIT_TEMPLE_MAP].SetCustomDrawFunc(Randomizer_DrawMap); - itemTable[RG_SHADOW_TEMPLE_MAP] = Item(RG_SHADOW_TEMPLE_MAP, Text{ "Shadow Temple Map", "Carte du Temple de l'Ombre", "Karte des Schattentempels" }, ITEMTYPE_MAP, 0xAC, false, LOGIC_MAP_SHADOW_TEMPLE, RHT_SHADOW_TEMPLE_MAP, RG_SHADOW_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_SHADOW_TEMPLE_MAP] = Item(RG_SHADOW_TEMPLE_MAP, Text{ "Shadow Temple Map", "Carte du Temple de l'Ombre", "Karte (Schattentempel)" }, ITEMTYPE_MAP, 0xAC, false, LOGIC_MAP_SHADOW_TEMPLE, RHT_SHADOW_TEMPLE_MAP, RG_SHADOW_TEMPLE_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_SHADOW_TEMPLE_MAP].SetCustomDrawFunc(Randomizer_DrawMap); - itemTable[RG_BOTTOM_OF_THE_WELL_MAP] = Item(RG_BOTTOM_OF_THE_WELL_MAP, Text{ "Bottom of the Well Map", "Carte du Puits", "Karte des Grund des Brunnens" }, ITEMTYPE_MAP, 0xAD, false, LOGIC_MAP_BOTTOM_OF_THE_WELL, RHT_BOTTOM_OF_THE_WELL_MAP, RG_BOTTOM_OF_THE_WELL_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_BOTTOM_OF_THE_WELL_MAP] = Item(RG_BOTTOM_OF_THE_WELL_MAP, Text{ "Bottom of the Well Map", "Carte du Puits", "Karte (Grund des Brunnens)" }, ITEMTYPE_MAP, 0xAD, false, LOGIC_MAP_BOTTOM_OF_THE_WELL, RHT_BOTTOM_OF_THE_WELL_MAP, RG_BOTTOM_OF_THE_WELL_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_BOTTOM_OF_THE_WELL_MAP].SetCustomDrawFunc(Randomizer_DrawMap); - itemTable[RG_ICE_CAVERN_MAP] = Item(RG_ICE_CAVERN_MAP, Text{ "Ice Cavern Map", "Carte de la Caverne Polaire", "Karte der EishΓΆhle" }, ITEMTYPE_MAP, 0xAE, false, LOGIC_MAP_ICE_CAVERN, RHT_ICE_CAVERN_MAP, RG_ICE_CAVERN_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_ICE_CAVERN_MAP] = Item(RG_ICE_CAVERN_MAP, Text{ "Ice Cavern Map", "Carte de la Caverne Polaire", "Karte (EishΓΆhle)" }, ITEMTYPE_MAP, 0xAE, false, LOGIC_MAP_ICE_CAVERN, RHT_ICE_CAVERN_MAP, RG_ICE_CAVERN_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_ICE_CAVERN_MAP].SetCustomDrawFunc(Randomizer_DrawMap); - itemTable[RG_DEKU_TREE_COMPASS] = Item(RG_DEKU_TREE_COMPASS, Text{ "Great Deku Tree Compass", "Boussole de l'Arbre Mojo", "Kompaß des Deku-Baums" }, ITEMTYPE_COMPASS, 0x9B, false, LOGIC_COMPASS_DEKU_TREE, RHT_DEKU_TREE_COMPASS, RG_DEKU_TREE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_DEKU_TREE_COMPASS] = Item(RG_DEKU_TREE_COMPASS, Text{ "Great Deku Tree Compass", "Boussole de l'Arbre Mojo", "Kompaß (Deku-Baum)" }, ITEMTYPE_COMPASS, 0x9B, false, LOGIC_COMPASS_DEKU_TREE, RHT_DEKU_TREE_COMPASS, RG_DEKU_TREE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_DUNGEON_MAP, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_DEKU_TREE_COMPASS].SetCustomDrawFunc(Randomizer_DrawCompass); - itemTable[RG_DODONGOS_CAVERN_COMPASS] = Item(RG_DODONGOS_CAVERN_COMPASS, Text{ "Dodongo's Cavern Compass", "Boussole de la Caverne Dodongo", "Kompaß der Dodongo-HΓΆhle" }, ITEMTYPE_COMPASS, 0x9C, false, LOGIC_COMPASS_DODONGOS_CAVERN, RHT_DODONGOS_CAVERN_COMPASS, RG_DODONGOS_CAVERN_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_DODONGOS_CAVERN_COMPASS] = Item(RG_DODONGOS_CAVERN_COMPASS, Text{ "Dodongo's Cavern Compass", "Boussole de la Caverne Dodongo", "Kompaß (Dodongos HΓΆhle)" }, ITEMTYPE_COMPASS, 0x9C, false, LOGIC_COMPASS_DODONGOS_CAVERN, RHT_DODONGOS_CAVERN_COMPASS, RG_DODONGOS_CAVERN_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_DODONGOS_CAVERN_COMPASS].SetCustomDrawFunc(Randomizer_DrawCompass); - itemTable[RG_JABU_JABUS_BELLY_COMPASS] = Item(RG_JABU_JABUS_BELLY_COMPASS, Text{ "Jabu-Jabu's Belly Compass", "Boussole du Ventre de Jabu-Jabu", "Kompaß des Jabu-Jabu-Bauchs" }, ITEMTYPE_COMPASS, 0x9D, false, LOGIC_COMPASS_JABU_JABUS_BELLY, RHT_JABU_JABUS_BELLY_COMPASS, RG_JABU_JABUS_BELLY_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_JABU_JABUS_BELLY_COMPASS] = Item(RG_JABU_JABUS_BELLY_COMPASS, Text{ "Jabu-Jabu's Belly Compass", "Boussole du Ventre de Jabu-Jabu", "Kompaß (Jabu-Jabus Bauch)" }, ITEMTYPE_COMPASS, 0x9D, false, LOGIC_COMPASS_JABU_JABUS_BELLY, RHT_JABU_JABUS_BELLY_COMPASS, RG_JABU_JABUS_BELLY_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_JABU_JABUS_BELLY_COMPASS].SetCustomDrawFunc(Randomizer_DrawCompass); - itemTable[RG_FOREST_TEMPLE_COMPASS] = Item(RG_FOREST_TEMPLE_COMPASS, Text{ "Forest Temple Compass", "Boussole du Temple de la ForΓͺt", "Kompaß des Waldtempels" }, ITEMTYPE_COMPASS, 0x9E, false, LOGIC_COMPASS_FOREST_TEMPLE, RHT_FOREST_TEMPLE_COMPASS, RG_FOREST_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_FOREST_TEMPLE_COMPASS] = Item(RG_FOREST_TEMPLE_COMPASS, Text{ "Forest Temple Compass", "Boussole du Temple de la ForΓͺt", "Kompaß (Waldtempel)" }, ITEMTYPE_COMPASS, 0x9E, false, LOGIC_COMPASS_FOREST_TEMPLE, RHT_FOREST_TEMPLE_COMPASS, RG_FOREST_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_FOREST_TEMPLE_COMPASS].SetCustomDrawFunc(Randomizer_DrawCompass); - itemTable[RG_FIRE_TEMPLE_COMPASS] = Item(RG_FIRE_TEMPLE_COMPASS, Text{ "Fire Temple Compass", "Boussole du Temple du Feu", "Kompaß des Feuertempels" }, ITEMTYPE_COMPASS, 0x9F, false, LOGIC_COMPASS_FIRE_TEMPLE, RHT_FIRE_TEMPLE_COMPASS, RG_FIRE_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_FIRE_TEMPLE_COMPASS] = Item(RG_FIRE_TEMPLE_COMPASS, Text{ "Fire Temple Compass", "Boussole du Temple du Feu", "Kompaß (Feuertempel)" }, ITEMTYPE_COMPASS, 0x9F, false, LOGIC_COMPASS_FIRE_TEMPLE, RHT_FIRE_TEMPLE_COMPASS, RG_FIRE_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_FIRE_TEMPLE_COMPASS].SetCustomDrawFunc(Randomizer_DrawCompass); - itemTable[RG_WATER_TEMPLE_COMPASS] = Item(RG_WATER_TEMPLE_COMPASS, Text{ "Water Temple Compass", "Boussole du Temple de l'Eau", "Kompaß des Wassertempels" }, ITEMTYPE_COMPASS, 0xA0, false, LOGIC_COMPASS_WATER_TEMPLE, RHT_WATER_TEMPLE_COMPASS, RG_WATER_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_WATER_TEMPLE_COMPASS] = Item(RG_WATER_TEMPLE_COMPASS, Text{ "Water Temple Compass", "Boussole du Temple de l'Eau", "Kompaß (Wassertempel)" }, ITEMTYPE_COMPASS, 0xA0, false, LOGIC_COMPASS_WATER_TEMPLE, RHT_WATER_TEMPLE_COMPASS, RG_WATER_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_WATER_TEMPLE_COMPASS].SetCustomDrawFunc(Randomizer_DrawCompass); - itemTable[RG_SPIRIT_TEMPLE_COMPASS] = Item(RG_SPIRIT_TEMPLE_COMPASS, Text{ "Spirit Temple Compass", "Boussole due Temple de l'Esprit", "Kompaß des Geistertempels" }, ITEMTYPE_COMPASS, 0xA1, false, LOGIC_COMPASS_SPIRIT_TEMPLE, RHT_SPIRIT_TEMPLE_COMPASS, RG_SPIRIT_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_SPIRIT_TEMPLE_COMPASS] = Item(RG_SPIRIT_TEMPLE_COMPASS, Text{ "Spirit Temple Compass", "Boussole due Temple de l'Esprit", "Kompaß (Geistertempel)" }, ITEMTYPE_COMPASS, 0xA1, false, LOGIC_COMPASS_SPIRIT_TEMPLE, RHT_SPIRIT_TEMPLE_COMPASS, RG_SPIRIT_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_SPIRIT_TEMPLE_COMPASS].SetCustomDrawFunc(Randomizer_DrawCompass); - itemTable[RG_SHADOW_TEMPLE_COMPASS] = Item(RG_SHADOW_TEMPLE_COMPASS, Text{ "Shadow Temple Compass", "Boussole du Temple de l'Ombre", "Kompaß des Schattentempels" }, ITEMTYPE_COMPASS, 0xA2, false, LOGIC_COMPASS_SHADOW_TEMPLE, RHT_SHADOW_TEMPLE_COMPASS, RG_SHADOW_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_SHADOW_TEMPLE_COMPASS] = Item(RG_SHADOW_TEMPLE_COMPASS, Text{ "Shadow Temple Compass", "Boussole du Temple de l'Ombre", "Kompaß (Schattentempel)" }, ITEMTYPE_COMPASS, 0xA2, false, LOGIC_COMPASS_SHADOW_TEMPLE, RHT_SHADOW_TEMPLE_COMPASS, RG_SHADOW_TEMPLE_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_SHADOW_TEMPLE_COMPASS].SetCustomDrawFunc(Randomizer_DrawCompass); - itemTable[RG_BOTTOM_OF_THE_WELL_COMPASS] = Item(RG_BOTTOM_OF_THE_WELL_COMPASS, Text{ "Bottom of the Well Compass", "Boussole du Puits", "Kompaß des Grund des Brunnens" }, ITEMTYPE_COMPASS, 0xA3, false, LOGIC_COMPASS_BOTTOM_OF_THE_WELL, RHT_BOTTOM_OF_THE_WELL_COMPASS, RG_BOTTOM_OF_THE_WELL_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_BOTTOM_OF_THE_WELL_COMPASS] = Item(RG_BOTTOM_OF_THE_WELL_COMPASS, Text{ "Bottom of the Well Compass", "Boussole du Puits", "Kompaß (Grund des Brunnens)" }, ITEMTYPE_COMPASS, 0xA3, false, LOGIC_COMPASS_BOTTOM_OF_THE_WELL, RHT_BOTTOM_OF_THE_WELL_COMPASS, RG_BOTTOM_OF_THE_WELL_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_BOTTOM_OF_THE_WELL_COMPASS].SetCustomDrawFunc(Randomizer_DrawCompass); - itemTable[RG_ICE_CAVERN_COMPASS] = Item(RG_ICE_CAVERN_COMPASS, Text{ "Ice Cavern Compass", "Boussole de la Caverne Polaire", "Kompaß der EishΓΆhle" }, ITEMTYPE_COMPASS, 0xA4, false, LOGIC_COMPASS_ICE_CAVERN, RHT_ICE_CAVERN_COMPASS, RG_ICE_CAVERN_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_ICE_CAVERN_COMPASS] = Item(RG_ICE_CAVERN_COMPASS, Text{ "Ice Cavern Compass", "Boussole de la Caverne Polaire", "Kompaß (EishΓΆhle)" }, ITEMTYPE_COMPASS, 0xA4, false, LOGIC_COMPASS_ICE_CAVERN, RHT_ICE_CAVERN_COMPASS, RG_ICE_CAVERN_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, TEXT_ITEM_COMPASS, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_ICE_CAVERN_COMPASS].SetCustomDrawFunc(Randomizer_DrawCompass); // Boss Keys - itemTable[RG_FOREST_TEMPLE_BOSS_KEY] = Item(RG_FOREST_TEMPLE_BOSS_KEY, Text{ "Forest Temple Boss Key", "ClΓ© d'Or du Temple de la ForΓͺt", "Master-SchlΓΌssel des Waldtempels" }, ITEMTYPE_BOSSKEY, 0x95, true, LOGIC_BOSS_KEY_FOREST_TEMPLE, RHT_FOREST_TEMPLE_BOSS_KEY, RG_FOREST_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); + itemTable[RG_FOREST_TEMPLE_BOSS_KEY] = Item(RG_FOREST_TEMPLE_BOSS_KEY, Text{ "Forest Temple Boss Key", "ClΓ© d'Or du Temple de la ForΓͺt", "Master-SchlΓΌssel (Waldtempel)" }, ITEMTYPE_BOSSKEY, 0x95, true, LOGIC_BOSS_KEY_FOREST_TEMPLE, RHT_FOREST_TEMPLE_BOSS_KEY, RG_FOREST_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); itemTable[RG_FOREST_TEMPLE_BOSS_KEY].SetCustomDrawFunc(Randomizer_DrawBossKey); - itemTable[RG_FIRE_TEMPLE_BOSS_KEY] = Item(RG_FIRE_TEMPLE_BOSS_KEY, Text{ "Fire Temple Boss Key", "ClΓ© d'Or du Temple du Feu", "Master-SchlΓΌssel des Feuertempels" }, ITEMTYPE_BOSSKEY, 0x96, true, LOGIC_BOSS_KEY_FIRE_TEMPLE, RHT_FIRE_TEMPLE_BOSS_KEY, RG_FIRE_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); + itemTable[RG_FIRE_TEMPLE_BOSS_KEY] = Item(RG_FIRE_TEMPLE_BOSS_KEY, Text{ "Fire Temple Boss Key", "ClΓ© d'Or du Temple du Feu", "Master-SchlΓΌssel (Feuertempel)" }, ITEMTYPE_BOSSKEY, 0x96, true, LOGIC_BOSS_KEY_FIRE_TEMPLE, RHT_FIRE_TEMPLE_BOSS_KEY, RG_FIRE_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); itemTable[RG_FIRE_TEMPLE_BOSS_KEY].SetCustomDrawFunc(Randomizer_DrawBossKey); - itemTable[RG_WATER_TEMPLE_BOSS_KEY] = Item(RG_WATER_TEMPLE_BOSS_KEY, Text{ "Water Temple Boss Key", "ClΓ© d'Or du Temple de l'Eau", "Master-SchlΓΌssel des Wassertempels" }, ITEMTYPE_BOSSKEY, 0x97, true, LOGIC_BOSS_KEY_WATER_TEMPLE, RHT_WATER_TEMPLE_BOSS_KEY, RG_WATER_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); + itemTable[RG_WATER_TEMPLE_BOSS_KEY] = Item(RG_WATER_TEMPLE_BOSS_KEY, Text{ "Water Temple Boss Key", "ClΓ© d'Or du Temple de l'Eau", "Master-SchlΓΌssel (Wassertempel)" }, ITEMTYPE_BOSSKEY, 0x97, true, LOGIC_BOSS_KEY_WATER_TEMPLE, RHT_WATER_TEMPLE_BOSS_KEY, RG_WATER_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); itemTable[RG_WATER_TEMPLE_BOSS_KEY].SetCustomDrawFunc(Randomizer_DrawBossKey); - itemTable[RG_SPIRIT_TEMPLE_BOSS_KEY] = Item(RG_SPIRIT_TEMPLE_BOSS_KEY, Text{ "Spirit Temple Boss Key", "ClΓ© d'Or du Temple de l'Esprit", "Master-SchlΓΌssel des Geistertempels" }, ITEMTYPE_BOSSKEY, 0x98, true, LOGIC_BOSS_KEY_SPIRIT_TEMPLE, RHT_SPIRIT_TEMPLE_BOSS_KEY, RG_SPIRIT_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); + itemTable[RG_SPIRIT_TEMPLE_BOSS_KEY] = Item(RG_SPIRIT_TEMPLE_BOSS_KEY, Text{ "Spirit Temple Boss Key", "ClΓ© d'Or du Temple de l'Esprit", "Master-SchlΓΌssel (Geistertempel)" }, ITEMTYPE_BOSSKEY, 0x98, true, LOGIC_BOSS_KEY_SPIRIT_TEMPLE, RHT_SPIRIT_TEMPLE_BOSS_KEY, RG_SPIRIT_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); itemTable[RG_SPIRIT_TEMPLE_BOSS_KEY].SetCustomDrawFunc(Randomizer_DrawBossKey); - itemTable[RG_SHADOW_TEMPLE_BOSS_KEY] = Item( RG_SHADOW_TEMPLE_BOSS_KEY, Text{ "Shadow Temple Boss Key", "ClΓ© d'Or du Temple de l'Ombre", "Master-SchlΓΌssel des Schattentempels" }, ITEMTYPE_BOSSKEY, 0x99, true, LOGIC_BOSS_KEY_SHADOW_TEMPLE, RHT_SHADOW_TEMPLE_BOSS_KEY, RG_SHADOW_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); + itemTable[RG_SHADOW_TEMPLE_BOSS_KEY] = Item( RG_SHADOW_TEMPLE_BOSS_KEY, Text{ "Shadow Temple Boss Key", "ClΓ© d'Or du Temple de l'Ombre", "Master-SchlΓΌssel (Schattentempel)" }, ITEMTYPE_BOSSKEY, 0x99, true, LOGIC_BOSS_KEY_SHADOW_TEMPLE, RHT_SHADOW_TEMPLE_BOSS_KEY, RG_SHADOW_TEMPLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); itemTable[RG_SHADOW_TEMPLE_BOSS_KEY].SetCustomDrawFunc(Randomizer_DrawBossKey); - itemTable[RG_GANONS_CASTLE_BOSS_KEY] = Item(RG_GANONS_CASTLE_BOSS_KEY, Text{ "Ganon's Castle Boss Key", "ClΓ© d'Or du ChΓ’teau de Ganon", "Master-SchlΓΌssel von Ganons Schloß" }, ITEMTYPE_BOSSKEY, 0x9A, true, LOGIC_BOSS_KEY_GANONS_CASTLE, RHT_GANONS_CASTLE_BOSS_KEY, RG_GANONS_CASTLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); + itemTable[RG_GANONS_CASTLE_BOSS_KEY] = Item(RG_GANONS_CASTLE_BOSS_KEY, Text{ "Ganon's Castle Boss Key", "ClΓ© d'Or du ChΓ’teau de Ganon", "Master-SchlΓΌssel (Ganons Schloß)" }, ITEMTYPE_BOSSKEY, 0x9A, true, LOGIC_BOSS_KEY_GANONS_CASTLE, RHT_GANONS_CASTLE_BOSS_KEY, RG_GANONS_CASTLE_BOSS_KEY, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_BOSS_KEY,MOD_RANDOMIZER); itemTable[RG_GANONS_CASTLE_BOSS_KEY].SetCustomDrawFunc(Randomizer_DrawBossKey); - itemTable[RG_FOREST_TEMPLE_SMALL_KEY] = Item(RG_FOREST_TEMPLE_SMALL_KEY, Text{ "Forest Temple Small Key", "Petite ClΓ© du Temple de la ForΓͺt", "Kleiner SchlΓΌssel fΓΌr den Waldtempel" }, ITEMTYPE_SMALLKEY, 0xAF, true, LOGIC_FOREST_TEMPLE_KEYS, RHT_FOREST_TEMPLE_SMALL_KEY, RG_FOREST_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_FOREST_TEMPLE_SMALL_KEY] = Item(RG_FOREST_TEMPLE_SMALL_KEY, Text{ "Forest Temple Small Key", "Petite ClΓ© du Temple de la ForΓͺt", "Kleiner SchlΓΌssel (Waldtempel)" }, ITEMTYPE_SMALLKEY, 0xAF, true, LOGIC_FOREST_TEMPLE_KEYS, RHT_FOREST_TEMPLE_SMALL_KEY, RG_FOREST_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_FOREST_TEMPLE_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); - itemTable[RG_FIRE_TEMPLE_SMALL_KEY] = Item(RG_FIRE_TEMPLE_SMALL_KEY, Text{ "Fire Temple Small Key", "Petite ClΓ© du Temple du Feu", "Kleiner SchlΓΌssel fΓΌr den Feuertempel" }, ITEMTYPE_SMALLKEY, 0xB0, true, LOGIC_FIRE_TEMPLE_KEYS, RHT_FIRE_TEMPLE_SMALL_KEY, RG_FIRE_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_FIRE_TEMPLE_SMALL_KEY] = Item(RG_FIRE_TEMPLE_SMALL_KEY, Text{ "Fire Temple Small Key", "Petite ClΓ© du Temple du Feu", "Kleiner SchlΓΌssel (Feuertempel)" }, ITEMTYPE_SMALLKEY, 0xB0, true, LOGIC_FIRE_TEMPLE_KEYS, RHT_FIRE_TEMPLE_SMALL_KEY, RG_FIRE_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_FIRE_TEMPLE_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); - itemTable[RG_WATER_TEMPLE_SMALL_KEY] = Item(RG_WATER_TEMPLE_SMALL_KEY, Text{ "Water Temple Small Key", "Petite ClΓ© du Temple de l'Eau", "Kleiner SchlΓΌssel fΓΌr den Wassertempel" }, ITEMTYPE_SMALLKEY, 0xB1, true, LOGIC_WATER_TEMPLE_KEYS, RHT_WATER_TEMPLE_SMALL_KEY, RG_WATER_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_WATER_TEMPLE_SMALL_KEY] = Item(RG_WATER_TEMPLE_SMALL_KEY, Text{ "Water Temple Small Key", "Petite ClΓ© du Temple de l'Eau", "Kleiner SchlΓΌssel (Wassertempel)" }, ITEMTYPE_SMALLKEY, 0xB1, true, LOGIC_WATER_TEMPLE_KEYS, RHT_WATER_TEMPLE_SMALL_KEY, RG_WATER_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_WATER_TEMPLE_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); - itemTable[RG_SPIRIT_TEMPLE_SMALL_KEY] = Item(RG_SPIRIT_TEMPLE_SMALL_KEY, Text{ "Spirit Temple Small Key", "Petite ClΓ© du Temple de l'Esprit", "Kleiner SchlΓΌssel fΓΌr den Geistertempel" }, ITEMTYPE_SMALLKEY, 0xB2, true, LOGIC_SPIRIT_TEMPLE_KEYS, RHT_SPIRIT_TEMPLE_SMALL_KEY, RG_SPIRIT_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SPIRIT_TEMPLE_SMALL_KEY] = Item(RG_SPIRIT_TEMPLE_SMALL_KEY, Text{ "Spirit Temple Small Key", "Petite ClΓ© du Temple de l'Esprit", "Kleiner SchlΓΌssel (Geistertempel)" }, ITEMTYPE_SMALLKEY, 0xB2, true, LOGIC_SPIRIT_TEMPLE_KEYS, RHT_SPIRIT_TEMPLE_SMALL_KEY, RG_SPIRIT_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_SPIRIT_TEMPLE_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); - itemTable[RG_SHADOW_TEMPLE_SMALL_KEY] = Item(RG_SHADOW_TEMPLE_SMALL_KEY, Text{ "Shadow Temple Small Key", "Petite ClΓ© du Temple de l'Ombre", "Kleiner SchlΓΌssel fΓΌr den Schattentempel" }, ITEMTYPE_SMALLKEY, 0xB3, true, LOGIC_SHADOW_TEMPLE_KEYS, RHT_SHADOW_TEMPLE_SMALL_KEY, RG_SHADOW_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SHADOW_TEMPLE_SMALL_KEY] = Item(RG_SHADOW_TEMPLE_SMALL_KEY, Text{ "Shadow Temple Small Key", "Petite ClΓ© du Temple de l'Ombre", "Kleiner SchlΓΌssel (Schattentempel)" }, ITEMTYPE_SMALLKEY, 0xB3, true, LOGIC_SHADOW_TEMPLE_KEYS, RHT_SHADOW_TEMPLE_SMALL_KEY, RG_SHADOW_TEMPLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_SHADOW_TEMPLE_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); - itemTable[RG_BOTTOM_OF_THE_WELL_SMALL_KEY] = Item(RG_BOTTOM_OF_THE_WELL_SMALL_KEY, Text{ "Bottom of the Well Small Key", "Petite ClΓ© du Puits", "Kleiner SchlΓΌssel fΓΌr den Grund des Brunnens" }, ITEMTYPE_SMALLKEY, 0xB4, true, LOGIC_BOTTOM_OF_THE_WELL_KEYS, RHT_BOTTOM_OF_THE_WELL_SMALL_KEY, RG_BOTTOM_OF_THE_WELL_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_BOTTOM_OF_THE_WELL_SMALL_KEY] = Item(RG_BOTTOM_OF_THE_WELL_SMALL_KEY, Text{ "Bottom of the Well Small Key", "Petite ClΓ© du Puits", "Kleiner SchlΓΌssel (Grund des Brunnens)" }, ITEMTYPE_SMALLKEY, 0xB4, true, LOGIC_BOTTOM_OF_THE_WELL_KEYS, RHT_BOTTOM_OF_THE_WELL_SMALL_KEY, RG_BOTTOM_OF_THE_WELL_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_BOTTOM_OF_THE_WELL_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); - itemTable[RG_GERUDO_TRAINING_GROUND_SMALL_KEY] = Item(RG_GERUDO_TRAINING_GROUND_SMALL_KEY, Text{ "Training Ground Small Key", "Petite ClΓ© du Gymnase Gerudo", "Kleiner SchlΓΌssel fΓΌr das Gerudo-TrainingsgelΓ€nde" }, ITEMTYPE_SMALLKEY, 0xB5, true, LOGIC_GERUDO_TRAINING_GROUND_KEYS, RHT_GERUDO_TRAINING_GROUND_SMALL_KEY, RG_GERUDO_TRAINING_GROUND_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GERUDO_TRAINING_GROUND_SMALL_KEY] = Item(RG_GERUDO_TRAINING_GROUND_SMALL_KEY, Text{ "Training Ground Small Key", "Petite ClΓ© du Gymnase Gerudo", "Kleiner SchlΓΌssel (Gerudo-Trainingsarena)" }, ITEMTYPE_SMALLKEY, 0xB5, true, LOGIC_GERUDO_TRAINING_GROUND_KEYS, RHT_GERUDO_TRAINING_GROUND_SMALL_KEY, RG_GERUDO_TRAINING_GROUND_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GERUDO_TRAINING_GROUND_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); - itemTable[RG_GERUDO_FORTRESS_SMALL_KEY] = Item(RG_GERUDO_FORTRESS_SMALL_KEY, Text{ "Gerudo Fortress Small Key", "Petite ClΓ© du Repaire des Voleurs", "Kleiner SchlΓΌssel fΓΌr die Gerudo-Festung" }, ITEMTYPE_FORTRESS_SMALLKEY, 0xB6, true, LOGIC_GERUDO_FORTRESS_KEYS, RHT_GERUDO_FORTRESS_SMALL_KEY, RG_GERUDO_FORTRESS_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GERUDO_FORTRESS_SMALL_KEY] = Item(RG_GERUDO_FORTRESS_SMALL_KEY, Text{ "Gerudo Fortress Small Key", "Petite ClΓ© du Repaire des Voleurs", "Kleiner SchlΓΌssel (Diebesversteck)" }, ITEMTYPE_FORTRESS_SMALLKEY, 0xB6, true, LOGIC_GERUDO_FORTRESS_KEYS, RHT_GERUDO_FORTRESS_SMALL_KEY, RG_GERUDO_FORTRESS_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GERUDO_FORTRESS_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); - itemTable[RG_GANONS_CASTLE_SMALL_KEY] = Item(RG_GANONS_CASTLE_SMALL_KEY, Text{ "Ganon's Castle Small Key", "Petite ClΓ© du ChΓ’teau de Ganon", "Kleiner SchlΓΌssel fΓΌr Ganons Schloß" }, ITEMTYPE_SMALLKEY, 0xB7, true, LOGIC_GANONS_CASTLE_KEYS, RHT_GANONS_CASTLE_SMALL_KEY, RG_GANONS_CASTLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GANONS_CASTLE_SMALL_KEY] = Item(RG_GANONS_CASTLE_SMALL_KEY, Text{ "Ganon's Castle Small Key", "Petite ClΓ© du ChΓ’teau de Ganon", "Kleiner SchlΓΌssel (Ganons Schloß)" }, ITEMTYPE_SMALLKEY, 0xB7, true, LOGIC_GANONS_CASTLE_KEYS, RHT_GANONS_CASTLE_SMALL_KEY, RG_GANONS_CASTLE_SMALL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GANONS_CASTLE_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); - itemTable[RG_TREASURE_GAME_SMALL_KEY] = Item(RG_TREASURE_GAME_SMALL_KEY, Text{ "Chest Game Small Key", "Petite ClΓ© du jeu la Chasse-aux-TrΓ©sors", "Kleiner SchlΓΌssel fΓΌr das Truhenspiel" }, ITEMTYPE_SMALLKEY, GI_DOOR_KEY, true, LOGIC_TREASURE_GAME_KEYS, RHT_TREASURE_GAME_SMALL_KEY, ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0xF3, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_NONE); + itemTable[RG_TREASURE_GAME_SMALL_KEY] = Item(RG_TREASURE_GAME_SMALL_KEY, Text{ "Chest Game Small Key", "Petite ClΓ© du jeu la Chasse-aux-TrΓ©sors", "Kleiner SchlΓΌssel (Truhenlotterie)" }, ITEMTYPE_SMALLKEY, GI_DOOR_KEY, true, LOGIC_TREASURE_GAME_KEYS, RHT_TREASURE_GAME_SMALL_KEY, ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0xF3, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_NONE); itemTable[RG_TREASURE_GAME_SMALL_KEY].SetCustomDrawFunc(Randomizer_DrawSmallKey); - itemTable[RG_GUARD_HOUSE_KEY] = Item(RG_GUARD_HOUSE_KEY, Text{ "Guard House Key", "ClΓ© de la Maison des Gardes", "SchlΓΌssel fΓΌr das Haus der Wachen" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_GUARD_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_GUARD_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GUARD_HOUSE_KEY] = Item(RG_GUARD_HOUSE_KEY, Text{ "Guard House Key", "ClΓ© de la Maison des Gardes", "SchlΓΌssel (Wachhaus)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_GUARD_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_GUARD_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GUARD_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_MARKET_BAZAAR_KEY] = Item(RG_MARKET_BAZAAR_KEY, Text{ "Market Bazaar Key", "ClΓ© du Bazar de la Place du MarchΓ©", "SchlΓΌssel fΓΌr den Basar des Marktes" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MARKET_BAZAAR_KEY, RHT_OVERWORLD_KEY, RG_MARKET_BAZAAR_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_MARKET_BAZAAR_KEY] = Item(RG_MARKET_BAZAAR_KEY, Text{ "Market Bazaar Key", "ClΓ© du Bazar de la Place du MarchΓ©", "SchlΓΌssel (Basar des Marktes)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MARKET_BAZAAR_KEY, RHT_OVERWORLD_KEY, RG_MARKET_BAZAAR_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_MARKET_BAZAAR_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_MARKET_POTION_SHOP_KEY] = Item(RG_MARKET_POTION_SHOP_KEY, Text{ "Market Potion Shop Key", "ClΓ© du Magasin de Potions de la Place du MarchΓ©", "SchlΓΌssel fΓΌr den Magie-Laden des Marktes" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MARKET_POTION_SHOP_KEY, RHT_OVERWORLD_KEY, RG_MARKET_POTION_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_MARKET_POTION_SHOP_KEY] = Item(RG_MARKET_POTION_SHOP_KEY, Text{ "Market Potion Shop Key", "ClΓ© du Magasin de Potions de la Place du MarchΓ©", "SchlΓΌssel (Magie-Laden des Marktes)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MARKET_POTION_SHOP_KEY, RHT_OVERWORLD_KEY, RG_MARKET_POTION_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_MARKET_POTION_SHOP_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_MASK_SHOP_KEY] = Item(RG_MASK_SHOP_KEY, Text{ "Mask Shop Key", "ClΓ© de la Foire aux Masques", "SchlΓΌssel fΓΌr den Maskenladen" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MASK_SHOP_KEY, RHT_OVERWORLD_KEY, RG_MASK_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_MASK_SHOP_KEY] = Item(RG_MASK_SHOP_KEY, Text{ "Mask Shop Key", "ClΓ© de la Foire aux Masques", "SchlΓΌssel (Maskenladen)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MASK_SHOP_KEY, RHT_OVERWORLD_KEY, RG_MASK_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_MASK_SHOP_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_MARKET_SHOOTING_GALLERY_KEY] = Item(RG_MARKET_SHOOTING_GALLERY_KEY, Text{ "Market Shooting Gallery Key", "ClΓ© du Stand de Tir de la Place du MarchΓ©", "SchlΓΌssel fΓΌr die Schießbude des Marktes" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MARKET_SHOOTING_GALLERY_KEY, RHT_OVERWORLD_KEY, RG_MARKET_SHOOTING_GALLERY_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_MARKET_SHOOTING_GALLERY_KEY] = Item(RG_MARKET_SHOOTING_GALLERY_KEY, Text{ "Market Shooting Gallery Key", "ClΓ© du Stand de Tir de la Place du MarchΓ©", "SchlΓΌssel (Schießbude des Marktes)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_MARKET_SHOOTING_GALLERY_KEY, RHT_OVERWORLD_KEY, RG_MARKET_SHOOTING_GALLERY_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_MARKET_SHOOTING_GALLERY_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_BOMBCHU_BOWLING_KEY] = Item(RG_BOMBCHU_BOWLING_KEY, Text{ "Bombchu Bowling Alley Key", "ClΓ© du Bowling Teigneux", "SchlΓΌssel fΓΌr die Minenbowlingbahn" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BOMBCHU_BOWLING_KEY, RHT_OVERWORLD_KEY, RG_BOMBCHU_BOWLING_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_BOMBCHU_BOWLING_KEY] = Item(RG_BOMBCHU_BOWLING_KEY, Text{ "Bombchu Bowling Alley Key", "ClΓ© du Bowling Teigneux", "SchlΓΌssel (Minenbowlingbahn)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BOMBCHU_BOWLING_KEY, RHT_OVERWORLD_KEY, RG_BOMBCHU_BOWLING_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_BOMBCHU_BOWLING_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_TREASURE_CHEST_GAME_BUILDING_KEY] = Item(RG_TREASURE_CHEST_GAME_BUILDING_KEY, Text{ "Treasure Chest Game Building Key", "ClΓ© de la Chasse au TrΓ©sor", "SchlΓΌssel fΓΌr das Haus des Schatzkisten-Pokers" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_TREASURE_CHEST_GAME_BUILDING_KEY,RHT_OVERWORLD_KEY, RG_TREASURE_CHEST_GAME_BUILDING_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_TREASURE_CHEST_GAME_BUILDING_KEY] = Item(RG_TREASURE_CHEST_GAME_BUILDING_KEY, Text{ "Treasure Chest Game Building Key", "ClΓ© de la Chasse au TrΓ©sor", "SchlΓΌssel (Haus der Truhenlotterie)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_TREASURE_CHEST_GAME_BUILDING_KEY,RHT_OVERWORLD_KEY, RG_TREASURE_CHEST_GAME_BUILDING_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_TREASURE_CHEST_GAME_BUILDING_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_BOMBCHU_SHOP_KEY] = Item(RG_BOMBCHU_SHOP_KEY, Text{ "Bombchu Shop Key", "ClΓ© du Magasin de Missiles", "SchlΓΌssel fΓΌr den Krabbelminenladen" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BOMBCHU_SHOP_KEY, RHT_OVERWORLD_KEY, RG_BOMBCHU_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_BOMBCHU_SHOP_KEY] = Item(RG_BOMBCHU_SHOP_KEY, Text{ "Bombchu Shop Key", "ClΓ© du Magasin de Missiles", "SchlΓΌssel (Krabbelminenladen)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BOMBCHU_SHOP_KEY, RHT_OVERWORLD_KEY, RG_BOMBCHU_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_BOMBCHU_SHOP_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_RICHARDS_HOUSE_KEY] = Item(RG_RICHARDS_HOUSE_KEY, Text{ "Richard's House Key", "ClΓ© de la Maison de Kiki", "SchlΓΌssel fΓΌr das Haus von Richard" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_RICHARDS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_RICHARDS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_RICHARDS_HOUSE_KEY] = Item(RG_RICHARDS_HOUSE_KEY, Text{ "Richard's House Key", "ClΓ© de la Maison de Kiki", "SchlΓΌssel (Richards Haus)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_RICHARDS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_RICHARDS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_RICHARDS_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_ALLEY_HOUSE_KEY] = Item(RG_ALLEY_HOUSE_KEY, Text{ "Alley House Key", "ClΓ© de la Maison de la Ruelle", "SchlΓΌssel fΓΌr das Gassenhaus" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_ALLEY_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_ALLEY_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_ALLEY_HOUSE_KEY] = Item(RG_ALLEY_HOUSE_KEY, Text{ "Alley House Key", "ClΓ© de la Maison de la Ruelle", "SchlΓΌssel (Haus in der Gasse)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_ALLEY_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_ALLEY_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_ALLEY_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_KAK_BAZAAR_KEY] = Item(RG_KAK_BAZAAR_KEY, Text{ "Kakariko Bazaar Key", "ClΓ© du Bazar de Cocorico", "SchlΓΌssel fΓΌr den Basar von Kakariko" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_KAK_BAZAAR_KEY, RHT_OVERWORLD_KEY, RG_KAK_BAZAAR_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_KAK_BAZAAR_KEY] = Item(RG_KAK_BAZAAR_KEY, Text{ "Kakariko Bazaar Key", "ClΓ© du Bazar de Cocorico", "SchlΓΌssel (Basar von Kakariko)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_KAK_BAZAAR_KEY, RHT_OVERWORLD_KEY, RG_KAK_BAZAAR_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_KAK_BAZAAR_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_KAK_POTION_SHOP_KEY] = Item(RG_KAK_POTION_SHOP_KEY, Text{ "Kakariko Potion Shop Key", "ClΓ© du Magasin de Potions de Cocorico", "SchlΓΌssel fΓΌr den Magie-Laden von Kakariko" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_KAK_POTION_SHOP_KEY, RHT_OVERWORLD_KEY, RG_KAK_POTION_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_KAK_POTION_SHOP_KEY] = Item(RG_KAK_POTION_SHOP_KEY, Text{ "Kakariko Potion Shop Key", "ClΓ© du Magasin de Potions de Cocorico", "SchlΓΌssel (Magie-Laden von Kakariko)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_KAK_POTION_SHOP_KEY, RHT_OVERWORLD_KEY, RG_KAK_POTION_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_KAK_POTION_SHOP_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_BOSS_HOUSE_KEY] = Item(RG_BOSS_HOUSE_KEY, Text{ "Boss's House Key", "ClΓ© de la Maison du Chef des Ouvriers", "SchlΓΌssel fΓΌr das Haus des Chefs" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BOSS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_BOSS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_BOSS_HOUSE_KEY] = Item(RG_BOSS_HOUSE_KEY, Text{ "Boss's House Key", "ClΓ© de la Maison du Chef des Ouvriers", "SchlΓΌssel (Haus des Chefs)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BOSS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_BOSS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_BOSS_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_GRANNYS_POTION_SHOP_KEY] = Item(RG_GRANNYS_POTION_SHOP_KEY, Text{ "Granny's Potion Shop Key", "ClΓ© de l'Apothicaire", "SchlΓΌssel fΓΌr Asas Hexenladen" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_GRANNYS_POTION_SHOP_KEY, RHT_OVERWORLD_KEY, RG_GRANNYS_POTION_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GRANNYS_POTION_SHOP_KEY] = Item(RG_GRANNYS_POTION_SHOP_KEY, Text{ "Granny's Potion Shop Key", "ClΓ© de l'Apothicaire", "SchlΓΌssel (Asas Hexenladen)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_GRANNYS_POTION_SHOP_KEY, RHT_OVERWORLD_KEY, RG_GRANNYS_POTION_SHOP_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GRANNYS_POTION_SHOP_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_SKULLTULA_HOUSE_KEY] = Item(RG_SKULLTULA_HOUSE_KEY, Text{ "Skulltula House Key", "ClΓ© de la Maison des AraignΓ©es", "SchlΓΌssel fΓΌr das Skulltula-Haus" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_SKULLTULA_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_SKULLTULA_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SKULLTULA_HOUSE_KEY] = Item(RG_SKULLTULA_HOUSE_KEY, Text{ "Skulltula House Key", "ClΓ© de la Maison des AraignΓ©es", "SchlΓΌssel (Skulltula-Haus)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_SKULLTULA_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_SKULLTULA_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_SKULLTULA_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_IMPAS_HOUSE_KEY] = Item(RG_IMPAS_HOUSE_KEY, Text{ "Impa's House Key", "ClΓ© de la Maison d'Impa", "SchlΓΌssel fΓΌr das Haus von Impa" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_IMPAS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_IMPAS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_IMPAS_HOUSE_KEY] = Item(RG_IMPAS_HOUSE_KEY, Text{ "Impa's House Key", "ClΓ© de la Maison d'Impa", "SchlΓΌssel (Impas Haus)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_IMPAS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_IMPAS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_IMPAS_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_WINDMILL_KEY] = Item(RG_WINDMILL_KEY, Text{ "Windmill Key", "ClΓ© du Moulin", "SchlΓΌssel fΓΌr die WindmΓΌhle" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_WINDMILL_KEY, RHT_OVERWORLD_KEY, RG_WINDMILL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_WINDMILL_KEY] = Item(RG_WINDMILL_KEY, Text{ "Windmill Key", "ClΓ© du Moulin", "SchlΓΌssel (WindmΓΌhle)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_WINDMILL_KEY, RHT_OVERWORLD_KEY, RG_WINDMILL_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_WINDMILL_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_KAK_SHOOTING_GALLERY_KEY] = Item(RG_KAK_SHOOTING_GALLERY_KEY, Text{ "Kakariko Shooting Gallery Key", "ClΓ© du Stand de Tir de Cocorico", "SchlΓΌssel fΓΌr die Schießbude von Kakariko" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_KAK_SHOOTING_GALLERY_KEY, RHT_OVERWORLD_KEY, RG_KAK_SHOOTING_GALLERY_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_KAK_SHOOTING_GALLERY_KEY] = Item(RG_KAK_SHOOTING_GALLERY_KEY, Text{ "Kakariko Shooting Gallery Key", "ClΓ© du Stand de Tir de Cocorico", "SchlΓΌssel (Schießbude von Kakariko)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_KAK_SHOOTING_GALLERY_KEY, RHT_OVERWORLD_KEY, RG_KAK_SHOOTING_GALLERY_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_KAK_SHOOTING_GALLERY_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_DAMPES_HUT_KEY] = Item(RG_DAMPES_HUT_KEY, Text{ "Dampe's Hut Key", "ClΓ© de la Cabane d'Igor", "SchlΓΌssel fΓΌr die HΓΌtte von Boris" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_DAMPES_HUT_KEY, RHT_OVERWORLD_KEY, RG_DAMPES_HUT_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_DAMPES_HUT_KEY] = Item(RG_DAMPES_HUT_KEY, Text{ "Dampe's Hut Key", "ClΓ© de la Cabane d'Igor", "SchlΓΌssel (HΓΌtte des TotengrΓ€bers)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_DAMPES_HUT_KEY, RHT_OVERWORLD_KEY, RG_DAMPES_HUT_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_DAMPES_HUT_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_TALONS_HOUSE_KEY] = Item(RG_TALONS_HOUSE_KEY, Text{ "Talon's House Key", "ClΓ© de la Maison de Talon", "SchlΓΌssel fΓΌr das Haus von Talon" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_TALONS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_TALONS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_TALONS_HOUSE_KEY] = Item(RG_TALONS_HOUSE_KEY, Text{ "Talon's House Key", "ClΓ© de la Maison de Talon", "SchlΓΌssel (Talons Haus)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_TALONS_HOUSE_KEY, RHT_OVERWORLD_KEY, RG_TALONS_HOUSE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_TALONS_HOUSE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_STABLES_KEY] = Item(RG_STABLES_KEY, Text{ "Stables Key", "ClΓ© des Γ‰curies", "SchlΓΌssel fΓΌr die StΓ€lle" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_STABLES_KEY, RHT_OVERWORLD_KEY, RG_STABLES_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_STABLES_KEY] = Item(RG_STABLES_KEY, Text{ "Stables Key", "ClΓ© des Γ‰curies", "SchlΓΌssel (StΓ€lle)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_STABLES_KEY, RHT_OVERWORLD_KEY, RG_STABLES_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_STABLES_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_BACK_TOWER_KEY] = Item(RG_BACK_TOWER_KEY, Text{ "Back Tower Key", "ClΓ© du Silo", "SchlΓΌssel fΓΌr den hinteren Turm" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BACK_TOWER_KEY, RHT_OVERWORLD_KEY, RG_BACK_TOWER_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_BACK_TOWER_KEY] = Item(RG_BACK_TOWER_KEY, Text{ "Back Tower Key", "ClΓ© du Silo", "SchlΓΌssel (Lon Lon-Turm)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_BACK_TOWER_KEY, RHT_OVERWORLD_KEY, RG_BACK_TOWER_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_BACK_TOWER_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_HYLIA_LAB_KEY] = Item(RG_HYLIA_LAB_KEY, Text{ "Hylia Laboratory Key", "ClΓ© du Laboratoire du Lac Hylia", "SchlΓΌssel fΓΌr das Hylia-Labor" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_HYLIA_LAB_KEY, RHT_OVERWORLD_KEY, RG_HYLIA_LAB_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_HYLIA_LAB_KEY] = Item(RG_HYLIA_LAB_KEY, Text{ "Hylia Laboratory Key", "ClΓ© du Laboratoire du Lac Hylia", "SchlΓΌssel (Hylia-Labor)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_HYLIA_LAB_KEY, RHT_OVERWORLD_KEY, RG_HYLIA_LAB_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_HYLIA_LAB_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); - itemTable[RG_FISHING_HOLE_KEY] = Item(RG_FISHING_HOLE_KEY, Text{ "Fishing Hole Key", "ClΓ© de l'Γ‰tang", "SchlΓΌssel fΓΌr den Fischweiher" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_FISHING_HOLE_KEY, RHT_OVERWORLD_KEY, RG_FISHING_HOLE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_FISHING_HOLE_KEY] = Item(RG_FISHING_HOLE_KEY, Text{ "Fishing Hole Key", "ClΓ© de l'Γ‰tang", "SchlΓΌssel (Fischweiher)" }, ITEMTYPE_ITEM, GI_DOOR_KEY, true, LOGIC_FISHING_HOLE_KEY, RHT_OVERWORLD_KEY, RG_FISHING_HOLE_KEY, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_FISHING_HOLE_KEY].SetCustomDrawFunc(Randomizer_DrawOverworldKey); // Key Rings - itemTable[RG_FOREST_TEMPLE_KEY_RING] = Item(RG_FOREST_TEMPLE_KEY_RING, Text{ "Forest Temple Key Ring", "Trousseau du Temple de la ForΓͺt", "SchlΓΌsselbund fΓΌr den Waldtempel" }, ITEMTYPE_SMALLKEY, 0xD5, true, LOGIC_FOREST_TEMPLE_KEYS, RHT_FOREST_TEMPLE_KEY_RING, RG_FOREST_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_FOREST_TEMPLE_KEY_RING] = Item(RG_FOREST_TEMPLE_KEY_RING, Text{ "Forest Temple Key Ring", "Trousseau du Temple de la ForΓͺt", "SchlΓΌsselbund (Waldtempel)" }, ITEMTYPE_SMALLKEY, 0xD5, true, LOGIC_FOREST_TEMPLE_KEYS, RHT_FOREST_TEMPLE_KEY_RING, RG_FOREST_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_FOREST_TEMPLE_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); - itemTable[RG_FIRE_TEMPLE_KEY_RING] = Item(RG_FIRE_TEMPLE_KEY_RING, Text{ "Fire Temple Key Ring", "Trousseau du Temple du Feu", "SchlΓΌsselbund fΓΌr den Feuertempel" }, ITEMTYPE_SMALLKEY, 0xD6, true, LOGIC_FIRE_TEMPLE_KEYS, RHT_FIRE_TEMPLE_KEY_RING, RG_FIRE_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_FIRE_TEMPLE_KEY_RING] = Item(RG_FIRE_TEMPLE_KEY_RING, Text{ "Fire Temple Key Ring", "Trousseau du Temple du Feu", "SchlΓΌsselbund (Feuertempel)" }, ITEMTYPE_SMALLKEY, 0xD6, true, LOGIC_FIRE_TEMPLE_KEYS, RHT_FIRE_TEMPLE_KEY_RING, RG_FIRE_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_FIRE_TEMPLE_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); - itemTable[RG_WATER_TEMPLE_KEY_RING] = Item(RG_WATER_TEMPLE_KEY_RING, Text{ "Water Temple Key Ring", "Trousseau du Temple de l'Eau", "SchlΓΌsselbund fΓΌr den Wassertempel" }, ITEMTYPE_SMALLKEY, 0xD7, true, LOGIC_WATER_TEMPLE_KEYS, RHT_WATER_TEMPLE_KEY_RING, RG_WATER_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_WATER_TEMPLE_KEY_RING] = Item(RG_WATER_TEMPLE_KEY_RING, Text{ "Water Temple Key Ring", "Trousseau du Temple de l'Eau", "SchlΓΌsselbund (Wassertempel)" }, ITEMTYPE_SMALLKEY, 0xD7, true, LOGIC_WATER_TEMPLE_KEYS, RHT_WATER_TEMPLE_KEY_RING, RG_WATER_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_WATER_TEMPLE_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); - itemTable[RG_SPIRIT_TEMPLE_KEY_RING] = Item(RG_SPIRIT_TEMPLE_KEY_RING, Text{ "Spirit Temple Key Ring", "Trousseau du Temple de l'Esprit", "SchlΓΌsselbund fΓΌr den Geistertempel" }, ITEMTYPE_SMALLKEY, 0xD8, true, LOGIC_SPIRIT_TEMPLE_KEYS, RHT_SPIRIT_TEMPLE_KEY_RING, RG_SPIRIT_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SPIRIT_TEMPLE_KEY_RING] = Item(RG_SPIRIT_TEMPLE_KEY_RING, Text{ "Spirit Temple Key Ring", "Trousseau du Temple de l'Esprit", "SchlΓΌsselbund (Geistertempel)" }, ITEMTYPE_SMALLKEY, 0xD8, true, LOGIC_SPIRIT_TEMPLE_KEYS, RHT_SPIRIT_TEMPLE_KEY_RING, RG_SPIRIT_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_SPIRIT_TEMPLE_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); - itemTable[RG_SHADOW_TEMPLE_KEY_RING] = Item(RG_SHADOW_TEMPLE_KEY_RING, Text{ "Shadow Temple Key Ring", "Trousseau du Temple de l'Ombre", "SchlΓΌsselbund fΓΌr den Schattentempel" }, ITEMTYPE_SMALLKEY, 0xD9, true, LOGIC_SHADOW_TEMPLE_KEYS, RHT_SHADOW_TEMPLE_KEY_RING, RG_SHADOW_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SHADOW_TEMPLE_KEY_RING] = Item(RG_SHADOW_TEMPLE_KEY_RING, Text{ "Shadow Temple Key Ring", "Trousseau du Temple de l'Ombre", "SchlΓΌsselbund (Schattentempel)" }, ITEMTYPE_SMALLKEY, 0xD9, true, LOGIC_SHADOW_TEMPLE_KEYS, RHT_SHADOW_TEMPLE_KEY_RING, RG_SHADOW_TEMPLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_SHADOW_TEMPLE_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); - itemTable[RG_BOTTOM_OF_THE_WELL_KEY_RING] = Item(RG_BOTTOM_OF_THE_WELL_KEY_RING, Text{ "Bottom of the Well Key Ring", "Trousseau du Puits", "SchlΓΌsselbund fΓΌr den Grund des Brunnens" }, ITEMTYPE_SMALLKEY, 0xDA, true, LOGIC_BOTTOM_OF_THE_WELL_KEYS, RHT_BOTTOM_OF_THE_WELL_KEY_RING, RG_BOTTOM_OF_THE_WELL_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_BOTTOM_OF_THE_WELL_KEY_RING] = Item(RG_BOTTOM_OF_THE_WELL_KEY_RING, Text{ "Bottom of the Well Key Ring", "Trousseau du Puits", "SchlΓΌsselbund (Grund des Brunnens)" }, ITEMTYPE_SMALLKEY, 0xDA, true, LOGIC_BOTTOM_OF_THE_WELL_KEYS, RHT_BOTTOM_OF_THE_WELL_KEY_RING, RG_BOTTOM_OF_THE_WELL_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_BOTTOM_OF_THE_WELL_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); - itemTable[RG_GERUDO_TRAINING_GROUND_KEY_RING] = Item(RG_GERUDO_TRAINING_GROUND_KEY_RING, Text{ "Training Ground Key Ring", "Trousseau du Gymnase Gerudo", "SchlΓΌsselbund fΓΌr das Gerudo-TrainingsgelΓ€nde" }, ITEMTYPE_SMALLKEY, 0xDB, true, LOGIC_GERUDO_TRAINING_GROUND_KEYS, RHT_GERUDO_TRAINING_GROUND_KEY_RING, RG_GERUDO_TRAINING_GROUND_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GERUDO_TRAINING_GROUND_KEY_RING] = Item(RG_GERUDO_TRAINING_GROUND_KEY_RING, Text{ "Training Ground Key Ring", "Trousseau du Gymnase Gerudo", "SchlΓΌsselbund (Gerudo-Trainingsarena)" }, ITEMTYPE_SMALLKEY, 0xDB, true, LOGIC_GERUDO_TRAINING_GROUND_KEYS, RHT_GERUDO_TRAINING_GROUND_KEY_RING, RG_GERUDO_TRAINING_GROUND_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GERUDO_TRAINING_GROUND_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); - itemTable[RG_GERUDO_FORTRESS_KEY_RING] = Item(RG_GERUDO_FORTRESS_KEY_RING, Text{ "Gerudo Fortress Key Ring", "Trousseau du Repaire des Voleurs", "SchlΓΌsselbund fΓΌr die Gerudo-Festung" }, ITEMTYPE_FORTRESS_SMALLKEY, 0xDC, true, LOGIC_GERUDO_FORTRESS_KEYS, RHT_GERUDO_FORTRESS_KEY_RING, RG_GERUDO_FORTRESS_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GERUDO_FORTRESS_KEY_RING] = Item(RG_GERUDO_FORTRESS_KEY_RING, Text{ "Gerudo Fortress Key Ring", "Trousseau du Repaire des Voleurs", "SchlΓΌsselbund (Diebesversteck)" }, ITEMTYPE_FORTRESS_SMALLKEY, 0xDC, true, LOGIC_GERUDO_FORTRESS_KEYS, RHT_GERUDO_FORTRESS_KEY_RING, RG_GERUDO_FORTRESS_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GERUDO_FORTRESS_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); - itemTable[RG_GANONS_CASTLE_KEY_RING] = Item(RG_GANONS_CASTLE_KEY_RING, Text{ "Ganon's Castle Key Ring", "Trousseau du ChΓ’teau de Ganon", "SchlΓΌsselbund fΓΌr Ganons Schloß" }, ITEMTYPE_SMALLKEY, 0xDD, true, LOGIC_GANONS_CASTLE_KEYS, RHT_GANONS_CASTLE_KEY_RING, RG_GANONS_CASTLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GANONS_CASTLE_KEY_RING] = Item(RG_GANONS_CASTLE_KEY_RING, Text{ "Ganon's Castle Key Ring", "Trousseau du ChΓ’teau de Ganon", "SchlΓΌsselbund (Ganons Schloß)" }, ITEMTYPE_SMALLKEY, 0xDD, true, LOGIC_GANONS_CASTLE_KEYS, RHT_GANONS_CASTLE_KEY_RING, RG_GANONS_CASTLE_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GANONS_CASTLE_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); - itemTable[RG_TREASURE_GAME_KEY_RING] = Item(RG_TREASURE_GAME_KEY_RING, Text{ "Chest Game Key Ring", "Trousseau du jeu la Chasse-aux-TrΓ©sors", "SchlΓΌsselbund fΓΌr das Truhenspiel" }, ITEMTYPE_SMALLKEY, 0xDE, true, LOGIC_TREASURE_GAME_KEYS, RHT_TREASURE_GAME_KEY_RING, RG_TREASURE_GAME_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_TREASURE_GAME_KEY_RING] = Item(RG_TREASURE_GAME_KEY_RING, Text{ "Chest Game Key Ring", "Trousseau du jeu la Chasse-aux-TrΓ©sors", "SchlΓΌsselbund (Truhenlotterie)" }, ITEMTYPE_SMALLKEY, 0xDE, true, LOGIC_TREASURE_GAME_KEYS, RHT_TREASURE_GAME_KEY_RING, RG_TREASURE_GAME_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_TREASURE_GAME_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); // Dungeon Rewards itemTable[RG_KOKIRI_EMERALD] = Item(RG_KOKIRI_EMERALD, Text{ "Kokiri's Emerald", "Γ‰meraude Kokiri", "Kokiri-Smaragd" }, ITEMTYPE_DUNGEONREWARD, 0xCB, true, LOGIC_KOKIRI_EMERALD, RHT_KOKIRI_EMERALD, ITEM_KOKIRI_EMERALD, OBJECT_GI_JEWEL, GID_KOKIRI_EMERALD, 0x80, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); @@ -254,15 +254,15 @@ void Rando::StaticData::InitItemTable() { // Generic Items itemTable[RG_RECOVERY_HEART] = Item(RG_RECOVERY_HEART, Text{ "Recovery Heart", "Coeur de Vie", "Herz" }, ITEMTYPE_ITEM, GI_HEART, false, LOGIC_NONE, RHT_RECOVERY_HEART, ITEM_HEART, OBJECT_GI_HEART, GID_HEART, 0x55, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); itemTable[RG_GREEN_RUPEE] = Item(RG_GREEN_RUPEE, Text{ "Green Rupee", "Rubis Vert", "GrΓΌner Rubin" }, ITEMTYPE_ITEM, GI_RUPEE_GREEN, false, LOGIC_NONE, RHT_GREEN_RUPEE, ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0x6F, 0x00, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); - itemTable[RG_GREG_RUPEE] = Item(RG_GREG_RUPEE, Text{ "Greg the Green Rupee", "Rubis Greg", "Greg Rubin" }, ITEMTYPE_ITEM, GI_RUPEE_GREEN, true, LOGIC_GREG, RHT_GREG_RUPEE, RG_GREG_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GREEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_GREG_RUPEE] = Item(RG_GREG_RUPEE, Text{ "Greg the Green Rupee", "Rubis Greg", "Greg der grΓΌne Rubin" }, ITEMTYPE_ITEM, GI_RUPEE_GREEN, true, LOGIC_GREG, RHT_GREG_RUPEE, RG_GREG_RUPEE, OBJECT_GI_RUPY, GID_RUPEE_GREEN, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_BLUE_RUPEE] = Item(RG_BLUE_RUPEE, Text{ "Blue Rupee", "Rubis Bleu", "Blauer Rubin" }, ITEMTYPE_ITEM, GI_RUPEE_BLUE, false, LOGIC_NONE, RHT_BLUE_RUPEE, ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xCC, 0x01, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); itemTable[RG_RED_RUPEE] = Item(RG_RED_RUPEE, Text{ "Red Rupee", "Rubis Rouge", "Roter Rubin" }, ITEMTYPE_ITEM, GI_RUPEE_RED, false, LOGIC_NONE, RHT_RED_RUPEE, ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF0, 0x02, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); itemTable[RG_PURPLE_RUPEE] = Item(RG_PURPLE_RUPEE, Text{ "Purple Rupee", "Rubis Pourpre", "Violetter Rubin" }, ITEMTYPE_ITEM, GI_RUPEE_PURPLE, false, LOGIC_NONE, RHT_PURPLE_RUPEE, ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF1, 0x14, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); - itemTable[RG_HUGE_RUPEE] = Item(RG_HUGE_RUPEE, Text{ "Huge Rupee", "Γ‰norme Rubis", "Riesiger Rubin" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, false, LOGIC_NONE, RHT_HUGE_RUPEE, ITEM_RUPEE_GOLD, OBJECT_GI_RUPY, GID_RUPEE_GOLD, 0xF2, 0x13, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); - itemTable[RG_PIECE_OF_HEART] = Item(RG_PIECE_OF_HEART, Text{ "Piece of Heart", "Quart de Coeur", "HerzstΓΌck" }, ITEMTYPE_ITEM, GI_HEART_PIECE, true, LOGIC_PIECE_OF_HEART, RHT_PIECE_OF_HEART, ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xC2, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_HUGE_RUPEE] = Item(RG_HUGE_RUPEE, Text{ "Huge Rupee", "Γ‰norme Rubis", "Goldener Rubin" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, false, LOGIC_NONE, RHT_HUGE_RUPEE, ITEM_RUPEE_GOLD, OBJECT_GI_RUPY, GID_RUPEE_GOLD, 0xF2, 0x13, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_PIECE_OF_HEART] = Item(RG_PIECE_OF_HEART, Text{ "Piece of Heart", "Quart de Coeur", "Herzteil" }, ITEMTYPE_ITEM, GI_HEART_PIECE, true, LOGIC_PIECE_OF_HEART, RHT_PIECE_OF_HEART, ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xC2, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_HEART_CONTAINER] = Item(RG_HEART_CONTAINER, Text{ "Heart Container", "RΓ©ceptacle de Coeur", "Herzcontainer" }, ITEMTYPE_ITEM, GI_HEART_CONTAINER_2, true, LOGIC_HEART_CONTAINER, RHT_HEART_CONTAINER, ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_ICE_TRAP] = Item(RG_ICE_TRAP, Text{ "Ice Trap", "PiΓ¨ge de Glace", "Eisfalle" }, ITEMTYPE_ITEM, RG_ICE_TRAP, false, LOGIC_NONE, RHT_ICE_TRAP, RG_ICE_TRAP, OBJECT_GI_RUPY, GID_RUPEE_GOLD, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); - itemTable[RG_MILK] = Item(RG_MILK, Text{ "Milk", "Lait", "Milch" }, ITEMTYPE_ITEM, GI_MILK, false, LOGIC_NONE, RHT_NONE, ITEM_MILK, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_MILK] = Item(RG_MILK, Text{ "Milk", "Lait", "Lon Lon-Milch" }, ITEMTYPE_ITEM, GI_MILK, false, LOGIC_NONE, RHT_NONE, ITEM_MILK, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); itemTable[RG_FISH] = Item(RG_FISH, Text{ "Fish", "Poisson", "Fisch" }, ITEMTYPE_ITEM, GI_FISH, false, LOGIC_NONE, RHT_NONE, ITEM_FISH, OBJECT_GI_FISH, GID_FISH, 0x47, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); // Refills itemTable[RG_BOMBS_5] = Item(RG_BOMBS_5, Text{ "Bombs (5)", "Bombes (5)", "Bomben (5)" }, ITEMTYPE_REFILL, GI_BOMBS_5, false, LOGIC_NONE, RHT_BOMBS_5, ITEM_BOMBS_5, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); @@ -277,21 +277,21 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_ARROWS_30] = Item(RG_ARROWS_30, Text{ "Arrows (30)", "FlΓ¨ches (30)", "Pfeile (30)" }, ITEMTYPE_REFILL, GI_ARROWS_LARGE, false, LOGIC_NONE, RHT_ARROWS_30, ITEM_ARROWS_LARGE, OBJECT_GI_ARROW, GID_ARROWS_LARGE, 0xE6, 0x4A, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); itemTable[RG_DEKU_NUTS_5] = Item(RG_DEKU_NUTS_5, Text{ "Deku Nuts (5)", "Noix Mojo (5)", "Deku-NΓΌsse (5)" }, ITEMTYPE_REFILL, GI_NUTS_5, false, LOGIC_NONE, RHT_DEKU_NUTS_5, ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); itemTable[RG_DEKU_NUTS_10] = Item(RG_DEKU_NUTS_10, Text{ "Deku Nuts (10)", "Noix Mojo (10)", "Deku-NΓΌsse (10)" }, ITEMTYPE_REFILL, GI_NUTS_10, false, LOGIC_NONE, RHT_DEKU_NUTS_10, ITEM_NUTS_10, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); - itemTable[RG_DEKU_SEEDS_30] = Item(RG_DEKU_SEEDS_30, Text{ "Deku Seeds (30)", "Graines Mojo (30)", "Deku-Samen (30)" }, ITEMTYPE_REFILL, GI_SEEDS_30, false, LOGIC_NONE, RHT_DEKU_SEEDS_30, ITEM_SEEDS_30, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_DEKU_SEEDS_30] = Item(RG_DEKU_SEEDS_30, Text{ "Deku Seeds (30)", "Graines Mojo (30)", "Deku-Kerne (30)" }, ITEMTYPE_REFILL, GI_SEEDS_30, false, LOGIC_NONE, RHT_DEKU_SEEDS_30, ITEM_SEEDS_30, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); itemTable[RG_DEKU_STICK_1] = Item(RG_DEKU_STICK_1, Text{ "Deku Stick (1)", "BΓ’ton Mojo (1)", "Deku-Stab (1)" }, ITEMTYPE_REFILL, GI_STICKS_1, false, LOGIC_NONE, RHT_DEKU_STICK_1, ITEM_STICK, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE); - itemTable[RG_RED_POTION_REFILL] = Item(RG_RED_POTION_REFILL, Text{ "Red Potion Refill", "Recharge de Potion Rouge", "NachfΓΌllpackung des roten Elixiers" }, ITEMTYPE_REFILL, GI_POTION_RED, false, LOGIC_NONE, RHT_NONE, ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); - itemTable[RG_GREEN_POTION_REFILL] = Item(RG_GREEN_POTION_REFILL, Text{ "Green Potion Refill", "Recharge de Potion Verte", "NachfΓΌllpackung des grΓΌnen Elixiers" }, ITEMTYPE_REFILL, GI_POTION_GREEN, false, LOGIC_NONE, RHT_NONE, ITEM_POTION_GREEN, OBJECT_GI_LIQUID, GID_POTION_GREEN, 0x44, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); - itemTable[RG_BLUE_POTION_REFILL] = Item(RG_BLUE_POTION_REFILL, Text{ "Blue Potion Refill", "Recharge de Potion Bleue", "NachfΓΌllpackung des blauen Elixiers" }, ITEMTYPE_REFILL, GI_POTION_BLUE, false, LOGIC_NONE, RHT_NONE, ITEM_POTION_BLUE, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x45, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_RED_POTION_REFILL] = Item(RG_RED_POTION_REFILL, Text{ "Red Potion Refill", "Recharge de Potion Rouge", "Rotes Elixier" }, ITEMTYPE_REFILL, GI_POTION_RED, false, LOGIC_NONE, RHT_NONE, ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_GREEN_POTION_REFILL] = Item(RG_GREEN_POTION_REFILL, Text{ "Green Potion Refill", "Recharge de Potion Verte", "GrΓΌnes Elixier" }, ITEMTYPE_REFILL, GI_POTION_GREEN, false, LOGIC_NONE, RHT_NONE, ITEM_POTION_GREEN, OBJECT_GI_LIQUID, GID_POTION_GREEN, 0x44, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); + itemTable[RG_BLUE_POTION_REFILL] = Item(RG_BLUE_POTION_REFILL, Text{ "Blue Potion Refill", "Recharge de Potion Bleue", "Blaues Elixier" }, ITEMTYPE_REFILL, GI_POTION_BLUE, false, LOGIC_NONE, RHT_NONE, ITEM_POTION_BLUE, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x45, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE); // Treasure Game - itemTable[RG_TREASURE_GAME_HEART] = Item(RG_TREASURE_GAME_HEART, Text{ "Piece of Heart (WINNER)", "Quart de Coeur (Chasse-aux-TrΓ©sors)", "HerzstΓΌck (Schatztruhenminispiel)" }, ITEMTYPE_ITEM, GI_HEART_PIECE_WIN, true, LOGIC_PIECE_OF_HEART, RHT_TREASURE_GAME_HEART, ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xFA, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); - itemTable[RG_TREASURE_GAME_GREEN_RUPEE] = Item(RG_TREASURE_GAME_GREEN_RUPEE, Text{ "Green Rupee (LOSER)", "Rubis Vert (Chasse-aux-TrΓ©sors)", "GrΓΌner Rubin (Schatztruhenminispiel)" }, ITEMTYPE_ITEM, GI_RUPEE_GREEN_LOSE, false, LOGIC_NONE, RHT_TREASURE_GAME_GREEN_RUPEE, ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0xF4, 0x00, CHEST_ANIM_SHORT, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_TREASURE_GAME_HEART] = Item(RG_TREASURE_GAME_HEART, Text{ "Piece of Heart (WINNER)", "Quart de Coeur (Chasse-aux-TrΓ©sors)", "Herzteil (Truhenlotterie)" }, ITEMTYPE_ITEM, GI_HEART_PIECE_WIN, true, LOGIC_PIECE_OF_HEART, RHT_TREASURE_GAME_HEART, ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xFA, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_TREASURE_GAME_GREEN_RUPEE] = Item(RG_TREASURE_GAME_GREEN_RUPEE, Text{ "Green Rupee (LOSER)", "Rubis Vert (Chasse-aux-TrΓ©sors)", "GrΓΌner Rubin (Truhenlotterie)" }, ITEMTYPE_ITEM, GI_RUPEE_GREEN_LOSE, false, LOGIC_NONE, RHT_TREASURE_GAME_GREEN_RUPEE, ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0xF4, 0x00, CHEST_ANIM_SHORT, ITEM_CATEGORY_MAJOR, MOD_NONE); // Shop - itemTable[RG_BUY_DEKU_NUTS_5] = Item(RG_BUY_DEKU_NUTS_5, Text{ "Buy Deku Nut (5)", "Acheter: Noix Mojo (5)", "Deku-Nuß kaufen (5)" }, ITEMTYPE_SHOP, GI_NUTS_5_2, true, LOGIC_BUY_NUTS, RHT_DEKU_NUTS_5, ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 15); + itemTable[RG_BUY_DEKU_NUTS_5] = Item(RG_BUY_DEKU_NUTS_5, Text{ "Buy Deku Nut (5)", "Acheter: Noix Mojo (5)", "Deku-NΓΌsse kaufen (5)" }, ITEMTYPE_SHOP, GI_NUTS_5_2, true, LOGIC_BUY_NUTS, RHT_DEKU_NUTS_5, ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 15); itemTable[RG_BUY_ARROWS_30] = Item(RG_BUY_ARROWS_30, Text{ "Buy Arrows (30)", "Acheter: FlΓ¨ches (30)", "Pfeile kaufen (30)" }, ITEMTYPE_SHOP, GI_ARROWS_MEDIUM, true, LOGIC_BUY_ARROW, RHT_ARROWS_30, ITEM_ARROWS_MEDIUM, OBJECT_GI_ARROW, GID_ARROWS_MEDIUM, 0xE6, 0x49, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 60); itemTable[RG_BUY_ARROWS_50] = Item(RG_BUY_ARROWS_50, Text{ "Buy Arrows (50)", "Acheter: FlΓ¨ches (50)", "Pfeile kaufen (50)" }, ITEMTYPE_SHOP, GI_ARROWS_LARGE, true, LOGIC_BUY_ARROW, RHT_ARROWS_30, ITEM_ARROWS_LARGE, OBJECT_GI_ARROW, GID_ARROWS_LARGE, 0xE6, 0x4A, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 90); itemTable[RG_BUY_BOMBS_525] = Item(RG_BUY_BOMBS_525, Text{ "Buy Bombs (5) [25]", "Acheter: Bombes (5) [25]", "Bomben kaufen (5) [25]" }, ITEMTYPE_SHOP, GI_BOMBS_5, true, LOGIC_BUY_BOMB, RHT_BOMBS_5, ITEM_BOMBS_5, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 25); - itemTable[RG_BUY_DEKU_NUTS_10] = Item(RG_BUY_DEKU_NUTS_10, Text{ "Buy Deku Nut (10)", "Acheter: Noix Mojo (10)", "Deku-Nuß kaufen (10)" }, ITEMTYPE_SHOP, GI_NUTS_10, true, LOGIC_BUY_NUTS, RHT_DEKU_NUTS_10, ITEM_NUTS_10, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 30); - itemTable[RG_BUY_DEKU_STICK_1] = Item(RG_BUY_DEKU_STICK_1, Text{ "Buy Deku Stick (1)", "Acheter: BΓ’ton Mojo (1)", "Deku-Stab kaufen (1)" }, ITEMTYPE_SHOP, GI_STICKS_1, true, LOGIC_BUY_STICKS, RHT_DEKU_STICK_1, ITEM_STICK, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 10); + itemTable[RG_BUY_DEKU_NUTS_10] = Item(RG_BUY_DEKU_NUTS_10, Text{ "Buy Deku Nut (10)", "Acheter: Noix Mojo (10)", "Deku-NΓΌsse kaufen (10)" }, ITEMTYPE_SHOP, GI_NUTS_10, true, LOGIC_BUY_NUTS, RHT_DEKU_NUTS_10, ITEM_NUTS_10, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 30); + itemTable[RG_BUY_DEKU_STICK_1] = Item(RG_BUY_DEKU_STICK_1, Text{ "Buy Deku Stick (1)", "Acheter: BΓ’ton Mojo (1)", "Deku-Stab kaufen (1)" }, ITEMTYPE_SHOP, GI_STICKS_1, true, LOGIC_BUY_STICKS, RHT_DEKU_STICK_1, ITEM_STICK, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 10); itemTable[RG_BUY_BOMBS_10] = Item(RG_BUY_BOMBS_10, Text{ "Buy Bombs (10)", "Acheter: Bombes (10)", "Bomben kaufen (10)" }, ITEMTYPE_SHOP, GI_BOMBS_10, true, LOGIC_BUY_BOMB, RHT_BOMBS_10, ITEM_BOMBS_10, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 50); itemTable[RG_BUY_FISH] = Item(RG_BUY_FISH, Text{ "Buy Fish", "Acheter: Poisson", "Fisch kaufen" }, ITEMTYPE_SHOP, GI_FISH, true, LOGIC_FISH_ACCESS, RHT_BOTTLE_WITH_FISH, ITEM_FISH, OBJECT_GI_FISH, GID_FISH, 0x47, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 200); itemTable[RG_BUY_RED_POTION_30] = Item(RG_BUY_RED_POTION_30, Text{ "Buy Red Potion [30]", "Acheter: Potion Rouge [30]", "Rotes Elixier kaufen [30]" }, ITEMTYPE_SHOP, GI_POTION_RED, false, LOGIC_NONE, RHT_BOTTLE_WITH_RED_POTION, ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 30); @@ -299,17 +299,17 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_BUY_BLUE_POTION] = Item(RG_BUY_BLUE_POTION, Text{ "Buy Blue Potion", "Acheter: Potion Bleue", "Blaues Elixier kaufen" }, ITEMTYPE_SHOP, GI_POTION_BLUE, true, LOGIC_BUY_MAGIC_POTION, RHT_BOTTLE_WITH_BLUE_POTION, ITEM_POTION_BLUE, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x45, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 100); itemTable[RG_BUY_HYLIAN_SHIELD] = Item(RG_BUY_HYLIAN_SHIELD, Text{ "Buy Hylian Shield", "Acheter: Bouclier Hylien", "Hylia-Schild kaufen" }, ITEMTYPE_SHOP, GI_SHIELD_HYLIAN, true, LOGIC_HYLIAN_SHIELD, RHT_HYLIAN_SHIELD, ITEM_SHIELD_HYLIAN, OBJECT_GI_SHIELD_2, GID_SHIELD_HYLIAN, 0x4D, 0xA0, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE, false, 80); itemTable[RG_BUY_DEKU_SHIELD] = Item(RG_BUY_DEKU_SHIELD, Text{ "Buy Deku Shield", "Acheter: Bouclier Mojo", "Deku-Schild kaufen" }, ITEMTYPE_SHOP, GI_SHIELD_DEKU, true, LOGIC_DEKU_SHIELD, RHT_DEKU_SHIELD, ITEM_SHIELD_DEKU, OBJECT_GI_SHIELD_1, GID_SHIELD_DEKU, 0x4C, 0xA0, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE, false, 40); - itemTable[RG_BUY_GORON_TUNIC] = Item(RG_BUY_GORON_TUNIC, Text{ "Buy Goron Tunic", "Acheter: Tunique Goron", "Goronen-Tunika kaufen" }, ITEMTYPE_SHOP, GI_TUNIC_GORON, true, LOGIC_GORON_TUNIC, RHT_GORON_TUNIC, ITEM_TUNIC_GORON, OBJECT_GI_CLOTHES, GID_TUNIC_GORON, 0x50, 0xA0, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE, false, 200); - itemTable[RG_BUY_ZORA_TUNIC] = Item(RG_BUY_ZORA_TUNIC, Text{ "Buy Zora Tunic", "Acheter: Tunique Zora", "Zora-Tunika kaufen" }, ITEMTYPE_SHOP, GI_TUNIC_ZORA, true, LOGIC_ZORA_TUNIC, RHT_ZORA_TUNIC, ITEM_TUNIC_ZORA, OBJECT_GI_CLOTHES, GID_TUNIC_ZORA, 0x51, 0xA0, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE, false, 300); + itemTable[RG_BUY_GORON_TUNIC] = Item(RG_BUY_GORON_TUNIC, Text{ "Buy Goron Tunic", "Acheter: Tunique Goron", "Goronen-RΓΌstung kaufen" }, ITEMTYPE_SHOP, GI_TUNIC_GORON, true, LOGIC_GORON_TUNIC, RHT_GORON_TUNIC, ITEM_TUNIC_GORON, OBJECT_GI_CLOTHES, GID_TUNIC_GORON, 0x50, 0xA0, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE, false, 200); + itemTable[RG_BUY_ZORA_TUNIC] = Item(RG_BUY_ZORA_TUNIC, Text{ "Buy Zora Tunic", "Acheter: Tunique Zora", "Zora-RΓΌstung kaufen" }, ITEMTYPE_SHOP, GI_TUNIC_ZORA, true, LOGIC_ZORA_TUNIC, RHT_ZORA_TUNIC, ITEM_TUNIC_ZORA, OBJECT_GI_CLOTHES, GID_TUNIC_ZORA, 0x51, 0xA0, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE, false, 300); itemTable[RG_BUY_HEART] = Item(RG_BUY_HEART, Text{ "Buy Heart", "Acheter: Coeur de Vie", "Herz kaufen" }, ITEMTYPE_SHOP, GI_HEART, false, LOGIC_NONE, RHT_RECOVERY_HEART, ITEM_HEART, OBJECT_GI_HEART, GID_HEART, 0x55, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 10); itemTable[RG_BUY_BOMBCHUS_10] = Item(RG_BUY_BOMBCHUS_10, Text{ "Buy Bombchu (10)", "Acheter: Missiles (10)", "Krabbelminen kaufen (10)" }, ITEMTYPE_SHOP, GI_BOMBCHUS_10, true, LOGIC_BUY_BOMBCHUS, RHT_BOMBCHUS_10, ITEM_BOMBCHU, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 99); itemTable[RG_BUY_BOMBCHUS_20] = Item(RG_BUY_BOMBCHUS_20, Text{ "Buy Bombchu (20)", "Acheter: Missiles (20)", "Krabbelminen kaufen (20)" }, ITEMTYPE_SHOP, GI_BOMBCHUS_20, true, LOGIC_BUY_BOMBCHUS, RHT_BOMBCHUS_20, ITEM_BOMBCHUS_20, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 180); - itemTable[RG_BUY_DEKU_SEEDS_30] = Item(RG_BUY_DEKU_SEEDS_30, Text{ "Buy Deku Seeds (30)", "Acheter: Graines Mojo (30)", "Deku-Samen kaufen (30)" }, ITEMTYPE_SHOP, GI_SEEDS_30, true, LOGIC_BUY_SEED, RHT_DEKU_SEEDS_30, ITEM_SEEDS_30, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 30); + itemTable[RG_BUY_DEKU_SEEDS_30] = Item(RG_BUY_DEKU_SEEDS_30, Text{ "Buy Deku Seeds (30)", "Acheter: Graines Mojo (30)", "Deku-Kerne kaufen (30)" }, ITEMTYPE_SHOP, GI_SEEDS_30, true, LOGIC_BUY_SEED, RHT_DEKU_SEEDS_30, ITEM_SEEDS_30, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 30); itemTable[RG_SOLD_OUT] = Item(RG_SOLD_OUT, Text{ "Sold Out", "Rupture de stock", "Ausverkauft" }, ITEMTYPE_SHOP, RG_SOLD_OUT, false, LOGIC_NONE, RHT_NONE, false, 0); itemTable[RG_BUY_BLUE_FIRE] = Item(RG_BUY_BLUE_FIRE, Text{ "Buy Blue Fire", "Acheter: Flamme Bleue", "Blaues Feuer kaufen" }, ITEMTYPE_SHOP, GI_BLUE_FIRE, true, LOGIC_BLUE_FIRE_ACCESS, RHT_BOTTLE_WITH_BLUE_FIRE, ITEM_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, 0x5D, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 300); - itemTable[RG_BUY_BOTTLE_BUG] = Item(RG_BUY_BOTTLE_BUG, Text{ "Buy Bottle Bug", "Acheter: Insecte en bouteille", "FlaschenkΓ€fer kaufen" }, ITEMTYPE_SHOP, GI_BUGS, true, LOGIC_BUGS_ACCESS, RHT_BOTTLE_WITH_BUGS, ITEM_BUG, OBJECT_GI_INSECT, GID_BUG, 0x7A, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 50); - itemTable[RG_BUY_POE] = Item(RG_BUY_POE, Text{ "Buy Poe", "Acheter: Esprit", "Geist kaufen" }, ITEMTYPE_SHOP, RG_BUY_POE, false, LOGIC_NONE, RHT_BOTTLE_WITH_BIG_POE, ITEM_POE, OBJECT_GI_GHOST, GID_POE, 0x97, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 30); - itemTable[RG_BUY_FAIRYS_SPIRIT] = Item(RG_BUY_FAIRYS_SPIRIT, Text{ "Buy Fairy's Spirit", "Acheter: Esprit de FΓ©e", "Feengeist kaufen" }, ITEMTYPE_SHOP, GI_FAIRY, true, LOGIC_FAIRY_ACCESS, RHT_BOTTLE_WITH_FAIRY, ITEM_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x46, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 50); + itemTable[RG_BUY_BOTTLE_BUG] = Item(RG_BUY_BOTTLE_BUG, Text{ "Buy Bottle Bug", "Acheter: Insecte en bouteille", "KΓ€fer kaufen" }, ITEMTYPE_SHOP, GI_BUGS, true, LOGIC_BUGS_ACCESS, RHT_BOTTLE_WITH_BUGS, ITEM_BUG, OBJECT_GI_INSECT, GID_BUG, 0x7A, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 50); + itemTable[RG_BUY_POE] = Item(RG_BUY_POE, Text{ "Buy Poe", "Acheter: Esprit", "Irrlicht kaufen" }, ITEMTYPE_SHOP, RG_BUY_POE, false, LOGIC_NONE, RHT_BOTTLE_WITH_BIG_POE, ITEM_POE, OBJECT_GI_GHOST, GID_POE, 0x97, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 30); + itemTable[RG_BUY_FAIRYS_SPIRIT] = Item(RG_BUY_FAIRYS_SPIRIT, Text{ "Buy Fairy's Spirit", "Acheter: Esprit de FΓ©e", "Fee kaufen" }, ITEMTYPE_SHOP, GI_FAIRY, true, LOGIC_FAIRY_ACCESS, RHT_BOTTLE_WITH_FAIRY, ITEM_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x46, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_JUNK, MOD_NONE, false, 50); itemTable[RG_BUY_ARROWS_10] = Item(RG_BUY_ARROWS_10, Text{ "Buy Arrows (10)", "Acheter: FlΓ¨ches (10)", "Pfeile kaufen (10)" }, ITEMTYPE_SHOP, GI_ARROWS_SMALL, true, LOGIC_BUY_ARROW, RHT_ARROWS_10, ITEM_ARROWS_SMALL, OBJECT_GI_ARROW, GID_ARROWS_SMALL, 0xE6, 0x48, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 20); itemTable[RG_BUY_BOMBS_20] = Item(RG_BUY_BOMBS_20, Text{ "Buy Bombs (20)", "Acheter: Bombes (20)", "Bomben kaufen (20)" }, ITEMTYPE_SHOP, GI_BOMBS_20, true, LOGIC_BUY_BOMB, RHT_BOMBS_20, ITEM_BOMBS_20, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 80); itemTable[RG_BUY_BOMBS_30] = Item(RG_BUY_BOMBS_30, Text{ "Buy Bombs (30)", "Acheter: Bombes (30)", "Bomben kaufen (30)" }, ITEMTYPE_SHOP, GI_BOMBS_30, true, LOGIC_BUY_BOMB, RHT_BOMBS_20, ITEM_BOMBS_30, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, ITEM_CATEGORY_JUNK, MOD_NONE, false, 120); @@ -338,15 +338,15 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_FISHING_POLE] = Item(RG_FISHING_POLE, Text{ "Fishing Pole", "Canne Γ  PΓͺche", "Angelrute" }, ITEMTYPE_ITEM, RG_FISHING_POLE, true, LOGIC_FISHING_POLE, RHT_FISHING_POLE, RG_FISHING_POLE, OBJECT_GI_FISH, GID_FISHING_POLE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_FISHING_POLE].SetCustomDrawFunc(Randomizer_DrawFishingPoleGI); - itemTable[RG_OCARINA_A_BUTTON] = Item(RG_OCARINA_A_BUTTON, Text{ "Ocarina A Button", "Touche A de l'Ocarina", "Taste A der Okarina" }, ITEMTYPE_ITEM, GI_MAP, true, LOGIC_OCARINA_A_BUTTON, RHT_OCARINA_A_BUTTON, RG_OCARINA_A_BUTTON, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_OCARINA_A_BUTTON] = Item(RG_OCARINA_A_BUTTON, Text{ "Ocarina A Button", "Touche A de l'Ocarina", "A-Taste der Okarina" }, ITEMTYPE_ITEM, GI_MAP, true, LOGIC_OCARINA_A_BUTTON, RHT_OCARINA_A_BUTTON, RG_OCARINA_A_BUTTON, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_OCARINA_A_BUTTON].SetCustomDrawFunc(Randomizer_DrawOcarinaButton); - itemTable[RG_OCARINA_C_UP_BUTTON] = Item(RG_OCARINA_C_UP_BUTTON, Text{ "Ocarina C Up Button", "Touche C-Haut de l'Ocarina", "Taste C-Oben der Okarina" }, ITEMTYPE_ITEM, GI_MAP, true, LOGIC_OCARINA_C_UP_BUTTON, RHT_OCARINA_C_UP_BUTTON, RG_OCARINA_C_UP_BUTTON, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_OCARINA_C_UP_BUTTON] = Item(RG_OCARINA_C_UP_BUTTON, Text{ "Ocarina C Up Button", "Touche C-Haut de l'Ocarina", "C-Oben-Taste der Okarina" }, ITEMTYPE_ITEM, GI_MAP, true, LOGIC_OCARINA_C_UP_BUTTON, RHT_OCARINA_C_UP_BUTTON, RG_OCARINA_C_UP_BUTTON, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_OCARINA_C_UP_BUTTON].SetCustomDrawFunc(Randomizer_DrawOcarinaButton); - itemTable[RG_OCARINA_C_DOWN_BUTTON] = Item(RG_OCARINA_C_DOWN_BUTTON, Text{ "Ocarina C Down Button", "Touche C-Bas de l'Ocarina", "Taste C-Unten der Okarina" }, ITEMTYPE_ITEM, GI_MAP, true, LOGIC_OCARINA_C_DOWN_BUTTON, RHT_OCARINA_C_DOWN_BUTTON, RG_OCARINA_C_DOWN_BUTTON, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_OCARINA_C_DOWN_BUTTON] = Item(RG_OCARINA_C_DOWN_BUTTON, Text{ "Ocarina C Down Button", "Touche C-Bas de l'Ocarina", "C-Unten-Taste der Okarina" }, ITEMTYPE_ITEM, GI_MAP, true, LOGIC_OCARINA_C_DOWN_BUTTON, RHT_OCARINA_C_DOWN_BUTTON, RG_OCARINA_C_DOWN_BUTTON, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_OCARINA_C_DOWN_BUTTON].SetCustomDrawFunc(Randomizer_DrawOcarinaButton); - itemTable[RG_OCARINA_C_LEFT_BUTTON] = Item(RG_OCARINA_C_LEFT_BUTTON, Text{ "Ocarina C Left Button", "Touche C-Gauche de l'Ocarina", "Taste C-Links der Okarina" }, ITEMTYPE_ITEM, GI_MAP, true, LOGIC_OCARINA_C_LEFT_BUTTON, RHT_OCARINA_C_LEFT_BUTTON, RG_OCARINA_C_LEFT_BUTTON, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_OCARINA_C_LEFT_BUTTON] = Item(RG_OCARINA_C_LEFT_BUTTON, Text{ "Ocarina C Left Button", "Touche C-Gauche de l'Ocarina", "C-Links-Taste der Okarina" }, ITEMTYPE_ITEM, GI_MAP, true, LOGIC_OCARINA_C_LEFT_BUTTON, RHT_OCARINA_C_LEFT_BUTTON, RG_OCARINA_C_LEFT_BUTTON, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_OCARINA_C_LEFT_BUTTON].SetCustomDrawFunc(Randomizer_DrawOcarinaButton); - itemTable[RG_OCARINA_C_RIGHT_BUTTON] = Item(RG_OCARINA_C_RIGHT_BUTTON, Text{ "Ocarina C Right Button", "Touche C-Droit de l'Ocarina", "Taste C-Rechts der Okarina" }, ITEMTYPE_ITEM, GI_MAP, true, LOGIC_OCARINA_C_RIGHT_BUTTON, RHT_OCARINA_C_RIGHT_BUTTON, RG_OCARINA_C_RIGHT_BUTTON, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_OCARINA_C_RIGHT_BUTTON] = Item(RG_OCARINA_C_RIGHT_BUTTON, Text{ "Ocarina C Right Button", "Touche C-Droit de l'Ocarina", "C-Rechts-Taste der Okarina" }, ITEMTYPE_ITEM, GI_MAP, true, LOGIC_OCARINA_C_RIGHT_BUTTON, RHT_OCARINA_C_RIGHT_BUTTON, RG_OCARINA_C_RIGHT_BUTTON, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_OCARINA_C_RIGHT_BUTTON].SetCustomDrawFunc(Randomizer_DrawOcarinaButton); itemTable[RG_BRONZE_SCALE] = Item(RG_BRONZE_SCALE, Text{ "Bronze Scale", "Γ‰caille de Bronze", "Bronzene Schuppe" }, ITEMTYPE_ITEM, GI_SCALE_SILVER, true, LOGIC_PROGRESSIVE_WALLET, RHT_BRONZE_SCALE, RG_BRONZE_SCALE, OBJECT_GI_SCALE, GID_SCALE_SILVER, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); @@ -357,11 +357,11 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_QUIVER_INF] = Item(RG_QUIVER_INF, Text{ "Infinite Quiver", "Carquois Infini", "Unendlicher KΓΆcher" }, ITEMTYPE_ITEM, RG_QUIVER_INF, true, LOGIC_PROGRESSIVE_BOW, RHT_QUIVER_INF, RG_QUIVER_INF, OBJECT_GI_ARROWCASE, GID_QUIVER_50, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_BOMB_BAG_INF] = Item(RG_BOMB_BAG_INF, Text{ "Infinite Bomb Bag", "Sac de Bombes Infini", "Unendliche Bombentasche" }, ITEMTYPE_ITEM, RG_BOMB_BAG_INF, true, LOGIC_PROGRESSIVE_BOMB_BAG, RHT_BOMB_BAG_INF, RG_BOMB_BAG_INF, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_40, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_BULLET_BAG_INF] = Item(RG_BULLET_BAG_INF, Text{ "Infinite Bullet Bag", "Sac de Graines Infinis", "Unendliche Samentasche" }, ITEMTYPE_ITEM, RG_BULLET_BAG_INF, true, LOGIC_PROGRESSIVE_BULLET_BAG, RHT_BULLET_BAG_INF, RG_BULLET_BAG_INF, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_STICK_UPGRADE_INF] = Item(RG_STICK_UPGRADE_INF, Text{ "Infinite Stick Capacity", "BΓ’tons Mojo Infinis", "Unendliche Stab-KapazitΓ€t" }, ITEMTYPE_ITEM, RG_STICK_UPGRADE_INF, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_STICK_UPGRADE_INF, RG_STICK_UPGRADE_INF, OBJECT_GI_STICK, GID_STICK, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_NUT_UPGRADE_INF] = Item(RG_NUT_UPGRADE_INF, Text{ "Infinite Nut Capacity", "Noix Mojo Infinies", "Unendliche Nuß-KapazitΓ€t" }, ITEMTYPE_ITEM, RG_NUT_UPGRADE_INF, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_NUT_UPGRADE_INF, RG_NUT_UPGRADE_INF, OBJECT_GI_NUTS, GID_NUTS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_MAGIC_INF] = Item(RG_MAGIC_INF, Text{ "Infinite Magic Meter", "Magie Infinie", "Unendliches Magisches Maß" }, ITEMTYPE_ITEM, RG_MAGIC_INF, true, LOGIC_PROGRESSIVE_MAGIC, RHT_MAGIC_INF, RG_MAGIC_INF, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_BOMBCHU_INF] = Item(RG_BOMBCHU_INF, Text{ "Infinite Bombchus", "Missiles Teigneux Infinis", "Unendliche Krabbelminen" }, ITEMTYPE_ITEM, RG_BOMBCHU_INF, true, LOGIC_BOMBCHUS, RHT_BOMBCHU_INF, RG_BOMBCHU_INF, OBJECT_GI_BOMB_2, GID_BOMBCHU, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_BULLET_BAG_INF] = Item(RG_BULLET_BAG_INF, Text{ "Infinite Bullet Bag", "Sac de Graines Infinis", "Unendliche Munitionstasche" }, ITEMTYPE_ITEM, RG_BULLET_BAG_INF, true, LOGIC_PROGRESSIVE_BULLET_BAG, RHT_BULLET_BAG_INF, RG_BULLET_BAG_INF, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_STICK_UPGRADE_INF] = Item(RG_STICK_UPGRADE_INF, Text{ "Infinite Stick Capacity", "BΓ’tons Mojo Infinis", "Unendliche Deku-Stab-KapazitΓ€t" }, ITEMTYPE_ITEM, RG_STICK_UPGRADE_INF, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_STICK_UPGRADE_INF, RG_STICK_UPGRADE_INF, OBJECT_GI_STICK, GID_STICK, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_NUT_UPGRADE_INF] = Item(RG_NUT_UPGRADE_INF, Text{ "Infinite Nut Capacity", "Noix Mojo Infinies", "Unendliche Deku-Nuß-KapazitΓ€t" }, ITEMTYPE_ITEM, RG_NUT_UPGRADE_INF, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_NUT_UPGRADE_INF, RG_NUT_UPGRADE_INF, OBJECT_GI_NUTS, GID_NUTS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_MAGIC_INF] = Item(RG_MAGIC_INF, Text{ "Infinite Magic Meter", "Magie Infinie", "Unendliche Magische Kraft" }, ITEMTYPE_ITEM, RG_MAGIC_INF, true, LOGIC_PROGRESSIVE_MAGIC, RHT_MAGIC_INF, RG_MAGIC_INF, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_BOMBCHU_INF] = Item(RG_BOMBCHU_INF, Text{ "Infinite Bombchus", "Missiles Teigneux Infinis", "Unendliche Krabbelminentasche" }, ITEMTYPE_ITEM, RG_BOMBCHU_INF, true, LOGIC_BOMBCHUS, RHT_BOMBCHU_INF, RG_BOMBCHU_INF, OBJECT_GI_BOMB_2, GID_BOMBCHU, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_BOMBCHU_INF].SetCustomDrawFunc(Randomizer_DrawBombchuBag); itemTable[RG_WALLET_INF] = Item(RG_WALLET_INF, Text{ "Infinite Wallet", "Bourse Infinie", "Unendliche GeldbΓΆrse" }, ITEMTYPE_ITEM, RG_WALLET_INF, true, LOGIC_PROGRESSIVE_WALLET, RHT_WALLET_INF, RG_WALLET_INF, OBJECT_GI_PURSE, GID_WALLET_GIANT, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); @@ -381,29 +381,29 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_OCARINA_OF_TIME] = Item(RG_OCARINA_OF_TIME, Text{ "Ocarina of Time", "Ocarina du Temps", "Okarina der Zeit" }, ITEMTYPE_ITEM, GI_OCARINA_OOT, true, LOGIC_PROGRESSIVE_OCARINA, RHT_OCARINA_OF_TIME, ITEM_OCARINA_TIME, OBJECT_GI_OCARINA, GID_OCARINA_TIME, 0x3A, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_BOMB_BAG] = Item(RG_BOMB_BAG, Text{ "Bomb Bag", "Sac de Bombes", "Bombentasche" }, ITEMTYPE_ITEM, GI_BOMB_BAG_20, true, LOGIC_PROGRESSIVE_BOMB_BAG, RHT_BOMB_BAG, ITEM_BOMB_BAG_20, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_20, 0x58, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_BIG_BOMB_BAG] = Item(RG_BIG_BOMB_BAG, Text{ "Big Bomb Bag", "Grand Sac de Bombes", "Große Bombentasche" }, ITEMTYPE_ITEM, GI_BOMB_BAG_30, true, LOGIC_PROGRESSIVE_BOMB_BAG, RHT_BIG_BOMB_BAG, ITEM_BOMB_BAG_30, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_30, 0x59, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); - itemTable[RG_BIGGEST_BOMB_BAG] = Item(RG_BIGGEST_BOMB_BAG, Text{ "Biggest Bomb Bag", "Γ‰norme Sac de Bombes", "Grâßte Bombentasche" }, ITEMTYPE_ITEM, GI_BOMB_BAG_40, true, LOGIC_PROGRESSIVE_BOMB_BAG, RHT_BIGGEST_BOMB_BAG, ITEM_BOMB_BAG_40, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_40, 0x5A, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_BIGGEST_BOMB_BAG] = Item(RG_BIGGEST_BOMB_BAG, Text{ "Biggest Bomb Bag", "Γ‰norme Sac de Bombes", "Riesen-Bombentasche" }, ITEMTYPE_ITEM, GI_BOMB_BAG_40, true, LOGIC_PROGRESSIVE_BOMB_BAG, RHT_BIGGEST_BOMB_BAG, ITEM_BOMB_BAG_40, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_40, 0x5A, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_FAIRY_BOW] = Item(RG_FAIRY_BOW, Text{ "Fairy Bow", "Arc des FΓ©es", "Feen-Bogen" }, ITEMTYPE_ITEM, GI_BOW, true, LOGIC_PROGRESSIVE_BOW, RHT_FAIRY_BOW, ITEM_BOW, OBJECT_GI_BOW, GID_BOW, 0x31, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_BIG_QUIVER] = Item(RG_BIG_QUIVER, Text{ "Big Quiver", "Grand carquois", "Großer KΓΆcher" }, ITEMTYPE_ITEM, GI_QUIVER_40, true, LOGIC_PROGRESSIVE_BOW, RHT_BIG_QUIVER, ITEM_QUIVER_40, OBJECT_GI_ARROWCASE, GID_QUIVER_40, 0x56, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); - itemTable[RG_BIGGEST_QUIVER] = Item(RG_BIGGEST_QUIVER, Text{ "Biggest Quiver", "Γ‰norme carquois", "Grâßter KΓΆcher" }, ITEMTYPE_ITEM, GI_QUIVER_50, true, LOGIC_PROGRESSIVE_BOW, RHT_BIGGEST_QUIVER, ITEM_QUIVER_50, OBJECT_GI_ARROWCASE, GID_QUIVER_50, 0x57, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_BIGGEST_QUIVER] = Item(RG_BIGGEST_QUIVER, Text{ "Biggest Quiver", "Γ‰norme carquois", "RiesenkΓΆcher" }, ITEMTYPE_ITEM, GI_QUIVER_50, true, LOGIC_PROGRESSIVE_BOW, RHT_BIGGEST_QUIVER, ITEM_QUIVER_50, OBJECT_GI_ARROWCASE, GID_QUIVER_50, 0x57, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_FAIRY_SLINGSHOT] = Item(RG_FAIRY_SLINGSHOT, Text{ "Fairy Slingshot", "Lance-Pierre des FΓ©es", "Feen-Schleuder" }, ITEMTYPE_ITEM, GI_SLINGSHOT, true, LOGIC_PROGRESSIVE_BULLET_BAG, RHT_FAIRY_SLINGSHOT, ITEM_SLINGSHOT, OBJECT_GI_PACHINKO, GID_SLINGSHOT, 0x30, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_BIG_BULLET_BAG] = Item(RG_BIG_BULLET_BAG, Text{ "Big Deku Seed Bullet Bag", "Grand sac de graines mojo", "Große Deku-Samentasche" }, ITEMTYPE_ITEM, GI_BULLET_BAG_40, true, LOGIC_PROGRESSIVE_BULLET_BAG, RHT_BIG_BULLET_BAG, ITEM_BULLET_BAG_40, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); - itemTable[RG_BIGGEST_BULLET_BAG] = Item(RG_BIGGEST_BULLET_BAG, Text{ "Biggest Deku Seed Bullet Bag", "Γ‰norme sac de graines mojo", "Grâßte Deku-Samentasche" }, ITEMTYPE_ITEM, GI_BULLET_BAG_50, true, LOGIC_PROGRESSIVE_BULLET_BAG, RHT_BIGGEST_BULLET_BAG, ITEM_BULLET_BAG_50, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_BIG_BULLET_BAG] = Item(RG_BIG_BULLET_BAG, Text{ "Big Deku Seed Bullet Bag", "Grand sac de graines mojo", "Große Munitionstasche" }, ITEMTYPE_ITEM, GI_BULLET_BAG_40, true, LOGIC_PROGRESSIVE_BULLET_BAG, RHT_BIG_BULLET_BAG, ITEM_BULLET_BAG_40, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); + itemTable[RG_BIGGEST_BULLET_BAG] = Item(RG_BIGGEST_BULLET_BAG, Text{ "Biggest Deku Seed Bullet Bag", "Γ‰norme sac de graines mojo", "Riesen-Munitionstasche" }, ITEMTYPE_ITEM, GI_BULLET_BAG_50, true, LOGIC_PROGRESSIVE_BULLET_BAG, RHT_BIGGEST_BULLET_BAG, ITEM_BULLET_BAG_50, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_GORONS_BRACELET] = Item(RG_GORONS_BRACELET, Text{ "Goron's Bracelet", "Bracelet Goron", "Goronen-Armband" }, ITEMTYPE_ITEM, GI_BRACELET, true, LOGIC_PROGRESSIVE_STRENGTH, RHT_GORONS_BRACELET, ITEM_BRACELET, OBJECT_GI_BRACELET, GID_BRACELET, 0x79, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_SILVER_GAUNTLETS] = Item(RG_SILVER_GAUNTLETS, Text{ "Silver Gauntlets", "Gantelets d'argent", "Silberhandschuhe" }, ITEMTYPE_ITEM, GI_GAUNTLETS_SILVER, true, LOGIC_PROGRESSIVE_STRENGTH, RHT_SILVER_GAUNTLETS, ITEM_GAUNTLETS_SILVER, OBJECT_GI_GLOVES, GID_GAUNTLETS_SILVER, 0x5B, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_GOLDEN_GAUNTLETS] = Item(RG_GOLDEN_GAUNTLETS, Text{ "Golden Gauntlets", "Gantelets d'or", "Goldhandschuhe" }, ITEMTYPE_ITEM, GI_GAUNTLETS_GOLD, true, LOGIC_PROGRESSIVE_STRENGTH, RHT_GOLDEN_GAUNTLETS, ITEM_GAUNTLETS_GOLD, OBJECT_GI_GLOVES, GID_GAUNTLETS_GOLD, 0x5C, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_SILVER_GAUNTLETS] = Item(RG_SILVER_GAUNTLETS, Text{ "Silver Gauntlets", "Gantelets d'argent", "Krafthandschuhe" }, ITEMTYPE_ITEM, GI_GAUNTLETS_SILVER, true, LOGIC_PROGRESSIVE_STRENGTH, RHT_SILVER_GAUNTLETS, ITEM_GAUNTLETS_SILVER, OBJECT_GI_GLOVES, GID_GAUNTLETS_SILVER, 0x5B, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_GOLDEN_GAUNTLETS] = Item(RG_GOLDEN_GAUNTLETS, Text{ "Golden Gauntlets", "Gantelets d'or", "Titanhandschuhe" }, ITEMTYPE_ITEM, GI_GAUNTLETS_GOLD, true, LOGIC_PROGRESSIVE_STRENGTH, RHT_GOLDEN_GAUNTLETS, ITEM_GAUNTLETS_GOLD, OBJECT_GI_GLOVES, GID_GAUNTLETS_GOLD, 0x5C, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_SILVER_SCALE] = Item(RG_SILVER_SCALE, Text{ "Silver Scale", "Γ‰caille d'argent", "Silberne Schuppe" }, ITEMTYPE_ITEM, GI_SCALE_SILVER, true, LOGIC_PROGRESSIVE_SCALE, RHT_SILVER_SCALE, ITEM_SCALE_SILVER, OBJECT_GI_SCALE, GID_SCALE_SILVER, 0xCD, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_GOLDEN_SCALE] = Item(RG_GOLDEN_SCALE, Text{ "Golden Scale", "Γ‰caille d'or", "Goldene Schuppe" }, ITEMTYPE_ITEM, GI_SCALE_GOLDEN, true, LOGIC_PROGRESSIVE_SCALE, RHT_GOLDEN_SCALE, ITEM_SCALE_GOLDEN, OBJECT_GI_SCALE, GID_SCALE_GOLDEN, 0xCE, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_ADULT_WALLET] = Item(RG_ADULT_WALLET, Text{ "Adult Wallet", "Grande Bourse", "ErwachsenengeldbΓΆrse" }, ITEMTYPE_ITEM, GI_WALLET_ADULT, true, LOGIC_PROGRESSIVE_WALLET, RHT_ADULT_WALLET, ITEM_WALLET_ADULT, OBJECT_GI_PURSE, GID_WALLET_ADULT, 0x5E, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); - itemTable[RG_GIANT_WALLET] = Item(RG_GIANT_WALLET, Text{ "Giant Wallet", "Bourse de GΓ©ant", "Riesige GeldbΓΆrse" }, ITEMTYPE_ITEM, GI_WALLET_GIANT, true, LOGIC_PROGRESSIVE_WALLET, RHT_GIANT_WALLET, ITEM_WALLET_GIANT, OBJECT_GI_PURSE, GID_WALLET_GIANT, 0x5F, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_ADULT_WALLET] = Item(RG_ADULT_WALLET, Text{ "Adult Wallet", "Grande Bourse", "Große GeldbΓΆrse" }, ITEMTYPE_ITEM, GI_WALLET_ADULT, true, LOGIC_PROGRESSIVE_WALLET, RHT_ADULT_WALLET, ITEM_WALLET_ADULT, OBJECT_GI_PURSE, GID_WALLET_ADULT, 0x5E, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); + itemTable[RG_GIANT_WALLET] = Item(RG_GIANT_WALLET, Text{ "Giant Wallet", "Bourse de GΓ©ant", "RiesengeldbΓΆrse" }, ITEMTYPE_ITEM, GI_WALLET_GIANT, true, LOGIC_PROGRESSIVE_WALLET, RHT_GIANT_WALLET, ITEM_WALLET_GIANT, OBJECT_GI_PURSE, GID_WALLET_GIANT, 0x5F, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_TYCOON_WALLET] = Item(RG_TYCOON_WALLET, Text{ "Tycoon Wallet", "Bourse de Magnat", "Goldene GeldbΓΆrse" }, ITEMTYPE_ITEM, RG_TYCOON_WALLET, true, LOGIC_PROGRESSIVE_WALLET, RHT_TYCOON_WALLET, RG_TYCOON_WALLET, OBJECT_GI_PURSE, GID_WALLET_GIANT, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); itemTable[RG_CHILD_WALLET] = Item(RG_CHILD_WALLET, Text{ "Child Wallet", "Petite Bourse", "KindergeldbΓΆrse" }, ITEMTYPE_ITEM, RG_CHILD_WALLET, true, LOGIC_PROGRESSIVE_WALLET, RHT_CHILD_WALLET, RG_CHILD_WALLET, OBJECT_GI_PURSE, GID_WALLET_ADULT, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_DEKU_NUT_CAPACITY_30] = Item(RG_DEKU_NUT_CAPACITY_30, Text{ "Deku Nut Capacity (30)", "CapacitΓ© de noix Mojo (30)", "Deku-Nuß-KapazitΓ€t (30)" }, ITEMTYPE_ITEM, GI_NUT_UPGRADE_30, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_DEKU_NUT_CAPACITY_30, ITEM_NUT_UPGRADE_30, OBJECT_GI_NUTS, GID_NUTS, 0xA7, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_DEKU_NUT_CAPACITY_40] = Item(RG_DEKU_NUT_CAPACITY_40, Text{ "Deku Nut Capacity (40)", "CapacitΓ© de noix Mojo (40)", "Deku-Nuß-KapazitΓ€t (40)" }, ITEMTYPE_ITEM, GI_NUT_UPGRADE_40, true, LOGIC_PROGRESSIVE_NUT_BAG, RHT_DEKU_NUT_CAPACITY_40, ITEM_NUT_UPGRADE_40, OBJECT_GI_NUTS, GID_NUTS, 0xA8, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_DEKU_STICK_CAPACITY_20] = Item(RG_DEKU_STICK_CAPACITY_20, Text{ "Deku Stick Capacity (20)", "CapacitΓ© de BΓ’tons Mojo (20)", "Deku-Stab-KapazitΓ€t (20)" }, ITEMTYPE_ITEM, GI_STICK_UPGRADE_20, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_DEKU_STICK_CAPACITY_20, ITEM_STICK_UPGRADE_20, OBJECT_GI_STICK, GID_STICK, 0x90, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); itemTable[RG_DEKU_STICK_CAPACITY_30] = Item(RG_DEKU_STICK_CAPACITY_30, Text{ "Deku Stick Capacity (30)", "CapacitΓ© de BΓ’tons Mojo (30)", "Deku-Stab-KapazitΓ€t (30)" }, ITEMTYPE_ITEM, GI_STICK_UPGRADE_30, true, LOGIC_PROGRESSIVE_STICK_BAG, RHT_DEKU_STICK_CAPACITY_30, ITEM_STICK_UPGRADE_30, OBJECT_GI_STICK, GID_STICK, 0x91, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_LESSER, MOD_NONE); - itemTable[RG_MAGIC_SINGLE] = Item(RG_MAGIC_SINGLE, Text{ "Magic Meter", "Jauge de Magie", "Magisches Maß" }, ITEMTYPE_ITEM, 0x8A, true, LOGIC_PROGRESSIVE_MAGIC, RHT_MAGIC_SINGLE, RG_MAGIC_SINGLE, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0xE4, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); - itemTable[RG_MAGIC_DOUBLE] = Item(RG_MAGIC_DOUBLE, Text{ "Enhanced Magic Meter", "Jauge de Magie amΓ©liorΓ©e", "Verbessertes Magisches Maß" }, ITEMTYPE_ITEM, 0x8A, true, LOGIC_PROGRESSIVE_MAGIC, RHT_MAGIC_DOUBLE, RG_MAGIC_DOUBLE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); - itemTable[RG_TRIFORCE_PIECE] = Item(RG_TRIFORCE_PIECE, Text{ "Triforce Piece", "Triforce Piece", "Triforce-Fragment" }, ITEMTYPE_ITEM, 0xDF, true, LOGIC_TRIFORCE_PIECES, RHT_TRIFORCE_PIECE, RG_TRIFORCE_PIECE, OBJECT_GI_BOMB_2, GID_TRIFORCE_PIECE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_MAGIC_SINGLE] = Item(RG_MAGIC_SINGLE, Text{ "Magic Meter", "Jauge de Magie", "Magische Kraft" }, ITEMTYPE_ITEM, 0x8A, true, LOGIC_PROGRESSIVE_MAGIC, RHT_MAGIC_SINGLE, RG_MAGIC_SINGLE, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0xE4, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_MAGIC_DOUBLE] = Item(RG_MAGIC_DOUBLE, Text{ "Enhanced Magic Meter", "Jauge de Magie amΓ©liorΓ©e", "Verb. Magische Kraft" }, ITEMTYPE_ITEM, 0x8A, true, LOGIC_PROGRESSIVE_MAGIC, RHT_MAGIC_DOUBLE, RG_MAGIC_DOUBLE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0xE8, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER); + itemTable[RG_TRIFORCE_PIECE] = Item(RG_TRIFORCE_PIECE, Text{ "Triforce Piece", "Triforce Piece", "Triforce-Splitter" }, ITEMTYPE_ITEM, 0xDF, true, LOGIC_TRIFORCE_PIECES, RHT_TRIFORCE_PIECE, RG_TRIFORCE_PIECE, OBJECT_GI_BOMB_2, GID_TRIFORCE_PIECE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); // clang-format on @@ -416,6 +416,7 @@ void Rando::StaticData::InitItemTable() { } itemNameToEnum[item.GetName().english] = item.GetRandomizerGet(); itemNameToEnum[item.GetName().french] = item.GetRandomizerGet(); + itemNameToEnum[item.GetName().german] = item.GetRandomizerGet(); } } diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index a7205b8c8..2700159f7 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -256,18 +256,128 @@ static const char* englishRupeeNames[188] = { "Zorkmids", }; -static const char* germanRupeeNames[79] = { - "Baht", "Bananen", "Bitcoin", "Bonbons", "BratwΓΌrste", "Brause UFOs", "BrΓΆtchen", "Cent", - "Diamanten", "Dinar", "Diridari", "Dollar", "Draken", "ECU", "Elexit", "Erz", - "Erzbrocken", "Euro", "EXP", "Forint", "Franken", "Freunde", "Gil", "Gold", - "Groschen", "Gulden", "GummibΓ€ren", "Heller", "Juwelen", "Karolin", "Kartoffeln", "Kies", - "Knete", "Knochen", "Kohle", "Kraniche", "Kreuzer", "Kronen", "Kronkorken", "KrΓΆten", - "Lira", "Mark", "MΓ€use", "Monde", "MoorhΓΌhner", "Moos", "MΓΌnzen", "Naira", - "Penunze", "Pesa", "Pfandflaschen", "Pfennig", "Pfund", "Pilze", "Plastiks", "PokΓ©dollar", - "Radieschen", "Rand", "Rappen", "Real", "Rial", "Riyal", "Rubine", "Rupien", - "Saphire", "Schilling", "Seelen", "Septime", "Smaragde", "Steine", "Sterne", "Sternis", - "Tael", "Taler", "Wagenchips", "Won", "Yen", "Yuan", "Zenny", -}; +static const char* germanRupeeNames[114] = { "Baht", + "Baklava", + "Bananen", + "Bitcoin", + "Bonbons", + "Bonschen", + "Brause UFOs", + "Bucks", + "Burek", + "Cent", + "Chickenwing", + "Diamanten", + "Dinar", + "Diridari", + "Dogecoin", + "Dollar", + "Draken", + "ECU", + "Eis", + "Elexit", + "Erz", + "Erzbrocken", + "Ethereum", + "Euro", + "EXP", + "Fartcoin", + "Forint", + "Franken", + "Freunde", + "Geister", + "Gil", + "Gold", + "Groschen", + "Gulden", + "Haribo", + "Heller", + "Juwelen", + "Kapseln", + "Karolin", + "Kartoffeln", + "Keks", + "Kies", + "Knete", + "Knochen", + "Knuspertaler", + "Kohle", + "Kraniche", + "Kreuzer", + "Kronen", + "Kronkorken", + "Lauchcoins", + "Lira", + "Mana", + "Mark", + "Monde", + "Moos", + "Naira", + "Nugget", + "Penunze", + "Pesa", + "Peso", + "Pfandflaschen", + "Pfennig", + "Pfund", + "Pillen", + "Pilze", + "Plastiks", + "Pok\x96" + "dollar", + "Poster", + "Puzzle", + "Radieschen", + "Rand", + "Rappen", + "Real", + "Rial", + "Riesennugget", + "Riyal", + "Rubine", + "Rupien", + "Saphire", + "Schilling", + "Schokobon", + "Seelen", + "Septime", + "Shitcoin", + "Smaragde", + "Solana", + "Sosis", + "Steine", + "Sterne", + "Sternis", + "Tael", + "Taler", + "Tokens", + "Wagenchips", + "Won", + "Wumpas", + "Yen", + "Yuan", + "Zenny", + "M\x93use", + "M\x9Enzen", + "Kr\x9Bten", + "D\x9Bner", + "W\x9Erstchen", + "Kn\x9B" + "del", + "R\x9Bsti", + "H\x9Brnli", + "R\x9E" + "ebli", + "K\x9B" + "fte", + "Bratw\x9E" + "rste", + "Br\x98" + "tchen", + "Gummib\x93" + "ren", + "Moorh\x9E" + "hner" }; static const char* frenchRupeeNames[39] = { "Anneaux", "Baguettes", "Balles", "Bananes", "Bitcoin", "BlΓ©s", "Bling", "Capsules", @@ -410,7 +520,7 @@ void Randomizer::LoadHintMessages() { CustomMessageManager::Instance->CreateMessage( Randomizer::hintMessageTableID, TEXT_WARP_MINUET_OF_FOREST, CustomMessage("Warp to&#a mysterious place?#&" + CustomMessages::TWO_WAY_CHOICE() + "#OK&No#", - "Zu&#einem mysteriΓΆsen Ort#?&" + CustomMessages::TWO_WAY_CHOICE() + "#OK&No#", + "Das Ziel ist&#ein mysteriΓΆser Ort#!&" + CustomMessages::TWO_WAY_CHOICE() + "#Ja!&Nein!#", "Se tΓ©lΓ©porter vers&#un endroit mystΓ©rieux#?&" + CustomMessages::TWO_WAY_CHOICE() + "#OK!&Non#", { QM_RED, QM_GREEN })); @@ -475,7 +585,7 @@ void Randomizer::LoadMerchantMessages() { "\x12\x38\x82" "All right! You win! In return for sparing me, I will give you a #[[1]]#!&Please, take it!\x07\x10\xA3", "\x12\x38\x82" - "In Ordnung! Du gewinnst! Im Austausch dafΓΌr, dass Du mich verschont hast, werde ich Dir einen #[[1]]# " + "In Ordnung! Du gewinnst! Im Austausch dafΓΌr, dass Du mich verschont hast, werde ich Dir #[[1]]# " "geben!\x07\x10\xA3", "\x12\x38\x82" "J'me rends! Laisse-moi partir et en Γ©change, je te donne un #[[1]]#! Vas-y prends le!\x07\x10\xA3", @@ -486,7 +596,7 @@ void Randomizer::LoadMerchantMessages() { "All right! You win! In return for sparing me, I will sell you a #[[1]]#! #[[2]] Rupees# it " "is!\x07\x10\xA3", "\x12\x38\x82" - "Ich gebe auf! Ich verkaufe Dir einen #[[1]]# fΓΌr #[[2]] Rubine#!\x07\x10\xA3", + "Ich gebe auf! Ich verkaufe Dir #[[1]]# fΓΌr #[[2]] Rubine#!\x07\x10\xA3", "\x12\x38\x82" "J'abandonne! Tu veux bien m'acheter un #[[1]]#? Γ‡a fera #[[2]] Rubis#!\x07\x10\xA3", { QM_GREEN, QM_YELLOW })); @@ -502,10 +612,10 @@ void Randomizer::LoadMerchantMessages() { // prompted buy/don't buy CustomMessageManager::Instance->CreateMessage( Randomizer::merchantMessageTableID, TEXT_SHOP_ITEM_RANDOM, - CustomMessage("\x08#[[1]]# #[[2]]_Rupees#&Special deal! #ONE LEFT#!&Get it while it lasts!\x0A\x02", - "\x08#[[1]]# #[[2]]_Rubine#&#NUR NOCH EINES VERFÜGBAR#!&Beeilen Sie sich!\x0A\x02", - "\x08#[[1]]# #[[2]]_Rubis#&#DERNIER EN STOCK#!&Faites vite!\x0A\x02", - { QM_GREEN, QM_YELLOW, QM_RED })); + CustomMessage( + "\x08#[[1]]# #[[2]]_Rupees#&Special deal! #ONE LEFT#!&Get it while it lasts!\x0A\x02", + "\x08#[[1]]# #[[2]]_Rubine#&#NUR EIN EXEMPLAR AUF LAGER!#&Schlag zu solange Du noch kannst!\x0A\x02", + "\x08#[[1]]# #[[2]]_Rubis#&#DERNIER EN STOCK#!&Faites vite!\x0A\x02", { QM_GREEN, QM_YELLOW, QM_RED })); CustomMessageManager::Instance->CreateMessage( Randomizer::merchantMessageTableID, TEXT_SHOP_ITEM_RANDOM_CONFIRM, @@ -519,7 +629,10 @@ void Randomizer::LoadMerchantMessages() { CustomMessage( "I tried to be a #magic bean# salesman, but it turns out my marketing skills weren't worth " "beans!^Anyway, want to buy #[[1]]# for #[[2]] Rupees#?\x1B#Yes&No#", - /*german*/ "MΓΆchten Sie #[[1]]# fΓΌr #[[2]] Rubine# kaufen?\x1B#Ja&Nein#", + /*german*/ + "Ich habe versucht ein Vertreter fΓΌr #Wundererbsen# zu werden, doch meine VerhandlungskΓΌnste waren nicht " + "die Bohne wert. Ach egal...^" + "Willst Du #[[1]]#?&Deine letzte Chance!^Mein Spezial-Preis!&#[[2]] Rubine#! Greif zu!\x1B#Ja!&Nein!#", /*french*/ "J'ai essayΓ© d'Γͺtre un vendeur de #haricots magiques#, mais j'Γ©tais mauvais au niveau du marketing et Γ§a " "me courait sur le haricot...^Enfin bref, Γ§a te dirait de m'acheter #[[1]]# pour #[[2]] " @@ -531,14 +644,14 @@ void Randomizer::LoadMerchantMessages() { CustomMessage( "I never thought I'd say this, but I'm selling the last #Magic Bean#.^#99 Rupees#, no less.\x1B#Yes&No#", "Ich hΓ€tte nie gedacht, daß ich das sage, aber ich verkaufe die letzte^#Wundererbse# fΓΌr #99 " - "Rubine#.\x1B&#Ja&Nein#", + "Rubine#.\x1B&#Ja!&Nein!#", "Je te vends mon dernier #Haricot&magique# pour #99 Rubis#.\x1B&#AcheterNe pas acheter#", { QM_RED, QM_YELLOW, QM_GREEN })); CustomMessageManager::Instance->CreateMessage( Randomizer::merchantMessageTableID, TEXT_MEDIGORON, CustomMessage("How about buying #[[1]]# for #[[2]] Rupees#?\x1B#Buy&Don't buy#", - /*german*/ "MΓΆchtest Du #[[1]]# fΓΌr #[[2]] Rubine# kaufen?\x1B#Klar!&Nie im Leben!#", + /*german*/ "MΓΆchtest Du #[[1]]#?^FΓΌr #[[2]] Rubine#!\x1B#Klar!&Nie im Leben!#", /*french*/ "Veux-tu acheter #[[1]]# pour #[[2]] rubis#?\x1B#Acheter&Ne pas acheter#", { QM_GREEN, QM_YELLOW, QM_GREEN })); /*spanish*/ // ΒΏMe compras #[[1]]# por #[[2]] rupias#?\x1B#Comprar&No comprar# @@ -546,8 +659,8 @@ void Randomizer::LoadMerchantMessages() { CustomMessage firstCarpet = CustomMessage( "Welcome!^I am selling stuff, strange and rare, from all over the world to everybody. Today's special is...^", /*german*/ - "Sei gegrüßt!^Ich verkaufe allerlei KuriositΓ€ten. Stets sonderliche und seltene Ware aus " - "aller Welt fΓΌr jedermann. Das heutige Angebot bleibt...^", + "Willkommen!^Ich verkaufe hier allerlei KuriositΓ€ten. Stets sonderliche und seltene Ware aus " + "aller Welt fΓΌr jedermann. Das heutige Angebot...^", /*french*/ "Bienvenue!^Je vends des objets rares et merveilleux du monde entier. En spΓ©cial aujourd'hui...^"); /*spanish*/ // Β‘AcΓ©rcate!^Vendo productos extraΓ±os y difΓ­ciles de encontrar... De todo el mundo a todo el mundo. La // oferta de hoy es...^#Β‘ @@ -576,7 +689,7 @@ void Randomizer::LoadMerchantMessages() { "#[[1]]!# It's real, I promise! A lonely man such as myself wouldn't #lie# to you, hmm?^" "How about #[[2]] Rupees#?\x1B#Buy&Don't buy#", /*german*/ - "#[[1]]#! Ich kann versichern, es ist ein aufrichtiges Angebot!^Ein einsamer Mann wie ich wΓΌrde Dich " + "#[[1]]#! Ich kann versichern, es ist ein aufrichtiges Angebot!^Ein einsamer Mann wie ich wΓΌrde Euch " "doch " "nicht #anlΓΌgen#, oder?^Wie wΓ€r's mit #[[2]] Rubinen#?\x1B#Aber sicher!&Ich bin weg!#", /*french*/ @@ -4370,7 +4483,7 @@ CustomMessage Randomizer::GetSheikMessage(s16 scene, u16 originalTextId) { "%ylight%w.", "Du bist noch nicht gewappnet um Dich %rGanondorf%w stellen zu kΓΆnnen.^" "Begib Dich auf die Suche nach dem %cMaster-Schwert%w, %retwas um Deinen Pfeilen einen Sinn zu " - "geben%w,^sowie %gdie Magie%w, um das %yLicht%w herauf beschwΓΆren zu kΓΆnnen.", + "geben%w,^sowie %gdie Magie%w, um das %yLicht%w heraufzubeschwΓΆren.", "@, tu n'es toujours pas prΓͺt Γ  affronter %rGanondorf%w.^" "Cherche l'%cΓ‰pΓ©e de LΓ©gende%w, %rquelque chose pour ranger tes flΓ¨ches%w et de la %gmagie%w pour " "invoquer la %ylumiΓ¨re%w."); @@ -4379,8 +4492,9 @@ CustomMessage Randomizer::GetSheikMessage(s16 scene, u16 originalTextId) { messageEntry = CustomMessage( "You may have what you need to defeat %rthe Evil King%w, but the %cbarrier%w still " "stands.^Complete the remaining %gtrials%w to destroy it.", - "Du magst das haben, was Du brauchst um %rden bΓΆsen KΓΆnig%w zu besiegen, aber die %cBarriere%w " - "steht noch.^Absolviere die verbleibenden %gPrΓΌfungen%w um sie zu zerstΓΆren.", + "Du magst haben, was Du brauchst um %rden Großmeister des BΓΆsen%w zu besiegen, doch die " + "%cBarriere%w " + "steht noch.^Breche die verbleibenden %gSiegel%w um sie zu zerstΓΆren.", "@, tu as peut-Γͺtre ce qu'il te faut pour vaincre %rle Malin%w, mais les barriΓ¨res sont toujours " "actives.^Termine les Γ©preuves restantes pour les dΓ©truire."); } else { @@ -4398,8 +4512,8 @@ CustomMessage Randomizer::GetFishingPondOwnerMessage(u16 originalTextId) { auto ctx = Rando::Context::GetInstance(); CustomMessage messageEntry = CustomMessage( "Sorry, but the pond is closed.&I've lost my good %rfishing pole%w...&Can't go fishing without it!", - "Entschuldigung, aber der Teich ist zu.&Ich habe meine gute %rAngelrute%w verloren.&Ohne kann ich nicht " - "fischen!", + "Entschuldigung, aber der Teich hat&geschloßen. Ich habe meine gute &%rAngelrute%w verloren.&Ohne kann ich " + "nicht fischen!^", "DΓ©solΓ©, mais l'Γ©tang est fermΓ©.&J'ai perdu ma bonne %rCanne Γ  PΓͺche%w...&Impossible de pΓͺcher sans elle!"); if (GetRandoSettingValue(RSK_FISHING_POLE_HINT)) { @@ -4498,7 +4612,6 @@ CustomMessage Randomizer::GetMapGetItemMessageWithHint(GetItemEntry itemEntry) { // BUG: the icon is not in the message yet so are not accounted for, so overflows are possible messageEntry.AutoFormat(); - return messageEntry; } @@ -4577,7 +4690,7 @@ void CreateTriforcePieceMessages() { "Vous avez complΓ©tΓ© la %yTriforce&du Courage%w! %gFΓ©licitations%w!" }, { "You found a spare %yTriforce Piece%w!&You only needed %c[[required]]%w, but you have %g[[current]]%w!", - "Ein ΓΌbriger %yTriforce-Splitter%w! Du&hast nun %g[[current]]%w von %c[[required]]%w nΓΆtigen gefunden.", + "Noch ein %yTriforce-Splitter%w! Du&brauchtest nur %c[[required]]%w, hast jetzt aber %g[[current]]%w!", "Vous avez trouvΓ© un %yFragment de&Triforce%w en plus! Vous n'aviez besoin&que de %c[[required]]%w, mais " "vous en avez %g[[current]]%w en&tout!" }, }; @@ -4640,13 +4753,13 @@ void CreateNaviRandoMessages() { "mouvants%c?" }, { "%cYou can reach the back of %wImpa's&House %cby jumping from the&unfinished house with a %rcucco%c!", - "%cDu kannst den Balkon von %wImpas&Haus %cerreichen indem Du von&der Baustelle aus mit einem " + "%cDu kannst den Balkon von %wImpas&Haus %cerreichen, indem Du von&der Baustelle aus mit einem " "%rHuhn&%cspringst!", "%cTu peux atteindre l'arriΓ¨re de la&%wMaison d'Impa %cen sautant depuis la&maison en construction avec " "une&%rcocotte%c!" }, { "%cThe %ySpirit Trial %cin %pGanon's Castle&%chas a %whidden chest %csomewhere.&Did you already know that?", - "%cDie %yGeister-PrΓΌfung %cin %pGanons&Schloß %chat irgendwo eine&%wversteckte Kiste%c. Weißt Du schon&wo?", + "%cDas %yGeister-Siegel %cin %pGanons&Schloß %chat irgendwo eine&%wversteckte Kiste%c. Wußtest Du&das schon?", "%cL'%yΓ‰preuve de l'Esprit%c dans le %pChΓ’teau&de Ganon %ca un coffre cachΓ© quelque&part. Je suppose que tu " "le savais&dΓ©jΓ ?" }, @@ -4665,7 +4778,7 @@ void CreateNaviRandoMessages() { { "%cYou might end up with an %wextra&key %cfor the %bWater Temple %cor the&%rFire Temple%c. It's for your " "safety!", "%cVielleicht verbleibt Dir im&%bWassertempel %coder %rFeuertempel %cein&%wzusΓ€tzlicher SchlΓΌssel%c. " - "Dies&ist zu Deiner Sicherheit!", + "&Nur zu Deiner Sicherheit!", "%cIl se peut que tu aies une %wPetite&ClΓ© %cen trop dans le %bTemple de l'Eau&%cou le %rTemple du Feu%c. " "C'est pour ta&propre sΓ©curitΓ©!" }, @@ -4693,20 +4806,20 @@ void CreateNaviRandoMessages() { "%wjarre&%cΓ  la figure?" }, { "%cI hear the patch of %wsoft soil&%cin %bZora's River %cis the only one&that isn't home to a %rspider%c!", - "%cIch habe gehΓΆrt, daß die Stelle&%wfeuchten Bodens %cim %bZora-Fluß %cals&einzige keine %rSkulltula " + "%cIch habe gehΓΆrt, daß das&%wErdloch%c am %bZora-Fluß, %cals&einziges keine %rSkulltula " "%cbeherbergt.", "%cJ'ai entendu dire que la %wterre meuble&%cqui se trouve Γ  la %bRiviΓ¨re Zora %cest&la seule qui ne " "contienne pas&d'%raraignΓ©e%c." }, { "%cThe people of Hyrule sometimes&have %witems %cfor you, but they won't&like it if you're %wwearing a " "mask%c!", - "%cDie Bewohner Hyrules haben manchmal&%wGegenstΓ€nde %cfΓΌr Dich, aber sie mΓΆgen&es nicht, wenn Du %wMasken " + "%cDie Bewohner Hyrules haben manchmal&%wGegenstΓ€nde %cfΓΌr Dich, doch sie mΓΆgen&es nicht, wenn Du %wMasken " "trΓ€gst%c!", "%cIl se peut que les habitants d'Hyrule&aient des %wobjets %cpour toi. Par contre,&ils risquent de ne pas " "trop apprΓ©cier&le fait que tu %wportes un masque%c!" }, { "%cIf you get trapped somewhere, you&might have to %wsave your game %cand&%wreset%c!", - "%cSolltest Du irgendwo eingeschlossen&sein, mußt Du vielleicht Dein %wSpiel&speichern %cund %wneu " + "%cSolltest Du irgendwo eingeschloßen&sein, mußt Du vielleicht Dein %wSpiel&speichern %cund %wneu " "starten%c!", "%cSi tu es coincΓ© quelque part, tu&devrais %wsauvegarder ta partie %cet&faire un %wreset%c!" }, @@ -4910,10 +5023,10 @@ CustomMessage Randomizer::GetIceTrapMessage() { "#Titanic's revenge#.", }; - static const char* const germanIceTrapMessages[23] = { + static const char* const germanIceTrapMessages[104] = { "Du bist ein #DUMMKOPF#!", "Du bist eine #Frostbeule#!", - "#DUMMKOPF#!", + "#NARR#!", "Du wurdest #eiskalt# erwischt!", "Es lΓ€uft Dir #eiskalt# den RΓΌcken hinunter, @.", "Bleib #cool#, @.", @@ -4926,7 +5039,7 @@ CustomMessage Randomizer::GetIceTrapMessage() { "Bewahre einen #kΓΌhlen#! Kopf.", "Ganondorf setzt #Eisstrahl# ein. Das ist sehr effektiv!", "Ein LΓ€cheln ist der beste Weg, um das #Eis# zu brechen!", - "#Eiskalt# lΓ€sst du meine Seele erfrier'n.", + "#Eiskalt# lΓ€sst Du meine Seele erfrier'n.", "Die #Titanic# hΓ€tte Angst vor Dir, @.", "Oh nein!", "Was die Dinosaurier getΓΆtet hat?&Die #Eiszeit#!", @@ -4934,6 +5047,87 @@ CustomMessage Randomizer::GetIceTrapMessage() { "Never gonna #give you up#. Never gonna #let you down#. Never gonna run around and #desert you#.", "Danke #@#! Aber der Gegenstand ist in einem anderem Schloß!", "Kalt. Kalt. KΓ€lter. #EISKALT#!", + "Von wegen #Belohnung#!", + "Ganon lacht dich aus.", + "Zelda wartet... aber nicht auf Dich!", + "Hyrule braucht Dich... aber nicht so!", + "Master-Schmerz statt Master-Schwert.", + "Das passiert wenn man alles looten mΓΆchte!", + "Ein kleiner Vorgeschmack auf Ganons KΓΌhlschrank.", + "Ich hoffe, Du hast gespeichert.", + "Dein Gesicht, als Du die Truhe geΓΆffnet hast... unbezahlbar.", + "Tut mir leid, aber das Item befindet sich in einer anderen Truhe.", + "Noch 5 solcher Truhen und Du bist abgehΓ€rtet.", + "Keine sorge. Ich bin genau so enttΓ€uscht wie Du.", + "Epona lΓ€uft gerade ohne Dich los.", + "Wow! Ein echtes Nichts!", + "Du bist sowas von bereit fΓΌr den Endboss. Nicht!", + "Loot? Nur fΓΌr Gewinner!", + "Pure EnttΓ€uschung.", + "RNG meint es nicht gut mit dir...", + "Link.exe hat ein Problem erkannt. Spiel wird heruntergefahren.", + "Die Truhe war leer, dein Verstand ebenso.", + "Hier fΓΌr Dich, lecker #Eis#.", + "Das ist kein Item - das ist Karma.", + "Und wieder hat Dich 'ne Kiste besiegt.", + "Rauru lacht Dich aus.", + "Saria hat sich gerade entfreundet.", + "Prinzessin Ruto hat die Verlobung aufgelΓΆst.", + "Kein Seed, kein Γ„rger!", + "Diese Truhe wurde Ihnen prΓ€sentiert von: ABSICHT!", + "Nicht heute.", + "NΓ€chster halt, #Frosthausen#!", + "Genau so nΓΌtzlich wie Navi im Bosskampf.", + "Zelda? Die kennt Dich nicht.", + "Zufall? Nein. Absicht!", + "Karma.exe erfolgreich ausgefΓΌhrt.", + "Manchmal gewinnt man, aber Du gehΓΆrst nicht dazu.", + "#Eiskalt# versagt.", + "Tingle lacht Dich aus.", + "Du hΓΆrst Ganondorf dir folgendes zuflΓΌstern.. \"Danke fΓΌrs Γ–ffnen, aber das war mein #MΓΌll#!\"", + "Navi: 'Hey, hΓΆr zu! Da ist... absolut #nichts# drin.", + "Truhe geΓΆffnet, Hoffnung zerstΓΆrt. Willkommen in Hyrule.", + "Die Truhe enthΓ€lt: 100% pure #EnttΓ€uschung#.", + "Na? Wieder zu viel von Malons #Mentos# genascht?", + "Du wurdest #eiskalt# beim Γ–ffnen der Truhe erwischt.", + "Grats, Du hast Ganons alten #EiswΓΌrfelvorrat# gefunden.", + "Die Truhe ist kΓ€lter als #Zoras Reich#... und genauso leer.", + "#Eis#? Klar, das ist der #kalte# Hauch der EnttΓ€uschung!", + "Die Truhe ist so leer, sogar der #Yeti# aus Twilight Princess lacht.", + "Die Truhe enthΓ€lt: 100% #gefrorene# Hoffnungslosigkeit.", + "Du hast eine Truhe geΓΆffnet und den #KΓ€lterekord# in Hyrule gebrochen.", + "Du hast TM16 erhalten: #Eissturm#!", + "Controller Disconnect, jetzt bist Du #gefreezed#.", + "Noch drei solcher Truhen, und dein Spielstand wird gelΓΆscht.", + "Gengar setzt Schlecker ein! Du bist vollstΓ€ndig #paralysiert#!", + "Mumbo Jumbo verwandelt Dich in einen #Eisblock#. Haste jetzt 'nen coolen Look.", + "Willkommen in Donkey Kong Country: Tropical #Freeze#!", + "Gratuliere! Du hast das Spiel #gefreezed#.", + "Triforce des Mutes und trotzdem bekommst Du kalte Füße.", + "Fortschritt #eingefroren#. Bitte blasen Sie in die Cartridge.", + "Du bist nicht soft-locked. Du bist #frost-locked#.", + "Ein #frostiger# Wind weht durch die Truhe... leer, als hΓ€tte Kirby den ganzen Inhalt eingesaugt.", + "Ein #eisiger# Hauch weht dir entgegen.... Doch die Truhe bleibt #kalt# und leer.", + "Die Truhe ist von #Frost# versiegelt... drinnen nichts als eine #kalte#, #frostige# EnttΓ€uschung!", + "#Frost# knistert bedrohlich in der Truhe - kein Schatz, nur ein #eisiger# Hohn!", + "Diese Falle zu finden ist so #frostig# wie Fangen spielen mit Chill Penguin.", + "#Eis# kann funkeln, was kannst Du?", + "Niete, selbst die Prinzessin ist enttΓ€uscht.", + "Herzteil? Nein, #Eiskalt#!", + "Ratet mal wer wieder zu gierig war? Richtig... DU!", + "Ganondorf bedankt sich persΓΆnlich fΓΌr deine Inkompetenz.", + "Der Spind von Davy Jones!", + "Herzog Onkled lacht Dich aus.", + "GEWINNER!", + "vERLIERER!", + "DrΓΌcke B, Unten und Select um zu ΓΌberleben.", + "#Chill# mal jetzt.", + "Hier halt mal eben.", + "Sony lacht Dich aus", + "Dieses Item ist nicht in deinem Land verfΓΌgbar.", + "Es ist wichtig, die #KΓΌhltruhe# mal fΓΌr einen Tag auszuschalten.", + "#Kacknoob#!", + "Insert Rupee to continue...", }; static const char* const frenchIceTrapMessages[83] = { @@ -5035,7 +5229,7 @@ CustomMessage Randomizer::GetIceTrapMessage() { if (CVarGetInteger(CVAR_GENERAL("LetItSnow"), 0)) { msg = CustomMessage( /*english*/ "This year for Christmas, all you get is #COAL#!", - /*german*/ "This year for Christmas, all you get is #COAL#!", + /*german*/ "Dieses Jahr gibt es nur #KOHLE# zu Weihnachten!", /*french*/ "Pour NoΓ«l, cette annΓ©e, tu n'auras que du #CHARBON#! %rJoyeux NoΓ«l%w!", { QM_BLUE }); } else { msg = CustomMessage(RandomElement(englishIceTrapMessages), RandomElement(germanIceTrapMessages), @@ -5126,7 +5320,7 @@ void CreateFireTempleGoronMessages() { }, { "I dunno why I was thrown in here,&truth be told.&I'm just a %g\"PR\"%w person.", - "Wat weiß'n ich, wieso ich hier&eingepfercht wurd. Ich mach&doch nur %g\"Pull&Requests\"%w.", + "Wat weiß'n ich, wieso ich hier&eingepfercht wurd. Ich mach&doch nur %g\"Pull Requests\"%w.", "Je ne sais pas comment on m'a jetΓ©&ici. Il faut croire que je dors comme&une pierre.", }, }; @@ -5150,7 +5344,7 @@ void Randomizer::CreateCustomMessages() { // RANDTODO: Translate into french and german and replace GIMESSAGE_UNTRANSLATED // with GIMESSAGE(getItemID, itemID, english, german, french). const std::array getItemMessages = { { - GIMESSAGE(RG_GREG_RUPEE, ITEM_MASK_GORON, "You found %gGreg%w!", "%gGreg%w! Du hast ihn wirklich gefunden!", + GIMESSAGE(RG_GREG_RUPEE, ITEM_MASK_GORON, "You found %gGreg%w!", "%gGreg%w! Du hast ihn&wirklich gefunden!", "FΓ©licitation! Vous avez trouvΓ© %gGreg%w!"), GIMESSAGE(RG_MASTER_SWORD, ITEM_SWORD_MASTER, "You found the %gMaster Sword%w!", "Du erhΓ€ltst das %gMaster-Schwert%w!", "Vous obtenez %gl'Γ‰pΓ©e de LΓ©gende%w!"), @@ -5175,7 +5369,7 @@ void Randomizer::CreateCustomMessages() { "Vous obtenez une %rBouteille avec&un Poisson%w! Il a l'air dΓ©licieux!&Il paraΓtrait que %bJabu-Jabu " "%wen&serait friand!"), GIMESSAGE(RG_BOTTLE_WITH_BUGS, ITEM_BUG, "You got a %rBug in a Bottle%w!&They love to burrow in&dirt holes!", - "Du hast jetzt %rKΓ€fer in einer&Flasche&%w!&Sie graben gerne&in ErdlΓΆchern.", + "Du hast jetzt %rKΓ€fer in einer&Flasche%w! Sie graben gerne&in ErdlΓΆchern.", "Vous obtenez une %rBouteille avec&des Insectes%w! Ils adorent creuser&dans la terre meuble!"), GIMESSAGE(RG_BOTTLE_WITH_FAIRY, ITEM_FAIRY, "You got a %rFairy in a Bottle%w!&Use it wisely!", "Du hast jetzt eine %rFee in einer&Flasche%w! Nutze sie weise!", @@ -5192,224 +5386,220 @@ void Randomizer::CreateCustomMessages() { "Vous obtenez une %rBouteille avec&une Potion Verte%w! Buvez-la pour&restaurer votre %gmagie%w!"), GIMESSAGE(RG_BOTTLE_WITH_POE, ITEM_POE, "You got a %rPoe in a Bottle%w!&That creepy Ghost Shop might&be interested in this...", - "Du hast jetzt ein %rIrrlicht in einer&Flasche%w! Der %rGespenstermarkt%w&interessiert sich fΓΌr " + "Du hast jetzt ein %rIrrlicht in einer&Flasche%w! Der %rGespenstermarkt%w&interessiert sich " "vielleicht&dafΓΌr...", "Vous obtenez une %rBouteille avec&un Esprit%w! Γ‡a intΓ©resserait&peut-Γͺtre le vendeur d'Γ‚me "), GIMESSAGE(RG_GERUDO_FORTRESS_SMALL_KEY, ITEM_KEY_SMALL, "You found a %yThieves Hideout &%wSmall Key!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr das %yDiebesversteck%w!", + "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w des %yDiebesverstecks%w!", "Vous obtenez une %rPetite ClΓ© %w&du %yRepaire des Voleurs%w!"), GIMESSAGE(RG_FOREST_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %gForest Temple &%wSmall Key!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr den %gWaldtempel%w!", + "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w des %gWaldtempels%w!", "Vous obtenez une %rPetite ClΓ© %w&du %gTemple de la ForΓͺt%w!"), GIMESSAGE(RG_FIRE_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %rFire Temple &%wSmall Key!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr den %rFeuertempel%w!", + "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w des %rFeuertempels%w!", "Vous obtenez une %rPetite ClΓ© %w&du %rTemple du Feu%w!"), GIMESSAGE(RG_WATER_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %bWater Temple &%wSmall Key!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr den %bWassertempel%w!", + "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w des %bWassertempels%w!", "Vous obtenez une %rPetite ClΓ© %w&du %bTemple de l'Eau%w!"), GIMESSAGE(RG_SPIRIT_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %ySpirit Temple &%wSmall Key!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr den %yGeistertempel%w!", + "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w des %yGeistertempels%w!", "Vous obtenez une %rPetite ClΓ© %w&du %yTemple de l'Esprit%w!"), GIMESSAGE(RG_SHADOW_TEMPLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %pShadow Temple &%wSmall Key!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr den %pSchattentempel%w!", + "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w des %pSchattentempels%w!", "Vous obtenez une %rPetite ClΓ© %w&du %pTemple de l'Ombre%w!"), GIMESSAGE(RG_BOTTOM_OF_THE_WELL_SMALL_KEY, ITEM_KEY_SMALL, "You found a %pBottom of the &Well %wSmall Key!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr den %pGrund des Brunnens%w!", + "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w vom %pGrund des Brunnens%w!", "Vous obtenez une %rPetite ClΓ© %w&du %pPuits%w!"), GIMESSAGE(RG_GERUDO_TRAINING_GROUND_SMALL_KEY, ITEM_KEY_SMALL, "You found a %yGerudo Training &Ground %wSmall Key!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr das %yGerudo-TrainingsgelΓ€nde%w!", + "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w der %yGerudo-Trainingsarena%w!", "Vous obtenez une %rPetite ClΓ© %w&du %yGymnase Gerudo%w!"), GIMESSAGE(RG_GANONS_CASTLE_SMALL_KEY, ITEM_KEY_SMALL, "You found a %rGanon's Castle &%wSmall Key!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr %rGanons Schloß%w!", + "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w von %rGanons Schloß%w!", "Vous obtenez une %rPetite ClΓ© %w&du %rChΓ’teau de Ganon%w!"), GIMESSAGE(RG_GUARD_HOUSE_KEY, ITEM_KEY_SMALL, "You found the key to the&%gGuard House%w!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr das %gHaus der Wachen%w!", + "Du erhΓ€ltst den %rSchlΓΌssel%w&zum %gWachhaus%w!", "Vous obtenez la %rClΓ© %wde la&%gMaison des Gardes%w!"), GIMESSAGE(RG_MARKET_BAZAAR_KEY, ITEM_KEY_SMALL, "You found the key to the&%gMarket Bazaar%w!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr den %gBasar des Marktes%w!", + "Du erhΓ€ltst den %rSchlΓΌssel%w&zum %gBasar des Marktes%w!", "Vous obtenez la %rClΓ© %wdu %gBazar&de la Place du MarchΓ©%w!"), GIMESSAGE(RG_MARKET_POTION_SHOP_KEY, ITEM_KEY_SMALL, "You found the key to the&%gMarket Potion Shop%w!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr den %gMagie-Laden des Marktes%w!", + "Du erhΓ€ltst den %rSchlΓΌssel%w&zum %gMagie-Laden des Marktes%w!", "Vous obtenez la %rClΓ© %wdu&%gMagasin de Potions de la&Place du MarchΓ©%w!"), GIMESSAGE(RG_MASK_SHOP_KEY, ITEM_KEY_SMALL, "You found the key to the&%gMask Shop%w!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr den %gMaskenladen%w!", + "Du erhΓ€ltst den %rSchlΓΌssel%w&zum %gMaskenhΓ€ndler%w!", "Vous obtenez la %rClΓ© %wde la&%gFoire aux Masques%w!"), GIMESSAGE(RG_MARKET_SHOOTING_GALLERY_KEY, ITEM_KEY_SMALL, "You found the key to the&%gMarket Shooting Gallery%w!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr die %gSchießbude des Marktes%w!", + "Du erhΓ€ltst den %rSchlΓΌssel%w&zur %gSchießbude des Marktes%w!", "Vous obtenez la %rClΓ© %wdu %gStand de&Tir de la Place du MarchΓ©%w!"), GIMESSAGE(RG_BOMBCHU_BOWLING_KEY, ITEM_KEY_SMALL, "You found the key to the&%gBombchu Bowling Alley%w!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr die %gMinenbowlingbahn%w!", + "Du erhΓ€ltst den %rSchlΓΌssel%w&zur %gMinenbowlingbahn%w!", "Vous obtenez la %rClΓ© %wdu %gBowling&Teigneux%w!"), GIMESSAGE(RG_TREASURE_CHEST_GAME_BUILDING_KEY, ITEM_KEY_SMALL, "You found the key to the&%gTreasure Chest Game Building%w!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr das %gHaus des Schatzkisten-Pokers%w!", + "Du erhΓ€ltst den %rSchlΓΌssel%w&zum %gHaus der Truhenlotterie%w!", "Vous obtenez la %rClΓ© %wdu %gJeu de la&Chasse au TrΓ©sor%w!"), GIMESSAGE(RG_BOMBCHU_SHOP_KEY, ITEM_KEY_SMALL, "You found the key to the&%gBombchu Shop%w!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr den %gKrabbelminenladen%w!", + "Du erhΓ€ltst den %rSchlΓΌssel%w&zum %gKrabbelminenladen%w!", "Vous obtenez la %rClΓ© %wdu %gMagasin&de Missiles%w!"), GIMESSAGE(RG_RICHARDS_HOUSE_KEY, ITEM_KEY_SMALL, "You found the key to&%gRichard's House%w!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr das %gHaus von Richard%w!", + "Du erhΓ€ltst den %rSchlΓΌssel%w&zu %gRichards Haus%w!", "Vous obtenez la %rClΓ© %wde la %gMaison&de Kiki%w!"), GIMESSAGE(RG_ALLEY_HOUSE_KEY, ITEM_KEY_SMALL, "You found the key to&the %gAlley House%w!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr das %gHaus in der Gasse%w!", + "Du erhΓ€ltst den %rSchlΓΌssel%w&zum %gHaus in der Gasse%w!", "Vous obtenez la %rClΓ© %wde la %gMaison&de la Ruelle%w!"), GIMESSAGE(RG_KAK_BAZAAR_KEY, ITEM_KEY_SMALL, "You found the key to the&%gKakariko Bazaar%w!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr den %gBasar von Kakariko%w!", + "Du erhΓ€ltst den %rSchlΓΌssel%w&zum %gBasar von Kakariko%w!", "Vous obtenez la %rClΓ© %wdu %gBazar&de Cocorico%w!"), GIMESSAGE(RG_KAK_POTION_SHOP_KEY, ITEM_KEY_SMALL, "You found the key to the&%gKakariko Potion Shop%w!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr den %gMagie-Laden von Kakariko%w!", + "Du erhΓ€ltst den %rSchlΓΌssel%w&zum %gMagie-Laden von Kakariko%w!", "Vous obtenez la %rClΓ© %wdu %gMagasin de&Potions de Cocorico%w!"), GIMESSAGE(RG_BOSS_HOUSE_KEY, ITEM_KEY_SMALL, "You found the key to the&%gBoss's House%w!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr das %gHaus des Chefs%w!", + "Du erhΓ€ltst den %rSchlΓΌssel%w&zum %gHaus des Chefs%w!", "Vous obtenez la %rClΓ© %wde la %gMaison&du Chef des Ouvriers%w!"), GIMESSAGE(RG_GRANNYS_POTION_SHOP_KEY, ITEM_KEY_SMALL, "You found the key to&%gGranny's Potion Shop%w!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr %gAsas Hexenladen%w!", + "Du erhΓ€ltst den %rSchlΓΌssel%w&zu %gAsas Hexenladen%w!", "Vous obtenez la %rClΓ© %wde&l'%gApothicaire%w!"), GIMESSAGE(RG_SKULLTULA_HOUSE_KEY, ITEM_KEY_SMALL, "You found the key to the&%gSkulltula House%w!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr das %gSkulltula-Haus%w!", + "Du erhΓ€ltst den %rSchlΓΌssel%w&zum %gSkulltula-Haus%w!", "Vous obtenez la %rClΓ© %wde la %gMaison&des AraignΓ©es%w!"), GIMESSAGE(RG_IMPAS_HOUSE_KEY, ITEM_KEY_SMALL, "You found the key to&%gImpa's House%w!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr das %gHaus von Impa%w!", + "Du erhΓ€ltst den %rSchlΓΌssel%w&zu %gImpas Haus%w!", "Vous obtenez la %rClΓ© %wde la %gMaison&d'Impa%w!"), GIMESSAGE(RG_WINDMILL_KEY, ITEM_KEY_SMALL, "You found the key to the&%gWindmill%w!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr die %gWindmΓΌhle%w!", - "Vous obtenez la %rClΓ© %w du %gMoulin%w!"), + "Du erhΓ€ltst den %rSchlΓΌssel%w&zur %gWindmΓΌhle%w!", "Vous obtenez la %rClΓ© %w du %gMoulin%w!"), GIMESSAGE(RG_KAK_SHOOTING_GALLERY_KEY, ITEM_KEY_SMALL, "You found the key to the&%gKakariko Shooting Gallery%w!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr die %gSchießbude von Kakariko%w!", + "Du erhΓ€ltst den %rSchlΓΌssel%w&zur %gSchießbude von Kakariko%w!", "Vous obtenez la %rClΓ© %w du %gStand de&Tir de Cocorico%w!"), GIMESSAGE(RG_DAMPES_HUT_KEY, ITEM_KEY_SMALL, "You found the key to&%gDampe's Hut%w!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr die %gHΓΌtte von Boris%w!", + "Du erhΓ€ltst den %rSchlΓΌssel%w&zur %gHΓΌtte des TotengrΓ€bers%w!", "Vous obtenez la %rClΓ© %wde la %gCabane&d'Igor%w!"), GIMESSAGE(RG_TALONS_HOUSE_KEY, ITEM_KEY_SMALL, "You found the key to&%gTalon's House%w!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr das %gHaus von Talon%w!", + "Du erhΓ€ltst den %rSchlΓΌssel%w&zu %gTalons Haus%w!", "Vous obtenez la %rClΓ© %wde la %gMaison&de Talon%w!"), GIMESSAGE(RG_STABLES_KEY, ITEM_KEY_SMALL, "You found the key to the&%gStables%w!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr die %gStΓ€lle%w!", - "Vous obtenez la %rClΓ© %wdes %gΓ‰curies%w!"), + "Du erhΓ€ltst den %rSchlΓΌssel%w&zu den %gStΓ€llen%w!", "Vous obtenez la %rClΓ© %wdes %gΓ‰curies%w!"), GIMESSAGE(RG_BACK_TOWER_KEY, ITEM_KEY_SMALL, "You found the key to the&%gBack Tower%w!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr den %ghinteren Turm%w!", - "Vous obtenez la %rClΓ© %wdu %gSilo%w!"), + "Du erhΓ€ltst den %rSchlΓΌssel%w&zum %gLon Lon-Turm%w!", "Vous obtenez la %rClΓ© %wdu %gSilo%w!"), GIMESSAGE(RG_HYLIA_LAB_KEY, ITEM_KEY_SMALL, "You found the key to the&%gHylia Laboratory%w!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr das %gHylia-Labor%w!", + "Du erhΓ€ltst den %rSchlΓΌssel%w&zum %gHylia-Labor%w!", "Vous obtenez la %rClΓ© %wdu %gLaboratoire&du Lac Hylia%w!"), GIMESSAGE(RG_FISHING_HOLE_KEY, ITEM_KEY_SMALL, "You found the key to the&%gPond%w!", - "Du erhΓ€ltst einen %rkleinen&SchlΓΌssel%w fΓΌr den %gFischweiher%w!", - "Vous obtenez la %rClΓ© %wde l'%gΓ‰tang%w!"), + "Du erhΓ€ltst den %rSchlΓΌssel%w&zum %gFischweiher%w!", "Vous obtenez la %rClΓ© %wde l'%gΓ‰tang%w!"), GIMESSAGE(RG_GERUDO_FORTRESS_KEY_RING, ITEM_KEY_SMALL, "You found a %yThieves Hideout&%wKeyring!", - "Du erhΓ€ltst ein %rSchlΓΌsselbund%w&fΓΌr das %yDiebesversteck%w!", + "Du erhΓ€ltst das %rSchlΓΌsselbund%w&des %yDiebesverstecks%w!", "Vous obtenez le trousseau de&clΓ©s du %yRepaire des Voleurs%w!"), GIMESSAGE(RG_FOREST_TEMPLE_KEY_RING, ITEM_KEY_SMALL, "You found a %gForest Temple&%wKeyring!", - "Du erhΓ€ltst ein %rSchlΓΌsselbund%w&fΓΌr den %gWaldtempel%w!", + "Du erhΓ€ltst das %rSchlΓΌsselbund%w&des %gWaldtempels%w!", "Vous obtenez le trousseau de&clΓ©s du %gTemple de la ForΓͺt%w!"), GIMESSAGE(RG_FIRE_TEMPLE_KEY_RING, ITEM_KEY_SMALL, "You found a %rFire Temple&%wKeyring!", - "Du erhΓ€ltst ein %rSchlΓΌsselbund%w&fΓΌr den %rFeuertempel%w!", + "Du erhΓ€ltst das %rSchlΓΌsselbund%w&des %rFeuertempels%w!", "Vous obtenez le trousseau de&clΓ©s du %rTemple du Feu%w!"), GIMESSAGE(RG_WATER_TEMPLE_KEY_RING, ITEM_KEY_SMALL, "You found a %bWater Temple&%wKeyring!", - "Du erhΓ€ltst ein %rSchlΓΌsselbund%w&fΓΌr den %bWassertempel%w!", + "Du erhΓ€ltst das %rSchlΓΌsselbund%w&des %bWassertempels%w!", "Vous obtenez le trousseau de&clΓ©s du %bTemple de l'Eau%w!"), GIMESSAGE(RG_SPIRIT_TEMPLE_KEY_RING, ITEM_KEY_SMALL, "You found a %ySpirit Temple&%wKeyring!", - "Du erhΓ€ltst ein %rSchlΓΌsselbund%w&fΓΌr den %yGeistertempel%w!", + "Du erhΓ€ltst das %rSchlΓΌsselbund%w&des %yGeistertempels%w!", "Vous obtenez le trousseau de&clΓ©s du %yTemple de l'Esprit%w!"), GIMESSAGE(RG_SHADOW_TEMPLE_KEY_RING, ITEM_KEY_SMALL, "You found a %pShadow Temple&%wKeyring!", - "Du erhΓ€ltst ein %rSchlΓΌsselbund%w&fΓΌr den %pSchattentempel%w!", + "Du erhΓ€ltst das %rSchlΓΌsselbund%w&des %pSchattentempels%w!", "Vous obtenez le trousseau de&clΓ©s du %pTemple de l'Ombre%w!"), GIMESSAGE(RG_BOTTOM_OF_THE_WELL_KEY_RING, ITEM_KEY_SMALL, "You found a %pBottom of the&Well %wKeyring!", - "Du erhΓ€ltst ein %rSchlΓΌsselbund%w&fΓΌr den %pGrund des Brunnens%w!", + "Du erhΓ€ltst das %rSchlΓΌsselbund%w&vom %pGrund des Brunnens%w!", "Vous obtenez le trousseau de&clΓ©s du %pPuits%w!"), GIMESSAGE(RG_GERUDO_TRAINING_GROUND_KEY_RING, ITEM_KEY_SMALL, "You found a %yGerudo Training&Ground %wKeyring!", - "Du erhΓ€ltst ein %rSchlΓΌsselbund%w&fΓΌr das %yGerudo-TrainingsgelΓ€nde%w!", + "Du erhΓ€ltst das %rSchlΓΌsselbund%w&der %yGerudo-Trainingsarena%w!", "Vous obtenez le trousseau de&clΓ©s du %yGymnase Gerudo%w!"), GIMESSAGE(RG_GANONS_CASTLE_KEY_RING, ITEM_KEY_SMALL, "You found a %rGanon's Castle&%wKeyring!", - "Du erhΓ€ltst ein %rSchlΓΌsselbund%w&fΓΌr %rGanons Schloß%w!", + "Du erhΓ€ltst das %rSchlΓΌsselbund%w&von %rGanons Schloß%w!", "Vous obtenez le trousseau de&clΓ©s du %rChΓ’teau de Ganon%w!"), GIMESSAGE(RG_TREASURE_GAME_KEY_RING, ITEM_KEY_SMALL, "You found a %rTreasure Chest Game&%wKeyring!", - "Du erhΓ€ltst ein %rSchlΓΌsselbund%w& fΓΌr das %rSchatztruhen-Poker&%w!", + "Du erhΓ€ltst das %rSchlΓΌsselbund%w&der %rTruhenlotterie&%w!", "Vous obtenez le trousseau de&clΓ©s du %rJeu de la Chasse au TrΓ©sor%w!"), GIMESSAGE(RG_FOREST_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, "You found the %gForest Temple&%wBoss Key!", - "Du erhΓ€ltst den %rMaster-SchlΓΌssel%w&fΓΌr den %gWaldtempel%w!", + "Du erhΓ€ltst den %rMaster-SchlΓΌssel%w&des %gWaldtempels%w!", "Vous obtenez la %rClΓ© d'or %wdu&%gTemple de la ForΓͺt%w!"), GIMESSAGE(RG_FIRE_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, "You found the %rFire Temple&%wBoss Key!", - "Du erhΓ€ltst den %rMaster-SchlΓΌssel%w&fΓΌr den %rFeuertempel%w!", + "Du erhΓ€ltst den %rMaster-SchlΓΌssel%w&des %rFeuertempels%w!", "Vous obtenez la %rClΓ© d'or %wdu&%rTemple du Feu%w!"), GIMESSAGE(RG_WATER_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, "You found the %bWater Temple&%wBoss Key!", - "Du erhΓ€ltst den %rMaster-SchlΓΌssel%w&fΓΌr den %bWassertempel%w!", + "Du erhΓ€ltst den %rMaster-SchlΓΌssel%w&des %bWassertempels%w!", "Vous obtenez la %rClΓ© d'or %wdu&%bTemple de l'Eau%w!"), GIMESSAGE(RG_SPIRIT_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, "You found the %ySpirit Temple&%wBoss Key!", - "Du erhΓ€ltst den %rMaster-SchlΓΌssel%w&fΓΌr den %yGeistertempel%w!", + "Du erhΓ€ltst den %rMaster-SchlΓΌssel%w&des %yGeistertempels%w!", "Vous obtenez la %rClΓ© d'or %wdu&%yTemple de l'Esprit%w!"), GIMESSAGE(RG_SHADOW_TEMPLE_BOSS_KEY, ITEM_KEY_BOSS, "You found the %pShadow Temple&%wBoss Key!", - "Du erhΓ€ltst den %rMaster-SchlΓΌssel%w&fΓΌr den %pSchattentempel%w!", + "Du erhΓ€ltst den %rMaster-SchlΓΌssel%w&des %pSchattentempels%w!", "Vous obtenez la %rClΓ© d'or %wdu&%pTemple de l'Ombre%w!"), GIMESSAGE(RG_GANONS_CASTLE_BOSS_KEY, ITEM_KEY_BOSS, "You found the %rGanon's Castle&%wBoss Key!", - "Du erhΓ€ltst den %rMaster-SchlΓΌssel%w&fΓΌr %rGanons Schloß%w!", + "Du erhΓ€ltst den %rMaster-SchlΓΌssel%w&von %rGanons Schloß%w!", "Vous obtenez la %rClΓ© d'or %wdu&%rChΓ’teau de Ganon%w!"), GIMESSAGE(RG_DEKU_TREE_MAP, ITEM_DUNGEON_MAP, "You found the %gDeku Tree&%wMap![[typeHint]]", - "Du erhΓ€ltst die %rKarte%w fΓΌr den&%gDeku-Baum%w![[typeHint]]", + "Du erhΓ€ltst die %rLabyrinth-&Karte%w des %gDeku-Baumes%w![[typeHint]]", "Vous obtenez la %rCarte %wde&l'%gArbre Mojo%w![[typeHint]]"), GIMESSAGE(RG_DODONGOS_CAVERN_MAP, ITEM_DUNGEON_MAP, "You found the %rDodongo's Cavern&%wMap![[typeHint]]", - "Du erhΓ€ltst die %rKarte%w fΓΌr&%rDodongos HΓΆhle%w![[typeHint]]", + "Du erhΓ€ltst die %rLabyrinth-&Karte%w von %rDodongos HΓΆhle%w![[typeHint]]", "Vous obtenez la %rCarte %wde la&%rCaverne Dodongo%w![[typeHint]]"), GIMESSAGE(RG_JABU_JABUS_BELLY_MAP, ITEM_DUNGEON_MAP, "You found the %bJabu Jabu's Belly&%wMap![[typeHint]]", - "Du erhΓ€ltst die %rKarte%w fΓΌr&%bJabu-Jabus Bauch%w![[typeHint]]", + "Du erhΓ€ltst die %rLabyrinth-&Karte%w von %bJabu-Jabus Bauch%w![[typeHint]]", "Vous obtenez la %rCarte %wdu&%bVentre de Jabu-Jabu%w![[typeHint]]"), GIMESSAGE(RG_FOREST_TEMPLE_MAP, ITEM_DUNGEON_MAP, "You found the %gForest Temple&%wMap![[typeHint]]", - "Du erhΓ€ltst die %rKarte%w fΓΌr den&%gWaldtempel%w![[typeHint]]", + "Du erhΓ€ltst die %rLabyrinth-&Karte%w des %gWaldtempels%w![[typeHint]]", "Vous obtenez la %rCarte %wdu&%gTemple de la ForΓͺt%w![[typeHint]]"), GIMESSAGE(RG_FIRE_TEMPLE_MAP, ITEM_DUNGEON_MAP, "You found the %rFire Temple&%wMap![[typeHint]]", - "Du erhΓ€ltst die %rKarte%w fΓΌr den&%rFeuertempel%w![[typeHint]]", + "Du erhΓ€ltst die %rLabyrinth-&Karte%w des %rFeuertempels%w![[typeHint]]", "Vous obtenez la %rCarte %wdu&%rTemple du Feu%w![[typeHint]]"), GIMESSAGE(RG_WATER_TEMPLE_MAP, ITEM_DUNGEON_MAP, "You found the %bWater Temple&%wMap![[typeHint]]", - "Du erhΓ€ltst die %rKarte%w fΓΌr den&%bWassertempel%w![[typeHint]]", + "Du erhΓ€ltst die %rLabyrinth-&Karte%w des %bWassertempels%w![[typeHint]]", "Vous obtenez la %rCarte %wdu&%bTemple de l'Eau%w![[typeHint]]"), GIMESSAGE(RG_SPIRIT_TEMPLE_MAP, ITEM_DUNGEON_MAP, "You found the %ySpirit Temple&%wMap![[typeHint]]", - "Du erhΓ€ltst die %rKarte%w fΓΌr den&%yGeistertempel%w![[typeHint]]", + "Du erhΓ€ltst die %rLabyrinth-&Karte%w des %yGeistertempels%w![[typeHint]]", "Vous obtenez la %rCarte %wdu&%yTemple de l'Esprit%w![[typeHint]]"), GIMESSAGE(RG_SHADOW_TEMPLE_MAP, ITEM_DUNGEON_MAP, "You found the %pShadow Temple&%wMap![[typeHint]]", - "Du erhΓ€ltst die %rKarte%w fΓΌr den&%pSchattentempel%w![[typeHint]]", + "Du erhΓ€ltst die %rLabyrinth-&Karte%w des %pSchattentempels%w![[typeHint]]", "Vous obtenez la %rCarte %wdu&%pTemple de l'Ombre%w![[typeHint]]"), GIMESSAGE(RG_BOTTOM_OF_THE_WELL_MAP, ITEM_DUNGEON_MAP, "You found the %pBottom of the&Well %wMap![[typeHint]]", - "Du erhΓ€ltst die %rKarte%w fΓΌr den&%pGrund des Brunnens%w![[typeHint]]", + "Du erhΓ€ltst die %rLabyrinth-&Karte%w vom %pGrund des Brunnens%w![[typeHint]]", "Vous obtenez la %rCarte %wdu&%pPuits%w![[typeHint]]"), GIMESSAGE(RG_ICE_CAVERN_MAP, ITEM_DUNGEON_MAP, "You found the %cIce Cavern&%wMap![[typeHint]]", - "Du erhΓ€ltst die %rKarte%w fΓΌr die&%cEishΓΆhle%w![[typeHint]]", + "Du erhΓ€ltst die %rLabyrinth-&Karte%w der %cEishΓΆhle%w![[typeHint]]", "Vous obtenez la %rCarte %wde&la %cCaverne Polaire%w![[typeHint]]"), GIMESSAGE(RG_DEKU_TREE_COMPASS, ITEM_COMPASS, "You found the %gDeku Tree&%wCompass!", - "Du erhΓ€ltst den %rKompaß%w fΓΌr den&%gDeku-Baum%w!", + "Du erhΓ€ltst den %rKompaß%w des&%gDeku-Baumes%w!", "Vous obtenez la %rBoussole %wde&l'%gArbre Mojo%w!"), GIMESSAGE(RG_DODONGOS_CAVERN_COMPASS, ITEM_COMPASS, "You found the %rDodongo's Cavern&%wCompass!", - "Du erhΓ€ltst den %rKompaß%w fΓΌr&%rDodongos HΓΆhle%w!", + "Du erhΓ€ltst den %rKompaß%w von&%rDodongos HΓΆhle%w!", "Vous obtenez la %rBoussole %wde la&%rCaverne Dodongo%w!"), GIMESSAGE(RG_JABU_JABUS_BELLY_COMPASS, ITEM_COMPASS, "You found the %bJabu Jabu's Belly&%wCompass!", - "Du erhΓ€ltst den %rKompaß%w fΓΌr den&%bJabu-Jabus Bauch%w!", + "Du erhΓ€ltst den %rKompaß%w von&%bJabu-Jabus Bauch%w!", "Vous obtenez la %rBoussole %wdu&%bVentre de Jabu-Jabu%w!"), GIMESSAGE(RG_FOREST_TEMPLE_COMPASS, ITEM_COMPASS, "You found the %gForest Temple&%wCompass!", - "Du erhΓ€ltst den %rKompaß%w fΓΌr den&%gWaldtempel%w!", + "Du erhΓ€ltst den %rKompaß%w des&%gWaldtempels%w!", "Vous obtenez la %rBoussole %wdu&%gTemple de la ForΓͺt%w!"), GIMESSAGE(RG_FIRE_TEMPLE_COMPASS, ITEM_COMPASS, "You found the %rFire Temple&%wCompass!", - "Du erhΓ€ltst den %rKompaß%w fΓΌr den&%rFeuertempel%w!", + "Du erhΓ€ltst den %rKompaß%w des&%rFeuertempels%w!", "Vous obtenez la %rBoussole %wdu&%rTemple du Feu%w!"), GIMESSAGE(RG_WATER_TEMPLE_COMPASS, ITEM_COMPASS, "You found the %bWater Temple&%wCompass!", - "Du erhΓ€ltst den %rKompaß%w fΓΌr den&%bWassertempel%w!", + "Du erhΓ€ltst den %rKompaß%w des&%bWassertempels%w!", "Vous obtenez la %rBoussole %wdu&%bTemple de l'Eau%w!"), GIMESSAGE(RG_SPIRIT_TEMPLE_COMPASS, ITEM_COMPASS, "You found the %ySpirit Temple&%wCompass!", - "Du erhΓ€ltst den %rKompaß%w fΓΌr den&%yGeistertempel%w!", + "Du erhΓ€ltst den %rKompaß%w des&%yGeistertempels%w!", "Vous obtenez la %rBoussole %wdu&%yTemple de l'Esprit%w!"), GIMESSAGE(RG_SHADOW_TEMPLE_COMPASS, ITEM_COMPASS, "You found the %pShadow Temple&%wCompass!", - "Du erhΓ€ltst den %rKompaß%w fΓΌr den&%pSchattentempel%w!", + "Du erhΓ€ltst den %rKompaß%w des&%pSchattentempels%w!", "Vous obtenez la %rBoussole %wdu&%pTemple de l'Ombre%w!"), GIMESSAGE(RG_BOTTOM_OF_THE_WELL_COMPASS, ITEM_COMPASS, "You found the %pBottom of the&Well %wCompass!", - "Du erhΓ€ltst den %rKompaß%w fΓΌr den&%pGrund des Brunnens%w!", + "Du erhΓ€ltst den %rKompaß%w vom&%pGrund des Brunnens%w!", "Vous obtenez la %rBoussole %wdu&%pPuits%w!"), GIMESSAGE(RG_ICE_CAVERN_COMPASS, ITEM_COMPASS, "You found the %cIce Cavern&%wCompass!", - "Du erhΓ€ltst den %rKompaß%w fΓΌr die&%cEishΓΆhle%w!", + "Du erhΓ€ltst den %rKompaß%w der&%cEishΓΆhle%w!", "Vous obtenez la %rBoussole %wde&la %cCaverne Polaire%w!"), GIMESSAGE(RG_MAGIC_BEAN_PACK, ITEM_BEAN, @@ -5430,23 +5620,23 @@ void Randomizer::CreateCustomMessages() { "Vous obtenez la %rPetite Bourse%w!&Elle peut contenir jusqu'Γ  %y99 rubis%w!"), GIMESSAGE(RG_GOHMA_SOUL, ITEM_BIG_POE, "You found the soul for %gGohma%w!", - "Du hast die Seele von %gGohma%w gefunden!", "Vous obtenez l'Γ’me de %gGohma%w!"), + "Du hast die Seele von&%gGohma%w gefunden!", "Vous obtenez l'Γ’me de %gGohma%w!"), GIMESSAGE(RG_KING_DODONGO_SOUL, ITEM_BIG_POE, "You found the soul for %rKing&Dodongo%w!", - "Du hast die Seele von %rKΓΆnig&Dodongo%w gefunden!", "Vous obtenez l'Γ’me du %rRoi Dodongo%w!"), + "Du hast die Seele von&%rKΓΆnig Dodongo%w gefunden!", "Vous obtenez l'Γ’me du %rRoi Dodongo%w!"), GIMESSAGE(RG_BARINADE_SOUL, ITEM_BIG_POE, "You found the soul for %bBarinade%w!", - "Du hast die Seele von %bBarinade%w gefunden!", "Vous obtenez l'Γ’me de %bBarinade%w!"), + "Du hast die Seele von&%bBarinade%w gefunden!", "Vous obtenez l'Γ’me de %bBarinade%w!"), GIMESSAGE(RG_PHANTOM_GANON_SOUL, ITEM_BIG_POE, "You found the soul for %gPhantom&Ganon%w!", - "Du hast die Seele von %gPhantom-&Ganon%w gefunden!", "Vous obtenez l'Γ’me de %gGanon&Spectral%w!"), + "Du hast die Seele von&%gPhantom-Ganon%w gefunden!", "Vous obtenez l'Γ’me de %gGanon&Spectral%w!"), GIMESSAGE(RG_VOLVAGIA_SOUL, ITEM_BIG_POE, "You found the soul for %rVolvagia%w!", - "Du hast die Seele von %rVolvagia%w gefunden!", "Vous obtenez l'Γ’me de %rVolcania%w!"), + "Du hast die Seele von&%rVolvagia%w gefunden!", "Vous obtenez l'Γ’me de %rVolcania%w!"), GIMESSAGE(RG_MORPHA_SOUL, ITEM_BIG_POE, "You found the soul for %bMorpha%w!", - "Du hast die Seele von %bMorpha%w gefunden!", "Vous obtenez l'Γ’me de %bMorpha%w!"), + "Du hast die Seele von&%bMorpha%w gefunden!", "Vous obtenez l'Γ’me de %bMorpha%w!"), GIMESSAGE(RG_BONGO_BONGO_SOUL, ITEM_BIG_POE, "You found the soul for %pBongo&Bongo%w!", - "Du hast die Seele von %pBongo&Bongo%w gefunden!", "Vous obtenez l'Γ’me de %pBongo&Bongo%w!"), + "Du hast die Seele von&%pBongo Bongo%w gefunden!", "Vous obtenez l'Γ’me de %pBongo&Bongo%w!"), GIMESSAGE(RG_TWINROVA_SOUL, ITEM_BIG_POE, "You found the soul for %yTwinrova%w!", - "Du hast die Seele von %yTwinrova%w gefunden!", "Vous obtenez l'Γ’me du %yDuo&MalΓ©fique%w!"), + "Du hast die Seele von&%yTwinrova%w gefunden!", "Vous obtenez l'Γ’me du %yDuo&MalΓ©fique%w!"), GIMESSAGE(RG_GANON_SOUL, ITEM_BIG_POE, "You found the soul for %cGanon%w!", - "Du hast die Seele von %cGanon%w gefunden!", "Vous obtenez l'Γ’me de %cGanon%w!"), + "Du hast die Seele von&%cGanon%w gefunden!", "Vous obtenez l'Γ’me de %cGanon%w!"), GIMESSAGE(RG_OCARINA_A_BUTTON, ITEM_OCARINA_TIME, "You got the %b\x9f%r button for the&Ocarina%w! You can now use it&while playing songs!", @@ -5475,46 +5665,47 @@ void Randomizer::CreateCustomMessages() { "jouez!"), GIMESSAGE(RG_BRONZE_SCALE, ITEM_SCALE_SILVER, "You got the %rBronze Scale%w!&The power of buoyancy is yours!", - "Du hast die %rBronzene Schuppe%w erhalten!&Die Macht der Schwungkraft ist dein!", + "Du hast die %rBronzene Schuppe%w&erhalten! Die FΓ€higkeit zu&Schwimmen ist nun dein!", "Vous obtenez l'%rΓ‰caille de Bronze%w!&Le pouvoir de la flottabilitΓ© est&Γ  vous!"), GIMESSAGE(RG_FISHING_POLE, ITEM_FISHING_POLE, "You found a lost %rFishing Pole%w!&Time to hit the pond!", - "Du hast eine verlorene %rAngelrute%w gefunden!&Zeit, im Teich zu angeln!", + "Du hast eine verlorene %rAngelrute%w&gefunden!&Zeit, im Teich&zu angeln!", "Vous obtenez une %rCanne Γ  pΓͺche%w&perdue!&Il est temps d'aller Γ  %gl'Γ©tang%w!"), GIMESSAGE(RG_BOMBCHU_BAG, ITEM_BOMBCHU, "You found the %rBombchu Bag%w!", "Du hast die %rKrabbelminentasche%w&gefunden!", "Vous obtenez un %rSac de Missiles&Teigneux%w!"), GIMESSAGE( RG_BOMB_BAG_INF, ITEM_BOMB_BAG_40, "You got an %rInfinite Bomb Bag%w!&Now you have %yinfinite bombs%w!", - "Du hast eine %runendliche Bombentasche%w&gefunden! Nun hast Du &%yunendliche Bomben%w!", + "Du hast die %rUnendliche Bombentasche%w&gefunden! Nun hast Du &%yunendlich viele Bomben%w!", "Vous obtenez un %rSac de Bombes&sans fond%w!&Vous avez maintenant des %ybombes&en quantitΓ© illimitΓ©e%w!"), GIMESSAGE(RG_QUIVER_INF, ITEM_QUIVER_50, "You got an %rInfinite Quiver%w!&Now you have %yinfinite arrows%w!", - "Du hast einen %runendlichen KΓΆcher%w&gefunden! Nun hast Du &%yunendliche Pfeile%w!", + "Du hast den %rUnendlichen KΓΆcher%w&gefunden! Nun hast Du &%yunendlich viele Pfeile%w!", "Vous obtenez un %rCarquois Infini%w!&Vous avez maintenant des %yflΓ¨ches&de maniΓ¨re illimitΓ©e%w!"), GIMESSAGE(RG_BULLET_BAG_INF, ITEM_BULLET_BAG_50, "You got an %rInfinite Bullet Bag%w!&Now you have %yinfinite&slingshot seeds%w!", - "Du hast eine %runendliche Samentasche%w&gefunden! Nun hast Du &%yunendliche Samen%w!", + "Du hast die %rUnendliche Munitionstasche%w&gefunden! Nun hast Du &%yunendlich viele Deku-Kerne%w!", "Vous obtenez un %rSac de Graines&sans fond%w!&Vous avez maintenant des %ygraines&de lance-pierres Γ  " "l'infini%w!"), GIMESSAGE(RG_STICK_UPGRADE_INF, ITEM_STICK, "You now have %yinfinite%w %rDeku Sticks%w!", - "Du hast nun %yrunendliche%w %rDeku-StΓ€be%w!", + "Du hast nun %yrunendlich viele%w %rDeku-StΓ€be%w!", "Vous avez maintenant des %yBΓ’tons&Mojo de maniΓ¨re illimitΓ©e%w!"), GIMESSAGE(RG_NUT_UPGRADE_INF, ITEM_NUT, "You now have %yinfinite%w %rDeku Nuts%w!", - "Du hast nun %yunendliche%w %rDeku-NΓΌsse%w!", + "Du hast nun %yunendlich viele%w %rDeku-NΓΌsse%w!", "Vous avez maintenant des %yNoix&Mojo de maniΓ¨re illimitΓ©e%w!"), GIMESSAGE(RG_MAGIC_INF, ITEM_MAGIC_LARGE, "You now have %yinfinite%w %rMagic%w!", - "Du hast nun %yunendliche%w %rMagiew!", "Vous avez maintenant une quantitΓ©&de %ymagie illimitΓ©e%w!"), + "Du hast nun %yunendlich viel%w %rMagische Kraft%w!", + "Vous avez maintenant une quantitΓ©&de %ymagie illimitΓ©e%w!"), GIMESSAGE(RG_BOMBCHU_INF, ITEM_BOMBCHU, "You now have %yinfinite%w %rBombchus%w!", - "Du hast nun %yunendliche%w %rKrabbelminen%w!", + "Du hast nun %yunendlich viele%w %rKrabbelminen%w!", "Vous avez maintenant des %yMissiles&Teigneux en quantitΓ© illimitΓ©s%w!"), GIMESSAGE(RG_WALLET_INF, ITEM_WALLET_GIANT, "You now have %yinfinite%w %rmoney%w!", - "Du hast nun %yunendliche%w %rRubinew!", + "Du hast nun %yunendlich viele%w %rRubine%w!", "Vous avez maintenant des %yRubis en& quantitΓ© illimitΓ©e%w!"), GIMESSAGE(RG_SKELETON_KEY, ITEM_KEY_SMALL, "You found the %rSkeleton Key%w!", "Du hast den %rSkelettschlΓΌssel%w gefunden!", "Vous avez trouvΓ© la %rClΓ© Squelette%w!"), GIMESSAGE(RG_DEKU_STICK_BAG, ITEM_STICK, "You found the %rDeku Stick Bag%w!&You can now hold Deku Sticks!", - "Du hast eine %rDeku-Stab-Tasche%w&gefunden! Nun kannst Du &%yDeku-StΓ€be%w halten!", + "Du hast eine %rDeku-Stab-Tasche%w&gefunden! Nun kannst Du &%yDeku-StΓ€be%w verwenden!", "Vous avez trouvΓ© le %rSac de BΓ’tons&Mojo%w!&Vous pouvez maintenant porter des&BΓ’tons Mojo!"), GIMESSAGE(RG_DEKU_NUT_BAG, ITEM_NUT, "You found the %rDeku Nut Bag%w!&You can now hold Deku Nuts!", - "Du hast eine %rDeku-Nuß-Tasche%w&gefunden! Nun kannst Du &%yDeku-NΓΌsse%w halten!", + "Du hast eine %rDeku-Nuß-Tasche%w&gefunden! Nun kannst Du &%yDeku-NΓΌsse%w verwenden!", "Vous avez trouvΓ© le %rSac de Noix& Mojo%w!&Vous pouvez maintenant porter des&Noix Mojo!"), } }; CreateGetItemMessages(getItemMessages); diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index 57904fc84..2180f6d95 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -167,6 +167,7 @@ void SaveManager::LoadRandomizer() { Rando::ItemOverride(static_cast(i), rg)); SaveManager::Instance->LoadStruct("trickName", [&]() { SaveManager::Instance->LoadData("english", randoContext->GetItemOverride(i).GetTrickName().english); + SaveManager::Instance->LoadData("german", randoContext->GetItemOverride(i).GetTrickName().german); SaveManager::Instance->LoadData("french", randoContext->GetItemOverride(i).GetTrickName().french); }); } @@ -264,9 +265,10 @@ void SaveManager::SaveRandomizer(SaveContext* saveContext, int sectionID, bool f SaveManager::Instance->SaveStruct("trickName", [&]() { SaveManager::Instance->SaveData("english", randoContext->GetItemOverride(i).GetTrickName().GetEnglish()); + SaveManager::Instance->SaveData("german", + randoContext->GetItemOverride(i).GetTrickName().GetGerman()); SaveManager::Instance->SaveData("french", randoContext->GetItemOverride(i).GetTrickName().GetFrench()); - // TODO: German (trick names don't have german translations yet) }); } if (randoContext->GetItemLocation(i)->HasCustomPrice()) { From 3943242cb2e5ea8a351bd27478cb848abaf58e0d Mon Sep 17 00:00:00 2001 From: Sirius902 <10891979+Sirius902@users.noreply.github.com> Date: Thu, 19 Jun 2025 15:05:57 -0700 Subject: [PATCH 53/67] Dynamically construct weird frame data (#5195) --- .../N64WeirdFrames/N64WeirdFrames.cpp | 170 +++++ .../N64WeirdFrames/WeirdAnimation.cpp | 65 ++ .../N64WeirdFrames/WeirdAnimation.h | 43 ++ .../vanilla-behavior/GIVanillaBehavior.h | 12 + soh/soh/Enhancements/n64_weird_frame_data.inc | 658 ------------------ soh/soh/OTRGlobals.cpp | 6 - soh/soh/OTRGlobals.h | 1 - soh/soh/SohGui/SohMenuEnhancements.cpp | 3 +- soh/src/code/z_skelanime.c | 11 +- 9 files changed, 295 insertions(+), 674 deletions(-) create mode 100644 soh/soh/Enhancements/Restorations/N64WeirdFrames/N64WeirdFrames.cpp create mode 100644 soh/soh/Enhancements/Restorations/N64WeirdFrames/WeirdAnimation.cpp create mode 100644 soh/soh/Enhancements/Restorations/N64WeirdFrames/WeirdAnimation.h delete mode 100644 soh/soh/Enhancements/n64_weird_frame_data.inc diff --git a/soh/soh/Enhancements/Restorations/N64WeirdFrames/N64WeirdFrames.cpp b/soh/soh/Enhancements/Restorations/N64WeirdFrames/N64WeirdFrames.cpp new file mode 100644 index 000000000..0e6b1cbf3 --- /dev/null +++ b/soh/soh/Enhancements/Restorations/N64WeirdFrames/N64WeirdFrames.cpp @@ -0,0 +1,170 @@ +#include "public/bridge/consolevariablebridge.h" +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/ShipInit.hpp" + +#include +#include + +#include "WeirdAnimation.h" + +extern "C" { +#include "macros.h" +#include "z64player.h" + +#include "objects/gameplay_keep/gameplay_keep.h" + +int ResourceMgr_OTRSigCheck(char* imgData); +AnimationHeaderCommon* ResourceMgr_LoadAnimByName(const char* path); +} + +#define CVAR_NAME CVAR_ENHANCEMENT("N64WeirdFrames") +#define CVAR_DEFAULT 0 +#define CVAR_VALUE CVarGetInteger(CVAR_NAME, CVAR_DEFAULT) + +// A list of weird animations to contruct. These can either be an index out of bounds before +// the start of the animation or past the end of it. In either case you add a list of animations' +// data that are neighboring before or after the target animation. If more weird frame data is +// required then add more of the neighboring animations in ROM. +static std::vector weirdAnimations{ + // For weirdshots. + { gPlayerAnim_link_bow_side_walk, + PLAYER_LIMB_MAX, + IndexDirection::BACKWARD, + { + "__OTR__misc/link_animetion/gPlayerAnimData_0940E0", + "__OTR__misc/link_animetion/gPlayerAnimData_096370", + "__OTR__misc/link_animetion/gPlayerAnimData_096610", + "__OTR__misc/link_animetion/gPlayerAnimData_097650", + "__OTR__misc/link_animetion/gPlayerAnimData_097FC0", + } }, + // For weirdslides. + { gPlayerAnim_link_normal_side_walk, + PLAYER_LIMB_MAX, + IndexDirection::BACKWARD, + { + "__OTR__misc/link_animetion/gPlayerAnimData_1AFDD0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B0E10", + "__OTR__misc/link_animetion/gPlayerAnimData_1B1910", + "__OTR__misc/link_animetion/gPlayerAnimData_1B20F0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B25B0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B2B80", + "__OTR__misc/link_animetion/gPlayerAnimData_1B3600", + "__OTR__misc/link_animetion/gPlayerAnimData_1B4080", + "__OTR__misc/link_animetion/gPlayerAnimData_1B4B00", + "__OTR__misc/link_animetion/gPlayerAnimData_1B51D0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B5BD0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B6C10", + "__OTR__misc/link_animetion/gPlayerAnimData_1B72E0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B7B40", + } }, + // For weirdslides. + { gPlayerAnim_link_normal_side_walk, + PLAYER_LIMB_MAX, + IndexDirection::FORWARD, + { + "__OTR__misc/link_animetion/gPlayerAnimData_1B92D0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B9B30", + "__OTR__misc/link_animetion/gPlayerAnimData_1BA390", + "__OTR__misc/link_animetion/gPlayerAnimData_1BB2C0", + "__OTR__misc/link_animetion/gPlayerAnimData_1BC6B0", + "__OTR__misc/link_animetion/gPlayerAnimData_1BCA60", + "__OTR__misc/link_animetion/gPlayerAnimData_1BDC30", + "__OTR__misc/link_animetion/gPlayerAnimData_1BE410", + "__OTR__misc/link_animetion/gPlayerAnimData_1BF6F0", + "__OTR__misc/link_animetion/gPlayerAnimData_1C01F0", + "__OTR__misc/link_animetion/gPlayerAnimData_1C0CF0", + "__OTR__misc/link_animetion/gPlayerAnimData_1C1230", + } }, + // For weirdslides. + { gPlayerAnim_link_normal_side_walk_free, + PLAYER_LIMB_MAX, + IndexDirection::BACKWARD, + { + "__OTR__misc/link_animetion/gPlayerAnimData_1B1910", + "__OTR__misc/link_animetion/gPlayerAnimData_1B20F0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B25B0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B2B80", + "__OTR__misc/link_animetion/gPlayerAnimData_1B3600", + "__OTR__misc/link_animetion/gPlayerAnimData_1B4080", + "__OTR__misc/link_animetion/gPlayerAnimData_1B4B00", + "__OTR__misc/link_animetion/gPlayerAnimData_1B51D0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B5BD0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B6C10", + "__OTR__misc/link_animetion/gPlayerAnimData_1B72E0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B7B40", + "__OTR__misc/link_animetion/gPlayerAnimData_1B83A0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B92D0", + "__OTR__misc/link_animetion/gPlayerAnimData_1B9B30", + } }, + // For weirdslides. + { gPlayerAnim_link_normal_side_walk_free, + PLAYER_LIMB_MAX, + IndexDirection::FORWARD, + { + "__OTR__misc/link_animetion/gPlayerAnimData_1BB2C0", + "__OTR__misc/link_animetion/gPlayerAnimData_1BC6B0", + "__OTR__misc/link_animetion/gPlayerAnimData_1BCA60", + "__OTR__misc/link_animetion/gPlayerAnimData_1BDC30", + "__OTR__misc/link_animetion/gPlayerAnimData_1BE410", + "__OTR__misc/link_animetion/gPlayerAnimData_1BF6F0", + "__OTR__misc/link_animetion/gPlayerAnimData_1C01F0", + "__OTR__misc/link_animetion/gPlayerAnimData_1C0CF0", + "__OTR__misc/link_animetion/gPlayerAnimData_1C1230", + "__OTR__misc/link_animetion/gPlayerAnimData_1C1C30", + "__OTR__misc/link_animetion/gPlayerAnimData_1C2630", + } }, +}; + +void RegisterN64WeirdFrames() { + COND_VB_SHOULD(VB_LOAD_PLAYER_ANIMATION_FRAME, CVAR_VALUE, { + const auto entry = va_arg(args, AnimationEntry*); + if (entry == nullptr) { + return; + } + + auto animation = va_arg(args, LinkAnimationHeader*); + auto frame = va_arg(args, s32); + const auto limbCount = va_arg(args, s32); + const auto frameTable = va_arg(args, Vec3s*); + + std::optional animationName; + + if (ResourceMgr_OTRSigCheck(reinterpret_cast(animation)) != 0) { + animationName = reinterpret_cast(animation); + animation = reinterpret_cast(ResourceMgr_LoadAnimByName(*animationName)); + } + + const auto playerAnimHeader = + static_cast(SEGMENTED_TO_VIRTUAL(static_cast(animation))); + + if (frame < 0 || frame >= playerAnimHeader->common.frameCount) { + const auto direction = frame < 0 ? IndexDirection::BACKWARD : IndexDirection::FORWARD; + + if (animationName.has_value()) { + for (auto& weirdAnimation : weirdAnimations) { + if (weirdAnimation.GetDirection() == direction && + weirdAnimation.GetTargetAnimation() == *animationName) { + if (const auto frameData = weirdAnimation.GetFrame(frame, playerAnimHeader->common.frameCount); + frameData != nullptr) { + *should = false; + + SPDLOG_DEBUG("Weird animation for \"{}\": frame {}", weirdAnimation.GetTargetAnimation(), + frame); + std::memcpy(frameTable, frameData, sizeof(Vec3s) * limbCount + sizeof(s16)); + } else { + SPDLOG_WARN("Weird Frame {} not included in weird animation for \"{}\"", frame, + weirdAnimation.GetTargetAnimation()); + } + + return; + } + } + } + + SPDLOG_WARN("Weird Animation not present for \"{}\" but frame {} is out of bounds", + animationName.has_value() ? *animationName : "", frame); + } + }); +} + +static RegisterShipInitFunc initFunc(RegisterN64WeirdFrames, { CVAR_NAME }); diff --git a/soh/soh/Enhancements/Restorations/N64WeirdFrames/WeirdAnimation.cpp b/soh/soh/Enhancements/Restorations/N64WeirdFrames/WeirdAnimation.cpp new file mode 100644 index 000000000..bd812c658 --- /dev/null +++ b/soh/soh/Enhancements/Restorations/N64WeirdFrames/WeirdAnimation.cpp @@ -0,0 +1,65 @@ +#include "WeirdAnimation.h" + +#include "resource/ResourceManager.h" +#include "Context.h" + +#include +#include +#include + +extern "C" { +#include "z64math.h" +} + +const void* WeirdAnimation::GetFrame(s32 frame, s32 targetAnimationFrameCount) { + if (!animationData.has_value()) { + Build(); + } + + if (direction == IndexDirection::BACKWARD) { + const auto frameData = std::end(*animationData) + (((sizeof(Vec3s) * limbCount + sizeof(s16)) * frame)); + + return frameData >= std::begin(*animationData) ? &*frameData : nullptr; + } else if (direction == IndexDirection::FORWARD) { + const auto frameData = std::begin(*animationData) + + (((sizeof(Vec3s) * limbCount + sizeof(s16)) * (frame - targetAnimationFrameCount))); + + return frameData < std::end(*animationData) ? &*frameData : nullptr; + } else { + SPDLOG_ERROR("Expected valid IndexDirection, got: {}", static_cast(direction)); + assert(false); + return nullptr; + } +} + +void WeirdAnimation::Build() { + auto& animation = animationData.emplace(); + + for (const auto& neighborName : neighborAnimations) { + const auto neighbor = Ship::Context::GetInstance()->GetResourceManager()->LoadResource(neighborName); + + const auto prevSize = animation.size(); + animation.resize(prevSize + neighbor->GetPointerSize()); + std::memcpy(animation.data() + prevSize, neighbor->GetRawPointer(), neighbor->GetPointerSize()); + + // Animation data in ROM is padded to 0x10 bytes. Align the buffer the same way. + animation.resize((animation.size() + 0xF) & ~0xF); + } + + const auto frameCount = animation.size() / (sizeof(Vec3s) * limbCount + sizeof(s16)); + const auto directionStr = [this] { + switch (direction) { + case IndexDirection::BACKWARD: + return "backward"; + case IndexDirection::FORWARD: + return "forward"; + default: + SPDLOG_ERROR("Expected valid IndexDirection, got: {}", static_cast(direction)); + assert(false); + return "???"; + } + }(); + + SPDLOG_DEBUG("Weird animation built for \"{}\": frameCount = {}, direction = {}", targetAnimation, frameCount, + directionStr); +} diff --git a/soh/soh/Enhancements/Restorations/N64WeirdFrames/WeirdAnimation.h b/soh/soh/Enhancements/Restorations/N64WeirdFrames/WeirdAnimation.h new file mode 100644 index 000000000..e8c353720 --- /dev/null +++ b/soh/soh/Enhancements/Restorations/N64WeirdFrames/WeirdAnimation.h @@ -0,0 +1,43 @@ +#pragma once + +#include + +#include +#include +#include +#include +#include + +enum class IndexDirection { + BACKWARD, + FORWARD, +}; + +class WeirdAnimation { + public: + WeirdAnimation(std::string targetAnimation, s32 limbCount, IndexDirection direction, + std::vector neighborAnimations) + : targetAnimation(std::move(targetAnimation)), limbCount(limbCount), direction(direction), + neighborAnimations(std::move(neighborAnimations)) { + } + + const std::string& GetTargetAnimation() { + return targetAnimation; + } + + IndexDirection GetDirection() { + return direction; + } + + const void* GetFrame(s32 frame, s32 targetAnimationFrameCount); + + private: + std::string targetAnimation; + s32 limbCount; + IndexDirection direction; + std::vector neighborAnimations; + + std::optional> animationData; + + void Build(); +}; diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index 973c10b17..c561a0dfe 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -2170,6 +2170,18 @@ typedef enum { // #### `args` // - `*EnRr` VB_LIKE_LIKE_GRAB_PLAYER, + + // #### `result` + // ```c + // entry != NULL + // ``` + // #### `args` + // - `*AnimationEntry` + // - `*LinkAnimationHeader` + // - `s32` frame + // - `s32` limbCount + // - `*Vec3s` frameTable + VB_LOAD_PLAYER_ANIMATION_FRAME, } GIVanillaBehavior; #endif diff --git a/soh/soh/Enhancements/n64_weird_frame_data.inc b/soh/soh/Enhancements/n64_weird_frame_data.inc deleted file mode 100644 index 269450c15..000000000 --- a/soh/soh/Enhancements/n64_weird_frame_data.inc +++ /dev/null @@ -1,658 +0,0 @@ -static u16 n64WeirdFrames[] = { - 0x0000, 0x0000, 0x1F40, 0x0AA7, 0x06C8, 0xB3C8, 0xF909, 0xFA3E, 0xED5F, - 0x0000, 0x0000, 0x2286, 0xF8F0, 0xF9C3, 0xB101, 0x61C2, 0xFE1D, 0x3AB1, - 0xFA11, 0x1FD2, 0x35C8, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, - 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, - 0xD928, 0x1D25, 0x3871, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, - 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFC7, 0x0D27, - 0xFCAD, 0x0000, 0x0000, 0x0000, 0x9598, 0x02DF, 0xBFFD, 0x0000, 0x0000, - 0x0000, 0xFF70, 0x0F7C, 0xF0FD, 0x0000, 0x0000, 0x1F19, 0x0AAC, 0x06BF, - 0xB3E9, 0xF906, 0xFA42, 0xED71, 0x0000, 0x0000, 0x2260, 0xF8EC, 0xF9C8, - 0xB11B, 0x61C2, 0xFE1D, 0x3AB1, 0xF9FD, 0x1FCF, 0x35AC, 0x0000, 0x0000, - 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, - 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD928, 0x1D25, 0x3871, 0x0000, 0x0000, - 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, - 0x0000, 0x0000, 0xFFC7, 0x0D29, 0xFCAD, 0x0000, 0x0000, 0x0000, 0x9598, - 0x02DF, 0xBFFD, 0x0000, 0x0000, 0x0000, 0xFF7B, 0x0F7B, 0xF111, 0x0000, - 0x0000, 0x1EF3, 0x0AB2, 0x06B7, 0xB409, 0xF902, 0xFA45, 0xED83, 0x0000, - 0x0000, 0x223B, 0xF8E8, 0xF9CC, 0xB133, 0x61C2, 0xFE1D, 0x3AB1, 0xF9EA, - 0x1FCD, 0x3590, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, - 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD928, - 0x1D25, 0x3871, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC000, - 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFC7, 0x0D2B, 0xFCAD, - 0x0000, 0x0000, 0x0000, 0x9598, 0x02DF, 0xBFFD, 0x0000, 0x0000, 0x0000, - 0xFF86, 0x0F7A, 0xF125, 0x0000, 0x0000, 0x1ECE, 0x0AB7, 0x06AF, 0xB428, - 0xF8FF, 0xFA49, 0xED95, 0x0000, 0x0000, 0x2218, 0xF8E4, 0xF9D0, 0xB14B, - 0x61C2, 0xFE1D, 0x3AB1, 0xF9D7, 0x1FCA, 0x3576, 0x0000, 0x0000, 0x4DBE, - 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, - 0xF8A1, 0x8BC0, 0xD4DA, 0xD928, 0x1D25, 0x3871, 0x0000, 0x0000, 0x0000, - 0xFB23, 0x0547, 0xC9CE, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, - 0x0000, 0xFFC7, 0x0D2D, 0xFCAD, 0x0000, 0x0000, 0x0000, 0x9598, 0x02DE, - 0xBFFD, 0x0000, 0x0000, 0x0000, 0xFF90, 0x0F78, 0xF137, 0x0000, 0x0000, - 0x1EAA, 0x0ABC, 0x06A7, 0xB446, 0xF8FC, 0xFA4D, 0xEDA6, 0x0000, 0x0000, - 0x21F6, 0xF8E1, 0xF9D4, 0xB161, 0x61C2, 0xFE1D, 0x3AB1, 0xF9C6, 0x1FC8, - 0x355D, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, - 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD928, 0x1D25, - 0x3871, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC000, 0x6A68, - 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFC7, 0x0D2E, 0xFCAD, 0x0000, - 0x0000, 0x0000, 0x9598, 0x02DE, 0xBFFD, 0x0000, 0x0000, 0x0000, 0xFF9A, - 0x0F77, 0xF149, 0x0000, 0x0000, 0x1E89, 0x0AC1, 0x06A0, 0xB462, 0xF8F9, - 0xFA50, 0xEDB5, 0x0000, 0x0000, 0x21D6, 0xF8DE, 0xF9D7, 0xB177, 0x61C2, - 0xFE1D, 0x3AB1, 0xF9B5, 0x1FC5, 0x3545, 0x0000, 0x0000, 0x4DBE, 0x0000, - 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, - 0x8BC0, 0xD4DA, 0xD928, 0x1D25, 0x3871, 0x0000, 0x0000, 0x0000, 0xFB23, - 0x0547, 0xC9CE, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, - 0xFFC7, 0x0D30, 0xFCAD, 0x0000, 0x0000, 0x0000, 0x9598, 0x02DE, 0xBFFD, - 0x0000, 0x0000, 0x0000, 0xFFA3, 0x0F76, 0xF159, 0x0000, 0x0000, 0x1E6A, - 0x0AC5, 0x0699, 0xB47B, 0xF8F6, 0xFA53, 0xEDC4, 0x0000, 0x0000, 0x21B9, - 0xF8DB, 0xF9DB, 0xB18A, 0x61C2, 0xFE1D, 0x3AB1, 0xF9A6, 0x1FC3, 0x352F, - 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, - 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD928, 0x1D25, 0x3871, - 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC000, 0x6A68, 0xFD26, - 0x0000, 0x0000, 0x0000, 0x0000, 0xFFC7, 0x0D31, 0xFCAD, 0x0000, 0x0000, - 0x0000, 0x9598, 0x02DE, 0xBFFD, 0x0000, 0x0000, 0x0000, 0xFFAB, 0x0F75, - 0xF168, 0x0000, 0x0000, 0x1E4D, 0x0AC9, 0x0693, 0xB493, 0xF8F4, 0xFA56, - 0xEDD1, 0x0000, 0x0000, 0x219D, 0xF8D8, 0xF9DE, 0xB19C, 0x61C2, 0xFE1D, - 0x3AB1, 0xF998, 0x1FC1, 0x351B, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, - 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, - 0xD4DA, 0xD928, 0x1D25, 0x3871, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, - 0xC9CE, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFC7, - 0x0D32, 0xFCAD, 0x0000, 0x0000, 0x0000, 0x9598, 0x02DE, 0xBFFD, 0x0000, - 0x0000, 0x0000, 0xFFB3, 0x0F75, 0xF176, 0x0000, 0x0000, 0x1E33, 0x0ACC, - 0x068E, 0xB4A8, 0xF8F1, 0xFA58, 0xEDDE, 0x0000, 0x0000, 0x2185, 0xF8D5, - 0xF9E1, 0xB1AC, 0x61C2, 0xFE1D, 0x3AB1, 0xF98B, 0x1FBF, 0x3509, 0x0000, - 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, - 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD928, 0x1D25, 0x3871, 0x0000, - 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC000, 0x6A68, 0xFD26, 0x0000, - 0x0000, 0x0000, 0x0000, 0xFFC7, 0x0D33, 0xFCAD, 0x0000, 0x0000, 0x0000, - 0x9598, 0x02DE, 0xBFFD, 0x0000, 0x0000, 0x0000, 0xFFB9, 0x0F74, 0xF182, - 0x0000, 0x0000, 0x1E1C, 0x0AD0, 0x0689, 0xB4BB, 0xF8F0, 0xFA5A, 0xEDE8, - 0x0000, 0x0000, 0x216F, 0xF8D3, 0xF9E3, 0xB1BB, 0x61C2, 0xFE1D, 0x3AB1, - 0xF980, 0x1FBE, 0x34FA, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, - 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, - 0xD928, 0x1D25, 0x3871, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, - 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFC7, 0x0D34, - 0xFCAD, 0x0000, 0x0000, 0x0000, 0x9598, 0x02DE, 0xBFFD, 0x0000, 0x0000, - 0x0000, 0xFFBF, 0x0F73, 0xF18C, 0x0000, 0x0000, 0x1E09, 0x0AD2, 0x0685, - 0xB4CA, 0xF8EE, 0xFA5C, 0xEDF1, 0x0000, 0x0000, 0x215D, 0xF8D1, 0xF9E5, - 0xB1C7, 0x61C2, 0xFE1D, 0x3AB1, 0xF977, 0x1FBD, 0x34EC, 0x0000, 0x0000, - 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, - 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD928, 0x1D25, 0x3871, 0x0000, 0x0000, - 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, - 0x0000, 0x0000, 0xFFC7, 0x0D35, 0xFCAD, 0x0000, 0x0000, 0x0000, 0x9598, - 0x02DE, 0xBFFD, 0x0000, 0x0000, 0x0000, 0xFFC3, 0x0F73, 0xF194, 0x0000, - 0x0000, 0x1DF9, 0x0AD4, 0x0681, 0xB4D7, 0xF8ED, 0xFA5E, 0xEDF9, 0x0000, - 0x0000, 0x214E, 0xF8D0, 0xF9E7, 0xB1D0, 0x61C2, 0xFE1D, 0x3AB1, 0xF96F, - 0x1FBC, 0x34E2, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, - 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD928, - 0x1D25, 0x3871, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC000, - 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFC7, 0x0D35, 0xFCAD, - 0x0000, 0x0000, 0x0000, 0x9598, 0x02DE, 0xBFFD, 0x0000, 0x0000, 0x0000, - 0xFFC6, 0x0F72, 0xF19A, 0x0000, 0x0000, 0x1DEE, 0x0AD6, 0x067F, 0xB4E0, - 0xF8EC, 0xFA5F, 0xEDFE, 0x0000, 0x0000, 0x2143, 0xF8CF, 0xF9E8, 0xB1D7, - 0x61C2, 0xFE1D, 0x3AB1, 0xF96A, 0x1FBB, 0x34DA, 0x0000, 0x0000, 0x4DBE, - 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, - 0xF8A1, 0x8BC0, 0xD4DA, 0xD928, 0x1D25, 0x3871, 0x0000, 0x0000, 0x0000, - 0xFB23, 0x0547, 0xC9CE, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, - 0x0000, 0xFFC7, 0x0D36, 0xFCAD, 0x0000, 0x0000, 0x0000, 0x9598, 0x02DE, - 0xBFFD, 0x0000, 0x0000, 0x0000, 0xFFC8, 0x0F72, 0xF19E, 0x0000, 0x0000, - 0x1DE7, 0x0AD7, 0x067D, 0xB4E6, 0xF8EB, 0xFA60, 0xEE01, 0x0000, 0x0000, - 0x213C, 0xF8CE, 0xF9E9, 0xB1DC, 0x61C2, 0xFE1D, 0x3AB1, 0xF966, 0x1FBA, - 0x34D5, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, - 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD928, 0x1D25, - 0x3871, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC000, 0x6A68, - 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFC7, 0x0D36, 0xFCAD, 0x0000, - 0x0000, 0x0000, 0x9598, 0x02DE, 0xBFFD, 0x0000, 0x0000, 0x0000, 0xFFC9, - 0x0F72, 0xF19F, 0x0000, 0x0000, 0x1DE5, 0x0AD7, 0x067D, 0xB4E8, 0xF8EB, - 0xFA60, 0xEE02, 0x0000, 0x0000, 0x213A, 0xF8CE, 0xF9E9, 0xB1DD, 0x61C2, - 0xFE1D, 0x3AB1, 0xF965, 0x1FBA, 0x34D3, 0x0000, 0x0000, 0x4DBE, 0x0000, - 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, - 0x8BC0, 0xD4DA, 0xD928, 0x1D25, 0x3871, 0x0000, 0x0000, 0x0000, 0xFB23, - 0x0547, 0xC9CE, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0xFFC7, 0x0D31, 0x0000, 0x0000, 0x0000, 0x0000, 0xC000, - 0x02DA, 0xC000, 0x0000, 0x0000, 0x0000, 0x04D3, 0x0A4F, 0xEE9D, 0x0000, - 0x0000, 0x2006, 0x0843, 0x075F, 0xB0BC, 0xF9A0, 0xF456, 0xEDD8, 0x0000, - 0x0000, 0x2087, 0xF851, 0xF9F1, 0xB1DE, 0x4000, 0xF709, 0x4000, 0xFFE8, - 0xFE51, 0x34DC, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x0931, - 0xEDA0, 0x7893, 0x0000, 0x0000, 0xE5ED, 0xFFDC, 0xFE09, 0xC0D5, 0xFCE7, - 0x136D, 0x8A32, 0x0000, 0x0000, 0xA937, 0x0F64, 0x0AF3, 0xBE0C, 0xC000, - 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFFBB, 0x0C34, 0xFFB9, - 0x0000, 0x0000, 0x0000, 0xBF85, 0xFE57, 0xBFF8, 0x0000, 0x0000, 0x0000, - 0x051E, 0x0D98, 0xEA86, 0x0000, 0x0000, 0x3174, 0x0986, 0x09AB, 0xA6B2, - 0xFF8B, 0xF0C4, 0xEC66, 0x0000, 0x0000, 0x3A30, 0xF5E6, 0xF97D, 0xB12A, - 0x436E, 0xF3CA, 0x4025, 0xFEC7, 0x01A9, 0x3349, 0x0000, 0x0000, 0x4DBE, - 0x0000, 0x0000, 0x0000, 0x0F19, 0xEF22, 0x7252, 0x0000, 0x0000, 0xE073, - 0xFFF5, 0x006B, 0xC0AE, 0xF1CB, 0x13A2, 0x7CCB, 0x0000, 0x0000, 0xAE44, - 0x0DD9, 0x0B72, 0xC3AA, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, - 0x0000, 0xFFA2, 0x0A07, 0xFF1C, 0x0000, 0x0000, 0x0000, 0xB6A0, 0xF8C4, - 0xC0B4, 0x0000, 0x0000, 0x0000, 0x046F, 0x14CD, 0xE515, 0x0000, 0x0000, - 0x4B1D, 0x0BDC, 0x0C10, 0x9B28, 0x0FD5, 0xEB60, 0xF04B, 0x0000, 0x0000, - 0x4FC3, 0xF095, 0xF87E, 0xAF9D, 0x4AE1, 0xECA4, 0x4080, 0xFC4F, 0x08DD, - 0x2FCF, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x1BF1, 0xF27E, - 0x64A8, 0x0000, 0x0000, 0xD467, 0x002E, 0x05AA, 0xC058, 0xD95B, 0x1417, - 0x5F4D, 0x0000, 0x0000, 0xB961, 0x0A76, 0x0C88, 0xD006, 0xC000, 0x6A68, - 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF89, 0x07DA, 0xFE80, 0x0000, - 0x0000, 0x0000, 0xAA24, 0xFF0F, 0xC009, 0x0000, 0x0000, 0x0000, 0xF90E, - 0x1CAF, 0xCEFB, 0x0000, 0x0000, 0x5FFB, 0x0F61, 0x0A4A, 0x9E40, 0x2190, - 0xE393, 0xD7FA, 0x0000, 0x0000, 0x5421, 0xEB43, 0xF77F, 0xAE10, 0x522D, - 0xE580, 0x40F1, 0xF9E3, 0x0FAD, 0x2C50, 0x0000, 0x0000, 0x4DBE, 0x0000, - 0x0000, 0x0000, 0x286A, 0xF5F1, 0x573B, 0x0000, 0x0000, 0xC85C, 0x0066, - 0x0AE9, 0xC002, 0xC0EB, 0x148C, 0x41D0, 0x0000, 0x0000, 0xC47E, 0x0713, - 0x0D9E, 0xDC63, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, - 0xFF7E, 0x06DC, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, - 0x0000, 0x0000, 0x0000, 0xE8F1, 0x1A2A, 0xB8CB, 0x0000, 0x0000, 0x67A9, - 0x11B0, 0x083F, 0xA3A1, 0x232F, 0xE24B, 0xC7CF, 0x0000, 0x0000, 0x5267, - 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xF8E4, 0x11DB, 0x2AAB, - 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, - 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, - 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x06DC, 0xFE38, 0x0000, - 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xE8F1, - 0x1A2A, 0xB8CB, 0x0000, 0x0000, 0x67A9, 0x11B0, 0x083F, 0xA3A1, 0x232F, - 0xE24B, 0xC7CF, 0x0000, 0x0000, 0x5267, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, - 0xE241, 0x4131, 0xF8E4, 0x183F, 0x2AAB, 0x0000, 0x0000, 0x4DBE, 0x0000, - 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, - 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, - 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, - 0xFF7E, 0x06E3, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, - 0x0000, 0x0000, 0x0000, 0xE93D, 0x1A35, 0xB905, 0x0000, 0x0000, 0x677C, - 0x11B0, 0x083F, 0xA3A1, 0x22F0, 0xE251, 0xC7F9, 0x0000, 0x0000, 0x524A, - 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xF910, 0x1848, 0x2AF9, - 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, - 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, - 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, - 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x06E9, 0xFE38, 0x0000, 0x0000, - 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xE987, 0x1A40, - 0xB93F, 0x0000, 0x0000, 0x674F, 0x11B0, 0x083F, 0xA3A1, 0x22B2, 0xE256, - 0xC823, 0x0000, 0x0000, 0x522C, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, - 0x4131, 0xF93C, 0x1851, 0x2B47, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, - 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, - 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, - 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, - 0x06F0, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, - 0x0000, 0x0000, 0xE9D2, 0x1A4A, 0xB978, 0x0000, 0x0000, 0x6721, 0x11B0, - 0x083F, 0xA3A1, 0x2275, 0xE25B, 0xC84D, 0x0000, 0x0000, 0x520E, 0xE8D8, - 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xF969, 0x185A, 0x2B96, 0x0000, - 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, - 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, - 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, - 0x0000, 0x0000, 0x0000, 0xFF7E, 0x06F6, 0xFE38, 0x0000, 0x0000, 0x0000, - 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xEA1B, 0x1A54, 0xB9B1, - 0x0000, 0x0000, 0x66F4, 0x11B0, 0x083F, 0xA3A1, 0x2237, 0xE261, 0xC876, - 0x0000, 0x0000, 0x51F0, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, - 0xF995, 0x1863, 0x2BE4, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, - 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, - 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, - 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x06FD, - 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, - 0x0000, 0xEA64, 0x1A5E, 0xB9EA, 0x0000, 0x0000, 0x66C6, 0x11B0, 0x083F, - 0xA3A1, 0x21FA, 0xE266, 0xC8A0, 0x0000, 0x0000, 0x51D1, 0xE8D8, 0xF70B, - 0xAD5B, 0x556C, 0xE241, 0x4131, 0xF9C2, 0x186D, 0x2C32, 0x0000, 0x0000, - 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, - 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, - 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, - 0x0000, 0x0000, 0xFF7E, 0x0703, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, - 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xEAAC, 0x1A68, 0xBA22, 0x0000, - 0x0000, 0x6698, 0x11B0, 0x083F, 0xA3A1, 0x21BD, 0xE26C, 0xC8C9, 0x0000, - 0x0000, 0x51B2, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xF9EE, - 0x1876, 0x2C81, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, - 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, - 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, - 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x070A, 0xFE38, - 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, - 0xEAF4, 0x1A71, 0xBA5B, 0x0000, 0x0000, 0x6669, 0x11B0, 0x083F, 0xA3A1, - 0x2180, 0xE271, 0xC8F3, 0x0000, 0x0000, 0x5193, 0xE8D8, 0xF70B, 0xAD5B, - 0x556C, 0xE241, 0x4131, 0xFA1A, 0x187F, 0x2CCF, 0x0000, 0x0000, 0x4DBE, - 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, - 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, - 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, - 0x0000, 0xFF7E, 0x0710, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, - 0xBDD2, 0x0000, 0x0000, 0x0000, 0xEB3B, 0x1A7B, 0xBA93, 0x0000, 0x0000, - 0x663B, 0x11B0, 0x083F, 0xA3A1, 0x2144, 0xE277, 0xC91C, 0x0000, 0x0000, - 0x5174, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xFA47, 0x1888, - 0x2D1D, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, - 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, - 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, - 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x0717, 0xFE38, 0x0000, - 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xEB81, - 0x1A83, 0xBACA, 0x0000, 0x0000, 0x660C, 0x11B0, 0x083F, 0xA3A1, 0x2107, - 0xE27C, 0xC945, 0x0000, 0x0000, 0x5154, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, - 0xE241, 0x4131, 0xFA73, 0x1891, 0x2D6C, 0x0000, 0x0000, 0x4DBE, 0x0000, - 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, - 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, - 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, - 0xFF7E, 0x071D, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, - 0x0000, 0x0000, 0x0000, 0xEBC7, 0x1A8C, 0xBB02, 0x0000, 0x0000, 0x65DD, - 0x11B0, 0x083F, 0xA3A1, 0x20CB, 0xE282, 0xC96E, 0x0000, 0x0000, 0x5134, - 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xFAA0, 0x189A, 0x2DBA, - 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, - 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, - 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, - 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x0724, 0xFE38, 0x0000, 0x0000, - 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xEC0D, 0x1A95, - 0xBB3A, 0x0000, 0x0000, 0x65AF, 0x11B0, 0x083F, 0xA3A1, 0x2090, 0xE287, - 0xC997, 0x0000, 0x0000, 0x5114, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, - 0x4131, 0xFACC, 0x18A3, 0x2E08, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, - 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, - 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, - 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, - 0x072A, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, - 0x0000, 0x0000, 0xEC51, 0x1A9D, 0xBB71, 0x0000, 0x0000, 0x657F, 0x11B0, - 0x083F, 0xA3A1, 0x2054, 0xE28D, 0xC9C0, 0x0000, 0x0000, 0x50F4, 0xE8D8, - 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xFAF8, 0x18AD, 0x2E57, 0x0000, - 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, - 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, - 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, - 0x0000, 0x0000, 0x0000, 0xFF7E, 0x0731, 0xFE38, 0x0000, 0x0000, 0x0000, - 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xEC95, 0x1AA5, 0xBBA8, - 0x0000, 0x0000, 0x6550, 0x11B0, 0x083F, 0xA3A1, 0x2019, 0xE293, 0xC9E9, - 0x0000, 0x0000, 0x50D4, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, - 0xFB25, 0x18B6, 0x2EA5, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, - 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, - 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, - 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x0737, - 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, - 0x0000, 0xECD9, 0x1AAD, 0xBBDF, 0x0000, 0x0000, 0x6521, 0x11B0, 0x083F, - 0xA3A1, 0x1FDE, 0xE298, 0xCA12, 0x0000, 0x0000, 0x50B3, 0xE8D8, 0xF70B, - 0xAD5B, 0x556C, 0xE241, 0x4131, 0xFB51, 0x18BF, 0x2EF3, 0x0000, 0x0000, - 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, - 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, - 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, - 0x0000, 0x0000, 0xFF7E, 0x0732, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, - 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xEC9E, 0x1AA6, 0xBBAF, 0x0000, - 0x0000, 0x654A, 0x11B0, 0x083F, 0xA3A1, 0x2011, 0xE293, 0xC9EE, 0x0000, - 0x0000, 0x50D0, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xFB7E, - 0x18C8, 0x2F42, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, - 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, - 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, - 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x072C, 0xFE38, - 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, - 0xEC62, 0x1A9F, 0xBB7F, 0x0000, 0x0000, 0x6574, 0x11B0, 0x083F, 0xA3A1, - 0x2045, 0xE28E, 0xC9CA, 0x0000, 0x0000, 0x50EC, 0xE8D8, 0xF70B, 0xAD5B, - 0x556C, 0xE241, 0x4131, 0xFBAA, 0x18D1, 0x2F90, 0x0000, 0x0000, 0x4DBE, - 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, - 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, - 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, - 0x0000, 0xFF7E, 0x0726, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, - 0xBDD2, 0x0000, 0x0000, 0x0000, 0xEC26, 0x1A98, 0xBB4E, 0x0000, 0x0000, - 0x659D, 0x11B0, 0x083F, 0xA3A1, 0x2079, 0xE289, 0xC9A7, 0x0000, 0x0000, - 0x5108, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xFBA0, 0x18CF, - 0x2F7E, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, - 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, - 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, - 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x0721, 0xFE38, 0x0000, - 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xEBEA, - 0x1A90, 0xBB1E, 0x0000, 0x0000, 0x65C6, 0x11B0, 0x083F, 0xA3A1, 0x20AD, - 0xE284, 0xC983, 0x0000, 0x0000, 0x5125, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, - 0xE241, 0x4131, 0xFB83, 0x18C9, 0x2F4B, 0x0000, 0x0000, 0x4DBE, 0x0000, - 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, - 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, - 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, - 0xFF7E, 0x071B, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, - 0x0000, 0x0000, 0x0000, 0xEBAD, 0x1A89, 0xBAED, 0x0000, 0x0000, 0x65EF, - 0x11B0, 0x083F, 0xA3A1, 0x20E2, 0xE280, 0xC95F, 0x0000, 0x0000, 0x5140, - 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xFB56, 0x18C0, 0x2EFC, - 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, - 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, - 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, - 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x0715, 0xFE38, 0x0000, 0x0000, - 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xEB70, 0x1A81, - 0xBABD, 0x0000, 0x0000, 0x6618, 0x11B0, 0x083F, 0xA3A1, 0x2117, 0xE27B, - 0xC93B, 0x0000, 0x0000, 0x515C, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, - 0x4131, 0xFB1D, 0x18B4, 0x2E98, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, - 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, - 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, - 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, - 0x0710, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, - 0x0000, 0x0000, 0xEB32, 0x1A79, 0xBA8C, 0x0000, 0x0000, 0x6641, 0x11B0, - 0x083F, 0xA3A1, 0x214B, 0xE276, 0xC917, 0x0000, 0x0000, 0x5178, 0xE8D8, - 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xFADB, 0x18A7, 0x2E23, 0x0000, - 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, - 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, - 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, - 0x0000, 0x0000, 0x0000, 0xFF7E, 0x070A, 0xFE38, 0x0000, 0x0000, 0x0000, - 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xEAF4, 0x1A71, 0xBA5B, - 0x0000, 0x0000, 0x6669, 0x11B0, 0x083F, 0xA3A1, 0x2180, 0xE271, 0xC8F3, - 0x0000, 0x0000, 0x5193, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, - 0xFA92, 0x1898, 0x2DA3, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, - 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, - 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, - 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x0704, - 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, - 0x0000, 0xEAB5, 0x1A69, 0xBA29, 0x0000, 0x0000, 0x6692, 0x11B0, 0x083F, - 0xA3A1, 0x21B5, 0xE26C, 0xC8CE, 0x0000, 0x0000, 0x51AE, 0xE8D8, 0xF70B, - 0xAD5B, 0x556C, 0xE241, 0x4131, 0xFA47, 0x1888, 0x2D1D, 0x0000, 0x0000, - 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, - 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, - 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, - 0x0000, 0x0000, 0xFF7E, 0x06FF, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, - 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xEA76, 0x1A61, 0xB9F8, 0x0000, - 0x0000, 0x66BA, 0x11B0, 0x083F, 0xA3A1, 0x21EB, 0xE268, 0xC8AA, 0x0000, - 0x0000, 0x51C9, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xF9FB, - 0x1878, 0x2C98, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, - 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, - 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, - 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x06F9, 0xFE38, - 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, - 0xEA36, 0x1A58, 0xB9C6, 0x0000, 0x0000, 0x66E2, 0x11B0, 0x083F, 0xA3A1, - 0x2220, 0xE263, 0xC886, 0x0000, 0x0000, 0x51E4, 0xE8D8, 0xF70B, 0xAD5B, - 0x556C, 0xE241, 0x4131, 0xF9B3, 0x186A, 0x2C18, 0x0000, 0x0000, 0x4DBE, - 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, - 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, - 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, - 0x0000, 0xFF7E, 0x06F3, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, - 0xBDD2, 0x0000, 0x0000, 0x0000, 0xE9F6, 0x1A4F, 0xB994, 0x0000, 0x0000, - 0x670A, 0x11B0, 0x083F, 0xA3A1, 0x2256, 0xE25E, 0xC862, 0x0000, 0x0000, - 0x51FF, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xF970, 0x185C, - 0x2BA3, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, - 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, - 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, - 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x06EE, 0xFE38, 0x0000, - 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xE9B6, - 0x1A46, 0xB962, 0x0000, 0x0000, 0x6732, 0x11B0, 0x083F, 0xA3A1, 0x228C, - 0xE259, 0xC83D, 0x0000, 0x0000, 0x5219, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, - 0xE241, 0x4131, 0xF937, 0x1850, 0x2B3F, 0x0000, 0x0000, 0x4DBE, 0x0000, - 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, - 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, - 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, - 0xFF7E, 0x06E8, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, - 0x0000, 0x0000, 0x0000, 0xE975, 0x1A3D, 0xB930, 0x0000, 0x0000, 0x675A, - 0x11B0, 0x083F, 0xA3A1, 0x22C2, 0xE255, 0xC819, 0x0000, 0x0000, 0x5233, - 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xF90B, 0x1847, 0x2AF0, - 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, - 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, - 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, - 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, 0x06E2, 0xFE38, 0x0000, 0x0000, - 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, 0x0000, 0x0000, 0xE933, 0x1A34, - 0xB8FE, 0x0000, 0x0000, 0x6782, 0x11B0, 0x083F, 0xA3A1, 0x22F8, 0xE250, - 0xC7F4, 0x0000, 0x0000, 0x524D, 0xE8D8, 0xF70B, 0xAD5B, 0x556C, 0xE241, - 0x4131, 0xF8EE, 0x1841, 0x2ABD, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, - 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, 0x0000, 0xC2E2, 0x0080, 0x0D4B, - 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, 0x0000, 0xC98B, 0x0589, 0x0E1D, - 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFF7E, - 0x06DC, 0xFE38, 0x0000, 0x0000, 0x0000, 0xA61A, 0x05CF, 0xBDD2, 0x0000, - 0x0000, 0x0000, 0xE8F1, 0x1A2A, 0xB8CB, 0x0000, 0x0000, 0x67A9, 0x11B0, - 0x083F, 0xA3A1, 0x232F, 0xE24B, 0xC7CF, 0x0000, 0x0000, 0x5267, 0xE8D8, - 0xF70B, 0xAD5B, 0x556C, 0xE241, 0x4131, 0xF8E4, 0x183F, 0x2AAB, 0x0000, - 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x2D35, 0xF7BB, 0x51AE, 0x0000, - 0x0000, 0xC2E2, 0x0080, 0x0D4B, 0xBFDB, 0xB5D0, 0x14C1, 0x3468, 0x0000, - 0x0000, 0xC98B, 0x0589, 0x0E1D, 0xE201, 0xC000, 0x6A68, 0xFD26, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00F7, 0x0CAE, 0xFD93, - 0x0000, 0x0000, 0x0000, 0x9953, 0x02B3, 0xC0ED, 0x0000, 0x0000, 0x0000, - 0x087B, 0xFFC0, 0xE175, 0x0000, 0x0000, 0x21F0, 0xF6DE, 0x077F, 0xB7DB, - 0xF4E5, 0x0606, 0x05E6, 0x0000, 0x0000, 0x20F1, 0xF94E, 0xF7A2, 0xA326, - 0x61C2, 0xFE1D, 0x37D7, 0xF95E, 0x1FDD, 0x34D3, 0x0000, 0x0000, 0x4DBE, - 0x0000, 0x0000, 0x0000, 0x4557, 0xF959, 0x2A44, 0x0000, 0x0000, 0xAABB, - 0xF8B0, 0x8BB6, 0xD4CC, 0xD92F, 0x1D54, 0x3848, 0x0000, 0x0000, 0x0000, - 0xFB26, 0x0549, 0xC9CC, 0xC000, 0x6A5E, 0xFD26, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0116, 0x0CC0, 0xFD9A, 0x0000, 0x0000, 0x0000, 0x9887, 0x0329, - 0xC09E, 0x0000, 0x0000, 0x0000, 0x0799, 0x00ED, 0xE1D3, 0x0000, 0x0000, - 0x22E2, 0xF7D8, 0x0726, 0xB67D, 0xF49C, 0x03DB, 0x005E, 0x0000, 0x0000, - 0x2B3C, 0xF915, 0xF7F1, 0xA454, 0x62C0, 0xFE54, 0x3797, 0xF92C, 0x20DE, - 0x34D3, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x4621, 0xF96D, - 0x27EA, 0x0000, 0x0000, 0xA9E6, 0xF91F, 0x8B69, 0xD466, 0xD95F, 0x1EAC, - 0x371C, 0x0000, 0x0000, 0x0000, 0xFB3D, 0x055A, 0xC9C2, 0xC000, 0x69B8, - 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0121, 0x0CE8, 0xFD9C, 0x0000, - 0x0000, 0x0000, 0x97EA, 0x0386, 0xC05E, 0x0000, 0x0000, 0x0000, 0x0626, - 0x032D, 0xE3FB, 0x0000, 0x0000, 0x2426, 0xFAD2, 0x0685, 0xB38C, 0xF57E, - 0xFFB5, 0xF6A9, 0x0000, 0x0000, 0x387B, 0xF8D1, 0xF858, 0xA605, 0x6384, - 0xFE7E, 0x3766, 0xF906, 0x21A4, 0x34D3, 0x0000, 0x0000, 0x4DBE, 0x0000, - 0x0000, 0x0000, 0x46BC, 0xF97C, 0x261B, 0x0000, 0x0000, 0xA942, 0xF975, - 0x8B2E, 0xD418, 0xD984, 0x1FB4, 0x3636, 0x0000, 0x0000, 0x0000, 0xFB4E, - 0x0566, 0xC9BA, 0xC000, 0x68B8, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0122, 0x0D15, 0xFD9C, 0x0000, 0x0000, 0x0000, 0x9777, 0x03CA, 0xC02D, - 0x0000, 0x0000, 0x0000, 0x046D, 0x05D9, 0xE7E4, 0x0000, 0x0000, 0x2423, - 0xFEA9, 0x05BE, 0xB001, 0xF807, 0xFB50, 0xEC3D, 0x0000, 0x0000, 0x41C4, - 0xF886, 0xF8D0, 0xA815, 0x63DC, 0xFE9D, 0x3742, 0xF8EA, 0x2233, 0x34D3, - 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x472C, 0xF987, 0x24CA, - 0x0000, 0x0000, 0xA8CB, 0xF9B3, 0x8B03, 0xD3DF, 0xD99F, 0x2074, 0x358F, - 0x0000, 0x0000, 0x0000, 0xFB5B, 0x0570, 0xC9B4, 0xC000, 0x67AE, 0xFD26, - 0x0000, 0x0000, 0x0000, 0x0000, 0x011D, 0x0D3B, 0xFD9B, 0x0000, 0x0000, - 0x0000, 0x972A, 0x03F9, 0xC00C, 0x0000, 0x0000, 0x0000, 0x02CD, 0x0871, - 0xECF0, 0x0000, 0x0000, 0x2282, 0x0237, 0x04F5, 0xACD1, 0xFAB6, 0xF82C, - 0xE46E, 0x0000, 0x0000, 0x441A, 0xF838, 0xF952, 0xAA60, 0x63D8, 0xFEB2, - 0x372A, 0xF8E4, 0x2293, 0x34D3, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, - 0x0000, 0x4777, 0xF98E, 0x23EB, 0x0000, 0x0000, 0xA87C, 0xF9DC, 0x8AE6, - 0xD3B9, 0xD9B1, 0x20F3, 0x3520, 0x0000, 0x0000, 0x0000, 0xFB63, 0x0576, - 0xC9B0, 0xC000, 0x66EA, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0119, - 0x0D48, 0xFD9B, 0x0000, 0x0000, 0x0000, 0x9700, 0x0413, 0xBFF9, 0x0000, - 0x0000, 0x0000, 0x0166, 0x0A9F, 0xF199, 0x0000, 0x0000, 0x20E8, 0x05CA, - 0x03DE, 0xAA10, 0xFC09, 0xF67D, 0xE107, 0x0000, 0x0000, 0x3F53, 0xF7EC, - 0xF9D9, 0xACBF, 0x63D6, 0xFEBD, 0x371C, 0xF8E4, 0x22C7, 0x34D3, 0x0000, - 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x47A0, 0xF992, 0x2370, 0x0000, - 0x0000, 0xA851, 0xF9F3, 0x8AD7, 0xD3A4, 0xD9BB, 0x2139, 0x34E3, 0x0000, - 0x0000, 0x0000, 0xFB68, 0x0579, 0xC9AE, 0xC000, 0x66BD, 0xFD26, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0115, 0x0D1A, 0xFD9A, 0x0000, 0x0000, 0x0000, - 0x96F2, 0x041B, 0xBFF3, 0x0000, 0x0000, 0x0000, 0xFF60, 0x0D4F, 0xF565, - 0x0000, 0x0000, 0x22E9, 0x0918, 0x0309, 0xA7C3, 0xFC6B, 0xF55C, 0xE057, - 0x0000, 0x0000, 0x36FF, 0xF7A5, 0xFA5C, 0xAF0E, 0x63D5, 0xFEC1, 0x3718, - 0xF8E4, 0x22D5, 0x34D3, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, - 0x47AB, 0xF993, 0x234F, 0x0000, 0x0000, 0xA845, 0xF9F9, 0x8AD2, 0xD39F, - 0xD9BE, 0x214C, 0x34D2, 0x0000, 0x0000, 0x0000, 0xFB69, 0x057A, 0xC9AE, - 0xC000, 0x67B5, 0xFD27, 0x0000, 0x0000, 0x0000, 0x0000, 0x010A, 0x0CC6, - 0xFD97, 0x0000, 0x0000, 0x0000, 0x96FE, 0x0414, 0xBFF9, 0x0000, 0x0000, - 0x0000, 0xFD19, 0x1014, 0xF9A5, 0x0000, 0x0000, 0x2559, 0x0C01, 0x0311, - 0xA5B2, 0xFC12, 0xF4B0, 0xE1B0, 0x0000, 0x0000, 0x2D81, 0xF767, 0xFAD6, - 0xB129, 0x63D6, 0xFEBE, 0x371C, 0xF8E4, 0x22C3, 0x34D3, 0x0000, 0x0000, - 0x4DBE, 0x0000, 0x0000, 0x0000, 0x479D, 0xF992, 0x2378, 0x0000, 0x0000, - 0xA853, 0xF9F1, 0x8AD8, 0xD3A6, 0xD9BA, 0x2135, 0x34E7, 0x0000, 0x0000, - 0x0000, 0xFB67, 0x0579, 0xC9AF, 0xC000, 0x6992, 0xFD28, 0x0000, 0x0000, - 0x0000, 0x0000, 0x00FF, 0x0C98, 0xFD95, 0x0000, 0x0000, 0x0000, 0x971F, - 0x0400, 0xC007, 0x0000, 0x0000, 0x0000, 0xFB52, 0x1123, 0xFA0F, 0x0000, - 0x0000, 0x2963, 0x0E7F, 0x036D, 0xA3F8, 0xFB18, 0xF4A7, 0xE4FB, 0x0000, - 0x0000, 0x238E, 0xF736, 0xFB41, 0xB2EA, 0x63D7, 0xFEB5, 0x3726, 0xF8E4, - 0x2297, 0x34D3, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x477A, - 0xF98F, 0x23E1, 0x0000, 0x0000, 0xA878, 0xF9DE, 0x8AE5, 0xD3B8, 0xD9B2, - 0x20F9, 0x351B, 0x0000, 0x0000, 0x0000, 0xFB63, 0x0576, 0xC9B0, 0xC000, - 0x6B72, 0xFD27, 0x0000, 0x0000, 0x0000, 0x0000, 0x00F7, 0x0CAA, 0xFD93, - 0x0000, 0x0000, 0x0000, 0x9751, 0x03E1, 0xC01D, 0x0000, 0x0000, 0x0000, - 0xFA1E, 0x1043, 0xF463, 0x0000, 0x0000, 0x3152, 0x0EB9, 0x03DB, 0xA3FA, - 0xFA58, 0xF5A9, 0xE7CE, 0x0000, 0x0000, 0x21A2, 0xF716, 0xFB95, 0xB42C, - 0x63DA, 0xFEA7, 0x3736, 0xF8E4, 0x2254, 0x34D3, 0x0000, 0x0000, 0x4DBE, - 0x0000, 0x0000, 0x0000, 0x4746, 0xF98A, 0x247C, 0x0000, 0x0000, 0xA8AF, - 0xF9C1, 0x8AF9, 0xD3D2, 0xD9A6, 0x20A0, 0x3568, 0x0000, 0x0000, 0x0000, - 0xFB5E, 0x0572, 0xC9B3, 0xC000, 0x6C75, 0xFD26, 0x0000, 0x0000, 0x0000, - 0x0000, 0x00F4, 0x0CD4, 0xFD92, 0x0000, 0x0000, 0x0000, 0x9790, 0x03BC, - 0xC038, 0x0000, 0x0000, 0x0000, 0xF9E3, 0x0E84, 0xEC75, 0x0000, 0x0000, - 0x3A01, 0x0CB5, 0x0446, 0xA5B7, 0xF9B9, 0xF749, 0xEA3F, 0x0000, 0x0000, - 0x24A0, 0xF79E, 0xFB49, 0xB1AD, 0x63DD, 0xFE96, 0x3749, 0xF8F3, 0x2202, - 0x34D3, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x4706, 0xF983, - 0x253D, 0x0000, 0x0000, 0xA8F4, 0xF99E, 0x8B11, 0xD3F2, 0xD996, 0x2033, - 0x35C8, 0x0000, 0x0000, 0x0000, 0xFB56, 0x056C, 0xC9B6, 0xC000, 0x6C9C, - 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0x00F3, 0x0D0A, 0xFD92, 0x0000, - 0x0000, 0x0000, 0x97D7, 0x0391, 0xC056, 0x0000, 0x0000, 0x0000, 0xFB3A, - 0x0C31, 0xE450, 0x0000, 0x0000, 0x408E, 0x09E0, 0x04C3, 0xA81B, 0xF8D4, - 0xF91B, 0xEDE4, 0x0000, 0x0000, 0x2489, 0xF85F, 0xFAAF, 0xADC3, 0x639C, - 0xFE83, 0x3760, 0xF905, 0x21A6, 0x34D3, 0x0000, 0x0000, 0x4DBE, 0x0000, - 0x0000, 0x0000, 0x46BD, 0xF97C, 0x2616, 0x0000, 0x0000, 0xA941, 0xF976, - 0x8B2D, 0xD417, 0xD985, 0x1FB6, 0x3634, 0x0000, 0x0000, 0x0000, 0xFB4E, - 0x0567, 0xC9BA, 0xC000, 0x6C8A, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, - 0x00F3, 0x0D3F, 0xFD92, 0x0000, 0x0000, 0x0000, 0x9822, 0x0364, 0xC075, - 0x0000, 0x0000, 0x0000, 0xFDE4, 0x09B2, 0xDDC3, 0x0000, 0x0000, 0x435A, - 0x0683, 0x054B, 0xAAEB, 0xF7D0, 0xFB63, 0xF278, 0x0000, 0x0000, 0x235F, - 0xF8A5, 0xFA74, 0xAC83, 0x633E, 0xFE6F, 0x3777, 0xF918, 0x2144, 0x34D3, - 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x4670, 0xF975, 0x26FC, - 0x0000, 0x0000, 0xA992, 0xF94B, 0x8B4A, 0xD43E, 0xD972, 0x1F33, 0x36A6, - 0x0000, 0x0000, 0x0000, 0xFB46, 0x0560, 0xC9BE, 0xC000, 0x6C4D, 0xFD26, - 0x0000, 0x0000, 0x0000, 0x0000, 0x00F3, 0x0D69, 0xFD92, 0x0000, 0x0000, - 0x0000, 0x986D, 0x0338, 0xC094, 0x0000, 0x0000, 0x0000, 0x00CB, 0x079B, - 0xDA49, 0x0000, 0x0000, 0x4227, 0x02E6, 0x05D5, 0xADEC, 0xF6E0, 0xFDF9, - 0xF7A1, 0x0000, 0x0000, 0x211C, 0xF8CB, 0xFA47, 0xABDD, 0x62E0, 0xFE5B, - 0x378F, 0xF92B, 0x20E2, 0x34D3, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, - 0x0000, 0x4624, 0xF96D, 0x27E1, 0x0000, 0x0000, 0xA9E3, 0xF921, 0x8B68, - 0xD465, 0xD960, 0x1EB1, 0x3718, 0x0000, 0x0000, 0x0000, 0xFB3D, 0x055A, - 0xC9C2, 0xC000, 0x6BF3, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0x00F4, - 0x0D7B, 0xFD92, 0x0000, 0x0000, 0x0000, 0x98B5, 0x030E, 0xC0B0, 0x0000, - 0x0000, 0x0000, 0x037C, 0x05C8, 0xDA0F, 0x0000, 0x0000, 0x3CBF, 0xFF51, - 0x0658, 0xB0E4, 0xF62F, 0x009C, 0xFCD9, 0x0000, 0x0000, 0x1E4D, 0xF8EA, - 0xF9F8, 0xAAD9, 0x6287, 0xFE48, 0x37A5, 0xF93D, 0x2086, 0x34D3, 0x0000, - 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x45DC, 0xF966, 0x28B9, 0x0000, - 0x0000, 0xAA2F, 0xF8F9, 0x8B83, 0xD489, 0xD94F, 0x1E36, 0x3783, 0x0000, - 0x0000, 0x0000, 0xFB35, 0x0554, 0xC9C5, 0xC000, 0x6B8A, 0xFD26, 0x0000, - 0x0000, 0x0000, 0x0000, 0x00F4, 0x0D5C, 0xFD92, 0x0000, 0x0000, 0x0000, - 0x98F4, 0x02E9, 0xC0C9, 0x0000, 0x0000, 0x0000, 0x05C7, 0x03CA, 0xDBA1, - 0x0000, 0x0000, 0x34B7, 0xFC0A, 0x06CD, 0xB399, 0xF5B8, 0x02DC, 0x00ED, - 0x0000, 0x0000, 0x1D69, 0xF90D, 0xF95C, 0xA8CB, 0x6239, 0xFE37, 0x37B9, - 0xF94D, 0x2035, 0x34D3, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, - 0x459C, 0xF960, 0x2977, 0x0000, 0x0000, 0xAA73, 0xF8D6, 0x8B9C, 0xD4AA, - 0xD93F, 0x1DC9, 0x37E2, 0x0000, 0x0000, 0x0000, 0xFB2E, 0x054F, 0xC9C9, - 0xC000, 0x6B20, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0x00F5, 0x0D15, - 0xFD93, 0x0000, 0x0000, 0x0000, 0x9926, 0x02CD, 0xC0DC, 0x0000, 0x0000, - 0x0000, 0x075C, 0x01E0, 0xDDF8, 0x0000, 0x0000, 0x2C46, 0xF95A, 0x072A, - 0xB5D0, 0xF554, 0x0489, 0x039F, 0x0000, 0x0000, 0x1EA1, 0xF92D, 0xF895, - 0xA63E, 0x61FA, 0xFE29, 0x37C9, 0xF95A, 0x1FF4, 0x34D3, 0x0000, 0x0000, - 0x4DBE, 0x0000, 0x0000, 0x0000, 0x4569, 0xF95B, 0x2A0E, 0x0000, 0x0000, - 0xAAA8, 0xF8BA, 0x8BAF, 0xD4C3, 0xD933, 0x1D73, 0x382D, 0x0000, 0x0000, - 0x0000, 0xFB28, 0x054B, 0xC9CB, 0xC000, 0x6AC3, 0xFD26, 0x0000, 0x0000, - 0x0000, 0x0000, 0x00F6, 0x0CCE, 0xFD93, 0x0000, 0x0000, 0x0000, 0x9947, - 0x02BA, 0xC0E8, 0x0000, 0x0000, 0x0000, 0x0838, 0x005F, 0xE057, 0x0000, - 0x0000, 0x2512, 0xF789, 0x0768, 0xB74F, 0xF506, 0x05A2, 0x054F, 0x0000, - 0x0000, 0x202D, 0xF945, 0xF7EA, 0xA411, 0x61D1, 0xFE20, 0x37D3, 0xF962, - 0x1FCA, 0x34D3, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x4548, - 0xF958, 0x2A72, 0x0000, 0x0000, 0xAACC, 0xF8A7, 0x8BBC, 0xD4D4, 0xD92B, - 0x1D3A, 0x385F, 0x0000, 0x0000, 0x0000, 0xFB24, 0x0548, 0xC9CD, 0xC000, - 0x6A81, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD57, - 0x0C75, 0xFD93, 0x0000, 0x0000, 0x0000, 0x95A0, 0x02DA, 0xC000, 0x0000, - 0x0000, 0x0000, 0x0244, 0x0D14, 0xE896, 0x0000, 0x0000, 0x2E92, 0x08FA, - 0x0919, 0xAA50, 0xFC76, 0xF14F, 0xE452, 0x0000, 0x0000, 0x2291, 0xF851, - 0xF9F1, 0xB1DE, 0x61C2, 0xFE1D, 0x35CD, 0xF95B, 0x1FEF, 0x34D3, 0x0000, - 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, - 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD92F, 0x1D54, 0x3848, 0x0000, - 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC006, 0x6A68, 0xFD32, 0x0000, - 0x0000, 0x0000, 0x0000, 0xFD54, 0x0C77, 0xFD9E, 0x0000, 0x0000, 0x0000, - 0x94AD, 0x0356, 0xBF9C, 0x0000, 0x0000, 0x0000, 0x0259, 0x0CB4, 0xE74A, - 0x0000, 0x0000, 0x2EEA, 0x0809, 0x08E4, 0xAAB8, 0xFE17, 0xF127, 0xDF5D, - 0x0000, 0x0000, 0x2B98, 0xF8F7, 0xF9E2, 0xB095, 0x61B8, 0xFE53, 0x357E, - 0xF916, 0x212E, 0x34CB, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, - 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, - 0xD95F, 0x1EAA, 0x371E, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, - 0xC04E, 0x6A68, 0xFDC0, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD53, 0x0C8C, - 0xFDA3, 0x0000, 0x0000, 0x0000, 0x93F0, 0x03B8, 0xBF4B, 0x0000, 0x0000, - 0x0000, 0x02C7, 0x0BD5, 0xE5AA, 0x0000, 0x0000, 0x2E30, 0x0652, 0x0865, - 0xABEB, 0xFFCD, 0xF110, 0xDABC, 0x0000, 0x0000, 0x34F5, 0xF9DB, 0xF9BC, - 0xAEBB, 0x61AF, 0xFE7D, 0x3540, 0xF8EF, 0x21B7, 0x34B9, 0x0000, 0x0000, - 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, - 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD984, 0x1FB1, 0x3639, 0x0000, 0x0000, - 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC0B7, 0x6A6B, 0xFE8E, 0x0000, 0x0000, - 0x0000, 0x0000, 0xFD51, 0x0CAA, 0xFDA5, 0x0000, 0x0000, 0x0000, 0x9366, - 0x0400, 0xBF0D, 0x0000, 0x0000, 0x0000, 0x0364, 0x0A9D, 0xE3F4, 0x0000, - 0x0000, 0x2C91, 0x047C, 0x07C5, 0xADB1, 0x00D9, 0xF153, 0xD839, 0x0000, - 0x0000, 0x3C47, 0xFAE5, 0xF986, 0xAC76, 0x61A8, 0xFE9C, 0x3513, 0xF8E4, - 0x21B6, 0x34A5, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, - 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD99F, - 0x2070, 0x3592, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC133, - 0x6A70, 0xFF83, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD50, 0x0CC4, 0xFDA5, - 0x0000, 0x0000, 0x0000, 0x930A, 0x0432, 0xBEE3, 0x0000, 0x0000, 0x0000, - 0x040C, 0x0932, 0xE254, 0x0000, 0x0000, 0x2A5B, 0x032F, 0x072C, 0xAFD6, - 0x007B, 0xF22A, 0xD940, 0x0000, 0x0000, 0x3FC3, 0xFC00, 0xF947, 0xA9EC, - 0x61A4, 0xFEB0, 0x34F5, 0xF8E4, 0x2157, 0x3493, 0x0000, 0x0000, 0x4DBE, - 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, - 0xF8A1, 0x8BC0, 0xD4DA, 0xD9B1, 0x20EF, 0x3524, 0x0000, 0x0000, 0x0000, - 0xFB23, 0x0547, 0xC9CE, 0xC1B6, 0x6A78, 0x0088, 0x0000, 0x0000, 0x0000, - 0x0000, 0xFD50, 0x0CCF, 0xFDA6, 0x0000, 0x0000, 0x0000, 0x92D5, 0x044D, - 0xBECA, 0x0000, 0x0000, 0x0000, 0x049D, 0x07BC, 0xE0C0, 0x0000, 0x0000, - 0x2834, 0x0288, 0x067C, 0xB323, 0xFE75, 0xF3EA, 0xDE7B, 0x0000, 0x0000, - 0x3F06, 0xFD16, 0xF905, 0xA741, 0x61A1, 0xFEBC, 0x34E4, 0xF8F8, 0x20C9, - 0x3489, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, - 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD9BA, 0x2134, - 0x34E7, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC235, 0x6A82, - 0x0184, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD4F, 0x0CC6, 0xFDA6, 0x0000, - 0x0000, 0x0000, 0x92C4, 0x0457, 0xBEC2, 0x0000, 0x0000, 0x0000, 0x0547, - 0x05B8, 0xDF1F, 0x0000, 0x0000, 0x24E0, 0x0233, 0x05AE, 0xB76D, 0xFBC0, - 0xF679, 0xE64F, 0x0000, 0x0000, 0x3AF5, 0xFE10, 0xF8C7, 0xA49B, 0x61A1, - 0xFEBF, 0x34DF, 0xF917, 0x2036, 0x348C, 0x0000, 0x0000, 0x4DBE, 0x0000, - 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, - 0x8BC0, 0xD4DA, 0xD9BD, 0x2148, 0x34D6, 0x0000, 0x0000, 0x0000, 0xFB23, - 0x0547, 0xC9CE, 0xC2A3, 0x6A8D, 0x0260, 0x0000, 0x0000, 0x0000, 0x0000, - 0xFD4F, 0x0CAE, 0xFDA6, 0x0000, 0x0000, 0x0000, 0x92D1, 0x0450, 0xBEC8, - 0x0000, 0x0000, 0x0000, 0x05F3, 0x030D, 0xDE5A, 0x0000, 0x0000, 0x1E9D, - 0x022D, 0x050A, 0xBB0D, 0xF963, 0xF95F, 0xEEBA, 0x0000, 0x0000, 0x33EA, - 0xFEDA, 0xF893, 0xA21E, 0x61A1, 0xFEBC, 0x34E4, 0xF93D, 0x1FCD, 0x34A3, - 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, - 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD9BA, 0x2130, 0x34EB, - 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC2F5, 0x6A97, 0x0304, - 0x0000, 0x0000, 0x0000, 0x0000, 0xFD4E, 0x0C90, 0xFDA6, 0x0000, 0x0000, - 0x0000, 0x92F8, 0x043B, 0xBEDA, 0x0000, 0x0000, 0x0000, 0x063A, 0x009D, - 0xDE80, 0x0000, 0x0000, 0x17CA, 0x0272, 0x04DA, 0xBC5D, 0xF7F1, 0xFBE8, - 0xF5E9, 0x0000, 0x0000, 0x2BD5, 0xFF5C, 0xF86F, 0x9FF1, 0x61A3, 0xFEB3, - 0x34F1, 0xF965, 0x1FBA, 0x34D3, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, - 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, - 0xD4DA, 0xD9B1, 0x20F4, 0x351F, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, - 0xC9CE, 0xC320, 0x6A9D, 0x0359, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD4E, - 0x0C75, 0xFDA5, 0x0000, 0x0000, 0x0000, 0x9332, 0x041C, 0xBEF5, 0x0000, - 0x0000, 0x0000, 0x0643, 0xFF9C, 0xDC98, 0x0000, 0x0000, 0x1859, 0x02F7, - 0x0515, 0xBB8A, 0xF76E, 0xFD33, 0xF9B4, 0x0000, 0x0000, 0x26AE, 0xFF80, - 0xF863, 0x9E38, 0x61A6, 0xFEA6, 0x3504, 0xF9C6, 0x2019, 0x356D, 0x0000, - 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, - 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD9A5, 0x209C, 0x356C, 0x0000, - 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC317, 0x6A9B, 0x0346, 0x0000, - 0x0000, 0x0000, 0x0000, 0xFD4D, 0x0C58, 0xFDA3, 0x0000, 0x0000, 0x0000, - 0x937C, 0x03F5, 0xBF17, 0x0000, 0x0000, 0x0000, 0x0645, 0x0057, 0xD6D7, - 0x0000, 0x0000, 0x23BD, 0x03A8, 0x0578, 0xB9FB, 0xF78A, 0xFCE7, 0xF92C, - 0x0000, 0x0000, 0x26FA, 0xFD92, 0xF8C4, 0x9DB0, 0x61AA, 0xFE95, 0x351D, - 0xFA67, 0x20B7, 0x366D, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, - 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, - 0xD996, 0x202F, 0x35CB, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, - 0xC249, 0x6A84, 0x01AB, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD4D, 0x0C3A, - 0xFDA2, 0x0000, 0x0000, 0x0000, 0x93D1, 0x03C8, 0xBF3D, 0x0000, 0x0000, - 0x0000, 0x05EF, 0x01C8, 0xD0E9, 0x0000, 0x0000, 0x3122, 0x0477, 0x05F9, - 0xB7E3, 0xF80A, 0xFBA8, 0xF635, 0x0000, 0x0000, 0x29F3, 0xF9E9, 0xF981, - 0x9EA1, 0x61AE, 0xFE82, 0x3539, 0xFAFF, 0x214C, 0x375D, 0x0000, 0x0000, - 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, - 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD984, 0x1FB3, 0x3637, 0x0000, 0x0000, - 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC0AA, 0x6A6A, 0xFE71, 0x0000, 0x0000, - 0x0000, 0x0000, 0xFD4D, 0x0C2C, 0xFDA0, 0x0000, 0x0000, 0x0000, 0x942B, - 0x0399, 0xBF64, 0x0000, 0x0000, 0x0000, 0x050D, 0x039A, 0xCCEF, 0x0000, - 0x0000, 0x3C88, 0x0557, 0x068B, 0xB571, 0xF8DE, 0xF9EF, 0xF23F, 0x0000, - 0x0000, 0x2CE0, 0xF780, 0xF9FF, 0xA080, 0x61B2, 0xFE6E, 0x3556, 0xFB42, - 0x218E, 0x37C8, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, - 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD972, - 0x1F31, 0x36A8, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xBEF9, - 0x6A6D, 0xFB18, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD4C, 0x0C31, 0xFD9E, - 0x0000, 0x0000, 0x0000, 0x9485, 0x036B, 0xBF8B, 0x0000, 0x0000, 0x0000, - 0x03A2, 0x059C, 0xCBA5, 0x0000, 0x0000, 0x4487, 0x063A, 0x0725, 0xB2D8, - 0xF9DF, 0xF818, 0xEE47, 0x0000, 0x0000, 0x2E5B, 0xF701, 0xFA1D, 0xA340, - 0x61B6, 0xFE5A, 0x3574, 0xFB1E, 0x216B, 0x3790, 0x0000, 0x0000, 0x4DBE, - 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, - 0xF8A1, 0x8BC0, 0xD4DA, 0xD960, 0x1EAF, 0x371A, 0x0000, 0x0000, 0x0000, - 0xFB23, 0x0547, 0xC9CE, 0xBDFA, 0x6A7E, 0xF923, 0x0000, 0x0000, 0x0000, - 0x0000, 0xFD4D, 0x0C3F, 0xFD9B, 0x0000, 0x0000, 0x0000, 0x94DB, 0x033F, - 0xBFAF, 0x0000, 0x0000, 0x0000, 0x021E, 0x0783, 0xCD13, 0x0000, 0x0000, - 0x4842, 0x0713, 0x07BC, 0xB04A, 0xFAD8, 0xF65E, 0xEADE, 0x0000, 0x0000, - 0x2E4B, 0xF6FD, 0xFA23, 0xA6CE, 0x61BA, 0xFE47, 0x358F, 0xFAC6, 0x2115, - 0x3704, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, - 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD94E, 0x1E34, - 0x3784, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xBE13, 0x6A7C, - 0xF955, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD4D, 0x0C50, 0xFD98, 0x0000, - 0x0000, 0x0000, 0x9527, 0x0318, 0xBFCF, 0x0000, 0x0000, 0x0000, 0x00F9, - 0x098E, 0xD2CD, 0x0000, 0x0000, 0x45FA, 0x07D4, 0x0844, 0xADF7, 0xFB87, - 0xF4FB, 0xE893, 0x0000, 0x0000, 0x2CAA, 0xF748, 0xFA1B, 0xAA9C, 0x61BD, - 0xFE37, 0x35A8, 0xFA53, 0x20A4, 0x364E, 0x0000, 0x0000, 0x4DBE, 0x0000, - 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, - 0x8BC0, 0xD4DA, 0xD93F, 0x1DC8, 0x37E2, 0x0000, 0x0000, 0x0000, 0xFB23, - 0x0547, 0xC9CE, 0xBECB, 0x6A70, 0xFAC2, 0x0000, 0x0000, 0x0000, 0x0000, - 0xFD4D, 0x0C62, 0xFD95, 0x0000, 0x0000, 0x0000, 0x9565, 0x02F8, 0xBFE8, - 0x0000, 0x0000, 0x0000, 0x00C4, 0x0B84, 0xDBCB, 0x0000, 0x0000, 0x3E09, - 0x086E, 0x08B3, 0xAC11, 0xFC24, 0xF370, 0xE65E, 0x0000, 0x0000, 0x299C, - 0xF7B6, 0xFA0A, 0xAE18, 0x61C0, 0xFE29, 0x35BC, 0xF9E1, 0x2033, 0x3597, - 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, - 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD933, 0x1D72, 0x382D, - 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xBF9C, 0x6A69, 0xFC60, - 0x0000, 0x0000, 0x0000, 0x0000, 0xFD4D, 0x0C70, 0xFD93, 0x0000, 0x0000, - 0x0000, 0x958F, 0x02E3, 0xBFF9, 0x0000, 0x0000, 0x0000, 0x019D, 0x0CAF, - 0xE462, 0x0000, 0x0000, 0x3400, 0x08D5, 0x08FE, 0xAAC9, 0xFC7A, 0xF1EA, - 0xE4AD, 0x0000, 0x0000, 0x251B, 0xF81D, 0xF9FA, 0xB0B2, 0x61C1, 0xFE20, - 0x35C9, 0xF988, 0x1FDD, 0x350B, 0x0000, 0x0000, 0x4DBE, 0x0000, 0x0000, - 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, - 0xD4DA, 0xD92B, 0x1D3A, 0x385F, 0x0000, 0x0000, 0x0000, 0xFB23, 0x0547, - 0xC9CE, 0xC000, 0x6A68, 0xFD26, 0x0000, 0x0000, 0x0000, 0x0000, 0xFD4D, - 0x0C75, 0xFD93, 0x0000, 0x0000, 0x0000, 0x95A0, 0x02DA, 0xC000, 0x0000, - 0x0000, 0x0000, 0x024A, 0x0D01, 0xE869, 0x0000, 0x0000, 0x2EA2, 0x08FA, - 0x0919, 0xAA50, 0xFC74, 0xF144, 0xE44B, 0x0000, 0x0000, 0x2254, 0xF850, - 0xF9F2, 0xB1DA, 0x61C2, 0xFE1D, 0x35CD, 0xF965, 0x1FBA, 0x34D3, 0x0000, - 0x0000, 0x4DBE, 0x0000, 0x0000, 0x0000, 0x453C, 0xF957, 0x2A97, 0x0000, - 0x0000, 0xAAD8, 0xF8A1, 0x8BC0, 0xD4DA, 0xD928, 0x1D25, 0x3871, 0x0000, - 0x0000, 0x0000, 0xFB23, 0x0547, 0xC9CE, 0xC000, 0x6A68, 0xFD26, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, -}; diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 4b3042072..fdb2ed7c7 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -34,7 +34,6 @@ #include "Enhancements/randomizer/static_data.h" #include "Enhancements/randomizer/dungeon.h" #include "Enhancements/gameplaystats.h" -#include "Enhancements/n64_weird_frame_data.inc" #include "frame_interpolation.h" #include "variables.h" #include "z64.h" @@ -2033,11 +2032,6 @@ extern "C" int Controller_ShouldRumble(size_t slot) { return 1; } -extern "C" void* getN64WeirdFrame(s32 i) { - char* weirdFrameBytes = reinterpret_cast(n64WeirdFrames); - return &weirdFrameBytes[i + sizeof(n64WeirdFrames)]; -} - extern "C" size_t GetEquipNowMessage(char* buffer, char* src, const size_t maxBufferSize) { CustomMessage customMessage("\x04\x1A\x08" "Would you like to equip it now?" diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index 21316d19d..3e6f1a34d 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -125,7 +125,6 @@ void AudioMgr_CreateNextAudioBuffer(s16* samples, u32 num_samples); int Controller_ShouldRumble(size_t slot); void Controller_BlockGameInput(); void Controller_UnblockGameInput(); -void* getN64WeirdFrame(s32 i); size_t GetEquipNowMessage(char* buffer, char* src, const size_t maxBufferSize); u32 SpoilerFileExists(const char* spoilerFileName); Sprite* GetSeedTexture(uint8_t index); diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index 6d64b0a60..953a4c331 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -1006,7 +1006,8 @@ void SohMenu::AddMenuEnhancements() { "Restore a bug from NTSC 1.0 that allows casting the Fishing Rod while using the Hover Boots.")); AddWidget(path, "N64 Weird Frames", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("N64WeirdFrames")) - .Options(CheckboxOptions().Tooltip("Restores N64 Weird Frames allowing weirdshots to behave the same as N64.")); + .Options(CheckboxOptions().Tooltip( + "Restores N64 Weird Frames allowing weirdshots and weirdslides to behave the same as N64.")); AddWidget(path, "Bombchus Out of Bounds", WIDGET_CVAR_CHECKBOX) .CVar(CVAR_ENHANCEMENT("BombchusOOB")) .Options( diff --git a/soh/src/code/z_skelanime.c b/soh/src/code/z_skelanime.c index e9f84980c..b459796a1 100644 --- a/soh/src/code/z_skelanime.c +++ b/soh/src/code/z_skelanime.c @@ -3,8 +3,8 @@ #include #include #include -#include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define ANIM_INTERP 1 @@ -887,15 +887,10 @@ AnimationEntry* AnimationContext_AddEntry(AnimationContext* animationCtx, Animat */ void AnimationContext_SetLoadFrame(PlayState* play, LinkAnimationHeader* animation, s32 frame, s32 limbCount, Vec3s* frameTable) { - if (CVarGetInteger(CVAR_ENHANCEMENT("N64WeirdFrames"), 0) && frame < 0) { - Vec3s* src = (Vec3s*)getN64WeirdFrame((sizeof(Vec3s) * limbCount + 2) * frame); - memcpy(frameTable, src, sizeof(Vec3s) * limbCount + 2); - return; - } - AnimationEntry* entry = AnimationContext_AddEntry(&play->animationCtx, ANIMENTRY_LOADFRAME); - if (entry != NULL) { + if (GameInteractor_Should(VB_LOAD_PLAYER_ANIMATION_FRAME, entry != NULL, entry, animation, frame, limbCount, + frameTable)) { if (ResourceMgr_OTRSigCheck(animation) != 0) animation = ResourceMgr_LoadAnimByName(animation); From 7514bdc08b85a6a52dda0112143fed51ef761b74 Mon Sep 17 00:00:00 2001 From: nclok1405 <155463060+nclok1405@users.noreply.github.com> Date: Fri, 20 Jun 2025 07:06:10 +0900 Subject: [PATCH 54/67] Convert enemy-specific cheats "No ReDead/Gibdo Freeze" and "Keese/Guay don't Target You" to hooks (#5597) --- .../Enhancements/Cheats/NoKeeseGuayTarget.cpp | 23 +++++++++++ .../Enhancements/Cheats/NoRedeadFreeze.cpp | 17 ++++++++ .../vanilla-behavior/GIVanillaBehavior.h | 40 +++++++++++++++++++ .../overlays/actors/ovl_En_Crow/z_en_crow.c | 4 +- .../actors/ovl_En_Firefly/z_en_firefly.c | 4 +- soh/src/overlays/actors/ovl_En_Rd/z_en_rd.c | 4 +- 6 files changed, 86 insertions(+), 6 deletions(-) create mode 100644 soh/soh/Enhancements/Cheats/NoKeeseGuayTarget.cpp create mode 100644 soh/soh/Enhancements/Cheats/NoRedeadFreeze.cpp diff --git a/soh/soh/Enhancements/Cheats/NoKeeseGuayTarget.cpp b/soh/soh/Enhancements/Cheats/NoKeeseGuayTarget.cpp new file mode 100644 index 000000000..911f3cd25 --- /dev/null +++ b/soh/soh/Enhancements/Cheats/NoKeeseGuayTarget.cpp @@ -0,0 +1,23 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "macros.h" +} + +static constexpr int32_t CVAR_NOKEESEGUAYTARGET_DEFAULT = 0; +#define CVAR_NOKEESEGUAYTARGET_NAME CVAR_CHEAT("NoKeeseGuayTarget") +#define CVAR_NOKEESEGUAYTARGET_VALUE CVarGetInteger(CVAR_NOKEESEGUAYTARGET_NAME, CVAR_NOKEESEGUAYTARGET_DEFAULT) + +void RegisterNoKeeseGuayTarget() { + // Dive Attack + COND_VB_SHOULD(VB_KEESE_DO_DIVE_ATTACK, CVAR_NOKEESEGUAYTARGET_VALUE, { *should = false; }); + COND_VB_SHOULD(VB_GUAY_DO_DIVE_ATTACK, CVAR_NOKEESEGUAYTARGET_VALUE, { *should = false; }); + + // Force Fly Away + COND_VB_SHOULD(VB_KEESE_FORCE_FLY_AWAY, CVAR_NOKEESEGUAYTARGET_VALUE, { *should = true; }); + COND_VB_SHOULD(VB_GUAY_FORCE_FLY_AWAY, CVAR_NOKEESEGUAYTARGET_VALUE, { *should = true; }); +} + +static RegisterShipInitFunc initFunc_NoKeeseGuayTarget(RegisterNoKeeseGuayTarget, { CVAR_NOKEESEGUAYTARGET_NAME }); diff --git a/soh/soh/Enhancements/Cheats/NoRedeadFreeze.cpp b/soh/soh/Enhancements/Cheats/NoRedeadFreeze.cpp new file mode 100644 index 000000000..ccc406104 --- /dev/null +++ b/soh/soh/Enhancements/Cheats/NoRedeadFreeze.cpp @@ -0,0 +1,17 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "macros.h" +} + +static constexpr int32_t CVAR_NOREDEADFREEZE_DEFAULT = 0; +#define CVAR_NOREDEADFREEZE_NAME CVAR_CHEAT("NoRedeadFreeze") +#define CVAR_NOREDEADFREEZE_VALUE CVarGetInteger(CVAR_NOREDEADFREEZE_NAME, CVAR_NOREDEADFREEZE_DEFAULT) + +void RegisterNoRedeadFreeze() { + COND_VB_SHOULD(VB_REDEAD_GIBDO_FREEZE_LINK, CVAR_NOREDEADFREEZE_VALUE, { *should = false; }); +} + +static RegisterShipInitFunc initFunc_NoRedeadFreeze(RegisterNoRedeadFreeze, { CVAR_NOREDEADFREEZE_NAME }); diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index c561a0dfe..186307aed 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -1111,6 +1111,22 @@ typedef enum { // - None VB_GTG_GATE_BE_OPEN, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnCrow` + VB_GUAY_DO_DIVE_ATTACK, + + // #### `result` + // ```c + // false + // ``` + // #### `args` + // - `*EnCrow` + VB_GUAY_FORCE_FLY_AWAY, + // #### `result` // ```c // true @@ -1199,6 +1215,22 @@ typedef enum { // - None VB_KALEIDO_UNPAUSE_CLOSE, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnFirefly` + VB_KEESE_DO_DIVE_ATTACK, + + // #### `result` + // ```c + // false + // ``` + // #### `args` + // - `*EnFirefly` + VB_KEESE_FORCE_FLY_AWAY, + // #### `result` // ```c // Flags_GetEventChkInf(EVENTCHKINF_KING_ZORA_MOVED) @@ -1713,6 +1745,14 @@ typedef enum { // - None VB_PREVENT_ADULT_STICK, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*EnRd` + VB_REDEAD_GIBDO_FREEZE_LINK, + // #### `result` // #### `result` // ```c diff --git a/soh/src/overlays/actors/ovl_En_Crow/z_en_crow.c b/soh/src/overlays/actors/ovl_En_Crow/z_en_crow.c index 7ab5fbd84..1d2e0d156 100644 --- a/soh/src/overlays/actors/ovl_En_Crow/z_en_crow.c +++ b/soh/src/overlays/actors/ovl_En_Crow/z_en_crow.c @@ -285,7 +285,7 @@ void EnCrow_FlyIdle(EnCrow* this, PlayState* play) { } if ((this->timer == 0) && (this->actor.xzDistToPlayer < 300.0f) && !(player->stateFlags1 & PLAYER_STATE1_ON_HORSE) && (this->actor.yDistToWater < -40.0f) && - (Player_GetMask(play) != PLAYER_MASK_SKULL) && !CVarGetInteger(CVAR_CHEAT("NoKeeseGuayTarget"), 0)) { + (Player_GetMask(play) != PLAYER_MASK_SKULL) && GameInteractor_Should(VB_GUAY_DO_DIVE_ATTACK, true, this)) { EnCrow_SetupDiveAttack(this); } } @@ -322,7 +322,7 @@ void EnCrow_DiveAttack(EnCrow* this, PlayState* play) { if ((this->timer == 0) || (Player_GetMask(play) == PLAYER_MASK_SKULL) || (this->collider.base.atFlags & AT_HIT) || (this->actor.bgCheckFlags & 9) || (player->stateFlags1 & PLAYER_STATE1_ON_HORSE) || - (this->actor.yDistToWater > -40.0f) || CVarGetInteger(CVAR_CHEAT("NoKeeseGuayTarget"), 0)) { + (this->actor.yDistToWater > -40.0f) || GameInteractor_Should(VB_GUAY_FORCE_FLY_AWAY, false, this)) { if (this->collider.base.atFlags & AT_HIT) { this->collider.base.atFlags &= ~AT_HIT; Audio_PlayActorSound2(&this->actor, NA_SE_EN_KAICHO_ATTACK); diff --git a/soh/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c b/soh/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c index ced99da23..cda0fb18a 100644 --- a/soh/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c +++ b/soh/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c @@ -416,7 +416,7 @@ void EnFirefly_FlyIdle(EnFirefly* this, PlayState* play) { Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.wallYaw, 2, 0xC00, 0x300); } if ((this->timer == 0) && (this->actor.xzDistToPlayer < 200.0f) && (Player_GetMask(play) != PLAYER_MASK_SKULL) && - !CVarGetInteger(CVAR_CHEAT("NoKeeseGuayTarget"), 0)) { + GameInteractor_Should(VB_KEESE_DO_DIVE_ATTACK, true, this)) { EnFirefly_SetupDiveAttack(this); } } @@ -495,7 +495,7 @@ void EnFirefly_DiveAttack(EnFirefly* this, PlayState* play) { Math_ScaledStepToS(&this->actor.shape.rot.x, this->targetPitch, 0x100); } if ((this->timer == 0) || (Player_GetMask(play) == PLAYER_MASK_SKULL) || - CVarGetInteger(CVAR_CHEAT("NoKeeseGuayTarget"), 0)) { + GameInteractor_Should(VB_KEESE_FORCE_FLY_AWAY, false, this)) { EnFirefly_SetupFlyAway(this); } } diff --git a/soh/src/overlays/actors/ovl_En_Rd/z_en_rd.c b/soh/src/overlays/actors/ovl_En_Rd/z_en_rd.c index e9b4ee2b6..062be3268 100644 --- a/soh/src/overlays/actors/ovl_En_Rd/z_en_rd.c +++ b/soh/src/overlays/actors/ovl_En_Rd/z_en_rd.c @@ -344,7 +344,7 @@ void func_80AE2C1C(EnRd* this, PlayState* play) { !(player->stateFlags2 & PLAYER_STATE2_GRABBED_BY_ENEMY)) { if (this->unk_306 == 0) { if (!(this->unk_312 & PLAYER_STATE2_GRABBED_BY_ENEMY) && - !CVarGetInteger(CVAR_CHEAT("NoRedeadFreeze"), 0)) { + GameInteractor_Should(VB_REDEAD_GIBDO_FREEZE_LINK, true, this)) { player->actor.freezeTimer = 40; Player_SetAutoLockOnActor(play, &this->actor); GET_PLAYER(play)->autoLockOnActor = &this->actor; @@ -575,7 +575,7 @@ void func_80AE3834(EnRd* this, PlayState* play) { s16 temp_v0 = this->actor.yawTowardsPlayer - this->actor.shape.rot.y - this->unk_30E - this->unk_310; if (ABS(temp_v0) < 0x2008) { - if (!(this->unk_312 & 0x80) && !CVarGetInteger(CVAR_CHEAT("NoRedeadFreeze"), 0)) { + if (!(this->unk_312 & 0x80) && GameInteractor_Should(VB_REDEAD_GIBDO_FREEZE_LINK, true, this)) { player->actor.freezeTimer = 60; func_800AA000(this->actor.xzDistToPlayer, 0xFF, 0x14, 0x96); Player_SetAutoLockOnActor(play, &this->actor); From 7ecefa8f905618f83455f8c3be120b7fdc6da866 Mon Sep 17 00:00:00 2001 From: nclok1405 <155463060+nclok1405@users.noreply.github.com> Date: Fri, 20 Jun 2025 10:59:46 +0900 Subject: [PATCH 55/67] Converted "Passage of Time on File Select" to ShipInit Hook (#5595) --- .../cosmetics/TimeFlowFileSelect.cpp | 20 +++++++++++++++++++ .../ovl_file_choose/z_file_choose.c | 4 ---- 2 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 soh/soh/Enhancements/cosmetics/TimeFlowFileSelect.cpp diff --git a/soh/soh/Enhancements/cosmetics/TimeFlowFileSelect.cpp b/soh/soh/Enhancements/cosmetics/TimeFlowFileSelect.cpp new file mode 100644 index 000000000..d33f4f7e8 --- /dev/null +++ b/soh/soh/Enhancements/cosmetics/TimeFlowFileSelect.cpp @@ -0,0 +1,20 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include "z64save.h" + +extern "C" SaveContext gSaveContext; + +static constexpr int32_t CVAR_TIMEFLOWFILESELECT_DEFAULT = 0; +#define CVAR_TIMEFLOWFILESELECT_NAME CVAR_ENHANCEMENT("TimeFlowFileSelect") +#define CVAR_TIMEFLOWFILESELECT_VALUE CVarGetInteger(CVAR_TIMEFLOWFILESELECT_NAME, CVAR_TIMEFLOWFILESELECT_DEFAULT) + +void OnFileChooseMainTimeFlowFileSelect(void* gameState) { + gSaveContext.skyboxTime += 0x10; +} + +void RegisterTimeFlowFileSelect() { + COND_HOOK(OnFileChooseMain, CVAR_TIMEFLOWFILESELECT_VALUE, OnFileChooseMainTimeFlowFileSelect); +} + +static RegisterShipInitFunc initFunc_TimeFlowFileSelect(RegisterTimeFlowFileSelect, { CVAR_TIMEFLOWFILESELECT_NAME }); diff --git a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c index a212085ae..8fa504748 100644 --- a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c +++ b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c @@ -3597,10 +3597,6 @@ void FileChoose_Main(GameState* thisx) { sWindowContentColors[0][2] = 255; } - if (CVarGetInteger(CVAR_ENHANCEMENT("TimeFlowFileSelect"), 0) != 0) { - gSaveContext.skyboxTime += 0x10; - } - OPEN_DISPS(this->state.gfxCtx); this->n64ddFlag = 0; From 2d59721b7ac4b0b23eb04c0f48452511712acc9c Mon Sep 17 00:00:00 2001 From: Malkierian Date: Thu, 19 Jun 2025 22:10:06 -0700 Subject: [PATCH 56/67] Small fixes to allow running and seed generation. (#5600) --- soh/soh/Enhancements/randomizer/entrance.cpp | 16 ++++++++-------- .../Enhancements/randomizer/location_access.cpp | 2 +- .../location_access/dungeons/water_temple.cpp | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/entrance.cpp b/soh/soh/Enhancements/randomizer/entrance.cpp index 52657a6ab..377a76438 100644 --- a/soh/soh/Enhancements/randomizer/entrance.cpp +++ b/soh/soh/Enhancements/randomizer/entrance.cpp @@ -266,8 +266,8 @@ void SetAllEntrancesData() { { EntranceType::Dungeon, RR_FOREST_TEMPLE_ENTRYWAY, RR_SACRED_FOREST_MEADOW, ENTR_SACRED_FOREST_MEADOW_OUTSIDE_TEMPLE } }, { { EntranceType::Dungeon, RR_DMC_CENTRAL_LOCAL, RR_FIRE_TEMPLE_ENTRYWAY, ENTR_FIRE_TEMPLE_ENTRANCE }, { EntranceType::Dungeon, RR_FIRE_TEMPLE_ENTRYWAY, RR_DMC_CENTRAL_LOCAL, ENTR_DEATH_MOUNTAIN_CRATER_OUTSIDE_TEMPLE } }, - { { EntranceType::Dungeon, RR_LAKE_HYLIA, RR_WATER_TEMPLE_ENTRYWAY, ENTR_WATER_TEMPLE_ENTRANCE }, - { EntranceType::Dungeon, RR_WATER_TEMPLE_ENTRYWAY, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE } }, + { { EntranceType::Dungeon, RR_LH_FROM_WATER_TEMPLE, RR_WATER_TEMPLE_ENTRYWAY, ENTR_WATER_TEMPLE_ENTRANCE }, + { EntranceType::Dungeon, RR_WATER_TEMPLE_ENTRYWAY, RR_LH_FROM_WATER_TEMPLE, ENTR_LAKE_HYLIA_OUTSIDE_TEMPLE } }, { { EntranceType::Dungeon, RR_DESERT_COLOSSUS, RR_SPIRIT_TEMPLE_ENTRYWAY, ENTR_SPIRIT_TEMPLE_ENTRANCE }, { EntranceType::Dungeon, RR_SPIRIT_TEMPLE_ENTRYWAY, RR_DESERT_COLOSSUS_OUTSIDE_TEMPLE, ENTR_DESERT_COLOSSUS_OUTSIDE_TEMPLE } }, { { EntranceType::Dungeon, RR_GRAVEYARD_WARP_PAD_REGION, RR_SHADOW_TEMPLE_ENTRYWAY, ENTR_SHADOW_TEMPLE_ENTRANCE }, @@ -454,8 +454,8 @@ void SetAllEntrancesData() { { EntranceType::Overworld, RR_LW_FOREST_EXIT, RR_KOKIRI_FOREST, ENTR_KOKIRI_FOREST_UPPER_EXIT } }, { { EntranceType::Overworld, RR_THE_LOST_WOODS, RR_GC_WOODS_WARP, ENTR_GORON_CITY_TUNNEL_SHORTCUT }, { EntranceType::Overworld, RR_GC_WOODS_WARP, RR_THE_LOST_WOODS, ENTR_LOST_WOODS_TUNNEL_SHORTCUT } }, - { { EntranceType::Overworld, RR_THE_LOST_WOODS, RR_ZORAS_RIVER, ENTR_ZORAS_RIVER_UNDERWATER_SHORTCUT }, - { EntranceType::Overworld, RR_ZORAS_RIVER, RR_THE_LOST_WOODS, ENTR_LOST_WOODS_UNDERWATER_SHORTCUT } }, + { { EntranceType::Overworld, RR_THE_LOST_WOODS, RR_ZR_FROM_SHORTCUT, ENTR_ZORAS_RIVER_UNDERWATER_SHORTCUT }, + { EntranceType::Overworld, RR_ZR_FROM_SHORTCUT, RR_THE_LOST_WOODS, ENTR_LOST_WOODS_UNDERWATER_SHORTCUT } }, { { EntranceType::Overworld, RR_LW_BEYOND_MIDO, RR_SFM_ENTRYWAY, ENTR_SACRED_FOREST_MEADOW_SOUTH_EXIT }, { EntranceType::Overworld, RR_SFM_ENTRYWAY, RR_LW_BEYOND_MIDO, ENTR_LOST_WOODS_NORTH_EXIT } }, { { EntranceType::Overworld, RR_LW_BRIDGE, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_WOODED_EXIT }, @@ -472,8 +472,8 @@ void SetAllEntrancesData() { { EntranceType::Overworld, RR_ZR_FRONT, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_RIVER_EXIT } }, { { EntranceType::Overworld, RR_HYRULE_FIELD, RR_LON_LON_RANCH, ENTR_LON_LON_RANCH_ENTRANCE }, { EntranceType::Overworld, RR_LON_LON_RANCH, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_CENTER_EXIT } }, - { { EntranceType::Overworld, RR_LAKE_HYLIA, RR_ZORAS_DOMAIN, ENTR_ZORAS_DOMAIN_UNDERWATER_SHORTCUT }, - { EntranceType::Overworld, RR_ZORAS_DOMAIN, RR_LAKE_HYLIA, ENTR_LAKE_HYLIA_UNDERWATER_SHORTCUT } }, + { { EntranceType::Overworld, RR_LH_FROM_SHORTCUT, RR_ZORAS_DOMAIN, ENTR_ZORAS_DOMAIN_UNDERWATER_SHORTCUT }, + { EntranceType::Overworld, RR_ZORAS_DOMAIN, RR_LH_FROM_SHORTCUT, ENTR_LAKE_HYLIA_UNDERWATER_SHORTCUT } }, { { EntranceType::Overworld, RR_GV_FORTRESS_SIDE, RR_GERUDO_FORTRESS, ENTR_GERUDOS_FORTRESS_EAST_EXIT }, { EntranceType::Overworld, RR_GERUDO_FORTRESS, RR_GV_FORTRESS_SIDE, ENTR_GERUDO_VALLEY_WEST_EXIT } }, { { EntranceType::Overworld, RR_GF_OUTSIDE_GATE, RR_WASTELAND_NEAR_FORTRESS, ENTR_HAUNTED_WASTELAND_EAST_EXIT }, @@ -1501,7 +1501,7 @@ int EntranceShuffler::ShuffleAllEntrances() { { EntranceNameByRegions(RR_FIRE_TEMPLE_BOSS_ROOM, RR_FIRE_TEMPLE_BOSS_ENTRYWAY), GetEntrance(RR_FIRE_TEMPLE_ENTRYWAY, RR_DMC_CENTRAL_LOCAL) }, { EntranceNameByRegions(RR_WATER_TEMPLE_BOSS_ROOM, RR_WATER_TEMPLE_BOSS_ENTRYWAY), - GetEntrance(RR_WATER_TEMPLE_ENTRYWAY, RR_LAKE_HYLIA) }, + GetEntrance(RR_WATER_TEMPLE_ENTRYWAY, RR_LH_FROM_WATER_TEMPLE) }, { EntranceNameByRegions(RR_SPIRIT_TEMPLE_BOSS_ROOM, RR_SPIRIT_TEMPLE_BOSS_ENTRYWAY), GetEntrance(RR_SPIRIT_TEMPLE_ENTRYWAY, RR_DESERT_COLOSSUS_OUTSIDE_TEMPLE) }, { EntranceNameByRegions(RR_SHADOW_TEMPLE_BOSS_ROOM, RR_SHADOW_TEMPLE_BOSS_ENTRYWAY), @@ -1521,7 +1521,7 @@ int EntranceShuffler::ShuffleAllEntrances() { GetEntrance(RR_FOREST_TEMPLE_BOSS_ROOM, RR_SACRED_FOREST_MEADOW) }, { EntranceNameByRegions(RR_FIRE_TEMPLE_ENTRYWAY, RR_DMC_CENTRAL_LOCAL), GetEntrance(RR_FIRE_TEMPLE_BOSS_ROOM, RR_DMC_CENTRAL_LOCAL) }, - { EntranceNameByRegions(RR_WATER_TEMPLE_ENTRYWAY, RR_LAKE_HYLIA), + { EntranceNameByRegions(RR_WATER_TEMPLE_ENTRYWAY, RR_LH_FROM_WATER_TEMPLE), GetEntrance(RR_WATER_TEMPLE_BOSS_ROOM, RR_LAKE_HYLIA) }, { EntranceNameByRegions(RR_SPIRIT_TEMPLE_ENTRYWAY, RR_DESERT_COLOSSUS_OUTSIDE_TEMPLE), GetEntrance(RR_SPIRIT_TEMPLE_BOSS_ROOM, RR_DESERT_COLOSSUS) }, diff --git a/soh/soh/Enhancements/randomizer/location_access.cpp b/soh/soh/Enhancements/randomizer/location_access.cpp index d12cfc47a..fe68b1273 100644 --- a/soh/soh/Enhancements/randomizer/location_access.cpp +++ b/soh/soh/Enhancements/randomizer/location_access.cpp @@ -258,6 +258,7 @@ std::set CalculateAreas(SceneID scene) { case SCENE_INSIDE_GANONS_CASTLE_COLLAPSE: case SCENE_GANONS_TOWER_COLLAPSE_EXTERIOR: case SCENE_GANON_BOSS: + case SCENE_ID_MAX: return {}; case SCENE_CHAMBER_OF_THE_SAGES: case SCENE_CUTSCENE_MAP: @@ -270,7 +271,6 @@ std::set CalculateAreas(SceneID scene) { case SCENE_HAIRAL_NIWA2: case SCENE_SASATEST: case SCENE_TESTROOM: - case SCENE_ID_MAX: default: assert(false); return {}; diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp index e8fb4e6b6..20280a6af 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp @@ -11,7 +11,7 @@ void RegionTable_Init_WaterTemple() { //Exits Entrance(RR_WATER_TEMPLE_LOBBY, []{return logic->HasItem(RG_BRONZE_SCALE) && ctx->GetDungeon(WATER_TEMPLE)->IsVanilla();}), Entrance(RR_WATER_TEMPLE_MQ_3F_CENTRAL, []{return logic->HasItem(RG_BRONZE_SCALE) && ctx->GetDungeon(WATER_TEMPLE)->IsMQ();}), - Entrance(RR_LAKE_HYLIA, []{return true;}), + Entrance(RR_LH_FROM_WATER_TEMPLE, []{return true;}), }); #pragma region Vanilla From cf0ea3033eee35baaf79ab374904d63c92a6e852 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Sun, 22 Jun 2025 12:41:13 -0700 Subject: [PATCH 57/67] Fix warning for euro symbol in CustomMessageManager.h. (#5604) --- soh/CMakeLists.txt | 2 ++ soh/soh/Enhancements/custom-message/CustomMessageManager.h | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/soh/CMakeLists.txt b/soh/CMakeLists.txt index 1f8383664..28d8774bf 100644 --- a/soh/CMakeLists.txt +++ b/soh/CMakeLists.txt @@ -138,6 +138,8 @@ endforeach() if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") set_source_files_properties(soh/OTRGlobals.cpp PROPERTIES COMPILE_FLAGS "/utf-8") set_source_files_properties(soh/Enhancements/tts/tts.cpp PROPERTIES COMPILE_FLAGS "/utf-8") + set_source_files_properties(soh/Enhancements/custom-message/CustomMessageManager.cpp PROPERTIES COMPILE_FLAGS "/utf-8") + set_source_files_properties(soh/Enhancements/custom-message/CustomMessageManager.h PROPERTIES COMPILE_FLAGS "/utf-8") endif() # handle Network removals diff --git a/soh/soh/Enhancements/custom-message/CustomMessageManager.h b/soh/soh/Enhancements/custom-message/CustomMessageManager.h index f0edd3079..51bb84eb8 100644 --- a/soh/soh/Enhancements/custom-message/CustomMessageManager.h +++ b/soh/soh/Enhancements/custom-message/CustomMessageManager.h @@ -154,9 +154,9 @@ class CustomMessage { void InsertNumber(uint8_t num); /** - * @brief A € sign at the end of an item name signals that it is plural. + * @brief A € sign at the end of an item name signals that it is plural. * If a hint text has |singular|plural| forms specified, the unused one get's deleted. - * If no € sign is present, the singular form is used. + * If no € sign is present, the singular form is used. */ void SetSingularPlural(); From e0ebc115ce3358e532b48f59c446c98cecd20750 Mon Sep 17 00:00:00 2001 From: Malkierian Date: Sun, 22 Jun 2025 16:32:37 -0700 Subject: [PATCH 58/67] Initialize OTRGlobals' Context early to prevent non-portable crash during asset archive lookup. (#5605) --- soh/soh/OTRGlobals.cpp | 10 ++++++---- soh/soh/OTRGlobals.h | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index fdb2ed7c7..6412c8d0b 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -261,6 +261,10 @@ const char* constCameraStrings[] = { }; OTRGlobals::OTRGlobals() { + context = Ship::Context::CreateUninitializedInstance("Ship of Harkinian", appShortName, "shipofharkinian.json"); +} + +void OTRGlobals::Initialize() { std::vector OTRFiles; std::string mqPath = Ship::Context::LocateFileAcrossAppDirs("oot-mq.otr", appShortName); if (std::filesystem::exists(mqPath)) { @@ -300,8 +304,6 @@ OTRGlobals::OTRGlobals() { OOT_NTSC_JP_GC, OOT_NTSC_US_GC, OOT_PAL_GC, OOT_PAL_GC_DBG1, OOT_PAL_GC_DBG2, }; - context = Ship::Context::CreateUninitializedInstance("Ship of Harkinian", appShortName, "shipofharkinian.json"); - context->InitLogging(); context->InitGfxDebugger(); context->InitConfiguration(); @@ -1100,7 +1102,7 @@ void CheckAndCreateModFolder() { } extern "C" void InitOTR() { - + OTRGlobals::Instance = new OTRGlobals(); #ifdef __SWITCH__ Ship::Switch::Init(Ship::PreInitPhase); #elif defined(__WIIU__) @@ -1207,7 +1209,7 @@ extern "C" void InitOTR() { DetectOTRVersion("oot.otr", false); DetectOTRVersion("oot-mq.otr", true); - OTRGlobals::Instance = new OTRGlobals(); + OTRGlobals::Instance->Initialize(); CustomMessageManager::Instance = new CustomMessageManager(); ItemTableManager::Instance = new ItemTableManager(); GameInteractor::Instance = new GameInteractor(); diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index 3e6f1a34d..9e7815523 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -71,7 +71,7 @@ class OTRGlobals { ~OTRGlobals(); void ScaleImGui(); - + void Initialize(); bool HasMasterQuest(); bool HasOriginal(); uint32_t GetInterpolationFPS(); From 64f9e433dad7185d513720c93b83cd0668af0998 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Mon, 23 Jun 2025 04:35:17 +0000 Subject: [PATCH 59/67] Tag navi dive tricks as glitches (#5598) --- soh/soh/Enhancements/randomizer/randomizer.cpp | 2 +- soh/soh/Enhancements/randomizer/settings.cpp | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 2700159f7..8eb0192b6 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -4137,7 +4137,7 @@ void RandomizerSettingsWindow::DrawElement() { { Rando::Tricks::Tag::NOVICE, true }, { Rando::Tricks::Tag::INTERMEDIATE, true }, { Rando::Tricks::Tag::ADVANCED, true }, { Rando::Tricks::Tag::EXPERT, true }, { Rando::Tricks::Tag::EXTREME, true }, { Rando::Tricks::Tag::EXPERIMENTAL, true }, - //{ Rando::Tricks::Tag::GLITCH, false }, + { Rando::Tricks::Tag::GLITCH, false }, }; static ImGuiTextFilter trickSearch; UIWidgets::PushStyleInput(THEME_COLOR); diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 6ddf0f53e..c88d70db1 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -412,7 +412,8 @@ void Settings::CreateOptions() { "Hover Boots, or Bean."); OPT_TRICK(RT_LW_MIDO_BACKFLIP, RCQUEST_BOTH, RA_THE_LOST_WOODS, { Tricks::Tag::NOVICE }, "Backflip over Mido as Adult", "With a specific position and angle, you can backflip over Mido."); - OPT_TRICK(RT_LOST_WOOD_NAVI_DIVE, RCQUEST_BOTH, RA_THE_LOST_WOODS, { Tricks::Tag::NOVICE }, "Lost Woods Navi dive", + OPT_TRICK(RT_LOST_WOOD_NAVI_DIVE, RCQUEST_BOTH, RA_THE_LOST_WOODS, { Tricks::Tag::NOVICE, Tricks::Tag::GLITCH }, + "Lost Woods Navi dive", "You need Deku Sticks or Kokiri Sword to dive with Navi for entering Zora's River."); OPT_TRICK(RT_LW_GS_BEAN, RCQUEST_BOTH, RA_THE_LOST_WOODS, { Tricks::Tag::INTERMEDIATE }, "Lost Woods Adult GS without Bean", @@ -709,8 +710,8 @@ void Settings::CreateOptions() { OPT_TRICK(RT_LENS_BOTW, RCQUEST_VANILLA, RA_BOTTOM_OF_THE_WELL, { Tricks::Tag::NOVICE }, "Bottom of the Well without Lens of Truth", "Removes the requirements for the Lens of Truth in Bottom of the Well."); - OPT_TRICK(RT_BOTTOM_OF_THE_WELL_NAVI_DIVE, RCQUEST_BOTH, RA_BOTTOM_OF_THE_WELL, { Tricks::Tag::NOVICE }, - "Bottom of the Well Navi dive", + OPT_TRICK(RT_BOTTOM_OF_THE_WELL_NAVI_DIVE, RCQUEST_BOTH, RA_BOTTOM_OF_THE_WELL, + { Tricks::Tag::NOVICE, Tricks::Tag::GLITCH }, "Bottom of the Well Navi dive", "You need Deku Sticks or Kokiri Sword to dive with Navi for entering Bottom of the Well."); OPT_TRICK(RT_BOTW_CHILD_DEADHAND, RCQUEST_BOTH, RA_BOTTOM_OF_THE_WELL, { Tricks::Tag::NOVICE }, "Child Dead Hand without Kokiri Sword", "Requires 9 sticks or 5 jump slashes."); From 040e0e19211aa377ff69157f50bf805e031c74ce Mon Sep 17 00:00:00 2001 From: louist103 <35883445+louist103@users.noreply.github.com> Date: Tue, 24 Jun 2025 01:29:40 +0000 Subject: [PATCH 60/67] Tools update (#5454) * Bump ZAPDTR & OTRExporter. Changes to use o2r by default Changes to the new player animation format # Conflicts: # OTRExporter # ZAPDTR # soh/soh/OTRGlobals.cpp # soh/src/code/z_skelanime.c * Fix actions * Format * Cherry pick ZAPDTR * Update exporter * Move configs to port * Remove copy * Remove more XML copies * Remove extractor directory from actions builds. * Fix OTRExporter for linux * FIx ZAPD volatile * Format * Fix extractor? * Fix linux * Fix * Remove appimage stuff * Screnity now * Remove ZAPD from install paths * Remove soh.sh.in * Fix linux * Cleanups and use a thread for message box --- .github/workflows/generate-builds.yml | 20 +- .github/workflows/pr-artifacts.yml | 2 +- .gitignore | 1 + CMakeLists.txt | 57 +- OTRExporter | 2 +- ZAPDTR | 2 +- copy-existing-otrs.cmake | 40 +- scripts/linux/appimage/soh.desktop | 2 +- scripts/linux/appimage/soh.sh.in | 338 ---- soh/CMakeLists.txt | 27 +- soh/assets/extractor/Config_GC_MQ_D.xml | 2 +- soh/assets/extractor/Config_GC_MQ_NTSC_J.xml | 2 +- soh/assets/extractor/Config_GC_MQ_NTSC_U.xml | 2 +- soh/assets/extractor/Config_GC_MQ_PAL_F.xml | 2 +- soh/assets/extractor/Config_GC_NMQ_D.xml | 2 +- soh/assets/extractor/Config_GC_NMQ_NTSC_J.xml | 2 +- .../extractor/Config_GC_NMQ_NTSC_J_CE.xml | 2 +- soh/assets/extractor/Config_GC_NMQ_NTSC_U.xml | 2 +- soh/assets/extractor/Config_GC_NMQ_PAL_F.xml | 2 +- soh/assets/extractor/Config_N64_NTSC_10.xml | 2 +- soh/assets/extractor/Config_N64_NTSC_11.xml | 2 +- soh/assets/extractor/Config_N64_NTSC_12.xml | 2 +- soh/assets/extractor/Config_N64_PAL_10.xml | 2 +- soh/assets/extractor/Config_N64_PAL_11.xml | 2 +- soh/assets/extractor/filelists/dbg.txt | 1532 +++++++++++++++++ soh/assets/extractor/filelists/gamecube.txt | 1509 ++++++++++++++++ .../extractor/filelists/gamecube_pal.txt | 1510 ++++++++++++++++ .../extractor/filelists/ntsc_12_oot.txt | 1510 ++++++++++++++++ soh/assets/extractor/filelists/ntsc_oot.txt | 1510 ++++++++++++++++ soh/assets/extractor/filelists/pal_oot.txt | 1511 ++++++++++++++++ .../extractor/symbols/ActorList_OoTMqDbg.txt | 472 +++++ .../extractor/symbols/ObjectList_OoTMqDbg.txt | 402 +++++ .../extractor/symbols/SymbolMap_OoTMqDbg.txt | 1 + soh/soh/Extractor/Extract.cpp | 32 +- soh/soh/OTRGlobals.cpp | 48 +- .../resource/importer/AnimationFactory.cpp | 8 +- soh/src/code/z_skelanime.c | 30 +- 37 files changed, 10096 insertions(+), 498 deletions(-) delete mode 100644 scripts/linux/appimage/soh.sh.in create mode 100644 soh/assets/extractor/filelists/dbg.txt create mode 100644 soh/assets/extractor/filelists/gamecube.txt create mode 100644 soh/assets/extractor/filelists/gamecube_pal.txt create mode 100644 soh/assets/extractor/filelists/ntsc_12_oot.txt create mode 100644 soh/assets/extractor/filelists/ntsc_oot.txt create mode 100644 soh/assets/extractor/filelists/pal_oot.txt create mode 100644 soh/assets/extractor/symbols/ActorList_OoTMqDbg.txt create mode 100644 soh/assets/extractor/symbols/ObjectList_OoTMqDbg.txt create mode 100644 soh/assets/extractor/symbols/SymbolMap_OoTMqDbg.txt diff --git a/.github/workflows/generate-builds.yml b/.github/workflows/generate-builds.yml index 45cab21d9..d68092d99 100644 --- a/.github/workflows/generate-builds.yml +++ b/.github/workflows/generate-builds.yml @@ -62,16 +62,16 @@ jobs: cmake .. make sudo make install - - name: Generate soh.otr + - name: Generate soh.o2r run: | export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" cmake --no-warn-unused-cli -H. -Bbuild-cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=Release cmake --build build-cmake --config Release --target GenerateSohOtr -j3 - - name: Upload soh.otr + - name: Upload soh.o2r uses: actions/upload-artifact@v4 with: - name: soh.otr - path: soh.otr + name: soh.o2r + path: soh.o2r retention-days: 3 build-macos: @@ -122,10 +122,10 @@ jobs: brew uninstall --ignore-dependencies libpng sudo port install $(cat .github/workflows/macports-deps.txt) brew install ninja - - name: Download soh.otr + - name: Download soh.o2r uses: actions/download-artifact@v4 with: - name: soh.otr + name: soh.o2r path: build-cmake/soh - name: Build SoH run: | @@ -233,10 +233,10 @@ jobs: make sudo make install sudo cp -av /usr/local/lib/libzip* /lib/x86_64-linux-gnu/ - - name: Download soh.otr + - name: Download soh.o2r uses: actions/download-artifact@v4 with: - name: soh.otr + name: soh.o2r path: build-cmake/soh - name: Build SoH run: | @@ -298,10 +298,10 @@ jobs: path: vcpkg - name: Configure Developer Command Prompt uses: ilammy/msvc-dev-cmd@v1 - - name: Download soh.otr + - name: Download soh.o2r uses: actions/download-artifact@v4 with: - name: soh.otr + name: soh.o2r path: build-windows/soh - name: Build SoH env: diff --git a/.github/workflows/pr-artifacts.yml b/.github/workflows/pr-artifacts.yml index 85db7de59..5b20030af 100644 --- a/.github/workflows/pr-artifacts.yml +++ b/.github/workflows/pr-artifacts.yml @@ -48,7 +48,7 @@ jobs: }); return allArtifacts.data.artifacts.reduce((acc, item) => { - if (item.name === "soh.otr") return acc; + if (item.name === "soh.o2r") return acc; acc += ` - [${item.name}.zip](https://nightly.link/${context.repo.owner}/${context.repo.repo}/actions/artifacts/${item.id}.zip)`; return acc; diff --git a/.gitignore b/.gitignore index ac767f114..3aa34d9c5 100644 --- a/.gitignore +++ b/.gitignore @@ -412,6 +412,7 @@ ReleaseObj/* .tags tags *.otr +*.o2r *.sav shipofharkinian.ini shipofharkinian.json diff --git a/CMakeLists.txt b/CMakeLists.txt index cf9c55b5e..ab90e00b9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -174,24 +174,15 @@ set_property(TARGET soh PROPERTY APPIMAGE_DESKTOP_FILE "${CMAKE_SOURCE_DIR}/scri set_property(TARGET soh PROPERTY APPIMAGE_ICON_FILE "${CMAKE_BINARY_DIR}/sohIcon.png") if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") -install(PROGRAMS "${CMAKE_BINARY_DIR}/linux/soh.sh" DESTINATION . COMPONENT appimage) -install(FILES "${CMAKE_BINARY_DIR}/soh/soh.otr" DESTINATION . COMPONENT ship) +install(FILES "${CMAKE_BINARY_DIR}/soh/soh.o2r" DESTINATION . COMPONENT ship) install(TARGETS ZAPD DESTINATION ./assets/extractor COMPONENT extractor) -install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/extractor/" DESTINATION ./assets/extractor COMPONENT extractor) -install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/xml/" DESTINATION ./assets/extractor/xmls COMPONENT extractor) -install(DIRECTORY "${CMAKE_SOURCE_DIR}/OTRExporter/CFG/filelists/" DESTINATION ./assets/extractor/filelists COMPONENT extractor) -install(FILES "${CMAKE_SOURCE_DIR}/OTRExporter/CFG/ActorList_OoTMqDbg.txt" DESTINATION ./assets/extractor/symbols COMPONENT extractor) -install(FILES "${CMAKE_SOURCE_DIR}/OTRExporter/CFG/ObjectList_OoTMqDbg.txt" DESTINATION ./assets/extractor/symbols COMPONENT extractor) -install(FILES "${CMAKE_SOURCE_DIR}/OTRExporter/CFG/SymbolMap_OoTMqDbg.txt" DESTINATION ./assets/extractor/symbols COMPONENT extractor) +install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/extractor/" DESTINATION ./assets COMPONENT extractor) +install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/xml/" DESTINATION ./assets/xml COMPONENT extractor) endif() if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") -install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/extractor/" DESTINATION ./assets/extractor COMPONENT ship) -install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/xml/" DESTINATION ./assets/extractor/xmls COMPONENT ship) -install(DIRECTORY "${CMAKE_SOURCE_DIR}/OTRExporter/CFG/filelists/" DESTINATION ./assets/extractor/filelists COMPONENT ship) -install(FILES "${CMAKE_SOURCE_DIR}/OTRExporter/CFG/ActorList_OoTMqDbg.txt" DESTINATION ./assets/extractor/symbols COMPONENT ship) -install(FILES "${CMAKE_SOURCE_DIR}/OTRExporter/CFG/ObjectList_OoTMqDbg.txt" DESTINATION ./assets/extractor/symbols COMPONENT ship) -install(FILES "${CMAKE_SOURCE_DIR}/OTRExporter/CFG/SymbolMap_OoTMqDbg.txt" DESTINATION ./assets/extractor/symbols COMPONENT ship) +install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/extractor/" DESTINATION ./assets/ COMPONENT ship) +install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/xml/" DESTINATION ./assets/xml COMPONENT ship) endif() find_package(Python3 COMPONENTS Interpreter) @@ -199,42 +190,42 @@ find_package(Python3 COMPONENTS Interpreter) # Target to generate OTRs add_custom_target( ExtractAssets - COMMAND ${CMAKE_COMMAND} -E rm -f oot.otr oot-mq.otr soh.otr + COMMAND ${CMAKE_COMMAND} -E rm -f oot.o2r oot-mq.o2r soh.o2r # copy LUS default shaders into assets/custom COMMAND ${CMAKE_COMMAND} -E rm -r -f ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom/shaders/ COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src/graphic/Fast3D/shaders/ ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom/shaders/ - COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$" --non-interactive --xml-root ../soh/assets/xml --custom-otr-file soh.otr "--custom-assets-path" ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom --port-ver "${CMAKE_PROJECT_VERSION}" + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$" --non-interactive --xml-root assets/xml --custom-otr-file soh.o2r "--custom-assets-path" ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom --port-ver "${CMAKE_PROJECT_VERSION}" COMMAND ${CMAKE_COMMAND} -DSYSTEM_NAME=${CMAKE_SYSTEM_NAME} -DTARGET_DIR="$" -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -DBINARY_DIR=${CMAKE_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/copy-existing-otrs.cmake - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/soh COMMENT "Running asset extraction..." DEPENDS ZAPD - BYPRODUCTS oot.otr ${CMAKE_SOURCE_DIR}/oot.otr oot-mq.otr ${CMAKE_SOURCE_DIR}/oot-mq.otr ${CMAKE_SOURCE_DIR}/soh.otr + BYPRODUCTS oot.o2r ${CMAKE_SOURCE_DIR}/oot.o2r oot-mq.o2r ${CMAKE_SOURCE_DIR}/oot-mq.o2r ${CMAKE_SOURCE_DIR}/soh.o2r ) # Target to generate headers add_custom_target( ExtractAssetHeaders - COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$" --non-interactive --xml-root ../soh/assets/xml --gen-headers - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$" --non-interactive --xml-root assets/xml --gen-headers + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/soh COMMENT "Generating asset headers..." DEPENDS ZAPD ) -# Target to generate only soh.otr +# Target to generate only soh.o2r add_custom_target( GenerateSohOtr - COMMAND ${CMAKE_COMMAND} -E rm -f soh.otr + COMMAND ${CMAKE_COMMAND} -E rm -f soh.o2r # copy LUS default shaders into assets/custom COMMAND ${CMAKE_COMMAND} -E rm -r -f ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom/shaders/ COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/libultraship/src/graphic/Fast3D/shaders/ ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom/shaders/ - COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$" --norom --custom-otr-file soh.otr "--custom-assets-path" ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom --port-ver "${CMAKE_PROJECT_VERSION}" + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$" --norom --custom-otr-file soh.o2r "--custom-assets-path" ${CMAKE_CURRENT_SOURCE_DIR}/soh/assets/custom --port-ver "${CMAKE_PROJECT_VERSION}" COMMAND ${CMAKE_COMMAND} -DSYSTEM_NAME=${CMAKE_SYSTEM_NAME} -DTARGET_DIR="$" -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -DBINARY_DIR=${CMAKE_BINARY_DIR} -DONLYSOHOTR=On -P ${CMAKE_CURRENT_SOURCE_DIR}/copy-existing-otrs.cmake - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter - COMMENT "Generating soh.otr..." + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/soh + COMMENT "Generating soh.o2r..." DEPENDS ZAPD ) @@ -267,22 +258,12 @@ add_custom_target(CreateOSXIcons ) add_dependencies(soh CreateOSXIcons) -install(TARGETS ZAPD DESTINATION ${CMAKE_BINARY_DIR}/assets/extractor) +install(TARGETS ZAPD DESTINATION ${CMAKE_BINARY_DIR}/assets) set(PROGRAM_PERMISSIONS_EXECUTE OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ) -install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/extractor/" DESTINATION ./assets/extractor) -install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/xml/" DESTINATION ./assets/extractor/xmls) -install(DIRECTORY "${CMAKE_SOURCE_DIR}/OTRExporter/CFG/filelists/" DESTINATION ./assets/extractor/filelists) -install(FILES "${CMAKE_SOURCE_DIR}/OTRExporter/CFG/ActorList_OoTMqDbg.txt" DESTINATION ./assets/extractor/symbols) -install(FILES "${CMAKE_SOURCE_DIR}/OTRExporter/CFG/ObjectList_OoTMqDbg.txt" DESTINATION ./assets/extractor/symbols) -install(FILES "${CMAKE_SOURCE_DIR}/OTRExporter/CFG/SymbolMap_OoTMqDbg.txt" DESTINATION ./assets/extractor/symbols) - -install(DIRECTORY ${CMAKE_BINARY_DIR}/assets - DESTINATION . - PATTERN ZAPD.out - PERMISSIONS ${PROGRAM_PERMISSIONS_EXECUTE} - ) +install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/extractor/" DESTINATION ./assets/) +install(DIRECTORY "${CMAKE_SOURCE_DIR}/soh/assets/xml/" DESTINATION ./assets/xml) # Rename the installed soh binary to drop the macos suffix INSTALL(CODE "FILE(RENAME \${CMAKE_INSTALL_PREFIX}/../MacOS/soh-macos \${CMAKE_INSTALL_PREFIX}/../MacOS/soh)") diff --git a/OTRExporter b/OTRExporter index 41052efcd..461ab19a3 160000 --- a/OTRExporter +++ b/OTRExporter @@ -1 +1 @@ -Subproject commit 41052efcdf8df8e67517cc93da8975fcd4e14af9 +Subproject commit 461ab19a36cde807591543397e136cae19aa6e7c diff --git a/ZAPDTR b/ZAPDTR index 2aeababbf..684f21a47 160000 --- a/ZAPDTR +++ b/ZAPDTR @@ -1 +1 @@ -Subproject commit 2aeababbfb81b00d34673406453e8e8e2deaa27b +Subproject commit 684f21a475dcfeee89938ae1f4afc42768a3e7ef diff --git a/copy-existing-otrs.cmake b/copy-existing-otrs.cmake index f5226510c..d5a5f8995 100644 --- a/copy-existing-otrs.cmake +++ b/copy-existing-otrs.cmake @@ -1,37 +1,37 @@ message(STATUS "Copying otr files...") -if(NOT ONLYSOHOTR AND EXISTS ${SOURCE_DIR}/OTRExporter/oot.otr) - execute_process(COMMAND ${CMAKE_COMMAND} -E copy oot.otr ${SOURCE_DIR}) - execute_process(COMMAND ${CMAKE_COMMAND} -E copy oot.otr ${BINARY_DIR}/soh/) - message(STATUS "Copied oot.otr") +if(NOT ONLYSOHOTR AND EXISTS ${SOURCE_DIR}/soh/oot.o2r) + execute_process(COMMAND ${CMAKE_COMMAND} -E copy oot.o2r ${SOURCE_DIR}) + execute_process(COMMAND ${CMAKE_COMMAND} -E copy oot.o2r ${BINARY_DIR}/soh/) + message(STATUS "Copied oot.o2r") endif() -if(NOT ONLYSOHOTR AND EXISTS ${SOURCE_DIR}/OTRExporter/oot-mq.otr) - execute_process(COMMAND ${CMAKE_COMMAND} -E copy oot-mq.otr ${SOURCE_DIR}) - execute_process(COMMAND ${CMAKE_COMMAND} -E copy oot-mq.otr ${BINARY_DIR}/soh/) - message(STATUS "Copied oot-mq.otr") +if(NOT ONLYSOHOTR AND EXISTS ${SOURCE_DIR}/soh/oot-mq.o2r) + execute_process(COMMAND ${CMAKE_COMMAND} -E copy oot-mq.o2r ${SOURCE_DIR}) + execute_process(COMMAND ${CMAKE_COMMAND} -E copy oot-mq.o2r ${BINARY_DIR}/soh/) + message(STATUS "Copied oot-mq.o2r") endif() -if(EXISTS ${SOURCE_DIR}/OTRExporter/soh.otr) - execute_process(COMMAND ${CMAKE_COMMAND} -E copy soh.otr ${SOURCE_DIR}) - execute_process(COMMAND ${CMAKE_COMMAND} -E copy soh.otr ${BINARY_DIR}/soh/) - message(STATUS "Copied soh.otr") +if(EXISTS ${SOURCE_DIR}/soh/soh.o2r) + execute_process(COMMAND ${CMAKE_COMMAND} -E copy soh.o2r ${SOURCE_DIR}) + execute_process(COMMAND ${CMAKE_COMMAND} -E copy soh.o2r ${BINARY_DIR}/soh/) + message(STATUS "Copied soh.o2r") endif() # Additionally for Windows, copy the otrs to the target dir, side by side with soh.exe if(SYSTEM_NAME MATCHES "Windows") - if(NOT ONLYSOHOTR AND EXISTS ${SOURCE_DIR}/OTRExporter/oot.otr) - execute_process(COMMAND ${CMAKE_COMMAND} -E copy oot.otr ${TARGET_DIR}) + if(NOT ONLYSOHOTR AND EXISTS ${SOURCE_DIR}/soh/oot.o2r) + execute_process(COMMAND ${CMAKE_COMMAND} -E copy oot.o2r ${TARGET_DIR}) endif() - if(NOT ONLYSOHOTR AND EXISTS ${SOURCE_DIR}/OTRExporter/oot-mq.otr) - execute_process(COMMAND ${CMAKE_COMMAND} -E copy oot-mq.otr ${TARGET_DIR}) + if(NOT ONLYSOHOTR AND EXISTS ${SOURCE_DIR}/soh/oot-mq.o2r) + execute_process(COMMAND ${CMAKE_COMMAND} -E copy oot-mq.o2r ${TARGET_DIR}) endif() - if(EXISTS ${SOURCE_DIR}/OTRExporter/soh.otr) - execute_process(COMMAND ${CMAKE_COMMAND} -E copy soh.otr ${TARGET_DIR}) + if(EXISTS ${SOURCE_DIR}/soh/soh.o2r) + execute_process(COMMAND ${CMAKE_COMMAND} -E copy soh.o2r ${TARGET_DIR}) endif() endif() -if(NOT ONLYSOHOTR AND (NOT EXISTS ${SOURCE_DIR}/oot.otr AND NOT EXISTS ${SOURCE_DIR}/oot-mq.otr)) +if(NOT ONLYSOHOTR AND (NOT EXISTS ${SOURCE_DIR}/oot.o2r AND NOT EXISTS ${SOURCE_DIR}/oot-mq.o2r)) message(FATAL_ERROR "Failed to copy. No OTR files found.") endif() -if(NOT EXISTS ${SOURCE_DIR}/soh.otr) +if(NOT EXISTS ${SOURCE_DIR}/soh.o2r) message(FATAL_ERROR "Failed to copy. No soh OTR found.") endif() diff --git a/scripts/linux/appimage/soh.desktop b/scripts/linux/appimage/soh.desktop index 93e4bbdce..5e517c597 100644 --- a/scripts/linux/appimage/soh.desktop +++ b/scripts/linux/appimage/soh.desktop @@ -1,7 +1,7 @@ [Desktop Entry] Version=1.0 Name=SOH -Exec=soh.sh +Exec=soh.elf Terminal=false Icon=sohIcon Type=Application diff --git a/scripts/linux/appimage/soh.sh.in b/scripts/linux/appimage/soh.sh.in deleted file mode 100644 index e02b44fc7..000000000 --- a/scripts/linux/appimage/soh.sh.in +++ /dev/null @@ -1,338 +0,0 @@ -#!/bin/bash -HERE="$(dirname "$(readlink -f "${0}")")"/../.. - -export PATH="$HERE"/bin:"$HERE"/usr/bin:"$PATH" -export LD_LIBRARY_PATH="$HERE"/usr/lib:"$LD_LIBRARY_PATH" -export ZENITY=$(command -v zenity) - -if [ -z ${SHIP_HOME+x} ]; then -export SHIP_HOME=$PWD -fi - -if [ -z ${SHIP_BIN_DIR+x} ]; then -export SHIP_BIN_DIR="$HERE/usr/bin" -fi - -if [[ ! -e "$SHIP_HOME"/mods ]]; then - mkdir -p "$SHIP_HOME"/mods - touch "$SHIP_HOME"/mods/custom_otr_files_go_here.txt -fi - -while [[ (! -e "$SHIP_HOME"/oot.otr) || (! -e "$SHIP_HOME"/oot-mq.otr) ]]; do - for romfile in "$SHIP_HOME"/*.*64 - do - if [[ -e "$romfile" ]] || [[ -L "$romfile" ]]; then - export ASSETDIR="$(mktemp -d /tmp/assets-XXXXX)" - ln -s "$SHIP_BIN_DIR"/{assets,soh.elf,ZAPD} "$ASSETDIR" - export OLDPWD="$PWD" - mkdir -p "$ASSETDIR"/tmp - if [[ -e "$romfile" ]]; then - ln -s "$romfile" "$ASSETDIR"/tmp/rom.z64 - else - ORIG_ROM_PATH=$(readlink "$romfile") - ln -s "$ORIG_ROM_PATH" "$ASSETDIR"/tmp/rom.z64 - fi - cd "$ASSETDIR" - ROMHASH=$(sha1sum -b "$ASSETDIR"/tmp/rom.z64 | awk '{ print $1 }') - - # Remap v64 and n64 hashes to their z64 hash equivalent - # ZAPD will handle converting the data into z64 format - case "$ROMHASH" in - a9059b56e761c9034fbe02fe4c24985aaa835dac) # v64 - ROMHASH=cee6bc3c2a634b41728f2af8da54d9bf8cc14099 - ;; - 24708102dc504d3f375a37f4ae4e149c167dc515) # n64 - ROMHASH=cee6bc3c2a634b41728f2af8da54d9bf8cc14099 - ;; - 580dd0bd1b6d2c51cc20a764eece84dba558964c) # v64 - ROMHASH=0227d7c0074f2d0ac935631990da8ec5914597b4 - ;; - d6342c59007e57c1194661ec6880b2f078403f4e) # n64 - ROMHASH=0227d7c0074f2d0ac935631990da8ec5914597b4 - ;; - d0bdc2eb320668b4ba6893b9aefe4040a73123ff) # v64 - ROMHASH=328a1f1beba30ce5e178f031662019eb32c5f3b5 - ;; - 4946ab250f6ac9b32d76b21f309ebb8ebc8103d2) # n64 - ROMHASH=328a1f1beba30ce5e178f031662019eb32c5f3b5 - ;; - 663c34f1b2c05a09e5beffe4d0dcd440f7d49dc7) # v64 - ROMHASH=cfbb98d392e4a9d39da8285d10cbef3974c2f012 - ;; - 24c73d378b0620a380ce5ef9f2b186c6c157a68b) # n64 - ROMHASH=cfbb98d392e4a9d39da8285d10cbef3974c2f012 - ;; - 8ebf2e29313f44f2d49e5b4191971d09919e8e48) # v64 - ROMHASH=f46239439f59a2a594ef83cf68ef65043b1bffe2 - ;; - 4264bf7b875737b8fae77d52322a5099d051fc11) # n64 - ROMHASH=f46239439f59a2a594ef83cf68ef65043b1bffe2 - ;; - 973bc6fe56010a8d646166a1182a81b4f13b8cf9) # v64 - ROMHASH=50bebedad9e0f10746a52b07239e47fa6c284d03 - ;; - d327752c46edc70ff3668b9514083dbbee08927c) # v64 - ROMHASH=50bebedad9e0f10746a52b07239e47fa6c284d03 - ;; - ecdeb1747560834e079c22243febea7f6f26ba3b) # v64 - ROMHASH=079b855b943d6ad8bd1eb026c0ed169ecbdac7da - ;; - f19f8662ec7abee29484a272a6fda53e39efe0f1) # n64 - ROMHASH=079b855b943d6ad8bd1eb026c0ed169ecbdac7da - ;; - ab519ce04a33818ce2c39b3c514a751d807a494a) # v64 - ROMHASH=cfecfdc58d650e71a200c81f033de4e6d617a9f6 - ;; - c19a34f7646305e1755249fca2071e178bd7cd00) # n64 - ROMHASH=cfecfdc58d650e71a200c81f033de4e6d617a9f6 - ;; - 25e8ae79ea0839ca5c984473f7460d8040c36f9c) # v64 - ROMHASH=517bd9714c73cb96c21e7c2ef640d7b55186102f - ;; - 166c02770d67fcc3954c443eb400a6a3573d3fc0) # n64 - ROMHASH=517bd9714c73cb96c21e7c2ef640d7b55186102f - ;; - 79a4f053d34018e59279e6d4b83c7daccd985c87) # v64 - ROMHASH=ad69c91157f6705e8ab06c79fe08aad47bb57ba7 - ;; - 82fafee9c6ac7946739282958364ce606077ac65) # n64 - ROMHASH=ad69c91157f6705e8ab06c79fe08aad47bb57ba7 - ;; - 18cd0eb65914a21d8fa08dfe71c29d865e9d728a) # v64 - ROMHASH=d3ecb253776cd847a5aa63d859d8c89a2f37b364 - ;; - 07940d5609e04b7caac63570731e01189129212e) # n64 - ROMHASH=d3ecb253776cd847a5aa63d859d8c89a2f37b364 - ;; - 3ac86253e0c0d55486d212e647350c1527b9c92d) # v64 - ROMHASH=41b3bdc48d98c48529219919015a1af22f5057c2 - ;; - 70bf30a9980026e615a1ae8d2735a773cf9fcc94) # n64 - ROMHASH=41b3bdc48d98c48529219919015a1af22f5057c2 - ;; - f9e2b6840b9103e9707ea390089a7b6943592a98) # v64 - ROMHASH=c892bbda3993e66bd0d56a10ecd30b1ee612210f - ;; - 2fae1601aa7ae8d3e03ba3f4dcdfca3a36002ac5) # n64 - ROMHASH=c892bbda3993e66bd0d56a10ecd30b1ee612210f - ;; - 1181034d5f9533f53ebe8e1c781badbee115f5aa) # v64 - ROMHASH=dbfc81f655187dc6fefd93fa6798face770d579d - ;; - 07477067943abe8d0c50285eb4a6cb9ece99e79b) # n64 - ROMHASH=dbfc81f655187dc6fefd93fa6798face770d579d - ;; - 2d8fb7140a9c5d11ce614561e5a36ffef0c17540) # v64 - ROMHASH=fa5f5942b27480d60243c2d52c0e93e26b9e6b86 - ;; - d90bbe422ac728ac54ac6a2c9fec942f7ff04df9) # n64 - ROMHASH=fa5f5942b27480d60243c2d52c0e93e26b9e6b86 - ;; - 44c75962911e13bdfdc31b35e0b8e3be6a6a49ab) # v64 - b82710ba2bd3b4c6ee8aa1a7e9acf787dfc72e9b - ;; - 5d47025581060af5ba19e6719c25fea7398e87cf) # n64 - b82710ba2bd3b4c6ee8aa1a7e9acf787dfc72e9b - ;; - e1d070ad7b017de9f992b362164dcd9d7f820f7e) # v64 - 8b5d13aac69bfbf989861cfdc50b1d840945fc1d - ;; - a8c04cd5aa94a6a32198f36ff2069d43342d18a8) # n64 - 8b5d13aac69bfbf989861cfdc50b1d840945fc1d - ;; - 245410280d152f28d5b1c0c0fc37f384db0020cd) # v64 - 0769c84615422d60f16925cd859593cdfa597f84 - ;; - fbdc9e444807f9b881e3432cedf66f38746b81d8) # n64 - 0769c84615422d60f16925cd859593cdfa597f84 - ;; - b6d33d6bf5d6700c64b6a873ab8b06ff039619bc) # v64 - 2ce2d1a9f0534c9cd9fa04ea5317b80da21e5e73 - ;; - 2c7113d20044f93c82ec888c19aa09ea7797396d) # n64 - 2ce2d1a9f0534c9cd9fa04ea5317b80da21e5e73 - ;; - 06c3c098f0e14ed61811dfaf0e8e4519d7d7a826) # v64 - dd14e143c4275861fe93ea79d0c02e36ae8c6c2f - ;; - bb3f85bfaad9ae7a20afbf618fc9fe126c8c1b4f) # n64 - dd14e143c4275861fe93ea79d0c02e36ae8c6c2f - ;; - esac - - case "$ROMHASH" in - cee6bc3c2a634b41728f2af8da54d9bf8cc14099) - if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then - ROM=GC_NMQ_D - OTRNAME="oot.otr" - fi - ;; - 0227d7c0074f2d0ac935631990da8ec5914597b4) - if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then - ROM=GC_NMQ_PAL_F - OTRNAME="oot.otr" - else - continue - fi - ;; - 328a1f1beba30ce5e178f031662019eb32c5f3b5) - if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then - ROM=N64_PAL_10 - OTRNAME="oot.otr" - else - continue - fi - ;; - cfbb98d392e4a9d39da8285d10cbef3974c2f012) - if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then - ROM=N64_PAL_11 - OTRNAME="oot.otr" - else - continue - fi - ;; - ad69c91157f6705e8ab06c79fe08aad47bb57ba7|c892bbda3993e66bd0d56a10ecd30b1ee612210f) - if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then - ROM=N64_NTSC_10 - OTRNAME="oot.otr" - else - continue - fi - ;; - d3ecb253776cd847a5aa63d859d8c89a2f37b364|dbfc81f655187dc6fefd93fa6798face770d579d) - if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then - ROM=N64_NTSC_11 - OTRNAME="oot.otr" - else - continue - fi - ;; - 41b3bdc48d98c48529219919015a1af22f5057c2|fa5f5942b27480d60243c2d52c0e93e26b9e6b86) - if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then - ROM=N64_NTSC_12 - OTRNAME="oot.otr" - else - continue - fi - ;; - f46239439f59a2a594ef83cf68ef65043b1bffe2) - if [[ ! -e "$SHIP_HOME"/oot-mq.otr ]]; then - ROM=GC_MQ_PAL_F - OTRNAME="oot-mq.otr" - else - continue - fi - ;; - 50bebedad9e0f10746a52b07239e47fa6c284d03) - if [[ ! -e "$SHIP_HOME"/oot-mq.otr ]]; then - ROM=GC_MQ_D - OTRNAME="oot-mq.otr" - else - continue - fi - ;; - 079b855b943d6ad8bd1eb026c0ed169ecbdac7da) - if [[ ! -e "$SHIP_HOME"/oot-mq.otr ]]; then - ROM=GC_MQ_D - OTRNAME="oot-mq.otr" - else - continue - fi - ;; - cfecfdc58d650e71a200c81f033de4e6d617a9f6) - if [[ ! -e "$SHIP_HOME"/oot-mq.otr ]]; then - ROM=GC_MQ_D - OTRNAME="oot-mq.otr" - else - continue - fi - ;; - 517bd9714c73cb96c21e7c2ef640d7b55186102f) - if [[ ! -e "$SHIP_HOME"/oot-mq.otr ]]; then - ROM=GC_MQ_D - OTRNAME="oot-mq.otr" - else - continue - fi - ;; - b82710ba2bd3b4c6ee8aa1a7e9acf787dfc72e9b) - if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then - ROM=GC_NMQ_NTSC_U - OTRNAME="oot.otr" - else - continue - fi - ;; - 8b5d13aac69bfbf989861cfdc50b1d840945fc1d) - if [[ ! -e "$SHIP_HOME"/oot-mq.otr ]]; then - ROM=GC_MQ_NTSC_U - OTRNAME="oot-mq.otr" - else - continue - fi - ;; - 0769c84615422d60f16925cd859593cdfa597f84) - if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then - ROM=GC_NMQ_NTSC_J - OTRNAME="oot.otr" - else - continue - fi - ;; - 2ce2d1a9f0534c9cd9fa04ea5317b80da21e5e73) - if [[ ! -e "$SHIP_HOME"/oot.otr ]]; then - ROM=GC_NMQ_NTSC_J_CE - OTRNAME="oot.otr" - else - continue - fi - ;; - dd14e143c4275861fe93ea79d0c02e36ae8c6c2f) - if [[ ! -e "$SHIP_HOME"/oot-mq.otr ]]; then - ROM=GC_MQ_NTSC_J - OTRNAME="oot-mq.otr" - else - continue - fi - ;; - *) - echo -e "\n$romfile - $ROMHASH rom hash does not match\n" - continue;; - esac - if [[ ! -e "$SHIP_HOME"/"$OTRNAME" ]]; then - if [ -n "$ZENITY" ]; then - (echo "# 25%"; echo "25"; sleep 2; echo "# 50%"; echo "50"; sleep 3; echo "# 75%"; echo "75"; sleep 2; echo "# 100%"; echo "100"; sleep 3) | - zenity --progress --title="OTR Generating..." --timeout=10 --percentage=0 --icon-name=soh --window-icon=soh.png --height=80 --width=400 & - else - echo "Processing..." - fi - assets/extractor/ZAPD.out ed -eh -i assets/extractor/xmls/"${ROM}" -b tmp/rom.z64 -fl assets/extractor/filelists -o placeholder -osf placeholder -gsf 1 -rconf assets/extractor/Config_"${ROM}".xml -se OTR --otrfile "${OTRNAME}" --portVer "@CMAKE_PROJECT_VERSION@" > /dev/null 2>&1 - cp "$ASSETDIR"/"$OTRNAME" "$SHIP_HOME" - fi - else - if [[ (! -e "$SHIP_HOME"/oot.otr) && (! -e "$SHIP_HOME"/oot-mq.otr) ]]; then - if [ -n "$ZENITY" ]; then - zenity --error --timeout=5 --text="Place ROM in $SHIP_HOME" --title="Missing ROM file" --width=500 --width=200 - else - echo -e "\nPlace ROM in this folder\n" - fi - exit - fi - fi - done - if [[ (! -e "$SHIP_HOME"/oot.otr) && (! -e "$SHIP_HOME"/oot-mq.otr) ]]; then - if [ -n "$ZENITY" ]; then - zenity --error --timeout=10 --text="No valid ROMs were provided, No OTR was generated." --title="Incorrect ROM file" --width=500 --width=200 - else - echo "No valid roms provided, no OTR was generated." - fi - rm -r "$ASSETDIR" - exit - else - (cd "$SHIP_BIN_DIR"; ./soh.elf) - exit - fi - rm -r "$ASSETDIR" -done - (cd "$SHIP_BIN_DIR"; ./soh.elf) -exit diff --git a/soh/CMakeLists.txt b/soh/CMakeLists.txt index 28d8774bf..508836819 100644 --- a/soh/CMakeLists.txt +++ b/soh/CMakeLists.txt @@ -594,21 +594,22 @@ endif() # Pre build events ################################################################################ if (CMAKE_GENERATOR MATCHES "Visual Studio") - set(VS_COPY_ASSETS_CMD ${CMAKE_COMMAND} -E copy_directory_if_different $/assets ${CMAKE_BINARY_DIR}/soh/assets) + add_custom_command( + TARGET ${PROJECT_NAME} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_SOURCE_DIR}/soh/assets/extractor ${CMAKE_BINARY_DIR}/soh/assets + COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_SOURCE_DIR}/soh/assets/xml ${CMAKE_BINARY_DIR}/soh/assets/xml + ) endif() if(NOT CMAKE_SYSTEM_NAME MATCHES "NintendoSwitch|CafeOS") add_custom_command( TARGET ${PROJECT_NAME} POST_BUILD COMMENT "Copying asset xmls..." - COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_SOURCE_DIR}/soh/assets/extractor $/assets/extractor - COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_SOURCE_DIR}/soh/assets/xml $/assets/extractor/xmls - COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_SOURCE_DIR}/OTRExporter/CFG/filelists $/assets/extractor/filelists - COMMAND ${CMAKE_COMMAND} -E make_directory $/assets/extractor/symbols - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/OTRExporter/CFG/ActorList_OoTMqDbg.txt $/assets/extractor/symbols - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/OTRExporter/CFG/ObjectList_OoTMqDbg.txt $/assets/extractor/symbols - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/OTRExporter/CFG/SymbolMap_OoTMqDbg.txt $/assets/extractor/symbols - COMMAND ${VS_COPY_ASSETS_CMD} + COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_SOURCE_DIR}/soh/assets/extractor $/assets + COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different ${CMAKE_SOURCE_DIR}/soh/assets/xml $/assets/xml + COMMAND ${CMAKE_COMMAND} -E make_directory $/assets/symbols + # COMMAND ${VS_COPY_ASSETS_CMD} ) endif() ################################################################################ @@ -694,11 +695,7 @@ endif() if (CMAKE_SYSTEM_NAME STREQUAL "Windows") INSTALL(FILES $ DESTINATION ./debug COMPONENT ship) -INSTALL(FILES ${CMAKE_BINARY_DIR}/soh/soh.otr DESTINATION . COMPONENT ship) -endif() - -if(CMAKE_SYSTEM_NAME STREQUAL "Linux") -configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/linux/appimage/soh.sh.in ${CMAKE_BINARY_DIR}/linux/soh.sh @ONLY) +INSTALL(FILES ${CMAKE_BINARY_DIR}/soh/soh.o2r DESTINATION . COMPONENT ship) endif() find_program(CURL NAMES curl DOC "Path to the curl program. Used to download files.") @@ -708,7 +705,7 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin") configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/macosx/Info.plist.in ${CMAKE_BINARY_DIR}/macosx/Info.plist @ONLY) INSTALL(TARGETS soh DESTINATION ../MacOS COMPONENT ship) INSTALL(FILES ${CMAKE_BINARY_DIR}/gamecontrollerdb.txt DESTINATION ../MacOS COMPONENT ship) -INSTALL(FILES ${CMAKE_BINARY_DIR}/soh/soh.otr DESTINATION ../Resources COMPONENT ship) +INSTALL(FILES ${CMAKE_BINARY_DIR}/soh/soh.o2r DESTINATION ../Resources COMPONENT ship) elseif(NOT "${CMAKE_SYSTEM_NAME}" MATCHES "NintendoSwitch|CafeOS") INSTALL(FILES ${CMAKE_BINARY_DIR}/gamecontrollerdb.txt DESTINATION . COMPONENT ship) endif() diff --git a/soh/assets/extractor/Config_GC_MQ_D.xml b/soh/assets/extractor/Config_GC_MQ_D.xml index 51e536292..9607bf02a 100644 --- a/soh/assets/extractor/Config_GC_MQ_D.xml +++ b/soh/assets/extractor/Config_GC_MQ_D.xml @@ -2,7 +2,7 @@ - + diff --git a/soh/assets/extractor/Config_GC_MQ_NTSC_J.xml b/soh/assets/extractor/Config_GC_MQ_NTSC_J.xml index 9e714df03..f476c161f 100644 --- a/soh/assets/extractor/Config_GC_MQ_NTSC_J.xml +++ b/soh/assets/extractor/Config_GC_MQ_NTSC_J.xml @@ -2,7 +2,7 @@ - + diff --git a/soh/assets/extractor/Config_GC_MQ_NTSC_U.xml b/soh/assets/extractor/Config_GC_MQ_NTSC_U.xml index e3baed50f..aa89e2d0f 100644 --- a/soh/assets/extractor/Config_GC_MQ_NTSC_U.xml +++ b/soh/assets/extractor/Config_GC_MQ_NTSC_U.xml @@ -2,7 +2,7 @@ - + diff --git a/soh/assets/extractor/Config_GC_MQ_PAL_F.xml b/soh/assets/extractor/Config_GC_MQ_PAL_F.xml index 7c5336995..5c5cf6617 100644 --- a/soh/assets/extractor/Config_GC_MQ_PAL_F.xml +++ b/soh/assets/extractor/Config_GC_MQ_PAL_F.xml @@ -2,7 +2,7 @@ - + diff --git a/soh/assets/extractor/Config_GC_NMQ_D.xml b/soh/assets/extractor/Config_GC_NMQ_D.xml index 7cc11ac18..3ea47f975 100644 --- a/soh/assets/extractor/Config_GC_NMQ_D.xml +++ b/soh/assets/extractor/Config_GC_NMQ_D.xml @@ -2,7 +2,7 @@ - + diff --git a/soh/assets/extractor/Config_GC_NMQ_NTSC_J.xml b/soh/assets/extractor/Config_GC_NMQ_NTSC_J.xml index a5fe09f12..72b925818 100644 --- a/soh/assets/extractor/Config_GC_NMQ_NTSC_J.xml +++ b/soh/assets/extractor/Config_GC_NMQ_NTSC_J.xml @@ -2,7 +2,7 @@ - + diff --git a/soh/assets/extractor/Config_GC_NMQ_NTSC_J_CE.xml b/soh/assets/extractor/Config_GC_NMQ_NTSC_J_CE.xml index 199030c69..b188b1162 100644 --- a/soh/assets/extractor/Config_GC_NMQ_NTSC_J_CE.xml +++ b/soh/assets/extractor/Config_GC_NMQ_NTSC_J_CE.xml @@ -2,7 +2,7 @@ - + diff --git a/soh/assets/extractor/Config_GC_NMQ_NTSC_U.xml b/soh/assets/extractor/Config_GC_NMQ_NTSC_U.xml index 5fa22a5b8..9bfb54700 100644 --- a/soh/assets/extractor/Config_GC_NMQ_NTSC_U.xml +++ b/soh/assets/extractor/Config_GC_NMQ_NTSC_U.xml @@ -2,7 +2,7 @@ - + diff --git a/soh/assets/extractor/Config_GC_NMQ_PAL_F.xml b/soh/assets/extractor/Config_GC_NMQ_PAL_F.xml index b98acfb00..066ac144c 100644 --- a/soh/assets/extractor/Config_GC_NMQ_PAL_F.xml +++ b/soh/assets/extractor/Config_GC_NMQ_PAL_F.xml @@ -2,7 +2,7 @@ - + diff --git a/soh/assets/extractor/Config_N64_NTSC_10.xml b/soh/assets/extractor/Config_N64_NTSC_10.xml index 6503480db..8beed9fec 100644 --- a/soh/assets/extractor/Config_N64_NTSC_10.xml +++ b/soh/assets/extractor/Config_N64_NTSC_10.xml @@ -2,7 +2,7 @@ - + diff --git a/soh/assets/extractor/Config_N64_NTSC_11.xml b/soh/assets/extractor/Config_N64_NTSC_11.xml index e69608bc2..6f7391649 100644 --- a/soh/assets/extractor/Config_N64_NTSC_11.xml +++ b/soh/assets/extractor/Config_N64_NTSC_11.xml @@ -2,7 +2,7 @@ - + diff --git a/soh/assets/extractor/Config_N64_NTSC_12.xml b/soh/assets/extractor/Config_N64_NTSC_12.xml index c72689ccb..650bf7573 100644 --- a/soh/assets/extractor/Config_N64_NTSC_12.xml +++ b/soh/assets/extractor/Config_N64_NTSC_12.xml @@ -2,7 +2,7 @@ - + diff --git a/soh/assets/extractor/Config_N64_PAL_10.xml b/soh/assets/extractor/Config_N64_PAL_10.xml index e4f85e362..1b8ba4af5 100644 --- a/soh/assets/extractor/Config_N64_PAL_10.xml +++ b/soh/assets/extractor/Config_N64_PAL_10.xml @@ -2,7 +2,7 @@ - + diff --git a/soh/assets/extractor/Config_N64_PAL_11.xml b/soh/assets/extractor/Config_N64_PAL_11.xml index ddc5f21d8..10463e3e6 100644 --- a/soh/assets/extractor/Config_N64_PAL_11.xml +++ b/soh/assets/extractor/Config_N64_PAL_11.xml @@ -2,7 +2,7 @@ - + diff --git a/soh/assets/extractor/filelists/dbg.txt b/soh/assets/extractor/filelists/dbg.txt new file mode 100644 index 000000000..68af5e557 --- /dev/null +++ b/soh/assets/extractor/filelists/dbg.txt @@ -0,0 +1,1532 @@ +makerom +boot +dmadata +Audiobank +Audioseq +Audiotable +link_animetion +icon_item_static +icon_item_24_static +icon_item_field_static +icon_item_dungeon_static +icon_item_gameover_static +icon_item_nes_static +icon_item_ger_static +icon_item_fra_static +item_name_static +map_name_static +do_action_static +message_static +message_texture_static +nes_font_static +nes_message_data_static +ger_message_data_static +fra_message_data_static +staff_message_data_static +map_grand_static +map_i_static +map_48x85_static +code +ovl_title +ovl_select +ovl_opening +ovl_file_choose +ovl_kaleido_scope +ovl_player_actor +ovl_map_mark_data +ovl_En_Test +ovl_Arms_Hook +ovl_Arrow_Fire +ovl_Arrow_Ice +ovl_Arrow_Light +ovl_Bg_Bdan_Objects +ovl_Bg_Bdan_Switch +ovl_Bg_Bom_Guard +ovl_Bg_Bombwall +ovl_Bg_Bowl_Wall +ovl_Bg_Breakwall +ovl_Bg_Ddan_Jd +ovl_Bg_Ddan_Kd +ovl_Bg_Dodoago +ovl_Bg_Dy_Yoseizo +ovl_Bg_Ganon_Otyuka +ovl_Bg_Gate_Shutter +ovl_Bg_Gjyo_Bridge +ovl_Bg_Gnd_Darkmeiro +ovl_Bg_Gnd_Firemeiro +ovl_Bg_Gnd_Iceblock +ovl_Bg_Gnd_Nisekabe +ovl_Bg_Gnd_Soulmeiro +ovl_Bg_Haka +ovl_Bg_Haka_Gate +ovl_Bg_Haka_Huta +ovl_Bg_Haka_Megane +ovl_Bg_Haka_MeganeBG +ovl_Bg_Haka_Sgami +ovl_Bg_Haka_Ship +ovl_Bg_Haka_Trap +ovl_Bg_Haka_Tubo +ovl_Bg_Haka_Water +ovl_Bg_Haka_Zou +ovl_Bg_Heavy_Block +ovl_Bg_Hidan_Curtain +ovl_Bg_Hidan_Dalm +ovl_Bg_Hidan_Firewall +ovl_Bg_Hidan_Fslift +ovl_Bg_Hidan_Fwbig +ovl_Bg_Hidan_Hamstep +ovl_Bg_Hidan_Hrock +ovl_Bg_Hidan_Kousi +ovl_Bg_Hidan_Kowarerukabe +ovl_Bg_Hidan_Rock +ovl_Bg_Hidan_Rsekizou +ovl_Bg_Hidan_Sekizou +ovl_Bg_Hidan_Sima +ovl_Bg_Hidan_Syoku +ovl_Bg_Ice_Objects +ovl_Bg_Ice_Shelter +ovl_Bg_Ice_Shutter +ovl_Bg_Ice_Turara +ovl_Bg_Ingate +ovl_Bg_Jya_1flift +ovl_Bg_Jya_Amishutter +ovl_Bg_Jya_Bigmirror +ovl_Bg_Jya_Block +ovl_Bg_Jya_Bombchuiwa +ovl_Bg_Jya_Bombiwa +ovl_Bg_Jya_Cobra +ovl_Bg_Jya_Goroiwa +ovl_Bg_Jya_Haheniron +ovl_Bg_Jya_Ironobj +ovl_Bg_Jya_Kanaami +ovl_Bg_Jya_Lift +ovl_Bg_Jya_Megami +ovl_Bg_Jya_Zurerukabe +ovl_Bg_Menkuri_Eye +ovl_Bg_Menkuri_Kaiten +ovl_Bg_Menkuri_Nisekabe +ovl_Bg_Mizu_Bwall +ovl_Bg_Mizu_Movebg +ovl_Bg_Mizu_Shutter +ovl_Bg_Mizu_Uzu +ovl_Bg_Mizu_Water +ovl_Bg_Mjin +ovl_Bg_Mori_Bigst +ovl_Bg_Mori_Elevator +ovl_Bg_Mori_Hashigo +ovl_Bg_Mori_Hashira4 +ovl_Bg_Mori_Hineri +ovl_Bg_Mori_Idomizu +ovl_Bg_Mori_Kaitenkabe +ovl_Bg_Mori_Rakkatenjo +ovl_Bg_Po_Event +ovl_Bg_Po_Syokudai +ovl_Bg_Pushbox +ovl_Bg_Relay_Objects +ovl_Bg_Spot00_Break +ovl_Bg_Spot00_Hanebasi +ovl_Bg_Spot01_Fusya +ovl_Bg_Spot01_Idohashira +ovl_Bg_Spot01_Idomizu +ovl_Bg_Spot01_Idosoko +ovl_Bg_Spot01_Objects2 +ovl_Bg_Spot02_Objects +ovl_Bg_Spot03_Taki +ovl_Bg_Spot05_Soko +ovl_Bg_Spot06_Objects +ovl_Bg_Spot07_Taki +ovl_Bg_Spot08_Bakudankabe +ovl_Bg_Spot08_Iceblock +ovl_Bg_Spot09_Obj +ovl_Bg_Spot11_Bakudankabe +ovl_Bg_Spot11_Oasis +ovl_Bg_Spot12_Gate +ovl_Bg_Spot12_Saku +ovl_Bg_Spot15_Rrbox +ovl_Bg_Spot15_Saku +ovl_Bg_Spot16_Bombstone +ovl_Bg_Spot16_Doughnut +ovl_Bg_Spot17_Bakudankabe +ovl_Bg_Spot17_Funen +ovl_Bg_Spot18_Basket +ovl_Bg_Spot18_Futa +ovl_Bg_Spot18_Obj +ovl_Bg_Spot18_Shutter +ovl_Bg_Sst_Floor +ovl_Bg_Toki_Hikari +ovl_Bg_Toki_Swd +ovl_Bg_Treemouth +ovl_Bg_Umajump +ovl_Bg_Vb_Sima +ovl_Bg_Ydan_Hasi +ovl_Bg_Ydan_Maruta +ovl_Bg_Ydan_Sp +ovl_Bg_Zg +ovl_Boss_Dodongo +ovl_Boss_Fd +ovl_Boss_Fd2 +ovl_Boss_Ganon +ovl_Boss_Ganon2 +ovl_Boss_Ganondrof +ovl_Boss_Goma +ovl_Boss_Mo +ovl_Boss_Sst +ovl_Boss_Tw +ovl_Boss_Va +ovl_Demo_6K +ovl_Demo_Du +ovl_Demo_Ec +ovl_Demo_Effect +ovl_Demo_Ext +ovl_Demo_Geff +ovl_Demo_Gj +ovl_Demo_Go +ovl_Demo_Gt +ovl_Demo_Ik +ovl_Demo_Im +ovl_Demo_Kankyo +ovl_Demo_Kekkai +ovl_Demo_Sa +ovl_Demo_Shd +ovl_Demo_Tre_Lgt +ovl_Door_Ana +ovl_Door_Gerudo +ovl_Door_Killer +ovl_Door_Shutter +ovl_Door_Toki +ovl_Door_Warp1 +ovl_Efc_Erupc +ovl_Eff_Dust +ovl_Effect_Ss_Blast +ovl_Effect_Ss_Bomb +ovl_Effect_Ss_Bomb2 +ovl_Effect_Ss_Bubble +ovl_Effect_Ss_D_Fire +ovl_Effect_Ss_Dead_Db +ovl_Effect_Ss_Dead_Dd +ovl_Effect_Ss_Dead_Ds +ovl_Effect_Ss_Dead_Sound +ovl_Effect_Ss_Dt_Bubble +ovl_Effect_Ss_Dust +ovl_Effect_Ss_En_Fire +ovl_Effect_Ss_En_Ice +ovl_Effect_Ss_Extra +ovl_Effect_Ss_Fcircle +ovl_Effect_Ss_Fhg_Flash +ovl_Effect_Ss_Fire_Tail +ovl_Effect_Ss_G_Fire +ovl_Effect_Ss_G_Magma +ovl_Effect_Ss_G_Magma2 +ovl_Effect_Ss_G_Ripple +ovl_Effect_Ss_G_Spk +ovl_Effect_Ss_G_Splash +ovl_Effect_Ss_Hahen +ovl_Effect_Ss_HitMark +ovl_Effect_Ss_Ice_Piece +ovl_Effect_Ss_Ice_Smoke +ovl_Effect_Ss_K_Fire +ovl_Effect_Ss_Kakera +ovl_Effect_Ss_KiraKira +ovl_Effect_Ss_Lightning +ovl_Effect_Ss_Sibuki +ovl_Effect_Ss_Sibuki2 +ovl_Effect_Ss_Solder_Srch_Ball +ovl_Effect_Ss_Stick +ovl_Effect_Ss_Stone1 +ovl_Elf_Msg +ovl_Elf_Msg2 +ovl_En_Am +ovl_En_Ani +ovl_En_Anubice +ovl_En_Anubice_Fire +ovl_En_Anubice_Tag +ovl_En_Arow_Trap +ovl_En_Arrow +ovl_En_Attack_Niw +ovl_En_Ba +ovl_En_Bb +ovl_En_Bdfire +ovl_En_Bigokuta +ovl_En_Bili +ovl_En_Bird +ovl_En_Blkobj +ovl_En_Bom +ovl_En_Bom_Bowl_Man +ovl_En_Bom_Bowl_Pit +ovl_En_Bom_Chu +ovl_En_Bombf +ovl_En_Boom +ovl_En_Box +ovl_En_Brob +ovl_En_Bubble +ovl_En_Butte +ovl_En_Bw +ovl_En_Bx +ovl_En_Changer +ovl_En_Clear_Tag +ovl_En_Cow +ovl_En_Crow +ovl_En_Cs +ovl_En_Daiku +ovl_En_Daiku_Kakariko +ovl_En_Dekubaba +ovl_En_Dekunuts +ovl_En_Dh +ovl_En_Dha +ovl_En_Diving_Game +ovl_En_Dns +ovl_En_Dnt_Demo +ovl_En_Dnt_Jiji +ovl_En_Dnt_Nomal +ovl_En_Dodojr +ovl_En_Dodongo +ovl_En_Dog +ovl_En_Door +ovl_En_Ds +ovl_En_Du +ovl_En_Dy_Extra +ovl_En_Eg +ovl_En_Eiyer +ovl_En_Elf +ovl_En_Encount1 +ovl_En_Encount2 +ovl_En_Ex_Item +ovl_En_Ex_Ruppy +ovl_En_Fd +ovl_En_Fd_Fire +ovl_En_Fhg_Fire +ovl_En_Fire_Rock +ovl_En_Firefly +ovl_En_Fish +ovl_En_Floormas +ovl_En_Fr +ovl_En_Fu +ovl_En_Fw +ovl_En_Fz +ovl_En_G_Switch +ovl_En_Ganon_Mant +ovl_En_Ganon_Organ +ovl_En_Gb +ovl_En_Ge1 +ovl_En_Ge2 +ovl_En_Ge3 +ovl_En_GeldB +ovl_En_GirlA +ovl_En_Gm +ovl_En_Go +ovl_En_Go2 +ovl_En_Goma +ovl_En_Goroiwa +ovl_En_Gs +ovl_En_Guest +ovl_En_Hata +ovl_En_Heishi1 +ovl_En_Heishi2 +ovl_En_Heishi3 +ovl_En_Heishi4 +ovl_En_Hintnuts +ovl_En_Holl +ovl_En_Honotrap +ovl_En_Horse +ovl_En_Horse_Game_Check +ovl_En_Horse_Ganon +ovl_En_Horse_Link_Child +ovl_En_Horse_Normal +ovl_En_Horse_Zelda +ovl_En_Hs +ovl_En_Hs2 +ovl_En_Hy +ovl_En_Ice_Hono +ovl_En_Ik +ovl_En_In +ovl_En_Insect +ovl_En_Ishi +ovl_En_It +ovl_En_Jj +ovl_En_Js +ovl_En_Jsjutan +ovl_En_Kakasi +ovl_En_Kakasi2 +ovl_En_Kakasi3 +ovl_En_Kanban +ovl_En_Karebaba +ovl_En_Ko +ovl_En_Kusa +ovl_En_Kz +ovl_En_Light +ovl_En_Lightbox +ovl_En_M_Fire1 +ovl_En_M_Thunder +ovl_En_Ma1 +ovl_En_Ma2 +ovl_En_Ma3 +ovl_En_Mag +ovl_En_Mb +ovl_En_Md +ovl_En_Mk +ovl_En_Mm +ovl_En_Mm2 +ovl_En_Ms +ovl_En_Mu +ovl_En_Nb +ovl_En_Niw +ovl_En_Niw_Girl +ovl_En_Niw_Lady +ovl_En_Nutsball +ovl_En_Nwc +ovl_En_Ny +ovl_En_OE2 +ovl_En_Okarina_Effect +ovl_En_Okarina_Tag +ovl_En_Okuta +ovl_En_Ossan +ovl_En_Owl +ovl_En_Part +ovl_En_Peehat +ovl_En_Po_Desert +ovl_En_Po_Field +ovl_En_Po_Relay +ovl_En_Po_Sisters +ovl_En_Poh +ovl_En_Pu_box +ovl_En_Rd +ovl_En_Reeba +ovl_En_River_Sound +ovl_En_Rl +ovl_En_Rr +ovl_En_Ru1 +ovl_En_Ru2 +ovl_En_Sa +ovl_En_Sb +ovl_En_Scene_Change +ovl_En_Sda +ovl_En_Shopnuts +ovl_En_Si +ovl_En_Siofuki +ovl_En_Skb +ovl_En_Skj +ovl_En_Skjneedle +ovl_En_Ssh +ovl_En_St +ovl_En_Sth +ovl_En_Stream +ovl_En_Sw +ovl_En_Syateki_Itm +ovl_En_Syateki_Man +ovl_En_Syateki_Niw +ovl_En_Ta +ovl_En_Takara_Man +ovl_En_Tana +ovl_En_Tg +ovl_En_Tite +ovl_En_Tk +ovl_En_Torch +ovl_En_Torch2 +ovl_En_Toryo +ovl_En_Tp +ovl_En_Tr +ovl_En_Trap +ovl_En_Tubo_Trap +ovl_En_Vali +ovl_En_Vase +ovl_En_Vb_Ball +ovl_En_Viewer +ovl_En_Vm +ovl_En_Wall_Tubo +ovl_En_Wallmas +ovl_En_Weather_Tag +ovl_En_Weiyer +ovl_En_Wf +ovl_En_Wonder_Item +ovl_En_Wonder_Talk +ovl_En_Wonder_Talk2 +ovl_En_Wood02 +ovl_En_Xc +ovl_En_Yabusame_Mark +ovl_En_Yukabyun +ovl_En_Zf +ovl_En_Zl1 +ovl_En_Zl2 +ovl_En_Zl3 +ovl_En_Zl4 +ovl_En_Zo +ovl_En_fHG +ovl_End_Title +ovl_Fishing +ovl_Item_B_Heart +ovl_Item_Etcetera +ovl_Item_Inbox +ovl_Item_Ocarina +ovl_Item_Shield +ovl_Magic_Dark +ovl_Magic_Fire +ovl_Magic_Wind +ovl_Mir_Ray +ovl_Obj_Bean +ovl_Obj_Blockstop +ovl_Obj_Bombiwa +ovl_Obj_Comb +ovl_Obj_Dekujr +ovl_Obj_Elevator +ovl_Obj_Hamishi +ovl_Obj_Hana +ovl_Obj_Hsblock +ovl_Obj_Ice_Poly +ovl_Obj_Kibako +ovl_Obj_Kibako2 +ovl_Obj_Lift +ovl_Obj_Lightswitch +ovl_Obj_Makekinsuta +ovl_Obj_Makeoshihiki +ovl_Obj_Mure +ovl_Obj_Mure2 +ovl_Obj_Mure3 +ovl_Obj_Oshihiki +ovl_Obj_Roomtimer +ovl_Obj_Switch +ovl_Obj_Syokudai +ovl_Obj_Timeblock +ovl_Obj_Tsubo +ovl_Obj_Warp2block +ovl_Object_Kankyo +ovl_Oceff_Spot +ovl_Oceff_Storm +ovl_Oceff_Wipe +ovl_Oceff_Wipe2 +ovl_Oceff_Wipe3 +ovl_Oceff_Wipe4 +ovl_Shot_Sun +gameplay_keep +gameplay_field_keep +gameplay_dangeon_keep +gameplay_object_exchange_static +object_link_boy +object_link_child +object_box +object_human +object_okuta +object_poh +object_wallmaster +object_dy_obj +object_firefly +object_dodongo +object_fire +object_niw +object_tite +object_reeba +object_peehat +object_kingdodongo +object_horse +object_zf +object_goma +object_zl1 +object_gol +object_bubble +object_dodojr +object_torch2 +object_bl +object_tp +object_oA1 +object_st +object_bw +object_ei +object_horse_normal +object_oB1 +object_o_anime +object_spot04_objects +object_ddan_objects +object_hidan_objects +object_horse_ganon +object_oA2 +object_spot00_objects +object_mb +object_bombf +object_sk2 +object_oE1 +object_oE_anime +object_oE2 +object_ydan_objects +object_gnd +object_am +object_dekubaba +object_oA3 +object_oA4 +object_oA5 +object_oA6 +object_oA7 +object_jj +object_oA8 +object_oA9 +object_oB2 +object_oB3 +object_oB4 +object_horse_zelda +object_opening_demo1 +object_warp1 +object_b_heart +object_dekunuts +object_oE3 +object_oE4 +object_menkuri_objects +object_oE5 +object_oE6 +object_oE7 +object_oE8 +object_oE9 +object_oE10 +object_oE11 +object_oE12 +object_vali +object_oA10 +object_oA11 +object_mizu_objects +object_fhg +object_ossan +object_mori_hineri1 +object_Bb +object_toki_objects +object_yukabyun +object_zl2 +object_mjin +object_mjin_flash +object_mjin_dark +object_mjin_flame +object_mjin_ice +object_mjin_soul +object_mjin_wind +object_mjin_oka +object_haka_objects +object_spot06_objects +object_ice_objects +object_relay_objects +object_mori_hineri1a +object_mori_hineri2 +object_mori_hineri2a +object_mori_objects +object_mori_tex +object_spot08_obj +object_warp2 +object_hata +object_bird +object_wood02 +object_lightbox +object_pu_box +object_trap +object_vase +object_im +object_ta +object_tk +object_xc +object_vm +object_bv +object_hakach_objects +object_efc_crystal_light +object_efc_fire_ball +object_efc_flash +object_efc_lgt_shower +object_efc_star_field +object_god_lgt +object_light_ring +object_triforce_spot +object_medal +object_bdan_objects +object_sd +object_rd +object_po_sisters +object_heavy_object +object_gndd +object_fd +object_du +object_fw +object_horse_link_child +object_spot02_objects +object_haka +object_ru1 +object_syokudai +object_fd2 +object_dh +object_rl +object_efc_tw +object_demo_tre_lgt +object_gi_key +object_mir_ray +object_brob +object_gi_jewel +object_spot09_obj +object_spot18_obj +object_bdoor +object_spot17_obj +object_shop_dungen +object_nb +object_mo +object_sb +object_gi_melody +object_gi_heart +object_gi_compass +object_gi_bosskey +object_gi_medal +object_gi_nuts +object_sa +object_gi_hearts +object_gi_arrowcase +object_gi_bombpouch +object_in +object_tr +object_spot16_obj +object_oE1s +object_oE4s +object_os_anime +object_gi_bottle +object_gi_stick +object_gi_map +object_oF1d_map +object_ru2 +object_gi_shield_1 +object_dekujr +object_gi_magicpot +object_gi_bomb_1 +object_oF1s +object_ma2 +object_gi_purse +object_hni +object_tw +object_rr +object_bxa +object_anubice +object_gi_gerudo +object_gi_arrow +object_gi_bomb_2 +object_gi_egg +object_gi_scale +object_gi_shield_2 +object_gi_hookshot +object_gi_ocarina +object_gi_milk +object_ma1 +object_ganon +object_sst +object_ny +object_fr +object_gi_pachinko +object_gi_boomerang +object_gi_bow +object_gi_glasses +object_gi_liquid +object_ani +object_demo_6k +object_gi_shield_3 +object_gi_letter +object_spot15_obj +object_jya_obj +object_gi_clothes +object_gi_bean +object_gi_fish +object_gi_saw +object_gi_hammer +object_gi_grass +object_gi_longsword +object_spot01_objects +object_md +object_km1 +object_kw1 +object_zo +object_kz +object_umajump +object_masterkokiri +object_masterkokirihead +object_mastergolon +object_masterzoora +object_aob +object_ik +object_ahg +object_cne +object_gi_niwatori +object_skj +object_gi_bottle_letter +object_bji +object_bba +object_gi_ocarina_0 +object_ds +object_ane +object_boj +object_spot03_object +object_spot07_object +object_fz +object_bob +object_ge1 +object_yabusame_point +object_gi_boots_2 +object_gi_seed +object_gnd_magic +object_d_elevator +object_d_hsblock +object_d_lift +object_mamenoki +object_goroiwa +object_toryo +object_daiku +object_nwc +object_blkobj +object_gm +object_ms +object_hs +object_ingate +object_lightswitch +object_kusa +object_tsubo +object_gi_gloves +object_gi_coin +object_kanban +object_gjyo_objects +object_owl +object_mk +object_fu +object_gi_ki_tan_mask +object_gi_redead_mask +object_gi_skj_mask +object_gi_rabit_mask +object_gi_truth_mask +object_ganon_objects +object_siofuki +object_stream +object_mm +object_fa +object_os +object_gi_eye_lotion +object_gi_powder +object_gi_mushroom +object_gi_ticketstone +object_gi_brokensword +object_js +object_cs +object_gi_prescription +object_gi_bracelet +object_gi_soldout +object_gi_frog +object_mag +object_door_gerudo +object_gt +object_efc_erupc +object_zl2_anime1 +object_zl2_anime2 +object_gi_golonmask +object_gi_zoramask +object_gi_gerudomask +object_ganon2 +object_ka +object_ts +object_zg +object_gi_hoverboots +object_gi_m_arrow +object_ds2 +object_ec +object_fish +object_gi_sutaru +object_gi_goddess +object_ssh +object_bigokuta +object_bg +object_spot05_objects +object_spot12_obj +object_bombiwa +object_hintnuts +object_rs +object_spot00_break +object_gla +object_shopnuts +object_geldb +object_gr +object_dog +object_jya_iron +object_jya_door +object_spot01_objects2 +object_spot11_obj +object_kibako2 +object_dns +object_dnk +object_gi_fire +object_gi_insect +object_gi_butterfly +object_gi_ghost +object_gi_soul +object_bowl +object_po_field +object_demo_kekkai +object_efc_doughnut +object_gi_dekupouch +object_ganon_anime1 +object_ganon_anime2 +object_ganon_anime3 +object_gi_rupy +object_spot01_matoya +object_spot01_matoyab +object_po_composer +object_mu +object_wf +object_skb +object_gj +object_geff +object_haka_door +object_gs +object_ps +object_bwall +object_crow +object_cow +object_cob +object_gi_sword_1 +object_door_killer +object_ouke_haka +object_timeblock +object_zl4 +g_pn_01 +g_pn_02 +g_pn_03 +g_pn_04 +g_pn_05 +g_pn_06 +g_pn_07 +g_pn_08 +g_pn_09 +g_pn_10 +g_pn_11 +g_pn_12 +g_pn_13 +g_pn_14 +g_pn_15 +g_pn_16 +g_pn_17 +g_pn_18 +g_pn_19 +g_pn_20 +g_pn_21 +g_pn_22 +g_pn_23 +g_pn_24 +g_pn_25 +g_pn_26 +g_pn_27 +g_pn_28 +g_pn_29 +g_pn_30 +g_pn_31 +g_pn_32 +g_pn_33 +g_pn_34 +g_pn_35 +g_pn_36 +g_pn_37 +g_pn_38 +g_pn_39 +g_pn_40 +g_pn_41 +g_pn_42 +g_pn_43 +g_pn_44 +g_pn_45 +g_pn_46 +g_pn_47 +g_pn_48 +g_pn_49 +g_pn_50 +g_pn_51 +g_pn_52 +g_pn_53 +g_pn_54 +g_pn_55 +g_pn_56 +g_pn_57 +z_select_static +nintendo_rogo_static +title_static +parameter_static +vr_fine0_static +vr_fine0_pal_static +vr_fine1_static +vr_fine1_pal_static +vr_fine2_static +vr_fine2_pal_static +vr_fine3_static +vr_fine3_pal_static +vr_cloud0_static +vr_cloud0_pal_static +vr_cloud1_static +vr_cloud1_pal_static +vr_cloud2_static +vr_cloud2_pal_static +vr_cloud3_static +vr_cloud3_pal_static +vr_holy0_static +vr_holy0_pal_static +vr_holy1_static +vr_holy1_pal_static +vr_MDVR_static +vr_MDVR_pal_static +vr_MNVR_static +vr_MNVR_pal_static +vr_RUVR_static +vr_RUVR_pal_static +vr_LHVR_static +vr_LHVR_pal_static +vr_KHVR_static +vr_KHVR_pal_static +vr_K3VR_static +vr_K3VR_pal_static +vr_K4VR_static +vr_K4VR_pal_static +vr_K5VR_static +vr_K5VR_pal_static +vr_SP1a_static +vr_SP1a_pal_static +vr_MLVR_static +vr_MLVR_pal_static +vr_KKRVR_static +vr_KKRVR_pal_static +vr_KR3VR_static +vr_KR3VR_pal_static +vr_IPVR_static +vr_IPVR_pal_static +vr_KSVR_static +vr_KSVR_pal_static +vr_GLVR_static +vr_GLVR_pal_static +vr_ZRVR_static +vr_ZRVR_pal_static +vr_DGVR_static +vr_DGVR_pal_static +vr_ALVR_static +vr_ALVR_pal_static +vr_NSVR_static +vr_NSVR_pal_static +vr_LBVR_static +vr_LBVR_pal_static +vr_TTVR_static +vr_TTVR_pal_static +vr_FCVR_static +vr_FCVR_pal_static +elf_message_field +elf_message_ydan +syotes_scene +syotes_room_0 +syotes2_scene +syotes2_room_0 +depth_test_scene +depth_test_room_0 +spot00_scene +spot00_room_0 +spot01_scene +spot01_room_0 +spot02_scene +spot02_room_0 +spot02_room_1 +spot03_scene +spot03_room_0 +spot03_room_1 +spot04_scene +spot04_room_0 +spot04_room_1 +spot04_room_2 +spot05_scene +spot05_room_0 +spot06_scene +spot06_room_0 +spot07_scene +spot07_room_0 +spot07_room_1 +spot08_scene +spot08_room_0 +spot09_scene +spot09_room_0 +spot10_scene +spot10_room_0 +spot10_room_1 +spot10_room_2 +spot10_room_3 +spot10_room_4 +spot10_room_5 +spot10_room_6 +spot10_room_7 +spot10_room_8 +spot10_room_9 +spot11_scene +spot11_room_0 +spot12_scene +spot12_room_0 +spot12_room_1 +spot13_scene +spot13_room_0 +spot13_room_1 +spot15_scene +spot15_room_0 +spot16_scene +spot16_room_0 +spot17_scene +spot17_room_0 +spot17_room_1 +spot18_scene +spot18_room_0 +spot18_room_1 +spot18_room_2 +spot18_room_3 +ydan_scene +ydan_room_0 +ydan_room_1 +ydan_room_2 +ydan_room_3 +ydan_room_4 +ydan_room_5 +ydan_room_6 +ydan_room_7 +ydan_room_8 +ydan_room_9 +ydan_room_10 +ydan_room_11 +ddan_scene +ddan_room_0 +ddan_room_1 +ddan_room_2 +ddan_room_3 +ddan_room_4 +ddan_room_5 +ddan_room_6 +ddan_room_7 +ddan_room_8 +ddan_room_9 +ddan_room_10 +ddan_room_11 +ddan_room_12 +ddan_room_13 +ddan_room_14 +ddan_room_15 +ddan_room_16 +bdan_scene +bdan_room_0 +bdan_room_1 +bdan_room_2 +bdan_room_3 +bdan_room_4 +bdan_room_5 +bdan_room_6 +bdan_room_7 +bdan_room_8 +bdan_room_9 +bdan_room_10 +bdan_room_11 +bdan_room_12 +bdan_room_13 +bdan_room_14 +bdan_room_15 +Bmori1_scene +Bmori1_room_0 +Bmori1_room_1 +Bmori1_room_2 +Bmori1_room_3 +Bmori1_room_4 +Bmori1_room_5 +Bmori1_room_6 +Bmori1_room_7 +Bmori1_room_8 +Bmori1_room_9 +Bmori1_room_10 +Bmori1_room_11 +Bmori1_room_12 +Bmori1_room_13 +Bmori1_room_14 +Bmori1_room_15 +Bmori1_room_16 +Bmori1_room_17 +Bmori1_room_18 +Bmori1_room_19 +Bmori1_room_20 +Bmori1_room_21 +Bmori1_room_22 +HIDAN_scene +HIDAN_room_0 +HIDAN_room_1 +HIDAN_room_2 +HIDAN_room_3 +HIDAN_room_4 +HIDAN_room_5 +HIDAN_room_6 +HIDAN_room_7 +HIDAN_room_8 +HIDAN_room_9 +HIDAN_room_10 +HIDAN_room_11 +HIDAN_room_12 +HIDAN_room_13 +HIDAN_room_14 +HIDAN_room_15 +HIDAN_room_16 +HIDAN_room_17 +HIDAN_room_18 +HIDAN_room_19 +HIDAN_room_20 +HIDAN_room_21 +HIDAN_room_22 +HIDAN_room_23 +HIDAN_room_24 +HIDAN_room_25 +HIDAN_room_26 +MIZUsin_scene +MIZUsin_room_0 +MIZUsin_room_1 +MIZUsin_room_2 +MIZUsin_room_3 +MIZUsin_room_4 +MIZUsin_room_5 +MIZUsin_room_6 +MIZUsin_room_7 +MIZUsin_room_8 +MIZUsin_room_9 +MIZUsin_room_10 +MIZUsin_room_11 +MIZUsin_room_12 +MIZUsin_room_13 +MIZUsin_room_14 +MIZUsin_room_15 +MIZUsin_room_16 +MIZUsin_room_17 +MIZUsin_room_18 +MIZUsin_room_19 +MIZUsin_room_20 +MIZUsin_room_21 +MIZUsin_room_22 +jyasinzou_scene +jyasinzou_room_0 +jyasinzou_room_1 +jyasinzou_room_2 +jyasinzou_room_3 +jyasinzou_room_4 +jyasinzou_room_5 +jyasinzou_room_6 +jyasinzou_room_7 +jyasinzou_room_8 +jyasinzou_room_9 +jyasinzou_room_10 +jyasinzou_room_11 +jyasinzou_room_12 +jyasinzou_room_13 +jyasinzou_room_14 +jyasinzou_room_15 +jyasinzou_room_16 +jyasinzou_room_17 +jyasinzou_room_18 +jyasinzou_room_19 +jyasinzou_room_20 +jyasinzou_room_21 +jyasinzou_room_22 +jyasinzou_room_23 +jyasinzou_room_24 +jyasinzou_room_25 +jyasinzou_room_26 +jyasinzou_room_27 +jyasinzou_room_28 +HAKAdan_scene +HAKAdan_room_0 +HAKAdan_room_1 +HAKAdan_room_2 +HAKAdan_room_3 +HAKAdan_room_4 +HAKAdan_room_5 +HAKAdan_room_6 +HAKAdan_room_7 +HAKAdan_room_8 +HAKAdan_room_9 +HAKAdan_room_10 +HAKAdan_room_11 +HAKAdan_room_12 +HAKAdan_room_13 +HAKAdan_room_14 +HAKAdan_room_15 +HAKAdan_room_16 +HAKAdan_room_17 +HAKAdan_room_18 +HAKAdan_room_19 +HAKAdan_room_20 +HAKAdan_room_21 +HAKAdan_room_22 +HAKAdanCH_scene +HAKAdanCH_room_0 +HAKAdanCH_room_1 +HAKAdanCH_room_2 +HAKAdanCH_room_3 +HAKAdanCH_room_4 +HAKAdanCH_room_5 +HAKAdanCH_room_6 +ice_doukutu_scene +ice_doukutu_room_0 +ice_doukutu_room_1 +ice_doukutu_room_2 +ice_doukutu_room_3 +ice_doukutu_room_4 +ice_doukutu_room_5 +ice_doukutu_room_6 +ice_doukutu_room_7 +ice_doukutu_room_8 +ice_doukutu_room_9 +ice_doukutu_room_10 +ice_doukutu_room_11 +men_scene +men_room_0 +men_room_1 +men_room_2 +men_room_3 +men_room_4 +men_room_5 +men_room_6 +men_room_7 +men_room_8 +men_room_9 +men_room_10 +ganontika_scene +ganontika_room_0 +ganontika_room_1 +ganontika_room_2 +ganontika_room_3 +ganontika_room_4 +ganontika_room_5 +ganontika_room_6 +ganontika_room_7 +ganontika_room_8 +ganontika_room_9 +ganontika_room_10 +ganontika_room_11 +ganontika_room_12 +ganontika_room_13 +ganontika_room_14 +ganontika_room_15 +ganontika_room_16 +ganontika_room_17 +ganontika_room_18 +ganontika_room_19 +market_day_scene +market_day_room_0 +market_night_scene +market_night_room_0 +testroom_scene +testroom_room_0 +testroom_room_1 +testroom_room_2 +testroom_room_3 +testroom_room_4 +kenjyanoma_scene +kenjyanoma_room_0 +tokinoma_scene +tokinoma_room_0 +tokinoma_room_1 +sutaru_scene +sutaru_room_0 +link_home_scene +link_home_room_0 +kokiri_shop_scene +kokiri_shop_room_0 +kokiri_home_scene +kokiri_home_room_0 +kakusiana_scene +kakusiana_room_0 +kakusiana_room_1 +kakusiana_room_2 +kakusiana_room_3 +kakusiana_room_4 +kakusiana_room_5 +kakusiana_room_6 +kakusiana_room_7 +kakusiana_room_8 +kakusiana_room_9 +kakusiana_room_10 +kakusiana_room_11 +kakusiana_room_12 +kakusiana_room_13 +entra_scene +entra_room_0 +moribossroom_scene +moribossroom_room_0 +moribossroom_room_1 +syatekijyou_scene +syatekijyou_room_0 +shop1_scene +shop1_room_0 +hairal_niwa_scene +hairal_niwa_room_0 +ganon_tou_scene +ganon_tou_room_0 +sasatest_scene +sasatest_room_0 +market_alley_scene +market_alley_room_0 +spot20_scene +spot20_room_0 +market_ruins_scene +market_ruins_room_0 +entra_n_scene +entra_n_room_0 +enrui_scene +enrui_room_0 +market_alley_n_scene +market_alley_n_room_0 +hiral_demo_scene +hiral_demo_room_0 +kokiri_home3_scene +kokiri_home3_room_0 +malon_stable_scene +malon_stable_room_0 +kakariko_scene +kakariko_room_0 +bdan_boss_scene +bdan_boss_room_0 +bdan_boss_room_1 +FIRE_bs_scene +FIRE_bs_room_0 +FIRE_bs_room_1 +hut_scene +hut_room_0 +daiyousei_izumi_scene +daiyousei_izumi_room_0 +hakaana_scene +hakaana_room_0 +yousei_izumi_tate_scene +yousei_izumi_tate_room_0 +yousei_izumi_yoko_scene +yousei_izumi_yoko_room_0 +golon_scene +golon_room_0 +zoora_scene +zoora_room_0 +drag_scene +drag_room_0 +alley_shop_scene +alley_shop_room_0 +night_shop_scene +night_shop_room_0 +impa_scene +impa_room_0 +labo_scene +labo_room_0 +tent_scene +tent_room_0 +nakaniwa_scene +nakaniwa_room_0 +ddan_boss_scene +ddan_boss_room_0 +ddan_boss_room_1 +ydan_boss_scene +ydan_boss_room_0 +ydan_boss_room_1 +HAKAdan_bs_scene +HAKAdan_bs_room_0 +HAKAdan_bs_room_1 +MIZUsin_bs_scene +MIZUsin_bs_room_0 +MIZUsin_bs_room_1 +ganon_scene +ganon_room_0 +ganon_room_1 +ganon_room_2 +ganon_room_3 +ganon_room_4 +ganon_room_5 +ganon_room_6 +ganon_room_7 +ganon_room_8 +ganon_room_9 +ganon_boss_scene +ganon_boss_room_0 +jyasinboss_scene +jyasinboss_room_0 +jyasinboss_room_1 +jyasinboss_room_2 +jyasinboss_room_3 +kokiri_home4_scene +kokiri_home4_room_0 +kokiri_home5_scene +kokiri_home5_room_0 +ganon_final_scene +ganon_final_room_0 +kakariko3_scene +kakariko3_room_0 +hairal_niwa2_scene +hairal_niwa2_room_0 +hakasitarelay_scene +hakasitarelay_room_0 +hakasitarelay_room_1 +hakasitarelay_room_2 +hakasitarelay_room_3 +hakasitarelay_room_4 +hakasitarelay_room_5 +hakasitarelay_room_6 +shrine_scene +shrine_room_0 +turibori_scene +turibori_room_0 +shrine_n_scene +shrine_n_room_0 +shrine_r_scene +shrine_r_room_0 +hakaana2_scene +hakaana2_room_0 +gerudoway_scene +gerudoway_room_0 +gerudoway_room_1 +gerudoway_room_2 +gerudoway_room_3 +gerudoway_room_4 +gerudoway_room_5 +hairal_niwa_n_scene +hairal_niwa_n_room_0 +bowling_scene +bowling_room_0 +hakaana_ouke_scene +hakaana_ouke_room_0 +hakaana_ouke_room_1 +hakaana_ouke_room_2 +hylia_labo_scene +hylia_labo_room_0 +souko_scene +souko_room_0 +souko_room_1 +souko_room_2 +miharigoya_scene +miharigoya_room_0 +mahouya_scene +mahouya_room_0 +takaraya_scene +takaraya_room_0 +takaraya_room_1 +takaraya_room_2 +takaraya_room_3 +takaraya_room_4 +takaraya_room_5 +takaraya_room_6 +ganon_sonogo_scene +ganon_sonogo_room_0 +ganon_sonogo_room_1 +ganon_sonogo_room_2 +ganon_sonogo_room_3 +ganon_sonogo_room_4 +ganon_demo_scene +ganon_demo_room_0 +besitu_scene +besitu_room_0 +face_shop_scene +face_shop_room_0 +kinsuta_scene +kinsuta_room_0 +ganontikasonogo_scene +ganontikasonogo_room_0 +ganontikasonogo_room_1 +test01_scene +test01_room_0 +bump_texture_static +anime_model_1_static +anime_model_2_static +anime_model_3_static +anime_model_4_static +anime_model_5_static +anime_model_6_static +anime_texture_1_static +anime_texture_2_static +anime_texture_3_static +anime_texture_4_static +anime_texture_5_static +anime_texture_6_static +softsprite_matrix_static \ No newline at end of file diff --git a/soh/assets/extractor/filelists/gamecube.txt b/soh/assets/extractor/filelists/gamecube.txt new file mode 100644 index 000000000..23794e1f6 --- /dev/null +++ b/soh/assets/extractor/filelists/gamecube.txt @@ -0,0 +1,1509 @@ +makerom +boot +dmadata +Audiobank +Audioseq +Audiotable +kanji +link_animetion +icon_item_static +icon_item_24_static +icon_item_field_static +icon_item_dungeon_static +icon_item_gameover_static +icon_item_jpn_static +icon_item_nes_static +item_name_static +map_name_static +do_action_static +message_static +message_texture_static +nes_font_static +jpn_message_data_static +nes_message_data_static +staff_message_data_static +map_grand_static +map_48x85_static +map_i_static +code +ovl_title +ovl_select +ovl_opening +ovl_file_choose +ovl_kaleido_scope +ovl_player_actor +ovl_map_mark_data +ovl_En_Test +ovl_Arms_Hook +ovl_Arrow_Fire +ovl_Arrow_Ice +ovl_Arrow_Light +ovl_Bg_Bdan_Objects +ovl_Bg_Bdan_Switch +ovl_Bg_Bom_Guard +ovl_Bg_Bombwall +ovl_Bg_Bowl_Wall +ovl_Bg_Breakwall +ovl_Bg_Ddan_Jd +ovl_Bg_Ddan_Kd +ovl_Bg_Dodoago +ovl_Bg_Dy_Yoseizo +ovl_Bg_Ganon_Otyuka +ovl_Bg_Gate_Shutter +ovl_Bg_Gjyo_Bridge +ovl_Bg_Gnd_Darkmeiro +ovl_Bg_Gnd_Firemeiro +ovl_Bg_Gnd_Iceblock +ovl_Bg_Gnd_Nisekabe +ovl_Bg_Gnd_Soulmeiro +ovl_Bg_Haka +ovl_Bg_Haka_Gate +ovl_Bg_Haka_Huta +ovl_Bg_Haka_Megane +ovl_Bg_Haka_MeganeBG +ovl_Bg_Haka_Sgami +ovl_Bg_Haka_Ship +ovl_Bg_Haka_Trap +ovl_Bg_Haka_Tubo +ovl_Bg_Haka_Water +ovl_Bg_Haka_Zou +ovl_Bg_Heavy_Block +ovl_Bg_Hidan_Curtain +ovl_Bg_Hidan_Dalm +ovl_Bg_Hidan_Firewall +ovl_Bg_Hidan_Fslift +ovl_Bg_Hidan_Fwbig +ovl_Bg_Hidan_Hamstep +ovl_Bg_Hidan_Hrock +ovl_Bg_Hidan_Kousi +ovl_Bg_Hidan_Kowarerukabe +ovl_Bg_Hidan_Rock +ovl_Bg_Hidan_Rsekizou +ovl_Bg_Hidan_Sekizou +ovl_Bg_Hidan_Sima +ovl_Bg_Hidan_Syoku +ovl_Bg_Ice_Objects +ovl_Bg_Ice_Shelter +ovl_Bg_Ice_Shutter +ovl_Bg_Ice_Turara +ovl_Bg_Ingate +ovl_Bg_Jya_1flift +ovl_Bg_Jya_Amishutter +ovl_Bg_Jya_Bigmirror +ovl_Bg_Jya_Block +ovl_Bg_Jya_Bombchuiwa +ovl_Bg_Jya_Bombiwa +ovl_Bg_Jya_Cobra +ovl_Bg_Jya_Goroiwa +ovl_Bg_Jya_Haheniron +ovl_Bg_Jya_Ironobj +ovl_Bg_Jya_Kanaami +ovl_Bg_Jya_Lift +ovl_Bg_Jya_Megami +ovl_Bg_Jya_Zurerukabe +ovl_Bg_Menkuri_Eye +ovl_Bg_Menkuri_Kaiten +ovl_Bg_Menkuri_Nisekabe +ovl_Bg_Mizu_Bwall +ovl_Bg_Mizu_Movebg +ovl_Bg_Mizu_Shutter +ovl_Bg_Mizu_Uzu +ovl_Bg_Mizu_Water +ovl_Bg_Mjin +ovl_Bg_Mori_Bigst +ovl_Bg_Mori_Elevator +ovl_Bg_Mori_Hashigo +ovl_Bg_Mori_Hashira4 +ovl_Bg_Mori_Hineri +ovl_Bg_Mori_Idomizu +ovl_Bg_Mori_Kaitenkabe +ovl_Bg_Mori_Rakkatenjo +ovl_Bg_Po_Event +ovl_Bg_Po_Syokudai +ovl_Bg_Pushbox +ovl_Bg_Relay_Objects +ovl_Bg_Spot00_Break +ovl_Bg_Spot00_Hanebasi +ovl_Bg_Spot01_Fusya +ovl_Bg_Spot01_Idohashira +ovl_Bg_Spot01_Idomizu +ovl_Bg_Spot01_Idosoko +ovl_Bg_Spot01_Objects2 +ovl_Bg_Spot02_Objects +ovl_Bg_Spot03_Taki +ovl_Bg_Spot05_Soko +ovl_Bg_Spot06_Objects +ovl_Bg_Spot07_Taki +ovl_Bg_Spot08_Bakudankabe +ovl_Bg_Spot08_Iceblock +ovl_Bg_Spot09_Obj +ovl_Bg_Spot11_Bakudankabe +ovl_Bg_Spot11_Oasis +ovl_Bg_Spot12_Gate +ovl_Bg_Spot12_Saku +ovl_Bg_Spot15_Rrbox +ovl_Bg_Spot15_Saku +ovl_Bg_Spot16_Bombstone +ovl_Bg_Spot16_Doughnut +ovl_Bg_Spot17_Bakudankabe +ovl_Bg_Spot17_Funen +ovl_Bg_Spot18_Basket +ovl_Bg_Spot18_Futa +ovl_Bg_Spot18_Obj +ovl_Bg_Spot18_Shutter +ovl_Bg_Sst_Floor +ovl_Bg_Toki_Hikari +ovl_Bg_Toki_Swd +ovl_Bg_Treemouth +ovl_Bg_Umajump +ovl_Bg_Vb_Sima +ovl_Bg_Ydan_Hasi +ovl_Bg_Ydan_Maruta +ovl_Bg_Ydan_Sp +ovl_Bg_Zg +ovl_Boss_Dodongo +ovl_Boss_Fd +ovl_Boss_Fd2 +ovl_Boss_Ganon +ovl_Boss_Ganon2 +ovl_Boss_Ganondrof +ovl_Boss_Goma +ovl_Boss_Mo +ovl_Boss_Sst +ovl_Boss_Tw +ovl_Boss_Va +ovl_Demo_6K +ovl_Demo_Du +ovl_Demo_Ec +ovl_Demo_Effect +ovl_Demo_Ext +ovl_Demo_Geff +ovl_Demo_Gj +ovl_Demo_Go +ovl_Demo_Gt +ovl_Demo_Ik +ovl_Demo_Im +ovl_Demo_Kankyo +ovl_Demo_Kekkai +ovl_Demo_Sa +ovl_Demo_Shd +ovl_Demo_Tre_Lgt +ovl_Door_Ana +ovl_Door_Gerudo +ovl_Door_Killer +ovl_Door_Shutter +ovl_Door_Toki +ovl_Door_Warp1 +ovl_Efc_Erupc +ovl_Eff_Dust +ovl_Effect_Ss_Blast +ovl_Effect_Ss_Bomb +ovl_Effect_Ss_Bomb2 +ovl_Effect_Ss_Bubble +ovl_Effect_Ss_D_Fire +ovl_Effect_Ss_Dead_Db +ovl_Effect_Ss_Dead_Dd +ovl_Effect_Ss_Dead_Ds +ovl_Effect_Ss_Dead_Sound +ovl_Effect_Ss_Dt_Bubble +ovl_Effect_Ss_Dust +ovl_Effect_Ss_En_Fire +ovl_Effect_Ss_En_Ice +ovl_Effect_Ss_Extra +ovl_Effect_Ss_Fcircle +ovl_Effect_Ss_Fhg_Flash +ovl_Effect_Ss_Fire_Tail +ovl_Effect_Ss_G_Fire +ovl_Effect_Ss_G_Magma +ovl_Effect_Ss_G_Magma2 +ovl_Effect_Ss_G_Ripple +ovl_Effect_Ss_G_Spk +ovl_Effect_Ss_G_Splash +ovl_Effect_Ss_Hahen +ovl_Effect_Ss_HitMark +ovl_Effect_Ss_Ice_Piece +ovl_Effect_Ss_Ice_Smoke +ovl_Effect_Ss_K_Fire +ovl_Effect_Ss_Kakera +ovl_Effect_Ss_KiraKira +ovl_Effect_Ss_Lightning +ovl_Effect_Ss_Sibuki +ovl_Effect_Ss_Sibuki2 +ovl_Effect_Ss_Solder_Srch_Ball +ovl_Effect_Ss_Stick +ovl_Effect_Ss_Stone1 +ovl_Elf_Msg +ovl_Elf_Msg2 +ovl_En_Am +ovl_En_Ani +ovl_En_Anubice +ovl_En_Anubice_Fire +ovl_En_Anubice_Tag +ovl_En_Arow_Trap +ovl_En_Arrow +ovl_En_Attack_Niw +ovl_En_Ba +ovl_En_Bb +ovl_En_Bdfire +ovl_En_Bigokuta +ovl_En_Bili +ovl_En_Bird +ovl_En_Blkobj +ovl_En_Bom +ovl_En_Bom_Bowl_Man +ovl_En_Bom_Bowl_Pit +ovl_En_Bom_Chu +ovl_En_Bombf +ovl_En_Boom +ovl_En_Box +ovl_En_Brob +ovl_En_Bubble +ovl_En_Butte +ovl_En_Bw +ovl_En_Bx +ovl_En_Changer +ovl_En_Clear_Tag +ovl_En_Cow +ovl_En_Crow +ovl_En_Cs +ovl_En_Daiku +ovl_En_Daiku_Kakariko +ovl_En_Dekubaba +ovl_En_Dekunuts +ovl_En_Dh +ovl_En_Dha +ovl_En_Diving_Game +ovl_En_Dns +ovl_En_Dnt_Demo +ovl_En_Dnt_Jiji +ovl_En_Dnt_Nomal +ovl_En_Dodojr +ovl_En_Dodongo +ovl_En_Dog +ovl_En_Door +ovl_En_Ds +ovl_En_Du +ovl_En_Dy_Extra +ovl_En_Eg +ovl_En_Eiyer +ovl_En_Elf +ovl_En_Encount1 +ovl_En_Encount2 +ovl_En_Ex_Item +ovl_En_Ex_Ruppy +ovl_En_Fd +ovl_En_Fd_Fire +ovl_En_Fhg_Fire +ovl_En_Fire_Rock +ovl_En_Firefly +ovl_En_Fish +ovl_En_Floormas +ovl_En_Fr +ovl_En_Fu +ovl_En_Fw +ovl_En_Fz +ovl_En_G_Switch +ovl_En_Ganon_Mant +ovl_En_Ganon_Organ +ovl_En_Gb +ovl_En_Ge1 +ovl_En_Ge2 +ovl_En_Ge3 +ovl_En_GeldB +ovl_En_GirlA +ovl_En_Gm +ovl_En_Go +ovl_En_Go2 +ovl_En_Goma +ovl_En_Goroiwa +ovl_En_Gs +ovl_En_Guest +ovl_En_Hata +ovl_En_Heishi1 +ovl_En_Heishi2 +ovl_En_Heishi3 +ovl_En_Heishi4 +ovl_En_Hintnuts +ovl_En_Holl +ovl_En_Honotrap +ovl_En_Horse +ovl_En_Horse_Game_Check +ovl_En_Horse_Ganon +ovl_En_Horse_Link_Child +ovl_En_Horse_Normal +ovl_En_Horse_Zelda +ovl_En_Hs +ovl_En_Hs2 +ovl_En_Hy +ovl_En_Ice_Hono +ovl_En_Ik +ovl_En_In +ovl_En_Insect +ovl_En_Ishi +ovl_En_It +ovl_En_Jj +ovl_En_Js +ovl_En_Jsjutan +ovl_En_Kakasi +ovl_En_Kakasi2 +ovl_En_Kakasi3 +ovl_En_Kanban +ovl_En_Karebaba +ovl_En_Ko +ovl_En_Kusa +ovl_En_Kz +ovl_En_Light +ovl_En_Lightbox +ovl_En_M_Fire1 +ovl_En_M_Thunder +ovl_En_Ma1 +ovl_En_Ma2 +ovl_En_Ma3 +ovl_En_Mag +ovl_En_Mb +ovl_En_Md +ovl_En_Mk +ovl_En_Mm +ovl_En_Mm2 +ovl_En_Ms +ovl_En_Mu +ovl_En_Nb +ovl_En_Niw +ovl_En_Niw_Girl +ovl_En_Niw_Lady +ovl_En_Nutsball +ovl_En_Nwc +ovl_En_Ny +ovl_En_OE2 +ovl_En_Okarina_Effect +ovl_En_Okarina_Tag +ovl_En_Okuta +ovl_En_Ossan +ovl_En_Owl +ovl_En_Part +ovl_En_Peehat +ovl_En_Po_Desert +ovl_En_Po_Field +ovl_En_Po_Relay +ovl_En_Po_Sisters +ovl_En_Poh +ovl_En_Pu_box +ovl_En_Rd +ovl_En_Reeba +ovl_En_River_Sound +ovl_En_Rl +ovl_En_Rr +ovl_En_Ru1 +ovl_En_Ru2 +ovl_En_Sa +ovl_En_Sb +ovl_En_Scene_Change +ovl_En_Sda +ovl_En_Shopnuts +ovl_En_Si +ovl_En_Siofuki +ovl_En_Skb +ovl_En_Skj +ovl_En_Skjneedle +ovl_En_Ssh +ovl_En_St +ovl_En_Sth +ovl_En_Stream +ovl_En_Sw +ovl_En_Syateki_Itm +ovl_En_Syateki_Man +ovl_En_Syateki_Niw +ovl_En_Ta +ovl_En_Takara_Man +ovl_En_Tana +ovl_En_Tg +ovl_En_Tite +ovl_En_Tk +ovl_En_Torch +ovl_En_Torch2 +ovl_En_Toryo +ovl_En_Tp +ovl_En_Tr +ovl_En_Trap +ovl_En_Tubo_Trap +ovl_En_Vali +ovl_En_Vase +ovl_En_Vb_Ball +ovl_En_Viewer +ovl_En_Vm +ovl_En_Wall_Tubo +ovl_En_Wallmas +ovl_En_Weather_Tag +ovl_En_Weiyer +ovl_En_Wf +ovl_En_Wonder_Item +ovl_En_Wonder_Talk +ovl_En_Wonder_Talk2 +ovl_En_Wood02 +ovl_En_Xc +ovl_En_Yabusame_Mark +ovl_En_Yukabyun +ovl_En_Zf +ovl_En_Zl1 +ovl_En_Zl2 +ovl_En_Zl3 +ovl_En_Zl4 +ovl_En_Zo +ovl_En_fHG +ovl_End_Title +ovl_Fishing +ovl_Item_B_Heart +ovl_Item_Etcetera +ovl_Item_Inbox +ovl_Item_Ocarina +ovl_Item_Shield +ovl_Magic_Dark +ovl_Magic_Fire +ovl_Magic_Wind +ovl_Mir_Ray +ovl_Obj_Bean +ovl_Obj_Blockstop +ovl_Obj_Bombiwa +ovl_Obj_Comb +ovl_Obj_Dekujr +ovl_Obj_Elevator +ovl_Obj_Hamishi +ovl_Obj_Hana +ovl_Obj_Hsblock +ovl_Obj_Ice_Poly +ovl_Obj_Kibako +ovl_Obj_Kibako2 +ovl_Obj_Lift +ovl_Obj_Lightswitch +ovl_Obj_Makekinsuta +ovl_Obj_Makeoshihiki +ovl_Obj_Mure +ovl_Obj_Mure2 +ovl_Obj_Mure3 +ovl_Obj_Oshihiki +ovl_Obj_Roomtimer +ovl_Obj_Switch +ovl_Obj_Syokudai +ovl_Obj_Timeblock +ovl_Obj_Tsubo +ovl_Obj_Warp2block +ovl_Object_Kankyo +ovl_Oceff_Spot +ovl_Oceff_Storm +ovl_Oceff_Wipe +ovl_Oceff_Wipe2 +ovl_Oceff_Wipe3 +ovl_Oceff_Wipe4 +ovl_Shot_Sun +gameplay_keep +gameplay_field_keep +gameplay_dangeon_keep +gameplay_object_exchange_static +object_link_boy +object_link_child +object_box +object_human +object_okuta +object_poh +object_wallmaster +object_dy_obj +object_firefly +object_dodongo +object_fire +object_niw +object_tite +object_reeba +object_peehat +object_kingdodongo +object_horse +object_zf +object_goma +object_zl1 +object_gol +object_bubble +object_dodojr +object_torch2 +object_bl +object_tp +object_oA1 +object_st +object_bw +object_ei +object_horse_normal +object_oB1 +object_o_anime +object_spot04_objects +object_ddan_objects +object_hidan_objects +object_horse_ganon +object_oA2 +object_spot00_objects +object_mb +object_bombf +object_sk2 +object_oE1 +object_oE_anime +object_oE2 +object_ydan_objects +object_gnd +object_am +object_dekubaba +object_oA3 +object_oA4 +object_oA5 +object_oA6 +object_oA7 +object_jj +object_oA8 +object_oA9 +object_oB2 +object_oB3 +object_oB4 +object_horse_zelda +object_opening_demo1 +object_warp1 +object_b_heart +object_dekunuts +object_oE3 +object_oE4 +object_menkuri_objects +object_oE5 +object_oE6 +object_oE7 +object_oE8 +object_oE9 +object_oE10 +object_oE11 +object_oE12 +object_vali +object_oA10 +object_oA11 +object_mizu_objects +object_fhg +object_ossan +object_mori_hineri1 +object_Bb +object_toki_objects +object_yukabyun +object_zl2 +object_mjin +object_mjin_flash +object_mjin_dark +object_mjin_flame +object_mjin_ice +object_mjin_soul +object_mjin_wind +object_mjin_oka +object_haka_objects +object_spot06_objects +object_ice_objects +object_relay_objects +object_mori_hineri1a +object_mori_hineri2 +object_mori_hineri2a +object_mori_objects +object_mori_tex +object_spot08_obj +object_warp2 +object_hata +object_bird +object_wood02 +object_lightbox +object_pu_box +object_trap +object_vase +object_im +object_ta +object_tk +object_xc +object_vm +object_bv +object_hakach_objects +object_efc_crystal_light +object_efc_fire_ball +object_efc_flash +object_efc_lgt_shower +object_efc_star_field +object_god_lgt +object_light_ring +object_triforce_spot +object_medal +object_bdan_objects +object_sd +object_rd +object_po_sisters +object_heavy_object +object_gndd +object_fd +object_du +object_fw +object_horse_link_child +object_spot02_objects +object_haka +object_ru1 +object_syokudai +object_fd2 +object_dh +object_rl +object_efc_tw +object_demo_tre_lgt +object_gi_key +object_mir_ray +object_brob +object_gi_jewel +object_spot09_obj +object_spot18_obj +object_bdoor +object_spot17_obj +object_shop_dungen +object_nb +object_mo +object_sb +object_gi_melody +object_gi_heart +object_gi_compass +object_gi_bosskey +object_gi_medal +object_gi_nuts +object_sa +object_gi_hearts +object_gi_arrowcase +object_gi_bombpouch +object_in +object_tr +object_spot16_obj +object_oE1s +object_oE4s +object_os_anime +object_gi_bottle +object_gi_stick +object_gi_map +object_oF1d_map +object_ru2 +object_gi_shield_1 +object_dekujr +object_gi_magicpot +object_gi_bomb_1 +object_oF1s +object_ma2 +object_gi_purse +object_hni +object_tw +object_rr +object_bxa +object_anubice +object_gi_gerudo +object_gi_arrow +object_gi_bomb_2 +object_gi_egg +object_gi_scale +object_gi_shield_2 +object_gi_hookshot +object_gi_ocarina +object_gi_milk +object_ma1 +object_ganon +object_sst +object_ny +object_fr +object_gi_pachinko +object_gi_boomerang +object_gi_bow +object_gi_glasses +object_gi_liquid +object_ani +object_demo_6k +object_gi_shield_3 +object_gi_letter +object_spot15_obj +object_jya_obj +object_gi_clothes +object_gi_bean +object_gi_fish +object_gi_saw +object_gi_hammer +object_gi_grass +object_gi_longsword +object_spot01_objects +object_md +object_km1 +object_kw1 +object_zo +object_kz +object_umajump +object_masterkokiri +object_masterkokirihead +object_mastergolon +object_masterzoora +object_aob +object_ik +object_ahg +object_cne +object_gi_niwatori +object_skj +object_gi_bottle_letter +object_bji +object_bba +object_gi_ocarina_0 +object_ds +object_ane +object_boj +object_spot03_object +object_spot07_object +object_fz +object_bob +object_ge1 +object_yabusame_point +object_gi_boots_2 +object_gi_seed +object_gnd_magic +object_d_elevator +object_d_hsblock +object_d_lift +object_mamenoki +object_goroiwa +object_toryo +object_daiku +object_nwc +object_blkobj +object_gm +object_ms +object_hs +object_ingate +object_lightswitch +object_kusa +object_tsubo +object_gi_gloves +object_gi_coin +object_kanban +object_gjyo_objects +object_owl +object_mk +object_fu +object_gi_ki_tan_mask +object_gi_redead_mask +object_gi_skj_mask +object_gi_rabit_mask +object_gi_truth_mask +object_ganon_objects +object_siofuki +object_stream +object_mm +object_fa +object_os +object_gi_eye_lotion +object_gi_powder +object_gi_mushroom +object_gi_ticketstone +object_gi_brokensword +object_js +object_cs +object_gi_prescription +object_gi_bracelet +object_gi_soldout +object_gi_frog +object_mag +object_door_gerudo +object_gt +object_efc_erupc +object_zl2_anime1 +object_zl2_anime2 +object_gi_golonmask +object_gi_zoramask +object_gi_gerudomask +object_ganon2 +object_ka +object_ts +object_zg +object_gi_hoverboots +object_gi_m_arrow +object_ds2 +object_ec +object_fish +object_gi_sutaru +object_gi_goddess +object_ssh +object_bigokuta +object_bg +object_spot05_objects +object_spot12_obj +object_bombiwa +object_hintnuts +object_rs +object_spot00_break +object_gla +object_shopnuts +object_geldb +object_gr +object_dog +object_jya_iron +object_jya_door +object_spot01_objects2 +object_spot11_obj +object_kibako2 +object_dns +object_dnk +object_gi_fire +object_gi_insect +object_gi_butterfly +object_gi_ghost +object_gi_soul +object_bowl +object_po_field +object_demo_kekkai +object_efc_doughnut +object_gi_dekupouch +object_ganon_anime1 +object_ganon_anime2 +object_ganon_anime3 +object_gi_rupy +object_spot01_matoya +object_spot01_matoyab +object_po_composer +object_mu +object_wf +object_skb +object_gj +object_geff +object_haka_door +object_gs +object_ps +object_bwall +object_crow +object_cow +object_cob +object_gi_sword_1 +object_door_killer +object_ouke_haka +object_timeblock +object_zl4 +g_pn_01 +g_pn_02 +g_pn_03 +g_pn_04 +g_pn_05 +g_pn_06 +g_pn_07 +g_pn_08 +g_pn_09 +g_pn_10 +g_pn_11 +g_pn_12 +g_pn_13 +g_pn_14 +g_pn_15 +g_pn_16 +g_pn_17 +g_pn_18 +g_pn_19 +g_pn_20 +g_pn_21 +g_pn_22 +g_pn_23 +g_pn_24 +g_pn_25 +g_pn_26 +g_pn_27 +g_pn_28 +g_pn_29 +g_pn_30 +g_pn_31 +g_pn_32 +g_pn_33 +g_pn_34 +g_pn_35 +g_pn_36 +g_pn_37 +g_pn_38 +g_pn_39 +g_pn_40 +g_pn_41 +g_pn_42 +g_pn_43 +g_pn_44 +g_pn_45 +g_pn_46 +g_pn_47 +g_pn_48 +g_pn_49 +g_pn_50 +g_pn_51 +g_pn_52 +g_pn_53 +g_pn_54 +g_pn_55 +g_pn_56 +g_pn_57 +z_select_static +nintendo_rogo_static +title_static +parameter_static +vr_fine0_static +vr_fine0_pal_static +vr_fine1_static +vr_fine1_pal_static +vr_fine2_static +vr_fine2_pal_static +vr_fine3_static +vr_fine3_pal_static +vr_cloud0_static +vr_cloud0_pal_static +vr_cloud1_static +vr_cloud1_pal_static +vr_cloud2_static +vr_cloud2_pal_static +vr_cloud3_static +vr_cloud3_pal_static +vr_holy0_static +vr_holy0_pal_static +vr_holy1_static +vr_holy1_pal_static +vr_MDVR_static +vr_MDVR_pal_static +vr_MNVR_static +vr_MNVR_pal_static +vr_RUVR_static +vr_RUVR_pal_static +vr_LHVR_static +vr_LHVR_pal_static +vr_KHVR_static +vr_KHVR_pal_static +vr_K3VR_static +vr_K3VR_pal_static +vr_K4VR_static +vr_K4VR_pal_static +vr_K5VR_static +vr_K5VR_pal_static +vr_SP1a_static +vr_SP1a_pal_static +vr_MLVR_static +vr_MLVR_pal_static +vr_KKRVR_static +vr_KKRVR_pal_static +vr_KR3VR_static +vr_KR3VR_pal_static +vr_IPVR_static +vr_IPVR_pal_static +vr_KSVR_static +vr_KSVR_pal_static +vr_GLVR_static +vr_GLVR_pal_static +vr_ZRVR_static +vr_ZRVR_pal_static +vr_DGVR_static +vr_DGVR_pal_static +vr_ALVR_static +vr_ALVR_pal_static +vr_NSVR_static +vr_NSVR_pal_static +vr_LBVR_static +vr_LBVR_pal_static +vr_TTVR_static +vr_TTVR_pal_static +vr_FCVR_static +vr_FCVR_pal_static +elf_message_field +elf_message_ydan +ydan_scene +ydan_room_0 +ydan_room_1 +ydan_room_2 +ydan_room_3 +ydan_room_4 +ydan_room_5 +ydan_room_6 +ydan_room_7 +ydan_room_8 +ydan_room_9 +ydan_room_10 +ydan_room_11 +ddan_scene +ddan_room_0 +ddan_room_1 +ddan_room_2 +ddan_room_3 +ddan_room_4 +ddan_room_5 +ddan_room_6 +ddan_room_7 +ddan_room_8 +ddan_room_9 +ddan_room_10 +ddan_room_11 +ddan_room_12 +ddan_room_13 +ddan_room_14 +ddan_room_15 +ddan_room_16 +bdan_scene +bdan_room_0 +bdan_room_1 +bdan_room_2 +bdan_room_3 +bdan_room_4 +bdan_room_5 +bdan_room_6 +bdan_room_7 +bdan_room_8 +bdan_room_9 +bdan_room_10 +bdan_room_11 +bdan_room_12 +bdan_room_13 +bdan_room_14 +bdan_room_15 +Bmori1_scene +Bmori1_room_0 +Bmori1_room_1 +Bmori1_room_2 +Bmori1_room_3 +Bmori1_room_4 +Bmori1_room_5 +Bmori1_room_6 +Bmori1_room_7 +Bmori1_room_8 +Bmori1_room_9 +Bmori1_room_10 +Bmori1_room_11 +Bmori1_room_12 +Bmori1_room_13 +Bmori1_room_14 +Bmori1_room_15 +Bmori1_room_16 +Bmori1_room_17 +Bmori1_room_18 +Bmori1_room_19 +Bmori1_room_20 +Bmori1_room_21 +Bmori1_room_22 +HIDAN_scene +HIDAN_room_0 +HIDAN_room_1 +HIDAN_room_2 +HIDAN_room_3 +HIDAN_room_4 +HIDAN_room_5 +HIDAN_room_6 +HIDAN_room_7 +HIDAN_room_8 +HIDAN_room_9 +HIDAN_room_10 +HIDAN_room_11 +HIDAN_room_12 +HIDAN_room_13 +HIDAN_room_14 +HIDAN_room_15 +HIDAN_room_16 +HIDAN_room_17 +HIDAN_room_18 +HIDAN_room_19 +HIDAN_room_20 +HIDAN_room_21 +HIDAN_room_22 +HIDAN_room_23 +HIDAN_room_24 +HIDAN_room_25 +HIDAN_room_26 +MIZUsin_scene +MIZUsin_room_0 +MIZUsin_room_1 +MIZUsin_room_2 +MIZUsin_room_3 +MIZUsin_room_4 +MIZUsin_room_5 +MIZUsin_room_6 +MIZUsin_room_7 +MIZUsin_room_8 +MIZUsin_room_9 +MIZUsin_room_10 +MIZUsin_room_11 +MIZUsin_room_12 +MIZUsin_room_13 +MIZUsin_room_14 +MIZUsin_room_15 +MIZUsin_room_16 +MIZUsin_room_17 +MIZUsin_room_18 +MIZUsin_room_19 +MIZUsin_room_20 +MIZUsin_room_21 +MIZUsin_room_22 +jyasinzou_scene +jyasinzou_room_0 +jyasinzou_room_1 +jyasinzou_room_2 +jyasinzou_room_3 +jyasinzou_room_4 +jyasinzou_room_5 +jyasinzou_room_6 +jyasinzou_room_7 +jyasinzou_room_8 +jyasinzou_room_9 +jyasinzou_room_10 +jyasinzou_room_11 +jyasinzou_room_12 +jyasinzou_room_13 +jyasinzou_room_14 +jyasinzou_room_15 +jyasinzou_room_16 +jyasinzou_room_17 +jyasinzou_room_18 +jyasinzou_room_19 +jyasinzou_room_20 +jyasinzou_room_21 +jyasinzou_room_22 +jyasinzou_room_23 +jyasinzou_room_24 +jyasinzou_room_25 +jyasinzou_room_26 +jyasinzou_room_27 +jyasinzou_room_28 +HAKAdan_scene +HAKAdan_room_0 +HAKAdan_room_1 +HAKAdan_room_2 +HAKAdan_room_3 +HAKAdan_room_4 +HAKAdan_room_5 +HAKAdan_room_6 +HAKAdan_room_7 +HAKAdan_room_8 +HAKAdan_room_9 +HAKAdan_room_10 +HAKAdan_room_11 +HAKAdan_room_12 +HAKAdan_room_13 +HAKAdan_room_14 +HAKAdan_room_15 +HAKAdan_room_16 +HAKAdan_room_17 +HAKAdan_room_18 +HAKAdan_room_19 +HAKAdan_room_20 +HAKAdan_room_21 +HAKAdan_room_22 +HAKAdanCH_scene +HAKAdanCH_room_0 +HAKAdanCH_room_1 +HAKAdanCH_room_2 +HAKAdanCH_room_3 +HAKAdanCH_room_4 +HAKAdanCH_room_5 +HAKAdanCH_room_6 +ice_doukutu_scene +ice_doukutu_room_0 +ice_doukutu_room_1 +ice_doukutu_room_2 +ice_doukutu_room_3 +ice_doukutu_room_4 +ice_doukutu_room_5 +ice_doukutu_room_6 +ice_doukutu_room_7 +ice_doukutu_room_8 +ice_doukutu_room_9 +ice_doukutu_room_10 +ice_doukutu_room_11 +men_scene +men_room_0 +men_room_1 +men_room_2 +men_room_3 +men_room_4 +men_room_5 +men_room_6 +men_room_7 +men_room_8 +men_room_9 +men_room_10 +ganontika_scene +ganontika_room_0 +ganontika_room_1 +ganontika_room_2 +ganontika_room_3 +ganontika_room_4 +ganontika_room_5 +ganontika_room_6 +ganontika_room_7 +ganontika_room_8 +ganontika_room_9 +ganontika_room_10 +ganontika_room_11 +ganontika_room_12 +ganontika_room_13 +ganontika_room_14 +ganontika_room_15 +ganontika_room_16 +ganontika_room_17 +ganontika_room_18 +ganontika_room_19 +spot00_scene +spot00_room_0 +spot01_scene +spot01_room_0 +spot02_scene +spot02_room_0 +spot02_room_1 +spot03_scene +spot03_room_0 +spot03_room_1 +spot04_scene +spot04_room_0 +spot04_room_1 +spot04_room_2 +spot05_scene +spot05_room_0 +spot06_scene +spot06_room_0 +spot07_scene +spot07_room_0 +spot07_room_1 +spot08_scene +spot08_room_0 +spot09_scene +spot09_room_0 +spot10_scene +spot10_room_0 +spot10_room_1 +spot10_room_2 +spot10_room_3 +spot10_room_4 +spot10_room_5 +spot10_room_6 +spot10_room_7 +spot10_room_8 +spot10_room_9 +spot11_scene +spot11_room_0 +spot12_scene +spot12_room_0 +spot12_room_1 +spot13_scene +spot13_room_0 +spot13_room_1 +spot15_scene +spot15_room_0 +spot16_scene +spot16_room_0 +spot17_scene +spot17_room_0 +spot17_room_1 +spot18_scene +spot18_room_0 +spot18_room_1 +spot18_room_2 +spot18_room_3 +market_day_scene +market_day_room_0 +market_night_scene +market_night_room_0 +kenjyanoma_scene +kenjyanoma_room_0 +tokinoma_scene +tokinoma_room_0 +tokinoma_room_1 +link_home_scene +link_home_room_0 +kokiri_shop_scene +kokiri_shop_room_0 +kokiri_home_scene +kokiri_home_room_0 +kakusiana_scene +kakusiana_room_0 +kakusiana_room_1 +kakusiana_room_2 +kakusiana_room_3 +kakusiana_room_4 +kakusiana_room_5 +kakusiana_room_6 +kakusiana_room_7 +kakusiana_room_8 +kakusiana_room_9 +kakusiana_room_10 +kakusiana_room_11 +kakusiana_room_12 +kakusiana_room_13 +entra_scene +entra_room_0 +moribossroom_scene +moribossroom_room_0 +moribossroom_room_1 +syatekijyou_scene +syatekijyou_room_0 +shop1_scene +shop1_room_0 +hairal_niwa_scene +hairal_niwa_room_0 +ganon_tou_scene +ganon_tou_room_0 +market_alley_scene +market_alley_room_0 +spot20_scene +spot20_room_0 +market_ruins_scene +market_ruins_room_0 +entra_n_scene +entra_n_room_0 +enrui_scene +enrui_room_0 +market_alley_n_scene +market_alley_n_room_0 +hiral_demo_scene +hiral_demo_room_0 +kokiri_home3_scene +kokiri_home3_room_0 +malon_stable_scene +malon_stable_room_0 +kakariko_scene +kakariko_room_0 +bdan_boss_scene +bdan_boss_room_0 +bdan_boss_room_1 +FIRE_bs_scene +FIRE_bs_room_0 +FIRE_bs_room_1 +hut_scene +hut_room_0 +daiyousei_izumi_scene +daiyousei_izumi_room_0 +hakaana_scene +hakaana_room_0 +yousei_izumi_tate_scene +yousei_izumi_tate_room_0 +yousei_izumi_yoko_scene +yousei_izumi_yoko_room_0 +golon_scene +golon_room_0 +zoora_scene +zoora_room_0 +drag_scene +drag_room_0 +alley_shop_scene +alley_shop_room_0 +night_shop_scene +night_shop_room_0 +impa_scene +impa_room_0 +labo_scene +labo_room_0 +tent_scene +tent_room_0 +nakaniwa_scene +nakaniwa_room_0 +ddan_boss_scene +ddan_boss_room_0 +ddan_boss_room_1 +ydan_boss_scene +ydan_boss_room_0 +ydan_boss_room_1 +HAKAdan_bs_scene +HAKAdan_bs_room_0 +HAKAdan_bs_room_1 +MIZUsin_bs_scene +MIZUsin_bs_room_0 +MIZUsin_bs_room_1 +ganon_scene +ganon_room_0 +ganon_room_1 +ganon_room_2 +ganon_room_3 +ganon_room_4 +ganon_room_5 +ganon_room_6 +ganon_room_7 +ganon_room_8 +ganon_room_9 +ganon_boss_scene +ganon_boss_room_0 +jyasinboss_scene +jyasinboss_room_0 +jyasinboss_room_1 +jyasinboss_room_2 +jyasinboss_room_3 +kokiri_home4_scene +kokiri_home4_room_0 +kokiri_home5_scene +kokiri_home5_room_0 +ganon_final_scene +ganon_final_room_0 +kakariko3_scene +kakariko3_room_0 +hakasitarelay_scene +hakasitarelay_room_0 +hakasitarelay_room_1 +hakasitarelay_room_2 +hakasitarelay_room_3 +hakasitarelay_room_4 +hakasitarelay_room_5 +hakasitarelay_room_6 +shrine_scene +shrine_room_0 +turibori_scene +turibori_room_0 +shrine_n_scene +shrine_n_room_0 +shrine_r_scene +shrine_r_room_0 +hakaana2_scene +hakaana2_room_0 +gerudoway_scene +gerudoway_room_0 +gerudoway_room_1 +gerudoway_room_2 +gerudoway_room_3 +gerudoway_room_4 +gerudoway_room_5 +hairal_niwa_n_scene +hairal_niwa_n_room_0 +bowling_scene +bowling_room_0 +hakaana_ouke_scene +hakaana_ouke_room_0 +hakaana_ouke_room_1 +hakaana_ouke_room_2 +hylia_labo_scene +hylia_labo_room_0 +souko_scene +souko_room_0 +souko_room_1 +souko_room_2 +miharigoya_scene +miharigoya_room_0 +mahouya_scene +mahouya_room_0 +takaraya_scene +takaraya_room_0 +takaraya_room_1 +takaraya_room_2 +takaraya_room_3 +takaraya_room_4 +takaraya_room_5 +takaraya_room_6 +ganon_sonogo_scene +ganon_sonogo_room_0 +ganon_sonogo_room_1 +ganon_sonogo_room_2 +ganon_sonogo_room_3 +ganon_sonogo_room_4 +ganon_demo_scene +ganon_demo_room_0 +face_shop_scene +face_shop_room_0 +kinsuta_scene +kinsuta_room_0 +ganontikasonogo_scene +ganontikasonogo_room_0 +ganontikasonogo_room_1 +bump_texture_static +anime_model_1_static +anime_model_2_static +anime_model_3_static +anime_model_4_static +anime_model_5_static +anime_model_6_static +anime_texture_1_static +anime_texture_2_static +anime_texture_3_static +anime_texture_4_static +anime_texture_5_static +anime_texture_6_static +softsprite_matrix_static \ No newline at end of file diff --git a/soh/assets/extractor/filelists/gamecube_pal.txt b/soh/assets/extractor/filelists/gamecube_pal.txt new file mode 100644 index 000000000..c9746c1da --- /dev/null +++ b/soh/assets/extractor/filelists/gamecube_pal.txt @@ -0,0 +1,1510 @@ +makerom +boot +dmadata +Audiobank +Audioseq +Audiotable +link_animetion +icon_item_static +icon_item_24_static +icon_item_field_static +icon_item_dungeon_static +icon_item_gameover_static +icon_item_nes_static +icon_item_ger_static +icon_item_fra_static +item_name_static +map_name_static +do_action_static +message_static +message_texture_static +nes_font_static +nes_message_data_static +ger_message_data_static +fra_message_data_static +staff_message_data_static +map_grand_static +map_48x85_static +map_i_static +code +ovl_title +ovl_select +ovl_opening +ovl_file_choose +ovl_kaleido_scope +ovl_player_actor +ovl_map_mark_data +ovl_En_Test +ovl_Arms_Hook +ovl_Arrow_Fire +ovl_Arrow_Ice +ovl_Arrow_Light +ovl_Bg_Bdan_Objects +ovl_Bg_Bdan_Switch +ovl_Bg_Bom_Guard +ovl_Bg_Bombwall +ovl_Bg_Bowl_Wall +ovl_Bg_Breakwall +ovl_Bg_Ddan_Jd +ovl_Bg_Ddan_Kd +ovl_Bg_Dodoago +ovl_Bg_Dy_Yoseizo +ovl_Bg_Ganon_Otyuka +ovl_Bg_Gate_Shutter +ovl_Bg_Gjyo_Bridge +ovl_Bg_Gnd_Darkmeiro +ovl_Bg_Gnd_Firemeiro +ovl_Bg_Gnd_Iceblock +ovl_Bg_Gnd_Nisekabe +ovl_Bg_Gnd_Soulmeiro +ovl_Bg_Haka +ovl_Bg_Haka_Gate +ovl_Bg_Haka_Huta +ovl_Bg_Haka_Megane +ovl_Bg_Haka_MeganeBG +ovl_Bg_Haka_Sgami +ovl_Bg_Haka_Ship +ovl_Bg_Haka_Trap +ovl_Bg_Haka_Tubo +ovl_Bg_Haka_Water +ovl_Bg_Haka_Zou +ovl_Bg_Heavy_Block +ovl_Bg_Hidan_Curtain +ovl_Bg_Hidan_Dalm +ovl_Bg_Hidan_Firewall +ovl_Bg_Hidan_Fslift +ovl_Bg_Hidan_Fwbig +ovl_Bg_Hidan_Hamstep +ovl_Bg_Hidan_Hrock +ovl_Bg_Hidan_Kousi +ovl_Bg_Hidan_Kowarerukabe +ovl_Bg_Hidan_Rock +ovl_Bg_Hidan_Rsekizou +ovl_Bg_Hidan_Sekizou +ovl_Bg_Hidan_Sima +ovl_Bg_Hidan_Syoku +ovl_Bg_Ice_Objects +ovl_Bg_Ice_Shelter +ovl_Bg_Ice_Shutter +ovl_Bg_Ice_Turara +ovl_Bg_Ingate +ovl_Bg_Jya_1flift +ovl_Bg_Jya_Amishutter +ovl_Bg_Jya_Bigmirror +ovl_Bg_Jya_Block +ovl_Bg_Jya_Bombchuiwa +ovl_Bg_Jya_Bombiwa +ovl_Bg_Jya_Cobra +ovl_Bg_Jya_Goroiwa +ovl_Bg_Jya_Haheniron +ovl_Bg_Jya_Ironobj +ovl_Bg_Jya_Kanaami +ovl_Bg_Jya_Lift +ovl_Bg_Jya_Megami +ovl_Bg_Jya_Zurerukabe +ovl_Bg_Menkuri_Eye +ovl_Bg_Menkuri_Kaiten +ovl_Bg_Menkuri_Nisekabe +ovl_Bg_Mizu_Bwall +ovl_Bg_Mizu_Movebg +ovl_Bg_Mizu_Shutter +ovl_Bg_Mizu_Uzu +ovl_Bg_Mizu_Water +ovl_Bg_Mjin +ovl_Bg_Mori_Bigst +ovl_Bg_Mori_Elevator +ovl_Bg_Mori_Hashigo +ovl_Bg_Mori_Hashira4 +ovl_Bg_Mori_Hineri +ovl_Bg_Mori_Idomizu +ovl_Bg_Mori_Kaitenkabe +ovl_Bg_Mori_Rakkatenjo +ovl_Bg_Po_Event +ovl_Bg_Po_Syokudai +ovl_Bg_Pushbox +ovl_Bg_Relay_Objects +ovl_Bg_Spot00_Break +ovl_Bg_Spot00_Hanebasi +ovl_Bg_Spot01_Fusya +ovl_Bg_Spot01_Idohashira +ovl_Bg_Spot01_Idomizu +ovl_Bg_Spot01_Idosoko +ovl_Bg_Spot01_Objects2 +ovl_Bg_Spot02_Objects +ovl_Bg_Spot03_Taki +ovl_Bg_Spot05_Soko +ovl_Bg_Spot06_Objects +ovl_Bg_Spot07_Taki +ovl_Bg_Spot08_Bakudankabe +ovl_Bg_Spot08_Iceblock +ovl_Bg_Spot09_Obj +ovl_Bg_Spot11_Bakudankabe +ovl_Bg_Spot11_Oasis +ovl_Bg_Spot12_Gate +ovl_Bg_Spot12_Saku +ovl_Bg_Spot15_Rrbox +ovl_Bg_Spot15_Saku +ovl_Bg_Spot16_Bombstone +ovl_Bg_Spot16_Doughnut +ovl_Bg_Spot17_Bakudankabe +ovl_Bg_Spot17_Funen +ovl_Bg_Spot18_Basket +ovl_Bg_Spot18_Futa +ovl_Bg_Spot18_Obj +ovl_Bg_Spot18_Shutter +ovl_Bg_Sst_Floor +ovl_Bg_Toki_Hikari +ovl_Bg_Toki_Swd +ovl_Bg_Treemouth +ovl_Bg_Umajump +ovl_Bg_Vb_Sima +ovl_Bg_Ydan_Hasi +ovl_Bg_Ydan_Maruta +ovl_Bg_Ydan_Sp +ovl_Bg_Zg +ovl_Boss_Dodongo +ovl_Boss_Fd +ovl_Boss_Fd2 +ovl_Boss_Ganon +ovl_Boss_Ganon2 +ovl_Boss_Ganondrof +ovl_Boss_Goma +ovl_Boss_Mo +ovl_Boss_Sst +ovl_Boss_Tw +ovl_Boss_Va +ovl_Demo_6K +ovl_Demo_Du +ovl_Demo_Ec +ovl_Demo_Effect +ovl_Demo_Ext +ovl_Demo_Geff +ovl_Demo_Gj +ovl_Demo_Go +ovl_Demo_Gt +ovl_Demo_Ik +ovl_Demo_Im +ovl_Demo_Kankyo +ovl_Demo_Kekkai +ovl_Demo_Sa +ovl_Demo_Shd +ovl_Demo_Tre_Lgt +ovl_Door_Ana +ovl_Door_Gerudo +ovl_Door_Killer +ovl_Door_Shutter +ovl_Door_Toki +ovl_Door_Warp1 +ovl_Efc_Erupc +ovl_Eff_Dust +ovl_Effect_Ss_Blast +ovl_Effect_Ss_Bomb +ovl_Effect_Ss_Bomb2 +ovl_Effect_Ss_Bubble +ovl_Effect_Ss_D_Fire +ovl_Effect_Ss_Dead_Db +ovl_Effect_Ss_Dead_Dd +ovl_Effect_Ss_Dead_Ds +ovl_Effect_Ss_Dead_Sound +ovl_Effect_Ss_Dt_Bubble +ovl_Effect_Ss_Dust +ovl_Effect_Ss_En_Fire +ovl_Effect_Ss_En_Ice +ovl_Effect_Ss_Extra +ovl_Effect_Ss_Fcircle +ovl_Effect_Ss_Fhg_Flash +ovl_Effect_Ss_Fire_Tail +ovl_Effect_Ss_G_Fire +ovl_Effect_Ss_G_Magma +ovl_Effect_Ss_G_Magma2 +ovl_Effect_Ss_G_Ripple +ovl_Effect_Ss_G_Spk +ovl_Effect_Ss_G_Splash +ovl_Effect_Ss_Hahen +ovl_Effect_Ss_HitMark +ovl_Effect_Ss_Ice_Piece +ovl_Effect_Ss_Ice_Smoke +ovl_Effect_Ss_K_Fire +ovl_Effect_Ss_Kakera +ovl_Effect_Ss_KiraKira +ovl_Effect_Ss_Lightning +ovl_Effect_Ss_Sibuki +ovl_Effect_Ss_Sibuki2 +ovl_Effect_Ss_Solder_Srch_Ball +ovl_Effect_Ss_Stick +ovl_Effect_Ss_Stone1 +ovl_Elf_Msg +ovl_Elf_Msg2 +ovl_En_Am +ovl_En_Ani +ovl_En_Anubice +ovl_En_Anubice_Fire +ovl_En_Anubice_Tag +ovl_En_Arow_Trap +ovl_En_Arrow +ovl_En_Attack_Niw +ovl_En_Ba +ovl_En_Bb +ovl_En_Bdfire +ovl_En_Bigokuta +ovl_En_Bili +ovl_En_Bird +ovl_En_Blkobj +ovl_En_Bom +ovl_En_Bom_Bowl_Man +ovl_En_Bom_Bowl_Pit +ovl_En_Bom_Chu +ovl_En_Bombf +ovl_En_Boom +ovl_En_Box +ovl_En_Brob +ovl_En_Bubble +ovl_En_Butte +ovl_En_Bw +ovl_En_Bx +ovl_En_Changer +ovl_En_Clear_Tag +ovl_En_Cow +ovl_En_Crow +ovl_En_Cs +ovl_En_Daiku +ovl_En_Daiku_Kakariko +ovl_En_Dekubaba +ovl_En_Dekunuts +ovl_En_Dh +ovl_En_Dha +ovl_En_Diving_Game +ovl_En_Dns +ovl_En_Dnt_Demo +ovl_En_Dnt_Jiji +ovl_En_Dnt_Nomal +ovl_En_Dodojr +ovl_En_Dodongo +ovl_En_Dog +ovl_En_Door +ovl_En_Ds +ovl_En_Du +ovl_En_Dy_Extra +ovl_En_Eg +ovl_En_Eiyer +ovl_En_Elf +ovl_En_Encount1 +ovl_En_Encount2 +ovl_En_Ex_Item +ovl_En_Ex_Ruppy +ovl_En_Fd +ovl_En_Fd_Fire +ovl_En_Fhg_Fire +ovl_En_Fire_Rock +ovl_En_Firefly +ovl_En_Fish +ovl_En_Floormas +ovl_En_Fr +ovl_En_Fu +ovl_En_Fw +ovl_En_Fz +ovl_En_G_Switch +ovl_En_Ganon_Mant +ovl_En_Ganon_Organ +ovl_En_Gb +ovl_En_Ge1 +ovl_En_Ge2 +ovl_En_Ge3 +ovl_En_GeldB +ovl_En_GirlA +ovl_En_Gm +ovl_En_Go +ovl_En_Go2 +ovl_En_Goma +ovl_En_Goroiwa +ovl_En_Gs +ovl_En_Guest +ovl_En_Hata +ovl_En_Heishi1 +ovl_En_Heishi2 +ovl_En_Heishi3 +ovl_En_Heishi4 +ovl_En_Hintnuts +ovl_En_Holl +ovl_En_Honotrap +ovl_En_Horse +ovl_En_Horse_Game_Check +ovl_En_Horse_Ganon +ovl_En_Horse_Link_Child +ovl_En_Horse_Normal +ovl_En_Horse_Zelda +ovl_En_Hs +ovl_En_Hs2 +ovl_En_Hy +ovl_En_Ice_Hono +ovl_En_Ik +ovl_En_In +ovl_En_Insect +ovl_En_Ishi +ovl_En_It +ovl_En_Jj +ovl_En_Js +ovl_En_Jsjutan +ovl_En_Kakasi +ovl_En_Kakasi2 +ovl_En_Kakasi3 +ovl_En_Kanban +ovl_En_Karebaba +ovl_En_Ko +ovl_En_Kusa +ovl_En_Kz +ovl_En_Light +ovl_En_Lightbox +ovl_En_M_Fire1 +ovl_En_M_Thunder +ovl_En_Ma1 +ovl_En_Ma2 +ovl_En_Ma3 +ovl_En_Mag +ovl_En_Mb +ovl_En_Md +ovl_En_Mk +ovl_En_Mm +ovl_En_Mm2 +ovl_En_Ms +ovl_En_Mu +ovl_En_Nb +ovl_En_Niw +ovl_En_Niw_Girl +ovl_En_Niw_Lady +ovl_En_Nutsball +ovl_En_Nwc +ovl_En_Ny +ovl_En_OE2 +ovl_En_Okarina_Effect +ovl_En_Okarina_Tag +ovl_En_Okuta +ovl_En_Ossan +ovl_En_Owl +ovl_En_Part +ovl_En_Peehat +ovl_En_Po_Desert +ovl_En_Po_Field +ovl_En_Po_Relay +ovl_En_Po_Sisters +ovl_En_Poh +ovl_En_Pu_box +ovl_En_Rd +ovl_En_Reeba +ovl_En_River_Sound +ovl_En_Rl +ovl_En_Rr +ovl_En_Ru1 +ovl_En_Ru2 +ovl_En_Sa +ovl_En_Sb +ovl_En_Scene_Change +ovl_En_Sda +ovl_En_Shopnuts +ovl_En_Si +ovl_En_Siofuki +ovl_En_Skb +ovl_En_Skj +ovl_En_Skjneedle +ovl_En_Ssh +ovl_En_St +ovl_En_Sth +ovl_En_Stream +ovl_En_Sw +ovl_En_Syateki_Itm +ovl_En_Syateki_Man +ovl_En_Syateki_Niw +ovl_En_Ta +ovl_En_Takara_Man +ovl_En_Tana +ovl_En_Tg +ovl_En_Tite +ovl_En_Tk +ovl_En_Torch +ovl_En_Torch2 +ovl_En_Toryo +ovl_En_Tp +ovl_En_Tr +ovl_En_Trap +ovl_En_Tubo_Trap +ovl_En_Vali +ovl_En_Vase +ovl_En_Vb_Ball +ovl_En_Viewer +ovl_En_Vm +ovl_En_Wall_Tubo +ovl_En_Wallmas +ovl_En_Weather_Tag +ovl_En_Weiyer +ovl_En_Wf +ovl_En_Wonder_Item +ovl_En_Wonder_Talk +ovl_En_Wonder_Talk2 +ovl_En_Wood02 +ovl_En_Xc +ovl_En_Yabusame_Mark +ovl_En_Yukabyun +ovl_En_Zf +ovl_En_Zl1 +ovl_En_Zl2 +ovl_En_Zl3 +ovl_En_Zl4 +ovl_En_Zo +ovl_En_fHG +ovl_End_Title +ovl_Fishing +ovl_Item_B_Heart +ovl_Item_Etcetera +ovl_Item_Inbox +ovl_Item_Ocarina +ovl_Item_Shield +ovl_Magic_Dark +ovl_Magic_Fire +ovl_Magic_Wind +ovl_Mir_Ray +ovl_Obj_Bean +ovl_Obj_Blockstop +ovl_Obj_Bombiwa +ovl_Obj_Comb +ovl_Obj_Dekujr +ovl_Obj_Elevator +ovl_Obj_Hamishi +ovl_Obj_Hana +ovl_Obj_Hsblock +ovl_Obj_Ice_Poly +ovl_Obj_Kibako +ovl_Obj_Kibako2 +ovl_Obj_Lift +ovl_Obj_Lightswitch +ovl_Obj_Makekinsuta +ovl_Obj_Makeoshihiki +ovl_Obj_Mure +ovl_Obj_Mure2 +ovl_Obj_Mure3 +ovl_Obj_Oshihiki +ovl_Obj_Roomtimer +ovl_Obj_Switch +ovl_Obj_Syokudai +ovl_Obj_Timeblock +ovl_Obj_Tsubo +ovl_Obj_Warp2block +ovl_Object_Kankyo +ovl_Oceff_Spot +ovl_Oceff_Storm +ovl_Oceff_Wipe +ovl_Oceff_Wipe2 +ovl_Oceff_Wipe3 +ovl_Oceff_Wipe4 +ovl_Shot_Sun +gameplay_keep +gameplay_field_keep +gameplay_dangeon_keep +gameplay_object_exchange_static +object_link_boy +object_link_child +object_box +object_human +object_okuta +object_poh +object_wallmaster +object_dy_obj +object_firefly +object_dodongo +object_fire +object_niw +object_tite +object_reeba +object_peehat +object_kingdodongo +object_horse +object_zf +object_goma +object_zl1 +object_gol +object_bubble +object_dodojr +object_torch2 +object_bl +object_tp +object_oA1 +object_st +object_bw +object_ei +object_horse_normal +object_oB1 +object_o_anime +object_spot04_objects +object_ddan_objects +object_hidan_objects +object_horse_ganon +object_oA2 +object_spot00_objects +object_mb +object_bombf +object_sk2 +object_oE1 +object_oE_anime +object_oE2 +object_ydan_objects +object_gnd +object_am +object_dekubaba +object_oA3 +object_oA4 +object_oA5 +object_oA6 +object_oA7 +object_jj +object_oA8 +object_oA9 +object_oB2 +object_oB3 +object_oB4 +object_horse_zelda +object_opening_demo1 +object_warp1 +object_b_heart +object_dekunuts +object_oE3 +object_oE4 +object_menkuri_objects +object_oE5 +object_oE6 +object_oE7 +object_oE8 +object_oE9 +object_oE10 +object_oE11 +object_oE12 +object_vali +object_oA10 +object_oA11 +object_mizu_objects +object_fhg +object_ossan +object_mori_hineri1 +object_Bb +object_toki_objects +object_yukabyun +object_zl2 +object_mjin +object_mjin_flash +object_mjin_dark +object_mjin_flame +object_mjin_ice +object_mjin_soul +object_mjin_wind +object_mjin_oka +object_haka_objects +object_spot06_objects +object_ice_objects +object_relay_objects +object_mori_hineri1a +object_mori_hineri2 +object_mori_hineri2a +object_mori_objects +object_mori_tex +object_spot08_obj +object_warp2 +object_hata +object_bird +object_wood02 +object_lightbox +object_pu_box +object_trap +object_vase +object_im +object_ta +object_tk +object_xc +object_vm +object_bv +object_hakach_objects +object_efc_crystal_light +object_efc_fire_ball +object_efc_flash +object_efc_lgt_shower +object_efc_star_field +object_god_lgt +object_light_ring +object_triforce_spot +object_medal +object_bdan_objects +object_sd +object_rd +object_po_sisters +object_heavy_object +object_gndd +object_fd +object_du +object_fw +object_horse_link_child +object_spot02_objects +object_haka +object_ru1 +object_syokudai +object_fd2 +object_dh +object_rl +object_efc_tw +object_demo_tre_lgt +object_gi_key +object_mir_ray +object_brob +object_gi_jewel +object_spot09_obj +object_spot18_obj +object_bdoor +object_spot17_obj +object_shop_dungen +object_nb +object_mo +object_sb +object_gi_melody +object_gi_heart +object_gi_compass +object_gi_bosskey +object_gi_medal +object_gi_nuts +object_sa +object_gi_hearts +object_gi_arrowcase +object_gi_bombpouch +object_in +object_tr +object_spot16_obj +object_oE1s +object_oE4s +object_os_anime +object_gi_bottle +object_gi_stick +object_gi_map +object_oF1d_map +object_ru2 +object_gi_shield_1 +object_dekujr +object_gi_magicpot +object_gi_bomb_1 +object_oF1s +object_ma2 +object_gi_purse +object_hni +object_tw +object_rr +object_bxa +object_anubice +object_gi_gerudo +object_gi_arrow +object_gi_bomb_2 +object_gi_egg +object_gi_scale +object_gi_shield_2 +object_gi_hookshot +object_gi_ocarina +object_gi_milk +object_ma1 +object_ganon +object_sst +object_ny +object_fr +object_gi_pachinko +object_gi_boomerang +object_gi_bow +object_gi_glasses +object_gi_liquid +object_ani +object_demo_6k +object_gi_shield_3 +object_gi_letter +object_spot15_obj +object_jya_obj +object_gi_clothes +object_gi_bean +object_gi_fish +object_gi_saw +object_gi_hammer +object_gi_grass +object_gi_longsword +object_spot01_objects +object_md +object_km1 +object_kw1 +object_zo +object_kz +object_umajump +object_masterkokiri +object_masterkokirihead +object_mastergolon +object_masterzoora +object_aob +object_ik +object_ahg +object_cne +object_gi_niwatori +object_skj +object_gi_bottle_letter +object_bji +object_bba +object_gi_ocarina_0 +object_ds +object_ane +object_boj +object_spot03_object +object_spot07_object +object_fz +object_bob +object_ge1 +object_yabusame_point +object_gi_boots_2 +object_gi_seed +object_gnd_magic +object_d_elevator +object_d_hsblock +object_d_lift +object_mamenoki +object_goroiwa +object_toryo +object_daiku +object_nwc +object_blkobj +object_gm +object_ms +object_hs +object_ingate +object_lightswitch +object_kusa +object_tsubo +object_gi_gloves +object_gi_coin +object_kanban +object_gjyo_objects +object_owl +object_mk +object_fu +object_gi_ki_tan_mask +object_gi_redead_mask +object_gi_skj_mask +object_gi_rabit_mask +object_gi_truth_mask +object_ganon_objects +object_siofuki +object_stream +object_mm +object_fa +object_os +object_gi_eye_lotion +object_gi_powder +object_gi_mushroom +object_gi_ticketstone +object_gi_brokensword +object_js +object_cs +object_gi_prescription +object_gi_bracelet +object_gi_soldout +object_gi_frog +object_mag +object_door_gerudo +object_gt +object_efc_erupc +object_zl2_anime1 +object_zl2_anime2 +object_gi_golonmask +object_gi_zoramask +object_gi_gerudomask +object_ganon2 +object_ka +object_ts +object_zg +object_gi_hoverboots +object_gi_m_arrow +object_ds2 +object_ec +object_fish +object_gi_sutaru +object_gi_goddess +object_ssh +object_bigokuta +object_bg +object_spot05_objects +object_spot12_obj +object_bombiwa +object_hintnuts +object_rs +object_spot00_break +object_gla +object_shopnuts +object_geldb +object_gr +object_dog +object_jya_iron +object_jya_door +object_spot01_objects2 +object_spot11_obj +object_kibako2 +object_dns +object_dnk +object_gi_fire +object_gi_insect +object_gi_butterfly +object_gi_ghost +object_gi_soul +object_bowl +object_po_field +object_demo_kekkai +object_efc_doughnut +object_gi_dekupouch +object_ganon_anime1 +object_ganon_anime2 +object_ganon_anime3 +object_gi_rupy +object_spot01_matoya +object_spot01_matoyab +object_po_composer +object_mu +object_wf +object_skb +object_gj +object_geff +object_haka_door +object_gs +object_ps +object_bwall +object_crow +object_cow +object_cob +object_gi_sword_1 +object_door_killer +object_ouke_haka +object_timeblock +object_zl4 +g_pn_01 +g_pn_02 +g_pn_03 +g_pn_04 +g_pn_05 +g_pn_06 +g_pn_07 +g_pn_08 +g_pn_09 +g_pn_10 +g_pn_11 +g_pn_12 +g_pn_13 +g_pn_14 +g_pn_15 +g_pn_16 +g_pn_17 +g_pn_18 +g_pn_19 +g_pn_20 +g_pn_21 +g_pn_22 +g_pn_23 +g_pn_24 +g_pn_25 +g_pn_26 +g_pn_27 +g_pn_28 +g_pn_29 +g_pn_30 +g_pn_31 +g_pn_32 +g_pn_33 +g_pn_34 +g_pn_35 +g_pn_36 +g_pn_37 +g_pn_38 +g_pn_39 +g_pn_40 +g_pn_41 +g_pn_42 +g_pn_43 +g_pn_44 +g_pn_45 +g_pn_46 +g_pn_47 +g_pn_48 +g_pn_49 +g_pn_50 +g_pn_51 +g_pn_52 +g_pn_53 +g_pn_54 +g_pn_55 +g_pn_56 +g_pn_57 +z_select_static +nintendo_rogo_static +title_static +parameter_static +vr_fine0_static +vr_fine0_pal_static +vr_fine1_static +vr_fine1_pal_static +vr_fine2_static +vr_fine2_pal_static +vr_fine3_static +vr_fine3_pal_static +vr_cloud0_static +vr_cloud0_pal_static +vr_cloud1_static +vr_cloud1_pal_static +vr_cloud2_static +vr_cloud2_pal_static +vr_cloud3_static +vr_cloud3_pal_static +vr_holy0_static +vr_holy0_pal_static +vr_holy1_static +vr_holy1_pal_static +vr_MDVR_static +vr_MDVR_pal_static +vr_MNVR_static +vr_MNVR_pal_static +vr_RUVR_static +vr_RUVR_pal_static +vr_LHVR_static +vr_LHVR_pal_static +vr_KHVR_static +vr_KHVR_pal_static +vr_K3VR_static +vr_K3VR_pal_static +vr_K4VR_static +vr_K4VR_pal_static +vr_K5VR_static +vr_K5VR_pal_static +vr_SP1a_static +vr_SP1a_pal_static +vr_MLVR_static +vr_MLVR_pal_static +vr_KKRVR_static +vr_KKRVR_pal_static +vr_KR3VR_static +vr_KR3VR_pal_static +vr_IPVR_static +vr_IPVR_pal_static +vr_KSVR_static +vr_KSVR_pal_static +vr_GLVR_static +vr_GLVR_pal_static +vr_ZRVR_static +vr_ZRVR_pal_static +vr_DGVR_static +vr_DGVR_pal_static +vr_ALVR_static +vr_ALVR_pal_static +vr_NSVR_static +vr_NSVR_pal_static +vr_LBVR_static +vr_LBVR_pal_static +vr_TTVR_static +vr_TTVR_pal_static +vr_FCVR_static +vr_FCVR_pal_static +elf_message_field +elf_message_ydan +ydan_scene +ydan_room_0 +ydan_room_1 +ydan_room_2 +ydan_room_3 +ydan_room_4 +ydan_room_5 +ydan_room_6 +ydan_room_7 +ydan_room_8 +ydan_room_9 +ydan_room_10 +ydan_room_11 +ddan_scene +ddan_room_0 +ddan_room_1 +ddan_room_2 +ddan_room_3 +ddan_room_4 +ddan_room_5 +ddan_room_6 +ddan_room_7 +ddan_room_8 +ddan_room_9 +ddan_room_10 +ddan_room_11 +ddan_room_12 +ddan_room_13 +ddan_room_14 +ddan_room_15 +ddan_room_16 +bdan_scene +bdan_room_0 +bdan_room_1 +bdan_room_2 +bdan_room_3 +bdan_room_4 +bdan_room_5 +bdan_room_6 +bdan_room_7 +bdan_room_8 +bdan_room_9 +bdan_room_10 +bdan_room_11 +bdan_room_12 +bdan_room_13 +bdan_room_14 +bdan_room_15 +Bmori1_scene +Bmori1_room_0 +Bmori1_room_1 +Bmori1_room_2 +Bmori1_room_3 +Bmori1_room_4 +Bmori1_room_5 +Bmori1_room_6 +Bmori1_room_7 +Bmori1_room_8 +Bmori1_room_9 +Bmori1_room_10 +Bmori1_room_11 +Bmori1_room_12 +Bmori1_room_13 +Bmori1_room_14 +Bmori1_room_15 +Bmori1_room_16 +Bmori1_room_17 +Bmori1_room_18 +Bmori1_room_19 +Bmori1_room_20 +Bmori1_room_21 +Bmori1_room_22 +HIDAN_scene +HIDAN_room_0 +HIDAN_room_1 +HIDAN_room_2 +HIDAN_room_3 +HIDAN_room_4 +HIDAN_room_5 +HIDAN_room_6 +HIDAN_room_7 +HIDAN_room_8 +HIDAN_room_9 +HIDAN_room_10 +HIDAN_room_11 +HIDAN_room_12 +HIDAN_room_13 +HIDAN_room_14 +HIDAN_room_15 +HIDAN_room_16 +HIDAN_room_17 +HIDAN_room_18 +HIDAN_room_19 +HIDAN_room_20 +HIDAN_room_21 +HIDAN_room_22 +HIDAN_room_23 +HIDAN_room_24 +HIDAN_room_25 +HIDAN_room_26 +MIZUsin_scene +MIZUsin_room_0 +MIZUsin_room_1 +MIZUsin_room_2 +MIZUsin_room_3 +MIZUsin_room_4 +MIZUsin_room_5 +MIZUsin_room_6 +MIZUsin_room_7 +MIZUsin_room_8 +MIZUsin_room_9 +MIZUsin_room_10 +MIZUsin_room_11 +MIZUsin_room_12 +MIZUsin_room_13 +MIZUsin_room_14 +MIZUsin_room_15 +MIZUsin_room_16 +MIZUsin_room_17 +MIZUsin_room_18 +MIZUsin_room_19 +MIZUsin_room_20 +MIZUsin_room_21 +MIZUsin_room_22 +jyasinzou_scene +jyasinzou_room_0 +jyasinzou_room_1 +jyasinzou_room_2 +jyasinzou_room_3 +jyasinzou_room_4 +jyasinzou_room_5 +jyasinzou_room_6 +jyasinzou_room_7 +jyasinzou_room_8 +jyasinzou_room_9 +jyasinzou_room_10 +jyasinzou_room_11 +jyasinzou_room_12 +jyasinzou_room_13 +jyasinzou_room_14 +jyasinzou_room_15 +jyasinzou_room_16 +jyasinzou_room_17 +jyasinzou_room_18 +jyasinzou_room_19 +jyasinzou_room_20 +jyasinzou_room_21 +jyasinzou_room_22 +jyasinzou_room_23 +jyasinzou_room_24 +jyasinzou_room_25 +jyasinzou_room_26 +jyasinzou_room_27 +jyasinzou_room_28 +HAKAdan_scene +HAKAdan_room_0 +HAKAdan_room_1 +HAKAdan_room_2 +HAKAdan_room_3 +HAKAdan_room_4 +HAKAdan_room_5 +HAKAdan_room_6 +HAKAdan_room_7 +HAKAdan_room_8 +HAKAdan_room_9 +HAKAdan_room_10 +HAKAdan_room_11 +HAKAdan_room_12 +HAKAdan_room_13 +HAKAdan_room_14 +HAKAdan_room_15 +HAKAdan_room_16 +HAKAdan_room_17 +HAKAdan_room_18 +HAKAdan_room_19 +HAKAdan_room_20 +HAKAdan_room_21 +HAKAdan_room_22 +HAKAdanCH_scene +HAKAdanCH_room_0 +HAKAdanCH_room_1 +HAKAdanCH_room_2 +HAKAdanCH_room_3 +HAKAdanCH_room_4 +HAKAdanCH_room_5 +HAKAdanCH_room_6 +ice_doukutu_scene +ice_doukutu_room_0 +ice_doukutu_room_1 +ice_doukutu_room_2 +ice_doukutu_room_3 +ice_doukutu_room_4 +ice_doukutu_room_5 +ice_doukutu_room_6 +ice_doukutu_room_7 +ice_doukutu_room_8 +ice_doukutu_room_9 +ice_doukutu_room_10 +ice_doukutu_room_11 +men_scene +men_room_0 +men_room_1 +men_room_2 +men_room_3 +men_room_4 +men_room_5 +men_room_6 +men_room_7 +men_room_8 +men_room_9 +men_room_10 +ganontika_scene +ganontika_room_0 +ganontika_room_1 +ganontika_room_2 +ganontika_room_3 +ganontika_room_4 +ganontika_room_5 +ganontika_room_6 +ganontika_room_7 +ganontika_room_8 +ganontika_room_9 +ganontika_room_10 +ganontika_room_11 +ganontika_room_12 +ganontika_room_13 +ganontika_room_14 +ganontika_room_15 +ganontika_room_16 +ganontika_room_17 +ganontika_room_18 +ganontika_room_19 +spot00_scene +spot00_room_0 +spot01_scene +spot01_room_0 +spot02_scene +spot02_room_0 +spot02_room_1 +spot03_scene +spot03_room_0 +spot03_room_1 +spot04_scene +spot04_room_0 +spot04_room_1 +spot04_room_2 +spot05_scene +spot05_room_0 +spot06_scene +spot06_room_0 +spot07_scene +spot07_room_0 +spot07_room_1 +spot08_scene +spot08_room_0 +spot09_scene +spot09_room_0 +spot10_scene +spot10_room_0 +spot10_room_1 +spot10_room_2 +spot10_room_3 +spot10_room_4 +spot10_room_5 +spot10_room_6 +spot10_room_7 +spot10_room_8 +spot10_room_9 +spot11_scene +spot11_room_0 +spot12_scene +spot12_room_0 +spot12_room_1 +spot13_scene +spot13_room_0 +spot13_room_1 +spot15_scene +spot15_room_0 +spot16_scene +spot16_room_0 +spot17_scene +spot17_room_0 +spot17_room_1 +spot18_scene +spot18_room_0 +spot18_room_1 +spot18_room_2 +spot18_room_3 +market_day_scene +market_day_room_0 +market_night_scene +market_night_room_0 +kenjyanoma_scene +kenjyanoma_room_0 +tokinoma_scene +tokinoma_room_0 +tokinoma_room_1 +link_home_scene +link_home_room_0 +kokiri_shop_scene +kokiri_shop_room_0 +kokiri_home_scene +kokiri_home_room_0 +kakusiana_scene +kakusiana_room_0 +kakusiana_room_1 +kakusiana_room_2 +kakusiana_room_3 +kakusiana_room_4 +kakusiana_room_5 +kakusiana_room_6 +kakusiana_room_7 +kakusiana_room_8 +kakusiana_room_9 +kakusiana_room_10 +kakusiana_room_11 +kakusiana_room_12 +kakusiana_room_13 +entra_scene +entra_room_0 +moribossroom_scene +moribossroom_room_0 +moribossroom_room_1 +syatekijyou_scene +syatekijyou_room_0 +shop1_scene +shop1_room_0 +hairal_niwa_scene +hairal_niwa_room_0 +ganon_tou_scene +ganon_tou_room_0 +market_alley_scene +market_alley_room_0 +spot20_scene +spot20_room_0 +market_ruins_scene +market_ruins_room_0 +entra_n_scene +entra_n_room_0 +enrui_scene +enrui_room_0 +market_alley_n_scene +market_alley_n_room_0 +hiral_demo_scene +hiral_demo_room_0 +kokiri_home3_scene +kokiri_home3_room_0 +malon_stable_scene +malon_stable_room_0 +kakariko_scene +kakariko_room_0 +bdan_boss_scene +bdan_boss_room_0 +bdan_boss_room_1 +FIRE_bs_scene +FIRE_bs_room_0 +FIRE_bs_room_1 +hut_scene +hut_room_0 +daiyousei_izumi_scene +daiyousei_izumi_room_0 +hakaana_scene +hakaana_room_0 +yousei_izumi_tate_scene +yousei_izumi_tate_room_0 +yousei_izumi_yoko_scene +yousei_izumi_yoko_room_0 +golon_scene +golon_room_0 +zoora_scene +zoora_room_0 +drag_scene +drag_room_0 +alley_shop_scene +alley_shop_room_0 +night_shop_scene +night_shop_room_0 +impa_scene +impa_room_0 +labo_scene +labo_room_0 +tent_scene +tent_room_0 +nakaniwa_scene +nakaniwa_room_0 +ddan_boss_scene +ddan_boss_room_0 +ddan_boss_room_1 +ydan_boss_scene +ydan_boss_room_0 +ydan_boss_room_1 +HAKAdan_bs_scene +HAKAdan_bs_room_0 +HAKAdan_bs_room_1 +MIZUsin_bs_scene +MIZUsin_bs_room_0 +MIZUsin_bs_room_1 +ganon_scene +ganon_room_0 +ganon_room_1 +ganon_room_2 +ganon_room_3 +ganon_room_4 +ganon_room_5 +ganon_room_6 +ganon_room_7 +ganon_room_8 +ganon_room_9 +ganon_boss_scene +ganon_boss_room_0 +jyasinboss_scene +jyasinboss_room_0 +jyasinboss_room_1 +jyasinboss_room_2 +jyasinboss_room_3 +kokiri_home4_scene +kokiri_home4_room_0 +kokiri_home5_scene +kokiri_home5_room_0 +ganon_final_scene +ganon_final_room_0 +kakariko3_scene +kakariko3_room_0 +hakasitarelay_scene +hakasitarelay_room_0 +hakasitarelay_room_1 +hakasitarelay_room_2 +hakasitarelay_room_3 +hakasitarelay_room_4 +hakasitarelay_room_5 +hakasitarelay_room_6 +shrine_scene +shrine_room_0 +turibori_scene +turibori_room_0 +shrine_n_scene +shrine_n_room_0 +shrine_r_scene +shrine_r_room_0 +hakaana2_scene +hakaana2_room_0 +gerudoway_scene +gerudoway_room_0 +gerudoway_room_1 +gerudoway_room_2 +gerudoway_room_3 +gerudoway_room_4 +gerudoway_room_5 +hairal_niwa_n_scene +hairal_niwa_n_room_0 +bowling_scene +bowling_room_0 +hakaana_ouke_scene +hakaana_ouke_room_0 +hakaana_ouke_room_1 +hakaana_ouke_room_2 +hylia_labo_scene +hylia_labo_room_0 +souko_scene +souko_room_0 +souko_room_1 +souko_room_2 +miharigoya_scene +miharigoya_room_0 +mahouya_scene +mahouya_room_0 +takaraya_scene +takaraya_room_0 +takaraya_room_1 +takaraya_room_2 +takaraya_room_3 +takaraya_room_4 +takaraya_room_5 +takaraya_room_6 +ganon_sonogo_scene +ganon_sonogo_room_0 +ganon_sonogo_room_1 +ganon_sonogo_room_2 +ganon_sonogo_room_3 +ganon_sonogo_room_4 +ganon_demo_scene +ganon_demo_room_0 +face_shop_scene +face_shop_room_0 +kinsuta_scene +kinsuta_room_0 +ganontikasonogo_scene +ganontikasonogo_room_0 +ganontikasonogo_room_1 +bump_texture_static +anime_model_1_static +anime_model_2_static +anime_model_3_static +anime_model_4_static +anime_model_5_static +anime_model_6_static +anime_texture_1_static +anime_texture_2_static +anime_texture_3_static +anime_texture_4_static +anime_texture_5_static +anime_texture_6_static +softsprite_matrix_static \ No newline at end of file diff --git a/soh/assets/extractor/filelists/ntsc_12_oot.txt b/soh/assets/extractor/filelists/ntsc_12_oot.txt new file mode 100644 index 000000000..0cf6ab906 --- /dev/null +++ b/soh/assets/extractor/filelists/ntsc_12_oot.txt @@ -0,0 +1,1510 @@ +makerom +boot +dmadata +Audiobank +Audioseq +Audiotable +kanji +link_animetion +icon_item_static +icon_item_24_static +icon_item_field_static +icon_item_dungeon_static +icon_item_gameover_static +icon_item_jpn_static +icon_item_nes_static +item_name_static +map_name_static +do_action_static +message_static +message_texture_static +nes_font_static +jpn_message_data_static +nes_message_data_static +staff_message_data_static +map_grand_static +map_i_static +map_48x85_static +code +n64dd +ovl_title +ovl_select +ovl_opening +ovl_file_choose +ovl_kaleido_scope +ovl_player_actor +ovl_map_mark_data +ovl_En_Test +ovl_En_GirlA +ovl_En_Part +ovl_En_Light +ovl_En_Door +ovl_En_Box +ovl_En_Poh +ovl_En_Okuta +ovl_En_Bom +ovl_En_Wallmas +ovl_En_Dodongo +ovl_En_Firefly +ovl_En_Horse +ovl_En_Arrow +ovl_En_Elf +ovl_En_Niw +ovl_En_Tite +ovl_En_Reeba +ovl_En_Peehat +ovl_En_Holl +ovl_En_Scene_Change +ovl_En_Zf +ovl_En_Hata +ovl_Boss_Dodongo +ovl_Boss_Goma +ovl_En_Zl1 +ovl_En_Viewer +ovl_En_Goma +ovl_Bg_Pushbox +ovl_En_Bubble +ovl_Door_Shutter +ovl_En_Dodojr +ovl_En_Bdfire +ovl_En_Boom +ovl_En_Torch2 +ovl_En_Bili +ovl_En_Tp +ovl_En_St +ovl_En_Bw +ovl_En_Eiyer +ovl_En_River_Sound +ovl_En_Horse_Normal +ovl_En_Ossan +ovl_Bg_Treemouth +ovl_Bg_Dodoago +ovl_Bg_Hidan_Dalm +ovl_Bg_Hidan_Hrock +ovl_En_Horse_Ganon +ovl_Bg_Hidan_Rock +ovl_Bg_Hidan_Rsekizou +ovl_Bg_Hidan_Sekizou +ovl_Bg_Hidan_Sima +ovl_Bg_Hidan_Syoku +ovl_En_Xc +ovl_Bg_Hidan_Curtain +ovl_Bg_Spot00_Hanebasi +ovl_En_Mb +ovl_En_Bombf +ovl_Bg_Hidan_Firewall +ovl_Bg_Dy_Yoseizo +ovl_En_Zl2 +ovl_Bg_Hidan_Fslift +ovl_En_OE2 +ovl_Bg_Ydan_Hasi +ovl_Bg_Ydan_Maruta +ovl_Boss_Ganondrof +ovl_En_Am +ovl_En_Dekubaba +ovl_En_M_Fire1 +ovl_En_M_Thunder +ovl_Bg_Ddan_Jd +ovl_Bg_Breakwall +ovl_En_Jj +ovl_En_Horse_Zelda +ovl_Bg_Ddan_Kd +ovl_Door_Warp1 +ovl_Obj_Syokudai +ovl_Item_B_Heart +ovl_En_Dekunuts +ovl_Bg_Menkuri_Kaiten +ovl_Bg_Menkuri_Eye +ovl_En_Vali +ovl_Bg_Mizu_Movebg +ovl_Bg_Mizu_Water +ovl_Arms_Hook +ovl_En_fHG +ovl_Bg_Mori_Hineri +ovl_En_Bb +ovl_Bg_Toki_Hikari +ovl_En_Yukabyun +ovl_Bg_Toki_Swd +ovl_En_Fhg_Fire +ovl_Bg_Mjin +ovl_Bg_Hidan_Kousi +ovl_Door_Toki +ovl_Bg_Hidan_Hamstep +ovl_En_Bird +ovl_En_Wood02 +ovl_En_Lightbox +ovl_En_Pu_box +ovl_En_Trap +ovl_En_Arow_Trap +ovl_En_Vase +ovl_En_Ta +ovl_En_Tk +ovl_Bg_Mori_Bigst +ovl_Bg_Mori_Elevator +ovl_Bg_Mori_Kaitenkabe +ovl_Bg_Mori_Rakkatenjo +ovl_En_Vm +ovl_Demo_Effect +ovl_Demo_Kankyo +ovl_Bg_Hidan_Fwbig +ovl_En_Floormas +ovl_En_Heishi1 +ovl_En_Rd +ovl_En_Po_Sisters +ovl_Bg_Heavy_Block +ovl_Bg_Po_Event +ovl_Obj_Mure +ovl_En_Sw +ovl_Boss_Fd +ovl_Object_Kankyo +ovl_En_Du +ovl_En_Fd +ovl_En_Horse_Link_Child +ovl_Door_Ana +ovl_Bg_Spot02_Objects +ovl_Bg_Haka +ovl_Magic_Wind +ovl_Magic_Fire +ovl_En_Ru1 +ovl_Boss_Fd2 +ovl_En_Fd_Fire +ovl_En_Dh +ovl_En_Dha +ovl_En_Rl +ovl_En_Encount1 +ovl_Demo_Du +ovl_Demo_Im +ovl_Demo_Tre_Lgt +ovl_En_Fw +ovl_Bg_Vb_Sima +ovl_En_Vb_Ball +ovl_Bg_Haka_Megane +ovl_Bg_Haka_MeganeBG +ovl_Bg_Haka_Ship +ovl_Bg_Haka_Sgami +ovl_En_Heishi2 +ovl_En_Encount2 +ovl_En_Fire_Rock +ovl_En_Brob +ovl_Mir_Ray +ovl_Bg_Spot09_Obj +ovl_Bg_Spot18_Obj +ovl_Boss_Va +ovl_Bg_Haka_Tubo +ovl_Bg_Haka_Trap +ovl_Bg_Haka_Huta +ovl_Bg_Haka_Zou +ovl_Bg_Spot17_Funen +ovl_En_Syateki_Itm +ovl_En_Syateki_Man +ovl_En_Tana +ovl_En_Nb +ovl_Boss_Mo +ovl_En_Sb +ovl_En_Bigokuta +ovl_En_Karebaba +ovl_Bg_Bdan_Objects +ovl_Demo_Sa +ovl_Demo_Go +ovl_En_In +ovl_En_Tr +ovl_Bg_Spot16_Bombstone +ovl_Bg_Hidan_Kowarerukabe +ovl_Bg_Bombwall +ovl_En_Ru2 +ovl_Obj_Dekujr +ovl_Bg_Mizu_Uzu +ovl_Bg_Spot06_Objects +ovl_Bg_Ice_Objects +ovl_Bg_Haka_Water +ovl_En_Ma2 +ovl_En_Bom_Chu +ovl_En_Horse_Game_Check +ovl_Boss_Tw +ovl_En_Rr +ovl_En_Ba +ovl_En_Bx +ovl_En_Anubice +ovl_En_Anubice_Fire +ovl_Bg_Mori_Hashigo +ovl_Bg_Mori_Hashira4 +ovl_Bg_Mori_Idomizu +ovl_Bg_Spot16_Doughnut +ovl_Bg_Bdan_Switch +ovl_En_Ma1 +ovl_Boss_Ganon +ovl_Boss_Sst +ovl_En_Ny +ovl_En_Fr +ovl_Item_Shield +ovl_Bg_Ice_Shelter +ovl_En_Ice_Hono +ovl_Item_Ocarina +ovl_Magic_Dark +ovl_Demo_6K +ovl_En_Anubice_Tag +ovl_Bg_Haka_Gate +ovl_Bg_Spot15_Saku +ovl_Bg_Jya_Goroiwa +ovl_Bg_Jya_Zurerukabe +ovl_Bg_Jya_Cobra +ovl_Bg_Jya_Kanaami +ovl_Fishing +ovl_Obj_Oshihiki +ovl_Bg_Gate_Shutter +ovl_Eff_Dust +ovl_Bg_Spot01_Fusya +ovl_Bg_Spot01_Idohashira +ovl_Bg_Spot01_Idomizu +ovl_Bg_Po_Syokudai +ovl_Bg_Ganon_Otyuka +ovl_Bg_Spot15_Rrbox +ovl_Bg_Umajump +ovl_En_Insect +ovl_En_Butte +ovl_En_Fish +ovl_Bg_Spot08_Iceblock +ovl_Item_Etcetera +ovl_Arrow_Fire +ovl_Arrow_Ice +ovl_Arrow_Light +ovl_Obj_Kibako +ovl_Obj_Tsubo +ovl_En_Wonder_Item +ovl_En_Ik +ovl_Demo_Ik +ovl_En_Skj +ovl_En_Skjneedle +ovl_En_G_Switch +ovl_Demo_Ext +ovl_Demo_Shd +ovl_En_Dns +ovl_Elf_Msg +ovl_En_Honotrap +ovl_En_Tubo_Trap +ovl_Obj_Ice_Poly +ovl_Bg_Spot03_Taki +ovl_Bg_Spot07_Taki +ovl_En_Fz +ovl_En_Po_Relay +ovl_Bg_Relay_Objects +ovl_En_Diving_Game +ovl_En_Kusa +ovl_Obj_Bean +ovl_Obj_Bombiwa +ovl_Obj_Switch +ovl_Obj_Elevator +ovl_Obj_Lift +ovl_Obj_Hsblock +ovl_En_Okarina_Tag +ovl_En_Yabusame_Mark +ovl_En_Goroiwa +ovl_En_Ex_Ruppy +ovl_En_Toryo +ovl_En_Daiku +ovl_En_Nwc +ovl_En_Blkobj +ovl_Item_Inbox +ovl_En_Ge1 +ovl_Obj_Blockstop +ovl_En_Sda +ovl_En_Clear_Tag +ovl_En_Niw_Lady +ovl_En_Gm +ovl_En_Ms +ovl_En_Hs +ovl_Bg_Ingate +ovl_En_Kanban +ovl_En_Heishi3 +ovl_En_Syateki_Niw +ovl_En_Attack_Niw +ovl_Bg_Spot01_Idosoko +ovl_En_Sa +ovl_En_Wonder_Talk +ovl_Bg_Gjyo_Bridge +ovl_En_Ds +ovl_En_Mk +ovl_En_Bom_Bowl_Man +ovl_En_Bom_Bowl_Pit +ovl_En_Owl +ovl_En_Ishi +ovl_Obj_Hana +ovl_Obj_Lightswitch +ovl_Obj_Mure2 +ovl_En_Go +ovl_En_Fu +ovl_En_Changer +ovl_Bg_Jya_Megami +ovl_Bg_Jya_Lift +ovl_Bg_Jya_Bigmirror +ovl_Bg_Jya_Bombchuiwa +ovl_Bg_Jya_Amishutter +ovl_Bg_Jya_Bombiwa +ovl_Bg_Spot18_Basket +ovl_En_Ganon_Organ +ovl_En_Siofuki +ovl_En_Stream +ovl_En_Mm +ovl_En_Ko +ovl_En_Kz +ovl_En_Weather_Tag +ovl_Bg_Sst_Floor +ovl_En_Ani +ovl_En_Ex_Item +ovl_Bg_Jya_Ironobj +ovl_En_Js +ovl_En_Jsjutan +ovl_En_Cs +ovl_En_Md +ovl_En_Hy +ovl_En_Ganon_Mant +ovl_En_Okarina_Effect +ovl_En_Mag +ovl_Door_Gerudo +ovl_Elf_Msg2 +ovl_Demo_Gt +ovl_En_Po_Field +ovl_Efc_Erupc +ovl_Bg_Zg +ovl_En_Heishi4 +ovl_En_Zl3 +ovl_Boss_Ganon2 +ovl_En_Kakasi +ovl_En_Takara_Man +ovl_Obj_Makeoshihiki +ovl_Oceff_Spot +ovl_End_Title +ovl_En_Torch +ovl_Demo_Ec +ovl_Shot_Sun +ovl_En_Dy_Extra +ovl_En_Wonder_Talk2 +ovl_En_Ge2 +ovl_Obj_Roomtimer +ovl_En_Ssh +ovl_En_Sth +ovl_Oceff_Wipe +ovl_Effect_Ss_Dust +ovl_Effect_Ss_KiraKira +ovl_Effect_Ss_Bomb +ovl_Effect_Ss_Bomb2 +ovl_Effect_Ss_Blast +ovl_Effect_Ss_G_Spk +ovl_Effect_Ss_D_Fire +ovl_Effect_Ss_Bubble +ovl_Effect_Ss_G_Ripple +ovl_Effect_Ss_G_Splash +ovl_Effect_Ss_G_Magma +ovl_Effect_Ss_G_Fire +ovl_Effect_Ss_Lightning +ovl_Effect_Ss_Dt_Bubble +ovl_Effect_Ss_Hahen +ovl_Effect_Ss_Stick +ovl_Effect_Ss_Sibuki +ovl_Effect_Ss_Sibuki2 +ovl_Effect_Ss_G_Magma2 +ovl_Effect_Ss_Stone1 +ovl_Effect_Ss_HitMark +ovl_Effect_Ss_Fhg_Flash +ovl_Effect_Ss_K_Fire +ovl_Effect_Ss_Solder_Srch_Ball +ovl_Effect_Ss_Kakera +ovl_Effect_Ss_Ice_Piece +ovl_Effect_Ss_En_Ice +ovl_Effect_Ss_Fire_Tail +ovl_Effect_Ss_En_Fire +ovl_Effect_Ss_Extra +ovl_Effect_Ss_Fcircle +ovl_Effect_Ss_Dead_Db +ovl_Effect_Ss_Dead_Dd +ovl_Effect_Ss_Dead_Ds +ovl_Effect_Ss_Dead_Sound +ovl_Oceff_Storm +ovl_En_Weiyer +ovl_Bg_Spot05_Soko +ovl_Bg_Jya_1flift +ovl_Bg_Jya_Haheniron +ovl_Bg_Spot12_Gate +ovl_Bg_Spot12_Saku +ovl_En_Hintnuts +ovl_En_Nutsball +ovl_Bg_Spot00_Break +ovl_En_Shopnuts +ovl_En_It +ovl_En_GeldB +ovl_Oceff_Wipe2 +ovl_Oceff_Wipe3 +ovl_En_Niw_Girl +ovl_En_Dog +ovl_En_Si +ovl_Bg_Spot01_Objects2 +ovl_Obj_Comb +ovl_Bg_Spot11_Bakudankabe +ovl_Obj_Kibako2 +ovl_En_Dnt_Demo +ovl_En_Dnt_Jiji +ovl_En_Dnt_Nomal +ovl_En_Guest +ovl_Bg_Bom_Guard +ovl_En_Hs2 +ovl_Demo_Kekkai +ovl_Bg_Spot08_Bakudankabe +ovl_Bg_Spot17_Bakudankabe +ovl_Obj_Mure3 +ovl_En_Tg +ovl_En_Mu +ovl_En_Go2 +ovl_En_Wf +ovl_En_Skb +ovl_Demo_Gj +ovl_Demo_Geff +ovl_Bg_Gnd_Firemeiro +ovl_Bg_Gnd_Darkmeiro +ovl_Bg_Gnd_Soulmeiro +ovl_Bg_Gnd_Nisekabe +ovl_Bg_Gnd_Iceblock +ovl_Bg_Ydan_Sp +ovl_En_Gb +ovl_En_Gs +ovl_Bg_Mizu_Bwall +ovl_Bg_Mizu_Shutter +ovl_En_Daiku_Kakariko +ovl_Bg_Bowl_Wall +ovl_En_Wall_Tubo +ovl_En_Po_Desert +ovl_En_Crow +ovl_Door_Killer +ovl_Bg_Spot11_Oasis +ovl_Bg_Spot18_Futa +ovl_Bg_Spot18_Shutter +ovl_En_Ma3 +ovl_En_Cow +ovl_Bg_Ice_Turara +ovl_Bg_Ice_Shutter +ovl_En_Kakasi2 +ovl_En_Kakasi3 +ovl_Oceff_Wipe4 +ovl_En_Eg +ovl_Bg_Menkuri_Nisekabe +ovl_En_Zo +ovl_Effect_Ss_Ice_Smoke +ovl_Obj_Makekinsuta +ovl_En_Ge3 +ovl_Obj_Timeblock +ovl_Obj_Hamishi +ovl_En_Zl4 +ovl_En_Mm2 +ovl_Bg_Jya_Block +ovl_Obj_Warp2block +gameplay_keep +gameplay_field_keep +gameplay_dangeon_keep +gameplay_object_exchange_static +object_link_boy +object_link_child +object_box +object_human +object_okuta +object_poh +object_wallmaster +object_dy_obj +object_firefly +object_dodongo +object_fire +object_niw +object_tite +object_reeba +object_peehat +object_kingdodongo +object_horse +object_zf +object_goma +object_zl1 +object_gol +object_bubble +object_dodojr +object_torch2 +object_bl +object_tp +object_oA1 +object_st +object_bw +object_ei +object_horse_normal +object_oB1 +object_o_anime +object_spot04_objects +object_ddan_objects +object_hidan_objects +object_horse_ganon +object_oA2 +object_spot00_objects +object_mb +object_bombf +object_sk2 +object_oE1 +object_oE_anime +object_oE2 +object_ydan_objects +object_gnd +object_am +object_dekubaba +object_oA3 +object_oA4 +object_oA5 +object_oA6 +object_oA7 +object_jj +object_oA8 +object_oA9 +object_oB2 +object_oB3 +object_oB4 +object_horse_zelda +object_opening_demo1 +object_warp1 +object_b_heart +object_dekunuts +object_oE3 +object_oE4 +object_menkuri_objects +object_oE5 +object_oE6 +object_oE7 +object_oE8 +object_oE9 +object_oE10 +object_oE11 +object_oE12 +object_vali +object_oA10 +object_oA11 +object_mizu_objects +object_fhg +object_ossan +object_mori_hineri1 +object_Bb +object_toki_objects +object_yukabyun +object_zl2 +object_mjin +object_mjin_flash +object_mjin_dark +object_mjin_flame +object_mjin_ice +object_mjin_soul +object_mjin_wind +object_mjin_oka +object_haka_objects +object_spot06_objects +object_ice_objects +object_relay_objects +object_mori_hineri1a +object_mori_hineri2 +object_mori_hineri2a +object_mori_objects +object_mori_tex +object_spot08_obj +object_warp2 +object_hata +object_bird +object_wood02 +object_lightbox +object_pu_box +object_trap +object_vase +object_im +object_ta +object_tk +object_xc +object_vm +object_bv +object_hakach_objects +object_efc_crystal_light +object_efc_fire_ball +object_efc_flash +object_efc_lgt_shower +object_efc_star_field +object_god_lgt +object_light_ring +object_triforce_spot +object_medal +object_bdan_objects +object_sd +object_rd +object_po_sisters +object_heavy_object +object_gndd +object_fd +object_du +object_fw +object_horse_link_child +object_spot02_objects +object_haka +object_ru1 +object_syokudai +object_fd2 +object_dh +object_rl +object_efc_tw +object_demo_tre_lgt +object_gi_key +object_mir_ray +object_brob +object_gi_jewel +object_spot09_obj +object_spot18_obj +object_bdoor +object_spot17_obj +object_shop_dungen +object_nb +object_mo +object_sb +object_gi_melody +object_gi_heart +object_gi_compass +object_gi_bosskey +object_gi_medal +object_gi_nuts +object_sa +object_gi_hearts +object_gi_arrowcase +object_gi_bombpouch +object_in +object_tr +object_spot16_obj +object_oE1s +object_oE4s +object_os_anime +object_gi_bottle +object_gi_stick +object_gi_map +object_oF1d_map +object_ru2 +object_gi_shield_1 +object_dekujr +object_gi_magicpot +object_gi_bomb_1 +object_oF1s +object_ma2 +object_gi_purse +object_hni +object_tw +object_rr +object_bxa +object_anubice +object_gi_gerudo +object_gi_arrow +object_gi_bomb_2 +object_gi_egg +object_gi_scale +object_gi_shield_2 +object_gi_hookshot +object_gi_ocarina +object_gi_milk +object_ma1 +object_ganon +object_sst +object_ny +object_fr +object_gi_pachinko +object_gi_boomerang +object_gi_bow +object_gi_glasses +object_gi_liquid +object_ani +object_demo_6k +object_gi_shield_3 +object_gi_letter +object_spot15_obj +object_jya_obj +object_gi_clothes +object_gi_bean +object_gi_fish +object_gi_saw +object_gi_hammer +object_gi_grass +object_gi_longsword +object_spot01_objects +object_md +object_km1 +object_kw1 +object_zo +object_kz +object_umajump +object_masterkokiri +object_masterkokirihead +object_mastergolon +object_masterzoora +object_aob +object_ik +object_ahg +object_cne +object_gi_niwatori +object_skj +object_gi_bottle_letter +object_bji +object_bba +object_gi_ocarina_0 +object_ds +object_ane +object_boj +object_spot03_object +object_spot07_object +object_fz +object_bob +object_ge1 +object_yabusame_point +object_gi_boots_2 +object_gi_seed +object_gnd_magic +object_d_elevator +object_d_hsblock +object_d_lift +object_mamenoki +object_goroiwa +object_toryo +object_daiku +object_nwc +object_blkobj +object_gm +object_ms +object_hs +object_ingate +object_lightswitch +object_kusa +object_tsubo +object_gi_gloves +object_gi_coin +object_kanban +object_gjyo_objects +object_owl +object_mk +object_fu +object_gi_ki_tan_mask +object_gi_redead_mask +object_gi_skj_mask +object_gi_rabit_mask +object_gi_truth_mask +object_ganon_objects +object_siofuki +object_stream +object_mm +object_fa +object_os +object_gi_eye_lotion +object_gi_powder +object_gi_mushroom +object_gi_ticketstone +object_gi_brokensword +object_js +object_cs +object_gi_prescription +object_gi_bracelet +object_gi_soldout +object_gi_frog +object_mag +object_door_gerudo +object_gt +object_efc_erupc +object_zl2_anime1 +object_zl2_anime2 +object_gi_golonmask +object_gi_zoramask +object_gi_gerudomask +object_ganon2 +object_ka +object_ts +object_zg +object_gi_hoverboots +object_gi_m_arrow +object_ds2 +object_ec +object_fish +object_gi_sutaru +object_gi_goddess +object_ssh +object_bigokuta +object_bg +object_spot05_objects +object_spot12_obj +object_bombiwa +object_hintnuts +object_rs +object_spot00_break +object_gla +object_shopnuts +object_geldb +object_gr +object_dog +object_jya_iron +object_jya_door +object_spot01_objects2 +object_spot11_obj +object_kibako2 +object_dns +object_dnk +object_gi_fire +object_gi_insect +object_gi_butterfly +object_gi_ghost +object_gi_soul +object_bowl +object_po_field +object_demo_kekkai +object_efc_doughnut +object_gi_dekupouch +object_ganon_anime1 +object_ganon_anime2 +object_ganon_anime3 +object_gi_rupy +object_spot01_matoya +object_spot01_matoyab +object_po_composer +object_mu +object_wf +object_skb +object_gj +object_geff +object_haka_door +object_gs +object_ps +object_bwall +object_crow +object_cow +object_cob +object_gi_sword_1 +object_door_killer +object_ouke_haka +object_timeblock +object_zl4 +g_pn_01 +g_pn_02 +g_pn_03 +g_pn_04 +g_pn_05 +g_pn_06 +g_pn_07 +g_pn_08 +g_pn_09 +g_pn_10 +g_pn_11 +g_pn_12 +g_pn_13 +g_pn_14 +g_pn_15 +g_pn_16 +g_pn_17 +g_pn_18 +g_pn_19 +g_pn_20 +g_pn_21 +g_pn_22 +g_pn_23 +g_pn_24 +g_pn_25 +g_pn_26 +g_pn_27 +g_pn_28 +g_pn_29 +g_pn_30 +g_pn_31 +g_pn_32 +g_pn_33 +g_pn_34 +g_pn_35 +g_pn_36 +g_pn_37 +g_pn_38 +g_pn_39 +g_pn_40 +g_pn_41 +g_pn_42 +g_pn_43 +g_pn_44 +g_pn_45 +g_pn_46 +g_pn_47 +g_pn_48 +g_pn_49 +g_pn_50 +g_pn_51 +g_pn_52 +g_pn_53 +g_pn_54 +g_pn_55 +g_pn_56 +g_pn_57 +z_select_static +nintendo_rogo_static +title_static +parameter_static +vr_fine0_static +vr_fine0_pal_static +vr_fine1_static +vr_fine1_pal_static +vr_fine2_static +vr_fine2_pal_static +vr_fine3_static +vr_fine3_pal_static +vr_cloud0_static +vr_cloud0_pal_static +vr_cloud1_static +vr_cloud1_pal_static +vr_cloud2_static +vr_cloud2_pal_static +vr_cloud3_static +vr_cloud3_pal_static +vr_holy0_static +vr_holy0_pal_static +vr_holy1_static +vr_holy1_pal_static +vr_MDVR_static +vr_MDVR_pal_static +vr_MNVR_static +vr_MNVR_pal_static +vr_RUVR_static +vr_RUVR_pal_static +vr_LHVR_static +vr_LHVR_pal_static +vr_KHVR_static +vr_KHVR_pal_static +vr_K3VR_static +vr_K3VR_pal_static +vr_K4VR_static +vr_K4VR_pal_static +vr_K5VR_static +vr_K5VR_pal_static +vr_SP1a_static +vr_SP1a_pal_static +vr_MLVR_static +vr_MLVR_pal_static +vr_KKRVR_static +vr_KKRVR_pal_static +vr_KR3VR_static +vr_KR3VR_pal_static +vr_IPVR_static +vr_IPVR_pal_static +vr_KSVR_static +vr_KSVR_pal_static +vr_GLVR_static +vr_GLVR_pal_static +vr_ZRVR_static +vr_ZRVR_pal_static +vr_DGVR_static +vr_DGVR_pal_static +vr_ALVR_static +vr_ALVR_pal_static +vr_NSVR_static +vr_NSVR_pal_static +vr_LBVR_static +vr_LBVR_pal_static +vr_TTVR_static +vr_TTVR_pal_static +vr_FCVR_static +vr_FCVR_pal_static +elf_message_field +elf_message_ydan +ddan_scene +ddan_room_0 +ddan_room_1 +ddan_room_2 +ddan_room_3 +ddan_room_4 +ddan_room_5 +ddan_room_6 +ddan_room_7 +ddan_room_8 +ddan_room_9 +ddan_room_10 +ddan_room_11 +ddan_room_12 +ddan_room_13 +ddan_room_14 +ddan_room_15 +ddan_room_16 +spot00_scene +spot00_room_0 +spot01_scene +spot01_room_0 +spot02_scene +spot02_room_0 +spot02_room_1 +spot03_scene +spot03_room_0 +spot03_room_1 +spot04_scene +spot04_room_0 +spot04_room_1 +spot04_room_2 +spot05_scene +spot05_room_0 +spot06_scene +spot06_room_0 +spot07_scene +spot07_room_0 +spot07_room_1 +spot08_scene +spot08_room_0 +spot09_scene +spot09_room_0 +spot10_scene +spot10_room_0 +spot10_room_1 +spot10_room_2 +spot10_room_3 +spot10_room_4 +spot10_room_5 +spot10_room_6 +spot10_room_7 +spot10_room_8 +spot10_room_9 +spot11_scene +spot11_room_0 +spot12_scene +spot12_room_0 +spot12_room_1 +spot13_scene +spot13_room_0 +spot13_room_1 +spot15_scene +spot15_room_0 +spot16_scene +spot16_room_0 +spot17_scene +spot17_room_0 +spot17_room_1 +spot18_scene +spot18_room_0 +spot18_room_1 +spot18_room_2 +spot18_room_3 +market_day_scene +market_day_room_0 +market_night_scene +market_night_room_0 +HIDAN_scene +HIDAN_room_0 +HIDAN_room_1 +HIDAN_room_2 +HIDAN_room_3 +HIDAN_room_4 +HIDAN_room_5 +HIDAN_room_6 +HIDAN_room_7 +HIDAN_room_8 +HIDAN_room_9 +HIDAN_room_10 +HIDAN_room_11 +HIDAN_room_12 +HIDAN_room_13 +HIDAN_room_14 +HIDAN_room_15 +HIDAN_room_16 +HIDAN_room_17 +HIDAN_room_18 +HIDAN_room_19 +HIDAN_room_20 +HIDAN_room_21 +HIDAN_room_22 +HIDAN_room_23 +HIDAN_room_24 +HIDAN_room_25 +HIDAN_room_26 +Bmori1_scene +Bmori1_room_0 +Bmori1_room_1 +Bmori1_room_2 +Bmori1_room_3 +Bmori1_room_4 +Bmori1_room_5 +Bmori1_room_6 +Bmori1_room_7 +Bmori1_room_8 +Bmori1_room_9 +Bmori1_room_10 +Bmori1_room_11 +Bmori1_room_12 +Bmori1_room_13 +Bmori1_room_14 +Bmori1_room_15 +Bmori1_room_16 +Bmori1_room_17 +Bmori1_room_18 +Bmori1_room_19 +Bmori1_room_20 +Bmori1_room_21 +Bmori1_room_22 +ydan_scene +ydan_room_0 +ydan_room_1 +ydan_room_2 +ydan_room_3 +ydan_room_4 +ydan_room_5 +ydan_room_6 +ydan_room_7 +ydan_room_8 +ydan_room_9 +ydan_room_10 +ydan_room_11 +kenjyanoma_scene +kenjyanoma_room_0 +tokinoma_scene +tokinoma_room_0 +tokinoma_room_1 +link_home_scene +link_home_room_0 +kokiri_shop_scene +kokiri_shop_room_0 +MIZUsin_scene +MIZUsin_room_0 +MIZUsin_room_1 +MIZUsin_room_2 +MIZUsin_room_3 +MIZUsin_room_4 +MIZUsin_room_5 +MIZUsin_room_6 +MIZUsin_room_7 +MIZUsin_room_8 +MIZUsin_room_9 +MIZUsin_room_10 +MIZUsin_room_11 +MIZUsin_room_12 +MIZUsin_room_13 +MIZUsin_room_14 +MIZUsin_room_15 +MIZUsin_room_16 +MIZUsin_room_17 +MIZUsin_room_18 +MIZUsin_room_19 +MIZUsin_room_20 +MIZUsin_room_21 +MIZUsin_room_22 +kokiri_home_scene +kokiri_home_room_0 +kakusiana_scene +kakusiana_room_0 +kakusiana_room_1 +kakusiana_room_2 +kakusiana_room_3 +kakusiana_room_4 +kakusiana_room_5 +kakusiana_room_6 +kakusiana_room_7 +kakusiana_room_8 +kakusiana_room_9 +kakusiana_room_10 +kakusiana_room_11 +kakusiana_room_12 +kakusiana_room_13 +entra_scene +entra_room_0 +bdan_scene +bdan_room_0 +bdan_room_1 +bdan_room_2 +bdan_room_3 +bdan_room_4 +bdan_room_5 +bdan_room_6 +bdan_room_7 +bdan_room_8 +bdan_room_9 +bdan_room_10 +bdan_room_11 +bdan_room_12 +bdan_room_13 +bdan_room_14 +bdan_room_15 +HAKAdan_scene +HAKAdan_room_0 +HAKAdan_room_1 +HAKAdan_room_2 +HAKAdan_room_3 +HAKAdan_room_4 +HAKAdan_room_5 +HAKAdan_room_6 +HAKAdan_room_7 +HAKAdan_room_8 +HAKAdan_room_9 +HAKAdan_room_10 +HAKAdan_room_11 +HAKAdan_room_12 +HAKAdan_room_13 +HAKAdan_room_14 +HAKAdan_room_15 +HAKAdan_room_16 +HAKAdan_room_17 +HAKAdan_room_18 +HAKAdan_room_19 +HAKAdan_room_20 +HAKAdan_room_21 +HAKAdan_room_22 +moribossroom_scene +moribossroom_room_0 +moribossroom_room_1 +syatekijyou_scene +syatekijyou_room_0 +men_scene +men_room_0 +men_room_1 +men_room_2 +men_room_3 +men_room_4 +men_room_5 +men_room_6 +men_room_7 +men_room_8 +men_room_9 +men_room_10 +shop1_scene +shop1_room_0 +hairal_niwa_scene +hairal_niwa_room_0 +ganon_tou_scene +ganon_tou_room_0 +market_alley_scene +market_alley_room_0 +spot20_scene +spot20_room_0 +market_ruins_scene +market_ruins_room_0 +entra_n_scene +entra_n_room_0 +enrui_scene +enrui_room_0 +market_alley_n_scene +market_alley_n_room_0 +hiral_demo_scene +hiral_demo_room_0 +kokiri_home3_scene +kokiri_home3_room_0 +jyasinzou_scene +jyasinzou_room_0 +jyasinzou_room_1 +jyasinzou_room_2 +jyasinzou_room_3 +jyasinzou_room_4 +jyasinzou_room_5 +jyasinzou_room_6 +jyasinzou_room_7 +jyasinzou_room_8 +jyasinzou_room_9 +jyasinzou_room_10 +jyasinzou_room_11 +jyasinzou_room_12 +jyasinzou_room_13 +jyasinzou_room_14 +jyasinzou_room_15 +jyasinzou_room_16 +jyasinzou_room_17 +jyasinzou_room_18 +jyasinzou_room_19 +jyasinzou_room_20 +jyasinzou_room_21 +jyasinzou_room_22 +jyasinzou_room_23 +jyasinzou_room_24 +jyasinzou_room_25 +jyasinzou_room_26 +jyasinzou_room_27 +jyasinzou_room_28 +ice_doukutu_scene +ice_doukutu_room_0 +ice_doukutu_room_1 +ice_doukutu_room_2 +ice_doukutu_room_3 +ice_doukutu_room_4 +ice_doukutu_room_5 +ice_doukutu_room_6 +ice_doukutu_room_7 +ice_doukutu_room_8 +ice_doukutu_room_9 +ice_doukutu_room_10 +ice_doukutu_room_11 +malon_stable_scene +malon_stable_room_0 +kakariko_scene +kakariko_room_0 +bdan_boss_scene +bdan_boss_room_0 +bdan_boss_room_1 +FIRE_bs_scene +FIRE_bs_room_0 +FIRE_bs_room_1 +hut_scene +hut_room_0 +daiyousei_izumi_scene +daiyousei_izumi_room_0 +hakaana_scene +hakaana_room_0 +yousei_izumi_tate_scene +yousei_izumi_tate_room_0 +yousei_izumi_yoko_scene +yousei_izumi_yoko_room_0 +golon_scene +golon_room_0 +zoora_scene +zoora_room_0 +drag_scene +drag_room_0 +alley_shop_scene +alley_shop_room_0 +night_shop_scene +night_shop_room_0 +impa_scene +impa_room_0 +labo_scene +labo_room_0 +tent_scene +tent_room_0 +nakaniwa_scene +nakaniwa_room_0 +ddan_boss_scene +ddan_boss_room_0 +ddan_boss_room_1 +ydan_boss_scene +ydan_boss_room_0 +ydan_boss_room_1 +HAKAdan_bs_scene +HAKAdan_bs_room_0 +HAKAdan_bs_room_1 +MIZUsin_bs_scene +MIZUsin_bs_room_0 +MIZUsin_bs_room_1 +ganon_scene +ganon_room_0 +ganon_room_1 +ganon_room_2 +ganon_room_3 +ganon_room_4 +ganon_room_5 +ganon_room_6 +ganon_room_7 +ganon_room_8 +ganon_room_9 +ganon_boss_scene +ganon_boss_room_0 +jyasinboss_scene +jyasinboss_room_0 +jyasinboss_room_1 +jyasinboss_room_2 +jyasinboss_room_3 +kokiri_home4_scene +kokiri_home4_room_0 +kokiri_home5_scene +kokiri_home5_room_0 +ganon_final_scene +ganon_final_room_0 +kakariko3_scene +kakariko3_room_0 +hakasitarelay_scene +hakasitarelay_room_0 +hakasitarelay_room_1 +hakasitarelay_room_2 +hakasitarelay_room_3 +hakasitarelay_room_4 +hakasitarelay_room_5 +hakasitarelay_room_6 +shrine_scene +shrine_room_0 +turibori_scene +turibori_room_0 +shrine_n_scene +shrine_n_room_0 +shrine_r_scene +shrine_r_room_0 +ganontika_scene +ganontika_room_0 +ganontika_room_1 +ganontika_room_2 +ganontika_room_3 +ganontika_room_4 +ganontika_room_5 +ganontika_room_6 +ganontika_room_7 +ganontika_room_8 +ganontika_room_9 +ganontika_room_10 +ganontika_room_11 +ganontika_room_12 +ganontika_room_13 +ganontika_room_14 +ganontika_room_15 +ganontika_room_16 +ganontika_room_17 +ganontika_room_18 +ganontika_room_19 +hakaana2_scene +hakaana2_room_0 +gerudoway_scene +gerudoway_room_0 +gerudoway_room_1 +gerudoway_room_2 +gerudoway_room_3 +gerudoway_room_4 +gerudoway_room_5 +HAKAdanCH_scene +HAKAdanCH_room_0 +HAKAdanCH_room_1 +HAKAdanCH_room_2 +HAKAdanCH_room_3 +HAKAdanCH_room_4 +HAKAdanCH_room_5 +HAKAdanCH_room_6 +hairal_niwa_n_scene +hairal_niwa_n_room_0 +bowling_scene +bowling_room_0 +hakaana_ouke_scene +hakaana_ouke_room_0 +hakaana_ouke_room_1 +hakaana_ouke_room_2 +hylia_labo_scene +hylia_labo_room_0 +souko_scene +souko_room_0 +souko_room_1 +souko_room_2 +miharigoya_scene +miharigoya_room_0 +mahouya_scene +mahouya_room_0 +takaraya_scene +takaraya_room_0 +takaraya_room_1 +takaraya_room_2 +takaraya_room_3 +takaraya_room_4 +takaraya_room_5 +takaraya_room_6 +ganon_sonogo_scene +ganon_sonogo_room_0 +ganon_sonogo_room_1 +ganon_sonogo_room_2 +ganon_sonogo_room_3 +ganon_sonogo_room_4 +ganon_demo_scene +ganon_demo_room_0 +face_shop_scene +face_shop_room_0 +kinsuta_scene +kinsuta_room_0 +ganontikasonogo_scene +ganontikasonogo_room_0 +ganontikasonogo_room_1 +bump_texture_static +anime_model_1_static +anime_model_2_static +anime_model_3_static +anime_model_4_static +anime_model_5_static +anime_model_6_static +anime_texture_1_static +anime_texture_2_static +anime_texture_3_static +anime_texture_4_static +anime_texture_5_static +anime_texture_6_static +softsprite_matrix_static diff --git a/soh/assets/extractor/filelists/ntsc_oot.txt b/soh/assets/extractor/filelists/ntsc_oot.txt new file mode 100644 index 000000000..21cebcbf2 --- /dev/null +++ b/soh/assets/extractor/filelists/ntsc_oot.txt @@ -0,0 +1,1510 @@ +makerom +boot +dmadata +Audiobank +Audioseq +Audiotable +kanji +link_animetion +icon_item_static +icon_item_24_static +icon_item_field_static +icon_item_dungeon_static +icon_item_gameover_static +icon_item_jpn_static +icon_item_nes_static +item_name_static +map_name_static +do_action_static +message_static +jpn_message_data_static +message_texture_static +nes_font_static +nes_message_data_static +staff_message_data_static +map_grand_static +map_i_static +map_48x85_static +code +n64dd +ovl_title +ovl_select +ovl_opening +ovl_file_choose +ovl_kaleido_scope +ovl_player_actor +ovl_map_mark_data +ovl_En_Test +ovl_En_GirlA +ovl_En_Part +ovl_En_Light +ovl_En_Door +ovl_En_Box +ovl_En_Poh +ovl_En_Okuta +ovl_En_Bom +ovl_En_Wallmas +ovl_En_Dodongo +ovl_En_Firefly +ovl_En_Horse +ovl_En_Arrow +ovl_En_Elf +ovl_En_Niw +ovl_En_Tite +ovl_En_Reeba +ovl_En_Peehat +ovl_En_Holl +ovl_En_Scene_Change +ovl_En_Zf +ovl_En_Hata +ovl_Boss_Dodongo +ovl_Boss_Goma +ovl_En_Zl1 +ovl_En_Viewer +ovl_En_Goma +ovl_Bg_Pushbox +ovl_En_Bubble +ovl_Door_Shutter +ovl_En_Dodojr +ovl_En_Bdfire +ovl_En_Boom +ovl_En_Torch2 +ovl_En_Bili +ovl_En_Tp +ovl_En_St +ovl_En_Bw +ovl_En_Eiyer +ovl_En_River_Sound +ovl_En_Horse_Normal +ovl_En_Ossan +ovl_Bg_Treemouth +ovl_Bg_Dodoago +ovl_Bg_Hidan_Dalm +ovl_Bg_Hidan_Hrock +ovl_En_Horse_Ganon +ovl_Bg_Hidan_Rock +ovl_Bg_Hidan_Rsekizou +ovl_Bg_Hidan_Sekizou +ovl_Bg_Hidan_Sima +ovl_Bg_Hidan_Syoku +ovl_En_Xc +ovl_Bg_Hidan_Curtain +ovl_Bg_Spot00_Hanebasi +ovl_En_Mb +ovl_En_Bombf +ovl_Bg_Hidan_Firewall +ovl_Bg_Dy_Yoseizo +ovl_En_Zl2 +ovl_Bg_Hidan_Fslift +ovl_En_OE2 +ovl_Bg_Ydan_Hasi +ovl_Bg_Ydan_Maruta +ovl_Boss_Ganondrof +ovl_En_Am +ovl_En_Dekubaba +ovl_En_M_Fire1 +ovl_En_M_Thunder +ovl_Bg_Ddan_Jd +ovl_Bg_Breakwall +ovl_En_Jj +ovl_En_Horse_Zelda +ovl_Bg_Ddan_Kd +ovl_Door_Warp1 +ovl_Obj_Syokudai +ovl_Item_B_Heart +ovl_En_Dekunuts +ovl_Bg_Menkuri_Kaiten +ovl_Bg_Menkuri_Eye +ovl_En_Vali +ovl_Bg_Mizu_Movebg +ovl_Bg_Mizu_Water +ovl_Arms_Hook +ovl_En_fHG +ovl_Bg_Mori_Hineri +ovl_En_Bb +ovl_Bg_Toki_Hikari +ovl_En_Yukabyun +ovl_Bg_Toki_Swd +ovl_En_Fhg_Fire +ovl_Bg_Mjin +ovl_Bg_Hidan_Kousi +ovl_Door_Toki +ovl_Bg_Hidan_Hamstep +ovl_En_Bird +ovl_En_Wood02 +ovl_En_Lightbox +ovl_En_Pu_box +ovl_En_Trap +ovl_En_Arow_Trap +ovl_En_Vase +ovl_En_Ta +ovl_En_Tk +ovl_Bg_Mori_Bigst +ovl_Bg_Mori_Elevator +ovl_Bg_Mori_Kaitenkabe +ovl_Bg_Mori_Rakkatenjo +ovl_En_Vm +ovl_Demo_Effect +ovl_Demo_Kankyo +ovl_Bg_Hidan_Fwbig +ovl_En_Floormas +ovl_En_Heishi1 +ovl_En_Rd +ovl_En_Po_Sisters +ovl_Bg_Heavy_Block +ovl_Bg_Po_Event +ovl_Obj_Mure +ovl_En_Sw +ovl_Boss_Fd +ovl_Object_Kankyo +ovl_En_Du +ovl_En_Fd +ovl_En_Horse_Link_Child +ovl_Door_Ana +ovl_Bg_Spot02_Objects +ovl_Bg_Haka +ovl_Magic_Wind +ovl_Magic_Fire +ovl_En_Ru1 +ovl_Boss_Fd2 +ovl_En_Fd_Fire +ovl_En_Dh +ovl_En_Dha +ovl_En_Rl +ovl_En_Encount1 +ovl_Demo_Du +ovl_Demo_Im +ovl_Demo_Tre_Lgt +ovl_En_Fw +ovl_Bg_Vb_Sima +ovl_En_Vb_Ball +ovl_Bg_Haka_Megane +ovl_Bg_Haka_MeganeBG +ovl_Bg_Haka_Ship +ovl_Bg_Haka_Sgami +ovl_En_Heishi2 +ovl_En_Encount2 +ovl_En_Fire_Rock +ovl_En_Brob +ovl_Mir_Ray +ovl_Bg_Spot09_Obj +ovl_Bg_Spot18_Obj +ovl_Boss_Va +ovl_Bg_Haka_Tubo +ovl_Bg_Haka_Trap +ovl_Bg_Haka_Huta +ovl_Bg_Haka_Zou +ovl_Bg_Spot17_Funen +ovl_En_Syateki_Itm +ovl_En_Syateki_Man +ovl_En_Tana +ovl_En_Nb +ovl_Boss_Mo +ovl_En_Sb +ovl_En_Bigokuta +ovl_En_Karebaba +ovl_Bg_Bdan_Objects +ovl_Demo_Sa +ovl_Demo_Go +ovl_En_In +ovl_En_Tr +ovl_Bg_Spot16_Bombstone +ovl_Bg_Hidan_Kowarerukabe +ovl_Bg_Bombwall +ovl_En_Ru2 +ovl_Obj_Dekujr +ovl_Bg_Mizu_Uzu +ovl_Bg_Spot06_Objects +ovl_Bg_Ice_Objects +ovl_Bg_Haka_Water +ovl_En_Ma2 +ovl_En_Bom_Chu +ovl_En_Horse_Game_Check +ovl_Boss_Tw +ovl_En_Rr +ovl_En_Ba +ovl_En_Bx +ovl_En_Anubice +ovl_En_Anubice_Fire +ovl_Bg_Mori_Hashigo +ovl_Bg_Mori_Hashira4 +ovl_Bg_Mori_Idomizu +ovl_Bg_Spot16_Doughnut +ovl_Bg_Bdan_Switch +ovl_En_Ma1 +ovl_Boss_Ganon +ovl_Boss_Sst +ovl_En_Ny +ovl_En_Fr +ovl_Item_Shield +ovl_Bg_Ice_Shelter +ovl_En_Ice_Hono +ovl_Item_Ocarina +ovl_Magic_Dark +ovl_Demo_6K +ovl_En_Anubice_Tag +ovl_Bg_Haka_Gate +ovl_Bg_Spot15_Saku +ovl_Bg_Jya_Goroiwa +ovl_Bg_Jya_Zurerukabe +ovl_Bg_Jya_Cobra +ovl_Bg_Jya_Kanaami +ovl_Fishing +ovl_Obj_Oshihiki +ovl_Bg_Gate_Shutter +ovl_Eff_Dust +ovl_Bg_Spot01_Fusya +ovl_Bg_Spot01_Idohashira +ovl_Bg_Spot01_Idomizu +ovl_Bg_Po_Syokudai +ovl_Bg_Ganon_Otyuka +ovl_Bg_Spot15_Rrbox +ovl_Bg_Umajump +ovl_En_Insect +ovl_En_Butte +ovl_En_Fish +ovl_Bg_Spot08_Iceblock +ovl_Item_Etcetera +ovl_Arrow_Fire +ovl_Arrow_Ice +ovl_Arrow_Light +ovl_Obj_Kibako +ovl_Obj_Tsubo +ovl_En_Wonder_Item +ovl_En_Ik +ovl_Demo_Ik +ovl_En_Skj +ovl_En_Skjneedle +ovl_En_G_Switch +ovl_Demo_Ext +ovl_Demo_Shd +ovl_En_Dns +ovl_Elf_Msg +ovl_En_Honotrap +ovl_En_Tubo_Trap +ovl_Obj_Ice_Poly +ovl_Bg_Spot03_Taki +ovl_Bg_Spot07_Taki +ovl_En_Fz +ovl_En_Po_Relay +ovl_Bg_Relay_Objects +ovl_En_Diving_Game +ovl_En_Kusa +ovl_Obj_Bean +ovl_Obj_Bombiwa +ovl_Obj_Switch +ovl_Obj_Elevator +ovl_Obj_Lift +ovl_Obj_Hsblock +ovl_En_Okarina_Tag +ovl_En_Yabusame_Mark +ovl_En_Goroiwa +ovl_En_Ex_Ruppy +ovl_En_Toryo +ovl_En_Daiku +ovl_En_Nwc +ovl_En_Blkobj +ovl_Item_Inbox +ovl_En_Ge1 +ovl_Obj_Blockstop +ovl_En_Sda +ovl_En_Clear_Tag +ovl_En_Niw_Lady +ovl_En_Gm +ovl_En_Ms +ovl_En_Hs +ovl_Bg_Ingate +ovl_En_Kanban +ovl_En_Heishi3 +ovl_En_Syateki_Niw +ovl_En_Attack_Niw +ovl_Bg_Spot01_Idosoko +ovl_En_Sa +ovl_En_Wonder_Talk +ovl_Bg_Gjyo_Bridge +ovl_En_Ds +ovl_En_Mk +ovl_En_Bom_Bowl_Man +ovl_En_Bom_Bowl_Pit +ovl_En_Owl +ovl_En_Ishi +ovl_Obj_Hana +ovl_Obj_Lightswitch +ovl_Obj_Mure2 +ovl_En_Go +ovl_En_Fu +ovl_En_Changer +ovl_Bg_Jya_Megami +ovl_Bg_Jya_Lift +ovl_Bg_Jya_Bigmirror +ovl_Bg_Jya_Bombchuiwa +ovl_Bg_Jya_Amishutter +ovl_Bg_Jya_Bombiwa +ovl_Bg_Spot18_Basket +ovl_En_Ganon_Organ +ovl_En_Siofuki +ovl_En_Stream +ovl_En_Mm +ovl_En_Ko +ovl_En_Kz +ovl_En_Weather_Tag +ovl_Bg_Sst_Floor +ovl_En_Ani +ovl_En_Ex_Item +ovl_Bg_Jya_Ironobj +ovl_En_Js +ovl_En_Jsjutan +ovl_En_Cs +ovl_En_Md +ovl_En_Hy +ovl_En_Ganon_Mant +ovl_En_Okarina_Effect +ovl_En_Mag +ovl_Door_Gerudo +ovl_Elf_Msg2 +ovl_Demo_Gt +ovl_En_Po_Field +ovl_Efc_Erupc +ovl_Bg_Zg +ovl_En_Heishi4 +ovl_En_Zl3 +ovl_Boss_Ganon2 +ovl_En_Kakasi +ovl_En_Takara_Man +ovl_Obj_Makeoshihiki +ovl_Oceff_Spot +ovl_End_Title +ovl_En_Torch +ovl_Demo_Ec +ovl_Shot_Sun +ovl_En_Dy_Extra +ovl_En_Wonder_Talk2 +ovl_En_Ge2 +ovl_Obj_Roomtimer +ovl_En_Ssh +ovl_En_Sth +ovl_Oceff_Wipe +ovl_Effect_Ss_Dust +ovl_Effect_Ss_KiraKira +ovl_Effect_Ss_Bomb +ovl_Effect_Ss_Bomb2 +ovl_Effect_Ss_Blast +ovl_Effect_Ss_G_Spk +ovl_Effect_Ss_D_Fire +ovl_Effect_Ss_Bubble +ovl_Effect_Ss_G_Ripple +ovl_Effect_Ss_G_Splash +ovl_Effect_Ss_G_Magma +ovl_Effect_Ss_G_Fire +ovl_Effect_Ss_Lightning +ovl_Effect_Ss_Dt_Bubble +ovl_Effect_Ss_Hahen +ovl_Effect_Ss_Stick +ovl_Effect_Ss_Sibuki +ovl_Effect_Ss_Sibuki2 +ovl_Effect_Ss_G_Magma2 +ovl_Effect_Ss_Stone1 +ovl_Effect_Ss_HitMark +ovl_Effect_Ss_Fhg_Flash +ovl_Effect_Ss_K_Fire +ovl_Effect_Ss_Solder_Srch_Ball +ovl_Effect_Ss_Kakera +ovl_Effect_Ss_Ice_Piece +ovl_Effect_Ss_En_Ice +ovl_Effect_Ss_Fire_Tail +ovl_Effect_Ss_En_Fire +ovl_Effect_Ss_Extra +ovl_Effect_Ss_Fcircle +ovl_Effect_Ss_Dead_Db +ovl_Effect_Ss_Dead_Dd +ovl_Effect_Ss_Dead_Ds +ovl_Effect_Ss_Dead_Sound +ovl_Oceff_Storm +ovl_En_Weiyer +ovl_Bg_Spot05_Soko +ovl_Bg_Jya_1flift +ovl_Bg_Jya_Haheniron +ovl_Bg_Spot12_Gate +ovl_Bg_Spot12_Saku +ovl_En_Hintnuts +ovl_En_Nutsball +ovl_Bg_Spot00_Break +ovl_En_Shopnuts +ovl_En_It +ovl_En_GeldB +ovl_Oceff_Wipe2 +ovl_Oceff_Wipe3 +ovl_En_Niw_Girl +ovl_En_Dog +ovl_En_Si +ovl_Bg_Spot01_Objects2 +ovl_Obj_Comb +ovl_Bg_Spot11_Bakudankabe +ovl_Obj_Kibako2 +ovl_En_Dnt_Demo +ovl_En_Dnt_Jiji +ovl_En_Dnt_Nomal +ovl_En_Guest +ovl_Bg_Bom_Guard +ovl_En_Hs2 +ovl_Demo_Kekkai +ovl_Bg_Spot08_Bakudankabe +ovl_Bg_Spot17_Bakudankabe +ovl_Obj_Mure3 +ovl_En_Tg +ovl_En_Mu +ovl_En_Go2 +ovl_En_Wf +ovl_En_Skb +ovl_Demo_Gj +ovl_Demo_Geff +ovl_Bg_Gnd_Firemeiro +ovl_Bg_Gnd_Darkmeiro +ovl_Bg_Gnd_Soulmeiro +ovl_Bg_Gnd_Nisekabe +ovl_Bg_Gnd_Iceblock +ovl_Bg_Ydan_Sp +ovl_En_Gb +ovl_En_Gs +ovl_Bg_Mizu_Bwall +ovl_Bg_Mizu_Shutter +ovl_En_Daiku_Kakariko +ovl_Bg_Bowl_Wall +ovl_En_Wall_Tubo +ovl_En_Po_Desert +ovl_En_Crow +ovl_Door_Killer +ovl_Bg_Spot11_Oasis +ovl_Bg_Spot18_Futa +ovl_Bg_Spot18_Shutter +ovl_En_Ma3 +ovl_En_Cow +ovl_Bg_Ice_Turara +ovl_Bg_Ice_Shutter +ovl_En_Kakasi2 +ovl_En_Kakasi3 +ovl_Oceff_Wipe4 +ovl_En_Eg +ovl_Bg_Menkuri_Nisekabe +ovl_En_Zo +ovl_Effect_Ss_Ice_Smoke +ovl_Obj_Makekinsuta +ovl_En_Ge3 +ovl_Obj_Timeblock +ovl_Obj_Hamishi +ovl_En_Zl4 +ovl_En_Mm2 +ovl_Bg_Jya_Block +ovl_Obj_Warp2block +gameplay_keep +gameplay_field_keep +gameplay_dangeon_keep +gameplay_object_exchange_static +object_link_boy +object_link_child +object_box +object_human +object_okuta +object_poh +object_wallmaster +object_dy_obj +object_firefly +object_dodongo +object_fire +object_niw +object_tite +object_reeba +object_peehat +object_kingdodongo +object_horse +object_zf +object_goma +object_zl1 +object_gol +object_bubble +object_dodojr +object_torch2 +object_bl +object_tp +object_oA1 +object_st +object_bw +object_ei +object_horse_normal +object_oB1 +object_o_anime +object_spot04_objects +object_ddan_objects +object_hidan_objects +object_horse_ganon +object_oA2 +object_spot00_objects +object_mb +object_bombf +object_sk2 +object_oE1 +object_oE_anime +object_oE2 +object_ydan_objects +object_gnd +object_am +object_dekubaba +object_oA3 +object_oA4 +object_oA5 +object_oA6 +object_oA7 +object_jj +object_oA8 +object_oA9 +object_oB2 +object_oB3 +object_oB4 +object_horse_zelda +object_opening_demo1 +object_warp1 +object_b_heart +object_dekunuts +object_oE3 +object_oE4 +object_menkuri_objects +object_oE5 +object_oE6 +object_oE7 +object_oE8 +object_oE9 +object_oE10 +object_oE11 +object_oE12 +object_vali +object_oA10 +object_oA11 +object_mizu_objects +object_fhg +object_ossan +object_mori_hineri1 +object_Bb +object_toki_objects +object_yukabyun +object_zl2 +object_mjin +object_mjin_flash +object_mjin_dark +object_mjin_flame +object_mjin_ice +object_mjin_soul +object_mjin_wind +object_mjin_oka +object_haka_objects +object_spot06_objects +object_ice_objects +object_relay_objects +object_mori_hineri1a +object_mori_hineri2 +object_mori_hineri2a +object_mori_objects +object_mori_tex +object_spot08_obj +object_warp2 +object_hata +object_bird +object_wood02 +object_lightbox +object_pu_box +object_trap +object_vase +object_im +object_ta +object_tk +object_xc +object_vm +object_bv +object_hakach_objects +object_efc_crystal_light +object_efc_fire_ball +object_efc_flash +object_efc_lgt_shower +object_efc_star_field +object_god_lgt +object_light_ring +object_triforce_spot +object_medal +object_bdan_objects +object_sd +object_rd +object_po_sisters +object_heavy_object +object_gndd +object_fd +object_du +object_fw +object_horse_link_child +object_spot02_objects +object_haka +object_ru1 +object_syokudai +object_fd2 +object_dh +object_rl +object_efc_tw +object_demo_tre_lgt +object_gi_key +object_mir_ray +object_brob +object_gi_jewel +object_spot09_obj +object_spot18_obj +object_bdoor +object_spot17_obj +object_shop_dungen +object_nb +object_mo +object_sb +object_gi_melody +object_gi_heart +object_gi_compass +object_gi_bosskey +object_gi_medal +object_gi_nuts +object_sa +object_gi_hearts +object_gi_arrowcase +object_gi_bombpouch +object_in +object_tr +object_spot16_obj +object_oE1s +object_oE4s +object_os_anime +object_gi_bottle +object_gi_stick +object_gi_map +object_oF1d_map +object_ru2 +object_gi_shield_1 +object_dekujr +object_gi_magicpot +object_gi_bomb_1 +object_oF1s +object_ma2 +object_gi_purse +object_hni +object_tw +object_rr +object_bxa +object_anubice +object_gi_gerudo +object_gi_arrow +object_gi_bomb_2 +object_gi_egg +object_gi_scale +object_gi_shield_2 +object_gi_hookshot +object_gi_ocarina +object_gi_milk +object_ma1 +object_ganon +object_sst +object_ny +object_fr +object_gi_pachinko +object_gi_boomerang +object_gi_bow +object_gi_glasses +object_gi_liquid +object_ani +object_demo_6k +object_gi_shield_3 +object_gi_letter +object_spot15_obj +object_jya_obj +object_gi_clothes +object_gi_bean +object_gi_fish +object_gi_saw +object_gi_hammer +object_gi_grass +object_gi_longsword +object_spot01_objects +object_md +object_km1 +object_kw1 +object_zo +object_kz +object_umajump +object_masterkokiri +object_masterkokirihead +object_mastergolon +object_masterzoora +object_aob +object_ik +object_ahg +object_cne +object_gi_niwatori +object_skj +object_gi_bottle_letter +object_bji +object_bba +object_gi_ocarina_0 +object_ds +object_ane +object_boj +object_spot03_object +object_spot07_object +object_fz +object_bob +object_ge1 +object_yabusame_point +object_gi_boots_2 +object_gi_seed +object_gnd_magic +object_d_elevator +object_d_hsblock +object_d_lift +object_mamenoki +object_goroiwa +object_toryo +object_daiku +object_nwc +object_blkobj +object_gm +object_ms +object_hs +object_ingate +object_lightswitch +object_kusa +object_tsubo +object_gi_gloves +object_gi_coin +object_kanban +object_gjyo_objects +object_owl +object_mk +object_fu +object_gi_ki_tan_mask +object_gi_redead_mask +object_gi_skj_mask +object_gi_rabit_mask +object_gi_truth_mask +object_ganon_objects +object_siofuki +object_stream +object_mm +object_fa +object_os +object_gi_eye_lotion +object_gi_powder +object_gi_mushroom +object_gi_ticketstone +object_gi_brokensword +object_js +object_cs +object_gi_prescription +object_gi_bracelet +object_gi_soldout +object_gi_frog +object_mag +object_door_gerudo +object_gt +object_efc_erupc +object_zl2_anime1 +object_zl2_anime2 +object_gi_golonmask +object_gi_zoramask +object_gi_gerudomask +object_ganon2 +object_ka +object_ts +object_zg +object_gi_hoverboots +object_gi_m_arrow +object_ds2 +object_ec +object_fish +object_gi_sutaru +object_gi_goddess +object_ssh +object_bigokuta +object_bg +object_spot05_objects +object_spot12_obj +object_bombiwa +object_hintnuts +object_rs +object_spot00_break +object_gla +object_shopnuts +object_geldb +object_gr +object_dog +object_jya_iron +object_jya_door +object_spot01_objects2 +object_spot11_obj +object_kibako2 +object_dns +object_dnk +object_gi_fire +object_gi_insect +object_gi_butterfly +object_gi_ghost +object_gi_soul +object_bowl +object_po_field +object_demo_kekkai +object_efc_doughnut +object_gi_dekupouch +object_ganon_anime1 +object_ganon_anime2 +object_ganon_anime3 +object_gi_rupy +object_spot01_matoya +object_spot01_matoyab +object_po_composer +object_mu +object_wf +object_skb +object_gj +object_geff +object_haka_door +object_gs +object_ps +object_bwall +object_crow +object_cow +object_cob +object_gi_sword_1 +object_door_killer +object_ouke_haka +object_timeblock +object_zl4 +g_pn_01 +g_pn_02 +g_pn_03 +g_pn_04 +g_pn_05 +g_pn_06 +g_pn_07 +g_pn_08 +g_pn_09 +g_pn_10 +g_pn_11 +g_pn_12 +g_pn_13 +g_pn_14 +g_pn_15 +g_pn_16 +g_pn_17 +g_pn_18 +g_pn_19 +g_pn_20 +g_pn_21 +g_pn_22 +g_pn_23 +g_pn_24 +g_pn_25 +g_pn_26 +g_pn_27 +g_pn_28 +g_pn_29 +g_pn_30 +g_pn_31 +g_pn_32 +g_pn_33 +g_pn_34 +g_pn_35 +g_pn_36 +g_pn_37 +g_pn_38 +g_pn_39 +g_pn_40 +g_pn_41 +g_pn_42 +g_pn_43 +g_pn_44 +g_pn_45 +g_pn_46 +g_pn_47 +g_pn_48 +g_pn_49 +g_pn_50 +g_pn_51 +g_pn_52 +g_pn_53 +g_pn_54 +g_pn_55 +g_pn_56 +g_pn_57 +z_select_static +nintendo_rogo_static +title_static +parameter_static +vr_fine0_static +vr_fine0_pal_static +vr_fine1_static +vr_fine1_pal_static +vr_fine2_static +vr_fine2_pal_static +vr_fine3_static +vr_fine3_pal_static +vr_cloud0_static +vr_cloud0_pal_static +vr_cloud1_static +vr_cloud1_pal_static +vr_cloud2_static +vr_cloud2_pal_static +vr_cloud3_static +vr_cloud3_pal_static +vr_holy0_static +vr_holy0_pal_static +vr_holy1_static +vr_holy1_pal_static +vr_MDVR_static +vr_MDVR_pal_static +vr_MNVR_static +vr_MNVR_pal_static +vr_RUVR_static +vr_RUVR_pal_static +vr_LHVR_static +vr_LHVR_pal_static +vr_KHVR_static +vr_KHVR_pal_static +vr_K3VR_static +vr_K3VR_pal_static +vr_K4VR_static +vr_K4VR_pal_static +vr_K5VR_static +vr_K5VR_pal_static +vr_SP1a_static +vr_SP1a_pal_static +vr_MLVR_static +vr_MLVR_pal_static +vr_KKRVR_static +vr_KKRVR_pal_static +vr_KR3VR_static +vr_KR3VR_pal_static +vr_IPVR_static +vr_IPVR_pal_static +vr_KSVR_static +vr_KSVR_pal_static +vr_GLVR_static +vr_GLVR_pal_static +vr_ZRVR_static +vr_ZRVR_pal_static +vr_DGVR_static +vr_DGVR_pal_static +vr_ALVR_static +vr_ALVR_pal_static +vr_NSVR_static +vr_NSVR_pal_static +vr_LBVR_static +vr_LBVR_pal_static +vr_TTVR_static +vr_TTVR_pal_static +vr_FCVR_static +vr_FCVR_pal_static +elf_message_field +elf_message_ydan +ddan_scene +ddan_room_0 +ddan_room_1 +ddan_room_2 +ddan_room_3 +ddan_room_4 +ddan_room_5 +ddan_room_6 +ddan_room_7 +ddan_room_8 +ddan_room_9 +ddan_room_10 +ddan_room_11 +ddan_room_12 +ddan_room_13 +ddan_room_14 +ddan_room_15 +ddan_room_16 +spot00_scene +spot00_room_0 +spot01_scene +spot01_room_0 +spot02_scene +spot02_room_0 +spot02_room_1 +spot03_scene +spot03_room_0 +spot03_room_1 +spot04_scene +spot04_room_0 +spot04_room_1 +spot04_room_2 +spot05_scene +spot05_room_0 +spot06_scene +spot06_room_0 +spot07_scene +spot07_room_0 +spot07_room_1 +spot08_scene +spot08_room_0 +spot09_scene +spot09_room_0 +spot10_scene +spot10_room_0 +spot10_room_1 +spot10_room_2 +spot10_room_3 +spot10_room_4 +spot10_room_5 +spot10_room_6 +spot10_room_7 +spot10_room_8 +spot10_room_9 +spot11_scene +spot11_room_0 +spot12_scene +spot12_room_0 +spot12_room_1 +spot13_scene +spot13_room_0 +spot13_room_1 +spot15_scene +spot15_room_0 +spot16_scene +spot16_room_0 +spot17_scene +spot17_room_0 +spot17_room_1 +spot18_scene +spot18_room_0 +spot18_room_1 +spot18_room_2 +spot18_room_3 +market_day_scene +market_day_room_0 +market_night_scene +market_night_room_0 +HIDAN_scene +HIDAN_room_0 +HIDAN_room_1 +HIDAN_room_2 +HIDAN_room_3 +HIDAN_room_4 +HIDAN_room_5 +HIDAN_room_6 +HIDAN_room_7 +HIDAN_room_8 +HIDAN_room_9 +HIDAN_room_10 +HIDAN_room_11 +HIDAN_room_12 +HIDAN_room_13 +HIDAN_room_14 +HIDAN_room_15 +HIDAN_room_16 +HIDAN_room_17 +HIDAN_room_18 +HIDAN_room_19 +HIDAN_room_20 +HIDAN_room_21 +HIDAN_room_22 +HIDAN_room_23 +HIDAN_room_24 +HIDAN_room_25 +HIDAN_room_26 +Bmori1_scene +Bmori1_room_0 +Bmori1_room_1 +Bmori1_room_2 +Bmori1_room_3 +Bmori1_room_4 +Bmori1_room_5 +Bmori1_room_6 +Bmori1_room_7 +Bmori1_room_8 +Bmori1_room_9 +Bmori1_room_10 +Bmori1_room_11 +Bmori1_room_12 +Bmori1_room_13 +Bmori1_room_14 +Bmori1_room_15 +Bmori1_room_16 +Bmori1_room_17 +Bmori1_room_18 +Bmori1_room_19 +Bmori1_room_20 +Bmori1_room_21 +Bmori1_room_22 +ydan_scene +ydan_room_0 +ydan_room_1 +ydan_room_2 +ydan_room_3 +ydan_room_4 +ydan_room_5 +ydan_room_6 +ydan_room_7 +ydan_room_8 +ydan_room_9 +ydan_room_10 +ydan_room_11 +kenjyanoma_scene +kenjyanoma_room_0 +tokinoma_scene +tokinoma_room_0 +tokinoma_room_1 +link_home_scene +link_home_room_0 +kokiri_shop_scene +kokiri_shop_room_0 +MIZUsin_scene +MIZUsin_room_0 +MIZUsin_room_1 +MIZUsin_room_2 +MIZUsin_room_3 +MIZUsin_room_4 +MIZUsin_room_5 +MIZUsin_room_6 +MIZUsin_room_7 +MIZUsin_room_8 +MIZUsin_room_9 +MIZUsin_room_10 +MIZUsin_room_11 +MIZUsin_room_12 +MIZUsin_room_13 +MIZUsin_room_14 +MIZUsin_room_15 +MIZUsin_room_16 +MIZUsin_room_17 +MIZUsin_room_18 +MIZUsin_room_19 +MIZUsin_room_20 +MIZUsin_room_21 +MIZUsin_room_22 +kokiri_home_scene +kokiri_home_room_0 +kakusiana_scene +kakusiana_room_0 +kakusiana_room_1 +kakusiana_room_2 +kakusiana_room_3 +kakusiana_room_4 +kakusiana_room_5 +kakusiana_room_6 +kakusiana_room_7 +kakusiana_room_8 +kakusiana_room_9 +kakusiana_room_10 +kakusiana_room_11 +kakusiana_room_12 +kakusiana_room_13 +entra_scene +entra_room_0 +bdan_scene +bdan_room_0 +bdan_room_1 +bdan_room_2 +bdan_room_3 +bdan_room_4 +bdan_room_5 +bdan_room_6 +bdan_room_7 +bdan_room_8 +bdan_room_9 +bdan_room_10 +bdan_room_11 +bdan_room_12 +bdan_room_13 +bdan_room_14 +bdan_room_15 +HAKAdan_scene +HAKAdan_room_0 +HAKAdan_room_1 +HAKAdan_room_2 +HAKAdan_room_3 +HAKAdan_room_4 +HAKAdan_room_5 +HAKAdan_room_6 +HAKAdan_room_7 +HAKAdan_room_8 +HAKAdan_room_9 +HAKAdan_room_10 +HAKAdan_room_11 +HAKAdan_room_12 +HAKAdan_room_13 +HAKAdan_room_14 +HAKAdan_room_15 +HAKAdan_room_16 +HAKAdan_room_17 +HAKAdan_room_18 +HAKAdan_room_19 +HAKAdan_room_20 +HAKAdan_room_21 +HAKAdan_room_22 +moribossroom_scene +moribossroom_room_0 +moribossroom_room_1 +syatekijyou_scene +syatekijyou_room_0 +men_scene +men_room_0 +men_room_1 +men_room_2 +men_room_3 +men_room_4 +men_room_5 +men_room_6 +men_room_7 +men_room_8 +men_room_9 +men_room_10 +shop1_scene +shop1_room_0 +hairal_niwa_scene +hairal_niwa_room_0 +ganon_tou_scene +ganon_tou_room_0 +market_alley_scene +market_alley_room_0 +spot20_scene +spot20_room_0 +market_ruins_scene +market_ruins_room_0 +entra_n_scene +entra_n_room_0 +enrui_scene +enrui_room_0 +market_alley_n_scene +market_alley_n_room_0 +hiral_demo_scene +hiral_demo_room_0 +kokiri_home3_scene +kokiri_home3_room_0 +jyasinzou_scene +jyasinzou_room_0 +jyasinzou_room_1 +jyasinzou_room_2 +jyasinzou_room_3 +jyasinzou_room_4 +jyasinzou_room_5 +jyasinzou_room_6 +jyasinzou_room_7 +jyasinzou_room_8 +jyasinzou_room_9 +jyasinzou_room_10 +jyasinzou_room_11 +jyasinzou_room_12 +jyasinzou_room_13 +jyasinzou_room_14 +jyasinzou_room_15 +jyasinzou_room_16 +jyasinzou_room_17 +jyasinzou_room_18 +jyasinzou_room_19 +jyasinzou_room_20 +jyasinzou_room_21 +jyasinzou_room_22 +jyasinzou_room_23 +jyasinzou_room_24 +jyasinzou_room_25 +jyasinzou_room_26 +jyasinzou_room_27 +jyasinzou_room_28 +ice_doukutu_scene +ice_doukutu_room_0 +ice_doukutu_room_1 +ice_doukutu_room_2 +ice_doukutu_room_3 +ice_doukutu_room_4 +ice_doukutu_room_5 +ice_doukutu_room_6 +ice_doukutu_room_7 +ice_doukutu_room_8 +ice_doukutu_room_9 +ice_doukutu_room_10 +ice_doukutu_room_11 +malon_stable_scene +malon_stable_room_0 +kakariko_scene +kakariko_room_0 +bdan_boss_scene +bdan_boss_room_0 +bdan_boss_room_1 +FIRE_bs_scene +FIRE_bs_room_0 +FIRE_bs_room_1 +hut_scene +hut_room_0 +daiyousei_izumi_scene +daiyousei_izumi_room_0 +hakaana_scene +hakaana_room_0 +yousei_izumi_tate_scene +yousei_izumi_tate_room_0 +yousei_izumi_yoko_scene +yousei_izumi_yoko_room_0 +golon_scene +golon_room_0 +zoora_scene +zoora_room_0 +drag_scene +drag_room_0 +alley_shop_scene +alley_shop_room_0 +night_shop_scene +night_shop_room_0 +impa_scene +impa_room_0 +labo_scene +labo_room_0 +tent_scene +tent_room_0 +nakaniwa_scene +nakaniwa_room_0 +ddan_boss_scene +ddan_boss_room_0 +ddan_boss_room_1 +ydan_boss_scene +ydan_boss_room_0 +ydan_boss_room_1 +HAKAdan_bs_scene +HAKAdan_bs_room_0 +HAKAdan_bs_room_1 +MIZUsin_bs_scene +MIZUsin_bs_room_0 +MIZUsin_bs_room_1 +ganon_scene +ganon_room_0 +ganon_room_1 +ganon_room_2 +ganon_room_3 +ganon_room_4 +ganon_room_5 +ganon_room_6 +ganon_room_7 +ganon_room_8 +ganon_room_9 +ganon_boss_scene +ganon_boss_room_0 +jyasinboss_scene +jyasinboss_room_0 +jyasinboss_room_1 +jyasinboss_room_2 +jyasinboss_room_3 +kokiri_home4_scene +kokiri_home4_room_0 +kokiri_home5_scene +kokiri_home5_room_0 +ganon_final_scene +ganon_final_room_0 +kakariko3_scene +kakariko3_room_0 +hakasitarelay_scene +hakasitarelay_room_0 +hakasitarelay_room_1 +hakasitarelay_room_2 +hakasitarelay_room_3 +hakasitarelay_room_4 +hakasitarelay_room_5 +hakasitarelay_room_6 +shrine_scene +shrine_room_0 +turibori_scene +turibori_room_0 +shrine_n_scene +shrine_n_room_0 +shrine_r_scene +shrine_r_room_0 +ganontika_scene +ganontika_room_0 +ganontika_room_1 +ganontika_room_2 +ganontika_room_3 +ganontika_room_4 +ganontika_room_5 +ganontika_room_6 +ganontika_room_7 +ganontika_room_8 +ganontika_room_9 +ganontika_room_10 +ganontika_room_11 +ganontika_room_12 +ganontika_room_13 +ganontika_room_14 +ganontika_room_15 +ganontika_room_16 +ganontika_room_17 +ganontika_room_18 +ganontika_room_19 +hakaana2_scene +hakaana2_room_0 +gerudoway_scene +gerudoway_room_0 +gerudoway_room_1 +gerudoway_room_2 +gerudoway_room_3 +gerudoway_room_4 +gerudoway_room_5 +HAKAdanCH_scene +HAKAdanCH_room_0 +HAKAdanCH_room_1 +HAKAdanCH_room_2 +HAKAdanCH_room_3 +HAKAdanCH_room_4 +HAKAdanCH_room_5 +HAKAdanCH_room_6 +hairal_niwa_n_scene +hairal_niwa_n_room_0 +bowling_scene +bowling_room_0 +hakaana_ouke_scene +hakaana_ouke_room_0 +hakaana_ouke_room_1 +hakaana_ouke_room_2 +hylia_labo_scene +hylia_labo_room_0 +souko_scene +souko_room_0 +souko_room_1 +souko_room_2 +miharigoya_scene +miharigoya_room_0 +mahouya_scene +mahouya_room_0 +takaraya_scene +takaraya_room_0 +takaraya_room_1 +takaraya_room_2 +takaraya_room_3 +takaraya_room_4 +takaraya_room_5 +takaraya_room_6 +ganon_sonogo_scene +ganon_sonogo_room_0 +ganon_sonogo_room_1 +ganon_sonogo_room_2 +ganon_sonogo_room_3 +ganon_sonogo_room_4 +ganon_demo_scene +ganon_demo_room_0 +face_shop_scene +face_shop_room_0 +kinsuta_scene +kinsuta_room_0 +ganontikasonogo_scene +ganontikasonogo_room_0 +ganontikasonogo_room_1 +bump_texture_static +anime_model_1_static +anime_model_2_static +anime_model_3_static +anime_model_4_static +anime_model_5_static +anime_model_6_static +anime_texture_1_static +anime_texture_2_static +anime_texture_3_static +anime_texture_4_static +anime_texture_5_static +anime_texture_6_static +softsprite_matrix_static diff --git a/soh/assets/extractor/filelists/pal_oot.txt b/soh/assets/extractor/filelists/pal_oot.txt new file mode 100644 index 000000000..812d3ebdd --- /dev/null +++ b/soh/assets/extractor/filelists/pal_oot.txt @@ -0,0 +1,1511 @@ +makerom +boot +dmadata +Audiobank +Audioseq +Audiotable +link_animetion +icon_item_static +icon_item_24_static +icon_item_field_static +icon_item_dungeon_static +icon_item_gameover_static +icon_item_nes_static +icon_item_ger_static +icon_item_fra_static +item_name_static +map_name_static +do_action_static +message_static +message_texture_static +nes_font_static +nes_message_data_static +ger_message_data_static +fra_message_data_static +staff_message_data_static +map_grand_static +map_i_static +map_48x85_static +code +n64dd +ovl_title +ovl_select +ovl_opening +ovl_file_choose +ovl_kaleido_scope +ovl_player_actor +ovl_map_mark_data +ovl_En_Test +ovl_En_GirlA +ovl_En_Part +ovl_En_Light +ovl_En_Door +ovl_En_Box +ovl_En_Poh +ovl_En_Okuta +ovl_En_Bom +ovl_En_Wallmas +ovl_En_Dodongo +ovl_En_Firefly +ovl_En_Horse +ovl_En_Arrow +ovl_En_Elf +ovl_En_Niw +ovl_En_Tite +ovl_En_Reeba +ovl_En_Peehat +ovl_En_Holl +ovl_En_Scene_Change +ovl_En_Zf +ovl_En_Hata +ovl_Boss_Dodongo +ovl_Boss_Goma +ovl_En_Zl1 +ovl_En_Viewer +ovl_En_Goma +ovl_Bg_Pushbox +ovl_En_Bubble +ovl_Door_Shutter +ovl_En_Dodojr +ovl_En_Bdfire +ovl_En_Boom +ovl_En_Torch2 +ovl_En_Bili +ovl_En_Tp +ovl_En_St +ovl_En_Bw +ovl_En_Eiyer +ovl_En_River_Sound +ovl_En_Horse_Normal +ovl_En_Ossan +ovl_Bg_Treemouth +ovl_Bg_Dodoago +ovl_Bg_Hidan_Dalm +ovl_Bg_Hidan_Hrock +ovl_En_Horse_Ganon +ovl_Bg_Hidan_Rock +ovl_Bg_Hidan_Rsekizou +ovl_Bg_Hidan_Sekizou +ovl_Bg_Hidan_Sima +ovl_Bg_Hidan_Syoku +ovl_En_Xc +ovl_Bg_Hidan_Curtain +ovl_Bg_Spot00_Hanebasi +ovl_En_Mb +ovl_En_Bombf +ovl_Bg_Hidan_Firewall +ovl_Bg_Dy_Yoseizo +ovl_En_Zl2 +ovl_Bg_Hidan_Fslift +ovl_En_OE2 +ovl_Bg_Ydan_Hasi +ovl_Bg_Ydan_Maruta +ovl_Boss_Ganondrof +ovl_En_Am +ovl_En_Dekubaba +ovl_En_M_Fire1 +ovl_En_M_Thunder +ovl_Bg_Ddan_Jd +ovl_Bg_Breakwall +ovl_En_Jj +ovl_En_Horse_Zelda +ovl_Bg_Ddan_Kd +ovl_Door_Warp1 +ovl_Obj_Syokudai +ovl_Item_B_Heart +ovl_En_Dekunuts +ovl_Bg_Menkuri_Kaiten +ovl_Bg_Menkuri_Eye +ovl_En_Vali +ovl_Bg_Mizu_Movebg +ovl_Bg_Mizu_Water +ovl_Arms_Hook +ovl_En_fHG +ovl_Bg_Mori_Hineri +ovl_En_Bb +ovl_Bg_Toki_Hikari +ovl_En_Yukabyun +ovl_Bg_Toki_Swd +ovl_En_Fhg_Fire +ovl_Bg_Mjin +ovl_Bg_Hidan_Kousi +ovl_Door_Toki +ovl_Bg_Hidan_Hamstep +ovl_En_Bird +ovl_En_Wood02 +ovl_En_Lightbox +ovl_En_Pu_box +ovl_En_Trap +ovl_En_Arow_Trap +ovl_En_Vase +ovl_En_Ta +ovl_En_Tk +ovl_Bg_Mori_Bigst +ovl_Bg_Mori_Elevator +ovl_Bg_Mori_Kaitenkabe +ovl_Bg_Mori_Rakkatenjo +ovl_En_Vm +ovl_Demo_Effect +ovl_Demo_Kankyo +ovl_Bg_Hidan_Fwbig +ovl_En_Floormas +ovl_En_Heishi1 +ovl_En_Rd +ovl_En_Po_Sisters +ovl_Bg_Heavy_Block +ovl_Bg_Po_Event +ovl_Obj_Mure +ovl_En_Sw +ovl_Boss_Fd +ovl_Object_Kankyo +ovl_En_Du +ovl_En_Fd +ovl_En_Horse_Link_Child +ovl_Door_Ana +ovl_Bg_Spot02_Objects +ovl_Bg_Haka +ovl_Magic_Wind +ovl_Magic_Fire +ovl_En_Ru1 +ovl_Boss_Fd2 +ovl_En_Fd_Fire +ovl_En_Dh +ovl_En_Dha +ovl_En_Rl +ovl_En_Encount1 +ovl_Demo_Du +ovl_Demo_Im +ovl_Demo_Tre_Lgt +ovl_En_Fw +ovl_Bg_Vb_Sima +ovl_En_Vb_Ball +ovl_Bg_Haka_Megane +ovl_Bg_Haka_MeganeBG +ovl_Bg_Haka_Ship +ovl_Bg_Haka_Sgami +ovl_En_Heishi2 +ovl_En_Encount2 +ovl_En_Fire_Rock +ovl_En_Brob +ovl_Mir_Ray +ovl_Bg_Spot09_Obj +ovl_Bg_Spot18_Obj +ovl_Boss_Va +ovl_Bg_Haka_Tubo +ovl_Bg_Haka_Trap +ovl_Bg_Haka_Huta +ovl_Bg_Haka_Zou +ovl_Bg_Spot17_Funen +ovl_En_Syateki_Itm +ovl_En_Syateki_Man +ovl_En_Tana +ovl_En_Nb +ovl_Boss_Mo +ovl_En_Sb +ovl_En_Bigokuta +ovl_En_Karebaba +ovl_Bg_Bdan_Objects +ovl_Demo_Sa +ovl_Demo_Go +ovl_En_In +ovl_En_Tr +ovl_Bg_Spot16_Bombstone +ovl_Bg_Hidan_Kowarerukabe +ovl_Bg_Bombwall +ovl_En_Ru2 +ovl_Obj_Dekujr +ovl_Bg_Mizu_Uzu +ovl_Bg_Spot06_Objects +ovl_Bg_Ice_Objects +ovl_Bg_Haka_Water +ovl_En_Ma2 +ovl_En_Bom_Chu +ovl_En_Horse_Game_Check +ovl_Boss_Tw +ovl_En_Rr +ovl_En_Ba +ovl_En_Bx +ovl_En_Anubice +ovl_En_Anubice_Fire +ovl_Bg_Mori_Hashigo +ovl_Bg_Mori_Hashira4 +ovl_Bg_Mori_Idomizu +ovl_Bg_Spot16_Doughnut +ovl_Bg_Bdan_Switch +ovl_En_Ma1 +ovl_Boss_Ganon +ovl_Boss_Sst +ovl_En_Ny +ovl_En_Fr +ovl_Item_Shield +ovl_Bg_Ice_Shelter +ovl_En_Ice_Hono +ovl_Item_Ocarina +ovl_Magic_Dark +ovl_Demo_6K +ovl_En_Anubice_Tag +ovl_Bg_Haka_Gate +ovl_Bg_Spot15_Saku +ovl_Bg_Jya_Goroiwa +ovl_Bg_Jya_Zurerukabe +ovl_Bg_Jya_Cobra +ovl_Bg_Jya_Kanaami +ovl_Fishing +ovl_Obj_Oshihiki +ovl_Bg_Gate_Shutter +ovl_Eff_Dust +ovl_Bg_Spot01_Fusya +ovl_Bg_Spot01_Idohashira +ovl_Bg_Spot01_Idomizu +ovl_Bg_Po_Syokudai +ovl_Bg_Ganon_Otyuka +ovl_Bg_Spot15_Rrbox +ovl_Bg_Umajump +ovl_En_Insect +ovl_En_Butte +ovl_En_Fish +ovl_Bg_Spot08_Iceblock +ovl_Item_Etcetera +ovl_Arrow_Fire +ovl_Arrow_Ice +ovl_Arrow_Light +ovl_Obj_Kibako +ovl_Obj_Tsubo +ovl_En_Wonder_Item +ovl_En_Ik +ovl_Demo_Ik +ovl_En_Skj +ovl_En_Skjneedle +ovl_En_G_Switch +ovl_Demo_Ext +ovl_Demo_Shd +ovl_En_Dns +ovl_Elf_Msg +ovl_En_Honotrap +ovl_En_Tubo_Trap +ovl_Obj_Ice_Poly +ovl_Bg_Spot03_Taki +ovl_Bg_Spot07_Taki +ovl_En_Fz +ovl_En_Po_Relay +ovl_Bg_Relay_Objects +ovl_En_Diving_Game +ovl_En_Kusa +ovl_Obj_Bean +ovl_Obj_Bombiwa +ovl_Obj_Switch +ovl_Obj_Elevator +ovl_Obj_Lift +ovl_Obj_Hsblock +ovl_En_Okarina_Tag +ovl_En_Yabusame_Mark +ovl_En_Goroiwa +ovl_En_Ex_Ruppy +ovl_En_Toryo +ovl_En_Daiku +ovl_En_Nwc +ovl_En_Blkobj +ovl_Item_Inbox +ovl_En_Ge1 +ovl_Obj_Blockstop +ovl_En_Sda +ovl_En_Clear_Tag +ovl_En_Niw_Lady +ovl_En_Gm +ovl_En_Ms +ovl_En_Hs +ovl_Bg_Ingate +ovl_En_Kanban +ovl_En_Heishi3 +ovl_En_Syateki_Niw +ovl_En_Attack_Niw +ovl_Bg_Spot01_Idosoko +ovl_En_Sa +ovl_En_Wonder_Talk +ovl_Bg_Gjyo_Bridge +ovl_En_Ds +ovl_En_Mk +ovl_En_Bom_Bowl_Man +ovl_En_Bom_Bowl_Pit +ovl_En_Owl +ovl_En_Ishi +ovl_Obj_Hana +ovl_Obj_Lightswitch +ovl_Obj_Mure2 +ovl_En_Go +ovl_En_Fu +ovl_En_Changer +ovl_Bg_Jya_Megami +ovl_Bg_Jya_Lift +ovl_Bg_Jya_Bigmirror +ovl_Bg_Jya_Bombchuiwa +ovl_Bg_Jya_Amishutter +ovl_Bg_Jya_Bombiwa +ovl_Bg_Spot18_Basket +ovl_En_Ganon_Organ +ovl_En_Siofuki +ovl_En_Stream +ovl_En_Mm +ovl_En_Ko +ovl_En_Kz +ovl_En_Weather_Tag +ovl_Bg_Sst_Floor +ovl_En_Ani +ovl_En_Ex_Item +ovl_Bg_Jya_Ironobj +ovl_En_Js +ovl_En_Jsjutan +ovl_En_Cs +ovl_En_Md +ovl_En_Hy +ovl_En_Ganon_Mant +ovl_En_Okarina_Effect +ovl_En_Mag +ovl_Door_Gerudo +ovl_Elf_Msg2 +ovl_Demo_Gt +ovl_En_Po_Field +ovl_Efc_Erupc +ovl_Bg_Zg +ovl_En_Heishi4 +ovl_En_Zl3 +ovl_Boss_Ganon2 +ovl_En_Kakasi +ovl_En_Takara_Man +ovl_Obj_Makeoshihiki +ovl_Oceff_Spot +ovl_End_Title +ovl_En_Torch +ovl_Demo_Ec +ovl_Shot_Sun +ovl_En_Dy_Extra +ovl_En_Wonder_Talk2 +ovl_En_Ge2 +ovl_Obj_Roomtimer +ovl_En_Ssh +ovl_En_Sth +ovl_Oceff_Wipe +ovl_Effect_Ss_Dust +ovl_Effect_Ss_KiraKira +ovl_Effect_Ss_Bomb +ovl_Effect_Ss_Bomb2 +ovl_Effect_Ss_Blast +ovl_Effect_Ss_G_Spk +ovl_Effect_Ss_D_Fire +ovl_Effect_Ss_Bubble +ovl_Effect_Ss_G_Ripple +ovl_Effect_Ss_G_Splash +ovl_Effect_Ss_G_Magma +ovl_Effect_Ss_G_Fire +ovl_Effect_Ss_Lightning +ovl_Effect_Ss_Dt_Bubble +ovl_Effect_Ss_Hahen +ovl_Effect_Ss_Stick +ovl_Effect_Ss_Sibuki +ovl_Effect_Ss_Sibuki2 +ovl_Effect_Ss_G_Magma2 +ovl_Effect_Ss_Stone1 +ovl_Effect_Ss_HitMark +ovl_Effect_Ss_Fhg_Flash +ovl_Effect_Ss_K_Fire +ovl_Effect_Ss_Solder_Srch_Ball +ovl_Effect_Ss_Kakera +ovl_Effect_Ss_Ice_Piece +ovl_Effect_Ss_En_Ice +ovl_Effect_Ss_Fire_Tail +ovl_Effect_Ss_En_Fire +ovl_Effect_Ss_Extra +ovl_Effect_Ss_Fcircle +ovl_Effect_Ss_Dead_Db +ovl_Effect_Ss_Dead_Dd +ovl_Effect_Ss_Dead_Ds +ovl_Effect_Ss_Dead_Sound +ovl_Oceff_Storm +ovl_En_Weiyer +ovl_Bg_Spot05_Soko +ovl_Bg_Jya_1flift +ovl_Bg_Jya_Haheniron +ovl_Bg_Spot12_Gate +ovl_Bg_Spot12_Saku +ovl_En_Hintnuts +ovl_En_Nutsball +ovl_Bg_Spot00_Break +ovl_En_Shopnuts +ovl_En_It +ovl_En_GeldB +ovl_Oceff_Wipe2 +ovl_Oceff_Wipe3 +ovl_En_Niw_Girl +ovl_En_Dog +ovl_En_Si +ovl_Bg_Spot01_Objects2 +ovl_Obj_Comb +ovl_Bg_Spot11_Bakudankabe +ovl_Obj_Kibako2 +ovl_En_Dnt_Demo +ovl_En_Dnt_Jiji +ovl_En_Dnt_Nomal +ovl_En_Guest +ovl_Bg_Bom_Guard +ovl_En_Hs2 +ovl_Demo_Kekkai +ovl_Bg_Spot08_Bakudankabe +ovl_Bg_Spot17_Bakudankabe +ovl_Obj_Mure3 +ovl_En_Tg +ovl_En_Mu +ovl_En_Go2 +ovl_En_Wf +ovl_En_Skb +ovl_Demo_Gj +ovl_Demo_Geff +ovl_Bg_Gnd_Firemeiro +ovl_Bg_Gnd_Darkmeiro +ovl_Bg_Gnd_Soulmeiro +ovl_Bg_Gnd_Nisekabe +ovl_Bg_Gnd_Iceblock +ovl_Bg_Ydan_Sp +ovl_En_Gb +ovl_En_Gs +ovl_Bg_Mizu_Bwall +ovl_Bg_Mizu_Shutter +ovl_En_Daiku_Kakariko +ovl_Bg_Bowl_Wall +ovl_En_Wall_Tubo +ovl_En_Po_Desert +ovl_En_Crow +ovl_Door_Killer +ovl_Bg_Spot11_Oasis +ovl_Bg_Spot18_Futa +ovl_Bg_Spot18_Shutter +ovl_En_Ma3 +ovl_En_Cow +ovl_Bg_Ice_Turara +ovl_Bg_Ice_Shutter +ovl_En_Kakasi2 +ovl_En_Kakasi3 +ovl_Oceff_Wipe4 +ovl_En_Eg +ovl_Bg_Menkuri_Nisekabe +ovl_En_Zo +ovl_Effect_Ss_Ice_Smoke +ovl_Obj_Makekinsuta +ovl_En_Ge3 +ovl_Obj_Timeblock +ovl_Obj_Hamishi +ovl_En_Zl4 +ovl_En_Mm2 +ovl_Bg_Jya_Block +ovl_Obj_Warp2block +gameplay_keep +gameplay_field_keep +gameplay_dangeon_keep +gameplay_object_exchange_static +object_link_boy +object_link_child +object_box +object_human +object_okuta +object_poh +object_wallmaster +object_dy_obj +object_firefly +object_dodongo +object_fire +object_niw +object_tite +object_reeba +object_peehat +object_kingdodongo +object_horse +object_zf +object_goma +object_zl1 +object_gol +object_bubble +object_dodojr +object_torch2 +object_bl +object_tp +object_oA1 +object_st +object_bw +object_ei +object_horse_normal +object_oB1 +object_o_anime +object_spot04_objects +object_ddan_objects +object_hidan_objects +object_horse_ganon +object_oA2 +object_spot00_objects +object_mb +object_bombf +object_sk2 +object_oE1 +object_oE_anime +object_oE2 +object_ydan_objects +object_gnd +object_am +object_dekubaba +object_oA3 +object_oA4 +object_oA5 +object_oA6 +object_oA7 +object_jj +object_oA8 +object_oA9 +object_oB2 +object_oB3 +object_oB4 +object_horse_zelda +object_opening_demo1 +object_warp1 +object_b_heart +object_dekunuts +object_oE3 +object_oE4 +object_menkuri_objects +object_oE5 +object_oE6 +object_oE7 +object_oE8 +object_oE9 +object_oE10 +object_oE11 +object_oE12 +object_vali +object_oA10 +object_oA11 +object_mizu_objects +object_fhg +object_ossan +object_mori_hineri1 +object_Bb +object_toki_objects +object_yukabyun +object_zl2 +object_mjin +object_mjin_flash +object_mjin_dark +object_mjin_flame +object_mjin_ice +object_mjin_soul +object_mjin_wind +object_mjin_oka +object_haka_objects +object_spot06_objects +object_ice_objects +object_relay_objects +object_mori_hineri1a +object_mori_hineri2 +object_mori_hineri2a +object_mori_objects +object_mori_tex +object_spot08_obj +object_warp2 +object_hata +object_bird +object_wood02 +object_lightbox +object_pu_box +object_trap +object_vase +object_im +object_ta +object_tk +object_xc +object_vm +object_bv +object_hakach_objects +object_efc_crystal_light +object_efc_fire_ball +object_efc_flash +object_efc_lgt_shower +object_efc_star_field +object_god_lgt +object_light_ring +object_triforce_spot +object_medal +object_bdan_objects +object_sd +object_rd +object_po_sisters +object_heavy_object +object_gndd +object_fd +object_du +object_fw +object_horse_link_child +object_spot02_objects +object_haka +object_ru1 +object_syokudai +object_fd2 +object_dh +object_rl +object_efc_tw +object_demo_tre_lgt +object_gi_key +object_mir_ray +object_brob +object_gi_jewel +object_spot09_obj +object_spot18_obj +object_bdoor +object_spot17_obj +object_shop_dungen +object_nb +object_mo +object_sb +object_gi_melody +object_gi_heart +object_gi_compass +object_gi_bosskey +object_gi_medal +object_gi_nuts +object_sa +object_gi_hearts +object_gi_arrowcase +object_gi_bombpouch +object_in +object_tr +object_spot16_obj +object_oE1s +object_oE4s +object_os_anime +object_gi_bottle +object_gi_stick +object_gi_map +object_oF1d_map +object_ru2 +object_gi_shield_1 +object_dekujr +object_gi_magicpot +object_gi_bomb_1 +object_oF1s +object_ma2 +object_gi_purse +object_hni +object_tw +object_rr +object_bxa +object_anubice +object_gi_gerudo +object_gi_arrow +object_gi_bomb_2 +object_gi_egg +object_gi_scale +object_gi_shield_2 +object_gi_hookshot +object_gi_ocarina +object_gi_milk +object_ma1 +object_ganon +object_sst +object_ny +object_fr +object_gi_pachinko +object_gi_boomerang +object_gi_bow +object_gi_glasses +object_gi_liquid +object_ani +object_demo_6k +object_gi_shield_3 +object_gi_letter +object_spot15_obj +object_jya_obj +object_gi_clothes +object_gi_bean +object_gi_fish +object_gi_saw +object_gi_hammer +object_gi_grass +object_gi_longsword +object_spot01_objects +object_md +object_km1 +object_kw1 +object_zo +object_kz +object_umajump +object_masterkokiri +object_masterkokirihead +object_mastergolon +object_masterzoora +object_aob +object_ik +object_ahg +object_cne +object_gi_niwatori +object_skj +object_gi_bottle_letter +object_bji +object_bba +object_gi_ocarina_0 +object_ds +object_ane +object_boj +object_spot03_object +object_spot07_object +object_fz +object_bob +object_ge1 +object_yabusame_point +object_gi_boots_2 +object_gi_seed +object_gnd_magic +object_d_elevator +object_d_hsblock +object_d_lift +object_mamenoki +object_goroiwa +object_toryo +object_daiku +object_nwc +object_blkobj +object_gm +object_ms +object_hs +object_ingate +object_lightswitch +object_kusa +object_tsubo +object_gi_gloves +object_gi_coin +object_kanban +object_gjyo_objects +object_owl +object_mk +object_fu +object_gi_ki_tan_mask +object_gi_redead_mask +object_gi_skj_mask +object_gi_rabit_mask +object_gi_truth_mask +object_ganon_objects +object_siofuki +object_stream +object_mm +object_fa +object_os +object_gi_eye_lotion +object_gi_powder +object_gi_mushroom +object_gi_ticketstone +object_gi_brokensword +object_js +object_cs +object_gi_prescription +object_gi_bracelet +object_gi_soldout +object_gi_frog +object_mag +object_door_gerudo +object_gt +object_efc_erupc +object_zl2_anime1 +object_zl2_anime2 +object_gi_golonmask +object_gi_zoramask +object_gi_gerudomask +object_ganon2 +object_ka +object_ts +object_zg +object_gi_hoverboots +object_gi_m_arrow +object_ds2 +object_ec +object_fish +object_gi_sutaru +object_gi_goddess +object_ssh +object_bigokuta +object_bg +object_spot05_objects +object_spot12_obj +object_bombiwa +object_hintnuts +object_rs +object_spot00_break +object_gla +object_shopnuts +object_geldb +object_gr +object_dog +object_jya_iron +object_jya_door +object_spot01_objects2 +object_spot11_obj +object_kibako2 +object_dns +object_dnk +object_gi_fire +object_gi_insect +object_gi_butterfly +object_gi_ghost +object_gi_soul +object_bowl +object_po_field +object_demo_kekkai +object_efc_doughnut +object_gi_dekupouch +object_ganon_anime1 +object_ganon_anime2 +object_ganon_anime3 +object_gi_rupy +object_spot01_matoya +object_spot01_matoyab +object_po_composer +object_mu +object_wf +object_skb +object_gj +object_geff +object_haka_door +object_gs +object_ps +object_bwall +object_crow +object_cow +object_cob +object_gi_sword_1 +object_door_killer +object_ouke_haka +object_timeblock +object_zl4 +g_pn_01 +g_pn_02 +g_pn_03 +g_pn_04 +g_pn_05 +g_pn_06 +g_pn_07 +g_pn_08 +g_pn_09 +g_pn_10 +g_pn_11 +g_pn_12 +g_pn_13 +g_pn_14 +g_pn_15 +g_pn_16 +g_pn_17 +g_pn_18 +g_pn_19 +g_pn_20 +g_pn_21 +g_pn_22 +g_pn_23 +g_pn_24 +g_pn_25 +g_pn_26 +g_pn_27 +g_pn_28 +g_pn_29 +g_pn_30 +g_pn_31 +g_pn_32 +g_pn_33 +g_pn_34 +g_pn_35 +g_pn_36 +g_pn_37 +g_pn_38 +g_pn_39 +g_pn_40 +g_pn_41 +g_pn_42 +g_pn_43 +g_pn_44 +g_pn_45 +g_pn_46 +g_pn_47 +g_pn_48 +g_pn_49 +g_pn_50 +g_pn_51 +g_pn_52 +g_pn_53 +g_pn_54 +g_pn_55 +g_pn_56 +g_pn_57 +z_select_static +nintendo_rogo_static +title_static +parameter_static +vr_fine0_static +vr_fine0_pal_static +vr_fine1_static +vr_fine1_pal_static +vr_fine2_static +vr_fine2_pal_static +vr_fine3_static +vr_fine3_pal_static +vr_cloud0_static +vr_cloud0_pal_static +vr_cloud1_static +vr_cloud1_pal_static +vr_cloud2_static +vr_cloud2_pal_static +vr_cloud3_static +vr_cloud3_pal_static +vr_holy0_static +vr_holy0_pal_static +vr_holy1_static +vr_holy1_pal_static +vr_MDVR_static +vr_MDVR_pal_static +vr_MNVR_static +vr_MNVR_pal_static +vr_RUVR_static +vr_RUVR_pal_static +vr_LHVR_static +vr_LHVR_pal_static +vr_KHVR_static +vr_KHVR_pal_static +vr_K3VR_static +vr_K3VR_pal_static +vr_K4VR_static +vr_K4VR_pal_static +vr_K5VR_static +vr_K5VR_pal_static +vr_SP1a_static +vr_SP1a_pal_static +vr_MLVR_static +vr_MLVR_pal_static +vr_KKRVR_static +vr_KKRVR_pal_static +vr_KR3VR_static +vr_KR3VR_pal_static +vr_IPVR_static +vr_IPVR_pal_static +vr_KSVR_static +vr_KSVR_pal_static +vr_GLVR_static +vr_GLVR_pal_static +vr_ZRVR_static +vr_ZRVR_pal_static +vr_DGVR_static +vr_DGVR_pal_static +vr_ALVR_static +vr_ALVR_pal_static +vr_NSVR_static +vr_NSVR_pal_static +vr_LBVR_static +vr_LBVR_pal_static +vr_TTVR_static +vr_TTVR_pal_static +vr_FCVR_static +vr_FCVR_pal_static +elf_message_field +elf_message_ydan +ddan_scene +ddan_room_0 +ddan_room_1 +ddan_room_2 +ddan_room_3 +ddan_room_4 +ddan_room_5 +ddan_room_6 +ddan_room_7 +ddan_room_8 +ddan_room_9 +ddan_room_10 +ddan_room_11 +ddan_room_12 +ddan_room_13 +ddan_room_14 +ddan_room_15 +ddan_room_16 +spot00_scene +spot00_room_0 +spot01_scene +spot01_room_0 +spot02_scene +spot02_room_0 +spot02_room_1 +spot03_scene +spot03_room_0 +spot03_room_1 +spot04_scene +spot04_room_0 +spot04_room_1 +spot04_room_2 +spot05_scene +spot05_room_0 +spot06_scene +spot06_room_0 +spot07_scene +spot07_room_0 +spot07_room_1 +spot08_scene +spot08_room_0 +spot09_scene +spot09_room_0 +spot10_scene +spot10_room_0 +spot10_room_1 +spot10_room_2 +spot10_room_3 +spot10_room_4 +spot10_room_5 +spot10_room_6 +spot10_room_7 +spot10_room_8 +spot10_room_9 +spot11_scene +spot11_room_0 +spot12_scene +spot12_room_0 +spot12_room_1 +spot13_scene +spot13_room_0 +spot13_room_1 +spot15_scene +spot15_room_0 +spot16_scene +spot16_room_0 +spot17_scene +spot17_room_0 +spot17_room_1 +spot18_scene +spot18_room_0 +spot18_room_1 +spot18_room_2 +spot18_room_3 +market_day_scene +market_day_room_0 +market_night_scene +market_night_room_0 +HIDAN_scene +HIDAN_room_0 +HIDAN_room_1 +HIDAN_room_2 +HIDAN_room_3 +HIDAN_room_4 +HIDAN_room_5 +HIDAN_room_6 +HIDAN_room_7 +HIDAN_room_8 +HIDAN_room_9 +HIDAN_room_10 +HIDAN_room_11 +HIDAN_room_12 +HIDAN_room_13 +HIDAN_room_14 +HIDAN_room_15 +HIDAN_room_16 +HIDAN_room_17 +HIDAN_room_18 +HIDAN_room_19 +HIDAN_room_20 +HIDAN_room_21 +HIDAN_room_22 +HIDAN_room_23 +HIDAN_room_24 +HIDAN_room_25 +HIDAN_room_26 +Bmori1_scene +Bmori1_room_0 +Bmori1_room_1 +Bmori1_room_2 +Bmori1_room_3 +Bmori1_room_4 +Bmori1_room_5 +Bmori1_room_6 +Bmori1_room_7 +Bmori1_room_8 +Bmori1_room_9 +Bmori1_room_10 +Bmori1_room_11 +Bmori1_room_12 +Bmori1_room_13 +Bmori1_room_14 +Bmori1_room_15 +Bmori1_room_16 +Bmori1_room_17 +Bmori1_room_18 +Bmori1_room_19 +Bmori1_room_20 +Bmori1_room_21 +Bmori1_room_22 +ydan_scene +ydan_room_0 +ydan_room_1 +ydan_room_2 +ydan_room_3 +ydan_room_4 +ydan_room_5 +ydan_room_6 +ydan_room_7 +ydan_room_8 +ydan_room_9 +ydan_room_10 +ydan_room_11 +kenjyanoma_scene +kenjyanoma_room_0 +tokinoma_scene +tokinoma_room_0 +tokinoma_room_1 +link_home_scene +link_home_room_0 +kokiri_shop_scene +kokiri_shop_room_0 +MIZUsin_scene +MIZUsin_room_0 +MIZUsin_room_1 +MIZUsin_room_2 +MIZUsin_room_3 +MIZUsin_room_4 +MIZUsin_room_5 +MIZUsin_room_6 +MIZUsin_room_7 +MIZUsin_room_8 +MIZUsin_room_9 +MIZUsin_room_10 +MIZUsin_room_11 +MIZUsin_room_12 +MIZUsin_room_13 +MIZUsin_room_14 +MIZUsin_room_15 +MIZUsin_room_16 +MIZUsin_room_17 +MIZUsin_room_18 +MIZUsin_room_19 +MIZUsin_room_20 +MIZUsin_room_21 +MIZUsin_room_22 +kokiri_home_scene +kokiri_home_room_0 +kakusiana_scene +kakusiana_room_0 +kakusiana_room_1 +kakusiana_room_2 +kakusiana_room_3 +kakusiana_room_4 +kakusiana_room_5 +kakusiana_room_6 +kakusiana_room_7 +kakusiana_room_8 +kakusiana_room_9 +kakusiana_room_10 +kakusiana_room_11 +kakusiana_room_12 +kakusiana_room_13 +entra_scene +entra_room_0 +bdan_scene +bdan_room_0 +bdan_room_1 +bdan_room_2 +bdan_room_3 +bdan_room_4 +bdan_room_5 +bdan_room_6 +bdan_room_7 +bdan_room_8 +bdan_room_9 +bdan_room_10 +bdan_room_11 +bdan_room_12 +bdan_room_13 +bdan_room_14 +bdan_room_15 +HAKAdan_scene +HAKAdan_room_0 +HAKAdan_room_1 +HAKAdan_room_2 +HAKAdan_room_3 +HAKAdan_room_4 +HAKAdan_room_5 +HAKAdan_room_6 +HAKAdan_room_7 +HAKAdan_room_8 +HAKAdan_room_9 +HAKAdan_room_10 +HAKAdan_room_11 +HAKAdan_room_12 +HAKAdan_room_13 +HAKAdan_room_14 +HAKAdan_room_15 +HAKAdan_room_16 +HAKAdan_room_17 +HAKAdan_room_18 +HAKAdan_room_19 +HAKAdan_room_20 +HAKAdan_room_21 +HAKAdan_room_22 +moribossroom_scene +moribossroom_room_0 +moribossroom_room_1 +syatekijyou_scene +syatekijyou_room_0 +men_scene +men_room_0 +men_room_1 +men_room_2 +men_room_3 +men_room_4 +men_room_5 +men_room_6 +men_room_7 +men_room_8 +men_room_9 +men_room_10 +shop1_scene +shop1_room_0 +hairal_niwa_scene +hairal_niwa_room_0 +ganon_tou_scene +ganon_tou_room_0 +market_alley_scene +market_alley_room_0 +spot20_scene +spot20_room_0 +market_ruins_scene +market_ruins_room_0 +entra_n_scene +entra_n_room_0 +enrui_scene +enrui_room_0 +market_alley_n_scene +market_alley_n_room_0 +hiral_demo_scene +hiral_demo_room_0 +kokiri_home3_scene +kokiri_home3_room_0 +jyasinzou_scene +jyasinzou_room_0 +jyasinzou_room_1 +jyasinzou_room_2 +jyasinzou_room_3 +jyasinzou_room_4 +jyasinzou_room_5 +jyasinzou_room_6 +jyasinzou_room_7 +jyasinzou_room_8 +jyasinzou_room_9 +jyasinzou_room_10 +jyasinzou_room_11 +jyasinzou_room_12 +jyasinzou_room_13 +jyasinzou_room_14 +jyasinzou_room_15 +jyasinzou_room_16 +jyasinzou_room_17 +jyasinzou_room_18 +jyasinzou_room_19 +jyasinzou_room_20 +jyasinzou_room_21 +jyasinzou_room_22 +jyasinzou_room_23 +jyasinzou_room_24 +jyasinzou_room_25 +jyasinzou_room_26 +jyasinzou_room_27 +jyasinzou_room_28 +ice_doukutu_scene +ice_doukutu_room_0 +ice_doukutu_room_1 +ice_doukutu_room_2 +ice_doukutu_room_3 +ice_doukutu_room_4 +ice_doukutu_room_5 +ice_doukutu_room_6 +ice_doukutu_room_7 +ice_doukutu_room_8 +ice_doukutu_room_9 +ice_doukutu_room_10 +ice_doukutu_room_11 +malon_stable_scene +malon_stable_room_0 +kakariko_scene +kakariko_room_0 +bdan_boss_scene +bdan_boss_room_0 +bdan_boss_room_1 +FIRE_bs_scene +FIRE_bs_room_0 +FIRE_bs_room_1 +hut_scene +hut_room_0 +daiyousei_izumi_scene +daiyousei_izumi_room_0 +hakaana_scene +hakaana_room_0 +yousei_izumi_tate_scene +yousei_izumi_tate_room_0 +yousei_izumi_yoko_scene +yousei_izumi_yoko_room_0 +golon_scene +golon_room_0 +zoora_scene +zoora_room_0 +drag_scene +drag_room_0 +alley_shop_scene +alley_shop_room_0 +night_shop_scene +night_shop_room_0 +impa_scene +impa_room_0 +labo_scene +labo_room_0 +tent_scene +tent_room_0 +nakaniwa_scene +nakaniwa_room_0 +ddan_boss_scene +ddan_boss_room_0 +ddan_boss_room_1 +ydan_boss_scene +ydan_boss_room_0 +ydan_boss_room_1 +HAKAdan_bs_scene +HAKAdan_bs_room_0 +HAKAdan_bs_room_1 +MIZUsin_bs_scene +MIZUsin_bs_room_0 +MIZUsin_bs_room_1 +ganon_scene +ganon_room_0 +ganon_room_1 +ganon_room_2 +ganon_room_3 +ganon_room_4 +ganon_room_5 +ganon_room_6 +ganon_room_7 +ganon_room_8 +ganon_room_9 +ganon_boss_scene +ganon_boss_room_0 +jyasinboss_scene +jyasinboss_room_0 +jyasinboss_room_1 +jyasinboss_room_2 +jyasinboss_room_3 +kokiri_home4_scene +kokiri_home4_room_0 +kokiri_home5_scene +kokiri_home5_room_0 +ganon_final_scene +ganon_final_room_0 +kakariko3_scene +kakariko3_room_0 +hakasitarelay_scene +hakasitarelay_room_0 +hakasitarelay_room_1 +hakasitarelay_room_2 +hakasitarelay_room_3 +hakasitarelay_room_4 +hakasitarelay_room_5 +hakasitarelay_room_6 +shrine_scene +shrine_room_0 +turibori_scene +turibori_room_0 +shrine_n_scene +shrine_n_room_0 +shrine_r_scene +shrine_r_room_0 +ganontika_scene +ganontika_room_0 +ganontika_room_1 +ganontika_room_2 +ganontika_room_3 +ganontika_room_4 +ganontika_room_5 +ganontika_room_6 +ganontika_room_7 +ganontika_room_8 +ganontika_room_9 +ganontika_room_10 +ganontika_room_11 +ganontika_room_12 +ganontika_room_13 +ganontika_room_14 +ganontika_room_15 +ganontika_room_16 +ganontika_room_17 +ganontika_room_18 +ganontika_room_19 +hakaana2_scene +hakaana2_room_0 +gerudoway_scene +gerudoway_room_0 +gerudoway_room_1 +gerudoway_room_2 +gerudoway_room_3 +gerudoway_room_4 +gerudoway_room_5 +HAKAdanCH_scene +HAKAdanCH_room_0 +HAKAdanCH_room_1 +HAKAdanCH_room_2 +HAKAdanCH_room_3 +HAKAdanCH_room_4 +HAKAdanCH_room_5 +HAKAdanCH_room_6 +hairal_niwa_n_scene +hairal_niwa_n_room_0 +bowling_scene +bowling_room_0 +hakaana_ouke_scene +hakaana_ouke_room_0 +hakaana_ouke_room_1 +hakaana_ouke_room_2 +hylia_labo_scene +hylia_labo_room_0 +souko_scene +souko_room_0 +souko_room_1 +souko_room_2 +miharigoya_scene +miharigoya_room_0 +mahouya_scene +mahouya_room_0 +takaraya_scene +takaraya_room_0 +takaraya_room_1 +takaraya_room_2 +takaraya_room_3 +takaraya_room_4 +takaraya_room_5 +takaraya_room_6 +ganon_sonogo_scene +ganon_sonogo_room_0 +ganon_sonogo_room_1 +ganon_sonogo_room_2 +ganon_sonogo_room_3 +ganon_sonogo_room_4 +ganon_demo_scene +ganon_demo_room_0 +face_shop_scene +face_shop_room_0 +kinsuta_scene +kinsuta_room_0 +ganontikasonogo_scene +ganontikasonogo_room_0 +ganontikasonogo_room_1 +bump_texture_static +anime_model_1_static +anime_model_2_static +anime_model_3_static +anime_model_4_static +anime_model_5_static +anime_model_6_static +anime_texture_1_static +anime_texture_2_static +anime_texture_3_static +anime_texture_4_static +anime_texture_5_static +anime_texture_6_static +softsprite_matrix_static \ No newline at end of file diff --git a/soh/assets/extractor/symbols/ActorList_OoTMqDbg.txt b/soh/assets/extractor/symbols/ActorList_OoTMqDbg.txt new file mode 100644 index 000000000..a0395eb27 --- /dev/null +++ b/soh/assets/extractor/symbols/ActorList_OoTMqDbg.txt @@ -0,0 +1,472 @@ +ACTOR_PLAYER +ACTOR_UNSET_1 +ACTOR_EN_TEST +ACTOR_UNSET_3 +ACTOR_EN_GIRLA +ACTOR_UNSET_5 +ACTOR_UNSET_6 +ACTOR_EN_PART +ACTOR_EN_LIGHT +ACTOR_EN_DOOR +ACTOR_EN_BOX +ACTOR_BG_DY_YOSEIZO +ACTOR_BG_HIDAN_FIREWALL +ACTOR_EN_POH +ACTOR_EN_OKUTA +ACTOR_BG_YDAN_SP +ACTOR_EN_BOM +ACTOR_EN_WALLMAS +ACTOR_EN_DODONGO +ACTOR_EN_FIREFLY +ACTOR_EN_HORSE +ACTOR_EN_ITEM00 +ACTOR_EN_ARROW +ACTOR_UNSET_17 +ACTOR_EN_ELF +ACTOR_EN_NIW +ACTOR_UNSET_1A +ACTOR_EN_TITE +ACTOR_EN_REEBA +ACTOR_EN_PEEHAT +ACTOR_EN_BUTTE +ACTOR_UNSET_1F +ACTOR_EN_INSECT +ACTOR_EN_FISH +ACTOR_UNSET_22 +ACTOR_EN_HOLL +ACTOR_EN_SCENE_CHANGE +ACTOR_EN_ZF +ACTOR_EN_HATA +ACTOR_BOSS_DODONGO +ACTOR_BOSS_GOMA +ACTOR_EN_ZL1 +ACTOR_EN_VIEWER +ACTOR_EN_GOMA +ACTOR_BG_PUSHBOX +ACTOR_EN_BUBBLE +ACTOR_DOOR_SHUTTER +ACTOR_EN_DODOJR +ACTOR_EN_BDFIRE +ACTOR_UNSET_31 +ACTOR_EN_BOOM +ACTOR_EN_TORCH2 +ACTOR_EN_BILI +ACTOR_EN_TP +ACTOR_UNSET_36 +ACTOR_EN_ST +ACTOR_EN_BW +ACTOR_EN_A_OBJ +ACTOR_EN_EIYER +ACTOR_EN_RIVER_SOUND +ACTOR_EN_HORSE_NORMAL +ACTOR_EN_OSSAN +ACTOR_BG_TREEMOUTH +ACTOR_BG_DODOAGO +ACTOR_BG_HIDAN_DALM +ACTOR_BG_HIDAN_HROCK +ACTOR_EN_HORSE_GANON +ACTOR_BG_HIDAN_ROCK +ACTOR_BG_HIDAN_RSEKIZOU +ACTOR_BG_HIDAN_SEKIZOU +ACTOR_BG_HIDAN_SIMA +ACTOR_BG_HIDAN_SYOKU +ACTOR_EN_XC +ACTOR_BG_HIDAN_CURTAIN +ACTOR_BG_SPOT00_HANEBASI +ACTOR_EN_MB +ACTOR_EN_BOMBF +ACTOR_EN_ZL2 +ACTOR_BG_HIDAN_FSLIFT +ACTOR_EN_OE2 +ACTOR_BG_YDAN_HASI +ACTOR_BG_YDAN_MARUTA +ACTOR_BOSS_GANONDROF +ACTOR_UNSET_53 +ACTOR_EN_AM +ACTOR_EN_DEKUBABA +ACTOR_EN_M_FIRE1 +ACTOR_EN_M_THUNDER +ACTOR_BG_DDAN_JD +ACTOR_BG_BREAKWALL +ACTOR_EN_JJ +ACTOR_EN_HORSE_ZELDA +ACTOR_BG_DDAN_KD +ACTOR_DOOR_WARP1 +ACTOR_OBJ_SYOKUDAI +ACTOR_ITEM_B_HEART +ACTOR_EN_DEKUNUTS +ACTOR_BG_MENKURI_KAITEN +ACTOR_BG_MENKURI_EYE +ACTOR_EN_VALI +ACTOR_BG_MIZU_MOVEBG +ACTOR_BG_MIZU_WATER +ACTOR_ARMS_HOOK +ACTOR_EN_FHG +ACTOR_BG_MORI_HINERI +ACTOR_EN_BB +ACTOR_BG_TOKI_HIKARI +ACTOR_EN_YUKABYUN +ACTOR_BG_TOKI_SWD +ACTOR_EN_FHG_FIRE +ACTOR_BG_MJIN +ACTOR_BG_HIDAN_KOUSI +ACTOR_DOOR_TOKI +ACTOR_BG_HIDAN_HAMSTEP +ACTOR_EN_BIRD +ACTOR_UNSET_73 +ACTOR_UNSET_74 +ACTOR_UNSET_75 +ACTOR_UNSET_76 +ACTOR_EN_WOOD02 +ACTOR_UNSET_78 +ACTOR_UNSET_79 +ACTOR_UNSET_7A +ACTOR_UNSET_7B +ACTOR_EN_LIGHTBOX +ACTOR_EN_PU_BOX +ACTOR_UNSET_7E +ACTOR_UNSET_7F +ACTOR_EN_TRAP +ACTOR_EN_AROW_TRAP +ACTOR_EN_VASE +ACTOR_UNSET_83 +ACTOR_EN_TA +ACTOR_EN_TK +ACTOR_BG_MORI_BIGST +ACTOR_BG_MORI_ELEVATOR +ACTOR_BG_MORI_KAITENKABE +ACTOR_BG_MORI_RAKKATENJO +ACTOR_EN_VM +ACTOR_DEMO_EFFECT +ACTOR_DEMO_KANKYO +ACTOR_BG_HIDAN_FWBIG +ACTOR_EN_FLOORMAS +ACTOR_EN_HEISHI1 +ACTOR_EN_RD +ACTOR_EN_PO_SISTERS +ACTOR_BG_HEAVY_BLOCK +ACTOR_BG_PO_EVENT +ACTOR_OBJ_MURE +ACTOR_EN_SW +ACTOR_BOSS_FD +ACTOR_OBJECT_KANKYO +ACTOR_EN_DU +ACTOR_EN_FD +ACTOR_EN_HORSE_LINK_CHILD +ACTOR_DOOR_ANA +ACTOR_BG_SPOT02_OBJECTS +ACTOR_BG_HAKA +ACTOR_MAGIC_WIND +ACTOR_MAGIC_FIRE +ACTOR_UNSET_A0 +ACTOR_EN_RU1 +ACTOR_BOSS_FD2 +ACTOR_EN_FD_FIRE +ACTOR_EN_DH +ACTOR_EN_DHA +ACTOR_EN_RL +ACTOR_EN_ENCOUNT1 +ACTOR_DEMO_DU +ACTOR_DEMO_IM +ACTOR_DEMO_TRE_LGT +ACTOR_EN_FW +ACTOR_BG_VB_SIMA +ACTOR_EN_VB_BALL +ACTOR_BG_HAKA_MEGANE +ACTOR_BG_HAKA_MEGANEBG +ACTOR_BG_HAKA_SHIP +ACTOR_BG_HAKA_SGAMI +ACTOR_UNSET_B2 +ACTOR_EN_HEISHI2 +ACTOR_EN_ENCOUNT2 +ACTOR_EN_FIRE_ROCK +ACTOR_EN_BROB +ACTOR_MIR_RAY +ACTOR_BG_SPOT09_OBJ +ACTOR_BG_SPOT18_OBJ +ACTOR_BOSS_VA +ACTOR_BG_HAKA_TUBO +ACTOR_BG_HAKA_TRAP +ACTOR_BG_HAKA_HUTA +ACTOR_BG_HAKA_ZOU +ACTOR_BG_SPOT17_FUNEN +ACTOR_EN_SYATEKI_ITM +ACTOR_EN_SYATEKI_MAN +ACTOR_EN_TANA +ACTOR_EN_NB +ACTOR_BOSS_MO +ACTOR_EN_SB +ACTOR_EN_BIGOKUTA +ACTOR_EN_KAREBABA +ACTOR_BG_BDAN_OBJECTS +ACTOR_DEMO_SA +ACTOR_DEMO_GO +ACTOR_EN_IN +ACTOR_EN_TR +ACTOR_BG_SPOT16_BOMBSTONE +ACTOR_UNSET_CE +ACTOR_BG_HIDAN_KOWARERUKABE +ACTOR_BG_BOMBWALL +ACTOR_BG_SPOT08_ICEBLOCK +ACTOR_EN_RU2 +ACTOR_OBJ_DEKUJR +ACTOR_BG_MIZU_UZU +ACTOR_BG_SPOT06_OBJECTS +ACTOR_BG_ICE_OBJECTS +ACTOR_BG_HAKA_WATER +ACTOR_UNSET_D8 +ACTOR_EN_MA2 +ACTOR_EN_BOM_CHU +ACTOR_EN_HORSE_GAME_CHECK +ACTOR_BOSS_TW +ACTOR_EN_RR +ACTOR_EN_BA +ACTOR_EN_BX +ACTOR_EN_ANUBICE +ACTOR_EN_ANUBICE_FIRE +ACTOR_BG_MORI_HASHIGO +ACTOR_BG_MORI_HASHIRA4 +ACTOR_BG_MORI_IDOMIZU +ACTOR_BG_SPOT16_DOUGHNUT +ACTOR_BG_BDAN_SWITCH +ACTOR_EN_MA1 +ACTOR_BOSS_GANON +ACTOR_BOSS_SST +ACTOR_UNSET_EA +ACTOR_UNSET_EB +ACTOR_EN_NY +ACTOR_EN_FR +ACTOR_ITEM_SHIELD +ACTOR_BG_ICE_SHELTER +ACTOR_EN_ICE_HONO +ACTOR_ITEM_OCARINA +ACTOR_UNSET_F2 +ACTOR_UNSET_F3 +ACTOR_MAGIC_DARK +ACTOR_DEMO_6K +ACTOR_EN_ANUBICE_TAG +ACTOR_BG_HAKA_GATE +ACTOR_BG_SPOT15_SAKU +ACTOR_BG_JYA_GOROIWA +ACTOR_BG_JYA_ZURERUKABE +ACTOR_UNSET_FB +ACTOR_BG_JYA_COBRA +ACTOR_BG_JYA_KANAAMI +ACTOR_FISHING +ACTOR_OBJ_OSHIHIKI +ACTOR_BG_GATE_SHUTTER +ACTOR_EFF_DUST +ACTOR_BG_SPOT01_FUSYA +ACTOR_BG_SPOT01_IDOHASHIRA +ACTOR_BG_SPOT01_IDOMIZU +ACTOR_BG_PO_SYOKUDAI +ACTOR_BG_GANON_OTYUKA +ACTOR_BG_SPOT15_RRBOX +ACTOR_BG_UMAJUMP +ACTOR_UNSET_109 +ACTOR_ARROW_FIRE +ACTOR_ARROW_ICE +ACTOR_ARROW_LIGHT +ACTOR_UNSET_10D +ACTOR_UNSET_10E +ACTOR_ITEM_ETCETERA +ACTOR_OBJ_KIBAKO +ACTOR_OBJ_TSUBO +ACTOR_EN_WONDER_ITEM +ACTOR_EN_IK +ACTOR_DEMO_IK +ACTOR_EN_SKJ +ACTOR_EN_SKJNEEDLE +ACTOR_EN_G_SWITCH +ACTOR_DEMO_EXT +ACTOR_DEMO_SHD +ACTOR_EN_DNS +ACTOR_ELF_MSG +ACTOR_EN_HONOTRAP +ACTOR_EN_TUBO_TRAP +ACTOR_OBJ_ICE_POLY +ACTOR_BG_SPOT03_TAKI +ACTOR_BG_SPOT07_TAKI +ACTOR_EN_FZ +ACTOR_EN_PO_RELAY +ACTOR_BG_RELAY_OBJECTS +ACTOR_EN_DIVING_GAME +ACTOR_EN_KUSA +ACTOR_OBJ_BEAN +ACTOR_OBJ_BOMBIWA +ACTOR_UNSET_128 +ACTOR_UNSET_129 +ACTOR_OBJ_SWITCH +ACTOR_OBJ_ELEVATOR +ACTOR_OBJ_LIFT +ACTOR_OBJ_HSBLOCK +ACTOR_EN_OKARINA_TAG +ACTOR_EN_YABUSAME_MARK +ACTOR_EN_GOROIWA +ACTOR_EN_EX_RUPPY +ACTOR_EN_TORYO +ACTOR_EN_DAIKU +ACTOR_UNSET_134 +ACTOR_EN_NWC +ACTOR_EN_BLKOBJ +ACTOR_ITEM_INBOX +ACTOR_EN_GE1 +ACTOR_OBJ_BLOCKSTOP +ACTOR_EN_SDA +ACTOR_EN_CLEAR_TAG +ACTOR_EN_NIW_LADY +ACTOR_EN_GM +ACTOR_EN_MS +ACTOR_EN_HS +ACTOR_BG_INGATE +ACTOR_EN_KANBAN +ACTOR_EN_HEISHI3 +ACTOR_EN_SYATEKI_NIW +ACTOR_EN_ATTACK_NIW +ACTOR_BG_SPOT01_IDOSOKO +ACTOR_EN_SA +ACTOR_EN_WONDER_TALK +ACTOR_BG_GJYO_BRIDGE +ACTOR_EN_DS +ACTOR_EN_MK +ACTOR_EN_BOM_BOWL_MAN +ACTOR_EN_BOM_BOWL_PIT +ACTOR_EN_OWL +ACTOR_EN_ISHI +ACTOR_OBJ_HANA +ACTOR_OBJ_LIGHTSWITCH +ACTOR_OBJ_MURE2 +ACTOR_EN_GO +ACTOR_EN_FU +ACTOR_UNSET_154 +ACTOR_EN_CHANGER +ACTOR_BG_JYA_MEGAMI +ACTOR_BG_JYA_LIFT +ACTOR_BG_JYA_BIGMIRROR +ACTOR_BG_JYA_BOMBCHUIWA +ACTOR_BG_JYA_AMISHUTTER +ACTOR_BG_JYA_BOMBIWA +ACTOR_BG_SPOT18_BASKET +ACTOR_UNSET_15D +ACTOR_EN_GANON_ORGAN +ACTOR_EN_SIOFUKI +ACTOR_EN_STREAM +ACTOR_UNSET_161 +ACTOR_EN_MM +ACTOR_EN_KO +ACTOR_EN_KZ +ACTOR_EN_WEATHER_TAG +ACTOR_BG_SST_FLOOR +ACTOR_EN_ANI +ACTOR_EN_EX_ITEM +ACTOR_BG_JYA_IRONOBJ +ACTOR_EN_JS +ACTOR_EN_JSJUTAN +ACTOR_EN_CS +ACTOR_EN_MD +ACTOR_EN_HY +ACTOR_EN_GANON_MANT +ACTOR_EN_OKARINA_EFFECT +ACTOR_EN_MAG +ACTOR_DOOR_GERUDO +ACTOR_ELF_MSG2 +ACTOR_DEMO_GT +ACTOR_EN_PO_FIELD +ACTOR_EFC_ERUPC +ACTOR_BG_ZG +ACTOR_EN_HEISHI4 +ACTOR_EN_ZL3 +ACTOR_BOSS_GANON2 +ACTOR_EN_KAKASI +ACTOR_EN_TAKARA_MAN +ACTOR_OBJ_MAKEOSHIHIKI +ACTOR_OCEFF_SPOT +ACTOR_END_TITLE +ACTOR_UNSET_180 +ACTOR_EN_TORCH +ACTOR_DEMO_EC +ACTOR_SHOT_SUN +ACTOR_EN_DY_EXTRA +ACTOR_EN_WONDER_TALK2 +ACTOR_EN_GE2 +ACTOR_OBJ_ROOMTIMER +ACTOR_EN_SSH +ACTOR_EN_STH +ACTOR_OCEFF_WIPE +ACTOR_OCEFF_STORM +ACTOR_EN_WEIYER +ACTOR_BG_SPOT05_SOKO +ACTOR_BG_JYA_1FLIFT +ACTOR_BG_JYA_HAHENIRON +ACTOR_BG_SPOT12_GATE +ACTOR_BG_SPOT12_SAKU +ACTOR_EN_HINTNUTS +ACTOR_EN_NUTSBALL +ACTOR_BG_SPOT00_BREAK +ACTOR_EN_SHOPNUTS +ACTOR_EN_IT +ACTOR_EN_GELDB +ACTOR_OCEFF_WIPE2 +ACTOR_OCEFF_WIPE3 +ACTOR_EN_NIW_GIRL +ACTOR_EN_DOG +ACTOR_EN_SI +ACTOR_BG_SPOT01_OBJECTS2 +ACTOR_OBJ_COMB +ACTOR_BG_SPOT11_BAKUDANKABE +ACTOR_OBJ_KIBAKO2 +ACTOR_EN_DNT_DEMO +ACTOR_EN_DNT_JIJI +ACTOR_EN_DNT_NOMAL +ACTOR_EN_GUEST +ACTOR_BG_BOM_GUARD +ACTOR_EN_HS2 +ACTOR_DEMO_KEKKAI +ACTOR_BG_SPOT08_BAKUDANKABE +ACTOR_BG_SPOT17_BAKUDANKABE +ACTOR_UNSET_1AA +ACTOR_OBJ_MURE3 +ACTOR_EN_TG +ACTOR_EN_MU +ACTOR_EN_GO2 +ACTOR_EN_WF +ACTOR_EN_SKB +ACTOR_DEMO_GJ +ACTOR_DEMO_GEFF +ACTOR_BG_GND_FIREMEIRO +ACTOR_BG_GND_DARKMEIRO +ACTOR_BG_GND_SOULMEIRO +ACTOR_BG_GND_NISEKABE +ACTOR_BG_GND_ICEBLOCK +ACTOR_EN_GB +ACTOR_EN_GS +ACTOR_BG_MIZU_BWALL +ACTOR_BG_MIZU_SHUTTER +ACTOR_EN_DAIKU_KAKARIKO +ACTOR_BG_BOWL_WALL +ACTOR_EN_WALL_TUBO +ACTOR_EN_PO_DESERT +ACTOR_EN_CROW +ACTOR_DOOR_KILLER +ACTOR_BG_SPOT11_OASIS +ACTOR_BG_SPOT18_FUTA +ACTOR_BG_SPOT18_SHUTTER +ACTOR_EN_MA3 +ACTOR_EN_COW +ACTOR_BG_ICE_TURARA +ACTOR_BG_ICE_SHUTTER +ACTOR_EN_KAKASI2 +ACTOR_EN_KAKASI3 +ACTOR_OCEFF_WIPE4 +ACTOR_EN_EG +ACTOR_BG_MENKURI_NISEKABE +ACTOR_EN_ZO +ACTOR_OBJ_MAKEKINSUTA +ACTOR_EN_GE3 +ACTOR_OBJ_TIMEBLOCK +ACTOR_OBJ_HAMISHI +ACTOR_EN_ZL4 +ACTOR_EN_MM2 +ACTOR_BG_JYA_BLOCK +ACTOR_OBJ_WARP2BLOCK +ACTOR_ID_MAX \ No newline at end of file diff --git a/soh/assets/extractor/symbols/ObjectList_OoTMqDbg.txt b/soh/assets/extractor/symbols/ObjectList_OoTMqDbg.txt new file mode 100644 index 000000000..1ecc3441b --- /dev/null +++ b/soh/assets/extractor/symbols/ObjectList_OoTMqDbg.txt @@ -0,0 +1,402 @@ +OBJECT_INVALID +OBJECT_GAMEPLAY_KEEP +OBJECT_GAMEPLAY_FIELD_KEEP +OBJECT_GAMEPLAY_DANGEON_KEEP +OBJECT_UNSET_4 +OBJECT_UNSET_5 +OBJECT_HUMAN +OBJECT_OKUTA +OBJECT_CROW +OBJECT_POH +OBJECT_DY_OBJ +OBJECT_WALLMASTER +OBJECT_DODONGO +OBJECT_FIREFLY +OBJECT_BOX +OBJECT_FIRE +OBJECT_UNSET_10 +OBJECT_UNSET_11 +OBJECT_BUBBLE +OBJECT_NIW +OBJECT_LINK_BOY +OBJECT_LINK_CHILD +OBJECT_TITE +OBJECT_REEBA +OBJECT_PEEHAT +OBJECT_KINGDODONGO +OBJECT_HORSE +OBJECT_ZF +OBJECT_GOMA +OBJECT_ZL1 +OBJECT_GOL +OBJECT_DODOJR +OBJECT_TORCH2 +OBJECT_BL +OBJECT_TP +OBJECT_OA1 +OBJECT_ST +OBJECT_BW +OBJECT_EI +OBJECT_HORSE_NORMAL +OBJECT_OB1 +OBJECT_O_ANIME +OBJECT_SPOT04_OBJECTS +OBJECT_DDAN_OBJECTS +OBJECT_HIDAN_OBJECTS +OBJECT_HORSE_GANON +OBJECT_OA2 +OBJECT_SPOT00_OBJECTS +OBJECT_MB +OBJECT_BOMBF +OBJECT_SK2 +OBJECT_OE1 +OBJECT_OE_ANIME +OBJECT_OE2 +OBJECT_YDAN_OBJECTS +OBJECT_GND +OBJECT_AM +OBJECT_DEKUBABA +OBJECT_UNSET_3A +OBJECT_OA3 +OBJECT_OA4 +OBJECT_OA5 +OBJECT_OA6 +OBJECT_OA7 +OBJECT_JJ +OBJECT_OA8 +OBJECT_OA9 +OBJECT_OB2 +OBJECT_OB3 +OBJECT_OB4 +OBJECT_HORSE_ZELDA +OBJECT_OPENING_DEMO1 +OBJECT_WARP1 +OBJECT_B_HEART +OBJECT_DEKUNUTS +OBJECT_OE3 +OBJECT_OE4 +OBJECT_MENKURI_OBJECTS +OBJECT_OE5 +OBJECT_OE6 +OBJECT_OE7 +OBJECT_OE8 +OBJECT_OE9 +OBJECT_OE10 +OBJECT_OE11 +OBJECT_OE12 +OBJECT_VALI +OBJECT_OA10 +OBJECT_OA11 +OBJECT_MIZU_OBJECTS +OBJECT_FHG +OBJECT_OSSAN +OBJECT_MORI_HINERI1 +OBJECT_BB +OBJECT_TOKI_OBJECTS +OBJECT_YUKABYUN +OBJECT_ZL2 +OBJECT_MJIN +OBJECT_MJIN_FLASH +OBJECT_MJIN_DARK +OBJECT_MJIN_FLAME +OBJECT_MJIN_ICE +OBJECT_MJIN_SOUL +OBJECT_MJIN_WIND +OBJECT_MJIN_OKA +OBJECT_HAKA_OBJECTS +OBJECT_SPOT06_OBJECTS +OBJECT_ICE_OBJECTS +OBJECT_RELAY_OBJECTS +OBJECT_PO_FIELD +OBJECT_PO_COMPOSER +OBJECT_MORI_HINERI1A +OBJECT_MORI_HINERI2 +OBJECT_MORI_HINERI2A +OBJECT_MORI_OBJECTS +OBJECT_MORI_TEX +OBJECT_SPOT08_OBJ +OBJECT_WARP2 +OBJECT_HATA +OBJECT_BIRD +OBJECT_UNSET_78 +OBJECT_UNSET_79 +OBJECT_UNSET_7A +OBJECT_UNSET_7B +OBJECT_WOOD02 +OBJECT_UNSET_7D +OBJECT_UNSET_7E +OBJECT_UNSET_7F +OBJECT_UNSET_80 +OBJECT_LIGHTBOX +OBJECT_PU_BOX +OBJECT_UNSET_83 +OBJECT_UNSET_84 +OBJECT_TRAP +OBJECT_VASE +OBJECT_IM +OBJECT_TA +OBJECT_TK +OBJECT_XC +OBJECT_VM +OBJECT_BV +OBJECT_HAKACH_OBJECTS +OBJECT_EFC_CRYSTAL_LIGHT +OBJECT_EFC_FIRE_BALL +OBJECT_EFC_FLASH +OBJECT_EFC_LGT_SHOWER +OBJECT_EFC_STAR_FIELD +OBJECT_GOD_LGT +OBJECT_LIGHT_RING +OBJECT_TRIFORCE_SPOT +OBJECT_BDAN_OBJECTS +OBJECT_SD +OBJECT_RD +OBJECT_PO_SISTERS +OBJECT_HEAVY_OBJECT +OBJECT_GNDD +OBJECT_FD +OBJECT_DU +OBJECT_FW +OBJECT_MEDAL +OBJECT_HORSE_LINK_CHILD +OBJECT_SPOT02_OBJECTS +OBJECT_HAKA +OBJECT_RU1 +OBJECT_SYOKUDAI +OBJECT_FD2 +OBJECT_DH +OBJECT_RL +OBJECT_EFC_TW +OBJECT_DEMO_TRE_LGT +OBJECT_GI_KEY +OBJECT_MIR_RAY +OBJECT_BROB +OBJECT_GI_JEWEL +OBJECT_SPOT09_OBJ +OBJECT_SPOT18_OBJ +OBJECT_BDOOR +OBJECT_SPOT17_OBJ +OBJECT_SHOP_DUNGEN +OBJECT_NB +OBJECT_MO +OBJECT_SB +OBJECT_GI_MELODY +OBJECT_GI_HEART +OBJECT_GI_COMPASS +OBJECT_GI_BOSSKEY +OBJECT_GI_MEDAL +OBJECT_GI_NUTS +OBJECT_SA +OBJECT_GI_HEARTS +OBJECT_GI_ARROWCASE +OBJECT_GI_BOMBPOUCH +OBJECT_IN +OBJECT_TR +OBJECT_SPOT16_OBJ +OBJECT_OE1S +OBJECT_OE4S +OBJECT_OS_ANIME +OBJECT_GI_BOTTLE +OBJECT_GI_STICK +OBJECT_GI_MAP +OBJECT_OF1D_MAP +OBJECT_RU2 +OBJECT_GI_SHIELD_1 +OBJECT_DEKUJR +OBJECT_GI_MAGICPOT +OBJECT_GI_BOMB_1 +OBJECT_OF1S +OBJECT_MA2 +OBJECT_GI_PURSE +OBJECT_HNI +OBJECT_TW +OBJECT_RR +OBJECT_BXA +OBJECT_ANUBICE +OBJECT_GI_GERUDO +OBJECT_GI_ARROW +OBJECT_GI_BOMB_2 +OBJECT_GI_EGG +OBJECT_GI_SCALE +OBJECT_GI_SHIELD_2 +OBJECT_GI_HOOKSHOT +OBJECT_GI_OCARINA +OBJECT_GI_MILK +OBJECT_MA1 +OBJECT_GANON +OBJECT_SST +OBJECT_NY_UNUSED +OBJECT_UNSET_E4 +OBJECT_NY +OBJECT_FR +OBJECT_GI_PACHINKO +OBJECT_GI_BOOMERANG +OBJECT_GI_BOW +OBJECT_GI_GLASSES +OBJECT_GI_LIQUID +OBJECT_ANI +OBJECT_DEMO_6K +OBJECT_GI_SHIELD_3 +OBJECT_GI_LETTER +OBJECT_SPOT15_OBJ +OBJECT_JYA_OBJ +OBJECT_GI_CLOTHES +OBJECT_GI_BEAN +OBJECT_GI_FISH +OBJECT_GI_SAW +OBJECT_GI_HAMMER +OBJECT_GI_GRASS +OBJECT_GI_LONGSWORD +OBJECT_SPOT01_OBJECTS +OBJECT_MD_UNUSED +OBJECT_MD +OBJECT_KM1 +OBJECT_KW1 +OBJECT_ZO +OBJECT_KZ +OBJECT_UMAJUMP +OBJECT_MASTERKOKIRI +OBJECT_MASTERKOKIRIHEAD +OBJECT_MASTERGOLON +OBJECT_MASTERZOORA +OBJECT_AOB +OBJECT_IK +OBJECT_AHG +OBJECT_CNE +OBJECT_GI_NIWATORI +OBJECT_SKJ +OBJECT_GI_BOTTLE_LETTER +OBJECT_BJI +OBJECT_BBA +OBJECT_GI_OCARINA_0 +OBJECT_DS +OBJECT_ANE +OBJECT_BOJ +OBJECT_SPOT03_OBJECT +OBJECT_SPOT07_OBJECT +OBJECT_FZ +OBJECT_BOB +OBJECT_GE1 +OBJECT_YABUSAME_POINT +OBJECT_GI_BOOTS_2 +OBJECT_GI_SEED +OBJECT_GND_MAGIC +OBJECT_D_ELEVATOR +OBJECT_D_HSBLOCK +OBJECT_D_LIFT +OBJECT_MAMENOKI +OBJECT_GOROIWA +OBJECT_UNSET_120 +OBJECT_TORYO +OBJECT_DAIKU +OBJECT_UNSET_123 +OBJECT_NWC +OBJECT_BLKOBJ +OBJECT_GM +OBJECT_MS +OBJECT_HS +OBJECT_INGATE +OBJECT_LIGHTSWITCH +OBJECT_KUSA +OBJECT_TSUBO +OBJECT_GI_GLOVES +OBJECT_GI_COIN +OBJECT_KANBAN +OBJECT_GJYO_OBJECTS +OBJECT_OWL +OBJECT_MK +OBJECT_FU +OBJECT_GI_KI_TAN_MASK +OBJECT_GI_REDEAD_MASK +OBJECT_GI_SKJ_MASK +OBJECT_GI_RABIT_MASK +OBJECT_GI_TRUTH_MASK +OBJECT_GANON_OBJECTS +OBJECT_SIOFUKI +OBJECT_STREAM +OBJECT_MM +OBJECT_FA +OBJECT_OS +OBJECT_GI_EYE_LOTION +OBJECT_GI_POWDER +OBJECT_GI_MUSHROOM +OBJECT_GI_TICKETSTONE +OBJECT_GI_BROKENSWORD +OBJECT_JS +OBJECT_CS +OBJECT_GI_PRESCRIPTION +OBJECT_GI_BRACELET +OBJECT_GI_SOLDOUT +OBJECT_GI_FROG +OBJECT_MAG +OBJECT_DOOR_GERUDO +OBJECT_GT +OBJECT_EFC_ERUPC +OBJECT_ZL2_ANIME1 +OBJECT_ZL2_ANIME2 +OBJECT_GI_GOLONMASK +OBJECT_GI_ZORAMASK +OBJECT_GI_GERUDOMASK +OBJECT_GANON2 +OBJECT_KA +OBJECT_TS +OBJECT_ZG +OBJECT_GI_HOVERBOOTS +OBJECT_GI_M_ARROW +OBJECT_DS2 +OBJECT_EC +OBJECT_FISH +OBJECT_GI_SUTARU +OBJECT_GI_GODDESS +OBJECT_SSH +OBJECT_BIGOKUTA +OBJECT_BG +OBJECT_SPOT05_OBJECTS +OBJECT_SPOT12_OBJ +OBJECT_BOMBIWA +OBJECT_HINTNUTS +OBJECT_RS +OBJECT_SPOT00_BREAK +OBJECT_GLA +OBJECT_SHOPNUTS +OBJECT_GELDB +OBJECT_GR +OBJECT_DOG +OBJECT_JYA_IRON +OBJECT_JYA_DOOR +OBJECT_UNSET_16E +OBJECT_SPOT11_OBJ +OBJECT_KIBAKO2 +OBJECT_DNS +OBJECT_DNK +OBJECT_GI_FIRE +OBJECT_GI_INSECT +OBJECT_GI_BUTTERFLY +OBJECT_GI_GHOST +OBJECT_GI_SOUL +OBJECT_BOWL +OBJECT_DEMO_KEKKAI +OBJECT_EFC_DOUGHNUT +OBJECT_GI_DEKUPOUCH +OBJECT_GANON_ANIME1 +OBJECT_GANON_ANIME2 +OBJECT_GANON_ANIME3 +OBJECT_GI_RUPY +OBJECT_SPOT01_MATOYA +OBJECT_SPOT01_MATOYAB +OBJECT_MU +OBJECT_WF +OBJECT_SKB +OBJECT_GJ +OBJECT_GEFF +OBJECT_HAKA_DOOR +OBJECT_GS +OBJECT_PS +OBJECT_BWALL +OBJECT_COW +OBJECT_COB +OBJECT_GI_SWORD_1 +OBJECT_DOOR_KILLER +OBJECT_OUKE_HAKA +OBJECT_TIMEBLOCK +OBJECT_ZL4 \ No newline at end of file diff --git a/soh/assets/extractor/symbols/SymbolMap_OoTMqDbg.txt b/soh/assets/extractor/symbols/SymbolMap_OoTMqDbg.txt new file mode 100644 index 000000000..015e7e88a --- /dev/null +++ b/soh/assets/extractor/symbols/SymbolMap_OoTMqDbg.txt @@ -0,0 +1 @@ +8012DB20 gMtxClear \ No newline at end of file diff --git a/soh/soh/Extractor/Extract.cpp b/soh/soh/Extractor/Extract.cpp index 43f86a285..a12be6264 100644 --- a/soh/soh/Extractor/Extract.cpp +++ b/soh/soh/Extractor/Extract.cpp @@ -607,15 +607,16 @@ std::string Extractor::Mkdtemp() { } extern "C" int zapd_main(int argc, char** argv); +static void MessageboxWorker(); bool Extractor::CallZapd(std::string installPath, std::string exportdir) { - constexpr int argc = 18; + constexpr int argc = 22; char xmlPath[1024]; char confPath[1024]; char portVersion[18]; // 5 digits for int16_max (x3) + separators + terminator std::array argv; const char* version = GetZapdVerStr(); - const char* otrFile = IsMasterQuest() ? "oot-mq.otr" : "oot.otr"; + const char* otrFile = IsMasterQuest() ? "oot-mq.o2r" : "oot.o2r"; std::string romPath = std::filesystem::absolute(mCurrentRomPath).string(); installPath = std::filesystem::absolute(installPath).string(); @@ -632,8 +633,8 @@ bool Extractor::CallZapd(std::string installPath, std::string exportdir) { std::filesystem::current_path(tempdir); - snprintf(xmlPath, 1024, "assets/extractor/xmls/%s", version); - snprintf(confPath, 1024, "assets/extractor/Config_%s.xml", version); + snprintf(xmlPath, 1024, "assets/xml/%s", version); + snprintf(confPath, 1024, "assets/Config_%s.xml", version); snprintf(portVersion, 18, "%d.%d.%d", gBuildVersionMajor, gBuildVersionMinor, gBuildVersionPatch); argv[0] = "ZAPD"; @@ -643,9 +644,9 @@ bool Extractor::CallZapd(std::string installPath, std::string exportdir) { argv[4] = "-b"; argv[5] = romPath.c_str(); argv[6] = "-fl"; - argv[7] = "assets/extractor/filelists"; + argv[7] = "assets/filelists"; argv[8] = "-gsf"; - argv[9] = "1"; + argv[9] = "0"; argv[10] = "-rconf"; argv[11] = confPath; argv[12] = "-se"; @@ -654,6 +655,10 @@ bool Extractor::CallZapd(std::string installPath, std::string exportdir) { argv[15] = otrFile; argv[16] = "--portVer"; argv[17] = portVersion; + argv[18] = "-o"; + argv[19] = "placeholder"; + argv[20] = "-osf"; + argv[21] = "placeholder"; #ifdef _WIN32 // Grab a handle to the command window. @@ -665,10 +670,8 @@ bool Extractor::CallZapd(std::string installPath, std::string exportdir) { SetWindowPos(cmdWindow, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); #else // Show extraction in background message until linux/mac can have visual progress - SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_INFORMATION, "Extracting", - "Extraction will now begin in the background.\n\nPlease be patient for the process to " - "finish. Do not close the main program.", - nullptr); + std::thread mbThread(MessageboxWorker); + mbThread.detach(); #endif zapd_main(argc, (char**)argv.data()); @@ -684,5 +687,12 @@ bool Extractor::CallZapd(std::string installPath, std::string exportdir) { std::filesystem::current_path(curdir); std::filesystem::remove_all(tempdir); - return 0; + return false; +} + +static void MessageboxWorker() { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_INFORMATION, "Extracting", + "Extraction will now begin in the background.\n\nPlease be patient for the process to " + "finish. Do not close the main program.", + nullptr); } diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 6412c8d0b..d63422551 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -266,15 +266,17 @@ OTRGlobals::OTRGlobals() { void OTRGlobals::Initialize() { std::vector OTRFiles; - std::string mqPath = Ship::Context::LocateFileAcrossAppDirs("oot-mq.otr", appShortName); + std::string mqPath = Ship::Context::LocateFileAcrossAppDirs("oot-mq.o2r", appShortName); if (std::filesystem::exists(mqPath)) { OTRFiles.push_back(mqPath); } - std::string ootPath = Ship::Context::LocateFileAcrossAppDirs("oot.otr", appShortName); + std::string ootPath = Ship::Context::LocateFileAcrossAppDirs("oot.o2r", appShortName); if (std::filesystem::exists(ootPath)) { OTRFiles.push_back(ootPath); } - std::string sohOtrPath = Ship::Context::LocateFileAcrossAppDirs("soh.otr"); + + std::string sohOtrPath = Ship::Context::LocateFileAcrossAppDirs("soh.o2r"); + if (std::filesystem::exists(sohOtrPath)) { OTRFiles.push_back(sohOtrPath); } @@ -944,7 +946,7 @@ OTRVersion ReadPortVersionFromOTR(std::string otrPath) { OTRVersion version = {}; // Use a temporary archive instance to load the otr and read the version file - auto archive = std::make_shared(otrPath); + auto archive = std::make_shared(otrPath); if (archive->Open()) { auto t = archive->LoadFile("portVersion"); if (t != nullptr && t->IsLoaded) { @@ -962,7 +964,7 @@ OTRVersion ReadPortVersionFromOTR(std::string otrPath) { return version; } -// Check that a soh.otr exists and matches the version of soh running +// Check that a soh.o2r exists and matches the version of soh running // Otherwise show a message and exit void CheckSoHOTRVersion(std::string otrPath) { std::string msg; @@ -971,20 +973,20 @@ void CheckSoHOTRVersion(std::string otrPath) { msg = "\x1b[4;2HPlease re-extract it from the download." "\x1b[6;2HPress the Home button to exit..."; #elif defined(__WIIU__) - msg = "Please extract the soh.otr from the Ship of Harkinian download\nto your folder.\n\nPress and hold the power " + msg = "Please extract the soh.o2r from the Ship of Harkinian download\nto your folder.\n\nPress and hold the power " "button to shutdown..."; #else - msg = "Please extract the soh.otr from the Ship of Harkinian download to your folder.\n\nExiting..."; + msg = "Please extract the soh.o2r from the Ship of Harkinian download to your folder.\n\nExiting..."; #endif if (!std::filesystem::exists(otrPath)) { #if not defined(__SWITCH__) && not defined(__WIIU__) - Extractor::ShowErrorBox("soh.otr file is missing", msg.c_str()); + Extractor::ShowErrorBox("soh.o2r file is missing", msg.c_str()); exit(1); #elif defined(__SWITCH__) - Ship::Switch::PrintErrorMessageToScreen(("\x1b[2;2HYou are missing the soh.otr file." + msg).c_str()); + Ship::Switch::PrintErrorMessageToScreen(("\x1b[2;2HYou are missing the soh.o2r file." + msg).c_str()); #elif defined(__WIIU__) - OSFatal(("You are missing the soh.otr file\n\n" + msg).c_str()); + OSFatal(("You are missing the soh.o2r file\n\n" + msg).c_str()); #endif } @@ -993,12 +995,12 @@ void CheckSoHOTRVersion(std::string otrPath) { if (otrVersion.major != gBuildVersionMajor || otrVersion.minor != gBuildVersionMinor || otrVersion.patch != gBuildVersionPatch) { #if not defined(__SWITCH__) && not defined(__WIIU__) - Extractor::ShowErrorBox("soh.otr file version does not match", msg.c_str()); + Extractor::ShowErrorBox("soh.o2r file version does not match", msg.c_str()); exit(1); #elif defined(__SWITCH__) - Ship::Switch::PrintErrorMessageToScreen(("\x1b[2;2HYou have an old soh.otr file." + msg).c_str()); + Ship::Switch::PrintErrorMessageToScreen(("\x1b[2;2HYou have an old soh.o2r file." + msg).c_str()); #elif defined(__WIIU__) - OSFatal(("You have an old soh.otr file\n\n" + msg).c_str()); + OSFatal(("You have an old soh.o2r file\n\n" + msg).c_str()); #endif } } @@ -1039,10 +1041,10 @@ void DetectOTRVersion(std::string fileName, bool isMQ) { if (Extractor::ShowYesNoBox("Old OTR File Found", msgBuf) == IDYES) { std::string installPath = Ship::Context::GetAppBundlePath(); - if (!std::filesystem::exists(installPath + "/assets/extractor")) { + if (!std::filesystem::exists(installPath + "/assets")) { Extractor::ShowErrorBox( "Extractor assets not found", - "Unable to regenerate. Missing assets/extractor folder needed to generate OTR file.\n\nExiting..."); + "Unable to regenerate. Missing assets/ folder needed to generate OTR file.\n\nExiting..."); exit(1); } @@ -1156,18 +1158,18 @@ extern "C" void InitOTR() { #if not defined(__SWITCH__) && not defined(__WIIU__) CheckAndCreateModFolder(); #endif + const bool ootO2RExists = + std::filesystem::exists(Ship::Context::LocateFileAcrossAppDirs("oot-mq.o2r", appShortName)) || + std::filesystem::exists(Ship::Context::LocateFileAcrossAppDirs("oot.o2r", appShortName)); - CheckSoHOTRVersion(Ship::Context::LocateFileAcrossAppDirs("soh.otr")); - - if (!std::filesystem::exists(Ship::Context::LocateFileAcrossAppDirs("oot-mq.otr", appShortName)) && - !std::filesystem::exists(Ship::Context::LocateFileAcrossAppDirs("oot.otr", appShortName))) { + if (!ootO2RExists) { #if not defined(__SWITCH__) && not defined(__WIIU__) std::string installPath = Ship::Context::GetAppBundlePath(); - if (!std::filesystem::exists(installPath + "/assets/extractor")) { + if (!std::filesystem::exists(installPath + "/assets")) { Extractor::ShowErrorBox( "Extractor assets not found", - "No OTR files found. Missing assets/extractor folder needed to generate OTR file.\n\nExiting..."); + "No OTR files found. Missing assets/ folder needed to generate OTR file.\n\nExiting..."); exit(1); } @@ -1206,8 +1208,8 @@ extern "C" void InitOTR() { #endif } - DetectOTRVersion("oot.otr", false); - DetectOTRVersion("oot-mq.otr", true); + DetectOTRVersion("oot.o2r", false); + DetectOTRVersion("oot-mq.o2r", true); OTRGlobals::Instance->Initialize(); CustomMessageManager::Instance = new CustomMessageManager(); diff --git a/soh/soh/resource/importer/AnimationFactory.cpp b/soh/soh/resource/importer/AnimationFactory.cpp index a3a36b5e8..d6adfb66c 100644 --- a/soh/soh/resource/importer/AnimationFactory.cpp +++ b/soh/soh/resource/importer/AnimationFactory.cpp @@ -1,6 +1,8 @@ #include "soh/resource/importer/AnimationFactory.h" #include "soh/resource/type/Animation.h" +#include "ResourceManager.h" #include "spdlog/spdlog.h" +#include "Context.h" namespace SOH { std::shared_ptr @@ -80,7 +82,11 @@ ResourceFactoryBinaryAnimationV0::ReadResource(std::shared_ptr file, animation->animationData.linkAnimationHeader.common.frameCount = reader->ReadInt16(); // Read the segment pointer (always 32 bit, doesn't adjust for system pointer size) - animation->animationData.linkAnimationHeader.segment = (void*)reader->ReadUInt32(); + std::string path = reader->ReadString(); + const auto animData = std::static_pointer_cast( + Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(path.c_str())); + + animation->animationData.linkAnimationHeader.segment = animData->GetPointer(); } else if (animType == AnimationType::Legacy) { SPDLOG_DEBUG("BEYTAH ANIMATION?!"); } diff --git a/soh/src/code/z_skelanime.c b/soh/src/code/z_skelanime.c index b459796a1..a7e93e8c3 100644 --- a/soh/src/code/z_skelanime.c +++ b/soh/src/code/z_skelanime.c @@ -894,33 +894,15 @@ void AnimationContext_SetLoadFrame(PlayState* play, LinkAnimationHeader* animati if (ResourceMgr_OTRSigCheck(animation) != 0) animation = ResourceMgr_LoadAnimByName(animation); - LinkAnimationHeader* linkAnimHeader = SEGMENTED_TO_VIRTUAL(animation); Vec3s* ram = frameTable; - osCreateMesgQueue(&entry->data.load.msgQueue, &entry->data.load.msg, 1); - - char animPath[2048]; - - snprintf(animPath, sizeof(animPath), "misc/link_animetion/gPlayerAnimData_%06X", - (((uintptr_t)linkAnimHeader->segment - 0x07000000))); - - // printf("Streaming %s, seg = %08X\n", animPath, linkAnimHeader->segment); - - s16* animData = ResourceMgr_LoadPlayerAnimByName(animPath); - + s16* animData = animation->segment; + // SOH [Port] sometimes a HESS can set a negative frame value from a negative playback speed. When converted to + // a signed value this will cause a crash due to copying way much data. + if (frame < 0) { + frame = 0; + } memcpy(ram, (uintptr_t)animData + (((sizeof(Vec3s) * limbCount + 2) * frame)), sizeof(Vec3s) * limbCount + 2); - - /*u32* ramPtr = (u32*)ram; - - for (int i = 0; i < 1024; i++) - { - ramPtr[i] = i * 7; - }*/ - - // DmaMgr_SendRequest2(&entry->data.load.req, ram, - // LINK_ANIMATION_OFFSET(linkAnimHeader->segment, ((sizeof(Vec3s) * limbCount + 2) * frame)), - // sizeof(Vec3s) * limbCount + 2, 0, &entry->data.load.msgQueue, NULL, __FILE__, - //__LINE__); } } From 74560a360d82f399affc3986939fb20a0413188a Mon Sep 17 00:00:00 2001 From: Eric Hoey <121978037+A-Green-Spoon@users.noreply.github.com> Date: Mon, 23 Jun 2025 21:32:35 -0400 Subject: [PATCH 61/67] fix pot param (#5610) --- soh/soh/Enhancements/randomizer/ShufflePots.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/ShufflePots.cpp b/soh/soh/Enhancements/randomizer/ShufflePots.cpp index e37b9ee16..79fe4461b 100644 --- a/soh/soh/Enhancements/randomizer/ShufflePots.cpp +++ b/soh/soh/Enhancements/randomizer/ShufflePots.cpp @@ -541,7 +541,7 @@ void Rando::StaticData::RegisterPotLocations() { locationTable[RC_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(421, -174), "MQ Outer Lobby Pot", RHT_POT_BOTTOM_OF_THE_WELL, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT)); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(288, -1240), "MQ East Inner Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_1)); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(438, -1234), "MQ East Inner Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(443, -1114), "MQ East Inner Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_3)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(444, -1114), "MQ East Inner Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_3)); locationTable[RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-357, 957), "MQ Entrance Pot 1", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_1)); locationTable[RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(356, 959), "MQ Entrance Pot 2", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_2)); locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(187, -1449), "MQ Before Mini Boss Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1)); From c2e7adf915721aed227e2ce143cda9cd3ae69ee5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Wed, 25 Jun 2025 16:33:47 +0000 Subject: [PATCH 62/67] more tricks (#4866) * more tricks 1. big poe without epona 2. king dodongo with chu 3. morpha without hookshot 4. open underwater chests (ignore water temple usage for now because water logic is weird) 5. DC MQ stairs without stick, also bring over vanilla alternatives for stairs rename RT_DC_STAIRCASE to RT_DC_STAIRS_WITH_BOW * consistency --- .../dungeons/bottom_of_the_well.cpp | 4 ++-- .../dungeons/dodongos_cavern.cpp | 8 +++---- .../dungeons/forest_temple.cpp | 4 ++-- .../dungeons/gerudo_training_ground.cpp | 4 ++-- .../dungeons/spirit_temple.cpp | 2 +- .../location_access/dungeons/water_temple.cpp | 3 +-- .../overworld/hyrule_field.cpp | 2 +- soh/soh/Enhancements/randomizer/logic.cpp | 12 ++++++++-- soh/soh/Enhancements/randomizer/logic.h | 1 + .../Enhancements/randomizer/randomizerTypes.h | 9 ++++++-- soh/soh/Enhancements/randomizer/settings.cpp | 22 +++++++++++++++---- 11 files changed, 49 insertions(+), 22 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp index e352db5d8..001ad5d81 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp @@ -25,8 +25,8 @@ void RegionTable_Init_BottomOfTheWell() { }, { //Locations LOCATION(RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, logic->HasExplosives()), - LOCATION(RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, logic->LoweredWaterInsideBotw), - LOCATION(RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, logic->LoweredWaterInsideBotw), + LOCATION(RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, logic->LoweredWaterInsideBotw || logic->CanOpenUnderwaterChest()), + LOCATION(RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, logic->LoweredWaterInsideBotw || logic->CanOpenUnderwaterChest()), LOCATION(RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1, logic->CanBreakPots()), LOCATION(RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2, logic->CanBreakPots()), LOCATION(RC_BOTTOM_OF_THE_WELL_UNDERWATER_POT, (logic->CanBreakPots() && logic->LoweredWaterInsideBotw) || logic->CanUse(RG_BOOMERANG)), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp index bef3b58ae..d8e64f996 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp @@ -117,7 +117,7 @@ void RegionTable_Init_DodongosCavern() { areaTable[RR_DODONGOS_CAVERN_STAIRS_LOWER] = Region("Dodongos Cavern Stairs Lower", SCENE_DODONGOS_CAVERN, {}, {}, { //Exits Entrance(RR_DODONGOS_CAVERN_LOBBY, []{return true;}), - Entrance(RR_DODONGOS_CAVERN_STAIRS_UPPER, []{return logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET) || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_DC_STAIRCASE) && logic->CanUse(RG_FAIRY_BOW));}), + Entrance(RR_DODONGOS_CAVERN_STAIRS_UPPER, []{return logic->HasExplosives() || logic->HasItem(RG_GORONS_BRACELET) || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_DC_STAIRS_WITH_BOW) && logic->CanUse(RG_FAIRY_BOW));}), Entrance(RR_DODONGOS_CAVERN_COMPASS_ROOM, []{return Here(RR_DODONGOS_CAVERN_STAIRS_LOWER, []{return logic->CanBreakMudWalls() || logic->HasItem(RG_GORONS_BRACELET);});}), }); @@ -304,7 +304,7 @@ void RegionTable_Init_DodongosCavern() { areaTable[RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER] = Region("Dodongos Cavern MQ Stairs Lower", SCENE_DODONGOS_CAVERN, { //Events - //EventAccess(&logic->CanClimbDCStairs, []{return logic->HasExplosives || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_DC_STAIRCASE) && logic->CanUse(RG_FAIRY_BOW));}), + //EventAccess(&logic->CanClimbDCStairs, []{return logic->HasExplosives || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_DC_STAIRS_WITH_BOW) && logic->CanUse(RG_FAIRY_BOW));}), }, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, logic->CanBreakPots()), @@ -317,7 +317,7 @@ void RegionTable_Init_DodongosCavern() { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return true;}), //This is possible with sticks and shield, igniting a first flower by "touch" then very quickly crouch stabbing in a way that cuts the corner to light the 3rd bomb on the other side, but that's a trick - Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_UPPER, []{return Here(RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER, []{return logic->HasExplosives() || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_DC_STAIRCASE) && logic->CanUse(RG_FAIRY_BOW));});}), + Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_UPPER, []{return Here(RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER, []{return logic->HasExplosives() || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_DC_STAIRS_WITH_BOW) && logic->CanUse(RG_FAIRY_BOW));});}), Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_PAST_MUD_WALL, []{return Here(RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER, []{return logic->CanBreakMudWalls();});}), }); @@ -330,7 +330,7 @@ void RegionTable_Init_DodongosCavern() { LOCATION(RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, logic->CanUse(RG_SONG_OF_TIME) && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), }, { //Exits - Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_UPPER, []{return logic->HasItem(RG_GORONS_BRACELET) && (logic->CanUse(RG_STICKS));}), + Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_UPPER, []{return logic->HasExplosives() || (logic->HasItem(RG_GORONS_BRACELET) && (logic->CanUse(RG_STICKS) || ctx->GetTrickOption(RT_DC_MQ_STAIRS_WITH_ONLY_STRENGTH))) || logic->CanUse(RG_DINS_FIRE) || (ctx->GetTrickOption(RT_DC_STAIRS_WITH_BOW) && logic->CanUse(RG_FAIRY_BOW));}), Entrance(RR_DODONGOS_CAVERN_MQ_STAIRS_LOWER, []{return true;}), }); diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp index d3149c009..a4a558297 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/forest_temple.cpp @@ -147,7 +147,7 @@ void RegionTable_Init_ForestTemple() { areaTable[RR_FOREST_TEMPLE_SEWER] = Region("Forest Temple Sewer", SCENE_FOREST_TEMPLE, {}, { //Locations - LOCATION(RC_FOREST_TEMPLE_WELL_CHEST, HasAccessTo(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER)), + LOCATION(RC_FOREST_TEMPLE_WELL_CHEST, HasAccessTo(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER) || (logic->CanOpenUnderwaterChest() && logic->WaterTimer() >= 8)), LOCATION(RC_FOREST_TEMPLE_WELL_WEST_HEART, HasAccessTo(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8)), LOCATION(RC_FOREST_TEMPLE_WELL_EAST_HEART, HasAccessTo(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER) || (logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 8)), }, { @@ -444,7 +444,7 @@ void RegionTable_Init_ForestTemple() { EventAccess(&logic->DekuBabaNuts, []{return logic->CanGetDekuBabaNuts();}), }, { //Locations - LOCATION(RC_FOREST_TEMPLE_MQ_WELL_CHEST, logic->CanHitEyeTargets()), + LOCATION(RC_FOREST_TEMPLE_MQ_WELL_CHEST, logic->CanHitEyeTargets() || (logic->CanOpenUnderwaterChest() && logic->WaterTimer() >= 8)), LOCATION(RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)), //implies logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA) LOCATION(RC_FOREST_TEMPLE_MQ_GS_WELL, logic->CanHitEyeTargets() || (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT))), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp index fc0febf8b..d96c60626 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp @@ -173,7 +173,7 @@ void RegionTable_Init_GerudoTrainingGround() { areaTable[RR_GERUDO_TRAINING_GROUND_MQ_LEFT_SIDE] = Region("Gerudo Training Ground MQ Left Side", SCENE_GERUDO_TRAINING_GROUND, {}, {}, { //Exits Entrance(RR_GERUDO_TRAINING_GROUND_MQ_SAND_ROOM, []{return true;}), - Entrance(RR_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM, []{return Here(RR_GERUDO_TRAINING_GROUND_MQ_LEFT_SIDE, []{return logic->CanUse(RG_LONGSHOT) || ctx->GetTrickOption(RT_GTG_MQ_WIHTOUT_HOOKSHOT) || (ctx->GetTrickOption(RT_GTG_MQ_WITH_HOOKSHOT) && logic->IsAdult && logic->CanJumpslash() && logic->CanUse(RG_HOOKSHOT));});}), + Entrance(RR_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM, []{return Here(RR_GERUDO_TRAINING_GROUND_MQ_LEFT_SIDE, []{return logic->CanUse(RG_LONGSHOT) || ctx->GetTrickOption(RT_GTG_MQ_WITHOUT_HOOKSHOT) || (ctx->GetTrickOption(RT_GTG_MQ_WITH_HOOKSHOT) && logic->IsAdult && logic->CanJumpslash() && logic->CanUse(RG_HOOKSHOT));});}), }); areaTable[RR_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM] = Region("Gerudo Training Ground MQ Stalfos Room", SCENE_GERUDO_TRAINING_GROUND, { @@ -287,7 +287,7 @@ void RegionTable_Init_GerudoTrainingGround() { areaTable[RR_GERUDO_TRAINING_GROUND_MQ_UNDERWATER] = Region("Gerudo Training Ground MQ Underwater", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations //it is possible to snipe the stingers with bow or sling before dropping in, or just get really lucky, and avoid needing to take damage, but that might be trick worthy - LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, logic->HasFireSource() && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 24 && logic->TakeDamage()), + LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, logic->HasFireSource() && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 24 && logic->HasItem(RG_BRONZE_SCALE) && logic->TakeDamage()), }, { //Exits Entrance(RR_GERUDO_TRAINING_GROUND_MQ_PLATFORMS_UNLIT_TORCH, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp index 98c783e20..2755fe453 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp @@ -351,7 +351,7 @@ void RegionTable_Init_SpiritTemple() { areaTable[RR_SPIRIT_TEMPLE_MQ_STATUE_ROOM_EAST] = Region("Spirit Temple MQ Statue Room East", SCENE_SPIRIT_TEMPLE, {}, { //Locations - LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, logic->CanUse(RG_HOOKSHOT) & logic->CanUse(RG_ZELDAS_LULLABY) && (logic->CanJumpslash() || logic->CanUse(RG_HOVER_BOOTS))), + LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_ZELDAS_LULLABY) && (logic->CanJumpslash() || logic->CanUse(RG_HOVER_BOOTS))), LOCATION(RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, (ctx->GetTrickOption(RT_LENS_SPIRIT_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)) && (logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS))), }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp index 20280a6af..03cc44645 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/water_temple.cpp @@ -379,8 +379,7 @@ void RegionTable_Init_WaterTemple() { }, { //Locations LOCATION(RC_WATER_TEMPLE_MQ_MAP_CHEST, logic->MQWaterLevel(WL_HIGH) && logic->HasFireSource() && logic->CanUse(RG_HOOKSHOT)), - //easy to get at WL_HIGH with the hook-the-underwater-chest glitch - LOCATION(RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, logic->MQWaterLevel(WL_MID) && logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, (logic->MQWaterLevel(WL_MID) && logic->CanUse(RG_HOOKSHOT)) || (logic->MQWaterLevel(WL_HIGH_OR_MID) && logic->CanOpenUnderwaterChest())), LOCATION(RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1, (logic->MQWaterLevel(WL_LOW) && logic->CanBreakPots()) || (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT) && logic->WaterTimer() >= 16)), LOCATION(RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2, (logic->MQWaterLevel(WL_LOW) && logic->CanBreakPots()) || (logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT) && logic->WaterTimer() >= 16)), }, { diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp index 9ee999914..5bc3aeb26 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/hyrule_field.cpp @@ -7,7 +7,7 @@ void RegionTable_Init_HyruleField() { // clang-format off areaTable[RR_HYRULE_FIELD] = Region("Hyrule Field", SCENE_HYRULE_FIELD, { //Events - EventAccess(&logic->BigPoeKill, []{return logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_EPONA) && logic->HasBottle();}), + EventAccess(&logic->BigPoeKill, []{return logic->HasBottle() && logic->CanUse(RG_FAIRY_BOW) && (logic->CanUse(RG_EPONA) || ctx->GetTrickOption(RT_HF_BIG_POE_WITHOUT_EPONA));}), }, { //Locations LOCATION(RC_HF_OCARINA_OF_TIME_ITEM, logic->IsChild && logic->StoneCount() == 3 && logic->HasItem(RG_BRONZE_SCALE)), diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index d4c3efd1d..e02d6b30c 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -441,6 +441,10 @@ bool Logic::CanOpenOverworldDoor(RandomizerGet key) { return HasItem(key); } +bool Logic::CanOpenUnderwaterChest() { + return ctx->GetTrickOption(RT_OPEN_UNDERWATER_CHEST) && CanUse(RG_IRON_BOOTS) && CanUse(RG_HOOKSHOT); +} + uint8_t GetDifficultyValueFromString(Rando::Option& glitchOption) { return 0; } @@ -732,7 +736,8 @@ bool Logic::CanKillEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wal (CanUse(RG_NUTS) || CanUse(RG_FAIRY_SLINGSHOT) || CanUse(RG_FAIRY_BOW) || HookshotOrBoomerang()); case RE_KING_DODONGO: return HasBossSoul(RG_KING_DODONGO_SOUL) && CanJumpslash() && - (CanUse(RG_BOMB_BAG) || HasItem(RG_GORONS_BRACELET)); + (CanUse(RG_BOMB_BAG) || HasItem(RG_GORONS_BRACELET) || + (ctx->GetTrickOption(RT_DC_DODONGO_CHU) && IsAdult && CanUse(RG_BOMBCHU_5))); case RE_BARINADE: return HasBossSoul(RG_BARINADE_SOUL) && CanUse(RG_BOOMERANG) && CanJumpslashExceptHammer(); case RE_PHANTOM_GANON: @@ -741,7 +746,10 @@ bool Logic::CanKillEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wal case RE_VOLVAGIA: return HasBossSoul(RG_VOLVAGIA_SOUL) && CanUse(RG_MEGATON_HAMMER); case RE_MORPHA: - return HasBossSoul(RG_MORPHA_SOUL) && CanUse(RG_HOOKSHOT) && (CanUseSword() || CanUse(RG_MEGATON_HAMMER)); + return HasBossSoul(RG_MORPHA_SOUL) && + (CanUse(RG_HOOKSHOT) || + (ctx->GetTrickOption(RT_WATER_MORPHA_WITHOUT_HOOKSHOT) && HasItem(RG_BRONZE_SCALE))) && + (CanUseSword() || CanUse(RG_MEGATON_HAMMER)); case RE_BONGO_BONGO: return HasBossSoul(RG_BONGO_BONGO_SOUL) && (CanUse(RG_LENS_OF_TRUTH) || ctx->GetTrickOption(RT_LENS_BONGO)) && CanUseSword() && diff --git a/soh/soh/Enhancements/randomizer/logic.h b/soh/soh/Enhancements/randomizer/logic.h index 9a5c87751..acd36dcbb 100644 --- a/soh/soh/Enhancements/randomizer/logic.h +++ b/soh/soh/Enhancements/randomizer/logic.h @@ -189,6 +189,7 @@ class Logic { bool CanOpenOverworldDoor(RandomizerGet itemName); bool SmallKeys(RandomizerRegion dungeon, uint8_t requiredAmount); bool SmallKeys(RandomizerRegion dungeon, uint8_t requiredAmountGlitchless, uint8_t requiredAmountGlitched); + bool CanOpenUnderwaterChest(); bool CanDoGlitch(GlitchType glitch); bool CanEquipSwap(RandomizerGet itemName); bool CanKillEnemy(RandomizerEnemy enemy, EnemyDistance distance = ED_CLOSE, bool wallOrFloor = true, diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index c3bda412a..ef0f24e0c 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -3506,11 +3506,13 @@ typedef enum { RT_HOVER_BOOST_SIMPLE, RT_BOMBCHU_BEEHIVES, RT_BLUE_FIRE_MUD_WALLS, + RT_OPEN_UNDERWATER_CHEST, RT_KF_ADULT_GS, // -- location tricks RT_LW_BRIDGE, RT_LW_MIDO_BACKFLIP, RT_LW_GS_BEAN, RT_HC_STORMS_GS, + RT_HF_BIG_POE_WITHOUT_EPONA, RT_KAK_MAN_ON_ROOF, RT_KAK_TOWER_GS, RT_KAK_ADULT_WINDMILL_POH, @@ -3565,14 +3567,16 @@ typedef enum { RT_DEKU_MQ_LOG, RT_DC_SCARECROW_GS, RT_DC_VINES_GS, - RT_DC_STAIRCASE, + RT_DC_STAIRS_WITH_BOW, RT_DC_SLINGSHOT_SKIP, RT_DC_SCRUB_ROOM, RT_DC_JUMP, RT_DC_HAMMER_FLOOR, + RT_DC_MQ_STAIRS_WITH_ONLY_STRENGTH, RT_DC_MQ_CHILD_BOMBS, RT_DC_MQ_CHILD_EYES, RT_DC_MQ_ADULT_EYES, + RT_DC_DODONGO_CHU, RT_JABU_ALCOVE_JUMP_DIVE, RT_JABU_BOSS_HOVER, RT_JABU_NEAR_BOSS_RANGED, @@ -3628,6 +3632,7 @@ typedef enum { RT_WATER_CHILD_DRAGON, RT_WATER_MQ_CENTRAL_PILLAR, RT_WATER_MQ_LOCKED_GS, + RT_WATER_MORPHA_WITHOUT_HOOKSHOT, RT_LENS_SHADOW, RT_LENS_SHADOW_PLATFORM, RT_LENS_BONGO, @@ -3666,7 +3671,7 @@ typedef enum { RT_GTG_FAKE_WALL, RT_LENS_GTG_MQ, RT_GTG_MQ_WITH_HOOKSHOT, - RT_GTG_MQ_WIHTOUT_HOOKSHOT, + RT_GTG_MQ_WITHOUT_HOOKSHOT, RT_LENS_GANON, RT_GANON_SPIRIT_TRIAL_HOOKSHOT, RT_LENS_GANON_MQ, diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index c88d70db1..32b2d77a9 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -403,6 +403,9 @@ void Settings::CreateOptions() { "apply to MQ Dead Hand bomb flowers.\nUsing blue fire on bombflower to stop rolling goron also requires " "\"Stop Link the Goron with Din's Fire\".\nUsing blue fire arrows to break floor in King Dodongo's " "chamber also requires \"Dodongo\'s Cavern Smash the Boss Lobby Floor\"."); + OPT_TRICK(RT_OPEN_UNDERWATER_CHEST, RCQUEST_BOTH, RA_NONE, { Tricks::Tag::NOVICE, Tricks::Tag::GLITCH }, + "Open Underwater Chests", + "Underwater chests can be opened by wearing iron boots and hookshotting the chest."); OPT_TRICK(RT_KF_ADULT_GS, RCQUEST_BOTH, RA_KOKIRI_FOREST, { Tricks::Tag::NOVICE }, "Adult Kokiri Forest GS with Hover Boots", "Can be obtained without Hookshot by using the Hover Boots off of one of the roots."); @@ -423,6 +426,9 @@ void Settings::CreateOptions() { "Hyrule Castle Storms Grotto GS with Just Boomerang", "With precise throws, the Boomerang alone can kill the Skulltula and collect the token, without first " "needing to blow up the wall."); + OPT_TRICK(RT_HF_BIG_POE_WITHOUT_EPONA, RCQUEST_BOTH, RA_HYRULE_FIELD, { Tricks::Tag::NOVICE }, + "Big Poe without Epona", + "Big Poes have a chance of appearing without Epona, you can shoot them quickly with only bow."); OPT_TRICK(RT_KAK_MAN_ON_ROOF, RCQUEST_BOTH, RA_KAKARIKO_VILLAGE, { Tricks::Tag::NOVICE }, "Man on Roof without Hookshot", "Can be reached by side-hopping off the watchtower as either age, or by jumping onto the potion shop's " @@ -555,7 +561,7 @@ void Settings::CreateOptions() { "A precise jump slash can kill the Skulltula and recoil back onto the top of the frozen waterfall. To " "kill it, the logic normally guarantees one of Hookshot, Bow, or Magic."); OPT_TRICK(RT_ZF_GREAT_FAIRY_WITHOUT_EXPLOSIVES, RCQUEST_BOTH, RA_ZORAS_FOUNTAIN, { Tricks::Tag::NOVICE }, - "Zora\'s Fountain Great Fairy Without Explosives", + "Zora\'s Fountain Great Fairy without Explosives", "It's possible to use silver gauntlets to pick up the silver rock and hammer to break the rock below it, " "allowing you to ledge grab the edge of the hole and get past the breakable wall (hammer can't break the " "wall itself)."); @@ -640,8 +646,8 @@ void Settings::CreateOptions() { "Dodongo\'s Cavern Vines GS from Below with Longshot", "The vines upon which this Skulltula rests are one-sided collision. You can use the Longshot to get it " "from below, by shooting it through the vines, bypassing the need to lower the staircase."); - OPT_TRICK(RT_DC_STAIRCASE, RCQUEST_VANILLA, RA_DODONGOS_CAVERN, { Tricks::Tag::NOVICE }, - "Dodongo\'s Cavern Staircase with Bow", + OPT_TRICK(RT_DC_STAIRS_WITH_BOW, RCQUEST_VANILLA, RA_DODONGOS_CAVERN, { Tricks::Tag::NOVICE }, + "Dodongo\'s Cavern Stairs with Bow", "The Bow can be used to knock down the stairs with two well-timed shots."); OPT_TRICK(RT_DC_SLINGSHOT_SKIP, RCQUEST_VANILLA, RA_DODONGOS_CAVERN, { Tricks::Tag::EXPERT }, "Dodongo\'s Cavern Child Slingshot Skips", @@ -660,6 +666,12 @@ void Settings::CreateOptions() { "The bombable floor before King Dodongo can be destroyed with Hammer if hit in the very center. This is " "only relevant with Shuffle Boss Entrances or if Dodongo's Cavern is MQ and either variant of " "\"Dodongo's Cavern MQ Light the Eyes with Strength\" is on."); + OPT_TRICK(RT_DC_DODONGO_CHU, RCQUEST_BOTH, RA_DODONGOS_CAVERN, { Tricks::Tag::ADVANCED }, + "Dodongo\'s Cavern Dodongo without Bombchus", + "With precise timing you can feed King Dodongo a bombchu during a backflip"); + OPT_TRICK(RT_DC_MQ_STAIRS_WITH_ONLY_STRENGTH, RCQUEST_MQ, RA_DODONGOS_CAVERN, { Tricks::Tag::NOVICE }, + "Dodongo\'s Cavern MQ Stairs With Only Strength", + "Taking a bomb from the back can be used to lower stairs without using stick to drop bomb from wall."); OPT_TRICK(RT_DC_MQ_CHILD_BOMBS, RCQUEST_MQ, RA_DODONGOS_CAVERN, { Tricks::Tag::ADVANCED }, "Dodongo\'s Cavern MQ Early Bomb Bag Area as Child", "With a precise jump slash from above, you can reach the Bomb Bag area as only child without needing a " @@ -938,6 +950,8 @@ void Settings::CreateOptions() { "Water Temple MQ North Basement GS without Small Key", "There is an invisible Hookshot target that can be used to get over the gate that blocks you from going to " "this Skulltula early, skipping a small key as well as needing Hovers or Scarecrow to reach the locked door."); + OPT_TRICK(RT_WATER_MORPHA_WITHOUT_HOOKSHOT, RCQUEST_BOTH, RA_WATER_TEMPLE, { Tricks::Tag::EXTREME }, + "Water Temple Morpha without Hookshot", "It is possible to slash at Morpha without hookshot."); OPT_TRICK(RT_LENS_SHADOW, RCQUEST_VANILLA, RA_SHADOW_TEMPLE, { Tricks::Tag::NOVICE }, "Shadow Temple Stationary Objects without Lens of Truth", "Removes the requirements for the Lens of Truth in Shadow Temple for most areas in the dungeon except " @@ -1100,7 +1114,7 @@ void Settings::CreateOptions() { "Gerudo Training Ground MQ Left Side Silver Rupees with Hookshot", "The highest Silver Rupee can be obtained by hookshooting the target and then immediately jump slashing " "toward the Rupee."); - OPT_TRICK(RT_GTG_MQ_WIHTOUT_HOOKSHOT, RCQUEST_MQ, RA_GERUDO_TRAINING_GROUND, { Tricks::Tag::INTERMEDIATE }, + OPT_TRICK(RT_GTG_MQ_WITHOUT_HOOKSHOT, RCQUEST_MQ, RA_GERUDO_TRAINING_GROUND, { Tricks::Tag::INTERMEDIATE }, "Gerudo Training Ground MQ Left Side Silver Rupees without Hookshot", "After collecting the rest of the Silver Rupees in the room, you can reach the final Silver Rupee on the " "ceiling by being pulled up into it after getting grabbed by the Wallmaster. The Wallmaster will not " From 63bd4ed56588685c96cf1c1d872fa8d465fad727 Mon Sep 17 00:00:00 2001 From: Eric Hoey <121978037+A-Green-Spoon@users.noreply.github.com> Date: Thu, 26 Jun 2025 00:42:27 -0400 Subject: [PATCH 63/67] cast to signed 16-bit to stop truncation (#5617) --- soh/soh/Enhancements/randomizer/hook_handlers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index a6bbae638..ad0c9823d 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -2122,7 +2122,7 @@ void RandomizerOnGameFrameUpdateHandler() { } if (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_MONEY)) { - gSaveContext.rupees = static_cast(CUR_CAPACITY(UPG_WALLET)); + gSaveContext.rupees = static_cast(CUR_CAPACITY(UPG_WALLET)); } if (!Flags_GetRandomizerInf(RAND_INF_HAS_WALLET)) { From 1d24edaa9283ffe0a90f110f5de541abe73b1002 Mon Sep 17 00:00:00 2001 From: Pepper0ni <93387759+Pepper0ni@users.noreply.github.com> Date: Thu, 26 Jun 2025 05:54:48 +0100 Subject: [PATCH 64/67] Split Gerudo Fortress and fix break room logic errors (#5338) * Separate HBA range * Separate 4 rooftop regions * Rest of rooftops * Small cleanup * Whoops * Create `thieves_hideout.cpp` & move `gerudo_fortress.cpp` * Ground and some inside * More outside cleanup and more inside * Kitchen * Final tweaks * Use `TH_` prefix for Thieves' Hideout locations * Add clarifying images (+ `.xcf` source) * Thieves' Hideout is overworld * Fix `RC_GF_GS_TOP_FLOOR` & blue -> violet entrance * Address review * Update gerudo_fortress.cpp * Address review * Split "CarpenterRescue" * Rename events * Update logic.cpp * Move from function to event * Rename most of the regions * Address review * Add new conections * update logic, get it working * apply clang format * undo clang format in logic files * final reordering * remove additions to .gitIgnore * Fix some jump trick logic * clean up ShufflePots * fix submodules * update for review and talk to jail and always gate PRs * change thieves hideout to scene handling * final fixes and update enum names and hint text --------- Co-authored-by: Pepe20129 <72659707+Pepe20129@users.noreply.github.com> --- .../hint_list/hint_list_exclude_overworld.cpp | 72 +- .../randomizer/3drando/item_pool.cpp | 34 +- .../Enhancements/randomizer/ShuffleCrates.cpp | 512 ++++---- .../randomizer/ShuffleFairies.cpp | 2 +- .../Enhancements/randomizer/ShufflePots.cpp | 1088 ++++++++--------- soh/soh/Enhancements/randomizer/entrance.cpp | 12 +- .../Enhancements/randomizer/hook_handlers.cpp | 2 +- .../randomizer/location_access.cpp | 8 +- .../Enhancements/randomizer/location_access.h | 1 + .../dungeons/gerudo_training_ground.cpp | 2 +- .../location_access/gerudo_fortress.cpp | 120 -- .../overworld/gerudo_fortress.cpp | 249 ++++ .../overworld/gerudo_valley.cpp | 6 +- .../overworld/thieves_hideout.cpp | 142 +++ .../Enhancements/randomizer/location_list.cpp | 18 +- soh/soh/Enhancements/randomizer/logic.cpp | 28 +- soh/soh/Enhancements/randomizer/logic.h | 7 +- .../Enhancements/randomizer/randomizer.cpp | 164 +-- .../Enhancements/randomizer/randomizerTypes.h | 172 ++- .../randomizer/randomizer_check_objects.cpp | 10 +- .../randomizer/randomizer_check_tracker.cpp | 8 +- .../Enhancements/randomizer/randomizer_inf.h | 102 +- soh/soh/Enhancements/randomizer/settings.cpp | 12 +- 23 files changed, 1562 insertions(+), 1209 deletions(-) delete mode 100644 soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp create mode 100644 soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_fortress.cpp create mode 100644 soh/soh/Enhancements/randomizer/location_access/overworld/thieves_hideout.cpp diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp index efe72b5cf..a8afd7cb2 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_overworld.cpp @@ -512,10 +512,10 @@ void StaticData::HintTable_Init_Exclude_Overworld() { /*french*/ "Selon moi, le #trΓ©sor au fond du lac# est #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, el #tesoro hundido del lago# se trata de #[[1]]#. - hintTextTable[RHT_GF_GERUDO_MEMBERSHIP_CARD] = HintText(CustomMessage("They say that #rescuing captured carpenters# is rewarded with #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Retten gefangener Zimmerleute# #[[1]]# einbrΓ€chte.", - /*french*/ "Selon moi, #secourir les charpentiers capturΓ©s# assure #[[1]]#.", {QM_RED, QM_GREEN})); - // /*spanish*/ SegΓΊn dicen, #rescatar los apresados carpinteros# se premia con #[[1]]#. + hintTextTable[RHT_TH_FREED_CARPENTERS] = HintText(CustomMessage("They say that #rescuing captured carpenters# is rewarded with #[[1]]#.", + /*german*/ "Man erzΓ€hlt sich, daß das #Retten gefangener Zimmerleute# #[[1]]# einbrΓ€chte.", + /*french*/ "Selon moi, #secourir les charpentiers capturΓ©s# assure #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ SegΓΊn dicen, #rescatar los apresados carpinteros# se premia con #[[1]]#. hintTextTable[RHT_WASTELAND_BOMBCHU_SALESMAN] = HintText(CustomMessage("They say that a #carpet guru# sells #[[1]]#.", /*german*/ "Man erzΓ€hlt sich, daß ein #fliegender Einsiedler# #[[1]]# verkaufe.", @@ -622,25 +622,25 @@ void StaticData::HintTable_Init_Exclude_Overworld() { /*french*/ "Selon moi, #recouvert de cendres volcaniques# gΓt #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ SegΓΊn dicen, bajo la #ceniza volcΓ‘nica# yace #[[1]]#. - hintTextTable[RHT_GF_NORTH_F1_CARPENTER] = HintText(CustomMessage("They say that #defeating Gerudo guards# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Besiegen der Gerudo-Wachen# #[[1]]# enthΓΌllen wΓΌrde.", - /*french*/ "Selon moi, les #geΓ΄liers Gerudo# dΓ©tiennent #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_TH_1_TORCH_CARPENTER] = HintText(CustomMessage("They say that #defeating the Gerudo in a room with 1 torch# reveals #[[1]]#.", + /*german*/ "Man erzΓ€hlt sich, daß das #Besiegen der Gerudo-Wachen# #[[1]]# enthΓΌllen wΓΌrde.",//TODO_TRANSLATE update to match + /*french*/ "Selon moi, les #geΓ΄liers Gerudo# dΓ©tiennent #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE update to match // /*spanish*/ SegΓΊn dicen, #derrotar a las guardas Gerudo# revela #[[1]]#. - hintTextTable[RHT_GF_NORTH_F2_CARPENTER] = HintText(CustomMessage("They say that #defeating Gerudo guards# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Besiegen der Gerudo-Wachen# #[[1]]# enthΓΌllen wΓΌrde.", - /*french*/ "Selon moi, les #geΓ΄liers Gerudo# dΓ©tiennent #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_TH_DEAD_END_CARPENTER] = HintText(CustomMessage("They say that #defeating the Gerudo in a Dead End# reveals #[[1]]#.", + /*german*/ "Man erzΓ€hlt sich, daß das #Besiegen der Gerudo-Wachen# #[[1]]# enthΓΌllen wΓΌrde.",//TODO_TRANSLATE update to match + /*french*/ "Selon moi, les #geΓ΄liers Gerudo# dΓ©tiennent #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE update to match // /*spanish*/ SegΓΊn dicen, #derrotar a las guardas Gerudo# revela #[[1]]#. - hintTextTable[RHT_GF_SOUTH_F1_CARPENTER] = HintText(CustomMessage("They say that #defeating Gerudo guards# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Besiegen der Gerudo-Wachen# #[[1]]# enthΓΌllen wΓΌrde.", - /*french*/ "Selon moi, les #geΓ΄liers Gerudo# dΓ©tiennent #[[1]]#.", {QM_RED, QM_GREEN})); - // /*spanish*/ SegΓΊn dicen, #derrotar a las guardas Gerudo# revela #[[1]]#. + hintTextTable[RHT_TH_DOUBLE_CELL_CARPENTER] = HintText(CustomMessage("They say that #defeating the Gerudo in a large jail# reveals #[[1]]#.", + /*german*/ "Man erzΓ€hlt sich, daß das #Besiegen der Gerudo-Wachen# #[[1]]# enthΓΌllen wΓΌrde.",//TODO_TRANSLATE update to match + /*french*/ "Selon moi, les #geΓ΄liers Gerudo# dΓ©tiennent #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE update to match + // /*spanish*/ SegΓΊn dicen, #derrotar a las guardas Gerudo# revela #[[1]]#. - hintTextTable[RHT_GF_SOUTH_F2_CARPENTER] = HintText(CustomMessage("They say that #defeating Gerudo guards# reveals #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß das #Besiegen der Gerudo-Wachen# #[[1]]# enthΓΌllen wΓΌrde.", - /*french*/ "Selon moi, les #geΓ΄liers Gerudo# dΓ©tiennent #[[1]]#.", {QM_RED, QM_GREEN})); - // /*spanish*/ SegΓΊn dicen, #derrotar a las guardas Gerudo# revela #[[1]]#. + hintTextTable[RHT_TH_STEEP_SLOPE_CARPENTER] = HintText(CustomMessage("They say that #defeating the Gerudo between steep slopes# reveals #[[1]]#.", + /*german*/ "Man erzΓ€hlt sich, daß das #Besiegen der Gerudo-Wachen# #[[1]]# enthΓΌllen wΓΌrde.",//TODO_TRANSLATE update to match + /*french*/ "Selon moi, les #geΓ΄liers Gerudo# dΓ©tiennent #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE update to match + // /*spanish*/ SegΓΊn dicen, #derrotar a las guardas Gerudo# revela #[[1]]#. hintTextTable[RHT_HF_GS_NEAR_KAK_GROTTO] = HintText(CustomMessage("They say that a #spider-guarded spider in a hole# hoards #[[1]]#.", /*german*/ "Man erzΓ€hlt sich, daß eine #spinnenbewachte Spinne in einem Erdloch #[[1]]# horte.", @@ -1496,9 +1496,37 @@ void StaticData::HintTable_Init_Exclude_Overworld() { /*german*/ "Man erzΓ€hlt sich, daß ein #Krug im Kokiri-Wald# #[[1]]# enthielte.", /*french*/ "Selon moi, une #jarre dans la FΓ΄ret Kokiri# contient #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_POT_GERUDO_FORTRESS] = HintText(CustomMessage("They say that a #pot in Gerudo Fortress# contains #[[1]]#.", - /*german*/ "Man erzΓ€hlt sich, daß ein #Krug in der Gerudo-Festung# #[[1]]# enthielte.", - /*french*/ "Selon moi, une #jarre dans la Forteresse Gerudo# contient #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_TH_BREAK_ROOM_FRONT_POT] = HintText(CustomMessage("They say that the #front pot watched by resting thieves# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_BREAK_ROOM_BACK_POT] = HintText(CustomMessage("They say that the #back pot watched by resting thieves# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_KITCHEN_POT_1] = HintText(CustomMessage("They say that a #Hideout's Kitchen pot# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_KITCHEN_POT_2] = HintText(CustomMessage("They say that a #Hideout's Kitchen pot# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_1_TORCH_CELL_RIGHT_POT] = HintText(CustomMessage("They say that the #thieve's right pot, watched by a single torch# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_1_TORCH_CELL_MID_POT] = HintText(CustomMessage("They say that the #thieve's middle pot, watched by a single torch# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_1_TORCH_CELL_LEFT_POT] = HintText(CustomMessage("They say that the #thieve's left pot, watched by a single torch# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_STEEP_SLOPE_RIGHT_POT] = HintText(CustomMessage("They say that a #Gerudo pot, on the right of a sloped corner# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_STEEP_SLOPE_LEFT_POT] = HintText(CustomMessage("They say that a #Gerudo pot, on the left of a sloped corner# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_NEAR_DOUBLE_CELL_RIGHT_POT] = HintText(CustomMessage("They say that the #right pot near 2 jail cells# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_NEAR_DOUBLE_CELL_MID_POT] = HintText(CustomMessage("They say that the #mid pot near 2 jail cells# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_NEAR_DOUBLE_CELL_LEFT_POT] = HintText(CustomMessage("They say that the #left pot near 2 jail cells# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_RIGHTMOST_JAILED_POT] = HintText(CustomMessage("They say that the #rightmost jailed pot# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_RIGHT_MIDDLE_JAILED_POT] = HintText(CustomMessage("They say that the #right middle jailed pot# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_LEFT_MIDDLE_JAILED_POT] = HintText(CustomMessage("They say that the #left middle jailed pot# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE + + hintTextTable[RHT_TH_LEFTMOST_JAILED_POT] = HintText(CustomMessage("They say that the #leftmost jailed pot# contains #[[1]]#.", {QM_RED, QM_GREEN}));//TODO_TRANSLATE hintTextTable[RHT_POT_WASTELAND] = HintText(CustomMessage("They say that a #pot in Haunted Wasteland# contains #[[1]]#.", /*german*/ "Man erzΓ€hlt sich, daß ein #Krug in der GespensterwΓΌste# #[[1]]# enthielte.", @@ -1961,7 +1989,7 @@ void StaticData::HintTable_Init_Exclude_Overworld() { /*german*/ "Man erzΓ€hlt sich, daß das #Machen von Regen in den verlorenen WΓ€ldern# #[[1]]# enthΓΌlle.", /*french*/ "Selon moi, #jouer une mΓ©lodie orageuse dans les Bois Perdus# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); - hintTextTable[RHT_GF_KITCHEN_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun in a guarded kitchen# exposes #[[1]]#.", + hintTextTable[RHT_TH_KITCHEN_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun in a guarded kitchen# exposes #[[1]]#.", /*german*/ "Man erzΓ€hlt sich, daß das #Anrufen der Sonne in einer bewachten KΓΌche# #[[1]]# freilege.", /*french*/ "Selon moi, #appeler le soleil dans une cuisine gardΓ©e# rΓ©vΓ¨le #[[1]]#.", {QM_RED, QM_GREEN})); diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index fbe800662..c97ae35ce 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -811,16 +811,16 @@ void GenerateItemPool() { // Gerudo Fortress if (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE)) { - ctx->PlaceItemInLocation(RC_GF_NORTH_F1_CARPENTER, RG_RECOVERY_HEART, false, true); - ctx->PlaceItemInLocation(RC_GF_NORTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); - ctx->PlaceItemInLocation(RC_GF_SOUTH_F1_CARPENTER, RG_RECOVERY_HEART, false, true); - ctx->PlaceItemInLocation(RC_GF_SOUTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_TH_1_TORCH_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_TH_DEAD_END_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_TH_DOUBLE_CELL_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_TH_STEEP_SLOPE_CARPENTER, RG_RECOVERY_HEART, false, true); } else if (ctx->GetOption(RSK_GERUDO_KEYS).IsNot(RO_GERUDO_KEYS_VANILLA)) { if (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FAST)) { AddItemToMainPool(RG_GERUDO_FORTRESS_SMALL_KEY); - ctx->PlaceItemInLocation(RC_GF_NORTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); - ctx->PlaceItemInLocation(RC_GF_SOUTH_F1_CARPENTER, RG_RECOVERY_HEART, false, true); - ctx->PlaceItemInLocation(RC_GF_SOUTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_TH_DEAD_END_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_TH_DOUBLE_CELL_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_TH_STEEP_SLOPE_CARPENTER, RG_RECOVERY_HEART, false, true); } else { // Only add key ring if 4 Fortress keys necessary if (ctx->GetOption(RSK_KEYRINGS_GERUDO_FORTRESS) && ctx->GetOption(RSK_KEYRINGS)) { @@ -843,15 +843,15 @@ void GenerateItemPool() { } } else { if (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FAST)) { - ctx->PlaceItemInLocation(RC_GF_NORTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); - ctx->PlaceItemInLocation(RC_GF_NORTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); - ctx->PlaceItemInLocation(RC_GF_SOUTH_F1_CARPENTER, RG_RECOVERY_HEART, false, true); - ctx->PlaceItemInLocation(RC_GF_SOUTH_F2_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_TH_1_TORCH_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); + ctx->PlaceItemInLocation(RC_TH_DEAD_END_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_TH_DOUBLE_CELL_CARPENTER, RG_RECOVERY_HEART, false, true); + ctx->PlaceItemInLocation(RC_TH_STEEP_SLOPE_CARPENTER, RG_RECOVERY_HEART, false, true); } else { - ctx->PlaceItemInLocation(RC_GF_NORTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); - ctx->PlaceItemInLocation(RC_GF_NORTH_F2_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); - ctx->PlaceItemInLocation(RC_GF_SOUTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); - ctx->PlaceItemInLocation(RC_GF_SOUTH_F2_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); + ctx->PlaceItemInLocation(RC_TH_1_TORCH_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); + ctx->PlaceItemInLocation(RC_TH_DEAD_END_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); + ctx->PlaceItemInLocation(RC_TH_DOUBLE_CELL_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); + ctx->PlaceItemInLocation(RC_TH_STEEP_SLOPE_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, false, true); } } @@ -862,9 +862,9 @@ void GenerateItemPool() { ctx->possibleIceTrapModels.push_back(RG_GERUDO_MEMBERSHIP_CARD); } else if (ctx->GetOption(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD)) { AddItemToPool(PendingJunkPool, RG_GERUDO_MEMBERSHIP_CARD); - ctx->PlaceItemInLocation(RC_GF_GERUDO_MEMBERSHIP_CARD, RG_ICE_TRAP, false, true); + ctx->PlaceItemInLocation(RC_TH_FREED_CARPENTERS, RG_ICE_TRAP, false, true); } else { - ctx->PlaceItemInLocation(RC_GF_GERUDO_MEMBERSHIP_CARD, RG_GERUDO_MEMBERSHIP_CARD, false, true); + ctx->PlaceItemInLocation(RC_TH_FREED_CARPENTERS, RG_GERUDO_MEMBERSHIP_CARD, false, true); } // Keys diff --git a/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp b/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp index 4c6ab0aa5..c6563688b 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp @@ -298,268 +298,268 @@ void Rando::StaticData::RegisterCrateLocations() { registered = true; // clang-format off // Overworld Crates - // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check - locationTable[RC_GV_FREESTANDING_POH_CRATE] = Location::Crate(RC_GV_FREESTANDING_POH_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-350, 1480), "Freestanding PoH Crate", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_FREESTANDING_POH_CRATE)); - locationTable[RC_GV_NEAR_COW_CRATE] = Location::Crate(RC_GV_NEAR_COW_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-449, 123), "Near Cow Crate", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_NEAR_COW_CRATE)); - locationTable[RC_GF_ABOVE_JAIL_CRATE] = Location::Crate(RC_GF_ABOVE_JAIL_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(51, -2997), "Above Jail Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_PURPLE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ABOVE_JAIL_CRATE)); - locationTable[RC_GF_OUTSIDE_CENTER_CRATE_1] = Location::Crate(RC_GF_OUTSIDE_CENTER_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(315, -1534), "Outside Center Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSIDE_CENTER_CRATE_1)); - locationTable[RC_GF_OUTSIDE_CENTER_CRATE_2] = Location::Crate(RC_GF_OUTSIDE_CENTER_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(315, -1594), "Outside Center Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSIDE_CENTER_CRATE_2)); - locationTable[RC_GF_OUTSIDE_CENTER_CRATE_3] = Location::Crate(RC_GF_OUTSIDE_CENTER_CRATE_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(310, -1782), "Outside Center Crate 3", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSIDE_CENTER_CRATE_3)); - locationTable[RC_GF_OUTSIDE_CENTER_CRATE_4] = Location::Crate(RC_GF_OUTSIDE_CENTER_CRATE_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(310, -1842), "Outside Center Crate 4", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSIDE_CENTER_CRATE_4)); - locationTable[RC_GF_OUTSIDE_LEFT_CRATE_1] = Location::Crate(RC_GF_OUTSIDE_LEFT_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(-60, -2210), "Outside Left Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSIDE_LEFT_CRATE_1)); - locationTable[RC_GF_OUTSIDE_LEFT_CRATE_2] = Location::Crate(RC_GF_OUTSIDE_LEFT_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(-120, -2210), "Outside Left Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSIDE_LEFT_CRATE_2)); - locationTable[RC_GF_ARCHERY_RANGE_CRATE_2] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -1780), "Archery Range Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_2)); - locationTable[RC_GF_ARCHERY_RANGE_CRATE_3] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2020), "Archery Range Crate 3", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_3)); - locationTable[RC_GF_ARCHERY_RANGE_CRATE_4] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2260), "Archery Range Crate 4", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_4)); - locationTable[RC_GF_ARCHERY_RANGE_CRATE_1] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -1540), "Archery Range Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_1)); - locationTable[RC_GF_ARCHERY_RANGE_CRATE_5] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_5, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2500), "Archery Range Crate 5", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_5)); - locationTable[RC_GF_ARCHERY_RANGE_CRATE_6] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_6, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2740), "Archery Range Crate 6", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_6)); - locationTable[RC_GF_ARCHERY_RANGE_CRATE_7] = Location::Crate(RC_GF_ARCHERY_RANGE_CRATE_7, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2980), "Archery Range Crate 7", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RANGE_CRATE_7)); - locationTable[RC_GF_ARCHERY_START_CRATE_1] = Location::Crate(RC_GF_ARCHERY_START_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3727, -243), "Near Archery Start Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_START_CRATE_1)); - locationTable[RC_GF_ARCHERY_START_CRATE_2] = Location::Crate(RC_GF_ARCHERY_START_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3667, -243), "Near Archery Start Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_START_CRATE_2)); - locationTable[RC_GF_ARCHERY_LEFT_END_CRATE_1] = Location::Crate(RC_GF_ARCHERY_LEFT_END_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3446, -4875), "Archery Left End Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_LEFT_END_CRATE_1)); - locationTable[RC_GF_ARCHERY_LEFT_END_CRATE_2] = Location::Crate(RC_GF_ARCHERY_LEFT_END_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3303, -5018), "Archery Left End Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_LEFT_END_CRATE_2)); - locationTable[RC_GF_ARCHERY_RIGHT_END_CRATE_1] = Location::Crate(RC_GF_ARCHERY_RIGHT_END_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3406, 414), "Archery Right End Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_1)); - locationTable[RC_GF_ARCHERY_RIGHT_END_CRATE_2] = Location::Crate(RC_GF_ARCHERY_RIGHT_END_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3330, 406), "Archery Right End Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_2)); - locationTable[RC_GF_KITCHEN_CRATE_1] = Location::Crate(RC_GF_KITCHEN_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1144, -1251), "Kitchen Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_CRATE_1)); - locationTable[RC_GF_KITCHEN_CRATE_2] = Location::Crate(RC_GF_KITCHEN_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1144, -1191), "Kitchen Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_CRATE_2)); - locationTable[RC_GF_KITCHEN_CRATE_3] = Location::Crate(RC_GF_KITCHEN_CRATE_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1256, -847), "Kitchen Crate 3", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_CRATE_3)); - locationTable[RC_GF_KITCHEN_CRATE_4] = Location::Crate(RC_GF_KITCHEN_CRATE_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1256, -787), "Kitchen Crate 4", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_CRATE_4)); - locationTable[RC_GF_KITCHEN_CRATE_5] = Location::Crate(RC_GF_KITCHEN_CRATE_5, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1610, -624), "Kitchen Crate 5", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_CRATE_5)); - locationTable[RC_GF_BREAK_ROOM_CRATE_1] = Location::Crate(RC_GF_BREAK_ROOM_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1260, -3155), "Break Room Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_CRATE_1)); - locationTable[RC_GF_BREAK_ROOM_CRATE_4] = Location::Crate(RC_GF_BREAK_ROOM_CRATE_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1600, -3550), "Break Room Crate 4", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_CRATE_4)); - locationTable[RC_GF_BREAK_ROOM_CRATE_2] = Location::Crate(RC_GF_BREAK_ROOM_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1360, -3325), "Break Room Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_CRATE_2)); - locationTable[RC_GF_BREAK_ROOM_CRATE_3] = Location::Crate(RC_GF_BREAK_ROOM_CRATE_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1600, -3502), "Break Room Crate 3", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_CRATE_3)); - locationTable[RC_GF_NORTH_F1_CARPENTER_CRATE] = Location::Crate(RC_GF_NORTH_F1_CARPENTER_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-510, -2213), "North F1 Carpenter Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F1_CARPENTER_CRATE)); - locationTable[RC_GF_NORTH_F3_CARPENTER_CRATE] = Location::Crate(RC_GF_NORTH_F3_CARPENTER_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1090, -2210), "North F3 Carpenter Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F3_CARPENTER_CRATE)); - locationTable[RC_GF_SOUTH_F2_CARPENTER_CRATE_1] = Location::Crate(RC_GF_SOUTH_F2_CARPENTER_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-49, 11), "South F2 Carpenter Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_1)); - locationTable[RC_GF_SOUTH_F2_CARPENTER_CRATE_2] = Location::Crate(RC_GF_SOUTH_F2_CARPENTER_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(11, 11), "South F2 Carpenter Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_2)); - locationTable[RC_HW_BEFORE_QUICKSAND_CRATE] = Location::Crate(RC_HW_BEFORE_QUICKSAND_CRATE, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(3832, 2840), "Before Quicksand Crate", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_BEFORE_QUICKSAND_CRATE)); - locationTable[RC_HW_AFTER_QUICKSAND_CRATE_1] = Location::Crate(RC_HW_AFTER_QUICKSAND_CRATE_1, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(3235, 2313), "After Quicksand Crate 1", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_AFTER_QUICKSAND_CRATE_1)); - locationTable[RC_HW_AFTER_QUICKSAND_CRATE_2] = Location::Crate(RC_HW_AFTER_QUICKSAND_CRATE_2, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(3125, 2459), "After Quicksand Crate 2", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_AFTER_QUICKSAND_CRATE_2)); - locationTable[RC_HW_AFTER_QUICKSAND_CRATE_3] = Location::Crate(RC_HW_AFTER_QUICKSAND_CRATE_3, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(3026, 2631), "After Quicksand Crate 3", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_AFTER_QUICKSAND_CRATE_3)); - locationTable[RC_HW_NEAR_COLOSSUS_CRATE] = Location::Crate(RC_HW_NEAR_COLOSSUS_CRATE, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(-1531, -976), "Near Colossus Crate", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_NEAR_COLOSSUS_CRATE)); - locationTable[RC_MK_NEAR_BAZAAR_CRATE_1] = Location::Crate(RC_MK_NEAR_BAZAAR_CRATE_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(490, 338), "Near Bazaar Crate 1", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_NEAR_BAZAAR_CRATE_1)); - locationTable[RC_MK_NEAR_BAZAAR_CRATE_2] = Location::Crate(RC_MK_NEAR_BAZAAR_CRATE_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(490, 132), "Near Bazaar Crate 2", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_NEAR_BAZAAR_CRATE_2)); - locationTable[RC_MK_SHOOTING_GALLERY_CRATE_1] = Location::Crate(RC_MK_SHOOTING_GALLERY_CRATE_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-150, -576), "Shooting Gallery Crate 1", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_SHOOTING_GALLERY_CRATE_1)); - locationTable[RC_MK_SHOOTING_GALLERY_CRATE_2] = Location::Crate(RC_MK_SHOOTING_GALLERY_CRATE_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-90, -576), "Shooting Gallery Crate 2", RHT_CRATE_MARKET, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_SHOOTING_GALLERY_CRATE_2)); - locationTable[RC_MK_LOST_DOG_HOUSE_CRATE] = Location::Crate(RC_MK_LOST_DOG_HOUSE_CRATE, RCQUEST_BOTH, RCAREA_MARKET, SCENE_DOG_LADY_HOUSE, TWO_ACTOR_PARAMS(176, 170), "Lost Dog House Crate", RHT_CRATE_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_LOST_DOG_HOUSE_CRATE)); - locationTable[RC_MK_GUARD_HOUSE_CRATE_1] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(76, -210), "Guard House Crate 1", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_1)); - locationTable[RC_MK_GUARD_HOUSE_CRATE_2] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(28, -210), "Guard House Crate 2", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_2)); - locationTable[RC_MK_GUARD_HOUSE_CRATE_3] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-90, 120), "Guard House Crate 3", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_3)); - locationTable[RC_MK_GUARD_HOUSE_CRATE_4] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-90, 168), "Guard House Crate 4", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_4)); - locationTable[RC_MK_GUARD_HOUSE_CRATE_5] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-90, 216), "Guard House Crate 5", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_5)); - locationTable[RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1] = Location::Crate(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1039, 10), "Near Open Grotto Adult Crate 1", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1)); - locationTable[RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1099, 10), "Near Open Grotto Adult Crate 2", RHT_CRATE_KAKARIKO_VILLAGE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2)); - locationTable[RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3] = Location::Crate(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(506, -358), "Near Open Grotto Adult Crate 3", RHT_CRATE_KAKARIKO_VILLAGE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3)); - locationTable[RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4] = Location::Crate(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(483, -302), "Near Open Grotto Adult Crate 4", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4)); - locationTable[RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE] = Location::Crate(RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(186, -758), "Near Potion Shop Adult Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_ADULT_CRATE)); - locationTable[RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE] = Location::Crate(RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(185, 776), "Near Shooting Gallery Adult Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE)); - locationTable[RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1] = Location::Crate(RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(92, 348), "Near Boarding House Adult Crate 1", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1)); - locationTable[RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(32, 348), "Near Boarding House Adult Crate 2", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2)); - locationTable[RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1] = Location::Crate(RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-389, 1518), "Near Impas House Adult Crate 1", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1)); - locationTable[RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-389, 1470), "Near Impas House Adult Crate 2", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2)); - locationTable[RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1] = Location::Crate(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-433, -401), "Near Bazaar Adult Crate 1", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_1)); - locationTable[RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-489, -424), "Near Bazaar Adult Crate 2", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_2)); - locationTable[RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE] = Location::Crate(RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-724, 871), "Behind GS House Adult Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_BEHIND_GS_HOUSE_ADULT_CRATE)); - locationTable[RC_KAK_NEAR_GY_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_GY_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1732, 1366), "Near Graveyard Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GY_CHILD_CRATE)); - locationTable[RC_KAK_NEAR_WINDMILL_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_WINDMILL_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1170, 601), "Near Windmill Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_WINDMILL_CHILD_CRATE)); - locationTable[RC_KAK_NEAR_FENCE_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_FENCE_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1170, 111), "Near Fence Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_FENCE_CHILD_CRATE)); - locationTable[RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-60, -46), "Near Boarding House Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE)); - locationTable[RC_KAK_NEAR_BAZAAR_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_BAZAAR_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-636, -478), "Near Bazaar Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BAZAAR_CHILD_CRATE)); - locationTable[RC_GRAVEYARD_CRATE] = Location::Crate(RC_GRAVEYARD_CRATE, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1050, -350), "Freestanding PoH Crate", RHT_CRATE_GRAVEYARD, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_CRATE)); - locationTable[RC_GC_MAZE_CRATE] = Location::Crate(RC_GC_MAZE_CRATE, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1124, -1339), "Maze Crate", RHT_CRATE_GORON_CITY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_CRATE)); - locationTable[RC_DMC_CRATE] = Location::Crate(RC_DMC_CRATE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-950, 1892), "Crate", RHT_CRATE_DEATH_MOUNTAIN_CRATER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_CRATE)); - locationTable[RC_LLR_NEAR_TREE_CRATE] = Location::Crate(RC_LLR_NEAR_TREE_CRATE, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(1160, -2376), "Near Tree Crate", RHT_CRATE_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_NEAR_TREE_CRATE)); - locationTable[RC_LH_LAB_CRATE] = Location::Crate(RC_LH_LAB_CRATE, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKESIDE_LABORATORY, TWO_ACTOR_PARAMS(90, -119), "Lab Crate", RHT_CRATE_LAKESIDE_LABORATORY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_LAB_CRATE)); + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_GV_FREESTANDING_POH_CRATE] = Location::Crate(RC_GV_FREESTANDING_POH_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-350, 1480), "Freestanding PoH Crate", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_FREESTANDING_POH_CRATE)); + locationTable[RC_GV_NEAR_COW_CRATE] = Location::Crate(RC_GV_NEAR_COW_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-449, 123), "Near Cow Crate", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_NEAR_COW_CRATE)); + locationTable[RC_GF_ABOVE_JAIL_CRATE] = Location::Crate(RC_GF_ABOVE_JAIL_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(51, -2997), "Above Jail Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_PURPLE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ABOVE_JAIL_CRATE)); + locationTable[RC_GF_SOUTHMOST_CENTER_CRATE] = Location::Crate(RC_GF_SOUTHMOST_CENTER_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(315, -1534), "Southmost Center Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTHMOST_CENTER_CRATE)); + locationTable[RC_GF_MID_SOUTH_CENTER_CRATE] = Location::Crate(RC_GF_MID_SOUTH_CENTER_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(315, -1594), "Middle South Center Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_MID_SOUTH_CENTER_CRATE)); + locationTable[RC_GF_MID_NORTH_CENTER_CRATE] = Location::Crate(RC_GF_MID_NORTH_CENTER_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(310, -1782), "Middle North Center Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_MID_NORTH_CENTER_CRATE)); + locationTable[RR_GF_NORTHMOST_CENTER_CRATE] = Location::Crate(RR_GF_NORTHMOST_CENTER_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(310, -1842), "Northmost Center Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTHMOST_CENTER_CRATE)); + locationTable[RC_GF_OUTSKIRTS_NE_CRATE] = Location::Crate(RC_GF_OUTSKIRTS_NE_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(-60, -2210), "Outskirts Northeast Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSKIRTS_NE_CRATE)); + locationTable[RC_GF_OUTSKIRTS_NW_CRATE] = Location::Crate(RC_GF_OUTSKIRTS_NW_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(-120, -2210), "Outskirts Northwest Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_OUTSKIRTS_NW_CRATE)); + locationTable[RC_GF_HBA_RANGE_CRATE_2] = Location::Crate(RC_GF_HBA_RANGE_CRATE_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -1780), "Horseback Archery Range Crate 2", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_HBA_RANGE_CRATE_2)); + locationTable[RC_GF_HBA_RANGE_CRATE_3] = Location::Crate(RC_GF_HBA_RANGE_CRATE_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2020), "Horseback Archery Range Crate 3", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_HBA_RANGE_CRATE_3)); + locationTable[RC_GF_HBA_RANGE_CRATE_4] = Location::Crate(RC_GF_HBA_RANGE_CRATE_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2260), "Horseback Archery Range Crate 4", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_HBA_RANGE_CRATE_4)); + locationTable[RC_GF_HBA_RANGE_CRATE_1] = Location::Crate(RC_GF_HBA_RANGE_CRATE_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -1540), "Horseback Archery Range Crate 1", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_HBA_RANGE_CRATE_1)); + locationTable[RC_GF_HBA_RANGE_CRATE_5] = Location::Crate(RC_GF_HBA_RANGE_CRATE_5, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2500), "Horseback Archery Range Crate 5", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_HBA_RANGE_CRATE_5)); + locationTable[RC_GF_HBA_RANGE_CRATE_6] = Location::Crate(RC_GF_HBA_RANGE_CRATE_6, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2740), "Horseback Archery Range Crate 6", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_HBA_RANGE_CRATE_6)); + locationTable[RC_GF_HBA_RANGE_CRATE_7] = Location::Crate(RC_GF_HBA_RANGE_CRATE_7, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(4090, -2980), "Horseback Archery Range Crate 7", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_HBA_RANGE_CRATE_7)); + locationTable[RC_GF_HBA_CANOPY_EAST_CRATE] = Location::Crate(RC_GF_HBA_CANOPY_EAST_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3727, -243), "Horseback Archery Canopy East Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_HBA_CANOPY_EAST_CRATE)); + locationTable[RC_GF_HBA_CANOPY_WEST_CRATE] = Location::Crate(RC_GF_HBA_CANOPY_WEST_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3667, -243), "Horseback Archery Canopy West Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_HBA_CANOPY_WEST_CRATE)); + locationTable[RC_GF_NORTH_TARGET_EAST_CRATE] = Location::Crate(RC_GF_NORTH_TARGET_EAST_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3446, -4875), "North Target East Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_TARGET_EAST_CRATE)); + locationTable[RC_GF_NORTH_TARGET_WEST_CRATE] = Location::Crate(RC_GF_NORTH_TARGET_WEST_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3303, -5018), "North Target West Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_TARGET_WEST_CRATE)); + locationTable[RC_GF_SOUTH_TARGET_EAST_CRATE] = Location::Crate(RC_GF_SOUTH_TARGET_EAST_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3406, 414), "South Target East Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_TARGET_EAST_CRATE)); + locationTable[RC_GF_SOUTH_TARGET_WEST_CRATE] = Location::Crate(RC_GF_SOUTH_TARGET_WEST_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3330, 406), "South Target West Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_TARGET_WEST_CRATE)); + locationTable[RC_TH_NEAR_KITCHEN_LEFTMOST_CRATE] = Location::Crate(RC_TH_NEAR_KITCHEN_LEFTMOST_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1144, -1251), "Near Kitchen Leftmost Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_NEAR_KITCHEN_LEFTMOST_CRATE)); + locationTable[RC_TH_NEAR_KITCHEN_MID_LEFT_CRATE] = Location::Crate(RC_TH_NEAR_KITCHEN_MID_LEFT_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1144, -1191), "Near Kitchen Middle Left Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_NEAR_KITCHEN_MID_LEFT_CRATE)); + locationTable[RC_TH_NEAR_KITCHEN_MID_RIGHT_CRATE] = Location::Crate(RC_TH_NEAR_KITCHEN_MID_RIGHT_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1256, -847), "Near Kitchen Middle Right Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_NEAR_KITCHEN_MID_RIGHT_CRATE)); + locationTable[RC_TH_NEAR_KITCHEN_RIGHTMOST_CRATE] = Location::Crate(RC_TH_NEAR_KITCHEN_RIGHTMOST_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1256, -787), "Near Kitchen Rightmost Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_NEAR_KITCHEN_RIGHTMOST_CRATE)); + locationTable[RC_TH_KITCHEN_CRATE] = Location::Crate(RC_TH_KITCHEN_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1610, -624), "Kitchen Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_KITCHEN_CRATE)); + locationTable[RC_TH_BREAK_HALLWAY_OUTER_CRATE] = Location::Crate(RC_TH_BREAK_HALLWAY_OUTER_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1260, -3155), "Break Hallway Outer Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_BREAK_HALLWAY_OUTER_CRATE)); + locationTable[RC_TH_BREAK_ROOM_LEFT_CRATE] = Location::Crate(RC_TH_BREAK_ROOM_LEFT_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1600, -3550), "Break Room Left Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_BREAK_ROOM_LEFT_CRATE)); + locationTable[RC_TH_BREAK_HALLWAY_INNER_CRATE] = Location::Crate(RC_TH_BREAK_HALLWAY_INNER_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1360, -3325), "Break Hallway Inner Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_BREAK_HALLWAY_INNER_CRATE)); + locationTable[RC_TH_BREAK_ROOM_RIGHT_CRATE] = Location::Crate(RC_TH_BREAK_ROOM_RIGHT_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1600, -3502), "Break Room Right Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_BREAK_ROOM_RIGHT_CRATE)); + locationTable[RC_TH_1_TORCH_CELL_CRATE] = Location::Crate(RC_TH_1_TORCH_CELL_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-510, -2213), "1 Torch Cell Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_1_TORCH_CELL_CRATE)); + locationTable[RC_TH_DEAD_END_CELL_CRATE] = Location::Crate(RC_TH_DEAD_END_CELL_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1090, -2210), "Dead End Cell Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_DEAD_END_CELL_CRATE)); + locationTable[RC_TH_DOUBLE_CELL_LEFT_CRATE] = Location::Crate(RC_TH_DOUBLE_CELL_LEFT_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-49, 11), "Double Cell Left Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_DOUBLE_CELL_LEFT_CRATE)); + locationTable[RC_TH_DOUBLE_CELL_RIGHT_CRATE] = Location::Crate(RC_TH_DOUBLE_CELL_RIGHT_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(11, 11), "Double Cell Right Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_DOUBLE_CELL_RIGHT_CRATE)); + locationTable[RC_HW_BEFORE_QUICKSAND_CRATE] = Location::Crate(RC_HW_BEFORE_QUICKSAND_CRATE, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(3832, 2840), "Before Quicksand Crate", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_BEFORE_QUICKSAND_CRATE)); + locationTable[RC_HW_AFTER_QUICKSAND_CRATE_1] = Location::Crate(RC_HW_AFTER_QUICKSAND_CRATE_1, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(3235, 2313), "After Quicksand Crate 1", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_AFTER_QUICKSAND_CRATE_1)); + locationTable[RC_HW_AFTER_QUICKSAND_CRATE_2] = Location::Crate(RC_HW_AFTER_QUICKSAND_CRATE_2, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(3125, 2459), "After Quicksand Crate 2", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_AFTER_QUICKSAND_CRATE_2)); + locationTable[RC_HW_AFTER_QUICKSAND_CRATE_3] = Location::Crate(RC_HW_AFTER_QUICKSAND_CRATE_3, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(3026, 2631), "After Quicksand Crate 3", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_AFTER_QUICKSAND_CRATE_3)); + locationTable[RC_HW_NEAR_COLOSSUS_CRATE] = Location::Crate(RC_HW_NEAR_COLOSSUS_CRATE, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(-1531, -976), "Near Colossus Crate", RHT_CRATE_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HW_NEAR_COLOSSUS_CRATE)); + locationTable[RC_MK_NEAR_BAZAAR_CRATE_1] = Location::Crate(RC_MK_NEAR_BAZAAR_CRATE_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(490, 338), "Near Bazaar Crate 1", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_NEAR_BAZAAR_CRATE_1)); + locationTable[RC_MK_NEAR_BAZAAR_CRATE_2] = Location::Crate(RC_MK_NEAR_BAZAAR_CRATE_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(490, 132), "Near Bazaar Crate 2", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_NEAR_BAZAAR_CRATE_2)); + locationTable[RC_MK_SHOOTING_GALLERY_CRATE_1] = Location::Crate(RC_MK_SHOOTING_GALLERY_CRATE_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-150, -576), "Shooting Gallery Crate 1", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_SHOOTING_GALLERY_CRATE_1)); + locationTable[RC_MK_SHOOTING_GALLERY_CRATE_2] = Location::Crate(RC_MK_SHOOTING_GALLERY_CRATE_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_DAY, TWO_ACTOR_PARAMS(-90, -576), "Shooting Gallery Crate 2", RHT_CRATE_MARKET, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_SHOOTING_GALLERY_CRATE_2)); + locationTable[RC_MK_LOST_DOG_HOUSE_CRATE] = Location::Crate(RC_MK_LOST_DOG_HOUSE_CRATE, RCQUEST_BOTH, RCAREA_MARKET, SCENE_DOG_LADY_HOUSE, TWO_ACTOR_PARAMS(176, 170), "Lost Dog House Crate", RHT_CRATE_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_LOST_DOG_HOUSE_CRATE)); + locationTable[RC_MK_GUARD_HOUSE_CRATE_1] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(76, -210), "Guard House Crate 1", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_1)); + locationTable[RC_MK_GUARD_HOUSE_CRATE_2] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(28, -210), "Guard House Crate 2", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_2)); + locationTable[RC_MK_GUARD_HOUSE_CRATE_3] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-90, 120), "Guard House Crate 3", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_3)); + locationTable[RC_MK_GUARD_HOUSE_CRATE_4] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-90, 168), "Guard House Crate 4", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_4)); + locationTable[RC_MK_GUARD_HOUSE_CRATE_5] = Location::Crate(RC_MK_GUARD_HOUSE_CRATE_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-90, 216), "Guard House Crate 5", RHT_CRATE_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CRATE_5)); + locationTable[RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1] = Location::Crate(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1039, 10), "Near Open Grotto Adult Crate 1", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_1)); + locationTable[RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1099, 10), "Near Open Grotto Adult Crate 2", RHT_CRATE_KAKARIKO_VILLAGE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_2)); + locationTable[RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3] = Location::Crate(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(506, -358), "Near Open Grotto Adult Crate 3", RHT_CRATE_KAKARIKO_VILLAGE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_3)); + locationTable[RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4] = Location::Crate(RC_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(483, -302), "Near Open Grotto Adult Crate 4", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_OPEN_GROTTO_ADULT_CRATE_4)); + locationTable[RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE] = Location::Crate(RC_KAK_NEAR_POTION_SHOP_ADULT_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(186, -758), "Near Potion Shop Adult Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_ADULT_CRATE)); + locationTable[RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE] = Location::Crate(RC_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(185, 776), "Near Shooting Gallery Adult Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_SHOOTING_GALLERY_ADULT_CRATE)); + locationTable[RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1] = Location::Crate(RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(92, 348), "Near Boarding House Adult Crate 1", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_1)); + locationTable[RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(32, 348), "Near Boarding House Adult Crate 2", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BOARDING_HOUSE_ADULT_CRATE_2)); + locationTable[RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1] = Location::Crate(RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-389, 1518), "Near Impas House Adult Crate 1", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_1)); + locationTable[RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-389, 1470), "Near Impas House Adult Crate 2", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_ADULT_CRATE_2)); + locationTable[RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1] = Location::Crate(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-433, -401), "Near Bazaar Adult Crate 1", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_1)); + locationTable[RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2] = Location::Crate(RC_KAK_NEAR_BAZAAR_ADULT_CRATE_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-489, -424), "Near Bazaar Adult Crate 2", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BAZAAR_ADULT_CRATE_2)); + locationTable[RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE] = Location::Crate(RC_KAK_BEHIND_GS_HOUSE_ADULT_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-724, 871), "Behind GS House Adult Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_BEHIND_GS_HOUSE_ADULT_CRATE)); + locationTable[RC_KAK_NEAR_GY_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_GY_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1732, 1366), "Near Graveyard Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GY_CHILD_CRATE)); + locationTable[RC_KAK_NEAR_WINDMILL_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_WINDMILL_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1170, 601), "Near Windmill Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_WINDMILL_CHILD_CRATE)); + locationTable[RC_KAK_NEAR_FENCE_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_FENCE_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(1170, 111), "Near Fence Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_FENCE_CHILD_CRATE)); + locationTable[RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-60, -46), "Near Boarding House Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BOARDING_HOUSE_CHILD_CRATE)); + locationTable[RC_KAK_NEAR_BAZAAR_CHILD_CRATE] = Location::Crate(RC_KAK_NEAR_BAZAAR_CHILD_CRATE, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-636, -478), "Near Bazaar Child Crate", RHT_CRATE_KAKARIKO_VILLAGE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_BAZAAR_CHILD_CRATE)); + locationTable[RC_GRAVEYARD_CRATE] = Location::Crate(RC_GRAVEYARD_CRATE, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(-1050, -350), "Freestanding PoH Crate", RHT_CRATE_GRAVEYARD, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_CRATE)); + locationTable[RC_GC_MAZE_CRATE] = Location::Crate(RC_GC_MAZE_CRATE, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1124, -1339), "Maze Crate", RHT_CRATE_GORON_CITY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MAZE_CRATE)); + locationTable[RC_DMC_CRATE] = Location::Crate(RC_DMC_CRATE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-950, 1892), "Crate", RHT_CRATE_DEATH_MOUNTAIN_CRATER, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_CRATE)); + locationTable[RC_LLR_NEAR_TREE_CRATE] = Location::Crate(RC_LLR_NEAR_TREE_CRATE, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(1160, -2376), "Near Tree Crate", RHT_CRATE_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_NEAR_TREE_CRATE)); + locationTable[RC_LH_LAB_CRATE] = Location::Crate(RC_LH_LAB_CRATE, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKESIDE_LABORATORY, TWO_ACTOR_PARAMS(90, -119), "Lab Crate", RHT_CRATE_LAKESIDE_LABORATORY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_LAB_CRATE)); // No Logic Crates - locationTable[RC_GV_CRATE_BRIDGE_1] = Location::NLCrate(RC_GV_CRATE_BRIDGE_1, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-764, 148), "Near Bridge Crate 1", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_CRATE_BRIDGE_1)); - locationTable[RC_GV_CRATE_BRIDGE_2] = Location::NLCrate(RC_GV_CRATE_BRIDGE_2, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-860, -125), "Near Bridge Crate 2", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_CRATE_BRIDGE_2)); - locationTable[RC_GV_CRATE_BRIDGE_3] = Location::NLCrate(RC_GV_CRATE_BRIDGE_3, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-860, -150), "Near Bridge Crate 3", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_CRATE_BRIDGE_3)); - locationTable[RC_GV_CRATE_BRIDGE_4] = Location::NLCrate(RC_GV_CRATE_BRIDGE_4, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-860, -90), "Near Bridge Crate 4", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_CRATE_BRIDGE_4)); - locationTable[RC_GF_ARCHERY_LEFT_END_CHILD_CRATE] = Location::NLCrate(RC_GF_ARCHERY_LEFT_END_CHILD_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3443, -4876), "Archery Left End Child Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ARCHERY_LEFT_END_CHILD_CRATE)); + locationTable[RC_GV_CRATE_BRIDGE_1] = Location::NLCrate(RC_GV_CRATE_BRIDGE_1, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-764, 148), "Near Bridge Crate 1", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_CRATE_BRIDGE_1)); + locationTable[RC_GV_CRATE_BRIDGE_2] = Location::NLCrate(RC_GV_CRATE_BRIDGE_2, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-860, -125), "Near Bridge Crate 2", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_CRATE_BRIDGE_2)); + locationTable[RC_GV_CRATE_BRIDGE_3] = Location::NLCrate(RC_GV_CRATE_BRIDGE_3, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-860, -150), "Near Bridge Crate 3", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_CRATE_BRIDGE_3)); + locationTable[RC_GV_CRATE_BRIDGE_4] = Location::NLCrate(RC_GV_CRATE_BRIDGE_4, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(-860, -90), "Near Bridge Crate 4", RHT_CRATE_GERUDO_VALLEY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_CRATE_BRIDGE_4)); + locationTable[RC_GF_NORTH_TARGET_CHILD_CRATE] = Location::NLCrate(RC_GF_NORTH_TARGET_CHILD_CRATE, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_GERUDOS_FORTRESS, TWO_ACTOR_PARAMS(3443, -4876), "North Target Child Crate", RHT_CRATE_GERUDOS_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_TARGET_CHILD_CRATE)); // MQ Crates - // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check - locationTable[RC_DEKU_TREE_MQ_LOBBY_CRATE] = Location::Crate(RC_DEKU_TREE_MQ_LOBBY_CRATE, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(279, 333), "MQ Lobby Crate", RHT_CRATE_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_CRATE)); - locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1] = Location::Crate(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-805, -62), "MQ Slingshot Room Crate 1", RHT_CRATE_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1)); - locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2] = Location::Crate(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-805, -2), "MQ Slingshot Room Crate 2", RHT_CRATE_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1886, -744), "MQ Poe Room Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1826, -744), "MQ Poe Room Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1536, -1391), "MQ Poe Room Crate 3", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3)); - locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1536, -1451), "MQ Poe Room Crate 4", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4)); - locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2267, -1824), "MQ Poe Room Crate 5", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5)); - locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2267, -1884), "MQ Poe Room Crate 6", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6)); - locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2232, -1161), "MQ Poe Room Crate 7", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7)); - locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2232, -1221), "MQ Poe Room Crate 8", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8)); - locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1730, -1836), "MQ Staircase Lower Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2190, -1835), "MQ Staircase Lower Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1510, -1837), "MQ Staircase Upper Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1511, -1084), "MQ Staircase Upper Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2410, -1084), "MQ Staircase Upper Crate 3", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3)); - locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2411, -1836), "MQ Staircase Upper Crate 4", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4)); - locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3191, -897), "MQ Two Flames Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2776, -810), "MQ Two Flames Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2055, -1714), "MQ Larvae Room Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2055, -1774), "MQ Larvae Room Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1871, -1976), "MQ Larvae Room Crate 3", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3)); - locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1811, -1976), "MQ Larvae Room Crate 4", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4)); - locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1625, -1721), "MQ Larvae Room Crate 5", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5)); - locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1625, -1781), "MQ Larvae Room Crate 6", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6)); - locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1205, 769), "MQ Outside Boss Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1)); - locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1205, 709), "MQ Outside Boss Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2)); - locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1130, -654), "MQ Outside Boss Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3)); - locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1211, -775), "MQ Outside Boss Crate 4", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4)); - locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1457, -417), "MQ Outside Boss Crate 5", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5)); - locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1457, -534), "MQ Outside Boss Crate 6", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6)); - locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2249, -56), "MQ Shortcut Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1)); - locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2189, -56), "MQ Shortcut Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2)); - locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2150, 55), "MQ Shortcut Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3)); - locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2135, -62), "MQ Shortcut Crate 4", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4)); - locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2090, 55), "MQ Shortcut Crate 5", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5)); - locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2030, 55), "MQ Shortcut Crate 6", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6)); - locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2230, 1147), "MQ Lizalfos Maze Lower Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1)); - locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2230, 1195), "MQ Lizalfos Maze Lower Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2)); - locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2124, 1154), "MQ Lizalfos Maze Lower Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3)); - locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1817, 1330), "MQ Lizalfos Maze Upper Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1)); - locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1710, 1288), "MQ Lizalfos Maze Upper Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2)); - locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1710, 1336), "MQ Lizalfos Maze Upper Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1407, -756), "MQ Lava Torch Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(384, 351), "MQ Lava Torch Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1409, -1176), "MQ Lava Torch Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(999, -402), "MQ Lava Torch Crate 4", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1210, 163), "MQ Lava Torch Crate 5", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5)); - locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-150, -336), "MQ Central Pillar Upper Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1)); - locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-210, -336), "MQ Central Pillar Upper Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2)); - locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(299, 485), "MQ Central Pillar Lower Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1)); - locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(215, 486), "MQ Central Pillar Lower Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2)); - locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(222, 204), "MQ Central Pillar Lower Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3)); - locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(455, 425), "MQ Central Pillar Lower Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4)); - locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(455, 365), "MQ Central Pillar Lower Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5)); - locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(215, 426), "MQ Central Pillar Lower Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6)); - locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(215, 366), "MQ Central Pillar Lower Crate 7", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7)); - locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(162, 204), "MQ Central Pillar Lower Crate 8", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8)); - locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(31, 636), "MQ Central Pillar Lower Crate 9", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9)); - locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(151, 636), "MQ Central Pillar Lower Crate 10", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10)); - locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(102, 204), "MQ Central Pillar Lower Crate 11", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11)); - locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(91, 636), "MQ Central Pillar Lower Crate 12", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12)); - locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(25, 522), "MQ Central Pillar Lower Crate 13", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13)); - locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(25, 582), "MQ Central Pillar Lower Crate 14", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(698, 399), "MQ Lizalfos Hallway Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(437, 576), "MQ Lizalfos Hallway Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(270, 504), "MQ Lizalfos Hallway Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(686, 1016), "MQ Lizalfos Hallway Room Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(795, 870), "MQ Lizalfos Hallway Room Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(795, 810), "MQ Lizalfos Hallway Room Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(524, 839), "MQ Lizalfos Hallway Room Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(525, 954), "MQ Lizalfos Hallway Room Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(816, 570), "MQ Lizalfos Hallway Gate Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(816, 510), "MQ Lizalfos Hallway Gate Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1536, -712), "MQ Storage Room A Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1536, -821), "MQ Storage Room A Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1536, -922), "MQ Storage Room A Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1434, -1036), "MQ Storage Room A Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1374, -1036), "MQ Storage Room A Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1265, -1036), "MQ Storage Room A Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1205, -1036), "MQ Storage Room A Crate 7", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7)); - locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-892, -91), "MQ GS Storage Room Lower Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1)); - locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1149, 173), "MQ GS Storage Room Lower Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2)); - locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1157, -221), "MQ GS Storage Room Lower Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3)); - locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-945, -315), "MQ GS Storage Room Lower Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4)); - locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, -141), "MQ GS Storage Room Lower Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5)); - locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1103, -315), "MQ GS Storage Room Lower Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6)); - locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-884, 65), "MQ GS Storage Room Upper Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1)); - locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, 56), "MQ GS Storage Room Upper Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2)); - locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2196, -1918), "MQ Dragon Room Torches Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1)); - locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2196, -1978), "MQ Dragon Room Torches Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2)); - locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1718, -2006), "MQ Dragon Room Submerged Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1)); - locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1778, -2006), "MQ Dragon Room Submerged Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2)); - locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1997, -1912), "MQ Dragon Room Submerged Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3)); - locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1997, -1972), "MQ Dragon Room Submerged Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4)); - locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1092, -1926), "MQ Dragon Room Door Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1)); - locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1153, -1926), "MQ Dragon Room Door Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2)); - locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1257, -1567), "MQ BK Room Upper Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE)); - locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1289, -1205), "MQ BK Room Lower Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1)); - locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-985, -1333), "MQ BK Room Lower Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2)); - locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1297, -1300), "MQ BK Room Lower Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3)); - locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1069, -1402), "MQ BK Room Lower Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4)); - locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-11, -2075), "MQ Whirlpool Front Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1)); - locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-371, -2077), "MQ Whirlpool Front Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2)); - locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-455, -2394), "MQ Whirlpool Submerged Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1)); - locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-498, -2661), "MQ Whirlpool Submerged Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2)); - locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(11, -2737), "MQ Whirlpool Submerged Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3)); - locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-251, -2731), "MQ Whirlpool Submerged Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4)); - locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-119, -2481), "MQ Whirlpool Submerged Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5)); - locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(126, -2485), "MQ Whirlpool Submerged Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6)); - locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-7, -3126), "MQ Whirlpool Behind Gate Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1)); - locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-87, -3126), "MQ Whirlpool Behind Gate Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2)); - locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-303, -3126), "MQ Whirlpool Behind Gate Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3)); - locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-390, -3126), "MQ Whirlpool Behind Gate Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4)); - locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-397, -3818), "MQ Dodongo Room Upper Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE)); - locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(30, -3215), "MQ Dodongo Room Hall Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE)); - locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-85, -3460), "MQ Dodongo Room Lower Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1)); - locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-271, -3826), "MQ Dodongo Room Lower Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2)); - locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(36, -3700), "MQ Dodongo Room Lower Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1436, -2766), "MQ Storage Room B Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1125, -2866), "MQ Storage Room B Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1125, -2926), "MQ Storage Room B Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1435, -2935), "MQ Storage Room B Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1436, -2875), "MQ Storage Room B Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5)); - locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-994, 744), "MQ Triple Torch Room Submerged Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1)); - locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-991, 976), "MQ Triple Torch Room Submerged Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2)); - locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1511, 975), "MQ Triple Torch Room Submerged Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3)); - locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1571, 792), "MQ Triple Torch Room Submerged Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4)); - locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1571, 975), "MQ Triple Torch Room Submerged Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5)); - locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1571, 744), "MQ Triple Torch Room Submerged Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6)); - locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2183, 977), "MQ Triple Torch Room Gate Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1)); - locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2260, 744), "MQ Triple Torch Room Gate Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3)); - locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2200, 743), "MQ Triple Torch Room Gate Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(510, -1558), "MQ Statue Crate 1", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(570, -1558), "MQ Statue Crate 2", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-150, -1138), "MQ Big Mirror Crate 1", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(270, -1138), "MQ Big Mirror Crate 2", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-150, -1186), "MQ Big Mirror Crate 3", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(270, -1186), "MQ Big Mirror Crate 4", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4)); - locationTable[RC_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE] = Location::Crate(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-59, -1598), "MQ Maze Crate", RHT_CRATE_GERUDO_TRAINING_GROUND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE)); + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_DEKU_TREE_MQ_LOBBY_CRATE] = Location::Crate(RC_DEKU_TREE_MQ_LOBBY_CRATE, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(279, 333), "MQ Lobby Crate", RHT_CRATE_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_CRATE)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1] = Location::Crate(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-805, -62), "MQ Slingshot Room Crate 1", RHT_CRATE_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_1)); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2] = Location::Crate(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2, RCQUEST_MQ, RCAREA_DEKU_TREE, SCENE_DEKU_TREE, TWO_ACTOR_PARAMS(-805, -2), "MQ Slingshot Room Crate 2", RHT_CRATE_DEKU_TREE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1886, -744), "MQ Poe Room Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1826, -744), "MQ Poe Room Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1536, -1391), "MQ Poe Room Crate 3", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1536, -1451), "MQ Poe Room Crate 4", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2267, -1824), "MQ Poe Room Crate 5", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_5)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2267, -1884), "MQ Poe Room Crate 6", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_6)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2232, -1161), "MQ Poe Room Crate 7", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_7)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8] = Location::Crate(RC_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2232, -1221), "MQ Poe Room Crate 8", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_CRATE_8)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1730, -1836), "MQ Staircase Lower Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2190, -1835), "MQ Staircase Lower Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1510, -1837), "MQ Staircase Upper Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1511, -1084), "MQ Staircase Upper Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2410, -1084), "MQ Staircase Upper Crate 3", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4] = Location::Crate(RC_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2411, -1836), "MQ Staircase Upper Crate 4", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_UPPER_CRATE_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3191, -897), "MQ Two Flames Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2776, -810), "MQ Two Flames Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2055, -1714), "MQ Larvae Room Crate 1", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2055, -1774), "MQ Larvae Room Crate 2", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1871, -1976), "MQ Larvae Room Crate 3", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1811, -1976), "MQ Larvae Room Crate 4", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1625, -1721), "MQ Larvae Room Crate 5", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_5)); + locationTable[RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6] = Location::Crate(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1625, -1781), "MQ Larvae Room Crate 6", RHT_CRATE_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CRATE_6)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1205, 769), "MQ Outside Boss Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1205, 709), "MQ Outside Boss Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1130, -654), "MQ Outside Boss Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1211, -775), "MQ Outside Boss Crate 4", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_4)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1457, -417), "MQ Outside Boss Crate 5", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_5)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6] = Location::Crate(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1457, -534), "MQ Outside Boss Crate 6", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_CRATE_6)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2249, -56), "MQ Shortcut Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2189, -56), "MQ Shortcut Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2150, 55), "MQ Shortcut Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2135, -62), "MQ Shortcut Crate 4", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_4)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2090, 55), "MQ Shortcut Crate 5", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_5)); + locationTable[RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6] = Location::Crate(RC_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2030, 55), "MQ Shortcut Crate 6", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_SHORTCUT_CRATE_6)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2230, 1147), "MQ Lizalfos Maze Lower Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2230, 1195), "MQ Lizalfos Maze Lower Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2124, 1154), "MQ Lizalfos Maze Lower Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1817, 1330), "MQ Lizalfos Maze Upper Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1710, 1288), "MQ Lizalfos Maze Upper Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1710, 1336), "MQ Lizalfos Maze Upper Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1407, -756), "MQ Lava Torch Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(384, 351), "MQ Lava Torch Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1409, -1176), "MQ Lava Torch Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(999, -402), "MQ Lava Torch Crate 4", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_4)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5] = Location::Crate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1210, 163), "MQ Lava Torch Crate 5", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-150, -336), "MQ Central Pillar Upper Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-210, -336), "MQ Central Pillar Upper Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_UPPER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(299, 485), "MQ Central Pillar Lower Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(215, 486), "MQ Central Pillar Lower Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(222, 204), "MQ Central Pillar Lower Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(455, 425), "MQ Central Pillar Lower Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(455, 365), "MQ Central Pillar Lower Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(215, 426), "MQ Central Pillar Lower Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_6)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(215, 366), "MQ Central Pillar Lower Crate 7", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_7)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(162, 204), "MQ Central Pillar Lower Crate 8", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_8)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(31, 636), "MQ Central Pillar Lower Crate 9", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_9)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(151, 636), "MQ Central Pillar Lower Crate 10", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_10)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(102, 204), "MQ Central Pillar Lower Crate 11", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_11)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(91, 636), "MQ Central Pillar Lower Crate 12", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_12)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(25, 522), "MQ Central Pillar Lower Crate 13", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_13)); + locationTable[RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14] = Location::Crate(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(25, 582), "MQ Central Pillar Lower Crate 14", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_PILLAR_LOWER_CRATE_14)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(698, 399), "MQ Lizalfos Hallway Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(437, 576), "MQ Lizalfos Hallway Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(270, 504), "MQ Lizalfos Hallway Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(686, 1016), "MQ Lizalfos Hallway Room Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(795, 870), "MQ Lizalfos Hallway Room Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(795, 810), "MQ Lizalfos Hallway Room Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(524, 839), "MQ Lizalfos Hallway Room Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(525, 954), "MQ Lizalfos Hallway Room Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_ROOM_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(816, 570), "MQ Lizalfos Hallway Gate Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(816, 510), "MQ Lizalfos Hallway Gate Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_GATE_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1536, -712), "MQ Storage Room A Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1536, -821), "MQ Storage Room A Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1536, -922), "MQ Storage Room A Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1434, -1036), "MQ Storage Room A Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1374, -1036), "MQ Storage Room A Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1265, -1036), "MQ Storage Room A Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_6)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1205, -1036), "MQ Storage Room A Crate 7", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_CRATE_7)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-892, -91), "MQ GS Storage Room Lower Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1149, 173), "MQ GS Storage Room Lower Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1157, -221), "MQ GS Storage Room Lower Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-945, -315), "MQ GS Storage Room Lower Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, -141), "MQ GS Storage Room Lower Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1103, -315), "MQ GS Storage Room Lower Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_CRATE_6)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-884, 65), "MQ GS Storage Room Upper Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, 56), "MQ GS Storage Room Upper Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2196, -1918), "MQ Dragon Room Torches Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2196, -1978), "MQ Dragon Room Torches Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1718, -2006), "MQ Dragon Room Submerged Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1778, -2006), "MQ Dragon Room Submerged Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1997, -1912), "MQ Dragon Room Submerged Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1997, -1972), "MQ Dragon Room Submerged Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_SUBMERGED_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1092, -1926), "MQ Dragon Room Door Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1153, -1926), "MQ Dragon Room Door Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_DOOR_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1257, -1567), "MQ BK Room Upper Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_UPPER_CRATE)); + locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1289, -1205), "MQ BK Room Lower Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-985, -1333), "MQ BK Room Lower Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1297, -1300), "MQ BK Room Lower Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1069, -1402), "MQ BK Room Lower Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BK_ROOM_LOWER_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-11, -2075), "MQ Whirlpool Front Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-371, -2077), "MQ Whirlpool Front Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_FRONT_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-455, -2394), "MQ Whirlpool Submerged Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-498, -2661), "MQ Whirlpool Submerged Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(11, -2737), "MQ Whirlpool Submerged Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-251, -2731), "MQ Whirlpool Submerged Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-119, -2481), "MQ Whirlpool Submerged Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(126, -2485), "MQ Whirlpool Submerged Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_SUBMERGED_CRATE_6)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-7, -3126), "MQ Whirlpool Behind Gate Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-87, -3126), "MQ Whirlpool Behind Gate Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-303, -3126), "MQ Whirlpool Behind Gate Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-390, -3126), "MQ Whirlpool Behind Gate Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_WHIRLPOOL_BEHIND_GATE_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-397, -3818), "MQ Dodongo Room Upper Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_UPPER_CRATE)); + locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(30, -3215), "MQ Dodongo Room Hall Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_HALL_CRATE)); + locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-85, -3460), "MQ Dodongo Room Lower Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-271, -3826), "MQ Dodongo Room Lower Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(36, -3700), "MQ Dodongo Room Lower Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DODONGO_ROOM_LOWER_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1436, -2766), "MQ Storage Room B Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1125, -2866), "MQ Storage Room B Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1125, -2926), "MQ Storage Room B Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1435, -2935), "MQ Storage Room B Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1436, -2875), "MQ Storage Room B Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-994, 744), "MQ Triple Torch Room Submerged Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-991, 976), "MQ Triple Torch Room Submerged Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1511, 975), "MQ Triple Torch Room Submerged Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1571, 792), "MQ Triple Torch Room Submerged Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1571, 975), "MQ Triple Torch Room Submerged Crate 5", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1571, 744), "MQ Triple Torch Room Submerged Crate 6", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_SUBMERGED_CRATE_6)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2183, 977), "MQ Triple Torch Room Gate Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2260, 744), "MQ Triple Torch Room Gate Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2] = Location::Crate(RC_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2200, 743), "MQ Triple Torch Room Gate Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_TRIPLE_TORCH_ROOM_GATE_CRATE_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(510, -1558), "MQ Statue Crate 1", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(570, -1558), "MQ Statue Crate 2", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_CRATE_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-150, -1138), "MQ Big Mirror Crate 1", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(270, -1138), "MQ Big Mirror Crate 2", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-150, -1186), "MQ Big Mirror Crate 3", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_3)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4] = Location::Crate(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(270, -1186), "MQ Big Mirror Crate 4", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_CRATE_4)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE] = Location::Crate(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-59, -1598), "MQ Maze Crate", RHT_CRATE_GERUDO_TRAINING_GROUND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_MAZE_CRATE)); // Small Crates - // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check - locationTable[RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1] = Location::SmallCrate(RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-141, -1945), "Platform Room Small Crate 1", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1)); - locationTable[RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2] = Location::SmallCrate(RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-189, -1925), "Platform Room Small Crate 2", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2)); - locationTable[RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1] = Location::SmallCrate(RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2030, -1172), "After Hammer Small Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1)); - locationTable[RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2] = Location::SmallCrate(RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2072, -1135), "After Hammer Small Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2)); - locationTable[RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1] = Location::SmallCrate(RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-971, -940), "Before Child Climb Small Crate 1", RHT_CRATE_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1)); - locationTable[RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2] = Location::SmallCrate(RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1151, -939), "Before Child Climb Small Crate 2", RHT_CRATE_SPIRIT_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1] = Location::SmallCrate(RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-512, -4592), "MQ Triple Hallway Small Crate 1", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1)); - locationTable[RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2] = Location::SmallCrate(RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-666, -4671), "MQ Triple Hallway Small Crate 2", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_1] = Location::SmallCrate(RC_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1381, -2115), "MQ Jigglies Small Crate 1", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_1)); - locationTable[RC_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_2] = Location::SmallCrate(RC_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1341, -2116), "MQ Jigglies Small Crate 2", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_2)); - locationTable[RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1] = Location::SmallCrate(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1599, -1322), "MQ Frozen Eye Switch Small Crate 1", RHT_CRATE_FOREST_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1)); - locationTable[RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2] = Location::SmallCrate(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2364, -873), "MQ Frozen Eye Switch Small Crate 2", RHT_CRATE_FOREST_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2)); - locationTable[RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3] = Location::SmallCrate(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2312, -874), "MQ Frozen Eye Switch Small Crate 3", RHT_CRATE_FOREST_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3)); - locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1699, 1290), "MQ Lizalfos Maze Upper Small Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1)); - locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1699, 1332), "MQ Lizalfos Maze Upper Small Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(460, 370), "MQ Lava Torch Small Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1405, -975), "MQ Lava Torch Small Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(685, 183), "MQ Lava Torch Small Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1210, 163), "MQ Lava Torch Small Crate 4", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1267, 200), "MQ Lava Torch Small Crate 5", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5)); - locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2210, -1952), "MQ Dragon Room Torches Small Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1)); - locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2210, -1911), "MQ Dragon Room Torches Small Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2)); - locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2210, -1991), "MQ Dragon Room Torches Small Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1470, -622), "MQ Storage Room A Small Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1341, -621), "MQ Storage Room A Small Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1393, -621), "MQ Storage Room A Small Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1284, -621), "MQ Storage Room A Small Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4)); - locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1166, 97), "MQ GS Storage Room Lower Small Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE)); - locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-992, 382), "MQ GS Storage Room Upper Small Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE)); - locationTable[RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1] = Location::SmallCrate(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(365, 52), "MQ Truth Spinner Small Crate 1", RHT_CRATE_SHADOW_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1)); - locationTable[RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2] = Location::SmallCrate(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(363, -62), "MQ Truth Spinner Small Crate 2", RHT_CRATE_SHADOW_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2)); - locationTable[RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3] = Location::SmallCrate(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(363, -7), "MQ Truth Spinner Small Crate 3", RHT_CRATE_SHADOW_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3)); - locationTable[RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4] = Location::SmallCrate(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(366, 114), "MQ Truth Spinner Small Crate 4", RHT_CRATE_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4)); - locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE] = Location::SmallCrate(RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-271, -983), "MQ Statue Small Crate", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE] = Location::SmallCrate(RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1382, 190), "MQ Beamos Small Crate", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE)); + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1] = Location::SmallCrate(RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-141, -1945), "Platform Room Small Crate 1", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_1)); + locationTable[RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2] = Location::SmallCrate(RC_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-189, -1925), "Platform Room Small Crate 2", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_PLATFORM_ROOM_SMALL_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1] = Location::SmallCrate(RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2030, -1172), "After Hammer Small Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2] = Location::SmallCrate(RC_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2072, -1135), "After Hammer Small Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_AFTER_HAMMER_SMALL_CRATE_2)); + locationTable[RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1] = Location::SmallCrate(RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-971, -940), "Before Child Climb Small Crate 1", RHT_CRATE_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1)); + locationTable[RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2] = Location::SmallCrate(RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1151, -939), "Before Child Climb Small Crate 2", RHT_CRATE_SPIRIT_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1] = Location::SmallCrate(RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-512, -4592), "MQ Triple Hallway Small Crate 1", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2] = Location::SmallCrate(RC_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-666, -4671), "MQ Triple Hallway Small Crate 2", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TRIPLE_HALLWAY_SMALL_CRATE_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_1] = Location::SmallCrate(RC_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1381, -2115), "MQ Jigglies Small Crate 1", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_2] = Location::SmallCrate(RC_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1341, -2116), "MQ Jigglies Small Crate 2", RHT_CRATE_JABU_JABU, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_JIGGLIES_SMALL_CRATE_2)); + locationTable[RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1] = Location::SmallCrate(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1599, -1322), "MQ Frozen Eye Switch Small Crate 1", RHT_CRATE_FOREST_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_1)); + locationTable[RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2] = Location::SmallCrate(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2364, -873), "MQ Frozen Eye Switch Small Crate 2", RHT_CRATE_FOREST_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_2)); + locationTable[RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3] = Location::SmallCrate(RC_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2312, -874), "MQ Frozen Eye Switch Small Crate 3", RHT_CRATE_FOREST_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_FROZEN_EYE_SWITCH_SMALL_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1699, 1290), "MQ Lizalfos Maze Upper Small Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1699, 1332), "MQ Lizalfos Maze Upper Small Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_SMALL_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(460, 370), "MQ Lava Torch Small Crate 1", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1405, -975), "MQ Lava Torch Small Crate 2", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(685, 183), "MQ Lava Torch Small Crate 3", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1210, 163), "MQ Lava Torch Small Crate 4", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_4)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5] = Location::SmallCrate(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1267, 200), "MQ Lava Torch Small Crate 5", RHT_CRATE_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_SMALL_CRATE_5)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2210, -1952), "MQ Dragon Room Torches Small Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2210, -1911), "MQ Dragon Room Torches Small Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2210, -1991), "MQ Dragon Room Torches Small Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_DRAGON_ROOM_TORCHES_SMALL_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1470, -622), "MQ Storage Room A Small Crate 1", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_1)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1341, -621), "MQ Storage Room A Small Crate 2", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1393, -621), "MQ Storage Room A Small Crate 3", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_3)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1284, -621), "MQ Storage Room A Small Crate 4", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_SMALL_CRATE_4)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1166, 97), "MQ GS Storage Room Lower Small Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_LOWER_SMALL_CRATE)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE] = Location::SmallCrate(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-992, 382), "MQ GS Storage Room Upper Small Crate", RHT_CRATE_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_UPPER_SMALL_CRATE)); + locationTable[RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1] = Location::SmallCrate(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(365, 52), "MQ Truth Spinner Small Crate 1", RHT_CRATE_SHADOW_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2] = Location::SmallCrate(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(363, -62), "MQ Truth Spinner Small Crate 2", RHT_CRATE_SHADOW_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3] = Location::SmallCrate(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(363, -7), "MQ Truth Spinner Small Crate 3", RHT_CRATE_SHADOW_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_3)); + locationTable[RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4] = Location::SmallCrate(RC_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(366, 114), "MQ Truth Spinner Small Crate 4", RHT_CRATE_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_TRUTH_SPINNER_SMALL_CRATE_4)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE] = Location::SmallCrate(RC_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-271, -983), "MQ Statue Small Crate", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_STATUE_SMALL_CRATE)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE] = Location::SmallCrate(RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1382, 190), "MQ Beamos Small Crate", RHT_CRATE_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE)); // clang-format on } diff --git a/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp b/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp index ffd9a60b4..aad3f6327 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp @@ -375,7 +375,7 @@ void Rando::StaticData::RegisterFairyLocations() { locationTable[RC_DMT_FLAG_SUN_FAIRY] = Location::Fairy(RC_DMT_FLAG_SUN_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(0x1000, 464), "Flag Sun's Song Fairy", RHT_DMT_FLAG_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_FLAG_SUN_FAIRY)); locationTable[RC_DMT_COW_GROTTO_STORMS_FAIRY] = Location::Fairy(RC_DMT_COW_GROTTO_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1000, -311), "Cow Grotto Song of Storms Fairy", RHT_DMT_COW_GROTTO_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_STORMS_FAIRY)); locationTable[RC_LW_SHORTCUT_STORMS_FAIRY] = Location::Fairy(RC_LW_SHORTCUT_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(0x1000, -795), "Shortcuts Song of Storms Fairy", RHT_LW_SHORTCUT_STORMS_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_STORMS_FAIRY)); - locationTable[RC_GF_KITCHEN_SUN_FAIRY] = Location::Fairy(RC_GF_KITCHEN_SUN_FAIRY, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(0x1000, -621), "Kitchen Sun's Song Fairy", RHT_GF_KITCHEN_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_SUN_FAIRY)); + locationTable[RC_TH_KITCHEN_SUN_FAIRY] = Location::Fairy(RC_TH_KITCHEN_SUN_FAIRY, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(0x1000, -621), "Kitchen Sun's Song Fairy", RHT_TH_KITCHEN_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_KITCHEN_SUN_FAIRY)); locationTable[RC_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY] = Location::Fairy(RC_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1000, 741), "Scrub Grotto Sun's Song Fairy", RHT_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY)); locationTable[RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY] = Location::Fairy(RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_ROYAL_FAMILYS_TOMB, TWO_ACTOR_PARAMS(0x1000, 1476), "Royal Family's Tomb Sun's Song Fairy", RHT_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY)); diff --git a/soh/soh/Enhancements/randomizer/ShufflePots.cpp b/soh/soh/Enhancements/randomizer/ShufflePots.cpp index 79fe4461b..9dfeb06ae 100644 --- a/soh/soh/Enhancements/randomizer/ShufflePots.cpp +++ b/soh/soh/Enhancements/randomizer/ShufflePots.cpp @@ -98,553 +98,553 @@ void Rando::StaticData::RegisterPotLocations() { registered = true; // clang-format off // Overworld Pots - // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check - locationTable[RC_KF_LINKS_HOUSE_POT] = Location::Pot(RC_KF_LINKS_HOUSE_POT, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_LINKS_HOUSE, TWO_ACTOR_PARAMS(-118, 51), "Links House Pot", RHT_POT_KOKIRI_FOREST, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_LINKS_HOUSE_POT)); - locationTable[RC_KF_TWINS_HOUSE_POT_2] = Location::Pot(RC_KF_TWINS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_TWINS_HOUSE, TWO_ACTOR_PARAMS(35, 57), "Twins House Pot 2", RHT_POT_KOKIRI_FOREST, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_TWINS_HOUSE_POT_2)); - locationTable[RC_KF_TWINS_HOUSE_POT_1] = Location::Pot(RC_KF_TWINS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_TWINS_HOUSE, TWO_ACTOR_PARAMS(33, -55), "Twins House Pot 1", RHT_POT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_TWINS_HOUSE_POT_1)); - locationTable[RC_KF_BROTHERS_HOUSE_POT_1] = Location::Pot(RC_KF_BROTHERS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KNOW_IT_ALL_BROS_HOUSE, TWO_ACTOR_PARAMS(-134, -29), "Brothers House Pot 1", RHT_POT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BROTHERS_HOUSE_POT_1)); - locationTable[RC_KF_BROTHERS_HOUSE_POT_2] = Location::Pot(RC_KF_BROTHERS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KNOW_IT_ALL_BROS_HOUSE, TWO_ACTOR_PARAMS(-68, 114), "Brothers House Pot 2", RHT_POT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BROTHERS_HOUSE_POT_2)); - locationTable[RC_GF_BREAK_ROOM_POT_1] = Location::Pot(RC_GF_BREAK_ROOM_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1438, -3629), "Break Room Pot 1", RHT_POT_GERUDO_FORTRESS, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_POT_1)); - locationTable[RC_GF_BREAK_ROOM_POT_2] = Location::Pot(RC_GF_BREAK_ROOM_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1403, -3679), "Break Room Pot 2", RHT_POT_GERUDO_FORTRESS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_BREAK_ROOM_POT_2)); - locationTable[RC_GF_KITCHEN_POT_1] = Location::Pot(RC_GF_KITCHEN_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1908, -789), "Kitchen Pot 1", RHT_POT_GERUDO_FORTRESS, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_POT_1)); - locationTable[RC_GF_KITCHEN_POT_2] = Location::Pot(RC_GF_KITCHEN_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1951, -850), "Kitchen Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_KITCHEN_POT_2)); - locationTable[RC_GF_NORTH_F1_CARPENTER_POT_1] = Location::Pot(RC_GF_NORTH_F1_CARPENTER_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-475, -2622), "North F1 Carpenter Pot 1", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F1_CARPENTER_POT_1)); - locationTable[RC_GF_NORTH_F1_CARPENTER_POT_2] = Location::Pot(RC_GF_NORTH_F1_CARPENTER_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-512, -2621), "North F1 Carpenter Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F1_CARPENTER_POT_2)); - locationTable[RC_GF_NORTH_F1_CARPENTER_POT_3] = Location::Pot(RC_GF_NORTH_F1_CARPENTER_POT_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-511, -2582), "North F1 Carpenter Pot 3", RHT_POT_GERUDO_FORTRESS, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F1_CARPENTER_POT_3)); - locationTable[RC_GF_NORTH_F2_CARPENTER_POT_1] = Location::Pot(RC_GF_NORTH_F2_CARPENTER_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(67, -1975), "North F2 Carpenter Pot 1", RHT_POT_GERUDO_FORTRESS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F2_CARPENTER_POT_1)); - locationTable[RC_GF_NORTH_F2_CARPENTER_POT_2] = Location::Pot(RC_GF_NORTH_F2_CARPENTER_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(39, -1943), "North F2 Carpenter Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_NORTH_F2_CARPENTER_POT_2)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_POT_1] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(691, 48), "South F1 Carpenter Pot 1", RHT_POT_GERUDO_FORTRESS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_POT_1)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_POT_2] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(691, 16), "South F1 Carpenter Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_POT_2)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_POT_3] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_POT_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(661, 16), "South F1 Carpenter Pot 3", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_POT_3)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_CELL_POT_1] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(26, 524), "South F1 Carpenter Cell Pot 1", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_1)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_CELL_POT_2] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(61, 549), "South F1 Carpenter Cell Pot 2", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_2)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_CELL_POT_3] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(215, 549), "South F1 Carpenter Cell Pot 3", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_3)); - locationTable[RC_GF_SOUTH_F1_CARPENTER_CELL_POT_4] = Location::Pot(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(254, 529), "South F1 Carpenter Cell Pot 4", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_4)); - locationTable[RC_WASTELAND_NEAR_GS_POT_1] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_1, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(488, -2424), "Near GS Pot 1", RHT_POT_GERUDO_FORTRESS, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_1)); - locationTable[RC_WASTELAND_NEAR_GS_POT_2] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_2, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(485, -2463), "Near GS Pot 2", RHT_POT_GERUDO_FORTRESS, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_2)); - locationTable[RC_WASTELAND_NEAR_GS_POT_3] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_3, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(806, -2426), "Near GS Pot 3", RHT_POT_GERUDO_FORTRESS, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_3)); - locationTable[RC_WASTELAND_NEAR_GS_POT_4] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_4, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(801, -2460), "Near GS Pot 4", RHT_POT_GERUDO_FORTRESS, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_4)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_1] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-60, 27), "Guard House Child Pot 1", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_1)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_2] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-89, 28), "Guard House Child Pot 2", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_2)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_3] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-110, 6), "Guard House Child Pot 3", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_3)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_4] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-58, -7), "Guard House Child Pot 4", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_4)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_5] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-80, -7), "Guard House Child Pot 5", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_5)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_6] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_6, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-65, -45), "Guard House Child Pot 6", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_6)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_7] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_7, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-85, -41), "Guard House Child Pot 7", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_7)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_8] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_8, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-107, -45), "Guard House Child Pot 8", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_8)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_9] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_9, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-66, -79), "Guard House Child Pot 9", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_9)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_10] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_10, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-88, -84), "Guard House Child Pot 10", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_10)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_11] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_11, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(70, 215), "Guard House Child Pot 11", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_11)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_12] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_12, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(68, 148), "Guard House Child Pot 12", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_12)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_13] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_13, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(73, 117), "Guard House Child Pot 13", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_13)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_14] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_14, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(40, 123), "Guard House Child Pot 14", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_14)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_15] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_15, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(43, 89), "Guard House Child Pot 15", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_15)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_16] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_16, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(68, 81), "Guard House Child Pot 16", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_16)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_17] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_17, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(21, 73), "Guard House Child Pot 17", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_17)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_18] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_18, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(64, 45), "Guard House Child Pot 18", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_18)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_19] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_19, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(84, 31), "Guard House Child Pot 19", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_19)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_20] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_20, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(42, 26), "Guard House Child Pot 20", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_20)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_21] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_21, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(20, 34), "Guard House Child Pot 21", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_21)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_22] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_22, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(89, -2), "Guard House Child Pot 22", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_22)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_23] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_23, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(70, -12), "Guard House Child Pot 23", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_23)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_24] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_24, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(42, -5), "Guard House Child Pot 24", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_24)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_25] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_25, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(16, -6), "Guard House Child Pot 25", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_25)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_26] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_26, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(68, -44), "Guard House Child Pot 26", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_26)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_27] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_27, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(37, -40), "Guard House Child Pot 27", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_27)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_28] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_28, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(70, -80), "Guard House Child Pot 28", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_28)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_29] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_29, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(50, -74), "Guard House Child Pot 29", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_29)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_30] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_30, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(28, -79), "Guard House Child Pot 30", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_30)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_31] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_31, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(39, -111), "Guard House Child Pot 31", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_31)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_32] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_32, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(169, 216), "Guard House Child Pot 32", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_32)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_33] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_33, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(168, 166), "Guard House Child Pot 33", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_33)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_34] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_34, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, 120), "Guard House Child Pot 34", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_34)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_35] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_35, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(177, 85), "Guard House Child Pot 35", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_35)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_36] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_36, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(155, 39), "Guard House Child Pot 36", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_36)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_37] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_37, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(184, 13), "Guard House Child Pot 37", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_37)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_38] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_38, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(156, -1), "Guard House Child Pot 38", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_38)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_39] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_39, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(181, -33), "Guard House Child Pot 39", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_39)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_40] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_40, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(156, -45), "Guard House Child Pot 40", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_40)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_41] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_41, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(172, -82), "Guard House Child Pot 41", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_41)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_42] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_42, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, -120), "Guard House Child Pot 42", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_42)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_43] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_43, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, -166), "Guard House Child Pot 43", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_43)); - locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_44] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_44, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, -216), "Guard House Child Pot 44", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_44)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_1] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(61, 204), "Guard House Adult Pot 1", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_1)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_2] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(71, 132), "Guard House Adult Pot 2", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_2)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_3] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(74, 23), "Guard House Adult Pot 3", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_3)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_4] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(40, 4), "Guard House Adult Pot 4", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_4)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_5] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(71, -22), "Guard House Adult Pot 5", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_5)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_6] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_6, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(44, -151), "Guard House Adult Pot 6", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_6)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_7] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_7, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(79, -182), "Guard House Adult Pot 7", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_7)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_8] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_8, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(44, -198), "Guard House Adult Pot 8", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_8)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_9] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_9, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(168, 210), "Guard House Adult Pot 9", RHT_POT_MARKET, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_9)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_10] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_10, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(167, -122), "Guard House Adult Pot 10", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_10)); - locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_11] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_11, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(167, -210), "Guard House Adult Pot 11", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_11)); - locationTable[RC_MK_BACK_ALLEY_HOUSE_POT_1] = Location::Pot(RC_MK_BACK_ALLEY_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_BACK_ALLEY_HOUSE, TWO_ACTOR_PARAMS(100, 45), "Back Alley House Pot 1", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_1)); - locationTable[RC_MK_BACK_ALLEY_HOUSE_POT_2] = Location::Pot(RC_MK_BACK_ALLEY_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_BACK_ALLEY_HOUSE, TWO_ACTOR_PARAMS(12, -180), "Back Alley House Pot 2", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_2)); - locationTable[RC_MK_BACK_ALLEY_HOUSE_POT_3] = Location::Pot(RC_MK_BACK_ALLEY_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_BACK_ALLEY_HOUSE, TWO_ACTOR_PARAMS(-54, -180), "Back Alley House Pot 3", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_3)); - locationTable[RC_KAK_NEAR_POTION_SHOP_POT_1] = Location::Pot(RC_KAK_NEAR_POTION_SHOP_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(222, -377), "Near Potion Shop Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_POT_1)); - locationTable[RC_KAK_NEAR_POTION_SHOP_POT_2] = Location::Pot(RC_KAK_NEAR_POTION_SHOP_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(255, -366), "Near Potion Shop Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_POT_2)); - locationTable[RC_KAK_NEAR_POTION_SHOP_POT_3] = Location::Pot(RC_KAK_NEAR_POTION_SHOP_POT_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(284, -356), "Near Potion Shop Pot 3", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_POT_3)); - locationTable[RC_KAK_NEAR_IMPAS_HOUSE_POT_1] = Location::Pot(RC_KAK_NEAR_IMPAS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-384, 1568), "Near Impas House Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_1)); - locationTable[RC_KAK_NEAR_IMPAS_HOUSE_POT_2] = Location::Pot(RC_KAK_NEAR_IMPAS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-384, 1539), "Near Impas House Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_2)); - locationTable[RC_KAK_NEAR_IMPAS_HOUSE_POT_3] = Location::Pot(RC_KAK_NEAR_IMPAS_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-384, 1510), "Near Impas House Pot 3", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_3)); - locationTable[RC_KAK_NEAR_GUARDS_HOUSE_POT_1] = Location::Pot(RC_KAK_NEAR_GUARDS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-392, -870), "Near Guards House Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_1)); - locationTable[RC_KAK_NEAR_GUARDS_HOUSE_POT_2] = Location::Pot(RC_KAK_NEAR_GUARDS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-422, -883), "Near Guards House Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_2)); - locationTable[RC_KAK_NEAR_GUARDS_HOUSE_POT_3] = Location::Pot(RC_KAK_NEAR_GUARDS_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-450, -895), "Near Guards House Pot 3", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_3)); - locationTable[RC_KAK_NEAR_MEDICINE_SHOP_POT_1] = Location::Pot(RC_KAK_NEAR_MEDICINE_SHOP_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(781, 89), "Near Medicine Shop Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_1)); - locationTable[RC_KAK_NEAR_MEDICINE_SHOP_POT_2] = Location::Pot(RC_KAK_NEAR_MEDICINE_SHOP_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(815, 89), "Near Medicine Shop Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_2)); - locationTable[RC_GY_DAMPES_GRAVE_POT_1] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(-319, -1542), "Dampes Grave Pot 1", RHT_POT_GRAVEYARD, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_1)); - locationTable[RC_GY_DAMPES_GRAVE_POT_2] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(-319, -1600), "Dampes Grave Pot 2", RHT_POT_GRAVEYARD, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_2)); - locationTable[RC_GY_DAMPES_GRAVE_POT_3] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(-364, -1571), "Dampes Grave Pot 3", RHT_POT_GRAVEYARD, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_3)); - locationTable[RC_GY_DAMPES_GRAVE_POT_4] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_4, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(198, -1540), "Dampes Grave Pot 4", RHT_POT_GRAVEYARD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_4)); - locationTable[RC_GY_DAMPES_GRAVE_POT_5] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_5, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(198, -1608), "Dampes Grave Pot 5", RHT_POT_GRAVEYARD, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_5)); - locationTable[RC_GY_DAMPES_GRAVE_POT_6] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_6, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(239, -1577), "Dampes Grave Pot 6", RHT_POT_GRAVEYARD, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_6)); - locationTable[RC_GC_LOWER_STAIRCASE_POT_1] = Location::Pot(RC_GC_LOWER_STAIRCASE_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-189, 866), "Lower Staircase Pot 1", RHT_POT_GORON_CITY, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_LOWER_STAIRCASE_POT_1)); - locationTable[RC_GC_LOWER_STAIRCASE_POT_2] = Location::Pot(RC_GC_LOWER_STAIRCASE_POT_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-271, 825), "Lower Staircase Pot 2", RHT_POT_GORON_CITY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_LOWER_STAIRCASE_POT_2)); - locationTable[RC_GC_UPPER_STAIRCASE_POT_1] = Location::Pot(RC_GC_UPPER_STAIRCASE_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1170, 60), "Upper Staircase Pot 1", RHT_POT_GORON_CITY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_UPPER_STAIRCASE_POT_1)); - locationTable[RC_GC_UPPER_STAIRCASE_POT_2] = Location::Pot(RC_GC_UPPER_STAIRCASE_POT_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1185, 95), "Upper Staircase Pot 2", RHT_POT_GORON_CITY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_UPPER_STAIRCASE_POT_2)); - locationTable[RC_GC_UPPER_STAIRCASE_POT_3] = Location::Pot(RC_GC_UPPER_STAIRCASE_POT_3, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1200, 63), "Upper Staircase Pot 3", RHT_POT_GORON_CITY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_UPPER_STAIRCASE_POT_3)); - locationTable[RC_GC_MEDIGORON_POT_1] = Location::Pot(RC_GC_MEDIGORON_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-694, 1196), "Medigoron Pot 1", RHT_POT_GORON_CITY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MEDIGORON_POT_1)); - locationTable[RC_GC_DARUNIA_POT_1] = Location::Pot(RC_GC_DARUNIA_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(262, -1210), "Darunia Pot 1", RHT_POT_GORON_CITY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_DARUNIA_POT_1)); - locationTable[RC_GC_DARUNIA_POT_2] = Location::Pot(RC_GC_DARUNIA_POT_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(261, -1254), "Darunia Pot 2", RHT_POT_GORON_CITY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_DARUNIA_POT_2)); - locationTable[RC_GC_DARUNIA_POT_3] = Location::Pot(RC_GC_DARUNIA_POT_3, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(262, -1386), "Darunia Pot 3", RHT_POT_GORON_CITY, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_DARUNIA_POT_3)); - locationTable[RC_DMC_NEAR_GC_POT_2] = Location::Pot(RC_DMC_NEAR_GC_POT_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1546, 141), "Near GC Pot 2", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_2)); - locationTable[RC_DMC_NEAR_GC_POT_3] = Location::Pot(RC_DMC_NEAR_GC_POT_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1641, -127), "Near GC Pot 3", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_3)); - locationTable[RC_DMC_NEAR_GC_POT_1] = Location::Pot(RC_DMC_NEAR_GC_POT_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1590, 132), "Near GC Pot 1", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_1)); - locationTable[RC_DMC_NEAR_GC_POT_4] = Location::Pot(RC_DMC_NEAR_GC_POT_4, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1606, -166), "Near GC Pot 4", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_4)); - locationTable[RC_ZD_NEAR_SHOP_POT_1] = Location::Pot(RC_ZD_NEAR_SHOP_POT_1, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(676, 377), "Near Shop Pot 1", RHT_POT_ZORAS_DOMAIN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_1)); - locationTable[RC_ZD_NEAR_SHOP_POT_2] = Location::Pot(RC_ZD_NEAR_SHOP_POT_2, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(614, 419), "Near Shop Pot 2", RHT_POT_ZORAS_DOMAIN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_2)); - locationTable[RC_ZD_NEAR_SHOP_POT_3] = Location::Pot(RC_ZD_NEAR_SHOP_POT_3, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(289, 415), "Near Shop Pot 3", RHT_POT_ZORAS_DOMAIN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_3)); - locationTable[RC_ZD_NEAR_SHOP_POT_4] = Location::Pot(RC_ZD_NEAR_SHOP_POT_4, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(289, 289), "Near Shop Pot 4", RHT_POT_ZORAS_DOMAIN, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_4)); - locationTable[RC_ZD_NEAR_SHOP_POT_5] = Location::Pot(RC_ZD_NEAR_SHOP_POT_5, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(220, 384), "Near Shop Pot 5", RHT_POT_ZORAS_DOMAIN, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_5)); - locationTable[RC_ZF_HIDDEN_CAVE_POT_1] = Location::Pot(RC_ZF_HIDDEN_CAVE_POT_1, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(385, 2587), "Hidden Cave Pot 1", RHT_POT_ZORAS_FOUNTAIN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_HIDDEN_CAVE_POT_1)); - locationTable[RC_ZF_HIDDEN_CAVE_POT_2] = Location::Pot(RC_ZF_HIDDEN_CAVE_POT_2, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(418, 2609), "Hidden Cave Pot 2", RHT_POT_ZORAS_FOUNTAIN, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_HIDDEN_CAVE_POT_2)); - locationTable[RC_ZF_HIDDEN_CAVE_POT_3] = Location::Pot(RC_ZF_HIDDEN_CAVE_POT_3, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(430, 2568), "Hidden Cave Pot 3", RHT_POT_ZORAS_FOUNTAIN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_HIDDEN_CAVE_POT_3)); - locationTable[RC_ZF_NEAR_JABU_POT_1] = Location::Pot(RC_ZF_NEAR_JABU_POT_1, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1630, 170), "Near Jabu Pot 1", RHT_POT_ZORAS_FOUNTAIN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_1)); - locationTable[RC_ZF_NEAR_JABU_POT_2] = Location::Pot(RC_ZF_NEAR_JABU_POT_2, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1550, 170), "Near Jabu Pot 2", RHT_POT_ZORAS_FOUNTAIN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_2)); - locationTable[RC_ZF_NEAR_JABU_POT_3] = Location::Pot(RC_ZF_NEAR_JABU_POT_3, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1630, -260), "Near Jabu Pot 3", RHT_POT_ZORAS_FOUNTAIN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_3)); - locationTable[RC_ZF_NEAR_JABU_POT_4] = Location::Pot(RC_ZF_NEAR_JABU_POT_4, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1550, -260), "Near Jabu Pot 4", RHT_POT_ZORAS_FOUNTAIN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_4)); - locationTable[RC_LLR_FRONT_POT_1] = Location::Pot(RC_LLR_FRONT_POT_1, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3218), "Front Pot 1", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_1)); - locationTable[RC_LLR_FRONT_POT_2] = Location::Pot(RC_LLR_FRONT_POT_2, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3186), "Front Pot 2", RHT_POT_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_2)); - locationTable[RC_LLR_FRONT_POT_3] = Location::Pot(RC_LLR_FRONT_POT_3, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3154), "Front Pot 3", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_3)); - locationTable[RC_LLR_FRONT_POT_4] = Location::Pot(RC_LLR_FRONT_POT_4, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3122), "Front Pot 4", RHT_POT_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_4)); - locationTable[RC_LLR_RAIN_SHED_POT_1] = Location::Pot(RC_LLR_RAIN_SHED_POT_1, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(852, 172), "Rain Shed Pot 1", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_RAIN_SHED_POT_1)); - locationTable[RC_LLR_RAIN_SHED_POT_2] = Location::Pot(RC_LLR_RAIN_SHED_POT_2, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(840, 212), "Rain Shed Pot 2", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_RAIN_SHED_POT_2)); - locationTable[RC_LLR_RAIN_SHED_POT_3] = Location::Pot(RC_LLR_RAIN_SHED_POT_3, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(872, 219), "Rain Shed Pot 3", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_RAIN_SHED_POT_3)); - locationTable[RC_LLR_TALONS_HOUSE_POT_1] = Location::Pot(RC_LLR_TALONS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(1255, 47), "Talons House Pot 1", RHT_POT_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_TALONS_HOUSE_POT_1)); - locationTable[RC_LLR_TALONS_HOUSE_POT_2] = Location::Pot(RC_LLR_TALONS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(1256, -51), "Talons House Pot 2", RHT_POT_LON_LON_RANCH, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_TALONS_HOUSE_POT_2)); - locationTable[RC_LLR_TALONS_HOUSE_POT_3] = Location::Pot(RC_LLR_TALONS_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(1256, -78), "Talons House Pot 3", RHT_POT_LON_LON_RANCH, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_TALONS_HOUSE_POT_3)); - locationTable[RC_HF_COW_GROTTO_POT_1] = Location::Pot(RC_HF_COW_GROTTO_POT_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3410, -223), "Cow Grotto Pot 1", RHT_POT_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_POT_1)); - locationTable[RC_HF_COW_GROTTO_POT_2] = Location::Pot(RC_HF_COW_GROTTO_POT_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3390, -258), "Cow Grotto Pot 2", RHT_POT_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_POT_2)); - locationTable[RC_HC_STORMS_GROTTO_POT_1] = Location::Pot(RC_HC_STORMS_GROTTO_POT_1, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1843, 1014), "Storms Grotto Pot 1", RHT_POT_HYRULE_CASTLE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_1)); - locationTable[RC_HC_STORMS_GROTTO_POT_2] = Location::Pot(RC_HC_STORMS_GROTTO_POT_2, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1769, 954), "Storms Grotto Pot 2", RHT_POT_HYRULE_CASTLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_2)); - locationTable[RC_HC_STORMS_GROTTO_POT_3] = Location::Pot(RC_HC_STORMS_GROTTO_POT_3, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1857, 897), "Storms Grotto Pot 3", RHT_POT_HYRULE_CASTLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_3)); - locationTable[RC_HC_STORMS_GROTTO_POT_4] = Location::Pot(RC_HC_STORMS_GROTTO_POT_4, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1764, 847), "Storms Grotto Pot 4", RHT_POT_HYRULE_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_4)); - + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_KF_LINKS_HOUSE_POT] = Location::Pot(RC_KF_LINKS_HOUSE_POT, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_LINKS_HOUSE, TWO_ACTOR_PARAMS(-118, 51), "Links House Pot", RHT_POT_KOKIRI_FOREST, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_LINKS_HOUSE_POT)); + locationTable[RC_KF_TWINS_HOUSE_POT_2] = Location::Pot(RC_KF_TWINS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_TWINS_HOUSE, TWO_ACTOR_PARAMS(35, 57), "Twins House Pot 2", RHT_POT_KOKIRI_FOREST, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_TWINS_HOUSE_POT_2)); + locationTable[RC_KF_TWINS_HOUSE_POT_1] = Location::Pot(RC_KF_TWINS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_TWINS_HOUSE, TWO_ACTOR_PARAMS(33, -55), "Twins House Pot 1", RHT_POT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_TWINS_HOUSE_POT_1)); + locationTable[RC_KF_BROTHERS_HOUSE_POT_1] = Location::Pot(RC_KF_BROTHERS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KNOW_IT_ALL_BROS_HOUSE, TWO_ACTOR_PARAMS(-134, -29), "Brothers House Pot 1", RHT_POT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BROTHERS_HOUSE_POT_1)); + locationTable[RC_KF_BROTHERS_HOUSE_POT_2] = Location::Pot(RC_KF_BROTHERS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KNOW_IT_ALL_BROS_HOUSE, TWO_ACTOR_PARAMS(-68, 114), "Brothers House Pot 2", RHT_POT_KOKIRI_FOREST, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BROTHERS_HOUSE_POT_2)); + locationTable[RC_TH_BREAK_ROOM_FRONT_POT] = Location::Pot(RC_TH_BREAK_ROOM_FRONT_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1438, -3629), "Break Room Front Pot", RHT_TH_BREAK_ROOM_FRONT_POT, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_BREAK_ROOM_FRONT_POT)); + locationTable[RC_TH_BREAK_ROOM_BACK_POT] = Location::Pot(RC_TH_BREAK_ROOM_BACK_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1403, -3679), "Break Room Back Pot", RHT_TH_BREAK_ROOM_BACK_POT, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_BREAK_ROOM_BACK_POT)); + locationTable[RC_TH_KITCHEN_POT_1] = Location::Pot(RC_TH_KITCHEN_POT_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1908, -789), "Kitchen Pot 1", RHT_TH_KITCHEN_POT_1, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_KITCHEN_POT_1)); + locationTable[RC_TH_KITCHEN_POT_2] = Location::Pot(RC_TH_KITCHEN_POT_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(1951, -850), "Kitchen Pot 2", RHT_TH_KITCHEN_POT_2, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_KITCHEN_POT_2)); + locationTable[RC_TH_1_TORCH_CELL_RIGHT_POT] = Location::Pot(RC_TH_1_TORCH_CELL_RIGHT_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-475, -2622), "1 Torch Cell Right Pot", RHT_TH_1_TORCH_CELL_RIGHT_POT, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_1_TORCH_CELL_RIGHT_POT)); + locationTable[RC_TH_1_TORCH_CELL_MID_POT] = Location::Pot(RC_TH_1_TORCH_CELL_MID_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-512, -2621), "1 Torch Cell Middle Pot", RHT_TH_1_TORCH_CELL_MID_POT, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_1_TORCH_CELL_MID_POT)); + locationTable[RC_TH_1_TORCH_CELL_LEFT_POT] = Location::Pot(RC_TH_1_TORCH_CELL_LEFT_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(-511, -2582), "1 Torch Cell Left Pot", RHT_TH_1_TORCH_CELL_LEFT_POT, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_1_TORCH_CELL_LEFT_POT)); + locationTable[RC_TH_STEEP_SLOPE_RIGHT_POT] = Location::Pot(RC_TH_STEEP_SLOPE_RIGHT_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(67, -1975), "Steep Slope Right Pot", RHT_TH_STEEP_SLOPE_RIGHT_POT, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_STEEP_SLOPE_RIGHT_POT)); + locationTable[RC_TH_STEEP_SLOPE_LEFT_POT] = Location::Pot(RC_TH_STEEP_SLOPE_LEFT_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(39, -1943), "Steep Slope Left Pot", RHT_TH_STEEP_SLOPE_LEFT_POT, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_STEEP_SLOPE_LEFT_POT)); + locationTable[RC_TH_NEAR_DOUBLE_CELL_RIGHT_POT] = Location::Pot(RC_TH_NEAR_DOUBLE_CELL_RIGHT_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(691, 48), "Double Cell Right Pot", RHT_TH_NEAR_DOUBLE_CELL_RIGHT_POT, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_NEAR_DOUBLE_CELL_RIGHT_POT)); + locationTable[RC_TH_NEAR_DOUBLE_CELL_MID_POT] = Location::Pot(RC_TH_NEAR_DOUBLE_CELL_MID_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(691, 16), "Double Cell Middle Pot", RHT_TH_NEAR_DOUBLE_CELL_MID_POT, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_NEAR_DOUBLE_CELL_MID_POT)); + locationTable[RC_TH_NEAR_DOUBLE_CELL_LEFT_POT] = Location::Pot(RC_TH_NEAR_DOUBLE_CELL_LEFT_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(661, 16), "Double Cell Left Pot", RHT_TH_NEAR_DOUBLE_CELL_LEFT_POT, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_NEAR_DOUBLE_CELL_LEFT_POT)); + locationTable[RC_TH_RIGHTMOST_JAILED_POT] = Location::Pot(RC_TH_RIGHTMOST_JAILED_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(26, 524), "Rightmost Jailed Pot", RHT_TH_RIGHTMOST_JAILED_POT, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_RIGHTMOST_JAILED_POT)); + locationTable[RC_TH_RIGHT_MIDDLE_JAILED_POT] = Location::Pot(RC_TH_RIGHT_MIDDLE_JAILED_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(61, 549), "Right Middle Jailed Pot", RHT_TH_LEFT_MIDDLE_JAILED_POT, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_RIGHT_MIDDLE_JAILED_POT)); + locationTable[RC_TH_LEFT_MIDDLE_JAILED_POT] = Location::Pot(RC_TH_LEFT_MIDDLE_JAILED_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(215, 549), "Left Middle Jailed Pot", RHT_TH_RIGHT_MIDDLE_JAILED_POT, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_LEFT_MIDDLE_JAILED_POT)); + locationTable[RC_TH_LEFTMOST_JAILED_POT] = Location::Pot(RC_TH_LEFTMOST_JAILED_POT, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_THIEVES_HIDEOUT, TWO_ACTOR_PARAMS(254, 529), "Leftmost Jailed Pot", RHT_TH_LEFTMOST_JAILED_POT, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_LEFTMOST_JAILED_POT)); + locationTable[RC_WASTELAND_NEAR_GS_POT_1] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_1, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(488, -2424), "Near GS Pot 1", RHT_POT_WASTELAND, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_1)); + locationTable[RC_WASTELAND_NEAR_GS_POT_2] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_2, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(485, -2463), "Near GS Pot 2", RHT_POT_WASTELAND, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_2)); + locationTable[RC_WASTELAND_NEAR_GS_POT_3] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_3, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(806, -2426), "Near GS Pot 3", RHT_POT_WASTELAND, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_3)); + locationTable[RC_WASTELAND_NEAR_GS_POT_4] = Location::Pot(RC_WASTELAND_NEAR_GS_POT_4, RCQUEST_BOTH, RCAREA_WASTELAND, SCENE_HAUNTED_WASTELAND, TWO_ACTOR_PARAMS(801, -2460), "Near GS Pot 4", RHT_POT_WASTELAND, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WASTELAND_NEAR_GS_POT_4)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_1] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-60, 27), "Guard House Child Pot 1", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_1)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_2] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-89, 28), "Guard House Child Pot 2", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_2)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_3] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-110, 6), "Guard House Child Pot 3", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_3)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_4] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-58, -7), "Guard House Child Pot 4", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_4)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_5] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-80, -7), "Guard House Child Pot 5", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_5)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_6] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_6, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-65, -45), "Guard House Child Pot 6", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_6)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_7] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_7, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-85, -41), "Guard House Child Pot 7", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_7)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_8] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_8, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-107, -45), "Guard House Child Pot 8", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_8)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_9] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_9, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-66, -79), "Guard House Child Pot 9", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_9)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_10] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_10, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(-88, -84), "Guard House Child Pot 10", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_10)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_11] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_11, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(70, 215), "Guard House Child Pot 11", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_11)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_12] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_12, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(68, 148), "Guard House Child Pot 12", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_12)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_13] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_13, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(73, 117), "Guard House Child Pot 13", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_13)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_14] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_14, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(40, 123), "Guard House Child Pot 14", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_14)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_15] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_15, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(43, 89), "Guard House Child Pot 15", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_15)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_16] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_16, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(68, 81), "Guard House Child Pot 16", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_16)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_17] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_17, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(21, 73), "Guard House Child Pot 17", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_17)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_18] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_18, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(64, 45), "Guard House Child Pot 18", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_18)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_19] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_19, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(84, 31), "Guard House Child Pot 19", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_19)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_20] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_20, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(42, 26), "Guard House Child Pot 20", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_20)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_21] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_21, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(20, 34), "Guard House Child Pot 21", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_21)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_22] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_22, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(89, -2), "Guard House Child Pot 22", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_22)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_23] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_23, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(70, -12), "Guard House Child Pot 23", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_23)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_24] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_24, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(42, -5), "Guard House Child Pot 24", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_24)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_25] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_25, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(16, -6), "Guard House Child Pot 25", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_25)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_26] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_26, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(68, -44), "Guard House Child Pot 26", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_26)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_27] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_27, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(37, -40), "Guard House Child Pot 27", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_27)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_28] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_28, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(70, -80), "Guard House Child Pot 28", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_28)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_29] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_29, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(50, -74), "Guard House Child Pot 29", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_29)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_30] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_30, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(28, -79), "Guard House Child Pot 30", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_30)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_31] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_31, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(39, -111), "Guard House Child Pot 31", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_31)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_32] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_32, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(169, 216), "Guard House Child Pot 32", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_32)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_33] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_33, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(168, 166), "Guard House Child Pot 33", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_33)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_34] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_34, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, 120), "Guard House Child Pot 34", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_34)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_35] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_35, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(177, 85), "Guard House Child Pot 35", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_35)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_36] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_36, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(155, 39), "Guard House Child Pot 36", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_36)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_37] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_37, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(184, 13), "Guard House Child Pot 37", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_37)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_38] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_38, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(156, -1), "Guard House Child Pot 38", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_38)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_39] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_39, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(181, -33), "Guard House Child Pot 39", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_39)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_40] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_40, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(156, -45), "Guard House Child Pot 40", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_40)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_41] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_41, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(172, -82), "Guard House Child Pot 41", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_41)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_42] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_42, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, -120), "Guard House Child Pot 42", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_42)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_43] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_43, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, -166), "Guard House Child Pot 43", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_43)); + locationTable[RC_MK_GUARD_HOUSE_CHILD_POT_44] = Location::Pot(RC_MK_GUARD_HOUSE_CHILD_POT_44, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(170, -216), "Guard House Child Pot 44", RHT_POT_MARKET, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_CHILD_POT_44)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_1] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(61, 204), "Guard House Adult Pot 1", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_1)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_2] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(71, 132), "Guard House Adult Pot 2", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_2)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_3] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(74, 23), "Guard House Adult Pot 3", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_3)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_4] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_4, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(40, 4), "Guard House Adult Pot 4", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_4)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_5] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_5, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(71, -22), "Guard House Adult Pot 5", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_5)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_6] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_6, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(44, -151), "Guard House Adult Pot 6", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_6)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_7] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_7, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(79, -182), "Guard House Adult Pot 7", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_7)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_8] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_8, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(44, -198), "Guard House Adult Pot 8", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_8)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_9] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_9, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(168, 210), "Guard House Adult Pot 9", RHT_POT_MARKET, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_9)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_10] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_10, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(167, -122), "Guard House Adult Pot 10", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_10)); + locationTable[RC_MK_GUARD_HOUSE_ADULT_POT_11] = Location::Pot(RC_MK_GUARD_HOUSE_ADULT_POT_11, RCQUEST_BOTH, RCAREA_MARKET, SCENE_MARKET_GUARD_HOUSE, TWO_ACTOR_PARAMS(167, -210), "Guard House Adult Pot 11", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_GUARD_HOUSE_ADULT_POT_11)); + locationTable[RC_MK_BACK_ALLEY_HOUSE_POT_1] = Location::Pot(RC_MK_BACK_ALLEY_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_MARKET, SCENE_BACK_ALLEY_HOUSE, TWO_ACTOR_PARAMS(100, 45), "Back Alley House Pot 1", RHT_POT_MARKET, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_1)); + locationTable[RC_MK_BACK_ALLEY_HOUSE_POT_2] = Location::Pot(RC_MK_BACK_ALLEY_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_MARKET, SCENE_BACK_ALLEY_HOUSE, TWO_ACTOR_PARAMS(12, -180), "Back Alley House Pot 2", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_2)); + locationTable[RC_MK_BACK_ALLEY_HOUSE_POT_3] = Location::Pot(RC_MK_BACK_ALLEY_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_MARKET, SCENE_BACK_ALLEY_HOUSE, TWO_ACTOR_PARAMS(-54, -180), "Back Alley House Pot 3", RHT_POT_MARKET, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MK_BACK_ALLEY_HOUSE_POT_3)); + locationTable[RC_KAK_NEAR_POTION_SHOP_POT_1] = Location::Pot(RC_KAK_NEAR_POTION_SHOP_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(222, -377), "Near Potion Shop Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_POT_1)); + locationTable[RC_KAK_NEAR_POTION_SHOP_POT_2] = Location::Pot(RC_KAK_NEAR_POTION_SHOP_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(255, -366), "Near Potion Shop Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_POT_2)); + locationTable[RC_KAK_NEAR_POTION_SHOP_POT_3] = Location::Pot(RC_KAK_NEAR_POTION_SHOP_POT_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(284, -356), "Near Potion Shop Pot 3", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_POTION_SHOP_POT_3)); + locationTable[RC_KAK_NEAR_IMPAS_HOUSE_POT_1] = Location::Pot(RC_KAK_NEAR_IMPAS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-384, 1568), "Near Impas House Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_1)); + locationTable[RC_KAK_NEAR_IMPAS_HOUSE_POT_2] = Location::Pot(RC_KAK_NEAR_IMPAS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-384, 1539), "Near Impas House Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_2)); + locationTable[RC_KAK_NEAR_IMPAS_HOUSE_POT_3] = Location::Pot(RC_KAK_NEAR_IMPAS_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-384, 1510), "Near Impas House Pot 3", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_IMPAS_HOUSE_POT_3)); + locationTable[RC_KAK_NEAR_GUARDS_HOUSE_POT_1] = Location::Pot(RC_KAK_NEAR_GUARDS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-392, -870), "Near Guards House Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_1)); + locationTable[RC_KAK_NEAR_GUARDS_HOUSE_POT_2] = Location::Pot(RC_KAK_NEAR_GUARDS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-422, -883), "Near Guards House Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_2)); + locationTable[RC_KAK_NEAR_GUARDS_HOUSE_POT_3] = Location::Pot(RC_KAK_NEAR_GUARDS_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(-450, -895), "Near Guards House Pot 3", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_GUARDS_HOUSE_POT_3)); + locationTable[RC_KAK_NEAR_MEDICINE_SHOP_POT_1] = Location::Pot(RC_KAK_NEAR_MEDICINE_SHOP_POT_1, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(781, 89), "Near Medicine Shop Pot 1", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_1)); + locationTable[RC_KAK_NEAR_MEDICINE_SHOP_POT_2] = Location::Pot(RC_KAK_NEAR_MEDICINE_SHOP_POT_2, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_KAKARIKO_VILLAGE, TWO_ACTOR_PARAMS(815, 89), "Near Medicine Shop Pot 2", RHT_POT_KAKARIKO, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KAK_NEAR_MEDICINE_SHOP_POT_2)); + locationTable[RC_GY_DAMPES_GRAVE_POT_1] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(-319, -1542), "Dampes Grave Pot 1", RHT_POT_GRAVEYARD, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_1)); + locationTable[RC_GY_DAMPES_GRAVE_POT_2] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(-319, -1600), "Dampes Grave Pot 2", RHT_POT_GRAVEYARD, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_2)); + locationTable[RC_GY_DAMPES_GRAVE_POT_3] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(-364, -1571), "Dampes Grave Pot 3", RHT_POT_GRAVEYARD, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_3)); + locationTable[RC_GY_DAMPES_GRAVE_POT_4] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_4, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(198, -1540), "Dampes Grave Pot 4", RHT_POT_GRAVEYARD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_4)); + locationTable[RC_GY_DAMPES_GRAVE_POT_5] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_5, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(198, -1608), "Dampes Grave Pot 5", RHT_POT_GRAVEYARD, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_5)); + locationTable[RC_GY_DAMPES_GRAVE_POT_6] = Location::Pot(RC_GY_DAMPES_GRAVE_POT_6, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_WINDMILL_AND_DAMPES_GRAVE, TWO_ACTOR_PARAMS(239, -1577), "Dampes Grave Pot 6", RHT_POT_GRAVEYARD, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GY_DAMPES_GRAVE_POT_6)); + locationTable[RC_GC_LOWER_STAIRCASE_POT_1] = Location::Pot(RC_GC_LOWER_STAIRCASE_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-189, 866), "Lower Staircase Pot 1", RHT_POT_GORON_CITY, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_LOWER_STAIRCASE_POT_1)); + locationTable[RC_GC_LOWER_STAIRCASE_POT_2] = Location::Pot(RC_GC_LOWER_STAIRCASE_POT_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-271, 825), "Lower Staircase Pot 2", RHT_POT_GORON_CITY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_LOWER_STAIRCASE_POT_2)); + locationTable[RC_GC_UPPER_STAIRCASE_POT_1] = Location::Pot(RC_GC_UPPER_STAIRCASE_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1170, 60), "Upper Staircase Pot 1", RHT_POT_GORON_CITY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_UPPER_STAIRCASE_POT_1)); + locationTable[RC_GC_UPPER_STAIRCASE_POT_2] = Location::Pot(RC_GC_UPPER_STAIRCASE_POT_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1185, 95), "Upper Staircase Pot 2", RHT_POT_GORON_CITY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_UPPER_STAIRCASE_POT_2)); + locationTable[RC_GC_UPPER_STAIRCASE_POT_3] = Location::Pot(RC_GC_UPPER_STAIRCASE_POT_3, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-1200, 63), "Upper Staircase Pot 3", RHT_POT_GORON_CITY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_UPPER_STAIRCASE_POT_3)); + locationTable[RC_GC_MEDIGORON_POT_1] = Location::Pot(RC_GC_MEDIGORON_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(-694, 1196), "Medigoron Pot 1", RHT_POT_GORON_CITY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_MEDIGORON_POT_1)); + locationTable[RC_GC_DARUNIA_POT_1] = Location::Pot(RC_GC_DARUNIA_POT_1, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(262, -1210), "Darunia Pot 1", RHT_POT_GORON_CITY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_DARUNIA_POT_1)); + locationTable[RC_GC_DARUNIA_POT_2] = Location::Pot(RC_GC_DARUNIA_POT_2, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(261, -1254), "Darunia Pot 2", RHT_POT_GORON_CITY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_DARUNIA_POT_2)); + locationTable[RC_GC_DARUNIA_POT_3] = Location::Pot(RC_GC_DARUNIA_POT_3, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(262, -1386), "Darunia Pot 3", RHT_POT_GORON_CITY, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GC_DARUNIA_POT_3)); + locationTable[RC_DMC_NEAR_GC_POT_2] = Location::Pot(RC_DMC_NEAR_GC_POT_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1546, 141), "Near GC Pot 2", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_2)); + locationTable[RC_DMC_NEAR_GC_POT_3] = Location::Pot(RC_DMC_NEAR_GC_POT_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1641, -127), "Near GC Pot 3", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_3)); + locationTable[RC_DMC_NEAR_GC_POT_1] = Location::Pot(RC_DMC_NEAR_GC_POT_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1590, 132), "Near GC Pot 1", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_1)); + locationTable[RC_DMC_NEAR_GC_POT_4] = Location::Pot(RC_DMC_NEAR_GC_POT_4, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(-1606, -166), "Near GC Pot 4", RHT_POT_DEATH_MOUNTAIN_CRATER, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_GC_POT_4)); + locationTable[RC_ZD_NEAR_SHOP_POT_1] = Location::Pot(RC_ZD_NEAR_SHOP_POT_1, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(676, 377), "Near Shop Pot 1", RHT_POT_ZORAS_DOMAIN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_1)); + locationTable[RC_ZD_NEAR_SHOP_POT_2] = Location::Pot(RC_ZD_NEAR_SHOP_POT_2, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(614, 419), "Near Shop Pot 2", RHT_POT_ZORAS_DOMAIN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_2)); + locationTable[RC_ZD_NEAR_SHOP_POT_3] = Location::Pot(RC_ZD_NEAR_SHOP_POT_3, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(289, 415), "Near Shop Pot 3", RHT_POT_ZORAS_DOMAIN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_3)); + locationTable[RC_ZD_NEAR_SHOP_POT_4] = Location::Pot(RC_ZD_NEAR_SHOP_POT_4, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(289, 289), "Near Shop Pot 4", RHT_POT_ZORAS_DOMAIN, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_4)); + locationTable[RC_ZD_NEAR_SHOP_POT_5] = Location::Pot(RC_ZD_NEAR_SHOP_POT_5, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(220, 384), "Near Shop Pot 5", RHT_POT_ZORAS_DOMAIN, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_NEAR_SHOP_POT_5)); + locationTable[RC_ZF_HIDDEN_CAVE_POT_1] = Location::Pot(RC_ZF_HIDDEN_CAVE_POT_1, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(385, 2587), "Hidden Cave Pot 1", RHT_POT_ZORAS_FOUNTAIN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_HIDDEN_CAVE_POT_1)); + locationTable[RC_ZF_HIDDEN_CAVE_POT_2] = Location::Pot(RC_ZF_HIDDEN_CAVE_POT_2, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(418, 2609), "Hidden Cave Pot 2", RHT_POT_ZORAS_FOUNTAIN, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_HIDDEN_CAVE_POT_2)); + locationTable[RC_ZF_HIDDEN_CAVE_POT_3] = Location::Pot(RC_ZF_HIDDEN_CAVE_POT_3, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(430, 2568), "Hidden Cave Pot 3", RHT_POT_ZORAS_FOUNTAIN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_HIDDEN_CAVE_POT_3)); + locationTable[RC_ZF_NEAR_JABU_POT_1] = Location::Pot(RC_ZF_NEAR_JABU_POT_1, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1630, 170), "Near Jabu Pot 1", RHT_POT_ZORAS_FOUNTAIN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_1)); + locationTable[RC_ZF_NEAR_JABU_POT_2] = Location::Pot(RC_ZF_NEAR_JABU_POT_2, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1550, 170), "Near Jabu Pot 2", RHT_POT_ZORAS_FOUNTAIN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_2)); + locationTable[RC_ZF_NEAR_JABU_POT_3] = Location::Pot(RC_ZF_NEAR_JABU_POT_3, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1630, -260), "Near Jabu Pot 3", RHT_POT_ZORAS_FOUNTAIN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_3)); + locationTable[RC_ZF_NEAR_JABU_POT_4] = Location::Pot(RC_ZF_NEAR_JABU_POT_4, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(-1550, -260), "Near Jabu Pot 4", RHT_POT_ZORAS_FOUNTAIN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_NEAR_JABU_POT_4)); + locationTable[RC_LLR_FRONT_POT_1] = Location::Pot(RC_LLR_FRONT_POT_1, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3218), "Front Pot 1", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_1)); + locationTable[RC_LLR_FRONT_POT_2] = Location::Pot(RC_LLR_FRONT_POT_2, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3186), "Front Pot 2", RHT_POT_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_2)); + locationTable[RC_LLR_FRONT_POT_3] = Location::Pot(RC_LLR_FRONT_POT_3, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3154), "Front Pot 3", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_3)); + locationTable[RC_LLR_FRONT_POT_4] = Location::Pot(RC_LLR_FRONT_POT_4, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(667, -3122), "Front Pot 4", RHT_POT_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_FRONT_POT_4)); + locationTable[RC_LLR_RAIN_SHED_POT_1] = Location::Pot(RC_LLR_RAIN_SHED_POT_1, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(852, 172), "Rain Shed Pot 1", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_RAIN_SHED_POT_1)); + locationTable[RC_LLR_RAIN_SHED_POT_2] = Location::Pot(RC_LLR_RAIN_SHED_POT_2, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(840, 212), "Rain Shed Pot 2", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_RAIN_SHED_POT_2)); + locationTable[RC_LLR_RAIN_SHED_POT_3] = Location::Pot(RC_LLR_RAIN_SHED_POT_3, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_RANCH, TWO_ACTOR_PARAMS(872, 219), "Rain Shed Pot 3", RHT_POT_LON_LON_RANCH, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_RAIN_SHED_POT_3)); + locationTable[RC_LLR_TALONS_HOUSE_POT_1] = Location::Pot(RC_LLR_TALONS_HOUSE_POT_1, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(1255, 47), "Talons House Pot 1", RHT_POT_LON_LON_RANCH, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_TALONS_HOUSE_POT_1)); + locationTable[RC_LLR_TALONS_HOUSE_POT_2] = Location::Pot(RC_LLR_TALONS_HOUSE_POT_2, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(1256, -51), "Talons House Pot 2", RHT_POT_LON_LON_RANCH, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_TALONS_HOUSE_POT_2)); + locationTable[RC_LLR_TALONS_HOUSE_POT_3] = Location::Pot(RC_LLR_TALONS_HOUSE_POT_3, RCQUEST_BOTH, RCAREA_LON_LON_RANCH, SCENE_LON_LON_BUILDINGS, TWO_ACTOR_PARAMS(1256, -78), "Talons House Pot 3", RHT_POT_LON_LON_RANCH, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LLR_TALONS_HOUSE_POT_3)); + locationTable[RC_HF_COW_GROTTO_POT_1] = Location::Pot(RC_HF_COW_GROTTO_POT_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3410, -223), "Cow Grotto Pot 1", RHT_POT_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_POT_1)); + locationTable[RC_HF_COW_GROTTO_POT_2] = Location::Pot(RC_HF_COW_GROTTO_POT_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(3390, -258), "Cow Grotto Pot 2", RHT_POT_HYRULE_FIELD, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HF_COW_GROTTO_POT_2)); + locationTable[RC_HC_STORMS_GROTTO_POT_1] = Location::Pot(RC_HC_STORMS_GROTTO_POT_1, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1843, 1014), "Storms Grotto Pot 1", RHT_POT_HYRULE_CASTLE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_1)); + locationTable[RC_HC_STORMS_GROTTO_POT_2] = Location::Pot(RC_HC_STORMS_GROTTO_POT_2, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1769, 954), "Storms Grotto Pot 2", RHT_POT_HYRULE_CASTLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_2)); + locationTable[RC_HC_STORMS_GROTTO_POT_3] = Location::Pot(RC_HC_STORMS_GROTTO_POT_3, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1857, 897), "Storms Grotto Pot 3", RHT_POT_HYRULE_CASTLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_3)); + locationTable[RC_HC_STORMS_GROTTO_POT_4] = Location::Pot(RC_HC_STORMS_GROTTO_POT_4, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(1764, 847), "Storms Grotto Pot 4", RHT_POT_HYRULE_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_HC_STORMS_GROTTO_POT_4)); + // Dungeon Pots - // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check - locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2673, -2060), "Lizalfos Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_3)); - locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3526, -2574), "Lizalfos Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_2)); - locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3579, -2574), "Lizalfos Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_1)); - locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2653, -2031), "Lizalfos Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_4)); - locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1708, -471), "Side Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_1)); - locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1746, -424), "Side Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_2)); - locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2573, -489), "Side Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_3)); - locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2622, -489), "Side Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_4)); - locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_5] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_5, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3507, -964), "Side Room Pot 5", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_5)); - locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_6] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_6, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3617, -911), "Side Room Pot 6", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_6)); - locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1846, -1879), "Torch Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_1)); - locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2050, -1964), "Torch Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_2)); - locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2281, -1799), "Torch Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_3)); - locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1836, -1239), "Torch Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_4)); - locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2414, -1823), "Staircase Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_1)); - locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2368, -1827), "Staircase Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_2)); - locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1574, -1831), "Staircase Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_3)); - locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1528, -1827), "Staircase Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_4)); - locationTable[RC_DODONGOS_CAVERN_SINGLE_EYE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_SINGLE_EYE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2704, -483), "Single Eye Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_1)); - locationTable[RC_DODONGOS_CAVERN_SINGLE_EYE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_SINGLE_EYE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3195, -155), "Single Eye Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_2)); - locationTable[RC_DODONGOS_CAVERN_BLADE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_BLADE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1656, -531), "Blade Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_POT_1)); - locationTable[RC_DODONGOS_CAVERN_BLADE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_BLADE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1831, -593), "Blade Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_POT_2)); - locationTable[RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3329, -753), "Double Eye Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_1)); - locationTable[RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2705, -1086), "Double Eye Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_2)); - locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1027, -3704), "Back Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_1)); - locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(966, -3704), "Back Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_2)); - locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(125, -3854), "Back Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_3)); - locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(78, -3835), "Back Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_4)); - locationTable[RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1295, -3612), "Above Big Octo Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1355, -3612), "Above Big Octo Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1422, -3612), "Above Big Octo Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3)); - locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_1, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(-551, 33), "Barinade Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_2, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(551, 36), "Barinade Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_3, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(554, -493), "Barinade Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_3)); - locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_4] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_4, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(-543, -496), "Barinade Pot 4", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_4)); - locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_5] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_5, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(-268, -786), "Barinade Pot 5", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_5)); - locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_6] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_6, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(279, -761), "Barinade Pot 6", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_6)); - locationTable[RC_JABU_JABUS_BELLY_BASEMENT_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_BASEMENT_POT_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(703, -2371), "Basement Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_BASEMENT_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_BASEMENT_POT_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(645, -2408), "Basement Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_BASEMENT_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_BASEMENT_POT_3, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(650, -2344), "Basement Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_3)); - locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1127, -2271), "Two Octorok Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1178, -2272), "Two Octorok Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1150, -2248), "Two Octorok Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3)); - locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1131, -2221), "Two Octorok Pot 4", RHT_POT_JABU_JABUS_BELLY, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4)); - locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1173, -2227), "Two Octorok Pot 5", RHT_POT_JABU_JABUS_BELLY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5)); - locationTable[RC_FOREST_TEMPLE_LOBBY_POT_1] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(720, -1037), "Lobby Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_1)); - locationTable[RC_FOREST_TEMPLE_LOBBY_POT_2] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(675, -989), "Lobby Pot 2", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_2)); - locationTable[RC_FOREST_TEMPLE_LOBBY_POT_3] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_3, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(630, -943), "Lobby Pot 3", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_3)); - locationTable[RC_FOREST_TEMPLE_LOBBY_POT_4] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_4, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-384, -937), "Lobby Pot 4", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_4)); - locationTable[RC_FOREST_TEMPLE_LOBBY_POT_5] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_5, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-429, -981), "Lobby Pot 5", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_5)); - locationTable[RC_FOREST_TEMPLE_LOBBY_POT_6] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_6, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-477, -1034), "Lobby Pot 6", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_6)); - locationTable[RC_FOREST_TEMPLE_LOWER_STALFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_LOWER_STALFOS_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(90, -3583), "Lower Stalfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_1)); - locationTable[RC_FOREST_TEMPLE_LOWER_STALFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_LOWER_STALFOS_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(142, -3583), "Lower Stalfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_2)); - locationTable[RC_FOREST_TEMPLE_GREEN_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_GREEN_POE_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1647, -1529), "Green Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_1)); - locationTable[RC_FOREST_TEMPLE_GREEN_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_GREEN_POE_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1645, -1588), "Green Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_2)); - locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(32, -3012), "Upper Stalfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_1)); - locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(202, -3012), "Upper Stalfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_2)); - locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_3] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_3, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(30, -3631), "Upper Stalfos Pot 3", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_3)); - locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_4] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_4, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(206, -3631), "Upper Stalfos Pot 4", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_4)); - locationTable[RC_FOREST_TEMPLE_BLUE_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_BLUE_POE_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(830, -3639), "Blue Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_1)); - locationTable[RC_FOREST_TEMPLE_BLUE_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_BLUE_POE_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(883, -3640), "Blue Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_2)); - locationTable[RC_FOREST_TEMPLE_BLUE_POE_POT_3] = Location::Pot(RC_FOREST_TEMPLE_BLUE_POE_POT_3, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(941, -3640), "Blue Poe Pot 3", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_3)); - locationTable[RC_FOREST_TEMPLE_FROZEN_EYE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_FROZEN_EYE_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2312, -874), "Frozen Eye Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_1)); - locationTable[RC_FOREST_TEMPLE_FROZEN_EYE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_FROZEN_EYE_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2364, -873), "Frozen Eye Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_2)); - locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_1] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1086, -714), "Near Boss Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_1)); - locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_2] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1138, -713), "Near Boss Pot 2", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_2)); - locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_3] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1087, -765), "Near Boss Pot 3", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_3)); - locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_4] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_4, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1139, -766), "Near Boss Pot 4", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_4)); - locationTable[RC_FIRE_TEMPLE_BIG_LAVA_POT_1] = Location::Pot(RC_FIRE_TEMPLE_BIG_LAVA_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2226, -754), "Big Lava Pot 1", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_1)); - locationTable[RC_FIRE_TEMPLE_BIG_LAVA_POT_2] = Location::Pot(RC_FIRE_TEMPLE_BIG_LAVA_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2226, -809), "Big Lava Pot 2", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_2)); - locationTable[RC_FIRE_TEMPLE_BIG_LAVA_POT_3] = Location::Pot(RC_FIRE_TEMPLE_BIG_LAVA_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2227, -862), "Big Lava Pot 3", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_3)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2388, 953), "Flame Maze Left Pot 1", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2423, 920), "Flame Maze Left Pot 2", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2442, 715), "Flame Maze Left Pot 3", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2408, 680), "Flame Maze Left Pot 4", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2208, -168), "Flame Maze Right Pot 1", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2253, -167), "Flame Maze Right Pot 2", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2657, -591), "Flame Maze Right Pot 3", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3)); - locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2657, -635), "Flame Maze Right Pot 4", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4)); - locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_1] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(330, -198), "Main Level 2 Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_1)); - locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_2] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(331, -168), "Main Level 2 Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_2)); - locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_1] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-241, -1193), "Main Level 1 Pot 1", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_1)); - locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_2] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-117, -1192), "Main Level 1 Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_2)); - locationTable[RC_WATER_TEMPLE_TORCH_POT_1] = Location::Pot(RC_WATER_TEMPLE_TORCH_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 62), "Torch Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_TORCH_POT_1)); - locationTable[RC_WATER_TEMPLE_TORCH_POT_2] = Location::Pot(RC_WATER_TEMPLE_TORCH_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 293), "Torch Pot 2", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_TORCH_POT_2)); - locationTable[RC_WATER_TEMPLE_NEAR_COMPASS_POT_1] = Location::Pot(RC_WATER_TEMPLE_NEAR_COMPASS_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1222, -617), "Near Compass Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_1)); - locationTable[RC_WATER_TEMPLE_NEAR_COMPASS_POT_2] = Location::Pot(RC_WATER_TEMPLE_NEAR_COMPASS_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1172, -617), "Near Compass Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_2)); - locationTable[RC_WATER_TEMPLE_NEAR_COMPASS_POT_3] = Location::Pot(RC_WATER_TEMPLE_NEAR_COMPASS_POT_3, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1122, -617), "Near Compass Pot 3", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_3)); - locationTable[RC_WATER_TEMPLE_CENTRAL_BOW_POT_1] = Location::Pot(RC_WATER_TEMPLE_CENTRAL_BOW_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(688, 1008), "Central Bow Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_1)); - locationTable[RC_WATER_TEMPLE_CENTRAL_BOW_POT_2] = Location::Pot(RC_WATER_TEMPLE_CENTRAL_BOW_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(631, 1008), "Central Bow Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_2)); - locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_1] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 944), "Behind Gate Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_1)); - locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_2] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 905), "Behind Gate Pot 2", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_2)); - locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_3] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_3, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 808), "Behind Gate Pot 3", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_3)); - locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_4] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_4, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 770), "Behind Gate Pot 4", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_4)); - locationTable[RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1] = Location::Pot(RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-28, -3817), "Basement Block Puzzle Pot 1", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1)); - locationTable[RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2] = Location::Pot(RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(28, -3817), "Basement Block Puzzle Pot 2", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2)); - locationTable[RC_WATER_TEMPLE_RIVER_POT_1] = Location::Pot(RC_WATER_TEMPLE_RIVER_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2226, -2487), "River Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_POT_1)); - locationTable[RC_WATER_TEMPLE_RIVER_POT_2] = Location::Pot(RC_WATER_TEMPLE_RIVER_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2184, -2456), "River Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_POT_2)); - locationTable[RC_WATER_TEMPLE_LIKE_LIKE_POT_1] = Location::Pot(RC_WATER_TEMPLE_LIKE_LIKE_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3188, -1628), "Like Like Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_1)); - locationTable[RC_WATER_TEMPLE_LIKE_LIKE_POT_2] = Location::Pot(RC_WATER_TEMPLE_LIKE_LIKE_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3056, -1626), "Like Like Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_2)); - locationTable[RC_WATER_TEMPLE_BOSS_KEY_POT_1] = Location::Pot(RC_WATER_TEMPLE_BOSS_KEY_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, -3031), "Boss Key Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_1)); - locationTable[RC_WATER_TEMPLE_BOSS_KEY_POT_2] = Location::Pot(RC_WATER_TEMPLE_BOSS_KEY_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1417, -3025), "Boss Key Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_2)); - locationTable[RC_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1806, -344), "Near Dead Hand Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1)); - locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1721, 61), "Whispering Walls Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1)); - locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1407, 61), "Whispering Walls Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2)); - locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1614, 61), "Whispering Walls Pot 3", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3)); - locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1055, -257), "Whispering Walls Pot 4", RHT_POT_SHADOW_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4)); - locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1050, -130), "Whispering Walls Pot 5", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5)); - locationTable[RC_SHADOW_TEMPLE_MAP_CHEST_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MAP_CHEST_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-665, -760), "Map Chest Pot 1", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MAP_CHEST_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MAP_CHEST_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-929, -748), "Map Chest Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_2)); - locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(614, 3579), "Falling Spikes Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_1)); - locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(798, 3574), "Falling Spikes Pot 2", RHT_POT_SHADOW_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_2)); - locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_3] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_3, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3707), "Falling Spikes Pot 3", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_3)); - locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_4] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_4, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3605), "Falling Spikes Pot 4", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_4)); - locationTable[RC_SHADOW_TEMPLE_AFTER_WIND_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_WIND_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4222, -916), "After Wind Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_1)); - locationTable[RC_SHADOW_TEMPLE_AFTER_WIND_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_WIND_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4549, -922), "After Wind Pot 2", RHT_POT_SHADOW_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_2)); - locationTable[RC_SHADOW_TEMPLE_SPIKE_WALLS_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_SPIKE_WALLS_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4303, -2657), "Spike Walls Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_SPIKE_WALLS_POT_1)); - locationTable[RC_SHADOW_TEMPLE_FLOORMASTER_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_FLOORMASTER_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4575, -811), "Floormaster Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_1)); - locationTable[RC_SHADOW_TEMPLE_FLOORMASTER_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_FLOORMASTER_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4036, -811), "Floormaster Pot 2", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_2)); - locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2400, -1470), "After Boat Pot 1", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_1)); - locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2230, -1470), "After Boat Pot 2", RHT_POT_SHADOW_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_2)); - locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_3] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_3, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2859, -497), "After Boat Pot 3", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_3)); - locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_4] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_4, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2624, -492), "After Boat Pot 4", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_LOBBY_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_LOBBY_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-181, 233), "Lobby Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_LOBBY_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_LOBBY_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(184, 231), "Lobby Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-975, -1751), "Anubis Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-928, -1827), "Anubis Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_3, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1211, -1530), "Anubis Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_3)); - locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_4, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1055, -1680), "Anubis Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SHIELD, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1101, -1305), "Child Climb Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1781, 830), "After Sun Block Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1617, 830), "After Sun Block Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-600, -1213), "Central Chamber Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-564, -1180), "Central Chamber Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-526, -1213), "Central Chamber Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3)); - locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(639, -1224), "Central Chamber Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(671, -1179), "Central Chamber Pot 5", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5)); - locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(704, -1224), "Central Chamber Pot 6", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6)); - locationTable[RC_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(819, -333), "Beamos Hall Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1)); - locationTable[RC_GANONS_CASTLE_FOREST_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_FOREST_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1725, 2336), "Forest Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_FOREST_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_FOREST_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1892, 2241), "Forest Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_FIRE_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_FIRE_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1898, -3942), "Fire Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_FIRE_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_FIRE_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2051, -3855), "Fire Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_WATER_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_WATER_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3558, -920), "Water Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_WATER_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_WATER_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3558, -761), "Water Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_WATER_TRIAL_POT_3] = Location::Pot(RC_GANONS_CASTLE_WATER_TRIAL_POT_3, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2822, -507), "Water Trial Pot 3", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_3)); - locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1234, -3418), "Shadow Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1621, -3203), "Shadow Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_3] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_3, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2067, -4592), "Shadow Trial Pot 3", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_3)); - locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_4] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_4, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2224, -4506), "Shadow Trial Pot 4", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_4)); - locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1398, 1402), "Spirit Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1237, 1494), "Spirit Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1] = Location::Pot(RC_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2581, -839), "Light Trial Boulder Pot 1", RHT_POT_GANONS_CASTLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1)); - locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_LIGHT_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3840, -923), "Light Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_LIGHT_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3840, -755), "Light Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_1] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_1, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-422, -258), "Ganons Tower Pot 1", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_1)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_2] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_2, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-382, -300), "Ganons Tower Pot 2", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_2)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_3] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_3, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-342, -341), "Ganons Tower Pot 3", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_3)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_4] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_4, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-298, -383), "Ganons Tower Pot 4", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_4)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_5] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_5, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-257, -424), "Ganons Tower Pot 5", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_5)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_6] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_6, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-382, -259), "Ganons Tower Pot 6", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_6)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_7] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_7, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-342, -300), "Ganons Tower Pot 7", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_7)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_8] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_8, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-301, -341), "Ganons Tower Pot 8", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_8)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_9] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_9, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-258, -383), "Ganons Tower Pot 9", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_9)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_10] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_10, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(418, -261), "Ganons Tower Pot 10", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_10)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_11] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_11, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(377, -301), "Ganons Tower Pot 11", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_11)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_12] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_12, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(338, -340), "Ganons Tower Pot 12", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_12)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_13] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_13, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(300, -380), "Ganons Tower Pot 13", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_13)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_14] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_14, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(260, -420), "Ganons Tower Pot 14", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_14)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_15] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_15, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(378, -261), "Ganons Tower Pot 15", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_15)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_16] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_16, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(337, -300), "Ganons Tower Pot 16", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_16)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_17] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_17, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(299, -340), "Ganons Tower Pot 17", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_17)); - locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_18] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_18, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(260, -380), "Ganons Tower Pot 18", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_18)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-95, -673), "Basement Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(75, -598), "Basement Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(270, -1151), "Basement Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_3)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(566, -1254), "Basement Pot 4", RHT_POT_BOTTOM_OF_THE_WELL, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_4)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(378, -1089), "Basement Pot 5", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_5)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(665, -1252), "Basement Pot 6", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_6)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(566, -1345), "Basement Pot 7", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_7)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(562, -1304), "Basement Pot 8", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_8)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(313, -1086), "Basement Pot 9", RHT_POT_BOTTOM_OF_THE_WELL, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_9)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(618, -1254), "Basement Pot 10", RHT_POT_BOTTOM_OF_THE_WELL, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_10)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(257, -1099), "Basement Pot 11", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_11)); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(296, -1206), "Basement Pot 12", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_12)); - locationTable[RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-969, 55), "Left Side Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-966, 9), "Left Side Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-965, -32), "Left Side Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3)); - locationTable[RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-41, 389), "Near Entrance Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(36, 389), "Near Entrance Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(874, -1294), "Fire Keese Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_UNDERWATER_POT] = Location::Pot(RC_BOTTOM_OF_THE_WELL_UNDERWATER_POT, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(3, -1641), "Underwater Pot", RHT_POT_BOTTOM_OF_THE_WELL, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_UNDERWATER_POT)); - locationTable[RC_ICE_CAVERN_HALL_POT_1] = Location::Pot(RC_ICE_CAVERN_HALL_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-206, 449), "Hall Pot 1", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HALL_POT_1)); - locationTable[RC_ICE_CAVERN_HALL_POT_2] = Location::Pot(RC_ICE_CAVERN_HALL_POT_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-203, 492), "Hall Pot 2", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HALL_POT_2)); - locationTable[RC_ICE_CAVERN_SPINNING_BLADE_POT_1] = Location::Pot(RC_ICE_CAVERN_SPINNING_BLADE_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(433, -732), "Spinning Blade Pot 1", RHT_POT_ICE_CAVERN, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_1)); - locationTable[RC_ICE_CAVERN_SPINNING_BLADE_POT_2] = Location::Pot(RC_ICE_CAVERN_SPINNING_BLADE_POT_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(569, -175), "Spinning Blade Pot 2", RHT_POT_ICE_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_2)); - locationTable[RC_ICE_CAVERN_SPINNING_BLADE_POT_3] = Location::Pot(RC_ICE_CAVERN_SPINNING_BLADE_POT_3, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(521, -131), "Spinning Blade Pot 3", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_3)); - locationTable[RC_ICE_CAVERN_NEAR_END_POT_1] = Location::Pot(RC_ICE_CAVERN_NEAR_END_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1422, 586), "Near End Pot 1", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_POT_1)); - locationTable[RC_ICE_CAVERN_NEAR_END_POT_2] = Location::Pot(RC_ICE_CAVERN_NEAR_END_POT_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1488, 676), "Near End Pot 2", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_POT_2)); - locationTable[RC_ICE_CAVERN_FROZEN_POT_1] = Location::Pot(RC_ICE_CAVERN_FROZEN_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(366, -2036), "Frozen Pot 1", RHT_POT_ICE_CAVERN, RG_PURPLE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_FROZEN_POT_1)); + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2673, -2060), "Lizalfos Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_3)); + locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3526, -2574), "Lizalfos Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_2)); + locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3579, -2574), "Lizalfos Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_1)); + locationTable[RC_DODONGOS_CAVERN_LIZALFOS_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_LIZALFOS_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2653, -2031), "Lizalfos Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_LIZALFOS_POT_4)); + locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1708, -471), "Side Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_1)); + locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1746, -424), "Side Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_2)); + locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2573, -489), "Side Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_3)); + locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2622, -489), "Side Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_4)); + locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_5] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_5, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3507, -964), "Side Room Pot 5", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_5)); + locationTable[RC_DODONGOS_CAVERN_SIDE_ROOM_POT_6] = Location::Pot(RC_DODONGOS_CAVERN_SIDE_ROOM_POT_6, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3617, -911), "Side Room Pot 6", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SIDE_ROOM_POT_6)); + locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1846, -1879), "Torch Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_1)); + locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2050, -1964), "Torch Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_2)); + locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2281, -1799), "Torch Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_3)); + locationTable[RC_DODONGOS_CAVERN_TORCH_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_TORCH_ROOM_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1836, -1239), "Torch Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_TORCH_ROOM_POT_4)); + locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2414, -1823), "Staircase Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_1)); + locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2368, -1827), "Staircase Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_2)); + locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1574, -1831), "Staircase Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_3)); + locationTable[RC_DODONGOS_CAVERN_STAIRCASE_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_STAIRCASE_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1528, -1827), "Staircase Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_STAIRCASE_POT_4)); + locationTable[RC_DODONGOS_CAVERN_SINGLE_EYE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_SINGLE_EYE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2704, -483), "Single Eye Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_1)); + locationTable[RC_DODONGOS_CAVERN_SINGLE_EYE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_SINGLE_EYE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3195, -155), "Single Eye Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_SINGLE_EYE_POT_2)); + locationTable[RC_DODONGOS_CAVERN_BLADE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_BLADE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1656, -531), "Blade Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_POT_1)); + locationTable[RC_DODONGOS_CAVERN_BLADE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_BLADE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1831, -593), "Blade Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_POT_2)); + locationTable[RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3329, -753), "Double Eye Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_1)); + locationTable[RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_DOUBLE_EYE_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2705, -1086), "Double Eye Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_DOUBLE_EYE_POT_2)); + locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_1, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1027, -3704), "Back Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_1)); + locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_2, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(966, -3704), "Back Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_2)); + locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_3, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(125, -3854), "Back Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_3)); + locationTable[RC_DODONGOS_CAVERN_BACK_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_BACK_ROOM_POT_4, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(78, -3835), "Back Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BACK_ROOM_POT_4)); + locationTable[RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1295, -3612), "Above Big Octo Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1355, -3612), "Above Big Octo Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1422, -3612), "Above Big Octo Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_ABOVE_BIG_OCTO_POT_3)); + locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_1, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(-551, 33), "Barinade Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_2, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(551, 36), "Barinade Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_3, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(554, -493), "Barinade Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_3)); + locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_4] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_4, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(-543, -496), "Barinade Pot 4", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_4)); + locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_5] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_5, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(-268, -786), "Barinade Pot 5", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_5)); + locationTable[RC_JABU_JABUS_BELLY_BARINADE_POT_6] = Location::Pot(RC_JABU_JABUS_BELLY_BARINADE_POT_6, RCQUEST_BOTH, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU_BOSS, TWO_ACTOR_PARAMS(279, -761), "Barinade Pot 6", RHT_POT_JABU_JABUS_BELLY, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BARINADE_POT_6)); + locationTable[RC_JABU_JABUS_BELLY_BASEMENT_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_BASEMENT_POT_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(703, -2371), "Basement Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_BASEMENT_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_BASEMENT_POT_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(645, -2408), "Basement Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_BASEMENT_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_BASEMENT_POT_3, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(650, -2344), "Basement Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_BASEMENT_POT_3)); + locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1127, -2271), "Two Octorok Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1178, -2272), "Two Octorok Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1150, -2248), "Two Octorok Pot 3", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_3)); + locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1131, -2221), "Two Octorok Pot 4", RHT_POT_JABU_JABUS_BELLY, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_4)); + locationTable[RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5] = Location::Pot(RC_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5, RCQUEST_VANILLA, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-1173, -2227), "Two Octorok Pot 5", RHT_POT_JABU_JABUS_BELLY, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_TWO_OCTOROK_POT_5)); + locationTable[RC_FOREST_TEMPLE_LOBBY_POT_1] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(720, -1037), "Lobby Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_1)); + locationTable[RC_FOREST_TEMPLE_LOBBY_POT_2] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(675, -989), "Lobby Pot 2", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_2)); + locationTable[RC_FOREST_TEMPLE_LOBBY_POT_3] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_3, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(630, -943), "Lobby Pot 3", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_3)); + locationTable[RC_FOREST_TEMPLE_LOBBY_POT_4] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_4, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-384, -937), "Lobby Pot 4", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_4)); + locationTable[RC_FOREST_TEMPLE_LOBBY_POT_5] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_5, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-429, -981), "Lobby Pot 5", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_5)); + locationTable[RC_FOREST_TEMPLE_LOBBY_POT_6] = Location::Pot(RC_FOREST_TEMPLE_LOBBY_POT_6, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-477, -1034), "Lobby Pot 6", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOBBY_POT_6)); + locationTable[RC_FOREST_TEMPLE_LOWER_STALFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_LOWER_STALFOS_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(90, -3583), "Lower Stalfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_1)); + locationTable[RC_FOREST_TEMPLE_LOWER_STALFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_LOWER_STALFOS_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(142, -3583), "Lower Stalfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_LOWER_STALFOS_POT_2)); + locationTable[RC_FOREST_TEMPLE_GREEN_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_GREEN_POE_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1647, -1529), "Green Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_1)); + locationTable[RC_FOREST_TEMPLE_GREEN_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_GREEN_POE_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1645, -1588), "Green Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_GREEN_POE_POT_2)); + locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(32, -3012), "Upper Stalfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_1)); + locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(202, -3012), "Upper Stalfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_2)); + locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_3] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_3, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(30, -3631), "Upper Stalfos Pot 3", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_3)); + locationTable[RC_FOREST_TEMPLE_UPPER_STALFOS_POT_4] = Location::Pot(RC_FOREST_TEMPLE_UPPER_STALFOS_POT_4, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(206, -3631), "Upper Stalfos Pot 4", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_UPPER_STALFOS_POT_4)); + locationTable[RC_FOREST_TEMPLE_BLUE_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_BLUE_POE_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(830, -3639), "Blue Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_1)); + locationTable[RC_FOREST_TEMPLE_BLUE_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_BLUE_POE_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(883, -3640), "Blue Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_2)); + locationTable[RC_FOREST_TEMPLE_BLUE_POE_POT_3] = Location::Pot(RC_FOREST_TEMPLE_BLUE_POE_POT_3, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(941, -3640), "Blue Poe Pot 3", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_BLUE_POE_POT_3)); + locationTable[RC_FOREST_TEMPLE_FROZEN_EYE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_FROZEN_EYE_POT_1, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2312, -874), "Frozen Eye Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_1)); + locationTable[RC_FOREST_TEMPLE_FROZEN_EYE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_FROZEN_EYE_POT_2, RCQUEST_VANILLA, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(2364, -873), "Frozen Eye Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_FROZEN_EYE_POT_2)); + locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_1] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1086, -714), "Near Boss Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_1)); + locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_2] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1138, -713), "Near Boss Pot 2", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_2)); + locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_3] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1087, -765), "Near Boss Pot 3", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_3)); + locationTable[RC_FIRE_TEMPLE_NEAR_BOSS_POT_4] = Location::Pot(RC_FIRE_TEMPLE_NEAR_BOSS_POT_4, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1139, -766), "Near Boss Pot 4", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_NEAR_BOSS_POT_4)); + locationTable[RC_FIRE_TEMPLE_BIG_LAVA_POT_1] = Location::Pot(RC_FIRE_TEMPLE_BIG_LAVA_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2226, -754), "Big Lava Pot 1", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_1)); + locationTable[RC_FIRE_TEMPLE_BIG_LAVA_POT_2] = Location::Pot(RC_FIRE_TEMPLE_BIG_LAVA_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2226, -809), "Big Lava Pot 2", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_2)); + locationTable[RC_FIRE_TEMPLE_BIG_LAVA_POT_3] = Location::Pot(RC_FIRE_TEMPLE_BIG_LAVA_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2227, -862), "Big Lava Pot 3", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_BIG_LAVA_POT_3)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2388, 953), "Flame Maze Left Pot 1", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_1)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2423, 920), "Flame Maze Left Pot 2", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_2)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2442, 715), "Flame Maze Left Pot 3", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_3)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2408, 680), "Flame Maze Left Pot 4", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_LEFT_POT_4)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2208, -168), "Flame Maze Right Pot 1", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_1)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2253, -167), "Flame Maze Right Pot 2", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_2)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2657, -591), "Flame Maze Right Pot 3", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_3)); + locationTable[RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4] = Location::Pot(RC_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4, RCQUEST_VANILLA, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2657, -635), "Flame Maze Right Pot 4", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FLAME_MAZE_RIGHT_POT_4)); + locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_1] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(330, -198), "Main Level 2 Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_1)); + locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_2] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_2_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(331, -168), "Main Level 2 Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_2_POT_2)); + locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_1] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-241, -1193), "Main Level 1 Pot 1", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_1)); + locationTable[RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_2] = Location::Pot(RC_WATER_TEMPLE_MAIN_LEVEL_1_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-117, -1192), "Main Level 1 Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MAIN_LEVEL_1_POT_2)); + locationTable[RC_WATER_TEMPLE_TORCH_POT_1] = Location::Pot(RC_WATER_TEMPLE_TORCH_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 62), "Torch Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_TORCH_POT_1)); + locationTable[RC_WATER_TEMPLE_TORCH_POT_2] = Location::Pot(RC_WATER_TEMPLE_TORCH_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 293), "Torch Pot 2", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_TORCH_POT_2)); + locationTable[RC_WATER_TEMPLE_NEAR_COMPASS_POT_1] = Location::Pot(RC_WATER_TEMPLE_NEAR_COMPASS_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1222, -617), "Near Compass Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_1)); + locationTable[RC_WATER_TEMPLE_NEAR_COMPASS_POT_2] = Location::Pot(RC_WATER_TEMPLE_NEAR_COMPASS_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1172, -617), "Near Compass Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_2)); + locationTable[RC_WATER_TEMPLE_NEAR_COMPASS_POT_3] = Location::Pot(RC_WATER_TEMPLE_NEAR_COMPASS_POT_3, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1122, -617), "Near Compass Pot 3", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_NEAR_COMPASS_POT_3)); + locationTable[RC_WATER_TEMPLE_CENTRAL_BOW_POT_1] = Location::Pot(RC_WATER_TEMPLE_CENTRAL_BOW_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(688, 1008), "Central Bow Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_1)); + locationTable[RC_WATER_TEMPLE_CENTRAL_BOW_POT_2] = Location::Pot(RC_WATER_TEMPLE_CENTRAL_BOW_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(631, 1008), "Central Bow Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_CENTRAL_BOW_POT_2)); + locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_1] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 944), "Behind Gate Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_1)); + locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_2] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 905), "Behind Gate Pot 2", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_2)); + locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_3] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_3, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 808), "Behind Gate Pot 3", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_3)); + locationTable[RC_WATER_TEMPLE_BEHIND_GATE_POT_4] = Location::Pot(RC_WATER_TEMPLE_BEHIND_GATE_POT_4, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 770), "Behind Gate Pot 4", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BEHIND_GATE_POT_4)); + locationTable[RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1] = Location::Pot(RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-28, -3817), "Basement Block Puzzle Pot 1", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_1)); + locationTable[RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2] = Location::Pot(RC_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(28, -3817), "Basement Block Puzzle Pot 2", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BASEMENT_BLOCK_PUZZLE_POT_2)); + locationTable[RC_WATER_TEMPLE_RIVER_POT_1] = Location::Pot(RC_WATER_TEMPLE_RIVER_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2226, -2487), "River Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_POT_1)); + locationTable[RC_WATER_TEMPLE_RIVER_POT_2] = Location::Pot(RC_WATER_TEMPLE_RIVER_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2184, -2456), "River Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_POT_2)); + locationTable[RC_WATER_TEMPLE_LIKE_LIKE_POT_1] = Location::Pot(RC_WATER_TEMPLE_LIKE_LIKE_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3188, -1628), "Like Like Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_1)); + locationTable[RC_WATER_TEMPLE_LIKE_LIKE_POT_2] = Location::Pot(RC_WATER_TEMPLE_LIKE_LIKE_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3056, -1626), "Like Like Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_LIKE_LIKE_POT_2)); + locationTable[RC_WATER_TEMPLE_BOSS_KEY_POT_1] = Location::Pot(RC_WATER_TEMPLE_BOSS_KEY_POT_1, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, -3031), "Boss Key Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_1)); + locationTable[RC_WATER_TEMPLE_BOSS_KEY_POT_2] = Location::Pot(RC_WATER_TEMPLE_BOSS_KEY_POT_2, RCQUEST_VANILLA, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1417, -3025), "Boss Key Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_BOSS_KEY_POT_2)); + locationTable[RC_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1806, -344), "Near Dead Hand Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_NEAR_DEAD_HAND_POT_1)); + locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1721, 61), "Whispering Walls Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_1)); + locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1407, 61), "Whispering Walls Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_2)); + locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1614, 61), "Whispering Walls Pot 3", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_3)); + locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1055, -257), "Whispering Walls Pot 4", RHT_POT_SHADOW_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_4)); + locationTable[RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5] = Location::Pot(RC_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1050, -130), "Whispering Walls Pot 5", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_WHISPERING_WALLS_POT_5)); + locationTable[RC_SHADOW_TEMPLE_MAP_CHEST_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MAP_CHEST_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-665, -760), "Map Chest Pot 1", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MAP_CHEST_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MAP_CHEST_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-929, -748), "Map Chest Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MAP_CHEST_POT_2)); + locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(614, 3579), "Falling Spikes Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_1)); + locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(798, 3574), "Falling Spikes Pot 2", RHT_POT_SHADOW_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_2)); + locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_3] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_3, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3707), "Falling Spikes Pot 3", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_3)); + locationTable[RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_4] = Location::Pot(RC_SHADOW_TEMPLE_FALLING_SPIKES_POT_4, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3605), "Falling Spikes Pot 4", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FALLING_SPIKES_POT_4)); + locationTable[RC_SHADOW_TEMPLE_AFTER_WIND_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_WIND_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4222, -916), "After Wind Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_1)); + locationTable[RC_SHADOW_TEMPLE_AFTER_WIND_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_WIND_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4549, -922), "After Wind Pot 2", RHT_POT_SHADOW_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_WIND_POT_2)); + locationTable[RC_SHADOW_TEMPLE_SPIKE_WALLS_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_SPIKE_WALLS_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4303, -2657), "Spike Walls Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_SPIKE_WALLS_POT_1)); + locationTable[RC_SHADOW_TEMPLE_FLOORMASTER_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_FLOORMASTER_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4575, -811), "Floormaster Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_1)); + locationTable[RC_SHADOW_TEMPLE_FLOORMASTER_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_FLOORMASTER_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4036, -811), "Floormaster Pot 2", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_FLOORMASTER_POT_2)); + locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_1, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2400, -1470), "After Boat Pot 1", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_1)); + locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_2, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2230, -1470), "After Boat Pot 2", RHT_POT_SHADOW_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_2)); + locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_3] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_3, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2859, -497), "After Boat Pot 3", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_3)); + locationTable[RC_SHADOW_TEMPLE_AFTER_BOAT_POT_4] = Location::Pot(RC_SHADOW_TEMPLE_AFTER_BOAT_POT_4, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2624, -492), "After Boat Pot 4", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_BOAT_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_LOBBY_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_LOBBY_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-181, 233), "Lobby Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_LOBBY_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_LOBBY_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(184, 231), "Lobby Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_LOBBY_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-975, -1751), "Anubis Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-928, -1827), "Anubis Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_3, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1211, -1530), "Anubis Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_3)); + locationTable[RC_SPIRIT_TEMPLE_ANUBIS_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_ANUBIS_POT_4, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1055, -1680), "Anubis Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SHIELD, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_ANUBIS_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1101, -1305), "Child Climb Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1781, 830), "After Sun Block Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1617, 830), "After Sun Block Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_AFTER_SUN_BLOCK_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-600, -1213), "Central Chamber Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-564, -1180), "Central Chamber Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-526, -1213), "Central Chamber Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_3)); + locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(639, -1224), "Central Chamber Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(671, -1179), "Central Chamber Pot 5", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_5)); + locationTable[RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6] = Location::Pot(RC_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(704, -1224), "Central Chamber Pot 6", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_CENTRAL_CHAMBER_POT_6)); + locationTable[RC_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(819, -333), "Beamos Hall Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_BEAMOS_HALL_POT_1)); + locationTable[RC_GANONS_CASTLE_FOREST_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_FOREST_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1725, 2336), "Forest Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_FOREST_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_FOREST_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1892, 2241), "Forest Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FOREST_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_FIRE_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_FIRE_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1898, -3942), "Fire Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_FIRE_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_FIRE_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2051, -3855), "Fire Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FIRE_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_WATER_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3558, -920), "Water Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_WATER_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3558, -761), "Water Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_POT_3] = Location::Pot(RC_GANONS_CASTLE_WATER_TRIAL_POT_3, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2822, -507), "Water Trial Pot 3", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_POT_3)); + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1234, -3418), "Shadow Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1621, -3203), "Shadow Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_3] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_3, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2067, -4592), "Shadow Trial Pot 3", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_3)); + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_POT_4] = Location::Pot(RC_GANONS_CASTLE_SHADOW_TRIAL_POT_4, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2224, -4506), "Shadow Trial Pot 4", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_POT_4)); + locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1398, 1402), "Spirit Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1237, 1494), "Spirit Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1] = Location::Pot(RC_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2581, -839), "Light Trial Boulder Pot 1", RHT_POT_GANONS_CASTLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1)); + locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_LIGHT_TRIAL_POT_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3840, -923), "Light Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_LIGHT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_LIGHT_TRIAL_POT_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3840, -755), "Light Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_LIGHT_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_1] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_1, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-422, -258), "Ganons Tower Pot 1", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_1)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_2] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_2, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-382, -300), "Ganons Tower Pot 2", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_2)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_3] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_3, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-342, -341), "Ganons Tower Pot 3", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_3)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_4] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_4, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-298, -383), "Ganons Tower Pot 4", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_4)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_5] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_5, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-257, -424), "Ganons Tower Pot 5", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_5)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_6] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_6, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-382, -259), "Ganons Tower Pot 6", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_6)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_7] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_7, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-342, -300), "Ganons Tower Pot 7", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_7)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_8] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_8, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-301, -341), "Ganons Tower Pot 8", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_8)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_9] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_9, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(-258, -383), "Ganons Tower Pot 9", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_9)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_10] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_10, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(418, -261), "Ganons Tower Pot 10", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_10)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_11] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_11, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(377, -301), "Ganons Tower Pot 11", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_11)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_12] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_12, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(338, -340), "Ganons Tower Pot 12", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_12)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_13] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_13, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(300, -380), "Ganons Tower Pot 13", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_13)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_14] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_14, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(260, -420), "Ganons Tower Pot 14", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_14)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_15] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_15, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(378, -261), "Ganons Tower Pot 15", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_15)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_16] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_16, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(337, -300), "Ganons Tower Pot 16", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_16)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_17] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_17, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(299, -340), "Ganons Tower Pot 17", RHT_POT_GANONS_CASTLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_17)); + locationTable[RC_GANONS_CASTLE_GANONS_TOWER_POT_18] = Location::Pot(RC_GANONS_CASTLE_GANONS_TOWER_POT_18, RCQUEST_BOTH, RCAREA_GANONS_CASTLE, SCENE_GANONS_TOWER, TWO_ACTOR_PARAMS(260, -380), "Ganons Tower Pot 18", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_GANONS_TOWER_POT_18)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-95, -673), "Basement Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(75, -598), "Basement Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(270, -1151), "Basement Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_3)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_4, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(566, -1254), "Basement Pot 4", RHT_POT_BOTTOM_OF_THE_WELL, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_4)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_5, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(378, -1089), "Basement Pot 5", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_5)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_6, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(665, -1252), "Basement Pot 6", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_6)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_7, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(566, -1345), "Basement Pot 7", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_7)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_8, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(562, -1304), "Basement Pot 8", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_8)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_9, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(313, -1086), "Basement Pot 9", RHT_POT_BOTTOM_OF_THE_WELL, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_9)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_10, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(618, -1254), "Basement Pot 10", RHT_POT_BOTTOM_OF_THE_WELL, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_10)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_11, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(257, -1099), "Basement Pot 11", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_11)); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12] = Location::Pot(RC_BOTTOM_OF_THE_WELL_BASEMENT_POT_12, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(296, -1206), "Basement Pot 12", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_POT_12)); + locationTable[RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-969, 55), "Left Side Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-966, 9), "Left Side Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-965, -32), "Left Side Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_LEFT_SIDE_POT_3)); + locationTable[RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-41, 389), "Near Entrance Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_DEKU_STICK_1, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(36, 389), "Near Entrance Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_NEAR_ENTRANCE_POT_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(874, -1294), "Fire Keese Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_FIRE_KEESE_POT_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_UNDERWATER_POT] = Location::Pot(RC_BOTTOM_OF_THE_WELL_UNDERWATER_POT, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(3, -1641), "Underwater Pot", RHT_POT_BOTTOM_OF_THE_WELL, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_UNDERWATER_POT)); + locationTable[RC_ICE_CAVERN_HALL_POT_1] = Location::Pot(RC_ICE_CAVERN_HALL_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-206, 449), "Hall Pot 1", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HALL_POT_1)); + locationTable[RC_ICE_CAVERN_HALL_POT_2] = Location::Pot(RC_ICE_CAVERN_HALL_POT_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-203, 492), "Hall Pot 2", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HALL_POT_2)); + locationTable[RC_ICE_CAVERN_SPINNING_BLADE_POT_1] = Location::Pot(RC_ICE_CAVERN_SPINNING_BLADE_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(433, -732), "Spinning Blade Pot 1", RHT_POT_ICE_CAVERN, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_1)); + locationTable[RC_ICE_CAVERN_SPINNING_BLADE_POT_2] = Location::Pot(RC_ICE_CAVERN_SPINNING_BLADE_POT_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(569, -175), "Spinning Blade Pot 2", RHT_POT_ICE_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_2)); + locationTable[RC_ICE_CAVERN_SPINNING_BLADE_POT_3] = Location::Pot(RC_ICE_CAVERN_SPINNING_BLADE_POT_3, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(521, -131), "Spinning Blade Pot 3", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_POT_3)); + locationTable[RC_ICE_CAVERN_NEAR_END_POT_1] = Location::Pot(RC_ICE_CAVERN_NEAR_END_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1422, 586), "Near End Pot 1", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_POT_1)); + locationTable[RC_ICE_CAVERN_NEAR_END_POT_2] = Location::Pot(RC_ICE_CAVERN_NEAR_END_POT_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1488, 676), "Near End Pot 2", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_POT_2)); + locationTable[RC_ICE_CAVERN_FROZEN_POT_1] = Location::Pot(RC_ICE_CAVERN_FROZEN_POT_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(366, -2036), "Frozen Pot 1", RHT_POT_ICE_CAVERN, RG_PURPLE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_FROZEN_POT_1)); // MQ Dungeon Pots - // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check - locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2391, -1804), "MQ Staircase Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2361, -1161), "MQ Staircase Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1525, -1800), "MQ Staircase Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3)); - locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1558, -1169), "MQ Staircase Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4)); - locationTable[RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_MIDDLE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_MIDDLE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1532, -1225), "MQ Torch Puzzle Middle Pot", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3195, -155), "MQ Big Block Pot 1", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2704, -483), "MQ Big Block Pot 2", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3869, -811), "MQ Upper Lizalfos Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3867, -969), "MQ Upper Lizalfos Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4687, -1071), "MQ Upper Lizalfos Pot 3", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3)); - locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4693, -1194), "MQ Upper Lizalfos Pot 4", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4)); - locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3327, -805), "MQ Two Flames Pot 1", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3326, -753), "MQ Two Flames Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_CORNER_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_CORNER_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1827, -587), "MQ Torch Puzzle Corner Pot", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1727, -151), "MQ Right Side Pot 1", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1815, -154), "MQ Right Side Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3442, -469), "MQ Right Side Pot 3", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3)); - locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3682, -466), "MQ Right Side Pot 4", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4)); - locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1844, -1867), "MQ Poe Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2272, -2213), "MQ Poe Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2240, -1369), "MQ Poe Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3)); - locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1535, -1299), "MQ Poe Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4)); - locationTable[RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_SW_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_SW_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(258, -3055), "MQ Before Boss SW Pot", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_NE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_NE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-265, -2499), "MQ Before Boss NE Pot", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1758, -3194), "MQ Armos Room SE Pot", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_3)); - locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SW_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SW_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1223, -3197), "MQ Armos Room SW Pot", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_4)); - locationTable[RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1663, -4311), "MQ Backroom Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1648, -4694), "MQ Backroom Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_2)); - locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NW_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NW_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1005, -3711), "MQ Armos Room NW Pot", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_1)); - locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1066, -3711), "MQ Armos Room NE Pot", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-183, -449), "MQ Entrance Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(202, -62), "MQ Entrance Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-689, -1800), "MQ Geyser Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-693, -1614), "MQ Geyser Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(697, -2318), "MQ Time Block Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(699, -2445), "MQ Time Block Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(612, -5932), "MQ Like Likes Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1)); - locationTable[RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(718, -5929), "MQ Like Likes Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2)); - locationTable[RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1305, -2005), "MQ Before Boss Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(675, -989), "MQ Lobby Pot 1", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-429, -981), "MQ Lobby Pot 2", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_2)); - locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(720, -1037), "MQ Lobby Pot 3", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_3)); - locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_4] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_4, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-477, -1034), "MQ Lobby Pot 4", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_4)); - locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_5] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_5, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(630, -943), "MQ Lobby Pot 5", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_5)); - locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_6] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_6, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-384, -937), "MQ Lobby Pot 6", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_6)); - locationTable[RC_FOREST_TEMPLE_MQ_WOLFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_WOLFOS_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(90, -3583), "MQ Wolfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_WOLFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_WOLFOS_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(142, -3583), "MQ Wolfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_2)); - locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(206, -3631), "MQ Upper Stalfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(32, -3012), "MQ Upper Stalfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2)); - locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(30, -3631), "MQ Upper Stalfos Pot 3", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3)); - locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(202, -3012), "MQ Upper Stalfos Pot 4", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4)); - locationTable[RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(830, -3639), "MQ Blue Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(941, -3640), "MQ Blue Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_2)); - locationTable[RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(883, -3640), "MQ Blue Poe Pot 3", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_3)); - locationTable[RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1647, -1529), "MQ Green Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1645, -1588), "MQ Green Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_2)); - locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-461, -1095), "MQ Basement Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_1)); - locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-351, -979), "MQ Basement Pot 2", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_2)); - locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-387, -1018), "MQ Basement Pot 3", RHT_POT_FOREST_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_3)); - locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_4] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_4, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-424, -1057), "MQ Basement Pot 4", RHT_POT_FOREST_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_4)); - locationTable[RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1873, 2252), "MQ Forest Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1726, 2326), "MQ Forest Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3544, -931), "MQ Water Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3541, -755), "MQ Water Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2073, -4592), "MQ Shadow Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2217, -4516), "MQ Shadow Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1918, -3957), "MQ Fire Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2052, -3888), "MQ Fire Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3842, -759), "MQ Light Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3845, -933), "MQ Light Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2)); - locationTable[RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1402, 1414), "MQ Spirit Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1)); - locationTable[RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1256, 1500), "MQ Spirit Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2)); - locationTable[RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1045, -130), "MQ Whispering Walls Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1045, -240), "MQ Whispering Walls Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2)); - locationTable[RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-657, -949), "MQ Entrance Redead Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-713, -1016), "MQ Entrance Redead Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2)); - locationTable[RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_WEST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_WEST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(614, 3579), "MQ Lower Umbrella W Pot", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_EAST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_EAST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(798, 3574), "MQ Lower Umbrella E Pot", RHT_POT_SHADOW_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_2)); - locationTable[RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_SOUTH_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_SOUTH_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3707), "MQ Upper Umbrella S Pot", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_3)); - locationTable[RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_NORTH_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_NORTH_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3605), "MQ Upper Umbrella N Pot", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_4)); - locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4222, -916), "MQ Before Boat Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4549, -922), "MQ Before Boat Pot 2", RHT_POT_SHADOW_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2)); - locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_WEST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_WEST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2400, -1470), "MQ Before Chasm W Pot", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_EAST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_EAST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2230, -1470), "MQ Before Chasm E Pot", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_2)); - locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_WEST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_WEST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2859, -497), "MQ After Chasm W Pot", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_3)); - locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_EAST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_EAST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2624, -492), "MQ After Chasm E Pot", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_4)); - locationTable[RC_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4303, -2657), "MQ Spike Baricade Pot", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT)); - locationTable[RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4575, -811), "MQ Dead Hand Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1)); - locationTable[RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4036, -811), "MQ Dead Hand Pot 2", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(339, -377), "MQ Inner Lobby Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(416, -377), "MQ Inner Lobby Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(269, -376), "MQ Inner Lobby Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(421, -174), "MQ Outer Lobby Pot", RHT_POT_BOTTOM_OF_THE_WELL, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(288, -1240), "MQ East Inner Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_1)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(438, -1234), "MQ East Inner Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_2)); - locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(444, -1114), "MQ East Inner Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_3)); - locationTable[RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-357, 957), "MQ Entrance Pot 1", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(356, 959), "MQ Entrance Pot 2", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(187, -1449), "MQ Before Mini Boss Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(188, -1514), "MQ Before Mini Boss Pot 2", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(487, -1450), "MQ Before Mini Boss Pot 3", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(486, -1515), "MQ Before Mini Boss Pot 4", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(38, -1179), "MQ Before Mini Boss Pot 5", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(42, -1298), "MQ Before Mini Boss Pot 6", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(520, -943), "MQ Before Mini Boss Pot 7", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7)); - locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(35, -946), "MQ Before Mini Boss Pot 8", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8)); - locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1426, -711), "MQ Outside Boss Pot 1", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1425, -660), "MQ Outside Boss Pot 2", RHT_POT_FIRE_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_ROOM_NORTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_ROOM_NORTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1646, -1260), "MQ Lava Room North Pot", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_ROOM_HIGH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_ROOM_HIGH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2226, -809), "MQ Lava Room High Pot", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_ROOM_SOUTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_ROOM_SOUTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1634, 1475), "MQ Lava Room South Pot", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_3)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(845, -1591), "MQ Lava Torch Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(901, -1593), "MQ Lava Torch Pot 2", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1756, -155), "MQ Above Lava Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1819, -82), "MQ Above Lava Pot 2", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3] = Location::Pot(RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1789, -122), "MQ Above Lava Pot 3", RHT_POT_FIRE_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3)); - locationTable[RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1493, 386), "MQ Flame Wall Pot 1", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1445, 445), "MQ Flame Wall Pot 2", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2217, -163), "MQ Past Fire Maze North Pot", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_1)); - locationTable[RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_NORTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_NORTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2657, -591), "MQ Past Fire Maze South Pot", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_2)); - locationTable[RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHMOST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHMOST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1849, -1114), "MQ Fire Maze Northmost Pot", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_3)); - locationTable[RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHWEST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHWEST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2110, -646), "MQ Fire Maze North West Pot", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_4)); - locationTable[RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_WEST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_WEST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2319, 838), "MQ South Fire Maze W Pot", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_5)); - locationTable[RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_EAST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_EAST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2285, 803), "MQ South Fire Maze E Pot", RHT_POT_FIRE_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_6)); - locationTable[RC_ICE_CAVERN_MQ_ENTRANCE_POT] = Location::Pot(RC_ICE_CAVERN_MQ_ENTRANCE_POT, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(248, 2287), "MQ Entrance Pot", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_ENTRANCE_POT)); - locationTable[RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(51, 718), "MQ First Crystal Pot 1", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1)); - locationTable[RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(52, 768), "MQ First Crystal Pot 2", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2)); - locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(433, -732), "MQ Early Wolfos Pot 1", RHT_POT_ICE_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1)); - locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(569, -175), "MQ Early Wolfos Pot 2", RHT_POT_ICE_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2)); - locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(521, -131), "MQ Early Wolfos Pot 3", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3)); - locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(138, -672), "MQ Early Wolfos Pot 4", RHT_POT_ICE_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4)); - locationTable[RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1352, 639), "MQ Push Block Pot 1", RHT_POT_ICE_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1)); - locationTable[RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1396, 596), "MQ Push Block Pot 2", RHT_POT_ICE_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2)); - locationTable[RC_ICE_CAVERN_MQ_COMPASS_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_COMPASS_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(902, -2720), "MQ Compass Pot 1", RHT_POT_ICE_CAVERN, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_1)); - locationTable[RC_ICE_CAVERN_MQ_COMPASS_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_COMPASS_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(451, -2726), "MQ Compass Pot 2", RHT_POT_ICE_CAVERN, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-255, 742), "MQ Entrance Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(306, 682), "MQ Entrance Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-297, 687), "MQ Entrance Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3)); - locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(260, 735), "MQ Entrance Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-894, -50), "MQ Child Slugma Pot", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-382, -1256), "MQ Child Gibdo Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-381, -1207), "MQ Child Gibdo Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1035, -1240), "MQ Child Like Like Pot", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1166, -1931), "MQ Child Stalfos Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-959, -1930), "MQ Child Stalfos Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-853, -1837), "MQ Child Stalfos Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3)); - locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1250, -1852), "MQ Child Stalfos Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_2F_CENTER_EAST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_CENTER_EAST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(639, -1224), "MQ Statue Room 2F CE Pot", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_3F_EAST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_3F_EAST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-521, -1576), "MQ Statue Room 3F E Pot", RHT_POT_SPIRIT_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_3F_WEST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_3F_WEST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-595, -1576), "MQ Statue Room 3F W Pot", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_3)); - locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_2F_WEST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_WEST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-559, -1209), "MQ Statue Room 2F W Pot", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_2F_EASTMOST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_EASTMOST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(704, -1224), "MQ Statue Room 2F E Pot", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_5)); - locationTable[RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1276, 432), "MQ Sun Blocks Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1635, -446), "MQ Sun Blocks Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(829, 250), "MQ Long Climb Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(531, 249), "MQ Long Climb Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(244, -893), "MQ Big Mirror Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-122, -741), "MQ Big Mirror Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(250, -741), "MQ Big Mirror Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-123, -892), "MQ Big Mirror Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(781, -841), "MQ Before Mirror Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(587, -844), "MQ Before Mirror Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2)); - locationTable[RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1204, -910), "MQ Early Adult Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1)); - locationTable[RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1204, -1028), "MQ Early Adult Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 62), "MQ Lower Torches Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 293), "MQ Lower Torches Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1222, -617), "MQ Storage Room A Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1122, -617), "MQ Storage Room A Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1172, -617), "MQ Storage Room A Pot 3", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3)); - locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-989, 255), "MQ GS Storage Room Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1026, 257), "MQ GS Storage Room Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3] = Location::Pot(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1062, 256), "MQ GS Storage Room Pot 3", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(512, 579), "MQ Lizalfos Hall W Pot", RHT_POT_WATER_TEMPLE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(602, 1022), "MQ Lizalfos Hall S Pot", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(789, 947), "MQ Lizalfos Hall SE Pot", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_3)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(768, 565), "MQ Lizalfos Cage N Pot", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_4)); - locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(767, 517), "MQ Lizalfos Cage S Pot", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_5)); - locationTable[RC_WATER_TEMPLE_MQ_STALFOS_PIT_MIDDLE_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_STALFOS_PIT_MIDDLE_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3500, -751), "MQ Stalfos Pit Middle Pot", RHT_POT_WATER_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_3)); - locationTable[RC_WATER_TEMPLE_MQ_STALFOS_PIT_SOUTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_STALFOS_PIT_SOUTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3500, -686), "MQ Stalfos Pit South Pot", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_4)); - locationTable[RC_WATER_TEMPLE_MQ_STALFOS_PIT_NORTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_STALFOS_PIT_NORTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3500, -810), "MQ Stalfos Pit North Pot", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_5)); - locationTable[RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3188, -1628), "MQ Before Dark Link Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3056, -1626), "MQ Before Dark Link Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3072, -4024), "MQ After Dark Link Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3169, -4023), "MQ After Dark Link Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_RIVER_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_RIVER_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2226, -2487), "MQ River Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_RIVER_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_RIVER_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2184, -2456), "MQ River Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_BOSS_KEY_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_BOSS_KEY_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1033, -1569), "MQ Boss Key Pot", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BOSS_KEY_POT)); - locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 770), "MQ Lowest GS Pot 1", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 808), "MQ Lowest GS Pot 2", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 944), "MQ Lowest GS Pot 3", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_3)); - locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 905), "MQ Lowest GS Pot 4", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_4)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1417, -3025), "MQ Storage Room B Pot 1", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, -3031), "MQ Storage Room B Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2)); - locationTable[RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(28, -3817), "MQ Mini Dodongo Pot 1", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1)); - locationTable[RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-28, -3817), "MQ Mini Dodongo Pot 2", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2)); - locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-324, -72), "MQ Lobby Left Pot 1", RHT_POT_GERUDO_TRAINING_GROUND, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1)); - locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-324, -177), "MQ Lobby Left Pot 2", RHT_POT_GERUDO_TRAINING_GROUND, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2)); - locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(199, -79), "MQ Lobby Right Pot 1", RHT_POT_GERUDO_TRAINING_GROUND, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1)); - locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(197, -179), "MQ Lobby Right Pot 2", RHT_POT_GERUDO_TRAINING_GROUND, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2)); + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Vanilla Spoiler Collection Check + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2391, -1804), "MQ Staircase Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2361, -1161), "MQ Staircase Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1525, -1800), "MQ Staircase Pot 3", RHT_POT_DODONGOS_CAVERN, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1558, -1169), "MQ Staircase Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_MIDDLE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_MIDDLE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1532, -1225), "MQ Torch Puzzle Middle Pot", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3195, -155), "MQ Big Block Pot 1", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BIG_BLOCK_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2704, -483), "MQ Big Block Pot 2", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_BLOCK_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3869, -811), "MQ Upper Lizalfos Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3867, -969), "MQ Upper Lizalfos Pot 2", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4687, -1071), "MQ Upper Lizalfos Pot 3", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(4693, -1194), "MQ Upper Lizalfos Pot 4", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_UPPER_LIZALFOS_POT_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3327, -805), "MQ Two Flames Pot 1", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3326, -753), "MQ Two Flames Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TWO_FLAMES_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_CORNER_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_CORNER_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1827, -587), "MQ Torch Puzzle Corner Pot", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BLOCK_ROOM_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1727, -151), "MQ Right Side Pot 1", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1815, -154), "MQ Right Side Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3442, -469), "MQ Right Side Pot 3", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(3682, -466), "MQ Right Side Pot 4", RHT_POT_DODONGOS_CAVERN, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_RIGHT_SIDE_POT_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1844, -1867), "MQ Poe Room Pot 1", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2272, -2213), "MQ Poe Room Pot 2", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(2240, -1369), "MQ Poe Room Pot 3", RHT_POT_DODONGOS_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4] = Location::Pot(RC_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1535, -1299), "MQ Poe Room Pot 4", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_POE_ROOM_POT_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_SW_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_SW_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(258, -3055), "MQ Before Boss SW Pot", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_NE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BEFORE_BOSS_NE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-265, -2499), "MQ Before Boss NE Pot", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BEFORE_BOSS_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1758, -3194), "MQ Armos Room SE Pot", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SW_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_SW_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1223, -3197), "MQ Armos Room SW Pot", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_1, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1663, -4311), "MQ Backroom Pot 1", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_2] = Location::Pot(RC_DODONGOS_CAVERN_MQ_BACKROOM_POT_2, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1648, -4694), "MQ Backroom Pot 2", RHT_POT_DODONGOS_CAVERN, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_BACKROOM_POT_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NW_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NW_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1005, -3711), "MQ Armos Room NW Pot", RHT_POT_DODONGOS_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NE_POT] = Location::Pot(RC_DODONGOS_CAVERN_MQ_ARMOS_ROOM_NE_POT, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(1066, -3711), "MQ Armos Room NE Pot", RHT_POT_DODONGOS_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_ARMOS_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-183, -449), "MQ Entrance Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(202, -62), "MQ Entrance Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_ENTRANCE_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-689, -1800), "MQ Geyser Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_GEYSER_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(-693, -1614), "MQ Geyser Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_GEYSER_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(697, -2318), "MQ Time Block Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(699, -2445), "MQ Time Block Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_TIME_BLOCK_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(612, -5932), "MQ Like Likes Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_1)); + locationTable[RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(718, -5929), "MQ Like Likes Pot 2", RHT_POT_JABU_JABUS_BELLY, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIKE_LIKES_POT_2)); + locationTable[RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1] = Location::Pot(RC_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1, RCQUEST_MQ, RCAREA_JABU_JABUS_BELLY, SCENE_JABU_JABU, TWO_ACTOR_PARAMS(1305, -2005), "MQ Before Boss Pot 1", RHT_POT_JABU_JABUS_BELLY, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_BEFORE_BOSS_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(675, -989), "MQ Lobby Pot 1", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-429, -981), "MQ Lobby Pot 2", RHT_POT_FOREST_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_2)); + locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(720, -1037), "MQ Lobby Pot 3", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_3)); + locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_4] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_4, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-477, -1034), "MQ Lobby Pot 4", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_4)); + locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_5] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_5, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(630, -943), "MQ Lobby Pot 5", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_5)); + locationTable[RC_FOREST_TEMPLE_MQ_LOBBY_POT_6] = Location::Pot(RC_FOREST_TEMPLE_MQ_LOBBY_POT_6, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-384, -937), "MQ Lobby Pot 6", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOBBY_POT_6)); + locationTable[RC_FOREST_TEMPLE_MQ_WOLFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_WOLFOS_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(90, -3583), "MQ Wolfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_WOLFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_WOLFOS_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(142, -3583), "MQ Wolfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_LOWER_STALFOS_POT_2)); + locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(206, -3631), "MQ Upper Stalfos Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(32, -3012), "MQ Upper Stalfos Pot 2", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_2)); + locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(30, -3631), "MQ Upper Stalfos Pot 3", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_3)); + locationTable[RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4] = Location::Pot(RC_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(202, -3012), "MQ Upper Stalfos Pot 4", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_UPPER_STALFOS_POT_4)); + locationTable[RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(830, -3639), "MQ Blue Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(941, -3640), "MQ Blue Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_2)); + locationTable[RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_BLUE_POE_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(883, -3640), "MQ Blue Poe Pot 3", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BLUE_POE_POT_3)); + locationTable[RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1647, -1529), "MQ Green Poe Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_GREEN_POE_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(1645, -1588), "MQ Green Poe Pot 2", RHT_POT_FOREST_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_GREEN_POE_POT_2)); + locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_1] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_1, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-461, -1095), "MQ Basement Pot 1", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_1)); + locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_2] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_2, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-351, -979), "MQ Basement Pot 2", RHT_POT_FOREST_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_2)); + locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_3] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_3, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-387, -1018), "MQ Basement Pot 3", RHT_POT_FOREST_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_3)); + locationTable[RC_FOREST_TEMPLE_MQ_BASEMENT_POT_4] = Location::Pot(RC_FOREST_TEMPLE_MQ_BASEMENT_POT_4, RCQUEST_MQ, RCAREA_FOREST_TEMPLE, SCENE_FOREST_TEMPLE, TWO_ACTOR_PARAMS(-424, -1057), "MQ Basement Pot 4", RHT_POT_FOREST_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_BASEMENT_POT_4)); + locationTable[RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1873, 2252), "MQ Forest Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1726, 2326), "MQ Forest Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FOREST_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3544, -931), "MQ Water Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3541, -755), "MQ Water Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2073, -4592), "MQ Shadow Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2217, -4516), "MQ Shadow Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SHADOW_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1918, -3957), "MQ Fire Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2052, -3888), "MQ Fire Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_FIRE_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3842, -759), "MQ Light Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-3845, -933), "MQ Light Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_POT_2)); + locationTable[RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1] = Location::Pot(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1402, 1414), "MQ Spirit Trial Pot 1", RHT_POT_GANONS_CASTLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_1)); + locationTable[RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2] = Location::Pot(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1256, 1500), "MQ Spirit Trial Pot 2", RHT_POT_GANONS_CASTLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SPIRIT_TRIAL_POT_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1045, -130), "MQ Whispering Walls Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-1045, -240), "MQ Whispering Walls Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_WHISPERING_WALLS_POT_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-657, -949), "MQ Entrance Redead Pot 1", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-713, -1016), "MQ Entrance Redead Pot 2", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_ENTRANCE_REDEAD_POT_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_WEST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_WEST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(614, 3579), "MQ Lower Umbrella W Pot", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_EAST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_LOWER_UMBRELLA_EAST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(798, 3574), "MQ Lower Umbrella E Pot", RHT_POT_SHADOW_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_SOUTH_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_SOUTH_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3707), "MQ Upper Umbrella S Pot", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_3)); + locationTable[RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_NORTH_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_UPPER_UMBRELLA_NORTH_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1173, 3605), "MQ Upper Umbrella N Pot", RHT_POT_SHADOW_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_FALLING_SPIKES_POT_4)); + locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4222, -916), "MQ Before Boat Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(4549, -922), "MQ Before Boat Pot 2", RHT_POT_SHADOW_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_BEFORE_BOAT_POT_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_WEST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_WEST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2400, -1470), "MQ Before Chasm W Pot", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_EAST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_BEFORE_CHASM_EAST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2230, -1470), "MQ Before Chasm E Pot", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_2)); + locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_WEST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_WEST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2859, -497), "MQ After Chasm W Pot", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_3)); + locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_EAST_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_AFTER_CHASM_EAST_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-2624, -492), "MQ After Chasm E Pot", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_BOAT_POT_4)); + locationTable[RC_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT] = Location::Pot(RC_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4303, -2657), "MQ Spike Baricade Pot", RHT_POT_SHADOW_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_SPIKE_BARICADE_POT)); + locationTable[RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1] = Location::Pot(RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4575, -811), "MQ Dead Hand Pot 1", RHT_POT_SHADOW_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_1)); + locationTable[RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2] = Location::Pot(RC_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(-4036, -811), "MQ Dead Hand Pot 2", RHT_POT_SHADOW_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_DEAD_HAND_POT_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(339, -377), "MQ Inner Lobby Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(416, -377), "MQ Inner Lobby Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(269, -376), "MQ Inner Lobby Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_INNER_LOBBY_POT_3)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(421, -174), "MQ Outer Lobby Pot", RHT_POT_BOTTOM_OF_THE_WELL, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_OUTER_LOBBY_POT)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_1] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_1, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(288, -1240), "MQ East Inner Pot 1", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_1)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_2] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_2, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(438, -1234), "MQ East Inner Pot 2", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_2)); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3] = Location::Pot(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_POT_3, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(444, -1114), "MQ East Inner Pot 3", RHT_POT_BOTTOM_OF_THE_WELL, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_SOUTH_KEY_POT_3)); + locationTable[RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-357, 957), "MQ Entrance Pot 1", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_ENTRANCE_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(356, 959), "MQ Entrance Pot 2", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ENTRANCE_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(187, -1449), "MQ Before Mini Boss Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(188, -1514), "MQ Before Mini Boss Pot 2", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(487, -1450), "MQ Before Mini Boss Pot 3", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_3)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(486, -1515), "MQ Before Mini Boss Pot 4", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_4)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(38, -1179), "MQ Before Mini Boss Pot 5", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_5)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(42, -1298), "MQ Before Mini Boss Pot 6", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_6)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(520, -943), "MQ Before Mini Boss Pot 7", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_7)); + locationTable[RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8] = Location::Pot(RC_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(35, -946), "MQ Before Mini Boss Pot 8", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_BEFORE_MINI_BOSS_POT_8)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1426, -711), "MQ Outside Boss Pot 1", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1425, -660), "MQ Outside Boss Pot 2", RHT_POT_FIRE_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_OUTSIDE_BOSS_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_ROOM_NORTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_ROOM_NORTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1646, -1260), "MQ Lava Room North Pot", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_ROOM_HIGH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_ROOM_HIGH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(2226, -809), "MQ Lava Room High Pot", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_ROOM_SOUTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_ROOM_SOUTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1634, 1475), "MQ Lava Room South Pot", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_POT_3)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(845, -1591), "MQ Lava Torch Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(901, -1593), "MQ Lava Torch Pot 2", RHT_POT_FIRE_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_LAVA_TORCH_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1756, -155), "MQ Above Lava Pot 1", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1819, -82), "MQ Above Lava Pot 2", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3] = Location::Pot(RC_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1789, -122), "MQ Above Lava Pot 3", RHT_POT_FIRE_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_ABOVE_LAVA_POT_3)); + locationTable[RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1] = Location::Pot(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1493, 386), "MQ Flame Wall Pot 1", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2] = Location::Pot(RC_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(1445, 445), "MQ Flame Wall Pot 2", RHT_POT_FIRE_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FLAME_WALL_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_SOUTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2217, -163), "MQ Past Fire Maze North Pot", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_1)); + locationTable[RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_NORTH_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_PAST_FIRE_MAZE_NORTH_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2657, -591), "MQ Past Fire Maze South Pot", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_2)); + locationTable[RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHMOST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHMOST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-1849, -1114), "MQ Fire Maze Northmost Pot", RHT_POT_FIRE_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_3)); + locationTable[RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHWEST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_FIRE_MAZE_NORTHWEST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2110, -646), "MQ Fire Maze North West Pot", RHT_POT_FIRE_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_4)); + locationTable[RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_WEST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_WEST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2319, 838), "MQ South Fire Maze W Pot", RHT_POT_FIRE_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_5)); + locationTable[RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_EAST_POT] = Location::Pot(RC_FIRE_TEMPLE_MQ_SOUTH_FIRE_MAZE_EAST_POT, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(-2285, 803), "MQ South Fire Maze E Pot", RHT_POT_FIRE_TEMPLE, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_MAZE_POT_6)); + locationTable[RC_ICE_CAVERN_MQ_ENTRANCE_POT] = Location::Pot(RC_ICE_CAVERN_MQ_ENTRANCE_POT, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(248, 2287), "MQ Entrance Pot", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_ENTRANCE_POT)); + locationTable[RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(51, 718), "MQ First Crystal Pot 1", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1)); + locationTable[RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(52, 768), "MQ First Crystal Pot 2", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2)); + locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(433, -732), "MQ Early Wolfos Pot 1", RHT_POT_ICE_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1)); + locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(569, -175), "MQ Early Wolfos Pot 2", RHT_POT_ICE_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2)); + locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(521, -131), "MQ Early Wolfos Pot 3", RHT_POT_ICE_CAVERN, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3)); + locationTable[RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4] = Location::Pot(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(138, -672), "MQ Early Wolfos Pot 4", RHT_POT_ICE_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4)); + locationTable[RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1352, 639), "MQ Push Block Pot 1", RHT_POT_ICE_CAVERN, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1)); + locationTable[RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1396, 596), "MQ Push Block Pot 2", RHT_POT_ICE_CAVERN, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2)); + locationTable[RC_ICE_CAVERN_MQ_COMPASS_POT_1] = Location::Pot(RC_ICE_CAVERN_MQ_COMPASS_POT_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(902, -2720), "MQ Compass Pot 1", RHT_POT_ICE_CAVERN, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_1)); + locationTable[RC_ICE_CAVERN_MQ_COMPASS_POT_2] = Location::Pot(RC_ICE_CAVERN_MQ_COMPASS_POT_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(451, -2726), "MQ Compass Pot 2", RHT_POT_ICE_CAVERN, RG_BOMBS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_COMPASS_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-255, 742), "MQ Entrance Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(306, 682), "MQ Entrance Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-297, 687), "MQ Entrance Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3)); + locationTable[RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(260, 735), "MQ Entrance Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-894, -50), "MQ Child Slugma Pot", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_SLUGMA_POT)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-382, -1256), "MQ Child Gibdo Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-381, -1207), "MQ Child Gibdo Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_GIBDO_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1035, -1240), "MQ Child Like Like Pot", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LIKE_LIKE_POT)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1166, -1931), "MQ Child Stalfos Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-959, -1930), "MQ Child Stalfos Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-853, -1837), "MQ Child Stalfos Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_3)); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1250, -1852), "MQ Child Stalfos Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_STALFOS_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_2F_CENTER_EAST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_CENTER_EAST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(639, -1224), "MQ Statue Room 2F CE Pot", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_3F_EAST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_3F_EAST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-521, -1576), "MQ Statue Room 3F E Pot", RHT_POT_SPIRIT_TEMPLE, RG_ARROWS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_3F_WEST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_3F_WEST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-595, -1576), "MQ Statue Room 3F W Pot", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_3)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_2F_WEST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_WEST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-559, -1209), "MQ Statue Room 2F W Pot", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_MQ_STATUE_2F_EASTMOST_POT] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_STATUE_2F_EASTMOST_POT, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(704, -1224), "MQ Statue Room 2F E Pot", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CENTRAL_CHAMBER_POT_5)); + locationTable[RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1276, 432), "MQ Sun Blocks Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1635, -446), "MQ Sun Blocks Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_DEKU_SEEDS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_SUN_BLOCKS_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(829, 250), "MQ Long Climb Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(531, 249), "MQ Long Climb Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(244, -893), "MQ Big Mirror Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-122, -741), "MQ Big Mirror Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(250, -741), "MQ Big Mirror Pot 3", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_3)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-123, -892), "MQ Big Mirror Pot 4", RHT_POT_SPIRIT_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BIG_MIRROR_POT_4)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(781, -841), "MQ Before Mirror Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(587, -844), "MQ Before Mirror Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_BEFORE_MIRROR_POT_2)); + locationTable[RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1204, -910), "MQ Early Adult Pot 1", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_1)); + locationTable[RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2] = Location::Pot(RC_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1204, -1028), "MQ Early Adult Pot 2", RHT_POT_SPIRIT_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_EARLY_ADULT_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 62), "MQ Lower Torches Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1123, 293), "MQ Lower Torches Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWER_TORCHES_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1222, -617), "MQ Storage Room A Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1122, -617), "MQ Storage Room A Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(1172, -617), "MQ Storage Room A Pot 3", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_A_POT_3)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-989, 255), "MQ GS Storage Room Pot 1", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1026, 257), "MQ GS Storage Room Pot 2", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3] = Location::Pot(RC_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1062, 256), "MQ GS Storage Room Pot 3", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_GS_STORAGE_ROOM_POT_3)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_WEST_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(512, 579), "MQ Lizalfos Hall W Pot", RHT_POT_WATER_TEMPLE, RG_RED_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SOUTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(602, 1022), "MQ Lizalfos Hall S Pot", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_HALLWAY_SE_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(789, 947), "MQ Lizalfos Hall SE Pot", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_3)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_SOUTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(768, 565), "MQ Lizalfos Cage N Pot", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_4)); + locationTable[RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_LIZALFOS_CAGE_NORTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(767, 517), "MQ Lizalfos Cage S Pot", RHT_POT_WATER_TEMPLE, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_CENTRAL_GATE_POT_5)); + locationTable[RC_WATER_TEMPLE_MQ_STALFOS_PIT_MIDDLE_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_STALFOS_PIT_MIDDLE_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3500, -751), "MQ Stalfos Pit Middle Pot", RHT_POT_WATER_TEMPLE, RG_DEKU_NUTS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_3)); + locationTable[RC_WATER_TEMPLE_MQ_STALFOS_PIT_SOUTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_STALFOS_PIT_SOUTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3500, -686), "MQ Stalfos Pit South Pot", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_4)); + locationTable[RC_WATER_TEMPLE_MQ_STALFOS_PIT_NORTH_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_STALFOS_PIT_NORTH_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3500, -810), "MQ Stalfos Pit North Pot", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_5)); + locationTable[RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3188, -1628), "MQ Before Dark Link Pot 1", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3056, -1626), "MQ Before Dark Link Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BEFORE_DARK_LINK_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3072, -4024), "MQ After Dark Link Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_30, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-3169, -4023), "MQ After Dark Link Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_AFTER_DARK_LINK_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_RIVER_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_RIVER_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2226, -2487), "MQ River Pot 1", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_RIVER_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_RIVER_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2184, -2456), "MQ River Pot 2", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_RIVER_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_BOSS_KEY_POT] = Location::Pot(RC_WATER_TEMPLE_MQ_BOSS_KEY_POT, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1033, -1569), "MQ Boss Key Pot", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_BOSS_KEY_POT)); + locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 770), "MQ Lowest GS Pot 1", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2314, 808), "MQ Lowest GS Pot 2", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_3, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 944), "MQ Lowest GS Pot 3", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_3)); + locationTable[RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4] = Location::Pot(RC_WATER_TEMPLE_MQ_LOWEST_GS_POT_4, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-2313, 905), "MQ Lowest GS Pot 4", RHT_POT_WATER_TEMPLE, RG_ARROWS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_LOWEST_GS_POT_4)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1417, -3025), "MQ Storage Room B Pot 1", RHT_POT_WATER_TEMPLE, RG_GREEN_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-1150, -3031), "MQ Storage Room B Pot 2", RHT_POT_WATER_TEMPLE, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_STORAGE_ROOM_B_POT_2)); + locationTable[RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1] = Location::Pot(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(28, -3817), "MQ Mini Dodongo Pot 1", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_1)); + locationTable[RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2] = Location::Pot(RC_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(-28, -3817), "MQ Mini Dodongo Pot 2", RHT_POT_WATER_TEMPLE, RG_BOMBS_5, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_MQ_MINI_DODONGO_POT_2)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-324, -72), "MQ Lobby Left Pot 1", RHT_POT_GERUDO_TRAINING_GROUND, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_1)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-324, -177), "MQ Lobby Left Pot 2", RHT_POT_GERUDO_TRAINING_GROUND, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_POT_2)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(199, -79), "MQ Lobby Right Pot 1", RHT_POT_GERUDO_TRAINING_GROUND, RG_RECOVERY_HEART, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_1)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2] = Location::Pot(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(197, -179), "MQ Lobby Right Pot 2", RHT_POT_GERUDO_TRAINING_GROUND, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_POT_2)); // clang-format on } diff --git a/soh/soh/Enhancements/randomizer/entrance.cpp b/soh/soh/Enhancements/randomizer/entrance.cpp index 377a76438..00a7a5adb 100644 --- a/soh/soh/Enhancements/randomizer/entrance.cpp +++ b/soh/soh/Enhancements/randomizer/entrance.cpp @@ -276,8 +276,8 @@ void SetAllEntrancesData() { { EntranceType::Dungeon, RR_BOTTOM_OF_THE_WELL_ENTRYWAY, RR_KAK_WELL, ENTR_KAKARIKO_VILLAGE_OUTSIDE_BOTTOM_OF_THE_WELL } }, { { EntranceType::Dungeon, RR_ZF_LEDGE, RR_ICE_CAVERN_ENTRYWAY, ENTR_ICE_CAVERN_ENTRANCE }, { EntranceType::Dungeon, RR_ICE_CAVERN_ENTRYWAY, RR_ZF_LEDGE, ENTR_ZORAS_FOUNTAIN_OUTSIDE_ICE_CAVERN } }, - { { EntranceType::Dungeon, RR_GERUDO_FORTRESS, RR_GERUDO_TRAINING_GROUND_ENTRYWAY, ENTR_GERUDO_TRAINING_GROUND_ENTRANCE }, - { EntranceType::Dungeon, RR_GERUDO_TRAINING_GROUND_ENTRYWAY, RR_GERUDO_FORTRESS, ENTR_GERUDOS_FORTRESS_OUTSIDE_GERUDO_TRAINING_GROUND } }, + { { EntranceType::Dungeon, RR_GF_OUTSIDE_GTG, RR_GERUDO_TRAINING_GROUND_ENTRYWAY, ENTR_GERUDO_TRAINING_GROUND_ENTRANCE }, + { EntranceType::Dungeon, RR_GERUDO_TRAINING_GROUND_ENTRYWAY, RR_GF_OUTSIDE_GTG, ENTR_GERUDOS_FORTRESS_OUTSIDE_GERUDO_TRAINING_GROUND } }, { { EntranceType::GanonDungeon, RR_GANONS_CASTLE_LEDGE, RR_GANONS_CASTLE_ENTRYWAY, ENTR_INSIDE_GANONS_CASTLE_ENTRANCE }, { EntranceType::GanonDungeon, RR_GANONS_CASTLE_ENTRYWAY, RR_CASTLE_GROUNDS_FROM_GANONS_CASTLE, ENTR_CASTLE_GROUNDS_RAINBOW_BRIDGE_EXIT } }, @@ -429,8 +429,8 @@ void SetAllEntrancesData() { { EntranceType::GrottoGrave, RR_KF_STORMS_GROTTO, RR_KOKIRI_FOREST, ENTRANCE_GROTTO_EXIT(GROTTO_KF_STORMS_OFFSET) } }, { { EntranceType::GrottoGrave, RR_ZORAS_DOMAIN_ISLAND, RR_ZD_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_ZD_STORMS_OFFSET) }, { EntranceType::GrottoGrave, RR_ZD_STORMS_GROTTO, RR_ZORAS_DOMAIN_ISLAND, ENTRANCE_GROTTO_EXIT(GROTTO_ZD_STORMS_OFFSET) } }, - { { EntranceType::GrottoGrave, RR_GERUDO_FORTRESS, RR_GF_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_GF_STORMS_OFFSET) }, - { EntranceType::GrottoGrave, RR_GF_STORMS_GROTTO, RR_GERUDO_FORTRESS, ENTRANCE_GROTTO_EXIT(GROTTO_GF_STORMS_OFFSET) } }, + { { EntranceType::GrottoGrave, RR_GF_NEAR_GROTTO, RR_GF_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_GF_STORMS_OFFSET) }, + { EntranceType::GrottoGrave, RR_GF_STORMS_GROTTO, RR_GF_NEAR_GROTTO, ENTRANCE_GROTTO_EXIT(GROTTO_GF_STORMS_OFFSET) } }, { { EntranceType::GrottoGrave, RR_GV_FORTRESS_SIDE, RR_GV_STORMS_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_GV_STORMS_OFFSET) }, { EntranceType::GrottoGrave, RR_GV_STORMS_GROTTO, RR_GV_FORTRESS_SIDE, ENTRANCE_GROTTO_EXIT(GROTTO_GV_STORMS_OFFSET) } }, { { EntranceType::GrottoGrave, RR_GV_GROTTO_LEDGE, RR_GV_OCTOROK_GROTTO, ENTRANCE_GROTTO_LOAD(GROTTO_GV_OCTOROK_OFFSET) }, @@ -474,8 +474,8 @@ void SetAllEntrancesData() { { EntranceType::Overworld, RR_LON_LON_RANCH, RR_HYRULE_FIELD, ENTR_HYRULE_FIELD_CENTER_EXIT } }, { { EntranceType::Overworld, RR_LH_FROM_SHORTCUT, RR_ZORAS_DOMAIN, ENTR_ZORAS_DOMAIN_UNDERWATER_SHORTCUT }, { EntranceType::Overworld, RR_ZORAS_DOMAIN, RR_LH_FROM_SHORTCUT, ENTR_LAKE_HYLIA_UNDERWATER_SHORTCUT } }, - { { EntranceType::Overworld, RR_GV_FORTRESS_SIDE, RR_GERUDO_FORTRESS, ENTR_GERUDOS_FORTRESS_EAST_EXIT }, - { EntranceType::Overworld, RR_GERUDO_FORTRESS, RR_GV_FORTRESS_SIDE, ENTR_GERUDO_VALLEY_WEST_EXIT } }, + { { EntranceType::Overworld, RR_GV_FORTRESS_SIDE, RR_GF_OUTSKIRTS, ENTR_GERUDOS_FORTRESS_EAST_EXIT }, + { EntranceType::Overworld, RR_GF_OUTSKIRTS, RR_GV_FORTRESS_SIDE, ENTR_GERUDO_VALLEY_WEST_EXIT } }, { { EntranceType::Overworld, RR_GF_OUTSIDE_GATE, RR_WASTELAND_NEAR_FORTRESS, ENTR_HAUNTED_WASTELAND_EAST_EXIT }, { EntranceType::Overworld, RR_WASTELAND_NEAR_FORTRESS, RR_GF_OUTSIDE_GATE, ENTR_GERUDOS_FORTRESS_GATE_EXIT } }, { { EntranceType::Overworld, RR_WASTELAND_NEAR_COLOSSUS, RR_DESERT_COLOSSUS, ENTR_DESERT_COLOSSUS_EAST_EXIT }, diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index ad0c9823d..92d210300 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -1452,7 +1452,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l break; } case VB_GIVE_ITEM_GERUDO_MEMBERSHIP_CARD: { - Flags_SetRandomizerInf(RAND_INF_GF_ITEM_FROM_LEADER_OF_FORTRESS); + Flags_SetRandomizerInf(RAND_INF_TH_ITEM_FROM_LEADER_OF_FORTRESS); *should = false; break; } diff --git a/soh/soh/Enhancements/randomizer/location_access.cpp b/soh/soh/Enhancements/randomizer/location_access.cpp index fe68b1273..2fb04dccd 100644 --- a/soh/soh/Enhancements/randomizer/location_access.cpp +++ b/soh/soh/Enhancements/randomizer/location_access.cpp @@ -671,7 +671,12 @@ void RegionTable_Init() { // clang-format off areaTable[RR_ROOT] = Region("Root", SCENE_ID_MAX, TIME_DOESNT_PASS, {RA_LINKS_POCKET}, { //Events - EventAccess(&logic->KakarikoVillageGateOpen, []{return ctx->GetOption(RSK_KAK_GATE).Is(RO_KAK_GATE_OPEN);}), + EventAccess(&logic->KakarikoVillageGateOpen, []{return ctx->GetOption(RSK_KAK_GATE).Is(RO_KAK_GATE_OPEN);}), + EventAccess(&logic->THCouldFree1TorchCarpenter, []{return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE);}), + EventAccess(&logic->THCouldFreeDoubleCellCarpenter, []{return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE) || ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FAST);}), + EventAccess(&logic->TH_CouldFreeDeadEndCarpenter, []{return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE) || ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FAST);}), + EventAccess(&logic->THCouldRescueSlopeCarpenter, []{return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE) || ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FAST);}), + EventAccess(&logic->THRescuedAllCarpenters, []{return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE);}), }, { //Locations LOCATION(RC_LINKS_POCKET, true), @@ -756,6 +761,7 @@ void RegionTable_Init() { RegionTable_Init_ZorasFountain(); RegionTable_Init_GerudoValley(); RegionTable_Init_GerudoFortress(); + RegionTable_Init_ThievesHideout(); RegionTable_Init_HauntedWasteland(); RegionTable_Init_DesertColossus(); // Dungeons diff --git a/soh/soh/Enhancements/randomizer/location_access.h b/soh/soh/Enhancements/randomizer/location_access.h index 2b491f907..547000ce5 100644 --- a/soh/soh/Enhancements/randomizer/location_access.h +++ b/soh/soh/Enhancements/randomizer/location_access.h @@ -389,5 +389,6 @@ void RegionTable_Init_SpiritTemple(); void RegionTable_Init_ShadowTemple(); void RegionTable_Init_BottomOfTheWell(); void RegionTable_Init_IceCavern(); +void RegionTable_Init_ThievesHideout(); void RegionTable_Init_GerudoTrainingGround(); void RegionTable_Init_GanonsCastle(); \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp index d96c60626..2eb8764e1 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp @@ -11,7 +11,7 @@ void RegionTable_Init_GerudoTrainingGround() { //Exits Entrance(RR_GERUDO_TRAINING_GROUND_LOBBY, []{return ctx->GetDungeon(GERUDO_TRAINING_GROUND)->IsVanilla();}), Entrance(RR_GERUDO_TRAINING_GROUND_MQ_LOBBY, []{return ctx->GetDungeon(GERUDO_TRAINING_GROUND)->IsMQ();}), - Entrance(RR_GERUDO_FORTRESS, []{return true;}), + Entrance(RR_GF_OUTSIDE_GTG, []{return true;}), }); #pragma region Vanilla diff --git a/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp b/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp deleted file mode 100644 index 1a55e6829..000000000 --- a/soh/soh/Enhancements/randomizer/location_access/gerudo_fortress.cpp +++ /dev/null @@ -1,120 +0,0 @@ -#include "soh/Enhancements/randomizer/location_access.h" -#include "soh/Enhancements/randomizer/entrance.h" - -using namespace Rando; - -/* - * This file should be split into "gerudo_fortress.cpp" (overworld) & "thieves_hideout.cpp" (dungeons) - * when the gerudo fortress refactor is done - */ - -void RegionTable_Init_GerudoFortress() { - // clang-format off - areaTable[RR_GERUDO_FORTRESS] = Region("Gerudo Fortress", SCENE_GERUDOS_FORTRESS, { - //Events - EventAccess(&logic->CarpenterRescue, []{return logic->CanFinishGerudoFortress();}), - EventAccess(&logic->GF_GateOpen, []{return logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD);}), - EventAccess(&logic->GtG_GateOpen, []{return logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->HasItem(RG_CHILD_WALLET);}), - }, { - //Locations - LOCATION(RC_GF_CHEST, logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && logic->CanUse(RG_SCARECROW)) || logic->CanUse(RG_LONGSHOT)), - LOCATION(RC_GF_HBA_1000_POINTS, 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->HasItem(RG_CHILD_WALLET) && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->CanUse(RG_EPONA) && logic->CanUse(RG_FAIRY_BOW) && logic->AtDay), - LOCATION(RC_GF_NORTH_F1_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), - LOCATION(RC_GF_NORTH_F2_CARPENTER, (logic->CanKillEnemy(RE_GERUDO_WARRIOR)) && (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS) || ctx->GetTrickOption(RT_GF_KITCHEN))), - LOCATION(RC_GF_SOUTH_F1_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), - LOCATION(RC_GF_SOUTH_F2_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), - LOCATION(RC_GF_GERUDO_MEMBERSHIP_CARD, logic->CanFinishGerudoFortress()), - LOCATION(RC_GF_GS_ARCHERY_RANGE, logic->IsAdult && logic->HookshotOrBoomerang() && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->CanGetNightTimeGS()), - LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && (logic->CanJumpslashExceptHammer() || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG) || logic->HasExplosives() || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_DINS_FIRE)) && (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS) || ctx->GetTrickOption(RT_GF_KITCHEN) || ctx->GetTrickOption(RT_GF_JUMP)) && logic->CanGetNightTimeGS()), - LOCATION(RC_GF_BREAK_ROOM_POT_1, (logic->CanUse(RG_LONGSHOT) || (logic->IsAdult && logic->CanUse(RG_SCARECROW)) || (logic->CanUse(RG_HOVER_BOOTS) || (ctx->GetTrickOption(RT_GF_JUMP) && (ctx->GetTrickOption(RT_GF_KITCHEN) || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT))))) && logic->CanBreakPots()), - LOCATION(RC_GF_BREAK_ROOM_POT_2, (logic->CanUse(RG_LONGSHOT) || (logic->IsAdult && logic->CanUse(RG_SCARECROW)) || (logic->CanUse(RG_HOVER_BOOTS) || (ctx->GetTrickOption(RT_GF_JUMP) && (ctx->GetTrickOption(RT_GF_KITCHEN) || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT))))) && logic->CanBreakPots()), - LOCATION(RC_GF_KITCHEN_POT_1, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakPots()), - LOCATION(RC_GF_KITCHEN_POT_2, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakPots()), - LOCATION(RC_GF_NORTH_F1_CARPENTER_POT_1, logic->CanBreakPots()), - LOCATION(RC_GF_NORTH_F1_CARPENTER_POT_2, logic->CanBreakPots()), - LOCATION(RC_GF_NORTH_F1_CARPENTER_POT_3, logic->CanBreakPots()), - LOCATION(RC_GF_NORTH_F2_CARPENTER_POT_1, logic->CanBreakPots()), - LOCATION(RC_GF_NORTH_F2_CARPENTER_POT_2, logic->CanBreakPots()), - LOCATION(RC_GF_SOUTH_F1_CARPENTER_POT_1, logic->CanBreakPots()), - LOCATION(RC_GF_SOUTH_F1_CARPENTER_POT_2, logic->CanBreakPots()), - LOCATION(RC_GF_SOUTH_F1_CARPENTER_POT_3, logic->CanBreakPots()), - LOCATION(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_1, logic->CanBreakPots()), - LOCATION(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_2, logic->CanBreakPots()), - LOCATION(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_3, logic->CanBreakPots()), - LOCATION(RC_GF_SOUTH_F1_CARPENTER_CELL_POT_4, logic->CanBreakPots()), - LOCATION(RC_GF_ABOVE_JAIL_CRATE, (logic->CanUse(RG_LONGSHOT) || (logic->IsAdult && logic->CanUse(RG_SCARECROW)) || (logic->CanUse(RG_HOOKSHOT) && ctx->GetTrickOption(RT_GF_JUMP))) && logic->CanBreakCrates()), - LOCATION(RC_GF_OUTSIDE_CENTER_CRATE_1, logic->CanBreakCrates()), - LOCATION(RC_GF_OUTSIDE_CENTER_CRATE_2, logic->CanBreakCrates()), - LOCATION(RC_GF_OUTSIDE_CENTER_CRATE_3, logic->CanBreakCrates()), - LOCATION(RC_GF_OUTSIDE_CENTER_CRATE_4, logic->CanBreakCrates()), - LOCATION(RC_GF_OUTSIDE_LEFT_CRATE_1, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), - LOCATION(RC_GF_OUTSIDE_LEFT_CRATE_2, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), - LOCATION(RC_GF_ARCHERY_RANGE_CRATE_1, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), - LOCATION(RC_GF_ARCHERY_RANGE_CRATE_2, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), - LOCATION(RC_GF_ARCHERY_RANGE_CRATE_3, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), - LOCATION(RC_GF_ARCHERY_RANGE_CRATE_4, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), - LOCATION(RC_GF_ARCHERY_RANGE_CRATE_5, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), - LOCATION(RC_GF_ARCHERY_RANGE_CRATE_6, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), - LOCATION(RC_GF_ARCHERY_RANGE_CRATE_7, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), - LOCATION(RC_GF_ARCHERY_START_CRATE_1, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), - LOCATION(RC_GF_ARCHERY_START_CRATE_2, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), - LOCATION(RC_GF_ARCHERY_LEFT_END_CRATE_1, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), - LOCATION(RC_GF_ARCHERY_LEFT_END_CRATE_2, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && (logic->IsAdult || (logic->BlastOrSmash() || logic->HookshotOrBoomerang() || logic->CanUse(RG_HOVER_BOOTS)))), - LOCATION(RC_GF_ARCHERY_LEFT_END_CHILD_CRATE, logic->IsChild && logic->HasExplosives() && logic->CanBreakCrates()), - LOCATION(RC_GF_ARCHERY_RIGHT_END_CRATE_1, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), - LOCATION(RC_GF_ARCHERY_RIGHT_END_CRATE_2, (logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD)) && logic->CanBreakCrates()), - LOCATION(RC_GF_KITCHEN_CRATE_1, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), - LOCATION(RC_GF_KITCHEN_CRATE_2, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), - LOCATION(RC_GF_KITCHEN_CRATE_3, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), - LOCATION(RC_GF_KITCHEN_CRATE_4, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), - LOCATION(RC_GF_KITCHEN_CRATE_5, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), - LOCATION(RC_GF_BREAK_ROOM_CRATE_1, (logic->CanUse(RG_LONGSHOT) || (logic->IsAdult && logic->CanUse(RG_SCARECROW)) || (logic->CanUse(RG_HOVER_BOOTS) || (ctx->GetTrickOption(RT_GF_JUMP) && (ctx->GetTrickOption(RT_GF_KITCHEN) || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT))))) && logic->CanBreakCrates()), - LOCATION(RC_GF_BREAK_ROOM_CRATE_2, (logic->CanUse(RG_LONGSHOT) || (logic->IsAdult && logic->CanUse(RG_SCARECROW)) || (logic->CanUse(RG_HOVER_BOOTS) || (ctx->GetTrickOption(RT_GF_JUMP) && (ctx->GetTrickOption(RT_GF_KITCHEN) || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT))))) && logic->CanBreakCrates()), - LOCATION(RC_GF_BREAK_ROOM_CRATE_3, (logic->CanUse(RG_LONGSHOT) || (logic->IsAdult && logic->CanUse(RG_SCARECROW)) || ((logic->CanUse(RG_HOVER_BOOTS) || ctx->GetTrickOption(RT_GF_JUMP)) && (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW)))) && logic->CanBreakCrates()), - LOCATION(RC_GF_BREAK_ROOM_CRATE_4, (logic->CanUse(RG_LONGSHOT) || (logic->IsAdult && logic->CanUse(RG_SCARECROW)) || ((logic->CanUse(RG_HOVER_BOOTS) || ctx->GetTrickOption(RT_GF_JUMP)) && (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW)))) && logic->CanBreakCrates()), - LOCATION(RC_GF_NORTH_F1_CARPENTER_CRATE, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), - LOCATION(RC_GF_NORTH_F3_CARPENTER_CRATE, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanBreakCrates()), - LOCATION(RC_GF_SOUTH_F2_CARPENTER_CRATE_1, logic->CanBreakCrates()), - LOCATION(RC_GF_SOUTH_F2_CARPENTER_CRATE_2, logic->CanBreakCrates()), - - - //RANDOTODO doublecheck when GF isn't a blob - LOCATION(RC_GF_KITCHEN_SUN_FAIRY, (logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT)) && logic->CanUse(RG_SUNS_SONG)), - }, { - //Exits - Entrance(RR_GV_FORTRESS_SIDE, []{return true;}), - Entrance(RR_GF_OUTSIDE_GATE, []{return logic->GF_GateOpen;}), - Entrance(RR_GERUDO_TRAINING_GROUND_ENTRYWAY, []{return logic->GtG_GateOpen && (logic->IsAdult || ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES));}), - Entrance(RR_GF_STORMS_GROTTO, []{return logic->IsAdult && logic->CanOpenStormsGrotto();}), - }); - - areaTable[RR_GF_OUTSIDE_GATE] = Region("GF Outside Gate", SCENE_GERUDOS_FORTRESS, { - //Events - EventAccess(&logic->GF_GateOpen, []{return logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && (ctx->GetOption(RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD) || ctx->GetOption(RSK_SHUFFLE_OVERWORLD_ENTRANCES) /*|| ShuffleSpecialIndoorEntrances*/);}), - }, {}, { - //Exits - Entrance(RR_GERUDO_FORTRESS, []{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", SCENE_GROTTOS, { - //Events - EventAccess(&logic->FreeFairies, []{return true;}), - }, { - //Locations - LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_1, true), - LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_2, true), - LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_3, true), - LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_4, true), - LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_5, true), - LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_6, true), - LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_7, true), - LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_8, true), - }, { - //Exits - Entrance(RR_GERUDO_FORTRESS, []{return true;}), - }); - - // clang-format on -} diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_fortress.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_fortress.cpp new file mode 100644 index 000000000..e26e841f0 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_fortress.cpp @@ -0,0 +1,249 @@ +#include "soh/Enhancements/randomizer/location_access.h" +#include "soh/Enhancements/randomizer/entrance.h" + +using namespace Rando; + +// clang-format off +void RegionTable_Init_GerudoFortress() { +#pragma region Ground + + areaTable[RR_GF_OUTSKIRTS] = Region("Gerudo Fortress Outskirts", SCENE_GERUDOS_FORTRESS, { + //Events + EventAccess(&logic->GF_GateOpen, []{return logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD);}), //needs climb + }, { + //Locations + LOCATION(RC_GF_OUTSKIRTS_NE_CRATE, (logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD)) && logic->CanBreakCrates()), + LOCATION(RC_GF_OUTSKIRTS_NW_CRATE, logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD)), + }, { + //Exits + Entrance(RR_GV_FORTRESS_SIDE, []{return true;}), + Entrance(RR_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_GF_OUTSIDE_GTG, []{return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD);}), + //You can talk to the guards to get yourself thrown in jail, so long as you have a hookshot to actually end up there + Entrance(RR_GF_JAIL_WINDOW, []{return logic->CanUse(RG_HOOKSHOT);}), + }); + + areaTable[RR_GF_NEAR_GROTTO] = Region("GF Near Grotto", SCENE_GERUDOS_FORTRESS, {}, { + //Locations + LOCATION(RC_GF_SOUTHMOST_CENTER_CRATE, logic->CanBreakCrates()), + LOCATION(RC_GF_MID_SOUTH_CENTER_CRATE, logic->CanBreakCrates()), + LOCATION(RC_GF_MID_NORTH_CENTER_CRATE, logic->CanBreakCrates()), + LOCATION(RR_GF_NORTHMOST_CENTER_CRATE, logic->CanBreakCrates()), + }, { + //Exits + Entrance(RR_TH_1_TORCH_CELL, []{return true;}), + Entrance(RR_TH_STEEP_SLOPE_CELL, []{return true;}), + Entrance(RR_TH_KITCHEN_CORRIDOR, []{return true;}), + //Jail + Entrance(RR_GF_OUTSKIRTS, []{return true;}), + Entrance(RR_GF_JAIL_WINDOW, []{return logic->CanUse(RG_HOOKSHOT);}), + 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_STORMS_GROTTO, []{return logic->IsAdult && logic->CanOpenStormsGrotto();}), + }); + + areaTable[RR_GF_OUTSIDE_GTG] = Region("GF Outside GTG", SCENE_GERUDOS_FORTRESS, { + //Events + EventAccess(&logic->GtG_GateOpen, []{return (logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->HasItem(RG_CHILD_WALLET));}), + }, {}, { + //Exits + Entrance(RR_GERUDO_TRAINING_GROUND_ENTRYWAY, []{return logic->GtG_GateOpen && (logic->IsAdult || ctx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES));}), + //Jail + Entrance(RR_GF_JAIL_WINDOW, []{return logic->CanUse(RG_HOOKSHOT);}), + Entrance(RR_GF_OUTSKIRTS, []{return true;}), + Entrance(RR_GF_NEAR_GROTTO, []{return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD);}), + // RANDTODO: Add tricks for getting past the gerudo guarding the hba range + Entrance(RR_GF_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_HBA_RANGE, []{return logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD);}), + }); + +#pragma endregion + +#pragma region Rooftops + + areaTable[RR_GF_ABOVE_GTG] = Region("GF Above GTG", SCENE_GERUDOS_FORTRESS, {}, {}, { + //Exits + Entrance(RR_TH_DOUBLE_CELL, []{return true;}), + Entrance(RR_TH_KITCHEN_CORRIDOR, []{return true;}), + //Jail + Entrance(RR_GF_JAIL_WINDOW, []{return logic->CanUse(RG_HOOKSHOT);}), + Entrance(RR_GF_OUTSKIRTS, []{return true;}), + Entrance(RR_GF_NEAR_GROTTO, []{return true;}), + Entrance(RR_GF_OUTSIDE_GTG, []{return logic->IsChild || logic->CanPassEnemy(RE_GERUDO_GUARD);}), + // need to explicitly convert it into a bool + Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, []{return ctx->GetTrickOption(RT_GF_JUMP).Get() != 0 ;}), + }); + + areaTable[RR_GF_BOTTOM_OF_LOWER_VINES] = Region("GF Bottom of Lower Vines", SCENE_GERUDOS_FORTRESS, {}, {}, { + //Exits + 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_ABOVE_GTG, []{return true;}), + }); + + areaTable[RR_GF_TOP_OF_LOWER_VINES] = Region("GF Top of Lower Vines", SCENE_GERUDOS_FORTRESS, {}, {}, { + //Exits + Entrance(RR_TH_KITCHEN_TOP, []{return true;}), + Entrance(RR_TH_DOUBLE_CELL, []{return true;}), + Entrance(RR_GF_ABOVE_GTG, []{return true;}), + Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, []{return true;}), + // need to explicitly convert it into a bool + Entrance(RR_GF_BOTTOM_OF_UPPER_VINES, []{return logic->IsAdult && ctx->GetTrickOption(RT_GF_JUMP).Get();}), + }); + + areaTable[RR_GF_NEAR_GS] = Region("GF Near GS", SCENE_GERUDOS_FORTRESS, {}, { + //Locations + LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOMB_THROW) && logic->CanGetNightTimeGS()), + }, { + //Exits + Entrance(RR_TH_KITCHEN_TOP, []{return true;}), + Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, []{return true;}), + Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true;}), + Entrance(RR_GF_SLOPED_ROOF, []{return logic->IsAdult;}), + Entrance(RR_GF_LONG_ROOF, []{return logic->CanUse(RG_HOVER_BOOTS) /* || bunny hood jump */ || logic->IsAdult && ctx->GetTrickOption(RT_GF_JUMP);}), + Entrance(RR_GF_NEAR_CHEST, []{return logic->CanUse(RG_LONGSHOT);}), + Entrance(RR_GF_BELOW_GS, []{return true;}), + }); + + areaTable[RR_GF_SLOPED_ROOF] = Region("GF Sloped Roof", SCENE_GERUDOS_FORTRESS, {}, {}, { + //Exits + Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true;}), + Entrance(RR_GF_NEAR_GS, []{return true;}), + Entrance(RR_GF_BOTTOM_OF_UPPER_VINES, []{return true;}), + Entrance(RR_GF_TOP_OF_UPPER_VINES, []{return logic->IsAdult && ctx->GetTrickOption(RT_GF_JUMP).Get();}), + }); + + areaTable[RR_GF_BOTTOM_OF_UPPER_VINES] = Region("GF Bottom of Upper Vines", SCENE_GERUDOS_FORTRESS, {}, {}, { + //Exits + Entrance(RR_GF_OUTSIDE_GTG, []{return true;}), + Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true;}), + Entrance(RR_GF_SLOPED_ROOF, []{return logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS);}), + Entrance(RR_GF_TOP_OF_UPPER_VINES, []{return true /* logic->CanClimb() */;}), + }); + + areaTable[RR_GF_TOP_OF_UPPER_VINES] = Region("GF Top of Upper Vines", SCENE_GERUDOS_FORTRESS, {}, { + //Locations + //if RR_GF_SLOPED_ROOF > RR_GF_TOP_OF_UPPER_VINES is ever made part of RT_GF_JUMP, climb is needed to get back up + LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_SHORT_JUMPSLASH) && logic->CanGetNightTimeGS()), + }, { + //Exits + Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true;}), + Entrance(RR_GF_SLOPED_ROOF, []{return true;}), + Entrance(RR_GF_BOTTOM_OF_UPPER_VINES, []{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", SCENE_GERUDOS_FORTRESS, {}, { + //Locations + LOCATION(RC_GF_CHEST, true), + LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG) && logic->CanGetNightTimeGS()), + }, { + //Exits + Entrance(RR_GF_NEAR_GS, []{return true;}), + Entrance(RR_GF_LONG_ROOF, []{return true;}), + }); + + areaTable[RR_GF_LONG_ROOF] = Region("GF Long Roof", SCENE_GERUDOS_FORTRESS, {}, {}, { + //Exits + Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, []{return true;}), + Entrance(RR_GF_NEAR_GS, []{return (logic->IsAdult && ctx->GetTrickOption(RT_GF_JUMP)) || logic->CanUse(RG_HOVER_BOOTS);}), + Entrance(RR_GF_BELOW_GS, []{return true;}), + Entrance(RR_GF_NEAR_CHEST, []{return logic->CanUse(RG_LONGSHOT);}), + Entrance(RR_GF_BELOW_CHEST, []{return true;}), + }); + + areaTable[RR_GF_BELOW_GS] = Region("GF Below GS", SCENE_GERUDOS_FORTRESS, {}, { + //Locations + LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_LONGSHOT) && logic->CanGetNightTimeGS()), + }, { + //Exits + Entrance(RR_TH_DEAD_END_CELL, []{return true;}), + Entrance(RR_GF_BOTTOM_OF_LOWER_VINES, []{return true;}), + }); + + areaTable[RR_GF_BELOW_CHEST] = Region("GF Below Chest", SCENE_GERUDOS_FORTRESS, {}, {}, { + //Exits + Entrance(RR_TH_BREAK_ROOM, []{return true;}), + Entrance(RR_GF_OUTSKIRTS, []{return true;}), + }); + + +#pragma endregion + + areaTable[RR_GF_ABOVE_JAIL] = Region("GF Above Jail", SCENE_GERUDOS_FORTRESS, {}, { + //Locations + LOCATION(RC_GF_ABOVE_JAIL_CRATE, true), + }, { + //Exits + //you don't take fall damage if you land on the rock with the flag on for some reason + //there's a trick to reach RR_GF_LONG_ROOF but that's too intricate for GF_JUMP + Entrance(RR_GF_OUTSKIRTS, []{return ctx->GetTrickOption(RT_GF_JUMP).Get() != 0;}), + Entrance(RR_GF_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);}), + }); + + areaTable[RR_GF_JAIL_WINDOW] = Region("GF Jail Window", SCENE_GERUDOS_FORTRESS, {}, {}, { + //Exits + //There's a trick where hovers backwalk into backflip gives access to RR_GF_LONG_ROOF from here + Entrance(RR_GF_OUTSKIRTS, []{return true;}), + Entrance(RR_GF_BELOW_CHEST, []{return true;}), + }); + + areaTable[RR_GF_HBA_RANGE] = Region("GF HBA Range", SCENE_GERUDOS_FORTRESS, {}, { + //Locations + LOCATION(RC_GF_HBA_1000_POINTS, logic->IsAdult && logic->HasItem(RG_CHILD_WALLET) && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->CanUse(RG_EPONA) && logic->CanUse(RG_FAIRY_BOW) && logic->AtDay), + LOCATION(RC_GF_HBA_1500_POINTS, logic->IsAdult && logic->HasItem(RG_CHILD_WALLET) && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD) && logic->CanUse(RG_EPONA) && logic->CanUse(RG_FAIRY_BOW) && logic->AtDay), + LOCATION(RC_GF_HBA_RANGE_GS, logic->IsAdult && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA, ED_BOOMERANG) && logic->CanGetNightTimeGS()), + LOCATION(RC_GF_HBA_RANGE_CRATE_1, logic->CanBreakCrates()), + LOCATION(RC_GF_HBA_RANGE_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_GF_HBA_RANGE_CRATE_3, logic->CanBreakCrates()), + LOCATION(RC_GF_HBA_RANGE_CRATE_4, logic->CanBreakCrates()), + LOCATION(RC_GF_HBA_RANGE_CRATE_5, logic->CanBreakCrates()), + LOCATION(RC_GF_HBA_RANGE_CRATE_6, logic->CanBreakCrates()), + LOCATION(RC_GF_HBA_RANGE_CRATE_7, logic->CanBreakCrates()), + LOCATION(RC_GF_HBA_CANOPY_EAST_CRATE, logic->CanBreakCrates()), + LOCATION(RC_GF_HBA_CANOPY_WEST_CRATE, logic->CanBreakCrates()), + LOCATION(RC_GF_NORTH_TARGET_EAST_CRATE, logic->CanBreakCrates()), + LOCATION(RC_GF_NORTH_TARGET_WEST_CRATE, logic->IsAdult || (logic->BlastOrSmash() || logic->HookshotOrBoomerang() || logic->CanUse(RG_HOVER_BOOTS))), + //implies logic->CanBreakCrates() + LOCATION(RC_GF_NORTH_TARGET_CHILD_CRATE, logic->IsChild && logic->BlastOrSmash()), + LOCATION(RC_GF_SOUTH_TARGET_EAST_CRATE, logic->CanBreakCrates()), + LOCATION(RC_GF_SOUTH_TARGET_WEST_CRATE, logic->CanBreakCrates()), + }, { + //Exits + Entrance(RR_GF_OUTSIDE_GTG, []{return logic->IsChild || logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD);}), + }); + + areaTable[RR_GF_OUTSIDE_GATE] = Region("GF Outside Gate", SCENE_GERUDOS_FORTRESS, { + //Events + EventAccess(&logic->GF_GateOpen, []{return logic->IsAdult && logic->HasItem(RG_GERUDO_MEMBERSHIP_CARD);}), + }, {}, { + //Exits + Entrance(RR_GF_OUTSKIRTS, []{return logic->GF_GateOpen;}), + Entrance(RR_WASTELAND_NEAR_FORTRESS, []{return true;}), + }); + + areaTable[RR_GF_STORMS_GROTTO] = Region("GF Storms Grotto", SCENE_GROTTOS, { + //Events + EventAccess(&logic->FreeFairies, []{return true;}), + }, { + //Locations + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_1, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_2, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_3, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_4, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_5, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_6, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_7, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_8, true), + }, { + //Exits + Entrance(RR_GF_NEAR_GROTTO, []{return true;}), + }); +} +// clang-format on \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp index 4959636e2..a9f0299ba 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/gerudo_valley.cpp @@ -17,7 +17,7 @@ void RegionTable_Init_GerudoValley() { Entrance(RR_GV_UPPER_STREAM, []{return logic->IsChild || logic->HasItem(RG_BRONZE_SCALE) || logic->TakeDamage();}), Entrance(RR_GV_CRATE_LEDGE, []{return logic->IsChild || logic->CanUse(RG_LONGSHOT);}), Entrance(RR_GV_GROTTO_LEDGE, []{return true;}), - Entrance(RR_GV_FORTRESS_SIDE, []{return (logic->IsAdult && (logic->CanUse(RG_EPONA) || logic->CanUse(RG_LONGSHOT) || ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE) || logic->CarpenterRescue)) || (logic->IsChild && logic->CanUse(RG_HOOKSHOT));}), + Entrance(RR_GV_FORTRESS_SIDE, []{return (logic->IsAdult && (logic->CanUse(RG_EPONA) || logic->CanUse(RG_LONGSHOT) || ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE) || logic->THRescuedAllCarpenters)) || (logic->IsChild && logic->CanUse(RG_HOOKSHOT));}), Entrance(RR_GV_LOWER_STREAM, []{return logic->IsChild;}), //can use cucco as child }); @@ -78,9 +78,9 @@ void RegionTable_Init_GerudoValley() { LOCATION(RC_GV_CRATE_BRIDGE_4, logic->IsChild && logic->CanBreakCrates()), }, { //Exits - Entrance(RR_GERUDO_FORTRESS, []{return true;}), + Entrance(RR_GF_OUTSKIRTS, []{return true;}), Entrance(RR_GV_UPPER_STREAM, []{return true;}), - Entrance(RR_GERUDO_VALLEY, []{return logic->IsChild || logic->CanUse(RG_EPONA) || logic->CanUse(RG_LONGSHOT) || ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE) || logic->CarpenterRescue;}), + Entrance(RR_GERUDO_VALLEY, []{return logic->IsChild || logic->CanUse(RG_EPONA) || logic->CanUse(RG_LONGSHOT) || ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE) || logic->THRescuedAllCarpenters;}), Entrance(RR_GV_CARPENTER_TENT, []{return logic->IsAdult;}), Entrance(RR_GV_STORMS_GROTTO, []{return logic->IsAdult && logic->CanOpenStormsGrotto();}), Entrance(RR_GV_CRATE_LEDGE, []{return ctx->GetTrickOption(RT_DAMAGE_BOOST_SIMPLE) && logic->HasExplosives();}), diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/thieves_hideout.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/thieves_hideout.cpp new file mode 100644 index 000000000..0a70e77e8 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/thieves_hideout.cpp @@ -0,0 +1,142 @@ +#include "soh/Enhancements/randomizer/location_access.h" +#include "soh/Enhancements/randomizer/entrance.h" + +using namespace Rando; + +// clang-format off +// When Thieve's hideout entrances are shuffled, getting caught by guards should behave like void outs to avoid logic headaches. +void RegionTable_Init_ThievesHideout() { + areaTable[RR_TH_1_TORCH_CELL] = Region("Thieves Hideout 1 Torch Cell", SCENE_THIEVES_HIDEOUT, { + //Events + EventAccess(&logic->THCouldFree1TorchCarpenter, []{return logic->CanKillEnemy(RE_GERUDO_WARRIOR);}), + EventAccess(&logic->THRescuedAllCarpenters, []{return logic->SmallKeys(RR_GF_OUTSKIRTS, ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) ? 4 : 1) && logic->THCouldFree1TorchCarpenter && logic->THCouldFreeDoubleCellCarpenter && logic->TH_CouldFreeDeadEndCarpenter && logic->THCouldRescueSlopeCarpenter;}), + }, { + //Locations + LOCATION(RC_TH_1_TORCH_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), + LOCATION(RC_TH_1_TORCH_CELL_RIGHT_POT, logic->CanBreakPots()), + LOCATION(RC_TH_1_TORCH_CELL_MID_POT, logic->CanBreakPots()), + LOCATION(RC_TH_1_TORCH_CELL_LEFT_POT, logic->CanBreakPots()), + LOCATION(RC_TH_1_TORCH_CELL_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_FREED_CARPENTERS, logic->THRescuedAllCarpenters), + }, { + //Exits + Entrance(RR_GF_OUTSKIRTS, []{return true;}), + Entrance(RR_GF_NEAR_GROTTO, []{return true;}), + }); + + areaTable[RR_TH_DOUBLE_CELL] = Region("Thieves Hideout Double Cell", SCENE_THIEVES_HIDEOUT, { + //Events + EventAccess(&logic->THCouldFreeDoubleCellCarpenter, []{return logic->CanKillEnemy(RE_GERUDO_WARRIOR);}), + EventAccess(&logic->THRescuedAllCarpenters, []{return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) && logic->SmallKeys(RR_GF_OUTSKIRTS, 4) && logic->THCouldFree1TorchCarpenter && logic->THCouldFreeDoubleCellCarpenter && logic->TH_CouldFreeDeadEndCarpenter && logic->THCouldRescueSlopeCarpenter;}), + }, { + //Locations + LOCATION(RC_TH_DOUBLE_CELL_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), + LOCATION(RC_TH_NEAR_DOUBLE_CELL_RIGHT_POT, logic->CanBreakPots()), + LOCATION(RC_TH_NEAR_DOUBLE_CELL_MID_POT, logic->CanBreakPots()), + LOCATION(RC_TH_NEAR_DOUBLE_CELL_LEFT_POT, logic->CanBreakPots()), + LOCATION(RC_TH_RIGHTMOST_JAILED_POT, logic->CanBreakPots()), + LOCATION(RC_TH_RIGHT_MIDDLE_JAILED_POT, logic->CanBreakPots()), + LOCATION(RC_TH_LEFT_MIDDLE_JAILED_POT, logic->CanBreakPots()), + LOCATION(RC_TH_LEFTMOST_JAILED_POT, logic->CanBreakPots()), + LOCATION(RC_TH_DOUBLE_CELL_LEFT_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_DOUBLE_CELL_RIGHT_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_FREED_CARPENTERS, logic->THRescuedAllCarpenters), + }, { + //Exits + Entrance(RR_GF_OUTSKIRTS, []{return true;}), + Entrance(RR_GF_NEAR_GROTTO, []{return true;}), + }); + + areaTable[RR_TH_DEAD_END_CELL] = Region("Thieves Hideout Dead End Cell", SCENE_THIEVES_HIDEOUT, { + //Events + EventAccess(&logic->TH_CouldFreeDeadEndCarpenter, []{return logic->CanKillEnemy(RE_GERUDO_WARRIOR);}), + EventAccess(&logic->THRescuedAllCarpenters, []{return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) && logic->SmallKeys(RR_GF_OUTSKIRTS, 4) && logic->THCouldFree1TorchCarpenter && logic->THCouldFreeDoubleCellCarpenter && logic->TH_CouldFreeDeadEndCarpenter && logic->THCouldRescueSlopeCarpenter;}), + }, { + //Locations + LOCATION(RC_TH_DEAD_END_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), + LOCATION(RC_TH_DEAD_END_CELL_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_FREED_CARPENTERS, logic->THRescuedAllCarpenters), + }, { + //Exits + Entrance(RR_GF_BELOW_GS, []{return true;}), + }); + + areaTable[RR_TH_STEEP_SLOPE_CELL] = Region("Thieves Hideout Steep Slope Cell", SCENE_THIEVES_HIDEOUT, { + //Events + EventAccess(&logic->THCouldRescueSlopeCarpenter, []{return logic->CanKillEnemy(RE_GERUDO_WARRIOR);}), + EventAccess(&logic->THRescuedAllCarpenters, []{return ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) && logic->SmallKeys(RR_GF_OUTSKIRTS, 4) && logic->THCouldFree1TorchCarpenter && logic->THCouldFreeDoubleCellCarpenter && logic->TH_CouldFreeDeadEndCarpenter && logic->THCouldRescueSlopeCarpenter;}), + }, { + //Locations + LOCATION(RC_TH_STEEP_SLOPE_CARPENTER, logic->CanKillEnemy(RE_GERUDO_WARRIOR)), + LOCATION(RC_TH_STEEP_SLOPE_RIGHT_POT, logic->CanBreakPots()), + LOCATION(RC_TH_STEEP_SLOPE_LEFT_POT, logic->CanBreakPots()), + LOCATION(RC_TH_FREED_CARPENTERS, logic->THRescuedAllCarpenters), + }, { + //Exits + Entrance(RR_GF_ABOVE_GTG, []{return true;}), + Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return true;}), + }); + + areaTable[RR_TH_KITCHEN_CORRIDOR] = Region("Thieves Hideout Kitchen Corridor", SCENE_THIEVES_HIDEOUT, {}, { + //Locations + LOCATION(RC_TH_NEAR_KITCHEN_LEFTMOST_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_NEAR_KITCHEN_MID_LEFT_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_NEAR_KITCHEN_MID_RIGHT_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_NEAR_KITCHEN_RIGHTMOST_CRATE, logic->CanBreakCrates()), + }, { + //Exits + Entrance(RR_GF_NEAR_GROTTO, []{return true;}), + Entrance(RR_GF_ABOVE_GTG, []{return true;}), + Entrance(RR_TH_KITCHEN_MAIN, []{return logic->CanPassEnemy(RE_GERUDO_GUARD);}), + }); + + areaTable[RR_TH_KITCHEN_MAIN] = Region("Thieves Hideout Kitchen Bottom", SCENE_THIEVES_HIDEOUT, {}, { + //Locations + LOCATION(RC_TH_KITCHEN_POT_1, logic->CanBreakPots() && logic->CanPassEnemy(RE_GERUDO_GUARD)), + LOCATION(RC_TH_KITCHEN_POT_2, logic->CanBreakPots() && logic->CanPassEnemy(RE_GERUDO_GUARD)), + LOCATION(RC_TH_KITCHEN_CRATE, logic->CanBreakCrates() && logic->CanPassEnemy(RE_GERUDO_GUARD)), + LOCATION(RC_TH_KITCHEN_SUN_FAIRY, logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->CanUse(RG_SUNS_SONG)), + }, { + //Exits + Entrance(RR_TH_KITCHEN_CORRIDOR, []{return logic->CanPassEnemy(RE_GERUDO_GUARD);}), + Entrance(RR_TH_KITCHEN_TOP, []{return logic->CanPassEnemy(RE_GERUDO_GUARD);}), + }); + + areaTable[RR_TH_KITCHEN_TOP] = Region("Thieves Hideout Kitchen Top", SCENE_THIEVES_HIDEOUT, {}, { + //Locations + LOCATION(RC_TH_KITCHEN_POT_1, logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_TH_KITCHEN_POT_2, logic->CanUse(RG_BOOMERANG)), + }, { + //Exits + Entrance(RR_TH_KITCHEN_MAIN, []{return true;}), + //hookshot to cross using the rafters is implied in logic->CanPassEnemy(RE_GERUDO_GUARD) + Entrance(RR_GF_NEAR_GS, []{return logic->CanPassEnemy(RE_GERUDO_GUARD) || logic->CanUse(RG_HOVER_BOOTS);}), + Entrance(RR_GF_TOP_OF_LOWER_VINES, []{return logic->CanPassEnemy(RE_GERUDO_GUARD) || logic->CanUse(RG_HOVER_BOOTS);}), + }); + + areaTable[RR_TH_BREAK_ROOM] = Region("Thieves Hideout Break Room", SCENE_THIEVES_HIDEOUT, {}, { + //Locations + LOCATION(RC_TH_BREAK_ROOM_FRONT_POT, (logic->CanPassEnemy(RE_BREAK_ROOM_GUARD) && logic->CanBreakPots()) || + (logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_TH_BREAK_ROOM_BACK_POT, (logic->CanPassEnemy(RE_BREAK_ROOM_GUARD) && logic->CanBreakPots()) || + (logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_TH_BREAK_HALLWAY_OUTER_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_BREAK_HALLWAY_INNER_CRATE, logic->CanBreakCrates()), + LOCATION(RC_TH_BREAK_ROOM_RIGHT_CRATE, (logic->CanPassEnemy(RE_BREAK_ROOM_GUARD) && logic->CanBreakCrates()) || + (logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->HasExplosives() && logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_TH_BREAK_ROOM_LEFT_CRATE, (logic->CanPassEnemy(RE_BREAK_ROOM_GUARD) && logic->CanBreakCrates()) || + (logic->CanPassEnemy(RE_GERUDO_GUARD) && logic->HasExplosives() && logic->CanUse(RG_BOOMERANG))), + }, { + //Exits + Entrance(RR_GF_BELOW_CHEST, []{return logic->CanPassEnemy(RE_GERUDO_GUARD);}), + //Implies logic->CanPassEnemy(RE_GERUDO_GUARD) + Entrance(RR_TH_BREAK_ROOM_CORRIDOR, []{return logic->CanUse(RG_HOOKSHOT);}), + }); + + areaTable[RR_TH_BREAK_ROOM_CORRIDOR] = Region("Thieves Hideout Break Room", SCENE_THIEVES_HIDEOUT, {}, {}, { + //Exits + Entrance(RR_TH_BREAK_ROOM, []{return logic->CanUse(RG_HOOKSHOT);}), + Entrance(RR_GF_ABOVE_JAIL, []{return true;}), + }); +} +// clang-format on \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 597828e34..2fea752cc 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -171,14 +171,14 @@ void Rando::StaticData::InitLocationTable() { locationTable[RC_GV_DEKU_SCRUB_GROTTO_FRONT] = Location::Base(RC_GV_DEKU_SCRUB_GROTTO_FRONT, RCQUEST_BOTH, RCTYPE_SCRUB, RCAREA_GERUDO_VALLEY, ACTOR_EN_DNS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x08, 0xF0), "Deku Scrub Grotto Front", RHT_GV_DEKU_SCRUB_GROTTO_FRONT, RG_BUY_GREEN_POTION, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SCRUBS_PURCHASED_GV_DEKU_SCRUB_GROTTO_FRONT), false, 40); // Gerudo Fortress locationTable[RC_GF_CHEST] = Location::Chest(RC_GF_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_EN_BOX, SCENE_GERUDOS_FORTRESS, 1984, 0x00, "Chest", RHT_GF_CHEST, RG_PIECE_OF_HEART, true); - locationTable[RC_GF_HBA_1000_POINTS] = Location::Base(RC_GF_HBA_1000_POINTS, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_GERUDOS_FORTRESS, 0x00, "HBA 1000 Points", RHT_GF_HBA_1000_POINTS, RG_PIECE_OF_HEART, SpoilerCollectionCheck::InfTable(INFTABLE_190), true); - locationTable[RC_GF_HBA_1500_POINTS] = Location::Base(RC_GF_HBA_1500_POINTS, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_GERUDOS_FORTRESS, 0x00, "HBA 1500 Points", RHT_GF_HBA_1500_POINTS, RG_PROGRESSIVE_BOW, SpoilerCollectionCheck::ItemGetInf(15), true); - // RandoTodo: Do we replace these with the RC_HIDEOUT keys or keep these? - locationTable[RC_GF_GERUDO_MEMBERSHIP_CARD] = Location::Base(RC_GF_GERUDO_MEMBERSHIP_CARD, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_THIEVES_HIDEOUT, 0x00, "Gerudo Membership Card", RHT_GF_GERUDO_MEMBERSHIP_CARD, RG_GERUDO_MEMBERSHIP_CARD, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GF_ITEM_FROM_LEADER_OF_FORTRESS), true); - locationTable[RC_GF_NORTH_F1_CARPENTER] = Location::Collectable(RC_GF_NORTH_F1_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3089, 0x0C, "North F1 Carpenter", RHT_GF_NORTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); - locationTable[RC_GF_NORTH_F2_CARPENTER] = Location::Collectable(RC_GF_NORTH_F2_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 2577, 0x0A, "North F2 Carpenter", RHT_GF_NORTH_F2_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); - locationTable[RC_GF_SOUTH_F1_CARPENTER] = Location::Collectable(RC_GF_SOUTH_F1_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3601, 0x0E, "South F1 Carpenter", RHT_GF_SOUTH_F1_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); - locationTable[RC_GF_SOUTH_F2_CARPENTER] = Location::Collectable(RC_GF_SOUTH_F2_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3857, 0x0F, "South F2 Carpenter", RHT_GF_SOUTH_F2_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); + locationTable[RC_GF_HBA_1000_POINTS] = Location::Base(RC_GF_HBA_1000_POINTS, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_GERUDOS_FORTRESS, 0x00, "HBA 1000 Points", RHT_GF_HBA_1000_POINTS, RG_PIECE_OF_HEART, SpoilerCollectionCheck::InfTable(INFTABLE_190), true); + locationTable[RC_GF_HBA_1500_POINTS] = Location::Base(RC_GF_HBA_1500_POINTS, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_GERUDOS_FORTRESS, 0x00, "HBA 1500 Points", RHT_GF_HBA_1500_POINTS, RG_PROGRESSIVE_BOW, SpoilerCollectionCheck::ItemGetInf(15), true); + // Thieves Hideout + locationTable[RC_TH_FREED_CARPENTERS] = Location::Base(RC_TH_FREED_CARPENTERS, RCQUEST_BOTH, RCTYPE_STANDARD, ACTOR_ID_MAX, SCENE_THIEVES_HIDEOUT, 0x00, "Freed All Carpenters", RHT_TH_FREED_CARPENTERS, RG_GERUDO_MEMBERSHIP_CARD, SpoilerCollectionCheck::RandomizerInf(RAND_INF_TH_ITEM_FROM_LEADER_OF_FORTRESS), true); + locationTable[RC_TH_1_TORCH_CARPENTER] = Location::Collectable(RC_TH_1_TORCH_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3089, 0x0C, "1 Torch Carpenter", RHT_TH_1_TORCH_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); + locationTable[RC_TH_DEAD_END_CARPENTER] = Location::Collectable(RC_TH_DEAD_END_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 2577, 0x0A, "Dead End Carpenter", RHT_TH_DEAD_END_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); + locationTable[RC_TH_DOUBLE_CELL_CARPENTER] = Location::Collectable(RC_TH_DOUBLE_CELL_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3601, 0x0E, "Double Cell Carpenter", RHT_TH_DOUBLE_CELL_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); + locationTable[RC_TH_STEEP_SLOPE_CARPENTER] = Location::Collectable(RC_TH_STEEP_SLOPE_CARPENTER, RCQUEST_BOTH, RCTYPE_GF_KEY, ACTOR_EN_ITEM00, SCENE_THIEVES_HIDEOUT, 3857, 0x0F, "Steep Slope Carpenter", RHT_TH_STEEP_SLOPE_CARPENTER, RG_GERUDO_FORTRESS_SMALL_KEY, true); // Haunted Wasteland locationTable[RC_WASTELAND_CHEST] = Location::Chest(RC_WASTELAND_CHEST, RCQUEST_BOTH, RCTYPE_STANDARD, RCAREA_WASTELAND, ACTOR_EN_BOX, SCENE_HAUNTED_WASTELAND, -30048, 0x00, "Chest", RHT_WASTELAND_CHEST, RG_PURPLE_RUPEE); locationTable[RC_WASTELAND_BOMBCHU_SALESMAN] = Location::Base(RC_WASTELAND_BOMBCHU_SALESMAN, RCQUEST_BOTH, RCTYPE_MERCHANT, RCAREA_WASTELAND, ACTOR_ID_MAX, SCENE_HAUNTED_WASTELAND, 0x00, "Carpet Salesman", RHT_WASTELAND_BOMBCHU_SALESMAN, RG_BUY_BOMBCHUS_10, SpoilerCollectionCheck::RandomizerInf(RAND_INF_MERCHANTS_CARPET_SALESMAN), false, 200); @@ -748,7 +748,7 @@ void Rando::StaticData::InitLocationTable() { locationTable[RC_GV_GS_PILLAR] = Location::GSToken(RC_GV_GS_PILLAR, RCQUEST_BOTH, SCENE_GERUDO_VALLEY, 21252, 0x04, "GS Pillar", RHT_GV_GS_PILLAR, 0x13); locationTable[RC_GV_GS_BEHIND_TENT] = Location::GSToken(RC_GV_GS_BEHIND_TENT, RCQUEST_BOTH, SCENE_GERUDO_VALLEY, 21256, 0x08, "GS Behind Tent", RHT_GV_GS_BEHIND_TENT, 0x13); // Gerudo Fortress - locationTable[RC_GF_GS_ARCHERY_RANGE] = Location::GSToken(RC_GF_GS_ARCHERY_RANGE, RCQUEST_BOTH, SCENE_GERUDOS_FORTRESS, 21505, 0x01, "GS Archery Range", RHT_GF_GS_ARCHERY_RANGE, 0x14); + locationTable[RC_GF_HBA_RANGE_GS] = Location::GSToken(RC_GF_HBA_RANGE_GS, RCQUEST_BOTH, SCENE_GERUDOS_FORTRESS, 21505, 0x01, "GS Archery Range", RHT_GF_GS_ARCHERY_RANGE, 0x14); locationTable[RC_GF_GS_TOP_FLOOR] = Location::GSToken(RC_GF_GS_TOP_FLOOR, RCQUEST_BOTH, SCENE_GERUDOS_FORTRESS, 21506, 0x02, "GS Top Floor", RHT_GF_GS_TOP_FLOOR, 0x14); // Wasteland & Desert Colossus locationTable[RC_WASTELAND_GS] = Location::GSToken(RC_WASTELAND_GS, RCQUEST_BOTH, SCENE_HAUNTED_WASTELAND, 13570, 0x02, "GS", RHT_WASTELAND_GS, 0x15); diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index e02d6b30c..442f2b23b 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -487,6 +487,9 @@ bool Logic::CanKillEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wal bool inWater) { bool killed = false; switch (enemy) { + case RE_GERUDO_GUARD: + case RE_BREAK_ROOM_GUARD: + return false; case RE_GOLD_SKULLTULA: switch (distance) { case ED_CLOSE: @@ -835,6 +838,11 @@ bool Logic::CanPassEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wal case RE_PURPLE_LEEVER: case RE_OCTOROK: return true; + case RE_GERUDO_GUARD: + return ctx->GetTrickOption(RT_PASS_GUARDS_WITH_NOTHING) || HasItem(RG_GERUDO_MEMBERSHIP_CARD) || + CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT); + case RE_BREAK_ROOM_GUARD: + return HasItem(RG_GERUDO_MEMBERSHIP_CARD) || CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT); case RE_BIG_SKULLTULA: // hammer jumpslash can pass, but only on flat land where you can kill with hammer swing return CanUse(RG_NUTS) || CanUse(RG_BOOMERANG); @@ -843,6 +851,7 @@ bool Logic::CanPassEnemy(RandomizerEnemy enemy, EnemyDistance distance, bool wal case RE_GIBDO: case RE_REDEAD: // we need a way to check if suns won't force a reload + // RANDOTODO: check if stealthing past these guys works everywhere return CanUse(RG_HOOKSHOT) || CanUse(RG_SUNS_SONG); case RE_IRON_KNUCKLE: case RE_BIG_OCTO: @@ -1308,16 +1317,6 @@ bool Logic::TradeQuestStep(RandomizerGet rg) { return hasState; } -bool Logic::CanFinishGerudoFortress() { - return (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_NORMAL) && SmallKeys(RR_GERUDO_FORTRESS, 4) && - CanKillEnemy(RE_GERUDO_WARRIOR) && - (HasItem(RG_GERUDO_MEMBERSHIP_CARD) || CanUse(RG_FAIRY_BOW) || CanUse(RG_HOOKSHOT) || - CanUse(RG_HOVER_BOOTS) || ctx->GetTrickOption(RT_GF_KITCHEN))) || - (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FAST) && SmallKeys(RR_GERUDO_FORTRESS, 1) && - CanKillEnemy(RE_GERUDO_WARRIOR)) || - ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_CARPENTERS_FREE); -} - bool Logic::CanStandingShield() { return CanUse(RG_MIRROR_SHIELD) || (IsAdult && HasItem(RG_HYLIAN_SHIELD)) || CanUse(RG_DEKU_SHIELD); } @@ -1440,7 +1439,7 @@ bool Logic::SmallKeys(RandomizerRegion dungeon, uint8_t requiredAmountGlitchless }*/ return GetSmallKeyCount(SCENE_TREASURE_BOX_SHOP) >= requiredAmountGlitchless; - case RR_GERUDO_FORTRESS: + case RR_GF_OUTSKIRTS: return GetSmallKeyCount(SCENE_THIEVES_HIDEOUT) >= requiredAmountGlitchless; default: @@ -2470,7 +2469,10 @@ void Logic::Reset(bool resetSaveContext /*= true*/) { // Events ShowedMidoSwordAndShield = false; - CarpenterRescue = false; + THCouldFree1TorchCarpenter = false; + THCouldFreeDoubleCellCarpenter = false; + TH_CouldFreeDeadEndCarpenter = false; + THCouldRescueSlopeCarpenter = false; GF_GateOpen = false; GtG_GateOpen = false; DampesWindmillAccess = false; @@ -2523,7 +2525,7 @@ void Logic::Reset(bool resetSaveContext /*= true*/) { MQWaterStalfosPit = false; MQWaterDragonTorches = false; MQWaterB1Switch = false; - // MQWaterPillarSoTBlock = false; + // MQWaterPillarSoTBlock = false; MQWaterOpenedPillarB1 = false; MQSpiritCrawlBoulder = false; MQSpiritMapRoomEnemies = false; diff --git a/soh/soh/Enhancements/randomizer/logic.h b/soh/soh/Enhancements/randomizer/logic.h index acd36dcbb..ba9ab60d0 100644 --- a/soh/soh/Enhancements/randomizer/logic.h +++ b/soh/soh/Enhancements/randomizer/logic.h @@ -110,7 +110,11 @@ class Logic { // Events bool ShowedMidoSwordAndShield = false; - bool CarpenterRescue = false; + bool THCouldFree1TorchCarpenter = false; + bool THCouldFreeDoubleCellCarpenter = false; + bool TH_CouldFreeDeadEndCarpenter = false; + bool THCouldRescueSlopeCarpenter = false; + bool THRescuedAllCarpenters = false; bool GF_GateOpen = false; bool GtG_GateOpen = false; bool DampesWindmillAccess = false; @@ -246,7 +250,6 @@ class Logic { bool HasFireSource(); bool HasFireSourceWithTorch(); bool TradeQuestStep(RandomizerGet rg); - bool CanFinishGerudoFortress(); bool CanStandingShield(); bool CanShield(); bool CanUseProjectile(); diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 8eb0192b6..abfa8f3b6 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -1706,22 +1706,22 @@ std::map rcToRandomizerInf = { { RC_KF_TWINS_HOUSE_POT_2, RAND_INF_KF_TWINS_HOUSE_POT_2 }, { RC_KF_BROTHERS_HOUSE_POT_1, RAND_INF_KF_BROTHERS_HOUSE_POT_1 }, { RC_KF_BROTHERS_HOUSE_POT_2, RAND_INF_KF_BROTHERS_HOUSE_POT_2 }, - { RC_GF_BREAK_ROOM_POT_1, RAND_INF_GF_BREAK_ROOM_POT_1 }, - { RC_GF_BREAK_ROOM_POT_2, RAND_INF_GF_BREAK_ROOM_POT_2 }, - { RC_GF_KITCHEN_POT_1, RAND_INF_GF_KITCHEN_POT_1 }, - { RC_GF_KITCHEN_POT_2, RAND_INF_GF_KITCHEN_POT_2 }, - { RC_GF_NORTH_F1_CARPENTER_POT_1, RAND_INF_GF_NORTH_F1_CARPENTER_POT_1 }, - { RC_GF_NORTH_F1_CARPENTER_POT_2, RAND_INF_GF_NORTH_F1_CARPENTER_POT_2 }, - { RC_GF_NORTH_F1_CARPENTER_POT_3, RAND_INF_GF_NORTH_F1_CARPENTER_POT_3 }, - { RC_GF_NORTH_F2_CARPENTER_POT_1, RAND_INF_GF_NORTH_F2_CARPENTER_POT_1 }, - { RC_GF_NORTH_F2_CARPENTER_POT_2, RAND_INF_GF_NORTH_F2_CARPENTER_POT_2 }, - { RC_GF_SOUTH_F1_CARPENTER_POT_1, RAND_INF_GF_SOUTH_F1_CARPENTER_POT_1 }, - { RC_GF_SOUTH_F1_CARPENTER_POT_2, RAND_INF_GF_SOUTH_F1_CARPENTER_POT_2 }, - { RC_GF_SOUTH_F1_CARPENTER_POT_3, RAND_INF_GF_SOUTH_F1_CARPENTER_POT_3 }, - { RC_GF_SOUTH_F1_CARPENTER_CELL_POT_1, RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_1 }, - { RC_GF_SOUTH_F1_CARPENTER_CELL_POT_2, RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_2 }, - { RC_GF_SOUTH_F1_CARPENTER_CELL_POT_3, RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_3 }, - { RC_GF_SOUTH_F1_CARPENTER_CELL_POT_4, RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_4 }, + { RC_TH_BREAK_ROOM_FRONT_POT, RAND_INF_TH_BREAK_ROOM_FRONT_POT }, + { RC_TH_BREAK_ROOM_BACK_POT, RAND_INF_TH_BREAK_ROOM_BACK_POT }, + { RC_TH_KITCHEN_POT_1, RAND_INF_TH_KITCHEN_POT_1 }, + { RC_TH_KITCHEN_POT_2, RAND_INF_TH_KITCHEN_POT_2 }, + { RC_TH_1_TORCH_CELL_RIGHT_POT, RAND_INF_TH_1_TORCH_CELL_RIGHT_POT }, + { RC_TH_1_TORCH_CELL_MID_POT, RAND_INF_TH_1_TORCH_CELL_MID_POT }, + { RC_TH_1_TORCH_CELL_LEFT_POT, RAND_INF_TH_1_TORCH_CELL_LEFT_POT }, + { RC_TH_STEEP_SLOPE_RIGHT_POT, RAND_INF_TH_STEEP_SLOPE_RIGHT_POT }, + { RC_TH_STEEP_SLOPE_LEFT_POT, RAND_INF_TH_STEEP_SLOPE_LEFT_POT }, + { RC_TH_NEAR_DOUBLE_CELL_RIGHT_POT, RAND_INF_TH_NEAR_DOUBLE_CELL_RIGHT_POT }, + { RC_TH_NEAR_DOUBLE_CELL_MID_POT, RAND_INF_TH_NEAR_DOUBLE_CELL_MID_POT }, + { RC_TH_NEAR_DOUBLE_CELL_LEFT_POT, RAND_INF_NEAR_DOUBLE_CELL_LEFT_POT }, + { RC_TH_RIGHTMOST_JAILED_POT, RAND_INF_TH_RIGHTMOST_JAILED_POT }, + { RC_TH_RIGHT_MIDDLE_JAILED_POT, RAND_INF_TH_RIGHT_MIDDLE_JAILED_POT }, + { RC_TH_LEFT_MIDDLE_JAILED_POT, RAND_INF_TH_LEFT_MIDDLE_JAILED_POT }, + { RC_TH_LEFTMOST_JAILED_POT, RAND_INF_TH_LEFTMOST_JAILED_POT }, { RC_WASTELAND_NEAR_GS_POT_1, RAND_INF_WASTELAND_NEAR_GS_POT_1 }, { RC_WASTELAND_NEAR_GS_POT_2, RAND_INF_WASTELAND_NEAR_GS_POT_2 }, { RC_WASTELAND_NEAR_GS_POT_3, RAND_INF_WASTELAND_NEAR_GS_POT_3 }, @@ -2272,136 +2272,136 @@ std::map rcToRandomizerInf = { RAND_INF_GF_ABOVE_JAIL_CRATE, }, { - RC_GF_OUTSIDE_CENTER_CRATE_1, - RAND_INF_GF_OUTSIDE_CENTER_CRATE_1, + RC_GF_SOUTHMOST_CENTER_CRATE, + RAND_INF_GF_SOUTHMOST_CENTER_CRATE, }, { - RC_GF_OUTSIDE_CENTER_CRATE_2, - RAND_INF_GF_OUTSIDE_CENTER_CRATE_2, + RC_GF_MID_SOUTH_CENTER_CRATE, + RAND_INF_GF_MID_SOUTH_CENTER_CRATE, }, { - RC_GF_OUTSIDE_CENTER_CRATE_3, - RAND_INF_GF_OUTSIDE_CENTER_CRATE_3, + RC_GF_MID_NORTH_CENTER_CRATE, + RAND_INF_GF_MID_NORTH_CENTER_CRATE, }, { - RC_GF_OUTSIDE_CENTER_CRATE_4, - RAND_INF_GF_OUTSIDE_CENTER_CRATE_4, + RR_GF_NORTHMOST_CENTER_CRATE, + RAND_INF_GF_NORTHMOST_CENTER_CRATE, }, { - RC_GF_OUTSIDE_LEFT_CRATE_1, - RAND_INF_GF_OUTSIDE_LEFT_CRATE_1, + RC_GF_OUTSKIRTS_NE_CRATE, + RAND_INF_GF_OUTSKIRTS_NE_CRATE, }, { - RC_GF_OUTSIDE_LEFT_CRATE_2, - RAND_INF_GF_OUTSIDE_LEFT_CRATE_2, + RC_GF_OUTSKIRTS_NW_CRATE, + RAND_INF_GF_OUTSKIRTS_NW_CRATE, }, { - RC_GF_ARCHERY_RANGE_CRATE_1, - RAND_INF_GF_ARCHERY_RANGE_CRATE_1, + RC_GF_HBA_RANGE_CRATE_1, + RAND_INF_GF_HBA_RANGE_CRATE_1, }, { - RC_GF_ARCHERY_RANGE_CRATE_2, - RAND_INF_GF_ARCHERY_RANGE_CRATE_2, + RC_GF_HBA_RANGE_CRATE_2, + RAND_INF_GF_HBA_RANGE_CRATE_2, }, { - RC_GF_ARCHERY_RANGE_CRATE_3, - RAND_INF_GF_ARCHERY_RANGE_CRATE_3, + RC_GF_HBA_RANGE_CRATE_3, + RAND_INF_GF_HBA_RANGE_CRATE_3, }, { - RC_GF_ARCHERY_RANGE_CRATE_4, - RAND_INF_GF_ARCHERY_RANGE_CRATE_4, + RC_GF_HBA_RANGE_CRATE_4, + RAND_INF_GF_HBA_RANGE_CRATE_4, }, { - RC_GF_ARCHERY_RANGE_CRATE_5, - RAND_INF_GF_ARCHERY_RANGE_CRATE_5, + RC_GF_HBA_RANGE_CRATE_5, + RAND_INF_GF_HBA_RANGE_CRATE_5, }, { - RC_GF_ARCHERY_RANGE_CRATE_6, - RAND_INF_GF_ARCHERY_RANGE_CRATE_6, + RC_GF_HBA_RANGE_CRATE_6, + RAND_INF_GF_HBA_RANGE_CRATE_6, }, { - RC_GF_ARCHERY_RANGE_CRATE_7, - RAND_INF_GF_ARCHERY_RANGE_CRATE_7, + RC_GF_HBA_RANGE_CRATE_7, + RAND_INF_GF_HBA_RANGE_CRATE_7, }, { - RC_GF_ARCHERY_START_CRATE_1, - RAND_INF_GF_ARCHERY_START_CRATE_1, + RC_GF_HBA_CANOPY_EAST_CRATE, + RAND_INF_GF_HBA_CANOPY_EAST_CRATE, }, { - RC_GF_ARCHERY_START_CRATE_2, - RAND_INF_GF_ARCHERY_START_CRATE_2, + RC_GF_HBA_CANOPY_WEST_CRATE, + RAND_INF_GF_HBA_CANOPY_WEST_CRATE, }, { - RC_GF_ARCHERY_LEFT_END_CRATE_1, - RAND_INF_GF_ARCHERY_LEFT_END_CRATE_1, + RC_GF_NORTH_TARGET_EAST_CRATE, + RAND_INF_GF_NORTH_TARGET_EAST_CRATE, }, { - RC_GF_ARCHERY_LEFT_END_CRATE_2, - RAND_INF_GF_ARCHERY_LEFT_END_CRATE_2, + RC_GF_NORTH_TARGET_WEST_CRATE, + RAND_INF_GF_NORTH_TARGET_WEST_CRATE, }, { - RC_GF_ARCHERY_LEFT_END_CHILD_CRATE, - RAND_INF_GF_ARCHERY_LEFT_END_CHILD_CRATE, + RC_GF_NORTH_TARGET_CHILD_CRATE, + RAND_INF_GF_NORTH_TARGET_CHILD_CRATE, }, { - RC_GF_ARCHERY_RIGHT_END_CRATE_1, - RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_1, + RC_GF_SOUTH_TARGET_EAST_CRATE, + RAND_INF_GF_SOUTH_TARGET_EAST_CRATE, }, { - RC_GF_ARCHERY_RIGHT_END_CRATE_2, - RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_2, + RC_GF_SOUTH_TARGET_WEST_CRATE, + RAND_INF_GF_SOUTH_TARGET_WEST_CRATE, }, { - RC_GF_KITCHEN_CRATE_1, - RAND_INF_GF_KITCHEN_CRATE_1, + RC_TH_NEAR_KITCHEN_LEFTMOST_CRATE, + RAND_INF_TH_NEAR_KITCHEN_LEFTMOST_CRATE, }, { - RC_GF_KITCHEN_CRATE_2, - RAND_INF_GF_KITCHEN_CRATE_2, + RC_TH_NEAR_KITCHEN_MID_LEFT_CRATE, + RAND_INF_TH_NEAR_KITCHEN_MID_LEFT_CRATE, }, { - RC_GF_KITCHEN_CRATE_3, - RAND_INF_GF_KITCHEN_CRATE_3, + RC_TH_NEAR_KITCHEN_MID_RIGHT_CRATE, + RAND_INF_TH_NEAR_KITCHEN_MID_RIGHT_CRATE, }, { - RC_GF_KITCHEN_CRATE_4, - RAND_INF_GF_KITCHEN_CRATE_4, + RC_TH_NEAR_KITCHEN_RIGHTMOST_CRATE, + RAND_INF_TH_NEAR_KITCHEN_RIGHTMOST_CRATE, }, { - RC_GF_KITCHEN_CRATE_5, - RAND_INF_GF_KITCHEN_CRATE_5, + RC_TH_KITCHEN_CRATE, + RAND_INF_TH_KITCHEN_CRATE, }, { - RC_GF_BREAK_ROOM_CRATE_1, - RAND_INF_GF_BREAK_ROOM_CRATE_1, + RC_TH_BREAK_HALLWAY_OUTER_CRATE, + RAND_INF_TH_BREAK_HALLWAY_OUTER_CRATE, }, { - RC_GF_BREAK_ROOM_CRATE_2, - RAND_INF_GF_BREAK_ROOM_CRATE_2, + RC_TH_BREAK_HALLWAY_INNER_CRATE, + RAND_INF_TH_BREAK_HALLWAY_INNER_CRATE, }, { - RC_GF_BREAK_ROOM_CRATE_3, - RAND_INF_GF_BREAK_ROOM_CRATE_3, + RC_TH_BREAK_ROOM_RIGHT_CRATE, + RAND_INF_TH_BREAK_ROOM_RIGHT_CRATE, }, { - RC_GF_BREAK_ROOM_CRATE_4, - RAND_INF_GF_BREAK_ROOM_CRATE_4, + RC_TH_BREAK_ROOM_LEFT_CRATE, + RAND_INF_TH_BREAK_ROOM_LEFT_CRATE, }, { - RC_GF_NORTH_F1_CARPENTER_CRATE, - RAND_INF_GF_NORTH_F1_CARPENTER_CRATE, + RC_TH_1_TORCH_CELL_CRATE, + RAND_INF_TH_1_TORCH_CELL_CRATE, }, { - RC_GF_NORTH_F3_CARPENTER_CRATE, - RAND_INF_GF_NORTH_F3_CARPENTER_CRATE, + RC_TH_DEAD_END_CELL_CRATE, + RAND_INF_TH_DEAD_END_CELL_CRATE, }, { - RC_GF_SOUTH_F2_CARPENTER_CRATE_1, - RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_1, + RC_TH_DOUBLE_CELL_LEFT_CRATE, + RAND_INF_TH_DOUBLE_CELL_LEFT_CRATE, }, { - RC_GF_SOUTH_F2_CARPENTER_CRATE_2, - RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_2, + RC_TH_DOUBLE_CELL_RIGHT_CRATE, + RAND_INF_TH_DOUBLE_CELL_RIGHT_CRATE, }, { RC_HW_BEFORE_QUICKSAND_CRATE, diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index ef0f24e0c..8295eb6cd 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -418,9 +418,34 @@ typedef enum { RR_GV_FORTRESS_SIDE, RR_GV_CARPENTER_TENT, RR_GV_STORMS_GROTTO, - RR_GERUDO_FORTRESS, + RR_GF_OUTSKIRTS, + RR_GF_NEAR_GROTTO, + RR_GF_OUTSIDE_GTG, + RR_GF_ABOVE_GTG, + RR_GF_BOTTOM_OF_LOWER_VINES, + RR_GF_TOP_OF_LOWER_VINES, + RR_GF_NEAR_GS, + RR_GF_SLOPED_ROOF, + RR_GF_BOTTOM_OF_UPPER_VINES, + RR_GF_TOP_OF_UPPER_VINES, + RR_GF_NEAR_CHEST, + RR_GF_LONG_ROOF, + RR_GF_BELOW_GS, + RR_GF_BELOW_CHEST, + RR_GF_HBA_RANGE, + RR_GF_ABOVE_JAIL, + RR_GF_JAIL_WINDOW, RR_GF_OUTSIDE_GATE, RR_GF_STORMS_GROTTO, + RR_TH_1_TORCH_CELL, + RR_TH_DOUBLE_CELL, + RR_TH_DEAD_END_CELL, + RR_TH_STEEP_SLOPE_CELL, + RR_TH_KITCHEN_CORRIDOR, + RR_TH_KITCHEN_MAIN, + RR_TH_KITCHEN_TOP, + RR_TH_BREAK_ROOM, + RR_TH_BREAK_ROOM_CORRIDOR, RR_WASTELAND_NEAR_FORTRESS, RR_HAUNTED_WASTELAND, RR_WASTELAND_NEAR_COLOSSUS, @@ -1393,13 +1418,13 @@ typedef enum { RC_GF_CHEST, RC_GF_HBA_1000_POINTS, RC_GF_HBA_1500_POINTS, - RC_GF_GERUDO_MEMBERSHIP_CARD, - RC_GF_NORTH_F1_CARPENTER, - RC_GF_NORTH_F2_CARPENTER, - RC_GF_SOUTH_F1_CARPENTER, - RC_GF_SOUTH_F2_CARPENTER, + RC_TH_FREED_CARPENTERS, + RC_TH_1_TORCH_CARPENTER, + RC_TH_DEAD_END_CARPENTER, + RC_TH_DOUBLE_CELL_CARPENTER, + RC_TH_STEEP_SLOPE_CARPENTER, RC_GF_GS_TOP_FLOOR, - RC_GF_GS_ARCHERY_RANGE, + RC_GF_HBA_RANGE_GS, RC_HIDEOUT_JAIL_GUARD_1_TORCH, RC_HIDEOUT_JAIL_GUARD_2_TORCHES, RC_HIDEOUT_JAIL_GUARD_3_TORCHES, @@ -1817,22 +1842,22 @@ typedef enum { RC_KF_TWINS_HOUSE_POT_2, RC_KF_BROTHERS_HOUSE_POT_1, RC_KF_BROTHERS_HOUSE_POT_2, - RC_GF_BREAK_ROOM_POT_1, - RC_GF_BREAK_ROOM_POT_2, - RC_GF_KITCHEN_POT_1, - RC_GF_KITCHEN_POT_2, - RC_GF_NORTH_F1_CARPENTER_POT_1, - RC_GF_NORTH_F1_CARPENTER_POT_2, - RC_GF_NORTH_F1_CARPENTER_POT_3, - RC_GF_NORTH_F2_CARPENTER_POT_1, - RC_GF_NORTH_F2_CARPENTER_POT_2, - RC_GF_SOUTH_F1_CARPENTER_POT_1, - RC_GF_SOUTH_F1_CARPENTER_POT_2, - RC_GF_SOUTH_F1_CARPENTER_POT_3, - RC_GF_SOUTH_F1_CARPENTER_CELL_POT_1, - RC_GF_SOUTH_F1_CARPENTER_CELL_POT_2, - RC_GF_SOUTH_F1_CARPENTER_CELL_POT_3, - RC_GF_SOUTH_F1_CARPENTER_CELL_POT_4, + RC_TH_BREAK_ROOM_FRONT_POT, + RC_TH_BREAK_ROOM_BACK_POT, + RC_TH_KITCHEN_POT_1, + RC_TH_KITCHEN_POT_2, + RC_TH_1_TORCH_CELL_RIGHT_POT, + RC_TH_1_TORCH_CELL_MID_POT, + RC_TH_1_TORCH_CELL_LEFT_POT, + RC_TH_STEEP_SLOPE_RIGHT_POT, + RC_TH_STEEP_SLOPE_LEFT_POT, + RC_TH_NEAR_DOUBLE_CELL_RIGHT_POT, + RC_TH_NEAR_DOUBLE_CELL_MID_POT, + RC_TH_NEAR_DOUBLE_CELL_LEFT_POT, + RC_TH_RIGHTMOST_JAILED_POT, + RC_TH_RIGHT_MIDDLE_JAILED_POT, + RC_TH_LEFT_MIDDLE_JAILED_POT, + RC_TH_LEFTMOST_JAILED_POT, RC_WASTELAND_NEAR_GS_POT_1, RC_WASTELAND_NEAR_GS_POT_2, RC_WASTELAND_NEAR_GS_POT_3, @@ -2366,39 +2391,39 @@ typedef enum { RC_GV_CRATE_BRIDGE_3, RC_GV_CRATE_BRIDGE_4, RC_GF_ABOVE_JAIL_CRATE, - RC_GF_OUTSIDE_CENTER_CRATE_1, - RC_GF_OUTSIDE_CENTER_CRATE_2, - RC_GF_OUTSIDE_CENTER_CRATE_3, - RC_GF_OUTSIDE_CENTER_CRATE_4, - RC_GF_OUTSIDE_LEFT_CRATE_1, - RC_GF_OUTSIDE_LEFT_CRATE_2, - RC_GF_ARCHERY_RANGE_CRATE_1, - RC_GF_ARCHERY_RANGE_CRATE_2, - RC_GF_ARCHERY_RANGE_CRATE_3, - RC_GF_ARCHERY_RANGE_CRATE_4, - RC_GF_ARCHERY_RANGE_CRATE_5, - RC_GF_ARCHERY_RANGE_CRATE_6, - RC_GF_ARCHERY_RANGE_CRATE_7, - RC_GF_ARCHERY_START_CRATE_1, - RC_GF_ARCHERY_START_CRATE_2, - RC_GF_ARCHERY_LEFT_END_CRATE_1, - RC_GF_ARCHERY_LEFT_END_CRATE_2, - RC_GF_ARCHERY_LEFT_END_CHILD_CRATE, - RC_GF_ARCHERY_RIGHT_END_CRATE_1, - RC_GF_ARCHERY_RIGHT_END_CRATE_2, - RC_GF_KITCHEN_CRATE_1, - RC_GF_KITCHEN_CRATE_2, - RC_GF_KITCHEN_CRATE_3, - RC_GF_KITCHEN_CRATE_4, - RC_GF_KITCHEN_CRATE_5, - RC_GF_BREAK_ROOM_CRATE_1, - RC_GF_BREAK_ROOM_CRATE_2, - RC_GF_BREAK_ROOM_CRATE_3, - RC_GF_BREAK_ROOM_CRATE_4, - RC_GF_NORTH_F1_CARPENTER_CRATE, - RC_GF_NORTH_F3_CARPENTER_CRATE, - RC_GF_SOUTH_F2_CARPENTER_CRATE_1, - RC_GF_SOUTH_F2_CARPENTER_CRATE_2, + RC_GF_SOUTHMOST_CENTER_CRATE, + RC_GF_MID_SOUTH_CENTER_CRATE, + RC_GF_MID_NORTH_CENTER_CRATE, + RR_GF_NORTHMOST_CENTER_CRATE, + RC_GF_OUTSKIRTS_NE_CRATE, + RC_GF_OUTSKIRTS_NW_CRATE, + RC_GF_HBA_RANGE_CRATE_1, + RC_GF_HBA_RANGE_CRATE_2, + RC_GF_HBA_RANGE_CRATE_3, + RC_GF_HBA_RANGE_CRATE_4, + RC_GF_HBA_RANGE_CRATE_5, + RC_GF_HBA_RANGE_CRATE_6, + RC_GF_HBA_RANGE_CRATE_7, + RC_GF_HBA_CANOPY_EAST_CRATE, + RC_GF_HBA_CANOPY_WEST_CRATE, + RC_GF_NORTH_TARGET_EAST_CRATE, + RC_GF_NORTH_TARGET_WEST_CRATE, + RC_GF_NORTH_TARGET_CHILD_CRATE, + RC_GF_SOUTH_TARGET_EAST_CRATE, + RC_GF_SOUTH_TARGET_WEST_CRATE, + RC_TH_NEAR_KITCHEN_LEFTMOST_CRATE, + RC_TH_NEAR_KITCHEN_MID_LEFT_CRATE, + RC_TH_NEAR_KITCHEN_MID_RIGHT_CRATE, + RC_TH_NEAR_KITCHEN_RIGHTMOST_CRATE, + RC_TH_KITCHEN_CRATE, + RC_TH_BREAK_HALLWAY_OUTER_CRATE, + RC_TH_BREAK_HALLWAY_INNER_CRATE, + RC_TH_BREAK_ROOM_RIGHT_CRATE, + RC_TH_BREAK_ROOM_LEFT_CRATE, + RC_TH_1_TORCH_CELL_CRATE, + RC_TH_DEAD_END_CELL_CRATE, + RC_TH_DOUBLE_CELL_LEFT_CRATE, + RC_TH_DOUBLE_CELL_RIGHT_CRATE, RC_HW_BEFORE_QUICKSAND_CRATE, RC_HW_AFTER_QUICKSAND_CRATE_1, RC_HW_AFTER_QUICKSAND_CRATE_2, @@ -3112,7 +3137,7 @@ typedef enum { RC_DMT_FLAG_SUN_FAIRY, RC_DMT_COW_GROTTO_STORMS_FAIRY, RC_LW_SHORTCUT_STORMS_FAIRY, - RC_GF_KITCHEN_SUN_FAIRY, + RC_TH_KITCHEN_SUN_FAIRY, RC_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY, RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY, RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, @@ -3551,7 +3576,7 @@ typedef enum { RT_LH_LAB_DIVING, RT_LH_WATER_HOOKSHOT, RT_GV_CRATE_HOVERS, - RT_GF_KITCHEN, + RT_PASS_GUARDS_WITH_NOTHING, RT_GF_JUMP, RT_GF_WARRIOR_WITH_DIFFICULT_WEAPON, RT_HW_BUNNY_CROSSING, @@ -4504,11 +4529,11 @@ typedef enum { RHT_GF_CHEST, RHT_GF_HBA_1000_POINTS, RHT_GF_HBA_1500_POINTS, - RHT_GF_GERUDO_MEMBERSHIP_CARD, - RHT_GF_NORTH_F1_CARPENTER, - RHT_GF_NORTH_F2_CARPENTER, - RHT_GF_SOUTH_F1_CARPENTER, - RHT_GF_SOUTH_F2_CARPENTER, + RHT_TH_FREED_CARPENTERS, + RHT_TH_1_TORCH_CARPENTER, + RHT_TH_DEAD_END_CARPENTER, + RHT_TH_DOUBLE_CELL_CARPENTER, + RHT_TH_STEEP_SLOPE_CARPENTER, RHT_GF_GS_TOP_FLOOR, RHT_GF_GS_ARCHERY_RANGE, RHT_HIDEOUT_JAIL_GUARD_1_TORCH, @@ -5391,7 +5416,22 @@ typedef enum { RHT_MASK_SHOP_HINT, // Shuffle Pots RHT_POT_KOKIRI_FOREST, - RHT_POT_GERUDO_FORTRESS, + RHT_TH_BREAK_ROOM_FRONT_POT, + RHT_TH_BREAK_ROOM_BACK_POT, + RHT_TH_KITCHEN_POT_1, + RHT_TH_KITCHEN_POT_2, + RHT_TH_1_TORCH_CELL_RIGHT_POT, + RHT_TH_1_TORCH_CELL_MID_POT, + RHT_TH_1_TORCH_CELL_LEFT_POT, + RHT_TH_STEEP_SLOPE_RIGHT_POT, + RHT_TH_STEEP_SLOPE_LEFT_POT, + RHT_TH_NEAR_DOUBLE_CELL_RIGHT_POT, + RHT_TH_NEAR_DOUBLE_CELL_MID_POT, + RHT_TH_NEAR_DOUBLE_CELL_LEFT_POT, + RHT_TH_RIGHTMOST_JAILED_POT, + RHT_TH_RIGHT_MIDDLE_JAILED_POT, + RHT_TH_LEFT_MIDDLE_JAILED_POT, + RHT_TH_LEFTMOST_JAILED_POT, RHT_POT_WASTELAND, RHT_POT_MARKET, RHT_POT_KAKARIKO, @@ -5581,7 +5621,7 @@ typedef enum { RHT_DMT_FLAG_SUN_FAIRY, RHT_DMT_COW_GROTTO_STORMS_FAIRY, RHT_LW_SHORTCUT_STORMS_FAIRY, - RHT_GF_KITCHEN_SUN_FAIRY, + RHT_TH_KITCHEN_SUN_FAIRY, RHT_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY, RHT_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY, RHT_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, @@ -6454,6 +6494,8 @@ typedef enum { RE_STINGER, RE_BIG_OCTO, RE_GERUDO_WARRIOR, + RE_GERUDO_GUARD, + RE_BREAK_ROOM_GUARD, RE_GIBDO, RE_GOHMA, RE_KING_DODONGO, diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index 1a8eca6dc..da05ee508 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -233,20 +233,20 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() { (location.GetRandomizerCheck() != RC_KAK_100_GOLD_SKULLTULA_REWARD || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGanonBossKey"), RO_GANON_BOSS_KEY_VANILLA) != RO_GANON_BOSS_KEY_KAK_TOKENS) && // 100 skull reward ganon boss key - (location.GetRCType() != RCTYPE_GF_KEY && location.GetRandomizerCheck() != RC_GF_GERUDO_MEMBERSHIP_CARD || + (location.GetRCType() != RCTYPE_GF_KEY && location.GetRandomizerCheck() != RC_TH_FREED_CARPENTERS || (CVarGetInteger(CVAR_RANDOMIZER_SETTING("FortressCarpenters"), RO_GF_CARPENTERS_NORMAL) == RO_GF_CARPENTERS_FREE && - location.GetRCType() != RCTYPE_GF_KEY && location.GetRandomizerCheck() != RC_GF_GERUDO_MEMBERSHIP_CARD) || + location.GetRCType() != RCTYPE_GF_KEY && location.GetRandomizerCheck() != RC_TH_FREED_CARPENTERS) || (CVarGetInteger(CVAR_RANDOMIZER_SETTING("FortressCarpenters"), RO_GF_CARPENTERS_NORMAL) == RO_GF_CARPENTERS_FAST && - ((location.GetRandomizerCheck() == RC_GF_GERUDO_MEMBERSHIP_CARD && + ((location.GetRandomizerCheck() == RC_TH_FREED_CARPENTERS && CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGerudoToken"), RO_GENERIC_NO) == RO_GENERIC_YES) || - (location.GetRandomizerCheck() == RC_GF_NORTH_F1_CARPENTER && + (location.GetRandomizerCheck() == RC_TH_1_TORCH_CARPENTER && CVarGetInteger(CVAR_RANDOMIZER_SETTING("GerudoKeys"), RO_GERUDO_KEYS_VANILLA) != RO_GERUDO_KEYS_VANILLA))) || (CVarGetInteger(CVAR_RANDOMIZER_SETTING("FortressCarpenters"), RO_GF_CARPENTERS_NORMAL) == RO_GF_CARPENTERS_NORMAL && - ((location.GetRandomizerCheck() == RC_GF_GERUDO_MEMBERSHIP_CARD && + ((location.GetRandomizerCheck() == RC_TH_FREED_CARPENTERS && CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleGerudoToken"), RO_GENERIC_NO) == RO_GENERIC_YES) || (location.GetRCType() == RCTYPE_GF_KEY && CVarGetInteger(CVAR_RANDOMIZER_SETTING("GerudoKeys"), RO_GERUDO_KEYS_VANILLA) != diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index adaf03cea..d460c6daf 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -759,7 +759,7 @@ void CheckTrackerFlagSet(int16_t flagType, int32_t flag) { if ((flag == EVENTCHKINF_CARPENTERS_FREE(0) || flag == EVENTCHKINF_CARPENTERS_FREE(1) || flag == EVENTCHKINF_CARPENTERS_FREE(2) || flag == EVENTCHKINF_CARPENTERS_FREE(3)) && GET_EVENTCHKINF_CARPENTERS_FREE_ALL()) { - SetCheckCollected(RC_GF_GERUDO_MEMBERSHIP_CARD); + SetCheckCollected(RC_TH_FREED_CARPENTERS); return; } checkMatchType = SpoilerCollectionCheckType::SPOILER_CHK_EVENT_CHK_INF; @@ -1589,10 +1589,10 @@ bool IsCheckShuffled(RandomizerCheck rc) { (loc->GetRCType() != RCTYPE_BOSS_KEY || showBossKeysanity) && (loc->GetRCType() != RCTYPE_GANON_BOSS_KEY || showGanonBossKey) && (rc != RC_KAK_100_GOLD_SKULLTULA_REWARD || show100SkullReward) && - (loc->GetRCType() != RCTYPE_GF_KEY && rc != RC_GF_GERUDO_MEMBERSHIP_CARD || - (showGerudoCard && rc == RC_GF_GERUDO_MEMBERSHIP_CARD) || + (loc->GetRCType() != RCTYPE_GF_KEY && rc != RC_TH_FREED_CARPENTERS || + (showGerudoCard && rc == RC_TH_FREED_CARPENTERS) || (fortressNormal && showGerudoFortressKeys && loc->GetRCType() == RCTYPE_GF_KEY) || - (fortressFast && showGerudoFortressKeys && rc == RC_GF_NORTH_F1_CARPENTER)); + (fortressFast && showGerudoFortressKeys && rc == RC_TH_1_TORCH_CARPENTER)); } else if (loc->IsVanillaCompletion()) { return (OTRGlobals::Instance->gRandoContext->IsQuestOfLocationActive(rc) || rc == RC_GIFT_FROM_RAURU) && rc != RC_LINKS_POCKET; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index f36a7f8b8..cf2f83d3a 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -203,22 +203,22 @@ DEFINE_RAND_INF(RAND_INF_KF_TWINS_HOUSE_POT_1) DEFINE_RAND_INF(RAND_INF_KF_TWINS_HOUSE_POT_2) DEFINE_RAND_INF(RAND_INF_KF_BROTHERS_HOUSE_POT_1) DEFINE_RAND_INF(RAND_INF_KF_BROTHERS_HOUSE_POT_2) -DEFINE_RAND_INF(RAND_INF_GF_BREAK_ROOM_POT_1) -DEFINE_RAND_INF(RAND_INF_GF_BREAK_ROOM_POT_2) -DEFINE_RAND_INF(RAND_INF_GF_KITCHEN_POT_1) -DEFINE_RAND_INF(RAND_INF_GF_KITCHEN_POT_2) -DEFINE_RAND_INF(RAND_INF_GF_NORTH_F1_CARPENTER_POT_1) -DEFINE_RAND_INF(RAND_INF_GF_NORTH_F1_CARPENTER_POT_2) -DEFINE_RAND_INF(RAND_INF_GF_NORTH_F1_CARPENTER_POT_3) -DEFINE_RAND_INF(RAND_INF_GF_NORTH_F2_CARPENTER_POT_1) -DEFINE_RAND_INF(RAND_INF_GF_NORTH_F2_CARPENTER_POT_2) -DEFINE_RAND_INF(RAND_INF_GF_SOUTH_F1_CARPENTER_POT_1) -DEFINE_RAND_INF(RAND_INF_GF_SOUTH_F1_CARPENTER_POT_2) -DEFINE_RAND_INF(RAND_INF_GF_SOUTH_F1_CARPENTER_POT_3) -DEFINE_RAND_INF(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_1) -DEFINE_RAND_INF(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_2) -DEFINE_RAND_INF(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_3) -DEFINE_RAND_INF(RAND_INF_GF_SOUTH_F1_CARPENTER_CELL_POT_4) +DEFINE_RAND_INF(RAND_INF_TH_BREAK_ROOM_FRONT_POT) +DEFINE_RAND_INF(RAND_INF_TH_BREAK_ROOM_BACK_POT) +DEFINE_RAND_INF(RAND_INF_TH_KITCHEN_POT_1) +DEFINE_RAND_INF(RAND_INF_TH_KITCHEN_POT_2) +DEFINE_RAND_INF(RAND_INF_TH_1_TORCH_CELL_RIGHT_POT) +DEFINE_RAND_INF(RAND_INF_TH_1_TORCH_CELL_MID_POT) +DEFINE_RAND_INF(RAND_INF_TH_1_TORCH_CELL_LEFT_POT) +DEFINE_RAND_INF(RAND_INF_TH_STEEP_SLOPE_RIGHT_POT) +DEFINE_RAND_INF(RAND_INF_TH_STEEP_SLOPE_LEFT_POT) +DEFINE_RAND_INF(RAND_INF_TH_NEAR_DOUBLE_CELL_RIGHT_POT) +DEFINE_RAND_INF(RAND_INF_TH_NEAR_DOUBLE_CELL_MID_POT) +DEFINE_RAND_INF(RAND_INF_NEAR_DOUBLE_CELL_LEFT_POT) +DEFINE_RAND_INF(RAND_INF_TH_RIGHTMOST_JAILED_POT) +DEFINE_RAND_INF(RAND_INF_TH_RIGHT_MIDDLE_JAILED_POT) +DEFINE_RAND_INF(RAND_INF_TH_LEFT_MIDDLE_JAILED_POT) +DEFINE_RAND_INF(RAND_INF_TH_LEFTMOST_JAILED_POT) DEFINE_RAND_INF(RAND_INF_WASTELAND_NEAR_GS_POT_1) DEFINE_RAND_INF(RAND_INF_WASTELAND_NEAR_GS_POT_2) DEFINE_RAND_INF(RAND_INF_WASTELAND_NEAR_GS_POT_3) @@ -748,39 +748,39 @@ DEFINE_RAND_INF(RAND_INF_GV_CRATE_BRIDGE_2) DEFINE_RAND_INF(RAND_INF_GV_CRATE_BRIDGE_3) DEFINE_RAND_INF(RAND_INF_GV_CRATE_BRIDGE_4) DEFINE_RAND_INF(RAND_INF_GF_ABOVE_JAIL_CRATE) -DEFINE_RAND_INF(RAND_INF_GF_OUTSIDE_CENTER_CRATE_1) -DEFINE_RAND_INF(RAND_INF_GF_OUTSIDE_CENTER_CRATE_2) -DEFINE_RAND_INF(RAND_INF_GF_OUTSIDE_CENTER_CRATE_3) -DEFINE_RAND_INF(RAND_INF_GF_OUTSIDE_CENTER_CRATE_4) -DEFINE_RAND_INF(RAND_INF_GF_OUTSIDE_LEFT_CRATE_1) -DEFINE_RAND_INF(RAND_INF_GF_OUTSIDE_LEFT_CRATE_2) -DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_RANGE_CRATE_1) -DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_RANGE_CRATE_2) -DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_RANGE_CRATE_3) -DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_RANGE_CRATE_4) -DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_RANGE_CRATE_5) -DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_RANGE_CRATE_6) -DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_RANGE_CRATE_7) -DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_START_CRATE_1) -DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_START_CRATE_2) -DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_LEFT_END_CRATE_1) -DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_LEFT_END_CRATE_2) -DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_LEFT_END_CHILD_CRATE) -DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_1) -DEFINE_RAND_INF(RAND_INF_GF_ARCHERY_RIGHT_END_CRATE_2) -DEFINE_RAND_INF(RAND_INF_GF_KITCHEN_CRATE_1) -DEFINE_RAND_INF(RAND_INF_GF_KITCHEN_CRATE_2) -DEFINE_RAND_INF(RAND_INF_GF_KITCHEN_CRATE_3) -DEFINE_RAND_INF(RAND_INF_GF_KITCHEN_CRATE_4) -DEFINE_RAND_INF(RAND_INF_GF_KITCHEN_CRATE_5) -DEFINE_RAND_INF(RAND_INF_GF_BREAK_ROOM_CRATE_1) -DEFINE_RAND_INF(RAND_INF_GF_BREAK_ROOM_CRATE_2) -DEFINE_RAND_INF(RAND_INF_GF_BREAK_ROOM_CRATE_3) -DEFINE_RAND_INF(RAND_INF_GF_BREAK_ROOM_CRATE_4) -DEFINE_RAND_INF(RAND_INF_GF_NORTH_F1_CARPENTER_CRATE) -DEFINE_RAND_INF(RAND_INF_GF_NORTH_F3_CARPENTER_CRATE) -DEFINE_RAND_INF(RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_1) -DEFINE_RAND_INF(RAND_INF_GF_SOUTH_F2_CARPENTER_CRATE_2) +DEFINE_RAND_INF(RAND_INF_GF_SOUTHMOST_CENTER_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_MID_SOUTH_CENTER_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_MID_NORTH_CENTER_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_NORTHMOST_CENTER_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_OUTSKIRTS_NE_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_OUTSKIRTS_NW_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_HBA_RANGE_CRATE_1) +DEFINE_RAND_INF(RAND_INF_GF_HBA_RANGE_CRATE_2) +DEFINE_RAND_INF(RAND_INF_GF_HBA_RANGE_CRATE_3) +DEFINE_RAND_INF(RAND_INF_GF_HBA_RANGE_CRATE_4) +DEFINE_RAND_INF(RAND_INF_GF_HBA_RANGE_CRATE_5) +DEFINE_RAND_INF(RAND_INF_GF_HBA_RANGE_CRATE_6) +DEFINE_RAND_INF(RAND_INF_GF_HBA_RANGE_CRATE_7) +DEFINE_RAND_INF(RAND_INF_GF_HBA_CANOPY_EAST_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_HBA_CANOPY_WEST_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_NORTH_TARGET_EAST_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_NORTH_TARGET_WEST_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_NORTH_TARGET_CHILD_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_SOUTH_TARGET_EAST_CRATE) +DEFINE_RAND_INF(RAND_INF_GF_SOUTH_TARGET_WEST_CRATE) +DEFINE_RAND_INF(RAND_INF_TH_NEAR_KITCHEN_LEFTMOST_CRATE) +DEFINE_RAND_INF(RAND_INF_TH_NEAR_KITCHEN_MID_LEFT_CRATE) +DEFINE_RAND_INF(RAND_INF_TH_NEAR_KITCHEN_MID_RIGHT_CRATE) +DEFINE_RAND_INF(RAND_INF_TH_NEAR_KITCHEN_RIGHTMOST_CRATE) +DEFINE_RAND_INF(RAND_INF_TH_KITCHEN_CRATE) +DEFINE_RAND_INF(RAND_INF_TH_BREAK_HALLWAY_OUTER_CRATE) +DEFINE_RAND_INF(RAND_INF_TH_BREAK_HALLWAY_INNER_CRATE) +DEFINE_RAND_INF(RAND_INF_TH_BREAK_ROOM_RIGHT_CRATE) +DEFINE_RAND_INF(RAND_INF_TH_BREAK_ROOM_LEFT_CRATE) +DEFINE_RAND_INF(RAND_INF_TH_1_TORCH_CELL_CRATE) +DEFINE_RAND_INF(RAND_INF_TH_DEAD_END_CELL_CRATE) +DEFINE_RAND_INF(RAND_INF_TH_DOUBLE_CELL_LEFT_CRATE) +DEFINE_RAND_INF(RAND_INF_TH_DOUBLE_CELL_RIGHT_CRATE) DEFINE_RAND_INF(RAND_INF_HW_BEFORE_QUICKSAND_CRATE) DEFINE_RAND_INF(RAND_INF_HW_AFTER_QUICKSAND_CRATE_1) DEFINE_RAND_INF(RAND_INF_HW_AFTER_QUICKSAND_CRATE_2) @@ -1089,7 +1089,7 @@ DEFINE_RAND_INF(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_3) DEFINE_RAND_INF(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_4) DEFINE_RAND_INF(RAND_INF_MARKET_TREASURE_CHEST_GAME_KEY_5) -DEFINE_RAND_INF(RAND_INF_GF_ITEM_FROM_LEADER_OF_FORTRESS) +DEFINE_RAND_INF(RAND_INF_TH_ITEM_FROM_LEADER_OF_FORTRESS) DEFINE_RAND_INF(RAND_INF_GF_GTG_GATE_PERMANENTLY_OPEN) DEFINE_RAND_INF(RAND_INF_ZELDAS_LETTER) @@ -1504,7 +1504,7 @@ DEFINE_RAND_INF(RAND_INF_DMT_FLAG_SUN_FAIRY) DEFINE_RAND_INF(RAND_INF_DMT_COW_GROTTO_STORMS_FAIRY) DEFINE_RAND_INF(RAND_INF_HF_FENCE_GROTTO_STORMS_FAIRY) DEFINE_RAND_INF(RAND_INF_LW_SHORTCUT_STORMS_FAIRY) -DEFINE_RAND_INF(RAND_INF_GF_KITCHEN_SUN_FAIRY) +DEFINE_RAND_INF(RAND_INF_TH_KITCHEN_SUN_FAIRY) DEFINE_RAND_INF(RAND_INF_LW_DEKU_SCRUB_GROTTO_SUN_FAIRY) DEFINE_RAND_INF(RAND_INF_GRAVEYARD_ROYAL_FAMILYS_TOMB_SUN_FAIRY) DEFINE_RAND_INF(RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY) diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 32b2d77a9..52add036e 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -580,13 +580,13 @@ void Settings::CreateOptions() { "Gerudo Valley Crate PoH as Adult with Hover Boots", "From the far side of Gerudo Valley, a precise Hover Boots movement and jump-slash recoil can allow " "adult to reach the ledge with the crate PoH without needing Longshot. You will take fall damage."); - OPT_TRICK(RT_GF_KITCHEN, RCQUEST_BOTH, RA_GERUDO_FORTRESS, { Tricks::Tag::NOVICE }, - "Thieves\' Hideout \"Kitchen\" with No Additional Items", - "Allows passing through the kitchen by avoiding being seen by the guards. The logic normally guarantees " - "Bow or Hookshot to stun them from a distance, or Hover Boots to cross the room without needing to deal " - "with the guards."); + OPT_TRICK(RT_PASS_GUARDS_WITH_NOTHING, RCQUEST_BOTH, RA_GERUDO_FORTRESS, { Tricks::Tag::NOVICE }, + "Sneak Past Moving Gerudo Guards with No Items", + "The logic normally guarantees Bow or Hookshot to stun them from a distance," + "but every moving guard can be passed with basic movement and AI manipulation"); OPT_TRICK(RT_GF_JUMP, RCQUEST_BOTH, RA_GERUDO_FORTRESS, { Tricks::Tag::NOVICE }, "Gerudo\'s Fortress Ledge Jumps", - "Adult can jump onto the top roof of the fortress without going through the interior of the hideout."); + "It is possible to navigate the rooves of Fortress with unintuative jumps to reach additional areas " + "without going inside."); OPT_TRICK(RT_GF_WARRIOR_WITH_DIFFICULT_WEAPON, RCQUEST_BOTH, RA_GERUDO_FORTRESS, { Tricks::Tag::NOVICE }, "Gerudo\'s Fortress Warriors with Difficult Weapons", "Warriors can be defeated with Slingshot or Bombchus."); From 9e686ae6f6156919d3e52dc43870dd61265c37ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philip=20Dub=C3=A9?= Date: Thu, 26 Jun 2025 05:00:53 +0000 Subject: [PATCH 65/67] Shuffles: use ObjectExtension system for rando object identity (#5603) --- soh/soh/Enhancements/CuccosToReturn.cpp | 1 - .../randomizer/ShuffleBeehives.cpp | 22 +++--- .../Enhancements/randomizer/ShuffleCrates.cpp | 71 ++++++++++++++----- .../Enhancements/randomizer/ShuffleCrates.h | 16 ----- .../randomizer/ShuffleFairies.cpp | 42 +++++++---- .../Enhancements/randomizer/ShuffleGrass.cpp | 43 ++++++----- .../Enhancements/randomizer/ShuffleGrass.h | 15 ---- .../Enhancements/randomizer/ShufflePots.cpp | 29 +++++--- soh/src/overlays/actors/ovl_En_Elf/z_en_elf.h | 3 - .../overlays/actors/ovl_En_Kusa/z_en_kusa.h | 1 - .../overlays/actors/ovl_Obj_Comb/z_obj_comb.h | 1 - .../actors/ovl_Obj_Kibako/z_obj_kibako.h | 1 - .../actors/ovl_Obj_Kibako2/z_obj_kibako2.h | 1 - .../actors/ovl_Obj_Tsubo/z_obj_tsubo.h | 1 - 14 files changed, 142 insertions(+), 105 deletions(-) delete mode 100644 soh/soh/Enhancements/randomizer/ShuffleCrates.h delete mode 100644 soh/soh/Enhancements/randomizer/ShuffleGrass.h diff --git a/soh/soh/Enhancements/CuccosToReturn.cpp b/soh/soh/Enhancements/CuccosToReturn.cpp index 317437216..2de929fd3 100644 --- a/soh/soh/Enhancements/CuccosToReturn.cpp +++ b/soh/soh/Enhancements/CuccosToReturn.cpp @@ -1,6 +1,5 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ShipInit.hpp" -#include "soh/Enhancements/randomizer/context.h" extern "C" { extern PlayState* gPlayState; diff --git a/soh/soh/Enhancements/randomizer/ShuffleBeehives.cpp b/soh/soh/Enhancements/randomizer/ShuffleBeehives.cpp index 03f6dfa65..c94c68511 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleBeehives.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleBeehives.cpp @@ -1,5 +1,6 @@ #include #include "static_data.h" +#include "soh/ObjectExtension/ObjectExtension.h" extern "C" { #include "src/overlays/actors/ovl_Obj_Comb/z_obj_comb.h" @@ -10,12 +11,14 @@ extern void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play); void ObjComb_RandomizerChooseItemDrop(ObjComb* objComb, PlayState* play) { s16 params = objComb->actor.params & 0x1F; + const auto beehiveIdentity = ObjectExtension::GetInstance().Get(&objComb->actor); - if (RAND_GET_OPTION(RSK_SHUFFLE_BEEHIVES) && !Flags_GetRandomizerInf(objComb->beehiveIdentity.randomizerInf)) { + if (RAND_GET_OPTION(RSK_SHUFFLE_BEEHIVES) && beehiveIdentity != nullptr && + !Flags_GetRandomizerInf(beehiveIdentity->randomizerInf)) { EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &objComb->actor.world.pos, ITEM00_SOH_DUMMY); - item00->randoInf = objComb->beehiveIdentity.randomizerInf; + item00->randoInf = beehiveIdentity->randomizerInf; item00->itemEntry = - OTRGlobals::Instance->gRandomizer->GetItemFromKnownCheck(objComb->beehiveIdentity.randomizerCheck, GI_NONE); + OTRGlobals::Instance->gRandomizer->GetItemFromKnownCheck(beehiveIdentity->randomizerCheck, GI_NONE); item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; return; } @@ -37,10 +40,11 @@ void ObjComb_RandomizerChooseItemDrop(ObjComb* objComb, PlayState* play) { } void ObjComb_RandomizerWait(ObjComb* objComb, PlayState* play) { - s32 dmgFlags; - objComb->unk_1B0 -= 50; - if (RAND_GET_OPTION(RSK_SHUFFLE_BEEHIVES) && !Flags_GetRandomizerInf(objComb->beehiveIdentity.randomizerInf)) { + + const auto beehiveIdentity = ObjectExtension::GetInstance().Get(&objComb->actor); + if (RAND_GET_OPTION(RSK_SHUFFLE_BEEHIVES) && beehiveIdentity == nullptr && + !Flags_GetRandomizerInf(beehiveIdentity->randomizerInf)) { if (objComb->unk_1B0 <= -5000) { objComb->unk_1B0 = 1500; } @@ -50,7 +54,7 @@ void ObjComb_RandomizerWait(ObjComb* objComb, PlayState* play) { if ((objComb->collider.base.acFlags & AC_HIT) != 0) { objComb->collider.base.acFlags &= ~AC_HIT; - dmgFlags = objComb->collider.elements[0].info.acHitInfo->toucher.dmgFlags; + s32 dmgFlags = objComb->collider.elements[0].info.acHitInfo->toucher.dmgFlags; if (dmgFlags & 0x4001F866) { objComb->unk_1B0 = 1500; } else { @@ -70,8 +74,9 @@ void ObjComb_RandomizerWait(ObjComb* objComb, PlayState* play) { void ObjComb_RandomizerInit(void* actor) { ObjComb* objComb = static_cast(actor); s16 respawnData = gSaveContext.respawn[RESPAWN_MODE_RETURN].data & ((1 << 8) - 1); - objComb->beehiveIdentity = OTRGlobals::Instance->gRandomizer->IdentifyBeehive( + auto beehiveIdentity = OTRGlobals::Instance->gRandomizer->IdentifyBeehive( gPlayState->sceneNum, (s16)objComb->actor.world.pos.x, respawnData); + ObjectExtension::GetInstance().Set(actor, std::move(beehiveIdentity)); objComb->actionFunc = (ObjCombActionFunc)ObjComb_RandomizerWait; } @@ -132,4 +137,5 @@ void Rando::StaticData::RegisterBeehiveLocations() { // clang-format-on } +static ObjectExtension::Register RegisterBeehiveIdentity; static RegisterShipInitFunc registerFunc(Rando::StaticData::RegisterBeehiveLocations); diff --git a/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp b/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp index c6563688b..53a65df22 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleCrates.cpp @@ -1,9 +1,10 @@ -#include "ShuffleCrates.h" +#include #include "soh_assets.h" #include "static_data.h" #include #include "global.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/ObjectExtension/ObjectExtension.h" extern "C" { #include "variables.h" @@ -31,8 +32,14 @@ extern "C" void ObjKibako2_RandomizerDraw(Actor* thisx, PlayState* play) { return; } + const auto crateIdentity = ObjectExtension::GetInstance().Get(thisx); + if (crateIdentity == nullptr) { + Gfx_DrawDListOpa(play, (Gfx*)gLargeRandoCrateDL); + return; + } + GetItemEntry crateItem = - Rando::Context::GetInstance()->GetFinalGIEntry(crateActor->crateIdentity.randomizerCheck, true, GI_NONE); + Rando::Context::GetInstance()->GetFinalGIEntry(crateIdentity->randomizerCheck, true, GI_NONE); getItemCategory = crateItem.getItemCategory; // If they have bombchus, don't consider the bombchu item major @@ -99,8 +106,14 @@ extern "C" void ObjKibako_RandomizerDraw(Actor* thisx, PlayState* play) { return; } - GetItemEntry smallCrateItem = Rando::Context::GetInstance()->GetFinalGIEntry( - smallCrateActor->smallCrateIdentity.randomizerCheck, true, GI_NONE); + const auto crateIdentity = ObjectExtension::GetInstance().Get(thisx); + if (crateIdentity == nullptr) { + Gfx_DrawDListOpa(play, (Gfx*)gSmallRandoCrateDL); + return; + } + + GetItemEntry smallCrateItem = + Rando::Context::GetInstance()->GetFinalGIEntry(crateIdentity->randomizerCheck, true, GI_NONE); getItemCategory = smallCrateItem.getItemCategory; // If they have bombchus, don't consider the bombchu item major @@ -154,15 +167,19 @@ extern "C" void ObjKibako_RandomizerDraw(Actor* thisx, PlayState* play) { } uint8_t ObjKibako2_RandomizerHoldsItem(ObjKibako2* crateActor, PlayState* play) { - RandomizerCheck rc = crateActor->crateIdentity.randomizerCheck; + const auto crateIdentity = ObjectExtension::GetInstance().Get(&crateActor->dyna.actor); + if (crateIdentity == nullptr) { + return false; + } + + RandomizerCheck rc = crateIdentity->randomizerCheck; uint8_t isDungeon = Rando::StaticData::GetLocation(rc)->IsDungeon(); uint8_t crateSetting = RAND_GET_OPTION(RSK_SHUFFLE_CRATES); // Don't pull randomized item if crate isn't randomized or is already checked if (!IS_RANDO || (crateSetting == RO_SHUFFLE_CRATES_OVERWORLD && isDungeon) || (crateSetting == RO_SHUFFLE_CRATES_DUNGEONS && !isDungeon) || - Flags_GetRandomizerInf(crateActor->crateIdentity.randomizerInf) || - crateActor->crateIdentity.randomizerCheck == RC_UNKNOWN_CHECK) { + Flags_GetRandomizerInf(crateIdentity->randomizerInf) || crateIdentity->randomizerCheck == RC_UNKNOWN_CHECK) { return false; } else { return true; @@ -170,15 +187,19 @@ uint8_t ObjKibako2_RandomizerHoldsItem(ObjKibako2* crateActor, PlayState* play) } uint8_t ObjKibako_RandomizerHoldsItem(ObjKibako* smallCrateActor, PlayState* play) { - RandomizerCheck rc = smallCrateActor->smallCrateIdentity.randomizerCheck; + const auto crateIdentity = ObjectExtension::GetInstance().Get(&smallCrateActor->actor); + if (crateIdentity == nullptr) { + return false; + } + + RandomizerCheck rc = crateIdentity->randomizerCheck; uint8_t isDungeon = Rando::StaticData::GetLocation(rc)->IsDungeon(); uint8_t crateSetting = RAND_GET_OPTION(RSK_SHUFFLE_CRATES); // Don't pull randomized item if crate isn't randomized or is already checked if (!IS_RANDO || (crateSetting == RO_SHUFFLE_CRATES_OVERWORLD && isDungeon) || (crateSetting == RO_SHUFFLE_CRATES_DUNGEONS && !isDungeon) || - Flags_GetRandomizerInf(smallCrateActor->smallCrateIdentity.randomizerInf) || - smallCrateActor->smallCrateIdentity.randomizerCheck == RC_UNKNOWN_CHECK) { + Flags_GetRandomizerInf(crateIdentity->randomizerInf) || crateIdentity->randomizerCheck == RC_UNKNOWN_CHECK) { return false; } else { return true; @@ -186,10 +207,14 @@ uint8_t ObjKibako_RandomizerHoldsItem(ObjKibako* smallCrateActor, PlayState* pla } void ObjKibako2_RandomizerSpawnCollectible(ObjKibako2* crateActor, PlayState* play) { + const auto crateIdentity = ObjectExtension::GetInstance().Get(&crateActor->dyna.actor); + if (crateIdentity == nullptr) { + return; + } + EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &crateActor->dyna.actor.world.pos, ITEM00_SOH_DUMMY); - item00->randoInf = crateActor->crateIdentity.randomizerInf; - item00->itemEntry = - Rando::Context::GetInstance()->GetFinalGIEntry(crateActor->crateIdentity.randomizerCheck, true, GI_NONE); + item00->randoInf = crateIdentity->randomizerInf; + item00->itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(crateIdentity->randomizerCheck, true, GI_NONE); item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; item00->actor.velocity.y = 8.0f; item00->actor.speedXZ = 2.0f; @@ -197,10 +222,14 @@ void ObjKibako2_RandomizerSpawnCollectible(ObjKibako2* crateActor, PlayState* pl } void ObjKibako_RandomizerSpawnCollectible(ObjKibako* smallCrateActor, PlayState* play) { + const auto crateIdentity = ObjectExtension::GetInstance().Get(&smallCrateActor->actor); + if (crateIdentity == nullptr) { + return; + } + EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &smallCrateActor->actor.world.pos, ITEM00_SOH_DUMMY); - item00->randoInf = smallCrateActor->smallCrateIdentity.randomizerInf; - item00->itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry( - smallCrateActor->smallCrateIdentity.randomizerCheck, true, GI_NONE); + item00->randoInf = crateIdentity->randomizerInf; + item00->itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(crateIdentity->randomizerCheck, true, GI_NONE); item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; item00->actor.velocity.y = 8.0f; item00->actor.speedXZ = 2.0f; @@ -231,8 +260,9 @@ void ObjKibako2_RandomizerInit(void* actorRef) { ObjKibako2* crateActor = static_cast(actorRef); - crateActor->crateIdentity = OTRGlobals::Instance->gRandomizer->IdentifyCrate( - gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z); + auto crateIdentity = OTRGlobals::Instance->gRandomizer->IdentifyCrate(gPlayState->sceneNum, (s16)actor->world.pos.x, + (s16)actor->world.pos.z); + ObjectExtension::GetInstance().Set(actor, std::move(crateIdentity)); } void ObjKibako_RandomizerInit(void* actorRef) { @@ -243,8 +273,9 @@ void ObjKibako_RandomizerInit(void* actorRef) { ObjKibako* smallCrateActor = static_cast(actorRef); - smallCrateActor->smallCrateIdentity = OTRGlobals::Instance->gRandomizer->IdentifySmallCrate( + auto crateIdentity = OTRGlobals::Instance->gRandomizer->IdentifySmallCrate( gPlayState->sceneNum, (s16)actor->home.pos.x, (s16)actor->home.pos.z); + ObjectExtension::GetInstance().Set(actor, std::move(crateIdentity)); } void RegisterShuffleCrates() { @@ -564,5 +595,7 @@ void Rando::StaticData::RegisterCrateLocations() { // clang-format on } +static ObjectExtension::Register RegisterCrateIdentity; +static ObjectExtension::Register RegisterSmallCrateIdentity; static RegisterShipInitFunc initFunc(RegisterShuffleCrates, { "IS_RANDO" }); static RegisterShipInitFunc locFunc(Rando::StaticData::RegisterCrateLocations); diff --git a/soh/soh/Enhancements/randomizer/ShuffleCrates.h b/soh/soh/Enhancements/randomizer/ShuffleCrates.h deleted file mode 100644 index eb0325f89..000000000 --- a/soh/soh/Enhancements/randomizer/ShuffleCrates.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef ShuffleCrates_H -#define ShuffleCrates_H - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif -void ObjKibako2_RandomizerInit(void* actorRef); -void ObjKibako_RandomizerInit(void* actorRef); -#ifdef __cplusplus -}; -#endif - -#endif // ShuffleCrates_H diff --git a/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp b/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp index aad3f6327..666ba0a21 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleFairies.cpp @@ -1,19 +1,28 @@ +#include "soh/OTRGlobals.h" #include "randomizer_grotto.h" #include "draw.h" +#include "soh/cvar_prefixes.h" +#include "static_data.h" +#include "soh/Enhancements/item-tables/ItemTableTypes.h" +#include "soh/ObjectExtension/ObjectExtension.h" + +extern "C" { #include "src/overlays/actors/ovl_En_Elf/z_en_elf.h" #include "src/overlays/actors/ovl_Obj_Bean/z_obj_bean.h" #include "src/overlays/actors/ovl_En_Gs/z_en_gs.h" #include "src/overlays/actors/ovl_Shot_Sun/z_shot_sun.h" -#include "soh/OTRGlobals.h" -#include "soh/cvar_prefixes.h" -#include "soh/Enhancements/item-tables/ItemTableTypes.h" -#include "static_data.h" +} #define FAIRY_FLAG_TIMED (1 << 8) void ShuffleFairies_DrawRandomizedItem(EnElf* enElf, PlayState* play) { + const auto fairyIdentity = ObjectExtension::GetInstance().Get(&enElf->actor); + if (fairyIdentity == nullptr) { + return; + } + GetItemEntry randoGetItem = - Rando::Context::GetInstance()->GetFinalGIEntry(enElf->sohFairyIdentity.randomizerCheck, true, GI_FAIRY); + Rando::Context::GetInstance()->GetFinalGIEntry(fairyIdentity->randomizerCheck, true, GI_FAIRY); if (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0)) { randoGetItem = GET_ITEM_MYSTERY; } @@ -33,8 +42,8 @@ bool ShuffleFairies_FairyExists(FairyIdentity fairyIdentity) { if (actor->id != ACTOR_EN_ELF) { actor = actor->next; } else { - EnElf* enElf = (EnElf*)(actor); - if (fairyIdentity.randomizerInf == enElf->sohFairyIdentity.randomizerInf) { + const auto actorFairyIdentity = ObjectExtension::GetInstance().Get(&actor); + if (actorFairyIdentity != nullptr && fairyIdentity.randomizerInf == actorFairyIdentity->randomizerInf) { return true; } actor = actor->next; @@ -70,10 +79,10 @@ FairyIdentity ShuffleFairies_GetFairyIdentity(int32_t params) { static bool SpawnFairy(f32 posX, f32 posY, f32 posZ, int32_t params, FairyType fairyType) { FairyIdentity fairyIdentity = ShuffleFairies_GetFairyIdentity(params); if (!Flags_GetRandomizerInf(fairyIdentity.randomizerInf)) { - EnElf* fairy = (EnElf*)Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_ELF, posX, posY - 30.0f, posZ, 0, - 0, 0, fairyType, true); - fairy->sohFairyIdentity = fairyIdentity; - fairy->actor.draw = (ActorFunc)ShuffleFairies_DrawRandomizedItem; + Actor* fairy = Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_ELF, posX, posY - 30.0f, posZ, 0, 0, 0, + fairyType, true); + ObjectExtension::GetInstance().Set(fairy, std::move(fairyIdentity)); + fairy->draw = (ActorFunc)ShuffleFairies_DrawRandomizedItem; return true; } return false; @@ -85,8 +94,14 @@ void RegisterShuffleFairies() { // Grant item when picking up fairy. COND_VB_SHOULD(VB_FAIRY_HEAL, shouldRegister, { EnElf* enElf = va_arg(args, EnElf*); - if (enElf->sohFairyIdentity.randomizerInf && enElf->sohFairyIdentity.randomizerInf != RAND_INF_MAX) { - Flags_SetRandomizerInf(enElf->sohFairyIdentity.randomizerInf); + + const auto fairyIdentity = ObjectExtension::GetInstance().Get(&enElf->actor); + if (fairyIdentity == nullptr) { + return; + } + + if (fairyIdentity != nullptr && fairyIdentity->randomizerInf && fairyIdentity->randomizerInf != RAND_INF_MAX) { + Flags_SetRandomizerInf(fairyIdentity->randomizerInf); } }); @@ -404,5 +419,6 @@ void Rando::StaticData::RegisterFairyLocations() { // clang-format on } +static ObjectExtension::Register RegisterFairyIdentity; static RegisterShipInitFunc registerShuffleFairies(RegisterShuffleFairies, { "IS_RANDO" }); static RegisterShipInitFunc registerShuffleFairiesLocations(Rando::StaticData::RegisterFairyLocations); diff --git a/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp b/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp index 28f06e9d4..27d42a148 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleGrass.cpp @@ -1,6 +1,7 @@ -#include "ShuffleGrass.h" +#include #include "soh_assets.h" #include "static_data.h" +#include "soh/ObjectExtension/ObjectExtension.h" #include "soh/Enhancements/enhancementTypes.h" extern "C" { @@ -27,18 +28,20 @@ extern "C" void EnKusa_RandomizerDraw(Actor* thisx, PlayState* play) { static Gfx* dLists[] = { (Gfx*)gRandoBushJunkDL, (Gfx*)gRandoCuttableGrassJunkDL, (Gfx*)gRandoCuttableGrassJunkDL }; auto grassActor = ((EnKusa*)thisx); + const auto grassIdentity = ObjectExtension::GetInstance().Get(thisx); + OPEN_DISPS(play->state.gfxCtx); Gfx_SetupDL_25Opa(play->state.gfxCtx); - if (grassActor->grassIdentity.randomizerCheck != RC_MAX && - Flags_GetRandomizerInf(grassActor->grassIdentity.randomizerInf) == 0) { + if (grassIdentity != nullptr && grassIdentity->randomizerCheck != RC_MAX && + Flags_GetRandomizerInf(grassIdentity->randomizerInf) == 0) { int csmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), CSMC_DISABLED); int requiresStoneAgony = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); if ((csmc == CSMC_BOTH || csmc == CSMC_TEXTURE) && (!requiresStoneAgony || (requiresStoneAgony && CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)))) { - auto itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(grassActor->grassIdentity.randomizerCheck, - true, GI_NONE); + auto itemEntry = + Rando::Context::GetInstance()->GetFinalGIEntry(grassIdentity->randomizerCheck, true, GI_NONE); GetItemCategory getItemCategory = itemEntry.getItemCategory; switch (getItemCategory) { @@ -88,19 +91,19 @@ extern "C" void EnKusa_RandomizerDraw(Actor* thisx, PlayState* play) { } uint8_t EnKusa_RandomizerHoldsItem(EnKusa* grassActor, PlayState* play) { - if (grassActor->grassIdentity.randomizerCheck == RC_MAX) + const auto grassIdentity = ObjectExtension::GetInstance().Get(&grassActor->actor); + + if (grassIdentity == nullptr || grassIdentity->randomizerCheck == RC_MAX) return false; - RandomizerCheck rc = grassActor->grassIdentity.randomizerCheck; - + RandomizerCheck rc = grassIdentity->randomizerCheck; uint8_t isDungeon = Rando::StaticData::GetLocation(rc)->IsDungeon(); uint8_t grassSetting = RAND_GET_OPTION(RSK_SHUFFLE_GRASS); // Don't pull randomized item if grass isn't randomized or is already checked if (!IS_RANDO || (grassSetting == RO_SHUFFLE_GRASS_OVERWORLD && isDungeon) || (grassSetting == RO_SHUFFLE_GRASS_DUNGEONS && !isDungeon) || - Flags_GetRandomizerInf(grassActor->grassIdentity.randomizerInf) || - grassActor->grassIdentity.randomizerCheck == RC_UNKNOWN_CHECK) { + Flags_GetRandomizerInf(grassIdentity->randomizerInf) || rc == RC_UNKNOWN_CHECK) { return false; } else { return true; @@ -108,10 +111,14 @@ uint8_t EnKusa_RandomizerHoldsItem(EnKusa* grassActor, PlayState* play) { } void EnKusa_RandomizerSpawnCollectible(EnKusa* grassActor, PlayState* play) { + const auto grassIdentity = ObjectExtension::GetInstance().Get(&grassActor->actor); + if (grassIdentity == nullptr) { + return; + } + EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &grassActor->actor.world.pos, ITEM00_SOH_DUMMY); - item00->randoInf = grassActor->grassIdentity.randomizerInf; - item00->itemEntry = - Rando::Context::GetInstance()->GetFinalGIEntry(grassActor->grassIdentity.randomizerCheck, true, GI_NONE); + item00->randoInf = grassIdentity->randomizerInf; + item00->itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(grassIdentity->randomizerCheck, true, GI_NONE); item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; item00->actor.velocity.y = 8.0f; item00->actor.speedXZ = 2.0f; @@ -127,8 +134,9 @@ void EnKusa_RandomizerInit(void* actorRef) { EnKusa* grassActor = static_cast(actorRef); s16 respawnData = gSaveContext.respawn[RESPAWN_MODE_RETURN].data & ((1 << 8) - 1); - grassActor->grassIdentity = OTRGlobals::Instance->gRandomizer->IdentifyGrass( + auto grassIdentity = OTRGlobals::Instance->gRandomizer->IdentifyGrass( gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z, respawnData, gPlayState->linkAgeOnLoad); + ObjectExtension::GetInstance().Set(actor, std::move(grassIdentity)); } void RegisterShuffleGrass() { @@ -150,8 +158,10 @@ void RegisterShuffleGrass() { EnKusa* grassActor = va_arg(args, EnKusa*); if (EnKusa_RandomizerHoldsItem(grassActor, gPlayState)) { EnKusa_RandomizerSpawnCollectible(grassActor, gPlayState); - grassActor->grassIdentity.randomizerCheck = RC_MAX; - grassActor->grassIdentity.randomizerInf = RAND_INF_MAX; + ObjectExtension::GetInstance().Set(&grassActor->actor, std::move(GrassIdentity{ + .randomizerInf = RAND_INF_MAX, + .randomizerCheck = RC_MAX, + })); *should = false; } else { *should = true; @@ -519,5 +529,6 @@ void Rando::StaticData::RegisterGrassLocations() { // clang-format on } +static ObjectExtension::Register RegisterGrassIdentity; static RegisterShipInitFunc registerShuffleGrass(RegisterShuffleGrass, { "IS_RANDO" }); static RegisterShipInitFunc registerShuffleGrassLocations(Rando::StaticData::RegisterGrassLocations); diff --git a/soh/soh/Enhancements/randomizer/ShuffleGrass.h b/soh/soh/Enhancements/randomizer/ShuffleGrass.h deleted file mode 100644 index bc9a130d4..000000000 --- a/soh/soh/Enhancements/randomizer/ShuffleGrass.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef SHUFFLEGRASS_H -#define SHUFFLEGRASS_H - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif -void EnKusa_RandomizerInit(void* actorRef); -#ifdef __cplusplus -}; -#endif - -#endif // SHUFFLEGRASS_H diff --git a/soh/soh/Enhancements/randomizer/ShufflePots.cpp b/soh/soh/Enhancements/randomizer/ShufflePots.cpp index 9dfeb06ae..ad23f9d26 100644 --- a/soh/soh/Enhancements/randomizer/ShufflePots.cpp +++ b/soh/soh/Enhancements/randomizer/ShufflePots.cpp @@ -1,6 +1,7 @@ #include "soh/OTRGlobals.h" #include "soh_assets.h" #include "static_data.h" +#include "soh/ObjectExtension/ObjectExtension.h" extern "C" { #include "variables.h" @@ -25,15 +26,19 @@ extern "C" void ObjTsubo_RandomizerDraw(Actor* thisx, PlayState* play) { } uint8_t ObjTsubo_RandomizerHoldsItem(ObjTsubo* potActor, PlayState* play) { - RandomizerCheck rc = potActor->potIdentity.randomizerCheck; + const auto potIdentity = ObjectExtension::GetInstance().Get(&potActor->actor); + if (potIdentity == nullptr) { + return false; + } + + RandomizerCheck rc = potIdentity->randomizerCheck; uint8_t isDungeon = Rando::StaticData::GetLocation(rc)->IsDungeon(); uint8_t potSetting = RAND_GET_OPTION(RSK_SHUFFLE_POTS); // Don't pull randomized item if pot isn't randomized or is already checked if (!IS_RANDO || (potSetting == RO_SHUFFLE_POTS_OVERWORLD && isDungeon) || - (potSetting == RO_SHUFFLE_POTS_DUNGEONS && !isDungeon) || - Flags_GetRandomizerInf(potActor->potIdentity.randomizerInf) || - potActor->potIdentity.randomizerCheck == RC_UNKNOWN_CHECK) { + (potSetting == RO_SHUFFLE_POTS_DUNGEONS && !isDungeon) || Flags_GetRandomizerInf(potIdentity->randomizerInf) || + potIdentity->randomizerCheck == RC_UNKNOWN_CHECK) { return false; } else { return true; @@ -41,10 +46,14 @@ uint8_t ObjTsubo_RandomizerHoldsItem(ObjTsubo* potActor, PlayState* play) { } void ObjTsubo_RandomizerSpawnCollectible(ObjTsubo* potActor, PlayState* play) { + const auto potIdentity = ObjectExtension::GetInstance().Get(&potActor->actor); + if (potIdentity == nullptr) { + return; + } + EnItem00* item00 = (EnItem00*)Item_DropCollectible2(play, &potActor->actor.world.pos, ITEM00_SOH_DUMMY); - item00->randoInf = potActor->potIdentity.randomizerInf; - item00->itemEntry = - Rando::Context::GetInstance()->GetFinalGIEntry(potActor->potIdentity.randomizerCheck, true, GI_NONE); + item00->randoInf = potIdentity->randomizerInf; + item00->itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(potIdentity->randomizerCheck, true, GI_NONE); item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; item00->actor.velocity.y = 8.0f; item00->actor.speedXZ = 2.0f; @@ -58,8 +67,9 @@ void RegisterShufflePots() { Actor* actor = static_cast(actorRef); ObjTsubo* potActor = static_cast(actorRef); - potActor->potIdentity = OTRGlobals::Instance->gRandomizer->IdentifyPot( - gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z); + auto potIdentity = OTRGlobals::Instance->gRandomizer->IdentifyPot(gPlayState->sceneNum, (s16)actor->world.pos.x, + (s16)actor->world.pos.z); + ObjectExtension::GetInstance().Set(actor, std::move(potIdentity)); }); // Draw custom model for pot to indicate it holding a randomized item. @@ -649,5 +659,6 @@ void Rando::StaticData::RegisterPotLocations() { // clang-format on } +static ObjectExtension::Register RegisterPotIdentity; static RegisterShipInitFunc registerShufflePots(RegisterShufflePots, { "IS_RANDO" }); static RegisterShipInitFunc registerShufflePotLocations(Rando::StaticData::RegisterPotLocations); diff --git a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.h b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.h index 8a5368768..7f8e4c84e 100644 --- a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.h +++ b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.h @@ -42,9 +42,6 @@ typedef struct EnElf { /* 0x02C7 */ u8 unk_2C7; /* 0x02C8 */ EnElfUnkFunc func_2C8; /* 0x02CC */ EnElfActionFunc actionFunc; - // #region SOH [Randomizer] - /* */ FairyIdentity sohFairyIdentity; - // #endregion } EnElf; // size = 0x02D0 typedef enum { diff --git a/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h b/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h index 6db50aa28..f1e9f24d7 100644 --- a/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h +++ b/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.h @@ -20,7 +20,6 @@ typedef struct EnKusa { /* 0x0150 */ ColliderCylinder collider; /* 0x019C */ s16 timer; /* 0x019E */ s8 objBankIndex; - /* */ GrassIdentity grassIdentity; } EnKusa; // size = 0x01A0 #endif diff --git a/soh/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.h b/soh/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.h index ded72dfc4..ea4910300 100644 --- a/soh/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.h +++ b/soh/src/overlays/actors/ovl_Obj_Comb/z_obj_comb.h @@ -15,7 +15,6 @@ typedef struct ObjComb { /* 0x0170 */ ColliderJntSphElement colliderItems[1]; /* 0x01B0 */ s16 unk_1B0; /* 0x01B2 */ s16 unk_1B2; - /* */ BeehiveIdentity beehiveIdentity; } ObjComb; // size = 0x01B4 void ObjComb_Break(ObjComb* objComb, PlayState* play); diff --git a/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.h b/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.h index 32a35563f..68e871c78 100644 --- a/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.h +++ b/soh/src/overlays/actors/ovl_Obj_Kibako/z_obj_kibako.h @@ -12,7 +12,6 @@ typedef struct ObjKibako { /* 0x0000 */ Actor actor; /* 0x014C */ ObjKibakoActionFunc actionFunc; /* 0x0150 */ ColliderCylinder collider; - /* */ SmallCrateIdentity smallCrateIdentity; } ObjKibako; // size = 0x019C #endif diff --git a/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.h b/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.h index 7629e6aa1..48c22154f 100644 --- a/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.h +++ b/soh/src/overlays/actors/ovl_Obj_Kibako2/z_obj_kibako2.h @@ -13,7 +13,6 @@ typedef struct ObjKibako2 { /* 0x0164 */ ColliderCylinder collider; /* 0x01B0 */ ObjKibako2ActionFunc actionFunc; /* 0x01B4 */ s16 collectibleFlag; - /* */ CrateIdentity crateIdentity; } ObjKibako2; // size = 0x01B8 #endif diff --git a/soh/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.h b/soh/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.h index 74dbf6ebb..a83d43a47 100644 --- a/soh/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.h +++ b/soh/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.h @@ -13,7 +13,6 @@ typedef struct ObjTsubo { /* 0x014C */ ObjTsuboActionFunc actionFunc; /* 0x0150 */ ColliderCylinder collider; /* 0x019C */ s8 objTsuboBankIndex; - /* */ PotIdentity potIdentity; } ObjTsubo; // size = 0x01A0 #endif From e15f8d395b316c79bbe55af5cbdb483231785f98 Mon Sep 17 00:00:00 2001 From: louist103 <35883445+louist103@users.noreply.github.com> Date: Sat, 28 Jun 2025 00:15:02 +0000 Subject: [PATCH 66/67] Backport 2ship streamed audio (#5457) * Bring over changes from 2ship # Conflicts: # .github/workflows/apt-deps.txt # soh/CMakeLists.txt # soh/soh/resource/importer/AudioSampleFactory.h # soh/soh/resource/importer/AudioSequenceFactory.cpp # soh/soh/resource/importer/AudioSequenceFactory.h # soh/soh/resource/importer/AudioSoundFontFactory.h * Update xml format * Format and fix mixer for Windows * Fixes for new LUS * Good ole clang-format --- .github/workflows/apt-deps.txt | 2 +- .github/workflows/macports-deps.txt | 2 +- CMake/FindOgg.cmake | 61 + CMake/FindOpus.cmake | 44 + CMake/FindOpusFile.cmake | 55 + CMake/FindVorbis.cmake | 210 ++ CMakeLists.txt | 4 +- soh/CMakeLists.txt | 43 +- soh/assets/xml/GC_MQ_D/audio/Audio.xml | 1840 ++++------------ soh/assets/xml/GC_MQ_NTSC_J/audio/Audio.xml | 1841 ++++------------ soh/assets/xml/GC_MQ_NTSC_U/audio/Audio.xml | 1841 ++++------------ soh/assets/xml/GC_MQ_PAL_F/audio/Audio.xml | 1841 ++++------------ soh/assets/xml/GC_NMQ_D/audio/Audio.xml | 1841 ++++------------ soh/assets/xml/GC_NMQ_NTSC_J/audio/Audio.xml | 1841 ++++------------ .../xml/GC_NMQ_NTSC_J_CE/audio/Audio.xml | 1841 ++++------------ soh/assets/xml/GC_NMQ_NTSC_U/audio/Audio.xml | 1841 ++++------------ soh/assets/xml/GC_NMQ_PAL_F/audio/Audio.xml | 1841 ++++------------ soh/assets/xml/N64_NTSC_10/audio/Audio.xml | 1849 +++++------------ soh/assets/xml/N64_NTSC_11/audio/Audio.xml | 1849 +++++------------ soh/assets/xml/N64_NTSC_12/audio/Audio.xml | 1841 ++++------------ soh/assets/xml/N64_PAL_10/audio/Audio.xml | 1841 ++++------------ soh/assets/xml/N64_PAL_11/audio/Audio.xml | 1841 ++++------------ soh/include/z64audio.h | 60 +- soh/soh/OTRGlobals.cpp | 30 + soh/soh/OTRGlobals.h | 1 + soh/soh/ResourceManagerHelpers.cpp | 7 +- soh/soh/ResourceManagerHelpers.h | 3 +- soh/soh/mixer.c | 265 ++- soh/soh/mixer.h | 5 + .../resource/importer/AudioSampleFactory.cpp | 383 +++- .../resource/importer/AudioSampleFactory.h | 11 + .../importer/AudioSequenceFactory.cpp | 368 +++- .../resource/importer/AudioSequenceFactory.h | 8 + .../importer/AudioSoundFontFactory.cpp | 412 +++- .../resource/importer/AudioSoundFontFactory.h | 18 + soh/soh/resource/type/AudioSample.cpp | 8 + soh/soh/resource/type/AudioSample.h | 44 +- soh/soh/resource/type/AudioSequence.cpp | 8 +- soh/soh/resource/type/AudioSequence.h | 10 +- soh/soh/resource/type/AudioSoundFont.cpp | 19 +- soh/soh/resource/type/AudioSoundFont.h | 6 +- soh/src/code/audio_heap.c | 4 +- soh/src/code/audio_load.c | 159 +- soh/src/code/audio_playback.c | 18 +- soh/src/code/audio_seqplayer.c | 2 +- soh/src/code/audio_synthesis.c | 30 +- soh/src/code/code_800E4FE0.c | 2 +- 47 files changed, 8478 insertions(+), 19613 deletions(-) create mode 100644 CMake/FindOgg.cmake create mode 100644 CMake/FindOpus.cmake create mode 100644 CMake/FindOpusFile.cmake create mode 100644 CMake/FindVorbis.cmake diff --git a/.github/workflows/apt-deps.txt b/.github/workflows/apt-deps.txt index 3461cdbac..dba3511bf 100644 --- a/.github/workflows/apt-deps.txt +++ b/.github/workflows/apt-deps.txt @@ -1 +1 @@ -libusb-dev libusb-1.0-0-dev libsdl2-dev libsdl2-net-dev libpng-dev libglew-dev nlohmann-json3-dev libtinyxml2-dev libspdlog-dev libespeak-ng-dev ninja-build +libusb-dev libusb-1.0-0-dev libsdl2-dev libsdl2-net-dev libpng-dev libglew-dev nlohmann-json3-dev libtinyxml2-dev libspdlog-dev ninja-build libogg-dev libopus-dev opus-tools libopusfile-dev libvorbis-dev libespeak-ng-dev \ No newline at end of file diff --git a/.github/workflows/macports-deps.txt b/.github/workflows/macports-deps.txt index d15039078..fd97d0c30 100644 --- a/.github/workflows/macports-deps.txt +++ b/.github/workflows/macports-deps.txt @@ -1 +1 @@ -libsdl2 +universal libsdl2_net +universal libpng +universal glew +universal libzip +universal nlohmann-json +universal tinyxml2 +universal \ No newline at end of file +libsdl2 +universal libsdl2_net +universal libpng +universal glew +universal libzip +universal nlohmann-json +universal tinyxml2 +universal libogg +universal libopus +universal opusfile +universal libvorbis +universal \ No newline at end of file diff --git a/CMake/FindOgg.cmake b/CMake/FindOgg.cmake new file mode 100644 index 000000000..9cf5ce430 --- /dev/null +++ b/CMake/FindOgg.cmake @@ -0,0 +1,61 @@ +# - Find ogg +# Find the native ogg includes and libraries +# +# OGG_INCLUDE_DIRS - where to find ogg.h, etc. +# OGG_LIBRARIES - List of libraries when using ogg. +# OGG_FOUND - True if ogg found. + +if (OGG_INCLUDE_DIR) + # Already in cache, be silent + set(OGG_FIND_QUIETLY TRUE) +endif () + +find_package (PkgConfig QUIET) +pkg_check_modules (PC_OGG QUIET ogg>=1.3.0) + +set (OGG_VERSION ${PC_OGG_VERSION}) + +find_path (OGG_INCLUDE_DIR ogg/ogg.h + HINTS + ${PC_OGG_INCLUDEDIR} + ${PC_OGG_INCLUDE_DIRS} + ${OGG_ROOT} + ) +# MSVC built ogg may be named ogg_static. +# The provided project files name the library with the lib prefix. +find_library (OGG_LIBRARY + NAMES + ogg + ogg_static + libogg + libogg_static + HINTS + ${PC_OGG_LIBDIR} + ${PC_OGG_LIBRARY_DIRS} + ${OGG_ROOT} + ) +# Handle the QUIETLY and REQUIRED arguments and set OGG_FOUND +# to TRUE if all listed variables are TRUE. +include (FindPackageHandleStandardArgs) +find_package_handle_standard_args (Ogg + REQUIRED_VARS + OGG_LIBRARY + OGG_INCLUDE_DIR + VERSION_VAR + OGG_VERSION + ) + +if (OGG_FOUND) + set (OGG_LIBRARIES ${OGG_LIBRARY}) + set (OGG_INCLUDE_DIRS ${OGG_INCLUDE_DIR}) + + if(NOT TARGET Ogg::ogg) + add_library(Ogg::ogg UNKNOWN IMPORTED) + set_target_properties(Ogg::ogg PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${OGG_INCLUDE_DIRS}" + IMPORTED_LOCATION "${OGG_LIBRARIES}" + ) + endif () +endif () + +mark_as_advanced (OGG_INCLUDE_DIR OGG_LIBRARY) diff --git a/CMake/FindOpus.cmake b/CMake/FindOpus.cmake new file mode 100644 index 000000000..1e6e30d68 --- /dev/null +++ b/CMake/FindOpus.cmake @@ -0,0 +1,44 @@ +# - FindOpus.cmake +# Find the native opus includes and libraries +# +# OPUS_INCLUDE_DIRS - where to find opus/opus.h, etc. +# OPUS_LIBRARIES - List of libraries when using libopus(file). +# OPUS_FOUND - True if libopus found. + +if(OPUS_INCLUDE_DIR AND OPUS_LIBRARY AND OPUSFILE_LIBRARY) + # Already in cache, be silent + set(OPUS_FIND_QUIETLY TRUE) +endif(OPUS_INCLUDE_DIR AND OPUS_LIBRARY AND OPUSFILE_LIBRARY) + +find_path(OPUS_INCLUDE_DIR + NAMES opusfile.h + PATH_SUFFIXES opus +) + +# MSVC built opus may be named opus_static +# The provided project files name the library with the lib prefix. +find_library(OPUS_LIBRARY + NAMES opus opus_static libopus libopus_static +) +#find_library(OPUSFILE_LIBRARY +# NAMES opusfile opusfile_static libopusfile libopusfile_static +#) + +# Handle the QUIETLY and REQUIRED arguments and set OPUS_FOUND +# to TRUE if all listed variables are TRUE. +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Opus DEFAULT_MSG + OPUS_LIBRARY OPUS_INCLUDE_DIR +) + +if(OPUS_FOUND) + set(OPUS_LIBRARIES ${OPUS_LIBRARY}) + set(OPUS_INCLUDE_DIRS ${OPUS_INCLUDE_DIR}) + if(NOT TARGET Opus::opus) + add_library(Opus::opus UNKNOWN IMPORTED) + set_target_properties(Opus::opus PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${OPUS_INCLUDE_DIRS}" + IMPORTED_LOCATION "${OPUS_LIBRARIES}" + ) + endif() +endif(OPUS_FOUND) diff --git a/CMake/FindOpusFile.cmake b/CMake/FindOpusFile.cmake new file mode 100644 index 000000000..ed3b4b7ba --- /dev/null +++ b/CMake/FindOpusFile.cmake @@ -0,0 +1,55 @@ +# FindOpusFile.cmake +# Locate the libopusfile library and its dependencies (libopus and libogg). +# Defines the following variables on success: +# OPUSFILE_FOUND - Indicates if opusfile was found +# OPUSFILE_INCLUDE_DIR - Directory containing opusfile.h +# OPUSFILE_LIBRARY - Path to the opusfile library +# OPUSFILE_LIBRARIES - Full list of libraries to link (opusfile, opus, ogg) + +# Search for the OpusFile header +find_path(OPUSFILE_INCLUDE_DIR + NAMES opusfile.h + PATHS /usr/include/opus /usr/local/include/opus /opt/local/include/opus /opt/homebrew/include/opus + DOC "Directory where opusfile.h is located" +) + +# Search for the OpusFile library +find_library(OPUSFILE_LIBRARY + NAMES opusfile + DOC "Path to the libopusfile library" +) + +# Search for the Opus library (dependency of OpusFile) +find_library(OPUS_LIBRARY + NAMES opus + DOC "Path to the libopus library (dependency of libopusfile)" +) + +# Search for the Ogg library (dependency of OpusFile) +find_library(OGG_LIBRARY + NAMES ogg + DOC "Path to the libogg library (dependency of libopusfile)" +) + +# Check if all required components are found +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(OpusFile + REQUIRED_VARS OPUSFILE_LIBRARY OPUSFILE_INCLUDE_DIR OPUS_LIBRARY OGG_LIBRARY + VERSION_VAR OPUSFILE_VERSION +) + +# Define an imported target if everything is found +if (OPUSFILE_FOUND) + add_library(Opusfile::Opusfile INTERFACE IMPORTED) + + set_target_properties(Opusfile::Opusfile PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${OPUSFILE_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES "${OPUSFILE_LIBRARY};${OPUS_LIBRARY};${OGG_LIBRARY}" + ) + + # Optionally expose the include and libraries separately + set(OPUSFILE_LIBRARIES ${OPUSFILE_LIBRARY} ${OPUS_LIBRARY} ${OGG_LIBRARY}) + set(OPUSFILE_INCLUDE_DIRS ${OPUSFILE_INCLUDE_DIR}) +else() + set(OPUSFILE_FOUND FALSE) +endif() diff --git a/CMake/FindVorbis.cmake b/CMake/FindVorbis.cmake new file mode 100644 index 000000000..57e60557f --- /dev/null +++ b/CMake/FindVorbis.cmake @@ -0,0 +1,210 @@ +#[=======================================================================[.rst: +FindVorbis +---------- + +Finds the native vorbis, vorbisenc amd vorbisfile includes and libraries. + +Imported Targets +^^^^^^^^^^^^^^^^ + +This module provides the following imported targets, if found: + +``Vorbis::vorbis`` + The Vorbis library +``Vorbis::vorbisenc`` + The VorbisEnc library +``Vorbis::vorbisfile`` + The VorbisFile library + +Result Variables +^^^^^^^^^^^^^^^^ + +This will define the following variables: + +``Vorbis_Vorbis_INCLUDE_DIRS`` + List of include directories when using vorbis. +``Vorbis_Enc_INCLUDE_DIRS`` + List of include directories when using vorbisenc. +``Vorbis_File_INCLUDE_DIRS`` + List of include directories when using vorbisfile. +``Vorbis_Vorbis_LIBRARIES`` + List of libraries when using vorbis. +``Vorbis_Enc_LIBRARIES`` + List of libraries when using vorbisenc. +``Vorbis_File_LIBRARIES`` + List of libraries when using vorbisfile. +``Vorbis_FOUND`` + True if vorbis and requested components found. +``Vorbis_Vorbis_FOUND`` + True if vorbis found. +``Vorbis_Enc_FOUND`` + True if vorbisenc found. +``Vorbis_Enc_FOUND`` + True if vorbisfile found. + +Cache variables +^^^^^^^^^^^^^^^ + +The following cache variables may also be set: + +``Vorbis_Vorbis_INCLUDE_DIR`` + The directory containing ``vorbis/vorbis.h``. +``Vorbis_Enc_INCLUDE_DIR`` + The directory containing ``vorbis/vorbisenc.h``. +``Vorbis_File_INCLUDE_DIR`` + The directory containing ``vorbis/vorbisenc.h``. +``Vorbis_Vorbis_LIBRARY`` + The path to the vorbis library. +``Vorbis_Enc_LIBRARY`` + The path to the vorbisenc library. +``Vorbis_File_LIBRARY`` + The path to the vorbisfile library. + +Hints +^^^^^ + +A user may set ``Vorbis_ROOT`` to a vorbis installation root to tell this module where to look. + +#]=======================================================================] + +if (Vorbis_Vorbis_INCLUDE_DIR) + # Already in cache, be silent + set (Vorbis_FIND_QUIETLY TRUE) +endif () + +set (Vorbis_Vorbis_FIND_QUIETLY TRUE) +set (Vorbis_Enc_FIND_QUIETLY TRUE) +set (Vorbis_File_FIND_QUIETLY TRUE) + +find_package (Ogg QUIET) + +find_package (PkgConfig QUIET) +pkg_check_modules (PC_Vorbis_Vorbis QUIET vorbis) +pkg_check_modules (PC_Vorbis_Enc QUIET vorbisenc) +pkg_check_modules (PC_Vorbis_File QUIET vorbisfile) + +set (Vorbis_VERSION ${PC_Vorbis_Vorbis_VERSION}) + +find_path (Vorbis_Vorbis_INCLUDE_DIR vorbis/codec.h + HINTS + ${PC_Vorbis_Vorbis_INCLUDEDIR} + ${PC_Vorbis_Vorbis_INCLUDE_DIRS} + ${Vorbis_ROOT} + ) + +find_path (Vorbis_Enc_INCLUDE_DIR vorbis/vorbisenc.h + HINTS + ${PC_Vorbis_Enc_INCLUDEDIR} + ${PC_Vorbis_Enc_INCLUDE_DIRS} + ${Vorbis_ROOT} + ) + +find_path (Vorbis_File_INCLUDE_DIR vorbis/vorbisfile.h + HINTS + ${PC_Vorbis_File_INCLUDEDIR} + ${PC_Vorbis_File_INCLUDE_DIRS} + ${Vorbis_ROOT} + ) + +find_library (Vorbis_Vorbis_LIBRARY + NAMES + vorbis + vorbis_static + libvorbis + libvorbis_static + HINTS + ${PC_Vorbis_Vorbis_LIBDIR} + ${PC_Vorbis_Vorbis_LIBRARY_DIRS} + ${Vorbis_ROOT} + ) + +find_library (Vorbis_Enc_LIBRARY + NAMES + vorbisenc + vorbisenc_static + libvorbisenc + libvorbisenc_static + HINTS + ${PC_Vorbis_Enc_LIBDIR} + ${PC_Vorbis_Enc_LIBRARY_DIRS} + ${Vorbis_ROOT} + ) + +find_library (Vorbis_File_LIBRARY + NAMES + vorbisfile + vorbisfile_static + libvorbisfile + libvorbisfile_static + HINTS + ${PC_Vorbis_File_LIBDIR} + ${PC_Vorbis_File_LIBRARY_DIRS} + ${Vorbis_ROOT} + ) + +include (FindPackageHandleStandardArgs) + +if (Vorbis_Vorbis_LIBRARY AND Vorbis_Vorbis_INCLUDE_DIR AND Ogg_FOUND) + set (Vorbis_Vorbis_FOUND TRUE) +endif () + +if (Vorbis_Enc_LIBRARY AND Vorbis_Enc_INCLUDE_DIR AND Vorbis_Vorbis_FOUND) + set (Vorbis_Enc_FOUND TRUE) +endif () + +if (Vorbis_Vorbis_FOUND AND Vorbis_File_LIBRARY AND Vorbis_File_INCLUDE_DIR) + set (Vorbis_File_FOUND TRUE) +endif () + +find_package_handle_standard_args (Vorbis + REQUIRED_VARS + Vorbis_Vorbis_LIBRARY + Vorbis_Vorbis_INCLUDE_DIR + Ogg_FOUND + HANDLE_COMPONENTS + VERSION_VAR Vorbis_VERSION) + + +if (Vorbis_Vorbis_FOUND) + set (Vorbis_Vorbis_INCLUDE_DIRS ${VORBIS_INCLUDE_DIR}) + set (Vorbis_Vorbis_LIBRARIES ${VORBIS_LIBRARY} ${OGG_LIBRARIES}) + if (NOT TARGET Vorbis::vorbis) + add_library (Vorbis::vorbis UNKNOWN IMPORTED) + set_target_properties (Vorbis::vorbis PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${Vorbis_Vorbis_INCLUDE_DIR}" + IMPORTED_LOCATION "${Vorbis_Vorbis_LIBRARY}" + INTERFACE_LINK_LIBRARIES Ogg::ogg + ) + endif () + + if (Vorbis_Enc_FOUND) + set (Vorbis_Enc_INCLUDE_DIRS ${Vorbis_Enc_INCLUDE_DIR}) + set (Vorbis_Enc_LIBRARIES ${Vorbis_Enc_LIBRARY} ${Vorbis_Enc_LIBRARIES}) + if (NOT TARGET Vorbis::vorbisenc) + add_library (Vorbis::vorbisenc UNKNOWN IMPORTED) + set_target_properties (Vorbis::vorbisenc PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${Vorbis_Enc_INCLUDE_DIR}" + IMPORTED_LOCATION "${Vorbis_Enc_LIBRARY}" + INTERFACE_LINK_LIBRARIES Vorbis::vorbis + ) + endif () + endif () + + if (Vorbis_File_FOUND) + set (Vorbis_File_INCLUDE_DIRS ${Vorbis_File_INCLUDE_DIR}) + set (Vorbis_File_LIBRARIES ${Vorbis_File_LIBRARY} ${Vorbis_File_LIBRARIES}) + if (NOT TARGET Vorbis::vorbisfile) + add_library (Vorbis::vorbisfile UNKNOWN IMPORTED) + set_target_properties (Vorbis::vorbisfile PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${Vorbis_File_INCLUDE_DIR}" + IMPORTED_LOCATION "${Vorbis_File_LIBRARY}" + INTERFACE_LINK_LIBRARIES Vorbis::vorbis + ) + endif () + endif () + +endif () + +mark_as_advanced (Vorbis_Vorbis_INCLUDE_DIR Vorbis_Vorbis_LIBRARY) +mark_as_advanced (Vorbis_Enc_INCLUDE_DIR Vorbis_Enc_LIBRARY) +mark_as_advanced (Vorbis_File_INCLUDE_DIR Vorbis_File_LIBRARY) diff --git a/CMakeLists.txt b/CMakeLists.txt index ab90e00b9..7333da8d8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -83,8 +83,7 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Windows") set(VCPKG_TARGET_TRIPLET x64-windows-static) vcpkg_bootstrap() - vcpkg_install_packages(zlib bzip2 libzip libpng sdl2 sdl2-net glew glfw3 nlohmann-json tinyxml2 spdlog) - + vcpkg_install_packages(zlib bzip2 libzip libpng sdl2 sdl2-net glew glfw3 nlohmann-json tinyxml2 spdlog libogg libvorbis opus opusfile) if (CMAKE_C_COMPILER_LAUNCHER MATCHES "ccache|sccache") set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT Embedded) endif() @@ -154,6 +153,7 @@ set(GFX_DEBUG_DISASSEMBLER ON) # Tell LUS we're using F3DEX_GBI_2 (in a way that doesn't break libgfxd) set(GBI_UCODE F3DEX_GBI_2) +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake") ################################################################################ # Set CONTROLLERBUTTONS_T diff --git a/soh/CMakeLists.txt b/soh/CMakeLists.txt index 508836819..e74c14f4c 100644 --- a/soh/CMakeLists.txt +++ b/soh/CMakeLists.txt @@ -283,8 +283,17 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Windows") set_target_properties(${PROJECT_NAME} PROPERTIES MSVC_RUNTIME_LIBRARY ${MSVC_RUNTIME_LIBRARY_STR}) endif() ################################################################################ -# Compile definitions +# Find/download Dr Libs (For custom audio) ################################################################################ +include(FetchContent) + +FetchContent_Declare( + dr_libs + GIT_REPOSITORY https://github.com/mackron/dr_libs.git + GIT_TAG da35f9d6c7374a95353fd1df1d394d44ab66cf01 +) +FetchContent_MakeAvailable(dr_libs) + find_package(SDL2) set(SDL2-INCLUDE ${SDL2_INCLUDE_DIRS}) @@ -303,6 +312,10 @@ if (ESPEAK) add_compile_definitions(ESPEAK=1) endif() +################################################################################ +# Compile definitions +################################################################################ + target_include_directories(${PROJECT_NAME} PRIVATE assets ${CMAKE_CURRENT_SOURCE_DIR}/include/ ${CMAKE_CURRENT_SOURCE_DIR}/src/ @@ -335,6 +348,7 @@ target_include_directories(${PROJECT_NAME} PRIVATE assets ${SDL2-INCLUDE} ${SDL2-NET-INCLUDE} ${CMAKE_CURRENT_SOURCE_DIR}/assets/ + ${dr_libs_SOURCE_DIR} . ) @@ -586,6 +600,7 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang") target_link_options(${PROJECT_NAME} PRIVATE -pthread + #-fsanitize=address -Wl,-export-dynamic ) endif() @@ -626,6 +641,15 @@ endif() if (CMAKE_SYSTEM_NAME STREQUAL "Windows") find_package(glfw3 REQUIRED) + find_package(Ogg CONFIG REQUIRED) + link_libraries(Ogg::ogg) + + find_package(Vorbis CONFIG REQUIRED) + link_libraries(Vorbis::vorbisfile) + find_package(Opus CONFIG REQUIRED) + link_libraries(Opus::opus) + find_package(OpusFile CONFIG REQUIRED) + link_libraries(OpusFile::opusfile CONFIG REQUIRED) if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") set(ADDITIONAL_LIBRARY_DEPENDENCIES "libultraship;" @@ -639,6 +663,12 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Windows") "imm32;" "version;" "setupapi" + "Ogg::ogg" + "Opus::opus" + "Vorbis::vorbis" + "Vorbis::vorbisenc" + "Vorbis::vorbisfile" + "OpusFile::opusfile" ) elseif("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "Win32") set(ADDITIONAL_LIBRARY_DEPENDENCIES @@ -679,10 +709,21 @@ else() find_package(SDL2) set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) + find_package(Threads REQUIRED) + find_package(Ogg REQUIRED) + find_package(Vorbis REQUIRED) + find_package(Opus REQUIRED) + find_package(OpusFile REQUIRED) set(ADDITIONAL_LIBRARY_DEPENDENCIES "libultraship;" "ZAPDLib;" SDL2::SDL2 + "Ogg::ogg" + "Vorbis::vorbis" + "Vorbis::vorbisenc" + "Vorbis::vorbisfile" + "Opus::opus" + "Opusfile::Opusfile" "$<$:SDL2_net::SDL2_net>" ${CMAKE_DL_LIBS} Threads::Threads diff --git a/soh/assets/xml/GC_MQ_D/audio/Audio.xml b/soh/assets/xml/GC_MQ_D/audio/Audio.xml index 3cd3d42ba..e649d1f0a 100644 --- a/soh/assets/xml/GC_MQ_D/audio/Audio.xml +++ b/soh/assets/xml/GC_MQ_D/audio/Audio.xml @@ -116,1402 +116,484 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_J/audio/Audio.xml b/soh/assets/xml/GC_MQ_NTSC_J/audio/Audio.xml index 90f5dee24..e9f385ca8 100644 --- a/soh/assets/xml/GC_MQ_NTSC_J/audio/Audio.xml +++ b/soh/assets/xml/GC_MQ_NTSC_J/audio/Audio.xml @@ -114,1402 +114,483 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/soh/assets/xml/GC_MQ_NTSC_U/audio/Audio.xml b/soh/assets/xml/GC_MQ_NTSC_U/audio/Audio.xml index 4c5b001e0..a9ee07d8a 100644 --- a/soh/assets/xml/GC_MQ_NTSC_U/audio/Audio.xml +++ b/soh/assets/xml/GC_MQ_NTSC_U/audio/Audio.xml @@ -114,1402 +114,483 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/soh/assets/xml/GC_MQ_PAL_F/audio/Audio.xml b/soh/assets/xml/GC_MQ_PAL_F/audio/Audio.xml index 91521bf94..f2155154b 100644 --- a/soh/assets/xml/GC_MQ_PAL_F/audio/Audio.xml +++ b/soh/assets/xml/GC_MQ_PAL_F/audio/Audio.xml @@ -114,1402 +114,483 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_D/audio/Audio.xml b/soh/assets/xml/GC_NMQ_D/audio/Audio.xml index 47bed7419..347ac7523 100644 --- a/soh/assets/xml/GC_NMQ_D/audio/Audio.xml +++ b/soh/assets/xml/GC_NMQ_D/audio/Audio.xml @@ -116,1402 +116,483 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J/audio/Audio.xml b/soh/assets/xml/GC_NMQ_NTSC_J/audio/Audio.xml index 849499cc2..4ed6c0823 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_J/audio/Audio.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_J/audio/Audio.xml @@ -114,1402 +114,483 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_J_CE/audio/Audio.xml b/soh/assets/xml/GC_NMQ_NTSC_J_CE/audio/Audio.xml index 90f5dee24..e9f385ca8 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_J_CE/audio/Audio.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_J_CE/audio/Audio.xml @@ -114,1402 +114,483 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_NTSC_U/audio/Audio.xml b/soh/assets/xml/GC_NMQ_NTSC_U/audio/Audio.xml index 90f5dee24..e9f385ca8 100644 --- a/soh/assets/xml/GC_NMQ_NTSC_U/audio/Audio.xml +++ b/soh/assets/xml/GC_NMQ_NTSC_U/audio/Audio.xml @@ -114,1402 +114,483 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/soh/assets/xml/GC_NMQ_PAL_F/audio/Audio.xml b/soh/assets/xml/GC_NMQ_PAL_F/audio/Audio.xml index 082ead443..2c3a6a02a 100644 --- a/soh/assets/xml/GC_NMQ_PAL_F/audio/Audio.xml +++ b/soh/assets/xml/GC_NMQ_PAL_F/audio/Audio.xml @@ -114,1402 +114,483 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_10/audio/Audio.xml b/soh/assets/xml/N64_NTSC_10/audio/Audio.xml index a546214d1..7b00aa975 100644 --- a/soh/assets/xml/N64_NTSC_10/audio/Audio.xml +++ b/soh/assets/xml/N64_NTSC_10/audio/Audio.xml @@ -114,1414 +114,491 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + - - - + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_11/audio/Audio.xml b/soh/assets/xml/N64_NTSC_11/audio/Audio.xml index e0fa4543b..c2794f361 100644 --- a/soh/assets/xml/N64_NTSC_11/audio/Audio.xml +++ b/soh/assets/xml/N64_NTSC_11/audio/Audio.xml @@ -114,1414 +114,491 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + - - - + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/soh/assets/xml/N64_NTSC_12/audio/Audio.xml b/soh/assets/xml/N64_NTSC_12/audio/Audio.xml index fa2ef282b..d66d3cf92 100644 --- a/soh/assets/xml/N64_NTSC_12/audio/Audio.xml +++ b/soh/assets/xml/N64_NTSC_12/audio/Audio.xml @@ -114,1402 +114,483 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/soh/assets/xml/N64_PAL_10/audio/Audio.xml b/soh/assets/xml/N64_PAL_10/audio/Audio.xml index b2e32ab26..382a078a9 100644 --- a/soh/assets/xml/N64_PAL_10/audio/Audio.xml +++ b/soh/assets/xml/N64_PAL_10/audio/Audio.xml @@ -114,1402 +114,483 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/soh/assets/xml/N64_PAL_11/audio/Audio.xml b/soh/assets/xml/N64_PAL_11/audio/Audio.xml index f830ef648..ece8393c8 100644 --- a/soh/assets/xml/N64_PAL_11/audio/Audio.xml +++ b/soh/assets/xml/N64_PAL_11/audio/Audio.xml @@ -114,1402 +114,483 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/soh/include/z64audio.h b/soh/include/z64audio.h index 81775feba..c562b820f 100644 --- a/soh/include/z64audio.h +++ b/soh/include/z64audio.h @@ -1,6 +1,10 @@ #ifndef Z64_AUDIO_H #define Z64_AUDIO_H +#ifdef __cplusplus +extern "C" { +#endif + #include #define MK_CMD(b0,b1,b2,b3) ((((b0) & 0xFF) << 0x18) | (((b1) & 0xFF) << 0x10) | (((b2) & 0xFF) << 0x8) | (((b3) & 0xFF) << 0)) @@ -24,8 +28,8 @@ //#define MAX_SEQUENCES 0x800 extern size_t sequenceMapSize; - -extern char* fontMap[256]; +extern size_t fontMapSize; +extern char** fontMap; #define MAX_AUTHENTIC_SEQID 110 @@ -54,7 +58,8 @@ typedef enum { /* 2 */ CODEC_S16_INMEMORY, /* 3 */ CODEC_SMALL_ADPCM, /* 4 */ CODEC_REVERB, - /* 5 */ CODEC_S16 + /* 5 */ CODEC_S16, + /* 6 */ CODEC_OPUS, } SampleCodec; typedef enum { @@ -117,13 +122,14 @@ typedef struct { /* 0x2 */ s16 arg; } AdsrEnvelope; // size = 0x4 -typedef struct { - /* 0x00 */ uintptr_t start; - /* 0x04 */ uintptr_t end; - /* 0x08 */ u32 count; - /* 0x0C */ char unk_0C[0x4]; - /* 0x10 */ s16 state[16]; // only exists if count != 0. 8-byte aligned -} AdpcmLoop; // size = 0x30 (or 0x10) +typedef struct AdpcmLoop { + /* 0x00 */ u32 start; + /* 0x04 */ u32 loopEnd; // numSamples position into the sample where the loop ends + /* 0x08 */ u32 count; // The number of times the loop is played before the sound completes. Setting count to -1 + // indicates that the loop should play indefinitely. + /* 0x0C */ u32 sampleEnd; // total number of s16-samples in the sample audio clip + /* 0x10 */ s16 predictorState[16]; // only exists if count != 0. 8-byte aligned +} AdpcmLoop; // size = 0x30 (or 0x10) typedef struct { /* 0x00 */ s32 order; @@ -131,24 +137,23 @@ typedef struct { /* 0x08 */ s16* book; // size 8 * order * npredictors. 8-byte aligned } AdpcmBook; // size >= 0x8 -typedef struct -{ +typedef struct SoundFontSample { union { struct { - /* 0x00 */ u32 codec : 4; - /* 0x00 */ u32 medium : 2; - /* 0x00 */ u32 unk_bit26 : 1; - /* 0x00 */ u32 unk_bit25 : 1; // this has been named isRelocated in zret - /* 0x01 */ u32 size : 24; + ///* 0x0 */ u32 unk_0 : 1; + /* 0x0 */ u32 codec : 4; // The state of compression or decompression, See `SampleCodec` + /* 0x0 */ u32 medium : 2; // Medium where sample is currently stored. See `SampleMedium` + /* 0x0 */ u32 unk_bit26 : 1; + /* 0x0 */ u32 isRelocated : 1; // Has the sample header been relocated (offsets to pointers) + }; u32 asU32; }; - - /* 0x04 */ u8* sampleAddr; - /* 0x08 */ AdpcmLoop* loop; - /* 0x0C */ AdpcmBook* book; - u32 sampleRateMagicValue; // For wav samples only... - s32 sampleRate; // For wav samples only... + /* 0x1 */ u32 size; // Size of the sample + u32 fileSize; + /* 0x4 */ u8* sampleAddr; // Raw sample data. Offset from the start of the sample bank or absolute address to either rom or ram + /* 0x8 */ AdpcmLoop* loop; // Adpcm loop parameters used by the sample. Offset from the start of the sound font / pointer to ram + /* 0xC */ AdpcmBook* book; // Adpcm book parameters used by the sample. Offset from the start of the sound font / pointer to ram } SoundFontSample; // size = 0x10 typedef struct { @@ -465,6 +470,8 @@ typedef struct { /* 0x00F0 */ s16 dummyResampleState[0x10]; } NoteSynthesisBuffers; // size = 0x110 +struct OggOpusFile; + typedef struct { /* 0x00 */ u8 restart; /* 0x01 */ u8 sampleDmaIndex; @@ -483,6 +490,7 @@ typedef struct { /* 0x1A */ u8 unk_1A; /* 0x1C */ u16 unk_1C; /* 0x1E */ u16 unk_1E; + struct OggOpusFile* opusFile; // Only for streamed opus audio } NoteSynthesisState; // size = 0x20 typedef struct { @@ -917,7 +925,7 @@ typedef struct { /* 0x3420 */ AudioPoolSplit3 persistentCommonPoolSplit; /* 0x342C */ AudioPoolSplit3 temporaryCommonPoolSplit; /* 0x3438 */ u8 sampleFontLoadStatus[0x30]; - /* 0x3468 */ u8 fontLoadStatus[0x30]; + /* 0x3468 */ u8* fontLoadStatus; /* 0x3498 */ u8* seqLoadStatus; /* 0x3518 */ volatile u8 resetStatus; /* 0x3519 */ u8 audioResetSpecIdToLoad; @@ -1119,10 +1127,6 @@ typedef struct { uint8_t fonts[16]; } SequenceData; -#ifdef __cplusplus -extern "C" { -#endif - void Audio_SetGameVolume(int player_id, f32 volume); float Audio_GetGameVolume(int player_id); diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index d63422551..2bdcabfb5 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -411,12 +411,19 @@ void OTRGlobals::Initialize() { static_cast(SOH::ResourceType::SOH_Text), 0); loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_BINARY, "AudioSample", static_cast(SOH::ResourceType::SOH_AudioSample), 2); + + loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_XML, + "Sample", static_cast(SOH::ResourceType::SOH_AudioSample), 0); loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_BINARY, "AudioSoundFont", static_cast(SOH::ResourceType::SOH_AudioSoundFont), 2); + loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_XML, + "SoundFont", static_cast(SOH::ResourceType::SOH_AudioSoundFont), 0); loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_BINARY, "AudioSequence", static_cast(SOH::ResourceType::SOH_AudioSequence), 2); + loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_XML, + "Sequence", static_cast(SOH::ResourceType::SOH_AudioSequence), 0); loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_BINARY, "Background", static_cast(SOH::ResourceType::SOH_Background), 0); @@ -602,6 +609,12 @@ extern "C" void OTRAudio_Init() { } } +extern "C" char** sequenceMap; +extern "C" size_t sequenceMapSize; + +extern "C" char** fontMap; +extern "C" size_t fontMapSize; + extern "C" void OTRAudio_Exit() { // Tell the audio thread to stop { @@ -612,6 +625,19 @@ extern "C" void OTRAudio_Exit() { // Wait until the audio thread quit audio.thread.join(); +#if 0 + for (size_t i = 0; i < sequenceMapSize; i++) { + free(sequenceMap[i]); + } + free(sequenceMap); + + for (size_t i = 0; i < fontMapSize; i++) { + free(fontMap[i]); + } + free(fontMap); + free(gAudioContext.seqLoadStatus); + free(gAudioContext.fontLoadStatus); +#endif } extern "C" void VanillaItemTable_Init() { @@ -1071,6 +1097,10 @@ void DetectOTRVersion(std::string fileName, bool isMQ) { } } +extern "C" void Messagebox_ShowErrorBox(char* title, char* body) { + Extractor::ShowErrorBox(title, body); +} + bool IsSubpath(const std::filesystem::path& path, const std::filesystem::path& base) { auto rel = std::filesystem::relative(path, base); return !rel.empty() && rel.native()[0] != '.'; diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h index 9e7815523..cab7575cd 100644 --- a/soh/soh/OTRGlobals.h +++ b/soh/soh/OTRGlobals.h @@ -171,6 +171,7 @@ void CheckTracker_RecalculateAvailableChecks(); GetItemID RetrieveGetItemIDFromItemID(ItemID itemID); RandomizerGet RetrieveRandomizerGetFromItemID(ItemID itemID); +void Messagebox_ShowErrorBox(char* title, char* body); #endif #ifdef __cplusplus diff --git a/soh/soh/ResourceManagerHelpers.cpp b/soh/soh/ResourceManagerHelpers.cpp index 57e0ab270..a9ec6fc25 100644 --- a/soh/soh/ResourceManagerHelpers.cpp +++ b/soh/soh/ResourceManagerHelpers.cpp @@ -429,11 +429,16 @@ extern "C" SequenceData ResourceMgr_LoadSeqByName(const char* path) { return *sequence; } +extern "C" SequenceData* ResourceMgr_LoadSeqPtrByName(const char* path) { + SequenceData* sequence = (SequenceData*)ResourceGetDataByName(path); + return sequence; +} + extern "C" SoundFontSample* ResourceMgr_LoadAudioSample(const char* path) { return (SoundFontSample*)ResourceGetDataByName(path); } -extern "C" SoundFont* ResourceMgr_LoadAudioSoundFont(const char* path) { +extern "C" SoundFont* ResourceMgr_LoadAudioSoundFontByName(const char* path) { return (SoundFont*)ResourceGetDataByName(path); } diff --git a/soh/soh/ResourceManagerHelpers.h b/soh/soh/ResourceManagerHelpers.h index 4b34a8a51..b760feae3 100644 --- a/soh/soh/ResourceManagerHelpers.h +++ b/soh/soh/ResourceManagerHelpers.h @@ -51,8 +51,9 @@ void ResourceMgr_UnpatchGfxByName(const char* path, const char* patchName); char* ResourceMgr_LoadArrayByNameAsVec3s(const char* path); Vtx* ResourceMgr_LoadVtxByCRC(uint64_t crc); Vtx* ResourceMgr_LoadVtxByName(char* path); -SoundFont* ResourceMgr_LoadAudioSoundFont(const char* path); +SoundFont* ResourceMgr_LoadAudioSoundFontByName(const char* path); SequenceData ResourceMgr_LoadSeqByName(const char* path); +SequenceData* ResourceMgr_LoadSeqPtrByName(const char* path); SoundFontSample* ResourceMgr_LoadAudioSample(const char* path); CollisionHeader* ResourceMgr_LoadColByName(const char* path); bool ResourceMgr_IsAltAssetsEnabled(); diff --git a/soh/soh/mixer.c b/soh/soh/mixer.c index 98ac7b69e..1646d1a07 100644 --- a/soh/soh/mixer.c +++ b/soh/soh/mixer.c @@ -1,9 +1,11 @@ +//! This file is always optimized by a rule in the CMakeList. This is done because the SIMD functions are very large +//! when unoptimized and clang does not allow optimizing a single function. #include #include #include +#include #include "mixer.h" - #ifndef __clang__ #pragma GCC optimize("unroll-loops") #endif @@ -66,6 +68,9 @@ static int16_t resample_table[64][4] = { { 0xffdf, 0x0d46, 0x66ad, 0x0c39 } }; +static void aMixImplSSE2(uint16_t count, int16_t gain, uint16_t in_addr, uint16_t out_addr); +static void aMixImplNEON(uint16_t count, int16_t gain, uint16_t in_addr, uint16_t out_addr); + static inline int16_t clamp16(int32_t v) { if (v < -0x8000) { return -0x8000; @@ -99,6 +104,33 @@ void aLoadBufferImpl(const void* source_addr, uint16_t dest_addr, uint16_t nbyte #endif } +#include +#include + +void aOPUSdecImpl(void* source_addr, uint16_t dest_addr, uint16_t nbytes, struct OggOpusFile** decState, int32_t pos, + uint32_t size) { + int readSamples = 0; + if (*decState == NULL) { + *decState = op_open_memory(source_addr, size, NULL); + } + op_pcm_seek(*decState, pos); + int ret = op_read(*decState, BUF_S16(dest_addr), nbytes / 2, NULL); + if (ret < 0) { + return; + } + readSamples += ret; + while (readSamples < nbytes / 2) { + ret = op_read(*decState, BUF_S16(dest_addr + readSamples * 2), (nbytes - readSamples * 2) / 2, NULL); + if (ret == 0) + break; + readSamples += ret; + } +} + +void aOPUSFree(struct OggOpusFile* opusFile) { + op_free(opusFile); +} + void aSaveBufferImpl(uint16_t source_addr, int16_t* dest_addr, uint16_t nbytes) { memcpy(dest_addr, BUF_S16(source_addr), ROUND_DOWN_16(nbytes)); } @@ -296,7 +328,7 @@ void aEnvMixerImpl(uint16_t in_addr, uint16_t n_samples, bool swap_reverb, bool } while (n > 0); } -void aMixImpl(uint16_t count, int16_t gain, uint16_t in_addr, uint16_t out_addr) { +static void aMixImplRef(uint16_t count, int16_t gain, uint16_t in_addr, uint16_t out_addr) { int nbytes = ROUND_UP_32(ROUND_DOWN_16(count << 4)); int16_t* in = BUF_S16(in_addr); int16_t* out = BUF_S16(out_addr); @@ -323,6 +355,16 @@ void aMixImpl(uint16_t count, int16_t gain, uint16_t in_addr, uint16_t out_addr) } } +void aMixImpl(uint16_t count, int16_t gain, uint16_t in_addr, uint16_t out_addr) { +#if defined(__SSE2__) || defined(_M_AMD64) + aMixImplSSE2(count, gain, in_addr, out_addr); +#elif defined(__ARM_NEON) + aMixImplNEON(count, gain, in_addr, out_addr); +#else + aMixImplRef(count, gain, in_addr, out_addr); +#endif +} + void aS8DecImpl(uint8_t flags, ADPCM_STATE state) { uint8_t* in = BUF_U8(rspa.in); int16_t* out = BUF_S16(rspa.out); @@ -555,3 +597,222 @@ void aUnkCmd19Impl(uint8_t f, uint16_t count, uint16_t out_addr, uint16_t in_add nbytes -= 32 * sizeof(int16_t); } while (nbytes > 0); } + +// From here on there are SIMD implementations of the various mixer functions. +// A note about FORCE_OPTIMIZE... +// Compilers don't handle SIMD code well when not optimizing. It is unlikely that this code will need to be debugged +// outside of specific audio issues. We can assume it should always be optimized. + +// SIMD operations expect aligned data +#include "align_asset_macro.h" + +#if defined(__SSE2__) || defined(_M_AMD64) +#include + +static const ALIGN_ASSET(16) int16_t x7fff[8] = { + 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, +}; +static const ALIGN_ASSET(16) int32_t x4000[4] = { + 0x4000, + 0x4000, + 0x4000, + 0x4000, +}; + +static void aMixImplSSE2(uint16_t count, int16_t gain, uint16_t in_addr, uint16_t out_addr) { + int nbytes = ROUND_UP_32(ROUND_DOWN_16(count << 4)); + int16_t* in = BUF_S16(in_addr); + int16_t* out = BUF_S16(out_addr); + int i; + int32_t sample; + if (gain == -0x8000) { + while (nbytes > 0) { + for (unsigned int i = 0; i < 2; i++) { + __m128i outVec = _mm_loadu_si128((__m128i*)out); + __m128i inVec = _mm_loadu_si128((__m128i*)in); + __m128i subsVec = _mm_subs_epi16(outVec, inVec); + _mm_storeu_si128(out, subsVec); + nbytes -= 8 * sizeof(int16_t); + in += 8; + out += 8; + } + } + } + // Load constants into vectors from aligned memory. + __m128i x7fffVec = _mm_load_si128((__m128i*)x7fff); + __m128i x4000Vec = _mm_load_si128((__m128i*)x4000); + __m128i gainVec = _mm_set1_epi16(gain); + while (nbytes > 0) { + for (unsigned int i = 0; i < 2; i++) { + // Load input and output data into vectors + __m128i outVec = _mm_loadu_si128((__m128i*)out); + __m128i inVec = _mm_loadu_si128((__m128i*)in); + // Multiply `out` by `0x7FFF` producing 32 bit results, and store the upper and lower bits in each vector. + // Equivalent to `out[0..8] * 0x7FFF` + __m128i outx7fffLoVec = _mm_mullo_epi16(outVec, x7fffVec); + __m128i outx7fffHiVec = _mm_mulhi_epi16(outVec, x7fffVec); + // Same as above but for in and gain. Equivalent to `in[0..8] * gain` + __m128i inxGainLoVec = _mm_mullo_epi16(inVec, gainVec); + __m128i inxGainHiVec = _mm_mulhi_epi16(inVec, gainVec); + + // Interleave the lo and hi bits into one 32 bit value for each vector element. + // So now we have 4 full elements in each vector instead of 8 half elements. + outx7fffLoVec = _mm_unpacklo_epi16(outx7fffLoVec, outx7fffHiVec); + outx7fffHiVec = _mm_unpackhi_epi16(outx7fffLoVec, outx7fffHiVec); + inxGainLoVec = _mm_unpacklo_epi16(inxGainLoVec, inxGainHiVec); + inxGainHiVec = _mm_unpackhi_epi16(inxGainLoVec, inxGainHiVec); + + // Now we have 4 32 bit elements. Continue the calculaton per the reference implementation. + // We already did out + 0x7fff and in * gain. + // *out * 0x7fff + *in++ * gain is the final result of these two calculations. + __m128i addLoVec = _mm_add_epi32(outx7fffLoVec, inxGainLoVec); + __m128i addHiVec = _mm_add_epi32(outx7fffHiVec, inxGainHiVec); + // Add 0x4000 to each element + addLoVec = _mm_add_epi32(addLoVec, x4000Vec); + addHiVec = _mm_add_epi32(addHiVec, x4000Vec); + // Shift each element over by 15 + __m128i shiftedLoVec = _mm_srai_epi32(addLoVec, 15); + __m128i shiftedHiVec = _mm_srai_epi32(addHiVec, 15); + // Convert each 32 bit element to 16 bit with saturation (clamp) and store in `outVec` + outVec = _mm_packs_epi32(shiftedLoVec, shiftedHiVec); + // Write the final vector back to memory + // The final calculation is ((out[0..8] * 0x7fff + in[0..8] * gain) + 0x4000) >> 15; + _mm_storeu_si128((__m128i*)out, outVec); + + in += 8; + out += 8; + nbytes -= 8 * sizeof(int16_t); + } + } +} +#endif +#if defined(__ARM_NEON) +#include +static const int32_t x4000Arr[4] = { 0x4000, 0x4000, 0x4000, 0x4000 }; +void aMixImplNEON(uint16_t count, int16_t gain, uint16_t in_addr, uint16_t out_addr) { + int nbytes = ROUND_UP_32(ROUND_DOWN_16(count << 4)); + int16_t* in = BUF_S16(in_addr); + int16_t* out = BUF_S16(out_addr); + int i; + int32_t sample; + + if (gain == -0x8000) { + while (nbytes > 0) { + for (unsigned int i = 0; i < 2; i++) { + int16x8_t outVec = vld1q_s16(out); + int16x8_t inVec = vld1q_s16(in); + int16x8_t subVec = vqsubq_s16(outVec, inVec); + vst1q_s16(out, subVec); + nbytes -= 8 * sizeof(int16_t); + out += 8; + in += 8; + } + } + } + int16x8_t gainVec = vdupq_n_s16(gain); + int32x4_t x4000Vec = vld1q_s32(x4000Arr); + while (nbytes > 0) { + for (unsigned int i = 0; i < 2; i++) { + // for (i = 0; i < 16; i++) { + int16x8_t outVec = vld1q_s16(out); + int16x8_t inVec = vld1q_s16(in); + int16x4_t outLoVec = vget_low_s16(outVec); + int16x8_t outLoVec2 = vcombine_s16(outLoVec, outLoVec); + int16x4_t inLoVec = vget_low_s16(inVec); + int16x8_t inLoVec2 = vcombine_s16(inLoVec, inLoVec); + int32x4_t outX7fffHiVec = vmull_high_n_s16(outVec, 0x7FFF); + int32x4_t outX7fffLoVec = vmull_high_n_s16(outLoVec2, 0x7FFF); + + int32x4_t inGainLoVec = vmull_high_s16(inLoVec2, gainVec); + int32x4_t inGainHiVec = vmull_high_s16(inVec, gainVec); + int32x4_t addVecLo = vaddq_s32(outX7fffLoVec, inGainLoVec); + int32x4_t addVecHi = vaddq_s32(outX7fffHiVec, inGainHiVec); + addVecHi = vaddq_s32(addVecHi, x4000Vec); + addVecLo = vaddq_s32(addVecLo, x4000Vec); + int32x4_t shiftVecHi = vshrq_n_s32(addVecHi, 15); + int32x4_t shiftVecLo = vshrq_n_s32(addVecLo, 15); + int16x4_t shiftedNarrowHiVec = vqmovn_s32(shiftVecHi); + int16x4_t shiftedNarrowLoVec = vqmovn_s32(shiftVecLo); + vst1_s16(out, shiftedNarrowLoVec); + out += 4; + vst1_s16(out, shiftedNarrowHiVec); + // int16x8_t finalVec = vcombine_s16(shiftedNarrowLoVec, shiftedNarrowHiVec); + // vst1q_s16(out, finalVec); + out += 4; + in += 8; + + nbytes -= 8 * sizeof(int16_t); + } + } +} +#endif + +#if 0 +static const ALIGN_ASSET(32) int16_t x7fff[16] = { 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF,}; +static const ALIGN_ASSET(32) int32_t x4000[8] = { 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000, 0x4000}; + +#pragma GCC target("avx2") +// AVX2 version of the SSE2 implementation above. AVX2 wasn't released until 2014 and I don't have a good way of checking for it at compile time. +void aMixImpl256(uint16_t count, int16_t gain, uint16_t in_addr, uint16_t out_addr) { + int nbytes = ROUND_UP_32(ROUND_DOWN_16(count << 4)); + int16_t* in = BUF_S16(in_addr); + int16_t* out = BUF_S16(out_addr); + int i; + int32_t sample; + if (gain == -0x8000) { + while (nbytes > 0) { + __m256i outVec =_mm256_loadu_si256((__m256*)out); + __m256i inVec =_mm256_loadu_si256((__m256i*)in); + __m256i subsVec =_mm256_subs_epi16(outVec, inVec); + _mm256_storeu_si256(out, subsVec); + in += 16; + out += 16; + nbytes -= 16 * sizeof(int16_t); + } + } + // Load constants into vectors from aligned memory. + __m256i x7fffVec = _mm256_load_si256((__m256i*)x7fff); + __m256i x4000Vec = _mm256_load_si256((__m256i*)x4000); + __m256i gainVec = _mm256_set1_epi16(gain); + while (nbytes > 0) { + // Load input and output data into vectors + __m256i outVec = _mm256_loadu_si256((__m256i*)out); + __m256i inVec = _mm256_loadu_si256((__m256i*)in); + // Multiply `out` by `0x7FFF` producing 32 bit results, and store the upper and lower bits in each vector. + // Equivalent to `out[0..16] * 0x7FFF` + __m256i outx7fffLoVec = _mm256_mullo_epi16(outVec, x7fffVec); + __m256i outx7fffHiVec = _mm256_mulhi_epi16(outVec, x7fffVec); + // Same as above but for in and gain. Equivalent to `in[0..16] * gain` + __m256i inxGainLoVec = _mm256_mullo_epi16(inVec, gainVec); + __m256i inxGainHiVec = _mm256_mulhi_epi16(inVec, gainVec); + + // Interleave the lo and hi bits into one 32 bit value for each vector element. + // So now we have 8 full elements in each vector instead of 16 half elements. + outx7fffLoVec = _mm256_unpacklo_epi16(outx7fffLoVec, outx7fffHiVec); + outx7fffHiVec = _mm256_unpackhi_epi16(outx7fffLoVec, outx7fffHiVec); + inxGainLoVec = _mm256_unpacklo_epi16(inxGainLoVec, inxGainHiVec); + inxGainHiVec = _mm256_unpackhi_epi16(inxGainLoVec, inxGainHiVec); + + // Now we have 8 32 bit elements. Continue the calculaton per the reference implementation. + // We already did out + 0x7fff and in * gain. + // *out * 0x7fff + *in++ * gain is the final result of these two calculations. + __m256i addLoVec = _mm256_add_epi32(outx7fffLoVec, inxGainLoVec); + __m256i addHiVec = _mm256_add_epi32(outx7fffHiVec, inxGainHiVec); + // Add 0x4000 to each element + addLoVec = _mm256_add_epi32(addLoVec, x4000Vec); + addHiVec = _mm256_add_epi32(addHiVec, x4000Vec); + // Shift each element over by 15 + __m256i shiftedLoVec = _mm256_srai_epi32(addLoVec, 15); + __m256i shiftedHiVec = _mm256_srai_epi32(addHiVec, 15); + // Convert each 32 bit element to 16 bit with saturation (clamp) and store in `outVec` + outVec = _mm256_packs_epi32(shiftedLoVec, shiftedHiVec); + // Write the final vector back to memory + // The final calculation is ((out[0..16] * 0x7fff + in[0..16] * gain) + 0x4000) >> 15; + _mm256_storeu_si256((__m256i*)out, outVec); + + in += 16; + out += 16; + nbytes -= 16 * sizeof(int16_t); + } +} +#endif diff --git a/soh/soh/mixer.h b/soh/soh/mixer.h index 6bde9621e..048135e44 100644 --- a/soh/soh/mixer.h +++ b/soh/soh/mixer.h @@ -57,6 +57,11 @@ void aHiLoGainImpl(uint8_t g, uint16_t count, uint16_t addr); void aUnkCmd3Impl(uint16_t a, uint16_t b, uint16_t c); void aUnkCmd19Impl(uint8_t f, uint16_t count, uint16_t out_addr, uint16_t in_addr); +struct OggOpusFile; + +void aOPUSdecImpl(void* source_addr, uint16_t dest_addr, uint16_t nbytes, struct OggOpusFile** decState, int32_t pos, + uint32_t size); + #define aSegment(pkt, s, b) \ do { \ } while (0) diff --git a/soh/soh/resource/importer/AudioSampleFactory.cpp b/soh/soh/resource/importer/AudioSampleFactory.cpp index 0ce82de6f..9fd8d746a 100644 --- a/soh/soh/resource/importer/AudioSampleFactory.cpp +++ b/soh/soh/resource/importer/AudioSampleFactory.cpp @@ -1,6 +1,193 @@ #include "soh/resource/importer/AudioSampleFactory.h" +#include "soh/resource/importer/AudioSoundFontFactory.h" #include "soh/resource/type/AudioSample.h" #include "spdlog/spdlog.h" +#include "z64.h" +#include "z64audio.h" +#include "Context.h" +#include "resource/archive/Archive.h" +#include "resource/ResourceManager.h" +#define DR_WAV_IMPLEMENTATION +#include + +#define DR_MP3_IMPLEMENTATION +#include + +#define DR_FLAC_IMPLEMENTATION +#include + +#include +#include +#include "vorbis/vorbisfile.h" +#include + +struct OggFileData { + void* data; + size_t pos; + size_t size; +}; + +typedef enum class OggType { + None = -1, + Vorbis, + Opus, +} OggType; + +static size_t VorbisReadCallback(void* out, size_t size, size_t elems, void* src) { + OggFileData* data = static_cast(src); + size_t toRead = size * elems; + + if (toRead > data->size - data->pos) { + toRead = data->size - data->pos; + } + + memcpy(out, static_cast(data->data) + data->pos, toRead); + data->pos += toRead; + + return toRead / size; +} + +static int VorbisSeekCallback(void* src, ogg_int64_t pos, int whence) { + OggFileData* data = static_cast(src); + size_t newPos; + + switch (whence) { + case SEEK_SET: + newPos = pos; + break; + case SEEK_CUR: + newPos = data->pos + pos; + break; + case SEEK_END: + newPos = data->size + pos; + break; + default: + return -1; + } + if (newPos > data->size) { + return -1; + } + data->pos = newPos; + return 0; +} + +static int VorbisCloseCallback([[maybe_unused]] void* src) { + return 0; +} + +static long VorbisTellCallback(void* src) { + OggFileData* data = static_cast(src); + return data->pos; +} + +static const ov_callbacks vorbisCallbacks = { + VorbisReadCallback, + VorbisSeekCallback, + VorbisCloseCallback, + VorbisTellCallback, +}; + +static OggType GetOggType(OggFileData* data) { + ogg_sync_state oy; + ogg_stream_state os; + ogg_page og; + ogg_packet op; + OggType type; + // The first page as the header information, containing, among other things, what kind of data this ogg holds. + ogg_sync_init(&oy); + char* buffer = ogg_sync_buffer(&oy, 4096); + VorbisReadCallback(buffer, 4096, 1, data); + ogg_sync_wrote(&oy, 4096); + + ogg_sync_pageout(&oy, &og); + ogg_stream_init(&os, ogg_page_serialno(&og)); + ogg_stream_pagein(&os, &og); + ogg_stream_packetout(&os, &op); + + // Can't use strmp because op.packet isn't a null terminated string. + if (memcmp((char*)op.packet, "\x01vorbis", 7) == 0) { + type = OggType::Vorbis; + } else if (memcmp((char*)op.packet, "OpusHead", 8) == 0) { + type = OggType::Opus; + } else { + type = OggType::None; + } + ogg_stream_clear(&os); + ogg_sync_clear(&oy); + return type; +} + +static void Mp3DecoderWorker(std::shared_ptr audioSample, std::shared_ptr sampleFile) { + drmp3 mp3; + drwav_uint64 numFrames; + drmp3_bool32 ret = + drmp3_init_memory(&mp3, sampleFile->Buffer.get()->data(), sampleFile->Buffer.get()->size(), nullptr); + numFrames = drmp3_get_pcm_frame_count(&mp3); + drwav_uint64 channels = mp3.channels; + drwav_uint64 sampleRate = mp3.sampleRate; + + audioSample->sample.sampleAddr = new uint8_t[numFrames * channels * 2]; + drmp3_read_pcm_frames_s16(&mp3, numFrames, (int16_t*)audioSample->sample.sampleAddr); +} + +static void FlacDecoderWorker(std::shared_ptr audioSample, std::shared_ptr sampleFile) { + drflac* flac = drflac_open_memory(sampleFile->Buffer.get()->data(), sampleFile->Buffer.get()->size(), nullptr); + drflac_uint64 numFrames = flac->totalPCMFrameCount; + audioSample->sample.sampleAddr = new uint8_t[numFrames * flac->channels * 2]; + drflac_read_pcm_frames_s16(flac, numFrames, (int16_t*)audioSample->sample.sampleAddr); + drflac_close(flac); +} + +static void OggDecoderWorker(std::shared_ptr audioSample, std::shared_ptr sampleFile, + std::shared_ptr initData) { + OggVorbis_File vf; + char dataBuff[4096]; + long read = 0; + size_t pos = 0; + + OggFileData fileData = { + .data = sampleFile->Buffer.get()->data(), + .pos = 0, + .size = sampleFile->Buffer.get()->size(), + }; + switch (GetOggType(&fileData)) { + case OggType::Vorbis: { + // Getting the type advanced the position. We are going to use a different library to decode the file which + // assumes the file starts at 0 + fileData.pos = 0; + int ret = ov_open_callbacks(&fileData, &vf, nullptr, 0, vorbisCallbacks); + + vorbis_info* vi = ov_info(&vf, -1); + + uint64_t numFrames = ov_pcm_total(&vf, -1); + uint64_t sampleRate = vi->rate; + uint64_t numChannels = vi->channels; + int bitStream = 0; + size_t toRead = numFrames * numChannels * 2; + audioSample->sample.sampleAddr = new uint8_t[toRead]; + do { + read = ov_read(&vf, dataBuff, 4096, 0, 2, 1, &bitStream); + memcpy(audioSample->sample.sampleAddr + pos, dataBuff, read); + pos += read; + } while (read != 0); + ov_clear(&vf); + break; + } + case OggType::Opus: { + // OPUS encoded data is decoded by the audio driver. + audioSample->sample.codec = CODEC_OPUS; + audioSample->sample.sampleAddr = new uint8_t[sampleFile->Buffer.get()->size()]; + memcpy(audioSample->sample.sampleAddr, sampleFile->Buffer.get()->data(), sampleFile->Buffer.get()->size()); + break; + } + case OggType::None: { + char buff[2048]; + snprintf(buff, 2048, "Ogg file %s is not Vorbis or OPUS", initData->Path.c_str()); + throw std::runtime_error(buff); + break; + } + } +} namespace SOH { std::shared_ptr @@ -16,108 +203,154 @@ ResourceFactoryBinaryAudioSampleV2::ReadResource(std::shared_ptr fil audioSample->sample.codec = reader->ReadUByte(); audioSample->sample.medium = reader->ReadUByte(); audioSample->sample.unk_bit26 = reader->ReadUByte(); - audioSample->sample.unk_bit25 = reader->ReadUByte(); + audioSample->sample.isRelocated = reader->ReadUByte(); audioSample->sample.size = reader->ReadUInt32(); - audioSample->audioSampleData.reserve(audioSample->sample.size); + audioSample->sample.sampleAddr = new uint8_t[audioSample->sample.size]; for (uint32_t i = 0; i < audioSample->sample.size; i++) { - audioSample->audioSampleData.push_back(reader->ReadUByte()); + audioSample->sample.sampleAddr[i] = reader->ReadUByte(); } - audioSample->sample.sampleAddr = audioSample->audioSampleData.data(); audioSample->loop.start = reader->ReadUInt32(); audioSample->loop.end = reader->ReadUInt32(); audioSample->loop.count = reader->ReadUInt32(); - audioSample->loopStateCount = reader->ReadUInt32(); + // This always seems to be 16. Can it be removed in V3? + uint32_t loopStateCount = reader->ReadUInt32(); for (int i = 0; i < 16; i++) { audioSample->loop.state[i] = 0; } - for (uint32_t i = 0; i < audioSample->loopStateCount; i++) { + for (uint32_t i = 0; i < loopStateCount; i++) { audioSample->loop.state[i] = reader->ReadInt16(); } audioSample->sample.loop = &audioSample->loop; audioSample->book.order = reader->ReadInt32(); audioSample->book.npredictors = reader->ReadInt32(); - audioSample->bookDataCount = reader->ReadUInt32(); + uint32_t bookDataCount = reader->ReadUInt32(); - audioSample->bookData.reserve(audioSample->bookDataCount); - for (uint32_t i = 0; i < audioSample->bookDataCount; i++) { - audioSample->bookData.push_back(reader->ReadInt16()); + audioSample->book.book = new int16_t[bookDataCount]; + + for (uint32_t i = 0; i < bookDataCount; i++) { + audioSample->book.book[i] = reader->ReadInt16(); } - audioSample->book.book = audioSample->bookData.data(); audioSample->sample.book = &audioSample->book; return audioSample; } -} // namespace SOH -/* -in ResourceMgr_LoadAudioSample we used to have --------------- - if (cachedCustomSFs.find(path) != cachedCustomSFs.end()) - return cachedCustomSFs[path]; - - SoundFontSample* cSample = ReadCustomSample(path); - - if (cSample != nullptr) - return cSample; --------------- -before the rest of the standard sample reading, this is the ReadCustomSample code we used to have - -extern "C" SoundFontSample* ReadCustomSample(const char* path) { - - if (!ExtensionCache.contains(path)) +std::shared_ptr +ResourceFactoryXMLAudioSampleV0::ReadResource(std::shared_ptr file, + std::shared_ptr initData) { + if (!FileHasValidFormatAndReader(file, initData)) { return nullptr; - - ExtensionEntry entry = ExtensionCache[path]; - - auto sampleRaw = Ship::Context::GetInstance()->GetResourceManager()->LoadFile(entry.path); - uint32_t* strem = (uint32_t*)sampleRaw->Buffer.get(); - uint8_t* strem2 = (uint8_t*)strem; - - SoundFontSample* sampleC = new SoundFontSample; - - if (entry.ext == "wav") { - drwav_uint32 channels; - drwav_uint32 sampleRate; - drwav_uint64 totalPcm; - drmp3_int16* pcmData = - drwav_open_memory_and_read_pcm_frames_s16(strem2, sampleRaw->BufferSize, &channels, &sampleRate, &totalPcm, -NULL); sampleC->size = totalPcm; sampleC->sampleAddr = (uint8_t*)pcmData; sampleC->codec = CODEC_S16; - - sampleC->loop = new AdpcmLoop; - sampleC->loop->start = 0; - sampleC->loop->end = sampleC->size - 1; - sampleC->loop->count = 0; - sampleC->sampleRateMagicValue = 'RIFF'; - sampleC->sampleRate = sampleRate; - - cachedCustomSFs[path] = sampleC; - return sampleC; - } else if (entry.ext == "mp3") { - drmp3_config mp3Info; - drmp3_uint64 totalPcm; - drmp3_int16* pcmData = - drmp3_open_memory_and_read_pcm_frames_s16(strem2, sampleRaw->BufferSize, &mp3Info, &totalPcm, NULL); - - sampleC->size = totalPcm * mp3Info.channels * sizeof(short); - sampleC->sampleAddr = (uint8_t*)pcmData; - sampleC->codec = CODEC_S16; - - sampleC->loop = new AdpcmLoop; - sampleC->loop->start = 0; - sampleC->loop->end = sampleC->size; - sampleC->loop->count = 0; - sampleC->sampleRateMagicValue = 'RIFF'; - sampleC->sampleRate = mp3Info.sampleRate; - - cachedCustomSFs[path] = sampleC; - return sampleC; } - return nullptr; + auto audioSample = std::make_shared(initData); + auto child = std::get>(file->Reader)->FirstChildElement(); + const char* customFormatStr = child->Attribute("CustomFormat"); + memset(&audioSample->sample, 0, sizeof(audioSample->sample)); + audioSample->sample.isRelocated = 0; + audioSample->sample.codec = CodecStrToInt(child->Attribute("Codec"), initData->Path.c_str()); + audioSample->sample.medium = + ResourceFactoryXMLSoundFontV0::MediumStrToInt(child->Attribute("Medium"), initData->Path.c_str()); + audioSample->sample.unk_bit26 = child->IntAttribute("bit26"); + + tinyxml2::XMLElement* loopRoot = child->FirstChildElement("ADPCMLoop"); + if (loopRoot != nullptr) { + size_t i = 0; + audioSample->loop.start = loopRoot->UnsignedAttribute("Start"); + audioSample->loop.end = loopRoot->UnsignedAttribute("End"); + audioSample->loop.count = loopRoot->UnsignedAttribute("Count"); + tinyxml2::XMLElement* predictor = loopRoot->FirstChildElement("Predictor"); + while (predictor != nullptr) { + audioSample->loop.state[i++] = predictor->IntAttribute("State"); + predictor = predictor->NextSiblingElement(); + } + } + + tinyxml2::XMLElement* bookRoot = child->FirstChildElement("ADPCMBook"); + if (bookRoot != nullptr) { + size_t i = 0; + audioSample->book.npredictors = bookRoot->IntAttribute("Npredictors"); + audioSample->book.order = bookRoot->IntAttribute("Order"); + tinyxml2::XMLElement* book = bookRoot->FirstChildElement("Book"); + size_t numBooks = audioSample->book.npredictors * audioSample->book.order * 8; + audioSample->book.book = new int16_t[numBooks]; + while (book != nullptr) { + audioSample->book.book[i++] = book->IntAttribute("Page"); + book = book->NextSiblingElement(); + } + audioSample->sample.book = &audioSample->book; + } + + audioSample->sample.loop = &audioSample->loop; + size_t size = child->Int64Attribute("Size"); + audioSample->sample.size = size; + + const char* path = child->Attribute("Path"); + + auto sampleFile = Ship::Context::GetInstance()->GetResourceManager()->GetArchiveManager()->LoadFile(path); + audioSample->sample.fileSize = sampleFile->Buffer.get()->size(); + if (customFormatStr != nullptr) { + // Compressed files can take a really long time to decode (~250ms per). + // This worked when we tested it (09/04/2024) (Works on my machine) + if (strcmp(customFormatStr, "wav") == 0) { + drwav wav; + drwav_uint64 numFrames; + + drwav_bool32 ret = + drwav_init_memory(&wav, sampleFile->Buffer.get()->data(), sampleFile->Buffer.get()->size(), nullptr); + + drwav_get_length_in_pcm_frames(&wav, &numFrames); + + audioSample->tuning = (wav.sampleRate * wav.channels) / 32000.0f; + audioSample->sample.sampleAddr = new uint8_t[numFrames * wav.channels * 2]; + + drwav_read_pcm_frames_s16(&wav, numFrames, (int16_t*)audioSample->sample.sampleAddr); + return audioSample; + } else if (strcmp(customFormatStr, "mp3") == 0) { + std::thread fileDecoderThread = std::thread(Mp3DecoderWorker, audioSample, sampleFile); + fileDecoderThread.detach(); + return audioSample; + } else if (strcmp(customFormatStr, "ogg") == 0) { + std::thread fileDecoderThread = std::thread(OggDecoderWorker, audioSample, sampleFile, initData); + fileDecoderThread.detach(); + return audioSample; + } else if (strcmp(customFormatStr, "flac") == 0) { + std::thread fileDecoderThread = std::thread(FlacDecoderWorker, audioSample, sampleFile); + fileDecoderThread.detach(); + return audioSample; + } + } + // Not a normal streamed sample. Fallback to the original ADPCM sample to be decoded by the audio engine. + audioSample->sample.sampleAddr = new uint8_t[size]; + // Can't use memcpy due to endianness issues. + for (uint32_t i = 0; i < size; i++) { + audioSample->sample.sampleAddr[i] = sampleFile->Buffer.get()->data()[i]; + } + + return audioSample; } -*/ +uint8_t ResourceFactoryXMLAudioSampleV0::CodecStrToInt(const char* str, const char* file) { + if (strcmp("ADPCM", str) == 0) { + return CODEC_ADPCM; + } else if (strcmp("S8", str) == 0) { + return CODEC_S8; + } else if (strcmp("S16MEM", str) == 0) { + return CODEC_S16_INMEMORY; + } else if (strcmp("ADPCMSMALL", str) == 0) { + return CODEC_SMALL_ADPCM; + } else if (strcmp("REVERB", str) == 0) { + return CODEC_REVERB; + } else if (strcmp("S16", str) == 0) { + return CODEC_S16; + } else { + char buff[2048]; + snprintf(buff, 2048, "Invalid codec in %s. Got %s, expected ADPCM, S8, S16MEM, ADPCMSMALL, REVERB, S16.", file, + str); + throw std::runtime_error(buff); + } +} +} // namespace SOH diff --git a/soh/soh/resource/importer/AudioSampleFactory.h b/soh/soh/resource/importer/AudioSampleFactory.h index 43b028fd2..b750da4f1 100644 --- a/soh/soh/resource/importer/AudioSampleFactory.h +++ b/soh/soh/resource/importer/AudioSampleFactory.h @@ -2,6 +2,7 @@ #include "Resource.h" #include "ResourceFactoryBinary.h" +#include "ResourceFactoryXML.h" namespace SOH { class ResourceFactoryBinaryAudioSampleV2 final : public Ship::ResourceFactoryBinary { @@ -9,4 +10,14 @@ class ResourceFactoryBinaryAudioSampleV2 final : public Ship::ResourceFactoryBin std::shared_ptr ReadResource(std::shared_ptr file, std::shared_ptr initData) override; }; + +class ResourceFactoryXMLAudioSampleV0 final : public Ship::ResourceFactoryXML { + public: + std::shared_ptr ReadResource(std::shared_ptr file, + std::shared_ptr initData) override; + + private: + static uint8_t CodecStrToInt(const char* str, const char* file); +}; + } // namespace SOH diff --git a/soh/soh/resource/importer/AudioSequenceFactory.cpp b/soh/soh/resource/importer/AudioSequenceFactory.cpp index 4a4a06265..850c27c16 100644 --- a/soh/soh/resource/importer/AudioSequenceFactory.cpp +++ b/soh/soh/resource/importer/AudioSequenceFactory.cpp @@ -1,6 +1,14 @@ #include "soh/resource/importer/AudioSequenceFactory.h" +#include "soh/resource/importer/AudioSoundFontFactory.h" #include "soh/resource/type/AudioSequence.h" #include "spdlog/spdlog.h" +#include "resource/ResourceManager.h" +#include + +#include "Context.h" +#include "resource/archive/Archive.h" +#include "BinaryWriter.h" +#include namespace SOH { std::shared_ptr @@ -13,12 +21,11 @@ ResourceFactoryBinaryAudioSequenceV2::ReadResource(std::shared_ptr f auto audioSequence = std::make_shared(initData); auto reader = std::get>(file->Reader); - audioSequence->sequence.seqDataSize = reader->ReadInt32(); - audioSequence->sequenceData.reserve(audioSequence->sequence.seqDataSize); + audioSequence->sequence.seqDataSize = reader->ReadUInt32(); + audioSequence->sequence.seqData = new char[audioSequence->sequence.seqDataSize]; for (int32_t i = 0; i < audioSequence->sequence.seqDataSize; i++) { - audioSequence->sequenceData.push_back(reader->ReadChar()); + audioSequence->sequence.seqData[i] = reader->ReadChar(); } - audioSequence->sequence.seqData = audioSequence->sequenceData.data(); audioSequence->sequence.seqNumber = reader->ReadUByte(); audioSequence->sequence.medium = reader->ReadUByte(); @@ -34,4 +41,355 @@ ResourceFactoryBinaryAudioSequenceV2::ReadResource(std::shared_ptr f return audioSequence; } -} // namespace SOH + +template static void WriteInsnOneArg(Ship::BinaryWriter* writer, uint8_t opcode, T arg) { + static_assert(std::is_fundamental::value); + writer->Write(opcode); + writer->Write(arg); +} + +template +static void WriteInsnTwoArg(Ship::BinaryWriter* writer, uint8_t opcode, T1 arg1, T2 arg2) { + static_assert(std::is_fundamental::value && std::is_fundamental::value); + writer->Write(opcode); + writer->Write(arg1); + writer->Write(arg2); +} + +template +static void WriteInsnThreeArg(Ship::BinaryWriter* writer, uint8_t opcode, T1 arg1, T2 arg2, T3 arg3) { + static_assert(std::is_fundamental::value && std::is_fundamental::value); + writer->Write(opcode); + writer->Write(arg1); + writer->Write(arg2); + writer->Write(arg3); +} + +static void WriteInsnNoArg(Ship::BinaryWriter* writer, uint8_t opcode) { + writer->Write(opcode); +} + +static void WriteLegato(Ship::BinaryWriter* writer) { + WriteInsnNoArg(writer, 0xC4); +} + +static void WriteNoLegato(Ship::BinaryWriter* writer) { + WriteInsnNoArg(writer, 0xC5); +} + +static void WriteMuteBhv(Ship::BinaryWriter* writer, uint8_t arg) { + WriteInsnOneArg(writer, 0xD3, arg); +} + +static void WriteMuteScale(Ship::BinaryWriter* writer, uint8_t arg) { + WriteInsnOneArg(writer, 0xD5, arg); +} + +static void WriteInitchan(Ship::BinaryWriter* writer, uint16_t channels) { + WriteInsnOneArg(writer, 0xD7, channels); +} + +static void WriteLdchan(Ship::BinaryWriter* writer, uint8_t channel, uint16_t offset) { + WriteInsnOneArg(writer, 0x90 | channel, offset); +} + +static void WriteVolSHeader(Ship::BinaryWriter* writer, uint8_t vol) { + WriteInsnOneArg(writer, 0xDB, vol); +} + +static void WriteVolCHeader(Ship::BinaryWriter* writer, uint8_t vol) { + WriteInsnOneArg(writer, 0xDF, vol); +} + +static void WriteTempo(Ship::BinaryWriter* writer, uint8_t tempo) { + WriteInsnOneArg(writer, 0xDD, tempo); +} + +static void WriteJump(Ship::BinaryWriter* writer, uint16_t offset) { + WriteInsnOneArg(writer, 0xFB, offset); +} + +static void WriteDisablecan(Ship::BinaryWriter* writer, uint16_t channels) { + WriteInsnOneArg(writer, 0xD6, channels); +} + +static void WriteNoshort(Ship::BinaryWriter* writer) { + WriteInsnNoArg(writer, 0xC4); +} + +static void WriteLdlayer(Ship::BinaryWriter* writer, uint8_t layer, uint16_t offset) { + WriteInsnOneArg(writer, 0x88 | layer, offset); +} + +static void WritePan(Ship::BinaryWriter* writer, uint8_t pan) { + WriteInsnOneArg(writer, 0xDD, pan); +} + +static void WriteBend(Ship::BinaryWriter* writer, uint8_t bend) { + WriteInsnOneArg(writer, 0xD3, bend); +} + +static void WriteInstrument(Ship::BinaryWriter* writer, uint8_t instrument) { + WriteInsnOneArg(writer, 0xC1, instrument); +} + +static void WriteTranspose(Ship::BinaryWriter* writer, int8_t transpose) { + WriteInsnOneArg(writer, 0xC2, transpose); +} + +static void WriteDelay(Ship::BinaryWriter* writer, uint16_t delay) { + if (delay > 0x7F) { + WriteInsnOneArg(writer, 0xFD, static_cast(delay | 0x8000)); + } else { + WriteInsnOneArg(writer, 0xFD, static_cast(delay)); + } +} + +template static void WriteLDelay(Ship::BinaryWriter* writer, T delay) { + WriteInsnOneArg(writer, 0xC0, delay); +} + +template static void WriteNotedv(Ship::BinaryWriter* writer, uint8_t note, T delay, uint8_t velocity) { + WriteInsnTwoArg(writer, note, delay, velocity); +} + +static void WriteNotedvg(Ship::BinaryWriter* writer, uint8_t note, uint16_t delay, uint8_t velocity, uint8_t gateTime) { + if (delay > 0x7F) { + WriteInsnThreeArg(writer, note, static_cast(delay | 0x8000), velocity, gateTime); + } else { + WriteInsnThreeArg(writer, note, static_cast(delay), velocity, gateTime); + } +} + +static void WriteMonoSingleSeq(Ship::BinaryWriter* writer, uint16_t delay, uint8_t tempo, bool looped) { + uint16_t channelStart; + uint16_t channelPlaceholderOff; + uint16_t loopPoint; + uint16_t layerPlaceholderOff; + uint16_t layerStart; + if (looped) { + delay = 0x7FFF; + } + // Write seq header + + // These two values are always the same in OOT and MM + WriteMuteBhv(writer, 0x20); + WriteMuteScale(writer, 0x32); + + // We only have one channel + WriteInitchan(writer, 0b11); + // Store the current position so we can write the address of the channel when we are ready. + channelPlaceholderOff = writer->GetBaseAddress(); + // Store the current position so we can loop here after the song ends. + loopPoint = writer->GetBaseAddress(); + WriteLdchan(writer, 0, 0); // Fill in the actual address later + + WriteVolSHeader(writer, 127); // Max volume + WriteTempo(writer, tempo); + + WriteDelay(writer, delay); + if (looped) { + WriteJump(writer, loopPoint); + } + WriteDisablecan(writer, 0b11); + writer->Write(static_cast(0xFF)); + + // Fill in the ldchan from before + channelStart = writer->GetBaseAddress(); + writer->Seek(channelPlaceholderOff, Ship::SeekOffsetType::Start); + WriteLdchan(writer, 0, channelStart); + writer->Seek(channelStart, Ship::SeekOffsetType::Start); + + // Channel header + layerPlaceholderOff = writer->GetBaseAddress(); + WriteNoshort(writer); + WriteLdlayer(writer, 0, 0); + WritePan(writer, 64); + WriteVolCHeader(writer, 127); // Max volume + WriteBend(writer, 0); + WriteInstrument(writer, 0); + WriteDelay(writer, delay); + writer->Write(static_cast(0xFF)); + + layerStart = writer->GetBaseAddress(); + writer->Seek(layerPlaceholderOff, Ship::SeekOffsetType::Start); + WriteLdlayer(writer, 0, layerStart); + writer->Seek(layerStart, Ship::SeekOffsetType::Start); + + // Note layer + WriteLegato(writer); + WriteNotedvg(writer, 39, 0x7FFF - 1, static_cast(0x7F), static_cast(1)); + writer->Write(static_cast(0xFF)); +} + +static void WriteStereoSingleSeq(Ship::BinaryWriter* writer, uint16_t delay, uint8_t tempo, bool looped) { + uint16_t lChannelStart; + uint16_t rChannelStart; + uint16_t channelPlaceholderOff; + uint16_t loopPoint; + uint16_t lLayerPlaceholderOff; + uint16_t rLayerPlaceholderOff; + uint16_t lLayerOffset; + uint16_t rLayerOffset; + + uint16_t layerStart; + // Write seq header + if (looped) { + delay = 0x7FFF; + } + // These two values are always the same in OOT and MM + WriteMuteBhv(writer, 0x20); + WriteMuteScale(writer, 0x32); + + // We only have one channel + WriteInitchan(writer, 0b11); + // Store the current position so we can write the address of the channel when we are ready. + channelPlaceholderOff = writer->GetBaseAddress(); + // Store the current position so we can loop here after the song ends. + loopPoint = writer->GetBaseAddress(); + // Left note channel + WriteLdchan(writer, 0, 0); // Fill in the actual address later + // Right note channel + WriteLdchan(writer, 1, 0); // Fill in the actual address later + + WriteVolSHeader(writer, 127); // Max volume + WriteTempo(writer, tempo); + + WriteDelay(writer, delay); + if (looped) { + WriteJump(writer, loopPoint); + } + WriteDisablecan(writer, 0b11); + writer->Write(static_cast(0xFF)); + + lChannelStart = writer->GetBaseAddress(); + // Left Channel header + WriteNoshort(writer); + lLayerPlaceholderOff = writer->GetBaseAddress(); + WriteLdlayer(writer, 0, 0); + WritePan(writer, 0); + WriteVolCHeader(writer, 127); // Max volume + WriteBend(writer, 0); + WriteInstrument(writer, 0); + WriteDelay(writer, delay); + writer->Write(static_cast(0xFF)); + + rChannelStart = writer->GetBaseAddress(); + // Right Channel header + WriteNoshort(writer); + rLayerPlaceholderOff = writer->GetBaseAddress(); + WriteLdlayer(writer, 1, 0); + WritePan(writer, 127); + WriteVolCHeader(writer, 127); // Max volume + WriteBend(writer, 0); + WriteInstrument(writer, 1); + WriteDelay(writer, delay); + writer->Write(static_cast(0xFF)); + uint16_t placeHolder = writer->GetBaseAddress(); + writer->Seek(channelPlaceholderOff, Ship::SeekOffsetType::Start); + WriteLdchan(writer, 0, lChannelStart); + WriteLdchan(writer, 1, rChannelStart); + writer->Seek(placeHolder, Ship::SeekOffsetType::Start); + + // Left Note layer + lLayerOffset = writer->GetBaseAddress(); + WriteLegato(writer); + WriteNotedvg(writer, 39, 0x7FFF - 1, static_cast(0x7F), static_cast(1)); + writer->Write(static_cast(0xFF)); + + // Right Note layer + rLayerOffset = writer->GetBaseAddress(); + WriteLegato(writer); + WriteNotedvg(writer, 39, 0x7FFF - 1, static_cast(0x7F), static_cast(1)); + writer->Write(static_cast(0xFF)); + + writer->Seek(lLayerPlaceholderOff, Ship::SeekOffsetType::Start); + WriteLdlayer(writer, 0, lLayerOffset); + writer->Seek(rLayerPlaceholderOff, Ship::SeekOffsetType::Start); + WriteLdlayer(writer, 1, rLayerOffset); +} + +std::shared_ptr +ResourceFactoryXMLAudioSequenceV0::ReadResource(std::shared_ptr file, + std::shared_ptr initData) { + if (!FileHasValidFormatAndReader(file, initData)) { + return nullptr; + } + + auto sequence = std::make_shared(initData); + auto child = std::get>(file->Reader)->FirstChildElement(); + unsigned int i = 0; + + sequence->sequence.medium = + ResourceFactoryXMLSoundFontV0::MediumStrToInt(child->Attribute("Medium"), initData->Path.c_str()); + sequence->sequence.cachePolicy = + ResourceFactoryXMLSoundFontV0::CachePolicyToInt(child->Attribute("CachePolicy"), initData->Path.c_str()); + sequence->sequence.seqDataSize = child->IntAttribute("Size"); + sequence->sequence.seqNumber = child->IntAttribute("Index"); + bool streamed = child->BoolAttribute("Streamed"); + + memset(sequence->sequence.fonts, 0, sizeof(sequence->sequence.fonts)); + + tinyxml2::XMLElement* fontsElement = child->FirstChildElement(); + tinyxml2::XMLElement* fontElement = fontsElement->FirstChildElement(); + while (fontElement != nullptr) { + sequence->sequence.fonts[i] = fontElement->IntAttribute("FontIdx"); + fontElement = fontElement->NextSiblingElement(); + i++; + } + sequence->sequence.numFonts = i; + + const char* path = child->Attribute("Path"); + std::shared_ptr seqFile; + if (path != nullptr) { + seqFile = Ship::Context::GetInstance()->GetResourceManager()->GetArchiveManager()->LoadFile(path); + } + + if (!streamed) { + sequence->sequence.seqDataSize = seqFile->Buffer.get()->size(); + sequence->sequence.seqData = new char[seqFile->Buffer.get()->size()]; + memcpy(sequence->sequence.seqData, seqFile->Buffer.get()->data(), seqFile->Buffer.get()->size()); + } else { + // setting numFonts to -1 tells the game's audio engine the sound font to used is CRC64 encoded in the font + // indicies. + sequence->sequence.numFonts = -1; + if (path != nullptr) { + sequence->sequence.seqDataSize = seqFile->Buffer.get()->size(); + sequence->sequence.seqData = new char[seqFile->Buffer.get()->size()]; + memcpy(sequence->sequence.seqData, seqFile->Buffer.get()->data(), seqFile->Buffer.get()->size()); + } else { + unsigned int length = child->UnsignedAttribute("Length"); + bool looped = child->BoolAttribute("Looped", true); + bool stereo = child->BoolAttribute("Stereo", false); + Ship::BinaryWriter writer = Ship::BinaryWriter(); + writer.SetEndianness(Ship::Endianness::Big); + + // 1 second worth of ticks can be found by using `ticks = 60 / (bpm * 48)` + // Get the number of ticks per second and then divide the length by this number to get the number of ticks + // for the song. + constexpr uint8_t TEMPO = 1; + constexpr float TEMPO_F = TEMPO; + // Use floats for this first calculation so we can round up + float delayF = length / (60.0f / (TEMPO_F * 48.0f)); + // Convert to u16. This way this value is encoded changes depending on the value. + // It can be at most 0xFFFF so store it in a u16 for now. + uint16_t delay; + if (delayF >= 65535.0f) { + delay = 0x7FFF; + } else { + delay = delayF; + } + if (stereo) { + WriteStereoSingleSeq(&writer, delay, TEMPO, looped); + } else { + WriteMonoSingleSeq(&writer, delay, TEMPO, looped); + } + sequence->sequence.seqDataSize = writer.ToVector().size(); + sequence->sequence.seqData = new char[sequence->sequence.seqDataSize]; + memcpy(sequence->sequence.seqData, writer.ToVector().data(), sequence->sequence.seqDataSize); + } + } + + return sequence; +} +} // namespace SOH \ No newline at end of file diff --git a/soh/soh/resource/importer/AudioSequenceFactory.h b/soh/soh/resource/importer/AudioSequenceFactory.h index 5ae4ed946..4ae249ec3 100644 --- a/soh/soh/resource/importer/AudioSequenceFactory.h +++ b/soh/soh/resource/importer/AudioSequenceFactory.h @@ -2,6 +2,7 @@ #include "Resource.h" #include "ResourceFactoryBinary.h" +#include "ResourceFactoryXML.h" namespace SOH { class ResourceFactoryBinaryAudioSequenceV2 final : public Ship::ResourceFactoryBinary { @@ -9,4 +10,11 @@ class ResourceFactoryBinaryAudioSequenceV2 final : public Ship::ResourceFactoryB std::shared_ptr ReadResource(std::shared_ptr file, std::shared_ptr initData) override; }; + +class ResourceFactoryXMLAudioSequenceV0 final : public Ship::ResourceFactoryXML { + public: + std::shared_ptr ReadResource(std::shared_ptr file, + std::shared_ptr initData) override; +}; + } // namespace SOH diff --git a/soh/soh/resource/importer/AudioSoundFontFactory.cpp b/soh/soh/resource/importer/AudioSoundFontFactory.cpp index 99f160860..1150b2b69 100644 --- a/soh/soh/resource/importer/AudioSoundFontFactory.cpp +++ b/soh/soh/resource/importer/AudioSoundFontFactory.cpp @@ -1,7 +1,11 @@ #include "soh/resource/importer/AudioSoundFontFactory.h" #include "soh/resource/type/AudioSoundFont.h" -#include "spdlog/spdlog.h" -#include "libultraship/libultraship.h" +#include +#include +#include "z64audio.h" +#include "Context.h" +#include "resource/archive/Archive.h" +#include "resource/ResourceManager.h" namespace SOH { std::shared_ptr @@ -35,117 +39,115 @@ ResourceFactoryBinaryAudioSoundFontV2::ReadResource(std::shared_ptr audioSoundFont->soundFont.numSfx = soundEffectCount; // πŸ₯ DRUMS πŸ₯ - audioSoundFont->drums.reserve(audioSoundFont->soundFont.numDrums); + // audioSoundFont->drums.reserve(audioSoundFont->soundFont.numDrums); audioSoundFont->drumAddresses.reserve(audioSoundFont->soundFont.numDrums); for (uint32_t i = 0; i < audioSoundFont->soundFont.numDrums; i++) { - Drum drum; - drum.releaseRate = reader->ReadUByte(); - drum.pan = reader->ReadUByte(); - drum.loaded = reader->ReadUByte(); - drum.loaded = 0; // this was always getting set to zero in ResourceMgr_LoadAudioSoundFont + Drum* drum = new Drum; + drum->releaseRate = reader->ReadUByte(); + drum->pan = reader->ReadUByte(); + drum->loaded = reader->ReadUByte(); + drum->loaded = 0; // this was always getting set to zero in ResourceMgr_LoadAudioSoundFontByName uint32_t envelopeCount = reader->ReadUInt32(); - audioSoundFont->drumEnvelopeCounts.push_back(envelopeCount); - std::vector drumEnvelopes; - drumEnvelopes.reserve(audioSoundFont->drumEnvelopeCounts[i]); - for (uint32_t j = 0; j < audioSoundFont->drumEnvelopeCounts.back(); j++) { - AdsrEnvelope env; - + drum->envelope = new AdsrEnvelope[envelopeCount]; + for (uint32_t j = 0; j < envelopeCount; j++) { int16_t delay = reader->ReadInt16(); int16_t arg = reader->ReadInt16(); - env.delay = BE16SWAP(delay); - env.arg = BE16SWAP(arg); - - drumEnvelopes.push_back(env); + drum->envelope[j].delay = BE16SWAP(delay); + drum->envelope[j].arg = BE16SWAP(arg); } - audioSoundFont->drumEnvelopeArrays.push_back(drumEnvelopes); - drum.envelope = audioSoundFont->drumEnvelopeArrays.back().data(); bool hasSample = reader->ReadInt8(); std::string sampleFileName = reader->ReadString(); - drum.sound.tuning = reader->ReadFloat(); + drum->sound.tuning = reader->ReadFloat(); if (sampleFileName.empty()) { - drum.sound.sample = nullptr; + drum->sound.sample = nullptr; } else { auto res = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(sampleFileName.c_str()); - drum.sound.sample = static_cast(res ? res->GetRawPointer() : nullptr); + drum->sound.sample = static_cast(res ? res->GetRawPointer() : nullptr); } - audioSoundFont->drums.push_back(drum); - audioSoundFont->drumAddresses.push_back(&audioSoundFont->drums.back()); + // audioSoundFont->drums.push_back(drum); + // BENTODO clean this up in V3. + if (drum->sound.sample == nullptr) { + delete[] drum->envelope; + delete drum; + audioSoundFont->drumAddresses.push_back(nullptr); + } else { + audioSoundFont->drumAddresses.push_back(drum); + } } audioSoundFont->soundFont.drums = audioSoundFont->drumAddresses.data(); // 🎺🎻🎷🎸🎹 INSTRUMENTS 🎹🎸🎷🎻🎺 - audioSoundFont->instruments.reserve(audioSoundFont->soundFont.numInstruments); for (uint32_t i = 0; i < audioSoundFont->soundFont.numInstruments; i++) { - Instrument instrument; + Instrument* instrument = new Instrument; uint8_t isValidEntry = reader->ReadUByte(); - instrument.loaded = reader->ReadUByte(); - instrument.loaded = 0; // this was always getting set to zero in ResourceMgr_LoadAudioSoundFont + instrument->loaded = reader->ReadUByte(); + instrument->loaded = 0; // this was always getting set to zero in ResourceMgr_LoadAudioSoundFontByName - instrument.normalRangeLo = reader->ReadUByte(); - instrument.normalRangeHi = reader->ReadUByte(); - instrument.releaseRate = reader->ReadUByte(); + instrument->normalRangeLo = reader->ReadUByte(); + instrument->normalRangeHi = reader->ReadUByte(); + instrument->releaseRate = reader->ReadUByte(); uint32_t envelopeCount = reader->ReadInt32(); - audioSoundFont->instrumentEnvelopeCounts.push_back(envelopeCount); - std::vector instrumentEnvelopes; - for (uint32_t j = 0; j < audioSoundFont->instrumentEnvelopeCounts.back(); j++) { - AdsrEnvelope env; + instrument->envelope = new AdsrEnvelope[envelopeCount]; + for (uint32_t j = 0; j < envelopeCount; j++) { int16_t delay = reader->ReadInt16(); int16_t arg = reader->ReadInt16(); - env.delay = BE16SWAP(delay); - env.arg = BE16SWAP(arg); - - instrumentEnvelopes.push_back(env); + instrument->envelope[j].delay = BE16SWAP(delay); + instrument->envelope[j].arg = BE16SWAP(arg); } - audioSoundFont->instrumentEnvelopeArrays.push_back(instrumentEnvelopes); - instrument.envelope = audioSoundFont->instrumentEnvelopeArrays.back().data(); bool hasLowNoteSoundFontEntry = reader->ReadInt8(); if (hasLowNoteSoundFontEntry) { bool hasSampleRef = reader->ReadInt8(); std::string sampleFileName = reader->ReadString(); - instrument.lowNotesSound.tuning = reader->ReadFloat(); + instrument->lowNotesSound.tuning = reader->ReadFloat(); auto res = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(sampleFileName.c_str()); - instrument.lowNotesSound.sample = static_cast(res ? res->GetRawPointer() : nullptr); + instrument->lowNotesSound.sample = static_cast(res ? res->GetRawPointer() : nullptr); } else { - instrument.lowNotesSound.sample = nullptr; - instrument.lowNotesSound.tuning = 0; + instrument->lowNotesSound.sample = nullptr; + instrument->lowNotesSound.tuning = 0; } bool hasNormalNoteSoundFontEntry = reader->ReadInt8(); if (hasNormalNoteSoundFontEntry) { + // BENTODO remove in V3 bool hasSampleRef = reader->ReadInt8(); std::string sampleFileName = reader->ReadString(); - instrument.normalNotesSound.tuning = reader->ReadFloat(); + instrument->normalNotesSound.tuning = reader->ReadFloat(); auto res = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(sampleFileName.c_str()); - instrument.normalNotesSound.sample = static_cast(res ? res->GetRawPointer() : nullptr); + instrument->normalNotesSound.sample = static_cast(res ? res->GetRawPointer() : nullptr); } else { - instrument.normalNotesSound.sample = nullptr; - instrument.normalNotesSound.tuning = 0; + instrument->normalNotesSound.sample = nullptr; + instrument->normalNotesSound.tuning = 0; } bool hasHighNoteSoundFontEntry = reader->ReadInt8(); if (hasHighNoteSoundFontEntry) { bool hasSampleRef = reader->ReadInt8(); std::string sampleFileName = reader->ReadString(); - instrument.highNotesSound.tuning = reader->ReadFloat(); + instrument->highNotesSound.tuning = reader->ReadFloat(); auto res = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(sampleFileName.c_str()); - instrument.highNotesSound.sample = static_cast(res ? res->GetRawPointer() : nullptr); + instrument->highNotesSound.sample = static_cast(res ? res->GetRawPointer() : nullptr); } else { - instrument.highNotesSound.sample = nullptr; - instrument.highNotesSound.tuning = 0; + instrument->highNotesSound.sample = nullptr; + instrument->highNotesSound.tuning = 0; } - audioSoundFont->instruments.push_back(instrument); - audioSoundFont->instrumentAddresses.push_back(isValidEntry ? &audioSoundFont->instruments.back() : nullptr); + if (isValidEntry) { + audioSoundFont->instrumentAddresses.push_back(instrument); + } else { + delete[] instrument->envelope; + delete instrument; + audioSoundFont->instrumentAddresses.push_back(nullptr); + } } audioSoundFont->soundFont.instruments = audioSoundFont->instrumentAddresses.data(); @@ -169,4 +171,302 @@ ResourceFactoryBinaryAudioSoundFontV2::ReadResource(std::shared_ptr return audioSoundFont; } + +int8_t ResourceFactoryXMLSoundFontV0::MediumStrToInt(const char* str, const char* file) { + if (!strcmp("Ram", str)) { + return MEDIUM_RAM; + } else if (!strcmp("Unk", str)) { + return MEDIUM_UNK; + } else if (!strcmp("Cart", str)) { + return MEDIUM_CART; + } else if (!strcmp("Disk", str)) { + return MEDIUM_DISK_DRIVE; + // 4 is skipped + } else { + char buff[2048]; + snprintf(buff, 2048, "Bad medium value in %s. Got %s, expected Ram, Unk, Cart, or Disk.", file, str); + throw std::runtime_error(buff); + } +} + +int8_t ResourceFactoryXMLSoundFontV0::CachePolicyToInt(const char* str, const char* file) { + if (!strcmp("Temporary", str)) { + return CACHE_TEMPORARY; + } else if (!strcmp("Persistent", str)) { + return CACHE_PERSISTENT; + } else if (!strcmp("Either", str)) { + return CACHE_EITHER; + } else if (!strcmp("Permanent", str)) { + return CACHE_PERMANENT; + } else { + char buff[2048]; + snprintf(buff, 2048, + "Bad cache policy value in %s. Got %s, expected Temporary, Persistent, Either, or Permanent.", file, + str); + throw std::runtime_error(buff); + } +} + +void ResourceFactoryXMLSoundFontV0::ParseDrums(AudioSoundFont* soundFont, tinyxml2::XMLElement* element) { + element = element->FirstChildElement(); + // No drums + if (element == nullptr) { + soundFont->soundFont.drums = nullptr; + soundFont->soundFont.numDrums = 0; + return; + } + + do { + int patch = element->IntAttribute("Patches", -1); + Drum* drum; + if (patch != -1) { + drum = soundFont->drumAddresses[patch]; + } else { + drum = new Drum; + } + std::vector envelopes; + drum->releaseRate = element->IntAttribute("ReleaseRate"); + drum->pan = element->IntAttribute("Pan"); + drum->loaded = element->IntAttribute("Loaded"); + drum->sound.tuning = element->FloatAttribute("Tuning"); + const char* sampleStr = element->Attribute("SampleRef"); + + if (sampleStr != nullptr && sampleStr[0] != 0) { + auto res = Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(sampleStr); + drum->sound.sample = static_cast(res ? res->GetRawPointer() : nullptr); + } else { + drum->sound.sample = nullptr; + } + + element = element->FirstChildElement(); + if (!strcmp(element->Name(), "Envelopes")) { + // element = (tinyxml2::XMLElement*)element->FirstChildElement(); + unsigned int envCount = 0; + envelopes = ParseEnvelopes(soundFont, element, &envCount); + element = (tinyxml2::XMLElement*)element->Parent(); + soundFont->drumEnvelopeArrays.push_back(envelopes); + // If we are applying a patch the envelopes are already allocated + // TODO revert this if we enable editing envelopes in a patch + if (patch == -1) { + drum->envelope = new AdsrEnvelope[envelopes.size()]; + } + memcpy(drum->envelope, envelopes.data(), envelopes.size() * sizeof(AdsrEnvelope)); + } else { + drum->envelope = nullptr; + } + + if (drum->sound.sample == nullptr) { + soundFont->drumAddresses.push_back(nullptr); + } else { + soundFont->drumAddresses.push_back(drum); + } + + element = element->NextSiblingElement(); + } while (element != nullptr); + + soundFont->soundFont.numDrums = soundFont->drumAddresses.size(); + soundFont->soundFont.drums = soundFont->drumAddresses.data(); +} + +void ResourceFactoryXMLSoundFontV0::ParseInstruments(AudioSoundFont* soundFont, tinyxml2::XMLElement* element) { + element = element->FirstChildElement(); + if (element == nullptr) { + return; + } + do { + int patch = element->IntAttribute("Patches", -1); + Instrument* instrument; + // Same as drums, if applying a patch, don't re-allocate and clear. + if (patch != -1) { + instrument = soundFont->instrumentAddresses[patch]; + } else { + instrument = new Instrument; + memset(instrument, 0, sizeof(Instrument)); + } + unsigned int envCount = 0; + std::vector envelopes; + + int isValid = element->BoolAttribute("IsValid"); + instrument->loaded = element->IntAttribute("Loaded"); + instrument->normalRangeLo = element->IntAttribute("NormalRangeLo"); + instrument->normalRangeHi = element->IntAttribute("NormalRangeHi"); + instrument->releaseRate = element->IntAttribute("ReleaseRate"); + tinyxml2::XMLElement* instrumentElement = element->FirstChildElement(); + tinyxml2::XMLElement* instrumentElementCopy = instrumentElement; + + if (instrumentElement != nullptr && !strcmp(instrumentElement->Name(), "Envelopes")) { + envelopes = ParseEnvelopes(soundFont, instrumentElement, &envCount); + if (patch == -1) { + instrument->envelope = new AdsrEnvelope[envelopes.size()]; + } + memcpy(instrument->envelope, envelopes.data(), envelopes.size() * sizeof(AdsrEnvelope)); + instrumentElement = instrumentElement->NextSiblingElement(); + } + + if (instrumentElement != nullptr && !strcmp("LowNotesSound", instrumentElement->Name())) { + instrument->lowNotesSound.tuning = instrumentElement->FloatAttribute("Tuning"); + const char* sampleStr = instrumentElement->Attribute("SampleRef"); + if (sampleStr != nullptr && sampleStr[0] != 0) { + std::shared_ptr res = static_pointer_cast( + Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(sampleStr)); + if (res->tuning != -1.0f) { + instrument->lowNotesSound.tuning = res->tuning; + } + instrument->lowNotesSound.sample = static_cast(res ? res->GetRawPointer() : nullptr); + } + instrumentElement = instrumentElement->NextSiblingElement(); + } + + if (instrumentElement != nullptr && !strcmp("NormalNotesSound", instrumentElement->Name())) { + instrument->normalNotesSound.tuning = instrumentElement->FloatAttribute("Tuning"); + const char* sampleStr = instrumentElement->Attribute("SampleRef"); + if (sampleStr != nullptr && sampleStr[0] != 0) { + std::shared_ptr res = static_pointer_cast( + Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(sampleStr)); + if (res->tuning != -1.0f) { + instrument->normalNotesSound.tuning = res->tuning; + } + instrument->normalNotesSound.sample = static_cast(res ? res->GetRawPointer() : nullptr); + } + instrumentElement = instrumentElement->NextSiblingElement(); + } + + if (instrumentElement != nullptr && !strcmp("HighNotesSound", instrumentElement->Name())) { + instrument->highNotesSound.tuning = instrumentElement->FloatAttribute("Tuning"); + const char* sampleStr = instrumentElement->Attribute("SampleRef"); + if (sampleStr != nullptr && sampleStr[0] != 0) { + std::shared_ptr res = static_pointer_cast( + Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(sampleStr)); + if (res->tuning != -1.0f) { + instrument->highNotesSound.tuning = res->tuning; + } + instrument->highNotesSound.sample = static_cast(res ? res->GetRawPointer() : nullptr); + } + instrumentElement = instrumentElement->NextSiblingElement(); + } + // Don't add it to the list if applying a patch + if (patch == -1) { + soundFont->instrumentAddresses.push_back(instrument); + } + element = instrumentElementCopy; + element = (tinyxml2::XMLElement*)element->Parent(); + element = element->NextSiblingElement(); + } while (element != nullptr); + + soundFont->soundFont.instruments = soundFont->instrumentAddresses.data(); + soundFont->soundFont.numInstruments = soundFont->instrumentAddresses.size(); +} + +void ResourceFactoryXMLSoundFontV0::ParseSfxTable(AudioSoundFont* soundFont, tinyxml2::XMLElement* element) { + size_t count = element->IntAttribute("Count"); + + element = element->FirstChildElement(); + + while (element != nullptr) { + int patch = element->IntAttribute("Patches", -1); + + SoundFontSound sound = {}; + + const char* sampleStr = element->Attribute("SampleRef"); + // Insert an empty sound effect. The game assumes the empty slots are + // filled so we can't just skip them + if (sampleStr == nullptr) + goto skip; + + sound.tuning = element->FloatAttribute("Tuning"); + if (sampleStr[0] != 0) { + auto res = static_pointer_cast( + Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(sampleStr)); + if (res->tuning != -1.0f) { + sound.tuning = res->tuning; + } + sound.sample = static_cast(res ? res->GetRawPointer() : nullptr); + } + skip: + element = element->NextSiblingElement(); + if (patch != -1) { + soundFont->soundEffects[patch] = sound; + } else { + soundFont->soundEffects.push_back(sound); + } + } + soundFont->soundFont.soundEffects = soundFont->soundEffects.data(); + soundFont->soundFont.numSfx = soundFont->soundEffects.size(); +} + +std::vector SOH::ResourceFactoryXMLSoundFontV0::ParseEnvelopes(AudioSoundFont* soundFont, + tinyxml2::XMLElement* element, + unsigned int* count) { + std::vector envelopes; + unsigned int total = 0; + element = element->FirstChildElement("Envelope"); + while (element != nullptr) { + AdsrEnvelope env = { + .delay = (s16)element->IntAttribute("Delay"), + .arg = (s16)element->IntAttribute("Arg"), + }; + env.delay = BSWAP16(env.delay); + env.arg = BSWAP16(env.arg); + envelopes.emplace_back(env); + element = element->NextSiblingElement("Envelope"); + total++; + } + *count = total; + return envelopes; +} + +std::shared_ptr +ResourceFactoryXMLSoundFontV0::ReadResource(std::shared_ptr file, + std::shared_ptr initData) { + if (!FileHasValidFormatAndReader(file, initData)) { + return nullptr; + } + + auto child = std::get>(file->Reader)->FirstChildElement(); + const char* patch = child->Attribute("Patches"); + std::shared_ptr sf; + std::shared_ptr audioSoundFont; + // If we are patching an existing SF, load the original, otherwise create and clear a new one. + if (patch != nullptr) { + std::string origName = "audio/fonts/"; + origName += patch; + audioSoundFont = dynamic_pointer_cast( + Ship::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(origName)); + } else { + audioSoundFont = std::make_shared(initData); + memset(&audioSoundFont->soundFont, 0, sizeof(audioSoundFont->soundFont)); + } + // Header data + audioSoundFont->soundFont.fntIndex = child->IntAttribute("Num", 0); + + const char* mediumStr = child->Attribute("Medium"); + audioSoundFont->medium = MediumStrToInt(mediumStr, initData->Path.c_str()); + + const char* cachePolicyStr = child->Attribute("CachePolicy"); + audioSoundFont->cachePolicy = CachePolicyToInt(cachePolicyStr, initData->Path.c_str()); + + audioSoundFont->data1 = child->IntAttribute("Data1"); + audioSoundFont->data2 = child->IntAttribute("Data2"); + audioSoundFont->data3 = child->IntAttribute("Data3"); + + audioSoundFont->soundFont.sampleBankId1 = audioSoundFont->data1 >> 8; + audioSoundFont->soundFont.sampleBankId2 = audioSoundFont->data1 & 0xFF; + + child = (tinyxml2::XMLElement*)child->FirstChildElement(); + + while (child != nullptr) { + const char* name = child->Name(); + + if (!strcmp(name, "Drums")) { + ParseDrums(audioSoundFont.get(), child); + } else if (!strcmp(name, "Instruments")) { + ParseInstruments(audioSoundFont.get(), child); + } else if (!strcmp(name, "SfxTable")) { + ParseSfxTable(audioSoundFont.get(), child); + } + child = child->NextSiblingElement(); + } + return audioSoundFont; +} + } // namespace SOH diff --git a/soh/soh/resource/importer/AudioSoundFontFactory.h b/soh/soh/resource/importer/AudioSoundFontFactory.h index b978a14bf..0a56769cd 100644 --- a/soh/soh/resource/importer/AudioSoundFontFactory.h +++ b/soh/soh/resource/importer/AudioSoundFontFactory.h @@ -2,6 +2,8 @@ #include "Resource.h" #include "ResourceFactoryBinary.h" +#include "ResourceFactoryXML.h" +#include "soh/resource/type/AudioSoundFont.h" namespace SOH { class ResourceFactoryBinaryAudioSoundFontV2 final : public Ship::ResourceFactoryBinary { @@ -9,4 +11,20 @@ class ResourceFactoryBinaryAudioSoundFontV2 final : public Ship::ResourceFactory std::shared_ptr ReadResource(std::shared_ptr file, std::shared_ptr initData) override; }; + +class ResourceFactoryXMLSoundFontV0 final : public Ship::ResourceFactoryXML { + public: + std::shared_ptr ReadResource(std::shared_ptr file, + std::shared_ptr initData) override; + static int8_t MediumStrToInt(const char* str, const char* file); + static int8_t CachePolicyToInt(const char* str, const char* file); + + private: + void ParseDrums(AudioSoundFont* soundFont, tinyxml2::XMLElement* element); + void ParseInstruments(AudioSoundFont* soundFont, tinyxml2::XMLElement* element); + void ParseSfxTable(AudioSoundFont* soundFont, tinyxml2::XMLElement* element); + std::vector ParseEnvelopes(AudioSoundFont* soundFont, tinyxml2::XMLElement* element, + unsigned int* count); +}; + } // namespace SOH diff --git a/soh/soh/resource/type/AudioSample.cpp b/soh/soh/resource/type/AudioSample.cpp index 288765822..b4a539757 100644 --- a/soh/soh/resource/type/AudioSample.cpp +++ b/soh/soh/resource/type/AudioSample.cpp @@ -1,6 +1,14 @@ #include "AudioSample.h" namespace SOH { +AudioSample::~AudioSample() { + if (sample.book != nullptr && sample.book->book != nullptr) { + delete[] sample.book->book; + } + if (sample.sampleAddr != nullptr) { + delete[] sample.sampleAddr; + } +} Sample* AudioSample::GetPointer() { return &sample; } diff --git a/soh/soh/resource/type/AudioSample.h b/soh/soh/resource/type/AudioSample.h index b64880801..84e623781 100644 --- a/soh/soh/resource/type/AudioSample.h +++ b/soh/soh/resource/type/AudioSample.h @@ -1,14 +1,13 @@ #pragma once #include -#include #include "Resource.h" #include namespace SOH { typedef struct { - /* 0x00 */ uintptr_t start; - /* 0x04 */ uintptr_t end; + /* 0x00 */ u32 start; + /* 0x04 */ u32 end; /* 0x08 */ u32 count; /* 0x0C */ char unk_0C[0x4]; /* 0x10 */ s16 state[16]; // only exists if count != 0. 8-byte aligned @@ -20,24 +19,26 @@ typedef struct { /* 0x08 */ s16* book; // size 8 * order * npredictors. 8-byte aligned } AdpcmBook; // s -typedef struct { +typedef struct Sample { union { struct { - /* 0x00 */ u32 codec : 4; - /* 0x00 */ u32 medium : 2; - /* 0x00 */ u32 unk_bit26 : 1; - /* 0x00 */ u32 unk_bit25 : 1; // this has been named isRelocated in zret - /* 0x01 */ u32 size : 24; + ///* 0x0 */ u32 unk_0 : 1; + /* 0x0 */ u32 codec : 4; // The state of compression or decompression, See `SampleCodec` + /* 0x0 */ u32 medium : 2; // Medium where sample is currently stored. See `SampleMedium` + /* 0x0 */ u32 unk_bit26 : 1; + /* 0x0 */ u32 isRelocated : 1; // Has the sample header been relocated (offsets to pointers) }; u32 asU32; }; - - /* 0x04 */ u8* sampleAddr; - /* 0x08 */ AdpcmLoop* loop; - /* 0x0C */ AdpcmBook* book; - u32 sampleRateMagicValue; // For wav samples only... - s32 sampleRate; // For wav samples only... -} Sample; // size = 0x10 + /* 0x1 */ u32 size; // Size of the sample + u32 fileSize; + /* 0x4 */ u8* sampleAddr; // Raw sample data. Offset from the start of the sample bank or absolute address to either + // rom or ram + /* 0x8 */ AdpcmLoop* + loop; // Adpcm loop parameters used by the sample. Offset from the start of the sound font / pointer to ram + /* 0xC */ AdpcmBook* + book; // Adpcm book parameters used by the sample. Offset from the start of the sound font / pointer to ram +} Sample; // size = 0x10 class AudioSample : public Ship::Resource { public: @@ -45,18 +46,15 @@ class AudioSample : public Ship::Resource { AudioSample() : Resource(std::shared_ptr()) { } + ~AudioSample(); Sample* GetPointer(); size_t GetPointerSize(); Sample sample; - std::vector audioSampleData; - AdpcmLoop loop; - uint32_t loopStateCount; - AdpcmBook book; - uint32_t bookDataCount; - std::vector bookData; + // Only applies to streamed audio + float tuning = -1.0f; }; -}; // namespace SOH +}; // namespace SOH \ No newline at end of file diff --git a/soh/soh/resource/type/AudioSequence.cpp b/soh/soh/resource/type/AudioSequence.cpp index 41029d47d..040fbf124 100644 --- a/soh/soh/resource/type/AudioSequence.cpp +++ b/soh/soh/resource/type/AudioSequence.cpp @@ -9,4 +9,10 @@ Sequence* AudioSequence::GetPointer() { size_t AudioSequence::GetPointerSize() { return sizeof(Sequence); } -} // namespace SOH + +AudioSequence::~AudioSequence() { + delete[] sequence.seqData; + sequence.seqData = nullptr; +} + +} // namespace SOH \ No newline at end of file diff --git a/soh/soh/resource/type/AudioSequence.h b/soh/soh/resource/type/AudioSequence.h index 5ff4c9a35..b76645dee 100644 --- a/soh/soh/resource/type/AudioSequence.h +++ b/soh/soh/resource/type/AudioSequence.h @@ -1,19 +1,17 @@ #pragma once #include -#include #include "Resource.h" -#include namespace SOH { typedef struct { char* seqData; - int32_t seqDataSize; + uint32_t seqDataSize; uint16_t seqNumber; uint8_t medium; uint8_t cachePolicy; - int32_t numFonts; + uint32_t numFonts; uint8_t fonts[16]; } Sequence; @@ -23,11 +21,11 @@ class AudioSequence : public Ship::Resource { AudioSequence() : Resource(std::shared_ptr()) { } + ~AudioSequence(); Sequence* GetPointer(); size_t GetPointerSize(); Sequence sequence; - std::vector sequenceData; }; -}; // namespace SOH +}; // namespace SOH \ No newline at end of file diff --git a/soh/soh/resource/type/AudioSoundFont.cpp b/soh/soh/resource/type/AudioSoundFont.cpp index 12218cb64..da95bf574 100644 --- a/soh/soh/resource/type/AudioSoundFont.cpp +++ b/soh/soh/resource/type/AudioSoundFont.cpp @@ -1,6 +1,23 @@ #include "AudioSoundFont.h" namespace SOH { + +AudioSoundFont::~AudioSoundFont() { + for (auto i : instrumentAddresses) { + if (i != nullptr) { + delete[] i->envelope; + delete i; + } + } + + for (auto d : drumAddresses) { + if (d != nullptr) { + delete[] d->envelope; + delete d; + } + } +} + SoundFont* AudioSoundFont::GetPointer() { return &soundFont; } @@ -8,4 +25,4 @@ SoundFont* AudioSoundFont::GetPointer() { size_t AudioSoundFont::GetPointerSize() { return sizeof(SoundFont); } -} // namespace SOH +} // namespace SOH \ No newline at end of file diff --git a/soh/soh/resource/type/AudioSoundFont.h b/soh/soh/resource/type/AudioSoundFont.h index a7e329519..e387ede5f 100644 --- a/soh/soh/resource/type/AudioSoundFont.h +++ b/soh/soh/resource/type/AudioSoundFont.h @@ -58,6 +58,7 @@ class AudioSoundFont : public Ship::Resource { AudioSoundFont() : Resource(std::shared_ptr()) { } + ~AudioSoundFont(); SoundFont* GetPointer(); size_t GetPointerSize(); @@ -68,15 +69,10 @@ class AudioSoundFont : public Ship::Resource { uint16_t data2; uint16_t data3; - std::vector drums; std::vector drumAddresses; - std::vector drumEnvelopeCounts; std::vector> drumEnvelopeArrays; - std::vector instruments; std::vector instrumentAddresses; - std::vector instrumentEnvelopeCounts; - std::vector> instrumentEnvelopeArrays; std::vector soundEffects; diff --git a/soh/src/code/audio_heap.c b/soh/src/code/audio_heap.c index e6d622c43..398946fa9 100644 --- a/soh/src/code/audio_heap.c +++ b/soh/src/code/audio_heap.c @@ -41,7 +41,7 @@ void func_800DDE3C(void) { void AudioHeap_ResetLoadStatus(void) { s32 i; - for (i = 0; i < 0x30; i++) { + for (i = 0; i < fontMapSize; i++) { if (gAudioContext.fontLoadStatus[i] != 5) { gAudioContext.fontLoadStatus[i] = 0; } @@ -940,7 +940,7 @@ void AudioHeap_Init(void) { reverb->sample.sampleAddr = (u8*)reverb->leftRingBuf; reverb->loop.start = 0; reverb->loop.count = 1; - reverb->loop.end = reverb->windowSize; + reverb->loop.loopEnd = reverb->windowSize; if (reverb->downsampleRate != 1) { reverb->unk_0E = 0x8000 / reverb->downsampleRate; diff --git a/soh/src/code/audio_load.c b/soh/src/code/audio_load.c index 746a09568..81f67f9c0 100644 --- a/soh/src/code/audio_load.c +++ b/soh/src/code/audio_load.c @@ -8,6 +8,10 @@ #include "soh/Enhancements/audio/AudioCollection.h" #include "soh/Enhancements/audio/AudioEditor.h" #include "soh/ResourceManagerHelpers.h" +#include +#ifdef _MSC_VER +#define strdup _strdup +#endif #define MK_ASYNC_MSG(retData, tableType, id, status) (((retData) << 24) | ((tableType) << 16) | ((id) << 8) | (status)) #define ASYNC_TBLTYPE(v) ((u8)(v >> 16)) @@ -82,7 +86,8 @@ char** sequenceMap; size_t sequenceMapSize; // A map of authentic sequence IDs to their cache policies, for use with sequence swapping. u8 seqCachePolicyMap[MAX_AUTHENTIC_SEQID]; -char* fontMap[256]; +size_t fontMapSize; +char** fontMap; uintptr_t fontStart; uint32_t fontOffsets[8192]; @@ -419,7 +424,7 @@ void AudioLoad_SyncLoadSeqParts(s32 seqId, s32 arg1) { s32 AudioLoad_SyncLoadSample(SoundFontSample* sample, s32 fontId) { void* sampleAddr; - if (sample->unk_bit25 == 1) { + if (sample->isRelocated == 1) { if (sample->medium != MEDIUM_RAM) { sampleAddr = AudioHeap_AllocSampleCache(sample->size, fontId, (void*)sample->sampleAddr, sample->medium, CACHE_PERSISTENT); @@ -701,7 +706,7 @@ SoundFontData* AudioLoad_SyncLoadFont(u32 fontId) { return NULL; } - SoundFont* sf = ResourceMgr_LoadAudioSoundFont(fontMap[fontId]); + SoundFont* sf = ResourceMgr_LoadAudioSoundFontByName(fontMap[fontId]); sampleBankId1 = sf->sampleBankId1; sampleBankId2 = sf->sampleBankId2; @@ -759,7 +764,7 @@ uintptr_t AudioLoad_SyncLoad(u32 tableType, u32 id, s32* didAllocate) { cachePolicy = sData.cachePolicy; romAddr = 0; } else if (tableType == FONT_TABLE) { - fnt = ResourceMgr_LoadAudioSoundFont(fontMap[id]); + fnt = ResourceMgr_LoadAudioSoundFontByName(fontMap[id]); size = sizeof(SoundFont); medium = 2; cachePolicy = 0; @@ -887,6 +892,7 @@ AudioTable* AudioLoad_GetLoadTable(s32 tableType) { } void AudioLoad_RelocateFont(s32 fontId, SoundFontData* mem, RelocInfo* relocInfo) { + return; uintptr_t reloc; uintptr_t reloc2; Instrument* inst; @@ -898,7 +904,7 @@ void AudioLoad_RelocateFont(s32 fontId, SoundFontData* mem, RelocInfo* relocInfo s32 numInstruments = 0; s32 numSfx = 0; - sf = ResourceMgr_LoadAudioSoundFont(fontMap[fontId]); + sf = ResourceMgr_LoadAudioSoundFontByName(fontMap[fontId]); numDrums = sf->numDrums; numInstruments = sf->numInstruments; numSfx = sf->numSfx; @@ -1247,12 +1253,13 @@ int strcmp_sort(const void* str1, const void* str2) { } void AudioLoad_Init(void* heap, size_t heapSize) { - char pad[0x48]; + s32 pad1[9]; s32 numFonts; - void* temp_v0_3; + s32 pad2[2]; + u8* audioCtxPtr; + void* addr; s32 i; - u64* heapP; - s16* u2974p; + s32 j; D_801755D0 = NULL; gAudioContext.resetTimer = 0; @@ -1266,10 +1273,12 @@ void AudioLoad_Init(void* heap, size_t heapSize) { gAudioContext.unk_2960 = 20.03042f; gAudioContext.refreshRate = 50; break; + case OS_TV_MPAL: gAudioContext.unk_2960 = 16.546f; gAudioContext.refreshRate = 60; break; + case OS_TV_NTSC: default: gAudioContext.unk_2960 = 16.713f; @@ -1278,7 +1287,7 @@ void AudioLoad_Init(void* heap, size_t heapSize) { Audio_InitMesgQueues(); - for (i = 0; i < 3; i++) { + for (i = 0; i < ARRAY_COUNT(gAudioContext.aiBufLengths); i++) { gAudioContext.aiBufLengths[i] = 0xA0; } @@ -1289,12 +1298,14 @@ void AudioLoad_Init(void* heap, size_t heapSize) { gAudioContext.currTask = NULL; gAudioContext.rspTask[0].task.t.data_size = 0; gAudioContext.rspTask[1].task.t.data_size = 0; + osCreateMesgQueue(&gAudioContext.syncDmaQueue, &gAudioContext.syncDmaMesg, 1); - osCreateMesgQueue(&gAudioContext.currAudioFrameDmaQueue, gAudioContext.currAudioFrameDmaMesgBuf, 0x40); + osCreateMesgQueue(&gAudioContext.currAudioFrameDmaQueue, gAudioContext.currAudioFrameDmaMesgBuf, + ARRAY_COUNT(gAudioContext.currAudioFrameDmaMesgBuf)); osCreateMesgQueue(&gAudioContext.externalLoadQueue, gAudioContext.externalLoadMesgBuf, ARRAY_COUNT(gAudioContext.externalLoadMesgBuf)); osCreateMesgQueue(&gAudioContext.preloadSampleQueue, gAudioContext.preloadSampleMesgBuf, - ARRAY_COUNT(gAudioContext.externalLoadMesgBuf)); + ARRAY_COUNT(gAudioContext.preloadSampleMesgBuf)); gAudioContext.curAudioFrameDmaCount = 0; gAudioContext.sampleDmaCount = 0; gAudioContext.cartHandle = osCartRomInit(); @@ -1304,20 +1315,24 @@ void AudioLoad_Init(void* heap, size_t heapSize) { gAudioContext.audioHeapSize = D_8014A6C4.heapSize; } else { void** hp = &heap; + gAudioContext.audioHeap = *hp; gAudioContext.audioHeapSize = heapSize; } - for (i = 0; i < gAudioContext.audioHeapSize / 8; i++) { + for (i = 0; i < ((s32)gAudioContext.audioHeapSize / (s32)sizeof(u64)); i++) { ((u64*)gAudioContext.audioHeap)[i] = 0; } + // Main Pool Split (split entirety of audio heap into initPool and sessionPool) AudioHeap_InitMainPools(D_8014A6C4.initPoolSize); - for (i = 0; i < 3; i++) { + // Initialize the audio interface buffers + for (i = 0; i < ARRAY_COUNT(gAudioContext.aiBuffers); i++) { gAudioContext.aiBuffers[i] = AudioHeap_AllocZeroed(&gAudioContext.audioInitPool, AIBUF_LEN * sizeof(s16)); } + // Connect audio tables to their tables in memory // gAudioContext.sequenceTable = (AudioTable*)gSequenceTable; // gAudioContext.soundFontTable = (AudioTable*)gSoundFontTable; // gAudioContext.sampleBankTable = (AudioTable*)gSampleBankTable; @@ -1325,31 +1340,60 @@ void AudioLoad_Init(void* heap, size_t heapSize) { // gAudioContext.numSequences = gAudioContext.sequenceTable->numEntries; gAudioContext.audioResetSpecIdToLoad = 0; - gAudioContext.resetStatus = 1; - + gAudioContext.resetStatus = 1; // Set reset to immediately initialize the audio heap AudioHeap_ResetStep(); + // Initialize audio tables + // AudioLoad_InitTable(gAudioContext.sequenceTable, SEGMENT_ROM_START(Audioseq), 0); + // AudioLoad_InitTable(gAudioContext.soundFontTable, SEGMENT_ROM_START(Audiobank), 0); + // AudioLoad_InitTable(gAudioContext.sampleBankTable, SEGMENT_ROM_START(Audiotable), 0); + + // #region 2S2H [Port] Audio in the archive and custom sequences + // Only load the original sequences right now because custom songs may require data from sound fonts and samples int seqListSize = 0; int customSeqListSize = 0; char** seqList = ResourceMgr_ListFiles("audio/sequences*", &seqListSize); char** customSeqList = ResourceMgr_ListFiles("custom/music/*", &customSeqListSize); - sequenceMapSize = (size_t)(AudioCollection_SequenceMapSize() + customSeqListSize); - sequenceMap = malloc(sequenceMapSize * sizeof(char*)); - gAudioContext.seqLoadStatus = malloc(sequenceMapSize * sizeof(char*)); + sequenceMapSize = (size_t)(seqListSize + customSeqListSize); + sequenceMap = malloc((sequenceMapSize + 0xF) * sizeof(char*)); + gAudioContext.seqLoadStatus = malloc(sequenceMapSize); + memset(gAudioContext.seqLoadStatus, 5, sequenceMapSize); for (size_t i = 0; i < seqListSize; i++) { SequenceData sDat = ResourceMgr_LoadSeqByName(seqList[i]); - - char* str = malloc(strlen(seqList[i]) + 1); - strcpy(str, seqList[i]); - - sequenceMap[sDat.seqNumber] = str; + sequenceMap[sDat.seqNumber] = strdup(seqList[i]); seqCachePolicyMap[sDat.seqNumber] = sDat.cachePolicy; } free(seqList); - int startingSeqNum = MAX_AUTHENTIC_SEQID; // 109 is the highest vanilla sequence + // 2S2H [Streamed Audio] We need to load the custom songs after the fonts because streamed songs will use a hash to + // find its soundfont + int fntListSize = 0; + int customFntListSize = 0; + char** fntList = ResourceMgr_ListFiles("audio/fonts*", &fntListSize); + char** customFntList = ResourceMgr_ListFiles("custom/fonts/*", &customFntListSize); + + gAudioContext.fontLoadStatus = malloc(customFntListSize + fntListSize); + fontMap = calloc(customFntListSize + fntListSize, sizeof(char*)); + fontMapSize = customFntListSize + fntListSize; + for (int i = 0; i < fntListSize; i++) { + SoundFont* sf = ResourceMgr_LoadAudioSoundFontByName(fntList[i]); + fontMap[sf->fntIndex] = strdup(fntList[i]); + } + + free(fntList); + + int customFontStart = fntListSize; + for (int i = customFontStart; i < customFntListSize + fntListSize; i++) { + SoundFont* sf = ResourceMgr_LoadAudioSoundFontByName(customFntList[i - customFontStart]); + sf->fntIndex = i; + fontMap[i] = strdup(customFntList[i - customFontStart]); + } + free(customFntList); + + // 2S2H Port I think we need to take use seqListSize because entry 0x7A is missing. + int startingSeqNum = seqListSize; // MAX_AUTHENTIC_SEQID; // 109 is the highest vanilla sequence qsort(customSeqList, customSeqListSize, sizeof(char*), strcmp_sort); // Because AudioCollection's sequenceMap actually has more than sequences (including instruments from 130-135 and @@ -1361,48 +1405,61 @@ void AudioLoad_Init(void* heap, size_t heapSize) { for (size_t i = startingSeqNum; i < startingSeqNum + customSeqListSize; i++) { // ensure that what would be the next sequence number is actually unassigned in AudioCollection + int j = i - startingSeqNum; + SequenceData* sDat = ResourceMgr_LoadSeqPtrByName(customSeqList[j]); + + if (sDat->numFonts == -1) { + uint64_t crc; + + memcpy(&crc, sDat->fonts, sizeof(uint64_t)); + const char* res = ResourceGetNameByCrc(crc); + if (res == NULL) { + // Passing a null buffer and length of 0 to snprintf will return the required numbers of characters the + // buffer needs to be. + int len = + snprintf(NULL, 0, "Could not find sound font for sequence %s. It will not be in the audio editor.", + customSeqList[j]); + char* error = malloc(len + 1); + snprintf(error, len, "Could not find sound font for sequence %s. It will not be in the audio editor.", + customSeqList[j]); + LUSLOG_ERROR("%s", error); + Messagebox_ShowErrorBox("Invalid Sequence", error); + free(error); + continue; + } + SoundFont* sf = ResourceMgr_LoadAudioSoundFontByName(res); + memset(&sDat->fonts[0], 0, sizeof(sDat->fonts)); + sDat->fonts[0] = sf->fntIndex; + sDat->numFonts = 1; + } + while (AudioCollection_HasSequenceNum(seqNum)) { seqNum++; } - int j = i - startingSeqNum; + AudioCollection_AddToCollection(customSeqList[j], seqNum); - SequenceData sDat = ResourceMgr_LoadSeqByName(customSeqList[j]); - sDat.seqNumber = seqNum; - char* str = malloc(strlen(customSeqList[j]) + 1); - strcpy(str, customSeqList[j]); - - sequenceMap[sDat.seqNumber] = str; + sDat->seqNumber = seqNum; + printf("%d\n", seqNum); + sequenceMap[sDat->seqNumber] = strdup(customSeqList[j]); seqNum++; } free(customSeqList); - int fntListSize = 0; - char** fntList = ResourceMgr_ListFiles("audio/fonts*", &fntListSize); - - for (int i = 0; i < fntListSize; i++) { - SoundFont* sf = ResourceMgr_LoadAudioSoundFont(fntList[i]); - - char* str = malloc(strlen(fntList[i]) + 1); - strcpy(str, fntList[i]); - - fontMap[sf->fntIndex] = str; - } - numFonts = fntListSize; - free(fntList); + // #end region gAudioContext.soundFonts = AudioHeap_Alloc(&gAudioContext.audioInitPool, numFonts * sizeof(SoundFont)); - if (temp_v0_3 = AudioHeap_Alloc(&gAudioContext.audioInitPool, D_8014A6C4.permanentPoolSize), temp_v0_3 == NULL) { + if (addr = AudioHeap_Alloc(&gAudioContext.audioInitPool, D_8014A6C4.permanentPoolSize), addr == NULL) { // cast away const from D_8014A6C4 - // *((u32*)&D_8014A6C4.permanentPoolSize) = 0; + *((u32*)&D_8014A6C4.permanentPoolSize) = 0; } - AudioHeap_AllocPoolInit(&gAudioContext.permanentPool, temp_v0_3, D_8014A6C4.permanentPoolSize); + AudioHeap_AllocPoolInit(&gAudioContext.permanentPool, addr, D_8014A6C4.permanentPoolSize); gAudioContextInitalized = true; - osSendMesg32(gAudioContext.taskStartQueueP, gAudioContext.totalTaskCnt, OS_MESG_NOBLOCK); + osSendMesg(gAudioContext.taskStartQueueP, OS_MESG_32(gAudioContext.totalTaskCnt), OS_MESG_NOBLOCK); } void AudioLoad_InitSlowLoads(void) { @@ -2059,7 +2116,7 @@ void AudioLoad_PreloadSamplesForFont(s32 fontId, s32 async, RelocInfo* relocInfo gAudioContext.numUsedSamples = 0; - SoundFont* sf = ResourceMgr_LoadAudioSoundFont(fontMap[fontId]); + SoundFont* sf = ResourceMgr_LoadAudioSoundFontByName(fontMap[fontId]); numDrums = sf->numDrums; numInstruments = sf->numInstruments; @@ -2188,7 +2245,7 @@ void AudioLoad_LoadPermanentSamples(void) { fontId = AudioLoad_GetRealTableIndex(FONT_TABLE, gAudioContext.permanentCache[i].id); // fontId = gAudioContext.permanentCache[i].id; - SoundFont* sf = ResourceMgr_LoadAudioSoundFont(fontMap[fontId]); + SoundFont* sf = ResourceMgr_LoadAudioSoundFontByName(fontMap[fontId]); relocInfo.sampleBankId1 = sf->sampleBankId1; relocInfo.sampleBankId2 = sf->sampleBankId2; diff --git a/soh/src/code/audio_playback.c b/soh/src/code/audio_playback.c index 122823fde..a43a08380 100644 --- a/soh/src/code/audio_playback.c +++ b/soh/src/code/audio_playback.c @@ -147,6 +147,7 @@ void Audio_NoteInit(Note* note) { note->noteSubEu = gDefaultNoteSub; } +extern void aOPUSFree(struct OggOpusFile* opusFile); void Audio_NoteDisable(Note* note) { if (note->noteSubEu.bitField0.needsInit == true) { note->noteSubEu.bitField0.needsInit = false; @@ -159,6 +160,10 @@ void Audio_NoteDisable(Note* note) { note->playbackState.prevParentLayer = NO_LAYER; note->playbackState.adsr.action.s.state = ADSR_STATE_DISABLED; note->playbackState.adsr.current = 0; + if (note->synthesisState.opusFile != NULL) { + aOPUSFree(note->synthesisState.opusFile); + note->synthesisState.opusFile = NULL; + } } void Audio_ProcessNotes(void) { @@ -293,13 +298,6 @@ void Audio_ProcessNotes(void) { f32 resampRate = gAudioContext.audioBufferParameters.resampleRate; - // CUSTOM SAMPLE CHECK - if (!noteSubEu2->bitField1.isSyntheticWave && noteSubEu2->sound.soundFontSound != NULL && - noteSubEu2->sound.soundFontSound->sample != NULL && - noteSubEu2->sound.soundFontSound->sample->sampleRateMagicValue == 'RIFF') { - resampRate = CALC_RESAMPLE_FREQ(noteSubEu2->sound.soundFontSound->sample->sampleRate); - } - subAttrs.frequency *= resampRate; subAttrs.velocity *= scale; @@ -335,7 +333,7 @@ Instrument* Audio_GetInstrumentInner(s32 fontId, s32 instId) { } int instCnt = 0; - SoundFont* sf = ResourceMgr_LoadAudioSoundFont(fontMap[fontId]); + SoundFont* sf = ResourceMgr_LoadAudioSoundFontByName(fontMap[fontId]); if (instId >= sf->numInstruments) return NULL; @@ -362,7 +360,7 @@ Drum* Audio_GetDrum(s32 fontId, s32 drumId) { return NULL; } - SoundFont* sf = ResourceMgr_LoadAudioSoundFont(fontMap[fontId]); + SoundFont* sf = ResourceMgr_LoadAudioSoundFontByName(fontMap[fontId]); if (drumId < sf->numDrums) { drum = sf->drums[drumId]; } @@ -386,7 +384,7 @@ SoundFontSound* Audio_GetSfx(s32 fontId, s32 sfxId) { return NULL; } - SoundFont* sf = ResourceMgr_LoadAudioSoundFont(fontMap[fontId]); + SoundFont* sf = ResourceMgr_LoadAudioSoundFontByName(fontMap[fontId]); if (sfxId < sf->numSfx) { sfx = &sf->soundEffects[sfxId]; } diff --git a/soh/src/code/audio_seqplayer.c b/soh/src/code/audio_seqplayer.c index 871f9a376..b99d29e1e 100644 --- a/soh/src/code/audio_seqplayer.c +++ b/soh/src/code/audio_seqplayer.c @@ -789,7 +789,7 @@ s32 AudioSeq_SeqLayerProcessScriptStep4(SequenceLayer* layer, s32 cmd) { layer->freqScale *= layer->unk_34; if (layer->delay == 0) { if (layer->sound != NULL) { - time = (f32)layer->sound->sample->loop->end; + time = (f32)layer->sound->sample->loop->loopEnd; } else { time = 0.0f; } diff --git a/soh/src/code/audio_synthesis.c b/soh/src/code/audio_synthesis.c index cd25386c6..abd657e0d 100644 --- a/soh/src/code/audio_synthesis.c +++ b/soh/src/code/audio_synthesis.c @@ -761,7 +761,7 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisS audioFontSample = noteSubEu->sound.soundFontSound->sample; loopInfo = audioFontSample->loop; - loopEndPos = loopInfo->end; + loopEndPos = loopInfo->loopEnd; sampleAddr = audioFontSample->sampleAddr; resampledTempLen = 0; @@ -853,14 +853,27 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisS s5 = samplesLenAdjusted; goto skip; case CODEC_S16: - AudioSynth_ClearBuffer(cmd++, DMEM_UNCOMPRESSED_NOTE, (samplesLenAdjusted * 2) + 0x20); - AudioSynth_LoadBuffer(cmd++, DMEM_UNCOMPRESSED_NOTE, ALIGN16(nSamplesToLoad * 2), - audioFontSample->sampleAddr + (synthState->samplePosInt * 2)); - + case CODEC_OPUS: + AudioSynth_ClearBuffer(cmd++, DMEM_UNCOMPRESSED_NOTE, (samplesLenAdjusted + 16) * 2); flags = A_CONTINUE; skipBytes = 0; - nSamplesProcessed = samplesLenAdjusted; - s5 = samplesLenAdjusted; + size_t bytesToRead; + nSamplesProcessed += samplesLenAdjusted; + + if (((synthState->samplePosInt * 2) + (samplesLenAdjusted)*2) < audioFontSample->size) { + bytesToRead = (samplesLenAdjusted)*2; + } else { + bytesToRead = audioFontSample->size - (synthState->samplePosInt * 2); + } + // 2S2H [Port] [Custom audio] Handle decoding OPUS data + if (audioFontSample->codec == CODEC_OPUS) { + aOPUSdecImpl(sampleAddr, DMEM_UNCOMPRESSED_NOTE, bytesToRead, &synthState->opusFile, + synthState->samplePosInt, audioFontSample->fileSize); + } else { + aLoadBuffer(cmd++, sampleAddr + (synthState->samplePosInt * 2), DMEM_UNCOMPRESSED_NOTE, + bytesToRead); + } + goto skip; case CODEC_REVERB: break; @@ -886,6 +899,7 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisS sampleDataStartPad = (uintptr_t)sampleData & 0xF; aligned = ALIGN16((nFramesToDecode * frameSize) + 16); addr = DMEM_COMPRESSED_ADPCM_DATA - aligned; + aLoadBuffer(cmd++, sampleData - sampleDataStartPad, addr, aligned); } else { nSamplesToDecode = 0; @@ -893,7 +907,7 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisS } if (synthState->restart) { - aSetLoop(cmd++, audioFontSample->loop->state); + aSetLoop(cmd++, audioFontSample->loop->predictorState); flags = A_LOOP; synthState->restart = false; } diff --git a/soh/src/code/code_800E4FE0.c b/soh/src/code/code_800E4FE0.c index a608b5234..440fb05a6 100644 --- a/soh/src/code/code_800E4FE0.c +++ b/soh/src/code/code_800E4FE0.c @@ -792,7 +792,7 @@ s32 func_800E6590(s32 playerIdx, s32 arg1, s32 arg2) { if (sound == NULL) { return 0; } - loopEnd = sound->sample->loop->end; + loopEnd = sound->sample->loop->loopEnd; samplePos = note->synthesisState.samplePosInt; return loopEnd - samplePos; } From 9924ebbd05e7c4e0bf347730a009a65bf217593a Mon Sep 17 00:00:00 2001 From: Eblo <7004497+Eblo@users.noreply.github.com> Date: Sat, 28 Jun 2025 10:50:28 -0400 Subject: [PATCH 67/67] Enhancement to double pause menu animation speed (#5615) * Add enhancement to speed up pause menu animation * Rename CVar to FasterPauseMenu * Rename kaleido to pause menu * Rename register func to InitFasterPauseMenu --- .../TimeSavers/FasterPauseMenu.cpp | 35 +++++++++++++++++++ soh/soh/SohGui/SohMenuEnhancements.cpp | 3 ++ 2 files changed, 38 insertions(+) create mode 100644 soh/soh/Enhancements/TimeSavers/FasterPauseMenu.cpp diff --git a/soh/soh/Enhancements/TimeSavers/FasterPauseMenu.cpp b/soh/soh/Enhancements/TimeSavers/FasterPauseMenu.cpp new file mode 100644 index 000000000..d9f23216d --- /dev/null +++ b/soh/soh/Enhancements/TimeSavers/FasterPauseMenu.cpp @@ -0,0 +1,35 @@ +#include "soh/Enhancements/game-interactor/GameInteractor.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "variables.h" +extern PlayState* gPlayState; +extern void func_808237B4(PlayState* play, Input* input); +} + +#define CVAR_FASTER_PAUSE_MENU_NAME CVAR_ENHANCEMENT("FasterPauseMenu") +#define CVAR_FASTER_PAUSE_MENU_VALUE CVarGetInteger(CVAR_FASTER_PAUSE_MENU_NAME, 0) + +void OnKaleidoUpdateFaster() { + ZREG(46) = 2; // pauseCtx->eye and pauseCtx->unk_1EA multiply by this for animation. Double the default value. + WREG(6) = 4; // Numerous kaleido animations divide by this for movement and alpha. Half the default value. + + // Page turn animation is governed by func_808237B4. Those values don't use registers to modify the speed, so we + // just directly call it twice to effectively double the speed. + if (gPlayState->pauseCtx.state == 6 && gPlayState->pauseCtx.unk_1E4 == 1) { // In page turning mode + func_808237B4(gPlayState, gPlayState->state.input); + } +} + +void InitFasterPauseMenu() { + COND_HOOK(GameInteractor::OnKaleidoUpdate, CVAR_FASTER_PAUSE_MENU_VALUE, OnKaleidoUpdateFaster); + + // Reset register values on close. These values are only used by z_kaleido_scope_PAL.c + COND_VB_SHOULD(VB_KALEIDO_UNPAUSE_CLOSE, CVAR_FASTER_PAUSE_MENU_VALUE, { + // Default values, as defined in Regs_InitDataImpl + ZREG(46) = 1; + WREG(6) = 8; + }); +} + +static RegisterShipInitFunc initFunc(InitFasterPauseMenu, { CVAR_FASTER_PAUSE_MENU_NAME }); diff --git a/soh/soh/SohGui/SohMenuEnhancements.cpp b/soh/soh/SohGui/SohMenuEnhancements.cpp index 953a4c331..c8d456923 100644 --- a/soh/soh/SohGui/SohMenuEnhancements.cpp +++ b/soh/soh/SohGui/SohMenuEnhancements.cpp @@ -351,6 +351,9 @@ void SohMenu::AddMenuEnhancements() { AddWidget(path, "King Zora Speed: %.2fx", WIDGET_CVAR_SLIDER_FLOAT) .CVar(CVAR_ENHANCEMENT("MweepSpeed")) .Options(FloatSliderOptions().Min(0.1f).Max(5.0f).DefaultValue(1.0f).Format("%.2fx")); + AddWidget(path, "Faster Pause Menu", WIDGET_CVAR_CHECKBOX) + .CVar(CVAR_ENHANCEMENT("FasterPauseMenu")) + .Options(CheckboxOptions().Tooltip("Speeds up animation of the pause menu, similar to Majora's Mask")); path.column = SECTION_COLUMN_3; AddWidget(path, "Misc", WIDGET_SEPARATOR_TEXT);