Devilution
Diablo devolved - magic behind the 1996 computer game
drlg_l4.cpp
Go to the documentation of this file.
1 
6 #include "all.h"
7 
9 
18 #ifndef SPAWN
19 BOOL hallok[20];
20 int l4holdx;
21 int l4holdy;
22 int SP4x1;
23 int SP4x2;
24 int SP4y1;
25 int SP4y2;
26 BYTE L4dungeon[80][80];
27 BYTE dung[20][20];
28 //int dword_52A4DC;
29 
30 const BYTE L4ConvTbl[16] = { 30, 6, 1, 6, 2, 6, 6, 6, 9, 6, 1, 6, 2, 6, 3, 6 };
31 const BYTE L4USTAIRS[42] = {
32  4,
33  5,
34  6,
35  6,
36  6,
37  6,
38  6,
39  6,
40  6,
41  6,
42  6,
43  6,
44  6,
45  6,
46  6,
47  6,
48  6,
49  6,
50  6,
51  6,
52  6,
53  6,
54  0,
55  0,
56  0,
57  0,
58  36,
59  38,
60  35,
61  0,
62  37,
63  34,
64  33,
65  32,
66  0,
67  0,
68  31,
69  0,
70  0,
71  0,
72  0,
73  0
74 };
75 const BYTE L4TWARP[42] = {
76  4,
77  5,
78  6,
79  6,
80  6,
81  6,
82  6,
83  6,
84  6,
85  6,
86  6,
87  6,
88  6,
89  6,
90  6,
91  6,
92  6,
93  6,
94  6,
95  6,
96  6,
97  6,
98  0,
99  0,
100  0,
101  0,
102  134,
103  136,
104  133,
105  0,
106  135,
107  132,
108  131,
109  130,
110  0,
111  0,
112  129,
113  0,
114  0,
115  0,
116  0,
117  0
118 };
119 const BYTE L4DSTAIRS[52] = {
120  5,
121  5,
122  6,
123  6,
124  6,
125  6,
126  6,
127  6,
128  6,
129  6,
130  6,
131  6,
132  6,
133  6,
134  6,
135  6,
136  6,
137  6,
138  6,
139  6,
140  6,
141  6,
142  6,
143  6,
144  6,
145  6,
146  6,
147  0,
148  0,
149  0,
150  0,
151  0,
152  0,
153  0,
154  45,
155  41,
156  0,
157  0,
158  44,
159  43,
160  40,
161  0,
162  0,
163  46,
164  42,
165  39,
166  0,
167  0,
168  0,
169  0,
170  0,
171  0
172 };
173 const BYTE L4PENTA[52] = {
174  5,
175  5,
176  6,
177  6,
178  6,
179  6,
180  6,
181  6,
182  6,
183  6,
184  6,
185  6,
186  6,
187  6,
188  6,
189  6,
190  6,
191  6,
192  6,
193  6,
194  6,
195  6,
196  6,
197  6,
198  6,
199  6,
200  6,
201  0,
202  0,
203  0,
204  0,
205  0,
206  0,
207  98,
208  100,
209  103,
210  0,
211  0,
212  99,
213  102,
214  105,
215  0,
216  0,
217  101,
218  104,
219  106,
220  0,
221  0,
222  0,
223  0,
224  0,
225  0
226 };
227 const BYTE L4PENTA2[52] = {
228  5,
229  5,
230  6,
231  6,
232  6,
233  6,
234  6,
235  6,
236  6,
237  6,
238  6,
239  6,
240  6,
241  6,
242  6,
243  6,
244  6,
245  6,
246  6,
247  6,
248  6,
249  6,
250  6,
251  6,
252  6,
253  6,
254  6,
255  0,
256  0,
257  0,
258  0,
259  0,
260  0,
261  107,
262  109,
263  112,
264  0,
265  0,
266  108,
267  111,
268  114,
269  0,
270  0,
271  110,
272  113,
273  115,
274  0,
275  0,
276  0,
277  0,
278  0,
279  0
280 };
281 const BYTE L4BTYPES[140] = {
282  0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
283  10, 11, 12, 13, 14, 15, 16, 17, 0, 0,
284  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
285  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
286  0, 0, 0, 0, 0, 0, 0, 0, 0, 6,
287  6, 6, 0, 0, 0, 0, 0, 0, 0, 0,
288  0, 1, 2, 1, 2, 1, 2, 1, 1, 2,
289  2, 0, 0, 0, 0, 0, 0, 15, 16, 9,
290  12, 4, 5, 7, 0, 0, 0, 0, 0, 0,
291  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
292  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
293  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
294  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
295  0, 0, 0, 0, 0, 0, 0, 0, 0, 0
296 };
297 
298 static void DRLG_L4Shadows()
299 {
300  int x, y;
301  BOOL okflag;
302 
303  for (y = 1; y < DMAXY; y++) {
304  for (x = 1; x < DMAXY; x++) {
305  okflag = FALSE;
306  if (dungeon[x][y] == 3) {
307  okflag = TRUE;
308  }
309  if (dungeon[x][y] == 4) {
310  okflag = TRUE;
311  }
312  if (dungeon[x][y] == 8) {
313  okflag = TRUE;
314  }
315  if (dungeon[x][y] == 15) {
316  okflag = TRUE;
317  }
318  if (!okflag) {
319  continue;
320  }
321  if (dungeon[x - 1][y] == 6) {
322  dungeon[x - 1][y] = 47;
323  }
324  if (dungeon[x - 1][y - 1] == 6) {
325  dungeon[x - 1][y - 1] = 48;
326  }
327  }
328  }
329 }
330 
331 static void InitL4Dungeon()
332 {
333  int i, j;
334 
335  memset(dung, 0, sizeof(dung));
336  memset(L4dungeon, 0, sizeof(L4dungeon));
337 
338  for (j = 0; j < DMAXY; j++) {
339  for (i = 0; i < DMAXX; i++) {
340  dungeon[i][j] = 30;
341  dflags[i][j] = 0;
342  }
343  }
344 }
345 
347 {
348  setloadflag = FALSE;
349  if (QuestStatus(Q_WARLORD)) {
350  pSetPiece = LoadFileInMem("Levels\\L4Data\\Warlord.DUN", NULL);
351  setloadflag = TRUE;
352  }
353  if (currlevel == 15 && gbMaxPlayers != 1) {
354  pSetPiece = LoadFileInMem("Levels\\L4Data\\Vile1.DUN", NULL);
355  setloadflag = TRUE;
356  }
357 }
358 
360 {
362 }
363 
364 void DRLG_L4SetSPRoom(int rx1, int ry1)
365 {
366  int rw, rh, i, j;
367  BYTE *sp;
368 
369  rw = pSetPiece[0];
370  rh = pSetPiece[2];
371 
372  setpc_x = rx1;
373  setpc_y = ry1;
374  setpc_w = rw;
375  setpc_h = rh;
376 
377  sp = &pSetPiece[4];
378 
379  for (j = 0; j < rh; j++) {
380  for (i = 0; i < rw; i++) {
381  if (*sp != 0) {
382  dungeon[i + rx1][j + ry1] = *sp;
383  dflags[i + rx1][j + ry1] |= DLRG_PROTECTED;
384  } else {
385  dungeon[i + rx1][j + ry1] = 6;
386  }
387  sp += 2;
388  }
389  }
390 }
391 
392 static void L4makeDmt()
393 {
394  int i, j, idx, val, dmtx, dmty;
395 
396  for (j = 0, dmty = 1; dmty <= 77; j++, dmty += 2) {
397  for (i = 0, dmtx = 1; dmtx <= 77; i++, dmtx += 2) {
398  val = 8 * L4dungeon[dmtx + 1][dmty + 1]
399  + 4 * L4dungeon[dmtx][dmty + 1]
400  + 2 * L4dungeon[dmtx + 1][dmty]
401  + L4dungeon[dmtx][dmty];
402  idx = L4ConvTbl[val];
403  dungeon[i][j] = idx;
404  }
405  }
406 }
407 
408 static int L4HWallOk(int i, int j)
409 {
410  int x;
411  BOOL wallok;
412 
413  for (x = 1; dungeon[i + x][j] == 6; x++) {
414  if (dflags[i + x][j] != 0) {
415  break;
416  }
417  if (dungeon[i + x][j - 1] != 6) {
418  break;
419  }
420  if (dungeon[i + x][j + 1] != 6) {
421  break;
422  }
423  }
424 
425  wallok = FALSE;
426 
427  if (dungeon[i + x][j] == 10) {
428  wallok = TRUE;
429  }
430  if (dungeon[i + x][j] == 12) {
431  wallok = TRUE;
432  }
433  if (dungeon[i + x][j] == 13) {
434  wallok = TRUE;
435  }
436  if (dungeon[i + x][j] == 15) {
437  wallok = TRUE;
438  }
439  if (dungeon[i + x][j] == 16) {
440  wallok = TRUE;
441  }
442  if (dungeon[i + x][j] == 21) {
443  wallok = TRUE;
444  }
445  if (dungeon[i + x][j] == 22) {
446  wallok = TRUE;
447  }
448  if (x <= 3) {
449  wallok = FALSE;
450  }
451 
452  if (wallok) {
453  return x;
454  } else {
455  return -1;
456  }
457 }
458 
459 static int L4VWallOk(int i, int j)
460 {
461  int y;
462  BOOL wallok;
463 
464  for (y = 1; dungeon[i][j + y] == 6; y++) {
465  if (dflags[i][j + y] != 0) {
466  break;
467  }
468  if (dungeon[i - 1][j + y] != 6) {
469  break;
470  }
471  if (dungeon[i + 1][j + y] != 6) {
472  break;
473  }
474  }
475 
476  wallok = FALSE;
477 
478  if (dungeon[i][j + y] == 8) {
479  wallok = TRUE;
480  }
481  if (dungeon[i][j + y] == 9) {
482  wallok = TRUE;
483  }
484  if (dungeon[i][j + y] == 11) {
485  wallok = TRUE;
486  }
487  if (dungeon[i][j + y] == 14) {
488  wallok = TRUE;
489  }
490  if (dungeon[i][j + y] == 15) {
491  wallok = TRUE;
492  }
493  if (dungeon[i][j + y] == 16) {
494  wallok = TRUE;
495  }
496  if (dungeon[i][j + y] == 21) {
497  wallok = TRUE;
498  }
499  if (dungeon[i][j + y] == 23) {
500  wallok = TRUE;
501  }
502  if (y <= 3) {
503  wallok = FALSE;
504  }
505 
506  if (wallok) {
507  return y;
508  } else {
509  return -1;
510  }
511 }
512 
513 static void L4HorizWall(int i, int j, int dx)
514 {
515  int xx;
516 
517  if (dungeon[i][j] == 13) {
518  dungeon[i][j] = 17;
519  }
520  if (dungeon[i][j] == 16) {
521  dungeon[i][j] = 11;
522  }
523  if (dungeon[i][j] == 12) {
524  dungeon[i][j] = 14;
525  }
526 
527  for (xx = 1; xx < dx; xx++) {
528  dungeon[i + xx][j] = 2;
529  }
530 
531  if (dungeon[i + dx][j] == 15) {
532  dungeon[i + dx][j] = 14;
533  }
534  if (dungeon[i + dx][j] == 10) {
535  dungeon[i + dx][j] = 17;
536  }
537  if (dungeon[i + dx][j] == 21) {
538  dungeon[i + dx][j] = 23;
539  }
540  if (dungeon[i + dx][j] == 22) {
541  dungeon[i + dx][j] = 29;
542  }
543 
544  xx = random_(0, dx - 3) + 1;
545  dungeon[i + xx][j] = 57;
546  dungeon[i + xx + 2][j] = 56;
547  dungeon[i + xx + 1][j] = 60;
548 
549  if (dungeon[i + xx][j - 1] == 6) {
550  dungeon[i + xx][j - 1] = 58;
551  }
552  if (dungeon[i + xx + 1][j - 1] == 6) {
553  dungeon[i + xx + 1][j - 1] = 59;
554  }
555 }
556 
557 static void L4VertWall(int i, int j, int dy)
558 {
559  int yy;
560 
561  if (dungeon[i][j] == 14) {
562  dungeon[i][j] = 17;
563  }
564  if (dungeon[i][j] == 8) {
565  dungeon[i][j] = 9;
566  }
567  if (dungeon[i][j] == 15) {
568  dungeon[i][j] = 10;
569  }
570 
571  for (yy = 1; yy < dy; yy++) {
572  dungeon[i][j + yy] = 1;
573  }
574 
575  if (dungeon[i][j + dy] == 11) {
576  dungeon[i][j + dy] = 17;
577  }
578  if (dungeon[i][j + dy] == 9) {
579  dungeon[i][j + dy] = 10;
580  }
581  if (dungeon[i][j + dy] == 16) {
582  dungeon[i][j + dy] = 13;
583  }
584  if (dungeon[i][j + dy] == 21) {
585  dungeon[i][j + dy] = 22;
586  }
587  if (dungeon[i][j + dy] == 23) {
588  dungeon[i][j + dy] = 29;
589  }
590 
591  yy = random_(0, dy - 3) + 1;
592  dungeon[i][j + yy] = 53;
593  dungeon[i][j + yy + 2] = 52;
594  dungeon[i][j + yy + 1] = 6;
595 
596  if (dungeon[i - 1][j + yy] == 6) {
597  dungeon[i - 1][j + yy] = 54;
598  }
599  if (dungeon[i - 1][j + yy - 1] == 6) {
600  dungeon[i - 1][j + yy - 1] = 55;
601  }
602 }
603 
604 static void L4AddWall()
605 {
606  int i, j, x, y;
607 
608  for (j = 0; j < DMAXY; j++) {
609  for (i = 0; i < DMAXX; i++) {
610  if (dflags[i][j] != 0) {
611  continue;
612  }
613  if (dungeon[i][j] == 10 && random_(0, 100) < 100) {
614  x = L4HWallOk(i, j);
615  if (x != -1) {
616  L4HorizWall(i, j, x);
617  }
618  }
619  if (dungeon[i][j] == 12 && random_(0, 100) < 100) {
620  x = L4HWallOk(i, j);
621  if (x != -1) {
622  L4HorizWall(i, j, x);
623  }
624  }
625  if (dungeon[i][j] == 13 && random_(0, 100) < 100) {
626  x = L4HWallOk(i, j);
627  if (x != -1) {
628  L4HorizWall(i, j, x);
629  }
630  }
631  if (dungeon[i][j] == 15 && random_(0, 100) < 100) {
632  x = L4HWallOk(i, j);
633  if (x != -1) {
634  L4HorizWall(i, j, x);
635  }
636  }
637  if (dungeon[i][j] == 16 && random_(0, 100) < 100) {
638  x = L4HWallOk(i, j);
639  if (x != -1) {
640  L4HorizWall(i, j, x);
641  }
642  }
643  if (dungeon[i][j] == 21 && random_(0, 100) < 100) {
644  x = L4HWallOk(i, j);
645  if (x != -1) {
646  L4HorizWall(i, j, x);
647  }
648  }
649  if (dungeon[i][j] == 22 && random_(0, 100) < 100) {
650  x = L4HWallOk(i, j);
651  if (x != -1) {
652  L4HorizWall(i, j, x);
653  }
654  }
655  if (dungeon[i][j] == 8 && random_(0, 100) < 100) {
656  y = L4VWallOk(i, j);
657  if (y != -1) {
658  L4VertWall(i, j, y);
659  }
660  }
661  if (dungeon[i][j] == 9 && random_(0, 100) < 100) {
662  y = L4VWallOk(i, j);
663  if (y != -1) {
664  L4VertWall(i, j, y);
665  }
666  }
667  if (dungeon[i][j] == 11 && random_(0, 100) < 100) {
668  y = L4VWallOk(i, j);
669  if (y != -1) {
670  L4VertWall(i, j, y);
671  }
672  }
673  if (dungeon[i][j] == 14 && random_(0, 100) < 100) {
674  y = L4VWallOk(i, j);
675  if (y != -1) {
676  L4VertWall(i, j, y);
677  }
678  }
679  if (dungeon[i][j] == 15 && random_(0, 100) < 100) {
680  y = L4VWallOk(i, j);
681  if (y != -1) {
682  L4VertWall(i, j, y);
683  }
684  }
685  if (dungeon[i][j] == 16 && random_(0, 100) < 100) {
686  y = L4VWallOk(i, j);
687  if (y != -1) {
688  L4VertWall(i, j, y);
689  }
690  }
691  if (dungeon[i][j] == 21 && random_(0, 100) < 100) {
692  y = L4VWallOk(i, j);
693  if (y != -1) {
694  L4VertWall(i, j, y);
695  }
696  }
697  if (dungeon[i][j] == 23 && random_(0, 100) < 100) {
698  y = L4VWallOk(i, j);
699  if (y != -1) {
700  L4VertWall(i, j, y);
701  }
702  }
703  }
704  }
705 }
706 
707 static void L4tileFix()
708 {
709  int i, j;
710 
711  for (j = 0; j < DMAXY; j++) {
712  for (i = 0; i < DMAXX; i++) {
713  if (dungeon[i][j] == 2 && dungeon[i + 1][j] == 6)
714  dungeon[i + 1][j] = 5;
715  if (dungeon[i][j] == 2 && dungeon[i + 1][j] == 1)
716  dungeon[i + 1][j] = 13;
717  if (dungeon[i][j] == 1 && dungeon[i][j + 1] == 2)
718  dungeon[i][j + 1] = 14;
719  }
720  }
721  for (j = 0; j < DMAXY; j++) {
722  for (i = 0; i < DMAXX; i++) {
723  if (dungeon[i][j] == 2 && dungeon[i + 1][j] == 6)
724  dungeon[i + 1][j] = 2;
725  if (dungeon[i][j] == 2 && dungeon[i + 1][j] == 9)
726  dungeon[i + 1][j] = 11;
727  if (dungeon[i][j] == 9 && dungeon[i + 1][j] == 6)
728  dungeon[i + 1][j] = 12;
729  if (dungeon[i][j] == 14 && dungeon[i + 1][j] == 1)
730  dungeon[i + 1][j] = 13;
731  if (dungeon[i][j] == 6 && dungeon[i + 1][j] == 14)
732  dungeon[i + 1][j] = 15;
733  if (dungeon[i][j] == 6 && dungeon[i][j + 1] == 13)
734  dungeon[i][j + 1] = 16;
735  if (dungeon[i][j] == 1 && dungeon[i][j + 1] == 9)
736  dungeon[i][j + 1] = 10;
737  if (dungeon[i][j] == 6 && dungeon[i][j - 1] == 1)
738  dungeon[i][j - 1] = 1;
739  }
740  }
741  for (j = 0; j < DMAXY; j++) {
742  for (i = 0; i < DMAXX; i++) {
743  if (dungeon[i][j] == 13 && dungeon[i][j + 1] == 30)
744  dungeon[i][j + 1] = 27;
745  if (dungeon[i][j] == 27 && dungeon[i + 1][j] == 30)
746  dungeon[i + 1][j] = 19;
747  if (dungeon[i][j] == 1 && dungeon[i][j + 1] == 30)
748  dungeon[i][j + 1] = 27;
749  if (dungeon[i][j] == 27 && dungeon[i + 1][j] == 1)
750  dungeon[i + 1][j] = 16;
751  if (dungeon[i][j] == 19 && dungeon[i + 1][j] == 27)
752  dungeon[i + 1][j] = 26;
753  if (dungeon[i][j] == 27 && dungeon[i + 1][j] == 30)
754  dungeon[i + 1][j] = 19;
755  if (dungeon[i][j] == 2 && dungeon[i + 1][j] == 15)
756  dungeon[i + 1][j] = 14;
757  if (dungeon[i][j] == 14 && dungeon[i + 1][j] == 15)
758  dungeon[i + 1][j] = 14;
759  if (dungeon[i][j] == 22 && dungeon[i + 1][j] == 1)
760  dungeon[i + 1][j] = 16;
761  if (dungeon[i][j] == 27 && dungeon[i + 1][j] == 1)
762  dungeon[i + 1][j] = 16;
763  if (dungeon[i][j] == 6 && dungeon[i + 1][j] == 27 && dungeon[i + 1][j + 1] != 0) /* check */
764  dungeon[i + 1][j] = 22;
765  if (dungeon[i][j] == 22 && dungeon[i + 1][j] == 30)
766  dungeon[i + 1][j] = 19;
767  if (dungeon[i][j] == 21 && dungeon[i + 1][j] == 1 && dungeon[i + 1][j - 1] == 1)
768  dungeon[i + 1][j] = 13;
769  if (dungeon[i][j] == 14 && dungeon[i + 1][j] == 30 && dungeon[i][j + 1] == 6)
770  dungeon[i + 1][j] = 28;
771  if (dungeon[i][j] == 16 && dungeon[i + 1][j] == 6 && dungeon[i][j + 1] == 30)
772  dungeon[i][j + 1] = 27;
773  if (dungeon[i][j] == 16 && dungeon[i][j + 1] == 30 && dungeon[i + 1][j + 1] == 30)
774  dungeon[i][j + 1] = 27;
775  if (dungeon[i][j] == 6 && dungeon[i + 1][j] == 30 && dungeon[i + 1][j - 1] == 6)
776  dungeon[i + 1][j] = 21;
777  if (dungeon[i][j] == 2 && dungeon[i + 1][j] == 27 && dungeon[i + 1][j + 1] == 9)
778  dungeon[i + 1][j] = 29;
779  if (dungeon[i][j] == 9 && dungeon[i + 1][j] == 15)
780  dungeon[i + 1][j] = 14;
781  if (dungeon[i][j] == 15 && dungeon[i + 1][j] == 27 && dungeon[i + 1][j + 1] == 2)
782  dungeon[i + 1][j] = 29;
783  if (dungeon[i][j] == 19 && dungeon[i + 1][j] == 18)
784  dungeon[i + 1][j] = 24;
785  if (dungeon[i][j] == 9 && dungeon[i + 1][j] == 15)
786  dungeon[i + 1][j] = 14;
787  if (dungeon[i][j] == 19 && dungeon[i + 1][j] == 19 && dungeon[i + 1][j - 1] == 30)
788  dungeon[i + 1][j] = 24;
789  if (dungeon[i][j] == 24 && dungeon[i][j - 1] == 30 && dungeon[i][j - 2] == 6)
790  dungeon[i][j - 1] = 21;
791  if (dungeon[i][j] == 2 && dungeon[i + 1][j] == 30)
792  dungeon[i + 1][j] = 28;
793  if (dungeon[i][j] == 15 && dungeon[i + 1][j] == 30)
794  dungeon[i + 1][j] = 28;
795  if (dungeon[i][j] == 28 && dungeon[i][j + 1] == 30)
796  dungeon[i][j + 1] = 18;
797  if (dungeon[i][j] == 28 && dungeon[i][j + 1] == 2)
798  dungeon[i][j + 1] = 15;
799  if (dungeon[i][j] == 19 && dungeon[i + 2][j] == 2 && dungeon[i + 1][j - 1] == 18 && dungeon[i + 1][j + 1] == 1)
800  dungeon[i + 1][j] = 17;
801  if (dungeon[i][j] == 19 && dungeon[i + 2][j] == 2 && dungeon[i + 1][j - 1] == 22 && dungeon[i + 1][j + 1] == 1)
802  dungeon[i + 1][j] = 17;
803  if (dungeon[i][j] == 19 && dungeon[i + 2][j] == 2 && dungeon[i + 1][j - 1] == 18 && dungeon[i + 1][j + 1] == 13)
804  dungeon[i + 1][j] = 17;
805  if (dungeon[i][j] == 21 && dungeon[i + 2][j] == 2 && dungeon[i + 1][j - 1] == 18 && dungeon[i + 1][j + 1] == 1)
806  dungeon[i + 1][j] = 17;
807  if (dungeon[i][j] == 21 && dungeon[i + 1][j + 1] == 1 && dungeon[i + 1][j - 1] == 22 && dungeon[i + 2][j] == 3)
808  dungeon[i + 1][j] = 17;
809  if (dungeon[i][j] == 15 && dungeon[i + 1][j] == 28 && dungeon[i + 2][j] == 30 && dungeon[i + 1][j - 1] == 6)
810  dungeon[i + 1][j] = 23;
811  if (dungeon[i][j] == 14 && dungeon[i + 1][j] == 28 && dungeon[i + 2][j] == 1)
812  dungeon[i + 1][j] = 23;
813  if (dungeon[i][j] == 15 && dungeon[i + 1][j] == 27 && dungeon[i + 1][j + 1] == 30)
814  dungeon[i + 1][j] = 29;
815  if (dungeon[i][j] == 28 && dungeon[i][j + 1] == 9)
816  dungeon[i][j + 1] = 15;
817  if (dungeon[i][j] == 21 && dungeon[i + 1][j - 1] == 21)
818  dungeon[i + 1][j] = 24;
819  if (dungeon[i][j] == 2 && dungeon[i + 1][j] == 27 && dungeon[i + 1][j + 1] == 30)
820  dungeon[i + 1][j] = 29;
821  if (dungeon[i][j] == 2 && dungeon[i + 1][j] == 18)
822  dungeon[i + 1][j] = 25;
823  if (dungeon[i][j] == 21 && dungeon[i + 1][j] == 9 && dungeon[i + 2][j] == 2)
824  dungeon[i + 1][j] = 11;
825  if (dungeon[i][j] == 19 && dungeon[i + 1][j] == 10)
826  dungeon[i + 1][j] = 17;
827  if (dungeon[i][j] == 15 && dungeon[i][j + 1] == 3)
828  dungeon[i][j + 1] = 4;
829  if (dungeon[i][j] == 22 && dungeon[i][j + 1] == 9)
830  dungeon[i][j + 1] = 15;
831  if (dungeon[i][j] == 18 && dungeon[i][j + 1] == 30)
832  dungeon[i][j + 1] = 18;
833  if (dungeon[i][j] == 24 && dungeon[i - 1][j] == 30)
834  dungeon[i - 1][j] = 19;
835  if (dungeon[i][j] == 21 && dungeon[i][j + 1] == 2)
836  dungeon[i][j + 1] = 15;
837  if (dungeon[i][j] == 21 && dungeon[i][j + 1] == 9)
838  dungeon[i][j + 1] = 10;
839  if (dungeon[i][j] == 22 && dungeon[i][j + 1] == 30)
840  dungeon[i][j + 1] = 18;
841  if (dungeon[i][j] == 21 && dungeon[i][j + 1] == 30)
842  dungeon[i][j + 1] = 18;
843  if (dungeon[i][j] == 16 && dungeon[i][j + 1] == 2)
844  dungeon[i][j + 1] = 15;
845  if (dungeon[i][j] == 13 && dungeon[i][j + 1] == 2)
846  dungeon[i][j + 1] = 15;
847  if (dungeon[i][j] == 22 && dungeon[i][j + 1] == 2)
848  dungeon[i][j + 1] = 15;
849  if (dungeon[i][j] == 21 && dungeon[i + 1][j] == 18 && dungeon[i + 2][j] == 30)
850  dungeon[i + 1][j] = 24;
851  if (dungeon[i][j] == 21 && dungeon[i + 1][j] == 9 && dungeon[i + 1][j + 1] == 1)
852  dungeon[i + 1][j] = 16;
853  if (dungeon[i][j] == 2 && dungeon[i + 1][j] == 27 && dungeon[i + 1][j + 1] == 2)
854  dungeon[i + 1][j] = 29;
855  if (dungeon[i][j] == 23 && dungeon[i][j + 1] == 2)
856  dungeon[i][j + 1] = 15;
857  if (dungeon[i][j] == 23 && dungeon[i][j + 1] == 9)
858  dungeon[i][j + 1] = 15;
859  if (dungeon[i][j] == 25 && dungeon[i][j + 1] == 2)
860  dungeon[i][j + 1] = 15;
861  if (dungeon[i][j] == 22 && dungeon[i + 1][j] == 9)
862  dungeon[i + 1][j] = 11;
863  if (dungeon[i][j] == 23 && dungeon[i + 1][j] == 9)
864  dungeon[i + 1][j] = 11;
865  if (dungeon[i][j] == 15 && dungeon[i + 1][j] == 1)
866  dungeon[i + 1][j] = 16;
867  if (dungeon[i][j] == 11 && dungeon[i + 1][j] == 15)
868  dungeon[i + 1][j] = 14;
869  if (dungeon[i][j] == 23 && dungeon[i + 1][j] == 1)
870  dungeon[i + 1][j] = 16;
871  if (dungeon[i][j] == 21 && dungeon[i + 1][j] == 27)
872  dungeon[i + 1][j] = 26;
873  if (dungeon[i][j] == 21 && dungeon[i + 1][j] == 18)
874  dungeon[i + 1][j] = 24;
875  if (dungeon[i][j] == 26 && dungeon[i + 1][j] == 1)
876  dungeon[i + 1][j] = 16;
877  if (dungeon[i][j] == 29 && dungeon[i + 1][j] == 1)
878  dungeon[i + 1][j] = 16;
879  if (dungeon[i][j] == 29 && dungeon[i][j + 1] == 2)
880  dungeon[i][j + 1] = 15;
881  if (dungeon[i][j] == 1 && dungeon[i][j - 1] == 15)
882  dungeon[i][j - 1] = 10;
883  if (dungeon[i][j] == 18 && dungeon[i][j + 1] == 2)
884  dungeon[i][j + 1] = 15;
885  if (dungeon[i][j] == 23 && dungeon[i][j + 1] == 30)
886  dungeon[i][j + 1] = 18;
887  if (dungeon[i][j] == 18 && dungeon[i][j + 1] == 9)
888  dungeon[i][j + 1] = 10;
889  if (dungeon[i][j] == 14 && dungeon[i + 1][j] == 30 && dungeon[i + 1][j + 1] == 30)
890  dungeon[i + 1][j] = 23;
891  if (dungeon[i][j] == 2 && dungeon[i + 1][j] == 28 && dungeon[i + 1][j - 1] == 6)
892  dungeon[i + 1][j] = 23;
893  if (dungeon[i][j] == 23 && dungeon[i + 1][j] == 18 && dungeon[i][j - 1] == 6)
894  dungeon[i + 1][j] = 24;
895  if (dungeon[i][j] == 14 && dungeon[i + 1][j] == 23 && dungeon[i + 2][j] == 30)
896  dungeon[i + 1][j] = 28;
897  if (dungeon[i][j] == 14 && dungeon[i + 1][j] == 28 && dungeon[i + 2][j] == 30 && dungeon[i + 1][j - 1] == 6)
898  dungeon[i + 1][j] = 23;
899  if (dungeon[i][j] == 23 && dungeon[i + 1][j] == 30)
900  dungeon[i + 1][j] = 19;
901  if (dungeon[i][j] == 29 && dungeon[i + 1][j] == 30)
902  dungeon[i + 1][j] = 19;
903  if (dungeon[i][j] == 29 && dungeon[i][j + 1] == 30)
904  dungeon[i][j + 1] = 18;
905  if (dungeon[i][j] == 19 && dungeon[i + 1][j] == 30)
906  dungeon[i + 1][j] = 19;
907  if (dungeon[i][j] == 21 && dungeon[i + 1][j] == 30)
908  dungeon[i + 1][j] = 19;
909  if (dungeon[i][j] == 26 && dungeon[i + 1][j] == 30)
910  dungeon[i + 1][j] = 19;
911  if (dungeon[i][j] == 16 && dungeon[i][j + 1] == 30)
912  dungeon[i][j + 1] = 18;
913  if (dungeon[i][j] == 13 && dungeon[i][j + 1] == 9)
914  dungeon[i][j + 1] = 10;
915  if (dungeon[i][j] == 25 && dungeon[i][j + 1] == 30)
916  dungeon[i][j + 1] = 18;
917  if (dungeon[i][j] == 18 && dungeon[i][j + 1] == 2)
918  dungeon[i][j + 1] = 15;
919  if (dungeon[i][j] == 11 && dungeon[i + 1][j] == 3)
920  dungeon[i + 1][j] = 5;
921  if (dungeon[i][j] == 19 && dungeon[i + 1][j] == 9)
922  dungeon[i + 1][j] = 11;
923  if (dungeon[i][j] == 19 && dungeon[i + 1][j] == 1)
924  dungeon[i + 1][j] = 13;
925  if (dungeon[i][j] == 19 && dungeon[i + 1][j] == 13 && dungeon[i + 1][j - 1] == 6)
926  dungeon[i + 1][j] = 16;
927  }
928  }
929  for (j = 0; j < DMAXY; j++) {
930  for (i = 0; i < DMAXX; i++) {
931  if (dungeon[i][j] == 21 && dungeon[i][j + 1] == 24 && dungeon[i][j + 2] == 1)
932  dungeon[i][j + 1] = 17;
933  if (dungeon[i][j] == 15 && dungeon[i + 1][j + 1] == 9 && dungeon[i + 1][j - 1] == 1 && dungeon[i + 2][j] == 16)
934  dungeon[i + 1][j] = 29;
935  if (dungeon[i][j] == 2 && dungeon[i - 1][j] == 6)
936  dungeon[i - 1][j] = 8;
937  if (dungeon[i][j] == 1 && dungeon[i][j - 1] == 6)
938  dungeon[i][j - 1] = 7;
939  if (dungeon[i][j] == 6 && dungeon[i + 1][j] == 15 && dungeon[i + 1][j + 1] == 4)
940  dungeon[i + 1][j] = 10;
941  if (dungeon[i][j] == 1 && dungeon[i][j + 1] == 3)
942  dungeon[i][j + 1] = 4;
943  if (dungeon[i][j] == 1 && dungeon[i][j + 1] == 6)
944  dungeon[i][j + 1] = 4;
945  if (dungeon[i][j] == 9 && dungeon[i][j + 1] == 3)
946  dungeon[i][j + 1] = 4;
947  if (dungeon[i][j] == 10 && dungeon[i][j + 1] == 3)
948  dungeon[i][j + 1] = 4;
949  if (dungeon[i][j] == 13 && dungeon[i][j + 1] == 3)
950  dungeon[i][j + 1] = 4;
951  if (dungeon[i][j] == 1 && dungeon[i][j + 1] == 5)
952  dungeon[i][j + 1] = 12;
953  if (dungeon[i][j] == 1 && dungeon[i][j + 1] == 16)
954  dungeon[i][j + 1] = 13;
955  if (dungeon[i][j] == 6 && dungeon[i][j + 1] == 13)
956  dungeon[i][j + 1] = 16;
957  if (dungeon[i][j] == 25 && dungeon[i][j + 1] == 9)
958  dungeon[i][j + 1] = 10;
959  if (dungeon[i][j] == 13 && dungeon[i][j + 1] == 5)
960  dungeon[i][j + 1] = 12;
961  if (dungeon[i][j] == 28 && dungeon[i][j - 1] == 6 && dungeon[i + 1][j] == 1)
962  dungeon[i + 1][j] = 23;
963  if (dungeon[i][j] == 19 && dungeon[i + 1][j] == 10)
964  dungeon[i + 1][j] = 17;
965  if (dungeon[i][j] == 21 && dungeon[i + 1][j] == 9)
966  dungeon[i + 1][j] = 11;
967  if (dungeon[i][j] == 11 && dungeon[i + 1][j] == 3)
968  dungeon[i + 1][j] = 5;
969  if (dungeon[i][j] == 10 && dungeon[i + 1][j] == 4)
970  dungeon[i + 1][j] = 12;
971  if (dungeon[i][j] == 14 && dungeon[i + 1][j] == 4)
972  dungeon[i + 1][j] = 12;
973  if (dungeon[i][j] == 27 && dungeon[i + 1][j] == 9)
974  dungeon[i + 1][j] = 11;
975  if (dungeon[i][j] == 15 && dungeon[i + 1][j] == 4)
976  dungeon[i + 1][j] = 12;
977  if (dungeon[i][j] == 21 && dungeon[i + 1][j] == 1)
978  dungeon[i + 1][j] = 16;
979  if (dungeon[i][j] == 11 && dungeon[i + 1][j] == 4)
980  dungeon[i + 1][j] = 12;
981  if (dungeon[i][j] == 2 && dungeon[i + 1][j] == 3)
982  dungeon[i + 1][j] = 5;
983  if (dungeon[i][j] == 9 && dungeon[i + 1][j] == 3)
984  dungeon[i + 1][j] = 5;
985  if (dungeon[i][j] == 14 && dungeon[i + 1][j] == 3)
986  dungeon[i + 1][j] = 5;
987  if (dungeon[i][j] == 15 && dungeon[i + 1][j] == 3)
988  dungeon[i + 1][j] = 5;
989  if (dungeon[i][j] == 2 && dungeon[i + 1][j] == 5 && dungeon[i + 1][j - 1] == 16)
990  dungeon[i + 1][j] = 12;
991  if (dungeon[i][j] == 2 && dungeon[i + 1][j] == 4)
992  dungeon[i + 1][j] = 12;
993  if (dungeon[i][j] == 9 && dungeon[i + 1][j] == 4)
994  dungeon[i + 1][j] = 12;
995  if (dungeon[i][j] == 1 && dungeon[i][j - 1] == 8)
996  dungeon[i][j - 1] = 9;
997  if (dungeon[i][j] == 28 && dungeon[i + 1][j] == 23 && dungeon[i + 1][j + 1] == 3)
998  dungeon[i + 1][j] = 16;
999  }
1000  }
1001  for (j = 0; j < DMAXY; j++) {
1002  for (i = 0; i < DMAXX; i++) {
1003  if (dungeon[i][j] == 21 && dungeon[i + 1][j] == 10)
1004  dungeon[i + 1][j] = 17;
1005  if (dungeon[i][j] == 17 && dungeon[i + 1][j] == 4)
1006  dungeon[i + 1][j] = 12;
1007  if (dungeon[i][j] == 10 && dungeon[i + 1][j] == 4)
1008  dungeon[i + 1][j] = 12;
1009  if (dungeon[i][j] == 17 && dungeon[i][j + 1] == 5)
1010  dungeon[i][j + 1] = 12;
1011  if (dungeon[i][j] == 29 && dungeon[i][j + 1] == 9)
1012  dungeon[i][j + 1] = 10;
1013  if (dungeon[i][j] == 13 && dungeon[i][j + 1] == 5)
1014  dungeon[i][j + 1] = 12;
1015  if (dungeon[i][j] == 9 && dungeon[i][j + 1] == 16)
1016  dungeon[i][j + 1] = 13;
1017  if (dungeon[i][j] == 10 && dungeon[i][j + 1] == 16)
1018  dungeon[i][j + 1] = 13;
1019  if (dungeon[i][j] == 16 && dungeon[i][j + 1] == 3)
1020  dungeon[i][j + 1] = 4;
1021  if (dungeon[i][j] == 11 && dungeon[i][j + 1] == 5)
1022  dungeon[i][j + 1] = 12;
1023  if (dungeon[i][j] == 10 && dungeon[i + 1][j] == 3 && dungeon[i + 1][j - 1] == 16)
1024  dungeon[i + 1][j] = 12;
1025  if (dungeon[i][j] == 16 && dungeon[i][j + 1] == 5)
1026  dungeon[i][j + 1] = 12;
1027  if (dungeon[i][j] == 1 && dungeon[i][j + 1] == 6)
1028  dungeon[i][j + 1] = 4;
1029  if (dungeon[i][j] == 21 && dungeon[i + 1][j] == 13 && dungeon[i][j + 1] == 10)
1030  dungeon[i + 1][j + 1] = 12;
1031  if (dungeon[i][j] == 15 && dungeon[i + 1][j] == 10)
1032  dungeon[i + 1][j] = 17;
1033  if (dungeon[i][j] == 22 && dungeon[i][j + 1] == 11)
1034  dungeon[i][j + 1] = 17;
1035  if (dungeon[i][j] == 15 && dungeon[i + 1][j] == 28 && dungeon[i + 2][j] == 16)
1036  dungeon[i + 1][j] = 23;
1037  if (dungeon[i][j] == 28 && dungeon[i + 1][j] == 23 && dungeon[i + 1][j + 1] == 1 && dungeon[i + 2][j] == 6)
1038  dungeon[i + 1][j] = 16;
1039  }
1040  }
1041  for (j = 0; j < DMAXY; j++) {
1042  for (i = 0; i < DMAXX; i++) {
1043  if (dungeon[i][j] == 15 && dungeon[i + 1][j] == 28 && dungeon[i + 2][j] == 16)
1044  dungeon[i + 1][j] = 23;
1045  if (dungeon[i][j] == 21 && dungeon[i + 1][j - 1] == 21 && dungeon[i + 1][j + 1] == 13 && dungeon[i + 2][j] == 2)
1046  dungeon[i + 1][j] = 17;
1047  if (dungeon[i][j] == 19 && dungeon[i + 1][j] == 15 && dungeon[i + 1][j + 1] == 12)
1048  dungeon[i + 1][j] = 17;
1049  }
1050  }
1051 }
1052 
1053 static void DRLG_L4Subs()
1054 {
1055  int x, y, i, rv;
1056  BYTE c;
1057 
1058  for (y = 0; y < DMAXY; y++) {
1059  for (x = 0; x < DMAXX; x++) {
1060  if (random_(0, 3) == 0) {
1061  c = L4BTYPES[dungeon[x][y]];
1062  if (c != 0 && dflags[x][y] == 0) {
1063  rv = random_(0, 16);
1064  i = -1;
1065  while (rv >= 0) {
1066  i++;
1067  if (i == sizeof(L4BTYPES)) {
1068  i = 0;
1069  }
1070  if (c == L4BTYPES[i]) {
1071  rv--;
1072  }
1073  }
1074  dungeon[x][y] = i;
1075  }
1076  }
1077  }
1078  }
1079  for (y = 0; y < DMAXY; y++) {
1080  for (x = 0; x < DMAXX; x++) {
1081  if (random_(0, 10) == 0) {
1082  if (L4BTYPES[dungeon[x][y]] == 6 && dflags[x][y] == 0) {
1083  dungeon[x][y] = random_(0, 3) + 95;
1084  }
1085  }
1086  }
1087  }
1088 }
1089 
1090 static void L4makeDungeon()
1091 {
1092  int i, j, k, l;
1093 
1094  for (j = 0; j < 20; j++) {
1095  for (i = 0; i < 20; i++) {
1096  k = i << 1;
1097  l = j << 1;
1098  L4dungeon[k][l] = dung[i][j];
1099  L4dungeon[k][l + 1] = dung[i][j];
1100  L4dungeon[k + 1][l] = dung[i][j];
1101  L4dungeon[k + 1][l + 1] = dung[i][j];
1102  }
1103  }
1104  for (j = 0; j < 20; j++) {
1105  for (i = 0; i < 20; i++) {
1106  k = i << 1;
1107  l = j << 1;
1108  L4dungeon[k][l + 40] = dung[i][19 - j];
1109  L4dungeon[k][l + 41] = dung[i][19 - j];
1110  L4dungeon[k + 1][l + 40] = dung[i][19 - j];
1111  L4dungeon[k + 1][l + 41] = dung[i][19 - j];
1112  }
1113  }
1114  for (j = 0; j < 20; j++) {
1115  for (i = 0; i < 20; i++) {
1116  k = i << 1;
1117  l = j << 1;
1118  L4dungeon[k + 40][l] = dung[19 - i][j];
1119  L4dungeon[k + 40][l + 1] = dung[19 - i][j];
1120  L4dungeon[k + 41][l] = dung[19 - i][j];
1121  L4dungeon[k + 41][l + 1] = dung[19 - i][j];
1122  }
1123  }
1124  for (j = 0; j < 20; j++) {
1125  for (i = 0; i < 20; i++) {
1126  k = i << 1;
1127  l = j << 1;
1128  L4dungeon[k + 40][l + 40] = dung[19 - i][19 - j];
1129  L4dungeon[k + 40][l + 41] = dung[19 - i][19 - j];
1130  L4dungeon[k + 41][l + 40] = dung[19 - i][19 - j];
1131  L4dungeon[k + 41][l + 41] = dung[19 - i][19 - j];
1132  }
1133  }
1134 }
1135 
1136 static void uShape()
1137 {
1138  int j, i, rv;
1139 
1140  for (j = 19; j >= 0; j--) {
1141  for (i = 19; i >= 0; i--) {
1142  if (dung[i][j] != 1) {
1143  hallok[j] = FALSE;
1144  }
1145  if (dung[i][j] == 1) {
1146  // BUGFIX: check that i + 1 < 20 and j + 1 < 20 (fixed)
1147  if (i + 1 < 20 && j + 1 < 20 &&
1148  dung[i][j + 1] == 1 && dung[i + 1][j + 1] == 0) {
1149  hallok[j] = TRUE;
1150  } else {
1151  hallok[j] = FALSE;
1152  }
1153  i = 0;
1154  }
1155  }
1156  }
1157 
1158  rv = random_(0, 19) + 1;
1159  do {
1160  if (hallok[rv]) {
1161  for (i = 19; i >= 0; i--) {
1162  if (dung[i][rv] == 1) {
1163  i = -1;
1164  rv = 0;
1165  } else {
1166  dung[i][rv] = 1;
1167  dung[i][rv + 1] = 1;
1168  }
1169  }
1170  } else {
1171  rv++;
1172  if (rv == 20) {
1173  rv = 1;
1174  }
1175  }
1176  } while (rv != 0);
1177 
1178  for (i = 19; i >= 0; i--) {
1179  for (j = 19; j >= 0; j--) {
1180  if (dung[i][j] != 1) {
1181  hallok[i] = FALSE;
1182  }
1183  if (dung[i][j] == 1) {
1184  // BUGFIX: check that i + 1 < 20 and j + 1 < 20 (fixed)
1185  if (i + 1 < 20 && j + 1 < 20 &&
1186  dung[i + 1][j] == 1 && dung[i + 1][j + 1] == 0) {
1187  hallok[i] = TRUE;
1188  } else {
1189  hallok[i] = FALSE;
1190  }
1191  j = 0;
1192  }
1193  }
1194  }
1195 
1196  rv = random_(0, 19) + 1;
1197  do {
1198  if (hallok[rv]) {
1199  for (j = 19; j >= 0; j--) {
1200  if (dung[rv][j] == 1) {
1201  j = -1;
1202  rv = 0;
1203  } else {
1204  dung[rv][j] = 1;
1205  dung[rv + 1][j] = 1;
1206  }
1207  }
1208  } else {
1209  rv++;
1210  if (rv == 20) {
1211  rv = 1;
1212  }
1213  }
1214  } while (rv != 0);
1215 }
1216 
1217 static long GetArea()
1218 {
1219  int i, j;
1220  long rv;
1221 
1222  rv = 0;
1223 
1224  for (j = 0; j < 20; j++) {
1225  for (i = 0; i < 20; i++) {
1226  if (dung[i][j] == 1) {
1227  rv++;
1228  }
1229  }
1230  }
1231 
1232  return rv;
1233 }
1234 
1235 static void L4drawRoom(int x, int y, int width, int height)
1236 {
1237  int i, j;
1238 
1239  for (j = 0; j < height; j++) {
1240  for (i = 0; i < width; i++) {
1241  dung[i + x][j + y] = 1;
1242  }
1243  }
1244 }
1245 
1246 static BOOL L4checkRoom(int x, int y, int width, int height)
1247 {
1248  int i, j;
1249 
1250  if (x <= 0 || y <= 0) {
1251  return FALSE;
1252  }
1253 
1254  for (j = 0; j < height; j++) {
1255  for (i = 0; i < width; i++) {
1256  if (i + x < 0 || i + x >= 20 || j + y < 0 || j + y >= 20) {
1257  return FALSE;
1258  }
1259  if (dung[i + x][j + y] != 0) {
1260  return FALSE;
1261  }
1262  }
1263  }
1264 
1265  return TRUE;
1266 }
1267 
1268 static void L4roomGen(int x, int y, int w, int h, int dir)
1269 {
1270  int num;
1271  BOOL ran, ran2;
1272  int width, height, rx, ry, ry2;
1273  int cw, ch, cx1, cy1, cx2;
1274 
1275  int dirProb = random_(0, 4);
1276 
1277  switch (dir == 1 ? dirProb != 0 : dirProb == 0) {
1278  case FALSE:
1279  num = 0;
1280  do {
1281  cw = (random_(0, 5) + 2) & ~1;
1282  ch = (random_(0, 5) + 2) & ~1;
1283  cy1 = h / 2 + y - ch / 2;
1284  cx1 = x - cw;
1285  ran = L4checkRoom(cx1 - 1, cy1 - 1, ch + 2, cw + 1);
1286  num++;
1287  } while (ran == FALSE && num < 20);
1288 
1289  if (ran == TRUE)
1290  L4drawRoom(cx1, cy1, cw, ch);
1291  cx2 = x + w;
1292  ran2 = L4checkRoom(cx2, cy1 - 1, cw + 1, ch + 2);
1293  if (ran2 == TRUE)
1294  L4drawRoom(cx2, cy1, cw, ch);
1295  if (ran == TRUE)
1296  L4roomGen(cx1, cy1, cw, ch, 1);
1297  if (ran2 == TRUE)
1298  L4roomGen(cx2, cy1, cw, ch, 1);
1299  break;
1300  case TRUE:
1301  num = 0;
1302  do {
1303  width = (random_(0, 5) + 2) & ~1;
1304  height = (random_(0, 5) + 2) & ~1;
1305  rx = w / 2 + x - width / 2;
1306  ry = y - height;
1307  ran = L4checkRoom(rx - 1, ry - 1, width + 2, height + 1);
1308  num++;
1309  } while (ran == FALSE && num < 20);
1310 
1311  if (ran == TRUE)
1312  L4drawRoom(rx, ry, width, height);
1313  ry2 = y + h;
1314  ran2 = L4checkRoom(rx - 1, ry2, width + 2, height + 1);
1315  if (ran2 == TRUE)
1316  L4drawRoom(rx, ry2, width, height);
1317  if (ran == TRUE)
1318  L4roomGen(rx, ry, width, height, 0);
1319  if (ran2 == TRUE)
1320  L4roomGen(rx, ry2, width, height, 0);
1321  break;
1322  }
1323 }
1324 
1325 static void L4firstRoom()
1326 {
1327  int x, y, w, h, rndx, rndy, xmin, xmax, ymin, ymax, tx, ty;
1328 
1329  if (currlevel != 16) {
1330  if (currlevel == quests[Q_WARLORD]._qlevel && quests[Q_WARLORD]._qactive) {
1332  w = 11;
1333  h = 11;
1334  } else if (currlevel == quests[Q_BETRAYER]._qlevel && gbMaxPlayers != 1) {
1335  w = 11;
1336  h = 11;
1337  } else {
1338  w = random_(0, 5) + 2;
1339  h = random_(0, 5) + 2;
1340  }
1341  } else {
1342  w = 14;
1343  h = 14;
1344  }
1345 
1346  xmin = (20 - w) >> 1;
1347  xmax = 19 - w;
1348  rndx = random_(0, xmax - xmin + 1) + xmin;
1349  if (rndx + w > 19) {
1350  tx = w + rndx - 19;
1351  x = rndx - tx + 1;
1352  } else {
1353  x = rndx;
1354  }
1355  ymin = (20 - h) >> 1;
1356  ymax = 19 - h;
1357  rndy = random_(0, ymax - ymin + 1) + ymin;
1358  if (rndy + h > 19) {
1359  ty = h + rndy - 19;
1360  y = rndy - ty + 1;
1361  } else {
1362  y = rndy;
1363  }
1364 
1365  if (currlevel == 16) {
1366  l4holdx = x;
1367  l4holdy = y;
1368  }
1369  if (QuestStatus(Q_WARLORD) || currlevel == quests[Q_BETRAYER]._qlevel && gbMaxPlayers != 1) {
1370  SP4x1 = x + 1;
1371  SP4y1 = y + 1;
1372  SP4x2 = SP4x1 + w;
1373  SP4y2 = SP4y1 + h;
1374  } else {
1375  SP4x1 = 0;
1376  SP4y1 = 0;
1377  SP4x2 = 0;
1378  SP4y2 = 0;
1379  }
1380 
1381  L4drawRoom(x, y, w, h);
1382  L4roomGen(x, y, w, h, random_(0, 2));
1383 }
1384 
1386 {
1387  int i, j, x, y;
1388 
1389  x = l4holdx;
1390  y = l4holdy;
1391 
1392  for (j = 0; j < 14; j++) {
1393  for (i = 0; i < 14; i++) {
1394  dflags[i + x][j + y] = 1;
1395  dflags[DMAXX - 1 - i - x][j + y] = 1;
1396  dflags[i + x][DMAXY - 1 - j - y] = 1;
1397  dflags[DMAXX - 1 - i - x][DMAXY - 1 - j - y] = 1;
1398  }
1399  }
1400 }
1401 
1402 void DRLG_L4SetRoom(BYTE *pSetPiece, int rx1, int ry1)
1403 {
1404  int rw, rh, i, j;
1405  BYTE *sp;
1406 
1407  rw = pSetPiece[0];
1408  rh = pSetPiece[2];
1409  sp = &pSetPiece[4];
1410 
1411  for (j = 0; j < rh; j++) {
1412  for (i = 0; i < rw; i++) {
1413  if (*sp != 0) {
1414  dungeon[i + rx1][j + ry1] = *sp;
1415  dflags[i + rx1][j + ry1] |= DLRG_PROTECTED;
1416  } else {
1417  dungeon[i + rx1][j + ry1] = 6;
1418  }
1419  sp += 2;
1420  }
1421  }
1422 }
1423 
1424 void DRLG_LoadDiabQuads(BOOL preflag)
1425 {
1426  BYTE *lpSetPiece;
1427 
1428  lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab1.DUN", NULL);
1429  diabquad1x = 4 + l4holdx;
1430  diabquad1y = 4 + l4holdy;
1431  DRLG_L4SetRoom(lpSetPiece, diabquad1x, diabquad1y);
1432  mem_free_dbg(lpSetPiece);
1433 
1434  if (preflag) {
1435  lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab2b.DUN", NULL);
1436  } else {
1437  lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab2a.DUN", NULL);
1438  }
1439  diabquad2x = 27 - l4holdx;
1440  diabquad2y = 1 + l4holdy;
1441  DRLG_L4SetRoom(lpSetPiece, diabquad2x, diabquad2y);
1442  mem_free_dbg(lpSetPiece);
1443 
1444  if (preflag) {
1445  lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab3b.DUN", NULL);
1446  } else {
1447  lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab3a.DUN", NULL);
1448  }
1449  diabquad3x = 1 + l4holdx;
1450  diabquad3y = 27 - l4holdy;
1451  DRLG_L4SetRoom(lpSetPiece, diabquad3x, diabquad3y);
1452  mem_free_dbg(lpSetPiece);
1453 
1454  if (preflag) {
1455  lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab4b.DUN", NULL);
1456  } else {
1457  lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab4a.DUN", NULL);
1458  }
1459  diabquad4x = 28 - l4holdx;
1460  diabquad4y = 28 - l4holdy;
1461  DRLG_L4SetRoom(lpSetPiece, diabquad4x, diabquad4y);
1462  mem_free_dbg(lpSetPiece);
1463 }
1464 
1465 static BOOL DRLG_L4PlaceMiniSet(const BYTE *miniset, int tmin, int tmax, int cx, int cy, BOOL setview, int ldir)
1466 {
1467  int sx, sy, sw, sh, xx, yy, i, ii, numt, bailcnt;
1468  BOOL found;
1469 
1470  sw = miniset[0];
1471  sh = miniset[1];
1472 
1473  if (tmax - tmin == 0) {
1474  numt = 1;
1475  } else {
1476  numt = random_(0, tmax - tmin) + tmin;
1477  }
1478 
1479  for (i = 0; i < numt; i++) {
1480  sx = random_(0, DMAXX - sw);
1481  sy = random_(0, DMAXY - sh);
1482  found = FALSE;
1483  for (bailcnt = 0; !found && bailcnt < 200; bailcnt++) {
1484  found = TRUE;
1485  if (sx >= SP4x1 && sx <= SP4x2 && sy >= SP4y1 && sy <= SP4y2) {
1486  found = FALSE;
1487  }
1488  if (cx != -1 && sx >= cx - sw && sx <= cx + 12) {
1489  sx = random_(0, DMAXX - sw);
1490  sy = random_(0, DMAXY - sh);
1491  found = FALSE;
1492  }
1493  if (cy != -1 && sy >= cy - sh && sy <= cy + 12) {
1494  sx = random_(0, DMAXX - sw);
1495  sy = random_(0, DMAXY - sh);
1496  found = FALSE;
1497  }
1498  ii = 2;
1499  for (yy = 0; yy < sh && found == TRUE; yy++) {
1500  for (xx = 0; xx < sw && found == TRUE; xx++) {
1501  if (miniset[ii] != 0 && dungeon[xx + sx][yy + sy] != miniset[ii]) {
1502  found = FALSE;
1503  }
1504  if (dflags[xx + sx][yy + sy] != 0) {
1505  found = FALSE;
1506  }
1507  ii++;
1508  }
1509  }
1510  if (!found) {
1511  sx++;
1512  if (sx == DMAXX - sw) {
1513  sx = 0;
1514  sy++;
1515  if (sy == DMAXY - sh) {
1516  sy = 0;
1517  }
1518  }
1519  }
1520  }
1521  if (bailcnt >= 200) {
1522  return FALSE;
1523  }
1524  ii = sw * sh + 2;
1525  for (yy = 0; yy < sh; yy++) {
1526  for (xx = 0; xx < sw; xx++) {
1527  if (miniset[ii] != 0) {
1528  dungeon[xx + sx][yy + sy] = miniset[ii];
1529  dflags[xx + sx][yy + sy] |= 8;
1530  }
1531  ii++;
1532  }
1533  }
1534  }
1535 
1536  if (currlevel == 15) {
1537  quests[Q_BETRAYER]._qtx = sx + 1;
1538  quests[Q_BETRAYER]._qty = sy + 1;
1539  }
1540  if (setview == TRUE) {
1541  ViewX = 2 * sx + 21;
1542  ViewY = 2 * sy + 22;
1543  }
1544  if (ldir == 0) {
1545  LvlViewX = 2 * sx + 21;
1546  LvlViewY = 2 * sy + 22;
1547  }
1548 
1549  return TRUE;
1550 }
1551 
1552 static void DRLG_L4FTVR(int i, int j, int x, int y, int d)
1553 {
1554  if (dTransVal[x][y] != 0 || dungeon[i][j] != 6) {
1555  if (d == 1) {
1556  dTransVal[x][y] = TransVal;
1557  dTransVal[x][y + 1] = TransVal;
1558  }
1559  if (d == 2) {
1560  dTransVal[x + 1][y] = TransVal;
1561  dTransVal[x + 1][y + 1] = TransVal;
1562  }
1563  if (d == 3) {
1564  dTransVal[x][y] = TransVal;
1565  dTransVal[x + 1][y] = TransVal;
1566  }
1567  if (d == 4) {
1568  dTransVal[x][y + 1] = TransVal;
1569  dTransVal[x + 1][y + 1] = TransVal;
1570  }
1571  if (d == 5) {
1572  dTransVal[x + 1][y + 1] = TransVal;
1573  }
1574  if (d == 6) {
1575  dTransVal[x][y + 1] = TransVal;
1576  }
1577  if (d == 7) {
1578  dTransVal[x + 1][y] = TransVal;
1579  }
1580  if (d == 8) {
1581  dTransVal[x][y] = TransVal;
1582  }
1583  } else {
1584  dTransVal[x][y] = TransVal;
1585  dTransVal[x + 1][y] = TransVal;
1586  dTransVal[x][y + 1] = TransVal;
1587  dTransVal[x + 1][y + 1] = TransVal;
1588  DRLG_L4FTVR(i + 1, j, x + 2, y, 1);
1589  DRLG_L4FTVR(i - 1, j, x - 2, y, 2);
1590  DRLG_L4FTVR(i, j + 1, x, y + 2, 3);
1591  DRLG_L4FTVR(i, j - 1, x, y - 2, 4);
1592  DRLG_L4FTVR(i - 1, j - 1, x - 2, y - 2, 5);
1593  DRLG_L4FTVR(i + 1, j - 1, x + 2, y - 2, 6);
1594  DRLG_L4FTVR(i - 1, j + 1, x - 2, y + 2, 7);
1595  DRLG_L4FTVR(i + 1, j + 1, x + 2, y + 2, 8);
1596  }
1597 }
1598 
1599 static void DRLG_L4FloodTVal()
1600 {
1601  int i, j, xx, yy;
1602 
1603  yy = 16;
1604  for (j = 0; j < DMAXY; j++) {
1605  xx = 16;
1606  for (i = 0; i < DMAXX; i++) {
1607  if (dungeon[i][j] == 6 && dTransVal[xx][yy] == 0) {
1608  DRLG_L4FTVR(i, j, xx, yy, 0);
1609  TransVal++;
1610  }
1611  xx += 2;
1612  }
1613  yy += 2;
1614  }
1615 }
1616 
1617 BOOL IsDURWall(char d)
1618 {
1619  if (d == 25) {
1620  return TRUE;
1621  }
1622  if (d == 28) {
1623  return TRUE;
1624  }
1625  if (d == 23) {
1626  return TRUE;
1627  }
1628 
1629  return FALSE;
1630 }
1631 
1632 BOOL IsDLLWall(char dd)
1633 {
1634  if (dd == 27) {
1635  return TRUE;
1636  }
1637  if (dd == 26) {
1638  return TRUE;
1639  }
1640  if (dd == 22) {
1641  return TRUE;
1642  }
1643 
1644  return FALSE;
1645 }
1646 
1647 static void DRLG_L4TransFix()
1648 {
1649  int i, j, xx, yy;
1650 
1651  yy = 16;
1652  for (j = 0; j < DMAXY; j++) {
1653  xx = 16;
1654  for (i = 0; i < DMAXX; i++) {
1655  if (IsDURWall(dungeon[i][j]) && dungeon[i][j - 1] == 18) {
1656  dTransVal[xx + 1][yy] = dTransVal[xx][yy];
1657  dTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];
1658  }
1659  if (IsDLLWall(dungeon[i][j]) && dungeon[i + 1][j] == 19) {
1660  dTransVal[xx][yy + 1] = dTransVal[xx][yy];
1661  dTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];
1662  }
1663  if (dungeon[i][j] == 18) {
1664  dTransVal[xx + 1][yy] = dTransVal[xx][yy];
1665  dTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];
1666  }
1667  if (dungeon[i][j] == 19) {
1668  dTransVal[xx][yy + 1] = dTransVal[xx][yy];
1669  dTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];
1670  }
1671  if (dungeon[i][j] == 24) {
1672  dTransVal[xx + 1][yy] = dTransVal[xx][yy];
1673  dTransVal[xx][yy + 1] = dTransVal[xx][yy];
1674  dTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];
1675  }
1676  if (dungeon[i][j] == 57) {
1677  dTransVal[xx - 1][yy] = dTransVal[xx][yy + 1];
1678  dTransVal[xx][yy] = dTransVal[xx][yy + 1];
1679  }
1680  if (dungeon[i][j] == 53) {
1681  dTransVal[xx][yy - 1] = dTransVal[xx + 1][yy];
1682  dTransVal[xx][yy] = dTransVal[xx + 1][yy];
1683  }
1684  xx += 2;
1685  }
1686  yy += 2;
1687  }
1688 }
1689 
1690 static void DRLG_L4Corners()
1691 {
1692  int i, j;
1693 
1694  for (j = 1; j < DMAXY - 1; j++) {
1695  for (i = 1; i < DMAXX - 1; i++) {
1696  if (dungeon[i][j] >= 18 && dungeon[i][j] <= 30) {
1697  if (dungeon[i + 1][j] < 18) {
1698  dungeon[i][j] += 98;
1699  } else if (dungeon[i][j + 1] < 18) {
1700  dungeon[i][j] += 98;
1701  }
1702  }
1703  }
1704  }
1705 }
1706 
1707 void L4FixRim()
1708 {
1709  int i, j;
1710 
1711  for (i = 0; i < 20; i++) {
1712  dung[i][0] = 0;
1713  }
1714  for (j = 0; j < 20; j++) {
1715  dung[0][j] = 0;
1716  }
1717 }
1718 
1720 {
1721  int i, j;
1722 
1723  for (j = 0; j < DMAXY - 1; j++) {
1724  for (i = 0; i < DMAXX - 1; i++) {
1725  if ((dungeon[i][j] == 24 || dungeon[i][j] == 122) && dungeon[i + 1][j] == 2 && dungeon[i][j + 1] == 5) {
1726  dungeon[i][j] = 17;
1727  }
1728  }
1729  }
1730 }
1731 
1732 static void DRLG_L4(int entry)
1733 {
1734  int i, j, spi, spj, ar;
1735  BOOL doneflag;
1736 
1737  do {
1738  DRLG_InitTrans();
1739  do {
1740  InitL4Dungeon();
1741  L4firstRoom();
1742  L4FixRim();
1743  ar = GetArea();
1744  if (ar >= 173) {
1745  uShape();
1746  }
1747  } while (ar < 173);
1748  L4makeDungeon();
1749  L4makeDmt();
1750  L4tileFix();
1751  if (currlevel == 16) {
1752  L4SaveQuads();
1753  }
1754  if (QuestStatus(Q_WARLORD) || currlevel == quests[Q_BETRAYER]._qlevel && gbMaxPlayers != 1) {
1755  for (spi = SP4x1; spi < SP4x2; spi++) {
1756  for (spj = SP4y1; spj < SP4y2; spj++) {
1757  dflags[spi][spj] = 1;
1758  }
1759  }
1760  }
1761  L4AddWall();
1762  DRLG_L4FloodTVal();
1763  DRLG_L4TransFix();
1764  if (setloadflag) {
1766  }
1767  if (currlevel == 16) {
1768  DRLG_LoadDiabQuads(TRUE);
1769  }
1770  if (QuestStatus(Q_WARLORD)) {
1771  if (entry == 0) {
1772  doneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, 1, 0);
1773  if (doneflag && currlevel == 13) {
1774  doneflag = DRLG_L4PlaceMiniSet(L4TWARP, 1, 1, -1, -1, 0, 6);
1775  }
1776  ViewX++;
1777  } else if (entry == 1) {
1778  doneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, 0, 0);
1779  if (doneflag && currlevel == 13) {
1780  doneflag = DRLG_L4PlaceMiniSet(L4TWARP, 1, 1, -1, -1, 0, 6);
1781  }
1782  ViewX = 2 * setpc_x + 22;
1783  ViewY = 2 * setpc_y + 22;
1784  } else {
1785  doneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, 0, 0);
1786  if (doneflag && currlevel == 13) {
1787  doneflag = DRLG_L4PlaceMiniSet(L4TWARP, 1, 1, -1, -1, 1, 6);
1788  }
1789  ViewX++;
1790  }
1791  } else if (currlevel != 15) {
1792  if (entry == 0) {
1793  doneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, 1, 0);
1794  if (doneflag && currlevel != 16) {
1795  doneflag = DRLG_L4PlaceMiniSet(L4DSTAIRS, 1, 1, -1, -1, 0, 1);
1796  }
1797  if (doneflag && currlevel == 13) {
1798  doneflag = DRLG_L4PlaceMiniSet(L4TWARP, 1, 1, -1, -1, 0, 6);
1799  }
1800  ViewX++;
1801  } else if (entry == 1) {
1802  doneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, 0, 0);
1803  if (doneflag && currlevel != 16) {
1804  doneflag = DRLG_L4PlaceMiniSet(L4DSTAIRS, 1, 1, -1, -1, 1, 1);
1805  }
1806  if (doneflag && currlevel == 13) {
1807  doneflag = DRLG_L4PlaceMiniSet(L4TWARP, 1, 1, -1, -1, 0, 6);
1808  }
1809  ViewY++;
1810  } else {
1811  doneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, 0, 0);
1812  if (doneflag && currlevel != 16) {
1813  doneflag = DRLG_L4PlaceMiniSet(L4DSTAIRS, 1, 1, -1, -1, 0, 1);
1814  }
1815  if (doneflag && currlevel == 13) {
1816  doneflag = DRLG_L4PlaceMiniSet(L4TWARP, 1, 1, -1, -1, 1, 6);
1817  }
1818  ViewX++;
1819  }
1820  } else {
1821  if (entry == 0) {
1822  doneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, 1, 0);
1823  if (doneflag) {
1824  if (gbMaxPlayers == 1 && quests[Q_DIABLO]._qactive != QUEST_ACTIVE) {
1825  doneflag = DRLG_L4PlaceMiniSet(L4PENTA, 1, 1, -1, -1, 0, 1);
1826  } else {
1827  doneflag = DRLG_L4PlaceMiniSet(L4PENTA2, 1, 1, -1, -1, 0, 1);
1828  }
1829  }
1830  ViewX++;
1831  } else {
1832  doneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, 0, 0);
1833  if (doneflag) {
1834  if (gbMaxPlayers == 1 && quests[Q_DIABLO]._qactive != QUEST_ACTIVE) {
1835  doneflag = DRLG_L4PlaceMiniSet(L4PENTA, 1, 1, -1, -1, 1, 1);
1836  } else {
1837  doneflag = DRLG_L4PlaceMiniSet(L4PENTA2, 1, 1, -1, -1, 1, 1);
1838  }
1839  }
1840  ViewY++;
1841  }
1842  }
1843  } while (!doneflag);
1844 
1846 
1847  if (currlevel != 16) {
1848  DRLG_PlaceThemeRooms(7, 10, 6, 8, 1);
1849  }
1850 
1851  DRLG_L4Shadows();
1852  DRLG_L4Corners();
1853  DRLG_L4Subs();
1855 
1856  if (QuestStatus(Q_WARLORD)) {
1857  for (j = 0; j < DMAXY; j++) {
1858  for (i = 0; i < DMAXX; i++) {
1859  pdungeon[i][j] = dungeon[i][j];
1860  }
1861  }
1862  }
1863 
1865 
1866  if (currlevel == 15) {
1867  for (j = 0; j < DMAXY; j++) {
1868  for (i = 0; i < DMAXX; i++) {
1869  if (dungeon[i][j] == 98) {
1870  Make_SetPC(i - 1, j - 1, 5, 5);
1871  }
1872  if (dungeon[i][j] == 107) {
1873  Make_SetPC(i - 1, j - 1, 5, 5);
1874  }
1875  }
1876  }
1877  }
1878  if (currlevel == 16) {
1879  for (j = 0; j < DMAXY; j++) {
1880  for (i = 0; i < DMAXX; i++) {
1881  pdungeon[i][j] = dungeon[i][j];
1882  }
1883  }
1884  DRLG_LoadDiabQuads(FALSE);
1885  }
1886 }
1887 
1888 static void DRLG_L4Pass3()
1889 {
1890  int i, j, xx, yy;
1891  long v1, v2, v3, v4, lv;
1892  WORD *MegaTiles;
1893 
1894  lv = 30 - 1;
1895 
1896  MegaTiles = (WORD *)&pMegaTiles[lv * 8];
1897  v1 = SDL_SwapLE16(*(MegaTiles + 0)) + 1;
1898  v2 = SDL_SwapLE16(*(MegaTiles + 1)) + 1;
1899  v3 = SDL_SwapLE16(*(MegaTiles + 2)) + 1;
1900  v4 = SDL_SwapLE16(*(MegaTiles + 3)) + 1;
1901 
1902  for (j = 0; j < MAXDUNY; j += 2)
1903  {
1904  for (i = 0; i < MAXDUNX; i += 2) {
1905  dPiece[i][j] = v1;
1906  dPiece[i + 1][j] = v2;
1907  dPiece[i][j + 1] = v3;
1908  dPiece[i + 1][j + 1] = v4;
1909  }
1910  }
1911 
1912  yy = 16;
1913  for (j = 0; j < DMAXY; j++) {
1914  xx = 16;
1915  for (i = 0; i < DMAXX; i++) {
1916  lv = dungeon[i][j] - 1;
1917  if (lv >= 0) {
1918  MegaTiles = (WORD *)&pMegaTiles[lv * 8];
1919  v1 = SDL_SwapLE16(*(MegaTiles + 0)) + 1;
1920  v2 = SDL_SwapLE16(*(MegaTiles + 1)) + 1;
1921  v3 = SDL_SwapLE16(*(MegaTiles + 2)) + 1;
1922  v4 = SDL_SwapLE16(*(MegaTiles + 3)) + 1;
1923  } else {
1924  v1 = 0;
1925  v2 = 0;
1926  v3 = 0;
1927  v4 = 0;
1928  }
1929  dPiece[xx][yy] = v1;
1930  dPiece[xx + 1][yy] = v2;
1931  dPiece[xx][yy + 1] = v3;
1932  dPiece[xx + 1][yy + 1] = v4;
1933  xx += 2;
1934  }
1935  yy += 2;
1936  }
1937 }
1938 
1939 void CreateL4Dungeon(DWORD rseed, int entry)
1940 {
1941  SetRndSeed(rseed);
1942 
1943  dminx = 16;
1944  dminy = 16;
1945  dmaxx = 96;
1946  dmaxy = 96;
1947 
1948  ViewX = 40;
1949  ViewY = 40;
1950 
1951  DRLG_InitSetPC();
1952  DRLG_LoadL4SP();
1953  DRLG_L4(entry);
1954  DRLG_L4Pass3();
1955  DRLG_FreeL4SP();
1956  DRLG_SetPC();
1957 }
1958 #endif
1959 
QuestStruct::_qtx
int _qtx
Definition: structs.h:975
DRLG_InitTrans
void DRLG_InitTrans()
Definition: gendung.cpp:171
SP4x2
int SP4x2
Definition: drlg_l4.cpp:23
quests
QuestStruct quests[MAXQUESTS]
Definition: quests.cpp:8
diabquad1y
int diabquad1y
Definition: drlg_l4.cpp:11
setpc_w
int setpc_w
Definition: gendung.cpp:71
l4holdy
int l4holdy
Definition: drlg_l4.cpp:21
currlevel
BYTE currlevel
Definition: gendung.cpp:40
diabquad2y
int diabquad2y
Definition: drlg_l4.cpp:15
DRLG_L4FloodTVal
static void DRLG_L4FloodTVal()
Definition: drlg_l4.cpp:1599
L4USTAIRS
const BYTE L4USTAIRS[42]
Definition: drlg_l4.cpp:31
setpc_h
int setpc_h
Definition: gendung.cpp:70
diabquad3x
int diabquad3x
Definition: drlg_l4.cpp:12
DRLG_L4Pass3
static void DRLG_L4Pass3()
Definition: drlg_l4.cpp:1888
dminx
int dminx
Definition: gendung.cpp:77
QuestStatus
BOOL QuestStatus(int i)
Definition: quests.cpp:239
setpc_x
int setpc_x
Definition: gendung.cpp:72
SetRndSeed
void SetRndSeed(int s)
Set the RNG seed.
Definition: engine.cpp:728
L4TWARP
const BYTE L4TWARP[42]
Definition: drlg_l4.cpp:75
dungeon
BYTE dungeon[DMAXX][DMAXY]
Definition: gendung.cpp:18
pdungeon
BYTE pdungeon[DMAXX][DMAXY]
Definition: gendung.cpp:20
DRLG_L4GeneralFix
void DRLG_L4GeneralFix()
Definition: drlg_l4.cpp:1719
DRLG_L4
static void DRLG_L4(int entry)
Definition: drlg_l4.cpp:1732
l4holdx
int l4holdx
Definition: drlg_l4.cpp:20
dmaxx
int dmaxx
Definition: gendung.cpp:68
MAXDUNX
#define MAXDUNX
Definition: defs.h:25
hallok
BOOL hallok[20]
Definition: drlg_l4.cpp:19
SP4x1
int SP4x1
Definition: drlg_l4.cpp:22
pMegaTiles
BYTE * pMegaTiles
Definition: gendung.cpp:29
ViewX
int ViewX
Definition: gendung.cpp:73
L4roomGen
static void L4roomGen(int x, int y, int w, int h, int dir)
Definition: drlg_l4.cpp:1268
DRLG_L4TransFix
static void DRLG_L4TransFix()
Definition: drlg_l4.cpp:1647
Make_SetPC
void Make_SetPC(int x, int y, int w, int h)
Definition: gendung.cpp:270
L4makeDmt
static void L4makeDmt()
Definition: drlg_l4.cpp:392
MemFreeDbg
#define MemFreeDbg(p)
Definition: defs.h:157
all.h
ViewY
int ViewY
Definition: gendung.cpp:74
CreateL4Dungeon
void CreateL4Dungeon(DWORD rseed, int entry)
Definition: drlg_l4.cpp:1939
DRLG_PlaceThemeRooms
void DRLG_PlaceThemeRooms(int minSize, int maxSize, int floor, int freq, int rndSize)
Definition: gendung.cpp:495
InitL4Dungeon
static void InitL4Dungeon()
Definition: drlg_l4.cpp:331
SP4y1
int SP4y1
Definition: drlg_l4.cpp:24
L4makeDungeon
static void L4makeDungeon()
Definition: drlg_l4.cpp:1090
L4tileFix
static void L4tileFix()
Definition: drlg_l4.cpp:707
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
dung
BYTE dung[20][20]
Definition: drlg_l4.cpp:27
pSetPiece
BYTE * pSetPiece
Definition: gendung.cpp:63
L4SaveQuads
void L4SaveQuads()
Definition: drlg_l4.cpp:1385
MAXDUNY
#define MAXDUNY
Definition: defs.h:26
L4AddWall
static void L4AddWall()
Definition: drlg_l4.cpp:604
dPiece
int dPiece[MAXDUNX][MAXDUNY]
Definition: gendung.cpp:26
DLRG_PROTECTED
@ DLRG_PROTECTED
Definition: enums.h:2929
L4ConvTbl
const BYTE L4ConvTbl[16]
Definition: drlg_l4.cpp:30
Q_BETRAYER
@ Q_BETRAYER
Definition: enums.h:2563
TransVal
char TransVal
Definition: gendung.cpp:23
L4checkRoom
static BOOL L4checkRoom(int x, int y, int width, int height)
Definition: drlg_l4.cpp:1246
IsDLLWall
BOOL IsDLLWall(char dd)
Definition: drlg_l4.cpp:1632
DRLG_L4Subs
static void DRLG_L4Subs()
Definition: drlg_l4.cpp:1053
DRLG_L4SetSPRoom
void DRLG_L4SetSPRoom(int rx1, int ry1)
Definition: drlg_l4.cpp:364
DRLG_L4PlaceMiniSet
static BOOL DRLG_L4PlaceMiniSet(const BYTE *miniset, int tmin, int tmax, int cx, int cy, BOOL setview, int ldir)
Definition: drlg_l4.cpp:1465
DEVILUTION_END_NAMESPACE
#define DEVILUTION_END_NAMESPACE
Definition: types.h:10
setloadflag
BOOL setloadflag
Definition: gendung.cpp:28
LoadFileInMem
BYTE * LoadFileInMem(char *pszName, DWORD *pdwFileLen)
Load a file in to a buffer.
Definition: engine.cpp:801
L4PENTA2
const BYTE L4PENTA2[52]
Definition: drlg_l4.cpp:227
diabquad2x
int diabquad2x
Definition: drlg_l4.cpp:14
IsDURWall
BOOL IsDURWall(char d)
Definition: drlg_l4.cpp:1617
DRLG_L4Shadows
static void DRLG_L4Shadows()
Definition: drlg_l4.cpp:298
dmaxy
int dmaxy
Definition: gendung.cpp:69
L4HWallOk
static int L4HWallOk(int i, int j)
Definition: drlg_l4.cpp:408
L4DSTAIRS
const BYTE L4DSTAIRS[52]
Definition: drlg_l4.cpp:119
diabquad4y
int diabquad4y
Definition: drlg_l4.cpp:17
DRLG_LoadDiabQuads
void DRLG_LoadDiabQuads(BOOL preflag)
Definition: drlg_l4.cpp:1424
DRLG_L4Corners
static void DRLG_L4Corners()
Definition: drlg_l4.cpp:1690
GetArea
static long GetArea()
Definition: drlg_l4.cpp:1217
Q_WARLORD
@ Q_WARLORD
Definition: enums.h:2559
DRLG_SetPC
void DRLG_SetPC()
Definition: gendung.cpp:253
DMAXY
#define DMAXY
Definition: defs.h:8
LvlViewX
int LvlViewX
Definition: gendung.cpp:67
L4PENTA
const BYTE L4PENTA[52]
Definition: drlg_l4.cpp:173
SP4y2
int SP4y2
Definition: drlg_l4.cpp:25
L4firstRoom
static void L4firstRoom()
Definition: drlg_l4.cpp:1325
DRLG_CheckQuests
void DRLG_CheckQuests(int x, int y)
Definition: quests.cpp:516
L4FixRim
void L4FixRim()
Definition: drlg_l4.cpp:1707
L4dungeon
BYTE L4dungeon[80][80]
Definition: drlg_l4.cpp:26
dTransVal
char dTransVal[MAXDUNX][MAXDUNY]
Definition: gendung.cpp:37
LvlViewY
int LvlViewY
Definition: gendung.cpp:66
DRLG_L4SetRoom
void DRLG_L4SetRoom(BYTE *pSetPiece, int rx1, int ry1)
Definition: drlg_l4.cpp:1402
QuestStruct::_qty
int _qty
Definition: structs.h:976
L4BTYPES
const BYTE L4BTYPES[140]
Definition: drlg_l4.cpp:281
dflags
char dflags[DMAXX][DMAXY]
Definition: gendung.cpp:25
DRLG_FreeL4SP
void DRLG_FreeL4SP()
Definition: drlg_l4.cpp:359
random_
int random_(BYTE idx, int v)
Main RNG function.
Definition: engine.cpp:752
mem_free_dbg
void mem_free_dbg(void *p)
Multithreaded safe memfree.
Definition: engine.cpp:786
QUEST_ACTIVE
@ QUEST_ACTIVE
Definition: enums.h:2569
DRLG_L4FTVR
static void DRLG_L4FTVR(int i, int j, int x, int y, int d)
Definition: drlg_l4.cpp:1552
DEVILUTION_BEGIN_NAMESPACE
Definition: sha.cpp:10
DRLG_LoadL4SP
void DRLG_LoadL4SP()
Definition: drlg_l4.cpp:346
Q_DIABLO
@ Q_DIABLO
Definition: enums.h:2553
L4VertWall
static void L4VertWall(int i, int j, int dy)
Definition: drlg_l4.cpp:557
diabquad4x
int diabquad4x
Definition: drlg_l4.cpp:16
diabquad1x
DEVILUTION_BEGIN_NAMESPACE int diabquad1x
Definition: drlg_l4.cpp:10
DRLG_Init_Globals
void DRLG_Init_Globals()
Definition: drlg_l1.cpp:470
dminy
int dminy
Definition: gendung.cpp:78
DRLG_InitSetPC
void DRLG_InitSetPC()
Definition: gendung.cpp:245
setpc_y
int setpc_y
Definition: gendung.cpp:75
L4VWallOk
static int L4VWallOk(int i, int j)
Definition: drlg_l4.cpp:459
L4drawRoom
static void L4drawRoom(int x, int y, int width, int height)
Definition: drlg_l4.cpp:1235
uShape
static void uShape()
Definition: drlg_l4.cpp:1136
diabquad3y
int diabquad3y
Definition: drlg_l4.cpp:13
L4HorizWall
static void L4HorizWall(int i, int j, int dx)
Definition: drlg_l4.cpp:513
DMAXX
#define DMAXX
Definition: defs.h:7