diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index 9cfc096163..bb3d62f788 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -751,8 +751,31 @@ void GenerateItemPool() { PlaceVanillaCowMilk(); } - if (ctx->GetOption(RSK_SHUFFLE_POTS)) { - AddItemToMainPool(RG_GREEN_RUPEE); + // Shuffle Pots + if (ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_OFF)) { + for (RandomizerCheck loc : ctx->GetLocations(ctx->allLocations, Category::cPot)) { + ctx->PlaceItemInLocation(loc, RG_GREEN_RUPEE, false, true); + } + } else if (ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_DUNGEONS)) { + for (RandomizerCheck loc : ctx->GetLocations(ctx->allLocations, Category::cPot)) { + if (Rando::StaticData::GetLocation(loc)->IsOverworld()) { + ctx->PlaceItemInLocation((RandomizerCheck)loc, RG_GREEN_RUPEE, false, true); + } else { + AddItemToMainPool(RG_GREEN_RUPEE); + } + } + } else if (ctx->GetOption(RSK_SHUFFLE_POTS).Is(RO_SHUFFLE_POTS_OVERWORLD)) { + for (RandomizerCheck loc : ctx->GetLocations(ctx->allLocations, Category::cPot)) { + if (Rando::StaticData::GetLocation(loc)->IsDungeon()) { + ctx->PlaceItemInLocation((RandomizerCheck)loc, RG_GREEN_RUPEE, false, true); + } else { + AddItemToMainPool(RG_GREEN_RUPEE); + } + } + } else { + for (RandomizerCheck loc : ctx->GetLocations(ctx->allLocations, Category::cPot)) { + AddItemToMainPool(RG_GREEN_RUPEE); + } } if (ctx->GetOption(RSK_SHUFFLE_MAGIC_BEANS)) { diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index 05bb81c9d0..298737809e 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -233,8 +233,16 @@ void Settings::CreateOptionDescriptions() { "\n" "The Gerudo Card is required to enter the Gerudo Training Grounds, opening " "the gate to Haunted Wasteland and the Horseback Archery minigame."; - mOptionDescriptions[RSK_SHUFFLE_POTS] = - "Freestanding pots will drop a randomized item the first time they're broken and collected. Pots will have a different appearance when they hold a randomized item."; + mOptionDescriptions[RSK_SHUFFLE_POTS] = "Freestanding pots will drop a randomized item the first time they're broken and collected." + " Pots will have a different appearance when they hold a randomized item.\n" + "\n" + "Off - Pots will not be shuffled.\n" + "\n" + "Dungeons - Only shuffle pots that are within dungeons.\n" + "\n" + "Overworld - Only shuffle pots that are outside of dungeons.\n" + "\n" + "All pots - Shuffle all pots."; mOptionDescriptions[RSK_SHOPSANITY] = "Off - All shop items will be the same as vanilla.\n" "\n" "0 Items - Vanilla shop items will be shuffled among different shops.\n" diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 680d6df98d..15ea5e5318 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -4968,6 +4968,14 @@ typedef enum { RO_TOKENSANITY_ALL, } RandoOptionTokensanity; +// Shuffle Pots settings (off, dungeons, overworld, all) +typedef enum { + RO_SHUFFLE_POTS_OFF, + RO_SHUFFLE_POTS_DUNGEONS, + RO_SHUFFLE_POTS_OVERWORLD, + RO_SHUFFLE_POTS_ALL, +} RandoOptionShufflePots; + //Link's Pocket Settings (dungeon reward, advancement, anything, nothing) typedef enum { RO_LINKS_POCKET_DUNGEON_REWARD, diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 85cc892ec6..ec1886ce77 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -106,7 +106,7 @@ void Settings::CreateOptions() { mOptions[RSK_SHUFFLE_OCARINA_BUTTONS] = Option::Bool("Shuffle Ocarina Buttons", "gRandomizeShuffleOcarinaButtons", mOptionDescriptions[RSK_SHUFFLE_OCARINA_BUTTONS]); mOptions[RSK_SHUFFLE_WEIRD_EGG] = Option::Bool("Shuffle Weird Egg", "gRandomizeShuffleWeirdEgg", mOptionDescriptions[RSK_SHUFFLE_WEIRD_EGG]); mOptions[RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD] = Option::Bool("Shuffle Gerudo Membership Card", "gRandomizeShuffleGerudoToken", mOptionDescriptions[RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD]); - mOptions[RSK_SHUFFLE_POTS] = Option::Bool("Shuffle Pot Contents", "gRandomizeShufflePotContents", mOptionDescriptions[RSK_SHUFFLE_POTS]); + mOptions[RSK_SHUFFLE_POTS] = Option::U8("Shuffle Pots", {"Off", "Dungeons", "Overworld", "All Pots"}, OptionCategory::Setting, "gRandomizeShufflePots", mOptionDescriptions[RSK_SHUFFLE_POTS], WidgetType::Combobox, RO_SHUFFLE_POTS_OFF); mOptions[RSK_SHUFFLE_MAGIC_BEANS] = Option::Bool("Shuffle Magic Beans", "gRandomizeShuffleBeans", mOptionDescriptions[RSK_SHUFFLE_MAGIC_BEANS]); mOptions[RSK_SHUFFLE_MERCHANTS] = Option::U8("Shuffle Merchants", {"Off", "On (No Hints)", "On (With Hints)"}, OptionCategory::Setting, "gRandomizeShuffleMerchants", mOptionDescriptions[RSK_SHUFFLE_MERCHANTS], WidgetType::Combobox, RO_SHUFFLE_MERCHANTS_OFF); mOptions[RSK_SHUFFLE_FROG_SONG_RUPEES] = Option::Bool("Shuffle Frog Song Rupees", "gRandomizeShuffleFrogSongRupees", mOptionDescriptions[RSK_SHUFFLE_FROG_SONG_RUPEES]); @@ -1022,7 +1022,7 @@ void Settings::CreateOptions() { { "Shuffle Settings:Link's Pocket", RSK_LINKS_POCKET }, { "Shuffle Settings:Shuffle Songs", RSK_SHUFFLE_SONGS }, { "Shuffle Settings:Shuffle Gerudo Membership Card", RSK_SHUFFLE_GERUDO_MEMBERSHIP_CARD }, - { "Shuffle Settings:Shuffle Pot Contents", RSK_SHUFFLE_POTS }, + { "Shuffle Settings:Shuffle Pots", RSK_SHUFFLE_POTS }, { "Shuffle Settings:Shopsanity", RSK_SHOPSANITY }, { "Shuffle Settings:Shopsanity Prices", RSK_SHOPSANITY_PRICES }, { "Shuffle Settings:Affordable Prices", RSK_SHOPSANITY_PRICES_AFFORDABLE }, diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c index 884f913f19..6622d232bb 100644 --- a/soh/src/overlays/actors/ovl_player_actor/z_player.c +++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c @@ -6666,7 +6666,7 @@ s32 func_8083E5A8(Player* this, PlayState* play) { // this specifically for items coming from bushes/rocks/enemies when the player has already picked that item up. uint8_t skipItemCutsceneRando = IS_RANDO && Item_CheckObtainability(giEntry.itemId) != ITEM_NONE && isDropToSkip; - // Automatically skip the pickup messages for very frequent items coming from pots with "Shuffle Pot Contents" on. + // Automatically skip the pickup messages for very frequent items coming from pots with "Shuffle Pots" on. uint8_t isPotItemToSkip = interactedActor->id == ACTOR_EN_ITEM00 && interactedActor->params == ITEM00_SMALL_KEY && (giEntry.itemId == ITEM_RUPEE_GREEN || giEntry.itemId == ITEM_RUPEE_BLUE ||