Devilution
Diablo devolved - magic behind the 1996 computer game
stores.cpp
Go to the documentation of this file.
1 #include "all.h"
2 
4 
5 int stextup;
13 int talker;
15 char stextsize;
16 
21 BOOL stextscrl;
25 char storehidx[48];
39 char stextflag;
40 
42 char *talkname[9] = {
43  "Griswold",
44  "Pepin",
45  "",
46  "Ogden",
47  "Cain",
48  "Farnham",
49  "Adria",
50  "Gillian",
51  "Wirt"
52 };
53 
54 void InitStores()
55 {
56  int i;
57 
58  pSTextBoxCels = LoadFileInMem("Data\\TextBox2.CEL", NULL);
59  pSPentSpn2Cels = LoadFileInMem("Data\\PentSpn2.CEL", NULL);
60  pSTextSlidCels = LoadFileInMem("Data\\TextSlid.CEL", NULL);
61  ClearSText(0, 24);
63  PentSpn2Frame = 1;
64  stextsize = FALSE;
65  stextscrl = FALSE;
66  numpremium = 0;
67  premiumlevel = 1;
68 
69  for (i = 0; i < 6; i++)
70  premiumitem[i]._itype = ITYPE_NONE;
71 
73  boylevel = 0;
74 }
75 
77 {
78  DWORD ticks = SDL_GetTicks();
79  if (ticks - PentSpn2Tick > 50) {
80  PentSpn2Frame = (PentSpn2Frame & 7) + 1;
81  PentSpn2Tick = ticks;
82  }
83 }
84 
86 {
87  int i, l;
88 
89  SetRndSeed(glSeedTbl[currlevel] * SDL_GetTicks());
90  if (gbMaxPlayers == 1) {
91  l = 0;
92  for (i = 0; i < NUMLEVELS; i++) {
93  if (plr[myplr]._pLvlVisited[i])
94  l = i;
95  }
96  } else {
97  l = plr[myplr]._pLevel >> 1;
98  }
99  l += 2;
100  if (l < 6)
101  l = 6;
102  if (l > 16)
103  l = 16;
104  SpawnStoreGold();
105  SpawnSmith(l);
106  SpawnWitch(l);
107  SpawnHealer(l);
108  SpawnBoy(plr[myplr]._pLevel);
109  SpawnPremium(plr[myplr]._pLevel);
110 }
111 
113 {
117 }
118 
120 {
121  CelDraw(PANEL_X + 344, 487, pSTextBoxCels, 1, 271);
122  trans_rect(PANEL_LEFT + 347, 28, 265, 297);
123 }
124 
125 void PrintSString(int x, int y, BOOL cjustflag, char *str, char col, int val)
126 {
127  int xx, yy;
128  int len, width, sx, sy, i, k, s;
129  BYTE c;
130  char valstr[32];
131 
132  s = y * 12 + stext[y]._syoff;
133  if (stextsize)
134  xx = PANEL_X + 32;
135  else
136  xx = PANEL_X + 352;
137  sx = xx + x;
138  sy = s + 204;
139  len = strlen(str);
140  if (stextsize)
141  yy = 577;
142  else
143  yy = 257;
144  k = 0;
145  if (cjustflag) {
146  width = 0;
147  for (i = 0; i < len; i++)
148  width += fontkern[fontframe[gbFontTransTbl[(BYTE)str[i]]]] + 1;
149  if (width < yy)
150  k = (yy - width) >> 1;
151  sx += k;
152  }
153  if (stextsel == y) {
154  CelDraw(cjustflag ? xx + x + k - 20 : xx + x - 20, s + 205, pSPentSpn2Cels, PentSpn2Frame, 12);
155  }
156  for (i = 0; i < len; i++) {
157  c = fontframe[gbFontTransTbl[(BYTE)str[i]]];
158  k += fontkern[c] + 1;
159  if (c && k <= yy) {
160  PrintChar(sx, sy, c, col);
161  }
162  sx += fontkern[c] + 1;
163  }
164  if (!cjustflag && val >= 0) {
165  sprintf(valstr, "%i", val);
166  sx = PANEL_X + 592 - x;
167  for (i = strlen(valstr) - 1; i >= 0; i--) {
168  c = fontframe[gbFontTransTbl[(BYTE)valstr[i]]];
169  sx -= fontkern[c] + 1;
170  if (c) {
171  PrintChar(sx, sy, c, col);
172  }
173  }
174  }
175  if (stextsel == y) {
176  CelDraw(cjustflag ? (xx + x + k + 4) : (PANEL_X + 596 - x), s + 205, pSPentSpn2Cels, PentSpn2Frame, 12);
177  }
178 }
179 
180 void DrawSLine(int y)
181 {
182  int xy, yy, width, line, sy;
183 
184  sy = y * 12;
185  if (stextsize) {
186  xy = SCREENXY(PANEL_LEFT + 26, 25);
187  yy = BUFFER_WIDTH * (sy + 198) + 26 + PANEL_X;
188  width = 586 / 4;
189  line = BUFFER_WIDTH - 586;
190  } else {
191  xy = SCREENXY(PANEL_LEFT + 346, 25);
192  yy = BUFFER_WIDTH * (sy + 198) + 346 + PANEL_X;
193  width = 266 / 4;
194  line = BUFFER_WIDTH - 266;
195  }
196 
198 
199  int i;
200  BYTE *src, *dst;
201 
202  src = &gpBuffer[xy];
203  dst = &gpBuffer[yy];
204 
205  for (i = 0; i < 3; i++, src += BUFFER_WIDTH, dst += BUFFER_WIDTH)
206  memcpy(dst, src, BUFFER_WIDTH - line);
207 }
208 
209 void DrawSSlider(int y1, int y2)
210 {
211  int yd1, yd2, yd3;
212 
213  yd1 = y1 * 12 + 204;
214  yd2 = y2 * 12 + 204;
215  if (stextscrlubtn != -1)
216  CelDraw(PANEL_X + 601, yd1, pSTextSlidCels, 12, 12);
217  else
218  CelDraw(PANEL_X + 601, yd1, pSTextSlidCels, 10, 12);
219  if (stextscrldbtn != -1)
220  CelDraw(PANEL_X + 601, yd2, pSTextSlidCels, 11, 12);
221  else
222  CelDraw(PANEL_X + 601, yd2, pSTextSlidCels, 9, 12);
223  yd1 += 12;
224  for (yd3 = yd1; yd3 < yd2; yd3 += 12) {
225  CelDraw(PANEL_X + 601, yd3, pSTextSlidCels, 14, 12);
226  }
227  if (stextsel == 22)
228  yd3 = stextlhold;
229  else
230  yd3 = stextsel;
231  if (storenumh > 1)
232  yd3 = 1000 * (stextsval + ((yd3 - stextup) >> 2)) / (storenumh - 1) * (y2 * 12 - y1 * 12 - 24) / 1000;
233  else
234  yd3 = 0;
235  CelDraw(PANEL_X + 601, (y1 + 1) * 12 + 204 + yd3, pSTextSlidCels, 13, 12);
236 }
237 
239 {
240  stextsel = -1;
241  stextsize = TRUE;
242 }
243 
244 void ClearSText(int s, int e)
245 {
246  int i;
247 
248  for (i = s; i < e; i++) {
249  stext[i]._sx = 0;
250  stext[i]._syoff = 0;
251  stext[i]._sstr[0] = 0;
252  stext[i]._sjust = FALSE;
253  stext[i]._sclr = COL_WHITE;
254  stext[i]._sline = 0;
255  stext[i]._ssel = FALSE;
256  stext[i]._sval = -1;
257  }
258 }
259 
260 void AddSLine(int y)
261 {
262  stext[y]._sx = 0;
263  stext[y]._syoff = 0;
264  stext[y]._sstr[0] = 0;
265  stext[y]._sline = 1;
266 }
267 
268 void AddSTextVal(int y, int val)
269 {
270  stext[y]._sval = val;
271 }
272 
273 void OffsetSTextY(int y, int yo)
274 {
275  stext[y]._syoff = yo;
276 }
277 
278 void AddSText(int x, int y, BOOL j, char *str, char clr, BOOL sel)
279 {
280  stext[y]._sx = x;
281  stext[y]._syoff = 0;
282  strcpy(stext[y]._sstr, str);
283  stext[y]._sjust = j;
284  stext[y]._sclr = clr;
285  stext[y]._sline = 0;
286  stext[y]._ssel = sel;
287 }
288 
290 {
291  BOOL done;
292  int i, w, h, idx;
293 
294  SetICursor(plr[myplr].HoldItem._iCurs + CURSOR_FIRSTITEM);
295  w = icursW28;
296  h = icursH28;
297  done = FALSE;
298  if (w == 1 && h == 1) {
299  idx = plr[myplr].HoldItem.IDidx;
300  if (plr[myplr].HoldItem._iStatFlag && AllItemsList[idx].iUsable) {
301  for (i = 0; i < 8 && !done; i++) {
302  if (plr[myplr].SpdList[i]._itype == ITYPE_NONE) {
304  done = TRUE;
305  }
306  }
307  }
308  for (i = 30; i <= 39 && !done; i++) {
309  done = AutoPlace(myplr, i, w, h, TRUE);
310  }
311  for (i = 20; i <= 29 && !done; i++) {
312  done = AutoPlace(myplr, i, w, h, TRUE);
313  }
314  for (i = 10; i <= 19 && !done; i++) {
315  done = AutoPlace(myplr, i, w, h, TRUE);
316  }
317  for (i = 0; i <= 9 && !done; i++) {
318  done = AutoPlace(myplr, i, w, h, TRUE);
319  }
320  }
321  if (w == 1 && h == 2) {
322  for (i = 29; i >= 20 && !done; i--) {
323  done = AutoPlace(myplr, i, w, h, TRUE);
324  }
325  for (i = 9; i >= 0 && !done; i--) {
326  done = AutoPlace(myplr, i, w, h, TRUE);
327  }
328  for (i = 19; i >= 10 && !done; i--) {
329  done = AutoPlace(myplr, i, w, h, TRUE);
330  }
331  }
332  if (w == 1 && h == 3) {
333  for (i = 0; i < 20 && !done; i++) {
334  done = AutoPlace(myplr, i, w, h, TRUE);
335  }
336  }
337  if (w == 2 && h == 2) {
338  for (i = 0; i < 10 && !done; i++) {
339  done = AutoPlace(myplr, AP2x2Tbl[i], w, h, TRUE);
340  }
341  for (i = 21; i < 29 && !done; i += 2) {
342  done = AutoPlace(myplr, i, w, h, TRUE);
343  }
344  for (i = 1; i < 9 && !done; i += 2) {
345  done = AutoPlace(myplr, i, w, h, TRUE);
346  }
347  for (i = 10; i < 19 && !done; i++) {
348  done = AutoPlace(myplr, i, w, h, TRUE);
349  }
350  }
351  if (w == 2 && h == 3) {
352  for (i = 0; i < 9 && !done; i++) {
353  done = AutoPlace(myplr, i, w, h, TRUE);
354  }
355  for (i = 10; i < 19 && !done; i++) {
356  done = AutoPlace(myplr, i, w, h, TRUE);
357  }
358  }
359 }
360 
362 {
363  stextsize = FALSE;
364  stextscrl = FALSE;
365  AddSText(0, 1, TRUE, "Welcome to the", COL_GOLD, FALSE);
366  AddSText(0, 3, TRUE, "Blacksmith's shop", COL_GOLD, FALSE);
367  AddSText(0, 7, TRUE, "Would you like to:", COL_GOLD, FALSE);
368  AddSText(0, 10, TRUE, "Talk to Griswold", COL_BLUE, TRUE);
369  AddSText(0, 12, TRUE, "Buy basic items", COL_WHITE, TRUE);
370  AddSText(0, 14, TRUE, "Buy premium items", COL_WHITE, TRUE);
371  AddSText(0, 16, TRUE, "Sell items", COL_WHITE, TRUE);
372  AddSText(0, 18, TRUE, "Repair items", COL_WHITE, TRUE);
373  AddSText(0, 20, TRUE, "Leave the shop", COL_WHITE, TRUE);
374  AddSLine(5);
375  storenumh = 20;
376 }
377 
378 void S_ScrollSBuy(int idx)
379 {
380  int l, ls;
381  char iclr;
382 
383  ls = idx;
384  ClearSText(5, 21);
385  stextup = 5;
386 
387  for (l = 5; l < 20; l += 4) {
388  if (smithitem[ls]._itype != ITYPE_NONE) {
389  iclr = COL_WHITE;
390  if (smithitem[ls]._iMagical) {
391  iclr = COL_BLUE;
392  }
393 
394  if (!smithitem[ls]._iStatFlag) {
395  iclr = COL_RED;
396  }
397 
398  if (smithitem[ls]._iMagical) {
399  AddSText(20, l, FALSE, smithitem[ls]._iIName, iclr, TRUE);
400  } else {
401  AddSText(20, l, FALSE, smithitem[ls]._iName, iclr, TRUE);
402  }
403 
404  AddSTextVal(l, smithitem[ls]._iIvalue);
405  PrintStoreItem(&smithitem[ls], l + 1, iclr);
406  stextdown = l;
407  ls++;
408  }
409  }
410 
411  if (!stext[stextsel]._ssel && stextsel != 22)
413 }
414 
415 void PrintStoreItem(ItemStruct *x, int l, char iclr)
416 {
417  char sstr[128];
418  char str, dex;
419  BYTE mag;
420 
421  sstr[0] = '\0';
422  if (x->_iIdentified) {
423  if (x->_iMagical != ITEM_QUALITY_UNIQUE) {
424  if (x->_iPrePower != -1) {
425  PrintItemPower(x->_iPrePower, x);
426  strcat(sstr, tempstr);
427  }
428  }
429  if (x->_iSufPower != -1) {
430  PrintItemPower(x->_iSufPower, x);
431  if (sstr[0])
432  strcat(sstr, ", ");
433  strcat(sstr, tempstr);
434  }
435  }
436  if (x->_iMiscId == IMISC_STAFF && x->_iMaxCharges) {
437  sprintf(tempstr, "Charges: %i/%i", x->_iCharges, x->_iMaxCharges);
438  if (sstr[0])
439  strcat(sstr, ", ");
440  strcat(sstr, tempstr);
441  }
442  if (sstr[0]) {
443  AddSText(40, l, FALSE, sstr, iclr, FALSE);
444  l++;
445  }
446  sstr[0] = '\0';
447  if (x->_iClass == ICLASS_WEAPON)
448  sprintf(sstr, "Damage: %i-%i ", x->_iMinDam, x->_iMaxDam);
449  if (x->_iClass == ICLASS_ARMOR)
450  sprintf(sstr, "Armor: %i ", x->_iAC);
451  if (x->_iMaxDur != DUR_INDESTRUCTIBLE && x->_iMaxDur) {
452  sprintf(tempstr, "Dur: %i/%i, ", x->_iDurability, x->_iMaxDur);
453  strcat(sstr, tempstr);
454  } else {
455  strcat(sstr, "Indestructible, ");
456  }
457  if (x->_itype == ITYPE_MISC)
458  sstr[0] = '\0';
459  str = x->_iMinStr;
460  dex = x->_iMinDex;
461  mag = x->_iMinMag;
462  if (!(str + mag + dex)) {
463  strcat(sstr, "No required attributes");
464  } else {
465  strcpy(tempstr, "Required:");
466  if (x->_iMinStr)
467  sprintf(tempstr, "%s %i Str", tempstr, x->_iMinStr);
468  if (x->_iMinMag)
469  sprintf(tempstr, "%s %i Mag", tempstr, x->_iMinMag);
470  if (x->_iMinDex)
471  sprintf(tempstr, "%s %i Dex", tempstr, x->_iMinDex);
472  strcat(sstr, tempstr);
473  }
474  AddSText(40, l++, FALSE, sstr, iclr, FALSE);
475  if (x->_iMagical == ITEM_QUALITY_UNIQUE) {
476  if (x->_iIdentified)
477  AddSText(40, l, FALSE, "Unique Item", iclr, FALSE);
478  }
479 }
480 
482 {
483  int i;
484 
485  stextsize = TRUE;
486  stextscrl = TRUE;
487  stextsval = 0;
488  sprintf(tempstr, "I have these items for sale : Your gold : %i", plr[myplr]._pGold);
489  AddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);
490  AddSLine(3);
491  AddSLine(21);
493  AddSText(0, 22, TRUE, "Back", COL_WHITE, FALSE);
494  OffsetSTextY(22, 6);
495  storenumh = 0;
496  for (i = 0; smithitem[i]._itype != ITYPE_NONE; i++) {
497  storenumh++;
498  }
499 
500  stextsmax = storenumh - 4;
501  if (stextsmax < 0)
502  stextsmax = 0;
503 }
504 
505 void S_ScrollSPBuy(int idx)
506 {
507  int l, boughtitems;
508  char iclr;
509 
510  ClearSText(5, 21);
511  boughtitems = idx;
512 
513  stextup = 5;
514  for (idx = 0; boughtitems; idx++) {
515  if (premiumitem[idx]._itype != ITYPE_NONE)
516  boughtitems--;
517  }
518 
519  for (l = 5; l < 20 && idx < 6; l += 4) {
520  if (premiumitem[idx]._itype != ITYPE_NONE) {
521  iclr = COL_WHITE;
522  if (premiumitem[idx]._iMagical)
523  iclr = COL_BLUE;
524  if (!premiumitem[idx]._iStatFlag)
525  iclr = COL_RED;
526  AddSText(20, l, FALSE, premiumitem[idx]._iIName, iclr, TRUE);
527  AddSTextVal(l, premiumitem[idx]._iIvalue);
528  PrintStoreItem(&premiumitem[idx], l + 1, iclr);
529  stextdown = l;
530  } else {
531  l -= 4;
532  }
533  idx++;
534  }
535  if (!stext[stextsel]._ssel && stextsel != 22)
537 }
538 
540 {
541  int i;
542 
543  storenumh = 0;
544  for (i = 0; i < 6; i++) {
545  if (premiumitem[i]._itype != ITYPE_NONE)
546  storenumh++;
547  }
548  if (!storenumh) {
550  stextsel = 14;
551  return FALSE;
552  }
553 
554  stextsize = TRUE;
555  stextscrl = TRUE;
556  stextsval = 0;
557 
558  sprintf(tempstr, "I have these premium items for sale : Your gold : %i", plr[myplr]._pGold);
559  AddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);
560  AddSLine(3);
561  AddSLine(21);
562  AddSText(0, 22, TRUE, "Back", COL_WHITE, FALSE);
563  OffsetSTextY(22, 6);
564 
565  stextsmax = storenumh - 4;
566  if (stextsmax < 0)
567  stextsmax = 0;
568 
570 
571  return TRUE;
572 }
573 
574 BOOL SmithSellOk(int i)
575 {
576  if (plr[myplr].InvList[i]._itype == ITYPE_NONE)
577  return FALSE;
578  if (plr[myplr].InvList[i]._itype == ITYPE_MISC)
579  return FALSE;
580  if (plr[myplr].InvList[i]._itype == ITYPE_GOLD)
581  return FALSE;
582  if (plr[myplr].InvList[i]._itype == ITYPE_MEAT)
583  return FALSE;
584  if (plr[myplr].InvList[i]._itype == ITYPE_STAFF)
585  return FALSE;
586  if (plr[myplr].InvList[i].IDidx == IDI_LAZSTAFF)
587  return FALSE;
588 
589  return TRUE;
590 }
591 
592 void S_ScrollSSell(int idx)
593 {
594  int l;
595  char iclr;
596 
597  ClearSText(5, 21);
598  stextup = 5;
599 
600  for (l = 5; l < 20; l += 4) {
601  if (idx >= storenumh)
602  break;
603  if (storehold[idx]._itype != ITYPE_NONE) {
604  iclr = COL_WHITE;
605  if (storehold[idx]._iMagical) {
606  iclr = COL_BLUE;
607  }
608 
609  if (!storehold[idx]._iStatFlag) {
610  iclr = COL_RED;
611  }
612 
613  if (storehold[idx]._iMagical && storehold[idx]._iIdentified) {
614  AddSText(20, l, FALSE, storehold[idx]._iIName, iclr, TRUE);
615  AddSTextVal(l, storehold[idx]._iIvalue);
616  } else {
617  AddSText(20, l, FALSE, storehold[idx]._iName, iclr, TRUE);
618  AddSTextVal(l, storehold[idx]._ivalue);
619  }
620 
621  PrintStoreItem(&storehold[idx], l + 1, iclr);
622  stextdown = l;
623  }
624  idx++;
625  }
626 
627  stextsmax = storenumh - 4;
628  if (stextsmax < 0)
629  stextsmax = 0;
630 }
631 
633 {
634  int i;
635  BOOL sellok;
636 
637  stextsize = TRUE;
638  sellok = FALSE;
639  storenumh = 0;
640 
641  for (i = 0; i < 48; i++)
642  storehold[i]._itype = ITYPE_NONE;
643 
644  for (i = 0; i < plr[myplr]._pNumInv; i++) {
645  if (SmithSellOk(i)) {
646  sellok = TRUE;
648 
649  if (storehold[storenumh]._iMagical != ITEM_QUALITY_NORMAL && storehold[storenumh]._iIdentified)
651 
652  if (!(storehold[storenumh]._ivalue >>= 2))
654 
656  storehidx[storenumh++] = i;
657  }
658  }
659 
660  if (!sellok) {
661  stextscrl = FALSE;
662  sprintf(tempstr, "You have nothing I want. Your gold : %i", plr[myplr]._pGold);
663  AddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);
664  AddSLine(3);
665  AddSLine(21);
666  AddSText(0, 22, TRUE, "Back", COL_WHITE, TRUE);
667  OffsetSTextY(22, 6);
668  } else {
669  stextscrl = TRUE;
670  stextsval = 0;
672  sprintf(tempstr, "Which item is for sale? Your gold : %i", plr[myplr]._pGold);
673  AddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);
674  AddSLine(3);
675  AddSLine(21);
677  AddSText(0, 22, TRUE, "Back", COL_WHITE, TRUE);
678  OffsetSTextY(22, 6);
679  }
680 }
681 
682 BOOL SmithRepairOk(int i)
683 {
684  if (plr[myplr].InvList[i]._itype == ITYPE_NONE)
685  return FALSE;
686  if (plr[myplr].InvList[i]._itype == ITYPE_MISC)
687  return FALSE;
688  if (plr[myplr].InvList[i]._itype == ITYPE_GOLD)
689  return FALSE;
690  if (plr[myplr].InvList[i]._itype == ITYPE_MEAT)
691  return FALSE;
692  if (plr[myplr].InvList[i]._iDurability == plr[myplr].InvList[i]._iMaxDur)
693  return FALSE;
694 
695  return TRUE;
696 }
697 
699 {
700  BOOL repairok;
701  int i;
702 
703  stextsize = TRUE;
704  repairok = FALSE;
705  storenumh = 0;
706  for (i = 0; i < 48; i++)
707  storehold[i]._itype = ITYPE_NONE;
708  if (plr[myplr].InvBody[INVLOC_HEAD]._itype != ITYPE_NONE && plr[myplr].InvBody[INVLOC_HEAD]._iDurability != plr[myplr].InvBody[INVLOC_HEAD]._iMaxDur) {
709  repairok = TRUE;
710  AddStoreHoldRepair(plr[myplr].InvBody, -1);
711  }
712  if (plr[myplr].InvBody[INVLOC_CHEST]._itype != ITYPE_NONE && plr[myplr].InvBody[INVLOC_CHEST]._iDurability != plr[myplr].InvBody[INVLOC_CHEST]._iMaxDur) {
713  repairok = TRUE;
714  AddStoreHoldRepair(&plr[myplr].InvBody[INVLOC_CHEST], -2);
715  }
716  if (plr[myplr].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE && plr[myplr].InvBody[INVLOC_HAND_LEFT]._iDurability != plr[myplr].InvBody[INVLOC_HAND_LEFT]._iMaxDur) {
717  repairok = TRUE;
719  }
720  if (plr[myplr].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE && plr[myplr].InvBody[INVLOC_HAND_RIGHT]._iDurability != plr[myplr].InvBody[INVLOC_HAND_RIGHT]._iMaxDur) {
721  repairok = TRUE;
723  }
724  for (i = 0; i < plr[myplr]._pNumInv; i++) {
725  if (SmithRepairOk(i)) {
726  repairok = TRUE;
727  AddStoreHoldRepair(&plr[myplr].InvList[i], i);
728  }
729  }
730  if (!repairok) {
731  stextscrl = FALSE;
732  sprintf(tempstr, "You have nothing to repair. Your gold : %i", plr[myplr]._pGold);
733  AddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);
734  AddSLine(3);
735  AddSLine(21);
736  AddSText(0, 22, TRUE, "Back", COL_WHITE, TRUE);
737  OffsetSTextY(22, 6);
738  return;
739  }
740 
741  stextscrl = TRUE;
742  stextsval = 0;
744  sprintf(tempstr, "Repair which item? Your gold : %i", plr[myplr]._pGold);
745  AddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);
746  AddSLine(3);
747  AddSLine(21);
749  AddSText(0, 22, TRUE, "Back", COL_WHITE, TRUE);
750  OffsetSTextY(22, 6);
751 }
752 
754 {
755  ItemStruct *item;
756  int v;
757 
759  storehold[storenumh] = *itm;
761  item->_ivalue = 30 * item->_iIvalue / 100;
762  v = item->_ivalue * (100 * (item->_iMaxDur - item->_iDurability) / item->_iMaxDur) / 100;
763  if (!v) {
765  return;
766  v = 1;
767  }
768  if (v > 1)
769  v >>= 1;
770  item->_iIvalue = v;
771  item->_ivalue = v;
772  storehidx[storenumh] = i;
773  storenumh++;
774 }
775 
777 {
778  stextsize = FALSE;
779  stextscrl = FALSE;
780  AddSText(0, 2, TRUE, "Witch's shack", COL_GOLD, FALSE);
781  AddSText(0, 9, TRUE, "Would you like to:", COL_GOLD, FALSE);
782  AddSText(0, 12, TRUE, "Talk to Adria", COL_BLUE, TRUE);
783  AddSText(0, 14, TRUE, "Buy items", COL_WHITE, TRUE);
784  AddSText(0, 16, TRUE, "Sell items", COL_WHITE, TRUE);
785  AddSText(0, 18, TRUE, "Recharge staves", COL_WHITE, TRUE);
786  AddSText(0, 20, TRUE, "Leave the shack", COL_WHITE, TRUE);
787  AddSLine(5);
788  storenumh = 20;
789 }
790 
791 void S_ScrollWBuy(int idx)
792 {
793  int l, ls;
794  char iclr;
795 
796  ls = idx;
797  ClearSText(5, 21);
798  stextup = 5;
799 
800  for (l = 5; l < 20; l += 4) {
801  if (witchitem[ls]._itype != ITYPE_NONE) {
802  iclr = COL_WHITE;
803  if (witchitem[ls]._iMagical) {
804  iclr = COL_BLUE;
805  }
806 
807  if (!witchitem[ls]._iStatFlag) {
808  iclr = COL_RED;
809  }
810 
811  if (witchitem[ls]._iMagical) {
812  AddSText(20, l, FALSE, witchitem[ls]._iIName, iclr, TRUE);
813  } else {
814  AddSText(20, l, FALSE, witchitem[ls]._iName, iclr, TRUE);
815  }
816 
817  AddSTextVal(l, witchitem[ls]._iIvalue);
818  PrintStoreItem(&witchitem[ls], l + 1, iclr);
819  stextdown = l;
820  ls++;
821  }
822  }
823 
824  if (!stext[stextsel]._ssel && stextsel != 22)
826 }
827 
829 {
830  int i;
831 
832  stextsize = TRUE;
833  stextscrl = TRUE;
834  stextsval = 0;
835  stextsmax = 20;
836  sprintf(tempstr, "I have these items for sale : Your gold : %i", plr[myplr]._pGold);
837  AddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);
838  AddSLine(3);
839  AddSLine(21);
841  AddSText(0, 22, TRUE, "Back", COL_WHITE, FALSE);
842  OffsetSTextY(22, 6);
843 
844  storenumh = 0;
845  for (i = 0; witchitem[i]._itype != ITYPE_NONE; i++) {
846  storenumh++;
847  }
848  stextsmax = storenumh - 4;
849  if (stextsmax < 0)
850  stextsmax = 0;
851 }
852 
853 BOOL WitchSellOk(int i)
854 {
855  BOOL rv;
856  ItemStruct *pI;
857 
858  rv = FALSE;
859 
860  if (i >= 0)
861  pI = &plr[myplr].InvList[i];
862  else
863  pI = &plr[myplr].SpdList[-(i + 1)];
864 
865  if (pI->_itype == ITYPE_MISC)
866  rv = TRUE;
867  if (pI->_itype == ITYPE_STAFF)
868  rv = TRUE;
869  if (pI->IDidx >= IDI_FIRSTQUEST && pI->IDidx <= IDI_LASTQUEST)
870  rv = FALSE;
871  if (pI->IDidx == IDI_LAZSTAFF)
872  rv = FALSE;
873  return rv;
874 }
875 
877 {
878  int i;
879  BOOL sellok;
880 
881  stextsize = TRUE;
882  sellok = FALSE;
883  storenumh = 0;
884 
885  for (i = 0; i < 48; i++)
886  storehold[i]._itype = ITYPE_NONE;
887 
888  for (i = 0; i < plr[myplr]._pNumInv; i++) {
889  if (WitchSellOk(i)) {
890  sellok = TRUE;
892 
893  if (storehold[storenumh]._iMagical != ITEM_QUALITY_NORMAL && storehold[storenumh]._iIdentified)
895 
896  if (!(storehold[storenumh]._ivalue >>= 2))
898 
900  storehidx[storenumh++] = i;
901  }
902  }
903 
904  for (i = 0; i < MAXBELTITEMS; i++) {
905  if (plr[myplr].SpdList[i]._itype != ITYPE_NONE && WitchSellOk(-(i + 1))) {
906  sellok = TRUE;
908 
909  if (storehold[storenumh]._iMagical != ITEM_QUALITY_NORMAL && storehold[storenumh]._iIdentified)
911 
912  if (!(storehold[storenumh]._ivalue >>= 2))
914 
916  storehidx[storenumh++] = -(i + 1);
917  }
918  }
919 
920  if (!sellok) {
921  stextscrl = FALSE;
922  sprintf(tempstr, "You have nothing I want. Your gold : %i", plr[myplr]._pGold);
923  AddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);
924  AddSLine(3);
925  AddSLine(21);
926  AddSText(0, 22, TRUE, "Back", COL_WHITE, TRUE);
927  OffsetSTextY(22, 6);
928  } else {
929  stextscrl = TRUE;
930  stextsval = 0;
932  sprintf(tempstr, "Which item is for sale? Your gold : %i", plr[myplr]._pGold);
933  AddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);
934  AddSLine(3);
935  AddSLine(21);
937  AddSText(0, 22, TRUE, "Back", COL_WHITE, TRUE);
938  OffsetSTextY(22, 6);
939  }
940 }
941 
942 BOOL WitchRechargeOk(int i)
943 {
944  BOOL rv;
945 
946  rv = FALSE;
947  if (plr[myplr].InvList[i]._itype == ITYPE_STAFF
948  && plr[myplr].InvList[i]._iCharges != plr[myplr].InvList[i]._iMaxCharges) {
949  rv = TRUE;
950  }
951  return rv;
952 }
953 
955 {
956  storehold[storenumh] = itm;
960  storehidx[storenumh] = i;
961  storenumh++;
962 }
963 
965 {
966  int i;
967  BOOL rechargeok;
968 
969  stextsize = TRUE;
970  rechargeok = FALSE;
971  storenumh = 0;
972 
973  for (i = 0; i < 48; i++) {
975  }
976 
977  if (plr[myplr].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_STAFF
978  && plr[myplr].InvBody[INVLOC_HAND_LEFT]._iCharges != plr[myplr].InvBody[INVLOC_HAND_LEFT]._iMaxCharges) {
979  rechargeok = TRUE;
981  }
982 
983  for (i = 0; i < plr[myplr]._pNumInv; i++) {
984  if (WitchRechargeOk(i)) {
985  rechargeok = TRUE;
986  AddStoreHoldRecharge(plr[myplr].InvList[i], i);
987  }
988  }
989 
990  if (!rechargeok) {
991  stextscrl = FALSE;
992  sprintf(tempstr, "You have nothing to recharge. Your gold : %i", plr[myplr]._pGold);
993  AddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);
994  AddSLine(3);
995  AddSLine(21);
996  AddSText(0, 22, TRUE, "Back", COL_WHITE, TRUE);
997  OffsetSTextY(22, 6);
998  } else {
999  stextscrl = TRUE;
1000  stextsval = 0;
1002  sprintf(tempstr, "Recharge which item? Your gold : %i", plr[myplr]._pGold);
1003  AddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);
1004  AddSLine(3);
1005  AddSLine(21);
1007  AddSText(0, 22, TRUE, "Back", COL_WHITE, TRUE);
1008  OffsetSTextY(22, 6);
1009  }
1010 }
1011 
1013 {
1015  stextscrl = FALSE;
1016  stextsize = TRUE;
1017  ClearSText(5, 23);
1018  AddSText(0, 14, TRUE, "You do not have enough gold", COL_WHITE, TRUE);
1019 }
1020 
1022 {
1024  stextscrl = FALSE;
1025  ClearSText(5, 23);
1026  AddSText(0, 14, TRUE, "You do not have enough room in inventory", COL_WHITE, TRUE);
1027 }
1028 
1030 {
1031  BOOL idprint;
1032  char iclr;
1033 
1035  stextscrl = FALSE;
1036  ClearSText(5, 23);
1037  iclr = COL_WHITE;
1038 
1039  if (plr[myplr].HoldItem._iMagical != ITEM_QUALITY_NORMAL)
1040  iclr = COL_BLUE;
1041  if (!plr[myplr].HoldItem._iStatFlag)
1042  iclr = COL_RED;
1043 
1045 
1046  if (stextshold == STORE_SIDENTIFY)
1047  idprint = FALSE;
1048  if (plr[myplr].HoldItem._iMagical != ITEM_QUALITY_NORMAL && !plr[myplr].HoldItem._iIdentified) {
1049  if (stextshold == STORE_SSELL)
1050  idprint = FALSE;
1051  if (stextshold == STORE_WSELL)
1052  idprint = FALSE;
1053  if (stextshold == STORE_SREPAIR)
1054  idprint = FALSE;
1055  if (stextshold == STORE_WRECHARGE)
1056  idprint = FALSE;
1057  }
1058  if (idprint)
1059  AddSText(20, 8, FALSE, plr[myplr].HoldItem._iIName, iclr, FALSE);
1060  else
1061  AddSText(20, 8, FALSE, plr[myplr].HoldItem._iName, iclr, FALSE);
1062 
1063  AddSTextVal(8, plr[myplr].HoldItem._iIvalue);
1064  PrintStoreItem(&plr[myplr].HoldItem, 9, iclr);
1065 
1066  switch (stextshold) {
1067  case STORE_BBOY:
1068  strcpy(tempstr, "Do we have a deal?");
1069  break;
1070  case STORE_SIDENTIFY:
1071  strcpy(tempstr, "Are you sure you want to identify this item?");
1072  break;
1073  case STORE_HBUY:
1074  case STORE_SPBUY:
1075  case STORE_WBUY:
1076  case STORE_SBUY:
1077  strcpy(tempstr, "Are you sure you want to buy this item?");
1078  break;
1079  case STORE_WRECHARGE:
1080  strcpy(tempstr, "Are you sure you want to recharge this item?");
1081  break;
1082  case STORE_SSELL:
1083  case STORE_WSELL:
1084  strcpy(tempstr, "Are you sure you want to sell this item?");
1085  break;
1086  case STORE_SREPAIR:
1087  strcpy(tempstr, "Are you sure you want to repair this item?");
1088  break;
1089  }
1090  AddSText(0, 15, TRUE, tempstr, COL_WHITE, FALSE);
1091  AddSText(0, 18, TRUE, "Yes", COL_WHITE, TRUE);
1092  AddSText(0, 20, TRUE, "No", COL_WHITE, TRUE);
1093 }
1094 
1096 {
1097  stextsize = FALSE;
1098  stextscrl = FALSE;
1099  AddSText(0, 2, TRUE, "Wirt the Peg-legged boy", COL_GOLD, FALSE);
1100  AddSLine(5);
1101  if (boyitem._itype != ITYPE_NONE) {
1102  AddSText(0, 8, TRUE, "Talk to Wirt", COL_BLUE, TRUE);
1103  AddSText(0, 12, TRUE, "I have something for sale,", COL_GOLD, FALSE);
1104  AddSText(0, 14, TRUE, "but it will cost 50 gold", COL_GOLD, FALSE);
1105  AddSText(0, 16, TRUE, "just to take a look. ", COL_GOLD, FALSE);
1106  AddSText(0, 18, TRUE, "What have you got?", COL_WHITE, TRUE);
1107  AddSText(0, 20, TRUE, "Say goodbye", COL_WHITE, TRUE);
1108  } else {
1109  AddSText(0, 12, TRUE, "Talk to Wirt", COL_BLUE, TRUE);
1110  AddSText(0, 18, TRUE, "Say goodbye", COL_WHITE, TRUE);
1111  }
1112 }
1113 
1115 {
1116  int iclr;
1117 
1118  stextsize = TRUE;
1119  stextscrl = FALSE;
1120  sprintf(tempstr, "I have this item for sale : Your gold : %i", plr[myplr]._pGold);
1121  AddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);
1122  AddSLine(3);
1123  AddSLine(21);
1124  iclr = COL_WHITE;
1125 
1127  iclr = COL_BLUE;
1128  if (!boyitem._iStatFlag)
1129  iclr = COL_RED;
1131  AddSText(20, 10, FALSE, boyitem._iIName, iclr, TRUE);
1132  else
1133  AddSText(20, 10, FALSE, boyitem._iName, iclr, TRUE);
1134 
1136  PrintStoreItem(&boyitem, 11, iclr);
1137  AddSText(0, 22, TRUE, "Leave", COL_WHITE, TRUE);
1138  OffsetSTextY(22, 6);
1139 }
1140 
1142 {
1143  stextsize = FALSE;
1144  stextscrl = FALSE;
1145  AddSText(0, 1, TRUE, "Welcome to the", COL_GOLD, FALSE);
1146  AddSText(0, 3, TRUE, "Healer's home", COL_GOLD, FALSE);
1147  AddSText(0, 9, TRUE, "Would you like to:", COL_GOLD, FALSE);
1148  AddSText(0, 12, TRUE, "Talk to Pepin", COL_BLUE, TRUE);
1149  AddSText(0, 14, TRUE, "Receive healing", COL_WHITE, TRUE);
1150  AddSText(0, 16, TRUE, "Buy items", COL_WHITE, TRUE);
1151  AddSText(0, 18, TRUE, "Leave Healer's home", COL_WHITE, TRUE);
1152  AddSLine(5);
1153  storenumh = 20;
1154 }
1155 
1156 void S_ScrollHBuy(int idx)
1157 {
1158  int l;
1159  char iclr;
1160 
1161  ClearSText(5, 21);
1162  stextup = 5;
1163  for (l = 5; l < 20; l += 4) {
1164  if (healitem[idx]._itype != ITYPE_NONE) {
1165  iclr = COL_WHITE;
1166  if (!healitem[idx]._iStatFlag) {
1167  iclr = COL_RED;
1168  }
1169 
1170  AddSText(20, l, FALSE, healitem[idx]._iName, iclr, TRUE);
1171  AddSTextVal(l, healitem[idx]._iIvalue);
1172  PrintStoreItem(&healitem[idx], l + 1, iclr);
1173  stextdown = l;
1174  idx++;
1175  }
1176  }
1177 
1178  if (!stext[stextsel]._ssel && stextsel != 22)
1179  stextsel = stextdown;
1180 }
1181 
1183 {
1184  int i;
1185 
1186  stextsize = TRUE;
1187  stextscrl = TRUE;
1188  stextsval = 0;
1189  sprintf(tempstr, "I have these items for sale : Your gold : %i", plr[myplr]._pGold);
1190  AddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);
1191  AddSLine(3);
1192  AddSLine(21);
1194  AddSText(0, 22, TRUE, "Back", COL_WHITE, FALSE);
1195  OffsetSTextY(22, 6);
1196 
1197  storenumh = 0;
1198  for (i = 0; healitem[i]._itype != ITYPE_NONE; i++) {
1199  storenumh++;
1200  }
1201  stextsmax = storenumh - 4;
1202  if (stextsmax < 0)
1203  stextsmax = 0;
1204 }
1205 
1207 {
1208  stextsize = FALSE;
1209  stextscrl = FALSE;
1210  AddSText(0, 2, TRUE, "The Town Elder", COL_GOLD, FALSE);
1211  AddSText(0, 9, TRUE, "Would you like to:", COL_GOLD, FALSE);
1212  AddSText(0, 12, TRUE, "Talk to Cain", COL_BLUE, TRUE);
1213  AddSText(0, 14, TRUE, "Identify an item", COL_WHITE, TRUE);
1214  AddSText(0, 18, TRUE, "Say goodbye", COL_WHITE, TRUE);
1215  AddSLine(5);
1216 }
1217 
1219 {
1220  if (i->_itype == ITYPE_NONE) {
1221  return FALSE;
1222  }
1223  if (i->_iMagical == ITEM_QUALITY_NORMAL) {
1224  return FALSE;
1225  }
1226  return !i->_iIdentified;
1227 }
1228 
1229 void AddStoreHoldId(ItemStruct itm, int i)
1230 {
1231  storehold[storenumh] = itm;
1232  storehold[storenumh]._ivalue = 100;
1233  storehold[storenumh]._iIvalue = 100;
1234  storehidx[storenumh] = i;
1235  storenumh++;
1236 }
1237 
1239 {
1240  BOOL idok;
1241  int i;
1242 
1243  idok = FALSE;
1244  stextsize = TRUE;
1245  storenumh = 0;
1246 
1247  for (i = 0; i < 48; i++)
1248  storehold[i]._itype = ITYPE_NONE;
1249 
1250  if (IdItemOk(&plr[myplr].InvBody[INVLOC_HEAD])) {
1251  idok = TRUE;
1252  AddStoreHoldId(plr[myplr].InvBody[INVLOC_HEAD], -1);
1253  }
1254  if (IdItemOk(&plr[myplr].InvBody[INVLOC_CHEST])) {
1255  idok = TRUE;
1256  AddStoreHoldId(plr[myplr].InvBody[INVLOC_CHEST], -2);
1257  }
1258  if (IdItemOk(&plr[myplr].InvBody[INVLOC_HAND_LEFT])) {
1259  idok = TRUE;
1260  AddStoreHoldId(plr[myplr].InvBody[INVLOC_HAND_LEFT], -3);
1261  }
1262  if (IdItemOk(&plr[myplr].InvBody[INVLOC_HAND_RIGHT])) {
1263  idok = TRUE;
1264  AddStoreHoldId(plr[myplr].InvBody[INVLOC_HAND_RIGHT], -4);
1265  }
1266  if (IdItemOk(&plr[myplr].InvBody[INVLOC_RING_LEFT])) {
1267  idok = TRUE;
1268  AddStoreHoldId(plr[myplr].InvBody[INVLOC_RING_LEFT], -5);
1269  }
1270  if (IdItemOk(&plr[myplr].InvBody[INVLOC_RING_RIGHT])) {
1271  idok = TRUE;
1272  AddStoreHoldId(plr[myplr].InvBody[INVLOC_RING_RIGHT], -6);
1273  }
1274  if (IdItemOk(&plr[myplr].InvBody[INVLOC_AMULET])) {
1275  idok = TRUE;
1276  AddStoreHoldId(plr[myplr].InvBody[INVLOC_AMULET], -7);
1277  }
1278 
1279  for (i = 0; i < plr[myplr]._pNumInv; i++) {
1280  if (IdItemOk(&plr[myplr].InvList[i])) {
1281  idok = TRUE;
1282  AddStoreHoldId(plr[myplr].InvList[i], i);
1283  }
1284  }
1285 
1286  if (!idok) {
1287  stextscrl = FALSE;
1288  sprintf(tempstr, "You have nothing to identify. Your gold : %i", plr[myplr]._pGold);
1289  AddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);
1290  AddSLine(3);
1291  AddSLine(21);
1292  AddSText(0, 22, TRUE, "Back", COL_WHITE, TRUE);
1293  OffsetSTextY(22, 6);
1294  } else {
1295  stextscrl = TRUE;
1296  stextsval = 0;
1298  sprintf(tempstr, "Identify which item? Your gold : %i", plr[myplr]._pGold);
1299  AddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);
1300  AddSLine(3);
1301  AddSLine(21);
1303  AddSText(0, 22, TRUE, "Back", COL_WHITE, TRUE);
1304  OffsetSTextY(22, 6);
1305  }
1306 }
1307 
1309 {
1310  char iclr;
1311 
1313  stextscrl = FALSE;
1314  ClearSText(5, 23);
1315  iclr = COL_WHITE;
1316 
1317  if (plr[myplr].HoldItem._iMagical != ITEM_QUALITY_NORMAL)
1318  iclr = COL_BLUE;
1319  if (!plr[myplr].HoldItem._iStatFlag)
1320  iclr = COL_RED;
1321 
1322  AddSText(0, 7, TRUE, "This item is:", COL_WHITE, FALSE);
1323  AddSText(20, 11, FALSE, plr[myplr].HoldItem._iIName, iclr, FALSE);
1324  PrintStoreItem(&plr[myplr].HoldItem, 12, iclr);
1325  AddSText(0, 18, TRUE, "Done", COL_WHITE, TRUE);
1326 }
1327 
1329 {
1330  int i, sn, sn2, la;
1331 
1332  stextsize = FALSE;
1333  stextscrl = FALSE;
1334  sprintf(tempstr, "Talk to %s", talkname[talker]);
1335  AddSText(0, 2, TRUE, tempstr, COL_GOLD, FALSE);
1336  AddSLine(5);
1337 #ifdef SPAWN
1338  sprintf(tempstr, "Talking to %s", talkname[talker]);
1339  AddSText(0, 10, TRUE, tempstr, COL_WHITE, FALSE);
1340  AddSText(0, 12, TRUE, "is not available", COL_WHITE, FALSE);
1341  AddSText(0, 14, TRUE, "in the shareware", COL_WHITE, FALSE);
1342  AddSText(0, 16, TRUE, "version", COL_WHITE, FALSE);
1343 #else
1344  sn = 0;
1345  for (i = 0; i < MAXQUESTS; i++) {
1346  if (quests[i]._qactive == QUEST_ACTIVE && ((DWORD *)&Qtalklist[talker])[i] != -1 && quests[i]._qlog)
1347  sn++;
1348  }
1349 
1350  if (sn > 6) {
1351  sn = 14 - (sn >> 1);
1352  la = 1;
1353  } else {
1354  sn = 15 - sn;
1355  la = 2;
1356  }
1357 
1358  sn2 = sn - 2;
1359 
1360  for (i = 0; i < MAXQUESTS; i++) {
1361  if (quests[i]._qactive == QUEST_ACTIVE && ((DWORD *)&Qtalklist[talker])[i] != -1 && quests[i]._qlog) {
1362  AddSText(0, sn, TRUE, questlist[i]._qlstr, COL_WHITE, TRUE);
1363  sn += la;
1364  }
1365  }
1366  AddSText(0, sn2, TRUE, "Gossip", COL_BLUE, TRUE);
1367 #endif
1368  AddSText(0, 22, TRUE, "Back", COL_WHITE, TRUE);
1369 }
1370 
1372 {
1373  stextsize = FALSE;
1374  stextscrl = FALSE;
1375  AddSText(0, 1, TRUE, "Welcome to the", COL_GOLD, FALSE);
1376  AddSText(0, 3, TRUE, "Rising Sun", COL_GOLD, FALSE);
1377  AddSText(0, 9, TRUE, "Would you like to:", COL_GOLD, FALSE);
1378  AddSText(0, 12, TRUE, "Talk to Ogden", COL_BLUE, TRUE);
1379  AddSText(0, 18, TRUE, "Leave the tavern", COL_WHITE, TRUE);
1380  AddSLine(5);
1381  storenumh = 20;
1382 }
1383 
1385 {
1386  stextsize = FALSE;
1387  stextscrl = FALSE;
1388  AddSText(0, 2, TRUE, "Gillian", COL_GOLD, FALSE);
1389  AddSText(0, 9, TRUE, "Would you like to:", COL_GOLD, FALSE);
1390  AddSText(0, 12, TRUE, "Talk to Gillian", COL_BLUE, TRUE);
1391  AddSText(0, 18, TRUE, "Say goodbye", COL_WHITE, TRUE);
1392  AddSLine(5);
1393  storenumh = 20;
1394 }
1395 
1397 {
1398  stextsize = FALSE;
1399  stextscrl = FALSE;
1400  AddSText(0, 2, TRUE, "Farnham the Drunk", COL_GOLD, FALSE);
1401  AddSText(0, 9, TRUE, "Would you like to:", COL_GOLD, FALSE);
1402  AddSText(0, 12, TRUE, "Talk to Farnham", COL_BLUE, TRUE);
1403  AddSText(0, 18, TRUE, "Say Goodbye", COL_WHITE, TRUE);
1404  AddSLine(5);
1405  storenumh = 20;
1406 }
1407 
1408 void StartStore(char s)
1409 {
1410  char t;
1411  int i;
1412 
1413  for (t = s;; t = STORE_SMITH) {
1414  sbookflag = FALSE;
1415  invflag = FALSE;
1416  chrflag = FALSE;
1417  questlog = FALSE;
1418  dropGoldFlag = FALSE;
1419  ClearSText(0, 24);
1420  ReleaseStoreBtn();
1421  switch (t) {
1422  case STORE_SMITH:
1423  S_StartSmith();
1424  break;
1425  case STORE_SBUY:
1426  if (storenumh > 0)
1427  S_StartSBuy();
1428  break;
1429  case STORE_SSELL:
1430  S_StartSSell();
1431  break;
1432  case STORE_SREPAIR:
1433  S_StartSRepair();
1434  break;
1435  case STORE_WITCH:
1436  S_StartWitch();
1437  break;
1438  case STORE_WBUY:
1439  if (storenumh > 0)
1440  S_StartWBuy();
1441  break;
1442  case STORE_WSELL:
1443  S_StartWSell();
1444  break;
1445  case STORE_WRECHARGE:
1446  S_StartWRecharge();
1447  break;
1448  case STORE_NOMONEY:
1449  S_StartNoMoney();
1450  break;
1451  case STORE_NOROOM:
1452  S_StartNoRoom();
1453  break;
1454  case STORE_CONFIRM:
1455  S_StartConfirm();
1456  break;
1457  case STORE_BOY:
1458  S_StartBoy();
1459  break;
1460  case STORE_BBOY:
1461  S_StartBBoy();
1462  break;
1463  case STORE_HEALER:
1464  S_StartHealer();
1465  break;
1466  case STORE_STORY:
1467  S_StartStory();
1468  break;
1469  case STORE_HBUY:
1470  if (storenumh > 0)
1471  S_StartHBuy();
1472  break;
1473  case STORE_SIDENTIFY:
1474  S_StartSIdentify();
1475  break;
1476  case STORE_SPBUY:
1477  if (!S_StartSPBuy())
1478  return;
1479  break;
1480  case STORE_GOSSIP:
1481  S_StartTalk();
1482  break;
1483  case STORE_IDSHOW:
1484  S_StartIdShow();
1485  break;
1486  case STORE_TAVERN:
1487  S_StartTavern();
1488  break;
1489  case STORE_DRUNK:
1490  S_StartDrunk();
1491  break;
1492  case STORE_BARMAID:
1493  S_StartBarMaid();
1494  break;
1495  }
1496 
1497  for (i = 0; i < 24; i++) {
1498  if (stext[i]._ssel)
1499  break;
1500  }
1501 
1502  stextsel = i == 24 ? -1 : i;
1503  stextflag = t;
1504  if (t != STORE_SBUY || storenumh)
1505  break;
1506  }
1507 }
1508 
1510 {
1511  int i;
1512 
1513  if (!stextsize)
1514  DrawSTextBack();
1515  else
1516  DrawQTextBack();
1517 
1518  if (stextscrl) {
1519  switch (stextflag) {
1520  case STORE_SBUY:
1522  break;
1523  case STORE_SSELL:
1524  case STORE_SREPAIR:
1525  case STORE_WSELL:
1526  case STORE_WRECHARGE:
1527  case STORE_SIDENTIFY:
1529  break;
1530  case STORE_WBUY:
1532  break;
1533  case STORE_HBUY:
1535  break;
1536  case STORE_SPBUY:
1538  break;
1539  }
1540  }
1541 
1542  for (i = 0; i < 24; i++) {
1543  if (stext[i]._sline)
1544  DrawSLine(i);
1545  if (stext[i]._sstr[0])
1546  PrintSString(stext[i]._sx, i, stext[i]._sjust, stext[i]._sstr, stext[i]._sclr, stext[i]._sval);
1547  }
1548 
1549  if (stextscrl)
1550  DrawSSlider(4, 20);
1551 
1552  PentSpn2Spin();
1553 }
1554 
1555 void STextESC()
1556 {
1557  if (qtextflag) {
1558  qtextflag = FALSE;
1559  if (leveltype == DTYPE_TOWN)
1560  stream_stop();
1561  } else {
1562  switch (stextflag) {
1563  case STORE_SMITH:
1564  case STORE_WITCH:
1565  case STORE_BOY:
1566  case STORE_BBOY:
1567  case STORE_HEALER:
1568  case STORE_STORY:
1569  case STORE_TAVERN:
1570  case STORE_DRUNK:
1571  case STORE_BARMAID:
1573  break;
1574  case STORE_GOSSIP:
1576  stextsel = stextlhold;
1577  break;
1578  case STORE_SBUY:
1580  stextsel = 12;
1581  break;
1582  case STORE_SPBUY:
1584  stextsel = 14;
1585  break;
1586  case STORE_SSELL:
1588  stextsel = 16;
1589  break;
1590  case STORE_SREPAIR:
1592  stextsel = 18;
1593  break;
1594  case STORE_WBUY:
1596  stextsel = 14;
1597  break;
1598  case STORE_WSELL:
1600  stextsel = 16;
1601  break;
1602  case STORE_WRECHARGE:
1604  stextsel = 18;
1605  break;
1606  case STORE_HBUY:
1608  stextsel = 16;
1609  break;
1610  case STORE_SIDENTIFY:
1612  stextsel = 14;
1613  break;
1614  case STORE_IDSHOW:
1616  break;
1617  case STORE_NOMONEY:
1618  case STORE_NOROOM:
1619  case STORE_CONFIRM:
1621  stextsel = stextlhold;
1623  break;
1624  }
1625  }
1626 }
1627 
1628 void STextUp()
1629 {
1631  if (stextsel == -1) {
1632  return;
1633  }
1634 
1635  if (stextscrl) {
1636  if (stextsel == stextup) {
1637  if (stextsval)
1638  stextsval--;
1639  return;
1640  }
1641 
1642  stextsel--;
1643  while (!stext[stextsel]._ssel) {
1644  if (!stextsel)
1645  stextsel = 23;
1646  else
1647  stextsel--;
1648  }
1649  return;
1650  }
1651 
1652  if (!stextsel)
1653  stextsel = 23;
1654  else
1655  stextsel--;
1656 
1657  while (!stext[stextsel]._ssel) {
1658  if (!stextsel)
1659  stextsel = 23;
1660  else
1661  stextsel--;
1662  }
1663 }
1664 
1666 {
1668  if (stextsel == -1) {
1669  return;
1670  }
1671 
1672  if (stextscrl) {
1673  if (stextsel == stextdown) {
1674  if (stextsval < stextsmax)
1675  stextsval++;
1676  return;
1677  }
1678 
1679  stextsel++;
1680  while (!stext[stextsel]._ssel) {
1681  if (stextsel == 23)
1682  stextsel = 0;
1683  else
1684  stextsel++;
1685  }
1686  return;
1687  }
1688 
1689  if (stextsel == 23)
1690  stextsel = 0;
1691  else
1692  stextsel++;
1693 
1694  while (!stext[stextsel]._ssel) {
1695  if (stextsel == 23)
1696  stextsel = 0;
1697  else
1698  stextsel++;
1699  }
1700 }
1701 
1703 {
1705  if (stextsel != -1 && stextscrl) {
1706  if (stextsel == stextup) {
1707  if (stextsval)
1708  stextsval -= 4;
1709  stextsval = stextsval;
1710  if (stextsval < 0)
1711  stextsval = 0;
1712  } else {
1713  stextsel = stextup;
1714  }
1715  }
1716 }
1717 
1719 {
1721  if (stextsel != -1 && stextscrl) {
1722  if (stextsel == stextdown) {
1723  if (stextsval < stextsmax)
1724  stextsval += 4;
1725  if (stextsval > stextsmax)
1726  stextsval = stextsmax;
1727  } else {
1728  stextsel = stextdown;
1729  }
1730  }
1731 }
1732 
1734 {
1735  switch (stextsel) {
1736  case 10:
1737  talker = 0;
1738  stextlhold = 10;
1743  break;
1744  case 12:
1746  break;
1747  case 14:
1749  break;
1750  case 16:
1752  break;
1753  case 18:
1755  break;
1756  case 20:
1758  break;
1759  }
1760 }
1761 
1762 void SetGoldCurs(int pnum, int i)
1763 {
1764  if (plr[pnum].InvList[i]._ivalue >= GOLD_MEDIUM_LIMIT)
1765  plr[pnum].InvList[i]._iCurs = ICURS_GOLD_LARGE;
1766  else if (plr[pnum].InvList[i]._ivalue <= GOLD_SMALL_LIMIT)
1767  plr[pnum].InvList[i]._iCurs = ICURS_GOLD_SMALL;
1768  else
1769  plr[pnum].InvList[i]._iCurs = ICURS_GOLD_MEDIUM;
1770 }
1771 
1772 void SetSpdbarGoldCurs(int pnum, int i)
1773 {
1774  if (plr[pnum].SpdList[i]._ivalue >= GOLD_MEDIUM_LIMIT)
1775  plr[pnum].SpdList[i]._iCurs = ICURS_GOLD_LARGE;
1776  else if (plr[pnum].SpdList[i]._ivalue <= GOLD_SMALL_LIMIT)
1777  plr[pnum].SpdList[i]._iCurs = ICURS_GOLD_SMALL;
1778  else
1779  plr[pnum].SpdList[i]._iCurs = ICURS_GOLD_MEDIUM;
1780 }
1781 
1782 void TakePlrsMoney(int cost)
1783 {
1784  int i;
1785 
1786  plr[myplr]._pGold = CalculateGold(myplr) - cost;
1787  for (i = 0; i < MAXBELTITEMS && cost > 0; i++) {
1788  if (plr[myplr].SpdList[i]._itype == ITYPE_GOLD && plr[myplr].SpdList[i]._ivalue != GOLD_MAX_LIMIT) {
1789  if (cost < plr[myplr].SpdList[i]._ivalue) {
1790  plr[myplr].SpdList[i]._ivalue -= cost;
1792  cost = 0;
1793  } else {
1794  cost -= plr[myplr].SpdList[i]._ivalue;
1795  RemoveSpdBarItem(myplr, i);
1796  i = -1;
1797  }
1798  }
1799  }
1800  if (cost > 0) {
1801  for (i = 0; i < MAXBELTITEMS && cost > 0; i++) {
1802  if (plr[myplr].SpdList[i]._itype == ITYPE_GOLD) {
1803  if (cost < plr[myplr].SpdList[i]._ivalue) {
1804  plr[myplr].SpdList[i]._ivalue -= cost;
1806  cost = 0;
1807  } else {
1808  cost -= plr[myplr].SpdList[i]._ivalue;
1809  RemoveSpdBarItem(myplr, i);
1810  i = -1;
1811  }
1812  }
1813  }
1814  }
1815  force_redraw = 255;
1816  if (cost > 0) {
1817  for (i = 0; i < plr[myplr]._pNumInv && cost > 0; i++) {
1818  if (plr[myplr].InvList[i]._itype == ITYPE_GOLD && plr[myplr].InvList[i]._ivalue != GOLD_MAX_LIMIT) {
1819  if (cost < plr[myplr].InvList[i]._ivalue) {
1820  plr[myplr].InvList[i]._ivalue -= cost;
1821  SetGoldCurs(myplr, i);
1822  cost = 0;
1823  } else {
1824  cost -= plr[myplr].InvList[i]._ivalue;
1825  RemoveInvItem(myplr, i);
1826  i = -1;
1827  }
1828  }
1829  }
1830  if (cost > 0) {
1831  for (i = 0; i < plr[myplr]._pNumInv && cost > 0; i++) {
1832  if (plr[myplr].InvList[i]._itype == ITYPE_GOLD) {
1833  if (cost < plr[myplr].InvList[i]._ivalue) {
1834  plr[myplr].InvList[i]._ivalue -= cost;
1835  SetGoldCurs(myplr, i);
1836  cost = 0;
1837  } else {
1838  cost -= plr[myplr].InvList[i]._ivalue;
1839  RemoveInvItem(myplr, i);
1840  i = -1;
1841  }
1842  }
1843  }
1844  }
1845  }
1846 }
1847 
1849 {
1850  int idx;
1851 
1852  TakePlrsMoney(plr[myplr].HoldItem._iIvalue);
1853  if (plr[myplr].HoldItem._iMagical == ITEM_QUALITY_NORMAL)
1854  plr[myplr].HoldItem._iIdentified = FALSE;
1855  StoreAutoPlace();
1856  idx = stextvhold + ((stextlhold - stextup) >> 2);
1857  if (idx == SMITH_ITEMS - 1) {
1859  } else {
1860  for (; smithitem[idx + 1]._itype != ITYPE_NONE; idx++) {
1861  smithitem[idx] = smithitem[idx + 1];
1862  }
1863  smithitem[idx]._itype = ITYPE_NONE;
1864  }
1865  CalcPlrInv(myplr, TRUE);
1866 }
1867 
1869 {
1870  int idx, i;
1871  BOOL done;
1872 
1873  if (stextsel == 22) {
1875  stextsel = 12;
1876  } else {
1877  stextlhold = stextsel;
1880  idx = stextsval + ((stextsel - stextup) >> 2);
1881  if (plr[myplr]._pGold < smithitem[idx]._iIvalue) {
1883  } else {
1884  plr[myplr].HoldItem = smithitem[idx];
1885  SetCursor_(plr[myplr].HoldItem._iCurs + CURSOR_FIRSTITEM);
1886  done = FALSE;
1887 
1888  for (i = 0; i < 40 && !done; i++) {
1889  done = AutoPlace(myplr, i, cursW / 28, cursH / 28, FALSE);
1890  }
1891  if (done)
1893  else
1896  }
1897  }
1898 }
1899 
1901 {
1902  int i, xx, idx;
1903 
1904  TakePlrsMoney(plr[myplr].HoldItem._iIvalue);
1905  if (plr[myplr].HoldItem._iMagical == ITEM_QUALITY_NORMAL)
1906  plr[myplr].HoldItem._iIdentified = FALSE;
1907  StoreAutoPlace();
1908 
1909  idx = stextvhold + ((stextlhold - stextup) >> 2);
1910  xx = 0;
1911  for (i = 0; idx >= 0; i++) {
1912  if (premiumitem[i]._itype != ITYPE_NONE) {
1913  idx--;
1914  xx = i;
1915  }
1916  }
1917 
1919  numpremium--;
1920  SpawnPremium(plr[myplr]._pLevel);
1921 }
1922 
1924 {
1925  int i, idx, xx;
1926  BOOL done;
1927 
1928  if (stextsel == 22) {
1930  stextsel = 14;
1931  } else {
1933  stextlhold = stextsel;
1935  xx = stextsval + ((stextsel - stextup) >> 2);
1936  idx = 0;
1937  for (i = 0; xx >= 0; i++) {
1938  if (premiumitem[i]._itype != ITYPE_NONE) {
1939  xx--;
1940  idx = i;
1941  }
1942  }
1943  if (plr[myplr]._pGold < premiumitem[idx]._iIvalue) {
1945  } else {
1946  plr[myplr].HoldItem = premiumitem[idx];
1947  SetCursor_(plr[myplr].HoldItem._iCurs + CURSOR_FIRSTITEM);
1948  done = FALSE;
1949  for (i = 0; i < 40 && !done; i++) {
1950  done = AutoPlace(myplr, i, cursW / 28, cursH / 28, FALSE);
1951  }
1952  if (done)
1954  else
1957  }
1958  }
1959 }
1960 
1961 BOOL StoreGoldFit(int idx)
1962 {
1963  int i, sz, cost, numsqrs;
1964 
1965  cost = storehold[idx]._iIvalue;
1966  sz = cost / GOLD_MAX_LIMIT;
1967  if (cost % GOLD_MAX_LIMIT)
1968  sz++;
1969 
1970  SetCursor_(storehold[idx]._iCurs + CURSOR_FIRSTITEM);
1971  numsqrs = cursW / 28 * (cursH / 28);
1973 
1974  if (numsqrs >= sz)
1975  return TRUE;
1976 
1977  for (i = 0; i < 40; i++) {
1978  if (!plr[myplr].InvGrid[i])
1979  numsqrs++;
1980  }
1981 
1982  for (i = 0; i < plr[myplr]._pNumInv; i++) {
1983  if (plr[myplr].InvList[i]._itype == ITYPE_GOLD && plr[myplr].InvList[i]._ivalue != GOLD_MAX_LIMIT) {
1984  if (cost + plr[myplr].InvList[i]._ivalue <= GOLD_MAX_LIMIT)
1985  cost = 0;
1986  else
1987  cost -= GOLD_MAX_LIMIT - plr[myplr].InvList[i]._ivalue;
1988  }
1989  }
1990 
1991  sz = cost / GOLD_MAX_LIMIT;
1992  if (cost % GOLD_MAX_LIMIT)
1993  sz++;
1994 
1995  return numsqrs >= sz;
1996 }
1997 
1998 void PlaceStoreGold(int v)
1999 {
2000  BOOL done;
2001  int ii, xx, yy, i;
2002 
2003  done = FALSE;
2004 
2005  for (i = 0; i < 40 && !done; i++) {
2006  yy = 10 * (i / 10);
2007  xx = i % 10;
2008  if (!plr[myplr].InvGrid[xx + yy]) {
2009  ii = plr[myplr]._pNumInv;
2011  plr[myplr].InvList[ii] = golditem;
2012  plr[myplr]._pNumInv++;
2013  plr[myplr].InvGrid[xx + yy] = plr[myplr]._pNumInv;
2014  plr[myplr].InvList[ii]._ivalue = v;
2015  SetGoldCurs(myplr, ii);
2016  done = TRUE;
2017  }
2018  }
2019 }
2020 
2022 {
2023  int i, idx, cost;
2024 
2025  idx = stextvhold + ((stextlhold - stextup) >> 2);
2026  if (storehidx[idx] >= 0)
2027  RemoveInvItem(myplr, storehidx[idx]);
2028  else
2029  RemoveSpdBarItem(myplr, -(storehidx[idx] + 1));
2030  cost = storehold[idx]._iIvalue;
2031  storenumh--;
2032  if (idx != storenumh) {
2033  while (idx < storenumh) {
2034  storehold[idx] = storehold[idx + 1];
2035  storehidx[idx] = storehidx[idx + 1];
2036  idx++;
2037  }
2038  }
2039  plr[myplr]._pGold += cost;
2040  for (i = 0; i < plr[myplr]._pNumInv && cost > 0; i++) {
2041  if (plr[myplr].InvList[i]._itype == ITYPE_GOLD && plr[myplr].InvList[i]._ivalue != GOLD_MAX_LIMIT) {
2042  if (cost + plr[myplr].InvList[i]._ivalue <= GOLD_MAX_LIMIT) {
2043  plr[myplr].InvList[i]._ivalue += cost;
2044  SetGoldCurs(myplr, i);
2045  cost = 0;
2046  } else {
2047  cost -= GOLD_MAX_LIMIT - plr[myplr].InvList[i]._ivalue;
2049  SetGoldCurs(myplr, i);
2050  }
2051  }
2052  }
2053  if (cost > 0) {
2054  while (cost > GOLD_MAX_LIMIT) {
2056  cost -= GOLD_MAX_LIMIT;
2057  }
2058  PlaceStoreGold(cost);
2059  }
2060 }
2061 
2063 {
2064  int idx;
2065 
2066  if (stextsel == 22) {
2068  stextsel = 16;
2069  } else {
2070  stextlhold = stextsel;
2071  idx = stextsval + ((stextsel - stextup) >> 2);
2074  plr[myplr].HoldItem = storehold[idx];
2075 
2076  if (StoreGoldFit(idx))
2078  else
2080  }
2081 }
2082 
2084 {
2085  int i, idx;
2086 
2087  TakePlrsMoney(plr[myplr].HoldItem._iIvalue);
2088 
2089  idx = stextvhold + ((stextlhold - stextup) >> 2);
2091 
2092  i = storehidx[idx];
2093  if (i < 0) {
2094  if (i == -1)
2096  if (i == -2)
2098  if (i == -3)
2100  if (i == -4)
2102  } else {
2104  }
2105 }
2106 
2108 {
2109  int idx;
2110 
2111  if (stextsel == 22) {
2113  stextsel = 18;
2114  } else {
2116  stextlhold = stextsel;
2118  idx = stextsval + ((stextsel - stextup) >> 2);
2119  plr[myplr].HoldItem = storehold[idx];
2120  if (plr[myplr]._pGold < storehold[idx]._iIvalue)
2122  else
2124  }
2125 }
2126 
2128 {
2129  switch (stextsel) {
2130  case 12:
2131  stextlhold = 12;
2132  talker = 6;
2137  return;
2138  case 14:
2140  return;
2141  case 16:
2143  return;
2144  case 18:
2146  return;
2147  case 20:
2149  break;
2150  }
2151 }
2152 
2154 {
2155  int idx;
2156 
2157  idx = stextvhold + ((stextlhold - stextup) >> 2);
2158 
2159  if (idx < 3)
2161 
2162  TakePlrsMoney(plr[myplr].HoldItem._iIvalue);
2163  StoreAutoPlace();
2164 
2165  if (idx >= 3) {
2166  if (idx == 19) {
2167  witchitem[19]._itype = ITYPE_NONE;
2168  } else {
2169  for (; witchitem[idx + 1]._itype != ITYPE_NONE; idx++) {
2170  witchitem[idx] = witchitem[idx + 1];
2171  }
2172  witchitem[idx]._itype = ITYPE_NONE;
2173  }
2174  }
2175 
2176  CalcPlrInv(myplr, TRUE);
2177 }
2178 
2180 {
2181  int i, idx;
2182  BOOL done;
2183 
2184  if (stextsel == 22) {
2186  stextsel = 14;
2187  } else {
2188  stextlhold = stextsel;
2191  idx = stextsval + ((stextsel - stextup) >> 2);
2192 
2193  if (plr[myplr]._pGold < witchitem[idx]._iIvalue) {
2195  } else {
2196  plr[myplr].HoldItem = witchitem[idx];
2197  SetCursor_(plr[myplr].HoldItem._iCurs + CURSOR_FIRSTITEM);
2198  done = FALSE;
2199 
2200  for (i = 0; i < 40 && !done; i++) {
2201  done = SpecialAutoPlace(myplr, i, cursW / 28, cursH / 28, FALSE);
2202  }
2203 
2204  if (done)
2206  else
2208 
2210  }
2211  }
2212 }
2213 
2215 {
2216  int idx;
2217 
2218  if (stextsel == 22) {
2220  stextsel = 16;
2221  } else {
2222  stextlhold = stextsel;
2223  idx = stextsval + ((stextsel - stextup) >> 2);
2226  plr[myplr].HoldItem = storehold[idx];
2227  if (StoreGoldFit(idx))
2229  else
2231  }
2232 }
2233 
2235 {
2236  int i, idx;
2237 
2238  TakePlrsMoney(plr[myplr].HoldItem._iIvalue);
2239 
2240  idx = stextvhold + ((stextlhold - stextup) >> 2);
2242 
2243  i = storehidx[idx];
2244  if (i < 0)
2246  else
2248 
2249  CalcPlrInv(myplr, TRUE);
2250 }
2251 
2253 {
2254  int idx;
2255 
2256  if (stextsel == 22) {
2258  stextsel = 18;
2259  } else {
2261  stextlhold = stextsel;
2263  idx = stextsval + ((stextsel - stextup) >> 2);
2264  plr[myplr].HoldItem = storehold[idx];
2265  if (plr[myplr]._pGold < storehold[idx]._iIvalue)
2267  else
2269  }
2270 }
2271 
2273 {
2274  if (boyitem._itype != ITYPE_NONE && stextsel == 18) {
2275  if (plr[myplr]._pGold < 50) {
2277  stextlhold = 18;
2280  } else {
2281  TakePlrsMoney(50);
2283  }
2284  } else if (stextsel == 8 && boyitem._itype != ITYPE_NONE || stextsel == 12 && boyitem._itype == ITYPE_NONE) {
2285  talker = 8;
2287  stextlhold = stextsel;
2291  } else {
2293  }
2294 }
2295 
2297 {
2298  TakePlrsMoney(plr[myplr].HoldItem._iIvalue);
2299  StoreAutoPlace();
2302  CalcPlrInv(myplr, TRUE);
2303 }
2304 
2306 {
2307  int idx;
2308  BOOL ok;
2309 
2310  idx = stextvhold + ((stextlhold - stextup) >> 2);
2311 
2312  ok = FALSE;
2313  if (gbMaxPlayers == 1) {
2314  if (idx < 2)
2315  ok = TRUE;
2316  } else {
2317  if (idx < 3)
2318  ok = TRUE;
2319  }
2320  if (ok) {
2322  }
2323 
2324  TakePlrsMoney(plr[myplr].HoldItem._iIvalue);
2325  if (plr[myplr].HoldItem._iMagical == ITEM_QUALITY_NORMAL)
2326  plr[myplr].HoldItem._iIdentified = FALSE;
2327  StoreAutoPlace();
2328 
2329  ok = FALSE;
2330  if (gbMaxPlayers == 1) {
2331  if (idx >= 2)
2332  ok = TRUE;
2333  } else {
2334  if (idx >= 3)
2335  ok = TRUE;
2336  }
2337  if (ok) {
2338  idx = stextvhold + ((stextlhold - stextup) >> 2);
2339  if (idx == 19) {
2340  healitem[19]._itype = ITYPE_NONE;
2341  } else {
2342  for (; healitem[idx + 1]._itype != ITYPE_NONE; idx++) {
2343  healitem[idx] = healitem[idx + 1];
2344  }
2345  healitem[idx]._itype = ITYPE_NONE;
2346  }
2347  CalcPlrInv(myplr, TRUE);
2348  }
2349 }
2350 
2352 {
2353  BOOL done;
2354  int i;
2355 
2356  if (stextsel == 10) {
2359  stextlhold = 10;
2360  if (plr[myplr]._pGold < boyitem._iIvalue + (boyitem._iIvalue >> 1)) {
2362  } else {
2365  SetCursor_(plr[myplr].HoldItem._iCurs + CURSOR_FIRSTITEM);
2366  done = FALSE;
2367  for (i = 0; i < 40 && !done; i++) {
2368  done = AutoPlace(myplr, i, cursW / 28, cursH / 28, FALSE);
2369  }
2370  if (done)
2372  else
2375  }
2376  } else {
2378  }
2379 }
2380 
2382 {
2383  int idx;
2384 
2385  idx = storehidx[((stextlhold - stextup) >> 2) + stextvhold];
2386  if (idx < 0) {
2387  if (idx == -1)
2389  if (idx == -2)
2391  if (idx == -3)
2393  if (idx == -4)
2395  if (idx == -5)
2397  if (idx == -6)
2399  if (idx == -7)
2401  } else {
2402  plr[myplr].InvList[idx]._iIdentified = TRUE;
2403  }
2404  plr[myplr].HoldItem._iIdentified = TRUE;
2405  TakePlrsMoney(plr[myplr].HoldItem._iIvalue);
2406  CalcPlrInv(myplr, TRUE);
2407 }
2408 
2410 {
2411  if (stextsel == 18) {
2412  switch (stextshold) {
2413  case STORE_SBUY:
2414  SmithBuyItem();
2415  break;
2416  case STORE_SSELL:
2417  case STORE_WSELL:
2418  StoreSellItem();
2419  break;
2420  case STORE_SREPAIR:
2421  SmithRepairItem();
2422  break;
2423  case STORE_WBUY:
2424  WitchBuyItem();
2425  break;
2426  case STORE_WRECHARGE:
2428  break;
2429  case STORE_BBOY:
2430  BoyBuyItem();
2431  break;
2432  case STORE_HBUY:
2433  HealerBuyItem();
2434  break;
2435  case STORE_SIDENTIFY:
2436  StoryIdItem();
2438  return;
2439  case STORE_SPBUY:
2440  SmithBuyPItem();
2441  break;
2442  }
2444  } else {
2446  stextsel = stextlhold;
2448  }
2449 }
2450 
2452 {
2453  switch (stextsel) {
2454  case 12:
2455  stextlhold = 12;
2456  talker = 1;
2461  break;
2462  case 14:
2463  if (plr[myplr]._pHitPoints != plr[myplr]._pMaxHP)
2464  PlaySFX(IS_CAST8);
2465  drawhpflag = TRUE;
2468  break;
2469  case 16:
2471  break;
2472  case 18:
2474  break;
2475  }
2476 }
2477 
2479 {
2480  int i, idx;
2481  BOOL done;
2482 
2483  if (stextsel == 22) {
2485  stextsel = 16;
2486  } else {
2487  stextlhold = stextsel;
2490  idx = stextsval + ((stextsel - stextup) >> 2);
2491  if (plr[myplr]._pGold < healitem[idx]._iIvalue) {
2493  } else {
2494  plr[myplr].HoldItem = healitem[idx];
2495  SetCursor_(plr[myplr].HoldItem._iCurs + CURSOR_FIRSTITEM);
2496  done = FALSE;
2497  i = 0;
2498  for (i = 0; i < 40 && !done; i++) {
2499  done = SpecialAutoPlace(myplr, i, cursW / 28, cursH / 28, FALSE);
2500  }
2501  if (done)
2503  else
2506  }
2507  }
2508 }
2509 
2511 {
2512  switch (stextsel) {
2513  case 12:
2514  stextlhold = 12;
2515  talker = 4;
2520  break;
2521  case 14:
2523  break;
2524  case 18:
2526  break;
2527  }
2528 }
2529 
2531 {
2532  int idx;
2533 
2534  if (stextsel == 22) {
2536  stextsel = 14;
2537  } else {
2539  stextlhold = stextsel;
2541  idx = stextsval + ((stextsel - stextup) >> 2);
2542  plr[myplr].HoldItem = storehold[idx];
2543  if (plr[myplr]._pGold < storehold[idx]._iIvalue)
2545  else
2547  }
2548 }
2549 
2551 {
2552  int i, tq, sn, la;
2553 
2554  if (stextsel == 22) {
2556  stextsel = stextlhold;
2557  return;
2558  }
2559 
2560  sn = 0;
2561  for (i = 0; i < MAXQUESTS; i++) {
2562  if (quests[i]._qactive == QUEST_ACTIVE && ((DWORD *)&Qtalklist[talker])[i] != -1 && quests[i]._qlog)
2563  sn++;
2564  }
2565  if (sn > 6) {
2566  sn = 14 - (sn >> 1);
2567  la = 1;
2568  } else {
2569  sn = 15 - sn;
2570  la = 2;
2571  }
2572 
2573  if (stextsel == sn - 2) {
2574  SetRndSeed(towner[talker]._tSeed);
2575  tq = gossipstart + random_(0, gossipend - gossipstart + 1);
2576  InitQTextMsg(tq);
2577  return;
2578  }
2579 
2580  for (i = 0; i < MAXQUESTS; i++) {
2581  if (quests[i]._qactive == QUEST_ACTIVE && ((DWORD *)&Qtalklist[talker])[i] != -1 && quests[i]._qlog) {
2582  if (sn == stextsel) {
2583  InitQTextMsg(((DWORD *)&Qtalklist[talker])[i]);
2584  }
2585  sn += la;
2586  }
2587  }
2588 }
2589 
2591 {
2592  switch (stextsel) {
2593  case 12:
2594  stextlhold = 12;
2595  talker = 3;
2600  break;
2601  case 18:
2603  break;
2604  }
2605 }
2606 
2608 {
2609  switch (stextsel) {
2610  case 12:
2611  stextlhold = 12;
2612  talker = 7;
2617  break;
2618  case 18:
2620  break;
2621  }
2622 }
2623 
2625 {
2626  switch (stextsel) {
2627  case 12:
2628  stextlhold = 12;
2629  talker = 5;
2634  break;
2635  case 18:
2637  break;
2638  }
2639 }
2640 
2642 {
2643  if (qtextflag) {
2644  qtextflag = FALSE;
2645  if (leveltype == DTYPE_TOWN)
2646  stream_stop();
2647  } else {
2649  switch (stextflag) {
2650  case STORE_SMITH:
2651  S_SmithEnter();
2652  break;
2653  case STORE_SPBUY:
2654  S_SPBuyEnter();
2655  break;
2656  case STORE_SBUY:
2657  S_SBuyEnter();
2658  break;
2659  case STORE_SSELL:
2660  S_SSellEnter();
2661  break;
2662  case STORE_SREPAIR:
2663  S_SRepairEnter();
2664  break;
2665  case STORE_WITCH:
2666  S_WitchEnter();
2667  break;
2668  case STORE_WBUY:
2669  S_WBuyEnter();
2670  break;
2671  case STORE_WSELL:
2672  S_WSellEnter();
2673  break;
2674  case STORE_WRECHARGE:
2675  S_WRechargeEnter();
2676  break;
2677  case STORE_NOMONEY:
2678  case STORE_NOROOM:
2680  stextsel = stextlhold;
2682  break;
2683  case STORE_CONFIRM:
2684  S_ConfirmEnter();
2685  break;
2686  case STORE_BOY:
2687  S_BoyEnter();
2688  break;
2689  case STORE_BBOY:
2690  S_BBuyEnter();
2691  break;
2692  case STORE_HEALER:
2693  S_HealerEnter();
2694  break;
2695  case STORE_STORY:
2696  S_StoryEnter();
2697  break;
2698  case STORE_HBUY:
2699  S_HBuyEnter();
2700  break;
2701  case STORE_SIDENTIFY:
2702  S_SIDEnter();
2703  break;
2704  case STORE_GOSSIP:
2705  S_TalkEnter();
2706  break;
2707  case STORE_IDSHOW:
2709  break;
2710  case STORE_DRUNK:
2711  S_DrunkEnter();
2712  break;
2713  case STORE_TAVERN:
2714  S_TavernEnter();
2715  break;
2716  case STORE_BARMAID:
2717  S_BarmaidEnter();
2718  break;
2719  }
2720  }
2721 }
2722 
2724 {
2725  int y;
2726 
2727  if (qtextflag) {
2728  qtextflag = FALSE;
2729  if (leveltype == DTYPE_TOWN)
2730  stream_stop();
2731  } else if (stextsel != -1 && MouseY >= 32 && MouseY <= 320) {
2732  if (!stextsize) {
2733  if (MouseX < 344 + PANEL_LEFT || MouseX > 616 + PANEL_LEFT)
2734  return;
2735  } else {
2736  if (MouseX < 24 + PANEL_LEFT || MouseX > 616 + PANEL_LEFT)
2737  return;
2738  }
2739  y = (MouseY - 32) / 12;
2740  if (stextscrl && MouseX > 600 + PANEL_LEFT) {
2741  if (y == 4) {
2742  if (stextscrlubtn <= 0) {
2743  STextUp();
2744  stextscrlubtn = 10;
2745  } else {
2746  stextscrlubtn--;
2747  }
2748  }
2749  if (y == 20) {
2750  if (stextscrldbtn <= 0) {
2751  STextDown();
2752  stextscrldbtn = 10;
2753  } else {
2754  stextscrldbtn--;
2755  }
2756  }
2757  } else if (y >= 5) {
2758  if (y >= 23)
2759  y = 22;
2760  if (stextscrl && y < 21 && !stext[y]._ssel) {
2761  if (stext[y - 2]._ssel) {
2762  y -= 2;
2763  } else if (stext[y - 1]._ssel) {
2764  y--;
2765  }
2766  }
2767  if (stext[y]._ssel || stextscrl && y == 22) {
2768  stextsel = y;
2769  STextEnter();
2770  }
2771  }
2772  }
2773 }
2774 
2776 {
2777  stextscrlubtn = -1;
2778  stextscrldbtn = -1;
2779 }
2780 
STORE_CONFIRM
@ STORE_CONFIRM
Definition: enums.h:2596
ItemStruct::_iSeed
int _iSeed
Definition: structs.h:100
trans_rect
void trans_rect(int sx, int sy, int width, int height)
Draws a half-transparent rectangle by blacking out odd pixels on odd lines, even pixels on even lines...
Definition: render.cpp:342
gpBuffer
BYTE * gpBuffer
GOLD_MAX_LIMIT
#define GOLD_MAX_LIMIT
Definition: defs.h:68
stextsmax
int stextsmax
Definition: stores.cpp:17
S_StartHBuy
void S_StartHBuy()
Definition: stores.cpp:1182
STextNext
void STextNext()
Definition: stores.cpp:1718
PlayerStruct::_pGold
int _pGold
Definition: structs.h:275
quests
QuestStruct quests[MAXQUESTS]
Definition: quests.cpp:8
SpawnPremium
void SpawnPremium(int lvl)
Definition: items.cpp:3473
ItemStruct::_iMiscId
int _iMiscId
Definition: structs.h:130
stextscrlubtn
char stextscrlubtn
Definition: stores.cpp:38
PlayerStruct::InvGrid
char InvGrid[NUM_INV_GRID_ELEM]
Definition: structs.h:316
STORE_HBUY
@ STORE_HBUY
Definition: enums.h:2601
TEXT_OGDEN2
@ TEXT_OGDEN2
Definition: enums.h:1708
MouseY
int MouseY
Definition: diablo.cpp:17
S_BarmaidEnter
void S_BarmaidEnter()
Definition: stores.cpp:2607
IS_TITLEMOV
@ IS_TITLEMOV
Definition: enums.h:352
ItemStruct::_iSpell
int _iSpell
Definition: structs.h:132
stextscrldbtn
char stextscrldbtn
Definition: stores.cpp:29
stextsize
char stextsize
Definition: stores.cpp:15
PANEL_X
#define PANEL_X
Definition: defs.h:136
S_StartTavern
void S_StartTavern()
Definition: stores.cpp:1371
SetGoldCurs
void SetGoldCurs(int pnum, int i)
Definition: stores.cpp:1762
SCREENXY
#define SCREENXY(x, y)
Definition: defs.h:155
ItemStruct::_iMinStr
char _iMinStr
Definition: structs.h:166
force_redraw
int force_redraw
Definition: diablo.cpp:30
currlevel
BYTE currlevel
Definition: gendung.cpp:40
PlayerStruct::_pMaxHP
int _pMaxHP
Definition: structs.h:259
ItemStruct::_iCurs
int _iCurs
Definition: structs.h:121
S_BoyEnter
void S_BoyEnter()
Definition: stores.cpp:2272
PrintSString
void PrintSString(int x, int y, BOOL cjustflag, char *str, char col, int val)
Definition: stores.cpp:125
stextsval
int stextsval
Definition: stores.cpp:34
STORE_WITCH
@ STORE_WITCH
Definition: enums.h:2590
SmithSellOk
BOOL SmithSellOk(int i)
Definition: stores.cpp:574
Qtalklist
QuestTalkData Qtalklist[11]
Definition: towners.cpp:96
SetCursor_
void SetCursor_(int i)
Definition: cursor.cpp:99
TEXT_ADRIA13
@ TEXT_ADRIA13
Definition: enums.h:1770
INVLOC_HEAD
@ INVLOC_HEAD
Definition: enums.h:2789
STextStruct::_sjust
BOOL _sjust
Definition: structs.h:1521
SetRndSeed
void SetRndSeed(int s)
Set the RNG seed.
Definition: engine.cpp:728
GOLD_MEDIUM_LIMIT
#define GOLD_MEDIUM_LIMIT
Definition: defs.h:67
S_TavernEnter
void S_TavernEnter()
Definition: stores.cpp:2590
premiumlevel
int premiumlevel
Definition: stores.cpp:12
StoreAutoPlace
void StoreAutoPlace()
Definition: stores.cpp:289
S_StartWSell
void S_StartWSell()
Definition: stores.cpp:876
PlayerStruct::_pMaxHPBase
int _pMaxHPBase
Definition: structs.h:257
TEXT_WIRT2
@ TEXT_WIRT2
Definition: enums.h:1772
STextESC
void STextESC()
Definition: stores.cpp:1555
pSTextBoxCels
BYTE * pSTextBoxCels
Definition: stores.cpp:11
ItemStruct::_iStatFlag
BOOL _iStatFlag
Definition: structs.h:169
S_StartBarMaid
void S_StartBarMaid()
Definition: stores.cpp:1384
AddSTextVal
void AddSTextVal(int y, int val)
Definition: stores.cpp:268
STORE_SSELL
@ STORE_SSELL
Definition: enums.h:2588
STextStruct
Definition: structs.h:1517
SpawnStoreGold
void SpawnStoreGold()
Definition: items.cpp:3786
INVLOC_CHEST
@ INVLOC_CHEST
Definition: enums.h:2795
DrawSSlider
void DrawSSlider(int y1, int y2)
Definition: stores.cpp:209
AddStoreHoldRepair
void AddStoreHoldRepair(ItemStruct *itm, int i)
Definition: stores.cpp:753
PlayerStruct::_pNumInv
int _pNumInv
Definition: structs.h:315
STORE_HEALER
@ STORE_HEALER
Definition: enums.h:2599
cursH
DEVILUTION_BEGIN_NAMESPACE int cursH
Definition: cursor.cpp:10
PlayerStruct::_pHPBase
int _pHPBase
Definition: structs.h:256
ItemStruct::_iIvalue
int _iIvalue
Definition: structs.h:123
StartStore
void StartStore(char s)
Definition: stores.cpp:1408
storehidx
char storehidx[48]
Definition: stores.cpp:25
CURSOR_HAND
@ CURSOR_HAND
Definition: enums.h:2067
ItemStruct::_iDurability
int _iDurability
Definition: structs.h:135
ItemStruct::_iMinDam
int _iMinDam
Definition: structs.h:124
S_StartWBuy
void S_StartWBuy()
Definition: stores.cpp:828
SMITH_PREMIUM_ITEMS
#define SMITH_PREMIUM_ITEMS
Definition: defs.h:58
ItemStruct::_iMinMag
unsigned char _iMinMag
Definition: structs.h:167
pSPentSpn2Cels
BYTE * pSPentSpn2Cels
Definition: stores.cpp:31
PentSpn2Frame
BYTE PentSpn2Frame
Definition: stores.cpp:32
STORE_WSELL
@ STORE_WSELL
Definition: enums.h:2592
item
ItemStruct item[MAXITEMS+1]
Definition: items.cpp:15
gossipend
int gossipend
Definition: stores.cpp:30
ICURS_GOLD_MEDIUM
@ ICURS_GOLD_MEDIUM
Definition: enums.h:178
stream_stop
void stream_stop()
Definition: effects.cpp:932
stext
STextStruct stext[24]
Definition: stores.cpp:14
ItemStruct::_itype
int _itype
Definition: structs.h:102
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
S_ScrollSPBuy
void S_ScrollSPBuy(int idx)
Definition: stores.cpp:505
questlog
BOOL questlog
Definition: quests.cpp:6
STORE_SMITH
@ STORE_SMITH
Definition: enums.h:2586
DUR_INDESTRUCTIBLE
#define DUR_INDESTRUCTIBLE
Definition: defs.h:50
ReleaseStoreBtn
void ReleaseStoreBtn()
Definition: stores.cpp:2775
ITYPE_NONE
@ ITYPE_NONE
Definition: enums.h:2495
COL_WHITE
@ COL_WHITE
Definition: enums.h:1993
STORE_SBUY
@ STORE_SBUY
Definition: enums.h:2587
S_WSellEnter
void S_WSellEnter()
Definition: stores.cpp:2214
INVLOC_HAND_LEFT
@ INVLOC_HAND_LEFT
Definition: enums.h:2793
STextDown
void STextDown()
Definition: stores.cpp:1665
PlayerStruct::InvList
ItemStruct InvList[NUM_INV_GRID_ELEM]
Definition: structs.h:314
PentSpn2Spin
void PentSpn2Spin()
Definition: stores.cpp:76
COL_GOLD
@ COL_GOLD
Definition: enums.h:1996
MemFreeDbg
#define MemFreeDbg(p)
Definition: defs.h:157
STextUp
void STextUp()
Definition: stores.cpp:1628
S_SRepairEnter
void S_SRepairEnter()
Definition: stores.cpp:2107
towner
TownerStruct towner[16]
Definition: towners.cpp:13
boylevel
int boylevel
Definition: stores.cpp:35
STORE_TAVERN
@ STORE_TAVERN
Definition: enums.h:2606
PlayerStruct::_pLevel
char _pLevel
Definition: structs.h:266
STORE_GOSSIP
@ STORE_GOSSIP
Definition: enums.h:2604
CheckStoreBtn
void CheckStoreBtn()
Definition: stores.cpp:2723
CalcPlrInv
void CalcPlrInv(int p, BOOL Loadgfx)
Definition: items.cpp:764
ItemStruct::_ivalue
int _ivalue
Definition: structs.h:122
all.h
stextscrl
BOOL stextscrl
Definition: stores.cpp:21
STORE_IDSHOW
@ STORE_IDSHOW
Definition: enums.h:2605
STextStruct::_syoff
int _syoff
Definition: structs.h:1519
SetSpdbarGoldCurs
void SetSpdbarGoldCurs(int pnum, int i)
Definition: stores.cpp:1772
stextsel
int stextsel
Definition: stores.cpp:28
DrawSTextBack
void DrawSTextBack()
Definition: stores.cpp:119
PlayerStruct::SpdList
ItemStruct SpdList[MAXBELTITEMS]
Definition: structs.h:317
GetGoldSeed
void GetGoldSeed(int pnum, ItemStruct *h)
Definition: items.cpp:823
ItemStruct::_iMagical
char _iMagical
Definition: structs.h:115
INVLOC_RING_RIGHT
@ INVLOC_RING_RIGHT
Definition: enums.h:2791
S_SSellEnter
void S_SSellEnter()
Definition: stores.cpp:2062
premiumitem
ItemStruct premiumitem[SMITH_PREMIUM_ITEMS]
Definition: stores.cpp:10
S_StartSPBuy
BOOL S_StartSPBuy()
Definition: stores.cpp:539
S_StartTalk
void S_StartTalk()
Definition: stores.cpp:1328
GOLD_SMALL_LIMIT
#define GOLD_SMALL_LIMIT
Definition: defs.h:66
S_StartSmith
void S_StartSmith()
Definition: stores.cpp:361
spelldata
DEVILUTION_BEGIN_NAMESPACE SpellData spelldata[]
Data related to each spell ID.
Definition: spelldat.cpp:6
storehold
ItemStruct storehold[48]
Definition: stores.cpp:18
MAXBELTITEMS
#define MAXBELTITEMS
Definition: defs.h:28
ItemStruct
Definition: structs.h:99
gbMaxPlayers
BYTE gbMaxPlayers
Specifies the maximum number of players in a game, where 1 represents a single player game and 4 repr...
Definition: multi.cpp:34
S_StartIdShow
void S_StartIdShow()
Definition: stores.cpp:1308
STORE_NOROOM
@ STORE_NOROOM
Definition: enums.h:2595
STextPrior
void STextPrior()
Definition: stores.cpp:1702
FreeStoreMem
void FreeStoreMem()
Definition: stores.cpp:112
S_StartSSell
void S_StartSSell()
Definition: stores.cpp:632
HealerBuyItem
void HealerBuyItem()
Definition: stores.cpp:2305
ItemStruct::_iMaxDur
int _iMaxDur
Definition: structs.h:136
S_ScrollHBuy
void S_ScrollHBuy(int idx)
Definition: stores.cpp:1156
sbookflag
BOOL sbookflag
Definition: control.cpp:48
INVLOC_HAND_RIGHT
@ INVLOC_HAND_RIGHT
Definition: enums.h:2794
SpawnSmith
void SpawnSmith(int lvl)
Definition: items.cpp:3382
SetICursor
void SetICursor(int i)
Definition: cursor.cpp:91
ICURS_GOLD_SMALL
@ ICURS_GOLD_SMALL
Definition: enums.h:177
STORE_SPBUY
@ STORE_SPBUY
Definition: enums.h:2603
CURSOR_FIRSTITEM
@ CURSOR_FIRSTITEM
Definition: enums.h:2078
IMISC_STAFF
@ IMISC_STAFF
Definition: enums.h:2454
SetupTownStores
void SetupTownStores()
Definition: stores.cpp:85
ICURS_GOLD_LARGE
@ ICURS_GOLD_LARGE
Definition: enums.h:179
PrintItemPower
void PrintItemPower(char plidx, ItemStruct *x)
Definition: items.cpp:2693
TEXT_FARNHAM13
@ TEXT_FARNHAM13
Definition: enums.h:1758
ItemStruct::_iClass
char _iClass
Definition: structs.h:120
DrawSLine
void DrawSLine(int y)
Definition: stores.cpp:180
smithitem
ItemStruct smithitem[SMITH_ITEMS]
Definition: stores.cpp:36
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
gossipstart
int gossipstart
Definition: stores.cpp:19
InitStores
void InitStores()
Definition: stores.cpp:54
S_StartNoMoney
void S_StartNoMoney()
Definition: stores.cpp:1012
stextshold
int stextshold
Definition: stores.cpp:9
S_StartStory
void S_StartStory()
Definition: stores.cpp:1206
WitchRechargeItem
void WitchRechargeItem()
Definition: stores.cpp:2234
AddStoreHoldId
void AddStoreHoldId(ItemStruct itm, int i)
Definition: stores.cpp:1229
S_StartBoy
void S_StartBoy()
Definition: stores.cpp:1095
talkname
char * talkname[9]
Maps from towner IDs to NPC names.
Definition: stores.cpp:42
DrawSText
void DrawSText()
Definition: stores.cpp:1509
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
STORE_SIDENTIFY
@ STORE_SIDENTIFY
Definition: enums.h:2602
StoreGoldFit
BOOL StoreGoldFit(int idx)
Definition: stores.cpp:1961
TEXT_STORY11
@ TEXT_STORY11
Definition: enums.h:1706
NUMLEVELS
#define NUMLEVELS
Definition: defs.h:56
pSTextSlidCels
BYTE * pSTextSlidCels
Definition: stores.cpp:26
PlaceStoreGold
void PlaceStoreGold(int v)
Definition: stores.cpp:1998
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
SmithRepairOk
BOOL SmithRepairOk(int i)
Definition: stores.cpp:682
TEXT_ADRIA2
@ TEXT_ADRIA2
Definition: enums.h:1760
ITYPE_MEAT
@ ITYPE_MEAT
Definition: enums.h:2494
golditem
ItemStruct golditem
Definition: stores.cpp:24
DrawQTextBack
void DrawQTextBack()
Definition: minitext.cpp:87
TEXT_FARNHAM2
@ TEXT_FARNHAM2
Definition: enums.h:1748
boyitem
ItemStruct boyitem
Definition: stores.cpp:8
AddSLine
void AddSLine(int y)
Definition: stores.cpp:260
COL_RED
@ COL_RED
Definition: enums.h:1995
ITYPE_STAFF
@ ITYPE_STAFF
Definition: enums.h:2490
AP2x2Tbl
int AP2x2Tbl[10]
Specifies the starting inventory slots for placement of 2x2 items.
Definition: inv.cpp:112
GetRndSeed
int GetRndSeed()
Get the current RNG seed.
Definition: engine.cpp:739
DrawSTextHelp
void DrawSTextHelp()
Definition: stores.cpp:238
numpremium
int numpremium
Definition: stores.cpp:22
ITEM_QUALITY_UNIQUE
@ ITEM_QUALITY_UNIQUE
Definition: enums.h:10
S_WRechargeEnter
void S_WRechargeEnter()
Definition: stores.cpp:2252
TEXT_OGDEN10
@ TEXT_OGDEN10
Definition: enums.h:1715
IS_TITLSLCT
@ IS_TITLSLCT
Definition: enums.h:353
COL_BLUE
@ COL_BLUE
Definition: enums.h:1994
S_StartDrunk
void S_StartDrunk()
Definition: stores.cpp:1396
STORE_NONE
@ STORE_NONE
Definition: enums.h:2585
ItemStruct::_iCharges
int _iCharges
Definition: structs.h:133
S_StartSIdentify
void S_StartSIdentify()
Definition: stores.cpp:1238
fontkern
const BYTE fontkern[68]
Maps from smaltext.cel frame number to character width.
Definition: control.cpp:81
IS_CAST8
@ IS_CAST8
Definition: enums.h:365
ClearSText
void ClearSText(int s, int e)
Definition: stores.cpp:244
IDI_FIRSTQUEST
@ IDI_FIRSTQUEST
Definition: enums.h:2506
PlaySFX
void PlaySFX(int psfx)
Definition: effects.cpp:1043
S_SIDEnter
void S_SIDEnter()
Definition: stores.cpp:2530
S_WBuyEnter
void S_WBuyEnter()
Definition: stores.cpp:2179
PrintStoreItem
void PrintStoreItem(ItemStruct *x, int l, char iclr)
Definition: stores.cpp:415
ItemStruct::_iName
char _iName[64]
Definition: structs.h:116
SMITH_ITEMS
#define SMITH_ITEMS
Definition: defs.h:57
witchitem
ItemStruct witchitem[20]
Definition: stores.cpp:20
ItemStruct::_iIdentified
BOOL _iIdentified
Definition: structs.h:114
S_SBuyEnter
void S_SBuyEnter()
Definition: stores.cpp:1868
InitQTextMsg
void InitQTextMsg(int m)
Definition: minitext.cpp:70
STextStruct::_sstr
char _sstr[128]
Definition: structs.h:1520
DTYPE_TOWN
@ DTYPE_TOWN
Definition: enums.h:1868
STextStruct::_sline
int _sline
Definition: structs.h:1523
S_ConfirmEnter
void S_ConfirmEnter()
Definition: stores.cpp:2409
STextStruct::_sclr
char _sclr
Definition: structs.h:1522
S_StartWitch
void S_StartWitch()
Definition: stores.cpp:776
TEXT_WIRT12
@ TEXT_WIRT12
Definition: enums.h:1781
MAXQUESTS
#define MAXQUESTS
Definition: defs.h:35
tempstr
char tempstr[256]
Definition: control.cpp:41
STORE_SREPAIR
@ STORE_SREPAIR
Definition: enums.h:2589
questlist
QuestData questlist[MAXQUESTS]
Definition: quests.cpp:18
invflag
DEVILUTION_BEGIN_NAMESPACE BOOL invflag
Definition: inv.cpp:10
stextdown
int stextdown
Definition: stores.cpp:37
glSeedTbl
DWORD glSeedTbl[NUMLEVELS]
Definition: diablo.cpp:20
AutoPlace
BOOL AutoPlace(int pnum, int ii, int sx, int sy, BOOL saveflag)
Definition: inv.cpp:450
ItemDataStruct::iUsable
BOOL iUsable
Definition: structs.h:87
S_ScrollWBuy
void S_ScrollWBuy(int idx)
Definition: stores.cpp:791
PlayerStruct::InvBody
ItemStruct InvBody[NUM_INVLOC]
Definition: structs.h:313
STextStruct::_sx
int _sx
Definition: structs.h:1518
S_StartConfirm
void S_StartConfirm()
Definition: stores.cpp:1029
OffsetSTextY
void OffsetSTextY(int y, int yo)
Definition: stores.cpp:273
STORE_BOY
@ STORE_BOY
Definition: enums.h:2597
WitchRechargeOk
BOOL WitchRechargeOk(int i)
Definition: stores.cpp:942
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
TEXT_GRISWOLD2
@ TEXT_GRISWOLD2
Definition: enums.h:1736
ITEM_QUALITY_NORMAL
@ ITEM_QUALITY_NORMAL
Definition: enums.h:8
S_TalkEnter
void S_TalkEnter()
Definition: stores.cpp:2550
chrflag
BOOL chrflag
Definition: control.cpp:49
BoyBuyItem
void BoyBuyItem()
Definition: stores.cpp:2296
TEXT_GRISWOLD13
@ TEXT_GRISWOLD13
Definition: enums.h:1746
myplr
int myplr
Definition: player.cpp:9
S_WitchEnter
void S_WitchEnter()
Definition: stores.cpp:2127
random_
int random_(BYTE idx, int v)
Main RNG function.
Definition: engine.cpp:752
PlayerStruct::_pHitPoints
int _pHitPoints
Definition: structs.h:258
ItemStruct::_iIName
char _iIName[64]
Definition: structs.h:117
ICLASS_ARMOR
@ ICLASS_ARMOR
Definition: enums.h:2739
ItemStruct::_iMaxCharges
int _iMaxCharges
Definition: structs.h:134
ITYPE_MISC
@ ITYPE_MISC
Definition: enums.h:2480
BUFFER_WIDTH
#define BUFFER_WIDTH
Definition: defs.h:128
QUEST_ACTIVE
@ QUEST_ACTIVE
Definition: enums.h:2569
TEXT_GILLIAN2
@ TEXT_GILLIAN2
Definition: enums.h:1727
SpawnBoy
void SpawnBoy(int lvl)
Definition: items.cpp:3641
S_ScrollSSell
void S_ScrollSSell(int idx)
Definition: stores.cpp:592
STORE_BARMAID
@ STORE_BARMAID
Definition: enums.h:2608
SmithBuyItem
void SmithBuyItem()
Definition: stores.cpp:1848
S_StartHealer
void S_StartHealer()
Definition: stores.cpp:1141
IdItemOk
BOOL IdItemOk(ItemStruct *i)
Definition: stores.cpp:1218
icursW28
int icursW28
Definition: cursor.cpp:14
S_HealerEnter
void S_HealerEnter()
Definition: stores.cpp:2451
ItemStruct::_iAC
int _iAC
Definition: structs.h:126
S_StartSBuy
void S_StartSBuy()
Definition: stores.cpp:481
DEVILUTION_BEGIN_NAMESPACE
Definition: sha.cpp:10
QuestStruct::_qlog
int _qlog
Definition: structs.h:982
S_ScrollSBuy
void S_ScrollSBuy(int idx)
Definition: stores.cpp:378
AddSText
void AddSText(int x, int y, BOOL j, char *str, char clr, BOOL sel)
Definition: stores.cpp:278
TakePlrsMoney
void TakePlrsMoney(int cost)
Definition: stores.cpp:1782
WitchSellOk
BOOL WitchSellOk(int i)
Definition: stores.cpp:853
ItemStruct::_iPrePower
char _iPrePower
Definition: structs.h:160
talker
int talker
Definition: stores.cpp:13
S_HBuyEnter
void S_HBuyEnter()
Definition: stores.cpp:2478
SmithBuyPItem
void SmithBuyPItem()
Definition: stores.cpp:1900
StoreSellItem
void StoreSellItem()
Definition: stores.cpp:2021
S_StartSRepair
void S_StartSRepair()
Definition: stores.cpp:698
StoryIdItem
void StoryIdItem()
Definition: stores.cpp:2381
PentSpn2Tick
DWORD PentSpn2Tick
Definition: stores.cpp:33
STORE_STORY
@ STORE_STORY
Definition: enums.h:2600
dropGoldFlag
BOOL dropGoldFlag
Definition: control.cpp:15
S_StartBBoy
void S_StartBBoy()
Definition: stores.cpp:1114
STORE_BBOY
@ STORE_BBOY
Definition: enums.h:2598
PANEL_LEFT
#define PANEL_LEFT
Definition: defs.h:135
TEXT_STORY2
@ TEXT_STORY2
Definition: enums.h:1698
ItemStruct::_iSufPower
char _iSufPower
Definition: structs.h:161
STORE_WBUY
@ STORE_WBUY
Definition: enums.h:2591
S_BBuyEnter
void S_BBuyEnter()
Definition: stores.cpp:2351
SpawnWitch
void SpawnWitch(int lvl)
Definition: items.cpp:3579
TEXT_PEPIN2
@ TEXT_PEPIN2
Definition: enums.h:1717
PrintChar
void PrintChar(int sx, int sy, int nCel, char col)
Print letter to the back buffer.
Definition: control.cpp:504
S_StartWRecharge
void S_StartWRecharge()
Definition: stores.cpp:964
fontframe
const BYTE fontframe[128]
Maps from font index to smaltext.cel frame number.
Definition: control.cpp:65
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
drawhpflag
BOOL drawhpflag
Definition: control.cpp:14
S_StoryEnter
void S_StoryEnter()
Definition: stores.cpp:2510
SpawnHealer
void SpawnHealer(int lvl)
Definition: items.cpp:3745
STextStruct::_ssel
BOOL _ssel
Definition: structs.h:1524
IDI_LAZSTAFF
@ IDI_LAZSTAFF
Definition: enums.h:2534
stextup
DEVILUTION_BEGIN_NAMESPACE int stextup
Definition: stores.cpp:5
AddStoreHoldRecharge
void AddStoreHoldRecharge(ItemStruct itm, int i)
Definition: stores.cpp:954
ICLASS_WEAPON
@ ICLASS_WEAPON
Definition: enums.h:2738
S_DrunkEnter
void S_DrunkEnter()
Definition: stores.cpp:2624
STextEnter
void STextEnter()
Definition: stores.cpp:2641
S_StartNoRoom
void S_StartNoRoom()
Definition: stores.cpp:1021
qtextflag
BOOLEAN qtextflag
Definition: minitext.cpp:13
S_SmithEnter
void S_SmithEnter()
Definition: stores.cpp:1733
TEXT_PEPIN11
@ TEXT_PEPIN11
Definition: enums.h:1725
IDI_LASTQUEST
@ IDI_LASTQUEST
Definition: enums.h:2523
storenumh
int storenumh
Definition: stores.cpp:6
TEXT_GILLIAN10
@ TEXT_GILLIAN10
Definition: enums.h:1734
leveltype
BYTE leveltype
Definition: gendung.cpp:39
healitem
ItemStruct healitem[20]
Definition: stores.cpp:23
STextStruct::_sval
int _sval
Definition: structs.h:1525
WitchBuyItem
void WitchBuyItem()
Definition: stores.cpp:2153
plr
PlayerStruct plr[MAX_PLRS]
Definition: player.cpp:10
RemoveSpdBarItem
void RemoveSpdBarItem(int pnum, int iv)
Definition: inv.cpp:1321
STORE_DRUNK
@ STORE_DRUNK
Definition: enums.h:2607
MouseX
int MouseX
Definition: diablo.cpp:18
stextflag
char stextflag
Definition: stores.cpp:39
icursH28
int icursH28
Definition: cursor.cpp:11
stextvhold
int stextvhold
Definition: stores.cpp:27
stextlhold
int stextlhold
Definition: stores.cpp:7
S_SPBuyEnter
void S_SPBuyEnter()
Definition: stores.cpp:1923
SmithRepairItem
void SmithRepairItem()
Definition: stores.cpp:2083
STORE_NOMONEY
@ STORE_NOMONEY
Definition: enums.h:2594
STORE_WRECHARGE
@ STORE_WRECHARGE
Definition: enums.h:2593
cursW
int cursW
Definition: cursor.cpp:12
ItemStruct::_iMaxDam
int _iMaxDam
Definition: structs.h:125
INVLOC_RING_LEFT
@ INVLOC_RING_LEFT
Definition: enums.h:2790
SpellData::sStaffCost
int sStaffCost
Definition: structs.h:1033