Browse Source

Remove global SetPiece Handling

pull/6842/head
obligaron 2 years ago committed by Anders Jenbo
parent
commit
7cd7a3445f
  1. 23
      Source/levels/drlg_l1.cpp
  2. 22
      Source/levels/drlg_l2.cpp
  3. 15
      Source/levels/drlg_l3.cpp
  4. 20
      Source/levels/drlg_l4.cpp
  5. 15
      Source/levels/gendung.cpp
  6. 4
      Source/levels/gendung.h

23
Source/levels/drlg_l1.cpp

@ -381,15 +381,22 @@ void FillFloor()
}
}
void LoadQuestSetPieces()
void InitSetPiece()
{
std::unique_ptr<uint16_t[]> setPieceData;
if (Quests[Q_BUTCHER].IsAvailable()) {
pSetPiece = LoadFileInMem<uint16_t>("levels\\l1data\\rnd6.dun");
setPieceData = LoadFileInMem<uint16_t>("levels\\l1data\\rnd6.dun");
} else if (Quests[Q_SKELKING].IsAvailable() && !UseMultiplayerQuests()) {
pSetPiece = LoadFileInMem<uint16_t>("levels\\l1data\\skngdo.dun");
setPieceData = LoadFileInMem<uint16_t>("levels\\l1data\\skngdo.dun");
} else if (Quests[Q_LTBANNER].IsAvailable()) {
pSetPiece = LoadFileInMem<uint16_t>("levels\\l1data\\banner2.dun");
setPieceData = LoadFileInMem<uint16_t>("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) {

22
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<uint16_t[]> setPieceData;
if (Quests[Q_BLIND].IsAvailable()) {
pSetPiece = LoadFileInMem<uint16_t>("levels\\l2data\\blind1.dun");
setPieceData = LoadFileInMem<uint16_t>("levels\\l2data\\blind1.dun");
} else if (Quests[Q_BLOOD].IsAvailable()) {
pSetPiece = LoadFileInMem<uint16_t>("levels\\l2data\\blood1.dun");
setPieceData = LoadFileInMem<uint16_t>("levels\\l2data\\blood1.dun");
} else if (Quests[Q_SCHAMB].IsAvailable()) {
pSetPiece = LoadFileInMem<uint16_t>("levels\\l2data\\bonestr2.dun");
setPieceData = LoadFileInMem<uint16_t>("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();

15
Source/levels/drlg_l3.cpp

@ -1796,16 +1796,11 @@ void Fence()
FenceDoorFix();
}
void LoadQuestSetPieces()
{
if (Quests[Q_ANVIL].IsAvailable())
pSetPiece = LoadFileInMem<uint16_t>("levels\\l3data\\anvil.dun");
}
bool PlaceAnvil()
{
std::unique_ptr<uint16_t[]> setPieceData = LoadFileInMem<uint16_t>("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);

20
Source/levels/drlg_l4.cpp

@ -158,13 +158,21 @@ void ApplyShadowsPatterns()
}
}
void LoadQuestSetPieces()
void InitSetPiece()
{
std::unique_ptr<uint16_t[]> setPieceData;
if (Quests[Q_WARLORD].IsAvailable()) {
pSetPiece = LoadFileInMem<uint16_t>("levels\\l4data\\warlord.dun");
setPieceData = LoadFileInMem<uint16_t>("levels\\l4data\\warlord.dun");
} else if (currlevel == 15 && UseMultiplayerQuests()) {
pSetPiece = LoadFileInMem<uint16_t>("levels\\l4data\\vile1.dun");
setPieceData = LoadFileInMem<uint16_t>("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) {

15
Source/levels/gendung.cpp

@ -23,7 +23,6 @@ uint8_t pdungeon[DMAXX][DMAXY];
Bitset2d<DMAXX, DMAXY> Protected;
WorldTileRectangle SetPieceRoom;
WorldTileRectangle SetPiece;
std::unique_ptr<uint16_t[]> pSetPiece;
OptionalOwnedClxSpriteList pSpecialCels;
std::unique_ptr<MegaTile[]> pMegaTiles;
std::unique_ptr<std::byte[]> pDungeonCels;
@ -705,20 +704,6 @@ WorldTileSize GetDunSize(const uint16_t *dunData)
return WorldTileSize(static_cast<WorldTileCoord>(SDL_SwapLE16(dunData[0])), static_cast<WorldTileCoord>(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)
{
{

4
Source/levels/gendung.h

@ -158,8 +158,6 @@ extern Bitset2d<DMAXX, DMAXY> 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<uint16_t[]> 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<MegaTile[]> 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);
/**

Loading…
Cancel
Save