diff --git a/mm/2s2h/BenGui/BenMenuBar.cpp b/mm/2s2h/BenGui/BenMenuBar.cpp index c52a99f49..565be1e84 100644 --- a/mm/2s2h/BenGui/BenMenuBar.cpp +++ b/mm/2s2h/BenGui/BenMenuBar.cpp @@ -339,6 +339,14 @@ void DrawEnhancementsMenu() { ImGui::EndMenu(); } + if (UIWidgets::BeginMenu("Dpad")) { + UIWidgets::CVarCheckbox("Dpad Equips", "gEnhancements.Dpad.DpadEquips", { + .tooltip = "Allows you to equip items to your d-pad" + }); + + ImGui::EndMenu(); + } + if (UIWidgets::BeginMenu("Fixes")) { UIWidgets::CVarCheckbox("Fix Ammo Count Color", "gFixes.FixAmmoCountEnvColor", { .tooltip = "Fixes a missing gDPSetEnvColor, which causes the ammo count to be the wrong color prior to obtaining magic or other conditions." diff --git a/mm/2s2h/BenGui/HudEditor.cpp b/mm/2s2h/BenGui/HudEditor.cpp index 2e7339656..6f375ab87 100644 --- a/mm/2s2h/BenGui/HudEditor.cpp +++ b/mm/2s2h/BenGui/HudEditor.cpp @@ -19,6 +19,7 @@ HudEditorElement hudEditorElements[HUD_EDITOR_ELEMENT_MAX] = { HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_RUPEE_COUNTER, "Rupees", "Rupees", 26, 206, 200, 255, 100, 255), HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_KEY_COUNTER, "Keys", "Keys", 26, 190, 255, 255, 255, 255), HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_SKULLTULA_COUNTER, "Skulltulas", "Skulltulas", 26, 190, 255, 255, 255, 255), + HUD_EDITOR_ELEMENT(HUD_EDITOR_ELEMENT_D_PAD, "D-Pad", "DPad", 271, 55, 255, 255, 255, 255), }; extern "C" bool HudEditor_ShouldOverrideDraw() { @@ -61,6 +62,14 @@ const char* presetNames[] = { "Widescreen", }; +namespace HudEditor { +enum Presets { + VANILLA, + HIDDEN, + WIDESCREEN, +}; +}; + void HudEditorWindow::DrawElement() { ImGui::SetNextWindowSize(ImVec2(480,600), ImGuiCond_FirstUseEver); if (!ImGui::Begin("Hud Editor", &mIsVisible, ImGuiWindowFlags_NoFocusOnAppearing)) { @@ -68,7 +77,7 @@ void HudEditorWindow::DrawElement() { return; } - static int preset = 0; + static HudEditor::Presets preset = HudEditor::Presets::VANILLA; if (UIWidgets::Combobox("Preset", &preset, presetNames)) { for (int i = HUD_EDITOR_ELEMENT_B; i < HUD_EDITOR_ELEMENT_MAX; i++) { CVarClear(hudEditorElements[i].xCvar); @@ -79,13 +88,13 @@ void HudEditorWindow::DrawElement() { } switch (preset) { - case 1: { + case HudEditor::Presets::HIDDEN: { for (int i = HUD_EDITOR_ELEMENT_B; i < HUD_EDITOR_ELEMENT_MAX; i++) { CVarSetInteger(hudEditorElements[i].modeCvar, HUD_EDITOR_ELEMENT_MODE_HIDDEN); } break; } - case 2: { + case HudEditor::Presets::WIDESCREEN: { CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_B].modeCvar, HUD_EDITOR_ELEMENT_MODE_MOVABLE_RIGHT); CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_C_LEFT].modeCvar, HUD_EDITOR_ELEMENT_MODE_MOVABLE_RIGHT); CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_C_DOWN].modeCvar, HUD_EDITOR_ELEMENT_MODE_MOVABLE_RIGHT); @@ -98,6 +107,7 @@ void HudEditorWindow::DrawElement() { CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_RUPEE_COUNTER].modeCvar, HUD_EDITOR_ELEMENT_MODE_MOVABLE_LEFT); CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_KEY_COUNTER].modeCvar, HUD_EDITOR_ELEMENT_MODE_MOVABLE_LEFT); CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_SKULLTULA_COUNTER].modeCvar, HUD_EDITOR_ELEMENT_MODE_MOVABLE_LEFT); + CVarSetInteger(hudEditorElements[HUD_EDITOR_ELEMENT_D_PAD].modeCvar, HUD_EDITOR_ELEMENT_MODE_MOVABLE_RIGHT); break; } } diff --git a/mm/2s2h/BenGui/HudEditor.h b/mm/2s2h/BenGui/HudEditor.h index 2db06e5a7..9b8f6e5f4 100644 --- a/mm/2s2h/BenGui/HudEditor.h +++ b/mm/2s2h/BenGui/HudEditor.h @@ -35,6 +35,7 @@ typedef enum { HUD_EDITOR_ELEMENT_RUPEE_COUNTER, HUD_EDITOR_ELEMENT_KEY_COUNTER, HUD_EDITOR_ELEMENT_SKULLTULA_COUNTER, + HUD_EDITOR_ELEMENT_D_PAD, HUD_EDITOR_ELEMENT_MAX, } HudEditorElementID; diff --git a/mm/2s2h/BenJsonConversions.hpp b/mm/2s2h/BenJsonConversions.hpp index 849d5d01f..5de841855 100644 --- a/mm/2s2h/BenJsonConversions.hpp +++ b/mm/2s2h/BenJsonConversions.hpp @@ -6,6 +6,30 @@ using json = nlohmann::json; +void to_json(json& j, const DpadSaveInfo& dpadEquips) { + j = json{ + { "dpadItems", dpadEquips.dpadItems }, + { "dpadSlots", dpadEquips.dpadSlots }, + }; +} + +void from_json(const json& j, DpadSaveInfo& dpadEquips) { + for (int i = 0; i < ARRAY_COUNT(dpadEquips.dpadItems); i++) { + j.at("dpadItems").at(i).get_to(dpadEquips.dpadItems[i]); + j.at("dpadSlots").at(i).get_to(dpadEquips.dpadSlots[i]); + } +} + +void to_json(json& j, const ShipSaveInfo& shipSaveInfo) { + j = json { + { "dpadEquips", shipSaveInfo.dpadEquips }, + }; +} + +void from_json(const json& j, ShipSaveInfo& shipSaveInfo) { + j.at("dpadEquips").get_to(shipSaveInfo.dpadEquips); +} + void to_json(json& j, const ItemEquips& itemEquips) { j = json{ { "buttonItems", itemEquips.buttonItems }, @@ -252,6 +276,7 @@ void to_json(json& j, const Save& save) { { "hasTatl", save.hasTatl }, { "isOwlSave", save.isOwlSave }, { "saveInfo", save.saveInfo }, + { "shipSaveInfo", save.shipSaveInfo }, }; } @@ -273,6 +298,7 @@ void from_json(const json& j, Save& save) { j.at("hasTatl").get_to(save.hasTatl); j.at("isOwlSave").get_to(save.isOwlSave); j.at("saveInfo").get_to(save.saveInfo); + j.at("shipSaveInfo").get_to(save.shipSaveInfo); } void to_json(json& j, const SaveContext& saveContext) { diff --git a/mm/2s2h/DeveloperTools/SaveEditor.cpp b/mm/2s2h/DeveloperTools/SaveEditor.cpp index 4eeb95661..57621b861 100644 --- a/mm/2s2h/DeveloperTools/SaveEditor.cpp +++ b/mm/2s2h/DeveloperTools/SaveEditor.cpp @@ -387,23 +387,26 @@ void DrawEquipItemMenu(InventorySlot slot) { gSaveContext.save.saveInfo.equips.cButtonSlots[CUR_FORM][EQUIP_SLOT_C_RIGHT] = slot; Interface_LoadItemIconImpl(gPlayState, EQUIP_SLOT_C_RIGHT); } - // Todo: DPAD equips support - // if (ImGui::MenuItem("D-Up")) { - // gSaveContext.save.saveInfo.equips.buttonItems[CUR_FORM][4] = currentItemId; - // gSaveContext.save.saveInfo.equips.cButtonSlots[CUR_FORM][3] = slot; - // } - // if (ImGui::MenuItem("D-Down")) { - // gSaveContext.save.saveInfo.equips.buttonItems[CUR_FORM][5] = currentItemId; - // gSaveContext.save.saveInfo.equips.cButtonSlots[CUR_FORM][4] = slot; - // } - // if (ImGui::MenuItem("D-Left")) { - // gSaveContext.save.saveInfo.equips.buttonItems[CUR_FORM][6] = currentItemId; - // gSaveContext.save.saveInfo.equips.cButtonSlots[CUR_FORM][5] = slot; - // } - // if (ImGui::MenuItem("D-Right")) { - // gSaveContext.save.saveInfo.equips.buttonItems[CUR_FORM][7] = currentItemId; - // gSaveContext.save.saveInfo.equips.cButtonSlots[CUR_FORM][6] = slot; - // } + if (ImGui::MenuItem("D-Up")) { + gSaveContext.save.shipSaveInfo.dpadEquips.dpadItems[CUR_FORM][EQUIP_SLOT_D_RIGHT] = currentItemId; + gSaveContext.save.shipSaveInfo.dpadEquips.dpadSlots[CUR_FORM][EQUIP_SLOT_D_RIGHT] = slot; + Interface_Dpad_LoadItemIconImpl(gPlayState, EQUIP_SLOT_D_RIGHT); + } + if (ImGui::MenuItem("D-Down")) { + gSaveContext.save.shipSaveInfo.dpadEquips.dpadItems[CUR_FORM][EQUIP_SLOT_D_LEFT] = currentItemId; + gSaveContext.save.shipSaveInfo.dpadEquips.dpadSlots[CUR_FORM][EQUIP_SLOT_D_LEFT] = slot; + Interface_Dpad_LoadItemIconImpl(gPlayState, EQUIP_SLOT_D_LEFT); + } + if (ImGui::MenuItem("D-Left")) { + gSaveContext.save.shipSaveInfo.dpadEquips.dpadItems[CUR_FORM][EQUIP_SLOT_D_DOWN] = currentItemId; + gSaveContext.save.shipSaveInfo.dpadEquips.dpadSlots[CUR_FORM][EQUIP_SLOT_D_DOWN] = slot; + Interface_Dpad_LoadItemIconImpl(gPlayState, EQUIP_SLOT_D_DOWN); + } + if (ImGui::MenuItem("D-Right")) { + gSaveContext.save.shipSaveInfo.dpadEquips.dpadItems[CUR_FORM][EQUIP_SLOT_D_UP] = currentItemId; + gSaveContext.save.shipSaveInfo.dpadEquips.dpadSlots[CUR_FORM][EQUIP_SLOT_D_UP] = slot; + Interface_Dpad_LoadItemIconImpl(gPlayState, EQUIP_SLOT_D_UP); + } ImGui::EndMenu(); } } diff --git a/mm/2s2h/SaveManager/Migrations/2.cpp b/mm/2s2h/SaveManager/Migrations/2.cpp new file mode 100644 index 000000000..827313eff --- /dev/null +++ b/mm/2s2h/SaveManager/Migrations/2.cpp @@ -0,0 +1,14 @@ +#include "2s2h/SaveManager/SaveManager.h" +#include "z64.h" + +void SaveManager_Migration_2(nlohmann::json& j) { + nlohmann::json dpadEquips; + for (int i = 0; i < EQUIP_SLOT_D_MAX; i++) { + for (int j = 0; j < EQUIP_SLOT_D_MAX; j++) { + dpadEquips["dpadItems"][i][j] = ITEM_NONE; + dpadEquips["dpadSlots"][i][j] = SLOT_NONE; + } + } + + j["save"]["shipSaveInfo"]["dpadEquips"] = dpadEquips; +} \ No newline at end of file diff --git a/mm/2s2h/SaveManager/SaveManager.cpp b/mm/2s2h/SaveManager/SaveManager.cpp index c4fc229de..ce7698d87 100644 --- a/mm/2s2h/SaveManager/SaveManager.cpp +++ b/mm/2s2h/SaveManager/SaveManager.cpp @@ -42,19 +42,21 @@ const std::filesystem::path savesFolderPath(Ship::Context::GetPathRelativeToAppD // - Increment CURRENT_SAVE_VERSION // - Create the migration file in the Migrations folder with the name `{CURRENT_SAVE_VERSION}.cpp` // - Add the migration function definition below and add it to the `migrations` map with the key being the previous version -const uint32_t CURRENT_SAVE_VERSION = 1; +const uint32_t CURRENT_SAVE_VERSION = 2; void SaveManager_Migration_1(nlohmann::json& j); +void SaveManager_Migration_2(nlohmann::json& j); -std::map> migrations = { +const std::unordered_map> migrations = { { 0, SaveManager_Migration_1 }, + { 1, SaveManager_Migration_2 }, }; void SaveManager_MigrateSave(nlohmann::json& j) { int version = j.value("version", 0); while (version != CURRENT_SAVE_VERSION) { if (migrations.contains(version)) { - auto migration = migrations[version]; + auto migration = migrations.at(version); migration(j); } version = j["version"] = version + 1; diff --git a/mm/assets/2s2h_assets.h b/mm/assets/2s2h_assets.h index b8333d90a..8a2a71396 100644 --- a/mm/assets/2s2h_assets.h +++ b/mm/assets/2s2h_assets.h @@ -55,3 +55,6 @@ static const ALIGN_ASSET(2) char gThreeDayClockHour23Tex[] = dgThreeDayClockHour #define dgThreeDayClockHour24Tex "__OTR__textures/parameter_static/gThreeDayClockHour24Tex" static const ALIGN_ASSET(2) char gThreeDayClockHour24Tex[] = dgThreeDayClockHour24Tex; + +#define dgEmptyTexture "__OTR__textures/virtual/gEmptyTexture" +static const ALIGN_ASSET(2) char gEmptyTexture[] = dgEmptyTexture; diff --git a/mm/include/functions.h b/mm/include/functions.h index 52f669306..62ac3cb60 100644 --- a/mm/include/functions.h +++ b/mm/include/functions.h @@ -792,6 +792,9 @@ s32 func_80123448(PlayState* play); s32 Player_IsGoronOrDeku(Player* player); s32 func_801234D4(PlayState* play); s32 func_80123590(PlayState* play, Actor* actor); +// #region 2S2H [Dpad] +ItemId Player_Dpad_GetItemOnButton(PlayState* play, Player* player, DpadEquipSlot slot); +// #endregion ItemId Player_GetItemOnButton(PlayState* play, Player* player, EquipSlot slot); PlayerItemAction func_80123810(PlayState* play); PlayerModelGroup Player_ActionToModelGroup(Player* player, PlayerItemAction itemAction); diff --git a/mm/include/z64interface.h b/mm/include/z64interface.h index e87378cd6..685257a99 100644 --- a/mm/include/z64interface.h +++ b/mm/include/z64interface.h @@ -14,6 +14,17 @@ typedef enum { /* 5 */ EQUIP_SLOT_MAX } EquipSlot; +// #region 2S2H +typedef enum { + /* -1 */ EQUIP_SLOT_D_NONE = -1, + /* 0 */ EQUIP_SLOT_D_RIGHT, + /* 1 */ EQUIP_SLOT_D_LEFT, + /* 2 */ EQUIP_SLOT_D_DOWN, + /* 3 */ EQUIP_SLOT_D_UP, + /* 4 */ EQUIP_SLOT_D_MAX +} DpadEquipSlot; +// #endregion + typedef enum { /* 0 */ A_BTN_STATE_0, /* 1 */ A_BTN_STATE_1, @@ -141,6 +152,19 @@ typedef struct { char* subTex; } ActionLabel; +// #region 2S2H +typedef struct { + s16 dRightAlpha; + s16 dLeftAlpha; + s16 dDownAlpha; + s16 dUpAlpha; +} DpadInterface; + +typedef struct { + DpadInterface dpad; +} ShipInterfaceContext; +// #endregion + typedef struct { /* 0x000 */ View view; /* 0x168 */ Vtx* actionVtx; @@ -238,6 +262,7 @@ typedef struct { /* 0x33C */ u8* storySegment; /* 0x340 */ uintptr_t storyAddr; /* 0x344 */ size_t storySize; + /* 2S2H */ ShipInterfaceContext shipInterface; } InterfaceContext; // size = 0x348 Gfx* Gfx_DrawTexRectRGBA16(Gfx* gfx, TexturePtr texture, s16 textureWidth, s16 textureHeight, s16 rectLeft, s16 rectTop, s16 rectWidth, s16 rectHeight, u16 dsdx, u16 dtdy); @@ -253,6 +278,10 @@ void Interface_SetHudVisibility(u16 hudVisibility); void Interface_UpdateButtonsPart2(struct PlayState* play); void Interface_SetSceneRestrictions(struct PlayState* play); void Interface_InitMinigame(struct PlayState* play); +// #region 2S2H [Dpad] +void Interface_Dpad_LoadItemIconImpl(struct PlayState* play, u8 btn); +void Interface_Dpad_LoadItemIcon(struct PlayState* play, u8 btn); +// #endregion void Interface_LoadItemIconImpl(struct PlayState* play, u8 btn); void Interface_LoadItemIcon(struct PlayState* play, u8 btn); void Interface_UpdateButtonsAlt(struct PlayState* play, u16 flag); @@ -264,6 +293,9 @@ s32 Inventory_ReplaceItem(struct PlayState* play, u8 oldItem, u8 newItem); void Inventory_UpdateDeitySwordEquip(struct PlayState* play) ; s32 Inventory_HasEmptyBottle(void); s32 Inventory_HasItemInBottle(u8 item); +// #region 2S2H [Dpad] +void Inventory_Dpad_UpdateBottleItem(struct PlayState* play, u8 item, u8 btn); +// #endregion void Inventory_UpdateBottleItem(struct PlayState* play, u8 item, u8 btn); s32 Inventory_ConsumeFairy(struct PlayState* play); void Inventory_UpdateItem(struct PlayState* play, s16 slot, s16 item); diff --git a/mm/include/z64save.h b/mm/include/z64save.h index 4d3a5a764..3f4f61268 100644 --- a/mm/include/z64save.h +++ b/mm/include/z64save.h @@ -319,6 +319,19 @@ typedef struct SaveInfo { /* 0xFE6 */ u16 checksum; // "check_sum" } SaveInfo; // size = 0xFE8 +// #region 2S2H +typedef struct DpadSaveInfo { + u8 dpadItems[4][4]; + u8 dpadSlots[4][4]; +} DpadSaveInfo; + +// These are values added by 2S2H that we need to be persisted to the save file +// See `ShipSaveContext` for values on the SaveContext that aren't persisted. +typedef struct ShipSaveInfo { + DpadSaveInfo dpadEquips; +} ShipSaveInfo; +// #endregion + typedef struct Save { /* 0x00 */ s32 entrance; // "scene_no" /* 0x04 */ u8 equippedMask; // "player_mask" @@ -337,8 +350,21 @@ typedef struct Save { /* 0x22 */ u8 hasTatl; // "bell_flag" /* 0x23 */ u8 isOwlSave; /* 0x24 */ SaveInfo saveInfo; + /* 2S2H */ ShipSaveInfo shipSaveInfo; } Save; // size = 0x100C +// #region 2S2H +typedef struct DpadSaveContext { + u8 status[4]; +} DpadSaveContext; + +// These are values added by 2S2H that aren't persisted to the save file +// See `ShipSaveInfo` for values on the SaveContext that are persisted. +typedef struct ShipSaveContext { + DpadSaveContext dpad; +} ShipSaveContext; +// #endregion + typedef struct SaveContext { /* 0x0000 */ Save save; /* 0x100C */ u8 eventInf[8]; // "event_inf" @@ -422,6 +448,7 @@ typedef struct SaveContext { /* 0x3F68 */ CycleSceneFlags cycleSceneFlags[120]; // Scene flags that are temporarily stored over the duration of a single 3-day cycle /* 0x48C8 */ u16 dungeonIndex; // "scene_id_mix" /* 0x48CA */ u8 masksGivenOnMoon[27]; // bit-packed, masks given away on the Moon. "mask_mask_bit" + /* 2S2H */ ShipSaveContext shipSaveContext; } SaveContext; // size = 0x48C8 typedef enum ButtonStatus { @@ -530,6 +557,43 @@ typedef enum { } \ (void)0 +// #region 2S2H [DPad] +#define DPAD_TO_HELD_ITEM(btn) (btn + EQUIP_SLOT_MAX) +#define HELD_ITEM_TO_DPAD(heldBtn) (heldBtn - EQUIP_SLOT_MAX) +#define IS_HELD_DPAD(heldBtn) ((heldBtn >= DPAD_TO_HELD_ITEM(EQUIP_SLOT_D_RIGHT)) && (heldBtn <= DPAD_TO_HELD_ITEM(EQUIP_SLOT_D_UP))) + +#define BTN_DPAD_EQUIP (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0) ? (BTN_DRIGHT | BTN_DLEFT | BTN_DDOWN | BTN_DUP) : 0) +#define CHECK_BTN_DPAD(input) (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0) && \ + (CHECK_BTN_ALL(input, BTN_DRIGHT) || \ + CHECK_BTN_ALL(input, BTN_DLEFT) || \ + CHECK_BTN_ALL(input, BTN_DDOWN) || \ + CHECK_BTN_ALL(input, BTN_DUP))) + +#define DPAD_BUTTON(btn) (btn) // Translates between equip slot enum and button, in case we change how enum works + +#define DPAD_BUTTON_ITEM_EQUIP(form, btn) (gSaveContext.save.shipSaveInfo.dpadEquips.dpadItems[form][DPAD_BUTTON(btn)]) +#define DPAD_CUR_FORM_EQUIP(btn) BUTTON_ITEM_EQUIP(CUR_FORM, DPAD_BUTTON(btn)) // Unused + +#define DPAD_SLOT_EQUIP(form, btn) (gSaveContext.save.shipSaveInfo.dpadEquips.dpadSlots[form][DPAD_BUTTON(btn)]) + +#define DPAD_GET_CUR_FORM_BTN_ITEM(btn) (DPAD_BUTTON_ITEM_EQUIP(0, DPAD_BUTTON(btn))) +#define DPAD_GET_CUR_FORM_BTN_SLOT(btn) (DPAD_SLOT_EQUIP(0, DPAD_BUTTON(btn))) + +#define DPAD_BTN_ITEM(btn) \ + ((gSaveContext.shipSaveContext.dpad.status[(DPAD_BUTTON(btn))] != BTN_DISABLED) \ + ? DPAD_BUTTON_ITEM_EQUIP(0, (DPAD_BUTTON(btn))) \ + : ((gSaveContext.hudVisibility == HUD_VISIBILITY_A_B_C) ? DPAD_BUTTON_ITEM_EQUIP(0, (DPAD_BUTTON(btn))) : ITEM_NONE)) + +#define DPAD_SET_CUR_FORM_BTN_ITEM(btn, item) \ + DPAD_BUTTON_ITEM_EQUIP(0, (DPAD_BUTTON(btn))) = (item); \ + (void)0 + +#define DPAD_SET_CUR_FORM_BTN_SLOT(btn, item) \ + DPAD_SLOT_EQUIP(0, (DPAD_BUTTON(btn))) = (item); \ + (void)0 + +// #endregion + #define STOLEN_ITEM_NONE (0) #define STOLEN_ITEM_1 ((gSaveContext.save.saveInfo.stolenItems & 0xFF000000) >> 0x18) diff --git a/mm/src/code/z_camera.c b/mm/src/code/z_camera.c index 4d08584b6..9b8cb8eb1 100644 --- a/mm/src/code/z_camera.c +++ b/mm/src/code/z_camera.c @@ -4477,6 +4477,9 @@ s32 Camera_KeepOn3(Camera* camera) { CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CDOWN) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CLEFT) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CRIGHT) || + // #region 2S2H [Dpad] + CHECK_BTN_DPAD(CONTROLLER1(&camera->play->state)->press.button) || + // #endregion CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_Z) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_L) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_R)) { @@ -5536,6 +5539,9 @@ s32 Camera_Unique0(Camera* camera) { CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CDOWN) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CLEFT) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CRIGHT) || + // #region 2S2H [Dpad] + CHECK_BTN_DPAD(CONTROLLER1(&camera->play->state)->press.button) || + // #endregion CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_Z) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_L) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_R) || @@ -5560,6 +5566,9 @@ s32 Camera_Unique0(Camera* camera) { CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CDOWN) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CLEFT) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CRIGHT) || + // #region 2S2H [Dpad] + CHECK_BTN_DPAD(CONTROLLER1(&camera->play->state)->press.button) || + // #endregion CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_Z) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_L) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_R) || @@ -6047,6 +6056,9 @@ s32 Camera_Demo2(Camera* camera) { CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CDOWN) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CLEFT) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CRIGHT) || + // #region 2S2H [Dpad] + CHECK_BTN_DPAD(CONTROLLER1(&camera->play->state)->press.button) || + // #endregion CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_Z) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_L) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_R)) && @@ -6783,6 +6795,9 @@ s32 Camera_Special8(Camera* camera) { CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CDOWN) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CLEFT) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CRIGHT) || + // #region 2S2H [Dpad] + CHECK_BTN_DPAD(CONTROLLER1(&camera->play->state)->press.button) || + // #endregion CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_Z) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_L) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_R) || @@ -6950,6 +6965,9 @@ s32 Camera_Special9(Camera* camera) { CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CDOWN) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CLEFT) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_CRIGHT) || + // #region 2S2H [Dpad] + CHECK_BTN_DPAD(CONTROLLER1(&camera->play->state)->press.button) || + // #endregion CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_Z) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_L) || CHECK_BTN_ALL(CONTROLLER1(&camera->play->state)->press.button, BTN_R) || diff --git a/mm/src/code/z_game_over.c b/mm/src/code/z_game_over.c index 003f5dd7b..0487f3214 100644 --- a/mm/src/code/z_game_over.c +++ b/mm/src/code/z_game_over.c @@ -61,6 +61,12 @@ void GameOver_Update(PlayState* play) { gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_ENABLED; + // #region 2S2H + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT] = BTN_ENABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT] = BTN_ENABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN] = BTN_ENABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_UP] = BTN_ENABLED; + // #endregion gSaveContext.buttonStatus[EQUIP_SLOT_A] = BTN_ENABLED; gSaveContext.hudVisibilityForceButtonAlphasByStatus = false; gSaveContext.nextHudVisibility = HUD_VISIBILITY_IDLE; diff --git a/mm/src/code/z_message.c b/mm/src/code/z_message.c index aff05b005..becbe0695 100644 --- a/mm/src/code/z_message.c +++ b/mm/src/code/z_message.c @@ -14,9 +14,7 @@ #include "assets/interface/message_texture_static/message_texture_static.h" #include -// #region 2S2H [Port] Asset tables we can pull from instead of from ROM -#define dgEmptyTexture "__OTR__textures/virtual/gEmptyTexture" -static const ALIGN_ASSET(2) char gEmptyTexture[] = dgEmptyTexture; +#include "2s2h_assets.h" const char* gBombersNotebookPhotos[] = { gBombersNotebookPhotoAnjuTex, @@ -2883,7 +2881,13 @@ void Message_Decode(PlayState* play) { decodedBufPos--; } else if (curChar == 0x22E) { digits[0] = digits[1] = digits[2] = 0; - digits[3] = gItemPrices[GET_CUR_FORM_BTN_ITEM(player->heldItemButton)]; + // #region 2S2H [Dpad] + if (IS_HELD_DPAD(player->heldItemButton)) { + digits[3] = gItemPrices[DPAD_GET_CUR_FORM_BTN_ITEM(HELD_ITEM_TO_DPAD(player->heldItemButton))]; + } else { + digits[3] = gItemPrices[GET_CUR_FORM_BTN_ITEM(player->heldItemButton)]; + } + // #endregion while (digits[3] >= 1000) { digits[0]++; diff --git a/mm/src/code/z_message_nes.c b/mm/src/code/z_message_nes.c index dec1e3160..d1cc054e2 100644 --- a/mm/src/code/z_message_nes.c +++ b/mm/src/code/z_message_nes.c @@ -1564,7 +1564,13 @@ void Message_DecodeNES(PlayState* play) { decodedBufPos--; } else if (curChar == 0xDE) { digits[0] = digits[1] = digits[2] = 0; - digits[3] = gItemPrices[GET_CUR_FORM_BTN_ITEM(player->heldItemButton)]; + // #region 2S2H [Dpad] + if (IS_HELD_DPAD(player->heldItemButton)) { + digits[3] = gItemPrices[DPAD_GET_CUR_FORM_BTN_ITEM(HELD_ITEM_TO_DPAD(player->heldItemButton))]; + } else { + digits[3] = gItemPrices[GET_CUR_FORM_BTN_ITEM(player->heldItemButton)]; + } + // #endregion while (digits[3] >= 1000) { digits[0]++; diff --git a/mm/src/code/z_parameter.c b/mm/src/code/z_parameter.c index 2bba67637..5fe645d16 100644 --- a/mm/src/code/z_parameter.c +++ b/mm/src/code/z_parameter.c @@ -10,6 +10,8 @@ #include "interface/do_action_static/do_action_static.h" #include "misc/story_static/story_static.h" +#include "2s2h_assets.h" + #include "overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h" #include "overlays/actors/ovl_En_Mm3/z_en_mm3.h" #include "interface/week_static/week_static.h" @@ -19,10 +21,6 @@ #include "2s2h_assets.h" #include "Enhancements/GameInteractor/GameInteractor.h" -// #region 2S2H [Port] Asset tables we can pull from instead of from ROM -#define dgEmptyTexture "__OTR__textures/virtual/gEmptyTexture" -static const ALIGN_ASSET(2) char gEmptyTexture[] = dgEmptyTexture; - // 2S2H [Port] This was originally static but needs to be global so it can be accessed in z_kaleido_collect, z_kaleido_debug, and z_kaleido_draw. const char* sCounterTextures[] = { gCounterDigit0Tex, gCounterDigit1Tex, gCounterDigit2Tex, gCounterDigit3Tex, gCounterDigit4Tex, gCounterDigit5Tex, @@ -322,6 +320,50 @@ Gfx* Gfx_DrawTexRectIA8(Gfx* gfx, TexturePtr texture, s16 textureWidth, s16 text return gfx; } +// #region 2S2H [Dpad] +Gfx* Gfx_DrawTexRectIA16_DropShadow(Gfx* gfx, TexturePtr texture, s16 textureWidth, s16 textureHeight, s16 rectLeft, + s16 rectTop, s16 rectWidth, s16 rectHeight, u16 dsdx, u16 dtdy, s16 r, s16 g, s16 b, + s16 a) { + s16 dropShadowAlpha = a; + + if (a > 100) { + dropShadowAlpha = 100; + } + + gDPPipeSync(gfx++); + gDPSetPrimColor(gfx++, 0, 0, 0, 0, 0, dropShadowAlpha); + + gDPLoadTextureBlock(gfx++, texture, G_IM_FMT_IA, G_IM_SIZ_16b, textureWidth, textureHeight, 0, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, + G_TX_NOLOD); + + // #region 2S2H [Cosmetic] Hud Editor + if (HudEditor_ShouldOverrideDraw()) { + if (CVarGetInteger(hudEditorElements[hudEditorActiveElement].modeCvar, HUD_EDITOR_ELEMENT_MODE_VANILLA) == HUD_EDITOR_ELEMENT_MODE_HIDDEN) { + hudEditorActiveElement = HUD_EDITOR_ELEMENT_NONE; + return gfx; + } + + HudEditor_ModifyDrawValues(&rectLeft, &rectTop, &rectWidth, &rectHeight, &dsdx, &dtdy); + + hudEditorActiveElement = HUD_EDITOR_ELEMENT_NONE; + } + // #endregion + + // 2S2H [Cosmetic] Changed to Wide variant to support widescreen + gSPWideTextureRectangle(gfx++, (rectLeft + 2) * 4, (rectTop + 2) * 4, (rectLeft + rectWidth + 2) * 4, + (rectTop + rectHeight + 2) * 4, G_TX_RENDERTILE, 0, 0, dsdx, dtdy); + + gDPPipeSync(gfx++); + gDPSetPrimColor(gfx++, 0, 0, r, g, b, a); + // 2S2H [Cosmetic] Changed to Wide variant to support widescreen + gSPWideTextureRectangle(gfx++, rectLeft * 4, rectTop * 4, (rectLeft + rectWidth) * 4, (rectTop + rectHeight) * 4, + G_TX_RENDERTILE, 0, 0, dsdx, dtdy); + + return gfx; +} +// #endregion + /** * Draw an IA8 texture on a rectangle with a shadow slightly offset to the bottom-right * @@ -1115,6 +1157,48 @@ void Interface_UpdateButtonAlphasByStatus(PlayState* play, s16 risingAlpha) { } } + // #region 2S2H [Dpad] + if (gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT] == BTN_DISABLED) { + if (interfaceCtx->shipInterface.dpad.dRightAlpha != 70) { + interfaceCtx->shipInterface.dpad.dRightAlpha = 70; + } + } else { + if (interfaceCtx->shipInterface.dpad.dRightAlpha != 255) { + interfaceCtx->shipInterface.dpad.dRightAlpha = risingAlpha; + } + } + + if (gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT] == BTN_DISABLED) { + if (interfaceCtx->shipInterface.dpad.dLeftAlpha != 70) { + interfaceCtx->shipInterface.dpad.dLeftAlpha = 70; + } + } else { + if (interfaceCtx->shipInterface.dpad.dLeftAlpha != 255) { + interfaceCtx->shipInterface.dpad.dLeftAlpha = risingAlpha; + } + } + + if (gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN] == BTN_DISABLED) { + if (interfaceCtx->shipInterface.dpad.dDownAlpha != 70) { + interfaceCtx->shipInterface.dpad.dDownAlpha = 70; + } + } else { + if (interfaceCtx->shipInterface.dpad.dDownAlpha != 255) { + interfaceCtx->shipInterface.dpad.dDownAlpha = risingAlpha; + } + } + + if (gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_UP] == BTN_DISABLED) { + if (interfaceCtx->shipInterface.dpad.dUpAlpha != 70) { + interfaceCtx->shipInterface.dpad.dUpAlpha = 70; + } + } else { + if (interfaceCtx->shipInterface.dpad.dUpAlpha != 255) { + interfaceCtx->shipInterface.dpad.dUpAlpha = risingAlpha; + } + } + // #endregion + if (gSaveContext.buttonStatus[EQUIP_SLOT_A] == BTN_DISABLED) { if (interfaceCtx->aAlpha != 70) { interfaceCtx->aAlpha = 70; @@ -1158,6 +1242,24 @@ void Interface_UpdateButtonAlphas(PlayState* play, s16 dimmingAlpha, s16 risingA if ((interfaceCtx->cRightAlpha != 0) && (interfaceCtx->cRightAlpha > dimmingAlpha)) { interfaceCtx->cRightAlpha = dimmingAlpha; } + + // #region 2S2H [Dpad] + if ((interfaceCtx->shipInterface.dpad.dRightAlpha != 0) && (interfaceCtx->shipInterface.dpad.dRightAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dRightAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dLeftAlpha != 0) && (interfaceCtx->shipInterface.dpad.dLeftAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dLeftAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dDownAlpha != 0) && (interfaceCtx->shipInterface.dpad.dDownAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dDownAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dUpAlpha != 0) && (interfaceCtx->shipInterface.dpad.dUpAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dUpAlpha = dimmingAlpha; + } + // #endregion } void Interface_UpdateHudAlphas(PlayState* play, s16 dimmingAlpha) { @@ -1194,6 +1296,24 @@ void Interface_UpdateHudAlphas(PlayState* play, s16 dimmingAlpha) { interfaceCtx->cRightAlpha = dimmingAlpha; } + // #region 2S2H [Dpad] + if ((interfaceCtx->shipInterface.dpad.dRightAlpha != 0) && (interfaceCtx->shipInterface.dpad.dRightAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dRightAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dLeftAlpha != 0) && (interfaceCtx->shipInterface.dpad.dLeftAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dLeftAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dDownAlpha != 0) && (interfaceCtx->shipInterface.dpad.dDownAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dDownAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dUpAlpha != 0) && (interfaceCtx->shipInterface.dpad.dUpAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dUpAlpha = dimmingAlpha; + } + // #endregion + if ((interfaceCtx->healthAlpha != 0) && (interfaceCtx->healthAlpha > dimmingAlpha)) { interfaceCtx->healthAlpha = dimmingAlpha; } @@ -1252,6 +1372,24 @@ void Interface_UpdateHudAlphas(PlayState* play, s16 dimmingAlpha) { interfaceCtx->cRightAlpha = dimmingAlpha; } + // #region 2S2H [Dpad] + if ((interfaceCtx->shipInterface.dpad.dRightAlpha != 0) && (interfaceCtx->shipInterface.dpad.dRightAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dRightAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dLeftAlpha != 0) && (interfaceCtx->shipInterface.dpad.dLeftAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dLeftAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dDownAlpha != 0) && (interfaceCtx->shipInterface.dpad.dDownAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dDownAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dUpAlpha != 0) && (interfaceCtx->shipInterface.dpad.dUpAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dUpAlpha = dimmingAlpha; + } + // #endregion + if ((interfaceCtx->healthAlpha != 0) && (interfaceCtx->healthAlpha > dimmingAlpha)) { interfaceCtx->healthAlpha = dimmingAlpha; } @@ -1358,6 +1496,24 @@ void Interface_UpdateHudAlphas(PlayState* play, s16 dimmingAlpha) { interfaceCtx->cRightAlpha = dimmingAlpha; } + // #region 2S2H [Dpad] + if ((interfaceCtx->shipInterface.dpad.dRightAlpha != 0) && (interfaceCtx->shipInterface.dpad.dRightAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dRightAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dLeftAlpha != 0) && (interfaceCtx->shipInterface.dpad.dLeftAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dLeftAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dDownAlpha != 0) && (interfaceCtx->shipInterface.dpad.dDownAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dDownAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dUpAlpha != 0) && (interfaceCtx->shipInterface.dpad.dUpAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dUpAlpha = dimmingAlpha; + } + // #endregion + if ((interfaceCtx->minimapAlpha != 0) && (interfaceCtx->minimapAlpha > dimmingAlpha)) { interfaceCtx->minimapAlpha = dimmingAlpha; } @@ -1389,6 +1545,24 @@ void Interface_UpdateHudAlphas(PlayState* play, s16 dimmingAlpha) { interfaceCtx->cRightAlpha = dimmingAlpha; } + // #region 2S2H [Dpad] + if ((interfaceCtx->shipInterface.dpad.dRightAlpha != 0) && (interfaceCtx->shipInterface.dpad.dRightAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dRightAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dLeftAlpha != 0) && (interfaceCtx->shipInterface.dpad.dLeftAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dLeftAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dDownAlpha != 0) && (interfaceCtx->shipInterface.dpad.dDownAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dDownAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dUpAlpha != 0) && (interfaceCtx->shipInterface.dpad.dUpAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dUpAlpha = dimmingAlpha; + } + // #endregion + if ((interfaceCtx->healthAlpha != 0) && (interfaceCtx->healthAlpha > dimmingAlpha)) { interfaceCtx->healthAlpha = dimmingAlpha; } @@ -1428,6 +1602,24 @@ void Interface_UpdateHudAlphas(PlayState* play, s16 dimmingAlpha) { interfaceCtx->cRightAlpha = dimmingAlpha; } + // #region 2S2H [Dpad] + if ((interfaceCtx->shipInterface.dpad.dRightAlpha != 0) && (interfaceCtx->shipInterface.dpad.dRightAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dRightAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dLeftAlpha != 0) && (interfaceCtx->shipInterface.dpad.dLeftAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dLeftAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dDownAlpha != 0) && (interfaceCtx->shipInterface.dpad.dDownAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dDownAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dUpAlpha != 0) && (interfaceCtx->shipInterface.dpad.dUpAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dUpAlpha = dimmingAlpha; + } + // #endregion + if ((interfaceCtx->minimapAlpha != 0) && (interfaceCtx->minimapAlpha > dimmingAlpha)) { interfaceCtx->minimapAlpha = dimmingAlpha; } @@ -1474,6 +1666,24 @@ void Interface_UpdateHudAlphas(PlayState* play, s16 dimmingAlpha) { interfaceCtx->cRightAlpha = dimmingAlpha; } + // #region 2S2H [Dpad] + if ((interfaceCtx->shipInterface.dpad.dRightAlpha != 0) && (interfaceCtx->shipInterface.dpad.dRightAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dRightAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dLeftAlpha != 0) && (interfaceCtx->shipInterface.dpad.dLeftAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dLeftAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dDownAlpha != 0) && (interfaceCtx->shipInterface.dpad.dDownAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dDownAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dUpAlpha != 0) && (interfaceCtx->shipInterface.dpad.dUpAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dUpAlpha = dimmingAlpha; + } + // #endregion + if ((interfaceCtx->magicAlpha != 0) && (interfaceCtx->magicAlpha > dimmingAlpha)) { interfaceCtx->magicAlpha = dimmingAlpha; } @@ -1531,6 +1741,24 @@ void Interface_UpdateHudAlphas(PlayState* play, s16 dimmingAlpha) { interfaceCtx->cRightAlpha = risingAlpha; } + // #region 2S2H [Dpad] + if (interfaceCtx->shipInterface.dpad.dRightAlpha != 255) { + interfaceCtx->shipInterface.dpad.dRightAlpha = risingAlpha; + } + + if (interfaceCtx->shipInterface.dpad.dLeftAlpha != 255) { + interfaceCtx->shipInterface.dpad.dLeftAlpha = risingAlpha; + } + + if (interfaceCtx->shipInterface.dpad.dDownAlpha != 255) { + interfaceCtx->shipInterface.dpad.dDownAlpha = risingAlpha; + } + + if (interfaceCtx->shipInterface.dpad.dUpAlpha != 255) { + interfaceCtx->shipInterface.dpad.dUpAlpha = risingAlpha; + } + // #endregion + if (interfaceCtx->magicAlpha != 255) { interfaceCtx->magicAlpha = risingAlpha; } @@ -1566,6 +1794,24 @@ void Interface_UpdateHudAlphas(PlayState* play, s16 dimmingAlpha) { interfaceCtx->cRightAlpha = risingAlpha; } + // #region 2S2H [Dpad] + if (interfaceCtx->shipInterface.dpad.dRightAlpha != 255) { + interfaceCtx->shipInterface.dpad.dRightAlpha = risingAlpha; + } + + if (interfaceCtx->shipInterface.dpad.dLeftAlpha != 255) { + interfaceCtx->shipInterface.dpad.dLeftAlpha = risingAlpha; + } + + if (interfaceCtx->shipInterface.dpad.dDownAlpha != 255) { + interfaceCtx->shipInterface.dpad.dDownAlpha = risingAlpha; + } + + if (interfaceCtx->shipInterface.dpad.dUpAlpha != 255) { + interfaceCtx->shipInterface.dpad.dUpAlpha = risingAlpha; + } + // #endregion + if (interfaceCtx->magicAlpha != 255) { interfaceCtx->magicAlpha = risingAlpha; } @@ -1609,6 +1855,24 @@ void Interface_UpdateHudAlphas(PlayState* play, s16 dimmingAlpha) { interfaceCtx->cRightAlpha = risingAlpha; } + // #region 2S2H [Dpad] + if (interfaceCtx->shipInterface.dpad.dRightAlpha != 255) { + interfaceCtx->shipInterface.dpad.dRightAlpha = risingAlpha; + } + + if (interfaceCtx->shipInterface.dpad.dLeftAlpha != 255) { + interfaceCtx->shipInterface.dpad.dLeftAlpha = risingAlpha; + } + + if (interfaceCtx->shipInterface.dpad.dDownAlpha != 255) { + interfaceCtx->shipInterface.dpad.dDownAlpha = risingAlpha; + } + + if (interfaceCtx->shipInterface.dpad.dUpAlpha != 255) { + interfaceCtx->shipInterface.dpad.dUpAlpha = risingAlpha; + } + // #endregion + break; case HUD_VISIBILITY_B_MINIMAP: @@ -1628,6 +1892,24 @@ void Interface_UpdateHudAlphas(PlayState* play, s16 dimmingAlpha) { interfaceCtx->cRightAlpha = dimmingAlpha; } + // #region 2S2H [Dpad] + if ((interfaceCtx->shipInterface.dpad.dRightAlpha != 0) && (interfaceCtx->shipInterface.dpad.dRightAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dRightAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dLeftAlpha != 0) && (interfaceCtx->shipInterface.dpad.dLeftAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dLeftAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dDownAlpha != 0) && (interfaceCtx->shipInterface.dpad.dDownAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dDownAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dUpAlpha != 0) && (interfaceCtx->shipInterface.dpad.dUpAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dUpAlpha = dimmingAlpha; + } + // #endregion + if ((interfaceCtx->magicAlpha != 0) && (interfaceCtx->magicAlpha > dimmingAlpha)) { interfaceCtx->magicAlpha = dimmingAlpha; } @@ -1667,6 +1949,24 @@ void Interface_UpdateHudAlphas(PlayState* play, s16 dimmingAlpha) { interfaceCtx->cRightAlpha = dimmingAlpha; } + // #region 2S2H [Dpad] + if ((interfaceCtx->shipInterface.dpad.dRightAlpha != 0) && (interfaceCtx->shipInterface.dpad.dRightAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dRightAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dLeftAlpha != 0) && (interfaceCtx->shipInterface.dpad.dLeftAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dLeftAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dDownAlpha != 0) && (interfaceCtx->shipInterface.dpad.dDownAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dDownAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dUpAlpha != 0) && (interfaceCtx->shipInterface.dpad.dUpAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dUpAlpha = dimmingAlpha; + } + // #endregion + if (interfaceCtx->healthAlpha != 255) { interfaceCtx->healthAlpha = risingAlpha; } @@ -1698,6 +1998,24 @@ void Interface_UpdateHudAlphas(PlayState* play, s16 dimmingAlpha) { interfaceCtx->cRightAlpha = dimmingAlpha; } + // #region 2S2H [Dpad] + if ((interfaceCtx->shipInterface.dpad.dRightAlpha != 0) && (interfaceCtx->shipInterface.dpad.dRightAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dRightAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dLeftAlpha != 0) && (interfaceCtx->shipInterface.dpad.dLeftAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dLeftAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dDownAlpha != 0) && (interfaceCtx->shipInterface.dpad.dDownAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dDownAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dUpAlpha != 0) && (interfaceCtx->shipInterface.dpad.dUpAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dUpAlpha = dimmingAlpha; + } + // #endregion + if (interfaceCtx->aAlpha != 255) { interfaceCtx->aAlpha = risingAlpha; } @@ -1733,6 +2051,24 @@ void Interface_UpdateHudAlphas(PlayState* play, s16 dimmingAlpha) { interfaceCtx->cRightAlpha = dimmingAlpha; } + // #region 2S2H [Dpad] + if ((interfaceCtx->shipInterface.dpad.dRightAlpha != 0) && (interfaceCtx->shipInterface.dpad.dRightAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dRightAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dLeftAlpha != 0) && (interfaceCtx->shipInterface.dpad.dLeftAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dLeftAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dDownAlpha != 0) && (interfaceCtx->shipInterface.dpad.dDownAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dDownAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dUpAlpha != 0) && (interfaceCtx->shipInterface.dpad.dUpAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dUpAlpha = dimmingAlpha; + } + // #endregion + if ((interfaceCtx->minimapAlpha != 0) && (interfaceCtx->minimapAlpha > dimmingAlpha)) { interfaceCtx->minimapAlpha = dimmingAlpha; } @@ -1772,6 +2108,24 @@ void Interface_UpdateHudAlphas(PlayState* play, s16 dimmingAlpha) { interfaceCtx->cRightAlpha = dimmingAlpha; } + // #region 2S2H [Dpad] + if ((interfaceCtx->shipInterface.dpad.dRightAlpha != 0) && (interfaceCtx->shipInterface.dpad.dRightAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dRightAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dLeftAlpha != 0) && (interfaceCtx->shipInterface.dpad.dLeftAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dLeftAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dDownAlpha != 0) && (interfaceCtx->shipInterface.dpad.dDownAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dDownAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dUpAlpha != 0) && (interfaceCtx->shipInterface.dpad.dUpAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dUpAlpha = dimmingAlpha; + } + // #endregion + if ((interfaceCtx->minimapAlpha != 0) && (interfaceCtx->minimapAlpha > dimmingAlpha)) { interfaceCtx->minimapAlpha = dimmingAlpha; } @@ -1799,6 +2153,24 @@ void Interface_UpdateHudAlphas(PlayState* play, s16 dimmingAlpha) { interfaceCtx->cRightAlpha = dimmingAlpha; } + // #region 2S2H [Dpad] + if ((interfaceCtx->shipInterface.dpad.dRightAlpha != 0) && (interfaceCtx->shipInterface.dpad.dRightAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dRightAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dLeftAlpha != 0) && (interfaceCtx->shipInterface.dpad.dLeftAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dLeftAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dDownAlpha != 0) && (interfaceCtx->shipInterface.dpad.dDownAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dDownAlpha = dimmingAlpha; + } + + if ((interfaceCtx->shipInterface.dpad.dUpAlpha != 0) && (interfaceCtx->shipInterface.dpad.dUpAlpha > dimmingAlpha)) { + interfaceCtx->shipInterface.dpad.dUpAlpha = dimmingAlpha; + } + // #endregion + if (interfaceCtx->bAlpha != 255) { interfaceCtx->bAlpha = risingAlpha; } @@ -1853,6 +2225,21 @@ void Interface_UpdateButtonsPart2(PlayState* play) { gSaveContext.buttonStatus[i] = BTN_ENABLED; } } + // #region 2S2H [Dpad] + for (s16 j = EQUIP_SLOT_D_RIGHT; j <= EQUIP_SLOT_D_UP; j++) { + if ((DPAD_GET_CUR_FORM_BTN_ITEM(j) != ITEM_PICTOGRAPH_BOX) || (msgCtx->msgMode != MSGMODE_NONE)) { + if (gSaveContext.shipSaveContext.dpad.status[j] == BTN_ENABLED) { + restoreHudVisibility = true; + } + gSaveContext.shipSaveContext.dpad.status[j] = BTN_DISABLED; + } else { + if (gSaveContext.shipSaveContext.dpad.status[j] == BTN_DISABLED) { + restoreHudVisibility = true; + } + gSaveContext.shipSaveContext.dpad.status[j] = BTN_ENABLED; + } + } + // #endregion if (sPictoState == PICTO_BOX_STATE_OFF) { if (gSaveContext.buttonStatus[EQUIP_SLOT_B] != BTN_DISABLED) { @@ -1900,6 +2287,22 @@ void Interface_UpdateButtonsPart2(PlayState* play) { } } } + // #region 2S2H [Dpad] + for (s16 j = EQUIP_SLOT_D_RIGHT; j <= EQUIP_SLOT_D_UP; j++) { + if ((DPAD_GET_CUR_FORM_BTN_ITEM(j) == ITEM_MASK_FIERCE_DEITY) || + ((DPAD_GET_CUR_FORM_BTN_ITEM(j) >= ITEM_BOTTLE) && (DPAD_GET_CUR_FORM_BTN_ITEM(j) <= ITEM_OBABA_DRINK))) { + if (gSaveContext.shipSaveContext.dpad.status[j] == BTN_DISABLED) { + restoreHudVisibility = true; + gSaveContext.shipSaveContext.dpad.status[j] = BTN_ENABLED; + } + } else { + if (gSaveContext.shipSaveContext.dpad.status[j] != BTN_DISABLED) { + gSaveContext.shipSaveContext.dpad.status[j] = BTN_DISABLED; + restoreHudVisibility = true; + } + } + } + // #endregion } else { for (i = EQUIP_SLOT_C_LEFT; i <= EQUIP_SLOT_C_RIGHT; i++) { if ((GET_CUR_FORM_BTN_ITEM(i) >= ITEM_MASK_DEKU) && (GET_CUR_FORM_BTN_ITEM(i) <= ITEM_MASK_ZORA)) { @@ -1914,6 +2317,21 @@ void Interface_UpdateButtonsPart2(PlayState* play) { gSaveContext.buttonStatus[i] = BTN_ENABLED; } } + // #region 2S2H [Dpad] + for (s16 j = EQUIP_SLOT_D_RIGHT; j <= EQUIP_SLOT_D_UP; j++) { + if ((DPAD_GET_CUR_FORM_BTN_ITEM(j) >= ITEM_MASK_DEKU) && (DPAD_GET_CUR_FORM_BTN_ITEM(j) <= ITEM_MASK_ZORA)) { + if (gSaveContext.shipSaveContext.dpad.status[j] != BTN_DISABLED) { + restoreHudVisibility = true; + } + gSaveContext.shipSaveContext.dpad.status[j] = BTN_DISABLED; + } else { + if (gSaveContext.shipSaveContext.dpad.status[j] == BTN_DISABLED) { + restoreHudVisibility = true; + } + gSaveContext.shipSaveContext.dpad.status[j] = BTN_ENABLED; + } + } + // #endregion } } else if ((play->sceneId == SCENE_SPOT00) && (gSaveContext.sceneLayer == 6)) { // Unknown cutscene @@ -1923,6 +2341,14 @@ void Interface_UpdateButtonsPart2(PlayState* play) { } gSaveContext.buttonStatus[i] = BTN_DISABLED; } + // #region 2S2H [Dpad] + for (s16 j = EQUIP_SLOT_C_LEFT; j <= EQUIP_SLOT_C_RIGHT; j++) { + if (gSaveContext.shipSaveContext.dpad.status[j] == BTN_ENABLED) { + restoreHudVisibility = true; + } + gSaveContext.shipSaveContext.dpad.status[j] = BTN_DISABLED; + } + // #endregion } else if (CHECK_EVENTINF(EVENTINF_34)) { // Deku playground minigame if (player->stateFlags3 & PLAYER_STATE3_1000000) { @@ -1945,6 +2371,15 @@ void Interface_UpdateButtonsPart2(PlayState* play) { } gSaveContext.buttonStatus[i] = BTN_DISABLED; } + + // #region 2S2H [Dpad] + for (s16 j = EQUIP_SLOT_D_RIGHT; j <= EQUIP_SLOT_D_UP; j++) { + if (gSaveContext.shipSaveContext.dpad.status[j] == BTN_ENABLED) { + restoreHudVisibility = true; + } + gSaveContext.shipSaveContext.dpad.status[j] = BTN_DISABLED; + } + // #endregion } if (restoreHudVisibility || (gSaveContext.hudVisibility != HUD_VISIBILITY_A_B_MINIMAP)) { @@ -1970,6 +2405,12 @@ void Interface_UpdateButtonsPart2(PlayState* play) { gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED; + // #region 2S2H [Dpad] + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_UP] = BTN_DISABLED; + // #endregion } } else if (!gSaveContext.save.saveInfo.playerData.isMagicAcquired && (CUR_FORM == PLAYER_FORM_DEKU) && (BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) == ITEM_DEKU_NUT)) { @@ -2030,6 +2471,34 @@ void Interface_UpdateButtonsPart2(PlayState* play) { restoreHudVisibility = true; } } + // #region 2S2H [Dpad] + for (s16 j = EQUIP_SLOT_D_RIGHT; j <= EQUIP_SLOT_D_UP; j++) { + if (DPAD_GET_CUR_FORM_BTN_ITEM(j) != ITEM_MASK_ZORA) { + if (Player_GetEnvironmentalHazard(play) == PLAYER_ENV_HAZARD_UNDERWATER_FLOOR) { + if (!((DPAD_GET_CUR_FORM_BTN_ITEM(j) >= ITEM_BOTTLE) && + (DPAD_GET_CUR_FORM_BTN_ITEM(j) <= ITEM_OBABA_DRINK))) { + if (gSaveContext.shipSaveContext.dpad.status[j] == BTN_ENABLED) { + restoreHudVisibility = true; + } + gSaveContext.shipSaveContext.dpad.status[j] = BTN_DISABLED; + } else { + if (gSaveContext.shipSaveContext.dpad.status[j] == BTN_DISABLED) { + restoreHudVisibility = true; + } + gSaveContext.shipSaveContext.dpad.status[j] = BTN_ENABLED; + } + } else { + if (gSaveContext.shipSaveContext.dpad.status[j] == BTN_ENABLED) { + restoreHudVisibility = true; + } + gSaveContext.shipSaveContext.dpad.status[j] = BTN_DISABLED; + } + } else if (gSaveContext.shipSaveContext.dpad.status[j] == BTN_DISABLED) { + gSaveContext.shipSaveContext.dpad.status[j] = BTN_ENABLED; + restoreHudVisibility = true; + } + } + // #endregion if (restoreHudVisibility) { gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE; @@ -2055,6 +2524,21 @@ void Interface_UpdateButtonsPart2(PlayState* play) { gSaveContext.buttonStatus[i] = BTN_ENABLED; } } + // #region 2S2H [Dpad] + for (s16 j = EQUIP_SLOT_D_RIGHT; j <= EQUIP_SLOT_D_UP; j++) { + if (DPAD_GET_CUR_FORM_BTN_ITEM(j) != ITEM_LENS_OF_TRUTH) { + if (gSaveContext.shipSaveContext.dpad.status[j] == BTN_ENABLED) { + restoreHudVisibility = true; + } + gSaveContext.shipSaveContext.dpad.status[j] = BTN_DISABLED; + } else { + if (gSaveContext.shipSaveContext.dpad.status[j] == BTN_DISABLED) { + restoreHudVisibility = true; + } + gSaveContext.shipSaveContext.dpad.status[j] = BTN_ENABLED; + } + } + // #endregion if (gSaveContext.buttonStatus[EQUIP_SLOT_B] != BTN_DISABLED) { gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_DISABLED; @@ -2067,6 +2551,12 @@ void Interface_UpdateButtonsPart2(PlayState* play) { gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED; + // #region 2S2H [Dpad] + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_UP] = BTN_DISABLED; + // #endregion restoreHudVisibility = true; Interface_SetHudVisibility(HUD_VISIBILITY_ALL); } @@ -2301,6 +2791,150 @@ void Interface_UpdateButtonsPart2(PlayState* play) { } } } + // #region 2S2H [Dpad] + for (s16 j = EQUIP_SLOT_D_RIGHT; j <= EQUIP_SLOT_D_UP; j++) { + // Individual D button + if (!gPlayerFormItemRestrictions[GET_PLAYER_FORM][DPAD_GET_CUR_FORM_BTN_ITEM(j)]) { + // Item not usable in current playerForm + if (gSaveContext.shipSaveContext.dpad.status[j] != BTN_DISABLED) { + gSaveContext.shipSaveContext.dpad.status[j] = BTN_DISABLED; + restoreHudVisibility = true; + } + } else if (player->actor.id != ACTOR_PLAYER) { + // Currently not playing as the main player + if (gSaveContext.shipSaveContext.dpad.status[j] != BTN_DISABLED) { + gSaveContext.shipSaveContext.dpad.status[j] = BTN_DISABLED; + restoreHudVisibility = true; + } + } else if (player->currentMask == PLAYER_MASK_GIANT) { + // Currently wearing Giant's Mask + if (DPAD_GET_CUR_FORM_BTN_ITEM(j) != ITEM_MASK_GIANT) { + if (gSaveContext.shipSaveContext.dpad.status[j] != BTN_DISABLED) { + gSaveContext.shipSaveContext.dpad.status[j] = BTN_DISABLED; + restoreHudVisibility = true; + } + } else if (gSaveContext.shipSaveContext.dpad.status[j] == BTN_DISABLED) { + restoreHudVisibility = true; + gSaveContext.shipSaveContext.dpad.status[j] = BTN_ENABLED; + } + } else if (DPAD_GET_CUR_FORM_BTN_ITEM(j) == ITEM_MASK_GIANT) { + // Giant's Mask is equipped + if (play->sceneId != SCENE_INISIE_BS) { + if (gSaveContext.shipSaveContext.dpad.status[j] != BTN_DISABLED) { + gSaveContext.shipSaveContext.dpad.status[j] = BTN_DISABLED; + restoreHudVisibility = true; + } + } else if (gSaveContext.shipSaveContext.dpad.status[j] == BTN_DISABLED) { + restoreHudVisibility = true; + gSaveContext.shipSaveContext.dpad.status[j] = BTN_ENABLED; + } + } else if (DPAD_GET_CUR_FORM_BTN_ITEM(j) == ITEM_MASK_FIERCE_DEITY) { + // Fierce Deity's Mask is equipped + if ((play->sceneId != SCENE_MITURIN_BS) && (play->sceneId != SCENE_HAKUGIN_BS) && + (play->sceneId != SCENE_SEA_BS) && (play->sceneId != SCENE_INISIE_BS) && + (play->sceneId != SCENE_LAST_BS)) { + if (gSaveContext.shipSaveContext.dpad.status[j] != BTN_DISABLED) { + gSaveContext.shipSaveContext.dpad.status[j] = BTN_DISABLED; + restoreHudVisibility = true; + } + } else if (gSaveContext.shipSaveContext.dpad.status[j] == BTN_DISABLED) { + restoreHudVisibility = true; + gSaveContext.shipSaveContext.dpad.status[j] = BTN_ENABLED; + } + } else { + // End of special item cases. Apply restrictions to buttons + if (interfaceCtx->restrictions.tradeItems != 0) { + if (((DPAD_GET_CUR_FORM_BTN_ITEM(j) >= ITEM_MOONS_TEAR) && + (DPAD_GET_CUR_FORM_BTN_ITEM(j) <= ITEM_PENDANT_OF_MEMORIES)) || + ((DPAD_GET_CUR_FORM_BTN_ITEM(j) >= ITEM_BOTTLE) && + (DPAD_GET_CUR_FORM_BTN_ITEM(j) <= ITEM_OBABA_DRINK)) || + (DPAD_GET_CUR_FORM_BTN_ITEM(j) == ITEM_OCARINA_OF_TIME)) { + if (gSaveContext.shipSaveContext.dpad.status[j] == BTN_ENABLED) { + restoreHudVisibility = true; + } + gSaveContext.shipSaveContext.dpad.status[j] = BTN_DISABLED; + } + } else if (interfaceCtx->restrictions.tradeItems == 0) { + if (((DPAD_GET_CUR_FORM_BTN_ITEM(j) >= ITEM_MOONS_TEAR) && + (DPAD_GET_CUR_FORM_BTN_ITEM(j) <= ITEM_PENDANT_OF_MEMORIES)) || + ((DPAD_GET_CUR_FORM_BTN_ITEM(j) >= ITEM_BOTTLE) && + (DPAD_GET_CUR_FORM_BTN_ITEM(j) <= ITEM_OBABA_DRINK)) || + (DPAD_GET_CUR_FORM_BTN_ITEM(j) == ITEM_OCARINA_OF_TIME)) { + if (gSaveContext.shipSaveContext.dpad.status[j] == BTN_DISABLED) { + restoreHudVisibility = true; + } + gSaveContext.shipSaveContext.dpad.status[j] = BTN_ENABLED; + } + } + + if (interfaceCtx->restrictions.masks != 0) { + if ((DPAD_GET_CUR_FORM_BTN_ITEM(j) >= ITEM_MASK_DEKU) && + (DPAD_GET_CUR_FORM_BTN_ITEM(j) <= ITEM_MASK_GIANT)) { + if (!gSaveContext.shipSaveContext.dpad.status[j]) { // == BTN_ENABLED + restoreHudVisibility = true; + } + gSaveContext.shipSaveContext.dpad.status[j] = BTN_DISABLED; + } + } else if (interfaceCtx->restrictions.masks == 0) { + if ((DPAD_GET_CUR_FORM_BTN_ITEM(j) >= ITEM_MASK_DEKU) && + (DPAD_GET_CUR_FORM_BTN_ITEM(j) <= ITEM_MASK_GIANT)) { + if (gSaveContext.shipSaveContext.dpad.status[j] == BTN_DISABLED) { + restoreHudVisibility = true; + } + gSaveContext.shipSaveContext.dpad.status[j] = BTN_ENABLED; + } + } + + if (interfaceCtx->restrictions.pictoBox != 0) { + if (DPAD_GET_CUR_FORM_BTN_ITEM(j) == ITEM_PICTOGRAPH_BOX) { + if (!gSaveContext.shipSaveContext.dpad.status[j]) { // == BTN_ENABLED + restoreHudVisibility = true; + } + gSaveContext.shipSaveContext.dpad.status[j] = BTN_DISABLED; + } + } else if (interfaceCtx->restrictions.pictoBox == 0) { + if (DPAD_GET_CUR_FORM_BTN_ITEM(j) == ITEM_PICTOGRAPH_BOX) { + if (gSaveContext.shipSaveContext.dpad.status[j] == BTN_DISABLED) { + restoreHudVisibility = true; + } + gSaveContext.shipSaveContext.dpad.status[j] = BTN_ENABLED; + } + } + + if (interfaceCtx->restrictions.all != 0) { + if (!((DPAD_GET_CUR_FORM_BTN_ITEM(j) >= ITEM_MOONS_TEAR) && + (DPAD_GET_CUR_FORM_BTN_ITEM(j) <= ITEM_PENDANT_OF_MEMORIES)) && + !((DPAD_GET_CUR_FORM_BTN_ITEM(j) >= ITEM_BOTTLE) && + (DPAD_GET_CUR_FORM_BTN_ITEM(j) <= ITEM_OBABA_DRINK)) && + (DPAD_GET_CUR_FORM_BTN_ITEM(j) != ITEM_OCARINA_OF_TIME) && + !((DPAD_GET_CUR_FORM_BTN_ITEM(j) >= ITEM_MASK_DEKU) && + (DPAD_GET_CUR_FORM_BTN_ITEM(j) <= ITEM_MASK_GIANT)) && + (DPAD_GET_CUR_FORM_BTN_ITEM(j) != ITEM_PICTOGRAPH_BOX)) { + + if ((gSaveContext.shipSaveContext.dpad.status[j] == BTN_ENABLED)) { + restoreHudVisibility = true; + gSaveContext.shipSaveContext.dpad.status[j] = BTN_DISABLED; + } + } + } else if (interfaceCtx->restrictions.all == 0) { + if (!((DPAD_GET_CUR_FORM_BTN_ITEM(j) >= ITEM_MOONS_TEAR) && + (DPAD_GET_CUR_FORM_BTN_ITEM(j) <= ITEM_PENDANT_OF_MEMORIES)) && + !((DPAD_GET_CUR_FORM_BTN_ITEM(j) >= ITEM_BOTTLE) && + (DPAD_GET_CUR_FORM_BTN_ITEM(j) <= ITEM_OBABA_DRINK)) && + (DPAD_GET_CUR_FORM_BTN_ITEM(j) != ITEM_OCARINA_OF_TIME) && + !((DPAD_GET_CUR_FORM_BTN_ITEM(j) >= ITEM_MASK_DEKU) && + (DPAD_GET_CUR_FORM_BTN_ITEM(j) <= ITEM_MASK_GIANT)) && + (DPAD_GET_CUR_FORM_BTN_ITEM(j) != ITEM_PICTOGRAPH_BOX)) { + + if ((gSaveContext.shipSaveContext.dpad.status[j] == BTN_DISABLED)) { + restoreHudVisibility = true; + gSaveContext.shipSaveContext.dpad.status[j] = BTN_ENABLED; + } + } + } + } + } + // #endregion } } @@ -2339,12 +2973,24 @@ void Interface_UpdateButtonsPart1(PlayState* play) { gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED; + // #region 2S2H [Dpad] + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_UP] = BTN_DISABLED; + // #endregion } } else if (gSaveContext.buttonStatus[EQUIP_SLOT_B] == BTN_DISABLED) { gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_ENABLED; + // #region 2S2H [Dpad] + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT] = BTN_ENABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT] = BTN_ENABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN] = BTN_ENABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_UP] = BTN_ENABLED; + // #endregion } Interface_SetHudVisibility(HUD_VISIBILITY_B_MAGIC); @@ -2357,6 +3003,12 @@ void Interface_UpdateButtonsPart1(PlayState* play) { gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_ENABLED; + // #region 2S2H [Dpad] + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT] = BTN_ENABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT] = BTN_ENABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN] = BTN_ENABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_UP] = BTN_ENABLED; + // #endregion if (play->sceneId == SCENE_BOWLING) { if (CURRENT_DAY == 1) { BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_BOMBCHU; @@ -2369,6 +3021,12 @@ void Interface_UpdateButtonsPart1(PlayState* play) { gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED; + // #region 2S2H [Dpad] + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_UP] = BTN_DISABLED; + // #endregion } else { BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_BOW; @@ -2383,6 +3041,12 @@ void Interface_UpdateButtonsPart1(PlayState* play) { gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED; + // #region 2S2H [Dpad] + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_UP] = BTN_DISABLED; + // #endregion Interface_SetHudVisibility(HUD_VISIBILITY_A_HEARTS_MAGIC_MINIMAP_WITH_OVERWRITE); } } @@ -2404,6 +3068,12 @@ void Interface_UpdateButtonsPart1(PlayState* play) { gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED; + // #region 2S2H [Dpad] + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_UP] = BTN_DISABLED; + // #endregion Interface_SetHudVisibility(HUD_VISIBILITY_A_B_MINIMAP); } else if (player->stateFlags1 & PLAYER_STATE1_800000) { Interface_SetHudVisibility(HUD_VISIBILITY_A_B_MINIMAP); @@ -2425,6 +3095,12 @@ void Interface_UpdateButtonsPart1(PlayState* play) { gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED; + // #region 2S2H [Dpad] + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_UP] = BTN_DISABLED; + // #endregion } else { BUTTON_ITEM_EQUIP(CUR_FORM, EQUIP_SLOT_B) = ITEM_BOW; } @@ -2445,6 +3121,12 @@ void Interface_UpdateButtonsPart1(PlayState* play) { gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED; + // #region 2S2H [Dpad] + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_UP] = BTN_DISABLED; + // #endregion Interface_SetHudVisibility(HUD_VISIBILITY_A_HEARTS_MAGIC_MINIMAP_WITH_OVERWRITE); if (play->transitionMode != TRANS_MODE_OFF) { @@ -2461,6 +3143,12 @@ void Interface_UpdateButtonsPart1(PlayState* play) { gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED; + // #region 2S2H [Dpad] + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_UP] = BTN_DISABLED; + // #endregion Interface_SetHudVisibility(HUD_VISIBILITY_A_B_MINIMAP); } else if (player->stateFlags1 & PLAYER_STATE1_800000) { Interface_SetHudVisibility(HUD_VISIBILITY_A_B_MINIMAP); @@ -2527,6 +3215,12 @@ void Interface_UpdateButtonsPart1(PlayState* play) { gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED; + // #region 2S2H [Dpad] + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_UP] = BTN_DISABLED; + // #endregion Interface_SetHudVisibility(HUD_VISIBILITY_A_B_MINIMAP); } else if ((gSaveContext.save.entrance == ENTRANCE(GORON_RACETRACK, 1)) && (play->transitionTrigger == TRANS_TRIGGER_OFF) && (play->transitionMode == TRANS_MODE_OFF)) { @@ -2534,6 +3228,12 @@ void Interface_UpdateButtonsPart1(PlayState* play) { gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED; + // #region 2S2H [Dpad] + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_UP] = BTN_DISABLED; + // #endregion Interface_SetHudVisibility(HUD_VISIBILITY_A_B_HEARTS_MAGIC_MINIMAP); } else if (play->actorCtx.flags & ACTORCTX_FLAG_PICTO_BOX_ON) { // Related to pictograph @@ -2604,6 +3304,12 @@ void Interface_InitMinigame(PlayState* play) { interfaceCtx->minigameAmmo = 20; } +void Interface_Dpad_LoadItemIconImpl(PlayState* play, u8 btn) { + InterfaceContext* interfaceCtx = &play->interfaceCtx; + + interfaceCtx->iconItemSegment[DPAD_BUTTON(btn) + EQUIP_SLOT_MAX] = gItemIcons[DPAD_GET_CUR_FORM_BTN_ITEM(btn)]; +} + void Interface_LoadItemIconImpl(PlayState* play, u8 btn) { InterfaceContext* interfaceCtx = &play->interfaceCtx; @@ -2614,6 +3320,10 @@ void Interface_LoadItemIconImpl(PlayState* play, u8 btn) { // #endregion } +void Interface_Dpad_LoadItemIcon(PlayState* play, u8 btn) { + Interface_Dpad_LoadItemIconImpl(play, btn); +} + void Interface_LoadItemIcon(PlayState* play, u8 btn) { Interface_LoadItemIconImpl(play, btn); } @@ -2645,10 +3355,18 @@ void Interface_UpdateButtonsAlt(PlayState* play, u16 flag) { gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED; + // #region 2S2H [Dpad] + gSaveContext.buttonStatus[EQUIP_SLOT_D_RIGHT] = gSaveContext.buttonStatus[EQUIP_SLOT_D_LEFT] = + gSaveContext.buttonStatus[EQUIP_SLOT_D_DOWN] = gSaveContext.buttonStatus[EQUIP_SLOT_D_UP] = BTN_ENABLED; + // #endregion Interface_SetHudVisibility(HUD_VISIBILITY_ALL_NO_MINIMAP_W_DISABLED); } else { gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED; + // #region 2S2H [Dpad] + gSaveContext.buttonStatus[EQUIP_SLOT_D_RIGHT] = gSaveContext.buttonStatus[EQUIP_SLOT_D_LEFT] = + gSaveContext.buttonStatus[EQUIP_SLOT_D_DOWN] = gSaveContext.buttonStatus[EQUIP_SLOT_D_UP] = BTN_ENABLED; + // #endregion Interface_UpdateButtonsPart1(play); } } @@ -3050,6 +3768,25 @@ u8 Item_GiveImpl(PlayState* play, u8 item) { Interface_LoadItemIconImpl(play, EQUIP_SLOT_C_RIGHT); gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_ENABLED; } + // #region 2S2H [DPad] + else if ((slot + i) == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) = item; + Interface_Dpad_LoadItemIconImpl(play, EQUIP_SLOT_D_RIGHT); + gSaveContext.buttonStatus[EQUIP_SLOT_D_RIGHT] = BTN_ENABLED; + } else if ((slot + i) == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) = item; + Interface_Dpad_LoadItemIconImpl(play, EQUIP_SLOT_D_LEFT); + gSaveContext.buttonStatus[EQUIP_SLOT_D_LEFT] = BTN_ENABLED; + } else if ((slot + i) == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) = item; + Interface_Dpad_LoadItemIconImpl(play, EQUIP_SLOT_D_DOWN); + gSaveContext.buttonStatus[EQUIP_SLOT_D_DOWN] = BTN_ENABLED; + } else if ((slot + i) == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) = item; + Interface_Dpad_LoadItemIconImpl(play, EQUIP_SLOT_D_UP); + gSaveContext.buttonStatus[EQUIP_SLOT_D_UP] = BTN_ENABLED; + } + // #endregion gSaveContext.save.saveInfo.inventory.items[slot + i] = item; return ITEM_NONE; @@ -3075,6 +3812,15 @@ u8 Item_GiveImpl(PlayState* play, u8 item) { return ITEM_NONE; } } + // #region 2S2H [Dpad] + for (s16 j = EQUIP_SLOT_D_RIGHT; j <= EQUIP_SLOT_D_UP; j++) { + if (temp == DPAD_GET_CUR_FORM_BTN_ITEM(j)) { + DPAD_SET_CUR_FORM_BTN_ITEM(j, item); + Interface_Dpad_LoadItemIconImpl(play, j); + return ITEM_NONE; + } + } + // #endregion } return ITEM_NONE; } @@ -3266,6 +4012,14 @@ void Inventory_DeleteItem(s16 item, s16 slot) { SET_CUR_FORM_BTN_SLOT(btn, SLOT_NONE); } } + // #region 2S2H [Dpad] + for (s16 dpadBtn = EQUIP_SLOT_D_RIGHT; dpadBtn <= EQUIP_SLOT_D_UP; dpadBtn++) { + if (DPAD_GET_CUR_FORM_BTN_ITEM(dpadBtn) == item) { + DPAD_SET_CUR_FORM_BTN_ITEM(dpadBtn, ITEM_NONE); + DPAD_SET_CUR_FORM_BTN_SLOT(dpadBtn, SLOT_NONE); + } + } + // #endregion } void Inventory_UnequipItem(s16 item) { @@ -3277,6 +4031,14 @@ void Inventory_UnequipItem(s16 item) { SET_CUR_FORM_BTN_SLOT(btn, SLOT_NONE); } } + // #region 2S2H [Dpad] + for (s16 dpadBtn = EQUIP_SLOT_D_RIGHT; dpadBtn <= EQUIP_SLOT_D_UP; dpadBtn++) { + if (DPAD_GET_CUR_FORM_BTN_ITEM(dpadBtn) == item) { + DPAD_SET_CUR_FORM_BTN_ITEM(dpadBtn, ITEM_NONE); + DPAD_SET_CUR_FORM_BTN_SLOT(dpadBtn, SLOT_NONE); + } + } + // #endregion } s32 Inventory_ReplaceItem(PlayState* play, u8 oldItem, u8 newItem) { @@ -3293,6 +4055,15 @@ s32 Inventory_ReplaceItem(PlayState* play, u8 oldItem, u8 newItem) { break; } } + // #region 2S2H [Dpad] + for (u8 j = EQUIP_SLOT_D_RIGHT; j <= EQUIP_SLOT_D_UP; j++) { + if (DPAD_GET_CUR_FORM_BTN_ITEM(j) == oldItem) { + DPAD_SET_CUR_FORM_BTN_ITEM(j, newItem); + Interface_Dpad_LoadItemIconImpl(play, j); + break; + } + } + // #endregion return true; } } @@ -3349,6 +4120,22 @@ s32 Inventory_HasItemInBottle(u8 item) { return false; } +// #region 2S2H [Dpad] +void Inventory_Dpad_UpdateBottleItem(PlayState* play, u8 item, u8 btn) { + gSaveContext.save.saveInfo.inventory.items[DPAD_GET_CUR_FORM_BTN_SLOT(btn)] = item; + DPAD_SET_CUR_FORM_BTN_ITEM(btn, item); + + Interface_Dpad_LoadItemIconImpl(play, btn); + + play->pauseCtx.cursorItem[PAUSE_ITEM] = item; + gSaveContext.shipSaveContext.dpad.status[btn] = BTN_ENABLED; + + if (item == ITEM_HOT_SPRING_WATER) { + Interface_StartBottleTimer(60, DPAD_GET_CUR_FORM_BTN_SLOT(btn) - SLOT_BOTTLE_1); + } +} +// #endregion + void Inventory_UpdateBottleItem(PlayState* play, u8 item, u8 btn) { gSaveContext.save.saveInfo.inventory.items[GET_CUR_FORM_BTN_SLOT(btn)] = item; SET_CUR_FORM_BTN_ITEM(btn, item); @@ -3379,6 +4166,19 @@ s32 Inventory_ConsumeFairy(PlayState* play) { break; } } + // #region 2S2H [Dpad] + if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { + for (u8 dpadBtn = EQUIP_SLOT_C_LEFT; dpadBtn <= EQUIP_SLOT_C_RIGHT; dpadBtn++) { + if (DPAD_GET_CUR_FORM_BTN_ITEM(dpadBtn) == ITEM_FAIRY) { + DPAD_SET_CUR_FORM_BTN_ITEM(dpadBtn, ITEM_BOTTLE); + Interface_Dpad_LoadItemIconImpl(play, dpadBtn); + bottleSlot = DPAD_GET_CUR_FORM_BTN_SLOT(dpadBtn); + i = 0; + break; + } + } + } + // #endregion gSaveContext.save.saveInfo.inventory.items[bottleSlot + i] = ITEM_BOTTLE; return true; } @@ -3401,6 +4201,14 @@ void Inventory_UpdateItem(PlayState* play, s16 slot, s16 item) { Interface_LoadItemIconImpl(play, btn); } } + // #region 2S2H [Dpad] + for (s16 dpadBtn = EQUIP_SLOT_D_RIGHT; dpadBtn <= EQUIP_SLOT_D_UP; dpadBtn++) { + if (DPAD_GET_CUR_FORM_BTN_SLOT(dpadBtn) == slot) { + DPAD_SET_CUR_FORM_BTN_ITEM(dpadBtn, item); + Interface_Dpad_LoadItemIconImpl(play, dpadBtn); + } + } + // #endregion 2S2H } void Interface_MemSetZeroed(u32* buf, s32 count) { @@ -3935,7 +4743,14 @@ void Magic_Update(PlayState* play) { (Player_GetEnvironmentalHazard(play) <= PLAYER_ENV_HAZARD_UNDERWATER_FREE)) || ((BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) != ITEM_LENS_OF_TRUTH) && (BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) != ITEM_LENS_OF_TRUTH) && - (BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) != ITEM_LENS_OF_TRUTH)) || + (BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) != ITEM_LENS_OF_TRUTH) && + // #region 2S2H [Dpad] + (!CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0) || + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) != ITEM_LENS_OF_TRUTH) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) != ITEM_LENS_OF_TRUTH) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) != ITEM_LENS_OF_TRUTH) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) != ITEM_LENS_OF_TRUTH))) || + // #endregion !play->actorCtx.lensActive) { // Deactivate Lens of Truth and set magic state to idle play->actorCtx.lensActive = false; @@ -4260,6 +5075,16 @@ void Interface_DrawItemButtons(PlayState* play) { gDPPipeSync(OVERLAY_DISP++); gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + // #region 2S2H [Dpad] + if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { + s16 dpadAlpha = MAX(MAX(MAX(interfaceCtx->shipInterface.dpad.dRightAlpha, interfaceCtx->shipInterface.dpad.dLeftAlpha), interfaceCtx->shipInterface.dpad.dDownAlpha), + interfaceCtx->shipInterface.dpad.dUpAlpha); + HudEditor_SetActiveElement(HUD_EDITOR_ELEMENT_D_PAD); + OVERLAY_DISP = Gfx_DrawTexRectIA16_DropShadow(OVERLAY_DISP, gDPadTex, 32, 32, 271, 55, 32, 32, 1024, 1024, 255, 255, 255, dpadAlpha); + gDPPipeSync(OVERLAY_DISP++); + } + // #endregion + // B Button Color & Texture HudEditor_SetActiveElement(HUD_EDITOR_ELEMENT_B); OVERLAY_DISP = Gfx_DrawTexRectIA8_DropShadow( @@ -4418,6 +5243,139 @@ void Interface_DrawItemButtons(PlayState* play) { CLOSE_DISPS(play->state.gfxCtx); } +// #region 2S2H [Dpad] +s16 sDpadItemIconDD[] = { + 1024, // EQUIP_SLOT_D_RIGHT + 1024, // EQUIP_SLOT_D_LEFT + 1024, // EQUIP_SLOT_D_DOWN + 1024, // EQUIP_SLOT_D_UP +}; +s16 sDpadItemIconLeft[] = { + 295, // EQUIP_SLOT_D_RIGHT + 263, // EQUIP_SLOT_D_LEFT + 279, // EQUIP_SLOT_D_DOWN + 279, // EQUIP_SLOT_D_UP +}; +s16 sDpadItemIconTop[] = { + 63, // EQUIP_SLOT_D_RIGHT + 63, // EQUIP_SLOT_D_LEFT + 79, // EQUIP_SLOT_D_DOWN + 47, // EQUIP_SLOT_D_UP +}; + +void Interface_Dpad_DrawItemIconTexture(PlayState* play, TexturePtr texture, s16 button) { + static s16 sDpadItemIconWidth[] = { 16, 16, 16, 16 }; + + OPEN_DISPS(play->state.gfxCtx); + + gDPLoadTextureBlock(OVERLAY_DISP++, texture, G_IM_FMT_RGBA, G_IM_SIZ_32b, 32, 32, 0, G_TX_NOMIRROR | G_TX_WRAP, + G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + + HudEditor_SetActiveElement(HUD_EDITOR_ELEMENT_D_PAD); + if (HudEditor_ShouldOverrideDraw()) { + if (CVarGetInteger(hudEditorElements[hudEditorActiveElement].modeCvar, HUD_EDITOR_ELEMENT_MODE_VANILLA) == HUD_EDITOR_ELEMENT_MODE_HIDDEN) { + hudEditorActiveElement = HUD_EDITOR_ELEMENT_NONE; + } else { + s16 rectLeft = sDpadItemIconLeft[button]; + s16 rectTop = sDpadItemIconTop[button]; + s16 rectWidth = sDpadItemIconWidth[button]; + s16 rectHeight = sDpadItemIconWidth[button]; + s16 dsdx = sDpadItemIconDD[button]; + s16 dtdy = sDpadItemIconDD[button]; + + HudEditor_ModifyDrawValues(&rectLeft, &rectTop, &rectWidth, &rectHeight, &dsdx, &dtdy); + + hudEditorActiveElement = HUD_EDITOR_ELEMENT_NONE; + + gSPWideTextureRectangle(OVERLAY_DISP++, rectLeft << 2, rectTop << 2, + (rectLeft + rectWidth) << 2, (rectTop + rectHeight) << 2, + G_TX_RENDERTILE, 0, 0, dsdx << 1, dtdy << 1); + } + } else { + gSPTextureRectangle(OVERLAY_DISP++, sDpadItemIconLeft[button] << 2, sDpadItemIconTop[button] << 2, + (sDpadItemIconLeft[button] + sDpadItemIconWidth[button]) << 2, (sDpadItemIconTop[button] + sDpadItemIconWidth[button]) << 2, + G_TX_RENDERTILE, 0, 0, sDpadItemIconDD[button] << 1, sDpadItemIconDD[button] << 1); + } + + CLOSE_DISPS(play->state.gfxCtx); +} + +s16 sDpadItemAmmoX[] = { + 295, // EQUIP_SLOT_D_RIGHT + 263, // EQUIP_SLOT_D_LEFT + 279, // EQUIP_SLOT_D_DOWN + 279, // EQUIP_SLOT_D_UP +}; + +s16 sDpadItemAmmoY[] = { + 63 + 11, // EQUIP_SLOT_D_RIGHT + 63 + 11, // EQUIP_SLOT_D_LEFT + 79 + 11, // EQUIP_SLOT_D_DOWN + 47 + 11, // EQUIP_SLOT_D_UP +}; + +void Interface_Dpad_DrawAmmoCount(PlayState* play, s16 button, s16 alpha) { + u8 i; + u16 ammo; + OPEN_DISPS(play->state.gfxCtx); + + i = ((void)0, DPAD_GET_CUR_FORM_BTN_ITEM(button)); + + if ((i == ITEM_DEKU_STICK) || (i == ITEM_DEKU_NUT) || (i == ITEM_BOMB) || (i == ITEM_BOW) || + ((i >= ITEM_BOW_FIRE) && (i <= ITEM_BOW_LIGHT)) || (i == ITEM_BOMBCHU) || (i == ITEM_POWDER_KEG) || + (i == ITEM_MAGIC_BEANS) || (i == ITEM_PICTOGRAPH_BOX)) { + + if ((i >= ITEM_BOW_FIRE) && (i <= ITEM_BOW_LIGHT)) { + i = ITEM_BOW; + } + + ammo = AMMO(i); + + if (i == ITEM_PICTOGRAPH_BOX) { + if (!CHECK_QUEST_ITEM(QUEST_PICTOGRAPH)) { + ammo = 0; + } else { + ammo = 1; + } + } + + gDPPipeSync(OVERLAY_DISP++); + + if (((i == ITEM_BOW) && (AMMO(i) == CUR_CAPACITY(UPG_QUIVER))) || + ((i == ITEM_BOMB) && (AMMO(i) == CUR_CAPACITY(UPG_BOMB_BAG))) || + ((i == ITEM_DEKU_STICK) && (AMMO(i) == CUR_CAPACITY(UPG_DEKU_STICKS))) || + ((i == ITEM_DEKU_NUT) && (AMMO(i) == CUR_CAPACITY(UPG_DEKU_NUTS))) || + ((i == ITEM_BOMBCHU) && (AMMO(i) == CUR_CAPACITY(UPG_BOMB_BAG))) || + ((i == ITEM_POWDER_KEG) && (ammo == 1)) || ((i == ITEM_PICTOGRAPH_BOX) && (ammo == 1)) || + ((i == ITEM_MAGIC_BEANS) && (ammo == 20))) { + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 120, 255, 0, alpha); + } + + if ((u32)ammo == 0) { + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 100, 100, 100, alpha); + } + + for (i = 0; ammo >= 10; i++) { + ammo -= 10; + } + + // Draw upper digit (tens) + if ((u32)i != 0) { + HudEditor_SetActiveElement(HUD_EDITOR_ELEMENT_D_PAD); + OVERLAY_DISP = Gfx_DrawTexRectIA8(OVERLAY_DISP, gAmmoDigitTextures[i], 8, 8, + sDpadItemAmmoX[button], sDpadItemAmmoY[button], 8, 8, 1 << 10, 1 << 10); + } + + // Draw lower digit (ones) + HudEditor_SetActiveElement(HUD_EDITOR_ELEMENT_D_PAD); + OVERLAY_DISP = Gfx_DrawTexRectIA8(OVERLAY_DISP, gAmmoDigitTextures[ammo], 8, 8, + sDpadItemAmmoX[button] + 6, sDpadItemAmmoY[button], 8, 8, 1 << 10, 1 << 10); + } + + CLOSE_DISPS(play->state.gfxCtx); +} +// #endregion + void Interface_DrawItemIconTexture(PlayState* play, TexturePtr texture, s16 button) { static s16 D_801BFAFC[] = { 30, 24, 24, 24 }; @@ -4714,6 +5672,67 @@ void Interface_DrawCButtonIcons(PlayState* play) { CLOSE_DISPS(play->state.gfxCtx); } +void Interface_DrawDButtonIcons(PlayState* play) { + InterfaceContext* interfaceCtx = &play->interfaceCtx; + DpadInterface* dpadInterfaceCtx = &play->interfaceCtx.shipInterface.dpad; + + OPEN_DISPS(play->state.gfxCtx); + + gDPPipeSync(OVERLAY_DISP++); + + // D-Right Button Icon & Ammo Count + if (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) < ITEM_F0) { + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, dpadInterfaceCtx->dRightAlpha); + gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + Interface_Dpad_DrawItemIconTexture(play, interfaceCtx->iconItemSegment[EQUIP_SLOT_D_RIGHT + EQUIP_SLOT_MAX], EQUIP_SLOT_D_RIGHT); + gDPPipeSync(OVERLAY_DISP++); + gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, + PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); + Interface_Dpad_DrawAmmoCount(play, EQUIP_SLOT_D_RIGHT, dpadInterfaceCtx->dRightAlpha); + } + + gDPPipeSync(OVERLAY_DISP++); + + // D-Left Button Icon & Ammo Count + if (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) < ITEM_F0) { + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, dpadInterfaceCtx->dLeftAlpha); + gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + Interface_Dpad_DrawItemIconTexture(play, interfaceCtx->iconItemSegment[EQUIP_SLOT_D_LEFT + EQUIP_SLOT_MAX], EQUIP_SLOT_D_LEFT); + gDPPipeSync(OVERLAY_DISP++); + gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, + PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); + Interface_Dpad_DrawAmmoCount(play, EQUIP_SLOT_D_LEFT, dpadInterfaceCtx->dLeftAlpha); + } + + gDPPipeSync(OVERLAY_DISP++); + + // D-Down Button Icon & Ammo Count + if (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) < ITEM_F0) { + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, dpadInterfaceCtx->dDownAlpha); + gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + Interface_Dpad_DrawItemIconTexture(play, interfaceCtx->iconItemSegment[EQUIP_SLOT_D_DOWN + EQUIP_SLOT_MAX], EQUIP_SLOT_D_DOWN); + gDPPipeSync(OVERLAY_DISP++); + gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, + PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); + Interface_Dpad_DrawAmmoCount(play, EQUIP_SLOT_D_DOWN, dpadInterfaceCtx->dDownAlpha); + } + + gDPPipeSync(OVERLAY_DISP++); + + // D-Up Button Icon & Ammo Count + if (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) < ITEM_F0) { + gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, dpadInterfaceCtx->dUpAlpha); + gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); + Interface_Dpad_DrawItemIconTexture(play, interfaceCtx->iconItemSegment[EQUIP_SLOT_D_UP + EQUIP_SLOT_MAX], EQUIP_SLOT_D_UP); + gDPPipeSync(OVERLAY_DISP++); + gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, + PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0); + Interface_Dpad_DrawAmmoCount(play, EQUIP_SLOT_D_UP, dpadInterfaceCtx->dUpAlpha); + } + + CLOSE_DISPS(play->state.gfxCtx); +} + void Interface_DrawAButton(PlayState* play) { InterfaceContext* interfaceCtx = &play->interfaceCtx; s16 aAlpha; @@ -7114,6 +8133,12 @@ void Interface_Draw(PlayState* play) { } Interface_DrawCButtonIcons(play); + // #region 2S2H [Dpad] + if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { + Interface_DrawDButtonIcons(play); + } + // #endregion + Interface_DrawAButton(play); Interface_DrawPauseMenuEquippingIcons(play); @@ -7840,11 +8865,13 @@ void Interface_Init(PlayState* play) { Interface_NewDay(play, CURRENT_DAY); - interfaceCtx->iconItemSegment = THA_AllocTailAlign16(&play->state.tha, sizeof(char*) * EQUIP_SLOT_MAX); - for (size_t id = 0; id < EQUIP_SLOT_MAX; id++) { + // #region 2S2H [Dpad] Increase Size of iconItemSegment for dpad + interfaceCtx->iconItemSegment = THA_AllocTailAlign16(&play->state.tha, sizeof(char*) * (EQUIP_SLOT_MAX + EQUIP_SLOT_D_MAX)); + for (size_t id = 0; id < (EQUIP_SLOT_MAX + EQUIP_SLOT_D_MAX); id++) { interfaceCtx->iconItemSegment[id] = gEmptyTexture; } - // #endregion + // #endregion [Dpad] + // #endregion [Port] if (CUR_FORM_EQUIP(EQUIP_SLOT_B) < ITEM_F0) { Interface_LoadItemIconImpl(play, EQUIP_SLOT_B); @@ -7864,6 +8891,26 @@ void Interface_Init(PlayState* play) { Interface_LoadItemIconImpl(play, EQUIP_SLOT_C_RIGHT); } + // #region 2S2H [Dpad] + if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { + if (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) < ITEM_F0) { + Interface_Dpad_LoadItemIconImpl(play, EQUIP_SLOT_D_RIGHT); + } + + if (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) < ITEM_F0) { + Interface_Dpad_LoadItemIconImpl(play, EQUIP_SLOT_D_LEFT); + } + + if (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) < ITEM_F0) { + Interface_Dpad_LoadItemIconImpl(play, EQUIP_SLOT_D_DOWN); + } + + if (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) < ITEM_F0) { + Interface_Dpad_LoadItemIconImpl(play, EQUIP_SLOT_D_UP); + } + } + // #endregion + if (((gSaveContext.timerStates[TIMER_ID_MINIGAME_2] == TIMER_STATE_COUNTING) || (gSaveContext.timerStates[TIMER_ID_GORON_RACE_UNUSED] == TIMER_STATE_COUNTING)) && ((gSaveContext.respawnFlag == -1) || (gSaveContext.respawnFlag == 1)) && diff --git a/mm/src/code/z_player_lib.c b/mm/src/code/z_player_lib.c index f90867392..91602bf64 100644 --- a/mm/src/code/z_player_lib.c +++ b/mm/src/code/z_player_lib.c @@ -574,6 +574,16 @@ s32 func_801235DC(PlayState* play, f32 arg1, s16 arg2) { return false; } +// #region 2S2H [Dpad] +ItemId Player_Dpad_GetItemOnButton(PlayState* play, Player* player, DpadEquipSlot slot) { + if (slot >= EQUIP_SLOT_D_MAX) { + return ITEM_NONE; + } + + return DPAD_BTN_ITEM(slot); +} +// #endregion + ItemId Player_GetItemOnButton(PlayState* play, Player* player, EquipSlot slot) { if (slot >= EQUIP_SLOT_A) { return ITEM_NONE; @@ -614,6 +624,15 @@ ItemId Player_GetItemOnButton(PlayState* play, Player* player, EquipSlot slot) { return C_BTN_ITEM(EQUIP_SLOT_C_RIGHT); } +// #region 2S2H [Dpad] +u16 sDItemButtons[] = { + BTN_DRIGHT, + BTN_DLEFT, + BTN_DDOWN, + BTN_DUP, +}; +// #endregion + u16 sCItemButtons[] = { BTN_CLEFT, BTN_CDOWN, @@ -657,6 +676,29 @@ PlayerItemAction func_80123810(PlayState* play) { } } } + // #region 2S2H [Dpad] + if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { + for (i = 0; i < ARRAY_COUNT(sDItemButtons); i++) { + if (CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, sDItemButtons[i])) { + itemId = Player_Dpad_GetItemOnButton(play, player, i); + + play->interfaceCtx.unk_222 = 0; + play->interfaceCtx.unk_224 = 0; + Interface_SetHudVisibility(play->msgCtx.hudVisibility); + + if ((itemId >= ITEM_FD) || ((itemAction = play->unk_18794(play, player, itemId)) <= PLAYER_IA_MINUS1)) { + Audio_PlaySfx(NA_SE_SY_ERROR); + return PLAYER_IA_MINUS1; + } else { + s32 pad; + + player->heldItemButton = DPAD_TO_HELD_ITEM(i); + return itemAction; + } + } + } + } + // #endregion return PLAYER_IA_NONE; } @@ -1316,7 +1358,13 @@ void Player_SetEquipmentData(PlayState* play, Player* player) { } void Player_UpdateBottleHeld(PlayState* play, Player* player, ItemId itemId, PlayerItemAction itemAction) { - Inventory_UpdateBottleItem(play, itemId, player->heldItemButton); + // #region 2S2H [Dpad] + if (IS_HELD_DPAD(player->heldItemButton)) { + Inventory_Dpad_UpdateBottleItem(play, itemId, HELD_ITEM_TO_DPAD(player->heldItemButton)); + } else { + Inventory_UpdateBottleItem(play, itemId, player->heldItemButton); + } + // #endregion if (itemId != ITEM_BOTTLE) { player->heldItemId = itemId; diff --git a/mm/src/code/z_sram_NES.c b/mm/src/code/z_sram_NES.c index 5bbef1343..65f64dfcb 100644 --- a/mm/src/code/z_sram_NES.c +++ b/mm/src/code/z_sram_NES.c @@ -555,6 +555,14 @@ void Sram_SaveEndOfCycle(PlayState* play) { Interface_LoadItemIconImpl(play, j); } } + // #region 2S2H [Dpad] + for (s32 k = EQUIP_SLOT_D_RIGHT; k <= EQUIP_SLOT_D_UP; k++) { + if (DPAD_GET_CUR_FORM_BTN_ITEM(k) == gSaveContext.save.saveInfo.inventory.items[i]) { + DPAD_SET_CUR_FORM_BTN_ITEM(k, ITEM_BOTTLE); + Interface_Dpad_LoadItemIconImpl(play, k); + } + } + // #endregion gSaveContext.save.saveInfo.inventory.items[i] = ITEM_BOTTLE; } } @@ -623,6 +631,14 @@ void Sram_SaveEndOfCycle(PlayState* play) { Interface_LoadItemIconImpl(play, j); } } + // #region 2S2H [Dpad] + for (s32 k = EQUIP_SLOT_D_RIGHT; k <= EQUIP_SLOT_D_UP; k++) { + if ((DPAD_GET_CUR_FORM_BTN_ITEM(k) >= ITEM_MOONS_TEAR) && (DPAD_GET_CUR_FORM_BTN_ITEM(k) <= ITEM_PENDANT_OF_MEMORIES)) { + DPAD_SET_CUR_FORM_BTN_ITEM(k, ITEM_NONE); + Interface_Dpad_LoadItemIconImpl(play, k); + } + } + // #endregion gSaveContext.save.saveInfo.skullTokenCount &= ~0xFFFF0000; gSaveContext.save.saveInfo.skullTokenCount &= ~0x0000FFFF; @@ -813,6 +829,23 @@ ItemEquips sSaveDefaultItemEquips = { 0x11, }; +// #region 2S2H +DpadSaveInfo sSaveDefaultDpadItemEquips = { + { + { ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE }, + { ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE }, + { ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE }, + { ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE }, + }, + { + { SLOT_NONE, SLOT_NONE, SLOT_NONE, SLOT_NONE }, + { SLOT_NONE, SLOT_NONE, SLOT_NONE, SLOT_NONE }, + { SLOT_NONE, SLOT_NONE, SLOT_NONE, SLOT_NONE }, + { SLOT_NONE, SLOT_NONE, SLOT_NONE, SLOT_NONE }, + }, +}; +// #endregion + Inventory sSaveDefaultInventory = { // items { @@ -937,6 +970,9 @@ void Sram_InitNewSave(void) { memcpy(&gSaveContext.save.saveInfo.playerData, &sSaveDefaultPlayerData, sizeof(SavePlayerData)); memcpy(&gSaveContext.save.saveInfo.equips, &sSaveDefaultItemEquips, sizeof(ItemEquips)); + // #region 2S2H [Dpad] + memcpy(&gSaveContext.save.shipSaveInfo.dpadEquips, &sSaveDefaultDpadItemEquips, sizeof(DpadSaveInfo)); + // #endregion memcpy(&gSaveContext.save.saveInfo.inventory, &sSaveDefaultInventory, sizeof(Inventory)); memcpy(&gSaveContext.save.saveInfo.checksum, &sSaveDefaultChecksum, sizeof(gSaveContext.save.saveInfo.checksum)); @@ -1142,6 +1178,9 @@ void Sram_InitDebugSave(void) { memcpy(&gSaveContext.save.saveInfo.playerData, &sSaveDebugPlayerData, sizeof(SavePlayerData)); memcpy(&gSaveContext.save.saveInfo.equips, &sSaveDebugItemEquips, sizeof(ItemEquips)); + // #region 2S2H [Dpad] + memcpy(&gSaveContext.save.shipSaveInfo.dpadEquips, &sSaveDefaultDpadItemEquips, sizeof(DpadSaveInfo)); + // #endregion memcpy(&gSaveContext.save.saveInfo.inventory, &sSaveDebugInventory, sizeof(Inventory)); memcpy(&gSaveContext.save.saveInfo.checksum, &sSaveDebugChecksum, sizeof(gSaveContext.save.saveInfo.checksum)); diff --git a/mm/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c b/mm/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c index ea2bb3850..87728b6c6 100644 --- a/mm/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c +++ b/mm/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c @@ -266,7 +266,7 @@ void ArmsHook_Shoot(ArmsHook* this, PlayState* play) { Audio_PlaySfx_AtPos(&this->actor.projectedPos, NA_SE_IT_HOOKSHOT_REFLECT); } } else if (CHECK_BTN_ANY(CONTROLLER1(&play->state)->press.button, - BTN_A | BTN_B | BTN_R | BTN_CUP | BTN_CLEFT | BTN_CRIGHT | BTN_CDOWN)) { + BTN_A | BTN_B | BTN_R | BTN_CUP | BTN_CLEFT | BTN_CRIGHT | BTN_CDOWN | BTN_DPAD_EQUIP)) { s32 pad; this->timer = 1; diff --git a/mm/src/overlays/actors/ovl_Boss_02/z_boss_02.c b/mm/src/overlays/actors/ovl_Boss_02/z_boss_02.c index 8bde2289b..276b5d2b2 100644 --- a/mm/src/overlays/actors/ovl_Boss_02/z_boss_02.c +++ b/mm/src/overlays/actors/ovl_Boss_02/z_boss_02.c @@ -1715,7 +1715,7 @@ void Boss02_HandleGiantsMaskCutscene(Boss02* this, PlayState* play) { case GIANTS_MASK_CS_STATE_MASK_ON: if ((this->giantsMaskCsTimer < 80) && sCanSkipMaskOnCs && CHECK_BTN_ANY(CONTROLLER1(&play->state)->press.button, - BTN_A | BTN_B | BTN_CUP | BTN_CDOWN | BTN_CLEFT | BTN_CRIGHT)) { + BTN_A | BTN_B | BTN_CUP | BTN_CDOWN | BTN_CLEFT | BTN_CRIGHT | BTN_DPAD_EQUIP)) { this->giantsMaskCsState++; this->giantsMaskCsFlashState = GIANTS_MASK_CS_FLASH_STATE_STARTED; this->giantsMaskCsTimer = 0; @@ -1769,7 +1769,7 @@ void Boss02_HandleGiantsMaskCutscene(Boss02* this, PlayState* play) { case GIANTS_MASK_CS_STATE_MASK_OFF: if ((this->giantsMaskCsTimer < 30) && sCanSkipMaskOffCs && CHECK_BTN_ANY(CONTROLLER1(&play->state)->press.button, - BTN_A | BTN_B | BTN_CUP | BTN_CDOWN | BTN_CLEFT | BTN_CRIGHT)) { + BTN_A | BTN_B | BTN_CUP | BTN_CDOWN | BTN_CLEFT | BTN_CRIGHT | BTN_DPAD_EQUIP)) { this->giantsMaskCsState++; this->giantsMaskCsFlashState = GIANTS_MASK_CS_FLASH_STATE_STARTED; this->giantsMaskCsTimer = 0; diff --git a/mm/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c b/mm/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c index d76e0cd98..6c4160133 100644 --- a/mm/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c +++ b/mm/src/overlays/actors/ovl_En_Fsn/z_en_fsn.c @@ -962,7 +962,13 @@ void EnFsn_DeterminePrice(EnFsn* this, PlayState* play) { itemAction = func_80123810(play); if (itemAction > PLAYER_IA_NONE) { - buttonItem = GET_CUR_FORM_BTN_ITEM(player->heldItemButton); + // #region 2S2H [Dpad] + if (IS_HELD_DPAD(player->heldItemButton)) { + buttonItem = DPAD_GET_CUR_FORM_BTN_ITEM(HELD_ITEM_TO_DPAD(player->heldItemButton)); + } else { + buttonItem = GET_CUR_FORM_BTN_ITEM(player->heldItemButton); + } + // #endregion this->price = (buttonItem < ITEM_MOONS_TEAR) ? gItemPrices[buttonItem] : 0; if (this->price > 0) { player->actor.textId = 0x29EF; diff --git a/mm/src/overlays/actors/ovl_player_actor/z_player.c b/mm/src/overlays/actors/ovl_player_actor/z_player.c index 617ef262a..e811953a6 100644 --- a/mm/src/overlays/actors/ovl_player_actor/z_player.c +++ b/mm/src/overlays/actors/ovl_player_actor/z_player.c @@ -3615,6 +3615,40 @@ s32 Player_ItemIsItemAction(Player* this, ItemId item, PlayerItemAction itemActi } } +// #region 2S2H [Dpad] +DpadEquipSlot func_Dpad_8082FD0C(Player* this, PlayerItemAction itemAction) { + s32 btn; + + for (btn = EQUIP_SLOT_D_RIGHT; btn <= EQUIP_SLOT_D_UP; btn++) { + if (Player_ItemIsItemAction(this, DPAD_GET_CUR_FORM_BTN_ITEM(btn), itemAction)) { + return btn; + } + } + + return EQUIP_SLOT_D_NONE; +} + +u16 sDpadItemButtons[] = { + BTN_DRIGHT, + BTN_DLEFT, + BTN_DDOWN, + BTN_DUP, +}; + +// Return currently-pressed button, in order of priority DRIGHT, DLEFT, DDOWN, DUP. +DpadEquipSlot func_Dpad_8082FDC4(void) { + DpadEquipSlot i; + + for (i = 0; i < ARRAY_COUNT(sDpadItemButtons); i++) { + if (CHECK_BTN_ALL(sPlayerControlInput->press.button, sDpadItemButtons[i])) { + break; + } + } + + return i; +} +// #endregion + EquipSlot func_8082FD0C(Player* this, PlayerItemAction itemAction) { s32 btn; @@ -3667,11 +3701,32 @@ void Player_ProcessItemButtons(Player* this, PlayState* play) { if (this->transformation == PLAYER_FORM_HUMAN) { if (this->currentMask != PLAYER_MASK_NONE) { PlayerItemAction maskItemAction = GET_IA_FROM_MASK(this->currentMask); - EquipSlot btn = func_8082FD0C(this, maskItemAction); + // #region 2S2H [Dpad] - Changed from EquipSlot to s32 to allow for higher ranges + s32 btn = func_8082FD0C(this, maskItemAction); + + if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { + if (btn <= EQUIP_SLOT_NONE) { + DpadEquipSlot dpadBtn = func_Dpad_8082FD0C(this, maskItemAction); + + if (dpadBtn > EQUIP_SLOT_D_NONE) { + btn = DPAD_TO_HELD_ITEM(dpadBtn); + } + } + } + // #endregion if (btn <= EQUIP_SLOT_NONE) { + // #region 2S2H [Dpad] - need to convert between helditem value to actual item + ItemId maskItem; + if (IS_HELD_DPAD(this->unk_154)) { + maskItem = DPAD_GET_CUR_FORM_BTN_ITEM(HELD_ITEM_TO_DPAD(this->unk_154)); + } else { + maskItem = GET_CUR_FORM_BTN_ITEM(this->unk_154); + } + s32 maskIdMinusOne = - GET_MASK_FROM_IA(Player_ItemToItemAction(this, GET_CUR_FORM_BTN_ITEM(this->unk_154))) - 1; + GET_MASK_FROM_IA(Player_ItemToItemAction(this, maskItem)) - 1; + // #endregion if ((maskIdMinusOne < PLAYER_MASK_TRUTH - 1) || (maskIdMinusOne >= PLAYER_MASK_MAX - 1)) { maskIdMinusOne = this->currentMask - 1; @@ -3691,6 +3746,13 @@ void Player_ProcessItemButtons(Player* this, PlayState* play) { if (((this->actor.id == ACTOR_PLAYER) && (this->itemAction >= PLAYER_IA_FISHING_ROD)) && !(((Player_GetHeldBButtonSword(this) == PLAYER_B_SWORD_NONE) || (gSaveContext.jinxTimer == 0)) && (Player_ItemIsInUse(this, (IREG(1) != 0) ? ITEM_FISHING_ROD : Inventory_GetBtnBItem(play)) || + // #region 2S2H [Dpad] + (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0) && + (Player_ItemIsInUse(this, DPAD_BTN_ITEM(EQUIP_SLOT_D_RIGHT)) || + Player_ItemIsInUse(this, DPAD_BTN_ITEM(EQUIP_SLOT_D_LEFT)) || + Player_ItemIsInUse(this, DPAD_BTN_ITEM(EQUIP_SLOT_D_DOWN)) || + Player_ItemIsInUse(this, DPAD_BTN_ITEM(EQUIP_SLOT_D_UP)))) || + // #end region Player_ItemIsInUse(this, C_BTN_ITEM(EQUIP_SLOT_C_LEFT)) || Player_ItemIsInUse(this, C_BTN_ITEM(EQUIP_SLOT_C_DOWN)) || Player_ItemIsInUse(this, C_BTN_ITEM(EQUIP_SLOT_C_RIGHT))))) { @@ -3707,6 +3769,19 @@ void Player_ProcessItemButtons(Player* this, PlayState* play) { item = Player_GetItemOnButton(play, this, i); + // #region 2S2H [Dpad] + if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { + if (i >= EQUIP_SLOT_A) { + DpadEquipSlot j = func_Dpad_8082FDC4(); + ItemId dpadItem = Player_Dpad_GetItemOnButton(play, this, j); + if (dpadItem < item) { + item = dpadItem; + } + i = (j >= EQUIP_SLOT_D_MAX) ? i : DPAD_TO_HELD_ITEM(j); + } + } + // #endregion + if (item >= ITEM_FD) { for (i = 0; i < ARRAY_COUNT(sPlayerItemButtons); i++) { if (CHECK_BTN_ALL(sPlayerControlInput->cur.button, sPlayerItemButtons[i])) { @@ -3718,6 +3793,20 @@ void Player_ProcessItemButtons(Player* this, PlayState* play) { if ((item < ITEM_FD) && (Player_ItemToItemAction(this, item) == this->heldItemAction)) { sPlayerHeldItemButtonIsHeldDown = true; } + // #region 2S2H [Dpad] + else if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { + for (i = 0; i < ARRAY_COUNT(sDpadItemButtons); i++) { + if (CHECK_BTN_ALL(sPlayerControlInput->cur.button, sDpadItemButtons[i])) { + break; + } + } + + item = Player_Dpad_GetItemOnButton(play, this, i); + if ((item < ITEM_FD) && (Player_ItemToItemAction(this, item) == this->heldItemAction)) { + sPlayerHeldItemButtonIsHeldDown = true; + } + } + // #endregion } else if (item == ITEM_F0) { if (this->blastMaskTimer == 0) { EnBom* bomb = (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.focus.pos.x, @@ -4102,7 +4191,7 @@ s32 func_80830FD4(PlayState* play) { return (play->bButtonAmmoPlusOne != 0) && ((play->bButtonAmmoPlusOne < 0) || CHECK_BTN_ANY(sPlayerControlInput->cur.button, - BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_CUP | BTN_B | BTN_A)); + BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_CUP | BTN_B | BTN_A | BTN_DPAD_EQUIP)); } s32 func_80831010(Player* this, PlayState* play) { @@ -4362,6 +4451,13 @@ void func_80831944(PlayState* play, Player* this) { if (Player_GetItemOnButton(play, this, func_8082FDC4()) == ITEM_LENS_OF_TRUTH) { func_808318C0(play); } + // #region 2S2H [Dpad] + else if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { + if (Player_Dpad_GetItemOnButton(play, this, func_Dpad_8082FDC4()) == ITEM_LENS_OF_TRUTH) { + func_808318C0(play); + } + } + // #endregion } void Player_UseItem(PlayState* play, Player* this, ItemId item) { @@ -9196,7 +9292,7 @@ s32 func_8083D738(Player* this, Actor* heldActor) { s32 Player_ActionChange_9(Player* this, PlayState* play) { if (this->stateFlags1 & PLAYER_STATE1_800) { if ((this->heldActor != NULL) && - CHECK_BTN_ANY(sPlayerControlInput->press.button, BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_B | BTN_A)) { + CHECK_BTN_ANY(sPlayerControlInput->press.button, BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_B | BTN_A | BTN_DPAD_EQUIP)) { if (!func_808313A8(play, this, this->heldActor)) { if (!func_8083D738(this, this->heldActor)) { Player_SetAction(play, this, Player_Action_41, 1); @@ -14735,7 +14831,7 @@ void Player_Action_25(Player* this, PlayState* play) { if (this->stateFlags1 & PLAYER_STATE1_800) { heldActor = this->heldActor; if (!func_808313A8(play, this, heldActor) && (heldActor->id == ACTOR_EN_NIW) && - CHECK_BTN_ANY(sPlayerControlInput->press.button, BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_B | BTN_A)) { + CHECK_BTN_ANY(sPlayerControlInput->press.button, BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_B | BTN_A | BTN_DPAD_EQUIP)) { func_808409A8(play, this, this->linearVelocity + 2.0f, this->actor.velocity.y + 2.0f); } } @@ -15466,7 +15562,7 @@ void Player_Action_38(Player* this, PlayState* play) { } else if (PlayerAnimation_OnFrame(&this->skelAnime, 25.0f)) { Player_AnimSfx_PlayVoice(this, NA_SE_VO_LI_SWORD_L); } - } else if (CHECK_BTN_ANY(sPlayerControlInput->press.button, BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_B | BTN_A)) { + } else if (CHECK_BTN_ANY(sPlayerControlInput->press.button, BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_B | BTN_A | BTN_DPAD_EQUIP)) { Player_SetAction(play, this, Player_Action_39, 1); Player_AnimationPlayOnce(play, this, &gPlayerAnim_link_silver_throw); } @@ -15564,7 +15660,7 @@ void Player_Action_43(Player* this, PlayState* play) { (!func_800B7128(this) && !func_8082EF20(this))))) || ((this->unk_AA5 == PLAYER_UNKAA5_1) && CHECK_BTN_ANY(sPlayerControlInput->press.button, - BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_CUP | BTN_R | BTN_B | BTN_A))) || + BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_CUP | BTN_R | BTN_B | BTN_A | BTN_DPAD_EQUIP))) || Player_ActionChange_4(this, play)))) { func_80839ED0(this, play); Audio_PlaySfx(NA_SE_SY_CAMERA_ZOOM_UP); @@ -17371,6 +17467,36 @@ void Player_Action_68(Player* this, PlayState* play) { } } } + // #region 2S2H [Dpad] + else if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { + if (Player_Dpad_GetItemOnButton(play, this, HELD_ITEM_TO_DPAD(this->heldItemButton)) == ITEM_BOTTLE) { + Actor* interactRangeActor = this->interactRangeActor; + + if (interactRangeActor != NULL) { + struct_8085D798* entry = D_8085D798; + s32 i; + + for (i = 0; i < ARRAY_COUNT(D_8085D798); i++) { + if (((interactRangeActor->id == entry->actorId) && + ((entry->actorParams <= BOTTLE_CATCH_PARAMS_ANY) || + (interactRangeActor->params == entry->actorParams)))) { + break; + } + entry++; + } + + if (i < ARRAY_COUNT(D_8085D798)) { + this->av1.actionVar1 = i + 1; + this->av2.actionVar2 = 0; + this->stateFlags1 |= PLAYER_STATE1_10000000 | PLAYER_STATE1_20000000; + interactRangeActor->parent = &this->actor; + Player_UpdateBottleHeld(play, this, entry->itemId, entry->itemAction); + func_8082DB90(play, this, sp24->unk_4); + } + } + } + } + // #endregion } } @@ -17732,10 +17858,18 @@ void Player_Action_80(Player* this, PlayState* play) { play->actorCtx.flags |= ACTORCTX_FLAG_PICTO_BOX_ON; } + // #region 2S2H [Dpad] + else if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { + if ((play->sceneId == SCENE_20SICHITAI) && + (Player_Dpad_GetItemOnButton(play, this, func_Dpad_8082FDC4()) == ITEM_PICTOGRAPH_BOX)) { + play->actorCtx.flags |= ACTORCTX_FLAG_PICTO_BOX_ON; + } + } + // #endregion } } } else if (CHECK_BTN_ANY(sPlayerControlInput->press.button, - BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_CUP | BTN_R | BTN_A)) { + BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_CUP | BTN_R | BTN_A | BTN_DPAD_EQUIP)) { play->bButtonAmmoPlusOne = -1; Player_Action_81(this, play); Player_SetAction(play, this, Player_Action_80, 0); @@ -18132,7 +18266,7 @@ void Player_Action_86(Player* this, PlayState* play) { (sp48 = ((this->transformation != PLAYER_FORM_HUMAN) || CHECK_WEEKEVENTREG(D_8085D908[GET_PLAYER_FORM])) && CHECK_BTN_ANY(sPlayerControlInput->press.button, - BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_CUP | BTN_B | BTN_A)))) { + BTN_CRIGHT | BTN_CLEFT | BTN_CDOWN | BTN_CUP | BTN_B | BTN_A | BTN_DPAD_EQUIP)))) { R_PLAY_FILL_SCREEN_ON = 45; R_PLAY_FILL_SCREEN_R = 220; R_PLAY_FILL_SCREEN_G = 220; diff --git a/mm/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c b/mm/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c index d7c38b6c0..e7928b75a 100644 --- a/mm/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c +++ b/mm/src/overlays/gamestates/ovl_file_choose/z_file_choose_NES.c @@ -2200,6 +2200,12 @@ void FileSelect_LoadGame(GameState* thisx) { gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_ENABLED; + // #region 2S2H + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT] = BTN_ENABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT] = BTN_ENABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN] = BTN_ENABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_UP] = BTN_ENABLED; + // #endregion gSaveContext.buttonStatus[EQUIP_SLOT_A] = BTN_ENABLED; gSaveContext.hudVisibilityForceButtonAlphasByStatus = false; @@ -2508,6 +2514,12 @@ void FileSelect_InitContext(GameState* thisx) { gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_ENABLED; + // #region 2S2H + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT] = BTN_ENABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT] = BTN_ENABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN] = BTN_ENABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_UP] = BTN_ENABLED; + // #endregion gSaveContext.buttonStatus[EQUIP_SLOT_A] = BTN_ENABLED; } diff --git a/mm/src/overlays/gamestates/ovl_select/z_select.c b/mm/src/overlays/gamestates/ovl_select/z_select.c index 8ecc65874..b0ffbc4ef 100644 --- a/mm/src/overlays/gamestates/ovl_select/z_select.c +++ b/mm/src/overlays/gamestates/ovl_select/z_select.c @@ -26,6 +26,12 @@ void MapSelect_LoadGame(MapSelectState* this, u32 entrance, s32 spawn) { gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_ENABLED; + // #region 2S2H + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT] = BTN_ENABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT] = BTN_ENABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN] = BTN_ENABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_UP] = BTN_ENABLED; + // #endregion gSaveContext.buttonStatus[EQUIP_SLOT_A] = BTN_ENABLED; gSaveContext.hudVisibilityForceButtonAlphasByStatus = false; gSaveContext.nextHudVisibility = HUD_VISIBILITY_IDLE; diff --git a/mm/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_item.c b/mm/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_item.c index 94171bb29..be7e79f8f 100644 --- a/mm/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_item.c +++ b/mm/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_item.c @@ -268,6 +268,18 @@ void KaleidoScope_DrawItemSelect(PlayState* play) { } } } + // #region 2S2H [Dpad] + if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { + for (i = EQUIP_SLOT_D_RIGHT; i <= EQUIP_SLOT_D_UP; i++, j += 4) { + if (DPAD_GET_CUR_FORM_BTN_ITEM(i) != ITEM_NONE) { + if (DPAD_GET_CUR_FORM_BTN_SLOT(i) < ITEM_NUM_SLOTS) { + gSPVertex(POLY_OPA_DISP++, &pauseCtx->itemVtx[j], 4, 0); + POLY_OPA_DISP = Gfx_DrawTexQuadIA8(POLY_OPA_DISP, gEquippedItemOutlineTex, 32, 32, 0); + } + } + } + } + // #endregion gDPPipeSync(POLY_OPA_DISP++); @@ -612,7 +624,7 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) { // Equip item to the C buttons if ((pauseCtx->debugEditor == DEBUG_EDITOR_NONE) && !pauseCtx->itemDescriptionOn && (pauseCtx->state == PAUSE_STATE_MAIN) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE) && - CHECK_BTN_ANY(CONTROLLER1(&play->state)->press.button, BTN_CLEFT | BTN_CDOWN | BTN_CRIGHT)) { + CHECK_BTN_ANY(CONTROLLER1(&play->state)->press.button, BTN_CLEFT | BTN_CDOWN | BTN_CRIGHT | BTN_DPAD_EQUIP)) { // Ensure that a transformation mask can not be unequipped while being used if (GET_PLAYER_FORM != PLAYER_FORM_HUMAN) { @@ -633,6 +645,31 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) { return; } } + // #region 2S2H [Dpad] + else if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { + if (CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_DRIGHT)) { + if (sPlayerFormItems[GET_PLAYER_FORM] == DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT)) { + Audio_PlaySfx(NA_SE_SY_ERROR); + return; + } + } else if (CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_DLEFT)) { + if (sPlayerFormItems[GET_PLAYER_FORM] == DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT)) { + Audio_PlaySfx(NA_SE_SY_ERROR); + return; + } + } else if (CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_DDOWN)) { + if (sPlayerFormItems[GET_PLAYER_FORM] == DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN)) { + Audio_PlaySfx(NA_SE_SY_ERROR); + return; + } + } else if (CHECK_BTN_ALL(CONTROLLER1(&play->state)->press.button, BTN_DUP)) { + if (sPlayerFormItems[GET_PLAYER_FORM] == DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP)) { + Audio_PlaySfx(NA_SE_SY_ERROR); + return; + } + } + } + // #endregion } // Ensure that a non-transformation mask can not be unequipped while being used @@ -658,6 +695,39 @@ 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; + } + } + // #endregion // Equip item to the C buttons pauseCtx->equipTargetItem = cursorItem; @@ -712,8 +782,688 @@ void KaleidoScope_UpdateItemCursor(PlayState* play) { } } -s16 sCButtonPosX[] = { 660, 900, 1140 }; -s16 sCButtonPosY[] = { 1100, 920, 1100 }; +s16 sCButtonPosX[] = { + 660, 900, 1140, + // #region 2S2H [Dpad] + 1340, 860, 1100, 1100 + // #endregion +}; +s16 sCButtonPosY[] = { + 1100, 920, 1100, + // #region 2S2H [Dpad] + 620, 620, 440, 760 + // #endregion +}; + +// #region 2S2H [Dpad] +void KaleidoScope_SwapDpadItemToCItem(PlayState* play, EquipSlot cEquipSlot) { + PauseContext* pauseCtx = &play->pauseCtx; + + if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT)) { + if ((BUTTON_ITEM_EQUIP(0, cEquipSlot) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((BUTTON_ITEM_EQUIP(0, cEquipSlot) & 0xFF) == ITEM_BOW) || + (((BUTTON_ITEM_EQUIP(0, cEquipSlot) & 0xFF) >= ITEM_BOW_FIRE) && + ((BUTTON_ITEM_EQUIP(0, cEquipSlot) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) = BUTTON_ITEM_EQUIP(0, cEquipSlot); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT) = C_SLOT_EQUIP(0, cEquipSlot); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_RIGHT); + } + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT)) { + if ((BUTTON_ITEM_EQUIP(0, cEquipSlot) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((BUTTON_ITEM_EQUIP(0, cEquipSlot) & 0xFF) == ITEM_BOW) || + (((BUTTON_ITEM_EQUIP(0, cEquipSlot) & 0xFF) >= ITEM_BOW_FIRE) && + ((BUTTON_ITEM_EQUIP(0, cEquipSlot) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) = BUTTON_ITEM_EQUIP(0, cEquipSlot); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT) = C_SLOT_EQUIP(0, cEquipSlot); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_LEFT); + } + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN)) { + if ((BUTTON_ITEM_EQUIP(0, cEquipSlot) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((BUTTON_ITEM_EQUIP(0, cEquipSlot) & 0xFF) == ITEM_BOW) || + (((BUTTON_ITEM_EQUIP(0, cEquipSlot) & 0xFF) >= ITEM_BOW_FIRE) && + ((BUTTON_ITEM_EQUIP(0, cEquipSlot) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) = BUTTON_ITEM_EQUIP(0, cEquipSlot); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN) = C_SLOT_EQUIP(0, cEquipSlot); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_DOWN); + } + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP)) { + if ((BUTTON_ITEM_EQUIP(0, cEquipSlot) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((BUTTON_ITEM_EQUIP(0, cEquipSlot) & 0xFF) == ITEM_BOW) || + (((BUTTON_ITEM_EQUIP(0, cEquipSlot) & 0xFF) >= ITEM_BOW_FIRE) && + ((BUTTON_ITEM_EQUIP(0, cEquipSlot) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) = BUTTON_ITEM_EQUIP(0, cEquipSlot); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP) = C_SLOT_EQUIP(0, cEquipSlot); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_UP); + } + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP) = SLOT_NONE; + } + } +} + +void KaleidoScope_UpdateDpadItemEquip(PlayState* play) { + PauseContext* pauseCtx = &play->pauseCtx; + + if (pauseCtx->equipTargetCBtn == PAUSE_EQUIP_D_RIGHT) { + // Swap if item is already equipped on other Item Buttons. + if (pauseCtx->equipTargetSlot == C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) == ITEM_BOW) || + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) >= ITEM_BOW_FIRE) && + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT); + C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_LEFT); + } + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) = ITEM_NONE; + C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) == ITEM_BOW) || + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) >= ITEM_BOW_FIRE) && + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT); + C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_DOWN); + } + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) = ITEM_NONE; + C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) == ITEM_BOW) || + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) >= ITEM_BOW_FIRE) && + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT); + C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_RIGHT); + } + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) = ITEM_NONE; + C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) == ITEM_BOW) || + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) >= ITEM_BOW_FIRE) && + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_LEFT); + } + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) == ITEM_BOW) || + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) >= ITEM_BOW_FIRE) && + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_DOWN); + } + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) == ITEM_BOW) || + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) >= ITEM_BOW_FIRE) && + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_UP); + } + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP) = SLOT_NONE; + } + } + + + // Special case for magic arrows + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) == ITEM_BOW) || + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) <= ITEM_BOW_LIGHT))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } + } else if (pauseCtx->equipTargetItem == ITEM_BOW) { + if ((BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) >= ITEM_BOW_FIRE) && + (BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) <= ITEM_BOW_LIGHT)) { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_LEFT); + } else if ((BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) >= ITEM_BOW_FIRE) && + (BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) <= ITEM_BOW_LIGHT)) { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_DOWN); + } else if ((BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) >= ITEM_BOW_FIRE) && + (BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) <= ITEM_BOW_LIGHT)) { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_RIGHT); + } else if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) <= ITEM_BOW_LIGHT)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_LEFT); + } else if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) <= ITEM_BOW_LIGHT)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_DOWN); + } else if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) <= ITEM_BOW_LIGHT)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_UP); + } + } + + // Equip item on DRight + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) = pauseCtx->equipTargetItem; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT) = pauseCtx->equipTargetSlot; + Interface_Dpad_LoadItemIconImpl(play, EQUIP_SLOT_D_RIGHT); + } else if (pauseCtx->equipTargetCBtn == PAUSE_EQUIP_D_LEFT) { + // Swap if item is already equipped on other Item Buttons. + if (pauseCtx->equipTargetSlot == C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) == ITEM_BOW) || + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) >= ITEM_BOW_FIRE) && + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT); + C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_LEFT); + } + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) = ITEM_NONE; + C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) == ITEM_BOW) || + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) >= ITEM_BOW_FIRE) && + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT); + C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_DOWN); + } + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) = ITEM_NONE; + C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) == ITEM_BOW) || + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) >= ITEM_BOW_FIRE) && + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT); + C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_RIGHT); + } + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) = ITEM_NONE; + C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) == ITEM_BOW) || + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) >= ITEM_BOW_FIRE) && + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_RIGHT); + } + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) == ITEM_BOW) || + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) >= ITEM_BOW_FIRE) && + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_DOWN); + } + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) == ITEM_BOW) || + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) >= ITEM_BOW_FIRE) && + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_UP); + } + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP) = SLOT_NONE; + } + } + + + // Special case for magic arrows + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) == ITEM_BOW) || + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) <= ITEM_BOW_LIGHT))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } + } else if (pauseCtx->equipTargetItem == ITEM_BOW) { + if ((BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) >= ITEM_BOW_FIRE) && + (BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) <= ITEM_BOW_LIGHT)) { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_LEFT); + } else if ((BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) >= ITEM_BOW_FIRE) && + (BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) <= ITEM_BOW_LIGHT)) { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_DOWN); + } else if ((BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) >= ITEM_BOW_FIRE) && + (BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) <= ITEM_BOW_LIGHT)) { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_RIGHT); + } else if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) <= ITEM_BOW_LIGHT)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_RIGHT); + } else if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) <= ITEM_BOW_LIGHT)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_DOWN); + } else if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) <= ITEM_BOW_LIGHT)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_UP); + } + } + + // Equip item on DLeft + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) = pauseCtx->equipTargetItem; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT) = pauseCtx->equipTargetSlot; + Interface_Dpad_LoadItemIconImpl(play, EQUIP_SLOT_D_LEFT); + } else if (pauseCtx->equipTargetCBtn == PAUSE_EQUIP_D_DOWN) { + // Swap if item is already equipped on other Item Buttons. + if (pauseCtx->equipTargetSlot == C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) == ITEM_BOW) || + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) >= ITEM_BOW_FIRE) && + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN); + C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_LEFT); + } + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) = ITEM_NONE; + C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) == ITEM_BOW) || + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) >= ITEM_BOW_FIRE) && + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN); + C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_DOWN); + } + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) = ITEM_NONE; + C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) == ITEM_BOW) || + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) >= ITEM_BOW_FIRE) && + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN); + C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_RIGHT); + } + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) = ITEM_NONE; + C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) == ITEM_BOW) || + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) >= ITEM_BOW_FIRE) && + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_RIGHT); + } + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) == ITEM_BOW) || + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) >= ITEM_BOW_FIRE) && + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_LEFT); + } + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) == ITEM_BOW) || + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) >= ITEM_BOW_FIRE) && + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_UP); + } + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP) = SLOT_NONE; + } + } + + + // Special case for magic arrows + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) == ITEM_BOW) || + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) <= ITEM_BOW_LIGHT))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } + } else if (pauseCtx->equipTargetItem == ITEM_BOW) { + if ((BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) >= ITEM_BOW_FIRE) && + (BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) <= ITEM_BOW_LIGHT)) { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_LEFT); + } else if ((BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) >= ITEM_BOW_FIRE) && + (BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) <= ITEM_BOW_LIGHT)) { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_DOWN); + } else if ((BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) >= ITEM_BOW_FIRE) && + (BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) <= ITEM_BOW_LIGHT)) { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_RIGHT); + } else if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) <= ITEM_BOW_LIGHT)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_RIGHT); + } else if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) <= ITEM_BOW_LIGHT)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_LEFT); + } else if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) <= ITEM_BOW_LIGHT)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_UP); + } + } + + // Equip item on DDown + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) = pauseCtx->equipTargetItem; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN) = pauseCtx->equipTargetSlot; + Interface_Dpad_LoadItemIconImpl(play, EQUIP_SLOT_D_DOWN); + } else if (pauseCtx->equipTargetCBtn == PAUSE_EQUIP_D_UP) { + // Swap if item is already equipped on other Item Buttons. + if (pauseCtx->equipTargetSlot == C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) == ITEM_BOW) || + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) >= ITEM_BOW_FIRE) && + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP); + C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_LEFT); + } + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) = ITEM_NONE; + C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) == ITEM_BOW) || + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) >= ITEM_BOW_FIRE) && + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP); + C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_DOWN); + } + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) = ITEM_NONE; + C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) == ITEM_BOW) || + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) >= ITEM_BOW_FIRE) && + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP); + C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_RIGHT); + } + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) = ITEM_NONE; + C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) == ITEM_BOW) || + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) >= ITEM_BOW_FIRE) && + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_RIGHT); + } + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) == ITEM_BOW) || + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) >= ITEM_BOW_FIRE) && + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_LEFT); + } + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) != ITEM_NONE) { + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8) && + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) == ITEM_BOW) || + (((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) >= ITEM_BOW_FIRE) && + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) <= ITEM_BOW_LIGHT)))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_DOWN); + } + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN) = SLOT_NONE; + } + } + + + // Special case for magic arrows + if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) == ITEM_BOW) || + ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) <= ITEM_BOW_LIGHT))) { + pauseCtx->equipTargetItem -= 0xB5 - ITEM_BOW_FIRE; + pauseCtx->equipTargetSlot = SLOT_BOW; + } + } else if (pauseCtx->equipTargetItem == ITEM_BOW) { + if ((BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) >= ITEM_BOW_FIRE) && + (BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) <= ITEM_BOW_LIGHT)) { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_LEFT); + } else if ((BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) >= ITEM_BOW_FIRE) && + (BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) <= ITEM_BOW_LIGHT)) { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_DOWN); + } else if ((BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) >= ITEM_BOW_FIRE) && + (BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) <= ITEM_BOW_LIGHT)) { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_RIGHT); + } else if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) <= ITEM_BOW_LIGHT)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_RIGHT); + } else if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) <= ITEM_BOW_LIGHT)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_LEFT); + } else if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) <= ITEM_BOW_LIGHT)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_DOWN); + } + } + + // Equip item on DUp + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) = pauseCtx->equipTargetItem; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP) = pauseCtx->equipTargetSlot; + Interface_Dpad_LoadItemIconImpl(play, EQUIP_SLOT_D_UP); + } +} +// #endregion void KaleidoScope_UpdateItemEquip(PlayState* play) { static s16 sEquipMagicArrowBowSlotHoldTimer = 0; @@ -846,6 +1596,11 @@ void KaleidoScope_UpdateItemEquip(PlayState* play) { C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT) = SLOT_NONE; } } + // #region 2S2H [Dpad] + else if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { + KaleidoScope_SwapDpadItemToCItem(play, EQUIP_SLOT_C_LEFT); + } + // #endregion // Special case for magic arrows if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8)) { @@ -867,6 +1622,32 @@ void KaleidoScope_UpdateItemEquip(PlayState* play) { C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT) = C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT); Interface_LoadItemIcon(play, EQUIP_SLOT_C_RIGHT); } + // #region 2S2H [Dpad] + // Note Only C-Left has the swap of 'slot equips' here + else if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) <= ITEM_BOW_LIGHT)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) = BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT) = C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_RIGHT); + } else if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) <= ITEM_BOW_LIGHT)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) = BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT) = C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_LEFT); + } else if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) <= ITEM_BOW_LIGHT)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) = BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN) = C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_DOWN); + } else if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) <= ITEM_BOW_LIGHT)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) = BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP) = C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_UP); + } + } + // #endregion } // Equip item on CLeft @@ -910,6 +1691,11 @@ void KaleidoScope_UpdateItemEquip(PlayState* play) { C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT) = SLOT_NONE; } } + // #region 2S2H [Dpad] + else if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { + KaleidoScope_SwapDpadItemToCItem(play, EQUIP_SLOT_C_DOWN); + } + // #endregion // Special case for magic arrows if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8)) { @@ -929,13 +1715,35 @@ void KaleidoScope_UpdateItemEquip(PlayState* play) { BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) = BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN); Interface_LoadItemIcon(play, EQUIP_SLOT_C_RIGHT); } + // #region 2S2H [Dpad] + // Note Only C-Left has the swap of 'slot equips' here + else if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) <= ITEM_BOW_LIGHT)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) = BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_RIGHT); + } else if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) <= ITEM_BOW_LIGHT)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) = BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_LEFT); + } else if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) <= ITEM_BOW_LIGHT)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) = BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_DOWN); + } else if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) <= ITEM_BOW_LIGHT)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) = BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_UP); + } + } + // #endregion } // Equip item on CDown BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) = pauseCtx->equipTargetItem; C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN) = pauseCtx->equipTargetSlot; Interface_LoadItemIconImpl(play, EQUIP_SLOT_C_DOWN); - } else { // (pauseCtx->equipTargetCBtn == PAUSE_EQUIP_C_RIGHT) + } else if (pauseCtx->equipTargetCBtn == PAUSE_EQUIP_C_RIGHT) { // #Region 2S2H [Dpad] Added condition here to allow for other cases // Swap if item is already equipped on CLeft or CDown. if (pauseCtx->equipTargetSlot == C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT)) { if ((BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) & 0xFF) != ITEM_NONE) { @@ -972,6 +1780,11 @@ void KaleidoScope_UpdateItemEquip(PlayState* play) { C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN) = SLOT_NONE; } } + // #region 2S2H [Dpad] + else if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { + KaleidoScope_SwapDpadItemToCItem(play, EQUIP_SLOT_C_RIGHT); + } + // #endregion // Special case for magic arrows if ((pauseCtx->equipTargetItem >= 0xB5) && (pauseCtx->equipTargetItem < 0xB8)) { @@ -991,6 +1804,28 @@ void KaleidoScope_UpdateItemEquip(PlayState* play) { BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) = BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT); Interface_LoadItemIcon(play, EQUIP_SLOT_C_DOWN); } + // #region 2S2H [Dpad] + // Note Only C-Left has the swap of 'slot equips' here + else if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) <= ITEM_BOW_LIGHT)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) = BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_RIGHT); + } else if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) <= ITEM_BOW_LIGHT)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) = BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_LEFT); + } else if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) <= ITEM_BOW_LIGHT)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) = BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_DOWN); + } else if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) >= ITEM_BOW_FIRE) && + (DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) <= ITEM_BOW_LIGHT)) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) = BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_UP); + } + } + // #endregion } // Equip item on CRight @@ -998,6 +1833,11 @@ void KaleidoScope_UpdateItemEquip(PlayState* play) { C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT) = pauseCtx->equipTargetSlot; Interface_LoadItemIconImpl(play, EQUIP_SLOT_C_RIGHT); } + // #region 2S2H [Dpad] + else if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { + KaleidoScope_UpdateDpadItemEquip(play); + } + // #endregion // Reset params pauseCtx->mainState = PAUSE_MAIN_STATE_IDLE; diff --git a/mm/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.c b/mm/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.c index 7c984a09c..b487f39aa 100644 --- a/mm/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.c +++ b/mm/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_mask.c @@ -212,6 +212,18 @@ void KaleidoScope_DrawMaskSelect(PlayState* play) { } } } + // #region 2S2H [Dpad] + if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { + for (i = EQUIP_SLOT_D_RIGHT; i <= EQUIP_SLOT_D_UP; i++, j += 4) { + if (DPAD_GET_CUR_FORM_BTN_ITEM(i) != ITEM_NONE) { + if (DPAD_GET_CUR_FORM_BTN_SLOT(i) >= ITEM_NUM_SLOTS) { + gSPVertex(POLY_OPA_DISP++, &pauseCtx->maskVtx[j], 4, 0); + POLY_OPA_DISP = Gfx_DrawTexQuadIA8(POLY_OPA_DISP, gEquippedItemOutlineTex, 32, 32, 0); + } + } + } + } + // #endregion gDPPipeSync(POLY_OPA_DISP++); @@ -540,7 +552,7 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) { // Equip item to the C buttons if ((pauseCtx->debugEditor == DEBUG_EDITOR_NONE) && !pauseCtx->itemDescriptionOn && (pauseCtx->state == PAUSE_STATE_MAIN) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE) && - CHECK_BTN_ANY(input->press.button, BTN_CLEFT | BTN_CDOWN | BTN_CRIGHT)) { + CHECK_BTN_ANY(input->press.button, BTN_CLEFT | BTN_CDOWN | BTN_CRIGHT | BTN_DPAD_EQUIP)) { // Ensure that a mask is not unequipped while being used if (CHECK_BTN_ALL(input->press.button, BTN_CLEFT)) { @@ -568,6 +580,41 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) { return; } } + // #region 2S2H [Dpad] + else if (CHECK_BTN_ALL(input->press.button, BTN_DRIGHT)) { + if (((Player_GetCurMaskItemId(play) != ITEM_NONE) && + (Player_GetCurMaskItemId(play) == DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT))) || + ((sMaskPlayerFormItems[GET_PLAYER_FORM] != ITEM_NONE) && + (sMaskPlayerFormItems[GET_PLAYER_FORM] == DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT)))) { + Audio_PlaySfx(NA_SE_SY_ERROR); + return; + } + } else if (CHECK_BTN_ALL(input->press.button, BTN_DLEFT)) { + if (((Player_GetCurMaskItemId(play) != ITEM_NONE) && + (Player_GetCurMaskItemId(play) == DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT))) || + ((sMaskPlayerFormItems[GET_PLAYER_FORM] != ITEM_NONE) && + (sMaskPlayerFormItems[GET_PLAYER_FORM] == DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT)))) { + Audio_PlaySfx(NA_SE_SY_ERROR); + return; + } + } else if (CHECK_BTN_ALL(input->press.button, BTN_DDOWN)) { + if (((Player_GetCurMaskItemId(play) != ITEM_NONE) && + (Player_GetCurMaskItemId(play) == DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN))) || + ((sMaskPlayerFormItems[GET_PLAYER_FORM] != ITEM_NONE) && + (sMaskPlayerFormItems[GET_PLAYER_FORM] == DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN)))) { + Audio_PlaySfx(NA_SE_SY_ERROR); + return; + } + } else if (CHECK_BTN_ALL(input->press.button, BTN_DUP)) { + if (((Player_GetCurMaskItemId(play) != ITEM_NONE) && + (Player_GetCurMaskItemId(play) == DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP))) || + ((sMaskPlayerFormItems[GET_PLAYER_FORM] != ITEM_NONE) && + (sMaskPlayerFormItems[GET_PLAYER_FORM] == DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP)))) { + Audio_PlaySfx(NA_SE_SY_ERROR); + return; + } + } + // #endregion if ((Player_GetEnvironmentalHazard(play) >= PLAYER_ENV_HAZARD_UNDERWATER_FLOOR) && (Player_GetEnvironmentalHazard(play) <= PLAYER_ENV_HAZARD_UNDERWATER_FREE) && @@ -584,6 +631,19 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) { } else if (CHECK_BTN_ALL(input->press.button, BTN_CRIGHT)) { pauseCtx->equipTargetCBtn = PAUSE_EQUIP_C_RIGHT; } + // #region 2S2H [Dpad] + else if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { + if (CHECK_BTN_ALL(input->press.button, BTN_DRIGHT)) { + pauseCtx->equipTargetCBtn = PAUSE_EQUIP_D_RIGHT; + } else if (CHECK_BTN_ALL(input->press.button, BTN_DLEFT)) { + pauseCtx->equipTargetCBtn = PAUSE_EQUIP_D_LEFT; + } else if (CHECK_BTN_ALL(input->press.button, BTN_DDOWN)) { + pauseCtx->equipTargetCBtn = PAUSE_EQUIP_D_DOWN; + } else if (CHECK_BTN_ALL(input->press.button, BTN_DUP)) { + pauseCtx->equipTargetCBtn = PAUSE_EQUIP_D_UP; + } + } + // #endregion // Equip item to the C buttons pauseCtx->equipTargetItem = cursorItem; @@ -621,8 +681,316 @@ void KaleidoScope_UpdateMaskCursor(PlayState* play) { } } -s16 sMaskCButtonPosX[] = { 660, 900, 1140 }; -s16 sMaskCButtonPosY[] = { 1100, 920, 1100 }; +s16 sMaskCButtonPosX[] = { + 660, 900, 1140, + // #region 2S2H + 1340, 860, 1100, 1100 + // #endregion +}; +s16 sMaskCButtonPosY[] = { + 1100, 920, 1100, + // #region 2S2H + 620, 620, 440, 760 + // #endregion +}; + +// #region 2S2H [Dpad] +void KaleidoScope_SwapDpadMaskToCMask(PlayState* play, EquipSlot cEquipSlot) { + PauseContext* pauseCtx = &play->pauseCtx; + + if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT)) { + if ((BUTTON_ITEM_EQUIP(0, cEquipSlot) & 0xFF) != ITEM_NONE) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) = BUTTON_ITEM_EQUIP(0, cEquipSlot); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT) = C_SLOT_EQUIP(0, cEquipSlot); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_RIGHT); + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT)) { + if ((BUTTON_ITEM_EQUIP(0, cEquipSlot) & 0xFF) != ITEM_NONE) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) = BUTTON_ITEM_EQUIP(0, cEquipSlot); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT) = C_SLOT_EQUIP(0, cEquipSlot); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_LEFT); + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN)) { + if ((BUTTON_ITEM_EQUIP(0, cEquipSlot) & 0xFF) != ITEM_NONE) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) = BUTTON_ITEM_EQUIP(0, cEquipSlot); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN) = C_SLOT_EQUIP(0, cEquipSlot); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_DOWN); + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP)) { + if ((BUTTON_ITEM_EQUIP(0, cEquipSlot) & 0xFF) != ITEM_NONE) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) = BUTTON_ITEM_EQUIP(0, cEquipSlot); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP) = C_SLOT_EQUIP(0, cEquipSlot); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_UP); + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP) = SLOT_NONE; + } + } +} + +void KaleidoScope_UpdateDpadMaskEquip(PlayState* play) { + PauseContext* pauseCtx = &play->pauseCtx; + + if (pauseCtx->equipTargetCBtn == PAUSE_EQUIP_D_RIGHT) { + // Swap if mask is already equipped on other Item Buttons. + if (pauseCtx->equipTargetSlot == C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) != ITEM_NONE) { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT); + C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_LEFT); + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) = ITEM_NONE; + C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) != ITEM_NONE) { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT); + C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_DOWN); + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) = ITEM_NONE; + C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) != ITEM_NONE) { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT); + C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_RIGHT); + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) = ITEM_NONE; + C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) != ITEM_NONE) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_LEFT); + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) != ITEM_NONE) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_DOWN); + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) & 0xFF) != ITEM_NONE) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_UP); + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP) = SLOT_NONE; + } + } + + // Equip mask on DRight + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) = pauseCtx->equipTargetItem; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT) = pauseCtx->equipTargetSlot; + Interface_Dpad_LoadItemIconImpl(play, EQUIP_SLOT_D_RIGHT); + } else if (pauseCtx->equipTargetCBtn == PAUSE_EQUIP_D_LEFT) { + // Swap if mask is already equipped on other Item Buttons. + if (pauseCtx->equipTargetSlot == C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) != ITEM_NONE) { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT); + C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_LEFT); + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) = ITEM_NONE; + C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) != ITEM_NONE) { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT); + C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_DOWN); + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) = ITEM_NONE; + C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) != ITEM_NONE) { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT); + C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_RIGHT); + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) = ITEM_NONE; + C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) != ITEM_NONE) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_RIGHT); + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) != ITEM_NONE) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_DOWN); + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) & 0xFF) != ITEM_NONE) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_UP); + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP) = SLOT_NONE; + } + } + + // Equip mask on DLeft + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) = pauseCtx->equipTargetItem; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT) = pauseCtx->equipTargetSlot; + Interface_Dpad_LoadItemIconImpl(play, EQUIP_SLOT_D_LEFT); + } else if (pauseCtx->equipTargetCBtn == PAUSE_EQUIP_D_DOWN) { + // Swap if mask is already equipped on other Item Buttons. + if (pauseCtx->equipTargetSlot == C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) != ITEM_NONE) { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN); + C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_LEFT); + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) = ITEM_NONE; + C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) != ITEM_NONE) { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN); + C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_DOWN); + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) = ITEM_NONE; + C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) != ITEM_NONE) { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN); + C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_RIGHT); + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) = ITEM_NONE; + C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) != ITEM_NONE) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_RIGHT); + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) != ITEM_NONE) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_LEFT); + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) & 0xFF) != ITEM_NONE) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_UP); + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP) = SLOT_NONE; + } + } + + // Equip mask on DDown + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) = pauseCtx->equipTargetItem; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN) = pauseCtx->equipTargetSlot; + Interface_Dpad_LoadItemIconImpl(play, EQUIP_SLOT_D_DOWN); + } else if (pauseCtx->equipTargetCBtn == PAUSE_EQUIP_D_UP) { + // Swap if mask is already equipped on other Item Buttons. + if (pauseCtx->equipTargetSlot == C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) != ITEM_NONE) { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP); + C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_LEFT); + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) = ITEM_NONE; + C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) != ITEM_NONE) { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP); + C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_DOWN); + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) = ITEM_NONE; + C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) != ITEM_NONE) { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP); + C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP); + Interface_LoadItemIcon(play, EQUIP_SLOT_C_RIGHT); + } else { + BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) = ITEM_NONE; + C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) != ITEM_NONE) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_RIGHT); + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_RIGHT) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_RIGHT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) != ITEM_NONE) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_LEFT); + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_LEFT) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_LEFT) = SLOT_NONE; + } + } else if (pauseCtx->equipTargetSlot == DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN)) { + if ((DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) & 0xFF) != ITEM_NONE) { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) = DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP); + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN) = DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP); + Interface_Dpad_LoadItemIcon(play, EQUIP_SLOT_D_DOWN); + } else { + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_DOWN) = ITEM_NONE; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_DOWN) = SLOT_NONE; + } + } + + // Equip mask on DUp + DPAD_BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_D_UP) = pauseCtx->equipTargetItem; + DPAD_SLOT_EQUIP(0, EQUIP_SLOT_D_UP) = pauseCtx->equipTargetSlot; + Interface_Dpad_LoadItemIconImpl(play, EQUIP_SLOT_D_UP); + } +} +// #endregion void KaleidoScope_UpdateMaskEquip(PlayState* play) { static s16 sMaskEquipMagicArrowBowSlotHoldTimer = 0; @@ -742,6 +1110,11 @@ void KaleidoScope_UpdateMaskEquip(PlayState* play) { C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT) = SLOT_NONE; } } + // #region 2S2H [Dpad] + else if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { + KaleidoScope_SwapDpadMaskToCMask(play, EQUIP_SLOT_C_LEFT); + } + // #endregion // Equip mask on CLeft BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_LEFT) = pauseCtx->equipTargetItem; @@ -768,12 +1141,17 @@ void KaleidoScope_UpdateMaskEquip(PlayState* play) { C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT) = SLOT_NONE; } } + // #region 2S2H [Dpad] + else if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { + KaleidoScope_SwapDpadMaskToCMask(play, EQUIP_SLOT_C_DOWN); + } + // #endregion // Equip mask on CDown BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_DOWN) = pauseCtx->equipTargetItem; C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN) = pauseCtx->equipTargetSlot; Interface_LoadItemIconImpl(play, EQUIP_SLOT_C_DOWN); - } else { // (pauseCtx->equipTargetCBtn == PAUSE_EQUIP_C_RIGHT) + } else if (pauseCtx->equipTargetCBtn == PAUSE_EQUIP_C_RIGHT) { // #region 2S2H [Dpad] Added condition here to allow for other cases // Swap if mask is already equipped on CLeft or CDown. if (pauseCtx->equipTargetSlot == C_SLOT_EQUIP(0, EQUIP_SLOT_C_LEFT)) { if ((BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) & 0xFF) != ITEM_NONE) { @@ -794,12 +1172,22 @@ void KaleidoScope_UpdateMaskEquip(PlayState* play) { C_SLOT_EQUIP(0, EQUIP_SLOT_C_DOWN) = SLOT_NONE; } } + // #region 2S2H [Dpad] + else if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { + KaleidoScope_SwapDpadMaskToCMask(play, EQUIP_SLOT_C_RIGHT); + } + // #endregion // Equip mask on CRight BUTTON_ITEM_EQUIP(0, EQUIP_SLOT_C_RIGHT) = pauseCtx->equipTargetItem; C_SLOT_EQUIP(0, EQUIP_SLOT_C_RIGHT) = pauseCtx->equipTargetSlot; Interface_LoadItemIconImpl(play, EQUIP_SLOT_C_RIGHT); } + // #region 2S2H [Dpad] + else if (CVarGetInteger("gEnhancements.Dpad.DpadEquips", 0)) { + KaleidoScope_UpdateDpadMaskEquip(play); + } + // #endregion // Reset params pauseCtx->mainState = PAUSE_MAIN_STATE_IDLE; diff --git a/mm/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h b/mm/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h index c82a40e67..5698584cd 100644 --- a/mm/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h +++ b/mm/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope.h @@ -102,6 +102,15 @@ typedef enum { /* 2 */ PAUSE_EQUIP_C_RIGHT } PauseEquipCButton; +// #region 2S2H [Dpad] +typedef enum { + /* 3 */ PAUSE_EQUIP_D_RIGHT = 3, + /* 4 */ PAUSE_EQUIP_D_LEFT, + /* 5 */ PAUSE_EQUIP_D_DOWN, + /* 6 */ PAUSE_EQUIP_D_UP +} PauseEquipDButton; +// #endregion + typedef enum { /* 0 */ EQUIP_STATE_MAGIC_ARROW_GROW_ORB, /* 1 */ EQUIP_STATE_MAGIC_ARROW_MOVE_TO_BOW_SLOT, diff --git a/mm/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c b/mm/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c index 7beef224b..249955938 100644 --- a/mm/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c +++ b/mm/src/overlays/kaleido_scope/ovl_kaleido_scope/z_kaleido_scope_NES.c @@ -410,6 +410,12 @@ void KaleidoScope_MoveCursorToSpecialPos(PlayState* play, s16 cursorSpecialPos) gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED; + // #region 2S2H [Dpad] + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_UP] = BTN_DISABLED; + // #endregion gSaveContext.buttonStatus[EQUIP_SLOT_A] = BTN_DISABLED; gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE; @@ -430,6 +436,12 @@ void KaleidoScope_MoveCursorFromSpecialPos(PlayState* play) { gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1]; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1]; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1]; + // #region 2S2H [Dpad] + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1]; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1]; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1]; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_UP] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1]; + // #endregion gSaveContext.buttonStatus[EQUIP_SLOT_A] = BTN_ENABLED; gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE; @@ -470,6 +482,12 @@ void KaleidoScope_SwitchPage(PauseContext* pauseCtx, u8 direction) { gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED; + // #region 2S2H [Dpad] + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_UP] = BTN_DISABLED; + // #endregion gSaveContext.buttonStatus[EQUIP_SLOT_A] = BTN_DISABLED; gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE; @@ -1262,6 +1280,9 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) { } u8 sUnpausedButtonStatus[5]; +// #region 2S2H [Dpad] +u8 sUnpausedDpadStatus[4]; +// #endregion f32 sCursorCirclesX[4]; f32 sCursorCirclesY[4]; @@ -2113,7 +2134,11 @@ void KaleidoScope_SetVertices(PlayState* play, GraphicsContext* gfxCtx) { pauseCtx->itemPageVtx = GRAPH_ALLOC(gfxCtx, ((PAGE_BG_QUADS + VTX_PAGE_ITEM_QUADS) * 4) * sizeof(Vtx)); KaleidoScope_SetPageVertices(play, pauseCtx->itemPageVtx, VTX_PAGE_ITEM, VTX_PAGE_ITEM_QUADS); - pauseCtx->itemVtx = GRAPH_ALLOC(gfxCtx, (QUAD_ITEM_MAX * 4) * sizeof(Vtx)); + // #region 2S2H [Dpad] Increase size of allocation when you have dpad items + u32 quadItemMax = QUAD_ITEM_MAX; + quadItemMax += EQUIP_SLOT_D_MAX; + pauseCtx->itemVtx = GRAPH_ALLOC(gfxCtx, (quadItemMax * 4) * sizeof(Vtx)); + // #endregion // QUAD_ITEM_GRID_FIRST..QUAD_ITEM_GRID_LAST @@ -2209,6 +2234,59 @@ void KaleidoScope_SetVertices(PlayState* play, GraphicsContext* gfxCtx) { pauseCtx->itemVtx[i + 0].v.ob[1] - ITEM_GRID_SELECTED_QUAD_HEIGHT; } } + // #region 2S2H [Dpad] + for (j = EQUIP_SLOT_D_RIGHT; j <= EQUIP_SLOT_D_UP; j++, i += 4) { + if (DPAD_GET_CUR_FORM_BTN_SLOT(j) != ITEM_NONE) { + k = DPAD_GET_CUR_FORM_BTN_SLOT(j) * 4; + + pauseCtx->itemVtx[i + 0].v.ob[0] = pauseCtx->itemVtx[i + 2].v.ob[0] = + pauseCtx->itemVtx[k].v.ob[0] + ITEM_GRID_SELECTED_QUAD_MARGIN; + + pauseCtx->itemVtx[i + 1].v.ob[0] = pauseCtx->itemVtx[i + 3].v.ob[0] = + pauseCtx->itemVtx[i + 0].v.ob[0] + ITEM_GRID_SELECTED_QUAD_WIDTH; + + pauseCtx->itemVtx[i + 0].v.ob[1] = pauseCtx->itemVtx[i + 1].v.ob[1] = + pauseCtx->itemVtx[k].v.ob[1] - ITEM_GRID_SELECTED_QUAD_MARGIN; + + pauseCtx->itemVtx[i + 2].v.ob[1] = pauseCtx->itemVtx[i + 3].v.ob[1] = + pauseCtx->itemVtx[i + 0].v.ob[1] - ITEM_GRID_SELECTED_QUAD_WIDTH; + + pauseCtx->itemVtx[i + 0].v.ob[2] = pauseCtx->itemVtx[i + 1].v.ob[2] = pauseCtx->itemVtx[i + 2].v.ob[2] = + pauseCtx->itemVtx[i + 3].v.ob[2] = 0; + + pauseCtx->itemVtx[i + 0].v.flag = pauseCtx->itemVtx[i + 1].v.flag = pauseCtx->itemVtx[i + 2].v.flag = + pauseCtx->itemVtx[i + 3].v.flag = 0; + + pauseCtx->itemVtx[i + 0].v.tc[0] = pauseCtx->itemVtx[i + 0].v.tc[1] = pauseCtx->itemVtx[i + 1].v.tc[1] = + pauseCtx->itemVtx[i + 2].v.tc[0] = 0; + + pauseCtx->itemVtx[i + 1].v.tc[0] = pauseCtx->itemVtx[i + 2].v.tc[1] = pauseCtx->itemVtx[i + 3].v.tc[0] = + pauseCtx->itemVtx[i + 3].v.tc[1] = ITEM_GRID_SELECTED_QUAD_TEX_SIZE * (1 << 5); + + pauseCtx->itemVtx[i + 0].v.cn[0] = pauseCtx->itemVtx[i + 1].v.cn[0] = pauseCtx->itemVtx[i + 2].v.cn[0] = + pauseCtx->itemVtx[i + 3].v.cn[0] = pauseCtx->itemVtx[i + 0].v.cn[1] = + pauseCtx->itemVtx[i + 1].v.cn[1] = pauseCtx->itemVtx[i + 2].v.cn[1] = + pauseCtx->itemVtx[i + 3].v.cn[1] = pauseCtx->itemVtx[i + 0].v.cn[2] = + pauseCtx->itemVtx[i + 1].v.cn[2] = pauseCtx->itemVtx[i + 2].v.cn[2] = + pauseCtx->itemVtx[i + 3].v.cn[2] = 255; + + pauseCtx->itemVtx[i + 0].v.cn[3] = pauseCtx->itemVtx[i + 1].v.cn[3] = pauseCtx->itemVtx[i + 2].v.cn[3] = + pauseCtx->itemVtx[i + 3].v.cn[3] = pauseCtx->alpha; + } else { + // No item equipped on the C button, put the quad out of view + + pauseCtx->itemVtx[i + 2].v.ob[0] = -300; + pauseCtx->itemVtx[i + 0].v.ob[0] = pauseCtx->itemVtx[i + 2].v.ob[0]; + + pauseCtx->itemVtx[i + 1].v.ob[0] = pauseCtx->itemVtx[i + 3].v.ob[0] = + pauseCtx->itemVtx[i + 0].v.ob[0] + ITEM_GRID_SELECTED_QUAD_WIDTH; + + pauseCtx->itemVtx[i + 0].v.ob[1] = pauseCtx->itemVtx[i + 1].v.ob[1] = 300; + pauseCtx->itemVtx[i + 2].v.ob[1] = pauseCtx->itemVtx[i + 3].v.ob[1] = + pauseCtx->itemVtx[i + 0].v.ob[1] - ITEM_GRID_SELECTED_QUAD_HEIGHT; + } + } + // #endregion } if (pauseCtx->pageIndex != PAUSE_MASK) { @@ -2326,7 +2404,11 @@ void KaleidoScope_SetVertices(PlayState* play, GraphicsContext* gfxCtx) { pauseCtx->maskPageVtx = GRAPH_ALLOC(gfxCtx, ((PAGE_BG_QUADS + VTX_PAGE_MASK_QUADS) * 4) * sizeof(Vtx)); KaleidoScope_SetPageVertices(play, pauseCtx->maskPageVtx, VTX_PAGE_MASK, VTX_PAGE_MASK_QUADS); - pauseCtx->maskVtx = GRAPH_ALLOC(gfxCtx, (QUAD_MASK_MAX * 4) * sizeof(Vtx)); + // #region 2S2H [Dpad] Increase size of allocation when you have dpad items + u32 quadMaskMax = QUAD_MASK_MAX; + quadMaskMax += EQUIP_SLOT_D_MAX; + pauseCtx->maskVtx = GRAPH_ALLOC(gfxCtx, (quadMaskMax * 4) * sizeof(Vtx)); + // #endregion // Loop over grid rows for (k = 0, i = 0, vtx_y = (MASK_GRID_ROWS * MASK_GRID_CELL_HEIGHT) / 2 - 6; k < MASK_GRID_ROWS; @@ -2418,6 +2500,57 @@ void KaleidoScope_SetVertices(PlayState* play, GraphicsContext* gfxCtx) { pauseCtx->maskVtx[i + 0].v.ob[1] - MASK_GRID_SELECTED_QUAD_HEIGHT; } } + // #region 2S2H [Dpad] + for (j = EQUIP_SLOT_D_RIGHT; j <= EQUIP_SLOT_D_UP; j++, i += 4) { + if (DPAD_GET_CUR_FORM_BTN_SLOT(j) != ITEM_NONE) { + k = (DPAD_GET_CUR_FORM_BTN_SLOT(j) - ITEM_NUM_SLOTS) * 4; + + pauseCtx->maskVtx[i + 0].v.ob[0] = pauseCtx->maskVtx[i + 2].v.ob[0] = + pauseCtx->maskVtx[k].v.ob[0] + MASK_GRID_SELECTED_QUAD_MARGIN; + + pauseCtx->maskVtx[i + 1].v.ob[0] = pauseCtx->maskVtx[i + 3].v.ob[0] = + pauseCtx->maskVtx[i + 0].v.ob[0] + MASK_GRID_SELECTED_QUAD_WIDTH; + + pauseCtx->maskVtx[i + 0].v.ob[1] = pauseCtx->maskVtx[i + 1].v.ob[1] = + pauseCtx->maskVtx[k].v.ob[1] - MASK_GRID_SELECTED_QUAD_MARGIN; + + pauseCtx->maskVtx[i + 2].v.ob[1] = pauseCtx->maskVtx[i + 3].v.ob[1] = + pauseCtx->maskVtx[i + 0].v.ob[1] - MASK_GRID_SELECTED_QUAD_HEIGHT; + + pauseCtx->maskVtx[i + 0].v.ob[2] = pauseCtx->maskVtx[i + 1].v.ob[2] = pauseCtx->maskVtx[i + 2].v.ob[2] = + pauseCtx->maskVtx[i + 3].v.ob[2] = 0; + + pauseCtx->maskVtx[i + 0].v.flag = pauseCtx->maskVtx[i + 1].v.flag = pauseCtx->maskVtx[i + 2].v.flag = + pauseCtx->maskVtx[i + 3].v.flag = 0; + + pauseCtx->maskVtx[i + 0].v.tc[0] = pauseCtx->maskVtx[i + 0].v.tc[1] = pauseCtx->maskVtx[i + 1].v.tc[1] = + pauseCtx->maskVtx[i + 2].v.tc[0] = 0; + + pauseCtx->maskVtx[i + 1].v.tc[0] = pauseCtx->maskVtx[i + 2].v.tc[1] = pauseCtx->maskVtx[i + 3].v.tc[0] = + pauseCtx->maskVtx[i + 3].v.tc[1] = MASK_GRID_SELECTED_QUAD_TEX_SIZE * (1 << 5); + + pauseCtx->maskVtx[i + 0].v.cn[0] = pauseCtx->maskVtx[i + 1].v.cn[0] = pauseCtx->maskVtx[i + 2].v.cn[0] = + pauseCtx->maskVtx[i + 3].v.cn[0] = pauseCtx->maskVtx[i + 0].v.cn[1] = + pauseCtx->maskVtx[i + 1].v.cn[1] = pauseCtx->maskVtx[i + 2].v.cn[1] = + pauseCtx->maskVtx[i + 3].v.cn[1] = pauseCtx->maskVtx[i + 0].v.cn[2] = + pauseCtx->maskVtx[i + 1].v.cn[2] = pauseCtx->maskVtx[i + 2].v.cn[2] = + pauseCtx->maskVtx[i + 3].v.cn[2] = 255; + + pauseCtx->maskVtx[i + 0].v.cn[3] = pauseCtx->maskVtx[i + 1].v.cn[3] = pauseCtx->maskVtx[i + 2].v.cn[3] = + pauseCtx->maskVtx[i + 3].v.cn[3] = pauseCtx->alpha; + } else { + pauseCtx->maskVtx[i + 2].v.ob[0] = -300; + pauseCtx->maskVtx[i + 0].v.ob[0] = pauseCtx->maskVtx[i + 2].v.ob[0]; + + pauseCtx->maskVtx[i + 1].v.ob[0] = pauseCtx->maskVtx[i + 3].v.ob[0] = + pauseCtx->maskVtx[i + 0].v.ob[0] + MASK_GRID_SELECTED_QUAD_WIDTH; + + pauseCtx->maskVtx[i + 0].v.ob[1] = pauseCtx->maskVtx[i + 1].v.ob[1] = 300; + pauseCtx->maskVtx[i + 2].v.ob[1] = pauseCtx->maskVtx[i + 3].v.ob[1] = + pauseCtx->maskVtx[i + 0].v.ob[1] - MASK_GRID_SELECTED_QUAD_HEIGHT; + } + } + // #endregion } pauseCtx->cursorVtx = GRAPH_ALLOC(play->state.gfxCtx, (PAUSE_QUAD_CURSOR_MAX * 4) * sizeof(Vtx)); @@ -2931,12 +3064,24 @@ void KaleidoScope_UpdateOpening(PlayState* play) { gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex][1]; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex][1]; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex][1]; + // #region 2S2H [Dpad] + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex][1]; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex][1]; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex][1]; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_UP] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex][1]; + // #endregion gSaveContext.buttonStatus[EQUIP_SLOT_A] = BTN_ENABLED; } else { gSaveContext.buttonStatus[EQUIP_SLOT_B] = BTN_ENABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_LEFT] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = BTN_DISABLED; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = BTN_DISABLED; + // #region 2S2H [Dpad] + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN] = BTN_DISABLED; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_UP] = BTN_DISABLED; + // #endregion gSaveContext.buttonStatus[EQUIP_SLOT_A] = BTN_DISABLED; } @@ -3000,6 +3145,12 @@ void KaleidoScope_Update(PlayState* play) { sUnpausedButtonStatus[EQUIP_SLOT_C_DOWN] = gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN]; sUnpausedButtonStatus[EQUIP_SLOT_C_RIGHT] = gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT]; sUnpausedButtonStatus[EQUIP_SLOT_A] = gSaveContext.buttonStatus[EQUIP_SLOT_A]; + // #region 2S2H [Dpad] + sUnpausedDpadStatus[EQUIP_SLOT_D_RIGHT] = gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT]; + sUnpausedDpadStatus[EQUIP_SLOT_D_LEFT] = gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT]; + sUnpausedDpadStatus[EQUIP_SLOT_D_DOWN] = gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN]; + sUnpausedDpadStatus[EQUIP_SLOT_D_UP] = gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_UP]; + // #endregion pauseCtx->cursorXIndex[PAUSE_MAP] = 0; pauseCtx->cursorSlot[PAUSE_MAP] = R_PLAYER_FLOOR_REVERSE_INDEX + DUNGEON_FLOOR_INDEX_4; @@ -3298,6 +3449,16 @@ void KaleidoScope_Update(PlayState* play) { gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1]; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1]; + // #region 2S2H [Dpad] + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT] = + gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][0]; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT] = + gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1]; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN] = + gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1]; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT] = + gPageSwitchNextButtonStatus[pauseCtx->pageIndex + 1][1]; + // #endregion if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) || (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT)) { KaleidoScope_MoveCursorToSpecialPos(play, pauseCtx->cursorSpecialPos); @@ -3577,6 +3738,12 @@ void KaleidoScope_Update(PlayState* play) { sUnpausedButtonStatus[EQUIP_SLOT_C_DOWN] = gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN]; sUnpausedButtonStatus[EQUIP_SLOT_C_RIGHT] = gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT]; sUnpausedButtonStatus[EQUIP_SLOT_A] = gSaveContext.buttonStatus[EQUIP_SLOT_A]; + // #region 2S2H [Dpad] + sUnpausedDpadStatus[EQUIP_SLOT_D_RIGHT] = gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT]; + sUnpausedDpadStatus[EQUIP_SLOT_D_LEFT] = gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT]; + sUnpausedDpadStatus[EQUIP_SLOT_D_DOWN] = gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN]; + sUnpausedDpadStatus[EQUIP_SLOT_D_UP] = gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_UP]; + // #endregion pauseCtx->cursorXIndex[PAUSE_MAP] = 0; pauseCtx->cursorSlot[PAUSE_MAP] = R_PLAYER_FLOOR_REVERSE_INDEX + DUNGEON_FLOOR_INDEX_4; @@ -3747,6 +3914,12 @@ void KaleidoScope_Update(PlayState* play) { gSaveContext.buttonStatus[EQUIP_SLOT_C_DOWN] = sUnpausedButtonStatus[EQUIP_SLOT_C_DOWN]; gSaveContext.buttonStatus[EQUIP_SLOT_C_RIGHT] = sUnpausedButtonStatus[EQUIP_SLOT_C_RIGHT]; gSaveContext.buttonStatus[EQUIP_SLOT_A] = sUnpausedButtonStatus[EQUIP_SLOT_A]; + // #region 2S2H [Dpad] + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_RIGHT] = sUnpausedDpadStatus[EQUIP_SLOT_D_RIGHT]; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_LEFT] = sUnpausedDpadStatus[EQUIP_SLOT_D_LEFT]; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_DOWN] = sUnpausedDpadStatus[EQUIP_SLOT_D_DOWN]; + gSaveContext.shipSaveContext.dpad.status[EQUIP_SLOT_D_UP] = sUnpausedDpadStatus[EQUIP_SLOT_D_UP]; + // #endregion Interface_UpdateButtonsPart2(play); gSaveContext.hudVisibility = HUD_VISIBILITY_IDLE;