This commit is contained in:
Pepe20129 2024-04-12 19:25:55 +00:00 committed by GitHub
commit bdc495a954
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 501 additions and 53 deletions

View File

@ -241,6 +241,7 @@ static std::map<std::string, CosmeticOption> cosmeticOptions = {
COSMETIC_OPTION("Consumable_DDHeartBorder", "DD Heart Border", GROUP_CONSUMABLE, ImVec4(255, 255, 255, 255), false, true, true),
COSMETIC_OPTION("Consumable_Magic", "Magic", GROUP_CONSUMABLE, ImVec4( 0, 200, 0, 255), false, true, false),
COSMETIC_OPTION("Consumable_MagicActive", "Magic Active", GROUP_CONSUMABLE, ImVec4(250, 250, 0, 255), false, true, true),
COSMETIC_OPTION("Consumable_MagicInfinite", "Infinite Magic", GROUP_CONSUMABLE, ImVec4( 0, 0, 200, 255), false, true, true),
COSMETIC_OPTION("Consumable_MagicBorder", "Magic Border", GROUP_CONSUMABLE, ImVec4(255, 255, 255, 255), false, false, true),
COSMETIC_OPTION("Consumable_MagicBorderActive", "Magic Border Active", GROUP_CONSUMABLE, ImVec4(255, 255, 255, 255), false, false, true),
COSMETIC_OPTION("Consumable_GreenRupee", "Green Rupee", GROUP_CONSUMABLE, ImVec4( 50, 255, 50, 255), false, true, true),

View File

@ -607,7 +607,16 @@ const std::vector<FlagTable> flagTables = {
{ RAND_INF_ZD_FISH_2, "RAND_INF_ZD_FISH_2" },
{ RAND_INF_ZD_FISH_3, "RAND_INF_ZD_FISH_3" },
{ RAND_INF_ZD_FISH_4, "RAND_INF_ZD_FISH_4" },
{ RAND_INF_ZD_FISH_5, "RAND_INF_ZD_FISH_5" }
{ RAND_INF_ZD_FISH_5, "RAND_INF_ZD_FISH_5" },
{ RAND_INF_HAS_INFINITE_QUIVER, "RAND_INF_HAS_INFINITE_QUIVER" },
{ RAND_INF_HAS_INFINITE_BOMB_BAG, "RAND_INF_HAS_INFINITE_BOMB_BAG" },
{ RAND_INF_HAS_INFINITE_BULLET_BAG, "RAND_INF_HAS_INFINITE_BULLET_BAG" },
{ RAND_INF_HAS_INFINITE_STICK_UPGRADE, "RAND_INF_HAS_INFINITE_STICK_UPGRADE" },
{ RAND_INF_HAS_INFINITE_NUT_UPGRADE, "RAND_INF_HAS_INFINITE_NUT_UPGRADE" },
{ RAND_INF_HAS_INFINITE_MAGIC_METER, "RAND_INF_HAS_INFINITE_MAGIC_METER" },
{ RAND_INF_HAS_INFINITE_BOMBCHUS, "RAND_INF_HAS_INFINITE_BOMBCHUS" },
{ RAND_INF_HAS_INFINITE_MONEY, "RAND_INF_HAS_INFINITE_MONEY" },
} },
};

View File

