Fix happy mask salesman to check flags instead of inventory for SOLD OUT (#6355)

Fixes getting locked out of mask quest with mask select
This commit is contained in:
Philip Dubé
2026-03-17 17:41:04 +00:00
committed by GitHub
parent c906c71f71
commit 4e3b8d0b13
3 changed files with 33 additions and 1 deletions

View File

@@ -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") });

View File

@@ -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

View File

@@ -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