diff --git a/Source/levels/drlg_l1.cpp b/Source/levels/drlg_l1.cpp index 9faaa2e32..5d1b8f5c8 100644 --- a/Source/levels/drlg_l1.cpp +++ b/Source/levels/drlg_l1.cpp @@ -381,15 +381,22 @@ void FillFloor() } } -void LoadQuestSetPieces() +void InitSetPiece() { + std::unique_ptr setPieceData; if (Quests[Q_BUTCHER].IsAvailable()) { - pSetPiece = LoadFileInMem("levels\\l1data\\rnd6.dun"); + setPieceData = LoadFileInMem("levels\\l1data\\rnd6.dun"); } else if (Quests[Q_SKELKING].IsAvailable() && !UseMultiplayerQuests()) { - pSetPiece = LoadFileInMem("levels\\l1data\\skngdo.dun"); + setPieceData = LoadFileInMem("levels\\l1data\\skngdo.dun"); } else if (Quests[Q_LTBANNER].IsAvailable()) { - pSetPiece = LoadFileInMem("levels\\l1data\\banner2.dun"); + setPieceData = LoadFileInMem("levels\\l1data\\banner2.dun"); + } else { + return; // no setpiece needed for this level } + + WorldTilePosition setPiecePosition = SelectChamber(); + PlaceDunTiles(setPieceData.get(), setPiecePosition, Floor); + SetPiece = { setPiecePosition, GetDunSize(setPieceData.get()) }; } void InitDungeonPieces() @@ -1015,8 +1022,8 @@ void FillChambers() } else if (CornerStone.isAvailable()) { SetCornerRoom(); } - } else if (pSetPiece != nullptr) { - SetSetPieceRoom(SelectChamber(), Floor); + } else { + InitSetPiece(); } } @@ -1170,8 +1177,6 @@ void GenerateLevel(lvl_entry entry) break; } - LoadQuestSetPieces(); - while (true) { DRLG_InitTrans(); @@ -1189,8 +1194,6 @@ void GenerateLevel(lvl_entry entry) break; } - FreeQuestSetPieces(); - for (int j = 0; j < DMAXY; j++) { for (int i = 0; i < DMAXX; i++) { if (dungeon[i][j] == EntranceStairs) { diff --git a/Source/levels/drlg_l2.cpp b/Source/levels/drlg_l2.cpp index eeb7b9fdf..b2093da7b 100644 --- a/Source/levels/drlg_l2.cpp +++ b/Source/levels/drlg_l2.cpp @@ -1629,15 +1629,23 @@ void PlaceMiniSetRandom1x1(uint8_t search, uint8_t replace, int rndper) PlaceMiniSetRandom({ { 1, 1 }, { { search } }, { { replace } } }, rndper); } -void LoadQuestSetPieces() +void InitSetPiece() { + std::unique_ptr setPieceData; + if (Quests[Q_BLIND].IsAvailable()) { - pSetPiece = LoadFileInMem("levels\\l2data\\blind1.dun"); + setPieceData = LoadFileInMem("levels\\l2data\\blind1.dun"); } else if (Quests[Q_BLOOD].IsAvailable()) { - pSetPiece = LoadFileInMem("levels\\l2data\\blood1.dun"); + setPieceData = LoadFileInMem("levels\\l2data\\blood1.dun"); } else if (Quests[Q_SCHAMB].IsAvailable()) { - pSetPiece = LoadFileInMem("levels\\l2data\\bonestr2.dun"); + setPieceData = LoadFileInMem("levels\\l2data\\bonestr2.dun"); + } else { + return; // no setpiece needed for this level } + + WorldTilePosition setPiecePosition = SetPieceRoom.position; + PlaceDunTiles(setPieceData.get(), setPiecePosition, 3); + SetPiece = { setPiecePosition, GetDunSize(setPieceData.get()) }; } void InitDungeonPieces() @@ -2661,8 +2669,6 @@ bool PlaceStairs(lvl_entry entry) void GenerateLevel(lvl_entry entry) { - LoadQuestSetPieces(); - while (true) { nRoomCnt = 0; InitDungeonFlags(); @@ -2671,15 +2677,13 @@ void GenerateLevel(lvl_entry entry) continue; } FixTilesPatterns(); - SetSetPieceRoom(SetPieceRoom.position, 3); + InitSetPiece(); FloodTransparencyValues(3); FixTransparency(); if (PlaceStairs(entry)) break; } - FreeQuestSetPieces(); - FixLockout(); FixDoors(); FixDirtTiles(); diff --git a/Source/levels/drlg_l3.cpp b/Source/levels/drlg_l3.cpp index a4ed1ceb7..1c6801b99 100644 --- a/Source/levels/drlg_l3.cpp +++ b/Source/levels/drlg_l3.cpp @@ -1796,16 +1796,11 @@ void Fence() FenceDoorFix(); } -void LoadQuestSetPieces() -{ - if (Quests[Q_ANVIL].IsAvailable()) - pSetPiece = LoadFileInMem("levels\\l3data\\anvil.dun"); -} - bool PlaceAnvil() { + std::unique_ptr setPieceData = LoadFileInMem("levels\\l3data\\anvil.dun"); // growing the size by 2 to allow a 1 tile border on all sides - WorldTileSize areaSize = WorldTileSize(SDL_SwapLE16(pSetPiece[0]), SDL_SwapLE16(pSetPiece[1])) + 2; + WorldTileSize areaSize = GetDunSize(setPieceData.get()) + 2; WorldTileCoord sx = GenerateRnd(DMAXX - areaSize.width); WorldTileCoord sy = GenerateRnd(DMAXY - areaSize.height); @@ -1832,7 +1827,7 @@ bool PlaceAnvil() break; } - PlaceDunTiles(pSetPiece.get(), { sx + 1, sy + 1 }, 7); + PlaceDunTiles(setPieceData.get(), { sx + 1, sy + 1 }, 7); SetPiece = { { sx, sy }, areaSize }; for (WorldTilePosition tile : PointsInRectangle(SetPiece)) { @@ -1993,8 +1988,6 @@ bool PlaceStairs(lvl_entry entry) void GenerateLevel(lvl_entry entry) { - LoadQuestSetPieces(); - while (true) { InitDungeonFlags(); int x1 = GenerateRnd(20) + 10; @@ -2029,8 +2022,6 @@ void GenerateLevel(lvl_entry entry) break; } - FreeQuestSetPieces(); - if (leveltype == DTYPE_NEST) { PlaceMiniSetRandom(L6ISLE1, 70); PlaceMiniSetRandom(L6ISLE2, 70); diff --git a/Source/levels/drlg_l4.cpp b/Source/levels/drlg_l4.cpp index 755a57fc2..883d0e048 100644 --- a/Source/levels/drlg_l4.cpp +++ b/Source/levels/drlg_l4.cpp @@ -158,13 +158,21 @@ void ApplyShadowsPatterns() } } -void LoadQuestSetPieces() +void InitSetPiece() { + std::unique_ptr setPieceData; + if (Quests[Q_WARLORD].IsAvailable()) { - pSetPiece = LoadFileInMem("levels\\l4data\\warlord.dun"); + setPieceData = LoadFileInMem("levels\\l4data\\warlord.dun"); } else if (currlevel == 15 && UseMultiplayerQuests()) { - pSetPiece = LoadFileInMem("levels\\l4data\\vile1.dun"); + setPieceData = LoadFileInMem("levels\\l4data\\vile1.dun"); + } else { + return; // no setpiece needed for this level } + + WorldTilePosition setPiecePosition = SetPieceRoom.position; + PlaceDunTiles(setPieceData.get(), setPiecePosition, 6); + SetPiece = { setPiecePosition, GetDunSize(setPieceData.get()) }; } void InitDungeonFlags() @@ -1130,8 +1138,6 @@ bool PlaceStairs(lvl_entry entry) void GenerateLevel(lvl_entry entry) { - LoadQuestSetPieces(); - while (true) { DRLG_InitTrans(); @@ -1160,7 +1166,7 @@ void GenerateLevel(lvl_entry entry) AddWall(); FloodTransparencyValues(6); FixTransparency(); - SetSetPieceRoom(SetPieceRoom.position, 6); + InitSetPiece(); if (currlevel == 16) { LoadDiabQuads(true); } @@ -1168,8 +1174,6 @@ void GenerateLevel(lvl_entry entry) break; } - FreeQuestSetPieces(); - GeneralFix(); if (currlevel != 16) { diff --git a/Source/levels/gendung.cpp b/Source/levels/gendung.cpp index 0c9b27d49..b2294cc4c 100644 --- a/Source/levels/gendung.cpp +++ b/Source/levels/gendung.cpp @@ -23,7 +23,6 @@ uint8_t pdungeon[DMAXX][DMAXY]; Bitset2d Protected; WorldTileRectangle SetPieceRoom; WorldTileRectangle SetPiece; -std::unique_ptr pSetPiece; OptionalOwnedClxSpriteList pSpecialCels; std::unique_ptr pMegaTiles; std::unique_ptr pDungeonCels; @@ -705,20 +704,6 @@ WorldTileSize GetDunSize(const uint16_t *dunData) return WorldTileSize(static_cast(SDL_SwapLE16(dunData[0])), static_cast(SDL_SwapLE16(dunData[1]))); } -void SetSetPieceRoom(WorldTilePosition position, int floorId) -{ - if (pSetPiece == nullptr) - return; - - PlaceDunTiles(pSetPiece.get(), position, floorId); - SetPiece = { position, GetDunSize(pSetPiece.get()) }; -} - -void FreeQuestSetPieces() -{ - pSetPiece = nullptr; -} - void DRLG_LPass3(int lv) { { diff --git a/Source/levels/gendung.h b/Source/levels/gendung.h index c5476edb7..443a6ee34 100644 --- a/Source/levels/gendung.h +++ b/Source/levels/gendung.h @@ -158,8 +158,6 @@ extern Bitset2d Protected; extern WorldTileRectangle SetPieceRoom; /** Specifies the active set quest piece in coordinate. */ extern WorldTileRectangle SetPiece; -/** Contains the contents of the single player quest DUN file. */ -extern std::unique_ptr pSetPiece; extern OptionalOwnedClxSpriteList 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; @@ -362,8 +360,6 @@ void DRLG_HoldThemeRooms(); * @brief Returns ths size in tiles of the specified ".dun" Data */ WorldTileSize GetDunSize(const uint16_t *dunData); -void SetSetPieceRoom(WorldTilePosition position, int floorId); -void FreeQuestSetPieces(); void DRLG_LPass3(int lv); /**