From 50d25c52072b3662e081f40f2032d150f7e219a1 Mon Sep 17 00:00:00 2001 From: Pepe20129 <72659707+Pepe20129@users.noreply.github.com> Date: Thu, 14 Mar 2024 18:33:15 +0100 Subject: [PATCH] Add "Condensed Progressive" --- .../randomizer/3drando/item_pool.cpp | 2 +- soh/soh/Enhancements/randomizer/item.cpp | 48 +++++++++++++------ .../randomizer/option_descriptions.cpp | 6 ++- .../Enhancements/randomizer/randomizer.cpp | 36 +++++++------- .../Enhancements/randomizer/randomizerTypes.h | 7 +++ soh/soh/Enhancements/randomizer/savefile.cpp | 11 ----- soh/soh/Enhancements/randomizer/settings.cpp | 2 +- 7 files changed, 66 insertions(+), 46 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp index c1f79d67c..435091d51 100644 --- a/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp +++ b/soh/soh/Enhancements/randomizer/3drando/item_pool.cpp @@ -841,7 +841,7 @@ void GenerateItemPool() { ctx->possibleIceTrapModels.push_back(RG_FISHING_POLE); } - if (ctx->GetOption(RSK_INFINITE_UPGRADES)) { + if (ctx->GetOption(RSK_INFINITE_UPGRADES).Is(RO_INF_UPGRADES_PROGRESSIVE)) { AddItemToMainPool(RG_PROGRESSIVE_BOMB_BAG); AddItemToMainPool(RG_PROGRESSIVE_BOW); AddItemToMainPool(RG_PROGRESSIVE_NUT_UPGRADE); diff --git a/soh/soh/Enhancements/randomizer/item.cpp b/soh/soh/Enhancements/randomizer/item.cpp index 3ffe466ad..417828daa 100644 --- a/soh/soh/Enhancements/randomizer/item.cpp +++ b/soh/soh/Enhancements/randomizer/item.cpp @@ -119,20 +119,24 @@ std::shared_ptr Item::GetGIEntry() const { // NOLINT(*-no-recursio RandomizerGet actual = RG_NONE; const bool tycoonWallet = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHOPSANITY) > RO_SHOPSANITY_ZERO_ITEMS; - const bool infiniteUpgrades = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_INFINITE_UPGRADES); + const u8 infiniteUpgrades = OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_INFINITE_UPGRADES); switch (randomizerGet) { case RG_PROGRESSIVE_STICK_UPGRADE: switch (CUR_UPG_VALUE(UPG_STICKS)) { case 0: case 1: - actual = RG_DEKU_STICK_CAPACITY_20; + if (infiniteUpgrades == RO_INF_UPGRADES_CONDENSED_PROGRESSIVE) { + actual = RG_STICK_UPGRADE_INF; + } else { + actual = RG_DEKU_STICK_CAPACITY_20; + } break; case 2: actual = RG_DEKU_STICK_CAPACITY_30; break; case 3: case 4: - if (infiniteUpgrades) { + if (infiniteUpgrades == RO_INF_UPGRADES_PROGRESSIVE) { actual = RG_STICK_UPGRADE_INF; } else { actual = RG_DEKU_STICK_CAPACITY_30; @@ -146,14 +150,18 @@ std::shared_ptr Item::GetGIEntry() const { // NOLINT(*-no-recursio switch (CUR_UPG_VALUE(UPG_NUTS)) { case 0: case 1: - actual = RG_DEKU_NUT_CAPACITY_30; + if (infiniteUpgrades == RO_INF_UPGRADES_CONDENSED_PROGRESSIVE) { + actual = RG_NUT_UPGRADE_INF; + } else { + actual = RG_DEKU_NUT_CAPACITY_30; + } break; case 2: actual = RG_DEKU_NUT_CAPACITY_40; break; case 3: case 4: - if (infiniteUpgrades) { + if (infiniteUpgrades == RO_INF_UPGRADES_PROGRESSIVE) { actual = RG_NUT_UPGRADE_INF; } else { actual = RG_DEKU_NUT_CAPACITY_40; @@ -169,14 +177,18 @@ std::shared_ptr Item::GetGIEntry() const { // NOLINT(*-no-recursio actual = RG_BOMB_BAG; break; case 1: - actual = RG_BIG_BOMB_BAG; + if (infiniteUpgrades == RO_INF_UPGRADES_CONDENSED_PROGRESSIVE) { + actual = RG_BOMB_BAG_INF; + } else { + actual = RG_BIG_BOMB_BAG; + } break; case 2: actual = RG_BIGGEST_BOMB_BAG; break; case 3: case 4: - if (infiniteUpgrades) { + if (infiniteUpgrades == RO_INF_UPGRADES_PROGRESSIVE) { actual = RG_BOMB_BAG_INF; } else { actual = RG_BIGGEST_BOMB_BAG; @@ -192,14 +204,18 @@ std::shared_ptr Item::GetGIEntry() const { // NOLINT(*-no-recursio actual = RG_FAIRY_BOW; break; case 1: - actual = RG_BIG_QUIVER; + if (infiniteUpgrades == RO_INF_UPGRADES_CONDENSED_PROGRESSIVE) { + actual = RG_QUIVER_INF; + } else { + actual = RG_BIG_QUIVER; + } break; case 2: actual = RG_BIGGEST_QUIVER; break; case 3: case 4: - if (infiniteUpgrades) { + if (infiniteUpgrades == RO_INF_UPGRADES_PROGRESSIVE) { actual = RG_QUIVER_INF; } else { actual = RG_BIGGEST_QUIVER; @@ -215,14 +231,18 @@ std::shared_ptr Item::GetGIEntry() const { // NOLINT(*-no-recursio actual = RG_FAIRY_SLINGSHOT; break; case 1: - actual = RG_BIG_BULLET_BAG; + if (infiniteUpgrades == RO_INF_UPGRADES_CONDENSED_PROGRESSIVE) { + actual = RG_BULLET_BAG_INF; + } else { + actual = RG_BIG_BULLET_BAG; + } break; case 2: actual = RG_BIGGEST_BULLET_BAG; break; case 3: case 4: - if (infiniteUpgrades) { + if (infiniteUpgrades == RO_INF_UPGRADES_PROGRESSIVE) { actual = RG_BULLET_BAG_INF; } else { actual = RG_BIGGEST_BULLET_BAG; @@ -291,7 +311,7 @@ std::shared_ptr Item::GetGIEntry() const { // NOLINT(*-no-recursio break; case 3: case 4: - if (infiniteUpgrades) { + if (infiniteUpgrades != RO_INF_UPGRADES_OFF) { actual = RG_WALLET_INF; } else { actual = tycoonWallet ? RG_TYCOON_WALLET : RG_GIANT_WALLET; @@ -328,7 +348,7 @@ std::shared_ptr Item::GetGIEntry() const { // NOLINT(*-no-recursio break; case 2: case 3: - if (infiniteUpgrades) { + if (infiniteUpgrades != RO_INF_UPGRADES_OFF) { actual = RG_MAGIC_INF; } else { actual = RG_MAGIC_DOUBLE; @@ -344,7 +364,7 @@ std::shared_ptr Item::GetGIEntry() const { // NOLINT(*-no-recursio case RG_PROGRESSIVE_BOMBCHUS: if (INV_CONTENT(ITEM_BOMBCHU) == ITEM_NONE) { actual = RG_BOMBCHU_20; - } else if (infiniteUpgrades) { + } else if (infiniteUpgrades != RO_INF_UPGRADES_OFF) { actual = RG_BOMBCHU_INF; } else if (AMMO(ITEM_BOMBCHU) < 5) { actual = RG_BOMBCHU_10; diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index ad741e51a..f75790fd5 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -247,7 +247,11 @@ void Settings::CreateOptionDescriptions() { mOptionDescriptions[RSK_SHUFFLE_FISHING_POLE] = "Shuffles the fishing pole into the item pool.\n" "\n" "The fishing pole is required to play the fishing pond minigame."; - mOptionDescriptions[RSK_INFINITE_UPGRADES] = "Adds upgrades that hold infinite quanities of items (bombs, arrows, etc.)"; + mOptionDescriptions[RSK_INFINITE_UPGRADES] = "Adds upgrades that hold infinite quanities of items (bombs, arrows, etc.)\n" + "\n" + "Progressive - The infinite upgrades are obtained after getting the last normal capacity upgrade\n" + "\n" + "Condensed Progressive - The infinite upgrades are obtained as the first capacity upgrade (doesn't apply to the infinite wallet or to infinite magic)"; 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/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index a4ef3aa40..0e8a3fb72 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -613,9 +613,9 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe // Same thing with the infinite upgrades, if we're not shuffling them // and we're using the Plentiful item pool, we should prevent the infinite // upgrades from being gotten - bool infiniteUpgrades = GetRandoSettingValue(RSK_INFINITE_UPGRADES); + u8 infiniteUpgrades = GetRandoSettingValue(RSK_INFINITE_UPGRADES); - u8 numWallets = 2 + (u8)tycoonWallet + (u8)infiniteUpgrades; + u8 numWallets = 2 + (u8)tycoonWallet + (infiniteUpgrades != RO_INF_UPGRADES_OFF ? 1 : 0); switch (randoGet) { case RG_NONE: case RG_TRIFORCE: @@ -652,15 +652,15 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe // Inventory Items case RG_PROGRESSIVE_STICK_UPGRADE: - return infiniteUpgrades ? + return infiniteUpgrades != RO_INF_UPGRADES_OFF ? (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_STICK_UPGRADE) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN) : (CUR_UPG_VALUE(UPG_STICKS) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); case RG_PROGRESSIVE_NUT_UPGRADE: - return infiniteUpgrades ? + return infiniteUpgrades != RO_INF_UPGRADES_OFF ? (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_NUT_UPGRADE) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN) : (CUR_UPG_VALUE(UPG_NUTS) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); case RG_PROGRESSIVE_BOMB_BAG: - return infiniteUpgrades ? + return infiniteUpgrades != RO_INF_UPGRADES_OFF ? (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BOMB_BAG) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN) : (CUR_UPG_VALUE(UPG_BOMB_BAG) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); case RG_BOMBS_5: @@ -673,7 +673,7 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe case RG_BUY_BOMBS_30: return CUR_UPG_VALUE(UPG_BOMB_BAG) ? CAN_OBTAIN : CANT_OBTAIN_NEED_UPGRADE; case RG_PROGRESSIVE_BOW: - return infiniteUpgrades ? + return infiniteUpgrades != RO_INF_UPGRADES_OFF ? (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_QUIVER) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN) : (CUR_UPG_VALUE(UPG_QUIVER) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); case RG_ARROWS_5: @@ -684,7 +684,7 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe case RG_BUY_ARROWS_50: return CUR_UPG_VALUE(UPG_QUIVER) ? CAN_OBTAIN : CANT_OBTAIN_NEED_UPGRADE; case RG_PROGRESSIVE_SLINGSHOT: - return infiniteUpgrades ? + return infiniteUpgrades != RO_INF_UPGRADES_OFF ? (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BULLET_BAG) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN) : (CUR_UPG_VALUE(UPG_BULLET_BAG) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); case RG_DEKU_SEEDS_30: @@ -814,7 +814,7 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe case RG_PROGRESSIVE_MAGIC_METER: case RG_MAGIC_SINGLE: case RG_MAGIC_DOUBLE: - return infiniteUpgrades ? + return infiniteUpgrades != RO_INF_UPGRADES_OFF ? (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_MAGIC_METER) ? CANT_OBTAIN_ALREADY_HAVE : CAN_OBTAIN) : (gSaveContext.magicLevel < 2 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE); case RG_FISHING_POLE: @@ -986,7 +986,7 @@ GetItemID Randomizer::GetItemIdFromRandomizerGet(RandomizerGet randoGet, GetItem // Same thing with the infinite upgrades, if we're not shuffling them //and we're using the Plentiful item pool, we should prevent the infinite //upgrades from being gotten - bool infiniteUpgrades = GetRandoSettingValue(RSK_INFINITE_UPGRADES); + u8 infiniteUpgrades = GetRandoSettingValue(RSK_INFINITE_UPGRADES); switch (randoGet) { case RG_NONE: return ogItemId; @@ -1034,7 +1034,7 @@ GetItemID Randomizer::GetItemIdFromRandomizerGet(RandomizerGet randoGet, GetItem return GI_STICK_UPGRADE_30; case 3: case 4: - return infiniteUpgrades ? (GetItemID)RG_STICK_UPGRADE_INF : GI_STICK_UPGRADE_30; + return infiniteUpgrades == RO_INF_UPGRADES_PROGRESSIVE ? (GetItemID)RG_STICK_UPGRADE_INF : GI_STICK_UPGRADE_30; } case RG_PROGRESSIVE_NUT_UPGRADE: switch (CUR_UPG_VALUE(UPG_NUTS)) { @@ -1045,7 +1045,7 @@ GetItemID Randomizer::GetItemIdFromRandomizerGet(RandomizerGet randoGet, GetItem return GI_NUT_UPGRADE_40; case 3: case 4: - return infiniteUpgrades ? (GetItemID)RG_NUT_UPGRADE_INF : GI_NUT_UPGRADE_40; + return infiniteUpgrades == RO_INF_UPGRADES_PROGRESSIVE ? (GetItemID)RG_NUT_UPGRADE_INF : GI_NUT_UPGRADE_40; } case RG_PROGRESSIVE_BOMB_BAG: switch (CUR_UPG_VALUE(UPG_BOMB_BAG)) { @@ -1057,7 +1057,7 @@ GetItemID Randomizer::GetItemIdFromRandomizerGet(RandomizerGet randoGet, GetItem return GI_BOMB_BAG_40; case 3: case 4: - return infiniteUpgrades ? (GetItemID)RG_BOMB_BAG_INF : GI_BOMB_BAG_40; + return infiniteUpgrades == RO_INF_UPGRADES_PROGRESSIVE ? (GetItemID)RG_BOMB_BAG_INF : GI_BOMB_BAG_40; } case RG_BOMBS_5: case RG_BUY_BOMBS_525: @@ -1081,7 +1081,7 @@ GetItemID Randomizer::GetItemIdFromRandomizerGet(RandomizerGet randoGet, GetItem return GI_QUIVER_50; case 3: case 4: - return infiniteUpgrades ? (GetItemID)RG_QUIVER_INF : GI_QUIVER_50; + return infiniteUpgrades == RO_INF_UPGRADES_PROGRESSIVE ? (GetItemID)RG_QUIVER_INF : GI_QUIVER_50; } case RG_ARROWS_5: case RG_BUY_ARROWS_10: @@ -1102,7 +1102,7 @@ GetItemID Randomizer::GetItemIdFromRandomizerGet(RandomizerGet randoGet, GetItem return GI_BULLET_BAG_50; case 3: case 4: - return infiniteUpgrades ? (GetItemID)RG_BULLET_BAG_INF : GI_BULLET_BAG_50; + return infiniteUpgrades == RO_INF_UPGRADES_PROGRESSIVE ? (GetItemID)RG_BULLET_BAG_INF : GI_BULLET_BAG_50; } case RG_DEKU_SEEDS_30: case RG_BUY_DEKU_SEEDS_30: @@ -1127,7 +1127,7 @@ GetItemID Randomizer::GetItemIdFromRandomizerGet(RandomizerGet randoGet, GetItem case RG_PROGRESSIVE_BOMBCHUS: if (INV_CONTENT(ITEM_BOMBCHU) == ITEM_NONE) { return (GetItemID)RG_PROGRESSIVE_BOMBCHUS; - } else if (infiniteUpgrades) { + } else if (infiniteUpgrades != RO_INF_UPGRADES_OFF) { return (GetItemID)RG_BOMBCHU_INF; } else if (AMMO(ITEM_BOMBCHU) < 5) { return GI_BOMBCHUS_10; @@ -1250,10 +1250,10 @@ GetItemID Randomizer::GetItemIdFromRandomizerGet(RandomizerGet randoGet, GetItem case 1: return GI_WALLET_GIANT; case 2: - return tycoonWallet ? (GetItemID)RG_TYCOON_WALLET : infiniteUpgrades ? (GetItemID)RG_WALLET_INF : GI_WALLET_GIANT; + return tycoonWallet ? (GetItemID)RG_TYCOON_WALLET : infiniteUpgrades != RO_INF_UPGRADES_OFF ? (GetItemID)RG_WALLET_INF : GI_WALLET_GIANT; case 3: case 4: - return infiniteUpgrades ? (GetItemID)RG_WALLET_INF : tycoonWallet ? (GetItemID)RG_TYCOON_WALLET : GI_WALLET_GIANT; + return infiniteUpgrades != RO_INF_UPGRADES_OFF ? (GetItemID)RG_WALLET_INF : tycoonWallet ? (GetItemID)RG_TYCOON_WALLET : GI_WALLET_GIANT; } case RG_PROGRESSIVE_SCALE: if (!Flags_GetRandomizerInf(RAND_INF_CAN_SWIM)) { @@ -1274,7 +1274,7 @@ GetItemID Randomizer::GetItemIdFromRandomizerGet(RandomizerGet randoGet, GetItem return (GetItemID)RG_MAGIC_DOUBLE; case 2: case 3: - return infiniteUpgrades ? (GetItemID)RG_MAGIC_INF : (GetItemID)RG_MAGIC_DOUBLE; + return infiniteUpgrades != RO_INF_UPGRADES_OFF ? (GetItemID)RG_MAGIC_INF : (GetItemID)RG_MAGIC_DOUBLE; } case RG_RECOVERY_HEART: diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 751557c26..07c093adb 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -3816,6 +3816,13 @@ typedef enum { RO_FISHSANITY_BOTH } RandoOptionsFishsanity; +//Infinite Upgrades settings (off, progressive, condensed progressive) +typedef enum { + RO_INF_UPGRADES_OFF, + RO_INF_UPGRADES_PROGRESSIVE, + RO_INF_UPGRADES_CONDENSED_PROGRESSIVE, +} RandoOptionInfiniteUpgrades; + //Any Dungeon Item (start with, vanilla, own dungeon, any dungeon, //overworld, anywhere) typedef enum { diff --git a/soh/soh/Enhancements/randomizer/savefile.cpp b/soh/soh/Enhancements/randomizer/savefile.cpp index 05a79b86d..d3c2d535b 100644 --- a/soh/soh/Enhancements/randomizer/savefile.cpp +++ b/soh/soh/Enhancements/randomizer/savefile.cpp @@ -308,17 +308,6 @@ extern "C" void Randomizer_InitSaveFile() { Flags_SetRandomizerInf(RAND_INF_CAN_SWIM); } - if (Randomizer_GetSettingValue(RSK_INFINITE_UPGRADES) == RO_GENERIC_OFF) { - Flags_SetRandomizerInf(RAND_INF_HAS_INFINITE_QUIVER); - Flags_SetRandomizerInf(RAND_INF_HAS_INFINITE_BOMB_BAG); - Flags_SetRandomizerInf(RAND_INF_HAS_INFINITE_BULLET_BAG); - Flags_SetRandomizerInf(RAND_INF_HAS_INFINITE_STICK_UPGRADE); - Flags_SetRandomizerInf(RAND_INF_HAS_INFINITE_NUT_UPGRADE); - Flags_SetRandomizerInf(RAND_INF_HAS_INFINITE_MAGIC_METER); - Flags_SetRandomizerInf(RAND_INF_HAS_INFINITE_BOMBCHUS); - Flags_SetRandomizerInf(RAND_INF_HAS_INFINITE_MONEY); - } - if (Randomizer_GetSettingValue(RSK_SHUFFLE_CHILD_WALLET) == RO_GENERIC_OFF) { Flags_SetRandomizerInf(RAND_INF_HAS_WALLET); } diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index d237c7d38..ce5aacd7a 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -179,7 +179,7 @@ void Settings::CreateOptions() { // TODO: Compasses show rewards/woth, maps show dungeon mode mOptions[RSK_BLUE_FIRE_ARROWS] = Option::Bool("Blue Fire Arrows", "gRandomizeBlueFireArrows", mOptionDescriptions[RSK_BLUE_FIRE_ARROWS]); mOptions[RSK_SUNLIGHT_ARROWS] = Option::Bool("Sunlight Arrows", "gRandomizeSunlightArrows", mOptionDescriptions[RSK_SUNLIGHT_ARROWS]); - mOptions[RSK_INFINITE_UPGRADES] = Option::Bool("Infinite Upgrades", "gRandomizeInfiniteUpgrades", mOptionDescriptions[RSK_INFINITE_UPGRADES]); + mOptions[RSK_INFINITE_UPGRADES] = Option::U8("Infinite Upgrades", {"Off", "Progressive", "Condensed Progressive"}, OptionCategory::Setting, "gRandomizeInfiniteUpgrades", mOptionDescriptions[RSK_INFINITE_UPGRADES]); mOptions[RSK_ITEM_POOL] = Option::U8("Item Pool", {"Plentiful", "Balanced", "Scarce", "Minimal"}, OptionCategory::Setting, "gRandomizeItemPool", mOptionDescriptions[RSK_ITEM_POOL], WidgetType::Combobox, RO_ITEM_POOL_BALANCED); mOptions[RSK_ICE_TRAPS] = Option::U8("Ice Traps", {"Off", "Normal", "Extra", "Mayhem", "Onslaught"}, OptionCategory::Setting, "gRandomizeIceTraps", mOptionDescriptions[RSK_ICE_TRAPS], WidgetType::Combobox, RO_ICE_TRAPS_NORMAL); // TODO: Remove Double Defense, Progressive Goron Sword