Add event needed for dpad as mod, revert remaining changes in built-in patches for dpad

This commit is contained in:
Mr-Wiseguy 2025-04-23 02:03:16 -04:00
parent e970e85882
commit f2901d73bc

View file

@ -8,6 +8,7 @@
RECOMP_DECLARE_EVENT(recomp_before_first_person_aiming_update_event(PlayState* play, Player* this, bool in_free_look, RecompAimingOverideMode* recomp_aiming_override_mode)); RECOMP_DECLARE_EVENT(recomp_before_first_person_aiming_update_event(PlayState* play, Player* this, bool in_free_look, RecompAimingOverideMode* recomp_aiming_override_mode));
RECOMP_DECLARE_EVENT(recomp_after_first_person_aiming_update_event(PlayState* play, Player* this, bool in_free_look)); RECOMP_DECLARE_EVENT(recomp_after_first_person_aiming_update_event(PlayState* play, Player* this, bool in_free_look));
RECOMP_DECLARE_EVENT(recomp_set_extra_item_slot_statuses(PlayState* play, s32 enabled));
s32 func_80847190(PlayState* play, Player* this, s32 arg2); s32 func_80847190(PlayState* play, Player* this, s32 arg2);
s16 func_80832754(Player* this, s32 arg1); s16 func_80832754(Player* this, s32 arg1);
@ -296,13 +297,6 @@ RECOMP_PATCH void func_8083A98C(Actor* thisx, PlayState* play2) {
Camera_ChangeMode(Play_GetCamera(play, CAM_ID_MAIN), camMode); Camera_ChangeMode(Play_GetCamera(play, CAM_ID_MAIN), camMode);
} }
u32 sPlayerItemButtons[] = {
BTN_B,
BTN_CLEFT,
BTN_CDOWN,
BTN_CRIGHT,
};
bool no_bow_epona_fix = false; bool no_bow_epona_fix = false;
// @recomp_export void recomp_set_no_bow_epona_fix(bool new_val): Set whether to enable the fix for getting on Epona without a bow. // @recomp_export void recomp_set_no_bow_epona_fix(bool new_val): Set whether to enable the fix for getting on Epona without a bow.
@ -328,16 +322,7 @@ u16 func_801A5100(void);
#define AT_H_AND_D (play->sceneId == SCENE_BOWLING) #define AT_H_AND_D (play->sceneId == SCENE_BOWLING)
#define H_AND_D_FIX_ACTIVE (h_and_d_no_sword_fix && AT_H_AND_D) #define H_AND_D_FIX_ACTIVE (h_and_d_no_sword_fix && AT_H_AND_D)
// TODO: These can just be reverted back to the original code. // @recomp Patched to call event for extra item slot mods.
#define TOTAL_SLOT_COUNT 3
#define BUTTON_STATUS(btn) gSaveContext.buttonStatus[btn]
// Converts an ex slot index into the actual slot index.
u8 to_slot_index(u32 ex_slot) {
return ex_slot + EQUIP_SLOT_C_LEFT;
}
RECOMP_PATCH void Interface_UpdateButtonsPart1(PlayState* play) { RECOMP_PATCH void Interface_UpdateButtonsPart1(PlayState* play) {
InterfaceContext* interfaceCtx = &play->interfaceCtx; InterfaceContext* interfaceCtx = &play->interfaceCtx;
Player* player = GET_PLAYER(play); Player* player = GET_PLAYER(play);
@ -361,17 +346,19 @@ RECOMP_PATCH void Interface_UpdateButtonsPart1(PlayState* play) {
if ((player->transformation == PLAYER_FORM_DEKU) && CHECK_WEEKEVENTREG(WEEKEVENTREG_08_01)) { if ((player->transformation == PLAYER_FORM_DEKU) && CHECK_WEEKEVENTREG(WEEKEVENTREG_08_01)) {
gSaveContext.hudVisibilityForceButtonAlphasByStatus = true; gSaveContext.hudVisibilityForceButtonAlphasByStatus = true;
if (play->sceneId == SCENE_BOWLING) { if (play->sceneId == SCENE_BOWLING) {
if (BUTTON_STATUS(EQUIP_SLOT_B) == BTN_DISABLED) { if (gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_DISABLED) {
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
BUTTON_STATUS(EQUIP_SLOT_C_LEFT) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
BUTTON_STATUS(EQUIP_SLOT_C_DOWN) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
BUTTON_STATUS(EQUIP_SLOT_C_RIGHT) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
recomp_set_extra_item_slot_statuses(play, BTN_DISABLED);
} }
} else if (BUTTON_STATUS(EQUIP_SLOT_B) == BTN_DISABLED) { } else if (gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_DISABLED) {
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
BUTTON_STATUS(EQUIP_SLOT_C_LEFT) = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_ENABLED;
BUTTON_STATUS(EQUIP_SLOT_C_DOWN) = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_ENABLED;
BUTTON_STATUS(EQUIP_SLOT_C_RIGHT) = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_ENABLED;
recomp_set_extra_item_slot_statuses(play, BTN_ENABLED);
} }
Interface_SetHudVisibility(HUD_VISIBILITY_B_MAGIC); Interface_SetHudVisibility(HUD_VISIBILITY_B_MAGIC);
@ -380,10 +367,11 @@ RECOMP_PATCH void Interface_UpdateButtonsPart1(PlayState* play) {
(BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) != ITEM_BOMB) && (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) != ITEM_BOMB) &&
(BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) != ITEM_BOMBCHU)) { (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) != ITEM_BOMBCHU)) {
gSaveContext.hudVisibilityForceButtonAlphasByStatus = true; gSaveContext.hudVisibilityForceButtonAlphasByStatus = true;
BUTTON_STATUS(EQUIP_SLOT_B) = BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B); gSaveContext.buttonStatus[EQUIP_SLOT_B] = BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B);
BUTTON_STATUS(EQUIP_SLOT_C_LEFT) = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_ENABLED;
BUTTON_STATUS(EQUIP_SLOT_C_DOWN) = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_ENABLED;
BUTTON_STATUS(EQUIP_SLOT_C_RIGHT) = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_ENABLED;
recomp_set_extra_item_slot_statuses(play, BTN_ENABLED);
if (play->sceneId == SCENE_BOWLING) { if (play->sceneId == SCENE_BOWLING) {
if (CURRENT_DAY == 1) { if (CURRENT_DAY == 1) {
BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_BOMBCHU; BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_BOMBCHU;
@ -393,15 +381,16 @@ RECOMP_PATCH void Interface_UpdateButtonsPart1(PlayState* play) {
BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_BOW; BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_BOW;
} }
Interface_LoadItemIconImpl(play, EQUIP_SLOT_B); Interface_LoadItemIconImpl(play, EQUIP_SLOT_B);
BUTTON_STATUS(EQUIP_SLOT_C_LEFT) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
BUTTON_STATUS(EQUIP_SLOT_C_DOWN) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
BUTTON_STATUS(EQUIP_SLOT_C_RIGHT) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
recomp_set_extra_item_slot_statuses(play, BTN_DISABLED);
} else { } else {
// @recomp_use_export_var no_bow_epona_fix: Part of the no bow Epona fix. // @recomp_use_export_var no_bow_epona_fix: Part of the no bow Epona fix.
if (EPONA_FIX_ACTIVE) { if (EPONA_FIX_ACTIVE) {
if (gSaveContext.save.saveInfo.inventory.items[SLOT_BOW] == ITEM_BOW) { if (gSaveContext.save.saveInfo.inventory.items[SLOT_BOW] == ITEM_BOW) {
BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_BOW; BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_BOW;
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
} }
} else { } else {
BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_BOW; BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_BOW;
@ -413,7 +402,7 @@ RECOMP_PATCH void Interface_UpdateButtonsPart1(PlayState* play) {
// @recomp_use_export_var no_bow_epona_fix: Part of the no bow Epona fix. // @recomp_use_export_var no_bow_epona_fix: Part of the no bow Epona fix.
if (EPONA_FIX_ACTIVE) { if (EPONA_FIX_ACTIVE) {
gSaveContext.buttonStatus[EQUIP_SLOT_B] = BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B); gSaveContext.buttonStatus[EQUIP_SLOT_B] = BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B);
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED;
} else { } else {
BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_NONE; BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_NONE;
} }
@ -424,16 +413,17 @@ RECOMP_PATCH void Interface_UpdateButtonsPart1(PlayState* play) {
// @recomp_use_export_var no_bow_epona_fix: If the B button does not contain a sword, don't disable the UI. // @recomp_use_export_var no_bow_epona_fix: If the B button does not contain a sword, don't disable the UI.
if (!EPONA_FIX_ACTIVE || BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) < ITEM_SWORD_KOKIRI || if (!EPONA_FIX_ACTIVE || BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) < ITEM_SWORD_KOKIRI ||
BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) > ITEM_SWORD_GILDED) { BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) > ITEM_SWORD_GILDED) {
BUTTON_STATUS(EQUIP_SLOT_C_LEFT) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
BUTTON_STATUS(EQUIP_SLOT_C_DOWN) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
BUTTON_STATUS(EQUIP_SLOT_C_RIGHT) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
recomp_set_extra_item_slot_statuses(play, BTN_DISABLED);
Interface_SetHudVisibility(HUD_VISIBILITY_A_HEARTS_MAGIC_MINIMAP_WITH_OVERWRITE); Interface_SetHudVisibility(HUD_VISIBILITY_A_HEARTS_MAGIC_MINIMAP_WITH_OVERWRITE);
} }
} }
} }
if (BUTTON_STATUS(EQUIP_SLOT_B) == BTN_DISABLED && BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_BOW) { if (gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_DISABLED && BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_BOW) {
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
} }
if (play->transitionMode != TRANS_MODE_OFF) { if (play->transitionMode != TRANS_MODE_OFF) {
@ -450,9 +440,10 @@ RECOMP_PATCH void Interface_UpdateButtonsPart1(PlayState* play) {
} else if (play->unk_1887C >= 2) { } else if (play->unk_1887C >= 2) {
Interface_SetHudVisibility(HUD_VISIBILITY_B); Interface_SetHudVisibility(HUD_VISIBILITY_B);
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_08_01)) { } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_08_01)) {
BUTTON_STATUS(EQUIP_SLOT_C_LEFT) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
BUTTON_STATUS(EQUIP_SLOT_C_DOWN) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
BUTTON_STATUS(EQUIP_SLOT_C_RIGHT) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
recomp_set_extra_item_slot_statuses(play, BTN_DISABLED);
Interface_SetHudVisibility(HUD_VISIBILITY_A_B_MINIMAP); Interface_SetHudVisibility(HUD_VISIBILITY_A_B_MINIMAP);
} else if (ON_EPONA) { } else if (ON_EPONA) {
Interface_SetHudVisibility(HUD_VISIBILITY_A_B_MINIMAP); Interface_SetHudVisibility(HUD_VISIBILITY_A_B_MINIMAP);
@ -472,17 +463,18 @@ RECOMP_PATCH void Interface_UpdateButtonsPart1(PlayState* play) {
BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_BOW; BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_BOW;
} }
if (h_and_d_no_sword_fix) { if (h_and_d_no_sword_fix) {
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
} }
BUTTON_STATUS(EQUIP_SLOT_C_LEFT) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
BUTTON_STATUS(EQUIP_SLOT_C_DOWN) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
BUTTON_STATUS(EQUIP_SLOT_C_RIGHT) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
recomp_set_extra_item_slot_statuses(play, BTN_DISABLED);
} else { } else {
// @recomp_use_export_var no_bow_epona_fix: Part of the no bow Epona fix. // @recomp_use_export_var no_bow_epona_fix: Part of the no bow Epona fix.
if (EPONA_FIX_ACTIVE) { if (EPONA_FIX_ACTIVE) {
if (gSaveContext.save.saveInfo.inventory.items[SLOT_BOW] == ITEM_BOW) { if (gSaveContext.save.saveInfo.inventory.items[SLOT_BOW] == ITEM_BOW) {
BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_BOW; BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_BOW;
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
} }
} else { } else {
BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_BOW; BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_BOW;
@ -495,7 +487,7 @@ RECOMP_PATCH void Interface_UpdateButtonsPart1(PlayState* play) {
// @recomp_use_export_var no_bow_epona_fix: Part of the no bow Epona fix. // @recomp_use_export_var no_bow_epona_fix: Part of the no bow Epona fix.
if (EPONA_FIX_ACTIVE) { if (EPONA_FIX_ACTIVE) {
gSaveContext.buttonStatus[EQUIP_SLOT_B] = BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B); gSaveContext.buttonStatus[EQUIP_SLOT_B] = BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B);
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED;
} else { } else {
BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_NONE; BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_NONE;
} }
@ -503,10 +495,10 @@ RECOMP_PATCH void Interface_UpdateButtonsPart1(PlayState* play) {
Interface_LoadItemIconImpl(play, EQUIP_SLOT_B); Interface_LoadItemIconImpl(play, EQUIP_SLOT_B);
} }
if (BUTTON_STATUS(EQUIP_SLOT_B) == BTN_DISABLED) { if (gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_DISABLED) {
// @recomp_use_export_var no_bow_epona_fix: Don't enable the B button unless it is being used for the bow. // @recomp_use_export_var no_bow_epona_fix: Don't enable the B button unless it is being used for the bow.
if (!no_bow_epona_fix || BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_BOW) { if (!no_bow_epona_fix || BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_BOW) {
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
} }
// @recomp_use_export_var no_bow_epona_fix: Don't restore hud visibility from Epona without a sword. // @recomp_use_export_var no_bow_epona_fix: Don't restore hud visibility from Epona without a sword.
@ -517,9 +509,10 @@ RECOMP_PATCH void Interface_UpdateButtonsPart1(PlayState* play) {
// @recomp_use_export_var no_bow_epona_fix: If the B button does not contain the bow, don't disable the UI. // @recomp_use_export_var no_bow_epona_fix: If the B button does not contain the bow, don't disable the UI.
if ((!no_bow_epona_fix || BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_BOW) && !H_AND_D_FIX_ACTIVE) { if ((!no_bow_epona_fix || BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_BOW) && !H_AND_D_FIX_ACTIVE) {
BUTTON_STATUS(EQUIP_SLOT_C_LEFT) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
BUTTON_STATUS(EQUIP_SLOT_C_DOWN) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
BUTTON_STATUS(EQUIP_SLOT_C_RIGHT) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
recomp_set_extra_item_slot_statuses(play, BTN_DISABLED);
Interface_SetHudVisibility(HUD_VISIBILITY_A_HEARTS_MAGIC_MINIMAP_WITH_OVERWRITE); Interface_SetHudVisibility(HUD_VISIBILITY_A_HEARTS_MAGIC_MINIMAP_WITH_OVERWRITE);
} }
@ -534,9 +527,10 @@ RECOMP_PATCH void Interface_UpdateButtonsPart1(PlayState* play) {
} else if (play->unk_1887C >= 2) { } else if (play->unk_1887C >= 2) {
Interface_SetHudVisibility(HUD_VISIBILITY_B); Interface_SetHudVisibility(HUD_VISIBILITY_B);
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_08_01)) { } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_08_01)) {
BUTTON_STATUS(EQUIP_SLOT_C_LEFT) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
BUTTON_STATUS(EQUIP_SLOT_C_DOWN) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
BUTTON_STATUS(EQUIP_SLOT_C_RIGHT) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
recomp_set_extra_item_slot_statuses(play, BTN_DISABLED);
Interface_SetHudVisibility(HUD_VISIBILITY_A_B_MINIMAP); Interface_SetHudVisibility(HUD_VISIBILITY_A_B_MINIMAP);
} else if (ON_EPONA) { } else if (ON_EPONA) {
Interface_SetHudVisibility(HUD_VISIBILITY_A_B_MINIMAP); Interface_SetHudVisibility(HUD_VISIBILITY_A_B_MINIMAP);
@ -603,16 +597,18 @@ RECOMP_PATCH void Interface_UpdateButtonsPart1(PlayState* play) {
(gSaveContext.save.entrance == ENTRANCE(WATERFALL_RAPIDS, 1)) && (gSaveContext.save.entrance == ENTRANCE(WATERFALL_RAPIDS, 1)) &&
(play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF)) { (play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF)) {
// Beaver race minigame // Beaver race minigame
BUTTON_STATUS(EQUIP_SLOT_C_LEFT) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
BUTTON_STATUS(EQUIP_SLOT_C_DOWN) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
BUTTON_STATUS(EQUIP_SLOT_C_RIGHT) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
recomp_set_extra_item_slot_statuses(play, BTN_DISABLED);
Interface_SetHudVisibility(HUD_VISIBILITY_A_B_MINIMAP); Interface_SetHudVisibility(HUD_VISIBILITY_A_B_MINIMAP);
} else if ((gSaveContext.save.entrance == ENTRANCE(GORON_RACETRACK, 1)) && } else if ((gSaveContext.save.entrance == ENTRANCE(GORON_RACETRACK, 1)) &&
(play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF)) { (play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF)) {
// Goron race minigame // Goron race minigame
BUTTON_STATUS(EQUIP_SLOT_C_LEFT) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
BUTTON_STATUS(EQUIP_SLOT_C_DOWN) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
BUTTON_STATUS(EQUIP_SLOT_C_RIGHT) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
recomp_set_extra_item_slot_statuses(play, BTN_DISABLED);
Interface_SetHudVisibility(HUD_VISIBILITY_A_B_HEARTS_MAGIC_MINIMAP); Interface_SetHudVisibility(HUD_VISIBILITY_A_B_HEARTS_MAGIC_MINIMAP);
} else if (play->actorCtx.flags & ACTORCTX_FLAG_PICTO_BOX_ON) { } else if (play->actorCtx.flags & ACTORCTX_FLAG_PICTO_BOX_ON) {
// Related to pictograph // Related to pictograph
@ -657,53 +653,50 @@ RECOMP_PATCH void Interface_UpdateButtonsPart2(PlayState* play) {
MessageContext* msgCtx = &play->msgCtx; MessageContext* msgCtx = &play->msgCtx;
InterfaceContext* interfaceCtx = &play->interfaceCtx; InterfaceContext* interfaceCtx = &play->interfaceCtx;
Player* player = GET_PLAYER(play); Player* player = GET_PLAYER(play);
s16 e; s16 i;
s16 restoreHudVisibility = false; s16 restoreHudVisibility = false;
if (CHECK_EVENTINF(EVENTINF_41)) { if (CHECK_EVENTINF(EVENTINF_41)) {
// Related to swamp boat (non-minigame)? // Related to swamp boat (non-minigame)?
for (e = 0; e < TOTAL_SLOT_COUNT; e++) { for (i = EQUIP_SLOT_C_LEFT; i <= EQUIP_SLOT_C_RIGHT; i++) {
s16 i = to_slot_index(e);
if ((GET_CUR_FORM_BTN_ITEM(i) != ITEM_PICTOGRAPH_BOX) || (msgCtx->msgMode != MSGMODE_NONE)) { if ((GET_CUR_FORM_BTN_ITEM(i) != ITEM_PICTOGRAPH_BOX) || (msgCtx->msgMode != MSGMODE_NONE)) {
if (BUTTON_STATUS(i) == BTN_ENABLED) { if (gSaveContext.buttonStatus[i] == BTN_ENABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
} }
BUTTON_STATUS(i) = BTN_DISABLED; gSaveContext.buttonStatus[i] = BTN_DISABLED;
} else { } else {
if (BUTTON_STATUS(i) == BTN_DISABLED) { if (gSaveContext.buttonStatus[i] == BTN_DISABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
} }
BUTTON_STATUS(i) = BTN_ENABLED; gSaveContext.buttonStatus[i] = BTN_ENABLED;
} }
} }
if (sPictoState == PICTO_BOX_STATE_OFF) { if (sPictoState == PICTO_BOX_STATE_OFF) {
if (BUTTON_STATUS(EQUIP_SLOT_B) != BTN_DISABLED) { if (gSaveContext.buttonStatus[EQUIP_SLOT_B] != BTN_DISABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
} }
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED;
} else { } else {
if (BUTTON_STATUS(EQUIP_SLOT_B) == BTN_DISABLED) { if (gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_DISABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
} }
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
} }
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_90_20)) { } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_90_20)) {
// Fishermans's jumping minigame // Fishermans's jumping minigame
for (e = 0; e < TOTAL_SLOT_COUNT; e++) { for (i = EQUIP_SLOT_C_LEFT; i <= EQUIP_SLOT_C_RIGHT; i++) {
s16 i = to_slot_index(e); if (gSaveContext.buttonStatus[i] == BTN_ENABLED) {
if (BUTTON_STATUS(i) == BTN_ENABLED) { gSaveContext.buttonStatus[i] = BTN_DISABLED;
BUTTON_STATUS(i) = BTN_DISABLED;
} }
} }
Interface_SetHudVisibility(HUD_VISIBILITY_B); Interface_SetHudVisibility(HUD_VISIBILITY_B);
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_82_08)) { } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_82_08)) {
// Swordsman's log minigame // Swordsman's log minigame
for (e = 0; e < TOTAL_SLOT_COUNT; e++) { for (i = EQUIP_SLOT_C_LEFT; i <= EQUIP_SLOT_C_RIGHT; i++) {
s16 i = to_slot_index(e); if (gSaveContext.buttonStatus[i] == BTN_ENABLED) {
if (BUTTON_STATUS(i) == BTN_ENABLED) { gSaveContext.buttonStatus[i] = BTN_DISABLED;
BUTTON_STATUS(i) = BTN_DISABLED;
} }
} }
@ -711,45 +704,42 @@ RECOMP_PATCH void Interface_UpdateButtonsPart2(PlayState* play) {
} else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_84_20)) { } else if (CHECK_WEEKEVENTREG(WEEKEVENTREG_84_20)) {
// Related to moon child // Related to moon child
if (player->currentMask == PLAYER_MASK_FIERCE_DEITY) { if (player->currentMask == PLAYER_MASK_FIERCE_DEITY) {
for (e = 0; e < TOTAL_SLOT_COUNT; e++) { for (i = EQUIP_SLOT_C_LEFT; i <= EQUIP_SLOT_C_RIGHT; i++) {
s16 i = to_slot_index(e);
if ((GET_CUR_FORM_BTN_ITEM(i) == ITEM_MASK_FIERCE_DEITY) || if ((GET_CUR_FORM_BTN_ITEM(i) == ITEM_MASK_FIERCE_DEITY) ||
((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_BOTTLE) && (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_OBABA_DRINK))) { ((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_BOTTLE) && (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_OBABA_DRINK))) {
if (BUTTON_STATUS(i) == BTN_DISABLED) { if (gSaveContext.buttonStatus[i] == BTN_DISABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
BUTTON_STATUS(i) = BTN_ENABLED; gSaveContext.buttonStatus[i] = BTN_ENABLED;
} }
} else { } else {
if (BUTTON_STATUS(i) != BTN_DISABLED) { if (gSaveContext.buttonStatus[i] != BTN_DISABLED) {
BUTTON_STATUS(i) = BTN_DISABLED; gSaveContext.buttonStatus[i] = BTN_DISABLED;
restoreHudVisibility = true; restoreHudVisibility = true;
} }
} }
} }
} else { } else {
for (e = 0; e < TOTAL_SLOT_COUNT; e++) { for (i = EQUIP_SLOT_C_LEFT; i <= EQUIP_SLOT_C_RIGHT; i++) {
s16 i = to_slot_index(e);
if ((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_MASK_DEKU) && (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_MASK_ZORA)) { if ((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_MASK_DEKU) && (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_MASK_ZORA)) {
if (BUTTON_STATUS(i) != BTN_DISABLED) { if (gSaveContext.buttonStatus[i] != BTN_DISABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
} }
BUTTON_STATUS(i) = BTN_DISABLED; gSaveContext.buttonStatus[i] = BTN_DISABLED;
} else { } else {
if (BUTTON_STATUS(i) == BTN_DISABLED) { if (gSaveContext.buttonStatus[i] == BTN_DISABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
} }
BUTTON_STATUS(i) = BTN_ENABLED; gSaveContext.buttonStatus[i] = BTN_ENABLED;
} }
} }
} }
} else if ((play->sceneId == SCENE_SPOT00) && (gSaveContext.sceneLayer == 6)) { } else if ((play->sceneId == SCENE_SPOT00) && (gSaveContext.sceneLayer == 6)) {
// Unknown cutscene // Unknown cutscene
for (e = 0; e < EQUIP_SLOT_C_RIGHT; e++) { for (i = EQUIP_SLOT_C_LEFT; i <= EQUIP_SLOT_C_RIGHT; i++) {
s16 i = to_slot_index(e); if (gSaveContext.buttonStatus[i] == BTN_ENABLED) {
if (BUTTON_STATUS(i) == BTN_ENABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
} }
BUTTON_STATUS(i) = BTN_DISABLED; gSaveContext.buttonStatus[i] = BTN_DISABLED;
} }
} else if (CHECK_EVENTINF(EVENTINF_34)) { } else if (CHECK_EVENTINF(EVENTINF_34)) {
// Deku playground minigame // Deku playground minigame
@ -758,21 +748,20 @@ RECOMP_PATCH void Interface_UpdateButtonsPart2(PlayState* play) {
BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_DEKU_NUT; BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_DEKU_NUT;
Interface_LoadItemIconImpl(play, EQUIP_SLOT_B); Interface_LoadItemIconImpl(play, EQUIP_SLOT_B);
} else { } else {
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED;
restoreHudVisibility = true; restoreHudVisibility = true;
} }
} else { } else {
if (BUTTON_STATUS(EQUIP_SLOT_B) == BTN_DISABLED) { if (gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_DISABLED) {
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
restoreHudVisibility = true; restoreHudVisibility = true;
} }
for (e = 0; e < TOTAL_SLOT_COUNT; e++) { for (i = EQUIP_SLOT_C_LEFT; i <= EQUIP_SLOT_C_RIGHT; i++) {
s16 i = to_slot_index(e); if (gSaveContext.buttonStatus[i] == BTN_ENABLED) {
if (BUTTON_STATUS(i) == BTN_ENABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
} }
BUTTON_STATUS(i) = BTN_DISABLED; gSaveContext.buttonStatus[i] = BTN_DISABLED;
} }
} }
@ -787,24 +776,24 @@ RECOMP_PATCH void Interface_UpdateButtonsPart2(PlayState* play) {
if (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) != ITEM_DEKU_NUT) { if (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) != ITEM_DEKU_NUT) {
BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_DEKU_NUT; BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_DEKU_NUT;
Interface_LoadItemIconImpl(play, EQUIP_SLOT_B); Interface_LoadItemIconImpl(play, EQUIP_SLOT_B);
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
restoreHudVisibility = true; restoreHudVisibility = true;
} }
} else if (BUTTON_STATUS(EQUIP_SLOT_B) == BTN_ENABLED) { } else if (gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_ENABLED) {
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED;
restoreHudVisibility = true; restoreHudVisibility = true;
} }
if (restoreHudVisibility) { if (restoreHudVisibility) {
BUTTON_STATUS(EQUIP_SLOT_C_LEFT) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
BUTTON_STATUS(EQUIP_SLOT_C_DOWN) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
BUTTON_STATUS(EQUIP_SLOT_C_RIGHT) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
} }
} else if (!gSaveContext.save.saveInfo.playerData.isMagicAcquired && (CUR_FORM == PLAYER_FORM_DEKU) && } else if (!gSaveContext.save.saveInfo.playerData.isMagicAcquired && (CUR_FORM == PLAYER_FORM_DEKU) &&
(BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_DEKU_NUT)) { (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_DEKU_NUT)) {
// Nuts on B (as Deku Link) // Nuts on B (as Deku Link)
BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_FD; BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_FD;
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED;
} else if ((Player_GetEnvironmentalHazard(play) >= PLAYER_ENV_HAZARD_UNDERWATER_FLOOR) && } else if ((Player_GetEnvironmentalHazard(play) >= PLAYER_ENV_HAZARD_UNDERWATER_FLOOR) &&
(Player_GetEnvironmentalHazard(play) <= PLAYER_ENV_HAZARD_UNDERWATER_FREE)) { (Player_GetEnvironmentalHazard(play) <= PLAYER_ENV_HAZARD_UNDERWATER_FREE)) {
// Swimming underwater // Swimming underwater
@ -821,42 +810,41 @@ RECOMP_PATCH void Interface_UpdateButtonsPart2(PlayState* play) {
restoreHudVisibility = true; restoreHudVisibility = true;
} }
} else { } else {
if (BUTTON_STATUS(EQUIP_SLOT_B) != BTN_DISABLED) { if (gSaveContext.buttonStatus[EQUIP_SLOT_B] != BTN_DISABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
} }
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED;
} }
} else { } else {
if (BUTTON_STATUS(EQUIP_SLOT_B) == BTN_DISABLED) { if (gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_DISABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
} }
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
} }
for (e = 0; e < TOTAL_SLOT_COUNT; e++) { for (i = EQUIP_SLOT_C_LEFT; i <= EQUIP_SLOT_C_RIGHT; i++) {
s16 i = to_slot_index(e);
if (GET_CUR_FORM_BTN_ITEM(i) != ITEM_MASK_ZORA) { if (GET_CUR_FORM_BTN_ITEM(i) != ITEM_MASK_ZORA) {
if (Player_GetEnvironmentalHazard(play) == PLAYER_ENV_HAZARD_UNDERWATER_FLOOR) { if (Player_GetEnvironmentalHazard(play) == PLAYER_ENV_HAZARD_UNDERWATER_FLOOR) {
if (!((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_BOTTLE) && if (!((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_BOTTLE) &&
(GET_CUR_FORM_BTN_ITEM(i) <= ITEM_OBABA_DRINK))) { (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_OBABA_DRINK))) {
if (BUTTON_STATUS(i) == BTN_ENABLED) { if (gSaveContext.buttonStatus[i] == BTN_ENABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
} }
BUTTON_STATUS(i) = BTN_DISABLED; gSaveContext.buttonStatus[i] = BTN_DISABLED;
} else { } else {
if (BUTTON_STATUS(i) == BTN_DISABLED) { if (gSaveContext.buttonStatus[i] == BTN_DISABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
} }
BUTTON_STATUS(i) = BTN_ENABLED; gSaveContext.buttonStatus[i] = BTN_ENABLED;
} }
} else { } else {
if (BUTTON_STATUS(i) == BTN_ENABLED) { if (gSaveContext.buttonStatus[i] == BTN_ENABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
} }
BUTTON_STATUS(i) = BTN_DISABLED; gSaveContext.buttonStatus[i] = BTN_DISABLED;
} }
} else if (BUTTON_STATUS(i) == BTN_DISABLED) { } else if (gSaveContext.buttonStatus[i] == BTN_DISABLED) {
BUTTON_STATUS(i) = BTN_ENABLED; gSaveContext.buttonStatus[i] = BTN_ENABLED;
restoreHudVisibility = true; restoreHudVisibility = true;
} }
} }
@ -872,32 +860,31 @@ RECOMP_PATCH void Interface_UpdateButtonsPart2(PlayState* play) {
} }
} else if (player->stateFlags1 & PLAYER_STATE1_200000) { } else if (player->stateFlags1 & PLAYER_STATE1_200000) {
// First person view // First person view
for (e = 0; e < TOTAL_SLOT_COUNT; e++) { for (i = EQUIP_SLOT_C_LEFT; i <= EQUIP_SLOT_C_RIGHT; i++) {
s16 i = to_slot_index(e);
if (GET_CUR_FORM_BTN_ITEM(i) != ITEM_LENS_OF_TRUTH) { if (GET_CUR_FORM_BTN_ITEM(i) != ITEM_LENS_OF_TRUTH) {
if (BUTTON_STATUS(i) == BTN_ENABLED) { if (gSaveContext.buttonStatus[i] == BTN_ENABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
} }
BUTTON_STATUS(i) = BTN_DISABLED; gSaveContext.buttonStatus[i] = BTN_DISABLED;
} else { } else {
if (BUTTON_STATUS(i) == BTN_DISABLED) { if (gSaveContext.buttonStatus[i] == BTN_DISABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
} }
BUTTON_STATUS(i) = BTN_ENABLED; gSaveContext.buttonStatus[i] = BTN_ENABLED;
} }
} }
if (BUTTON_STATUS(EQUIP_SLOT_B) != BTN_DISABLED) { if (gSaveContext.buttonStatus[EQUIP_SLOT_B] != BTN_DISABLED) {
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED;
restoreHudVisibility = true; restoreHudVisibility = true;
} }
} else if (player->stateFlags1 & PLAYER_STATE1_2000) { } else if (player->stateFlags1 & PLAYER_STATE1_2000) {
// Hanging from a ledge // Hanging from a ledge
if (BUTTON_STATUS(EQUIP_SLOT_B) != BTN_DISABLED) { if (gSaveContext.buttonStatus[EQUIP_SLOT_B] != BTN_DISABLED) {
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED;
BUTTON_STATUS(EQUIP_SLOT_C_LEFT) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED;
BUTTON_STATUS(EQUIP_SLOT_C_DOWN) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED;
BUTTON_STATUS(EQUIP_SLOT_C_RIGHT) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED;
restoreHudVisibility = true; restoreHudVisibility = true;
Interface_SetHudVisibility(HUD_VISIBILITY_ALL); Interface_SetHudVisibility(HUD_VISIBILITY_ALL);
} }
@ -925,15 +912,15 @@ RECOMP_PATCH void Interface_UpdateButtonsPart2(PlayState* play) {
(BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_BOMB) || (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_BOMB) ||
(BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_BOMBCHU)) { (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_BOMBCHU)) {
if (GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) == EQUIP_VALUE_SWORD_NONE) { if (GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) == EQUIP_VALUE_SWORD_NONE) {
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED;
} }
if (BUTTON_STATUS(EQUIP_SLOT_B) == BTN_ENABLED) { if (gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_ENABLED) {
BUTTON_STATUS(EQUIP_SLOT_B) = gSaveContext.buttonStatus[EQUIP_SLOT_B] =
ITEM_SWORD_KOKIRI + GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) - EQUIP_VALUE_SWORD_KOKIRI; ITEM_SWORD_KOKIRI + GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) - EQUIP_VALUE_SWORD_KOKIRI;
} }
BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = BUTTON_STATUS(EQUIP_SLOT_B); BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = gSaveContext.buttonStatus[EQUIP_SLOT_B];
if (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) != ITEM_NONE) { if (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) != ITEM_NONE) {
Interface_LoadItemIconImpl(play, EQUIP_SLOT_B); Interface_LoadItemIconImpl(play, EQUIP_SLOT_B);
@ -941,25 +928,25 @@ RECOMP_PATCH void Interface_UpdateButtonsPart2(PlayState* play) {
restoreHudVisibility = true; restoreHudVisibility = true;
} else if (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_NONE) { } else if (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_NONE) {
if (interfaceCtx->bButtonDoAction != 0) { if (interfaceCtx->bButtonDoAction != 0) {
if (BUTTON_STATUS(EQUIP_SLOT_B) == BTN_DISABLED) { if (gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_DISABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
} }
} else { } else {
if (BUTTON_STATUS(EQUIP_SLOT_B) != BTN_DISABLED) { if (gSaveContext.buttonStatus[EQUIP_SLOT_B] != BTN_DISABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED;
} }
} }
} else if (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_NONE) { } else if (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_NONE) {
if (BUTTON_STATUS(EQUIP_SLOT_B) != BTN_DISABLED) { if (gSaveContext.buttonStatus[EQUIP_SLOT_B] != BTN_DISABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED;
} }
} else { } else {
if (BUTTON_STATUS(EQUIP_SLOT_B) == BTN_DISABLED) { if (gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_DISABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED;
} }
} }
} else if (interfaceCtx->restrictions.bButton != 0) { } else if (interfaceCtx->restrictions.bButton != 0) {
@ -967,18 +954,18 @@ RECOMP_PATCH void Interface_UpdateButtonsPart2(PlayState* play) {
(BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_BOMB) || (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_BOMB) ||
(BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_BOMBCHU)) { (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_BOMBCHU)) {
if (GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) == EQUIP_VALUE_SWORD_NONE) { if (GET_CUR_EQUIP_VALUE(EQUIP_TYPE_SWORD) == EQUIP_VALUE_SWORD_NONE) {
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED;
} }
BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = BUTTON_STATUS(EQUIP_SLOT_B); BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = gSaveContext.buttonStatus[EQUIP_SLOT_B];
if (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) != ITEM_NONE) { if (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) != ITEM_NONE) {
Interface_LoadItemIconImpl(play, EQUIP_SLOT_B); Interface_LoadItemIconImpl(play, EQUIP_SLOT_B);
} }
restoreHudVisibility = true; restoreHudVisibility = true;
} }
if (BUTTON_STATUS(EQUIP_SLOT_B) != BTN_DISABLED) { if (gSaveContext.buttonStatus[EQUIP_SLOT_B] != BTN_DISABLED) {
BUTTON_STATUS(EQUIP_SLOT_B) = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED;
restoreHudVisibility = true; restoreHudVisibility = true;
} }
} }
@ -986,56 +973,54 @@ RECOMP_PATCH void Interface_UpdateButtonsPart2(PlayState* play) {
// C buttons // C buttons
if (GET_PLAYER_FORM == player->transformation) { if (GET_PLAYER_FORM == player->transformation) {
for (e = 0; e < TOTAL_SLOT_COUNT; e++) { for (i = EQUIP_SLOT_C_LEFT; i <= EQUIP_SLOT_C_RIGHT; i++) {
s16 i = to_slot_index(e);
// Individual C button // Individual C button
if (!gPlayerFormItemRestrictions[GET_PLAYER_FORM][GET_CUR_FORM_BTN_ITEM(i)]) { if (!gPlayerFormItemRestrictions[GET_PLAYER_FORM][GET_CUR_FORM_BTN_ITEM(i)]) {
// Item not usable in current playerForm // Item not usable in current playerForm
if (BUTTON_STATUS(i) != BTN_DISABLED) { if (gSaveContext.buttonStatus[i] != BTN_DISABLED) {
BUTTON_STATUS(i) = BTN_DISABLED; gSaveContext.buttonStatus[i] = BTN_DISABLED;
restoreHudVisibility = true; restoreHudVisibility = true;
} }
} else if (player->actor.id != ACTOR_PLAYER) { } else if (player->actor.id != ACTOR_PLAYER) {
// Currently not playing as the main player // Currently not playing as the main player
if (BUTTON_STATUS(i) != BTN_DISABLED) { if (gSaveContext.buttonStatus[i] != BTN_DISABLED) {
BUTTON_STATUS(i) = BTN_DISABLED; gSaveContext.buttonStatus[i] = BTN_DISABLED;
restoreHudVisibility = true; restoreHudVisibility = true;
} }
} else if (player->currentMask == PLAYER_MASK_GIANT) { } else if (player->currentMask == PLAYER_MASK_GIANT) {
// Currently wearing Giant's Mask // Currently wearing Giant's Mask
if (GET_CUR_FORM_BTN_ITEM(i) != ITEM_MASK_GIANT) { if (GET_CUR_FORM_BTN_ITEM(i) != ITEM_MASK_GIANT) {
if (BUTTON_STATUS(i) != BTN_DISABLED) { if (gSaveContext.buttonStatus[i] != BTN_DISABLED) {
BUTTON_STATUS(i) = BTN_DISABLED; gSaveContext.buttonStatus[i] = BTN_DISABLED;
restoreHudVisibility = true; restoreHudVisibility = true;
} }
} else if (BUTTON_STATUS(i) == BTN_DISABLED) { } else if (gSaveContext.buttonStatus[i] == BTN_DISABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
BUTTON_STATUS(i) = BTN_ENABLED; gSaveContext.buttonStatus[i] = BTN_ENABLED;
} }
} else if (GET_CUR_FORM_BTN_ITEM(i) == ITEM_MASK_GIANT) { } else if (GET_CUR_FORM_BTN_ITEM(i) == ITEM_MASK_GIANT) {
// Giant's Mask is equipped // Giant's Mask is equipped
if (play->sceneId != SCENE_INISIE_BS) { if (play->sceneId != SCENE_INISIE_BS) {
if (BUTTON_STATUS(i) != BTN_DISABLED) { if (gSaveContext.buttonStatus[i] != BTN_DISABLED) {
BUTTON_STATUS(i) = BTN_DISABLED; gSaveContext.buttonStatus[i] = BTN_DISABLED;
restoreHudVisibility = true; restoreHudVisibility = true;
} }
} else if (BUTTON_STATUS(i) == BTN_DISABLED) { } else if (gSaveContext.buttonStatus[i] == BTN_DISABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
BUTTON_STATUS(i) = BTN_ENABLED; gSaveContext.buttonStatus[i] = BTN_ENABLED;
} }
} else if (GET_CUR_FORM_BTN_ITEM(i) == ITEM_MASK_FIERCE_DEITY) { } else if (GET_CUR_FORM_BTN_ITEM(i) == ITEM_MASK_FIERCE_DEITY) {
// Fierce Deity's Mask is equipped // Fierce Deity's Mask is equipped
// @recomp_use_export_var fd_anywhere: Allow the player to use the Fierce Deity's Mask anywhere if mods enable it. if ((play->sceneId != SCENE_MITURIN_BS) && (play->sceneId != SCENE_HAKUGIN_BS) &&
if (!fd_anywhere && (play->sceneId != SCENE_MITURIN_BS) && (play->sceneId != SCENE_HAKUGIN_BS) &&
(play->sceneId != SCENE_SEA_BS) && (play->sceneId != SCENE_INISIE_BS) && (play->sceneId != SCENE_SEA_BS) && (play->sceneId != SCENE_INISIE_BS) &&
(play->sceneId != SCENE_LAST_BS)) { (play->sceneId != SCENE_LAST_BS)) {
if (BUTTON_STATUS(i) != BTN_DISABLED) { if (gSaveContext.buttonStatus[i] != BTN_DISABLED) {
BUTTON_STATUS(i) = BTN_DISABLED; gSaveContext.buttonStatus[i] = BTN_DISABLED;
restoreHudVisibility = true; restoreHudVisibility = true;
} }
} else if (BUTTON_STATUS(i) == BTN_DISABLED) { } else if (gSaveContext.buttonStatus[i] == BTN_DISABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
BUTTON_STATUS(i) = BTN_ENABLED; gSaveContext.buttonStatus[i] = BTN_ENABLED;
} }
} else { } else {
// End of special item cases. Apply restrictions to buttons // End of special item cases. Apply restrictions to buttons
@ -1045,10 +1030,10 @@ RECOMP_PATCH void Interface_UpdateButtonsPart2(PlayState* play) {
((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_BOTTLE) && ((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_BOTTLE) &&
(GET_CUR_FORM_BTN_ITEM(i) <= ITEM_OBABA_DRINK)) || (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_OBABA_DRINK)) ||
(GET_CUR_FORM_BTN_ITEM(i) == ITEM_OCARINA_OF_TIME)) { (GET_CUR_FORM_BTN_ITEM(i) == ITEM_OCARINA_OF_TIME)) {
if (BUTTON_STATUS(i) == BTN_ENABLED) { if (gSaveContext.buttonStatus[i] == BTN_ENABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
} }
BUTTON_STATUS(i) = BTN_DISABLED; gSaveContext.buttonStatus[i] = BTN_DISABLED;
} }
} else if (interfaceCtx->restrictions.tradeItems == 0) { } else if (interfaceCtx->restrictions.tradeItems == 0) {
if (((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_MOONS_TEAR) && if (((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_MOONS_TEAR) &&
@ -1056,44 +1041,44 @@ RECOMP_PATCH void Interface_UpdateButtonsPart2(PlayState* play) {
((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_BOTTLE) && ((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_BOTTLE) &&
(GET_CUR_FORM_BTN_ITEM(i) <= ITEM_OBABA_DRINK)) || (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_OBABA_DRINK)) ||
(GET_CUR_FORM_BTN_ITEM(i) == ITEM_OCARINA_OF_TIME)) { (GET_CUR_FORM_BTN_ITEM(i) == ITEM_OCARINA_OF_TIME)) {
if (BUTTON_STATUS(i) == BTN_DISABLED) { if (gSaveContext.buttonStatus[i] == BTN_DISABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
} }
BUTTON_STATUS(i) = BTN_ENABLED; gSaveContext.buttonStatus[i] = BTN_ENABLED;
} }
} }
if (interfaceCtx->restrictions.masks != 0) { if (interfaceCtx->restrictions.masks != 0) {
if ((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_MASK_DEKU) && if ((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_MASK_DEKU) &&
(GET_CUR_FORM_BTN_ITEM(i) <= ITEM_MASK_GIANT)) { (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_MASK_GIANT)) {
if (!BUTTON_STATUS(i)) { // == BTN_ENABLED if (!gSaveContext.buttonStatus[i]) { // == BTN_ENABLED
restoreHudVisibility = true; restoreHudVisibility = true;
} }
BUTTON_STATUS(i) = BTN_DISABLED; gSaveContext.buttonStatus[i] = BTN_DISABLED;
} }
} else if (interfaceCtx->restrictions.masks == 0) { } else if (interfaceCtx->restrictions.masks == 0) {
if ((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_MASK_DEKU) && if ((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_MASK_DEKU) &&
(GET_CUR_FORM_BTN_ITEM(i) <= ITEM_MASK_GIANT)) { (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_MASK_GIANT)) {
if (BUTTON_STATUS(i) == BTN_DISABLED) { if (gSaveContext.buttonStatus[i] == BTN_DISABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
} }
BUTTON_STATUS(i) = BTN_ENABLED; gSaveContext.buttonStatus[i] = BTN_ENABLED;
} }
} }
if (interfaceCtx->restrictions.pictoBox != 0) { if (interfaceCtx->restrictions.pictoBox != 0) {
if (GET_CUR_FORM_BTN_ITEM(i) == ITEM_PICTOGRAPH_BOX) { if (GET_CUR_FORM_BTN_ITEM(i) == ITEM_PICTOGRAPH_BOX) {
if (!BUTTON_STATUS(i)) { // == BTN_ENABLED if (!gSaveContext.buttonStatus[i]) { // == BTN_ENABLED
restoreHudVisibility = true; restoreHudVisibility = true;
} }
BUTTON_STATUS(i) = BTN_DISABLED; gSaveContext.buttonStatus[i] = BTN_DISABLED;
} }
} else if (interfaceCtx->restrictions.pictoBox == 0) { } else if (interfaceCtx->restrictions.pictoBox == 0) {
if (GET_CUR_FORM_BTN_ITEM(i) == ITEM_PICTOGRAPH_BOX) { if (GET_CUR_FORM_BTN_ITEM(i) == ITEM_PICTOGRAPH_BOX) {
if (BUTTON_STATUS(i) == BTN_DISABLED) { if (gSaveContext.buttonStatus[i] == BTN_DISABLED) {
restoreHudVisibility = true; restoreHudVisibility = true;
} }
BUTTON_STATUS(i) = BTN_ENABLED; gSaveContext.buttonStatus[i] = BTN_ENABLED;
} }
} }
@ -1107,9 +1092,9 @@ RECOMP_PATCH void Interface_UpdateButtonsPart2(PlayState* play) {
(GET_CUR_FORM_BTN_ITEM(i) <= ITEM_MASK_GIANT)) && (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_MASK_GIANT)) &&
(GET_CUR_FORM_BTN_ITEM(i) != ITEM_PICTOGRAPH_BOX)) { (GET_CUR_FORM_BTN_ITEM(i) != ITEM_PICTOGRAPH_BOX)) {
if (BUTTON_STATUS(i) == BTN_ENABLED) { if ((gSaveContext.buttonStatus[i] == BTN_ENABLED)) {
restoreHudVisibility = true; restoreHudVisibility = true;
BUTTON_STATUS(i) = BTN_DISABLED; gSaveContext.buttonStatus[i] = BTN_DISABLED;
} }
} }
} else if (interfaceCtx->restrictions.all == 0) { } else if (interfaceCtx->restrictions.all == 0) {
@ -1122,9 +1107,9 @@ RECOMP_PATCH void Interface_UpdateButtonsPart2(PlayState* play) {
(GET_CUR_FORM_BTN_ITEM(i) <= ITEM_MASK_GIANT)) && (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_MASK_GIANT)) &&
(GET_CUR_FORM_BTN_ITEM(i) != ITEM_PICTOGRAPH_BOX)) { (GET_CUR_FORM_BTN_ITEM(i) != ITEM_PICTOGRAPH_BOX)) {
if (BUTTON_STATUS(i) == BTN_DISABLED) { if ((gSaveContext.buttonStatus[i] == BTN_DISABLED)) {
restoreHudVisibility = true; restoreHudVisibility = true;
BUTTON_STATUS(i) = BTN_ENABLED; gSaveContext.buttonStatus[i] = BTN_ENABLED;
} }
} }
} }