From 668fd0ed6dc3d2db9812d0b301e688fc67380cde Mon Sep 17 00:00:00 2001 From: Etienne Mitchell-Bouchard Date: Thu, 21 May 2026 01:20:09 -0400 Subject: [PATCH 1/5] Added uncappedWallets setting in QOL, which allows the rupee count to go to 9 999, discarding wallet limits. --- include/dusk/settings.h | 1 + src/d/d_meter2_draw.cpp | 10 ++++++++++ src/d/d_save.cpp | 4 ++++ src/dusk/settings.cpp | 2 ++ src/dusk/ui/settings.cpp | 2 ++ 5 files changed, 19 insertions(+) diff --git a/include/dusk/settings.h b/include/dusk/settings.h index cc8af3556a..1ba8b30da3 100644 --- a/include/dusk/settings.h +++ b/include/dusk/settings.h @@ -131,6 +131,7 @@ struct UserSettings { ConfigVar enableQuickTransform; ConfigVar hideTvSettingsScreen; ConfigVar biggerWallets; + ConfigVar uncappedWallets; ConfigVar noReturnRupees; ConfigVar disableRupeeCutscenes; ConfigVar noSwordRecoil; diff --git a/src/d/d_meter2_draw.cpp b/src/d/d_meter2_draw.cpp index 8e824f583b..b5dcef7d0d 100644 --- a/src/d/d_meter2_draw.cpp +++ b/src/d/d_meter2_draw.cpp @@ -1979,6 +1979,16 @@ void dMeter2Draw_c::setAlphaLightDropAnimeMax() { } void dMeter2Draw_c::drawRupee(s16 i_rupeeNum) { + /* + The game crashes if i_rupeeNum > 9 999 since the UI wasn't made to display five digits. + Possible workaround is to cap the UI but keep the rupee count intact by campling. + Doing so would allow the rupee count to go to 65 535, the u16 limit. + Working example: + + if (i_rupeeNum > 9999) { + i_rupeeNum = 9999; + } + */ mpRupeeTexture[3][0]->hide(); mpRupeeTexture[3][1]->hide(); diff --git a/src/d/d_save.cpp b/src/d/d_save.cpp index fc1cbc4efe..ba5f01fcdb 100644 --- a/src/d/d_save.cpp +++ b/src/d/d_save.cpp @@ -119,6 +119,10 @@ u8 dSv_player_status_a_c::getMixItemIndex(int i_no) const { u16 dSv_player_status_a_c::getRupeeMax() const { if (mWalletSize < 3) { // if you make this a default, it wont match. Compiler, pls. + #if TARGET_PC + if (dusk::getSettings().game.uncappedWallets) + return 9'999; + #endif switch (mWalletSize) { case WALLET: #if TARGET_PC diff --git a/src/dusk/settings.cpp b/src/dusk/settings.cpp index 2ecda7df5c..c2c37c91cf 100644 --- a/src/dusk/settings.cpp +++ b/src/dusk/settings.cpp @@ -31,6 +31,7 @@ UserSettings g_userSettings = { .enableQuickTransform {"game.enableQuickTransform", false}, .hideTvSettingsScreen {"game.hideTvSettingsScreen", true}, .biggerWallets {"game.biggerWallets", false}, + .uncappedWallets {"game.uncappedWallets", false}, .noReturnRupees {"game.noReturnRupees", false}, .disableRupeeCutscenes {"game.disableRupeeCutscenes", false}, .noSwordRecoil {"game.noSwordRecoil", false}, @@ -199,6 +200,7 @@ void registerSettings() { Register(g_userSettings.game.enableQuickTransform); Register(g_userSettings.game.hideTvSettingsScreen); Register(g_userSettings.game.biggerWallets); + Register(g_userSettings.game.uncappedWallets); Register(g_userSettings.game.noReturnRupees); Register(g_userSettings.game.disableRupeeCutscenes); Register(g_userSettings.game.noSwordRecoil); diff --git a/src/dusk/ui/settings.cpp b/src/dusk/ui/settings.cpp index 6518ede336..bae32f8a74 100644 --- a/src/dusk/ui/settings.cpp +++ b/src/dusk/ui/settings.cpp @@ -1146,6 +1146,8 @@ SettingsWindow::SettingsWindow(bool prelaunch) : mPrelaunch(prelaunch) { leftPane.add_section("Quality of Life"); addOption("Bigger Wallets", getSettings().game.biggerWallets, "Wallet sizes are like in the HD version. (500, 1000, 2000)"); + addOption("Uncapped Wallets", getSettings().game.uncappedWallets, + "Wallet sizes no longer matter and the max rupee count is 9 999."); addOption("Disable Rupee Cutscenes", getSettings().game.disableRupeeCutscenes, "Rupees will not play cutscenes after you have collected them the first time."); addOption("Faster Climbing", getSettings().game.fastClimbing, From 772280d5ef9dfa830afd14659d346a908c44d740 Mon Sep 17 00:00:00 2001 From: Etienne Mitchell-Bouchard Date: Thu, 21 May 2026 11:32:04 -0400 Subject: [PATCH 2/5] Combined both wallet settings into a Wallet Sizes setting, which gives more options for wallet sizes like HD, Large and Uncapped. --- include/dusk/settings.h | 3 +-- src/d/d_save.cpp | 32 +++++++++++++++++++++---- src/dusk/settings.cpp | 8 +++---- src/dusk/ui/preset.cpp | 2 +- src/dusk/ui/settings.cpp | 51 ++++++++++++++++++++++++++++++++++++---- 5 files changed, 80 insertions(+), 16 deletions(-) diff --git a/include/dusk/settings.h b/include/dusk/settings.h index 1ba8b30da3..f1dcba5636 100644 --- a/include/dusk/settings.h +++ b/include/dusk/settings.h @@ -130,8 +130,7 @@ struct UserSettings { // QoL ConfigVar enableQuickTransform; ConfigVar hideTvSettingsScreen; - ConfigVar biggerWallets; - ConfigVar uncappedWallets; + ConfigVar walletSizes; ConfigVar noReturnRupees; ConfigVar disableRupeeCutscenes; ConfigVar noSwordRecoil; diff --git a/src/d/d_save.cpp b/src/d/d_save.cpp index ba5f01fcdb..621450477f 100644 --- a/src/d/d_save.cpp +++ b/src/d/d_save.cpp @@ -120,25 +120,47 @@ u8 dSv_player_status_a_c::getMixItemIndex(int i_no) const { u16 dSv_player_status_a_c::getRupeeMax() const { if (mWalletSize < 3) { // if you make this a default, it wont match. Compiler, pls. #if TARGET_PC - if (dusk::getSettings().game.uncappedWallets) - return 9'999; + int walletSizeSetting = dusk::getSettings().game.walletSizes; + if (walletSizeSetting == 3) // Uncapped + return 9999; #endif switch (mWalletSize) { case WALLET: #if TARGET_PC - return dusk::getSettings().game.biggerWallets ? 500 : 300; + switch (walletSizeSetting) { + case 0: // Default + return 300; + case 1: // HD + return 500; + case 2: // Large + return 1000; + } #else return 300; #endif case BIG_WALLET: #if TARGET_PC - return dusk::getSettings().game.biggerWallets ? 1000 : 600; + switch (walletSizeSetting) { + case 0: // Default + return 600; + case 1: // HD + return 1000; + case 2: // Large + return 5000; + } #else return 600; #endif case GIANT_WALLET: #if TARGET_PC - return dusk::getSettings().game.biggerWallets ? 2000 : 1000; + switch (walletSizeSetting) { + case 0: // Default + return 1000; + case 1: // HD + return 5000; + case 2: // Large + return 9999; + } #else return 1000; #endif diff --git a/src/dusk/settings.cpp b/src/dusk/settings.cpp index c2c37c91cf..ba30cf1ef7 100644 --- a/src/dusk/settings.cpp +++ b/src/dusk/settings.cpp @@ -30,8 +30,7 @@ UserSettings g_userSettings = { // Quality of Life .enableQuickTransform {"game.enableQuickTransform", false}, .hideTvSettingsScreen {"game.hideTvSettingsScreen", true}, - .biggerWallets {"game.biggerWallets", false}, - .uncappedWallets {"game.uncappedWallets", false}, + .walletSizes{"game.walletSizes", 0}, .noReturnRupees {"game.noReturnRupees", false}, .disableRupeeCutscenes {"game.disableRupeeCutscenes", false}, .noSwordRecoil {"game.noSwordRecoil", false}, @@ -199,8 +198,9 @@ void registerSettings() { Register(g_userSettings.game.language); Register(g_userSettings.game.enableQuickTransform); Register(g_userSettings.game.hideTvSettingsScreen); - Register(g_userSettings.game.biggerWallets); - Register(g_userSettings.game.uncappedWallets); + //Register(g_userSettings.game.biggerWallets); + //Register(g_userSettings.game.uncappedWallets); + Register(g_userSettings.game.walletSizes); Register(g_userSettings.game.noReturnRupees); Register(g_userSettings.game.disableRupeeCutscenes); Register(g_userSettings.game.noSwordRecoil); diff --git a/src/dusk/ui/preset.cpp b/src/dusk/ui/preset.cpp index de2dac84c3..e7d9932877 100644 --- a/src/dusk/ui/preset.cpp +++ b/src/dusk/ui/preset.cpp @@ -32,7 +32,7 @@ void applyPresetDusk() { s.game.fastClimbing.setValue(true); s.game.noMissClimbing.setValue(true); s.game.fastTears.setValue(true); - s.game.biggerWallets.setValue(true); + s.game.walletSizes.setValue(1); // HD s.game.invertCameraXAxis.setValue(true); s.game.invertFirstPersonYAxis.setValue(true); s.game.no2ndFishForCat.setValue(true); diff --git a/src/dusk/ui/settings.cpp b/src/dusk/ui/settings.cpp index bae32f8a74..f00fa88d20 100644 --- a/src/dusk/ui/settings.cpp +++ b/src/dusk/ui/settings.cpp @@ -76,6 +76,13 @@ constexpr std::array kMenuScalingModeLabels = { "Dusklight", }; +constexpr std::array kWalletSizes = { + "Default", + "HD", + "Large", + "Uncapped" +}; + bool try_parse_backend(std::string_view backend, AuroraBackend& outBackend) { if (backend == "auto") { outBackend = BACKEND_AUTO; @@ -1144,10 +1151,46 @@ SettingsWindow::SettingsWindow(bool prelaunch) : mPrelaunch(prelaunch) { "Hearts will never drop from enemies, pots, and various other places."); leftPane.add_section("Quality of Life"); - addOption("Bigger Wallets", getSettings().game.biggerWallets, - "Wallet sizes are like in the HD version. (500, 1000, 2000)"); - addOption("Uncapped Wallets", getSettings().game.uncappedWallets, - "Wallet sizes no longer matter and the max rupee count is 9 999."); + leftPane.register_control( + leftPane.add_select_button({ + .key = "Wallet Sizes", + .getValue = + [] { + const int idx = getSettings().game.walletSizes.getValue(); + return Rml::String{kWalletSizes[idx]}; + }, + .isModified = + [] { + const auto& walletSizes = getSettings().game.walletSizes; + return walletSizes.getValue() != walletSizes.getDefaultValue(); + }, + }), + rightPane, [](Pane& pane) { + for (int i = 0; i < static_cast(kWalletSizes.size()); ++i) { + pane.add_button( + { + .text = kWalletSizes[i], + .isSelected = + [i] { return getSettings().game.walletSizes.getValue() == i; + }, + }) + .on_pressed([i] { + mDoAud_seStartMenu(kSoundItemChange); + getSettings().game.walletSizes.setValue(i); + config::Save(); + }); + } + pane.add_rml(R"( +
Modifies the maximum number of rupees the wallets can hold. +
    +
  • • Default: 300, 600, 1 000
  • +
  • • HD: 500, 1 000, 2 000
  • +
  • • Large: 1 000, 5 000, 9 999
  • +
  • • Uncapped: 9 999
  • +
+ )"); + }); + addOption("Disable Rupee Cutscenes", getSettings().game.disableRupeeCutscenes, "Rupees will not play cutscenes after you have collected them the first time."); addOption("Faster Climbing", getSettings().game.fastClimbing, From cee04ce93f659f6ea1048c4e5ee16c626f55e137 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Mitchell-Bouchard?= Date: Thu, 21 May 2026 12:06:21 -0400 Subject: [PATCH 3/5] Removed commented-out registers for obsolete settings Removed commented-out registration for bigger and uncapped wallets. --- src/dusk/settings.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/dusk/settings.cpp b/src/dusk/settings.cpp index 00c1735ada..5fe2aca112 100644 --- a/src/dusk/settings.cpp +++ b/src/dusk/settings.cpp @@ -199,8 +199,6 @@ void registerSettings() { Register(g_userSettings.game.language); Register(g_userSettings.game.enableQuickTransform); Register(g_userSettings.game.hideTvSettingsScreen); - //Register(g_userSettings.game.biggerWallets); - //Register(g_userSettings.game.uncappedWallets); Register(g_userSettings.game.walletSizes); Register(g_userSettings.game.noReturnRupees); Register(g_userSettings.game.disableRupeeCutscenes); From afece48810439ae81cac8b458b71a028054e2bca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Mitchell-Bouchard?= Date: Thu, 21 May 2026 13:37:05 -0400 Subject: [PATCH 4/5] Fixed typo in rupee count display comment Clarified comment about clamping the rupee count display. --- src/d/d_meter2_draw.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d/d_meter2_draw.cpp b/src/d/d_meter2_draw.cpp index b5dcef7d0d..5470fad8c2 100644 --- a/src/d/d_meter2_draw.cpp +++ b/src/d/d_meter2_draw.cpp @@ -1981,7 +1981,7 @@ void dMeter2Draw_c::setAlphaLightDropAnimeMax() { void dMeter2Draw_c::drawRupee(s16 i_rupeeNum) { /* The game crashes if i_rupeeNum > 9 999 since the UI wasn't made to display five digits. - Possible workaround is to cap the UI but keep the rupee count intact by campling. + Possible workaround is to clamp the rupee count shown by the UI but keep the true rupee count intact. Doing so would allow the rupee count to go to 65 535, the u16 limit. Working example: From dde514965e94a623e216d3e5a56b35b6aea3e214 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Mitchell-Bouchard?= Date: Thu, 21 May 2026 13:42:32 -0400 Subject: [PATCH 5/5] Fixed return value for HD big wallet --- src/d/d_save.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d/d_save.cpp b/src/d/d_save.cpp index 621450477f..0383ae57b4 100644 --- a/src/d/d_save.cpp +++ b/src/d/d_save.cpp @@ -157,7 +157,7 @@ u16 dSv_player_status_a_c::getRupeeMax() const { case 0: // Default return 1000; case 1: // HD - return 5000; + return 2000; case 2: // Large return 9999; }