Browse Source

Clean up selecting what chamber to spawn quests in

pull/4717/head
Anders Jenbo 4 years ago
parent
commit
6fffbb4676
  1. 411
      Source/drlg_l1.cpp
  2. 7
      Source/drlg_l2.cpp
  3. 13
      Source/drlg_l4.cpp
  4. 1
      Source/gendung.cpp
  5. 2
      Source/gendung.h

411
Source/drlg_l1.cpp

@ -26,23 +26,14 @@ namespace {
BYTE L5dungeon[80][80]; BYTE L5dungeon[80][80];
/** Marks where walls may not be added to the level */ /** Marks where walls may not be added to the level */
bool Chamber[DMAXX][DMAXX]; bool Chamber[DMAXX][DMAXX];
/** Specifies whether a single player quest DUN has been loaded. */ /** Specifies whether to generate a horizontal or vertical layout. */
bool L5setloadflag; bool VerticalLayout;
/** Specifies whether to generate a horizontal room at position 1 in the Cathedral. */ /** Specifies whether to generate a room at position 1 in the Cathedral. */
bool HR1; bool HasChamber1;
/** Specifies whether to generate a horizontal room at position 2 in the Cathedral. */ /** Specifies whether to generate a room at position 2 in the Cathedral. */
bool HR2; bool HasChamber2;
/** Specifies whether to generate a horizontal room at position 3 in the Cathedral. */ /** Specifies whether to generate a room at position 3 in the Cathedral. */
bool HR3; bool HasChamber3;
/** 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<uint16_t[]> L5pSetPiece;
/** Contains shadows for 2x2 blocks of base tile IDs in the Cathedral. */ /** Contains shadows for 2x2 blocks of base tile IDs in the Cathedral. */
const ShadowStruct SPATS[37] = { const ShadowStruct SPATS[37] = {
@ -804,23 +795,18 @@ void FillFloor()
void LoadQuestSetPieces() void LoadQuestSetPieces()
{ {
L5setloadflag = false;
if (Quests[Q_BUTCHER].IsAvailable()) { if (Quests[Q_BUTCHER].IsAvailable()) {
L5pSetPiece = LoadFileInMem<uint16_t>("Levels\\L1Data\\rnd6.DUN"); pSetPiece = LoadFileInMem<uint16_t>("Levels\\L1Data\\rnd6.DUN");
L5setloadflag = true;
} else if (Quests[Q_SKELKING].IsAvailable() && !gbIsMultiplayer) { } else if (Quests[Q_SKELKING].IsAvailable() && !gbIsMultiplayer) {
L5pSetPiece = LoadFileInMem<uint16_t>("Levels\\L1Data\\SKngDO.DUN"); pSetPiece = LoadFileInMem<uint16_t>("Levels\\L1Data\\SKngDO.DUN");
L5setloadflag = true;
} else if (Quests[Q_LTBANNER].IsAvailable()) { } else if (Quests[Q_LTBANNER].IsAvailable()) {
L5pSetPiece = LoadFileInMem<uint16_t>("Levels\\L1Data\\Banner2.DUN"); pSetPiece = LoadFileInMem<uint16_t>("Levels\\L1Data\\Banner2.DUN");
L5setloadflag = true;
} }
} }
void FreeQuestSetPieces() void FreeQuestSetPieces()
{ {
L5pSetPiece = nullptr; pSetPiece = nullptr;
} }
void InitDungeonPieces() void InitDungeonPieces()
@ -944,24 +930,26 @@ void GenerateRoom(int x, int y, int w, int h, int dir)
void FirstRoom() void FirstRoom()
{ {
if (GenerateRnd(2) == 0) { VerticalLayout = GenerateRnd(2) == 0;
if (VerticalLayout) {
int ys = 1; int ys = 1;
int ye = DMAXY - 1; int ye = DMAXY - 1;
VR1 = (GenerateRnd(2) != 0); HasChamber1 = (GenerateRnd(2) != 0);
VR2 = (GenerateRnd(2) != 0); HasChamber2 = (GenerateRnd(2) != 0);
VR3 = (GenerateRnd(2) != 0); HasChamber3 = (GenerateRnd(2) != 0);
if (!VR1 || !VR3) if (!HasChamber1 || !HasChamber3)
VR2 = true; HasChamber2 = true;
if (VR1) if (HasChamber1)
MapRoom(15, 1, 10, 10); MapRoom(15, 1, 10, 10);
else else
ys = 18; ys = 18;
if (VR2) if (HasChamber2)
MapRoom(15, 15, 10, 10); MapRoom(15, 15, 10, 10);
if (VR3) if (HasChamber3)
MapRoom(15, 29, 10, 10); MapRoom(15, 29, 10, 10);
else else
ye = 22; ye = 22;
@ -975,34 +963,30 @@ void FirstRoom()
dungeon[22][y] = Tile::VWall; dungeon[22][y] = Tile::VWall;
} }
if (VR1) if (HasChamber1)
GenerateRoom(15, 1, 10, 10, 0); GenerateRoom(15, 1, 10, 10, 0);
if (VR2) if (HasChamber2)
GenerateRoom(15, 15, 10, 10, 0); GenerateRoom(15, 15, 10, 10, 0);
if (VR3) if (HasChamber3)
GenerateRoom(15, 29, 10, 10, 0); GenerateRoom(15, 29, 10, 10, 0);
HR3 = false;
HR2 = false;
HR1 = false;
} else { } else {
int xs = 1; int xs = 1;
int xe = DMAXX - 1; int xe = DMAXX - 1;
HR1 = GenerateRnd(2) != 0; HasChamber1 = GenerateRnd(2) != 0;
HR2 = GenerateRnd(2) != 0; HasChamber2 = GenerateRnd(2) != 0;
HR3 = GenerateRnd(2) != 0; HasChamber3 = GenerateRnd(2) != 0;
if (!HR1 || !HR3) if (!HasChamber1 || !HasChamber3)
HR2 = true; HasChamber2 = true;
if (HR1) if (HasChamber1)
MapRoom(1, 15, 10, 10); MapRoom(1, 15, 10, 10);
else else
xs = 18; xs = 18;
if (HR2) if (HasChamber2)
MapRoom(15, 15, 10, 10); MapRoom(15, 15, 10, 10);
if (HR3) if (HasChamber3)
MapRoom(29, 15, 10, 10); MapRoom(29, 15, 10, 10);
else else
xe = 22; xe = 22;
@ -1016,16 +1000,12 @@ void FirstRoom()
dungeon[x][22] = Tile::VWall; dungeon[x][22] = Tile::VWall;
} }
if (HR1) if (HasChamber1)
GenerateRoom(1, 15, 10, 10, 1); GenerateRoom(1, 15, 10, 10, 1);
if (HR2) if (HasChamber2)
GenerateRoom(15, 15, 10, 10, 1); GenerateRoom(15, 15, 10, 10, 1);
if (HR3) if (HasChamber3)
GenerateRoom(29, 15, 10, 10, 1); 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() void Substitution()
{ {
for (int y = 0; y < DMAXY; y++) { 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; int chamber;
UberCol = 2 * ry1 + 8; if (!HasChamber1)
SetPiece = { { rx1, ry1 }, UberRoomPattern.size }; chamber = GenerateRnd(2) != 0 ? 3 : 2;
IsUberRoomOpened = false; else if (!HasChamber2)
IsUberLeverActivated = false; chamber = GenerateRnd(2) != 0 ? 1 : 3;
else if (!HasChamber3)
UberRoomPattern.place({ rx1, ry1 }, true); 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) if (pSetPiece == nullptr)
GenerateChamber(0, 14, false, false, false, true); return;
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 (VR1 && VR2 && VR3) Point position = SelectChamber();
c = GenerateRnd(3); PlaceDunTiles(pSetPiece.get(), position, Tile::Floor);
SetPiece = { position, { SDL_SwapLE16(pSetPiece[0]), SDL_SwapLE16(pSetPiece[1]) } };
}
switch (c) { void SetCryptRoom()
case 0: {
SetCryptRoom(16, 2); Point position = SelectChamber();
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;
}
if (HR1 && HR2 && HR3) UberRow = 2 * position.x + 6;
c = GenerateRnd(3); UberCol = 2 * position.y + 8;
IsUberRoomOpened = false;
IsUberLeverActivated = false;
switch (c) { SetPiece = { position, UberRoomPattern.size };
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;
}
if (VR1 && VR2 && VR3) UberRoomPattern.place(position, true);
c = GenerateRnd(3); }
switch (c) { void SetCornerRoom()
case 0: {
SetCornerRoom(16, 2); Point position = SelectChamber();
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;
}
if (HR1 && HR2 && HR3) SetPiece = { position, CornerstoneRoomPattern.size };
c = GenerateRnd(3);
switch (c) { CornerstoneRoomPattern.place(position, true);
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;
}
if (VR1 && VR2 && VR3) void FillChambers()
c = GenerateRnd(3); {
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) { if (HasChamber3)
case 0: GenerateChamber(28, 14, false, false, true, false);
position = { 16, 2 }; if (HasChamber1 && HasChamber2)
break; GenerateHall(12, 18, 14, 18);
case 1: if (HasChamber2 && HasChamber3)
position = { 16, 16 }; GenerateHall(26, 18, 28, 18);
break; if (HasChamber1 && !HasChamber2 && HasChamber3)
case 2: GenerateHall(12, 18, 28, 18);
position = { 16, 30 }; } else {
break; if (HasChamber1)
} GenerateChamber(14, 0, false, true, false, false);
} else {
int c = 1; if (HasChamber2) {
if (!HR1 && HR2 && HR3 && GenerateRnd(2) != 0) if (HasChamber1 && !HasChamber3)
c = 2; GenerateChamber(14, 14, true, false, false, false);
if (HR1 && HR2 && !HR3 && GenerateRnd(2) != 0) if (!HasChamber1 && HasChamber3)
c = 0; GenerateChamber(14, 14, false, true, false, false);
if (HasChamber1 && HasChamber3)
if (HR1 && !HR2 && HR3) { GenerateChamber(14, 14, true, true, false, false);
if (GenerateRnd(2) != 0) if (!HasChamber1 && !HasChamber3)
c = 0; GenerateChamber(14, 14, false, false, false, false);
else }
c = 2;
}
if (HR1 && HR2 && HR3) if (HasChamber3)
c = GenerateRnd(3); 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) { if (leveltype == DTYPE_CRYPT) {
case 0: if (currlevel == 24) {
position = { 2, 16 }; SetCryptRoom();
break; } else if (currlevel == 21) {
case 1: SetCornerRoom();
position = { 16, 16 };
break;
case 2:
position = { 30, 16 };
break;
}
} }
PlaceDunTiles(L5pSetPiece.get(), position, Tile::Floor); } else {
SetPiece = { position, { SDL_SwapLE16(L5pSetPiece[0]), SDL_SwapLE16(L5pSetPiece[1]) } }; SetSetPieceRoom();
} }
} }

