diff --git a/include/dusk/settings.h b/include/dusk/settings.h index 5fd53ce289..384ac498af 100644 --- a/include/dusk/settings.h +++ b/include/dusk/settings.h @@ -142,7 +142,7 @@ struct UserSettings { // QoL ConfigVar enableQuickTransform; ConfigVar hideTvSettingsScreen; - ConfigVar biggerWallets; + ConfigVar walletSizes; ConfigVar noReturnRupees; ConfigVar disableRupeeCutscenes; ConfigVar noSwordRecoil; diff --git a/src/d/d_meter2_draw.cpp b/src/d/d_meter2_draw.cpp index 3c342ea7d4..f0588f28c0 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 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: + + 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 af2a6db28a..e413e2e1bc 100644 --- a/src/d/d_save.cpp +++ b/src/d/d_save.cpp @@ -119,22 +119,48 @@ 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 + 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 2000; + case 2: // Large + return 9999; + } #else return 1000; #endif diff --git a/src/dusk/settings.cpp b/src/dusk/settings.cpp index 3f189f0359..6b200b0f58 100644 --- a/src/dusk/settings.cpp +++ b/src/dusk/settings.cpp @@ -30,7 +30,7 @@ UserSettings g_userSettings = { // Quality of Life .enableQuickTransform {"game.enableQuickTransform", false}, .hideTvSettingsScreen {"game.hideTvSettingsScreen", true}, - .biggerWallets {"game.biggerWallets", false}, + .walletSizes{"game.walletSizes", 0}, .noReturnRupees {"game.noReturnRupees", false}, .disableRupeeCutscenes {"game.disableRupeeCutscenes", false}, .noSwordRecoil {"game.noSwordRecoil", false}, @@ -213,7 +213,7 @@ 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.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 4d5950f1f4..0760f11e63 100644 --- a/src/dusk/ui/preset.cpp +++ b/src/dusk/ui/preset.cpp @@ -33,7 +33,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 826a87c144..64e8eb8f73 100644 --- a/src/dusk/ui/settings.cpp +++ b/src/dusk/ui/settings.cpp @@ -75,6 +75,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; @@ -1150,8 +1157,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)"); + 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,