Devilution
Diablo devolved - magic behind the 1996 computer game
objects.cpp
Go to the documentation of this file.
1 #include "all.h"
2 
4 
5 int trapid;
6 int trapdir;
7 BYTE *pObjCels[40];
8 char ObjFileList[40];
11 int leverid;
16 
17 int bxadd[8] = { -1, 0, 1, -1, 1, -1, 0, 1 };
18 int byadd[8] = { -1, -1, -1, 0, 0, 1, 1, 1 };
20  "Mysterious",
21  "Hidden",
22  "Gloomy",
23  "Weird",
24  "Magical",
25  "Stone",
26  "Religious",
27  "Enchanted",
28  "Thaumaturgic",
29  "Fascinating",
30  "Cryptic",
31  "Magical",
32  "Eldritch",
33  "Eerie",
34  "Divine",
35  "Holy",
36  "Sacred",
37  "Spiritual",
38  "Spooky",
39  "Abandoned",
40  "Creepy",
41  "Quiet",
42  "Secluded",
43  "Ornate",
44  "Glimmering",
45  "Tainted"
46 };
48  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
49  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
50  1, 1, 1, 1, 1, 1
51 };
53  16, 16, 16, 16, 16, 16, 16, 8, 16, 16,
54  16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
55  16, 16, 16, 16, 16, 16
56 };
59  0, 0, 1, 1, 0, 0, 0, 0, 1, 0,
60  0, 0, 0, 0, 0, 0, 0, 0, 2, 0,
61  0, 0, 0, 0, 0, 2
62 };
63 char *StoryBookName[9] = {
64  "The Great Conflict",
65  "The Wages of Sin are War",
66  "The Tale of the Horadrim",
67  "The Dark Exile",
68  "The Sin War",
69  "The Binding of the Three",
70  "The Realms Beyond",
71  "Tale of the Three",
72  "The Black King"
73 };
74 int StoryText[3][3] = {
78 };
79 
81 {
82  BOOLEAN fileload[56];
83  char filestr[32];
84  int i, j;
85 
86  memset(fileload, FALSE, sizeof(fileload));
87 
88  for (i = 0; AllObjects[i].oload != -1; i++) {
89  if (AllObjects[i].oload == 1
90  && (int)currlevel >= AllObjects[i].ominlvl
91  && (int)currlevel <= AllObjects[i].omaxlvl) {
92  fileload[AllObjects[i].ofindex] = TRUE;
93  }
94  if (AllObjects[i].otheme != THEME_NONE) {
95  for (j = 0; j < numthemes; j++) {
96  if (themes[j].ttype == AllObjects[i].otheme)
97  fileload[AllObjects[i].ofindex] = TRUE;
98  }
99  }
100 
101  if (AllObjects[i].oquest != -1) {
102  if (QuestStatus(AllObjects[i].oquest))
103  fileload[AllObjects[i].ofindex] = TRUE;
104  }
105  }
106 
107  for (i = 0; i < 56; i++) {
108  if (fileload[i]) {
110  sprintf(filestr, "Objects\\%s.CEL", ObjMasterLoadList[i]);
111  pObjCels[numobjfiles] = LoadFileInMem(filestr, NULL);
112  numobjfiles++;
113  }
114  }
115 }
116 
118 {
119  int i;
120 
121  for (i = 0; i < numobjfiles; i++) {
122  MemFreeDbg(pObjCels[i]);
123  }
124  numobjfiles = 0;
125 }
126 
127 BOOL RndLocOk(int xp, int yp)
128 {
129  if (dMonster[xp][yp])
130  return FALSE;
131  if (dPlayer[xp][yp])
132  return FALSE;
133  if (dObject[xp][yp])
134  return FALSE;
135  if (dFlags[xp][yp] & BFLAG_POPULATED)
136  return FALSE;
137  if (nSolidTable[dPiece[xp][yp]])
138  return FALSE;
139  if (leveltype != DTYPE_CATHEDRAL || dPiece[xp][yp] <= 126 || dPiece[xp][yp] >= 144)
140  return TRUE;
141  return FALSE;
142 }
143 
144 void InitRndLocObj(int min, int max, int objtype)
145 {
146  int i, xp, yp, numobjs;
147 
148  numobjs = random_(139, max - min) + min;
149 
150  for (i = 0; i < numobjs; i++) {
151  while (1) {
152  xp = random_(139, 80) + 16;
153  yp = random_(139, 80) + 16;
154  if (RndLocOk(xp - 1, yp - 1)
155  && RndLocOk(xp, yp - 1)
156  && RndLocOk(xp + 1, yp - 1)
157  && RndLocOk(xp - 1, yp)
158  && RndLocOk(xp, yp)
159  && RndLocOk(xp + 1, yp)
160  && RndLocOk(xp - 1, yp + 1)
161  && RndLocOk(xp, yp + 1)
162  && RndLocOk(xp + 1, yp + 1)) {
163  AddObject(objtype, xp, yp);
164  break;
165  }
166  }
167  }
168 }
169 
170 void InitRndLocBigObj(int min, int max, int objtype)
171 {
172  int i, xp, yp, numobjs;
173 
174  numobjs = random_(140, max - min) + min;
175  for (i = 0; i < numobjs; i++) {
176  while (1) {
177  xp = random_(140, 80) + 16;
178  yp = random_(140, 80) + 16;
179  if (RndLocOk(xp - 1, yp - 2)
180  && RndLocOk(xp, yp - 2)
181  && RndLocOk(xp + 1, yp - 2)
182  && RndLocOk(xp - 1, yp - 1)
183  && RndLocOk(xp, yp - 1)
184  && RndLocOk(xp + 1, yp - 1)
185  && RndLocOk(xp - 1, yp)
186  && RndLocOk(xp, yp)
187  && RndLocOk(xp + 1, yp)
188  && RndLocOk(xp - 1, yp + 1)
189  && RndLocOk(xp, yp + 1)
190  && RndLocOk(xp + 1, yp + 1)) {
191  AddObject(objtype, xp, yp);
192  break;
193  }
194  }
195  }
196 }
197 
198 void InitRndLocObj5x5(int min, int max, int objtype)
199 {
200  BOOL exit;
201  int xp, yp, numobjs, i, k, m, n;
202 
203  numobjs = min + random_(139, max - min);
204  for (i = 0; i < numobjs; i++) {
205  k = 0;
206  for (;;) {
207  exit = TRUE;
208  xp = random_(139, 80) + 16;
209  yp = random_(139, 80) + 16;
210  for (n = -2; n <= 2; n++) {
211  for (m = -2; m <= 2; m++) {
212  if (!RndLocOk(xp + m, yp + n))
213  exit = FALSE;
214  }
215  }
216  if (exit)
217  break;
218  k++;
219  if (k > 20000)
220  return;
221  }
222  AddObject(objtype, xp, yp);
223  }
224 }
225 
227 {
228  int i;
229 
230  for (i = 0; i < MAXOBJECTS; i++) {
231  object[i]._ox = 0;
232  object[i]._oy = 0;
233  object[i]._oAnimData = 0;
234  object[i]._oAnimDelay = 0;
235  object[i]._oAnimCnt = 0;
236  object[i]._oAnimLen = 0;
237  object[i]._oAnimFrame = 0;
238  object[i]._oDelFlag = FALSE;
239  object[i]._oVar1 = 0;
240  object[i]._oVar2 = 0;
241  object[i]._oVar3 = 0;
242  object[i]._oVar4 = 0;
243  }
244  nobjects = 0;
245  for (i = 0; i < MAXOBJECTS; i++) {
246  objectavail[i] = i;
247  objectactive[i] = 0;
248  }
249  trapdir = 0;
250  trapid = 1;
251  leverid = 1;
252 }
253 
255 {
256  int ox, oy;
257 
258  for (oy = 0; oy < MAXDUNY; oy++) {
259  for (ox = 0; ox < MAXDUNX; ox++) {
260  if (dPiece[ox][oy] == 367) {
261  AddObject(OBJ_TORTURE1, ox, oy + 1);
262  AddObject(OBJ_TORTURE3, ox + 2, oy - 1);
263  AddObject(OBJ_TORTURE2, ox, oy + 3);
264  AddObject(OBJ_TORTURE4, ox + 4, oy - 1);
265  AddObject(OBJ_TORTURE5, ox, oy + 5);
266  AddObject(OBJ_TNUDEM1, ox + 1, oy + 3);
267  AddObject(OBJ_TNUDEM2, ox + 4, oy + 5);
268  AddObject(OBJ_TNUDEM3, ox + 2, oy);
269  AddObject(OBJ_TNUDEM4, ox + 3, oy + 2);
270  AddObject(OBJ_TNUDEW1, ox + 2, oy + 4);
271  AddObject(OBJ_TNUDEW2, ox + 2, oy + 1);
272  AddObject(OBJ_TNUDEW3, ox + 4, oy + 2);
273  }
274  }
275  }
276 }
278 {
279  int tx, ty;
280 
281  tx = quests[Q_PWATER]._qtx;
282  ty = quests[Q_PWATER]._qty;
283  AddObject(OBJ_STORYCANDLE, tx - 2, ty + 1);
284  AddObject(OBJ_STORYCANDLE, tx + 3, ty + 1);
285  AddObject(OBJ_STORYCANDLE, tx - 1, ty + 2);
286  AddObject(OBJ_STORYCANDLE, tx + 2, ty + 2);
287 }
288 
289 void AddBookLever(int lx1, int ly1, int lx2, int ly2, int x1, int y1, int x2, int y2, int msg)
290 {
291  BOOL exit;
292  int xp, yp, ob, k, m, n;
293 
294  k = 0;
295  for (;;) {
296  exit = TRUE;
297  xp = random_(139, 80) + 16;
298  yp = random_(139, 80) + 16;
299  for (n = -2; n <= 2; n++) {
300  for (m = -2; m <= 2; m++) {
301  if (!RndLocOk(xp + m, yp + n))
302  exit = FALSE;
303  }
304  }
305  if (exit)
306  break;
307  k++;
308  if (k > 20000)
309  return;
310  }
311 
312  if (QuestStatus(Q_BLIND))
313  AddObject(OBJ_BLINDBOOK, xp, yp);
314  if (QuestStatus(Q_WARLORD))
315  AddObject(OBJ_STEELTOME, xp, yp);
316  if (QuestStatus(Q_BLOOD)) {
317  xp = 2 * setpc_x + 25;
318  yp = 2 * setpc_y + 40;
319  AddObject(OBJ_BLOODBOOK, xp, yp);
320  }
321  ob = dObject[xp][yp] - 1;
322  SetObjMapRange(ob, x1, y1, x2, y2, leverid);
323  SetBookMsg(ob, msg);
324  leverid++;
325  object[ob]._oVar6 = object[ob]._oAnimFrame + 1;
326 }
327 
329 {
330  int numobjs; // number of groups of barrels to generate
331  int xp, yp;
332  _object_id o;
333  BOOL found;
334  int p; // regulates chance to stop placing barrels in current group
335  int dir;
336  int t; // number of tries of placing next barrel in current group
337  int c; // number of barrels in current group
338  int i;
339 
340  numobjs = random_(143, 5) + 3;
341  for (i = 0; i < numobjs; i++) {
342  do {
343  xp = random_(143, 80) + 16;
344  yp = random_(143, 80) + 16;
345  } while (!RndLocOk(xp, yp));
346  o = (random_(143, 4) != 0) ? OBJ_BARREL : OBJ_BARRELEX;
347  AddObject(o, xp, yp);
348  found = TRUE;
349  p = 0;
350  c = 1;
351  while (random_(143, p) == 0 && found) {
352  t = 0;
353  found = FALSE;
354  while (TRUE) {
355  if (t >= 3)
356  break;
357  dir = random_(143, 8);
358  xp += bxadd[dir];
359  yp += byadd[dir];
360  found = RndLocOk(xp, yp);
361  t++;
362  if (found)
363  break;
364  }
365  if (found) {
366  o = (random_(143, 5) != 0) ? OBJ_BARREL : OBJ_BARRELEX;
367  AddObject(o, xp, yp);
368  c++;
369  }
370  p = c >> 1;
371  }
372  }
373 }
374 
375 void AddL1Objs(int x1, int y1, int x2, int y2)
376 {
377  int i, j, pn;
378 
379  for (j = y1; j < y2; j++) {
380  for (i = x1; i < x2; i++) {
381  pn = dPiece[i][j];
382  if (pn == 270)
383  AddObject(OBJ_L1LIGHT, i, j);
384  if (pn == 44 || pn == 51 || pn == 214)
385  AddObject(OBJ_L1LDOOR, i, j);
386  if (pn == 46 || pn == 56)
387  AddObject(OBJ_L1RDOOR, i, j);
388  }
389  }
390 }
391 
392 void AddL2Objs(int x1, int y1, int x2, int y2)
393 {
394  int i, j, pn;
395 
396  for (j = y1; j < y2; j++) {
397  for (i = x1; i < x2; i++) {
398  pn = dPiece[i][j];
399  if (pn == 13 || pn == 541)
400  AddObject(OBJ_L2LDOOR, i, j);
401  if (pn == 17 || pn == 542)
402  AddObject(OBJ_L2RDOOR, i, j);
403  }
404  }
405 }
406 
407 void AddL3Objs(int x1, int y1, int x2, int y2)
408 {
409  int i, j, pn;
410 
411  for (j = y1; j < y2; j++) {
412  for (i = x1; i < x2; i++) {
413  pn = dPiece[i][j];
414  if (pn == 531)
415  AddObject(OBJ_L3LDOOR, i, j);
416  if (pn == 534)
417  AddObject(OBJ_L3RDOOR, i, j);
418  }
419  }
420 }
421 
422 BOOL WallTrapLocOk(int xp, int yp)
423 {
424  if (dFlags[xp][yp] & BFLAG_POPULATED)
425  return FALSE;
426  return TRUE;
427 }
428 
430 {
431  int i, j, pn;
432 
433  for (j = 0; j < MAXDUNY; j++) {
434  for (i = 0; i < MAXDUNX; i++) {
435  if (!WallTrapLocOk(i, j))
436  continue;
437 
438  pn = dPiece[i][j];
439  if (pn == 1 && random_(145, 3) == 0)
440  AddObject(OBJ_TORCHL2, i, j);
441 
442  if (pn == 5 && random_(145, 3) == 0)
443  AddObject(OBJ_TORCHR2, i, j);
444 
445  if (pn == 37 && random_(145, 10) == 0 && dObject[i - 1][j] == 0)
446  AddObject(OBJ_TORCHL, i - 1, j);
447 
448  if (pn == 41 && random_(145, 10) == 0 && dObject[i][j - 1] == 0)
449  AddObject(OBJ_TORCHR, i, j - 1);
450  }
451  }
452 }
453 
454 BOOL TorchLocOK(int xp, int yp)
455 {
456  if (dFlags[xp][yp] & BFLAG_POPULATED)
457  return FALSE;
458 
459  if (nTrapTable[dPiece[xp][yp]] != FALSE)
460  return TRUE;
461  else
462  return FALSE;
463 }
464 
466 {
467  char oi_trap, oi;
468  int i, j;
469  int xp, yp;
470  int rndv;
471 
472  if (currlevel == 1)
473  rndv = 10;
474  if (currlevel >= 2)
475  rndv = 15;
476  if (currlevel >= 5)
477  rndv = 20;
478  if (currlevel >= 7)
479  rndv = 25;
480  for (j = 0; j < MAXDUNY; j++) {
481  for (i = 0; i < MAXDUNX; i++) {
482  if (dObject[i][j] <= 0 || random_(144, 100) >= rndv)
483  continue;
484 
485  oi = dObject[i][j] - 1;
486  if (!AllObjects[object[oi]._otype].oTrapFlag)
487  continue;
488 
489  if (random_(144, 2) == 0) {
490  xp = i - 1;
491  while (!nSolidTable[dPiece[xp][j]])
492  xp--;
493 
494  if (!TorchLocOK(xp, j) || i - xp <= 1)
495  continue;
496 
497  AddObject(OBJ_TRAPL, xp, j);
498  oi_trap = dObject[xp][j] - 1;
499  object[oi_trap]._oVar1 = i;
500  object[oi_trap]._oVar2 = j;
501  object[oi]._oTrapFlag = TRUE;
502  } else {
503  yp = j - 1;
504  while (!nSolidTable[dPiece[i][yp]])
505  yp--;
506 
507  if (!TorchLocOK(i, yp) || j - yp <= 1)
508  continue;
509 
510  AddObject(OBJ_TRAPR, i, yp);
511  oi_trap = dObject[i][yp] - 1;
512  object[oi_trap]._oVar1 = i;
513  object[oi_trap]._oVar2 = j;
514  object[oi]._oTrapFlag = TRUE;
515  }
516  }
517  }
518 }
519 
521 {
522  int i, j;
523  char oi;
524 
525  for (j = 0; j < MAXDUNY; j++) {
526  for (i = 0; i < MAXDUNX; i++) {
527  if (dObject[i][j] > 0) {
528  oi = dObject[i][j] - 1;
529  if (object[oi]._otype >= OBJ_CHEST1 && object[oi]._otype <= OBJ_CHEST3 && !object[oi]._oTrapFlag && random_(0, 100) < 10) {
530  object[oi]._otype += OBJ_BOOKCASER;
531  object[oi]._oTrapFlag = TRUE;
532  if (leveltype == DTYPE_CATACOMBS) {
533  object[oi]._oVar4 = random_(0, 2);
534  } else {
535  object[oi]._oVar4 = random_(0, 3);
536  }
537  }
538  }
539  }
540  }
541 }
542 
543 void LoadMapObjects(BYTE *pMap, int startx, int starty, int x1, int y1, int w, int h, int leveridx)
544 {
545  int rw, rh, i, j, oi;
546  BYTE *lm;
547  long mapoff;
548 
549  InitObjFlag = TRUE;
550 
551  lm = pMap + 2;
552  rw = pMap[0];
553  rh = *lm;
554  mapoff = (rw * rh + 1) * 2;
555  rw <<= 1;
556  rh <<= 1;
557  mapoff += rw * 2 * rh * 2;
558  lm += mapoff;
559 
560  for (j = 0; j < rh; j++) {
561  for (i = 0; i < rw; i++) {
562  if (*lm) {
563  AddObject(ObjTypeConv[*lm], startx + 16 + i, starty + 16 + j);
564  oi = ObjIndex(startx + 16 + i, starty + 16 + j);
565  SetObjMapRange(oi, x1, y1, x1 + w, y1 + h, leveridx);
566  }
567  lm += 2;
568  }
569  }
570  InitObjFlag = FALSE;
571 }
572 
573 void LoadMapObjs(BYTE *pMap, int startx, int starty)
574 {
575  int rw, rh;
576  int i, j;
577  BYTE *lm;
578  long mapoff;
579 
580  InitObjFlag = TRUE;
581  lm = pMap;
582  rw = *lm;
583  lm += 2;
584  rh = *lm;
585  mapoff = (rw * rh + 1) * 2;
586  rw <<= 1;
587  rh <<= 1;
588  mapoff += 2 * rw * rh * 2;
589  lm += mapoff;
590 
591  for (j = 0; j < rh; j++) {
592  for (i = 0; i < rw; i++) {
593  if (*lm) {
594  AddObject(ObjTypeConv[*lm], startx + 16 + i, starty + 16 + j);
595  }
596  lm += 2;
597  }
598  }
599  InitObjFlag = FALSE;
600 }
601 
603 {
604  BYTE *lpSetPiece;
605 
606  lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab1.DUN", NULL);
607  LoadMapObjects(lpSetPiece, 2 * diabquad1x, 2 * diabquad1y, diabquad2x, diabquad2y, 11, 12, 1);
608  mem_free_dbg(lpSetPiece);
609  lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab2a.DUN", NULL);
610  LoadMapObjects(lpSetPiece, 2 * diabquad2x, 2 * diabquad2y, diabquad3x, diabquad3y, 11, 11, 2);
611  mem_free_dbg(lpSetPiece);
612  lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab3a.DUN", NULL);
613  LoadMapObjects(lpSetPiece, 2 * diabquad3x, 2 * diabquad3y, diabquad4x, diabquad4y, 9, 9, 3);
614  mem_free_dbg(lpSetPiece);
615 }
616 
618 {
619  int xp, yp, xx, yy;
620  int cnt;
621  BOOL done;
622 
623  cnt = 0;
624  while (TRUE) {
625  done = TRUE;
626  xp = random_(139, 80) + 16;
627  yp = random_(139, 80) + 16;
628  for (yy = -2; yy <= 2; yy++) {
629  for (xx = -3; xx <= 3; xx++) {
630  if (!RndLocOk(xx + xp, yy + yp))
631  done = FALSE;
632  }
633  }
634  if (done)
635  break;
636  cnt++;
637  if (cnt > 20000)
638  return;
639  }
640  AddObject(OBJ_STORYBOOK, xp, yp);
641  AddObject(OBJ_STORYCANDLE, xp - 2, yp + 1);
642  AddObject(OBJ_STORYCANDLE, xp - 2, yp);
643  AddObject(OBJ_STORYCANDLE, xp - 1, yp - 1);
644  AddObject(OBJ_STORYCANDLE, xp + 1, yp - 1);
645  AddObject(OBJ_STORYCANDLE, xp + 2, yp);
646  AddObject(OBJ_STORYCANDLE, xp + 2, yp + 1);
647 }
648 
649 void AddHookedBodies(int freq)
650 {
651  int i, j, ii, jj;
652 
653  for (j = 0; j < 40; j++) {
654  jj = 16 + j * 2;
655  for (i = 0; i < 40; i++) {
656  ii = 16 + i * 2;
657  if (dungeon[i][j] != 1 && dungeon[i][j] != 2)
658  continue;
659  if (random_(0, freq) != 0)
660  continue;
661  if (!SkipThemeRoom(i, j))
662  continue;
663  if (dungeon[i][j] == 1 && dungeon[i + 1][j] == 6) {
664  switch (random_(0, 3)) {
665  case 0:
666  AddObject(OBJ_TORTURE1, ii + 1, jj);
667  break;
668  case 1:
669  AddObject(OBJ_TORTURE2, ii + 1, jj);
670  break;
671  case 2:
672  AddObject(OBJ_TORTURE5, ii + 1, jj);
673  break;
674  }
675  continue;
676  }
677  if (dungeon[i][j] == 2 && dungeon[i][j + 1] == 6) {
678  switch (random_(0, 2)) {
679  case 0:
680  AddObject(OBJ_TORTURE3, ii, jj);
681  break;
682  case 1:
683  AddObject(OBJ_TORTURE4, ii, jj);
684  break;
685  }
686  }
687  }
688  }
689 }
690 
692 {
693  AddHookedBodies(6);
694  InitRndLocObj(2, 6, OBJ_TNUDEM1);
695  InitRndLocObj(2, 6, OBJ_TNUDEM2);
696  InitRndLocObj(2, 6, OBJ_TNUDEM3);
697  InitRndLocObj(2, 6, OBJ_TNUDEM4);
698  InitRndLocObj(2, 6, OBJ_TNUDEW1);
699  InitRndLocObj(2, 6, OBJ_TNUDEW2);
700  InitRndLocObj(2, 6, OBJ_TNUDEW3);
701  InitRndLocObj(2, 6, OBJ_DECAP);
703 }
704 
706 {
707  int xp, yp, xx, yy;
708  int cnt;
709  BOOL found;
710 
711  cnt = 0;
712  while (TRUE) {
713  found = 1;
714  xp = random_(139, 80) + 16;
715  yp = random_(139, 80) + 16;
716  for (yy = -3; yy <= 3; yy++) {
717  for (xx = -2; xx <= 3; xx++) {
718  if (!RndLocOk(xp + xx, yp + yy))
719  found = FALSE;
720  }
721  }
722  if (found)
723  break;
724 
725  cnt++;
726  if (cnt > 10000) {
728  return;
729  }
730  }
731  AddObject(OBJ_LAZSTAND, xp, yp);
732  AddObject(OBJ_TNUDEM2, xp, yp + 2);
733  AddObject(OBJ_STORYCANDLE, xp + 1, yp + 2);
734  AddObject(OBJ_TNUDEM3, xp + 2, yp + 2);
735  AddObject(OBJ_TNUDEW1, xp, yp - 2);
736  AddObject(OBJ_STORYCANDLE, xp + 1, yp - 2);
737  AddObject(OBJ_TNUDEW2, xp + 2, yp - 2);
738  AddObject(OBJ_STORYCANDLE, xp - 1, yp - 1);
739  AddObject(OBJ_TNUDEW3, xp - 1, yp);
740  AddObject(OBJ_STORYCANDLE, xp - 1, yp + 1);
741 }
742 
744 {
745  int sp_id;
746  BYTE *mem;
747 
748  ClrAllObjects();
749  if (currlevel == 16) {
750  AddDiabObjs();
751  } else {
752  InitObjFlag = TRUE;
753  GetRndSeed();
754  if (currlevel == 9 && gbMaxPlayers == 1)
755  AddSlainHero();
756  if (currlevel == quests[Q_MUSHROOM]._qlevel && quests[Q_MUSHROOM]._qactive == QUEST_INIT)
757  AddMushPatch();
758  if (currlevel == 4)
759  AddStoryBooks();
760  if (currlevel == 8)
761  AddStoryBooks();
762  if (currlevel == 12)
763  AddStoryBooks();
764  if (leveltype == DTYPE_CATHEDRAL) {
765  if (QuestStatus(Q_BUTCHER))
766  AddTortures();
767  if (QuestStatus(Q_PWATER))
768  AddCandles();
769  if (QuestStatus(Q_LTBANNER))
770  AddObject(OBJ_SIGNCHEST, 2 * setpc_x + 26, 2 * setpc_y + 19);
771  InitRndLocBigObj(10, 15, OBJ_SARC);
772  AddL1Objs(0, 0, MAXDUNX, MAXDUNY);
773  InitRndBarrels();
774  }
775  if (leveltype == DTYPE_CATACOMBS) {
776  if (QuestStatus(Q_ROCK))
778  if (QuestStatus(Q_SCHAMB))
780  AddL2Objs(0, 0, MAXDUNX, MAXDUNY);
781  AddL2Torches();
782  if (QuestStatus(Q_BLIND)) {
783  if (plr[myplr]._pClass == PC_WARRIOR) {
784  sp_id = TEXT_BLINDING;
785  } else if (plr[myplr]._pClass == PC_ROGUE) {
786  sp_id = TEXT_RBLINDING;
787  } else if (plr[myplr]._pClass == PC_SORCERER) {
788  sp_id = TEXT_MBLINDING;
789  }
790  quests[Q_BLIND]._qmsg = sp_id;
791  AddBookLever(0, 0, MAXDUNX, MAXDUNY, setpc_x, setpc_y, setpc_w + setpc_x + 1, setpc_h + setpc_y + 1, sp_id);
792  mem = LoadFileInMem("Levels\\L2Data\\Blind2.DUN", NULL);
793  LoadMapObjs(mem, 2 * setpc_x, 2 * setpc_y);
794  mem_free_dbg(mem);
795  }
796  if (QuestStatus(Q_BLOOD)) {
797  if (plr[myplr]._pClass == PC_WARRIOR) {
798  sp_id = TEXT_BLOODY;
799  } else if (plr[myplr]._pClass == PC_ROGUE) {
800  sp_id = TEXT_RBLOODY;
801  } else if (plr[myplr]._pClass == PC_SORCERER) {
802  sp_id = TEXT_MBLOODY;
803  }
804  quests[Q_BLOOD]._qmsg = sp_id;
805  AddBookLever(0, 0, MAXDUNX, MAXDUNY, setpc_x, setpc_y + 3, setpc_x + 2, setpc_y + 7, sp_id);
806  AddObject(OBJ_PEDISTAL, 2 * setpc_x + 25, 2 * setpc_y + 32);
807  }
808  InitRndBarrels();
809  }
810  if (leveltype == DTYPE_CAVES) {
811  AddL3Objs(0, 0, MAXDUNX, MAXDUNY);
812  InitRndBarrels();
813  }
814  if (leveltype == DTYPE_HELL) {
815  if (QuestStatus(Q_WARLORD)) {
816  if (plr[myplr]._pClass == PC_WARRIOR) {
817  sp_id = TEXT_BLOODWAR;
818  } else if (plr[myplr]._pClass == PC_ROGUE) {
819  sp_id = TEXT_RBLOODWAR;
820  } else if (plr[myplr]._pClass == PC_SORCERER) {
821  sp_id = TEXT_MBLOODWAR;
822  }
823  quests[Q_WARLORD]._qmsg = sp_id;
825  mem = LoadFileInMem("Levels\\L4Data\\Warlord.DUN", NULL);
826  LoadMapObjs(mem, 2 * setpc_x, 2 * setpc_y);
827  mem_free_dbg(mem);
828  }
829  if (QuestStatus(Q_BETRAYER) && gbMaxPlayers == 1)
830  AddLazStand();
831  InitRndBarrels();
832  AddL4Goodies();
833  }
834  InitRndLocObj(5, 10, 5);
835  InitRndLocObj(3, 6, 6);
836  InitRndLocObj(1, 5, 7);
837  if (leveltype != DTYPE_HELL)
838  AddObjTraps();
840  AddChestTraps();
841  InitObjFlag = FALSE;
842  }
843 }
844 
845 #ifndef SPAWN
846 void SetMapObjects(BYTE *pMap, int startx, int starty)
847 {
848  int rw, rh;
849  int i, j;
850  BYTE *lm, *h;
851  long mapoff;
852  int fileload[56];
853  char filestr[32];
854 
855  ClrAllObjects();
856  for (i = 0; i < 56; i++)
857  fileload[i] = FALSE;
858  InitObjFlag = TRUE;
859 
860  for (i = 0; AllObjects[i].oload != -1; i++) {
861  if (AllObjects[i].oload == 1 && leveltype == AllObjects[i].olvltype)
862  fileload[AllObjects[i].ofindex] = TRUE;
863  }
864 
865  lm = pMap;
866  rw = *lm;
867  lm += 2;
868  rh = *lm;
869  mapoff = (rw * rh + 1) * 2;
870  rw <<= 1;
871  rh <<= 1;
872  mapoff += 2 * rw * rh * 2;
873  lm += mapoff;
874  h = lm;
875 
876  for (j = 0; j < rh; j++) {
877  for (i = 0; i < rw; i++) {
878  if (*lm) {
879  fileload[AllObjects[ObjTypeConv[*lm]].ofindex] = TRUE;
880  }
881  lm += 2;
882  }
883  }
884 
885  for (i = 0; i < 56; i++) {
886  if (!fileload[i])
887  continue;
888 
890  sprintf(filestr, "Objects\\%s.CEL", ObjMasterLoadList[i]);
891  pObjCels[numobjfiles] = LoadFileInMem(filestr, NULL);
892  numobjfiles++;
893  }
894 
895  lm = h;
896  for (j = 0; j < rh; j++) {
897  for (i = 0; i < rw; i++) {
898  if (*lm)
899  AddObject(ObjTypeConv[*lm], startx + 16 + i, starty + 16 + j);
900  lm += 2;
901  }
902  }
903  InitObjFlag = FALSE;
904 }
905 #endif
906 
907 void DeleteObject_(int oi, int i)
908 {
909  int ox, oy;
910 
911  ox = object[oi]._ox;
912  oy = object[oi]._oy;
913  dObject[ox][oy] = 0;
915  nobjects--;
916  if (nobjects > 0 && i != nobjects)
918 }
919 
920 void SetupObject(int i, int x, int y, int ot)
921 {
922  int ofi;
923  int j;
924 
925  object[i]._otype = ot;
926  ofi = AllObjects[ot].ofindex;
927  object[i]._ox = x;
928  object[i]._oy = y;
929  j = 0;
930  while (ObjFileList[j] != ofi) {
931  j++;
932  }
933  object[i]._oAnimData = pObjCels[j];
934  object[i]._oAnimFlag = AllObjects[ot].oAnimFlag;
935  if (AllObjects[ot].oAnimFlag) {
936  object[i]._oAnimDelay = AllObjects[ot].oAnimDelay;
937  object[i]._oAnimCnt = random_(146, AllObjects[ot].oAnimDelay);
938  object[i]._oAnimLen = AllObjects[ot].oAnimLen;
939  object[i]._oAnimFrame = random_(146, AllObjects[ot].oAnimLen - 1) + 1;
940  } else {
941  object[i]._oAnimDelay = 1000;
942  object[i]._oAnimCnt = 0;
943  object[i]._oAnimLen = AllObjects[ot].oAnimLen;
944  object[i]._oAnimFrame = AllObjects[ot].oAnimDelay;
945  }
946  object[i]._oAnimWidth = AllObjects[ot].oAnimWidth;
947  object[i]._oSolidFlag = AllObjects[ot].oSolidFlag;
948  object[i]._oMissFlag = AllObjects[ot].oMissFlag;
949  object[i]._oLight = AllObjects[ot].oLightFlag;
950  object[i]._oDelFlag = FALSE;
951  object[i]._oBreak = AllObjects[ot].oBreak;
952  object[i]._oSelFlag = AllObjects[ot].oSelFlag;
953  object[i]._oPreFlag = FALSE;
954  object[i]._oTrapFlag = FALSE;
955  object[i]._oDoorFlag = FALSE;
956 }
957 
958 void SetObjMapRange(int i, int x1, int y1, int x2, int y2, int v)
959 {
960  object[i]._oVar1 = x1;
961  object[i]._oVar2 = y1;
962  object[i]._oVar3 = x2;
963  object[i]._oVar4 = y2;
964  object[i]._oVar8 = v;
965 }
966 
967 void SetBookMsg(int i, int msg)
968 {
969  object[i]._oVar7 = msg;
970 }
971 
972 void AddL1Door(int i, int x, int y, int ot)
973 {
974  object[i]._oDoorFlag = TRUE;
975  if (ot == 1) {
976  object[i]._oVar1 = dPiece[x][y];
977  object[i]._oVar2 = dPiece[x][y - 1];
978  } else {
979  object[i]._oVar1 = dPiece[x][y];
980  object[i]._oVar2 = dPiece[x - 1][y];
981  }
982  object[i]._oVar4 = 0;
983 }
984 
985 void AddSCambBook(int i)
986 {
987  object[i]._oVar1 = setpc_x;
988  object[i]._oVar2 = setpc_y;
989  object[i]._oVar3 = setpc_w + setpc_x + 1;
990  object[i]._oVar4 = setpc_h + setpc_y + 1;
991  object[i]._oVar6 = object[i]._oAnimFrame + 1;
992 }
993 
994 void AddChest(int i, int t)
995 {
996  if (!random_(147, 2))
997  object[i]._oAnimFrame += 3;
998  object[i]._oRndSeed = GetRndSeed();
999  switch (t) {
1000  case OBJ_CHEST1:
1001  case OBJ_TCHEST1:
1002  if (setlevel) {
1003  object[i]._oVar1 = 1;
1004  break;
1005  }
1006  object[i]._oVar1 = random_(147, 2);
1007  break;
1008  case OBJ_TCHEST2:
1009  case OBJ_CHEST2:
1010  if (setlevel) {
1011  object[i]._oVar1 = 2;
1012  break;
1013  }
1014  object[i]._oVar1 = random_(147, 3);
1015  break;
1016  case OBJ_TCHEST3:
1017  case OBJ_CHEST3:
1018  if (setlevel) {
1019  object[i]._oVar1 = 3;
1020  break;
1021  }
1022  object[i]._oVar1 = random_(147, 4);
1023  break;
1024  }
1025  object[i]._oVar2 = random_(147, 8);
1026 }
1027 
1028 void AddL2Door(int i, int x, int y, int ot)
1029 {
1030  object[i]._oDoorFlag = TRUE;
1031  if (ot == OBJ_L2LDOOR)
1032  ObjSetMicro(x, y, 538);
1033  else
1034  ObjSetMicro(x, y, 540);
1035  object[i]._oVar4 = 0;
1036 }
1037 
1038 void AddL3Door(int i, int x, int y, int ot)
1039 {
1040  object[i]._oDoorFlag = TRUE;
1041  if (ot == OBJ_L3LDOOR)
1042  ObjSetMicro(x, y, 531);
1043  else
1044  ObjSetMicro(x, y, 534);
1045  object[i]._oVar4 = 0;
1046 }
1047 
1048 void AddSarc(int i)
1049 {
1050  dObject[object[i]._ox][object[i]._oy - 1] = -(i + 1);
1051  object[i]._oVar1 = random_(153, 10);
1052  object[i]._oRndSeed = GetRndSeed();
1053  if (object[i]._oVar1 >= 8)
1054  object[i]._oVar2 = PreSpawnSkeleton();
1055 }
1056 
1057 void AddFlameTrap(int i)
1058 {
1059  object[i]._oVar1 = trapid;
1060  object[i]._oVar2 = 0;
1061  object[i]._oVar3 = trapdir;
1062  object[i]._oVar4 = 0;
1063 }
1064 
1065 void AddFlameLvr(int i)
1066 {
1067  object[i]._oVar1 = trapid;
1068  object[i]._oVar2 = MIS_FLAMEC;
1069 }
1070 
1071 void AddTrap(int i, int ot)
1072 {
1073  int mt;
1074 
1075  mt = currlevel / 3 + 1;
1076  mt = random_(148, mt);
1077  if (mt == 0)
1078  object[i]._oVar3 = MIS_ARROW;
1079  if (mt == 1)
1080  object[i]._oVar3 = MIS_FIREBOLT;
1081  if (mt == 2)
1082  object[i]._oVar3 = MIS_LIGHTCTRL;
1083  object[i]._oVar4 = 0;
1084 }
1085 
1086 void AddObjLight(int i, int r)
1087 {
1088  if (InitObjFlag) {
1089  DoLighting(object[i]._ox, object[i]._oy, r, -1);
1090  object[i]._oVar1 = -1;
1091  } else {
1092  object[i]._oVar1 = 0;
1093  }
1094 }
1095 
1096 void AddBarrel(int i, int t)
1097 {
1098  object[i]._oVar1 = 0;
1099  object[i]._oRndSeed = GetRndSeed();
1100  object[i]._oVar2 = random_(149, 10);
1101  object[i]._oVar3 = random_(149, 3);
1102 
1103  if (object[i]._oVar2 >= 8)
1104  object[i]._oVar4 = PreSpawnSkeleton();
1105 }
1106 
1107 void AddShrine(int i)
1108 {
1109  int val, j, slist[NUM_SHRINETYPE];
1110 
1111  object[i]._oPreFlag = TRUE;
1112  for (j = 0; j < NUM_SHRINETYPE; j++) {
1113  if (currlevel < shrinemin[j] || currlevel > shrinemax[j]) {
1114  slist[j] = 0;
1115  } else {
1116  slist[j] = 1;
1117  }
1118  if (gbMaxPlayers != 1) {
1119  if (shrineavail[j] == 1) {
1120  slist[j] = 0;
1121  }
1122  } else {
1123  if (shrineavail[j] == 2) {
1124  slist[j] = 0;
1125  }
1126  }
1127  }
1128  while (1) {
1129  val = random_(150, NUM_SHRINETYPE);
1130  if (slist[val]) {
1131  break;
1132  }
1133  }
1134 
1135  object[i]._oVar1 = val;
1136  if (random_(150, 2)) {
1137  object[i]._oAnimFrame = 12;
1138  object[i]._oAnimLen = 22;
1139  }
1140 }
1141 
1142 void AddBookcase(int i)
1143 {
1144  object[i]._oRndSeed = GetRndSeed();
1145  object[i]._oPreFlag = TRUE;
1146 }
1147 
1148 void AddBookstand(int i)
1149 {
1150  object[i]._oRndSeed = GetRndSeed();
1151 }
1152 
1153 void AddBloodFtn(int i)
1154 {
1155  object[i]._oRndSeed = GetRndSeed();
1156 }
1157 
1159 {
1160  int ox, oy;
1161 
1162  ox = object[i]._ox;
1163  oy = object[i]._oy;
1164  dObject[ox][oy - 1] = -1 - i;
1165  dObject[ox - 1][oy] = -1 - i;
1166  dObject[ox - 1][oy - 1] = -1 - i;
1167  object[i]._oRndSeed = GetRndSeed();
1168 }
1169 
1170 void AddArmorStand(int i)
1171 {
1172  if (!armorFlag) {
1173  object[i]._oAnimFlag = 2;
1174  object[i]._oSelFlag = 0;
1175  }
1176 
1177  object[i]._oRndSeed = GetRndSeed();
1178 }
1179 
1180 void AddGoatShrine(int i)
1181 {
1182  object[i]._oRndSeed = GetRndSeed();
1183 }
1184 
1185 void AddCauldron(int i)
1186 {
1187  object[i]._oRndSeed = GetRndSeed();
1188 }
1189 
1190 void AddMurkyFountain(int i)
1191 {
1192  int ox, oy;
1193 
1194  ox = object[i]._ox;
1195  oy = object[i]._oy;
1196  dObject[ox][oy - 1] = -1 - i;
1197  dObject[ox - 1][oy] = -1 - i;
1198  dObject[ox - 1][oy - 1] = -1 - i;
1199  object[i]._oRndSeed = GetRndSeed();
1200 }
1201 
1202 void AddTearFountain(int i)
1203 {
1204  object[i]._oRndSeed = GetRndSeed();
1205 }
1206 
1207 void AddDecap(int i)
1208 {
1209  object[i]._oRndSeed = GetRndSeed();
1210  object[i]._oAnimFrame = random_(151, 8) + 1;
1211  object[i]._oPreFlag = TRUE;
1212 }
1213 
1214 void AddVilebook(int i)
1215 {
1216  if (setlevel && setlvlnum == SL_VILEBETRAYER) {
1217  object[i]._oAnimFrame = 4;
1218  }
1219 }
1220 
1221 void AddMagicCircle(int i)
1222 {
1223  object[i]._oRndSeed = GetRndSeed();
1224  object[i]._oPreFlag = TRUE;
1225  object[i]._oVar6 = 0;
1226  object[i]._oVar5 = 1;
1227 }
1228 
1229 void AddBrnCross(int i)
1230 {
1231  object[i]._oRndSeed = GetRndSeed();
1232 }
1233 
1234 void AddPedistal(int i)
1235 {
1236  object[i]._oVar1 = setpc_x;
1237  object[i]._oVar2 = setpc_y;
1238  object[i]._oVar3 = setpc_x + setpc_w;
1239  object[i]._oVar4 = setpc_y + setpc_h;
1240 }
1241 
1242 void AddStoryBook(int i)
1243 {
1244  int bookframe;
1245 
1246  SetRndSeed(glSeedTbl[16]);
1247  bookframe = random_(0, 3);
1248 
1249  object[i]._oVar1 = bookframe;
1250  if (currlevel == 4)
1251  object[i]._oVar2 = StoryText[bookframe][0];
1252  if (currlevel == 8)
1253  object[i]._oVar2 = StoryText[bookframe][1];
1254  if (currlevel == 12)
1255  object[i]._oVar2 = StoryText[bookframe][2];
1256  object[i]._oVar3 = (currlevel >> 2) + 3 * bookframe - 1;
1257  object[i]._oAnimFrame = 5 - 2 * bookframe;
1258  object[i]._oVar4 = object[i]._oAnimFrame + 1;
1259 }
1260 
1261 void AddWeaponRack(int i)
1262 {
1263  if (!weaponFlag) {
1264  object[i]._oAnimFlag = 2;
1265  object[i]._oSelFlag = 0;
1266  }
1267  object[i]._oRndSeed = GetRndSeed();
1268 }
1269 
1270 void AddTorturedBody(int i)
1271 {
1272  object[i]._oRndSeed = GetRndSeed();
1273  object[i]._oAnimFrame = random_(0, 4) + 1;
1274  object[i]._oPreFlag = TRUE;
1275 }
1276 
1277 void GetRndObjLoc(int randarea, int *xx, int *yy)
1278 {
1279  BOOL failed;
1280  int i, j, tries;
1281 
1282  if (randarea == 0)
1283  return;
1284 
1285  tries = 0;
1286  while (1) {
1287  tries++;
1288  if (tries > 1000 && randarea > 1)
1289  randarea--;
1290  *xx = random_(0, MAXDUNX);
1291  *yy = random_(0, MAXDUNY);
1292  failed = FALSE;
1293  for (i = 0; i < randarea && !failed; i++) {
1294  for (j = 0; j < randarea && !failed; j++) {
1295  failed = !RndLocOk(i + *xx, j + *yy);
1296  }
1297  }
1298  if (!failed)
1299  break;
1300  }
1301 }
1302 
1304 {
1305  int i;
1306  int y, x;
1307 
1308  if (nobjects < MAXOBJECTS) {
1309  i = objectavail[0];
1310  GetRndObjLoc(5, &x, &y);
1311  dObject[x + 1][y + 1] = -1 - i;
1312  dObject[x + 2][y + 1] = -1 - i;
1313  dObject[x + 1][y + 2] = -1 - i;
1314  AddObject(OBJ_MUSHPATCH, x + 2, y + 2);
1315  }
1316 }
1317 
1319 {
1320  int x, y;
1321 
1322  GetRndObjLoc(5, &x, &y);
1323  AddObject(OBJ_SLAINHERO, x + 2, y + 2);
1324 }
1325 
1326 void AddObject(int ot, int ox, int oy)
1327 {
1328  int oi;
1329 
1330  if (nobjects >= MAXOBJECTS)
1331  return;
1332 
1333  oi = objectavail[0];
1334  objectavail[0] = objectavail[126 - nobjects];
1335  objectactive[nobjects] = oi;
1336  dObject[ox][oy] = oi + 1;
1337  SetupObject(oi, ox, oy, ot);
1338  switch (ot) {
1339  case OBJ_L1LIGHT:
1340  AddObjLight(oi, 5);
1341  break;
1342  case OBJ_SKFIRE:
1343  case OBJ_CANDLE1:
1344  case OBJ_CANDLE2:
1345  case OBJ_BOOKCANDLE:
1346  AddObjLight(oi, 5);
1347  break;
1348  case OBJ_STORYCANDLE:
1349  AddObjLight(oi, 3);
1350  break;
1351  case OBJ_TORCHL:
1352  case OBJ_TORCHR:
1353  case OBJ_TORCHL2:
1354  case OBJ_TORCHR2:
1355  AddObjLight(oi, 8);
1356  break;
1357  case OBJ_L1LDOOR:
1358  case OBJ_L1RDOOR:
1359  AddL1Door(oi, ox, oy, ot);
1360  break;
1361  case OBJ_L2LDOOR:
1362  case OBJ_L2RDOOR:
1363  AddL2Door(oi, ox, oy, ot);
1364  break;
1365  case OBJ_L3LDOOR:
1366  case OBJ_L3RDOOR:
1367  AddL3Door(oi, ox, oy, ot);
1368  break;
1369  case OBJ_BOOK2R:
1370  AddSCambBook(oi);
1371  break;
1372  case OBJ_CHEST1:
1373  case OBJ_CHEST2:
1374  case OBJ_CHEST3:
1375  case OBJ_TCHEST1:
1376  case OBJ_TCHEST2:
1377  case OBJ_TCHEST3:
1378  AddChest(oi, ot);
1379  break;
1380  case OBJ_SARC:
1381  AddSarc(oi);
1382  break;
1383  case OBJ_FLAMEHOLE:
1384  AddFlameTrap(oi);
1385  break;
1386  case OBJ_FLAMELVR:
1387  AddFlameLvr(oi);
1388  break;
1389  case OBJ_WATER:
1390  object[oi]._oAnimFrame = 1;
1391  break;
1392  case OBJ_TRAPL:
1393  case OBJ_TRAPR:
1394  AddTrap(oi, ot);
1395  break;
1396  case OBJ_BARREL:
1397  case OBJ_BARRELEX:
1398  AddBarrel(oi, ot);
1399  break;
1400  case OBJ_SHRINEL:
1401  case OBJ_SHRINER:
1402  AddShrine(oi);
1403  break;
1404  case OBJ_BOOKCASEL:
1405  case OBJ_BOOKCASER:
1406  AddBookcase(oi);
1407  break;
1408  case OBJ_SKELBOOK:
1409  case OBJ_BOOKSTAND:
1410  AddBookstand(oi);
1411  break;
1412  case OBJ_BLOODFTN:
1413  AddBloodFtn(oi);
1414  break;
1415  case OBJ_DECAP:
1416  AddDecap(oi);
1417  break;
1418  case OBJ_PURIFYINGFTN:
1420  break;
1421  case OBJ_ARMORSTAND:
1422  case OBJ_WARARMOR:
1423  AddArmorStand(oi);
1424  break;
1425  case OBJ_GOATSHRINE:
1426  AddGoatShrine(oi);
1427  break;
1428  case OBJ_CAULDRON:
1429  AddCauldron(oi);
1430  break;
1431  case OBJ_MURKYFTN:
1432  AddMurkyFountain(oi);
1433  break;
1434  case OBJ_TEARFTN:
1435  AddTearFountain(oi);
1436  break;
1437  case OBJ_BOOK2L:
1438  AddVilebook(oi);
1439  break;
1440  case OBJ_MCIRCLE1:
1441  case OBJ_MCIRCLE2:
1442  AddMagicCircle(oi);
1443  break;
1444  case OBJ_STORYBOOK:
1445  AddStoryBook(oi);
1446  break;
1447  case OBJ_BCROSS:
1448  case OBJ_TBCROSS:
1449  AddBrnCross(oi);
1450  AddObjLight(oi, 5);
1451  break;
1452  case OBJ_PEDISTAL:
1453  AddPedistal(oi);
1454  break;
1455  case OBJ_WARWEAP:
1456  case OBJ_WEAPONRACK:
1457  AddWeaponRack(oi);
1458  break;
1459  case OBJ_TNUDEM2:
1460  AddTorturedBody(oi);
1461  break;
1462  }
1463  object[oi]._oAnimWidth2 = (object[oi]._oAnimWidth - 64) >> 1;
1464  nobjects++;
1465 }
1466 
1467 void Obj_Light(int i, int lr)
1468 {
1469  int ox, oy, dx, dy, p, tr;
1470  BOOL turnon;
1471 
1472  if (object[i]._oVar1 != -1) {
1473  ox = object[i]._ox;
1474  oy = object[i]._oy;
1475  tr = lr + 10;
1476  turnon = FALSE;
1477  if (!lightflag) {
1478  for (p = 0; p < MAX_PLRS && !turnon; p++) {
1479  if (plr[p].plractive) {
1480  if (currlevel == plr[p].plrlevel) {
1481  dx = abs(plr[p].WorldX - ox);
1482  dy = abs(plr[p].WorldY - oy);
1483  if (dx < tr && dy < tr)
1484  turnon = TRUE;
1485  }
1486  }
1487  }
1488  }
1489  if (turnon) {
1490  if (!object[i]._oVar1)
1491  object[i]._olid = AddLight(ox, oy, lr);
1492  object[i]._oVar1 = 1;
1493  } else {
1494  if (object[i]._oVar1 == 1)
1495  AddUnLight(object[i]._olid);
1496  object[i]._oVar1 = 0;
1497  }
1498  }
1499 }
1500 
1501 void Obj_Circle(int i)
1502 {
1503  int ox, oy, wx, wy;
1504 
1505  ox = object[i]._ox;
1506  oy = object[i]._oy;
1507  wx = plr[myplr].WorldX;
1508  wy = plr[myplr].WorldY;
1509  if (wx == ox && wy == oy) {
1510  if (object[i]._otype == OBJ_MCIRCLE1)
1511  object[i]._oAnimFrame = 2;
1512  if (object[i]._otype == OBJ_MCIRCLE2)
1513  object[i]._oAnimFrame = 4;
1514  if (ox == 45 && oy == 47) {
1515  object[i]._oVar6 = 2;
1516  } else if (ox == 26 && oy == 46) {
1517  object[i]._oVar6 = 1;
1518  } else {
1519  object[i]._oVar6 = 0;
1520  }
1521  if (ox == 35 && oy == 36 && object[i]._oVar5 == 3) {
1522  object[i]._oVar6 = 4;
1523  ObjChangeMapResync(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4);
1524  if (quests[Q_BETRAYER]._qactive == QUEST_ACTIVE)
1525  quests[Q_BETRAYER]._qvar1 = 4;
1526  AddMissile(plr[myplr].WorldX, plr[myplr].WorldY, 35, 46, plr[myplr]._pdir, MIS_RNDTELEPORT, 0, myplr, 0, 0);
1527  track_repeat_walk(FALSE);
1528  sgbMouseDown = 0;
1529  ClrPlrPath(myplr);
1530  StartStand(myplr, 0);
1531  }
1532  } else {
1533  if (object[i]._otype == OBJ_MCIRCLE1)
1534  object[i]._oAnimFrame = 1;
1535  if (object[i]._otype == OBJ_MCIRCLE2)
1536  object[i]._oAnimFrame = 3;
1537  object[i]._oVar6 = 0;
1538  }
1539 }
1540 
1541 void Obj_StopAnim(int i)
1542 {
1543  if (object[i]._oAnimFrame == object[i]._oAnimLen) {
1544  object[i]._oAnimCnt = 0;
1545  object[i]._oAnimDelay = 1000;
1546  }
1547 }
1548 
1549 void Obj_Door(int i)
1550 {
1551  int dx, dy;
1552 
1553  if (!object[i]._oVar4) {
1554  object[i]._oMissFlag = FALSE;
1555  object[i]._oSelFlag = 3;
1556  } else {
1557  dy = object[i]._oy;
1558  dx = object[i]._ox;
1559  object[i]._oSelFlag = 2;
1560  object[i]._oMissFlag = TRUE;
1561  object[i]._oVar4 = (((dItem[dx][dy] == 0 ? 1 : 0)
1562  & (dDead[dx][dy] == 0 ? 1 : 0)
1563  & (dPlayer[dx][dy] == 0 ? 1 : 0)
1564  & (dMonster[dx][dy] == 0 ? 1 : 0))
1565  == 0)
1566  + 1;
1567  }
1568 }
1569 
1570 void Obj_Sarc(int i)
1571 {
1572  if (object[i]._oAnimFrame == object[i]._oAnimLen)
1573  object[i]._oAnimFlag = 0;
1574 }
1575 
1576 void ActivateTrapLine(int ttype, int tid)
1577 {
1578  int i, oi;
1579 
1580  for (i = 0; i < nobjects; i++) {
1581  oi = objectactive[i];
1582  if (object[oi]._otype == ttype && object[oi]._oVar1 == tid) {
1583  object[oi]._oVar4 = 1;
1584  object[oi]._oAnimFlag = 1;
1585  object[oi]._oAnimDelay = 1;
1586  object[oi]._olid = AddLight(object[oi]._ox, object[oi]._oy, 1);
1587  }
1588  }
1589 }
1590 
1591 void Obj_FlameTrap(int i)
1592 {
1593  int x, y;
1594  int j, k;
1595 
1596  if (object[i]._oVar2) {
1597  if (object[i]._oVar4) {
1598  object[i]._oAnimFrame--;
1599  if (object[i]._oAnimFrame == 1) {
1600  object[i]._oVar4 = 0;
1601  AddUnLight(object[i]._olid);
1602  } else if (object[i]._oAnimFrame <= 4) {
1603  ChangeLightRadius(object[i]._olid, object[i]._oAnimFrame);
1604  }
1605  }
1606  } else if (!object[i]._oVar4) {
1607  if (object[i]._oVar3 == 2) {
1608  x = object[i]._ox - 2;
1609  y = object[i]._oy;
1610  for (j = 0; j < 5; j++) {
1611  if (dPlayer[x][y] || dMonster[x][y])
1612  object[i]._oVar4 = 1;
1613  x++;
1614  }
1615  } else {
1616  x = object[i]._ox;
1617  y = object[i]._oy - 2;
1618  for (k = 0; k < 5; k++) {
1619  if (dPlayer[x][y] || dMonster[x][y])
1620  object[i]._oVar4 = 1;
1621  y++;
1622  }
1623  }
1624  if (object[i]._oVar4)
1625  ActivateTrapLine(object[i]._otype, object[i]._oVar1);
1626  } else {
1627  if (object[i]._oAnimFrame == object[i]._oAnimLen)
1628  object[i]._oAnimFrame = 11;
1629  if (object[i]._oAnimFrame <= 5)
1630  ChangeLightRadius(object[i]._olid, object[i]._oAnimFrame);
1631  }
1632 }
1633 
1634 void Obj_Trap(int i)
1635 {
1636  int oti, dir;
1637  BOOLEAN otrig;
1638  int sx, sy, dx, dy, x, y;
1639 
1640  otrig = FALSE;
1641  if (!object[i]._oVar4) {
1642  oti = dObject[object[i]._oVar1][object[i]._oVar2] - 1;
1643  switch (object[oti]._otype) {
1644  case OBJ_L1LDOOR:
1645  case OBJ_L1RDOOR:
1646  case OBJ_L2LDOOR:
1647  case OBJ_L2RDOOR:
1648  case OBJ_L3LDOOR:
1649  case OBJ_L3RDOOR:
1650  if (object[oti]._oVar4)
1651  otrig = TRUE;
1652  break;
1653  case OBJ_LEVER:
1654  case OBJ_CHEST1:
1655  case OBJ_CHEST2:
1656  case OBJ_CHEST3:
1657  case OBJ_SWITCHSKL:
1658  case OBJ_SARC:
1659  if (object[oti]._oSelFlag == 0)
1660  otrig = TRUE;
1661  break;
1662  }
1663  if (otrig) {
1664  object[i]._oVar4 = 1;
1665  sx = object[i]._ox;
1666  sy = object[i]._oy;
1667  dx = object[oti]._ox;
1668  dy = object[oti]._oy;
1669  for (y = dy - 1; y <= object[oti]._oy + 1; y++) {
1670  for (x = object[oti]._ox - 1; x <= object[oti]._ox + 1; x++) {
1671  if (dPlayer[x][y]) {
1672  dx = x;
1673  dy = y;
1674  }
1675  }
1676  }
1677  if (!deltaload) {
1678  dir = GetDirection(sx, sy, dx, dy);
1679  AddMissile(sx, sy, dx, dy, dir, object[i]._oVar3, 1, -1, 0, 0);
1680  PlaySfxLoc(IS_TRAP, object[oti]._ox, object[oti]._oy);
1681  }
1682  object[oti]._oTrapFlag = FALSE;
1683  }
1684  }
1685 }
1686 
1687 void Obj_BCrossDamage(int i)
1688 {
1689  int fire_resist;
1690  int damage[4] = { 6, 8, 10, 12 };
1691 
1692  if (plr[myplr]._pmode == PM_DEATH)
1693  return;
1694 
1695  fire_resist = plr[myplr]._pFireResist;
1696  if (fire_resist > 0)
1697  damage[leveltype - 1] -= fire_resist * damage[leveltype - 1] / 100;
1698 
1699  if (plr[myplr].WorldX != object[i]._ox || plr[myplr].WorldY != object[i]._oy - 1)
1700  return;
1701 
1702  plr[myplr]._pHitPoints -= damage[leveltype - 1];
1703  plr[myplr]._pHPBase -= damage[leveltype - 1];
1704  if (plr[myplr]._pHitPoints >> 6 <= 0) {
1705  SyncPlrKill(myplr, 0);
1706  } else {
1707  if (plr[myplr]._pClass == PC_WARRIOR) {
1708  PlaySfxLoc(PS_WARR68, plr[myplr].WorldX, plr[myplr].WorldY);
1709 #ifndef SPAWN
1710  } else if (plr[myplr]._pClass == PC_ROGUE) {
1711  PlaySfxLoc(PS_ROGUE68, plr[myplr].WorldX, plr[myplr].WorldY);
1712  } else if (plr[myplr]._pClass == PC_SORCERER) {
1713  PlaySfxLoc(PS_MAGE68, plr[myplr].WorldX, plr[myplr].WorldY);
1714 #endif
1715  }
1716  }
1717  drawhpflag = TRUE;
1718 }
1719 
1721 {
1722  int oi;
1723  int i;
1724 
1725  for (i = 0; i < nobjects; ++i) {
1726  oi = objectactive[i];
1727  switch (object[oi]._otype) {
1728  case OBJ_L1LIGHT:
1729  Obj_Light(oi, 10);
1730  break;
1731  case OBJ_SKFIRE:
1732  case OBJ_CANDLE2:
1733  case OBJ_BOOKCANDLE:
1734  Obj_Light(oi, 5);
1735  break;
1736  case OBJ_STORYCANDLE:
1737  Obj_Light(oi, 3);
1738  break;
1739  case OBJ_CRUX1:
1740  case OBJ_CRUX2:
1741  case OBJ_CRUX3:
1742  case OBJ_BARREL:
1743  case OBJ_BARRELEX:
1744  case OBJ_SHRINEL:
1745  case OBJ_SHRINER:
1746  Obj_StopAnim(oi);
1747  break;
1748  case OBJ_L1LDOOR:
1749  case OBJ_L1RDOOR:
1750  case OBJ_L2LDOOR:
1751  case OBJ_L2RDOOR:
1752  case OBJ_L3LDOOR:
1753  case OBJ_L3RDOOR:
1754  Obj_Door(oi);
1755  break;
1756  case OBJ_TORCHL:
1757  case OBJ_TORCHR:
1758  case OBJ_TORCHL2:
1759  case OBJ_TORCHR2:
1760  Obj_Light(oi, 8);
1761  break;
1762  case OBJ_SARC:
1763  Obj_Sarc(oi);
1764  break;
1765  case OBJ_FLAMEHOLE:
1766  Obj_FlameTrap(oi);
1767  break;
1768  case OBJ_TRAPL:
1769  case OBJ_TRAPR:
1770  Obj_Trap(oi);
1771  break;
1772  case OBJ_MCIRCLE1:
1773  case OBJ_MCIRCLE2:
1774  Obj_Circle(oi);
1775  break;
1776  case OBJ_BCROSS:
1777  case OBJ_TBCROSS:
1778  Obj_Light(oi, 10);
1779  Obj_BCrossDamage(oi);
1780  break;
1781  }
1782  if (object[oi]._oAnimFlag == 0)
1783  continue;
1784 
1785  object[oi]._oAnimCnt++;
1786 
1787  if (object[oi]._oAnimCnt < object[oi]._oAnimDelay)
1788  continue;
1789 
1790  object[oi]._oAnimCnt = 0;
1791  object[oi]._oAnimFrame++;
1792  if (object[oi]._oAnimFrame > object[oi]._oAnimLen)
1793  object[oi]._oAnimFrame = 1;
1794  }
1795  i = 0;
1796  while (i < nobjects) {
1797  oi = objectactive[i];
1798  if (object[oi]._oDelFlag) {
1799  DeleteObject_(oi, i);
1800  i = 0;
1801  } else {
1802  i++;
1803  }
1804  }
1805 }
1806 
1807 void ObjSetMicro(int dx, int dy, int pn)
1808 {
1809  WORD *v;
1810  MICROS *defs;
1811  int i;
1812 
1813  dPiece[dx][dy] = pn;
1814  pn--;
1815  defs = &dpiece_defs_map_2[dx][dy];
1816  if (leveltype != DTYPE_HELL) {
1817  v = (WORD *)pLevelPieces + 10 * pn;
1818  for (i = 0; i < 10; i++) {
1819  defs->mt[i] = SDL_SwapLE16(v[(i & 1) - (i & 0xE) + 8]);
1820  }
1821  } else {
1822  v = (WORD *)pLevelPieces + 16 * pn;
1823  for (i = 0; i < 16; i++) {
1824  defs->mt[i] = SDL_SwapLE16(v[(i & 1) - (i & 0xE) + 14]);
1825  }
1826  }
1827 }
1828 
1829 void objects_set_door_piece(int x, int y)
1830 {
1831  int pn;
1832  long v1, v2;
1833 
1834  pn = dPiece[x][y] - 1;
1835 
1836  v1 = *((WORD *)pLevelPieces + 10 * pn + 8);
1837  v2 = *((WORD *)pLevelPieces + 10 * pn + 9);
1838  dpiece_defs_map_2[x][y].mt[0] = SDL_SwapLE16(v1);
1839  dpiece_defs_map_2[x][y].mt[1] = SDL_SwapLE16(v2);
1840 }
1841 
1842 void ObjSetMini(int x, int y, int v)
1843 {
1844  int xx, yy;
1845  long v1, v2, v3, v4;
1846  WORD *MegaTiles;
1847 
1848  MegaTiles = (WORD *)&pMegaTiles[((WORD)v - 1) * 8];
1849  v1 = SDL_SwapLE16(*(MegaTiles + 0)) + 1;
1850  v2 = SDL_SwapLE16(*(MegaTiles + 1)) + 1;
1851  v3 = SDL_SwapLE16(*(MegaTiles + 2)) + 1;
1852  v4 = SDL_SwapLE16(*(MegaTiles + 3)) + 1;
1853 
1854  xx = 2 * x + 16;
1855  yy = 2 * y + 16;
1856  ObjSetMicro(xx, yy, v1);
1857  ObjSetMicro(xx + 1, yy, v2);
1858  ObjSetMicro(xx, yy + 1, v3);
1859  ObjSetMicro(xx + 1, yy + 1, v4);
1860 }
1861 
1862 void ObjL1Special(int x1, int y1, int x2, int y2)
1863 {
1864  int i, j;
1865 
1866  for (i = y1; i <= y2; ++i) {
1867  for (j = x1; j <= x2; ++j) {
1868  dSpecial[j][i] = 0;
1869  if (dPiece[j][i] == 12)
1870  dSpecial[j][i] = 1;
1871  if (dPiece[j][i] == 11)
1872  dSpecial[j][i] = 2;
1873  if (dPiece[j][i] == 71)
1874  dSpecial[j][i] = 1;
1875  if (dPiece[j][i] == 259)
1876  dSpecial[j][i] = 5;
1877  if (dPiece[j][i] == 249)
1878  dSpecial[j][i] = 2;
1879  if (dPiece[j][i] == 325)
1880  dSpecial[j][i] = 2;
1881  if (dPiece[j][i] == 321)
1882  dSpecial[j][i] = 1;
1883  if (dPiece[j][i] == 255)
1884  dSpecial[j][i] = 4;
1885  if (dPiece[j][i] == 211)
1886  dSpecial[j][i] = 1;
1887  if (dPiece[j][i] == 344)
1888  dSpecial[j][i] = 2;
1889  if (dPiece[j][i] == 341)
1890  dSpecial[j][i] = 1;
1891  if (dPiece[j][i] == 331)
1892  dSpecial[j][i] = 2;
1893  if (dPiece[j][i] == 418)
1894  dSpecial[j][i] = 1;
1895  if (dPiece[j][i] == 421)
1896  dSpecial[j][i] = 2;
1897  }
1898  }
1899 }
1900 
1901 void ObjL2Special(int x1, int y1, int x2, int y2)
1902 {
1903  int i, j;
1904 
1905  for (j = y1; j <= y2; j++) {
1906  for (i = x1; i <= x2; i++) {
1907  dSpecial[i][j] = 0;
1908  if (dPiece[i][j] == 541)
1909  dSpecial[i][j] = 5;
1910  if (dPiece[i][j] == 178)
1911  dSpecial[i][j] = 5;
1912  if (dPiece[i][j] == 551)
1913  dSpecial[i][j] = 5;
1914  if (dPiece[i][j] == 542)
1915  dSpecial[i][j] = 6;
1916  if (dPiece[i][j] == 553)
1917  dSpecial[i][j] = 6;
1918  if (dPiece[i][j] == 13)
1919  dSpecial[i][j] = 5;
1920  if (dPiece[i][j] == 17)
1921  dSpecial[i][j] = 6;
1922  }
1923  }
1924  for (j = y1; j <= y2; j++) {
1925  for (i = x1; i <= x2; i++) {
1926  if (dPiece[i][j] == 132) {
1927  dSpecial[i][j + 1] = 2;
1928  dSpecial[i][j + 2] = 1;
1929  }
1930  if (dPiece[i][j] == 135 || dPiece[i][j] == 139) {
1931  dSpecial[i + 1][j] = 3;
1932  dSpecial[i + 2][j] = 4;
1933  }
1934  }
1935  }
1936 }
1937 
1938 void DoorSet(int oi, int dx, int dy)
1939 {
1940  int pn;
1941 
1942  pn = dPiece[dx][dy];
1943  if (pn == 43)
1944  ObjSetMicro(dx, dy, 392);
1945  if (pn == 45)
1946  ObjSetMicro(dx, dy, 394);
1947  if (pn == 50 && object[oi]._otype == OBJ_L1LDOOR)
1948  ObjSetMicro(dx, dy, 411);
1949  if (pn == 50 && object[oi]._otype == OBJ_L1RDOOR)
1950  ObjSetMicro(dx, dy, 412);
1951  if (pn == 54)
1952  ObjSetMicro(dx, dy, 397);
1953  if (pn == 55)
1954  ObjSetMicro(dx, dy, 398);
1955  if (pn == 61)
1956  ObjSetMicro(dx, dy, 399);
1957  if (pn == 67)
1958  ObjSetMicro(dx, dy, 400);
1959  if (pn == 68)
1960  ObjSetMicro(dx, dy, 401);
1961  if (pn == 69)
1962  ObjSetMicro(dx, dy, 403);
1963  if (pn == 70)
1964  ObjSetMicro(dx, dy, 404);
1965  if (pn == 72)
1966  ObjSetMicro(dx, dy, 406);
1967  if (pn == 212)
1968  ObjSetMicro(dx, dy, 407);
1969  if (pn == 354)
1970  ObjSetMicro(dx, dy, 409);
1971  if (pn == 355)
1972  ObjSetMicro(dx, dy, 410);
1973  if (pn == 411)
1974  ObjSetMicro(dx, dy, 396);
1975  if (pn == 412)
1976  ObjSetMicro(dx, dy, 396);
1977 }
1978 
1980 {
1981  int p;
1982 
1983  for (p = 0; p < MAX_PLRS; p++) {
1984  if (plr[p].plractive && currlevel == plr[p].plrlevel) {
1985  ChangeVisionXY(plr[p]._pvid, plr[p].WorldX, plr[p].WorldY);
1986  }
1987  }
1988 }
1989 
1990 void OperateL1RDoor(int pnum, int oi, BOOL sendflag)
1991 {
1992  int xp, yp;
1993 
1994  if (object[oi]._oVar4 == 2) {
1995  if (!deltaload)
1996  PlaySfxLoc(IS_DOORCLOS, object[oi]._ox, object[oi]._oy);
1997  return;
1998  }
1999 
2000  xp = object[oi]._ox;
2001  yp = object[oi]._oy;
2002  if (object[oi]._oVar4 == 0) {
2003  if (pnum == myplr && sendflag)
2004  NetSendCmdParam1(TRUE, CMD_OPENDOOR, oi);
2005  if (!deltaload)
2006  PlaySfxLoc(IS_DOOROPEN, object[oi]._ox, object[oi]._oy);
2007  ObjSetMicro(xp, yp, 395);
2008  dSpecial[xp][yp] = 8;
2009  objects_set_door_piece(xp, yp - 1);
2010  object[oi]._oAnimFrame += 2;
2011  object[oi]._oPreFlag = TRUE;
2012  DoorSet(oi, xp - 1, yp);
2013  object[oi]._oVar4 = 1;
2014  object[oi]._oSelFlag = 2;
2015  RedoPlayerVision();
2016  return;
2017  }
2018 
2019  if (!deltaload)
2020  PlaySfxLoc(IS_DOORCLOS, xp, object[oi]._oy);
2021  if (((dDead[xp][yp] != 0 ? 0 : 1) & (dMonster[xp][yp] != 0 ? 0 : 1) & (dItem[xp][yp] != 0 ? 0 : 1)) != 0) {
2022  if (pnum == myplr && sendflag)
2023  NetSendCmdParam1(TRUE, CMD_CLOSEDOOR, oi);
2024  object[oi]._oVar4 = 0;
2025  object[oi]._oSelFlag = 3;
2026  ObjSetMicro(xp, yp, object[oi]._oVar1);
2027  if (object[oi]._oVar2 != 50) {
2028  ObjSetMicro(xp - 1, yp, object[oi]._oVar2);
2029  } else {
2030  if (dPiece[xp - 1][yp] == 396)
2031  ObjSetMicro(xp - 1, yp, 411);
2032  else
2033  ObjSetMicro(xp - 1, yp, 50);
2034  }
2035  object[oi]._oAnimFrame -= 2;
2036  object[oi]._oPreFlag = FALSE;
2037  RedoPlayerVision();
2038  } else {
2039  object[oi]._oVar4 = 2;
2040  }
2041 }
2042 
2043 void OperateL1LDoor(int pnum, int oi, BOOL sendflag)
2044 {
2045  int xp, yp;
2046 
2047  if (object[oi]._oVar4 == 2) {
2048  if (!deltaload)
2049  PlaySfxLoc(IS_DOORCLOS, object[oi]._ox, object[oi]._oy);
2050  return;
2051  }
2052 
2053  xp = object[oi]._ox;
2054  yp = object[oi]._oy;
2055  if (object[oi]._oVar4 == 0) {
2056  if (pnum == myplr && sendflag)
2057  NetSendCmdParam1(TRUE, CMD_OPENDOOR, oi);
2058  if (!deltaload)
2059  PlaySfxLoc(IS_DOOROPEN, object[oi]._ox, object[oi]._oy);
2060  if (object[oi]._oVar1 == 214)
2061  ObjSetMicro(xp, yp, 408);
2062  else
2063  ObjSetMicro(xp, yp, 393);
2064  dSpecial[xp][yp] = 7;
2065  objects_set_door_piece(xp - 1, yp);
2066  object[oi]._oAnimFrame += 2;
2067  object[oi]._oPreFlag = TRUE;
2068  DoorSet(oi, xp, yp - 1);
2069  object[oi]._oVar4 = 1;
2070  object[oi]._oSelFlag = 2;
2071  RedoPlayerVision();
2072  return;
2073  }
2074 
2075  if (!deltaload)
2076  PlaySfxLoc(IS_DOORCLOS, xp, object[oi]._oy);
2077  if (((dDead[xp][yp] != 0 ? 0 : 1) & (dMonster[xp][yp] != 0 ? 0 : 1) & (dItem[xp][yp] != 0 ? 0 : 1)) != 0) {
2078  if (pnum == myplr && sendflag)
2079  NetSendCmdParam1(TRUE, CMD_CLOSEDOOR, oi);
2080  object[oi]._oVar4 = 0;
2081  object[oi]._oSelFlag = 3;
2082  ObjSetMicro(xp, yp, object[oi]._oVar1);
2083  if (object[oi]._oVar2 != 50) {
2084  ObjSetMicro(xp, yp - 1, object[oi]._oVar2);
2085  } else {
2086  if (dPiece[xp][yp - 1] == 396)
2087  ObjSetMicro(xp, yp - 1, 412);
2088  else
2089  ObjSetMicro(xp, yp - 1, 50);
2090  }
2091  object[oi]._oAnimFrame -= 2;
2092  object[oi]._oPreFlag = FALSE;
2093  RedoPlayerVision();
2094  } else {
2095  object[oi]._oVar4 = 2;
2096  }
2097 }
2098 
2099 void OperateL2RDoor(int pnum, int oi, BOOL sendflag)
2100 {
2101  int xp, yp;
2102 
2103  if (object[oi]._oVar4 == 2) {
2104  if (!deltaload)
2105  PlaySfxLoc(IS_DOORCLOS, object[oi]._ox, object[oi]._oy);
2106  return;
2107  }
2108  xp = object[oi]._ox;
2109  yp = object[oi]._oy;
2110  if (object[oi]._oVar4 == 0) {
2111  if (pnum == myplr && sendflag)
2112  NetSendCmdParam1(TRUE, CMD_OPENDOOR, oi);
2113  if (!deltaload)
2114  PlaySfxLoc(IS_DOOROPEN, object[oi]._ox, object[oi]._oy);
2115  ObjSetMicro(xp, yp, 17);
2116  object[oi]._oAnimFrame += 2;
2117  object[oi]._oPreFlag = TRUE;
2118  object[oi]._oVar4 = 1;
2119  object[oi]._oSelFlag = 2;
2120  RedoPlayerVision();
2121  return;
2122  }
2123 
2124  if (!deltaload)
2125  PlaySfxLoc(IS_DOORCLOS, object[oi]._ox, yp);
2126  if (((dDead[xp][yp] != 0 ? 0 : 1) & (dMonster[xp][yp] != 0 ? 0 : 1) & (dItem[xp][yp] != 0 ? 0 : 1)) != 0) {
2127  if (pnum == myplr && sendflag)
2128  NetSendCmdParam1(TRUE, CMD_CLOSEDOOR, oi);
2129  object[oi]._oVar4 = 0;
2130  object[oi]._oSelFlag = 3;
2131  ObjSetMicro(xp, yp, 540);
2132  object[oi]._oAnimFrame -= 2;
2133  object[oi]._oPreFlag = FALSE;
2134  RedoPlayerVision();
2135  } else {
2136  object[oi]._oVar4 = 2;
2137  }
2138 }
2139 
2140 void OperateL2LDoor(int pnum, int oi, BOOL sendflag)
2141 {
2142  int xp, yp;
2143 
2144  if (object[oi]._oVar4 == 2) {
2145  if (!deltaload)
2146  PlaySfxLoc(IS_DOORCLOS, object[oi]._ox, object[oi]._oy);
2147  return;
2148  }
2149  xp = object[oi]._ox;
2150  yp = object[oi]._oy;
2151  if (object[oi]._oVar4 == 0) {
2152  if (pnum == myplr && sendflag)
2153  NetSendCmdParam1(TRUE, CMD_OPENDOOR, oi);
2154  if (!deltaload)
2155  PlaySfxLoc(IS_DOOROPEN, object[oi]._ox, object[oi]._oy);
2156  ObjSetMicro(xp, yp, 13);
2157  object[oi]._oAnimFrame += 2;
2158  object[oi]._oPreFlag = TRUE;
2159  object[oi]._oVar4 = 1;
2160  object[oi]._oSelFlag = 2;
2161  RedoPlayerVision();
2162  return;
2163  }
2164 
2165  if (!deltaload)
2166  PlaySfxLoc(IS_DOORCLOS, object[oi]._ox, yp);
2167  if (((dDead[xp][yp] != 0 ? 0 : 1) & (dMonster[xp][yp] != 0 ? 0 : 1) & (dItem[xp][yp] != 0 ? 0 : 1)) != 0) {
2168  if (pnum == myplr && sendflag)
2169  NetSendCmdParam1(TRUE, CMD_CLOSEDOOR, oi);
2170  object[oi]._oVar4 = 0;
2171  object[oi]._oSelFlag = 3;
2172  ObjSetMicro(xp, yp, 538);
2173  object[oi]._oAnimFrame -= 2;
2174  object[oi]._oPreFlag = FALSE;
2175  RedoPlayerVision();
2176  } else {
2177  object[oi]._oVar4 = 2;
2178  }
2179 }
2180 
2181 void OperateL3RDoor(int pnum, int oi, BOOL sendflag)
2182 {
2183  int xp, yp;
2184 
2185  if (object[oi]._oVar4 == 2) {
2186  if (!deltaload)
2187  PlaySfxLoc(IS_DOORCLOS, object[oi]._ox, object[oi]._oy);
2188  return;
2189  }
2190 
2191  xp = object[oi]._ox;
2192  yp = object[oi]._oy;
2193  if (object[oi]._oVar4 == 0) {
2194  if (pnum == myplr && sendflag)
2195  NetSendCmdParam1(TRUE, CMD_OPENDOOR, oi);
2196  if (!deltaload)
2197  PlaySfxLoc(IS_DOOROPEN, object[oi]._ox, object[oi]._oy);
2198  ObjSetMicro(xp, yp, 541);
2199  object[oi]._oAnimFrame += 2;
2200  object[oi]._oPreFlag = TRUE;
2201  object[oi]._oVar4 = 1;
2202  object[oi]._oSelFlag = 2;
2203  RedoPlayerVision();
2204  return;
2205  }
2206 
2207  if (!deltaload)
2208  PlaySfxLoc(IS_DOORCLOS, object[oi]._ox, yp);
2209  if (((dDead[xp][yp] != 0 ? 0 : 1) & (dMonster[xp][yp] != 0 ? 0 : 1) & (dItem[xp][yp] != 0 ? 0 : 1)) != 0) {
2210  if (pnum == myplr && sendflag)
2211  NetSendCmdParam1(TRUE, CMD_CLOSEDOOR, oi);
2212  object[oi]._oVar4 = 0;
2213  object[oi]._oSelFlag = 3;
2214  ObjSetMicro(xp, yp, 534);
2215  object[oi]._oAnimFrame -= 2;
2216  object[oi]._oPreFlag = FALSE;
2217  RedoPlayerVision();
2218  } else {
2219  object[oi]._oVar4 = 2;
2220  }
2221 }
2222 
2223 void OperateL3LDoor(int pnum, int oi, BOOL sendflag)
2224 {
2225  int xp, yp;
2226 
2227  if (object[oi]._oVar4 == 2) {
2228  if (!deltaload)
2229  PlaySfxLoc(IS_DOORCLOS, object[oi]._ox, object[oi]._oy);
2230  return;
2231  }
2232 
2233  xp = object[oi]._ox;
2234  yp = object[oi]._oy;
2235  if (object[oi]._oVar4 == 0) {
2236  if (pnum == myplr && sendflag)
2237  NetSendCmdParam1(TRUE, CMD_OPENDOOR, oi);
2238  if (!deltaload)
2239  PlaySfxLoc(IS_DOOROPEN, object[oi]._ox, object[oi]._oy);
2240  ObjSetMicro(xp, yp, 538);
2241  object[oi]._oAnimFrame += 2;
2242  object[oi]._oPreFlag = TRUE;
2243  object[oi]._oVar4 = 1;
2244  object[oi]._oSelFlag = 2;
2245  RedoPlayerVision();
2246  return;
2247  }
2248 
2249  if (!deltaload)
2250  PlaySfxLoc(IS_DOORCLOS, object[oi]._ox, yp);
2251  if (((dDead[xp][yp] != 0 ? 0 : 1) & (dMonster[xp][yp] != 0 ? 0 : 1) & (dItem[xp][yp] != 0 ? 0 : 1)) != 0) {
2252  if (pnum == myplr && sendflag)
2253  NetSendCmdParam1(TRUE, CMD_CLOSEDOOR, oi);
2254  object[oi]._oVar4 = 0;
2255  object[oi]._oSelFlag = 3;
2256  ObjSetMicro(xp, yp, 531);
2257  object[oi]._oAnimFrame -= 2;
2258  object[oi]._oPreFlag = FALSE;
2259  RedoPlayerVision();
2260  } else {
2261  object[oi]._oVar4 = 2;
2262  }
2263 }
2264 
2265 void MonstCheckDoors(int m)
2266 {
2267  int i, oi;
2268  int dpx, dpy, mx, my;
2269 
2270  mx = monster[m]._mx;
2271  my = monster[m]._my;
2272  if (dObject[mx - 1][my - 1]
2273  || dObject[mx][my - 1]
2274  || dObject[mx + 1][my - 1]
2275  || dObject[mx - 1][my]
2276  || dObject[mx + 1][my]
2277  || dObject[mx - 1][my + 1]
2278  || dObject[mx][my + 1]
2279  || dObject[mx + 1][my + 1]) {
2280  for (i = 0; i < nobjects; ++i) {
2281  oi = objectactive[i];
2282  if ((object[oi]._otype == OBJ_L1LDOOR || object[oi]._otype == OBJ_L1RDOOR) && !object[oi]._oVar4) {
2283  dpx = abs(object[oi]._ox - mx);
2284  dpy = abs(object[oi]._oy - my);
2285  if (dpx == 1 && dpy <= 1 && object[oi]._otype == OBJ_L1LDOOR)
2286  OperateL1LDoor(myplr, oi, TRUE);
2287  if (dpx <= 1 && dpy == 1 && object[oi]._otype == OBJ_L1RDOOR)
2288  OperateL1RDoor(myplr, oi, TRUE);
2289  }
2290  if ((object[oi]._otype == OBJ_L2LDOOR || object[oi]._otype == OBJ_L2RDOOR) && !object[oi]._oVar4) {
2291  dpx = abs(object[oi]._ox - mx);
2292  dpy = abs(object[oi]._oy - my);
2293  if (dpx == 1 && dpy <= 1 && object[oi]._otype == OBJ_L2LDOOR)
2294  OperateL2LDoor(myplr, oi, TRUE);
2295  if (dpx <= 1 && dpy == 1 && object[oi]._otype == OBJ_L2RDOOR)
2296  OperateL2RDoor(myplr, oi, TRUE);
2297  }
2298  if ((object[oi]._otype == OBJ_L3LDOOR || object[oi]._otype == OBJ_L3RDOOR) && !object[oi]._oVar4) {
2299  dpx = abs(object[oi]._ox - mx);
2300  dpy = abs(object[oi]._oy - my);
2301  if (dpx == 1 && dpy <= 1 && object[oi]._otype == OBJ_L3RDOOR)
2302  OperateL3RDoor(myplr, oi, TRUE);
2303  if (dpx <= 1 && dpy == 1 && object[oi]._otype == OBJ_L3LDOOR)
2304  OperateL3LDoor(myplr, oi, TRUE);
2305  }
2306  }
2307  }
2308 }
2309 
2310 void ObjChangeMap(int x1, int y1, int x2, int y2)
2311 {
2312  int i, j;
2313 
2314  for (j = y1; j <= y2; j++) {
2315  for (i = x1; i <= x2; i++) {
2316  ObjSetMini(i, j, pdungeon[i][j]);
2317  dungeon[i][j] = pdungeon[i][j];
2318  }
2319  }
2320  if (leveltype == DTYPE_CATHEDRAL) {
2321  ObjL1Special(2 * x1 + 16, 2 * y1 + 16, 2 * x2 + 17, 2 * y2 + 17);
2322  AddL1Objs(2 * x1 + 16, 2 * y1 + 16, 2 * x2 + 17, 2 * y2 + 17);
2323  }
2324  if (leveltype == DTYPE_CATACOMBS) {
2325  ObjL2Special(2 * x1 + 16, 2 * y1 + 16, 2 * x2 + 17, 2 * y2 + 17);
2326  AddL2Objs(2 * x1 + 16, 2 * y1 + 16, 2 * x2 + 17, 2 * y2 + 17);
2327  }
2328 }
2329 
2330 void ObjChangeMapResync(int x1, int y1, int x2, int y2)
2331 {
2332  int i, j;
2333 
2334  for (j = y1; j <= y2; j++) {
2335  for (i = x1; i <= x2; i++) {
2336  ObjSetMini(i, j, pdungeon[i][j]);
2337  dungeon[i][j] = pdungeon[i][j];
2338  }
2339  }
2340  if (leveltype == DTYPE_CATHEDRAL) {
2341  ObjL1Special(2 * x1 + 16, 2 * y1 + 16, 2 * x2 + 17, 2 * y2 + 17);
2342  }
2343  if (leveltype == DTYPE_CATACOMBS) {
2344  ObjL2Special(2 * x1 + 16, 2 * y1 + 16, 2 * x2 + 17, 2 * y2 + 17);
2345  }
2346 }
2347 
2348 void OperateL1Door(int pnum, int i, BOOL sendflag)
2349 {
2350  int dpx, dpy;
2351 
2352  dpx = abs(object[i]._ox - plr[pnum].WorldX);
2353  dpy = abs(object[i]._oy - plr[pnum].WorldY);
2354  if (dpx == 1 && dpy <= 1 && object[i]._otype == OBJ_L1LDOOR)
2355  OperateL1LDoor(pnum, i, sendflag);
2356  if (dpx <= 1 && dpy == 1 && object[i]._otype == OBJ_L1RDOOR)
2357  OperateL1RDoor(pnum, i, sendflag);
2358 }
2359 
2360 void OperateLever(int pnum, int i)
2361 {
2362  int j, oi;
2363  BOOL mapflag;
2364 
2365  if (object[i]._oSelFlag != 0) {
2366  if (!deltaload)
2367  PlaySfxLoc(IS_LEVER, object[i]._ox, object[i]._oy);
2368  object[i]._oSelFlag = 0;
2369  object[i]._oAnimFrame++;
2370  mapflag = TRUE;
2371  if (currlevel == 16) {
2372  for (j = 0; j < nobjects; j++) {
2373  oi = objectactive[j];
2374  if (object[oi]._otype == OBJ_SWITCHSKL
2375  && object[i]._oVar8 == object[oi]._oVar8
2376  && object[oi]._oSelFlag != 0) {
2377  mapflag = FALSE;
2378  }
2379  }
2380  }
2381  if (mapflag)
2382  ObjChangeMap(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4);
2383  if (pnum == myplr)
2384  NetSendCmdParam1(FALSE, CMD_OPERATEOBJ, i);
2385  }
2386 }
2387 
2388 void OperateBook(int pnum, int i)
2389 {
2390  int j, oi;
2391  int dx, dy;
2392  BOOL do_add_missile, missile_added;
2393 
2394  if (object[i]._oSelFlag == 0)
2395  return;
2396  if (setlevel && setlvlnum == SL_VILEBETRAYER) {
2397  do_add_missile = FALSE;
2398  missile_added = FALSE;
2399  for (j = 0; j < nobjects; j++) {
2400  oi = objectactive[j];
2401  if (object[oi]._otype == OBJ_MCIRCLE2) {
2402  if (object[oi]._oVar6 == 1) {
2403  dx = 27;
2404  dy = 29;
2405  object[oi]._oVar6 = 4;
2406  do_add_missile = TRUE;
2407  }
2408  if (object[oi]._oVar6 == 2) {
2409  dx = 43;
2410  dy = 29;
2411  object[oi]._oVar6 = 4;
2412  do_add_missile = TRUE;
2413  }
2414  }
2415  if (do_add_missile) {
2416  object[dObject[35][36] - 1]._oVar5++;
2417  AddMissile(plr[pnum].WorldX, plr[pnum].WorldY, dx, dy, plr[pnum]._pdir, MIS_RNDTELEPORT, 0, pnum, 0, 0);
2418  missile_added = TRUE;
2419  do_add_missile = FALSE;
2420  }
2421  }
2422  if (!missile_added)
2423  return;
2424  }
2425  object[i]._oAnimFrame++;
2426  object[i]._oSelFlag = 0;
2427  if (!setlevel)
2428  return;
2429 
2430  if (setlvlnum == SL_BONECHAMB) {
2431  plr[myplr]._pMemSpells |= ((__int64)1 << (SPL_GUARDIAN - 1));
2432  if (plr[pnum]._pSplLvl[SPL_GUARDIAN] < 15)
2435  if (!deltaload)
2436  PlaySfxLoc(IS_QUESTDN, object[i]._ox, object[i]._oy);
2438  AddMissile(
2439  plr[myplr].WorldX,
2440  plr[myplr].WorldY,
2441  object[i]._ox - 2,
2442  object[i]._oy - 4,
2443  plr[myplr]._pdir,
2444  MIS_GUARDIAN,
2445  0,
2446  myplr,
2447  0,
2448  0);
2449  }
2450  if (setlevel && setlvlnum == SL_VILEBETRAYER) {
2452  object[i]._oVar1,
2453  object[i]._oVar2,
2454  object[i]._oVar3,
2455  object[i]._oVar4);
2456  for (j = 0; j < nobjects; j++)
2458  }
2459 }
2460 
2461 void OperateBookLever(int pnum, int i)
2462 {
2463  int x, y, tren;
2464 
2465  x = 2 * setpc_x + 16;
2466  y = 2 * setpc_y + 16;
2467  if (object[i]._oSelFlag != 0 && !qtextflag) {
2468  if (object[i]._otype == OBJ_BLINDBOOK && !quests[Q_BLIND]._qvar1) {
2470  quests[Q_BLIND]._qlog = 1;
2471  quests[Q_BLIND]._qvar1 = 1;
2472  }
2473  if (object[i]._otype == OBJ_BLOODBOOK && !quests[Q_BLOOD]._qvar1) {
2475  quests[Q_BLOOD]._qlog = 1;
2476  quests[Q_BLOOD]._qvar1 = 1;
2477  SpawnQuestItem(IDI_BLDSTONE, 2 * setpc_x + 19, 2 * setpc_y + 26, 0, 1);
2478  SpawnQuestItem(IDI_BLDSTONE, 2 * setpc_x + 31, 2 * setpc_y + 26, 0, 1);
2479  SpawnQuestItem(IDI_BLDSTONE, 2 * setpc_x + 25, 2 * setpc_y + 33, 0, 1);
2480  }
2481  object[i]._otype = object[i]._otype;
2482  if (object[i]._otype == OBJ_STEELTOME && !quests[Q_WARLORD]._qvar1) {
2484  quests[Q_WARLORD]._qlog = 1;
2485  quests[Q_WARLORD]._qvar1 = 1;
2486  }
2487  if (object[i]._oAnimFrame != object[i]._oVar6) {
2488  if (object[i]._otype != OBJ_BLOODBOOK)
2489  ObjChangeMap(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4);
2490  if (object[i]._otype == OBJ_BLINDBOOK) {
2491  CreateItem(3, x + 5, y + 5);
2492  tren = TransVal;
2493  TransVal = 9;
2494  DRLG_MRectTrans(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4);
2495  TransVal = tren;
2496  }
2497  }
2498  object[i]._oAnimFrame = object[i]._oVar6;
2499  InitQTextMsg(object[i]._oVar7);
2500  if (pnum == myplr)
2501  NetSendCmdParam1(FALSE, CMD_OPERATEOBJ, i);
2502  }
2503 }
2504 
2505 void OperateSChambBk(int pnum, int i)
2506 {
2507  int j, textdef;
2508 
2509  if (object[i]._oSelFlag != 0 && !qtextflag) {
2510  if (object[i]._oAnimFrame != object[i]._oVar6) {
2511  ObjChangeMapResync(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4);
2512  for (j = 0; j < nobjects; j++)
2514  }
2515  object[i]._oAnimFrame = object[i]._oVar6;
2516  if (quests[Q_SCHAMB]._qactive == QUEST_INIT) {
2518  quests[Q_SCHAMB]._qlog = 1;
2519  }
2520  if (plr[myplr]._pClass == PC_WARRIOR) {
2521  textdef = TEXT_BONER;
2522  } else if (plr[myplr]._pClass == PC_ROGUE) {
2523  textdef = TEXT_RBONER;
2524  } else if (plr[myplr]._pClass == PC_SORCERER) {
2525  textdef = TEXT_MBONER;
2526  }
2527  quests[Q_SCHAMB]._qmsg = textdef;
2528  InitQTextMsg(textdef);
2529  }
2530 }
2531 
2532 void OperateChest(int pnum, int i, BOOL sendmsg)
2533 {
2534  int j, mdir, mtype;
2535 
2536  if (object[i]._oSelFlag != 0) {
2537  if (!deltaload)
2538  PlaySfxLoc(IS_CHEST, object[i]._ox, object[i]._oy);
2539  object[i]._oAnimFrame += 2;
2540  object[i]._oSelFlag = 0;
2541  if (!deltaload) {
2542  SetRndSeed(object[i]._oRndSeed);
2543  if (setlevel) {
2544  for (j = 0; j < object[i]._oVar1; j++) {
2545  CreateRndItem(object[i]._ox, object[i]._oy, TRUE, sendmsg, FALSE);
2546  }
2547  } else {
2548  for (j = 0; j < object[i]._oVar1; j++) {
2549  if (object[i]._oVar2)
2550  CreateRndItem(object[i]._ox, object[i]._oy, FALSE, sendmsg, FALSE);
2551  else
2552  CreateRndUseful(pnum, object[i]._ox, object[i]._oy, sendmsg);
2553  }
2554  }
2555  if (object[i]._oTrapFlag && object[i]._otype >= OBJ_TCHEST1 && object[i]._otype <= OBJ_TCHEST3) {
2556  mdir = GetDirection(object[i]._ox, object[i]._oy, plr[pnum].WorldX, plr[pnum].WorldY);
2557  switch (object[i]._oVar4) {
2558  case 0:
2559  mtype = MIS_ARROW;
2560  break;
2561  case 1:
2562  mtype = MIS_FARROW;
2563  break;
2564  case 2:
2565  mtype = MIS_NOVA;
2566  break;
2567  }
2568  AddMissile(object[i]._ox, object[i]._oy, plr[pnum].WorldX, plr[pnum].WorldY, mdir, mtype, 1, -1, 0, 0);
2569  object[i]._oTrapFlag = FALSE;
2570  }
2571  if (pnum == myplr)
2572  NetSendCmdParam2(FALSE, CMD_PLROPOBJ, pnum, i);
2573  return;
2574  }
2575  }
2576 }
2577 
2578 void OperateMushPatch(int pnum, int i)
2579 {
2580  int x, y;
2581 
2582  if (quests[Q_MUSHROOM]._qactive != QUEST_ACTIVE || quests[Q_MUSHROOM]._qvar1 < QS_TOMEGIVEN) {
2583  if (!deltaload && pnum == myplr) {
2584  if (plr[myplr]._pClass == PC_WARRIOR) {
2585  PlaySFX(PS_WARR13);
2586 #ifndef SPAWN
2587  } else if (plr[myplr]._pClass == PC_ROGUE) {
2589  } else if (plr[myplr]._pClass == PC_SORCERER) {
2590  PlaySFX(PS_MAGE13);
2591 #endif
2592  }
2593  }
2594  } else {
2595  if (object[i]._oSelFlag != 0) {
2596  if (!deltaload)
2597  PlaySfxLoc(IS_CHEST, object[i]._ox, object[i]._oy);
2598  object[i]._oSelFlag = 0;
2599  object[i]._oAnimFrame++;
2600  if (!deltaload) {
2601  GetSuperItemLoc(object[i]._ox, object[i]._oy, &x, &y);
2602  SpawnQuestItem(IDI_MUSHROOM, x, y, 0, 0);
2604  }
2605  }
2606  }
2607 }
2608 
2609 void OperateInnSignChest(int pnum, int i)
2610 {
2611  int x, y;
2612 
2613  if (quests[Q_LTBANNER]._qvar1 != 2) {
2614  if (!deltaload && pnum == myplr) {
2615  if (plr[myplr]._pClass == PC_WARRIOR) {
2616  PlaySFX(PS_WARR24);
2617 #ifndef SPAWN
2618  } else if (plr[myplr]._pClass == PC_ROGUE) {
2620  } else if (plr[myplr]._pClass == PC_SORCERER) {
2621  PlaySFX(PS_MAGE24);
2622 #endif
2623  }
2624  }
2625  } else {
2626  if (object[i]._oSelFlag != 0) {
2627  if (!deltaload)
2628  PlaySfxLoc(IS_CHEST, object[i]._ox, object[i]._oy);
2629  object[i]._oAnimFrame += 2;
2630  object[i]._oSelFlag = 0;
2631  if (!deltaload) {
2632  GetSuperItemLoc(object[i]._ox, object[i]._oy, &x, &y);
2633  SpawnQuestItem(IDI_BANNER, x, y, 0, 0);
2634  }
2635  }
2636  }
2637 }
2638 
2639 void OperateSlainHero(int pnum, int i, BOOL sendmsg)
2640 {
2641  if (object[i]._oSelFlag != 0) {
2642  object[i]._oSelFlag = 0;
2643  if (!deltaload) {
2644  if (plr[pnum]._pClass == PC_WARRIOR) {
2645  CreateMagicArmor(object[i]._ox, object[i]._oy, ITYPE_HARMOR, ICURS_BREAST_PLATE, FALSE, TRUE);
2646 #ifndef SPAWN
2647  PlaySfxLoc(PS_WARR9, plr[myplr].WorldX, plr[myplr].WorldY);
2648 #endif
2649  } else if (plr[pnum]._pClass == PC_ROGUE) {
2650  CreateMagicWeapon(object[i]._ox, object[i]._oy, ITYPE_BOW, ICURS_LONG_WAR_BOW, FALSE, TRUE);
2651 #ifndef SPAWN
2652  PlaySfxLoc(PS_ROGUE9, plr[myplr].WorldX, plr[myplr].WorldY);
2653 #endif
2654  } else if (plr[pnum]._pClass == PC_SORCERER) {
2655  CreateSpellBook(object[i]._ox, object[i]._oy, SPL_LIGHTNING, FALSE, TRUE);
2656 #ifndef SPAWN
2657  PlaySfxLoc(PS_MAGE9, plr[myplr].WorldX, plr[myplr].WorldY);
2658 #endif
2659  }
2660  if (pnum == myplr)
2661  NetSendCmdParam1(FALSE, CMD_OPERATEOBJ, i);
2662  }
2663  }
2664 }
2665 
2666 void OperateTrapLvr(int i)
2667 {
2668  int frame, j, oi;
2669 
2670  frame = object[i]._oAnimFrame;
2671  j = 0;
2672 
2673  if (frame == 1) {
2674  object[i]._oAnimFrame = 2;
2675  for (; j < nobjects; j++) {
2676  oi = objectactive[j];
2677  if (object[oi]._otype == object[i]._oVar2 && object[oi]._oVar1 == object[i]._oVar1) {
2678  object[oi]._oVar2 = 1;
2679  object[oi]._oAnimFlag = 0;
2680  }
2681  }
2682  return;
2683  }
2684 
2685  object[i]._oAnimFrame = frame - 1;
2686  for (; j < nobjects; j++) {
2687  oi = objectactive[j];
2688  if (object[oi]._otype == object[i]._oVar2 && object[oi]._oVar1 == object[i]._oVar1) {
2689  object[oi]._oVar2 = 0;
2690  if (object[oi]._oVar4 != 0)
2691  object[oi]._oAnimFlag = 1;
2692  }
2693  }
2694 }
2695 
2696 void OperateSarc(int pnum, int i, BOOL sendmsg)
2697 {
2698  if (object[i]._oSelFlag != 0) {
2699  if (!deltaload)
2700  PlaySfxLoc(IS_SARC, object[i]._ox, object[i]._oy);
2701  object[i]._oSelFlag = 0;
2702  if (deltaload) {
2703  object[i]._oAnimFrame = object[i]._oAnimLen;
2704  } else {
2705  object[i]._oAnimFlag = 1;
2706  object[i]._oAnimDelay = 3;
2707  SetRndSeed(object[i]._oRndSeed);
2708  if (object[i]._oVar1 <= 2)
2709  CreateRndItem(object[i]._ox, object[i]._oy, FALSE, sendmsg, FALSE);
2710  if (object[i]._oVar1 >= 8)
2711  SpawnSkeleton(object[i]._oVar2, object[i]._ox, object[i]._oy);
2712  if (pnum == myplr)
2713  NetSendCmdParam1(FALSE, CMD_OPERATEOBJ, i);
2714  }
2715  }
2716 }
2717 
2718 void OperateL2Door(int pnum, int i, BOOL sendflag)
2719 {
2720  int dpx, dpy;
2721 
2722  dpx = abs(object[i]._ox - plr[pnum].WorldX);
2723  dpy = abs(object[i]._oy - plr[pnum].WorldY);
2724  if (dpx == 1 && dpy <= 1 && object[i]._otype == OBJ_L2LDOOR)
2725  OperateL2LDoor(pnum, i, sendflag);
2726  if (dpx <= 1 && dpy == 1 && object[i]._otype == OBJ_L2RDOOR)
2727  OperateL2RDoor(pnum, i, sendflag);
2728 }
2729 
2730 void OperateL3Door(int pnum, int i, BOOL sendflag)
2731 {
2732  int dpx, dpy;
2733 
2734  dpx = abs(object[i]._ox - plr[pnum].WorldX);
2735  dpy = abs(object[i]._oy - plr[pnum].WorldY);
2736  if (dpx == 1 && dpy <= 1 && object[i]._otype == OBJ_L3RDOOR)
2737  OperateL3RDoor(pnum, i, sendflag);
2738  if (dpx <= 1 && dpy == 1 && object[i]._otype == OBJ_L3LDOOR)
2739  OperateL3LDoor(pnum, i, sendflag);
2740 }
2741 
2742 void OperatePedistal(int pnum, int i)
2743 {
2744  BYTE *mem;
2745  int iv;
2746 
2747  if (object[i]._oVar6 != 3) {
2748  if (PlrHasItem(pnum, IDI_BLDSTONE, &iv) != NULL) {
2749  RemoveInvItem(pnum, iv);
2750  object[i]._oAnimFrame++;
2751  object[i]._oVar6++;
2752  }
2753  if (object[i]._oVar6 == 1) {
2754  if (!deltaload)
2755  PlaySfxLoc(LS_PUDDLE, object[i]._ox, object[i]._oy);
2756  ObjChangeMap(setpc_x, setpc_y + 3, setpc_x + 2, setpc_y + 7);
2757  }
2758  if (object[i]._oVar6 == 2) {
2759  if (!deltaload)
2760  PlaySfxLoc(LS_PUDDLE, object[i]._ox, object[i]._oy);
2761  ObjChangeMap(setpc_x + 6, setpc_y + 3, setpc_x + setpc_w, setpc_y + 7);
2762  }
2763  if (object[i]._oVar6 == 3) {
2764  if (!deltaload)
2765  PlaySfxLoc(LS_BLODSTAR, object[i]._ox, object[i]._oy);
2766  ObjChangeMap(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4);
2767  mem = LoadFileInMem("Levels\\L2Data\\Blood2.DUN", NULL);
2768  LoadMapObjs(mem, 2 * setpc_x, 2 * setpc_y);
2769  mem_free_dbg(mem);
2770  CreateItem(7, 2 * setpc_x + 25, 2 * setpc_y + 19);
2771  object[i]._oSelFlag = 0;
2772  }
2773  }
2774 }
2775 
2776 void TryDisarm(int pnum, int i)
2777 {
2778  int j, oi, oti, trapdisper;
2779  BOOL checkflag;
2780 
2781  if (pnum == myplr)
2783  if (object[i]._oTrapFlag) {
2784  trapdisper = 2 * plr[pnum]._pDexterity - 5 * currlevel;
2785  if (random_(154, 100) <= trapdisper) {
2786  for (j = 0; j < nobjects; j++) {
2787  checkflag = FALSE;
2788  oi = objectactive[j];
2789  oti = object[oi]._otype;
2790  if (oti == OBJ_TRAPL)
2791  checkflag = TRUE;
2792  if (oti == OBJ_TRAPR)
2793  checkflag = TRUE;
2794  if (checkflag && dObject[object[oi]._oVar1][object[oi]._oVar2] - 1 == i) {
2795  object[oi]._oVar4 = 1;
2796  object[i]._oTrapFlag = FALSE;
2797  }
2798  }
2799  oti = object[i]._otype;
2800  if (oti >= OBJ_TCHEST1 && oti <= OBJ_TCHEST3)
2801  object[i]._oTrapFlag = FALSE;
2802  }
2803  }
2804 }
2805 
2806 int ItemMiscIdIdx(int imiscid)
2807 {
2808  int i;
2809 
2810  i = 0;
2811  while (AllItemsList[i].iRnd == 0 || AllItemsList[i].iMiscId != imiscid) {
2812  i++;
2813  }
2814 
2815  return i;
2816 }
2817 
2818 void OperateShrine(int pnum, int i, int sType)
2819 {
2820  int cnt;
2821  int r, j;
2822  DWORD lv, t;
2823  int xx, yy;
2824  int v1, v2, v3, v4;
2825  unsigned __int64 spell, spells;
2826 
2827  if (dropGoldFlag) {
2828  dropGoldFlag = FALSE;
2829  dropGoldValue = 0;
2830  }
2831 
2832  assert((DWORD)i < MAXOBJECTS);
2833 
2834  if (object[i]._oSelFlag == 0)
2835  return;
2836 
2837  SetRndSeed(object[i]._oRndSeed);
2838  object[i]._oSelFlag = 0;
2839 
2840  if (!deltaload) {
2841  PlaySfxLoc(sType, object[i]._ox, object[i]._oy);
2842  object[i]._oAnimFlag = 1;
2843  object[i]._oAnimDelay = 1;
2844  } else {
2845  object[i]._oAnimFlag = 0;
2846  object[i]._oAnimFrame = object[i]._oAnimLen;
2847  }
2848  switch (object[i]._oVar1) {
2849  case SHRINE_MYSTERIOUS:
2850  if (deltaload)
2851  return;
2852  if (pnum != myplr)
2853  return;
2854  ModifyPlrStr(pnum, -1);
2855  ModifyPlrMag(pnum, -1);
2856  ModifyPlrDex(pnum, -1);
2857  ModifyPlrVit(pnum, -1);
2858  switch (random_(0, 4)) {
2859  case 0:
2860  ModifyPlrStr(pnum, 6);
2861  break;
2862  case 1:
2863  ModifyPlrMag(pnum, 6);
2864  break;
2865  case 2:
2866  ModifyPlrDex(pnum, 6);
2867  break;
2868  case 3:
2869  ModifyPlrVit(pnum, 6);
2870  break;
2871  }
2872  CheckStats(pnum);
2874  break;
2875  case SHRINE_HIDDEN:
2876  cnt = 0;
2877  if (deltaload)
2878  return;
2879  if (pnum != myplr)
2880  return;
2881  for (j = 0; j < NUM_INVLOC; j++) {
2882  if (plr[pnum].InvBody[j]._itype != ITYPE_NONE)
2883  cnt++;
2884  }
2885  if (cnt > 0) {
2886  for (j = 0; j < NUM_INVLOC; j++) {
2887  if (plr[pnum].InvBody[j]._itype != ITYPE_NONE
2888  && plr[pnum].InvBody[j]._iMaxDur != DUR_INDESTRUCTIBLE
2889  && plr[pnum].InvBody[j]._iMaxDur != 0) {
2890  plr[pnum].InvBody[j]._iDurability += 10;
2891  plr[pnum].InvBody[j]._iMaxDur += 10;
2892  if (plr[pnum].InvBody[j]._iDurability > plr[pnum].InvBody[j]._iMaxDur)
2893  plr[pnum].InvBody[j]._iDurability = plr[pnum].InvBody[j]._iMaxDur;
2894  }
2895  }
2896  while (TRUE) {
2897  cnt = 0;
2898  for (j = 0; j < NUM_INVLOC; j++) {
2899  if (plr[pnum].InvBody[j]._itype != ITYPE_NONE
2900  && plr[pnum].InvBody[j]._iMaxDur != DUR_INDESTRUCTIBLE
2901  && plr[pnum].InvBody[j]._iMaxDur != 0)
2902  cnt++;
2903  }
2904  if (cnt == 0)
2905  break;
2906  r = random_(0, NUM_INVLOC);
2907  if (plr[pnum].InvBody[r]._itype == ITYPE_NONE || plr[pnum].InvBody[r]._iMaxDur == DUR_INDESTRUCTIBLE || plr[pnum].InvBody[r]._iMaxDur == 0)
2908  continue;
2909 
2910  plr[pnum].InvBody[r]._iDurability -= 20;
2911  plr[pnum].InvBody[r]._iMaxDur -= 20;
2912  if (plr[pnum].InvBody[r]._iDurability <= 0)
2913  plr[pnum].InvBody[r]._iDurability = 1;
2914  if (plr[pnum].InvBody[r]._iMaxDur <= 0)
2915  plr[pnum].InvBody[r]._iMaxDur = 1;
2916  break;
2917  }
2918  }
2920  break;
2921  case SHRINE_GLOOMY:
2922  if (deltaload)
2923  return;
2924  if (pnum != myplr)
2925  break;
2926  if (plr[pnum].InvBody[INVLOC_HEAD]._itype != ITYPE_NONE)
2927  plr[pnum].InvBody[INVLOC_HEAD]._iAC += 2;
2928  if (plr[pnum].InvBody[INVLOC_CHEST]._itype != ITYPE_NONE)
2929  plr[pnum].InvBody[INVLOC_CHEST]._iAC += 2;
2930  if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE) {
2931  if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_SHIELD) {
2932  plr[pnum].InvBody[INVLOC_HAND_LEFT]._iAC += 2;
2933  } else {
2935  if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._iMaxDam < plr[pnum].InvBody[INVLOC_HAND_LEFT]._iMinDam)
2937  }
2938  }
2939  if (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE) {
2940  if (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SHIELD) {
2941  plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iAC += 2;
2942  } else {
2944  if (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iMaxDam < plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iMinDam)
2946  }
2947  }
2948  for (j = 0; j < plr[pnum]._pNumInv; j++) {
2949  switch (plr[pnum].InvList[j]._itype) {
2950  case ITYPE_SWORD:
2951  case ITYPE_AXE:
2952  case ITYPE_BOW:
2953  case ITYPE_MACE:
2954  case ITYPE_STAFF:
2955  plr[pnum].InvList[j]._iMaxDam--;
2956  if (plr[pnum].InvList[j]._iMaxDam < plr[pnum].InvList[j]._iMinDam)
2957  plr[pnum].InvList[j]._iMaxDam = plr[pnum].InvList[j]._iMinDam;
2958  break;
2959  case ITYPE_SHIELD:
2960  case ITYPE_LARMOR:
2961  case ITYPE_HELM:
2962  case ITYPE_MARMOR:
2963  case ITYPE_HARMOR:
2964  plr[pnum].InvList[j]._iAC += 2;
2965  break;
2966  }
2967  }
2969  break;
2970  case SHRINE_WEIRD:
2971  if (deltaload)
2972  return;
2973  if (pnum != myplr)
2974  break;
2975 
2976  if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_SHIELD)
2978  if (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_SHIELD)
2980  for (j = 0; j < plr[pnum]._pNumInv; j++) {
2981  switch (plr[pnum].InvList[j]._itype) {
2982  case ITYPE_SWORD:
2983  case ITYPE_AXE:
2984  case ITYPE_BOW:
2985  case ITYPE_MACE:
2986  case ITYPE_STAFF:
2987  plr[pnum].InvList[j]._iMaxDam++;
2988  break;
2989  }
2990  }
2992  break;
2993  case SHRINE_MAGICAL:
2994 
2995  case SHRINE_MAGICAL2:
2996  if (deltaload)
2997  return;
2998  AddMissile(
2999  plr[pnum].WorldX,
3000  plr[pnum].WorldY,
3001  plr[pnum].WorldX,
3002  plr[pnum].WorldY,
3003  plr[pnum]._pdir,
3005  -1,
3006  pnum,
3007  0,
3008  2 * leveltype);
3009  if (pnum != myplr)
3010  return;
3012  break;
3013  case SHRINE_STONE:
3014  if (deltaload)
3015  return;
3016  if (pnum != myplr)
3017  break;
3018 
3019  for (j = 0; j < NUM_INVLOC; j++) {
3020  if (plr[pnum].InvBody[j]._itype == ITYPE_STAFF)
3021  plr[pnum].InvBody[j]._iCharges = plr[pnum].InvBody[j]._iMaxCharges;
3022  }
3023  for (j = 0; j < plr[pnum]._pNumInv; j++) {
3024  if (plr[pnum].InvList[j]._itype == ITYPE_STAFF)
3025  plr[pnum].InvList[j]._iCharges = plr[pnum].InvList[j]._iMaxCharges;
3026  }
3027  for (j = 0; j < MAXBELTITEMS; j++) {
3028  if (plr[pnum].SpdList[j]._itype == ITYPE_STAFF)
3029  plr[pnum].SpdList[j]._iCharges = plr[pnum].SpdList[j]._iMaxCharges; // belt items don't have charges?
3030  }
3032  break;
3033  case SHRINE_RELIGIOUS:
3034  if (deltaload)
3035  return;
3036  if (pnum != myplr)
3037  break;
3038 
3039  for (j = 0; j < NUM_INVLOC; j++)
3040  plr[pnum].InvBody[j]._iDurability = plr[pnum].InvBody[j]._iMaxDur;
3041  for (j = 0; j < plr[pnum]._pNumInv; j++)
3042  plr[pnum].InvList[j]._iDurability = plr[pnum].InvList[j]._iMaxDur;
3043  for (j = 0; j < MAXBELTITEMS; j++)
3044  plr[pnum].SpdList[j]._iDurability = plr[pnum].SpdList[j]._iMaxDur; // belt items don't have durability?
3046  break;
3047  case SHRINE_ENCHANTED:
3048  if (deltaload)
3049  return;
3050  if (pnum != myplr)
3051  return;
3052  cnt = 0;
3053  spell = 1;
3054  spells = plr[pnum]._pMemSpells;
3055  for (j = 0; j < MAX_SPELLS; j++) {
3056  if (spell & spells)
3057  cnt++;
3058  spell <<= 1;
3059  }
3060  if (cnt > 1) {
3061  spell = 1;
3062  for (j = 1; j <= MAX_SPELLS; j++) {
3063  if (plr[pnum]._pMemSpells & spell) {
3064  if (plr[pnum]._pSplLvl[j] < 15)
3065  plr[pnum]._pSplLvl[j]++;
3066  }
3067  spell <<= 1;
3068  }
3069  do {
3070  r = random_(0, 37);
3071  } while (!(plr[pnum]._pMemSpells & ((__int64)1 << r)));
3072  if (plr[pnum]._pSplLvl[r] >= 2)
3073  plr[pnum]._pSplLvl[r] -= 2;
3074  else
3075  plr[pnum]._pSplLvl[r] = 0;
3076  }
3078  break;
3079  case SHRINE_THAUMATURGIC:
3080  for (j = 0; j < nobjects; j++) {
3081  v1 = objectactive[j];
3082  assert((DWORD)v1 < MAXOBJECTS);
3083  if ((object[v1]._otype == OBJ_CHEST1
3084  || object[v1]._otype == OBJ_CHEST2
3085  || object[v1]._otype == OBJ_CHEST3)
3086  && object[v1]._oSelFlag == 0) {
3087  object[v1]._oRndSeed = GetRndSeed();
3088  object[v1]._oAnimFrame -= 2;
3089  object[v1]._oSelFlag = 1;
3090  }
3091  }
3092  if (deltaload)
3093  return;
3094  if (pnum == myplr)
3096  break;
3097  case SHRINE_FASCINATING:
3098  if (deltaload)
3099  return;
3100  if (pnum != myplr)
3101  return;
3102  plr[pnum]._pMemSpells |= (__int64)1 << (SPL_FIREBOLT - 1);
3103  if (plr[pnum]._pSplLvl[SPL_FIREBOLT] < 15)
3104  plr[pnum]._pSplLvl[SPL_FIREBOLT]++;
3105  if (plr[pnum]._pSplLvl[SPL_FIREBOLT] < 15)
3106  plr[pnum]._pSplLvl[SPL_FIREBOLT]++;
3107  t = plr[pnum]._pMaxManaBase / 10;
3108  v1 = plr[pnum]._pMana - plr[pnum]._pManaBase;
3109  v2 = plr[pnum]._pMaxMana - plr[pnum]._pMaxManaBase;
3110 
3111  plr[pnum]._pManaBase -= t;
3112  plr[pnum]._pMana -= t;
3113  plr[pnum]._pMaxMana -= t;
3114  plr[pnum]._pMaxManaBase -= t;
3115  if (plr[pnum]._pMana >> 6 <= 0) {
3116  plr[pnum]._pManaBase = 0;
3117  plr[pnum]._pMana = v1;
3118  }
3119  if (plr[pnum]._pMaxMana >> 6 <= 0) {
3120  plr[pnum]._pMaxManaBase = 0;
3121  plr[pnum]._pMaxMana = v2;
3122  }
3124  break;
3125  case SHRINE_CRYPTIC:
3126  if (deltaload)
3127  return;
3128  AddMissile(
3129  plr[pnum].WorldX,
3130  plr[pnum].WorldY,
3131  plr[pnum].WorldX,
3132  plr[pnum].WorldY,
3133  plr[pnum]._pdir,
3134  MIS_NOVA,
3135  -1,
3136  pnum,
3137  0,
3138  2 * leveltype);
3139  if (pnum != myplr)
3140  return;
3141  plr[pnum]._pMana = plr[pnum]._pMaxMana;
3142  plr[pnum]._pManaBase = plr[pnum]._pMaxManaBase;
3144  break;
3145  case SHRINE_ELDRITCH:
3146  if (deltaload)
3147  return;
3148  if (pnum != myplr)
3149  break;
3150  for (j = 0; j < plr[pnum]._pNumInv; j++) {
3151  if (plr[pnum].InvList[j]._itype == ITYPE_MISC) {
3152  if (plr[pnum].InvList[j]._iMiscId == IMISC_HEAL
3153  || plr[pnum].InvList[j]._iMiscId == IMISC_MANA) {
3154  SetPlrHandItem(&plr[pnum].HoldItem, ItemMiscIdIdx(IMISC_REJUV));
3155  GetPlrHandSeed(&plr[pnum].HoldItem);
3156  plr[pnum].HoldItem._iStatFlag = TRUE;
3157  plr[pnum].InvList[j] = plr[pnum].HoldItem;
3158  }
3159  if (plr[pnum].InvList[j]._iMiscId == IMISC_FULLHEAL
3160  || plr[pnum].InvList[j]._iMiscId == IMISC_FULLMANA) {
3161  SetPlrHandItem(&plr[pnum].HoldItem, ItemMiscIdIdx(IMISC_FULLREJUV));
3162  GetPlrHandSeed(&plr[pnum].HoldItem);
3163  plr[pnum].HoldItem._iStatFlag = TRUE;
3164  plr[pnum].InvList[j] = plr[pnum].HoldItem;
3165  }
3166  }
3167  }
3168  for (j = 0; j < MAXBELTITEMS; j++) {
3169  if (plr[pnum].SpdList[j]._itype == ITYPE_MISC) {
3170  if (plr[pnum].SpdList[j]._iMiscId == IMISC_HEAL
3171  || plr[pnum].SpdList[j]._iMiscId == IMISC_MANA) {
3172  SetPlrHandItem(&plr[pnum].HoldItem, ItemMiscIdIdx(IMISC_REJUV));
3173  GetPlrHandSeed(&plr[pnum].HoldItem);
3174  plr[pnum].HoldItem._iStatFlag = TRUE;
3175  plr[pnum].SpdList[j] = plr[pnum].HoldItem;
3176  }
3177  if (plr[pnum].SpdList[j]._iMiscId == IMISC_FULLHEAL
3178  || plr[pnum].SpdList[j]._iMiscId == IMISC_FULLMANA) {
3179  SetPlrHandItem(&plr[pnum].HoldItem, ItemMiscIdIdx(IMISC_FULLREJUV));
3180  GetPlrHandSeed(&plr[pnum].HoldItem);
3181  plr[pnum].HoldItem._iStatFlag = TRUE;
3182  plr[pnum].SpdList[j] = plr[pnum].HoldItem;
3183  }
3184  }
3185  }
3187  break;
3188  case SHRINE_EERIE:
3189  if (deltaload)
3190  return;
3191  if (pnum != myplr)
3192  return;
3193  ModifyPlrMag(pnum, 2);
3194  CheckStats(pnum);
3196  break;
3197  case SHRINE_DIVINE:
3198  if (deltaload)
3199  return;
3200  if (pnum != myplr)
3201  return;
3202  if (2 * currlevel < 7) {
3203  CreateTypeItem(object[i]._ox, object[i]._oy, FALSE, ITYPE_MISC, IMISC_FULLMANA, FALSE, TRUE);
3204  CreateTypeItem(object[i]._ox, object[i]._oy, FALSE, ITYPE_MISC, IMISC_FULLHEAL, FALSE, TRUE);
3205  } else {
3206  CreateTypeItem(object[i]._ox, object[i]._oy, FALSE, ITYPE_MISC, IMISC_FULLREJUV, FALSE, TRUE);
3207  CreateTypeItem(object[i]._ox, object[i]._oy, FALSE, ITYPE_MISC, IMISC_FULLREJUV, FALSE, TRUE);
3208  }
3209  plr[pnum]._pMana = plr[pnum]._pMaxMana;
3210  plr[pnum]._pManaBase = plr[pnum]._pMaxManaBase;
3211  plr[pnum]._pHitPoints = plr[pnum]._pMaxHP;
3212  plr[pnum]._pHPBase = plr[pnum]._pMaxHPBase;
3214  break;
3215  case SHRINE_HOLY:
3216  if (deltaload)
3217  return;
3218  j = 0;
3219  do {
3220  xx = random_(159, MAXDUNX);
3221  yy = random_(159, MAXDUNY);
3222  j++;
3223  if (j > MAXDUNX * 112)
3224  break;
3225  lv = dPiece[xx][yy];
3226  } while (nSolidTable[lv] || dObject[xx][yy] || dMonster[xx][yy]);
3227  AddMissile(plr[pnum].WorldX, plr[pnum].WorldY, xx, yy, plr[pnum]._pdir, MIS_RNDTELEPORT, -1, pnum, 0, 2 * leveltype);
3228  if (pnum != myplr)
3229  return;
3231  break;
3232  case SHRINE_SACRED:
3233  if (deltaload || pnum != myplr)
3234  return;
3235  plr[pnum]._pMemSpells |= (__int64)1 << (SPL_CBOLT - 1);
3236  if (plr[pnum]._pSplLvl[SPL_CBOLT] < 15)
3237  plr[pnum]._pSplLvl[SPL_CBOLT]++;
3238  if (plr[pnum]._pSplLvl[SPL_CBOLT] < 15)
3239  plr[pnum]._pSplLvl[SPL_CBOLT]++;
3240  t = plr[pnum]._pMaxManaBase / 10;
3241  v1 = plr[pnum]._pMana - plr[pnum]._pManaBase;
3242  v2 = plr[pnum]._pMaxMana - plr[pnum]._pMaxManaBase;
3243  plr[pnum]._pManaBase -= t;
3244  plr[pnum]._pMana -= t;
3245  plr[pnum]._pMaxMana -= t;
3246  plr[pnum]._pMaxManaBase -= t;
3247  if (plr[pnum]._pMana >> 6 <= 0) {
3248  plr[pnum]._pMana = v1;
3249  plr[pnum]._pManaBase = 0;
3250  }
3251  if (plr[pnum]._pMaxMana >> 6 <= 0) {
3252  plr[pnum]._pMaxMana = v2;
3253  plr[pnum]._pMaxManaBase = 0;
3254  }
3256  break;
3257  case SHRINE_SPIRITUAL:
3258  if (deltaload)
3259  return;
3260  if (pnum != myplr)
3261  return;
3262  for (j = 0; j < NUM_INV_GRID_ELEM; j++) {
3263  if (!plr[pnum].InvGrid[j]) {
3264  r = 5 * leveltype + random_(160, 10 * leveltype);
3265  t = plr[pnum]._pNumInv; // check
3266  plr[pnum].InvList[t] = golditem;
3267  plr[pnum].InvList[t]._iSeed = GetRndSeed();
3268  plr[pnum]._pNumInv++;
3269  plr[pnum].InvGrid[j] = plr[pnum]._pNumInv;
3270  plr[pnum].InvList[t]._ivalue = r;
3271  plr[pnum]._pGold += r;
3272  SetGoldCurs(pnum, t);
3273  }
3274  }
3276  break;
3277  case SHRINE_SPOOKY:
3278  if (deltaload)
3279  return;
3280  if (pnum == myplr) {
3282  } else {
3288  }
3289  break;
3290  case SHRINE_ABANDONED:
3291  if (deltaload)
3292  return;
3293  if (pnum != myplr)
3294  return;
3295  ModifyPlrDex(pnum, 2);
3296  CheckStats(pnum);
3297  if (pnum == myplr)
3299  break;
3300  case SHRINE_CREEPY:
3301  if (deltaload)
3302  return;
3303  if (pnum != myplr)
3304  return;
3305  ModifyPlrStr(pnum, 2);
3306  CheckStats(pnum);
3307  if (pnum == myplr)
3309  break;
3310  case SHRINE_QUIET:
3311  if (deltaload)
3312  return;
3313  if (pnum != myplr)
3314  return;
3315  ModifyPlrVit(pnum, 2);
3316  CheckStats(pnum);
3317  if (pnum == myplr)
3319  break;
3320  case SHRINE_SECLUDED:
3321  if (deltaload)
3322  return;
3323  if (pnum != myplr)
3324  break;
3325 
3326  for (yy = 0; yy < DMAXY; yy++) {
3327  for (xx = 0; xx < DMAXX; xx++) {
3328  automapview[xx][yy] = TRUE;
3329  }
3330  }
3332  break;
3333  case SHRINE_ORNATE:
3334  if (deltaload)
3335  return;
3336  if (pnum != myplr)
3337  return;
3338  plr[pnum]._pMemSpells |= (__int64)1 << (SPL_HBOLT - 1);
3339  if (plr[pnum]._pSplLvl[SPL_HBOLT] < 15)
3340  plr[pnum]._pSplLvl[SPL_HBOLT]++;
3341  if (plr[pnum]._pSplLvl[SPL_HBOLT] < 15)
3342  plr[pnum]._pSplLvl[SPL_HBOLT]++;
3343  t = plr[pnum]._pMaxManaBase / 10;
3344  v1 = plr[pnum]._pMana - plr[pnum]._pManaBase;
3345  v2 = plr[pnum]._pMaxMana - plr[pnum]._pMaxManaBase;
3346  plr[pnum]._pManaBase -= t;
3347  plr[pnum]._pMana -= t;
3348  plr[pnum]._pMaxMana -= t;
3349  plr[pnum]._pMaxManaBase -= t;
3350  if (plr[pnum]._pMana >> 6 <= 0) {
3351  plr[pnum]._pMana = v1;
3352  plr[pnum]._pManaBase = 0;
3353  }
3354  if (plr[pnum]._pMaxMana >> 6 <= 0) {
3355  plr[pnum]._pMaxMana = v2;
3356  plr[pnum]._pMaxManaBase = 0;
3357  }
3359  break;
3360  case SHRINE_GLIMMERING:
3361  if (deltaload)
3362  return;
3363  if (pnum != myplr)
3364  return;
3365  for (j = 0; j < NUM_INVLOC; j++) {
3366  if (plr[pnum].InvBody[j]._iMagical && !plr[pnum].InvBody[j]._iIdentified)
3367  plr[pnum].InvBody[j]._iIdentified = TRUE;
3368  }
3369  for (j = 0; j < plr[pnum]._pNumInv; j++) {
3370  if (plr[pnum].InvList[j]._iMagical && !plr[pnum].InvList[j]._iIdentified)
3371  plr[pnum].InvList[j]._iIdentified = TRUE;
3372  }
3373  for (j = 0; j < 8; j++) {
3374  if (plr[pnum].SpdList[j]._iMagical && !plr[pnum].SpdList[j]._iIdentified)
3375  plr[pnum].SpdList[j]._iIdentified = TRUE; // belt items can't be magical?
3376  }
3378  break;
3379  case SHRINE_TAINTED:
3380  if (deltaload)
3381  return;
3382  if (pnum == myplr) {
3384  } else {
3386  r = random_(155, 4);
3387 
3388  if (r != 0)
3389  v1 = -1;
3390  else
3391  v1 = 1;
3392  if (r != 1)
3393  v2 = -1;
3394  else
3395  v2 = 1;
3396  if (r == 2)
3397  v3 = 1;
3398  else
3399  v3 = -1;
3400  if (r == 3)
3401  v4 = 1;
3402  else
3403  v4 = -1;
3404 
3405  ModifyPlrStr(myplr, v1);
3406  ModifyPlrMag(myplr, v2);
3407  ModifyPlrDex(myplr, v3);
3408  ModifyPlrVit(myplr, v4);
3409 
3410  CheckStats(myplr);
3411  }
3412  break;
3413  }
3414 
3415  CalcPlrInv(pnum, TRUE);
3416  force_redraw = 255;
3417 
3418  if (pnum == myplr)
3419  NetSendCmdParam2(FALSE, CMD_PLROPOBJ, pnum, i);
3420 }
3421 
3422 void OperateSkelBook(int pnum, int i, BOOL sendmsg)
3423 {
3424  if (object[i]._oSelFlag != 0) {
3425  if (!deltaload)
3426  PlaySfxLoc(IS_ISCROL, object[i]._ox, object[i]._oy);
3427  object[i]._oAnimFrame += 2;
3428  object[i]._oSelFlag = 0;
3429  if (!deltaload) {
3430  SetRndSeed(object[i]._oRndSeed);
3431  if (random_(161, 5))
3432  CreateTypeItem(object[i]._ox, object[i]._oy, FALSE, ITYPE_MISC, IMISC_SCROLL, sendmsg, FALSE);
3433  else
3434  CreateTypeItem(object[i]._ox, object[i]._oy, FALSE, ITYPE_MISC, IMISC_BOOK, sendmsg, FALSE);
3435  if (pnum == myplr)
3436  NetSendCmdParam1(FALSE, CMD_OPERATEOBJ, i);
3437  }
3438  }
3439 }
3440 
3441 void OperateBookCase(int pnum, int i, BOOL sendmsg)
3442 {
3443  if (object[i]._oSelFlag != 0) {
3444  if (!deltaload)
3445  PlaySfxLoc(IS_ISCROL, object[i]._ox, object[i]._oy);
3446  object[i]._oAnimFrame -= 2;
3447  object[i]._oSelFlag = 0;
3448  if (!deltaload) {
3449  SetRndSeed(object[i]._oRndSeed);
3450  CreateTypeItem(object[i]._ox, object[i]._oy, FALSE, ITYPE_MISC, IMISC_BOOK, sendmsg, FALSE);
3451  if (QuestStatus(Q_ZHAR)
3452  && monster[MAX_PLRS].mName == UniqMonst[UMT_ZHAR].mName
3453  && monster[MAX_PLRS]._msquelch == UCHAR_MAX
3454  && monster[MAX_PLRS]._mhitpoints) {
3456  M_StartStand(0, monster[MAX_PLRS]._mdir);
3459  }
3460  if (pnum == myplr)
3461  NetSendCmdParam1(FALSE, CMD_OPERATEOBJ, i);
3462  }
3463  }
3464 }
3465 
3466 void OperateDecap(int pnum, int i, BOOL sendmsg)
3467 {
3468  if (object[i]._oSelFlag != 0) {
3469  object[i]._oSelFlag = 0;
3470  if (!deltaload) {
3471  SetRndSeed(object[i]._oRndSeed);
3472  CreateRndItem(object[i]._ox, object[i]._oy, FALSE, sendmsg, FALSE);
3473  if (pnum == myplr)
3474  NetSendCmdParam1(FALSE, CMD_OPERATEOBJ, i);
3475  }
3476  }
3477 }
3478 
3479 void OperateArmorStand(int pnum, int i, BOOL sendmsg)
3480 {
3481  BOOL uniqueRnd;
3482 
3483  if (object[i]._oSelFlag != 0) {
3484  object[i]._oAnimFrame++;
3485  object[i]._oSelFlag = 0;
3486  if (!deltaload) {
3487  SetRndSeed(object[i]._oRndSeed);
3488  uniqueRnd = random_(0, 2);
3489  if (currlevel <= 5) {
3490  CreateTypeItem(object[i]._ox, object[i]._oy, TRUE, ITYPE_LARMOR, IMISC_NONE, sendmsg, FALSE);
3491  } else if (currlevel >= 6 && currlevel <= 9) {
3492  CreateTypeItem(object[i]._ox, object[i]._oy, uniqueRnd, ITYPE_MARMOR, IMISC_NONE, sendmsg, FALSE);
3493  } else if (currlevel >= 10 && currlevel <= 12) {
3494  CreateTypeItem(object[i]._ox, object[i]._oy, FALSE, ITYPE_HARMOR, IMISC_NONE, sendmsg, FALSE);
3495  } else if (currlevel >= 13 && currlevel <= 16) {
3496  CreateTypeItem(object[i]._ox, object[i]._oy, TRUE, ITYPE_HARMOR, IMISC_NONE, sendmsg, FALSE);
3497  }
3498  if (pnum == myplr)
3499  NetSendCmdParam1(FALSE, CMD_OPERATEOBJ, i);
3500  return;
3501  }
3502  }
3503 }
3504 
3506 {
3507  BOOL done;
3508  int rv;
3509 
3510  while (1) {
3511  done = FALSE;
3512  while (!done) {
3513  rv = random_(0, NUM_SHRINETYPE);
3514  if (currlevel >= shrinemin[rv] && currlevel <= shrinemax[rv] && rv != 8)
3515  done = TRUE;
3516  }
3517 
3518  if (gbMaxPlayers != 1) {
3519  if (shrineavail[rv] != 1) {
3520  break;
3521  }
3522  } else {
3523  if (shrineavail[rv] != 2) {
3524  break;
3525  }
3526  }
3527  }
3528 
3529  return rv;
3530 }
3531 
3532 void OperateGoatShrine(int pnum, int i, int sType)
3533 {
3534  SetRndSeed(object[i]._oRndSeed);
3535  object[i]._oVar1 = FindValidShrine(i);
3536  OperateShrine(pnum, i, sType);
3537  object[i]._oAnimDelay = 2;
3538  force_redraw = 255;
3539 }
3540 
3541 void OperateCauldron(int pnum, int i, int sType)
3542 {
3543  SetRndSeed(object[i]._oRndSeed);
3544  object[i]._oVar1 = FindValidShrine(i);
3545  OperateShrine(pnum, i, sType);
3546  object[i]._oAnimFrame = 3;
3547  object[i]._oAnimFlag = 0;
3548  force_redraw = 255;
3549 }
3550 
3551 BOOL OperateFountains(int pnum, int i)
3552 {
3553  int prev, add, rnd, cnt;
3554  BOOL applied, done;
3555 
3556  applied = FALSE;
3557  SetRndSeed(object[i]._oRndSeed);
3558  switch (object[i]._otype) {
3559  case OBJ_BLOODFTN:
3560  if (deltaload)
3561  return FALSE;
3562  if (pnum != myplr)
3563  return FALSE;
3564 
3565  if (plr[pnum]._pHitPoints < plr[pnum]._pMaxHP) {
3566  PlaySfxLoc(LS_FOUNTAIN, object[i]._ox, object[i]._oy);
3567  plr[pnum]._pHitPoints += 64;
3568  plr[pnum]._pHPBase += 64;
3569  if (plr[pnum]._pHitPoints > plr[pnum]._pMaxHP) {
3570  plr[pnum]._pHitPoints = plr[pnum]._pMaxHP;
3571  plr[pnum]._pHPBase = plr[pnum]._pMaxHPBase;
3572  }
3573  applied = TRUE;
3574  } else
3575  PlaySfxLoc(LS_FOUNTAIN, object[i]._ox, object[i]._oy);
3576  break;
3577  case OBJ_PURIFYINGFTN:
3578  if (deltaload)
3579  return FALSE;
3580  if (pnum != myplr)
3581  return FALSE;
3582 
3583  if (plr[pnum]._pMana < plr[pnum]._pMaxMana) {
3584  PlaySfxLoc(LS_FOUNTAIN, object[i]._ox, object[i]._oy);
3585 
3586  plr[pnum]._pMana += 64;
3587  plr[pnum]._pManaBase += 64;
3588  if (plr[pnum]._pMana > plr[pnum]._pMaxMana) {
3589  plr[pnum]._pMana = plr[pnum]._pMaxMana;
3590  plr[pnum]._pManaBase = plr[pnum]._pMaxManaBase;
3591  }
3592 
3593  applied = TRUE;
3594  } else
3595  PlaySfxLoc(LS_FOUNTAIN, object[i]._ox, object[i]._oy);
3596  break;
3597  case OBJ_MURKYFTN:
3598  if (object[i]._oSelFlag == 0)
3599  break;
3600  if (!deltaload)
3601  PlaySfxLoc(LS_FOUNTAIN, object[i]._ox, object[i]._oy);
3602  object[i]._oSelFlag = 0;
3603  if (deltaload)
3604  return FALSE;
3605  AddMissile(
3606  plr[pnum].WorldX,
3607  plr[pnum].WorldY,
3608  plr[pnum].WorldX,
3609  plr[pnum].WorldY,
3610  plr[pnum]._pdir,
3611  MIS_INFRA,
3612  -1,
3613  pnum,
3614  0,
3615  2 * leveltype);
3616  applied = TRUE;
3617  if (pnum == myplr)
3618  NetSendCmdParam1(FALSE, CMD_OPERATEOBJ, i);
3619  break;
3620  case OBJ_TEARFTN:
3621  if (object[i]._oSelFlag == 0)
3622  break;
3623  prev = -1;
3624  add = -1;
3625  done = FALSE;
3626  cnt = 0;
3627  if (!deltaload)
3628  PlaySfxLoc(LS_FOUNTAIN, object[i]._ox, object[i]._oy);
3629  object[i]._oSelFlag = 0;
3630  if (deltaload)
3631  return FALSE;
3632  if (pnum != myplr)
3633  return FALSE;
3634  while (!done) {
3635  rnd = random_(0, 4);
3636  if (rnd != prev) {
3637  switch (rnd) {
3638  case 0:
3639  ModifyPlrStr(pnum, add);
3640  break;
3641  case 1:
3642  ModifyPlrMag(pnum, add);
3643  break;
3644  case 2:
3645  ModifyPlrDex(pnum, add);
3646  break;
3647  case 3:
3648  ModifyPlrVit(pnum, add);
3649  break;
3650  }
3651  prev = rnd;
3652  add = 1;
3653  cnt++;
3654  }
3655  if (cnt <= 1)
3656  continue;
3657 
3658  done = TRUE;
3659  }
3660  CheckStats(pnum);
3661  applied = TRUE;
3662  if (pnum == myplr)
3663  NetSendCmdParam1(FALSE, CMD_OPERATEOBJ, i);
3664  break;
3665  }
3666  force_redraw = 255;
3667  return applied;
3668 }
3669 
3670 void OperateWeaponRack(int pnum, int i, BOOL sendmsg)
3671 {
3672  int weaponType;
3673 
3674  if (object[i]._oSelFlag == 0)
3675  return;
3676  SetRndSeed(object[i]._oRndSeed);
3677 
3678  switch (random_(0, 4) + 1) {
3679  case ITYPE_SWORD:
3680  weaponType = ITYPE_SWORD;
3681  break;
3682  case ITYPE_AXE:
3683  weaponType = ITYPE_AXE;
3684  break;
3685  case ITYPE_BOW:
3686  weaponType = ITYPE_BOW;
3687  break;
3688  case ITYPE_MACE:
3689  weaponType = ITYPE_MACE;
3690  break;
3691  }
3692 
3693  object[i]._oAnimFrame++;
3694  object[i]._oSelFlag = 0;
3695  if (deltaload)
3696  return;
3697 
3698  if (leveltype > 1)
3699  CreateTypeItem(object[i]._ox, object[i]._oy, TRUE, weaponType, IMISC_NONE, sendmsg, FALSE);
3700  else
3701  CreateTypeItem(object[i]._ox, object[i]._oy, FALSE, weaponType, IMISC_NONE, sendmsg, FALSE);
3702  if (pnum == myplr)
3703  NetSendCmdParam1(FALSE, CMD_OPERATEOBJ, i);
3704 }
3705 
3706 void OperateStoryBook(int pnum, int i)
3707 {
3708  if (object[i]._oSelFlag != 0 && !deltaload && !qtextflag && pnum == myplr) {
3709  object[i]._oAnimFrame = object[i]._oVar4;
3710  PlaySfxLoc(IS_ISCROL, object[i]._ox, object[i]._oy);
3711  InitQTextMsg(object[i]._oVar2);
3712  NetSendCmdParam1(FALSE, CMD_OPERATEOBJ, i);
3713  }
3714 }
3715 
3716 void OperateLazStand(int pnum, int i)
3717 {
3718  int xx, yy;
3719 
3720  if (object[i]._oSelFlag != 0 && !deltaload && !qtextflag && pnum == myplr) {
3721  object[i]._oAnimFrame++;
3722  object[i]._oSelFlag = 0;
3723  GetSuperItemLoc(object[i]._ox, object[i]._oy, &xx, &yy);
3724  SpawnQuestItem(IDI_LAZSTAFF, xx, yy, 0, 0);
3725  }
3726 }
3727 
3728 void OperateObject(int pnum, int i, BOOL TeleFlag)
3729 {
3730  BOOL sendmsg;
3731 
3732  sendmsg = (pnum == myplr);
3733  switch (object[i]._otype) {
3734  case OBJ_L1LDOOR:
3735  case OBJ_L1RDOOR:
3736  if (TeleFlag) {
3737  if (object[i]._otype == OBJ_L1LDOOR)
3738  OperateL1LDoor(pnum, i, TRUE);
3739  if (object[i]._otype == OBJ_L1RDOOR)
3740  OperateL1RDoor(pnum, i, TRUE);
3741  break;
3742  }
3743  if (pnum == myplr)
3744  OperateL1Door(pnum, i, TRUE);
3745  break;
3746  case OBJ_L2LDOOR:
3747  case OBJ_L2RDOOR:
3748  if (TeleFlag) {
3749  if (object[i]._otype == OBJ_L2LDOOR)
3750  OperateL2LDoor(pnum, i, TRUE);
3751  if (object[i]._otype == OBJ_L2RDOOR)
3752  OperateL2RDoor(pnum, i, TRUE);
3753  break;
3754  }
3755  if (pnum == myplr)
3756  OperateL2Door(pnum, i, TRUE);
3757  break;
3758  case OBJ_L3LDOOR:
3759  case OBJ_L3RDOOR:
3760  if (TeleFlag) {
3761  if (object[i]._otype == OBJ_L3LDOOR)
3762  OperateL3LDoor(pnum, i, TRUE);
3763  if (object[i]._otype == OBJ_L3RDOOR)
3764  OperateL3RDoor(pnum, i, TRUE);
3765  break;
3766  }
3767  if (pnum == myplr)
3768  OperateL3Door(pnum, i, TRUE);
3769  break;
3770  case OBJ_LEVER:
3771  case OBJ_SWITCHSKL:
3772  OperateLever(pnum, i);
3773  break;
3774  case OBJ_BOOK2L:
3775  OperateBook(pnum, i);
3776  break;
3777  case OBJ_BOOK2R:
3778  OperateSChambBk(pnum, i);
3779  break;
3780  case OBJ_CHEST1:
3781  case OBJ_CHEST2:
3782  case OBJ_CHEST3:
3783  case OBJ_TCHEST1:
3784  case OBJ_TCHEST2:
3785  case OBJ_TCHEST3:
3786  OperateChest(pnum, i, sendmsg);
3787  break;
3788  case OBJ_SARC:
3789  OperateSarc(pnum, i, sendmsg);
3790  break;
3791  case OBJ_FLAMELVR:
3792  OperateTrapLvr(i);
3793  break;
3794  case OBJ_BLINDBOOK:
3795  case OBJ_BLOODBOOK:
3796  case OBJ_STEELTOME:
3797  OperateBookLever(pnum, i);
3798  break;
3799  case OBJ_SHRINEL:
3800  case OBJ_SHRINER:
3801  OperateShrine(pnum, i, IS_MAGIC);
3802  break;
3803  case OBJ_SKELBOOK:
3804  case OBJ_BOOKSTAND:
3805  OperateSkelBook(pnum, i, sendmsg);
3806  break;
3807  case OBJ_BOOKCASEL:
3808  case OBJ_BOOKCASER:
3809  OperateBookCase(pnum, i, sendmsg);
3810  break;
3811  case OBJ_DECAP:
3812  OperateDecap(pnum, i, sendmsg);
3813  break;
3814  case OBJ_ARMORSTAND:
3815  case OBJ_WARARMOR:
3816  OperateArmorStand(pnum, i, sendmsg);
3817  break;
3818  case OBJ_GOATSHRINE:
3819  OperateGoatShrine(pnum, i, LS_GSHRINE);
3820  break;
3821  case OBJ_CAULDRON:
3822  OperateCauldron(pnum, i, LS_CALDRON);
3823  break;
3824  case OBJ_BLOODFTN:
3825  case OBJ_PURIFYINGFTN:
3826  case OBJ_MURKYFTN:
3827  case OBJ_TEARFTN:
3828  OperateFountains(pnum, i);
3829  break;
3830  case OBJ_STORYBOOK:
3831  OperateStoryBook(pnum, i);
3832  break;
3833  case OBJ_PEDISTAL:
3834  OperatePedistal(pnum, i);
3835  break;
3836  case OBJ_WARWEAP:
3837  case OBJ_WEAPONRACK:
3838  OperateWeaponRack(pnum, i, sendmsg);
3839  break;
3840  case OBJ_MUSHPATCH:
3841  OperateMushPatch(pnum, i);
3842  break;
3843  case OBJ_LAZSTAND:
3844  OperateLazStand(pnum, i);
3845  break;
3846  case OBJ_SLAINHERO:
3847  OperateSlainHero(pnum, i, sendmsg);
3848  break;
3849  case OBJ_SIGNCHEST:
3850  OperateInnSignChest(pnum, i);
3851  break;
3852  }
3853 }
3854 
3855 void SyncOpL1Door(int pnum, int cmd, int i)
3856 {
3857  BOOL do_sync;
3858 
3859  if (pnum == myplr)
3860  return;
3861 
3862  do_sync = FALSE;
3863  if (cmd == CMD_OPENDOOR) {
3864  if (object[i]._oVar4 != 0)
3865  return;
3866  do_sync = TRUE;
3867  }
3868  if (cmd == CMD_CLOSEDOOR && object[i]._oVar4 == 1)
3869  do_sync = TRUE;
3870  if (do_sync) {
3871  if (object[i]._otype == OBJ_L1LDOOR)
3872  OperateL1LDoor(-1, i, FALSE);
3873  if (object[i]._otype == OBJ_L1RDOOR)
3874  OperateL1RDoor(-1, i, FALSE);
3875  }
3876 }
3877 
3878 void SyncOpL2Door(int pnum, int cmd, int i)
3879 {
3880  BOOL do_sync;
3881 
3882  if (pnum == myplr)
3883  return;
3884 
3885  do_sync = FALSE;
3886  if (cmd == CMD_OPENDOOR) {
3887  if (object[i]._oVar4 != 0)
3888  return;
3889  do_sync = TRUE;
3890  }
3891  if (cmd == CMD_CLOSEDOOR && object[i]._oVar4 == 1)
3892  do_sync = TRUE;
3893  if (do_sync) {
3894  if (object[i]._otype == OBJ_L2LDOOR)
3895  OperateL2LDoor(-1, i, FALSE);
3896  if (object[i]._otype == OBJ_L2RDOOR)
3897  OperateL2RDoor(-1, i, FALSE);
3898  }
3899 }
3900 
3901 void SyncOpL3Door(int pnum, int cmd, int i)
3902 {
3903  BOOL do_sync;
3904 
3905  if (pnum == myplr)
3906  return;
3907 
3908  do_sync = FALSE;
3909  if (cmd == CMD_OPENDOOR) {
3910  if (object[i]._oVar4 != 0)
3911  return;
3912  do_sync = TRUE;
3913  }
3914  if (cmd == CMD_CLOSEDOOR && object[i]._oVar4 == 1)
3915  do_sync = TRUE;
3916  if (do_sync) {
3917  if (object[i]._otype == OBJ_L3LDOOR)
3918  OperateL2LDoor(-1, i, FALSE);
3919  if (object[i]._otype == OBJ_L3RDOOR)
3920  OperateL2RDoor(-1, i, FALSE);
3921  }
3922 }
3923 
3924 void SyncOpObject(int pnum, int cmd, int i)
3925 {
3926  switch (object[i]._otype) {
3927  case OBJ_L1LDOOR:
3928  case OBJ_L1RDOOR:
3929  SyncOpL1Door(pnum, cmd, i);
3930  break;
3931  case OBJ_L2LDOOR:
3932  case OBJ_L2RDOOR:
3933  SyncOpL2Door(pnum, cmd, i);
3934  break;
3935  case OBJ_L3LDOOR:
3936  case OBJ_L3RDOOR:
3937  SyncOpL3Door(pnum, cmd, i);
3938  break;
3939  case OBJ_LEVER:
3940  case OBJ_SWITCHSKL:
3941  OperateLever(pnum, i);
3942  break;
3943  case OBJ_CHEST1:
3944  case OBJ_CHEST2:
3945  case OBJ_CHEST3:
3946  case OBJ_TCHEST1:
3947  case OBJ_TCHEST2:
3948  case OBJ_TCHEST3:
3949  OperateChest(pnum, i, FALSE);
3950  break;
3951  case OBJ_SARC:
3952  OperateSarc(pnum, i, FALSE);
3953  break;
3954  case OBJ_BLINDBOOK:
3955  case OBJ_BLOODBOOK:
3956  case OBJ_STEELTOME:
3957  OperateBookLever(pnum, i);
3958  break;
3959  case OBJ_SHRINEL:
3960  case OBJ_SHRINER:
3961  OperateShrine(pnum, i, IS_MAGIC);
3962  break;
3963  case OBJ_SKELBOOK:
3964  case OBJ_BOOKSTAND:
3965  OperateSkelBook(pnum, i, FALSE);
3966  break;
3967  case OBJ_BOOKCASEL:
3968  case OBJ_BOOKCASER:
3969  OperateBookCase(pnum, i, FALSE);
3970  break;
3971  case OBJ_DECAP:
3972  OperateDecap(pnum, i, FALSE);
3973  break;
3974  case OBJ_ARMORSTAND:
3975  case OBJ_WARARMOR:
3976  OperateArmorStand(pnum, i, FALSE);
3977  break;
3978  case OBJ_GOATSHRINE:
3979  OperateGoatShrine(pnum, i, LS_GSHRINE);
3980  break;
3981  case OBJ_CAULDRON:
3982  OperateCauldron(pnum, i, LS_CALDRON);
3983  break;
3984  case OBJ_MURKYFTN:
3985  case OBJ_TEARFTN:
3986  OperateFountains(pnum, i);
3987  break;
3988  case OBJ_STORYBOOK:
3989  OperateStoryBook(pnum, i);
3990  break;
3991  case OBJ_PEDISTAL:
3992  OperatePedistal(pnum, i);
3993  break;
3994  case OBJ_WARWEAP:
3995  case OBJ_WEAPONRACK:
3996  OperateWeaponRack(pnum, i, FALSE);
3997  break;
3998  case OBJ_MUSHPATCH:
3999  OperateMushPatch(pnum, i);
4000  break;
4001  case OBJ_SLAINHERO:
4002  OperateSlainHero(pnum, i, FALSE);
4003  break;
4004  case OBJ_SIGNCHEST:
4005  OperateInnSignChest(pnum, i);
4006  break;
4007  }
4008 }
4009 
4010 void BreakCrux(int i)
4011 {
4012  int j, oi;
4013  BOOL triggered;
4014 
4015  object[i]._oAnimFlag = 1;
4016  object[i]._oAnimFrame = 1;
4017  object[i]._oAnimDelay = 1;
4018  object[i]._oSolidFlag = TRUE;
4019  object[i]._oMissFlag = TRUE;
4020  object[i]._oBreak = -1;
4021  object[i]._oSelFlag = 0;
4022  triggered = TRUE;
4023  for (j = 0; j < nobjects; j++) {
4024  oi = objectactive[j];
4025  if (object[oi]._otype != OBJ_CRUX1 && object[oi]._otype != OBJ_CRUX2 && object[oi]._otype != OBJ_CRUX3)
4026  continue;
4027  if (object[i]._oVar8 != object[oi]._oVar8 || object[oi]._oBreak == -1)
4028  continue;
4029  triggered = FALSE;
4030  }
4031  if (!triggered)
4032  return;
4033  if (!deltaload)
4034  PlaySfxLoc(IS_LEVER, object[i]._ox, object[i]._oy);
4035  ObjChangeMap(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4);
4036 }
4037 
4038 void BreakBarrel(int pnum, int i, int dam, BOOL forcebreak, BOOL sendmsg)
4039 {
4040  int oi;
4041  int xp, yp;
4042 
4043  if (object[i]._oSelFlag == 0)
4044  return;
4045  if (forcebreak) {
4046  object[i]._oVar1 = 0;
4047  } else {
4048  object[i]._oVar1 -= dam;
4049  if (pnum != myplr && object[i]._oVar1 <= 0)
4050  object[i]._oVar1 = 1;
4051  }
4052  if (object[i]._oVar1 > 0) {
4053  if (deltaload)
4054  return;
4055 
4056  PlaySfxLoc(IS_IBOW, object[i]._ox, object[i]._oy);
4057  return;
4058  }
4059 
4060  object[i]._oBreak = -1;
4061  object[i]._oVar1 = 0;
4062  object[i]._oAnimFlag = 1;
4063  object[i]._oAnimFrame = 1;
4064  object[i]._oAnimDelay = 1;
4065  object[i]._oSolidFlag = FALSE;
4066  object[i]._oMissFlag = TRUE;
4067  object[i]._oSelFlag = 0;
4068  object[i]._oPreFlag = TRUE;
4069  if (deltaload) {
4070  object[i]._oAnimCnt = 0;
4071  object[i]._oAnimFrame = object[i]._oAnimLen;
4072  object[i]._oAnimDelay = 1000;
4073  return;
4074  }
4075 
4076  if (object[i]._otype == OBJ_BARRELEX) {
4077  PlaySfxLoc(IS_BARLFIRE, object[i]._ox, object[i]._oy);
4078  for (yp = object[i]._oy - 1; yp <= object[i]._oy + 1; yp++) {
4079  for (xp = object[i]._ox - 1; xp <= object[i]._ox + 1; xp++) {
4080  if (dMonster[xp][yp] > 0)
4081  MonsterTrapHit(dMonster[xp][yp] - 1, 1, 4, 0, 1, FALSE);
4082  if (dPlayer[xp][yp] > 0)
4083  PlayerMHit(dPlayer[xp][yp] - 1, -1, 0, 8, 16, 1, FALSE, 0);
4084  if (dObject[xp][yp] > 0) {
4085  oi = dObject[xp][yp] - 1;
4086  if (object[oi]._otype == OBJ_BARRELEX && object[oi]._oBreak != -1)
4087  BreakBarrel(pnum, oi, dam, TRUE, sendmsg);
4088  }
4089  }
4090  }
4091  } else {
4092  PlaySfxLoc(IS_BARREL, object[i]._ox, object[i]._oy);
4093  SetRndSeed(object[i]._oRndSeed);
4094  if (object[i]._oVar2 <= 1) {
4095  if (!object[i]._oVar3)
4096  CreateRndUseful(pnum, object[i]._ox, object[i]._oy, sendmsg);
4097  else
4098  CreateRndItem(object[i]._ox, object[i]._oy, FALSE, sendmsg, FALSE);
4099  }
4100  if (object[i]._oVar2 >= 8)
4101  SpawnSkeleton(object[i]._oVar4, object[i]._ox, object[i]._oy);
4102  }
4103  if (pnum == myplr)
4104  NetSendCmdParam2(FALSE, CMD_BREAKOBJ, pnum, i);
4105 }
4106 
4107 void BreakObject(int pnum, int oi)
4108 {
4109  int objdam, mind, maxd;
4110 
4111  if (pnum != -1) {
4112  mind = plr[pnum]._pIMinDam;
4113  maxd = random_(163, plr[pnum]._pIMaxDam - mind + 1);
4114  objdam = maxd + mind;
4115  objdam += plr[pnum]._pDamageMod + plr[pnum]._pIBonusDamMod + objdam * plr[pnum]._pIBonusDam / 100;
4116  } else {
4117  objdam = 10;
4118  }
4119  switch (object[oi]._otype) {
4120  case OBJ_CRUX1:
4121  case OBJ_CRUX2:
4122  case OBJ_CRUX3:
4123  BreakCrux(oi);
4124  break;
4125  case OBJ_BARREL:
4126  case OBJ_BARRELEX:
4127  BreakBarrel(pnum, oi, objdam, FALSE, TRUE);
4128  break;
4129  }
4130 }
4131 
4132 void SyncBreakObj(int pnum, int oi)
4133 {
4134  if (object[oi]._otype >= OBJ_BARREL && object[oi]._otype <= OBJ_BARRELEX)
4135  BreakBarrel(pnum, oi, 0, TRUE, FALSE);
4136 }
4137 
4138 void SyncL1Doors(int i)
4139 {
4140  int x, y;
4141 
4142  if (object[i]._oVar4 == 0) {
4143  object[i]._oMissFlag = FALSE;
4144  return;
4145  }
4146 
4147  x = object[i]._ox;
4148  y = object[i]._oy;
4149  object[i]._oMissFlag = TRUE;
4150  object[i]._oSelFlag = 2;
4151  if (object[i]._otype == OBJ_L1LDOOR) {
4152  if (object[i]._oVar1 == 214)
4153  ObjSetMicro(x, y, 408);
4154  else
4155  ObjSetMicro(x, y, 393);
4156  dSpecial[x][y] = 7;
4157  objects_set_door_piece(x - 1, y);
4158  y--;
4159  } else {
4160  ObjSetMicro(x, y, 395);
4161  dSpecial[x][y] = 8;
4162  objects_set_door_piece(x, y - 1);
4163  x--;
4164  }
4165  DoorSet(i, x, y);
4166 }
4167 
4168 void SyncCrux(int i)
4169 {
4170  BOOL found;
4171  int j, oi, type;
4172 
4173  found = TRUE;
4174  for (j = 0; j < nobjects; j++) {
4175  oi = objectactive[j];
4176  type = object[oi]._otype;
4177  if (type != OBJ_CRUX1 && type != OBJ_CRUX2 && type != OBJ_CRUX3)
4178  continue;
4179  if (object[i]._oVar8 != object[oi]._oVar8 || object[oi]._oBreak == -1)
4180  continue;
4181  found = FALSE;
4182  }
4183  if (found)
4184  ObjChangeMap(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4);
4185 }
4186 
4187 void SyncLever(int i)
4188 {
4189  if (object[i]._oSelFlag == 0)
4190  ObjChangeMap(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4);
4191 }
4192 
4193 void SyncQSTLever(int i)
4194 {
4195  int tren;
4196 
4197  if (object[i]._oAnimFrame == object[i]._oVar6) {
4198  ObjChangeMapResync(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4);
4199  if (object[i]._otype == OBJ_BLINDBOOK) {
4200  tren = TransVal;
4201  TransVal = 9;
4202  DRLG_MRectTrans(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4);
4203  TransVal = tren;
4204  }
4205  }
4206 }
4207 
4208 void SyncPedistal(int i)
4209 {
4210  BYTE *setp;
4211 
4212  if (object[i]._oVar6 == 1)
4214  if (object[i]._oVar6 == 2) {
4217  }
4218  if (object[i]._oVar6 == 3) {
4219  ObjChangeMapResync(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4);
4220  setp = LoadFileInMem("Levels\\L2Data\\Blood2.DUN", NULL);
4221  LoadMapObjs(setp, 2 * setpc_x, 2 * setpc_y);
4222  mem_free_dbg(setp);
4223  }
4224 }
4225 
4226 void SyncL2Doors(int i)
4227 {
4228  int x, y;
4229 
4230  if (object[i]._oVar4 == 0)
4231  object[i]._oMissFlag = FALSE;
4232  else
4233  object[i]._oMissFlag = TRUE;
4234  x = object[i]._ox;
4235  y = object[i]._oy;
4236  object[i]._oSelFlag = 2;
4237  if (object[i]._otype == OBJ_L2LDOOR && object[i]._oVar4 == 0) {
4238  ObjSetMicro(x, y, 538);
4239  } else if (object[i]._otype == OBJ_L2LDOOR && (object[i]._oVar4 == 1 || object[i]._oVar4 == 2)) {
4240  ObjSetMicro(x, y, 13);
4241  } else if (object[i]._otype == OBJ_L2RDOOR && object[i]._oVar4 == 0) {
4242  ObjSetMicro(x, y, 540);
4243  } else if (object[i]._otype == OBJ_L2RDOOR && (object[i]._oVar4 == 1 || object[i]._oVar4 == 2)) {
4244  ObjSetMicro(x, y, 17);
4245  }
4246 }
4247 
4248 void SyncL3Doors(int i)
4249 {
4250  int x, y;
4251 
4252  object[i]._oMissFlag = TRUE;
4253  x = object[i]._ox;
4254  y = object[i]._oy;
4255  object[i]._oSelFlag = 2;
4256  if (object[i]._otype == OBJ_L3LDOOR && object[i]._oVar4 == 0) {
4257  ObjSetMicro(x, y, 531);
4258  } else if (object[i]._otype == OBJ_L3LDOOR && (object[i]._oVar4 == 1 || object[i]._oVar4 == 2)) {
4259  ObjSetMicro(x, y, 538);
4260  } else if (object[i]._otype == OBJ_L3RDOOR && object[i]._oVar4 == 0) {
4261  ObjSetMicro(x, y, 534);
4262  } else if (object[i]._otype == OBJ_L3RDOOR && (object[i]._oVar4 == 1 || object[i]._oVar4 == 2)) {
4263  ObjSetMicro(x, y, 541);
4264  }
4265 }
4266 
4267 void SyncObjectAnim(int o)
4268 {
4269  int file;
4270  int i;
4271  int ofindex;
4272 
4273  file = ObjFileList[0];
4274  ofindex = AllObjects[object[o]._otype].ofindex;
4275  i = 0;
4276  while (file != ofindex) {
4277  file = ObjFileList[i + 1];
4278  i++;
4279  }
4280  object[o]._oAnimData = pObjCels[i];
4281  switch (object[o]._otype) {
4282  case OBJ_BOOK2R:
4283  case OBJ_BLINDBOOK:
4284  case OBJ_STEELTOME:
4285  SyncQSTLever(o);
4286  break;
4287  case OBJ_L1LIGHT:
4288  break;
4289  case OBJ_L1LDOOR:
4290  case OBJ_L1RDOOR:
4291  SyncL1Doors(o);
4292  break;
4293  case OBJ_L2LDOOR:
4294  case OBJ_L2RDOOR:
4295  SyncL2Doors(o);
4296  break;
4297  case OBJ_L3LDOOR:
4298  case OBJ_L3RDOOR:
4299  SyncL3Doors(o);
4300  break;
4301  case OBJ_LEVER:
4302  case OBJ_BOOK2L:
4303  case OBJ_SWITCHSKL:
4304  SyncLever(o);
4305  break;
4306  case OBJ_CRUX1:
4307  case OBJ_CRUX2:
4308  case OBJ_CRUX3:
4309  SyncCrux(o);
4310  break;
4311  case OBJ_PEDISTAL:
4312  SyncPedistal(o);
4313  break;
4314  }
4315 }
4316 
4317 void GetObjectStr(int i)
4318 {
4319  switch (object[i]._otype) {
4320  case OBJ_LEVER:
4321  case OBJ_FLAMELVR:
4322  strcpy(infostr, "Lever");
4323  break;
4324  case OBJ_CHEST1:
4325  case OBJ_TCHEST1:
4326  strcpy(infostr, "Small Chest");
4327  break;
4328  case OBJ_L1LDOOR:
4329  case OBJ_L1RDOOR:
4330  case OBJ_L2LDOOR:
4331  case OBJ_L2RDOOR:
4332  case OBJ_L3LDOOR:
4333  case OBJ_L3RDOOR:
4334  if (object[i]._oVar4 == 1)
4335  strcpy(infostr, "Open Door");
4336  if (object[i]._oVar4 == 0)
4337  strcpy(infostr, "Closed Door");
4338  if (object[i]._oVar4 == 2)
4339  strcpy(infostr, "Blocked Door");
4340  break;
4341  case OBJ_BOOK2L:
4342  if (setlevel) {
4343  if (setlvlnum == SL_BONECHAMB) {
4344  strcpy(infostr, "Ancient Tome");
4345  } else if (setlvlnum == SL_VILEBETRAYER) {
4346  strcpy(infostr, "Book of Vileness");
4347  }
4348  }
4349  break;
4350  case OBJ_SWITCHSKL:
4351  strcpy(infostr, "Skull Lever");
4352  break;
4353  case OBJ_BOOK2R:
4354  strcpy(infostr, "Mythical Book");
4355  break;
4356 
4357  case OBJ_CHEST2:
4358  case OBJ_TCHEST2:
4359  strcpy(infostr, "Chest");
4360  break;
4361  case OBJ_CHEST3:
4362  case OBJ_TCHEST3:
4363  case OBJ_SIGNCHEST:
4364  strcpy(infostr, "Large Chest");
4365  break;
4366  case OBJ_CRUX1:
4367  case OBJ_CRUX2:
4368  case OBJ_CRUX3:
4369  strcpy(infostr, "Crucified Skeleton");
4370  break;
4371  case OBJ_SARC:
4372  strcpy(infostr, "Sarcophagus");
4373  break;
4374  case OBJ_BOOKSHELF:
4375  strcpy(infostr, "Bookshelf");
4376  break;
4377  case OBJ_BARREL:
4378  case OBJ_BARRELEX:
4379  strcpy(infostr, "Barrel");
4380  break;
4381  case OBJ_SKELBOOK:
4382  strcpy(infostr, "Skeleton Tome");
4383  break;
4384  case OBJ_SHRINEL:
4385  case OBJ_SHRINER:
4386  sprintf(tempstr, "%s Shrine", shrinestrs[object[i]._oVar1]);
4387  strcpy(infostr, tempstr);
4388  break;
4389  case OBJ_BOOKCASEL:
4390  case OBJ_BOOKCASER:
4391  strcpy(infostr, "Bookcase");
4392  break;
4393  case OBJ_BOOKSTAND:
4394  strcpy(infostr, "Library Book");
4395  break;
4396  case OBJ_BLOODFTN:
4397  strcpy(infostr, "Blood Fountain");
4398  break;
4399  case OBJ_DECAP:
4400  strcpy(infostr, "Decapitated Body");
4401  break;
4402  case OBJ_BLINDBOOK:
4403  strcpy(infostr, "Book of the Blind");
4404  break;
4405  case OBJ_BLOODBOOK:
4406  strcpy(infostr, "Book of Blood");
4407  break;
4408  case OBJ_PEDISTAL:
4409  strcpy(infostr, "Pedestal of Blood");
4410  break;
4411  case OBJ_PURIFYINGFTN:
4412  strcpy(infostr, "Purifying Spring");
4413  break;
4414  case OBJ_ARMORSTAND:
4415  case OBJ_WARARMOR:
4416  strcpy(infostr, "Armor");
4417  break;
4418  case OBJ_GOATSHRINE:
4419  strcpy(infostr, "Goat Shrine");
4420  break;
4421  case OBJ_CAULDRON:
4422  strcpy(infostr, "Cauldron");
4423  break;
4424  case OBJ_MURKYFTN:
4425  strcpy(infostr, "Murky Pool");
4426  break;
4427  case OBJ_TEARFTN:
4428  strcpy(infostr, "Fountain of Tears");
4429  break;
4430  case OBJ_STEELTOME:
4431  strcpy(infostr, "Steel Tome");
4432  break;
4433  case OBJ_STORYBOOK:
4434  strcpy(infostr, StoryBookName[object[i]._oVar3]);
4435  break;
4436  case OBJ_WARWEAP:
4437  case OBJ_WEAPONRACK:
4438  strcpy(infostr, "Weapon Rack");
4439  break;
4440  case OBJ_MUSHPATCH:
4441  strcpy(infostr, "Mushroom Patch");
4442  break;
4443  case OBJ_LAZSTAND:
4444  strcpy(infostr, "Vile Stand");
4445  break;
4446  case OBJ_SLAINHERO:
4447  strcpy(infostr, "Slain Hero");
4448  break;
4449  }
4450  if (plr[myplr]._pClass == PC_ROGUE) {
4451  if (object[i]._oTrapFlag) {
4452  sprintf(tempstr, "Trapped %s", infostr);
4453  strcpy(infostr, tempstr);
4454  infoclr = COL_RED;
4455  }
4456  }
4457 }
4458 
numobjfiles
int numobjfiles
Definition: objects.cpp:15
EMSG_SHRINE_ORNATE
@ EMSG_SHRINE_ORNATE
Definition: enums.h:1932
ItemStruct::_iSeed
int _iSeed
Definition: structs.h:100
Obj_Door
void Obj_Door(int i)
Definition: objects.cpp:1549
SHRINE_SACRED
@ SHRINE_SACRED
Definition: enums.h:2891
EMSG_SHRINE_THAUMATURGIC
@ EMSG_SHRINE_THAUMATURGIC
Definition: enums.h:1916
ICURS_LONG_WAR_BOW
@ ICURS_LONG_WAR_BOW
Definition: enums.h:245
QuestStruct::_qtx
int _qtx
Definition: structs.h:975
AddBookcase
void AddBookcase(int i)
Definition: objects.cpp:1142
PlayerStruct::_pManaBase
int _pManaBase
Definition: structs.h:261
SyncObjectAnim
void SyncObjectAnim(int o)
Definition: objects.cpp:4267
PS_WARR9
@ PS_WARR9
Definition: enums.h:1026
IMISC_FULLMANA
@ IMISC_FULLMANA
Definition: enums.h:2438
AddL2Door
void AddL2Door(int i, int x, int y, int ot)
Definition: objects.cpp:1028
AddBrnCross
void AddBrnCross(int i)
Definition: objects.cpp:1229
SPL_HBOLT
@ SPL_HBOLT
Definition: enums.h:2161
AddL3Door
void AddL3Door(int i, int x, int y, int ot)
Definition: objects.cpp:1038
AddLight
int AddLight(int x, int y, int r)
Definition: lighting.cpp:1021
ProcessObjects
void ProcessObjects()
Definition: objects.cpp:1720
CheckStats
void CheckStats(int p)
Definition: player.cpp:3798
ObjL2Special
void ObjL2Special(int x1, int y1, int x2, int y2)
Definition: objects.cpp:1901
OperateObject
void OperateObject(int pnum, int i, BOOL TeleFlag)
Definition: objects.cpp:3728
EMSG_SHRINE_HOLY
@ EMSG_SHRINE_HOLY
Definition: enums.h:1923
PlayerStruct::_pGold
int _pGold
Definition: structs.h:275
OBJ_SHRINER
@ OBJ_SHRINER
Definition: enums.h:2389
QS_MUSHSPAWNED
@ QS_MUSHSPAWNED
Definition: enums.h:2577
quests
QuestStruct quests[MAXQUESTS]
Definition: quests.cpp:8
AllObjects
ObjDataStruct AllObjects[99]
Contains the data related to each object ID.
Definition: objdat.cpp:123
UniqMonst
UniqMonstStruct UniqMonst[]
Definition: monstdat.cpp:264
OperateSarc
void OperateSarc(int pnum, int i, BOOL sendmsg)
Definition: objects.cpp:2696
InitRndLocObj5x5
void InitRndLocObj5x5(int min, int max, int objtype)
Definition: objects.cpp:198
SHRINE_ELDRITCH
@ SHRINE_ELDRITCH
Definition: enums.h:2887
diabquad1y
int diabquad1y
Definition: drlg_l4.cpp:11
PlayerStruct::InvGrid
char InvGrid[NUM_INV_GRID_ELEM]
Definition: structs.h:316
AddGoatShrine
void AddGoatShrine(int i)
Definition: objects.cpp:1180
EMSG_SHRINE_TAINTED1
@ EMSG_SHRINE_TAINTED1
Definition: enums.h:1934
OBJ_FLAMEHOLE
@ OBJ_FLAMEHOLE
Definition: enums.h:2378
AddCauldron
void AddCauldron(int i)
Definition: objects.cpp:1185
PS_MAGE68
@ PS_MAGE68
Definition: enums.h:879
setpc_w
int setpc_w
Definition: gendung.cpp:71
OBJ_BOOK2R
@ OBJ_BOOK2R
Definition: enums.h:2370
RedoPlayerVision
void RedoPlayerVision()
Definition: objects.cpp:1979
ObjDataStruct::oAnimFlag
int oAnimFlag
Definition: structs.h:645
TEXT_MBLINDING
@ TEXT_MBLINDING
Definition: enums.h:1788
SyncLever
void SyncLever(int i)
Definition: objects.cpp:4187
OBJ_SLAINHERO
@ OBJ_SLAINHERO
Definition: enums.h:2425
OperateSlainHero
void OperateSlainHero(int pnum, int i, BOOL sendmsg)
Definition: objects.cpp:2639
OBJ_TORCHL
@ OBJ_TORCHL
Definition: enums.h:2373
QS_TOMEGIVEN
@ QS_TOMEGIVEN
Definition: enums.h:2576
IS_CHEST
@ IS_CHEST
Definition: enums.h:301
DeleteObject_
void DeleteObject_(int oi, int i)
Definition: objects.cpp:907
OBJ_L1LIGHT
@ OBJ_L1LIGHT
Definition: enums.h:2329
SHRINE_SECLUDED
@ SHRINE_SECLUDED
Definition: enums.h:2897
SetGoldCurs
void SetGoldCurs(int pnum, int i)
Definition: stores.cpp:1762
force_redraw
int force_redraw
Definition: diablo.cpp:30
LS_GSHRINE
@ LS_GSHRINE
Definition: enums.h:395
currlevel
BYTE currlevel
Definition: gendung.cpp:40
PlayerStruct::_pMaxHP
int _pMaxHP
Definition: structs.h:259
SPL_FIREBOLT
@ SPL_FIREBOLT
Definition: enums.h:2131
PlayerStruct::_pMana
int _pMana
Definition: structs.h:263
diabquad2y
int diabquad2y
Definition: drlg_l4.cpp:15
LS_BLODSTAR
@ LS_BLODSTAR
Definition: enums.h:374
Q_BUTCHER
@ Q_BUTCHER
Definition: enums.h:2554
SHRINE_GLIMMERING
@ SHRINE_GLIMMERING
Definition: enums.h:2899
PS_ROGUE9
@ PS_ROGUE9
Definition: enums.h:923
AddL3Objs
void AddL3Objs(int x1, int y1, int x2, int y2)
Definition: objects.cpp:407
OBJ_PEDISTAL
@ OBJ_PEDISTAL
Definition: enums.h:2402
ObjDataStruct::oSelFlag
char oSelFlag
Definition: structs.h:653
setpc_h
int setpc_h
Definition: gendung.cpp:70
SHRINE_MYSTERIOUS
@ SHRINE_MYSTERIOUS
Definition: enums.h:2875
MICROS::mt
WORD mt[16]
Definition: structs.h:1122
LoadMapObjs
void LoadMapObjs(BYTE *pMap, int startx, int starty)
Definition: objects.cpp:573
AddMushPatch
void AddMushPatch()
Definition: objects.cpp:1303
SHRINE_HIDDEN
@ SHRINE_HIDDEN
Definition: enums.h:2876
EMSG_SHRINE_MYSTERIOUS
@ EMSG_SHRINE_MYSTERIOUS
Definition: enums.h:1908
diabquad3x
int diabquad3x
Definition: drlg_l4.cpp:12
SetCursor_
void SetCursor_(int i)
Definition: cursor.cpp:99
SHRINE_CRYPTIC
@ SHRINE_CRYPTIC
Definition: enums.h:2885
QuestStatus
BOOL QuestStatus(int i)
Definition: quests.cpp:239
setpc_x
int setpc_x
Definition: gendung.cpp:72
OBJ_SHRINEL
@ OBJ_SHRINEL
Definition: enums.h:2388
NUM_INVLOC
@ NUM_INVLOC
Definition: enums.h:2796
MAX_PLRS
#define MAX_PLRS
Definition: defs.h:16
OperateL1LDoor
void OperateL1LDoor(int pnum, int oi, BOOL sendflag)
Definition: objects.cpp:2043
Q_MUSHROOM
@ Q_MUSHROOM
Definition: enums.h:2549
OBJ_CANDLE2
@ OBJ_CANDLE2
Definition: enums.h:2338
INVLOC_HEAD
@ INVLOC_HEAD
Definition: enums.h:2789
ObjDataStruct::oAnimDelay
int oAnimDelay
Definition: structs.h:646
ObjSetMicro
void ObjSetMicro(int dx, int dy, int pn)
Definition: objects.cpp:1807
SetRndSeed
void SetRndSeed(int s)
Set the RNG seed.
Definition: engine.cpp:728
OBJ_BLOODFTN
@ OBJ_BLOODFTN
Definition: enums.h:2395
DoLighting
void DoLighting(int nXPos, int nYPos, int nRadius, int Lnum)
Definition: lighting.cpp:511
OBJ_TORTURE1
@ OBJ_TORTURE1
Definition: enums.h:2365
MonstCheckDoors
void MonstCheckDoors(int m)
Definition: objects.cpp:2265
trapdir
int trapdir
Definition: objects.cpp:6
CreateMagicWeapon
void CreateMagicWeapon(int x, int y, int imisc, int icurs, BOOL sendmsg, BOOL delta)
Definition: items.cpp:3979
EMSG_SHRINE_STONE
@ EMSG_SHRINE_STONE
Definition: enums.h:1913
dungeon
BYTE dungeon[DMAXX][DMAXY]
Definition: gendung.cpp:18
PlayerStruct::_pMaxHPBase
int _pMaxHPBase
Definition: structs.h:257
DTYPE_CATACOMBS
@ DTYPE_CATACOMBS
Definition: enums.h:1870
PlayerStruct::_pIBonusDamMod
int _pIBonusDamMod
Definition: structs.h:325
pdungeon
BYTE pdungeon[DMAXX][DMAXY]
Definition: gendung.cpp:20
ItemStruct::_iStatFlag
BOOL _iStatFlag
Definition: structs.h:169
nobjects
int nobjects
Definition: objects.cpp:10
SyncOpL1Door
void SyncOpL1Door(int pnum, int cmd, int i)
Definition: objects.cpp:3855
BreakObject
void BreakObject(int pnum, int oi)
Definition: objects.cpp:4107
CMD_OPERATEOBJ
@ CMD_OPERATEOBJ
Definition: enums.h:2216
UMT_ZHAR
@ UMT_ZHAR
Definition: enums.h:1492
INVLOC_CHEST
@ INVLOC_CHEST
Definition: enums.h:2795
IS_QUESTDN
@ IS_QUESTDN
Definition: enums.h:295
AddObjLight
void AddObjLight(int i, int r)
Definition: objects.cpp:1086
OBJ_TORCHL2
@ OBJ_TORCHL2
Definition: enums.h:2375
OBJ_L1RDOOR
@ OBJ_L1RDOOR
Definition: enums.h:2331
OperateL3Door
void OperateL3Door(int pnum, int i, BOOL sendflag)
Definition: objects.cpp:2730
PlayerStruct::_pNumInv
int _pNumInv
Definition: structs.h:315
SL_VILEBETRAYER
@ SL_VILEBETRAYER
Definition: enums.h:2544
EMSG_SHRINE_ENCHANTED
@ EMSG_SHRINE_ENCHANTED
Definition: enums.h:1915
PlayerStruct::WorldX
int WorldX
Definition: structs.h:188
PlayerMHit
BOOL PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, BOOLEAN shift, int earflag)
Definition: missiles.cpp:679
PlayerStruct::_pHPBase
int _pHPBase
Definition: structs.h:256
AddL1Objs
void AddL1Objs(int x1, int y1, int x2, int y2)
Definition: objects.cpp:375
CURSOR_HAND
@ CURSOR_HAND
Definition: enums.h:2067
MAXDUNX
#define MAXDUNX
Definition: defs.h:25
ItemStruct::_iDurability
int _iDurability
Definition: structs.h:135
ItemStruct::_iMinDam
int _iMinDam
Definition: structs.h:124
shrinemin
char shrinemin[NUM_SHRINETYPE]
Definition: objects.cpp:47
OBJ_L3RDOOR
@ OBJ_L3RDOOR
Definition: enums.h:2404
IMISC_FULLHEAL
@ IMISC_FULLHEAL
Definition: enums.h:2433
AddTorturedBody
void AddTorturedBody(int i)
Definition: objects.cpp:1270
SHRINE_ENCHANTED
@ SHRINE_ENCHANTED
Definition: enums.h:2882
ObjFileList
char ObjFileList[40]
Definition: objects.cpp:8
EMSG_SHRINE_EERIE
@ EMSG_SHRINE_EERIE
Definition: enums.h:1921
TEXT_MBLOODY
@ TEXT_MBLOODY
Definition: enums.h:1787
EMSG_SHRINE_GLIMMERING
@ EMSG_SHRINE_GLIMMERING
Definition: enums.h:1933
OperateArmorStand
void OperateArmorStand(int pnum, int i, BOOL sendmsg)
Definition: objects.cpp:3479
OBJ_L2LDOOR
@ OBJ_L2LDOOR
Definition: enums.h:2371
GetPlrHandSeed
void GetPlrHandSeed(ItemStruct *h)
Definition: items.cpp:818
GetObjectStr
void GetObjectStr(int i)
Definition: objects.cpp:4317
_object_id
_object_id
Definition: enums.h:2328
IDI_MUSHROOM
@ IDI_MUSHROOM
Definition: enums.h:2517
GetDirection
int GetDirection(int x1, int y1, int x2, int y2)
Calculate the best fit direction between two points.
Definition: engine.cpp:683
ClrAllObjects
void ClrAllObjects()
Definition: objects.cpp:226
OperateGoatShrine
void OperateGoatShrine(int pnum, int i, int sType)
Definition: objects.cpp:3532
AllItemsList
DEVILUTION_BEGIN_NAMESPACE ItemDataStruct AllItemsList[]
Contains the data related to each item ID.
Definition: itemdat.cpp:11
CreateMagicArmor
void CreateMagicArmor(int x, int y, int imisc, int icurs, BOOL sendmsg, BOOL delta)
Definition: items.cpp:3952
PlayerStruct::HoldItem
ItemStruct HoldItem
Definition: structs.h:318
pLevelPieces
BYTE * pLevelPieces
Definition: gendung.cpp:30
MIS_MANASHIELD
@ MIS_MANASHIELD
Definition: enums.h:1207
MonsterStruct::_mgoal
unsigned char _mgoal
Definition: structs.h:542
pMegaTiles
BYTE * pMegaTiles
Definition: gendung.cpp:29
DUR_INDESTRUCTIBLE
#define DUR_INDESTRUCTIBLE
Definition: defs.h:50
AddSarc
void AddSarc(int i)
Definition: objects.cpp:1048
OBJ_SARC
@ OBJ_SARC
Definition: enums.h:2377
AddPedistal
void AddPedistal(int i)
Definition: objects.cpp:1234
MICROS
Definition: structs.h:1121
EMSG_SHRINE_SPOOKY1
@ EMSG_SHRINE_SPOOKY1
Definition: enums.h:1926
ITYPE_NONE
@ ITYPE_NONE
Definition: enums.h:2495
LS_FOUNTAIN
@ LS_FOUNTAIN
Definition: enums.h:392
MonsterStruct::_mmode
int _mmode
Definition: structs.h:541
PlayerStruct::_pSplLvl
char _pSplLvl[64]
Definition: structs.h:225
INVLOC_HAND_LEFT
@ INVLOC_HAND_LEFT
Definition: enums.h:2793
dropGoldValue
int dropGoldValue
Definition: control.cpp:23
leverid
int leverid
Definition: objects.cpp:11
PlayerStruct::InvList
ItemStruct InvList[NUM_INV_GRID_ELEM]
Definition: structs.h:314
SyncL2Doors
void SyncL2Doors(int i)
Definition: objects.cpp:4226
MemFreeDbg
#define MemFreeDbg(p)
Definition: defs.h:157
EMSG_SHRINE_HIDDEN
@ EMSG_SHRINE_HIDDEN
Definition: enums.h:1909
ITYPE_MARMOR
@ ITYPE_MARMOR
Definition: enums.h:2488
ObjIndex
int ObjIndex(int x, int y)
Definition: setmaps.cpp:69
TEXT_RBLINDING
@ TEXT_RBLINDING
Definition: enums.h:1792
IS_IBOW
@ IS_IBOW
Definition: enums.h:331
OBJ_GOATSHRINE
@ OBJ_GOATSHRINE
Definition: enums.h:2408
MonsterStruct::mtalkmsg
int mtalkmsg
Definition: structs.h:606
TEXT_BOOK23
@ TEXT_BOOK23
Definition: enums.h:1801
PM_DEATH
@ PM_DEATH
Definition: enums.h:2051
AddL2Torches
void AddL2Torches()
Definition: objects.cpp:429
ClrPlrPath
void ClrPlrPath(int pnum)
Definition: player.cpp:3466
SyncOpL2Door
void SyncOpL2Door(int pnum, int cmd, int i)
Definition: objects.cpp:3878
SHRINE_TAINTED
@ SHRINE_TAINTED
Definition: enums.h:2900
OBJ_WARARMOR
@ OBJ_WARARMOR
Definition: enums.h:2418
CMD_OPENDOOR
@ CMD_OPENDOOR
Definition: enums.h:2214
EMSG_SHRINE_DIVINE
@ EMSG_SHRINE_DIVINE
Definition: enums.h:1922
AddFlameTrap
void AddFlameTrap(int i)
Definition: objects.cpp:1057
AddL2Objs
void AddL2Objs(int x1, int y1, int x2, int y2)
Definition: objects.cpp:392
PS_WARR13
@ PS_WARR13
Definition: enums.h:1031
IS_SARC
@ IS_SARC
Definition: enums.h:349
MonsterStruct::_mx
int _mx
Definition: structs.h:548
SpawnQuestItem
void SpawnQuestItem(int itemid, int x, int y, int randarea, int selflag)
Definition: items.cpp:2324
Obj_BCrossDamage
void Obj_BCrossDamage(int i)
Definition: objects.cpp:1687
CalcPlrInv
void CalcPlrInv(int p, BOOL Loadgfx)
Definition: items.cpp:764
ItemStruct::_ivalue
int _ivalue
Definition: structs.h:122
SyncPlrKill
void SyncPlrKill(int pnum, int earflag)
Definition: player.cpp:1884
deltaload
BOOL deltaload
Definition: msg.cpp:25
all.h
QuestStruct::_qactive
unsigned char _qactive
Definition: structs.h:973
OperateCauldron
void OperateCauldron(int pnum, int i, int sType)
Definition: objects.cpp:3541
OperateChest
void OperateChest(int pnum, int i, BOOL sendmsg)
Definition: objects.cpp:2532
SHRINE_THAUMATURGIC
@ SHRINE_THAUMATURGIC
Definition: enums.h:2883
MonsterTrapHit
BOOL MonsterTrapHit(int m, int mindam, int maxdam, int dist, int t, BOOLEAN shift)
Definition: missiles.cpp:483
OBJ_BOOKCASEL
@ OBJ_BOOKCASEL
Definition: enums.h:2391
AddBookLever
void AddBookLever(int lx1, int ly1, int lx2, int ly2, int x1, int y1, int x2, int y2, int msg)
Definition: objects.cpp:289
numthemes
DEVILUTION_BEGIN_NAMESPACE int numthemes
Definition: themes.cpp:10
InitRndLocObj
void InitRndLocObj(int min, int max, int objtype)
Definition: objects.cpp:144
PlayerStruct::SpdList
ItemStruct SpdList[MAXBELTITEMS]
Definition: structs.h:317
OBJ_L1LDOOR
@ OBJ_L1LDOOR
Definition: enums.h:2330
objectavail
int objectavail[MAXOBJECTS]
Definition: objects.cpp:12
SetupObject
void SetupObject(int i, int x, int y, int ot)
Definition: objects.cpp:920
OBJ_ARMORSTAND
@ OBJ_ARMORSTAND
Definition: enums.h:2406
dObject
char dObject[MAXDUNX][MAXDUNY]
Definition: gendung.cpp:19
OBJ_SKELBOOK
@ OBJ_SKELBOOK
Definition: enums.h:2390
SL_BONECHAMB
@ SL_BONECHAMB
Definition: enums.h:2541
ModifyPlrDex
void ModifyPlrDex(int p, int l)
Definition: player.cpp:3912
Obj_Sarc
void Obj_Sarc(int i)
Definition: objects.cpp:1570
OBJ_TNUDEM3
@ OBJ_TNUDEM3
Definition: enums.h:2360
themes
ThemeStruct themes[MAXTHEMES]
Definition: themes.cpp:22
InitObjects
void InitObjects()
Definition: objects.cpp:743
infostr
char infostr[256]
Definition: control.cpp:52
LS_CALDRON
@ LS_CALDRON
Definition: enums.h:378
MAXBELTITEMS
#define MAXBELTITEMS
Definition: defs.h:28
ObjDataStruct::ofindex
char ofindex
Definition: structs.h:639
OperateFountains
BOOL OperateFountains(int pnum, int i)
Definition: objects.cpp:3551
MGOAL_SHOOT
@ MGOAL_SHOOT
Definition: enums.h:1523
TEXT_MBONER
@ TEXT_MBONER
Definition: enums.h:1786
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
PS_MAGE13
@ PS_MAGE13
Definition: enums.h:824
OperateSChambBk
void OperateSChambBk(int pnum, int i)
Definition: objects.cpp:2505
Q_PWATER
@ Q_PWATER
Definition: enums.h:2561
AddSCambBook
void AddSCambBook(int i)
Definition: objects.cpp:985
AddMissile
int AddMissile(int sx, int sy, int dx, int dy, int midir, int mitype, char micaster, int id, int midam, int spllvl)
Definition: missiles.cpp:2455
ItemStruct::_iMaxDur
int _iMaxDur
Definition: structs.h:136
OBJ_MCIRCLE1
@ OBJ_MCIRCLE1
Definition: enums.h:2413
OperateL3LDoor
void OperateL3LDoor(int pnum, int oi, BOOL sendflag)
Definition: objects.cpp:2223
AddChestTraps
void AddChestTraps()
Definition: objects.cpp:520
MAXDUNY
#define MAXDUNY
Definition: defs.h:26
PS_ROGUE24
@ PS_ROGUE24
Definition: enums.h:938
SyncQSTLever
void SyncQSTLever(int i)
Definition: objects.cpp:4193
shrineavail
BYTE shrineavail[NUM_SHRINETYPE]
0 - sp+mp, 1 - sp only, 2 - mp only
Definition: objects.cpp:58
INVLOC_HAND_RIGHT
@ INVLOC_HAND_RIGHT
Definition: enums.h:2794
InitRndBarrels
void InitRndBarrels()
Definition: objects.cpp:328
TEXT_MBLOODWAR
@ TEXT_MBLOODWAR
Definition: enums.h:1789
PS_ROGUE13
@ PS_ROGUE13
Definition: enums.h:927
OBJ_BOOKSTAND
@ OBJ_BOOKSTAND
Definition: enums.h:2393
ChangeVisionXY
void ChangeVisionXY(int id, int x, int y)
Definition: lighting.cpp:1212
OBJ_BOOK2L
@ OBJ_BOOK2L
Definition: enums.h:2354
PlayerStruct::_pMaxMana
int _pMaxMana
Definition: structs.h:264
InitObjectGFX
void InitObjectGFX()
Definition: objects.cpp:80
StoryBookName
char * StoryBookName[9]
Definition: objects.cpp:63
AddPurifyingFountain
void AddPurifyingFountain(int i)
Definition: objects.cpp:1158
SetObjMapRange
void SetObjMapRange(int i, int x1, int y1, int x2, int y2, int v)
Definition: objects.cpp:958
dPiece
int dPiece[MAXDUNX][MAXDUNY]
Definition: gendung.cpp:26
nSolidTable
BOOLEAN nSolidTable[2049]
List of path blocking dPieces.
Definition: gendung.cpp:45
DRLG_MRectTrans
void DRLG_MRectTrans(int x1, int y1, int x2, int y2)
Definition: gendung.cpp:178
MIS_RNDTELEPORT
@ MIS_RNDTELEPORT
Definition: enums.h:1197
NetSendCmdParam1
void NetSendCmdParam1(BOOL bHiPri, BYTE bCmd, WORD wParam1)
Definition: msg.cpp:698
OBJ_TORTURE4
@ OBJ_TORTURE4
Definition: enums.h:2368
PreSpawnSkeleton
int PreSpawnSkeleton()
Definition: monster.cpp:5360
BreakBarrel
void BreakBarrel(int pnum, int i, int dam, BOOL forcebreak, BOOL sendmsg)
Definition: objects.cpp:4038
SHRINE_GLOOMY
@ SHRINE_GLOOMY
Definition: enums.h:2877
OBJ_BOOKCASER
@ OBJ_BOOKCASER
Definition: enums.h:2392
AddChest
void AddChest(int i, int t)
Definition: objects.cpp:994
ModifyPlrMag
void ModifyPlrMag(int p, int l)
Definition: player.cpp:3877
assert
#define assert(exp)
Definition: defs.h:168
AddBloodFtn
void AddBloodFtn(int i)
Definition: objects.cpp:1153
TEXT_BOOK32
@ TEXT_BOOK32
Definition: enums.h:1803
Obj_Circle
void Obj_Circle(int i)
Definition: objects.cpp:1501
SPL_LIGHTNING
@ SPL_LIGHTNING
Definition: enums.h:2133
Q_BETRAYER
@ Q_BETRAYER
Definition: enums.h:2563
CMD_CLOSEDOOR
@ CMD_CLOSEDOOR
Definition: enums.h:2215
SyncOpL3Door
void SyncOpL3Door(int pnum, int cmd, int i)
Definition: objects.cpp:3901
ObjChangeMapResync
void ObjChangeMapResync(int x1, int y1, int x2, int y2)
Definition: objects.cpp:2330
CMD_PLROPOBJ
@ CMD_PLROPOBJ
Definition: enums.h:2217
PlayerStruct::_pFireResist
char _pFireResist
Definition: structs.h:273
TransVal
char TransVal
Definition: gendung.cpp:23
OperateMushPatch
void OperateMushPatch(int pnum, int i)
Definition: objects.cpp:2578
ITYPE_HELM
@ ITYPE_HELM
Definition: enums.h:2487
TEXT_BLINDING
@ TEXT_BLINDING
Definition: enums.h:1784
AddSlainHero
void AddSlainHero()
Definition: objects.cpp:1318
EMSG_SHRINE_ELDRITCH
@ EMSG_SHRINE_ELDRITCH
Definition: enums.h:1920
OperateL1Door
void OperateL1Door(int pnum, int i, BOOL sendflag)
Definition: objects.cpp:2348
AddTearFountain
void AddTearFountain(int i)
Definition: objects.cpp:1202
EMSG_SHRINE_SECLUDED
@ EMSG_SHRINE_SECLUDED
Definition: enums.h:1931
DEVILUTION_END_NAMESPACE
#define DEVILUTION_END_NAMESPACE
Definition: types.h:10
ObjL1Special
void ObjL1Special(int x1, int y1, int x2, int y2)
Definition: objects.cpp:1862
AddUnLight
void AddUnLight(int i)
Definition: lighting.cpp:1046
TEXT_ZHAR2
@ TEXT_ZHAR2
Definition: enums.h:1696
OBJ_TORTURE2
@ OBJ_TORTURE2
Definition: enums.h:2366
OBJ_STAND
@ OBJ_STAND
Definition: enums.h:2352
EMSG_SHRINE_SACRED
@ EMSG_SHRINE_SACRED
Definition: enums.h:1924
IS_BARREL
@ IS_BARREL
Definition: enums.h:298
SHRINE_ORNATE
@ SHRINE_ORNATE
Definition: enums.h:2898
monster
MonsterStruct monster[MAXMONSTERS]
Definition: monster.cpp:19
SetPlrHandItem
void SetPlrHandItem(ItemStruct *h, int idata)
Definition: items.cpp:779
OperateBookLever
void OperateBookLever(int pnum, int i)
Definition: objects.cpp:2461
ObjDataStruct::oMissFlag
BOOL oMissFlag
Definition: structs.h:650
Obj_StopAnim
void Obj_StopAnim(int i)
Definition: objects.cpp:1541
OBJ_BARRELEX
@ OBJ_BARRELEX
Definition: enums.h:2387
MIS_FLAMEC
@ MIS_FLAMEC
Definition: enums.h:1243
EMSG_SHRINE_CRYPTIC
@ EMSG_SHRINE_CRYPTIC
Definition: enums.h:1918
AddArmorStand
void AddArmorStand(int i)
Definition: objects.cpp:1170
trapid
DEVILUTION_BEGIN_NAMESPACE int trapid
Definition: objects.cpp:5
OBJ_CHEST1
@ OBJ_CHEST1
Definition: enums.h:2334
SHRINE_WEIRD
@ SHRINE_WEIRD
Definition: enums.h:2878
SetMapObjects
void SetMapObjects(BYTE *pMap, int startx, int starty)
Definition: objects.cpp:846
PlayerStruct::_pDamageMod
int _pDamageMod
Definition: structs.h:254
MIS_GUARDIAN
@ MIS_GUARDIAN
Definition: enums.h:1196
ITYPE_BOW
@ ITYPE_BOW
Definition: enums.h:2483
TEXT_BOOK11
@ TEXT_BOOK11
Definition: enums.h:1796
LoadFileInMem
BYTE * LoadFileInMem(char *pszName, DWORD *pdwFileLen)
Load a file in to a buffer.
Definition: engine.cpp:801
OBJ_L3LDOOR
@ OBJ_L3LDOOR
Definition: enums.h:2403
StartStand
void StartStand(int pnum, int dir)
Definition: player.cpp:1056
EMSG_SHRINE_SPIRITUAL
@ EMSG_SHRINE_SPIRITUAL
Definition: enums.h:1925
RemoveInvItem
void RemoveInvItem(int pnum, int iv)
Definition: inv.cpp:1276
SkipThemeRoom
BOOL SkipThemeRoom(int x, int y)
Definition: gendung.cpp:555
EMSG_SHRINE_MAGICAL
@ EMSG_SHRINE_MAGICAL
Definition: enums.h:1912
OBJ_TBCROSS
@ OBJ_TBCROSS
Definition: enums.h:2420
OBJ_WATER
@ OBJ_WATER
Definition: enums.h:2380
ModifyPlrStr
void ModifyPlrStr(int p, int l)
Definition: player.cpp:3848
ObjDataStruct::oBreak
char oBreak
Definition: structs.h:652
TorchLocOK
BOOL TorchLocOK(int xp, int yp)
Definition: objects.cpp:454
TEXT_BOOK22
@ TEXT_BOOK22
Definition: enums.h:1800
SPL_CBOLT
@ SPL_CBOLT
Definition: enums.h:2160
diabquad2x
int diabquad2x
Definition: drlg_l4.cpp:14
IMISC_BOOK
@ IMISC_BOOK
Definition: enums.h:2455
OBJ_TNUDEW2
@ OBJ_TNUDEW2
Definition: enums.h:2363
BreakCrux
void BreakCrux(int i)
Definition: objects.cpp:4010
EMSG_SHRINE_ABANDONED
@ EMSG_SHRINE_ABANDONED
Definition: enums.h:1928
IDI_BANNER
@ IDI_BANNER
Definition: enums.h:2512
CreateRndUseful
void CreateRndUseful(int pnum, int x, int y, BOOL sendmsg)
Definition: items.cpp:2209
golditem
ItemStruct golditem
Definition: stores.cpp:24
EMSG_SHRINE_FASCINATING
@ EMSG_SHRINE_FASCINATING
Definition: enums.h:1917
OBJ_CHEST3
@ OBJ_CHEST3
Definition: enums.h:2336
OperateInnSignChest
void OperateInnSignChest(int pnum, int i)
Definition: objects.cpp:2609
dItem
char dItem[MAXDUNX][MAXDUNY]
Definition: gendung.cpp:57
OBJ_TCHEST2
@ OBJ_TCHEST2
Definition: enums.h:2398
AddStoryBooks
void AddStoryBooks()
Definition: objects.cpp:617
AddMagicCircle
void AddMagicCircle(int i)
Definition: objects.cpp:1221
pObjCels
BYTE * pObjCels[40]
Definition: objects.cpp:7
SHRINE_DIVINE
@ SHRINE_DIVINE
Definition: enums.h:2889
ObjMasterLoadList
char * ObjMasterLoadList[56]
Maps from object_graphic_id to object CEL name.
Definition: objdat.cpp:229
OBJ_MURKYFTN
@ OBJ_MURKYFTN
Definition: enums.h:2410
AddFlameLvr
void AddFlameLvr(int i)
Definition: objects.cpp:1065
M_StartStand
void M_StartStand(int i, int md)
Definition: monster.cpp:1207
objectactive
int objectactive[MAXOBJECTS]
Definition: objects.cpp:9
TEXT_RBONER
@ TEXT_RBONER
Definition: enums.h:1790
SHRINE_QUIET
@ SHRINE_QUIET
Definition: enums.h:2896
AddBarrel
void AddBarrel(int i, int t)
Definition: objects.cpp:1096
COL_RED
@ COL_RED
Definition: enums.h:1995
OBJ_SKFIRE
@ OBJ_SKFIRE
Definition: enums.h:2332
ITYPE_STAFF
@ ITYPE_STAFF
Definition: enums.h:2490
SHRINE_STONE
@ SHRINE_STONE
Definition: enums.h:2880
AddBookstand
void AddBookstand(int i)
Definition: objects.cpp:1148
AddTortures
void AddTortures()
Definition: objects.cpp:254
MIS_INFRA
@ MIS_INFRA
Definition: enums.h:1233
QuestStruct::_qmsg
unsigned char _qmsg
Definition: structs.h:979
QUEST_DONE
@ QUEST_DONE
Definition: enums.h:2570
nTrapTable
BOOLEAN nTrapTable[2049]
Definition: gendung.cpp:38
PlayerStruct::_pMaxManaBase
int _pMaxManaBase
Definition: structs.h:262
CreateTypeItem
void CreateTypeItem(int x, int y, BOOL onlygood, int itype, int imisc, BOOL sendmsg, BOOL delta)
Definition: items.cpp:2226
GetRndSeed
int GetRndSeed()
Get the current RNG seed.
Definition: engine.cpp:739
PlayerStruct::_pMemSpells
uint64_t _pMemSpells
Definition: structs.h:226
OBJ_STORYBOOK
@ OBJ_STORYBOOK
Definition: enums.h:2415
TEXT_BONER
@ TEXT_BONER
Definition: enums.h:1782
ChangeLightRadius
void ChangeLightRadius(int i, int r)
Definition: lighting.cpp:1056
EMSG_SHRINE_WEIRD
@ EMSG_SHRINE_WEIRD
Definition: enums.h:1911
Q_SCHAMB
@ Q_SCHAMB
Definition: enums.h:2562
diabquad4y
int diabquad4y
Definition: drlg_l4.cpp:17
armorFlag
BOOL armorFlag
Definition: themes.cpp:11
OBJ_SIGNCHEST
@ OBJ_SIGNCHEST
Definition: enums.h:2426
Q_BLIND
@ Q_BLIND
Definition: enums.h:2556
ObjDataStruct::oAnimWidth
int oAnimWidth
Definition: structs.h:648
lightflag
BOOL lightflag
Definition: lighting.cpp:22
EMSG_SHRINE_GLOOMY
@ EMSG_SHRINE_GLOOMY
Definition: enums.h:1910
IS_TRAP
@ IS_TRAP
Definition: enums.h:355
ItemStruct::_iCharges
int _iCharges
Definition: structs.h:133
EMSG_SHRINE_TAINTED2
@ EMSG_SHRINE_TAINTED2
Definition: enums.h:1935
AddStoryBook
void AddStoryBook(int i)
Definition: objects.cpp:1242
Q_LTBANNER
@ Q_LTBANNER
Definition: enums.h:2555
shrinemax
char shrinemax[NUM_SHRINETYPE]
Definition: objects.cpp:52
MIS_NOVA
@ MIS_NOVA
Definition: enums.h:1236
CMD_BREAKOBJ
@ CMD_BREAKOBJ
Definition: enums.h:2218
IMISC_HEAL
@ IMISC_HEAL
Definition: enums.h:2434
ITYPE_HARMOR
@ ITYPE_HARMOR
Definition: enums.h:2489
PlaySFX
void PlaySFX(int psfx)
Definition: effects.cpp:1043
RndLocOk
BOOL RndLocOk(int xp, int yp)
Definition: objects.cpp:127
OBJ_TNUDEM4
@ OBJ_TNUDEM4
Definition: enums.h:2361
TEXT_BOOK12
@ TEXT_BOOK12
Definition: enums.h:1797
InitObjFlag
BOOL InitObjFlag
Definition: objects.cpp:14
setlevel
BOOLEAN setlevel
Definition: gendung.cpp:65
OBJ_TORCHR2
@ OBJ_TORCHR2
Definition: enums.h:2376
Q_ROCK
@ Q_ROCK
Definition: enums.h:2548
ItemStruct::_iIdentified
BOOL _iIdentified
Definition: structs.h:114
PlayerStruct::_pIBonusDam
int _pIBonusDam
Definition: structs.h:322
AddCandles
void AddCandles()
Definition: objects.cpp:277
InitQTextMsg
void InitQTextMsg(int m)
Definition: minitext.cpp:70
PS_MAGE9
@ PS_MAGE9
Definition: enums.h:820
Q_WARLORD
@ Q_WARLORD
Definition: enums.h:2559
objects_set_door_piece
void objects_set_door_piece(int x, int y)
Definition: objects.cpp:1829
Obj_FlameTrap
void Obj_FlameTrap(int i)
Definition: objects.cpp:1591
IS_LEVER
@ IS_LEVER
Definition: enums.h:345
dpiece_defs_map_2
MICROS dpiece_defs_map_2[MAXDUNX][MAXDUNY]
Definition: gendung.cpp:79
OBJ_TNUDEM1
@ OBJ_TNUDEM1
Definition: enums.h:2358
SyncOpObject
void SyncOpObject(int pnum, int cmd, int i)
Definition: objects.cpp:3924
automapview
BOOLEAN automapview[DMAXX][DMAXY]
Tracks the explored areas of the map.
Definition: automap.cpp:21
DMAXY
#define DMAXY
Definition: defs.h:8
MAXOBJECTS
#define MAXOBJECTS
Definition: defs.h:33
CreateSpellBook
void CreateSpellBook(int x, int y, int ispell, BOOL sendmsg, BOOL delta)
Definition: items.cpp:3927
DTYPE_HELL
@ DTYPE_HELL
Definition: enums.h:1872
OBJ_STORYCANDLE
@ OBJ_STORYCANDLE
Definition: enums.h:2416
PS_ROGUE68
@ PS_ROGUE68
Definition: enums.h:982
OBJ_SWITCHSKL
@ OBJ_SWITCHSKL
Definition: enums.h:2357
shrinestrs
char * shrinestrs[NUM_SHRINETYPE]
Definition: objects.cpp:19
EMSG_SHRINE_SPOOKY2
@ EMSG_SHRINE_SPOOKY2
Definition: enums.h:1927
OBJ_WEAPONRACK
@ OBJ_WEAPONRACK
Definition: enums.h:2421
PlayerStruct::_pIMinDam
int _pIMinDam
Definition: structs.h:319
OBJ_BOOKSHELF
@ OBJ_BOOKSHELF
Definition: enums.h:2384
AddDecap
void AddDecap(int i)
Definition: objects.cpp:1207
tempstr
char tempstr[256]
Definition: control.cpp:41
AddWeaponRack
void AddWeaponRack(int i)
Definition: objects.cpp:1261
TEXT_RBLOODWAR
@ TEXT_RBLOODWAR
Definition: enums.h:1793
OBJ_FLAMELVR
@ OBJ_FLAMELVR
Definition: enums.h:2379
IMISC_NONE
@ IMISC_NONE
Definition: enums.h:2431
DTYPE_CAVES
@ DTYPE_CAVES
Definition: enums.h:1871
glSeedTbl
DWORD glSeedTbl[NUMLEVELS]
Definition: diablo.cpp:20
ObjDataStruct::oload
char oload
Definition: structs.h:638
OBJ_TNUDEM2
@ OBJ_TNUDEM2
Definition: enums.h:2359
SHRINE_SPIRITUAL
@ SHRINE_SPIRITUAL
Definition: enums.h:2892
OBJ_CRUX2
@ OBJ_CRUX2
Definition: enums.h:2350
DoorSet
void DoorSet(int oi, int dx, int dy)
Definition: objects.cpp:1938
OperateShrine
void OperateShrine(int pnum, int i, int sType)
Definition: objects.cpp:2818
PlayerStruct::InvBody
ItemStruct InvBody[NUM_INVLOC]
Definition: structs.h:313
AddObjTraps
void AddObjTraps()
Definition: objects.cpp:465
OperateL2RDoor
void OperateL2RDoor(int pnum, int oi, BOOL sendflag)
Definition: objects.cpp:2099
SHRINE_EERIE
@ SHRINE_EERIE
Definition: enums.h:2888
IS_DOOROPEN
@ IS_DOOROPEN
Definition: enums.h:303
OperateBook
void OperateBook(int pnum, int i)
Definition: objects.cpp:2388
Obj_Light
void Obj_Light(int i, int lr)
Definition: objects.cpp:1467
OBJ_STEELTOME
@ OBJ_STEELTOME
Definition: enums.h:2417
CreateRndItem
void CreateRndItem(int x, int y, BOOL onlygood, BOOL sendmsg, BOOL delta)
Definition: items.cpp:2166
OBJ_DECAP
@ OBJ_DECAP
Definition: enums.h:2396
sgbMouseDown
char sgbMouseDown
Definition: diablo.cpp:43
GetRndObjLoc
void GetRndObjLoc(int randarea, int *xx, int *yy)
Definition: objects.cpp:1277
PlrHasItem
ItemStruct * PlrHasItem(int pnum, int item, int *i)
Definition: towners.cpp:558
setlvlnum
BYTE setlvlnum
Definition: gendung.cpp:58
DTYPE_CATHEDRAL
@ DTYPE_CATHEDRAL
Definition: enums.h:1869
AddTrap
void AddTrap(int i, int ot)
Definition: objects.cpp:1071
OBJ_TORTURE5
@ OBJ_TORTURE5
Definition: enums.h:2369
OBJ_BARREL
@ OBJ_BARREL
Definition: enums.h:2386
WallTrapLocOk
BOOL WallTrapLocOk(int xp, int yp)
Definition: objects.cpp:422
PS_WARR24
@ PS_WARR24
Definition: enums.h:1048
StoryText
int StoryText[3][3]
Definition: objects.cpp:74
FindValidShrine
int FindValidShrine(int i)
Definition: objects.cpp:3505
TEXT_BOOK33
@ TEXT_BOOK33
Definition: enums.h:1804
OperateWeaponRack
void OperateWeaponRack(int pnum, int i, BOOL sendmsg)
Definition: objects.cpp:3670
QuestStruct::_qty
int _qty
Definition: structs.h:976
OperateTrapLvr
void OperateTrapLvr(int i)
Definition: objects.cpp:2666
dSpecial
char dSpecial[MAXDUNX][MAXDUNY]
Definition: gendung.cpp:50
InitRndLocBigObj
void InitRndLocBigObj(int min, int max, int objtype)
Definition: objects.cpp:170
OBJ_TORCHR
@ OBJ_TORCHR
Definition: enums.h:2374
SHRINE_CREEPY
@ SHRINE_CREEPY
Definition: enums.h:2895
OBJ_LAZSTAND
@ OBJ_LAZSTAND
Definition: enums.h:2424
bxadd
int bxadd[8]
Definition: objects.cpp:17
myplr
int myplr
Definition: player.cpp:9
track_repeat_walk
void track_repeat_walk(BOOL rep)
Definition: track.cpp:31
ITYPE_SWORD
@ ITYPE_SWORD
Definition: enums.h:2481
random_
int random_(BYTE idx, int v)
Main RNG function.
Definition: engine.cpp:752
THEME_NONE
@ THEME_NONE
Definition: enums.h:1966
PlayerStruct::_pHitPoints
int _pHitPoints
Definition: structs.h:258
OBJ_L2RDOOR
@ OBJ_L2RDOOR
Definition: enums.h:2372
ICURS_BREAST_PLATE
@ ICURS_BREAST_PLATE
Definition: enums.h:272
MM_TALK
@ MM_TALK
Definition: enums.h:2030
EMSG_SHRINE_RELIGIOUS
@ EMSG_SHRINE_RELIGIOUS
Definition: enums.h:1914
AddVilebook
void AddVilebook(int i)
Definition: objects.cpp:1214
weaponFlag
BOOL weaponFlag
Definition: themes.cpp:13
mem_free_dbg
void mem_free_dbg(void *p)
Multithreaded safe memfree.
Definition: engine.cpp:786
ItemStruct::_iMaxCharges
int _iMaxCharges
Definition: structs.h:134
ITYPE_MISC
@ ITYPE_MISC
Definition: enums.h:2480
PC_WARRIOR
@ PC_WARRIOR
Definition: enums.h:2706
Q_ZHAR
@ Q_ZHAR
Definition: enums.h:2551
PS_WARR68
@ PS_WARR68
Definition: enums.h:1092
GetSuperItemLoc
void GetSuperItemLoc(int x, int y, int *xx, int *yy)
Definition: items.cpp:1081
QUEST_ACTIVE
@ QUEST_ACTIVE
Definition: enums.h:2569
IDI_BLDSTONE
@ IDI_BLDSTONE
Definition: enums.h:2521
QuestStruct::_qvar1
unsigned char _qvar1
Definition: structs.h:980
OBJ_MCIRCLE2
@ OBJ_MCIRCLE2
Definition: enums.h:2414
AddL1Door
void AddL1Door(int i, int x, int y, int ot)
Definition: objects.cpp:972
SpawnSkeleton
BOOL SpawnSkeleton(int ii, int x, int y)
Definition: monster.cpp:5305
OBJ_TNUDEW1
@ OBJ_TNUDEW1
Definition: enums.h:2362
AddDiabObjs
void AddDiabObjs()
Definition: objects.cpp:602
MIS_LIGHTCTRL
@ MIS_LIGHTCTRL
Definition: enums.h:1201
OperatePedistal
void OperatePedistal(int pnum, int i)
Definition: objects.cpp:2742
LoadMapObjects
void LoadMapObjects(BYTE *pMap, int startx, int starty, int x1, int y1, int w, int h, int leveridx)
Definition: objects.cpp:543
Obj_Trap
void Obj_Trap(int i)
Definition: objects.cpp:1634
OBJ_CANDLE1
@ OBJ_CANDLE1
Definition: enums.h:2337
OBJ_CRUX3
@ OBJ_CRUX3
Definition: enums.h:2351
SHRINE_SPOOKY
@ SHRINE_SPOOKY
Definition: enums.h:2893
PC_ROGUE
@ PC_ROGUE
Definition: enums.h:2707
dMonster
int dMonster[MAXDUNX][MAXDUNY]
Definition: gendung.cpp:17
ItemStruct::_iAC
int _iAC
Definition: structs.h:126
SHRINE_MAGICAL2
@ SHRINE_MAGICAL2
Definition: enums.h:2886
InitDiabloMsg
void InitDiabloMsg(char e)
Definition: error.cpp:63
PlaySfxLoc
void PlaySfxLoc(int psfx, int x, int y)
Definition: effects.cpp:1142
DEVILUTION_BEGIN_NAMESPACE
Definition: sha.cpp:10
NetSendCmdParam2
void NetSendCmdParam2(BOOL bHiPri, BYTE bCmd, WORD wParam1, WORD wParam2)
Definition: msg.cpp:710
OperateBookCase
void OperateBookCase(int pnum, int i, BOOL sendmsg)
Definition: objects.cpp:3441
QuestStruct::_qlog
int _qlog
Definition: structs.h:982
ITYPE_AXE
@ ITYPE_AXE
Definition: enums.h:2482
PS_MAGE24
@ PS_MAGE24
Definition: enums.h:835
SyncPedistal
void SyncPedistal(int i)
Definition: objects.cpp:4208
AddMurkyFountain
void AddMurkyFountain(int i)
Definition: objects.cpp:1190
MIS_FARROW
@ MIS_FARROW
Definition: enums.h:1221
TryDisarm
void TryDisarm(int pnum, int i)
Definition: objects.cpp:2776
TEXT_RBLOODY
@ TEXT_RBLOODY
Definition: enums.h:1791
BFLAG_POPULATED
@ BFLAG_POPULATED
Definition: enums.h:1880
OBJ_TORTURE3
@ OBJ_TORTURE3
Definition: enums.h:2367
ObjChangeMap
void ObjChangeMap(int x1, int y1, int x2, int y2)
Definition: objects.cpp:2310
SPL_GUARDIAN
@ SPL_GUARDIAN
Definition: enums.h:2143
OBJ_TNUDEW3
@ OBJ_TNUDEW3
Definition: enums.h:2364
EMSG_SHRINE_CREEPY
@ EMSG_SHRINE_CREEPY
Definition: enums.h:1929
ITYPE_SHIELD
@ ITYPE_SHIELD
Definition: enums.h:2485
ObjSetMini
void ObjSetMini(int x, int y, int v)
Definition: objects.cpp:1842
OperateL3RDoor
void OperateL3RDoor(int pnum, int oi, BOOL sendflag)
Definition: objects.cpp:2181
OBJ_TRAPL
@ OBJ_TRAPL
Definition: enums.h:2382
OBJ_LEVER
@ OBJ_LEVER
Definition: enums.h:2333
dropGoldFlag
BOOL dropGoldFlag
Definition: control.cpp:15
SetBookMsg
void SetBookMsg(int i, int msg)
Definition: objects.cpp:967
OBJ_TEARFTN
@ OBJ_TEARFTN
Definition: enums.h:2411
infoclr
char infoclr
Definition: control.cpp:37
MIS_ARROW
@ MIS_ARROW
Definition: enums.h:1194
SyncL1Doors
void SyncL1Doors(int i)
Definition: objects.cpp:4138
OperateL1RDoor
void OperateL1RDoor(int pnum, int oi, BOOL sendflag)
Definition: objects.cpp:1990
ObjDataStruct::oAnimLen
int oAnimLen
Definition: structs.h:647
IMISC_REJUV
@ IMISC_REJUV
Definition: enums.h:2449
diabquad4x
int diabquad4x
Definition: drlg_l4.cpp:16
SHRINE_MAGICAL
@ SHRINE_MAGICAL
Definition: enums.h:2879
OBJ_CAULDRON
@ OBJ_CAULDRON
Definition: enums.h:2409
AddObject
void AddObject(int ot, int ox, int oy)
Definition: objects.cpp:1326
dPlayer
char dPlayer[MAXDUNX][MAXDUNY]
Definition: gendung.cpp:49
TEXT_BOOK13
@ TEXT_BOOK13
Definition: enums.h:1798
OBJ_BLOODBOOK
@ OBJ_BLOODBOOK
Definition: enums.h:2401
OperateDecap
void OperateDecap(int pnum, int i, BOOL sendmsg)
Definition: objects.cpp:3466
diabquad1x
DEVILUTION_BEGIN_NAMESPACE int diabquad1x
Definition: drlg_l4.cpp:10
OperateL2LDoor
void OperateL2LDoor(int pnum, int oi, BOOL sendflag)
Definition: objects.cpp:2140
dFlags
char dFlags[MAXDUNX][MAXDUNY]
Definition: gendung.cpp:56
SyncL3Doors
void SyncL3Doors(int i)
Definition: objects.cpp:4248
ObjDataStruct::oSolidFlag
BOOL oSolidFlag
Definition: structs.h:649
ITYPE_MACE
@ ITYPE_MACE
Definition: enums.h:2484
ITYPE_LARMOR
@ ITYPE_LARMOR
Definition: enums.h:2486
OperateLever
void OperateLever(int pnum, int i)
Definition: objects.cpp:2360
EMSG_SHRINE_QUIET
@ EMSG_SHRINE_QUIET
Definition: enums.h:1930
OBJ_MUSHPATCH
@ OBJ_MUSHPATCH
Definition: enums.h:2423
QUEST_INIT
@ QUEST_INIT
Definition: enums.h:2568
OperateLazStand
void OperateLazStand(int pnum, int i)
Definition: objects.cpp:3716
NUM_INV_GRID_ELEM
#define NUM_INV_GRID_ELEM
Definition: defs.h:46
OBJ_TRAPR
@ OBJ_TRAPR
Definition: enums.h:2383
drawhpflag
BOOL drawhpflag
Definition: control.cpp:14
AddLazStand
void AddLazStand()
Definition: objects.cpp:705
IS_DOORCLOS
@ IS_DOORCLOS
Definition: enums.h:302
PlayerStruct::WorldY
int WorldY
Definition: structs.h:189
MonsterStruct::_my
int _my
Definition: structs.h:549
byadd
int byadd[8]
Definition: objects.cpp:18
IDI_LAZSTAFF
@ IDI_LAZSTAFF
Definition: enums.h:2534
IMISC_SCROLL
@ IMISC_SCROLL
Definition: enums.h:2452
OperateSkelBook
void OperateSkelBook(int pnum, int i, BOOL sendmsg)
Definition: objects.cpp:3422
SHRINE_HOLY
@ SHRINE_HOLY
Definition: enums.h:2890
setpc_y
int setpc_y
Definition: gendung.cpp:75
qtextflag
BOOLEAN qtextflag
Definition: minitext.cpp:13
OperateL2Door
void OperateL2Door(int pnum, int i, BOOL sendflag)
Definition: objects.cpp:2718
FreeObjectGFX
void FreeObjectGFX()
Definition: objects.cpp:117
SHRINE_ABANDONED
@ SHRINE_ABANDONED
Definition: enums.h:2894
ObjDataStruct::oLightFlag
BOOL oLightFlag
Definition: structs.h:651
TEXT_BLOODY
@ TEXT_BLOODY
Definition: enums.h:1783
TEXT_BOOK21
@ TEXT_BOOK21
Definition: enums.h:1799
ObjTypeConv
DEVILUTION_BEGIN_NAMESPACE int ObjTypeConv[113]
Maps from dun_object_id to object_id.
Definition: objdat.cpp:6
leveltype
BYTE leveltype
Definition: gendung.cpp:39
OBJ_CHEST2
@ OBJ_CHEST2
Definition: enums.h:2335
OBJ_TCHEST1
@ OBJ_TCHEST1
Definition: enums.h:2397
AddL4Goodies
void AddL4Goodies()
Definition: objects.cpp:691
CreateItem
void CreateItem(int uid, int x, int y)
Definition: items.cpp:2143
IMISC_FULLREJUV
@ IMISC_FULLREJUV
Definition: enums.h:2450
AddShrine
void AddShrine(int i)
Definition: objects.cpp:1107
OBJ_WARWEAP
@ OBJ_WARWEAP
Definition: enums.h:2419
SyncCrux
void SyncCrux(int i)
Definition: objects.cpp:4168
OperateStoryBook
void OperateStoryBook(int pnum, int i)
Definition: objects.cpp:3706
OBJ_BOOKCANDLE
@ OBJ_BOOKCANDLE
Definition: enums.h:2394
AddHookedBodies
void AddHookedBodies(int freq)
Definition: objects.cpp:649
diabquad3y
int diabquad3y
Definition: drlg_l4.cpp:13
OBJ_PURIFYINGFTN
@ OBJ_PURIFYINGFTN
Definition: enums.h:2405
dDead
char dDead[MAXDUNX][MAXDUNY]
Definition: gendung.cpp:21
IMISC_MANA
@ IMISC_MANA
Definition: enums.h:2437
NUM_SHRINETYPE
@ NUM_SHRINETYPE
Definition: enums.h:2901
plr
PlayerStruct plr[MAX_PLRS]
Definition: player.cpp:10
OBJ_TCHEST3
@ OBJ_TCHEST3
Definition: enums.h:2399
TEXT_BLOODWAR
@ TEXT_BLOODWAR
Definition: enums.h:1785
MIS_FIREBOLT
@ MIS_FIREBOLT
Definition: enums.h:1195
MAX_SPELLS
#define MAX_SPELLS
Definition: defs.h:22
PC_SORCERER
@ PC_SORCERER
Definition: enums.h:2708
IS_BARLFIRE
@ IS_BARLFIRE
Definition: enums.h:297
LS_PUDDLE
@ LS_PUDDLE
Definition: enums.h:408
Q_BLOOD
@ Q_BLOOD
Definition: enums.h:2557
EMSG_BONECHAMB
@ EMSG_BONECHAMB
Definition: enums.h:1939
OBJ_CRUX1
@ OBJ_CRUX1
Definition: enums.h:2349
SyncBreakObj
void SyncBreakObj(int pnum, int oi)
Definition: objects.cpp:4132
SHRINE_FASCINATING
@ SHRINE_FASCINATING
Definition: enums.h:2884
ObjectStruct
Definition: structs.h:657
DMAXX
#define DMAXX
Definition: defs.h:7
ModifyPlrVit
void ModifyPlrVit(int p, int l)
Definition: player.cpp:3938
IS_MAGIC
@ IS_MAGIC
Definition: enums.h:346
ItemMiscIdIdx
int ItemMiscIdIdx(int imiscid)
Definition: objects.cpp:2806
OBJ_BCROSS
@ OBJ_BCROSS
Definition: enums.h:2355
SHRINE_RELIGIOUS
@ SHRINE_RELIGIOUS
Definition: enums.h:2881
IS_ISCROL
@ IS_ISCROL
Definition: enums.h:340
ActivateTrapLine
void ActivateTrapLine(int ttype, int tid)
Definition: objects.cpp:1576
ItemStruct::_iMaxDam
int _iMaxDam
Definition: structs.h:125
PlayerStruct::_pDexterity
int _pDexterity
Definition: structs.h:249
OBJ_BLINDBOOK
@ OBJ_BLINDBOOK
Definition: enums.h:2400
TEXT_BOOK31
@ TEXT_BOOK31
Definition: enums.h:1802