diff --git a/soh/soh/Enhancements/MaskSelect.cpp b/soh/soh/Enhancements/MaskSelect.cpp new file mode 100644 index 000000000..2d5d2bbe3 --- /dev/null +++ b/soh/soh/Enhancements/MaskSelect.cpp @@ -0,0 +1,23 @@ +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +#include "functions.h" +#include "src/overlays/actors/ovl_En_Ossan/z_en_ossan.h" +} + +static void RegisterMaskSelectFixes() { + // Fix mask quest so replacing SOLD OUT with mask select doesn't break quest + COND_VB_SHOULD(VB_HAPPY_MASK_SHOP_CHECK_SOLD_OUT, CVarGetInteger(CVAR_ENHANCEMENT("MaskSelect"), 0), { + Actor* actor = va_arg(args, Actor*); + if (actor->params == OSSAN_TYPE_MASK && + (Flags_GetItemGetInf(ITEMGETINF_3B) && !Flags_GetEventChkInf(EVENTCHKINF_PAID_BACK_BUNNY_HOOD_FEE)) || + (Flags_GetItemGetInf(ITEMGETINF_3A) && !Flags_GetEventChkInf(EVENTCHKINF_PAID_BACK_SPOOKY_MASK_FEE)) || + (Flags_GetItemGetInf(ITEMGETINF_39) && !Flags_GetEventChkInf(EVENTCHKINF_PAID_BACK_SKULL_MASK_FEE)) || + (Flags_GetItemGetInf(ITEMGETINF_38) && !Flags_GetEventChkInf(EVENTCHKINF_PAID_BACK_KEATON_MASK_FEE))) { + *should = true; + } + }); +} + +static RegisterShipInitFunc initFunc(RegisterMaskSelectFixes, { CVAR_ENHANCEMENT("MaskSelect") }); diff --git a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h index 2a4b67901..a86996242 100644 --- a/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h +++ b/soh/soh/Enhancements/game-interactor/vanilla-behavior/GIVanillaBehavior.h @@ -302,6 +302,14 @@ typedef enum { // - `*EnGm` VB_CHECK_RANDO_PRICE_OF_MEDIGORON, + // #### `result` + // ```c + // INV_CONTENT(ITEM_TRADE_CHILD) == ITEM_SOLD_OUT + // ``` + // #### `args` + // - `*EnOssan` (Happy Mask Shopkeeper) + VB_HAPPY_MASK_SHOP_CHECK_SOLD_OUT, + // #### `result` // ```c // true 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 cbdfe2f00..f6077d2d0 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 @@ -2127,7 +2127,8 @@ u16 EnOssan_SetupHelloDialog(EnOssan* this) { this->happyMaskShopState = OSSAN_HAPPY_STATE_NONE; // mask shop messages if (this->actor.params == OSSAN_TYPE_MASK) { - if (INV_CONTENT(ITEM_TRADE_CHILD) == ITEM_SOLD_OUT) { + if (GameInteractor_Should(VB_HAPPY_MASK_SHOP_CHECK_SOLD_OUT, INV_CONTENT(ITEM_TRADE_CHILD) == ITEM_SOLD_OUT, + this)) { if (Flags_GetItemGetInf(ITEMGETINF_3B)) { if (!Flags_GetEventChkInf(EVENTCHKINF_PAID_BACK_BUNNY_HOOD_FEE)) { // Pay back Bunny Hood