Devilution
Diablo devolved - magic behind the 1996 computer game
towners.cpp
Go to the documentation of this file.
1 #include "all.h"
2 
4 
5 BOOL storeflag;
12 BYTE *pCowCels;
14 
15 #ifndef SPAWN
16 const int snSFX[3][NUM_CLASSES] = {
20 };
21 #endif
22 
23 /* data */
24 
25 char AnimOrder[6][148] = {
26  { 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
27  14, 13, 12, 11, 10, 9, 8, 7, 6, 5,
28  5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
29  14, 13, 12, 11, 10, 9, 8, 7, 6, 5,
30  5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
31  14, 13, 12, 11, 10, 9, 8, 7, 6, 5,
32  5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
33  14, 13, 12, 11, 10, 9, 8, 7, 6, 5,
34  5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
35  14, 13, 12, 11, 10, 9, 8, 7, 6, 5,
36  5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
37  15, 5, 1, 1, 1, 1, 1, 1, 1, 1,
38  1, 1, 1, 1, 1, 1, 1, 2, 3, 4,
39  -1 },
40  { 1, 2, 3, 3, 2, 1, 20, 19, 19, 20,
41  1, 2, 3, 3, 2, 1, 20, 19, 19, 20,
42  1, 2, 3, 3, 2, 1, 20, 19, 19, 20,
43  1, 2, 3, 3, 2, 1, 20, 19, 19, 20,
44  1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
45  11, 12, 13, 14, 15, 16, 15, 14, 13, 12,
46  11, 10, 9, 8, 7, 6, 5, 4, 5, 6,
47  7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
48  15, 14, 13, 12, 11, 10, 9, 8, 7, 6,
49  5, 4, 5, 6, 7, 8, 9, 10, 11, 12,
50  13, 14, 15, 16, 17, 18, 19, 20, -1 },
51  { 1, 1, 25, 25, 24, 23, 22, 21, 20, 19,
52  18, 17, 16, 15, 16, 17, 18, 19, 20, 21,
53  22, 23, 24, 25, 25, 25, 1, 1, 1, 25,
54  1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
55  11, 12, 13, 14, 15, 14, 13, 12, 11, 10,
56  9, 8, 7, 6, 5, 4, 3, 2, 1, -1 },
57  { 1, 2, 3, 3, 2, 1, 16, 15, 14, 14,
58  16, 1, 2, 3, 3, 2, 1, 16, 15, 14,
59  14, 15, 16, 1, 2, 3, 3, 2, 1, 16,
60  15, 14, 14, 15, 16, 1, 2, 3, 3, 2,
61  1, 16, 15, 14, 14, 15, 16, 1, 2, 3,
62  3, 2, 1, 16, 15, 14, 14, 15, 16, 1,
63  2, 3, 3, 2, 1, 16, 15, 14, 14, 15,
64  16, 1, 2, 3, 3, 2, 1, 16, 15, 14,
65  14, 15, 16, 1, 2, 3, 2, 1, 16, 15,
66  14, 14, 15, 16, 1, 2, 3, 4, 5, 6,
67  7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
68  -1 },
69  { 1, 1, 1, 2, 3, 4, 5, 6, 7, 8,
70  9, 10, 11, 11, 11, 11, 12, 13, 14, 15,
71  16, 17, 18, 18, 1, 1, 1, 18, 17, 16,
72  15, 14, 13, 12, 11, 10, 11, 12, 13, 14,
73  15, 16, 17, 18, 1, 2, 3, 4, 5, 5,
74  5, 4, 3, 2, -1 },
75  { 4, 4, 4, 5, 6, 6, 6, 5, 4, 15,
76  14, 13, 13, 13, 14, 15, 4, 5, 6, 6,
77  6, 5, 4, 4, 4, 5, 6, 6, 6, 5,
78  4, 15, 14, 13, 13, 13, 14, 15, 4, 5,
79  6, 6, 6, 5, 4, 4, 4, 5, 6, 6,
80  6, 5, 4, 15, 14, 13, 13, 13, 14, 15,
81  4, 5, 6, 6, 6, 5, 4, 3, 2, 1,
82  19, 18, 19, 1, 2, 1, 19, 18, 19, 1,
83  2, 1, 2, 3, 4, 5, 6, 7, 8, 9,
84  10, 11, 12, 13, 14, 15, 15, 15, 14, 13,
85  13, 13, 13, 14, 15, 15, 15, 14, 13, 12,
86  12, 12, 11, 10, 10, 10, 9, 8, 9, 10,
87  10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
88  1, 2, 1, 19, 18, 19, 1, 2, 1, 2,
89  3, -1 }
90 };
91 int TownCowX[3] = { 58, 56, 59 };
92 int TownCowY[3] = { 16, 14, 20 };
93 int TownCowDir[3] = { 1, 3, 4 };
94 int cowoffx[8] = { -1, 0, -1, -1, -1, 0, -1, -1 };
95 int cowoffy[8] = { -1, -1, -1, 0, -1, -1, -1, 0 };
97  // clang-format off
98  // _qinfra, _qblkm, _qgarb, _qzhar, _qveil, _qmod, _qbutch, _qbol, _qblind, _qblood, _qanvil, _qwarlrd, _qking, _qpw, _qbone, _qvb
101  { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
108  { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
110  // clang-format on
111 };
112 int CowPlaying = -1;
113 
114 int GetActiveTowner(int t)
115 {
116  int i;
117 
118  for (i = 0; i < numtowners; i++) {
119  if (towner[i]._ttype == t)
120  return i;
121  }
122 
123  return -1;
124 }
125 
126 void SetTownerGPtrs(BYTE *pData, BYTE **pAnim)
127 {
128  int i;
129  DWORD *pFrameTable;
130 
131  pFrameTable = (DWORD *)pData;
132 
133  for (i = 0; i < 8; i++) {
134  pAnim[i] = CelGetFrameStart(pData, i);
135  }
136 }
137 
138 void NewTownerAnim(int tnum, BYTE *pAnim, int numFrames, int Delay)
139 {
140  towner[tnum]._tAnimData = pAnim;
141  towner[tnum]._tAnimLen = numFrames;
142  towner[tnum]._tAnimFrame = 1;
143  towner[tnum]._tAnimCnt = 0;
144  towner[tnum]._tAnimDelay = Delay;
145 }
146 
147 void InitTownerInfo(int i, int w, int sel, int t, int x, int y, int ao, int tp)
148 {
149  memset(&towner[i], 0, sizeof(TownerStruct));
150  towner[i]._tSelFlag = sel;
151  towner[i]._tAnimWidth = w;
152  towner[i]._tAnimWidth2 = (w - 64) >> 1;
153  towner[i]._tMsgSaid = FALSE;
154  towner[i]._ttype = t;
155  towner[i]._tx = x;
156  towner[i]._ty = y;
157  dMonster[x][y] = i + 1;
158  towner[i]._tAnimOrder = ao;
159  towner[i]._tTenPer = tp;
160  towner[i]._tSeed = GetRndSeed();
161 }
162 
163 void InitQstSnds(int i)
164 {
165  int j, tl;
166  tl = i;
167  if (boyloadflag)
168  tl++;
169  for (j = 0; j < MAXQUESTS; j++) {
170  towner[i].qsts[j]._qsttype = quests[j]._qtype;
171  towner[i].qsts[j]._qstmsg = ((int *)(Qtalklist + tl))[j];
172  if (((int *)(Qtalklist + tl))[j] != -1)
173  towner[i].qsts[j]._qstmsgact = TRUE;
174  else
175  towner[i].qsts[j]._qstmsgact = FALSE;
176  }
177 }
178 
179 void InitSmith()
180 {
181  int i;
182 
183  InitTownerInfo(numtowners, 96, 1, TOWN_SMITH, 62, 63, 0, 10);
185  towner[numtowners]._tNData = LoadFileInMem("Towners\\Smith\\SmithN.CEL", NULL);
186  for (i = 0; i < 8; i++) {
188  }
190  NewTownerAnim(numtowners, towner[numtowners]._tNAnim[DIR_SW], towner[numtowners]._tNFrames, 3);
191  strcpy(towner[numtowners]._tName, "Griswold the Blacksmith");
192  numtowners++;
193 }
194 
196 {
197  int i;
198 
199  bannerflag = FALSE; // unused
200  InitTownerInfo(numtowners, 96, 1, TOWN_TAVERN, 55, 62, 3, 10);
202  towner[numtowners]._tNData = LoadFileInMem("Towners\\TwnF\\TwnFN.CEL", NULL);
203  for (i = 0; i < 8; i++) {
205  }
207  NewTownerAnim(numtowners, towner[numtowners]._tNAnim[DIR_SW], towner[numtowners]._tNFrames, 3);
208  strcpy(towner[numtowners]._tName, "Ogden the Tavern owner");
209  numtowners++;
210 }
211 
213 {
214  int i;
215 
216  InitTownerInfo(numtowners, 96, 1, TOWN_DEADGUY, 24, 32, -1, 10);
218  towner[numtowners]._tNData = LoadFileInMem("Towners\\Butch\\Deadguy.CEL", NULL);
219  for (i = 0; i < 8; i++) {
221  }
223  NewTownerAnim(numtowners, towner[numtowners]._tNAnim[DIR_N], towner[numtowners]._tNFrames, 6);
224  strcpy(towner[numtowners]._tName, "Wounded Townsman");
225  numtowners++;
226 }
227 
228 void InitWitch()
229 {
230  int i;
231 
232  InitTownerInfo(numtowners, 96, 1, TOWN_WITCH, 80, 20, 5, 10);
234  towner[numtowners]._tNData = LoadFileInMem("Towners\\TownWmn1\\Witch.CEL", NULL);
235  for (i = 0; i < 8; i++) {
237  }
239  NewTownerAnim(numtowners, towner[numtowners]._tNAnim[DIR_S], towner[numtowners]._tNFrames, 6);
240  strcpy(towner[numtowners]._tName, "Adria the Witch");
241  numtowners++;
242 }
243 
245 {
246  int i;
247 
248  InitTownerInfo(numtowners, 96, 1, TOWN_BMAID, 43, 66, -1, 10);
250  towner[numtowners]._tNData = LoadFileInMem("Towners\\TownWmn1\\WmnN.CEL", NULL);
251  for (i = 0; i < 8; i++) {
253  }
255  NewTownerAnim(numtowners, towner[numtowners]._tNAnim[DIR_S], towner[numtowners]._tNFrames, 6);
256  strcpy(towner[numtowners]._tName, "Gillian the Barmaid");
257  numtowners++;
258 }
259 
260 void InitBoy()
261 {
262  int i;
263 
264  boyloadflag = TRUE;
265  InitTownerInfo(numtowners, 96, 1, TOWN_PEGBOY, 11, 53, -1, 10);
267  towner[numtowners]._tNData = LoadFileInMem("Towners\\TownBoy\\PegKid1.CEL", NULL);
268  for (i = 0; i < 8; i++) {
270  }
272  NewTownerAnim(numtowners, towner[numtowners]._tNAnim[DIR_S], towner[numtowners]._tNFrames, 6);
273  strcpy(towner[numtowners]._tName, "Wirt the Peg-legged boy");
274  numtowners++;
275 }
276 
278 {
279  int i;
280 
281  InitTownerInfo(numtowners, 96, 1, TOWN_HEALER, 55, 79, 1, 10);
283  towner[numtowners]._tNData = LoadFileInMem("Towners\\Healer\\Healer.CEL", NULL);
284  for (i = 0; i < 8; i++) {
286  }
288  NewTownerAnim(numtowners, towner[numtowners]._tNAnim[DIR_SE], towner[numtowners]._tNFrames, 6);
289  strcpy(towner[numtowners]._tName, "Pepin the Healer");
290  numtowners++;
291 }
292 
294 {
295  int i;
296 
297  InitTownerInfo(numtowners, 96, 1, TOWN_STORY, 62, 71, 2, 10);
299  towner[numtowners]._tNData = LoadFileInMem("Towners\\Strytell\\Strytell.CEL", NULL);
300  for (i = 0; i < 8; i++) {
302  }
304  NewTownerAnim(numtowners, towner[numtowners]._tNAnim[DIR_S], towner[numtowners]._tNFrames, 3);
305  strcpy(towner[numtowners]._tName, "Cain the Elder");
306  numtowners++;
307 }
308 
309 void InitDrunk()
310 {
311  int i;
312 
313  InitTownerInfo(numtowners, 96, 1, TOWN_DRUNK, 71, 84, 4, 10);
315  towner[numtowners]._tNData = LoadFileInMem("Towners\\Drunk\\TwnDrunk.CEL", NULL);
316  for (i = 0; i < 8; i++) {
318  }
320  NewTownerAnim(numtowners, towner[numtowners]._tNAnim[DIR_S], towner[numtowners]._tNFrames, 3);
321  strcpy(towner[numtowners]._tName, "Farnham the Drunk");
322  numtowners++;
323 }
324 
325 void InitCows()
326 {
327  int i, dir;
328  int x, y, xo, yo;
329 
330  //if ( pCowCels )
331  // assertion_failed(__LINE__, __FILE__, "! pCowCels");
332  pCowCels = LoadFileInMem("Towners\\Animals\\Cow.CEL", NULL);
333  for (i = 0; i < 3; i++) {
334  x = TownCowX[i];
335  y = TownCowY[i];
336  dir = TownCowDir[i];
337  InitTownerInfo(numtowners, 128, 0, TOWN_COW, TownCowX[i], TownCowY[i], -1, 10);
339  SetTownerGPtrs(towner[numtowners]._tNData, towner[numtowners]._tNAnim);
341  NewTownerAnim(numtowners, towner[numtowners]._tNAnim[dir], towner[numtowners]._tNFrames, 3);
342  towner[numtowners]._tAnimFrame = random_(0, 11) + 1;
344  strcpy(towner[numtowners]._tName, "Cow");
345 
346  xo = x + cowoffx[dir];
347  yo = y + cowoffy[dir];
348  if (!dMonster[x][yo])
349  dMonster[x][yo] = -(numtowners + 1);
350  if (!dMonster[xo][y])
351  dMonster[xo][y] = -(numtowners + 1);
352  if (!dMonster[xo][yo])
353  dMonster[xo][yo] = -(numtowners + 1);
354 
355  numtowners++;
356  }
357 }
358 
360 {
361  numtowners = 0;
362  boyloadflag = FALSE;
363  InitSmith();
364  InitHealer();
365  if (quests[Q_BUTCHER]._qactive && quests[Q_BUTCHER]._qactive != QUEST_DONE)
366  InitTownDead();
367  InitBarOwner();
368  InitTeller();
369  InitDrunk();
370  InitWitch();
371  InitBarmaid();
372  InitBoy();
373  InitCows();
374 }
375 
377 {
378  int i;
379 
380  for (i = 0; i < 16; i++) {
381  if (towner[i]._tNData == pCowCels) {
382  towner[i]._tNData = NULL;
383  } else if (towner[i]._tNData) {
384  MemFreeDbg(towner[i]._tNData);
385  }
386  }
387 
389 }
390 
391 void TownCtrlMsg(int i)
392 {
393  int p;
394  int dx, dy;
395 
396  if (towner[i]._tbtcnt) {
397  p = towner[i]._tVar1;
398  dx = abs(towner[i]._tx - plr[p].WorldX);
399  dy = abs(towner[i]._ty - plr[p].WorldY);
400  if (dx >= 2 || dy >= 2)
401  towner[i]._tbtcnt = 0;
402  if (!towner[i]._tbtcnt) {
403  qtextflag = FALSE;
404  stream_stop();
405  }
406  }
407 }
408 
410 {
411  int i;
412 
414  TownCtrlMsg(i);
415 }
416 
418 {
419  int i;
420 
422  TownCtrlMsg(i);
423 }
424 
425 void TownDead()
426 {
427  int tidx;
428 
430  TownCtrlMsg(tidx);
431  if (!qtextflag) {
432  if ((quests[Q_BUTCHER]._qactive != QUEST_ACTIVE || quests[Q_BUTCHER]._qlog) && quests[Q_BUTCHER]._qactive != QUEST_INIT) {
433  towner[tidx]._tAnimDelay = 1000;
434  towner[tidx]._tAnimFrame = 1;
435  strcpy(towner[tidx]._tName, "Slain Townsman");
436  } else {
437  return;
438  }
439  }
440  if (quests[Q_BUTCHER]._qactive != QUEST_INIT)
441  towner[tidx]._tAnimCnt = 0;
442 }
443 
445 {
446  int i;
447 
449  TownCtrlMsg(i);
450 }
451 
452 void TownStory()
453 {
454  int i;
455 
457  TownCtrlMsg(i);
458 }
459 
460 void TownDrunk()
461 {
462  int i;
463 
465  TownCtrlMsg(i);
466 }
467 
468 void TownBoy()
469 {
470  int i;
471 
473  TownCtrlMsg(i);
474 }
475 
476 void TownWitch()
477 {
478  int i;
479 
481  TownCtrlMsg(i);
482 }
483 
485 {
486  int i;
487 
489  TownCtrlMsg(i);
490 }
491 
492 void TownCow()
493 {
494  int i;
495 
497  TownCtrlMsg(i);
498 }
499 
501 {
502  int i, ao;
503 
504  for (i = 0; i < 16; i++) {
505  switch (towner[i]._ttype) {
506  case TOWN_SMITH:
507  TownBlackSmith();
508  break;
509  case TOWN_HEALER:
510  TownHealer();
511  break;
512  case TOWN_DEADGUY:
513  TownDead();
514  break;
515  case TOWN_TAVERN:
516  TownBarOwner();
517  break;
518  case TOWN_STORY:
519  TownStory();
520  break;
521  case TOWN_DRUNK:
522  TownDrunk();
523  break;
524  case TOWN_WITCH:
525  TownWitch();
526  break;
527  case TOWN_BMAID:
528  TownBarMaid();
529  break;
530  case TOWN_PEGBOY:
531  TownBoy();
532  break;
533  case TOWN_COW:
534  TownCow();
535  break;
536  }
537 
538  towner[i]._tAnimCnt++;
539  if (towner[i]._tAnimCnt >= towner[i]._tAnimDelay) {
540  towner[i]._tAnimCnt = 0;
541 
542  if (towner[i]._tAnimOrder >= 0) {
543  ao = towner[i]._tAnimOrder;
544  towner[i]._tAnimFrameCnt++;
545  if (AnimOrder[ao][towner[i]._tAnimFrameCnt] == -1)
546  towner[i]._tAnimFrameCnt = 0;
547 
549  } else {
550  towner[i]._tAnimFrame++;
551  if (towner[i]._tAnimFrame > towner[i]._tAnimLen)
552  towner[i]._tAnimFrame = 1;
553  }
554  }
555  }
556 }
557 
558 ItemStruct *PlrHasItem(int pnum, int item, int *i)
559 {
560  for (*i = 0; *i < plr[pnum]._pNumInv; (*i)++) {
561  if (plr[pnum].InvList[*i].IDidx == item)
562  return &plr[pnum].InvList[*i];
563  }
564 
565  return NULL;
566 }
567 
568 void TownerTalk(int first, int t)
569 {
570  sgdwCowClicks = 0;
571  sgnCowMsg = 0;
572  storeflag = TRUE;
573  InitQTextMsg(first);
574 }
575 
576 void TalkToTowner(int p, int t)
577 {
578  int i, dx, dy, rv1, rv2, rv3;
579  ItemStruct *Item;
580 
581  rv1 = random_(6, 3); /* unused */
582  rv2 = random_(6, 4); /* unused */
583  rv3 = random_(6, 5); /* unused */
584 
585  dx = abs(plr[p].WorldX - towner[t]._tx);
586  dy = abs(plr[p].WorldY - towner[t]._ty);
587 #ifdef _DEBUG
588  if (!debug_mode_key_d && (dx >= 2 || dy >= 2)) {
589  return;
590  }
591 #else
592  if (dx >= 2 || dy >= 2) {
593  return;
594  }
595 #endif
596 
597  if (qtextflag) {
598  return;
599  }
600 
601  towner[t]._tMsgSaid = FALSE;
602 
604  return;
605  }
606 
607  if (t == GetActiveTowner(TOWN_TAVERN)) {
608  if (!plr[p]._pLvlVisited[0] && !towner[t]._tMsgSaid) {
609  towner[t]._tbtcnt = 150;
610  towner[t]._tVar1 = p;
612  towner[t]._tMsgSaid = TRUE;
613  }
614  if ((plr[p]._pLvlVisited[2] || plr[p]._pLvlVisited[4]) && quests[Q_SKELKING]._qactive != QUEST_NOTAVAIL) {
615  if (quests[Q_SKELKING]._qvar2 == 0 && !towner[t]._tMsgSaid) {
616  quests[Q_SKELKING]._qvar2 = 1;
617  quests[Q_SKELKING]._qlog = TRUE;
618  if (quests[Q_SKELKING]._qactive == QUEST_INIT) {
620  quests[Q_SKELKING]._qvar1 = 1;
621  }
622  towner[t]._tbtcnt = 150;
623  towner[t]._tVar1 = p;
625  towner[t]._tMsgSaid = TRUE;
627  }
628  if (quests[Q_SKELKING]._qactive == QUEST_DONE && quests[Q_SKELKING]._qvar2 == 1 && !towner[t]._tMsgSaid) {
629  quests[Q_SKELKING]._qvar2 = 2;
630  quests[Q_SKELKING]._qvar1 = 2;
631  towner[t]._tbtcnt = 150;
632  towner[t]._tVar1 = p;
634  towner[t]._tMsgSaid = TRUE;
636  }
637  }
638  if (gbMaxPlayers == 1 && plr[p]._pLvlVisited[3] && quests[Q_LTBANNER]._qactive != QUEST_NOTAVAIL) {
639  if ((quests[Q_LTBANNER]._qactive == QUEST_INIT || quests[Q_LTBANNER]._qactive == QUEST_ACTIVE) && quests[Q_LTBANNER]._qvar2 == 0 && !towner[t]._tMsgSaid) {
640  quests[Q_LTBANNER]._qvar2 = 1;
641  if (quests[Q_LTBANNER]._qactive == QUEST_INIT) {
642  quests[Q_LTBANNER]._qvar1 = 1;
644  }
645  quests[Q_LTBANNER]._qlog = TRUE;
646  towner[t]._tbtcnt = 150;
647  towner[t]._tVar1 = p;
649  towner[t]._tMsgSaid = TRUE;
650  }
651  if (quests[Q_LTBANNER]._qvar2 == 1 && PlrHasItem(p, IDI_BANNER, &i) != NULL && !towner[t]._tMsgSaid) {
653  quests[Q_LTBANNER]._qvar1 = 3;
654  RemoveInvItem(p, i);
655  CreateItem(UITEM_HARCREST, towner[t]._tx, towner[t]._ty + 1);
656  towner[t]._tbtcnt = 150;
657  towner[t]._tVar1 = p;
659  towner[t]._tMsgSaid = TRUE;
660  }
661  }
662  if (!qtextflag) {
664  if (storeflag) {
666  }
667  }
668  } else if (t == GetActiveTowner(TOWN_DEADGUY)) {
669  if (quests[Q_BUTCHER]._qactive == QUEST_ACTIVE && quests[Q_BUTCHER]._qvar1 == 1) {
670  towner[t]._tbtcnt = 150;
671  towner[t]._tVar1 = p;
672  quests[Q_BUTCHER]._qvar1 = 1;
673 #ifndef SPAWN
674  if (plr[p]._pClass == PC_WARRIOR && !effect_is_playing(PS_WARR8)) {
675  PlaySFX(PS_WARR8);
676  } else if (plr[p]._pClass == PC_ROGUE && !effect_is_playing(PS_ROGUE8)) {
678  } else if (plr[p]._pClass == PC_SORCERER && !effect_is_playing(PS_MAGE8)) {
679  PlaySFX(PS_MAGE8);
680  }
681 #endif
682  towner[t]._tMsgSaid = TRUE;
683  } else if (quests[Q_BUTCHER]._qactive == QUEST_DONE && quests[Q_BUTCHER]._qvar1 == 1) {
684  quests[Q_BUTCHER]._qvar1 = 1;
685  towner[t]._tbtcnt = 150;
686  towner[t]._tVar1 = p;
687  towner[t]._tMsgSaid = TRUE;
688  } else if (quests[Q_BUTCHER]._qactive == QUEST_INIT || quests[Q_BUTCHER]._qactive == QUEST_ACTIVE && quests[Q_BUTCHER]._qvar1 == 0) {
690  quests[Q_BUTCHER]._qlog = TRUE;
692  quests[Q_BUTCHER]._qvar1 = 1;
693  towner[t]._tbtcnt = 50;
694  towner[t]._tVar1 = p;
695  towner[t]._tVar2 = 3;
697  towner[t]._tMsgSaid = TRUE;
698  NetSendCmdQuest(TRUE, Q_BUTCHER);
699  }
700  } else if (t == GetActiveTowner(TOWN_SMITH)) {
701  if (gbMaxPlayers == 1) {
702  if (plr[p]._pLvlVisited[4] && quests[Q_ROCK]._qactive != QUEST_NOTAVAIL) {
703  if (quests[Q_ROCK]._qvar2 == 0) {
704  quests[Q_ROCK]._qvar2 = 1;
705  quests[Q_ROCK]._qlog = TRUE;
706  if (quests[Q_ROCK]._qactive == QUEST_INIT) {
708  quests[Q_ROCK]._qvar1 = 1;
709  }
710  towner[t]._tbtcnt = 150;
711  towner[t]._tVar1 = p;
713  towner[t]._tMsgSaid = TRUE;
714  }
715  if (quests[Q_ROCK]._qvar2 == 1 && PlrHasItem(p, IDI_ROCK, &i) != NULL && !towner[t]._tMsgSaid) {
717  quests[Q_ROCK]._qvar2 = 2;
718  quests[Q_ROCK]._qvar1 = 2;
719  RemoveInvItem(p, i);
720  CreateItem(UITEM_INFRARING, towner[t]._tx, towner[t]._ty + 1);
721  towner[t]._tbtcnt = 150;
722  towner[t]._tVar1 = p;
724  towner[t]._tMsgSaid = TRUE;
725  }
726  }
727  if (plr[p]._pLvlVisited[9] && quests[Q_ANVIL]._qactive != QUEST_NOTAVAIL) {
728  if ((quests[Q_ANVIL]._qactive == QUEST_INIT || quests[Q_ANVIL]._qactive == QUEST_ACTIVE) && quests[Q_ANVIL]._qvar2 == 0 && !towner[t]._tMsgSaid) {
729  if (quests[Q_ROCK]._qvar2 == 2 || quests[Q_ROCK]._qactive == QUEST_ACTIVE && quests[Q_ROCK]._qvar2 == 1) {
730  quests[Q_ANVIL]._qvar2 = 1;
731  quests[Q_ANVIL]._qlog = TRUE;
732  if (quests[Q_ANVIL]._qactive == QUEST_INIT) {
734  quests[Q_ANVIL]._qvar1 = 1;
735  }
736  towner[t]._tbtcnt = 150;
737  towner[t]._tVar1 = p;
739  towner[t]._tMsgSaid = TRUE;
740  }
741  }
742  if (quests[Q_ANVIL]._qvar2 == 1 && PlrHasItem(p, IDI_ANVIL, &i) != NULL) {
743  if (!towner[t]._tMsgSaid) {
745  quests[Q_ANVIL]._qvar2 = 2;
746  quests[Q_ANVIL]._qvar1 = 2;
747  RemoveInvItem(p, i);
748  CreateItem(UITEM_GRISWOLD, towner[t]._tx, towner[t]._ty + 1);
749  towner[t]._tbtcnt = 150;
750  towner[t]._tVar1 = p;
752  towner[t]._tMsgSaid = TRUE;
753  }
754  }
755  }
756  }
757  if (!qtextflag) {
759  if (storeflag) {
761  }
762  }
763  } else if (t == GetActiveTowner(TOWN_WITCH)) {
764  if (quests[Q_MUSHROOM]._qactive == QUEST_INIT && PlrHasItem(p, IDI_FUNGALTM, &i) != NULL) {
765  RemoveInvItem(p, i);
767  quests[Q_MUSHROOM]._qlog = TRUE;
768  quests[Q_MUSHROOM]._qvar1 = 2;
769  towner[t]._tbtcnt = 150;
770  towner[t]._tVar1 = p;
772  towner[t]._tMsgSaid = TRUE;
773  } else if (quests[Q_MUSHROOM]._qactive == QUEST_ACTIVE) {
774  if (quests[Q_MUSHROOM]._qvar1 >= 2 && quests[Q_MUSHROOM]._qvar1 <= 4) {
775  if (PlrHasItem(p, IDI_MUSHROOM, &i) != NULL) {
776  RemoveInvItem(p, i);
777  quests[Q_MUSHROOM]._qvar1 = 5;
780  towner[t]._tbtcnt = 150;
781  towner[t]._tVar1 = p;
784  towner[t]._tMsgSaid = TRUE;
785  } else if (quests[Q_MUSHROOM]._qmsg != TEXT_MUSH9) {
786  towner[t]._tbtcnt = 150;
787  towner[t]._tVar1 = p;
790  towner[t]._tMsgSaid = TRUE;
791  }
792  } else {
793  Item = PlrHasItem(p, IDI_SPECELIX, &i);
794  if (Item != NULL) {
795  towner[t]._tbtcnt = 150;
796  towner[t]._tVar1 = p;
799  towner[t]._tMsgSaid = TRUE;
800  AllItemsList[Item->IDidx].iUsable = TRUE;
801  } else if (PlrHasItem(p, IDI_BRAIN, &i) != NULL && quests[Q_MUSHROOM]._qvar2 != TEXT_MUSH11) {
802  towner[t]._tbtcnt = 150;
803  towner[t]._tVar1 = p;
806  towner[t]._tMsgSaid = TRUE;
807  }
808  }
809  }
810  if (!qtextflag) {
812  if (storeflag) {
814  }
815  }
816  } else if (t == GetActiveTowner(TOWN_BMAID)) {
817  if (!qtextflag) {
819  if (storeflag) {
821  }
822  }
823  } else if (t == GetActiveTowner(TOWN_DRUNK)) {
824  if (!qtextflag) {
826  if (storeflag) {
828  }
829  }
830  } else if (t == GetActiveTowner(TOWN_HEALER)) {
831  if (gbMaxPlayers == 1) {
832  if (plr[p]._pLvlVisited[1] && !towner[t]._tMsgSaid) {
833  if (quests[Q_PWATER]._qactive == QUEST_INIT) {
835  quests[Q_PWATER]._qlog = TRUE;
837  quests[Q_PWATER]._qvar1 = 1;
838  towner[t]._tbtcnt = 150;
839  towner[t]._tVar1 = p;
841  towner[t]._tMsgSaid = TRUE;
842  } else if (quests[Q_PWATER]._qactive == QUEST_DONE && quests[Q_PWATER]._qvar1 != 2) {
843  quests[Q_PWATER]._qvar1 = 2;
844  towner[t]._tbtcnt = 150;
845  towner[t]._tVar1 = p;
847  CreateItem(UITEM_TRING, towner[t]._tx, towner[t]._ty + 1);
848  towner[t]._tMsgSaid = TRUE;
849  }
850  }
851  if (quests[Q_MUSHROOM]._qactive == QUEST_ACTIVE && quests[Q_MUSHROOM]._qmsg == TEXT_MUSH10 && PlrHasItem(p, IDI_BRAIN, &i) != NULL) {
852  RemoveInvItem(p, i);
853  SpawnQuestItem(IDI_SPECELIX, towner[t]._tx, towner[t]._ty + 1, 0, 0);
855  quests[Q_MUSHROOM]._qvar1 = 7;
857  }
858  }
859  if (!qtextflag) {
861  if (storeflag) {
863  }
864  }
865  } else if (t == GetActiveTowner(TOWN_PEGBOY)) {
866  if (!qtextflag) {
868  if (storeflag) {
870  }
871  }
872  } else if (t == GetActiveTowner(TOWN_STORY)) {
873  if (gbMaxPlayers == 1) {
874  if (quests[Q_BETRAYER]._qactive == QUEST_INIT && PlrHasItem(p, IDI_LAZSTAFF, &i) != NULL) {
875  RemoveInvItem(p, i);
876  quests[Q_BETRAYER]._qvar1 = 2;
877  towner[t]._tbtcnt = 150;
878  towner[t]._tVar1 = p;
881  quests[Q_BETRAYER]._qlog = TRUE;
882  towner[t]._tMsgSaid = TRUE;
883  } else if (quests[Q_BETRAYER]._qactive == QUEST_DONE && quests[Q_BETRAYER]._qvar1 == 7) {
884  quests[Q_BETRAYER]._qvar1 = 8;
885  towner[t]._tbtcnt = 150;
886  towner[t]._tVar1 = p;
888  quests[Q_DIABLO]._qlog = TRUE;
889  towner[t]._tMsgSaid = TRUE;
890  }
891  }
892  if (gbMaxPlayers != 1) {
893  if (quests[Q_BETRAYER]._qactive == QUEST_ACTIVE && !quests[Q_BETRAYER]._qlog) {
894  towner[t]._tbtcnt = 150;
895  towner[t]._tVar1 = p;
897  towner[t]._tMsgSaid = TRUE;
898  quests[Q_BETRAYER]._qlog = TRUE;
900  } else if (quests[Q_BETRAYER]._qactive == QUEST_DONE && quests[Q_BETRAYER]._qvar1 == 7) {
901  quests[Q_BETRAYER]._qvar1 = 8;
902  towner[t]._tbtcnt = 150;
903  towner[t]._tVar1 = p;
905  towner[t]._tMsgSaid = TRUE;
907  quests[Q_DIABLO]._qlog = TRUE;
908  NetSendCmdQuest(TRUE, Q_DIABLO);
909  }
910  }
911  if (!qtextflag) {
913  if (storeflag) {
915  }
916  }
917  } else if (towner[t]._ttype == TOWN_COW && !qtextflag) {
918  CowSFX(p);
919  }
920 }
921 
922 void CowSFX(int pnum)
923 {
924  if (CowPlaying == -1 || !effect_is_playing(CowPlaying)) {
925  sgdwCowClicks++;
926 #ifdef SPAWN
927  if (sgdwCowClicks == 4) {
928  sgdwCowClicks = 0;
930  } else {
932  }
933 #else
934  if (sgdwCowClicks >= 8) {
935  PlaySfxLoc(TSFX_COW1, plr[pnum].WorldX, plr[pnum].WorldY + 5);
936  sgdwCowClicks = 4;
937  CowPlaying = snSFX[sgnCowMsg][plr[pnum]._pClass]; /* snSFX is local */
938  sgnCowMsg++;
939  if (sgnCowMsg >= 3)
940  sgnCowMsg = 0;
941  } else {
943  }
944 #endif
945  PlaySfxLoc(CowPlaying, plr[pnum].WorldX, plr[pnum].WorldY);
946  }
947 }
948 
TOWN_DRUNK
@ TOWN_DRUNK
Definition: enums.h:2276
TNQ::_qstmsgact
BOOLEAN _qstmsgact
Definition: structs.h:1043
TownerStruct::qsts
TNQ qsts[MAXQUESTS]
Definition: structs.h:1070
TownerStruct::_tx
int _tx
Definition: structs.h:1049
TEXT_VEIL2
@ TEXT_VEIL2
Definition: enums.h:1621
TOWN_STORY
@ TOWN_STORY
Definition: enums.h:2275
TownerStruct::_tNFrames
int _tNFrames
Definition: structs.h:1078
TEXT_KING8
@ TEXT_KING8
Definition: enums.h:1554
sgdwCowClicks
DWORD sgdwCowClicks
Definition: towners.cpp:8
quests
QuestStruct quests[MAXQUESTS]
Definition: quests.cpp:8
Q_ANVIL
@ Q_ANVIL
Definition: enums.h:2558
TEXT_VILE3
@ TEXT_VILE3
Definition: enums.h:1572
TownerStruct::_tNData
unsigned char * _tNData
Definition: structs.h:1079
TownerStruct::_tAnimDelay
int _tAnimDelay
Definition: structs.h:1057
PS_MAGE50
@ PS_MAGE50
Definition: enums.h:861
TOWN_HEALER
@ TOWN_HEALER
Definition: enums.h:2272
TEXT_ANVIL4
@ TEXT_ANVIL4
Definition: enums.h:1634
IDI_FUNGALTM
@ IDI_FUNGALTM
Definition: enums.h:2519
TEXT_OGDEN1
@ TEXT_OGDEN1
Definition: enums.h:1707
TownerStruct::_tAnimData
unsigned char * _tAnimData
Definition: structs.h:1056
TEXT_WARLRD7
@ TEXT_WARLRD7
Definition: enums.h:1655
Q_BUTCHER
@ Q_BUTCHER
Definition: enums.h:2554
TEXT_MUSH6
@ TEXT_MUSH6
Definition: enums.h:1673
STORE_WITCH
@ STORE_WITCH
Definition: enums.h:2590
TEXT_VILE4
@ TEXT_VILE4
Definition: enums.h:1573
TownBarMaid
void TownBarMaid()
Definition: towners.cpp:484
Qtalklist
QuestTalkData Qtalklist[11]
Definition: towners.cpp:96
TEXT_POISON4
@ TEXT_POISON4
Definition: enums.h:1587
InitTeller
void InitTeller()
Definition: towners.cpp:293
Q_MUSHROOM
@ Q_MUSHROOM
Definition: enums.h:2549
TEXT_VEIL6
@ TEXT_VEIL6
Definition: enums.h:1625
TownDead
void TownDead()
Definition: towners.cpp:425
TEXT_ANVIL10
@ TEXT_ANVIL10
Definition: enums.h:1640
PS_WARR52
@ PS_WARR52
Definition: enums.h:1076
effect_is_playing
BOOL effect_is_playing(int nSFX)
Definition: effects.cpp:920
CelGetFrameStart
BYTE * CelGetFrameStart(BYTE *pCelBuff, int nCel)
Definition: engine.h:30
TownBarOwner
void TownBarOwner()
Definition: towners.cpp:417
TEXT_ANVIL6
@ TEXT_ANVIL6
Definition: enums.h:1636
pCowCels
BYTE * pCowCels
Definition: towners.cpp:12
TEXT_BUTCH2
@ TEXT_BUTCH2
Definition: enums.h:1603
TSFX_COW1
@ TSFX_COW1
Definition: enums.h:525
TEXT_BLOOD7
@ TEXT_BLOOD7
Definition: enums.h:1647
TEXT_VILE7
@ TEXT_VILE7
Definition: enums.h:1576
TEXT_WIRT1
@ TEXT_WIRT1
Definition: enums.h:1771
TownerStruct::_ty
int _ty
Definition: structs.h:1050
TownerStruct::_tAnimCnt
int _tAnimCnt
Definition: structs.h:1058
PlayerStruct::_pNumInv
int _pNumInv
Definition: structs.h:315
TEXT_INFRA3
@ TEXT_INFRA3
Definition: enums.h:1660
STORE_HEALER
@ STORE_HEALER
Definition: enums.h:2599
TEXT_WARLRD4
@ TEXT_WARLRD4
Definition: enums.h:1652
UITEM_GRISWOLD
@ UITEM_GRISWOLD
Definition: enums.h:2620
StartStore
void StartStore(char s)
Definition: stores.cpp:1408
cowoffy
int cowoffy[8]
Definition: towners.cpp:95
TEXT_VEIL8
@ TEXT_VEIL8
Definition: enums.h:1627
item
ItemStruct item[MAXITEMS+1]
Definition: items.cpp:15
PS_WARR49
@ PS_WARR49
Definition: enums.h:1073
TEXT_INFRA1
@ TEXT_INFRA1
Definition: enums.h:1658
QuestTalkData
Definition: structs.h:1082
IDI_MUSHROOM
@ IDI_MUSHROOM
Definition: enums.h:2517
stream_stop
void stream_stop()
Definition: effects.cpp:932
TEXT_BLIND3
@ TEXT_BLIND3
Definition: enums.h:1614
AllItemsList
DEVILUTION_BEGIN_NAMESPACE ItemDataStruct AllItemsList[]
Contains the data related to each item ID.
Definition: itemdat.cpp:11
TEXT_INFRA4
@ TEXT_INFRA4
Definition: enums.h:1661
TEXT_BUTCH9
@ TEXT_BUTCH9
Definition: enums.h:1610
DIR_N
@ DIR_N
Definition: enums.h:2086
STORE_SMITH
@ STORE_SMITH
Definition: enums.h:2586
TEXT_BONE1
@ TEXT_BONE1
Definition: enums.h:1594
TownerStruct::_tAnimOrder
char _tAnimOrder
Definition: structs.h:1062
PS_ROGUE52
@ PS_ROGUE52
Definition: enums.h:966
InitTowners
void InitTowners()
Definition: towners.cpp:359
TOWN_TAVERN
@ TOWN_TAVERN
Definition: enums.h:2274
PS_MAGE8
@ PS_MAGE8
Definition: enums.h:819
TownBoy
void TownBoy()
Definition: towners.cpp:468
TEXT_BLOOD4
@ TEXT_BLOOD4
Definition: enums.h:1644
TEXT_ANVIL2
@ TEXT_ANVIL2
Definition: enums.h:1632
PlayerStruct::InvList
ItemStruct InvList[NUM_INV_GRID_ELEM]
Definition: structs.h:314
TEXT_MUSH13
@ TEXT_MUSH13
Definition: enums.h:1680
MemFreeDbg
#define MemFreeDbg(p)
Definition: defs.h:157
InitHealer
void InitHealer()
Definition: towners.cpp:277
TEXT_BLIND8
@ TEXT_BLIND8
Definition: enums.h:1619
InitQstSnds
void InitQstSnds(int i)
Definition: towners.cpp:163
TEXT_VEIL3
@ TEXT_VEIL3
Definition: enums.h:1622
TEXT_GILLIAN1
@ TEXT_GILLIAN1
Definition: enums.h:1726
storeflag
DEVILUTION_BEGIN_NAMESPACE BOOL storeflag
Definition: towners.cpp:5
towner
TownerStruct towner[16]
Definition: towners.cpp:13
InitCows
void InitCows()
Definition: towners.cpp:325
TEXT_POISON6
@ TEXT_POISON6
Definition: enums.h:1589
TEXT_BUTCH3
@ TEXT_BUTCH3
Definition: enums.h:1604
TownerStruct::_tAnimFrame
int _tAnimFrame
Definition: structs.h:1060
TEXT_MUSH2
@ TEXT_MUSH2
Definition: enums.h:1669
STORE_TAVERN
@ STORE_TAVERN
Definition: enums.h:2606
IDI_BRAIN
@ IDI_BRAIN
Definition: enums.h:2518
TSFX_COW2
@ TSFX_COW2
Definition: enums.h:526
PS_MAGE52
@ PS_MAGE52
Definition: enums.h:863
SpawnQuestItem
void SpawnQuestItem(int itemid, int x, int y, int randarea, int selflag)
Definition: items.cpp:2324
all.h
DIR_SE
@ DIR_SE
Definition: enums.h:2089
TEXT_MUSH5
@ TEXT_MUSH5
Definition: enums.h:1672
QuestStruct::_qactive
unsigned char _qactive
Definition: structs.h:973
TownerStruct::_ttype
int _ttype
Definition: structs.h:1048
DropItemBeforeTrig
BOOL DropItemBeforeTrig()
Definition: inv.cpp:2236
TEXT_POISON2
@ TEXT_POISON2
Definition: enums.h:1585
TownCow
void TownCow()
Definition: towners.cpp:492
InitSmith
void InitSmith()
Definition: towners.cpp:179
TEXT_BLOOD2
@ TEXT_BLOOD2
Definition: enums.h:1642
TEXT_POISON7
@ TEXT_POISON7
Definition: enums.h:1590
PS_WARR50
@ PS_WARR50
Definition: enums.h:1074
TEXT_ANVIL7
@ TEXT_ANVIL7
Definition: enums.h:1637
TEXT_BLOOD5
@ TEXT_BLOOD5
Definition: enums.h:1645
TEXT_BLIND2
@ TEXT_BLIND2
Definition: enums.h:1613
DIR_SW
@ DIR_SW
Definition: enums.h:2083
TEXT_GRISWOLD1
@ TEXT_GRISWOLD1
Definition: enums.h:1735
TownerStruct::_tAnimLen
int _tAnimLen
Definition: structs.h:1059
TEXT_BANNER7
@ TEXT_BANNER7
Definition: enums.h:1564
TEXT_VEIL1
@ TEXT_VEIL1
Definition: enums.h:1620
TEXT_ANVIL5
@ TEXT_ANVIL5
Definition: enums.h:1635
PlayerStruct::_pClass
char _pClass
Definition: structs.h:244
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
NetSendCmdQuest
void NetSendCmdQuest(BOOL bHiPri, BYTE q)
Definition: msg.cpp:737
TownerStruct::_tVar1
int _tVar1
Definition: structs.h:1072
NUM_CLASSES
@ NUM_CLASSES
Definition: enums.h:2709
Q_PWATER
@ Q_PWATER
Definition: enums.h:2561
TEXT_POISON5
@ TEXT_POISON5
Definition: enums.h:1588
TownCowX
int TownCowX[3]
Definition: towners.cpp:91
TownerStruct::_tAnimFrameCnt
int _tAnimFrameCnt
Definition: structs.h:1061
TalkToTowner
void TalkToTowner(int p, int t)
Definition: towners.cpp:576
TEXT_INFRA6
@ TEXT_INFRA6
Definition: enums.h:1663
TEXT_INFRA5
@ TEXT_INFRA5
Definition: enums.h:1662
TEXT_VILE12
@ TEXT_VILE12
Definition: enums.h:1581
TEXT_BONE4
@ TEXT_BONE4
Definition: enums.h:1597
TownCowDir
int TownCowDir[3]
Definition: towners.cpp:93
CURSOR_FIRSTITEM
@ CURSOR_FIRSTITEM
Definition: enums.h:2078
TEXT_BONE6
@ TEXT_BONE6
Definition: enums.h:1599
TEXT_BLOOD1
@ TEXT_BLOOD1
Definition: enums.h:1641
InitTownerInfo
void InitTownerInfo(int i, int w, int sel, int t, int x, int y, int ao, int tp)
Definition: towners.cpp:147
UITEM_INFRARING
@ UITEM_INFRARING
Definition: enums.h:2614
TEXT_KING6
@ TEXT_KING6
Definition: enums.h:1552
TEXT_MUSH1
@ TEXT_MUSH1
Definition: enums.h:1668
TNQ::_qsttype
unsigned char _qsttype
Definition: structs.h:1041
TEXT_BLIND7
@ TEXT_BLIND7
Definition: enums.h:1618
TEXT_PEPIN1
@ TEXT_PEPIN1
Definition: enums.h:1716
InitWitch
void InitWitch()
Definition: towners.cpp:228
Q_BETRAYER
@ Q_BETRAYER
Definition: enums.h:2563
TEXT_ANVIL8
@ TEXT_ANVIL8
Definition: enums.h:1638
TEXT_INFRA2
@ TEXT_INFRA2
Definition: enums.h:1659
DEVILUTION_END_NAMESPACE
#define DEVILUTION_END_NAMESPACE
Definition: types.h:10
IDI_SPECELIX
@ IDI_SPECELIX
Definition: enums.h:2520
GetActiveTowner
int GetActiveTowner(int t)
Definition: towners.cpp:114
TownWitch
void TownWitch()
Definition: towners.cpp:476
TownerStruct::_tVar2
int _tVar2
Definition: structs.h:1073
TEXT_KING5
@ TEXT_KING5
Definition: enums.h:1551
TEXT_MUSH4
@ TEXT_MUSH4
Definition: enums.h:1671
TEXT_KING10
@ TEXT_KING10
Definition: enums.h:1556
TEXT_MUSH8
@ TEXT_MUSH8
Definition: enums.h:1675
TownerStruct::_tbtcnt
int _tbtcnt
Definition: structs.h:1067
InitDrunk
void InitDrunk()
Definition: towners.cpp:309
TEXT_POISON3
@ TEXT_POISON3
Definition: enums.h:1586
TEXT_WARLRD3
@ TEXT_WARLRD3
Definition: enums.h:1651
TEXT_BUTCH8
@ TEXT_BUTCH8
Definition: enums.h:1609
LoadFileInMem
BYTE * LoadFileInMem(char *pszName, DWORD *pdwFileLen)
Load a file in to a buffer.
Definition: engine.cpp:801
TownerStruct::_tSeed
int _tSeed
Definition: structs.h:1071
TEXT_INFRA8
@ TEXT_INFRA8
Definition: enums.h:1665
RemoveInvItem
void RemoveInvItem(int pnum, int iv)
Definition: inv.cpp:1276
TNQ::_qstmsg
unsigned char _qstmsg
Definition: structs.h:1042
IDI_BANNER
@ IDI_BANNER
Definition: enums.h:2512
TEXT_INFRA9
@ TEXT_INFRA9
Definition: enums.h:1666
boyloadflag
BOOL boyloadflag
Definition: towners.cpp:11
TEXT_INFRA10
@ TEXT_INFRA10
Definition: enums.h:1667
PS_WARR8
@ PS_WARR8
Definition: enums.h:1025
TEXT_INTRO
@ TEXT_INTRO
Definition: enums.h:1805
TownerStruct::_tAnimWidth
int _tAnimWidth
Definition: structs.h:1063
TEXT_ANVIL1
@ TEXT_ANVIL1
Definition: enums.h:1631
TownCtrlMsg
void TownCtrlMsg(int i)
Definition: towners.cpp:391
QuestTalkData::_qblkm
int _qblkm
Definition: structs.h:1084
TEXT_BLIND1
@ TEXT_BLIND1
Definition: enums.h:1612
TownerTalk
void TownerTalk(int first, int t)
Definition: towners.cpp:568
TEXT_BUTCH5
@ TEXT_BUTCH5
Definition: enums.h:1606
QuestStruct::_qmsg
unsigned char _qmsg
Definition: structs.h:979
QUEST_DONE
@ QUEST_DONE
Definition: enums.h:2570
TownBlackSmith
void TownBlackSmith()
Definition: towners.cpp:409
GetRndSeed
int GetRndSeed()
Get the current RNG seed.
Definition: engine.cpp:739
TEXT_BUTCH1
@ TEXT_BUTCH1
Definition: enums.h:1602
QUEST_NOTAVAIL
@ QUEST_NOTAVAIL
Definition: enums.h:2567
CowSFX
void CowSFX(int pnum)
Definition: towners.cpp:922
bannerflag
BOOL bannerflag
unused 0x6AAC28
Definition: towners.cpp:10
IDI_ANVIL
@ IDI_ANVIL
Definition: enums.h:2516
TEXT_BUTCH7
@ TEXT_BUTCH7
Definition: enums.h:1608
PS_ROGUE49
@ PS_ROGUE49
Definition: enums.h:963
TEXT_FARNHAM1
@ TEXT_FARNHAM1
Definition: enums.h:1747
Q_LTBANNER
@ Q_LTBANNER
Definition: enums.h:2555
TEXT_BONE2
@ TEXT_BONE2
Definition: enums.h:1595
TEXT_ANVIL3
@ TEXT_ANVIL3
Definition: enums.h:1633
TEXT_MUSH3
@ TEXT_MUSH3
Definition: enums.h:1670
PlaySFX
void PlaySFX(int psfx)
Definition: effects.cpp:1043
TEXT_MUSH12
@ TEXT_MUSH12
Definition: enums.h:1679
TEXT_VILE11
@ TEXT_VILE11
Definition: enums.h:1580
TEXT_VILE1
@ TEXT_VILE1
Definition: enums.h:1570
UITEM_HARCREST
@ UITEM_HARCREST
Definition: enums.h:2617
TEXT_BLIND6
@ TEXT_BLIND6
Definition: enums.h:1617
Q_ROCK
@ Q_ROCK
Definition: enums.h:2548
TEXT_KING3
@ TEXT_KING3
Definition: enums.h:1549
TEXT_KING9
@ TEXT_KING9
Definition: enums.h:1555
InitQTextMsg
void InitQTextMsg(int m)
Definition: minitext.cpp:70
TEXT_BANNER4
@ TEXT_BANNER4
Definition: enums.h:1561
TEXT_BANNER9
@ TEXT_BANNER9
Definition: enums.h:1566
TEXT_WARLRD6
@ TEXT_WARLRD6
Definition: enums.h:1654
TownCowY
int TownCowY[3]
Definition: towners.cpp:92
TEXT_VILE8
@ TEXT_VILE8
Definition: enums.h:1577
MAXQUESTS
#define MAXQUESTS
Definition: defs.h:35
TEXT_BONE8
@ TEXT_BONE8
Definition: enums.h:1601
PS_ROGUE50
@ PS_ROGUE50
Definition: enums.h:964
TEXT_BLIND4
@ TEXT_BLIND4
Definition: enums.h:1615
TEXT_VILE10
@ TEXT_VILE10
Definition: enums.h:1579
TEXT_BLIND5
@ TEXT_BLIND5
Definition: enums.h:1616
TEXT_VILE9
@ TEXT_VILE9
Definition: enums.h:1578
TEXT_BONE5
@ TEXT_BONE5
Definition: enums.h:1598
TEXT_WARLRD1
@ TEXT_WARLRD1
Definition: enums.h:1649
TEXT_POISON1
@ TEXT_POISON1
Definition: enums.h:1584
TEXT_MUSH9
@ TEXT_MUSH9
Definition: enums.h:1676
SetTownerGPtrs
void SetTownerGPtrs(BYTE *pData, BYTE **pAnim)
Definition: towners.cpp:126
TEXT_INFRA7
@ TEXT_INFRA7
Definition: enums.h:1664
TEXT_MUSH11
@ TEXT_MUSH11
Definition: enums.h:1678
InitBarmaid
void InitBarmaid()
Definition: towners.cpp:244
TEXT_ADRIA1
@ TEXT_ADRIA1
Definition: enums.h:1759
TEXT_KING4
@ TEXT_KING4
Definition: enums.h:1550
PS_MAGE49
@ PS_MAGE49
Definition: enums.h:860
ItemDataStruct::iUsable
BOOL iUsable
Definition: structs.h:87
FreeTownerGFX
void FreeTownerGFX()
Definition: towners.cpp:376
TEXT_POISON10
@ TEXT_POISON10
Definition: enums.h:1593
TEXT_BONE3
@ TEXT_BONE3
Definition: enums.h:1596
PlrHasItem
ItemStruct * PlrHasItem(int pnum, int item, int *i)
Definition: towners.cpp:558
IDI_ROCK
@ IDI_ROCK
Definition: enums.h:2509
TEXT_BANNER6
@ TEXT_BANNER6
Definition: enums.h:1563
STORE_BOY
@ STORE_BOY
Definition: enums.h:2597
InitTownDead
void InitTownDead()
Definition: towners.cpp:212
DIR_S
@ DIR_S
Definition: enums.h:2082
TOWN_SMITH
@ TOWN_SMITH
Definition: enums.h:2271
TEXT_WARLRD5
@ TEXT_WARLRD5
Definition: enums.h:1653
ItemStruct::IDidx
int IDidx
Definition: structs.h:170
TEXT_MUSH7
@ TEXT_MUSH7
Definition: enums.h:1674
TEXT_BUTCH6
@ TEXT_BUTCH6
Definition: enums.h:1607
TEXT_MUSH10
@ TEXT_MUSH10
Definition: enums.h:1677
TEXT_BONE7
@ TEXT_BONE7
Definition: enums.h:1600
TOWN_DEADGUY
@ TOWN_DEADGUY
Definition: enums.h:2273
CowPlaying
int CowPlaying
Definition: towners.cpp:112
random_
int random_(BYTE idx, int v)
Main RNG function.
Definition: engine.cpp:752
AnimOrder
char AnimOrder[6][148]
Definition: towners.cpp:25
Q_SKELKING
@ Q_SKELKING
Definition: enums.h:2560
snSFX
const int snSFX[3][NUM_CLASSES]
Definition: towners.cpp:16
TownHealer
void TownHealer()
Definition: towners.cpp:444
PC_WARRIOR
@ PC_WARRIOR
Definition: enums.h:2706
NewTownerAnim
void NewTownerAnim(int tnum, BYTE *pAnim, int numFrames, int Delay)
Definition: towners.cpp:138
QUEST_ACTIVE
@ QUEST_ACTIVE
Definition: enums.h:2569
QuestStruct::_qvar1
unsigned char _qvar1
Definition: structs.h:980
TEXT_WARLRD2
@ TEXT_WARLRD2
Definition: enums.h:1650
InitBoy
void InitBoy()
Definition: towners.cpp:260
STORE_BARMAID
@ STORE_BARMAID
Definition: enums.h:2608
TEXT_VEIL7
@ TEXT_VEIL7
Definition: enums.h:1626
TownerStruct
Definition: structs.h:1046
TownerStruct::_tSelFlag
int _tSelFlag
Definition: structs.h:1068
PC_ROGUE
@ PC_ROGUE
Definition: enums.h:2707
TEXT_STORY1
@ TEXT_STORY1
Definition: enums.h:1697
pcurs
int pcurs
Definition: cursor.cpp:27
dMonster
int dMonster[MAXDUNX][MAXDUNY]
Definition: gendung.cpp:17
TownerStruct::_tTenPer
int _tTenPer
Definition: structs.h:1065
TownDrunk
void TownDrunk()
Definition: towners.cpp:460
TEXT_POISON9
@ TEXT_POISON9
Definition: enums.h:1592
PlaySfxLoc
void PlaySfxLoc(int psfx, int x, int y)
Definition: effects.cpp:1142
DEVILUTION_BEGIN_NAMESPACE
Definition: sha.cpp:10
QuestStruct::_qlog
int _qlog
Definition: structs.h:982
TEXT_KING7
@ TEXT_KING7
Definition: enums.h:1553
TEXT_BLOOD6
@ TEXT_BLOOD6
Definition: enums.h:1646
TEXT_POISON8
@ TEXT_POISON8
Definition: enums.h:1591
Q_DIABLO
@ Q_DIABLO
Definition: enums.h:2553
TEXT_BANNER5
@ TEXT_BANNER5
Definition: enums.h:1562
cowoffx
int cowoffx[8]
Definition: towners.cpp:94
TEXT_BANNER2
@ TEXT_BANNER2
Definition: enums.h:1559
TOWN_BMAID
@ TOWN_BMAID
Definition: enums.h:2278
STORE_STORY
@ STORE_STORY
Definition: enums.h:2600
TOWN_WITCH
@ TOWN_WITCH
Definition: enums.h:2277
TEXT_ANVIL9
@ TEXT_ANVIL9
Definition: enums.h:1639
ProcessTowners
void ProcessTowners()
Definition: towners.cpp:500
TEXT_KING1
@ TEXT_KING1
Definition: enums.h:1547
TEXT_WARLRD8
@ TEXT_WARLRD8
Definition: enums.h:1656
TEXT_BANNER1
@ TEXT_BANNER1
Definition: enums.h:1558
TEXT_KING2
@ TEXT_KING2
Definition: enums.h:1548
TownerStruct::_tAnimWidth2
int _tAnimWidth2
Definition: structs.h:1064
TEXT_VILE2
@ TEXT_VILE2
Definition: enums.h:1571
numtowners
int numtowners
Definition: towners.cpp:7
TEXT_BUTCH4
@ TEXT_BUTCH4
Definition: enums.h:1605
QUEST_INIT
@ QUEST_INIT
Definition: enums.h:2568
TEXT_BANNER8
@ TEXT_BANNER8
Definition: enums.h:1565
IDI_LAZSTAFF
@ IDI_LAZSTAFF
Definition: enums.h:2534
TOWN_COW
@ TOWN_COW
Definition: enums.h:2280
InitBarOwner
void InitBarOwner()
Definition: towners.cpp:195
PS_ROGUE8
@ PS_ROGUE8
Definition: enums.h:922
qtextflag
BOOLEAN qtextflag
Definition: minitext.cpp:13
TEXT_BLOOD8
@ TEXT_BLOOD8
Definition: enums.h:1648
TEXT_VEIL4
@ TEXT_VEIL4
Definition: enums.h:1623
QuestStruct::_qtype
unsigned char _qtype
Definition: structs.h:972
CreateItem
void CreateItem(int uid, int x, int y)
Definition: items.cpp:2143
QuestStruct::_qvar2
unsigned char _qvar2
Definition: structs.h:981
plr
PlayerStruct plr[MAX_PLRS]
Definition: player.cpp:10
TownerStruct::_tMsgSaid
BOOL _tMsgSaid
Definition: structs.h:1069
STORE_DRUNK
@ STORE_DRUNK
Definition: enums.h:2607
TEXT_BLOOD3
@ TEXT_BLOOD3
Definition: enums.h:1643
UITEM_TRING
@ UITEM_TRING
Definition: enums.h:2616
TEXT_BANNER3
@ TEXT_BANNER3
Definition: enums.h:1560
PC_SORCERER
@ PC_SORCERER
Definition: enums.h:2708
TownerStruct::_tNAnim
unsigned char * _tNAnim[8]
Definition: structs.h:1077
TownStory
void TownStory()
Definition: towners.cpp:452
TOWN_PEGBOY
@ TOWN_PEGBOY
Definition: enums.h:2279
TEXT_VEIL5
@ TEXT_VEIL5
Definition: enums.h:1624
sgnCowMsg
int sgnCowMsg
Definition: towners.cpp:6