Browse Source

Clean up drlg_l1 door placement

pull/4529/head
Anders Jenbo 4 years ago
parent
commit
5c17c92b01
  1. 336
      Source/drlg_l1.cpp

336
Source/drlg_l1.cpp

@ -24,7 +24,7 @@ namespace {
/** Represents a tile ID map of twice the size, repeating each tile of the original map in blocks of 4. */
BYTE L5dungeon[80][80];
BYTE L5dflags[DMAXX][DMAXY];
uint8_t L5dflags[DMAXX][DMAXY];
/** Specifies whether a single player quest DUN has been loaded. */
bool L5setloadflag;
/** Specifies whether to generate a horizontal room at position 1 in the Cathedral. */
@ -502,6 +502,37 @@ BYTE CornerstoneRoomPattern[27] = {
*/
BYTE L5ConvTbl[16] = { 22, 13, 1, 13, 2, 13, 13, 13, 4, 13, 1, 13, 2, 13, 16, 13 };
enum CathedralTile : uint8_t {
// clang-format off
VWall = 1,
HWall = 2,
Corner = 3,
DWall = 4,
DArch = 5,
VWallEnd = 6,
HWallEnd = 7,
HArchEnd = 8,
VArchEnd = 9,
HArchVWall = 10,
VArch = 11,
HArch = 12,
Floor = 13,
HWallVArch = 14,
Pilar = 15,
DirtCorner = 21,
VDoor = 25,
HDoor = 26,
HFenceVWall = 27,
HDoorVDoor = 28,
VDoorEnd = 30,
HDoorEnd = 31,
VFence = 35,
HFence = 36,
HWallVFence = 37,
EntranceStairs = 64,
// clang-format on
};
void InitCryptPieces()
{
for (int j = 0; j < MAXDUNY; j++) {
@ -515,65 +546,6 @@ void InitCryptPieces()
}
}
void PlaceDoor(int x, int y)
{
if ((L5dflags[x][y] & DLRG_PROTECTED) == 0) {
BYTE df = L5dflags[x][y] & 0x7F;
BYTE c = dungeon[x][y];
if (df == 1) {
if (y != 1 && c == 2)
dungeon[x][y] = 26;
if (y != 1 && c == 7)
dungeon[x][y] = 31;
if (y != 1 && c == 14)
dungeon[x][y] = 42;
if (y != 1 && c == 4)
dungeon[x][y] = 43;
if (x != 1 && c == 1)
dungeon[x][y] = 25;
if (x != 1 && c == 10)
dungeon[x][y] = 40;
if (x != 1 && c == 6)
dungeon[x][y] = 30;
}
if (df == 2) {
if (x != 1 && c == 1)
dungeon[x][y] = 25;
if (x != 1 && c == 6)
dungeon[x][y] = 30;
if (x != 1 && c == 10)
dungeon[x][y] = 40;
if (x != 1 && c == 4)
dungeon[x][y] = 41;
if (y != 1 && c == 2)
dungeon[x][y] = 26;
if (y != 1 && c == 14)
dungeon[x][y] = 42;
if (y != 1 && c == 7)
dungeon[x][y] = 31;
}
if (df == 3) {
if (x != 1 && y != 1 && c == 4)
dungeon[x][y] = 28;
if (x != 1 && c == 10)
dungeon[x][y] = 40;
if (y != 1 && c == 14)
dungeon[x][y] = 42;
if (y != 1 && c == 2)
dungeon[x][y] = 26;
if (x != 1 && c == 1)
dungeon[x][y] = 25;
if (y != 1 && c == 7)
dungeon[x][y] = 31;
if (x != 1 && c == 6)
dungeon[x][y] = 30;
}
}
L5dflags[x][y] = DLRG_PROTECTED;
}
void CryptLavafloor()
{
for (int j = 1; j < 40; j++) {
@ -921,7 +893,7 @@ void FillFloor()
{
for (int j = 0; j < DMAXY; j++) {
for (int i = 0; i < DMAXX; i++) {
if (L5dflags[i][j] == 0 && dungeon[i][j] == 13) {
if (L5dflags[i][j] == 0 && dungeon[i][j] == CathedralTile::Floor) {
int rv = GenerateRnd(3);
if (rv == 1)
@ -1002,7 +974,7 @@ void MapRoom(int x, int y, int width, int height)
{
for (int j = 0; j < height; j++) {
for (int i = 0; i < width; i++) {
dungeon[x + i][y + j] = 1;
dungeon[x + i][y + j] = CathedralTile::VWall;
}
}
}
@ -1106,12 +1078,12 @@ void FirstRoom()
ye = 22;
for (int y = ys; y < ye; y++) {
dungeon[17][y] = 1;
dungeon[18][y] = 1;
dungeon[19][y] = 1;
dungeon[20][y] = 1;
dungeon[21][y] = 1;
dungeon[22][y] = 1;
dungeon[17][y] = CathedralTile::VWall;
dungeon[18][y] = CathedralTile::VWall;
dungeon[19][y] = CathedralTile::VWall;
dungeon[20][y] = CathedralTile::VWall;
dungeon[21][y] = CathedralTile::VWall;
dungeon[22][y] = CathedralTile::VWall;
}
if (VR1)
@ -1147,12 +1119,12 @@ void FirstRoom()
xe = 22;
for (int x = xs; x < xe; x++) {
dungeon[x][17] = 1;
dungeon[x][18] = 1;
dungeon[x][19] = 1;
dungeon[x][20] = 1;
dungeon[x][21] = 1;
dungeon[x][22] = 1;
dungeon[x][17] = CathedralTile::VWall;
dungeon[x][18] = CathedralTile::VWall;
dungeon[x][19] = CathedralTile::VWall;
dungeon[x][20] = CathedralTile::VWall;
dungeon[x][21] = CathedralTile::VWall;
dungeon[x][22] = CathedralTile::VWall;
}
if (HR1)
@ -1174,7 +1146,7 @@ int FindArea()
for (int j = 0; j < DMAXY; j++) {
for (int i = 0; i < DMAXX; i++) { // NOLINT(modernize-loop-convert)
if (dungeon[i][j] == 1)
if (dungeon[i][j] == CathedralTile::VWall)
rv++;
}
}
@ -1265,37 +1237,33 @@ int VerticalWallOk(int i, int j)
return -1;
}
void HorizontalWall(int i, int j, char p, int dx)
void HorizontalWall(int i, int j, CathedralTile p, int dx)
{
int8_t dt;
CathedralTile dt = CathedralTile::HWall;
CathedralTile wt = CathedralTile::HDoor;
switch (GenerateRnd(4)) {
case 0:
case 1:
dt = 2;
case 2: // Add arch
dt = CathedralTile::HArch;
wt = CathedralTile::HArch;
if (p == CathedralTile::HWall)
p = CathedralTile::HArch;
else if (p == CathedralTile::DWall)
p = CathedralTile::HArchVWall;
break;
case 2:
dt = 12;
if (p == 2)
p = 12;
if (p == 4)
p = 10;
case 3: // Add Fence
dt = CathedralTile::HFence;
if (p == CathedralTile::HWall)
p = CathedralTile::HFence;
else if (p == CathedralTile::DWall)
p = CathedralTile::HFenceVWall;
break;
case 3:
dt = 36;
if (p == 2)
p = 36;
if (p == 4)
p = 27;
default:
break;
}
int8_t wt = 26;
if (GenerateRnd(6) == 5)
wt = 12;
if (dt == 12)
wt = 12;
wt = CathedralTile::HArch;
dungeon[i][j] = p;
@ -1305,45 +1273,39 @@ void HorizontalWall(int i, int j, char p, int dx)
int xx = GenerateRnd(dx - 1) + 1;
if (wt == 12) {
dungeon[i + xx][j] = wt;
} else {
dungeon[i + xx][j] = 2;
L5dflags[i + xx][j] |= DLRG_HDOOR;
dungeon[i + xx][j] = wt;
if (wt == CathedralTile::HDoor) {
L5dflags[i + xx][j] |= DLRG_PROTECTED;
}
}
void VerticalWall(int i, int j, char p, int dy)
void VerticalWall(int i, int j, CathedralTile p, int dy)
{
int8_t dt;
CathedralTile dt = CathedralTile::VWall;
CathedralTile wt = CathedralTile::VDoor;
switch (GenerateRnd(4)) {
case 0:
case 1:
dt = 1;
case 2: // Add arch
dt = CathedralTile::VArch;
wt = CathedralTile::VArch;
if (p == CathedralTile::VWall)
p = CathedralTile::VArch;
else if (p == CathedralTile::DWall)
p = CathedralTile::HWallVArch;
break;
case 2:
dt = 11;
if (p == 1)
p = 11;
if (p == 4)
p = 14;
case 3: // Add Fence
dt = CathedralTile::VFence;
if (p == CathedralTile::VWall)
p = CathedralTile::VFence;
else if (p == CathedralTile::DWall)
p = CathedralTile::HWallVFence;
break;
case 3:
dt = 35;
if (p == 1)
p = 35;
if (p == 4)
p = 37;
default:
break;
}
int8_t wt = 25;
if (GenerateRnd(6) == 5)
wt = 11;
if (dt == 11)
wt = 11;
wt = CathedralTile::VArch;
dungeon[i][j] = p;
@ -1353,11 +1315,9 @@ void VerticalWall(int i, int j, char p, int dy)
int yy = GenerateRnd(dy - 1) + 1;
if (wt == 11) {
dungeon[i][j + yy] = wt;
} else {
dungeon[i][j + yy] = 1;
L5dflags[i][j + yy] |= DLRG_VDOOR;
dungeon[i][j + yy] = wt;
if (wt == CathedralTile::VDoor) {
L5dflags[i][j + yy] |= DLRG_PROTECTED;
}
}
@ -1366,46 +1326,46 @@ void AddWall()
for (int j = 0; j < DMAXY; j++) {
for (int i = 0; i < DMAXX; i++) {
if (L5dflags[i][j] == 0) {
if (dungeon[i][j] == 3) {
if (dungeon[i][j] == CathedralTile::Corner) {
AdvanceRndSeed();
int x = HorizontalWallOk(i, j);
if (x != -1) {
HorizontalWall(i, j, 2, x);
HorizontalWall(i, j, CathedralTile::HWall, x);
}
}
if (dungeon[i][j] == 3) {
if (dungeon[i][j] == CathedralTile::Corner) {
AdvanceRndSeed();
int y = VerticalWallOk(i, j);
if (y != -1) {
VerticalWall(i, j, 1, y);
VerticalWall(i, j, CathedralTile::VWall, y);
}
}
if (dungeon[i][j] == 6) {
if (dungeon[i][j] == CathedralTile::VWallEnd) {
AdvanceRndSeed();
int x = HorizontalWallOk(i, j);
if (x != -1) {
HorizontalWall(i, j, 4, x);
HorizontalWall(i, j, CathedralTile::DWall, x);
}
}
if (dungeon[i][j] == 7) {
if (dungeon[i][j] == CathedralTile::HWallEnd) {
AdvanceRndSeed();
int y = VerticalWallOk(i, j);
if (y != -1) {
VerticalWall(i, j, 4, y);
VerticalWall(i, j, CathedralTile::DWall, y);
}
}
if (dungeon[i][j] == 2) {
if (dungeon[i][j] == CathedralTile::HWall) {
AdvanceRndSeed();
int x = HorizontalWallOk(i, j);
if (x != -1) {
HorizontalWall(i, j, 2, x);
HorizontalWall(i, j, CathedralTile::HWall, x);
}
}
if (dungeon[i][j] == 1) {
if (dungeon[i][j] == CathedralTile::VWall) {
AdvanceRndSeed();
int y = VerticalWallOk(i, j);
if (y != -1) {
VerticalWall(i, j, 1, y);
VerticalWall(i, j, CathedralTile::VWall, y);
}
}
}
@ -1416,72 +1376,72 @@ void AddWall()
void GenerateChamber(int sx, int sy, bool topflag, bool bottomflag, bool leftflag, bool rightflag)
{
if (topflag) {
dungeon[sx + 2][sy] = 12;
dungeon[sx + 3][sy] = 12;
dungeon[sx + 4][sy] = 3;
dungeon[sx + 7][sy] = 9;
dungeon[sx + 8][sy] = 12;
dungeon[sx + 9][sy] = 2;
dungeon[sx + 2][sy] = CathedralTile::HArch;
dungeon[sx + 3][sy] = CathedralTile::HArch;
dungeon[sx + 4][sy] = CathedralTile::Corner;
dungeon[sx + 7][sy] = CathedralTile::VArchEnd;
dungeon[sx + 8][sy] = CathedralTile::HArch;
dungeon[sx + 9][sy] = CathedralTile::HWall;
}
if (bottomflag) {
sy += 11;
dungeon[sx + 2][sy] = 10;
dungeon[sx + 3][sy] = 12;
dungeon[sx + 4][sy] = 8;
dungeon[sx + 7][sy] = 5;
dungeon[sx + 8][sy] = 12;
if (dungeon[sx + 9][sy] != 4) {
dungeon[sx + 9][sy] = 21;
dungeon[sx + 2][sy] = CathedralTile::HArchVWall;
dungeon[sx + 3][sy] = CathedralTile::HArch;
dungeon[sx + 4][sy] = CathedralTile::HArchEnd;
dungeon[sx + 7][sy] = CathedralTile::DArch;
dungeon[sx + 8][sy] = CathedralTile::HArch;
if (dungeon[sx + 9][sy] != CathedralTile::DWall) {
dungeon[sx + 9][sy] = CathedralTile::DirtCorner;
}
sy -= 11;
}
if (leftflag) {
dungeon[sx][sy + 2] = 11;
dungeon[sx][sy + 3] = 11;
dungeon[sx][sy + 4] = 3;
dungeon[sx][sy + 7] = 8;
dungeon[sx][sy + 8] = 11;
dungeon[sx][sy + 9] = 1;
dungeon[sx][sy + 2] = CathedralTile::VArch;
dungeon[sx][sy + 3] = CathedralTile::VArch;
dungeon[sx][sy + 4] = CathedralTile::Corner;
dungeon[sx][sy + 7] = CathedralTile::HArchEnd;
dungeon[sx][sy + 8] = CathedralTile::VArch;
dungeon[sx][sy + 9] = CathedralTile::VWall;
}
if (rightflag) {
sx += 11;
dungeon[sx][sy + 2] = 14;
dungeon[sx][sy + 3] = 11;
dungeon[sx][sy + 4] = 9;
dungeon[sx][sy + 7] = 5;
dungeon[sx][sy + 8] = 11;
if (dungeon[sx][sy + 9] != 4) {
dungeon[sx][sy + 9] = 21;
dungeon[sx][sy + 2] = CathedralTile::HWallVArch;
dungeon[sx][sy + 3] = CathedralTile::VArch;
dungeon[sx][sy + 4] = CathedralTile::VArchEnd;
dungeon[sx][sy + 7] = CathedralTile::DArch;
dungeon[sx][sy + 8] = CathedralTile::VArch;
if (dungeon[sx][sy + 9] != CathedralTile::DWall) {
dungeon[sx][sy + 9] = CathedralTile::DirtCorner;
}
sx -= 11;
}
for (int j = 1; j < 11; j++) {
for (int i = 1; i < 11; i++) {
dungeon[i + sx][j + sy] = 13;
dungeon[i + sx][j + sy] = CathedralTile::Floor;
L5dflags[i + sx][j + sy] |= DLRG_CHAMBER;
}
}
dungeon[sx + 4][sy + 4] = 15;
dungeon[sx + 7][sy + 4] = 15;
dungeon[sx + 4][sy + 7] = 15;
dungeon[sx + 7][sy + 7] = 15;
dungeon[sx + 4][sy + 4] = CathedralTile::Pilar;
dungeon[sx + 7][sy + 4] = CathedralTile::Pilar;
dungeon[sx + 4][sy + 7] = CathedralTile::Pilar;
dungeon[sx + 7][sy + 7] = CathedralTile::Pilar;
}
void GenerateHall(int x1, int y1, int x2, int y2)
{
if (y1 == y2) {
for (int i = x1; i < x2; i++) {
dungeon[i][y1] = 12;
dungeon[i][y1 + 3] = 12;
dungeon[i][y1] = CathedralTile::HArch;
dungeon[i][y1 + 3] = CathedralTile::HArch;
}
return;
}
for (int i = y1; i < y2; i++) {
dungeon[x1][i] = 11;
dungeon[x1 + 3][i] = 11;
dungeon[x1][i] = CathedralTile::VArch;
dungeon[x1 + 3][i] = CathedralTile::VArch;
}
}
@ -1624,12 +1584,13 @@ void SetCornerRoom(int rx1, int ry1)
dungeon[rx1 + i][ry1 + j] = CornerstoneRoomPattern[sp];
L5dflags[rx1 + i][ry1 + j] |= DLRG_PROTECTED;
} else {
dungeon[rx1 + i][ry1 + j] = 13;
dungeon[rx1 + i][ry1 + j] = CathedralTile::Floor;
}
sp++;
}
}
}
void Substitution()
{
for (int y = 0; y < DMAXY; y++) {
@ -1689,7 +1650,7 @@ void SetRoom(int rx1, int ry1)
dungeon[rx1 + i][ry1 + j] = tileId;
L5dflags[rx1 + i][ry1 + j] |= DLRG_PROTECTED;
} else {
dungeon[rx1 + i][ry1 + j] = 13;
dungeon[rx1 + i][ry1 + j] = CathedralTile::Floor;
}
}
}
@ -1717,7 +1678,7 @@ void SetCryptRoom(int rx1, int ry1)
dungeon[rx1 + i][ry1 + j] = UberRoomPattern[sp];
L5dflags[rx1 + i][ry1 + j] |= DLRG_PROTECTED;
} else {
dungeon[rx1 + i][ry1 + j] = 13;
dungeon[rx1 + i][ry1 + j] = CathedralTile::Floor;
}
sp++;
}
@ -2027,11 +1988,11 @@ void FixCornerTiles()
{
for (int j = 1; j < DMAXY - 1; j++) {
for (int i = 1; i < DMAXX - 1; i++) {
if ((L5dflags[i][j] & DLRG_PROTECTED) == 0 && dungeon[i][j] == 17 && dungeon[i - 1][j] == 13 && dungeon[i][j - 1] == 1) {
if ((L5dflags[i][j] & DLRG_PROTECTED) == 0 && dungeon[i][j] == 17 && dungeon[i - 1][j] == CathedralTile::Floor && dungeon[i][j - 1] == CathedralTile::VWall) {
dungeon[i][j] = 16;
L5dflags[i][j - 1] &= DLRG_PROTECTED;
}
if (dungeon[i][j] == 202 && dungeon[i + 1][j] == 13 && dungeon[i][j + 1] == 1) {
if (dungeon[i][j] == 202 && dungeon[i + 1][j] == CathedralTile::Floor && dungeon[i][j + 1] == CathedralTile::VWall) {
dungeon[i][j] = 8;
}
}
@ -2259,7 +2220,7 @@ void GenerateLevel(lvl_entry entry)
for (int j = 0; j < DMAXY; j++) {
for (int i = 0; i < DMAXX; i++) {
if (dungeon[i][j] == 64) {
if (dungeon[i][j] == CathedralTile::EntranceStairs) {
int xx = 2 * i + 16; /* todo: fix loop */
int yy = 2 * j + 16;
DRLG_CopyTrans(xx, yy + 1, xx, yy);
@ -2276,13 +2237,6 @@ void GenerateLevel(lvl_entry entry)
}
FixCornerTiles();
for (int j = 0; j < DMAXY; j++) {
for (int i = 0; i < DMAXX; i++) {
if ((L5dflags[i][j] & ~DLRG_PROTECTED) != 0)
PlaceDoor(i, j);
}
}
if (leveltype == DTYPE_CRYPT) {
CryptPatternGroup1(10);
PlaceMiniSetRandom(CryptPattern1, 95);
@ -2382,7 +2336,7 @@ void LoadL1Dungeon(const char *path, int vx, int vy)
dungeon[i][j] = tileId;
L5dflags[i][j] |= DLRG_PROTECTED;
} else {
dungeon[i][j] = 13;
dungeon[i][j] = CathedralTile::Floor;
}
}
}
@ -2428,7 +2382,7 @@ void LoadPreL1Dungeon(const char *path)
dungeon[i][j] = tileId;
L5dflags[i][j] |= DLRG_PROTECTED;
} else {
dungeon[i][j] = 13;
dungeon[i][j] = CathedralTile::Floor;
}
}
}

Loading…
Cancel
Save