From 5287d6e329aa32237ec8fae03c67ffd257705113 Mon Sep 17 00:00:00 2001 From: Juliano Goncalves Date: Fri, 2 Oct 2020 14:43:35 -0300 Subject: [PATCH] :sparkles: Allow shift+click moving to belt --- Source/diablo.cpp | 6 +- Source/help.cpp | 2 + Source/inv.cpp | 142 ++++++++++++++++++++++++++++++++++------------ Source/inv.h | 2 +- 4 files changed, 114 insertions(+), 38 deletions(-) diff --git a/Source/diablo.cpp b/Source/diablo.cpp index e1bd3f187..fb5adf189 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -751,6 +751,8 @@ static BOOL LeftMouseDown(int wParam) return FALSE; } + bool isShiftHeld = wParam & DVL_MK_SHIFT; + if (MouseY < PANEL_TOP || MouseX < PANEL_LEFT || MouseX >= PANEL_LEFT + PANEL_WIDTH) { if (!gmenu_is_active() && !TryIconCurs()) { if (questlog && MouseX > 32 && MouseX < 288 && MouseY > 32 && MouseY < 308) { @@ -762,7 +764,7 @@ static BOOL LeftMouseDown(int wParam) CheckChrBtns(); } else if (invflag && MouseX > RIGHT_PANEL && MouseY < SPANEL_HEIGHT) { if (!dropGoldFlag) - CheckInvItem(); + CheckInvItem(isShiftHeld); } else if (sbookflag && MouseX > RIGHT_PANEL && MouseY < SPANEL_HEIGHT) { CheckSBook(); } else if (pcurs >= CURSOR_FIRSTITEM) { @@ -774,7 +776,7 @@ static BOOL LeftMouseDown(int wParam) if (plr[myplr]._pStatPts != 0 && !spselflag) CheckLvlBtn(); if (!lvlbtndown) - return LeftMouseCmd(wParam == DVL_MK_SHIFT + DVL_MK_LBUTTON); + return LeftMouseCmd(isShiftHeld); } } } else { diff --git a/Source/help.cpp b/Source/help.cpp index 49779ef90..e65337bf6 100644 --- a/Source/help.cpp +++ b/Source/help.cpp @@ -35,6 +35,7 @@ const char gszSpawnHelpText[] = { "F5, F6, F7, F8: Sets a hotkey for a selected skill or spell|" "Shift + Left Mouse Button: Use any weapon without moving|" "Shift + Left Mouse Button (on character screen): Assign all stat points|" + "Shift + Left Mouse Button (on inventory): Move item to belt|" "|" "|" "$Movement:|" @@ -392,6 +393,7 @@ const char gszHelpText[] = { "F5, F6, F7, F8: Set hotkey for skill or spell|" "Shift + Left Mouse Button: Attack without moving|" "Shift + Left Mouse Button (on character screen): Assign all stat points|" + "Shift + Left Mouse Button (on inventory): Move item to belt|" "|" "$Movement:|" "If you hold the mouse button down while moving, the character " diff --git a/Source/inv.cpp b/Source/inv.cpp index ca7ce8224..b7885f04e 100644 --- a/Source/inv.cpp +++ b/Source/inv.cpp @@ -1541,7 +1541,7 @@ void CheckInvSwap(int pnum, BYTE bLoc, int idx, WORD wCI, int seed, BOOL bId) CalcPlrInv(pnum, TRUE); } -void CheckInvCut(int pnum, int mx, int my) +void CheckInvCut(int pnum, int mx, int my, bool moveToBelt) { int r; BOOL done; @@ -1588,62 +1588,77 @@ void CheckInvCut(int pnum, int mx, int my) r >= SLOTXY_HEAD_FIRST && r <= SLOTXY_HEAD_LAST && !plr[pnum].InvBody[INVLOC_HEAD].isEmpty()) { - NetSendCmdDelItem(FALSE, INVLOC_HEAD); plr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_HEAD]; - plr[pnum].InvBody[INVLOC_HEAD]._itype = ITYPE_NONE; + if (!moveToBelt) { + NetSendCmdDelItem(FALSE, INVLOC_HEAD); + plr[pnum].InvBody[INVLOC_HEAD]._itype = ITYPE_NONE; + } } if ( r == SLOTXY_RING_LEFT && !plr[pnum].InvBody[INVLOC_RING_LEFT].isEmpty()) { - NetSendCmdDelItem(FALSE, INVLOC_RING_LEFT); plr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_RING_LEFT]; - plr[pnum].InvBody[INVLOC_RING_LEFT]._itype = ITYPE_NONE; + if (!moveToBelt) { + NetSendCmdDelItem(FALSE, INVLOC_RING_LEFT); + plr[pnum].InvBody[INVLOC_RING_LEFT]._itype = ITYPE_NONE; + } } if ( r == SLOTXY_RING_RIGHT && !plr[pnum].InvBody[INVLOC_RING_RIGHT].isEmpty()) { - NetSendCmdDelItem(FALSE, INVLOC_RING_RIGHT); plr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_RING_RIGHT]; - plr[pnum].InvBody[INVLOC_RING_RIGHT]._itype = ITYPE_NONE; + if (!moveToBelt) { + NetSendCmdDelItem(FALSE, INVLOC_RING_RIGHT); + plr[pnum].InvBody[INVLOC_RING_RIGHT]._itype = ITYPE_NONE; + } } if ( r == SLOTXY_AMULET && !plr[pnum].InvBody[INVLOC_AMULET].isEmpty()) { - NetSendCmdDelItem(FALSE, INVLOC_AMULET); plr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_AMULET]; - plr[pnum].InvBody[INVLOC_AMULET]._itype = ITYPE_NONE; + if (!moveToBelt) { + NetSendCmdDelItem(FALSE, INVLOC_AMULET); + plr[pnum].InvBody[INVLOC_AMULET]._itype = ITYPE_NONE; + } } if ( r >= SLOTXY_HAND_LEFT_FIRST && r <= SLOTXY_HAND_LEFT_LAST && !plr[pnum].InvBody[INVLOC_HAND_LEFT].isEmpty()) { - NetSendCmdDelItem(FALSE, INVLOC_HAND_LEFT); plr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_HAND_LEFT]; - plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype = ITYPE_NONE; + if (!moveToBelt) { + NetSendCmdDelItem(FALSE, INVLOC_HAND_LEFT); + plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype = ITYPE_NONE; + } } if ( r >= SLOTXY_HAND_RIGHT_FIRST && r <= SLOTXY_HAND_RIGHT_LAST && !plr[pnum].InvBody[INVLOC_HAND_RIGHT].isEmpty()) { - NetSendCmdDelItem(FALSE, INVLOC_HAND_RIGHT); plr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_HAND_RIGHT]; - plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype = ITYPE_NONE; + if (!moveToBelt) { + NetSendCmdDelItem(FALSE, INVLOC_HAND_RIGHT); + plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype = ITYPE_NONE; + } } if ( r >= SLOTXY_CHEST_FIRST && r <= SLOTXY_CHEST_LAST && !plr[pnum].InvBody[INVLOC_CHEST].isEmpty()) { - NetSendCmdDelItem(FALSE, INVLOC_CHEST); plr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_CHEST]; - plr[pnum].InvBody[INVLOC_CHEST]._itype = ITYPE_NONE; + if (!moveToBelt) { + NetSendCmdDelItem(FALSE, INVLOC_CHEST); + plr[pnum].InvBody[INVLOC_CHEST]._itype = ITYPE_NONE; + } } + bool movedToBelt = false; if (r >= SLOTXY_INV_FIRST && r <= SLOTXY_INV_LAST) { ig = r - SLOTXY_INV_FIRST; ii = plr[pnum].InvGrid[ig]; @@ -1653,26 +1668,32 @@ void CheckInvCut(int pnum, int mx, int my) iv = -ii; } - for (i = 0; i < NUM_INV_GRID_ELEM; i++) { - if (plr[pnum].InvGrid[i] == iv || plr[pnum].InvGrid[i] == -iv) { - plr[pnum].InvGrid[i] = 0; - } + plr[pnum].HoldItem = plr[pnum].InvList[iv - 1]; + if (moveToBelt && CanBePlacedOnBelt(plr[pnum].HoldItem)) { + movedToBelt = AutoPlaceItemInBelt(pnum, plr[pnum].HoldItem, true); } - iv--; + if (!moveToBelt || movedToBelt) { + for (i = 0; i < NUM_INV_GRID_ELEM; i++) { + if (plr[pnum].InvGrid[i] == iv || plr[pnum].InvGrid[i] == -iv) { + plr[pnum].InvGrid[i] = 0; + } + } - plr[pnum].HoldItem = plr[pnum].InvList[iv]; - plr[pnum]._pNumInv--; + iv--; - if (plr[pnum]._pNumInv > 0 && plr[pnum]._pNumInv != iv) { - plr[pnum].InvList[iv] = plr[pnum].InvList[plr[pnum]._pNumInv]; + plr[pnum]._pNumInv--; - for (j = 0; j < NUM_INV_GRID_ELEM; j++) { - if (plr[pnum].InvGrid[j] == plr[pnum]._pNumInv + 1) { - plr[pnum].InvGrid[j] = iv + 1; - } - if (plr[pnum].InvGrid[j] == -(plr[pnum]._pNumInv + 1)) { - plr[pnum].InvGrid[j] = -iv - 1; + if (plr[pnum]._pNumInv > 0 && plr[pnum]._pNumInv != iv) { + plr[pnum].InvList[iv] = plr[pnum].InvList[plr[pnum]._pNumInv]; + + for (j = 0; j < NUM_INV_GRID_ELEM; j++) { + if (plr[pnum].InvGrid[j] == plr[pnum]._pNumInv + 1) { + plr[pnum].InvGrid[j] = iv + 1; + } + if (plr[pnum].InvGrid[j] == -(plr[pnum]._pNumInv + 1)) { + plr[pnum].InvGrid[j] = -iv - 1; + } } } } @@ -1697,9 +1718,60 @@ void CheckInvCut(int pnum, int mx, int my) CheckItemStats(pnum); if (pnum == myplr) { - PlaySFX(IS_IGRAB); - SetCursor_(plr[pnum].HoldItem._iCurs + CURSOR_FIRSTITEM); - SetCursorPos(mx - (cursW >> 1), MouseY - (cursH >> 1)); + if (!moveToBelt || movedToBelt) { + PlaySFX(IS_IGRAB); + } + + if (moveToBelt) { + if (!movedToBelt) { + if (CanBePlacedOnBelt(plr[pnum].HoldItem)) { + switch (plr[pnum]._pClass) { + case PC_WARRIOR: + case PC_BARBARIAN: + PlaySFX(PS_WARR15, false); + break; + + case PC_ROGUE: + case PC_BARD: + PlaySFX(PS_ROGUE15, false); + break; + + case PC_SORCERER: + PlaySFX(PS_MAGE15, false); + break; + + case PC_MONK: + PlaySFX(PS_MONK15, false); + break; + } + } else { + switch (plr[pnum]._pClass) { + case PC_WARRIOR: + case PC_BARBARIAN: + PlaySFX(PS_WARR37, false); + break; + + case PC_ROGUE: + case PC_BARD: + PlaySFX(PS_ROGUE37, false); + break; + + case PC_SORCERER: + PlaySFX(PS_MAGE37, false); + break; + + case PC_MONK: + PlaySFX(PS_MONK37, false); + break; + } + } + } + + plr[pnum].HoldItem._itype = ITYPE_NONE; + } else { + SetCursor_(plr[pnum].HoldItem._iCurs + CURSOR_FIRSTITEM); + SetCursorPos(mx - (cursW >> 1), MouseY - (cursH >> 1)); + } } } } @@ -1756,12 +1828,12 @@ void RemoveSpdBarItem(int pnum, int iv) force_redraw = 255; } -void CheckInvItem() +void CheckInvItem(bool isShiftHeld) { if (pcurs >= CURSOR_FIRSTITEM) { CheckInvPaste(myplr, MouseX, MouseY); } else { - CheckInvCut(myplr, MouseX, MouseY); + CheckInvCut(myplr, MouseX, MouseY, isShiftHeld); } } diff --git a/Source/inv.h b/Source/inv.h index 3a35ccc43..02fff45e6 100644 --- a/Source/inv.h +++ b/Source/inv.h @@ -42,7 +42,7 @@ void CheckInvSwap(int pnum, BYTE bLoc, int idx, WORD wCI, int seed, BOOL bId); void inv_update_rem_item(int pnum, BYTE iv); void RemoveInvItem(int pnum, int iv); void RemoveSpdBarItem(int pnum, int iv); -void CheckInvItem(); +void CheckInvItem(bool isShiftHeld = false); void CheckInvScrn(); void CheckItemStats(int pnum); void InvGetItem(int pnum, int ii);