[Rando] Shuffle Icicles and Red Ice (#6462)

Separate options for Icicles (stalagmites and stalactites) and Red Ice. Icicles drop an item when broken and red ice gives an item when melted.

CMC options for icicles were more limited - the particle effect strobes because there are too many icicles in certain rooms. This currently uses Dampe's halo centered around the tips, which are visible for both types, but model replacement could be used here if a set was made.
This commit is contained in:
A Green Spoon 2026-04-08 15:02:33 +09:00 committed by GitHub
parent 67191665df
commit 49e740b6f2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
27 changed files with 1616 additions and 71 deletions

View file

@ -1267,6 +1267,14 @@ typedef enum {
// - None // - None
VB_HEARTS_INCREASE_WITH_CONTAINERS, VB_HEARTS_INCREASE_WITH_CONTAINERS,
// #### `result`
// ```c
// true
// ```
// #### `args`
// - `*BgIceTurara`
VB_ICICLE_SETUP_DRAW,
// #### `result` // #### `result`
// ```c // ```c
// (respawnFlag == 1) || (respawnFlag == -1) // (respawnFlag == 1) || (respawnFlag == -1)
@ -1943,6 +1951,22 @@ typedef enum {
// - `*EnRd` // - `*EnRd`
VB_REDEAD_GIBDO_FREEZE_LINK, 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`
// #### `result` // #### `result`
// ```c // ```c
@ -2263,6 +2287,22 @@ typedef enum {
// - None // - None
VB_SPEAK, 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` // #### `result`
// ```c // ```c
// varies, never set should to true // varies, never set should to true

View file

@ -1865,6 +1865,14 @@ void StaticData::HintTable_Init_Exclude_Dungeon() {
/*french*/ "Selon moi, #appeler la pluie près de lentrée dune grotte gelée# révèle #[[1]]#.", {QM_RED, QM_GREEN})); /*french*/ "Selon moi, #appeler la pluie près de lentrée dune grotte gelée# révèle #[[1]]#.", {QM_RED, QM_GREEN}));
// /*spanish*/ Según dicen, una #Skulltula tras un ardiente hielo# otorga #[[1]]#. // /*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 | | 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.", /*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})); /*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 | | 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.", /*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})); /*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 // clang-format on
} }
} // namespace Rando } // namespace Rando

View file

@ -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]]#.", 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.", /*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})); /*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 // clang-format on
} }
} // namespace Rando } // namespace Rando

View file