7
Source/drlg_l2.cpp

@ -1604,17 +1604,12 @@ void PlaceMiniSetRandom1x1(uint8_t search, uint8_t replace, int rndper)
void LoadQuestSetPieces() void LoadQuestSetPieces()
{ {
setloadflag = false;
if (Quests[Q_BLIND].IsAvailable()) { if (Quests[Q_BLIND].IsAvailable()) {
pSetPiece = LoadFileInMem<uint16_t>("Levels\\L2Data\\Blind1.DUN"); pSetPiece = LoadFileInMem<uint16_t>("Levels\\L2Data\\Blind1.DUN");
setloadflag = true;
} else if (Quests[Q_BLOOD].IsAvailable()) { } else if (Quests[Q_BLOOD].IsAvailable()) {
pSetPiece = LoadFileInMem<uint16_t>("Levels\\L2Data\\Blood1.DUN"); pSetPiece = LoadFileInMem<uint16_t>("Levels\\L2Data\\Blood1.DUN");
setloadflag = true;
} else if (Quests[Q_SCHAMB].IsAvailable()) { } else if (Quests[Q_SCHAMB].IsAvailable()) {
pSetPiece = LoadFileInMem<uint16_t>("Levels\\L2Data\\Bonestr2.DUN"); pSetPiece = LoadFileInMem<uint16_t>("Levels\\L2Data\\Bonestr2.DUN");
setloadflag = true;
} }
} }
@ -2726,7 +2721,7 @@ void GenerateLevel(lvl_entry entry)
continue; continue;
} }
FixTilesPatterns(); FixTilesPatterns();
if (setloadflag) { if (pSetPiece != nullptr) {
PlaceDunTiles(pSetPiece.get(), SetPieceRoom.position, 3); PlaceDunTiles(pSetPiece.get(), SetPieceRoom.position, 3);
SetPiece = { SetPieceRoom.position, { SDL_SwapLE16(pSetPiece[0]), SDL_SwapLE16(pSetPiece[1]) } }; SetPiece = { SetPieceRoom.position, { SDL_SwapLE16(pSetPiece[0]), SDL_SwapLE16(pSetPiece[1]) } };
} }

