-
Notifications
You must be signed in to change notification settings - Fork 151
Unequip Items/Masks from C-Buttons #1429
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 8 commits
accdec7
9cb98f5
927a760
1f460ca
03a7d8e
ae62d41
038e5ac
f474d75
51f5b3c
0a11dbc
254fa8e
f221450
7f57bc1
43ed640
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,133 @@ | ||
| #include <libultraship/bridge.h> | ||
| #include "2s2h/GameInteractor/GameInteractor.h" | ||
| #include "2s2h/ShipInit.hpp" | ||
| #include "2s2h_assets.h" | ||
|
|
||
| extern "C" { | ||
| #include "z64.h" | ||
| #include "functions.h" | ||
| #include "macros.h" | ||
| #include "variables.h" | ||
| #include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h" | ||
| } | ||
|
|
||
| #define CVAR_NAME "gEnhancements.Equipment.ItemUnequip" | ||
| #define CVAR CVarGetInteger(CVAR_NAME, 0) | ||
|
|
||
| void RegisterDpadPageSwitchPrevention() { | ||
| COND_VB_SHOULD(VB_KALEIDO_SWITCH_PAGE_WITH_DPAD, CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0), { | ||
| PlayState* play = va_arg(args, PlayState*); | ||
|
||
| u16 button = va_arg(args, int); | ||
Eblo marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| PauseContext* pauseCtx = &play->pauseCtx; | ||
|
|
||
| // Prevent page switching with D-pad when on item or mask page | ||
| if ((pauseCtx->pageIndex == PAUSE_ITEM || pauseCtx->pageIndex == PAUSE_MASK) && | ||
| pauseCtx->mainState <= PAUSE_MAIN_STATE_IDLE_CURSOR_ON_SONG) { | ||
| *should = false; | ||
| } | ||
| }); | ||
| } | ||
|
|
||
| void RegisterItemUnequip() { | ||
| COND_VB_SHOULD(VB_KALEIDO_EQUIP_ITEM_TO_BUTTON, CVAR, { | ||
| PlayState* play = va_arg(args, PlayState*); | ||
|
||
| u16 cursorSlot = va_arg(args, int); | ||
| u16 cursorItem = va_arg(args, int); | ||
|
|
||
| PauseContext* pauseCtx = &play->pauseCtx; | ||
| s32 targetSlot = -1; | ||
| bool isDpad = false; | ||
|
|
||
| // Determine which button was pressed based on equipTargetCBtn | ||
| switch (pauseCtx->equipTargetCBtn) { | ||
| case PAUSE_EQUIP_C_LEFT: | ||
| targetSlot = EQUIP_SLOT_C_LEFT; | ||
| break; | ||
| case PAUSE_EQUIP_C_DOWN: | ||
| targetSlot = EQUIP_SLOT_C_DOWN; | ||
| break; | ||
| case PAUSE_EQUIP_C_RIGHT: | ||
| targetSlot = EQUIP_SLOT_C_RIGHT; | ||
| break; | ||
| case PAUSE_EQUIP_D_RIGHT: | ||
| targetSlot = EQUIP_SLOT_D_RIGHT; | ||
| isDpad = true; | ||
| break; | ||
| case PAUSE_EQUIP_D_LEFT: | ||
| targetSlot = EQUIP_SLOT_D_LEFT; | ||
| isDpad = true; | ||
| break; | ||
| case PAUSE_EQUIP_D_DOWN: | ||
| targetSlot = EQUIP_SLOT_D_DOWN; | ||
| isDpad = true; | ||
| break; | ||
| case PAUSE_EQUIP_D_UP: | ||
| targetSlot = EQUIP_SLOT_D_UP; | ||
| isDpad = true; | ||
| break; | ||
| default: | ||
| return; | ||
| } | ||
|
|
||
| u8 equippedItem; | ||
| u8 equippedSlot; | ||
| bool shouldUnequip = false; | ||
| bool isMask = cursorSlot >= ITEM_NUM_SLOTS; | ||
|
|
||
| // C-buttons vs D-pad | ||
| if (!isDpad) { | ||
| equippedItem = BUTTON_ITEM_EQUIP(0, targetSlot); | ||
| equippedSlot = C_SLOT_EQUIP(0, targetSlot); | ||
| } else { | ||
| equippedItem = DPAD_BUTTON_ITEM_EQUIP(0, targetSlot); | ||
| equippedSlot = DPAD_SLOT_EQUIP(0, targetSlot); | ||
| } | ||
|
|
||
| // Check if we should unequip | ||
| if (equippedItem == cursorItem) { | ||
| if (isMask) { | ||
| // For masks, check the slot matches (cursorSlot is already offset by ITEM_NUM_SLOTS) | ||
| if (equippedSlot == cursorSlot) { | ||
| shouldUnequip = true; | ||
| } | ||
| } | ||
| // For bottles, we need to check the slot too (since there are multiple bottle items) | ||
| else if (cursorItem >= ITEM_BOTTLE && cursorItem <= ITEM_OBABA_DRINK) { | ||
| if (equippedSlot == cursorSlot) { | ||
| shouldUnequip = true; | ||
| } | ||
| } else { | ||
| shouldUnequip = true; | ||
| } | ||
| } | ||
| // Handle magic arrows (bow variants) | ||
| else if (cursorItem == ITEM_ARROW_FIRE && equippedItem == ITEM_BOW_FIRE) { | ||
| shouldUnequip = true; | ||
| } else if (cursorItem == ITEM_ARROW_ICE && equippedItem == ITEM_BOW_ICE) { | ||
| shouldUnequip = true; | ||
| } else if (cursorItem == ITEM_ARROW_LIGHT && equippedItem == ITEM_BOW_LIGHT) { | ||
| shouldUnequip = true; | ||
| } | ||
|
|
||
| if (shouldUnequip) { | ||
| if (!isDpad) { | ||
| // C-buttons | ||
| BUTTON_ITEM_EQUIP(0, targetSlot) = ITEM_NONE; | ||
| C_SLOT_EQUIP(0, targetSlot) = SLOT_NONE; | ||
| Interface_LoadItemIconImpl(play, targetSlot); | ||
| } else { | ||
| // D-pad | ||
| DPAD_BUTTON_ITEM_EQUIP(0, targetSlot) = ITEM_NONE; | ||
| DPAD_SLOT_EQUIP(0, targetSlot) = SLOT_NONE; | ||
| // Manually clear D-pad icon | ||
| play->interfaceCtx.iconItemSegment[DPAD_BUTTON(targetSlot) + EQUIP_SLOT_MAX] = (char*)gEmptyTexture; | ||
| } | ||
|
|
||
| Audio_PlaySfx(NA_SE_SY_DECIDE); | ||
| *should = false; | ||
| } | ||
| }); | ||
| } | ||
|
|
||
| static RegisterShipInitFunc initFunc(RegisterItemUnequip, { CVAR_NAME }); | ||
| static RegisterShipInitFunc initDpadPageSwitch(RegisterDpadPageSwitchPrevention, { "gEnhancements.Dpad.DpadEquips" }); | ||
| Original file line number | Diff line number | Diff line change | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -701,36 +701,45 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) { | |||||||||
| pauseCtx->equipTargetCBtn = PAUSE_EQUIP_C_RIGHT; | ||||||||||
| } | ||||||||||
| // #region 2S2H [Dpad] | ||||||||||
| else if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { | ||||||||||
| if (CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_DRIGHT)) { | ||||||||||
| if ((Player_GetCurMaskItemId(play) != ITEM_NONE) && | ||||||||||
| (Player_GetCurMaskItemId(play) == DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT))) { | ||||||||||
| Audio_PlaySfx(NA_SE_SY_ERROR); | ||||||||||
| return; | ||||||||||
| } | ||||||||||
| pauseCtx->equipTargetCBtn = PAUSE_EQUIP_D_RIGHT; | ||||||||||
| } else if (CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_DLEFT)) { | ||||||||||
| if ((Player_GetCurMaskItemId(play) != ITEM_NONE) && | ||||||||||
| (Player_GetCurMaskItemId(play) == DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT))) { | ||||||||||
| Audio_PlaySfx(NA_SE_SY_ERROR); | ||||||||||
| return; | ||||||||||
| } | ||||||||||
| pauseCtx->equipTargetCBtn = PAUSE_EQUIP_D_LEFT; | ||||||||||
| } else if (CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_DDOWN)) { | ||||||||||
| if ((Player_GetCurMaskItemId(play) != ITEM_NONE) && | ||||||||||
| (Player_GetCurMaskItemId(play) == DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN))) { | ||||||||||
| Audio_PlaySfx(NA_SE_SY_ERROR); | ||||||||||
| return; | ||||||||||
| } | ||||||||||
| pauseCtx->equipTargetCBtn = PAUSE_EQUIP_D_DOWN; | ||||||||||
| } else if (CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_DUP)) { | ||||||||||
| if ((Player_GetCurMaskItemId(play) != ITEM_NONE) && | ||||||||||
| (Player_GetCurMaskItemId(play) == DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP))) { | ||||||||||
| Audio_PlaySfx(NA_SE_SY_ERROR); | ||||||||||
| return; | ||||||||||
| } | ||||||||||
| pauseCtx->equipTargetCBtn = PAUSE_EQUIP_D_UP; | ||||||||||
| else if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0) && | ||||||||||
|
||||||||||
| CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_DRIGHT)) { | ||||||||||
| if ((Player_GetCurMaskItemId(play) != ITEM_NONE) && | ||||||||||
| (Player_GetCurMaskItemId(play) == DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT))) { | ||||||||||
| Audio_PlaySfx(NA_SE_SY_ERROR); | ||||||||||
| return; | ||||||||||
| } | ||||||||||
| pauseCtx->equipTargetCBtn = PAUSE_EQUIP_D_RIGHT; | ||||||||||
| } else if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0) && | ||||||||||
| CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_DLEFT)) { | ||||||||||
| if ((Player_GetCurMaskItemId(play) != ITEM_NONE) && | ||||||||||
| (Player_GetCurMaskItemId(play) == DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT))) { | ||||||||||
| Audio_PlaySfx(NA_SE_SY_ERROR); | ||||||||||
| return; | ||||||||||
| } | ||||||||||
| pauseCtx->equipTargetCBtn = PAUSE_EQUIP_D_LEFT; | ||||||||||
| } else if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0) && | ||||||||||
| CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_DDOWN)) { | ||||||||||
| if ((Player_GetCurMaskItemId(play) != ITEM_NONE) && | ||||||||||
| (Player_GetCurMaskItemId(play) == DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN))) { | ||||||||||
| Audio_PlaySfx(NA_SE_SY_ERROR); | ||||||||||
| return; | ||||||||||
| } | ||||||||||
| pauseCtx->equipTargetCBtn = PAUSE_EQUIP_D_DOWN; | ||||||||||
| } else if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0) && | ||||||||||
| CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_DUP)) { | ||||||||||
| if ((Player_GetCurMaskItemId(play) != ITEM_NONE) && | ||||||||||
| (Player_GetCurMaskItemId(play) == DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP))) { | ||||||||||
| Audio_PlaySfx(NA_SE_SY_ERROR); | ||||||||||
| return; | ||||||||||
| } | ||||||||||
| pauseCtx->equipTargetCBtn = PAUSE_EQUIP_D_UP; | ||||||||||
| } | ||||||||||
| // #endregion | ||||||||||
|
|
||||||||||
| // #region 2S2H [Enhancement] | ||||||||||
| // Item unequip enhancement | ||||||||||
|
||||||||||
| // #endregion | |
| // #region 2S2H [Enhancement] | |
| // Item unequip enhancement |
Eblo marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| Original file line number | Diff line number | Diff line change | ||
|---|---|---|---|---|
|
|
@@ -661,6 +661,12 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) { | |||
| } | ||||
| // #endregion | ||||
|
|
||||
| // Item unequip enhancement | ||||
|
||||
| // Item unequip enhancement |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could you go ahead and follow the same pattern you did with
ItemUnequip? Just so we're not repeating one name and not the other.CVAR_DPAD_EQUIPSis probably as good a name as any.