Devilution
Diablo devolved - magic behind the 1996 computer game
inv.cpp
Go to the documentation of this file.
1 
6 #include "all.h"
7 
9 
10 BOOL invflag;
11 BYTE *pInvCels;
13 int sgdwLastTime; // check name
14 
31 const InvXY InvRect[73] = {
32  // clang-format off
33  // X, Y
34  { RIGHT_PANEL + 132, 31 }, // helmet
35  { RIGHT_PANEL + 160, 31 }, // helmet
36  { RIGHT_PANEL + 132, 59 }, // helmet
37  { RIGHT_PANEL + 160, 59 }, // helmet
38  { RIGHT_PANEL + 45, 205 }, // left ring
39  { RIGHT_PANEL + 247, 205 }, // right ring
40  { RIGHT_PANEL + 204, 59 }, // amulet
41  { RIGHT_PANEL + 17, 104 }, // left hand
42  { RIGHT_PANEL + 46, 104 }, // left hand
43  { RIGHT_PANEL + 17, 132 }, // left hand
44  { RIGHT_PANEL + 46, 132 }, // left hand
45  { RIGHT_PANEL + 17, 160 }, // left hand
46  { RIGHT_PANEL + 46, 160 }, // left hand
47  { RIGHT_PANEL + 247, 104 }, // right hand
48  { RIGHT_PANEL + 276, 104 }, // right hand
49  { RIGHT_PANEL + 247, 132 }, // right hand
50  { RIGHT_PANEL + 276, 132 }, // right hand
51  { RIGHT_PANEL + 247, 160 }, // right hand
52  { RIGHT_PANEL + 276, 160 }, // right hand
53  { RIGHT_PANEL + 132, 104 }, // chest
54  { RIGHT_PANEL + 160, 104 }, // chest
55  { RIGHT_PANEL + 132, 132 }, // chest
56  { RIGHT_PANEL + 160, 132 }, // chest
57  { RIGHT_PANEL + 132, 160 }, // chest
58  { RIGHT_PANEL + 160, 160 }, // chest
59  { RIGHT_PANEL + 17, 250 }, // inv row 1
60  { RIGHT_PANEL + 46, 250 }, // inv row 1
61  { RIGHT_PANEL + 74, 250 }, // inv row 1
62  { RIGHT_PANEL + 103, 250 }, // inv row 1
63  { RIGHT_PANEL + 131, 250 }, // inv row 1
64  { RIGHT_PANEL + 160, 250 }, // inv row 1
65  { RIGHT_PANEL + 189, 250 }, // inv row 1
66  { RIGHT_PANEL + 218, 250 }, // inv row 1
67  { RIGHT_PANEL + 247, 250 }, // inv row 1
68  { RIGHT_PANEL + 276, 250 }, // inv row 1
69  { RIGHT_PANEL + 17, 279 }, // inv row 2
70  { RIGHT_PANEL + 46, 279 }, // inv row 2
71  { RIGHT_PANEL + 74, 279 }, // inv row 2
72  { RIGHT_PANEL + 103, 279 }, // inv row 2
73  { RIGHT_PANEL + 131, 279 }, // inv row 2
74  { RIGHT_PANEL + 160, 279 }, // inv row 2
75  { RIGHT_PANEL + 189, 279 }, // inv row 2
76  { RIGHT_PANEL + 218, 279 }, // inv row 2
77  { RIGHT_PANEL + 247, 279 }, // inv row 2
78  { RIGHT_PANEL + 276, 279 }, // inv row 2
79  { RIGHT_PANEL + 17, 308 }, // inv row 3
80  { RIGHT_PANEL + 46, 308 }, // inv row 3
81  { RIGHT_PANEL + 74, 308 }, // inv row 3
82  { RIGHT_PANEL + 103, 308 }, // inv row 3
83  { RIGHT_PANEL + 131, 308 }, // inv row 3
84  { RIGHT_PANEL + 160, 308 }, // inv row 3
85  { RIGHT_PANEL + 189, 308 }, // inv row 3
86  { RIGHT_PANEL + 218, 308 }, // inv row 3
87  { RIGHT_PANEL + 247, 308 }, // inv row 3
88  { RIGHT_PANEL + 276, 308 }, // inv row 3
89  { RIGHT_PANEL + 17, 336 }, // inv row 4
90  { RIGHT_PANEL + 46, 336 }, // inv row 4
91  { RIGHT_PANEL + 74, 336 }, // inv row 4
92  { RIGHT_PANEL + 103, 336 }, // inv row 4
93  { RIGHT_PANEL + 131, 336 }, // inv row 4
94  { RIGHT_PANEL + 160, 336 }, // inv row 4
95  { RIGHT_PANEL + 189, 336 }, // inv row 4
96  { RIGHT_PANEL + 218, 336 }, // inv row 4
97  { RIGHT_PANEL + 247, 336 }, // inv row 4
98  { RIGHT_PANEL + 276, 336 }, // inv row 4
99  { PANEL_LEFT + 205, PANEL_TOP + 33 }, // belt
100  { PANEL_LEFT + 234, PANEL_TOP + 33 }, // belt
101  { PANEL_LEFT + 263, PANEL_TOP + 33 }, // belt
102  { PANEL_LEFT + 292, PANEL_TOP + 33 }, // belt
103  { PANEL_LEFT + 321, PANEL_TOP + 33 }, // belt
104  { PANEL_LEFT + 350, PANEL_TOP + 33 }, // belt
105  { PANEL_LEFT + 379, PANEL_TOP + 33 }, // belt
106  { PANEL_LEFT + 408, PANEL_TOP + 33 } // belt
107  // clang-format on
108 };
109 
110 /* data */
112 int AP2x2Tbl[10] = { 8, 28, 6, 26, 4, 24, 2, 22, 0, 20 };
113 
115 {
117 }
118 
119 void InitInv()
120 {
121  if (plr[myplr]._pClass == PC_WARRIOR) {
122  pInvCels = LoadFileInMem("Data\\Inv\\Inv.CEL", NULL);
123 #ifndef SPAWN
124  } else if (plr[myplr]._pClass == PC_ROGUE) {
125  pInvCels = LoadFileInMem("Data\\Inv\\Inv_rog.CEL", NULL);
126  } else if (plr[myplr]._pClass == PC_SORCERER) {
127  pInvCels = LoadFileInMem("Data\\Inv\\Inv_Sor.CEL", NULL);
128 #endif
129  }
130 
131  invflag = FALSE;
132  drawsbarflag = FALSE;
133 }
134 
135 void InvDrawSlotBack(int X, int Y, int W, int H)
136 {
137  BYTE *dst;
138 
140 
141  dst = &gpBuffer[X + BUFFER_WIDTH * Y];
142 
143  int wdt, hgt;
144  BYTE pix;
145 
146  for (hgt = H; hgt; hgt--, dst -= BUFFER_WIDTH + W) {
147  for (wdt = W; wdt; wdt--) {
148  pix = *dst;
149  if (pix >= PAL16_BLUE) {
150  if (pix <= PAL16_BLUE + 15)
151  pix -= PAL16_BLUE - PAL16_BEIGE;
152  else if (pix >= PAL16_GRAY)
153  pix -= PAL16_GRAY - PAL16_BEIGE;
154  }
155  *dst++ = pix;
156  }
157  }
158 }
159 
160 void DrawInv()
161 {
162  BOOL invtest[NUM_INV_GRID_ELEM];
163  int frame, frame_width, color, screen_x, screen_y, i, j, ii;
164  BYTE *pBuff;
165 
167 
168  if (plr[myplr].InvBody[INVLOC_HEAD]._itype != ITYPE_NONE) {
170 
172  frame_width = InvItemWidth[frame];
173 
174  if (pcursinvitem == INVITEM_HEAD) {
175  color = ICOL_WHITE;
176  if (plr[myplr].InvBody[INVLOC_HEAD]._iMagical != ITEM_QUALITY_NORMAL) {
177  color = ICOL_BLUE;
178  }
179  if (!plr[myplr].InvBody[INVLOC_HEAD]._iStatFlag) {
180  color = ICOL_RED;
181  }
182  CelBlitOutline(color, RIGHT_PANEL_X + 133, 59 + SCREEN_Y, pCursCels, frame, frame_width);
183  }
184 
185  if (plr[myplr].InvBody[INVLOC_HEAD]._iStatFlag) {
186  CelClippedDraw(RIGHT_PANEL_X + 133, 59 + SCREEN_Y, pCursCels, frame, frame_width);
187  } else {
188  CelDrawLightRed(RIGHT_PANEL_X + 133, 59 + SCREEN_Y, pCursCels, frame, frame_width, 1);
189  }
190  }
191 
192  if (plr[myplr].InvBody[INVLOC_RING_LEFT]._itype != ITYPE_NONE) {
194 
196  frame_width = InvItemWidth[frame];
197 
199  color = ICOL_WHITE;
200  if (plr[myplr].InvBody[INVLOC_RING_LEFT]._iMagical != ITEM_QUALITY_NORMAL) {
201  color = ICOL_BLUE;
202  }
203  if (!plr[myplr].InvBody[INVLOC_RING_LEFT]._iStatFlag) {
204  color = ICOL_RED;
205  }
206  CelBlitOutline(color, RIGHT_PANEL_X + 48, 205 + SCREEN_Y, pCursCels, frame, frame_width);
207  }
208 
209  if (plr[myplr].InvBody[INVLOC_RING_LEFT]._iStatFlag) {
210  CelClippedDraw(RIGHT_PANEL_X + 48, 205 + SCREEN_Y, pCursCels, frame, frame_width);
211  } else {
212  CelDrawLightRed(RIGHT_PANEL_X + 48, 205 + SCREEN_Y, pCursCels, frame, frame_width, 1);
213  }
214  }
215 
216  if (plr[myplr].InvBody[INVLOC_RING_RIGHT]._itype != ITYPE_NONE) {
218 
220  frame_width = InvItemWidth[frame];
221 
223  color = ICOL_WHITE;
224  if (plr[myplr].InvBody[INVLOC_RING_RIGHT]._iMagical != ITEM_QUALITY_NORMAL) {
225  color = ICOL_BLUE;
226  }
227  if (!plr[myplr].InvBody[INVLOC_RING_RIGHT]._iStatFlag) {
228  color = ICOL_RED;
229  }
230  CelBlitOutline(color, RIGHT_PANEL_X + 249, 205 + SCREEN_Y, pCursCels, frame, frame_width);
231  }
232 
233  if (plr[myplr].InvBody[INVLOC_RING_RIGHT]._iStatFlag) {
234  CelClippedDraw(RIGHT_PANEL_X + 249, 205 + SCREEN_Y, pCursCels, frame, frame_width);
235  } else {
236  CelDrawLightRed(RIGHT_PANEL_X + 249, 205 + SCREEN_Y, pCursCels, frame, frame_width, 1);
237  }
238  }
239 
240  if (plr[myplr].InvBody[INVLOC_AMULET]._itype != ITYPE_NONE) {
242 
244  frame_width = InvItemWidth[frame];
245 
246  if (pcursinvitem == INVITEM_AMULET) {
247  color = ICOL_WHITE;
248  if (plr[myplr].InvBody[INVLOC_AMULET]._iMagical != ITEM_QUALITY_NORMAL) {
249  color = ICOL_BLUE;
250  }
251  if (!plr[myplr].InvBody[INVLOC_AMULET]._iStatFlag) {
252  color = ICOL_RED;
253  }
254  CelBlitOutline(color, RIGHT_PANEL_X + 205, 60 + SCREEN_Y, pCursCels, frame, frame_width);
255  }
256 
257  if (plr[myplr].InvBody[INVLOC_AMULET]._iStatFlag) {
258  CelClippedDraw(RIGHT_PANEL_X + 205, 60 + SCREEN_Y, pCursCels, frame, frame_width);
259  } else {
260  CelDrawLightRed(RIGHT_PANEL_X + 205, 60 + SCREEN_Y, pCursCels, frame, frame_width, 1);
261  }
262  }
263 
264  if (plr[myplr].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE) {
266 
268  frame_width = InvItemWidth[frame];
269  // calc item offsets for weapons smaller than 2x3 slots
270  screen_x = frame_width == INV_SLOT_SIZE_PX ? (RIGHT_PANEL_X + 31) : (RIGHT_PANEL_X + 17);
271  screen_y = InvItemHeight[frame] == (3 * INV_SLOT_SIZE_PX) ? (160 + SCREEN_Y) : (146 + SCREEN_Y);
272 
274  color = ICOL_WHITE;
275  if (plr[myplr].InvBody[INVLOC_HAND_LEFT]._iMagical != ITEM_QUALITY_NORMAL) {
276  color = ICOL_BLUE;
277  }
278  if (!plr[myplr].InvBody[INVLOC_HAND_LEFT]._iStatFlag) {
279  color = ICOL_RED;
280  }
281  CelBlitOutline(color, screen_x, screen_y, pCursCels, frame, frame_width);
282  }
283 
284  if (plr[myplr].InvBody[INVLOC_HAND_LEFT]._iStatFlag) {
285  CelClippedDraw(screen_x, screen_y, pCursCels, frame, frame_width);
286  } else {
287  CelDrawLightRed(screen_x, screen_y, pCursCels, frame, frame_width, 1);
288  }
289 
290  if (plr[myplr].InvBody[INVLOC_HAND_LEFT]._iLoc == ILOC_TWOHAND) {
292  light_table_index = 0;
294 
295  pBuff = frame_width == INV_SLOT_SIZE_PX
298  CelClippedBlitLightTrans(pBuff, pCursCels, frame, frame_width);
299 
301  }
302  }
303  if (plr[myplr].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE) {
305 
307  frame_width = InvItemWidth[frame];
308  // calc item offsets for weapons smaller than 2x3 slots
309  screen_x = frame_width == INV_SLOT_SIZE_PX ? (RIGHT_PANEL_X + 261) : (RIGHT_PANEL_X + 249);
310  screen_y = InvItemHeight[frame] == 3 * INV_SLOT_SIZE_PX ? (160 + SCREEN_Y) : (146 + SCREEN_Y);
311 
313  color = ICOL_WHITE;
314  if (plr[myplr].InvBody[INVLOC_HAND_RIGHT]._iMagical != ITEM_QUALITY_NORMAL) {
315  color = ICOL_BLUE;
316  }
317  if (!plr[myplr].InvBody[INVLOC_HAND_RIGHT]._iStatFlag) {
318  color = ICOL_RED;
319  }
320  CelBlitOutline(color, screen_x, screen_y, pCursCels, frame, frame_width);
321  }
322 
323  if (plr[myplr].InvBody[INVLOC_HAND_RIGHT]._iStatFlag) {
324  CelClippedDraw(screen_x, screen_y, pCursCels, frame, frame_width);
325  } else {
326  CelDrawLightRed(screen_x, screen_y, pCursCels, frame, frame_width, 1);
327  }
328  }
329 
330  if (plr[myplr].InvBody[INVLOC_CHEST]._itype != ITYPE_NONE) {
332 
334  frame_width = InvItemWidth[frame];
335 
336  if (pcursinvitem == INVITEM_CHEST) {
337  color = ICOL_WHITE;
338  if (plr[myplr].InvBody[INVLOC_CHEST]._iMagical != ITEM_QUALITY_NORMAL) {
339  color = ICOL_BLUE;
340  }
341  if (!plr[myplr].InvBody[INVLOC_CHEST]._iStatFlag) {
342  color = ICOL_RED;
343  }
344  CelBlitOutline(color, RIGHT_PANEL_X + 133, 160 + SCREEN_Y, pCursCels, frame, frame_width);
345  }
346 
347  if (plr[myplr].InvBody[INVLOC_CHEST]._iStatFlag) {
348  CelClippedDraw(RIGHT_PANEL_X + 133, 160 + SCREEN_Y, pCursCels, frame, frame_width);
349  } else {
350  CelDrawLightRed(RIGHT_PANEL_X + 133, 160 + SCREEN_Y, pCursCels, frame, frame_width, 1);
351  }
352  }
353 
354  for (i = 0; i < NUM_INV_GRID_ELEM; i++) {
355  invtest[i] = FALSE;
356  if (plr[myplr].InvGrid[i] != 0) {
359  InvRect[i + SLOTXY_INV_FIRST].Y + SCREEN_Y - 1,
362  }
363  }
364 
365  for (j = 0; j < NUM_INV_GRID_ELEM; j++) {
366  if (plr[myplr].InvGrid[j] > 0) // first slot of an item
367  {
368  ii = plr[myplr].InvGrid[j] - 1;
369 
370  invtest[j] = TRUE;
371 
372  frame = plr[myplr].InvList[ii]._iCurs + CURSOR_FIRSTITEM;
373  frame_width = InvItemWidth[frame];
374  if (pcursinvitem == ii + INVITEM_INV_FIRST) {
375  color = ICOL_WHITE;
376  if (plr[myplr].InvList[ii]._iMagical != ITEM_QUALITY_NORMAL) {
377  color = ICOL_BLUE;
378  }
379  if (!plr[myplr].InvList[ii]._iStatFlag) {
380  color = ICOL_RED;
381  }
383  color,
385  InvRect[j + SLOTXY_INV_FIRST].Y + SCREEN_Y - 1,
386  pCursCels, frame, frame_width);
387  }
388 
389  if (plr[myplr].InvList[ii]._iStatFlag) {
392  InvRect[j + SLOTXY_INV_FIRST].Y + SCREEN_Y - 1,
393  pCursCels, frame, frame_width);
394  } else {
397  InvRect[j + SLOTXY_INV_FIRST].Y + SCREEN_Y - 1,
398  pCursCels, frame, frame_width, 1);
399  }
400  }
401  }
402 }
403 
405 {
406  int i, frame, frame_width, color;
407  BYTE fi, ff;
408 
409  if (talkflag) {
410  return;
411  }
412 
413  DrawPanelBox(205, 21, 232, 28, PANEL_X + 205, PANEL_Y + 5);
414 
415  for (i = 0; i < MAXBELTITEMS; i++) {
416  if (plr[myplr].SpdList[i]._itype == ITYPE_NONE) {
417  continue;
418  }
419 
421  frame = plr[myplr].SpdList[i]._iCurs + CURSOR_FIRSTITEM;
422  frame_width = InvItemWidth[frame];
423 
424  if (pcursinvitem == i + INVITEM_BELT_FIRST) {
425  color = ICOL_WHITE;
426  if (plr[myplr].SpdList[i]._iMagical)
427  color = ICOL_BLUE;
428  if (!plr[myplr].SpdList[i]._iStatFlag)
429  color = ICOL_RED;
431  CelBlitOutline(color, InvRect[i + SLOTXY_BELT_FIRST].X + SCREEN_X, InvRect[i + SLOTXY_BELT_FIRST].Y + SCREEN_Y - 1, pCursCels, frame, frame_width);
432  }
433 
434  if (plr[myplr].SpdList[i]._iStatFlag) {
435  CelClippedDraw(InvRect[i + SLOTXY_BELT_FIRST].X + SCREEN_X, InvRect[i + SLOTXY_BELT_FIRST].Y + SCREEN_Y - 1, pCursCels, frame, frame_width);
436  } else {
437  CelDrawLightRed(InvRect[i + SLOTXY_BELT_FIRST].X + SCREEN_X, InvRect[i + SLOTXY_BELT_FIRST].Y + SCREEN_Y - 1, pCursCels, frame, frame_width, 1);
438  }
439 
440  if (AllItemsList[plr[myplr].SpdList[i].IDidx].iUsable
441  && plr[myplr].SpdList[i]._iStatFlag
442  && plr[myplr].SpdList[i]._itype != ITYPE_GOLD) {
443  fi = i + 49;
444  ff = fontframe[gbFontTransTbl[fi]];
445  PrintChar(InvRect[i + SLOTXY_BELT_FIRST].X + SCREEN_X + 28 - fontkern[ff], InvRect[i + SLOTXY_BELT_FIRST].Y + SCREEN_Y - 1, ff, 0);
446  }
447  }
448 }
449 
450 BOOL AutoPlace(int pnum, int ii, int sx, int sy, BOOL saveflag)
451 {
452  int i, j, xx, yy;
453  BOOL done;
454 
455  done = TRUE;
456  yy = 10 * (ii / 10);
457  if (yy < 0) {
458  yy = 0;
459  }
460  for (j = 0; j < sy && done; j++) {
461  if (yy >= 40) {
462  done = FALSE;
463  }
464  xx = ii % 10;
465  if (xx < 0) {
466  xx = 0;
467  }
468  for (i = 0; i < sx && done; i++) {
469  if (xx >= 10) {
470  done = FALSE;
471  } else {
472  done = plr[pnum].InvGrid[xx + yy] == 0;
473  }
474  xx++;
475  }
476  yy += 10;
477  }
478  if (done && saveflag) {
479  plr[pnum].InvList[plr[pnum]._pNumInv] = plr[pnum].HoldItem;
480  plr[pnum]._pNumInv++;
481  yy = 10 * (ii / 10);
482  if (yy < 0) {
483  yy = 0;
484  }
485  for (j = 0; j < sy; j++) {
486  xx = ii % 10;
487  if (xx < 0) {
488  xx = 0;
489  }
490  for (i = 0; i < sx; i++) {
491  if (i != 0 || j != sy - 1) {
492  plr[pnum].InvGrid[xx + yy] = -plr[pnum]._pNumInv;
493  } else {
494  plr[pnum].InvGrid[xx + yy] = plr[pnum]._pNumInv;
495  }
496  xx++;
497  }
498  yy += 10;
499  }
500  CalcPlrScrolls(pnum);
501  }
502  return done;
503 }
504 
505 BOOL SpecialAutoPlace(int pnum, int ii, int sx, int sy, BOOL saveflag)
506 {
507  int i, j, xx, yy;
508  BOOL done;
509 
510  done = TRUE;
511  yy = 10 * (ii / 10);
512  if (yy < 0) {
513  yy = 0;
514  }
515  for (j = 0; j < sy && done; j++) {
516  if (yy >= 40) {
517  done = FALSE;
518  }
519  xx = ii % 10;
520  if (xx < 0) {
521  xx = 0;
522  }
523  for (i = 0; i < sx && done; i++) {
524  if (xx >= 10) {
525  done = FALSE;
526  } else {
527  done = plr[pnum].InvGrid[xx + yy] == 0;
528  }
529  xx++;
530  }
531  yy += 10;
532  }
533  if (!done) {
534  if (sx > 1 || sy > 1) {
535  done = FALSE;
536  } else {
537  for (i = 0; i < MAXBELTITEMS; i++) {
538  if (plr[pnum].SpdList[i]._itype == ITYPE_NONE) {
539  done = TRUE;
540  break;
541  }
542  }
543  }
544  }
545  if (done && saveflag) {
546  plr[pnum].InvList[plr[pnum]._pNumInv] = plr[pnum].HoldItem;
547  plr[pnum]._pNumInv++;
548  yy = 10 * (ii / 10);
549  if (yy < 0) {
550  yy = 0;
551  }
552  for (j = 0; j < sy; j++) {
553  xx = ii % 10;
554  if (xx < 0) {
555  xx = 0;
556  }
557  for (i = 0; i < sx; i++) {
558  if (i != 0 || j != sy - 1) {
559  plr[pnum].InvGrid[xx + yy] = -plr[pnum]._pNumInv;
560  } else {
561  plr[pnum].InvGrid[xx + yy] = plr[pnum]._pNumInv;
562  }
563  xx++;
564  }
565  yy += 10;
566  }
567  CalcPlrScrolls(pnum);
568  }
569  return done;
570 }
571 
572 BOOL GoldAutoPlace(int pnum)
573 {
574  BOOL done;
575  int i, ii;
576  int xx, yy;
577 
578  done = FALSE;
579  for (i = 0; i < plr[pnum]._pNumInv && !done; i++) {
580  if (plr[pnum].InvList[i]._itype == ITYPE_GOLD) {
581  if (plr[pnum].HoldItem._ivalue + plr[pnum].InvList[i]._ivalue <= GOLD_MAX_LIMIT) {
582  plr[pnum].InvList[i]._ivalue = plr[pnum].HoldItem._ivalue + plr[pnum].InvList[i]._ivalue;
583  if (plr[pnum].InvList[i]._ivalue >= GOLD_MEDIUM_LIMIT)
584  plr[pnum].InvList[i]._iCurs = ICURS_GOLD_LARGE;
585  else if (plr[pnum].InvList[i]._ivalue <= GOLD_SMALL_LIMIT)
586  plr[pnum].InvList[i]._iCurs = ICURS_GOLD_SMALL;
587  else
588  plr[pnum].InvList[i]._iCurs = ICURS_GOLD_MEDIUM;
589  plr[pnum]._pGold = CalculateGold(pnum);
590  done = TRUE;
591  }
592  }
593  }
594  if (done)
595  return done;
596 
597  for (i = 0; i < plr[pnum]._pNumInv && !done; i++) {
598  if (plr[pnum].InvList[i]._itype == ITYPE_GOLD && plr[pnum].InvList[i]._ivalue < GOLD_MAX_LIMIT) {
599  if (plr[pnum].HoldItem._ivalue + plr[pnum].InvList[i]._ivalue <= GOLD_MAX_LIMIT) {
600  plr[pnum].InvList[i]._ivalue = plr[pnum].HoldItem._ivalue + plr[pnum].InvList[i]._ivalue;
601  if (plr[pnum].InvList[i]._ivalue >= GOLD_MEDIUM_LIMIT)
602  plr[pnum].InvList[i]._iCurs = ICURS_GOLD_LARGE;
603  else if (plr[pnum].InvList[i]._ivalue <= GOLD_SMALL_LIMIT)
604  plr[pnum].InvList[i]._iCurs = ICURS_GOLD_SMALL;
605  else
606  plr[pnum].InvList[i]._iCurs = ICURS_GOLD_MEDIUM;
607  plr[pnum]._pGold = CalculateGold(pnum);
608  done = TRUE;
609  }
610  }
611  }
612  if (done)
613  return done;
614 
615  for (i = 39; i >= 0 && !done; i--) {
616  yy = 10 * (i / 10);
617  xx = i % 10;
618  if (!plr[pnum].InvGrid[xx + yy]) {
619  ii = plr[pnum]._pNumInv;
620  plr[pnum].InvList[ii] = plr[pnum].HoldItem;
621  plr[pnum]._pNumInv = plr[pnum]._pNumInv + 1;
622  plr[pnum].InvGrid[xx + yy] = plr[pnum]._pNumInv;
623  if (plr[pnum].HoldItem._ivalue >= GOLD_MEDIUM_LIMIT)
624  plr[pnum].InvList[ii]._iCurs = ICURS_GOLD_LARGE;
625  else if (plr[pnum].HoldItem._ivalue <= GOLD_SMALL_LIMIT)
626  plr[pnum].InvList[ii]._iCurs = ICURS_GOLD_SMALL;
627  else
628  plr[pnum].InvList[ii]._iCurs = ICURS_GOLD_MEDIUM;
629  plr[pnum]._pGold = CalculateGold(pnum);
630  done = TRUE;
631  }
632  }
633 
634  return done;
635 }
636 
637 BOOL WeaponAutoPlace(int pnum)
638 {
639  if (plr[pnum].HoldItem._iLoc != ILOC_TWOHAND) {
640  if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_LEFT]._iClass == ICLASS_WEAPON)
641  return FALSE;
642  if (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iClass == ICLASS_WEAPON)
643  return FALSE;
644  if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_NONE) {
646  plr[pnum].InvBody[INVLOC_HAND_LEFT] = plr[pnum].HoldItem;
647  return TRUE;
648  }
649  if (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_LEFT]._iLoc != ILOC_TWOHAND) {
651  plr[pnum].InvBody[INVLOC_HAND_RIGHT] = plr[pnum].HoldItem;
652  return TRUE;
653  }
654  } else if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_NONE) {
656  plr[pnum].InvBody[INVLOC_HAND_LEFT] = plr[pnum].HoldItem;
657  return TRUE;
658  }
659 
660  return FALSE;
661 }
662 
664 {
665  ItemStruct h;
666 
667  h = *a;
668  *a = *b;
669  *b = h;
670 
671  return h._iCurs + CURSOR_FIRSTITEM;
672 }
673 
674 void CheckInvPaste(int pnum, int mx, int my)
675 {
676  int r, sx, sy;
677  int i, j, xx, yy, ii;
678  BOOL done, done2h;
679  int il, cn, it, iv, ig, gt;
680  ItemStruct tempitem;
681 
682  SetICursor(plr[pnum].HoldItem._iCurs + CURSOR_FIRSTITEM);
683  i = mx + (icursW >> 1);
684  j = my + (icursH >> 1);
685  sx = icursW28;
686  sy = icursH28;
687  done = FALSE;
688  for (r = 0; r < sizeof(InvRect) / sizeof(InvRect[0]) && !done; r++) {
689  if (i >= InvRect[r].X && i < InvRect[r].X + INV_SLOT_SIZE_PX) {
690  if (j >= InvRect[r].Y - INV_SLOT_SIZE_PX - 1 && j < InvRect[r].Y) {
691  done = TRUE;
692  r--;
693  }
694  }
695  if (r == 24) {
696  if ((sx & 1) == 0)
697  i -= 14;
698  if ((sy & 1) == 0) {
699  j -= 14;
700  }
701  }
702  if (r == 64 && (sy & 1) == 0)
703  j += 14;
704  }
705  if (!done)
706  return;
707  il = ILOC_UNEQUIPABLE;
708  if (r >= 0 && r <= 3)
709  il = ILOC_HELM;
710  if (r >= 4 && r <= 5)
711  il = ILOC_RING;
712  if (r == 6)
713  il = ILOC_AMULET;
714  if (r >= 7 && r <= 18)
715  il = ILOC_ONEHAND;
716  if (r >= 19 && r <= 24)
717  il = ILOC_ARMOR;
718  if (r >= 65 && r <= 72)
719  il = ILOC_BELT;
720  done = FALSE;
721  if (plr[pnum].HoldItem._iLoc == il)
722  done = TRUE;
723  if (il == ILOC_ONEHAND && plr[pnum].HoldItem._iLoc == ILOC_TWOHAND) {
724  il = ILOC_TWOHAND;
725  done = TRUE;
726  }
727  if (plr[pnum].HoldItem._iLoc == ILOC_UNEQUIPABLE && il == ILOC_BELT) {
728  if (sx == 1 && sy == 1) {
729  done = TRUE;
730  if (!AllItemsList[plr[pnum].HoldItem.IDidx].iUsable)
731  done = FALSE;
732  if (!plr[pnum].HoldItem._iStatFlag)
733  done = FALSE;
734  if (plr[pnum].HoldItem._itype == ITYPE_GOLD)
735  done = FALSE;
736  }
737  }
738 
739  if (il == ILOC_UNEQUIPABLE) {
740  done = TRUE;
741  it = 0;
742  ii = r - 25;
743  if (plr[pnum].HoldItem._itype == ITYPE_GOLD) {
744  yy = 10 * (ii / 10);
745  xx = ii % 10;
746  if (plr[pnum].InvGrid[xx + yy] != 0) {
747  iv = plr[pnum].InvGrid[xx + yy];
748  if (iv > 0) {
749  if (plr[pnum].InvList[iv - 1]._itype != ITYPE_GOLD) {
750  it = iv;
751  }
752  } else {
753  it = -iv;
754  }
755  }
756  } else {
757  yy = 10 * ((ii / 10) - ((sy - 1) >> 1));
758  if (yy < 0)
759  yy = 0;
760  for (j = 0; j < sy && done; j++) {
761  if (yy >= NUM_INV_GRID_ELEM)
762  done = FALSE;
763  xx = (ii % 10) - ((sx - 1) >> 1);
764  if (xx < 0)
765  xx = 0;
766  for (i = 0; i < sx && done; i++) {
767  if (xx >= 10) {
768  done = FALSE;
769  } else {
770  if (plr[pnum].InvGrid[xx + yy] != 0) {
771  iv = plr[pnum].InvGrid[xx + yy];
772  if (iv < 0)
773  iv = -iv;
774  if (it != 0) {
775  if (it != iv)
776  done = FALSE;
777  } else
778  it = iv;
779  }
780  }
781  xx++;
782  }
783  yy += 10;
784  }
785  }
786  }
787 
788  if (!done)
789  return;
790 
791  if (il != ILOC_UNEQUIPABLE && il != ILOC_BELT && !plr[pnum].HoldItem._iStatFlag) {
792  done = FALSE;
793  if (plr[pnum]._pClass == PC_WARRIOR)
795 #ifndef SPAWN
796  else if (plr[pnum]._pClass == PC_ROGUE)
798  else if (plr[pnum]._pClass == PC_SORCERER)
800 #endif
801  }
802 
803  if (!done)
804  return;
805 
806  if (pnum == myplr)
807  PlaySFX(ItemInvSnds[ItemCAnimTbl[plr[pnum].HoldItem._iCurs]]);
808 
809  cn = CURSOR_HAND;
810  switch (il) {
811  case ILOC_HELM:
813  if (plr[pnum].InvBody[INVLOC_HEAD]._itype == ITYPE_NONE)
814  plr[pnum].InvBody[INVLOC_HEAD] = plr[pnum].HoldItem;
815  else
816  cn = SwapItem(&plr[pnum].InvBody[INVLOC_HEAD], &plr[pnum].HoldItem);
817  break;
818  case ILOC_RING:
819  if (r == 4) {
821  if (plr[pnum].InvBody[INVLOC_RING_LEFT]._itype == ITYPE_NONE)
822  plr[pnum].InvBody[INVLOC_RING_LEFT] = plr[pnum].HoldItem;
823  else
824  cn = SwapItem(&plr[pnum].InvBody[INVLOC_RING_LEFT], &plr[pnum].HoldItem);
825  } else {
827  if (plr[pnum].InvBody[INVLOC_RING_RIGHT]._itype == ITYPE_NONE)
828  plr[pnum].InvBody[INVLOC_RING_RIGHT] = plr[pnum].HoldItem;
829  else
830  cn = SwapItem(&plr[pnum].InvBody[INVLOC_RING_RIGHT], &plr[pnum].HoldItem);
831  }
832  break;
833  case ILOC_AMULET:
835  if (plr[pnum].InvBody[INVLOC_AMULET]._itype == ITYPE_NONE)
836  plr[pnum].InvBody[INVLOC_AMULET] = plr[pnum].HoldItem;
837  else
838  cn = SwapItem(&plr[pnum].InvBody[INVLOC_AMULET], &plr[pnum].HoldItem);
839  break;
840  case ILOC_ONEHAND:
841  if (r <= 12) {
842  if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_NONE) {
843  if (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_NONE || plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iClass != plr[pnum].HoldItem._iClass) {
845  plr[pnum].InvBody[INVLOC_HAND_LEFT] = plr[pnum].HoldItem;
846  } else {
848  cn = SwapItem(&plr[pnum].InvBody[INVLOC_HAND_RIGHT], &plr[pnum].HoldItem);
849  }
850  break;
851  }
852  if (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_NONE || plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iClass != plr[pnum].HoldItem._iClass) {
854  cn = SwapItem(&plr[pnum].InvBody[INVLOC_HAND_LEFT], &plr[pnum].HoldItem);
855  break;
856  }
857 
859  cn = SwapItem(&plr[pnum].InvBody[INVLOC_HAND_RIGHT], &plr[pnum].HoldItem);
860  break;
861  }
862  if (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_NONE) {
863  if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_NONE || plr[pnum].InvBody[INVLOC_HAND_LEFT]._iLoc != ILOC_TWOHAND) {
864  if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_NONE || plr[pnum].InvBody[INVLOC_HAND_LEFT]._iClass != plr[pnum].HoldItem._iClass) {
866  plr[pnum].InvBody[INVLOC_HAND_RIGHT] = plr[pnum].HoldItem;
867  break;
868  }
870  cn = SwapItem(&plr[pnum].InvBody[INVLOC_HAND_LEFT], &plr[pnum].HoldItem);
871  break;
872  }
875  SwapItem(&plr[pnum].InvBody[INVLOC_HAND_RIGHT], &plr[pnum].InvBody[INVLOC_HAND_LEFT]);
876  cn = SwapItem(&plr[pnum].InvBody[INVLOC_HAND_RIGHT], &plr[pnum].HoldItem);
877  break;
878  }
879 
880  if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_LEFT]._iClass == plr[pnum].HoldItem._iClass) {
882  cn = SwapItem(&plr[pnum].InvBody[INVLOC_HAND_LEFT], &plr[pnum].HoldItem);
883  break;
884  }
886  cn = SwapItem(&plr[pnum].InvBody[INVLOC_HAND_RIGHT], &plr[pnum].HoldItem);
887  break;
888  case ILOC_TWOHAND:
890  if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE) {
891  tempitem = plr[pnum].HoldItem;
892  if (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SHIELD)
893  plr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_HAND_RIGHT];
894  else
895  plr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_HAND_LEFT];
896  if (pnum == myplr)
897  SetCursor_(plr[pnum].HoldItem._iCurs + CURSOR_FIRSTITEM);
898  else
899  SetICursor(plr[pnum].HoldItem._iCurs + CURSOR_FIRSTITEM);
900  done2h = FALSE;
901  for (i = 0; i < NUM_INV_GRID_ELEM && !done2h; i++)
902  done2h = AutoPlace(pnum, i, icursW28, icursH28, TRUE);
903  plr[pnum].HoldItem = tempitem;
904  if (pnum == myplr)
905  SetCursor_(plr[pnum].HoldItem._iCurs + CURSOR_FIRSTITEM);
906  else
907  SetICursor(plr[pnum].HoldItem._iCurs + CURSOR_FIRSTITEM);
908  if (!done2h)
909  return;
910 
911  if (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SHIELD)
913  else
915  }
916 
917  if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE || plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE) {
919  if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_NONE)
920  SwapItem(&plr[pnum].InvBody[INVLOC_HAND_LEFT], &plr[pnum].InvBody[INVLOC_HAND_RIGHT]);
921  cn = SwapItem(&plr[pnum].InvBody[INVLOC_HAND_LEFT], &plr[pnum].HoldItem);
922  } else {
924  plr[pnum].InvBody[INVLOC_HAND_LEFT] = plr[pnum].HoldItem;
925  }
926  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) {
929  force_redraw = 255;
930  }
931  break;
932  case ILOC_ARMOR:
934  if (plr[pnum].InvBody[INVLOC_CHEST]._itype == ITYPE_NONE)
935  plr[pnum].InvBody[INVLOC_CHEST] = plr[pnum].HoldItem;
936  else
937  cn = SwapItem(&plr[pnum].InvBody[INVLOC_CHEST], &plr[pnum].HoldItem);
938  break;
939  case ILOC_UNEQUIPABLE:
940  if (plr[pnum].HoldItem._itype == ITYPE_GOLD && it == 0) {
941  ii = r - 25;
942  yy = 10 * (ii / 10);
943  xx = ii % 10;
944  if (plr[pnum].InvGrid[yy + xx] > 0) {
945  il = plr[pnum].InvGrid[yy + xx];
946  il--;
947  gt = plr[pnum].InvList[il]._ivalue;
948  ig = plr[pnum].HoldItem._ivalue + gt;
949  if (ig <= GOLD_MAX_LIMIT) {
950  plr[pnum].InvList[il]._ivalue = ig;
951  plr[pnum]._pGold += plr[pnum].HoldItem._ivalue;
952  if (ig >= GOLD_MEDIUM_LIMIT)
953  plr[pnum].InvList[il]._iCurs = ICURS_GOLD_LARGE;
954  else if (ig <= GOLD_SMALL_LIMIT)
955  plr[pnum].InvList[il]._iCurs = ICURS_GOLD_SMALL;
956  else
957  plr[pnum].InvList[il]._iCurs = ICURS_GOLD_MEDIUM;
958  } else {
959  ig = GOLD_MAX_LIMIT - gt;
960  plr[pnum]._pGold += ig;
961  plr[pnum].HoldItem._ivalue -= ig;
962  plr[pnum].InvList[il]._ivalue = GOLD_MAX_LIMIT;
963  plr[pnum].InvList[il]._iCurs = ICURS_GOLD_LARGE;
964  // BUGFIX: incorrect values here are leftover from beta
965  if (plr[pnum].HoldItem._ivalue >= GOLD_MEDIUM_LIMIT)
966  cn = 18;
967  else if (plr[pnum].HoldItem._ivalue <= GOLD_SMALL_LIMIT)
968  cn = 16;
969  else
970  cn = 17;
971  }
972  } else {
973  il = plr[pnum]._pNumInv;
974  plr[pnum].InvList[il] = plr[pnum].HoldItem;
975  plr[pnum]._pNumInv++;
976  plr[pnum].InvGrid[yy + xx] = plr[pnum]._pNumInv;
977  plr[pnum]._pGold += plr[pnum].HoldItem._ivalue;
978  if (plr[pnum].HoldItem._ivalue <= GOLD_MAX_LIMIT) {
979  if (plr[pnum].HoldItem._ivalue >= GOLD_MEDIUM_LIMIT)
980  plr[pnum].InvList[il]._iCurs = ICURS_GOLD_LARGE;
981  else if (plr[pnum].HoldItem._ivalue <= GOLD_SMALL_LIMIT)
982  plr[pnum].InvList[il]._iCurs = ICURS_GOLD_SMALL;
983  else
984  plr[pnum].InvList[il]._iCurs = ICURS_GOLD_MEDIUM;
985  }
986  }
987  } else {
988  if (it == 0) {
989  plr[pnum].InvList[plr[pnum]._pNumInv] = plr[pnum].HoldItem;
990  plr[pnum]._pNumInv++;
991  it = plr[pnum]._pNumInv;
992  } else {
993  il = it - 1;
994  if (plr[pnum].HoldItem._itype == ITYPE_GOLD)
995  plr[pnum]._pGold += plr[pnum].HoldItem._ivalue;
996  cn = SwapItem(&plr[pnum].InvList[il], &plr[pnum].HoldItem);
997  if (plr[pnum].HoldItem._itype == ITYPE_GOLD)
998  plr[pnum]._pGold = CalculateGold(pnum);
999  for (i = 0; i < NUM_INV_GRID_ELEM; i++) {
1000  if (plr[pnum].InvGrid[i] == it)
1001  plr[pnum].InvGrid[i] = 0;
1002  if (plr[pnum].InvGrid[i] == -it)
1003  plr[pnum].InvGrid[i] = 0;
1004  }
1005  }
1006  ii = r - 25;
1007  yy = 10 * (ii / 10 - ((sy - 1) >> 1));
1008  if (yy < 0)
1009  yy = 0;
1010  for (j = 0; j < sy; j++) {
1011  xx = (ii % 10 - ((sx - 1) >> 1));
1012  if (xx < 0)
1013  xx = 0;
1014  for (i = 0; i < sx; i++) {
1015  if (i != 0 || j != sy - 1)
1016  plr[pnum].InvGrid[xx + yy] = -it;
1017  else
1018  plr[pnum].InvGrid[xx + yy] = it;
1019  xx++;
1020  }
1021  yy += 10;
1022  }
1023  }
1024  break;
1025  case ILOC_BELT:
1026  ii = r - 65;
1027  if (plr[pnum].HoldItem._itype == ITYPE_GOLD) {
1028  if (plr[pnum].SpdList[ii]._itype != ITYPE_NONE) {
1029  if (plr[pnum].SpdList[ii]._itype == ITYPE_GOLD) {
1030  i = plr[pnum].HoldItem._ivalue + plr[pnum].SpdList[ii]._ivalue;
1031  if (i <= GOLD_MAX_LIMIT) {
1032  plr[pnum].SpdList[ii]._ivalue += plr[pnum].HoldItem._ivalue;
1033  plr[pnum]._pGold += plr[pnum].HoldItem._ivalue;
1034  if (i >= GOLD_MEDIUM_LIMIT)
1035  plr[pnum].SpdList[ii]._iCurs = ICURS_GOLD_LARGE;
1036  else if (i <= GOLD_SMALL_LIMIT)
1037  plr[pnum].SpdList[ii]._iCurs = ICURS_GOLD_SMALL;
1038  else
1039  plr[pnum].SpdList[ii]._iCurs = ICURS_GOLD_MEDIUM;
1040  } else {
1041  i = GOLD_MAX_LIMIT - plr[pnum].SpdList[ii]._ivalue;
1042  plr[pnum]._pGold += i;
1043  plr[pnum].HoldItem._ivalue -= i;
1044  plr[pnum].SpdList[ii]._ivalue = GOLD_MAX_LIMIT;
1045  plr[pnum].SpdList[ii]._iCurs = ICURS_GOLD_LARGE;
1046 
1047  // BUGFIX: incorrect values here are leftover from beta
1048  if (plr[pnum].HoldItem._ivalue >= GOLD_MEDIUM_LIMIT)
1049  cn = 18;
1050  else if (plr[pnum].HoldItem._ivalue <= GOLD_SMALL_LIMIT)
1051  cn = 16;
1052  else
1053  cn = 17;
1054  }
1055  } else {
1056  plr[pnum]._pGold += plr[pnum].HoldItem._ivalue;
1057  cn = SwapItem(&plr[pnum].SpdList[ii], &plr[pnum].HoldItem);
1058  }
1059  } else {
1060  plr[pnum].SpdList[ii] = plr[pnum].HoldItem;
1061  plr[pnum]._pGold += plr[pnum].HoldItem._ivalue;
1062  }
1063  } else if (plr[pnum].SpdList[ii]._itype == ITYPE_NONE) {
1064  plr[pnum].SpdList[ii] = plr[pnum].HoldItem;
1065  } else {
1066  cn = SwapItem(&plr[pnum].SpdList[ii], &plr[pnum].HoldItem);
1067  if (plr[pnum].HoldItem._itype == ITYPE_GOLD)
1068  plr[pnum]._pGold = CalculateGold(pnum);
1069  }
1070  drawsbarflag = TRUE;
1071  break;
1072  }
1073  CalcPlrInv(pnum, TRUE);
1074  if (pnum == myplr) {
1075  if (cn == 1)
1076  SetCursorPos(MouseX + (cursW >> 1), MouseY + (cursH >> 1));
1077  SetCursor_(cn);
1078  }
1079 }
1080 
1081 void CheckInvSwap(int pnum, BYTE bLoc, int idx, WORD wCI, int seed, BOOL bId)
1082 {
1083  PlayerStruct *p;
1084 
1085  RecreateItem(MAXITEMS, idx, wCI, seed, 0);
1086 
1087  p = &plr[pnum];
1088  p->HoldItem = item[MAXITEMS];
1089 
1090  if (bId) {
1091  p->HoldItem._iIdentified = TRUE;
1092  }
1093 
1094  if (bLoc < NUM_INVLOC) {
1095  p->InvBody[bLoc] = p->HoldItem;
1096 
1097  if (bLoc == INVLOC_HAND_LEFT && p->HoldItem._iLoc == ILOC_TWOHAND) {
1099  } else if (bLoc == INVLOC_HAND_RIGHT && p->HoldItem._iLoc == ILOC_TWOHAND) {
1101  }
1102  }
1103 
1104  CalcPlrInv(pnum, TRUE);
1105 }
1106 
1107 void CheckInvCut(int pnum, int mx, int my)
1108 {
1109  int r;
1110  BOOL done;
1111  char ii;
1112  int iv, i, j, offs, ig;
1113 
1114  if (plr[pnum]._pmode > PM_WALK3) {
1115  return;
1116  }
1117 
1118  if (dropGoldFlag) {
1119  dropGoldFlag = FALSE;
1120  dropGoldValue = 0;
1121  }
1122 
1123  done = FALSE;
1124 
1125  for (r = 0; (DWORD)r < NUM_XY_SLOTS && !done; r++) {
1126  // check which inventory rectangle the mouse is in, if any
1127  if (mx >= InvRect[r].X
1128  && mx < InvRect[r].X + (INV_SLOT_SIZE_PX + 1)
1129  && my >= InvRect[r].Y - (INV_SLOT_SIZE_PX + 1)
1130  && my < InvRect[r].Y) {
1131  done = TRUE;
1132  r--;
1133  }
1134  }
1135 
1136  if (!done) {
1137  // not on an inventory slot rectangle
1138  return;
1139  }
1140 
1141  plr[pnum].HoldItem._itype = ITYPE_NONE;
1142 
1143  if (
1144  r >= SLOTXY_HEAD_FIRST
1145  && r <= SLOTXY_HEAD_LAST
1146  && plr[pnum].InvBody[INVLOC_HEAD]._itype != ITYPE_NONE) {
1148  plr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_HEAD];
1150  }
1151 
1152  if (
1153  r == SLOTXY_RING_LEFT
1154  && plr[pnum].InvBody[INVLOC_RING_LEFT]._itype != ITYPE_NONE) {
1156  plr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_RING_LEFT];
1158  }
1159 
1160  if (
1161  r == SLOTXY_RING_RIGHT
1162  && plr[pnum].InvBody[INVLOC_RING_RIGHT]._itype != ITYPE_NONE) {
1164  plr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_RING_RIGHT];
1166  }
1167 
1168  if (
1169  r == SLOTXY_AMULET
1170  && plr[pnum].InvBody[INVLOC_AMULET]._itype != ITYPE_NONE) {
1172  plr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_AMULET];
1174  }
1175 
1176  if (
1178  && r <= SLOTXY_HAND_LEFT_LAST
1179  && plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE) {
1181  plr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_HAND_LEFT];
1183  }
1184 
1185  if (
1187  && r <= SLOTXY_HAND_RIGHT_LAST
1188  && plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE) {
1190  plr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_HAND_RIGHT];
1192  }
1193 
1194  if (
1195  r >= SLOTXY_CHEST_FIRST
1196  && r <= SLOTXY_CHEST_LAST
1197  && plr[pnum].InvBody[INVLOC_CHEST]._itype != ITYPE_NONE) {
1199  plr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_CHEST];
1201  }
1202 
1203  if (r >= SLOTXY_INV_FIRST && r <= SLOTXY_INV_LAST) {
1204  ig = r - SLOTXY_INV_FIRST;
1205  ii = plr[pnum].InvGrid[ig];
1206  if (ii) {
1207  iv = ii;
1208  if (ii <= 0) {
1209  iv = -ii;
1210  }
1211 
1212  for (i = 0; i < NUM_INV_GRID_ELEM; i++) {
1213  if (plr[pnum].InvGrid[i] == iv || plr[pnum].InvGrid[i] == -iv) {
1214  plr[pnum].InvGrid[i] = 0;
1215  }
1216  }
1217 
1218  iv--;
1219 
1220  plr[pnum].HoldItem = plr[pnum].InvList[iv];
1221  plr[pnum]._pNumInv--;
1222 
1223  if (plr[pnum]._pNumInv > 0 && plr[pnum]._pNumInv != iv) {
1224  plr[pnum].InvList[iv] = plr[pnum].InvList[plr[pnum]._pNumInv];
1225 
1226  for (j = 0; j < NUM_INV_GRID_ELEM; j++) {
1227  if (plr[pnum].InvGrid[j] == plr[pnum]._pNumInv + 1) {
1228  plr[pnum].InvGrid[j] = iv + 1;
1229  }
1230  if (plr[pnum].InvGrid[j] == -(plr[pnum]._pNumInv + 1)) {
1231  plr[pnum].InvGrid[j] = -iv - 1;
1232  }
1233  }
1234  }
1235  }
1236  }
1237 
1238  if (r >= SLOTXY_BELT_FIRST) {
1239  offs = r - SLOTXY_BELT_FIRST;
1240  if (plr[pnum].SpdList[offs]._itype != ITYPE_NONE) {
1241  plr[pnum].HoldItem = plr[pnum].SpdList[offs];
1242  plr[pnum].SpdList[offs]._itype = ITYPE_NONE;
1243  drawsbarflag = TRUE;
1244  }
1245  }
1246 
1247  if (plr[pnum].HoldItem._itype != ITYPE_NONE) {
1248  if (plr[pnum].HoldItem._itype == ITYPE_GOLD) {
1249  plr[pnum]._pGold = CalculateGold(pnum);
1250  }
1251 
1252  CalcPlrInv(pnum, TRUE);
1253  CheckItemStats(pnum);
1254 
1255  if (pnum == myplr) {
1256  PlaySFX(IS_IGRAB);
1257  SetCursor_(plr[pnum].HoldItem._iCurs + CURSOR_FIRSTITEM);
1258  SetCursorPos(mx - (cursW >> 1), MouseY - (cursH >> 1));
1259  }
1260  }
1261 }
1262 
1263 void inv_update_rem_item(int pnum, BYTE iv)
1264 {
1265  if (iv < NUM_INVLOC) {
1266  plr[pnum].InvBody[iv]._itype = ITYPE_NONE;
1267  }
1268 
1269  if (plr[pnum]._pmode != PM_DEATH) {
1270  CalcPlrInv(pnum, TRUE);
1271  } else {
1272  CalcPlrInv(pnum, FALSE);
1273  }
1274 }
1275 
1276 void RemoveInvItem(int pnum, int iv)
1277 {
1278  int i, j;
1279 
1280  iv++;
1281 
1282  for (i = 0; i < NUM_INV_GRID_ELEM; i++) {
1283  if (plr[pnum].InvGrid[i] == iv || plr[pnum].InvGrid[i] == -iv) {
1284  plr[pnum].InvGrid[i] = 0;
1285  }
1286  }
1287 
1288  iv--;
1289  plr[pnum]._pNumInv--;
1290 
1291  if (plr[pnum]._pNumInv > 0 && plr[pnum]._pNumInv != iv) {
1292  plr[pnum].InvList[iv] = plr[pnum].InvList[plr[pnum]._pNumInv];
1293 
1294  for (j = 0; j < NUM_INV_GRID_ELEM; j++) {
1295  if (plr[pnum].InvGrid[j] == plr[pnum]._pNumInv + 1) {
1296  plr[pnum].InvGrid[j] = iv + 1;
1297  }
1298  if (plr[pnum].InvGrid[j] == -(plr[pnum]._pNumInv + 1)) {
1299  plr[pnum].InvGrid[j] = -(iv + 1);
1300  }
1301  }
1302  }
1303 
1304  CalcPlrScrolls(pnum);
1305 
1306  if (plr[pnum]._pRSplType == RSPLTYPE_SCROLL) {
1307  if (plr[pnum]._pRSpell != SPL_INVALID) {
1308  // BUGFIX: Cast the literal `1` to `unsigned __int64` to make that bitshift 64bit
1309  // this causes the last 4 skills to not reset correctly after use
1310  if (!(
1311  plr[pnum]._pScrlSpells
1312  & (1 << (plr[pnum]._pRSpell - 1)))) {
1313  plr[pnum]._pRSpell = SPL_INVALID;
1314  }
1315 
1316  force_redraw = 255;
1317  }
1318  }
1319 }
1320 
1321 void RemoveSpdBarItem(int pnum, int iv)
1322 {
1323  plr[pnum].SpdList[iv]._itype = ITYPE_NONE;
1324 
1325  CalcPlrScrolls(pnum);
1326 
1327  if (plr[pnum]._pRSplType == RSPLTYPE_SCROLL) {
1328  if (plr[pnum]._pRSpell != SPL_INVALID) {
1329  // BUGFIX: Cast the literal `1` to `unsigned __int64` to make that bitshift 64bit
1330  // this causes the last 4 skills to not reset correctly after use
1331  if (!(
1332  plr[pnum]._pScrlSpells
1333  & (1 << (plr[pnum]._pRSpell - 1)))) {
1334  plr[pnum]._pRSpell = SPL_INVALID;
1335  }
1336  }
1337  }
1338  force_redraw = 255;
1339 }
1340 
1342 {
1343  if (pcurs >= CURSOR_FIRSTITEM) {
1345  } else {
1347  }
1348 }
1349 
1354 {
1355  if (MouseX > 190 + PANEL_LEFT && MouseX < 437 + PANEL_LEFT
1356  && MouseY > PANEL_TOP && MouseY < 33 + PANEL_TOP) {
1357  CheckInvItem();
1358  }
1359 }
1360 
1361 void CheckItemStats(int pnum)
1362 {
1363  PlayerStruct *p = &plr[pnum];
1364 
1365  p->HoldItem._iStatFlag = FALSE;
1366 
1367  if (p->_pStrength >= p->HoldItem._iMinStr
1368  && p->_pMagic >= p->HoldItem._iMinMag
1369  && p->_pDexterity >= p->HoldItem._iMinDex) {
1370  p->HoldItem._iStatFlag = TRUE;
1371  }
1372 }
1373 
1374 void CheckBookLevel(int pnum)
1375 {
1376  int slvl;
1377 
1378  if (plr[pnum].HoldItem._iMiscId == IMISC_BOOK) {
1380  slvl = plr[pnum]._pSplLvl[plr[pnum].HoldItem._iSpell];
1381  while (slvl) {
1382  plr[pnum].HoldItem._iMinMag += 20 * plr[pnum].HoldItem._iMinMag / 100;
1383  slvl--;
1384  if (plr[pnum].HoldItem._iMinMag + 20 * plr[pnum].HoldItem._iMinMag / 100 > 255) {
1385  plr[pnum].HoldItem._iMinMag = -1;
1386  slvl = 0;
1387  }
1388  }
1389  }
1390 }
1391 
1392 void CheckQuestItem(int pnum)
1393 {
1394  if (plr[pnum].HoldItem.IDidx == IDI_OPTAMULET)
1396  if (plr[pnum].HoldItem.IDidx == IDI_MUSHROOM && quests[Q_MUSHROOM]._qactive == QUEST_ACTIVE && quests[Q_MUSHROOM]._qvar1 == QS_MUSHSPAWNED) {
1397 #ifndef SPAWN
1398  sfxdelay = 10;
1399  if (plr[pnum]._pClass == PC_WARRIOR) { // BUGFIX: Voice for this quest might be wrong in MP
1400  sfxdnum = PS_WARR95;
1401  } else if (plr[pnum]._pClass == PC_ROGUE) {
1402  sfxdnum = PS_ROGUE95;
1403  } else if (plr[pnum]._pClass == PC_SORCERER) {
1404  sfxdnum = PS_MAGE95;
1405  }
1406 #endif
1408  }
1409  if (plr[pnum].HoldItem.IDidx == IDI_ANVIL) {
1410  if (quests[Q_ANVIL]._qactive == QUEST_INIT) {
1412  quests[Q_ANVIL]._qvar1 = 1;
1413  }
1414 #ifndef SPAWN
1415  if (quests[Q_ANVIL]._qlog == 1) {
1416  sfxdelay = 10;
1417  if (plr[myplr]._pClass == PC_WARRIOR) {
1418  sfxdnum = PS_WARR89;
1419  } else if (plr[myplr]._pClass == PC_ROGUE) {
1420  sfxdnum = PS_ROGUE89;
1421  } else if (plr[myplr]._pClass == PC_SORCERER) {
1422  sfxdnum = PS_MAGE89;
1423  }
1424  }
1425 #endif
1426  }
1427 #ifndef SPAWN
1428  if (plr[pnum].HoldItem.IDidx == IDI_GLDNELIX) {
1429  sfxdelay = 30;
1430  if (plr[myplr]._pClass == PC_WARRIOR) {
1431  sfxdnum = PS_WARR88;
1432  } else if (plr[myplr]._pClass == PC_ROGUE) {
1433  sfxdnum = PS_ROGUE88;
1434  } else if (plr[myplr]._pClass == PC_SORCERER) {
1435  sfxdnum = PS_MAGE88;
1436  }
1437  }
1438 #endif
1439  if (plr[pnum].HoldItem.IDidx == IDI_ROCK) {
1440  if (quests[Q_ROCK]._qactive == QUEST_INIT) {
1442  quests[Q_ROCK]._qvar1 = 1;
1443  }
1444 #ifndef SPAWN
1445  if (quests[Q_ROCK]._qlog == 1) {
1446  sfxdelay = 10;
1447  if (plr[myplr]._pClass == PC_WARRIOR) {
1448  sfxdnum = PS_WARR87;
1449  } else if (plr[myplr]._pClass == PC_ROGUE) {
1450  sfxdnum = PS_ROGUE87;
1451  } else if (plr[myplr]._pClass == PC_SORCERER) {
1452  sfxdnum = PS_MAGE87;
1453  }
1454  }
1455 #endif
1456  }
1457  if (plr[pnum].HoldItem.IDidx == IDI_ARMOFVAL) {
1459 #ifndef SPAWN
1460  sfxdelay = 20;
1461  if (plr[myplr]._pClass == PC_WARRIOR) {
1462  sfxdnum = PS_WARR91;
1463  } else if (plr[myplr]._pClass == PC_ROGUE) {
1464  sfxdnum = PS_ROGUE91;
1465  } else if (plr[myplr]._pClass == PC_SORCERER) {
1466  sfxdnum = PS_MAGE91;
1467  }
1468 #endif
1469  }
1470 }
1471 
1472 void InvGetItem(int pnum, int ii)
1473 {
1474  int i;
1475 
1476  if (dropGoldFlag) {
1477  dropGoldFlag = FALSE;
1478  dropGoldValue = 0;
1479  }
1480 
1481  if (dItem[item[ii]._ix][item[ii]._iy]) {
1482  if (myplr == pnum && pcurs >= CURSOR_FIRSTITEM)
1483  NetSendCmdPItem(TRUE, CMD_SYNCPUTITEM, plr[myplr].WorldX, plr[myplr].WorldY);
1484  item[ii]._iCreateInfo &= ~0x8000;
1485  plr[pnum].HoldItem = item[ii];
1486  CheckQuestItem(pnum);
1487  CheckBookLevel(pnum);
1488  CheckItemStats(pnum);
1489  dItem[item[ii]._ix][item[ii]._iy] = 0;
1490  i = 0;
1491  while (i < numitems) {
1492  if (itemactive[i] == ii) {
1493  DeleteItem(itemactive[i], i);
1494  i = 0;
1495  } else {
1496  i++;
1497  }
1498  }
1499  pcursitem = -1;
1500  SetCursor_(plr[pnum].HoldItem._iCurs + CURSOR_FIRSTITEM);
1501  }
1502 }
1503 
1504 void AutoGetItem(int pnum, int ii)
1505 {
1506  int i, idx;
1507  int w, h;
1508  BOOL done;
1509 
1510  if (pcurs != CURSOR_HAND) {
1511  return;
1512  }
1513 
1514  if (dropGoldFlag) {
1515  dropGoldFlag = FALSE;
1516  dropGoldValue = 0;
1517  }
1518 
1519  if (ii != MAXITEMS && !dItem[item[ii]._ix][item[ii]._iy]) {
1520  return;
1521  }
1522 
1523  item[ii]._iCreateInfo &= 0x7FFF;
1524  plr[pnum].HoldItem = item[ii];
1525  CheckQuestItem(pnum);
1526  CheckBookLevel(pnum);
1527  CheckItemStats(pnum);
1528  SetICursor(plr[pnum].HoldItem._iCurs + CURSOR_FIRSTITEM);
1529  if (plr[pnum].HoldItem._itype == ITYPE_GOLD) {
1530  done = GoldAutoPlace(pnum);
1531  } else {
1532  done = FALSE;
1533  if (((plr[pnum]._pgfxnum & 0xF) == ANIM_ID_UNARMED || (plr[pnum]._pgfxnum & 0xF) == ANIM_ID_UNARMED_SHIELD) && plr[pnum]._pmode <= PM_WALK3) {
1534  if (plr[pnum].HoldItem._iStatFlag) {
1535  if (plr[pnum].HoldItem._iClass == ICLASS_WEAPON) {
1536  done = WeaponAutoPlace(pnum);
1537  if (done)
1538  CalcPlrInv(pnum, TRUE);
1539  }
1540  }
1541  }
1542  if (!done) {
1543  w = icursW28;
1544  h = icursH28;
1545  if (w == 1 && h == 1) {
1546  idx = plr[pnum].HoldItem.IDidx;
1547  if (plr[pnum].HoldItem._iStatFlag && AllItemsList[idx].iUsable) {
1548  for (i = 0; i < 8 && !done; i++) {
1549  if (plr[pnum].SpdList[i]._itype == ITYPE_NONE) {
1550  plr[pnum].SpdList[i] = plr[pnum].HoldItem;
1551  CalcPlrScrolls(pnum);
1552  drawsbarflag = TRUE;
1553  done = TRUE;
1554  }
1555  }
1556  }
1557  for (i = 30; i <= 39 && !done; i++) {
1558  done = AutoPlace(pnum, i, w, h, TRUE);
1559  }
1560  for (i = 20; i <= 29 && !done; i++) {
1561  done = AutoPlace(pnum, i, w, h, TRUE);
1562  }
1563  for (i = 10; i <= 19 && !done; i++) {
1564  done = AutoPlace(pnum, i, w, h, TRUE);
1565  }
1566  for (i = 0; i <= 9 && !done; i++) {
1567  done = AutoPlace(pnum, i, w, h, TRUE);
1568  }
1569  }
1570  if (w == 1 && h == 2) {
1571  for (i = 29; i >= 20 && !done; i--) {
1572  done = AutoPlace(pnum, i, w, h, TRUE);
1573  }
1574  for (i = 9; i >= 0 && !done; i--) {
1575  done = AutoPlace(pnum, i, w, h, TRUE);
1576  }
1577  for (i = 19; i >= 10 && !done; i--) {
1578  done = AutoPlace(pnum, i, w, h, TRUE);
1579  }
1580  }
1581  if (w == 1 && h == 3) {
1582  for (i = 0; i < 20 && !done; i++) {
1583  done = AutoPlace(pnum, i, w, h, TRUE);
1584  }
1585  }
1586  if (w == 2 && h == 2) {
1587  for (i = 0; i < 10 && !done; i++) {
1588  done = AutoPlace(pnum, AP2x2Tbl[i], w, h, TRUE);
1589  }
1590  for (i = 21; i < 29 && !done; i += 2) {
1591  done = AutoPlace(pnum, i, w, h, TRUE);
1592  }
1593  for (i = 1; i < 9 && !done; i += 2) {
1594  done = AutoPlace(pnum, i, w, h, TRUE);
1595  }
1596  for (i = 10; i < 19 && !done; i++) {
1597  done = AutoPlace(pnum, i, w, h, TRUE);
1598  }
1599  }
1600  if (w == 2 && h == 3) {
1601  for (i = 0; i < 9 && !done; i++) {
1602  done = AutoPlace(pnum, i, w, h, TRUE);
1603  }
1604  for (i = 10; i < 19 && !done; i++) {
1605  done = AutoPlace(pnum, i, w, h, TRUE);
1606  }
1607  }
1608  }
1609  }
1610  if (done) {
1611  dItem[item[ii]._ix][item[ii]._iy] = 0;
1612  i = 0;
1613  while (i < numitems) {
1614  if (itemactive[i] == ii) {
1615  DeleteItem(itemactive[i], i);
1616  i = 0;
1617  } else {
1618  i++;
1619  }
1620  }
1621  } else {
1622  if (pnum == myplr) {
1623  if (plr[pnum]._pClass == PC_WARRIOR) {
1624  PlaySFX(random_(0, 3) + PS_WARR14);
1625 #ifndef SPAWN
1626  } else if (plr[pnum]._pClass == PC_ROGUE) {
1627  PlaySFX(random_(0, 3) + PS_ROGUE14);
1628  } else if (plr[pnum]._pClass == PC_SORCERER) {
1629  PlaySFX(random_(0, 3) + PS_MAGE14);
1630 #endif
1631  }
1632  }
1633  plr[pnum].HoldItem = item[ii];
1634  RespawnItem(ii, TRUE);
1635  NetSendCmdPItem(TRUE, CMD_RESPAWNITEM, item[ii]._ix, item[ii]._iy);
1636  plr[pnum].HoldItem._itype = ITYPE_NONE;
1637  }
1638 }
1639 
1640 int FindGetItem(int idx, WORD ci, int iseed)
1641 {
1642  int i, ii;
1643 
1644  i = 0;
1645  if (numitems <= 0)
1646  return -1;
1647 
1648  while (1) {
1649  ii = itemactive[i];
1650  if (item[ii].IDidx == idx && item[ii]._iSeed == iseed && item[ii]._iCreateInfo == ci)
1651  break;
1652 
1653  i++;
1654 
1655  if (i >= numitems)
1656  return -1;
1657  }
1658 
1659  return ii;
1660 }
1661 
1662 void SyncGetItem(int x, int y, int idx, WORD ci, int iseed)
1663 {
1664  int i, ii;
1665 
1666  if (dItem[x][y]) {
1667  ii = dItem[x][y] - 1;
1668  if (item[ii].IDidx == idx
1669  && item[ii]._iSeed == iseed
1670  && item[ii]._iCreateInfo == ci) {
1671  FindGetItem(idx, ci, iseed);
1672  } else {
1673  ii = FindGetItem(idx, ci, iseed);
1674  }
1675  } else {
1676  ii = FindGetItem(idx, ci, iseed);
1677  }
1678 
1679  if (ii != -1) {
1680  dItem[item[ii]._ix][item[ii]._iy] = 0;
1681  i = 0;
1682  while (i < numitems) {
1683  if (itemactive[i] == ii) {
1684  DeleteItem(itemactive[i], i);
1685  FindGetItem(idx, ci, iseed);
1687  FindGetItem(idx, ci, iseed); /* todo: replace with above */
1688  i = 0;
1689  } else {
1690  i++;
1691  }
1692  }
1694  FindGetItem(idx, ci, iseed); /* todo: replace with above */
1695  }
1696 }
1697 
1698 BOOL CanPut(int x, int y)
1699 {
1700  char oi, oi2;
1701 
1702  if (dItem[x][y])
1703  return FALSE;
1704  if (nSolidTable[dPiece[x][y]])
1705  return FALSE;
1706 
1707  if (dObject[x][y]) {
1708  if (object[dObject[x][y] > 0 ? dObject[x][y] - 1 : -1 - dObject[x][y]]._oSolidFlag)
1709  return FALSE;
1710  }
1711 
1712  oi = dObject[x + 1][y + 1];
1713  if (oi > 0 && object[oi - 1]._oSelFlag != 0) {
1714  return FALSE;
1715  }
1716  if (oi < 0 && object[-(oi + 1)]._oSelFlag != 0) {
1717  return FALSE;
1718  }
1719 
1720  oi = dObject[x + 1][y];
1721  if (oi > 0) {
1722  oi2 = dObject[x][y + 1];
1723  if (oi2 > 0 && object[oi - 1]._oSelFlag != 0 && object[oi2 - 1]._oSelFlag != 0)
1724  return FALSE;
1725  }
1726 
1727  if (currlevel == 0 && dMonster[x][y] != 0)
1728  return FALSE;
1729  if (currlevel == 0 && dMonster[x + 1][y + 1] != 0)
1730  return FALSE;
1731 
1732  return TRUE;
1733 }
1734 
1736 {
1737  int dir;
1738 
1739  if (numitems >= 127)
1740  return FALSE;
1741 
1742  dir = GetDirection(plr[myplr].WorldX, plr[myplr].WorldY, cursmx, cursmy);
1743  if (CanPut(plr[myplr].WorldX + offset_x[dir], plr[myplr].WorldY + offset_y[dir])) {
1744  return TRUE;
1745  }
1746 
1747  dir = (dir - 1) & 7;
1748  if (CanPut(plr[myplr].WorldX + offset_x[dir], plr[myplr].WorldY + offset_y[dir])) {
1749  return TRUE;
1750  }
1751 
1752  dir = (dir + 2) & 7;
1753  if (CanPut(plr[myplr].WorldX + offset_x[dir], plr[myplr].WorldY + offset_y[dir])) {
1754  return TRUE;
1755  }
1756 
1757  return CanPut(plr[myplr].WorldX, plr[myplr].WorldY);
1758 }
1759 
1760 void DrawInvMsg(char *msg)
1761 {
1762  DWORD dwTicks;
1763 
1764  dwTicks = SDL_GetTicks();
1765  if (dwTicks - sgdwLastTime >= 5000) {
1766  sgdwLastTime = dwTicks;
1767  ErrorPlrMsg(msg);
1768  }
1769 }
1770 
1771 int InvPutItem(int pnum, int x, int y)
1772 {
1773  BOOL done;
1774  int d, ii;
1775  int i, j, l;
1776  int xx, yy;
1777  int xp, yp;
1778 
1779  if (numitems >= 127)
1780  return -1;
1781 
1782  if (FindGetItem(plr[pnum].HoldItem.IDidx, plr[pnum].HoldItem._iCreateInfo, plr[pnum].HoldItem._iSeed) != -1) {
1783  DrawInvMsg("A duplicate item has been detected. Destroying duplicate...");
1784  SyncGetItem(x, y, plr[pnum].HoldItem.IDidx, plr[pnum].HoldItem._iCreateInfo, plr[pnum].HoldItem._iSeed);
1785  }
1786 
1787  d = GetDirection(plr[pnum].WorldX, plr[pnum].WorldY, x, y);
1788  xx = x - plr[pnum].WorldX;
1789  yy = y - plr[pnum].WorldY;
1790  if (abs(xx) > 1 || abs(yy) > 1) {
1791  x = plr[pnum].WorldX + offset_x[d];
1792  y = plr[pnum].WorldY + offset_y[d];
1793  }
1794  if (!CanPut(x, y)) {
1795  d = (d - 1) & 7;
1796  x = plr[pnum].WorldX + offset_x[d];
1797  y = plr[pnum].WorldY + offset_y[d];
1798  if (!CanPut(x, y)) {
1799  d = (d + 2) & 7;
1800  x = plr[pnum].WorldX + offset_x[d];
1801  y = plr[pnum].WorldY + offset_y[d];
1802  if (!CanPut(x, y)) {
1803  done = FALSE;
1804  for (l = 1; l < 50 && !done; l++) {
1805  for (j = -l; j <= l && !done; j++) {
1806  yp = j + plr[pnum].WorldY;
1807  for (i = -l; i <= l && !done; i++) {
1808  xp = i + plr[pnum].WorldX;
1809  if (CanPut(xp, yp)) {
1810  done = TRUE;
1811  x = xp;
1812  y = yp;
1813  }
1814  }
1815  }
1816  }
1817  if (!done)
1818  return -1;
1819  }
1820  }
1821  }
1822 
1823  CanPut(x, y); //if (!CanPut(x, y)) {
1824  // assertion_failed(__LINE__, __FILE__, "CanPut(x,y)");
1825  //}
1826 
1827  ii = itemavail[0];
1828  dItem[x][y] = ii + 1;
1829  itemavail[0] = itemavail[MAXITEMS - (numitems + 1)];
1830  itemactive[numitems] = ii;
1831  item[ii] = plr[pnum].HoldItem;
1832  item[ii]._ix = x;
1833  item[ii]._iy = y;
1834  RespawnItem(ii, TRUE);
1835  numitems++;
1837  return ii;
1838 }
1839 
1840 int SyncPutItem(int pnum, int x, int y, int idx, WORD icreateinfo, int iseed, int Id, int dur, int mdur, int ch, int mch, int ivalue, DWORD ibuff)
1841 {
1842  BOOL done;
1843  int d, ii;
1844  int i, j, l;
1845  int xx, yy;
1846  int xp, yp;
1847 
1848  if (numitems >= 127)
1849  return -1;
1850 
1851  if (FindGetItem(idx, icreateinfo, iseed) != -1) {
1852  DrawInvMsg("A duplicate item has been detected from another player.");
1853  SyncGetItem(x, y, idx, icreateinfo, iseed);
1854  }
1855 
1856  d = GetDirection(plr[pnum].WorldX, plr[pnum].WorldY, x, y);
1857  xx = x - plr[pnum].WorldX;
1858  yy = y - plr[pnum].WorldY;
1859  if (abs(xx) > 1 || abs(yy) > 1) {
1860  x = plr[pnum].WorldX + offset_x[d];
1861  y = plr[pnum].WorldY + offset_y[d];
1862  }
1863  if (!CanPut(x, y)) {
1864  d = (d - 1) & 7;
1865  x = plr[pnum].WorldX + offset_x[d];
1866  y = plr[pnum].WorldY + offset_y[d];
1867  if (!CanPut(x, y)) {
1868  d = (d + 2) & 7;
1869  x = plr[pnum].WorldX + offset_x[d];
1870  y = plr[pnum].WorldY + offset_y[d];
1871  if (!CanPut(x, y)) {
1872  done = FALSE;
1873  for (l = 1; l < 50 && !done; l++) {
1874  for (j = -l; j <= l && !done; j++) {
1875  yp = j + plr[pnum].WorldY;
1876  for (i = -l; i <= l && !done; i++) {
1877  xp = i + plr[pnum].WorldX;
1878  if (CanPut(xp, yp)) {
1879  done = TRUE;
1880  x = xp;
1881  y = yp;
1882  }
1883  }
1884  }
1885  }
1886  if (!done)
1887  return -1;
1888  }
1889  }
1890  }
1891 
1892  CanPut(x, y);
1893 
1894  ii = itemavail[0];
1895  dItem[x][y] = ii + 1;
1896  itemavail[0] = itemavail[MAXITEMS - (numitems + 1)];
1897  itemactive[numitems] = ii;
1898 
1899  if (idx == IDI_EAR) {
1900  RecreateEar(ii, icreateinfo, iseed, Id, dur, mdur, ch, mch, ivalue, ibuff);
1901  } else {
1902  RecreateItem(ii, idx, icreateinfo, iseed, ivalue);
1903  if (Id)
1904  item[ii]._iIdentified = TRUE;
1905  item[ii]._iDurability = dur;
1906  item[ii]._iMaxDur = mdur;
1907  item[ii]._iCharges = ch;
1908  item[ii]._iMaxCharges = mch;
1909  }
1910 
1911  item[ii]._ix = x;
1912  item[ii]._iy = y;
1913  RespawnItem(ii, TRUE);
1914  numitems++;
1915  return ii;
1916 }
1917 
1919 {
1920  int r, ii, nGold;
1921  ItemStruct *pi;
1922  PlayerStruct *p;
1923  char rv;
1924 
1925  for (r = 0; (DWORD)r < 73; r++) {
1926  if (MouseX >= InvRect[r].X
1927  && MouseX < InvRect[r].X + 29
1928  && MouseY >= InvRect[r].Y - 29
1929  && MouseY < InvRect[r].Y) {
1930  break;
1931  }
1932  }
1933 
1934  if ((DWORD)r >= 73)
1935  return -1;
1936 
1937  rv = -1;
1938  infoclr = COL_WHITE;
1939  pi = NULL;
1940  p = &plr[myplr];
1941  ClearPanel();
1942  if (r >= 0 && r <= 3) {
1943  rv = INVLOC_HEAD;
1944  pi = &p->InvBody[rv];
1945  } else if (r == 4) {
1946  rv = INVLOC_RING_LEFT;
1947  pi = &p->InvBody[rv];
1948  } else if (r == 5) {
1949  rv = INVLOC_RING_RIGHT;
1950  pi = &p->InvBody[rv];
1951  } else if (r == 6) {
1952  rv = INVLOC_AMULET;
1953  pi = &p->InvBody[rv];
1954  } else if (r >= 7 && r <= 12) {
1955  rv = INVLOC_HAND_LEFT;
1956  pi = &p->InvBody[rv];
1957  } else if (r >= 13 && r <= 18) {
1958  pi = &p->InvBody[INVLOC_HAND_LEFT];
1959  if (pi->_itype == ITYPE_NONE || pi->_iLoc != ILOC_TWOHAND) {
1960  rv = INVLOC_HAND_RIGHT;
1961  pi = &p->InvBody[rv];
1962  } else {
1963  rv = INVLOC_HAND_LEFT;
1964  }
1965  } else if (r >= 19 && r <= 24) {
1966  rv = INVLOC_CHEST;
1967  pi = &p->InvBody[rv];
1968  } else if (r >= 25 && r <= 64) {
1969  r = abs(p->InvGrid[r - 25]);
1970  if (!r)
1971  return -1;
1972  ii = r - 1;
1973  rv = ii + 7;
1974  pi = &p->InvList[ii];
1975  } else if (r >= 65) {
1976  r -= 65;
1977  drawsbarflag = TRUE;
1978  pi = &p->SpdList[r];
1979  if (pi->_itype == ITYPE_NONE)
1980  return -1;
1981  rv = r + 47;
1982  }
1983 
1984  if (pi->_itype == ITYPE_NONE)
1985  return -1;
1986 
1987  if (pi->_itype == ITYPE_GOLD) {
1988  nGold = pi->_ivalue;
1989  sprintf(infostr, "%i gold %s", nGold, get_pieces_str(nGold));
1990  } else {
1991  if (pi->_iMagical == ITEM_QUALITY_MAGIC) {
1992  infoclr = COL_BLUE;
1993  } else if (pi->_iMagical == ITEM_QUALITY_UNIQUE) {
1994  infoclr = COL_GOLD;
1995  }
1996  strcpy(infostr, pi->_iName);
1997  if (pi->_iIdentified) {
1998  strcpy(infostr, pi->_iIName);
1999  PrintItemDetails(pi);
2000  } else {
2001  PrintItemDur(pi);
2002  }
2003  }
2004 
2005  return rv;
2006 }
2007 
2008 void RemoveScroll(int pnum)
2009 {
2010  int i;
2011 
2012  for (i = 0; i < plr[pnum]._pNumInv; i++) {
2013  if (plr[pnum].InvList[i]._itype != ITYPE_NONE
2014  && (plr[pnum].InvList[i]._iMiscId == IMISC_SCROLL || plr[pnum].InvList[i]._iMiscId == IMISC_SCROLLT)
2015  && plr[pnum].InvList[i]._iSpell == plr[pnum]._pRSpell) {
2016  RemoveInvItem(pnum, i);
2017  CalcPlrScrolls(pnum);
2018  return;
2019  }
2020  }
2021  for (i = 0; i < MAXBELTITEMS; i++) {
2022  if (plr[pnum].SpdList[i]._itype != ITYPE_NONE
2023  && (plr[pnum].SpdList[i]._iMiscId == IMISC_SCROLL || plr[pnum].SpdList[i]._iMiscId == IMISC_SCROLLT)
2024  && plr[pnum].SpdList[i]._iSpell == plr[pnum]._pRSpell) {
2025  RemoveSpdBarItem(pnum, i);
2026  CalcPlrScrolls(pnum);
2027  return;
2028  }
2029  }
2030 }
2031 
2033 {
2034  int i;
2035 
2036  if (pcurs != CURSOR_HAND)
2037  return FALSE;
2038  if (leveltype == DTYPE_TOWN && !spelldata[plr[myplr]._pRSpell].sTownSpell)
2039  return FALSE;
2040 
2041  for (i = 0; i < plr[myplr]._pNumInv; i++) {
2042  if (plr[myplr].InvList[i]._itype != ITYPE_NONE
2043  && (plr[myplr].InvList[i]._iMiscId == IMISC_SCROLL || plr[myplr].InvList[i]._iMiscId == IMISC_SCROLLT)
2044  && plr[myplr].InvList[i]._iSpell == plr[myplr]._pRSpell) {
2045  return TRUE;
2046  }
2047  }
2048  for (i = 0; i < MAXBELTITEMS; i++) {
2049  if (plr[myplr].SpdList[i]._itype != ITYPE_NONE
2050  && (plr[myplr].SpdList[i]._iMiscId == IMISC_SCROLL || plr[myplr].SpdList[i]._iMiscId == IMISC_SCROLLT)
2051  && plr[myplr].SpdList[i]._iSpell == plr[myplr]._pRSpell) {
2052  return TRUE;
2053  }
2054  }
2055 
2056  return FALSE;
2057 }
2058 
2059 void UseStaffCharge(int pnum)
2060 {
2061  if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE
2062  && plr[pnum].InvBody[INVLOC_HAND_LEFT]._iMiscId == IMISC_STAFF
2063  && plr[pnum].InvBody[INVLOC_HAND_LEFT]._iSpell == plr[pnum]._pRSpell
2064  && plr[pnum].InvBody[INVLOC_HAND_LEFT]._iCharges > 0) {
2066  CalcPlrStaff(pnum);
2067  }
2068 }
2069 
2070 BOOL UseStaff()
2071 {
2072  if (pcurs == CURSOR_HAND) {
2073  if (plr[myplr].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE
2074  && plr[myplr].InvBody[INVLOC_HAND_LEFT]._iMiscId == IMISC_STAFF
2075  && plr[myplr].InvBody[INVLOC_HAND_LEFT]._iSpell == plr[myplr]._pRSpell
2076  && plr[myplr].InvBody[INVLOC_HAND_LEFT]._iCharges > 0) {
2077  return TRUE;
2078  }
2079  }
2080 
2081  return FALSE;
2082 }
2083 
2085 {
2089  else
2091  dropGoldFlag = TRUE;
2092  dropGoldValue = 0;
2093  if (talkflag)
2095 }
2096 
2097 BOOL UseInvItem(int pnum, int cii)
2098 {
2099  int c, idata;
2100  ItemStruct *Item;
2101  BOOL speedlist;
2102 
2103  if (plr[pnum]._pInvincible && !plr[pnum]._pHitPoints && pnum == myplr)
2104  return TRUE;
2105  if (pcurs != CURSOR_HAND)
2106  return TRUE;
2107  if (stextflag)
2108  return TRUE;
2109  if (cii <= INVITEM_HAND_RIGHT)
2110  return FALSE;
2111 
2112  if (cii <= INVITEM_INV_LAST) {
2113  c = cii - INVITEM_INV_FIRST;
2114  Item = &plr[pnum].InvList[c];
2115  speedlist = FALSE;
2116  } else {
2117  if (talkflag)
2118  return TRUE;
2119  c = cii - INVITEM_BELT_FIRST;
2120  Item = &plr[pnum].SpdList[c];
2121  speedlist = TRUE;
2122  }
2123 
2124  switch (Item->IDidx) {
2125  case IDI_MUSHROOM:
2126  sfxdelay = 10;
2127 #ifndef SPAWN
2128  if (plr[pnum]._pClass == PC_WARRIOR) {
2129  sfxdnum = PS_WARR95;
2130  } else if (plr[pnum]._pClass == PC_ROGUE) {
2131  sfxdnum = PS_ROGUE95;
2132  } else if (plr[pnum]._pClass == PC_SORCERER) {
2133  sfxdnum = PS_MAGE95;
2134  }
2135 #endif
2136  return TRUE;
2137  case IDI_FUNGALTM:
2138  PlaySFX(IS_IBOOK);
2139  sfxdelay = 10;
2140  if (plr[pnum]._pClass == PC_WARRIOR) {
2141  sfxdnum = PS_WARR29;
2142 #ifndef SPAWN
2143  } else if (plr[pnum]._pClass == PC_ROGUE) {
2144  sfxdnum = PS_ROGUE29;
2145  } else if (plr[pnum]._pClass == PC_SORCERER) {
2146  sfxdnum = PS_MAGE29;
2147 #endif
2148  }
2149  return TRUE;
2150  }
2151 
2152  if (!AllItemsList[Item->IDidx].iUsable)
2153  return FALSE;
2154 
2155  if (!Item->_iStatFlag) {
2156  if (plr[pnum]._pClass == PC_WARRIOR) {
2157  PlaySFX(PS_WARR13);
2158 #ifndef SPAWN
2159  } else if (plr[pnum]._pClass == PC_ROGUE) {
2161  } else if (plr[pnum]._pClass == PC_SORCERER) {
2162  PlaySFX(PS_MAGE13);
2163 #endif
2164  }
2165  return TRUE;
2166  }
2167 
2168  if (Item->_iMiscId == IMISC_NONE && Item->_itype == ITYPE_GOLD) {
2169  StartGoldDrop();
2170  return TRUE;
2171  }
2172 
2173  if (dropGoldFlag) {
2174  dropGoldFlag = FALSE;
2175  dropGoldValue = 0;
2176  }
2177 
2178  if (Item->_iMiscId == IMISC_SCROLL && currlevel == 0 && !spelldata[Item->_iSpell].sTownSpell) {
2179  return TRUE;
2180  }
2181 
2182  if (Item->_iMiscId == IMISC_SCROLLT && currlevel == 0 && !spelldata[Item->_iSpell].sTownSpell) {
2183  return TRUE;
2184  }
2185 
2186  idata = ItemCAnimTbl[Item->_iCurs];
2187  if (Item->_iMiscId == IMISC_BOOK)
2188  PlaySFX(IS_RBOOK);
2189  else if (pnum == myplr)
2190  PlaySFX(ItemInvSnds[idata]);
2191 
2192  UseItem(pnum, Item->_iMiscId, Item->_iSpell);
2193 
2194  if (speedlist) {
2195  RemoveSpdBarItem(pnum, c);
2196  return TRUE;
2197  } else {
2198  if (plr[pnum].InvList[c]._iMiscId == IMISC_MAPOFDOOM)
2199  return TRUE;
2200  RemoveInvItem(pnum, c);
2201  }
2202 
2203  return TRUE;
2204 }
2205 
2207 {
2208  if (pcursobj != -1)
2210  if (pcursitem != -1)
2212  if (pcursmonst != -1 && !M_Talker(pcursmonst) && !monster[pcursmonst].mtalkmsg)
2215 }
2216 
2217 int CalculateGold(int pnum)
2218 {
2219  int i, gold;
2220 
2221  gold = 0;
2222  for (i = 0; i < MAXBELTITEMS; i++) {
2223  if (plr[pnum].SpdList[i]._itype == ITYPE_GOLD) {
2224  gold += plr[pnum].SpdList[i]._ivalue;
2225  force_redraw = 255;
2226  }
2227  }
2228  for (i = 0; i < plr[pnum]._pNumInv; i++) {
2229  if (plr[pnum].InvList[i]._itype == ITYPE_GOLD)
2230  gold += plr[pnum].InvList[i]._ivalue;
2231  }
2232 
2233  return gold;
2234 }
2235 
2237 {
2238  if (TryInvPut()) {
2241  return TRUE;
2242  }
2243 
2244  return FALSE;
2245 }
2246 
InvGetItem
void InvGetItem(int pnum, int ii)
Definition: inv.cpp:1472
ILOC_BELT
@ ILOC_BELT
Definition: enums.h:1189
ItemStruct::_iSeed
int _iSeed
Definition: structs.h:100
StartGoldDrop
void StartGoldDrop()
Definition: inv.cpp:2084
gpBuffer
BYTE * gpBuffer
GOLD_MAX_LIMIT
#define GOLD_MAX_LIMIT
Definition: defs.h:68
ANIM_ID_UNARMED_SHIELD
@ ANIM_ID_UNARMED_SHIELD
Definition: enums.h:2856
cursmx
int cursmx
Definition: cursor.cpp:24
PlayerStruct::_pGold
int _pGold
Definition: structs.h:275
QS_MUSHSPAWNED
@ QS_MUSHSPAWNED
Definition: enums.h:2577
quests
QuestStruct quests[MAXQUESTS]
Definition: quests.cpp:8
Q_ANVIL
@ Q_ANVIL
Definition: enums.h:2558
ItemStruct::_iLoc
char _iLoc
Definition: structs.h:118
ItemStruct::_iy
int _iy
Definition: structs.h:104
IDI_ARMOFVAL
@ IDI_ARMOFVAL
Definition: enums.h:2529
ItemStruct::_iMiscId
int _iMiscId
Definition: structs.h:130
PlayerStruct::InvGrid
char InvGrid[NUM_INV_GRID_ELEM]
Definition: structs.h:316
talkflag
BOOL talkflag
Definition: control.cpp:46
MouseY
int MouseY
Definition: diablo.cpp:17
ItemStruct::_iSpell
int _iSpell
Definition: structs.h:132
INVITEM_HEAD
@ INVITEM_HEAD
Definition: enums.h:2800
PrintItemDur
void PrintItemDur(ItemStruct *x)
Definition: items.cpp:3088
ILOC_ARMOR
@ ILOC_ARMOR
Definition: enums.h:1184
IDI_FUNGALTM
@ IDI_FUNGALTM
Definition: enums.h:2519
PANEL_X
#define PANEL_X
Definition: defs.h:136
SCREENXY
#define SCREENXY(x, y)
Definition: defs.h:155
ITEM_QUALITY_MAGIC
@ ITEM_QUALITY_MAGIC
Definition: enums.h:9
ItemStruct::_iMinStr
char _iMinStr
Definition: structs.h:166
force_redraw
int force_redraw
Definition: diablo.cpp:30
currlevel
BYTE currlevel
Definition: gendung.cpp:40
IS_RBOOK
@ IS_RBOOK
Definition: enums.h:348
InvXY
Definition: structs.h:1169
TryInvPut
BOOL TryInvPut()
Definition: inv.cpp:1735
ItemStruct::_iCurs
int _iCurs
Definition: structs.h:121
SLOTXY_RING_RIGHT
@ SLOTXY_RING_RIGHT
Definition: enums.h:2820
UseInvItem
BOOL UseInvItem(int pnum, int cii)
Definition: inv.cpp:2097
ItemStruct::_ix
int _ix
Definition: structs.h:103
PANEL_Y
#define PANEL_Y
Definition: defs.h:137
SpellData::sTownSpell
BOOL sTownSpell
Definition: structs.h:1024
CheckBookLevel
void CheckBookLevel(int pnum)
Definition: inv.cpp:1374
RSPLTYPE_CHARGES
@ RSPLTYPE_CHARGES
Definition: enums.h:2061
SetCursor_
void SetCursor_(int i)
Definition: cursor.cpp:99
CheckQuestItem
void CheckQuestItem(int pnum)
Definition: inv.cpp:1392
PS_ROGUE88
@ PS_ROGUE88
Definition: enums.h:1003
SCREEN_Y
#define SCREEN_Y
Definition: defs.h:126
NUM_INVLOC
@ NUM_INVLOC
Definition: enums.h:2796
UseStaff
BOOL UseStaff()
Definition: inv.cpp:2070
INVITEM_INV_FIRST
@ INVITEM_INV_FIRST
Definition: enums.h:2807
Q_MUSHROOM
@ Q_MUSHROOM
Definition: enums.h:2549
INVLOC_HEAD
@ INVLOC_HEAD
Definition: enums.h:2789
GOLD_MEDIUM_LIMIT
#define GOLD_MEDIUM_LIMIT
Definition: defs.h:67
INVITEM_RING_RIGHT
@ INVITEM_RING_RIGHT
Definition: enums.h:2802
get_pieces_str
char * get_pieces_str(int nGold)
Definition: control.cpp:1891
DoTelekinesis
void DoTelekinesis()
Definition: inv.cpp:2206
INVITEM_HAND_RIGHT
@ INVITEM_HAND_RIGHT
Definition: enums.h:2805
offset_x
int offset_x[8]
Definition: monster.cpp:61
cel_transparency_active
int cel_transparency_active
Specifies whether transparency is active for the current CEL file being decoded.
Definition: scrollrt.cpp:38
ItemStruct::_iStatFlag
BOOL _iStatFlag
Definition: structs.h:169
INVLOC_CHEST
@ INVLOC_CHEST
Definition: enums.h:2795
NetSendCmdDelItem
void NetSendCmdDelItem(BOOL bHiPri, BYTE bLoc)
Definition: msg.cpp:904
PlayerStruct::_pNumInv
int _pNumInv
Definition: structs.h:315
PlayerStruct::WorldX
int WorldX
Definition: structs.h:188
INVITEM_HAND_LEFT
@ INVITEM_HAND_LEFT
Definition: enums.h:2804
CheckInvItem
void CheckInvItem()
Definition: inv.cpp:1341
CheckItemStats
void CheckItemStats(int pnum)
Definition: inv.cpp:1361
PS_WARR87
@ PS_WARR87
Definition: enums.h:1113
CalcPlrScrolls
void CalcPlrScrolls(int p)
Definition: items.cpp:613
pcursinvitem
char pcursinvitem
inv_item value
Definition: cursor.cpp:19
cursH
DEVILUTION_BEGIN_NAMESPACE int cursH
Definition: cursor.cpp:10
PlayerStruct::_pRSpell
int _pRSpell
Definition: structs.h:220
PS_MAGE88
@ PS_MAGE88
Definition: enums.h:900
CURSOR_HAND
@ CURSOR_HAND
Definition: enums.h:2067
PS_ROGUE95
@ PS_ROGUE95
Definition: enums.h:1010
ItemStruct::_iDurability
int _iDurability
Definition: structs.h:135
ItemStruct::_iMinMag
unsigned char _iMinMag
Definition: structs.h:167
PS_MAGE14
@ PS_MAGE14
Definition: enums.h:825
CelClippedBlitLightTrans
void CelClippedBlitLightTrans(BYTE *pBuff, BYTE *pCelBuff, int nCel, int nWidth)
Same as CelBlitLightTransSafe.
Definition: engine.cpp:424
PS_WARR29
@ PS_WARR29
Definition: enums.h:1053
item
ItemStruct item[MAXITEMS+1]
Definition: items.cpp:15
MAXITEMS
#define MAXITEMS
Definition: defs.h:27
InvXY::Y
int Y
Definition: structs.h:1171
ICURS_GOLD_MEDIUM
@ ICURS_GOLD_MEDIUM
Definition: enums.h:178
IDI_MUSHROOM
@ IDI_MUSHROOM
Definition: enums.h:2517
GetDirection
int GetDirection(int x1, int y1, int x2, int y2)
Calculate the best fit direction between two points.
Definition: engine.cpp:683
CheckInvScrn
void CheckInvScrn()
Check for interactions with belt.
Definition: inv.cpp:1353
ItemStruct::_itype
int _itype
Definition: structs.h:102
ILOC_AMULET
@ ILOC_AMULET
Definition: enums.h:1187
AllItemsList
DEVILUTION_BEGIN_NAMESPACE ItemDataStruct AllItemsList[]
Contains the data related to each item ID.
Definition: itemdat.cpp:11
PlayerStruct::HoldItem
ItemStruct HoldItem
Definition: structs.h:318
ANIM_ID_UNARMED
@ ANIM_ID_UNARMED
Definition: enums.h:2855
itemactive
DEVILUTION_BEGIN_NAMESPACE int itemactive[MAXITEMS]
Definition: items.cpp:10
PS_MAGE91
@ PS_MAGE91
Definition: enums.h:903
ITYPE_NONE
@ ITYPE_NONE
Definition: enums.h:2495
COL_WHITE
@ COL_WHITE
Definition: enums.h:1993
IDI_EAR
@ IDI_EAR
Definition: enums.h:2524
PlayerStruct::_pSplLvl
char _pSplLvl[64]
Definition: structs.h:225
INVLOC_HAND_LEFT
@ INVLOC_HAND_LEFT
Definition: enums.h:2793
ICOL_WHITE
@ ICOL_WHITE
Definition: enums.h:2000
dropGoldValue
int dropGoldValue
Definition: control.cpp:23
PlayerStruct::InvList
ItemStruct InvList[NUM_INV_GRID_ELEM]
Definition: structs.h:314
COL_GOLD
@ COL_GOLD
Definition: enums.h:1996
MemFreeDbg
#define MemFreeDbg(p)
Definition: defs.h:157
CMD_KNOCKBACK
@ CMD_KNOCKBACK
Definition: enums.h:2199
InvDrawSlotBack
void InvDrawSlotBack(int X, int Y, int W, int H)
Definition: inv.cpp:135
PM_DEATH
@ PM_DEATH
Definition: enums.h:2051
NetSendCmdGItem
void NetSendCmdGItem(BOOL bHiPri, BYTE bCmd, BYTE mast, BYTE pnum, BYTE ii)
Definition: msg.cpp:752
PS_WARR13
@ PS_WARR13
Definition: enums.h:1031
CalcPlrInv
void CalcPlrInv(int p, BOOL Loadgfx)
Definition: items.cpp:764
ItemStruct::_ivalue
int _ivalue
Definition: structs.h:122
PS_ROGUE14
@ PS_ROGUE14
Definition: enums.h:928
all.h
QuestStruct::_qactive
unsigned char _qactive
Definition: structs.h:973
CheckInvSwap
void CheckInvSwap(int pnum, BYTE bLoc, int idx, WORD wCI, int seed, BOOL bId)
Definition: inv.cpp:1081
RecreateItem
void RecreateItem(int ii, int idx, WORD icreateinfo, int iseed, int ivalue)
Definition: items.cpp:2251
DropItemBeforeTrig
BOOL DropItemBeforeTrig()
Definition: inv.cpp:2236
PlayerStruct::SpdList
ItemStruct SpdList[MAXBELTITEMS]
Definition: structs.h:317
DeleteItem
void DeleteItem(int ii, int i)
Definition: items.cpp:2427
ItemStruct::_iMagical
char _iMagical
Definition: structs.h:115
dObject
char dObject[MAXDUNX][MAXDUNY]
Definition: gendung.cpp:19
NUM_XY_SLOTS
@ NUM_XY_SLOTS
Definition: enums.h:2836
INVLOC_RING_RIGHT
@ INVLOC_RING_RIGHT
Definition: enums.h:2791
RespawnItem
void RespawnItem(int i, BOOL FlipFlag)
Definition: items.cpp:2396
PM_WALK3
@ PM_WALK3
Definition: enums.h:2046
SLOTXY_HEAD_FIRST
@ SLOTXY_HEAD_FIRST
Definition: enums.h:2817
ILOC_RING
@ ILOC_RING
Definition: enums.h:1186
GOLD_SMALL_LIMIT
#define GOLD_SMALL_LIMIT
Definition: defs.h:66
initialDropGoldIndex
int initialDropGoldIndex
Definition: control.cpp:45
PlayerStruct::_pMagic
int _pMagic
Definition: structs.h:247
ILOC_HELM
@ ILOC_HELM
Definition: enums.h:1185
spelldata
DEVILUTION_BEGIN_NAMESPACE SpellData spelldata[]
Data related to each spell ID.
Definition: spelldat.cpp:6
infostr
char infostr[256]
Definition: control.cpp:52
MAXBELTITEMS
#define MAXBELTITEMS
Definition: defs.h:28
ItemStruct
Definition: structs.h:99
PS_MAGE13
@ PS_MAGE13
Definition: enums.h:824
RIGHT_PANEL
#define RIGHT_PANEL
Definition: defs.h:143
SyncPutItem
int SyncPutItem(int pnum, int x, int y, int idx, WORD icreateinfo, int iseed, int Id, int dur, int mdur, int ch, int mch, int ivalue, DWORD ibuff)
Definition: inv.cpp:1840
INV_SLOT_SIZE_PX
#define INV_SLOT_SIZE_PX
Definition: defs.h:47
UseScroll
BOOL UseScroll()
Definition: inv.cpp:2032
ItemStruct::_iMaxDur
int _iMaxDur
Definition: structs.h:136
CheckInvPaste
void CheckInvPaste(int pnum, int mx, int my)
Definition: inv.cpp:674
INVITEM_CHEST
@ INVITEM_CHEST
Definition: enums.h:2806
ClearPanel
void ClearPanel()
Definition: control.cpp:559
INVLOC_HAND_RIGHT
@ INVLOC_HAND_RIGHT
Definition: enums.h:2794
PS_ROGUE13
@ PS_ROGUE13
Definition: enums.h:927
SetICursor
void SetICursor(int i)
Definition: cursor.cpp:91
SyncGetItem
void SyncGetItem(int x, int y, int idx, WORD ci, int iseed)
Definition: inv.cpp:1662
ICURS_GOLD_SMALL
@ ICURS_GOLD_SMALL
Definition: enums.h:177
DrawPanelBox
void DrawPanelBox(int x, int y, int w, int h, int sx, int sy)
Definition: control.cpp:565
dPiece
int dPiece[MAXDUNX][MAXDUNY]
Definition: gendung.cpp:26
CURSOR_FIRSTITEM
@ CURSOR_FIRSTITEM
Definition: enums.h:2078
CalcPlrStaff
void CalcPlrStaff(int p)
Definition: items.cpp:640
ILOC_UNEQUIPABLE
@ ILOC_UNEQUIPABLE
Definition: enums.h:1188
nSolidTable
BOOLEAN nSolidTable[2049]
List of path blocking dPieces.
Definition: gendung.cpp:45
IMISC_STAFF
@ IMISC_STAFF
Definition: enums.h:2454
NetSendCmdParam1
void NetSendCmdParam1(BOOL bHiPri, BYTE bCmd, WORD wParam1)
Definition: msg.cpp:698
RemoveScroll
void RemoveScroll(int pnum)
Definition: inv.cpp:2008
UseItem
void UseItem(int p, int Mid, int spl)
Definition: items.cpp:3132
ICURS_GOLD_LARGE
@ ICURS_GOLD_LARGE
Definition: enums.h:179
NetSendCmdChItem
void NetSendCmdChItem(BOOL bHiPri, BYTE bLoc)
Definition: msg.cpp:887
INVITEM_RING_LEFT
@ INVITEM_RING_LEFT
Definition: enums.h:2801
ICOL_BLUE
@ ICOL_BLUE
Definition: enums.h:2001
PS_ROGUE91
@ PS_ROGUE91
Definition: enums.h:1006
SLOTXY_CHEST_FIRST
@ SLOTXY_CHEST_FIRST
Definition: enums.h:2826
DEVILUTION_END_NAMESPACE
#define DEVILUTION_END_NAMESPACE
Definition: types.h:10
INVLOC_AMULET
@ INVLOC_AMULET
Definition: enums.h:2792
ITYPE_GOLD
@ ITYPE_GOLD
Definition: enums.h:2491
light_table_index
DEVILUTION_BEGIN_NAMESPACE int light_table_index
Specifies the current light entry.
Definition: scrollrt.cpp:8
QS_MUSHPICKED
@ QS_MUSHPICKED
Definition: enums.h:2578
M_Talker
BOOL M_Talker(int i)
Definition: monster.cpp:1111
monster
MonsterStruct monster[MAXMONSTERS]
Definition: monster.cpp:19
InvItemWidth
const int InvItemWidth[180]
Maps from objcurs.cel frame number to frame width.
Definition: cursor.cpp:31
sfxdnum
int sfxdnum
Definition: effects.cpp:13
SLOTXY_HAND_LEFT_FIRST
@ SLOTXY_HAND_LEFT_FIRST
Definition: enums.h:2822
PS_MAGE87
@ PS_MAGE87
Definition: enums.h:899
FindGetItem
int FindGetItem(int idx, WORD ci, int iseed)
Definition: inv.cpp:1640
SLOTXY_BELT_FIRST
@ SLOTXY_BELT_FIRST
Definition: enums.h:2834
RSPLTYPE_SCROLL
@ RSPLTYPE_SCROLL
Definition: enums.h:2060
ErrorPlrMsg
char * ErrorPlrMsg(const char *pszMsg)
Definition: plrmsg.cpp:28
AutoGetItem
void AutoGetItem(int pnum, int ii)
Definition: inv.cpp:1504
LoadFileInMem
BYTE * LoadFileInMem(char *pszName, DWORD *pdwFileLen)
Load a file in to a buffer.
Definition: engine.cpp:801
RemoveInvItem
void RemoveInvItem(int pnum, int iv)
Definition: inv.cpp:1276
IS_IBOOK
@ IS_IBOOK
Definition: enums.h:330
ItemInvSnds
int ItemInvSnds[ITEMTYPES]
Definition: items.cpp:154
CalculateGold
int CalculateGold(int pnum)
Definition: inv.cpp:2217
CelDraw
void CelDraw(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth)
Blit CEL sprite to the back buffer at the given coordinates.
Definition: engine.cpp:47
SLOTXY_AMULET
@ SLOTXY_AMULET
Definition: enums.h:2821
IMISC_BOOK
@ IMISC_BOOK
Definition: enums.h:2455
PAL16_GRAY
#define PAL16_GRAY
Definition: defs.h:103
drawsbarflag
BOOL drawsbarflag
Definition: inv.cpp:12
RIGHT_PANEL_X
#define RIGHT_PANEL_X
Definition: defs.h:144
dItem
char dItem[MAXDUNX][MAXDUNY]
Definition: gendung.cpp:57
ILOC_TWOHAND
@ ILOC_TWOHAND
Definition: enums.h:1183
SLOTXY_HEAD_LAST
@ SLOTXY_HEAD_LAST
Definition: enums.h:2818
SLOTXY_RING_LEFT
@ SLOTXY_RING_LEFT
Definition: enums.h:2819
ITYPE_STAFF
@ ITYPE_STAFF
Definition: enums.h:2490
DrawInvBelt
void DrawInvBelt()
Definition: inv.cpp:404
AP2x2Tbl
int AP2x2Tbl[10]
Specifies the starting inventory slots for placement of 2x2 items.
Definition: inv.cpp:112
QUEST_DONE
@ QUEST_DONE
Definition: enums.h:2570
sfxdelay
DEVILUTION_BEGIN_NAMESPACE int sfxdelay
Definition: effects.cpp:12
IDI_ANVIL
@ IDI_ANVIL
Definition: enums.h:2516
ITEM_QUALITY_UNIQUE
@ ITEM_QUALITY_UNIQUE
Definition: enums.h:10
DrawInv
void DrawInv()
Definition: inv.cpp:160
PS_WARR91
@ PS_WARR91
Definition: enums.h:1117
SLOTXY_CHEST_LAST
@ SLOTXY_CHEST_LAST
Definition: enums.h:2827
Q_BLIND
@ Q_BLIND
Definition: enums.h:2556
COL_BLUE
@ COL_BLUE
Definition: enums.h:1994
ItemStruct::_iCharges
int _iCharges
Definition: structs.h:133
offset_y
int offset_y[8]
Definition: monster.cpp:62
fontkern
const BYTE fontkern[68]
Maps from smaltext.cel frame number to character width.
Definition: control.cpp:81
CelClippedDraw
void CelClippedDraw(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth)
Same as CelDraw but with the option to skip parts of the top and bottom of the sprite.
Definition: engine.cpp:79
inv_update_rem_item
void inv_update_rem_item(int pnum, BYTE iv)
Definition: inv.cpp:1263
PlaySFX
void PlaySFX(int psfx)
Definition: effects.cpp:1043
ItemStruct::_iName
char _iName[64]
Definition: structs.h:116
CanPut
BOOL CanPut(int x, int y)
Definition: inv.cpp:1698
SPANEL_WIDTH
#define SPANEL_WIDTH
Definition: defs.h:139
pcursmonst
int pcursmonst
Definition: cursor.cpp:13
Q_ROCK
@ Q_ROCK
Definition: enums.h:2548
SLOTXY_HAND_LEFT_LAST
@ SLOTXY_HAND_LEFT_LAST
Definition: enums.h:2823
ItemStruct::_iIdentified
BOOL _iIdentified
Definition: structs.h:114
pcursobj
char pcursobj
Definition: cursor.cpp:22
PS_MAGE95
@ PS_MAGE95
Definition: enums.h:907
DTYPE_TOWN
@ DTYPE_TOWN
Definition: enums.h:1868
IDI_OPTAMULET
@ IDI_OPTAMULET
Definition: enums.h:2510
SLOTXY_HAND_RIGHT_FIRST
@ SLOTXY_HAND_RIGHT_FIRST
Definition: enums.h:2824
numitems
int numitems
Definition: items.cpp:19
sgdwLastTime
int sgdwLastTime
Definition: inv.cpp:13
icursH
int icursH
Definition: cursor.cpp:16
PS_ROGUE29
@ PS_ROGUE29
Definition: enums.h:943
invflag
DEVILUTION_BEGIN_NAMESPACE BOOL invflag
Definition: inv.cpp:10
IMISC_NONE
@ IMISC_NONE
Definition: enums.h:2431
IMISC_MAPOFDOOM
@ IMISC_MAPOFDOOM
Definition: enums.h:2473
IMISC_SCROLLT
@ IMISC_SCROLLT
Definition: enums.h:2453
AutoPlace
BOOL AutoPlace(int pnum, int ii, int sx, int sy, BOOL saveflag)
Definition: inv.cpp:450
WeaponAutoPlace
BOOL WeaponAutoPlace(int pnum)
Definition: inv.cpp:637
ItemDataStruct::iUsable
BOOL iUsable
Definition: structs.h:87
PlayerStruct::InvBody
ItemStruct InvBody[NUM_INVLOC]
Definition: structs.h:313
CMD_OPOBJT
@ CMD_OPOBJT
Definition: enums.h:2198
initialDropGoldValue
int initialDropGoldValue
Definition: control.cpp:58
IDI_ROCK
@ IDI_ROCK
Definition: enums.h:2509
INVITEM_INV_LAST
@ INVITEM_INV_LAST
Definition: enums.h:2808
InitInv
void InitInv()
Definition: inv.cpp:119
SLOTXY_INV_LAST
@ SLOTXY_INV_LAST
Definition: enums.h:2831
PS_ROGUE89
@ PS_ROGUE89
Definition: enums.h:1004
CMD_REQUESTAGITEM
@ CMD_REQUESTAGITEM
Definition: enums.h:2211
SpecialAutoPlace
BOOL SpecialAutoPlace(int pnum, int ii, int sx, int sy, BOOL saveflag)
Definition: inv.cpp:505
ItemStruct::IDidx
int IDidx
Definition: structs.h:170
ITEM_QUALITY_NORMAL
@ ITEM_QUALITY_NORMAL
Definition: enums.h:8
CheckInvHLight
char CheckInvHLight()
Definition: inv.cpp:1918
IDI_GLDNELIX
@ IDI_GLDNELIX
Definition: enums.h:2515
icursW
int icursW
Definition: cursor.cpp:20
pcursitem
char pcursitem
Definition: cursor.cpp:21
myplr
int myplr
Definition: player.cpp:9
PS_ROGUE87
@ PS_ROGUE87
Definition: enums.h:1002
PAL16_BEIGE
#define PAL16_BEIGE
Definition: defs.h:98
random_
int random_(BYTE idx, int v)
Main RNG function.
Definition: engine.cpp:752
SLOTXY_HAND_RIGHT_LAST
@ SLOTXY_HAND_RIGHT_LAST
Definition: enums.h:2825
cursmy
int cursmy
Definition: cursor.cpp:25
ItemStruct::_iIName
char _iIName[64]
Definition: structs.h:117
ItemStruct::_iMaxCharges
int _iMaxCharges
Definition: structs.h:134
PC_WARRIOR
@ PC_WARRIOR
Definition: enums.h:2706
BUFFER_WIDTH
#define BUFFER_WIDTH
Definition: defs.h:128
QUEST_ACTIVE
@ QUEST_ACTIVE
Definition: enums.h:2569
QuestStruct::_qvar1
unsigned char _qvar1
Definition: structs.h:980
INVITEM_BELT_FIRST
@ INVITEM_BELT_FIRST
Definition: enums.h:2809
FreeInvGFX
void FreeInvGFX()
Definition: inv.cpp:114
PlayerStruct::_pStrength
int _pStrength
Definition: structs.h:245
ILOC_ONEHAND
@ ILOC_ONEHAND
Definition: enums.h:1182
icursW28
int icursW28
Definition: cursor.cpp:14
PC_ROGUE
@ PC_ROGUE
Definition: enums.h:2707
pcurs
int pcurs
Definition: cursor.cpp:27
dMonster
int dMonster[MAXDUNX][MAXDUNY]
Definition: gendung.cpp:17
DEVILUTION_BEGIN_NAMESPACE
Definition: sha.cpp:10
CMD_PUTITEM
@ CMD_PUTITEM
Definition: enums.h:2181
sgbControllerActive
bool sgbControllerActive
PANEL_TOP
#define PANEL_TOP
Definition: defs.h:134
pCursCels
BYTE * pCursCels
Definition: cursor.cpp:15
ITYPE_SHIELD
@ ITYPE_SHIELD
Definition: enums.h:2485
DrawInvMsg
void DrawInvMsg(char *msg)
Definition: inv.cpp:1760
GoldAutoPlace
BOOL GoldAutoPlace(int pnum)
Definition: inv.cpp:572
PS_MAGE29
@ PS_MAGE29
Definition: enums.h:840
IS_IGRAB
@ IS_IGRAB
Definition: enums.h:333
dropGoldFlag
BOOL dropGoldFlag
Definition: control.cpp:15
SCREEN_X
#define SCREEN_X
Definition: defs.h:125
infoclr
char infoclr
Definition: control.cpp:37
CMD_SYNCPUTITEM
@ CMD_SYNCPUTITEM
Definition: enums.h:2257
SwapItem
int SwapItem(ItemStruct *a, ItemStruct *b)
Definition: inv.cpp:663
PANEL_LEFT
#define PANEL_LEFT
Definition: defs.h:135
CMD_RESPAWNITEM
@ CMD_RESPAWNITEM
Definition: enums.h:2182
PS_WARR88
@ PS_WARR88
Definition: enums.h:1114
CelDrawLightRed
void CelDrawLightRed(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, char light)
Blit CEL sprite, and apply lighting, to the back buffer at the given coordinates, translated to a red...
Definition: engine.cpp:155
SPL_INVALID
@ SPL_INVALID
Definition: enums.h:2167
PrintChar
void PrintChar(int sx, int sy, int nCel, char col)
Print letter to the back buffer.
Definition: control.cpp:504
CheckInvCut
void CheckInvCut(int pnum, int mx, int my)
Definition: inv.cpp:1107
fontframe
const BYTE fontframe[128]
Maps from font index to smaltext.cel frame number.
Definition: control.cpp:65
ICOL_RED
@ ICOL_RED
Definition: enums.h:2002
SLOTXY_INV_FIRST
@ SLOTXY_INV_FIRST
Definition: enums.h:2830
PAL16_BLUE
#define PAL16_BLUE
Definition: defs.h:99
QUEST_INIT
@ QUEST_INIT
Definition: enums.h:2568
NUM_INV_GRID_ELEM
#define NUM_INV_GRID_ELEM
Definition: defs.h:46
ItemStruct::_iMinDex
char _iMinDex
Definition: structs.h:168
gbFontTransTbl
const BYTE gbFontTransTbl[256]
Maps ASCII character code to font index, as used by the small, medium and large sized fonts; which co...
Definition: control.cpp:106
InvRect
const InvXY InvRect[73]
Maps from inventory slot to screen position.
Definition: inv.cpp:31
PrintItemDetails
void PrintItemDetails(ItemStruct *x)
Definition: items.cpp:3040
ItemCAnimTbl
BYTE ItemCAnimTbl[169]
Definition: items.cpp:24
PlayerStruct::WorldY
int WorldY
Definition: structs.h:189
SpellData::sMinInt
int sMinInt
Definition: structs.h:1025
IMISC_SCROLL
@ IMISC_SCROLL
Definition: enums.h:2452
ICLASS_WEAPON
@ ICLASS_WEAPON
Definition: enums.h:2738
RecreateEar
void RecreateEar(int ii, WORD ic, int iseed, int Id, int dur, int mdur, int ch, int mch, int ivalue, int ibuff)
Definition: items.cpp:2297
PS_MAGE89
@ PS_MAGE89
Definition: enums.h:901
PS_WARR95
@ PS_WARR95
Definition: enums.h:1121
INVITEM_AMULET
@ INVITEM_AMULET
Definition: enums.h:2803
leveltype
BYTE leveltype
Definition: gendung.cpp:39
PlayerStruct::_pRSplType
char _pRSplType
Definition: structs.h:222
PS_WARR14
@ PS_WARR14
Definition: enums.h:1032
InvPutItem
int InvPutItem(int pnum, int x, int y)
Definition: inv.cpp:1771
PS_WARR89
@ PS_WARR89
Definition: enums.h:1115
plr
PlayerStruct plr[MAX_PLRS]
Definition: player.cpp:10
UseStaffCharge
void UseStaffCharge(int pnum)
Definition: inv.cpp:2059
RemoveSpdBarItem
void RemoveSpdBarItem(int pnum, int iv)
Definition: inv.cpp:1321
PlayerStruct
Definition: structs.h:178
CelBlitOutline
void CelBlitOutline(char col, int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth)
Blit a solid colder shape one pixel larger then the given sprite shape, to the back buffer at the giv...
Definition: engine.cpp:549
PC_SORCERER
@ PC_SORCERER
Definition: enums.h:2708
itemavail
int itemavail[MAXITEMS]
Definition: items.cpp:12
control_reset_talk
void control_reset_talk()
Definition: control.cpp:2162
MouseX
int MouseX
Definition: diablo.cpp:18
stextflag
char stextflag
Definition: stores.cpp:39
icursH28
int icursH28
Definition: cursor.cpp:11
Q_BLOOD
@ Q_BLOOD
Definition: enums.h:2557
ItemStruct::_iCreateInfo
WORD _iCreateInfo
Definition: structs.h:101
InvItemHeight
const int InvItemHeight[180]
Maps from objcurs.cel frame number to frame height.
Definition: cursor.cpp:55
cursW
int cursW
Definition: cursor.cpp:12
pInvCels
BYTE * pInvCels
Definition: inv.cpp:11
NetSendCmdPItem
void NetSendCmdPItem(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y)
Definition: msg.cpp:851
INVLOC_RING_LEFT
@ INVLOC_RING_LEFT
Definition: enums.h:2790
PlayerStruct::_pDexterity
int _pDexterity
Definition: structs.h:249