From a549d5ebc461e757065c4536cb351969dcf60fe9 Mon Sep 17 00:00:00 2001 From: Sergey Semushin Date: Thu, 23 May 2019 19:07:14 +0300 Subject: [PATCH] Clean up CheckInvPaste (bin exact) (#1205) --- Source/inv.cpp | 908 ++++++++++++++++++++----------------------------- 1 file changed, 377 insertions(+), 531 deletions(-) diff --git a/Source/inv.cpp b/Source/inv.cpp index 54c952cd5..63bc2dfb6 100644 --- a/Source/inv.cpp +++ b/Source/inv.cpp @@ -684,562 +684,408 @@ int SwapItem(ItemStruct *a, ItemStruct *b) void CheckInvPaste(int pnum, int mx, int my) { - int v3; // ebx - int v4; // edi - int v5; // eax - int v6; // esi - signed int v7; // edi - int v8; // edx - int v9; // edx - signed int v10; // edi - char v11; // al - signed int v12; // ecx - int v13; // eax - int v14; // eax - char *v15; // edi - int v16; // esi - int v17; // ecx - int v18; // edx - int v21; // esi - ItemStruct *v22; // edi - ItemStruct *v23; // ecx - int v24; // eax - int v25; // eax - int v26; // edx - ItemStruct *v27; // esi - int v28; // eax - int v29; // ecx - int v30; // esi - int v31; // eax - int v32; // eax - int v33; // ecx - int v34; // eax - int v35; // ecx - char *v36; // eax - int v37; // edx - int v38; // ecx - int v39; // edi - int v40; // esi - int v41; // ebx - int v42; // edx - int v43; // eax - int v44; // eax - signed int v45; // ecx - int v46; // edx - char *v47; // eax - int v48; // edi - int v49; // eax - int v50; // ecx - char *v51; // esi - char v52; // cl - int v53; // ecx - int v54; // eax - int v55; // edi - int v56; // edx - int v57; // esi - int v58; // ebx - int v59; // eax - int v60; // esi - ItemStruct tempitem; // [esp+Ch] [ebp-190h] - int v62; // [esp+17Ch] [ebp-20h] - int p; // [esp+180h] [ebp-1Ch] - int v64; // [esp+184h] [ebp-18h] - int v65; // [esp+188h] [ebp-14h] - int v66; // [esp+18Ch] [ebp-10h] - int v67; // [esp+190h] [ebp-Ch] - int v68; // [esp+194h] [ebp-8h] - int v69; // [esp+198h] [ebp-4h] - int cursor_id; // [esp+1A4h] [ebp+8h] - int cursor_ida; // [esp+1A4h] [ebp+8h] - - p = pnum; - v3 = pnum; - v4 = mx; + int r, sx, sy; + int i, j, xx, yy, ii; + BOOL done, done2h; + int il, cn, it, iv, ig, gt; + ItemStruct tempitem; + SetICursor(plr[pnum].HoldItem._iCurs + CURSOR_FIRSTITEM); - v5 = my + (icursH >> 1); - v6 = v4 + (icursW >> 1); - v64 = icursW28; - v7 = 0; - v67 = icursH28; - v68 = 0; - do { - if (v7) - goto LABEL_18; - v8 = InvRect[v68].X; - if (v6 >= v8 && v6 < v8 + 28) { - v9 = InvRect[v68].Y; - if (v5 >= v9 - 29 && v5 < v9) { - v7 = 1; - --v68; + i = mx + (icursW >> 1); + j = my + (icursH >> 1); + sx = icursW28; + sy = icursH28; + done = FALSE; + for (r = 0; r < sizeof(InvRect) / sizeof(InvRect[0]) && !done; r++) { + if (i >= InvRect[r].X && i < InvRect[r].X + INV_SLOT_SIZE_PX) { + if (j >= InvRect[r].Y - INV_SLOT_SIZE_PX - 1 && j < InvRect[r].Y) { + done = TRUE; + r--; } } - if (v68 != 24) - goto LABEL_13; - if (!(v64 & 1)) - v6 -= 14; - if (!(v67 & 1)) { - v5 -= 14; - LABEL_13: - if (v68 == 64 && !(v67 & 1)) - v5 += 14; - } - ++v68; - } while ((unsigned int)v68 < 0x49); - if (!v7) - return; -LABEL_18: - v10 = v68; - v69 = ILOC_UNEQUIPABLE; - if (v68 >= 0 && v68 <= ILOC_ARMOR) - v69 = ILOC_HELM; - if (v68 >= ILOC_HELM && v68 <= ILOC_RING) - v69 = ILOC_RING; - if (v68 == ILOC_AMULET) - v69 = ILOC_AMULET; - if (v68 >= ILOC_UNEQUIPABLE && v68 <= 18) - v69 = ILOC_ONEHAND; - if (v68 >= 19 && v68 <= 24) - v69 = ILOC_ARMOR; - if (v68 >= 65 && v68 <= 72) - v69 = ILOC_BELT; - v11 = plr[v3].HoldItem._iLoc; - v12 = 0; - if ((char)v11 == v69) - v12 = 1; - if (v69 == 1 && v11 == ILOC_TWOHAND) { - v69 = ILOC_TWOHAND; - v12 = 1; - } - if (v11 != 7 || v69 != ILOC_BELT) { - LABEL_50: - if (v69 != ILOC_UNEQUIPABLE) - goto LABEL_81; - v66 = 0; - cursor_id = 1; - v13 = (v68 - 25) / 10; - if (plr[v3].HoldItem._itype == ITYPE_GOLD) { - _LOBYTE(v13) = plr[0].InvGrid[10 * v13 + v3 * 21720 + (v68 - 25) % 10]; - if (!(_BYTE)v13) - goto LABEL_93; - v13 = (char)v13; - if ((char)v13 <= 0) { - v13 = -v13; - } else if (*(int *)((char *)&plr[0].InvBody[v13 + 6]._itype + v3 * 21720) == ITYPE_GOLD) { - goto LABEL_93; - } - v66 = v13; - LABEL_93: - v21 = p; - if (p == myplr) { - PlaySFX(ItemInvSnds[ItemCAnimTbl[plr[v3].HoldItem._iCurs]]); - v10 = v68; + if (r == 24) { + if ((sx & 1) == 0) + i -= 14; + if ((sy & 1) == 0) { + j -= 14; } - cursor_ida = 1; - switch (v69) { - case ILOC_ONEHAND: - if (v10 > 12) { - if (plr[v3].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_NONE) { - v25 = plr[v3].InvBody[INVLOC_HAND_LEFT]._itype; - if (v25 == ITYPE_NONE) - goto LABEL_232; - if (plr[v3].InvBody[INVLOC_HAND_LEFT]._iLoc == ILOC_TWOHAND) { - NetSendCmdDelItem(FALSE, 4u); - NetSendCmdChItem(FALSE, 5u); - SwapItem(&plr[v3].InvBody[INVLOC_HAND_RIGHT], &plr[v3].InvBody[INVLOC_HAND_LEFT]); - v23 = &plr[v3].InvBody[INVLOC_HAND_RIGHT]; - LABEL_99: - v24 = SwapItem(v23, &plr[v3].HoldItem); - LABEL_172: - cursor_ida = v24; - goto LABEL_226; - } - if (v25 == ITYPE_NONE || plr[v3].InvBody[INVLOC_HAND_LEFT]._iClass != plr[v3].HoldItem._iClass) { - LABEL_232: - NetSendCmdChItem(FALSE, 5u); - v22 = &plr[v3].InvBody[INVLOC_HAND_RIGHT]; - LABEL_158: - qmemcpy(v22, &plr[v3].HoldItem, sizeof(ItemStruct)); - goto LABEL_226; - } - } else if (plr[v3].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_NONE - || plr[v3].InvBody[INVLOC_HAND_LEFT]._iClass != plr[v3].HoldItem._iClass) { - goto LABEL_114; - } - } else { - if (plr[v3].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_NONE) { - if (plr[v3].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE - && plr[v3].InvBody[INVLOC_HAND_RIGHT]._iClass == plr[v3].HoldItem._iClass) { - LABEL_114: - NetSendCmdChItem(FALSE, 5u); - v23 = &plr[v3].InvBody[INVLOC_HAND_RIGHT]; - goto LABEL_99; - } - NetSendCmdChItem(FALSE, 4u); - v22 = &plr[v3].InvBody[INVLOC_HAND_LEFT]; - goto LABEL_158; - } - if (plr[v3].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE - && plr[v3].InvBody[INVLOC_HAND_RIGHT]._iClass == plr[v3].HoldItem._iClass) { - goto LABEL_114; + } + if (r == 64 && (sy & 1) == 0) + j += 14; + } + if (!done) + return; + il = ILOC_UNEQUIPABLE; + if (r >= 0 && r <= 3) + il = ILOC_HELM; + if (r >= 4 && r <= 5) + il = ILOC_RING; + if (r == 6) + il = ILOC_AMULET; + if (r >= 7 && r <= 18) + il = ILOC_ONEHAND; + if (r >= 19 && r <= 24) + il = ILOC_ARMOR; + if (r >= 65 && r <= 72) + il = ILOC_BELT; + done = FALSE; + if (plr[pnum].HoldItem._iLoc == il) + done = TRUE; + if (il == ILOC_ONEHAND && plr[pnum].HoldItem._iLoc == ILOC_TWOHAND) { + il = ILOC_TWOHAND; + done = TRUE; + } + if (plr[pnum].HoldItem._iLoc == ILOC_UNEQUIPABLE && il == ILOC_BELT) { + if (sx == 1 && sy == 1) { + done = TRUE; + if (!AllItemsList[plr[pnum].HoldItem.IDidx].iUsable) + done = FALSE; + if (!plr[pnum].HoldItem._iStatFlag) + done = FALSE; + if (plr[pnum].HoldItem._itype == ITYPE_GOLD) + done = FALSE; + } + } + + if (il == ILOC_UNEQUIPABLE) { + done = TRUE; + it = 0; + ii = r - 25; + if (plr[pnum].HoldItem._itype == ITYPE_GOLD) { + yy = 10 * (ii / 10); + xx = ii % 10; + if (plr[pnum].InvGrid[xx + yy] != 0) { + iv = plr[pnum].InvGrid[xx + yy]; + if (iv > 0) { + if (plr[pnum].InvList[iv - 1]._itype != ITYPE_GOLD) { + it = iv; } - } - NetSendCmdChItem(FALSE, 4u); - v23 = &plr[v3].InvBody[INVLOC_HAND_LEFT]; - goto LABEL_99; - case ILOC_TWOHAND: - NetSendCmdDelItem(FALSE, 5u); - if (plr[v3].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_NONE) - goto LABEL_147; - v26 = plr[v3].InvBody[INVLOC_HAND_RIGHT]._itype; - if (v26 == -1) - goto LABEL_146; - qmemcpy(&tempitem, &plr[v3].HoldItem, sizeof(tempitem)); - v27 = &plr[v3].InvBody[INVLOC_HAND_RIGHT]; - if (v26 != ITYPE_SHIELD) - v27 = &plr[v3].InvBody[INVLOC_HAND_LEFT]; - v28 = p; - qmemcpy(&plr[v3].HoldItem, v27, sizeof(plr[v3].HoldItem)); - v29 = plr[v3].HoldItem._iCurs + CURSOR_FIRSTITEM; - if (v28 == myplr) - SetCursor_(v29); - else - SetICursor(v29); - v67 = 0; - v30 = 0; - do { - if (v67) - break; - v31 = AutoPlace(p, v30++, icursW28, icursH28, 1); - v67 = v31; - } while (v30 < 40); - v32 = p; - qmemcpy(&plr[v3].HoldItem, &tempitem, sizeof(plr[v3].HoldItem)); - v33 = plr[v3].HoldItem._iCurs + CURSOR_FIRSTITEM; - if (v32 == myplr) - SetCursor_(v33); - else - SetICursor(v33); - if (!v67) - return; - if (plr[v3].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SHIELD) - plr[v3].InvBody[INVLOC_HAND_RIGHT]._itype = ITYPE_NONE; - else - plr[v3].InvBody[INVLOC_HAND_LEFT]._itype = ITYPE_NONE; - LABEL_146: - if (plr[v3].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE) - goto LABEL_149; - LABEL_147: - if (plr[v3].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_NONE) { - NetSendCmdChItem(FALSE, 4u); - qmemcpy(&plr[v3].InvBody[INVLOC_HAND_LEFT], &plr[v3].HoldItem, sizeof(plr[v3].InvBody[INVLOC_HAND_LEFT])); } else { - LABEL_149: - NetSendCmdChItem(FALSE, 4u); - if (plr[v3].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_NONE) - SwapItem(&plr[v3].InvBody[INVLOC_HAND_LEFT], &plr[v3].InvBody[INVLOC_HAND_RIGHT]); - cursor_ida = SwapItem(&plr[v3].InvBody[INVLOC_HAND_LEFT], &plr[v3].HoldItem); + it = -iv; } - if (plr[v3].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_STAFF) { - v34 = plr[v3].InvBody[INVLOC_HAND_LEFT]._iSpell; - if (v34) { - if (plr[v3].InvBody[INVLOC_HAND_LEFT]._iCharges > 0) { - plr[v3]._pRSpell = v34; - _LOBYTE(plr[v3]._pRSplType) = RSPLTYPE_CHARGES; - drawpanflag = 255; + } + } else { + yy = 10 * ((ii / 10) - ((sy - 1) >> 1)); + if (yy < 0) + yy = 0; + for (j = 0; j < sy && done; j++) { + if (yy >= NUM_INV_GRID_ELEM) + done = FALSE; + xx = (ii % 10) - ((sx - 1) >> 1); + if (xx < 0) + xx = 0; + for (i = 0; i < sx && done; i++) { + if (xx >= 10) { + done = FALSE; + } else { + if (plr[pnum].InvGrid[xx + yy] != 0) { + iv = plr[pnum].InvGrid[xx + yy]; + if (iv < 0) + iv = -iv; + if (it != 0) { + if (it != iv) + done = FALSE; + } else + it = iv; } } + xx++; } - goto LABEL_226; - case ILOC_ARMOR: - NetSendCmdChItem(FALSE, 6u); - if (plr[v3].InvBody[INVLOC_CHEST]._itype == ITYPE_NONE) { - v22 = &plr[v3].InvBody[INVLOC_CHEST]; - goto LABEL_158; - } - v23 = &plr[v3].InvBody[INVLOC_CHEST]; - goto LABEL_99; - case ILOC_HELM: - NetSendCmdChItem(FALSE, 0); - if (plr[v3].InvBody[INVLOC_HEAD]._itype == ITYPE_NONE) { - v22 = plr[v3].InvBody; - goto LABEL_158; - } - v23 = plr[v3].InvBody; - goto LABEL_99; - case ILOC_RING: - if (v10 == 4) { - NetSendCmdChItem(FALSE, 1u); - if (plr[v3].InvBody[INVLOC_RING_LEFT]._itype == ITYPE_NONE) { - v22 = &plr[v3].InvBody[INVLOC_RING_LEFT]; - goto LABEL_158; - } - v23 = &plr[v3].InvBody[INVLOC_RING_LEFT]; + yy += 10; + } + } + } + + if (!done) + return; + + if (il != ILOC_UNEQUIPABLE && il != ILOC_BELT && !plr[pnum].HoldItem._iStatFlag) { + done = FALSE; + if (plr[pnum]._pClass == PC_WARRIOR) + PlaySFX(PS_WARR13); + else if (plr[pnum]._pClass == PC_ROGUE) + PlaySFX(PS_ROGUE13); + else if (plr[pnum]._pClass == PC_SORCERER) + PlaySFX(PS_MAGE13); + } + + if (!done) + return; + + if (pnum == myplr) + PlaySFX(ItemInvSnds[ItemCAnimTbl[plr[pnum].HoldItem._iCurs]]); + + cn = CURSOR_HAND; + switch (il) { + case ILOC_HELM: + NetSendCmdChItem(FALSE, INVLOC_HEAD); + if (plr[pnum].InvBody[INVLOC_HEAD]._itype == ITYPE_NONE) + plr[pnum].InvBody[INVLOC_HEAD] = plr[pnum].HoldItem; + else + cn = SwapItem(&plr[pnum].InvBody[INVLOC_HEAD], &plr[pnum].HoldItem); + break; + case ILOC_RING: + if (r == 4) { + NetSendCmdChItem(FALSE, INVLOC_RING_LEFT); + if (plr[pnum].InvBody[INVLOC_RING_LEFT]._itype == ITYPE_NONE) + plr[pnum].InvBody[INVLOC_RING_LEFT] = plr[pnum].HoldItem; + else + cn = SwapItem(&plr[pnum].InvBody[INVLOC_RING_LEFT], &plr[pnum].HoldItem); + } else { + NetSendCmdChItem(FALSE, INVLOC_RING_RIGHT); + if (plr[pnum].InvBody[INVLOC_RING_RIGHT]._itype == ITYPE_NONE) + plr[pnum].InvBody[INVLOC_RING_RIGHT] = plr[pnum].HoldItem; + else + cn = SwapItem(&plr[pnum].InvBody[INVLOC_RING_RIGHT], &plr[pnum].HoldItem); + } + break; + case ILOC_AMULET: + NetSendCmdChItem(0, INVLOC_AMULET); + if (plr[pnum].InvBody[INVLOC_AMULET]._itype == ITYPE_NONE) + plr[pnum].InvBody[INVLOC_AMULET] = plr[pnum].HoldItem; + else + cn = SwapItem(&plr[pnum].InvBody[INVLOC_AMULET], &plr[pnum].HoldItem); + break; + case ILOC_ONEHAND: + if (r <= 12) { + if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_NONE) { + if (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_NONE || plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iClass != plr[pnum].HoldItem._iClass) { + NetSendCmdChItem(FALSE, INVLOC_HAND_LEFT); + plr[pnum].InvBody[INVLOC_HAND_LEFT] = plr[pnum].HoldItem; } else { - NetSendCmdChItem(FALSE, 2u); - if (plr[v3].InvBody[INVLOC_RING_RIGHT]._itype == ITYPE_NONE) { - v22 = &plr[v3].InvBody[INVLOC_RING_RIGHT]; - goto LABEL_158; - } - v23 = &plr[v3].InvBody[INVLOC_RING_RIGHT]; - } - goto LABEL_99; - case ILOC_AMULET: - NetSendCmdChItem(FALSE, 3u); - if (plr[v3].InvBody[INVLOC_AMULET]._itype == ITYPE_NONE) { - v22 = &plr[v3].InvBody[INVLOC_AMULET]; - goto LABEL_158; + NetSendCmdChItem(FALSE, INVLOC_HAND_RIGHT); + cn = SwapItem(&plr[pnum].InvBody[INVLOC_HAND_RIGHT], &plr[pnum].HoldItem); } - v23 = &plr[v3].InvBody[INVLOC_AMULET]; - goto LABEL_99; - case ILOC_UNEQUIPABLE: - v35 = plr[v3].HoldItem._itype; - if (v35 == ITYPE_GOLD) { - if (!v66) { - v36 = &plr[0].InvGrid[10 * ((v68 - 25) / 10) + v3 * 21720 + (v68 - 25) % 10]; - if (*v36 <= 0) { - v42 = 368 * plr[v3]._pNumInv + v3 * 21720; - qmemcpy((char *)plr[0].InvList + v42, &plr[v3].HoldItem, 0x170u); - ++plr[v3]._pNumInv; - *v36 = plr[v3]._pNumInv; - v43 = plr[v3].HoldItem._ivalue; - plr[v3]._pGold += v43; - if (v43 <= 5000) { - if (v43 < 2500) { - if (v43 > 1000) - *(int *)((char *)&plr[0].InvList[0]._iCurs + v42) = 5; - else - *(int *)((char *)&plr[0].InvList[0]._iCurs + v42) = 4; - } else { - *(int *)((char *)&plr[0].InvList[0]._iCurs + v42) = 6; - } - } - goto LABEL_226; - } - v37 = plr[v3].HoldItem._ivalue; - v38 = 368 * (*v36 - 1) + v3 * 21720; - v39 = *(int *)((char *)&plr[0].InvList[0]._ivalue + v38); - v40 = v37 + v39; - if (v37 + v39 <= 5000) { - *(int *)((char *)&plr[0].InvList[0]._ivalue + v38) = v40; - plr[v3]._pGold += plr[v3].HoldItem._ivalue; - if (v40 < 2500) { - if (v40 > 1000) - *(int *)((char *)&plr[0].InvList[0]._iCurs + v38) = 5; - else - *(int *)((char *)&plr[0].InvList[0]._iCurs + v38) = 4; - } else { - *(int *)((char *)&plr[0].InvList[0]._iCurs + v38) = 6; - } - goto LABEL_226; - } - plr[v3]._pGold += 5000 - v39; - plr[v3].HoldItem._ivalue = v37 - (5000 - v39); - *(int *)((char *)&plr[0].InvList[0]._ivalue + v38) = 5000; - *(int *)((char *)&plr[0].InvList[0]._iCurs + v38) = 6; - v41 = plr[v3].HoldItem._ivalue; - if (v41 >= 2500) { - cursor_ida = 18; - goto LABEL_226; - } - v24 = (v41 > 1000) + 16; - goto LABEL_172; - } - } else if (!v66) { - qmemcpy((char *)&plr[0].InvList[plr[v3]._pNumInv++] + v3 * 21720, &plr[v3].HoldItem, 0x170u); - v66 = plr[v3]._pNumInv; - LABEL_191: - v48 = v67; - v49 = 10 * ((v68 - 25) / 10 - ((v67 - 1) >> 1)); - if (v49 < 0) - v49 = 0; - v65 = 0; - if (v67 > 0) { - v69 = (v68 - 25) % 10 - ((v64 - 1) >> 1); - do { - v50 = v69; - if (v69 < 0) - v50 = 0; - v67 = 0; - if (v64 > 0) { - v51 = &plr[v3].InvGrid[v50 + v49]; - do { - if (v67 || v65 != v48 - 1) - v52 = -(char)v66; - else - v52 = v66; - *v51++ = v52; - ++v67; - } while (v67 < v64); - } - v49 += 10; - ++v65; - } while (v65 < v48); - } - goto LABEL_226; + break; + } + if (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_NONE || plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iClass != plr[pnum].HoldItem._iClass) { + NetSendCmdChItem(FALSE, INVLOC_HAND_LEFT); + cn = SwapItem(&plr[pnum].InvBody[INVLOC_HAND_LEFT], &plr[pnum].HoldItem); + break; + } + + NetSendCmdChItem(FALSE, INVLOC_HAND_RIGHT); + cn = SwapItem(&plr[pnum].InvBody[INVLOC_HAND_RIGHT], &plr[pnum].HoldItem); + break; + } + if (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_NONE) { + if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_NONE || plr[pnum].InvBody[INVLOC_HAND_LEFT]._iLoc != ILOC_TWOHAND) { + if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_NONE || plr[pnum].InvBody[INVLOC_HAND_LEFT]._iClass != plr[pnum].HoldItem._iClass) { + NetSendCmdChItem(FALSE, INVLOC_HAND_RIGHT); + plr[pnum].InvBody[INVLOC_HAND_RIGHT] = plr[pnum].HoldItem; + break; } - v44 = v66 - 1; - if (v35 == ITYPE_GOLD) - plr[v3]._pGold += plr[v3].HoldItem._ivalue; - cursor_ida = SwapItem((ItemStruct *)((char *)&plr[0].InvList[v44] + v3 * 21720), &plr[v3].HoldItem); - if (plr[v3].HoldItem._itype == ITYPE_GOLD) - plr[v3]._pGold = CalculateGold(v21); - v45 = 0; - v46 = -v66; - do { - v47 = &plr[v3].InvGrid[v45]; - if (*v47 == v66) - *v47 = 0; - if (*v47 == v46) - *v47 = 0; - ++v45; - } while (v45 < 40); - goto LABEL_191; - case ILOC_BELT: - v53 = v3 * 21720 + 368 * (v68 - 65); - if (plr[v3].HoldItem._itype != ITYPE_GOLD) { - if (*(int *)((char *)&plr[0].SpdList[0]._itype + v53) == ITYPE_NONE) { - qmemcpy((char *)plr[0].SpdList + v53, &plr[v3].HoldItem, 0x170u); - } else { - cursor_ida = SwapItem((ItemStruct *)((char *)plr[0].SpdList + v53), &plr[v3].HoldItem); - if (plr[v3].HoldItem._itype == ITYPE_GOLD) - plr[v3]._pGold = CalculateGold(p); - } - goto LABEL_225; + NetSendCmdChItem(FALSE, INVLOC_HAND_LEFT); + cn = SwapItem(&plr[pnum].InvBody[INVLOC_HAND_LEFT], &plr[pnum].HoldItem); + break; + } + NetSendCmdDelItem(FALSE, INVLOC_HAND_LEFT); + NetSendCmdChItem(FALSE, INVLOC_HAND_RIGHT); + SwapItem(&plr[pnum].InvBody[INVLOC_HAND_RIGHT], &plr[pnum].InvBody[INVLOC_HAND_LEFT]); + cn = SwapItem(&plr[pnum].InvBody[INVLOC_HAND_RIGHT], &plr[pnum].HoldItem); + break; + } + + if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_LEFT]._iClass == plr[pnum].HoldItem._iClass) { + NetSendCmdChItem(FALSE, INVLOC_HAND_LEFT); + cn = SwapItem(&plr[pnum].InvBody[INVLOC_HAND_LEFT], &plr[pnum].HoldItem); + break; + } + NetSendCmdChItem(FALSE, INVLOC_HAND_RIGHT); + cn = SwapItem(&plr[pnum].InvBody[INVLOC_HAND_RIGHT], &plr[pnum].HoldItem); + break; + case ILOC_TWOHAND: + NetSendCmdDelItem(FALSE, INVLOC_HAND_RIGHT); + if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE) { + tempitem = plr[pnum].HoldItem; + if (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SHIELD) + plr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_HAND_RIGHT]; + else + plr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_HAND_LEFT]; + if (pnum == myplr) + SetCursor_(plr[pnum].HoldItem._iCurs + CURSOR_FIRSTITEM); + else + SetICursor(plr[pnum].HoldItem._iCurs + CURSOR_FIRSTITEM); + done2h = FALSE; + for (i = 0; i < NUM_INV_GRID_ELEM && !done2h; i++) + done2h = AutoPlace(pnum, i, icursW28, icursH28, TRUE); + plr[pnum].HoldItem = tempitem; + if (pnum == myplr) + SetCursor_(plr[pnum].HoldItem._iCurs + CURSOR_FIRSTITEM); + else + SetICursor(plr[pnum].HoldItem._iCurs + CURSOR_FIRSTITEM); + if (!done2h) + return; + + if (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SHIELD) + plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype = ITYPE_NONE; + else + plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype = ITYPE_NONE; + } + + if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE || plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE) { + NetSendCmdChItem(FALSE, INVLOC_HAND_LEFT); + if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_NONE) + SwapItem(&plr[pnum].InvBody[INVLOC_HAND_LEFT], &plr[pnum].InvBody[INVLOC_HAND_RIGHT]); + cn = SwapItem(&plr[pnum].InvBody[INVLOC_HAND_LEFT], &plr[pnum].HoldItem); + } else { + NetSendCmdChItem(FALSE, INVLOC_HAND_LEFT); + plr[pnum].InvBody[INVLOC_HAND_LEFT] = plr[pnum].HoldItem; + } + if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_STAFF && plr[pnum].InvBody[INVLOC_HAND_LEFT]._iSpell != 0 && plr[pnum].InvBody[INVLOC_HAND_LEFT]._iCharges > 0) { + plr[pnum]._pRSpell = plr[pnum].InvBody[INVLOC_HAND_LEFT]._iSpell; + plr[pnum]._pRSplType = RSPLTYPE_CHARGES; + drawpanflag = 255; + } + break; + case ILOC_ARMOR: + NetSendCmdChItem(FALSE, INVLOC_CHEST); + if (plr[pnum].InvBody[INVLOC_CHEST]._itype == ITYPE_NONE) + plr[pnum].InvBody[INVLOC_CHEST] = plr[pnum].HoldItem; + else + cn = SwapItem(&plr[pnum].InvBody[INVLOC_CHEST], &plr[pnum].HoldItem); + break; + case ILOC_UNEQUIPABLE: + if (plr[pnum].HoldItem._itype == ITYPE_GOLD && it == 0) { + ii = r - 25; + yy = 10 * (ii / 10); + xx = ii % 10; + if (plr[pnum].InvGrid[yy + xx] > 0) { + il = plr[pnum].InvGrid[yy + xx]; + il--; + gt = plr[pnum].InvList[il]._ivalue; + ig = plr[pnum].HoldItem._ivalue + gt; + if (ig <= 5000) { + plr[pnum].InvList[il]._ivalue = ig; + plr[pnum]._pGold += plr[pnum].HoldItem._ivalue; + if (ig >= 2500) + plr[pnum].InvList[il]._iCurs = ICURS_GOLD_LARGE; + else if (ig <= 1000) + plr[pnum].InvList[il]._iCurs = ICURS_GOLD_SMALL; + else + plr[pnum].InvList[il]._iCurs = ICURS_GOLD_MEDIUM; + } else { + ig = 5000 - gt; + plr[pnum]._pGold += ig; + plr[pnum].HoldItem._ivalue -= ig; + plr[pnum].InvList[il]._ivalue = 5000; + plr[pnum].InvList[il]._iCurs = ICURS_GOLD_LARGE; + // BUGFIX: incorrect values here are leftover from beta + if (plr[pnum].HoldItem._ivalue >= 2500) + cn = 18; + else if (plr[pnum].HoldItem._ivalue <= 1000) + cn = 16; + else + cn = 17; } - v54 = *(int *)((char *)&plr[0].SpdList[0]._itype + v53); - if (v54 != ITYPE_NONE) { - if (v54 == ITYPE_GOLD) { - v55 = *(int *)((char *)&plr[0].SpdList[0]._ivalue + v53); - v56 = plr[v3].HoldItem._ivalue; - v57 = v55 + v56; - if (v55 + v56 <= 5000) { - *(int *)((char *)&plr[0].SpdList[0]._ivalue + v53) = v57; - plr[v3]._pGold += plr[v3].HoldItem._ivalue; - if (v57 < 2500) { - if (v57 > 1000) - *(int *)((char *)&plr[0].SpdList[0]._iCurs + v53) = 5; - else - *(int *)((char *)&plr[0].SpdList[0]._iCurs + v53) = 4; - } else { - *(int *)((char *)&plr[0].SpdList[0]._iCurs + v53) = 6; - } - goto LABEL_225; - } - plr[v3]._pGold += 5000 - v55; - plr[v3].HoldItem._ivalue = v56 - (5000 - v55); - *(int *)((char *)&plr[0].SpdList[0]._ivalue + v53) = 5000; - *(int *)((char *)&plr[0].SpdList[0]._iCurs + v53) = 6; - v58 = plr[v3].HoldItem._ivalue; - if (v58 >= 2500) { - cursor_ida = 18; - goto LABEL_225; - } - v59 = (v58 > 1000) + 16; - } else { - plr[v3]._pGold += plr[v3].HoldItem._ivalue; - v59 = SwapItem((ItemStruct *)((char *)plr[0].SpdList + v53), &plr[v3].HoldItem); - } - cursor_ida = v59; - goto LABEL_225; + } else { + il = plr[pnum]._pNumInv; + plr[pnum].InvList[il] = plr[pnum].HoldItem; + plr[pnum]._pNumInv++; + plr[pnum].InvGrid[yy + xx] = plr[pnum]._pNumInv; + plr[pnum]._pGold += plr[pnum].HoldItem._ivalue; + if (plr[pnum].HoldItem._ivalue <= 5000) { + if (plr[pnum].HoldItem._ivalue >= 2500) + plr[pnum].InvList[il]._iCurs = ICURS_GOLD_LARGE; + else if (plr[pnum].HoldItem._ivalue <= 1000) + plr[pnum].InvList[il]._iCurs = ICURS_GOLD_SMALL; + else + plr[pnum].InvList[il]._iCurs = ICURS_GOLD_MEDIUM; } - qmemcpy((char *)plr[0].SpdList + v53, &plr[v3].HoldItem, 0x170u); - plr[v3]._pGold += plr[v3].HoldItem._ivalue; - LABEL_225: - drawsbarflag = TRUE; - LABEL_226: - v60 = p; - CalcPlrInv(p, 1u); - if (v60 == myplr) { - if (cursor_ida == 1) - SetCursorPos(MouseX + (cursW >> 1), MouseY + (cursH >> 1)); - SetCursor_(cursor_ida); + } + } else { + if (it == 0) { + plr[pnum].InvList[plr[pnum]._pNumInv] = plr[pnum].HoldItem; + plr[pnum]._pNumInv++; + it = plr[pnum]._pNumInv; + } else { + il = it - 1; + if (plr[pnum].HoldItem._itype == ITYPE_GOLD) + plr[pnum]._pGold += plr[pnum].HoldItem._ivalue; + cn = SwapItem(&plr[pnum].InvList[il], &plr[pnum].HoldItem); + if (plr[pnum].HoldItem._itype == ITYPE_GOLD) + plr[pnum]._pGold = CalculateGold(pnum); + for (i = 0; i < NUM_INV_GRID_ELEM; i++) { + if (plr[pnum].InvGrid[i] == it) + plr[pnum].InvGrid[i] = 0; + if (plr[pnum].InvGrid[i] == -it) + plr[pnum].InvGrid[i] = 0; } - return; - default: - goto LABEL_226; } - } - v62 = (v68 - 25) % 10; - v14 = 10 * (v13 - ((v67 - 1) >> 1)); - if (v14 < 0) - v14 = 0; - v65 = 0; - if (v67 <= 0) - goto LABEL_93; - v15 = &plr[v3].InvGrid[v14]; - while (1) { - if (cursor_id == CURSOR_NONE) - return; - if (v14 >= 40) - cursor_id = 0; - v16 = v62 - ((v64 - 1) >> 1); - if (v16 < 0) - v16 = 0; - v17 = 0; - if (v64 > 0) - break; - LABEL_79: - v14 += 10; - v15 += 10; - if (++v65 >= v67) { - v12 = cursor_id; - v10 = v68; - goto LABEL_81; + ii = r - 25; + yy = 10 * (ii / 10 - ((sy - 1) >> 1)); + if (yy < 0) + yy = 0; + for (j = 0; j < sy; j++) { + xx = (ii % 10 - ((sx - 1) >> 1)); + if (xx < 0) + xx = 0; + for (i = 0; i < sx; i++) { + if (i != 0 || j != sy - 1) + plr[pnum].InvGrid[xx + yy] = -it; + else + plr[pnum].InvGrid[xx + yy] = it; + xx++; + } + yy += 10; } } - while (1) { - if (cursor_id == CURSOR_NONE) - goto LABEL_79; - if (v16 >= 10) - goto LABEL_233; - _LOBYTE(v18) = v15[v16]; - if ((_BYTE)v18) { - v18 = (char)v18; - if ((v18 & 0x80u) != 0) - v18 = -v18; - if (!v66) { - v66 = v18; - goto LABEL_78; + break; + case ILOC_BELT: + ii = r - 65; + if (plr[pnum].HoldItem._itype == ITYPE_GOLD) { + if (plr[pnum].SpdList[ii]._itype != ITYPE_NONE) { + if (plr[pnum].SpdList[ii]._itype == ITYPE_GOLD) { + i = plr[pnum].HoldItem._ivalue + plr[pnum].SpdList[ii]._ivalue; + if (i <= 5000) { + plr[pnum].SpdList[ii]._ivalue += plr[pnum].HoldItem._ivalue; + plr[pnum]._pGold += plr[pnum].HoldItem._ivalue; + if (i >= 2500) + plr[pnum].SpdList[ii]._iCurs = ICURS_GOLD_LARGE; + else if (i <= 1000) + plr[pnum].SpdList[ii]._iCurs = ICURS_GOLD_SMALL; + else + plr[pnum].SpdList[ii]._iCurs = ICURS_GOLD_MEDIUM; + } else { + i = 5000 - plr[pnum].SpdList[ii]._ivalue; + plr[pnum]._pGold += i; + plr[pnum].HoldItem._ivalue -= i; + plr[pnum].SpdList[ii]._ivalue = 5000; + plr[pnum].SpdList[ii]._iCurs = ICURS_GOLD_LARGE; + + // BUGFIX: incorrect values here are leftover from beta + if (plr[pnum].HoldItem._ivalue >= 2500) + cn = 18; + else if (plr[pnum].HoldItem._ivalue <= 1000) + cn = 16; + else + cn = 17; + } + } else { + plr[pnum]._pGold += plr[pnum].HoldItem._ivalue; + cn = SwapItem(&plr[pnum].SpdList[ii], &plr[pnum].HoldItem); } - if (v66 != v18) - LABEL_233: - cursor_id = 0; + } else { + plr[pnum].SpdList[ii] = plr[pnum].HoldItem; + plr[pnum]._pGold += plr[pnum].HoldItem._ivalue; } - LABEL_78: - ++v16; - if (++v17 >= v64) - goto LABEL_79; - } - } - if (v64 == 1 && v67 == 1) { - v12 = 1; - if (!AllItemsList[plr[v3].HoldItem.IDidx].iUsable) - v12 = 0; - if (!plr[v3].HoldItem._iStatFlag) - v12 = 0; - if (plr[v3].HoldItem._itype == ITYPE_GOLD) { - v12 = 0; - goto LABEL_50; + } else if (plr[pnum].SpdList[ii]._itype == ITYPE_NONE) { + plr[pnum].SpdList[ii] = plr[pnum].HoldItem; + } else { + cn = SwapItem(&plr[pnum].SpdList[ii], &plr[pnum].HoldItem); + if (plr[pnum].HoldItem._itype == 11) + plr[pnum]._pGold = CalculateGold(pnum); } + drawsbarflag = 1; + break; } -LABEL_81: - if (!v12) - return; - if (v69 == ILOC_UNEQUIPABLE || v69 == ILOC_BELT || plr[v3].HoldItem._iStatFlag) { - goto LABEL_93; - } - if (plr[v3]._pClass == PC_WARRIOR) { - PlaySFX(PS_WARR13); - } else if (plr[v3]._pClass == PC_ROGUE) { - PlaySFX(PS_ROGUE13); - } else if (plr[v3]._pClass == PC_SORCERER) { - PlaySFX(PS_MAGE13); + CalcPlrInv(pnum, 1); + if (pnum == myplr) { + if (cn == 1) + SetCursorPos(MouseX + (cursW >> 1), MouseY + (cursH >> 1)); + SetCursor_(cn); } } -// 4B8C9C: using guessed type int cursH; -// 4B8CB4: using guessed type int icursH; -// 4B8CBC: using guessed type int icursW; -// 52571C: using guessed type int drawpanflag; void CheckInvSwap(int pnum, BYTE bLoc, int idx, WORD wCI, int seed, BOOL bId) {