diff --git a/soh/include/z64save.h b/soh/include/z64save.h index 63a9b1d10..163cd8d60 100644 --- a/soh/include/z64save.h +++ b/soh/include/z64save.h @@ -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 { diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp index aa375716f..11014378b 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_exclude_dungeon.cpp @@ -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 | ---------------------------*/ diff --git a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp index f5195c91d..b6666a0d8 100644 --- a/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/hint_list/hint_list_item.cpp @@ -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 { diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 66a04597f..93bc166dc 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -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); } } diff --git a/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp b/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp index dda37b18a..0d15f73e6 100644 --- a/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/starting_inventory.cpp @@ -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)) { diff --git a/soh/soh/Enhancements/randomizer/ShuffleSilver.cpp b/soh/soh/Enhancements/randomizer/ShuffleSilver.cpp index ea06df914..68d0bb321 100644 --- a/soh/soh/Enhancements/randomizer/ShuffleSilver.cpp +++ b/soh/soh/Enhancements/randomizer/ShuffleSilver.cpp @@ -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); diff --git a/soh/soh/Enhancements/randomizer/draw.cpp b/soh/soh/Enhancements/randomizer/draw.cpp index 749352afb..3c36b91af 100644 --- a/soh/soh/Enhancements/randomizer/draw.cpp +++ b/soh/soh/Enhancements/randomizer/draw.cpp @@ -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); } diff --git a/soh/soh/Enhancements/randomizer/item_list.cpp b/soh/soh/Enhancements/randomizer/item_list.cpp index 99f380d70..cc99047ee 100644 --- a/soh/soh/Enhancements/randomizer/item_list.cpp +++ b/soh/soh/Enhancements/randomizer/item_list.cpp @@ -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); diff --git a/soh/soh/Enhancements/randomizer/logic.cpp b/soh/soh/Enhancements/randomizer/logic.cpp index eea79e92d..5aab5e393 100644 --- a/soh/soh/Enhancements/randomizer/logic.cpp +++ b/soh/soh/Enhancements/randomizer/logic.cpp @@ -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); diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index c6c4ef1d2..4a91559e2 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -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. " diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index 48c36f706..c72a369a2 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -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 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(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); diff --git a/soh/soh/Enhancements/randomizer/randomizer.h b/soh/soh/Enhancements/randomizer/randomizer.h index c2f7f63e4..3a5acb20c 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.h +++ b/soh/soh/Enhancements/randomizer/randomizer.h @@ -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); diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index c4f98fac1..0235f650b 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -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, diff --git a/soh/soh/Enhancements/randomizer/randomizer_inf.h b/soh/soh/Enhancements/randomizer/randomizer_inf.h index 3863b796f..24104d708 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_inf.h +++ b/soh/soh/Enhancements/randomizer/randomizer_inf.h @@ -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) diff --git a/soh/soh/Enhancements/randomizer/savefile.cpp b/soh/soh/Enhancements/randomizer/savefile.cpp index 51101f6fa..633d15d16 100644 --- a/soh/soh/Enhancements/randomizer/savefile.cpp +++ b/soh/soh/Enhancements/randomizer/savefile.cpp @@ -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 diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index de70af537..955e902de 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -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]); diff --git a/soh/soh/SaveManager.cpp b/soh/soh/SaveManager.cpp index 4b830f846..3a2ab203d 100644 --- a/soh/soh/SaveManager.cpp +++ b/soh/soh/SaveManager.cpp @@ -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);