@ -217,6 +217,8 @@ void Context::GenerateLocationPool() {
(location.GetRCType() == RCTYPE_NLTREE && (location.GetRCType() == RCTYPE_NLTREE &&
(!mOptions[RSK_SHUFFLE_TREES] || mOptions[RSK_LOGIC_RULES].IsNot(RO_LOGIC_NO_LOGIC))) || (!mOptions[RSK_SHUFFLE_TREES] || mOptions[RSK_LOGIC_RULES].IsNot(RO_LOGIC_NO_LOGIC))) ||
(location.GetRCType() == RCTYPE_BUSH && !mOptions[RSK_SHUFFLE_BUSHES]) || (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_SIGN && mOptions[RSK_SHUFFLE_SIGNS].Is(RO_SHUFFLE_SIGNS_OFF)) ||
(location.GetRCType() == RCTYPE_WONDER_ITEM && (location.GetRCType() == RCTYPE_WONDER_ITEM &&
mOptions[RSK_SHUFFLE_WONDER_ITEMS].Is(RO_SHUFFLE_WONDER_ITEMS_OFF)) || mOptions[RSK_SHUFFLE_WONDER_ITEMS].Is(RO_SHUFFLE_WONDER_ITEMS_OFF)) ||

View file

@ -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<StalactiteDropped> 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<StalactiteDropped>(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<CheckIdentity>(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<CheckIdentity>(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<CheckIdentity>(&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<int16_t>(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<Actor*>(actorRef);
BgIceTurara* icicleActor = static_cast<BgIceTurara*>(actorRef);
auto icicleIdentity = OTRGlobals::Instance->gRandomizer->IdentifyIcicle(
gPlayState->sceneNum, (s16)actor->world.pos.x, (s16)actor->world.pos.z);
ObjectExtension::GetInstance().Set<CheckIdentity>(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<StalactiteDropped>(&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<StalactiteDropped>(&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<StalactiteDropped>(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);

View file

@ -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<CheckIdentity>(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<CheckIdentity>(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<CheckIdentity>(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<int16_t>(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<CheckIdentity>(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);

View file

@ -663,4 +663,20 @@ Rando::Location Rando::Location::Sign(RandomizerCheck rc, RandomizerCheckQuest q
SpoilerCollectionCheck collectionCheck) { SpoilerCollectionCheck collectionCheck) {
return { rc, quest_, RCTYPE_SIGN, area_, actorId, scene_, actorParams_, std::move(shortName_), return { rc, quest_, RCTYPE_SIGN, area_, actorId, scene_, actorParams_, std::move(shortName_),
hintKey, RG_NONE, false, collectionCheck }; 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 };
} }

View file

@ -266,6 +266,14 @@ class Location {
RandomizerHintTextKey hintKey, RandomizerGet vanillaItem, RandomizerHintTextKey hintKey, RandomizerGet vanillaItem,
SpoilerCollectionCheck collectionCheck); 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_, static Location OtherHint(RandomizerCheck rc, RandomizerCheckQuest quest_, RandomizerCheckArea area_,
ActorID actorId_, SceneID scene_, std::string&& shortName_, std::string&& spoilerName_); ActorID actorId_, SceneID scene_, std::string&& shortName_, std::string&& spoilerName_);

View file

@ -154,8 +154,34 @@ void RegionTable_Init_GanonsCastle() {
EVENT_ACCESS(LOGIC_BLUE_FIRE_ACCESS, logic->CanClearStalagmite() || ctx->GetTrickOption(RT_ICE_STALAGMITE_CLIP)), EVENT_ACCESS(LOGIC_BLUE_FIRE_ACCESS, logic->CanClearStalagmite() || ctx->GetTrickOption(RT_ICE_STALAGMITE_CLIP)),
}, { }, {
//Locations //Locations
LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_LEFT_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_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 //Exits
ENTRANCE(RR_GANONS_CASTLE_MAIN, true), 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, { areaTable[RR_GANONS_CASTLE_WATER_TRIAL_BLOCK_ROOM] = Region("Ganon's Castle Water Trial Block Room", SCENE_INSIDE_GANONS_CASTLE, {
//Events //Events
EVENT_ACCESS(LOGIC_FAIRY_ACCESS, logic->CanBreakPots()), 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 //Locations
LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_POT_3, logic->CanBreakPots()), LOCATION(RC_GANONS_CASTLE_WATER_TRIAL_POT_3, logic->CanBreakPots()),
}, { }, {
//Exits //Exits
ENTRANCE(RR_GANONS_CASTLE_WATER_TRIAL_BLUE_FIRE_ROOM, true), 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_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, {}, {}, { 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 EVENT_ACCESS(LOGIC_BLUE_FIRE_ACCESS, logic->CanJumpslash() || logic->HasExplosives()), // bow can also hit at right angle
}, { }, {
//Locations //Locations
LOCATION(RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, logic->BlueFire() && logic->HasItem(RG_OPEN_CHEST)), 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_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 //Exits
ENTRANCE(RR_GANONS_CASTLE_MQ_MAIN, true), 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, { areaTable[RR_GANONS_CASTLE_MQ_WATER_TRIAL_BLOCK_ROOM] = Region("Ganon's Castle MQ Water Trial Block Room", SCENE_INSIDE_GANONS_CASTLE, {
//Events //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_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 //Exits
ENTRANCE(RR_GANONS_CASTLE_MQ_WATER_TRIAL_GEYSER_ROOM, logic->SmallKeys(SCENE_INSIDE_GANONS_CASTLE, 3)), 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, { 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()), 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_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)), ENTRANCE(RR_GANONS_CASTLE_MQ_WATER_TRIAL_FINAL_ROOM, logic->Get(LOGIC_WATER_TRIAL_MQ_SILVER_RUPEES)),
}); });

View file

@ -245,7 +245,22 @@ void RegionTable_Init_GerudoTrainingGround() {
ENTRANCE(RR_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM, AnyAgeTime([]{return logic->CanKillEnemy(RE_IRON_KNUCKLE);})), 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 //Exits
ENTRANCE(RR_GERUDO_TRAINING_GROUND_MQ_SAND_ROOM, true), 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));})), 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)), 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 //Exits
ENTRANCE(RR_GERUDO_TRAINING_GROUND_MQ_BOULDER_ROOM, true), 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_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_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, {}, {}, { 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), 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, {}, { areaTable[RR_GERUDO_TRAINING_GROUND_MQ_STATUE_ROOM_LEDGE] = Region("Gerudo Training Ground MQ Statue Room Ledge", SCENE_GERUDO_TRAINING_GROUND, {}, {
//Locations //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 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 //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 //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_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_STATUE_ROOM, true),
}); });
areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAGENTA_FIRE_ROOM] = Region("Gerudo Training Ground MQ Magenta Fire Room", SCENE_GERUDO_TRAINING_GROUND, {}, { areaTable[RR_GERUDO_TRAINING_GROUND_MQ_MAGENTA_FIRE_ROOM] = Region("Gerudo Training Ground MQ Magenta Fire Room", SCENE_GERUDO_TRAINING_GROUND, {}, {

View file

@ -18,8 +18,20 @@ void RegionTable_Init_IceCavern() {
areaTable[RR_ICE_CAVERN_BEGINNING] = Region("Ice Cavern Beginning", SCENE_ICE_CAVERN, {}, { areaTable[RR_ICE_CAVERN_BEGINNING] = Region("Ice Cavern Beginning", SCENE_ICE_CAVERN, {}, {
//Locations //Locations
LOCATION(RC_ICE_CAVERN_ENTRANCE_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), 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_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 //Exits
ENTRANCE(RR_ICE_CAVERN_ENTRYWAY, true), 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, {}, { areaTable[RR_ICE_CAVERN_HUB] = Region("Ice Cavern Hub", SCENE_ICE_CAVERN, {}, {
//Locations //Locations
LOCATION(RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, logic->HookshotOrBoomerang()), 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_1, logic->CanBreakPots()),
LOCATION(RC_ICE_CAVERN_HALL_POT_2, 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_1, logic->CanBreakPots()),
LOCATION(RC_ICE_CAVERN_SPINNING_BLADE_POT_2, 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_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 //Exits
ENTRANCE(RR_ICE_CAVERN_BEGINNING, true), ENTRANCE(RR_ICE_CAVERN_BEGINNING, true),
@ -49,14 +71,24 @@ void RegionTable_Init_IceCavern() {
EVENT_ACCESS(LOGIC_BLUE_FIRE_ACCESS, true), EVENT_ACCESS(LOGIC_BLUE_FIRE_ACCESS, true),
}, { }, {
//Locations //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 // 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() || LOCATION(RC_ICE_CAVERN_FROZEN_POT_1, (logic->CanBreakPots() && logic->BlueFire()) || logic->HasExplosives() ||
(ctx->GetTrickOption(RT_VISIBLE_COLLISION) && logic->CanJumpslash()) || (ctx->GetTrickOption(RT_VISIBLE_COLLISION) && logic->CanJumpslash()) ||
(ctx->GetTrickOption(RT_ITEM_EXTENSION) && logic->CanUse(RG_HOOKSHOT))), (ctx->GetTrickOption(RT_ITEM_EXTENSION) && logic->CanUse(RG_HOOKSHOT))),
LOCATION(RC_ICE_CAVERN_MAP_ROOM_LEFT_HEART, true), LOCATION(RC_ICE_CAVERN_MAP_ROOM_LEFT_HEART, true),
LOCATION(RC_ICE_CAVERN_MAP_ROOM_MIDDLE_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_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 //Exits
ENTRANCE(RR_ICE_CAVERN_HUB, true), ENTRANCE(RR_ICE_CAVERN_HUB, true),
@ -67,9 +99,31 @@ void RegionTable_Init_IceCavern() {
EVENT_ACCESS(LOGIC_BLUE_FIRE_ACCESS, true), EVENT_ACCESS(LOGIC_BLUE_FIRE_ACCESS, true),
}, { }, {
//Locations //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_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_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_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 //Exits
ENTRANCE(RR_ICE_CAVERN_HUB, true), 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, {}, { areaTable[RR_ICE_CAVERN_BLOCK_ROOM] = Region("Ice Cavern Block Room", SCENE_ICE_CAVERN, {}, {
//Locations //Locations
// trick involves backflip, could be merged into general trick // 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_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_1, logic->CanUse(RG_BOOMERANG)),
LOCATION(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, 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_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 //Exits
ENTRANCE(RR_ICE_CAVERN_HUB, logic->CanClearStalagmite() || ctx->GetTrickOption(RT_ICE_STALAGMITE_CLIP)), 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_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, { 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), 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 // 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, {}, { areaTable[RR_ICE_CAVERN_BEFORE_FINAL_ROOM] = Region("Ice Cavern Before Final Room", SCENE_ICE_CAVERN, {}, {
//Locations //Locations
//Assumes RR_ICE_CAVERN_BLOCK_ROOM access LOCATION(RC_ICE_CAVERN_NEAR_END_POT_1, logic->CanBreakPots() && logic->BlueFire()),
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_2, logic->CanBreakPots() && logic->BlueFire()),
LOCATION(RC_ICE_CAVERN_NEAR_END_POT_1, logic->CanBreakPots() && logic->BlueFire()), LOCATION(RC_ICE_CAVERN_NEAR_END_LEFT_RED_ICE, logic->BlueFire()),
LOCATION(RC_ICE_CAVERN_NEAR_END_POT_2, logic->CanBreakPots() && 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 //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), 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, {}, { areaTable[RR_ICE_CAVERN_MQ_BEGINNING] = Region("Ice Cavern MQ Beginning", SCENE_ICE_CAVERN, {}, {
//Locations //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 //Exits
ENTRANCE(RR_ICE_CAVERN_ENTRYWAY, true), ENTRANCE(RR_ICE_CAVERN_ENTRYWAY, true),
@ -156,12 +245,28 @@ void RegionTable_Init_IceCavern() {
EVENT_ACCESS(LOGIC_FAIRY_ACCESS, logic->CanBreakPots()), EVENT_ACCESS(LOGIC_FAIRY_ACCESS, logic->CanBreakPots()),
}, { }, {
//Locations //Locations
LOCATION(RC_ICE_CAVERN_MQ_FIRST_CRYSTAL_POT_1, 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_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_1, logic->CanBreakPots()),
LOCATION(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_2, 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_3, logic->CanBreakPots()),
LOCATION(RC_ICE_CAVERN_MQ_EARLY_WOLFOS_POT_4, 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 //Exits
ENTRANCE(RR_ICE_CAVERN_MQ_MAP_ROOM, AnyAgeTime([]{return logic->CanKillEnemy(RE_WHITE_WOLFOS) && logic->CanKillEnemy(RE_FREEZARD);})), 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)), EVENT_ACCESS(LOGIC_BLUE_FIRE_ACCESS, logic->IsChild || logic->CanClearStalagmite() || ctx->GetTrickOption(RT_ICE_STALAGMITE_CLIP)),
}, { }, {
//Locations //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, { 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 //Locations
//Implies being able to kill the skull if you hit the switch //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_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_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 //Exits
ENTRANCE(RR_ICE_CAVERN_MQ_HUB, logic->BlueFire()), 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, {}, { areaTable[RR_ICE_CAVERN_MQ_WEST_CORRIDOR] = Region("Ice Cavern MQ West Corridor", SCENE_ICE_CAVERN, {}, {
//Locations //Locations
LOCATION(RC_ICE_CAVERN_MQ_PUSH_BLOCK_POT_1, 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_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 //Exits
ENTRANCE(RR_ICE_CAVERN_MQ_SCARECROW_ROOM, logic->BlueFire()), ENTRANCE(RR_ICE_CAVERN_MQ_SCARECROW_ROOM, logic->BlueFire()),
@ -209,14 +335,20 @@ void RegionTable_Init_IceCavern() {
EVENT_ACCESS(LOGIC_BLUE_FIRE_ACCESS, true), EVENT_ACCESS(LOGIC_BLUE_FIRE_ACCESS, true),
}, { }, {
//Locations //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 //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 //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)) || 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))), (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_1, logic->CanBreakPots()),
LOCATION(RC_ICE_CAVERN_MQ_COMPASS_POT_2, 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, {}, { areaTable[RR_ICE_CAVERN_MQ_STALFOS_ROOM] = Region("Ice Cavern MQ Stalfos Room", SCENE_ICE_CAVERN, {}, {

View file

@ -40,6 +40,8 @@ void RegionTable_Init_ZorasDomain() {
LOCATION(RC_ZD_KING_ZORA_PATH_ARROW_SIGN, logic->CanRead()), 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_RECTANGLE_SIGN, logic->CanRead()),
LOCATION(RC_ZD_NEAR_KING_ZORA_ARROW_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 //Exits
ENTRANCE(RR_ZR_BEHIND_WATERFALL, true), ENTRANCE(RR_ZR_BEHIND_WATERFALL, true),
@ -61,6 +63,7 @@ void RegionTable_Init_ZorasDomain() {
}, { }, {
//Locations //Locations
LOCATION(RC_ZD_BEHIND_KING_ZORA_BEEHIVE, logic->IsChild && logic->CanBreakUpperBeehives()), 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 //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)), 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)),

View file

@ -312,6 +312,12 @@ void Settings::CreateOptionDescriptions() {
"only shuffle with No Logic."; "only shuffle with No Logic.";
mOptionDescriptions[RSK_SHUFFLE_BUSHES] = mOptionDescriptions[RSK_SHUFFLE_BUSHES] =
"Bushes in Hyrule Field & Zora's Fountain will contain randomized items when first walked through."; "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 " mOptionDescriptions[RSK_SHUFFLE_SIGNS] = "Signs and readable pedestals, plinths, altars, and graves will grant a "
"randomized item the first time they are read. " "randomized item the first time they are read. "
"Signs will have a particle effect when they hold a randomized item.\n" "Signs will have a particle effect when they hold a randomized item.\n"

View file

@ -3281,6 +3281,227 @@ std::map<RandomizerCheck, RandomizerInf> rcToRandomizerInf = {
{ RC_KAK_BEGGAR_BUGS, RAND_INF_KAK_BEGGAR_BUGS }, { RC_KAK_BEGGAR_BUGS, RAND_INF_KAK_BEGGAR_BUGS },
{ RC_KAK_BEGGAR_FISH, RAND_INF_KAK_BEGGAR_FISH }, { RC_KAK_BEGGAR_FISH, RAND_INF_KAK_BEGGAR_FISH },
{ RC_KAK_BEGGAR_BLUE_FIRE, RAND_INF_KAK_BEGGAR_BLUE_FIRE }, { 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) { CheckIdentity Randomizer::IdentifyBeehive(s32 sceneNum, s16 xPosition, s32 respawnData) {
@ -3842,6 +4063,55 @@ CheckIdentity Randomizer::IdentifyBeggar(s32 sceneNum, s32 textId) {
return beggarIdentity; 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) { u8 Randomizer::GetRandoSettingValue(RandomizerSettingKey randoSettingKey) {
return Rando::Context::GetInstance()->GetOption(randoSettingKey).Get(); return Rando::Context::GetInstance()->GetOption(randoSettingKey).Get();
} }

View file

@ -46,6 +46,8 @@ class Randomizer {
CheckIdentity IdentifySign(s32 sceneNum, s32 posX, s32 posZ, s32 id); CheckIdentity IdentifySign(s32 sceneNum, s32 posX, s32 posZ, s32 id);
CheckIdentity IdentifyWonderItem(s32 sceneNum, s32 par1, s32 par2); CheckIdentity IdentifyWonderItem(s32 sceneNum, s32 par1, s32 par2);
CheckIdentity IdentifyBeggar(s32 sceneNum, s32 textId); 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, GetItemEntry GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogItemId,
bool checkObtainability = true); bool checkObtainability = true);
GetItemEntry GetItemFromActor(s16 actorId, s16 sceneNum, s16 actorParams, GetItemID ogItemId, GetItemEntry GetItemFromActor(s16 actorId, s16 sceneNum, s16 actorParams, GetItemID ogItemId,

View file

@ -2869,6 +2869,201 @@ RANDO_ENUM_ITEM(RC_KAK_BEGGAR_BUGS)
RANDO_ENUM_ITEM(RC_KAK_BEGGAR_FISH) RANDO_ENUM_ITEM(RC_KAK_BEGGAR_FISH)
RANDO_ENUM_ITEM(RC_KAK_BEGGAR_BLUE_FIRE) 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_ITEM(RC_MAX)
RANDO_ENUM_END(RandomizerCheck) RANDO_ENUM_END(RandomizerCheck)

View file

@ -1609,6 +1609,15 @@ RANDO_ENUM_ITEM(RHT_SIGN_SPIRIT_TEMPLE)
// BEGGAR // BEGGAR
RANDO_ENUM_ITEM(RHT_BEGGAR_MARKET) RANDO_ENUM_ITEM(RHT_BEGGAR_MARKET)
RANDO_ENUM_ITEM(RHT_BEGGAR_KAKARIKO_VILLAGE) 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 // MAX
RANDO_ENUM_ITEM(RHT_MAX) RANDO_ENUM_ITEM(RHT_MAX)
RANDO_ENUM_END(RandomizerHintTextKey) RANDO_ENUM_END(RandomizerHintTextKey)

View file

@ -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_FISH)
RANDO_ENUM_ITEM(RAND_INF_KAK_BEGGAR_BLUE_FIRE) 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_ITEM(RAND_INF_MAX)
RANDO_ENUM_END(RandomizerInf) RANDO_ENUM_END(RandomizerInf)

View file

@ -133,6 +133,8 @@ RANDO_ENUM_ITEM(RCTYPE_BUTTERFLY_FAIRY) // Fairies from Butterflies
RANDO_ENUM_ITEM(RCTYPE_GRASS) // Grass RANDO_ENUM_ITEM(RCTYPE_GRASS) // Grass
RANDO_ENUM_ITEM(RCTYPE_SIGN) // Signs RANDO_ENUM_ITEM(RCTYPE_SIGN) // Signs
RANDO_ENUM_ITEM(RCTYPE_BEGGAR) // Beggar 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_END(RandomizerCheckType)
RANDO_ENUM_BEGIN(RandomizerCheckQuest) RANDO_ENUM_BEGIN(RandomizerCheckQuest)

View file

@ -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_COMPASS_ROOM)
RANDO_ENUM_ITEM(RR_ICE_CAVERN_BLOCK_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_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_BEFORE_FINAL_ROOM)
RANDO_ENUM_ITEM(RR_ICE_CAVERN_FINAL_ROOM) RANDO_ENUM_ITEM(RR_ICE_CAVERN_FINAL_ROOM)
RANDO_ENUM_ITEM(RR_ICE_CAVERN_FINAL_ROOM_UNDERWATER) 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_STALFOS_ROOM)
RANDO_ENUM_ITEM(RR_GERUDO_TRAINING_GROUND_MQ_BEHIND_BLOCK) 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_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_STATUE_ROOM_LEDGE)
RANDO_ENUM_ITEM(RR_GERUDO_TRAINING_GROUND_MQ_MAGENTA_FIRE_ROOM) RANDO_ENUM_ITEM(RR_GERUDO_TRAINING_GROUND_MQ_MAGENTA_FIRE_ROOM)
RANDO_ENUM_ITEM(RR_GERUDO_TRAINING_GROUND_MQ_STATUE_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)
RANDO_ENUM_ITEM(RR_GANONS_CASTLE_WATER_TRIAL_BLUE_FIRE_ROOM_END) 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)
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_BLOCK_ROOM_END)
RANDO_ENUM_ITEM(RR_GANONS_CASTLE_WATER_TRIAL_FINAL_ROOM) RANDO_ENUM_ITEM(RR_GANONS_CASTLE_WATER_TRIAL_FINAL_ROOM)
RANDO_ENUM_ITEM(RR_GANONS_CASTLE_SHADOW_TRIAL_START) RANDO_ENUM_ITEM(RR_GANONS_CASTLE_SHADOW_TRIAL_START)

View file

@ -248,6 +248,8 @@ RANDO_ENUM_ITEM(RSK_LOCK_OVERWORLD_DOORS)
RANDO_ENUM_ITEM(RSK_SHUFFLE_GRASS) RANDO_ENUM_ITEM(RSK_SHUFFLE_GRASS)
RANDO_ENUM_ITEM(RSK_SHUFFLE_SIGNS) RANDO_ENUM_ITEM(RSK_SHUFFLE_SIGNS)
RANDO_ENUM_ITEM(RSK_ROCS_FEATHER) 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_ITEM(RSK_MAX)
RANDO_ENUM_END(RandomizerSettingKey) RANDO_ENUM_END(RandomizerSettingKey)

View file

@ -203,6 +203,10 @@ void RandomizerCheckObjects::UpdateImGuiVisibility() {
CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleSigns"), RO_GENERIC_NO)) && CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleSigns"), RO_GENERIC_NO)) &&
(location.GetRCType() != RCTYPE_WONDER_ITEM || (location.GetRCType() != RCTYPE_WONDER_ITEM ||
CVarGetInteger(CVAR_RANDOMIZER_SETTING("ShuffleWonderItems"), RO_GENERIC_NO)) && 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 || (location.GetRCType() != RCTYPE_FISH ||
ctx->GetFishsanity()->GetFishLocationIncluded(&location, FSO_SOURCE_CVARS)) && ctx->GetFishsanity()->GetFishLocationIncluded(&location, FSO_SOURCE_CVARS)) &&
(location.GetRCType() != RCTYPE_ADULT_TRADE || (location.GetRCType() != RCTYPE_ADULT_TRADE ||

View file

@ -84,6 +84,8 @@ bool showDungeonSigns;
bool showOverworldWonderItems; bool showOverworldWonderItems;
bool showDungeonWonderItems; bool showDungeonWonderItems;
bool showBeggar; bool showBeggar;
bool showIcicles;
bool showRedIce;
bool showFrogSongRupees; bool showFrogSongRupees;
bool showFountainFairies; bool showFountainFairies;
bool showStoneFairies; bool showStoneFairies;
@ -1514,6 +1516,8 @@ void LoadSettings() {
break; break;
} }
showBeggar = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_BEGGAR); 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 } else { // Vanilla
showOverworldTokens = true; showOverworldTokens = true;
showDungeonTokens = true; showDungeonTokens = true;
@ -1530,6 +1534,8 @@ void LoadSettings() {
showOverworldWonderItems = false; showOverworldWonderItems = false;
showDungeonWonderItems = false; showDungeonWonderItems = false;
showBeggar = false; showBeggar = false;
showIcicles = false;
showRedIce = false;
} }
fortressFast = false; fortressFast = false;
@ -1654,6 +1660,8 @@ bool IsCheckShuffled(RandomizerCheck rc) {
(loc->GetRCType() != RCTYPE_WONDER_ITEM || (loc->GetRCType() != RCTYPE_WONDER_ITEM ||
(showOverworldWonderItems && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) || (showOverworldWonderItems && RandomizerCheckObjects::AreaIsOverworld(loc->GetArea())) ||
(showDungeonWonderItems && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) && (showDungeonWonderItems && RandomizerCheckObjects::AreaIsDungeon(loc->GetArea()))) &&
(loc->GetRCType() != RCTYPE_ICICLE || showIcicles) &&
(loc->GetRCType() != RCTYPE_RED_ICE || showRedIce) &&
(loc->GetRCType() != RCTYPE_FISH || (loc->GetRCType() != RCTYPE_FISH ||
OTRGlobals::Instance->gRandoContext->GetFishsanity()->GetFishLocationIncluded(loc)) && OTRGlobals::Instance->gRandoContext->GetFishsanity()->GetFishLocationIncluded(loc)) &&
(loc->GetRCType() != RCTYPE_FREESTANDING || (loc->GetRCType() != RCTYPE_FREESTANDING ||

View file

@ -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_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_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_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_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_BOOL(RSK_SHUFFLE_FISHING_POLE, "Shuffle Fishing Pole", CVAR_RANDOMIZER_SETTING("ShuffleFishingPole"), mOptionDescriptions[RSK_SHUFFLE_FISHING_POLE]);
OPT_CALLBACK(RSK_SHUFFLE_FISHING_POLE, { OPT_CALLBACK(RSK_SHUFFLE_FISHING_POLE, {
@ -1862,6 +1864,8 @@ void Settings::CreateOptions() {
&mOptions[RSK_SHUFFLE_CRATES], &mOptions[RSK_SHUFFLE_CRATES],
&mOptions[RSK_SHUFFLE_TREES], &mOptions[RSK_SHUFFLE_TREES],
&mOptions[RSK_SHUFFLE_BUSHES], &mOptions[RSK_SHUFFLE_BUSHES],
&mOptions[RSK_SHUFFLE_ICICLES],
&mOptions[RSK_SHUFFLE_RED_ICE],
&mOptions[RSK_SHUFFLE_SIGNS], &mOptions[RSK_SHUFFLE_SIGNS],
&mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES], &mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES],
&mOptions[RSK_SHUFFLE_ADULT_TRADE], &mOptions[RSK_SHUFFLE_ADULT_TRADE],
@ -2145,6 +2149,8 @@ void Settings::CreateOptions() {
&mOptions[RSK_SHUFFLE_CRATES], &mOptions[RSK_SHUFFLE_CRATES],
&mOptions[RSK_SHUFFLE_TREES], &mOptions[RSK_SHUFFLE_TREES],
&mOptions[RSK_SHUFFLE_BUSHES], &mOptions[RSK_SHUFFLE_BUSHES],
&mOptions[RSK_SHUFFLE_ICICLES],
&mOptions[RSK_SHUFFLE_RED_ICE],
&mOptions[RSK_SHUFFLE_SIGNS], &mOptions[RSK_SHUFFLE_SIGNS],
&mOptions[RSK_SHUFFLE_KOKIRI_SWORD], &mOptions[RSK_SHUFFLE_KOKIRI_SWORD],
&mOptions[RSK_SHUFFLE_OCARINA], &mOptions[RSK_SHUFFLE_OCARINA],

View file

@ -65,6 +65,8 @@ class StaticData {
static void RegisterSignLocations(); static void RegisterSignLocations();
static void RegisterWonderItemLocations(); static void RegisterWonderItemLocations();
static void RegisterBeggarLocations(); static void RegisterBeggarLocations();
static void RegisterIcicleLocations();
static void RegisterRedIceLocations();
static void InitHashMaps(); static void InitHashMaps();
static std::array<std::pair<RandomizerCheck, RandomizerCheck>, 17> randomizerFishingPondFish; static std::array<std::pair<RandomizerCheck, RandomizerCheck>, 17> randomizerFishingPondFish;
static std::unordered_map<int8_t, RandomizerCheck> randomizerGrottoFishMap; static std::unordered_map<int8_t, RandomizerCheck> randomizerGrottoFishMap;

View file

@ -170,7 +170,9 @@ void BgIceShelter_Init(Actor* thisx, PlayState* play) {
this->dyna.actor.colChkInfo.mass = MASS_IMMOVABLE; 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); Actor_Kill(&this->dyna.actor);
return; return;
} }
@ -414,7 +416,7 @@ void BgIceShelter_Melt(BgIceShelter* this, PlayState* play) {
sSteamSpawnFuncs[type](this, play, particleSpawningChance, sSteamEffectScales[type]); 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)) { if (!((this->dyna.actor.params >> 6) & 1)) {
Flags_SetSwitch(play, this->dyna.actor.params & 0x3F); Flags_SetSwitch(play, this->dyna.actor.params & 0x3F);
} }

View file

@ -6,6 +6,7 @@
#include "z_bg_ice_turara.h" #include "z_bg_ice_turara.h"
#include "objects/object_ice_objects/object_ice_objects.h" #include "objects/object_ice_objects/object_ice_objects.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
#define FLAGS 0 #define FLAGS 0
@ -114,7 +115,7 @@ void BgIceTurara_Break(BgIceTurara* this, PlayState* play, f32 arg2) {
} }
void BgIceTurara_Stalagmite(BgIceTurara* this, PlayState* play) { 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); BgIceTurara_Break(this, play, 50.0f);
Actor_Kill(&this->dyna.actor); Actor_Kill(&this->dyna.actor);
return; return;
@ -165,7 +166,7 @@ void BgIceTurara_Fall(BgIceTurara* this, PlayState* play) {
this->dyna.actor.world.pos.y = this->dyna.actor.floorHeight; this->dyna.actor.world.pos.y = this->dyna.actor.floorHeight;
} }
BgIceTurara_Break(this, play, 40.0f); 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; this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y + 120.0f;
func_8003EC50(play, &play->colCtx.dyna, this->dyna.bgId); func_8003EC50(play, &play->colCtx.dyna, this->dyna.bgId);
this->actionFunc = BgIceTurara_Regrow; this->actionFunc = BgIceTurara_Regrow;
@ -198,4 +199,5 @@ void BgIceTurara_Update(Actor* thisx, PlayState* play) {
void BgIceTurara_Draw(Actor* thisx, PlayState* play) { void BgIceTurara_Draw(Actor* thisx, PlayState* play) {
Gfx_DrawDListOpa(play, object_ice_objects_DL_0023D0); Gfx_DrawDListOpa(play, object_ice_objects_DL_0023D0);
if (GameInteractor_Should(VB_ICICLE_SETUP_DRAW, true, thisx)) {}
} }