Files
Justin Marshall 101266ab72 Initial commit.
2026-04-27 10:35:40 -07:00

2843 lines
76 KiB
C++

/*-----------------------------------------------------------------------**
** Diablo
**
** Dungeon file
**
** (C)1995 Condor, Inc. All rights reserved.
**
**-----------------------------------------------------------------------**
** $Header: /Diablo/DRLG_L3.CPP 1 1/22/97 2:06p Dgartner $
**-----------------------------------------------------------------------**
**
** File Routines
** CreateL1Dungeon
**-----------------------------------------------------------------------*/
#include "diablo.h"
#pragma hdrstop
#include "sound.h"
#include "drlg_l3.h"
#include "gendung.h"
#include "scrollrt.h"
#include "engine.h"
#include "trigs.h"
#include "lighting.h"
#include "monster.h"
#include "objects.h"
#include "quests.h"
/*-----------------------------------------------------------------------**
** Registration info
**-----------------------------------------------------------------------*/
#include "regconst.h"
char sgszRegSig4[REG_LEN] = "REGISTRATION_BLOCK";
//int SP3x1, SP3y1, SP3x2, SP3y2;
/*-----------------------------------------------------------------------*
**-----------------------------------------------------------------------*/
static const byte L3ConvTbl[16] = { 8, 11, 3, 10, 1, 9, 12, 12, 6, 13, 4, 13, 2, 14, 5, 7 };
static const byte L3UP[] = { 3, 3, // X size, Y size
FILL, FILL, 0, // Pattern to look for
TOP_WALL, TOP_WALL, 0,
FLOOR, FLOOR, 0,
51, 50, 0, // Pattern to sub
48, 49, 0,
0, 0, 0};
//JKE level 6 stuff
static const byte L6UP[] = { 3, 3, // X size, Y size
FILL, FILL, 0, // Pattern to look for
TOP_WALL, TOP_WALL, 0,
FLOOR, FLOOR, 0,
20, 19, 0, // Pattern to sub
17, 18, 0,
0, 0, 0};
static const byte L3DOWN[] = { 3, 3, // X size, Y size
FILL, LEFT_WALL, FLOOR, // Pattern to look for
FILL, LEFT_WALL, FLOOR,
0, 0, 0,
0, 47, 0, // Pattern to sub
0, 46, 0,
0, 0, 0};
// JKE level 6 stuff
static const byte L6DOWN[] = { 3, 3, // X size, Y size
FILL, LEFT_WALL, FLOOR, // Pattern to look for
FILL, LEFT_WALL, FLOOR,
0, 0, 0,
0, 16, 0, // Pattern to sub
0, 15, 0,
0, 0, 0};
static const byte L3HOLDWARP[] = { 3, 3, // X size, Y size
FILL, FILL, 0, // Pattern to look for
TOP_WALL, TOP_WALL, 0,
FLOOR, FLOOR, 0,
125, 125, 0, // Pattern to sub
125, 125, 0,
0, 0, 0};
// JKE level 6 stuff
static const byte L6HOLDWARP[] = { 3, 3, // X size, Y size
FILL, FILL, 0, // Pattern to look for
TOP_WALL, TOP_WALL, 0,
FLOOR, FLOOR, 0,
24, 23, 0, // Pattern to sub
21, 22, 0,
0, 0, 0};
static const byte L3TITE1[] = { 4, 4, // X size, Y size
FLOOR, FLOOR, FLOOR, FLOOR, // Pattern to look for
FLOOR, FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR, FLOOR,
0, 0, 0, 0, // Pattern to sub
0, 57, 58, 0,
0, 56, 55, 0,
0, 0, 0, 0};
static const byte L3TITE2[] = { 4, 4, // X size, Y size
FLOOR, FLOOR, FLOOR, FLOOR, // Pattern to look for
FLOOR, FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR, FLOOR,
0, 0, 0, 0, // Pattern to sub
0, 61, 62, 0,
0, 60, 59, 0,
0, 0, 0, 0};
static const byte L3TITE3[] = { 4, 4, // X size, Y size
FLOOR, FLOOR, FLOOR, FLOOR, // Pattern to look for
FLOOR, FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR, FLOOR,
0, 0, 0, 0, // Pattern to sub
0, 65, 66, 0,
0, 64, 63, 0,
0, 0, 0, 0};
static const byte L3TITE4[] = { 4, 3, // X size, Y size
FLOOR, FLOOR, FLOOR, FLOOR, // Pattern to look for
FLOOR, FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR, FLOOR,
0, 0, 0, 0, // Pattern to sub
0, 70, 71, 0,
0, 0, 0, 0};
static const byte L3TITE5[] = { 3, 4, // X size, Y size
FLOOR, FLOOR, FLOOR, // Pattern to look for
FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR,
0, 0, 0, // Pattern to sub
0, 73, 0,
0, 72, 0,
0, 0, 0};
static const byte L3TITE6[] = { 5, 4, // X size, Y size
FLOOR, FLOOR, FLOOR, FLOOR, FLOOR, // Pattern to look for
FLOOR, FLOOR, FLOOR, 0, FLOOR,
FLOOR, FLOOR, FLOOR, 0, FLOOR,
FLOOR, FLOOR, FLOOR, FLOOR, FLOOR,
0, 0, 0, 0, 0, // Pattern to sub
0, 77, 78, 0, 0,
0, 76, 74, 75, 0,
0, 0, 0, 0, 0};
static const byte L3TITE7[] = { 4, 5, // X size, Y size
FLOOR, FLOOR, FLOOR, FLOOR, // Pattern to look for
FLOOR, FLOOR, 0, FLOOR,
FLOOR, FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR, FLOOR,
0, 0, 0, 0, // Pattern to sub
0, 83, 0, 0,
0, 82, 80, 0,
0, 81, 79, 0,
0, 0, 0, 0};
static const byte L3TITE8[] = { 3, 3, // X size, Y size
FLOOR, FLOOR, FLOOR, // Pattern to look for
FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR,
0, 0, 0, // Pattern to sub
0, 52, 0,
0, 0, 0};
static const byte L3TITE9[] = { 3, 3, // X size, Y size
FLOOR, FLOOR, FLOOR, // Pattern to look for
FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR,
0, 0, 0, // Pattern to sub
0, 53, 0,
0, 0, 0};
static const byte L3TITE10[] = { 3, 3, // X size, Y size
FLOOR, FLOOR, FLOOR, // Pattern to look for
FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR,
0, 0, 0, // Pattern to sub
0, 54, 0,
0, 0, 0};
static const byte L3TITE11[] = { 3, 3, // X size, Y size
FLOOR, FLOOR, FLOOR, // Pattern to look for
FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR,
0, 0, 0, // Pattern to sub
0, 67, 0,
0, 0, 0};
static const byte L3TITE12[] = { 2, 1, // X size, Y size
LEFT_WALL, FLOOR, // Pattern to look for
68, 0}; // Pattern to sub
static const byte L3TITE13[] = { 1, 2, // X size, Y size
TOP_WALL, // Pattern to look for
FLOOR,
69, // Pattern to sub
0};
static const byte L3CREV1[] = { 2, 1, // X size, Y size
FILL, FLOOR, // Pattern to look for
84, 85}; // Pattern to sub
static const byte L3CREV2[] = { 2, 1, // X size, Y size
FILL, UL_WALL, // Pattern to look for
86, 87}; // Pattern to sub
static const byte L3CREV3[] = { 1, 2, // X size, Y size
FILL, // Pattern to look for
TOP_WALL,
89, // Pattern to sub
88};
static const byte L3CREV4[] = { 2, 1, // X size, Y size
FILL, FLOOR, // Pattern to look for
90, 91}; // Pattern to sub
static const byte L3CREV5[] = { 1, 2, // X size, Y size
FILL, // Pattern to look for
UL_WALL,
92, // Pattern to sub
93};
static const byte L3CREV6[] = { 1, 2, // X size, Y size
FILL, // Pattern to look for
TOP_WALL,
95, // Pattern to sub
94};
static const byte L3CREV7[] = { 2, 1, // X size, Y size
FILL, FLOOR, // Pattern to look for
96, 101}; // Pattern to sub
static const byte L3CREV8[] = { 1, 2, // X size, Y size
BOTTOM_WALL, // Pattern to look for
FILL,
102, // Pattern to sub
97};
static const byte L3CREV9[] = { 2, 1, // X size, Y size
UR_WALL, FILL, // Pattern to look for
103, 98}; // Pattern to sub
static const byte L3CREV10[] = { 2, 1, // X size, Y size
RIGHT_WALL, FILL, // Pattern to look for
104, 99}; // Pattern to sub
static const byte L3CREV11[] = { 1, 2, // X size, Y size
LR_WALL, // Pattern to look for
FILL,
105, // Pattern to sub
100};
static const byte L3ISLE1[] = { 2, 3, // X size, Y size
UL_ISLE, UR_ISLE, // Pattern to look for
RIGHT_WALL, LEFT_WALL,
LL_ISLE, LR_ISLE,
7, 7, // Pattern to sub
7, 7,
7, 7};
static const byte L3ISLE2[] = { 3, 2, // X size, Y size
UL_ISLE, BOTTOM_WALL, UR_ISLE, // Pattern to look for
LL_ISLE, TOP_WALL, LR_ISLE,
7, 7, 7, // Pattern to sub
7, 7, 7};
static const byte L3ISLE3[] = { 2, 3, // X size, Y size
UL_ISLE, UR_ISLE, // Pattern to look for
RIGHT_WALL, LEFT_WALL,
LL_ISLE, LR_ISLE,
29, 30, // Pattern to sub
25, 28,
31, 32};
static const byte L3ISLE4[] = { 3, 2, // X size, Y size
UL_ISLE, BOTTOM_WALL, UR_ISLE, // Pattern to look for
LL_ISLE, TOP_WALL, LR_ISLE,
29, 26, 30, // Pattern to sub
31, 27, 32};
static const byte L3ISLE5[] = { 2, 2, // X size, Y size
UL_ISLE, UR_ISLE, // Pattern to look for
LL_ISLE, LR_ISLE,
7, 7, // Pattern to sub
7, 7};
static const byte L3XTRA1[] = { 1, 1, // X size, Y size
FLOOR, // Pattern to look for
106}; // Pattern to sub
static const byte L3XTRA2[] = { 1, 1, // X size, Y size
FLOOR, // Pattern to look for
107}; // Pattern to sub
static const byte L3XTRA3[] = { 1, 1, // X size, Y size
FLOOR, // Pattern to look for
108}; // Pattern to sub
static const byte L3XTRA4[] = { 1, 1, // X size, Y size
LEFT_WALL, // Pattern to look for
109}; // Pattern to sub
static const byte L3XTRA5[] = { 1, 1, // X size, Y size
TOP_WALL, // Pattern to look for
110}; // Pattern to sub
static const byte L3ANVIL[] = { 11, 11,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 29, 26, 26, 26, 26, 26, 30, 0, 0,
0, 29, 34, 33, 33, 37, 36, 33, 35, 30, 0,
0, 25, 33, 37, 27, 32, 31, 36, 33, 28, 0,
0, 25, 37, 32, 7, 7, 7, 31, 27, 32, 0,
0, 25, 28, 7, 7, 7, 7, BOTTOM_WALL, BOTTOM_WALL, BOTTOM_WALL, 0,
0, 25, 35, 30, 7, 7, 7, 29, 26, 30, 0,
0, 25, 33, 35, 26, 30, 29, 34, 33, 28, 0,
0, 31, 36, 33, 33, 35, 34, 33, 37, 32, 0,
0, 0, 31, 27, 27, 27, 27, 27, 32, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
// JKE begin L6 extras
static const byte L6FILL1[] = { 1, 1, // X size, Y size
FILL, // Pattern to look for
25}; // Pattern to sub
static const byte L6FILL2[] = { 1, 1, // X size, Y size
FILL, // Pattern to look for
26}; // Pattern to sub
static const byte L6FILL3[] = { 1, 1, // X size, Y size
FILL, // Pattern to look for
27}; // Pattern to sub
static const byte L6FILL4[] = { 1, 1, // X size, Y size
FILL, // Pattern to look for
28}; // Pattern to sub
static const byte L6FLOOR1[] = { 1, 1, // X size, Y size
FLOOR, // Pattern to look for
29}; // Pattern to sub
static const byte L6FLOOR2[] = { 1, 1, // X size, Y size
FLOOR, // Pattern to look for
30}; // Pattern to sub
static const byte L6FLOOR3[] = { 1, 1, // X size, Y size
FLOOR, // Pattern to look for
31}; // Pattern to sub
static const byte L6FLOOR4[] = { 1, 1, // X size, Y size
FLOOR, // Pattern to look for
32}; // Pattern to sub
static const byte L6FLOOR5[] = { 3, 3, // X size, Y size
FLOOR,FLOOR,FLOOR, // Pattern to look for
FLOOR,FLOOR,FLOOR,
FLOOR,FLOOR,FLOOR,
0, 0 ,0,
0,126,0,
0, 0 ,0}; // Pattern to sub
static const byte L6FLOOR6[] = { 3, 3, // X size, Y size
FLOOR,FLOOR,FLOOR, // Pattern to look for
FLOOR,FLOOR,FLOOR,
FLOOR,FLOOR,FLOOR,
0, 0 ,0,
0,124,0,
0, 0 ,0}; // Pattern to sub
static const byte L6WALL1[] = { 1, 1, // X size, Y size
LEFT_WALL, // Pattern to look for
33}; // Pattern to sub
static const byte L6WALL2[] = { 1, 1, // X size, Y size
LEFT_WALL, // Pattern to look for
34}; // Pattern to sub
static const byte L6WALL3[] = { 1, 1, // X size, Y size
LEFT_WALL, // Pattern to look for
35}; // Pattern to sub
static const byte L6WALL4[] = { 1, 1, // X size, Y size
LEFT_WALL, // Pattern to look for
36}; // Pattern to sub
static const byte L6WALL5[] = { 1, 1, // X size, Y size
LEFT_WALL, // Pattern to look for
37}; // Pattern to sub
static const byte L6CORNER1[] = { 1, 1, // X size, Y size
UL_WALL, // Pattern to look for
38}; // Pattern to sub
static const byte L6WALL6[] = { 1, 1, // X size, Y size
TOP_WALL, // Pattern to look for
39}; // Pattern to sub
static const byte L6WALL7[] = { 1, 1, // X size, Y size
TOP_WALL, // Pattern to look for
40}; // Pattern to sub
static const byte L6WALL8[] = { 1, 1, // X size, Y size
TOP_WALL, // Pattern to look for
41}; // Pattern to sub
static const byte L6WALL9[] = { 1, 1, // X size, Y size
TOP_WALL, // Pattern to look for
42}; // Pattern to sub
static const byte L6WALL10[] = { 1, 1, // X size, Y size
TOP_WALL, // Pattern to look for
43}; // Pattern to sub
static const byte L6CORNER2[] = { 1, 1, // X size, Y size
UL_WALL, // Pattern to look for
44}; // Pattern to sub
static const byte L6WALL11[] = { 1, 1, // X size, Y size
LEFT_WALL, // Pattern to look for
45}; // Pattern to sub
static const byte L6WALL12[] = { 1, 1, // X size, Y size
LEFT_WALL, // Pattern to look for
46}; // Pattern to sub
static const byte L6WALL13[] = { 1, 1, // X size, Y size
TOP_WALL, // Pattern to look for
47}; // Pattern to sub
static const byte L6WALL14[] = { 1, 1, // X size, Y size
TOP_WALL, // Pattern to look for
48}; // Pattern to sub
static const byte L6CORNER3[] = { 1, 1, // X size, Y size
UL_WALL, // Pattern to look for
49}; // Pattern to sub
static const byte L6CORNER4[] = { 1, 1, // X size, Y size
UL_WALL, // Pattern to look for
50}; // Pattern to sub
//=======================================================================================
// Stalagmites
//=======================================================================================
static const byte L6TITE1[] = { 3, 3, // X size, Y size
FLOOR,FLOOR, FLOOR, // Pattern to look for
FLOOR,FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR,
67, 0, 0, // Pattern to sub
66,51, 0,
0, 0, 0};
static const byte L6TITE2[] = { 3,3, // X size, Y size
FLOOR, FLOOR, FLOOR, // Pattern to look for
FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR,
69, 0, 0, // Pattern to sub
68, 52,0,
0, 0, 0};
static const byte L6TITE3[] = { 3, 3, // X size, Y size
FLOOR, FLOOR, FLOOR, // Pattern to look for
FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR,
70, 0, 0, // Pattern to sub
71, 53, 0,
0, 0, 0};
static const byte L6TITE4[] = { 3, 3, // X size, Y size
FLOOR, FLOOR, FLOOR, // Pattern to look for
FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR,
73, 0, 0, // Pattern to sub
72, 54, 0,
0, 0, 0};
static const byte L6TITE5[] = { 3, 3, // X size, Y size
FLOOR, FLOOR, FLOOR, // Pattern to look for
FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR,
75, 0, 0, // Pattern to sub
74, 55, 0,
0, 0, 0};
static const byte L6TITE6[] = { 3, 3, // X size, Y size
FLOOR, FLOOR, FLOOR, // Pattern to look for
FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR,
77, 0, 0, // Pattern to sub
76, 56, 0,
0, 0, 0};
static const byte L6TITE7[] = { 3, 3, // X size, Y size
FLOOR, FLOOR, FLOOR, // Pattern to look for
FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR,
79, 0, 0, // Pattern to sub
78, 57, 0,
0, 0, 0};
static const byte L6TITE8[] = { 3, 3, // X size, Y size
FLOOR, FLOOR, FLOOR, // Pattern to look for
FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR,
81, 0, 0, // Pattern to sub
80, 58, 0,
0, 0, 0};
static const byte L6TITE9[] = { 3, 3, // X size, Y size
FLOOR, FLOOR, FLOOR, // Pattern to look for
FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR,
83, 0, 0, // Pattern to sub
82, 59, 0,
0, 0, 0};
static const byte L6TITE10[] = { 3, 3, // X size, Y size
FLOOR, FLOOR, FLOOR, // Pattern to look for
FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR,
84, 0, 0, // Pattern to sub
85, 60, 0,
0, 0, 0};
static const byte ACIDISLE1[] = { 2, 3, // X size, Y size
UL_ISLE, UR_ISLE, // Pattern to look for
RIGHT_WALL, LEFT_WALL,
LL_ISLE, LR_ISLE,
7, 7, // Pattern to sub
7, 7,
7, 7};
static const byte ACIDISLE2[] = { 3, 2, // X size, Y size
UL_ISLE, BOTTOM_WALL, UR_ISLE, // Pattern to look for
LL_ISLE, TOP_WALL, LR_ISLE,
7, 7, 7, // Pattern to sub
7, 7, 7};
static const byte ACIDISLE3[] = { 2, 3, // X size, Y size
UL_ISLE, UR_ISLE, // Pattern to look for
RIGHT_WALL, LEFT_WALL,
LL_ISLE, LR_ISLE,
107, 115, // Pattern to sub
119, 122,
131, 123};
static const byte ACIDISLE4[] = { 3, 2, // X size, Y size
UL_ISLE, BOTTOM_WALL, UR_ISLE, // Pattern to look for
LL_ISLE, TOP_WALL, LR_ISLE,
107, 120, 115, // Pattern to sub
131, 121, 123};
static const byte ACIDISLE5[] = { 2, 2, // X size, Y size
UL_ISLE, UR_ISLE, // Pattern to look for
LL_ISLE, LR_ISLE,
7, 7, // Pattern to sub
7, 7};
static const byte L6ACIDTEST[] = { 1, 1, // X size, Y size
FLOOR, // Pattern to look for
131}; // Pattern to sub
static const byte L6ACID1[] = { 4, 4,
FLOOR, FLOOR, FLOOR, FLOOR, // Pattern to look for
FLOOR, FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR, FLOOR,
7, 7 , 7 ,7,
7,107,115,7,
7,131,123,7,
7, 7 , 7 ,7};
static const byte L6ACID2[] = { 4, 4,
FLOOR, FLOOR, FLOOR, FLOOR, // Pattern to look for
FLOOR, FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR, FLOOR,
7, 7 , 7 ,7,
7, 7 ,108,7,
7,109,112,7,
7, 7 , 7 ,7};
static const byte L6ACID3[] = { 4, 5,
FLOOR, FLOOR, FLOOR, FLOOR, // Pattern to look for
FLOOR, FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR, FLOOR,
7, 7 , 7 ,7,
7,107,115,7,
7,119,122,7,
7,131,123,7,
7, 7 , 7 ,7};
static const byte L6ACID4[] = { 4, 5,
FLOOR, FLOOR, FLOOR, FLOOR, // Pattern to look for
FLOOR, FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR, FLOOR,
FLOOR, FLOOR, FLOOR, FLOOR,
7, 7 , 7 ,7,
7,126,108,7,
7, 7 ,117,7,
7,109,112,7,
7, 7 , 7 ,7};
static int abyssx;
static BYTE lavapool;
/*-----------------------------------------------------------------------*
**-----------------------------------------------------------------------*/
static void InitL3Dungeon() {
ZeroMemory(dungeon,sizeof(dungeon));
int i, j;
for (i = 0; i < MDMAXY; i++) {
for (j = 0; j < MDMAXX; j++) {
dungeon[j][i] = D3_NULL;
dflags[j][i] = 0;
}
}
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*
void DRLG_LoadL3SP()
{
setloadflag = FALSE;
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*
void DRLG_FreeL3SP() {
DiabloFreePtr(pSetPiece);
}
/*-----------------------------------------------------------------------*
**-----------------------------------------------------------------------*
void DRLG_L3SetRoom(int rx1, int ry1)
{
int rw,rh;
int i,j;
byte *sp;
sp = pSetPiece;
rw = *sp;
sp+=2;
rh = *sp;
sp+=2;
setpc_x = rx1;
setpc_y = ry1;
setpc_w = rw;
setpc_h = rh;
sp = pSetPiece+4;
for (j = 0; j < rh; j++) {
for (i = 0; i < rw; i++) {
if (*sp != 0) {
dungeon[rx1+i][ry1+j] = *sp;
dflags[rx1+i][ry1+j] |= SETP_BIT;
} else dungeon[rx1+i][ry1+j] = FLOOR;
sp+=2;
}
}
}
/*-----------------------------------------------------------------------*
**-----------------------------------------------------------------------*/
static int DRLG_L3FillRoom(int x1, int y1, int x2, int y2)
{
int i,j,v,rv,rf;
if ((x1 > 1) && (x2 < (MDMAXX-6)) && (y1 > 1) && (y2 < (MDMAXY-2))) {
v = 0;
for (j = y1; j <= y2; j++) {
for (i = x1; i <= x2; i++) v += dungeon[i][j];
}
if (v == 0) {
for (j = (y1+1); j < y2; j++) {
for (i = (x1+1); i < x2; i++) dungeon[i][j] = 1;
}
for (j = y1; j <= y2; j++) {
rf = random(0, 2);
if (rf != 0) dungeon[x1][j] = 1;
rf = random(0, 2);
if (rf != 0) dungeon[x2][j] = 1;
}
for (i = x1; i <= x2; i++) {
rf = random(0, 2);
if (rf != 0) dungeon[i][y1] = 1;
rf = random(0, 2);
if (rf != 0) dungeon[i][y2] = 1;
}
rv = FR_TRUE;
} else rv = FR_FALSE;
} else rv = FR_FALSE;
return (rv);
}
/*-----------------------------------------------------------------------*
**-----------------------------------------------------------------------*/
static void DRLG_L3CreateBlock(int x, int y, int obs, int dir)
{
int blksizex, blksizey, cbd;
int x1,y1,x2,y2;
int contflag;
blksizex = random(0, 2) + 3; // 3-5 width and height
blksizey = random(0, 2) + 3;
if (dir == BLK_U) {
y2 = y - 1;
y1 = y2 - blksizey;
if (blksizex < obs) x1 = random(0, blksizex) + x;
if (blksizex == obs) x1 = x;
if (blksizex > obs) x1 = x - random(0, blksizex);
x2 = x1 + blksizex;
}
if (dir == BLK_L) {
x2 = x - 1;
x1 = x2 - blksizex;
if (blksizey < obs) y1 = random(0, blksizey) + y;
if (blksizey == obs) y1 = y;
if (blksizey > obs) y1 = y - random(0, blksizey);
y2 = y1 + blksizey;
}
if (dir == BLK_D) {
y1 = y + 1;
y2 = y1 + blksizey;
if (blksizex < obs) x1 = random(0, blksizex) + x;
if (blksizex == obs) x1 = x;
if (blksizex > obs) x1 = x - random(0, blksizex);
x2 = x1 + blksizex;
}
if (dir == BLK_R) {
x1 = x + 1;
x2 = x1 + blksizex;
if (blksizey < obs) y1 = random(0, blksizey) + y;
if (blksizey == obs) y1 = y;
if (blksizey > obs) y1 = y - random(0, blksizey);
y2 = y1 + blksizey;
}
contflag = DRLG_L3FillRoom(x1,y1,x2,y2);
if (contflag == FR_TRUE) {
cbd = random(0, 4);
if ((cbd != 0) && (dir != BLK_D)) DRLG_L3CreateBlock(x1,y1,blksizey,BLK_U);
if ((cbd != 0) && (dir != BLK_L)) DRLG_L3CreateBlock(x2,y1,blksizex,BLK_R);
if ((cbd != 0) && (dir != BLK_U)) DRLG_L3CreateBlock(x1,y2,blksizey,BLK_D);
if ((cbd != 0) && (dir != BLK_R)) DRLG_L3CreateBlock(x1,y1,blksizex,BLK_L);
}
}
/*-----------------------------------------------------------------------*
**-----------------------------------------------------------------------*/
static void DRLG_L3FloorArea(int x1, int y1, int x2, int y2)
{
int i,j;
for (j = y1; j <= y2; j++) {
for (i = x1; i <= x2; i++) dungeon[i][j] = 1;
}
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
static void DRLG_L3FillDiags()
{
int i,j,v,rv;
for (j = 0; j < (MDMAXY-1); j++) {
for (i = 0; i < (MDMAXX-1); i++) {
v = dungeon[i][j] << 3; // x8
v += dungeon[i+1][j] << 2; // x4
v += dungeon[i][j+1] << 1; // x2
v += dungeon[i+1][j+1];
if (v == 6) {
rv = random(0, 2);
if (rv == 0) dungeon[i][j] = 1;
else dungeon[i+1][j+1] = 1;
}
if (v == 9) {
rv = random(0, 2);
if (rv == 0) dungeon[i+1][j] = 1;
else dungeon[i][j+1] = 1;
}
}
}
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
static void DRLG_L3FillSingles()
{
int i,j,v;
for (j = 1; j < (MDMAXY-1); j++) {
for (i = 1; i < (MDMAXX-1); i++) {
if (dungeon[i][j] == 0) {
v = dungeon[i-1][j-1] + dungeon[i][j-1] + dungeon[i+1][j-1];
if (v == 3) {
v = dungeon[i-1][j] + dungeon[i+1][j];
if (v == 2) {
v = dungeon[i-1][j+1] + dungeon[i][j+1] + dungeon[i+1][j+1];
if (v == 3) dungeon[i][j] = 1;
}
}
}
}
}
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
static void DRLG_L3FillStraights()
{
int i,j;
int xc,xs;
int yc,ys;
int k,rv;
for (j = 0; j < (MDMAXY-1); j++) {
xc = 0;
for (i = 0; i < (MDMAXX-3); i++) {
if ((dungeon[i][j] == 0) && (dungeon[i][j+1] == 1)) {
if (xc == 0) xs = i;
xc++;
} else {
if ((xc > 3) && (random(0, 2))) {
for (k = xs; k < i; k++) {
rv = random(0, 2);
dungeon[k][j] = rv;
}
}
xc = 0;
}
}
}
for (j = 0; j < (MDMAXY-1); j++) {
xc = 0;
for (i = 0; i < (MDMAXX-3); i++) {
if ((dungeon[i][j] == 1) && (dungeon[i][j+1] == 0)) {
if (xc == 0) xs = i;
xc++;
} else {
if ((xc > 3) && (random(0, 2))) {
for (k = xs; k < i; k++) {
rv = random(0, 2);
dungeon[k][j+1] = rv;
}
}
xc = 0;
}
}
}
for (i = 0; i < (MDMAXX-1); i++) {
yc = 0;
for (j = 0; j < (MDMAXY-3); j++) {
if ((dungeon[i][j] == 0) && (dungeon[i+1][j] == 1)) {
if (yc == 0) ys = j;
yc++;
} else {
if ((yc > 3) && (random(0, 2))) {
for (k = ys; k < j; k++) {
rv = random(0, 2);
dungeon[i][k] = rv;
}
}
yc = 0;
}
}
}
for (i = 0; i < (MDMAXX-1); i++) {
yc = 0;
for (j = 0; j < (MDMAXY-3); j++) {
if ((dungeon[i][j] == 1) && (dungeon[i+1][j] == 0)) {
if (yc == 0) ys = j;
yc++;
} else {
if ((yc > 3) && (random(0, 2))) {
for (k = ys; k < j; k++) {
rv = random(0, 2);
dungeon[i+1][k] = rv;
}
}
yc = 0;
}
}
}
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
static void DRLG_L3Edges()
{
int i,j;
for (j = 0; j < MDMAXY; j++) dungeon[MDMAXX-1][j] = 0;
for (i = 0; i < MDMAXX; i++) dungeon[i][MDMAXY-1] = 0;
}
/*-----------------------------------------------------------------------*
**-----------------------------------------------------------------------*/
static int DRLG_L3GetFloorArea()
{
int i,j,gfa;
gfa = 0;
for (j = 0; j < MDMAXY; j++) {
for (i = 0; i < MDMAXX; i++) gfa += dungeon[i][j];
}
return(gfa);
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
static void DRLG_L3MakeMegas()
{
int i,j,k,v;
for (j = 0; j < (MDMAXY-1); j++) {
for (i = 0; i < (MDMAXX-1); i++) {
v = dungeon[i][j] << 3;
v += dungeon[i+1][j] << 2;
v += dungeon[i][j+1] << 1;
v += dungeon[i+1][j+1];
if (v == 6) {
k = random(0, 2);
if (k == 0) v = 12;
else v = 5;
}
if (v == 9) {
k = random(0, 2);
if (k == 0) v = 13;
else v = 14;
}
dungeon[i][j] = L3ConvTbl[v];
}
dungeon[MDMAXX-1][j] = L3_DIRT;
}
for (i = 0; i < MDMAXX; i++) dungeon[i][MDMAXY-1] = L3_DIRT;
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
static void DRLG_L3River()
{
int rx, ry, px, py;
int dir, pdir, nodir, nodir2, dircheck;
int river[3][100], rivercnt, riveramt;
int i, j;
int trys, found, bridge, lpcnt, bail;
riveramt = 0;
found = 0;
trys = 0;
while (trys < 200 && riveramt < 4) {
found = 0;
while (found == 0 && trys < 200) {
rivercnt = 0;
trys++;
rx = 0;
ry = 0;
bail = 0;
while ((dungeon[rx][ry] < 25 || dungeon[rx][ry] > 28) && (bail < 100)) {
rx = random(0, MDMAXX);
ry = random(0, MDMAXY);
bail++;
while ((dungeon[rx][ry] < 25 || dungeon[rx][ry] > 28) && (ry < MDMAXY)) {
rx ++;
if (rx >= MDMAXX) {
rx = 0;
ry++;
}
}
}
if (bail >= 100) return;
switch (dungeon[rx][ry]) {
case 25:
dir = WEST;
nodir = EAST;
river[2][rivercnt] = 40;
break;
case 26:
dir = NORTH;
nodir = SOUTH;
river[2][rivercnt] = 38;
break;
case 27:
dir = SOUTH;
nodir = NORTH;
river[2][rivercnt] = 41;
break;
case 28:
dir = EAST;
nodir = WEST;
river[2][rivercnt] = 39;
break;
}
river[0][rivercnt] = rx;
river[1][rivercnt] = ry;
rivercnt++;
nodir2 = 4;
dircheck = 0;
while (dircheck < 4 && rivercnt < 100) {
px = rx;
py = ry;
if (dircheck == 0) dir = random(0, 4);
else dir = (dir + 1) & 3;
dircheck++;
while (dir == nodir || dir == nodir2) {
dir = (dir + 1) & 3;
dircheck++;
}
if (dir == NORTH && ry > 0) ry--;
if (dir == SOUTH && ry < MDMAXY) ry++;
if (dir == EAST && rx < MDMAXX) rx++;
if (dir == WEST && rx > 0) rx--;
if (dungeon[rx][ry] == 7) {
dircheck = 0;
if (dir < EAST) river[2][rivercnt] = 17 + (BYTE)random(0, 2);
if (dir > SOUTH) river[2][rivercnt] = 15 + (BYTE)random(0, 2);
river[0][rivercnt] = rx;
river[1][rivercnt] = ry;
rivercnt++;
if ((dir == NORTH && pdir == EAST) || (dir == WEST && pdir == SOUTH)) {
if (rivercnt > 2) river[2][rivercnt-2] = 22;
if (dir == NORTH) nodir2 = SOUTH;
else nodir2 = EAST;
}
if ((dir == NORTH && pdir == WEST) || (dir == EAST && pdir == SOUTH)) {
if (rivercnt > 2) river[2][rivercnt-2] = 21;
if (dir == NORTH) nodir2 = SOUTH;
else nodir2 = WEST;
}
if ((dir == SOUTH && pdir == EAST) || (dir == WEST && pdir == NORTH)) {
if (rivercnt > 2) river[2][rivercnt-2] = 20;
if (dir == SOUTH) nodir2 = NORTH;
else nodir2 = EAST;
}
if ((dir == SOUTH && pdir == WEST) || (dir == EAST && pdir == NORTH)) {
if (rivercnt > 2) river[2][rivercnt-2] = 19;
if (dir == SOUTH) nodir2 = NORTH;
else nodir2 = WEST;
}
pdir = dir;
}
else {
rx = px;
ry = py;
}
}
if (dir == NORTH && dungeon[rx][ry-1] == 10 && dungeon[rx][ry-2] == 8) {
river[0][rivercnt] = rx;
river[1][rivercnt] = ry-1;
river[2][rivercnt] = 24;
if (pdir == EAST) river[2][rivercnt-1] = 22;
if (pdir == WEST) river[2][rivercnt-1] = 21;
found = 1;
}
if (dir == SOUTH && dungeon[rx][ry+1] == 2 && dungeon[rx][ry+2] == 8) {
river[0][rivercnt] = rx;
river[1][rivercnt] = ry+1;
river[2][rivercnt] = 42;
if (pdir == EAST) river[2][rivercnt-1] = 20;
if (pdir == WEST) river[2][rivercnt-1] = 19;
found = 1;
}
if (dir == EAST && dungeon[rx+1][ry] == 4 && dungeon[rx+2][ry] == 8) {
river[0][rivercnt] = rx+1;
river[1][rivercnt] = ry;
river[2][rivercnt] = 43;
if (pdir == NORTH) river[2][rivercnt-1] = 19;
if (pdir == SOUTH) river[2][rivercnt-1] = 21;
found = 1;
}
if (dir == WEST && dungeon[rx-1][ry] == 9 && dungeon[rx-2][ry] == 8) {
river[0][rivercnt] = rx-1;
river[1][rivercnt] = ry;
river[2][rivercnt] = 23;
if (pdir == NORTH) river[2][rivercnt-1] = 20;
if (pdir == SOUTH) river[2][rivercnt-1] = 22;
found = 1;
}
}
if (found == 1 && rivercnt < 7) found = 0;
if (found == 1) {
bridge = 0;
lpcnt = 0;
while (bridge == 0 && lpcnt < 30) {
lpcnt++;
i = random(0, rivercnt);
if (((river[2][i] == 15) || (river[2][i] == 16)) &&
(dungeon[(river[0][i])][(river[1][i])-1] == 7) && (dungeon[(river[0][i])][(river[1][i])+1] == 7))
bridge = 1;
if (((river[2][i] == 17) || (river[2][i] == 18)) &&
(dungeon[(river[0][i])-1][(river[1][i])] == 7) && (dungeon[(river[0][i])+1][(river[1][i])] == 7))
bridge = 2;
for (j = 0; j < rivercnt && bridge != 0; j++) {
if ((bridge == 1) && ((river[1][i] - 1 == river[1][j]) || (river[1][i] + 1 == river[1][j])) &&
(river[0][i] == river[0][j])) bridge = 0;
if ((bridge == 2) && ((river[0][i] - 1 == river[0][j]) || (river[0][i] + 1 == river[0][j])) &&
(river[1][i] == river[1][j])) bridge = 0;
}
}
if (bridge != 0) {
if (bridge == 1) river[2][i] = 44;
else river[2][i] = 45;
riveramt++;
for (i = 0; i <= rivercnt; i++) dungeon[(river[0][i])][(river[1][i])] = river[2][i];
}
else found = 0;
}
}
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
static int DRLG_L3SpawnEdge(int x, int y, int * totarea)
{
BYTE i;
static const BYTE spawntable[] = {0x00,0x0a,0x43,0x05,0x2c,0x06,0x09,0x00,0x00,0x1c,0x83,0x06,0x09,0x0a,0x05};
if ((*totarea) > 40) return 1;
if (x < 0 || y < 0 || x >= MDMAXX || y >= MDMAXY) return 1;
if ((dungeon[x][y] & 0x80) != 0) return 0;
if (dungeon[x][y] > 15) return 1;
i = dungeon[x][y];
dungeon[x][y] |= 0x80;
(*totarea)++;
if (((spawntable[i] & 0x08) != 0) && ((DRLG_L3SpawnEdge (x, y-1, totarea)) == 1)) return 1;
if (((spawntable[i] & 0x04) != 0) && ((DRLG_L3SpawnEdge (x, y+1, totarea)) == 1)) return 1;
if (((spawntable[i] & 0x02) != 0) && ((DRLG_L3SpawnEdge (x+1, y, totarea)) == 1)) return 1;
if (((spawntable[i] & 0x01) != 0) && ((DRLG_L3SpawnEdge (x-1, y, totarea)) == 1)) return 1;
if (((spawntable[i] & 0x80) != 0) && ((DRLG_L3Spawn (x, y-1, totarea)) == 1)) return 1;
if (((spawntable[i] & 0x40) != 0) && ((DRLG_L3Spawn (x, y+1, totarea)) == 1)) return 1;
if (((spawntable[i] & 0x20) != 0) && ((DRLG_L3Spawn (x+1, y, totarea)) == 1)) return 1;
if (((spawntable[i] & 0x10) != 0) && ((DRLG_L3Spawn (x-1, y, totarea)) == 1)) return 1;
return 0;
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
static int DRLG_L3Spawn(int x, int y, int * totarea)
{
BYTE i;
static const BYTE spawntable[] = {0x00,0x0a,0x03,0x05,0x0c,0x06,0x09,0x00,0x00,0x0c,0x03,0x06,0x09,0x0a,0x05};
if ((*totarea) > 40) return 1;
if (x < 0 || y < 0 || x >= MDMAXX || y >= MDMAXY) return 1;
if ((dungeon[x][y] & 0x80) != 0) return 0;
if (dungeon[x][y] > 15) return 1;
i = dungeon[x][y];
dungeon[x][y] |= 0x80;
(*totarea)++;
if (i != 8) {
if (((spawntable[i] & 0x08) != 0) && ((DRLG_L3SpawnEdge (x, y-1, totarea)) == 1)) return 1;
if (((spawntable[i] & 0x04) != 0) && ((DRLG_L3SpawnEdge (x, y+1, totarea)) == 1)) return 1;
if (((spawntable[i] & 0x02) != 0) && ((DRLG_L3SpawnEdge (x+1, y, totarea)) == 1)) return 1;
if (((spawntable[i] & 0x01) != 0) && ((DRLG_L3SpawnEdge (x-1, y, totarea)) == 1)) return 1;
}
else {
if ((DRLG_L3Spawn (x+1, y, totarea)) == 1) return 1;
if ((DRLG_L3Spawn (x-1, y, totarea)) == 1) return 1;
if ((DRLG_L3Spawn (x, y+1, totarea)) == 1) return 1;
if ((DRLG_L3Spawn (x, y-1, totarea)) == 1) return 1;
}
return 0;
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
static void DRLG_L3Pool()
{
int i, j, found;
int dunx, duny;
int totarea, poolchance;
BYTE k;
static const BYTE poolsub[] = {0,35,26,36,25,29,34,7,33,28,27,37,32,31,30};
for (duny = 0; duny < MDMAXY; duny++) {
for (dunx = 0; dunx < MDMAXX; dunx++) {
if (dungeon[dunx][duny] == 8) {
dungeon[dunx][duny] |= 0x80;
totarea = 1;
found = 0;
if (dunx+1 < MDMAXX && found == 0) found = DRLG_L3Spawn (dunx+1, duny, &totarea);
else found = 1;
if (dunx-1 > 0 && found == 0) found = DRLG_L3Spawn (dunx-1, duny, &totarea);
else found = 1;
if (duny+1 < MDMAXY && found == 0) found = DRLG_L3Spawn (dunx, duny+1, &totarea);
else found = 1;
if (duny-1 > 0 && found == 0) found = DRLG_L3Spawn (dunx, duny-1, &totarea);
else found = 1;
poolchance = random(0, 100);
for (i = duny-totarea; i < duny+totarea; i++) {
for (j = dunx-totarea; j < dunx+totarea; j++) {
if ((dungeon[j][i] & 0x80) != 0 && i >= 0 && i < MDMAXY && j >= 0 && j < MDMAXX) {
dungeon[j][i] &= 0x7f;
if (totarea > 4 && poolchance < 25 && found == 0) {
k = poolsub[(dungeon[j][i])];
if (k != 0 && k <= 37)
dungeon[j][i] = k;
lavapool = TRUE;
}
}
}
}
}
}
}
}
static void AcidPool()
{
int i, j, found;
int dunx, duny;
int totarea, poolchance;
BYTE k;
static const BYTE poolsub[] = {0,133,120,125,119,107,132,7,134,122,121,118,123,131,115};
for (duny = 0; duny < MDMAXY; duny++) {
for (dunx = 0; dunx < MDMAXX; dunx++) {
if (dungeon[dunx][duny] == 8) {
dungeon[dunx][duny] |= 0x80;
totarea = 1;
found = 0;
if (dunx+1 < MDMAXX && found == 0) found = DRLG_L3Spawn (dunx+1, duny, &totarea);
else found = 1;
if (dunx-1 > 0 && found == 0) found = DRLG_L3Spawn (dunx-1, duny, &totarea);
else found = 1;
if (duny+1 < MDMAXY && found == 0) found = DRLG_L3Spawn (dunx, duny+1, &totarea);
else found = 1;
if (duny-1 > 0 && found == 0) found = DRLG_L3Spawn (dunx, duny-1, &totarea);
else found = 1;
poolchance = random(0, 100);
for (i = duny-totarea; i < duny+totarea; i++) {
for (j = dunx-totarea; j < dunx+totarea; j++) {
if ((dungeon[j][i] & 0x80) != 0 && i >= 0 && i < MDMAXY && j >= 0 && j < MDMAXX) {
dungeon[j][i] &= 0x7f;
if (totarea > 4 && poolchance < 25 && found == 0) {
k = poolsub[(dungeon[j][i])];
if (k != 0 && k <= 131)
dungeon[j][i] = k;
lavapool = TRUE;
}
}
}
}
}
}
}
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
static void DRLG_L3PoolFix()
{
int dunx, duny;
for (duny = 0; duny < MDMAXY; duny++) {
for (dunx = 0; dunx < MDMAXX; dunx++) {
if ((dungeon[dunx][duny] == 8) &&
((dungeon[dunx-1][duny-1] >= 25 && dungeon[dunx-1][duny-1] <= 41) &&
(dungeon[dunx-1][duny] >= 25 && dungeon[dunx-1][duny] <= 41) &&
(dungeon[dunx-1][duny+1] >= 25 && dungeon[dunx-1][duny+1] <= 41) &&
(dungeon[dunx][duny-1] >= 25 && dungeon[dunx][duny-1] <= 41) &&
//(dungeon[dunx][duny] >= 25 && dungeon[dunx][duny+1] <= 41) &&
(dungeon[dunx][duny+1] >= 25 && dungeon[dunx][duny+1] <= 41) &&
(dungeon[dunx+1][duny-1] >= 25 && dungeon[dunx+1][duny-1] <= 41) &&
(dungeon[dunx+1][duny] >= 25 && dungeon[dunx+1][duny] <= 41) &&
(dungeon[dunx+1][duny+1] >= 25 && dungeon[dunx+1][duny+1] <= 41)))
dungeon[dunx][duny] = 33;
}
}
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
static void AcidPoolFix()
{
int dunx, duny;
for (duny = 0; duny < MDMAXY; duny++) {
for (dunx = 0; dunx < MDMAXX; dunx++)
{
if ((dungeon[dunx][duny] == 8) &&
((dungeon[dunx-1][duny-1] >= 107 && dungeon[dunx-1][duny-1] <= 135) ||
(dungeon[dunx-1][duny] >= 107 && dungeon[dunx-1][duny] <= 135) ||
(dungeon[dunx-1][duny+1] >= 107 && dungeon[dunx-1][duny+1] <= 135) ||
(dungeon[dunx][duny-1] >= 107 && dungeon[dunx][duny-1] <= 135) ||
//(dungeon[dunx][duny] >= 25 && dungeon[dunx][duny+1] <= 41) &&
(dungeon[dunx][duny+1] >= 107 && dungeon[dunx][duny+1] <= 135) ||
(dungeon[dunx+1][duny-1] >= 107 && dungeon[dunx+1][duny-1] <= 135) ||
(dungeon[dunx+1][duny] >= 107 && dungeon[dunx+1][duny] <= 135) ||
(dungeon[dunx+1][duny+1] >= 107 && dungeon[dunx+1][duny+1] <= 135)))
dungeon[dunx][duny] = 134;
if ((dungeon[dunx][duny] < 7) &&
((dungeon[dunx+1][duny] >= 107 && dungeon[dunx+1][duny] <= 135) ||
(dungeon[dunx][duny-1] >= 107 && dungeon[dunx][duny-1] <= 135)))
dungeon[dunx][duny] = 131;
}
}
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
static int DRLG_L3PlaceMiniSet(const byte miniset[], int tmin, int tmax, int cx, int cy, int setview, int ldir)
{
int sx, sy;
int sw, sh;
int xx, yy;
int i, ii, numt;
int found, trys;
// Width and height of the mini set piece
sw = miniset[0];
sh = miniset[1];
// Number of pieces to place
if ((tmax - tmin) == 0) numt = 1;
else numt = random(0, tmax - tmin) + tmin;
for (i = 0; i < numt; i++) {
// Random starting pos
sx = random(0, MDMAXX-sw);
sy = random(0, MDMAXY-sh);
// Find a location for the mini set piece
found = 0;
trys = 0;
while ((found == 0) && (trys < 200)) {
trys++;
found = 1;
// if (((sx >= SP3x1) && (sx <= SP3x2)) && ((sy >= SP3y1) && (sy <= SP3y2))) found = 0;
if ((cx != -1) && (sx >= (cx - sw)) && (sx <= (cx + 12))) {
sx = random(0, MDMAXX-sw);
sy = random(0, MDMAXY-sh);
found = 0;
}
if ((cy != -1) && (sy >= (cy - sh)) && (sy <= (cy + 12))) {
sx = random(0, MDMAXX-sw);
sy = random(0, MDMAXY-sh);
found = 0;
}
ii = 2;
for (yy = 0; ((yy < sh) && (found == 1)); yy++) {
for (xx = 0; ((xx < sw) && (found == 1)); xx++) {
if ((miniset[ii] != 0) && (dungeon[sx+xx][sy+yy] != miniset[ii])) found = 0;
if (dflags[sx+xx][sy+yy] != 0) found = 0;
ii++;
}
}
if (found == 0) {
sx++;
if (sx == (MDMAXX - sw)) {
sx = 0;
sy++;
if (sy == (MDMAXY - sh)) sy = 0;
}
}
}
if (trys >= 200) return 1;
// Place mini set piece
ii = (sh * sw) + 2;
for (yy = 0; yy < sh; yy++) {
for (xx = 0; xx < sw; xx++) {
if (miniset[ii] != 0) dungeon[sx+xx][sy+yy] = miniset[ii];
ii++;
}
}
}
if (setview == 1) {
ViewX = (sx << 1) + (DIRTEDGED2) + 1;
ViewY = (sy << 1) + (DIRTEDGED2) + 3;
}
if (ldir == LVL_DOWN) {
LvlViewX = (sx << 1) + (DIRTEDGED2) + 1;
LvlViewY = (sy << 1) + (DIRTEDGED2) + 3;
}
return 0;
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
static void DRLG_L3PlaceRndSet(const byte miniset[], int rndper)
{
int sx, sy;
int sw, sh;
int xx, yy;
int ii, kk;
int found;
// Width and height of the mini set piece
sw = miniset[0];
sh = miniset[1];
// Find a location for the mini set piece
for (sy = 0; sy < (MDMAXY - sh); sy++) {
for (sx = 0; sx < (MDMAXX - sw); sx++) {
found = 1;
ii = 2;
// if (((sx >= SP3x1) && (sx <= SP3x2)) && ((sy >= SP3y1) && (sy <= SP3y2))) found = 0;
for (yy = 0; ((yy < sh) && (found == 1)); yy++) {
for (xx = 0; ((xx < sw) && (found == 1)); xx++) {
if ((miniset[ii] != 0) && (dungeon[sx+xx][sy+yy] != miniset[ii])) found = 0;
if (dflags[sx+xx][sy+yy] != 0) found = 0;
ii++;
}
}
kk = (sh * sw) + 2;
if (miniset[kk] >= 84 && miniset[kk] <=100 && found == 1) {
if (dungeon[sx-1][sy] >= 84 && dungeon[sx-1][sy] <= 100) found = 0;
if (dungeon[sx+1][sy] >= 84 && dungeon[sx-1][sy] <= 100) found = 0;
if (dungeon[sx][sy+1] >= 84 && dungeon[sx-1][sy] <= 100) found = 0;
if (dungeon[sx][sy-1] >= 84 && dungeon[sx-1][sy] <= 100) found = 0;
}
if ((found == 1) && (random(0, 100) < rndper)) {
// Place mini set piece
for (yy = 0; yy < sh; yy++) {
for (xx = 0; xx < sw; xx++) {
if (miniset[kk] != 0) dungeon[sx+xx][sy+yy] = miniset[kk];
kk++;
}
}
}
}
}
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
static unsigned char DRLG_L3PlaceAcidPool(const byte miniset[], int rndper)
{
int sx, sy;
int sw, sh;
int xx, yy;
int ii, kk;
int found;
unsigned char made = 0;
// Width and height of the mini set piece
sw = miniset[0];
sh = miniset[1];
// Find a location for the mini set piece
for (sy = 0; sy < (MDMAXY - sh); sy++) {
for (sx = 0; sx < (MDMAXX - sw); sx++) {
found = 1;
ii = 2;
// if (((sx >= SP3x1) && (sx <= SP3x2)) && ((sy >= SP3y1) && (sy <= SP3y2))) found = 0;
for (yy = 0; ((yy < sh) && (found == 1)); yy++) {
for (xx = 0; ((xx < sw) && (found == 1)); xx++) {
if ((miniset[ii] != 0) && (dungeon[sx+xx][sy+yy] != miniset[ii])) found = 0;
if (dflags[sx+xx][sy+yy] != 0) found = 0;
ii++;
}
}
kk = (sh * sw) + 2;
if (miniset[kk] >= 84 && miniset[kk] <=100 && found == 1) {
if (dungeon[sx-1][sy] >= 84 && dungeon[sx-1][sy] <= 100) found = 0;
if (dungeon[sx+1][sy] >= 84 && dungeon[sx-1][sy] <= 100) found = 0;
if (dungeon[sx][sy+1] >= 84 && dungeon[sx-1][sy] <= 100) found = 0;
if (dungeon[sx][sy-1] >= 84 && dungeon[sx-1][sy] <= 100) found = 0;
}
if ((found == 1) && (random(0, 100) < rndper)) {
// Place mini set piece
made = 1;
for (yy = 0; yy < sh; yy++) {
for (xx = 0; xx < sw; xx++) {
if (miniset[kk] != 0) dungeon[sx+xx][sy+yy] = miniset[kk];
kk++;
}
}
}
}
}
return made;
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
static void DRLG_L3Abyss()
{
int ax, sf, j;
ax = MDMAXX - 1;
sf = 0;
while (sf == 0) {
for (j = 0; (j < MDMAXY) && (sf == 0); j++)
if (dungeon[ax][j] != 8) sf = 1;
if (sf == 0) ax--;
}
abyssx = (ax << 1) + (DIRTEDGED2);
for (j = 0; j < MDMAXY; j++) {
if (dungeon[ax][j] == 8) dungeon[ax][j] = 111;
if (dungeon[ax][j] == 2 || dungeon[ax][j] == 6) dungeon[ax][j] = 120;
if (dungeon[ax][j] == 3 || dungeon[ax][j] == 10) dungeon[ax][j] = 112;
if (dungeon[ax][j] < 111) dungeon[ax][j] = 7;
if ((j & 0x0001) == 0) dungeon[ax+1][j] = 114;
else dungeon[ax+1][j] = 113;
if ((j & 0x0001) == 0) dungeon[ax+2][j] = 115;
else dungeon[ax+2][j] = 116;
if ((j & 0x0001) == 0) dungeon[ax+3][j] = 118;
else dungeon[ax+3][j] = 117;
}
for (ax += 4; ax < MDMAXX; ax++)
for (j = 0; j < MDMAXY; j++) dungeon[ax][j] = 119;
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
static BOOL WoodVertU(int i, int y)
{
if ((dungeon[i+1][y] > 152 || dungeon[i+1][y] < 130) &&
(dungeon[i-1][y] > 152 || dungeon[i-1][y] < 130))
{
if (dungeon[i][y] == 7) return TRUE;
if (dungeon[i][y] == 10) return TRUE;
if (dungeon[i][y] == 126) return TRUE;
if (dungeon[i][y] == 129) return TRUE;
if (dungeon[i][y] == 134) return TRUE;
if (dungeon[i][y] == 136) return TRUE;
}
return FALSE;
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
static BOOL WoodVertD(int i, int y)
{
if ((dungeon[i+1][y] > 152 || dungeon[i+1][y] < 130) &&
(dungeon[i-1][y] > 152 || dungeon[i-1][y] < 130))
{
if (dungeon[i][y] == 7) return TRUE;
if (dungeon[i][y] == 2) return TRUE;
if (dungeon[i][y] == 134) return TRUE;
if (dungeon[i][y] == 136) return TRUE;
}
return FALSE;
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
static BOOL WoodHorizL(int x, int j)
{
if ((dungeon[x][j+1] > 152 || dungeon[x][j+1] < 130) &&
(dungeon[x][j-1] > 152 || dungeon[x][j-1] < 130))
{
if (dungeon[x][j] == 7) return TRUE;
if (dungeon[x][j] == 9) return TRUE;
if (dungeon[x][j] == 121) return TRUE;
if (dungeon[x][j] == 124) return TRUE;
if (dungeon[x][j] == 135) return TRUE;
if (dungeon[x][j] == 137) return TRUE;
}
return FALSE;
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
static BOOL WoodHorizR(int x, int j)
{
if ((dungeon[x][j+1] > 152 || dungeon[x][j+1] < 130) &&
(dungeon[x][j-1] > 152 || dungeon[x][j-1] < 130))
{
if (dungeon[x][j] == 7) return TRUE;
if (dungeon[x][j] == 4) return TRUE;
if (dungeon[x][j] == 135) return TRUE;
if (dungeon[x][j] == 137) return TRUE;
}
return FALSE;
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
void AddFenceDoors(void)
/*-----------------------------------------------------------------------**
** DESCRIPTION: Adds doors to open spaces in fence lines
** INPUT: None
** RETURN: None
/*-----------------------------------------------------------------------*/
{
int i, j;
for (j = 0; j < MDMAXY; j++) {
for (i = 0; i < MDMAXX; i++) {
//Add horizontal doors
if (dungeon[i][j] == FLOOR &&
((dungeon[i-1][j] <= 152 && dungeon[i-1][j] >= 130) &&
(dungeon[i+1][j] <= 152 && dungeon[i+1][j] >= 130)))
dungeon[i][j] = WOOD_HORIZGATE;
//Add vertical doors
else if (dungeon[i][j] == FLOOR &&
((dungeon[i][j-1] <= 152 && dungeon[i][j-1] >= 130) &&
(dungeon[i][j+1] <= 152 && dungeon[i][j+1] >= 130)))
dungeon[i][j] = WOOD_VERTGATE;
}
}
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
void FenceDoorFix(void)
/*-----------------------------------------------------------------------**
** DESCRIPTION: Fixes any free standing doors. This removes any doors which
** are not attached to a fence line.
** INPUT: None
** RETURN: None
/*-----------------------------------------------------------------------*/
{
int i, j;
for (j = 0; j < MDMAXY; j++) {
for (i = 0; i < MDMAXX; i++) {
if (dungeon[i][j] == WOOD_HORIZGATE &&
((dungeon[i+1][j] > 152 || dungeon[i+1][j] < 130) ||
(dungeon[i-1][j] > 152 || dungeon[i-1][j] < 130)))
dungeon[i][j] = FLOOR;
else if (dungeon[i][j] == WOOD_HORIZGATE &&
dungeon[i+1][j] != 130 && dungeon[i-1][j] != 130 &&
dungeon[i+1][j] != 132 && dungeon[i-1][j] != 132 &&
dungeon[i+1][j] != 133 && dungeon[i-1][j] != 133 &&
dungeon[i+1][j] != 134 && dungeon[i-1][j] != 134 &&
dungeon[i+1][j] != 136 && dungeon[i-1][j] != 136 &&
dungeon[i+1][j] != 138 && dungeon[i-1][j] != 138 &&
dungeon[i+1][j] != 140 && dungeon[i-1][j] != 140)
dungeon[i][j] = FLOOR;
else if (dungeon[i][j] == WOOD_VERTGATE &&
((dungeon[i][j+1] > 152 || dungeon[i][j+1] < 130) ||
(dungeon[i][j-1] > 152 || dungeon[i][j-1] < 130)))
dungeon[i][j] = FLOOR;
else if (dungeon[i][j] == WOOD_VERTGATE &&
dungeon[i][j+1] != 131 && dungeon[i][j-1] != 131 &&
dungeon[i][j+1] != 132 && dungeon[i][j-1] != 132 &&
dungeon[i][j+1] != 133 && dungeon[i][j-1] != 133 &&
dungeon[i][j+1] != 135 && dungeon[i][j-1] != 135 &&
dungeon[i][j+1] != 137 && dungeon[i][j-1] != 137 &&
dungeon[i][j+1] != 138 && dungeon[i][j-1] != 138 &&
dungeon[i][j+1] != 139 && dungeon[i][j-1] != 139)
dungeon[i][j] = FLOOR;
}
}
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
static void DRLG_L3Wood()
{
int i,j;
int x,y;
int xx,yy;
int rt, rp, skip;
int x1,y1,x2,y2;
// Put wood in walls/corners
for (j = 0; j < MDMAXY-1; j++) {
for (i = 0; i < MDMAXX-1; i++) {
if ((dungeon[i][j] == 10) && (random(0, 2))) {
x = i;
while (dungeon[x][j] == 10) x++;
x--;
if ((x - i) > 0) {
dungeon[i][j] = 127;
for (xx = i+1; xx < x; xx++) {
if (random(0, 2)) dungeon[xx][j] = 126;
else dungeon[xx][j] = 129;
}
dungeon[x][j] = 128;
}
}
if ((dungeon[i][j] == 9) && (random(0, 2))) {
y = j;
while (dungeon[i][y] == 9) y++;
y--;
if ((y - j) > 0) {
dungeon[i][j] = 123;
for (yy = j+1; yy < y; yy++) {
if (random(0, 2)) dungeon[i][yy] = 121;
else dungeon[i][yy] = 124;
}
dungeon[i][y] = 122;
}
}
if ((dungeon[i][j] == 11) && (dungeon[i+1][j] == 10) && (dungeon[i][j+1] == 9) && (random(0, 2))) {
dungeon[i][j] = 125;
x = i+1;
while (dungeon[x][j] == 10) x++;
x--;
for (xx = i+1; xx < x; xx++) {
if (random(0, 2)) dungeon[xx][j] = 126;
else dungeon[xx][j] = 129;
}
dungeon[x][j] = 128;
y = j+1;
while (dungeon[i][y] == 9) y++;
y--;
for (yy = j+1; yy < y; yy++) {
if (random(0, 2)) dungeon[i][yy] = 121;
else dungeon[i][yy] = 124;
}
dungeon[i][y] = 122;
}
}
}
// Put wood lines in
for (j = 0; j < MDMAXY; j++)
{
for (i = 0; i < MDMAXX; i++)
{
if ((dungeon[i][j] == FLOOR) && (random(0, 1) == 0) &&
(SkipThemeRoom(i, j)))
{
rt = random(0, 2);
x1 = 0;
y1 = 0;
//Create vertical fence
if (rt == 0) {
y1 = j;
while (WoodVertU(i,y1)) y1--;
y1++;
y2 = j;
while (WoodVertD(i,y2)) y2++;
y2--;
rp = 1;
if (dungeon[i][y1] == FLOOR) rp = 0;
if (dungeon[i][y2] == FLOOR) rp = 0;
if (((y2 - y1) > 1) && (rp != 0)) {
skip = random(0, y2 - y1 - 1) + y1 + 1;
for (y = y1; y <= y2; y++) {
if (y != skip) {
if (dungeon[i][y] == FLOOR) {
if (random(0, 2)) dungeon[i][y] = 135;
else dungeon[i][y] = 137;
}
if (dungeon[i][y] == 10) dungeon[i][y] = 131;
if (dungeon[i][y] == 126) dungeon[i][y] = 133;
if (dungeon[i][y] == 129) dungeon[i][y] = 133;
if (dungeon[i][y] == 2) dungeon[i][y] = 139;
if (dungeon[i][y] == 134) dungeon[i][y] = 138;
if (dungeon[i][y] == 136) dungeon[i][y] = 138;
}
}
}
}
//Create horizontal fence
if (rt == 1) {
x1 = i;
while (WoodHorizL(x1,j)) x1--;
x1++;
x2 = i;
while (WoodHorizR(x2,j)) x2++;
x2--;
rp = 1;
if (dungeon[x1][j] == FLOOR) rp = 0;
if (dungeon[x2][j] == FLOOR) rp = 0;
if (((x2 - x1) > 1) && (rp != 0)) {
skip = random(0, x2 - x1 - 1) + x1 + 1;
for (x = x1; x <= x2; x++) {
if (x != skip) {
if (dungeon[x][j] == FLOOR) {
if (random(0, 2)) dungeon[x][j] = 134;
else dungeon[x][j] = 136;
}
if (dungeon[x][j] == 9) dungeon[x][j] = 130;
if (dungeon[x][j] == 121) dungeon[x][j] = 132;
if (dungeon[x][j] == 124) dungeon[x][j] = 132;
if (dungeon[x][j] == 4) dungeon[x][j] = 140;
if (dungeon[x][j] == 135) dungeon[x][j] = 138;
if (dungeon[x][j] == 137) dungeon[x][j] = 138;
}
}
}
}
}
}
}
//Add doors to fences
AddFenceDoors();
FenceDoorFix();
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*
void DRLG_L3FTVR(int i, int j, int x, int y, int d)
{
if ((dTransVal[x][y] == 0) && (dungeon[i][j] == FLOOR)) {
dTransVal[x][y] = TransVal;
dTransVal[x+1][y] = TransVal;
dTransVal[x][y+1] = TransVal;
dTransVal[x+1][y+1] = TransVal;
DRLG_L3FTVR(i+1,j, x+2,y, 1);
DRLG_L3FTVR(i-1,j, x-2,y, 2);
DRLG_L3FTVR(i,j+1, x,y+2, 3);
DRLG_L3FTVR(i,j-1, x,y-2, 4);
DRLG_L3FTVR(i-1,j-1, x-2,y-2, 5);
DRLG_L3FTVR(i+1,j-1, x+2,y-2, 6);
DRLG_L3FTVR(i-1,j+1, x-2,y+2, 7);
DRLG_L3FTVR(i+1,j+1, x+2,y+2, 8);
} else {
if (d == 1) {
dTransVal[x][y] = TransVal;
dTransVal[x+1][y] = TransVal;
dTransVal[x][y+1] = TransVal;
dTransVal[x+1][y+1] = TransVal;
}
if (d == 2) {
dTransVal[x+1][y] = TransVal;
dTransVal[x+1][y+1] = TransVal;
}
if (d == 3) {
dTransVal[x][y] = TransVal;
dTransVal[x+1][y] = TransVal;
dTransVal[x][y+1] = TransVal;
dTransVal[x+1][y+1] = TransVal;
}
if (d == 4) {
dTransVal[x][y+1] = TransVal;
dTransVal[x+1][y+1] = TransVal;
}
if (d == 5) dTransVal[x+1][y+1] = TransVal;
if (d == 6) dTransVal[x][y+1] = TransVal;
if (d == 7) dTransVal[x+1][y] = TransVal;
if (d == 8) dTransVal[x][y] = TransVal;
}
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*
void DRLG_L3FloodTVal()
{
int i, j;
int xx,yy;
yy = DIRTEDGED2;
for (j = 0; j < MDMAXY; j++) {
xx = DIRTEDGED2;
for (i = 0; i < MDMAXX; i++) {
if ((dungeon[i][j] == FLOOR) && (dTransVal[xx][yy] == 0)) {
DRLG_L3FTVR(i,j,xx,yy,0);
TransVal++;
}
xx += 2;
}
yy += 2;
}
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*
void DRLG_L3TransFix()
{
int i, j;
int xx,yy;
yy = DIRTEDGED2;
for (j = 0; j < MDMAXY; j++) {
xx = DIRTEDGED2;
for (i = 0; i < MDMAXX; i++) {
if ((dungeon[i][j] == UR_WALL) && (dungeon[i][j-1] == LEFT_WALL)) {
dTransVal[xx+1][yy] = dTransVal[xx][yy];
dTransVal[xx+1][yy+1] = dTransVal[xx][yy];
}
if ((dungeon[i][j] == LL_WALL) && (dungeon[i+1][j] == TOP_WALL)) {
dTransVal[xx][yy+1] = dTransVal[xx][yy];
dTransVal[xx+1][yy+1] = dTransVal[xx][yy];
}
if (dungeon[i][j] == LEFT_WALL) {
dTransVal[xx+1][yy] = dTransVal[xx][yy];
dTransVal[xx+1][yy+1] = dTransVal[xx][yy];
}
if (dungeon[i][j] == TOP_WALL) {
dTransVal[xx][yy+1] = dTransVal[xx][yy];
dTransVal[xx+1][yy+1] = dTransVal[xx][yy];
}
if (dungeon[i][j] == LR_WALL) {
dTransVal[xx+1][yy] = dTransVal[xx][yy];
dTransVal[xx][yy+1] = dTransVal[xx][yy];
dTransVal[xx+1][yy+1] = dTransVal[xx][yy];
}
xx += 2;
}
yy += 2;
}
yy = DMAXY - DIRTEDGED2 - 2;
for (j = 0; j < MDMAXY; j++) {
xx = DMAXX - DIRTEDGED2 - 2;
for (i = 0; i < MDMAXX; i++) {
if ((dTransVal[xx-1][yy] != 0) ||
(dTransVal[xx][yy-1] != 0) ||
(dTransVal[xx-1][yy-1] != 0)) {
dTransVal[xx][yy] = 1;
dTransVal[xx+1][yy] = 1;
dTransVal[xx][yy+1] = 1;
dTransVal[xx+1][yy+1] = 1;
}
xx -= 2;
}
yy -= 2;
}
for (j = 0; j < DMAXY; j++) {
for (i = 0; i < DMAXX; i++) {
if (dTransVal[i][j] != 0) dTransVal[i][j] = 1;
}
}
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
int DRLG_L3Anvil()
{
int sx, sy;
int sw, sh;
int xx, yy;
int ii;
int found, trys;
// Width and height of the mini set piece
sw = L3ANVIL[0];
sh = L3ANVIL[1];
// Random starting pos
sx = random(0, MDMAXX-sw);
sy = random(0, MDMAXY-sh);
// Find a location for the mini set piece
found = 0;
trys = 0;
while ((found == 0) && (trys < 200)) {
trys++;
found = 1;
// if (((sx >= SP3x1) && (sx <= SP3x2)) && ((sy >= SP3y1) && (sy <= SP3y2))) found = 0;
ii = 2;
for (yy = 0; ((yy < sh) && (found == 1)); yy++) {
for (xx = 0; ((xx < sw) && (found == 1)); xx++) {
if ((L3ANVIL[ii] != 0) && (dungeon[sx+xx][sy+yy] != L3ANVIL[ii])) found = 0;
if (dflags[sx+xx][sy+yy] != 0) found = 0;
ii++;
}
}
if (found == 0) {
sx++;
if (sx == (MDMAXX - sw)) {
sx = 0;
sy++;
if (sy == (MDMAXY - sh)) sy = 0;
}
}
}
if (trys >= 200) return 1;
// Place mini set piece
ii = (sh * sw) + 2;
for (yy = 0; yy < sh; yy++) {
for (xx = 0; xx < sw; xx++) {
if (L3ANVIL[ii] != 0) dungeon[sx+xx][sy+yy] = L3ANVIL[ii];
dflags[sx+xx][sy+yy] |= SETP_BIT;
ii++;
}
}
setpc_x = sx;
setpc_y = sy;
setpc_w = sw;
setpc_h = sh;
return 0;
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
void FixL3Warp()
{
int i, j;
for (j = 0; j < MDMAXY; j++) {
for (i = 0; i < MDMAXX; i++) {
if ((dungeon[i][j] == 125) &&
(dungeon[i+1][j] == 125) &&
(dungeon[i][j+1] == 125) &&
(dungeon[i+1][j+1] == 125)) {
dungeon[i][j] = 156;
dungeon[i+1][j] = 155;
dungeon[i][j+1] = 153;
dungeon[i+1][j+1] = 154;
return;
}
if ((dungeon[i][j] == 5) && (dungeon[i+1][j+1] == 7))
dungeon[i][j] = 7;
}
}
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
void FixL3HallofHeroes()
{
int i, j;
for (j = 0; j < MDMAXY; j++) {
for (i = 0; i < MDMAXX; i++) {
if ((dungeon[i][j] == 5) && (dungeon[i+1][j+1] == 7))
dungeon[i][j] = 7;
}
}
for (j = 0; j < MDMAXY; j++) {
for (i = 0; i < MDMAXX; i++) {
if ((dungeon[i][j] == 5) && (dungeon[i+1][j+1] == 12) && (dungeon[i+1][j] == 7)) {
dungeon[i][j] = 7;
dungeon[i][j+1] = 7;
dungeon[i+1][j+1] = 7;
}
if ((dungeon[i][j] == 5) && (dungeon[i+1][j+1] == 12) && (dungeon[i][j+1] == 7)) {
dungeon[i][j] = 7;
dungeon[i+1][j] = 7;
dungeon[i+1][j+1] = 7;
}
}
}
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
byte lockout[MDMAXX][MDMAXY];
int lockoutcnt;
void DRLG_L3LockRec(int x, int y)
{
if (lockout[x][y] != 0) {
lockout[x][y] = 0;
lockoutcnt++;
DRLG_L3LockRec(x, y-1);
DRLG_L3LockRec(x, y+1);
DRLG_L3LockRec(x-1, y);
DRLG_L3LockRec(x+1, y);
}
}
BOOL DRLG_L3Lockout()
{
int i,j,t;
int fx,fy;
t = 0;
for (j = 0; j < MDMAXY; j++) {
for (i = 0; i < MDMAXX; i++) {
if (dungeon[i][j] != 0) {
lockout[i][j] = 1;
fx = i;
fy = j;
t++;
} else lockout[i][j] = 0;
}
}
lockoutcnt = 0;
DRLG_L3LockRec(fx, fy);
if (t == lockoutcnt) return(TRUE);
return(FALSE);
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
static void DRLG_L3(int entry)
{
int x1, y1, x2, y2, sx1, sy1;
int i, j;
int found;
BOOL genok;
lavapool = FALSE;
do {
do {
do { // do this till MIN AREA is met.
InitL3Dungeon(); // fill dungeon with fill
x1 = random(0, MDMAXX >> 1) + (MDMAXX >> 2); // random number 0-30
y1 = random(0, MDMAXY >> 1) + (MDMAXY >> 2);
x2 = x1 + 2;
y2 = y1 + 2;
DRLG_L3FillRoom(x1,y1,x2,y2); // if empty, randomly fill dungeon with 1s
DRLG_L3CreateBlock(x1,y1,2,BLK_U); // recursively add blocks at random directions
DRLG_L3CreateBlock(x2,y1,2,BLK_R); // starting with the direction listed at the
DRLG_L3CreateBlock(x1,y2,2,BLK_D); // end of the function
DRLG_L3CreateBlock(x1,y1,2,BLK_L);
if (QuestStatus(Q_ANVIL)) { // force this whole area to be a floor
sx1 = random(0, MDMAXX >> 2) + (MDMAXX >> 2);
sy1 = random(0, MDMAXY >> 2) + (MDMAXY >> 2);
DRLG_L3FloorArea(sx1, sy1, sx1+12, sy1+12);
}
DRLG_L3FillDiags();
DRLG_L3FillSingles();
DRLG_L3FillStraights();
DRLG_L3FillDiags();
DRLG_L3Edges();
if (DRLG_L3GetFloorArea() >= MINFAREA) {
genok = DRLG_L3Lockout();
} else genok = FALSE;
} while (! genok);
DRLG_L3MakeMegas();
//*************************************************************
// Place stairs
//*************************************************************
if (entry == LVL_DOWN) {
if (currlevel < HIVESTART)
found = DRLG_L3PlaceMiniSet(L3UP, 1, 1, -1, -1, 1, LVL_DOWN);
else // place stairs down. On first level have town warp stairs
{
if (currlevel != HIVESTART)
found = DRLG_L3PlaceMiniSet(L6UP, 1, 1, -1, -1, 1, LVL_DOWN);
else
found = DRLG_L3PlaceMiniSet(L6HOLDWARP, 1, 1, -1, -1, 1, LVL_TWARPDN); // JKE add hive
}
if (found == 0) // Place stairs down
{
if (currlevel < HIVESTART)
found = DRLG_L3PlaceMiniSet(L3DOWN, 1, 1, -1, -1, 0, LVL_UP);
else
if (currlevel != HIVEEND) // no stairs down on last level
found = DRLG_L3PlaceMiniSet(L6DOWN, 1, 1, -1, -1, 0, LVL_UP);
}
if ((found == 0) && (currlevel == 9))
{
if (currlevel < HIVESTART)
found = DRLG_L3PlaceMiniSet(L3HOLDWARP, 1, 1, -1, -1, 0, LVL_TWARPDN); // add hive level JKE
}
} else {
if (entry == LVL_UP) {
if (currlevel < HIVESTART)
found = DRLG_L3PlaceMiniSet(L3UP, 1, 1, -1, -1, 0, LVL_DOWN);
else
{
if (currlevel != HIVESTART)
found = DRLG_L3PlaceMiniSet(L6UP, 1, 1, -1, -1, 0, LVL_DOWN);
else
found = DRLG_L3PlaceMiniSet(L6HOLDWARP, 1, 1, -1, -1, 0, LVL_TWARPDN); // JKE add hive
}
if (found == 0) {
if (currlevel < HIVESTART)
{
found = DRLG_L3PlaceMiniSet(L3DOWN, 1, 1, -1, -1, 1, LVL_UP);
ViewX += 2;
ViewY -= 2;
}
else
{
if (currlevel != HIVEEND)
{
found = DRLG_L3PlaceMiniSet(L6DOWN, 1, 1, -1, -1, 1, LVL_UP);
ViewX += 2;
ViewY -= 2;
}
}
if ((found == 0) && (currlevel == 9))
if (currlevel < HIVESTART)
found = DRLG_L3PlaceMiniSet(L3HOLDWARP, 1, 1, -1, -1, 0, LVL_TWARPDN); // JKE add hive
}
} else {
if (currlevel < HIVESTART)
found = DRLG_L3PlaceMiniSet(L3UP, 1, 1, -1, -1, 0, LVL_DOWN);
else
{
if (currlevel != HIVESTART)
found = DRLG_L3PlaceMiniSet(L6UP, 1, 1, -1, -1, 0, LVL_DOWN);
else
found = DRLG_L3PlaceMiniSet(L6HOLDWARP, 1, 1, -1, -1, 1, LVL_TWARPDN); // JKE add hive
}
if (found == 0)
if (currlevel < HIVESTART)
found = DRLG_L3PlaceMiniSet(L3DOWN, 1, 1, -1, -1, 0, LVL_UP);
else
if (currlevel != HIVEEND)
found = DRLG_L3PlaceMiniSet(L6DOWN, 1, 1, -1, -1, 0, LVL_UP);
if ((found == 0) && (currlevel == 9))
found = DRLG_L3PlaceMiniSet(L3HOLDWARP, 1, 1, -1, -1, 1, LVL_TWARPDN); // JKE add hive
}
}
if ((found == 0) && QuestStatus(Q_ANVIL))
found = DRLG_L3Anvil();
} while (found == 1);
// if (currlevel < HIVESTART)
// DRLG_L3Abyss();
// JKE temp hack remove lava
if (currlevel < HIVESTART)
DRLG_L3Pool();
else
{
// lavapool = TRUE;
lavapool += DRLG_L3PlaceAcidPool(L6ACID3, 30);
lavapool += DRLG_L3PlaceAcidPool(L6ACID4, 40);
lavapool += DRLG_L3PlaceAcidPool(L6ACID1, 50);
lavapool += DRLG_L3PlaceAcidPool(L6ACID2, 60);
if (lavapool < 3)
lavapool = FALSE;
}
// AcidPool();
} while (!lavapool);
// JKE temp hack remove lava
if (currlevel < HIVESTART)
DRLG_L3PoolFix();
// else
// AcidPoolFix();
if (currlevel < HIVESTART)
FixL3Warp();
// JKE temp hack remove lava
if (currlevel < HIVESTART)
{
DRLG_L3PlaceRndSet(L3ISLE1, 70);
DRLG_L3PlaceRndSet(L3ISLE2, 70);
DRLG_L3PlaceRndSet(L3ISLE3, 30);
DRLG_L3PlaceRndSet(L3ISLE4, 30);
DRLG_L3PlaceRndSet(L3ISLE1, 100);
DRLG_L3PlaceRndSet(L3ISLE2, 100);
DRLG_L3PlaceRndSet(L3ISLE5, 90);
}
else
{
DRLG_L3PlaceRndSet(ACIDISLE1, 70);
DRLG_L3PlaceRndSet(ACIDISLE2, 70);
DRLG_L3PlaceRndSet(ACIDISLE3, 30);
DRLG_L3PlaceRndSet(ACIDISLE4, 30);
DRLG_L3PlaceRndSet(ACIDISLE1, 100);
DRLG_L3PlaceRndSet(ACIDISLE2, 100);
DRLG_L3PlaceRndSet(ACIDISLE5, 90);
}
if (currlevel < HIVESTART)
FixL3HallofHeroes();
// temp hack JKE remove lava
if (currlevel < HIVESTART)
DRLG_L3River();
// this may make other lockouts - (only on lvl10 with anvil quest). . . .
// this is a kludgy fix for anvil quest - the bridge to the anvil was sometimes getting
// blocked by river, this makes the "fake" walls back into the bridge - rjs
if (QuestStatus(Q_ANVIL)) {
dungeon[setpc_x + 7][setpc_y + 5] = 7;
dungeon[setpc_x + 8][setpc_y + 5] = 7;
dungeon[setpc_x + 9][setpc_y + 5] = 7;
if ((dungeon[setpc_x + 10][setpc_y + 5] == 17) ||
(dungeon[setpc_x + 10][setpc_y + 5] == 18)) dungeon[setpc_x + 10][setpc_y + 5] = 45;
}
if (currlevel < HIVESTART)
DRLG_PlaceThemeRooms(5, 10, FLOOR, 0, FALSE);
// temp hack JKE remove most
if (currlevel < HIVESTART)
{
DRLG_L3Wood();
DRLG_L3PlaceRndSet(L3TITE1, 10);
DRLG_L3PlaceRndSet(L3TITE2, 10);
DRLG_L3PlaceRndSet(L3TITE3, 10);
DRLG_L3PlaceRndSet(L3TITE6, 20);
DRLG_L3PlaceRndSet(L3TITE7, 20);
//DRLG_L3PlaceRndSet(L3TITE4, 10);
//DRLG_L3PlaceRndSet(L3TITE5, 10);
DRLG_L3PlaceRndSet(L3TITE8, 20);
DRLG_L3PlaceRndSet(L3TITE9, 20);
DRLG_L3PlaceRndSet(L3TITE10,20);
DRLG_L3PlaceRndSet(L3TITE11,30);
DRLG_L3PlaceRndSet(L3TITE12,20);
DRLG_L3PlaceRndSet(L3TITE13,20);
DRLG_L3PlaceRndSet(L3CREV1, 30);
DRLG_L3PlaceRndSet(L3CREV2, 30);
DRLG_L3PlaceRndSet(L3CREV3, 30);
DRLG_L3PlaceRndSet(L3CREV4, 30);
DRLG_L3PlaceRndSet(L3CREV5, 30);
DRLG_L3PlaceRndSet(L3CREV6, 30);
DRLG_L3PlaceRndSet(L3CREV7, 30);
DRLG_L3PlaceRndSet(L3CREV8, 30);
DRLG_L3PlaceRndSet(L3CREV9, 30);
DRLG_L3PlaceRndSet(L3CREV10,30);
DRLG_L3PlaceRndSet(L3CREV11,30);
DRLG_L3PlaceRndSet(L3XTRA1,25);
DRLG_L3PlaceRndSet(L3XTRA2,25);
DRLG_L3PlaceRndSet(L3XTRA3,25);
DRLG_L3PlaceRndSet(L3XTRA4,25);
DRLG_L3PlaceRndSet(L3XTRA5,25);
}
else // JKE Place our tiles here.
{
// DRLG_L3PlaceRndSet(L6ACIDTEST,25);
DRLG_L3PlaceRndSet(L6FILL1,20); // JKE Tile to sub, and % to exchange.
DRLG_L3PlaceRndSet(L6FILL2,20);
DRLG_L3PlaceRndSet(L6FILL3,20);
DRLG_L3PlaceRndSet(L6FILL4,20);
DRLG_L3PlaceRndSet(L6TITE1,10);
DRLG_L3PlaceRndSet(L6TITE2,15);
DRLG_L3PlaceRndSet(L6TITE3,20);
DRLG_L3PlaceRndSet(L6TITE4,25);
DRLG_L3PlaceRndSet(L6TITE5,30);
DRLG_L3PlaceRndSet(L6TITE6,35);
DRLG_L3PlaceRndSet(L6TITE7,40);
DRLG_L3PlaceRndSet(L6TITE8,45);
DRLG_L3PlaceRndSet(L6TITE9,50);
DRLG_L3PlaceRndSet(L6TITE10,55);
DRLG_L3PlaceRndSet(L6TITE10,10);
DRLG_L3PlaceRndSet(L6TITE9,15);
DRLG_L3PlaceRndSet(L6TITE8,20);
DRLG_L3PlaceRndSet(L6TITE7,25);
DRLG_L3PlaceRndSet(L6TITE6,30);
DRLG_L3PlaceRndSet(L6TITE5,35);
DRLG_L3PlaceRndSet(L6TITE4,40);
DRLG_L3PlaceRndSet(L6TITE3,45);
DRLG_L3PlaceRndSet(L6TITE2,50);
DRLG_L3PlaceRndSet(L6TITE1,55);
DRLG_L3PlaceRndSet(L6FLOOR5,40);
DRLG_L3PlaceRndSet(L6FLOOR6,45);
DRLG_L3PlaceRndSet(L6FLOOR1,25);
DRLG_L3PlaceRndSet(L6FLOOR2,25);
DRLG_L3PlaceRndSet(L6FLOOR3,25);
DRLG_L3PlaceRndSet(L6FLOOR4,25);
DRLG_L3PlaceRndSet(L6WALL1,25);
DRLG_L3PlaceRndSet(L6WALL2,25);
DRLG_L3PlaceRndSet(L6WALL3,25);
DRLG_L3PlaceRndSet(L6WALL4,25);
DRLG_L3PlaceRndSet(L6WALL5,25);
DRLG_L3PlaceRndSet(L6WALL6,25);
DRLG_L3PlaceRndSet(L6WALL7,25);
DRLG_L3PlaceRndSet(L6WALL8,25);
DRLG_L3PlaceRndSet(L6WALL9,25);
DRLG_L3PlaceRndSet(L6WALL10,25);
DRLG_L3PlaceRndSet(L6WALL11,25);
DRLG_L3PlaceRndSet(L6WALL12,25);
DRLG_L3PlaceRndSet(L6WALL13,25);
DRLG_L3PlaceRndSet(L6WALL14,25);
DRLG_L3PlaceRndSet(L6CORNER1,25);
DRLG_L3PlaceRndSet(L6CORNER2,25);
DRLG_L3PlaceRndSet(L6CORNER3,25);
DRLG_L3PlaceRndSet(L6CORNER4,25);
}
for (j = 0; j < MDMAXY; j++) {
for (i = 0; i < MDMAXX; i++) pdungeon[i][j] = dungeon[i][j];
}
extern void DRLG_Init_Globals();
DRLG_Init_Globals();
// DRLG_CheckQuests(SP3x1,SP3y1);
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
static void DRLG_L3Pass3()
{
int i,j,xx,yy;
long v1,v2,v3,v4,lv;
// Init dungeon to dirt
lv = L3_DIRT - 1;
__asm {
mov esi,dword ptr [pMegaTiles]
mov eax,dword ptr [lv];
shl eax,3
add esi,eax
xor eax,eax
lodsw
inc eax
mov dword ptr [v1],eax
lodsw
inc eax
mov dword ptr [v2],eax
lodsw
inc eax
mov dword ptr [v3],eax
lodsw
inc eax
mov dword ptr [v4],eax
}
for (yy = 0; yy < DMAXY; yy+=2) {
for (xx = 0; xx < DMAXX; xx+=2) { //DMAXX = abyssx for abyss
dPiece[xx][yy] = (int) v1;
dPiece[xx+1][yy] = (int) v2;
dPiece[xx][yy+1] = (int) v3;
dPiece[xx+1][yy+1] = (int) v4;
}
}
// Convert dungeon mega tiles to mini tiles
yy = DIRTEDGED2;
for (j = 0; j < MDMAXY; j++) {
xx = DIRTEDGED2;
for (i = 0; i < MDMAXX; i++) {
lv = ((long)dungeon[i][j]) - 1;
if (lv >= 0) {
__asm {
mov esi,dword ptr [pMegaTiles]
mov eax,dword ptr [lv];
shl eax,3
add esi,eax
xor eax,eax
lodsw
inc eax
mov dword ptr [v1],eax
lodsw
inc eax
mov dword ptr [v2],eax
lodsw
inc eax
mov dword ptr [v3],eax
lodsw
inc eax
mov dword ptr [v4],eax
}
} else {
v1 = 0;
v2 = 0;
v3 = 0;
v4 = 0;
}
dPiece[xx][yy] = (int) v1;
dPiece[xx+1][yy] = (int) v2;
dPiece[xx][yy+1] = (int) v3;
dPiece[xx+1][yy+1] = (int) v4;
xx += 2;
}
yy += 2;
}
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
#if IS_VERSION(RETAIL)
void CreateL3Dungeon(unsigned int rseed, int entry)
{
int i,j;
SetRndSeed(rseed);
dminx = DIRTEDGED2;
dminy = DIRTEDGED2;
dmaxx = DMAXX - (DIRTEDGED2);
dmaxy = DMAXY - (DIRTEDGED2);
//DRLG_LoadL3SP();
DRLG_InitTrans(); // initialize transparent values
DRLG_InitSetPC(); // ? sets 4 pc values to 0
DRLG_L3(entry);
DRLG_L3Pass3();
//DRLG_FreeL3SP();
// Special lava lighting!!! JKE
if (currlevel < HIVESTART)
{
for (j = 0; j < DMAXY; j++) {
for (i = 0; i < DMAXX; i++) {
if ((dPiece[i][j] >= 56) && (dPiece[i][j] <= 147)) DoLighting (i, j, 7, -1);
else if ((dPiece[i][j] >= 154) && (dPiece[i][j] <= 161)) DoLighting (i, j, 7, -1);
else if (dPiece[i][j] == 150) DoLighting (i, j, 7, -1);
else if (dPiece[i][j] == 152) DoLighting (i, j, 7, -1);
}
}
}
else
{
for (j = 0; j < DMAXY; j++)
for (i = 0; i < DMAXX; i++)
if ((dPiece[i][j] >= 382) && (dPiece[i][j] <= 457))
DoLighting (i, j, 9, -1);
//dLight[i][j] = 1;
}
DRLG_SetPC();
}
#endif
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
void LoadL3Dungeon(char sFileName[], int vx, int vy)
{
int i, j, rw, rh;
byte *pLevelMap, *lm;
InitL3Dungeon();
dminx = DIRTEDGED2;
dminy = DIRTEDGED2;
dmaxx = DMAXX - (DIRTEDGED2);
dmaxy = DMAXY - (DIRTEDGED2);
DRLG_InitTrans();
pLevelMap = LoadFileInMemSig(sFileName,NULL,'LMPt');
lm = pLevelMap;
rw = *lm;
lm+=2;
rh = *lm;
lm+=2;
for (j = 0; j < rh; j++) {
for (i = 0; i < rw; i++) {
if (*lm != 0) {
dungeon[i][j] = *lm;
} else dungeon[i][j] = FLOOR;
lm+=2;
}
}
for (j = 0; j < MDMAXY; j++) {
for (i = 0; i < MDMAXX; i++)
if (dungeon[i][j] == 0) dungeon[i][j] = L3_DIRT;
}
abyssx = DMAXX;
DRLG_L3Pass3();
extern void DRLG_Init_Globals();
DRLG_Init_Globals();
ViewX = 31;
ViewY = 83;
SetMapMonsters(pLevelMap, 0, 0);
SetMapObjects(pLevelMap, 0, 0);
// Special lava lighting!!!
for (j = 0; j < DMAXY; j++) {
for (i = 0; i < DMAXX; i++) {
if ((dPiece[i][j] >= 56) && (dPiece[i][j] <= 147)) DoLighting (i, j, 7, -1);
else if ((dPiece[i][j] >= 154) && (dPiece[i][j] <= 161)) DoLighting (i, j, 7, -1);
else if (dPiece[i][j] == 150) DoLighting (i, j, 7, -1);
else if (dPiece[i][j] == 152) DoLighting (i, j, 7, -1);
}
}
DiabloFreePtr(pLevelMap);
}
/*-----------------------------------------------------------------------**
**-----------------------------------------------------------------------*/
void LoadPreL3Dungeon(char sFileName[], int vx, int vy)
{
int i, j, rw, rh;
byte *pLevelMap, *lm;
InitL3Dungeon();
DRLG_InitTrans();
pLevelMap = LoadFileInMemSig(sFileName,NULL,'LMPt');
lm = pLevelMap;
rw = *lm;
lm+=2;
rh = *lm;
lm+=2;
for (j = 0; j < rh; j++) {
for (i = 0; i < rw; i++) {
if (*lm != 0) {
dungeon[i][j] = *lm;
} else dungeon[i][j] = FLOOR;
lm+=2;
}
}
for (j = 0; j < MDMAXY; j++) {
for (i = 0; i < MDMAXX; i++)
if (dungeon[i][j] == 0) dungeon[i][j] = L3_DIRT;
}
CopyMemory(pdungeon,dungeon,sizeof(pdungeon));
DiabloFreePtr(pLevelMap);
}