implement requiring multiple rupees & starting with silver rupees

This commit is contained in:
Demur Rumed 2025-07-09 02:28:58 +00:00
commit fb7e9ea516
17 changed files with 391 additions and 183 deletions

View file

@ -160,6 +160,35 @@ typedef struct {
typedef struct ShipRandomizerSaveContextData {
u8 triforcePiecesCollected;
s8 silverShadowBlades;
s8 silverShadowPit;
s8 silverShadowSpikes;
s8 silverSpiritChild;
s8 silverSpiritSun;
s8 silverSpiritBoulders;
s8 silverBotw;
s8 silverIceCavernBlades;
s8 silverIceCavernBlock;
s8 silverGtgSlope;
s8 silverGtgLava;
s8 silverGtgWater;
s8 silverGanonLight;
s8 silverGanonForest;
s8 silverGanonFire;
s8 silverGanonSpirit;
s8 silverMqDodongosCavern;
s8 silverMqShadowBlades;
s8 silverMqShadowPit;
s8 silverMqShadowInvisibleBlades;
s8 silverMqShadowSpikes;
s8 silverMqSpiritLobby;
s8 silverMqSpiritBigWall;
s8 silverMqGtgSlope;
s8 silverMqGtgLava;
s8 silverMqGtgWater;
s8 silverMqGanonFire;
s8 silverMqGanonWater;
s8 silverMqGanonShadow;
} ShipRandomizerSaveContextData;
typedef struct ShipBossRushSaveContextData {

View file

@ -6,6 +6,15 @@ namespace Rando {
void StaticData::HintTable_Init_Exclude_Dungeon() {
// clang-format off
// TODO move these to region specific sections when hint text stable
hintTextTable[RHT_DODONGOS_CAVERN_SILVER] = HintText(CustomMessage("They say that silver in #Dodongo's Cavern# holds #[[1]]#.", TODO_TRANSLATE, TODO_TRANSLATE, {QM_RED, QM_GREEN}));
hintTextTable[RHT_SHADOW_TEMPLE_SILVER] = HintText(CustomMessage("They say that silver in #Shadow Temple# holds #[[1]]#.", TODO_TRANSLATE, TODO_TRANSLATE, {QM_RED, QM_GREEN}));
hintTextTable[RHT_SPIRIT_TEMPLE_SILVER] = HintText(CustomMessage("They say that silver in #Spirit Temple# holds #[[1]]#.", TODO_TRANSLATE, TODO_TRANSLATE, {QM_RED, QM_GREEN}));
hintTextTable[RHT_BOTW_SILVER] = HintText(CustomMessage("They say that silver in #Bottom of the Well# holds #[[1]]#.", TODO_TRANSLATE, TODO_TRANSLATE, {QM_RED, QM_GREEN}));
hintTextTable[RHT_ICE_CAVERN_SILVER] = HintText(CustomMessage("They say that silver in #Ice Cavern# holds #[[1]]#.", TODO_TRANSLATE, TODO_TRANSLATE, {QM_RED, QM_GREEN}));
hintTextTable[RHT_GTG_SILVER] = HintText(CustomMessage("They say that silver in #Gerudo Training Ground# holds #[[1]]#.", TODO_TRANSLATE, TODO_TRANSLATE, {QM_RED, QM_GREEN}));
hintTextTable[RHT_GANONS_CASTLE_SILVER] = HintText(CustomMessage("They say that silver in #Ganon's Castle# holds #[[1]]#.", TODO_TRANSLATE, TODO_TRANSLATE, {QM_RED, QM_GREEN}));
/*--------------------------
| DEKU TREE |
---------------------------*/

View file

@ -2091,6 +2091,8 @@ void StaticData::HintTable_Init_Item() {
}, {
CustomMessage("sack of mice", /*german*/"ein Sack Mäuse", /*french*/"un Sac rempli de souris")});
hintTextTable[RHT_SILVER] = HintText(CustomMessage("a Silver Rupee", /*german*/ TODO_TRANSLATE, /*french*/ TODO_TRANSLATE));
hintTextTable[RHT_SKELETON_KEY] = HintText(CustomMessage("a Skeleton Key", /*german*/ "der Skelettschlüssel", /*french*/ "une Clé Squelette"),
// /*spanish*/una Llave Maestra
{

View file

@ -1201,60 +1201,62 @@ void GenerateItemPool() {
AddItemToMainPool(RG_SHADOW_TEMPLE_BOSS_KEY);
}
if (ctx->GetOption(RSK_SHUFFLE_SILVER)) {
if (ctx->GetOption(RSK_SHUFFLE_SILVER).Is(RO_SHUFFLE_SILVER_ON) ||
ctx->GetOption(RSK_SHUFFLE_SILVER).Is(RO_SHUFFLE_SILVER_WALLET)) {
bool isWallet = ctx->GetOption(RSK_SHUFFLE_SILVER).Is(RO_SHUFFLE_SILVER_WALLET);
auto dungeons = ctx->GetDungeons();
if (dungeons->GetDungeonFromScene(SCENE_DODONGOS_CAVERN)->IsMQ()) {
AddItemToMainPool(RG_DODONGOS_CAVERN_MQ_SILVER);
AddItemToMainPool(RG_DODONGOS_CAVERN_MQ_SILVER, isWallet ? 1 : 5);
}
if (dungeons->GetDungeonFromScene(SCENE_SHADOW_TEMPLE)->IsVanilla()) {
AddItemToMainPool(RG_SHADOW_SILVER_BLADES);
AddItemToMainPool(RG_SHADOW_SILVER_PIT);
AddItemToMainPool(RG_SHADOW_SILVER_SPIKES);
AddItemToMainPool(RG_SHADOW_SILVER_BLADES, isWallet ? 1 : 5);
AddItemToMainPool(RG_SHADOW_SILVER_PIT, isWallet ? 1 : 5);
AddItemToMainPool(RG_SHADOW_SILVER_SPIKES, isWallet ? 1 : 5);
} 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);
AddItemToMainPool(RG_SHADOW_MQ_SILVER_BLADES, isWallet ? 1 : 5);
AddItemToMainPool(RG_SHADOW_MQ_SILVER_PIT, isWallet ? 1 : 5);
AddItemToMainPool(RG_SHADOW_MQ_SILVER_INVISIBLE_BLADES, isWallet ? 1 : 10);
AddItemToMainPool(RG_SHADOW_MQ_SILVER_SPIKES, isWallet ? 1 : 10);
}
if (dungeons->GetDungeonFromScene(SCENE_SPIRIT_TEMPLE)->IsVanilla()) {
AddItemToMainPool(RG_SPIRIT_SILVER_CHILD);
AddItemToMainPool(RG_SPIRIT_SILVER_SUN);
AddItemToMainPool(RG_SPIRIT_SILVER_BOULDERS);
AddItemToMainPool(RG_SPIRIT_SILVER_CHILD, isWallet ? 1 : 5);
AddItemToMainPool(RG_SPIRIT_SILVER_SUN, isWallet ? 1 : 5);
AddItemToMainPool(RG_SPIRIT_SILVER_BOULDERS, isWallet ? 1 : 5);
} else {
AddItemToMainPool(RG_SPIRIT_MQ_SILVER_LOBBY);
AddItemToMainPool(RG_SPIRIT_MQ_SILVER_BIG_WALL);
AddItemToMainPool(RG_SPIRIT_MQ_SILVER_LOBBY, isWallet ? 1 : 5);
AddItemToMainPool(RG_SPIRIT_MQ_SILVER_BIG_WALL, isWallet ? 1 : 5);
}
if (dungeons->GetDungeonFromScene(SCENE_BOTTOM_OF_THE_WELL)->IsVanilla()) {
AddItemToMainPool(RG_BOTW_SILVER);
AddItemToMainPool(RG_BOTW_SILVER, isWallet ? 1 : 5);
}
if (dungeons->GetDungeonFromScene(SCENE_ICE_CAVERN)->IsVanilla()) {
AddItemToMainPool(RG_ICE_CAVERN_SILVER_BLADES);
AddItemToMainPool(RG_ICE_CAVERN_SILVER_BLOCK);
AddItemToMainPool(RG_ICE_CAVERN_SILVER_BLADES, isWallet ? 1 : 5);
AddItemToMainPool(RG_ICE_CAVERN_SILVER_BLOCK, isWallet ? 1 : 5);
}
if (dungeons->GetDungeonFromScene(SCENE_GERUDO_TRAINING_GROUND)->IsVanilla()) {
AddItemToMainPool(RG_GTG_SILVER_SLOPE);
AddItemToMainPool(RG_GTG_SILVER_LAVA);
AddItemToMainPool(RG_GTG_SILVER_WATER);
AddItemToMainPool(RG_GTG_SILVER_SLOPE, isWallet ? 1 : 5);
AddItemToMainPool(RG_GTG_SILVER_LAVA, isWallet ? 1 : 5);
AddItemToMainPool(RG_GTG_SILVER_WATER, isWallet ? 1 : 5);
} else {
AddItemToMainPool(RG_GTG_MQ_SILVER_SLOPE);
AddItemToMainPool(RG_GTG_MQ_SILVER_LAVA);
AddItemToMainPool(RG_GTG_MQ_SILVER_WATER);
AddItemToMainPool(RG_GTG_MQ_SILVER_SLOPE, isWallet ? 1 : 5);
AddItemToMainPool(RG_GTG_MQ_SILVER_LAVA, isWallet ? 1 : 6);
AddItemToMainPool(RG_GTG_MQ_SILVER_WATER, isWallet ? 1 : 3);
}
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);
AddItemToMainPool(RG_GANONS_CASTLE_SILVER_LIGHT, isWallet ? 1 : 5);
AddItemToMainPool(RG_GANONS_CASTLE_SILVER_FOREST, isWallet ? 1 : 5);
AddItemToMainPool(RG_GANONS_CASTLE_SILVER_FIRE, isWallet ? 1 : 5);
AddItemToMainPool(RG_GANONS_CASTLE_SILVER_SPIRIT, isWallet ? 1 : 5);
} else {
AddItemToMainPool(RG_GANONS_CASTLE_MQ_SILVER_FIRE);
AddItemToMainPool(RG_GANONS_CASTLE_MQ_SILVER_WATER);
AddItemToMainPool(RG_GANONS_CASTLE_MQ_SILVER_SHADOW);
AddItemToMainPool(RG_GANONS_CASTLE_MQ_SILVER_FIRE, isWallet ? 1 : 5);
AddItemToMainPool(RG_GANONS_CASTLE_MQ_SILVER_WATER, isWallet ? 1 : 5);
AddItemToMainPool(RG_GANONS_CASTLE_MQ_SILVER_SHADOW, isWallet ? 1 : 5);
}
}

View file

@ -54,6 +54,12 @@ void GenerateStartingInventory() {
AddItemToInventory(RG_SHADOW_TEMPLE_BOSS_KEY);
}
if (ctx->GetOption(RSK_SHUFFLE_SILVER).Is(RO_SHUFFLE_SILVER_STARTWITH)) {
for (int rg = (int)RG_SHADOW_SILVER_BLADES; rg <= (int)RG_GANONS_CASTLE_MQ_SILVER_SHADOW; rg++) {
AddItemToInventory((RandomizerGet)rg);
}
}
// Add Ganon's Boss key with Triforce Hunt so the game thinks it's obtainable from the start.
// During save init, the boss key isn't actually given and it's instead given when completing the triforce.
if (ctx->GetOption(RSK_GANONS_BOSS_KEY).Is(RO_GANON_BOSS_KEY_STARTWITH) || ctx->GetOption(RSK_TRIFORCE_HUNT)) {

View file

@ -12,72 +12,75 @@ extern SaveContext gSaveContext;
}
static bool IsSilverCleared(s16 switchFlag) {
bool isMQ =
Rando::Context::GetInstance()->GetDungeons()->GetDungeonFromScene(gPlayState->sceneNum)->IsMQ();
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);
return gSaveContext.ship.quest.data.randomizer.silverMqDodongosCavern >= 5;
case SCENE_SHADOW_TEMPLE:
switch (switchFlag) {
case 1:
return Flags_GetRandomizerInf(isMQ ? RAND_INF_SHADOW_MQ_SILVER_BLADES
: RAND_INF_SHADOW_SILVER_BLADES);
return isMQ ? gSaveContext.ship.quest.data.randomizer.silverMqShadowBlades >= 5
: gSaveContext.ship.quest.data.randomizer.silverShadowBlades >= 5;
case 3:
return Flags_GetRandomizerInf(RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES);
return gSaveContext.ship.quest.data.randomizer.silverMqShadowInvisibleBlades >= 10;
case 8:
return Flags_GetRandomizerInf(isMQ ? RAND_INF_SHADOW_MQ_SILVER_SPIKES
: RAND_INF_SHADOW_SILVER_SPIKES);
return isMQ ? gSaveContext.ship.quest.data.randomizer.silverMqShadowSpikes >= 10
: gSaveContext.ship.quest.data.randomizer.silverShadowSpikes >= 5;
case 9:
return Flags_GetRandomizerInf(RAND_INF_SHADOW_SILVER_PIT);
return gSaveContext.ship.quest.data.randomizer.silverShadowPit >= 5;
case 17:
return Flags_GetRandomizerInf(RAND_INF_SHADOW_MQ_SILVER_PIT);
return gSaveContext.ship.quest.data.randomizer.silverMqShadowPit >= 5;
}
case SCENE_SPIRIT_TEMPLE:
switch (switchFlag) {
case 0:
return Flags_GetRandomizerInf(RAND_INF_SPIRIT_MQ_SILVER_BIG_WALL);
return gSaveContext.ship.quest.data.randomizer.silverMqSpiritBigWall;
case 2:
return Flags_GetRandomizerInf(RAND_INF_SPIRIT_SILVER_BOULDERS);
return gSaveContext.ship.quest.data.randomizer.silverSpiritBoulders;
case 5:
return Flags_GetRandomizerInf(RAND_INF_SPIRIT_SILVER_CHILD);
return gSaveContext.ship.quest.data.randomizer.silverSpiritChild;
case 10:
return Flags_GetRandomizerInf(RAND_INF_SPIRIT_SILVER_SUN);
return gSaveContext.ship.quest.data.randomizer.silverSpiritSun;
case 55:
return Flags_GetRandomizerInf(RAND_INF_SPIRIT_MQ_SILVER_LOBBY);
return gSaveContext.ship.quest.data.randomizer.silverMqSpiritLobby;
}
case SCENE_BOTTOM_OF_THE_WELL:
return Flags_GetRandomizerInf(RAND_INF_BOTW_SILVER);
return gSaveContext.ship.quest.data.randomizer.silverBotw >= 5;
case SCENE_ICE_CAVERN:
switch (switchFlag) {
case 8:
return Flags_GetRandomizerInf(RAND_INF_ICE_CAVERN_SILVER_BLOCK);
return gSaveContext.ship.quest.data.randomizer.silverIceCavernBlock >= 5;
case 31:
return Flags_GetRandomizerInf(RAND_INF_ICE_CAVERN_SILVER_BLADES);
return gSaveContext.ship.quest.data.randomizer.silverIceCavernBlades >= 5;
}
case SCENE_GERUDO_TRAINING_GROUND:
switch (switchFlag) {
case 12:
return Flags_GetRandomizerInf(isMQ ? RAND_INF_GTG_MQ_SILVER_LAVA : RAND_INF_GTG_SILVER_LAVA);
return isMQ ? gSaveContext.ship.quest.data.randomizer.silverMqGtgLava >= 6
: gSaveContext.ship.quest.data.randomizer.silverGtgLava >= 5;
case 27:
return Flags_GetRandomizerInf(isMQ ? RAND_INF_GTG_MQ_SILVER_WATER : RAND_INF_GTG_SILVER_WATER);
return isMQ ? gSaveContext.ship.quest.data.randomizer.silverMqGtgWater >= 3
: gSaveContext.ship.quest.data.randomizer.silverGtgWater >= 5;
case 28:
return Flags_GetRandomizerInf(isMQ ? RAND_INF_GTG_MQ_SILVER_SLOPE : RAND_INF_GTG_SILVER_SLOPE);
return isMQ ? gSaveContext.ship.quest.data.randomizer.silverMqGtgSlope >= 5
: gSaveContext.ship.quest.data.randomizer.silverGtgSlope >= 5;
}
case SCENE_INSIDE_GANONS_CASTLE:
switch (switchFlag) {
case 1:
return Flags_GetRandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SILVER_FIRE);
return gSaveContext.ship.quest.data.randomizer.silverMqGanonFire >= 5;
case 2:
return Flags_GetRandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SILVER_WATER);
return gSaveContext.ship.quest.data.randomizer.silverMqGanonWater >= 5;
case 9:
return Flags_GetRandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_FIRE);
return gSaveContext.ship.quest.data.randomizer.silverGanonFire >= 5;
case 11:
return Flags_GetRandomizerInf(isMQ ? RAND_INF_GANONS_CASTLE_MQ_SILVER_SHADOW
: RAND_INF_GANONS_CASTLE_SILVER_SPIRIT);
return isMQ ? gSaveContext.ship.quest.data.randomizer.silverMqGanonShadow >= 5
: gSaveContext.ship.quest.data.randomizer.silverGanonSpirit >= 5;
case 14:
return Flags_GetRandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_FOREST);
return gSaveContext.ship.quest.data.randomizer.silverGanonForest >= 5;
case 18:
return Flags_GetRandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_LIGHT);
return gSaveContext.ship.quest.data.randomizer.silverGanonLight >= 5;
}
}
return false;
@ -89,24 +92,25 @@ void RegisterShuffleSilver() {
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);
auto silverIdentity = OTRGlobals::Instance->gRandomizer->IdentifySilver(
gPlayState->sceneNum, (s16)silver->actor.world.pos.x, (s16)silver->actor.world.pos.z);
*should = true;
LUSLOG_WARN("!!%d %d %d %d", silver->type, silverIdentity.randomizerCheck,
(s16)silver->actor.world.pos.x, (s16)silver->actor.world.pos.z);
LUSLOG_WARN("!!%d %d %d %d", silver->type, silverIdentity.randomizerCheck, (s16)silver->actor.world.pos.x,
(s16)silver->actor.world.pos.z);
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_SOH_GIVE_ITEM_ENTRY, false);
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_SOH_GIVE_ITEM_ENTRY, false);
LUSLOG_WARN("!!%p", spawnedActor);
spawnedActor->randoCheck = silverIdentity.randomizerCheck;
spawnedActor->randoInf = silverIdentity.randomizerInf;
spawnedActor->itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry(
silverIdentity.randomizerCheck, true, (GetItemID)Rando::StaticData::GetLocation(silverIdentity.randomizerCheck)->GetVanillaItem());
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);

