diff --git a/mm/2s2h/BenGui/BenMenu.cpp b/mm/2s2h/BenGui/BenMenu.cpp index 04d14a58cd..7b37bba081 100644 --- a/mm/2s2h/BenGui/BenMenu.cpp +++ b/mm/2s2h/BenGui/BenMenu.cpp @@ -160,6 +160,12 @@ static const std::unordered_map damageMultiplierOptions = { 0, "1x" }, { 1, "2x" }, { 2, "4x" }, { 3, "8x" }, { 4, "16x" }, { 10, "1 Hit KO" }, }; +static const std::vector disableMagicDropsOptions = { + "Off", + "Recovery Heart", + "Green Rupee", +}; + namespace BenGui { extern std::shared_ptr mBenMenu; void FreeLookPitchMinMax() { @@ -1112,6 +1118,12 @@ void BenMenu::AddEnhancements() { AddWidget(path, "Oceanside wallet any day", WIDGET_CVAR_CHECKBOX) .CVar("gEnhancements.Cycle.OceansideWalletAnyDay") .Options(CheckboxOptions().Tooltip("Allows the wallet reward to be collected on any day.")); + AddWidget(path, "Disable Magic Drops with Chateau Romani", WIDGET_CVAR_COMBOBOX) + .CVar("gEnhancements.Cycle.DisableMagicDropsWithChateau") + .Options(ComboboxOptions() + .Tooltip("When Chateau Romani is active, Magic Jar drops are replaced.") + .DefaultIndex(DisableMagicDropsOptions::DISABLE_MAGIC_DROPS_OFF) + .ComboVec(&disableMagicDropsOptions)); AddWidget(path, "Unstable", WIDGET_SEPARATOR_TEXT).Options(WidgetOptions().Color(Colors::Orange)); AddWidget(path, "Disable Save Delay", WIDGET_CVAR_CHECKBOX) .CVar("gEnhancements.Saving.DisableSaveDelay") diff --git a/mm/2s2h/Enhancements/Cycle/DisableMagicDropsWithChateau.cpp b/mm/2s2h/Enhancements/Cycle/DisableMagicDropsWithChateau.cpp new file mode 100644 index 0000000000..35928320c4 --- /dev/null +++ b/mm/2s2h/Enhancements/Cycle/DisableMagicDropsWithChateau.cpp @@ -0,0 +1,27 @@ +#include +#include "2s2h/GameInteractor/GameInteractor.h" +#include "2s2h/ShipInit.hpp" +#include "2s2h/Enhancements/Enhancements.h" + +#define CVAR_NAME "gEnhancements.Cycle.DisableMagicDropsWithChateau" +#define CVAR CVarGetInteger(CVAR_NAME, DISABLE_MAGIC_DROPS_OFF) + +void RegisterDisableMagicDropsWithChateau() { + COND_VB_SHOULD(VB_ITEM00_GET_DROP_ID, CVAR != DISABLE_MAGIC_DROPS_OFF, { + if (!CHECK_WEEKEVENTREG(WEEKEVENTREG_DRANK_CHATEAU_ROMANI)) { + return; + } + + s16* dropId = va_arg(args, s16*); + + if (*dropId == ITEM00_MAGIC_JAR_SMALL || *dropId == ITEM00_MAGIC_JAR_BIG) { + if (CVAR == DISABLE_MAGIC_DROPS_RECOVERY_HEART) { + *dropId = ITEM00_RECOVERY_HEART; + } else if (CVAR == DISABLE_MAGIC_DROPS_GREEN_RUPEE) { + *dropId = ITEM00_RUPEE_GREEN; + } + } + }); +} + +static RegisterShipInitFunc initFunc(RegisterDisableMagicDropsWithChateau, { CVAR_NAME }); diff --git a/mm/2s2h/Enhancements/Enhancements.h b/mm/2s2h/Enhancements/Enhancements.h index 13d8a58841..024d6c69bd 100644 --- a/mm/2s2h/Enhancements/Enhancements.h +++ b/mm/2s2h/Enhancements/Enhancements.h @@ -64,6 +64,12 @@ enum GoronRaceDifficultyOptions { GORON_RACE_DIFFICULTY_SKIP, }; +enum DisableMagicDropsOptions { + DISABLE_MAGIC_DROPS_OFF, + DISABLE_MAGIC_DROPS_RECOVERY_HEART, + DISABLE_MAGIC_DROPS_GREEN_RUPEE, +}; + // Old Entry Point void InitEnhancements(); diff --git a/mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h b/mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h index a4bbe1793a..7bdc2515fe 100644 --- a/mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h +++ b/mm/2s2h/GameInteractor/GameInteractor_VanillaBehavior.h @@ -1024,6 +1024,14 @@ typedef enum { // - `*EnFu` VB_HONEY_AND_DARLING_MINIGAME_FINISH, + // #### `result` + // ```c + // dropId + // ``` + // #### `args` + // - `s16*` (dropId) + VB_ITEM00_GET_DROP_ID, + // #### `result` // ```c // !gPlayerFormItemRestrictions[GET_PLAYER_FORM][itemId] diff --git a/mm/src/code/z_en_item00.c b/mm/src/code/z_en_item00.c index b027971d1d..63e1083172 100644 --- a/mm/src/code/z_en_item00.c +++ b/mm/src/code/z_en_item00.c @@ -897,6 +897,8 @@ void EnItem00_DrawHeartPiece(EnItem00* this, PlayState* play) { } s16 func_800A7650(s16 dropId) { + GameInteractor_Should(VB_ITEM00_GET_DROP_ID, true, &dropId); + if ((((dropId == ITEM00_BOMBS_A) || (dropId == ITEM00_BOMBS_0) || (dropId == ITEM00_BOMBS_B)) && (INV_CONTENT(ITEM_BOMB) == ITEM_NONE)) || (((dropId == ITEM00_ARROWS_10) || (dropId == ITEM00_ARROWS_30) || (dropId == ITEM00_ARROWS_40) ||