From 7f0eb791f8ed96aa8291babab0ef891c390160fe Mon Sep 17 00:00:00 2001 From: galaxyhaxz Date: Sun, 13 Oct 2019 09:48:15 -0500 Subject: [PATCH] Fix function order [drlg_l4.cpp] --- Source/drlg_l4.cpp | 1144 ++++++++++++++++++++++---------------------- Source/drlg_l4.h | 24 - 2 files changed, 572 insertions(+), 596 deletions(-) diff --git a/Source/drlg_l4.cpp b/Source/drlg_l4.cpp index 566d3d82b..e78bb7efa 100644 --- a/Source/drlg_l4.cpp +++ b/Source/drlg_l4.cpp @@ -288,365 +288,7 @@ const BYTE L4BTYPES[140] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -void DRLG_LoadL4SP() -{ - setloadflag_2 = 0; - if (QuestStatus(QTYPE_WARLRD)) { - pSetPiece_2 = (char *)LoadFileInMem("Levels\\L4Data\\Warlord.DUN", NULL); - setloadflag_2 = 1; - } - if (currlevel == 15 && gbMaxPlayers != 1) { - pSetPiece_2 = (char *)LoadFileInMem("Levels\\L4Data\\Vile1.DUN", NULL); - setloadflag_2 = 1; - } -} - -void DRLG_FreeL4SP() -{ - MemFreeDbg(pSetPiece_2); -} - -void DRLG_L4SetSPRoom(int rx1, int ry1) -{ - int rw, rh, i, j; - BYTE *sp; - - rw = (BYTE)pSetPiece_2[0]; - rh = (BYTE)pSetPiece_2[2]; - - setpc_x = rx1; - setpc_y = ry1; - setpc_w = rw; - setpc_h = rh; - - sp = (BYTE *)&pSetPiece_2[4]; - - for (j = 0; j < rh; j++) { - for (i = 0; i < rw; i++) { - if (*sp != 0) { - dungeon[i + rx1][j + ry1] = *sp; - dflags[i + rx1][j + ry1] |= DLRG_PROTECTED; - } else { - dungeon[i + rx1][j + ry1] = 6; - } - sp += 2; - } - } -} - -void L4SaveQuads() -{ - int i, j, x, y; - - y = 0; - for (j = 0; j < 14; j++) { - x = 0; - for (i = 0; i < 14; i++) { - dflags[i + l4holdx][j + l4holdy] = 1; - dflags[DMAXX - 1 - x - l4holdx][j + l4holdy] = 1; - dflags[i + l4holdx][DMAXY - 1 - y - l4holdy] = 1; - dflags[DMAXX - 1 - x - l4holdx][DMAXY - 1 - y - l4holdy] = 1; - x++; - } - y++; - } -} - -void DRLG_L4SetRoom(BYTE *pSetPiece, int rx1, int ry1) -{ - int rw, rh, i, j; - BYTE *sp; - - rw = pSetPiece[0]; - rh = pSetPiece[2]; - sp = &pSetPiece[4]; - - for (j = 0; j < rh; j++) { - for (i = 0; i < rw; i++) { - if (*sp != 0) { - dungeon[i + rx1][j + ry1] = *sp; - dflags[i + rx1][j + ry1] |= DLRG_PROTECTED; - } else { - dungeon[i + rx1][j + ry1] = 6; - } - sp += 2; - } - } -} - -void DRLG_LoadDiabQuads(BOOL preflag) -{ - BYTE *lpSetPiece; - - lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab1.DUN", NULL); - diabquad1x = 4 + l4holdx; - diabquad1y = 4 + l4holdy; - DRLG_L4SetRoom(lpSetPiece, diabquad1x, diabquad1y); - mem_free_dbg(lpSetPiece); - - if (preflag) { - lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab2b.DUN", NULL); - } else { - lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab2a.DUN", NULL); - } - diabquad2x = 27 - l4holdx; - diabquad2y = 1 + l4holdy; - DRLG_L4SetRoom(lpSetPiece, diabquad2x, diabquad2y); - mem_free_dbg(lpSetPiece); - - if (preflag) { - lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab3b.DUN", NULL); - } else { - lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab3a.DUN", NULL); - } - diabquad3x = 1 + l4holdx; - diabquad3y = 27 - l4holdy; - DRLG_L4SetRoom(lpSetPiece, diabquad3x, diabquad3y); - mem_free_dbg(lpSetPiece); - - if (preflag) { - lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab4b.DUN", NULL); - } else { - lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab4a.DUN", NULL); - } - diabquad4x = 28 - l4holdx; - diabquad4y = 28 - l4holdy; - DRLG_L4SetRoom(lpSetPiece, diabquad4x, diabquad4y); - mem_free_dbg(lpSetPiece); -} - -BOOL IsDURWall(char d) -{ - if (d == 25) { - return TRUE; - } - if (d == 28) { - return TRUE; - } - if (d == 23) { - return TRUE; - } - - return FALSE; -} - -BOOL IsDLLWall(char dd) -{ - if (dd == 27) { - return TRUE; - } - if (dd == 26) { - return TRUE; - } - if (dd == 22) { - return TRUE; - } - - return FALSE; -} - -void L4FixRim() -{ - int i, j; - - for (i = 0; i < 20; i++) { - dung[i][0] = 0; - } - for (j = 0; j < 20; j++) { - dung[0][j] = 0; - } -} - -void DRLG_L4GeneralFix() -{ - int i, j; - - for (j = 0; j < DMAXY - 1; j++) { - for (i = 0; i < DMAXX - 1; i++) { - if ((dungeon[i][j] == 24 || dungeon[i][j] == 122) && dungeon[i + 1][j] == 2 && dungeon[i][j + 1] == 5) { - dungeon[i][j] = 17; - } - } - } -} - -void CreateL4Dungeon(DWORD rseed, int entry) -{ - SetRndSeed(rseed); - - dminx = 16; - dminy = 16; - dmaxx = 96; - dmaxy = 96; - - ViewX = 40; - ViewY = 40; - - DRLG_InitSetPC(); - DRLG_LoadL4SP(); - DRLG_L4(entry); - DRLG_L4Pass3(); - DRLG_FreeL4SP(); - DRLG_SetPC(); -} - -void DRLG_L4(int entry) -{ - int i, j, spi, spj, ar; - BOOL doneflag; - - do { - DRLG_InitTrans(); - do { - InitL4Dungeon(); - L4firstRoom(); - L4FixRim(); - ar = GetArea(); - if (ar >= 173) { - uShape(); - } - } while (ar < 173); - L4makeDungeon(); - L4makeDmt(); - L4tileFix(); - if (currlevel == 16) { - L4SaveQuads(); - } - if (QuestStatus(QTYPE_WARLRD) || currlevel == quests[QTYPE_VB]._qlevel && gbMaxPlayers != 1) { - for (spi = SP4x1; spi < SP4x2; spi++) { - for (spj = SP4y1; spj < SP4y2; spj++) { - dflags[spi][spj] = 1; - } - } - } - L4AddWall(); - DRLG_L4FloodTVal(); - DRLG_L4TransFix(); - if (setloadflag_2) { - DRLG_L4SetSPRoom(SP4x1, SP4y1); - } - if (currlevel == 16) { - DRLG_LoadDiabQuads(TRUE); - } - if (QuestStatus(QTYPE_WARLRD)) { - if (entry == 0) { - doneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, 1, 0); - if (doneflag && currlevel == 13) { - doneflag = DRLG_L4PlaceMiniSet(L4TWARP, 1, 1, -1, -1, 0, 6); - } - ViewX++; - } else if (entry == 1) { - doneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, 0, 0); - if (doneflag && currlevel == 13) { - doneflag = DRLG_L4PlaceMiniSet(L4TWARP, 1, 1, -1, -1, 0, 6); - } - ViewX = 2 * setpc_x + 22; - ViewY = 2 * setpc_y + 22; - } else { - doneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, 0, 0); - if (doneflag && currlevel == 13) { - doneflag = DRLG_L4PlaceMiniSet(L4TWARP, 1, 1, -1, -1, 1, 6); - } - ViewX++; - } - } else if (currlevel != 15) { - if (entry == 0) { - doneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, 1, 0); - if (doneflag && currlevel != 16) { - doneflag = DRLG_L4PlaceMiniSet(L4DSTAIRS, 1, 1, -1, -1, 0, 1); - } - if (doneflag && currlevel == 13) { - doneflag = DRLG_L4PlaceMiniSet(L4TWARP, 1, 1, -1, -1, 0, 6); - } - ViewX++; - } else if (entry == 1) { - doneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, 0, 0); - if (doneflag && currlevel != 16) { - doneflag = DRLG_L4PlaceMiniSet(L4DSTAIRS, 1, 1, -1, -1, 1, 1); - } - if (doneflag && currlevel == 13) { - doneflag = DRLG_L4PlaceMiniSet(L4TWARP, 1, 1, -1, -1, 0, 6); - } - ViewY++; - } else { - doneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, 0, 0); - if (doneflag && currlevel != 16) { - doneflag = DRLG_L4PlaceMiniSet(L4DSTAIRS, 1, 1, -1, -1, 0, 1); - } - if (doneflag && currlevel == 13) { - doneflag = DRLG_L4PlaceMiniSet(L4TWARP, 1, 1, -1, -1, 1, 6); - } - ViewX++; - } - } else { - if (entry == 0) { - doneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, 1, 0); - if (doneflag) { - if (gbMaxPlayers == 1 && quests[QTYPE_MOD]._qactive != 2) { - doneflag = DRLG_L4PlaceMiniSet(L4PENTA, 1, 1, -1, -1, 0, 1); - } else { - doneflag = DRLG_L4PlaceMiniSet(L4PENTA2, 1, 1, -1, -1, 0, 1); - } - } - ViewX++; - } else { - doneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, 0, 0); - if (doneflag) { - if (gbMaxPlayers == 1 && quests[QTYPE_MOD]._qactive != 2) { - doneflag = DRLG_L4PlaceMiniSet(L4PENTA, 1, 1, -1, -1, 1, 1); - } else { - doneflag = DRLG_L4PlaceMiniSet(L4PENTA2, 1, 1, -1, -1, 1, 1); - } - } - ViewY++; - } - } - } while (!doneflag); - - DRLG_L4GeneralFix(); - - if (currlevel != 16) { - DRLG_PlaceThemeRooms(7, 10, 6, 8, 1); - } - - DRLG_L4Shadows(); - DRLG_L4Corners(); - DRLG_L4Subs(); - DRLG_Init_Globals(); - - if (QuestStatus(QTYPE_WARLRD)) { - for (j = 0; j < DMAXY; j++) { - for (i = 0; i < DMAXX; i++) { - pdungeon[i][j] = dungeon[i][j]; - } - } - } - - DRLG_CheckQuests(SP4x1, SP4y1); - - if (currlevel == 15) { - for (j = 0; j < DMAXY; j++) { - for (i = 0; i < DMAXX; i++) { - if (dungeon[i][j] == 98) { - Make_SetPC(i - 1, j - 1, 5, 5); - } - if (dungeon[i][j] == 107) { - Make_SetPC(i - 1, j - 1, 5, 5); - } - } - } - } - if (currlevel == 16) { - for (j = 0; j < DMAXY; j++) { - for (i = 0; i < DMAXX; i++) { - pdungeon[i][j] = dungeon[i][j]; - } - } - DRLG_LoadDiabQuads(FALSE); - } -} - -void DRLG_L4Shadows() +static void DRLG_L4Shadows() { int x, y; BOOL okflag; @@ -679,7 +321,7 @@ void DRLG_L4Shadows() } } -void InitL4Dungeon() +static void InitL4Dungeon() { int i, j; @@ -694,7 +336,53 @@ void InitL4Dungeon() } } -void L4makeDmt() +void DRLG_LoadL4SP() +{ + setloadflag_2 = 0; + if (QuestStatus(QTYPE_WARLRD)) { + pSetPiece_2 = (char *)LoadFileInMem("Levels\\L4Data\\Warlord.DUN", NULL); + setloadflag_2 = 1; + } + if (currlevel == 15 && gbMaxPlayers != 1) { + pSetPiece_2 = (char *)LoadFileInMem("Levels\\L4Data\\Vile1.DUN", NULL); + setloadflag_2 = 1; + } +} + +void DRLG_FreeL4SP() +{ + MemFreeDbg(pSetPiece_2); +} + +void DRLG_L4SetSPRoom(int rx1, int ry1) +{ + int rw, rh, i, j; + BYTE *sp; + + rw = (BYTE)pSetPiece_2[0]; + rh = (BYTE)pSetPiece_2[2]; + + setpc_x = rx1; + setpc_y = ry1; + setpc_w = rw; + setpc_h = rh; + + sp = (BYTE *)&pSetPiece_2[4]; + + for (j = 0; j < rh; j++) { + for (i = 0; i < rw; i++) { + if (*sp != 0) { + dungeon[i + rx1][j + ry1] = *sp; + dflags[i + rx1][j + ry1] |= DLRG_PROTECTED; + } else { + dungeon[i + rx1][j + ry1] = 6; + } + sp += 2; + } + } +} + +static void L4makeDmt() { int i, j, val, dmtx, dmty; @@ -709,110 +397,7 @@ void L4makeDmt() } } -void L4AddWall() -{ - int i, j, x, y; - - for (j = 0; j < DMAXY; j++) { - for (i = 0; i < DMAXX; i++) { - if (dflags[i][j] != 0) { - continue; - } - if (dungeon[i][j] == 10 && random(0, 100) < 100) { - x = L4HWallOk(i, j); - if (x != -1) { - L4HorizWall(i, j, x); - } - } - if (dungeon[i][j] == 12 && random(0, 100) < 100) { - x = L4HWallOk(i, j); - if (x != -1) { - L4HorizWall(i, j, x); - } - } - if (dungeon[i][j] == 13 && random(0, 100) < 100) { - x = L4HWallOk(i, j); - if (x != -1) { - L4HorizWall(i, j, x); - } - } - if (dungeon[i][j] == 15 && random(0, 100) < 100) { - x = L4HWallOk(i, j); - if (x != -1) { - L4HorizWall(i, j, x); - } - } - if (dungeon[i][j] == 16 && random(0, 100) < 100) { - x = L4HWallOk(i, j); - if (x != -1) { - L4HorizWall(i, j, x); - } - } - if (dungeon[i][j] == 21 && random(0, 100) < 100) { - x = L4HWallOk(i, j); - if (x != -1) { - L4HorizWall(i, j, x); - } - } - if (dungeon[i][j] == 22 && random(0, 100) < 100) { - x = L4HWallOk(i, j); - if (x != -1) { - L4HorizWall(i, j, x); - } - } - if (dungeon[i][j] == 8 && random(0, 100) < 100) { - y = L4VWallOk(i, j); - if (y != -1) { - L4VertWall(i, j, y); - } - } - if (dungeon[i][j] == 9 && random(0, 100) < 100) { - y = L4VWallOk(i, j); - if (y != -1) { - L4VertWall(i, j, y); - } - } - if (dungeon[i][j] == 11 && random(0, 100) < 100) { - y = L4VWallOk(i, j); - if (y != -1) { - L4VertWall(i, j, y); - } - } - if (dungeon[i][j] == 14 && random(0, 100) < 100) { - y = L4VWallOk(i, j); - if (y != -1) { - L4VertWall(i, j, y); - } - } - if (dungeon[i][j] == 15 && random(0, 100) < 100) { - y = L4VWallOk(i, j); - if (y != -1) { - L4VertWall(i, j, y); - } - } - if (dungeon[i][j] == 16 && random(0, 100) < 100) { - y = L4VWallOk(i, j); - if (y != -1) { - L4VertWall(i, j, y); - } - } - if (dungeon[i][j] == 21 && random(0, 100) < 100) { - y = L4VWallOk(i, j); - if (y != -1) { - L4VertWall(i, j, y); - } - } - if (dungeon[i][j] == 23 && random(0, 100) < 100) { - y = L4VWallOk(i, j); - if (y != -1) { - L4VertWall(i, j, y); - } - } - } - } -} - -int L4HWallOk(int i, int j) +static int L4HWallOk(int i, int j) { int x; BOOL wallok; @@ -863,7 +448,7 @@ int L4HWallOk(int i, int j) } } -int L4VWallOk(int i, int j) +static int L4VWallOk(int i, int j) { int y; BOOL wallok; @@ -917,7 +502,7 @@ int L4VWallOk(int i, int j) } } -void L4HorizWall(int i, int j, int dx) +static void L4HorizWall(int i, int j, int dx) { int xx; @@ -961,7 +546,7 @@ void L4HorizWall(int i, int j, int dx) } } -void L4VertWall(int i, int j, int dy) +static void L4VertWall(int i, int j, int dy) { int yy; @@ -1008,7 +593,110 @@ void L4VertWall(int i, int j, int dy) } } -void L4tileFix() +static void L4AddWall() +{ + int i, j, x, y; + + for (j = 0; j < DMAXY; j++) { + for (i = 0; i < DMAXX; i++) { + if (dflags[i][j] != 0) { + continue; + } + if (dungeon[i][j] == 10 && random(0, 100) < 100) { + x = L4HWallOk(i, j); + if (x != -1) { + L4HorizWall(i, j, x); + } + } + if (dungeon[i][j] == 12 && random(0, 100) < 100) { + x = L4HWallOk(i, j); + if (x != -1) { + L4HorizWall(i, j, x); + } + } + if (dungeon[i][j] == 13 && random(0, 100) < 100) { + x = L4HWallOk(i, j); + if (x != -1) { + L4HorizWall(i, j, x); + } + } + if (dungeon[i][j] == 15 && random(0, 100) < 100) { + x = L4HWallOk(i, j); + if (x != -1) { + L4HorizWall(i, j, x); + } + } + if (dungeon[i][j] == 16 && random(0, 100) < 100) { + x = L4HWallOk(i, j); + if (x != -1) { + L4HorizWall(i, j, x); + } + } + if (dungeon[i][j] == 21 && random(0, 100) < 100) { + x = L4HWallOk(i, j); + if (x != -1) { + L4HorizWall(i, j, x); + } + } + if (dungeon[i][j] == 22 && random(0, 100) < 100) { + x = L4HWallOk(i, j); + if (x != -1) { + L4HorizWall(i, j, x); + } + } + if (dungeon[i][j] == 8 && random(0, 100) < 100) { + y = L4VWallOk(i, j); + if (y != -1) { + L4VertWall(i, j, y); + } + } + if (dungeon[i][j] == 9 && random(0, 100) < 100) { + y = L4VWallOk(i, j); + if (y != -1) { + L4VertWall(i, j, y); + } + } + if (dungeon[i][j] == 11 && random(0, 100) < 100) { + y = L4VWallOk(i, j); + if (y != -1) { + L4VertWall(i, j, y); + } + } + if (dungeon[i][j] == 14 && random(0, 100) < 100) { + y = L4VWallOk(i, j); + if (y != -1) { + L4VertWall(i, j, y); + } + } + if (dungeon[i][j] == 15 && random(0, 100) < 100) { + y = L4VWallOk(i, j); + if (y != -1) { + L4VertWall(i, j, y); + } + } + if (dungeon[i][j] == 16 && random(0, 100) < 100) { + y = L4VWallOk(i, j); + if (y != -1) { + L4VertWall(i, j, y); + } + } + if (dungeon[i][j] == 21 && random(0, 100) < 100) { + y = L4VWallOk(i, j); + if (y != -1) { + L4VertWall(i, j, y); + } + } + if (dungeon[i][j] == 23 && random(0, 100) < 100) { + y = L4VWallOk(i, j); + if (y != -1) { + L4VertWall(i, j, y); + } + } + } + } +} + +static void L4tileFix() { int i, j; @@ -1354,7 +1042,7 @@ void L4tileFix() } } -void DRLG_L4Subs() +static void DRLG_L4Subs() { int x, y, i, rv; BYTE c; @@ -1391,7 +1079,7 @@ void DRLG_L4Subs() } } -void L4makeDungeon() +static void L4makeDungeon() { int i, j, k, l; @@ -1437,7 +1125,7 @@ void L4makeDungeon() } } -void uShape() +static void uShape() { int j, i, rv; @@ -1516,7 +1204,7 @@ void uShape() } while (rv != 0); } -long GetArea() +static long GetArea() { int i, j; long rv; @@ -1534,76 +1222,40 @@ long GetArea() return rv; } -void L4firstRoom() +static void L4drawRoom(int x, int y, int width, int height) { - int x, y, w, h, rndx, rndy, xmin, xmax, ymin, ymax; + int i, j; - if (currlevel != 16) { - if (currlevel == quests[QTYPE_WARLRD]._qlevel && quests[QTYPE_WARLRD]._qactive) { - /// ASSERT: assert(gbMaxPlayers == 1); - w = 11; - h = 11; - } else if (currlevel == quests[QTYPE_VB]._qlevel && gbMaxPlayers != 1) { - w = 11; - h = 11; - } else { - w = random(0, 5) + 2; - h = random(0, 5) + 2; + for (j = 0; j < height; j++) { + for (i = 0; i < width; i++) { + dung[i + x][j + y] = 1; } - } else { - w = 14; - h = 14; - } - - xmin = (20 - w) >> 1; - xmax = 19 - w; - rndx = random(0, xmax - xmin + 1) + xmin; - if (rndx + w > 19) { - x = 19 - w + 1; - } else { - x = rndx; - } - ymin = (20 - h) >> 1; - ymax = 19 - h; - rndy = random(0, ymax - ymin + 1) + ymin; - if (rndy + h > 19) { - y = 19 - h + 1; - } else { - y = rndy; - } - - if (currlevel == 16) { - l4holdx = x; - l4holdy = y; } - if (QuestStatus(QTYPE_WARLRD) || currlevel == quests[QTYPE_VB]._qlevel && gbMaxPlayers != 1) { - SP4x1 = x + 1; - SP4y1 = y + 1; - SP4x2 = SP4x1 + w; - SP4y2 = SP4y1 + h; - } else { - SP4x1 = 0; - SP4y1 = 0; - SP4x2 = 0; - SP4y2 = 0; - } - - L4drawRoom(x, y, w, h); - L4roomGen(x, y, w, h, random(0, 2)); } -void L4drawRoom(int x, int y, int width, int height) +static BOOL L4checkRoom(int x, int y, int width, int height) { int i, j; + if (x <= 0 || y <= 0) { + return FALSE; + } + for (j = 0; j < height; j++) { for (i = 0; i < width; i++) { - dung[i + x][j + y] = 1; + if (i + x < 0 || i + x >= 20 || j + y < 0 || j + y >= 20) { + return FALSE; + } + if (dung[i + x][j + y] != 0) { + return FALSE; + } } } + + return TRUE; } -void L4roomGen(int x, int y, int w, int h, int dir) +static void L4roomGen(int x, int y, int w, int h, int dir) { int num; BOOL ran, ran2; @@ -1660,29 +1312,146 @@ void L4roomGen(int x, int y, int w, int h, int dir) } } -BOOL L4checkRoom(int x, int y, int width, int height) +static void L4firstRoom() { - int i, j; + int x, y, w, h, rndx, rndy, xmin, xmax, ymin, ymax; - if (x <= 0 || y <= 0) { - return FALSE; + if (currlevel != 16) { + if (currlevel == quests[QTYPE_WARLRD]._qlevel && quests[QTYPE_WARLRD]._qactive) { + /// ASSERT: assert(gbMaxPlayers == 1); + w = 11; + h = 11; + } else if (currlevel == quests[QTYPE_VB]._qlevel && gbMaxPlayers != 1) { + w = 11; + h = 11; + } else { + w = random(0, 5) + 2; + h = random(0, 5) + 2; + } + } else { + w = 14; + h = 14; } - for (j = 0; j < height; j++) { - for (i = 0; i < width; i++) { - if (i + x < 0 || i + x >= 20 || j + y < 0 || j + y >= 20) { - return FALSE; - } - if (dung[i + x][j + y] != 0) { - return FALSE; + xmin = (20 - w) >> 1; + xmax = 19 - w; + rndx = random(0, xmax - xmin + 1) + xmin; + if (rndx + w > 19) { + x = 19 - w + 1; + } else { + x = rndx; + } + ymin = (20 - h) >> 1; + ymax = 19 - h; + rndy = random(0, ymax - ymin + 1) + ymin; + if (rndy + h > 19) { + y = 19 - h + 1; + } else { + y = rndy; + } + + if (currlevel == 16) { + l4holdx = x; + l4holdy = y; + } + if (QuestStatus(QTYPE_WARLRD) || currlevel == quests[QTYPE_VB]._qlevel && gbMaxPlayers != 1) { + SP4x1 = x + 1; + SP4y1 = y + 1; + SP4x2 = SP4x1 + w; + SP4y2 = SP4y1 + h; + } else { + SP4x1 = 0; + SP4y1 = 0; + SP4x2 = 0; + SP4y2 = 0; + } + + L4drawRoom(x, y, w, h); + L4roomGen(x, y, w, h, random(0, 2)); +} + +void L4SaveQuads() +{ + int i, j, x, y; + + y = 0; + for (j = 0; j < 14; j++) { + x = 0; + for (i = 0; i < 14; i++) { + dflags[i + l4holdx][j + l4holdy] = 1; + dflags[DMAXX - 1 - x - l4holdx][j + l4holdy] = 1; + dflags[i + l4holdx][DMAXY - 1 - y - l4holdy] = 1; + dflags[DMAXX - 1 - x - l4holdx][DMAXY - 1 - y - l4holdy] = 1; + x++; + } + y++; + } +} + +void DRLG_L4SetRoom(BYTE *pSetPiece, int rx1, int ry1) +{ + int rw, rh, i, j; + BYTE *sp; + + rw = pSetPiece[0]; + rh = pSetPiece[2]; + sp = &pSetPiece[4]; + + for (j = 0; j < rh; j++) { + for (i = 0; i < rw; i++) { + if (*sp != 0) { + dungeon[i + rx1][j + ry1] = *sp; + dflags[i + rx1][j + ry1] |= DLRG_PROTECTED; + } else { + dungeon[i + rx1][j + ry1] = 6; } + sp += 2; } } +} - return TRUE; +void DRLG_LoadDiabQuads(BOOL preflag) +{ + BYTE *lpSetPiece; + + lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab1.DUN", NULL); + diabquad1x = 4 + l4holdx; + diabquad1y = 4 + l4holdy; + DRLG_L4SetRoom(lpSetPiece, diabquad1x, diabquad1y); + mem_free_dbg(lpSetPiece); + + if (preflag) { + lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab2b.DUN", NULL); + } else { + lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab2a.DUN", NULL); + } + diabquad2x = 27 - l4holdx; + diabquad2y = 1 + l4holdy; + DRLG_L4SetRoom(lpSetPiece, diabquad2x, diabquad2y); + mem_free_dbg(lpSetPiece); + + if (preflag) { + lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab3b.DUN", NULL); + } else { + lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab3a.DUN", NULL); + } + diabquad3x = 1 + l4holdx; + diabquad3y = 27 - l4holdy; + DRLG_L4SetRoom(lpSetPiece, diabquad3x, diabquad3y); + mem_free_dbg(lpSetPiece); + + if (preflag) { + lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab4b.DUN", NULL); + } else { + lpSetPiece = LoadFileInMem("Levels\\L4Data\\diab4a.DUN", NULL); + } + diabquad4x = 28 - l4holdx; + diabquad4y = 28 - l4holdy; + DRLG_L4SetRoom(lpSetPiece, diabquad4x, diabquad4y); + mem_free_dbg(lpSetPiece); } -BOOL DRLG_L4PlaceMiniSet(const BYTE *miniset, int tmin, int tmax, int cx, int cy, BOOL setview, int ldir) +static BOOL DRLG_L4PlaceMiniSet(const BYTE *miniset, int tmin, int tmax, int cx, int cy, BOOL setview, int ldir) { int sx, sy, sw, sh, xx, yy, i, ii, numt, bailcnt; BOOL found; @@ -1757,37 +1526,19 @@ BOOL DRLG_L4PlaceMiniSet(const BYTE *miniset, int tmin, int tmax, int cx, int cy quests[QTYPE_VB]._qtx = sx + 1; quests[QTYPE_VB]._qty = sy + 1; } - if (setview == TRUE) { - ViewX = 2 * sx + 21; - ViewY = 2 * sy + 22; - } - if (ldir == 0) { - LvlViewX = 2 * sx + 21; - LvlViewY = 2 * sy + 22; - } - - return TRUE; -} - -void DRLG_L4FloodTVal() -{ - int i, j, xx, yy; - - yy = 16; - for (j = 0; j < DMAXY; j++) { - xx = 16; - for (i = 0; i < DMAXX; i++) { - if (dungeon[i][j] == 6 && dTransVal[xx][yy] == 0) { - DRLG_L4FTVR(i, j, xx, yy, 0); - TransVal++; - } - xx += 2; - } - yy += 2; + if (setview == TRUE) { + ViewX = 2 * sx + 21; + ViewY = 2 * sy + 22; + } + if (ldir == 0) { + LvlViewX = 2 * sx + 21; + LvlViewY = 2 * sy + 22; } + + return TRUE; } -void DRLG_L4FTVR(int i, int j, int x, int y, int d) +static void DRLG_L4FTVR(int i, int j, int x, int y, int d) { if (dTransVal[x][y] != 0 || dungeon[i][j] != 6) { if (d == 1) { @@ -1834,7 +1585,55 @@ void DRLG_L4FTVR(int i, int j, int x, int y, int d) } } -void DRLG_L4TransFix() +static void DRLG_L4FloodTVal() +{ + int i, j, xx, yy; + + yy = 16; + for (j = 0; j < DMAXY; j++) { + xx = 16; + for (i = 0; i < DMAXX; i++) { + if (dungeon[i][j] == 6 && dTransVal[xx][yy] == 0) { + DRLG_L4FTVR(i, j, xx, yy, 0); + TransVal++; + } + xx += 2; + } + yy += 2; + } +} + +BOOL IsDURWall(char d) +{ + if (d == 25) { + return TRUE; + } + if (d == 28) { + return TRUE; + } + if (d == 23) { + return TRUE; + } + + return FALSE; +} + +BOOL IsDLLWall(char dd) +{ + if (dd == 27) { + return TRUE; + } + if (dd == 26) { + return TRUE; + } + if (dd == 22) { + return TRUE; + } + + return FALSE; +} + +static void DRLG_L4TransFix() { int i, j, xx, yy; @@ -1877,7 +1676,7 @@ void DRLG_L4TransFix() } } -void DRLG_L4Corners() +static void DRLG_L4Corners() { int i, j; @@ -1894,7 +1693,188 @@ void DRLG_L4Corners() } } -void DRLG_L4Pass3() +void L4FixRim() +{ + int i, j; + + for (i = 0; i < 20; i++) { + dung[i][0] = 0; + } + for (j = 0; j < 20; j++) { + dung[0][j] = 0; + } +} + +void DRLG_L4GeneralFix() +{ + int i, j; + + for (j = 0; j < DMAXY - 1; j++) { + for (i = 0; i < DMAXX - 1; i++) { + if ((dungeon[i][j] == 24 || dungeon[i][j] == 122) && dungeon[i + 1][j] == 2 && dungeon[i][j + 1] == 5) { + dungeon[i][j] = 17; + } + } + } +} + +static void DRLG_L4(int entry) +{ + int i, j, spi, spj, ar; + BOOL doneflag; + + do { + DRLG_InitTrans(); + do { + InitL4Dungeon(); + L4firstRoom(); + L4FixRim(); + ar = GetArea(); + if (ar >= 173) { + uShape(); + } + } while (ar < 173); + L4makeDungeon(); + L4makeDmt(); + L4tileFix(); + if (currlevel == 16) { + L4SaveQuads(); + } + if (QuestStatus(QTYPE_WARLRD) || currlevel == quests[QTYPE_VB]._qlevel && gbMaxPlayers != 1) { + for (spi = SP4x1; spi < SP4x2; spi++) { + for (spj = SP4y1; spj < SP4y2; spj++) { + dflags[spi][spj] = 1; + } + } + } + L4AddWall(); + DRLG_L4FloodTVal(); + DRLG_L4TransFix(); + if (setloadflag_2) { + DRLG_L4SetSPRoom(SP4x1, SP4y1); + } + if (currlevel == 16) { + DRLG_LoadDiabQuads(TRUE); + } + if (QuestStatus(QTYPE_WARLRD)) { + if (entry == 0) { + doneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, 1, 0); + if (doneflag && currlevel == 13) { + doneflag = DRLG_L4PlaceMiniSet(L4TWARP, 1, 1, -1, -1, 0, 6); + } + ViewX++; + } else if (entry == 1) { + doneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, 0, 0); + if (doneflag && currlevel == 13) { + doneflag = DRLG_L4PlaceMiniSet(L4TWARP, 1, 1, -1, -1, 0, 6); + } + ViewX = 2 * setpc_x + 22; + ViewY = 2 * setpc_y + 22; + } else { + doneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, 0, 0); + if (doneflag && currlevel == 13) { + doneflag = DRLG_L4PlaceMiniSet(L4TWARP, 1, 1, -1, -1, 1, 6); + } + ViewX++; + } + } else if (currlevel != 15) { + if (entry == 0) { + doneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, 1, 0); + if (doneflag && currlevel != 16) { + doneflag = DRLG_L4PlaceMiniSet(L4DSTAIRS, 1, 1, -1, -1, 0, 1); + } + if (doneflag && currlevel == 13) { + doneflag = DRLG_L4PlaceMiniSet(L4TWARP, 1, 1, -1, -1, 0, 6); + } + ViewX++; + } else if (entry == 1) { + doneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, 0, 0); + if (doneflag && currlevel != 16) { + doneflag = DRLG_L4PlaceMiniSet(L4DSTAIRS, 1, 1, -1, -1, 1, 1); + } + if (doneflag && currlevel == 13) { + doneflag = DRLG_L4PlaceMiniSet(L4TWARP, 1, 1, -1, -1, 0, 6); + } + ViewY++; + } else { + doneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, 0, 0); + if (doneflag && currlevel != 16) { + doneflag = DRLG_L4PlaceMiniSet(L4DSTAIRS, 1, 1, -1, -1, 0, 1); + } + if (doneflag && currlevel == 13) { + doneflag = DRLG_L4PlaceMiniSet(L4TWARP, 1, 1, -1, -1, 1, 6); + } + ViewX++; + } + } else { + if (entry == 0) { + doneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, 1, 0); + if (doneflag) { + if (gbMaxPlayers == 1 && quests[QTYPE_MOD]._qactive != 2) { + doneflag = DRLG_L4PlaceMiniSet(L4PENTA, 1, 1, -1, -1, 0, 1); + } else { + doneflag = DRLG_L4PlaceMiniSet(L4PENTA2, 1, 1, -1, -1, 0, 1); + } + } + ViewX++; + } else { + doneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, 0, 0); + if (doneflag) { + if (gbMaxPlayers == 1 && quests[QTYPE_MOD]._qactive != 2) { + doneflag = DRLG_L4PlaceMiniSet(L4PENTA, 1, 1, -1, -1, 1, 1); + } else { + doneflag = DRLG_L4PlaceMiniSet(L4PENTA2, 1, 1, -1, -1, 1, 1); + } + } + ViewY++; + } + } + } while (!doneflag); + + DRLG_L4GeneralFix(); + + if (currlevel != 16) { + DRLG_PlaceThemeRooms(7, 10, 6, 8, 1); + } + + DRLG_L4Shadows(); + DRLG_L4Corners(); + DRLG_L4Subs(); + DRLG_Init_Globals(); + + if (QuestStatus(QTYPE_WARLRD)) { + for (j = 0; j < DMAXY; j++) { + for (i = 0; i < DMAXX; i++) { + pdungeon[i][j] = dungeon[i][j]; + } + } + } + + DRLG_CheckQuests(SP4x1, SP4y1); + + if (currlevel == 15) { + for (j = 0; j < DMAXY; j++) { + for (i = 0; i < DMAXX; i++) { + if (dungeon[i][j] == 98) { + Make_SetPC(i - 1, j - 1, 5, 5); + } + if (dungeon[i][j] == 107) { + Make_SetPC(i - 1, j - 1, 5, 5); + } + } + } + } + if (currlevel == 16) { + for (j = 0; j < DMAXY; j++) { + for (i = 0; i < DMAXX; i++) { + pdungeon[i][j] = dungeon[i][j]; + } + } + DRLG_LoadDiabQuads(FALSE); + } +} + +static void DRLG_L4Pass3() { int i, j, xx, yy; long v1, v2, v3, v4, lv; @@ -1992,4 +1972,24 @@ void DRLG_L4Pass3() yy += 2; } } + +void CreateL4Dungeon(DWORD rseed, int entry) +{ + SetRndSeed(rseed); + + dminx = 16; + dminy = 16; + dmaxx = 96; + dmaxy = 96; + + ViewX = 40; + ViewY = 40; + + DRLG_InitSetPC(); + DRLG_LoadL4SP(); + DRLG_L4(entry); + DRLG_L4Pass3(); + DRLG_FreeL4SP(); + DRLG_SetPC(); +} #endif diff --git a/Source/drlg_l4.h b/Source/drlg_l4.h index d4ec873d5..6559545b1 100644 --- a/Source/drlg_l4.h +++ b/Source/drlg_l4.h @@ -32,30 +32,6 @@ BOOL IsDLLWall(char dd); void L4FixRim(); void DRLG_L4GeneralFix(); void CreateL4Dungeon(DWORD rseed, int entry); -void DRLG_L4(int entry); -void DRLG_L4Shadows(); -void InitL4Dungeon(); -void L4makeDmt(); -void L4AddWall(); -int L4HWallOk(int i, int j); -int L4VWallOk(int i, int j); -void L4HorizWall(int i, int j, int dx); -void L4VertWall(int i, int j, int dy); -void L4tileFix(); -void DRLG_L4Subs(); -void L4makeDungeon(); -void uShape(); -long GetArea(); -void L4firstRoom(); -void L4drawRoom(int x, int y, int width, int height); -void L4roomGen(int x, int y, int w, int h, int dir); -BOOL L4checkRoom(int x, int y, int width, int height); -BOOL DRLG_L4PlaceMiniSet(const BYTE *miniset, int tmin, int tmax, int cx, int cy, BOOL setview, int ldir); -void DRLG_L4FloodTVal(); -void DRLG_L4FTVR(int i, int j, int x, int y, int d); -void DRLG_L4TransFix(); -void DRLG_L4Corners(); -void DRLG_L4Pass3(); /* rdata */ extern const BYTE L4ConvTbl[16];