diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index c94c5583c..aba9f1e68 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -1267,6 +1267,14 @@ typedef enum { // - None VB_HEARTS_INCREASE_WITH_CONTAINERS, + // #### `result` + // ```c + // true + // ``` + // #### `args` + // - `*BgIceTurara` + VB_ICICLE_SETUP_DRAW, + // #### `result` // ```c // (respawnFlag == 1) || (respawnFlag == -1) @@ -1943,6 +1951,22 @@ typedef enum { // - `*EnRd` VB_REDEAD_GIBDO_FREEZE_LINK, + // #### `result` + // ```c + // this->alpha <= 0 + // ``` + // #### `args` + // - `*BgIceShelter` + VB_RED_ICE_DROP_ITEM, + + // #### `result` + // ```c + // !((this->dyna.actor.params >> 6) & 1) && (Flags_GetSwitch(play, this->dyna.actor.params & 0x3F)) + // ``` + // #### `args` + // - `*BgIceShelter` + VB_RED_ICE_MELTED_FLAG, + // #### `result` // #### `result` // ```c @@ -2263,6 +2287,22 @@ typedef enum { // - None VB_SPEAK, + // #### `result` + // ```c + // this->dyna.actor.params == TURARA_STALACTITE_REGROW + // ``` + // #### `args` + // - `*BgIceTurara` + VB_STALACTITE_DROP_ITEM, + + // #### `result` + // ```c + // this->collider.base.acFlags & AC_HIT + // ``` + // #### `args` + // - `*BgIceTurara` + VB_STALAGMITE_DROP_ITEM, + // #### `result` // ```c // varies, never set should to true 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 0dbf96683..550d77b9a 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 @@ -1865,6 +1865,14 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*french*/ "Selon moi, #appeler la pluie près de l’entrée d’une grotte gelée# révèle #[[1]]#.", {QM_RED, QM_GREEN})); // /*spanish*/ Según dicen, una #Skulltula tras un ardiente hielo# otorga #[[1]]#. + hintTextTable[RHT_ICE_CAVERN_ICICLE] = HintText(CustomMessage("They say that #breaking an icicle in a frozen cavern# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Zerschlagen eines Eiszapfens in einer gefrorenen Kaverne# #[[1]]# enthülle.", + /*french*/ "Selon moi, #briser un stalactite de glace dans la Caverne Polaire# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_ICE_CAVERN_RED_ICE] = HintText(CustomMessage("They say that #melting red ice in a frozen cavern# gives #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Schmelzen von rotem Eis in einer gefrorenen Kaverne# #[[1]]# gäbe.", + /*french*/ "Selon moi, #faire fondre la glace rouge dans la Caverne Polaire# donne #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | Gerudo Training Ground | ---------------------------*/ @@ -2059,6 +2067,14 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand in der Gerudo-Trainingsarena# #[[1]]# verstecke.", /*french*/ "Selon moi, un #objet merveilleux dans le Gymnase Gerudo# cache #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_GERUDO_TRAINING_GROUND_ICICLE] = HintText(CustomMessage("They say that #breaking an icicle in in Gerudo Training Ground# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Zerschlagen eines Eiszapfens in der Gerudo-Trainingsarena# #[[1]]# enthülle.", + /*french*/ "Selon moi, #briser un stalactite de glace dans le Gymnase Gerudo# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_GERUDO_TRAINING_GROUND_RED_ICE] = HintText(CustomMessage("They say that #melting red ice in Gerudo Training Ground# gives #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Schmelzen von rotem Eis in der Gerudo-Trainingsarena# #[[1]]# gäbe.", + /*french*/ "Selon moi, #faire fondre la glace rouge dans le Gymnase Gerudo# donne #[[1]]#.", {QM_RED, QM_GREEN})); + /*-------------------------- | GANONS CASTLE | ---------------------------*/ @@ -2272,6 +2288,13 @@ void StaticData::HintTable_Init_Exclude_Dungeon() { /*german*/ "Man erzählt sich, daß sich ein #Wunder-Gegenstand in Ganons Schloß# #[[1]]# verstecke.", /*french*/ "Selon moi, un #objet merveilleux dans le Château de Ganon# cache #[[1]]#.", {QM_RED, QM_GREEN})); + hintTextTable[RHT_GANONS_CASTLE_ICICLE] = HintText(CustomMessage("They say that #breaking an icicle in Ganon's Castle# reveals #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Zerschlagen eines Eiszapfens Ganons Schloß# #[[1]]# enthülle.", + /*french*/ "Selon moi, #briser un stalactite de glace dans le Château de Ganon# révèle #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_GANONS_CASTLE_RED_ICE] = HintText(CustomMessage("They say that #melting red ice in a Ganon's Castle# gives #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Schmelzen von rotem Eis in Ganons Schloß# #[[1]]# gäbe.", + /*french*/ "Selon moi, #faire fondre la glace rouge dans le Château de Ganon# donne #[[1]]#.", {QM_RED, QM_GREEN})); // clang-format on } } // namespace Rando 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 325092bc1..175f8be7c 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 @@ -2323,6 +2323,11 @@ void StaticData::HintTable_Init_Exclude_Overworld() { hintTextTable[RHT_BEGGAR_KAKARIKO_VILLAGE] = HintText(CustomMessage("They say that #trading with a beggar in Kakariko Village# gives #[[1]]#.", /*german*/ "Man erzählt sich, daß das #Handeln mit einem Bettler in Kakariko# #[[1]]# gäbe.", /*french*/ "Selon moi, #échanger avec un mendiant dans le Village de Cocorico# donne #[[1]]#.", {QM_RED, QM_GREEN})); + + hintTextTable[RHT_RED_ICE_ZORAS_DOMAIN] = HintText(CustomMessage("They say that #melting red ice in Zora's Domain# gives #[[1]]#.", + /*german*/ "Man erzählt sich, daß das #Schmelzen von rotem Eis in Zoras Reich# #[[1]]# gäbe.", + /*french*/ "Selon moi, #faire fondre la glace rouge dans le Domaine Zora# donne #[[1]]#.", {QM_RED, QM_GREEN})); + // clang-format on } } // namespace Rando diff --git a/soh/soh/Enhancements/randomizer/SeedContext.cpp b/soh/soh/Enhancements/randomizer/SeedContext.cpp index 448d1c2aa..512984117 100644 --- a/soh/soh/Enhancements/randomizer/SeedContext.cpp +++ b/soh/soh/Enhancements/randomizer/SeedContext.cpp @@ -217,6 +217,8 @@ void Context::GenerateLocationPool() { (location.GetRCType() == RCTYPE_NLTREE && (!mOptions[RSK_SHUFFLE_TREES] || mOptions[RSK_LOGIC_RULES].IsNot(RO_LOGIC_NO_LOGIC))) || (location.GetRCType() == RCTYPE_BUSH && !mOptions[RSK_SHUFFLE_BUSHES]) || + (location.GetRCType() == RCTYPE_ICICLE && !mOptions[RSK_SHUFFLE_ICICLES]) || + (location.GetRCType() == RCTYPE_RED_ICE && !mOptions[RSK_SHUFFLE_RED_ICE]) || (location.GetRCType() == RCTYPE_SIGN && mOptions[RSK_SHUFFLE_SIGNS].Is(RO_SHUFFLE_SIGNS_OFF)) || (location.GetRCType() == RCTYPE_WONDER_ITEM && mOptions[RSK_SHUFFLE_WONDER_ITEMS].Is(RO_SHUFFLE_WONDER_ITEMS_OFF)) || diff --git a/soh/soh/Enhancements/randomizer/ShuffleIcicles.cpp b/soh/soh/Enhancements/randomizer/ShuffleIcicles.cpp new file mode 100644 index 000000000..ff16fab11 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleIcicles.cpp @@ -0,0 +1,308 @@ +#include "soh/OTRGlobals.h" +#include "soh/ObjectExtension/ObjectExtension.h" +#include "item_category_adj.h" +#include "particle_cmc.h" + +extern "C" { +#include "functions.h" +#include "overlays/actors/ovl_Bg_Ice_Turara/z_bg_ice_turara.h" +#include "objects/object_ice_objects/object_ice_objects.h" +#include "objects/object_tk/object_tk.h" +extern PlayState* gPlayState; +} + +struct StalactiteDropped {}; +static ObjectExtension::Register StalactiteDroppedRegister; + +extern void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play); + +extern "C" void DrawItemHalo(Actor* icicleActor) { + // If the regrowing stalactite has already dropped, return + if (ObjectExtension::GetInstance().Has(icicleActor)) { + return; + } + + GetItemCategory getItemCategory; + bool cmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), 0); + int requiresStoneAgony = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); + int isNotCMC = !cmc || (requiresStoneAgony && !CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)); + const auto icicleIdentity = ObjectExtension::GetInstance().Get(icicleActor); + + GetItemEntry icicleItem = + Rando::Context::GetInstance()->GetFinalGIEntry(icicleIdentity->randomizerCheck, true, GI_NONE); + getItemCategory = Randomizer_AdjustItemCategory(icicleItem); + + if (isNotCMC) { + getItemCategory = ITEM_CATEGORY_MAJOR; + } + Color_RGBA8 primColor = Randomizer_GetParticleCMCColor(getItemCategory, COLOR_PRIMARY); + + // Align halo to center of icicles + // Ice Cavern HP room is slightly different for stalactites + f32 yOffset = (icicleActor->params == 0) ? 135.0f : 45.0f; + f32 xOffset = -23.0f; + f32 zOffset = (icicleActor->params == 0) ? 5.0f + : (gPlayState->sceneNum == SCENE_ICE_CAVERN && gPlayState->roomCtx.curRoom.num == 11) ? 4.0f + : 2.0f; + + // Rotate and draw halo with CMC colors + Matrix_Translate(icicleActor->world.pos.x + xOffset, icicleActor->world.pos.y + yOffset, + icicleActor->world.pos.z + zOffset, MTXMODE_NEW); + Matrix_RotateZ(-M_PI / 2, MTXMODE_APPLY); + Matrix_Scale(0.01f, 0.01f, 0.01f, MTXMODE_APPLY); + OPEN_DISPS(gPlayState->state.gfxCtx); + gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(gPlayState->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gDPSetGrayscaleColor(POLY_OPA_DISP++, primColor.r, primColor.g, primColor.b, 175); + gSPGrayscale(POLY_OPA_DISP++, true); + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gDampeHaloDL); + gSPGrayscale(POLY_OPA_DISP++, false); + CLOSE_DISPS(gPlayState->state.gfxCtx); +} + +uint8_t BgIceTurara_RandomizerHoldsItem(Actor* actor) { + const auto icicleIdentity = ObjectExtension::GetInstance().Get(actor); + if (icicleIdentity == nullptr) { + return false; + } + + RandomizerCheck rc = icicleIdentity->randomizerCheck; + + // Don't pull randomized item if icicle isn't randomized or is already checked + if (!IS_RANDO || Flags_GetRandomizerInf(icicleIdentity->randomizerInf) || + icicleIdentity->randomizerCheck == RC_UNKNOWN_CHECK) { + return false; + } else { + return true; + } +} + +void BgIceTurara_RandomizerSpawnCollectible(void* actor) { + BgIceTurara* icicleActor = (BgIceTurara*)actor; + const auto icicleIdentity = ObjectExtension::GetInstance().Get(&icicleActor->dyna.actor); + + EnItem00* item00 = + (EnItem00*)Item_DropCollectible2(gPlayState, &icicleActor->dyna.actor.world.pos, ITEM00_SOH_DUMMY); + item00->randoInf = icicleIdentity->randomizerInf; + item00->itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(icicleIdentity->randomizerCheck, true, GI_NONE); + item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; + item00->actor.velocity.y = 8.0f; + item00->actor.speedXZ = 2.0f; + item00->actor.world.rot.y = static_cast(Rand_CenteredFloat(65536.0f)); +} + +void RegisterShuffleIcicles() { + bool shouldRegister = IS_RANDO && Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_ICICLES).Get(); + + COND_ID_HOOK(OnActorInit, ACTOR_BG_ICE_TURARA, shouldRegister, [](void* actorRef) { + Actor* actor = static_cast(actorRef); + BgIceTurara* icicleActor = static_cast(actorRef); + + auto icicleIdentity = OTRGlobals::Instance->gRandomizer->IdentifyIcicle( + gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z); + ObjectExtension::GetInstance().Set(actor, std::move(icicleIdentity)); + }); + + // Draw halo around icicles + COND_VB_SHOULD(VB_ICICLE_SETUP_DRAW, shouldRegister, { + BgIceTurara* icicleActor = va_arg(args, BgIceTurara*); + if (BgIceTurara_RandomizerHoldsItem(&icicleActor->dyna.actor) && + !ObjectExtension::GetInstance().Has(&icicleActor->dyna.actor)) { + DrawItemHalo(&icicleActor->dyna.actor); + } + }); + + // Drop item for stalagmites + COND_VB_SHOULD(VB_STALAGMITE_DROP_ITEM, shouldRegister, { + BgIceTurara* icicleActor = va_arg(args, BgIceTurara*); + + if (*should) { + if (BgIceTurara_RandomizerHoldsItem(&icicleActor->dyna.actor)) { + BgIceTurara_RandomizerSpawnCollectible(&icicleActor->dyna.actor); + } + } + }); + + // Drop item for stalactites + COND_VB_SHOULD(VB_STALACTITE_DROP_ITEM, shouldRegister, { + BgIceTurara* icicleActor = va_arg(args, BgIceTurara*); + + if (BgIceTurara_RandomizerHoldsItem(&icicleActor->dyna.actor)) { + // Set and check if regrowing stalactite has already dropped + if (*should) { + auto& ext = ObjectExtension::GetInstance(); + if (!ext.Has(&icicleActor->dyna.actor)) { + ext.Set(&icicleActor->dyna.actor, StalactiteDropped{}); + BgIceTurara_RandomizerSpawnCollectible(&icicleActor->dyna.actor); + } + } else { + BgIceTurara_RandomizerSpawnCollectible(&icicleActor->dyna.actor); + } + } + }); + + // Remove the drop indicator when the actor is destroyed + COND_ID_HOOK(OnActorDestroy, ACTOR_BG_ICE_TURARA, shouldRegister, + [](void* actor) { ObjectExtension::GetInstance().Remove(actor); }); +} + +void Rando::StaticData::RegisterIcicleLocations() { + static bool registered = false; + if (registered) + return; + registered = true; + // clang-format off + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Spoiler Collection Check + locationTable[RC_ICE_CAVERN_ENTRANCE_LEFT_STALAGMITE] = Location::Icicle(RC_ICE_CAVERN_ENTRANCE_LEFT_STALAGMITE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(295, 2386), "Entrance Left Stalagmite", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_ENTRANCE_LEFT_STALAGMITE)); + locationTable[RC_ICE_CAVERN_ENTRANCE_MIDDLE_STALAGMITE] = Location::Icicle(RC_ICE_CAVERN_ENTRANCE_MIDDLE_STALAGMITE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(313, 2446), "Entrance Middle Stalagmite", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_ENTRANCE_MIDDLE_STALAGMITE)); + locationTable[RC_ICE_CAVERN_ENTRANCE_RIGHT_STALAGMITE] = Location::Icicle(RC_ICE_CAVERN_ENTRANCE_RIGHT_STALAGMITE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(400, 2443), "Entrance Right Stalagmite", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_ENTRANCE_RIGHT_STALAGMITE)); + locationTable[RC_ICE_CAVERN_ENTRANCE_STALACTITE_1] = Location::Icicle(RC_ICE_CAVERN_ENTRANCE_STALACTITE_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(499, 2229), "Entrance Stalactite 1", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_ENTRANCE_STALACTITE_1)); + locationTable[RC_ICE_CAVERN_ENTRANCE_STALACTITE_2] = Location::Icicle(RC_ICE_CAVERN_ENTRANCE_STALACTITE_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(536, 2071), "Entrance Stalactite 2", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_ENTRANCE_STALACTITE_2)); + locationTable[RC_ICE_CAVERN_LOBBY_STALACTITE] = Location::Icicle(RC_ICE_CAVERN_LOBBY_STALACTITE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-18, 1760), "Lobby Stalactite", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_LOBBY_STALACTITE)); + locationTable[RC_ICE_CAVERN_LOBBY_LEFT_STALAGMITE] = Location::Icicle(RC_ICE_CAVERN_LOBBY_LEFT_STALAGMITE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-62, 1642), "Lobby Left Stalagmite", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_LOBBY_LEFT_STALAGMITE)); + locationTable[RC_ICE_CAVERN_LOBBY_MIDDLE_STALAGMITE] = Location::Icicle(RC_ICE_CAVERN_LOBBY_MIDDLE_STALAGMITE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-19, 1676), "Lobby Middle Stalagmite", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_LOBBY_MIDDLE_STALAGMITE)); + locationTable[RC_ICE_CAVERN_LOBBY_RIGHT_STALAGMITE] = Location::Icicle(RC_ICE_CAVERN_LOBBY_RIGHT_STALAGMITE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(36, 1643), "Lobby Right Stalagmite", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_LOBBY_RIGHT_STALAGMITE)); + locationTable[RC_ICE_CAVERN_AFTER_LOBBY_STALACTITE] = Location::Icicle(RC_ICE_CAVERN_AFTER_LOBBY_STALACTITE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-237, 472), "After Lobby Stalactite", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_AFTER_LOBBY_STALACTITE)); + locationTable[RC_ICE_CAVERN_AFTER_LOBBY_LEFT_STALAGMITE] = Location::Icicle(RC_ICE_CAVERN_AFTER_LOBBY_LEFT_STALAGMITE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-308, 322), "After Lobby Left Stalagmite", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_AFTER_LOBBY_LEFT_STALAGMITE)); + locationTable[RC_ICE_CAVERN_AFTER_LOBBY_CENTER_LEFT_STALAGMITE] = Location::Icicle(RC_ICE_CAVERN_AFTER_LOBBY_CENTER_LEFT_STALAGMITE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-272, 348), "After Lobby Center Left Stalagmite", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_AFTER_LOBBY_CENTER_LEFT_STALAGMITE)); + locationTable[RC_ICE_CAVERN_AFTER_LOBBY_CENTER_RIGHT_STALAGMITE] = Location::Icicle(RC_ICE_CAVERN_AFTER_LOBBY_CENTER_RIGHT_STALAGMITE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-226, 371), "After Lobby Center Right Stalagmite", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_AFTER_LOBBY_CENTER_RIGHT_STALAGMITE)); + locationTable[RC_ICE_CAVERN_AFTER_LOBBY_RIGHT_STALAGMITE] = Location::Icicle(RC_ICE_CAVERN_AFTER_LOBBY_RIGHT_STALAGMITE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-187, 395), "After Lobby Right Stalagmite", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_AFTER_LOBBY_RIGHT_STALAGMITE)); + locationTable[RC_ICE_CAVERN_SPINNING_BLADE_LEFT_STALAGMITE] = Location::Icicle(RC_ICE_CAVERN_SPINNING_BLADE_LEFT_STALAGMITE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(44, -139), "Spinning Blade Left Stalagmite", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_LEFT_STALAGMITE)); + locationTable[RC_ICE_CAVERN_SPINNING_BLADE_MIDDLE_STALAGMITE] = Location::Icicle(RC_ICE_CAVERN_SPINNING_BLADE_MIDDLE_STALAGMITE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(22, -170), "Spinning Blade Middle Stalagmite", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_MIDDLE_STALAGMITE)); + locationTable[RC_ICE_CAVERN_SPINNING_BLADE_RIGHT_STALAGMITE] = Location::Icicle(RC_ICE_CAVERN_SPINNING_BLADE_RIGHT_STALAGMITE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-9, -175), "Spinning Blade Right Stalagmite", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_RIGHT_STALAGMITE)); + locationTable[RC_ICE_CAVERN_MAP_HALLWAY_STALACTITE_1] = Location::Icicle(RC_ICE_CAVERN_MAP_HALLWAY_STALACTITE_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1264, -890), "Map Hallway Stalactite 1", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MAP_HALLWAY_STALACTITE_1)); + locationTable[RC_ICE_CAVERN_MAP_HALLWAY_STALACTITE_2] = Location::Icicle(RC_ICE_CAVERN_MAP_HALLWAY_STALACTITE_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1141, -946), "Map Hallway Stalactite 2", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MAP_HALLWAY_STALACTITE_2)); + locationTable[RC_ICE_CAVERN_MAP_HALLWAY_STALACTITE_3] = Location::Icicle(RC_ICE_CAVERN_MAP_HALLWAY_STALACTITE_3, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1229, -1134), "Map Hallway Stalactite 3", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MAP_HALLWAY_STALACTITE_3)); + locationTable[RC_ICE_CAVERN_MAP_HALLWAY_STALACTITE_4] = Location::Icicle(RC_ICE_CAVERN_MAP_HALLWAY_STALACTITE_4, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1063, -1300), "Map Hallway Stalactite 4", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MAP_HALLWAY_STALACTITE_4)); + locationTable[RC_ICE_CAVERN_MAP_HALLWAY_STALACTITE_5] = Location::Icicle(RC_ICE_CAVERN_MAP_HALLWAY_STALACTITE_5, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1088, -1505), "Map Hallway Stalactite 5", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MAP_HALLWAY_STALACTITE_5)); + locationTable[RC_ICE_CAVERN_MAP_HALLWAY_LEFT_STALAGMITE] = Location::Icicle(RC_ICE_CAVERN_MAP_HALLWAY_LEFT_STALAGMITE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(951, -1217), "Map Hallway Left Stalagmite", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MAP_HALLWAY_LEFT_STALAGMITE)); + locationTable[RC_ICE_CAVERN_MAP_HALLWAY_MIDDLE_STALAGMITE] = Location::Icicle(RC_ICE_CAVERN_MAP_HALLWAY_MIDDLE_STALAGMITE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1029, -1217), "Map Hallway Middle Stalagmite", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MAP_HALLWAY_MIDDLE_STALAGMITE)); + locationTable[RC_ICE_CAVERN_MAP_HALLWAY_RIGHT_STALAGMITE] = Location::Icicle(RC_ICE_CAVERN_MAP_HALLWAY_RIGHT_STALAGMITE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1187, -1217), "Map Hallway Right Stalagmite", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MAP_HALLWAY_RIGHT_STALAGMITE)); + locationTable[RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_1] = Location::Icicle(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1026, 296), "Heart Piece Room Center Stalactite 1", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_1)); + locationTable[RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_2] = Location::Icicle(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1092, 274), "Heart Piece Room Center Stalactite 2", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_2)); + locationTable[RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_3] = Location::Icicle(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_3, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1058, 369), "Heart Piece Room Center Stalactite 3", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_3)); + locationTable[RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_4] = Location::Icicle(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_4, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1148, 347), "Heart Piece Room Center Stalactite 4", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_4)); + locationTable[RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_5] = Location::Icicle(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_5, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1252, 356), "Heart Piece Room Center Stalactite 5", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_5)); + locationTable[RC_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALACTITE_1] = Location::Icicle(RC_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALACTITE_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1187, 66), "Heart Piece Room Left Stalactite 1", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALACTITE_1)); + locationTable[RC_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALACTITE_2] = Location::Icicle(RC_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALACTITE_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1347, 110), "Heart Piece Room Left Stalactite 2", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALACTITE_2)); + locationTable[RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_1] = Location::Icicle(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1361, 312), "Heart Piece Room Center Stalagmite 1", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_1)); + locationTable[RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_2] = Location::Icicle(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1336, 343), "Heart Piece Room Center Stalagmite 2", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_2)); + locationTable[RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_3] = Location::Icicle(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_3, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1348, 382), "Heart Piece Room Center Stalagmite 3", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_3)); + locationTable[RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_4] = Location::Icicle(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_4, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1321, 404), "Heart Piece Room Center Stalagmite 4", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_4)); + locationTable[RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_5] = Location::Icicle(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_5, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1341, 438), "Heart Piece Room Center Stalagmite 5", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_5)); + locationTable[RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_6] = Location::Icicle(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_6, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1317, 470), "Heart Piece Room Center Stalagmite 6", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_6)); + locationTable[RC_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALAGMITE_1] = Location::Icicle(RC_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALAGMITE_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1223, 195), "Heart Piece Room Left Stalagmite 1", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALAGMITE_1)); + locationTable[RC_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALAGMITE_2] = Location::Icicle(RC_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALAGMITE_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1257, 202), "Heart Piece Room Left Stalagmite 2", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALAGMITE_2)); + locationTable[RC_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALAGMITE_3] = Location::Icicle(RC_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALAGMITE_3, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1297, 200), "Heart Piece Room Left Stalagmite 3", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALAGMITE_3)); + locationTable[RC_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_1] = Location::Icicle(RC_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1159, 552), "Heart Piece Room Right Stalagmite 1", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_1)); + locationTable[RC_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_2] = Location::Icicle(RC_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1191, 565), "Heart Piece Room Right Stalagmite 2", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_2)); + locationTable[RC_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_3] = Location::Icicle(RC_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_3, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1227, 549), "Heart Piece Room Right Stalagmite 3", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_3)); + locationTable[RC_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_4] = Location::Icicle(RC_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_4, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1267, 559), "Heart Piece Room Right Stalagmite 4", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_4)); + locationTable[RC_ICE_CAVERN_PUSH_BLOCK_HALL_LEFT_STALAGMITE] = Location::Icicle(RC_ICE_CAVERN_PUSH_BLOCK_HALL_LEFT_STALAGMITE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-518, -601), "Push Block Hall Left Stalagmite", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_PUSH_BLOCK_HALL_LEFT_STALAGMITE)); + locationTable[RC_ICE_CAVERN_PUSH_BLOCK_HALL_CENTER_LEFT_STALAGMITE] = Location::Icicle(RC_ICE_CAVERN_PUSH_BLOCK_HALL_CENTER_LEFT_STALAGMITE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-487, -600), "Push Block Hall Center Left Stalagmite", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_PUSH_BLOCK_HALL_CENTER_LEFT_STALAGMITE)); + locationTable[RC_ICE_CAVERN_PUSH_BLOCK_HALL_CENTER_STALAGMITE] = Location::Icicle(RC_ICE_CAVERN_PUSH_BLOCK_HALL_CENTER_STALAGMITE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-451, -604), "Push Block Hall Center Stalagmite", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_PUSH_BLOCK_HALL_CENTER_STALAGMITE)); + locationTable[RC_ICE_CAVERN_PUSH_BLOCK_HALL_CENTER_RIGHT_STALAGMITE] = Location::Icicle(RC_ICE_CAVERN_PUSH_BLOCK_HALL_CENTER_RIGHT_STALAGMITE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-414, -610), "Push Block Hall Center Right Stalagmite", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_PUSH_BLOCK_HALL_CENTER_RIGHT_STALAGMITE)); + locationTable[RC_ICE_CAVERN_PUSH_BLOCK_HALL_RIGHT_STALAGMITE] = Location::Icicle(RC_ICE_CAVERN_PUSH_BLOCK_HALL_RIGHT_STALAGMITE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-373, -605), "Push Block Hall Right Stalagmite", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_PUSH_BLOCK_HALL_RIGHT_STALAGMITE)); + locationTable[RC_ICE_CAVERN_PUSH_BLOCK_HALL_STALACTITE_1] = Location::Icicle(RC_ICE_CAVERN_PUSH_BLOCK_HALL_STALACTITE_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-385, -686), "Push Block Hall Stalactite 1", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_PUSH_BLOCK_HALL_STALACTITE_1)); + locationTable[RC_ICE_CAVERN_PUSH_BLOCK_HALL_STALACTITE_2] = Location::Icicle(RC_ICE_CAVERN_PUSH_BLOCK_HALL_STALACTITE_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-314, -768), "Push Block Hall Stalactite 2", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_PUSH_BLOCK_HALL_STALACTITE_2)); + locationTable[RC_ICE_CAVERN_PUSH_BLOCK_HALL_STALACTITE_3] = Location::Icicle(RC_ICE_CAVERN_PUSH_BLOCK_HALL_STALACTITE_3, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-359, -862), "Push Block Hall Stalactite 3", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_PUSH_BLOCK_HALL_STALACTITE_3)); + locationTable[RC_ICE_CAVERN_NEAR_END_STALACTITE_1] = Location::Icicle(RC_ICE_CAVERN_NEAR_END_STALACTITE_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1231, 170), "Near End Stalactite 1", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_STALACTITE_1)); + locationTable[RC_ICE_CAVERN_NEAR_END_STALACTITE_2] = Location::Icicle(RC_ICE_CAVERN_NEAR_END_STALACTITE_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1328, 215), "Near End Stalactite 2", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_STALACTITE_2)); + locationTable[RC_ICE_CAVERN_NEAR_END_STALACTITE_3] = Location::Icicle(RC_ICE_CAVERN_NEAR_END_STALACTITE_3, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1412, 246), "Near End Stalactite 3", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_STALACTITE_3)); + locationTable[RC_ICE_CAVERN_NEAR_END_STALACTITE_4] = Location::Icicle(RC_ICE_CAVERN_NEAR_END_STALACTITE_4, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1571, 422), "Near End Stalactite 4", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_STALACTITE_4)); + locationTable[RC_ICE_CAVERN_NEAR_END_STALAGMITE_1] = Location::Icicle(RC_ICE_CAVERN_NEAR_END_STALAGMITE_1, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1288, 184), "Near End Stalagmite 1", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_STALAGMITE_1)); + locationTable[RC_ICE_CAVERN_NEAR_END_STALAGMITE_2] = Location::Icicle(RC_ICE_CAVERN_NEAR_END_STALAGMITE_2, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1367, 206), "Near End Stalagmite 2", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_STALAGMITE_2)); + locationTable[RC_ICE_CAVERN_NEAR_END_STALAGMITE_3] = Location::Icicle(RC_ICE_CAVERN_NEAR_END_STALAGMITE_3, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1349, 270), "Near End Stalagmite 3", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_STALAGMITE_3)); + locationTable[RC_ICE_CAVERN_NEAR_END_STALAGMITE_4] = Location::Icicle(RC_ICE_CAVERN_NEAR_END_STALAGMITE_4, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1514, 307), "Near End Stalagmite 4", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_STALAGMITE_4)); + locationTable[RC_ICE_CAVERN_NEAR_END_STALAGMITE_5] = Location::Icicle(RC_ICE_CAVERN_NEAR_END_STALAGMITE_5, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1507, 443), "Near End Stalagmite 5", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_STALAGMITE_5)); + locationTable[RC_ICE_CAVERN_NEAR_END_STALAGMITE_6] = Location::Icicle(RC_ICE_CAVERN_NEAR_END_STALAGMITE_6, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1624, 431), "Near End Stalagmite 6", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_STALAGMITE_6)); + locationTable[RC_ICE_CAVERN_NEAR_END_STALAGMITE_7] = Location::Icicle(RC_ICE_CAVERN_NEAR_END_STALAGMITE_7, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1587, 497), "Near End Stalagmite 7", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_STALAGMITE_7)); + locationTable[RC_ICE_CAVERN_NEAR_END_STALAGMITE_8] = Location::Icicle(RC_ICE_CAVERN_NEAR_END_STALAGMITE_8, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1595, 600), "Near End Stalagmite 8", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_STALAGMITE_8)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_1] = Location::Icicle(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1687, -859), "Water Trial Stalagmite 1", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_1)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_2] = Location::Icicle(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1706, -884), "Water Trial Stalagmite 2", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_2)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_3] = Location::Icicle(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_3, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1735, -898), "Water Trial Stalagmite 3", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_3)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_4] = Location::Icicle(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_4, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1761, -887), "Water Trial Stalagmite 4", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_4)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_5] = Location::Icicle(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_5, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1787, -871), "Water Trial Stalagmite 5", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_5)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_6] = Location::Icicle(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_6, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1783, -833), "Water Trial Stalagmite 6", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_6)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_7] = Location::Icicle(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_7, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1770, -798), "Water Trial Stalagmite 7", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_7)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_8] = Location::Icicle(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_8, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1737, -787), "Water Trial Stalagmite 8", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_8)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_9] = Location::Icicle(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_9, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1698, -797), "Water Trial Stalagmite 9", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_9)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_10] = Location::Icicle(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_10, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1683, -828), "Water Trial Stalagmite 10", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_10)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_LEFT_STALAGMITE_1] = Location::Icicle(RC_GANONS_CASTLE_WATER_TRIAL_LEFT_STALAGMITE_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1966, -1089), "Water Trial Left Stalagmite 1", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_LEFT_STALAGMITE_1)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_LEFT_STALAGMITE_2] = Location::Icicle(RC_GANONS_CASTLE_WATER_TRIAL_LEFT_STALAGMITE_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2040, -1015), "Water Trial Left Stalagmite 2", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_LEFT_STALAGMITE_2)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_STALAGMITE_1] = Location::Icicle(RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_STALAGMITE_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1980, -590), "Water Trial Right Stalagmite 1", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_RIGHT_STALAGMITE_1)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_STALAGMITE_2] = Location::Icicle(RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_STALAGMITE_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2058, -655), "Water Trial Right Stalagmite 2", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_RIGHT_STALAGMITE_2)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_1] = Location::Icicle(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_1, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1549, -836), "Water Trial Stalactite 1", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_1)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_2] = Location::Icicle(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_2, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1611, -843), "Water Trial Stalactite 2", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_2)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_3] = Location::Icicle(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_3, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1657, -882), "Water Trial Stalactite 3", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_3)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_4] = Location::Icicle(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_4, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1651, -805), "Water Trial Stalactite 4", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_4)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_5] = Location::Icicle(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_5, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1761, -949), "Water Trial Stalactite 5", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_5)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_6] = Location::Icicle(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_6, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1714, -757), "Water Trial Stalactite 6", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_6)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_7] = Location::Icicle(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_7, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1811, -905), "Water Trial Stalactite 7", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_7)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_8] = Location::Icicle(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_8, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1769, -761), "Water Trial Stalactite 8", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_8)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_9] = Location::Icicle(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_9, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1821, -817), "Water Trial Stalactite 9", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_9)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_10] = Location::Icicle(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_10, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1996, -1033), "Water Trial Stalactite 10", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_10)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_11] = Location::Icicle(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_11, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1995, -648), "Water Trial Stalactite 11", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_11)); + locationTable[RC_ICE_CAVERN_MQ_ENTRANCE_STALAGMITE_1] = Location::Icicle(RC_ICE_CAVERN_MQ_ENTRANCE_STALAGMITE_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(287, 2346), "Entrance Stalagmite 1", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_ENTRANCE_STALAGMITE_1)); + locationTable[RC_ICE_CAVERN_MQ_ENTRANCE_STALAGMITE_2] = Location::Icicle(RC_ICE_CAVERN_MQ_ENTRANCE_STALAGMITE_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(324, 2280), "Entrance Stalagmite 2", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_ENTRANCE_STALAGMITE_2)); + locationTable[RC_ICE_CAVERN_MQ_LOBBY_STALACTITE_1] = Location::Icicle(RC_ICE_CAVERN_MQ_LOBBY_STALACTITE_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(268, 980), "Lobby Stalactite 1", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_LOBBY_STALACTITE_1)); + locationTable[RC_ICE_CAVERN_MQ_LOBBY_STALACTITE_2] = Location::Icicle(RC_ICE_CAVERN_MQ_LOBBY_STALACTITE_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(204, 910), "Lobby Stalactite 2", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_LOBBY_STALACTITE_2)); + locationTable[RC_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_1] = Location::Icicle(RC_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-351, 423), "After Lobby Stalagmite 1", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_1)); + locationTable[RC_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_2] = Location::Icicle(RC_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-288, 402), "After Lobby Stalagmite 2", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_2)); + locationTable[RC_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_3] = Location::Icicle(RC_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_3, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-258, 461), "After Lobby Stalagmite 3", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_3)); + locationTable[RC_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_4] = Location::Icicle(RC_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_4, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-212, 398), "After Lobby Stalagmite 4", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_4)); + locationTable[RC_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_5] = Location::Icicle(RC_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_5, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-19, 193), "After Lobby Stalagmite 5", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_5)); + locationTable[RC_ICE_CAVERN_MQ_HUB_STALAGMITE_1] = Location::Icicle(RC_ICE_CAVERN_MQ_HUB_STALAGMITE_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(607, -170), "Hub Stalagmite 1", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_HUB_STALAGMITE_1)); + locationTable[RC_ICE_CAVERN_MQ_HUB_STALAGMITE_2] = Location::Icicle(RC_ICE_CAVERN_MQ_HUB_STALAGMITE_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(598, -213), "Hub Stalagmite 2", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_HUB_STALAGMITE_2)); + locationTable[RC_ICE_CAVERN_MQ_HUB_STALAGMITE_3] = Location::Icicle(RC_ICE_CAVERN_MQ_HUB_STALAGMITE_3, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(597, -256), "Hub Stalagmite 3", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_HUB_STALAGMITE_3)); + locationTable[RC_ICE_CAVERN_MQ_HUB_STALAGMITE_4] = Location::Icicle(RC_ICE_CAVERN_MQ_HUB_STALAGMITE_4, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(614, -292), "Hub Stalagmite 4", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_HUB_STALAGMITE_4)); + locationTable[RC_ICE_CAVERN_MQ_HUB_STALAGMITE_5] = Location::Icicle(RC_ICE_CAVERN_MQ_HUB_STALAGMITE_5, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(640, -312), "Hub Stalagmite 5", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_HUB_STALAGMITE_5)); + locationTable[RC_ICE_CAVERN_MQ_MAP_ROOM_LEFT_STALAGMITE_1] = Location::Icicle(RC_ICE_CAVERN_MQ_MAP_ROOM_LEFT_STALAGMITE_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1170, 97), "Map Room Left Stalagmite 1", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_LEFT_STALAGMITE_1)); + locationTable[RC_ICE_CAVERN_MQ_MAP_ROOM_LEFT_STALAGMITE_2] = Location::Icicle(RC_ICE_CAVERN_MQ_MAP_ROOM_LEFT_STALAGMITE_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1149, 64), "Map Room Left Stalagmite 2", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_LEFT_STALAGMITE_2)); + locationTable[RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_1] = Location::Icicle(RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1334, 473), "Map Room Center Stalagmite 1", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_1)); + locationTable[RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_2] = Location::Icicle(RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1327, 442), "Map Room Center Stalagmite 2", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_2)); + locationTable[RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_3] = Location::Icicle(RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_3, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1321, 410), "Map Room Center Stalagmite 3", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_3)); + locationTable[RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_4] = Location::Icicle(RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_4, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1325, 369), "Map Room Center Stalagmite 4", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_4)); + locationTable[RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_5] = Location::Icicle(RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_5, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1344, 332), "Map Room Center Stalagmite 5", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_5)); + locationTable[RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_6] = Location::Icicle(RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_6, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1375, 291), "Map Room Center Stalagmite 6", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_6)); + locationTable[RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_7] = Location::Icicle(RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_7, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1345, 260), "Map Room Center Stalagmite 7", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_7)); + locationTable[RC_ICE_CAVERN_MQ_COMPASS_LEFT_STALAGMITE_1] = Location::Icicle(RC_ICE_CAVERN_MQ_COMPASS_LEFT_STALAGMITE_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(742, -2464), "Compass Left Stalagmite 1", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_COMPASS_LEFT_STALAGMITE_1)); + locationTable[RC_ICE_CAVERN_MQ_COMPASS_LEFT_STALAGMITE_2] = Location::Icicle(RC_ICE_CAVERN_MQ_COMPASS_LEFT_STALAGMITE_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(783, -2453), "Compass Left Stalagmite 2", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_COMPASS_LEFT_STALAGMITE_2)); + locationTable[RC_ICE_CAVERN_MQ_COMPASS_RIGHT_STALAGMITE_1] = Location::Icicle(RC_ICE_CAVERN_MQ_COMPASS_RIGHT_STALAGMITE_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(903, -2353), "Compass Right Stalagmite 1", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_COMPASS_RIGHT_STALAGMITE_1)); + locationTable[RC_ICE_CAVERN_MQ_COMPASS_RIGHT_STALAGMITE_2] = Location::Icicle(RC_ICE_CAVERN_MQ_COMPASS_RIGHT_STALAGMITE_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(929, -2303), "Compass Right Stalagmite 2", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_COMPASS_RIGHT_STALAGMITE_2)); + locationTable[RC_ICE_CAVERN_MQ_BEFORE_SCARECROW_STALAGMITE] = Location::Icicle(RC_ICE_CAVERN_MQ_BEFORE_SCARECROW_STALAGMITE, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-261, -840), "Before Scarecrow Stalagmite", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_BEFORE_SCARECROW_STALAGMITE)); + locationTable[RC_ICE_CAVERN_MQ_SCARECROW_ROOM_STALACTITE] = Location::Icicle(RC_ICE_CAVERN_MQ_SCARECROW_ROOM_STALACTITE, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-763, -896), "Scarecrow Room Stalactite", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_SCARECROW_ROOM_STALACTITE)); + locationTable[RC_ICE_CAVERN_MQ_WEST_CORRIDOR_STALACTITE_1] = Location::Icicle(RC_ICE_CAVERN_MQ_WEST_CORRIDOR_STALACTITE_1, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1524, 326), "West Corridor Stalactite 1", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_WEST_CORRIDOR_STALACTITE_1)); + locationTable[RC_ICE_CAVERN_MQ_WEST_CORRIDOR_STALACTITE_2] = Location::Icicle(RC_ICE_CAVERN_MQ_WEST_CORRIDOR_STALACTITE_2, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1583, 609), "West Corridor Stalactite 2", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_WEST_CORRIDOR_STALACTITE_2)); + locationTable[RC_ICE_CAVERN_MQ_WEST_CORRIDOR_STALACTITE_3] = Location::Icicle(RC_ICE_CAVERN_MQ_WEST_CORRIDOR_STALACTITE_3, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1487, 569), "West Corridor Stalactite 3", RHT_ICE_CAVERN_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_WEST_CORRIDOR_STALACTITE_3)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_1] = Location::Icicle(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_1, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-1265, -2067), "Boulder Room Stalagmite 1", RHT_GERUDO_TRAINING_GROUND_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_1)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_2] = Location::Icicle(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_2, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-1235, -2054), "Boulder Room Stalagmite 2", RHT_GERUDO_TRAINING_GROUND_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_2)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_3] = Location::Icicle(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_3, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-1205, -2080), "Boulder Room Stalagmite 3", RHT_GERUDO_TRAINING_GROUND_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_3)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_4] = Location::Icicle(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_4, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-1170, -2080), "Boulder Room Stalagmite 4", RHT_GERUDO_TRAINING_GROUND_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_4)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_5] = Location::Icicle(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_5, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-1183, -2132), "Boulder Room Stalagmite 5", RHT_GERUDO_TRAINING_GROUND_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_5)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_1] = Location::Icicle(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_1, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-1261, -1001), "Boulder Room Right Stalactite 1", RHT_GERUDO_TRAINING_GROUND_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_1)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_2] = Location::Icicle(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_2, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-1247, -1096), "Boulder Room Right Stalactite 2", RHT_GERUDO_TRAINING_GROUND_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_2)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_3] = Location::Icicle(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_3, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-1182, -1181), "Boulder Room Right Stalactite 3", RHT_GERUDO_TRAINING_GROUND_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_3)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_4] = Location::Icicle(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_4, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-1255, -1273), "Boulder Room Right Stalactite 4", RHT_GERUDO_TRAINING_GROUND_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_4)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_LEFT_STALACTITE] = Location::Icicle(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_LEFT_STALACTITE, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-1884, -1024), "Boulder Room Left Stalactite", RHT_GERUDO_TRAINING_GROUND_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_LEFT_STALACTITE)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_TOP_RIGHT_STALACTITE_1] = Location::Icicle(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_TOP_RIGHT_STALACTITE_1, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-1263, -2028), "Boulder Room Top Right Stalactite 1", RHT_GERUDO_TRAINING_GROUND_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_TOP_RIGHT_STALACTITE_1)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_TOP_RIGHT_STALACTITE_2] = Location::Icicle(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_TOP_RIGHT_STALACTITE_2, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-1216, -2029), "Boulder Room Top Right Stalactite 2", RHT_GERUDO_TRAINING_GROUND_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_TOP_RIGHT_STALACTITE_2)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_TOP_RIGHT_STALACTITE_3] = Location::Icicle(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_TOP_RIGHT_STALACTITE_3, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-1168, -2028), "Boulder Room Top Right Stalactite 3", RHT_GERUDO_TRAINING_GROUND_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_TOP_RIGHT_STALACTITE_3)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALACTITE_1] = Location::Icicle(RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALACTITE_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1791, -1141), "Water Trial Left Stalactite 1", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALACTITE_1)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALACTITE_2] = Location::Icicle(RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALACTITE_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1890, -1068), "Water Trial Left Stalactite 2", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALACTITE_2)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALACTITE_3] = Location::Icicle(RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALACTITE_3, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2002, -1068), "Water Trial Left Stalactite 3", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALACTITE_3)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALACTITE_1] = Location::Icicle(RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALACTITE_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1864, -568), "Water Trial Right Stalactite 1", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALACTITE_1)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALACTITE_2] = Location::Icicle(RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALACTITE_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1937, -658), "Water Trial Right Stalactite 2", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALACTITE_2)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALACTITE_3] = Location::Icicle(RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALACTITE_3, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2054, -667), "Water Trial Right Stalactite 3", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALACTITE_3)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_1] = Location::Icicle(RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1868, -1175), "Water Trial Left Stalagmite 1", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_1)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_2] = Location::Icicle(RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1908, -1151), "Water Trial Left Stalagmite 2", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_2)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_3] = Location::Icicle(RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_3, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1960, -1123), "Water Trial Left Stalagmite 3", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_3)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_4] = Location::Icicle(RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_4, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2008, -1115), "Water Trial Left Stalagmite 4", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_4)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_1] = Location::Icicle(RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1916, -511), "Water Trial Right Stalagmite 1", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_1)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_2] = Location::Icicle(RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1936, -551), "Water Trial Right Stalagmite 2", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_2)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_3] = Location::Icicle(RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_3, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1984, -567), "Water Trial Right Stalagmite 3", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_3)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_4] = Location::Icicle(RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_4, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2044, -591), "Water Trial Right Stalagmite 4", RHT_GANONS_CASTLE_ICICLE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_4)); + // clang-format on +} + +static RegisterShipInitFunc initFunc_ShuffleIcicles(RegisterShuffleIcicles, { "IS_RANDO" }); +static RegisterShipInitFunc registerIcicleLocations(Rando::StaticData::RegisterIcicleLocations); \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/ShuffleRedIce.cpp b/soh/soh/Enhancements/randomizer/ShuffleRedIce.cpp new file mode 100644 index 000000000..3ce745882 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleRedIce.cpp @@ -0,0 +1,206 @@ +#include "soh/OTRGlobals.h" +#include "soh/ObjectExtension/ObjectExtension.h" +#include "item_category_adj.h" +#include "particle_cmc.h" + +extern "C" { +#include "functions.h" +#include "overlays/actors/ovl_Bg_Ice_Shelter/z_bg_ice_shelter.h" +#include "objects/object_ice_objects/object_ice_objects.h" +extern PlayState* gPlayState; +} + +extern void EnItem00_DrawRandomizedItem(EnItem00* enItem00, PlayState* play); + +uint8_t BgIceShelter_RandomizerHoldsItem(Actor* actor) { + const auto redIceIdentity = ObjectExtension::GetInstance().Get(actor); + if (redIceIdentity == nullptr) { + return false; + } + + RandomizerCheck rc = redIceIdentity->randomizerCheck; + + // Don't pull randomized item if icicle isn't randomized or is already checked + if (!IS_RANDO || Flags_GetRandomizerInf(redIceIdentity->randomizerInf) || + redIceIdentity->randomizerCheck == RC_UNKNOWN_CHECK) { + return false; + } else { + return true; + } +} + +static void BgIceShelter_RandomizerDraw(Actor* actor, Color_RGBA8* primColor, Color_RGBA8* secColor, + Color_RGBA8* envColor) { + Vec3f pos; + s32 type = (actor->params >> 8) & 7; + static Vec3f velocity = { 0.0f, 0.0f, 0.0f }; + static Vec3f accel = { 0.0f, 0.0f, 0.0f }; + + velocity.y = -0.05f; + accel.y = -0.025f; + + // align for King Zora's much bigger red ice + f32 xzScale = (type == RED_ICE_KING_ZORA) ? 30.0f : 15.0f; + f32 yOffset = (type == RED_ICE_KING_ZORA) ? 200.0f : 0.0f; + f32 zOffset = (type == RED_ICE_KING_ZORA) ? 50.0f : 0.0f; + + pos.x = Rand_CenteredFloat(xzScale) + actor->world.pos.x; + pos.y = (Rand_ZeroOne() * 15.0f) + actor->world.pos.y + yOffset; + pos.z = Rand_CenteredFloat(xzScale) + actor->world.pos.z + zOffset; + EffectSsKiraKira_SpawnFocused(gPlayState, &pos, &velocity, &accel, secColor, envColor, 2000, 100); + EffectSsKiraKira_SpawnFocused(gPlayState, &pos, &velocity, &accel, primColor, envColor, 2000, 100); +} + +void BgIceShelter_RandomizerDrawSetup(void* actor) { + GetItemCategory getItemCategory; + Actor* redIceActor = (Actor*)actor; + + // If not a randomized item or too far, don't draw + if (!BgIceShelter_RandomizerHoldsItem(redIceActor) || redIceActor->xzDistToPlayer > 1000.0f) { + return; + } + + bool cmc = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeAndTextureMatchContents"), 0); + int requiresStoneAgony = CVarGetInteger(CVAR_ENHANCEMENT("ChestSizeDependsStoneOfAgony"), 0); + + int isNotCMC = !cmc || (requiresStoneAgony && !CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)); + + Color_RGBA8 primColor; + Color_RGBA8 secColor; + Color_RGBA8 envColor; + + const auto redIceIdentity = ObjectExtension::GetInstance().Get(redIceActor); + if (redIceIdentity == nullptr) { + return; + } + + GetItemEntry redIceItem = + Rando::Context::GetInstance()->GetFinalGIEntry(redIceIdentity->randomizerCheck, true, GI_NONE); + getItemCategory = Randomizer_AdjustItemCategory(redIceItem); + + if (isNotCMC) { + getItemCategory = ITEM_CATEGORY_MAJOR; + } + primColor = Randomizer_GetParticleCMCColor(getItemCategory, COLOR_PRIMARY); + secColor = Randomizer_GetParticleCMCColor(getItemCategory, COLOR_SECONDARY); + envColor = Randomizer_GetParticleCMCColor(getItemCategory, COLOR_FLARE); + BgIceShelter_RandomizerDraw(redIceActor, &primColor, &secColor, &envColor); +} + +void BgIceShelter_RandomizerSpawnCollectible(Actor* actor) { + const auto redIceIdentity = ObjectExtension::GetInstance().Get(actor); + Player* player = GET_PLAYER(gPlayState); + + // If King Zora, autocollect to avoid spawning issues + if (redIceIdentity->randomizerCheck == RC_ZD_KING_ZORA_RED_ICE) { + Flags_SetRandomizerInf(redIceIdentity->randomizerInf); + } else { + EnItem00* item00 = (EnItem00*)Item_DropCollectible2(gPlayState, &actor->world.pos, ITEM00_SOH_DUMMY); + item00->randoInf = redIceIdentity->randomizerInf; + item00->itemEntry = + Rando::Context::GetInstance()->GetFinalGIEntry(redIceIdentity->randomizerCheck, true, GI_NONE); + item00->actor.draw = (ActorFunc)EnItem00_DrawRandomizedItem; + item00->actor.velocity.y = 8.0f; + // In general, spawn in place, but for checks with objects blocking, spawn out toward player + if ((redIceIdentity->randomizerCheck >= RC_ICE_CAVERN_HEART_PIECE_ROOM_FREESTANDING_RED_ICE && + redIceIdentity->randomizerCheck <= RC_ICE_CAVERN_NEAR_END_RIGHT_RED_ICE) || + redIceIdentity->randomizerCheck == RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_LEFT_RED_ICE || + redIceIdentity->randomizerCheck == RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_RIGHT_RED_ICE || + redIceIdentity->randomizerCheck == RC_GANONS_CASTLE_MQ_WATER_TRIAL_SILVER_RUPEE_RED_ICE) { + item00->actor.speedXZ = 2.0f; + item00->actor.world.rot.y = + Math_Vec3f_Yaw(&item00->actor.world.pos, &player->actor.world.pos) + (s16)Rand_CenteredFloat(16384.0f); + } else { + item00->actor.speedXZ = 0.0f; + item00->actor.world.rot.y = static_cast(Rand_CenteredFloat(65536.0f)); + } + } +} + +void RegisterShuffleRedIce() { + bool shouldRegister = IS_RANDO && Rando::Context::GetInstance()->GetOption(RSK_SHUFFLE_RED_ICE).Get(); + + COND_VB_SHOULD(VB_RED_ICE_MELTED_FLAG, shouldRegister, { + BgIceShelter* redIceActor = va_arg(args, BgIceShelter*); + Actor* actor = (Actor*)redIceActor; + + auto redIceIdentity = OTRGlobals::Instance->gRandomizer->IdentifyRedIce( + gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z); + ObjectExtension::GetInstance().Set(actor, std::move(redIceIdentity)); + + if (*should) { + if (BgIceShelter_RandomizerHoldsItem(&redIceActor->dyna.actor)) { + BgIceShelter_RandomizerSpawnCollectible(actor); + } + } + }); + + // Draw particle effect to indicate a randomized item + COND_ID_HOOK(OnActorUpdate, ACTOR_BG_ICE_SHELTER, shouldRegister, BgIceShelter_RandomizerDrawSetup); + + // Collect item for melting red ice + COND_VB_SHOULD(VB_RED_ICE_DROP_ITEM, shouldRegister, { + BgIceShelter* redIceActor = va_arg(args, BgIceShelter*); + + if (*should) { + if (BgIceShelter_RandomizerHoldsItem(&redIceActor->dyna.actor)) { + BgIceShelter_RandomizerSpawnCollectible(&redIceActor->dyna.actor); + } + } + }); +} + +void Rando::StaticData::RegisterRedIceLocations() { + static bool registered = false; + if (registered) + return; + registered = true; + // clang-format off + // Randomizer Check Randomizer Check Quest Area Scene ID Params Short Name Hint Text Key Spoiler Collection Check + locationTable[RC_ZD_KING_ZORA_RED_ICE] = Location::RedIce(RC_ZD_KING_ZORA_RED_ICE, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(628, -1818), "King Zora Red Ice", RHT_RED_ICE_ZORAS_DOMAIN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_KING_ZORA_RED_ICE)); + locationTable[RC_ZD_ZORA_SHOP_RED_ICE] = Location::RedIce(RC_ZD_ZORA_SHOP_RED_ICE, RCQUEST_BOTH, RCAREA_ZORAS_DOMAIN, SCENE_ZORAS_DOMAIN, TWO_ACTOR_PARAMS(483, 214), "Zora Shop Red Ice", RHT_RED_ICE_ZORAS_DOMAIN, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ZD_ZORA_SHOP_RED_ICE)); + locationTable[RC_ICE_CAVERN_ENTRANCE_RED_ICE] = Location::RedIce(RC_ICE_CAVERN_ENTRANCE_RED_ICE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(411, 2332), "Entrance Red Ice", RHT_ICE_CAVERN_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_ENTRANCE_RED_ICE)); + locationTable[RC_ICE_CAVERN_LOBBY_LEFT_RED_ICE] = Location::RedIce(RC_ICE_CAVERN_LOBBY_LEFT_RED_ICE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-105, 854), "Lobby Left Red Ice", RHT_ICE_CAVERN_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_LOBBY_LEFT_RED_ICE)); + locationTable[RC_ICE_CAVERN_LOBBY_RIGHT_RED_ICE] = Location::RedIce(RC_ICE_CAVERN_LOBBY_RIGHT_RED_ICE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(119, 856), "Lobby Right Red Ice", RHT_ICE_CAVERN_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_LOBBY_RIGHT_RED_ICE)); + locationTable[RC_ICE_CAVERN_SPINNING_BLADE_EAST_RED_ICE] = Location::RedIce(RC_ICE_CAVERN_SPINNING_BLADE_EAST_RED_ICE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(651, -232), "Spinning Blade East Red Ice", RHT_ICE_CAVERN_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_EAST_RED_ICE)); + locationTable[RC_ICE_CAVERN_SPINNING_BLADE_WEST_RED_ICE] = Location::RedIce(RC_ICE_CAVERN_SPINNING_BLADE_WEST_RED_ICE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-134, -415), "Spinning Blade West Red Ice", RHT_ICE_CAVERN_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SPINNING_BLADE_WEST_RED_ICE)); + locationTable[RC_ICE_CAVERN_HEART_PIECE_ROOM_FREESTANDING_RED_ICE] = Location::RedIce(RC_ICE_CAVERN_HEART_PIECE_ROOM_FREESTANDING_RED_ICE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1261, 68), "Heart Piece Room Freestanding Red Ice", RHT_ICE_CAVERN_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_FREESTANDING_RED_ICE)); + locationTable[RC_ICE_CAVERN_HEART_PIECE_ROOM_CHEST_RED_ICE] = Location::RedIce(RC_ICE_CAVERN_HEART_PIECE_ROOM_CHEST_RED_ICE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1201, 643), "Heart Piece Room Chest Red Ice", RHT_ICE_CAVERN_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CHEST_RED_ICE)); + locationTable[RC_ICE_CAVERN_MAP_ROOM_POT_RED_ICE] = Location::RedIce(RC_ICE_CAVERN_MAP_ROOM_POT_RED_ICE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(366, -2036), "Map Room Pot Red Ice", RHT_ICE_CAVERN_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MAP_ROOM_POT_RED_ICE)); + locationTable[RC_ICE_CAVERN_MAP_ROOM_CHEST_RED_ICE] = Location::RedIce(RC_ICE_CAVERN_MAP_ROOM_CHEST_RED_ICE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(277, -2600), "Map Room Chest Red Ice", RHT_ICE_CAVERN_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MAP_ROOM_CHEST_RED_ICE)); + locationTable[RC_ICE_CAVERN_SILVER_RUPEE_RED_ICE] = Location::RedIce(RC_ICE_CAVERN_SILVER_RUPEE_RED_ICE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1126, -1577), "Silver Rupee Red Ice", RHT_ICE_CAVERN_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SILVER_RUPEE_RED_ICE)); + locationTable[RC_ICE_CAVERN_NEAR_END_LEFT_RED_ICE] = Location::RedIce(RC_ICE_CAVERN_NEAR_END_LEFT_RED_ICE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1422, 586), "Near End Left Red Ice", RHT_ICE_CAVERN_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_LEFT_RED_ICE)); + locationTable[RC_ICE_CAVERN_NEAR_END_MIDDLE_RED_ICE] = Location::RedIce(RC_ICE_CAVERN_NEAR_END_MIDDLE_RED_ICE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1459, 625), "Near End Middle Red Ice", RHT_ICE_CAVERN_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_MIDDLE_RED_ICE)); + locationTable[RC_ICE_CAVERN_NEAR_END_RIGHT_RED_ICE] = Location::RedIce(RC_ICE_CAVERN_NEAR_END_RIGHT_RED_ICE, RCQUEST_VANILLA, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1488, 676), "Near End Right Red Ice", RHT_ICE_CAVERN_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_NEAR_END_RIGHT_RED_ICE)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_DOOR_RED_ICE] = Location::RedIce(RC_GANONS_CASTLE_WATER_TRIAL_DOOR_RED_ICE, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2212, -840), "Water Trial Door Red Ice", RHT_GANONS_CASTLE_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_DOOR_RED_ICE)); + locationTable[RC_GANONS_CASTLE_WATER_TRIAL_RUSTED_SWITCH_RED_ICE] = Location::RedIce(RC_GANONS_CASTLE_WATER_TRIAL_RUSTED_SWITCH_RED_ICE, RCQUEST_VANILLA, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2912, -1420), "Water Trial Rusted Switch Red Ice", RHT_GANONS_CASTLE_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_WATER_TRIAL_RUSTED_SWITCH_RED_ICE)); + locationTable[RC_ICE_CAVERN_MQ_HUB_WEST_LEFT_RED_ICE] = Location::RedIce(RC_ICE_CAVERN_MQ_HUB_WEST_LEFT_RED_ICE, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-142, -377), "Hub West Left Red Ice", RHT_ICE_CAVERN_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_HUB_WEST_LEFT_RED_ICE)); + locationTable[RC_ICE_CAVERN_MQ_HUB_WEST_MIDDLE_RED_ICE] = Location::RedIce(RC_ICE_CAVERN_MQ_HUB_WEST_MIDDLE_RED_ICE, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-121, -418), "Hub West Middle Red Ice", RHT_ICE_CAVERN_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_HUB_WEST_MIDDLE_RED_ICE)); + locationTable[RC_ICE_CAVERN_MQ_HUB_WEST_RIGHT_RED_ICE] = Location::RedIce(RC_ICE_CAVERN_MQ_HUB_WEST_RIGHT_RED_ICE, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-134, -462), "Hub West Right Red Ice", RHT_ICE_CAVERN_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_HUB_WEST_RIGHT_RED_ICE)); + locationTable[RC_ICE_CAVERN_MQ_HUB_LEDGE_LEFT_RED_ICE] = Location::RedIce(RC_ICE_CAVERN_MQ_HUB_LEDGE_LEFT_RED_ICE, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(577, -818), "Hub Ledge Left Red Ice", RHT_ICE_CAVERN_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_HUB_LEDGE_LEFT_RED_ICE)); + locationTable[RC_ICE_CAVERN_MQ_HUB_LEDGE_MIDDLE_RED_ICE] = Location::RedIce(RC_ICE_CAVERN_MQ_HUB_LEDGE_MIDDLE_RED_ICE, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(614, -770), "Hub Ledge Middle Red Ice", RHT_ICE_CAVERN_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_HUB_LEDGE_MIDDLE_RED_ICE)); + locationTable[RC_ICE_CAVERN_MQ_HUB_LEDGE_RIGHT_RED_ICE] = Location::RedIce(RC_ICE_CAVERN_MQ_HUB_LEDGE_RIGHT_RED_ICE, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(656, -722), "Hub Ledge Right Red Ice", RHT_ICE_CAVERN_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_HUB_LEDGE_RIGHT_RED_ICE)); + locationTable[RC_ICE_CAVERN_MQ_COMPASS_RED_ICE] = Location::RedIce(RC_ICE_CAVERN_MQ_COMPASS_RED_ICE, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(376, -2048), "Compass Red Ice", RHT_ICE_CAVERN_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_COMPASS_RED_ICE)); + locationTable[RC_ICE_CAVERN_MQ_MAP_RED_ICE] = Location::RedIce(RC_ICE_CAVERN_MQ_MAP_RED_ICE, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1201, 648), "Map Red Ice", RHT_ICE_CAVERN_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_MAP_RED_ICE)); + locationTable[RC_ICE_CAVERN_MQ_SCARECROW_LEFT_RED_ICE] = Location::RedIce(RC_ICE_CAVERN_MQ_SCARECROW_LEFT_RED_ICE, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1335, -159), "Scarecrow Left Red Ice", RHT_ICE_CAVERN_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_SCARECROW_LEFT_RED_ICE)); + locationTable[RC_ICE_CAVERN_MQ_SCARECROW_MIDDLE_RED_ICE] = Location::RedIce(RC_ICE_CAVERN_MQ_SCARECROW_MIDDLE_RED_ICE, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1386, -159), "Scarecrow Middle Red Ice", RHT_ICE_CAVERN_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_SCARECROW_MIDDLE_RED_ICE)); + locationTable[RC_ICE_CAVERN_MQ_SCARECROW_RIGHT_RED_ICE] = Location::RedIce(RC_ICE_CAVERN_MQ_SCARECROW_RIGHT_RED_ICE, RCQUEST_MQ, RCAREA_ICE_CAVERN, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1438, -155), "Scarecrow Right Red Ice", RHT_ICE_CAVERN_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_MQ_SCARECROW_RIGHT_RED_ICE)); + locationTable[RC_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM_RED_ICE] = Location::RedIce(RC_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM_RED_ICE, RCQUEST_MQ, RCAREA_GERUDO_TRAINING_GROUND, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-864, -2745), "Stalfos Room Red Ice", RHT_GERUDO_TRAINING_GROUND_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM_RED_ICE)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_LEFT_RED_ICE] = Location::RedIce(RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_LEFT_RED_ICE, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1754, -1152), "Water Trial First Room Left Red Ice", RHT_GANONS_CASTLE_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_LEFT_RED_ICE)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_RIGHT_RED_ICE] = Location::RedIce(RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_RIGHT_RED_ICE, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1743, -529), "Water Trial First Room Right Red Ice", RHT_GANONS_CASTLE_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_RIGHT_RED_ICE)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_BACK_LEFT_RED_ICE] = Location::RedIce(RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_BACK_LEFT_RED_ICE, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2096, -1011), "Water Trial First Room Back Left Red Ice", RHT_GANONS_CASTLE_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_BACK_LEFT_RED_ICE)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_1] = Location::RedIce(RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2209, -889), "Water Trial First Room Door Red Ice 1", RHT_GANONS_CASTLE_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_1)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_2] = Location::RedIce(RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2198, -845), "Water Trial First Room Door Red Ice 2", RHT_GANONS_CASTLE_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_2)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_3] = Location::RedIce(RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_3, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2194, -797), "Water Trial First Room Door Red Ice 3", RHT_GANONS_CASTLE_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_3)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_4] = Location::RedIce(RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_4, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2200, -755), "Water Trial First Room Door Red Ice 4", RHT_GANONS_CASTLE_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_4)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_SILVER_RUPEE_RED_ICE] = Location::RedIce(RC_GANONS_CASTLE_MQ_WATER_TRIAL_SILVER_RUPEE_RED_ICE, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3370, -729), "Water Trial Silver Rupee Red Ice", RHT_GANONS_CASTLE_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_SILVER_RUPEE_RED_ICE)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_1] = Location::RedIce(RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_1, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3370, -776), "Water Trial Second Door Red Ice 1", RHT_GANONS_CASTLE_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_1)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_2] = Location::RedIce(RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_2, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3370, -834), "Water Trial Second Door Red Ice 2", RHT_GANONS_CASTLE_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_2)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_3] = Location::RedIce(RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_3, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3370, -889), "Water Trial Second Door Red Ice 3", RHT_GANONS_CASTLE_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_3)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_4] = Location::RedIce(RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_4, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3370, -950), "Water Trial Second Door Red Ice 4", RHT_GANONS_CASTLE_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_4)); + locationTable[RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_5] = Location::RedIce(RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_5, RCQUEST_MQ, RCAREA_GANONS_CASTLE, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2906, -1482), "Water Trial Second Door Red Ice 5", RHT_GANONS_CASTLE_RED_ICE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_5)); + // clang-format on +} + +static RegisterShipInitFunc initFunc_ShuffleRedIce(RegisterShuffleRedIce, { "IS_RANDO" }); +static RegisterShipInitFunc registerRedIceLocations(Rando::StaticData::RegisterRedIceLocations); \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/location.cpp b/soh/soh/Enhancements/randomizer/location.cpp index 59c001495..15f35f11b 100644 --- a/soh/soh/Enhancements/randomizer/location.cpp +++ b/soh/soh/Enhancements/randomizer/location.cpp @@ -663,4 +663,20 @@ Rando::Location Rando::Location::Sign(RandomizerCheck rc, RandomizerCheckQuest q SpoilerCollectionCheck collectionCheck) { return { rc, quest_, RCTYPE_SIGN, area_, actorId, scene_, actorParams_, std::move(shortName_), hintKey, RG_NONE, false, collectionCheck }; +} + +Rando::Location Rando::Location::Icicle(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, SpoilerCollectionCheck collectionCheck) { + return { rc, quest_, RCTYPE_ICICLE, area_, ACTOR_BG_ICE_TURARA, + scene_, actorParams_, std::move(shortName_), hintKey, RG_NONE, + false, collectionCheck }; +} + +Rando::Location Rando::Location::RedIce(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, + SceneID scene_, int32_t actorParams_, std::string&& shortName_, + RandomizerHintTextKey hintKey, SpoilerCollectionCheck collectionCheck) { + return { rc, quest_, RCTYPE_RED_ICE, area_, ACTOR_BG_ICE_SHELTER, + scene_, actorParams_, std::move(shortName_), hintKey, RG_NONE, + false, collectionCheck }; } \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/location.h b/soh/soh/Enhancements/randomizer/location.h index 15bf0ce53..c2337b0e3 100644 --- a/soh/soh/Enhancements/randomizer/location.h +++ b/soh/soh/Enhancements/randomizer/location.h @@ -266,6 +266,14 @@ class Location { RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, SpoilerCollectionCheck collectionCheck); + static Location Icicle(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, + SpoilerCollectionCheck collectionCheck); + + static Location RedIce(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, SceneID scene_, + int32_t actorParams_, std::string&& shortName_, RandomizerHintTextKey hintKey, + SpoilerCollectionCheck collectionCheck); + static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_, ActorID actorId_, SceneID scene_, std::string&& shortName_, std::string&& spoilerName_); diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp index f4654205a..cc4c00db2 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp @@ -154,8 +154,34 @@ void RegionTable_Init_GanonsCastle() { EVENT_ACCESS(LOGIC_BLUE_FIRE_ACCESS, logic->CanClearStalagmite() || ctx->GetTrickOption(RT_ICE_STALAGMITE_CLIP)), }, { //Locations - LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, logic->HasItem(RG_OPEN_CHEST)), - LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_1, logic->CanClearStalagmite()), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_2, logic->CanClearStalagmite()), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_3, logic->CanClearStalagmite()), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_4, logic->CanClearStalagmite()), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_5, logic->CanClearStalagmite()), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_6, logic->CanClearStalagmite()), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_7, logic->CanClearStalagmite()), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_8, logic->CanClearStalagmite()), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_9, logic->CanClearStalagmite()), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_10, logic->CanClearStalagmite()), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_LEFT_STALAGMITE_1, logic->CanClearStalagmite()), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_LEFT_STALAGMITE_2, logic->CanClearStalagmite()), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_STALAGMITE_1, logic->CanClearStalagmite()), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_STALAGMITE_2, logic->CanClearStalagmite()), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_1, true), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_2, true), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_3, true), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_4, true), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_5, true), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_6, true), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_7, true), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_8, true), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_9, true), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_10, true), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_11, true), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_DOOR_RED_ICE, logic->BlueFire()), }, { //Exits ENTRANCE(RR_GANONS_CASTLE_MAIN, true), @@ -165,16 +191,25 @@ void RegionTable_Init_GanonsCastle() { areaTable[RR_GANONS_CASTLE_WATER_TRIAL_BLOCK_ROOM] = Region("Ganon's Castle Water Trial Block Room", SCENE_INSIDE_GANONS_CASTLE, { //Events EVENT_ACCESS(LOGIC_FAIRY_ACCESS, logic->CanBreakPots()), - EVENT_ACCESS(LOGIC_WATER_TRIAL_RUSTED_SWITCH, logic->IsAdult && (logic->HasItem(RG_POWER_BRACELET) || logic->CanMiddairGroundJump()) && - (logic->BlueFire() || ctx->GetTrickOption(RT_VISIBLE_COLLISION)) && - logic->CanUse(RG_MEGATON_HAMMER)), }, { //Locations - LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_POT_3, logic->CanBreakPots()), + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_POT_3, logic->CanBreakPots()), }, { //Exits - ENTRANCE(RR_GANONS_CASTLE_WATER_TRIAL_BLUE_FIRE_ROOM, true), - ENTRANCE(RR_GANONS_CASTLE_WATER_TRIAL_BLOCK_ROOM_END, logic->IsAdult || (logic->HasItem(RG_POWER_BRACELET) && logic->CanUse(RG_HOVER_BOOTS)) || logic->CanGroundJump() || ctx->GetTrickOption(RT_SLIDE_JUMP)), + ENTRANCE(RR_GANONS_CASTLE_WATER_TRIAL_BLUE_FIRE_ROOM, true), + ENTRANCE(RR_GANONS_CASTLE_WATER_TRIAL_BLOCK_ROOM_SWITCH, logic->IsAdult && (logic->HasItem(RG_POWER_BRACELET) || logic->CanMiddairGroundJump())), + ENTRANCE(RR_GANONS_CASTLE_WATER_TRIAL_BLOCK_ROOM_END, logic->IsAdult || (logic->HasItem(RG_POWER_BRACELET) && logic->CanUse(RG_HOVER_BOOTS)) || logic->CanGroundJump() || ctx->GetTrickOption(RT_SLIDE_JUMP)), + }); + + areaTable[RR_GANONS_CASTLE_WATER_TRIAL_BLOCK_ROOM_SWITCH] = Region("Ganon's Castle Water Trial Block Room Switch", SCENE_INSIDE_GANONS_CASTLE, { + //Events + EVENT_ACCESS(LOGIC_WATER_TRIAL_RUSTED_SWITCH, (logic->BlueFire() || ctx->GetTrickOption(RT_VISIBLE_COLLISION)) && logic->CanUse(RG_MEGATON_HAMMER)), + }, { + //Locations + LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_RUSTED_SWITCH_RED_ICE, logic->BlueFire()), + }, { + //Exits + ENTRANCE(RR_GANONS_CASTLE_WATER_TRIAL_BLOCK_ROOM, true), }); areaTable[RR_GANONS_CASTLE_WATER_TRIAL_BLOCK_ROOM_END] = Region("Ganon's Castle Water Trial Block Room End", SCENE_INSIDE_GANONS_CASTLE, {}, {}, { @@ -502,8 +537,29 @@ void RegionTable_Init_GanonsCastle() { EVENT_ACCESS(LOGIC_BLUE_FIRE_ACCESS, logic->CanJumpslash() || logic->HasExplosives()), // bow can also hit at right angle }, { //Locations - LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, logic->BlueFire() && logic->HasItem(RG_OPEN_CHEST)), - LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_HEART, logic->BlueFire()), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, logic->BlueFire() && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_HEART, logic->BlueFire()), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALACTITE_1, true), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALACTITE_2, true), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALACTITE_3, true), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALACTITE_1, true), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALACTITE_2, true), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALACTITE_3, true), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_1, logic->CanClearStalagmite()), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_2, logic->CanClearStalagmite()), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_3, logic->CanClearStalagmite()), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_4, logic->CanClearStalagmite()), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_1, logic->CanClearStalagmite()), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_2, logic->CanClearStalagmite()), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_3, logic->CanClearStalagmite()), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_4, logic->CanClearStalagmite()), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_LEFT_RED_ICE, logic->BlueFire()), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_RIGHT_RED_ICE, logic->BlueFire()), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_BACK_LEFT_RED_ICE, logic->BlueFire()), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_1, logic->BlueFire()), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_2, logic->BlueFire()), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_3, logic->BlueFire()), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_4, logic->BlueFire()), }, { //Exits ENTRANCE(RR_GANONS_CASTLE_MQ_MAIN, true), @@ -513,16 +569,31 @@ void RegionTable_Init_GanonsCastle() { areaTable[RR_GANONS_CASTLE_MQ_WATER_TRIAL_BLOCK_ROOM] = Region("Ganon's Castle MQ Water Trial Block Room", SCENE_INSIDE_GANONS_CASTLE, { //Events EVENT_ACCESS(LOGIC_WATER_TRIAL_MQ_SILVER_RUPEES, logic->IsAdult && (logic->HasItem(RG_POWER_BRACELET) || logic->CanMiddairGroundJump()) && logic->BlueFire()), - EVENT_ACCESS(LOGIC_WATER_TRIAL_MQ_MELTED_FINAL_DOOR_RED_ICE, (ctx->GetOption(RSK_BLUE_FIRE_ARROWS) && logic->CanUse(RG_ICE_ARROWS)) || (logic->IsAdult || logic->CanUse(RG_HOVER_BOOTS)) && logic->HasItem(RG_POWER_BRACELET) && logic->CanUse(RG_BOTTLE_WITH_BLUE_FIRE)), - }, {}, { + EVENT_ACCESS(LOGIC_WATER_TRIAL_MQ_MELTED_FINAL_DOOR_RED_ICE, (ctx->GetOption(RSK_BLUE_FIRE_ARROWS) && logic->CanUse(RG_ICE_ARROWS)) || ((logic->IsAdult || logic->CanUse(RG_HOVER_BOOTS) || (ctx->GetTrickOption(RT_UNINTUITIVE_JUMPS)/* && logic->CanUse(RG_ROLL)*/)) && logic->HasItem(RG_POWER_BRACELET) && logic->CanUse(RG_BOTTLE_WITH_BLUE_FIRE))), + }, { + //Locations + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_SILVER_RUPEE_RED_ICE, logic->IsAdult && (logic->HasItem(RG_POWER_BRACELET) || logic->CanMiddairGroundJump()) && logic->BlueFire()), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_1, logic->Get(LOGIC_WATER_TRIAL_MQ_MELTED_FINAL_DOOR_RED_ICE) && logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_2, logic->Get(LOGIC_WATER_TRIAL_MQ_MELTED_FINAL_DOOR_RED_ICE) && logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_3, logic->Get(LOGIC_WATER_TRIAL_MQ_MELTED_FINAL_DOOR_RED_ICE) && logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_4, logic->Get(LOGIC_WATER_TRIAL_MQ_MELTED_FINAL_DOOR_RED_ICE) && logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_5, logic->Get(LOGIC_WATER_TRIAL_MQ_MELTED_FINAL_DOOR_RED_ICE) && logic->CanUse(RG_BOOMERANG)), + }, { //Exits ENTRANCE(RR_GANONS_CASTLE_MQ_WATER_TRIAL_GEYSER_ROOM, logic->SmallKeys(SCENE_INSIDE_GANONS_CASTLE, 3)), - ENTRANCE(RR_GANONS_CASTLE_MQ_WATER_TRIAL_BLOCK_ROOM_END, logic->Get(LOGIC_WATER_TRIAL_MQ_MELTED_FINAL_DOOR_RED_ICE) && (logic->IsAdult || (logic->CanUse(RG_HOVER_BOOTS) && logic->HasItem(RG_POWER_BRACELET)) || logic->CanGroundJump() || ctx->GetTrickOption(RT_SLIDE_JUMP))), + ENTRANCE(RR_GANONS_CASTLE_MQ_WATER_TRIAL_BLOCK_ROOM_END, logic->Get(LOGIC_WATER_TRIAL_MQ_MELTED_FINAL_DOOR_RED_ICE) && (logic->IsAdult || ((logic->CanUse(RG_HOVER_BOOTS) || (ctx->GetTrickOption(RT_UNINTUITIVE_JUMPS)/* && logic->CanUse(RG_ROLL)*/)) && logic->HasItem(RG_POWER_BRACELET)) || logic->CanGroundJump() || ctx->GetTrickOption(RT_SLIDE_JUMP))), }); areaTable[RR_GANONS_CASTLE_MQ_WATER_TRIAL_BLOCK_ROOM_END] = Region("Ganon's Castle MQ Water Trial Block Room End", SCENE_INSIDE_GANONS_CASTLE, { EVENT_ACCESS(LOGIC_WATER_TRIAL_MQ_MELTED_FINAL_DOOR_RED_ICE, logic->BlueFire()), - }, {}, { + }, { + //Locations + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_1, logic->Get(LOGIC_WATER_TRIAL_MQ_MELTED_FINAL_DOOR_RED_ICE)), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_2, logic->Get(LOGIC_WATER_TRIAL_MQ_MELTED_FINAL_DOOR_RED_ICE)), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_3, logic->Get(LOGIC_WATER_TRIAL_MQ_MELTED_FINAL_DOOR_RED_ICE)), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_4, logic->Get(LOGIC_WATER_TRIAL_MQ_MELTED_FINAL_DOOR_RED_ICE)), + LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_5, logic->Get(LOGIC_WATER_TRIAL_MQ_MELTED_FINAL_DOOR_RED_ICE)), + }, { ENTRANCE(RR_GANONS_CASTLE_MQ_WATER_TRIAL_BLOCK_ROOM, logic->Get(LOGIC_WATER_TRIAL_MQ_MELTED_FINAL_DOOR_RED_ICE)), ENTRANCE(RR_GANONS_CASTLE_MQ_WATER_TRIAL_FINAL_ROOM, logic->Get(LOGIC_WATER_TRIAL_MQ_SILVER_RUPEES)), }); diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp index 544240893..e3b232b52 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp @@ -245,7 +245,22 @@ void RegionTable_Init_GerudoTrainingGround() { ENTRANCE(RR_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM, AnyAgeTime([]{return logic->CanKillEnemy(RE_IRON_KNUCKLE);})), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM] = Region("Gerudo Training Ground MQ Left Side", SCENE_GERUDO_TRAINING_GROUND, {}, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM] = Region("Gerudo Training Ground MQ Left Side", SCENE_GERUDO_TRAINING_GROUND, {}, { + //Locations + LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_1, logic->CanClearStalagmite()), + LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_2, logic->CanClearStalagmite()), + LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_3, logic->CanClearStalagmite()), + LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_4, logic->CanClearStalagmite()), + LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_5, logic->CanClearStalagmite()), + LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_1, true), + LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_2, true), + LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_3, true), + LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_4, true), + LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_LEFT_STALACTITE, true), + LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_TOP_RIGHT_STALACTITE_1, true), + LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_TOP_RIGHT_STALACTITE_2, true), + LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_TOP_RIGHT_STALACTITE_3, true), + }, { //Exits ENTRANCE(RR_GERUDO_TRAINING_GROUND_MQ_SAND_ROOM, true), ENTRANCE(RR_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM, AnyAgeTime([]{return logic->CanUse(RG_LONGSHOT) || ctx->GetTrickOption(RT_GTG_MQ_WITHOUT_HOOKSHOT) || (ctx->GetTrickOption(RT_GTG_MQ_WITH_HOOKSHOT) && logic->IsAdult && logic->CanJumpslash() && logic->CanUse(RG_HOOKSHOT));})), @@ -262,9 +277,9 @@ void RegionTable_Init_GerudoTrainingGround() { LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2, true) && logic->HasItem(RG_OPEN_CHEST)), }, { //Exits - ENTRANCE(RR_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM, true), - ENTRANCE(RR_GERUDO_TRAINING_GROUND_MQ_BEHIND_BLOCK, logic->Get(LOGIC_GTG_PUSHED_HEAVY_BLOCK)), - ENTRANCE(RR_GERUDO_TRAINING_GROUND_MQ_STATUE_ROOM_LEDGE, logic->IsAdult && AnyAgeTime([]{return logic->CanKillEnemy(RE_STALFOS, ED_CLOSE, true, 2, true);}) && (ctx->GetTrickOption(RT_LENS_GTG_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->BlueFire() && (logic->CanUse(RG_SONG_OF_TIME) || (ctx->GetTrickOption(RT_GTG_FAKE_WALL) && logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)) || (logic->IsAdult && logic->CanGroundJump()))), + ENTRANCE(RR_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM, true), + ENTRANCE(RR_GERUDO_TRAINING_GROUND_MQ_BEHIND_BLOCK, logic->Get(LOGIC_GTG_PUSHED_HEAVY_BLOCK)), + ENTRANCE(RR_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM_ALCOVE, logic->IsAdult && (ctx->GetTrickOption(RT_LENS_GTG_MQ) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->BlueFire() && (logic->CanUse(RG_SONG_OF_TIME) || (ctx->GetTrickOption(RT_GTG_FAKE_WALL) && logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)) || (logic->IsAdult && logic->CanGroundJump()))), }); areaTable[RR_GERUDO_TRAINING_GROUND_MQ_BEHIND_BLOCK] = Region("Gerudo Training Ground MQ Behind Block", SCENE_GERUDO_TRAINING_GROUND, {}, {}, { @@ -280,15 +295,23 @@ void RegionTable_Init_GerudoTrainingGround() { ENTRANCE(RR_GERUDO_TRAINING_GROUND_MQ_BEHIND_BLOCK, true), }); + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM_ALCOVE] = Region("Gerudo Training Ground MQ Stalfos Room Alcove", SCENE_GERUDO_TRAINING_GROUND, {}, { + //Locations + LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM_RED_ICE, logic->BlueFire()), + }, { + ENTRANCE(RR_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM, true), + ENTRANCE(RR_GERUDO_TRAINING_GROUND_MQ_STATUE_ROOM_LEDGE, logic->Get(LOGIC_GTG_UNLOCKED_DOOR_BEHIND_HEAVY_BLOCK)), + }); + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_STATUE_ROOM_LEDGE] = Region("Gerudo Training Ground MQ Statue Room Ledge", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_WONDER_EYE_STATUE, logic->CanUse(RG_LONGSHOT) || logic->CanUse(RG_HOVER_BOOTS) || (logic->IsAdult && ctx->GetTrickOption(RT_GTG_STATUE_JUMP))), // Shuffle roll: Jumpslash doesn't require roll, jump only does }, { //Exits - ENTRANCE(RR_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM, true), + ENTRANCE(RR_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM_ALCOVE, true), //implies dropping down to hit the switch. Using swords, especially master, is a bit awkward, may be trick worthy, but is only relevant with other tricks - ENTRANCE(RR_GERUDO_TRAINING_GROUND_MQ_MAGENTA_FIRE_ROOM, AnyAgeTime([]{return logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_STICKS) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG);})), - ENTRANCE(RR_GERUDO_TRAINING_GROUND_MQ_STATUE_ROOM, true), + ENTRANCE(RR_GERUDO_TRAINING_GROUND_MQ_MAGENTA_FIRE_ROOM, AnyAgeTime([]{return logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_MASTER_SWORD) || logic->CanUse(RG_BIGGORON_SWORD) || logic->CanUse(RG_STICKS) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG);})), + ENTRANCE(RR_GERUDO_TRAINING_GROUND_MQ_STATUE_ROOM, true), }); areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAGENTA_FIRE_ROOM] = Region("Gerudo Training Ground MQ Magenta Fire Room", SCENE_GERUDO_TRAINING_GROUND, {}, { diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp index 176ffaee8..0ff80f200 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp @@ -18,8 +18,20 @@ void RegionTable_Init_IceCavern() { areaTable[RR_ICE_CAVERN_BEGINNING] = Region("Ice Cavern Beginning", SCENE_ICE_CAVERN, {}, { //Locations - LOCATION(RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), - LOCATION(RC_ICE_CAVERN_LOBBY_RUPEE, logic->BlueFire()), // can get with rang trick + LOCATION(RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_ICE_CAVERN_LOBBY_RUPEE, logic->BlueFire()), // can get with rang trick + LOCATION(RC_ICE_CAVERN_ENTRANCE_LEFT_STALAGMITE, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_ENTRANCE_MIDDLE_STALAGMITE, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_ENTRANCE_RIGHT_STALAGMITE, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_ENTRANCE_STALACTITE_1, true), + LOCATION(RC_ICE_CAVERN_ENTRANCE_STALACTITE_2, true), + LOCATION(RC_ICE_CAVERN_LOBBY_STALACTITE, true), + LOCATION(RC_ICE_CAVERN_LOBBY_LEFT_STALAGMITE, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_LOBBY_MIDDLE_STALAGMITE, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_LOBBY_RIGHT_STALAGMITE, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_ENTRANCE_RED_ICE, logic->BlueFire()), + LOCATION(RC_ICE_CAVERN_LOBBY_LEFT_RED_ICE, logic->BlueFire()), + LOCATION(RC_ICE_CAVERN_LOBBY_RIGHT_RED_ICE, logic->BlueFire()), }, { //Exits ENTRANCE(RR_ICE_CAVERN_ENTRYWAY, true), @@ -29,12 +41,22 @@ void RegionTable_Init_IceCavern() { areaTable[RR_ICE_CAVERN_HUB] = Region("Ice Cavern Hub", SCENE_ICE_CAVERN, {}, { //Locations - LOCATION(RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, logic->HookshotOrBoomerang()), - LOCATION(RC_ICE_CAVERN_HALL_POT_1, logic->CanBreakPots()), - LOCATION(RC_ICE_CAVERN_HALL_POT_2, logic->CanBreakPots()), - LOCATION(RC_ICE_CAVERN_SPINNING_BLADE_POT_1, logic->CanBreakPots()), - LOCATION(RC_ICE_CAVERN_SPINNING_BLADE_POT_2, logic->CanBreakPots()), - LOCATION(RC_ICE_CAVERN_SPINNING_BLADE_POT_3, logic->CanBreakPots()), + LOCATION(RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, logic->HookshotOrBoomerang()), + LOCATION(RC_ICE_CAVERN_HALL_POT_1, logic->CanBreakPots()), + LOCATION(RC_ICE_CAVERN_HALL_POT_2, logic->CanBreakPots()), + LOCATION(RC_ICE_CAVERN_SPINNING_BLADE_POT_1, logic->CanBreakPots()), + LOCATION(RC_ICE_CAVERN_SPINNING_BLADE_POT_2, logic->CanBreakPots()), + LOCATION(RC_ICE_CAVERN_SPINNING_BLADE_POT_3, logic->CanBreakPots()), + LOCATION(RC_ICE_CAVERN_AFTER_LOBBY_STALACTITE, true), + LOCATION(RC_ICE_CAVERN_AFTER_LOBBY_LEFT_STALAGMITE, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_AFTER_LOBBY_CENTER_LEFT_STALAGMITE, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_AFTER_LOBBY_CENTER_RIGHT_STALAGMITE, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_AFTER_LOBBY_RIGHT_STALAGMITE, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_SPINNING_BLADE_LEFT_STALAGMITE, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_SPINNING_BLADE_MIDDLE_STALAGMITE, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_SPINNING_BLADE_RIGHT_STALAGMITE, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_SPINNING_BLADE_EAST_RED_ICE, logic->BlueFire()), + LOCATION(RC_ICE_CAVERN_SPINNING_BLADE_WEST_RED_ICE, logic->BlueFire()), }, { //Exits ENTRANCE(RR_ICE_CAVERN_BEGINNING, true), @@ -49,14 +71,24 @@ void RegionTable_Init_IceCavern() { EVENT_ACCESS(LOGIC_BLUE_FIRE_ACCESS, true), }, { //Locations - LOCATION(RC_ICE_CAVERN_MAP_CHEST, logic->BlueFire() && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_ICE_CAVERN_MAP_CHEST, logic->BlueFire() && logic->HasItem(RG_OPEN_CHEST)), // Bow extension is possible, but very precise: X = 403, Z = 2062-3, Rot = -11475, needs a setup and is its own trick - LOCATION(RC_ICE_CAVERN_FROZEN_POT_1, (logic->CanBreakPots() && logic->BlueFire()) || logic->HasExplosives() || - (ctx->GetTrickOption(RT_VISIBLE_COLLISION) && logic->CanJumpslash()) || - (ctx->GetTrickOption(RT_ITEM_EXTENSION) && logic->CanUse(RG_HOOKSHOT))), - LOCATION(RC_ICE_CAVERN_MAP_ROOM_LEFT_HEART, true), - LOCATION(RC_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, true), - LOCATION(RC_ICE_CAVERN_MAP_ROOM_RIGHT_HEART, true), + LOCATION(RC_ICE_CAVERN_FROZEN_POT_1, (logic->CanBreakPots() && logic->BlueFire()) || logic->HasExplosives() || + (ctx->GetTrickOption(RT_VISIBLE_COLLISION) && logic->CanJumpslash()) || + (ctx->GetTrickOption(RT_ITEM_EXTENSION) && logic->CanUse(RG_HOOKSHOT))), + LOCATION(RC_ICE_CAVERN_MAP_ROOM_LEFT_HEART, true), + LOCATION(RC_ICE_CAVERN_MAP_ROOM_MIDDLE_HEART, true), + LOCATION(RC_ICE_CAVERN_MAP_ROOM_RIGHT_HEART, true), + LOCATION(RC_ICE_CAVERN_MAP_HALLWAY_STALACTITE_1, true), + LOCATION(RC_ICE_CAVERN_MAP_HALLWAY_STALACTITE_2, true), + LOCATION(RC_ICE_CAVERN_MAP_HALLWAY_STALACTITE_3, true), + LOCATION(RC_ICE_CAVERN_MAP_HALLWAY_STALACTITE_4, true), + LOCATION(RC_ICE_CAVERN_MAP_HALLWAY_STALACTITE_5, true), + LOCATION(RC_ICE_CAVERN_MAP_HALLWAY_LEFT_STALAGMITE, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MAP_HALLWAY_MIDDLE_STALAGMITE, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MAP_HALLWAY_RIGHT_STALAGMITE, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MAP_ROOM_POT_RED_ICE, logic->BlueFire()), + LOCATION(RC_ICE_CAVERN_MAP_ROOM_CHEST_RED_ICE, logic->BlueFire()), }, { //Exits ENTRANCE(RR_ICE_CAVERN_HUB, true), @@ -67,9 +99,31 @@ void RegionTable_Init_IceCavern() { EVENT_ACCESS(LOGIC_BLUE_FIRE_ACCESS, true), }, { //Locations - LOCATION(RC_ICE_CAVERN_COMPASS_CHEST, (logic->IsChild || logic->CanClearStalagmite() || ctx->GetTrickOption(RT_ICE_STALAGMITE_CLIP)) && logic->BlueFire() && logic->HasItem(RG_OPEN_CHEST)), - LOCATION(RC_ICE_CAVERN_FREESTANDING_POH, (logic->CanClearStalagmite() || ctx->GetTrickOption(RT_ICE_STALAGMITE_CLIP)) && logic->BlueFire()), // can skip blue fire with rang trick - LOCATION(RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, logic->HookshotOrBoomerang()), + LOCATION(RC_ICE_CAVERN_COMPASS_CHEST, (logic->IsChild || logic->CanClearStalagmite() || ctx->GetTrickOption(RT_ICE_STALAGMITE_CLIP)) && logic->BlueFire() && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_ICE_CAVERN_FREESTANDING_POH, (logic->CanClearStalagmite() || ctx->GetTrickOption(RT_ICE_STALAGMITE_CLIP)) && logic->BlueFire()), // can skip blue fire with rang trick + LOCATION(RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, logic->HookshotOrBoomerang()), + LOCATION(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_1, true), + LOCATION(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_2, true), + LOCATION(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_3, true), + LOCATION(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_4, true), + LOCATION(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_5, true), + LOCATION(RC_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALACTITE_1, logic->CanClearStalagmite() || ctx->GetTrickOption(RT_ICE_STALAGMITE_CLIP)), + LOCATION(RC_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALACTITE_2, logic->CanClearStalagmite() || ctx->GetTrickOption(RT_ICE_STALAGMITE_CLIP)), + LOCATION(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_1, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_2, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_3, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_4, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_5, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_6, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALAGMITE_1, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALAGMITE_2, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALAGMITE_3, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_1, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_2, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_3, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_4, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_HEART_PIECE_ROOM_FREESTANDING_RED_ICE, (logic->CanClearStalagmite() || ctx->GetTrickOption(RT_ICE_STALAGMITE_CLIP)) && logic->BlueFire()), + LOCATION(RC_ICE_CAVERN_HEART_PIECE_ROOM_CHEST_RED_ICE, (logic->IsChild || logic->CanClearStalagmite() || ctx->GetTrickOption(RT_ICE_STALAGMITE_CLIP)) && logic->BlueFire()), }, { //Exits ENTRANCE(RR_ICE_CAVERN_HUB, true), @@ -78,15 +132,24 @@ void RegionTable_Init_IceCavern() { areaTable[RR_ICE_CAVERN_BLOCK_ROOM] = Region("Ice Cavern Block Room", SCENE_ICE_CAVERN, {}, { //Locations // trick involves backflip, could be merged into general trick - LOCATION(RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, logic->HookshotOrBoomerang() || (ctx->GetTrickOption(RT_ICE_BLOCK_GS) && logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS) && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_SHORT_JUMPSLASH))), - LOCATION(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1, logic->CanUse(RG_BOOMERANG)), - LOCATION(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, logic->CanUse(RG_BOOMERANG)), - LOCATION(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, logic->HookshotOrBoomerang() || (ctx->GetTrickOption(RT_ICE_BLOCK_GS) && logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS) && logic->CanKillEnemy(RE_GOLD_SKULLTULA, ED_SHORT_JUMPSLASH))), + LOCATION(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1, logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_ICE_CAVERN_PUSH_BLOCK_HALL_LEFT_STALAGMITE, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_PUSH_BLOCK_HALL_CENTER_LEFT_STALAGMITE, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_PUSH_BLOCK_HALL_CENTER_STALAGMITE, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_PUSH_BLOCK_HALL_CENTER_RIGHT_STALAGMITE, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_PUSH_BLOCK_HALL_RIGHT_STALAGMITE, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_PUSH_BLOCK_HALL_STALACTITE_1, true), + LOCATION(RC_ICE_CAVERN_PUSH_BLOCK_HALL_STALACTITE_2, true), + LOCATION(RC_ICE_CAVERN_PUSH_BLOCK_HALL_STALACTITE_3, true), + LOCATION(RC_ICE_CAVERN_SILVER_RUPEE_RED_ICE, (logic->HasItem(RG_POWER_BRACELET) || (logic->IsAdult && (logic->CanGroundJump() || ctx->GetTrickOption(RT_SLIDE_JUMP)))) && logic->BlueFire()), }, { //Exits ENTRANCE(RR_ICE_CAVERN_HUB, logic->CanClearStalagmite() || ctx->GetTrickOption(RT_ICE_STALAGMITE_CLIP)), ENTRANCE(RR_ICE_CAVERN_BLOCK_ROOM_BLUE_FIRE, logic->HasItem(RG_POWER_BRACELET) || (logic->IsAdult && (logic->CanGroundJump() || ctx->GetTrickOption(RT_SLIDE_JUMP)))), - ENTRANCE(RR_ICE_CAVERN_BEFORE_FINAL_ROOM, (logic->HasItem(RG_POWER_BRACELET) || (logic->IsAdult && (logic->CanGroundJump() || ctx->GetTrickOption(RT_SLIDE_JUMP)))) && AnyAgeTime([]{return logic->BlueFire();})), + ENTRANCE(RR_ICE_CAVERN_AFTER_BLOCK_ROOM, (logic->HasItem(RG_POWER_BRACELET) || (logic->IsAdult && (logic->CanGroundJump() || ctx->GetTrickOption(RT_SLIDE_JUMP)))) && AnyAgeTime([]{return logic->BlueFire();})), }); areaTable[RR_ICE_CAVERN_BLOCK_ROOM_BLUE_FIRE] = Region("Ice Cavern Block Room Blue Fire", SCENE_ICE_CAVERN, { @@ -102,16 +165,38 @@ void RegionTable_Init_IceCavern() { ENTRANCE(RR_ICE_CAVERN_BLOCK_ROOM, true), }); + areaTable[RR_ICE_CAVERN_AFTER_BLOCK_ROOM] = Region("Ice Cavern After Block Room", SCENE_ICE_CAVERN, {}, { + //Locations + LOCATION(RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, ctx->GetTrickOption(RT_ICE_BLOCK_GS) && logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS) && logic->BlueFire() && logic->HasItem(RG_POWER_BRACELET)), + LOCATION(RC_ICE_CAVERN_NEAR_END_STALACTITE_1, true), + LOCATION(RC_ICE_CAVERN_NEAR_END_STALACTITE_2, true), + LOCATION(RC_ICE_CAVERN_NEAR_END_STALACTITE_3, true), + LOCATION(RC_ICE_CAVERN_NEAR_END_STALACTITE_4, true), + LOCATION(RC_ICE_CAVERN_NEAR_END_STALAGMITE_1, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_NEAR_END_STALAGMITE_2, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_NEAR_END_STALAGMITE_3, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_NEAR_END_STALAGMITE_4, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_NEAR_END_STALAGMITE_5, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_NEAR_END_STALAGMITE_6, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_NEAR_END_STALAGMITE_7, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_NEAR_END_STALAGMITE_8, logic->CanClearStalagmite()), + }, { + //Exits + ENTRANCE(RR_ICE_CAVERN_BLOCK_ROOM, true), + ENTRANCE(RR_ICE_CAVERN_BEFORE_FINAL_ROOM, AnyAgeTime([]{return logic->BlueFire();})), + }); + // this represents being past the red ice barricade, not just past the silver rupee door areaTable[RR_ICE_CAVERN_BEFORE_FINAL_ROOM] = Region("Ice Cavern Before Final Room", SCENE_ICE_CAVERN, {}, { //Locations - //Assumes RR_ICE_CAVERN_BLOCK_ROOM access - LOCATION(RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, ctx->GetTrickOption(RT_ICE_BLOCK_GS) && logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS) && logic->BlueFire() && logic->HasItem(RG_POWER_BRACELET)), - LOCATION(RC_ICE_CAVERN_NEAR_END_POT_1, logic->CanBreakPots() && logic->BlueFire()), - LOCATION(RC_ICE_CAVERN_NEAR_END_POT_2, logic->CanBreakPots() && logic->BlueFire()), + LOCATION(RC_ICE_CAVERN_NEAR_END_POT_1, logic->CanBreakPots() && logic->BlueFire()), + LOCATION(RC_ICE_CAVERN_NEAR_END_POT_2, logic->CanBreakPots() && logic->BlueFire()), + LOCATION(RC_ICE_CAVERN_NEAR_END_LEFT_RED_ICE, logic->BlueFire()), + LOCATION(RC_ICE_CAVERN_NEAR_END_MIDDLE_RED_ICE, logic->BlueFire()), + LOCATION(RC_ICE_CAVERN_NEAR_END_RIGHT_RED_ICE, logic->BlueFire()), }, { //Exits - ENTRANCE(RR_ICE_CAVERN_BLOCK_ROOM, AnyAgeTime([]{return logic->BlueFire();})), + ENTRANCE(RR_ICE_CAVERN_AFTER_BLOCK_ROOM, AnyAgeTime([]{return logic->BlueFire();})), ENTRANCE(RR_ICE_CAVERN_FINAL_ROOM, true), }); @@ -142,7 +227,11 @@ void RegionTable_Init_IceCavern() { areaTable[RR_ICE_CAVERN_MQ_BEGINNING] = Region("Ice Cavern MQ Beginning", SCENE_ICE_CAVERN, {}, { //Locations - LOCATION(RC_ICE_CAVERN_MQ_ENTRANCE_POT, logic->CanBreakPots()), + LOCATION(RC_ICE_CAVERN_MQ_ENTRANCE_POT, logic->CanBreakPots()), + LOCATION(RC_ICE_CAVERN_MQ_ENTRANCE_STALAGMITE_1, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MQ_ENTRANCE_STALAGMITE_2, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MQ_LOBBY_STALACTITE_1, true), + LOCATION(RC_ICE_CAVERN_MQ_LOBBY_STALACTITE_2, true), }, { //Exits ENTRANCE(RR_ICE_CAVERN_ENTRYWAY, true), @@ -156,12 +245,28 @@ void RegionTable_Init_IceCavern() { EVENT_ACCESS(LOGIC_FAIRY_ACCESS, logic->CanBreakPots()), }, { //Locations - LOCATION(RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1, logic->CanBreakPots()), - LOCATION(RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2, logic->CanBreakPots()), - LOCATION(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1, logic->CanBreakPots()), - LOCATION(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2, logic->CanBreakPots()), - LOCATION(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3, logic->CanBreakPots()), - LOCATION(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4, logic->CanBreakPots()), + LOCATION(RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1, logic->CanBreakPots()), + LOCATION(RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_2, logic->CanBreakPots()), + LOCATION(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_1, logic->CanBreakPots()), + LOCATION(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2, logic->CanBreakPots()), + LOCATION(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_3, logic->CanBreakPots()), + LOCATION(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4, logic->CanBreakPots()), + LOCATION(RC_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_1, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_2, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_3, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_4, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_5, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MQ_HUB_STALAGMITE_1, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MQ_HUB_STALAGMITE_2, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MQ_HUB_STALAGMITE_3, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MQ_HUB_STALAGMITE_4, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MQ_HUB_STALAGMITE_5, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MQ_HUB_WEST_LEFT_RED_ICE, logic->BlueFire()), + LOCATION(RC_ICE_CAVERN_MQ_HUB_WEST_MIDDLE_RED_ICE, logic->BlueFire()), + LOCATION(RC_ICE_CAVERN_MQ_HUB_WEST_RIGHT_RED_ICE, logic->BlueFire()), + LOCATION(RC_ICE_CAVERN_MQ_HUB_LEDGE_LEFT_RED_ICE, (logic->IsAdult /*|| logic->CanGroundJump()*/) && logic->BlueFire()), + LOCATION(RC_ICE_CAVERN_MQ_HUB_LEDGE_MIDDLE_RED_ICE, (logic->IsAdult /*|| logic->CanGroundJump()*/) && logic->BlueFire()), + LOCATION(RC_ICE_CAVERN_MQ_HUB_LEDGE_RIGHT_RED_ICE, (logic->IsAdult /*|| logic->CanGroundJump()*/) && logic->BlueFire()), }, { //Exits ENTRANCE(RR_ICE_CAVERN_MQ_MAP_ROOM, AnyAgeTime([]{return logic->CanKillEnemy(RE_WHITE_WOLFOS) && logic->CanKillEnemy(RE_FREEZARD);})), @@ -176,7 +281,17 @@ void RegionTable_Init_IceCavern() { EVENT_ACCESS(LOGIC_BLUE_FIRE_ACCESS, logic->IsChild || logic->CanClearStalagmite() || ctx->GetTrickOption(RT_ICE_STALAGMITE_CLIP)), }, { //Locations - LOCATION(RC_ICE_CAVERN_MQ_MAP_CHEST, logic->BlueFire() && AnyAgeTime([]{return logic->CanHitSwitch();}) && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_ICE_CAVERN_MQ_MAP_CHEST, logic->BlueFire() && AnyAgeTime([]{return logic->CanHitSwitch();}) && logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_ICE_CAVERN_MQ_MAP_ROOM_LEFT_STALAGMITE_1, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MQ_MAP_ROOM_LEFT_STALAGMITE_2, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_1, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_2, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_3, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_4, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_5, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_6, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_7, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MQ_MAP_RED_ICE, logic->BlueFire()), }, {}); areaTable[RR_ICE_CAVERN_MQ_SCARECROW_ROOM] = Region("Ice Cavern MQ Scarecrow Room", SCENE_ICE_CAVERN, { @@ -185,8 +300,13 @@ void RegionTable_Init_IceCavern() { }, { //Locations //Implies being able to kill the skull if you hit the switch - LOCATION(RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, (logic->BlueFire() && logic->HasItem(RG_POWER_BRACELET) && logic->CanKillEnemy(RE_GOLD_SKULLTULA)) || logic->CanHitSwitch(logic->IsAdult ? ED_LONG_JUMPSLASH : ED_BOMB_THROW)), - LOCATION(RC_ICE_CAVERN_MQ_GS_SCARECROW, logic->ReachScarecrow() || (logic->IsAdult && (logic->CanUse(RG_LONGSHOT) || logic->CanGroundJump() || ctx->GetTrickOption(RT_SLIDE_JUMP)))), + LOCATION(RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, (logic->BlueFire() && logic->HasItem(RG_POWER_BRACELET) && logic->CanKillEnemy(RE_GOLD_SKULLTULA)) || logic->CanHitSwitch(logic->IsAdult ? ED_LONG_JUMPSLASH : ED_BOMB_THROW)), + LOCATION(RC_ICE_CAVERN_MQ_GS_SCARECROW, logic->ReachScarecrow() || (logic->IsAdult && (logic->CanUse(RG_LONGSHOT) || logic->CanGroundJump() || ctx->GetTrickOption(RT_SLIDE_JUMP)))), + LOCATION(RC_ICE_CAVERN_MQ_BEFORE_SCARECROW_STALAGMITE, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MQ_SCARECROW_ROOM_STALACTITE, true), + LOCATION(RC_ICE_CAVERN_MQ_SCARECROW_LEFT_RED_ICE, logic->IsChild && ctx->GetOption(RSK_BLUE_FIRE_ARROWS) && logic->CanUse(RG_ICE_ARROWS) && logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_ICE_CAVERN_MQ_SCARECROW_MIDDLE_RED_ICE, logic->IsChild && ctx->GetOption(RSK_BLUE_FIRE_ARROWS) && logic->CanUse(RG_ICE_ARROWS) && logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_ICE_CAVERN_MQ_SCARECROW_RIGHT_RED_ICE, logic->IsChild && ctx->GetOption(RSK_BLUE_FIRE_ARROWS) && logic->CanUse(RG_ICE_ARROWS) && logic->CanUse(RG_BOOMERANG)), }, { //Exits ENTRANCE(RR_ICE_CAVERN_MQ_HUB, logic->BlueFire()), @@ -196,8 +316,14 @@ void RegionTable_Init_IceCavern() { areaTable[RR_ICE_CAVERN_MQ_WEST_CORRIDOR] = Region("Ice Cavern MQ West Corridor", SCENE_ICE_CAVERN, {}, { //Locations - LOCATION(RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1, logic->CanBreakPots()), - LOCATION(RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2, logic->CanBreakPots()), + LOCATION(RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1, logic->CanBreakPots()), + LOCATION(RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_2, logic->CanBreakPots()), + LOCATION(RC_ICE_CAVERN_MQ_WEST_CORRIDOR_STALACTITE_1, true), + LOCATION(RC_ICE_CAVERN_MQ_WEST_CORRIDOR_STALACTITE_2, true), + LOCATION(RC_ICE_CAVERN_MQ_WEST_CORRIDOR_STALACTITE_3, true), + LOCATION(RC_ICE_CAVERN_MQ_SCARECROW_LEFT_RED_ICE, logic->BlueFire()), + LOCATION(RC_ICE_CAVERN_MQ_SCARECROW_MIDDLE_RED_ICE, logic->BlueFire()), + LOCATION(RC_ICE_CAVERN_MQ_SCARECROW_RIGHT_RED_ICE, logic->BlueFire()), }, { //Exits ENTRANCE(RR_ICE_CAVERN_MQ_SCARECROW_ROOM, logic->BlueFire()), @@ -209,14 +335,20 @@ void RegionTable_Init_IceCavern() { EVENT_ACCESS(LOGIC_BLUE_FIRE_ACCESS, true), }, { //Locations - LOCATION(RC_ICE_CAVERN_MQ_COMPASS_CHEST, logic->HasItem(RG_OPEN_CHEST)), + LOCATION(RC_ICE_CAVERN_MQ_COMPASS_CHEST, logic->HasItem(RG_OPEN_CHEST)), //It is possible for child with master, BGS or sticks, or adult with BGS, to hit this switch through the ice with a crouchstab, but it's precise and unintuitive for a trick - LOCATION(RC_ICE_CAVERN_MQ_FREESTANDING_POH, logic->HasExplosives()), // can get with rang trick + LOCATION(RC_ICE_CAVERN_MQ_FREESTANDING_POH, logic->HasExplosives()), // can get with rang trick //doing RT_ICE_MQ_RED_ICE_GS as child is untested, as I could not perform the trick reliably even as adult - LOCATION(RC_ICE_CAVERN_MQ_GS_RED_ICE, (logic->CanUse(RG_BOTTLE_WITH_BLUE_FIRE) && (logic->CanUse(RG_SONG_OF_TIME) || (logic->IsAdult && ctx->GetTrickOption(RT_ICE_MQ_RED_ICE_GS))) && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)) || - (ctx->GetOption(RSK_BLUE_FIRE_ARROWS) && logic->CanUse(RG_ICE_ARROWS)) || (ctx->GetTrickOption(RT_ITEM_EXTENSION) && logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_HOOKSHOT))), - LOCATION(RC_ICE_CAVERN_MQ_COMPASS_POT_1, logic->CanBreakPots()), - LOCATION(RC_ICE_CAVERN_MQ_COMPASS_POT_2, logic->CanBreakPots()), + LOCATION(RC_ICE_CAVERN_MQ_GS_RED_ICE, (logic->CanUse(RG_BOTTLE_WITH_BLUE_FIRE) && (logic->CanUse(RG_SONG_OF_TIME) || (logic->IsAdult && ctx->GetTrickOption(RT_ICE_MQ_RED_ICE_GS))) && logic->CanGetEnemyDrop(RE_GOLD_SKULLTULA)) || + (ctx->GetOption(RSK_BLUE_FIRE_ARROWS) && logic->CanUse(RG_ICE_ARROWS)) || (ctx->GetTrickOption(RT_ITEM_EXTENSION) && logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_HOOKSHOT))), + LOCATION(RC_ICE_CAVERN_MQ_COMPASS_POT_1, logic->CanBreakPots()), + LOCATION(RC_ICE_CAVERN_MQ_COMPASS_POT_2, logic->CanBreakPots()), + LOCATION(RC_ICE_CAVERN_MQ_COMPASS_LEFT_STALAGMITE_1, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MQ_COMPASS_LEFT_STALAGMITE_2, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MQ_COMPASS_RIGHT_STALAGMITE_1, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MQ_COMPASS_RIGHT_STALAGMITE_2, logic->CanClearStalagmite()), + LOCATION(RC_ICE_CAVERN_MQ_COMPASS_RED_ICE, (logic->CanUse(RG_BOTTLE_WITH_BLUE_FIRE) && (logic->CanUse(RG_SONG_OF_TIME) || (logic->IsAdult && ctx->GetTrickOption(RT_ICE_MQ_RED_ICE_GS))) && (logic->CanKillEnemy(RE_GOLD_SKULLTULA) || logic->TakeDamage())) || + (ctx->GetOption(RSK_BLUE_FIRE_ARROWS) && logic->CanUse(RG_ICE_ARROWS))), }, {}); areaTable[RR_ICE_CAVERN_MQ_STALFOS_ROOM] = Region("Ice Cavern MQ Stalfos Room", SCENE_ICE_CAVERN, {}, { diff --git a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp index 5f824b709..c565a6f89 100644 --- a/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/overworld/zoras_domain.cpp @@ -40,6 +40,8 @@ void RegionTable_Init_ZorasDomain() { LOCATION(RC_ZD_KING_ZORA_PATH_ARROW_SIGN, logic->CanRead()), LOCATION(RC_ZD_NEAR_KING_ZORA_RECTANGLE_SIGN, logic->CanRead()), LOCATION(RC_ZD_NEAR_KING_ZORA_ARROW_SIGN, logic->CanRead()), + LOCATION(RC_ZD_KING_ZORA_RED_ICE, logic->IsAdult && logic->Get(LOGIC_KING_ZORA_THAWED)), + LOCATION(RC_ZD_ZORA_SHOP_RED_ICE, logic->IsAdult && logic->BlueFire()), }, { //Exits ENTRANCE(RR_ZR_BEHIND_WATERFALL, true), @@ -61,6 +63,7 @@ void RegionTable_Init_ZorasDomain() { }, { //Locations LOCATION(RC_ZD_BEHIND_KING_ZORA_BEEHIVE, logic->IsChild && logic->CanBreakUpperBeehives()), + LOCATION(RC_ZD_KING_ZORA_RED_ICE, logic->IsAdult && logic->Get(LOGIC_KING_ZORA_THAWED)), }, { //Exits ENTRANCE(RR_ZORAS_DOMAIN, logic->Get(LOGIC_DELIVER_RUTOS_LETTER) || ctx->GetOption(RSK_ZORAS_FOUNTAIN).Is(RO_ZF_OPEN) || (ctx->GetOption(RSK_ZORAS_FOUNTAIN).Is(RO_ZF_CLOSED_CHILD) && logic->IsAdult)), diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index d187c8dcd..d2c18d660 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -312,6 +312,12 @@ void Settings::CreateOptionDescriptions() { "only shuffle with No Logic."; mOptionDescriptions[RSK_SHUFFLE_BUSHES] = "Bushes in Hyrule Field & Zora's Fountain will contain randomized items when first walked through."; + mOptionDescriptions[RSK_SHUFFLE_ICICLES] = + "Stalagmites and stalactites in Ice Cavern and Ganon's Castle will contain randomized items when broken.\n" + "Icicles will have a halo around them when carrying randomized items."; + mOptionDescriptions[RSK_SHUFFLE_RED_ICE] = + "Red Ice will give randomized items when melted.\n" + "Red Ice will have a particle effect inside it when it holds a randomized item"; mOptionDescriptions[RSK_SHUFFLE_SIGNS] = "Signs and readable pedestals, plinths, altars, and graves will grant a " "randomized item the first time they are read. " "Signs will have a particle effect when they hold a randomized item.\n" diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 19af0c66f..5b2ca3549 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3281,6 +3281,227 @@ std::map rcToRandomizerInf = { { RC_KAK_BEGGAR_BUGS, RAND_INF_KAK_BEGGAR_BUGS }, { RC_KAK_BEGGAR_FISH, RAND_INF_KAK_BEGGAR_FISH }, { RC_KAK_BEGGAR_BLUE_FIRE, RAND_INF_KAK_BEGGAR_BLUE_FIRE }, + // Icicles + { RC_ICE_CAVERN_ENTRANCE_LEFT_STALAGMITE, RAND_INF_ICE_CAVERN_ENTRANCE_LEFT_STALAGMITE }, + { RC_ICE_CAVERN_ENTRANCE_MIDDLE_STALAGMITE, RAND_INF_ICE_CAVERN_ENTRANCE_MIDDLE_STALAGMITE }, + { RC_ICE_CAVERN_ENTRANCE_RIGHT_STALAGMITE, RAND_INF_ICE_CAVERN_ENTRANCE_RIGHT_STALAGMITE }, + { RC_ICE_CAVERN_ENTRANCE_STALACTITE_1, RAND_INF_ICE_CAVERN_ENTRANCE_STALACTITE_1 }, + { RC_ICE_CAVERN_ENTRANCE_STALACTITE_2, RAND_INF_ICE_CAVERN_ENTRANCE_STALACTITE_2 }, + { RC_ICE_CAVERN_LOBBY_STALACTITE, RAND_INF_ICE_CAVERN_LOBBY_STALACTITE }, + { RC_ICE_CAVERN_LOBBY_LEFT_STALAGMITE, RAND_INF_ICE_CAVERN_LOBBY_LEFT_STALAGMITE }, + { RC_ICE_CAVERN_LOBBY_MIDDLE_STALAGMITE, RAND_INF_ICE_CAVERN_LOBBY_MIDDLE_STALAGMITE }, + { RC_ICE_CAVERN_LOBBY_RIGHT_STALAGMITE, RAND_INF_ICE_CAVERN_LOBBY_RIGHT_STALAGMITE }, + { RC_ICE_CAVERN_AFTER_LOBBY_STALACTITE, RAND_INF_ICE_CAVERN_AFTER_LOBBY_STALACTITE }, + { RC_ICE_CAVERN_AFTER_LOBBY_LEFT_STALAGMITE, RAND_INF_ICE_CAVERN_AFTER_LOBBY_LEFT_STALAGMITE }, + { RC_ICE_CAVERN_AFTER_LOBBY_CENTER_LEFT_STALAGMITE, RAND_INF_ICE_CAVERN_AFTER_LOBBY_CENTER_LEFT_STALAGMITE }, + { RC_ICE_CAVERN_AFTER_LOBBY_CENTER_RIGHT_STALAGMITE, RAND_INF_ICE_CAVERN_AFTER_LOBBY_CENTER_RIGHT_STALAGMITE }, + { RC_ICE_CAVERN_AFTER_LOBBY_RIGHT_STALAGMITE, RAND_INF_ICE_CAVERN_AFTER_LOBBY_RIGHT_STALAGMITE }, + { RC_ICE_CAVERN_SPINNING_BLADE_LEFT_STALAGMITE, RAND_INF_ICE_CAVERN_SPINNING_BLADE_LEFT_STALAGMITE }, + { RC_ICE_CAVERN_SPINNING_BLADE_MIDDLE_STALAGMITE, RAND_INF_ICE_CAVERN_SPINNING_BLADE_MIDDLE_STALAGMITE }, + { RC_ICE_CAVERN_SPINNING_BLADE_RIGHT_STALAGMITE, RAND_INF_ICE_CAVERN_SPINNING_BLADE_RIGHT_STALAGMITE }, + { RC_ICE_CAVERN_MAP_HALLWAY_STALACTITE_1, RAND_INF_ICE_CAVERN_MAP_HALLWAY_STALACTITE_1 }, + { RC_ICE_CAVERN_MAP_HALLWAY_STALACTITE_2, RAND_INF_ICE_CAVERN_MAP_HALLWAY_STALACTITE_2 }, + { RC_ICE_CAVERN_MAP_HALLWAY_STALACTITE_3, RAND_INF_ICE_CAVERN_MAP_HALLWAY_STALACTITE_3 }, + { RC_ICE_CAVERN_MAP_HALLWAY_STALACTITE_4, RAND_INF_ICE_CAVERN_MAP_HALLWAY_STALACTITE_4 }, + { RC_ICE_CAVERN_MAP_HALLWAY_STALACTITE_5, RAND_INF_ICE_CAVERN_MAP_HALLWAY_STALACTITE_5 }, + { RC_ICE_CAVERN_MAP_HALLWAY_LEFT_STALAGMITE, RAND_INF_ICE_CAVERN_MAP_HALLWAY_LEFT_STALAGMITE }, + { RC_ICE_CAVERN_MAP_HALLWAY_MIDDLE_STALAGMITE, RAND_INF_ICE_CAVERN_MAP_HALLWAY_MIDDLE_STALAGMITE }, + { RC_ICE_CAVERN_MAP_HALLWAY_RIGHT_STALAGMITE, RAND_INF_ICE_CAVERN_MAP_HALLWAY_RIGHT_STALAGMITE }, + { RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_1, RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_1 }, + { RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_2, RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_2 }, + { RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_3, RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_3 }, + { RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_4, RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_4 }, + { RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_5, RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_5 }, + { RC_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALACTITE_1, RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALACTITE_1 }, + { RC_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALACTITE_2, RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALACTITE_2 }, + { RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_1, RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_1 }, + { RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_2, RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_2 }, + { RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_3, RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_3 }, + { RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_4, RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_4 }, + { RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_5, RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_5 }, + { RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_6, RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_6 }, + { RC_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALAGMITE_1, RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALAGMITE_1 }, + { RC_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALAGMITE_2, RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALAGMITE_2 }, + { RC_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALAGMITE_3, RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALAGMITE_3 }, + { RC_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_1, RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_1 }, + { RC_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_2, RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_2 }, + { RC_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_3, RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_3 }, + { RC_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_4, RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_4 }, + { RC_ICE_CAVERN_PUSH_BLOCK_HALL_LEFT_STALAGMITE, RAND_INF_ICE_CAVERN_PUSH_BLOCK_HALL_LEFT_STALAGMITE }, + { RC_ICE_CAVERN_PUSH_BLOCK_HALL_CENTER_LEFT_STALAGMITE, + RAND_INF_ICE_CAVERN_PUSH_BLOCK_HALL_CENTER_LEFT_STALAGMITE }, + { RC_ICE_CAVERN_PUSH_BLOCK_HALL_CENTER_STALAGMITE, RAND_INF_ICE_CAVERN_PUSH_BLOCK_HALL_CENTER_STALAGMITE }, + { RC_ICE_CAVERN_PUSH_BLOCK_HALL_CENTER_RIGHT_STALAGMITE, + RAND_INF_ICE_CAVERN_PUSH_BLOCK_HALL_CENTER_RIGHT_STALAGMITE }, + { RC_ICE_CAVERN_PUSH_BLOCK_HALL_RIGHT_STALAGMITE, RAND_INF_ICE_CAVERN_PUSH_BLOCK_HALL_RIGHT_STALAGMITE }, + { RC_ICE_CAVERN_PUSH_BLOCK_HALL_STALACTITE_1, RAND_INF_ICE_CAVERN_PUSH_BLOCK_HALL_STALACTITE_1 }, + { RC_ICE_CAVERN_PUSH_BLOCK_HALL_STALACTITE_2, RAND_INF_ICE_CAVERN_PUSH_BLOCK_HALL_STALACTITE_2 }, + { RC_ICE_CAVERN_PUSH_BLOCK_HALL_STALACTITE_3, RAND_INF_ICE_CAVERN_PUSH_BLOCK_HALL_STALACTITE_3 }, + { RC_ICE_CAVERN_NEAR_END_STALACTITE_1, RAND_INF_ICE_CAVERN_NEAR_END_STALACTITE_1 }, + { RC_ICE_CAVERN_NEAR_END_STALACTITE_2, RAND_INF_ICE_CAVERN_NEAR_END_STALACTITE_2 }, + { RC_ICE_CAVERN_NEAR_END_STALACTITE_3, RAND_INF_ICE_CAVERN_NEAR_END_STALACTITE_3 }, + { RC_ICE_CAVERN_NEAR_END_STALACTITE_4, RAND_INF_ICE_CAVERN_NEAR_END_STALACTITE_4 }, + { RC_ICE_CAVERN_NEAR_END_STALAGMITE_1, RAND_INF_ICE_CAVERN_NEAR_END_STALAGMITE_1 }, + { RC_ICE_CAVERN_NEAR_END_STALAGMITE_2, RAND_INF_ICE_CAVERN_NEAR_END_STALAGMITE_2 }, + { RC_ICE_CAVERN_NEAR_END_STALAGMITE_3, RAND_INF_ICE_CAVERN_NEAR_END_STALAGMITE_3 }, + { RC_ICE_CAVERN_NEAR_END_STALAGMITE_4, RAND_INF_ICE_CAVERN_NEAR_END_STALAGMITE_4 }, + { RC_ICE_CAVERN_NEAR_END_STALAGMITE_5, RAND_INF_ICE_CAVERN_NEAR_END_STALAGMITE_5 }, + { RC_ICE_CAVERN_NEAR_END_STALAGMITE_6, RAND_INF_ICE_CAVERN_NEAR_END_STALAGMITE_6 }, + { RC_ICE_CAVERN_NEAR_END_STALAGMITE_7, RAND_INF_ICE_CAVERN_NEAR_END_STALAGMITE_7 }, + { RC_ICE_CAVERN_NEAR_END_STALAGMITE_8, RAND_INF_ICE_CAVERN_NEAR_END_STALAGMITE_8 }, + { RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_1, RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_1 }, + { RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_2, RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_2 }, + { RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_3, RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_3 }, + { RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_4, RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_4 }, + { RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_5, RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_5 }, + { RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_6, RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_6 }, + { RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_7, RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_7 }, + { RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_8, RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_8 }, + { RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_9, RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_9 }, + { RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_10, RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_10 }, + { RC_GANONS_CASTLE_WATER_TRIAL_LEFT_STALAGMITE_1, RAND_INF_GANONS_CASTLE_WATER_TRIAL_LEFT_STALAGMITE_1 }, + { RC_GANONS_CASTLE_WATER_TRIAL_LEFT_STALAGMITE_2, RAND_INF_GANONS_CASTLE_WATER_TRIAL_LEFT_STALAGMITE_2 }, + { RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_STALAGMITE_1, RAND_INF_GANONS_CASTLE_WATER_TRIAL_RIGHT_STALAGMITE_1 }, + { RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_STALAGMITE_2, RAND_INF_GANONS_CASTLE_WATER_TRIAL_RIGHT_STALAGMITE_2 }, + { RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_1, RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_1 }, + { RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_2, RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_2 }, + { RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_3, RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_3 }, + { RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_4, RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_4 }, + { RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_5, RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_5 }, + { RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_6, RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_6 }, + { RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_7, RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_7 }, + { RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_8, RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_8 }, + { RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_9, RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_9 }, + { RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_10, RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_10 }, + { RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_11, RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_11 }, + { RC_ICE_CAVERN_MQ_ENTRANCE_STALAGMITE_1, RAND_INF_ICE_CAVERN_MQ_ENTRANCE_STALAGMITE_1 }, + { RC_ICE_CAVERN_MQ_ENTRANCE_STALAGMITE_2, RAND_INF_ICE_CAVERN_MQ_ENTRANCE_STALAGMITE_2 }, + { RC_ICE_CAVERN_MQ_LOBBY_STALACTITE_1, RAND_INF_ICE_CAVERN_MQ_LOBBY_STALACTITE_1 }, + { RC_ICE_CAVERN_MQ_LOBBY_STALACTITE_2, RAND_INF_ICE_CAVERN_MQ_LOBBY_STALACTITE_2 }, + { RC_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_1, RAND_INF_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_1 }, + { RC_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_2, RAND_INF_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_2 }, + { RC_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_3, RAND_INF_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_3 }, + { RC_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_4, RAND_INF_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_4 }, + { RC_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_5, RAND_INF_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_5 }, + { RC_ICE_CAVERN_MQ_HUB_STALAGMITE_1, RAND_INF_ICE_CAVERN_MQ_HUB_STALAGMITE_1 }, + { RC_ICE_CAVERN_MQ_HUB_STALAGMITE_2, RAND_INF_ICE_CAVERN_MQ_HUB_STALAGMITE_2 }, + { RC_ICE_CAVERN_MQ_HUB_STALAGMITE_3, RAND_INF_ICE_CAVERN_MQ_HUB_STALAGMITE_3 }, + { RC_ICE_CAVERN_MQ_HUB_STALAGMITE_4, RAND_INF_ICE_CAVERN_MQ_HUB_STALAGMITE_4 }, + { RC_ICE_CAVERN_MQ_HUB_STALAGMITE_5, RAND_INF_ICE_CAVERN_MQ_HUB_STALAGMITE_5 }, + { RC_ICE_CAVERN_MQ_MAP_ROOM_LEFT_STALAGMITE_1, RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_LEFT_STALAGMITE_1 }, + { RC_ICE_CAVERN_MQ_MAP_ROOM_LEFT_STALAGMITE_2, RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_LEFT_STALAGMITE_2 }, + { RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_1, RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_1 }, + { RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_2, RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_2 }, + { RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_3, RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_3 }, + { RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_4, RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_4 }, + { RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_5, RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_5 }, + { RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_6, RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_6 }, + { RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_7, RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_7 }, + { RC_ICE_CAVERN_MQ_COMPASS_LEFT_STALAGMITE_1, RAND_INF_ICE_CAVERN_MQ_COMPASS_LEFT_STALAGMITE_1 }, + { RC_ICE_CAVERN_MQ_COMPASS_LEFT_STALAGMITE_2, RAND_INF_ICE_CAVERN_MQ_COMPASS_LEFT_STALAGMITE_2 }, + { RC_ICE_CAVERN_MQ_COMPASS_RIGHT_STALAGMITE_1, RAND_INF_ICE_CAVERN_MQ_COMPASS_RIGHT_STALAGMITE_1 }, + { RC_ICE_CAVERN_MQ_COMPASS_RIGHT_STALAGMITE_2, RAND_INF_ICE_CAVERN_MQ_COMPASS_RIGHT_STALAGMITE_2 }, + { RC_ICE_CAVERN_MQ_BEFORE_SCARECROW_STALAGMITE, RAND_INF_ICE_CAVERN_MQ_BEFORE_SCARECROW_STALAGMITE }, + { RC_ICE_CAVERN_MQ_SCARECROW_ROOM_STALACTITE, RAND_INF_ICE_CAVERN_MQ_SCARECROW_ROOM_STALACTITE }, + { RC_ICE_CAVERN_MQ_WEST_CORRIDOR_STALACTITE_1, RAND_INF_ICE_CAVERN_MQ_WEST_CORRIDOR_STALACTITE_1 }, + { RC_ICE_CAVERN_MQ_WEST_CORRIDOR_STALACTITE_2, RAND_INF_ICE_CAVERN_MQ_WEST_CORRIDOR_STALACTITE_2 }, + { RC_ICE_CAVERN_MQ_WEST_CORRIDOR_STALACTITE_3, RAND_INF_ICE_CAVERN_MQ_WEST_CORRIDOR_STALACTITE_3 }, + { RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_1, + RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_1 }, + { RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_2, + RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_2 }, + { RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_3, + RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_3 }, + { RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_4, + RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_4 }, + { RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_5, + RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_5 }, + { RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_1, + RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_1 }, + { RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_2, + RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_2 }, + { RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_3, + RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_3 }, + { RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_4, + RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_4 }, + { RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_LEFT_STALACTITE, + RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_LEFT_STALACTITE }, + { RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_TOP_RIGHT_STALACTITE_1, + RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_TOP_RIGHT_STALACTITE_1 }, + { RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_TOP_RIGHT_STALACTITE_2, + RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_TOP_RIGHT_STALACTITE_2 }, + { RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_TOP_RIGHT_STALACTITE_3, + RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_TOP_RIGHT_STALACTITE_3 }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALACTITE_1, RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALACTITE_1 }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALACTITE_2, RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALACTITE_2 }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALACTITE_3, RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALACTITE_3 }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALACTITE_1, RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALACTITE_1 }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALACTITE_2, RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALACTITE_2 }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALACTITE_3, RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALACTITE_3 }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_1, RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_1 }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_2, RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_2 }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_3, RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_3 }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_4, RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_4 }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_1, RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_1 }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_2, RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_2 }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_3, RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_3 }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_4, RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_4 }, + // Red Ice + { RC_ZD_KING_ZORA_RED_ICE, RAND_INF_ZD_KING_ZORA_RED_ICE }, + { RC_ZD_ZORA_SHOP_RED_ICE, RAND_INF_ZD_ZORA_SHOP_RED_ICE }, + { RC_ICE_CAVERN_ENTRANCE_RED_ICE, RAND_INF_ICE_CAVERN_ENTRANCE_RED_ICE }, + { RC_ICE_CAVERN_LOBBY_LEFT_RED_ICE, RAND_INF_ICE_CAVERN_LOBBY_LEFT_RED_ICE }, + { RC_ICE_CAVERN_LOBBY_RIGHT_RED_ICE, RAND_INF_ICE_CAVERN_LOBBY_RIGHT_RED_ICE }, + { RC_ICE_CAVERN_SPINNING_BLADE_EAST_RED_ICE, RAND_INF_ICE_CAVERN_SPINNING_BLADE_EAST_RED_ICE }, + { RC_ICE_CAVERN_SPINNING_BLADE_WEST_RED_ICE, RAND_INF_ICE_CAVERN_SPINNING_BLADE_WEST_RED_ICE }, + { RC_ICE_CAVERN_HEART_PIECE_ROOM_FREESTANDING_RED_ICE, RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_FREESTANDING_RED_ICE }, + { RC_ICE_CAVERN_HEART_PIECE_ROOM_CHEST_RED_ICE, RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CHEST_RED_ICE }, + { RC_ICE_CAVERN_MAP_ROOM_POT_RED_ICE, RAND_INF_ICE_CAVERN_MAP_ROOM_POT_RED_ICE }, + { RC_ICE_CAVERN_MAP_ROOM_CHEST_RED_ICE, RAND_INF_ICE_CAVERN_MAP_ROOM_CHEST_RED_ICE }, + { RC_ICE_CAVERN_SILVER_RUPEE_RED_ICE, RAND_INF_ICE_CAVERN_SILVER_RUPEE_RED_ICE }, + { RC_ICE_CAVERN_NEAR_END_LEFT_RED_ICE, RAND_INF_ICE_CAVERN_NEAR_END_LEFT_RED_ICE }, + { RC_ICE_CAVERN_NEAR_END_MIDDLE_RED_ICE, RAND_INF_ICE_CAVERN_NEAR_END_MIDDLE_RED_ICE }, + { RC_ICE_CAVERN_NEAR_END_RIGHT_RED_ICE, RAND_INF_ICE_CAVERN_NEAR_END_RIGHT_RED_ICE }, + { RC_GANONS_CASTLE_WATER_TRIAL_DOOR_RED_ICE, RAND_INF_GANONS_CASTLE_WATER_TRIAL_DOOR_RED_ICE }, + { RC_GANONS_CASTLE_WATER_TRIAL_RUSTED_SWITCH_RED_ICE, RAND_INF_GANONS_CASTLE_WATER_TRIAL_RUSTED_SWITCH_RED_ICE }, + { RC_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM_RED_ICE, RAND_INF_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM_RED_ICE }, + { RC_ICE_CAVERN_MQ_HUB_WEST_LEFT_RED_ICE, RAND_INF_ICE_CAVERN_MQ_HUB_WEST_LEFT_RED_ICE }, + { RC_ICE_CAVERN_MQ_HUB_WEST_MIDDLE_RED_ICE, RAND_INF_ICE_CAVERN_MQ_HUB_WEST_MIDDLE_RED_ICE }, + { RC_ICE_CAVERN_MQ_HUB_WEST_RIGHT_RED_ICE, RAND_INF_ICE_CAVERN_MQ_HUB_WEST_RIGHT_RED_ICE }, + { RC_ICE_CAVERN_MQ_HUB_LEDGE_LEFT_RED_ICE, RAND_INF_ICE_CAVERN_MQ_HUB_LEDGE_LEFT_RED_ICE }, + { RC_ICE_CAVERN_MQ_HUB_LEDGE_MIDDLE_RED_ICE, RAND_INF_ICE_CAVERN_MQ_HUB_LEDGE_MIDDLE_RED_ICE }, + { RC_ICE_CAVERN_MQ_HUB_LEDGE_RIGHT_RED_ICE, RAND_INF_ICE_CAVERN_MQ_HUB_LEDGE_RIGHT_RED_ICE }, + { RC_ICE_CAVERN_MQ_COMPASS_RED_ICE, RAND_INF_ICE_CAVERN_MQ_COMPASS_RED_ICE }, + { RC_ICE_CAVERN_MQ_MAP_RED_ICE, RAND_INF_ICE_CAVERN_MQ_MAP_RED_ICE }, + { RC_ICE_CAVERN_MQ_SCARECROW_LEFT_RED_ICE, RAND_INF_ICE_CAVERN_MQ_SCARECROW_LEFT_RED_ICE }, + { RC_ICE_CAVERN_MQ_SCARECROW_MIDDLE_RED_ICE, RAND_INF_ICE_CAVERN_MQ_SCARECROW_MIDDLE_RED_ICE }, + { RC_ICE_CAVERN_MQ_SCARECROW_RIGHT_RED_ICE, RAND_INF_ICE_CAVERN_MQ_SCARECROW_RIGHT_RED_ICE }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_LEFT_RED_ICE, + RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_LEFT_RED_ICE }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_RIGHT_RED_ICE, + RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_RIGHT_RED_ICE }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_BACK_LEFT_RED_ICE, + RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_BACK_LEFT_RED_ICE }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_1, + RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_1 }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_2, + RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_2 }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_3, + RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_3 }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_4, + RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_4 }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_SILVER_RUPEE_RED_ICE, + RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_SILVER_RUPEE_RED_ICE }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_1, + RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_1 }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_2, + RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_2 }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_3, + RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_3 }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_4, + RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_4 }, + { RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_5, + RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_5 }, }; CheckIdentity Randomizer::IdentifyBeehive(s32 sceneNum, s16 xPosition, s32 respawnData) { @@ -3842,6 +4063,55 @@ CheckIdentity Randomizer::IdentifyBeggar(s32 sceneNum, s32 textId) { return beggarIdentity; } +CheckIdentity Randomizer::IdentifyIcicle(s32 sceneNum, s32 posX, s32 posZ) { + struct CheckIdentity icicleIdentity; + uint32_t icicleSceneNum = sceneNum; + + icicleIdentity.randomizerInf = RAND_INF_MAX; + icicleIdentity.randomizerCheck = RC_UNKNOWN_CHECK; + + s32 actorParams = TWO_ACTOR_PARAMS(posX, posZ); + + Rando::Location* location = GetCheckObjectFromActor(ACTOR_BG_ICE_TURARA, icicleSceneNum, actorParams); + + if (location->GetRandomizerCheck() == RC_UNKNOWN_CHECK) { + LUSLOG_WARN("IdentifyIcicle did not receive a valid RC value (%d).", location->GetRandomizerCheck()); + assert(false); + } else { + icicleIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()]; + icicleIdentity.randomizerCheck = location->GetRandomizerCheck(); + } + + return icicleIdentity; +} + +CheckIdentity Randomizer::IdentifyRedIce(s32 sceneNum, s32 posX, s32 posZ) { + struct CheckIdentity redIceIdentity; + uint32_t redIceSceneNum = sceneNum; + + // Handle KZ moving + if (sceneNum == SCENE_ZORAS_DOMAIN && LINK_IS_ADULT && posX == 531 && posZ == -1818) { + posX = 628; + } + + redIceIdentity.randomizerInf = RAND_INF_MAX; + redIceIdentity.randomizerCheck = RC_UNKNOWN_CHECK; + + s32 actorParams = TWO_ACTOR_PARAMS(posX, posZ); + + Rando::Location* location = GetCheckObjectFromActor(ACTOR_BG_ICE_SHELTER, redIceSceneNum, actorParams); + + if (location->GetRandomizerCheck() == RC_UNKNOWN_CHECK) { + LUSLOG_WARN("IdentifyRedIce did not receive a valid RC value (%d).", location->GetRandomizerCheck()); + assert(false); + } else { + redIceIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()]; + redIceIdentity.randomizerCheck = location->GetRandomizerCheck(); + } + + return redIceIdentity; +} + u8 Randomizer::GetRandoSettingValue(RandomizerSettingKey randoSettingKey) { return Rando::Context::GetInstance()->GetOption(randoSettingKey).Get(); } diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index ae2d45893..0395caa4a 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -46,6 +46,8 @@ class Randomizer { CheckIdentity IdentifySign(s32 sceneNum, s32 posX, s32 posZ, s32 id); CheckIdentity IdentifyWonderItem(s32 sceneNum, s32 par1, s32 par2); CheckIdentity IdentifyBeggar(s32 sceneNum, s32 textId); + CheckIdentity IdentifyIcicle(s32 sceneNum, s32 posX, s32 posZ); + CheckIdentity IdentifyRedIce(s32 sceneNum, s32 posX, s32 posZ); GetItemEntry GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogItemId, bool checkObtainability = true); GetItemEntry GetItemFromActor(s16 actorId, s16 sceneNum, s16 actorParams, GetItemID ogItemId, diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerCheck.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerCheck.h index 9e3fb654f..535eba5f2 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerCheck.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerCheck.h @@ -2869,6 +2869,201 @@ RANDO_ENUM_ITEM(RC_KAK_BEGGAR_BUGS) RANDO_ENUM_ITEM(RC_KAK_BEGGAR_FISH) RANDO_ENUM_ITEM(RC_KAK_BEGGAR_BLUE_FIRE) +// Vanilla Icicles +RANDO_ENUM_ITEM(RC_ICE_CAVERN_ENTRANCE_LEFT_STALAGMITE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_ENTRANCE_MIDDLE_STALAGMITE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_ENTRANCE_RIGHT_STALAGMITE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_ENTRANCE_STALACTITE_1) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_ENTRANCE_STALACTITE_2) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_LOBBY_STALACTITE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_LOBBY_LEFT_STALAGMITE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_LOBBY_MIDDLE_STALAGMITE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_LOBBY_RIGHT_STALAGMITE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_AFTER_LOBBY_STALACTITE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_AFTER_LOBBY_LEFT_STALAGMITE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_AFTER_LOBBY_CENTER_LEFT_STALAGMITE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_AFTER_LOBBY_CENTER_RIGHT_STALAGMITE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_AFTER_LOBBY_RIGHT_STALAGMITE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_SPINNING_BLADE_LEFT_STALAGMITE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_SPINNING_BLADE_MIDDLE_STALAGMITE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_SPINNING_BLADE_RIGHT_STALAGMITE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MAP_HALLWAY_STALACTITE_1) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MAP_HALLWAY_STALACTITE_2) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MAP_HALLWAY_STALACTITE_3) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MAP_HALLWAY_STALACTITE_4) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MAP_HALLWAY_STALACTITE_5) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MAP_HALLWAY_LEFT_STALAGMITE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MAP_HALLWAY_MIDDLE_STALAGMITE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MAP_HALLWAY_RIGHT_STALAGMITE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_1) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_2) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_3) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_4) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_5) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALACTITE_1) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALACTITE_2) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_1) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_2) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_3) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_4) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_5) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_6) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALAGMITE_1) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALAGMITE_2) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALAGMITE_3) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_1) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_2) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_3) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_4) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_PUSH_BLOCK_HALL_LEFT_STALAGMITE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_PUSH_BLOCK_HALL_CENTER_LEFT_STALAGMITE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_PUSH_BLOCK_HALL_CENTER_STALAGMITE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_PUSH_BLOCK_HALL_CENTER_RIGHT_STALAGMITE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_PUSH_BLOCK_HALL_RIGHT_STALAGMITE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_PUSH_BLOCK_HALL_STALACTITE_1) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_PUSH_BLOCK_HALL_STALACTITE_2) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_PUSH_BLOCK_HALL_STALACTITE_3) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_NEAR_END_STALACTITE_1) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_NEAR_END_STALACTITE_2) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_NEAR_END_STALACTITE_3) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_NEAR_END_STALACTITE_4) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_NEAR_END_STALAGMITE_1) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_NEAR_END_STALAGMITE_2) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_NEAR_END_STALAGMITE_3) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_NEAR_END_STALAGMITE_4) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_NEAR_END_STALAGMITE_5) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_NEAR_END_STALAGMITE_6) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_NEAR_END_STALAGMITE_7) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_NEAR_END_STALAGMITE_8) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_1) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_2) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_3) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_4) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_5) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_6) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_7) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_8) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_9) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_10) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_LEFT_STALAGMITE_1) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_LEFT_STALAGMITE_2) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_STALAGMITE_1) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_STALAGMITE_2) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_1) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_2) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_3) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_4) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_5) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_6) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_7) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_8) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_9) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_10) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_STALACTITE_11) +// MQ Icicles +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_ENTRANCE_STALAGMITE_1) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_ENTRANCE_STALAGMITE_2) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_LOBBY_STALACTITE_1) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_LOBBY_STALACTITE_2) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_1) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_2) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_3) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_4) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_5) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_HUB_STALAGMITE_1) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_HUB_STALAGMITE_2) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_HUB_STALAGMITE_3) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_HUB_STALAGMITE_4) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_HUB_STALAGMITE_5) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_MAP_ROOM_LEFT_STALAGMITE_1) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_MAP_ROOM_LEFT_STALAGMITE_2) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_1) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_2) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_3) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_4) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_5) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_6) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_7) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_COMPASS_LEFT_STALAGMITE_1) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_COMPASS_LEFT_STALAGMITE_2) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_COMPASS_RIGHT_STALAGMITE_1) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_COMPASS_RIGHT_STALAGMITE_2) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_BEFORE_SCARECROW_STALAGMITE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_SCARECROW_ROOM_STALACTITE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_WEST_CORRIDOR_STALACTITE_1) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_WEST_CORRIDOR_STALACTITE_2) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_WEST_CORRIDOR_STALACTITE_3) +RANDO_ENUM_ITEM(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_1) +RANDO_ENUM_ITEM(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_2) +RANDO_ENUM_ITEM(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_3) +RANDO_ENUM_ITEM(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_4) +RANDO_ENUM_ITEM(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_5) +RANDO_ENUM_ITEM(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_1) +RANDO_ENUM_ITEM(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_2) +RANDO_ENUM_ITEM(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_3) +RANDO_ENUM_ITEM(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_4) +RANDO_ENUM_ITEM(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_LEFT_STALACTITE) +RANDO_ENUM_ITEM(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_TOP_RIGHT_STALACTITE_1) +RANDO_ENUM_ITEM(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_TOP_RIGHT_STALACTITE_2) +RANDO_ENUM_ITEM(RC_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_TOP_RIGHT_STALACTITE_3) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALACTITE_1) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALACTITE_2) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALACTITE_3) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALACTITE_1) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALACTITE_2) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALACTITE_3) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_1) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_2) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_3) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_4) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_1) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_2) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_3) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_4) +// Red Ice +RANDO_ENUM_ITEM(RC_ZD_KING_ZORA_RED_ICE) +RANDO_ENUM_ITEM(RC_ZD_ZORA_SHOP_RED_ICE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_ENTRANCE_RED_ICE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_LOBBY_LEFT_RED_ICE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_LOBBY_RIGHT_RED_ICE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_SPINNING_BLADE_EAST_RED_ICE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_SPINNING_BLADE_WEST_RED_ICE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_HEART_PIECE_ROOM_FREESTANDING_RED_ICE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_HEART_PIECE_ROOM_CHEST_RED_ICE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MAP_ROOM_POT_RED_ICE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MAP_ROOM_CHEST_RED_ICE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_SILVER_RUPEE_RED_ICE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_NEAR_END_LEFT_RED_ICE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_NEAR_END_MIDDLE_RED_ICE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_NEAR_END_RIGHT_RED_ICE) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_DOOR_RED_ICE) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_WATER_TRIAL_RUSTED_SWITCH_RED_ICE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_HUB_WEST_LEFT_RED_ICE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_HUB_WEST_MIDDLE_RED_ICE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_HUB_WEST_RIGHT_RED_ICE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_HUB_LEDGE_LEFT_RED_ICE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_HUB_LEDGE_MIDDLE_RED_ICE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_HUB_LEDGE_RIGHT_RED_ICE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_COMPASS_RED_ICE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_MAP_RED_ICE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_SCARECROW_LEFT_RED_ICE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_SCARECROW_MIDDLE_RED_ICE) +RANDO_ENUM_ITEM(RC_ICE_CAVERN_MQ_SCARECROW_RIGHT_RED_ICE) +RANDO_ENUM_ITEM(RC_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM_RED_ICE) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_LEFT_RED_ICE) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_RIGHT_RED_ICE) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_BACK_LEFT_RED_ICE) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_1) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_2) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_3) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_4) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_SILVER_RUPEE_RED_ICE) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_1) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_2) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_3) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_4) +RANDO_ENUM_ITEM(RC_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_5) + RANDO_ENUM_ITEM(RC_MAX) RANDO_ENUM_END(RandomizerCheck) diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerHintTextKey.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerHintTextKey.h index 8b7dbb09d..065b6d2f5 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerHintTextKey.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerHintTextKey.h @@ -1609,6 +1609,15 @@ RANDO_ENUM_ITEM(RHT_SIGN_SPIRIT_TEMPLE) // BEGGAR RANDO_ENUM_ITEM(RHT_BEGGAR_MARKET) RANDO_ENUM_ITEM(RHT_BEGGAR_KAKARIKO_VILLAGE) +// ICICLES +RANDO_ENUM_ITEM(RHT_ICE_CAVERN_ICICLE) +RANDO_ENUM_ITEM(RHT_GERUDO_TRAINING_GROUND_ICICLE) +RANDO_ENUM_ITEM(RHT_GANONS_CASTLE_ICICLE) +// RED ICE +RANDO_ENUM_ITEM(RHT_RED_ICE_ZORAS_DOMAIN) +RANDO_ENUM_ITEM(RHT_GERUDO_TRAINING_GROUND_RED_ICE) +RANDO_ENUM_ITEM(RHT_ICE_CAVERN_RED_ICE) +RANDO_ENUM_ITEM(RHT_GANONS_CASTLE_RED_ICE) // MAX RANDO_ENUM_ITEM(RHT_MAX) RANDO_ENUM_END(RandomizerHintTextKey) diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerInf.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerInf.h index e21bcbb1a..803313f6a 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerInf.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerInf.h @@ -2436,6 +2436,201 @@ RANDO_ENUM_ITEM(RAND_INF_KAK_BEGGAR_BUGS) RANDO_ENUM_ITEM(RAND_INF_KAK_BEGGAR_FISH) RANDO_ENUM_ITEM(RAND_INF_KAK_BEGGAR_BLUE_FIRE) +// Vanilla Icicles +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_ENTRANCE_LEFT_STALAGMITE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_ENTRANCE_MIDDLE_STALAGMITE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_ENTRANCE_RIGHT_STALAGMITE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_ENTRANCE_STALACTITE_1) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_ENTRANCE_STALACTITE_2) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_LOBBY_STALACTITE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_LOBBY_LEFT_STALAGMITE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_LOBBY_MIDDLE_STALAGMITE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_LOBBY_RIGHT_STALAGMITE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_AFTER_LOBBY_STALACTITE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_AFTER_LOBBY_LEFT_STALAGMITE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_AFTER_LOBBY_CENTER_LEFT_STALAGMITE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_AFTER_LOBBY_CENTER_RIGHT_STALAGMITE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_AFTER_LOBBY_RIGHT_STALAGMITE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_SPINNING_BLADE_LEFT_STALAGMITE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_SPINNING_BLADE_MIDDLE_STALAGMITE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_SPINNING_BLADE_RIGHT_STALAGMITE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MAP_HALLWAY_STALACTITE_1) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MAP_HALLWAY_STALACTITE_2) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MAP_HALLWAY_STALACTITE_3) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MAP_HALLWAY_STALACTITE_4) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MAP_HALLWAY_STALACTITE_5) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MAP_HALLWAY_LEFT_STALAGMITE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MAP_HALLWAY_MIDDLE_STALAGMITE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MAP_HALLWAY_RIGHT_STALAGMITE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_1) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_2) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_3) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_4) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALACTITE_5) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALACTITE_1) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALACTITE_2) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_1) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_2) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_3) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_4) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_5) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CENTER_STALAGMITE_6) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALAGMITE_1) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALAGMITE_2) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_LEFT_STALAGMITE_3) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_1) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_2) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_3) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_RIGHT_STALAGMITE_4) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_PUSH_BLOCK_HALL_LEFT_STALAGMITE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_PUSH_BLOCK_HALL_CENTER_LEFT_STALAGMITE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_PUSH_BLOCK_HALL_CENTER_STALAGMITE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_PUSH_BLOCK_HALL_CENTER_RIGHT_STALAGMITE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_PUSH_BLOCK_HALL_RIGHT_STALAGMITE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_PUSH_BLOCK_HALL_STALACTITE_1) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_PUSH_BLOCK_HALL_STALACTITE_2) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_PUSH_BLOCK_HALL_STALACTITE_3) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_NEAR_END_STALACTITE_1) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_NEAR_END_STALACTITE_2) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_NEAR_END_STALACTITE_3) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_NEAR_END_STALACTITE_4) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_NEAR_END_STALAGMITE_1) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_NEAR_END_STALAGMITE_2) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_NEAR_END_STALAGMITE_3) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_NEAR_END_STALAGMITE_4) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_NEAR_END_STALAGMITE_5) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_NEAR_END_STALAGMITE_6) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_NEAR_END_STALAGMITE_7) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_NEAR_END_STALAGMITE_8) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_1) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_2) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_3) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_4) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_5) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_6) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_7) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_8) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_9) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALAGMITE_10) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_LEFT_STALAGMITE_1) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_LEFT_STALAGMITE_2) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_RIGHT_STALAGMITE_1) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_RIGHT_STALAGMITE_2) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_1) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_2) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_3) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_4) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_5) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_6) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_7) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_8) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_9) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_10) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_STALACTITE_11) +// MQ Icicles +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_ENTRANCE_STALAGMITE_1) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_ENTRANCE_STALAGMITE_2) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_LOBBY_STALACTITE_1) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_LOBBY_STALACTITE_2) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_1) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_2) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_3) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_4) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_AFTER_LOBBY_STALAGMITE_5) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_HUB_STALAGMITE_1) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_HUB_STALAGMITE_2) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_HUB_STALAGMITE_3) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_HUB_STALAGMITE_4) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_HUB_STALAGMITE_5) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_LEFT_STALAGMITE_1) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_LEFT_STALAGMITE_2) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_1) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_2) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_3) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_4) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_5) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_6) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_MAP_ROOM_CENTER_STALAGMITE_7) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_COMPASS_LEFT_STALAGMITE_1) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_COMPASS_LEFT_STALAGMITE_2) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_COMPASS_RIGHT_STALAGMITE_1) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_COMPASS_RIGHT_STALAGMITE_2) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_BEFORE_SCARECROW_STALAGMITE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_SCARECROW_ROOM_STALACTITE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_WEST_CORRIDOR_STALACTITE_1) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_WEST_CORRIDOR_STALACTITE_2) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_WEST_CORRIDOR_STALACTITE_3) +RANDO_ENUM_ITEM(RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_1) +RANDO_ENUM_ITEM(RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_2) +RANDO_ENUM_ITEM(RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_3) +RANDO_ENUM_ITEM(RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_4) +RANDO_ENUM_ITEM(RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_STALAGMITE_5) +RANDO_ENUM_ITEM(RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_1) +RANDO_ENUM_ITEM(RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_2) +RANDO_ENUM_ITEM(RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_3) +RANDO_ENUM_ITEM(RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_RIGHT_STALACTITE_4) +RANDO_ENUM_ITEM(RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_LEFT_STALACTITE) +RANDO_ENUM_ITEM(RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_TOP_RIGHT_STALACTITE_1) +RANDO_ENUM_ITEM(RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_TOP_RIGHT_STALACTITE_2) +RANDO_ENUM_ITEM(RAND_INF_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM_TOP_RIGHT_STALACTITE_3) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALACTITE_1) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALACTITE_2) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALACTITE_3) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALACTITE_1) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALACTITE_2) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALACTITE_3) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_1) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_2) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_3) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_LEFT_STALAGMITE_4) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_1) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_2) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_3) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_RIGHT_STALAGMITE_4) +// Red Ice +RANDO_ENUM_ITEM(RAND_INF_ZD_KING_ZORA_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_ZD_ZORA_SHOP_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_ENTRANCE_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_LOBBY_LEFT_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_LOBBY_RIGHT_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_SPINNING_BLADE_EAST_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_SPINNING_BLADE_WEST_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_FREESTANDING_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_HEART_PIECE_ROOM_CHEST_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MAP_ROOM_POT_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MAP_ROOM_CHEST_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_SILVER_RUPEE_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_NEAR_END_LEFT_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_NEAR_END_MIDDLE_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_NEAR_END_RIGHT_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_DOOR_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_WATER_TRIAL_RUSTED_SWITCH_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_HUB_WEST_LEFT_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_HUB_WEST_MIDDLE_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_HUB_WEST_RIGHT_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_HUB_LEDGE_LEFT_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_HUB_LEDGE_MIDDLE_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_HUB_LEDGE_RIGHT_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_COMPASS_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_MAP_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_SCARECROW_LEFT_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_SCARECROW_MIDDLE_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_ICE_CAVERN_MQ_SCARECROW_RIGHT_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_LEFT_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_RIGHT_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_BACK_LEFT_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_1) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_2) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_3) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_FIRST_ROOM_DOOR_RED_ICE_4) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_SILVER_RUPEE_RED_ICE) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_1) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_2) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_3) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_4) +RANDO_ENUM_ITEM(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_SECOND_DOOR_RED_ICE_5) + RANDO_ENUM_ITEM(RAND_INF_MAX) RANDO_ENUM_END(RandomizerInf) diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerMiscEnums.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerMiscEnums.h index bd5f53930..3079132fc 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerMiscEnums.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerMiscEnums.h @@ -133,6 +133,8 @@ RANDO_ENUM_ITEM(RCTYPE_BUTTERFLY_FAIRY) // Fairies from Butterflies RANDO_ENUM_ITEM(RCTYPE_GRASS) // Grass RANDO_ENUM_ITEM(RCTYPE_SIGN) // Signs RANDO_ENUM_ITEM(RCTYPE_BEGGAR) // Beggar +RANDO_ENUM_ITEM(RCTYPE_ICICLE) // Icicles +RANDO_ENUM_ITEM(RCTYPE_RED_ICE) // Red Ice RANDO_ENUM_END(RandomizerCheckType) RANDO_ENUM_BEGIN(RandomizerCheckQuest) diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerRegion.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerRegion.h index 0697bd82e..9cf279b1e 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerRegion.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerRegion.h @@ -945,6 +945,7 @@ RANDO_ENUM_ITEM(RR_ICE_CAVERN_MAP_ROOM) RANDO_ENUM_ITEM(RR_ICE_CAVERN_COMPASS_ROOM) RANDO_ENUM_ITEM(RR_ICE_CAVERN_BLOCK_ROOM) RANDO_ENUM_ITEM(RR_ICE_CAVERN_BLOCK_ROOM_BLUE_FIRE) +RANDO_ENUM_ITEM(RR_ICE_CAVERN_AFTER_BLOCK_ROOM) RANDO_ENUM_ITEM(RR_ICE_CAVERN_BEFORE_FINAL_ROOM) RANDO_ENUM_ITEM(RR_ICE_CAVERN_FINAL_ROOM) RANDO_ENUM_ITEM(RR_ICE_CAVERN_FINAL_ROOM_UNDERWATER) @@ -987,6 +988,7 @@ RANDO_ENUM_ITEM(RR_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM) RANDO_ENUM_ITEM(RR_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM) RANDO_ENUM_ITEM(RR_GERUDO_TRAINING_GROUND_MQ_BEHIND_BLOCK) RANDO_ENUM_ITEM(RR_GERUDO_TRAINING_GROUND_MQ_ROOM_BEHIND_BLOCK) +RANDO_ENUM_ITEM(RR_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM_ALCOVE) RANDO_ENUM_ITEM(RR_GERUDO_TRAINING_GROUND_MQ_STATUE_ROOM_LEDGE) RANDO_ENUM_ITEM(RR_GERUDO_TRAINING_GROUND_MQ_MAGENTA_FIRE_ROOM) RANDO_ENUM_ITEM(RR_GERUDO_TRAINING_GROUND_MQ_STATUE_ROOM) @@ -1016,6 +1018,7 @@ RANDO_ENUM_ITEM(RR_GANONS_CASTLE_FIRE_TRIAL_FINAL_ROOM) RANDO_ENUM_ITEM(RR_GANONS_CASTLE_WATER_TRIAL_BLUE_FIRE_ROOM) RANDO_ENUM_ITEM(RR_GANONS_CASTLE_WATER_TRIAL_BLUE_FIRE_ROOM_END) RANDO_ENUM_ITEM(RR_GANONS_CASTLE_WATER_TRIAL_BLOCK_ROOM) +RANDO_ENUM_ITEM(RR_GANONS_CASTLE_WATER_TRIAL_BLOCK_ROOM_SWITCH) RANDO_ENUM_ITEM(RR_GANONS_CASTLE_WATER_TRIAL_BLOCK_ROOM_END) RANDO_ENUM_ITEM(RR_GANONS_CASTLE_WATER_TRIAL_FINAL_ROOM) RANDO_ENUM_ITEM(RR_GANONS_CASTLE_SHADOW_TRIAL_START) diff --git a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerSettingKey.h b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerSettingKey.h index 663208650..5e1dc80f3 100644 --- a/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerSettingKey.h +++ b/soh/soh/Enhancements/randomizer/randomizerEnums/RandomizerSettingKey.h @@ -248,6 +248,8 @@ RANDO_ENUM_ITEM(RSK_LOCK_OVERWORLD_DOORS) RANDO_ENUM_ITEM(RSK_SHUFFLE_GRASS) RANDO_ENUM_ITEM(RSK_SHUFFLE_SIGNS) RANDO_ENUM_ITEM(RSK_ROCS_FEATHER) +RANDO_ENUM_ITEM(RSK_SHUFFLE_ICICLES) +RANDO_ENUM_ITEM(RSK_SHUFFLE_RED_ICE) RANDO_ENUM_ITEM(RSK_MAX) RANDO_ENUM_END(RandomizerSettingKey) diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp index 973db5993..fb9ba56b9 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp @@ -203,6 +203,10 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() { CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleSigns"), RO_GENERIC_NO)) && (location.GetRCType() != RCTYPE_WONDER_ITEM || CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleWonderItems"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_ICICLE || + CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleIcicles"), RO_GENERIC_NO)) && + (location.GetRCType() != RCTYPE_RED_ICE || + CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleRedIce"), RO_GENERIC_NO)) && (location.GetRCType() != RCTYPE_FISH || ctx->GetFishsanity()->GetFishLocationIncluded(&location, FSO_SOURCE_CVARS)) && (location.GetRCType() != RCTYPE_ADULT_TRADE || diff --git a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp index 3efe70ad6..e42a399bc 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_check_tracker.cpp @@ -84,6 +84,8 @@ bool showDungeonSigns; bool showOverworldWonderItems; bool showDungeonWonderItems; bool showBeggar; +bool showIcicles; +bool showRedIce; bool showFrogSongRupees; bool showFountainFairies; bool showStoneFairies; @@ -1514,6 +1516,8 @@ void LoadSettings() { break; } showBeggar = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_BEGGAR); + showIcicles = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_ICICLES); + showRedIce = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_RED_ICE); } else { // Vanilla showOverworldTokens = true; showDungeonTokens = true; @@ -1530,6 +1534,8 @@ void LoadSettings() { showOverworldWonderItems = false; showDungeonWonderItems = false; showBeggar = false; + showIcicles = false; + showRedIce = false; } fortressFast = false; @@ -1654,6 +1660,8 @@ bool IsCheckShuffled(RandomizerCheck rc) { (loc->GetRCType() != RCTYPE_WONDER_ITEM || (showOverworldWonderItems && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || (showDungeonWonderItems && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && + (loc->GetRCType() != RCTYPE_ICICLE || showIcicles) && + (loc->GetRCType() != RCTYPE_RED_ICE || showRedIce) && (loc->GetRCType() != RCTYPE_FISH || OTRGlobals::Instance->gRandoContext->GetFishsanity()->GetFishLocationIncluded(loc)) && (loc->GetRCType() != RCTYPE_FREESTANDING || diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 8a11877f3..3b69fd14d 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -841,6 +841,8 @@ void Settings::CreateOptions() { OPT_U8(RSK_SHUFFLE_CRATES, "Shuffle Crates", {"Off", "Dungeons", "Overworld", "All Crates"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleCrates"), mOptionDescriptions[RSK_SHUFFLE_CRATES], WIDGET_CVAR_COMBOBOX, RO_SHUFFLE_CRATES_OFF); OPT_BOOL(RSK_SHUFFLE_TREES, "Shuffle Trees", CVAR_RANDOMIZER_SETTING("ShuffleTrees"), mOptionDescriptions[RSK_SHUFFLE_TREES]); OPT_BOOL(RSK_SHUFFLE_BUSHES, "Shuffle Bushes", CVAR_RANDOMIZER_SETTING("ShuffleBushes"), mOptionDescriptions[RSK_SHUFFLE_BUSHES]); + OPT_BOOL(RSK_SHUFFLE_ICICLES, "Shuffle Icicles", CVAR_RANDOMIZER_SETTING("ShuffleIcicles"), mOptionDescriptions[RSK_SHUFFLE_ICICLES]); + OPT_BOOL(RSK_SHUFFLE_RED_ICE, "Shuffle Red Ice", CVAR_RANDOMIZER_SETTING("ShuffleRedIce"), mOptionDescriptions[RSK_SHUFFLE_RED_ICE]); OPT_U8(RSK_SHUFFLE_SIGNS, "Shuffle Signs", {"Off", "Dungeons", "Overworld", "All Signs"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleSigns"), mOptionDescriptions[RSK_SHUFFLE_SIGNS], WIDGET_CVAR_COMBOBOX, RO_SHUFFLE_SIGNS_OFF); OPT_BOOL(RSK_SHUFFLE_FISHING_POLE, "Shuffle Fishing Pole", CVAR_RANDOMIZER_SETTING("ShuffleFishingPole"), mOptionDescriptions[RSK_SHUFFLE_FISHING_POLE]); OPT_CALLBACK(RSK_SHUFFLE_FISHING_POLE, { @@ -1862,6 +1864,8 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_CRATES], &mOptions[RSK_SHUFFLE_TREES], &mOptions[RSK_SHUFFLE_BUSHES], + &mOptions[RSK_SHUFFLE_ICICLES], + &mOptions[RSK_SHUFFLE_RED_ICE], &mOptions[RSK_SHUFFLE_SIGNS], &mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES], &mOptions[RSK_SHUFFLE_ADULT_TRADE], @@ -2145,6 +2149,8 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_CRATES], &mOptions[RSK_SHUFFLE_TREES], &mOptions[RSK_SHUFFLE_BUSHES], + &mOptions[RSK_SHUFFLE_ICICLES], + &mOptions[RSK_SHUFFLE_RED_ICE], &mOptions[RSK_SHUFFLE_SIGNS], &mOptions[RSK_SHUFFLE_KOKIRI_SWORD], &mOptions[RSK_SHUFFLE_OCARINA], diff --git a/soh/soh/Enhancements/randomizer/static_data.h b/soh/soh/Enhancements/randomizer/static_data.h index 91a9ba64f..c210385d3 100644 --- a/soh/soh/Enhancements/randomizer/static_data.h +++ b/soh/soh/Enhancements/randomizer/static_data.h @@ -65,6 +65,8 @@ class StaticData { static void RegisterSignLocations(); static void RegisterWonderItemLocations(); static void RegisterBeggarLocations(); + static void RegisterIcicleLocations(); + static void RegisterRedIceLocations(); static void InitHashMaps(); static std::array, 17> randomizerFishingPondFish; static std::unordered_map randomizerGrottoFishMap; diff --git a/soh/src/overlays/actors/ovl_Bg_Ice_Shelter/z_bg_ice_shelter.c b/soh/src/overlays/actors/ovl_Bg_Ice_Shelter/z_bg_ice_shelter.c index 8b45ab148..0ce95602a 100644 --- a/soh/src/overlays/actors/ovl_Bg_Ice_Shelter/z_bg_ice_shelter.c +++ b/soh/src/overlays/actors/ovl_Bg_Ice_Shelter/z_bg_ice_shelter.c @@ -170,7 +170,9 @@ void BgIceShelter_Init(Actor* thisx, PlayState* play) { this->dyna.actor.colChkInfo.mass = MASS_IMMOVABLE; - if (!((this->dyna.actor.params >> 6) & 1) && (Flags_GetSwitch(play, this->dyna.actor.params & 0x3F))) { + if (GameInteractor_Should( + VB_RED_ICE_MELTED_FLAG, + !((this->dyna.actor.params >> 6) & 1) && (Flags_GetSwitch(play, this->dyna.actor.params & 0x3F)), this)) { Actor_Kill(&this->dyna.actor); return; } @@ -414,7 +416,7 @@ void BgIceShelter_Melt(BgIceShelter* this, PlayState* play) { sSteamSpawnFuncs[type](this, play, particleSpawningChance, sSteamEffectScales[type]); - if (this->alpha <= 0) { + if (GameInteractor_Should(VB_RED_ICE_DROP_ITEM, this->alpha <= 0, this)) { if (!((this->dyna.actor.params >> 6) & 1)) { Flags_SetSwitch(play, this->dyna.actor.params & 0x3F); } diff --git a/soh/src/overlays/actors/ovl_Bg_Ice_Turara/z_bg_ice_turara.c b/soh/src/overlays/actors/ovl_Bg_Ice_Turara/z_bg_ice_turara.c index db45bca9a..efcbe4d43 100644 --- a/soh/src/overlays/actors/ovl_Bg_Ice_Turara/z_bg_ice_turara.c +++ b/soh/src/overlays/actors/ovl_Bg_Ice_Turara/z_bg_ice_turara.c @@ -6,6 +6,7 @@ #include "z_bg_ice_turara.h" #include "objects/object_ice_objects/object_ice_objects.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #define FLAGS 0 @@ -114,7 +115,7 @@ void BgIceTurara_Break(BgIceTurara* this, PlayState* play, f32 arg2) { } void BgIceTurara_Stalagmite(BgIceTurara* this, PlayState* play) { - if (this->collider.base.acFlags & AC_HIT) { + if (GameInteractor_Should(VB_STALAGMITE_DROP_ITEM, this->collider.base.acFlags & AC_HIT, this)) { BgIceTurara_Break(this, play, 50.0f); Actor_Kill(&this->dyna.actor); return; @@ -165,7 +166,7 @@ void BgIceTurara_Fall(BgIceTurara* this, PlayState* play) { this->dyna.actor.world.pos.y = this->dyna.actor.floorHeight; } BgIceTurara_Break(this, play, 40.0f); - if (this->dyna.actor.params == TURARA_STALACTITE_REGROW) { + if (GameInteractor_Should(VB_STALACTITE_DROP_ITEM, this->dyna.actor.params == TURARA_STALACTITE_REGROW, this)) { this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y + 120.0f; func_8003EC50(play, &play->colCtx.dyna, this->dyna.bgId); this->actionFunc = BgIceTurara_Regrow; @@ -198,4 +199,5 @@ void BgIceTurara_Update(Actor* thisx, PlayState* play) { void BgIceTurara_Draw(Actor* thisx, PlayState* play) { Gfx_DrawDListOpa(play, object_ice_objects_DL_0023D0); + if (GameInteractor_Should(VB_ICICLE_SETUP_DRAW, true, thisx)) {} }