View file

@ -1119,15 +1119,15 @@ extern "C" void Randomizer_DrawSilverRupee(PlayState* play, GetItemEntry* getIte
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);
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);
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);
}

View file

@ -242,63 +242,63 @@ void Rando::StaticData::InitItemTable() {
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] = Item(RG_SHADOW_SILVER_BLADES, Text{ "Shadow Silver: Blades" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_SHADOW_SILVER_PIT, Text{ "Shadow Silver: Pit" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_SHADOW_SILVER_SPIKES, Text{ "Shadow Silver: Spikes" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_SPIRIT_SILVER_CHILD, Text{ "Spirit Silver: Child" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_SPIRIT_SILVER_SUN, Text{ "Spirit Silver: Sun" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_SPIRIT_SILVER_BOULDERS, Text{ "Spirit Silver: Boulders" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_BOTW_SILVER, Text{ "Bottom of the Well Silver" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_ICE_CAVERN_SILVER_BLADES, Text{ "Ice Cavern Silver: Blades" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_ICE_CAVERN_SILVER_BLOCK, Text{ "Ice Cavern Silver: Block" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_GTG_SILVER_SLOPE, Text{ "Training Ground Silver: Slope" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_GTG_SILVER_LAVA, Text{ "Training Ground Silver: Lava" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_GTG_SILVER_WATER, Text{ "Training Ground Silver: Water" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_GANONS_CASTLE_SILVER_LIGHT, Text{ "Ganon's Castle Silver: Light" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_GANONS_CASTLE_SILVER_FOREST, Text{ "Ganon's Castle Silver: Forest" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_GANONS_CASTLE_SILVER_FIRE, Text{ "Ganon's Castle Silver: Fire" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_GANONS_CASTLE_SILVER_SPIRIT, Text{ "Ganon's Castle Silver: Spirit" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_DODONGOS_CAVERN_MQ_SILVER, Text{ "Dodongo's Cavern Silver" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_SHADOW_MQ_SILVER_BLADES, Text{ "Shadow Silver: Blades" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_SHADOW_MQ_SILVER_PIT, Text{ "Shadow Silver: Pit" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_SHADOW_MQ_SILVER_INVISIBLE_BLADES, Text{ "Shadow Silver: Invisible Blades" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_SHADOW_MQ_SILVER_SPIKES, Text{ "Shadow Silver: Spikes" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_SPIRIT_MQ_SILVER_LOBBY, Text{ "Spirit Silver: Lobby" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_SPIRIT_MQ_SILVER_BIG_WALL, Text{ "Spirit Silver: Big Wall" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_GTG_MQ_SILVER_SLOPE, Text{ "Training Ground Silver: Slope" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_GTG_MQ_SILVER_LAVA, Text{ "Training Ground Silver: Lava" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_GTG_MQ_SILVER_WATER, Text{ "Training Ground Silver: Water" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_GANONS_CASTLE_MQ_SILVER_FIRE, Text{ "Ganon's Castle Silver: Fire" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_GANONS_CASTLE_MQ_SILVER_WATER, Text{ "Ganon's Castle Silver: Water" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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] = Item(RG_GANONS_CASTLE_MQ_SILVER_SHADOW, Text{ "Ganon's Castle Silver: Shadow" }, ITEMTYPE_ITEM, GI_RUPEE_GOLD, true, LOGIC_NONE, RHT_SILVER, 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);

View file

@ -1910,23 +1910,41 @@ void Logic::ApplyItemEffect(Item& item, bool state) {
case ITEMTYPE_FORTRESS_SMALLKEY:
case ITEMTYPE_SMALLKEY: {
auto randoGet = item.GetRandomizerGet();
auto keyring = randoGet >= RG_FOREST_TEMPLE_KEY_RING && randoGet <= RG_GANONS_CASTLE_KEY_RING;
auto dungeonIndex = RandoGetToDungeonScene.find(randoGet)->second;
auto count = GetSmallKeyCount(dungeonIndex);
if (!state) {
if (keyring) {
count = 0;
if (randoGet >= RG_SHADOW_SILVER_BLADES && randoGet <= RG_GANONS_CASTLE_MQ_SILVER_SHADOW) {
s8* field = Randomizer::SilverFieldFromSaveContext(randoGet);
bool isWallet = ctx->GetOption(RSK_SHUFFLE_SILVER).Is(RO_SHUFFLE_SILVER_WALLET);
if (!state) {
if (isWallet) {
*field = 0;
} else {
*field -= 1;
}
} else {
count -= 1;
if (isWallet) {
*field = 10;
} else {
*field += 1;
}
}
} else {
if (keyring) {
count = 10;
auto keyring = randoGet >= RG_FOREST_TEMPLE_KEY_RING && randoGet <= RG_GANONS_CASTLE_KEY_RING;
auto dungeonIndex = RandoGetToDungeonScene.find(randoGet)->second;
auto count = GetSmallKeyCount(dungeonIndex);
if (!state) {
if (keyring) {
count = 0;
} else {
count -= 1;
}
} else {
count += 1;
if (keyring) {
count = 10;
} else {
count += 1;
}
}
SetSmallKeyCount(dungeonIndex, count);
}
SetSmallKeyCount(dungeonIndex, count);
} break;
case ITEMTYPE_TOKEN:
mSaveContext->inventory.gsTokens += (!state ? -1 : 1);

View file

@ -477,8 +477,8 @@ void Settings::CreateOptionDescriptions() {
"\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.";
"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. "

View file

@ -762,6 +762,71 @@ bool Randomizer::IsTrialRequired(s32 trialFlag) {
return Rando::Context::GetInstance()->GetTrial(trialFlagToTrialKey[trialFlag])->IsRequired();
}
s8* Randomizer::SilverFieldFromSaveContext(RandomizerGet rg) {
switch (rg) {
case RG_SHADOW_SILVER_BLADES:
return &gSaveContext.ship.quest.data.randomizer.silverShadowBlades;
case RG_SHADOW_SILVER_PIT:
return &gSaveContext.ship.quest.data.randomizer.silverShadowPit;
case RG_SHADOW_SILVER_SPIKES:
return &gSaveContext.ship.quest.data.randomizer.silverShadowSpikes;
case RG_SPIRIT_SILVER_CHILD:
return &gSaveContext.ship.quest.data.randomizer.silverSpiritChild;
case RG_SPIRIT_SILVER_SUN:
return &gSaveContext.ship.quest.data.randomizer.silverSpiritSun;
case RG_SPIRIT_SILVER_BOULDERS:
return &gSaveContext.ship.quest.data.randomizer.silverSpiritBoulders;
case RG_BOTW_SILVER:
return &gSaveContext.ship.quest.data.randomizer.silverBotw;
case RG_ICE_CAVERN_SILVER_BLADES:
return &gSaveContext.ship.quest.data.randomizer.silverIceCavernBlades;
case RG_ICE_CAVERN_SILVER_BLOCK:
return &gSaveContext.ship.quest.data.randomizer.silverIceCavernBlock;
case RG_GTG_SILVER_SLOPE:
return &gSaveContext.ship.quest.data.randomizer.silverGtgSlope;
case RG_GTG_SILVER_LAVA:
return &gSaveContext.ship.quest.data.randomizer.silverGtgLava;
case RG_GTG_SILVER_WATER:
return &gSaveContext.ship.quest.data.randomizer.silverGtgWater;
case RG_GANONS_CASTLE_SILVER_LIGHT:
return &gSaveContext.ship.quest.data.randomizer.silverGanonLight;
case RG_GANONS_CASTLE_SILVER_FOREST:
return &gSaveContext.ship.quest.data.randomizer.silverGanonForest;
case RG_GANONS_CASTLE_SILVER_FIRE:
return &gSaveContext.ship.quest.data.randomizer.silverGanonFire;
case RG_GANONS_CASTLE_SILVER_SPIRIT:
return &gSaveContext.ship.quest.data.randomizer.silverGanonSpirit;
case RG_DODONGOS_CAVERN_MQ_SILVER:
return &gSaveContext.ship.quest.data.randomizer.silverMqDodongosCavern;
case RG_SHADOW_MQ_SILVER_BLADES:
return &gSaveContext.ship.quest.data.randomizer.silverMqShadowBlades;
case RG_SHADOW_MQ_SILVER_PIT:
return &gSaveContext.ship.quest.data.randomizer.silverMqShadowPit;
case RG_SHADOW_MQ_SILVER_INVISIBLE_BLADES:
return &gSaveContext.ship.quest.data.randomizer.silverMqShadowInvisibleBlades;
case RG_SHADOW_MQ_SILVER_SPIKES:
return &gSaveContext.ship.quest.data.randomizer.silverMqShadowSpikes;
case RG_SPIRIT_MQ_SILVER_LOBBY:
return &gSaveContext.ship.quest.data.randomizer.silverMqSpiritLobby;
case RG_SPIRIT_MQ_SILVER_BIG_WALL:
return &gSaveContext.ship.quest.data.randomizer.silverMqSpiritBigWall;
case RG_GTG_MQ_SILVER_SLOPE:
return &gSaveContext.ship.quest.data.randomizer.silverMqGtgSlope;
case RG_GTG_MQ_SILVER_LAVA:
return &gSaveContext.ship.quest.data.randomizer.silverMqGtgLava;
case RG_GTG_MQ_SILVER_WATER:
return &gSaveContext.ship.quest.data.randomizer.silverMqGtgWater;
case RG_GANONS_CASTLE_MQ_SILVER_FIRE:
return &gSaveContext.ship.quest.data.randomizer.silverMqGanonFire;
case RG_GANONS_CASTLE_MQ_SILVER_WATER:
return &gSaveContext.ship.quest.data.randomizer.silverMqGanonWater;
case RG_GANONS_CASTLE_MQ_SILVER_SHADOW:
return &gSaveContext.ship.quest.data.randomizer.silverMqGanonShadow;
default:
return nullptr;
}
}
GetItemEntry Randomizer::GetItemFromActor(s16 actorId, s16 sceneNum, s16 actorParams, GetItemID ogItemId,
bool checkObtainability) {
return Rando::Context::GetInstance()->GetFinalGIEntry(GetCheckFromActor(actorId, sceneNum, actorParams),
@ -5938,22 +6003,28 @@ void Randomizer::CreateCustomMessages() {
GIMESSAGE_UNTRANSLATED(RG_GTG_SILVER_LAVA, ITEM_KEY_SMALL, "You found Training Ground Silver: Lava"),
GIMESSAGE_UNTRANSLATED(RG_GTG_SILVER_WATER, ITEM_KEY_SMALL, "You found Training Ground Silver: Water"),
GIMESSAGE_UNTRANSLATED(RG_GANONS_CASTLE_SILVER_LIGHT, ITEM_KEY_SMALL, "You found Ganon's Castle Silver: Light"),
GIMESSAGE_UNTRANSLATED(RG_GANONS_CASTLE_SILVER_FOREST, ITEM_KEY_SMALL, "You found Ganon's Castle Silver: Forest"),
GIMESSAGE_UNTRANSLATED(RG_GANONS_CASTLE_SILVER_FOREST, ITEM_KEY_SMALL,
"You found Ganon's Castle Silver: Forest"),
GIMESSAGE_UNTRANSLATED(RG_GANONS_CASTLE_SILVER_FIRE, ITEM_KEY_SMALL, "You found Ganon's Castle Silver: Fire"),
GIMESSAGE_UNTRANSLATED(RG_GANONS_CASTLE_SILVER_SPIRIT, ITEM_KEY_SMALL, "You found Ganon's Castle Silver: Spirit"),
GIMESSAGE_UNTRANSLATED(RG_GANONS_CASTLE_SILVER_SPIRIT, ITEM_KEY_SMALL,
"You found Ganon's Castle Silver: Spirit"),
GIMESSAGE_UNTRANSLATED(RG_DODONGOS_CAVERN_MQ_SILVER, ITEM_KEY_SMALL, "You found Dodongo's Cavern Silver"),
GIMESSAGE_UNTRANSLATED(RG_SHADOW_MQ_SILVER_BLADES, ITEM_KEY_SMALL, "You found Shadow Silver: Blades"),
GIMESSAGE_UNTRANSLATED(RG_SHADOW_MQ_SILVER_PIT, ITEM_KEY_SMALL, "You found Shadow Silver: Pit"),
GIMESSAGE_UNTRANSLATED(RG_SHADOW_MQ_SILVER_INVISIBLE_BLADES, ITEM_KEY_SMALL, "You found Shadow Silver: Invisible Blades"),
GIMESSAGE_UNTRANSLATED(RG_SHADOW_MQ_SILVER_INVISIBLE_BLADES, ITEM_KEY_SMALL,
"You found Shadow Silver: Invisible Blades"),
GIMESSAGE_UNTRANSLATED(RG_SHADOW_MQ_SILVER_SPIKES, ITEM_KEY_SMALL, "You found Shadow Silver: Spikes"),
GIMESSAGE_UNTRANSLATED(RG_SPIRIT_MQ_SILVER_LOBBY, ITEM_KEY_SMALL, "You found Spirit Silver: Lobby"),
GIMESSAGE_UNTRANSLATED(RG_SPIRIT_MQ_SILVER_BIG_WALL, ITEM_KEY_SMALL, "You found Spirit Silver: Big Wall"),
GIMESSAGE_UNTRANSLATED(RG_GTG_MQ_SILVER_SLOPE, ITEM_KEY_SMALL, "You found Training Ground Silver: Slope"),
GIMESSAGE_UNTRANSLATED(RG_GTG_MQ_SILVER_LAVA, ITEM_KEY_SMALL, "You found Training Ground Silver: Lava"),
GIMESSAGE_UNTRANSLATED(RG_GTG_MQ_SILVER_WATER, ITEM_KEY_SMALL, "You found Training Ground Silver: Water"),
GIMESSAGE_UNTRANSLATED(RG_GANONS_CASTLE_MQ_SILVER_FIRE, ITEM_KEY_SMALL, "You found Ganon's Castle Silver: Fire"),
GIMESSAGE_UNTRANSLATED(RG_GANONS_CASTLE_MQ_SILVER_WATER, ITEM_KEY_SMALL, "You found Ganon's Castle Silver: Water"),
GIMESSAGE_UNTRANSLATED(RG_GANONS_CASTLE_MQ_SILVER_SHADOW, ITEM_KEY_SMALL, "You found Ganon's Castle Silver: Shadow"),
GIMESSAGE_UNTRANSLATED(RG_GANONS_CASTLE_MQ_SILVER_FIRE, ITEM_KEY_SMALL,
"You found Ganon's Castle Silver: Fire"),
GIMESSAGE_UNTRANSLATED(RG_GANONS_CASTLE_MQ_SILVER_WATER, ITEM_KEY_SMALL,
"You found Ganon's Castle Silver: Water"),
GIMESSAGE_UNTRANSLATED(RG_GANONS_CASTLE_MQ_SILVER_SHADOW, ITEM_KEY_SMALL,
"You found Ganon's Castle Silver: Shadow"),
} };
CreateGetItemMessages(getItemMessages);
CreateRupeeMessages();
@ -6049,35 +6120,6 @@ std::map<RandomizerGet, RandomizerInf> randomizerGetToRandInf = {
{ RG_BONGO_BONGO_SOUL, RAND_INF_BONGO_BONGO_SOUL },
{ RG_TWINROVA_SOUL, RAND_INF_TWINROVA_SOUL },
{ RG_GANON_SOUL, RAND_INF_GANON_SOUL },
{ RG_SHADOW_SILVER_BLADES, RAND_INF_SHADOW_SILVER_BLADES },
{ RG_SHADOW_SILVER_PIT, RAND_INF_SHADOW_SILVER_PIT },
{ RG_SHADOW_SILVER_SPIKES, RAND_INF_SHADOW_SILVER_SPIKES },
{ RG_SPIRIT_SILVER_CHILD, RAND_INF_SPIRIT_SILVER_CHILD },
{ RG_SPIRIT_SILVER_SUN, RAND_INF_SPIRIT_SILVER_SUN },
{ RG_SPIRIT_SILVER_BOULDERS, RAND_INF_SPIRIT_SILVER_BOULDERS },
{ RG_BOTW_SILVER, RAND_INF_BOTW_SILVER },
{ RG_ICE_CAVERN_SILVER_BLADES, RAND_INF_ICE_CAVERN_SILVER_BLADES },
{ RG_ICE_CAVERN_SILVER_BLOCK, RAND_INF_ICE_CAVERN_SILVER_BLOCK },
{ RG_GTG_SILVER_SLOPE, RAND_INF_GTG_SILVER_SLOPE },
{ RG_GTG_SILVER_LAVA, RAND_INF_GTG_SILVER_LAVA },
{ RG_GTG_SILVER_WATER, RAND_INF_GTG_SILVER_WATER },
{ RG_GANONS_CASTLE_SILVER_LIGHT, RAND_INF_GANONS_CASTLE_SILVER_LIGHT },
{ RG_GANONS_CASTLE_SILVER_FOREST, RAND_INF_GANONS_CASTLE_SILVER_FOREST },
{ RG_GANONS_CASTLE_SILVER_FIRE, RAND_INF_GANONS_CASTLE_SILVER_FIRE },
{ RG_GANONS_CASTLE_SILVER_SPIRIT, RAND_INF_GANONS_CASTLE_SILVER_SPIRIT },
{ RG_DODONGOS_CAVERN_MQ_SILVER, RAND_INF_DODONGOS_CAVERN_MQ_SILVER },
{ RG_SHADOW_MQ_SILVER_BLADES, RAND_INF_SHADOW_MQ_SILVER_BLADES },
{ RG_SHADOW_MQ_SILVER_PIT, RAND_INF_SHADOW_MQ_SILVER_PIT },
{ RG_SHADOW_MQ_SILVER_INVISIBLE_BLADES, RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES },
{ RG_SHADOW_MQ_SILVER_SPIKES, RAND_INF_SHADOW_MQ_SILVER_SPIKES },
{ RG_SPIRIT_MQ_SILVER_LOBBY, RAND_INF_SPIRIT_MQ_SILVER_LOBBY },
{ RG_SPIRIT_MQ_SILVER_BIG_WALL, RAND_INF_SPIRIT_MQ_SILVER_BIG_WALL },
{ RG_GTG_MQ_SILVER_SLOPE, RAND_INF_GTG_MQ_SILVER_SLOPE },
{ RG_GTG_MQ_SILVER_LAVA, RAND_INF_GTG_MQ_SILVER_LAVA },
{ RG_GTG_MQ_SILVER_WATER, RAND_INF_GTG_MQ_SILVER_WATER },
{ RG_GANONS_CASTLE_MQ_SILVER_FIRE, RAND_INF_GANONS_CASTLE_MQ_SILVER_FIRE },
{ RG_GANONS_CASTLE_MQ_SILVER_WATER, RAND_INF_GANONS_CASTLE_MQ_SILVER_WATER },
{ RG_GANONS_CASTLE_MQ_SILVER_SHADOW, RAND_INF_GANONS_CASTLE_MQ_SILVER_SHADOW },
};
extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) {
@ -6361,6 +6403,43 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) {
INV_CONTENT(ITEM_NUT) = ITEM_NUT;
AMMO(ITEM_NUT) = static_cast<int8_t>(CUR_CAPACITY(UPG_NUTS));
break;
case RG_SHADOW_SILVER_BLADES:
case RG_SHADOW_SILVER_PIT:
case RG_SHADOW_SILVER_SPIKES:
case RG_SPIRIT_SILVER_CHILD:
case RG_SPIRIT_SILVER_SUN:
case RG_SPIRIT_SILVER_BOULDERS:
case RG_BOTW_SILVER:
case RG_ICE_CAVERN_SILVER_BLADES:
case RG_ICE_CAVERN_SILVER_BLOCK:
case RG_GTG_SILVER_SLOPE:
case RG_GTG_SILVER_LAVA:
case RG_GTG_SILVER_WATER:
case RG_GANONS_CASTLE_SILVER_LIGHT:
case RG_GANONS_CASTLE_SILVER_FOREST:
case RG_GANONS_CASTLE_SILVER_FIRE:
case RG_GANONS_CASTLE_SILVER_SPIRIT:
case RG_DODONGOS_CAVERN_MQ_SILVER:
case RG_SHADOW_MQ_SILVER_BLADES:
case RG_SHADOW_MQ_SILVER_PIT:
case RG_SHADOW_MQ_SILVER_INVISIBLE_BLADES:
case RG_SHADOW_MQ_SILVER_SPIKES:
case RG_SPIRIT_MQ_SILVER_LOBBY:
case RG_SPIRIT_MQ_SILVER_BIG_WALL:
case RG_GTG_MQ_SILVER_SLOPE:
case RG_GTG_MQ_SILVER_LAVA:
case RG_GTG_MQ_SILVER_WATER:
case RG_GANONS_CASTLE_MQ_SILVER_FIRE:
case RG_GANONS_CASTLE_MQ_SILVER_WATER:
case RG_GANONS_CASTLE_MQ_SILVER_SHADOW: {
s8* field = Randomizer::SilverFieldFromSaveContext(item);
if (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_SILVER) ==
RO_SHUFFLE_SILVER_WALLET) {
*field = 10;
} else {
*field += 1;
}
}
default:
LUSLOG_WARN("Randomizer_Item_Give didn't have behaviour specified for getItemId=%d", item);
assert(false);

View file

@ -44,6 +44,7 @@ class Randomizer {
void LoadMerchantMessages();
void LoadHintMessages();
bool IsTrialRequired(s32 trialFlag);
static s8* SilverFieldFromSaveContext(RandomizerGet rg);
u8 GetRandoSettingValue(RandomizerSettingKey randoSettingKey);
RandomizerCheck GetCheckFromRandomizerInf(RandomizerInf randomizerInf);
RandomizerInf GetRandomizerInfFromCheck(RandomizerCheck rc);

View file

@ -5391,6 +5391,7 @@ typedef enum {
RHT_BRONZE_SCALE,
RHT_FISHING_POLE,
RHT_SKELETON_KEY,
RHT_SILVER,
RHT_EPONA,
RHT_OVERWORLD_KEY,
RHT_HINT_MYSTERIOUS,
@ -6495,6 +6496,14 @@ typedef enum {
RO_SHUFFLE_FREESTANDING_ALL,
} RandoOptionFreestanding;
// Shuffle Silver settings (off, on, wallet, start with)
typedef enum {
RO_SHUFFLE_SILVER_OFF,
RO_SHUFFLE_SILVER_ON,
RO_SHUFFLE_SILVER_WALLET,
RO_SHUFFLE_SILVER_STARTWITH,
} RandoOptionSilver;
// Shuffle Pots settings (off, dungeons, overworld, all)
typedef enum {
RO_SHUFFLE_POTS_OFF,

View file

@ -1468,36 +1468,6 @@ 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)

View file

@ -209,6 +209,12 @@ void SetStartingItems() {
}
}
if (Randomizer_GetSettingValue(RSK_SHUFFLE_SILVER) == RO_SHUFFLE_SILVER_STARTWITH) {
for (int rg = (int)RG_SHADOW_SILVER_BLADES; rg <= (int)RG_GANONS_CASTLE_MQ_SILVER_SHADOW; rg++) {
*Randomizer::SilverFieldFromSaveContext((RandomizerGet)rg) = 10;
}
}
if (Randomizer_GetSettingValue(RSK_BOSS_KEYSANITY) == RO_DUNGEON_ITEM_LOC_STARTWITH) {
gSaveContext.inventory.dungeonItems[SCENE_FOREST_TEMPLE] |= 1; // Forest
gSaveContext.inventory.dungeonItems[SCENE_FIRE_TEMPLE] |= 1; // Fire

View file

@ -237,8 +237,7 @@ 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_SHUFFLE_SILVER, "Shuffle Silver Rupees", {"Off", "On", "Wallet", "Start With"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("ShuffleSilver"), mOptionDescriptions[RSK_SHUFFLE_SILVER], WidgetType::Combobox, RO_SHUFFLE_SILVER_OFF);
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]);

View file

@ -225,6 +225,43 @@ void SaveManager::LoadRandomizer() {
SaveManager::Instance->LoadData("triforcePiecesCollected",
gSaveContext.ship.quest.data.randomizer.triforcePiecesCollected);
SaveManager::Instance->LoadData("silverShadowBlades", gSaveContext.ship.quest.data.randomizer.silverShadowBlades);
SaveManager::Instance->LoadData("silverShadowPit", gSaveContext.ship.quest.data.randomizer.silverShadowPit);
SaveManager::Instance->LoadData("silverShadowSpikes", gSaveContext.ship.quest.data.randomizer.silverShadowSpikes);
SaveManager::Instance->LoadData("silverSpiritChild", gSaveContext.ship.quest.data.randomizer.silverSpiritChild);
SaveManager::Instance->LoadData("silverSpiritSun", gSaveContext.ship.quest.data.randomizer.silverSpiritSun);
SaveManager::Instance->LoadData("silverSpiritBoulders",
gSaveContext.ship.quest.data.randomizer.silverSpiritBoulders);
SaveManager::Instance->LoadData("silverBotw", gSaveContext.ship.quest.data.randomizer.silverBotw);
SaveManager::Instance->LoadData("silverIceCavernBlades",
gSaveContext.ship.quest.data.randomizer.silverIceCavernBlades);
SaveManager::Instance->LoadData("silverIceCavernBlock",
gSaveContext.ship.quest.data.randomizer.silverIceCavernBlock);
SaveManager::Instance->LoadData("silverGtgSlope", gSaveContext.ship.quest.data.randomizer.silverGtgSlope);
SaveManager::Instance->LoadData("silverGtgLava", gSaveContext.ship.quest.data.randomizer.silverGtgLava);
SaveManager::Instance->LoadData("silverGtgWater", gSaveContext.ship.quest.data.randomizer.silverGtgWater);
SaveManager::Instance->LoadData("silverGanonLight", gSaveContext.ship.quest.data.randomizer.silverGanonLight);
SaveManager::Instance->LoadData("silverGanonForest", gSaveContext.ship.quest.data.randomizer.silverGanonForest);
SaveManager::Instance->LoadData("silverGanonFire", gSaveContext.ship.quest.data.randomizer.silverGanonFire);
SaveManager::Instance->LoadData("silverGanonSpirit", gSaveContext.ship.quest.data.randomizer.silverGanonSpirit);
SaveManager::Instance->LoadData("silverMqDodongosCavern",
gSaveContext.ship.quest.data.randomizer.silverMqDodongosCavern);
SaveManager::Instance->LoadData("silverMqShadowBlades",
gSaveContext.ship.quest.data.randomizer.silverMqShadowBlades);
SaveManager::Instance->LoadData("silverMqShadowPit", gSaveContext.ship.quest.data.randomizer.silverMqShadowPit);
SaveManager::Instance->LoadData("silverMqShadowInvisibleBlades",
gSaveContext.ship.quest.data.randomizer.silverMqShadowInvisibleBlades);
SaveManager::Instance->LoadData("silverMqShadowSpikes",
gSaveContext.ship.quest.data.randomizer.silverMqShadowSpikes);
SaveManager::Instance->LoadData("silverMqSpiritLobby", gSaveContext.ship.quest.data.randomizer.silverMqSpiritLobby);
SaveManager::Instance->LoadData("silverMqSpiritBigWall",
gSaveContext.ship.quest.data.randomizer.silverMqSpiritBigWall);
SaveManager::Instance->LoadData("silverMqGtgSlope", gSaveContext.ship.quest.data.randomizer.silverMqGtgSlope);
SaveManager::Instance->LoadData("silverMqGtgLava", gSaveContext.ship.quest.data.randomizer.silverMqGtgLava);
SaveManager::Instance->LoadData("silverMqGtgWater", gSaveContext.ship.quest.data.randomizer.silverMqGtgWater);
SaveManager::Instance->LoadData("silverMqGanonFire", gSaveContext.ship.quest.data.randomizer.silverMqGanonFire);
SaveManager::Instance->LoadData("silverMqGanonWater", gSaveContext.ship.quest.data.randomizer.silverMqGanonWater);
SaveManager::Instance->LoadData("silverMqGanonShadow", gSaveContext.ship.quest.data.randomizer.silverMqGanonShadow);
SaveManager::Instance->LoadData("pendingIceTrapCount", gSaveContext.ship.pendingIceTrapCount);
@ -377,6 +414,43 @@ void SaveManager::SaveRandomizer(SaveContext* saveContext, int sectionID, bool f
SaveManager::Instance->SaveData("triforcePiecesCollected",
saveContext->ship.quest.data.randomizer.triforcePiecesCollected);
SaveManager::Instance->SaveData("silverShadowBlades", gSaveContext.ship.quest.data.randomizer.silverShadowBlades);
SaveManager::Instance->SaveData("silverShadowPit", gSaveContext.ship.quest.data.randomizer.silverShadowPit);
SaveManager::Instance->SaveData("silverShadowSpikes", gSaveContext.ship.quest.data.randomizer.silverShadowSpikes);
SaveManager::Instance->SaveData("silverSpiritChild", gSaveContext.ship.quest.data.randomizer.silverSpiritChild);
SaveManager::Instance->SaveData("silverSpiritSun", gSaveContext.ship.quest.data.randomizer.silverSpiritSun);
SaveManager::Instance->SaveData("silverSpiritBoulders",
gSaveContext.ship.quest.data.randomizer.silverSpiritBoulders);
SaveManager::Instance->SaveData("silverBotw", gSaveContext.ship.quest.data.randomizer.silverBotw);
SaveManager::Instance->SaveData("silverIceCavernBlades",
gSaveContext.ship.quest.data.randomizer.silverIceCavernBlades);
SaveManager::Instance->SaveData("silverIceCavernBlock",
gSaveContext.ship.quest.data.randomizer.silverIceCavernBlock);
SaveManager::Instance->SaveData("silverGtgSlope", gSaveContext.ship.quest.data.randomizer.silverGtgSlope);
SaveManager::Instance->SaveData("silverGtgLava", gSaveContext.ship.quest.data.randomizer.silverGtgLava);
SaveManager::Instance->SaveData("silverGtgWater", gSaveContext.ship.quest.data.randomizer.silverGtgWater);
SaveManager::Instance->SaveData("silverGanonLight", gSaveContext.ship.quest.data.randomizer.silverGanonLight);
SaveManager::Instance->SaveData("silverGanonForest", gSaveContext.ship.quest.data.randomizer.silverGanonForest);
SaveManager::Instance->SaveData("silverGanonFire", gSaveContext.ship.quest.data.randomizer.silverGanonFire);
SaveManager::Instance->SaveData("silverGanonSpirit", gSaveContext.ship.quest.data.randomizer.silverGanonSpirit);
SaveManager::Instance->SaveData("silverMqDodongosCavern",
gSaveContext.ship.quest.data.randomizer.silverMqDodongosCavern);
SaveManager::Instance->SaveData("silverMqShadowBlades",
gSaveContext.ship.quest.data.randomizer.silverMqShadowBlades);
SaveManager::Instance->SaveData("silverMqShadowPit", gSaveContext.ship.quest.data.randomizer.silverMqShadowPit);
SaveManager::Instance->SaveData("silverMqShadowInvisibleBlades",
gSaveContext.ship.quest.data.randomizer.silverMqShadowInvisibleBlades);
SaveManager::Instance->SaveData("silverMqShadowSpikes",
gSaveContext.ship.quest.data.randomizer.silverMqShadowSpikes);
SaveManager::Instance->SaveData("silverMqSpiritLobby", gSaveContext.ship.quest.data.randomizer.silverMqSpiritLobby);
SaveManager::Instance->SaveData("silverMqSpiritBigWall",
gSaveContext.ship.quest.data.randomizer.silverMqSpiritBigWall);
SaveManager::Instance->SaveData("silverMqGtgSlope", gSaveContext.ship.quest.data.randomizer.silverMqGtgSlope);
SaveManager::Instance->SaveData("silverMqGtgLava", gSaveContext.ship.quest.data.randomizer.silverMqGtgLava);
SaveManager::Instance->SaveData("silverMqGtgWater", gSaveContext.ship.quest.data.randomizer.silverMqGtgWater);
SaveManager::Instance->SaveData("silverMqGanonFire", gSaveContext.ship.quest.data.randomizer.silverMqGanonFire);
SaveManager::Instance->SaveData("silverMqGanonWater", gSaveContext.ship.quest.data.randomizer.silverMqGanonWater);
SaveManager::Instance->SaveData("silverMqGanonShadow", gSaveContext.ship.quest.data.randomizer.silverMqGanonShadow);
SaveManager::Instance->SaveData("pendingIceTrapCount", saveContext->ship.pendingIceTrapCount);