diff --git a/soh/soh/Enhancements/Cheats/Infinite/Money.cpp b/soh/soh/Enhancements/Cheats/Infinite/Money.cpp index 38b402d6d27..26d04ca9354 100644 --- a/soh/soh/Enhancements/Cheats/Infinite/Money.cpp +++ b/soh/soh/Enhancements/Cheats/Infinite/Money.cpp @@ -1,6 +1,7 @@ #include #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/ShipInit.hpp" +#include "soh/Enhancements/randomizer/BankCards.h" #include "z64save.h" #include "variables.h" @@ -19,7 +20,7 @@ void OnGameFrameUpdateInfiniteMoney() { return; } - gSaveContext.rupees = CUR_CAPACITY(UPG_WALLET); + gSaveContext.rupees = Randomizer_BankCards_GetMaxRupees(); } void RegisterInfiniteMoney() { diff --git a/soh/soh/Enhancements/TimeSavers/FasterRupeeAccumulator.cpp b/soh/soh/Enhancements/TimeSavers/FasterRupeeAccumulator.cpp index 5fcfb0d2681..4b6dd4b1398 100644 --- a/soh/soh/Enhancements/TimeSavers/FasterRupeeAccumulator.cpp +++ b/soh/soh/Enhancements/TimeSavers/FasterRupeeAccumulator.cpp @@ -1,5 +1,6 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/ShipInit.hpp" +#include "soh/Enhancements/randomizer/BankCards.h" extern "C" { #include "z64save.h" @@ -18,12 +19,13 @@ void RegisterFasterRupeeAccumulator() { // Gaining rupees if (gSaveContext.rupeeAccumulator > 0) { + s16 maxRupees = Randomizer_BankCards_GetMaxRupees(); // Wallet is full - if (gSaveContext.rupees >= CUR_CAPACITY(UPG_WALLET)) { + if (gSaveContext.rupees >= maxRupees) { return; } - if (gSaveContext.rupeeAccumulator >= 10 && gSaveContext.rupees + 10 < CUR_CAPACITY(UPG_WALLET)) { + if (gSaveContext.rupeeAccumulator >= 10 && gSaveContext.rupees + 10 < maxRupees) { gSaveContext.rupeeAccumulator -= 10; gSaveContext.rupees += 10; } diff --git a/soh/soh/Enhancements/game-interactor/GameInteractionEffect.cpp b/soh/soh/Enhancements/game-interactor/GameInteractionEffect.cpp index 7c762ca663f..7b98b15f569 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractionEffect.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractionEffect.cpp @@ -12,6 +12,7 @@ have functions to both enable and disable said effect. #include "GameInteractor.h" #include #include "soh/Enhancements/cosmetics/CosmeticsEditor.h" +#include "soh/Enhancements/randomizer/BankCards.h" extern "C" { #include @@ -148,7 +149,7 @@ GameInteractionEffectQueryResult ModifyRupees::CanBeApplied() { if (!GameInteractor::IsSaveLoaded(true)) { return GameInteractionEffectQueryResult::TemporarilyNotPossible; } else if ((parameters[0] < 0 && gSaveContext.rupees <= 0) || - (parameters[0] > 0 && gSaveContext.rupees >= CUR_CAPACITY(UPG_WALLET))) { + (parameters[0] > 0 && gSaveContext.rupees >= Randomizer_BankCards_GetMaxRupees())) { return GameInteractionEffectQueryResult::NotPossible; } else { return GameInteractionEffectQueryResult::Possible; diff --git a/soh/soh/Enhancements/randomizer/BankCards.cpp b/soh/soh/Enhancements/randomizer/BankCards.cpp new file mode 100644 index 00000000000..10362b09615 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/BankCards.cpp @@ -0,0 +1,122 @@ +#include "BankCards.h" +#include "soh/OTRGlobals.h" +#include "randomizerTypes.h" + +extern "C" { +#include "macros.h" +#include "z64save.h" +#include "functions.h" +#include "variables.h" +extern s32 Flags_GetRandomizerInf(RandomizerInf flag); +} + +namespace Rando::BankCards { + +static constexpr s16 BANK_CARD_MAX_RUPEES = 9999; + +static bool HasRandomizerContext() { + return OTRGlobals::Instance != nullptr && OTRGlobals::Instance->gRandomizer != nullptr; +} + +bool IsEnabled() { + return IS_RANDO && HasRandomizerContext() && + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_BANK_CARDS) != 0; +} + +s16 GetMaxRupees() { + // When the setting is off we behave exactly like the vanilla wallet cap. + if (!IsEnabled()) { + return CUR_CAPACITY(UPG_WALLET); + } + + return BANK_CARD_MAX_RUPEES; +} + +s16 GetTransactionLimit() { + if (IsEnabled() && !Flags_GetRandomizerInf(RAND_INF_HAS_WALLET)) { + return 0; + } + + return CUR_CAPACITY(UPG_WALLET); +} + +bool CanSpend(s32 price) { + if (price < 0) { + return false; + } + + // Bank Cards restrict a single purchase to the current wallet size; otherwise only check the total rupees. + if (IsEnabled() && price > GetTransactionLimit()) { + return false; + } + + return gSaveContext.rupees >= price; +} + +bool ShouldApplyFullWallets() { + if (!HasRandomizerContext() || IsEnabled()) { + return false; + } + + return OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FULL_WALLETS) != 0; +} + +bool FormatRupeeDigits(s16 rupees, s16* counterDigits, s16* firstDigitIndex, s16* digitCount) { + if (!IsEnabled() || counterDigits == nullptr || firstDigitIndex == nullptr || digitCount == nullptr) { + return false; + } + + s16 cappedRupees = rupees; + if (cappedRupees < 0) { + cappedRupees = 0; + } + s16 maxRupees = GetMaxRupees(); + if (cappedRupees > maxRupees) { + cappedRupees = maxRupees; + } + + counterDigits[0] = cappedRupees / 1000; + counterDigits[1] = (cappedRupees / 100) % 10; + counterDigits[2] = (cappedRupees / 10) % 10; + counterDigits[3] = cappedRupees % 10; + + if (cappedRupees >= 1000) { + *firstDigitIndex = 0; + *digitCount = 4; + } else if (cappedRupees >= 100) { + *firstDigitIndex = 0; + *digitCount = 3; + } else { + *firstDigitIndex = 1; + *digitCount = 2; + } + + return true; +} + +} // namespace Rando::BankCards + +extern "C" bool Randomizer_BankCardsEnabled() { + return Rando::BankCards::IsEnabled(); +} + +extern "C" s16 Randomizer_BankCards_GetMaxRupees() { + return Rando::BankCards::GetMaxRupees(); +} + +extern "C" s16 Randomizer_BankCards_GetTransactionLimit() { + return Rando::BankCards::GetTransactionLimit(); +} + +extern "C" bool Randomizer_BankCards_CanSpend(s32 price) { + return Rando::BankCards::CanSpend(price); +} + +extern "C" bool Randomizer_BankCards_ShouldApplyFullWallets() { + return Rando::BankCards::ShouldApplyFullWallets(); +} + +extern "C" bool Randomizer_BankCards_FormatRupeeDigits(s16 rupees, s16* counterDigits, s16* firstDigitIndex, + s16* digitCount) { + return Rando::BankCards::FormatRupeeDigits(rupees, counterDigits, firstDigitIndex, digitCount); +} diff --git a/soh/soh/Enhancements/randomizer/BankCards.h b/soh/soh/Enhancements/randomizer/BankCards.h new file mode 100644 index 00000000000..da38c50f9e5 --- /dev/null +++ b/soh/soh/Enhancements/randomizer/BankCards.h @@ -0,0 +1,21 @@ +#pragma once + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +bool Randomizer_BankCardsEnabled(); +s16 Randomizer_BankCards_GetMaxRupees(); +s16 Randomizer_BankCards_GetTransactionLimit(); +bool Randomizer_BankCards_CanSpend(s32 price); +bool Randomizer_BankCards_ShouldApplyFullWallets(); +bool Randomizer_BankCards_FormatRupeeDigits(s16 rupees, s16* counterDigits, s16* firstDigitIndex, + s16* digitCount); + +#ifdef __cplusplus +} +#endif + diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 23f938d7927..551eb4ec8fe 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -7,6 +7,7 @@ #include "soh/Enhancements/randomizer/randomizerTypes.h" #include "soh/Enhancements/randomizer/dungeon.h" #include "soh/Enhancements/randomizer/static_data.h" +#include "soh/Enhancements/randomizer/BankCards.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/SohGui/ImGuiUtils.h" @@ -1160,9 +1161,9 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } case VB_CHECK_RANDO_PRICE_OF_CARPET_SALESMAN: { if (EnJs_RandoCanGetCarpetMerchantItem()) { - *should = - gSaveContext.rupees < + const s32 price = OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_WASTELAND_BOMBCHU_SALESMAN)->GetPrice(); + *should = !Randomizer_BankCards_CanSpend(price); } break; } @@ -1188,8 +1189,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } case VB_CHECK_RANDO_PRICE_OF_MEDIGORON: { if (EnGm_RandoCanGetMedigoronItem()) { - *should = gSaveContext.rupees < - OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_GC_MEDIGORON)->GetPrice(); + const s32 price = OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_GC_MEDIGORON)->GetPrice(); + *should = !Randomizer_BankCards_CanSpend(price); } break; } @@ -1401,8 +1402,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l } case VB_GRANNY_SAY_INSUFFICIENT_RUPEES: { if (EnDs_RandoCanGetGrannyItem()) { - *should = gSaveContext.rupees < - OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_KAK_GRANNYS_SHOP)->GetPrice(); + const s32 price = OTRGlobals::Instance->gRandoContext->GetItemLocation(RC_KAK_GRANNYS_SHOP)->GetPrice(); + *should = !Randomizer_BankCards_CanSpend(price); } break; } @@ -1617,7 +1618,8 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_l break; } case VB_RENDER_RUPEE_COUNTER: { - if (!Flags_GetRandomizerInf(RAND_INF_HAS_WALLET) || Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_MONEY)) { + if ((!Flags_GetRandomizerInf(RAND_INF_HAS_WALLET) && !Randomizer_BankCardsEnabled()) || + Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_MONEY)) { *should = false; } break; @@ -1916,7 +1918,7 @@ u32 EnDns_RandomizerPurchaseableCheck(EnDns* enDns) { if (Flags_GetRandomizerInf(enDns->sohScrubIdentity.randomizerInf)) { return 3; // Can't get this now } - if (gSaveContext.rupees < enDns->dnsItemEntry->itemPrice) { + if (!Randomizer_BankCards_CanSpend(enDns->dnsItemEntry->itemPrice)) { return 0; // Not enough rupees } return 4; @@ -2226,10 +2228,10 @@ void RandomizerOnGameFrameUpdateHandler() { } if (Flags_GetRandomizerInf(RAND_INF_HAS_INFINITE_MONEY)) { - gSaveContext.rupees = static_cast(CUR_CAPACITY(UPG_WALLET)); + gSaveContext.rupees = Randomizer_BankCards_GetMaxRupees(); } - if (!Flags_GetRandomizerInf(RAND_INF_HAS_WALLET)) { + if (!Flags_GetRandomizerInf(RAND_INF_HAS_WALLET) && !Randomizer_BankCardsEnabled()) { gSaveContext.rupees = 0; } } diff --git a/soh/soh/Enhancements/randomizer/option_descriptions.cpp b/soh/soh/Enhancements/randomizer/option_descriptions.cpp index 1f6b71a881a..4ac0f722cca 100644 --- a/soh/soh/Enhancements/randomizer/option_descriptions.cpp +++ b/soh/soh/Enhancements/randomizer/option_descriptions.cpp @@ -737,6 +737,9 @@ void Settings::CreateOptionDescriptions() { mOptionDescriptions[RSK_MASK_SHOP_HINT] = "Reading the mask shop sign will tell you rewards from showing masks at the Deku Theatre."; mOptionDescriptions[RSK_FULL_WALLETS] = "Start with a full wallet. All wallet upgrades come filled with rupees."; + mOptionDescriptions[RSK_BANK_CARDS] = + "Raises the rupee balance cap to 9999 while wallet upgrades set the maximum you can spend per purchase. " + "Full Wallets is ignored when this is on."; mOptionDescriptions[RSK_BOMBCHU_BAG] = "None - Bombchus have vanilla behavior, any Bombchu requirement is filled by Bomb Bag + a renewable source of " "Bombchus.\n\n" diff --git a/soh/soh/Enhancements/randomizer/randomizer.cpp b/soh/soh/Enhancements/randomizer/randomizer.cpp index de17327f19b..762e6c2addd 100644 --- a/soh/soh/Enhancements/randomizer/randomizer.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer.cpp @@ -22,6 +22,7 @@ #include #include "randomizer_check_objects.h" #include "randomizer_check_tracker.h" +#include "BankCards.h" #include #include #include @@ -6266,13 +6267,13 @@ extern "C" u16 Randomizer_Item_Give(PlayState* play, GetItemEntry giEntry) { break; case RG_TYCOON_WALLET: Inventory_ChangeUpgrade(UPG_WALLET, 3); - if (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FULL_WALLETS)) { + if (Randomizer_BankCards_ShouldApplyFullWallets()) { Rupees_ChangeBy(999); } break; case RG_CHILD_WALLET: Flags_SetRandomizerInf(RAND_INF_HAS_WALLET); - if (OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_FULL_WALLETS)) { + if (Randomizer_BankCards_ShouldApplyFullWallets()) { Rupees_ChangeBy(99); } break; diff --git a/soh/soh/Enhancements/randomizer/randomizerTypes.h b/soh/soh/Enhancements/randomizer/randomizerTypes.h index 6d5036945ad..b37afd54046 100644 --- a/soh/soh/Enhancements/randomizer/randomizerTypes.h +++ b/soh/soh/Enhancements/randomizer/randomizerTypes.h @@ -6183,6 +6183,7 @@ typedef enum { RSK_STARTING_STICKS, RSK_STARTING_NUTS, RSK_FULL_WALLETS, + RSK_BANK_CARDS, RSK_SHUFFLE_CHEST_MINIGAME, RSK_BIG_POE_COUNT, RSK_SKIP_EPONA_RACE, diff --git a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp index cd32cc4b144..12c4400ee53 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_item_tracker.cpp @@ -9,6 +9,7 @@ #include "randomizer_check_tracker.h" #include "randomizer_item_tracker.h" #include "randomizerTypes.h" +#include "BankCards.h" #include "soh/cvar_prefixes.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/OTRGlobals.h" @@ -471,10 +472,15 @@ ItemTrackerNumbers GetItemCurrentAndMax(ItemTrackerItem item) { case ITEM_WALLET_ADULT: case ITEM_WALLET_GIANT: result.currentCapacity = - IS_RANDO && !Flags_GetRandomizerInf(RAND_INF_HAS_WALLET) ? 0 : CUR_CAPACITY(UPG_WALLET); - result.maxCapacity = - IS_RANDO && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_INCLUDE_TYCOON_WALLET) ? 999 - : 500; + (IS_RANDO && !Flags_GetRandomizerInf(RAND_INF_HAS_WALLET) && !Randomizer_BankCardsEnabled()) + ? 0 + : Randomizer_BankCards_GetMaxRupees(); + result.maxCapacity = IS_RANDO && Randomizer_BankCardsEnabled() + ? Randomizer_BankCards_GetMaxRupees() + : (IS_RANDO && + OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_INCLUDE_TYCOON_WALLET) + ? 999 + : 500); result.currentAmmo = gSaveContext.rupees; break; case ITEM_BOMBCHU: diff --git a/soh/soh/Enhancements/randomizer/savefile.cpp b/soh/soh/Enhancements/randomizer/savefile.cpp index c8c3ea43102..ad032886861 100644 --- a/soh/soh/Enhancements/randomizer/savefile.cpp +++ b/soh/soh/Enhancements/randomizer/savefile.cpp @@ -3,6 +3,7 @@ #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/randomizer/logic.h" +#include "soh/Enhancements/randomizer/BankCards.h" extern "C" { #include @@ -18,14 +19,7 @@ GetItemEntry Randomizer_GetItemFromKnownCheck(RandomizerCheck randomizerCheck, G // Item_Give in z_parameter, we'll need to update Item_Give to ensure // nothing breaks when calling it without a valid play first. void GiveLinkRupees(int numOfRupees) { - int maxRupeeCount = 0; - if (CUR_UPG_VALUE(UPG_WALLET) == 0) { - maxRupeeCount = 99; - } else if (CUR_UPG_VALUE(UPG_WALLET) == 1) { - maxRupeeCount = 200; - } else if (CUR_UPG_VALUE(UPG_WALLET) == 2) { - maxRupeeCount = 500; - } + int maxRupeeCount = Randomizer_BankCards_GetMaxRupees(); int newRupeeCount = gSaveContext.rupees; newRupeeCount += numOfRupees; @@ -179,7 +173,7 @@ void SetStartingItems() { } } - if (Randomizer_GetSettingValue(RSK_FULL_WALLETS)) { + if (Randomizer_BankCards_ShouldApplyFullWallets()) { GiveLinkRupees(9001); } diff --git a/soh/soh/Enhancements/randomizer/settings.cpp b/soh/soh/Enhancements/randomizer/settings.cpp index 8715b154bc6..91d530f23e2 100644 --- a/soh/soh/Enhancements/randomizer/settings.cpp +++ b/soh/soh/Enhancements/randomizer/settings.cpp @@ -322,6 +322,7 @@ void Settings::CreateOptions() { OPT_BOOL(RSK_STARTING_STICKS, "Start with Stick Ammo", {"No", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StartingSticks"), "", WidgetType::Checkbox, RO_GENERIC_OFF); OPT_BOOL(RSK_STARTING_NUTS, "Start with Nut Ammo", {"No", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("StartingNuts"), "", WidgetType::Checkbox, RO_GENERIC_OFF); OPT_BOOL(RSK_FULL_WALLETS, "Full Wallets", {"No", "Yes"}, OptionCategory::Setting, CVAR_RANDOMIZER_SETTING("FullWallets"), mOptionDescriptions[RSK_FULL_WALLETS], WidgetType::Checkbox, RO_GENERIC_OFF); + OPT_BOOL(RSK_BANK_CARDS, "Bank Cards", CVAR_RANDOMIZER_SETTING("BankCards"), mOptionDescriptions[RSK_BANK_CARDS]); OPT_BOOL(RSK_STARTING_ZELDAS_LULLABY, "Start with Zelda's Lullaby", CVAR_RANDOMIZER_SETTING("StartingZeldasLullaby"), "", IMFLAG_NONE); OPT_BOOL(RSK_STARTING_EPONAS_SONG, "Start with Epona's Song", CVAR_RANDOMIZER_SETTING("StartingEponasSong"), "", IMFLAG_NONE); OPT_BOOL(RSK_STARTING_SARIAS_SONG, "Start with Saria's Song", CVAR_RANDOMIZER_SETTING("StartingSariasSong"), "", IMFLAG_NONE); @@ -1430,6 +1431,7 @@ void Settings::CreateOptions() { mOptionGroups[RSG_ADDITIONAL_FEATURES_IMGUI] = OptionGroup::SubGroup("Additional Features", { &mOptions[RSK_FULL_WALLETS], + &mOptions[RSK_BANK_CARDS], &mOptions[RSK_BOMBCHU_BAG], &mOptions[RSK_ENABLE_BOMBCHU_DROPS], &mOptions[RSK_BLUE_FIRE_ARROWS], diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c index 3b1d91f056a..39ad4bff419 100644 --- a/soh/src/code/z_parameter.c +++ b/soh/src/code/z_parameter.c @@ -20,6 +20,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/Enhancements/randomizer/randomizer_grotto.h" +#include "soh/Enhancements/randomizer/BankCards.h" #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/gameplaystats.h" @@ -2071,13 +2072,13 @@ u8 Item_Give(PlayState* play, u8 item) { return Return_Item(item, MOD_NONE, ITEM_NONE); } else if (item == ITEM_WALLET_ADULT) { Inventory_ChangeUpgrade(UPG_WALLET, 1); - if (IS_RANDO && Randomizer_GetSettingValue(RSK_FULL_WALLETS)) { + if (Randomizer_BankCards_ShouldApplyFullWallets()) { Rupees_ChangeBy(200); } return Return_Item(item, MOD_NONE, ITEM_NONE); } else if (item == ITEM_WALLET_GIANT) { Inventory_ChangeUpgrade(UPG_WALLET, 2); - if (IS_RANDO && Randomizer_GetSettingValue(RSK_FULL_WALLETS)) { + if (Randomizer_BankCards_ShouldApplyFullWallets()) { Rupees_ChangeBy(500); } return Return_Item(item, MOD_NONE, ITEM_NONE); @@ -5353,7 +5354,9 @@ void Interface_Draw(PlayState* play) { // Rupee Counter gDPPipeSync(OVERLAY_DISP++); - if (gSaveContext.rupees == CUR_CAPACITY(UPG_WALLET)) { + s16 rupeeLimit = Randomizer_BankCards_GetMaxRupees(); + + if (gSaveContext.rupees == rupeeLimit) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 120, 255, 0, interfaceCtx->magicAlpha); } else if (gSaveContext.rupees != 0) { gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->magicAlpha); @@ -5364,27 +5367,40 @@ void Interface_Draw(PlayState* play) { gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0); - interfaceCtx->counterDigits[0] = interfaceCtx->counterDigits[1] = 0; - interfaceCtx->counterDigits[2] = gSaveContext.rupees; + s16 digitStart = rupeeDigitsFirst[CUR_UPG_VALUE(UPG_WALLET)]; + s16 digitCount = rupeeDigitsCount[CUR_UPG_VALUE(UPG_WALLET)]; - if ((interfaceCtx->counterDigits[2] > 9999) || (interfaceCtx->counterDigits[2] < 0)) { - interfaceCtx->counterDigits[2] &= 0xDDD; - } + if (!Randomizer_BankCards_FormatRupeeDigits(gSaveContext.rupees, interfaceCtx->counterDigits, + &digitStart, &digitCount)) { + interfaceCtx->counterDigits[0] = interfaceCtx->counterDigits[1] = 0; + interfaceCtx->counterDigits[2] = gSaveContext.rupees; + + if ((interfaceCtx->counterDigits[2] > rupeeLimit) || (interfaceCtx->counterDigits[2] < 0)) { + interfaceCtx->counterDigits[2] = rupeeLimit; + } - while (interfaceCtx->counterDigits[2] >= 100) { - interfaceCtx->counterDigits[0]++; - interfaceCtx->counterDigits[2] -= 100; + while (interfaceCtx->counterDigits[2] >= 100) { + interfaceCtx->counterDigits[0]++; + interfaceCtx->counterDigits[2] -= 100; + } + + while (interfaceCtx->counterDigits[2] >= 10) { + interfaceCtx->counterDigits[1]++; + interfaceCtx->counterDigits[2] -= 10; + } } - while (interfaceCtx->counterDigits[2] >= 10) { - interfaceCtx->counterDigits[1]++; - interfaceCtx->counterDigits[2] -= 10; + if (Randomizer_BankCardsEnabled()) { + // Always show 4 slots when bank cards are on so 9999 is readable and lower values stay aligned. + digitStart = 0; + digitCount = 4; } - svar2 = rupeeDigitsFirst[CUR_UPG_VALUE(UPG_WALLET)]; - svar5 = rupeeDigitsCount[CUR_UPG_VALUE(UPG_WALLET)]; + svar2 = digitStart; + svar5 = digitCount; + s16 digitOffset = Randomizer_BankCardsEnabled() ? 8 : 16; - for (svar1 = 0, svar3 = 16; svar1 < svar5; svar1++, svar2++, svar3 += 8) { + for (svar1 = 0, svar3 = digitOffset; svar1 < svar5; svar1++, svar2++, svar3 += 8) { OVERLAY_DISP = Gfx_TextureI8(OVERLAY_DISP, ((u8*)digitTextures[interfaceCtx->counterDigits[svar2]]), 8, 16, PosX_RC + svar3, PosY_RC, 8, 16, 1 << 10, 1 << 10); } @@ -6672,16 +6688,17 @@ void Interface_Update(PlayState* play) { !Play_InCsMode(play)) {} if (gSaveContext.rupeeAccumulator != 0) { + s16 maxRupees = Randomizer_BankCards_GetMaxRupees(); if (gSaveContext.rupeeAccumulator > 0) { - if (gSaveContext.rupees < CUR_CAPACITY(UPG_WALLET)) { + if (gSaveContext.rupees < maxRupees) { gSaveContext.rupeeAccumulator--; gSaveContext.rupees++; Audio_PlaySoundGeneral(NA_SE_SY_RUPY_COUNT, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); } else { // "Rupee Amount MAX = %d" - osSyncPrintf("ルピー数MAX = %d\n", CUR_CAPACITY(UPG_WALLET)); - gSaveContext.rupees = CUR_CAPACITY(UPG_WALLET); + osSyncPrintf("ルピー数MAX = %d\n", maxRupees); + gSaveContext.rupees = maxRupees; gSaveContext.rupeeAccumulator = 0; } } else if (gSaveContext.rupees != 0) { diff --git a/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c b/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c index 4ba3520b19e..793151ed2fa 100644 --- a/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c +++ b/soh/src/overlays/actors/ovl_En_Dns/z_en_dns.c @@ -10,6 +10,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" +#include "soh/Enhancements/randomizer/BankCards.h" #define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) @@ -179,7 +180,7 @@ u32 EnDns_CanBuyDekuNuts(EnDns* this) { if ((CUR_CAPACITY(UPG_NUTS) != 0) && (AMMO(ITEM_NUT) >= CUR_CAPACITY(UPG_NUTS))) { return DNS_CANBUY_RESULT_CAPACITY_FULL; } - if (gSaveContext.rupees < this->dnsItemEntry->itemPrice) { + if (!Randomizer_BankCards_CanSpend(this->dnsItemEntry->itemPrice)) { return DNS_CANBUY_RESULT_NEED_RUPEES; } if (Item_CheckObtainability(ITEM_NUT) == ITEM_NONE) { @@ -192,7 +193,7 @@ u32 EnDns_CanBuyDekuSticks(EnDns* this) { if ((CUR_CAPACITY(UPG_STICKS) != 0) && (AMMO(ITEM_STICK) >= CUR_CAPACITY(UPG_STICKS))) { return DNS_CANBUY_RESULT_CAPACITY_FULL; } - if (gSaveContext.rupees < this->dnsItemEntry->itemPrice) { + if (!Randomizer_BankCards_CanSpend(this->dnsItemEntry->itemPrice)) { return DNS_CANBUY_RESULT_NEED_RUPEES; } if (Item_CheckObtainability(ITEM_STICK) == ITEM_NONE) { @@ -202,7 +203,7 @@ u32 EnDns_CanBuyDekuSticks(EnDns* this) { } u32 EnDns_CanBuyPrice(EnDns* this) { - if (gSaveContext.rupees < this->dnsItemEntry->itemPrice) { + if (!Randomizer_BankCards_CanSpend(this->dnsItemEntry->itemPrice)) { return DNS_CANBUY_RESULT_NEED_RUPEES; } return DNS_CANBUY_RESULT_SUCCESS; @@ -215,7 +216,7 @@ u32 EnDns_CanBuyDekuSeeds(EnDns* this) { if (AMMO(ITEM_SLINGSHOT) >= CUR_CAPACITY(UPG_BULLET_BAG)) { return DNS_CANBUY_RESULT_CAPACITY_FULL; } - if (gSaveContext.rupees < this->dnsItemEntry->itemPrice) { + if (!Randomizer_BankCards_CanSpend(this->dnsItemEntry->itemPrice)) { return DNS_CANBUY_RESULT_NEED_RUPEES; } if (Item_CheckObtainability(ITEM_SEEDS) == ITEM_NONE) { @@ -228,7 +229,7 @@ u32 EnDns_CanBuyDekuShield(EnDns* this) { if (CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SHIELD, EQUIP_INV_SHIELD_DEKU)) { return DNS_CANBUY_RESULT_CAPACITY_FULL; } - if (gSaveContext.rupees < this->dnsItemEntry->itemPrice) { + if (!Randomizer_BankCards_CanSpend(this->dnsItemEntry->itemPrice)) { return DNS_CANBUY_RESULT_NEED_RUPEES; } return DNS_CANBUY_RESULT_SUCCESS; @@ -241,7 +242,7 @@ u32 EnDns_CanBuyBombs(EnDns* this) { if (AMMO(ITEM_BOMB) >= CUR_CAPACITY(UPG_BOMB_BAG)) { return DNS_CANBUY_RESULT_CAPACITY_FULL; } - if (gSaveContext.rupees < this->dnsItemEntry->itemPrice) { + if (!Randomizer_BankCards_CanSpend(this->dnsItemEntry->itemPrice)) { return DNS_CANBUY_RESULT_NEED_RUPEES; } return DNS_CANBUY_RESULT_SUCCESS; @@ -254,7 +255,7 @@ u32 EnDns_CanBuyArrows(EnDns* this) { if (AMMO(ITEM_BOW) >= CUR_CAPACITY(UPG_QUIVER)) { return DNS_CANBUY_RESULT_CAPACITY_FULL; } - if (gSaveContext.rupees < this->dnsItemEntry->itemPrice) { + if (!Randomizer_BankCards_CanSpend(this->dnsItemEntry->itemPrice)) { return DNS_CANBUY_RESULT_NEED_RUPEES; } return DNS_CANBUY_RESULT_SUCCESS; @@ -264,7 +265,7 @@ u32 EnDns_CanBuyBottle(EnDns* this) { if (!Inventory_HasEmptyBottle()) { return DNS_CANBUY_RESULT_CAPACITY_FULL; } - if (gSaveContext.rupees < this->dnsItemEntry->itemPrice) { + if (!Randomizer_BankCards_CanSpend(this->dnsItemEntry->itemPrice)) { return DNS_CANBUY_RESULT_NEED_RUPEES; } return DNS_CANBUY_RESULT_SUCCESS; diff --git a/soh/src/overlays/actors/ovl_En_Ds/z_en_ds.c b/soh/src/overlays/actors/ovl_En_Ds/z_en_ds.c index 1c5566d54e4..73e4a374c23 100644 --- a/soh/src/overlays/actors/ovl_En_Ds/z_en_ds.c +++ b/soh/src/overlays/actors/ovl_En_Ds/z_en_ds.c @@ -9,6 +9,7 @@ #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/Enhancements/randomizer/BankCards.h" #define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) @@ -166,7 +167,7 @@ void EnDs_OfferOddPotion(EnDs* this, PlayState* play) { } s32 EnDs_CheckRupeesAndBottle() { - if (GameInteractor_Should(VB_GRANNY_SAY_INSUFFICIENT_RUPEES, gSaveContext.rupees < 100, NULL)) { + if (GameInteractor_Should(VB_GRANNY_SAY_INSUFFICIENT_RUPEES, !Randomizer_BankCards_CanSpend(100), NULL)) { return 0; } else if (GameInteractor_Should(VB_NEED_BOTTLE_FOR_GRANNYS_ITEM, Inventory_HasEmptyBottle() == 0)) { return 1; diff --git a/soh/src/overlays/actors/ovl_En_GirlA/z_en_girla.c b/soh/src/overlays/actors/ovl_En_GirlA/z_en_girla.c index a8924cf11b1..70345c9470f 100644 --- a/soh/src/overlays/actors/ovl_En_GirlA/z_en_girla.c +++ b/soh/src/overlays/actors/ovl_En_GirlA/z_en_girla.c @@ -9,6 +9,7 @@ #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" #include "soh/OTRGlobals.h" +#include "soh/Enhancements/randomizer/BankCards.h" #include #define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY | ACTOR_FLAG_UPDATE_CULLING_DISABLED) @@ -544,7 +545,7 @@ s32 EnGirlA_CanBuy_Arrows(PlayState* play, EnGirlA* this) { if (AMMO(ITEM_BOW) >= CUR_CAPACITY(UPG_QUIVER)) { return CANBUY_RESULT_CANT_GET_NOW; } - if (gSaveContext.rupees < this->basePrice) { + if (!Randomizer_BankCards_CanSpend(this->basePrice)) { return CANBUY_RESULT_NEED_RUPEES; } return CANBUY_RESULT_SUCCESS; @@ -557,7 +558,7 @@ s32 EnGirlA_CanBuy_Bombs(PlayState* play, EnGirlA* this) { if (AMMO(ITEM_BOMB) >= CUR_CAPACITY(UPG_BOMB_BAG)) { return CANBUY_RESULT_CANT_GET_NOW; } - if (gSaveContext.rupees < this->basePrice) { + if (!Randomizer_BankCards_CanSpend(this->basePrice)) { return CANBUY_RESULT_NEED_RUPEES; } return CANBUY_RESULT_SUCCESS; @@ -571,7 +572,7 @@ s32 EnGirlA_CanBuy_DekuNuts(PlayState* play, EnGirlA* this) { if ((CUR_CAPACITY(UPG_NUTS) != 0) && (AMMO(ITEM_NUT) >= CUR_CAPACITY(UPG_NUTS))) { return CANBUY_RESULT_CANT_GET_NOW; } - if (gSaveContext.rupees < this->basePrice) { + if (!Randomizer_BankCards_CanSpend(this->basePrice)) { return CANBUY_RESULT_NEED_RUPEES; } if ((Item_CheckObtainability(ITEM_NUT) == ITEM_NONE) && !CVarGetInteger(CVAR_ENHANCEMENT("FastDrops"), 0)) { @@ -588,7 +589,7 @@ s32 EnGirlA_CanBuy_DekuSticks(PlayState* play, EnGirlA* this) { if ((CUR_CAPACITY(UPG_STICKS) != 0) && (AMMO(ITEM_STICK) >= CUR_CAPACITY(UPG_STICKS))) { return CANBUY_RESULT_CANT_GET_NOW; } - if (gSaveContext.rupees < this->basePrice) { + if (!Randomizer_BankCards_CanSpend(this->basePrice)) { return CANBUY_RESULT_NEED_RUPEES; } if ((Item_CheckObtainability(ITEM_STICK) == ITEM_NONE) && !CVarGetInteger(CVAR_ENHANCEMENT("FastDrops"), 0)) { @@ -601,7 +602,7 @@ s32 EnGirlA_CanBuy_Fish(PlayState* play, EnGirlA* this) { if (!Inventory_HasEmptyBottle()) { return CANBUY_RESULT_NEED_BOTTLE; } - if (gSaveContext.rupees < this->basePrice) { + if (!Randomizer_BankCards_CanSpend(this->basePrice)) { return CANBUY_RESULT_NEED_RUPEES; } if (Item_CheckObtainability(ITEM_FISH) == ITEM_NONE) { @@ -614,7 +615,7 @@ s32 EnGirlA_CanBuy_RedPotion(PlayState* play, EnGirlA* this) { if (!Inventory_HasEmptyBottle()) { return CANBUY_RESULT_NEED_BOTTLE; } - if (gSaveContext.rupees < this->basePrice) { + if (!Randomizer_BankCards_CanSpend(this->basePrice)) { return CANBUY_RESULT_NEED_RUPEES; } if (Item_CheckObtainability(ITEM_POTION_RED) == ITEM_NONE) { @@ -627,7 +628,7 @@ s32 EnGirlA_CanBuy_GreenPotion(PlayState* play, EnGirlA* this) { if (!Inventory_HasEmptyBottle()) { return CANBUY_RESULT_NEED_BOTTLE; } - if (gSaveContext.rupees < this->basePrice) { + if (!Randomizer_BankCards_CanSpend(this->basePrice)) { return CANBUY_RESULT_NEED_RUPEES; } if (Item_CheckObtainability(ITEM_POTION_GREEN) == ITEM_NONE) { @@ -640,7 +641,7 @@ s32 EnGirlA_CanBuy_BluePotion(PlayState* play, EnGirlA* this) { if (!Inventory_HasEmptyBottle()) { return CANBUY_RESULT_NEED_BOTTLE; } - if (gSaveContext.rupees < this->basePrice) { + if (!Randomizer_BankCards_CanSpend(this->basePrice)) { return CANBUY_RESULT_NEED_RUPEES; } if (Item_CheckObtainability(ITEM_POTION_BLUE) == ITEM_NONE) { @@ -654,7 +655,7 @@ s32 EnGirlA_CanBuy_Longsword(PlayState* play, EnGirlA* this) { !CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SWORD, EQUIP_INV_SWORD_BROKENGIANTKNIFE)) { return CANBUY_RESULT_CANT_GET_NOW; } - if (gSaveContext.rupees < this->basePrice) { + if (!Randomizer_BankCards_CanSpend(this->basePrice)) { return CANBUY_RESULT_NEED_RUPEES; } if (Item_CheckObtainability(ITEM_SWORD_BGS) == ITEM_NONE) { @@ -667,7 +668,7 @@ s32 EnGirlA_CanBuy_HylianShield(PlayState* play, EnGirlA* this) { if (CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SHIELD, EQUIP_INV_SHIELD_HYLIAN)) { return CANBUY_RESULT_CANT_GET_NOW; } - if (gSaveContext.rupees < this->basePrice) { + if (!Randomizer_BankCards_CanSpend(this->basePrice)) { return CANBUY_RESULT_NEED_RUPEES; } if (Item_CheckObtainability(ITEM_SHIELD_HYLIAN) == ITEM_NONE) { @@ -680,7 +681,7 @@ s32 EnGirlA_CanBuy_DekuShield(PlayState* play, EnGirlA* this) { if (CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_SHIELD, EQUIP_INV_SHIELD_DEKU)) { return CANBUY_RESULT_CANT_GET_NOW; } - if (gSaveContext.rupees < this->basePrice) { + if (!Randomizer_BankCards_CanSpend(this->basePrice)) { return CANBUY_RESULT_NEED_RUPEES; } if (Item_CheckObtainability(ITEM_SHIELD_DEKU) == ITEM_NONE) { @@ -697,7 +698,7 @@ s32 EnGirlA_CanBuy_GoronTunic(PlayState* play, EnGirlA* this) { if (CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_TUNIC, EQUIP_INV_TUNIC_GORON)) { return CANBUY_RESULT_CANT_GET_NOW; } - if (gSaveContext.rupees < this->basePrice) { + if (!Randomizer_BankCards_CanSpend(this->basePrice)) { return CANBUY_RESULT_NEED_RUPEES; } if (Item_CheckObtainability(ITEM_TUNIC_GORON) == ITEM_NONE) { @@ -714,7 +715,7 @@ s32 EnGirlA_CanBuy_ZoraTunic(PlayState* play, EnGirlA* this) { if (CHECK_OWNED_EQUIP_ALT(EQUIP_TYPE_TUNIC, EQUIP_INV_TUNIC_ZORA)) { return CANBUY_RESULT_CANT_GET_NOW; } - if (gSaveContext.rupees < this->basePrice) { + if (!Randomizer_BankCards_CanSpend(this->basePrice)) { return CANBUY_RESULT_NEED_RUPEES; } if (Item_CheckObtainability(ITEM_TUNIC_ZORA) == ITEM_NONE) { @@ -727,14 +728,14 @@ s32 EnGirlA_CanBuy_Health(PlayState* play, EnGirlA* this) { if (gSaveContext.healthCapacity == gSaveContext.health) { return CANBUY_RESULT_CANT_GET_NOW; } - if (gSaveContext.rupees < this->basePrice) { + if (!Randomizer_BankCards_CanSpend(this->basePrice)) { return CANBUY_RESULT_NEED_RUPEES; } return CANBUY_RESULT_SUCCESS; } s32 EnGirlA_CanBuy_MilkBottle(PlayState* play, EnGirlA* this) { - if (gSaveContext.rupees < this->basePrice) { + if (!Randomizer_BankCards_CanSpend(this->basePrice)) { return CANBUY_RESULT_NEED_RUPEES; } if (Item_CheckObtainability(ITEM_MILK_BOTTLE) == ITEM_NONE) { @@ -744,7 +745,7 @@ s32 EnGirlA_CanBuy_MilkBottle(PlayState* play, EnGirlA* this) { } s32 EnGirlA_CanBuy_WeirdEgg(PlayState* play, EnGirlA* this) { - if (gSaveContext.rupees < this->basePrice) { + if (!Randomizer_BankCards_CanSpend(this->basePrice)) { return CANBUY_RESULT_NEED_RUPEES; } if (Item_CheckObtainability(ITEM_LETTER_ZELDA) == ITEM_NONE) { @@ -770,7 +771,7 @@ s32 EnGirlA_CanBuy_Bombchus(PlayState* play, EnGirlA* this) { if (AMMO(ITEM_BOMBCHU) >= 50) { return CANBUY_RESULT_CANT_GET_NOW; } - if (gSaveContext.rupees < this->basePrice) { + if (!Randomizer_BankCards_CanSpend(this->basePrice)) { return CANBUY_RESULT_NEED_RUPEES; } if (Item_CheckObtainability(ITEM_BOMBCHU) == ITEM_NONE) { @@ -783,7 +784,7 @@ s32 EnGirlA_CanBuy_DekuSeeds(PlayState* play, EnGirlA* this) { if (AMMO(ITEM_SLINGSHOT) >= CUR_CAPACITY(UPG_BULLET_BAG)) { return CANBUY_RESULT_CANT_GET_NOW; } - if (gSaveContext.rupees < this->basePrice) { + if (!Randomizer_BankCards_CanSpend(this->basePrice)) { return CANBUY_RESULT_NEED_RUPEES; } if ((Item_CheckObtainability(ITEM_SEEDS) == ITEM_NONE) && !CVarGetInteger(CVAR_ENHANCEMENT("FastDrops"), 0)) { @@ -800,7 +801,7 @@ s32 EnGirlA_CanBuy_BlueFire(PlayState* play, EnGirlA* this) { if (!Inventory_HasEmptyBottle()) { return CANBUY_RESULT_NEED_BOTTLE; } - if (gSaveContext.rupees < this->basePrice) { + if (!Randomizer_BankCards_CanSpend(this->basePrice)) { return CANBUY_RESULT_NEED_RUPEES; } if (Item_CheckObtainability(ITEM_BLUE_FIRE) == ITEM_NONE) { @@ -813,7 +814,7 @@ s32 EnGirlA_CanBuy_Bugs(PlayState* play, EnGirlA* this) { if (!Inventory_HasEmptyBottle()) { return CANBUY_RESULT_NEED_BOTTLE; } - if (gSaveContext.rupees < this->basePrice) { + if (!Randomizer_BankCards_CanSpend(this->basePrice)) { return CANBUY_RESULT_NEED_RUPEES; } if (Item_CheckObtainability(ITEM_BUG) == ITEM_NONE) { @@ -826,7 +827,7 @@ s32 EnGirlA_CanBuy_Poe(PlayState* play, EnGirlA* this) { if (!Inventory_HasEmptyBottle()) { return CANBUY_RESULT_NEED_BOTTLE; } - if (gSaveContext.rupees < this->basePrice) { + if (!Randomizer_BankCards_CanSpend(this->basePrice)) { return CANBUY_RESULT_NEED_RUPEES; } if (Item_CheckObtainability(ITEM_POE) == ITEM_NONE) { @@ -839,7 +840,7 @@ s32 EnGirlA_CanBuy_Fairy(PlayState* play, EnGirlA* this) { if (!Inventory_HasEmptyBottle()) { return CANBUY_RESULT_NEED_BOTTLE; } - if (gSaveContext.rupees < this->basePrice) { + if (!Randomizer_BankCards_CanSpend(this->basePrice)) { return CANBUY_RESULT_NEED_RUPEES; } if (Item_CheckObtainability(ITEM_FAIRY) == ITEM_NONE) { @@ -868,7 +869,7 @@ s32 EnGirlA_CanBuy_Randomizer(PlayState* play, EnGirlA* this) { return CANBUY_RESULT_CANT_GET_NOW; } - if (gSaveContext.rupees < shopItemIdentity.itemPrice) { + if (!Randomizer_BankCards_CanSpend(shopItemIdentity.itemPrice)) { return CANBUY_RESULT_NEED_RUPEES; } diff --git a/soh/src/overlays/actors/ovl_En_Gm/z_en_gm.c b/soh/src/overlays/actors/ovl_En_Gm/z_en_gm.c index 35f1cb9675c..4a9bfda95da 100644 --- a/soh/src/overlays/actors/ovl_En_Gm/z_en_gm.c +++ b/soh/src/overlays/actors/ovl_En_Gm/z_en_gm.c @@ -9,6 +9,7 @@ #include "objects/object_gm/object_gm.h" #include "vt.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/Enhancements/randomizer/BankCards.h" #include #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" @@ -248,7 +249,8 @@ void EnGm_ProcessChoiceIndex(EnGm* this, PlayState* play) { if (Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(play)) { switch (play->msgCtx.choiceIndex) { case 0: // yes - if (GameInteractor_Should(VB_CHECK_RANDO_PRICE_OF_MEDIGORON, gSaveContext.rupees < 200, this)) { + if (GameInteractor_Should(VB_CHECK_RANDO_PRICE_OF_MEDIGORON, + !Randomizer_BankCards_CanSpend(200), this)) { Message_ContinueTextbox(play, 0xC8); this->actionFunc = func_80A3DD7C; } else { diff --git a/soh/src/overlays/actors/ovl_En_Js/z_en_js.c b/soh/src/overlays/actors/ovl_En_Js/z_en_js.c index 8abb0b5d10f..f56850521ab 100644 --- a/soh/src/overlays/actors/ovl_En_Js/z_en_js.c +++ b/soh/src/overlays/actors/ovl_En_Js/z_en_js.c @@ -9,6 +9,7 @@ #include "soh/OTRGlobals.h" #include "soh/ResourceManagerHelpers.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/Enhancements/randomizer/BankCards.h" #define FLAGS (ACTOR_FLAG_ATTENTION_ENABLED | ACTOR_FLAG_FRIENDLY) @@ -145,7 +146,8 @@ void func_80A891C4(EnJs* this, PlayState* play) { if (Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE && Message_ShouldAdvance(play)) { switch (play->msgCtx.choiceIndex) { case 0: // yes - if (GameInteractor_Should(VB_CHECK_RANDO_PRICE_OF_CARPET_SALESMAN, gSaveContext.rupees < 200, this)) { + if (GameInteractor_Should(VB_CHECK_RANDO_PRICE_OF_CARPET_SALESMAN, + !Randomizer_BankCards_CanSpend(200), this)) { Message_ContinueTextbox(play, 0x6075); func_80A89008(this); } else { diff --git a/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c b/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c index d78daafe457..ffd8ff0756a 100644 --- a/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c +++ b/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c @@ -16,6 +16,7 @@ #include "soh/Enhancements/randomizer/randomizer_entrance.h" #include "soh/Enhancements/cosmetics/cosmeticsTypes.h" #include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/Enhancements/randomizer/BankCards.h" #include #include "soh/OTRGlobals.h" @@ -888,7 +889,7 @@ u8 EnOssan_CursorLeft(EnOssan* this, u8 cursorIndex, u8 shelfSlotMax) { void EnOssan_TryPaybackMask(EnOssan* this, PlayState* play) { s16 price = sMaskPaymentPrice[this->happyMaskShopState]; - if (gSaveContext.rupees < price) { + if (!Randomizer_BankCards_CanSpend(price)) { Message_ContinueTextbox(play, 0x70A8); this->happyMaskShopkeeperEyeIdx = 1; this->happyMaskShopState = OSSAN_HAPPY_STATE_ANGRY;