From 6fffbb4676f979019e9a8e007ffd84841a7e20d9 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Wed, 15 Jun 2022 16:47:39 +0200 Subject: [PATCH] Clean up selecting what chamber to spawn quests in --- Source/drlg_l1.cpp | 411 +++++++++++++++------------------------------ Source/drlg_l2.cpp | 7 +- Source/drlg_l4.cpp | 13 +- Source/gendung.cpp | 1 - Source/gendung.h | 2 - 5 files changed, 139 insertions(+), 295 deletions(-) diff --git a/Source/drlg_l1.cpp b/Source/drlg_l1.cpp index 5046ca6d0..ba0fc4a2c 100644 --- a/Source/drlg_l1.cpp +++ b/Source/drlg_l1.cpp @@ -26,23 +26,14 @@ namespace { BYTE L5dungeon[80][80]; /** Marks where walls may not be added to the level */ bool Chamber[DMAXX][DMAXX]; -/** 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. */ -bool HR1; -/** Specifies whether to generate a horizontal room at position 2 in the Cathedral. */ -bool HR2; -/** Specifies whether to generate a horizontal room at position 3 in the Cathedral. */ -bool HR3; - -/** Specifies whether to generate a vertical room at position 1 in the Cathedral. */ -bool VR1; -/** Specifies whether to generate a vertical room at position 2 in the Cathedral. */ -bool VR2; -/** Specifies whether to generate a vertical room at position 3 in the Cathedral. */ -bool VR3; -/** Contains the contents of the single player quest DUN file. */ -std::unique_ptr L5pSetPiece; +/** Specifies whether to generate a horizontal or vertical layout. */ +bool VerticalLayout; +/** Specifies whether to generate a room at position 1 in the Cathedral. */ +bool HasChamber1; +/** Specifies whether to generate a room at position 2 in the Cathedral. */ +bool HasChamber2; +/** Specifies whether to generate a room at position 3 in the Cathedral. */ +bool HasChamber3; /** Contains shadows for 2x2 blocks of base tile IDs in the Cathedral. */ const ShadowStruct SPATS[37] = { @@ -804,23 +795,18 @@ void FillFloor() void LoadQuestSetPieces() { - L5setloadflag = false; - if (Quests[Q_BUTCHER].IsAvailable()) { - L5pSetPiece = LoadFileInMem("Levels\\L1Data\\rnd6.DUN"); - L5setloadflag = true; + pSetPiece = LoadFileInMem("Levels\\L1Data\\rnd6.DUN"); } else if (Quests[Q_SKELKING].IsAvailable() && !gbIsMultiplayer) { - L5pSetPiece = LoadFileInMem("Levels\\L1Data\\SKngDO.DUN"); - L5setloadflag = true; + pSetPiece = LoadFileInMem("Levels\\L1Data\\SKngDO.DUN"); } else if (Quests[Q_LTBANNER].IsAvailable()) { - L5pSetPiece = LoadFileInMem("Levels\\L1Data\\Banner2.DUN"); - L5setloadflag = true; + pSetPiece = LoadFileInMem("Levels\\L1Data\\Banner2.DUN"); } } void FreeQuestSetPieces() { - L5pSetPiece = nullptr; + pSetPiece = nullptr; } void InitDungeonPieces() @@ -944,24 +930,26 @@ void GenerateRoom(int x, int y, int w, int h, int dir) void FirstRoom() { - if (GenerateRnd(2) == 0) { + VerticalLayout = GenerateRnd(2) == 0; + + if (VerticalLayout) { int ys = 1; int ye = DMAXY - 1; - VR1 = (GenerateRnd(2) != 0); - VR2 = (GenerateRnd(2) != 0); - VR3 = (GenerateRnd(2) != 0); + HasChamber1 = (GenerateRnd(2) != 0); + HasChamber2 = (GenerateRnd(2) != 0); + HasChamber3 = (GenerateRnd(2) != 0); - if (!VR1 || !VR3) - VR2 = true; - if (VR1) + if (!HasChamber1 || !HasChamber3) + HasChamber2 = true; + if (HasChamber1) MapRoom(15, 1, 10, 10); else ys = 18; - if (VR2) + if (HasChamber2) MapRoom(15, 15, 10, 10); - if (VR3) + if (HasChamber3) MapRoom(15, 29, 10, 10); else ye = 22; @@ -975,34 +963,30 @@ void FirstRoom() dungeon[22][y] = Tile::VWall; } - if (VR1) + if (HasChamber1) GenerateRoom(15, 1, 10, 10, 0); - if (VR2) + if (HasChamber2) GenerateRoom(15, 15, 10, 10, 0); - if (VR3) + if (HasChamber3) GenerateRoom(15, 29, 10, 10, 0); - - HR3 = false; - HR2 = false; - HR1 = false; } else { int xs = 1; int xe = DMAXX - 1; - HR1 = GenerateRnd(2) != 0; - HR2 = GenerateRnd(2) != 0; - HR3 = GenerateRnd(2) != 0; + HasChamber1 = GenerateRnd(2) != 0; + HasChamber2 = GenerateRnd(2) != 0; + HasChamber3 = GenerateRnd(2) != 0; - if (!HR1 || !HR3) - HR2 = true; - if (HR1) + if (!HasChamber1 || !HasChamber3) + HasChamber2 = true; + if (HasChamber1) MapRoom(1, 15, 10, 10); else xs = 18; - if (HR2) + if (HasChamber2) MapRoom(15, 15, 10, 10); - if (HR3) + if (HasChamber3) MapRoom(29, 15, 10, 10); else xe = 22; @@ -1016,16 +1000,12 @@ void FirstRoom() dungeon[x][22] = Tile::VWall; } - if (HR1) + if (HasChamber1) GenerateRoom(1, 15, 10, 10, 1); - if (HR2) + if (HasChamber2) GenerateRoom(15, 15, 10, 10, 1); - if (HR3) + if (HasChamber3) GenerateRoom(29, 15, 10, 10, 1); - - VR3 = false; - VR2 = false; - VR1 = false; } } @@ -1455,13 +1435,6 @@ void FixTilesPatterns() } } -void SetCornerRoom(int rx1, int ry1) -{ - SetPiece = { { rx1, ry1 }, CornerstoneRoomPattern.size }; - - CornerstoneRoomPattern.place({ rx1, ry1 }, true); -} - void Substitution() { for (int y = 0; y < DMAXY; y++) { @@ -1502,237 +1475,119 @@ void Substitution() } } -void SetCryptRoom(int rx1, int ry1) +Point SelectChamber() { - UberRow = 2 * rx1 + 6; - UberCol = 2 * ry1 + 8; - SetPiece = { { rx1, ry1 }, UberRoomPattern.size }; - IsUberRoomOpened = false; - IsUberLeverActivated = false; - - UberRoomPattern.place({ rx1, ry1 }, true); + int chamber; + if (!HasChamber1) + chamber = GenerateRnd(2) != 0 ? 3 : 2; + else if (!HasChamber2) + chamber = GenerateRnd(2) != 0 ? 1 : 3; + else if (!HasChamber3) + chamber = GenerateRnd(2) != 0 ? 1 : 2; + else + chamber = GenerateRnd(3) + 1; + + switch (chamber) { + case 1: + return VerticalLayout ? Point { 16, 2 } : Point { 2, 16 }; + case 3: + return VerticalLayout ? Point { 16, 30 } : Point { 30, 16 }; + default: + return { 16, 16 }; + } } -void FillChambers() +void SetSetPieceRoom() { - if (HR1) - GenerateChamber(0, 14, false, false, false, true); - - if (HR2) { - if (HR1 && !HR3) - GenerateChamber(14, 14, false, false, true, false); - if (!HR1 && HR3) - GenerateChamber(14, 14, false, false, false, true); - if (HR1 && HR3) - GenerateChamber(14, 14, false, false, true, true); - if (!HR1 && !HR3) - GenerateChamber(14, 14, false, false, false, false); - } - - if (HR3) - GenerateChamber(28, 14, false, false, true, false); - if (HR1 && HR2) - GenerateHall(12, 18, 14, 18); - if (HR2 && HR3) - GenerateHall(26, 18, 28, 18); - if (HR1 && !HR2 && HR3) - GenerateHall(12, 18, 28, 18); - if (VR1) - GenerateChamber(14, 0, false, true, false, false); - - if (VR2) { - if (VR1 && !VR3) - GenerateChamber(14, 14, true, false, false, false); - if (!VR1 && VR3) - GenerateChamber(14, 14, false, true, false, false); - if (VR1 && VR3) - GenerateChamber(14, 14, true, true, false, false); - if (!VR1 && !VR3) - GenerateChamber(14, 14, false, false, false, false); - } - - if (VR3) - GenerateChamber(14, 28, true, false, false, false); - if (VR1 && VR2) - GenerateHall(18, 12, 18, 14); - if (VR2 && VR3) - GenerateHall(18, 26, 18, 28); - if (VR1 && !VR2 && VR3) - GenerateHall(18, 12, 18, 28); - - if (currlevel == 24) { - if (VR1 || VR2 || VR3) { - int c = 1; - if (!VR1 && VR2 && VR3 && GenerateRnd(2) != 0) - c = 2; - if (VR1 && VR2 && !VR3 && GenerateRnd(2) != 0) - c = 0; - - if (VR1 && !VR2 && VR3) { - c = (GenerateRnd(2) != 0) ? 0 : 2; - } + if (pSetPiece == nullptr) + return; - if (VR1 && VR2 && VR3) - c = GenerateRnd(3); + Point position = SelectChamber(); + PlaceDunTiles(pSetPiece.get(), position, Tile::Floor); + SetPiece = { position, { SDL_SwapLE16(pSetPiece[0]), SDL_SwapLE16(pSetPiece[1]) } }; +} - switch (c) { - case 0: - SetCryptRoom(16, 2); - break; - case 1: - SetCryptRoom(16, 16); - break; - case 2: - SetCryptRoom(16, 30); - break; - } - } else { - int c = 1; - if (!HR1 && HR2 && HR3 && GenerateRnd(2) != 0) - c = 2; - if (HR1 && HR2 && !HR3 && GenerateRnd(2) != 0) - c = 0; - - if (HR1 && !HR2 && HR3) { - c = (GenerateRnd(2) != 0) ? 0 : 2; - } +void SetCryptRoom() +{ + Point position = SelectChamber(); - if (HR1 && HR2 && HR3) - c = GenerateRnd(3); + UberRow = 2 * position.x + 6; + UberCol = 2 * position.y + 8; + IsUberRoomOpened = false; + IsUberLeverActivated = false; - switch (c) { - case 0: - SetCryptRoom(2, 16); - break; - case 1: - SetCryptRoom(16, 16); - break; - case 2: - SetCryptRoom(30, 16); - break; - } - } - } - if (currlevel == 21) { - if (VR1 || VR2 || VR3) { - int c = 1; - if (!VR1 && VR2 && VR3 && GenerateRnd(2) != 0) - c = 2; - if (VR1 && VR2 && !VR3 && GenerateRnd(2) != 0) - c = 0; - - if (VR1 && !VR2 && VR3) { - if (GenerateRnd(2) != 0) - c = 0; - else - c = 2; - } + SetPiece = { position, UberRoomPattern.size }; - if (VR1 && VR2 && VR3) - c = GenerateRnd(3); + UberRoomPattern.place(position, true); +} - switch (c) { - case 0: - SetCornerRoom(16, 2); - break; - case 1: - SetCornerRoom(16, 16); - break; - case 2: - SetCornerRoom(16, 30); - break; - } - } else { - int c = 1; - if (!HR1 && HR2 && HR3 && GenerateRnd(2) != 0) - c = 2; - if (HR1 && HR2 && !HR3 && GenerateRnd(2) != 0) - c = 0; - - if (HR1 && !HR2 && HR3) { - if (GenerateRnd(2) != 0) - c = 0; - else - c = 2; - } +void SetCornerRoom() +{ + Point position = SelectChamber(); - if (HR1 && HR2 && HR3) - c = GenerateRnd(3); + SetPiece = { position, CornerstoneRoomPattern.size }; - switch (c) { - case 0: - SetCornerRoom(2, 16); - break; - case 1: - SetCornerRoom(16, 16); - break; - case 2: - SetCornerRoom(30, 16); - break; - } - } - } - if (L5setloadflag) { - Point position; - if (VR1 || VR2 || VR3) { - int c = 1; - if (!VR1 && VR2 && VR3 && GenerateRnd(2) != 0) - c = 2; - if (VR1 && VR2 && !VR3 && GenerateRnd(2) != 0) - c = 0; - - if (VR1 && !VR2 && VR3) { - if (GenerateRnd(2) != 0) - c = 0; - else - c = 2; - } + CornerstoneRoomPattern.place(position, true); +} - if (VR1 && VR2 && VR3) - c = GenerateRnd(3); +void FillChambers() +{ + if (!VerticalLayout) { + if (HasChamber1) + GenerateChamber(0, 14, false, false, false, true); + + if (HasChamber2) { + if (HasChamber1 && !HasChamber3) + GenerateChamber(14, 14, false, false, true, false); + if (!HasChamber1 && HasChamber3) + GenerateChamber(14, 14, false, false, false, true); + if (HasChamber1 && HasChamber3) + GenerateChamber(14, 14, false, false, true, true); + if (!HasChamber1 && !HasChamber3) + GenerateChamber(14, 14, false, false, false, false); + } - switch (c) { - case 0: - position = { 16, 2 }; - break; - case 1: - position = { 16, 16 }; - break; - case 2: - position = { 16, 30 }; - break; - } - } else { - int c = 1; - if (!HR1 && HR2 && HR3 && GenerateRnd(2) != 0) - c = 2; - if (HR1 && HR2 && !HR3 && GenerateRnd(2) != 0) - c = 0; - - if (HR1 && !HR2 && HR3) { - if (GenerateRnd(2) != 0) - c = 0; - else - c = 2; - } + if (HasChamber3) + GenerateChamber(28, 14, false, false, true, false); + if (HasChamber1 && HasChamber2) + GenerateHall(12, 18, 14, 18); + if (HasChamber2 && HasChamber3) + GenerateHall(26, 18, 28, 18); + if (HasChamber1 && !HasChamber2 && HasChamber3) + GenerateHall(12, 18, 28, 18); + } else { + if (HasChamber1) + GenerateChamber(14, 0, false, true, false, false); + + if (HasChamber2) { + if (HasChamber1 && !HasChamber3) + GenerateChamber(14, 14, true, false, false, false); + if (!HasChamber1 && HasChamber3) + GenerateChamber(14, 14, false, true, false, false); + if (HasChamber1 && HasChamber3) + GenerateChamber(14, 14, true, true, false, false); + if (!HasChamber1 && !HasChamber3) + GenerateChamber(14, 14, false, false, false, false); + } - if (HR1 && HR2 && HR3) - c = GenerateRnd(3); + if (HasChamber3) + GenerateChamber(14, 28, true, false, false, false); + if (HasChamber1 && HasChamber2) + GenerateHall(18, 12, 18, 14); + if (HasChamber2 && HasChamber3) + GenerateHall(18, 26, 18, 28); + if (HasChamber1 && !HasChamber2 && HasChamber3) + GenerateHall(18, 12, 18, 28); + } - switch (c) { - case 0: - position = { 2, 16 }; - break; - case 1: - position = { 16, 16 }; - break; - case 2: - position = { 30, 16 }; - break; - } + if (leveltype == DTYPE_CRYPT) { + if (currlevel == 24) { + SetCryptRoom(); + } else if (currlevel == 21) { + SetCornerRoom(); } - PlaceDunTiles(L5pSetPiece.get(), position, Tile::Floor); - SetPiece = { position, { SDL_SwapLE16(L5pSetPiece[0]), SDL_SwapLE16(L5pSetPiece[1]) } }; + } else { + SetSetPieceRoom(); } } diff --git a/Source/drlg_l2.cpp b/Source/drlg_l2.cpp index a8f94d3b5..a4d7abd27 100644 --- a/Source/drlg_l2.cpp +++ b/Source/drlg_l2.cpp @@ -1604,17 +1604,12 @@ void PlaceMiniSetRandom1x1(uint8_t search, uint8_t replace, int rndper) void LoadQuestSetPieces() { - setloadflag = false; - if (Quests[Q_BLIND].IsAvailable()) { pSetPiece = LoadFileInMem("Levels\\L2Data\\Blind1.DUN"); - setloadflag = true; } else if (Quests[Q_BLOOD].IsAvailable()) { pSetPiece = LoadFileInMem("Levels\\L2Data\\Blood1.DUN"); - setloadflag = true; } else if (Quests[Q_SCHAMB].IsAvailable()) { pSetPiece = LoadFileInMem("Levels\\L2Data\\Bonestr2.DUN"); - setloadflag = true; } } @@ -2726,7 +2721,7 @@ void GenerateLevel(lvl_entry entry) continue; } FixTilesPatterns(); - if (setloadflag) { + if (pSetPiece != nullptr) { PlaceDunTiles(pSetPiece.get(), SetPieceRoom.position, 3); SetPiece = { SetPieceRoom.position, { SDL_SwapLE16(pSetPiece[0]), SDL_SwapLE16(pSetPiece[1]) } }; } diff --git a/Source/drlg_l4.cpp b/Source/drlg_l4.cpp index a8b1a0edb..c99cd2c71 100644 --- a/Source/drlg_l4.cpp +++ b/Source/drlg_l4.cpp @@ -161,14 +161,10 @@ void ApplyShadowsPatterns() void LoadQuestSetPieces() { - setloadflag = false; if (Quests[Q_WARLORD].IsAvailable()) { pSetPiece = LoadFileInMem("Levels\\L4Data\\Warlord.DUN"); - setloadflag = true; - } - if (currlevel == 15 && gbIsMultiplayer) { + } else if (currlevel == 15 && gbIsMultiplayer) { pSetPiece = LoadFileInMem("Levels\\L4Data\\Vile1.DUN"); - setloadflag = true; } } @@ -318,6 +314,9 @@ void FirstRoom() void SetSetPieceRoom(Point position) { + if (pSetPiece == nullptr) + return; + SetPiece = { position, { SDL_SwapLE16(pSetPiece[0]), SDL_SwapLE16(pSetPiece[1]) } }; PlaceDunTiles(pSetPiece.get(), position, 6); @@ -1239,9 +1238,7 @@ void GenerateLevel(lvl_entry entry) AddWall(); FloodTransparencyValues(6); FixTransparency(); - if (setloadflag) { - SetSetPieceRoom(SetPieceRoom.position); - } + SetSetPieceRoom(SetPieceRoom.position); if (currlevel == 16) { LoadDiabQuads(true); } diff --git a/Source/gendung.cpp b/Source/gendung.cpp index 8716e0d0f..a915cedaf 100644 --- a/Source/gendung.cpp +++ b/Source/gendung.cpp @@ -26,7 +26,6 @@ bool Protected[DMAXX][DMAXY]; Rectangle SetPieceRoom; Rectangle SetPiece; std::unique_ptr pSetPiece; -bool setloadflag; std::optional pSpecialCels; std::unique_ptr pMegaTiles; std::unique_ptr pLevelPieces; diff --git a/Source/gendung.h b/Source/gendung.h index c455c6d03..6cf593084 100644 --- a/Source/gendung.h +++ b/Source/gendung.h @@ -133,8 +133,6 @@ extern Rectangle SetPieceRoom; extern Rectangle SetPiece; /** Contains the contents of the single player quest DUN file. */ extern std::unique_ptr pSetPiece; -/** Specifies whether a single player quest DUN has been loaded. */ -extern bool setloadflag; extern std::optional pSpecialCels; /** Specifies the tile definitions of the active dungeon type; (e.g. levels/l1data/l1.til). */ extern DVL_API_FOR_TEST std::unique_ptr pMegaTiles;