From ed92bb7e45923867b0c0add646076bba01a3d9d8 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Wed, 7 Aug 2024 17:57:16 -0700 Subject: [PATCH 01/54] Enable freestanding items other than heart pieces and keys --- soh/include/z64actor.h | 1 - .../Enhancements/randomizer/hook_handlers.cpp | 21 ++++++++++++++----- soh/src/code/z_en_item00.c | 8 ------- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/soh/include/z64actor.h b/soh/include/z64actor.h index 156f1d6797d..04ad59fd731 100644 --- a/soh/include/z64actor.h +++ b/soh/include/z64actor.h @@ -290,7 +290,6 @@ typedef struct EnItem00 { /* 0x15C */ f32 scale; /* 0x160 */ ColliderCylinder collider; // #region SOH [Randomizer] - GetItemEntry randoGiEntry; RandomizerCheck randoCheck; RandomizerInf randoInf; /* */ s16 ogParams; diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index d5737d33da4..52d10832474 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -662,13 +662,24 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void break; case VB_ITEM00_DESPAWN: { EnItem00* item00 = static_cast(optionalArg); - if (item00->actor.params == ITEM00_HEART_PIECE || item00->actor.params == ITEM00_SMALL_KEY) { - RandomizerCheck rc = OTRGlobals::Instance->gRandomizer->GetCheckFromActor(item00->actor.id, gPlayState->sceneNum, item00->ogParams); - if (rc != RC_UNKNOWN_CHECK) { + item00->randoInf = RAND_INF_MAX; + item00->randoCheck = RC_UNKNOWN_CHECK; + + auto pos = item00->actor.world.pos; + uint32_t params = item00->collectibleFlag ? item00->ogParams : TWO_ACTOR_PARAMS((int32_t)pos.x, (int32_t)pos.z); + Rando::Location* loc = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(item00->actor.id, gPlayState->sceneNum, params); + + if (loc && loc->GetRandomizerCheck() != RC_UNKNOWN_CHECK) { + // Spawn vanilla item if collected and renewable + if (loc->GetCollectionCheck().type != SPOILER_CHK_RANDOMIZER_INF || !Rando::Context::GetInstance()->GetItemLocation(loc->GetRandomizerCheck())->HasObtained()) { + item00->randoCheck = loc->GetRandomizerCheck(); + item00->itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(loc->GetRandomizerCheck(), true); item00->actor.params = ITEM00_SOH_DUMMY; - item00->itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(rc, true, (GetItemID)Rando::StaticData::GetLocation(rc)->GetVanillaItem()); item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; - *should = Rando::Context::GetInstance()->GetItemLocation(rc)->HasObtained(); + if (loc->GetCollectionCheck().type == SPOILER_CHK_RANDOMIZER_INF) { + item00->randoInf = loc->GetCollectionCheck().flag; + } + *should = Rando::Context::GetInstance()->GetItemLocation(loc->GetRandomizerCheck())->HasObtained(); } } else if (item00->actor.params == ITEM00_SOH_GIVE_ITEM_ENTRY || item00->actor.params == ITEM00_SOH_GIVE_ITEM_ENTRY_GI) { GetItemEntry itemEntry = randomizerQueuedItemEntry; diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c index 8e30f462a74..71bca21d37d 100644 --- a/soh/src/code/z_en_item00.c +++ b/soh/src/code/z_en_item00.c @@ -349,7 +349,6 @@ void EnItem00_Init(Actor* thisx, PlayState* play) { f32 yOffset = 980.0f; f32 shadowScale = 6.0f; s32 getItemId = GI_NONE; - this->randoGiEntry = (GetItemEntry)GET_ITEM_NONE; this->randoCheck = (RandomizerCheck)RC_UNKNOWN_CHECK; this->itemEntry = (GetItemEntry)GET_ITEM_NONE; s16 spawnParam8000 = this->actor.params & 0x8000; @@ -492,13 +491,6 @@ void EnItem00_Init(Actor* thisx, PlayState* play) { this->actor.shape.shadowAlpha = 180; this->actor.focus.pos = this->actor.world.pos; this->getItemId = GI_NONE; - this->randoCheck = Randomizer_GetCheckFromActor(this->actor.id, play->sceneNum, this->ogParams); - this->randoInf = RAND_INF_MAX; - - if (IS_RANDO && this->randoCheck != RC_UNKNOWN_CHECK) { - this->randoGiEntry = Randomizer_GetItemFromKnownCheck(this->randoCheck, getItemId); - this->randoGiEntry.getItemFrom = ITEM_FROM_FREESTANDING; - } if (!spawnParam8000) { EnItem00_SetupAction(this, func_8001DFC8); From edcf8597362f6a6d5abbbc5e007ccbdfef479bbc Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Wed, 7 Aug 2024 18:23:21 -0700 Subject: [PATCH 02/54] Add option to disable freestanding rupee & heart shuffle --- soh/soh/Enhancements/randomizer/hook_handlers.cpp | 2 +- soh/soh/Enhancements/randomizer/option_descriptions.cpp | 4 ++++ soh/soh/Enhancements/randomizer/randomizerTypes.h | 1 + soh/soh/Enhancements/randomizer/settings.cpp | 1 + 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 52d10832474..a2816a15cf8 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -669,7 +669,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void uint32_t params = item00->collectibleFlag ? item00->ogParams : TWO_ACTOR_PARAMS((int32_t)pos.x, (int32_t)pos.z); Rando::Location* loc = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(item00->actor.id, gPlayState->sceneNum, params); - if (loc && loc->GetRandomizerCheck() != RC_UNKNOWN_CHECK) { + if (loc && loc->GetRandomizerCheck() != RC_UNKNOWN_CHECK && (RAND_GET_OPTION(RSK_SHUFFLE_FREESTANDING) || item00->actor.params == ITEM00_HEART_PIECE || item00->actor.params == ITEM00_SMALL_KEY)) { // Spawn vanilla item if collected and renewable if (loc->GetCollectionCheck().type != SPOILER_CHK_RANDOMIZER_INF || !Rando::Context::GetInstance()->GetItemLocation(loc->GetRandomizerCheck())->HasObtained()) { item00->randoCheck = loc->GetRandomizerCheck(); diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index 36c27064267..a956fac0170 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -336,6 +336,10 @@ void Settings::CreateOptionDescriptions() { "have collected all 100 Gold Skulltula Tokens.\n" "\n" "You can still talk to him multiple times to get Huge Rupees."; + mOptionDescriptions[RSK_SHUFFLE_FREESTANDING] = + "Freestanding rupees & hearts are shuffles to random items.\n" + "\n" + "Freestanding heart pieces and small keys are already shuffled by default."; mOptionDescriptions[RSK_SHUFFLE_DUNGEON_REWARDS] = "Shuffles the location of spiritual stones and medallions.\n" "\n" diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 6162b3341d2..a88fca1ad19 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -3890,6 +3890,7 @@ typedef enum { RSK_SKELETON_KEY, RSK_SHUFFLE_DEKU_STICK_BAG, RSK_SHUFFLE_DEKU_NUT_BAG, + RSK_SHUFFLE_FREESTANDING, RSK_MAX } RandomizerSettingKey; diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index f3f860800bc..2df23d7f019 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -122,6 +122,7 @@ void Settings::CreateOptions() { mOptions[RSK_SHUFFLE_BOSS_SOULS] = Option::U8("Shuffle Boss Souls", {"Off", "On", "On + Ganon"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleBossSouls"), mOptionDescriptions[RSK_SHUFFLE_BOSS_SOULS], WidgetType::Combobox); mOptions[RSK_SHUFFLE_DEKU_STICK_BAG] = Option::Bool("Shuffle Deku Stick Bag", CVAR_RANDOMIZER_SETTING("ShuffleDekuStickBag"), mOptionDescriptions[RSK_SHUFFLE_DEKU_STICK_BAG], IMFLAG_SEPARATOR_BOTTOM, WidgetType::Checkbox, RO_GENERIC_OFF); mOptions[RSK_SHUFFLE_DEKU_NUT_BAG] = Option::Bool("Shuffle Deku Nut Bag", CVAR_RANDOMIZER_SETTING("ShuffleDekuNutBag"), mOptionDescriptions[RSK_SHUFFLE_DEKU_NUT_BAG], IMFLAG_SEPARATOR_BOTTOM, WidgetType::Checkbox, RO_GENERIC_OFF); + mOptions[RSK_SHUFFLE_FREESTANDING] = Option::Bool("Shuffle Freestanding Items", CVAR_RANDOMIZER_SETTING("ShuffleFreestanding"), mOptionDescriptions[RSK_SHUFFLE_FREESTANDING], IMFLAG_SEPARATOR_BOTTOM, WidgetType::Checkbox, RO_GENERIC_OFF); mOptions[RSK_FISHSANITY] = Option::U8("Fishsanity", {"Off", "Shuffle only Hyrule Loach", "Shuffle Fishing Pond", "Shuffle Overworld Fish", "Shuffle Both"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("Fishsanity"), mOptionDescriptions[RSK_FISHSANITY], WidgetType::Combobox, RO_FISHSANITY_OFF); mOptions[RSK_FISHSANITY_POND_COUNT] = Option::U8("Pond Fish Count", {NumOpts(0,17,1)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("FishsanityPondCount"), mOptionDescriptions[RSK_FISHSANITY_POND_COUNT], WidgetType::Slider, 0, true, IMFLAG_NONE); mOptions[RSK_FISHSANITY_AGE_SPLIT] = Option::Bool("Pond Age Split", CVAR_RANDOMIZER_SETTING("FishsanityAgeSplit"), mOptionDescriptions[RSK_FISHSANITY_AGE_SPLIT]); From a535f591830c5319bf3c50ab6b27ab98ab0a10a7 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Wed, 7 Aug 2024 21:36:03 -0700 Subject: [PATCH 03/54] Add items to pool --- soh/soh/Enhancements/randomizer/3drando/category.hpp | 1 + soh/soh/Enhancements/randomizer/3drando/item_pool.cpp | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/3drando/category.hpp b/soh/soh/Enhancements/randomizer/3drando/category.hpp index 22522789cfd..5d263173e58 100644 --- a/soh/soh/Enhancements/randomizer/3drando/category.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/category.hpp @@ -19,6 +19,7 @@ enum class Category { cVanillaCompass, cAdultTrade, cBeehive, + cFreestanding, }; enum class OptionCategory { diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index fd78f1843e1..a35d619fe7c 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -1210,6 +1210,15 @@ void GenerateItemPool() { PlaceVanillaDekuScrubItems(); } + for (RandomizerCheck loc : ctx->GetLocations(ctx->allLocations, Category::cFreestanding)) { + RandomizerGet vanillaItem = Rando::StaticData::GetLocation(loc)->GetVanillaItem(); + if (ctx->GetOption(RSK_SHUFFLE_FREESTANDING)) { + AddItemToMainPool(vanillaItem); + } else { + ctx->PlaceItemInLocation(loc, vanillaItem, false, true); + } + } + AddItemsToPool(ItemPool, alwaysItems); AddItemsToPool(ItemPool, dungeonRewards); From fb8e2bd5f2f36771d4d9571eaa66e55e9b69f9a0 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Wed, 7 Aug 2024 22:18:54 -0700 Subject: [PATCH 04/54] Actually add shuffle setting --- soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp | 2 ++ soh/soh/Enhancements/randomizer/settings.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp index c40031e74a9..a6c3e3acb9d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/spoiler_log.cpp @@ -142,6 +142,8 @@ void WriteIngameSpoilerLog() { (ctx->GetOption(RSK_GERUDO_FORTRESS).Is(RO_GF_FAST) && loc->IsCategory(Category::cVanillaGFSmallKey) && loc->GetHintKey() != RHT_GF_NORTH_F1_CARPENTER)) { continue; + } else if (!ctx->GetOption(RSK_SHUFFLE_FREESTANDING) && loc->IsCategory(Category::cFreestanding)) { + continue; } // Copy at most 51 chars from the name and location name to avoid issues with names that don't fit on screen diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 2df23d7f019..c7548d3e5b1 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -670,6 +670,7 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_FISHING_POLE], &mOptions[RSK_SHUFFLE_DEKU_STICK_BAG], &mOptions[RSK_SHUFFLE_DEKU_NUT_BAG], + &mOptions[RSK_SHUFFLE_FREESTANDING], }, false, WidgetContainerType::COLUMN); mOptionGroups[RSG_SHUFFLE_NPCS_IMGUI] = OptionGroup::SubGroup("Shuffle NPCs & Merchants", { &mOptions[RSK_SHOPSANITY], @@ -902,6 +903,7 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_BOSS_SOULS], &mOptions[RSK_SHUFFLE_DEKU_STICK_BAG], &mOptions[RSK_SHUFFLE_DEKU_NUT_BAG], + &mOptions[RSK_SHUFFLE_FREESTANDING], }); mOptionGroups[RSG_SHUFFLE_DUNGEON_ITEMS] = OptionGroup("Shuffle Dungeon Items", { &mOptions[RSK_SHUFFLE_MAPANDCOMPASS], From 9c3827eea4cddd8976586b6d90084dad24f12b1d Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Wed, 7 Aug 2024 22:19:46 -0700 Subject: [PATCH 05/54] Define overworld locations --- soh/include/z64save.h | 2 +- .../Enhancements/randomizer/location_list.cpp | 113 ++++++++++++++++ .../Enhancements/randomizer/randomizerTypes.h | 127 ++++++++++++++++++ .../Enhancements/randomizer/randomizer_inf.h | 95 +++++++++++++ 4 files changed, 336 insertions(+), 1 deletion(-) diff --git a/soh/include/z64save.h b/soh/include/z64save.h index 617c2acf526..71b39a44033 100644 --- a/soh/include/z64save.h +++ b/soh/include/z64save.h @@ -283,7 +283,7 @@ typedef struct { // #endregion // #region SOH [Randomizer] // Upstream TODO: Move these to their own struct or name to more obviously specific to Randomizer - /* */ u16 randomizerInf[17]; + /* */ u16 randomizerInf[(RC_MAX + 15) / 16]; /* */ u8 mqDungeonCount; /* */ u16 adultTradeItems; /* */ u8 triforcePiecesCollected; diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index ad09e683d2d..7ecba2e3ed7 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1515,6 +1515,119 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_ZD_FISH_4] = Location::Base(RC_ZD_FISH_4, RCQUEST_BOTH, RCTYPE_FISH, RCAREA_ZORAS_DOMAIN, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 3, 0x00, "Fish 4", RHT_ZD_FISH, RG_FISH, { Category::cFish }, SpoilerCollectionCheck::Fish(0xFF, SCENE_ZORAS_DOMAIN), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZD_FISH_5] = Location::Base(RC_ZD_FISH_5, RCQUEST_BOTH, RCTYPE_FISH, RCAREA_ZORAS_DOMAIN, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 4, 0x00, "Fish 5", RHT_ZD_FISH, RG_FISH, { Category::cFish }, SpoilerCollectionCheck::Fish(0xFF, SCENE_ZORAS_DOMAIN), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + // Freestanding Hearts and Rupees + locationTable[RC_KF_BOULDER_RUPEE_2] = Location::Collectable(RC_KF_BOULDER_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, 0x0E01, 0x0E, "Boulder Maze Second Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_BOULDER_RUPEE_1] = Location::Collectable(RC_KF_BOULDER_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, 0x0F01, 0x0F, "Boulder Maze First Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_BRIDGE_RUPEE] = Location::Collectable(RC_KF_BRIDGE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, 0x1101, 0x11, "Bridge Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_BEHIND_MIDOS_RUPEE] = Location::Collectable(RC_KF_BEHIND_MIDOS_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, 0x1201, 0x12, "Behind Mido's House Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_SARIAS_ROOF_WEST_HEART] = Location::Collectable(RC_KF_SARIAS_ROOF_WEST_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, 0x1C03, 0x1C, "Saria's Roof West Heart", RHT_KOKIRI_FOREST_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_SARIAS_ROOF_EAST_HEART] = Location::Collectable(RC_KF_SARIAS_ROOF_EAST_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, 0x1D03, 0x1D, "Saria's Roof East Heart", RHT_KOKIRI_FOREST_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_SARIAS_ROOF_NORTH_HEART] = Location::Collectable(RC_KF_SARIAS_ROOF_NORTH_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, 0x1E03, 0x1E, "Saria's Roof North Heart", RHT_KOKIRI_FOREST_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_SOUTH_GRASS_WEST_RUPEE] = Location::Collectable(RC_KF_SOUTH_GRASS_WEST_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, 0x2400, 0x24, "South Grass West Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SOUTH_GRASS_WEST_RUPEE), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_NORTH_GRASS_WEST_RUPEE] = Location::Collectable(RC_KF_NORTH_GRASS_WEST_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, 0x2500, 0x25, "North Grass West Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_NORTH_GRASS_WEST_RUPEE), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_NORTH_GRASS_EAST_RUPEE] = Location::Collectable(RC_KF_NORTH_GRASS_EAST_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, 0x2600, 0x26, "North Grass East Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_NORTH_GRASS_EAST_RUPEE), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_SOUTH_GRASS_EAST_RUPEE] = Location::Collectable(RC_KF_SOUTH_GRASS_EAST_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, 0x2700, 0x27, "South Grass East Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SOUTH_GRASS_EAST_RUPEE), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_SARIAS_TOP_LEFT_HEART] = Location::Collectable(RC_KF_SARIAS_TOP_LEFT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_SARIAS_HOUSE, 0x3803, 0x38, "Saria's House Top Left Heart", RHT_SARIAS_HOUSE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SARIAS_TOP_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_SARIAS_TOP_RIGHT_HEART] = Location::Collectable(RC_KF_SARIAS_TOP_RIGHT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_SARIAS_HOUSE, 0x3903, 0x39, "Saria's House Top Right Heart", RHT_SARIAS_HOUSE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SARIAS_TOP_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_SARIAS_BOTTOM_LEFT_HEART] = Location::Collectable(RC_KF_SARIAS_BOTTOM_LEFT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_SARIAS_HOUSE, 0x3A03, 0x3A, "Saria's House Bottom Left Heart", RHT_SARIAS_HOUSE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SARIAS_BOTTOM_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_SARIAS_BOTTOM_RIGHT_HEART] = Location::Collectable(RC_KF_SARIAS_BOTTOM_RIGHT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_SARIAS_HOUSE, 0x3B03, 0x3B, "Saria's House Bottom Right Heart", RHT_SARIAS_HOUSE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_SARIAS_BOTTOM_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + + locationTable[RC_KF_BEAN_RUPEE_1] = Location::Collectable(RC_KF_BEAN_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1269, -528), 0, "Bean Platform Rupee 1", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RUPEE_1), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_BEAN_RUPEE_2] = Location::Collectable(RC_KF_BEAN_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1269, -567), 0, "Bean Platform Rupee 2", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RUPEE_2), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_BEAN_RUPEE_3] = Location::Collectable(RC_KF_BEAN_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1304, -588), 0, "Bean Platform Rupee 3", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RUPEE_3), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_BEAN_RUPEE_4] = Location::Collectable(RC_KF_BEAN_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1338, -567), 0, "Bean Platform Rupee 4", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RUPEE_4), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_BEAN_RUPEE_5] = Location::Collectable(RC_KF_BEAN_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1338, -528), 0, "Bean Platform Rupee 5", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RUPEE_5), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_BEAN_RUPEE_6] = Location::Collectable(RC_KF_BEAN_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1304, -508), 0, "Bean Platform Rupee 6", RHT_KOKIRI_FOREST_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RUPEE_6), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_BEAN_RED_RUPEE] = Location::Collectable(RC_KF_BEAN_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1304, -548), 0, "Bean Platform Red Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RED_RUPEE), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + + locationTable[RC_LW_BOULDER_RUPEE] = Location::Collectable(RC_LW_BOULDER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x1301, 0x13, "Boulder Rupee", RHT_LOST_WOODS_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_1] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3400, 0x34, "Underwater Shortcut Rupee 1", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_1), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_2] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3500, 0x35, "Underwater Shortcut Rupee 2", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_2), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_3] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3600, 0x36, "Underwater Shortcut Rupee 3", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_3), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_4] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3700, 0x37, "Underwater Shortcut Rupee 4", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_4), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_5] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3900, 0x39, "Underwater Shortcut Rupee 5", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_5), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_6] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3A00, 0x3A, "Underwater Shortcut Rupee 6", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_6), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_7] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_7, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3B00, 0x3B, "Underwater Shortcut Rupee 7", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_7), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_8] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_8, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3C00, 0x3C, "Underwater Shortcut Rupee 8", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_8), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + + locationTable[RC_LH_FRONT_RUPEE] = Location::Collectable(RC_LH_FRONT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LAKE_HYLIA, ACTOR_EN_ITEM00, SCENE_LAKE_HYLIA, 0x2000, 0x20, "Underwater Front Rupee", RHT_LAKE_HYLIA_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_FRONT_RUPEE), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_MIDDLE_RUPEE] = Location::Collectable(RC_LH_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LAKE_HYLIA, ACTOR_EN_ITEM00, SCENE_LAKE_HYLIA, 0x2100, 0x21, "Underwater Middle Rupee", RHT_LAKE_HYLIA_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_BACK_RUPEE] = Location::Collectable(RC_LH_BACK_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LAKE_HYLIA, ACTOR_EN_ITEM00, SCENE_LAKE_HYLIA, 0x2200, 0x22, "Underwater Back Rupee", RHT_LAKE_HYLIA_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_BACK_RUPEE), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_LAB_FRONT_RUPEE] = Location::Collectable(RC_LH_LAB_FRONT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LAKE_HYLIA, ACTOR_EN_ITEM00, SCENE_LAKESIDE_LABORATORY, 0x0102, 0x01, "Lab Front Rupee", RHT_LABORATORY_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_LAB_LEFT_RUPEE] = Location::Collectable(RC_LH_LAB_LEFT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LAKE_HYLIA, ACTOR_EN_ITEM00, SCENE_LAKESIDE_LABORATORY, 0x0202, 0x02, "Lab Left Rupee", RHT_LABORATORY_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_LAB_RIGHT_RUPEE] = Location::Collectable(RC_LH_LAB_RIGHT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LAKE_HYLIA, ACTOR_EN_ITEM00, SCENE_LAKESIDE_LABORATORY, 0x0302, 0x03, "Lab Right Rupee", RHT_LABORATORY_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + + locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_1] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, 0x3800, 0x38, "Dampe's Grave Rupee 1", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_1), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_2] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, 0x3900, 0x39, "Dampe's Grave Rupee 2", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_2), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_3] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, 0x3A00, 0x3A, "Dampe's Grave Rupee 3", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_3), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_4] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, 0x3B00, 0x3B, "Dampe's Grave Rupee 4", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_4), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_5] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, 0x3C00, 0x3C, "Dampe's Grave Rupee 5", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_5), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_6] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, 0x3D00, 0x3D, "Dampe's Grave Rupee 6", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_6), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_7] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_7, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, 0x3E00, 0x3E, "Dampe's Grave Rupee 7", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_7), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_DAMPE_RACE_RUPEE_8] = Location::Collectable(RC_GRAVEYARD_DAMPE_RACE_RUPEE_8, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GRAVEYARD, ACTOR_EN_ITEM00, SCENE_WINDMILL_AND_DAMPES_GRAVE, 0x3F00, 0x3F, "Dampe's Grave Rupee 8", RHT_DAMPES_GRAVE_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GRAVEYARD_DAMPE_RACE_RUPEE_8), SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + + locationTable[RC_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, 0x3801, 0x38, "Octorok Grotto Front Left Blue Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, 0x3901, 0x39, "Octorok Grotto Back Blue Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, 0x3A01, 0x3A, "Octorok Grotto Front Right Blue Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, 0x3B00, 0x3B, "Octorok Grotto Front Left Green Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, 0x3C00, 0x3C, "Octorok Grotto Front Right Green Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, 0x3D00, 0x3D, "Octorok Grotto Back Left Green Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, 0x3E00, 0x3E, "Octorok Grotto Back Right Green Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GV_OCTOROK_GROTTO_RED_RUPEE] = Location::Collectable(RC_GV_OCTOROK_GROTTO_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_GERUDO_VALLEY, ACTOR_EN_ITEM00, SCENE_GROTTOS, 0x3F02, 0x3F, "Octorok Grotto Red Rupee", RHT_GERUDO_VALLEY_GROTTO_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GV_OCTOROK_GROTTO_RED_RUPEE), SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + + locationTable[RC_DMT_RED_RUPEE] = Location::Collectable(RC_DMT_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0A02, 0x0A, "Red Rupee Under Boulder", RHT_DEATH_MOUNTAIN_TRAIL_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_BLUE_RUPEE] = Location::Collectable(RC_DMT_BLUE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0701, 0x07, "Blue Rupee Under Boulder", RHT_DEATH_MOUNTAIN_TRAIL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_COW_GROTTO_LEFT_HEART] = Location::Collectable(RC_DMT_COW_GROTTO_LEFT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, 0x2803, 0x28, "Cow Grotto Left Heart", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_COW_GROTTO_MIDDLE_LEFT_HEART] = Location::Collectable(RC_DMT_COW_GROTTO_MIDDLE_LEFT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, 0x2903, 0x29, "Cow Grotto Middle Left Heart", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_MIDDLE_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART] = Location::Collectable(RC_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, 0x2A03, 0x2A, "Cow Grotto Middle Right Heart", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_COW_GROTTO_RIGHT_HEART] = Location::Collectable(RC_DMT_COW_GROTTO_RIGHT_HEART, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, 0x2B03, 0x2B, "Cow Grotto Right Heart", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_COW_GROTTO_RUPEE_1] = Location::Collectable(RC_DMT_COW_GROTTO_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2390, -100), 0, "Cow Grotto Rupee 1", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RUPEE_1), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_COW_GROTTO_RUPEE_2] = Location::Collectable(RC_DMT_COW_GROTTO_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2390, -139), 0, "Cow Grotto Rupee 2", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RUPEE_2), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_COW_GROTTO_RUPEE_3] = Location::Collectable(RC_DMT_COW_GROTTO_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2425, -160), 0, "Cow Grotto Rupee 3", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RUPEE_3), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_COW_GROTTO_RUPEE_4] = Location::Collectable(RC_DMT_COW_GROTTO_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2459, -139), 0, "Cow Grotto Rupee 4", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RUPEE_4), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_COW_GROTTO_RUPEE_5] = Location::Collectable(RC_DMT_COW_GROTTO_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2459, -100), 0, "Cow Grotto Rupee 5", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RUPEE_5), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_COW_GROTTO_RUPEE_6] = Location::Collectable(RC_DMT_COW_GROTTO_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2425, -80), 0, "Cow Grotto Rupee 6", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RUPEE_6), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_COW_GROTTO_RED_RUPEE] = Location::Collectable(RC_DMT_COW_GROTTO_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_TRAIL, ACTOR_EN_ITEM00, SCENE_GROTTOS, TWO_ACTOR_PARAMS(2425, -120), 0, "Cow Grotto Red Rupee", RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMT_COW_GROTTO_RED_RUPEE), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + + locationTable[RC_DMC_NEAR_PLATFORM_RED_RUPEE] = Location::Collectable(RC_DMC_NEAR_PLATFORM_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, 0x2002, 0x20, "Near Warp Platform Red Rupee", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_NEAR_PLATFORM_RED_RUPEE), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_MIDDLE_PLATFORM_RED_RUPEE] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, 0x2102, 0x21, "Middle Platform Red Rupee", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_RED_RUPEE), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, 0x2201, 0x22, "Middle Platform Blue Rupee 1", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, 0x2301, 0x23, "Middle Platform Blue Rupee 2", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, 0x2401, 0x24, "Middle Platform Blue Rupee 3", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, 0x2501, 0x25, "Middle Platform Blue Rupee 4", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, 0x2601, 0x26, "Middle Platform Blue Rupee 5", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6] = Location::Collectable(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, 0x2701, 0x27, "Middle Platform Blue Rupee 6", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_1] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1087, 454), 0, "Distant Platform Rupee 1", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_1), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_2] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1087, 415), 0, "Distant Platform Rupee 2", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_2), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_3] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1122, 395), 0, "Distant Platform Rupee 3", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_3), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_4] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1156, 415), 0, "Distant Platform Rupee 4", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_4), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_5] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1156, 454), 0, "Distant Platform Rupee 5", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_5), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_6] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1122, 475), 0, "Distant Platform Rupee 6", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RUPEE_6), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_DISTANT_PLATFORM_RED_RUPEE] = Location::Collectable(RC_DMC_DISTANT_PLATFORM_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_DEATH_MOUNTAIN_CRATER, ACTOR_EN_ITEM00, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(1122, 435), 0, "Distant Platform Red Rupee", RHT_DEATH_MOUNTAIN_CRATER_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DMC_DISTANT_PLATFORM_RED_RUPEE), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + + locationTable[RC_ZR_BENEATH_WATERFALL_LEFT_RUPEE] = Location::Collectable(RC_ZR_BENEATH_WATERFALL_LEFT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_RIVER, ACTOR_EN_ITEM00, SCENE_ZORAS_RIVER, 0x2002, 0x20, "Beneath Domain Red Left Rupee", RHT_ZORAS_RIVER_WATERFALL_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BENEATH_WATERFALL_LEFT_RUPEE), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE] = Location::Collectable(RC_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_RIVER, ACTOR_EN_ITEM00, SCENE_ZORAS_RIVER, 0x2102, 0x21, "Beneath Domain Red Middle Left Rupee", RHT_ZORAS_RIVER_WATERFALL_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE] = Location::Collectable(RC_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_RIVER, ACTOR_EN_ITEM00, SCENE_ZORAS_RIVER, 0x2202, 0x22, "Beneath Domain Red Middle Right Rupee", RHT_ZORAS_RIVER_WATERFALL_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_ZR_BENEATH_WATERFALL_RIGHT_RUPEE] = Location::Collectable(RC_ZR_BENEATH_WATERFALL_RIGHT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_RIVER, ACTOR_EN_ITEM00, SCENE_ZORAS_RIVER, 0x2302, 0x23, "Beneath Domain Red Right Rupee", RHT_ZORAS_RIVER_WATERFALL_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZR_BENEATH_WATERFALL_RIGHT_RUPEE), SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + + locationTable[RC_ZF_BOTTOM_NORTH_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTH_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2000, 0x20, "Bottom North Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTH_INNER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_NORTHEAST_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHEAST_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2100, 0x21, "Bottom Northeast Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHEAST_INNER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2200, 0x22, "Bottom Southeast Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_SOUTH_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTH_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2300, 0x23, "Bottom South Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTH_INNER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2400, 0x24, "Bottom Southwest Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_INNER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_NORTHWEST_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHWEST_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2500, 0x25, "Bottom Northwest Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_INNER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_NORTH_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTH_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2600, 0x26, "Bottom North Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTH_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2700, 0x27, "Bottom Northeast Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2800, 0x28, "Bottom Southeast Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2900, 0x29, "Bottom South Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2A00, 0x2A, "Bottom Southwest Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2B00, 0x2B, "Bottom Northwest Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_NORTH_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTH_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2C00, 0x2C, "Bottom North Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTH_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2D00, 0x2D, "Bottom Northeast Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2E00, 0x2E, "Bottom Southeast Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_SOUTH_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTH_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2F00, 0x2F, "Bottom South Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTH_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x3000, 0x30, "Bottom Southwest Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x3100, 0x31, "Bottom Northwest Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index a88fca1ad19..73c090381ca 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -278,6 +278,7 @@ typedef enum { RCTYPE_OCARINA, // Ocarina locations RCTYPE_BEEHIVE, // Beehives RCTYPE_FISH, + RCTYPE_FREESTANDING, // Freestanding rupees and hearts } RandomizerCheckType; typedef enum { RCQUEST_VANILLA, RCQUEST_MQ, RCQUEST_BOTH } RandomizerCheckQuest; @@ -1656,6 +1657,109 @@ typedef enum { RC_ZD_FISH_3, RC_ZD_FISH_4, RC_ZD_FISH_5, + RC_KF_BOULDER_RUPEE_1, + RC_KF_BOULDER_RUPEE_2, + RC_KF_BRIDGE_RUPEE, + RC_KF_BEHIND_MIDOS_RUPEE, + RC_KF_SARIAS_ROOF_WEST_HEART, + RC_KF_SARIAS_ROOF_EAST_HEART, + RC_KF_SARIAS_ROOF_NORTH_HEART, + RC_KF_SOUTH_GRASS_WEST_RUPEE, + RC_KF_NORTH_GRASS_WEST_RUPEE, + RC_KF_NORTH_GRASS_EAST_RUPEE, + RC_KF_SOUTH_GRASS_EAST_RUPEE, + RC_KF_SARIAS_TOP_LEFT_HEART, + RC_KF_SARIAS_TOP_RIGHT_HEART, + RC_KF_SARIAS_BOTTOM_LEFT_HEART, + RC_KF_SARIAS_BOTTOM_RIGHT_HEART, + RC_KF_BEAN_RUPEE_1, + RC_KF_BEAN_RUPEE_2, + RC_KF_BEAN_RUPEE_3, + RC_KF_BEAN_RUPEE_4, + RC_KF_BEAN_RUPEE_5, + RC_KF_BEAN_RUPEE_6, + RC_KF_BEAN_RED_RUPEE, + RC_LW_BOULDER_RUPEE, + RC_LW_SHORTCUT_RUPEE_1, + RC_LW_SHORTCUT_RUPEE_2, + RC_LW_SHORTCUT_RUPEE_3, + RC_LW_SHORTCUT_RUPEE_4, + RC_LW_SHORTCUT_RUPEE_5, + RC_LW_SHORTCUT_RUPEE_6, + RC_LW_SHORTCUT_RUPEE_7, + RC_LW_SHORTCUT_RUPEE_8, + RC_LH_FRONT_RUPEE, + RC_LH_MIDDLE_RUPEE, + RC_LH_BACK_RUPEE, + RC_LH_LAB_FRONT_RUPEE, + RC_LH_LAB_LEFT_RUPEE, + RC_LH_LAB_RIGHT_RUPEE, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_1, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_2, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_3, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_4, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_5, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_6, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_7, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_8, + RC_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE, + RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE, + RC_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE, + RC_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE, + RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE, + RC_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE, + RC_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE, + RC_GV_OCTOROK_GROTTO_RED_RUPEE, + RC_DMT_BLUE_RUPEE, + RC_DMT_RED_RUPEE, + RC_DMT_COW_GROTTO_LEFT_HEART, + RC_DMT_COW_GROTTO_MIDDLE_LEFT_HEART, + RC_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART, + RC_DMT_COW_GROTTO_RIGHT_HEART, + RC_DMT_COW_GROTTO_RUPEE_1, + RC_DMT_COW_GROTTO_RUPEE_2, + RC_DMT_COW_GROTTO_RUPEE_3, + RC_DMT_COW_GROTTO_RUPEE_4, + RC_DMT_COW_GROTTO_RUPEE_5, + RC_DMT_COW_GROTTO_RUPEE_6, + RC_DMT_COW_GROTTO_RED_RUPEE, + RC_DMC_NEAR_PLATFORM_RED_RUPEE, + RC_DMC_MIDDLE_PLATFORM_RED_RUPEE, + RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1, + RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2, + RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3, + RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4, + RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5, + RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6, + RC_DMC_DISTANT_PLATFORM_RED_RUPEE, + RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_1, + RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_2, + RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_3, + RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_4, + RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_5, + RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_6, + RC_ZR_BENEATH_WATERFALL_LEFT_RUPEE, + RC_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE, + RC_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE, + RC_ZR_BENEATH_WATERFALL_RIGHT_RUPEE, + RC_ZF_BOTTOM_NORTH_INNER_RUPEE, + RC_ZF_BOTTOM_NORTHEAST_INNER_RUPEE, + RC_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE, + RC_ZF_BOTTOM_SOUTH_INNER_RUPEE, + RC_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE, + RC_ZF_BOTTOM_NORTHWEST_INNER_RUPEE, + RC_ZF_BOTTOM_NORTH_MIDDLE_RUPEE, + RC_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE, + RC_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE, + RC_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE, + RC_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE, + RC_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE, + RC_ZF_BOTTOM_NORTH_OUTER_RUPEE, + RC_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE, + RC_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE, + RC_ZF_BOTTOM_SOUTH_OUTER_RUPEE, + RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, + RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, RC_MAX } RandomizerCheck; @@ -3643,6 +3747,29 @@ typedef enum { RHT_YOUR_POCKET, RHT_DUNGEON_ORDINARY, RHT_DUNGEON_MASTERFUL, + // Shuffle Rupees & Hearts + RHT_KOKIRI_FOREST_RUPEE, + RHT_KOKIRI_FOREST_HEART, + RHT_SARIAS_HOUSE_HEART, + RHT_LOST_WOODS_RUPEE, + RHT_LAKE_HYLIA_RUPEE, + RHT_LABORATORY_RUPEE, + RHT_DAMPES_GRAVE_RUPEE, + RHT_GERUDO_VALLEY_GROTTO_RUPEE, + RHT_DEATH_MOUNTAIN_TRAIL_RUPEE, + RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_HEART, + RHT_DEATH_MOUNTAIN_TRAIL_GROTTO_RUPEE, + RHT_DEATH_MOUNTAIN_CRATER_RUPEE, + RHT_ZORAS_RIVER_WATERFALL_RUPEE, + RHT_ZORAS_FOUNTAIN_RUPEE, + RHT_DEKU_TREE_HEART, + RHT_DODONGOS_CAVERN_HEART, + RHT_JABU_JABU_RUPEE, + RHT_FOREST_TEMPLE_HEART, + RHT_FIRE_TEMPLE_HEART, + RHT_SHADOW_TEMPLE_HEART, + RHT_BOTTOM_OF_THE_WELL_HEART, + RHT_GANONS_CASTLE_HEART, RHT_MAX } RandomizerHintTextKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 20aab303209..20c9ade5381 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -306,6 +306,101 @@ typedef enum { RAND_INF_CHILD_TRADES_MASK_ZORA, RAND_INF_CHILD_TRADES_MASK_GERUDO, RAND_INF_CHILD_TRADES_MASK_TRUTH, + + 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_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_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, + + 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, + + 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, + 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, + + 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, // 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, From f5bf04570be033cf459f065e46039ae0dfb138ad Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Wed, 7 Aug 2024 22:39:20 -0700 Subject: [PATCH 06/54] Add logic for overworld freestanding checks --- .../location_access/locacc_gerudo_valley.cpp | 12 +- .../location_access/locacc_hyrule_field.cpp | 12 +- .../location_access/locacc_kakariko.cpp | 8 ++ .../location_access/locacc_lost_woods.cpp | 41 ++++++- .../location_access/locacc_zoras_domain.cpp | 66 +++++++---- .../Enhancements/randomizer/location_list.cpp | 104 ++++++++++++++++++ 6 files changed, 211 insertions(+), 32 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp index 554003434a6..d421d17afd3 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp @@ -78,7 +78,17 @@ void AreaTable_Init_GerudoValley() { Entrance(RR_GV_FORTRESS_SIDE, {[]{return true;}}), }); - areaTable[RR_GV_OCTOROK_GROTTO] = Area("GV Octorok Grotto", "GV Octorok Grotto", RA_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_GV_OCTOROK_GROTTO] = Area("GV Octorok Grotto", "GV Octorok Grotto", RA_NONE, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE, logic->HasItem(RG_BRONZE_SCALE)), + LOCATION(RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE, logic->HasItem(RG_BRONZE_SCALE)), + LOCATION(RC_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE, logic->HasItem(RG_BRONZE_SCALE)), + LOCATION(RC_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE, logic->HasItem(RG_BRONZE_SCALE)), + LOCATION(RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE, logic->HasItem(RG_BRONZE_SCALE)), + LOCATION(RC_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE, logic->HasItem(RG_BRONZE_SCALE)), + LOCATION(RC_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE, logic->HasItem(RG_BRONZE_SCALE)), + LOCATION(RC_GV_OCTOROK_GROTTO_RED_RUPEE, logic->HasItem(RG_BRONZE_SCALE)), + }, { //Exits Entrance(RR_GV_GROTTO_LEDGE, {[]{return true;}}), }); diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp index 860b90e8b80..2e48a59b087 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp @@ -126,6 +126,9 @@ void AreaTable_Init_HyruleField() { LOCATION(RC_LH_GS_LAB_WALL, logic->IsChild && (logic->HookshotOrBoomerang || (randoCtx->GetTrickOption(RT_LH_LAB_WALL_GS) && logic->CanJumpslash)) && logic->AtNight && logic->CanGetNightTimeGS), LOCATION(RC_LH_GS_SMALL_ISLAND, logic->IsChild && logic->CanChildAttack && logic->AtNight && logic->CanGetNightTimeGS), LOCATION(RC_LH_GS_TREE, logic->IsAdult && logic->CanUse(RG_LONGSHOT) && logic->AtNight && logic->CanGetNightTimeGS), + LOCATION(RC_LH_FRONT_RUPEE, logic->IsChild && logic->HasItem(RG_BRONZE_SCALE)), + LOCATION(RC_LH_MIDDLE_RUPEE, logic->IsChild && (logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS))), + LOCATION(RC_LH_BACK_RUPEE, logic->IsChild && (logic->HasItem(RG_SILVER_SCALE) || logic->CanUse(RG_IRON_BOOTS))), LOCATION(RC_LH_LAB_GOSSIP_STONE, true), LOCATION(RC_LH_SOUTHEAST_GOSSIP_STONE, true), LOCATION(RC_LH_SOUTHWEST_GOSSIP_STONE, true), @@ -156,9 +159,12 @@ void AreaTable_Init_HyruleField() { EventAccess(&logic->EyedropsAccess, {[]{return logic->EyedropsAccess || (logic->IsAdult && (logic->EyeballFrogAccess || (logic->EyeballFrog && logic->DisableTradeRevert)));}}), }, { //Locations - LOCATION(RC_LH_LAB_DIVE, logic->ProgressiveScale >= 2 || (randoCtx->GetTrickOption(RT_LH_LAB_DIVING) && logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT))), - LOCATION(RC_LH_TRADE_FROG, logic->IsAdult && logic->EyeballFrog), - LOCATION(RC_LH_GS_LAB_CRATE, logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_LH_LAB_DIVE, logic->ProgressiveScale >= 2 || (randoCtx->GetTrickOption(RT_LH_LAB_DIVING) && logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT))), + LOCATION(RC_LH_TRADE_FROG, logic->IsAdult && logic->EyeballFrog), + LOCATION(RC_LH_GS_LAB_CRATE, logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_LH_LAB_FRONT_RUPEE, logic->CanUse(RG_IRON_BOOTS) || logic->HasItem(RG_GOLDEN_SCALE)), + LOCATION(RC_LH_LAB_LEFT_RUPEE, logic->CanUse(RG_IRON_BOOTS) || logic->HasItem(RG_GOLDEN_SCALE)), + LOCATION(RC_LH_LAB_RIGHT_RUPEE, logic->CanUse(RG_IRON_BOOTS) || logic->HasItem(RG_GOLDEN_SCALE)), }, { //Exits Entrance(RR_LAKE_HYLIA, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp index 708163784e2..2c20d212ed8 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp @@ -262,6 +262,14 @@ void AreaTable_Init_Kakariko() { //Locations LOCATION(RC_GRAVEYARD_HOOKSHOT_CHEST, true), LOCATION(RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, logic->IsAdult || randoCtx->GetTrickOption(RT_GY_CHILD_DAMPE_RACE_POH)), + LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_1, true), + LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_2, true), + LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_3, true), + LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_4, true), + LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_5, true), + LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_6, true), + LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_7, true), + LOCATION(RC_GRAVEYARD_DAMPE_RACE_RUPEE_8, true), }, { //Exits Entrance(RR_THE_GRAVEYARD, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp index 2f9732b461a..4a278652550 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp @@ -11,11 +11,26 @@ void AreaTable_Init_LostWoods() { EventAccess(&logic->ShowedMidoSwordAndShield, {[]{return logic->ShowedMidoSwordAndShield || (logic->IsChild && logic->KokiriSword && logic->DekuShield);}}), }, { //Locations - LOCATION(RC_KF_KOKIRI_SWORD_CHEST, logic->IsChild), - LOCATION(RC_KF_GS_KNOW_IT_ALL_HOUSE, logic->IsChild && logic->CanChildAttack && logic->AtNight && (/*TODO: HasNightStart ||*/ logic->CanLeaveForest || logic->CanUse(RG_SUNS_SONG)) && logic->CanGetNightTimeGS), - LOCATION(RC_KF_GS_BEAN_PATCH, logic->CanPlantBugs && logic->CanChildAttack), - LOCATION(RC_KF_GS_HOUSE_OF_TWINS, logic->IsAdult && logic->AtNight && (logic->HookshotOrBoomerang || (randoCtx->GetTrickOption(RT_KF_ADULT_GS) && logic->CanUse(RG_HOVER_BOOTS))) && logic->CanGetNightTimeGS), - LOCATION(RC_KF_GOSSIP_STONE, true), + LOCATION(RC_KF_KOKIRI_SWORD_CHEST, logic->IsChild), + LOCATION(RC_KF_GS_KNOW_IT_ALL_HOUSE, logic->IsChild && logic->CanChildAttack && logic->AtNight && (/*TODO: HasNightStart ||*/ logic->CanLeaveForest || logic->CanUse(RG_SUNS_SONG)) && logic->CanGetNightTimeGS), + LOCATION(RC_KF_GS_BEAN_PATCH, logic->CanPlantBugs && logic->CanChildAttack), + LOCATION(RC_KF_GS_HOUSE_OF_TWINS, logic->IsAdult && logic->AtNight && (logic->HookshotOrBoomerang || (randoCtx->GetTrickOption(RT_KF_ADULT_GS) && logic->CanUse(RG_HOVER_BOOTS))) && logic->CanGetNightTimeGS), + LOCATION(RC_KF_BRIDGE_RUPEE, logic->IsChild), + LOCATION(RC_KF_BEHIND_MIDOS_RUPEE, logic->IsChild), + LOCATION(RC_KF_SOUTH_GRASS_WEST_RUPEE, logic->IsChild), + LOCATION(RC_KF_SOUTH_GRASS_EAST_RUPEE, logic->IsChild), + LOCATION(RC_KF_NORTH_GRASS_WEST_RUPEE, logic->IsChild), + LOCATION(RC_KF_NORTH_GRASS_EAST_RUPEE, logic->IsChild), + LOCATION(RC_KF_BOULDER_RUPEE_1, logic->IsChild), + LOCATION(RC_KF_BOULDER_RUPEE_2, logic->IsChild), + LOCATION(RC_KF_BEAN_RUPEE_1, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST) || logic->CanUse(RG_HOVER_BOOTS))), + LOCATION(RC_KF_BEAN_RUPEE_2, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST) || logic->CanUse(RG_HOVER_BOOTS))), + LOCATION(RC_KF_BEAN_RUPEE_3, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST) || logic->CanUse(RG_HOVER_BOOTS))), + LOCATION(RC_KF_BEAN_RUPEE_4, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST) || logic->CanUse(RG_HOVER_BOOTS))), + LOCATION(RC_KF_BEAN_RUPEE_5, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST) || logic->CanUse(RG_HOVER_BOOTS))), + LOCATION(RC_KF_BEAN_RUPEE_6, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST) || logic->CanUse(RG_HOVER_BOOTS))), + LOCATION(RC_KF_BEAN_RED_RUPEE, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST) || logic->CanUse(RG_HOVER_BOOTS))), + LOCATION(RC_KF_GOSSIP_STONE, true), }, { //Exits Entrance(RR_KF_LINKS_HOUSE, {[]{return true;}}), @@ -64,7 +79,13 @@ void AreaTable_Init_LostWoods() { Entrance(RR_KOKIRI_FOREST, {[]{return true;}}), }); - areaTable[RR_KF_SARIAS_HOUSE] = Area("KF Saria's House", "KF Saria's House", RA_NONE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_KF_SARIAS_HOUSE] = Area("KF Saria's House", "KF Saria's House", RA_NONE, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_KF_SARIAS_TOP_LEFT_HEART, true), + LOCATION(RC_KF_SARIAS_TOP_RIGHT_HEART, true), + LOCATION(RC_KF_SARIAS_BOTTOM_LEFT_HEART, true), + LOCATION(RC_KF_SARIAS_BOTTOM_RIGHT_HEART, true), + }, { //Exits Entrance(RR_KOKIRI_FOREST, {[]{return true;}}), }); @@ -135,6 +156,14 @@ void AreaTable_Init_LostWoods() { LOCATION(RC_LW_TARGET_IN_WOODS, logic->IsChild && logic->CanUse(RG_FAIRY_SLINGSHOT)), LOCATION(RC_LW_DEKU_SCRUB_NEAR_BRIDGE, logic->IsChild && logic->CanStunDeku), LOCATION(RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE, logic->CanPlantBugs && logic->CanChildAttack), + LOCATION(RC_LW_SHORTCUT_RUPEE_1, logic->IsChild && logic->HasItem(RG_SILVER_SCALE)), + LOCATION(RC_LW_SHORTCUT_RUPEE_2, logic->IsChild && logic->HasItem(RG_SILVER_SCALE)), + LOCATION(RC_LW_SHORTCUT_RUPEE_3, logic->IsChild && logic->HasItem(RG_SILVER_SCALE)), + LOCATION(RC_LW_SHORTCUT_RUPEE_4, logic->IsChild && logic->HasItem(RG_SILVER_SCALE)), + LOCATION(RC_LW_SHORTCUT_RUPEE_5, logic->IsChild && logic->HasItem(RG_SILVER_SCALE)), + LOCATION(RC_LW_SHORTCUT_RUPEE_6, logic->IsChild && logic->HasItem(RG_SILVER_SCALE)), + LOCATION(RC_LW_SHORTCUT_RUPEE_7, logic->IsChild && logic->HasItem(RG_SILVER_SCALE)), + LOCATION(RC_LW_SHORTCUT_RUPEE_8, logic->IsChild && logic->HasItem(RG_SILVER_SCALE)), LOCATION(RC_LW_GOSSIP_STONE, true), }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp index 2344c13a80b..3e4480cb6c7 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp @@ -21,21 +21,25 @@ void AreaTable_Init_ZorasDomain() { EventAccess(&logic->BugShrub, {[]{return logic->BugShrub || logic->CanCutShrubs;}}), }, { //Locations - LOCATION(RC_ZR_MAGIC_BEAN_SALESMAN, logic->ChildsWallet && logic->IsChild), - LOCATION(RC_ZR_FROGS_OCARINA_GAME, logic->IsChild && logic->CanUse(RG_ZELDAS_LULLABY) && logic->CanUse(RG_SARIAS_SONG) && logic->CanUse(RG_SUNS_SONG) && logic->CanUse(RG_EPONAS_SONG) && logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_ZR_FROGS_IN_THE_RAIN, logic->IsChild && logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_ZR_FROGS_ZELDAS_LULLABY, logic->IsChild && logic->CanUse(RG_ZELDAS_LULLABY)), - LOCATION(RC_ZR_FROGS_EPONAS_SONG, logic->IsChild && logic->CanUse(RG_EPONAS_SONG)), - LOCATION(RC_ZR_FROGS_SARIAS_SONG, logic->IsChild && logic->CanUse(RG_SARIAS_SONG)), - LOCATION(RC_ZR_FROGS_SUNS_SONG, logic->IsChild && logic->CanUse(RG_SUNS_SONG)), - LOCATION(RC_ZR_FROGS_SONG_OF_TIME, logic->IsChild && logic->CanUse(RG_SONG_OF_TIME)), - LOCATION(RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, logic->IsChild || logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && randoCtx->GetTrickOption(RT_ZR_LOWER))), - LOCATION(RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, logic->IsChild || logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && randoCtx->GetTrickOption(RT_ZR_UPPER))), - LOCATION(RC_ZR_GS_LADDER, logic->IsChild && logic->AtNight && logic->CanChildAttack && logic->CanGetNightTimeGS), - LOCATION(RC_ZR_GS_NEAR_RAISED_GROTTOS, logic->IsAdult && logic->HookshotOrBoomerang && logic->AtNight && logic->CanGetNightTimeGS), - LOCATION(RC_ZR_GS_ABOVE_BRIDGE, logic->IsAdult && logic->CanUse(RG_HOOKSHOT) && logic->AtNight && logic->CanGetNightTimeGS), - LOCATION(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, true), - LOCATION(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, true), + LOCATION(RC_ZR_MAGIC_BEAN_SALESMAN, logic->ChildsWallet && logic->IsChild), + LOCATION(RC_ZR_FROGS_OCARINA_GAME, logic->IsChild && logic->CanUse(RG_ZELDAS_LULLABY) && logic->CanUse(RG_SARIAS_SONG) && logic->CanUse(RG_SUNS_SONG) && logic->CanUse(RG_EPONAS_SONG) && logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_ZR_FROGS_IN_THE_RAIN, logic->IsChild && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_ZR_FROGS_ZELDAS_LULLABY, logic->IsChild && logic->CanUse(RG_ZELDAS_LULLABY)), + LOCATION(RC_ZR_FROGS_EPONAS_SONG, logic->IsChild && logic->CanUse(RG_EPONAS_SONG)), + LOCATION(RC_ZR_FROGS_SARIAS_SONG, logic->IsChild && logic->CanUse(RG_SARIAS_SONG)), + LOCATION(RC_ZR_FROGS_SUNS_SONG, logic->IsChild && logic->CanUse(RG_SUNS_SONG)), + LOCATION(RC_ZR_FROGS_SONG_OF_TIME, logic->IsChild && logic->CanUse(RG_SONG_OF_TIME)), + LOCATION(RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, logic->IsChild || logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && randoCtx->GetTrickOption(RT_ZR_LOWER))), + LOCATION(RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, logic->IsChild || logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && randoCtx->GetTrickOption(RT_ZR_UPPER))), + LOCATION(RC_ZR_GS_LADDER, logic->IsChild && logic->AtNight && logic->CanChildAttack && logic->CanGetNightTimeGS), + LOCATION(RC_ZR_GS_NEAR_RAISED_GROTTOS, logic->IsAdult && logic->HookshotOrBoomerang && logic->AtNight && logic->CanGetNightTimeGS), + LOCATION(RC_ZR_GS_ABOVE_BRIDGE, logic->IsAdult && logic->CanUse(RG_HOOKSHOT) && logic->AtNight && logic->CanGetNightTimeGS), + LOCATION(RC_ZR_BENEATH_WATERFALL_LEFT_RUPEE, logic->IsAdult), + LOCATION(RC_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE, logic->IsAdult), + LOCATION(RC_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE, logic->IsAdult), + LOCATION(RC_ZR_BENEATH_WATERFALL_RIGHT_RUPEE, logic->IsAdult), + LOCATION(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, true), + LOCATION(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, true), }, { //Exits Entrance(RR_ZR_FRONT, {[]{return true;}}), @@ -153,13 +157,31 @@ void AreaTable_Init_ZorasDomain() { EventAccess(&logic->ButterflyFairy, {[]{return logic->ButterflyFairy || (logic->CanUse(RG_STICKS) && logic->AtDay);}}), }, { //Locations - LOCATION(RC_ZF_ICEBERC_FREESTANDING_POH, logic->IsAdult), - LOCATION(RC_ZF_BOTTOM_FREESTANDING_POH, logic->IsAdult && logic->IronBoots && logic->WaterTimer >= 24), - LOCATION(RC_ZF_GS_TREE, logic->IsChild), - LOCATION(RC_ZF_GS_ABOVE_THE_LOG, logic->IsChild && logic->HookshotOrBoomerang && logic->AtNight && logic->CanGetNightTimeGS), - LOCATION(RC_ZF_GS_HIDDEN_CAVE, logic->CanUse(RG_SILVER_GAUNTLETS) && logic->CanBlastOrSmash && logic->HookshotOrBoomerang && logic->IsAdult && logic->AtNight && logic->CanGetNightTimeGS), - LOCATION(RC_ZF_FAIRY_GOSSIP_STONE, true), - LOCATION(RC_ZF_JABU_GOSSIP_STONE, true), + LOCATION(RC_ZF_ICEBERC_FREESTANDING_POH, logic->IsAdult), + LOCATION(RC_ZF_BOTTOM_FREESTANDING_POH, logic->IsAdult && logic->IronBoots && logic->WaterTimer >= 24), + LOCATION(RC_ZF_GS_TREE, logic->IsChild), + LOCATION(RC_ZF_GS_ABOVE_THE_LOG, logic->IsChild && logic->HookshotOrBoomerang && logic->AtNight && logic->CanGetNightTimeGS), + LOCATION(RC_ZF_GS_HIDDEN_CAVE, logic->CanUse(RG_SILVER_GAUNTLETS) && logic->CanBlastOrSmash && logic->HookshotOrBoomerang && logic->IsAdult && logic->AtNight && logic->CanGetNightTimeGS), + LOCATION(RC_ZF_BOTTOM_NORTH_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_NORTHEAST_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_SOUTH_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_NORTHWEST_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_NORTHWEST_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_NORTH_MIDDLE_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_NORTH_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_SOUTH_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_FAIRY_GOSSIP_STONE, true), + LOCATION(RC_ZF_JABU_GOSSIP_STONE, true), }, { //Exits Entrance(RR_ZD_BEHIND_KING_ZORA, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 7ecba2e3ed7..693273ba96b 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -505,6 +505,110 @@ std::vector Rando::StaticData::overworldLocations = { RC_LH_GROTTO_BEEHIVE, RC_GV_DEKU_SCRUB_GROTTO_BEEHIVE, RC_COLOSSUS_GROTTO_BEEHIVE, + + RC_KF_BOULDER_RUPEE_2, + RC_KF_BOULDER_RUPEE_1, + RC_KF_BRIDGE_RUPEE, + RC_KF_BEHIND_MIDOS_RUPEE, + RC_KF_SARIAS_ROOF_WEST_HEART, + RC_KF_SARIAS_ROOF_EAST_HEART, + RC_KF_SARIAS_ROOF_NORTH_HEART, + RC_KF_SOUTH_GRASS_WEST_RUPEE, + RC_KF_NORTH_GRASS_WEST_RUPEE, + RC_KF_NORTH_GRASS_EAST_RUPEE, + RC_KF_SOUTH_GRASS_EAST_RUPEE, + RC_KF_SARIAS_TOP_LEFT_HEART, + RC_KF_SARIAS_TOP_RIGHT_HEART, + RC_KF_SARIAS_BOTTOM_LEFT_HEART, + RC_KF_SARIAS_BOTTOM_RIGHT_HEART, + RC_KF_BEAN_RUPEE_1, + RC_KF_BEAN_RUPEE_2, + RC_KF_BEAN_RUPEE_3, + RC_KF_BEAN_RUPEE_4, + RC_KF_BEAN_RUPEE_5, + RC_KF_BEAN_RUPEE_6, + RC_KF_BEAN_RED_RUPEE, + RC_LW_BOULDER_RUPEE, + RC_LW_SHORTCUT_RUPEE_1, + RC_LW_SHORTCUT_RUPEE_2, + RC_LW_SHORTCUT_RUPEE_3, + RC_LW_SHORTCUT_RUPEE_4, + RC_LW_SHORTCUT_RUPEE_5, + RC_LW_SHORTCUT_RUPEE_6, + RC_LW_SHORTCUT_RUPEE_7, + RC_LW_SHORTCUT_RUPEE_8, + RC_LH_FRONT_RUPEE, + RC_LH_MIDDLE_RUPEE, + RC_LH_BACK_RUPEE, + RC_LH_LAB_FRONT_RUPEE, + RC_LH_LAB_LEFT_RUPEE, + RC_LH_LAB_RIGHT_RUPEE, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_1, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_2, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_3, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_4, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_5, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_6, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_7, + RC_GRAVEYARD_DAMPE_RACE_RUPEE_8, + RC_GV_OCTOROK_GROTTO_FRONT_LEFT_BLUE_RUPEE, + RC_GV_OCTOROK_GROTTO_BACK_BLUE_RUPEE, + RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_BLUE_RUPEE, + RC_GV_OCTOROK_GROTTO_FRONT_LEFT_GREEN_RUPEE, + RC_GV_OCTOROK_GROTTO_FRONT_RIGHT_GREEN_RUPEE, + RC_GV_OCTOROK_GROTTO_BACK_LEFT_GREEN_RUPEE, + RC_GV_OCTOROK_GROTTO_BACK_RIGHT_GREEN_RUPEE, + RC_GV_OCTOROK_GROTTO_RED_RUPEE, + RC_DMT_RED_RUPEE, + RC_DMT_BLUE_RUPEE, + RC_DMT_COW_GROTTO_LEFT_HEART, + RC_DMT_COW_GROTTO_MIDDLE_LEFT_HEART, + RC_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART, + RC_DMT_COW_GROTTO_RIGHT_HEART, + RC_DMT_COW_GROTTO_RUPEE_1, + RC_DMT_COW_GROTTO_RUPEE_2, + RC_DMT_COW_GROTTO_RUPEE_3, + RC_DMT_COW_GROTTO_RUPEE_4, + RC_DMT_COW_GROTTO_RUPEE_5, + RC_DMT_COW_GROTTO_RUPEE_6, + RC_DMT_COW_GROTTO_RED_RUPEE, + RC_DMC_NEAR_PLATFORM_RED_RUPEE, + RC_DMC_MIDDLE_PLATFORM_RED_RUPEE, + RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1, + RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2, + RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3, + RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4, + RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5, + RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6, + RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_1, + RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_2, + RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_3, + RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_4, + RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_5, + RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_6, + RC_DMC_DISTANT_PLATFORM_RED_RUPEE, + RC_ZR_BENEATH_WATERFALL_LEFT_RUPEE, + RC_ZR_BENEATH_WATERFALL_MIDDLE_LEFT_RUPEE, + RC_ZR_BENEATH_WATERFALL_MIDDLE_RIGHT_RUPEE, + RC_ZR_BENEATH_WATERFALL_RIGHT_RUPEE, + RC_ZF_BOTTOM_NORTH_INNER_RUPEE, + RC_ZF_BOTTOM_NORTHEAST_INNER_RUPEE, + RC_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE, + RC_ZF_BOTTOM_SOUTH_INNER_RUPEE, + RC_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE, + RC_ZF_BOTTOM_NORTHWEST_INNER_RUPEE, + RC_ZF_BOTTOM_NORTH_MIDDLE_RUPEE, + RC_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE, + RC_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE, + RC_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE, + RC_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE, + RC_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE, + RC_ZF_BOTTOM_NORTH_OUTER_RUPEE, + RC_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE, + RC_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE, + RC_ZF_BOTTOM_SOUTH_OUTER_RUPEE, + RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, + RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, }; std::vector Rando::StaticData::gossipStoneLocations = { From 0cac9ca4ec1d479a880b85ef2761be7f0748da71 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 8 Aug 2024 01:10:55 -0700 Subject: [PATCH 07/54] Add freestanding items for child dungeons. --- .../randomizer/3drando/item_pool.cpp | 32 ++++++++++++++----- .../location_access/locacc_deku_tree.cpp | 26 +++++++++++---- .../locacc_dodongos_cavern.cpp | 14 ++++++-- .../locacc_jabujabus_belly.cpp | 5 +++ soh/soh/Enhancements/randomizer/dungeon.cpp | 23 +++++++++++++ .../Enhancements/randomizer/location_list.cpp | 28 ++++++++++++++++ .../Enhancements/randomizer/randomizerTypes.h | 24 ++++++++++++++ .../Enhancements/randomizer/randomizer_inf.h | 19 +++++++++++ 8 files changed, 155 insertions(+), 16 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index a35d619fe7c..01827c0cd37 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -618,6 +618,29 @@ static void PlaceVanillaOverworldFish() { } } +static void PlaceFreestandingItems() { + auto ctx = Rando::Context::GetInstance(); + for (RandomizerCheck loc : ctx->GetLocations(Rando::StaticData::overworldLocations, Category::cFreestanding)) { + RandomizerGet vanillaItem = Rando::StaticData::GetLocation(loc)->GetVanillaItem(); + if (ctx->GetOption(RSK_SHUFFLE_FREESTANDING)) { + AddItemToMainPool(vanillaItem); + } else { + ctx->PlaceItemInLocation(loc, vanillaItem, false, true); + } + } + + for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { + for (RandomizerCheck loc : ctx->GetLocations(dungeon->GetDungeonLocations(), Category::cFreestanding)) { + RandomizerGet vanillaItem = Rando::StaticData::GetLocation(loc)->GetVanillaItem(); + if (ctx->GetOption(RSK_SHUFFLE_FREESTANDING)) { + AddItemToMainPool(vanillaItem); + } else { + ctx->PlaceItemInLocation(loc, vanillaItem, false, true); + } + } + } +} + static void SetScarceItemPool() { ReplaceMaxItem(RG_PROGRESSIVE_BOMBCHUS, 3); ReplaceMaxItem(RG_BOMBCHU_5, 1); @@ -1210,14 +1233,7 @@ void GenerateItemPool() { PlaceVanillaDekuScrubItems(); } - for (RandomizerCheck loc : ctx->GetLocations(ctx->allLocations, Category::cFreestanding)) { - RandomizerGet vanillaItem = Rando::StaticData::GetLocation(loc)->GetVanillaItem(); - if (ctx->GetOption(RSK_SHUFFLE_FREESTANDING)) { - AddItemToMainPool(vanillaItem); - } else { - ctx->PlaceItemInLocation(loc, vanillaItem, false, true); - } - } + PlaceFreestandingItems(); AddItemsToPool(ItemPool, alwaysItems); AddItemsToPool(ItemPool, dungeonRewards); diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_deku_tree.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_deku_tree.cpp index dd7c665f735..6833a0d099f 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_deku_tree.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_deku_tree.cpp @@ -25,7 +25,9 @@ void AreaTable_Init_DekuTree() { EventAccess(&logic->DekuBabaNuts, {[]{return logic->DekuBabaNuts || (logic->CanJumpslash || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_MEGATON_HAMMER) || logic->HasExplosives || logic->CanUse(RG_DINS_FIRE));}}), }, { //Locations - LOCATION(RC_DEKU_TREE_MAP_CHEST, true), + LOCATION(RC_DEKU_TREE_MAP_CHEST, true), + LOCATION(RC_DEKU_TREE_LOBBY_LOWER_HEART, true), + LOCATION(RC_DEKU_TREE_LOBBY_UPPER_HEART, logic->CanChildAttack || logic->CanAdultAttack), }, { //Exits Entrance(RR_DEKU_TREE_ENTRYWAY, {[]{return true;}}), @@ -144,7 +146,11 @@ void AreaTable_Init_DekuTree() { Entrance(RR_DEKU_TREE_OUTSIDE_BOSS_ROOM, {[]{return Here(RR_DEKU_TREE_BASEMENT_UPPER, []{return logic->HasFireSourceWithTorch || (randoCtx->GetTrickOption(RT_DEKU_B1_BOW_WEBS) && logic->IsAdult && logic->CanUse(RG_FAIRY_BOW));});}}), }); - areaTable[RR_DEKU_TREE_OUTSIDE_BOSS_ROOM] = Area("Deku Tree Outside Boss Room", "Deku Tree", RA_DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DEKU_TREE_OUTSIDE_BOSS_ROOM] = Area("Deku Tree Outside Boss Room", "Deku Tree", RA_DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, { + LOCATION(RC_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, logic->HasItem(RG_BRONZE_SCALE)), + LOCATION(RC_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, logic->HasItem(RG_BRONZE_SCALE)), + LOCATION(RC_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, logic->HasItem(RG_BRONZE_SCALE)), + }, { //Exits Entrance(RR_DEKU_TREE_BASEMENT_UPPER, {[]{return true;}}), Entrance(RR_DEKU_TREE_BOSS_ENTRYWAY, {[]{return (logic->Swim || Here(RR_DEKU_TREE_OUTSIDE_BOSS_ROOM, []{return logic->CanUse(RG_IRON_BOOTS);})) && Here(RR_DEKU_TREE_OUTSIDE_BOSS_ROOM, []{return logic->HasShield;});}}), @@ -166,6 +172,9 @@ void AreaTable_Init_DekuTree() { LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, logic->HasFireSourceWithTorch || (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW))), LOCATION(RC_DEKU_TREE_MQ_BASEMENT_CHEST, logic->HasFireSourceWithTorch || (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW))), LOCATION(RC_DEKU_TREE_MQ_GS_LOBBY, logic->CanAdultAttack || logic->CanChildAttack), + LOCATION(RC_DEKU_TREE_MQ_LOBBY_HEART, true), + LOCATION(RC_DEKU_TREE_MQ_DEKU_BABA_HEART, logic->HasFireSourceWithTorch || (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW))), + LOCATION(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART, true), }, { //Exits Entrance(RR_DEKU_TREE_ENTRYWAY, {[]{return true;}}), @@ -178,11 +187,13 @@ void AreaTable_Init_DekuTree() { areaTable[RR_DEKU_TREE_MQ_COMPASS_ROOM] = Area("Deku Tree MQ Compass Room", "Deku Tree", RA_DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, { //Locations - LOCATION(RC_DEKU_TREE_MQ_COMPASS_CHEST, true), - LOCATION(RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, logic->HookshotOrBoomerang && + LOCATION(RC_DEKU_TREE_MQ_COMPASS_CHEST, true), + LOCATION(RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, logic->HookshotOrBoomerang && Here(RR_DEKU_TREE_MQ_COMPASS_ROOM, []{return logic->HasBombchus || (logic->Bombs && (logic->CanUse(RG_SONG_OF_TIME) || logic->IsAdult)) || (logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER) && (logic->CanUse(RG_SONG_OF_TIME) || randoCtx->GetTrickOption(RT_DEKU_MQ_COMPASS_GS)));})), + LOCATION(RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, logic->HasBombchus || (logic->Bombs && (logic->CanUse(RG_SONG_OF_TIME) || logic->IsAdult)) || + (logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER) && (logic->CanUse(RG_SONG_OF_TIME) || randoCtx->GetTrickOption(RT_DEKU_MQ_COMPASS_GS)))), }, { //Exits Entrance(RR_DEKU_TREE_MQ_LOBBY, {[]{return true;}}), @@ -232,8 +243,11 @@ void AreaTable_Init_DekuTree() { }); areaTable[RR_DEKU_TREE_MQ_OUTSIDE_BOSS_ROOM] = - Area("Deku Tree MQ Outside Boss Room", "Deku Tree", RA_DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, {}, - { + Area("Deku Tree MQ Outside Boss Room", "Deku Tree", RA_DEKU_TREE, NO_DAY_NIGHT_CYCLE, {}, { + LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART, logic->HasItem(RG_BRONZE_SCALE)), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART, logic->HasItem(RG_BRONZE_SCALE)), + LOCATION(RC_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART, logic->HasItem(RG_BRONZE_SCALE)), + }, { // Exits Entrance(RR_DEKU_TREE_MQ_BASEMENT_LEDGE, {[]{ return true; }}), Entrance(RR_DEKU_TREE_BOSS_ENTRYWAY, {[]{return (logic->Swim || Here(RR_DEKU_TREE_MQ_BASEMENT_LEDGE, []{return logic->CanUse(RG_IRON_BOOTS);})) && Here(RR_DEKU_TREE_MQ_BASEMENT_LEDGE, [] { return logic->HasShield; }); } }), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_dodongos_cavern.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_dodongos_cavern.cpp index 7cb2dbf0aa7..7f244b9981c 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_dodongos_cavern.cpp @@ -74,7 +74,10 @@ void AreaTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, {[]{return true;}}), }); - areaTable[RR_DODONGOS_CAVERN_LOWER_LIZALFOS] = Area("Dodongos Cavern Lower Lizalfos", "Dodongos Cavern", RA_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_LOWER_LIZALFOS] = Area("Dodongos Cavern Lower Lizalfos", "Dodongos Cavern", RA_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART, true), + }, { //Exits Entrance(RR_DODONGOS_CAVERN_NEAR_LOWER_LIZALFOS, {[]{return Here(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, []{return logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_MEGATON_HAMMER) || logic->HasExplosives;});}}), @@ -131,6 +134,7 @@ void AreaTable_Init_DodongosCavern() { areaTable[RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER] = Area("Dodongos Cavern Bomb Room Lower", "Dodongos Cavern", RA_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, true), + LOCATION(RC_DODONGOS_CAVERN_BLADE_ROOM_HEART, true), }, { //Exits Entrance(RR_DODONGOS_CAVERN_2F_SIDE_ROOM, {[]{return Here(RR_DODONGOS_CAVERN_BOMB_ROOM_LOWER, []{return logic->CanBlastOrSmash || (randoCtx->GetTrickOption(RT_DC_SCRUB_ROOM) && logic->GoronBracelet);});}}), @@ -153,7 +157,11 @@ void AreaTable_Init_DodongosCavern() { Entrance(RR_DODONGOS_CAVERN_UPPER_LIZALFOS, {[]{return logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW) || randoCtx->GetTrickOption(RT_DC_SLINGSHOT_SKIP);}}), }); - areaTable[RR_DODONGOS_CAVERN_UPPER_LIZALFOS] = Area("Dodongos Cavern Upper Lizalfos", "Dodongos Cavern", RA_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_DODONGOS_CAVERN_UPPER_LIZALFOS] = Area("Dodongos Cavern Upper Lizalfos", "Dodongos Cavern", RA_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, true), + LOCATION(RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, true), + }, { //Exits Entrance(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, {[]{return true;}}), Entrance(RR_DODONGOS_CAVERN_FIRST_SLINGSHOT_ROOM, {[]{return Here(RR_DODONGOS_CAVERN_LOWER_LIZALFOS, []{return logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || @@ -226,6 +234,7 @@ void AreaTable_Init_DodongosCavern() { LOCATION(RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, logic->CanAdultAttack || logic->CanChildAttack || logic->Nuts), LOCATION(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, (logic->IsChild && logic->CanUse(RG_STICKS)) || logic->HasFireSource), LOCATION(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, logic->CanBlastOrSmash || (logic->IsChild && logic->CanUse(RG_STICKS)) || logic->CanUse(RG_DINS_FIRE) || (logic->IsAdult && (randoCtx->GetTrickOption(RT_DC_JUMP) || logic->HoverBoots || logic->Hookshot))), + LOCATION(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART, logic->CanBlastOrSmash || (logic->IsChild && logic->CanUse(RG_STICKS)) || logic->CanUse(RG_DINS_FIRE) || (logic->IsAdult && (randoCtx->GetTrickOption(RT_DC_JUMP) || logic->HoverBoots || logic->Hookshot))), LOCATION(RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, logic->CanUse(RG_SONG_OF_TIME) && (logic->CanChildAttack || logic->CanAdultAttack)), LOCATION(RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, (logic->IsChild && logic->CanUse(RG_STICKS)) || logic->HasFireSource), LOCATION(RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, logic->CanBlastOrSmash), @@ -245,6 +254,7 @@ void AreaTable_Init_DodongosCavern() { areaTable[RR_DODONGOS_CAVERN_MQ_LOWER_RIGHT_SIDE] = Area("Dodongos Cavern MQ Lower Right Side", "Dodongos Cavern", RA_DODONGOS_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { //Locations LOCATION(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, logic->CanStunDeku), + LOCATION(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_HEART, true), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_BOMB_BAG_AREA, {[]{return (Here(RR_DODONGOS_CAVERN_MQ_LOWER_RIGHT_SIDE, []{return logic->IsAdult && logic->CanUse(RG_FAIRY_BOW);}) || logic->GoronBracelet || diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_jabujabus_belly.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_jabujabus_belly.cpp index 2e4b881644b..120abfdf3c5 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_jabujabus_belly.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_jabujabus_belly.cpp @@ -183,6 +183,11 @@ void AreaTable_Init_JabuJabusBelly() { LOCATION(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, true), LOCATION(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_MEGATON_HAMMER) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_STICKS) || logic->Bombs), LOCATION(RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, logic->CanUse(RG_SONG_OF_TIME) || (randoCtx->GetTrickOption(RT_JABU_MQ_SOT_GS) && logic->IsChild && logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, true), + LOCATION(RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, true), + LOCATION(RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_1, logic->HasItem(RG_GOLDEN_SCALE)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_2, logic->HasItem(RG_SILVER_SCALE)), + LOCATION(RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3, logic->HasItem(RG_BRONZE_SCALE)), //Trick: logic->CanUse(RG_SONG_OF_TIME) || (LogicJabuMQSoTGS && logic->IsChild && logic->CanUse(RG_BOOMERANG)) }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index 0f799b03646..7d756ce105e 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -175,6 +175,11 @@ Dungeons::Dungeons() { RC_DEKU_TREE_GS_BASEMENT_GATE, RC_DEKU_TREE_GS_BASEMENT_VINES, RC_DEKU_TREE_GS_COMPASS_ROOM, + RC_DEKU_TREE_LOBBY_LOWER_HEART, + RC_DEKU_TREE_LOBBY_UPPER_HEART, + RC_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, + RC_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, + RC_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, }, { // MQ Locations @@ -190,6 +195,13 @@ Dungeons::Dungeons() { RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, + RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, + RC_DEKU_TREE_MQ_DEKU_BABA_HEART, + RC_DEKU_TREE_MQ_LOBBY_HEART, + RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART, + RC_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART, + RC_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART, + RC_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART, }, {}, { @@ -215,6 +227,10 @@ Dungeons::Dungeons() { RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, RC_DODONGOS_CAVERN_GS_BACK_ROOM, RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, + RC_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART, + RC_DODONGOS_CAVERN_BLADE_ROOM_HEART, + RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, + RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, }, { // MQ Locations @@ -233,6 +249,8 @@ Dungeons::Dungeons() { RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, + RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_HEART, + RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART, }, {}, { @@ -272,6 +290,11 @@ Dungeons::Dungeons() { RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, + RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_1, + RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_2, + RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3, + RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, + RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, }, {}, { diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 693273ba96b..dd7c04a545f 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1733,6 +1733,34 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x3000, 0x30, "Bottom Southwest Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x3100, 0x31, "Bottom Northwest Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_DEKU_TREE_LOBBY_LOWER_HEART] = Location::Collectable(RC_DEKU_TREE_LOBBY_LOWER_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2C03, 0x2C, "Lobby Lower Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_LOWER_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_LOBBY_UPPER_HEART] = Location::Collectable(RC_DEKU_TREE_LOBBY_UPPER_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2D03, 0x2D, "Lobby Upper Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_UPPER_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_BEFORE_BOSS_LEFT_HEART] = Location::Collectable(RC_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2E03, 0x2E, "Final Room Left Front Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART] = Location::Collectable(RC_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x3003, 0x30, "Final Room Left Back Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART] = Location::Collectable(RC_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x3103, 0x31, "Final Room Right Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + + locationTable[RC_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DODONGOS_CAVERN, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, 0x1803, 0x18, "Lower Lizalfos Room Lavafall Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_BLADE_ROOM_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_BLADE_ROOM_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DODONGOS_CAVERN, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, 0x3003, 0x30, "Blade Room Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_ROOM_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DODONGOS_CAVERN, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, 0x2503, 0x25, "Upper Lizalfos Room Left Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DODONGOS_CAVERN, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, 0x2403, 0x24, "Upper Lizalfos Room Right Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + + locationTable[RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2203, 0x22, "MQ Compass Room Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_MQ_DEKU_BABA_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_DEKU_BABA_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2303, 0x23, "MQ Deku Baba Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_MQ_LOBBY_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_LOBBY_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2403, 0x24, "MQ Lobby Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2603, 0x26, "MQ Slingshot Room Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2E03, 0x2E, "MQ Final Room Left Front Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x3003, 0x30, "MQ Final Room Left Back Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + locationTable[RC_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x3103, 0x31, "MQ Final Room Right Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); + + locationTable[RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DODONGOS_CAVERN, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, 0x1803, 0x18, "MQ Lizalfos Room Lavafall Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DODONGOS_CAVERN, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, 0x3003, 0x30, "MQ Torch Room Invisible Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + + locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_1] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_1, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_ITEM00, SCENE_JABU_JABU, 0x0100, 0x01, "MQ Lift Room Underwater Rupee 1", RHT_JABU_JABU_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_2] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_2, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_ITEM00, SCENE_JABU_JABU, 0x0200, 0x02, "MQ Lift Room Underwater Rupee 2", RHT_JABU_JABU_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_ITEM00, SCENE_JABU_JABU, 0x0300, 0x03, "MQ Lift Room Underwater Rupee 3", RHT_JABU_JABU_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_ITEM00, SCENE_JABU_JABU, 0x2703, 0x27, "MQ Lift Room Heart 1", RHT_JABU_JABU_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_1), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_ITEM00, SCENE_JABU_JABU, 0x2803, 0x28, "MQ Lift Room Heart 2", RHT_JABU_JABU_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_2), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); locationTable[RC_DMT_GOSSIP_STONE] = Location::HintStone(RC_DMT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 14340, 0x04, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 73c090381ca..32152ed7e27 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1760,6 +1760,29 @@ typedef enum { RC_ZF_BOTTOM_SOUTH_OUTER_RUPEE, RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, + RC_DEKU_TREE_LOBBY_LOWER_HEART, + RC_DEKU_TREE_LOBBY_UPPER_HEART, + RC_DEKU_TREE_BEFORE_BOSS_LEFT_HEART, + RC_DEKU_TREE_BEFORE_BOSS_MIDDLE_HEART, + RC_DEKU_TREE_BEFORE_BOSS_RIGHT_HEART, + RC_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART, + RC_DODONGOS_CAVERN_BLADE_ROOM_HEART, + RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, + RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, + RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, + RC_DEKU_TREE_MQ_DEKU_BABA_HEART, + RC_DEKU_TREE_MQ_LOBBY_HEART, + RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_HEART, + RC_DEKU_TREE_MQ_BEFORE_BOSS_LEFT_HEART, + RC_DEKU_TREE_MQ_BEFORE_BOSS_MIDDLE_HEART, + RC_DEKU_TREE_MQ_BEFORE_BOSS_RIGHT_HEART, + RC_DODONGOS_CAVERN_MQ_LIZALFOS_ROOM_HEART, + RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_HEART, + RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_1, + RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_2, + RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3, + RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, + RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, RC_MAX } RandomizerCheck; @@ -3765,6 +3788,7 @@ typedef enum { RHT_DEKU_TREE_HEART, RHT_DODONGOS_CAVERN_HEART, RHT_JABU_JABU_RUPEE, + RHT_JABU_JABU_HEART, RHT_FOREST_TEMPLE_HEART, RHT_FIRE_TEMPLE_HEART, RHT_SHADOW_TEMPLE_HEART, diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 20c9ade5381..8fbd66850ba 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -401,6 +401,25 @@ typedef enum { RAND_INF_ZF_BOTTOM_SOUTH_OUTER_RUPEE, RAND_INF_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, + + 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_BLADE_ROOM_HEART, + RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, + RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_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_TORCH_PUZZLE_ROOM_HEART, + RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, + RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, // 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, From 169580e570f73dbc96955fc25a6eef705262a80b Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Mon, 12 Aug 2024 23:54:18 -0700 Subject: [PATCH 08/54] Add checks for Ice Cavern and Bottom of the Well --- .../locacc_bottom_of_the_well.cpp | 14 ++++++++++ .../location_access/locacc_ice_cavern.cpp | 7 +++++ soh/soh/Enhancements/randomizer/dungeon.cpp | 21 +++++++++++++++ .../Enhancements/randomizer/location_list.cpp | 26 ++++++++++++++++++- .../Enhancements/randomizer/randomizerTypes.h | 24 +++++++++++++++++ .../Enhancements/randomizer/randomizer_inf.h | 16 ++++++++++++ 6 files changed, 107 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp index 4f5ab4086b6..0b9509d9ca6 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp @@ -42,6 +42,13 @@ void AreaTable_Init_BottomOfTheWell() { LOCATION(RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, logic->Boomerang && (randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 3)), LOCATION(RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, logic->Boomerang && (randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 3)), LOCATION(RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 3) && (randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->Boomerang), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_RIGHT_RUPEE, randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_RIGHT_RUPEE, randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)), + LOCATION(RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_FRONT_LEFT_HEART, (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_ZELDAS_LULLABY)) && logic->Sticks || logic->CanUse(RG_DINS_FIRE)), + LOCATION(RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART, (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_ZELDAS_LULLABY)) && logic->Sticks || logic->CanUse(RG_DINS_FIRE)), }, { //Exits Entrance(RR_BOTTOM_OF_THE_WELL_ENTRYWAY, {[]{return true;}}), @@ -62,6 +69,13 @@ void AreaTable_Init_BottomOfTheWell() { //Trick: logic->HasExplosives || (LogicBotWMQDeadHandKey && logic->Boomerang) LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, logic->CanChildAttack), LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, logic->CanChildAttack && logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 2)), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, logic->HasExplosives), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, logic->HasExplosives), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART, true), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART, true), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART, true), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 2)), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART, logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 2)), }, { //Exits Entrance(RR_BOTTOM_OF_THE_WELL_ENTRYWAY, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp index 7f5873ba17a..26e216c7163 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp @@ -38,6 +38,13 @@ void AreaTable_Init_IceCavern() { LOCATION(RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, logic->HookshotOrBoomerang), LOCATION(RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, logic->BlueFire && logic->HookshotOrBoomerang), LOCATION(RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, logic->BlueFire && (logic->HookshotOrBoomerang || (randoCtx->GetTrickOption(RT_ICE_BLOCK_GS) && logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)))), + LOCATION(RC_ICE_CAVERN_LOBBY_RUPEE, logic->BlueFire), + LOCATION(RC_ICE_CAVERN_MAP_ROOM_LEFT_HEART, logic->IsAdult), + LOCATION(RC_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, logic->IsAdult), + LOCATION(RC_ICE_CAVERN_MAP_ROOM_RIGHT_HEART, logic->IsAdult), + LOCATION(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1, logic->BlueFire && logic->CanUse(RG_SONG_OF_TIME)), + LOCATION(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, logic->BlueFire && logic->CanUse(RG_SONG_OF_TIME)), + LOCATION(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, logic->BlueFire && logic->CanUse(RG_SONG_OF_TIME)), }, {}); } diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index 7d756ce105e..f11a0e55689 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -594,6 +594,13 @@ Dungeons::Dungeons() { RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, + RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, + RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, + RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, + RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_RIGHT_RUPEE, + RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_RIGHT_RUPEE, + RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_FRONT_LEFT_HEART, + RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART, }, { // MQ Locations @@ -605,6 +612,13 @@ Dungeons::Dungeons() { RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, + RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, + RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, + RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, + RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART, + RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART, + RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART, + RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART, }, {}, {}); dungeonList[ICE_CAVERN] = DungeonInfo("Ice Cavern", RHT_ICE_CAVERN, RG_ICE_CAVERN_MAP, RG_ICE_CAVERN_COMPASS, @@ -618,6 +632,13 @@ Dungeons::Dungeons() { RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, + RC_ICE_CAVERN_LOBBY_RUPEE, + RC_ICE_CAVERN_MAP_ROOM_LEFT_HEART, + RC_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, + RC_ICE_CAVERN_MAP_ROOM_RIGHT_HEART, + RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1, + RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, + RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, }, { // MQ Locations diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index dd7c04a545f..62cdb42c15e 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1741,9 +1741,25 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_LOWER_LIZALFOS_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DODONGOS_CAVERN, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, 0x1803, 0x18, "Lower Lizalfos Room Lavafall Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); locationTable[RC_DODONGOS_CAVERN_BLADE_ROOM_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_BLADE_ROOM_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DODONGOS_CAVERN, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, 0x3003, 0x30, "Blade Room Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_BLADE_ROOM_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); - locationTable[RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DODONGOS_CAVERN, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, 0x2503, 0x25, "Upper Lizalfos Room Left Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DODONGOS_CAVERN, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, 0x2503, 0x25, "Upper Lizalfos Room Left Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); locationTable[RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DODONGOS_CAVERN, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, 0x2403, 0x24, "Upper Lizalfos Room Right Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0501, 0x05, "Basement Platform Left Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0601, 0x06, "Basement Platform Back Left Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0201, 0x02, "Basement Platform Middle Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_RIGHT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_RIGHT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0301, 0x03, "Basement Platform Back Right Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_RIGHT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_RIGHT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0401, 0x04, "Basement Platform Right Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_FRONT_LEFT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_FRONT_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x1F03, 0x1F, "Coffin Room Front Left Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2003, 0x20, "Coffin Room Middle Right Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + + locationTable[RC_ICE_CAVERN_LOBBY_RUPEE] = Location::Collectable(RC_ICE_CAVERN_LOBBY_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_ICE_CAVERN, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, 0x2101, 0x21, "Lobby Rupee", RHT_ICE_CAVERN_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_LOBBY_RUPEE), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[RC_ICE_CAVERN_MAP_ROOM_LEFT_HEART] = Location::Collectable(RC_ICE_CAVERN_MAP_ROOM_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_ICE_CAVERN, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, 0x2203, 0x22, "Map Room Left Heart", RHT_ICE_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MAP_ROOM_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[RC_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART] = Location::Collectable(RC_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_ICE_CAVERN, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, 0x2303, 0x23, "Map Room Middle Heart", RHT_ICE_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[RC_ICE_CAVERN_MAP_ROOM_RIGHT_HEART] = Location::Collectable(RC_ICE_CAVERN_MAP_ROOM_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_ICE_CAVERN, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, 0x2403, 0x21, "Map Room Right Heart", RHT_ICE_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MAP_ROOM_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1] = Location::Collectable(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_ICE_CAVERN, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, 0x2E02, 0x2E, "Sliding Block Room Rupee 1", RHT_ICE_CAVERN_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2] = Location::Collectable(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_ICE_CAVERN, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, 0x2F02, 0x2F, "Sliding Block Room Rupee 2", RHT_ICE_CAVERN_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3] = Location::Collectable(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_ICE_CAVERN, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, 0x3002, 0x30, "Sliding Block Room Rupee 3", RHT_ICE_CAVERN_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2203, 0x22, "MQ Compass Room Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); locationTable[RC_DEKU_TREE_MQ_DEKU_BABA_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_DEKU_BABA_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2303, 0x23, "MQ Deku Baba Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); locationTable[RC_DEKU_TREE_MQ_LOBBY_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_LOBBY_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2403, 0x24, "MQ Lobby Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); @@ -1761,6 +1777,14 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_ITEM00, SCENE_JABU_JABU, 0x2703, 0x27, "MQ Lift Room Heart 1", RHT_JABU_JABU_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_1), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_ITEM00, SCENE_JABU_JABU, 0x2803, 0x28, "MQ Lift Room Heart 2", RHT_JABU_JABU_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_2), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2003, 0x22, "MQ Coffin Room Front Right Invisible Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2103, 0x21, "MQ Bomb Alcove Left Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2203, 0x22, "MQ Bomb Alcove Right Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2303, 0x23, "MQ Coffin Room Middle Left Invisible Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x3C03, 0x3C, "MQ Basement Hallway Front Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x3D03, 0x3D, "MQ Basement Hallway Left Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x3E03, 0x3E, "MQ Basement Hallway Right Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); locationTable[RC_DMT_GOSSIP_STONE] = Location::HintStone(RC_DMT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 14340, 0x04, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 32152ed7e27..2fa52f434b8 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1769,6 +1769,20 @@ typedef enum { RC_DODONGOS_CAVERN_BLADE_ROOM_HEART, RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, + RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, + RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, + RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, + RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_RIGHT_RUPEE, + RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_RIGHT_RUPEE, + RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_FRONT_LEFT_HEART, + RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART, + RC_ICE_CAVERN_LOBBY_RUPEE, + RC_ICE_CAVERN_MAP_ROOM_LEFT_HEART, + RC_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, + RC_ICE_CAVERN_MAP_ROOM_RIGHT_HEART, + RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1, + RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, + RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, RC_DEKU_TREE_MQ_DEKU_BABA_HEART, RC_DEKU_TREE_MQ_LOBBY_HEART, @@ -1783,6 +1797,13 @@ typedef enum { RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3, RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, + RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, + RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, + RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, + RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_MIDDLE_LEFT_HEART, + RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART, + RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART, + RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART, RC_MAX } RandomizerCheck; @@ -3793,6 +3814,9 @@ typedef enum { RHT_FIRE_TEMPLE_HEART, RHT_SHADOW_TEMPLE_HEART, RHT_BOTTOM_OF_THE_WELL_HEART, + RHT_BOTTOM_OF_THE_WELL_RUPEE, + RHT_ICE_CAVERN_HEART, + RHT_ICE_CAVERN_RUPEE, RHT_GANONS_CASTLE_HEART, RHT_MAX } RandomizerHintTextKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 8fbd66850ba..de0ef0202b6 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -410,6 +410,15 @@ typedef enum { 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_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_COFFIN_ROOM_MIDDLE_RIGHT_HEART, + RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART, RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART, RAND_INF_DEKU_TREE_MQ_LOBBY_HEART, @@ -420,6 +429,13 @@ typedef enum { 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_2, + 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, // 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, From ae172445f37d3c634990027bb8d5bcb12c7bcc0b Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Tue, 13 Aug 2024 19:34:18 -0700 Subject: [PATCH 09/54] Add checks for Forest Temple and Gerudo Training Grounds --- .../location_access/locacc_forest_temple.cpp | 12 +++++++++++- .../locacc_gerudo_training_grounds.cpp | 2 ++ soh/soh/Enhancements/randomizer/dungeon.cpp | 12 ++++++++++++ soh/soh/Enhancements/randomizer/location_list.cpp | 15 +++++++++++++++ soh/soh/Enhancements/randomizer/randomizerTypes.h | 14 ++++++++++++++ soh/soh/Enhancements/randomizer/randomizer_inf.h | 12 ++++++++++++ soh/soh/Enhancements/randomizer/settings.cpp | 1 + 7 files changed, 67 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_forest_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_forest_temple.cpp index 959c192eaad..df53062cc06 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_forest_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_forest_temple.cpp @@ -77,6 +77,8 @@ void AreaTable_Init_ForestTemple() { }, { //Locations LOCATION(RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, logic->CanUse(RG_LONGSHOT) || Here(RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER, []{return logic->HookshotOrBoomerang;})), + LOCATION(RC_FOREST_TEMPLE_COURTYARD_RIGHT_HEART, HasAccessTo(RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER) || (logic->CanUse(RG_BOOMERANG) && randoCtx->GetTrickOption(RT_FOREST_OUTDOORS_HEARTS_BOOMERANG))), + LOCATION(RC_FOREST_TEMPLE_COURTYARD_LEFT_HEART, HasAccessTo(RR_FOREST_TEMPLE_NW_OUTDOORS_UPPER) || (logic->CanUse(RG_BOOMERANG) && randoCtx->GetTrickOption(RT_FOREST_OUTDOORS_HEARTS_BOOMERANG))), }, { //Exits Entrance(RR_FOREST_TEMPLE_LOBBY, {[]{return logic->CanUse(RG_SONG_OF_TIME);}}), @@ -136,7 +138,9 @@ void AreaTable_Init_ForestTemple() { areaTable[RR_FOREST_TEMPLE_SEWER] = Area("Forest Temple Sewer", "Forest Temple", RA_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //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)), + LOCATION(RC_FOREST_TEMPLE_WELL_WEST_HEART, HasAccessTo(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER) || logic->CanUse(RG_IRON_BOOTS)), + LOCATION(RC_FOREST_TEMPLE_WELL_EAST_HEART, HasAccessTo(RR_FOREST_TEMPLE_NE_OUTDOORS_UPPER) || logic->CanUse(RG_IRON_BOOTS)), }, { //Exits Entrance(RR_FOREST_TEMPLE_NW_OUTDOORS_LOWER, {[]{return true;}}), @@ -328,6 +332,9 @@ void AreaTable_Init_ForestTemple() { areaTable[RR_FOREST_TEMPLE_MQ_NW_OUTDOORS] = Area("Forest Temple MQ NW Outdoors", "Forest Temple", RA_FOREST_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //Locations LOCATION(RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, logic->CanAdultAttack || logic->CanChildAttack), + LOCATION(RC_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART, HasAccessTo(RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE) || (logic->CanUse(RG_BOOMERANG) && randoCtx->GetTrickOption(RT_FOREST_OUTDOORS_HEARTS_BOOMERANG))), + LOCATION(RC_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART, HasAccessTo(RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE) || (logic->CanUse(RG_BOOMERANG) && randoCtx->GetTrickOption(RT_FOREST_OUTDOORS_HEARTS_BOOMERANG))), + LOCATION(RC_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART, HasAccessTo(RR_FOREST_TEMPLE_MQ_OUTDOOR_LEDGE) || (logic->CanUse(RG_BOOMERANG) && randoCtx->GetTrickOption(RT_FOREST_OUTDOORS_HEARTS_BOOMERANG))), }, { //Exits Entrance(RR_FOREST_TEMPLE_MQ_NE_OUTDOORS, {[]{return (logic->IsAdult && (logic->CanUse(RG_IRON_BOOTS) || logic->CanUse(RG_LONGSHOT) || (randoCtx->GetTrickOption(RT_FOREST_MQ_WELL_SWIM) && logic->CanUse(RG_HOOKSHOT)))) || logic->ProgressiveScale >= 2;}}), @@ -344,6 +351,9 @@ void AreaTable_Init_ForestTemple() { LOCATION(RC_FOREST_TEMPLE_MQ_WELL_CHEST, (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW)) || (logic->IsChild && logic->CanUse(RG_FAIRY_SLINGSHOT))), LOCATION(RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, logic->HookshotOrBoomerang || (logic->IsAdult && logic->CanUse(RG_FIRE_ARROWS) && (logic->CanUse(RG_SONG_OF_TIME) || (logic->CanUse(RG_HOVER_BOOTS) && randoCtx->GetTrickOption(RT_FOREST_DOORFRAME))))), LOCATION(RC_FOREST_TEMPLE_MQ_GS_WELL, (logic->IsAdult && ((logic->CanUse(RG_IRON_BOOTS) && logic->CanUse(RG_HOOKSHOT)) || logic->CanUse(RG_FAIRY_BOW))) || (logic->IsChild && logic->CanUse(RG_FAIRY_SLINGSHOT))), + LOCATION(RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART, logic->CanUse(RG_IRON_BOOTS) || (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW)) || (logic->IsChild && logic->CanUse(RG_FAIRY_SLINGSHOT))), + LOCATION(RC_FOREST_TEMPLE_MQ_WELL_MIDDLE_HEART, logic->CanUse(RG_IRON_BOOTS) || (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW)) || (logic->IsChild && logic->CanUse(RG_FAIRY_SLINGSHOT))), + LOCATION(RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART, logic->CanUse(RG_IRON_BOOTS) || (logic->IsAdult && logic->CanUse(RG_FAIRY_BOW)) || (logic->IsChild && logic->CanUse(RG_FAIRY_SLINGSHOT))), }, { //Exits Entrance(RR_FOREST_TEMPLE_MQ_OUTDOORS_TOP_LEDGES, {[]{return logic->IsAdult && logic->CanUse(RG_HOOKSHOT) && (logic->CanUse(RG_LONGSHOT) || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_SONG_OF_TIME));}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp index c0a2ab2bc16..ed5595f8b24 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp @@ -25,6 +25,8 @@ void AreaTable_Init_GerudoTrainingGrounds() { LOCATION(RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT)), LOCATION(RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD)), LOCATION(RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, logic->HasExplosives && (logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD))), + LOCATION(RC_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, true), + LOCATION(RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, true), }, { //Exits Entrance(RR_GERUDO_TRAINING_GROUNDS_ENTRYWAY, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index f11a0e55689..8ab1e04d4bd 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -325,6 +325,10 @@ Dungeons::Dungeons() { RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, RC_FOREST_TEMPLE_GS_LOBBY, RC_FOREST_TEMPLE_GS_BASEMENT, + RC_FOREST_TEMPLE_COURTYARD_RIGHT_HEART, + RC_FOREST_TEMPLE_COURTYARD_LEFT_HEART, + RC_FOREST_TEMPLE_WELL_WEST_HEART, + RC_FOREST_TEMPLE_WELL_EAST_HEART, }, { // MQ Locations @@ -345,6 +349,12 @@ Dungeons::Dungeons() { RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, RC_FOREST_TEMPLE_MQ_GS_WELL, + RC_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART, + RC_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART, + RC_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART, + RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART, + RC_FOREST_TEMPLE_MQ_WELL_MIDDLE_HEART, + RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART, }, {}, { @@ -682,6 +692,8 @@ Dungeons::Dungeons() { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, + RC_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, + RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, }, { // MQ Locations diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 62cdb42c15e..392e85f5981 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1744,6 +1744,11 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DODONGOS_CAVERN, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, 0x2503, 0x25, "Upper Lizalfos Room Left Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); locationTable[RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART] = Location::Collectable(RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DODONGOS_CAVERN, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, 0x2403, 0x24, "Upper Lizalfos Room Right Heart", RHT_DODONGOS_CAVERN_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_FOREST_TEMPLE_COURTYARD_RIGHT_HEART] = Location::Collectable(RC_FOREST_TEMPLE_COURTYARD_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x2D03, 0x2D, "West Courtyard Right Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_COURTYARD_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[RC_FOREST_TEMPLE_COURTYARD_LEFT_HEART] = Location::Collectable(RC_FOREST_TEMPLE_COURTYARD_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x2E03, 0x2E, "West Courtyard Left Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_COURTYARD_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[RC_FOREST_TEMPLE_WELL_WEST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_WELL_WEST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x2F03, 0x2F, "Well East Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_WEST_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[RC_FOREST_TEMPLE_WELL_EAST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_WELL_EAST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x3003, 0x30, "Well West Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_EAST_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0501, 0x05, "Basement Platform Left Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0601, 0x06, "Basement Platform Back Left Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0201, 0x02, "Basement Platform Middle Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); @@ -1760,6 +1765,9 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2] = Location::Collectable(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_ICE_CAVERN, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, 0x2F02, 0x2F, "Sliding Block Room Rupee 2", RHT_ICE_CAVERN_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); locationTable[RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3] = Location::Collectable(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_ICE_CAVERN, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, 0x3002, 0x30, "Sliding Block Room Rupee 3", RHT_ICE_CAVERN_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[RC_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART] = Location::Collectable(RC_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, 0x2203, 0x22, "Beamos South Heart", RHT_GERUDO_TRAINING_GROUNDS_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART), SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART] = Location::Collectable(RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, 0x2303, 0x23, "Beamos East Heart", RHT_GERUDO_TRAINING_GROUNDS_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART), SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2203, 0x22, "MQ Compass Room Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); locationTable[RC_DEKU_TREE_MQ_DEKU_BABA_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_DEKU_BABA_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2303, 0x23, "MQ Deku Baba Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); locationTable[RC_DEKU_TREE_MQ_LOBBY_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_LOBBY_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2403, 0x24, "MQ Lobby Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_LOBBY_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); @@ -1777,6 +1785,13 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_ITEM00, SCENE_JABU_JABU, 0x2703, 0x27, "MQ Lift Room Heart 1", RHT_JABU_JABU_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_1), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); locationTable[RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2] = Location::Collectable(RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_JABU_JABUS_BELLY, ACTOR_EN_ITEM00, SCENE_JABU_JABU, 0x2803, 0x28, "MQ Lift Room Heart 2", RHT_JABU_JABU_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_JABU_JABUS_BELLY_MQ_LIFT_HEART_2), SpoilerCollectionCheckGroup::GROUP_DUNGEON_JABUJABUS_BELLY); + locationTable[RC_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x2D03, 0x2D, "MQ West Courtyard Right Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x2E03, 0x2E, "MQ West Courtyard Middle Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x2F03, 0x2F, "MQ West Courtyard Left Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x3803, 0x38, "MQ Well Middle Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_MQ_WEST_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_FOREST_TEMPLE_MQ_WELL_MIDDLE_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_WELL_MIDDLE_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x3903, 0x39, "MQ Well West Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_MQ_MIDDLE_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x3A03, 0x3A, "MQ Well East Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_MQ_EAST_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2003, 0x22, "MQ Coffin Room Front Right Invisible Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2103, 0x21, "MQ Bomb Alcove Left Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2203, 0x22, "MQ Bomb Alcove Right Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 2fa52f434b8..568f4bd4c02 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1769,6 +1769,10 @@ typedef enum { RC_DODONGOS_CAVERN_BLADE_ROOM_HEART, RC_DODONGOS_CAVERN_UPPER_LIZALFOS_LEFT_HEART, RC_DODONGOS_CAVERN_UPPER_LIZALFOS_RIGHT_HEART, + RC_FOREST_TEMPLE_COURTYARD_RIGHT_HEART, + RC_FOREST_TEMPLE_COURTYARD_LEFT_HEART, + RC_FOREST_TEMPLE_WELL_WEST_HEART, + RC_FOREST_TEMPLE_WELL_EAST_HEART, RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, @@ -1783,6 +1787,8 @@ typedef enum { RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1, RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, + RC_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, + RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, RC_DEKU_TREE_MQ_DEKU_BABA_HEART, RC_DEKU_TREE_MQ_LOBBY_HEART, @@ -1797,6 +1803,12 @@ typedef enum { RC_JABU_JABUS_BELLY_MQ_LIFT_RUPEE_3, RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_1, RC_JABU_JABUS_BELLY_MQ_LIFT_HEART_2, + RC_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART, + RC_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART, + RC_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART, + RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART, + RC_FOREST_TEMPLE_MQ_WELL_MIDDLE_HEART, + RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART, RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, @@ -1904,6 +1916,7 @@ typedef enum { RT_FOREST_OUTDOORS_LEDGE, RT_FOREST_DOORFRAME, RT_FOREST_OUTSIDE_BACKDOOR, + RT_FOREST_OUTDOORS_HEARTS_BOOMERANG, RT_FOREST_MQ_WELL_SWIM, RT_FOREST_MQ_BLOCK_PUZZLE, RT_FOREST_MQ_JS_HALLWAY_SWITCH, @@ -3817,6 +3830,7 @@ typedef enum { RHT_BOTTOM_OF_THE_WELL_RUPEE, RHT_ICE_CAVERN_HEART, RHT_ICE_CAVERN_RUPEE, + RHT_GERUDO_TRAINING_GROUNDS_HEART, RHT_GANONS_CASTLE_HEART, RHT_MAX } RandomizerHintTextKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index de0ef0202b6..a8ada3df7a4 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -410,6 +410,10 @@ typedef enum { 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_ICE_CAVERN_LOBBY_RUPEE, RAND_INF_ICE_CAVERN_MAP_ROOM_LEFT_HEART, RAND_INF_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, @@ -418,6 +422,8 @@ typedef enum { RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, 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_DEKU_TREE_MQ_COMPASS_ROOM_HEART, RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART, @@ -429,6 +435,12 @@ typedef enum { 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_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_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, diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index c7548d3e5b1..6fe181619d0 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -326,6 +326,7 @@ void Settings::CreateOptions() { mTrickOptions[RT_FOREST_OUTDOORS_LEDGE] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, false, "Forest Temple NE Outdoors Ledge with Hover Boots", "With precise Hover Boots movement you can fall down to this ledge from upper balconies. If done precisely enough, it is not necessary to take fall damage. In MQ, this skips a Longshot requirement. In Vanilla, this can skip a Hookshot requirement in entrance randomizer."); mTrickOptions[RT_FOREST_DOORFRAME] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::ADVANCED}, false, "Forest Temple East Courtyard Door Frame with Hover Boots", "A precise Hover Boots movement from the upper balconies in this courtyard can be used to get on top of the door frame. Applies to both Vanilla and Master Quest. In Vanilla, from on top the door frame you can summon Pierre, allowing you to access the falling ceiling room early. In Master Quest, this allows you to obtain the GS on the door frame as adult without Hookshot or Song of Time."); mTrickOptions[RT_FOREST_OUTSIDE_BACKDOOR] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::ADVANCED}, false, "Forest Temple Outside Backdoor with Jump Slash", "A jump slash recoil can be used to reach the ledge in the block puzzle room that leads to the west courtyard. This skips a potential Hover Boots requirement in vanilla, and it can sometimes apply in MQ as well. This trick can be performed as both ages."); + mTrickOptions[RT_FOREST_OUTDOORS_HEARTS_BOOMERANG] = TrickOption::LogicTrick(RCQUEST_BOTH, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, false, "Forest Temple Outside Hearts with Boomerang", "A well aimed boomerang from the water's edge can reach the hearts from ground level. If unable to swim, you can back away from the water while the boomerang is returning so the hearts land on the ground."); mTrickOptions[RT_FOREST_MQ_WELL_SWIM] = TrickOption::LogicTrick(RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::ADVANCED}, false, "Swim Through Forest Temple MQ Well with Hookshot", "Shoot the vines in the well as low and as far to the right as possible, and then immediately swim under the ceiling to the right. This can only be required if Forest Temple is in its Master Quest form."); mTrickOptions[RT_FOREST_MQ_BLOCK_PUZZLE] = TrickOption::LogicTrick(RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, false, "Skip Forest Temple MQ Block Puzzle with Bombchu", "Send the Bombchu straight up the center of the wall directly to the left upon entering the room."); mTrickOptions[RT_FOREST_MQ_JS_HALLWAY_SWITCH] = TrickOption::LogicTrick(RCQUEST_MQ, RA_FOREST_TEMPLE, {Tricks::Tag::NOVICE}, false, "Forest Temple MQ Twisted Hallway Switch with Jump Slash", "The switch to twist the hallway can be hit with a jump slash through the glass block. To get in front of the switch, either use the Hover Boots or hit the shortcut switch at the top of the room and jump from the glass blocks that spawn. Sticks can be used as child, but the Kokiri Sword is too short to reach through the glass."); From 2a58e47754ebcd13f02728d35ecf544035834bd1 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Tue, 13 Aug 2024 23:35:36 -0700 Subject: [PATCH 10/54] Add checks for Fire Temple and Water Temple --- .../location_access/locacc_fire_temple.cpp | 21 +++++++++++++--- .../location_access/locacc_water_temple.cpp | 8 ++++-- soh/soh/Enhancements/randomizer/dungeon.cpp | 16 ++++++++++++ .../Enhancements/randomizer/location_list.cpp | 25 ++++++++++++++++--- .../Enhancements/randomizer/randomizerTypes.h | 17 +++++++++++++ .../Enhancements/randomizer/randomizer_inf.h | 16 ++++++++++++ 6 files changed, 95 insertions(+), 8 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp index b3c2e5387d1..531d911a178 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp @@ -123,7 +123,12 @@ void AreaTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_BIG_LAVA_ROOM, {[]{return true;}}), }); - areaTable[RR_FIRE_TEMPLE_FIRE_PILLAR_ROOM] = Area("Fire Temple Fire Pillar Room", "Fire Temple", RA_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_FIRE_PILLAR_ROOM] = Area("Fire Temple Fire Pillar Room", "Fire Temple", RA_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART, logic->FireTimer >= 56), + LOCATION(RC_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART, logic->FireTimer >= 56), + LOCATION(RC_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART, logic->FireTimer >= 56), + }, { //Exits Entrance(RR_FIRE_TEMPLE_BIG_LAVA_ROOM, {[]{return logic->SmallKeys(RR_FIRE_TEMPLE, 3);}}), Entrance(RR_FIRE_TEMPLE_SHORTCUT_ROOM, {[]{return logic->FireTimer >= 56 && logic->SmallKeys(RR_FIRE_TEMPLE, 4);}}), @@ -165,7 +170,12 @@ void AreaTable_Init_FireTemple() { Entrance(RR_FIRE_TEMPLE_BOULDER_MAZE_LOWER, {[]{return true;}}), }); - areaTable[RR_FIRE_TEMPLE_EAST_CENTRAL_ROOM] = Area("Fire Temple East Central Room", "Fire Temple", RA_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_EAST_CENTRAL_ROOM] = Area("Fire Temple East Central Room", "Fire Temple", RA_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART, true), + LOCATION(RC_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART, true), + LOCATION(RC_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART, true), + }, { //Exits Entrance(RR_FIRE_TEMPLE_BIG_LAVA_ROOM, {[]{return logic->CanTakeDamage;}}), Entrance(RR_FIRE_TEMPLE_BOULDER_MAZE_LOWER, {[]{return logic->SmallKeys(RR_FIRE_TEMPLE, 5, 8);}}), @@ -173,7 +183,12 @@ void AreaTable_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] = Area("Fire Temple Fire Wall Chase", "Fire Temple", RA_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_FIRE_TEMPLE_FIRE_WALL_CHASE] = Area("Fire Temple Fire Wall Chase", "Fire Temple", RA_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + //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))), + LOCATION(RC_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART, logic->FireTimer >= 24), + }, { //Exits Entrance(RR_FIRE_TEMPLE_EAST_CENTRAL_ROOM, {[]{return logic->FireTimer >= 24 && logic->SmallKeys(RR_FIRE_TEMPLE, 6, 8);}}), Entrance(RR_FIRE_TEMPLE_MAP_AREA, {[]{return logic->IsAdult;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_water_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_water_temple.cpp index 2534ebef352..9259eba642b 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_water_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_water_temple.cpp @@ -230,8 +230,12 @@ void AreaTable_Init_WaterTemple() { areaTable[RR_WATER_TEMPLE_RIVER] = Area("Water Temple River", "Water Temple", RA_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //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)) || (randoCtx->GetTrickOption(RT_WATER_RIVER_GS) && logic->CanUse(RG_LONGSHOT))), + 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)) || (randoCtx->GetTrickOption(RT_WATER_RIVER_GS) && logic->CanUse(RG_LONGSHOT))), + LOCATION(RC_WATER_TEMPLE_RIVER_HEART_1, true), + LOCATION(RC_WATER_TEMPLE_RIVER_HEART_2, true), + LOCATION(RC_WATER_TEMPLE_RIVER_HEART_3, true), + LOCATION(RC_WATER_TEMPLE_RIVER_HEART_4, true), }, { //Exits 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));}}), diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index 8ab1e04d4bd..c9393615077 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -386,6 +386,15 @@ Dungeons::Dungeons() { RC_FIRE_TEMPLE_GS_BOULDER_MAZE, RC_FIRE_TEMPLE_GS_SCARECROW_TOP, RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, + RC_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART, + RC_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART, + RC_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART, + RC_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART, + RC_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART, + RC_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART, + RC_FIRE_TEMPLE_FIRE_WALL_EAST_HEART, + RC_FIRE_TEMPLE_FIRE_WALL_WEST_HEART, + RC_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART, }, { // MQ Locations @@ -406,6 +415,9 @@ Dungeons::Dungeons() { RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, + RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART, + RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART, + RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART, }, {}, { @@ -433,6 +445,10 @@ Dungeons::Dungeons() { RC_WATER_TEMPLE_GS_CENTRAL_PILLAR, RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, RC_WATER_TEMPLE_GS_RIVER, + RC_WATER_TEMPLE_RIVER_HEART_1, + RC_WATER_TEMPLE_RIVER_HEART_2, + RC_WATER_TEMPLE_RIVER_HEART_3, + RC_WATER_TEMPLE_RIVER_HEART_4, }, { // MQ Locations diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 392e85f5981..9567964f82e 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1749,6 +1749,21 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_FOREST_TEMPLE_WELL_WEST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_WELL_WEST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x2F03, 0x2F, "Well East Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_WEST_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); locationTable[RC_FOREST_TEMPLE_WELL_EAST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_WELL_EAST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x3003, 0x30, "Well West Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_EAST_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FOREST_TEMPLE); + locationTable[RC_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x2F03, 0x2F, "Fire Pillar Room Left Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x3003, 0x30, "Fire Pillar Room Right Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART] = Location::Collectable(RC_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x3403, 0x34, "Fire Pillar Room Back Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x3703, 0x37, "East Central Room Left Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x3503, 0x35, "East Central Room Right Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART] = Location::Collectable(RC_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x3603, 0x36, "East Central Room Middle Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_FIRE_WALL_EAST_HEART] = Location::Collectable(RC_FIRE_TEMPLE_FIRE_WALL_EAST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x3203, 0x32, "Fire Wall Chase East Pillar Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FIRE_WALL_EAST_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_FIRE_WALL_WEST_HEART] = Location::Collectable(RC_FIRE_TEMPLE_FIRE_WALL_WEST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x3103, 0x31, "Fire Wall Chase West Pillar Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FIRE_WALL_WEST_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x3303, 0x33, "Fire Wall Chase Exit Platform Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + + locationTable[RC_WATER_TEMPLE_RIVER_HEART_1] = Location::Collectable(RC_WATER_TEMPLE_RIVER_HEART_1, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_WATER_TEMPLE, ACTOR_EN_ITEM00, SCENE_WATER_TEMPLE, 0x2A03, 0x2A, "River Heart 1", RHT_WATER_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_HEART_1), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[RC_WATER_TEMPLE_RIVER_HEART_2] = Location::Collectable(RC_WATER_TEMPLE_RIVER_HEART_2, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_WATER_TEMPLE, ACTOR_EN_ITEM00, SCENE_WATER_TEMPLE, 0x2D03, 0x2D, "River Heart 2", RHT_WATER_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_HEART_2), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[RC_WATER_TEMPLE_RIVER_HEART_3] = Location::Collectable(RC_WATER_TEMPLE_RIVER_HEART_3, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_WATER_TEMPLE, ACTOR_EN_ITEM00, SCENE_WATER_TEMPLE, 0x3203, 0x32, "River Heart 2", RHT_WATER_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_HEART_3), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[RC_WATER_TEMPLE_RIVER_HEART_4] = Location::Collectable(RC_WATER_TEMPLE_RIVER_HEART_4, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_WATER_TEMPLE, ACTOR_EN_ITEM00, SCENE_WATER_TEMPLE, 0x3403, 0x34, "River Heart 3", RHT_WATER_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_HEART_4), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0501, 0x05, "Basement Platform Left Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0601, 0x06, "Basement Platform Back Left Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0201, 0x02, "Basement Platform Middle Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); @@ -1788,9 +1803,13 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x2D03, 0x2D, "MQ West Courtyard Right Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x2E03, 0x2E, "MQ West Courtyard Middle Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_MIDDLE_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x2F03, 0x2F, "MQ West Courtyard Left Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_MQ_COURTYARD_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x3803, 0x38, "MQ Well Middle Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_MQ_WEST_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[RC_FOREST_TEMPLE_MQ_WELL_MIDDLE_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_WELL_MIDDLE_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x3903, 0x39, "MQ Well West Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_MQ_MIDDLE_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x3A03, 0x3A, "MQ Well East Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_MQ_EAST_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x3803, 0x38, "MQ Well Middle Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_MQ_WEST_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_FOREST_TEMPLE_MQ_WELL_MIDDLE_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_WELL_MIDDLE_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x3903, 0x39, "MQ Well West Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_MQ_MIDDLE_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART] = Location::Collectable(RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FOREST_TEMPLE, ACTOR_EN_ITEM00, SCENE_FOREST_TEMPLE, 0x3A03, 0x3A, "MQ Well East Heart", RHT_FOREST_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FOREST_TEMPLE_WELL_MQ_EAST_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + + locationTable[RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x2F03, 0x2F, "MQ Fire Pillar Room Left Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x3403, 0x34, "MQ Fire Pillar Room Right Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART] = Location::Collectable(RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x3003, 0x30, "MQ Fire Pillar Room Lower Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2003, 0x22, "MQ Coffin Room Front Right Invisible Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2103, 0x21, "MQ Bomb Alcove Left Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 568f4bd4c02..7ae21b6aee8 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1773,6 +1773,19 @@ typedef enum { RC_FOREST_TEMPLE_COURTYARD_LEFT_HEART, RC_FOREST_TEMPLE_WELL_WEST_HEART, RC_FOREST_TEMPLE_WELL_EAST_HEART, + RC_FIRE_TEMPLE_FIRE_PILLAR_LEFT_HEART, + RC_FIRE_TEMPLE_FIRE_PILLAR_RIGHT_HEART, + RC_FIRE_TEMPLE_FIRE_PILLAR_BACK_HEART, + RC_FIRE_TEMPLE_EAST_CENTRAL_LEFT_HEART, + RC_FIRE_TEMPLE_EAST_CENTRAL_RIGHT_HEART, + RC_FIRE_TEMPLE_EAST_CENTRAL_MIDDLE_HEART, + RC_FIRE_TEMPLE_FIRE_WALL_EAST_HEART, + RC_FIRE_TEMPLE_FIRE_WALL_WEST_HEART, + RC_FIRE_TEMPLE_FIRE_WALL_EXIT_HEART, + RC_WATER_TEMPLE_RIVER_HEART_1, + RC_WATER_TEMPLE_RIVER_HEART_2, + RC_WATER_TEMPLE_RIVER_HEART_3, + RC_WATER_TEMPLE_RIVER_HEART_4, RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, @@ -1809,6 +1822,9 @@ typedef enum { RC_FOREST_TEMPLE_MQ_WELL_WEST_HEART, RC_FOREST_TEMPLE_MQ_WELL_MIDDLE_HEART, RC_FOREST_TEMPLE_MQ_WELL_EAST_HEART, + RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART, + RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART, + RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART, RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, @@ -3825,6 +3841,7 @@ typedef enum { RHT_JABU_JABU_HEART, RHT_FOREST_TEMPLE_HEART, RHT_FIRE_TEMPLE_HEART, + RHT_WATER_TEMPLE_HEART, RHT_SHADOW_TEMPLE_HEART, RHT_BOTTOM_OF_THE_WELL_HEART, RHT_BOTTOM_OF_THE_WELL_RUPEE, diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index a8ada3df7a4..ddcfb2b9fd3 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -414,6 +414,19 @@ typedef enum { 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_ICE_CAVERN_LOBBY_RUPEE, RAND_INF_ICE_CAVERN_MAP_ROOM_LEFT_HEART, RAND_INF_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, @@ -441,6 +454,9 @@ typedef enum { 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_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, From 2f463c19cca17efd21777621396994f72f615dfe Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Wed, 14 Aug 2024 22:56:51 -0700 Subject: [PATCH 11/54] Add Shadow Temple checks This does not include the spinning pots rupees, even though they're included with freestanding rupees in the N64 randomizer as they would require dedicated overrides for the code for the pots in question. --- .../location_access/locacc_shadow_temple.cpp | 22 +++++++++++++++---- .../Enhancements/randomizer/location_list.cpp | 16 ++++++++++++++ .../Enhancements/randomizer/randomizerTypes.h | 14 ++++++++++++ .../Enhancements/randomizer/randomizer_inf.h | 14 ++++++++++++ 4 files changed, 62 insertions(+), 4 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp index b95262ab31f..34fb4af3cd7 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp @@ -58,6 +58,8 @@ void AreaTable_Init_ShadowTemple() { LOCATION(RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, logic->CanJumpslash), LOCATION(RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, logic->Hookshot || (randoCtx->GetTrickOption(RT_SHADOW_UMBRELLA_GS) && logic->HoverBoots)), LOCATION(RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, logic->SmallKeys(RR_SHADOW_TEMPLE, 2, 3) && ((randoCtx->GetTrickOption(RT_LENS_SHADOW_PLATFORM) && randoCtx->GetTrickOption(RT_LENS_SHADOW)) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->Hookshot), + LOCATION(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART, (logic->CanUse(RG_SONG_OF_TIME) && logic->IsAdult) || logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART, (logic->CanUse(RG_SONG_OF_TIME) && logic->IsAdult) || logic->CanUse(RG_BOOMERANG)), }, { //Exits Entrance(RR_SHADOW_TEMPLE_WIND_TUNNEL, {[]{return ((randoCtx->GetTrickOption(RT_LENS_SHADOW_PLATFORM) && randoCtx->GetTrickOption(RT_LENS_SHADOW)) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->Hookshot && logic->SmallKeys(RR_SHADOW_TEMPLE, 3, 4);}}), @@ -69,6 +71,8 @@ void AreaTable_Init_ShadowTemple() { LOCATION(RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, logic->CanJumpslash), LOCATION(RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, true), LOCATION(RC_SHADOW_TEMPLE_GS_NEAR_SHIP, logic->CanUse(RG_LONGSHOT) && logic->SmallKeys(RR_SHADOW_TEMPLE, 4, 5)), + LOCATION(RC_SHADOW_TEMPLE_SCARECROW_NORTH_HEART, logic->CanUse(RG_DISTANT_SCARECROW) && logic->SmallKeys(RR_SHADOW_TEMPLE, 4, 5)), + LOCATION(RC_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART, logic->CanUse(RG_DISTANT_SCARECROW) && logic->SmallKeys(RR_SHADOW_TEMPLE, 4, 5)), }, { //Exits Entrance(RR_SHADOW_TEMPLE_BEYOND_BOAT, {[]{return logic->CanJumpslash && logic->CanUse(RG_ZELDAS_LULLABY) && logic->SmallKeys(RR_SHADOW_TEMPLE, 4, 5);}}), @@ -76,10 +80,13 @@ void AreaTable_Init_ShadowTemple() { areaTable[RR_SHADOW_TEMPLE_BEYOND_BOAT] = Area("Shadow Temple Beyond Boat", "Shadow Temple", RA_SHADOW_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { //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)), - LOCATION(RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, logic->CanJumpslash), - LOCATION(RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, logic->CanAdultAttack), + 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)), + LOCATION(RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, logic->CanJumpslash), + LOCATION(RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, logic->CanAdultAttack), + LOCATION(RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, logic->CanUse(RG_DISTANT_SCARECROW)), + LOCATION(RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, logic->CanUse(RG_DISTANT_SCARECROW)), + LOCATION(RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DISTANT_SCARECROW) || (randoCtx->GetTrickOption(RT_SHADOW_STATUE) && logic->HasBombchus)) && 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) || (randoCtx->GetTrickOption(RT_SHADOW_STATUE) && logic->HasBombchus)) && logic->SmallKeys(RR_SHADOW_TEMPLE, 5) && logic->CanUse(RG_HOVER_BOOTS) && logic->BossKeyShadowTemple;}}) @@ -120,6 +127,8 @@ void AreaTable_Init_ShadowTemple() { //Trick: logic->CanUse(RG_SONG_OF_TIME) || (LogicShadowMQInvisibleBlades && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OHKO)) LOCATION(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, logic->CanUse(RG_SONG_OF_TIME) || (randoCtx->GetTrickOption(RT_SHADOW_MQ_INVISIBLE_BLADES) && randoCtx->GetOption(RSK_DAMAGE_MULTIPLIER).IsNot(RO_DAMAGE_MULTIPLIER_OHKO))), //Trick: logic->CanUse(RG_SONG_OF_TIME) || (LogicShadowMQInvisibleBlades && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OHKO)) + LOCATION(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART, (logic->CanUse(RG_SONG_OF_TIME) && logic->IsAdult) || logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART, (logic->CanUse(RG_SONG_OF_TIME) && logic->IsAdult) || logic->CanUse(RG_BOOMERANG)), }, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_LOWER_HUGE_PIT, {[]{return logic->HasFireSource || randoCtx->GetTrickOption(RT_SHADOW_MQ_HUGE_PIT);}}), @@ -151,6 +160,8 @@ void AreaTable_Init_ShadowTemple() { LOCATION(RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, true), LOCATION(RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, true), LOCATION(RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, true), + LOCATION(RC_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART, logic->CanUse(RG_DISTANT_SCARECROW) && logic->SmallKeys(RR_SHADOW_TEMPLE, 5)), + LOCATION(RC_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART, logic->CanUse(RG_DISTANT_SCARECROW) && logic->SmallKeys(RR_SHADOW_TEMPLE, 5)), }, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_BEYOND_BOAT, {[]{return logic->CanUse(RG_ZELDAS_LULLABY) && logic->SmallKeys(RR_SHADOW_TEMPLE, 5);}}), @@ -160,6 +171,9 @@ void AreaTable_Init_ShadowTemple() { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, true), LOCATION(RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, logic->Bow || (randoCtx->GetTrickOption(RT_SHADOW_STATUE) && logic->HasBombchus)), + LOCATION(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART, logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_LONGSHOT)), + LOCATION(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART, logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_LONGSHOT)), + LOCATION(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, (logic->CanUse(RG_FAIRY_BOW) || (randoCtx->GetTrickOption(RT_SHADOW_STATUE) && logic->HasBombchus)) && logic->CanUse(RG_SONG_OF_TIME)), }, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_INVISIBLE_MAZE, {[]{return logic->Bow && logic->CanUse(RG_SONG_OF_TIME) && logic->IsAdult && logic->CanUse(RG_LONGSHOT);}}), diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 9567964f82e..960b34c7a35 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1764,6 +1764,14 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_WATER_TEMPLE_RIVER_HEART_3] = Location::Collectable(RC_WATER_TEMPLE_RIVER_HEART_3, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_WATER_TEMPLE, ACTOR_EN_ITEM00, SCENE_WATER_TEMPLE, 0x3203, 0x32, "River Heart 2", RHT_WATER_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_HEART_3), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); locationTable[RC_WATER_TEMPLE_RIVER_HEART_4] = Location::Collectable(RC_WATER_TEMPLE_RIVER_HEART_4, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_WATER_TEMPLE, ACTOR_EN_ITEM00, SCENE_WATER_TEMPLE, 0x3403, 0x34, "River Heart 3", RHT_WATER_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_WATER_TEMPLE_RIVER_HEART_4), SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x2003, 0x20, "Invisible Blades Left Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x2103, 0x21, "Invisible Blades Right Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_SCARECROW_NORTH_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_SCARECROW_NORTH_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x2203, 0x22, "Scarecrow Near Ship North Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_SCARECROW_NORTH_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x2303, 0x23, "Scarecrow Near Ship South Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3A03, 0x3A, "After Ship Upper Left Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3903, 0x39, "After Ship Upper Right Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3C03, 0x3C, "After Ship Lower Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0501, 0x05, "Basement Platform Left Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0601, 0x06, "Basement Platform Back Left Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0201, 0x02, "Basement Platform Middle Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); @@ -1811,6 +1819,14 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART] = Location::Collectable(RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x3403, 0x34, "MQ Fire Pillar Room Right Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); locationTable[RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART] = Location::Collectable(RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_FIRE_TEMPLE, ACTOR_EN_ITEM00, SCENE_FIRE_TEMPLE, 0x3003, 0x30, "MQ Fire Pillar Room Lower Heart", RHT_FIRE_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x2003, 0x20, "MQ Invisible Blades Left Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x2103, 0x21, "MQ Invisible Blades Right Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x2203, 0x22, "MQ Scarecrow Near Ship North Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x2303, 0x23, "MQ Scarecrow Near Ship South Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3A03, 0x3A, "MQ After Ship Upper Left Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3903, 0x39, "MQ After Ship Upper Right Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3C03, 0x3C, "MQ After Ship Lower Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2003, 0x22, "MQ Coffin Room Front Right Invisible Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2103, 0x21, "MQ Bomb Alcove Left Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2203, 0x22, "MQ Bomb Alcove Right Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 7ae21b6aee8..db869473f7f 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1786,6 +1786,13 @@ typedef enum { RC_WATER_TEMPLE_RIVER_HEART_2, RC_WATER_TEMPLE_RIVER_HEART_3, RC_WATER_TEMPLE_RIVER_HEART_4, + RC_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART, + RC_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART, + RC_SHADOW_TEMPLE_SCARECROW_NORTH_HEART, + RC_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART, + RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, + RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, + RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, @@ -1825,6 +1832,13 @@ typedef enum { RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART, RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART, RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART, + RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART, + RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART, + RC_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART, + RC_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART, + RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART, + RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART, + RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index ddcfb2b9fd3..a0d46d8fced 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -427,6 +427,13 @@ typedef enum { 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_ICE_CAVERN_LOBBY_RUPEE, RAND_INF_ICE_CAVERN_MAP_ROOM_LEFT_HEART, RAND_INF_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, @@ -457,6 +464,13 @@ typedef enum { 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_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, From ead0bba6887e85b04708a14cea8661b3856047b7 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 15 Aug 2024 00:38:51 -0700 Subject: [PATCH 12/54] Define Spirit Temple and Ganon's Castle hearts --- .../location_access/locacc_ganons_castle.cpp | 10 ++++++++- .../location_access/locacc_spirit_temple.cpp | 2 ++ .../Enhancements/randomizer/location_list.cpp | 21 +++++++++++++++---- .../Enhancements/randomizer/randomizerTypes.h | 11 ++++++++++ .../Enhancements/randomizer/randomizer_inf.h | 8 +++++++ 5 files changed, 47 insertions(+), 5 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp index b00630e27e9..6ca88bdaa1b 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp @@ -63,7 +63,10 @@ void AreaTable_Init_GanonsCastle() { areaTable[RR_GANONS_CASTLE_FIRE_TRIAL] = Area("Ganon's Castle Fire Trial", "Ganon's Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->FireTrialClear, {[]{return logic->CanUse(RG_GORON_TUNIC) && logic->CanUse(RG_GOLDEN_GAUNTLETS) && logic->CanUse(RG_LIGHT_ARROWS) && logic->CanUse(RG_LONGSHOT);}}), - }, {}, {}); + }, { + //Locations + LOCATION(RC_GANONS_CASTLE_FIRE_TRIAL_HEART, logic->CanUse(RG_GORON_TUNIC)), + }, {}); areaTable[RR_GANONS_CASTLE_WATER_TRIAL] = Area("Ganon's Castle Water Trial", "Ganon's Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { //Events @@ -83,6 +86,9 @@ void AreaTable_Init_GanonsCastle() { //Locations LOCATION(RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, logic->CanUse(RG_FIRE_ARROWS) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_SONG_OF_TIME) || logic->IsChild), LOCATION(RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_LONGSHOT) && (logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_DINS_FIRE)))), + LOCATION(RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_1, (logic->FireArrows && (randoCtx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH))) || (logic->CanUse(RG_LONGSHOT) && (logic->CanUse(RG_HOVER_BOOTS) || (logic->DinsFire && (randoCtx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH)))))), + LOCATION(RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_2, (logic->FireArrows && (randoCtx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH))) || (logic->CanUse(RG_LONGSHOT) && (logic->CanUse(RG_HOVER_BOOTS) || (logic->DinsFire && (randoCtx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH)))))), + LOCATION(RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_3, (logic->FireArrows && (randoCtx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH))) || (logic->CanUse(RG_LONGSHOT) && (logic->CanUse(RG_HOVER_BOOTS) || (logic->DinsFire && (randoCtx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH)))))), }, {}); areaTable[RR_GANONS_CASTLE_SPIRIT_TRIAL] = Area("Ganon's Castle Spirit Trial", "Ganon's Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { @@ -93,6 +99,7 @@ void AreaTable_Init_GanonsCastle() { //Locations LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, (randoCtx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) || logic->CanUse(RG_HOOKSHOT)) && logic->CanJumpslash), LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, (randoCtx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) || logic->CanUse(RG_HOOKSHOT)) && logic->HasBombchus && (randoCtx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH))), + LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_HEART, true), }, {}); areaTable[RR_GANONS_CASTLE_LIGHT_TRIAL] = Area("Ganon's Castle Light Trial", "Ganon's Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { @@ -178,6 +185,7 @@ void AreaTable_Init_GanonsCastle() { }, { //Locations LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, logic->BlueFire), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_HEART, logic->BlueFire), }, {}); areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL] = Area("Ganon's Castle MQ Shadow Trial", "Ganons Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp index 92716469e30..175dcff42ad 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp @@ -124,6 +124,8 @@ void AreaTable_Init_SpiritTemple() { //Locations LOCATION(RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, logic->CanUse(RG_ZELDAS_LULLABY) && ((logic->CanTakeDamage && randoCtx->GetTrickOption(RT_FLAMING_CHESTS)) || (logic->Bow && logic->Hookshot))), LOCATION(RC_SPIRIT_TEMPLE_TOPMOST_CHEST, (logic->MirrorShield && logic->CanAdultAttack) || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS))), + LOCATION(RC_SPIRIT_TEMPLE_ADULT_CLIMB_LEFT_HEART, logic->CanUse(RG_HOOKSHOT)), + LOCATION(RC_SPIRIT_TEMPLE_ADULT_CLIMB_RIGHT_HEART, logic->CanUse(RG_HOOKSHOT)), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_INSIDE_STATUE_HEAD, {[]{return logic->MirrorShield && logic->HasExplosives && logic->Hookshot;}}), diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 960b34c7a35..9212a48deaa 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1768,9 +1768,12 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x2103, 0x21, "Invisible Blades Right Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); locationTable[RC_SHADOW_TEMPLE_SCARECROW_NORTH_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_SCARECROW_NORTH_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x2203, 0x22, "Scarecrow Near Ship North Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_SCARECROW_NORTH_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); locationTable[RC_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x2303, 0x23, "Scarecrow Near Ship South Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3A03, 0x3A, "After Ship Upper Left Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3903, 0x39, "After Ship Upper Right Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); - locationTable[RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3C03, 0x3C, "After Ship Lower Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3A03, 0x3A, "After Ship Upper Left Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3903, 0x39, "After Ship Upper Right Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3C03, 0x3C, "After Ship Lower Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + + locationTable[RC_SPIRIT_TEMPLE_ADULT_CLIMB_LEFT_HEART] = Location::Collectable(RC_SPIRIT_TEMPLE_ADULT_CLIMB_LEFT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, 0x0103, 0x01, "Adult Climb Left Heart", RHT_SPIRIT_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_ADULT_CLIMB_RIGHT_HEART] = Location::Collectable(RC_SPIRIT_TEMPLE_ADULT_CLIMB_RIGHT_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, 0x0203, 0x02, "Adult Climb Right Heart", RHT_SPIRIT_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0501, 0x05, "Basement Platform Left Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x0601, 0x06, "Basement Platform Back Left Rupee", RHT_BOTTOM_OF_THE_WELL_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); @@ -1789,7 +1792,13 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3] = Location::Collectable(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_ICE_CAVERN, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, 0x3002, 0x30, "Sliding Block Room Rupee 3", RHT_ICE_CAVERN_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3), SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); locationTable[RC_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART] = Location::Collectable(RC_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, 0x2203, 0x22, "Beamos South Heart", RHT_GERUDO_TRAINING_GROUNDS_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART), SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART] = Location::Collectable(RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, 0x2303, 0x23, "Beamos East Heart", RHT_GERUDO_TRAINING_GROUNDS_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART), SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART] = Location::Collectable(RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_GERUDO_TRAINING_GROUND, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, 0x2303, 0x23, "Beamos East Heart", RHT_GERUDO_TRAINING_GROUNDS_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART), SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_1] = Location::Collectable(RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_1, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_GANONS_CASTLE, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, 0x2103, 0x21, "Shadow Trial Heart 1", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_1), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_2] = Location::Collectable(RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_2, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_GANONS_CASTLE, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, 0x2203, 0x22, "Shadow Trial Heart 2", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_2), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_3] = Location::Collectable(RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_3, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_GANONS_CASTLE, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, 0x2303, 0x23, "Shadow Trial Heart 3", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SHADOW_TRIAL_HEART_3), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_FIRE_TRIAL_HEART] = Location::Collectable(RC_GANONS_CASTLE_FIRE_TRIAL_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_GANONS_CASTLE, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, 0x2403, 0x24, "Fire Trial Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_FIRE_TRIAL_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_HEART] = Location::Collectable(RC_GANONS_CASTLE_SPIRIT_TRIAL_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_GANONS_CASTLE, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, 0x2603, 0x26, "Spirit Trial Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); locationTable[RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2203, 0x22, "MQ Compass Room Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); locationTable[RC_DEKU_TREE_MQ_DEKU_BABA_HEART] = Location::Collectable(RC_DEKU_TREE_MQ_DEKU_BABA_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2303, 0x23, "MQ Deku Baba Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); @@ -1835,6 +1844,10 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x3D03, 0x3D, "MQ Basement Hallway Left Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x3E03, 0x3E, "MQ Basement Hallway Right Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_HEART] = Location::Collectable(RC_GANONS_CASTLE_MQ_WATER_TRIAL_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_GANONS_CASTLE, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, 0x3F03, 0x3F, "MQ Water Trial Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART] = Location::Collectable(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_GANONS_CASTLE, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, 0x3E03, 0x3E, "MQ Light Trial Right Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART] = Location::Collectable(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_GANONS_CASTLE, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, 0x3D03, 0x3D, "MQ Light Trial Left Heart", RHT_GANONS_CASTLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); locationTable[RC_DMT_GOSSIP_STONE] = Location::HintStone(RC_DMT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 14340, 0x04, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index db869473f7f..db46731b0df 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1793,6 +1793,8 @@ typedef enum { RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, + RC_SPIRIT_TEMPLE_ADULT_CLIMB_LEFT_HEART, + RC_SPIRIT_TEMPLE_ADULT_CLIMB_RIGHT_HEART, RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_LEFT_RUPEE, RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_LEFT_RUPEE, RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, @@ -1809,6 +1811,11 @@ typedef enum { RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, RC_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, + RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_1, + RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_2, + RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_3, + RC_GANONS_CASTLE_FIRE_TRIAL_HEART, + RC_GANONS_CASTLE_SPIRIT_TRIAL_HEART, RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, RC_DEKU_TREE_MQ_DEKU_BABA_HEART, RC_DEKU_TREE_MQ_LOBBY_HEART, @@ -1846,6 +1853,9 @@ typedef enum { RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_FRONT_HEART, RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_LEFT_HEART, RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_HALLWAY_RIGHT_HEART, + RC_GANONS_CASTLE_MQ_WATER_TRIAL_HEART, + RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART, + RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART, RC_MAX } RandomizerCheck; @@ -3857,6 +3867,7 @@ typedef enum { RHT_FIRE_TEMPLE_HEART, RHT_WATER_TEMPLE_HEART, RHT_SHADOW_TEMPLE_HEART, + RHT_SPIRIT_TEMPLE_HEART, RHT_BOTTOM_OF_THE_WELL_HEART, RHT_BOTTOM_OF_THE_WELL_RUPEE, RHT_ICE_CAVERN_HEART, diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index a0d46d8fced..9e6a24b04fd 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -444,6 +444,11 @@ typedef enum { 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, RAND_INF_DEKU_TREE_MQ_COMPASS_ROOM_HEART, RAND_INF_DEKU_TREE_MQ_DEKU_BABA_HEART, @@ -478,6 +483,9 @@ typedef enum { 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, // 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, From f8c438ebb2c6b063724ca7c4bacda8ad5fa8a544 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 15 Aug 2024 00:46:29 -0700 Subject: [PATCH 13/54] Add remaining checks to dungeon definitions --- soh/soh/Enhancements/randomizer/dungeon.cpp | 24 +++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index c9393615077..a9304ce9f2e 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -497,6 +497,8 @@ Dungeons::Dungeons() { RC_SPIRIT_TEMPLE_GS_LOBBY, RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, RC_SPIRIT_TEMPLE_GS_METAL_FENCE, + RC_SPIRIT_TEMPLE_ADULT_CLIMB_LEFT_HEART, + RC_SPIRIT_TEMPLE_ADULT_CLIMB_RIGHT_HEART, }, { // MQ Locations @@ -563,6 +565,13 @@ Dungeons::Dungeons() { RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, RC_SHADOW_TEMPLE_GS_NEAR_SHIP, + RC_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART, + RC_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART, + RC_SHADOW_TEMPLE_SCARECROW_NORTH_HEART, + RC_SHADOW_TEMPLE_SCARECROW_SOUTH_HEART, + RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, + RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, + RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, }, { // MQ Locations @@ -591,6 +600,13 @@ Dungeons::Dungeons() { RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, + RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART, + RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART, + RC_SHADOW_TEMPLE_MQ_SCARECROW_NORTH_HEART, + RC_SHADOW_TEMPLE_MQ_SCARECROW_SOUTH_HEART, + RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART, + RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART, + RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, }, {}, { @@ -756,6 +772,11 @@ Dungeons::Dungeons() { RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, + RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_1, + RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_2, + RC_GANONS_CASTLE_SHADOW_TRIAL_HEART_3, + RC_GANONS_CASTLE_FIRE_TRIAL_HEART, + RC_GANONS_CASTLE_SPIRIT_TRIAL_HEART, }, { // MQ Locations @@ -777,6 +798,9 @@ Dungeons::Dungeons() { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, + RC_GANONS_CASTLE_MQ_WATER_TRIAL_HEART, + RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART, + RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART, }, { // Shared Locations From 00b8c8694e69505da342959d52519b53c7c92fb8 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 15 Aug 2024 01:57:12 -0700 Subject: [PATCH 14/54] Fix missing logic --- .../location_access/locacc_death_mountain.cpp | 37 +++++++++++++++++++ .../location_access/locacc_lost_woods.cpp | 4 ++ .../location_access/locacc_zoras_domain.cpp | 6 +-- .../Enhancements/randomizer/randomizerTypes.h | 1 + 4 files changed, 45 insertions(+), 3 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp index 6627c2286e1..e3ef7982d11 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp @@ -15,6 +15,8 @@ void AreaTable_Init_DeathMountain() { LOCATION(RC_DMT_GS_BEAN_PATCH, logic->CanPlantBugs && (logic->HasExplosives || logic->GoronBracelet || (randoCtx->GetTrickOption(RT_DMT_SOIL_GS) && (logic->CanTakeDamage || logic->CanUse(RG_HOVER_BOOTS)) && logic->CanUse(RG_BOOMERANG)))), LOCATION(RC_DMT_GS_NEAR_KAK, logic->CanBlastOrSmash), LOCATION(RC_DMT_GS_ABOVE_DODONGOS_CAVERN, logic->IsAdult && logic->AtNight && (logic->CanUse(RG_MEGATON_HAMMER) || (randoCtx->GetTrickOption(RT_DMT_HOOKSHOT_LOWER_GS) && logic->CanUse(RG_HOOKSHOT)) || (randoCtx->GetTrickOption(RT_DMT_BEAN_LOWER_GS) && CanPlantBean(RR_DEATH_MOUNTAIN_TRAIL)) || (randoCtx->GetTrickOption(RT_DMT_HOVERS_LOWER_GS) && logic->CanUse(RG_HOVER_BOOTS)) || randoCtx->GetTrickOption(RT_DMT_JS_LOWER_GS)) && logic->CanGetNightTimeGS), + LOCATION(RC_DMT_BLUE_RUPEE, logic->IsChild && logic->CanBlastOrSmash), + LOCATION(RC_DMT_RED_RUPEE, logic->IsChild && logic->CanBlastOrSmash), }, { //Exits Entrance(RR_KAK_BEHIND_GATE, {[]{return true;}}), @@ -54,6 +56,17 @@ void AreaTable_Init_DeathMountain() { //Locations LOCATION(RC_DMT_COW_GROTTO_COW, logic->CanUse(RG_EPONAS_SONG)), LOCATION(RC_DMT_COW_GROTTO_BEEHIVE, logic->CanBreakLowerBeehives), + LOCATION(RC_DMT_COW_GROTTO_LEFT_HEART, true), + LOCATION(RC_DMT_COW_GROTTO_MIDDLE_LEFT_HEART, true), + LOCATION(RC_DMT_COW_GROTTO_MIDDLE_RIGHT_HEART, true), + LOCATION(RC_DMT_COW_GROTTO_RIGHT_HEART, true), + LOCATION(RC_DMT_COW_GROTTO_RUPEE_1, true), + LOCATION(RC_DMT_COW_GROTTO_RUPEE_2, true), + LOCATION(RC_DMT_COW_GROTTO_RUPEE_3, true), + LOCATION(RC_DMT_COW_GROTTO_RUPEE_4, true), + LOCATION(RC_DMT_COW_GROTTO_RUPEE_5, true), + LOCATION(RC_DMT_COW_GROTTO_RUPEE_6, true), + LOCATION(RC_DMT_COW_GROTTO_RED_RUPEE, true), }, { //Exits Entrance(RR_DEATH_MOUNTAIN_SUMMIT, {[]{return true;}}), @@ -185,6 +198,7 @@ void AreaTable_Init_DeathMountain() { Entrance(RR_DMC_LADDER_AREA_NEARBY, {[]{return logic->FireTimer >= 16 || logic->Hearts >= 3;}}), Entrance(RR_DMC_CENTRAL_NEARBY, {[]{return logic->IsAdult && logic->CanUse(RG_GORON_TUNIC) && logic->CanUse(RG_DISTANT_SCARECROW) && ((logic->EffectiveHealth > 2) || (logic->Fairy && randoCtx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).IsNot(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF)) || logic->CanUse(RG_NAYRUS_LOVE));}}), Entrance(RR_DMC_LOWER_NEARBY, {[]{return false;}}), + Entrance(RR_DMC_DISTANT_PLATFORM, {[]{return (logic->FireTimer >= 48 && logic->Hearts >= 2) || logic->Hearts >= 3;}}), }); areaTable[RR_DMC_LADDER_AREA_NEARBY] = Area("DMC Ladder Area Nearby", "Death Mountain Crater", RA_DEATH_MOUNTAIN_CRATER, NO_DAY_NIGHT_CYCLE, {}, { @@ -227,12 +241,21 @@ void AreaTable_Init_DeathMountain() { }, { //Locations LOCATION(RC_DMC_GS_BEAN_PATCH, (logic->FireTimer >= 8 || logic->Hearts >= 3) && logic->CanPlantBugs && logic->CanChildAttack), + LOCATION(RC_DMC_NEAR_PLATFORM_RED_RUPEE, logic->IsChild), + LOCATION(RC_DMC_MIDDLE_PLATFORM_RED_RUPEE, logic->IsChild && (logic->FireTimer >= 8 || logic->Hearts >= 3)), + LOCATION(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_1, logic->IsChild && (logic->FireTimer >= 8 || logic->Hearts >= 3)), + LOCATION(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_2, logic->IsChild && (logic->FireTimer >= 8 || logic->Hearts >= 3)), + LOCATION(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_3, logic->IsChild && (logic->FireTimer >= 8 || logic->Hearts >= 3)), + LOCATION(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_4, logic->IsChild && (logic->FireTimer >= 8 || logic->Hearts >= 3)), + LOCATION(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_5, logic->IsChild && (logic->FireTimer >= 8 || logic->Hearts >= 3)), + LOCATION(RC_DMC_MIDDLE_PLATFORM_BLUE_RUPEE_6, logic->IsChild && (logic->FireTimer >= 8 || logic->Hearts >= 3)), }, { //Exits Entrance(RR_DMC_CENTRAL_NEARBY, {[]{return true;}}), Entrance(RR_DMC_LOWER_NEARBY, {[]{return (logic->IsAdult && CanPlantBean(RR_DMC_CENTRAL_LOCAL)) || logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT);}}), Entrance(RR_DMC_UPPER_NEARBY, {[]{return logic->IsAdult && CanPlantBean(RR_DMC_CENTRAL_LOCAL);}}), Entrance(RR_FIRE_TEMPLE_ENTRYWAY, {[]{return (logic->IsChild && logic->Hearts >= 3 && randoCtx->GetOption(RSK_SHUFFLE_DUNGEON_ENTRANCES).IsNot(RO_DUNGEON_ENTRANCE_SHUFFLE_OFF)) || (logic->IsAdult && logic->FireTimer >= 24);}}), + Entrance(RR_DMC_DISTANT_PLATFORM, {[]{return logic->FireTimer >= 48 && logic->DistantScarecrow;}}), }); areaTable[RR_DMC_GREAT_FAIRY_FOUNTAIN] = Area("DMC Great Fairy Fountain", "DMC Great Fairy Fountain", RA_NONE, NO_DAY_NIGHT_CYCLE, {}, { @@ -265,4 +288,18 @@ void AreaTable_Init_DeathMountain() { //Exits Entrance(RR_DMC_LOWER_LOCAL, {[]{return true;}}), }); + + areaTable[RR_DMC_DISTANT_PLATFORM] = Area("DMC Distant Platform", "Death Mountain Crater", RA_DEATH_MOUNTAIN_CRATER, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_1, true), + LOCATION(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_2, true), + LOCATION(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_3, true), + LOCATION(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_4, true), + LOCATION(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_5, true), + LOCATION(RC_DMC_DISTANT_PLATFORM_GREEN_RUPEE_6, true), + LOCATION(RC_DMC_DISTANT_PLATFORM_RED_RUPEE, true), + }, { + //Exits + Entrance(RR_DMC_CENTRAL_LOCAL, {[]{return logic->DistantScarecrow;}}), + }); } diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp index 4a278652550..82ef02f56ff 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp @@ -30,6 +30,9 @@ void AreaTable_Init_LostWoods() { LOCATION(RC_KF_BEAN_RUPEE_5, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST) || logic->CanUse(RG_HOVER_BOOTS))), LOCATION(RC_KF_BEAN_RUPEE_6, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST) || logic->CanUse(RG_HOVER_BOOTS))), LOCATION(RC_KF_BEAN_RED_RUPEE, logic->IsAdult && (CanPlantBean(RR_KOKIRI_FOREST) || logic->CanUse(RG_HOVER_BOOTS))), + LOCATION(RC_KF_SARIAS_ROOF_WEST_HEART, logic->IsChild), + LOCATION(RC_KF_SARIAS_ROOF_EAST_HEART, logic->IsChild), + LOCATION(RC_KF_SARIAS_ROOF_NORTH_HEART, logic->IsChild), LOCATION(RC_KF_GOSSIP_STONE, true), }, { //Exits @@ -184,6 +187,7 @@ void AreaTable_Init_LostWoods() { LOCATION(RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, logic->IsChild && logic->CanStunDeku), LOCATION(RC_LW_GS_ABOVE_THEATER, logic->IsAdult && logic->AtNight && ((CanPlantBean(RR_LW_BEYOND_MIDO) && logic->CanAdultAttack) || (randoCtx->GetTrickOption(RT_LW_GS_BEAN) && logic->CanUse(RG_HOOKSHOT) && (logic->CanUse(RG_LONGSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->HasBombchus || logic->CanUse(RG_DINS_FIRE)))) && logic->CanGetNightTimeGS), LOCATION(RC_LW_GS_BEAN_PATCH_NEAR_THEATER, logic->CanPlantBugs && (logic->CanChildAttack || (randoCtx->GetOption(RSK_SHUFFLE_SCRUBS).Is(RO_SCRUBS_OFF) && logic->DekuShield))), + LOCATION(RC_LW_BOULDER_RUPEE, logic->CanBlastOrSmash), }, { //Exits Entrance(RR_LW_FOREST_EXIT, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp index 3e4480cb6c7..e01193a13be 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp @@ -166,19 +166,19 @@ void AreaTable_Init_ZorasDomain() { LOCATION(RC_ZF_BOTTOM_NORTHEAST_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_BOTTOM_SOUTH_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), - LOCATION(RC_ZF_BOTTOM_NORTHWEST_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_BOTTOM_NORTHWEST_INNER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_BOTTOM_NORTH_MIDDLE_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), - LOCATION(RC_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_BOTTOM_NORTH_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_BOTTOM_SOUTH_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), - LOCATION(RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), + LOCATION(RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, logic->IsAdult && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer >= 24), LOCATION(RC_ZF_FAIRY_GOSSIP_STONE, true), LOCATION(RC_ZF_JABU_GOSSIP_STONE, true), diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index db46731b0df..06aeda7760b 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -461,6 +461,7 @@ typedef enum { RR_DMC_UPPER_GROTTO, RR_DMC_HAMMER_GROTTO, RR_DMC_GREAT_FAIRY_FOUNTAIN, + RR_DMC_DISTANT_PLATFORM, RR_ZR_FRONT, RR_ZORAS_RIVER, RR_ZR_BEHIND_WATERFALL, From 066004abb55eee1289dc8579b4ab3561bade9719 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 15 Aug 2024 21:05:36 -0700 Subject: [PATCH 15/54] Add freestanding checks to Save Flags Editor --- soh/include/z64save.h | 2 +- .../Enhancements/debugger/debugSaveEditor.h | 177 +++++++++++++++++- 2 files changed, 177 insertions(+), 2 deletions(-) diff --git a/soh/include/z64save.h b/soh/include/z64save.h index 71b39a44033..64fe0b07f90 100644 --- a/soh/include/z64save.h +++ b/soh/include/z64save.h @@ -283,7 +283,7 @@ typedef struct { // #endregion // #region SOH [Randomizer] // Upstream TODO: Move these to their own struct or name to more obviously specific to Randomizer - /* */ u16 randomizerInf[(RC_MAX + 15) / 16]; + /* */ u16 randomizerInf[(RAND_INF_MAX + 15) / 16]; /* */ u8 mqDungeonCount; /* */ u16 adultTradeItems; /* */ u8 triforcePiecesCollected; diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.h b/soh/soh/Enhancements/debugger/debugSaveEditor.h index c3e01b657cd..620e126243b 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.h +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.h @@ -348,7 +348,7 @@ const std::vector flagTables = { { 0x24, "Market Crowd Text Randomizer" }, { 0x30, "Entered the Market" }, } }, - { "Randomizer Inf Flags", RANDOMIZER_INF, 16, { + { "Randomizer Inf Flags", 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" }, @@ -620,6 +620,181 @@ const std::vector flagTables = { { 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_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" }, } }, }; From 7affcb4b4462d787f85712eb652e0381d8a03ee8 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 15 Aug 2024 22:49:27 -0700 Subject: [PATCH 16/54] Fix flags for Zora Fountain underwater rupees --- soh/soh/Enhancements/randomizer/location_list.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 9212a48deaa..67dc83eda6f 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1718,19 +1718,19 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_ZF_BOTTOM_NORTHEAST_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHEAST_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2100, 0x21, "Bottom Northeast Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHEAST_INNER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2200, 0x22, "Bottom Southeast Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHEAST_INNER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_SOUTH_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTH_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2300, 0x23, "Bottom South Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTH_INNER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[RC_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2400, 0x24, "Bottom Southwest Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_INNER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2400, 0x24, "Bottom Southwest Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHWEST_INNER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_NORTHWEST_INNER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHWEST_INNER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2500, 0x25, "Bottom Northwest Inner Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_INNER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_NORTH_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTH_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2600, 0x26, "Bottom North Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTH_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2700, 0x27, "Bottom Northeast Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHEAST_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2800, 0x28, "Bottom Southeast Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHEAST_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2900, 0x29, "Bottom South Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTH_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[RC_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2A00, 0x2A, "Bottom Southwest Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2A00, 0x2A, "Bottom Southwest Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHWEST_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2B00, 0x2B, "Bottom Northwest Middle Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_NORTH_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTH_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2C00, 0x2C, "Bottom North Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTH_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2D00, 0x2D, "Bottom Northeast Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHEAST_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2E00, 0x2E, "Bottom Southeast Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHEAST_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_SOUTH_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTH_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x2F00, 0x2F, "Bottom South Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTH_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); - locationTable[RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x3000, 0x30, "Bottom Southwest Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x3000, 0x30, "Bottom Southwest Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_SOUTHWEST_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE] = Location::Collectable(RC_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_ZORAS_FOUNTAIN, ACTOR_EN_ITEM00, SCENE_ZORAS_FOUNTAIN, 0x3100, 0x31, "Bottom Northwest Outer Rupee", RHT_ZORAS_FOUNTAIN_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZF_BOTTOM_NORTHWEST_OUTER_RUPEE), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_DEKU_TREE_LOBBY_LOWER_HEART] = Location::Collectable(RC_DEKU_TREE_LOBBY_LOWER_HEART, RCQUEST_VANILLA, RCTYPE_FREESTANDING, RCAREA_DEKU_TREE, ACTOR_EN_ITEM00, SCENE_DEKU_TREE, 0x2C03, 0x2C, "Lobby Lower Heart", RHT_DEKU_TREE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DEKU_TREE_LOBBY_LOWER_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_DEKU_TREE); From 0075f26abd8026e823bcd91296537e473554dcb5 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 15 Aug 2024 23:35:34 -0700 Subject: [PATCH 17/54] Add option to enable freestanding shuffle for either dungeons or overworld --- .../randomizer/3drando/item_pool.cpp | 5 ++-- .../randomizer/randomizer_check_tracker.cpp | 30 +++++++++++++++++++ soh/soh/Enhancements/randomizer/settings.cpp | 2 +- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 01827c0cd37..a3afc41e746 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -620,9 +620,10 @@ static void PlaceVanillaOverworldFish() { static void PlaceFreestandingItems() { auto ctx = Rando::Context::GetInstance(); + auto option = ctx->GetOption(RSK_SHUFFLE_FREESTANDING); for (RandomizerCheck loc : ctx->GetLocations(Rando::StaticData::overworldLocations, Category::cFreestanding)) { RandomizerGet vanillaItem = Rando::StaticData::GetLocation(loc)->GetVanillaItem(); - if (ctx->GetOption(RSK_SHUFFLE_FREESTANDING)) { + if (option.Is(RO_TOKENSANITY_OVERWORLD) || option.Is(RO_TOKENSANITY_ALL)) { AddItemToMainPool(vanillaItem); } else { ctx->PlaceItemInLocation(loc, vanillaItem, false, true); @@ -632,7 +633,7 @@ static void PlaceFreestandingItems() { for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { for (RandomizerCheck loc : ctx->GetLocations(dungeon->GetDungeonLocations(), Category::cFreestanding)) { RandomizerGet vanillaItem = Rando::StaticData::GetLocation(loc)->GetVanillaItem(); - if (ctx->GetOption(RSK_SHUFFLE_FREESTANDING)) { + if (option.Is(RO_TOKENSANITY_DUNGEONS) || option.Is(RO_TOKENSANITY_ALL)) { AddItemToMainPool(vanillaItem); } else { ctx->PlaceItemInLocation(loc, vanillaItem, false, true); diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index de46a449630..dbd46e31411 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -62,6 +62,8 @@ bool showScrubs; bool showMerchants; bool showBeehives; bool showCows; +bool showOverworldFreestanding; +bool showDungeonFreestanding; bool showAdultTrade; bool showKokiriSword; bool showMasterSword; @@ -1249,6 +1251,30 @@ void LoadSettings() { fishsanityMode = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY); fishsanityPondCount = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY_POND_COUNT); fishsanityAgeSplit = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FISHSANITY_AGE_SPLIT); + + if (IS_RANDO) { + switch (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_FREESTANDING)) { + case RO_TOKENSANITY_ALL: + showOverworldFreestanding = true; + showDungeonFreestanding = true; + break; + case RO_TOKENSANITY_OVERWORLD: + showOverworldFreestanding = true; + showDungeonFreestanding = false; + break; + case RO_TOKENSANITY_DUNGEONS: + showOverworldFreestanding = false; + showDungeonFreestanding = true; + break; + default: + showOverworldFreestanding = false; + showDungeonFreestanding = false; + break; + } + } else { // Vanilla + showOverworldFreestanding = false; + showDungeonFreestanding = true; + } } bool IsCheckShuffled(RandomizerCheck rc) { @@ -1284,6 +1310,10 @@ bool IsCheckShuffled(RandomizerCheck rc) { ) && (loc->GetRCType() != RCTYPE_COW || showCows) && (loc->GetRCType() != RCTYPE_FISH || OTRGlobals::Instance->gRandoContext->GetFishsanity()->GetFishLocationIncluded(loc)) && + (loc->GetRCType() != RCTYPE_FREESTANDING || + (showOverworldFreestanding && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || + (showDungeonFreestanding && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea())) + ) && (loc->GetRCType() != RCTYPE_ADULT_TRADE || showAdultTrade || rc == RC_KAK_ANJU_AS_ADULT || // adult trade checks that are always shuffled diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 6fe181619d0..4208b121117 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -122,7 +122,7 @@ void Settings::CreateOptions() { mOptions[RSK_SHUFFLE_BOSS_SOULS] = Option::U8("Shuffle Boss Souls", {"Off", "On", "On + Ganon"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleBossSouls"), mOptionDescriptions[RSK_SHUFFLE_BOSS_SOULS], WidgetType::Combobox); mOptions[RSK_SHUFFLE_DEKU_STICK_BAG] = Option::Bool("Shuffle Deku Stick Bag", CVAR_RANDOMIZER_SETTING("ShuffleDekuStickBag"), mOptionDescriptions[RSK_SHUFFLE_DEKU_STICK_BAG], IMFLAG_SEPARATOR_BOTTOM, WidgetType::Checkbox, RO_GENERIC_OFF); mOptions[RSK_SHUFFLE_DEKU_NUT_BAG] = Option::Bool("Shuffle Deku Nut Bag", CVAR_RANDOMIZER_SETTING("ShuffleDekuNutBag"), mOptionDescriptions[RSK_SHUFFLE_DEKU_NUT_BAG], IMFLAG_SEPARATOR_BOTTOM, WidgetType::Checkbox, RO_GENERIC_OFF); - mOptions[RSK_SHUFFLE_FREESTANDING] = Option::Bool("Shuffle Freestanding Items", CVAR_RANDOMIZER_SETTING("ShuffleFreestanding"), mOptionDescriptions[RSK_SHUFFLE_FREESTANDING], IMFLAG_SEPARATOR_BOTTOM, WidgetType::Checkbox, RO_GENERIC_OFF); + mOptions[RSK_SHUFFLE_FREESTANDING] = Option::U8("Shuffle Freestanding Items", {"Off", "Dungeons", "Overworld", "All Items"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleFreestanding"), mOptionDescriptions[RSK_SHUFFLE_FREESTANDING], WidgetType::Combobox, RO_TOKENSANITY_OFF); mOptions[RSK_FISHSANITY] = Option::U8("Fishsanity", {"Off", "Shuffle only Hyrule Loach", "Shuffle Fishing Pond", "Shuffle Overworld Fish", "Shuffle Both"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("Fishsanity"), mOptionDescriptions[RSK_FISHSANITY], WidgetType::Combobox, RO_FISHSANITY_OFF); mOptions[RSK_FISHSANITY_POND_COUNT] = Option::U8("Pond Fish Count", {NumOpts(0,17,1)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("FishsanityPondCount"), mOptionDescriptions[RSK_FISHSANITY_POND_COUNT], WidgetType::Slider, 0, true, IMFLAG_NONE); mOptions[RSK_FISHSANITY_AGE_SPLIT] = Option::Bool("Pond Age Split", CVAR_RANDOMIZER_SETTING("FishsanityAgeSplit"), mOptionDescriptions[RSK_FISHSANITY_AGE_SPLIT]); From 6dfb5c7ed0679f682872efdec18cd5bb01f9eff1 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Fri, 16 Aug 2024 15:04:56 -0700 Subject: [PATCH 18/54] Add missing MQ checks and fix mac & windows compile error --- soh/soh/Enhancements/randomizer/3drando/item_pool.cpp | 2 +- .../randomizer/3drando/location_access/locacc_fire_temple.cpp | 3 +++ .../3drando/location_access/locacc_ganons_castle.cpp | 2 ++ soh/soh/Enhancements/randomizer/hook_handlers.cpp | 2 +- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index a3afc41e746..0d121781ac5 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -633,7 +633,7 @@ static void PlaceFreestandingItems() { for (auto dungeon : ctx->GetDungeons()->GetDungeonList()) { for (RandomizerCheck loc : ctx->GetLocations(dungeon->GetDungeonLocations(), Category::cFreestanding)) { RandomizerGet vanillaItem = Rando::StaticData::GetLocation(loc)->GetVanillaItem(); - if (option.Is(RO_TOKENSANITY_DUNGEONS) || option.Is(RO_TOKENSANITY_ALL)) { + if (option.Is(RO_TOKENSANITY_DUNGEONS) || option.Is(RO_TOKENSANITY_ALL)) { AddItemToMainPool(vanillaItem); } else { ctx->PlaceItemInLocation(loc, vanillaItem, false, true); diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp index 531d911a178..94c7dfa4f6c 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp @@ -361,6 +361,9 @@ void AreaTable_Init_FireTemple() { LOCATION(RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, logic->HasFireSource && logic->HasExplosives && logic->IsAdult && (logic->CanUse(RG_HOOKSHOT) || randoCtx->GetTrickOption(RT_FIRE_MQ_BLOCKED_CHEST))), //Trick: logic->HasFireSource && logic->HasExplosives && logic->IsAdult && (logic->CanUse(RG_HOOKSHOT) || LogicFireMQBlockedChest) LOCATION(RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, true), + LOCATION(RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LEFT_HEART, logic->CanUse(RG_GORON_TUNIC) && logic->SmallKeys(RR_FIRE_TEMPLE, 1)), + LOCATION(RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_RIGHT_HEART, logic->CanUse(RG_GORON_TUNIC) && logic->SmallKeys(RR_FIRE_TEMPLE, 1)), + LOCATION(RC_FIRE_TEMPLE_MQ_FIRE_PILLAR_LOWER_HEART, logic->CanUse(RG_GORON_TUNIC) && logic->SmallKeys(RR_FIRE_TEMPLE, 1)), }, { //Exits Entrance(RR_FIRE_TEMPLE_MQ_LOWER_MAZE, {[]{return logic->IsAdult && logic->CanUse(RG_GORON_TUNIC) && logic->SmallKeys(RR_FIRE_TEMPLE, 2) && (logic->HasFireSource || (randoCtx->GetTrickOption(RT_FIRE_MQ_CLIMB) && logic->HoverBoots));}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp index 6ca88bdaa1b..5a5d4b25df9 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp @@ -220,6 +220,8 @@ void AreaTable_Init_GanonsCastle() { }, { //Locations LOCATION(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, (logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_BIGGORON_SWORD)) && logic->CanUse(RG_ZELDAS_LULLABY)), + LOCATION(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART, (logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_BIGGORON_SWORD)) && logic->SmallKeys(RR_GANONS_CASTLE, 2)), + LOCATION(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART, (logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_BIGGORON_SWORD)) && logic->SmallKeys(RR_GANONS_CASTLE, 2)), }, {}); } } diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index a2816a15cf8..91a97c9fc1e 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -677,7 +677,7 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void item00->actor.params = ITEM00_SOH_DUMMY; item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; if (loc->GetCollectionCheck().type == SPOILER_CHK_RANDOMIZER_INF) { - item00->randoInf = loc->GetCollectionCheck().flag; + item00->randoInf = static_cast(loc->GetCollectionCheck().flag); } *should = Rando::Context::GetInstance()->GetItemLocation(loc->GetRandomizerCheck())->HasObtained(); } From bcc10ea028537c13b67d3ac2306e8df0d8c43adb Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Fri, 16 Aug 2024 16:10:34 -0700 Subject: [PATCH 19/54] Improve description and add hint text --- .../hint_list/hint_list_exclude_dungeon.cpp | 62 +++++++++++++++++++ .../hint_list/hint_list_exclude_overworld.cpp | 60 ++++++++++++++++++ .../Enhancements/randomizer/location_list.cpp | 16 ++--- .../randomizer/option_descriptions.cpp | 14 +++-- .../Enhancements/randomizer/randomizerTypes.h | 1 + 5 files changed, 141 insertions(+), 12 deletions(-) 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 b86b8f33e15..4531d49783f 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 @@ -117,6 +117,10 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*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]]#. + hintTextTable[RHT_DEKU_TREE_HEART] = HintText(CustomMessage("They say that a #heart in the Deku Tree# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | DODONGOS CAVERN | ---------------------------*/ @@ -275,6 +279,10 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The /*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_HEART] = HintText(CustomMessage("They say that a #heart in Dodongo's Cavern# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | JABU JABUS BELLY | ---------------------------*/ @@ -421,6 +429,15 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The /*german*/ "", /*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_JABU_JABU_RUPEE] = HintText(CustomMessage("They say that #underwater in Jabu-Jabu's Belly# lies #[[1]]#.", + /*german*/ "", + /*french*/ "", {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*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | FOREST TEMPLE | ---------------------------*/ @@ -643,6 +660,10 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The /*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_FOREST_TEMPLE_HEART] = HintText(CustomMessage("They say that a #heart in the Forest Temple# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | FIRE TEMPLE | ---------------------------*/ @@ -831,6 +852,10 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa /*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_FIRE_TEMPLE_HEART] = HintText(CustomMessage("They say that a #heart in the Fire Temple# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | WATER TEMPLE | ---------------------------*/ @@ -958,6 +983,10 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa /*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_WATER_TEMPLE_HEART] = HintText(CustomMessage("They say that in a #river in the Water Temple# lies #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | SPIRIT TEMPLE | ---------------------------*/ @@ -1191,6 +1220,10 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa /*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_SPIRIT_TEMPLE_HEART] = HintText(CustomMessage("They say that on a #small platform# in the Spirit Temple lies #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | SHADOW TEMPLE | ---------------------------*/ @@ -1434,6 +1467,10 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th /*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_SHADOW_TEMPLE_HEART] = HintText(CustomMessage("They say that a #heart in the Shadow Temple# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | BOTTOM OF THE WELL | ---------------------------*/ @@ -1552,6 +1589,14 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th /*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_BOTTOM_OF_THE_WELL_HEART] = HintText(CustomMessage("They say that a #heart within the well# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_BOTTOM_OF_THE_WELL_RUPEE] = HintText(CustomMessage("They say that a #hidden path through the floor# the well# leads to #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | ICE CAVERN | ---------------------------*/ @@ -1625,6 +1670,14 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th /*french*/ "Selon moi, une #Skulltula figée dans la glace rouge# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula tras un ardiente hielo# otorga #[[1]]#. + hintTextTable[RHT_ICE_CAVERN_HEART] = HintText(CustomMessage("They say that atop on a #frozen pillar# lies #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_ICE_CAVERN_RUPEE] = HintText(CustomMessage("They say that a #rupee in a frozen cavern# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | GERUDO TRAINING GROUNDS | ---------------------------*/ @@ -1803,6 +1856,10 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th /*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 Dinalfos# is #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | GANONS CASTLE | ---------------------------*/ @@ -1995,5 +2052,10 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th /*german*/ "", /*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_HEART] = HintText(CustomMessage("They say that a #heart in Ganon's Castle# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + } } 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 570101b4e00..21df002bdaf 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 @@ -1487,5 +1487,65 @@ void StaticData::HintTable_Init_Exclude_Overworld() { /*german*/ "", /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena detrás del rey de los zoras# esconde #[[1]]#. + hintTextTable[RHT_KOKIRI_FOREST_RUPEE] = HintText(CustomMessage("They say that a rupee in a #tranquil forest# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + // /*spanish*/ + hintTextTable[RHT_KOKIRI_FOREST_HEART] = HintText(CustomMessage("They say that a heart in a #tranquil forest# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + // /*spanish*/ + hintTextTable[RHT_SARIAS_HOUSE_HEART] = HintText(CustomMessage("They say that a heart in a #dear friend's home# hides #[[1]]#.", + /*german*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + // /*spanish*/ + hintTextTable[RHT_LOST_WOODS_RUPEE] = HintText(CustomMessage("They say that under a #boulder in the woods# lies #[[1]]#.", + /*german*/ "", + /*french*/ "", {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*/ "", + /*french*/ "", {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*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + // /*spanish*/ + hintTextTable[RHT_LABORATORY_RUPEE] = HintText(CustomMessage("They say that at the #bottom of a tank# lies #[[1]]#.", + /*german*/ "", + /*french*/ "", {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*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + // /*spanish*/ + hintTextTable[RHT_GERUDO_VALLEY_GROTTO_RUPEE] = HintText(CustomMessage("They say that an Octarok in an #underground spring# guards #[[1]]#.", + /*german*/ "", + /*french*/ "", {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*/ "", + /*french*/ "", {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*/ "", + /*french*/ "", {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*/ "", + /*french*/ "", {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*/ "", + /*french*/ "", {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*/ "", + /*french*/ "", {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*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + // /*spanish*/ } } \ 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 67dc83eda6f..efe16dbe294 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1645,14 +1645,14 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_KF_BEAN_RED_RUPEE] = Location::Collectable(RC_KF_BEAN_RED_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_KOKIRI_FOREST, ACTOR_EN_ITEM00, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(1304, -548), 0, "Bean Platform Red Rupee", RHT_KOKIRI_FOREST_RUPEE, RG_RED_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_KF_BEAN_RED_RUPEE), SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); locationTable[RC_LW_BOULDER_RUPEE] = Location::Collectable(RC_LW_BOULDER_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x1301, 0x13, "Boulder Rupee", RHT_LOST_WOODS_RUPEE, RG_BLUE_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[RC_LW_SHORTCUT_RUPEE_1] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3400, 0x34, "Underwater Shortcut Rupee 1", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_1), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[RC_LW_SHORTCUT_RUPEE_2] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3500, 0x35, "Underwater Shortcut Rupee 2", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_2), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[RC_LW_SHORTCUT_RUPEE_3] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3600, 0x36, "Underwater Shortcut Rupee 3", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_3), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[RC_LW_SHORTCUT_RUPEE_4] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3700, 0x37, "Underwater Shortcut Rupee 4", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_4), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[RC_LW_SHORTCUT_RUPEE_5] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3900, 0x39, "Underwater Shortcut Rupee 5", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_5), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[RC_LW_SHORTCUT_RUPEE_6] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3A00, 0x3A, "Underwater Shortcut Rupee 6", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_6), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[RC_LW_SHORTCUT_RUPEE_7] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_7, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3B00, 0x3B, "Underwater Shortcut Rupee 7", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_7), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); - locationTable[RC_LW_SHORTCUT_RUPEE_8] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_8, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3C00, 0x3C, "Underwater Shortcut Rupee 8", RHT_LOST_WOODS_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_8), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_1] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_1, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3400, 0x34, "Underwater Shortcut Rupee 1", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_1), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_2] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_2, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3500, 0x35, "Underwater Shortcut Rupee 2", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_2), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_3] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_3, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3600, 0x36, "Underwater Shortcut Rupee 3", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_3), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_4] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_4, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3700, 0x37, "Underwater Shortcut Rupee 4", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_4), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_5] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_5, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3900, 0x39, "Underwater Shortcut Rupee 5", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_5), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_6] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_6, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3A00, 0x3A, "Underwater Shortcut Rupee 6", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_6), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_7] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_7, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3B00, 0x3B, "Underwater Shortcut Rupee 7", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_7), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_SHORTCUT_RUPEE_8] = Location::Collectable(RC_LW_SHORTCUT_RUPEE_8, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LOST_WOODS, ACTOR_EN_ITEM00, SCENE_LOST_WOODS, 0x3C00, 0x3C, "Underwater Shortcut Rupee 8", RHT_LOST_WOODS_SHORTCUT_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LW_SHORTCUT_RUPEE_8), SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[RC_LH_FRONT_RUPEE] = Location::Collectable(RC_LH_FRONT_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LAKE_HYLIA, ACTOR_EN_ITEM00, SCENE_LAKE_HYLIA, 0x2000, 0x20, "Underwater Front Rupee", RHT_LAKE_HYLIA_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_FRONT_RUPEE), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); locationTable[RC_LH_MIDDLE_RUPEE] = Location::Collectable(RC_LH_MIDDLE_RUPEE, RCQUEST_BOTH, RCTYPE_FREESTANDING, RCAREA_LAKE_HYLIA, ACTOR_EN_ITEM00, SCENE_LAKE_HYLIA, 0x2100, 0x21, "Underwater Middle Rupee", RHT_LAKE_HYLIA_RUPEE, RG_GREEN_RUPEE, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_LH_MIDDLE_RUPEE), SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index a956fac0170..73969417d82 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -336,10 +336,16 @@ void Settings::CreateOptionDescriptions() { "have collected all 100 Gold Skulltula Tokens.\n" "\n" "You can still talk to him multiple times to get Huge Rupees."; - mOptionDescriptions[RSK_SHUFFLE_FREESTANDING] = - "Freestanding rupees & hearts are shuffles to random items.\n" - "\n" - "Freestanding heart pieces and small keys are already shuffled by default."; + mOptionDescriptions[RSK_SHUFFLE_FREESTANDING] = "Freestanding rupees & hearts are shuffles to random items. " + "Freestanding heart pieces and small keys are already shuffled by default.\n" + "\n" + "Off - freestanding rupees & hearts will not be shuffled.\n" + "\n" + "Dungeons - Only freestanding rupees & hearts that are within dungeons.\n" + "\n" + "Overworld - Only freestanding rupees & hearts that are outside of dungeons.\n" + "\n" + "All Items - Shuffle all freestanding rupees & hearts."; mOptionDescriptions[RSK_SHUFFLE_DUNGEON_REWARDS] = "Shuffles the location of spiritual stones and medallions.\n" "\n" diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 06aeda7760b..8ec30ede4fd 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -3850,6 +3850,7 @@ typedef enum { RHT_KOKIRI_FOREST_HEART, RHT_SARIAS_HOUSE_HEART, RHT_LOST_WOODS_RUPEE, + RHT_LOST_WOODS_SHORTCUT_RUPEE, RHT_LAKE_HYLIA_RUPEE, RHT_LABORATORY_RUPEE, RHT_DAMPES_GRAVE_RUPEE, From 298cec252fae037651725ce12572a9261a57d33b Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Sat, 17 Aug 2024 20:21:09 -0700 Subject: [PATCH 20/54] Update logic for Bombchu fixes --- .../3drando/location_access/locacc_bottom_of_the_well.cpp | 4 ++-- .../randomizer/3drando/location_access/locacc_deku_tree.cpp | 2 +- .../3drando/location_access/locacc_shadow_temple.cpp | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp index bf05425b5ad..6cd3fcb64b1 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp @@ -47,8 +47,8 @@ void AreaTable_Init_BottomOfTheWell() { LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_MIDDLE_RUPEE, randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)), LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_BACK_RIGHT_RUPEE, randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)), LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_PLATFORM_RIGHT_RUPEE, randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)), - LOCATION(RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_FRONT_LEFT_HEART, (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_ZELDAS_LULLABY)) && logic->Sticks || logic->CanUse(RG_DINS_FIRE)), - LOCATION(RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART, (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_ZELDAS_LULLABY)) && logic->Sticks || logic->CanUse(RG_DINS_FIRE)), + LOCATION(RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_FRONT_LEFT_HEART, (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_ZELDAS_LULLABY)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_DINS_FIRE))), + LOCATION(RC_BOTTOM_OF_THE_WELL_COFFIN_ROOM_MIDDLE_RIGHT_HEART, (logic->HasItem(RG_BRONZE_SCALE) || logic->CanUse(RG_ZELDAS_LULLABY)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_DINS_FIRE))), }, { //Exits Entrance(RR_BOTTOM_OF_THE_WELL_ENTRYWAY, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_deku_tree.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_deku_tree.cpp index ec75c75c2f4..1642a9c61cb 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_deku_tree.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_deku_tree.cpp @@ -192,7 +192,7 @@ void AreaTable_Init_DekuTree() { Here(RR_DEKU_TREE_MQ_COMPASS_ROOM, []{return logic->CanUse(RG_BOMBCHU_5) || (logic->Bombs && (logic->CanUse(RG_SONG_OF_TIME) || logic->IsAdult)) || (logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER) && (logic->CanUse(RG_SONG_OF_TIME) || randoCtx->GetTrickOption(RT_DEKU_MQ_COMPASS_GS)));})), - LOCATION(RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, logic->HasBombchus || (logic->Bombs && (logic->CanUse(RG_SONG_OF_TIME) || logic->IsAdult)) || + LOCATION(RC_DEKU_TREE_MQ_COMPASS_ROOM_HEART, logic->CanUse(RG_BOMBCHU_5) || (logic->Bombs && (logic->CanUse(RG_SONG_OF_TIME) || logic->IsAdult)) || (logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER) && (logic->CanUse(RG_SONG_OF_TIME) || randoCtx->GetTrickOption(RT_DEKU_MQ_COMPASS_GS)))), }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp index fe75ecc8c83..d26270840d5 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp @@ -86,7 +86,7 @@ void AreaTable_Init_ShadowTemple() { LOCATION(RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, logic->CanAdultAttack), LOCATION(RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_LEFT_HEART, logic->CanUse(RG_DISTANT_SCARECROW)), LOCATION(RC_SHADOW_TEMPLE_AFTER_SHIP_UPPER_RIGHT_HEART, logic->CanUse(RG_DISTANT_SCARECROW)), - LOCATION(RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DISTANT_SCARECROW) || (randoCtx->GetTrickOption(RT_SHADOW_STATUE) && logic->HasBombchus)) && logic->CanUse(RG_SONG_OF_TIME) || (logic->CanUse(RG_DISTANT_SCARECROW) && logic->CanUse(RG_HOVER_BOOTS))), + LOCATION(RC_SHADOW_TEMPLE_AFTER_SHIP_LOWER_HEART, (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_DISTANT_SCARECROW) || (randoCtx->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) || (randoCtx->GetTrickOption(RT_SHADOW_STATUE) && logic->CanUse(RG_BOMBCHU_5))) && logic->SmallKeys(RR_SHADOW_TEMPLE, 5) && logic->CanUse(RG_HOVER_BOOTS) && logic->BossKeyShadowTemple;}}) @@ -173,7 +173,7 @@ void AreaTable_Init_ShadowTemple() { LOCATION(RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, logic->Bow || (randoCtx->GetTrickOption(RT_SHADOW_STATUE) && logic->CanUse(RG_BOMBCHU_5))), LOCATION(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART, logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_LONGSHOT)), LOCATION(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART, logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_LONGSHOT)), - LOCATION(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, (logic->CanUse(RG_FAIRY_BOW) || (randoCtx->GetTrickOption(RT_SHADOW_STATUE) && logic->HasBombchus)) && logic->CanUse(RG_SONG_OF_TIME)), + LOCATION(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, (logic->CanUse(RG_FAIRY_BOW) || (randoCtx->GetTrickOption(RT_SHADOW_STATUE) && logic->CanUse(RG_BOMBCHU_5))) && logic->CanUse(RG_SONG_OF_TIME)), }, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_INVISIBLE_MAZE, {[]{return logic->Bow && logic->CanUse(RG_SONG_OF_TIME) && logic->IsAdult && logic->CanUse(RG_LONGSHOT);}}), From 1e9092c871b2211e7903f4850275220c584ba5d7 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Fri, 23 Aug 2024 02:07:35 -0700 Subject: [PATCH 21/54] Add missing Spirit Temple MQ hearts --- .../3drando/hint_list/hint_list_exclude_dungeon.cpp | 4 ++++ .../3drando/location_access/locacc_spirit_temple.cpp | 2 ++ soh/soh/Enhancements/randomizer/dungeon.cpp | 2 ++ soh/soh/Enhancements/randomizer/location_list.cpp | 3 +++ soh/soh/Enhancements/randomizer/randomizerTypes.h | 3 +++ soh/soh/Enhancements/randomizer/randomizer_inf.h | 2 ++ 6 files changed, 16 insertions(+) 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 5cd7c266cdb..ab4be795696 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 @@ -1224,6 +1224,10 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa /*german*/ "", /*french*/ "", {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*/ "", + /*french*/ "", {QM_RED, QM_GREEN})); + /*-------------------------- | SHADOW TEMPLE | ---------------------------*/ diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp index 5b55c1c92d3..550473fbed2 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp @@ -159,6 +159,8 @@ void AreaTable_Init_SpiritTemple() { LOCATION(RC_SPIRIT_TEMPLE_MQ_MAP_CHEST, logic->KokiriSword || logic->Bombs), LOCATION(RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, logic->CanUse(RG_BOMBCHU_5) && logic->SmallKeys(RR_SPIRIT_TEMPLE, 7) && logic->Slingshot && (logic->CanUse(RG_DINS_FIRE) || (Here(RR_SPIRIT_TEMPLE_MQ_ADULT, []{return logic->IsAdult && (logic->CanUse(RG_FIRE_ARROWS) || (randoCtx->GetTrickOption(RT_SPIRIT_MQ_FROZEN_EYE) && logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_SONG_OF_TIME)));})))), //Trick: logic->CanUse(RG_BOMBCHU_5) && logic->SmallKeys(RR_SPIRIT_TEMPLE, 7) && logic->Slingshot && (logic->CanUse(RG_DINS_FIRE) || (SPIRIT_TEMPLE_MQ_ADULT.Adult() && logic->IsAdult && (logic->CanUse(RG_FIRE_ARROWS) || (LogicSpiritMQFrozenEye && logic->CanUse(RG_FAIRY_BOW) && logic->CanUse(RG_SONG_OF_TIME))))) + LOCATION(RC_SPIRIT_TEMPLE_MQ_CHILD_LEFT_HEART, logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW)), + LOCATION(RC_SPIRIT_TEMPLE_MQ_CHILD_RIGHT_HEART, logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW)), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_SHARED, {[]{return logic->CanUse(RG_BOMBCHU_5) && logic->SmallKeys(RR_SPIRIT_TEMPLE, 2);}}), diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index a9304ce9f2e..d0011ed1dcd 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -527,6 +527,8 @@ Dungeons::Dungeons() { RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, + RC_SPIRIT_TEMPLE_MQ_CHILD_LEFT_HEART, + RC_SPIRIT_TEMPLE_MQ_CHILD_RIGHT_HEART, }, { // Shared Locations diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 7fa087ebf82..8f20dc6a64e 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -1834,6 +1834,9 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3903, 0x39, "MQ After Ship Upper Right Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); locationTable[RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART] = Location::Collectable(RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_SHADOW_TEMPLE, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, 0x3C03, 0x3C, "MQ After Ship Lower Heart", RHT_SHADOW_TEMPLE_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_LEFT_HEART] = Location::Collectable(RC_SPIRIT_TEMPLE_MQ_CHILD_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, 0x2C03, 0x2C, "MQ Child Early Left Heart", RHT_SPIRIT_TEMPLE_MQ_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_MQ_CHILD_RIGHT_HEART] = Location::Collectable(RC_SPIRIT_TEMPLE_MQ_CHILD_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_SPIRIT_TEMPLE, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, 0x2E03, 0x2E, "MQ Child Early Right Heart", RHT_SPIRIT_TEMPLE_MQ_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_TEMPLE_MQ_CHILD_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2003, 0x22, "MQ Coffin Room Front Right Invisible Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2103, 0x21, "MQ Bomb Alcove Left Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART] = Location::Collectable(RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, RCQUEST_MQ, RCTYPE_FREESTANDING, RCAREA_BOTTOM_OF_THE_WELL, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, 0x2203, 0x22, "MQ Bomb Alcove Right Heart", RHT_BOTTOM_OF_THE_WELL_HEART, RG_RECOVERY_HEART, { Category::cFreestanding }, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART), SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index c2ec014864f..5cba899235a 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1842,6 +1842,8 @@ typedef enum { RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_LEFT_HEART, RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_UPPER_RIGHT_HEART, RC_SHADOW_TEMPLE_MQ_AFTER_SHIP_LOWER_HEART, + RC_SPIRIT_TEMPLE_MQ_CHILD_LEFT_HEART, + RC_SPIRIT_TEMPLE_MQ_CHILD_RIGHT_HEART, RC_BOTTOM_OF_THE_WELL_MQ_COFFIN_ROOM_FRONT_RIGHT_HEART, RC_BOTTOM_OF_THE_WELL_MQ_BOMB_LEFT_HEART, RC_BOTTOM_OF_THE_WELL_MQ_BOMB_RIGHT_HEART, @@ -3863,6 +3865,7 @@ typedef enum { RHT_WATER_TEMPLE_HEART, RHT_SHADOW_TEMPLE_HEART, RHT_SPIRIT_TEMPLE_HEART, + RHT_SPIRIT_TEMPLE_MQ_HEART, RHT_BOTTOM_OF_THE_WELL_HEART, RHT_BOTTOM_OF_THE_WELL_RUPEE, RHT_ICE_CAVERN_HEART, diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 9e6a24b04fd..cf873519aee 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -476,6 +476,8 @@ typedef enum { 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, From 5819cd438347ead2a1b2efa343032d226d07c369 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Wed, 28 Aug 2024 16:58:02 -0700 Subject: [PATCH 22/54] Add missing settings entries --- soh/soh/Enhancements/randomizer/settings.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 4208b121117..9bf91a30a1a 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -1080,6 +1080,7 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_SCRUBS], &mOptions[RSK_SHUFFLE_BEEHIVES], &mOptions[RSK_SHUFFLE_COWS], + &mOptions[RSK_SHUFFLE_FREESTANDING], &mOptions[RSK_SHUFFLE_MAGIC_BEANS], &mOptions[RSK_SHUFFLE_MERCHANTS], &mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES], @@ -1123,6 +1124,7 @@ void Settings::CreateOptions() { { "Shuffle Settings:Beehive Shuffle", RSK_SHUFFLE_BEEHIVES }, { "Shuffle Settings:Shuffle Cows", RSK_SHUFFLE_COWS }, { "Shuffle Settings:Tokensanity", RSK_SHUFFLE_TOKENS }, + { "Shuffle Settings:Freestanding Shuffle", RSK_SHUFFLE_FREESTANDING }, { "Shuffle Settings:Shuffle Ocarinas", RSK_SHUFFLE_OCARINA }, { "Shuffle Settings:Shuffle Ocarina Buttons", RSK_SHUFFLE_OCARINA_BUTTONS }, { "Shuffle Settings:Shuffle Swim", RSK_SHUFFLE_SWIM }, @@ -2349,6 +2351,17 @@ void Settings::ParseJson(nlohmann::json spoilerFileJson) { mOptions[index].SetSelectedIndex(RO_SCRUBS_RANDOM); } break; + case RSK_SHUFFLE_FREESTANDING: + if (it.value() == "Off") { + mOptions[index].SetSelectedIndex(RO_TOKENSANITY_OFF); + } else if (it.value() == "Overworld") { + mOptions[index].SetSelectedIndex(RO_TOKENSANITY_OVERWORLD); + } else if (it.value() == "Dungeons") { + mOptions[index].SetSelectedIndex(RO_TOKENSANITY_DUNGEONS); + } else if (it.value() == "All Items") { + mOptions[index].SetSelectedIndex(RO_TOKENSANITY_ALL); + } + break; case RSK_SHUFFLE_FISHING_POLE: case RSK_FISHSANITY_AGE_SPLIT: case RSK_FISHING_POLE_HINT: From b50d14defafa04e7201b606c776f41e20d8312a6 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 29 Aug 2024 13:20:20 -0700 Subject: [PATCH 23/54] Actually add Forest Temple trick to the tricks menu. --- soh/soh/Enhancements/randomizer/settings.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 9bf91a30a1a..2c4b5bedf45 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -507,6 +507,7 @@ void Settings::CreateOptions() { &mTrickOptions[RT_FOREST_OUTDOORS_LEDGE], &mTrickOptions[RT_FOREST_DOORFRAME], &mTrickOptions[RT_FOREST_OUTSIDE_BACKDOOR], + &mTrickOptions[RT_FOREST_OUTDOORS_HEARTS_BOOMERANG], &mTrickOptions[RT_FOREST_MQ_WELL_SWIM], &mTrickOptions[RT_FOREST_MQ_BLOCK_PUZZLE], &mTrickOptions[RT_FOREST_MQ_JS_HALLWAY_SWITCH], From 1f85420625f4254ae23c6eff86cd5d946c314c42 Mon Sep 17 00:00:00 2001 From: Extloga <141232749+Extloga@users.noreply.github.com> Date: Mon, 2 Sep 2024 16:32:38 +0200 Subject: [PATCH 24/54] Additions for the German translation in two files (#4304) * Additions for the German translation in hint_list_exclude_dungeon.cpp * Additions for the German translation in hint_list_exclude_overworld.cpp --- .../hint_list/hint_list_exclude_dungeon.cpp | 566 +++++++++--------- .../hint_list/hint_list_exclude_overworld.cpp | 535 +++++++++-------- 2 files changed, 552 insertions(+), 549 deletions(-) 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 99659838b34..c2117c4eb38 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 @@ -33,7 +33,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*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]]# verstecken würden.", + /*german*/ "Man erzählt sich, daß #Spinnweben 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]]#. @@ -58,7 +58,7 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { // /*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]]# verstecken würden.", + /*german*/ "Man erzählt sich, daß #Spinnweben 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]]#. @@ -309,7 +309,7 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, cierta #roca rodeada de vacas# esconde #[[1]]#. {}, { CustomMessage("They say that #pop rocks# hide #[[1]]#.", - /*german*/ "Man erzählt sich, daß #Knallfelsen# #[[1]]# verstecken würden.", + /*german*/ "Man erzählt sich, daß #Knallfelsen# #[[1]]# verbergen würden.", /*french*/ "Selon moi, des #pierres aux reins# cachent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #cepillarse los dientes con explosivos# revela #[[1]]#. CustomMessage("They say that an #explosive palate# holds #[[1]]#.", @@ -358,7 +358,7 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, unos #stingers engullidos por Jabu-Jabu# guardan #[[1]]#. {}, { CustomMessage("They say that a school of #stingers swallowed by a deity# guard #[[1]]#.", - /*german*/ "Man erzählt sich, daß von #Jabu-Jabu verschluckte Rochen# #[[1]]# bewachen würden.", + /*german*/ "Man erzählt sich, daß von #einer Gottheit verschluckte Rochen# #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #raies avallées par le gardien# protègent #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, unos #stingers engullidos por cierta deidad# guardan #[[1]]#. @@ -585,61 +585,61 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*spanish*/ Según dicen, en una #sala con otro punto de vista# se esconde #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_PHANTOM_GANON_HEART] = HintText(CustomMessage("They say that #Phantom Ganon# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Phantom-Ganon# #[[1]]# besäße.", /*french*/ "Selon moi, #Ganon Spectral# possède #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #Ganon Fantasma# porta #[[1]]#. {}, { CustomMessage("They say that the #Evil Spirit from Beyond# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #böse Geist aus dem Jenseits# #[[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*/ "", + /*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*/ "", + /*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]]#. hintTextTable[RHT_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD] = HintText(CustomMessage("They say that #stone columns# lead to a spider in the Forest Temple hiding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Säulen aus Stein# zu einer Spinne im Waldtempel führen, welche #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula haut perchée dans le jardin du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unas #columnas del Templo del Bosque# conducen a una Skulltula que otorga #[[1]]#. hintTextTable[RHT_FOREST_TEMPLE_GS_LOBBY] = HintText(CustomMessage("They say that a #spider among ghosts# in the Forest Temple guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne inmitten von Geistern# im Waldtempel #[[1]]# bewache.", /*french*/ "Selon moi, une #Skulltula dans la grande salle du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne inmitten drehender Wände# im Waldtempel #[[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]]#. hintTextTable[RHT_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY] = HintText(CustomMessage("They say that an #ivy-hidden spider# in the Forest Temple hoards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #unter Efeu versteckte Spinne# im Waldtempel #[[1]]# horte.", /*french*/ "Selon moi, une #Skulltula près de l'entrée du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne in einem versteckten Winkel# im Waldtempel #[[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*/ "", + /*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*/ "", + /*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*/ "", + /*german*/ "Man erzählt sich, daß das #Entleeren eines Brunnens# im Waldtempel eine Spinne mit #[[1]]# enthülle.", /*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]]#. @@ -647,187 +647,187 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The | FIRE TEMPLE | ---------------------------*/ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They say that #near a dragon# is #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #nahe eines Drachens# #[[1]]# sei.", /*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]]#. hintTextTable[RHT_FIRE_TEMPLE_FLARE_DANCER_CHEST] = HintText(CustomMessage("They say that the #Flare Dancer behind a totem# guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Flammenderwische hinter einem Totem# #[[1]]# bewachen würden.", /*french*/ "Selon moi, le #Danse-Flamme derrière un totem# protège #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #Bailafuego tras unos tótems# esconde #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that a #prison beyond a totem# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Gefängnis jenseits eines Totems# #[[1]]# enthielte.", /*french*/ "Selon moi, la #prison derrière un totem# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en una #prisión tras unos tótems# yace #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST] = HintText(CustomMessage("They say that #explosives over a lava pit# unveil #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Explosives über einem Lavastrom# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, des #explosifs dans un lac de lave# révèlent #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß ein #nahe der Lava gefangene 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]]#. hintTextTable[RHT_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST] = HintText(CustomMessage("They say that a #Goron at the end of a maze# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Gorone am Ende eines Labyrinths# #[[1]]# besäße.", /*french*/ "Selon moi, le #Goron dans le labyrinthe# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #goron al final de un laberinto# guarda #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST] = HintText(CustomMessage("They say that a #Goron above a maze# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Gorone oberhalb eines Labyrinths# #[[1]]# besäße.", /*french*/ "Selon moi, le #Goron au dessus du labyrinthe# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #goron sobre un laberinto# guarda #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST] = HintText(CustomMessage("They say that a #Goron hidden near a maze# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #nahe eines Labyrinths versteckter Gorone# #[[1]]# besäße.", /*french*/ "Selon moi, le #Goron caché près du labyrinthe# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #goron escondido tras un laberinto# guarda #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST] = HintText(CustomMessage("They say that a #blocked path# in Fire Temple holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #blockierter Pfad# im Feuertempel #[[1]]# enthielte.", /*french*/ "Selon moi, un #sol fragile dans le Temple du Feu# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en un #camino bloqueado# del Templo del Fuego yace #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say that a #caged chest# in the Fire Temple hoards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #eingesperrte Truhe# im Feuertempel #[[1]]# enthielte.", /*french*/ "Selon moi, un #coffre emprisonné# dans le Temple du Feu contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #cofre entre rejas# del Templo del Fuego contiene #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_COMPASS_CHEST] = HintText(CustomMessage("They say that a #chest in a fiery maze# contains #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Truhe in einem feurigen Labyrinth# #[[1]]# enthielte.", /*french*/ "Selon moi, un #coffre dans un labyrinthe enflammé# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß ein #Gorone auf 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*/ "", + /*german*/ "Man erzählt sich, daß #nahe eines Drachens# #[[1]]# sei.", /*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]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST] = HintText(CustomMessage("They say that the #Flare Dancer in the depths of the Fire Temple# guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Flammenderwische in den Tiefen des Feuertempels# #[[1]]# bewachen würden.", /*french*/ "Selon moi, le #Danse-Flamme au coeur du volcan# a #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, el #Bailafuego en lo profundo del Templo del Fuego# esconde #[[1]]#. {}, { CustomMessage("They say that the #Flare Dancer in the depths of a volcano# guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Flammenderwische in den Tiefen eines Vulkans# #[[1]]# bewachen würden.", /*french*/ "Selon moi, le #Danse-Flamme au coeur du volcan# a #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, el #Bailafuego en lo profundo del volcán# esconde #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_COMPASS_CHEST] = HintText(CustomMessage("They say that a #blocked path# in Fire Temple holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #blockierter Pfad# im Feuertempel #[[1]]# enthielte.", /*french*/ "Selon moi, le #chemin scellé# dans le Temple du Feu contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, en un #camino bloqueado# del Templo del Fuego yace #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST] = HintText(CustomMessage("They say that #crates in a maze# contain #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Kisten in einem Labyrinth# #[[1]]# enthielten.", /*french*/ "Selon moi, des #boîtes dans le labyrinthe# contiennent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #cajas de un laberinto# contienen #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST] = HintText(CustomMessage("They say that #crates in a maze# contain #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Kisten in einem Labyrinth #[[1]]# enthielten.", /*french*/ "Selon moi, des #boîtes dans le labyrinthe# contiennent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #cajas de un laberinto# contienen #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST] = HintText(CustomMessage("They say that a #falling slug# in the Fire Temple guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #fallende Schnecke# im Feuertempel #[[1]]# bewache.", /*french*/ "Selon moi, la #limace tombante# dans le Temple du Feu protège #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #babosa del techo# del Templo del Fuego guarda #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_MAP_CHEST] = HintText(CustomMessage("They say that using a #hammer in the depths of the Fire Temple# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Benutzung eines #Hammers in den Tiefen des Feuertempels# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, frapper du #marteau au coeur du volcan# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß die #Illumination einer Lavagrube# den Pfad zu #[[1]]# enthülle.", /*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]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST] = HintText(CustomMessage("They say that #explosives over a lava pit# unveil #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Explosives oberhalb einer Lavagrube# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, des #explosifs dans un lac de lave# révèlent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #explosivos en un mar de llamas# revelan #[[1]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST] = HintText(CustomMessage("They say that a #Goron hidden near a maze# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #nahe eines Labyrinths versteckter Gorone# #[[1]]# besäße.", /*french*/ "Selon moi, le #Goron caché près du labyrinthe# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß versteckt #unter einem Steinblock# #[[1]]# läge.", /*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]]#. hintTextTable[RHT_FIRE_TEMPLE_VOLVAGIA_HEART] = HintText(CustomMessage("They say that #Volvagia# holds #[[1]]#.", - /*german*/ "", - /*french*/ "Selon moi, #Volvagia# possède #[[1]]#.", {QM_RED, QM_GREEN}), + /*german*/ "Man erzählt sich, daß #Volvagia# #[[1]]# besäße.", + /*french*/ "Selon moi, #Volcania# possède #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #Volvagia# porta #[[1]]#. {}, { CustomMessage("They say that the #Subterranean Lava Dragon# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #subterrane Lavadrache# #[[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*/ "", + /*german*/ "Man erzählt sich, daß #acht Kacheln 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*/ "", + /*german*/ "Man erzählt sich, daß #fünf Kacheln 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]]#. hintTextTable[RHT_FIRE_TEMPLE_GS_BOULDER_MAZE] = HintText(CustomMessage("They say that #explosives in a maze# unveil a spider hiding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Explosives in einem Labyrinth# eine Spinne enthüllen würde, welche #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula derrière un mur fragile du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß eine #spinnenfreundliche Vogelscheuche# auf 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*/ "", + /*german*/ "Man erzählt sich, daß eine #spinnenfreundliche Vogelscheuche# auf 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*/ "", + /*german*/ "Man erzählt sich, daß eine #spinnenfreundliche Vogelscheuche# auf 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*/ "", + /*german*/ "Man erzählt sich, daß eine #spinnenfreundliche Vogelscheuche# auf 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*/ "", + /*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]]#. hintTextTable[RHT_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER] = HintText(CustomMessage("They say that a #spider within a fiery maze# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne innerhalb eines feurigen Labyrinths# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans le labyrinthe enflammé du Temple du Feu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß ein #nahe der 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*/ "", + /*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]]#. @@ -835,126 +835,126 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa | WATER TEMPLE | ---------------------------*/ hintTextTable[RHT_WATER_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say that #rolling spikes# in the Water Temple surround #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #rollende Stacheln# im Wassertempel #[[1]]# umgeben würden.", /*french*/ "Selon moi, des #Spikes# dans le Temple de l'Eau entourent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unas #rodantes púas# del Templo del Agua guardan #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_COMPASS_CHEST] = HintText(CustomMessage("They say that #roaming stingers in the Water Temple# guard #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #umherstreifende Rochen im Wassertempel# #[[1]]# bewachen würden.", /*french*/ "Selon moi, des #raies dans le Temple de l'Eau# protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unos #errantes stingers# del Templo del Agua guardan #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_TORCHES_CHEST] = HintText(CustomMessage("They say that #fire in the Water Temple# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Feuer im Wassertempel# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, des #flammes dans le Temple de l'Eau# révèlent #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß der #Preis einer Schlange# im Wassertempel #[[1]]# sei.", /*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*/ "", + /*german*/ "Man erzählt sich, daß das #Erblinden eines Auges# im Wassertempel zu #[[1]]# führe.", /*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*/ "", + /*german*/ "Man erzählt sich, daß in den #Tiefen des Wassertempels# #[[1]]# läge.", /*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*/ "", + /*german*/ "Man erzählt sich, daß #in einem Spalt# im Wassertempel #[[1]]# sei.", /*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]]#. hintTextTable[RHT_WATER_TEMPLE_LONGSHOT_CHEST] = HintText(CustomMessage("They say that #Dark Link# guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #schwarze Link# #[[1]]# bewache.", /*french*/ "Selon moi, l'#Ombre de @# protège #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #@ Oscuro# guarda #[[1]]#. {}, { CustomMessage("They say that #facing yourself# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Konfrontation mit einem Selbst# #[[1]]# offenbare.", /*french*/ "Selon moi, se #vaincre soi-même# révèle #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #luchar contra ti mismo# revela #[[1]]#. CustomMessage("They say that a #dark reflection# of yourself guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #dunkle Reflektion# von einem Selbst #[[1]]# bewache.", /*french*/ "Selon moi, son #propre reflet# cache #[[1]]#.", {QM_RED, QM_GREEN})}); // /*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*/ "", + /*german*/ "Man erzählt sich, daß in den #Tiefen des Wassertempels# #[[1]]# läge.", /*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*/ "", + /*german*/ "Man erzählt sich, daß Feuer im Wassertempel ein #großes Tor# entschlüssele, welches eine Truhe mit #[[1]]# 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*/ "", + /*german*/ "Man erzählt sich, daß #in einem Spalt# im Wassertempel #[[1]]# sei.", /*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]]#. hintTextTable[RHT_WATER_TEMPLE_MQ_COMPASS_CHEST] = HintText(CustomMessage("They say that #fire in the Water Temple# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Feuer im Wassertempel# #[[1]]# offenbare.", /*french*/ "Selon moi, des #flammes dans le Temple de l'Eau# révèlent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #fuego en el Templo del Agua# revela #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_MQ_MAP_CHEST] = HintText(CustomMessage("They say that #sparring soldiers# in the Water Temple guard #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #sich duellierende Soldaten# im Wassertempel #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #soldats du Temple de l'Eau# protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #acabar con unos soldados# del Templo del Agua revela #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_MORPHA_HEART] = HintText(CustomMessage("They say that #Morpha# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Morpha# #[[1]]# besäße.", /*french*/ "Selon moi, #Morpha# possède #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #Morpha# porta #[[1]]#. {}, { CustomMessage("They say that the #Giant Aquatic Amoeba# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #gigantische aquatische Amöbe# #[[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*/ "", + /*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]]#. hintTextTable[RHT_WATER_TEMPLE_GS_CENTRAL_PILLAR] = HintText(CustomMessage("They say that a #spider in the center of the Water Temple# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne im Zentrum des Wassertempels# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula au centre du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß eine Spinne, welche von #rollenden Felsbrocken 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*/ "", + /*german*/ "Man erzählt sich, daß eine Spinne, welche von #rollenden Felsbrocken unterhalb eines Flusses# 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*/ "", + /*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_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH] = HintText(CustomMessage("They say that #beyond a pit of lizards# is a spider holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #jenseits einer Reptiliengrube# eine Spinne sei, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula près des lézards du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #más allá de un pozo de reptiles# una Skulltula otorga #[[1]]#. hintTextTable[RHT_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY] = HintText(CustomMessage("They say that #lizards guard a spider# in the Water Temple with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #eine von Reptilien bewachte Spinne# im Wassertempel #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans les couloirs croisés du Temple de l'Eau# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne oberhalb eines Flusses# 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]]#. @@ -962,232 +962,232 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa | 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*/ "", + /*german*/ "Man erzählt sich, daß ein Kind einen #Schädel in grünem Feuer# im Geistertempel erobere, 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]]#. hintTextTable[RHT_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST] = HintText(CustomMessage("They say that a child can find a #caged chest# in the Spirit Temple with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein Kind eine #gefangene Truhe# im Geistertempel finden könne, welche #[[1]]# enthielte.", /*french*/ "Selon moi, le #coffre embarré dans le colosse# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß #jenseits einer Sandgrube# im Geistertempel #[[1]]# läge.", /*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*/ "", + /*german*/ "Man erzählt sich, daß das #Ausweichen von Felsbrocken um silberne Rubine zu sammeln# im Geistertempel #[[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]]#. hintTextTable[RHT_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST] = HintText(CustomMessage("They say that a #shadow circling reflected light# in the Spirit Temple guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #reflektierendes Licht umzirkelnder Schatten# im Geistertempel #[[1]]# bewachen würde.", /*french*/ "Selon moi, l'#ombre près d'un miroir# protège #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #círculo de reflectante luz# del Templo del Espíritu guarda #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST] = HintText(CustomMessage("They say that a #shadow circling reflected light# in the Spirit Temple guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #reflektierendes Licht umzirkelnder Schatten# im Geistertempel #[[1]]# bewachen würde.", /*french*/ "Selon moi, l'#ombre près d'un miroir# protège #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß #vor einer riesigen Statue# im Geistertempel #[[1]]# läge.", /*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]]#. hintTextTable[RHT_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST] = HintText(CustomMessage("They say that #lizards in the Spirit Temple# guard #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Reptilien im Geistertempel# #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #lézards dans le colosse# protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #reptiles del Templo del Espíritu# guardan #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST] = HintText(CustomMessage("They say that #lizards in the Spirit Temple# guard #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Reptilien im Geistertempel# #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #lézards dans le colosse# protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #reptiles del Templo del Espíritu# guardan #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST] = HintText(CustomMessage("They say that #torchlight among Beamos# in the Spirit Temple reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Fackellicht inmitten von Strahlzyklopen# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, les #torches autour des Sentinelles# éclairent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #antorchas junto a Beamos# del Templo del Espíritu revelan #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST] = HintText(CustomMessage("They say that a #statue in the Spirit Temple# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Statue im Geistertempel# #[[1]]# hielte.", /*french*/ "Selon moi, la #statue dans le colosse# tient #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß auf einem #Vorsprung einer Statue# im Geistertempel #[[1]]# ruhe.", /*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]]#. hintTextTable[RHT_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST] = HintText(CustomMessage("They say that those who #show the light among statues# in the Spirit Temple find #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß jene, welche #das Licht inmitten von Statuen# im Geistertempel zeigen würden, #[[1]]# fänden.", /*french*/ "Selon moi, le #soleil près des statues# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, aquellos que #iluminen ante las estatuas# del Templo del Espíritu encontrarán #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth in the Spirit Temple# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit im Geistertempel# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, le #trésor invisible près du Hache-Viande# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #Ojo de la Verdad# en el Templo del Espíritu revela #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth in the Spirit Temple# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit im Geistertempel# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, le #trésor invisible près du Hache-Viande# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #Ojo de la Verdad# en el Templo del Espíritu revela #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that a #chest engulfed in flame# in the Spirit Temple holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #von Flammen eingehüllte Truhe# im Geistertempel #[[1]]# enthielte.", /*french*/ "Selon moi, le #coffre enflammé dans le colosse# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß jene, welche #das Licht auf dem Koloss# 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*/ "", + /*german*/ "Man erzählt sich, daß #unbewacht liegend# im Geistertempel #[[1]]# sei.", /*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]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST] = HintText(CustomMessage("They say that a #switch in a pillar# within the Spirit Temple drops #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Schalter in einer Säule# innerhalb des Geistertempels #[[1]]# erbringe.", /*french*/ "Selon moi, l'#interrupteur dans un pilier# du colosse cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß das #Sammeln von Rubin 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*/ "", + /*german*/ "Man erzählt sich, daß ein #durch einen Stein erblindetes Auge# im Geistertempel #[[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*/ "", + /*german*/ "Man erzählt sich, daß umgeben von #Feuer umhüllt# #[[1]]# läge.", /*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]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST] = HintText(CustomMessage("They say that a child defeats a #gauntlet of monsters# within the Spirit Temple to find #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein Kind eine #Herausforderung von Monstern# innerhalb des Geistertempels bewältige und #[[1]]# fände.", /*french*/ "Selon moi, l'enfant qui vainc #plusieurs monstres# dans le colosse trouvera #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el joven que derrote #unos monstruos# del Templo del Espíritu encontrará #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST] = HintText(CustomMessage("They say that #explosive sunlight# within the Spirit Temple uncovers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #explosives Sonnenlicht# innerhalb des Geistertempels #[[1]]# enthüllen würde.", /*french*/ "Selon moi, le #rayon de lumière explosif dans le colosse# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß sich #gefangen von fallenden Feinden# im Geistertempel #[[1]]# befände.", /*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]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_COMPASS_CHEST] = HintText(CustomMessage("They say that #blinding the colossus# unveils #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Erblinden des Kolosses# #[[1]]# offenbare.", /*french*/ "Selon moi, #l'oeil dans le colosse# voit #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #cegar al coloso# revela #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST] = HintText(CustomMessage("They say that a #royal melody awakens the colossus# to reveal #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #königliche Melodie den Koloss erwecke# und #[[1]]# enthüllen würde.", /*french*/ "Selon moi, la #mélodie royale éveille le colosse# et révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit# des Kolosses verborgene #[[1]]# fände.", /*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]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST] = HintText(CustomMessage("They say that #the old hide what the young find# to reveal #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #der Alte verstecke, was der Junge finde# und #[[1]]# enthüllt würde.", /*french*/ "Selon moi, l'#oeil dans le trou du bloc argent# dans le colosse voit #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #adulto esconde lo que el joven anhela#, revelando #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST] = HintText(CustomMessage("They say that #sunlight in a maze of fire# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Sonnenlicht in einem Labyrinth aus Feuer# #[[1]]# verstecke.", /*french*/ "Selon moi, #la lumière dans le labyrinthe de feu# du colosse révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß #jenseits einer Sandgrube# im Geistertempel #[[1]]# läge.", /*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*/ "", + /*german*/ "Man erzählt sich, daß wo #zeitlicher Stein den Pfad blockiere# im Geistertempel #[[1]]# läge.", /*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]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST] = HintText(CustomMessage("They say that a #chest of double purpose# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Truhe mit doppeltem Zweck# #[[1]]# enthielte.", /*french*/ "Selon moi, le #coffre à usage double# du colosse contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß ein #zeitlicher Stein das Licht blockiere#, was zu #[[1]]# führe.", /*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*/ "", + /*german*/ "Man erzählt sich, daß jene, welche #das Licht auf dem Koloss# 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]]#. hintTextTable[RHT_SPIRIT_TEMPLE_TWINROVA_HEART] = HintText(CustomMessage("They say that #Twinrova# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Twinrova# #[[1]]# besäße.", /*french*/ "Selon moi, #Twinrova# possède #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #Birova# porta #[[1]]#. {}, { CustomMessage("They say that the #Sorceress Sisters# hold #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Hexenschwestern# #[[1]]# besäßen.", /*french*/ "Selon moi, #les sorcières jumelles# possède #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, las #hermanas hechiceras# portan #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM] = HintText(CustomMessage("They say that a spider in the #hall of a knight# guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine Spinne in der #Halle eines Ritters# #[[1]]# bewache.", /*french*/ "Selon moi, une #Skulltula au dessus d'un escalier du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*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]]#. hintTextTable[RHT_SPIRIT_TEMPLE_GS_LOBBY] = HintText(CustomMessage("They say that a #spider beside a statue# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne neben einer Statue# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans la grande salle du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne auf der Spitze eines tiefen Stiels# 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*/ "", + /*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*/ "", + /*german*/ "Man erzählt sich, daß sich #oberhalb einer Sandgrube# im Geistertempel #[[1]]# verstecke.", /*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]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST] = HintText(CustomMessage("They say that a spider in the #hall of a knight# guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine Spinne in der #Halle eines Ritters# #[[1]]# bewache.", /*french*/ "Selon moi, une #Skulltula dans la salle aux neuf trônes du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula en el salón de un guerrero# otorga #[[1]]#. hintTextTable[RHT_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH] = HintText(CustomMessage("They say that a spider in the #hall of a knight# guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine Spinne in der #Halle eines Ritters# #[[1]]# bewache.", /*french*/ "Selon moi, une #Skulltula dans la salle aux neuf trônes du Temple de l'Esprit# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß #auf einer Webe 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]]#. @@ -1195,242 +1195,242 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa | SHADOW TEMPLE | ---------------------------*/ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth# pierces a hall of faces to reveal #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit# eine Halle der Gesichter durchdränge und #[[1]]# offenbaren würde.", /*french*/ "Selon moi, l'#oeil de vérité# voit dans les couloirs du Temple de l'Ombre #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß eine #tote Hand 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]]#. {}, { CustomMessage("They say that a #nether dweller in the Shadow Temple# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Bewohner der Unterwelt im Schattentempel# #[[1]]# besäße.", /*french*/ "Selon moi, le #spectre du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})}); // /*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*/ "", + /*german*/ "Man erzählt sich, daß #durch das 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]]#. hintTextTable[RHT_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST] = HintText(CustomMessage("They say that #spinning scythes# protect #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #rotierende Sensen# #[[1]]# schützen würden.", /*french*/ "Selon moi, les #faucheurs danseurs# du Temple de l'Ombre protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #giratorias guadañas# protegen #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST] = HintText(CustomMessage("They say that #invisible blades# guard #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #unsichtbare Klingen# #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #faucheurs invisibles# du Temple de l'Ombre protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #hojas invisibles# guardan #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST] = HintText(CustomMessage("They say that #invisible blades# guard #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #unsichtbare Klingen# #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #faucheurs invisibles# du Temple de l'Ombre protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß #fallende Stacheln# den Pfad zu #[[1]]# blockieren würden.", /*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*/ "", + /*german*/ "Man erzählt sich, daß #fallende Stacheln# den Pfad zu #[[1]]# blockieren würden.", /*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*/ "", + /*german*/ "Man erzählt sich, daß #fallende Stacheln# den Pfad zu #[[1]]# blockieren würden.", /*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_INVISIBLE_SPIKES_CHEST] = HintText(CustomMessage("They say that the #dead roam among invisible spikes# guarding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #herumschweifende Tote inmitten von unsichtbaren Stacheln# #[[1]]# bewachen würden.", /*french*/ "Selon moi, #parmi les clous invisibles# du Temple de l'Ombre se cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #muertos que vagan por pinchos invisibles# protegen #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_WIND_HINT_CHEST] = HintText(CustomMessage("They say that an #invisible chest guarded by the dead# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #von Toten bewachte unsichtbare Truhe# #[[1]]# enthielte.", /*french*/ "Selon moi, le #trésor invisible du cul-de-sac# du Temple de l'Ombre contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß #eine Fähre bewachende Mumien# #[[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*/ "", + /*german*/ "Man erzählt sich, daß #eine Fähre bewachende Mumien# #[[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_SPIKE_WALLS_LEFT_CHEST] = HintText(CustomMessage("They say that #walls consumed by a ball of fire# reveal #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #von einem Feuerball verschlungende Wände# #[[1]]# offenbaren würden.", /*french*/ "Selon moi, le #piège de bois# du Temple de l'Ombre cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #paredes consumidas por una esfera ígnea# revelan #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that #walls consumed by a ball of fire# reveal #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #von einem Feuerball verschlungende Wände# #[[1]]# offenbaren würden.", /*french*/ "Selon moi, le #piège de bois# du Temple de l'Ombre cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß #innerhalb eines brennenden Schädels# #[[1]]# läge.", /*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]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_COMPASS_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth# pierces a hall of faces to reveal #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit# eine Halle der Gesichter durchdränge und #[[1]]# offenbaren würde.", /*french*/ "Selon moi, l'#oeil de vérité# voit dans les couloirs du Temple de l'Ombre #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß eine #tote Hand 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*/ "", + /*german*/ "Man erzählt sich, daß #durch das 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]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_MAP_CHEST] = HintText(CustomMessage("They say that #spinning scythes# protect #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #rotierende Sensen# #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #faucheurs danseurs# du Temple de l'Ombre protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #giratorias guadañas# protegen #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST] = HintText(CustomMessage("They say that #collecting rupees in a vast cavern# with the Shadow Temple unveils #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Sammeln von Rubinen in einer riesigen Kaverne# im Schattentempel #[[1]]# offenbaren würde.", /*french*/ "Selon moi, les #pièces argentées dans le Temple de l'Ombre# révèlent #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß #fallende Stachel# den Pfad zu #[[1]]# blockieren würden.", /*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*/ "", + /*german*/ "Man erzählt sich, daß #fallende Stachel# den Pfad zu #[[1]]# blockieren würden.", /*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*/ "", + /*german*/ "Man erzählt sich, daß #fallende Stachel# den Pfad zu #[[1]]# blockieren würden.", /*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_INVISIBLE_SPIKES_CHEST] = HintText(CustomMessage("They say that the #dead roam among invisible spikes# guarding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #herumschweifende Tote inmitten von unsichtbaren Stacheln# #[[1]]# bewachen würden.", /*french*/ "Selon moi, #parmi les clous invisibles# du Temple de l'Ombre se cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, los #muertos que vagan por pinchos invisibles# protegen #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that #walls consumed by a ball of fire# reveal #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #von einem Feuerball verschlungende Wände# #[[1]]# offenbaren würden.", /*french*/ "Selon moi, le #piège de bois# du Temple de l'Ombre cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las #paredes consumidas por una esfera ígnea# revelan #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST] = HintText(CustomMessage("They say that #walls consumed by a ball of fire# reveal #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #von einem Feuerball verschlungende Wände# #[[1]]# offenbaren würden.", /*french*/ "Selon moi, le #piège de bois# du Temple de l'Ombre cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß nahe einem #leeren Sockel# im Schattentempel #[[1]]# läge.", /*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]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST] = HintText(CustomMessage("They say that #invisible blades# guard #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #unsichtbare Klingen# #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #faucheurs invisibles# du Temple de l'Ombre protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unas #hojas invisibles# guardan #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST] = HintText(CustomMessage("They say that #invisible blades# guard #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #unsichtbare Klingen# #[[1]]# bewachen würden.", /*french*/ "Selon moi, les #faucheurs invisibles# du Temple de l'Ombre protègent #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unas #hojas invisibles# guardan #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST] = HintText(CustomMessage("They say that an #invisible chest guarded by the dead# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #von Toten bewachte unsichtbare Truhe# #[[1]]# enthielte.", /*french*/ "Selon moi, le #trésor invisible du cul-de-sac# du Temple de l'Ombre contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß #eine Fähre bewachende Mumien# #[[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*/ "", + /*german*/ "Man erzählt sich, daß #eine Fähre bewachende Mumien# #[[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*/ "", + /*german*/ "Man erzählt sich, daß #in der Nähe eines Schiffes eingesperrt# #[[1]]# läge.", /*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*/ "", + /*german*/ "Man erzählt sich, daß #hinter drei brennenden Schädeln# #[[1]]# läge.", /*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]]#. hintTextTable[RHT_SHADOW_TEMPLE_BONGO_BONGO_HEART] = HintText(CustomMessage("They say that #Bongo Bongo# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Bongo Bongo# #[[1]]# besäße.", /*french*/ "Selon moi, #Bongo Bongo# possède #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #Bongo Bongo# porta #[[1]]#. {}, { CustomMessage("They say that the #Phantom Shadow Beast# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Phantomschattenbiest# #[[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]]#. hintTextTable[RHT_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT] = HintText(CustomMessage("They say that #beyond a burning skull# lies a spider with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #jenseits eines brennenden Schädels# eine Spinne läge, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula derrière un crâne enflammé du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #tras una ardiente calavera# yace una Skulltula que otorga #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM] = HintText(CustomMessage("They say that a #spider beyond falling spikes# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne jenseits fallender Stacheln# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula au delà de la pluie de clous du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula tras los pinchos del techo# otorga #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT] = HintText(CustomMessage("They say that #beyond three burning skulls# lies a spider with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #jenseits drei brennender Schädel# eine Spinne läge, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula derrière trois crânes enflammés du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #tras tres ardientes calaveras# yace una Skulltula que otorga #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM] = HintText(CustomMessage("They say that a spider guarded by #invisible blades# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine Spinne von #unsichtbaren Klingen# bewacht werde und #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula protégée par les faucheurs invisibles du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß eine Spinne nahe eines #geankerten Schiffs# #[[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]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM] = HintText(CustomMessage("They say that a #spider beyond falling spikes# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne jenseits fallender Stacheln# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula au delà de la pluie de clous du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula tras los pinchos del techo# otorga #[[1]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM] = HintText(CustomMessage("They say that a #spider amidst roaring winds# in the Shadow Temple holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne inmitten stürmischer Winde# im Schattentempel #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula près des vents du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*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]]#. hintTextTable[RHT_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP] = HintText(CustomMessage("They say that a #fallen statue# reveals a spider with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #fallende Statue# eine Spinne enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula près de la statue écroulée du Temple de l'Ombre# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß eine #hängende 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]]#. @@ -1438,117 +1438,117 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th | BOTTOM OF THE WELL | ---------------------------*/ hintTextTable[RHT_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth in the well# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit im Brunnen# #[[1]]# offenbare.", /*french*/ "Selon moi, l'#oeil de vérité dans le Puits# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #Ojo de la Verdad en el pozo# revela #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST] = HintText(CustomMessage("They say that #gruesome debris# in the well hides #[[1]]#.", - /*german*/ "", + /*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_RIGHT_BOTTOM_FAKE_WALL_CHEST] = HintText(CustomMessage("They say that the #Eye of Truth in the well# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Auge der Wahrheit im Brunnen# #[[1]]# offenbare.", /*french*/ "Selon moi, l'#oeil de vérité dans le Puits# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß ein #verborgener Eingang zu einem Käfig# im Brunnen zu #[[1]]# führe.", /*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*/ "", + /*german*/ "Man erzählt sich, daß eine #einen 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*/ "", + /*german*/ "Man erzählt sich, daß #grauenvolle Trümmer# im Brunnen #[[1]]# verbergen würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß das #unsichtbare Geheimnis der toten Hand# #[[1]]# sei.", /*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*/ "", + /*german*/ "Man erzählt sich, daß eine #königliche Melodie im Brunnen# #[[1]]# enthüllen würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß eine #königliche Melodie im Brunnen# #[[1]]# enthüllen würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß in den #Tiefen des Brunnens# #[[1]]# läge.", /*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*/ "", + /*german*/ "Man erzählt sich, daß #gefährliche Gruben# im Brunnen den Pfad zu #[[1]]# bewachen würden.", /*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*/ "", + /*german*/ "Man erzählt sich, daß #in einem Käfig eingeschlossen# im Brunnen #[[1]]# läge.", /*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*/ "", + /*german*/ "Man erzählt sich, daß #in einem Sarg# #[[1]]# verborgen läge.", /*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*/ "", + /*german*/ "Man erzählt sich, daß eine #königliche Melodie im Brunnen# #[[1]]# enthüllen würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß eine #Armee der Toten# im Brunnen #[[1]]# bewachen würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß das #explosive Geheimnis der toten Hand# #[[1]]# sei.", /*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*/ "", + /*german*/ "Man erzählt sich, daß ein #unsichtbarer Pfad im Brunnen# zu #[[1]]# führe.", /*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]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE] = HintText(CustomMessage("They say that a #spider locked in a cage# in the well holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #in einem Käfig eingeschlossene Spinne# im Brunnen #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans une cage au fonds du Puits# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß ein #unsichtbarer Pfad im Brunnen# zu #[[1]]# führe.", /*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*/ "", + /*german*/ "Man erzählt sich, daß eine #in einer Krypta eingeschlossene Spinne# im Brunnen #[[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_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT] = HintText(CustomMessage("They say that a #gauntlet of invisible spiders# protects #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Herausforderung unsichtbarer Spinnen# #[[1]]# bewache.", /*french*/ "Selon moi, une #Skulltula protégée par les araignées invisibles au fonds du Puits# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unas #arañas invisibles# custodian una Skulltula que otorga #[[1]]#. hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM] = HintText(CustomMessage("They say that a #spider crawling near the dead# in the well holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #nahe der Toten kriechende Spinne# im Brunnen #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula près des cercueils au fonds du Puits# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß eine #in einer Krypta eingeschlossene Spinne# im Brunnen #[[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]]#. @@ -1556,72 +1556,72 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th | ICE CAVERN | ---------------------------*/ hintTextTable[RHT_ICE_CAVERN_MAP_CHEST] = HintText(CustomMessage("They say that #winds of ice# surround #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Eiswinde# #[[1]]# umgeben würden.", /*french*/ "Selon moi, #figé dans la glace rouge# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #heladas borrascas# rodean #[[1]]#. hintTextTable[RHT_ICE_CAVERN_COMPASS_CHEST] = HintText(CustomMessage("They say that a #wall of ice# protects #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Eiswand# #[[1]]# schütze.", /*french*/ "Selon moi, #un mur de glace rouge# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #gélida pared# protege #[[1]]#. hintTextTable[RHT_ICE_CAVERN_IRON_BOOTS_CHEST] = HintText(CustomMessage("They say that a #monster in a frozen cavern# guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Monster in einer gefrorenen Kaverne# #[[1]]# bewache.", /*french*/ "Selon moi, le #monstre de la caverne de glace# protège #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #monstruo de una helada caverna# guarda #[[1]]#. hintTextTable[RHT_ICE_CAVERN_FREESTANDING_POH] = HintText(CustomMessage("They say that a #wall of ice# protects #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Eiswand# #[[1]]# schütze.", /*french*/ "Selon moi, un #mur de glace rouge# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #gélida pared# protege #[[1]]#. hintTextTable[RHT_ICE_CAVERN_MQ_IRON_BOOTS_CHEST] = HintText(CustomMessage("They say that a #monster in a frozen cavern# guards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Monster in einer gefrorenen Kaverne# #[[1]]# bewache.", /*french*/ "Selon moi, le #monstre de la caverne de glace# protège #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #monstruo de una helada caverna# guarda #[[1]]#. hintTextTable[RHT_ICE_CAVERN_MQ_COMPASS_CHEST] = HintText(CustomMessage("They say that #winds of ice# surround #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Eiswinde# #[[1]]# umgeben würden.", /*french*/ "Selon moi, #entouré de vent glacial# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #heladas borrascas# rodean #[[1]]#. hintTextTable[RHT_ICE_CAVERN_MQ_MAP_CHEST] = HintText(CustomMessage("They say that a #wall of ice# protects #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Eiswand# #[[1]]# schütze.", /*french*/ "Selon moi, #un mur de glace rouge# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #gélida pared# protege #[[1]]#. hintTextTable[RHT_ICE_CAVERN_MQ_FREESTANDING_POH] = HintText(CustomMessage("They say that #winds of ice# surround #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Eiswinde# #[[1]]# umgeben würden.", /*french*/ "Selon moi, #entouré de vent glacial# gît #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #heladas borrascas# rodean #[[1]]#. hintTextTable[RHT_ICE_CAVERN_GS_PUSH_BLOCK_ROOM] = HintText(CustomMessage("They say that a #spider above icy pits# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne oberhalb eisiger Gruben# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula au dessus d'un goufre glacial# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula sobre gélidos vacíos# otorga #[[1]]#. hintTextTable[RHT_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM] = HintText(CustomMessage("They say that #spinning ice# guards a spider holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #rotierendes Eis# eine Spinne beschütze, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula près de deux lames de glace# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, unos #témpanos giratorios# custodian una Skulltula que otorga #[[1]]#. hintTextTable[RHT_ICE_CAVERN_GS_HEART_PIECE_ROOM] = HintText(CustomMessage("They say that a #spider behind a wall of ice# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne hinter einer Eiswand# #[[1]]# verstecke.", /*french*/ "Selon moi, une #Skulltula derrière un mur de glace# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula tras una gélida pared# otorga #[[1]]#. hintTextTable[RHT_ICE_CAVERN_MQ_GS_SCARECROW] = HintText(CustomMessage("They say that a #spider above icy pits# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne oberhalb eisiger Gruben# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula au dessus d'un goufre glacial# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß eine #Webe 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]]#. hintTextTable[RHT_ICE_CAVERN_MQ_GS_RED_ICE] = HintText(CustomMessage("They say that a #spider in fiery ice# hoards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne in feurigem Eis# #[[1]]# horte.", /*french*/ "Selon moi, une #Skulltula figée dans la glace rouge# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula tras un ardiente hielo# otorga #[[1]]#. @@ -1629,177 +1629,177 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th | GERUDO TRAINING GROUNDS | ---------------------------*/ hintTextTable[RHT_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST] = HintText(CustomMessage("They say that a #blinded eye in the Gerudo Training Grounds# drops #[[1]]#.", - /*german*/ "", + /*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 Grounds# drops #[[1]]#.", - /*german*/ "", + /*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 Grounds guard #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #auf veränderlichen Sanden 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 Grounds protect #[[1]]#.", - /*german*/ "", + /*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 Grounds reveals #[[1]]#.", - /*german*/ "", + /*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*/ "", + /*german*/ "Man erzählt sich, daß der erste Preis des #Diebestrainings# #[[1]]# sei.", /*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*/ "", + /*german*/ "Man erzählt sich, daß der zweite Preis des #Diebestrainings# #[[1]]# sei.", /*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*/ "", + /*german*/ "Man erzählt sich, daß der dritte Preis des #Diebestrainings# #[[1]]# sei.", /*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 Grounds leads to #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Hymne der Zeit# in der Gerudo-Trainingsarena zu #[[1]]# fü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 Grounds leads to #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Hymne der Zeit# in der Gerudo-Trainingsarena zu #[[1]]# fü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 Grounds guard #[[1]]#.", - /*german*/ "", + /*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*/ "", + /*german*/ "Man erzählt sich, daß #von Flammen umschlungen# wo Diebe trainieren #[[1]]# läge.", /*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_EYE_STATUE_CHEST] = HintText(CustomMessage("They say that thieves #blind four faces# to find #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß Diebe #vier Gesichter erblinden# würden und #[[1]]# fänden.", /*french*/ "Selon moi, l'#épreuve d'archerie# du Gymnase Gerudo donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, las bandidas #ciegan cuatro bustos# para hallar #[[1]]#. hintTextTable[RHT_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST] = HintText(CustomMessage("They say that thieves #blind four faces# to find #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß Diebe #vier Gesichter erblinden# würden und #[[1]]# fänden.", /*french*/ "Selon moi, l'#épreuve d'archerie# du Gymnase Gerudo donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß #vor einem Block aus Silber# Diebe #[[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*/ "", + /*german*/ "Man erzählt sich, daß ein #Meisterstück der Stärke# Diebe mit #[[1]]# belohnen würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß ein #Meisterstück der Stärke# Diebe mit #[[1]]# belohnen würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß ein #Meisterstück der Stärke# Diebe mit #[[1]]# belohnen würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß ein #Meisterstück der Stärke# Diebe mit #[[1]]# belohnen würde.", /*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_FREESTANDING_KEY] = HintText(CustomMessage("They say that the #Song of Time# in the Gerudo Training Grounds leads to #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Hymne der Zeit# in der Gerudo-Trainingsarena zu #[[1]]# fü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*/ "", + /*german*/ "Man erzählt sich, daß sich #Diebe auf das Training vorbereiteten# mit #[[1]]#.", /*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*/ "", + /*german*/ "Man erzählt sich, daß sich #Diebe auf das Training vorbereiteten# mit #[[1]]#.", /*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 Grounds guard #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #auf veränderlichen Sanden 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*/ "", + /*german*/ "Man erzählt sich, daß #vor einem Block aus Silber# Diebe #[[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_MQ_EYE_STATUE_CHEST] = HintText(CustomMessage("They say that thieves #blind four faces# to find #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß Diebe #vier Gesichter erblinden# würden und #[[1]]# fänden.", /*french*/ "Selon moi, l'#épreuve d'archerie# du Gymnase Gerudo donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß #von Flammen umschlungen# wo Diebe trainieren #[[1]]# läge.", /*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 Grounds guard #[[1]]#.", - /*german*/ "", + /*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 Grounds protect #[[1]]#.", - /*german*/ "", + /*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*/ "", + /*german*/ "Man erzählt sich, daß der #Pfad des Feuers# Diebe zu #[[1]]# führe.", /*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*/ "", + /*german*/ "Man erzählt sich, daß der erste Preis des #Diebestrainings# #[[1]]# sei.", /*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*/ "", + /*german*/ "Man erzählt sich, daß der #Pfad des Feuers# Diebe zu #[[1]]# führe.", /*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*/ "", + /*german*/ "Man erzählt sich, daß der dritte Preis des #Diebestrainings# #[[1]]# sei.", /*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*/ "", + /*german*/ "Man erzählt sich, daß der zweite Preis des #Diebestrainings# #[[1]]# sei.", /*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 Grounds reveals #[[1]]#.", - /*german*/ "", + /*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*/ "", + /*german*/ "Man erzählt sich, daß ein #Meisterstück der Stärke# Diebe mit #[[1]]# belohnen würde.", /*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]]#. @@ -1807,192 +1807,192 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th | GANONS CASTLE | ---------------------------*/ hintTextTable[RHT_GANONS_TOWER_BOSS_KEY_CHEST] = HintText(CustomMessage("They say that the #Evil King# hoards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der #böse König# #[[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]]#. hintTextTable[RHT_GANONS_CASTLE_FOREST_TRIAL_CHEST] = HintText(CustomMessage("They say that the #test of the wilds# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung der Wildnis# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve des bois# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba de la naturaleza# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST] = HintText(CustomMessage("They say that the #test of the seas# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung der Meere# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve des mers# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba del mar# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST] = HintText(CustomMessage("They say that the #test of the seas# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung der Meere# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve des mers# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß #Musik in der Prüfung des 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]]#. hintTextTable[RHT_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST] = HintText(CustomMessage("They say that #light in the test of darkness# unveils #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Licht in der Prüfung der Dunkelheit# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, la #lumière dans l'épreuve des ténèbres# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #luz en la prueba de la oscuridad# revela #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST] = HintText(CustomMessage("They say that the #test of the sands# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung der Sande# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve des sables# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba de las arenas# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST] = HintText(CustomMessage("They say that the #test of the sands# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung der Sande# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve des sables# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung des Glanzes# #[[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*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung des Glanzes# #[[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*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung des Glanzes# #[[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*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung des Glanzes# #[[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*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung des Glanzes# #[[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*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung des Glanzes# #[[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*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung des Glanzes# #[[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*/ "", + /*german*/ "Man erzählt sich, daß #Musik in der Prüfung des Glanzes# #[[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_MQ_WATER_TRIAL_CHEST] = HintText(CustomMessage("They say that the #test of the seas# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung der Meere# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve des mers# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba del mar# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST] = HintText(CustomMessage("They say that the #test of the wilds# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung der Wildnis# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve des bois# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba de la naturaleza# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST] = HintText(CustomMessage("They say that the #test of the wilds# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung der Wildnis# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve des bois# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß #Musik in der Prüfung des Glanzes# #[[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_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST] = HintText(CustomMessage("They say that the #test of darkness# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung der Dunkelheit# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve des ténèbres# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba de la oscuridad# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST] = HintText(CustomMessage("They say that the #test of darkness# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung der Dunkelheit# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve des ténèbres# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la #prueba de la oscuridad# brinda #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST] = HintText(CustomMessage("They say that #reflected light in the test of the sands# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #reflektiertes Licht in der Prüfung der Sande# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, le #soleil dans l'épreuve des sables# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #reflejar la luz en la prueba de las arenas# revela #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST] = HintText(CustomMessage("They say that #reflected light in the test of the sands# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #reflektiertes Licht in der Prüfung der Sande# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, le #soleil dans l'épreuve des sables# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #reflejar la luz en la prueba de las arenas# revela #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST] = HintText(CustomMessage("They say that #reflected light in the test of the sands# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #reflektiertes Licht in der Prüfung der Sande# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, le #soleil dans l'épreuve des sables# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #reflejar la luz en la prueba de las arenas# revela #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST] = HintText(CustomMessage("They say that #reflected light in the test of the sands# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #reflektiertes Licht in der Prüfung der Sande# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, le #soleil dans l'épreuve des sables# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #reflejar la luz en la prueba de las arenas# revela #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST] = HintText(CustomMessage("They say that #reflected light in the test of the sands# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #reflektiertes Licht in der Prüfung der Sande# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, le #soleil dans l'épreuve des sables# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #reflejar la luz en la prueba de las arenas# revela #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST] = HintText(CustomMessage("They say that #reflected light in the test of the sands# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #reflektiertes Licht in der Prüfung der Sande# #[[1]]# enthüllen würde.", /*french*/ "Selon moi, le #soleil dans l'épreuve des sables# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #reflejar la luz en la prueba de las arenas# revela #[[1]]#. hintTextTable[RHT_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY] = HintText(CustomMessage("They say that the #test of the wilds# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Prüfung der Wildnis# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve des bois# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß #Dekus 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*/ "", + /*german*/ "Man erzählt sich, daß #Dekus 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*/ "", + /*german*/ "Man erzählt sich, daß #Dekus 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*/ "", + /*german*/ "Man erzählt sich, daß #Dekus 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*/ "", + /*german*/ "Man erzählt sich, daß #Dekus 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*/ "", + /*german*/ "Man erzählt sich, daß #Dekus 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*/ "", + /*german*/ "Man erzählt sich, daß #Dekus 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*/ "", + /*german*/ "Man erzählt sich, daß #Dekus 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*/ "", + /*german*/ "Man erzählt sich, daß #Dekus 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]]#. } 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 84c74da8735..a467c18b513 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 @@ -171,1320 +171,1323 @@ void StaticData::HintTable_Init_Exclude_Overworld() { // /*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*/ "", + /*german*/ "Man erzählt sich, daß ein #durch Regen geflutetes Loch auf einem Berg# #[[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*/ "", + /*german*/ "Man erzählt sich, daß ein #Fisch in einem durch Regen geflutetes Loch auf einem Berg# #[[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*/ "", + /*german*/ "Man erzählt sich, daß ein #Loch in einem Vulkan# #[[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*/ "", + /*german*/ "Man erzählt sich, daß ein #Fisch in einem Loch in einem Vulkan# #[[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*/ "", + /*german*/ "Man erzählt sich, daß sich auf einem #Podest in einem Tempel# #[[1]]# befände.", /*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*/ "", + /*german*/ "Man erzählt sich, daß das #letzte Geschenk einer Prinzessin# #[[1]]# sei.", /*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*/ "", + /*german*/ "Man erzählt sich, daß #Salias Geschenk# #[[1]]# sei.", /*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*/ "", + /*german*/ "Man erzählt sich, daß ein #Kartoffelhortender# #[[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*/ "", + /*german*/ "Man erzählt sich, daß die #musikalische Kartoffel# #[[1]]# schenke.", /*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*/ "", + /*german*/ "Man erzählt sich, daß die #Fee der Winde# #[[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]]#. hintTextTable[RHT_HC_GREAT_FAIRY_REWARD] = HintText(CustomMessage("They say that the #fairy of fire# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Fee des Feuers# #[[1]]# besäße.", /*french*/ "Selon moi, la #fée du feu# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #hada del fuego# brinda #[[1]]#. hintTextTable[RHT_COLOSSUS_GREAT_FAIRY_REWARD] = HintText(CustomMessage("They say that the #fairy of love# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Fee der Liebe# #[[1]]# besäße.", /*french*/ "Selon moi, la #fée de l'amour# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß eine #magische Fee# #[[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*/ "", + /*german*/ "Man erzählt sich, daß eine #magische Fee# #[[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*/ "", + /*german*/ "Man erzählt sich, daß die #Fee der Stärke# #[[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]]#. hintTextTable[RHT_SONG_FROM_IMPA] = HintText(CustomMessage("They say that #deep in a castle#, Impa teaches #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #tief in einem Schloß#, Impa #[[1]]# lehre.", /*french*/ "Selon moi, #la gardienne de la princesse# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß ein #Mädchen des Landes# #[[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]]#. hintTextTable[RHT_SONG_FROM_SARIA] = HintText(CustomMessage("They say that #deep in the forest#, Saria teaches #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #tief im Wald#, Salia #[[1]]# lehre.", /*french*/ "Selon moi, la #fille de la forêt# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß ein Mann #in einer Windmühle# von #[[1]]# besessen sei.", /*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*/ "", + /*german*/ "Man erzählt sich, daß ein #nach ihrem Vater suchenden 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*/ "", + /*german*/ "Man erzählt sich, daß eine #Prinzessin in einem Schloß# #[[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]]#. hintTextTable[RHT_ZD_DIVING_MINIGAME] = HintText(CustomMessage("They say that those who #dive for Zora rupees# will find #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß jene, welche nach den #Rubinen der Zora tauchen# #[[1]]# fänden.", /*french*/ "Selon moi, ceux qui #plongent pour des rubis Zora# trouveront #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, aquellos que se #sumergan por las rupias zora# encontrarán #[[1]]#. {}, { CustomMessage("They say that an #unsustainable business model# gifts #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #unwirtschaftliches Geschäftsmodell# #[[1]]# schenke.", /*french*/ "Selon moi, le #mauvais modèle d'affaires# donne #[[1]]#.", {QM_RED, QM_GREEN})}); // /*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*/ "", + /*german*/ "Man erzählt sich, daß das #Fischen in 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]]#. hintTextTable[RHT_LH_POND_FISH] = HintText(CustomMessage("They say that #hitting the pond# reveals #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Fischen im Teich# #[[1]]# enthülle.", /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); hintTextTable[RHT_LH_HYRULE_LOACH] = HintText(CustomMessage("They say that #fishing the hyrule loach# will give you #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Fischen der hylianischen Schmerle# #[[1]]# einbrächte.", /*french*/ "Selon moi, !!! #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, si #pescas a la Locha de Hyrule# encontrarás #[[1]]#. {}, { CustomMessage("They say that #fishing the legend# bestows #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Fischen der Legende# #[[1]]# verleihe.", /*french*/ "Selon moi, !!! #[[1]]#.", {QM_RED, QM_GREEN})}); // /*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*/ "", + /*german*/ "Man erzählt sich, daß das #Fischen im Alter# #[[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*/ "", + /*german*/ "Man erzählt sich, daß ein #Tauchexperiment# mit #[[1]]# belohnt würde.", /*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 - hintTextTable[RHT_ZD_FISH] = HintText(CustomMessage("They say that a #fish by a waterfall# hoards #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_ZD_FISH] = HintText(CustomMessage("They say that a #fish by a waterfall# hoards #[[1]]#.", + /*german*/ "Man erzählt sich, daß ein #Fisch nahe eines Wasserfalls# #[[1]]# horte.", + /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, #[[1]]#. hintTextTable[RHT_GC_ROLLING_GORON_AS_ADULT] = HintText(CustomMessage("They say that #reassuring a young Goron# is rewarded with #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das #Beruhigen eines jungen Goronen# mit #[[1]]# belohnt würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß die #Ermutigung von einem Selbst# #[[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*/ "", + /*german*/ "Man erzählt sich, daß der #erste explosive Preis# #[[1]]# sei.", /*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*/ "", + /*german*/ "Man erzählt sich, daß der #zweite explosive Preis# #[[1]]# sei.", /*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*/ "", + /*german*/ "Man erzählt sich, daß die #Rettung des Hundes Richard# mit #[[1]]# belohnt würde.", /*french*/ "Selon moi, #retrouver Kiki le chien# promet #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, #rescatar al perrito Ricardo# conduce a #[[1]]#. {}, { CustomMessage("They say that #puppy lovers# will find #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Welpenliebhaber# #[[1]]# fänden.", /*french*/ "Selon moi, les #amoureux canins# trouveront #[[1]]#.", {QM_RED, QM_GREEN})}); // /*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*/ "", + /*german*/ "Man erzählt sich, daß das #Spielen der Okarina in den verlorenen Wäldern# mit #[[1]]# belohnt würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß der Preis für eine Partie #Simon sagt# #[[1]]# sei.", /*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]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #jungen Flötisten# #[[1]]# besäßen.", /*french*/ "Selon moi, les #jeunes flûtistes# donnent #[[1]]#.", {QM_RED, QM_GREEN})}); // /*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*/ "", + /*german*/ "Man erzählt sich, daß das Besiegen von #10 Goldenen Skulltulas# #[[1]]# enthüllen würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß #10 Käferabzeichen# mit #[[1]]# belohnt würde.", /*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]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #10 Spinnenseelen# #[[1]]# einbrächten.", /*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*/ "", + /*german*/ "Man erzählt sich, daß #10 goldhaltige Arachniden# zu #[[1]]# führen würden.", /*french*/ "Selon moi, #10 arachnides aurifères# donnent #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, #10 arácnidos auríferos# otorgan #[[1]]#. hintTextTable[RHT_KAK_MAN_ON_ROOF] = HintText(CustomMessage("They say that a #rooftop wanderer# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Dachwanderer# #[[1]]# besäße.", /*french*/ "Selon moi, une #rencontre sur un toit# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß ein #Bohnenverkä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]]#. {}, { CustomMessage("They say that a seller of #colorful crops# has #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein Verkäufer #bunter Ernte# #[[1]]# besäße.", /*french*/ "Selon moi, le #marchand de légumes# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, el vendedor de un #colorido cultivo# ofrece #[[1]]#. hintTextTable[RHT_ZR_FROGS_IN_THE_RAIN] = HintText(CustomMessage("They say that #frogs in a storm# gift #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Frösche im Sturm# #[[1]]# schenken würden.", /*french*/ "Selon moi, #des grenouilles mouillées# donnent #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß die #Frösche nach dem Hören von Zeldas Wiegenlied# #[[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]]#. {}, { CustomMessage("They say that #sleepy frogs# gift #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #schläfrige Frösche# #[[1]]# schenken würden.", /*french*/ "Selon moi, #les grenouilles somnolentes# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, las #ranas somnolientas# regalan #[[1]]#. CustomMessage("They say that #the Froggish Tenor in the back-left# gifts #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #der froschige Tenor hinten links# #[[1]]# schenke.", /*french*/ "Selon moi, #le ténor grenouillesque au fond à gauche# donne #[[1]]#.", {QM_RED, QM_GREEN})}); // /*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*/ "", + /*german*/ "Man erzählt sich, daß die #Frösche nach dem Hören von Eponas Lied# #[[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]]#. {}, { CustomMessage("They say that #equine frogs# gift #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #pferdeartige Frösche# #[[1]]# schenken würden.", /*french*/ "Selon moi, #les grenouilles équestres# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, las #ranas equinas# regalan #[[1]]#. CustomMessage("They say that #the Froggish Tenor in the back-right# gifts #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #der froschige Tenor hinten rechts# #[[1]]# schenke.", /*french*/ "Selon moi, #le ténor grenouillesque au fond à droite# donne #[[1]]#.", {QM_RED, QM_GREEN})}); // /*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*/ "", + /*german*/ "Man erzählt sich, daß die #Frösche nach dem Hören von Salias Lied# #[[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]]#. {}, { CustomMessage("They say that #sylvan frogs# gift #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #waldige Frösche# #[[1]]# schenken würden.", /*french*/ "Selon moi, #les grenouilles sylvestres# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, las #ranas silvestres# regalan #[[1]]#. CustomMessage("They say that #the Froggish Tenor in the center# gifts #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #der froschige Tenor im Zentrum# #[[1]]# schenke.", /*french*/ "Selon moi, #le ténor grenouillesque dans le centre# donne #[[1]]#.", {QM_RED, QM_GREEN})}); // /*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*/ "", + /*german*/ "Man erzählt sich, daß die #Frösche nach dem Hören der Hymne der Sonne# #[[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]]#. {}, { CustomMessage("They say that #enlightened frogs# gift #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #erleuchtete Frösche# #[[1]]# schenken würden.", /*french*/ "Selon moi, #les grenouilles éclairées# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, las #ranas alumbradas# regalan #[[1]]#. CustomMessage("They say that #the Froggish Tenor in the front-left# gifts #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #der froschige Tenor vorne links# #[[1]]# schenke.", /*french*/ "Selon moi, #le ténor grenouillesque à l'avant gauche# donne #[[1]]#.", {QM_RED, QM_GREEN})}); // /*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*/ "", + /*german*/ "Man erzählt sich, daß die #Frösche nach dem Hören der Hymne der Zeit# #[[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]]#. {}, { CustomMessage("They say that #time-traveling frogs# gift #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #zeitreisende Frösche# #[[1]]# schenken würden.", /*french*/ "Selon moi, #les grenouilles voyageuses dans le temps# donnent #[[1]]#.", {QM_RED, QM_GREEN}), // /*spanish*/ Según dicen, las #ranas viajeras del tiempo# regalan #[[1]]#. CustomMessage("They say that #the Froggish Tenor in the front-right# gifts #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #der froschige Tenor vorne rechts# #[[1]]# schenke.", /*french*/ "Selon moi, #le ténor grenouillesque à l'avant droite# donne #[[1]]#.", {QM_RED, QM_GREEN})}); // /*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*/ "", + /*german*/ "Man erzählt sich, daß das Erzielen von 1000 Punkten beim #Pferdebogenschießen# #[[1]]# einbrächte.", /*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*/ "", + /*german*/ "Man erzählt sich, daß das #Schießen in 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*/ "", + /*german*/ "Man erzählt sich, daß das #Schießen im Alter# #[[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]]#. hintTextTable[RHT_LW_TARGET_IN_WOODS] = HintText(CustomMessage("They say that shooting a #target in the woods# grants #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß das Abschießen eines #Zieles in den Wäldern# #[[1]]# einbrächte.", /*french*/ "Selon moi, #tirer une cible dans les bois# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, disparar a un #blanco forestal# brinda #[[1]]#. hintTextTable[RHT_KAK_ANJU_AS_ADULT] = HintText(CustomMessage("They say that a #chicken caretaker# offers adults #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Hühnchenpfleger# Erwachsenen #[[1]]# anböte.", /*french*/ "Selon moi, devenir un #éleveur de Cocottes# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß das #Finden von Superhühnchen# mit #[[1]]# belohnt würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß der angebotene Preis eines #großen rollenden Goronen# #[[1]]# sei.", /*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*/ "", + /*german*/ "Man erzählt sich, daß der #versunkene Schatz in einem See# #[[1]]# sei.", /*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*/ "", + /*german*/ "Man erzählt sich, daß das #Retten gefangener Zimmerleute# mit #[[1]]# belohnt würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß ein #Teppichguru# #[[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]]#. hintTextTable[RHT_GC_MEDIGORON] = HintText(CustomMessage("They say that #Medigoron# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß #Medigoron# #[[1]]# verkaufe.", /*french*/ "Selon moi, #Medigoron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, #Medigoron# vende #[[1]]#. hintTextTable[RHT_KAK_GRANNYS_SHOP] = HintText(CustomMessage("They say that the #potion shop lady# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die #Dame des Hexenladens# #[[1]]# verkaufe.", /*french*/ "Selon moi, la #dame du magasin de potion# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß #eingesperrt in einem Haus# #[[1]]# läge.", /*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*/ "", + /*german*/ "Man erzählt sich, daß #tief unter Wasser in einem Loch# #[[1]]# sei.", /*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*/ "", + /*german*/ "Man erzählt sich, daß auf einem #Vorsprung in einer Windmühle# #[[1]]# läge.", /*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*/ "", + /*german*/ "Man erzählt sich, daß der #zweite Preis des toten Boris# #[[1]]# sei.", /*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*/ "", + /*german*/ "Man erzählt sich, daß das #Rennen gegen einen Geist# zu #[[1]]# führen würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß in einem #ländlichen Silo# #[[1]]# läge.", /*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]]#. hintTextTable[RHT_GRAVEYARD_FREESTANDING_POH] = HintText(CustomMessage("They say that a #crate in a graveyard# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Kiste auf einem Friedhof# #[[1]]# verberge.", /*french*/ "Selon moi, #la boîte dans le Cimetière# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, bajo la #caja de un cementerio# yace #[[1]]#. hintTextTable[RHT_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR] = HintText(CustomMessage("They say that a #gravekeeper digs up# #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Grabpfleger# #[[1]]# ausgrabe.", /*french*/ "Selon moi, #le jeu du fossoyeur# cache #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß auf der Spitze einer #Säule in einem Fluß# #[[1]]# läge.", /*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*/ "", + /*german*/ "Man erzählt sich, daß auf einem #Vorsprung von einem Fluß nahe eines Wasserfalls# #[[1]]# läge.", /*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*/ "", + /*german*/ "Man erzählt sich, daß man auf dem #Dach eines Laboratoriums# #[[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*/ "", + /*german*/ "Man erzählt sich, daß sich schwebend auf Eis #[[1]]# befände.", /*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*/ "", + /*german*/ "Man erzählt sich, daß hinter einem #Wasserfall in einem Tal# #[[1]]# sei.", /*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]]#. hintTextTable[RHT_GV_CRATE_FREESTANDING_POH] = HintText(CustomMessage("They say that a #crate in a valley# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Kiste in einem Tal# #[[1]]# verberge.", /*french*/ "Selon moi, la #boîte dans la vallée# contient #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß auf der Spitze eines #Steinbogens# #[[1]]# läge.", /*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*/ "", + /*german*/ "Man erzählt sich, daß oberhalb eines #Berghöhleneingangs# #[[1]]# sei.", /*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*/ "", + /*german*/ "Man erzählt sich, daß in einem #vulkanischen Alkoven# #[[1]]# sei.", /*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*/ "", + /*german*/ "Man erzählt sich, daß #[[1]]# von #Vulkanasche# verdeckt sei.", /*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*/ "", + /*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_GF_NORTH_F2_CARPENTER] = HintText(CustomMessage("They say that #defeating Gerudo guards# reveals #[[1]]#.", - /*german*/ "", + /*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_GF_SOUTH_F1_CARPENTER] = HintText(CustomMessage("They say that #defeating Gerudo guards# reveals #[[1]]#.", - /*german*/ "", + /*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_GF_SOUTH_F2_CARPENTER] = HintText(CustomMessage("They say that #defeating Gerudo guards# reveals #[[1]]#.", - /*german*/ "", + /*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_HF_GS_NEAR_KAK_GROTTO] = HintText(CustomMessage("They say that a #spider-guarded spider in a hole# hoards #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #spinnenbewachte Spinne in einem Loch #[[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]]#. hintTextTable[RHT_LLR_GS_BACK_WALL] = HintText(CustomMessage("They say that night reveals a #spider in a ranch# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne auf einer Farm# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur la façade de la ferme# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela una #Skulltula del rancho# que otorga #[[1]]#. hintTextTable[RHT_LLR_GS_RAIN_SHED] = HintText(CustomMessage("They say that night reveals a #spider in a ranch# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne auf einer Farm# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur le mur de l'enclos# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela una #Skulltula del rancho# que otorga #[[1]]#. hintTextTable[RHT_LLR_GS_HOUSE_WINDOW] = HintText(CustomMessage("They say that night reveals a #spider in a ranch# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne auf einer Farm# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur la maison de ferme# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela una #Skulltula del rancho# que otorga #[[1]]#. hintTextTable[RHT_LLR_GS_TREE] = HintText(CustomMessage("They say that a spider hiding in a #ranch tree# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine in einem #Baum auf einer Farm# versteckte Spinne #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans l'arbre de la ferme# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una Skulltula escondida en el #árbol de un rancho# otorga #[[1]]#. hintTextTable[RHT_KF_GS_BEAN_PATCH] = HintText(CustomMessage("They say that a #spider buried in a forest# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #in einem Wald vergrabene Spinne# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula enterrée dans la forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula enterrada en un bosque# otorga #[[1]]#. hintTextTable[RHT_KF_GS_KNOW_IT_ALL_HOUSE] = HintText(CustomMessage("They say that night in the past reveals a #spider in a forest# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in einem Wald# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula derrière une cabane de la forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela en el pasado una #Skulltula del bosque# que otorga #[[1]]#. hintTextTable[RHT_KF_GS_HOUSE_OF_TWINS] = HintText(CustomMessage("They say that night in the future reveals a #spider in a forest# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Zukunft eine #Spinne in einem Wald# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur une cabane de la forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela en el futuro una #Skulltula del rancho# que otorga #[[1]]#. hintTextTable[RHT_LW_GS_BEAN_PATCH_NEAR_BRIDGE] = HintText(CustomMessage("They say that a #spider buried deep in a forest maze# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #tief in einem Waldlabyrinth vergrabene Spinne# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula enterrée dans les bois# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula enterrada en un laberinto forestal# otorga #[[1]]#. hintTextTable[RHT_LW_GS_BEAN_PATCH_NEAR_THEATER] = HintText(CustomMessage("They say that a #spider buried deep in a forest maze# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #tief in einem Waldlabyrinth vergrabene Spinne# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula enterrée dans les bois# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula enterrada en un laberinto forestal# otorga #[[1]]#. hintTextTable[RHT_LW_GS_ABOVE_THEATER] = HintText(CustomMessage("They say that night reveals a #spider deep in a forest maze# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne tief in einem Waldlabyrinth# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula haut perchée dans les bois# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne auf einer Waldwiese# 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*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne außerhalb eines Turms 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*/ "", + /*german*/ "Man erzählt sich, daß eine in einem #Baum außerhalb von einem Schloß 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]]#. hintTextTable[RHT_MARKET_GS_GUARD_HOUSE] = HintText(CustomMessage("They say that a #spider in a guarded crate# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Spinne in einer bewachten Kiste# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans une boîte en ville# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß eine #in einem Vulkan begrabene 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*/ "", + /*german*/ "Man erzählt sich, daß eine #außerhalb einer Höhle begrabene 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*/ "", + /*german*/ "Man erzählt sich, daß eine #in einem Bergwinkel 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]]#. hintTextTable[RHT_DMT_GS_ABOVE_DODONGOS_CAVERN] = HintText(CustomMessage("They say that the hammer reveals a #spider on a mountain# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der Hammer eine #Spinne auf einem Berg# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula derrière un rocher massif près d'une caverne# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el martillo revela #una Skulltula de la montaña# que otorga #[[1]]#. hintTextTable[RHT_DMT_GS_FALLING_ROCKS_PATH] = HintText(CustomMessage("They say that the hammer reveals a #spider on a mountain# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß der Hammer eine #Spinne auf einem Berg# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula derrière un rocher massif près du sommet d'un volcan# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el martillo revela #una Skulltula de la montaña# que otorga #[[1]]#. hintTextTable[RHT_GC_GS_CENTER_PLATFORM] = HintText(CustomMessage("They say that a #suspended spider# in Goron City holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #hängende Spinne# in Goronia #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula perchée dans le village Goron# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula suspendida# en la Ciudad Goron otorga #[[1]]#. hintTextTable[RHT_GC_GS_BOULDER_MAZE] = HintText(CustomMessage("They say that a spider in a #Goron City crate# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine Spinne in einer #Kiste in Goronia# #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans une boîte du village Goron# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in einer Stadt# 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*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in einer Stadt# 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*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in einer Stadt# 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*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in einer Stadt# 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*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in einer Stadt# 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*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Zukunft eine #Spinne in einer Stadt# 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]]#. hintTextTable[RHT_GRAVEYARD_GS_WALL] = HintText(CustomMessage("They say that night reveals a #spider in a graveyard# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne auf einem Friedhof# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur une façade du Cimetière# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß eine #auf einem Friedhof begrabene 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*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in 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*/ "", + /*german*/ "Man erzählt sich, daß eine in einem #Baum bei 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*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Zukunft eine #Spinne in 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*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Zukunft eine #Spinne in 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*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne bei 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]]#. hintTextTable[RHT_ZF_GS_ABOVE_THE_LOG] = HintText(CustomMessage("They say that night reveals a #spider near a deity# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne in der Nähe einer Gottheit# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula près du gardien aquatique# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela una #Skulltula junto a cierta deidad# que otorga #[[1]]#. hintTextTable[RHT_ZF_GS_TREE] = HintText(CustomMessage("They say that a spider hiding in a #tree near a deity# holds #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine in einem #Baum in der Nähe einer Gottheit# versteckte Spinne #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans un arbre dans un réservoir# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß eine #bei einem Fluß begrabene 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*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne bei 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*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne bei 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*/ "", + /*german*/ "Man erzählt sich, daß einer 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*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne in einem Baum bei 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*/ "", + /*german*/ "Man erzählt sich, daß eine #in einem Tal begrabene 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]]#. hintTextTable[RHT_GV_GS_SMALL_BRIDGE] = HintText(CustomMessage("They say that night in the past reveals a #spider in a valley# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Vergangenheit eine #Spinne in einem Tal# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula au dessus d'une petite cascade# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche del pasado revela una #Skulltula del valle# que otorga #[[1]]#. hintTextTable[RHT_GV_GS_PILLAR] = HintText(CustomMessage("They say that night in the future reveals a #spider in a valley# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Zukunft eine #Spinne in einem Tal# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur une arche de pierre dans une vallée# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche del futuro revela una #Skulltula del valle# que otorga #[[1]]#. hintTextTable[RHT_GV_GS_BEHIND_TENT] = HintText(CustomMessage("They say that night in the future reveals a #spider in a valley# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht in der Zukunft eine #Spinne in einem Tal# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula derrière une tente# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche del futuro revela una #Skulltula del valle# que otorga #[[1]]#. hintTextTable[RHT_GF_GS_ARCHERY_RANGE] = HintText(CustomMessage("They say that night reveals a #spider in a fortress# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne in einer Festung# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur une cible de tir# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela una #Skulltula de una fortaleza# que otorga #[[1]]#. hintTextTable[RHT_GF_GS_TOP_FLOOR] = HintText(CustomMessage("They say that night reveals a #spider in a fortress# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne in einer Festung# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula au sommet d'une forteresse# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß eine #in der Wüste begrabene 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]]#. hintTextTable[RHT_COLOSSUS_GS_HILL] = HintText(CustomMessage("They say that night reveals a #spider deep in the desert# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne tief in der Wüste# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula sur une colline dans le désert# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, la noche revela una #Skulltula en las profundidades del desierto# que otorga #[[1]]#. hintTextTable[RHT_COLOSSUS_GS_TREE] = HintText(CustomMessage("They say that night reveals a #spider deep in the desert# holding #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß die Nacht eine #Spinne tief in der Wüste# enthülle, welche #[[1]]# besäße.", /*french*/ "Selon moi, une #Skulltula dans un arbre du désert# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß der #Inhaber des Kokiri-Ladens# #[[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*/ "", + /*german*/ "Man erzählt sich, daß der #Inhaber des Kokiri-Ladens# #[[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*/ "", + /*german*/ "Man erzählt sich, daß der #Inhaber des Kokiri-Ladens# #[[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*/ "", + /*german*/ "Man erzählt sich, daß der #Inhaber des Kokiri-Ladens# #[[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*/ "", + /*german*/ "Man erzählt sich, daß der #Inhaber des Kokiri-Ladens# #[[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*/ "", + /*german*/ "Man erzählt sich, daß der #Inhaber des Kokiri-Ladens# #[[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*/ "", + /*german*/ "Man erzählt sich, daß der #Inhaber des Kokiri-Ladens# #[[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*/ "", + /*german*/ "Man erzählt sich, daß der #Inhaber des Kokiri-Ladens# #[[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*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden in 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]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*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*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden in 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]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*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*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden in 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]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*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*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden in 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]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*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*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden in 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]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*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*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden in 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]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*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*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden in 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]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*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*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden in 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]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*spanish*/ Según dicen, un #vendedor de pociones# ofrece #[[1]]#. hintTextTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_1] = HintText(CustomMessage("They say that a #Bombchu merchant# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krabbelminenhändler# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #marchand de Missiles# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #mercader de bombchus# vende #[[1]]#. hintTextTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_2] = HintText(CustomMessage("They say that a #Bombchu merchant# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krabbelminenhändler# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #marchand de Missiles# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #mercader de bombchus# vende #[[1]]#. hintTextTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_3] = HintText(CustomMessage("They say that a #Bombchu merchant# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krabbelminenhändler# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #marchand de Missiles# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #mercader de bombchus# vende #[[1]]#. hintTextTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_4] = HintText(CustomMessage("They say that a #Bombchu merchant# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krabbelminenhändler# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #marchand de Missiles# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #mercader de bombchus# vende #[[1]]#. hintTextTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_5] = HintText(CustomMessage("They say that a #Bombchu merchant# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krabbelminenhändler# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #marchand de Missiles# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #mercader de bombchus# vende #[[1]]#. hintTextTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_6] = HintText(CustomMessage("They say that a #Bombchu merchant# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krabbelminenhändler# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #marchand de Missiles# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #mercader de bombchus# vende #[[1]]#. hintTextTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_7] = HintText(CustomMessage("They say that a #Bombchu merchant# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krabbelminenhändler# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #marchand de Missiles# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, un #mercader de bombchus# vende #[[1]]#. hintTextTable[RHT_MARKET_BOMBCHU_SHOP_ITEM_8] = HintText(CustomMessage("They say that a #Bombchu merchant# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Krabbelminenhändler# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #marchand de Missiles# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden auf dem Markt# #[[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]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*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*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden auf dem Markt# #[[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]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*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*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden auf dem Markt# #[[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]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*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*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden auf dem Markt# #[[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]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*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*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden auf dem Markt# #[[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]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*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*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden auf dem Markt# #[[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]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*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*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden auf dem Markt# #[[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]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*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*/ "", + /*german*/ "Man erzählt sich, daß der #Magie-Laden auf dem Markt# #[[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]]#. {}, { CustomMessage("They say that a #potion seller# offers #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Trankhändler# #[[1]]# anböte.", /*french*/ "Selon moi, l'#apothicaire# vend #[[1]]#.", {QM_RED, QM_GREEN})}); // /*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*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Marktbasar# #[[1]]# angeboten würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten würde.", /*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*/ "", + /*german*/ "Man erzählt sich, daß auf dem #Basar in Kakariko# #[[1]]# angeboten würde.", /*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_ZD_SHOP_ITEM_1] = HintText(CustomMessage("They say that a #Zora shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Zora# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Zora# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Zora# vende #[[1]]#. hintTextTable[RHT_ZD_SHOP_ITEM_2] = HintText(CustomMessage("They say that a #Zora shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Zora# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Zora# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Zora# vende #[[1]]#. hintTextTable[RHT_ZD_SHOP_ITEM_3] = HintText(CustomMessage("They say that a #Zora shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Zora# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Zora# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Zora# vende #[[1]]#. hintTextTable[RHT_ZD_SHOP_ITEM_4] = HintText(CustomMessage("They say that a #Zora shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Zora# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Zora# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Zora# vende #[[1]]#. hintTextTable[RHT_ZD_SHOP_ITEM_5] = HintText(CustomMessage("They say that a #Zora shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Zora# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Zora# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Zora# vende #[[1]]#. hintTextTable[RHT_ZD_SHOP_ITEM_6] = HintText(CustomMessage("They say that a #Zora shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Zora# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Zora# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Zora# vende #[[1]]#. hintTextTable[RHT_ZD_SHOP_ITEM_7] = HintText(CustomMessage("They say that a #Zora shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Zora# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Zora# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Zora# vende #[[1]]#. hintTextTable[RHT_ZD_SHOP_ITEM_8] = HintText(CustomMessage("They say that a #Zora shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Zora# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Zora# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Zora# vende #[[1]]#. hintTextTable[RHT_GC_SHOP_ITEM_1] = HintText(CustomMessage("They say that a #Goron shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Goronen# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Goron# vende #[[1]]#. hintTextTable[RHT_GC_SHOP_ITEM_2] = HintText(CustomMessage("They say that a #Goron shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Goronen# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Goron# vende #[[1]]#. hintTextTable[RHT_GC_SHOP_ITEM_3] = HintText(CustomMessage("They say that a #Goron shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Goronen# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Goron# vende #[[1]]#. hintTextTable[RHT_GC_SHOP_ITEM_4] = HintText(CustomMessage("They say that a #Goron shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Goronen# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Goron# vende #[[1]]#. hintTextTable[RHT_GC_SHOP_ITEM_5] = HintText(CustomMessage("They say that a #Goron shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Goronen# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Goron# vende #[[1]]#. hintTextTable[RHT_GC_SHOP_ITEM_6] = HintText(CustomMessage("They say that a #Goron shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Goronen# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Goron# vende #[[1]]#. hintTextTable[RHT_GC_SHOP_ITEM_7] = HintText(CustomMessage("They say that a #Goron shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Goronen# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, el #dependiente Goron# vende #[[1]]#. hintTextTable[RHT_GC_SHOP_ITEM_8] = HintText(CustomMessage("They say that a #Goron shopkeeper# sells #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Händler der Goronen# #[[1]]# verkaufen würde.", /*french*/ "Selon moi, la #boutique Goron# vend #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß ein #einsamer Deku in einem Loch# #[[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*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-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*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-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*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-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*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-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*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-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*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku bei 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*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-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*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-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*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo au cœur 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*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-Paar im Untergrund# #[[1]]# verkaufe.", /*french*/ "Selon moi, le #duo de peste Mojo au cœur 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*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-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*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-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*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-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*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-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*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-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*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-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*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-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*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-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*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-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*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-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*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-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*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-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*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-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*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-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*/ "", + /*german*/ "Man erzählt sich, daß ein #Deku-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_LLR_STABLES_LEFT_COW] = HintText(CustomMessage("They say that a #cow in a stable# gifts #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Kuh in einem Stall# #[[1]]# schenke.", /*french*/ "Selon moi, la #vache dans l'étable# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #vaca del establo# brinda #[[1]]#. hintTextTable[RHT_LLR_STABLES_RIGHT_COW] = HintText(CustomMessage("They say that a #cow in a stable# gifts #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #Kuh in einem Stall# #[[1]]# schenke.", /*french*/ "Selon moi, la #vache dans l'étable# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß eine #Kuh in einem Silo# #[[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*/ "", + /*german*/ "Man erzählt sich, daß eine #Kuh in einem Silo# #[[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_KAK_IMPAS_HOUSE_COW] = HintText(CustomMessage("They say that a #cow imprisoned in a house# protects #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß eine #in einem Haus gefangene Kuh# #[[1]]# schütze.", /*french*/ "Selon moi, la #vache en cage# donne #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß eine #Kuh in einem luxuriösen Loch# #[[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]]#. hintTextTable[RHT_BEEHIVE_CHEST_GROTTO] = HintText(CustomMessage("They say that a #beehive above a chest# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Bienenstock oberhalb einer Truhe# #[[1]]# verberge.", /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß ein #Bienenstock oberhalb eines einsamen Deku# #[[1]]# verberge.", /*french*/ "Selon moi, #[[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*/ "", + /*german*/ "Man erzählt sich, daß ein #Bienenstock oberhalb eines Deku-Paars# #[[1]]# verberge.", /*french*/ "Selon moi, #[[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*/ "", + /*german*/ "Man erzählt sich, daß ein #Bienenstock oberhalb eines Deku-Trios# #[[1]]# verberge.", /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena sobre un trío de dekus# esconde #[[1]]#. hintTextTable[RHT_BEEHIVE_COW_GROTTO] = HintText(CustomMessage("They say that a #beehive above a cow# hides #[[1]]#.", - /*german*/ "", + /*german*/ "Man erzählt sich, daß ein #Bienenstock oberhalb einer Kuh# #[[1]]# verberge.", /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); // /*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*/ "", + /*german*/ "Man erzählt sich, daß ein #Bienenstock vor dem Zora-König# #[[1]]# verberge.", /*french*/ "Selon moi, #[[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*/ "", + /*german*/ "Man erzählt sich, daß ein #Bienenstock hinter dem Zora-König# #[[1]]# verberge.", /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena detrás del rey de los zoras# esconde #[[1]]#. } From 075b28cc8c6071dcf5ca06a2b4d03256f4837fb8 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Tue, 3 Sep 2024 22:12:25 -0700 Subject: [PATCH 25/54] Define VB for fairy group spawning --- soh/soh/Enhancements/game-interactor/GameInteractor.h | 3 +++ soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c | 9 ++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index 3523fa4057f..cc79a9a5208 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -413,6 +413,9 @@ typedef enum { // Vanilla condition: true VB_PHANTOM_GANON_DEATH_SCENE, VB_NABOORU_KNUCKLE_DEATH_SCENE, + + // Opt: *EnElf + VB_SPAWN_FAIRY_GROUP, } GIVanillaBehavior; #ifdef __cplusplus diff --git a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c index f6f82f5c788..af16aa7b53e 100644 --- a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c +++ b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c @@ -7,6 +7,7 @@ #include "z_en_elf.h" #include "objects/gameplay_keep/gameplay_keep.h" #include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS (ACTOR_FLAG_UPDATE_WHILE_CULLED | ACTOR_FLAG_DRAW_WHILE_CULLED | ACTOR_FLAG_NO_FREEZE_OCARINA) @@ -399,9 +400,11 @@ void EnElf_Init(Actor* thisx, PlayState* play) { EnElf_SetupAction(this, func_80A03604); func_80A01C38(this, 8); - for (i = 0; i < 8; i++) { - Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELF, thisx->world.pos.x, - thisx->world.pos.y - 30.0f, thisx->world.pos.z, 0, 0, 0, FAIRY_HEAL, true); + if (GameInteractor_Should(VB_SPAWN_FAIRY_GROUP, true, this)) { + for (i = 0; i < 8; i++) { + Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ELF, thisx->world.pos.x, + thisx->world.pos.y - 30.0f, thisx->world.pos.z, 0, 0, 0, FAIRY_HEAL, true); + } } break; default: From a263d458bfc8d05f175d68a794b1738f677c5561 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Tue, 3 Sep 2024 23:14:54 -0700 Subject: [PATCH 26/54] Add skeleton of new files for fairy shuffle --- .../Enhancements/randomizer/fairy_shuffle.cpp | 20 +++++++++++++++++++ .../Enhancements/randomizer/fairy_shuffle.h | 4 ++++ 2 files changed, 24 insertions(+) create mode 100644 soh/soh/Enhancements/randomizer/fairy_shuffle.cpp create mode 100644 soh/soh/Enhancements/randomizer/fairy_shuffle.h diff --git a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp new file mode 100644 index 00000000000..a0851fe90e3 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp @@ -0,0 +1,20 @@ +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "fairy_shuffle.h" + +void FairyOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void* optionalArg) { + if (id == VB_SPAWN_FAIRY_GROUP) { + // TODO + } +} + +uint32_t onVanillaBehaviorHook = 0; + +void FairyRegisterHooks() { + onVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook(FairyOnVanillaBehaviorHandler); +} + +void FairyUnregisterHooks() { + GameInteractor::Instance->UnregisterGameHook(onVanillaBehaviorHook); + + onVanillaBehaviorHook = 0; +} \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/fairy_shuffle.h b/soh/soh/Enhancements/randomizer/fairy_shuffle.h new file mode 100644 index 00000000000..d7dc64e6255 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/fairy_shuffle.h @@ -0,0 +1,4 @@ +#include + +void FairyRegisterHooks(); +void FairyUnregisterHooks(); From 792515d7f3cdcbfd40a1fe09575af27f091dedf1 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Tue, 3 Sep 2024 23:26:43 -0700 Subject: [PATCH 27/54] Add option to enable/disable fairy shuffle --- soh/soh/Enhancements/randomizer/hook_handlers.cpp | 7 +++++++ soh/soh/Enhancements/randomizer/option_descriptions.cpp | 2 ++ soh/soh/Enhancements/randomizer/randomizerTypes.h | 1 + soh/soh/Enhancements/randomizer/settings.cpp | 6 ++++++ 4 files changed, 16 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 4bd8da74259..673bdfe8c19 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -6,6 +6,7 @@ #include "soh/Enhancements/randomizer/dungeon.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/Enhancements/randomizer/fairy_shuffle.h" extern "C" { #include "macros.h" @@ -1518,6 +1519,8 @@ void RandomizerRegisterHooks() { onSceneInitHook = 0; onActorInitHook = 0; + FairyUnregisterHooks(); + if (!IS_RANDO) return; onFlagSetHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnFlagSetHandler); @@ -1528,5 +1531,9 @@ void RandomizerRegisterHooks() { onVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnVanillaBehaviorHandler); onSceneInitHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnSceneInitHandler); onActorInitHook = GameInteractor::Instance->RegisterGameHook(RandomizerOnActorInitHandler); + + if (RAND_GET_OPTION(RSK_SHUFFLE_FAIRIES)) { + FairyRegisterHooks(); + } }); } diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index 597b46db605..4fe19320153 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -336,6 +336,8 @@ void Settings::CreateOptionDescriptions() { "have collected all 100 Gold Skulltula Tokens.\n" "\n" "You can still talk to him multiple times to get Huge Rupees."; + mOptionDescriptions[RSK_SHUFFLE_FAIRIES] = + "Shuffle fairy locations."; mOptionDescriptions[RSK_SHUFFLE_DUNGEON_REWARDS] = "Shuffles the location of spiritual stones and medallions.\n" "\n" diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 507ae5fec2b..eb2d8e73f8e 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -3883,6 +3883,7 @@ typedef enum { RSK_SKELETON_KEY, RSK_SHUFFLE_DEKU_STICK_BAG, RSK_SHUFFLE_DEKU_NUT_BAG, + RSK_SHUFFLE_FAIRIES, RSK_MAX } RandomizerSettingKey; diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index f3f860800bc..83e332f6027 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -125,6 +125,7 @@ void Settings::CreateOptions() { mOptions[RSK_FISHSANITY] = Option::U8("Fishsanity", {"Off", "Shuffle only Hyrule Loach", "Shuffle Fishing Pond", "Shuffle Overworld Fish", "Shuffle Both"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("Fishsanity"), mOptionDescriptions[RSK_FISHSANITY], WidgetType::Combobox, RO_FISHSANITY_OFF); mOptions[RSK_FISHSANITY_POND_COUNT] = Option::U8("Pond Fish Count", {NumOpts(0,17,1)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("FishsanityPondCount"), mOptionDescriptions[RSK_FISHSANITY_POND_COUNT], WidgetType::Slider, 0, true, IMFLAG_NONE); mOptions[RSK_FISHSANITY_AGE_SPLIT] = Option::Bool("Pond Age Split", CVAR_RANDOMIZER_SETTING("FishsanityAgeSplit"), mOptionDescriptions[RSK_FISHSANITY_AGE_SPLIT]); + mOptions[RSK_SHUFFLE_FAIRIES] = Option::Bool("Shuffle Fairies", CVAR_RANDOMIZER_SETTING("ShuffleFairies"), mOptionDescriptions[RSK_SHUFFLE_FAIRIES]); mOptions[RSK_SHUFFLE_MAPANDCOMPASS] = Option::U8("Maps/Compasses", {"Start With", "Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StartingMapsCompasses"), mOptionDescriptions[RSK_SHUFFLE_MAPANDCOMPASS], WidgetType::Combobox, RO_DUNGEON_ITEM_LOC_OWN_DUNGEON); mOptions[RSK_KEYSANITY] = Option::U8("Small Keys", {"Start With", "Vanilla", "Own Dungeon", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("Keysanity"), mOptionDescriptions[RSK_KEYSANITY], WidgetType::Combobox, RO_DUNGEON_ITEM_LOC_OWN_DUNGEON); mOptions[RSK_GERUDO_KEYS] = Option::U8("Gerudo Fortress Keys", {"Vanilla", "Any Dungeon", "Overworld", "Anywhere"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("GerudoKeys"), mOptionDescriptions[RSK_GERUDO_KEYS], WidgetType::Combobox, RO_GERUDO_KEYS_VANILLA); @@ -686,6 +687,7 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_ADULT_TRADE], &mOptions[RSK_SHUFFLE_100_GS_REWARD], &mOptions[RSK_SHUFFLE_BOSS_SOULS], + &mOptions[RSK_SHUFFLE_FAIRIES], }, false, WidgetContainerType::COLUMN); mOptionGroups[RSG_SHUFFLE_DUNGEON_ITEMS_IMGUI] = OptionGroup::SubGroup("Shuffle Dungeon Items", { &mOptions[RSK_SHUFFLE_DUNGEON_REWARDS], @@ -901,6 +903,7 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_BOSS_SOULS], &mOptions[RSK_SHUFFLE_DEKU_STICK_BAG], &mOptions[RSK_SHUFFLE_DEKU_NUT_BAG], + &mOptions[RSK_SHUFFLE_FAIRIES], }); mOptionGroups[RSG_SHUFFLE_DUNGEON_ITEMS] = OptionGroup("Shuffle Dungeon Items", { &mOptions[RSK_SHUFFLE_MAPANDCOMPASS], @@ -1081,6 +1084,7 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES], &mOptions[RSK_SHUFFLE_ADULT_TRADE], &mOptions[RSK_SHUFFLE_100_GS_REWARD], + &mOptions[RSK_SHUFFLE_FAIRIES], &mOptions[RSK_GOSSIP_STONE_HINTS], }; @@ -1134,6 +1138,7 @@ void Settings::CreateOptions() { { "Shuffle Settings:Shuffle Boss Souls", RSK_SHUFFLE_BOSS_SOULS }, { "Shuffle Settings:Shuffle Deku Stick Bag", RSK_SHUFFLE_DEKU_STICK_BAG }, { "Shuffle Settings:Shuffle Deku Nut Bag", RSK_SHUFFLE_DEKU_NUT_BAG }, + { "Shuffle Settings:Shuffle Fairies", RSK_SHUFFLE_FAIRIES }, { "Start with Deku Shield", RSK_STARTING_DEKU_SHIELD }, { "Start with Kokiri Sword", RSK_STARTING_KOKIRI_SWORD }, { "Start with Fairy Ocarina", RSK_STARTING_OCARINA }, @@ -2361,6 +2366,7 @@ void Settings::ParseJson(nlohmann::json spoilerFileJson) { case RSK_SHUFFLE_OCARINA_BUTTONS: case RSK_SHUFFLE_SWIM: case RSK_SHUFFLE_CHILD_WALLET: + case RSK_SHUFFLE_FAIRIES: case RSK_STARTING_DEKU_SHIELD: case RSK_STARTING_KOKIRI_SWORD: case RSK_STARTING_ZELDAS_LULLABY: From e655f2e77e49c64756ece79c2948ff92fcb4a3a4 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Wed, 4 Sep 2024 00:34:59 -0700 Subject: [PATCH 28/54] Add field to fairy entities to hold randomizer data --- soh/soh/Enhancements/randomizer/fairy_shuffle.cpp | 10 ++++++++++ soh/soh/Enhancements/randomizer/fairy_shuffle.h | 10 ++++++++++ soh/src/overlays/actors/ovl_En_Elf/z_en_elf.h | 4 ++++ 3 files changed, 24 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp index a0851fe90e3..031a3ad5bbf 100644 --- a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp +++ b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp @@ -1,5 +1,6 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "fairy_shuffle.h" +#include "src/overlays/actors/ovl_En_Elf/z_en_elf.h" void FairyOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void* optionalArg) { if (id == VB_SPAWN_FAIRY_GROUP) { @@ -7,14 +8,23 @@ void FairyOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void* opt } } +void FairyOnActorInitHandler(void* actorRef) { + EnElf* enElf = static_cast(actorRef); + enElf->sohFairyIdentity = { RAND_INF_MAX, GET_ITEM_NONE }; +} + uint32_t onVanillaBehaviorHook = 0; +uint32_t onActorInitHook = 0; void FairyRegisterHooks() { onVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook(FairyOnVanillaBehaviorHandler); + onActorInitHook = GameInteractor::Instance->RegisterGameHookForID(ACTOR_EN_ELF, FairyOnActorInitHandler); } void FairyUnregisterHooks() { GameInteractor::Instance->UnregisterGameHook(onVanillaBehaviorHook); + GameInteractor::Instance->UnregisterGameHookForID(onActorInitHook); onVanillaBehaviorHook = 0; + onActorInitHook = 0; } \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/fairy_shuffle.h b/soh/soh/Enhancements/randomizer/fairy_shuffle.h index d7dc64e6255..95640af9386 100644 --- a/soh/soh/Enhancements/randomizer/fairy_shuffle.h +++ b/soh/soh/Enhancements/randomizer/fairy_shuffle.h @@ -1,4 +1,14 @@ +#pragma once + #include +#include "soh/Enhancements/item-tables/ItemTableTypes.h" +#include "randomizer_inf.h" + +typedef struct FairyIdentity { + RandomizerInf randomizerInf; + GetItemEntry itemEntry; +} FairyIdentity; + void FairyRegisterHooks(); void FairyUnregisterHooks(); 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 7f8e4c84ee0..61de10b6f5b 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,6 +4,7 @@ #include #include "global.h" #include "overlays/actors/ovl_Elf_Msg/z_elf_msg.h" +#include "soh/Enhancements/randomizer/fairy_shuffle.h" struct EnElf; @@ -42,6 +43,9 @@ 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 { From 59222c8802e901c593e4fe9187e2368c02abe898 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Wed, 4 Sep 2024 23:05:54 -0700 Subject: [PATCH 29/54] Expose the current grotto id, or find it if not shuffled This is necessary since, unlike chest or scrub grottos, fairy fountains, lacking any elements that would normally differ between grottos, often have identical respawn data. This change enables fairy shuffle to correctly identify which fairy fountain was entered so it could load the right checks. --- soh/soh/Enhancements/randomizer/randomizer_grotto.c | 11 +++++++++++ soh/soh/Enhancements/randomizer/randomizer_grotto.h | 1 + 2 files changed, 12 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/randomizer_grotto.c b/soh/soh/Enhancements/randomizer/randomizer_grotto.c index ef532f670ad..aeaa3e9b6da 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_grotto.c +++ b/soh/soh/Enhancements/randomizer/randomizer_grotto.c @@ -332,3 +332,14 @@ s16 Grotto_GetRenamedGrottoIndexFromOriginal(s8 content, s8 scene) { return ENTRANCE_RANDO_GROTTO_LOAD_START; } + +s8 Grotto_CurrentGrotto() { + if (Randomizer_GetSettingValue(RSK_SHUFFLE_GROTTO_ENTRANCES) || Randomizer_GetSettingValue(RSK_SHUFFLE_OVERWORLD_SPAWNS) || Randomizer_GetSettingValue(RSK_SHUFFLE_WARP_SONGS)) { + return grottoId; + } else { + s16 entrance = gSaveContext.respawn[RESPAWN_MODE_RETURN].entranceIndex; + s8 scene = gEntranceTable[entrance].scene; + s8 data = gSaveContext.respawn[RESPAWN_MODE_RETURN].data; + return Grotto_GetRenamedGrottoIndexFromOriginal(data, scene) & 0xFF; + } +} diff --git a/soh/soh/Enhancements/randomizer/randomizer_grotto.h b/soh/soh/Enhancements/randomizer/randomizer_grotto.h index 938c4c6d6ee..f124caeefc7 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_grotto.h +++ b/soh/soh/Enhancements/randomizer/randomizer_grotto.h @@ -31,5 +31,6 @@ void Grotto_ForceGrottoReturn(void); void Grotto_ForceRegularVoidOut(void); void Grotto_SanitizeEntranceType(void); s16 Grotto_GetRenamedGrottoIndexFromOriginal(s8 content, s8 scene); +s8 Grotto_CurrentGrotto(); #endif //_RANDO_GROTTO_H_ From 987f4cec78226db69a68c2c412a65e94c9ce81b2 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Wed, 4 Sep 2024 23:54:27 -0700 Subject: [PATCH 30/54] Initialise fairy groups if detected --- .../Enhancements/randomizer/fairy_shuffle.cpp | 40 +++++++++++++++---- .../randomizer/randomizer_grotto.h | 6 +++ 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp index 031a3ad5bbf..38edfb0baca 100644 --- a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp +++ b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp @@ -1,24 +1,50 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "fairy_shuffle.h" +#include "randomizer_grotto.h" +#include "draw.h" #include "src/overlays/actors/ovl_En_Elf/z_en_elf.h" + +void FairyDrawRandomizedItem(EnElf* enElf, PlayState* play) { + GetItemEntry randoGetItem = enElf->sohFairyIdentity.itemEntry; + if (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0)) { + randoGetItem = GET_ITEM_MYSTERY; + } + func_8002ED80(&enElf->actor, play, 0); + EnItem00_CustomItemsParticles(&enElf->actor, play, randoGetItem); + GetItemEntry_Draw(play, randoGetItem); +} + void FairyOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void* optionalArg) { - if (id == VB_SPAWN_FAIRY_GROUP) { - // TODO - } + if (id == VB_SPAWN_FAIRY_GROUP) { + EnElf* enElf = static_cast(optionalArg); + s16 grottoId = (gPlayState->sceneNum == SCENE_FAIRYS_FOUNTAIN) ? Grotto_CurrentGrotto() : 0; + for (s16 index = 0; index < 8; index++) { + EnElf* newFairy = (EnElf*)Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_ELF, enElf->actor.world.pos.x, + enElf->actor.world.pos.y - 30.0f, enElf->actor.world.pos.z, 0, 0, 0, FAIRY_HEAL, true); + //EnElf* newFairy = newActor); + Rando::Location* location = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(ACTOR_EN_ELF, gPlayState->sceneNum, TWO_ACTOR_PARAMS(grottoId, index)); + if (location != NULL && location->GetRandomizerCheck() != RC_UNKNOWN_CHECK) { + GetItemEntry item = Rando::Context::GetInstance()->GetFinalGIEntry(location->GetRandomizerCheck(), true, GI_FAIRY); + newFairy->sohFairyIdentity = { static_cast(location->GetCollectionCheck().flag), item }; + newFairy->actor.draw = (ActorFunc)FairyDrawRandomizedItem; + } + } + *should = false; + } } void FairyOnActorInitHandler(void* actorRef) { - EnElf* enElf = static_cast(actorRef); - enElf->sohFairyIdentity = { RAND_INF_MAX, GET_ITEM_NONE }; + EnElf* enElf = static_cast(actorRef); + enElf->sohFairyIdentity = { RAND_INF_MAX, GET_ITEM_NONE }; } uint32_t onVanillaBehaviorHook = 0; uint32_t onActorInitHook = 0; void FairyRegisterHooks() { - onVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook(FairyOnVanillaBehaviorHandler); - onActorInitHook = GameInteractor::Instance->RegisterGameHookForID(ACTOR_EN_ELF, FairyOnActorInitHandler); + onVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook(FairyOnVanillaBehaviorHandler); + onActorInitHook = GameInteractor::Instance->RegisterGameHookForID(ACTOR_EN_ELF, FairyOnActorInitHandler); } void FairyUnregisterHooks() { diff --git a/soh/soh/Enhancements/randomizer/randomizer_grotto.h b/soh/soh/Enhancements/randomizer/randomizer_grotto.h index f124caeefc7..e12aa1482bb 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_grotto.h +++ b/soh/soh/Enhancements/randomizer/randomizer_grotto.h @@ -21,6 +21,9 @@ typedef struct { Vec3f pos; } GrottoReturnInfo; +#ifdef __cplusplus +extern "C" { +#endif void Grotto_InitExitAndLoadLists(void); void Grotto_SetExitOverride(s16 originalIndex, s16 overrideIndex); void Grotto_SetLoadOverride(s16 originalIndex, s16 overrideIndex); @@ -32,5 +35,8 @@ void Grotto_ForceRegularVoidOut(void); void Grotto_SanitizeEntranceType(void); s16 Grotto_GetRenamedGrottoIndexFromOriginal(s8 content, s8 scene); s8 Grotto_CurrentGrotto(); +#ifdef __cplusplus +}; +#endif #endif //_RANDO_GROTTO_H_ From d4f2c0d5d4555956cc683c04d52c4a2569f59a01 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 5 Sep 2024 00:54:23 -0700 Subject: [PATCH 31/54] Randomize first set of fairies --- soh/include/z64save.h | 2 +- .../randomizer/3drando/category.hpp | 1 + .../randomizer/3drando/item_pool.cpp | 11 +++++++ .../location_access/locacc_lost_woods.cpp | 12 +++++++- .../Enhancements/randomizer/fairy_shuffle.cpp | 8 +++-- soh/soh/Enhancements/randomizer/location.cpp | 9 ++++++ soh/soh/Enhancements/randomizer/location.h | 4 +++ .../Enhancements/randomizer/location_list.cpp | 29 +++++++++++++++++++ .../Enhancements/randomizer/randomizerTypes.h | 11 +++++++ .../Enhancements/randomizer/randomizer_inf.h | 9 ++++++ soh/soh/Enhancements/randomizer/static_data.h | 1 + 11 files changed, 92 insertions(+), 5 deletions(-) diff --git a/soh/include/z64save.h b/soh/include/z64save.h index 617c2acf526..64fe0b07f90 100644 --- a/soh/include/z64save.h +++ b/soh/include/z64save.h @@ -283,7 +283,7 @@ typedef struct { // #endregion // #region SOH [Randomizer] // Upstream TODO: Move these to their own struct or name to more obviously specific to Randomizer - /* */ u16 randomizerInf[17]; + /* */ u16 randomizerInf[(RAND_INF_MAX + 15) / 16]; /* */ u8 mqDungeonCount; /* */ u16 adultTradeItems; /* */ u8 triforcePiecesCollected; diff --git a/soh/soh/Enhancements/randomizer/3drando/category.hpp b/soh/soh/Enhancements/randomizer/3drando/category.hpp index 22522789cfd..69498004f70 100644 --- a/soh/soh/Enhancements/randomizer/3drando/category.hpp +++ b/soh/soh/Enhancements/randomizer/3drando/category.hpp @@ -19,6 +19,7 @@ enum class Category { cVanillaCompass, cAdultTrade, cBeehive, + cFairy, }; enum class OptionCategory { diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index f7250e17ddf..3496965feaa 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -1165,6 +1165,17 @@ void GenerateItemPool() { AddItemsToPool(ItemPool, shopsanityRupees); //Shopsanity gets extra large rupees } + //Fairysanity + if (ctx->GetOption(RSK_SHUFFLE_FAIRIES)) { + for (auto rc : Rando::StaticData::overworldFairyLocations) { + AddItemToMainPool(GetJunkItem()); + } + } else { + for (auto rc : Rando::StaticData::overworldFairyLocations) { + ctx->PlaceItemInLocation(rc, GetJunkItem(), false, true); + } + } + //Scrubsanity if (ctx->GetOption(RSK_SHUFFLE_SCRUBS).IsNot(RO_SCRUBS_OFF)) { //Deku Tree diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp index 66c08590555..57e873d0fcf 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp @@ -224,7 +224,17 @@ void AreaTable_Init_LostWoods() { areaTable[RR_SFM_FAIRY_GROTTO] = Area("SFM Fairy Grotto", "SFM Fairy Grotto", RA_NONE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->FreeFairies, {[]{return true;}}), - }, {}, { + }, { + //Locations + LOCATION(RC_SFM_FAIRY_GROTTO_FAIRY_1, true), + LOCATION(RC_SFM_FAIRY_GROTTO_FAIRY_2, true), + LOCATION(RC_SFM_FAIRY_GROTTO_FAIRY_3, true), + LOCATION(RC_SFM_FAIRY_GROTTO_FAIRY_4, true), + LOCATION(RC_SFM_FAIRY_GROTTO_FAIRY_5, true), + LOCATION(RC_SFM_FAIRY_GROTTO_FAIRY_6, true), + LOCATION(RC_SFM_FAIRY_GROTTO_FAIRY_7, true), + LOCATION(RC_SFM_FAIRY_GROTTO_FAIRY_8, true), + }, { //Exits Entrance(RR_SACRED_FOREST_MEADOW, {[]{return true;}}), }); diff --git a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp index 38edfb0baca..32bb489445c 100644 --- a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp +++ b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp @@ -10,9 +10,11 @@ void FairyDrawRandomizedItem(EnElf* enElf, PlayState* play) { if (CVarGetInteger(CVAR_RANDOMIZER_ENHANCEMENT("MysteriousShuffle"), 0)) { randoGetItem = GET_ITEM_MYSTERY; } - func_8002ED80(&enElf->actor, play, 0); + Matrix_Push(); + Matrix_Scale(37.5, 37.5, 37.5, MTXMODE_APPLY); EnItem00_CustomItemsParticles(&enElf->actor, play, randoGetItem); GetItemEntry_Draw(play, randoGetItem); + Matrix_Pop(); } void FairyOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void* optionalArg) { @@ -22,8 +24,8 @@ void FairyOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void* opt for (s16 index = 0; index < 8; index++) { EnElf* newFairy = (EnElf*)Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_ELF, enElf->actor.world.pos.x, enElf->actor.world.pos.y - 30.0f, enElf->actor.world.pos.z, 0, 0, 0, FAIRY_HEAL, true); - //EnElf* newFairy = newActor); - Rando::Location* location = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(ACTOR_EN_ELF, gPlayState->sceneNum, TWO_ACTOR_PARAMS(grottoId, index)); + int32_t params = (grottoId << 8) | index; + Rando::Location* location = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(ACTOR_EN_ELF, gPlayState->sceneNum, params); if (location != NULL && location->GetRandomizerCheck() != RC_UNKNOWN_CHECK) { GetItemEntry item = Rando::Context::GetInstance()->GetFinalGIEntry(location->GetRandomizerCheck(), true, GI_FAIRY); newFairy->sohFairyIdentity = { static_cast(location->GetCollectionCheck().flag), item }; diff --git a/soh/soh/Enhancements/randomizer/location.cpp b/soh/soh/Enhancements/randomizer/location.cpp index ddc9f7fc208..0d26311dac5 100644 --- a/soh/soh/Enhancements/randomizer/location.cpp +++ b/soh/soh/Enhancements/randomizer/location.cpp @@ -371,6 +371,15 @@ Rando::Location Rando::Location::Reward(RandomizerCheck rc, RandomizerCheckQuest isVanillaCompletion_, collectionCheck, collectionCheckGroup}; } +Rando::Location Rando::Location::Fairy(RandomizerCheck rc, RandomizerCheckQuest quest_, + RandomizerCheckArea area_, uint8_t scene_, + int32_t actorParams_, RandomizerInf flag_, std::string&& shortName_, + const RandomizerHintTextKey hintKey, SpoilerCollectionCheckGroup collectionCheckGroup) { + return {rc, quest_, RCTYPE_FAIRY, area_, LocationType::Base, ACTOR_EN_ELF, scene_, actorParams_, flag_, + std::move(shortName_), hintKey, RG_NONE, { Category::cFairy }, false, + SpoilerCollectionCheck(SPOILER_CHK_RANDOMIZER_INF, scene_, flag_), collectionCheckGroup}; +} + Rando::Location Rando::Location::OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, diff --git a/soh/soh/Enhancements/randomizer/location.h b/soh/soh/Enhancements/randomizer/location.h index bd7f69a8bbc..9fdb4f1a82b 100644 --- a/soh/soh/Enhancements/randomizer/location.h +++ b/soh/soh/Enhancements/randomizer/location.h @@ -350,6 +350,10 @@ class Location { std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, bool isVanillaCompletion_ = false); + static Location + Fairy(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, uint8_t scene_, int32_t actorParams_, + RandomizerInf flag, std::string&& shortName_, RandomizerHintTextKey hintKey, SpoilerCollectionCheckGroup collectionCheckGroup); + static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, std::string&& shortName_, std::string&& spoilerName_, bool isVanillaCompletion_ = false); diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index dd31dae5c9d..4700c01f732 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -504,6 +504,15 @@ std::vector Rando::StaticData::overworldLocations = { RC_LH_GROTTO_BEEHIVE, RC_GV_DEKU_SCRUB_GROTTO_BEEHIVE, RC_COLOSSUS_GROTTO_BEEHIVE, + + RC_SFM_FAIRY_GROTTO_FAIRY_1, + RC_SFM_FAIRY_GROTTO_FAIRY_2, + RC_SFM_FAIRY_GROTTO_FAIRY_3, + RC_SFM_FAIRY_GROTTO_FAIRY_4, + RC_SFM_FAIRY_GROTTO_FAIRY_5, + RC_SFM_FAIRY_GROTTO_FAIRY_6, + RC_SFM_FAIRY_GROTTO_FAIRY_7, + RC_SFM_FAIRY_GROTTO_FAIRY_8, }; std::vector Rando::StaticData::gossipStoneLocations = { @@ -580,6 +589,17 @@ std::vector Rando::StaticData::overworldFishLocations = { RC_ZD_FISH_1, RC_ZD_FISH_2, RC_ZD_FISH_3, RC_ZD_FISH_4, RC_ZD_FISH_5 }; +std::vector Rando::StaticData::overworldFairyLocations = { + RC_SFM_FAIRY_GROTTO_FAIRY_1, + RC_SFM_FAIRY_GROTTO_FAIRY_2, + RC_SFM_FAIRY_GROTTO_FAIRY_3, + RC_SFM_FAIRY_GROTTO_FAIRY_4, + RC_SFM_FAIRY_GROTTO_FAIRY_5, + RC_SFM_FAIRY_GROTTO_FAIRY_6, + RC_SFM_FAIRY_GROTTO_FAIRY_7, + RC_SFM_FAIRY_GROTTO_FAIRY_8, +}; + typedef enum { DUNGEON_DEKU_TREE = 0, DUNGEON_DODONGOS_CAVERN, @@ -1513,6 +1533,15 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_ZD_FISH_4] = Location::Base(RC_ZD_FISH_4, RCQUEST_BOTH, RCTYPE_FISH, RCAREA_ZORAS_DOMAIN, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 3, 0x00, "Fish 4", RHT_ZD_FISH, RG_FISH, { Category::cFish }, SpoilerCollectionCheck::Fish(0xFF, SCENE_ZORAS_DOMAIN), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); locationTable[RC_ZD_FISH_5] = Location::Base(RC_ZD_FISH_5, RCQUEST_BOTH, RCTYPE_FISH, RCAREA_ZORAS_DOMAIN, ACTOR_EN_FISH, SCENE_ZORAS_DOMAIN, -1 ^ 4, 0x00, "Fish 5", RHT_ZD_FISH, RG_FISH, { Category::cFish }, SpoilerCollectionCheck::Fish(0xFF, SCENE_ZORAS_DOMAIN), SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + // Fairies + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1800, RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1, "Grotto Fairy 1", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1801, RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2, "Grotto Fairy 2", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1802, RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3, "Grotto Fairy 3", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1803, RAND_INF_SFM_FAIRY_GROTTO_FAIRY_4, "Grotto Fairy 4", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1804, RAND_INF_SFM_FAIRY_GROTTO_FAIRY_5, "Grotto Fairy 5", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1805, RAND_INF_SFM_FAIRY_GROTTO_FAIRY_6, "Grotto Fairy 6", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1806, RAND_INF_SFM_FAIRY_GROTTO_FAIRY_7, "Grotto Fairy 7", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1807, RAND_INF_SFM_FAIRY_GROTTO_FAIRY_8, "Grotto Fairy 8", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index eb2d8e73f8e..45dbe146509 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -274,6 +274,7 @@ typedef enum { RCTYPE_OCARINA, // Ocarina locations RCTYPE_BEEHIVE, // Beehives RCTYPE_FISH, + RCTYPE_FAIRY, // Fairies } RandomizerCheckType; typedef enum { RCQUEST_VANILLA, RCQUEST_MQ, RCQUEST_BOTH } RandomizerCheckQuest; @@ -1651,6 +1652,14 @@ typedef enum { RC_ZD_FISH_3, RC_ZD_FISH_4, RC_ZD_FISH_5, + RC_SFM_FAIRY_GROTTO_FAIRY_1, + RC_SFM_FAIRY_GROTTO_FAIRY_2, + RC_SFM_FAIRY_GROTTO_FAIRY_3, + RC_SFM_FAIRY_GROTTO_FAIRY_4, + RC_SFM_FAIRY_GROTTO_FAIRY_5, + RC_SFM_FAIRY_GROTTO_FAIRY_6, + RC_SFM_FAIRY_GROTTO_FAIRY_7, + RC_SFM_FAIRY_GROTTO_FAIRY_8, RC_MAX } RandomizerCheck; @@ -3636,6 +3645,8 @@ typedef enum { RHT_YOUR_POCKET, RHT_DUNGEON_ORDINARY, RHT_DUNGEON_MASTERFUL, + // Fairy Shuffle + RHT_SFM_FAIRY_GROTTO_FAIRY, RHT_MAX } RandomizerHintTextKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 20aab303209..f56d19355c2 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -306,6 +306,15 @@ typedef enum { RAND_INF_CHILD_TRADES_MASK_ZORA, RAND_INF_CHILD_TRADES_MASK_GERUDO, RAND_INF_CHILD_TRADES_MASK_TRUTH, + + 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, // 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, diff --git a/soh/soh/Enhancements/randomizer/static_data.h b/soh/soh/Enhancements/randomizer/static_data.h index 44e1ff1ff84..919ce3f57d8 100644 --- a/soh/soh/Enhancements/randomizer/static_data.h +++ b/soh/soh/Enhancements/randomizer/static_data.h @@ -43,6 +43,7 @@ class StaticData { static std::vector staticHintLocations; static std::vector pondFishLocations; static std::vector overworldFishLocations; + static std::vector overworldFairyLocations; static std::array, 17> randomizerFishingPondFish; static std::unordered_map randomizerGrottoFishMap; static std::vector oldVerHintOrder; From 8d13e1d754eaa3250c93c629ab206cbdd89f270e Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 5 Sep 2024 01:09:07 -0700 Subject: [PATCH 32/54] Make randomized fairies collectible --- .../game-interactor/GameInteractor.h | 2 ++ .../Enhancements/randomizer/fairy_shuffle.cpp | 8 +++++++- soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c | 20 ++++++++++--------- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index cc79a9a5208..5c6cecc90d1 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -416,6 +416,8 @@ typedef enum { // Opt: *EnElf VB_SPAWN_FAIRY_GROUP, + // Opt: *EnElf + VB_FAIRY_HEAL, } GIVanillaBehavior; #ifdef __cplusplus diff --git a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp index 32bb489445c..44dbc58ef3d 100644 --- a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp +++ b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp @@ -26,13 +26,19 @@ void FairyOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void* opt enElf->actor.world.pos.y - 30.0f, enElf->actor.world.pos.z, 0, 0, 0, FAIRY_HEAL, true); int32_t params = (grottoId << 8) | index; Rando::Location* location = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(ACTOR_EN_ELF, gPlayState->sceneNum, params); - if (location != NULL && location->GetRandomizerCheck() != RC_UNKNOWN_CHECK) { + if (location != NULL && location->GetRandomizerCheck() != RC_UNKNOWN_CHECK && !Flags_GetRandomizerInf(location->GetCollectionCheck().flag)) { GetItemEntry item = Rando::Context::GetInstance()->GetFinalGIEntry(location->GetRandomizerCheck(), true, GI_FAIRY); newFairy->sohFairyIdentity = { static_cast(location->GetCollectionCheck().flag), item }; newFairy->actor.draw = (ActorFunc)FairyDrawRandomizedItem; } } *should = false; + } else if (id == VB_FAIRY_HEAL) { + EnElf* enElf = static_cast(optionalArg); + if (enElf->sohFairyIdentity.randomizerInf != RAND_INF_MAX) { + Flags_SetRandomizerInf(enElf->sohFairyIdentity.randomizerInf); + *should = false; + } } } diff --git a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c index af16aa7b53e..32d1196f8a1 100644 --- a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c +++ b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c @@ -634,21 +634,23 @@ void func_80A0329C(EnElf* this, PlayState* play) { if ((heightDiff > 0.0f) && (heightDiff < 60.0f)) { if (!func_80A01F90(&this->actor.world.pos, &refActor->actor.world.pos, 10.0f)) { - if (CVarGetInteger(CVAR_ENHANCEMENT("FairyEffect"), 0) && !(this->fairyFlags & FAIRY_FLAG_BIG)) - { - if (CVarGetInteger(CVAR_ENHANCEMENT("FairyPercentRestore"), 0)) + if (GameInteractor_Should(VB_FAIRY_HEAL, true, this)) { + if (CVarGetInteger(CVAR_ENHANCEMENT("FairyEffect"), 0) && !(this->fairyFlags & FAIRY_FLAG_BIG)) { - Health_ChangeBy(play, (gSaveContext.healthCapacity * CVarGetInteger(CVAR_ENHANCEMENT("FairyHealth"), 100) / 100 + 15) / 16 * 16); + if (CVarGetInteger(CVAR_ENHANCEMENT("FairyPercentRestore"), 0)) + { + Health_ChangeBy(play, (gSaveContext.healthCapacity * CVarGetInteger(CVAR_ENHANCEMENT("FairyHealth"), 100) / 100 + 15) / 16 * 16); + } + else + { + Health_ChangeBy(play, CVarGetInteger(CVAR_ENHANCEMENT("FairyHealth"), 8) * 16); + } } else { - Health_ChangeBy(play, CVarGetInteger(CVAR_ENHANCEMENT("FairyHealth"), 8) * 16); + Health_ChangeBy(play, 128); } } - else - { - Health_ChangeBy(play, 128); - } if (this->fairyFlags & FAIRY_FLAG_BIG) { Magic_Fill(play); } From 3c9bc5f907d229e35780b349abef8f3b344bc76b Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 5 Sep 2024 01:26:38 -0700 Subject: [PATCH 33/54] VBify fairy healing customization --- soh/soh/Enhancements/mods.cpp | 24 +++++++++++++++++++ soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c | 16 +------------ 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 8b3adca0f35..36b1a559420 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -34,6 +34,7 @@ #include "src/overlays/actors/ovl_Door_Shutter/z_door_shutter.h" #include "src/overlays/actors/ovl_Door_Gerudo/z_door_gerudo.h" #include "src/overlays/actors/ovl_En_Door/z_en_door.h" +#include "src/overlays/actors/ovl_En_Elf/z_en_elf.h" #include "objects/object_link_boy/object_link_boy.h" #include "objects/object_link_child/object_link_child.h" @@ -1778,6 +1779,28 @@ void RegisterSkeletonKey() { }); } +#define FAIRY_FLAG_BIG (1 << 9) +void RegisterFairyCustomization() { + GameInteractor::Instance->RegisterGameHookForID(VB_FAIRY_HEAL, [](GIVanillaBehavior id, bool* should, void* refActor) { + EnElf* enElf = static_cast(refActor); + // Don't trigger if fairy is shuffled + if (!IS_RANDO || !OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_FAIRIES) || enElf->sohFairyIdentity.randomizerInf == RAND_INF_MAX) { + if (CVarGetInteger(CVAR_ENHANCEMENT("FairyEffect"), 0) && !(enElf->fairyFlags & FAIRY_FLAG_BIG)) + { + if (CVarGetInteger(CVAR_ENHANCEMENT("FairyPercentRestore"), 0)) + { + Health_ChangeBy(gPlayState, (gSaveContext.healthCapacity * CVarGetInteger(CVAR_ENHANCEMENT("FairyHealth"), 100) / 100 + 15) / 16 * 16); + } + else + { + Health_ChangeBy(gPlayState, CVarGetInteger(CVAR_ENHANCEMENT("FairyHealth"), 8) * 16); + } + *should = false; + } + } + }); +} + void InitMods() { RandomizerRegisterHooks(); TimeSaverRegisterHooks(); @@ -1828,4 +1851,5 @@ void InitMods() { RegisterHurtContainerModeHandler(); RegisterPauseMenuHooks(); RegisterSkeletonKey(); + RegisterFairyCustomization(); } diff --git a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c index 32d1196f8a1..9574b60e6ee 100644 --- a/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c +++ b/soh/src/overlays/actors/ovl_En_Elf/z_en_elf.c @@ -635,21 +635,7 @@ void func_80A0329C(EnElf* this, PlayState* play) { if ((heightDiff > 0.0f) && (heightDiff < 60.0f)) { if (!func_80A01F90(&this->actor.world.pos, &refActor->actor.world.pos, 10.0f)) { if (GameInteractor_Should(VB_FAIRY_HEAL, true, this)) { - if (CVarGetInteger(CVAR_ENHANCEMENT("FairyEffect"), 0) && !(this->fairyFlags & FAIRY_FLAG_BIG)) - { - if (CVarGetInteger(CVAR_ENHANCEMENT("FairyPercentRestore"), 0)) - { - Health_ChangeBy(play, (gSaveContext.healthCapacity * CVarGetInteger(CVAR_ENHANCEMENT("FairyHealth"), 100) / 100 + 15) / 16 * 16); - } - else - { - Health_ChangeBy(play, CVarGetInteger(CVAR_ENHANCEMENT("FairyHealth"), 8) * 16); - } - } - else - { - Health_ChangeBy(play, 128); - } + Health_ChangeBy(play, 128); } if (this->fairyFlags & FAIRY_FLAG_BIG) { Magic_Fill(play); From 0e5c64b4cfb371e38e8202fd42d83130be40adc4 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 5 Sep 2024 16:20:09 -0700 Subject: [PATCH 34/54] Add remaining grotto fairies --- .../location_access/locacc_gerudo_valley.cpp | 12 ++- .../location_access/locacc_hyrule_field.cpp | 12 ++- .../location_access/locacc_zoras_domain.cpp | 24 ++++- .../Enhancements/randomizer/location_list.cpp | 96 +++++++++++++++++++ .../Enhancements/randomizer/randomizerTypes.h | 36 +++++++ .../Enhancements/randomizer/randomizer_inf.h | 32 +++++++ 6 files changed, 208 insertions(+), 4 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp index 5913e2d3b37..a21cef7c2fb 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp @@ -130,7 +130,17 @@ void AreaTable_Init_GerudoValley() { areaTable[RR_GF_STORMS_GROTTO] = Area("GF Storms Grotto", "GF Storms Grotto", RA_NONE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->FreeFairies, {[]{return true;}}), - }, {}, { + }, { + //Locations + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_1, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_2, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_3, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_4, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_5, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_6, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_7, true), + LOCATION(RC_GF_FAIRY_GROTTO_FAIRY_8, true), + }, { //Exits Entrance(RR_GERUDO_FORTRESS, {[]{return true;}}), }); diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp index 860b90e8b80..2d6de46924f 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp @@ -88,7 +88,17 @@ void AreaTable_Init_HyruleField() { areaTable[RR_HF_FAIRY_GROTTO] = Area("HF Fairy Grotto", "HF Fairy Grotto", RA_NONE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->FreeFairies, {[]{return true;}}), - }, {}, { + }, { + //Locations + LOCATION(RC_HF_FAIRY_GROTTO_FAIRY_1, true), + LOCATION(RC_HF_FAIRY_GROTTO_FAIRY_2, true), + LOCATION(RC_HF_FAIRY_GROTTO_FAIRY_3, true), + LOCATION(RC_HF_FAIRY_GROTTO_FAIRY_4, true), + LOCATION(RC_HF_FAIRY_GROTTO_FAIRY_5, true), + LOCATION(RC_HF_FAIRY_GROTTO_FAIRY_6, true), + LOCATION(RC_HF_FAIRY_GROTTO_FAIRY_7, true), + LOCATION(RC_HF_FAIRY_GROTTO_FAIRY_8, true), + }, { //Exits Entrance(RR_HYRULE_FIELD, {[]{return true;}}), }); diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp index 49a76414718..a9be45b3a82 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp @@ -67,7 +67,17 @@ void AreaTable_Init_ZorasDomain() { areaTable[RR_ZR_FAIRY_GROTTO] = Area("ZR Fairy Grotto", "ZR Fairy Grotto", RA_NONE, NO_DAY_NIGHT_CYCLE, { //Event EventAccess(&logic->FreeFairies, {[]{return true;}}), - }, {}, { + }, { + //Locations + LOCATION(RC_ZR_FAIRY_GROTTO_FAIRY_1, true), + LOCATION(RC_ZR_FAIRY_GROTTO_FAIRY_2, true), + LOCATION(RC_ZR_FAIRY_GROTTO_FAIRY_3, true), + LOCATION(RC_ZR_FAIRY_GROTTO_FAIRY_4, true), + LOCATION(RC_ZR_FAIRY_GROTTO_FAIRY_5, true), + LOCATION(RC_ZR_FAIRY_GROTTO_FAIRY_6, true), + LOCATION(RC_ZR_FAIRY_GROTTO_FAIRY_7, true), + LOCATION(RC_ZR_FAIRY_GROTTO_FAIRY_8, true), + }, { //Exits Entrance(RR_ZORAS_RIVER, {[]{return true;}}), }); @@ -142,7 +152,17 @@ void AreaTable_Init_ZorasDomain() { areaTable[RR_ZD_STORMS_GROTTO] = Area("ZD Storms Grotto", "ZD Storms Grotto", RA_NONE, NO_DAY_NIGHT_CYCLE, { //Events EventAccess(&logic->FreeFairies, {[]{return true;}}), - }, {}, { + }, { + //Locations + LOCATION(RC_ZD_FAIRY_GROTTO_FAIRY_1, true), + LOCATION(RC_ZD_FAIRY_GROTTO_FAIRY_2, true), + LOCATION(RC_ZD_FAIRY_GROTTO_FAIRY_3, true), + LOCATION(RC_ZD_FAIRY_GROTTO_FAIRY_4, true), + LOCATION(RC_ZD_FAIRY_GROTTO_FAIRY_5, true), + LOCATION(RC_ZD_FAIRY_GROTTO_FAIRY_6, true), + LOCATION(RC_ZD_FAIRY_GROTTO_FAIRY_7, true), + LOCATION(RC_ZD_FAIRY_GROTTO_FAIRY_8, true), + }, { //Exits Entrance(RR_ZORAS_DOMAIN, {[]{return true;}}), }); diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 4700c01f732..5aef2eff27f 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -513,6 +513,38 @@ std::vector Rando::StaticData::overworldLocations = { RC_SFM_FAIRY_GROTTO_FAIRY_6, RC_SFM_FAIRY_GROTTO_FAIRY_7, RC_SFM_FAIRY_GROTTO_FAIRY_8, + RC_ZR_FAIRY_GROTTO_FAIRY_1, + RC_ZR_FAIRY_GROTTO_FAIRY_2, + RC_ZR_FAIRY_GROTTO_FAIRY_3, + RC_ZR_FAIRY_GROTTO_FAIRY_4, + RC_ZR_FAIRY_GROTTO_FAIRY_5, + RC_ZR_FAIRY_GROTTO_FAIRY_6, + RC_ZR_FAIRY_GROTTO_FAIRY_7, + RC_ZR_FAIRY_GROTTO_FAIRY_8, + RC_HF_FAIRY_GROTTO_FAIRY_1, + RC_HF_FAIRY_GROTTO_FAIRY_2, + RC_HF_FAIRY_GROTTO_FAIRY_3, + RC_HF_FAIRY_GROTTO_FAIRY_4, + RC_HF_FAIRY_GROTTO_FAIRY_5, + RC_HF_FAIRY_GROTTO_FAIRY_6, + RC_HF_FAIRY_GROTTO_FAIRY_7, + RC_HF_FAIRY_GROTTO_FAIRY_8, + RC_ZD_FAIRY_GROTTO_FAIRY_1, + RC_ZD_FAIRY_GROTTO_FAIRY_2, + RC_ZD_FAIRY_GROTTO_FAIRY_3, + RC_ZD_FAIRY_GROTTO_FAIRY_4, + RC_ZD_FAIRY_GROTTO_FAIRY_5, + RC_ZD_FAIRY_GROTTO_FAIRY_6, + RC_ZD_FAIRY_GROTTO_FAIRY_7, + RC_ZD_FAIRY_GROTTO_FAIRY_8, + RC_GF_FAIRY_GROTTO_FAIRY_1, + RC_GF_FAIRY_GROTTO_FAIRY_2, + RC_GF_FAIRY_GROTTO_FAIRY_3, + RC_GF_FAIRY_GROTTO_FAIRY_4, + RC_GF_FAIRY_GROTTO_FAIRY_5, + RC_GF_FAIRY_GROTTO_FAIRY_6, + RC_GF_FAIRY_GROTTO_FAIRY_7, + RC_GF_FAIRY_GROTTO_FAIRY_8, }; std::vector Rando::StaticData::gossipStoneLocations = { @@ -598,6 +630,38 @@ std::vector Rando::StaticData::overworldFairyLocations = { RC_SFM_FAIRY_GROTTO_FAIRY_6, RC_SFM_FAIRY_GROTTO_FAIRY_7, RC_SFM_FAIRY_GROTTO_FAIRY_8, + RC_ZR_FAIRY_GROTTO_FAIRY_1, + RC_ZR_FAIRY_GROTTO_FAIRY_2, + RC_ZR_FAIRY_GROTTO_FAIRY_3, + RC_ZR_FAIRY_GROTTO_FAIRY_4, + RC_ZR_FAIRY_GROTTO_FAIRY_5, + RC_ZR_FAIRY_GROTTO_FAIRY_6, + RC_ZR_FAIRY_GROTTO_FAIRY_7, + RC_ZR_FAIRY_GROTTO_FAIRY_8, + RC_HF_FAIRY_GROTTO_FAIRY_1, + RC_HF_FAIRY_GROTTO_FAIRY_2, + RC_HF_FAIRY_GROTTO_FAIRY_3, + RC_HF_FAIRY_GROTTO_FAIRY_4, + RC_HF_FAIRY_GROTTO_FAIRY_5, + RC_HF_FAIRY_GROTTO_FAIRY_6, + RC_HF_FAIRY_GROTTO_FAIRY_7, + RC_HF_FAIRY_GROTTO_FAIRY_8, + RC_ZD_FAIRY_GROTTO_FAIRY_1, + RC_ZD_FAIRY_GROTTO_FAIRY_2, + RC_ZD_FAIRY_GROTTO_FAIRY_3, + RC_ZD_FAIRY_GROTTO_FAIRY_4, + RC_ZD_FAIRY_GROTTO_FAIRY_5, + RC_ZD_FAIRY_GROTTO_FAIRY_6, + RC_ZD_FAIRY_GROTTO_FAIRY_7, + RC_ZD_FAIRY_GROTTO_FAIRY_8, + RC_GF_FAIRY_GROTTO_FAIRY_1, + RC_GF_FAIRY_GROTTO_FAIRY_2, + RC_GF_FAIRY_GROTTO_FAIRY_3, + RC_GF_FAIRY_GROTTO_FAIRY_4, + RC_GF_FAIRY_GROTTO_FAIRY_5, + RC_GF_FAIRY_GROTTO_FAIRY_6, + RC_GF_FAIRY_GROTTO_FAIRY_7, + RC_GF_FAIRY_GROTTO_FAIRY_8, }; typedef enum { @@ -1542,6 +1606,38 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1805, RAND_INF_SFM_FAIRY_GROTTO_FAIRY_6, "Grotto Fairy 6", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1806, RAND_INF_SFM_FAIRY_GROTTO_FAIRY_7, "Grotto Fairy 7", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); locationTable[RC_SFM_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_SFM_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_FAIRYS_FOUNTAIN, 0x1807, RAND_INF_SFM_FAIRY_GROTTO_FAIRY_8, "Grotto Fairy 8", RHT_SFM_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0300, RAND_INF_ZR_FAIRY_GROTTO_FAIRY_1, "Grotto Fairy 1", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0301, RAND_INF_ZR_FAIRY_GROTTO_FAIRY_2, "Grotto Fairy 2", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0302, RAND_INF_ZR_FAIRY_GROTTO_FAIRY_3, "Grotto Fairy 3", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0303, RAND_INF_ZR_FAIRY_GROTTO_FAIRY_4, "Grotto Fairy 4", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0304, RAND_INF_ZR_FAIRY_GROTTO_FAIRY_5, "Grotto Fairy 5", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0305, RAND_INF_ZR_FAIRY_GROTTO_FAIRY_6, "Grotto Fairy 6", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0306, RAND_INF_ZR_FAIRY_GROTTO_FAIRY_7, "Grotto Fairy 7", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_ZR_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_FAIRYS_FOUNTAIN, 0x0307, RAND_INF_ZR_FAIRY_GROTTO_FAIRY_8, "Grotto Fairy 8", RHT_ZR_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F00, RAND_INF_HF_FAIRY_GROTTO_FAIRY_1, "Grotto Fairy 1", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F01, RAND_INF_HF_FAIRY_GROTTO_FAIRY_2, "Grotto Fairy 2", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F02, RAND_INF_HF_FAIRY_GROTTO_FAIRY_3, "Grotto Fairy 3", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F03, RAND_INF_HF_FAIRY_GROTTO_FAIRY_4, "Grotto Fairy 4", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F04, RAND_INF_HF_FAIRY_GROTTO_FAIRY_5, "Grotto Fairy 5", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F05, RAND_INF_HF_FAIRY_GROTTO_FAIRY_6, "Grotto Fairy 6", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F06, RAND_INF_HF_FAIRY_GROTTO_FAIRY_7, "Grotto Fairy 7", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_HF_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_FAIRYS_FOUNTAIN, 0x0F07, RAND_INF_HF_FAIRY_GROTTO_FAIRY_8, "Grotto Fairy 8", RHT_HF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C00, RAND_INF_ZD_FAIRY_GROTTO_FAIRY_1, "Grotto Fairy 1", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C01, RAND_INF_ZD_FAIRY_GROTTO_FAIRY_2, "Grotto Fairy 2", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C02, RAND_INF_ZD_FAIRY_GROTTO_FAIRY_3, "Grotto Fairy 3", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C03, RAND_INF_ZD_FAIRY_GROTTO_FAIRY_4, "Grotto Fairy 4", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C04, RAND_INF_ZD_FAIRY_GROTTO_FAIRY_5, "Grotto Fairy 5", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C05, RAND_INF_ZD_FAIRY_GROTTO_FAIRY_6, "Grotto Fairy 6", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C06, RAND_INF_ZD_FAIRY_GROTTO_FAIRY_7, "Grotto Fairy 7", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZD_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_ZD_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_FAIRYS_FOUNTAIN, 0x1C07, RAND_INF_ZD_FAIRY_GROTTO_FAIRY_8, "Grotto Fairy 8", RHT_ZD_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_1] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_1, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D00, RAND_INF_GF_FAIRY_GROTTO_FAIRY_1, "Grotto Fairy 1", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_2] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_2, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D01, RAND_INF_GF_FAIRY_GROTTO_FAIRY_2, "Grotto Fairy 2", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_3] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_3, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D02, RAND_INF_GF_FAIRY_GROTTO_FAIRY_3, "Grotto Fairy 3", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_4] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_4, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D03, RAND_INF_GF_FAIRY_GROTTO_FAIRY_4, "Grotto Fairy 4", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_5] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_5, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D04, RAND_INF_GF_FAIRY_GROTTO_FAIRY_5, "Grotto Fairy 5", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_6] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_6, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D05, RAND_INF_GF_FAIRY_GROTTO_FAIRY_6, "Grotto Fairy 6", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D06, RAND_INF_GF_FAIRY_GROTTO_FAIRY_7, "Grotto Fairy 7", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GF_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D07, RAND_INF_GF_FAIRY_GROTTO_FAIRY_8, "Grotto Fairy 8", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 45dbe146509..87e378617bd 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1660,6 +1660,38 @@ typedef enum { RC_SFM_FAIRY_GROTTO_FAIRY_6, RC_SFM_FAIRY_GROTTO_FAIRY_7, RC_SFM_FAIRY_GROTTO_FAIRY_8, + RC_ZR_FAIRY_GROTTO_FAIRY_1, + RC_ZR_FAIRY_GROTTO_FAIRY_2, + RC_ZR_FAIRY_GROTTO_FAIRY_3, + RC_ZR_FAIRY_GROTTO_FAIRY_4, + RC_ZR_FAIRY_GROTTO_FAIRY_5, + RC_ZR_FAIRY_GROTTO_FAIRY_6, + RC_ZR_FAIRY_GROTTO_FAIRY_7, + RC_ZR_FAIRY_GROTTO_FAIRY_8, + RC_HF_FAIRY_GROTTO_FAIRY_1, + RC_HF_FAIRY_GROTTO_FAIRY_2, + RC_HF_FAIRY_GROTTO_FAIRY_3, + RC_HF_FAIRY_GROTTO_FAIRY_4, + RC_HF_FAIRY_GROTTO_FAIRY_5, + RC_HF_FAIRY_GROTTO_FAIRY_6, + RC_HF_FAIRY_GROTTO_FAIRY_7, + RC_HF_FAIRY_GROTTO_FAIRY_8, + RC_ZD_FAIRY_GROTTO_FAIRY_1, + RC_ZD_FAIRY_GROTTO_FAIRY_2, + RC_ZD_FAIRY_GROTTO_FAIRY_3, + RC_ZD_FAIRY_GROTTO_FAIRY_4, + RC_ZD_FAIRY_GROTTO_FAIRY_5, + RC_ZD_FAIRY_GROTTO_FAIRY_6, + RC_ZD_FAIRY_GROTTO_FAIRY_7, + RC_ZD_FAIRY_GROTTO_FAIRY_8, + RC_GF_FAIRY_GROTTO_FAIRY_1, + RC_GF_FAIRY_GROTTO_FAIRY_2, + RC_GF_FAIRY_GROTTO_FAIRY_3, + RC_GF_FAIRY_GROTTO_FAIRY_4, + RC_GF_FAIRY_GROTTO_FAIRY_5, + RC_GF_FAIRY_GROTTO_FAIRY_6, + RC_GF_FAIRY_GROTTO_FAIRY_7, + RC_GF_FAIRY_GROTTO_FAIRY_8, RC_MAX } RandomizerCheck; @@ -3647,6 +3679,10 @@ typedef enum { RHT_DUNGEON_MASTERFUL, // Fairy Shuffle RHT_SFM_FAIRY_GROTTO_FAIRY, + RHT_ZR_FAIRY_GROTTO_FAIRY, + RHT_HF_FAIRY_GROTTO_FAIRY, + RHT_ZD_FAIRY_GROTTO_FAIRY, + RHT_GF_FAIRY_GROTTO_FAIRY, RHT_MAX } RandomizerHintTextKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index f56d19355c2..c778b7f53d4 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -315,6 +315,38 @@ typedef enum { 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, // 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, From e1df53148724cc6b76dc2facc513b958cfa7ceff Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 5 Sep 2024 16:51:16 -0700 Subject: [PATCH 35/54] Add remaining fairy group spawns --- .../randomizer/3drando/item_pool.cpp | 23 +++++++++++ .../location_access/locacc_ganons_castle.cpp | 16 ++++++++ .../location_access/locacc_kakariko.cpp | 8 ++++ soh/soh/Enhancements/randomizer/dungeon.cpp | 16 ++++++++ .../Enhancements/randomizer/location_list.cpp | 41 +++++++++++++++++++ .../Enhancements/randomizer/randomizerTypes.h | 26 ++++++++++++ .../Enhancements/randomizer/randomizer_inf.h | 24 +++++++++++ 7 files changed, 154 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 3496965feaa..5cd08230bf5 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -1170,10 +1170,33 @@ void GenerateItemPool() { for (auto rc : Rando::StaticData::overworldFairyLocations) { AddItemToMainPool(GetJunkItem()); } + // 8 extra for Ganon's Castle + for (int i = 0; i < 8; i++) { + AddItemToMainPool(GetJunkItem()); + } } else { for (auto rc : Rando::StaticData::overworldFairyLocations) { ctx->PlaceItemInLocation(rc, GetJunkItem(), false, true); } + if (ctx->GetDungeon(Rando::GANONS_CASTLE)->IsMQ()) { + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, GetJunkItem(), false, true); + } else { + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_1, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_2, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_3, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_4, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_5, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_6, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_7, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_8, GetJunkItem(), false, true); + } } //Scrubsanity diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp index 05249def11a..2888a4ed1ca 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp @@ -50,6 +50,14 @@ void AreaTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, logic->CanStunDeku), LOCATION(RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, logic->CanStunDeku), LOCATION(RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, logic->CanStunDeku), + LOCATION(RC_GANONS_CASTLE_SCRUBS_FAIRY_1, true), + LOCATION(RC_GANONS_CASTLE_SCRUBS_FAIRY_2, true), + LOCATION(RC_GANONS_CASTLE_SCRUBS_FAIRY_3, true), + LOCATION(RC_GANONS_CASTLE_SCRUBS_FAIRY_4, true), + LOCATION(RC_GANONS_CASTLE_SCRUBS_FAIRY_5, true), + LOCATION(RC_GANONS_CASTLE_SCRUBS_FAIRY_6, true), + LOCATION(RC_GANONS_CASTLE_SCRUBS_FAIRY_7, true), + LOCATION(RC_GANONS_CASTLE_SCRUBS_FAIRY_8, true), }, {}); areaTable[RR_GANONS_CASTLE_FOREST_TRIAL] = Area("Ganon's Castle Forest Trial", "Ganon's Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { @@ -153,6 +161,14 @@ void AreaTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, logic->CanStunDeku), LOCATION(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, logic->CanStunDeku), LOCATION(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, logic->CanStunDeku), + LOCATION(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, true), + LOCATION(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, true), + LOCATION(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, true), + LOCATION(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, true), + LOCATION(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, true), + LOCATION(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, true), + LOCATION(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, true), + LOCATION(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, true), }, {}); areaTable[RR_GANONS_CASTLE_MQ_FOREST_TRIAL] = Area("Ganon's Castle MQ Forest Trial", "Ganons Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp index b0452e41938..45fa4a1861c 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp @@ -232,6 +232,14 @@ void AreaTable_Init_Kakariko() { //Locations LOCATION(RC_GRAVEYARD_SHIELD_GRAVE_CHEST, true), //Free Fairies + LOCATION(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, logic->CanBlastOrSmash), + LOCATION(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, logic->CanBlastOrSmash), + LOCATION(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_3, logic->CanBlastOrSmash), + LOCATION(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_4, logic->CanBlastOrSmash), + LOCATION(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_5, logic->CanBlastOrSmash), + LOCATION(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, logic->CanBlastOrSmash), + LOCATION(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, logic->CanBlastOrSmash), + LOCATION(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, logic->CanBlastOrSmash), }, { //Exits Entrance(RR_THE_GRAVEYARD, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index 0f799b03646..efc1904070c 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -684,6 +684,14 @@ Dungeons::Dungeons() { RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, + RC_GANONS_CASTLE_SCRUBS_FAIRY_1, + RC_GANONS_CASTLE_SCRUBS_FAIRY_2, + RC_GANONS_CASTLE_SCRUBS_FAIRY_3, + RC_GANONS_CASTLE_SCRUBS_FAIRY_4, + RC_GANONS_CASTLE_SCRUBS_FAIRY_5, + RC_GANONS_CASTLE_SCRUBS_FAIRY_6, + RC_GANONS_CASTLE_SCRUBS_FAIRY_7, + RC_GANONS_CASTLE_SCRUBS_FAIRY_8, }, { // MQ Locations @@ -705,6 +713,14 @@ Dungeons::Dungeons() { RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, }, { // Shared Locations diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 5aef2eff27f..e931591b417 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -545,6 +545,14 @@ std::vector Rando::StaticData::overworldLocations = { RC_GF_FAIRY_GROTTO_FAIRY_6, RC_GF_FAIRY_GROTTO_FAIRY_7, RC_GF_FAIRY_GROTTO_FAIRY_8, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_3, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_4, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_5, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, }; std::vector Rando::StaticData::gossipStoneLocations = { @@ -662,6 +670,14 @@ std::vector Rando::StaticData::overworldFairyLocations = { RC_GF_FAIRY_GROTTO_FAIRY_6, RC_GF_FAIRY_GROTTO_FAIRY_7, RC_GF_FAIRY_GROTTO_FAIRY_8, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_3, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_4, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_5, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, }; typedef enum { @@ -1639,6 +1655,31 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_GF_FAIRY_GROTTO_FAIRY_7] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_7, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D06, RAND_INF_GF_FAIRY_GROTTO_FAIRY_7, "Grotto Fairy 7", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); locationTable[RC_GF_FAIRY_GROTTO_FAIRY_8] = Location::Fairy(RC_GF_FAIRY_GROTTO_FAIRY_8, RCQUEST_BOTH, RCAREA_GERUDO_FORTRESS, SCENE_FAIRYS_FOUNTAIN, 0x1D07, RAND_INF_GF_FAIRY_GROTTO_FAIRY_8, "Grotto Fairy 8", RHT_GF_FAIRY_GROTTO_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_1] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x00, RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, "Shield Grave Fairy 1", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_2] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x01, RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, "Shield Grave Fairy 2", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_3] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x02, RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_3, "Shield Grave Fairy 3", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_4] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_4, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x03, RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_4, "Shield Grave Fairy 4", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_5] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_5, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x04, RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_5, "Shield Grave Fairy 5", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x05, RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, "Shield Grave Fairy 6", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x06, RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, "Shield Grave Fairy 7", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8] = Location::Fairy(RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVE_WITH_FAIRYS_FOUNTAIN, 0x07, RAND_INF_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, "Shield Grave Fairy 8", RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_1] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x00, RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_1, "Scrubs Fairy 1", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_2] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x01, RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_2, "Scrubs Fairy 2", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_3] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_3, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x02, RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_3, "Scrubs Fairy 3", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_4] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_4, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x03, RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_4, "Scrubs Fairy 4", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_5] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_5, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x04, RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_5, "Scrubs Fairy 5", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_6] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_6, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x05, RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_6, "Scrubs Fairy 6", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_7] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_7, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x06, RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_7, "Scrubs Fairy 7", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_SCRUBS_FAIRY_8] = Location::Fairy(RC_GANONS_CASTLE_SCRUBS_FAIRY_8, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x07, RAND_INF_GANONS_CASTLE_SCRUBS_FAIRY_8, "Scrubs Fairy 8", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x00, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, "MQ Scrubs Fairy 1", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x01, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, "MQ Scrubs Fairy 2", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x02, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, "MQ Scrubs Fairy 3", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x03, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, "MQ Scrubs Fairy 4", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x04, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, "MQ Scrubs Fairy 5", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x05, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, "MQ Scrubs Fairy 6", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x06, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, "MQ Scrubs Fairy 7", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x07, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, "MQ Scrubs Fairy 8", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); locationTable[RC_DMT_GOSSIP_STONE] = Location::HintStone(RC_DMT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 14340, 0x04, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 87e378617bd..d34a700e3b5 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1692,6 +1692,30 @@ typedef enum { RC_GF_FAIRY_GROTTO_FAIRY_6, RC_GF_FAIRY_GROTTO_FAIRY_7, RC_GF_FAIRY_GROTTO_FAIRY_8, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_1, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_2, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_3, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_4, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_5, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, + RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, + RC_GANONS_CASTLE_SCRUBS_FAIRY_1, + RC_GANONS_CASTLE_SCRUBS_FAIRY_2, + RC_GANONS_CASTLE_SCRUBS_FAIRY_3, + RC_GANONS_CASTLE_SCRUBS_FAIRY_4, + RC_GANONS_CASTLE_SCRUBS_FAIRY_5, + RC_GANONS_CASTLE_SCRUBS_FAIRY_6, + RC_GANONS_CASTLE_SCRUBS_FAIRY_7, + RC_GANONS_CASTLE_SCRUBS_FAIRY_8, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, + RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, RC_MAX } RandomizerCheck; @@ -3683,6 +3707,8 @@ typedef enum { RHT_HF_FAIRY_GROTTO_FAIRY, RHT_ZD_FAIRY_GROTTO_FAIRY, RHT_GF_FAIRY_GROTTO_FAIRY, + RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, + RHT_GANONS_CASTLE_SCRUBS_FAIRY, RHT_MAX } RandomizerHintTextKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index c778b7f53d4..e231a2a3179 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -347,6 +347,30 @@ typedef enum { 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, // 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, From e1d1557eec9696f010986d8d506cf007c7ade91a Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 5 Sep 2024 17:37:54 -0700 Subject: [PATCH 36/54] Override bean sprouts spawning fairies --- .../game-interactor/GameInteractor.h | 3 ++ .../Enhancements/randomizer/fairy_shuffle.cpp | 47 ++++++++++++++----- .../overlays/actors/ovl_Obj_Bean/z_obj_bean.c | 7 ++- 3 files changed, 42 insertions(+), 15 deletions(-) diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index 5c6cecc90d1..81db1ce640b 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -414,10 +414,13 @@ typedef enum { VB_PHANTOM_GANON_DEATH_SCENE, VB_NABOORU_KNUCKLE_DEATH_SCENE, + /*** Fairy Shuffle ***/ // Opt: *EnElf VB_SPAWN_FAIRY_GROUP, // Opt: *EnElf VB_FAIRY_HEAL, + // Opt: *ObjBean + VB_BEAN_SPAWN_FAIRIES, } GIVanillaBehavior; #ifdef __cplusplus diff --git a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp index 44dbc58ef3d..e65e3f75505 100644 --- a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp +++ b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp @@ -3,7 +3,9 @@ #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" +#define FAIRY_FLAG_TIMED (1 << 8) void FairyDrawRandomizedItem(EnElf* enElf, PlayState* play) { GetItemEntry randoGetItem = enElf->sohFairyIdentity.itemEntry; @@ -17,28 +19,47 @@ void FairyDrawRandomizedItem(EnElf* enElf, PlayState* play) { Matrix_Pop(); } +bool FairyInitialise(EnElf* fairy, int32_t params) { + Rando::Location* location = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(ACTOR_EN_ELF, gPlayState->sceneNum, params); + RandomizerInf flag = static_cast(location->GetCollectionCheck().flag); + if (location->GetRandomizerCheck() != RC_UNKNOWN_CHECK && !Flags_GetRandomizerInf(flag)) { + GetItemEntry item = Rando::Context::GetInstance()->GetFinalGIEntry(location->GetRandomizerCheck(), true, GI_FAIRY); + fairy->sohFairyIdentity = { flag, item }; + fairy->actor.draw = (ActorFunc)FairyDrawRandomizedItem; + return true; + } else { + return false; + } +} + void FairyOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void* optionalArg) { - if (id == VB_SPAWN_FAIRY_GROUP) { + if (id == VB_FAIRY_HEAL) { + EnElf* enElf = static_cast(optionalArg); + if (enElf->sohFairyIdentity.randomizerInf != RAND_INF_MAX) { + Flags_SetRandomizerInf(enElf->sohFairyIdentity.randomizerInf); + *should = false; + } + } else if (id == VB_SPAWN_FAIRY_GROUP) { EnElf* enElf = static_cast(optionalArg); s16 grottoId = (gPlayState->sceneNum == SCENE_FAIRYS_FOUNTAIN) ? Grotto_CurrentGrotto() : 0; for (s16 index = 0; index < 8; index++) { EnElf* newFairy = (EnElf*)Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_ELF, enElf->actor.world.pos.x, enElf->actor.world.pos.y - 30.0f, enElf->actor.world.pos.z, 0, 0, 0, FAIRY_HEAL, true); - int32_t params = (grottoId << 8) | index; - Rando::Location* location = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(ACTOR_EN_ELF, gPlayState->sceneNum, params); - if (location != NULL && location->GetRandomizerCheck() != RC_UNKNOWN_CHECK && !Flags_GetRandomizerInf(location->GetCollectionCheck().flag)) { - GetItemEntry item = Rando::Context::GetInstance()->GetFinalGIEntry(location->GetRandomizerCheck(), true, GI_FAIRY); - newFairy->sohFairyIdentity = { static_cast(location->GetCollectionCheck().flag), item }; - newFairy->actor.draw = (ActorFunc)FairyDrawRandomizedItem; - } + + FairyInitialise(newFairy, (grottoId << 8) | index); } *should = false; - } else if (id == VB_FAIRY_HEAL) { - EnElf* enElf = static_cast(optionalArg); - if (enElf->sohFairyIdentity.randomizerInf != RAND_INF_MAX) { - Flags_SetRandomizerInf(enElf->sohFairyIdentity.randomizerInf); - *should = false; + } else if (id == VB_BEAN_SPAWN_FAIRIES) { + ObjBean* objBean = static_cast(optionalArg); + for (s16 index = 0; index < 3; index++) { + EnElf* newFairy = (EnElf*)Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_ELF, objBean->dyna.actor.world.pos.x, + objBean->dyna.actor.world.pos.y + 15.0f, objBean->dyna.actor.world.pos.z, 0, 0, 0, FAIRY_HEAL, true); + + if (!FairyInitialise(newFairy, ((objBean->dyna.actor.params & 0x3F) << 8) | index)) { + newFairy->fairyFlags |= FAIRY_FLAG_TIMED; + } } + *should = false; } } diff --git a/soh/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c b/soh/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c index c57eb7b1d39..a8e5fbcb295 100644 --- a/soh/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c +++ b/soh/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c @@ -8,6 +8,7 @@ #include "objects/object_mamenoki/object_mamenoki.h" #include "objects/gameplay_keep/gameplay_keep.h" #include "vt.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS ACTOR_FLAG_IGNORE_POINTLIGHTS @@ -701,8 +702,10 @@ void ObjBean_GrowWaterPhase3(ObjBean* this, PlayState* play) { itemDropPos.x = this->dyna.actor.world.pos.x; itemDropPos.y = this->dyna.actor.world.pos.y - 25.0f; itemDropPos.z = this->dyna.actor.world.pos.z; - for (i = 0; i < 3; i++) { - Item_DropCollectible(play, &itemDropPos, ITEM00_FLEXIBLE); + if (GameInteractor_Should(VB_BEAN_SPAWN_FAIRIES, true, this)) { + for (i = 0; i < 3; i++) { + Item_DropCollectible(play, &itemDropPos, ITEM00_FLEXIBLE); + } } this->stateFlags |= BEAN_STATE_BEEN_WATERED; Audio_PlayActorSound2(&this->dyna.actor, NA_SE_EV_BUTTERFRY_TO_FAIRY); From 96055ff54535b6ced247c593a6c297a5ad400436 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 5 Sep 2024 19:23:13 -0700 Subject: [PATCH 37/54] Define bean sprout fairy checks --- .../Enhancements/randomizer/location_list.cpp | 63 +++++++++++++++++++ .../Enhancements/randomizer/randomizerTypes.h | 40 ++++++++++++ .../Enhancements/randomizer/randomizer_inf.h | 31 +++++++++ 3 files changed, 134 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index e931591b417..8d0c484f4dd 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -553,6 +553,37 @@ std::vector Rando::StaticData::overworldLocations = { RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, + + RC_ZR_BEAN_SPROUT_FAIRY_1, + RC_ZR_BEAN_SPROUT_FAIRY_2, + RC_ZR_BEAN_SPROUT_FAIRY_3, + RC_KF_BEAN_SPROUT_FAIRY_1, + RC_KF_BEAN_SPROUT_FAIRY_2, + RC_KF_BEAN_SPROUT_FAIRY_3, + RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, + RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, + RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, + RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, + RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, + RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, + RC_LH_BEAN_SPROUT_FAIRY_1, + RC_LH_BEAN_SPROUT_FAIRY_2, + RC_LH_BEAN_SPROUT_FAIRY_3, + RC_GV_BEAN_SPROUT_FAIRY_1, + RC_GV_BEAN_SPROUT_FAIRY_2, + RC_GV_BEAN_SPROUT_FAIRY_3, + RC_COLOSSUS_BEAN_SPROUT_FAIRY_1, + RC_COLOSSUS_BEAN_SPROUT_FAIRY_2, + RC_COLOSSUS_BEAN_SPROUT_FAIRY_3, + RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1, + RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2, + RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3, + RC_DMC_BEAN_SPROUT_FAIRY_1, + RC_DMC_BEAN_SPROUT_FAIRY_2, + RC_DMC_BEAN_SPROUT_FAIRY_3, + RC_DMT_BEAN_SPROUT_FAIRY_1, + RC_DMT_BEAN_SPROUT_FAIRY_2, + RC_DMT_BEAN_SPROUT_FAIRY_3, }; std::vector Rando::StaticData::gossipStoneLocations = { @@ -1680,6 +1711,38 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x06, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, "MQ Scrubs Fairy 7", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x07, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, "MQ Scrubs Fairy 8", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + + locationTable[RC_ZR_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0300, RAND_INF_ZR_BEAN_SPROUT_FAIRY_1, "Bean Sprout Fairy 1", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0301, RAND_INF_ZR_BEAN_SPROUT_FAIRY_2, "Bean Sprout Fairy 2", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0302, RAND_INF_ZR_BEAN_SPROUT_FAIRY_3, "Bean Sprout Fairy 3", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_KF_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_KF_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 0x0900, RAND_INF_KF_BEAN_SPROUT_FAIRY_1, "Bean Sprout Fairy 1", RHT_KF_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_KF_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 0x0901, RAND_INF_KF_BEAN_SPROUT_FAIRY_2, "Bean Sprout Fairy 2", RHT_KF_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_KF_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, 0x0902, RAND_INF_KF_BEAN_SPROUT_FAIRY_3, "Bean Sprout Fairy 3", RHT_KF_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x0400, RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, "Bean Sprout Near Bridge Fairy 1", RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x0401, RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, "Bean Sprout Near Bridge Fairy 2", RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x0402, RAND_INF_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, "Bean Sprout Near Bridge Fairy 3", RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x1200, RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, "Bean Sprout Near Theatre Fairy 1", RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x1201, RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, "Bean Sprout Near Theatre Fairy 2", RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3] = Location::Fairy(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, 0x1202, RAND_INF_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, "Bean Sprout Near Theatre Fairy 3", RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LH_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_LH_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 0x0100, RAND_INF_LH_BEAN_SPROUT_FAIRY_1, "Bean Sprout Fairy 1", RHT_LH_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_LH_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 0x0101, RAND_INF_LH_BEAN_SPROUT_FAIRY_2, "Bean Sprout Fairy 2", RHT_LH_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_LH_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, 0x0102, RAND_INF_LH_BEAN_SPROUT_FAIRY_3, "Bean Sprout Fairy 3", RHT_LH_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_GV_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_GV_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 0x0300, RAND_INF_GV_BEAN_SPROUT_FAIRY_1, "Bean Sprout Fairy 1", RHT_GV_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GV_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_GV_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 0x0301, RAND_INF_GV_BEAN_SPROUT_FAIRY_2, "Bean Sprout Fairy 2", RHT_GV_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GV_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_GV_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, 0x0302, RAND_INF_GV_BEAN_SPROUT_FAIRY_3, "Bean Sprout Fairy 3", RHT_GV_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_COLOSSUS_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_COLOSSUS_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x1800, RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_1, "Bean Sprout Fairy 1", RHT_COLOSSUS_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_COLOSSUS_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_COLOSSUS_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x1801, RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_2, "Bean Sprout Fairy 2", RHT_COLOSSUS_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_COLOSSUS_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_COLOSSUS_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x1802, RAND_INF_COLOSSUS_BEAN_SPROUT_FAIRY_3, "Bean Sprout Fairy 3", RHT_COLOSSUS_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 0x0300, RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_1, "Bean Sprout Fairy 1", RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 0x0301, RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_2, "Bean Sprout Fairy 2", RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, 0x0302, RAND_INF_GRAVEYARD_BEAN_SPROUT_FAIRY_3, "Bean Sprout Fairy 3", RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_DMC_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_DMC_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 0x0300, RAND_INF_DMC_BEAN_SPROUT_FAIRY_1, "Bean Sprout Fairy 1", RHT_DMC_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_DMC_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 0x0301, RAND_INF_DMC_BEAN_SPROUT_FAIRY_2, "Bean Sprout Fairy 2", RHT_DMC_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_DMC_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 0x0302, RAND_INF_DMC_BEAN_SPROUT_FAIRY_3, "Bean Sprout Fairy 3", RHT_DMC_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0600, RAND_INF_DMT_BEAN_SPROUT_FAIRY_1, "Bean Sprout Fairy 1", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0601, RAND_INF_DMT_BEAN_SPROUT_FAIRY_2, "Bean Sprout Fairy 2", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0602, RAND_INF_DMT_BEAN_SPROUT_FAIRY_3, "Bean Sprout Fairy 3", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); locationTable[RC_DMT_GOSSIP_STONE] = Location::HintStone(RC_DMT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 14340, 0x04, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index d34a700e3b5..bb1a37c9c94 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1716,6 +1716,36 @@ typedef enum { RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, + RC_ZR_BEAN_SPROUT_FAIRY_1, + RC_ZR_BEAN_SPROUT_FAIRY_2, + RC_ZR_BEAN_SPROUT_FAIRY_3, + RC_KF_BEAN_SPROUT_FAIRY_1, + RC_KF_BEAN_SPROUT_FAIRY_2, + RC_KF_BEAN_SPROUT_FAIRY_3, + RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, + RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, + RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, + RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, + RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, + RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, + RC_LH_BEAN_SPROUT_FAIRY_1, + RC_LH_BEAN_SPROUT_FAIRY_2, + RC_LH_BEAN_SPROUT_FAIRY_3, + RC_GV_BEAN_SPROUT_FAIRY_1, + RC_GV_BEAN_SPROUT_FAIRY_2, + RC_GV_BEAN_SPROUT_FAIRY_3, + RC_COLOSSUS_BEAN_SPROUT_FAIRY_1, + RC_COLOSSUS_BEAN_SPROUT_FAIRY_2, + RC_COLOSSUS_BEAN_SPROUT_FAIRY_3, + RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1, + RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2, + RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3, + RC_DMC_BEAN_SPROUT_FAIRY_1, + RC_DMC_BEAN_SPROUT_FAIRY_2, + RC_DMC_BEAN_SPROUT_FAIRY_3, + RC_DMT_BEAN_SPROUT_FAIRY_1, + RC_DMT_BEAN_SPROUT_FAIRY_2, + RC_DMT_BEAN_SPROUT_FAIRY_3, RC_MAX } RandomizerCheck; @@ -3709,6 +3739,16 @@ typedef enum { RHT_GF_FAIRY_GROTTO_FAIRY, RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, RHT_GANONS_CASTLE_SCRUBS_FAIRY, + RHT_ZR_BEAN_SPROUT_FAIRY, + RHT_KF_BEAN_SPROUT_FAIRY, + RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, + RHT_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY, + RHT_LH_BEAN_SPROUT_FAIRY, + RHT_GV_BEAN_SPROUT_FAIRY, + RHT_COLOSSUS_BEAN_SPROUT_FAIRY, + RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, + RHT_DMC_BEAN_SPROUT_FAIRY, + RHT_DMT_BEAN_SPROUT_FAIRY, RHT_MAX } RandomizerHintTextKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index e231a2a3179..7b29cb13f88 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -371,6 +371,37 @@ typedef enum { 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_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, // 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, From 41d10c328c5a69d4082e10bbcf5a849d257349c0 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 5 Sep 2024 19:33:20 -0700 Subject: [PATCH 38/54] Add HasItem and CanUse entries for magic beans. --- soh/soh/Enhancements/randomizer/logic.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index edb17df0c88..c76119a1465 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -71,6 +71,8 @@ namespace Rando { return Scarecrow; case RG_DISTANT_SCARECROW: return DistantScarecrow; + case RG_MAGIC_BEAN: + return ctx->GetAmmo(ITEM_BEAN) > 0; case RG_KOKIRI_SWORD: case RG_DEKU_SHIELD: case RG_GORON_TUNIC: @@ -286,6 +288,8 @@ namespace Rando { return BombchuRefill && BombchusEnabled; case RG_RUTOS_LETTER: return IsChild; + case RG_MAGIC_BEAN: + return IsChild; // Adult Trade case RG_POCKET_EGG: @@ -463,7 +467,7 @@ namespace Rando { BuyArrow = GetInLogic(LOGIC_BUY_ARROW); BuyBomb = GetInLogic(LOGIC_BUY_BOMB); BuyMagicPotion = GetInLogic(LOGIC_BUY_MAGIC_POTION); - MagicBean = ctx->GetAmmo(ITEM_BEAN) > 0; + MagicBean = HasItem(RG_MAGIC_BEAN); RutosLetter = CanUse(RG_RUTOS_LETTER); Boomerang = CanUse(RG_BOOMERANG); DinsFire = CanUse(RG_DINS_FIRE); From 1598ce3273808a2269e181542b362e5ab6b55974 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 5 Sep 2024 19:46:16 -0700 Subject: [PATCH 39/54] Define logic for bean sprout fairies --- .../3drando/location_access/locacc_death_mountain.cpp | 6 ++++++ .../3drando/location_access/locacc_gerudo_valley.cpp | 6 ++++++ .../3drando/location_access/locacc_hyrule_field.cpp | 3 +++ .../3drando/location_access/locacc_kakariko.cpp | 3 +++ .../3drando/location_access/locacc_lost_woods.cpp | 9 +++++++++ .../3drando/location_access/locacc_zoras_domain.cpp | 3 +++ 6 files changed, 30 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp index 73284dbc8f5..3f8036cd4a5 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp @@ -15,6 +15,9 @@ void AreaTable_Init_DeathMountain() { LOCATION(RC_DMT_GS_BEAN_PATCH, logic->CanPlantBugs && (logic->HasExplosives || logic->GoronBracelet || (randoCtx->GetTrickOption(RT_DMT_SOIL_GS) && (logic->CanTakeDamage || logic->CanUse(RG_HOVER_BOOTS)) && logic->CanUse(RG_BOOMERANG)))), LOCATION(RC_DMT_GS_NEAR_KAK, logic->CanBlastOrSmash), LOCATION(RC_DMT_GS_ABOVE_DODONGOS_CAVERN, logic->IsAdult && logic->AtNight && (logic->CanUse(RG_MEGATON_HAMMER) || (randoCtx->GetTrickOption(RT_DMT_HOOKSHOT_LOWER_GS) && logic->CanUse(RG_HOOKSHOT)) || (randoCtx->GetTrickOption(RT_DMT_BEAN_LOWER_GS) && CanPlantBean(RR_DEATH_MOUNTAIN_TRAIL)) || (randoCtx->GetTrickOption(RT_DMT_HOVERS_LOWER_GS) && logic->CanUse(RG_HOVER_BOOTS)) || randoCtx->GetTrickOption(RT_DMT_JS_LOWER_GS)) && logic->CanGetNightTimeGS), + LOCATION(RC_DMT_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_DMT_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_DMT_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives || logic->HasItem(RG_GORONS_BRACELET))), }, { //Exits Entrance(RR_KAK_BEHIND_GATE, {[]{return true;}}), @@ -227,6 +230,9 @@ void AreaTable_Init_DeathMountain() { }, { //Locations LOCATION(RC_DMC_GS_BEAN_PATCH, (logic->FireTimer >= 8 || logic->Hearts >= 3) && logic->CanPlantBugs && logic->CanChildAttack), + LOCATION(RC_DMC_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->FireTimer >= 8 || logic->Hearts >= 3)), + LOCATION(RC_DMC_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->FireTimer >= 8 || logic->Hearts >= 3)), + LOCATION(RC_DMC_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->FireTimer >= 8 || logic->Hearts >= 3)), }, { //Exits Entrance(RR_DMC_CENTRAL_NEARBY, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp index a21cef7c2fb..57cb2286b01 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp @@ -29,6 +29,9 @@ void AreaTable_Init_GerudoValley() { LOCATION(RC_GV_GS_BEAN_PATCH, logic->CanPlantBugs && logic->CanChildAttack), LOCATION(RC_GV_COW, logic->IsChild && logic->CanUse(RG_EPONAS_SONG)), LOCATION(RC_GV_GOSSIP_STONE, true), + LOCATION(RC_GV_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_GV_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_GV_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), }, { //Exits Entrance(RR_GV_LOWER_STREAM, {[]{return true;}}), @@ -184,6 +187,9 @@ void AreaTable_Init_GerudoValley() { LOCATION(RC_COLOSSUS_GS_TREE, logic->IsAdult && logic->HookshotOrBoomerang && logic->AtNight && logic->CanGetNightTimeGS), LOCATION(RC_COLOSSUS_GS_HILL, logic->IsAdult && logic->AtNight && ((CanPlantBean(RR_DESERT_COLOSSUS) && logic->CanAdultAttack) || logic->CanUse(RG_LONGSHOT) || (randoCtx->GetTrickOption(RT_COLOSSUS_GS) && logic->CanUse(RG_HOOKSHOT))) && logic->CanGetNightTimeGS), LOCATION(RC_COLOSSUS_GOSSIP_STONE, true), + LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), }, { //Exits Entrance(RR_COLOSSUS_GREAT_FAIRY_FOUNTAIN, {[]{return logic->HasExplosives;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp index 2d6de46924f..352ed05696d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp @@ -136,6 +136,9 @@ void AreaTable_Init_HyruleField() { LOCATION(RC_LH_GS_LAB_WALL, logic->IsChild && (logic->HookshotOrBoomerang || (randoCtx->GetTrickOption(RT_LH_LAB_WALL_GS) && logic->CanJumpslash)) && logic->AtNight && logic->CanGetNightTimeGS), LOCATION(RC_LH_GS_SMALL_ISLAND, logic->IsChild && logic->CanChildAttack && logic->AtNight && logic->CanGetNightTimeGS), LOCATION(RC_LH_GS_TREE, logic->IsAdult && logic->CanUse(RG_LONGSHOT) && logic->AtNight && logic->CanGetNightTimeGS), + LOCATION(RC_LH_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LH_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LH_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LH_LAB_GOSSIP_STONE, true), LOCATION(RC_LH_SOUTHEAST_GOSSIP_STONE, true), LOCATION(RC_LH_SOUTHWEST_GOSSIP_STONE, true), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp index 45fa4a1861c..5df1b9a5379 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp @@ -217,6 +217,9 @@ void AreaTable_Init_Kakariko() { LOCATION(RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, logic->ChildsWallet && logic->IsChild && logic->AtNight), //TODO: This needs to change LOCATION(RC_GRAVEYARD_GS_WALL, logic->IsChild && logic->HookshotOrBoomerang && logic->AtNight && logic->CanGetNightTimeGS), LOCATION(RC_GRAVEYARD_GS_BEAN_PATCH, logic->CanPlantBugs && logic->CanChildAttack), + LOCATION(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_GRAVEYARD_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), }, { //Exits Entrance(RR_GRAVEYARD_SHIELD_GRAVE, {[]{return logic->IsAdult || logic->AtNight;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp index 57e873d0fcf..b9c07bfaea3 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp @@ -15,6 +15,9 @@ void AreaTable_Init_LostWoods() { LOCATION(RC_KF_GS_KNOW_IT_ALL_HOUSE, logic->IsChild && logic->CanChildAttack && logic->AtNight && (/*TODO: HasNightStart ||*/ logic->CanLeaveForest || logic->CanUse(RG_SUNS_SONG)) && logic->CanGetNightTimeGS), LOCATION(RC_KF_GS_BEAN_PATCH, logic->CanPlantBugs && logic->CanChildAttack), LOCATION(RC_KF_GS_HOUSE_OF_TWINS, logic->IsAdult && logic->AtNight && (logic->HookshotOrBoomerang || (randoCtx->GetTrickOption(RT_KF_ADULT_GS) && logic->CanUse(RG_HOVER_BOOTS))) && logic->CanGetNightTimeGS), + LOCATION(RC_KF_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_KF_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_KF_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_KF_GOSSIP_STONE, true), }, { //Exits @@ -135,6 +138,9 @@ void AreaTable_Init_LostWoods() { LOCATION(RC_LW_TARGET_IN_WOODS, logic->IsChild && logic->CanUse(RG_FAIRY_SLINGSHOT)), LOCATION(RC_LW_DEKU_SCRUB_NEAR_BRIDGE, logic->IsChild && logic->CanStunDeku), LOCATION(RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE, logic->CanPlantBugs && logic->CanChildAttack), + LOCATION(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_GOSSIP_STONE, true), }, { //Exits @@ -155,6 +161,9 @@ void AreaTable_Init_LostWoods() { LOCATION(RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, logic->IsChild && logic->CanStunDeku), LOCATION(RC_LW_GS_ABOVE_THEATER, logic->IsAdult && logic->AtNight && ((CanPlantBean(RR_LW_BEYOND_MIDO) && logic->CanAdultAttack) || (randoCtx->GetTrickOption(RT_LW_GS_BEAN) && logic->CanUse(RG_HOOKSHOT) && (logic->CanUse(RG_LONGSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOMBCHU_5) || logic->CanUse(RG_DINS_FIRE)))) && logic->CanGetNightTimeGS), LOCATION(RC_LW_GS_BEAN_PATCH_NEAR_THEATER, logic->CanPlantBugs && (logic->CanChildAttack || (randoCtx->GetOption(RSK_SHUFFLE_SCRUBS).Is(RO_SCRUBS_OFF) && logic->DekuShield))), + LOCATION(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LW_BEAN_SPROUT_NEAR_THEATER_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), }, { //Exits Entrance(RR_LW_FOREST_EXIT, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp index a9be45b3a82..61612395371 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp @@ -34,6 +34,9 @@ void AreaTable_Init_ZorasDomain() { LOCATION(RC_ZR_GS_LADDER, logic->IsChild && logic->AtNight && logic->CanChildAttack && logic->CanGetNightTimeGS), LOCATION(RC_ZR_GS_NEAR_RAISED_GROTTOS, logic->IsAdult && logic->HookshotOrBoomerang && logic->AtNight && logic->CanGetNightTimeGS), LOCATION(RC_ZR_GS_ABOVE_BRIDGE, logic->IsAdult && logic->CanUse(RG_HOOKSHOT) && logic->AtNight && logic->CanGetNightTimeGS), + LOCATION(RC_ZR_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_ZR_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_ZR_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, true), LOCATION(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, true), }, { From 12c4bb43378a30e77d883fed18af464ace4ed1f6 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 5 Sep 2024 23:25:13 -0700 Subject: [PATCH 40/54] Enabling looking up fairies by z coordinate --- soh/soh/Enhancements/randomizer/fairy_shuffle.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp index e65e3f75505..e55972905fa 100644 --- a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp +++ b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp @@ -6,6 +6,7 @@ #include "src/overlays/actors/ovl_Obj_Bean/z_obj_bean.h" #define FAIRY_FLAG_TIMED (1 << 8) +#define FAIRY_FLAG_BIG (1 << 9) void FairyDrawRandomizedItem(EnElf* enElf, PlayState* play) { GetItemEntry randoGetItem = enElf->sohFairyIdentity.itemEntry; @@ -66,6 +67,11 @@ void FairyOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void* opt void FairyOnActorInitHandler(void* actorRef) { EnElf* enElf = static_cast(actorRef); enElf->sohFairyIdentity = { RAND_INF_MAX, GET_ITEM_NONE }; + s16 grottoId = (gPlayState->sceneNum == SCENE_GROTTOS) ? Grotto_CurrentGrotto() : 0; + if (enElf->fairyFlags & FAIRY_FLAG_BIG) { + grottoId |= 0x8000; + } + FairyInitialise(enElf, TWO_ACTOR_PARAMS(grottoId, (s16)enElf->actor.home.pos.z)); } uint32_t onVanillaBehaviorHook = 0; From fb5e1bc530ea3147dfa76176c580457360ad16ba Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Fri, 6 Sep 2024 00:19:06 -0700 Subject: [PATCH 41/54] Add Temple of Time Gossip Stones Logic might look a little weird. While the Gossip Stones respond to Sun's Song, the scene transition takes priority, so the fairies aren't actually obtainable. Adult does not have day and night versions and is fully capable of acquiring the fairies with Sun's Song. Song of Time is similar, but rather than being dependant on age, it's dependant on the timesaver to switch ages anywhere with Song of Time. In this case, the fairies still spawn, but the age transition deletes them before giving the chance to collect them. While I could've chosen to ignore this and simply require the player to disable the enhancement before playing if it's their only option, I instead decided to accomodate the enhancement and require one of the other songs in order for the check to be in logic. --- .../location_access/locacc_castle_town.cpp | 8 ++++++ .../Enhancements/randomizer/fairy_shuffle.cpp | 14 +++++++--- .../Enhancements/randomizer/location_list.cpp | 27 ++++++++++++++++++- .../Enhancements/randomizer/randomizerTypes.h | 10 +++++++ .../Enhancements/randomizer/randomizer_inf.h | 9 +++++++ 5 files changed, 63 insertions(+), 5 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp index e809beb5472..463590fc857 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp @@ -38,6 +38,14 @@ void AreaTable_Init_CastleTown() { EventAccess(&logic->GossipStoneFairy, {[]{return logic->GossipStoneFairy || logic->CanSummonGossipFairyWithoutSuns;}}), }, { //Locations + LOCATION(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, logic->CanUse(RG_ZELDAS_LULLABY) || logic->CanUse(RG_SARIAS_SONG) || logic->CanUse(RG_EPONAS_SONG) || (logic->CanUse(RG_SUNS_SONG) && logic->IsAdult)), + LOCATION(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, logic->CanUse(RG_ZELDAS_LULLABY) || logic->CanUse(RG_SARIAS_SONG) || logic->CanUse(RG_EPONAS_SONG) || (logic->CanUse(RG_SUNS_SONG) && logic->IsAdult)), + LOCATION(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, logic->CanUse(RG_ZELDAS_LULLABY) || logic->CanUse(RG_SARIAS_SONG) || logic->CanUse(RG_EPONAS_SONG) || (logic->CanUse(RG_SUNS_SONG) && logic->IsAdult)), + LOCATION(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, logic->CanUse(RG_ZELDAS_LULLABY) || logic->CanUse(RG_SARIAS_SONG) || logic->CanUse(RG_EPONAS_SONG) || (logic->CanUse(RG_SUNS_SONG) && logic->IsAdult)), + LOCATION(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_TOT_LEFTMOST_GOSSIP_STONE, true), LOCATION(RC_TOT_LEFT_CENTER_GOSSIP_STONE, true), LOCATION(RC_TOT_RIGHT_CENTER_GOSSIP_STONE, true), diff --git a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp index e55972905fa..7bb5cdbb080 100644 --- a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp +++ b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp @@ -21,7 +21,11 @@ void FairyDrawRandomizedItem(EnElf* enElf, PlayState* play) { } bool FairyInitialise(EnElf* fairy, int32_t params) { - Rando::Location* location = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(ACTOR_EN_ELF, gPlayState->sceneNum, params); + s16 sceneNum = gPlayState->sceneNum; + if (sceneNum == SCENE_TEMPLE_OF_TIME_EXTERIOR_NIGHT || sceneNum == SCENE_TEMPLE_OF_TIME_EXTERIOR_RUINS) { + sceneNum = SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY; + } + Rando::Location* location = OTRGlobals::Instance->gRandomizer->GetCheckObjectFromActor(ACTOR_EN_ELF, sceneNum, params); RandomizerInf flag = static_cast(location->GetCollectionCheck().flag); if (location->GetRandomizerCheck() != RC_UNKNOWN_CHECK && !Flags_GetRandomizerInf(flag)) { GetItemEntry item = Rando::Context::GetInstance()->GetFinalGIEntry(location->GetRandomizerCheck(), true, GI_FAIRY); @@ -67,11 +71,13 @@ void FairyOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void* opt void FairyOnActorInitHandler(void* actorRef) { EnElf* enElf = static_cast(actorRef); enElf->sohFairyIdentity = { RAND_INF_MAX, GET_ITEM_NONE }; - s16 grottoId = (gPlayState->sceneNum == SCENE_GROTTOS) ? Grotto_CurrentGrotto() : 0; + s16 params = (gPlayState->sceneNum == SCENE_GROTTOS) ? Grotto_CurrentGrotto() : 0; if (enElf->fairyFlags & FAIRY_FLAG_BIG) { - grottoId |= 0x8000; + params |= 0x8000; + } + if (FairyInitialise(enElf, TWO_ACTOR_PARAMS(params, (s16)enElf->actor.home.pos.z))) { + enElf->fairyFlags &= ~(FAIRY_FLAG_TIMED | FAIRY_FLAG_BIG); } - FairyInitialise(enElf, TWO_ACTOR_PARAMS(grottoId, (s16)enElf->actor.home.pos.z)); } uint32_t onVanillaBehaviorHook = 0; diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 8d0c484f4dd..57e226c6308 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -584,6 +584,15 @@ std::vector Rando::StaticData::overworldLocations = { RC_DMT_BEAN_SPROUT_FAIRY_1, RC_DMT_BEAN_SPROUT_FAIRY_2, RC_DMT_BEAN_SPROUT_FAIRY_3, + + RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, + RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, + RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, + RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, + RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, + RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, + RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, + RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, }; std::vector Rando::StaticData::gossipStoneLocations = { @@ -709,6 +718,14 @@ std::vector Rando::StaticData::overworldFairyLocations = { RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, + RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, + RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, + RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, + RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, + RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, + RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, + RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, + RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, }; typedef enum { @@ -1711,7 +1728,6 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x06, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, "MQ Scrubs Fairy 7", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x07, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, "MQ Scrubs Fairy 8", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); - locationTable[RC_ZR_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0300, RAND_INF_ZR_BEAN_SPROUT_FAIRY_1, "Bean Sprout Fairy 1", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); locationTable[RC_ZR_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0301, RAND_INF_ZR_BEAN_SPROUT_FAIRY_2, "Bean Sprout Fairy 2", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); locationTable[RC_ZR_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0302, RAND_INF_ZR_BEAN_SPROUT_FAIRY_3, "Bean Sprout Fairy 3", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); @@ -1743,6 +1759,15 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_DMT_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0601, RAND_INF_DMT_BEAN_SPROUT_FAIRY_2, "Bean Sprout Fairy 2", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); locationTable[RC_DMT_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0602, RAND_INF_DMT_BEAN_SPROUT_FAIRY_3, "Bean Sprout Fairy 3", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -680), RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, "ToT Left Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x8000, -680), RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, "ToT Left Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -615), RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, "ToT Left Center Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x8000, -615), RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, "ToT Left Center Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -550), RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, "ToT Right Center Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x8000, -550), RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, "ToT Right Center Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -485), RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, "ToT Right Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x8000, -485), RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, "ToT Right Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); locationTable[RC_DMT_GOSSIP_STONE] = Location::HintStone(RC_DMT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 14340, 0x04, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index bb1a37c9c94..3a0aecbd780 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1746,6 +1746,14 @@ typedef enum { RC_DMT_BEAN_SPROUT_FAIRY_1, RC_DMT_BEAN_SPROUT_FAIRY_2, RC_DMT_BEAN_SPROUT_FAIRY_3, + RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, + RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, + RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, + RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, + RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, + RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, + RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, + RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, RC_MAX } RandomizerCheck; @@ -3749,6 +3757,8 @@ typedef enum { RHT_GRAVEYARD_BEAN_SPROUT_FAIRY, RHT_DMC_BEAN_SPROUT_FAIRY, RHT_DMT_BEAN_SPROUT_FAIRY, + RHT_TOT_GOSSIP_STONE_FAIRY, + RHT_TOT_GOSSIP_STONE_FAIRY_BIG, RHT_MAX } RandomizerHintTextKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 7b29cb13f88..dbea072c897 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -402,6 +402,15 @@ typedef enum { RAND_INF_DMT_BEAN_SPROUT_FAIRY_1, RAND_INF_DMT_BEAN_SPROUT_FAIRY_2, RAND_INF_DMT_BEAN_SPROUT_FAIRY_3, + + 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, // 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, From 3552242a27ca6e1afc628db65b167bf353496ff1 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Sat, 7 Sep 2024 02:01:46 -0700 Subject: [PATCH 42/54] Disable quick age change around gossip stones to simplify logic --- soh/soh/Enhancements/mods.cpp | 3 ++- .../3drando/location_access/locacc_castle_town.cpp | 8 ++++---- soh/soh/Enhancements/randomizer/logic.cpp | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 36b1a559420..59d16053fd3 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -274,13 +274,14 @@ void RegisterOcarinaTimeTravel() { Actor* nearbyOcarinaSpot = Actor_FindNearby(gPlayState, player, ACTOR_EN_OKARINA_TAG, ACTORCAT_PROP, 120.0f); Actor* nearbyDoorOfTime = Actor_FindNearby(gPlayState, player, ACTOR_DOOR_TOKI, ACTORCAT_BG, 500.0f); Actor* nearbyFrogs = Actor_FindNearby(gPlayState, player, ACTOR_EN_FR, ACTORCAT_NPC, 300.0f); + Actor* nearbyGossipStone = Actor_FindNearby(gPlayState, player, ACTOR_EN_GS, ACTORCAT_NPC, 300.0f); uint8_t hasMasterSword = CHECK_OWNED_EQUIP(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_MASTER); uint8_t hasOcarinaOfTime = (INV_CONTENT(ITEM_OCARINA_TIME) == ITEM_OCARINA_TIME); // If TimeTravel + Player have the Ocarina of Time + Have Master Sword + is in proper range // TODO: Once Swordless Adult is fixed: Remove the Master Sword check if (((CVarGetInteger(CVAR_ENHANCEMENT("TimeTravel"), 0) == 1 && hasOcarinaOfTime) || CVarGetInteger(CVAR_ENHANCEMENT("TimeTravel"), 0) == 2) && hasMasterSword && gPlayState->msgCtx.lastPlayedSong == OCARINA_SONG_TIME && !nearbyTimeBlockEmpty && !nearbyTimeBlock && - !nearbyOcarinaSpot && !nearbyFrogs) { + !nearbyOcarinaSpot && !nearbyFrogs && !nearbyGossipStone) { if (IS_RANDO) { CVarSetInteger(CVAR_GENERAL("SwitchTimeline"), 1); diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp index 463590fc857..7200a3e0801 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp @@ -38,13 +38,13 @@ void AreaTable_Init_CastleTown() { EventAccess(&logic->GossipStoneFairy, {[]{return logic->GossipStoneFairy || logic->CanSummonGossipFairyWithoutSuns;}}), }, { //Locations - LOCATION(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, logic->CanUse(RG_ZELDAS_LULLABY) || logic->CanUse(RG_SARIAS_SONG) || logic->CanUse(RG_EPONAS_SONG) || (logic->CanUse(RG_SUNS_SONG) && logic->IsAdult)), + LOCATION(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns || (logic->CanUse(RG_SUNS_SONG) && logic->IsAdult)), LOCATION(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, logic->CanUse(RG_ZELDAS_LULLABY) || logic->CanUse(RG_SARIAS_SONG) || logic->CanUse(RG_EPONAS_SONG) || (logic->CanUse(RG_SUNS_SONG) && logic->IsAdult)), + LOCATION(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns || (logic->CanUse(RG_SUNS_SONG) && logic->IsAdult)), LOCATION(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, logic->CanUse(RG_ZELDAS_LULLABY) || logic->CanUse(RG_SARIAS_SONG) || logic->CanUse(RG_EPONAS_SONG) || (logic->CanUse(RG_SUNS_SONG) && logic->IsAdult)), + LOCATION(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns || (logic->CanUse(RG_SUNS_SONG) && logic->IsAdult)), LOCATION(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, logic->CanUse(RG_ZELDAS_LULLABY) || logic->CanUse(RG_SARIAS_SONG) || logic->CanUse(RG_EPONAS_SONG) || (logic->CanUse(RG_SUNS_SONG) && logic->IsAdult)), + LOCATION(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns || (logic->CanUse(RG_SUNS_SONG) && logic->IsAdult)), LOCATION(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_TOT_LEFTMOST_GOSSIP_STONE, true), LOCATION(RC_TOT_LEFT_CENTER_GOSSIP_STONE, true), diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index c76119a1465..5d5302657d1 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -595,7 +595,7 @@ namespace Rando { CanLeaveForest = ctx->GetOption(RSK_FOREST).IsNot(RO_FOREST_CLOSED) || IsAdult || DekuTreeClear || ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES) || ctx->GetOption(RSK_SHUFFLE_OVERWORLD_ENTRANCES); CanPlantBugs = IsChild && CanUse(RG_BOTTLE_WITH_BUGS); CanRideEpona = IsAdult && Epona && CanUse(RG_EPONAS_SONG); - CanSummonGossipFairyWithoutSuns = CanUse(RG_ZELDAS_LULLABY) || CanUse(RG_EPONAS_SONG) || CanUse(RG_SONG_OF_TIME); + CanSummonGossipFairyWithoutSuns = CanUse(RG_ZELDAS_LULLABY) || CanUse(RG_EPONAS_SONG) || CanUse(RG_SARIAS_SONG) || CanUse(RG_SONG_OF_TIME); CanSummonGossipFairy = CanSummonGossipFairyWithoutSuns || CanUse(RG_SUNS_SONG); Hearts = ctx->GetSaveContext()->healthCapacity / 16; EffectiveHealth = ((Hearts << (2 + DoubleDefense)) >> Multiplier) + ((Hearts << (2 + DoubleDefense)) % (1 << Multiplier) > 0); //Number of half heart hits to die, ranges from 1 to 160 From 16da42ce731514f511073e4ddc3a8c0c77e515c7 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Sat, 7 Sep 2024 22:31:16 -0700 Subject: [PATCH 43/54] Add remaining gossip stone fairies --- .../Enhancements/randomizer/fairy_shuffle.cpp | 3 +- .../Enhancements/randomizer/location_list.cpp | 238 +++++++++++++++++- .../Enhancements/randomizer/randomizerTypes.h | 142 +++++++++++ .../Enhancements/randomizer/randomizer_inf.h | 74 ++++++ 4 files changed, 448 insertions(+), 9 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp index 7bb5cdbb080..ce82f65d37e 100644 --- a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp +++ b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp @@ -73,8 +73,9 @@ void FairyOnActorInitHandler(void* actorRef) { enElf->sohFairyIdentity = { RAND_INF_MAX, GET_ITEM_NONE }; s16 params = (gPlayState->sceneNum == SCENE_GROTTOS) ? Grotto_CurrentGrotto() : 0; if (enElf->fairyFlags & FAIRY_FLAG_BIG) { - params |= 0x8000; + params |= 0x1000; } + if (FairyInitialise(enElf, TWO_ACTOR_PARAMS(params, (s16)enElf->actor.home.pos.z))) { enElf->fairyFlags &= ~(FAIRY_FLAG_TIMED | FAIRY_FLAG_BIG); } diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 57e226c6308..d4b824bae94 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -593,6 +593,80 @@ std::vector Rando::StaticData::overworldLocations = { RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, + RC_DMC_GOSSIP_STONE_FAIRY, + RC_DMC_GOSSIP_STONE_FAIRY_BIG, + RC_DMT_GOSSIP_STONE_FAIRY, + RC_DMT_GOSSIP_STONE_FAIRY_BIG, + RC_COLOSSUS_GOSSIP_STONE_FAIRY, + RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, + RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, + RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, + RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, + RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, + RC_GV_GOSSIP_STONE_FAIRY, + RC_GV_GOSSIP_STONE_FAIRY_BIG, + RC_GC_MAZE_GOSSIP_STONE_FAIRY, + RC_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, + RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY, + RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, + RC_GRAVEYARD_GOSSIP_STONE_FAIRY, + RC_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, + RC_HC_MALON_GOSSIP_STONE_FAIRY, + RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG, + RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, + RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, + RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, + RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG, + RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY, + RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG, + RC_KF_GOSSIP_STONE_FAIRY, + RC_KF_GOSSIP_STONE_FAIRY_BIG, + RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_LH_LAB_GOSSIP_STONE_FAIRY, + RC_LH_LAB_GOSSIP_STONE_FAIRY_BIG, + RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, + RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, + RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, + RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, + RC_LW_GOSSIP_STONE_FAIRY, + RC_LW_GOSSIP_STONE_FAIRY_BIG, + RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, + RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG, + RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY, + RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG, + RC_SFM_SARIA_GOSSIP_STONE_FAIRY, + RC_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, + RC_ZD_GOSSIP_STONE_FAIRY, + RC_ZD_GOSSIP_STONE_FAIRY_BIG, + RC_ZF_FAIRY_GOSSIP_STONE_FAIRY, + RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, + RC_ZF_JABU_GOSSIP_STONE_FAIRY, + RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, + RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, + RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, + RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, + RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, + RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, + RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, + RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, + RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, + RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, + RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, }; std::vector Rando::StaticData::gossipStoneLocations = { @@ -726,6 +800,80 @@ std::vector Rando::StaticData::overworldFairyLocations = { RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, + RC_DMC_GOSSIP_STONE_FAIRY, + RC_DMC_GOSSIP_STONE_FAIRY_BIG, + RC_DMT_GOSSIP_STONE_FAIRY, + RC_DMT_GOSSIP_STONE_FAIRY_BIG, + RC_COLOSSUS_GOSSIP_STONE_FAIRY, + RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, + RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, + RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, + RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, + RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, + RC_GV_GOSSIP_STONE_FAIRY, + RC_GV_GOSSIP_STONE_FAIRY_BIG, + RC_GC_MAZE_GOSSIP_STONE_FAIRY, + RC_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, + RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY, + RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, + RC_GRAVEYARD_GOSSIP_STONE_FAIRY, + RC_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, + RC_HC_MALON_GOSSIP_STONE_FAIRY, + RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG, + RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, + RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, + RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, + RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG, + RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY, + RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG, + RC_KF_GOSSIP_STONE_FAIRY, + RC_KF_GOSSIP_STONE_FAIRY_BIG, + RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_LH_LAB_GOSSIP_STONE_FAIRY, + RC_LH_LAB_GOSSIP_STONE_FAIRY_BIG, + RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, + RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, + RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, + RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, + RC_LW_GOSSIP_STONE_FAIRY, + RC_LW_GOSSIP_STONE_FAIRY_BIG, + RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, + RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG, + RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY, + RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG, + RC_SFM_SARIA_GOSSIP_STONE_FAIRY, + RC_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, + RC_ZD_GOSSIP_STONE_FAIRY, + RC_ZD_GOSSIP_STONE_FAIRY_BIG, + RC_ZF_FAIRY_GOSSIP_STONE_FAIRY, + RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, + RC_ZF_JABU_GOSSIP_STONE_FAIRY, + RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, + RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, + RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, + RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, + RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, + RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, + RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, + RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, + RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, + RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, + RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, }; typedef enum { @@ -1759,14 +1907,88 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_DMT_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0601, RAND_INF_DMT_BEAN_SPROUT_FAIRY_2, "Bean Sprout Fairy 2", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); locationTable[RC_DMT_BEAN_SPROUT_FAIRY_3] = Location::Fairy(RC_DMT_BEAN_SPROUT_FAIRY_3, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 0x0602, RAND_INF_DMT_BEAN_SPROUT_FAIRY_3, "Bean Sprout Fairy 3", RHT_DMT_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); - locationTable[RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -680), RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, "ToT Left Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x8000, -680), RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, "ToT Left Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -615), RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, "ToT Left Center Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x8000, -615), RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, "ToT Left Center Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -550), RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, "ToT Right Center Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x8000, -550), RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, "ToT Right Center Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -485), RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, "ToT Right Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); - locationTable[RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x8000, -485), RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, "ToT Right Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -680), RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, "ToT Left Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -680), RAND_INF_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, "ToT Left Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -615), RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, "ToT Left Center Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -615), RAND_INF_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY_BIG, "ToT Left Center Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -550), RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY, "ToT Right Center Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -550), RAND_INF_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, "ToT Right Center Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS( 0, -485), RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, "ToT Right Gossip Stone Fairy", RHT_TOT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_MARKET, SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY, TWO_ACTOR_PARAMS(0x1000, -485), RAND_INF_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, "ToT Right Gossip Stone Big Fairy", RHT_TOT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_DMC_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMC_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS( 0, 1656), RAND_INF_DMC_GOSSIP_STONE_FAIRY, "Gossip Stone Fairy", RHT_DMC_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMC_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, TWO_ACTOR_PARAMS(0x1000, 1656), RAND_INF_DMC_GOSSIP_STONE_FAIRY_BIG, "Gossip Stone Big Fairy", RHT_DMC_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMT_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS( 0, -3935), RAND_INF_DMT_GOSSIP_STONE_FAIRY, "Gossip Stone Fairy", RHT_DMT_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMT_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, TWO_ACTOR_PARAMS(0x1000, -3935), RAND_INF_DMT_GOSSIP_STONE_FAIRY_BIG, "Gossip Stone Big Fairy", RHT_DMT_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_COLOSSUS_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_COLOSSUS_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS( 0, 1320), RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY, "Gossip Stone Fairy", RHT_COLOSSUS_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, TWO_ACTOR_PARAMS(0x1000, 1320), RAND_INF_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, "Gossip Stone Big Fairy", RHT_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS( 0, -1520), RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, "Gossip Stone Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, RCQUEST_VANILLA, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(0x1000, -1520), RAND_INF_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, "Gossip Stone Big Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS( 0, -916), RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, "MQ Gossip Stone Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, RCQUEST_MQ, RCAREA_DODONGOS_CAVERN, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(0x1000, -916), RAND_INF_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, "MQ Gossip Stone Big Fairy", RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_DUNGEON_DODONGOS_CAVERN); + locationTable[RC_GV_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GV_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS( 0, -2340), RAND_INF_GV_GOSSIP_STONE_FAIRY, "Gossip Stone Fairy", RHT_GV_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GV_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GV_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GERUDO_VALLEY, SCENE_GERUDO_VALLEY, TWO_ACTOR_PARAMS(0x1000, -2340), RAND_INF_GV_GOSSIP_STONE_FAIRY_BIG, "Gossip Stone Big Fairy", RHT_GV_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_GC_MAZE_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GC_MAZE_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS( 0, -1265), RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY, "Maze Gossip Stone Fairy", RHT_GC_MAZE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[RC_GC_MAZE_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(0x1000, -1265), RAND_INF_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, "Maze Gossip Stone Big Fairy", RHT_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS( 0, 1496), RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY, "Medigoron Gossip Stone Fairy", RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GORON_CITY, SCENE_GORON_CITY, TWO_ACTOR_PARAMS(0x1000, 1496), RAND_INF_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, "Medigoron Gossip Stone Big Fairy", RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_GORON_CITY); + locationTable[RC_GRAVEYARD_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_GRAVEYARD_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS( 0, -75), RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY, "Gossip Stone Fairy", RHT_GRAVEYARD_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_GRAVEYARD, SCENE_GRAVEYARD, TWO_ACTOR_PARAMS(0x1000, -75), RAND_INF_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, "Gossip Stone Big Fairy", RHT_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_HC_MALON_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HC_MALON_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS( 0, 3445), RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY, "Malon Gossip Stone Fairy", RHT_HC_MALON_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(0x1000, 3445), RAND_INF_HC_MALON_GOSSIP_STONE_FAIRY_BIG, "Malon Gossip Stone Big Fairy", RHT_HC_MALON_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS( 0, 1041), RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, "Rock Wall Gossip Stone Fairy", RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_HYRULE_CASTLE, TWO_ACTOR_PARAMS(0x1000, 1041), RAND_INF_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, "Rock Wall Gossip Stone Big Fairy", RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0xC, 735), RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, "Storms Grotto Gossip Stone Fairy", RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_CASTLE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x100C, 735), RAND_INF_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, "Storms Grotto Gossip Stone Big Fairy", RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_CASTLE); + locationTable[RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS( 0, -2230), RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, "Deku Tree Left Gossip Stone Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(0x1000, -2230), RAND_INF_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG, "Deku Tree Left Gossip Stone Big Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS( 0, -700), RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY, "Deku Tree Right Gossip Stone Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(0x1000, -700), RAND_INF_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG, "Deku Tree Right Gossip Stone Big Fairy", RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS( 0, -1223), RAND_INF_KF_GOSSIP_STONE_FAIRY, "Gossip Stone Fairy", RHT_KF_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_KOKIRI_FOREST, TWO_ACTOR_PARAMS(0x1000, -1223), RAND_INF_KF_GOSSIP_STONE_FAIRY_BIG, "Gossip Stone Big Fairy", RHT_KF_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x1B, -236), RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, "Storms Gossip Stone Fairy", RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KOKIRI_FOREST, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x101B, -236), RAND_INF_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, "Storms Gossip Stone Big Fairy", RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_KOKIRI_FOREST); + locationTable[RC_LH_LAB_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LH_LAB_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS( 0, 3212), RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY, "Lab Gossip Stone Fairy", RHT_LH_LAB_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_LAB_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LH_LAB_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 3212), RAND_INF_LH_LAB_GOSSIP_STONE_FAIRY_BIG, "Lab Gossip Stone Big Fairy", RHT_LH_LAB_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS( 0, 8395), RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, "Southeast Gossip Stone Fairy", RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 8395), RAND_INF_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, "Southeast Gossip Stone Big Fairy", RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS( 0, 7984), RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, "Southwest Gossip Stone Fairy", RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 7984), RAND_INF_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, "Southwest Gossip Stone Big Fairy", RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_LW_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LW_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS( 0, 2300), RAND_INF_LW_GOSSIP_STONE_FAIRY, "Gossip Stone Fairy", RHT_LW_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LW_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_LOST_WOODS, TWO_ACTOR_PARAMS(0x1000, 2300), RAND_INF_LW_GOSSIP_STONE_FAIRY_BIG, "Gossip Stone Big Fairy", RHT_LW_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS( 0, 1370), RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, "Maze Lower Gossip Stone Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(0x1000, 1370), RAND_INF_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG, "Maze Lower Gossip Stone Big Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS( 0, 740), RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY, "Maze Upper Gossip Stone Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(0x1000, 740), RAND_INF_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG, "Maze Upper Gossip Stone Big Fairy", RHT_SFM_MAZE_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_SARIA_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_SFM_SARIA_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS( 0, -2300), RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY, "Saria Gossip Stone Fairy", RHT_SFM_SARIA_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_SACRED_FOREST_MEADOW, SCENE_SACRED_FOREST_MEADOW, TWO_ACTOR_PARAMS(0x1000, -2300), RAND_INF_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, "Saria Gossip Stone Big Fairy", RHT_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_ZD_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZD_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS( 0, -1600), RAND_INF_ZD_GOSSIP_STONE_FAIRY, "Gossip Stone Fairy", RHT_ZD_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZD_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZD_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(0x1000, -1600), RAND_INF_ZD_GOSSIP_STONE_FAIRY_BIG, "Gossip Stone Big Fairy", RHT_ZD_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_FAIRY_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS( 0, 2205), RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY, "Fairy Gossip Stone Fairy", RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(0x1000, 2205), RAND_INF_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, "Fairy Gossip Stone Big Fairy", RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_JABU_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZF_JABU_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS( 0, -985), RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY, "Jabu Gossip Stone Fairy", RHT_ZF_JABU_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_FOUNTAIN, SCENE_ZORAS_FOUNTAIN, TWO_ACTOR_PARAMS(0x1000, -985), RAND_INF_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, "Jabu Gossip Stone Big Fairy", RHT_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_ZORAS_DOMAIN); + locationTable[RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS( 0, -1070), RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, "Near Grottos Gossip Stone Fairy", RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(0x1000, -1070), RAND_INF_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, "Near Grottos Gossip Stone Big Fairy", RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS( 0, -1650), RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, "Near Domain Gossip Stone Fairy", RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, TWO_ACTOR_PARAMS(0x1000, -1650), RAND_INF_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, "Near Domain Gossip Stone Big Fairy", RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x11, -357), RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, "Cow Grotto Gossip Stone Fairy", RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1011, -357), RAND_INF_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, "Cow Grotto Gossip Stone Big Fairy", RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x10, -236), RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, "Near Market Gossip Stone Fairy", RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1010, -236), RAND_INF_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, "Near Market Gossip Stone Big Fairy", RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x14, -236), RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, "Southeast Gossip Stone Fairy", RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1014, -236), RAND_INF_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, "Southeast Gossip Stone Big Fairy", RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x13, -236), RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, "Open Grotto Gossip Stone Fairy", RHT_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1013, -236), RAND_INF_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, "Open Grotto Gossip Stone Big Fairy", RHT_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + locationTable[RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0xA, -236), RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, "Open Grotto Gossip Stone Fairy", RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_KAKARIKO_VILLAGE, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x100A, -236), RAND_INF_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, "Open Grotto Gossip Stone Big Fairy", RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_KAKARIKO); + locationTable[RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x4, -236), RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, "Open Grotto Gossip Stone Fairy", RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1004, -236), RAND_INF_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, "Open Grotto Gossip Stone Big Fairy", RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x1A, -236), RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, "Near Shortcuts Gossip Stone Fairy", RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_LOST_WOODS, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x101A, -236), RAND_INF_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, "Near Shortcuts Gossip Stone Big Fairy", RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + locationTable[RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x8, -236), RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, "Storms Grotto Gossip Stone Fairy", RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1008, -236), RAND_INF_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, "Storms Grotto Gossip Stone Big Fairy", RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x6, -236), RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, "Upper Grotto Gossip Stone Fairy", RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1006, -236), RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, "Upper Grotto Gossip Stone Big Fairy", RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 3a0aecbd780..c51ce459d66 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1754,6 +1754,80 @@ typedef enum { RC_TOT_RIGHT_CENTER_GOSSIP_STONE_FAIRY_BIG, RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY, RC_TOT_RIGHTMOST_GOSSIP_STONE_FAIRY_BIG, + RC_DMC_GOSSIP_STONE_FAIRY, + RC_DMC_GOSSIP_STONE_FAIRY_BIG, + RC_DMT_GOSSIP_STONE_FAIRY, + RC_DMT_GOSSIP_STONE_FAIRY_BIG, + RC_COLOSSUS_GOSSIP_STONE_FAIRY, + RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, + RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, + RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, + RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, + RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, + RC_GV_GOSSIP_STONE_FAIRY, + RC_GV_GOSSIP_STONE_FAIRY_BIG, + RC_GC_MAZE_GOSSIP_STONE_FAIRY, + RC_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, + RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY, + RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, + RC_GRAVEYARD_GOSSIP_STONE_FAIRY, + RC_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, + RC_HC_MALON_GOSSIP_STONE_FAIRY, + RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG, + RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, + RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, + RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, + RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG, + RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY, + RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG, + RC_KF_GOSSIP_STONE_FAIRY, + RC_KF_GOSSIP_STONE_FAIRY_BIG, + RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_LH_LAB_GOSSIP_STONE_FAIRY, + RC_LH_LAB_GOSSIP_STONE_FAIRY_BIG, + RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, + RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, + RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, + RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, + RC_LW_GOSSIP_STONE_FAIRY, + RC_LW_GOSSIP_STONE_FAIRY_BIG, + RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, + RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG, + RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY, + RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG, + RC_SFM_SARIA_GOSSIP_STONE_FAIRY, + RC_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, + RC_ZD_GOSSIP_STONE_FAIRY, + RC_ZD_GOSSIP_STONE_FAIRY_BIG, + RC_ZF_FAIRY_GOSSIP_STONE_FAIRY, + RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, + RC_ZF_JABU_GOSSIP_STONE_FAIRY, + RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, + RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, + RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, + RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, + RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, + RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, + RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, + RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, + RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, + RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, + RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, RC_MAX } RandomizerCheck; @@ -3759,6 +3833,74 @@ typedef enum { RHT_DMT_BEAN_SPROUT_FAIRY, RHT_TOT_GOSSIP_STONE_FAIRY, RHT_TOT_GOSSIP_STONE_FAIRY_BIG, + RHT_DMC_GOSSIP_STONE_FAIRY, + RHT_DMC_GOSSIP_STONE_FAIRY_BIG, + RHT_DMT_GOSSIP_STONE_FAIRY, + RHT_DMT_GOSSIP_STONE_FAIRY_BIG, + RHT_COLOSSUS_GOSSIP_STONE_FAIRY, + RHT_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, + RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, + RHT_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, + RHT_GV_GOSSIP_STONE_FAIRY, + RHT_GV_GOSSIP_STONE_FAIRY_BIG, + RHT_GC_MAZE_GOSSIP_STONE_FAIRY, + RHT_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, + RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY, + RHT_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, + RHT_GRAVEYARD_GOSSIP_STONE_FAIRY, + RHT_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, + RHT_HC_MALON_GOSSIP_STONE_FAIRY, + RHT_HC_MALON_GOSSIP_STONE_FAIRY_BIG, + RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, + RHT_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, + RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RHT_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY, + RHT_KF_DEKU_TREE_GOSSIP_STONE_FAIRY_BIG, + RHT_KF_GOSSIP_STONE_FAIRY, + RHT_KF_GOSSIP_STONE_FAIRY_BIG, + RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RHT_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RHT_LH_LAB_GOSSIP_STONE_FAIRY, + RHT_LH_LAB_GOSSIP_STONE_FAIRY_BIG, + RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, + RHT_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, + RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, + RHT_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, + RHT_LW_GOSSIP_STONE_FAIRY, + RHT_LW_GOSSIP_STONE_FAIRY_BIG, + RHT_SFM_MAZE_GOSSIP_STONE_FAIRY, + RHT_SFM_MAZE_GOSSIP_STONE_FAIRY_BIG, + RHT_SFM_SARIA_GOSSIP_STONE_FAIRY, + RHT_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, + RHT_ZD_GOSSIP_STONE_FAIRY, + RHT_ZD_GOSSIP_STONE_FAIRY_BIG, + RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY, + RHT_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, + RHT_ZF_JABU_GOSSIP_STONE_FAIRY, + RHT_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, + RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, + RHT_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, + RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, + RHT_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, + RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, + RHT_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, + RHT_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, + RHT_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RHT_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RHT_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RHT_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, + RHT_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, + RHT_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, + RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, + RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, RHT_MAX } RandomizerHintTextKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index dbea072c897..ac27e933b6c 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -411,6 +411,80 @@ typedef enum { 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, // 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, From 4e4fa63c97950d1085c30ab92dac484057b74a4c Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Sun, 8 Sep 2024 22:16:28 -0700 Subject: [PATCH 44/54] Finish gossip stone fairies --- .../randomizer/3drando/item_pool.cpp | 11 +++++++++-- .../location_access/locacc_castle_town.cpp | 6 ++++++ .../location_access/locacc_death_mountain.cpp | 12 ++++++++++++ .../location_access/locacc_dodongos_cavern.cpp | 4 ++++ .../location_access/locacc_gerudo_valley.cpp | 8 ++++++-- .../location_access/locacc_hyrule_field.cpp | 14 ++++++++++++++ .../location_access/locacc_kakariko.cpp | 4 ++++ .../location_access/locacc_lost_woods.cpp | 18 ++++++++++++++++++ .../location_access/locacc_zoras_domain.cpp | 12 ++++++++++++ soh/soh/Enhancements/randomizer/dungeon.cpp | 4 ++++ .../Enhancements/randomizer/location_list.cpp | 4 ---- soh/soh/Enhancements/randomizer/logic.cpp | 2 +- 12 files changed, 90 insertions(+), 9 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 5cd08230bf5..4b82dfba84f 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -1170,8 +1170,8 @@ void GenerateItemPool() { for (auto rc : Rando::StaticData::overworldFairyLocations) { AddItemToMainPool(GetJunkItem()); } - // 8 extra for Ganon's Castle - for (int i = 0; i < 8; i++) { + // 8 extra for Ganon's Castle + 2 extra for Dodongo's Cavern + for (int i = 0; i < 10; i++) { AddItemToMainPool(GetJunkItem()); } } else { @@ -1197,6 +1197,13 @@ void GenerateItemPool() { ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_7, GetJunkItem(), false, true); ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_8, GetJunkItem(), false, true); } + if (ctx->GetDungeon(Rando::DODONGOS_CAVERN)->IsMQ()) { + ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, GetJunkItem(), false, true); + } else { + ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, GetJunkItem(), false, true); + } } //Scrubsanity diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp index 7200a3e0801..ce175da71a4 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_castle_town.cpp @@ -97,6 +97,10 @@ void AreaTable_Init_CastleTown() { //Locations LOCATION(RC_HC_MALON_EGG, true), LOCATION(RC_HC_GS_TREE, logic->CanChildAttack), + LOCATION(RC_HC_MALON_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_HC_MALON_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_HC_ROCK_WALL_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_HC_MALON_GOSSIP_STONE, true), LOCATION(RC_HC_ROCK_WALL_GOSSIP_STONE, true), }, { @@ -134,6 +138,8 @@ void AreaTable_Init_CastleTown() { }, { //Locations LOCATION(RC_HC_GS_STORMS_GROTTO, (logic->CanBlastOrSmash && logic->HookshotOrBoomerang) || (logic->Boomerang && randoCtx->GetTrickOption(RT_HC_STORMS_GS))), + LOCATION(RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY, logic->CanBlastOrSmash && logic->CanSummonGossipFairy), + LOCATION(RC_HC_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, logic->CanBlastOrSmash && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_HC_STORMS_GROTTO_GOSSIP_STONE, logic->CanBlastOrSmash), }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp index 3f8036cd4a5..68e47f03f2d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp @@ -38,6 +38,8 @@ void AreaTable_Init_DeathMountain() { LOCATION(RC_DMT_TRADE_EYEDROPS, logic->IsAdult && logic->Eyedrops), LOCATION(RC_DMT_TRADE_CLAIM_CHECK, logic->IsAdult && logic->ClaimCheck), LOCATION(RC_DMT_GS_FALLING_ROCKS_PATH, logic->IsAdult && logic->AtNight && (logic->CanUse(RG_MEGATON_HAMMER) || randoCtx->GetTrickOption(RT_DMT_UPPER_GS)) && logic->CanGetNightTimeGS), + LOCATION(RC_DMT_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_DMT_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_DMT_GOSSIP_STONE, true), }, { //Exits @@ -67,6 +69,8 @@ void AreaTable_Init_DeathMountain() { //Locations LOCATION(RC_DMT_STORMS_GROTTO_CHEST, true), LOCATION(RC_DMT_STORMS_GROTTO_FISH, logic->HasBottle), + LOCATION(RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_DMT_STORMS_GROTTO_GOSSIP_STONE, true), LOCATION(RC_DMT_STORMS_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives), LOCATION(RC_DMT_STORMS_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives), @@ -103,6 +107,10 @@ void AreaTable_Init_DeathMountain() { LOCATION(RC_GC_GS_BOULDER_MAZE, logic->IsChild && logic->CanBlastOrSmash), LOCATION(RC_GC_GS_CENTER_PLATFORM, logic->CanAdultAttack), LOCATION(RC_GC_MEDIGORON, logic->IsAdult && logic->AdultsWallet && (logic->CanBlastOrSmash || logic->GoronBracelet)), + LOCATION(RC_GC_MAZE_GOSSIP_STONE_FAIRY, (logic->CanBlastOrSmash || logic->CanUse(RG_SILVER_GAUNTLETS)) && logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_GC_MAZE_GOSSIP_STONE_FAIRY_BIG, (logic->CanBlastOrSmash || logic->CanUse(RG_SILVER_GAUNTLETS)) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY, (logic->CanBlastOrSmash || logic->GoronBracelet) && logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_GC_MEDIGORON_GOSSIP_STONE_FAIRY_BIG, (logic->CanBlastOrSmash || logic->GoronBracelet) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_GC_MAZE_GOSSIP_STONE, logic->CanBlastOrSmash || logic->CanUse(RG_SILVER_GAUNTLETS)), LOCATION(RC_GC_MEDIGORON_GOSSIP_STONE, logic->CanBlastOrSmash || logic->GoronBracelet), }, { @@ -181,6 +189,8 @@ void AreaTable_Init_DeathMountain() { //Locations LOCATION(RC_DMC_WALL_FREESTANDING_POH, logic->FireTimer >= 16 || logic->Hearts >= 3), LOCATION(RC_DMC_GS_CRATE, (logic->FireTimer >= 8 || logic->Hearts >= 3) && logic->IsChild && logic->CanChildAttack), + LOCATION(RC_DMC_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns && logic->HasExplosives && (logic->FireTimer >= 16 || logic->Hearts >= 3)), + LOCATION(RC_DMC_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS) && logic->HasExplosives && (logic->FireTimer >= 16 || logic->Hearts >= 3)), LOCATION(RC_DMC_GOSSIP_STONE, logic->HasExplosives && (logic->FireTimer >= 16 || logic->Hearts >= 3)), }, { //Exits @@ -253,6 +263,8 @@ void AreaTable_Init_DeathMountain() { //Locations LOCATION(RC_DMC_UPPER_GROTTO_CHEST, true), LOCATION(RC_DMC_UPPER_GROTTO_FISH, logic->HasBottle), + LOCATION(RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_DMC_UPPER_GROTTO_GOSSIP_STONE, true), LOCATION(RC_DMC_UPPER_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives), LOCATION(RC_DMC_UPPER_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_dodongos_cavern.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_dodongos_cavern.cpp index 591705e51fc..f195b5cc606 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_dodongos_cavern.cpp @@ -32,6 +32,8 @@ void AreaTable_Init_DodongosCavern() { //Locations LOCATION(RC_DODONGOS_CAVERN_MAP_CHEST, Here(RR_DODONGOS_CAVERN_LOBBY, []{return logic->CanBlastOrSmash || logic->GoronBracelet;})), LOCATION(RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, logic->CanStunDeku || logic->GoronBracelet), + LOCATION(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_DODONGOS_CAVERN_GOSSIP_STONE, Here(RR_DODONGOS_CAVERN_LOBBY, []{return logic->CanBlastOrSmash || logic->GoronBracelet;})), }, { //Exits @@ -232,6 +234,8 @@ void AreaTable_Init_DodongosCavern() { LOCATION(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, logic->CanStunDeku), LOCATION(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, logic->CanStunDeku), LOCATION(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, logic->CanStunDeku), + LOCATION(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_DODONGOS_CAVERN_GOSSIP_STONE, true), }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp index 57cb2286b01..2ac35e2ab44 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp @@ -28,10 +28,12 @@ void AreaTable_Init_GerudoValley() { LOCATION(RC_GV_WATERFALL_FREESTANDING_POH, logic->IsChild || logic->Swim),//can use cucco as child LOCATION(RC_GV_GS_BEAN_PATCH, logic->CanPlantBugs && logic->CanChildAttack), LOCATION(RC_GV_COW, logic->IsChild && logic->CanUse(RG_EPONAS_SONG)), - LOCATION(RC_GV_GOSSIP_STONE, true), LOCATION(RC_GV_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_GV_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_GV_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_GV_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_GV_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_GV_GOSSIP_STONE, true), }, { //Exits Entrance(RR_GV_LOWER_STREAM, {[]{return true;}}), @@ -186,10 +188,12 @@ void AreaTable_Init_GerudoValley() { LOCATION(RC_COLOSSUS_GS_BEAN_PATCH, logic->CanPlantBugs && logic->CanChildAttack), LOCATION(RC_COLOSSUS_GS_TREE, logic->IsAdult && logic->HookshotOrBoomerang && logic->AtNight && logic->CanGetNightTimeGS), LOCATION(RC_COLOSSUS_GS_HILL, logic->IsAdult && logic->AtNight && ((CanPlantBean(RR_DESERT_COLOSSUS) && logic->CanAdultAttack) || logic->CanUse(RG_LONGSHOT) || (randoCtx->GetTrickOption(RT_COLOSSUS_GS) && logic->CanUse(RG_HOOKSHOT))) && logic->CanGetNightTimeGS), - LOCATION(RC_COLOSSUS_GOSSIP_STONE, true), LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_GOSSIP_STONE, true), }, { //Exits Entrance(RR_COLOSSUS_GREAT_FAIRY_FOUNTAIN, {[]{return logic->HasExplosives;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp index 352ed05696d..73b53d56ed1 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp @@ -34,6 +34,8 @@ void AreaTable_Init_HyruleField() { //Locations LOCATION(RC_HF_SOUTHEAST_GROTTO_CHEST, true), LOCATION(RC_HF_SOUTHEAST_GROTTO_FISH, logic->HasBottle), + LOCATION(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_HF_SOUTHEAST_GROTTO_GOSSIP_STONE, true), LOCATION(RC_HF_SOUTHEAST_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives), LOCATION(RC_HF_SOUTHEAST_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives), @@ -46,6 +48,8 @@ void AreaTable_Init_HyruleField() { //Locations LOCATION(RC_HF_OPEN_GROTTO_CHEST, true), LOCATION(RC_HF_OPEN_GROTTO_FISH, logic->HasBottle), + LOCATION(RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_HF_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_HF_OPEN_GROTTO_GOSSIP_STONE, true), LOCATION(RC_HF_OPEN_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives), LOCATION(RC_HF_OPEN_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives), @@ -67,6 +71,8 @@ void AreaTable_Init_HyruleField() { //Locations LOCATION(RC_HF_GS_COW_GROTTO, logic->HasFireSource && logic->HookshotOrBoomerang), LOCATION(RC_HF_COW_GROTTO_COW, logic->HasFireSource && logic->CanUse(RG_EPONAS_SONG)), + LOCATION(RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY, logic->HasFireSource && logic->CanSummonGossipFairy), + LOCATION(RC_HF_COW_GROTTO_GOSSIP_STONE_FAIRY_BIG, logic->HasFireSource && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_HF_COW_GROTTO_GOSSIP_STONE, logic->HasFireSource), }, { //Exits @@ -77,6 +83,8 @@ void AreaTable_Init_HyruleField() { //Locations LOCATION(RC_HF_NEAR_MARKET_GROTTO_CHEST, true), LOCATION(RC_HF_NEAR_MARKET_GROTTO_FISH, logic->HasBottle), + LOCATION(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_HF_NEAR_MARKET_GROTTO_GOSSIP_STONE, true), LOCATION(RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives), LOCATION(RC_HF_NEAR_MARKET_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives), @@ -139,6 +147,12 @@ void AreaTable_Init_HyruleField() { LOCATION(RC_LH_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LH_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LH_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LH_LAB_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_LH_LAB_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LH_LAB_GOSSIP_STONE, true), LOCATION(RC_LH_SOUTHEAST_GOSSIP_STONE, true), LOCATION(RC_LH_SOUTHWEST_GOSSIP_STONE, true), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp index 5df1b9a5379..18de3f53eed 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_kakariko.cpp @@ -198,6 +198,8 @@ void AreaTable_Init_Kakariko() { //Locations LOCATION(RC_KAK_OPEN_GROTTO_CHEST, true), LOCATION(RC_KAK_OPEN_GROTTO_FISH, logic->HasBottle), + LOCATION(RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_KAK_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_KAK_OPEN_GROTTO_GOSSIP_STONE, true), LOCATION(RC_KAK_OPEN_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives), LOCATION(RC_KAK_OPEN_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives), @@ -292,6 +294,8 @@ void AreaTable_Init_Kakariko() { EventAccess(&logic->GossipStoneFairy, {[]{return logic->GossipStoneFairy || logic->CanSummonGossipFairyWithoutSuns;}}), }, { //Locations + LOCATION(RC_GRAVEYARD_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_GRAVEYARD_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_GRAVEYARD_GOSSIP_STONE, true), }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp index b9c07bfaea3..15babf1a3ae 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp @@ -18,6 +18,8 @@ void AreaTable_Init_LostWoods() { LOCATION(RC_KF_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_KF_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_KF_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_KF_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_KF_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_KF_GOSSIP_STONE, true), }, { //Exits @@ -40,6 +42,10 @@ void AreaTable_Init_LostWoods() { EventAccess(&logic->ShowedMidoSwordAndShield, {[]{return logic->ShowedMidoSwordAndShield || (logic->IsChild && logic->KokiriSword && logic->DekuShield);}}), }, { //Locations + LOCATION(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, true), LOCATION(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, true), }, { @@ -101,6 +107,8 @@ void AreaTable_Init_LostWoods() { //Locations LOCATION(RC_KF_STORMS_GROTTO_CHEST, true), LOCATION(RC_KF_STORMS_GROTTO_FISH, logic->HasBottle), + LOCATION(RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_KF_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_KF_STORMS_GROTTO_GOSSIP_STONE, true), LOCATION(RC_KF_STORMS_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives), LOCATION(RC_KF_STORMS_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives), @@ -141,6 +149,8 @@ void AreaTable_Init_LostWoods() { LOCATION(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LW_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_LW_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_GOSSIP_STONE, true), }, { //Exits @@ -177,6 +187,8 @@ void AreaTable_Init_LostWoods() { //Locations LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, true), LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_FISH, logic->HasBottle), + LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_GOSSIP_STONE, true), LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives), LOCATION(RC_LW_NEAR_SHORTCUTS_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives), @@ -219,6 +231,12 @@ void AreaTable_Init_LostWoods() { LOCATION(RC_SONG_FROM_SARIA, logic->IsChild && logic->ZeldasLetter), LOCATION(RC_SHEIK_IN_FOREST, logic->IsAdult), LOCATION(RC_SFM_GS, logic->IsAdult && logic->HookshotOrBoomerang && logic->AtNight && logic->CanGetNightTimeGS), + LOCATION(RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_SFM_MAZE_LOWER_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_SFM_MAZE_UPPER_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_SFM_SARIA_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_SFM_SARIA_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_SFM_MAZE_LOWER_GOSSIP_STONE, true), LOCATION(RC_SFM_MAZE_UPPER_GOSSIP_STONE, true), LOCATION(RC_SFM_SARIA_GOSSIP_STONE, true), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp index 61612395371..b9d7aef6669 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_zoras_domain.cpp @@ -37,6 +37,10 @@ void AreaTable_Init_ZorasDomain() { LOCATION(RC_ZR_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_ZR_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_ZR_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, true), LOCATION(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, true), }, { @@ -59,6 +63,8 @@ void AreaTable_Init_ZorasDomain() { //Locations LOCATION(RC_ZR_OPEN_GROTTO_CHEST, true), LOCATION(RC_ZR_OPEN_GROTTO_FISH, logic->HasBottle), + LOCATION(RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), + LOCATION(RC_ZR_OPEN_GROTTO_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_ZR_OPEN_GROTTO_GOSSIP_STONE, true), LOCATION(RC_ZR_OPEN_GROTTO_BEEHIVE_LEFT, logic->CanBreakLowerBeehives), LOCATION(RC_ZR_OPEN_GROTTO_BEEHIVE_RIGHT, logic->CanBreakLowerBeehives), @@ -116,6 +122,8 @@ void AreaTable_Init_ZorasDomain() { LOCATION(RC_ZD_FISH_3, logic->IsChild && logic->HasBottle), LOCATION(RC_ZD_FISH_4, logic->IsChild && logic->HasBottle), LOCATION(RC_ZD_FISH_5, logic->IsChild && logic->HasBottle), + LOCATION(RC_ZD_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_ZD_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_ZD_GOSSIP_STONE, true), LOCATION(RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_LEFT, logic->CanBreakUpperBeehives), LOCATION(RC_ZD_IN_FRONT_OF_KING_ZORA_BEEHIVE_RIGHT, logic->CanBreakUpperBeehives), @@ -181,6 +189,10 @@ void AreaTable_Init_ZorasDomain() { LOCATION(RC_ZF_GS_TREE, logic->IsChild), LOCATION(RC_ZF_GS_ABOVE_THE_LOG, logic->IsChild && logic->HookshotOrBoomerang && logic->AtNight && logic->CanGetNightTimeGS), LOCATION(RC_ZF_GS_HIDDEN_CAVE, logic->CanUse(RG_SILVER_GAUNTLETS) && logic->CanBlastOrSmash && logic->HookshotOrBoomerang && logic->IsAdult && logic->AtNight && logic->CanGetNightTimeGS), + LOCATION(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_ZF_FAIRY_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_ZF_JABU_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_ZF_JABU_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_ZF_FAIRY_GOSSIP_STONE, true), LOCATION(RC_ZF_JABU_GOSSIP_STONE, true), }, { diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index efc1904070c..ebf1e4ea1c8 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -215,6 +215,8 @@ Dungeons::Dungeons() { RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, RC_DODONGOS_CAVERN_GS_BACK_ROOM, RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, + RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, + RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, }, { // MQ Locations @@ -233,6 +235,8 @@ Dungeons::Dungeons() { RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, + RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, + RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, }, {}, { diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index d4b824bae94..a29523d840e 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -599,10 +599,6 @@ std::vector Rando::StaticData::overworldLocations = { RC_DMT_GOSSIP_STONE_FAIRY_BIG, RC_COLOSSUS_GOSSIP_STONE_FAIRY, RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, - RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, - RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, - RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, - RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, RC_GV_GOSSIP_STONE_FAIRY, RC_GV_GOSSIP_STONE_FAIRY_BIG, RC_GC_MAZE_GOSSIP_STONE_FAIRY, diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index 5d5302657d1..c76119a1465 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -595,7 +595,7 @@ namespace Rando { CanLeaveForest = ctx->GetOption(RSK_FOREST).IsNot(RO_FOREST_CLOSED) || IsAdult || DekuTreeClear || ctx->GetOption(RSK_SHUFFLE_INTERIOR_ENTRANCES) || ctx->GetOption(RSK_SHUFFLE_OVERWORLD_ENTRANCES); CanPlantBugs = IsChild && CanUse(RG_BOTTLE_WITH_BUGS); CanRideEpona = IsAdult && Epona && CanUse(RG_EPONAS_SONG); - CanSummonGossipFairyWithoutSuns = CanUse(RG_ZELDAS_LULLABY) || CanUse(RG_EPONAS_SONG) || CanUse(RG_SARIAS_SONG) || CanUse(RG_SONG_OF_TIME); + CanSummonGossipFairyWithoutSuns = CanUse(RG_ZELDAS_LULLABY) || CanUse(RG_EPONAS_SONG) || CanUse(RG_SONG_OF_TIME); CanSummonGossipFairy = CanSummonGossipFairyWithoutSuns || CanUse(RG_SUNS_SONG); Hearts = ctx->GetSaveContext()->healthCapacity / 16; EffectiveHealth = ((Hearts << (2 + DoubleDefense)) >> Multiplier) + ((Hearts << (2 + DoubleDefense)) % (1 << Multiplier) > 0); //Number of half heart hits to die, ranges from 1 to 160 From 174554c6e24206f49bfd44f3161720421177cbe0 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Mon, 9 Sep 2024 23:30:19 -0700 Subject: [PATCH 45/54] Add Desert Colossus Oasis --- .../location_access/locacc_gerudo_valley.cpp | 14 ++++++++--- .../Enhancements/randomizer/location_list.cpp | 24 +++++++++++++++++++ .../Enhancements/randomizer/randomizerTypes.h | 9 +++++++ .../Enhancements/randomizer/randomizer_inf.h | 8 +++++++ 4 files changed, 52 insertions(+), 3 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp index 2ac35e2ab44..a3ee37a3258 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp @@ -188,9 +188,17 @@ void AreaTable_Init_GerudoValley() { LOCATION(RC_COLOSSUS_GS_BEAN_PATCH, logic->CanPlantBugs && logic->CanChildAttack), LOCATION(RC_COLOSSUS_GS_TREE, logic->IsAdult && logic->HookshotOrBoomerang && logic->AtNight && logic->CanGetNightTimeGS), LOCATION(RC_COLOSSUS_GS_HILL, logic->IsAdult && logic->AtNight && ((CanPlantBean(RR_DESERT_COLOSSUS) && logic->CanAdultAttack) || logic->CanUse(RG_LONGSHOT) || (randoCtx->GetTrickOption(RT_COLOSSUS_GS) && logic->CanUse(RG_HOOKSHOT))) && logic->CanGetNightTimeGS), - LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_OASIS_FAIRY_1, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_OASIS_FAIRY_2, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_OASIS_FAIRY_3, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_OASIS_FAIRY_4, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_OASIS_FAIRY_5, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_OASIS_FAIRY_6, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_OASIS_FAIRY_7, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_OASIS_FAIRY_8, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_COLOSSUS_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_COLOSSUS_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), LOCATION(RC_COLOSSUS_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_COLOSSUS_GOSSIP_STONE, true), diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index a29523d840e..9f04dd5d4ba 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -553,6 +553,14 @@ std::vector Rando::StaticData::overworldLocations = { RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, + RC_COLOSSUS_OASIS_FAIRY_1, + RC_COLOSSUS_OASIS_FAIRY_2, + RC_COLOSSUS_OASIS_FAIRY_3, + RC_COLOSSUS_OASIS_FAIRY_4, + RC_COLOSSUS_OASIS_FAIRY_5, + RC_COLOSSUS_OASIS_FAIRY_6, + RC_COLOSSUS_OASIS_FAIRY_7, + RC_COLOSSUS_OASIS_FAIRY_8, RC_ZR_BEAN_SPROUT_FAIRY_1, RC_ZR_BEAN_SPROUT_FAIRY_2, @@ -788,6 +796,14 @@ std::vector Rando::StaticData::overworldFairyLocations = { RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_6, RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_7, RC_GRAVEYARD_SHIELD_GRAVE_FAIRY_8, + RC_COLOSSUS_OASIS_FAIRY_1, + RC_COLOSSUS_OASIS_FAIRY_2, + RC_COLOSSUS_OASIS_FAIRY_3, + RC_COLOSSUS_OASIS_FAIRY_4, + RC_COLOSSUS_OASIS_FAIRY_5, + RC_COLOSSUS_OASIS_FAIRY_6, + RC_COLOSSUS_OASIS_FAIRY_7, + RC_COLOSSUS_OASIS_FAIRY_8, RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY, RC_TOT_LEFTMOST_GOSSIP_STONE_FAIRY_BIG, RC_TOT_LEFT_CENTER_GOSSIP_STONE_FAIRY, @@ -1871,6 +1887,14 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x05, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, "MQ Scrubs Fairy 6", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x06, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, "MQ Scrubs Fairy 7", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); locationTable[RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8] = Location::Fairy(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, 0x07, RAND_INF_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, "MQ Scrubs Fairy 8", RHT_GANONS_CASTLE_SCRUBS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_COLOSSUS_OASIS_FAIRY_1] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_1, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x00, RAND_INF_COLOSSUS_OASIS_FAIRY_1, "Oasis Fairy 1", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_COLOSSUS_OASIS_FAIRY_2] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_2, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x01, RAND_INF_COLOSSUS_OASIS_FAIRY_2, "Oasis Fairy 2", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_COLOSSUS_OASIS_FAIRY_3] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_3, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x02, RAND_INF_COLOSSUS_OASIS_FAIRY_3, "Oasis Fairy 3", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_COLOSSUS_OASIS_FAIRY_4] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_4, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x03, RAND_INF_COLOSSUS_OASIS_FAIRY_4, "Oasis Fairy 4", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_COLOSSUS_OASIS_FAIRY_5] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_5, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x04, RAND_INF_COLOSSUS_OASIS_FAIRY_5, "Oasis Fairy 5", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_COLOSSUS_OASIS_FAIRY_6] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_6, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x05, RAND_INF_COLOSSUS_OASIS_FAIRY_6, "Oasis Fairy 6", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_COLOSSUS_OASIS_FAIRY_7] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_7, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x06, RAND_INF_COLOSSUS_OASIS_FAIRY_7, "Oasis Fairy 7", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_COLOSSUS_OASIS_FAIRY_8] = Location::Fairy(RC_COLOSSUS_OASIS_FAIRY_8, RCQUEST_BOTH, RCAREA_DESERT_COLOSSUS, SCENE_DESERT_COLOSSUS, 0x07, RAND_INF_COLOSSUS_OASIS_FAIRY_8, "Oasis Fairy 8", RHT_COLOSSUS_OASIS_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); locationTable[RC_ZR_BEAN_SPROUT_FAIRY_1] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_1, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0300, RAND_INF_ZR_BEAN_SPROUT_FAIRY_1, "Bean Sprout Fairy 1", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); locationTable[RC_ZR_BEAN_SPROUT_FAIRY_2] = Location::Fairy(RC_ZR_BEAN_SPROUT_FAIRY_2, RCQUEST_BOTH, RCAREA_ZORAS_RIVER, SCENE_ZORAS_RIVER, 0x0301, RAND_INF_ZR_BEAN_SPROUT_FAIRY_2, "Bean Sprout Fairy 2", RHT_ZR_BEAN_SPROUT_FAIRY, SpoilerCollectionCheckGroup::GROUP_ZORAS_RIVER); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index c51ce459d66..2559f450ec0 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1716,6 +1716,14 @@ typedef enum { RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, + RC_COLOSSUS_OASIS_FAIRY_1, + RC_COLOSSUS_OASIS_FAIRY_2, + RC_COLOSSUS_OASIS_FAIRY_3, + RC_COLOSSUS_OASIS_FAIRY_4, + RC_COLOSSUS_OASIS_FAIRY_5, + RC_COLOSSUS_OASIS_FAIRY_6, + RC_COLOSSUS_OASIS_FAIRY_7, + RC_COLOSSUS_OASIS_FAIRY_8, RC_ZR_BEAN_SPROUT_FAIRY_1, RC_ZR_BEAN_SPROUT_FAIRY_2, RC_ZR_BEAN_SPROUT_FAIRY_3, @@ -3821,6 +3829,7 @@ typedef enum { RHT_GF_FAIRY_GROTTO_FAIRY, RHT_GRAVEYARD_SHIELD_GRAVE_FAIRY, RHT_GANONS_CASTLE_SCRUBS_FAIRY, + RHT_COLOSSUS_OASIS_FAIRY, RHT_ZR_BEAN_SPROUT_FAIRY, RHT_KF_BEAN_SPROUT_FAIRY, RHT_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY, diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index ac27e933b6c..0ef02d506ab 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -371,6 +371,14 @@ typedef enum { 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, RAND_INF_ZR_BEAN_SPROUT_FAIRY_1, RAND_INF_ZR_BEAN_SPROUT_FAIRY_2, From d5dc2bdf88e106edd9bdc32372cd1ba53f7f97c4 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Mon, 9 Sep 2024 23:35:08 -0700 Subject: [PATCH 46/54] Restrict fairy type Somehow, it was previously possible for Navi to get detected as a randomized fairy and rendered as an item. I was not able to reproduce the behavior, but this should prevent it from happening again. --- soh/soh/Enhancements/randomizer/fairy_shuffle.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp index ce82f65d37e..018f60e524d 100644 --- a/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp +++ b/soh/soh/Enhancements/randomizer/fairy_shuffle.cpp @@ -21,6 +21,9 @@ void FairyDrawRandomizedItem(EnElf* enElf, PlayState* play) { } bool FairyInitialise(EnElf* fairy, int32_t params) { + if (fairy->actor.params != FAIRY_HEAL_TIMED && fairy->actor.params != FAIRY_HEAL && fairy->actor.params != FAIRY_HEAL_BIG) { + return false; + } s16 sceneNum = gPlayState->sceneNum; if (sceneNum == SCENE_TEMPLE_OF_TIME_EXTERIOR_NIGHT || sceneNum == SCENE_TEMPLE_OF_TIME_EXTERIOR_RUINS) { sceneNum = SCENE_TEMPLE_OF_TIME_EXTERIOR_DAY; From 0e8313166f63c968bb06d7acb0bc9f11e3713b12 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Wed, 11 Sep 2024 23:15:01 -0700 Subject: [PATCH 47/54] Add overworld special fairy spots --- .../location_access/locacc_death_mountain.cpp | 1 + .../location_access/locacc_gerudo_valley.cpp | 1 + .../location_access/locacc_hyrule_field.cpp | 2 ++ .../location_access/locacc_lost_woods.cpp | 5 +++-- .../Enhancements/randomizer/location_list.cpp | 17 +++++++++++++++++ .../Enhancements/randomizer/randomizerTypes.h | 10 ++++++++++ .../Enhancements/randomizer/randomizer_inf.h | 6 ++++++ 7 files changed, 40 insertions(+), 2 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp index 68e47f03f2d..04215d00b69 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_death_mountain.cpp @@ -18,6 +18,7 @@ void AreaTable_Init_DeathMountain() { LOCATION(RC_DMT_BEAN_SPROUT_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives || logic->HasItem(RG_GORONS_BRACELET))), LOCATION(RC_DMT_BEAN_SPROUT_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives || logic->HasItem(RG_GORONS_BRACELET))), LOCATION(RC_DMT_BEAN_SPROUT_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS) && (logic->HasExplosives || logic->HasItem(RG_GORONS_BRACELET))), + LOCATION(RC_DMT_FLAG_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), }, { //Exits Entrance(RR_KAK_BEHIND_GATE, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp index a3ee37a3258..349f347b27d 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_valley.cpp @@ -115,6 +115,7 @@ void AreaTable_Init_GerudoValley() { LOCATION(RC_GF_GERUDO_MEMBERSHIP_CARD, logic->CanFinishGerudoFortress), LOCATION(RC_GF_GS_ARCHERY_RANGE, logic->IsAdult && logic->HookshotOrBoomerang && logic->GerudoToken && logic->AtNight && logic->CanGetNightTimeGS), LOCATION(RC_GF_GS_TOP_FLOOR, logic->IsAdult && logic->AtNight && (logic->CanJumpslash || 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->GerudoToken || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_HOVER_BOOTS) || randoCtx->GetTrickOption(RT_GF_KITCHEN) || randoCtx->GetTrickOption(RT_GF_JUMP)) && logic->CanGetNightTimeGS), + 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;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp index 73b53d56ed1..9fe23d82ced 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_hyrule_field.cpp @@ -11,6 +11,7 @@ void AreaTable_Init_HyruleField() { //Locations LOCATION(RC_HF_OCARINA_OF_TIME_ITEM, logic->IsChild && logic->HasAllStones), LOCATION(RC_SONG_FROM_OCARINA_OF_TIME, logic->IsChild && logic->HasAllStones), + LOCATION(RC_HF_POND_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), }, { //Exits Entrance(RR_LW_BRIDGE, {[]{return true;}}), @@ -153,6 +154,7 @@ void AreaTable_Init_HyruleField() { LOCATION(RC_LH_SOUTHEAST_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairy), LOCATION(RC_LH_SOUTHWEST_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LH_ISLAND_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG) && ((logic->HasItem(RG_BRONZE_SCALE) && (logic->IsChild || logic->WaterTempleClear)) || logic->CanUse(RG_DISTANT_SCARECROW))), LOCATION(RC_LH_LAB_GOSSIP_STONE, true), LOCATION(RC_LH_SOUTHEAST_GOSSIP_STONE, true), LOCATION(RC_LH_SOUTHWEST_GOSSIP_STONE, true), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp index 15babf1a3ae..41007dd960c 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_lost_woods.cpp @@ -149,8 +149,9 @@ void AreaTable_Init_LostWoods() { LOCATION(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_1, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_2, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_BEAN_SPROUT_NEAR_BRIDGE_FAIRY_3, logic->IsChild && logic->HasItem(RG_MAGIC_BEAN) && logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_LW_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns), - LOCATION(RC_LW_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LW_GOSSIP_STONE_FAIRY, logic->CanSummonGossipFairyWithoutSuns), + LOCATION(RC_LW_GOSSIP_STONE_FAIRY_BIG, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_LW_SHORTCUT_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_LW_GOSSIP_STONE, true), }, { //Exits diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 9f04dd5d4ba..3c8d110ad33 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -671,6 +671,12 @@ std::vector Rando::StaticData::overworldLocations = { RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, + + RC_LH_ISLAND_SUN_FAIRY, + RC_HF_POND_STORMS_FAIRY, + RC_DMT_FLAG_SUN_FAIRY, + RC_LW_SHORTCUT_STORMS_FAIRY, + RC_GF_KITCHEN_SUN_FAIRY, }; std::vector Rando::StaticData::gossipStoneLocations = { @@ -886,6 +892,11 @@ std::vector Rando::StaticData::overworldFairyLocations = { RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_LH_ISLAND_SUN_FAIRY, + RC_HF_POND_STORMS_FAIRY, + RC_DMT_FLAG_SUN_FAIRY, + RC_LW_SHORTCUT_STORMS_FAIRY, + RC_GF_KITCHEN_SUN_FAIRY, }; typedef enum { @@ -2010,6 +2021,12 @@ void Rando::StaticData::InitLocationTable() { // locationTable[RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY] = Location::Fairy(RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS( 0x6, -236), RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, "Upper Grotto Gossip Stone Fairy", RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); locationTable[RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG] = Location::Fairy(RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_GROTTOS, TWO_ACTOR_PARAMS(0x1006, -236), RAND_INF_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, "Upper Grotto Gossip Stone Big Fairy", RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + locationTable[RC_LH_ISLAND_SUN_FAIRY] = Location::Fairy(RC_LH_ISLAND_SUN_FAIRY, RCQUEST_BOTH, RCAREA_LAKE_HYLIA, SCENE_LAKE_HYLIA, TWO_ACTOR_PARAMS(0x1000, 7319), RAND_INF_LH_ISLAND_SUN_FAIRY, "Island Sun's Song Fairy", RHT_LH_ISLAND_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_LAKE_HYLIA); + locationTable[RC_HF_POND_STORMS_FAIRY] = Location::Fairy(RC_HF_POND_STORMS_FAIRY, RCQUEST_BOTH, RCAREA_HYRULE_FIELD, SCENE_HYRULE_FIELD, TWO_ACTOR_PARAMS(0x1000, 5012), RAND_INF_HF_POND_STORMS_FAIRY, "Pond Song of Storms Fairy", RHT_HF_POND_STORMS_FAIRY, SpoilerCollectionCheckGroup::GROUP_HYRULE_FIELD); + 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), RAND_INF_DMT_FLAG_SUN_FAIRY, "Flag Sun's Song Fairy", RHT_DMT_FLAG_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DEATH_MOUNTAIN); + 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), RAND_INF_LW_SHORTCUT_STORMS_FAIRY, "Shortcuts Song of Storms Fairy", RHT_LW_SHORTCUT_STORMS_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); + 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), RAND_INF_GF_KITCHEN_SUN_FAIRY, "Kitchen Sun's Song Fairy", RHT_GF_KITCHEN_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); locationTable[RC_DMT_GOSSIP_STONE] = Location::HintStone(RC_DMT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 14340, 0x04, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 2559f450ec0..ad77b1c905a 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1836,6 +1836,11 @@ typedef enum { RC_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, RC_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RC_LH_ISLAND_SUN_FAIRY, + RC_HF_POND_STORMS_FAIRY, + RC_DMT_FLAG_SUN_FAIRY, + RC_LW_SHORTCUT_STORMS_FAIRY, + RC_GF_KITCHEN_SUN_FAIRY, RC_MAX } RandomizerCheck; @@ -3910,6 +3915,11 @@ typedef enum { RHT_DMT_STORMS_GROTTO_GOSSIP_STONE_FAIRY_BIG, RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY, RHT_DMC_UPPER_GROTTO_GOSSIP_STONE_FAIRY_BIG, + RHT_LH_ISLAND_SUN_FAIRY, + RHT_HF_POND_STORMS_FAIRY, + RHT_DMT_FLAG_SUN_FAIRY, + RHT_LW_SHORTCUT_STORMS_FAIRY, + RHT_GF_KITCHEN_SUN_FAIRY, RHT_MAX } RandomizerHintTextKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 0ef02d506ab..de0a0369744 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -493,6 +493,12 @@ typedef enum { 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, + + RAND_INF_LH_ISLAND_SUN_FAIRY, + RAND_INF_HF_POND_STORMS_FAIRY, + RAND_INF_DMT_FLAG_SUN_FAIRY, + RAND_INF_LW_SHORTCUT_STORMS_FAIRY, + RAND_INF_GF_KITCHEN_SUN_FAIRY, // 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, From d31b791fb57232519ecf7495e963e3a9ea56e688 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Thu, 12 Sep 2024 22:30:25 -0700 Subject: [PATCH 48/54] Add mini-dungeon fairy song spots --- .../randomizer/3drando/item_pool.cpp | 83 ++++++++++++------- .../locacc_bottom_of_the_well.cpp | 3 + .../locacc_gerudo_training_grounds.cpp | 1 + .../location_access/locacc_ice_cavern.cpp | 5 +- soh/soh/Enhancements/randomizer/dungeon.cpp | 5 ++ .../Enhancements/randomizer/location_list.cpp | 6 ++ .../Enhancements/randomizer/randomizerTypes.h | 10 +++ .../Enhancements/randomizer/randomizer_inf.h | 5 ++ 8 files changed, 86 insertions(+), 32 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 4b82dfba84f..131dbe54981 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -618,6 +618,51 @@ static void PlaceVanillaOverworldFish() { } } +static void PlaceVanillaFairies() { + auto ctx = Rando::Context::GetInstance(); + for (auto rc : Rando::StaticData::overworldFairyLocations) { + ctx->PlaceItemInLocation(rc, GetJunkItem(), false, true); + } + if (ctx->GetDungeon(Rando::GANONS_CASTLE)->IsMQ()) { + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, GetJunkItem(), false, true); + } else { + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_1, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_2, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_3, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_4, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_5, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_6, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_7, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_8, GetJunkItem(), false, true); + } + if (ctx->GetDungeon(Rando::DODONGOS_CAVERN)->IsMQ()) { + ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, GetJunkItem(), false, true); + } else { + ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, GetJunkItem(), false, true); + } + if (ctx->GetDungeon(Rando::BOTTOM_OF_THE_WELL)->IsMQ()) { + ctx->PlaceItemInLocation(RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, GetJunkItem(), false, true); + } else { + ctx->PlaceItemInLocation(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, GetJunkItem(), false, true); + } + if (ctx->GetDungeon(Rando::ICE_CAVERN)->IsVanilla()) { + ctx->PlaceItemInLocation(RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, GetJunkItem(), false, true); + } + if (ctx->GetDungeon(Rando::GERUDO_TRAINING_GROUNDS)->IsVanilla()) { + ctx->PlaceItemInLocation(RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, GetJunkItem(), false, true); + } +} + static void SetScarceItemPool() { ReplaceMaxItem(RG_PROGRESSIVE_BOMBCHUS, 3); ReplaceMaxItem(RG_BOMBCHU_5, 1); @@ -1170,40 +1215,16 @@ void GenerateItemPool() { for (auto rc : Rando::StaticData::overworldFairyLocations) { AddItemToMainPool(GetJunkItem()); } - // 8 extra for Ganon's Castle + 2 extra for Dodongo's Cavern - for (int i = 0; i < 10; i++) { + // 8 extra for Ganon's Castle + 2 Dodongo's Cavern Gossip Stone + int extra = 10; + extra += ctx->GetDungeon(Rando::BOTTOM_OF_THE_WELL)->IsVanilla() ? 1 : 2; + extra += ctx->GetDungeon(Rando::ICE_CAVERN)->IsVanilla() ? 1 : 0; + extra += ctx->GetDungeon(Rando::GERUDO_TRAINING_GROUNDS)->IsVanilla() ? 1 : 0; + for (int i = 0; i < extra; i++) { AddItemToMainPool(GetJunkItem()); } } else { - for (auto rc : Rando::StaticData::overworldFairyLocations) { - ctx->PlaceItemInLocation(rc, GetJunkItem(), false, true); - } - if (ctx->GetDungeon(Rando::GANONS_CASTLE)->IsMQ()) { - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_1, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_2, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_3, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_4, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_5, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_6, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_7, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_MQ_SCRUBS_FAIRY_8, GetJunkItem(), false, true); - } else { - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_1, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_2, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_3, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_4, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_5, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_6, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_7, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SCRUBS_FAIRY_8, GetJunkItem(), false, true); - } - if (ctx->GetDungeon(Rando::DODONGOS_CAVERN)->IsMQ()) { - ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_MQ_GOSSIP_STONE_FAIRY_BIG, GetJunkItem(), false, true); - } else { - ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, GetJunkItem(), false, true); - ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, GetJunkItem(), false, true); - } + PlaceVanillaFairies(); } //Scrubsanity diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp index 44260c7ebe4..a20102819e3 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_bottom_of_the_well.cpp @@ -42,6 +42,7 @@ void AreaTable_Init_BottomOfTheWell() { LOCATION(RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, logic->Boomerang && (randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 3)), LOCATION(RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, logic->Boomerang && (randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 3)), LOCATION(RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 3) && (randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->Boomerang), + LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, (randoCtx->GetTrickOption(RT_LENS_BOTW) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->CanUse(RG_SUNS_SONG)), }, { //Exits Entrance(RR_BOTTOM_OF_THE_WELL_ENTRYWAY, {[]{return true;}}), @@ -62,6 +63,7 @@ void AreaTable_Init_BottomOfTheWell() { //Trick: logic->HasExplosives || (LogicBotWMQDeadHandKey && logic->Boomerang) LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, logic->CanChildAttack), LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, logic->CanChildAttack && logic->SmallKeys(RR_BOTTOM_OF_THE_WELL, 2)), + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), }, { //Exits Entrance(RR_BOTTOM_OF_THE_WELL_ENTRYWAY, {[]{return true;}}), @@ -76,6 +78,7 @@ void AreaTable_Init_BottomOfTheWell() { LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, true), LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, logic->CanChildAttack && (randoCtx->GetTrickOption(RT_BOTW_MQ_PITS) || logic->HasExplosives)), //Trick: logic->CanChildAttack && (LogicBotWMQPits || logic->HasExplosives) + LOCATION(RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), }, { //Exits Entrance(RR_BOTTOM_OF_THE_WELL_MQ_PERIMETER, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp index c0a2ab2bc16..b3320401095 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_gerudo_training_grounds.cpp @@ -25,6 +25,7 @@ void AreaTable_Init_GerudoTrainingGrounds() { LOCATION(RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT)), LOCATION(RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD)), LOCATION(RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, logic->HasExplosives && (logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD))), + LOCATION(RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), }, { //Exits Entrance(RR_GERUDO_TRAINING_GROUNDS_ENTRYWAY, {[]{return true;}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp index 7f5873ba17a..96206e6c3f2 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ice_cavern.cpp @@ -19,7 +19,10 @@ void AreaTable_Init_IceCavern() { | VANILLA DUNGEON | ---------------------------*/ if (randoCtx->GetDungeon(ICE_CAVERN)->IsVanilla()) { - areaTable[RR_ICE_CAVERN_BEGINNING] = Area("Ice Cavern Beginning", "Ice Cavern", RA_ICE_CAVERN, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_ICE_CAVERN_BEGINNING] = Area("Ice Cavern Beginning", "Ice Cavern", RA_ICE_CAVERN, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), + }, { //Exits Entrance(RR_ICE_CAVERN_ENTRYWAY, {[]{return true;}}), Entrance(RR_ICE_CAVERN_MAIN, {[]{return Here(RR_ICE_CAVERN_BEGINNING, []{return (logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD)) || logic->CanUse(RG_MEGATON_HAMMER) || logic->HasExplosives || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_DINS_FIRE);});}}), diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index ebf1e4ea1c8..1dd18f8bab8 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -575,6 +575,7 @@ Dungeons::Dungeons() { RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, + RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, }, { // MQ Locations @@ -586,6 +587,8 @@ Dungeons::Dungeons() { RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, + RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, + RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, }, {}, {}); dungeonList[ICE_CAVERN] = DungeonInfo("Ice Cavern", RHT_ICE_CAVERN, RG_ICE_CAVERN_MAP, RG_ICE_CAVERN_COMPASS, @@ -599,6 +602,7 @@ Dungeons::Dungeons() { RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, + RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, }, { // MQ Locations @@ -642,6 +646,7 @@ Dungeons::Dungeons() { RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, + RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, }, { // MQ Locations diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 3c8d110ad33..435ce5aab90 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -2027,6 +2027,12 @@ void Rando::StaticData::InitLocationTable() { // 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), RAND_INF_LW_SHORTCUT_STORMS_FAIRY, "Shortcuts Song of Storms Fairy", RHT_LW_SHORTCUT_STORMS_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); 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), RAND_INF_GF_KITCHEN_SUN_FAIRY, "Kitchen Sun's Song Fairy", RHT_GF_KITCHEN_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1531), RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, "Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -437), RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, "MQ East Cell Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1458), RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, "MQ Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(0x1000, 1186), RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, "Entrance Song of Storms Fairy", RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(0x1000, -445), RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, "Entrance Song of Storms Fairy", RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); locationTable[RC_DMT_GOSSIP_STONE] = Location::HintStone(RC_DMT_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_TRAIL, SCENE_DEATH_MOUNTAIN_TRAIL, 14340, 0x04, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index ad77b1c905a..2ab0ad7d100 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1841,6 +1841,11 @@ typedef enum { RC_DMT_FLAG_SUN_FAIRY, RC_LW_SHORTCUT_STORMS_FAIRY, RC_GF_KITCHEN_SUN_FAIRY, + RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, + RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, + RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, + RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, + RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, RC_MAX } RandomizerCheck; @@ -3920,6 +3925,11 @@ typedef enum { RHT_DMT_FLAG_SUN_FAIRY, RHT_LW_SHORTCUT_STORMS_FAIRY, RHT_GF_KITCHEN_SUN_FAIRY, + RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, + RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, + RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, + RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, + RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, RHT_MAX } RandomizerHintTextKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index de0a0369744..e66979d4b25 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -499,6 +499,11 @@ typedef enum { RAND_INF_DMT_FLAG_SUN_FAIRY, RAND_INF_LW_SHORTCUT_STORMS_FAIRY, RAND_INF_GF_KITCHEN_SUN_FAIRY, + RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, + RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, + RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, + RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, + RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, // 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, From 727202c9a01bb5660f2c7bee4fbec7590daca579 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Fri, 13 Sep 2024 00:04:02 -0700 Subject: [PATCH 49/54] Add remaining dungeons except Shadow --- .../randomizer/3drando/item_pool.cpp | 22 +++++++++++++++++++ .../location_access/locacc_fire_temple.cpp | 2 ++ .../location_access/locacc_ganons_castle.cpp | 1 + .../location_access/locacc_spirit_temple.cpp | 3 +++ .../location_access/locacc_water_temple.cpp | 7 +++++- soh/soh/Enhancements/randomizer/dungeon.cpp | 9 ++++++++ .../Enhancements/randomizer/location_list.cpp | 9 ++++++++ .../Enhancements/randomizer/randomizerTypes.h | 18 +++++++++++++++ .../Enhancements/randomizer/randomizer_inf.h | 9 ++++++++ 9 files changed, 79 insertions(+), 1 deletion(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 131dbe54981..e34ef7cce7b 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -649,6 +649,21 @@ static void PlaceVanillaFairies() { ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY, GetJunkItem(), false, true); ctx->PlaceItemInLocation(RC_DODONGOS_CAVERN_GOSSIP_STONE_FAIRY_BIG, GetJunkItem(), false, true); } + if (ctx->GetDungeon(Rando::FIRE_TEMPLE)->IsMQ()) { + ctx->PlaceItemInLocation(RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, GetJunkItem(), false, true); + } + if (ctx->GetDungeon(Rando::WATER_TEMPLE)->IsMQ()) { + ctx->PlaceItemInLocation(RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, GetJunkItem(), false, true); + } + if (ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->IsMQ()) { + ctx->PlaceItemInLocation(RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, GetJunkItem(), false, true); + } else { + ctx->PlaceItemInLocation(RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, GetJunkItem(), false, true); + } if (ctx->GetDungeon(Rando::BOTTOM_OF_THE_WELL)->IsMQ()) { ctx->PlaceItemInLocation(RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, GetJunkItem(), false, true); ctx->PlaceItemInLocation(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, GetJunkItem(), false, true); @@ -661,6 +676,9 @@ static void PlaceVanillaFairies() { if (ctx->GetDungeon(Rando::GERUDO_TRAINING_GROUNDS)->IsVanilla()) { ctx->PlaceItemInLocation(RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, GetJunkItem(), false, true); } + if (ctx->GetDungeon(Rando::GANONS_CASTLE)->IsVanilla()) { + ctx->PlaceItemInLocation(RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, GetJunkItem(), false, true); + } } static void SetScarceItemPool() { @@ -1217,9 +1235,13 @@ void GenerateItemPool() { } // 8 extra for Ganon's Castle + 2 Dodongo's Cavern Gossip Stone int extra = 10; + extra += ctx->GetDungeon(Rando::FIRE_TEMPLE)->IsVanilla() ? 0 : 2; + extra += ctx->GetDungeon(Rando::WATER_TEMPLE)->IsVanilla() ? 0 : 3; + extra += ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->IsVanilla() ? 2 : 1; extra += ctx->GetDungeon(Rando::BOTTOM_OF_THE_WELL)->IsVanilla() ? 1 : 2; extra += ctx->GetDungeon(Rando::ICE_CAVERN)->IsVanilla() ? 1 : 0; extra += ctx->GetDungeon(Rando::GERUDO_TRAINING_GROUNDS)->IsVanilla() ? 1 : 0; + extra += ctx->GetDungeon(Rando::GANONS_CASTLE)->IsVanilla() ? 1 : 0; for (int i = 0; i < extra; i++) { AddItemToMainPool(GetJunkItem()); } diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp index b3c2e5387d1..0b7c6963a7a 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_fire_temple.cpp @@ -318,6 +318,7 @@ void AreaTable_Init_FireTemple() { LOCATION(RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, logic->CanJumpslash || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->Bombs || logic->CanUse(RG_DINS_FIRE)), LOCATION(RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, logic->IsAdult && (randoCtx->GetTrickOption(RT_FEWER_TUNIC_REQUIREMENTS) || logic->CanUse(RG_GORON_TUNIC)) && (((logic->CanUse(RG_HOVER_BOOTS) || (randoCtx->GetTrickOption(RT_FIRE_MQ_NEAR_BOSS) && logic->CanUse(RG_FAIRY_BOW))) && logic->HasFireSource) || (logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_DINS_FIRE) && ((randoCtx->GetOption(RSK_DAMAGE_MULTIPLIER).IsNot(RO_DAMAGE_MULTIPLIER_OHKO) && randoCtx->GetOption(RSK_DAMAGE_MULTIPLIER).IsNot(RO_DAMAGE_MULTIPLIER_QUADRUPLE) && randoCtx->GetOption(RSK_DAMAGE_MULTIPLIER).IsNot(RO_DAMAGE_MULTIPLIER_OCTUPLE) && randoCtx->GetOption(RSK_DAMAGE_MULTIPLIER).IsNot(RO_DAMAGE_MULTIPLIER_SEXDECUPLE)) || logic->CanUse(RG_GORON_TUNIC) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_LONGSHOT)))))), //Trick: logic->IsAdult && (LogicFewerTunicRequirements || logic->CanUse(RG_GORON_TUNIC)) && (((logic->CanUse(RG_HOVER_BOOTS) || (LogicFireMQNearBoss && logic->CanUse(RG_FAIRY_BOW))) && logic->HasFireSource) || (logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_DINS_FIRE) && ((DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OHKO) && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_QUADRUPLE) && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OCTUPLE) && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_SEXDECUPLE)) || logic->CanUse(RG_GORON_TUNIC) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_LONGSHOT))))) + LOCATION(RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, logic->SmallKeys(RR_FIRE_TEMPLE, 5) && logic->CanUse(RG_SUNS_SONG)), }, { //Exits Entrance(RR_FIRE_TEMPLE_ENTRYWAY, {[]{return true;}}), @@ -333,6 +334,7 @@ void AreaTable_Init_FireTemple() { //Locations LOCATION(RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, logic->IsAdult && (logic->CanUse(RG_MEGATON_HAMMER) || logic->CanUse(RG_HOOKSHOT) || (logic->HasExplosives && (logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG))))), LOCATION(RC_FIRE_TEMPLE_MQ_MAP_CHEST, logic->IsAdult && logic->CanUse(RG_MEGATON_HAMMER)), + LOCATION(RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), }, {}); areaTable[RR_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM] = Area("Fire Temple MQ Big Lava Room", "Fire Temple", RA_FIRE_TEMPLE, NO_DAY_NIGHT_CYCLE, { diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp index 2888a4ed1ca..a46d652062b 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_ganons_castle.cpp @@ -219,6 +219,7 @@ void AreaTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, logic->IsAdult && logic->Hammer && logic->CanUse(RG_BOMBCHU_5) && ((logic->CanUse(RG_FIRE_ARROWS) && logic->CanUse(RG_MIRROR_SHIELD)) || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS)))), LOCATION(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, logic->IsAdult && logic->Hammer && logic->CanUse(RG_BOMBCHU_5) && ((logic->CanUse(RG_FIRE_ARROWS) && logic->CanUse(RG_MIRROR_SHIELD)) || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS)))), LOCATION(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, logic->IsAdult && logic->Hammer && logic->CanUse(RG_BOMBCHU_5) && ((logic->CanUse(RG_FIRE_ARROWS) && logic->CanUse(RG_MIRROR_SHIELD)) || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS)))), + LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), }, {}); areaTable[RR_GANONS_CASTLE_MQ_LIGHT_TRIAL] = Area("Ganon's Castle MQ Light Trial", "Ganons Castle", RA_GANONS_CASTLE, NO_DAY_NIGHT_CYCLE, { diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp index 747b5ec2f45..775a9df152e 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_spirit_temple.cpp @@ -59,6 +59,7 @@ void AreaTable_Init_SpiritTemple() { LOCATION(RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, logic->SmallKeys(RR_SPIRIT_TEMPLE, 3)), LOCATION(RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, logic->SmallKeys(RR_SPIRIT_TEMPLE, 3)), LOCATION(RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, logic->CanUse(RG_SONG_OF_TIME) && (logic->Bow || logic->Hookshot || logic->CanUse(RG_BOMBCHU_5) || (logic->Bombs && randoCtx->GetTrickOption(RT_SPIRIT_LOWER_ADULT_SWITCH)))), + LOCATION(RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_BOMBCHU_5) || (logic->Bombs && logic->IsAdult && randoCtx->GetTrickOption(RT_SPIRIT_LOWER_ADULT_SWITCH))) && (logic->CanUse(RG_HOVER_BOOTS) || logic->CanJumpslash)), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER, {[]{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 1);}}), @@ -108,6 +109,7 @@ void AreaTable_Init_SpiritTemple() { LOCATION(RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, (logic->MirrorShield || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS))) && logic->HasExplosives), LOCATION(RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, (randoCtx->GetTrickOption(RT_LENS_SPIRIT) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->HasExplosives), LOCATION(RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, (randoCtx->GetTrickOption(RT_LENS_SPIRIT) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->HasExplosives), + LOCATION(RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, logic->HasExplosives && logic->CanUse(RG_SUNS_SONG)), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_BEYOND_FINAL_LOCKED_DOOR, {[]{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && (randoCtx->GetTrickOption(RT_SPIRIT_WALL) || logic->CanUse(RG_LONGSHOT) || logic->CanUse(RG_BOMBCHU_5) || ((logic->Bombs || logic->CanUse(RG_NUTS) || logic->CanUse(RG_DINS_FIRE)) && (logic->Bow || logic->CanUse(RG_HOOKSHOT) || logic->Hammer)));}}), @@ -172,6 +174,7 @@ void AreaTable_Init_SpiritTemple() { LOCATION(RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->CanUse(RG_SONG_OF_TIME) && (logic->MirrorShield || (randoCtx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS)))), LOCATION(RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, logic->SmallKeys(RR_SPIRIT_TEMPLE, 7)), LOCATION(RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, logic->SmallKeys(RR_SPIRIT_TEMPLE, 7)), + LOCATION(RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_SUNS_SONG)), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_LOWER_ADULT, {[]{return logic->MirrorShield && logic->IsAdult && (logic->CanUse(RG_FIRE_ARROWS) || (randoCtx->GetTrickOption(RT_SPIRIT_MQ_LOWER_ADULT) && logic->CanUse(RG_DINS_FIRE) && logic->Bow));}}), diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_water_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_water_temple.cpp index ef9c5ecd9dd..62f2e3b8a5b 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_water_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_water_temple.cpp @@ -251,7 +251,10 @@ void AreaTable_Init_WaterTemple() { | MASTER QUEST DUNGEON | ---------------------------*/ if (randoCtx->GetDungeon(WATER_TEMPLE)->IsMQ()) { - areaTable[RR_WATER_TEMPLE_MQ_LOBBY] = Area("Water Temple MQ Lobby", "Water Temple", RA_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, {}, { + areaTable[RR_WATER_TEMPLE_MQ_LOBBY] = Area("Water Temple MQ Lobby", "Water Temple", RA_WATER_TEMPLE, NO_DAY_NIGHT_CYCLE, {}, { + //Locations + LOCATION(RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, logic->SmallKeys(RR_WATER_TEMPLE, 1) && logic->CanUse(RG_SUNS_SONG) && logic->CanUse(RG_LONGSHOT) && (logic->CanUse(RG_HOVER_BOOTS) || (logic->CanJumpslash && logic->Hearts > 0))) + }, { //Exits Entrance(RR_WATER_TEMPLE_ENTRYWAY, {[]{return true;}}), Entrance(RR_WATER_TEMPLE_MQ_DIVE, {[]{return logic->IsAdult && logic->WaterTimer >= 24 && logic->CanUse(RG_IRON_BOOTS);}}), @@ -286,6 +289,8 @@ void AreaTable_Init_WaterTemple() { //Locations LOCATION(RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, logic->IsAdult && logic->WaterTimer >= 24 && logic->CanUse(RG_DINS_FIRE) && (randoCtx->GetTrickOption(RT_WATER_DRAGON_JUMP_DIVE) || logic->CanDive || logic->CanUse(RG_IRON_BOOTS))), LOCATION(RC_WATER_TEMPLE_MQ_GS_RIVER, true), + LOCATION(RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), }, { //Exits Entrance(RR_WATER_TEMPLE_MQ_BASEMENT_GATED_AREAS, {[]{return logic->IsAdult && logic->WaterTimer >= 24 && logic->CanUse(RG_DINS_FIRE) && logic->CanUse(RG_IRON_BOOTS);}}), diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index 1dd18f8bab8..d958da9bcc6 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -377,6 +377,8 @@ Dungeons::Dungeons() { RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, + RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, + RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, }, {}, { @@ -418,6 +420,9 @@ Dungeons::Dungeons() { RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, RC_WATER_TEMPLE_MQ_GS_RIVER, RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, + RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, + RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, + RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, }, {}, { @@ -452,6 +457,8 @@ Dungeons::Dungeons() { RC_SPIRIT_TEMPLE_GS_LOBBY, RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, RC_SPIRIT_TEMPLE_GS_METAL_FENCE, + RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, + RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, }, { // MQ Locations @@ -480,6 +487,7 @@ Dungeons::Dungeons() { RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, + RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, }, { // Shared Locations @@ -701,6 +709,7 @@ Dungeons::Dungeons() { RC_GANONS_CASTLE_SCRUBS_FAIRY_6, RC_GANONS_CASTLE_SCRUBS_FAIRY_7, RC_GANONS_CASTLE_SCRUBS_FAIRY_8, + RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, }, { // MQ Locations diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 435ce5aab90..1d9e6250977 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -2027,11 +2027,20 @@ void Rando::StaticData::InitLocationTable() { // 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), RAND_INF_LW_SHORTCUT_STORMS_FAIRY, "Shortcuts Song of Storms Fairy", RHT_LW_SHORTCUT_STORMS_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); 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), RAND_INF_GF_KITCHEN_SUN_FAIRY, "Kitchen Sun's Song Fairy", RHT_GF_KITCHEN_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY] = Location::Fairy(RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -551), RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, "MQ Lower Loop Stalfos Room Sun's Song Fairy", RHT_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY] = Location::Fairy(RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1563), RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, "MQ Lower Loop Behind Iron Knuckle Sun's Song Fairy", RHT_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); + locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -540), RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, "MQ Before Dark Link Pilar Sun's Song Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1501), RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, "MQ Before Dark Link Left Song of Storms Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1504), RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, "MQ Before Dark Link Right Sun's Song Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1896), RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, "After Boulder Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -220), RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, "Four Armos Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -220), RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, "MQ Dinalfos Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1531), RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, "Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -437), RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, "MQ East Cell Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1458), RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, "MQ Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(0x1000, 1186), RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, "Entrance Song of Storms Fairy", RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); locationTable[RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(0x1000, -445), RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, "Entrance Song of Storms Fairy", RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY] = Location::Fairy(RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(0x1000, 587), RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, "Spirit Trial Beamos Sun's Song Fairy", RHT_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 2ab0ad7d100..e47e3ae6d1c 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1841,11 +1841,20 @@ typedef enum { RC_DMT_FLAG_SUN_FAIRY, RC_LW_SHORTCUT_STORMS_FAIRY, RC_GF_KITCHEN_SUN_FAIRY, + RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, + RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, + RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, + RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, + RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, + RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, + RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, + RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, + RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, RC_MAX } RandomizerCheck; @@ -3925,11 +3934,20 @@ typedef enum { RHT_DMT_FLAG_SUN_FAIRY, RHT_LW_SHORTCUT_STORMS_FAIRY, RHT_GF_KITCHEN_SUN_FAIRY, + RHT_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, + RHT_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, + RHT_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, + RHT_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, + RHT_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, + RHT_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, + RHT_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, + RHT_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, + RHT_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, RHT_MAX } RandomizerHintTextKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index e66979d4b25..31613f31048 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -499,11 +499,20 @@ typedef enum { RAND_INF_DMT_FLAG_SUN_FAIRY, RAND_INF_LW_SHORTCUT_STORMS_FAIRY, RAND_INF_GF_KITCHEN_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_BOULDER_ROOM_SUN_FAIRY, + RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, + RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RAND_INF_BOTTOM_OF_THE_WELL_MQ_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, // 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, From 97d2acc8dea370070a331bc649b08399b1b20115 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Fri, 13 Sep 2024 15:50:03 -0700 Subject: [PATCH 50/54] Add Shadow Temple fairies --- .../randomizer/3drando/item_pool.cpp | 13 ++++++-- .../location_access/locacc_shadow_temple.cpp | 6 ++++ soh/soh/Enhancements/randomizer/dungeon.cpp | 6 ++++ .../Enhancements/randomizer/location_list.cpp | 19 +++++++---- .../Enhancements/randomizer/randomizerTypes.h | 33 ++++++++++++------- .../Enhancements/randomizer/randomizer_inf.h | 18 ++++++---- 6 files changed, 69 insertions(+), 26 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index e34ef7cce7b..c60f2b67cf0 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -664,6 +664,15 @@ static void PlaceVanillaFairies() { ctx->PlaceItemInLocation(RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, GetJunkItem(), false, true); ctx->PlaceItemInLocation(RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, GetJunkItem(), false, true); } + if (ctx->GetDungeon(Rando::SHADOW_TEMPLE)->IsMQ()) { + ctx->PlaceItemInLocation(RC_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, GetJunkItem(), false, true); + } else { + ctx->PlaceItemInLocation(RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_SHADOW_TEMPLE_PIT_STORM_FAIRY, GetJunkItem(), false, true); + ctx->PlaceItemInLocation(RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, GetJunkItem(), false, true); + } if (ctx->GetDungeon(Rando::BOTTOM_OF_THE_WELL)->IsMQ()) { ctx->PlaceItemInLocation(RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, GetJunkItem(), false, true); ctx->PlaceItemInLocation(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, GetJunkItem(), false, true); @@ -1233,8 +1242,8 @@ void GenerateItemPool() { for (auto rc : Rando::StaticData::overworldFairyLocations) { AddItemToMainPool(GetJunkItem()); } - // 8 extra for Ganon's Castle + 2 Dodongo's Cavern Gossip Stone - int extra = 10; + // 8 extra for Ganon's Castle + 2 Dodongo's Cavern Gossip Stone + 3 Shadow Temple + int extra = 13; extra += ctx->GetDungeon(Rando::FIRE_TEMPLE)->IsVanilla() ? 0 : 2; extra += ctx->GetDungeon(Rando::WATER_TEMPLE)->IsVanilla() ? 0 : 3; extra += ctx->GetDungeon(Rando::SPIRIT_TEMPLE)->IsVanilla() ? 2 : 1; diff --git a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp index fb926506007..286e92b0aff 100644 --- a/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/location_access/locacc_shadow_temple.cpp @@ -40,6 +40,7 @@ void AreaTable_Init_ShadowTemple() { LOCATION(RC_SHADOW_TEMPLE_COMPASS_CHEST, logic->CanJumpslash), LOCATION(RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT)), LOCATION(RC_SHADOW_TEMPLE_GS_NEAR_SHIP, false), + LOCATION(RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), }, { //Exits Entrance(RR_SHADOW_TEMPLE_HUGE_PIT, {[]{return logic->HasExplosives && logic->IsAdult && logic->SmallKeys(RR_SHADOW_TEMPLE, 1, 2);}}), @@ -58,6 +59,7 @@ void AreaTable_Init_ShadowTemple() { LOCATION(RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, logic->CanJumpslash), LOCATION(RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, logic->Hookshot || (randoCtx->GetTrickOption(RT_SHADOW_UMBRELLA_GS) && logic->HoverBoots)), LOCATION(RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, logic->SmallKeys(RR_SHADOW_TEMPLE, 2, 3) && ((randoCtx->GetTrickOption(RT_LENS_SHADOW_PLATFORM) && randoCtx->GetTrickOption(RT_LENS_SHADOW)) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->Hookshot), + LOCATION(RC_SHADOW_TEMPLE_PIT_STORM_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), }, { //Exits Entrance(RR_SHADOW_TEMPLE_WIND_TUNNEL, {[]{return ((randoCtx->GetTrickOption(RT_LENS_SHADOW_PLATFORM) && randoCtx->GetTrickOption(RT_LENS_SHADOW)) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->Hookshot && logic->SmallKeys(RR_SHADOW_TEMPLE, 3, 4);}}), @@ -69,6 +71,7 @@ void AreaTable_Init_ShadowTemple() { LOCATION(RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, logic->CanJumpslash), LOCATION(RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, true), LOCATION(RC_SHADOW_TEMPLE_GS_NEAR_SHIP, logic->CanUse(RG_LONGSHOT) && logic->SmallKeys(RR_SHADOW_TEMPLE, 4, 5)), + LOCATION(RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), }, { //Exits Entrance(RR_SHADOW_TEMPLE_BEYOND_BOAT, {[]{return logic->CanJumpslash && logic->CanUse(RG_ZELDAS_LULLABY) && logic->SmallKeys(RR_SHADOW_TEMPLE, 4, 5);}}), @@ -109,6 +112,7 @@ void AreaTable_Init_ShadowTemple() { LOCATION(RC_SHADOW_TEMPLE_MQ_MAP_CHEST, logic->CanAdultAttack || logic->CanUse(RG_NUTS)), LOCATION(RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, logic->CanJumpslash), LOCATION(RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, logic->CanAdultAttack || logic->CanUse(RG_NUTS)), + LOCATION(RC_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), }, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_UPPER_HUGE_PIT, {[]{return logic->HasExplosives && logic->SmallKeys(RR_SHADOW_TEMPLE, 2);}}), @@ -120,6 +124,7 @@ void AreaTable_Init_ShadowTemple() { //Trick: logic->CanUse(RG_SONG_OF_TIME) || (LogicShadowMQInvisibleBlades && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OHKO)) LOCATION(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, logic->CanUse(RG_SONG_OF_TIME) || (randoCtx->GetTrickOption(RT_SHADOW_MQ_INVISIBLE_BLADES) && randoCtx->GetOption(RSK_DAMAGE_MULTIPLIER).IsNot(RO_DAMAGE_MULTIPLIER_OHKO))), //Trick: logic->CanUse(RG_SONG_OF_TIME) || (LogicShadowMQInvisibleBlades && DamageMultiplier.IsNot(DAMAGEMULTIPLIER_OHKO)) + LOCATION(RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), }, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_LOWER_HUGE_PIT, {[]{return logic->HasFireSource || randoCtx->GetTrickOption(RT_SHADOW_MQ_HUGE_PIT);}}), @@ -151,6 +156,7 @@ void AreaTable_Init_ShadowTemple() { LOCATION(RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, true), LOCATION(RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, true), LOCATION(RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, true), + LOCATION(RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), }, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_BEYOND_BOAT, {[]{return logic->CanUse(RG_ZELDAS_LULLABY) && logic->SmallKeys(RR_SHADOW_TEMPLE, 5);}}), diff --git a/soh/soh/Enhancements/randomizer/dungeon.cpp b/soh/soh/Enhancements/randomizer/dungeon.cpp index d958da9bcc6..d18cbc87412 100644 --- a/soh/soh/Enhancements/randomizer/dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/dungeon.cpp @@ -526,6 +526,9 @@ Dungeons::Dungeons() { RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, RC_SHADOW_TEMPLE_GS_NEAR_SHIP, + RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, + RC_SHADOW_TEMPLE_PIT_STORM_FAIRY, + RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, }, { // MQ Locations @@ -554,6 +557,9 @@ Dungeons::Dungeons() { RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, + RC_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, + RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, + RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, }, {}, { diff --git a/soh/soh/Enhancements/randomizer/location_list.cpp b/soh/soh/Enhancements/randomizer/location_list.cpp index 1d9e6250977..6bbedf3664b 100644 --- a/soh/soh/Enhancements/randomizer/location_list.cpp +++ b/soh/soh/Enhancements/randomizer/location_list.cpp @@ -2027,20 +2027,27 @@ void Rando::StaticData::InitLocationTable() { // 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), RAND_INF_LW_SHORTCUT_STORMS_FAIRY, "Shortcuts Song of Storms Fairy", RHT_LW_SHORTCUT_STORMS_FAIRY, SpoilerCollectionCheckGroup::GROUP_LOST_WOODS); 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), RAND_INF_GF_KITCHEN_SUN_FAIRY, "Kitchen Sun's Song Fairy", RHT_GF_KITCHEN_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_VALLEY); + locationTable[RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1896), RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, "After Boulder Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -220), RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, "Four Armos Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 54), RAND_INF_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, "Beamos Song of Storms Fairy", RHT_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_PIT_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_PIT_STORM_FAIRY, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 3339), RAND_INF_SHADOW_TEMPLE_PIT_STORM_FAIRY, "Pit Room Song of Storms Fairy", RHT_SHADOW_TEMPLE_PIT_STORM_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -127), RAND_INF_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, "Wind Hint Sun's Song Fairy", RHT_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1531), RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, "Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(0x1000, 1186), RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, "Entrance Song of Storms Fairy", RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); + locationTable[RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(0x1000, -445), RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, "Entrance Song of Storms Fairy", RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); + locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY] = Location::Fairy(RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(0x1000, 587), RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, "Spirit Trial Beamos Sun's Song Fairy", RHT_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); + locationTable[RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY] = Location::Fairy(RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -551), RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, "MQ Lower Loop Stalfos Room Sun's Song Fairy", RHT_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); locationTable[RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY] = Location::Fairy(RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, RCQUEST_MQ, RCAREA_FIRE_TEMPLE, SCENE_FIRE_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1563), RAND_INF_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, "MQ Lower Loop Behind Iron Knuckle Sun's Song Fairy", RHT_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_FIRE_TEMPLE); locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -540), RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, "MQ Before Dark Link Pilar Sun's Song Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1501), RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, "MQ Before Dark Link Left Song of Storms Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); locationTable[RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY] = Location::Fairy(RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, RCQUEST_MQ, RCAREA_WATER_TEMPLE, SCENE_WATER_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1504), RAND_INF_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, "MQ Before Dark Link Right Sun's Song Fairy", RHT_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_WATER_TEMPLE); - locationTable[RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -1896), RAND_INF_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, "After Boulder Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -220), RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, "Four Armos Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); locationTable[RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY] = Location::Fairy(RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, RCQUEST_MQ, RCAREA_SPIRIT_TEMPLE, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -220), RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, "MQ Dinalfos Room Sun's Song Fairy", RHT_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SPIRIT_TEMPLE); - locationTable[RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1531), RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, "Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); + locationTable[RC_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 55), RAND_INF_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, "MQ Beamos Song of Storms Fairy", RHT_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, 3342), RAND_INF_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, "MQ Pit Room Song of Storms Fairy", RHT_SHADOW_TEMPLE_PIT_STORM_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); + locationTable[RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY] = Location::Fairy(RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, RCQUEST_MQ, RCAREA_SHADOW_TEMPLE, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(0x1000, -127), RAND_INF_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, "MQ Wind Hint Sun's Song Fairy", RHT_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_SHADOW_TEMPLE); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -437), RAND_INF_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, "MQ East Cell Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); locationTable[RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY] = Location::Fairy(RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, RCQUEST_MQ, RCAREA_BOTTOM_OF_THE_WELL, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(0x1000, -1458), RAND_INF_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, "MQ Basement Sun's Song Fairy", RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_BOTTOM_OF_THE_WELL); - locationTable[RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(0x1000, 1186), RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, "Entrance Song of Storms Fairy", RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_ICE_CAVERN); - locationTable[RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY] = Location::Fairy(RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, RCQUEST_VANILLA, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(0x1000, -445), RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, "Entrance Song of Storms Fairy", RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, SpoilerCollectionCheckGroup::GROUP_GERUDO_TRAINING_GROUND); - locationTable[RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY] = Location::Fairy(RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(0x1000, 587), RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, "Spirit Trial Beamos Sun's Song Fairy", RHT_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, SpoilerCollectionCheckGroup::GROUP_DUNGEON_GANONS_CASTLE); // Gossip Stones locationTable[RC_DMC_GOSSIP_STONE] = Location::HintStone(RC_DMC_GOSSIP_STONE, RCQUEST_BOTH, RCAREA_DEATH_MOUNTAIN_CRATER, SCENE_DEATH_MOUNTAIN_CRATER, 14341, 0x05, "Gossip Stone", {}); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index e47e3ae6d1c..3efb4bb2820 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -1841,20 +1841,26 @@ typedef enum { RC_DMT_FLAG_SUN_FAIRY, RC_LW_SHORTCUT_STORMS_FAIRY, RC_GF_KITCHEN_SUN_FAIRY, + RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, + RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, + RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, + RC_SHADOW_TEMPLE_PIT_STORM_FAIRY, + RC_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, + RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, + RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, + RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, + RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, RC_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, RC_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, RC_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, RC_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, RC_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, - RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, - RC_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, RC_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, - RC_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, + RC_SHADOW_TEMPLE_MQ_BEAMOS_STORM_FAIRY, + RC_SHADOW_TEMPLE_MQ_PIT_STORM_FAIRY, + RC_SHADOW_TEMPLE_MQ_WIND_HINT_SUN_FAIRY, RC_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RC_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, - RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, - RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, - RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, RC_MAX } RandomizerCheck; @@ -3934,20 +3940,23 @@ typedef enum { RHT_DMT_FLAG_SUN_FAIRY, RHT_LW_SHORTCUT_STORMS_FAIRY, RHT_GF_KITCHEN_SUN_FAIRY, + RHT_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, + RHT_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, + RHT_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, + RHT_SHADOW_TEMPLE_PIT_STORM_FAIRY, + RHT_SHADOW_TEMPLE_WIND_HINT_SUN_FAIRY, + RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, + RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, + RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, + RHT_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, RHT_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY, RHT_FIRE_TEMPLE_MQ_LOOP_KNUCKLE_SUN_FAIRY, RHT_WATER_TEMPLE_MQ_DARK_LINK_PILAR_SUN_FAIRY, RHT_WATER_TEMPLE_MQ_DARK_LINK_LEFT_STORM_FAIRY, RHT_WATER_TEMPLE_MQ_DARK_LINK_RIGHT_SUN_FAIRY, - RHT_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, - RHT_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, RHT_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, - RHT_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY, RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY, RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY, - RHT_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, - RHT_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, - RHT_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, RHT_MAX } RandomizerHintTextKey; diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 31613f31048..1872eab2b02 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -499,20 +499,26 @@ typedef enum { RAND_INF_DMT_FLAG_SUN_FAIRY, RAND_INF_LW_SHORTCUT_STORMS_FAIRY, RAND_INF_GF_KITCHEN_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_BOULDER_ROOM_SUN_FAIRY, - RAND_INF_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY, RAND_INF_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY, - RAND_INF_BOTTOM_OF_THE_WELL_BASEMENT_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, - RAND_INF_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, - RAND_INF_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, - RAND_INF_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, // 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, From ac0dd73512c3c2fa7607dd9b67ece5cef2183a99 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Fri, 13 Sep 2024 15:55:28 -0700 Subject: [PATCH 51/54] Add fairy check flags to the save editor --- .../Enhancements/debugger/debugSaveEditor.h | 213 ++++++++++++++++++ 1 file changed, 213 insertions(+) diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.h b/soh/soh/Enhancements/debugger/debugSaveEditor.h index c3e01b657cd..73e417675da 100644 --- a/soh/soh/Enhancements/debugger/debugSaveEditor.h +++ b/soh/soh/Enhancements/debugger/debugSaveEditor.h @@ -620,6 +620,219 @@ const std::vector flagTables = { { 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_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" }, } }, }; From ffb5e8e7b90d13899e8a95b62b93cf54b32d1e41 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Fri, 13 Sep 2024 16:00:37 -0700 Subject: [PATCH 52/54] Filter fairy checks from check tracker --- soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp | 2 ++ soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index 3b5eed450f7..2873a647675 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -169,6 +169,8 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() { CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleWeirdEgg"), RO_GENERIC_NO)) && (location.GetRCType() != RCTYPE_FROG_SONG || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleFrogSongRupees"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_FAIRY || + CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleFairies"), RO_GENERIC_NO)) && (location.GetRCType() != RCTYPE_MAP_COMPASS || CVarGetInteger(CVAR_RANDOMIZER_SETTING("StartingMapsCompasses"), RO_DUNGEON_ITEM_LOC_OWN_DUNGEON) != RO_DUNGEON_ITEM_LOC_VANILLA) && diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index 29b99106b93..1350edd9256 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -69,6 +69,7 @@ bool showHyruleLoach; bool showWeirdEgg; bool showGerudoCard; bool showFrogSongRupees; +bool showFairies; bool showStartingMapsCompasses; bool showKeysanity; bool showGerudoFortressKeys; @@ -1207,6 +1208,9 @@ void LoadSettings() { showFrogSongRupees = IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_FROG_SONG_RUPEES) == RO_GENERIC_YES : false; + showFairies = IS_RANDO ? + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_FAIRIES) == RO_GENERIC_YES + : false; showStartingMapsCompasses = IS_RANDO ? OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_MAPANDCOMPASS) != RO_DUNGEON_ITEM_LOC_VANILLA : false; @@ -1322,6 +1326,7 @@ bool IsCheckShuffled(RandomizerCheck rc) { (rc != RC_HC_MALON_EGG || showWeirdEgg) && (loc->GetRCType() != RCTYPE_FROG_SONG || showFrogSongRupees) && (loc->GetRCType() != RCTYPE_MAP_COMPASS || showStartingMapsCompasses) && + (loc->GetRCType() != RCTYPE_FAIRY || showFairies) && (loc->GetRCType() != RCTYPE_SMALL_KEY || showKeysanity) && (loc->GetRCType() != RCTYPE_BOSS_KEY || showBossKeysanity) && (loc->GetRCType() != RCTYPE_GANON_BOSS_KEY || showGanonBossKey) && From 8356a3a98e80ed5c8224f09295d541810b691479 Mon Sep 17 00:00:00 2001 From: Angel Bulfone Date: Fri, 13 Sep 2024 17:22:20 -0700 Subject: [PATCH 53/54] Add hints for fairy checks --- .../hint_list/hint_list_exclude_dungeon.cpp | 84 +++++ .../hint_list/hint_list_exclude_overworld.cpp | 333 ++++++++++++++++++ 2 files changed, 417 insertions(+) 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 c2117c4eb38..5373bac178c 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 @@ -275,6 +275,15 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The /*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_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone in Dodongo's Cavern# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + /*-------------------------- | JABU JABUS BELLY | ---------------------------*/ @@ -831,6 +840,14 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa /*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[RAND_INF_FIRE_TEMPLE_MQ_LOOP_STALFOS_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun in a hot arena# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RAND_INF_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*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + /*-------------------------- | WATER TEMPLE | ---------------------------*/ @@ -958,6 +975,18 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa /*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_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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + /*-------------------------- | SPIRIT TEMPLE | ---------------------------*/ @@ -1191,6 +1220,19 @@ hintTextTable[RHT_FIRE_TEMPLE_NEAR_BOSS_CHEST] = HintText(CustomMessage("They sa /*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_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun past some boulders gaurding silver rupees# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SPIRIT_TEMPLE_ARMOS_ROOM_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun near four statues# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_SPIRIT_TEMPLE_MQ_DINALFOS_ROOM_SUN_FAIRY] = HintText(CustomMessage("They say that #calling the sun near a suspicious chest# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + /*-------------------------- | SHADOW TEMPLE | ---------------------------*/ @@ -1434,6 +1476,18 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th /*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_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*/ "!!!", + /*french*/ "!!!.", {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*/ "!!!", + /*french*/ "!!!.", {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*/ "!!!", + /*french*/ "!!!.", {QM_RED, QM_GREEN})); + /*-------------------------- | BOTTOM OF THE WELL | ---------------------------*/ @@ -1552,6 +1606,19 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th /*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_BOTTOM_OF_THE_WELL_BASEMENT_SUN_FAIRY] = HintText(CustomMessage("They say that an #calling the sun a dead end# within the well reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_CELL_SUN_FAIRY] = HintText(CustomMessage("They say that an #calling the sun in an empty cell# within the well reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_BOTTOM_OF_THE_WELL_MQ_BASEMENT_SUN_FAIRY] = HintText(CustomMessage("They say that an #calling the sun a dead end# within the well reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!.", {QM_RED, QM_GREEN})); + + /*-------------------------- | ICE CAVERN | ---------------------------*/ @@ -1625,6 +1692,11 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th /*french*/ "Selon moi, une #Skulltula figée dans la glace rouge# a #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula tras un ardiente hielo# otorga #[[1]]#. + 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*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + // /*spanish*/ Según dicen, una #Skulltula tras un ardiente hielo# otorga #[[1]]#. + /*-------------------------- | GERUDO TRAINING GROUNDS | ---------------------------*/ @@ -1723,6 +1795,10 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th /*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 Grounds# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_FREESTANDING_KEY] = HintText(CustomMessage("They say that the #Song of Time# in the Gerudo Training Grounds leads to #[[1]]#.", /*german*/ "Man erzählt sich, daß die #Hymne der Zeit# in der Gerudo-Trainingsarena zu #[[1]]# führe.", /*french*/ "Selon moi, le #chant du temps# révèle dans le Gymnase Gerudo #[[1]]#.", {QM_RED, QM_GREEN})); @@ -1886,6 +1962,14 @@ hintTextTable[RHT_SHADOW_TEMPLE_MAP_CHEST] = HintText(CustomMessage("They say th /*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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + hintTextTable[RHT_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST] = HintText(CustomMessage("They say that the #test of the seas# holds #[[1]]#.", /*german*/ "Man erzählt sich, daß die #Prüfung der Meere# #[[1]]# enthielte.", /*french*/ "Selon moi, l'#épreuve des mers# contient #[[1]]#.", {QM_RED, QM_GREEN})); 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 a467c18b513..245f609615a 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 @@ -1490,5 +1490,338 @@ void StaticData::HintTable_Init_Exclude_Overworld() { /*german*/ "Man erzählt sich, daß ein #Bienenstock hinter dem Zora-König# #[[1]]# verberge.", /*french*/ "Selon moi, #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #colmena detrás del rey de los zoras# esconde #[[1]]#. + + hintTextTable[RHT_SFM_FAIRY_GROTTO_FAIRY] = HintText(CustomMessage("They say that within #a fountain beneath a forest meadow# rests #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_ZR_FAIRY_GROTTO_FAIRY] = HintText(CustomMessage("They say that within #a fountain beneath a river# rests #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_HF_FAIRY_GROTTO_FAIRY] = HintText(CustomMessage("They say that within #a fountain beneath a a few trees bordering a wide field# rests #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_COLOSSUS_OASIS_FAIRY] = HintText(CustomMessage("They say that #restoring water to a dried oasis# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_DMT_BEAN_SPROUT_FAIRY] = HintText(CustomMessage("They say that #watering a young sprout on the moutainside# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_TOT_GOSSIP_STONE_FAIRY] = HintText(CustomMessage("They say that #playing a tune for an odd stone in the ouskirts of the market# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {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 ouskirts of the market# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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 sane# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {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 sane# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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 ouskirts of a deap fountain# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {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 ouskirts of a deap fountain# reveals #[[1]]#.", + /*german*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {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*/ "!!!", + /*french*/ "!!!", {QM_RED, QM_GREEN})); + } } From 59351bc3a20b5859ed4418107a848b393d998c1e Mon Sep 17 00:00:00 2001 From: Caladius Date: Thu, 19 Sep 2024 22:08:43 -0400 Subject: [PATCH 54/54] Fairy Shuffle --- .../hint_list/hint_list_exclude_dungeon.cpp | 1 + soh/soh/Enhancements/randomizer/location.cpp | 50 ++++++++--------- soh/soh/Enhancements/randomizer/location.h | 54 +++++++++---------- 3 files changed, 53 insertions(+), 52 deletions(-) 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 14a18f23976..daecdd84b5e 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 @@ -675,6 +675,7 @@ hintTextTable[RHT_DODONGOS_CAVERN_BOSS_ROOM_CHEST] = HintText(CustomMessage("The // /*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*/ "", + /*spanish*/ "", {QM_RED, QM_GREEN})); 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.", /*french*/ "Selon moi, une #Skulltula au fond du Puits du Temple de la Forêt# a #[[1]]#.", {QM_RED, QM_GREEN})); diff --git a/soh/soh/Enhancements/randomizer/location.cpp b/soh/soh/Enhancements/randomizer/location.cpp index 0d26311dac5..14561b56e96 100644 --- a/soh/soh/Enhancements/randomizer/location.cpp +++ b/soh/soh/Enhancements/randomizer/location.cpp @@ -99,7 +99,7 @@ RandomizerGet Rando::Location::GetVanillaItem() const { Rando::Location Rando::Location::Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, - uint8_t flag_, std::string&& shortName_, std::string&& spoilerName_, + uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { @@ -110,7 +110,7 @@ Rando::Location Rando::Location::Base(RandomizerCheck rc, RandomizerCheckQuest q Rando::Location Rando::Location::Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, - uint8_t flag_, std::string&& shortName_, + uint16_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { @@ -121,7 +121,7 @@ Rando::Location Rando::Location::Base(RandomizerCheck rc, RandomizerCheckQuest q Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, - int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { @@ -134,7 +134,7 @@ Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, - int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + int32_t actorParams_, uint16_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { @@ -147,7 +147,7 @@ Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, - int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, @@ -159,7 +159,7 @@ Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, - int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + int32_t actorParams_, uint16_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, @@ -171,7 +171,7 @@ Rando::Location Rando::Location::Chest(RandomizerCheck rc, RandomizerCheckQuest Rando::Location Rando::Location::Collectable( RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { return {rc, quest_, checkType_, area_, LocationType::Collectable, actorId_, scene_, actorParams_, flag_, @@ -183,7 +183,7 @@ Rando::Location Rando::Location::Collectable( Rando::Location Rando::Location::Collectable( RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { return {rc, quest_, checkType_, area_, LocationType::Collectable, actorId_, scene_, actorParams_, flag_, @@ -195,7 +195,7 @@ Rando::Location Rando::Location::Collectable( Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, const uint8_t collectFlag_, @@ -210,7 +210,7 @@ Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheck Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, const uint8_t collectFlag_, @@ -225,7 +225,7 @@ Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheck Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, @@ -238,7 +238,7 @@ Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheck Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, @@ -250,7 +250,7 @@ Rando::Location Rando::Location::Collectable(RandomizerCheck rc, RandomizerCheck } Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, const RandomizerHintTextKey hintKey, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { @@ -262,7 +262,7 @@ Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQues } Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { @@ -274,7 +274,7 @@ Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQues } Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, const RandomizerHintTextKey hintKey, std::vector&& categories, const uint8_t skullScene_, SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { @@ -286,7 +286,7 @@ Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQues } Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, std::vector&& categories, const uint8_t skullScene_, SpoilerCollectionCheckGroup collectionCheckGroup, bool isVanillaCompletion_) { @@ -299,7 +299,7 @@ Rando::Location Rando::Location::GSToken(RandomizerCheck rc, RandomizerCheckQues Rando::Location Rando::Location::GrottoScrub(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, @@ -312,7 +312,7 @@ Rando::Location Rando::Location::GrottoScrub(RandomizerCheck rc, RandomizerCheck Rando::Location Rando::Location::GrottoScrub(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, @@ -325,7 +325,7 @@ Rando::Location Rando::Location::GrottoScrub(RandomizerCheck rc, RandomizerCheck Rando::Location Rando::Location::Delayed(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, - uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, @@ -337,7 +337,7 @@ Rando::Location Rando::Location::Delayed(RandomizerCheck rc, RandomizerCheckQues Rando::Location Rando::Location::Delayed(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, - uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, @@ -349,7 +349,7 @@ Rando::Location Rando::Location::Delayed(RandomizerCheck rc, RandomizerCheckQues Rando::Location Rando::Location::Reward(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, - int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, @@ -361,7 +361,7 @@ Rando::Location Rando::Location::Reward(RandomizerCheck rc, RandomizerCheckQuest Rando::Location Rando::Location::Reward(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, - int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + int32_t actorParams_, uint16_t flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, const RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck, @@ -375,7 +375,7 @@ Rando::Location Rando::Location::Fairy(RandomizerCheck rc, RandomizerCheckQuest RandomizerCheckArea area_, uint8_t scene_, int32_t actorParams_, RandomizerInf flag_, std::string&& shortName_, const RandomizerHintTextKey hintKey, SpoilerCollectionCheckGroup collectionCheckGroup) { - return {rc, quest_, RCTYPE_FAIRY, area_, LocationType::Base, ACTOR_EN_ELF, scene_, actorParams_, flag_, + return {rc, quest_, RCTYPE_FAIRY, area_, LocationType::Base, ACTOR_EN_ELF, scene_, actorParams_, (uint16_t)flag_, std::move(shortName_), hintKey, RG_NONE, { Category::cFairy }, false, SpoilerCollectionCheck(SPOILER_CHK_RANDOMIZER_INF, scene_, flag_), collectionCheckGroup}; } @@ -399,7 +399,7 @@ Rando::Location Rando::Location::OtherHint(RandomizerCheck rc, RandomizerCheckQu } Rando::Location Rando::Location::HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - uint8_t scene_, int32_t actorParams_, uint8_t flag_, + uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, std::vector&& categories, bool isVanillaCompletion_) { return {rc, quest_, RCTYPE_GOSSIP_STONE, area_, LocationType::Base, ACTOR_EN_GS, scene_, actorParams_, flag_, @@ -408,7 +408,7 @@ Rando::Location Rando::Location::HintStone(RandomizerCheck rc, RandomizerCheckQu } Rando::Location Rando::Location::HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - uint8_t scene_, int32_t actorParams_, uint8_t flag_, + uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::vector&& categories, bool isVanillaCompletion_) { return {rc, quest_, RCTYPE_GOSSIP_STONE, area_, LocationType::Base, ACTOR_EN_GS, scene_, actorParams_, flag_, diff --git a/soh/soh/Enhancements/randomizer/location.h b/soh/soh/Enhancements/randomizer/location.h index 9fdb4f1a82b..e1322867729 100644 --- a/soh/soh/Enhancements/randomizer/location.h +++ b/soh/soh/Enhancements/randomizer/location.h @@ -101,7 +101,7 @@ class Location { collectionCheck(SpoilerCollectionCheck()), collectionCheckGroup(GROUP_NO_GROUP) {} Location(const RandomizerCheck rc_, const RandomizerCheckQuest quest_, const RandomizerCheckType checkType_, const RandomizerCheckArea area_, const LocationType locationType_, const ActorID actorId_, const uint8_t scene_, - const int32_t actorParams_, const uint8_t flag_, std::string shortName_, std::string spoilerName_, + const int32_t actorParams_, const uint16_t flag_, std::string shortName_, std::string spoilerName_, const RandomizerHintTextKey hintKey_, const RandomizerGet vanillaItem_, std::vector categories_, const bool isVanillaCompletion_ = false, const SpoilerCollectionCheck collectionCheck_ = SpoilerCollectionCheck(), const SpoilerCollectionCheckGroup collectionCheckGroup_ = GROUP_NO_GROUP) @@ -113,7 +113,7 @@ class Location { } Location(const RandomizerCheck rc_, const RandomizerCheckQuest quest_, const RandomizerCheckType checkType_, const RandomizerCheckArea area_, const LocationType locationType_, const ActorID actorId_, const uint8_t scene_, - const int32_t actorParams_, const uint8_t flag_, std::string shortName_, + const int32_t actorParams_, const uint16_t flag_, std::string shortName_, const RandomizerHintTextKey hintKey_, const RandomizerGet vanillaItem_, std::vector categories_, const bool isVanillaCompletion_ = false, const SpoilerCollectionCheck collectionCheck_ = SpoilerCollectionCheck(), const SpoilerCollectionCheckGroup collectionCheckGroup_ = GROUP_NO_GROUP) @@ -156,7 +156,7 @@ class Location { static Location Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, - uint8_t flag_, std::string&& shortName_, std::string&& spoilerName_, + uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), @@ -165,7 +165,7 @@ class Location { static Location Base(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, - uint8_t flag_, std::string&& shortName_, + uint16_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), @@ -174,7 +174,7 @@ class Location { static Location Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, @@ -182,7 +182,7 @@ class Location { static Location Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, @@ -190,7 +190,7 @@ class Location { static Location Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, @@ -198,7 +198,7 @@ class Location { static Location Chest(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, @@ -206,7 +206,7 @@ class Location { static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, - RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, @@ -214,7 +214,7 @@ class Location { static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, - RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, @@ -222,7 +222,7 @@ class Location { static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, - RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, uint8_t collectFlag_, SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, @@ -230,7 +230,7 @@ class Location { static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, - RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, uint8_t collectFlag_, SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, @@ -238,7 +238,7 @@ class Location { static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, - RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), @@ -247,7 +247,7 @@ class Location { static Location Collectable(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, - RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), @@ -256,14 +256,14 @@ class Location { static Location GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, bool isVanillaCompletion_ = true); static Location GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, std::vector&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, bool isVanillaCompletion_ = true); @@ -288,7 +288,7 @@ class Location { /// @return static Location GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, std::vector&& categories, uint8_t skullScene_, SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, @@ -296,7 +296,7 @@ class Location { static Location GSToken(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, - uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, std::vector&& categories, uint8_t skullScene_, SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, @@ -304,7 +304,7 @@ class Location { static Location GrottoScrub(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, - RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), @@ -313,7 +313,7 @@ class Location { static Location GrottoScrub(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, - RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, + RandomizerCheckArea area_, ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), @@ -322,7 +322,7 @@ class Location { static Location Delayed(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, @@ -330,7 +330,7 @@ class Location { static Location Delayed(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, @@ -338,14 +338,14 @@ class Location { static Location Reward(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, bool isVanillaCompletion_ = false); static Location Reward(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckType checkType_, RandomizerCheckArea area_, - ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + ActorID actorId_, uint8_t scene_, int32_t actorParams_, uint16_t flag_, std::string&& shortName_, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, std::vector&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = GROUP_NO_GROUP, bool isVanillaCompletion_ = false); @@ -363,11 +363,11 @@ class Location { std::string&& shortName_, bool isVanillaCompletion_ = false); static Location HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, uint8_t scene_, - int32_t actorParams_, uint8_t flag_, std::string&& shortName_, std::string&& spoilerName_, + int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::string&& spoilerName_, std::vector&& categories, bool isVanillaCompletion_ = false); static Location HintStone(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, uint8_t scene_, - int32_t actorParams_, uint8_t flag_, std::string&& shortName_, + int32_t actorParams_, uint16_t flag_, std::string&& shortName_, std::vector&& categories, bool isVanillaCompletion_ = false); private: @@ -379,7 +379,7 @@ class Location { ActorID actorId; uint8_t scene; int32_t actorParams; - uint8_t flag; + uint16_t flag; bool checked = false; std::string shortName; std::string spoilerName;