diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index 186307aed..92d8c5271 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -1926,6 +1926,14 @@ typedef enum { // - None VB_SHOW_TITLE_CARD, + // #### `result` + // ```c + // Flags_GetSwitch(play, this->switchFlag) + // ``` + // #### `args` + // - *EnGSwitch + VB_SILVER_DESPAWN, + // #### `result` // ```c // (collectible >= 0) && (collectible <= 0x19 diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 3e6588646..66a04597f 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -1057,6 +1057,9 @@ void GenerateItemPool() { ctx->GetOption(RSK_SHUFFLE_FREESTANDING).Is(RO_SHUFFLE_FREESTANDING_ALL); PlaceItemsForType(RCTYPE_FREESTANDING, overworldFreeStandingActive, dungeonFreeStandingActive); + bool silverActive = ctx->GetOption(RSK_SHUFFLE_SILVER).Get(); + PlaceItemsForType(RCTYPE_SILVER, silverActive, silverActive); + AddItemsToPool(ItemPool, alwaysItems); AddItemsToPool(ItemPool, dungeonRewards); @@ -1198,6 +1201,63 @@ void GenerateItemPool() { AddItemToMainPool(RG_SHADOW_TEMPLE_BOSS_KEY); } + if (ctx->GetOption(RSK_SHUFFLE_SILVER)) { + auto dungeons = ctx->GetDungeons(); + if (dungeons->GetDungeonFromScene(SCENE_DODONGOS_CAVERN)->IsMQ()) { + AddItemToMainPool(RG_DODONGOS_CAVERN_MQ_SILVER); + } + + if (dungeons->GetDungeonFromScene(SCENE_SHADOW_TEMPLE)->IsVanilla()) { + AddItemToMainPool(RG_SHADOW_SILVER_BLADES); + AddItemToMainPool(RG_SHADOW_SILVER_PIT); + AddItemToMainPool(RG_SHADOW_SILVER_SPIKES); + } else { + AddItemToMainPool(RG_SHADOW_MQ_SILVER_BLADES); + AddItemToMainPool(RG_SHADOW_MQ_SILVER_PIT); + AddItemToMainPool(RG_SHADOW_MQ_SILVER_INVISIBLE_BLADES); + AddItemToMainPool(RG_SHADOW_MQ_SILVER_SPIKES); + } + + if (dungeons->GetDungeonFromScene(SCENE_SPIRIT_TEMPLE)->IsVanilla()) { + AddItemToMainPool(RG_SPIRIT_SILVER_CHILD); + AddItemToMainPool(RG_SPIRIT_SILVER_SUN); + AddItemToMainPool(RG_SPIRIT_SILVER_BOULDERS); + } else { + AddItemToMainPool(RG_SPIRIT_MQ_SILVER_LOBBY); + AddItemToMainPool(RG_SPIRIT_MQ_SILVER_BIG_WALL); + } + + if (dungeons->GetDungeonFromScene(SCENE_BOTTOM_OF_THE_WELL)->IsVanilla()) { + AddItemToMainPool(RG_BOTW_SILVER); + } + + if (dungeons->GetDungeonFromScene(SCENE_ICE_CAVERN)->IsVanilla()) { + AddItemToMainPool(RG_ICE_CAVERN_SILVER_BLADES); + AddItemToMainPool(RG_ICE_CAVERN_SILVER_BLOCK); + } + + if (dungeons->GetDungeonFromScene(SCENE_GERUDO_TRAINING_GROUND)->IsVanilla()) { + AddItemToMainPool(RG_GTG_SILVER_SLOPE); + AddItemToMainPool(RG_GTG_SILVER_LAVA); + AddItemToMainPool(RG_GTG_SILVER_WATER); + } else { + AddItemToMainPool(RG_GTG_MQ_SILVER_SLOPE); + AddItemToMainPool(RG_GTG_MQ_SILVER_LAVA); + AddItemToMainPool(RG_GTG_MQ_SILVER_WATER); + } + + if (dungeons->GetDungeonFromScene(SCENE_INSIDE_GANONS_CASTLE)->IsVanilla()) { + AddItemToMainPool(RG_GANONS_CASTLE_SILVER_LIGHT); + AddItemToMainPool(RG_GANONS_CASTLE_SILVER_FOREST); + AddItemToMainPool(RG_GANONS_CASTLE_SILVER_FIRE); + AddItemToMainPool(RG_GANONS_CASTLE_SILVER_SPIRIT); + } else { + AddItemToMainPool(RG_GANONS_CASTLE_MQ_SILVER_FIRE); + AddItemToMainPool(RG_GANONS_CASTLE_MQ_SILVER_WATER); + AddItemToMainPool(RG_GANONS_CASTLE_MQ_SILVER_SHADOW); + } + } + if (!ctx->GetOption(RSK_TRIFORCE_HUNT)) { // Don't add GBK to the pool at all for Triforce Hunt. if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_KAK_TOKENS)) { ctx->PlaceItemInLocation(RC_KAK_100_GOLD_SKULLTULA_REWARD, RG_GANONS_CASTLE_BOSS_KEY); diff --git a/soh/soh/Enhancements/randomizer/ShuffleSilver.cpp b/soh/soh/Enhancements/randomizer/ShuffleSilver.cpp new file mode 100644 index 000000000..c66d2493a --- /dev/null +++ b/soh/soh/Enhancements/randomizer/ShuffleSilver.cpp @@ -0,0 +1,281 @@ +#include +#include "dungeon.h" +#include "context.h" +#include "draw.h" +#include "static_data.h" +#include "soh/ObjectExtension/ObjectExtension.h" + +extern "C" { +#include "overlays/actors/ovl_En_G_Switch/z_en_g_switch.h" +extern PlayState* gPlayState; +extern SaveContext gSaveContext; +} + +static bool IsSilverCleared(s16 switchFlag) { + bool isMQ = + Rando::Context::GetInstance()->GetDungeons()->GetDungeonFromScene(gPlayState->sceneNum)->IsMQ(); + switch (gPlayState->sceneNum) { + case SCENE_DODONGOS_CAVERN: + return Flags_GetRandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER); + case SCENE_SHADOW_TEMPLE: + switch (switchFlag) { + case 1: + return Flags_GetRandomizerInf(isMQ ? RAND_INF_SHADOW_MQ_SILVER_BLADES + : RAND_INF_SHADOW_SILVER_BLADES); + case 3: + return Flags_GetRandomizerInf(RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES); + case 8: + return Flags_GetRandomizerInf(isMQ ? RAND_INF_SHADOW_MQ_SILVER_SPIKES + : RAND_INF_SHADOW_SILVER_SPIKES); + case 9: + return Flags_GetRandomizerInf(RAND_INF_SHADOW_SILVER_PIT); + case 17: + return Flags_GetRandomizerInf(RAND_INF_SHADOW_MQ_SILVER_PIT); + } + case SCENE_SPIRIT_TEMPLE: + switch (switchFlag) { + case 0: + return Flags_GetRandomizerInf(RAND_INF_SPIRIT_MQ_SILVER_BIG_WALL); + case 2: + return Flags_GetRandomizerInf(RAND_INF_SPIRIT_SILVER_BOULDERS); + case 5: + return Flags_GetRandomizerInf(RAND_INF_SPIRIT_SILVER_CHILD); + case 10: + return Flags_GetRandomizerInf(RAND_INF_SPIRIT_SILVER_SUN); + case 55: + return Flags_GetRandomizerInf(RAND_INF_SPIRIT_MQ_SILVER_LOBBY); + } + case SCENE_BOTTOM_OF_THE_WELL: + return Flags_GetRandomizerInf(RAND_INF_BOTW_SILVER); + case SCENE_ICE_CAVERN: + switch (switchFlag) { + case 8: + return Flags_GetRandomizerInf(RAND_INF_ICE_CAVERN_SILVER_BLOCK); + case 31: + return Flags_GetRandomizerInf(RAND_INF_ICE_CAVERN_SILVER_BLADES); + } + case SCENE_GERUDO_TRAINING_GROUND: + switch (switchFlag) { + case 12: + return Flags_GetRandomizerInf(isMQ ? RAND_INF_GTG_MQ_SILVER_LAVA : RAND_INF_GTG_SILVER_LAVA); + case 27: + return Flags_GetRandomizerInf(isMQ ? RAND_INF_GTG_MQ_SILVER_WATER : RAND_INF_GTG_SILVER_WATER); + case 28: + return Flags_GetRandomizerInf(isMQ ? RAND_INF_GTG_MQ_SILVER_SLOPE : RAND_INF_GTG_SILVER_SLOPE); + } + case SCENE_INSIDE_GANONS_CASTLE: + switch (switchFlag) { + case 1: + return Flags_GetRandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SILVER_FIRE); + case 2: + return Flags_GetRandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SILVER_WATER); + case 9: + return Flags_GetRandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_FIRE); + case 11: + return Flags_GetRandomizerInf(isMQ ? RAND_INF_GANONS_CASTLE_MQ_SILVER_SHADOW + : RAND_INF_GANONS_CASTLE_SILVER_SPIRIT); + case 14: + return Flags_GetRandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_FOREST); + case 18: + return Flags_GetRandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_LIGHT); + } + } + return false; +} + +void RegisterShuffleSilver() { + bool shouldRegister = IS_RANDO && RAND_GET_OPTION(RSK_SHUFFLE_SILVER); + + COND_VB_SHOULD(VB_SILVER_DESPAWN, shouldRegister, { + EnGSwitch* silver = va_arg(args, EnGSwitch*); + if (silver->type == ENGSWITCH_SILVER_RUPEE) { + auto silverIdentity = OTRGlobals::Instance->gRandomizer->IdentifySilver(gPlayState->sceneNum, + (s16)silver->actor.world.pos.x, (s16)silver->actor.world.pos.z); + *should = true; + if (silverIdentity.randomizerCheck == RC_UNKNOWN_CHECK || + Flags_GetRandomizerInf(silverIdentity.randomizerInf)) { + return; + } + + auto spawnedActor = (EnItem00*)Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_ITEM00, + silver->actor.world.pos.x, silver->actor.world.pos.y, silver->actor.world.pos.z, + 0, 0, 0, ITEM00_RUPEE_PURPLE, false); + spawnedActor->randoCheck = silverIdentity.randomizerCheck; + spawnedActor->randoInf = silverIdentity.randomizerInf; + spawnedActor->itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry( + silverIdentity.randomizerCheck, true, (GetItemID)Rando::StaticData::GetLocation(silverIdentity.randomizerCheck)->GetVanillaItem()); + } else if (silver->type == ENGSWITCH_SILVER_TRACKER) { + if (IsSilverCleared(silver->switchFlag)) { + Flags_SetSwitch(gPlayState, silver->switchFlag); + } + *should = true; + } + }); +} + +void Rando::StaticData::RegisterSilverLocations() { + static bool registered = false; + if (registered) + return; + registered = true; + // clang-format off + locationTable[RC_SHADOW_SILVER_BLADES_1] = Location::Collectable(RC_SHADOW_SILVER_BLADES_1, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(3243, -1061), "RC_SHADOW_SILVER_BLADES_1", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_SILVER_BLADES_1)); + locationTable[RC_SHADOW_SILVER_BLADES_2] = Location::Collectable(RC_SHADOW_SILVER_BLADES_2, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(3007, -1222), "RC_SHADOW_SILVER_BLADES_2", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_SILVER_BLADES_2)); + locationTable[RC_SHADOW_SILVER_BLADES_3] = Location::Collectable(RC_SHADOW_SILVER_BLADES_3, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(3554, -1432), "RC_SHADOW_SILVER_BLADES_3", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_SILVER_BLADES_3)); + locationTable[RC_SHADOW_SILVER_BLADES_4] = Location::Collectable(RC_SHADOW_SILVER_BLADES_4, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2869, -948), "RC_SHADOW_SILVER_BLADES_4", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_SILVER_BLADES_4)); + locationTable[RC_SHADOW_SILVER_BLADES_5] = Location::Collectable(RC_SHADOW_SILVER_BLADES_5, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(3399, -838), "RC_SHADOW_SILVER_BLADES_5", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_SILVER_BLADES_5)); + locationTable[RC_SHADOW_SILVER_PIT_1] = Location::Collectable(RC_SHADOW_SILVER_PIT_1, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2131, 3030), "RC_SHADOW_SILVER_PIT_1", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_SILVER_PIT_1)); + locationTable[RC_SHADOW_SILVER_PIT_2] = Location::Collectable(RC_SHADOW_SILVER_PIT_2, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2115, 3738), "RC_SHADOW_SILVER_PIT_2", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_SILVER_PIT_2)); + locationTable[RC_SHADOW_SILVER_PIT_3] = Location::Collectable(RC_SHADOW_SILVER_PIT_3, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2110, 3368), "RC_SHADOW_SILVER_PIT_3", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_SILVER_PIT_3)); + locationTable[RC_SHADOW_SILVER_PIT_4] = Location::Collectable(RC_SHADOW_SILVER_PIT_4, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2243, 3361), "RC_SHADOW_SILVER_PIT_4", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_SILVER_PIT_4)); + locationTable[RC_SHADOW_SILVER_PIT_5] = Location::Collectable(RC_SHADOW_SILVER_PIT_5, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1998, 3358), "RC_SHADOW_SILVER_PIT_5", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_SILVER_PIT_5)); + locationTable[RC_SHADOW_SILVER_SPIKES_1] = Location::Collectable(RC_SHADOW_SILVER_SPIKES_1, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2042, 849), "RC_SHADOW_SILVER_SPIKES_1", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_SILVER_SPIKES_1)); + locationTable[RC_SHADOW_SILVER_SPIKES_2] = Location::Collectable(RC_SHADOW_SILVER_SPIKES_2, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2940, 1069), "RC_SHADOW_SILVER_SPIKES_2", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_SILVER_SPIKES_2)); + locationTable[RC_SHADOW_SILVER_SPIKES_3] = Location::Collectable(RC_SHADOW_SILVER_SPIKES_3, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2478, 1208), "RC_SHADOW_SILVER_SPIKES_3", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_SILVER_SPIKES_3)); + locationTable[RC_SHADOW_SILVER_SPIKES_4] = Location::Collectable(RC_SHADOW_SILVER_SPIKES_4, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2135, 1297), "RC_SHADOW_SILVER_SPIKES_4", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_SILVER_SPIKES_4)); + locationTable[RC_SHADOW_SILVER_SPIKES_5] = Location::Collectable(RC_SHADOW_SILVER_SPIKES_5, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2254, 988), "RC_SHADOW_SILVER_SPIKES_5", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_SILVER_SPIKES_5)); + locationTable[RC_SPIRIT_SILVER_CHILD_1] = Location::Collectable(RC_SPIRIT_SILVER_CHILD_1, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-766, -1075), "RC_SPIRIT_SILVER_CHILD_1", RHT_SPIRIT_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_SILVER_CHILD_1)); + locationTable[RC_SPIRIT_SILVER_CHILD_2] = Location::Collectable(RC_SPIRIT_SILVER_CHILD_2, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-672, -1075), "RC_SPIRIT_SILVER_CHILD_2", RHT_SPIRIT_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_SILVER_CHILD_2)); + locationTable[RC_SPIRIT_SILVER_CHILD_3] = Location::Collectable(RC_SPIRIT_SILVER_CHILD_3, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-511, -1075), "RC_SPIRIT_SILVER_CHILD_3", RHT_SPIRIT_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_SILVER_CHILD_3)); + locationTable[RC_SPIRIT_SILVER_CHILD_4] = Location::Collectable(RC_SPIRIT_SILVER_CHILD_4, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-347, -1075), "RC_SPIRIT_SILVER_CHILD_4", RHT_SPIRIT_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_SILVER_CHILD_4)); + locationTable[RC_SPIRIT_SILVER_CHILD_5] = Location::Collectable(RC_SPIRIT_SILVER_CHILD_5, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-335, -1409), "RC_SPIRIT_SILVER_CHILD_5", RHT_SPIRIT_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_SILVER_CHILD_5)); + locationTable[RC_SPIRIT_SILVER_SUN_1] = Location::Collectable(RC_SPIRIT_SILVER_SUN_1, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1836, -446), "RC_SPIRIT_SILVER_SUN_1", RHT_SPIRIT_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_SILVER_SUN_1)); + locationTable[RC_SPIRIT_SILVER_SUN_2] = Location::Collectable(RC_SPIRIT_SILVER_SUN_2, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1433, -283), "RC_SPIRIT_SILVER_SUN_2", RHT_SPIRIT_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_SILVER_SUN_2)); + locationTable[RC_SPIRIT_SILVER_SUN_3] = Location::Collectable(RC_SPIRIT_SILVER_SUN_3, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1275, -247), "RC_SPIRIT_SILVER_SUN_3", RHT_SPIRIT_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_SILVER_SUN_3)); + locationTable[RC_SPIRIT_SILVER_SUN_4] = Location::Collectable(RC_SPIRIT_SILVER_SUN_4, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-1123, 428), "RC_SPIRIT_SILVER_SUN_4", RHT_SPIRIT_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_SILVER_SUN_4)); + locationTable[RC_SPIRIT_SILVER_SUN_5] = Location::Collectable(RC_SPIRIT_SILVER_SUN_5, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-984, -450), "RC_SPIRIT_SILVER_SUN_5", RHT_SPIRIT_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_SILVER_SUN_5)); + locationTable[RC_SPIRIT_SILVER_BOULDERS_1] = Location::Collectable(RC_SPIRIT_SILVER_BOULDERS_1, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1284, -1355), "RC_SPIRIT_SILVER_BOULDERS_1", RHT_SPIRIT_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_SILVER_BOULDERS_1)); + locationTable[RC_SPIRIT_SILVER_BOULDERS_2] = Location::Collectable(RC_SPIRIT_SILVER_BOULDERS_2, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1284, -813), "RC_SPIRIT_SILVER_BOULDERS_2", RHT_SPIRIT_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_SILVER_BOULDERS_2)); + locationTable[RC_SPIRIT_SILVER_BOULDERS_3] = Location::Collectable(RC_SPIRIT_SILVER_BOULDERS_3, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1856, -944), "RC_SPIRIT_SILVER_BOULDERS_3", RHT_SPIRIT_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_SILVER_BOULDERS_3)); + locationTable[RC_SPIRIT_SILVER_BOULDERS_4] = Location::Collectable(RC_SPIRIT_SILVER_BOULDERS_4, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1856, -1219), "RC_SPIRIT_SILVER_BOULDERS_4", RHT_SPIRIT_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_SILVER_BOULDERS_4)); + locationTable[RC_SPIRIT_SILVER_BOULDERS_5] = Location::Collectable(RC_SPIRIT_SILVER_BOULDERS_5, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1573, -920), "RC_SPIRIT_SILVER_BOULDERS_5", RHT_SPIRIT_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_SILVER_BOULDERS_5)); + locationTable[RC_BOTW_SILVER_1] = Location::Collectable(RC_BOTW_SILVER_1, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-796, -150), "RC_BOTW_SILVER_1", RHT_BOTW_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTW_SILVER_1)); + locationTable[RC_BOTW_SILVER_2] = Location::Collectable(RC_BOTW_SILVER_2, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-614, -297), "RC_BOTW_SILVER_2", RHT_BOTW_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTW_SILVER_2)); + locationTable[RC_BOTW_SILVER_3] = Location::Collectable(RC_BOTW_SILVER_3, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-560, -291), "RC_BOTW_SILVER_3", RHT_BOTW_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTW_SILVER_3)); + locationTable[RC_BOTW_SILVER_4] = Location::Collectable(RC_BOTW_SILVER_4, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-402, -401), "RC_BOTW_SILVER_4", RHT_BOTW_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTW_SILVER_4)); + locationTable[RC_BOTW_SILVER_5] = Location::Collectable(RC_BOTW_SILVER_5, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_BOTTOM_OF_THE_WELL, TWO_ACTOR_PARAMS(-259, -234), "RC_BOTW_SILVER_5", RHT_BOTW_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_BOTW_SILVER_5)); + locationTable[RC_ICE_CAVERN_SILVER_BLADES_1] = Location::Collectable(RC_ICE_CAVERN_SILVER_BLADES_1, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(1, -143), "RC_ICE_CAVERN_SILVER_BLADES_1", RHT_ICE_CAVERN_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SILVER_BLADES_1)); + locationTable[RC_ICE_CAVERN_SILVER_BLADES_2] = Location::Collectable(RC_ICE_CAVERN_SILVER_BLADES_2, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(198, -388), "RC_ICE_CAVERN_SILVER_BLADES_2", RHT_ICE_CAVERN_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SILVER_BLADES_2)); + locationTable[RC_ICE_CAVERN_SILVER_BLADES_3] = Location::Collectable(RC_ICE_CAVERN_SILVER_BLADES_3, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(278, -637), "RC_ICE_CAVERN_SILVER_BLADES_3", RHT_ICE_CAVERN_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SILVER_BLADES_3)); + locationTable[RC_ICE_CAVERN_SILVER_BLADES_4] = Location::Collectable(RC_ICE_CAVERN_SILVER_BLADES_4, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(389, -382), "RC_ICE_CAVERN_SILVER_BLADES_4", RHT_ICE_CAVERN_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SILVER_BLADES_4)); + locationTable[RC_ICE_CAVERN_SILVER_BLADES_5] = Location::Collectable(RC_ICE_CAVERN_SILVER_BLADES_5, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(414, -579), "RC_ICE_CAVERN_SILVER_BLADES_5", RHT_ICE_CAVERN_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SILVER_BLADES_5)); + locationTable[RC_ICE_CAVERN_SILVER_BLOCK_1] = Location::Collectable(RC_ICE_CAVERN_SILVER_BLOCK_1, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1676, -552), "RC_ICE_CAVERN_SILVER_BLOCK_1", RHT_ICE_CAVERN_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SILVER_BLOCK_1)); + locationTable[RC_ICE_CAVERN_SILVER_BLOCK_2] = Location::Collectable(RC_ICE_CAVERN_SILVER_BLOCK_2, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1558, -951), "RC_ICE_CAVERN_SILVER_BLOCK_2", RHT_ICE_CAVERN_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SILVER_BLOCK_2)); + locationTable[RC_ICE_CAVERN_SILVER_BLOCK_3] = Location::Collectable(RC_ICE_CAVERN_SILVER_BLOCK_3, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1294, -899), "RC_ICE_CAVERN_SILVER_BLOCK_3", RHT_ICE_CAVERN_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SILVER_BLOCK_3)); + locationTable[RC_ICE_CAVERN_SILVER_BLOCK_4] = Location::Collectable(RC_ICE_CAVERN_SILVER_BLOCK_4, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1120, -1577), "RC_ICE_CAVERN_SILVER_BLOCK_4", RHT_ICE_CAVERN_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SILVER_BLOCK_4)); + locationTable[RC_ICE_CAVERN_SILVER_BLOCK_5] = Location::Collectable(RC_ICE_CAVERN_SILVER_BLOCK_5, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_ICE_CAVERN, TWO_ACTOR_PARAMS(-1040, -485), "RC_ICE_CAVERN_SILVER_BLOCK_5", RHT_ICE_CAVERN_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_ICE_CAVERN_SILVER_BLOCK_5)); + locationTable[RC_GTG_SILVER_SLOPE_1] = Location::Collectable(RC_GTG_SILVER_SLOPE_1, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-1332, -992), "RC_GTG_SILVER_SLOPE_1", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_SILVER_SLOPE_1)); + locationTable[RC_GTG_SILVER_SLOPE_2] = Location::Collectable(RC_GTG_SILVER_SLOPE_2, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-1886, -956), "RC_GTG_SILVER_SLOPE_2", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_SILVER_SLOPE_2)); + locationTable[RC_GTG_SILVER_SLOPE_3] = Location::Collectable(RC_GTG_SILVER_SLOPE_3, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-1579, -999), "RC_GTG_SILVER_SLOPE_3", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_SILVER_SLOPE_3)); + locationTable[RC_GTG_SILVER_SLOPE_4] = Location::Collectable(RC_GTG_SILVER_SLOPE_4, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-1627, -1462), "RC_GTG_SILVER_SLOPE_4", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_SILVER_SLOPE_4)); + locationTable[RC_GTG_SILVER_SLOPE_5] = Location::Collectable(RC_GTG_SILVER_SLOPE_5, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-1887, -2134), "RC_GTG_SILVER_SLOPE_5", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_SILVER_SLOPE_5)); + locationTable[RC_GTG_SILVER_LAVA_1] = Location::Collectable(RC_GTG_SILVER_LAVA_1, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(1320, -1248), "RC_GTG_SILVER_LAVA_1", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_SILVER_LAVA_1)); + locationTable[RC_GTG_SILVER_LAVA_2] = Location::Collectable(RC_GTG_SILVER_LAVA_2, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(1558, -1370), "RC_GTG_SILVER_LAVA_2", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_SILVER_LAVA_2)); + locationTable[RC_GTG_SILVER_LAVA_3] = Location::Collectable(RC_GTG_SILVER_LAVA_3, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(1134, -1841), "RC_GTG_SILVER_LAVA_3", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_SILVER_LAVA_3)); + locationTable[RC_GTG_SILVER_LAVA_4] = Location::Collectable(RC_GTG_SILVER_LAVA_4, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(1437, -2193), "RC_GTG_SILVER_LAVA_4", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_SILVER_LAVA_4)); + locationTable[RC_GTG_SILVER_LAVA_5] = Location::Collectable(RC_GTG_SILVER_LAVA_5, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(1560, -1861), "RC_GTG_SILVER_LAVA_5", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_SILVER_LAVA_5)); + locationTable[RC_GTG_SILVER_WATER_1] = Location::Collectable(RC_GTG_SILVER_WATER_1, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(2308, -1464), "RC_GTG_SILVER_WATER_1", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_SILVER_WATER_1)); + locationTable[RC_GTG_SILVER_WATER_2] = Location::Collectable(RC_GTG_SILVER_WATER_2, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(2497, -1465), "RC_GTG_SILVER_WATER_2", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_SILVER_WATER_2)); + locationTable[RC_GTG_SILVER_WATER_3] = Location::Collectable(RC_GTG_SILVER_WATER_3, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(2453, -1612), "RC_GTG_SILVER_WATER_3", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_SILVER_WATER_3)); + locationTable[RC_GTG_SILVER_WATER_4] = Location::Collectable(RC_GTG_SILVER_WATER_4, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(2078, -1458), "RC_GTG_SILVER_WATER_4", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_SILVER_WATER_4)); + locationTable[RC_GTG_SILVER_WATER_5] = Location::Collectable(RC_GTG_SILVER_WATER_5, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(2160, -1315), "RC_GTG_SILVER_WATER_5", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_SILVER_WATER_5)); + locationTable[RC_GANONS_CASTLE_SILVER_LIGHT_1] = Location::Collectable(RC_GANONS_CASTLE_SILVER_LIGHT_1, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2509, -1091), "RC_GANONS_CASTLE_SILVER_LIGHT_1", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_LIGHT_1)); + locationTable[RC_GANONS_CASTLE_SILVER_LIGHT_2] = Location::Collectable(RC_GANONS_CASTLE_SILVER_LIGHT_2, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2649, -545), "RC_GANONS_CASTLE_SILVER_LIGHT_2", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_LIGHT_2)); + locationTable[RC_GANONS_CASTLE_SILVER_LIGHT_3] = Location::Collectable(RC_GANONS_CASTLE_SILVER_LIGHT_3, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2646, -839), "RC_GANONS_CASTLE_SILVER_LIGHT_3", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_LIGHT_3)); + locationTable[RC_GANONS_CASTLE_SILVER_LIGHT_4] = Location::Collectable(RC_GANONS_CASTLE_SILVER_LIGHT_4, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2680, -893), "RC_GANONS_CASTLE_SILVER_LIGHT_4", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_LIGHT_4)); + locationTable[RC_GANONS_CASTLE_SILVER_LIGHT_5] = Location::Collectable(RC_GANONS_CASTLE_SILVER_LIGHT_5, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2674, -777), "RC_GANONS_CASTLE_SILVER_LIGHT_5", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_LIGHT_5)); + locationTable[RC_GANONS_CASTLE_SILVER_FOREST_1] = Location::Collectable(RC_GANONS_CASTLE_SILVER_FOREST_1, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1247, 1787), "RC_GANONS_CASTLE_SILVER_FOREST_1", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_FOREST_1)); + locationTable[RC_GANONS_CASTLE_SILVER_FOREST_2] = Location::Collectable(RC_GANONS_CASTLE_SILVER_FOREST_2, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1361, 1222), "RC_GANONS_CASTLE_SILVER_FOREST_2", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_FOREST_1)); + locationTable[RC_GANONS_CASTLE_SILVER_FOREST_3] = Location::Collectable(RC_GANONS_CASTLE_SILVER_FOREST_3, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1538, 2225), "RC_GANONS_CASTLE_SILVER_FOREST_3", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_FOREST_1)); + locationTable[RC_GANONS_CASTLE_SILVER_FOREST_4] = Location::Collectable(RC_GANONS_CASTLE_SILVER_FOREST_4, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1651, 2021), "RC_GANONS_CASTLE_SILVER_FOREST_4", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_FOREST_1)); + locationTable[RC_GANONS_CASTLE_SILVER_FOREST_5] = Location::Collectable(RC_GANONS_CASTLE_SILVER_FOREST_5, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1634, 1550), "RC_GANONS_CASTLE_SILVER_FOREST_5", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_FOREST_1)); + locationTable[RC_GANONS_CASTLE_SILVER_FIRE_1] = Location::Collectable(RC_GANONS_CASTLE_SILVER_FIRE_1, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-854, -3679), "RC_GANONS_CASTLE_SILVER_FIRE_1", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_FIRE_1)); + locationTable[RC_GANONS_CASTLE_SILVER_FIRE_2] = Location::Collectable(RC_GANONS_CASTLE_SILVER_FIRE_2, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1555, -2317), "RC_GANONS_CASTLE_SILVER_FIRE_2", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_FIRE_2)); + locationTable[RC_GANONS_CASTLE_SILVER_FIRE_3] = Location::Collectable(RC_GANONS_CASTLE_SILVER_FIRE_3, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-515, -3253), "RC_GANONS_CASTLE_SILVER_FIRE_3", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_FIRE_3)); + locationTable[RC_GANONS_CASTLE_SILVER_FIRE_4] = Location::Collectable(RC_GANONS_CASTLE_SILVER_FIRE_4, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-604, -2592), "RC_GANONS_CASTLE_SILVER_FIRE_4", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_FIRE_4)); + locationTable[RC_GANONS_CASTLE_SILVER_FIRE_5] = Location::Collectable(RC_GANONS_CASTLE_SILVER_FIRE_5, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1867, -2754), "RC_GANONS_CASTLE_SILVER_FIRE_5", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_FIRE_5)); + locationTable[RC_GANONS_CASTLE_SILVER_SPIRIT_1] = Location::Collectable(RC_GANONS_CASTLE_SILVER_SPIRIT_1, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-829, 591), "RC_GANONS_CASTLE_SILVER_SPIRIT_1", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_SPIRIT_1)); + locationTable[RC_GANONS_CASTLE_SILVER_SPIRIT_2] = Location::Collectable(RC_GANONS_CASTLE_SILVER_SPIRIT_2, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-940, 270), "RC_GANONS_CASTLE_SILVER_SPIRIT_2", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_SPIRIT_2)); + locationTable[RC_GANONS_CASTLE_SILVER_SPIRIT_3] = Location::Collectable(RC_GANONS_CASTLE_SILVER_SPIRIT_3, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-865, 656), "RC_GANONS_CASTLE_SILVER_SPIRIT_3", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_SPIRIT_3)); + locationTable[RC_GANONS_CASTLE_SILVER_SPIRIT_4] = Location::Collectable(RC_GANONS_CASTLE_SILVER_SPIRIT_4, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-725, 942), "RC_GANONS_CASTLE_SILVER_SPIRIT_4", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_SPIRIT_4)); + locationTable[RC_GANONS_CASTLE_SILVER_SPIRIT_5] = Location::Collectable(RC_GANONS_CASTLE_SILVER_SPIRIT_5, RCQUEST_VANILLA, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1142, 639), "RC_GANONS_CASTLE_SILVER_SPIRIT_5", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_SPIRIT_5)); + locationTable[RC_DODONGOS_CAVERN_MQ_SILVER_1] = Location::Collectable(RC_DODONGOS_CAVERN_MQ_SILVER_1, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2277, -1362), "RC_DODONGOS_CAVERN_MQ_SILVER_1", RHT_DODONGOS_CAVERN_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_1)); + locationTable[RC_DODONGOS_CAVERN_MQ_SILVER_2] = Location::Collectable(RC_DODONGOS_CAVERN_MQ_SILVER_2, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2189, -1834), "RC_DODONGOS_CAVERN_MQ_SILVER_2", RHT_DODONGOS_CAVERN_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_2)); + locationTable[RC_DODONGOS_CAVERN_MQ_SILVER_3] = Location::Collectable(RC_DODONGOS_CAVERN_MQ_SILVER_3, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-2411, -1836), "RC_DODONGOS_CAVERN_MQ_SILVER_3", RHT_DODONGOS_CAVERN_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_3)); + locationTable[RC_DODONGOS_CAVERN_MQ_SILVER_4] = Location::Collectable(RC_DODONGOS_CAVERN_MQ_SILVER_4, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1907, -1243), "RC_DODONGOS_CAVERN_MQ_SILVER_4", RHT_DODONGOS_CAVERN_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_4)); + locationTable[RC_DODONGOS_CAVERN_MQ_SILVER_5] = Location::Collectable(RC_DODONGOS_CAVERN_MQ_SILVER_5, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_DODONGOS_CAVERN, TWO_ACTOR_PARAMS(-1512, -1083), "RC_DODONGOS_CAVERN_MQ_SILVER_5", RHT_DODONGOS_CAVERN_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_5)); + locationTable[RC_SHADOW_MQ_SILVER_BLADES_1] = Location::Collectable(RC_SHADOW_MQ_SILVER_BLADES_1, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2810, -961 ), "RC_SHADOW_MQ_SILVER_BLADES_1", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_BLADES_1)); + locationTable[RC_SHADOW_MQ_SILVER_BLADES_2] = Location::Collectable(RC_SHADOW_MQ_SILVER_BLADES_2, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(3007, -1222), "RC_SHADOW_MQ_SILVER_BLADES_2", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_BLADES_2)); + locationTable[RC_SHADOW_MQ_SILVER_BLADES_3] = Location::Collectable(RC_SHADOW_MQ_SILVER_BLADES_3, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(3243, -1061), "RC_SHADOW_MQ_SILVER_BLADES_3", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_BLADES_3)); + locationTable[RC_SHADOW_MQ_SILVER_BLADES_4] = Location::Collectable(RC_SHADOW_MQ_SILVER_BLADES_4, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(3399, -838 ), "RC_SHADOW_MQ_SILVER_BLADES_4", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_BLADES_4)); + locationTable[RC_SHADOW_MQ_SILVER_BLADES_5] = Location::Collectable(RC_SHADOW_MQ_SILVER_BLADES_5, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(3558, -1490), "RC_SHADOW_MQ_SILVER_BLADES_5", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_BLADES_5)); + locationTable[RC_SHADOW_MQ_SILVER_PIT_1] = Location::Collectable(RC_SHADOW_MQ_SILVER_PIT_1, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(1970, 3372), "RC_SHADOW_MQ_SILVER_PIT_1", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_PIT_1)); + locationTable[RC_SHADOW_MQ_SILVER_PIT_2] = Location::Collectable(RC_SHADOW_MQ_SILVER_PIT_2, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2110, 3372), "RC_SHADOW_MQ_SILVER_PIT_2", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_PIT_2)); + locationTable[RC_SHADOW_MQ_SILVER_PIT_3] = Location::Collectable(RC_SHADOW_MQ_SILVER_PIT_3, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2110, 3372), "RC_SHADOW_MQ_SILVER_PIT_3", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_PIT_3)); + locationTable[RC_SHADOW_MQ_SILVER_PIT_4] = Location::Collectable(RC_SHADOW_MQ_SILVER_PIT_4, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2131, 3030), "RC_SHADOW_MQ_SILVER_PIT_4", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_PIT_4)); + locationTable[RC_SHADOW_MQ_SILVER_PIT_5] = Location::Collectable(RC_SHADOW_MQ_SILVER_PIT_5, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2250, 3372), "RC_SHADOW_MQ_SILVER_PIT_5", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_PIT_5)); + locationTable[RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_1] = Location::Collectable(RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_1, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5089, 2049), "RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_1", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_1)); + locationTable[RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_2] = Location::Collectable(RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_2, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5158, 2315), "RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_2", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_2)); + locationTable[RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_3] = Location::Collectable(RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_3, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5217, 1852), "RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_3", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_3)); + locationTable[RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_4] = Location::Collectable(RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_4, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5270, 2453), "RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_4", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_4)); + locationTable[RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_5] = Location::Collectable(RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_5, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5404, 1977), "RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_5", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_5)); + locationTable[RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_6] = Location::Collectable(RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_6, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5466, 2243), "RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_6", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_6)); + locationTable[RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_7] = Location::Collectable(RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_7, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5489, 2476), "RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_7", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_7)); + locationTable[RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_8] = Location::Collectable(RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_8, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5601, 1898), "RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_8", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_8)); + locationTable[RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_9] = Location::Collectable(RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_9, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5637, 2134), "RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_9", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_9)); + locationTable[RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_10] = Location::Collectable(RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_10, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(5667, 2686), "RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_10", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_10)); + locationTable[RC_SHADOW_MQ_SILVER_SPIKES_1] = Location::Collectable(RC_SHADOW_MQ_SILVER_SPIKES_1, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2042, 849), "RC_SHADOW_MQ_SILVER_SPIKES_1", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_SPIKES_1)); + locationTable[RC_SHADOW_MQ_SILVER_SPIKES_2] = Location::Collectable(RC_SHADOW_MQ_SILVER_SPIKES_2, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2135, 1297), "RC_SHADOW_MQ_SILVER_SPIKES_2", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_SPIKES_2)); + locationTable[RC_SHADOW_MQ_SILVER_SPIKES_3] = Location::Collectable(RC_SHADOW_MQ_SILVER_SPIKES_3, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2254, 988), "RC_SHADOW_MQ_SILVER_SPIKES_3", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_SPIKES_3)); + locationTable[RC_SHADOW_MQ_SILVER_SPIKES_4] = Location::Collectable(RC_SHADOW_MQ_SILVER_SPIKES_4, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2478, 893), "RC_SHADOW_MQ_SILVER_SPIKES_4", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_SPIKES_4)); + locationTable[RC_SHADOW_MQ_SILVER_SPIKES_5] = Location::Collectable(RC_SHADOW_MQ_SILVER_SPIKES_5, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2478, 1208), "RC_SHADOW_MQ_SILVER_SPIKES_5", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_SPIKES_5)); + locationTable[RC_SHADOW_MQ_SILVER_SPIKES_6] = Location::Collectable(RC_SHADOW_MQ_SILVER_SPIKES_6, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2478, 1200), "RC_SHADOW_MQ_SILVER_SPIKES_6", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_SPIKES_6)); + locationTable[RC_SHADOW_MQ_SILVER_SPIKES_7] = Location::Collectable(RC_SHADOW_MQ_SILVER_SPIKES_7, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2478, 1404), "RC_SHADOW_MQ_SILVER_SPIKES_7", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_SPIKES_7)); + locationTable[RC_SHADOW_MQ_SILVER_SPIKES_8] = Location::Collectable(RC_SHADOW_MQ_SILVER_SPIKES_8, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2705, 1089), "RC_SHADOW_MQ_SILVER_SPIKES_8", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_SPIKES_8)); + locationTable[RC_SHADOW_MQ_SILVER_SPIKES_9] = Location::Collectable(RC_SHADOW_MQ_SILVER_SPIKES_9, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2730, 876), "RC_SHADOW_MQ_SILVER_SPIKES_9", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_SPIKES_9)); + locationTable[RC_SHADOW_MQ_SILVER_SPIKES_10] = Location::Collectable(RC_SHADOW_MQ_SILVER_SPIKES_10, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SHADOW_TEMPLE, TWO_ACTOR_PARAMS(2940, 1069), "RC_SHADOW_MQ_SILVER_SPIKES_10", RHT_SHADOW_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SHADOW_MQ_SILVER_SPIKES_10)); + locationTable[RC_SPIRIT_MQ_SILVER_LOBBY_1] = Location::Collectable(RC_SPIRIT_MQ_SILVER_LOBBY_1, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(1016, -73), "RC_SPIRIT_MQ_SILVER_LOBBY_1", RHT_SPIRIT_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_MQ_SILVER_LOBBY_1)); + locationTable[RC_SPIRIT_MQ_SILVER_LOBBY_2] = Location::Collectable(RC_SPIRIT_MQ_SILVER_LOBBY_2, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(160, 268), "RC_SPIRIT_MQ_SILVER_LOBBY_2", RHT_SPIRIT_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_MQ_SILVER_LOBBY_2)); + locationTable[RC_SPIRIT_MQ_SILVER_LOBBY_3] = Location::Collectable(RC_SPIRIT_MQ_SILVER_LOBBY_3, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(-160, 270), "RC_SPIRIT_MQ_SILVER_LOBBY_3", RHT_SPIRIT_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_MQ_SILVER_LOBBY_3)); + locationTable[RC_SPIRIT_MQ_SILVER_LOBBY_4] = Location::Collectable(RC_SPIRIT_MQ_SILVER_LOBBY_4, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(967, -547), "RC_SPIRIT_MQ_SILVER_LOBBY_4", RHT_SPIRIT_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_MQ_SILVER_LOBBY_4)); + locationTable[RC_SPIRIT_MQ_SILVER_LOBBY_5] = Location::Collectable(RC_SPIRIT_MQ_SILVER_LOBBY_5, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(744, 4), "RC_SPIRIT_MQ_SILVER_LOBBY_5", RHT_SPIRIT_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_MQ_SILVER_LOBBY_5)); + locationTable[RC_SPIRIT_MQ_SILVER_BIG_WALL_1] = Location::Collectable(RC_SPIRIT_MQ_SILVER_BIG_WALL_1, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(723, -75), "RC_SPIRIT_MQ_SILVER_BIG_WALL_1", RHT_SPIRIT_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_MQ_SILVER_BIG_WALL_1)); + locationTable[RC_SPIRIT_MQ_SILVER_BIG_WALL_2] = Location::Collectable(RC_SPIRIT_MQ_SILVER_BIG_WALL_2, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(582, -75), "RC_SPIRIT_MQ_SILVER_BIG_WALL_2", RHT_SPIRIT_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_MQ_SILVER_BIG_WALL_2)); + locationTable[RC_SPIRIT_MQ_SILVER_BIG_WALL_3] = Location::Collectable(RC_SPIRIT_MQ_SILVER_BIG_WALL_3, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(754, -75), "RC_SPIRIT_MQ_SILVER_BIG_WALL_3", RHT_SPIRIT_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_MQ_SILVER_BIG_WALL_3)); + locationTable[RC_SPIRIT_MQ_SILVER_BIG_WALL_4] = Location::Collectable(RC_SPIRIT_MQ_SILVER_BIG_WALL_4, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(644, -75), "RC_SPIRIT_MQ_SILVER_BIG_WALL_4", RHT_SPIRIT_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_MQ_SILVER_BIG_WALL_4)); + locationTable[RC_SPIRIT_MQ_SILVER_BIG_WALL_5] = Location::Collectable(RC_SPIRIT_MQ_SILVER_BIG_WALL_5, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_SPIRIT_TEMPLE, TWO_ACTOR_PARAMS(681, -75), "RC_SPIRIT_MQ_SILVER_BIG_WALL_5", RHT_SPIRIT_TEMPLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_SPIRIT_MQ_SILVER_BIG_WALL_5)); + locationTable[RC_GTG_MQ_SILVER_SLOPE_1] = Location::Collectable(RC_GTG_MQ_SILVER_SLOPE_1, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-1245, -2112), "RC_GTG_MQ_SILVER_SLOPE_1", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_MQ_SILVER_SLOPE_1)); + locationTable[RC_GTG_MQ_SILVER_SLOPE_2] = Location::Collectable(RC_GTG_MQ_SILVER_SLOPE_2, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-1542, -1467), "RC_GTG_MQ_SILVER_SLOPE_2", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_MQ_SILVER_SLOPE_2)); + locationTable[RC_GTG_MQ_SILVER_SLOPE_3] = Location::Collectable(RC_GTG_MQ_SILVER_SLOPE_3, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-1480, -1000), "RC_GTG_MQ_SILVER_SLOPE_3", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_MQ_SILVER_SLOPE_3)); + locationTable[RC_GTG_MQ_SILVER_SLOPE_4] = Location::Collectable(RC_GTG_MQ_SILVER_SLOPE_4, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-1886, -956), "RC_GTG_MQ_SILVER_SLOPE_4", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_MQ_SILVER_SLOPE_4)); + locationTable[RC_GTG_MQ_SILVER_SLOPE_5] = Location::Collectable(RC_GTG_MQ_SILVER_SLOPE_5, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(-1261, -923), "RC_GTG_MQ_SILVER_SLOPE_5", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_MQ_SILVER_SLOPE_5)); + locationTable[RC_GTG_MQ_SILVER_LAVA_1] = Location::Collectable(RC_GTG_MQ_SILVER_LAVA_1, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(1560, -1861), "RC_GTG_MQ_SILVER_LAVA_1", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_MQ_SILVER_LAVA_1)); + locationTable[RC_GTG_MQ_SILVER_LAVA_2] = Location::Collectable(RC_GTG_MQ_SILVER_LAVA_2, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(1134, -1841), "RC_GTG_MQ_SILVER_LAVA_2", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_MQ_SILVER_LAVA_2)); + locationTable[RC_GTG_MQ_SILVER_LAVA_3] = Location::Collectable(RC_GTG_MQ_SILVER_LAVA_3, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(1404, -1653), "RC_GTG_MQ_SILVER_LAVA_3", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_MQ_SILVER_LAVA_3)); + locationTable[RC_GTG_MQ_SILVER_LAVA_4] = Location::Collectable(RC_GTG_MQ_SILVER_LAVA_4, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(1560, -1380), "RC_GTG_MQ_SILVER_LAVA_4", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_MQ_SILVER_LAVA_4)); + locationTable[RC_GTG_MQ_SILVER_LAVA_5] = Location::Collectable(RC_GTG_MQ_SILVER_LAVA_5, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(1083, -1374), "RC_GTG_MQ_SILVER_LAVA_5", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_MQ_SILVER_LAVA_5)); + locationTable[RC_GTG_MQ_SILVER_LAVA_6] = Location::Collectable(RC_GTG_MQ_SILVER_LAVA_6, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(1317, -1243), "RC_GTG_MQ_SILVER_LAVA_6", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_MQ_SILVER_LAVA_6)); + locationTable[RC_GTG_MQ_SILVER_WATER_1] = Location::Collectable(RC_GTG_MQ_SILVER_WATER_1, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(2453, -1612), "RC_GTG_MQ_SILVER_WATER_1", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_MQ_SILVER_WATER_1)); + locationTable[RC_GTG_MQ_SILVER_WATER_2] = Location::Collectable(RC_GTG_MQ_SILVER_WATER_2, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(2302, -1464), "RC_GTG_MQ_SILVER_WATER_2", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_MQ_SILVER_WATER_2)); + locationTable[RC_GTG_MQ_SILVER_WATER_3] = Location::Collectable(RC_GTG_MQ_SILVER_WATER_3, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_GERUDO_TRAINING_GROUND, TWO_ACTOR_PARAMS(2160, -1315), "RC_GTG_MQ_SILVER_WATER_3", RHT_GTG_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GTG_MQ_SILVER_WATER_3)); + locationTable[RC_GANONS_CASTLE_MQ_SILVER_FIRE_1] = Location::Collectable(RC_GANONS_CASTLE_MQ_SILVER_FIRE_1, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-970, -3747), "RC_GANONS_CASTLE_MQ_SILVER_FIRE_1", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SILVER_FIRE_1)); + locationTable[RC_GANONS_CASTLE_MQ_SILVER_FIRE_2] = Location::Collectable(RC_GANONS_CASTLE_MQ_SILVER_FIRE_2, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1891, -2753), "RC_GANONS_CASTLE_MQ_SILVER_FIRE_2", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SILVER_FIRE_2)); + locationTable[RC_GANONS_CASTLE_MQ_SILVER_FIRE_3] = Location::Collectable(RC_GANONS_CASTLE_MQ_SILVER_FIRE_3, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-2044, -3354), "RC_GANONS_CASTLE_MQ_SILVER_FIRE_3", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SILVER_FIRE_3)); + locationTable[RC_GANONS_CASTLE_MQ_SILVER_FIRE_4] = Location::Collectable(RC_GANONS_CASTLE_MQ_SILVER_FIRE_4, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-686, -2945), "RC_GANONS_CASTLE_MQ_SILVER_FIRE_4", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SILVER_FIRE_4)); + locationTable[RC_GANONS_CASTLE_MQ_SILVER_FIRE_5] = Location::Collectable(RC_GANONS_CASTLE_MQ_SILVER_FIRE_5, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(-1655, -2133), "RC_GANONS_CASTLE_MQ_SILVER_FIRE_5", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SILVER_FIRE_5)); + locationTable[RC_GANONS_CASTLE_MQ_SILVER_WATER_1] = Location::Collectable(RC_GANONS_CASTLE_MQ_SILVER_WATER_1, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2757, -765), "RC_GANONS_CASTLE_MQ_SILVER_WATER_1", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SILVER_WATER_1)); + locationTable[RC_GANONS_CASTLE_MQ_SILVER_WATER_2] = Location::Collectable(RC_GANONS_CASTLE_MQ_SILVER_WATER_2, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2912, -971), "RC_GANONS_CASTLE_MQ_SILVER_WATER_2", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SILVER_WATER_2)); + locationTable[RC_GANONS_CASTLE_MQ_SILVER_WATER_3] = Location::Collectable(RC_GANONS_CASTLE_MQ_SILVER_WATER_3, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2905, -1478), "RC_GANONS_CASTLE_MQ_SILVER_WATER_3", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SILVER_WATER_3)); + locationTable[RC_GANONS_CASTLE_MQ_SILVER_WATER_4] = Location::Collectable(RC_GANONS_CASTLE_MQ_SILVER_WATER_4, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(3253, -649), "RC_GANONS_CASTLE_MQ_SILVER_WATER_4", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SILVER_WATER_4)); + locationTable[RC_GANONS_CASTLE_MQ_SILVER_WATER_5] = Location::Collectable(RC_GANONS_CASTLE_MQ_SILVER_WATER_5, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(2905, -1263), "RC_GANONS_CASTLE_MQ_SILVER_WATER_5", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SILVER_WATER_5)); + locationTable[RC_GANONS_CASTLE_MQ_SILVER_SHADOW_1] = Location::Collectable(RC_GANONS_CASTLE_MQ_SILVER_SHADOW_1, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1322, -2262), "RC_GANONS_CASTLE_MQ_SILVER_SHADOW_1", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SILVER_SHADOW_1)); + locationTable[RC_GANONS_CASTLE_MQ_SILVER_SHADOW_2] = Location::Collectable(RC_GANONS_CASTLE_MQ_SILVER_SHADOW_2, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1279, -3111), "RC_GANONS_CASTLE_MQ_SILVER_SHADOW_2", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SILVER_SHADOW_2)); + locationTable[RC_GANONS_CASTLE_MQ_SILVER_SHADOW_3] = Location::Collectable(RC_GANONS_CASTLE_MQ_SILVER_SHADOW_3, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1529, -4117), "RC_GANONS_CASTLE_MQ_SILVER_SHADOW_3", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SILVER_SHADOW_3)); + locationTable[RC_GANONS_CASTLE_MQ_SILVER_SHADOW_4] = Location::Collectable(RC_GANONS_CASTLE_MQ_SILVER_SHADOW_4, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1829, -4071), "RC_GANONS_CASTLE_MQ_SILVER_SHADOW_4", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SILVER_SHADOW_4)); + locationTable[RC_GANONS_CASTLE_MQ_SILVER_SHADOW_5] = Location::Collectable(RC_GANONS_CASTLE_MQ_SILVER_SHADOW_5, RCQUEST_MQ, RCTYPE_SILVER, ACTOR_EN_ITEM00, SCENE_INSIDE_GANONS_CASTLE, TWO_ACTOR_PARAMS(1100, -2554), "RC_GANONS_CASTLE_MQ_SILVER_SHADOW_5", RHT_GANONS_CASTLE_SILVER, RG_BLUE_RUPEE, SpoilerCollectionCheck::RandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SILVER_SHADOW_5)); + // clang-format on +} + +static ObjectExtension::Register RegisterSilverIdentity; +static RegisterShipInitFunc registerShuffleSilver(RegisterShuffleSilver, { "IS_RANDO" }); +static RegisterShipInitFunc registerShuffleSilverLocations(Rando::StaticData::RegisterSilverLocations); \ No newline at end of file diff --git a/soh/soh/Enhancements/randomizer/draw.cpp b/soh/soh/Enhancements/randomizer/draw.cpp index b17718b65..749352afb 100644 --- a/soh/soh/Enhancements/randomizer/draw.cpp +++ b/soh/soh/Enhancements/randomizer/draw.cpp @@ -17,6 +17,7 @@ extern "C" { #include "objects/object_gi_compass/object_gi_compass.h" #include "objects/object_gi_map/object_gi_map.h" #include "objects/object_gi_hearts/object_gi_hearts.h" +#include "objects/object_gi_rupy/object_gi_rupy.h" #include "objects/object_gi_scale/object_gi_scale.h" #include "objects/object_gi_fire/object_gi_fire.h" #include "objects/object_fish/object_fish.h" @@ -34,6 +35,7 @@ extern "C" { #include "overlays/ovl_Boss_Sst/ovl_Boss_Sst.h" #include "objects/object_tw/object_tw.h" #include "objects/object_ganon2/object_ganon2.h" +#include "objects/object_mo/object_mo.h" extern PlayState* gPlayState; extern SaveContext gSaveContext; } @@ -1109,6 +1111,27 @@ extern "C" void Randomizer_DrawBronzeScale(PlayState* play, GetItemEntry* getIte CLOSE_DISPS(play->state.gfxCtx); } +extern "C" void Randomizer_DrawSilverRupee(PlayState* play, GetItemEntry* getItemEntry) { + OPEN_DISPS(play->state.gfxCtx); + + Gfx_SetupDL_25Opa(play->state.gfxCtx); + + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__), + G_MTX_MODELVIEW | G_MTX_LOAD); + + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x80, 255, 255, 255, 255); + gDPSetEnvColor(POLY_OPA_DISP++, 255 / 5, 255 / 5, 255 / 5, 255); + gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiRupeeInnerDL); + + Gfx_SetupDL_25Xlu(play->state.gfxCtx); + gSPMatrix(POLY_XLU_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD); + gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, 255); + gDPSetEnvColor(POLY_XLU_DISP++, 255 * 0.75f, 255 * 0.75f, 255 * 0.75f, 255); + gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiRupeeOuterDL); + + CLOSE_DISPS(play->state.gfxCtx); +} + extern "C" void Randomizer_DrawFishingPoleGI(PlayState* play, GetItemEntry* getItemEntry) { Vec3f pos; OPEN_DISPS(play->state.gfxCtx); diff --git a/soh/soh/Enhancements/randomizer/draw.h b/soh/soh/Enhancements/randomizer/draw.h index 8483a7bf9..62ae70a40 100644 --- a/soh/soh/Enhancements/randomizer/draw.h +++ b/soh/soh/Enhancements/randomizer/draw.h @@ -21,6 +21,7 @@ void Randomizer_DrawTriforcePiece(PlayState* play, GetItemEntry getItemEntry); void Randomizer_DrawTriforcePieceGI(PlayState* play, GetItemEntry getItemEntry); void Randomizer_DrawOcarinaButton(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawBronzeScale(PlayState* play, GetItemEntry* getItemEntry); +void Randomizer_DrawSilverRupee(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawFishingPoleGI(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawSkeletonKey(PlayState* play, GetItemEntry* getItemEntry); void Randomizer_DrawMysteryItem(PlayState* play, GetItemEntry* getItemEntry); diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp index 7f22fe83f..99f380d70 100644 --- a/soh/soh/Enhancements/randomizer/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -233,7 +233,7 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_SHADOW_TEMPLE_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); itemTable[RG_BOTTOM_OF_THE_WELL_KEY_RING] = Item(RG_BOTTOM_OF_THE_WELL_KEY_RING, Text{ "Bottom of the Well Key Ring", "Trousseau du Puits", "Schlüsselbund (Grund des Brunnens)" }, ITEMTYPE_SMALLKEY, 0xDA, true, LOGIC_BOTTOM_OF_THE_WELL_KEYS, RHT_BOTTOM_OF_THE_WELL_KEY_RING, RG_BOTTOM_OF_THE_WELL_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_BOTTOM_OF_THE_WELL_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); - itemTable[RG_GERUDO_TRAINING_GROUND_KEY_RING] = Item(RG_GERUDO_TRAINING_GROUND_KEY_RING, Text{ "Training Ground Key Ring", "Trousseau du Gymnase Gerudo", "Schlüsselbund (Gerudo-Trainingsarena)" }, ITEMTYPE_SMALLKEY, 0xDB, true, LOGIC_GERUDO_TRAINING_GROUND_KEYS, RHT_GERUDO_TRAINING_GROUND_KEY_RING, RG_GERUDO_TRAINING_GROUND_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GERUDO_TRAINING_GROUND_KEY_RING] = Item(RG_GERUDO_TRAINING_GROUND_KEY_RING, Text{ "Training Ground Key Ring", "Trousseau du Gymnase Gerudo", "Schlüsselbund (Gerudo-Trainingsarena)" }, ITEMTYPE_SMALLKEY, 0xDB, true, LOGIC_GERUDO_TRAINING_GROUND_KEYS, RHT_GERUDO_TRAINING_GROUND_KEY_RING, RG_GERUDO_TRAINING_GROUND_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GERUDO_TRAINING_GROUND_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); itemTable[RG_GERUDO_FORTRESS_KEY_RING] = Item(RG_GERUDO_FORTRESS_KEY_RING, Text{ "Gerudo Fortress Key Ring", "Trousseau du Repaire des Voleurs", "Schlüsselbund (Diebesversteck)" }, ITEMTYPE_FORTRESS_SMALLKEY, 0xDC, true, LOGIC_GERUDO_FORTRESS_KEYS, RHT_GERUDO_FORTRESS_KEY_RING, RG_GERUDO_FORTRESS_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_GERUDO_FORTRESS_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); @@ -241,6 +241,65 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_GANONS_CASTLE_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); itemTable[RG_TREASURE_GAME_KEY_RING] = Item(RG_TREASURE_GAME_KEY_RING, Text{ "Chest Game Key Ring", "Trousseau du jeu la Chasse-aux-Trésors", "Schlüsselbund (Truhenlotterie)" }, ITEMTYPE_SMALLKEY, 0xDE, true, LOGIC_TREASURE_GAME_KEYS, RHT_TREASURE_GAME_KEY_RING, RG_TREASURE_GAME_KEY_RING, OBJECT_GI_KEY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); itemTable[RG_TREASURE_GAME_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing); + // Silver Rupees + itemTable[RG_SHADOW_SILVER_BLADES] = Item(RG_SHADOW_SILVER_BLADES, Text{ "Shadow Silver: Blades" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SHADOW_SILVER_BLADES].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_SHADOW_SILVER_PIT] = Item(RG_SHADOW_SILVER_PIT, Text{ "Shadow Silver: Pit" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SHADOW_SILVER_PIT].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_SHADOW_SILVER_SPIKES] = Item(RG_SHADOW_SILVER_SPIKES, Text{ "Shadow Silver: Spikes" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SHADOW_SILVER_SPIKES].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_SPIRIT_SILVER_CHILD] = Item(RG_SPIRIT_SILVER_CHILD, Text{ "Spirit Silver: Child" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SPIRIT_SILVER_CHILD].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_SPIRIT_SILVER_SUN] = Item(RG_SPIRIT_SILVER_SUN, Text{ "Spirit Silver: Sun" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SPIRIT_SILVER_SUN].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_SPIRIT_SILVER_BOULDERS] = Item(RG_SPIRIT_SILVER_BOULDERS, Text{ "Spirit Silver: Boulders" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SPIRIT_SILVER_BOULDERS].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_BOTW_SILVER] = Item(RG_BOTW_SILVER, Text{ "Bottom of the Well Silver" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_BOTW_SILVER].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_ICE_CAVERN_SILVER_BLADES] = Item(RG_ICE_CAVERN_SILVER_BLADES, Text{ "Ice Cavern Silver: Blades" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_ICE_CAVERN_SILVER_BLADES].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_ICE_CAVERN_SILVER_BLOCK] = Item(RG_ICE_CAVERN_SILVER_BLOCK, Text{ "Ice Cavern Silver: Block" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_ICE_CAVERN_SILVER_BLOCK].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_GTG_SILVER_SLOPE] = Item(RG_GTG_SILVER_SLOPE, Text{ "Training Ground Silver: Slope" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GTG_SILVER_SLOPE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_GTG_SILVER_LAVA] = Item(RG_GTG_SILVER_LAVA, Text{ "Training Ground Silver: Lava" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GTG_SILVER_LAVA].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_GTG_SILVER_WATER] = Item(RG_GTG_SILVER_WATER, Text{ "Training Ground Silver: Water" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GTG_SILVER_WATER].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_GANONS_CASTLE_SILVER_LIGHT] = Item(RG_GANONS_CASTLE_SILVER_LIGHT, Text{ "Ganon's Castle Silver: Light" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GANONS_CASTLE_SILVER_LIGHT].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_GANONS_CASTLE_SILVER_FOREST] = Item(RG_GANONS_CASTLE_SILVER_FOREST, Text{ "Ganon's Castle Silver: Forest" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GANONS_CASTLE_SILVER_FOREST].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_GANONS_CASTLE_SILVER_FIRE] = Item(RG_GANONS_CASTLE_SILVER_FIRE, Text{ "Ganon's Castle Silver: Fire" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GANONS_CASTLE_SILVER_FIRE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_GANONS_CASTLE_SILVER_SPIRIT] = Item(RG_GANONS_CASTLE_SILVER_SPIRIT, Text{ "Ganon's Castle Silver: Spirit" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GANONS_CASTLE_SILVER_SPIRIT].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_DODONGOS_CAVERN_MQ_SILVER] = Item(RG_DODONGOS_CAVERN_MQ_SILVER, Text{ "Dodongo's Cavern Silver" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_DODONGOS_CAVERN_MQ_SILVER].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_SHADOW_MQ_SILVER_BLADES] = Item(RG_SHADOW_MQ_SILVER_BLADES, Text{ "Shadow Silver: Blades" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SHADOW_MQ_SILVER_BLADES].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_SHADOW_MQ_SILVER_PIT] = Item(RG_SHADOW_MQ_SILVER_PIT, Text{ "Shadow Silver: Pit" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SHADOW_MQ_SILVER_PIT].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_SHADOW_MQ_SILVER_INVISIBLE_BLADES] = Item(RG_SHADOW_MQ_SILVER_INVISIBLE_BLADES, Text{ "Shadow Silver: Invisible Blades" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SHADOW_MQ_SILVER_INVISIBLE_BLADES].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_SHADOW_MQ_SILVER_SPIKES] = Item(RG_SHADOW_MQ_SILVER_SPIKES, Text{ "Shadow Silver: Spikes" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SHADOW_MQ_SILVER_SPIKES].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_SPIRIT_MQ_SILVER_LOBBY] = Item(RG_SPIRIT_MQ_SILVER_LOBBY, Text{ "Spirit Silver: Lobby" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SPIRIT_MQ_SILVER_LOBBY].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_SPIRIT_MQ_SILVER_BIG_WALL] = Item(RG_SPIRIT_MQ_SILVER_BIG_WALL, Text{ "Spirit Silver: Big Wall" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_SPIRIT_MQ_SILVER_BIG_WALL].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_GTG_MQ_SILVER_SLOPE] = Item(RG_GTG_MQ_SILVER_SLOPE, Text{ "Training Ground Silver: Slope" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GTG_MQ_SILVER_SLOPE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_GTG_MQ_SILVER_LAVA] = Item(RG_GTG_MQ_SILVER_LAVA, Text{ "Training Ground Silver: Lava" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GTG_MQ_SILVER_LAVA].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_GTG_MQ_SILVER_WATER] = Item(RG_GTG_MQ_SILVER_WATER, Text{ "Training Ground Silver: Water" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GTG_MQ_SILVER_WATER].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_GANONS_CASTLE_MQ_SILVER_FIRE] = Item(RG_GANONS_CASTLE_MQ_SILVER_FIRE, Text{ "Ganon's Castle Silver: Fire" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GANONS_CASTLE_MQ_SILVER_FIRE].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_GANONS_CASTLE_MQ_SILVER_WATER] = Item(RG_GANONS_CASTLE_MQ_SILVER_WATER, Text{ "Ganon's Castle Silver: Water" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GANONS_CASTLE_MQ_SILVER_WATER].SetCustomDrawFunc(Randomizer_DrawSilverRupee); + itemTable[RG_GANONS_CASTLE_MQ_SILVER_SHADOW] = Item(RG_GANONS_CASTLE_MQ_SILVER_SHADOW, Text{ "Ganon's Castle Silver: Shadow" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_NONE, RG_NONE, OBJECT_GI_RUPY, GID_KEY_SMALL, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_SHORT, ITEM_CATEGORY_SMALL_KEY,MOD_RANDOMIZER); + itemTable[RG_GANONS_CASTLE_MQ_SILVER_SHADOW].SetCustomDrawFunc(Randomizer_DrawSilverRupee); // Dungeon Rewards itemTable[RG_KOKIRI_EMERALD] = Item(RG_KOKIRI_EMERALD, Text{ "Kokiri's Emerald", "Émeraude Kokiri", "Kokiri-Smaragd" }, ITEMTYPE_DUNGEONREWARD, 0xCB, true, LOGIC_KOKIRI_EMERALD, RHT_KOKIRI_EMERALD, ITEM_KOKIRI_EMERALD, OBJECT_GI_JEWEL, GID_KOKIRI_EMERALD, 0x80, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_GORON_RUBY] = Item(RG_GORON_RUBY, Text{ "Goron's Ruby", "Rubis Goron", "Goronen-Rubin" }, ITEMTYPE_DUNGEONREWARD, 0xCC, true, LOGIC_GORON_RUBY, RHT_GORON_RUBY, ITEM_GORON_RUBY, OBJECT_GI_JEWEL, GID_GORON_RUBY, 0x81, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); @@ -349,7 +408,7 @@ void Rando::StaticData::InitItemTable() { itemTable[RG_OCARINA_C_RIGHT_BUTTON] = Item(RG_OCARINA_C_RIGHT_BUTTON, Text{ "Ocarina C Right Button", "Touche C-Droit de l'Ocarina", "C-Rechts-Taste der Okarina" }, ITEMTYPE_ITEM, GI_MAP, true, LOGIC_OCARINA_C_RIGHT_BUTTON, RHT_OCARINA_C_RIGHT_BUTTON, RG_OCARINA_C_RIGHT_BUTTON, OBJECT_GI_MAP, GID_STONE_OF_AGONY, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_OCARINA_C_RIGHT_BUTTON].SetCustomDrawFunc(Randomizer_DrawOcarinaButton); - itemTable[RG_BRONZE_SCALE] = Item(RG_BRONZE_SCALE, Text{ "Bronze Scale", "Écaille de Bronze", "Bronzene Schuppe" }, ITEMTYPE_ITEM, GI_SCALE_SILVER, true, LOGIC_PROGRESSIVE_WALLET, RHT_BRONZE_SCALE, RG_BRONZE_SCALE, OBJECT_GI_SCALE, GID_SCALE_SILVER, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); + itemTable[RG_BRONZE_SCALE] = Item(RG_BRONZE_SCALE, Text{ "Bronze Scale", "Écaille de Bronze", "Bronzene Schuppe" }, ITEMTYPE_ITEM, GI_SCALE_SILVER, true, LOGIC_NONE, RHT_BRONZE_SCALE, RG_BRONZE_SCALE, OBJECT_GI_SCALE, GID_SCALE_SILVER, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); itemTable[RG_BRONZE_SCALE].SetCustomDrawFunc(Randomizer_DrawBronzeScale); itemTable[RG_BOMBCHU_BAG] = Item(RG_BOMBCHU_BAG, Text{ "Bombchu Bag", "Sac de Missiles Teigneux", "Krabbelminentasche" }, ITEMTYPE_ITEM, RG_BOMBCHU_BAG, true, LOGIC_BOMBCHUS, RHT_BOMBCHU_BAG, RG_BOMBCHU_BAG, OBJECT_GI_BOMB_2, GID_BOMBCHU, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER); diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp index 001ad5d81..5dd3e1dd0 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/bottom_of_the_well.cpp @@ -156,6 +156,11 @@ void RegionTable_Init_BottomOfTheWell() { LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_7, logic->CanCutShrubs() && logic->BlastOrSmash()), LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_8, logic->CanCutShrubs() && logic->BlastOrSmash()), LOCATION(RC_BOTTOM_OF_THE_WELL_BASEMENT_BEHIND_ROCKS_GRASS_9, logic->CanCutShrubs() && logic->BlastOrSmash()), + LOCATION(RC_BOTW_SILVER_1, true), + LOCATION(RC_BOTW_SILVER_2, true), + LOCATION(RC_BOTW_SILVER_3, true), + LOCATION(RC_BOTW_SILVER_4, true), + LOCATION(RC_BOTW_SILVER_5, true), }, { //Exits Entrance(RR_BOTTOM_OF_THE_WELL_SOUTHWEST_ROOM, []{return logic->IsChild && logic->CanPassEnemy(RE_BIG_SKULLTULA);}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp index d8e64f996..7402a844d 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/dodongos_cavern.cpp @@ -313,6 +313,11 @@ void RegionTable_Init_DodongosCavern() { LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_POT_4, logic->CanBreakPots()), LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_1, logic->CanBreakCrates()), LOCATION(RC_DODONGOS_CAVERN_MQ_STAIRCASE_LOWER_CRATE_2, logic->CanBreakCrates()), + LOCATION(RC_DODONGOS_CAVERN_MQ_SILVER_1, true), + LOCATION(RC_DODONGOS_CAVERN_MQ_SILVER_2, true), + LOCATION(RC_DODONGOS_CAVERN_MQ_SILVER_3, true), + LOCATION(RC_DODONGOS_CAVERN_MQ_SILVER_4, true), + LOCATION(RC_DODONGOS_CAVERN_MQ_SILVER_5, true), }, { //Exits Entrance(RR_DODONGOS_CAVERN_MQ_LOBBY, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp index 8571ba384..68e2b67eb 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/ganons_castle.cpp @@ -60,6 +60,11 @@ void RegionTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, logic->CanKillEnemy(RE_WOLFOS)), LOCATION(RC_GANONS_CASTLE_FOREST_TRIAL_POT_1, logic->CanBreakPots() && (logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_DINS_FIRE) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT))))), LOCATION(RC_GANONS_CASTLE_FOREST_TRIAL_POT_2, logic->CanBreakPots() && (logic->CanUse(RG_FIRE_ARROWS) || (logic->CanUse(RG_DINS_FIRE) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT))))), + LOCATION(RC_GANONS_CASTLE_SILVER_FOREST_1, true), + LOCATION(RC_GANONS_CASTLE_SILVER_FOREST_2, true), + LOCATION(RC_GANONS_CASTLE_SILVER_FOREST_3, true), + LOCATION(RC_GANONS_CASTLE_SILVER_FOREST_4, true), + LOCATION(RC_GANONS_CASTLE_SILVER_FOREST_5, true), }, {}); areaTable[RR_GANONS_CASTLE_FIRE_TRIAL] = Region("Ganon's Castle Fire Trial", SCENE_INSIDE_GANONS_CASTLE, { @@ -70,6 +75,11 @@ void RegionTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_FIRE_TRIAL_POT_1, logic->CanBreakPots() && logic->CanUse(RG_GORON_TUNIC) && logic->CanUse(RG_GOLDEN_GAUNTLETS) && logic->CanUse(RG_LONGSHOT)), LOCATION(RC_GANONS_CASTLE_FIRE_TRIAL_POT_2, logic->CanBreakPots() && logic->CanUse(RG_GORON_TUNIC) && logic->CanUse(RG_GOLDEN_GAUNTLETS) && logic->CanUse(RG_LONGSHOT)), LOCATION(RC_GANONS_CASTLE_FIRE_TRIAL_HEART, logic->CanUse(RG_GORON_TUNIC)), + LOCATION(RC_GANONS_CASTLE_SILVER_FIRE_1, true), + LOCATION(RC_GANONS_CASTLE_SILVER_FIRE_2, true), + LOCATION(RC_GANONS_CASTLE_SILVER_FIRE_3, true), + LOCATION(RC_GANONS_CASTLE_SILVER_FIRE_4, true), + LOCATION(RC_GANONS_CASTLE_SILVER_FIRE_5, true), }, {}); areaTable[RR_GANONS_CASTLE_WATER_TRIAL] = Region("Ganon's Castle Water Trial", SCENE_INSIDE_GANONS_CASTLE, { @@ -114,6 +124,11 @@ void RegionTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_POT_2, ((ctx->GetTrickOption(RT_GANON_SPIRIT_TRIAL_HOOKSHOT) && logic->CanJumpslashExceptHammer()) || logic->CanUse(RG_HOOKSHOT)) && logic->CanUse(RG_BOMBCHU_5) && logic->CanUse(RG_FAIRY_BOW) && (logic->CanUse(RG_MIRROR_SHIELD) || (ctx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS)))), LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG)), LOCATION(RC_GANONS_CASTLE_SPIRIT_TRIAL_HEART, true), + LOCATION(RC_GANONS_CASTLE_SILVER_SPIRIT_1, true), + LOCATION(RC_GANONS_CASTLE_SILVER_SPIRIT_2, true), + LOCATION(RC_GANONS_CASTLE_SILVER_SPIRIT_3, true), + LOCATION(RC_GANONS_CASTLE_SILVER_SPIRIT_4, true), + LOCATION(RC_GANONS_CASTLE_SILVER_SPIRIT_5, true), }, {}); areaTable[RR_GANONS_CASTLE_LIGHT_TRIAL] = Region("Ganon's Castle Light Trial", SCENE_INSIDE_GANONS_CASTLE, { @@ -132,6 +147,11 @@ void RegionTable_Init_GanonsCastle() { LOCATION(RC_GANONS_CASTLE_LIGHT_TRIAL_BOULDER_POT_1, logic->CanBreakPots() && logic->SmallKeys(RR_GANONS_CASTLE, 2)), LOCATION(RC_GANONS_CASTLE_LIGHT_TRIAL_POT_1, logic->CanBreakPots() && logic->CanUse(RG_HOOKSHOT) && logic->SmallKeys(RR_GANONS_CASTLE, 2) && (ctx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH))), LOCATION(RC_GANONS_CASTLE_LIGHT_TRIAL_POT_2, logic->CanBreakPots() && logic->CanUse(RG_HOOKSHOT) && logic->SmallKeys(RR_GANONS_CASTLE, 2) && (ctx->GetTrickOption(RT_LENS_GANON) || logic->CanUse(RG_LENS_OF_TRUTH))), + LOCATION(RC_GANONS_CASTLE_SILVER_LIGHT_1, true), + LOCATION(RC_GANONS_CASTLE_SILVER_LIGHT_2, true), + LOCATION(RC_GANONS_CASTLE_SILVER_LIGHT_3, true), + LOCATION(RC_GANONS_CASTLE_SILVER_LIGHT_4, true), + LOCATION(RC_GANONS_CASTLE_SILVER_LIGHT_5, true), }, {}); #pragma endregion @@ -216,7 +236,14 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_FOREST_TRIAL_BEAMOS_ROOM, []{return true;}), }); - areaTable[RR_GANONS_CASTLE_MQ_FIRE_TRIAL_MAIN_ROOM] = Region("Ganon's Castle MQ Fire Trial Main Room", SCENE_INSIDE_GANONS_CASTLE, {}, {}, { + areaTable[RR_GANONS_CASTLE_MQ_FIRE_TRIAL_MAIN_ROOM] = Region("Ganon's Castle MQ Fire Trial Main Room", SCENE_INSIDE_GANONS_CASTLE, {}, { + //Locations + LOCATION(RC_GANONS_CASTLE_MQ_SILVER_FIRE_1, true), + LOCATION(RC_GANONS_CASTLE_MQ_SILVER_FIRE_2, true), + LOCATION(RC_GANONS_CASTLE_MQ_SILVER_FIRE_3, true), + LOCATION(RC_GANONS_CASTLE_MQ_SILVER_FIRE_4, true), + LOCATION(RC_GANONS_CASTLE_MQ_SILVER_FIRE_5, true), + }, { //Exits Entrance(RR_GANONS_CASTLE_MQ_MAIN, []{return true;}), //2 checks, 1 for the rupees, 1 for actually making it, as the rupees are permanent but throwing a pillar is not @@ -246,7 +273,14 @@ void RegionTable_Init_GanonsCastle() { Entrance(RR_GANONS_CASTLE_MQ_WATER_TRIAL_BLOCK_ROOM, []{return logic->SmallKeys(RR_GANONS_CASTLE, 3) && Here(RR_GANONS_CASTLE_MQ_WATER_TRIAL_GEYSER_ROOM, []{return logic->BlueFire();});}), }); - areaTable[RR_GANONS_CASTLE_MQ_WATER_TRIAL_BLOCK_ROOM] = Region("Ganon's Castle MQ Water Trial Block Room", 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, {}, { + //Locations + LOCATION(RC_GANONS_CASTLE_MQ_SILVER_WATER_1, true), + LOCATION(RC_GANONS_CASTLE_MQ_SILVER_WATER_2, true), + LOCATION(RC_GANONS_CASTLE_MQ_SILVER_WATER_3, true), + LOCATION(RC_GANONS_CASTLE_MQ_SILVER_WATER_4, true), + LOCATION(RC_GANONS_CASTLE_MQ_SILVER_WATER_5, true), + }, { //Exits Entrance(RR_GANONS_CASTLE_MQ_WATER_TRIAL_GEYSER_ROOM, []{return logic->SmallKeys(RR_GANONS_CASTLE, 3);}), //This assumes there's no way for child to have blue fire and not adult. @@ -310,6 +344,12 @@ void RegionTable_Init_GanonsCastle() { areaTable[RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_FAR_SIDE] = Region("Ganon's Castle MQ Shadow Trial Far Side", SCENE_INSIDE_GANONS_CASTLE, {}, { //Locations LOCATION(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, logic->CanHitEyeTargets()), + // TODO move these to their proper region + LOCATION(RC_GANONS_CASTLE_MQ_SILVER_SHADOW_1, true), + LOCATION(RC_GANONS_CASTLE_MQ_SILVER_SHADOW_2, true), + LOCATION(RC_GANONS_CASTLE_MQ_SILVER_SHADOW_3, true), + LOCATION(RC_GANONS_CASTLE_MQ_SILVER_SHADOW_4, true), + LOCATION(RC_GANONS_CASTLE_MQ_SILVER_SHADOW_5, true), }, { //Exits Entrance(RR_GANONS_CASTLE_MQ_SHADOW_TRIAL_BEAMOS_TORCH, []{return logic->CanUse(RG_FIRE_ARROWS) || logic->CanUse(RG_HOVER_BOOTS);}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp index 6c891abc0..479a98f31 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/gerudo_training_ground.cpp @@ -25,6 +25,11 @@ void RegionTable_Init_GerudoTrainingGround() { LOCATION(RC_GERUDO_TRAINING_GROUND_ENTRANCE_STORMS_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), LOCATION(RC_GERUDO_TRAINING_GROUND_BEAMOS_SOUTH_HEART, true), LOCATION(RC_GERUDO_TRAINING_GROUND_BEAMOS_EAST_HEART, true), + LOCATION(RC_GTG_SILVER_SLOPE_1, true), + LOCATION(RC_GTG_SILVER_SLOPE_2, true), + LOCATION(RC_GTG_SILVER_SLOPE_3, true), + LOCATION(RC_GTG_SILVER_SLOPE_4, true), + LOCATION(RC_GTG_SILVER_SLOPE_5, true), }, { //Exits Entrance(RR_GERUDO_TRAINING_GROUND_ENTRYWAY, []{return true;}), @@ -59,6 +64,16 @@ void RegionTable_Init_GerudoTrainingGround() { areaTable[RR_GERUDO_TRAINING_GROUND_LAVA_ROOM] = Region("Gerudo Training Ground Lava Room", SCENE_GERUDO_TRAINING_GROUND, {}, { //Locations LOCATION(RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 24), + LOCATION(RC_GTG_SILVER_LAVA_1, true), + LOCATION(RC_GTG_SILVER_LAVA_2, true), + LOCATION(RC_GTG_SILVER_LAVA_3, true), + LOCATION(RC_GTG_SILVER_LAVA_4, true), + LOCATION(RC_GTG_SILVER_LAVA_5, true), + LOCATION(RC_GTG_SILVER_WATER_1, logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 24), + LOCATION(RC_GTG_SILVER_WATER_2, logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 24), + LOCATION(RC_GTG_SILVER_WATER_3, logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 24), + LOCATION(RC_GTG_SILVER_WATER_4, logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 24), + LOCATION(RC_GTG_SILVER_WATER_5, logic->CanUse(RG_HOOKSHOT) && logic->CanUse(RG_SONG_OF_TIME) && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 24), }, { //Exits Entrance(RR_GERUDO_TRAINING_GROUND_CENTRAL_MAZE_RIGHT, []{return logic->CanUse(RG_SONG_OF_TIME) || logic->IsChild;}), @@ -170,7 +185,14 @@ void RegionTable_Init_GerudoTrainingGround() { Entrance(RR_GERUDO_TRAINING_GROUND_MQ_LEFT_SIDE, []{return Here(RR_GERUDO_TRAINING_GROUND_MQ_SAND_ROOM, []{return logic->CanKillEnemy(RE_IRON_KNUCKLE);});}), }); - areaTable[RR_GERUDO_TRAINING_GROUND_MQ_LEFT_SIDE] = Region("Gerudo Training Ground MQ Left Side", SCENE_GERUDO_TRAINING_GROUND, {}, {}, { + areaTable[RR_GERUDO_TRAINING_GROUND_MQ_LEFT_SIDE] = Region("Gerudo Training Ground MQ Left Side", SCENE_GERUDO_TRAINING_GROUND, {}, { + //Locations + LOCATION(RC_GTG_MQ_SILVER_SLOPE_1, true), + LOCATION(RC_GTG_MQ_SILVER_SLOPE_2, true), + LOCATION(RC_GTG_MQ_SILVER_SLOPE_3, true), + LOCATION(RC_GTG_MQ_SILVER_SLOPE_4, true), + LOCATION(RC_GTG_MQ_SILVER_SLOPE_5, true), + }, { //Exits Entrance(RR_GERUDO_TRAINING_GROUND_MQ_SAND_ROOM, []{return true;}), Entrance(RR_GERUDO_TRAINING_GROUND_MQ_STALFOS_ROOM, []{return Here(RR_GERUDO_TRAINING_GROUND_MQ_LEFT_SIDE, []{return logic->CanUse(RG_LONGSHOT) || ctx->GetTrickOption(RT_GTG_MQ_WITHOUT_HOOKSHOT) || (ctx->GetTrickOption(RT_GTG_MQ_WITH_HOOKSHOT) && logic->IsAdult && logic->CanJumpslash() && logic->CanUse(RG_HOOKSHOT));});}), @@ -276,7 +298,14 @@ void RegionTable_Init_GerudoTrainingGround() { //Events //this torch shot is possible as child but tight and obtuse enough to be a trick EventAccess(&logic->GTGPlatformSilverRupees, []{return ((logic->CanUse(RG_FAIRY_BOW) && logic->IsAdult) || logic->CanUse(RG_FIRE_ARROWS)) && logic->CanUse(RG_HOVER_BOOTS);}), - }, {}, { + }, { + LOCATION(RC_GTG_MQ_SILVER_LAVA_1, logic->GTGPlatformSilverRupees), + LOCATION(RC_GTG_MQ_SILVER_LAVA_2, logic->GTGPlatformSilverRupees), + LOCATION(RC_GTG_MQ_SILVER_LAVA_3, logic->GTGPlatformSilverRupees), + LOCATION(RC_GTG_MQ_SILVER_LAVA_4, logic->GTGPlatformSilverRupees), + LOCATION(RC_GTG_MQ_SILVER_LAVA_5, logic->GTGPlatformSilverRupees), + LOCATION(RC_GTG_MQ_SILVER_LAVA_6, logic->GTGPlatformSilverRupees), + }, { //Exits Entrance(RR_GERUDO_TRAINING_GROUND_MQ_LEDGE_SIDE_PLATFORMS, []{return ((logic->CanUse(RG_FAIRY_BOW) && logic->IsAdult) || logic->CanUse(RG_FIRE_ARROWS)) && logic->CanUse(RG_HOVER_BOOTS);}), Entrance(RR_GERUDO_TRAINING_GROUND_MQ_PLATFORMS_UNLIT_TORCH, []{return (logic->CanUse(RG_FAIRY_BOW) && logic->IsAdult) || logic->CanUse(RG_FIRE_ARROWS) || logic->CanUse(RG_LONGSHOT);}), @@ -288,6 +317,9 @@ void RegionTable_Init_GerudoTrainingGround() { //Locations //it is possible to snipe the stingers with bow or sling before dropping in, or just get really lucky, and avoid needing to take damage, but that might be trick worthy LOCATION(RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, logic->HasFireSource() && logic->CanUse(RG_IRON_BOOTS) && logic->WaterTimer() >= 24 && logic->HasItem(RG_BRONZE_SCALE) && logic->TakeDamage()), + LOCATION(RC_GTG_MQ_SILVER_WATER_1, true), + LOCATION(RC_GTG_MQ_SILVER_WATER_2, true), + LOCATION(RC_GTG_MQ_SILVER_WATER_3, true), }, { //Exits Entrance(RR_GERUDO_TRAINING_GROUND_MQ_PLATFORMS_UNLIT_TORCH, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp index 5151377ce..07db385e6 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/ice_cavern.cpp @@ -53,6 +53,16 @@ void RegionTable_Init_IceCavern() { LOCATION(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_1, logic->BlueFire() && (logic->CanUse(RG_SONG_OF_TIME) || logic->CanUse(RG_BOOMERANG))), LOCATION(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_2, logic->BlueFire() && (logic->CanUse(RG_SONG_OF_TIME) || logic->CanUse(RG_BOOMERANG))), LOCATION(RC_ICE_CAVERN_SLIDING_BLOCK_RUPEE_3, logic->BlueFire() && (logic->CanUse(RG_SONG_OF_TIME) || logic->CanUse(RG_BOOMERANG))), + LOCATION(RC_ICE_CAVERN_SILVER_BLADES_1, true), + LOCATION(RC_ICE_CAVERN_SILVER_BLADES_2, true), + LOCATION(RC_ICE_CAVERN_SILVER_BLADES_3, true), + LOCATION(RC_ICE_CAVERN_SILVER_BLADES_4, true), + LOCATION(RC_ICE_CAVERN_SILVER_BLADES_5, true), + LOCATION(RC_ICE_CAVERN_SILVER_BLOCK_1, true), + LOCATION(RC_ICE_CAVERN_SILVER_BLOCK_2, true), + LOCATION(RC_ICE_CAVERN_SILVER_BLOCK_3, true), + LOCATION(RC_ICE_CAVERN_SILVER_BLOCK_4, true), + LOCATION(RC_ICE_CAVERN_SILVER_BLOCK_5, true), }, {}); #pragma endregion diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp index d276fc418..e8e8db84f 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/shadow_temple.cpp @@ -46,6 +46,12 @@ void RegionTable_Init_ShadowTemple() { LOCATION(RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, logic->CanUse(RG_HOVER_BOOTS) || logic->CanUse(RG_HOOKSHOT)), LOCATION(RC_SHADOW_TEMPLE_GS_NEAR_SHIP, false), LOCATION(RC_SHADOW_TEMPLE_BEAMOS_STORM_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), + // TODO which of these require hoverboots/hookshot? + LOCATION(RC_SHADOW_SILVER_BLADES_1, true), + LOCATION(RC_SHADOW_SILVER_BLADES_2, true), + LOCATION(RC_SHADOW_SILVER_BLADES_3, true), + LOCATION(RC_SHADOW_SILVER_BLADES_4, true), + LOCATION(RC_SHADOW_SILVER_BLADES_5, true), }, { //Exits Entrance(RR_SHADOW_TEMPLE_HUGE_PIT, []{return logic->HasExplosives() && logic->IsAdult && logic->SmallKeys(RR_SHADOW_TEMPLE, 1, 2);}), @@ -72,6 +78,16 @@ void RegionTable_Init_ShadowTemple() { LOCATION(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_LEFT_HEART, (logic->CanUse(RG_SONG_OF_TIME) && logic->IsAdult) || logic->CanUse(RG_BOOMERANG)), LOCATION(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_RIGHT_HEART, (logic->CanUse(RG_SONG_OF_TIME) && logic->IsAdult) || logic->CanUse(RG_BOOMERANG)), LOCATION(RC_SHADOW_TEMPLE_PIT_STORM_FAIRY, logic->CanUse(RG_SONG_OF_STORMS)), + LOCATION(RC_SHADOW_SILVER_PIT_1, true), + LOCATION(RC_SHADOW_SILVER_PIT_2, true), + LOCATION(RC_SHADOW_SILVER_PIT_3, true), + LOCATION(RC_SHADOW_SILVER_PIT_4, true), + LOCATION(RC_SHADOW_SILVER_PIT_5, true), + LOCATION(RC_SHADOW_SILVER_SPIKES_1, logic->SmallKeys(RR_SHADOW_TEMPLE, 2, 3) && ((ctx->GetTrickOption(RT_LENS_SHADOW_PLATFORM) && ctx->GetTrickOption(RT_LENS_SHADOW)) || logic->CanUse(RG_LENS_OF_TRUTH))), + LOCATION(RC_SHADOW_SILVER_SPIKES_2, logic->SmallKeys(RR_SHADOW_TEMPLE, 2, 3) && ((ctx->GetTrickOption(RT_LENS_SHADOW_PLATFORM) && ctx->GetTrickOption(RT_LENS_SHADOW)) || logic->CanUse(RG_LENS_OF_TRUTH))), + LOCATION(RC_SHADOW_SILVER_SPIKES_3, logic->SmallKeys(RR_SHADOW_TEMPLE, 2, 3) && ((ctx->GetTrickOption(RT_LENS_SHADOW_PLATFORM) && ctx->GetTrickOption(RT_LENS_SHADOW)) || logic->CanUse(RG_LENS_OF_TRUTH))), + LOCATION(RC_SHADOW_SILVER_SPIKES_4, logic->SmallKeys(RR_SHADOW_TEMPLE, 2, 3) && ((ctx->GetTrickOption(RT_LENS_SHADOW_PLATFORM) && ctx->GetTrickOption(RT_LENS_SHADOW)) || logic->CanUse(RG_LENS_OF_TRUTH))), + LOCATION(RC_SHADOW_SILVER_SPIKES_5, logic->SmallKeys(RR_SHADOW_TEMPLE, 2, 3) && ((ctx->GetTrickOption(RT_LENS_SHADOW_PLATFORM) && ctx->GetTrickOption(RT_LENS_SHADOW)) || logic->CanUse(RG_LENS_OF_TRUTH))), }, { //Exits Entrance(RR_SHADOW_TEMPLE_WIND_TUNNEL, []{return ((ctx->GetTrickOption(RT_LENS_SHADOW_PLATFORM) && ctx->GetTrickOption(RT_LENS_SHADOW)) || logic->CanUse(RG_LENS_OF_TRUTH)) && logic->CanUse(RG_HOOKSHOT) && logic->SmallKeys(RR_SHADOW_TEMPLE, 3, 4);}), @@ -171,6 +187,11 @@ void RegionTable_Init_ShadowTemple() { areaTable[RR_SHADOW_TEMPLE_MQ_B2_SPINNING_BLADE_ROOM] = Region("Shadow Temple MQ B2 Spinning Blade Room", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_MAP_CHEST, logic->CanPassEnemy(RE_BIG_SKULLTULA) && (logic->CanUse(RG_HOOKSHOT) || (logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)))), + LOCATION(RC_SHADOW_MQ_SILVER_BLADES_1, true), + LOCATION(RC_SHADOW_MQ_SILVER_BLADES_2, true), + LOCATION(RC_SHADOW_MQ_SILVER_BLADES_3, true), + LOCATION(RC_SHADOW_MQ_SILVER_BLADES_4, true), + LOCATION(RC_SHADOW_MQ_SILVER_BLADES_5, true), }, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_FIRST_BEAMOS, []{return Here(RR_SHADOW_TEMPLE_MQ_B2_SPINNING_BLADE_ROOM, []{return logic->CanKillEnemy(RE_BIG_SKULLTULA) && (logic->CanUse(RG_HOOKSHOT) || (logic->IsAdult && logic->CanUse(RG_HOVER_BOOTS)));});}), @@ -215,6 +236,16 @@ void RegionTable_Init_ShadowTemple() { ((ctx->GetTrickOption(RT_LENS_SHADOW_MQ) && (ctx->GetTrickOption(RT_LENS_SHADOW_MQ_INVISIBLE_BLADES) || logic->IsChild || logic->CanUse(RG_NAYRUS_LOVE))) || logic->CanUse(RG_LENS_OF_TRUTH))), LOCATION(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_LEFT_HEART, (logic->CanUse(RG_SONG_OF_TIME) && logic->IsAdult) || (ctx->GetTrickOption(RT_SHADOW_MQ_INVISIBLE_BLADES) && logic->EffectiveHealth() > 1) || logic->CanUse(RG_BOOMERANG)), LOCATION(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_RIGHT_HEART, (logic->CanUse(RG_SONG_OF_TIME) && logic->IsAdult) || (ctx->GetTrickOption(RT_SHADOW_MQ_INVISIBLE_BLADES) && logic->EffectiveHealth() > 1) || logic->CanUse(RG_BOOMERANG)), + LOCATION(RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_1, true), + LOCATION(RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_2, true), + LOCATION(RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_3, true), + LOCATION(RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_4, true), + LOCATION(RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_5, true), + LOCATION(RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_6, true), + LOCATION(RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_7, true), + LOCATION(RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_8, true), + LOCATION(RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_9, true), + LOCATION(RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_10, true), }, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_UPPER_HUGE_PIT, []{return true;}), @@ -223,6 +254,11 @@ void RegionTable_Init_ShadowTemple() { areaTable[RR_SHADOW_TEMPLE_MQ_LOWER_HUGE_PIT] = Region("Shadow Temple MQ Lower Huge Pit", SCENE_SHADOW_TEMPLE, {}, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, logic->CanUse(RG_LONGSHOT)), + LOCATION(RC_SHADOW_MQ_SILVER_PIT_1, true), + LOCATION(RC_SHADOW_MQ_SILVER_PIT_2, true), + LOCATION(RC_SHADOW_MQ_SILVER_PIT_3, true), + LOCATION(RC_SHADOW_MQ_SILVER_PIT_4, true), + LOCATION(RC_SHADOW_MQ_SILVER_PIT_5, true), }, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_STONE_UMBRELLA_ROOM, []{return Here(RR_SHADOW_TEMPLE_MQ_LOWER_HUGE_PIT, []{return logic->CanJumpslash() || logic->HasExplosives();});}), @@ -270,6 +306,16 @@ void RegionTable_Init_ShadowTemple() { }, { //Locations LOCATION(RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, logic->CanKillEnemy(RE_REDEAD) && (ctx->GetTrickOption(RT_LENS_SHADOW_MQ) || logic->TakeDamage() || logic->CanUse(RG_LENS_OF_TRUTH))), + LOCATION(RC_SHADOW_MQ_SILVER_SPIKES_1, true), + LOCATION(RC_SHADOW_MQ_SILVER_SPIKES_2, true), + LOCATION(RC_SHADOW_MQ_SILVER_SPIKES_3, true), + LOCATION(RC_SHADOW_MQ_SILVER_SPIKES_4, true), + LOCATION(RC_SHADOW_MQ_SILVER_SPIKES_5, true), + LOCATION(RC_SHADOW_MQ_SILVER_SPIKES_6, true), + LOCATION(RC_SHADOW_MQ_SILVER_SPIKES_7, true), + LOCATION(RC_SHADOW_MQ_SILVER_SPIKES_8, true), + LOCATION(RC_SHADOW_MQ_SILVER_SPIKES_9, true), + LOCATION(RC_SHADOW_MQ_SILVER_SPIKES_10, true), }, { //Exits Entrance(RR_SHADOW_TEMPLE_MQ_STALFOS_ROOM, []{return logic->MQShadowFloorSpikeRupees;}), diff --git a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp index e2a13ecc1..8c0349f78 100644 --- a/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp +++ b/soh/soh/Enhancements/randomizer/location_access/dungeons/spirit_temple.cpp @@ -41,6 +41,11 @@ void RegionTable_Init_SpiritTemple() { LOCATION(RC_SPIRIT_TEMPLE_ANUBIS_POT_4, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU))) && (logic->HasExplosives() || ((logic->CanUse(RG_NUTS) || logic->CanUse(RG_BOOMERANG)) && (logic->CanUse(RG_STICKS) || logic->CanUse(RG_KOKIRI_SWORD) || logic->CanUse(RG_FAIRY_SLINGSHOT))))), LOCATION(RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_1, logic->CanBreakSmallCrates()), LOCATION(RC_SPIRIT_TEMPLE_BEFORE_CHILD_CLIMB_SMALL_CRATE_2, logic->CanBreakSmallCrates()), + LOCATION(RC_SPIRIT_SILVER_CHILD_1, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU)))), + LOCATION(RC_SPIRIT_SILVER_CHILD_2, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU)))), + LOCATION(RC_SPIRIT_SILVER_CHILD_3, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU)))), + LOCATION(RC_SPIRIT_SILVER_CHILD_4, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU)))), + LOCATION(RC_SPIRIT_SILVER_CHILD_5, (logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_FAIRY_SLINGSHOT) || (logic->CanUse(RG_BOMBCHU_5) && ctx->GetTrickOption(RT_SPIRIT_CHILD_CHU)))), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_CHILD_CLIMB, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 1);}), @@ -55,6 +60,11 @@ void RegionTable_Init_SpiritTemple() { (logic->IsChild && logic->SmallKeys(RR_SPIRIT_TEMPLE, 5) && logic->HasProjectile(HasProjectileAge::Child)) || (logic->SmallKeys(RR_SPIRIT_TEMPLE, 2) && logic->CanUse(RG_SILVER_GAUNTLETS) && (logic->HasProjectile(HasProjectileAge::Adult) || (logic->TakeDamage() && logic->CanJumpslashExceptHammer())))), LOCATION(RC_SPIRIT_TEMPLE_CHILD_CLIMB_POT_1, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_SILVER_SUN_1, true), + LOCATION(RC_SPIRIT_SILVER_SUN_2, true), + LOCATION(RC_SPIRIT_SILVER_SUN_3, true), + LOCATION(RC_SPIRIT_SILVER_SUN_4, true), + LOCATION(RC_SPIRIT_SILVER_SUN_5, true), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER, []{return logic->HasExplosives() || (ctx->GetOption(RSK_SUNLIGHT_ARROWS) && logic->CanUse(RG_LIGHT_ARROWS));}), @@ -68,6 +78,11 @@ void RegionTable_Init_SpiritTemple() { LOCATION(RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, logic->SmallKeys(RR_SPIRIT_TEMPLE, 3)), LOCATION(RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, logic->CanUse(RG_SONG_OF_TIME) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_BOMBCHU_5) || (logic->CanUse(RG_BOMB_BAG) && ctx->GetTrickOption(RT_SPIRIT_LOWER_ADULT_SWITCH)))), LOCATION(RC_SPIRIT_TEMPLE_BOULDER_ROOM_SUN_FAIRY, logic->CanUse(RG_SUNS_SONG) && (logic->CanUse(RG_FAIRY_BOW) || logic->CanUse(RG_HOOKSHOT) || logic->CanUse(RG_FAIRY_SLINGSHOT) || logic->CanUse(RG_BOOMERANG) || logic->CanUse(RG_BOMBCHU_5) || (logic->CanUse(RG_BOMB_BAG) && logic->IsAdult && ctx->GetTrickOption(RT_SPIRIT_LOWER_ADULT_SWITCH))) && (logic->CanUse(RG_HOVER_BOOTS) || logic->CanJumpslash())), + LOCATION(RC_SPIRIT_SILVER_BOULDERS_1, true), + LOCATION(RC_SPIRIT_SILVER_BOULDERS_2, true), + LOCATION(RC_SPIRIT_SILVER_BOULDERS_3, true), + LOCATION(RC_SPIRIT_SILVER_BOULDERS_4, true), + LOCATION(RC_SPIRIT_SILVER_BOULDERS_5, true), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_CENTRAL_CHAMBER, []{return logic->SmallKeys(RR_SPIRIT_TEMPLE, 1);}), @@ -161,6 +176,11 @@ void RegionTable_Init_SpiritTemple() { LOCATION(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_2, logic->CanBreakPots()), LOCATION(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_3, logic->CanBreakPots()), LOCATION(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_POT_4, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_MQ_SILVER_LOBBY_1, true), + LOCATION(RC_SPIRIT_MQ_SILVER_LOBBY_2, true), + LOCATION(RC_SPIRIT_MQ_SILVER_LOBBY_3, true), + LOCATION(RC_SPIRIT_MQ_SILVER_LOBBY_4, true), + LOCATION(RC_SPIRIT_MQ_SILVER_LOBBY_5, true), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_ENTRYWAY, []{return true;}), @@ -482,6 +502,11 @@ void RegionTable_Init_SpiritTemple() { //Locations LOCATION(RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_1, logic->CanBreakPots()), LOCATION(RC_SPIRIT_TEMPLE_MQ_LONG_CLIMB_POT_2, logic->CanBreakPots()), + LOCATION(RC_SPIRIT_MQ_SILVER_BIG_WALL_1, true), + LOCATION(RC_SPIRIT_MQ_SILVER_BIG_WALL_2, true), + LOCATION(RC_SPIRIT_MQ_SILVER_BIG_WALL_3, true), + LOCATION(RC_SPIRIT_MQ_SILVER_BIG_WALL_4, true), + LOCATION(RC_SPIRIT_MQ_SILVER_BIG_WALL_5, true), }, { //Exits Entrance(RR_SPIRIT_TEMPLE_MQ_FOUR_BEAMOS_ROOM, []{return true;}), diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index 50d11d9b2..c6c4ef1d2 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -476,6 +476,9 @@ void Settings::CreateOptionDescriptions() { "Overworld - Only freestanding rupees & hearts that are outside of dungeons.\n" "\n" "All Items - Shuffle all freestanding rupees & hearts."; + mOptionDescriptions[RSK_SHUFFLE_SILVER] = "Silver rupees will be shuffled.\n" + "Items will be added to pool which completes the silver rupee puzzles,\n" + "while silver rupee locations will be random items."; mOptionDescriptions[RSK_SHUFFLE_FAIRIES] = "Shuffle fairy locations."; mOptionDescriptions[RSK_SHUFFLE_GRASS] = "Grass/Bushes will drop a randomized item the first time they're cut and collected. " diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 2a2acd5c7..87ad5fee7 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -3304,6 +3304,160 @@ std::map rcToRandomizerInf = { RC_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, RAND_INF_SPIRIT_TEMPLE_MQ_BEAMOS_SMALL_CRATE, }, + { RC_SHADOW_SILVER_BLADES_1, RAND_INF_SHADOW_SILVER_BLADES_1 }, + { RC_SHADOW_SILVER_BLADES_2, RAND_INF_SHADOW_SILVER_BLADES_2 }, + { RC_SHADOW_SILVER_BLADES_3, RAND_INF_SHADOW_SILVER_BLADES_3 }, + { RC_SHADOW_SILVER_BLADES_4, RAND_INF_SHADOW_SILVER_BLADES_4 }, + { RC_SHADOW_SILVER_BLADES_5, RAND_INF_SHADOW_SILVER_BLADES_5 }, + { RC_SHADOW_SILVER_PIT_1, RAND_INF_SHADOW_SILVER_PIT_1 }, + { RC_SHADOW_SILVER_PIT_2, RAND_INF_SHADOW_SILVER_PIT_2 }, + { RC_SHADOW_SILVER_PIT_3, RAND_INF_SHADOW_SILVER_PIT_3 }, + { RC_SHADOW_SILVER_PIT_4, RAND_INF_SHADOW_SILVER_PIT_4 }, + { RC_SHADOW_SILVER_PIT_5, RAND_INF_SHADOW_SILVER_PIT_5 }, + { RC_SHADOW_SILVER_SPIKES_1, RAND_INF_SHADOW_SILVER_SPIKES_1 }, + { RC_SHADOW_SILVER_SPIKES_2, RAND_INF_SHADOW_SILVER_SPIKES_2 }, + { RC_SHADOW_SILVER_SPIKES_3, RAND_INF_SHADOW_SILVER_SPIKES_3 }, + { RC_SHADOW_SILVER_SPIKES_4, RAND_INF_SHADOW_SILVER_SPIKES_4 }, + { RC_SHADOW_SILVER_SPIKES_5, RAND_INF_SHADOW_SILVER_SPIKES_5 }, + { RC_SPIRIT_SILVER_CHILD_1, RAND_INF_SPIRIT_SILVER_CHILD_1 }, + { RC_SPIRIT_SILVER_CHILD_2, RAND_INF_SPIRIT_SILVER_CHILD_2 }, + { RC_SPIRIT_SILVER_CHILD_3, RAND_INF_SPIRIT_SILVER_CHILD_3 }, + { RC_SPIRIT_SILVER_CHILD_4, RAND_INF_SPIRIT_SILVER_CHILD_4 }, + { RC_SPIRIT_SILVER_CHILD_5, RAND_INF_SPIRIT_SILVER_CHILD_5 }, + { RC_SPIRIT_SILVER_SUN_1, RAND_INF_SPIRIT_SILVER_SUN_1 }, + { RC_SPIRIT_SILVER_SUN_2, RAND_INF_SPIRIT_SILVER_SUN_2 }, + { RC_SPIRIT_SILVER_SUN_3, RAND_INF_SPIRIT_SILVER_SUN_3 }, + { RC_SPIRIT_SILVER_SUN_4, RAND_INF_SPIRIT_SILVER_SUN_4 }, + { RC_SPIRIT_SILVER_SUN_5, RAND_INF_SPIRIT_SILVER_SUN_5 }, + { RC_SPIRIT_SILVER_BOULDERS_1, RAND_INF_SPIRIT_SILVER_BOULDERS_1 }, + { RC_SPIRIT_SILVER_BOULDERS_2, RAND_INF_SPIRIT_SILVER_BOULDERS_2 }, + { RC_SPIRIT_SILVER_BOULDERS_3, RAND_INF_SPIRIT_SILVER_BOULDERS_3 }, + { RC_SPIRIT_SILVER_BOULDERS_4, RAND_INF_SPIRIT_SILVER_BOULDERS_4 }, + { RC_SPIRIT_SILVER_BOULDERS_5, RAND_INF_SPIRIT_SILVER_BOULDERS_5 }, + { RC_BOTW_SILVER_1, RAND_INF_BOTW_SILVER_1 }, + { RC_BOTW_SILVER_2, RAND_INF_BOTW_SILVER_2 }, + { RC_BOTW_SILVER_3, RAND_INF_BOTW_SILVER_3 }, + { RC_BOTW_SILVER_4, RAND_INF_BOTW_SILVER_4 }, + { RC_BOTW_SILVER_5, RAND_INF_BOTW_SILVER_5 }, + { RC_ICE_CAVERN_SILVER_BLADES_1, RAND_INF_ICE_CAVERN_SILVER_BLADES_1 }, + { RC_ICE_CAVERN_SILVER_BLADES_2, RAND_INF_ICE_CAVERN_SILVER_BLADES_2 }, + { RC_ICE_CAVERN_SILVER_BLADES_3, RAND_INF_ICE_CAVERN_SILVER_BLADES_3 }, + { RC_ICE_CAVERN_SILVER_BLADES_4, RAND_INF_ICE_CAVERN_SILVER_BLADES_4 }, + { RC_ICE_CAVERN_SILVER_BLADES_5, RAND_INF_ICE_CAVERN_SILVER_BLADES_5 }, + { RC_ICE_CAVERN_SILVER_BLOCK_1, RAND_INF_ICE_CAVERN_SILVER_BLOCK_1 }, + { RC_ICE_CAVERN_SILVER_BLOCK_2, RAND_INF_ICE_CAVERN_SILVER_BLOCK_2 }, + { RC_ICE_CAVERN_SILVER_BLOCK_3, RAND_INF_ICE_CAVERN_SILVER_BLOCK_3 }, + { RC_ICE_CAVERN_SILVER_BLOCK_4, RAND_INF_ICE_CAVERN_SILVER_BLOCK_4 }, + { RC_ICE_CAVERN_SILVER_BLOCK_5, RAND_INF_ICE_CAVERN_SILVER_BLOCK_5 }, + { RC_GTG_SILVER_SLOPE_1, RAND_INF_GTG_SILVER_SLOPE_1 }, + { RC_GTG_SILVER_SLOPE_2, RAND_INF_GTG_SILVER_SLOPE_2 }, + { RC_GTG_SILVER_SLOPE_3, RAND_INF_GTG_SILVER_SLOPE_3 }, + { RC_GTG_SILVER_SLOPE_4, RAND_INF_GTG_SILVER_SLOPE_4 }, + { RC_GTG_SILVER_SLOPE_5, RAND_INF_GTG_SILVER_SLOPE_5 }, + { RC_GTG_SILVER_LAVA_1, RAND_INF_GTG_SILVER_LAVA_1 }, + { RC_GTG_SILVER_LAVA_2, RAND_INF_GTG_SILVER_LAVA_2 }, + { RC_GTG_SILVER_LAVA_3, RAND_INF_GTG_SILVER_LAVA_3 }, + { RC_GTG_SILVER_LAVA_4, RAND_INF_GTG_SILVER_LAVA_4 }, + { RC_GTG_SILVER_LAVA_5, RAND_INF_GTG_SILVER_LAVA_5 }, + { RC_GTG_SILVER_WATER_1, RAND_INF_GTG_SILVER_WATER_1 }, + { RC_GTG_SILVER_WATER_2, RAND_INF_GTG_SILVER_WATER_2 }, + { RC_GTG_SILVER_WATER_3, RAND_INF_GTG_SILVER_WATER_3 }, + { RC_GTG_SILVER_WATER_4, RAND_INF_GTG_SILVER_WATER_4 }, + { RC_GTG_SILVER_WATER_5, RAND_INF_GTG_SILVER_WATER_5 }, + { RC_GANONS_CASTLE_SILVER_LIGHT_1, RAND_INF_GANONS_CASTLE_SILVER_LIGHT_1 }, + { RC_GANONS_CASTLE_SILVER_LIGHT_2, RAND_INF_GANONS_CASTLE_SILVER_LIGHT_2 }, + { RC_GANONS_CASTLE_SILVER_LIGHT_3, RAND_INF_GANONS_CASTLE_SILVER_LIGHT_3 }, + { RC_GANONS_CASTLE_SILVER_LIGHT_4, RAND_INF_GANONS_CASTLE_SILVER_LIGHT_4 }, + { RC_GANONS_CASTLE_SILVER_LIGHT_5, RAND_INF_GANONS_CASTLE_SILVER_LIGHT_5 }, + { RC_GANONS_CASTLE_SILVER_FOREST_1, RAND_INF_GANONS_CASTLE_SILVER_FOREST_1 }, + { RC_GANONS_CASTLE_SILVER_FOREST_2, RAND_INF_GANONS_CASTLE_SILVER_FOREST_2 }, + { RC_GANONS_CASTLE_SILVER_FOREST_3, RAND_INF_GANONS_CASTLE_SILVER_FOREST_3 }, + { RC_GANONS_CASTLE_SILVER_FOREST_4, RAND_INF_GANONS_CASTLE_SILVER_FOREST_4 }, + { RC_GANONS_CASTLE_SILVER_FOREST_5, RAND_INF_GANONS_CASTLE_SILVER_FOREST_5 }, + { RC_GANONS_CASTLE_SILVER_FIRE_1, RAND_INF_GANONS_CASTLE_SILVER_FIRE_1 }, + { RC_GANONS_CASTLE_SILVER_FIRE_2, RAND_INF_GANONS_CASTLE_SILVER_FIRE_2 }, + { RC_GANONS_CASTLE_SILVER_FIRE_3, RAND_INF_GANONS_CASTLE_SILVER_FIRE_3 }, + { RC_GANONS_CASTLE_SILVER_FIRE_4, RAND_INF_GANONS_CASTLE_SILVER_FIRE_4 }, + { RC_GANONS_CASTLE_SILVER_FIRE_5, RAND_INF_GANONS_CASTLE_SILVER_FIRE_5 }, + { RC_GANONS_CASTLE_SILVER_SPIRIT_1, RAND_INF_GANONS_CASTLE_SILVER_SPIRIT_1 }, + { RC_GANONS_CASTLE_SILVER_SPIRIT_2, RAND_INF_GANONS_CASTLE_SILVER_SPIRIT_2 }, + { RC_GANONS_CASTLE_SILVER_SPIRIT_3, RAND_INF_GANONS_CASTLE_SILVER_SPIRIT_3 }, + { RC_GANONS_CASTLE_SILVER_SPIRIT_4, RAND_INF_GANONS_CASTLE_SILVER_SPIRIT_4 }, + { RC_GANONS_CASTLE_SILVER_SPIRIT_5, RAND_INF_GANONS_CASTLE_SILVER_SPIRIT_5 }, + { RC_DODONGOS_CAVERN_MQ_SILVER_1, RAND_INF_DODONGOS_CAVERN_MQ_SILVER_1 }, + { RC_DODONGOS_CAVERN_MQ_SILVER_2, RAND_INF_DODONGOS_CAVERN_MQ_SILVER_2 }, + { RC_DODONGOS_CAVERN_MQ_SILVER_3, RAND_INF_DODONGOS_CAVERN_MQ_SILVER_3 }, + { RC_DODONGOS_CAVERN_MQ_SILVER_4, RAND_INF_DODONGOS_CAVERN_MQ_SILVER_4 }, + { RC_DODONGOS_CAVERN_MQ_SILVER_5, RAND_INF_DODONGOS_CAVERN_MQ_SILVER_5 }, + { RC_SHADOW_MQ_SILVER_BLADES_1, RAND_INF_SHADOW_MQ_SILVER_BLADES_1 }, + { RC_SHADOW_MQ_SILVER_BLADES_2, RAND_INF_SHADOW_MQ_SILVER_BLADES_2 }, + { RC_SHADOW_MQ_SILVER_BLADES_3, RAND_INF_SHADOW_MQ_SILVER_BLADES_3 }, + { RC_SHADOW_MQ_SILVER_BLADES_4, RAND_INF_SHADOW_MQ_SILVER_BLADES_4 }, + { RC_SHADOW_MQ_SILVER_BLADES_5, RAND_INF_SHADOW_MQ_SILVER_BLADES_5 }, + { RC_SHADOW_MQ_SILVER_PIT_1, RAND_INF_SHADOW_MQ_SILVER_PIT_1 }, + { RC_SHADOW_MQ_SILVER_PIT_2, RAND_INF_SHADOW_MQ_SILVER_PIT_2 }, + { RC_SHADOW_MQ_SILVER_PIT_3, RAND_INF_SHADOW_MQ_SILVER_PIT_3 }, + { RC_SHADOW_MQ_SILVER_PIT_4, RAND_INF_SHADOW_MQ_SILVER_PIT_4 }, + { RC_SHADOW_MQ_SILVER_PIT_5, RAND_INF_SHADOW_MQ_SILVER_PIT_5 }, + { RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_1, RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_1 }, + { RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_2, RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_2 }, + { RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_3, RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_3 }, + { RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_4, RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_4 }, + { RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_5, RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_5 }, + { RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_6, RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_6 }, + { RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_7, RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_7 }, + { RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_8, RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_8 }, + { RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_9, RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_9 }, + { RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_10, RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_10 }, + { RC_SHADOW_MQ_SILVER_SPIKES_1, RAND_INF_SHADOW_MQ_SILVER_SPIKES_1 }, + { RC_SHADOW_MQ_SILVER_SPIKES_2, RAND_INF_SHADOW_MQ_SILVER_SPIKES_2 }, + { RC_SHADOW_MQ_SILVER_SPIKES_3, RAND_INF_SHADOW_MQ_SILVER_SPIKES_3 }, + { RC_SHADOW_MQ_SILVER_SPIKES_4, RAND_INF_SHADOW_MQ_SILVER_SPIKES_4 }, + { RC_SHADOW_MQ_SILVER_SPIKES_5, RAND_INF_SHADOW_MQ_SILVER_SPIKES_5 }, + { RC_SHADOW_MQ_SILVER_SPIKES_6, RAND_INF_SHADOW_MQ_SILVER_SPIKES_6 }, + { RC_SHADOW_MQ_SILVER_SPIKES_7, RAND_INF_SHADOW_MQ_SILVER_SPIKES_7 }, + { RC_SHADOW_MQ_SILVER_SPIKES_8, RAND_INF_SHADOW_MQ_SILVER_SPIKES_8 }, + { RC_SHADOW_MQ_SILVER_SPIKES_9, RAND_INF_SHADOW_MQ_SILVER_SPIKES_9 }, + { RC_SHADOW_MQ_SILVER_SPIKES_10, RAND_INF_SHADOW_MQ_SILVER_SPIKES_10 }, + { RC_SPIRIT_MQ_SILVER_LOBBY_1, RAND_INF_SPIRIT_MQ_SILVER_LOBBY_1 }, + { RC_SPIRIT_MQ_SILVER_LOBBY_2, RAND_INF_SPIRIT_MQ_SILVER_LOBBY_2 }, + { RC_SPIRIT_MQ_SILVER_LOBBY_3, RAND_INF_SPIRIT_MQ_SILVER_LOBBY_3 }, + { RC_SPIRIT_MQ_SILVER_LOBBY_4, RAND_INF_SPIRIT_MQ_SILVER_LOBBY_4 }, + { RC_SPIRIT_MQ_SILVER_LOBBY_5, RAND_INF_SPIRIT_MQ_SILVER_LOBBY_5 }, + { RC_SPIRIT_MQ_SILVER_BIG_WALL_1, RAND_INF_SPIRIT_MQ_SILVER_BIG_WALL_1 }, + { RC_SPIRIT_MQ_SILVER_BIG_WALL_2, RAND_INF_SPIRIT_MQ_SILVER_BIG_WALL_2 }, + { RC_SPIRIT_MQ_SILVER_BIG_WALL_3, RAND_INF_SPIRIT_MQ_SILVER_BIG_WALL_3 }, + { RC_SPIRIT_MQ_SILVER_BIG_WALL_4, RAND_INF_SPIRIT_MQ_SILVER_BIG_WALL_4 }, + { RC_SPIRIT_MQ_SILVER_BIG_WALL_5, RAND_INF_SPIRIT_MQ_SILVER_BIG_WALL_5 }, + { RC_GTG_MQ_SILVER_SLOPE_1, RAND_INF_GTG_MQ_SILVER_SLOPE_1 }, + { RC_GTG_MQ_SILVER_SLOPE_2, RAND_INF_GTG_MQ_SILVER_SLOPE_2 }, + { RC_GTG_MQ_SILVER_SLOPE_3, RAND_INF_GTG_MQ_SILVER_SLOPE_3 }, + { RC_GTG_MQ_SILVER_SLOPE_4, RAND_INF_GTG_MQ_SILVER_SLOPE_4 }, + { RC_GTG_MQ_SILVER_SLOPE_5, RAND_INF_GTG_MQ_SILVER_SLOPE_5 }, + { RC_GTG_MQ_SILVER_LAVA_1, RAND_INF_GTG_MQ_SILVER_LAVA_1 }, + { RC_GTG_MQ_SILVER_LAVA_2, RAND_INF_GTG_MQ_SILVER_LAVA_2 }, + { RC_GTG_MQ_SILVER_LAVA_3, RAND_INF_GTG_MQ_SILVER_LAVA_3 }, + { RC_GTG_MQ_SILVER_LAVA_4, RAND_INF_GTG_MQ_SILVER_LAVA_4 }, + { RC_GTG_MQ_SILVER_LAVA_5, RAND_INF_GTG_MQ_SILVER_LAVA_5 }, + { RC_GTG_MQ_SILVER_LAVA_6, RAND_INF_GTG_MQ_SILVER_LAVA_6 }, + { RC_GTG_MQ_SILVER_WATER_1, RAND_INF_GTG_MQ_SILVER_WATER_1 }, + { RC_GTG_MQ_SILVER_WATER_2, RAND_INF_GTG_MQ_SILVER_WATER_2 }, + { RC_GTG_MQ_SILVER_WATER_3, RAND_INF_GTG_MQ_SILVER_WATER_3 }, + { RC_GANONS_CASTLE_MQ_SILVER_FIRE_1, RAND_INF_GANONS_CASTLE_MQ_SILVER_FIRE_1 }, + { RC_GANONS_CASTLE_MQ_SILVER_FIRE_2, RAND_INF_GANONS_CASTLE_MQ_SILVER_FIRE_2 }, + { RC_GANONS_CASTLE_MQ_SILVER_FIRE_3, RAND_INF_GANONS_CASTLE_MQ_SILVER_FIRE_3 }, + { RC_GANONS_CASTLE_MQ_SILVER_FIRE_4, RAND_INF_GANONS_CASTLE_MQ_SILVER_FIRE_4 }, + { RC_GANONS_CASTLE_MQ_SILVER_FIRE_5, RAND_INF_GANONS_CASTLE_MQ_SILVER_FIRE_5 }, + { RC_GANONS_CASTLE_MQ_SILVER_WATER_1, RAND_INF_GANONS_CASTLE_MQ_SILVER_WATER_1 }, + { RC_GANONS_CASTLE_MQ_SILVER_WATER_2, RAND_INF_GANONS_CASTLE_MQ_SILVER_WATER_2 }, + { RC_GANONS_CASTLE_MQ_SILVER_WATER_3, RAND_INF_GANONS_CASTLE_MQ_SILVER_WATER_3 }, + { RC_GANONS_CASTLE_MQ_SILVER_WATER_4, RAND_INF_GANONS_CASTLE_MQ_SILVER_WATER_4 }, + { RC_GANONS_CASTLE_MQ_SILVER_WATER_5, RAND_INF_GANONS_CASTLE_MQ_SILVER_WATER_5 }, + { RC_GANONS_CASTLE_MQ_SILVER_SHADOW_1, RAND_INF_GANONS_CASTLE_MQ_SILVER_SHADOW_1 }, + { RC_GANONS_CASTLE_MQ_SILVER_SHADOW_2, RAND_INF_GANONS_CASTLE_MQ_SILVER_SHADOW_2 }, + { RC_GANONS_CASTLE_MQ_SILVER_SHADOW_3, RAND_INF_GANONS_CASTLE_MQ_SILVER_SHADOW_3 }, + { RC_GANONS_CASTLE_MQ_SILVER_SHADOW_4, RAND_INF_GANONS_CASTLE_MQ_SILVER_SHADOW_4 }, + { RC_GANONS_CASTLE_MQ_SILVER_SHADOW_5, RAND_INF_GANONS_CASTLE_MQ_SILVER_SHADOW_5 }, }; BeehiveIdentity Randomizer::IdentifyBeehive(s32 sceneNum, s16 xPosition, s32 respawnData) { @@ -3725,6 +3879,24 @@ SmallCrateIdentity Randomizer::IdentifySmallCrate(s32 sceneNum, s32 posX, s32 po return smallCrateIdentity; } +SilverIdentity Randomizer::IdentifySilver(s32 sceneNum, s32 posX, s32 posZ) { + struct SilverIdentity silverIdentity; + + silverIdentity.randomizerInf = RAND_INF_MAX; + silverIdentity.randomizerCheck = RC_UNKNOWN_CHECK; + + s32 actorParams = TWO_ACTOR_PARAMS(posX, posZ); + + Rando::Location* location = GetCheckObjectFromActor(ACTOR_OBJ_TSUBO, sceneNum, actorParams); + + if (location->GetRandomizerCheck() != RC_UNKNOWN_CHECK) { + silverIdentity.randomizerInf = rcToRandomizerInf[location->GetRandomizerCheck()]; + silverIdentity.randomizerCheck = location->GetRandomizerCheck(); + } + + return silverIdentity; +} + u8 Randomizer::GetRandoSettingValue(RandomizerSettingKey randoSettingKey) { return Rando::Context::GetInstance()->GetOption(randoSettingKey).Get(); } diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index 78f48b01c..c2f7f63e4 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -57,6 +57,7 @@ class Randomizer { GrassIdentity IdentifyGrass(s32 sceneNum, s32 posX, s32 posZ, s32 respawnData, s32 linkAge); CrateIdentity IdentifyCrate(s32 sceneNum, s32 posX, s32 posZ); SmallCrateIdentity IdentifySmallCrate(s32 sceneNum, s32 posX, s32 posZ); + SilverIdentity IdentifySilver(s32 sceneNum, s32 posX, s32 posZ); GetItemEntry GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogItemId, bool checkObtainability = true); GetItemEntry GetItemFromActor(s16 actorId, s16 sceneNum, s16 actorParams, GetItemID ogItemId, diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 15a2fbd37..c4f98fac1 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -304,6 +304,7 @@ typedef enum { RCTYPE_BEEHIVE, // Beehives RCTYPE_FISH, // Fishes RCTYPE_FREESTANDING, // Freestanding rupees and hearts + RCTYPE_SILVER, // Silver rupees RCTYPE_FAIRY, // Fairies RCTYPE_GRASS, // Grass } RandomizerCheckType; @@ -2949,6 +2950,160 @@ typedef enum { RC_GANONS_CASTLE_MQ_WATER_TRIAL_HEART, RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART, RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART, + RC_SHADOW_SILVER_BLADES_1, + RC_SHADOW_SILVER_BLADES_2, + RC_SHADOW_SILVER_BLADES_3, + RC_SHADOW_SILVER_BLADES_4, + RC_SHADOW_SILVER_BLADES_5, + RC_SHADOW_SILVER_PIT_1, + RC_SHADOW_SILVER_PIT_2, + RC_SHADOW_SILVER_PIT_3, + RC_SHADOW_SILVER_PIT_4, + RC_SHADOW_SILVER_PIT_5, + RC_SHADOW_SILVER_SPIKES_1, + RC_SHADOW_SILVER_SPIKES_2, + RC_SHADOW_SILVER_SPIKES_3, + RC_SHADOW_SILVER_SPIKES_4, + RC_SHADOW_SILVER_SPIKES_5, + RC_SPIRIT_SILVER_CHILD_1, + RC_SPIRIT_SILVER_CHILD_2, + RC_SPIRIT_SILVER_CHILD_3, + RC_SPIRIT_SILVER_CHILD_4, + RC_SPIRIT_SILVER_CHILD_5, + RC_SPIRIT_SILVER_SUN_1, + RC_SPIRIT_SILVER_SUN_2, + RC_SPIRIT_SILVER_SUN_3, + RC_SPIRIT_SILVER_SUN_4, + RC_SPIRIT_SILVER_SUN_5, + RC_SPIRIT_SILVER_BOULDERS_1, + RC_SPIRIT_SILVER_BOULDERS_2, + RC_SPIRIT_SILVER_BOULDERS_3, + RC_SPIRIT_SILVER_BOULDERS_4, + RC_SPIRIT_SILVER_BOULDERS_5, + RC_BOTW_SILVER_1, + RC_BOTW_SILVER_2, + RC_BOTW_SILVER_3, + RC_BOTW_SILVER_4, + RC_BOTW_SILVER_5, + RC_ICE_CAVERN_SILVER_BLADES_1, + RC_ICE_CAVERN_SILVER_BLADES_2, + RC_ICE_CAVERN_SILVER_BLADES_3, + RC_ICE_CAVERN_SILVER_BLADES_4, + RC_ICE_CAVERN_SILVER_BLADES_5, + RC_ICE_CAVERN_SILVER_BLOCK_1, + RC_ICE_CAVERN_SILVER_BLOCK_2, + RC_ICE_CAVERN_SILVER_BLOCK_3, + RC_ICE_CAVERN_SILVER_BLOCK_4, + RC_ICE_CAVERN_SILVER_BLOCK_5, + RC_GTG_SILVER_SLOPE_1, + RC_GTG_SILVER_SLOPE_2, + RC_GTG_SILVER_SLOPE_3, + RC_GTG_SILVER_SLOPE_4, + RC_GTG_SILVER_SLOPE_5, + RC_GTG_SILVER_LAVA_1, + RC_GTG_SILVER_LAVA_2, + RC_GTG_SILVER_LAVA_3, + RC_GTG_SILVER_LAVA_4, + RC_GTG_SILVER_LAVA_5, + RC_GTG_SILVER_WATER_1, + RC_GTG_SILVER_WATER_2, + RC_GTG_SILVER_WATER_3, + RC_GTG_SILVER_WATER_4, + RC_GTG_SILVER_WATER_5, + RC_GANONS_CASTLE_SILVER_LIGHT_1, + RC_GANONS_CASTLE_SILVER_LIGHT_2, + RC_GANONS_CASTLE_SILVER_LIGHT_3, + RC_GANONS_CASTLE_SILVER_LIGHT_4, + RC_GANONS_CASTLE_SILVER_LIGHT_5, + RC_GANONS_CASTLE_SILVER_FOREST_1, + RC_GANONS_CASTLE_SILVER_FOREST_2, + RC_GANONS_CASTLE_SILVER_FOREST_3, + RC_GANONS_CASTLE_SILVER_FOREST_4, + RC_GANONS_CASTLE_SILVER_FOREST_5, + RC_GANONS_CASTLE_SILVER_FIRE_1, + RC_GANONS_CASTLE_SILVER_FIRE_2, + RC_GANONS_CASTLE_SILVER_FIRE_3, + RC_GANONS_CASTLE_SILVER_FIRE_4, + RC_GANONS_CASTLE_SILVER_FIRE_5, + RC_GANONS_CASTLE_SILVER_SPIRIT_1, + RC_GANONS_CASTLE_SILVER_SPIRIT_2, + RC_GANONS_CASTLE_SILVER_SPIRIT_3, + RC_GANONS_CASTLE_SILVER_SPIRIT_4, + RC_GANONS_CASTLE_SILVER_SPIRIT_5, + RC_DODONGOS_CAVERN_MQ_SILVER_1, + RC_DODONGOS_CAVERN_MQ_SILVER_2, + RC_DODONGOS_CAVERN_MQ_SILVER_3, + RC_DODONGOS_CAVERN_MQ_SILVER_4, + RC_DODONGOS_CAVERN_MQ_SILVER_5, + RC_SHADOW_MQ_SILVER_BLADES_1, + RC_SHADOW_MQ_SILVER_BLADES_2, + RC_SHADOW_MQ_SILVER_BLADES_3, + RC_SHADOW_MQ_SILVER_BLADES_4, + RC_SHADOW_MQ_SILVER_BLADES_5, + RC_SHADOW_MQ_SILVER_PIT_1, + RC_SHADOW_MQ_SILVER_PIT_2, + RC_SHADOW_MQ_SILVER_PIT_3, + RC_SHADOW_MQ_SILVER_PIT_4, + RC_SHADOW_MQ_SILVER_PIT_5, + RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_1, + RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_2, + RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_3, + RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_4, + RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_5, + RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_6, + RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_7, + RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_8, + RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_9, + RC_SHADOW_MQ_SILVER_INVISIBLE_BLADES_10, + RC_SHADOW_MQ_SILVER_SPIKES_1, + RC_SHADOW_MQ_SILVER_SPIKES_2, + RC_SHADOW_MQ_SILVER_SPIKES_3, + RC_SHADOW_MQ_SILVER_SPIKES_4, + RC_SHADOW_MQ_SILVER_SPIKES_5, + RC_SHADOW_MQ_SILVER_SPIKES_6, + RC_SHADOW_MQ_SILVER_SPIKES_7, + RC_SHADOW_MQ_SILVER_SPIKES_8, + RC_SHADOW_MQ_SILVER_SPIKES_9, + RC_SHADOW_MQ_SILVER_SPIKES_10, + RC_SPIRIT_MQ_SILVER_LOBBY_1, + RC_SPIRIT_MQ_SILVER_LOBBY_2, + RC_SPIRIT_MQ_SILVER_LOBBY_3, + RC_SPIRIT_MQ_SILVER_LOBBY_4, + RC_SPIRIT_MQ_SILVER_LOBBY_5, + RC_SPIRIT_MQ_SILVER_BIG_WALL_1, + RC_SPIRIT_MQ_SILVER_BIG_WALL_2, + RC_SPIRIT_MQ_SILVER_BIG_WALL_3, + RC_SPIRIT_MQ_SILVER_BIG_WALL_4, + RC_SPIRIT_MQ_SILVER_BIG_WALL_5, + RC_GTG_MQ_SILVER_SLOPE_1, + RC_GTG_MQ_SILVER_SLOPE_2, + RC_GTG_MQ_SILVER_SLOPE_3, + RC_GTG_MQ_SILVER_SLOPE_4, + RC_GTG_MQ_SILVER_SLOPE_5, + RC_GTG_MQ_SILVER_LAVA_1, + RC_GTG_MQ_SILVER_LAVA_2, + RC_GTG_MQ_SILVER_LAVA_3, + RC_GTG_MQ_SILVER_LAVA_4, + RC_GTG_MQ_SILVER_LAVA_5, + RC_GTG_MQ_SILVER_LAVA_6, + RC_GTG_MQ_SILVER_WATER_1, + RC_GTG_MQ_SILVER_WATER_2, + RC_GTG_MQ_SILVER_WATER_3, + RC_GANONS_CASTLE_MQ_SILVER_FIRE_1, + RC_GANONS_CASTLE_MQ_SILVER_FIRE_2, + RC_GANONS_CASTLE_MQ_SILVER_FIRE_3, + RC_GANONS_CASTLE_MQ_SILVER_FIRE_4, + RC_GANONS_CASTLE_MQ_SILVER_FIRE_5, + RC_GANONS_CASTLE_MQ_SILVER_WATER_1, + RC_GANONS_CASTLE_MQ_SILVER_WATER_2, + RC_GANONS_CASTLE_MQ_SILVER_WATER_3, + RC_GANONS_CASTLE_MQ_SILVER_WATER_4, + RC_GANONS_CASTLE_MQ_SILVER_WATER_5, + RC_GANONS_CASTLE_MQ_SILVER_SHADOW_1, + RC_GANONS_CASTLE_MQ_SILVER_SHADOW_2, + RC_GANONS_CASTLE_MQ_SILVER_SHADOW_3, + RC_GANONS_CASTLE_MQ_SILVER_SHADOW_4, + RC_GANONS_CASTLE_MQ_SILVER_SHADOW_5, RC_SFM_FAIRY_GROTTO_FAIRY_1, RC_SFM_FAIRY_GROTTO_FAIRY_2, RC_SFM_FAIRY_GROTTO_FAIRY_3, @@ -3916,6 +4071,35 @@ typedef enum { RG_GERUDO_FORTRESS_KEY_RING, RG_GANONS_CASTLE_KEY_RING, RG_TREASURE_GAME_KEY_RING, + RG_SHADOW_SILVER_BLADES, + RG_SHADOW_SILVER_PIT, + RG_SHADOW_SILVER_SPIKES, + RG_SPIRIT_SILVER_CHILD, + RG_SPIRIT_SILVER_SUN, + RG_SPIRIT_SILVER_BOULDERS, + RG_BOTW_SILVER, + RG_ICE_CAVERN_SILVER_BLADES, + RG_ICE_CAVERN_SILVER_BLOCK, + RG_GTG_SILVER_SLOPE, + RG_GTG_SILVER_LAVA, + RG_GTG_SILVER_WATER, + RG_GANONS_CASTLE_SILVER_LIGHT, + RG_GANONS_CASTLE_SILVER_FOREST, + RG_GANONS_CASTLE_SILVER_FIRE, + RG_GANONS_CASTLE_SILVER_SPIRIT, + RG_DODONGOS_CAVERN_MQ_SILVER, + RG_SHADOW_MQ_SILVER_BLADES, + RG_SHADOW_MQ_SILVER_PIT, + RG_SHADOW_MQ_SILVER_INVISIBLE_BLADES, + RG_SHADOW_MQ_SILVER_SPIKES, + RG_SPIRIT_MQ_SILVER_LOBBY, + RG_SPIRIT_MQ_SILVER_BIG_WALL, + RG_GTG_MQ_SILVER_SLOPE, + RG_GTG_MQ_SILVER_LAVA, + RG_GTG_MQ_SILVER_WATER, + RG_GANONS_CASTLE_MQ_SILVER_FIRE, + RG_GANONS_CASTLE_MQ_SILVER_WATER, + RG_GANONS_CASTLE_MQ_SILVER_SHADOW, RG_KOKIRI_EMERALD, RG_GORON_RUBY, RG_ZORA_SAPPHIRE, @@ -5534,6 +5718,14 @@ typedef enum { RHT_ICE_CAVERN_RUPEE, RHT_GERUDO_TRAINING_GROUNDS_HEART, RHT_GANONS_CASTLE_HEART, + // Silver Shuffle + RHT_DODONGOS_CAVERN_SILVER, + RHT_SHADOW_TEMPLE_SILVER, + RHT_SPIRIT_TEMPLE_SILVER, + RHT_BOTW_SILVER, + RHT_ICE_CAVERN_SILVER, + RHT_GTG_SILVER, + RHT_GANONS_CASTLE_SILVER, // Fairy Shuffle RHT_SFM_FAIRY_GROTTO_FAIRY, RHT_ZR_FAIRY_GROTTO_FAIRY, @@ -5954,6 +6146,7 @@ typedef enum { RSK_SHUFFLE_DEKU_STICK_BAG, RSK_SHUFFLE_DEKU_NUT_BAG, RSK_SHUFFLE_FREESTANDING, + RSK_SHUFFLE_SILVER, RSK_SHUFFLE_FAIRIES, RSK_LOCK_OVERWORLD_DOORS, RSK_SHUFFLE_GRASS, @@ -6441,6 +6634,11 @@ typedef struct SmallCrateIdentity { RandomizerCheck randomizerCheck; } SmallCrateIdentity; +typedef struct SilverIdentity { + RandomizerInf randomizerInf; + RandomizerCheck randomizerCheck; +} SilverIdentity; + typedef enum { TRACKER_WINDOW_FLOATING, TRACKER_WINDOW_WINDOW, diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index d42e14cb1..3863b796f 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -1313,6 +1313,191 @@ DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_WATER_TRIAL_HEART) DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_RIGHT_HEART) DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_LIGHT_TRIAL_LEFT_HEART) +DEFINE_RAND_INF(RAND_INF_SHADOW_SILVER_BLADES_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_SILVER_BLADES_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_SILVER_BLADES_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_SILVER_BLADES_4) +DEFINE_RAND_INF(RAND_INF_SHADOW_SILVER_BLADES_5) +DEFINE_RAND_INF(RAND_INF_SHADOW_SILVER_PIT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_SILVER_PIT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_SILVER_PIT_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_SILVER_PIT_4) +DEFINE_RAND_INF(RAND_INF_SHADOW_SILVER_PIT_5) +DEFINE_RAND_INF(RAND_INF_SHADOW_SILVER_SPIKES_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_SILVER_SPIKES_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_SILVER_SPIKES_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_SILVER_SPIKES_4) +DEFINE_RAND_INF(RAND_INF_SHADOW_SILVER_SPIKES_5) +DEFINE_RAND_INF(RAND_INF_SPIRIT_SILVER_CHILD_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_SILVER_CHILD_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_SILVER_CHILD_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_SILVER_CHILD_4) +DEFINE_RAND_INF(RAND_INF_SPIRIT_SILVER_CHILD_5) +DEFINE_RAND_INF(RAND_INF_SPIRIT_SILVER_SUN_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_SILVER_SUN_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_SILVER_SUN_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_SILVER_SUN_4) +DEFINE_RAND_INF(RAND_INF_SPIRIT_SILVER_SUN_5) +DEFINE_RAND_INF(RAND_INF_SPIRIT_SILVER_BOULDERS_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_SILVER_BOULDERS_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_SILVER_BOULDERS_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_SILVER_BOULDERS_4) +DEFINE_RAND_INF(RAND_INF_SPIRIT_SILVER_BOULDERS_5) +DEFINE_RAND_INF(RAND_INF_BOTW_SILVER_1) +DEFINE_RAND_INF(RAND_INF_BOTW_SILVER_2) +DEFINE_RAND_INF(RAND_INF_BOTW_SILVER_3) +DEFINE_RAND_INF(RAND_INF_BOTW_SILVER_4) +DEFINE_RAND_INF(RAND_INF_BOTW_SILVER_5) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SILVER_BLADES_1) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SILVER_BLADES_2) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SILVER_BLADES_3) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SILVER_BLADES_4) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SILVER_BLADES_5) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SILVER_BLOCK_1) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SILVER_BLOCK_2) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SILVER_BLOCK_3) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SILVER_BLOCK_4) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SILVER_BLOCK_5) +DEFINE_RAND_INF(RAND_INF_GTG_SILVER_SLOPE_1) +DEFINE_RAND_INF(RAND_INF_GTG_SILVER_SLOPE_2) +DEFINE_RAND_INF(RAND_INF_GTG_SILVER_SLOPE_3) +DEFINE_RAND_INF(RAND_INF_GTG_SILVER_SLOPE_4) +DEFINE_RAND_INF(RAND_INF_GTG_SILVER_SLOPE_5) +DEFINE_RAND_INF(RAND_INF_GTG_SILVER_LAVA_1) +DEFINE_RAND_INF(RAND_INF_GTG_SILVER_LAVA_2) +DEFINE_RAND_INF(RAND_INF_GTG_SILVER_LAVA_3) +DEFINE_RAND_INF(RAND_INF_GTG_SILVER_LAVA_4) +DEFINE_RAND_INF(RAND_INF_GTG_SILVER_LAVA_5) +DEFINE_RAND_INF(RAND_INF_GTG_SILVER_WATER_1) +DEFINE_RAND_INF(RAND_INF_GTG_SILVER_WATER_2) +DEFINE_RAND_INF(RAND_INF_GTG_SILVER_WATER_3) +DEFINE_RAND_INF(RAND_INF_GTG_SILVER_WATER_4) +DEFINE_RAND_INF(RAND_INF_GTG_SILVER_WATER_5) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SILVER_LIGHT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SILVER_LIGHT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SILVER_LIGHT_3) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SILVER_LIGHT_4) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SILVER_LIGHT_5) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SILVER_FOREST_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SILVER_FOREST_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SILVER_FOREST_3) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SILVER_FOREST_4) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SILVER_FOREST_5) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SILVER_FIRE_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SILVER_FIRE_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SILVER_FIRE_3) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SILVER_FIRE_4) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SILVER_FIRE_5) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SILVER_SPIRIT_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SILVER_SPIRIT_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SILVER_SPIRIT_3) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SILVER_SPIRIT_4) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SILVER_SPIRIT_5) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_1) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_2) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_3) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_4) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_SILVER_5) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_BLADES_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_BLADES_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_BLADES_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_BLADES_4) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_BLADES_5) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_PIT_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_PIT_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_PIT_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_PIT_4) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_PIT_5) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_4) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_5) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_6) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_7) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_8) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_9) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES_10) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_SPIKES_1) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_SPIKES_2) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_SPIKES_3) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_SPIKES_4) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_SPIKES_5) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_SPIKES_6) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_SPIKES_7) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_SPIKES_8) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_SPIKES_9) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_SPIKES_10) +DEFINE_RAND_INF(RAND_INF_SPIRIT_MQ_SILVER_LOBBY_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_MQ_SILVER_LOBBY_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_MQ_SILVER_LOBBY_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_MQ_SILVER_LOBBY_4) +DEFINE_RAND_INF(RAND_INF_SPIRIT_MQ_SILVER_LOBBY_5) +DEFINE_RAND_INF(RAND_INF_SPIRIT_MQ_SILVER_BIG_WALL_1) +DEFINE_RAND_INF(RAND_INF_SPIRIT_MQ_SILVER_BIG_WALL_2) +DEFINE_RAND_INF(RAND_INF_SPIRIT_MQ_SILVER_BIG_WALL_3) +DEFINE_RAND_INF(RAND_INF_SPIRIT_MQ_SILVER_BIG_WALL_4) +DEFINE_RAND_INF(RAND_INF_SPIRIT_MQ_SILVER_BIG_WALL_5) +DEFINE_RAND_INF(RAND_INF_GTG_MQ_SILVER_SLOPE_1) +DEFINE_RAND_INF(RAND_INF_GTG_MQ_SILVER_SLOPE_2) +DEFINE_RAND_INF(RAND_INF_GTG_MQ_SILVER_SLOPE_3) +DEFINE_RAND_INF(RAND_INF_GTG_MQ_SILVER_SLOPE_4) +DEFINE_RAND_INF(RAND_INF_GTG_MQ_SILVER_SLOPE_5) +DEFINE_RAND_INF(RAND_INF_GTG_MQ_SILVER_LAVA_1) +DEFINE_RAND_INF(RAND_INF_GTG_MQ_SILVER_LAVA_2) +DEFINE_RAND_INF(RAND_INF_GTG_MQ_SILVER_LAVA_3) +DEFINE_RAND_INF(RAND_INF_GTG_MQ_SILVER_LAVA_4) +DEFINE_RAND_INF(RAND_INF_GTG_MQ_SILVER_LAVA_5) +DEFINE_RAND_INF(RAND_INF_GTG_MQ_SILVER_LAVA_6) +DEFINE_RAND_INF(RAND_INF_GTG_MQ_SILVER_WATER_1) +DEFINE_RAND_INF(RAND_INF_GTG_MQ_SILVER_WATER_2) +DEFINE_RAND_INF(RAND_INF_GTG_MQ_SILVER_WATER_3) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SILVER_FIRE_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SILVER_FIRE_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SILVER_FIRE_3) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SILVER_FIRE_4) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SILVER_FIRE_5) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SILVER_WATER_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SILVER_WATER_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SILVER_WATER_3) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SILVER_WATER_4) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SILVER_WATER_5) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SILVER_SHADOW_1) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SILVER_SHADOW_2) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SILVER_SHADOW_3) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SILVER_SHADOW_4) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SILVER_SHADOW_5) + +DEFINE_RAND_INF(RAND_INF_SHADOW_SILVER_BLADES) +DEFINE_RAND_INF(RAND_INF_SHADOW_SILVER_PIT) +DEFINE_RAND_INF(RAND_INF_SHADOW_SILVER_SPIKES) +DEFINE_RAND_INF(RAND_INF_SPIRIT_SILVER_CHILD) +DEFINE_RAND_INF(RAND_INF_SPIRIT_SILVER_SUN) +DEFINE_RAND_INF(RAND_INF_SPIRIT_SILVER_BOULDERS) +DEFINE_RAND_INF(RAND_INF_BOTW_SILVER) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SILVER_BLADES) +DEFINE_RAND_INF(RAND_INF_ICE_CAVERN_SILVER_BLOCK) +DEFINE_RAND_INF(RAND_INF_GTG_SILVER_SLOPE) +DEFINE_RAND_INF(RAND_INF_GTG_SILVER_LAVA) +DEFINE_RAND_INF(RAND_INF_GTG_SILVER_WATER) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SILVER_LIGHT) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SILVER_FOREST) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SILVER_FIRE) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_SILVER_SPIRIT) +DEFINE_RAND_INF(RAND_INF_DODONGOS_CAVERN_MQ_SILVER) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_BLADES) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_PIT) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES) +DEFINE_RAND_INF(RAND_INF_SHADOW_MQ_SILVER_SPIKES) +DEFINE_RAND_INF(RAND_INF_SPIRIT_MQ_SILVER_LOBBY) +DEFINE_RAND_INF(RAND_INF_SPIRIT_MQ_SILVER_BIG_WALL) +DEFINE_RAND_INF(RAND_INF_GTG_MQ_SILVER_SLOPE) +DEFINE_RAND_INF(RAND_INF_GTG_MQ_SILVER_LAVA) +DEFINE_RAND_INF(RAND_INF_GTG_MQ_SILVER_WATER) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SILVER_FIRE) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SILVER_WATER) +DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SILVER_SHADOW) + DEFINE_RAND_INF(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_1) DEFINE_RAND_INF(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2) DEFINE_RAND_INF(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3) diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 5f8c60ac0..de70af537 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -237,6 +237,8 @@ void Settings::CreateOptions() { OPT_BOOL(RSK_SHUFFLE_DEKU_STICK_BAG, "Shuffle Deku Stick Bag", CVAR_RANDOMIZER_SETTING("ShuffleDekuStickBag"), mOptionDescriptions[RSK_SHUFFLE_DEKU_STICK_BAG], IMFLAG_SEPARATOR_BOTTOM, WidgetType::Checkbox, RO_GENERIC_OFF); OPT_BOOL(RSK_SHUFFLE_DEKU_NUT_BAG, "Shuffle Deku Nut Bag", CVAR_RANDOMIZER_SETTING("ShuffleDekuNutBag"), mOptionDescriptions[RSK_SHUFFLE_DEKU_NUT_BAG], IMFLAG_SEPARATOR_BOTTOM, WidgetType::Checkbox, RO_GENERIC_OFF); OPT_U8(RSK_SHUFFLE_FREESTANDING, "Shuffle Freestanding Items", {"Off", "Dungeons", "Overworld", "All Items"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleFreestanding"), mOptionDescriptions[RSK_SHUFFLE_FREESTANDING], WidgetType::Combobox, RO_SHUFFLE_FREESTANDING_OFF); + // OPT_U8(RSK_SHUFFLE_SILVER, "Shuffle Silver Rupees", {"Off", "On", "Start With"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleSilver"), mOptionDescriptions[RSK_SHUFFLE_SILVER], WidgetType::Combobox, RO_SHUFFLE_SILVER_OFF); + OPT_BOOL(RSK_SHUFFLE_SILVER, "Shuffle Silver Rupees", CVAR_RANDOMIZER_SETTING("ShuffleSilver"), mOptionDescriptions[RSK_SHUFFLE_SILVER]); OPT_U8(RSK_FISHSANITY, "Fishsanity", {"Off", "Shuffle only Hyrule Loach", "Shuffle Fishing Pond", "Shuffle Overworld Fish", "Shuffle Both"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("Fishsanity"), mOptionDescriptions[RSK_FISHSANITY], WidgetType::Combobox, RO_FISHSANITY_OFF); OPT_U8(RSK_FISHSANITY_POND_COUNT, "Pond Fish Count", {NumOpts(0,17,1)}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("FishsanityPondCount"), mOptionDescriptions[RSK_FISHSANITY_POND_COUNT], WidgetType::Slider, 0, true, IMFLAG_NONE); OPT_BOOL(RSK_FISHSANITY_AGE_SPLIT, "Pond Age Split", CVAR_RANDOMIZER_SETTING("FishsanityAgeSplit"), mOptionDescriptions[RSK_FISHSANITY_AGE_SPLIT]); @@ -1247,6 +1249,7 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_DEKU_STICK_BAG], &mOptions[RSK_SHUFFLE_DEKU_NUT_BAG], &mOptions[RSK_SHUFFLE_FREESTANDING], + &mOptions[RSK_SHUFFLE_SILVER], }, WidgetContainerType::COLUMN); mOptionGroups[RSG_SHUFFLE_NPCS_IMGUI] = @@ -1540,6 +1543,7 @@ void Settings::CreateOptions() { &mOptions[RSK_SHUFFLE_DEKU_STICK_BAG], &mOptions[RSK_SHUFFLE_DEKU_NUT_BAG], &mOptions[RSK_SHUFFLE_FREESTANDING], + &mOptions[RSK_SHUFFLE_SILVER], &mOptions[RSK_SHUFFLE_FAIRIES], }); mOptionGroups[RSG_SHUFFLE_DUNGEON_ITEMS] = diff --git a/soh/soh/Enhancements/randomizer/static_data.h b/soh/soh/Enhancements/randomizer/static_data.h index 7bdec17c1..f1d48ddc4 100644 --- a/soh/soh/Enhancements/randomizer/static_data.h +++ b/soh/soh/Enhancements/randomizer/static_data.h @@ -56,6 +56,7 @@ class StaticData { static void RegisterFairyLocations(); static void RegisterPotLocations(); static void RegisterFreestandingLocations(); + static void RegisterSilverLocations(); static void RegisterGrassLocations(); static void RegisterCrateLocations(); static void InitHashMaps(); diff --git a/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.c b/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.c index 5337a61bc..5918516ce 100644 --- a/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.c +++ b/soh/src/overlays/actors/ovl_En_G_Switch/z_en_g_switch.c @@ -12,6 +12,7 @@ #include "objects/gameplay_keep/gameplay_keep.h" #include "objects/object_tsubo/object_tsubo.h" #include "objects/object_gi_rupy/object_gi_rupy.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/frame_interpolation.h" #define FLAGS (ACTOR_FLAG_UPDATE_CULLING_DISABLED | ACTOR_FLAG_DRAW_CULLING_DISABLED) @@ -101,7 +102,7 @@ void EnGSwitch_Init(Actor* thisx, PlayState* play) { // "maximum number of checks" osSyncPrintf(VT_FGCOL(PURPLE) "☆☆☆☆☆ 最大チェック数 ☆☆☆☆☆ %d\n" VT_RST, this->silverCount); osSyncPrintf("\n\n"); - if (Flags_GetSwitch(play, this->switchFlag)) { + if (GameInteractor_Should(VB_SILVER_DESPAWN, Flags_GetSwitch(play, this->switchFlag), this)) { // This is a reference to Hokuto no Ken osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ You are Shock! ☆☆☆☆☆ %d\n" VT_RST, this->switchFlag); Actor_Kill(&this->actor); @@ -119,7 +120,7 @@ void EnGSwitch_Init(Actor* thisx, PlayState* play) { Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit); this->actor.draw = EnGSwitch_DrawRupee; this->actor.shape.yOffset = 700.0f; - if (Flags_GetSwitch(play, this->switchFlag)) { + if (GameInteractor_Should(VB_SILVER_DESPAWN, Flags_GetSwitch(play, this->switchFlag), this)) { osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ You are Shock! ☆☆☆☆☆ %d\n" VT_RST, this->switchFlag); Actor_Kill(&this->actor); } else {