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 { typedef struct ShipRandomizerSaveContextData {
u8 triforcePiecesCollected; 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; } ShipRandomizerSaveContextData;
typedef struct ShipBossRushSaveContextData { typedef struct ShipBossRushSaveContextData {

View file

@ -6,6 +6,15 @@ namespace Rando {
void StaticData::HintTable_Init_Exclude_Dungeon() { void StaticData::HintTable_Init_Exclude_Dungeon() {
// clang-format off // 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 | | 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")}); 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"), hintTextTable[RHT_SKELETON_KEY] = HintText(CustomMessage("a Skeleton Key", /*german*/ "der Skelettschlüssel", /*french*/ "une Clé Squelette"),
// /*spanish*/una Llave Maestra // /*spanish*/una Llave Maestra
{ {

View file

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

View file

@ -54,6 +54,12 @@ void GenerateStartingInventory() {
AddItemToInventory(RG_SHADOW_TEMPLE_BOSS_KEY); 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. // 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. // 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)) { 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) { static bool IsSilverCleared(s16 switchFlag) {
bool isMQ = bool isMQ = Rando::Context::GetInstance()->GetDungeons()->GetDungeonFromScene(gPlayState->sceneNum)->IsMQ();
Rando::Context::GetInstance()->GetDungeons()->GetDungeonFromScene(gPlayState->sceneNum)->IsMQ();
switch (gPlayState->sceneNum) { switch (gPlayState->sceneNum) {
case SCENE_DODONGOS_CAVERN: 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: case SCENE_SHADOW_TEMPLE:
switch (switchFlag) { switch (switchFlag) {
case 1: 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: case 3:
return Flags_GetRandomizerInf(RAND_INF_SHADOW_MQ_SILVER_INVISIBLE_BLADES); return gSaveContext.ship.quest.data.randomizer.silverMqShadowInvisibleBlades >= 10;
case 8: case 8:
return Flags_GetRandomizerInf(isMQ ? RAND_INF_SHADOW_MQ_SILVER_SPIKES return isMQ ? gSaveContext.ship.quest.data.randomizer.silverMqShadowSpikes >= 10
: RAND_INF_SHADOW_SILVER_SPIKES); : gSaveContext.ship.quest.data.randomizer.silverShadowSpikes >= 5;
case 9: case 9:
return Flags_GetRandomizerInf(RAND_INF_SHADOW_SILVER_PIT); return gSaveContext.ship.quest.data.randomizer.silverShadowPit >= 5;
case 17: case 17:
return Flags_GetRandomizerInf(RAND_INF_SHADOW_MQ_SILVER_PIT); return gSaveContext.ship.quest.data.randomizer.silverMqShadowPit >= 5;
} }
case SCENE_SPIRIT_TEMPLE: case SCENE_SPIRIT_TEMPLE:
switch (switchFlag) { switch (switchFlag) {
case 0: case 0:
return Flags_GetRandomizerInf(RAND_INF_SPIRIT_MQ_SILVER_BIG_WALL); return gSaveContext.ship.quest.data.randomizer.silverMqSpiritBigWall;
case 2: case 2:
return Flags_GetRandomizerInf(RAND_INF_SPIRIT_SILVER_BOULDERS); return gSaveContext.ship.quest.data.randomizer.silverSpiritBoulders;
case 5: case 5:
return Flags_GetRandomizerInf(RAND_INF_SPIRIT_SILVER_CHILD); return gSaveContext.ship.quest.data.randomizer.silverSpiritChild;
case 10: case 10:
return Flags_GetRandomizerInf(RAND_INF_SPIRIT_SILVER_SUN); return gSaveContext.ship.quest.data.randomizer.silverSpiritSun;
case 55: case 55:
return Flags_GetRandomizerInf(RAND_INF_SPIRIT_MQ_SILVER_LOBBY); return gSaveContext.ship.quest.data.randomizer.silverMqSpiritLobby;
} }
case SCENE_BOTTOM_OF_THE_WELL: 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: case SCENE_ICE_CAVERN:
switch (switchFlag) { switch (switchFlag) {
case 8: case 8:
return Flags_GetRandomizerInf(RAND_INF_ICE_CAVERN_SILVER_BLOCK); return gSaveContext.ship.quest.data.randomizer.silverIceCavernBlock >= 5;
case 31: case 31:
return Flags_GetRandomizerInf(RAND_INF_ICE_CAVERN_SILVER_BLADES); return gSaveContext.ship.quest.data.randomizer.silverIceCavernBlades >= 5;
} }
case SCENE_GERUDO_TRAINING_GROUND: case SCENE_GERUDO_TRAINING_GROUND:
switch (switchFlag) { switch (switchFlag) {
case 12: 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: 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: 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: case SCENE_INSIDE_GANONS_CASTLE:
switch (switchFlag) { switch (switchFlag) {
case 1: case 1:
return Flags_GetRandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SILVER_FIRE); return gSaveContext.ship.quest.data.randomizer.silverMqGanonFire >= 5;
case 2: case 2:
return Flags_GetRandomizerInf(RAND_INF_GANONS_CASTLE_MQ_SILVER_WATER); return gSaveContext.ship.quest.data.randomizer.silverMqGanonWater >= 5;
case 9: case 9:
return Flags_GetRandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_FIRE); return gSaveContext.ship.quest.data.randomizer.silverGanonFire >= 5;
case 11: case 11:
return Flags_GetRandomizerInf(isMQ ? RAND_INF_GANONS_CASTLE_MQ_SILVER_SHADOW return isMQ ? gSaveContext.ship.quest.data.randomizer.silverMqGanonShadow >= 5
: RAND_INF_GANONS_CASTLE_SILVER_SPIRIT); : gSaveContext.ship.quest.data.randomizer.silverGanonSpirit >= 5;
case 14: case 14:
return Flags_GetRandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_FOREST); return gSaveContext.ship.quest.data.randomizer.silverGanonForest >= 5;
case 18: case 18:
return Flags_GetRandomizerInf(RAND_INF_GANONS_CASTLE_SILVER_LIGHT); return gSaveContext.ship.quest.data.randomizer.silverGanonLight >= 5;
} }
} }
return false; return false;
@ -89,24 +92,25 @@ void RegisterShuffleSilver() {
COND_VB_SHOULD(VB_SILVER_DESPAWN, shouldRegister, { COND_VB_SHOULD(VB_SILVER_DESPAWN, shouldRegister, {
EnGSwitch* silver = va_arg(args, EnGSwitch*); EnGSwitch* silver = va_arg(args, EnGSwitch*);
if (silver->type == ENGSWITCH_SILVER_RUPEE) { if (silver->type == ENGSWITCH_SILVER_RUPEE) {
auto silverIdentity = OTRGlobals::Instance->gRandomizer->IdentifySilver(gPlayState->sceneNum, auto silverIdentity = OTRGlobals::Instance->gRandomizer->IdentifySilver(
(s16)silver->actor.world.pos.x, (s16)silver->actor.world.pos.z); gPlayState->sceneNum, (s16)silver->actor.world.pos.x, (s16)silver->actor.world.pos.z);
*should = true; *should = true;
LUSLOG_WARN("!!%d %d %d %d", silver->type, silverIdentity.randomizerCheck, LUSLOG_WARN("!!%d %d %d %d", silver->type, silverIdentity.randomizerCheck, (s16)silver->actor.world.pos.x,
(s16)silver->actor.world.pos.x, (s16)silver->actor.world.pos.z); (s16)silver->actor.world.pos.z);
if (silverIdentity.randomizerCheck == RC_UNKNOWN_CHECK || if (silverIdentity.randomizerCheck == RC_UNKNOWN_CHECK ||
Flags_GetRandomizerInf(silverIdentity.randomizerInf)) { Flags_GetRandomizerInf(silverIdentity.randomizerInf)) {
return; return;
} }
auto spawnedActor = (EnItem00*)Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_EN_ITEM00, auto spawnedActor = (EnItem00*)Actor_Spawn(
silver->actor.world.pos.x, silver->actor.world.pos.y, silver->actor.world.pos.z, &gPlayState->actorCtx, gPlayState, ACTOR_EN_ITEM00, silver->actor.world.pos.x,
0, 0, 0, ITEM00_SOH_GIVE_ITEM_ENTRY, false); silver->actor.world.pos.y, silver->actor.world.pos.z, 0, 0, 0, ITEM00_SOH_GIVE_ITEM_ENTRY, false);
LUSLOG_WARN("!!%p", spawnedActor); LUSLOG_WARN("!!%p", spawnedActor);
spawnedActor->randoCheck = silverIdentity.randomizerCheck; spawnedActor->randoCheck = silverIdentity.randomizerCheck;
spawnedActor->randoInf = silverIdentity.randomizerInf; spawnedActor->randoInf = silverIdentity.randomizerInf;
spawnedActor->itemEntry = Rando::Context::GetInstance()->GetFinalGIEntry( 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) { } else if (silver->type == ENGSWITCH_SILVER_TRACKER) {
if (IsSilverCleared(silver->switchFlag)) { if (IsSilverCleared(silver->switchFlag)) {
Flags_SetSwitch(gPlayState, 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__), gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, (char*)__FILE__, __LINE__),
G_MTX_MODELVIEW | G_MTX_LOAD); G_MTX_MODELVIEW | G_MTX_LOAD);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x80, 255, 255, 255, 255); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x80, 255, 255, 255, 255);
gDPSetEnvColor(POLY_OPA_DISP++, 255 / 5, 255 / 5, 255 / 5, 255); gDPSetEnvColor(POLY_OPA_DISP++, 255 / 5, 255 / 5, 255 / 5, 255);
gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiRupeeInnerDL); gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiRupeeInnerDL);
Gfx_SetupDL_25Xlu(play->state.gfxCtx); Gfx_SetupDL_25Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_MODELVIEW | G_MTX_LOAD); 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); gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, 255);
gDPSetEnvColor(POLY_XLU_DISP++, 255 * 0.75f, 255 * 0.75f, 255 * 0.75f, 255); gDPSetEnvColor(POLY_XLU_DISP++, 255 * 0.75f, 255 * 0.75f, 255 * 0.75f, 255);
gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiRupeeOuterDL); gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiRupeeOuterDL);
CLOSE_DISPS(play->state.gfxCtx); 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] = 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); itemTable[RG_TREASURE_GAME_KEY_RING].SetCustomDrawFunc(Randomizer_DrawKeyRing);
// Silver Rupees // 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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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); itemTable[RG_GANONS_CASTLE_MQ_SILVER_SHADOW].SetCustomDrawFunc(Randomizer_DrawSilverRupee);
// Dungeon Rewards // Dungeon Rewards
itemTable[RG_KOKIRI_EMERALD] = Item(RG_KOKIRI_EMERALD, Text{ "Kokiri's Emerald", "Émeraude Kokiri", "Kokiri-Smaragd" }, ITEMTYPE_DUNGEONREWARD, 0xCB, true, LOGIC_KOKIRI_EMERALD, RHT_KOKIRI_EMERALD, ITEM_KOKIRI_EMERALD, OBJECT_GI_JEWEL, GID_KOKIRI_EMERALD, 0x80, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_NONE); itemTable[RG_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_FORTRESS_SMALLKEY:
case ITEMTYPE_SMALLKEY: { case ITEMTYPE_SMALLKEY: {
auto randoGet = item.GetRandomizerGet(); auto randoGet = item.GetRandomizerGet();
auto keyring = randoGet >= RG_FOREST_TEMPLE_KEY_RING && randoGet <= RG_GANONS_CASTLE_KEY_RING; if (randoGet >= RG_SHADOW_SILVER_BLADES && randoGet <= RG_GANONS_CASTLE_MQ_SILVER_SHADOW) {
auto dungeonIndex = RandoGetToDungeonScene.find(randoGet)->second; s8* field = Randomizer::SilverFieldFromSaveContext(randoGet);
auto count = GetSmallKeyCount(dungeonIndex); bool isWallet = ctx->GetOption(RSK_SHUFFLE_SILVER).Is(RO_SHUFFLE_SILVER_WALLET);
if (!state) { if (!state) {
if (keyring) { if (isWallet) {
count = 0; *field = 0;
} else {
*field -= 1;
}
} else { } else {
count -= 1; if (isWallet) {
*field = 10;
} else {
*field += 1;
}
} }
} else { } else {
if (keyring) { auto keyring = randoGet >= RG_FOREST_TEMPLE_KEY_RING && randoGet <= RG_GANONS_CASTLE_KEY_RING;
count = 10; auto dungeonIndex = RandoGetToDungeonScene.find(randoGet)->second;
auto count = GetSmallKeyCount(dungeonIndex);
if (!state) {
if (keyring) {
count = 0;
} else {
count -= 1;
}
} else { } else {
count += 1; if (keyring) {
count = 10;
} else {
count += 1;
}
} }
SetSmallKeyCount(dungeonIndex, count);
} }
SetSmallKeyCount(dungeonIndex, count);
} break; } break;
case ITEMTYPE_TOKEN: case ITEMTYPE_TOKEN:
mSaveContext->inventory.gsTokens += (!state ? -1 : 1); mSaveContext->inventory.gsTokens += (!state ? -1 : 1);

View file

@ -477,8 +477,8 @@ void Settings::CreateOptionDescriptions() {
"\n" "\n"
"All Items - Shuffle all freestanding rupees & hearts."; "All Items - Shuffle all freestanding rupees & hearts.";
mOptionDescriptions[RSK_SHUFFLE_SILVER] = "Silver rupees will be shuffled.\n" mOptionDescriptions[RSK_SHUFFLE_SILVER] = "Silver rupees will be shuffled.\n"
"Items will be added to pool which completes the silver rupee puzzles,\n" "Items will be added to pool which completes the silver rupee puzzles,\n"
"while silver rupee locations will be random items."; "while silver rupee locations will be random items.";
mOptionDescriptions[RSK_SHUFFLE_FAIRIES] = "Shuffle fairy locations."; mOptionDescriptions[RSK_SHUFFLE_FAIRIES] = "Shuffle fairy locations.";
mOptionDescriptions[RSK_SHUFFLE_GRASS] = mOptionDescriptions[RSK_SHUFFLE_GRASS] =
"Grass/Bushes will drop a randomized item the first time they're cut and collected. " "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(); 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, GetItemEntry Randomizer::GetItemFromActor(s16 actorId, s16 sceneNum, s16 actorParams, GetItemID ogItemId,
bool checkObtainability) { bool checkObtainability) {
return Rando::Context::GetInstance()->GetFinalGIEntry(GetCheckFromActor(actorId, sceneNum, actorParams), 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_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_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_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_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_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_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_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_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_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_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_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_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_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_FIRE, ITEM_KEY_SMALL,
GIMESSAGE_UNTRANSLATED(RG_GANONS_CASTLE_MQ_SILVER_WATER, ITEM_KEY_SMALL, "You found Ganon's Castle Silver: Water"), "You found Ganon's Castle Silver: Fire"),
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_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); CreateGetItemMessages(getItemMessages);
CreateRupeeMessages(); CreateRupeeMessages();
@ -6049,35 +6120,6 @@ std::map<RandomizerGet, RandomizerInf> randomizerGetToRandInf = {
{ RG_BONGO_BONGO_SOUL, RAND_INF_BONGO_BONGO_SOUL }, { RG_BONGO_BONGO_SOUL, RAND_INF_BONGO_BONGO_SOUL },
{ RG_TWINROVA_SOUL, RAND_INF_TWINROVA_SOUL }, { RG_TWINROVA_SOUL, RAND_INF_TWINROVA_SOUL },
{ RG_GANON_SOUL, RAND_INF_GANON_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) { 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; INV_CONTENT(ITEM_NUT) = ITEM_NUT;
AMMO(ITEM_NUT) = static_cast<int8_t>(CUR_CAPACITY(UPG_NUTS)); AMMO(ITEM_NUT) = static_cast<int8_t>(CUR_CAPACITY(UPG_NUTS));
break; 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: default:
LUSLOG_WARN("Randomizer_Item_Give didn't have behaviour specified for getItemId=%d", item); LUSLOG_WARN("Randomizer_Item_Give didn't have behaviour specified for getItemId=%d", item);
assert(false); assert(false);

View file

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

View file

@ -5391,6 +5391,7 @@ typedef enum {
RHT_BRONZE_SCALE, RHT_BRONZE_SCALE,
RHT_FISHING_POLE, RHT_FISHING_POLE,
RHT_SKELETON_KEY, RHT_SKELETON_KEY,
RHT_SILVER,
RHT_EPONA, RHT_EPONA,
RHT_OVERWORLD_KEY, RHT_OVERWORLD_KEY,
RHT_HINT_MYSTERIOUS, RHT_HINT_MYSTERIOUS,
@ -6495,6 +6496,14 @@ typedef enum {
RO_SHUFFLE_FREESTANDING_ALL, RO_SHUFFLE_FREESTANDING_ALL,
} RandoOptionFreestanding; } 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) // Shuffle Pots settings (off, dungeons, overworld, all)
typedef enum { typedef enum {
RO_SHUFFLE_POTS_OFF, 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_4)
DEFINE_RAND_INF(RAND_INF_GANONS_CASTLE_MQ_SILVER_SHADOW_5) 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_1)
DEFINE_RAND_INF(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2) DEFINE_RAND_INF(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_2)
DEFINE_RAND_INF(RAND_INF_SFM_FAIRY_GROTTO_FAIRY_3) 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) { if (Randomizer_GetSettingValue(RSK_BOSS_KEYSANITY) == RO_DUNGEON_ITEM_LOC_STARTWITH) {
gSaveContext.inventory.dungeonItems[SCENE_FOREST_TEMPLE] |= 1; // Forest gSaveContext.inventory.dungeonItems[SCENE_FOREST_TEMPLE] |= 1; // Forest
gSaveContext.inventory.dungeonItems[SCENE_FIRE_TEMPLE] |= 1; // Fire 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_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_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_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_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_BOOL(RSK_SHUFFLE_SILVER, "Shuffle Silver Rupees", CVAR_RANDOMIZER_SETTING("ShuffleSilver"), mOptionDescriptions[RSK_SHUFFLE_SILVER]);
OPT_U8(RSK_FISHSANITY, "Fishsanity", {"Off", "Shuffle only Hyrule Loach", "Shuffle Fishing Pond", "Shuffle Overworld Fish", "Shuffle Both"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("Fishsanity"), mOptionDescriptions[RSK_FISHSANITY], WidgetType::Combobox, RO_FISHSANITY_OFF); OPT_U8(RSK_FISHSANITY, "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_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]); 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", SaveManager::Instance->LoadData("triforcePiecesCollected",
gSaveContext.ship.quest.data.randomizer.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); SaveManager::Instance->LoadData("pendingIceTrapCount", gSaveContext.ship.pendingIceTrapCount);
@ -377,6 +414,43 @@ void SaveManager::SaveRandomizer(SaveContext* saveContext, int sectionID, bool f
SaveManager::Instance->SaveData("triforcePiecesCollected", SaveManager::Instance->SaveData("triforcePiecesCollected",
saveContext->ship.quest.data.randomizer.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); SaveManager::Instance->SaveData("pendingIceTrapCount", saveContext->ship.pendingIceTrapCount);