@ -1686,6 +1686,46 @@ void RegisterFishsanity() {
});
}
void RegisterInfiniteUpgrades() {
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnGameFrameUpdate>([]() {
if (!IS_RANDO) {
return;
}
if (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_QUIVER)) {
AMMO(ITEM_BOW) = CUR_CAPACITY(UPG_QUIVER);
}
if (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BOMB_BAG)) {
AMMO(ITEM_BOMB) = CUR_CAPACITY(UPG_BOMB_BAG);
}
if (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BULLET_BAG)) {
AMMO(ITEM_SLINGSHOT) = CUR_CAPACITY(UPG_BULLET_BAG);
}
if (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_STICK_UPGRADE)) {
AMMO(ITEM_STICK) = CUR_CAPACITY(UPG_STICKS);
}
if (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_NUT_UPGRADE)) {
AMMO(ITEM_NUT) = CUR_CAPACITY(UPG_NUTS);
}
if (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_MAGIC_METER)) {
gSaveContext.magic = gSaveContext.magicCapacity;
}
if (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BOMBCHUS)) {
AMMO(ITEM_BOMBCHU) = 50;
}
if (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_MONEY)) {
gSaveContext.rupees = CUR_CAPACITY(UPG_WALLET);
}
});
}
extern "C" u8 Randomizer_GetSettingValue(RandomizerSettingKey randoSettingKey);
void PatchCompasses() {
@ -1744,6 +1784,7 @@ void InitMods() {
RegisterNoSwim();
RegisterNoWallet();
RegisterFishsanity();
RegisterInfiniteUpgrades();
RegisterRandomizerCompasses();
NameTag_RegisterHooks();
RegisterFloorSwitchesHook();

View File

@ -2113,6 +2113,94 @@ void HintTable_Init_Item() {
Text{"a fishing pole", /*french*/"canne à pêche", /*spanish*/"caña de pescar"}
);
hintTable[RHT_QUIVER_INF] = HintText::Item({
//obscure text
Text{"", /*french*/"!!!", /*spanish*/"!!!"},
}, {
//ambiguous text
Text{"", /*french*/"!!!", /*spanish*/"!!!"},
},
//clear text
Text{"", /*french*/"!!!", /*spanish*/"!!!"}
);
hintTable[RHT_BOMB_BAG_INF] = HintText::Item({
//obscure text
Text{"", /*french*/"!!!", /*spanish*/"!!!"},
}, {
//ambiguous text
Text{"", /*french*/"!!!", /*spanish*/"!!!"},
},
//clear text
Text{"", /*french*/"!!!", /*spanish*/"!!!"}
);
hintTable[RHT_BULLET_BAG_INF] = HintText::Item({
//obscure text
Text{"", /*french*/"!!!", /*spanish*/"!!!"},
}, {
//ambiguous text
Text{"", /*french*/"!!!", /*spanish*/"!!!"},
},
//clear text
Text{"", /*french*/"!!!", /*spanish*/"!!!"}
);
hintTable[RHT_STICK_UPGRADE_INF] = HintText::Item({
//obscure text
Text{"", /*french*/"!!!", /*spanish*/"!!!"},
}, {
//ambiguous text
Text{"", /*french*/"!!!", /*spanish*/"!!!"},
},
//clear text
Text{"", /*french*/"!!!", /*spanish*/"!!!"}
);
hintTable[RHT_NUT_UPGRADE_INF] = HintText::Item({
//obscure text
Text{"", /*french*/"!!!", /*spanish*/"!!!"},
}, {
//ambiguous text
Text{"", /*french*/"!!!", /*spanish*/"!!!"},
},
//clear text
Text{"", /*french*/"!!!", /*spanish*/"!!!"}
);
hintTable[RHT_MAGIC_INF] = HintText::Item({
//obscure text
Text{"", /*french*/"!!!", /*spanish*/"!!!"},
}, {
//ambiguous text
Text{"", /*french*/"!!!", /*spanish*/"!!!"},
},
//clear text
Text{"", /*french*/"!!!", /*spanish*/"!!!"}
);
hintTable[RHT_BOMBCHU_INF] = HintText::Item({
//obscure text
Text{"", /*french*/"!!!", /*spanish*/"!!!"},
}, {
//ambiguous text
Text{"", /*french*/"!!!", /*spanish*/"!!!"},
},
//clear text
Text{"", /*french*/"!!!", /*spanish*/"!!!"}
);
hintTable[RHT_WALLET_INF] = HintText::Item({
//obscure text
Text{"", /*french*/"!!!", /*spanish*/"!!!"},
}, {
//ambiguous text
Text{"", /*french*/"!!!", /*spanish*/"!!!"},
},
//clear text
Text{"", /*french*/"!!!", /*spanish*/"!!!"}
);
hintTable[RHT_EPONA] = HintText::Item({
//obscure text
Text{"a horse", /*french*/"un fidèle destrier", /*spanish*/"una yegua"},

View File

@ -841,6 +841,16 @@ void GenerateItemPool() {
ctx->possibleIceTrapModels.push_back(RG_FISHING_POLE);
}
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);
AddItemToMainPool(RG_PROGRESSIVE_SLINGSHOT);
AddItemToMainPool(RG_PROGRESSIVE_STICK_UPGRADE);
AddItemToMainPool(RG_PROGRESSIVE_MAGIC_METER);
AddItemToMainPool(RG_PROGRESSIVE_WALLET);
}
if (ctx->GetOption(RSK_SHUFFLE_MAGIC_BEANS)) {
AddItemToMainPool(RG_MAGIC_BEAN_PACK);
if (ctx->GetOption(RSK_ITEM_POOL).Is(RO_ITEM_POOL_PLENTIFUL)) {

View File

@ -119,17 +119,29 @@ std::shared_ptr<GetItemEntry> Item::GetGIEntry() const { // NOLINT(*-no-recursio
RandomizerGet actual = RG_NONE;
const bool tycoonWallet =
OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHOPSANITY) > RO_SHOPSANITY_ZERO_ITEMS;
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:
case 3:
actual = RG_DEKU_STICK_CAPACITY_30;
break;
case 3:
case 4:
if (infiniteUpgrades == RO_INF_UPGRADES_PROGRESSIVE) {
actual = RG_STICK_UPGRADE_INF;
} else {
actual = RG_DEKU_STICK_CAPACITY_30;
}
break;
default:
break;
}
@ -138,12 +150,23 @@ std::shared_ptr<GetItemEntry> 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:
case 3:
actual = RG_DEKU_NUT_CAPACITY_40;
break;
case 3:
case 4:
if (infiniteUpgrades == RO_INF_UPGRADES_PROGRESSIVE) {
actual = RG_NUT_UPGRADE_INF;
} else {
actual = RG_DEKU_NUT_CAPACITY_40;
}
break;
default:
break;
}
@ -154,12 +177,23 @@ std::shared_ptr<GetItemEntry> 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:
case 3:
actual = RG_BIGGEST_BOMB_BAG;
break;
case 3:
case 4:
if (infiniteUpgrades == RO_INF_UPGRADES_PROGRESSIVE) {
actual = RG_BOMB_BAG_INF;
} else {
actual = RG_BIGGEST_BOMB_BAG;
}
break;
default:
break;
}
@ -170,12 +204,23 @@ std::shared_ptr<GetItemEntry> 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:
case 3:
actual = RG_BIGGEST_QUIVER;
break;
case 3:
case 4:
if (infiniteUpgrades == RO_INF_UPGRADES_PROGRESSIVE) {
actual = RG_QUIVER_INF;
} else {
actual = RG_BIGGEST_QUIVER;
}
break;
default:
break;
}
@ -186,12 +231,23 @@ std::shared_ptr<GetItemEntry> 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:
case 3:
actual = RG_BIGGEST_BULLET_BAG;
break;
case 3:
case 4:
if (infiniteUpgrades == RO_INF_UPGRADES_PROGRESSIVE) {
actual = RG_BULLET_BAG_INF;
} else {
actual = RG_BIGGEST_BULLET_BAG;
}
break;
default:
break;
}
@ -251,9 +307,16 @@ std::shared_ptr<GetItemEntry> Item::GetGIEntry() const { // NOLINT(*-no-recursio
actual = RG_GIANT_WALLET;
break;
case 2:
case 3:
actual = tycoonWallet ? RG_TYCOON_WALLET : RG_GIANT_WALLET;
break;
case 3:
case 4:
if (infiniteUpgrades != RO_INF_UPGRADES_OFF) {
actual = RG_WALLET_INF;
} else {
actual = tycoonWallet ? RG_TYCOON_WALLET : RG_GIANT_WALLET;
}
break;
default:
break;
}
@ -281,9 +344,16 @@ std::shared_ptr<GetItemEntry> Item::GetGIEntry() const { // NOLINT(*-no-recursio
actual = RG_MAGIC_SINGLE;
break;
case 1:
case 2:
actual = RG_MAGIC_DOUBLE;
break;
case 2:
case 3:
if (infiniteUpgrades != RO_INF_UPGRADES_OFF) {
actual = RG_MAGIC_INF;
} else {
actual = RG_MAGIC_DOUBLE;
}
break;
default:
break;
}
@ -291,6 +361,17 @@ std::shared_ptr<GetItemEntry> Item::GetGIEntry() const { // NOLINT(*-no-recursio
case RG_PROGRESSIVE_GORONSWORD: // todo progressive?
actual = RG_BIGGORON_SWORD;
break;
case RG_PROGRESSIVE_BOMBCHUS:
if (INV_CONTENT(ITEM_BOMBCHU) == ITEM_NONE) {
actual = RG_BOMBCHU_20;
} else if (infiniteUpgrades != RO_INF_UPGRADES_OFF) {
actual = RG_BOMBCHU_INF;
} else if (AMMO(ITEM_BOMBCHU) < 5) {
actual = RG_BOMBCHU_10;
} else {
actual = RG_BOMBCHU_5;
}
break;
default:
actual = RG_NONE;
break;

View File

@ -65,7 +65,7 @@ void Rando::StaticData::InitItemTable() {
itemTable[RG_PROGRESSIVE_SCALE] = Item(RG_PROGRESSIVE_SCALE, Text{ "Progressive Scale", "Écaille (prog.)", "Progressive Skala" }, ITEMTYPE_ITEM, 0x86, true, &logic->ProgressiveScale, RHT_PROGRESSIVE_SCALE, true);
itemTable[RG_PROGRESSIVE_NUT_UPGRADE] = Item(RG_PROGRESSIVE_NUT_UPGRADE, Text{ "Progressive Nut Capacity", "Capacité de Noix (prog.)", "Progressive Nusskapazität" }, ITEMTYPE_ITEM, 0x87, false, &logic->noVariable, RHT_PROGRESSIVE_NUT_UPGRADE, true);
itemTable[RG_PROGRESSIVE_STICK_UPGRADE] = Item(RG_PROGRESSIVE_STICK_UPGRADE, Text{ "Progressive Stick Capacity", "Capacité de Bâtons (prog.)", "Progressive Stick-Kapazität" }, ITEMTYPE_ITEM, 0x88, false, &logic->noVariable, RHT_PROGRESSIVE_STICK_UPGRADE, true);
itemTable[RG_PROGRESSIVE_BOMBCHUS] = Item(RG_PROGRESSIVE_BOMBCHUS, Text{ "Progressive Bombchu", "Missiles (prog.)", "Progressive Kriechgrube" }, ITEMTYPE_ITEM, 0x89, true, &logic->Bombchus, RHT_PROGRESSIVE_BOMBCHUS, RG_PROGRESSIVE_BOMBCHUS, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER, true);
itemTable[RG_PROGRESSIVE_BOMBCHUS] = Item(RG_PROGRESSIVE_BOMBCHUS, Text{ "Progressive Bombchu", "Missiles (prog.)", "Progressive Kriechgrube" }, ITEMTYPE_ITEM, 0x89, true, &logic->Bombchus, RHT_PROGRESSIVE_BOMBCHUS, true);
itemTable[RG_PROGRESSIVE_MAGIC_METER] = Item(RG_PROGRESSIVE_MAGIC_METER, Text{ "Progressive Magic Meter", "Jauge de Magie (prog.)", "Progressives magisches Messgerät" }, ITEMTYPE_ITEM, 0x8A, true, &logic->ProgressiveMagic, RHT_PROGRESSIVE_MAGIC_METER, true);
itemTable[RG_PROGRESSIVE_OCARINA] = Item(RG_PROGRESSIVE_OCARINA, Text{ "Progressive Ocarina", "Ocarina (prog.)", "Progressive Okarina" }, ITEMTYPE_ITEM, 0x8B, true, &logic->ProgressiveOcarina, RHT_PROGRESSIVE_OCARINA, true);
itemTable[RG_PROGRESSIVE_GORONSWORD] = Item(RG_PROGRESSIVE_GORONSWORD, Text{ "Progressive Goron Sword", "Épée Goron (prog.)", "Progressives Goronenschwert" }, ITEMTYPE_ITEM, 0xD4, true, &logic->ProgressiveGiantKnife,RHT_PROGRESSIVE_GORONSWORD, true);
@ -288,6 +288,15 @@ void Rando::StaticData::InitItemTable() {
itemTable[RG_BRONZE_SCALE] = Item(RG_BRONZE_SCALE, Text{ "Bronze Scale", "!!!", "!!!" }, ITEMTYPE_ITEM, GI_SCALE_SILVER, true, &logic->ProgressiveWallet, RHT_BRONZE_SCALE, RG_BRONZE_SCALE, OBJECT_GI_SCALE, GID_SCALE_SILVER, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_MAJOR, MOD_RANDOMIZER);
itemTable[RG_BRONZE_SCALE].SetCustomDrawFunc(Randomizer_DrawBronzeScale);
itemTable[RG_QUIVER_INF] = Item(RG_QUIVER_INF, Text{ "Infinite Quiver", "!!!", "!!!" }, ITEMTYPE_ITEM, RG_QUIVER_INF, true, &logic->ProgressiveBow, RHT_QUIVER_INF, RG_QUIVER_INF, OBJECT_GI_ARROWCASE, GID_QUIVER_50, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER);
itemTable[RG_BOMB_BAG_INF] = Item(RG_BOMB_BAG_INF, Text{ "Infinite Bomb Bag", "!!!", "!!!" }, ITEMTYPE_ITEM, RG_BOMB_BAG_INF, true, &logic->ProgressiveBombBag, RHT_BOMB_BAG_INF, RG_BOMB_BAG_INF, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_40, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER);
itemTable[RG_BULLET_BAG_INF] = Item(RG_BULLET_BAG_INF, Text{ "Infinite Bullet Bag", "!!!", "!!!" }, ITEMTYPE_ITEM, RG_BULLET_BAG_INF, true, &logic->ProgressiveBulletBag, RHT_BULLET_BAG_INF, RG_BULLET_BAG_INF, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER);
itemTable[RG_STICK_UPGRADE_INF] = Item(RG_STICK_UPGRADE_INF, Text{ "Infinite Stick Capacity", "!!!", "!!!" }, ITEMTYPE_ITEM, RG_STICK_UPGRADE_INF, true, &logic->noVariable, RHT_STICK_UPGRADE_INF, RG_STICK_UPGRADE_INF, OBJECT_GI_STICK, GID_STICK, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER);
itemTable[RG_NUT_UPGRADE_INF] = Item(RG_QUIVER_INF, Text{ "Infinite Nut Capacity", "!!!", "!!!" }, ITEMTYPE_ITEM, RG_NUT_UPGRADE_INF, true, &logic->noVariable, RHT_NUT_UPGRADE_INF, RG_NUT_UPGRADE_INF, OBJECT_GI_NUTS, GID_NUTS, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER);
itemTable[RG_MAGIC_INF] = Item(RG_QUIVER_INF, Text{ "Infinite Magic Meter", "!!!", "!!!" }, ITEMTYPE_ITEM, RG_MAGIC_INF, true, &logic->ProgressiveMagic, RHT_MAGIC_INF, RG_MAGIC_INF, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER);
itemTable[RG_BOMBCHU_INF] = Item(RG_BOMBCHU_INF, Text{ "Infinite Bombchus", "!!!", "!!!" }, ITEMTYPE_ITEM, RG_BOMBCHU_INF, true, &logic->Bombchus, RHT_BOMBCHU_INF, RG_BOMBCHU_INF, OBJECT_GI_BOMB_2, GID_BOMBCHU, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER);
itemTable[RG_WALLET_INF] = Item(RG_WALLET_INF, Text{ "Infinite Wallet", "!!!", "!!!" }, ITEMTYPE_ITEM, RG_WALLET_INF, true, &logic->ProgressiveWallet, RHT_WALLET_INF, RG_WALLET_INF, OBJECT_GI_PURSE, GID_WALLET_GIANT, TEXT_RANDOMIZER_CUSTOM_ITEM, 0x80, CHEST_ANIM_LONG, ITEM_CATEGORY_LESSER, MOD_RANDOMIZER);
itemTable[RG_TRIFORCE] = Item(RG_TRIFORCE, Text{ "Triforce", "Triforce", "Triforce" }, ITEMTYPE_EVENT, RG_TRIFORCE, false, &logic->noVariable, RHT_NONE);
itemTable[RG_HINT] = Item(RG_HINT, Text{ "Hint", "Indice", "Hinweis" }, ITEMTYPE_EVENT, RG_HINT, false, &logic->noVariable, RHT_NONE);
// Individual stages of progressive items (only here for GetItemEntry purposes, not for use in seed gen)

View File

@ -249,6 +249,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.)\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"

View File

@ -597,6 +597,13 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe
// This is needed since Plentiful item pool also adds a third progressive wallet
// but we should *not* get Tycoon's Wallet in that mode.
bool tycoonWallet = GetRandoSettingValue(RSK_SHOPSANITY) > RO_SHOPSANITY_ZERO_ITEMS;
// 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
u8 infiniteUpgrades = GetRandoSettingValue(RSK_INFINITE_UPGRADES);
u8 numWallets = 2 + (u8)tycoonWallet + (infiniteUpgrades != RO_INF_UPGRADES_OFF ? 1 : 0);
switch (randoGet) {
case RG_NONE:
case RG_TRIFORCE:
@ -633,11 +640,17 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe
// Inventory Items
case RG_PROGRESSIVE_STICK_UPGRADE:
return CUR_UPG_VALUE(UPG_STICKS) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE;
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 CUR_UPG_VALUE(UPG_NUTS) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE;
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 CUR_UPG_VALUE(UPG_BOMB_BAG) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE;
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:
case RG_BOMBS_10:
case RG_BOMBS_20:
@ -648,7 +661,9 @@ 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 CUR_UPG_VALUE(UPG_QUIVER) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE;
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:
case RG_ARROWS_10:
case RG_ARROWS_30:
@ -657,7 +672,9 @@ 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 CUR_UPG_VALUE(UPG_BULLET_BAG) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE;
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:
case RG_BUY_DEKU_SEEDS_30:
return CUR_UPG_VALUE(UPG_BULLET_BAG) ? CAN_OBTAIN : CANT_OBTAIN_NEED_UPGRADE;
@ -779,13 +796,15 @@ ItemObtainability Randomizer::GetItemObtainabilityFromRandomizerGet(RandomizerGe
case RG_PROGRESSIVE_STRENGTH:
return CUR_UPG_VALUE(UPG_STRENGTH) < 3 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE;
case RG_PROGRESSIVE_WALLET:
return CUR_UPG_VALUE(UPG_WALLET) < (tycoonWallet ? 3 : 2) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE;
return CUR_UPG_VALUE(UPG_WALLET) < numWallets ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE;
case RG_PROGRESSIVE_SCALE:
return CUR_UPG_VALUE(UPG_SCALE) < 2 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE;
case RG_PROGRESSIVE_MAGIC_METER:
case RG_MAGIC_SINGLE:
case RG_MAGIC_DOUBLE:
return gSaveContext.magicLevel < 2 ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE;
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:
return !Flags_GetRandomizerInf(RAND_INF_FISHING_POLE_FOUND) ? CAN_OBTAIN : CANT_OBTAIN_ALREADY_HAVE;
@ -951,6 +970,11 @@ GetItemID Randomizer::GetItemIdFromRandomizerGet(RandomizerGet randoGet, GetItem
// This is needed since Plentiful item pool also adds a third progressive wallet
// but we should *not* get Tycoon's Wallet in that mode.
bool tycoonWallet = GetRandoSettingValue(RSK_SHOPSANITY) > RO_SHOPSANITY_ZERO_ITEMS;
// 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
u8 infiniteUpgrades = GetRandoSettingValue(RSK_INFINITE_UPGRADES);
switch (randoGet) {
case RG_NONE:
return ogItemId;
@ -995,8 +1019,10 @@ GetItemID Randomizer::GetItemIdFromRandomizerGet(RandomizerGet randoGet, GetItem
case 1:
return GI_STICK_UPGRADE_20;
case 2:
case 3:
return GI_STICK_UPGRADE_30;
case 3:
case 4:
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)) {
@ -1004,8 +1030,10 @@ GetItemID Randomizer::GetItemIdFromRandomizerGet(RandomizerGet randoGet, GetItem
case 1:
return GI_NUT_UPGRADE_30;
case 2:
case 3:
return GI_NUT_UPGRADE_40;
case 3:
case 4:
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)) {
@ -1014,8 +1042,10 @@ GetItemID Randomizer::GetItemIdFromRandomizerGet(RandomizerGet randoGet, GetItem
case 1:
return GI_BOMB_BAG_30;
case 2:
case 3:
return GI_BOMB_BAG_40;
case 3:
case 4:
return infiniteUpgrades == RO_INF_UPGRADES_PROGRESSIVE ? (GetItemID)RG_BOMB_BAG_INF : GI_BOMB_BAG_40;
}
case RG_BOMBS_5:
case RG_BUY_BOMBS_525:
@ -1036,8 +1066,10 @@ GetItemID Randomizer::GetItemIdFromRandomizerGet(RandomizerGet randoGet, GetItem
case 1:
return GI_QUIVER_40;
case 2:
case 3:
return GI_QUIVER_50;
case 3:
case 4:
return infiniteUpgrades == RO_INF_UPGRADES_PROGRESSIVE ? (GetItemID)RG_QUIVER_INF : GI_QUIVER_50;
}
case RG_ARROWS_5:
case RG_BUY_ARROWS_10:
@ -1055,8 +1087,10 @@ GetItemID Randomizer::GetItemIdFromRandomizerGet(RandomizerGet randoGet, GetItem
case 1:
return GI_BULLET_BAG_40;
case 2:
case 3:
return GI_BULLET_BAG_50;
case 3:
case 4:
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:
@ -1078,6 +1112,16 @@ GetItemID Randomizer::GetItemIdFromRandomizerGet(RandomizerGet randoGet, GetItem
case RG_BOMBCHU_20:
case RG_BUY_BOMBCHU_20:
return GI_BOMBCHUS_20;
case RG_PROGRESSIVE_BOMBCHUS:
if (INV_CONTENT(ITEM_BOMBCHU) == ITEM_NONE) {
return (GetItemID)RG_PROGRESSIVE_BOMBCHUS;
} else if (infiniteUpgrades != RO_INF_UPGRADES_OFF) {
return (GetItemID)RG_BOMBCHU_INF;
} else if (AMMO(ITEM_BOMBCHU) < 5) {
return GI_BOMBCHUS_10;
} else {
return GI_BOMBCHUS_5;
}
case RG_PROGRESSIVE_HOOKSHOT:
switch (INV_CONTENT(ITEM_HOOKSHOT)) {
case ITEM_NONE:
@ -1194,8 +1238,10 @@ GetItemID Randomizer::GetItemIdFromRandomizerGet(RandomizerGet randoGet, GetItem
case 1:
return GI_WALLET_GIANT;
case 2:
return tycoonWallet ? (GetItemID)RG_TYCOON_WALLET : infiniteUpgrades != RO_INF_UPGRADES_OFF ? (GetItemID)RG_WALLET_INF : GI_WALLET_GIANT;
case 3:
return tycoonWallet ? (GetItemID)RG_TYCOON_WALLET : GI_WALLET_GIANT;
case 4:
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)) {
@ -1213,8 +1259,10 @@ GetItemID Randomizer::GetItemIdFromRandomizerGet(RandomizerGet randoGet, GetItem
case 0:
return (GetItemID)RG_MAGIC_SINGLE;
case 1:
case 2:
return (GetItemID)RG_MAGIC_DOUBLE;
case 2:
case 3:
return infiniteUpgrades != RO_INF_UPGRADES_OFF ? (GetItemID)RG_MAGIC_INF : (GetItemID)RG_MAGIC_DOUBLE;
}
case RG_RECOVERY_HEART:
@ -1312,11 +1360,37 @@ bool Randomizer::IsItemVanilla(RandomizerGet randoGet) {
case RG_GOLD_SKULLTULA_TOKEN:
case RG_PROGRESSIVE_HOOKSHOT:
case RG_PROGRESSIVE_STRENGTH:
return true;
case RG_PROGRESSIVE_BOMB_BAG:
if (CUR_UPG_VALUE(UPG_BOMB_BAG) < 3) {
return true;
} else {
return false;
}
case RG_PROGRESSIVE_BOW:
if (CUR_UPG_VALUE(UPG_QUIVER) < 3) {
return true;
} else {
return false;
}
case RG_PROGRESSIVE_SLINGSHOT:
if (CUR_UPG_VALUE(UPG_BULLET_BAG) < 3) {
return true;
} else {
return false;
}
case RG_PROGRESSIVE_NUT_UPGRADE:
if (CUR_UPG_VALUE(UPG_NUTS) < 3) {
return true;
} else {
return false;
}
case RG_PROGRESSIVE_STICK_UPGRADE:
if (CUR_UPG_VALUE(UPG_STICKS) < 3) {
return true;
} else {
return false;
}
case RG_PROGRESSIVE_OCARINA:
case RG_PROGRESSIVE_GORONSWORD:
case RG_EMPTY_BOTTLE:
@ -1338,6 +1412,9 @@ bool Randomizer::IsItemVanilla(RandomizerGet randoGet) {
case RG_BOMBCHU_10:
case RG_BOMBCHU_20:
case RG_BOMBCHU_DROP:
return true;
case RG_PROGRESSIVE_BOMBCHUS:
return INV_CONTENT(ITEM_BOMBCHU) != ITEM_NONE && !GetRandoSettingValue(RSK_INFINITE_UPGRADES);
case RG_ARROWS_5:
case RG_ARROWS_10:
case RG_ARROWS_30:
@ -3242,7 +3319,7 @@ CustomMessage Randomizer::GetGoronMessage(u16 index) {
void Randomizer::CreateCustomMessages() {
// RANDTODO: Translate into french and german and replace GIMESSAGE_UNTRANSLATED
// with GIMESSAGE(getItemID, itemID, english, german, french).
const std::array<GetItemMessage, 74> getItemMessages = {{
const std::array<GetItemMessage, 82> getItemMessages = {{
GIMESSAGE(RG_GREG_RUPEE, ITEM_MASK_GORON,
"You found %gGreg%w!",
"%gGreg%w! Du hast ihn wirklich gefunden!",
@ -3514,6 +3591,14 @@ void Randomizer::CreateCustomMessages() {
"Vous trouvez la %rtouche %y\xa6%r de&l'Ocarina%w! Vous pouvez&maintenant l'utiliser lorsque&vous en jouez!"),
GIMESSAGE_UNTRANSLATED(RG_BRONZE_SCALE, ITEM_SCALE_SILVER, "You got the %rBronze Scale%w!&The power of buoyancy is yours!"),
GIMESSAGE_UNTRANSLATED(RG_FISHING_POLE, ITEM_FISHING_POLE, "You found a lost %rFishing Pole%w!&Time to hit the pond!"),
GIMESSAGE_UNTRANSLATED(RG_BOMB_BAG_INF, ITEM_BOMB_BAG_40, "You got an %rInfinite Bomb Bag%w!&Now you have %yinfinite bombs%w!"),
GIMESSAGE_UNTRANSLATED(RG_QUIVER_INF, ITEM_QUIVER_50, "You got an %rInfinite Quiver%w!&Now you have %yinfinite arrows%w!"),
GIMESSAGE_UNTRANSLATED(RG_BULLET_BAG_INF, ITEM_BULLET_BAG_50, "You got an %rInfinite Bullet Bag%w!&Now you have %yinfinite&slingshot seeds%w!"),
GIMESSAGE_UNTRANSLATED(RG_STICK_UPGRADE_INF, ITEM_STICK, "You now have %yinfinite%w %rDeku Sticks%w!"),
GIMESSAGE_UNTRANSLATED(RG_NUT_UPGRADE_INF, ITEM_NUT, "You now have %yinfinite%w %rDeku Nuts%w!"),
GIMESSAGE_UNTRANSLATED(RG_MAGIC_INF, ITEM_MAGIC_LARGE, "You now have %yinfinite%w %rMagic%w!"),
GIMESSAGE_UNTRANSLATED(RG_BOMBCHU_INF, ITEM_BOMBCHU, "You now have %yinfinite%w %rBombchus%w!"),
GIMESSAGE_UNTRANSLATED(RG_WALLET_INF, ITEM_WALLET_GIANT, "You now have %yinfinite%w %rmoney%w!"),
}};
CreateGetItemMessages(&getItemMessages);
CreateRupeeMessages();

View File

@ -1963,6 +1963,14 @@ typedef enum {
RG_TYCOON_WALLET,
RG_BRONZE_SCALE,
RG_CHILD_WALLET,
RG_QUIVER_INF,
RG_BOMB_BAG_INF,
RG_BULLET_BAG_INF,
RG_STICK_UPGRADE_INF,
RG_NUT_UPGRADE_INF,
RG_MAGIC_INF,
RG_BOMBCHU_INF,
RG_WALLET_INF,
RG_FAIRY_OCARINA,
RG_OCARINA_OF_TIME,
RG_BOMB_BAG,
@ -3162,6 +3170,14 @@ typedef enum {
RHT_BUY_RED_POTION_40,
RHT_BUY_RED_POTION_50,
RHT_TRIFORCE,
RHT_QUIVER_INF,
RHT_BOMB_BAG_INF,
RHT_BULLET_BAG_INF,
RHT_STICK_UPGRADE_INF,
RHT_NUT_UPGRADE_INF,
RHT_MAGIC_INF,
RHT_BOMBCHU_INF,
RHT_WALLET_INF,
RHT_HINT,
RHT_HINT_MYSTERIOUS,
RHT_TYCOON_WALLET,
@ -3662,6 +3678,7 @@ typedef enum {
RSK_FISHSANITY_POND_COUNT,
RSK_FISHSANITY_AGE_SPLIT,
RSK_SHUFFLE_FISHING_POLE,
RSK_INFINITE_UPGRADES,
RSK_MAX
} RandomizerSettingKey;
@ -3800,6 +3817,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 {

View File

@ -267,6 +267,15 @@ typedef enum {
RAND_INF_ZD_FISH_4,
RAND_INF_ZD_FISH_5,
RAND_INF_HAS_INFINITE_QUIVER,
RAND_INF_HAS_INFINITE_BOMB_BAG,
RAND_INF_HAS_INFINITE_BULLET_BAG,
RAND_INF_HAS_INFINITE_STICK_UPGRADE,
RAND_INF_HAS_INFINITE_NUT_UPGRADE,
RAND_INF_HAS_INFINITE_MAGIC_METER,
RAND_INF_HAS_INFINITE_BOMBCHUS,
RAND_INF_HAS_INFINITE_MONEY,
// If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16)
RAND_INF_MAX,

View File

@ -180,6 +180,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::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
@ -758,7 +759,8 @@ void Settings::CreateOptions() {
&mOptions[RSK_BOMBCHUS_IN_LOGIC],
&mOptions[RSK_ENABLE_BOMBCHU_DROPS],
&mOptions[RSK_BLUE_FIRE_ARROWS],
&mOptions[RSK_SUNLIGHT_ARROWS]
&mOptions[RSK_SUNLIGHT_ARROWS],
&mOptions[RSK_INFINITE_UPGRADES]
}, false, WidgetContainerType::COLUMN);
mOptionGroups[RSG_GAMEPLAY_IMGUI_TABLE] = OptionGroup::SubGroup("Gameplay", {
&mOptionGroups[RSG_TIMESAVERS_IMGUI],
@ -979,6 +981,7 @@ void Settings::CreateOptions() {
&mOptions[RSK_DAMAGE_MULTIPLIER],
&mOptions[RSK_BLUE_FIRE_ARROWS],
&mOptions[RSK_SUNLIGHT_ARROWS],
&mOptions[RSK_INFINITE_UPGRADES],
});
mOptionGroups[RSG_ITEM_POOL] = OptionGroup("Item Pool Settings", std::initializer_list<Option*>({
&mOptions[RSK_ITEM_POOL],
@ -1192,6 +1195,7 @@ void Settings::CreateOptions() {
{ "Miscellaneous Settings:Hint Distribution", RSK_HINT_DISTRIBUTION },
{ "Miscellaneous Settings:Blue Fire Arrows", RSK_BLUE_FIRE_ARROWS },
{ "Miscellaneous Settings:Sunlight Arrows", RSK_SUNLIGHT_ARROWS },
{ "Miscellaneous Settings:Infinite Upgrades", RSK_INFINITE_UPGRADES },
{ "Timesaver Settings:Skip Child Zelda", RSK_SKIP_CHILD_ZELDA },
{ "Start with Consumables", RSK_STARTING_CONSUMABLES },
{ "Full Wallets", RSK_FULL_WALLETS },
@ -2278,6 +2282,7 @@ void Settings::ParseJson(nlohmann::json spoilerFileJson) {
case RSK_SKULLS_SUNS_SONG:
case RSK_BLUE_FIRE_ARROWS:
case RSK_SUNLIGHT_ARROWS:
case RSK_INFINITE_UPGRADES:
case RSK_BOMBCHUS_IN_LOGIC:
case RSK_TOT_ALTAR_HINT:
case RSK_LIGHT_ARROWS_HINT:

View File

@ -2666,6 +2666,8 @@ u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) {
if (INV_CONTENT(ITEM_BOMBCHU) == ITEM_NONE) {
INV_CONTENT(ITEM_BOMBCHU) = ITEM_BOMBCHU;
AMMO(ITEM_BOMBCHU) = 20;
} else if (Randomizer_GetSettingValue(RSK_INFINITE_UPGRADES)) {
Flags_SetRandomizerInf(RAND_INF_HAS_INFINITE_BOMBCHUS);
} else {
AMMO(ITEM_BOMBCHU) += AMMO(ITEM_BOMBCHU) < 5 ? 10 : 5;
if (AMMO(ITEM_BOMBCHU) > 50) {
@ -2694,6 +2696,46 @@ u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) {
return Return_Item_Entry(giEntry, RG_NONE);
}
if (item == RG_QUIVER_INF) {
Flags_SetRandomizerInf(RAND_INF_HAS_INFINITE_QUIVER);
return Return_Item_Entry(giEntry, RG_NONE);
}
if (item == RG_BOMB_BAG_INF) {
Flags_SetRandomizerInf(RAND_INF_HAS_INFINITE_BOMB_BAG);
return Return_Item_Entry(giEntry, RG_NONE);
}
if (item == RG_BULLET_BAG_INF) {
Flags_SetRandomizerInf(RAND_INF_HAS_INFINITE_BULLET_BAG);
return Return_Item_Entry(giEntry, RG_NONE);
}
if (item == RG_STICK_UPGRADE_INF) {
Flags_SetRandomizerInf(RAND_INF_HAS_INFINITE_STICK_UPGRADE);
return Return_Item_Entry(giEntry, RG_NONE);
}
if (item == RG_NUT_UPGRADE_INF) {
Flags_SetRandomizerInf(RAND_INF_HAS_INFINITE_NUT_UPGRADE);
return Return_Item_Entry(giEntry, RG_NONE);
}
if (item == RG_MAGIC_INF) {
Flags_SetRandomizerInf(RAND_INF_HAS_INFINITE_MAGIC_METER);
return Return_Item_Entry(giEntry, RG_NONE);
}
if (item == RG_BOMBCHU_INF) {
Flags_SetRandomizerInf(RAND_INF_HAS_INFINITE_BOMBCHUS);
return Return_Item_Entry(giEntry, RG_NONE);
}
if (item == RG_WALLET_INF) {
Flags_SetRandomizerInf(RAND_INF_HAS_INFINITE_MONEY);
return Return_Item_Entry(giEntry, RG_NONE);
}
temp = gSaveContext.inventory.items[slot];
osSyncPrintf("Item_Register(%d)=%d %d\n", slot, item, temp);
INV_CONTENT(item) = item;
@ -3457,21 +3499,23 @@ void Interface_UpdateMagicBar(PlayState* play) {
break;
case MAGIC_STATE_CONSUME:
gSaveContext.magic -= 2;
if (gSaveContext.magic <= 0) {
gSaveContext.magic = 0;
gSaveContext.magicState = MAGIC_STATE_METER_FLASH_1;
if (CVarGetInteger("gCosmetics.Consumable_MagicBorder.Changed", 0)) {
sMagicBorder = CVarGetColor24("gCosmetics.Consumable_MagicBorder.Value", sMagicBorder_ori);
} else {
sMagicBorder = sMagicBorder_ori;
}
} else if (gSaveContext.magic == gSaveContext.magicTarget) {
gSaveContext.magicState = MAGIC_STATE_METER_FLASH_1;
if (CVarGetInteger("gCosmetics.Consumable_MagicBorder.Changed", 0)) {
sMagicBorder = CVarGetColor24("gCosmetics.Consumable_MagicBorder.Value", sMagicBorder_ori);
} else {
sMagicBorder = sMagicBorder_ori;
if (!Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_MAGIC_METER)) {
gSaveContext.magic -= 2;
if (gSaveContext.magic <= 0) {
gSaveContext.magic = 0;
gSaveContext.magicState = MAGIC_STATE_METER_FLASH_1;
if (CVarGetInteger("gCosmetics.Consumable_MagicBorder.Changed", 0)) {
sMagicBorder = CVarGetColor24("gCosmetics.Consumable_MagicBorder.Value", sMagicBorder_ori);
} else {
sMagicBorder = sMagicBorder_ori;
}
} else if (gSaveContext.magic == gSaveContext.magicTarget) {
gSaveContext.magicState = MAGIC_STATE_METER_FLASH_1;
if (CVarGetInteger("gCosmetics.Consumable_MagicBorder.Changed", 0)) {
sMagicBorder = CVarGetColor24("gCosmetics.Consumable_MagicBorder.Value", sMagicBorder_ori);
} else {
sMagicBorder = sMagicBorder_ori;
}
}
}
case MAGIC_STATE_METER_FLASH_1:
@ -3635,6 +3679,7 @@ void Interface_DrawMagicBar(PlayState* play) {
s16 magicBarY;
Color_RGB8 magicbar_yellow = {250,250,0}; //Magic bar being used
Color_RGB8 magicbar_green = {R_MAGIC_FILL_COLOR(0),R_MAGIC_FILL_COLOR(1),R_MAGIC_FILL_COLOR(2)}; //Magic bar fill
Color_RGB8 magicbar_blue = {0,0,200};//Infinite magic bar
if (CVarGetInteger("gCosmetics.Consumable_MagicActive.Changed", 0)) {
magicbar_yellow = CVarGetColor24("gCosmetics.Consumable_MagicActive.Value", magicbar_yellow);
@ -3642,6 +3687,9 @@ void Interface_DrawMagicBar(PlayState* play) {
if (CVarGetInteger("gCosmetics.Consumable_Magic.Changed", 0)) {
magicbar_green = CVarGetColor24("gCosmetics.Consumable_Magic.Value", magicbar_green);
}
if (CVarGetInteger("gCosmetics.Consumable_MagicInfinite.Changed", 0)) {
magicbar_blue = CVarGetColor24("gCosmetics.Consumable_MagicInfinite.Value", magicbar_blue);
}
OPEN_DISPS(play->state.gfxCtx);
@ -3749,14 +3797,26 @@ void Interface_DrawMagicBar(PlayState* play) {
// Fill the rest of the bar with the normal magic color
gDPPipeSync(OVERLAY_DISP++);
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, magicbar_green.r, magicbar_green.g, magicbar_green.b, interfaceCtx->magicAlpha);
if (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_MAGIC_METER)) {
// Blue magic
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, magicbar_blue.r, magicbar_blue.g, magicbar_blue.b, interfaceCtx->magicAlpha);
} else {
// Green magic (default)
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, magicbar_green.r, magicbar_green.g, magicbar_green.b, interfaceCtx->magicAlpha);
}
gSPWideTextureRectangle(OVERLAY_DISP++, rMagicFillX << 2, (magicBarY + 3) << 2,
(rMagicFillX + gSaveContext.magicTarget) << 2, (magicBarY + 10) << 2, G_TX_RENDERTILE,
0, 0, 1 << 10, 1 << 10);
} else {
// Fill the whole bar with the normal magic color
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, magicbar_green.r, magicbar_green.g, magicbar_green.b, interfaceCtx->magicAlpha);
if (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_MAGIC_METER)) {
// Blue magic
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, magicbar_blue.r, magicbar_blue.g, magicbar_blue.b, interfaceCtx->magicAlpha);
} else {
// Green magic (default)
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, magicbar_green.r, magicbar_green.g, magicbar_green.b, interfaceCtx->magicAlpha);
}
gDPLoadMultiBlock_4b(OVERLAY_DISP++, gMagicMeterFillTex, 0, G_TX_RENDERTILE, G_IM_FMT_I, 16, 16, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
@ -4900,10 +4960,16 @@ void Interface_DrawAmmoCount(PlayState* play, s16 button, s16 alpha) {
i = gSaveContext.equips.buttonItems[button];
if ((i == ITEM_STICK) || (i == ITEM_NUT) || (i == ITEM_BOMB) || (i == ITEM_BOW) ||
((i >= ITEM_BOW_ARROW_FIRE) && (i <= ITEM_BOW_ARROW_LIGHT)) || (i == ITEM_SLINGSHOT) || (i == ITEM_BOMBCHU) ||
(i == ITEM_BEAN)) {
if (
(i == ITEM_STICK && !Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_STICK_UPGRADE)) ||
(i == ITEM_NUT && !Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_NUT_UPGRADE)) ||
(i == ITEM_BOMB && !Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BOMB_BAG)) ||
(i == ITEM_BOW && !Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_QUIVER)) ||
((i >= ITEM_BOW_ARROW_FIRE) && (i <= ITEM_BOW_ARROW_LIGHT) && !Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_QUIVER)) ||
(i == ITEM_SLINGSHOT && !Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BULLET_BAG)) ||
(i == ITEM_BOMBCHU && !Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BOMBCHUS)) ||
(i == ITEM_BEAN)
) {
if ((i >= ITEM_BOW_ARROW_FIRE) && (i <= ITEM_BOW_ARROW_LIGHT)) {
i = ITEM_BOW;
}
@ -5176,8 +5242,8 @@ void Interface_Draw(PlayState* play) {
if (fullUi) {
s16 PosX_RC;
s16 PosY_RC;
//when not having a wallet in rando, don't calculate the ruppe icon
if (!IS_RANDO || Flags_GetRandomizerInf(RAND_INF_HAS_WALLET)) {
//when not having a wallet (or infinite money) in rando, don't calculate the ruppe icon
if (!IS_RANDO || (Flags_GetRandomizerInf(RAND_INF_HAS_WALLET) && !Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_MONEY))) {
// Rupee Icon
if (CVarGetInteger("gDynamicWalletIcon", 0)) {
switch (CUR_UPG_VALUE(UPG_WALLET)) {

View File

@ -37,6 +37,21 @@ s8 ItemInSlotUsesAmmo(s16 slot) {
}
void KaleidoScope_DrawAmmoCount(PauseContext* pauseCtx, GraphicsContext* gfxCtx, s16 item, int slot) {
// don't draw ammo count if you have the infinite upgrade
if (
(item == ITEM_NUT && Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_NUT_UPGRADE)) ||
(item == ITEM_STICK && Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_STICK_UPGRADE)) ||
(item == ITEM_BOMB && Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BOMB_BAG)) ||
(
(item == ITEM_BOW || item == ITEM_BOW_ARROW_FIRE || item == ITEM_BOW_ARROW_ICE || item == ITEM_BOW_ARROW_LIGHT) &&
Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_QUIVER)
) ||
(item == ITEM_SLINGSHOT && Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BULLET_BAG)) ||
(item == ITEM_BOMBCHU && Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_BOMBCHUS))
) {
return;
}
s16 ammo;
s16 i;