13
Source/drlg_l4.cpp

@ -161,14 +161,10 @@ void ApplyShadowsPatterns()
void LoadQuestSetPieces() void LoadQuestSetPieces()
{ {
setloadflag = false;
if (Quests[Q_WARLORD].IsAvailable()) { if (Quests[Q_WARLORD].IsAvailable()) {
pSetPiece = LoadFileInMem<uint16_t>("Levels\\L4Data\\Warlord.DUN"); pSetPiece = LoadFileInMem<uint16_t>("Levels\\L4Data\\Warlord.DUN");
setloadflag = true; } else if (currlevel == 15 && gbIsMultiplayer) {
}
if (currlevel == 15 && gbIsMultiplayer) {
pSetPiece = LoadFileInMem<uint16_t>("Levels\\L4Data\\Vile1.DUN"); pSetPiece = LoadFileInMem<uint16_t>("Levels\\L4Data\\Vile1.DUN");
setloadflag = true;
} }
} }
@ -318,6 +314,9 @@ void FirstRoom()
void SetSetPieceRoom(Point position) void SetSetPieceRoom(Point position)
{ {
if (pSetPiece == nullptr)
return;
SetPiece = { position, { SDL_SwapLE16(pSetPiece[0]), SDL_SwapLE16(pSetPiece[1]) } }; SetPiece = { position, { SDL_SwapLE16(pSetPiece[0]), SDL_SwapLE16(pSetPiece[1]) } };
PlaceDunTiles(pSetPiece.get(), position, 6); PlaceDunTiles(pSetPiece.get(), position, 6);
@ -1239,9 +1238,7 @@ void GenerateLevel(lvl_entry entry)
AddWall(); AddWall();
FloodTransparencyValues(6); FloodTransparencyValues(6);
FixTransparency(); FixTransparency();
if (setloadflag) { SetSetPieceRoom(SetPieceRoom.position);
SetSetPieceRoom(SetPieceRoom.position);
}
if (currlevel == 16) { if (currlevel == 16) {
LoadDiabQuads(true); LoadDiabQuads(true);
} }

1
Source/gendung.cpp

@ -26,7 +26,6 @@ bool Protected[DMAXX][DMAXY];
Rectangle SetPieceRoom; Rectangle SetPieceRoom;
Rectangle SetPiece; Rectangle SetPiece;
std::unique_ptr<uint16_t[]> pSetPiece; std::unique_ptr<uint16_t[]> pSetPiece;
bool setloadflag;
std::optional<OwnedCelSprite> pSpecialCels; std::optional<OwnedCelSprite> pSpecialCels;
std::unique_ptr<MegaTile[]> pMegaTiles; std::unique_ptr<MegaTile[]> pMegaTiles;
std::unique_ptr<uint16_t[]> pLevelPieces; std::unique_ptr<uint16_t[]> pLevelPieces;

2
Source/gendung.h

@ -133,8 +133,6 @@ extern Rectangle SetPieceRoom;
extern Rectangle SetPiece; extern Rectangle SetPiece;
/** Contains the contents of the single player quest DUN file. */ /** Contains the contents of the single player quest DUN file. */
extern std::unique_ptr<uint16_t[]> pSetPiece; extern std::unique_ptr<uint16_t[]> pSetPiece;
/** Specifies whether a single player quest DUN has been loaded. */
extern bool setloadflag;
extern std::optional<OwnedCelSprite> pSpecialCels; extern std::optional<OwnedCelSprite> pSpecialCels;
/** Specifies the tile definitions of the active dungeon type; (e.g. levels/l1data/l1.til). */ /** 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; extern DVL_API_FOR_TEST std::unique_ptr<MegaTile[]> pMegaTiles;

Loading…
Cancel
Save