Browse Source

If cleanup + bugfixes (#2273)

pull/2274/head
qndel 5 years ago committed by GitHub
parent
commit
373f1db22e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 39
      Source/drlg_l1.cpp
  2. 50
      Source/drlg_l2.cpp
  3. 72
      Source/drlg_l3.cpp
  4. 164
      Source/drlg_l4.cpp
  5. 24
      Source/engine.h
  6. 16
      Source/monster.cpp
  7. 14
      Source/objects.cpp

39
Source/drlg_l1.cpp

@ -881,50 +881,23 @@ static void DRLG_L1Shadows()
for (int x = 1; x < DMAXX; x++) {
if (dungeon[x - 1][y] == 139 && L5dflags[x - 1][y] == 0) {
uint8_t tnv3 = 139;
if (dungeon[x][y] == 29)
tnv3 = 141;
if (dungeon[x][y] == 32)
tnv3 = 141;
if (dungeon[x][y] == 35)
tnv3 = 141;
if (dungeon[x][y] == 37)
tnv3 = 141;
if (dungeon[x][y] == 38)
tnv3 = 141;
if (dungeon[x][y] == 39)
if (IsAnyOf(dungeon[x][y], 29, 32, 35, 37, 38, 39)) {
tnv3 = 141;
}
dungeon[x - 1][y] = tnv3;
}
if (dungeon[x - 1][y] == 149 && L5dflags[x - 1][y] == 0) {
uint8_t tnv3 = 149;
if (dungeon[x][y] == 29)
tnv3 = 153;
if (dungeon[x][y] == 32)
tnv3 = 153;
if (dungeon[x][y] == 35)
tnv3 = 153;
if (dungeon[x][y] == 37)
tnv3 = 153;
if (dungeon[x][y] == 38)
tnv3 = 153;
if (dungeon[x][y] == 39)
if (IsAnyOf(dungeon[x][y], 29, 32, 35, 37, 38, 39)) {
tnv3 = 153;
}
dungeon[x - 1][y] = tnv3;
}
if (dungeon[x - 1][y] == 148 && L5dflags[x - 1][y] == 0) {
uint8_t tnv3 = 148;
if (dungeon[x][y] == 29)
tnv3 = 154;
if (dungeon[x][y] == 32)
tnv3 = 154;
if (dungeon[x][y] == 35)
tnv3 = 154;
if (dungeon[x][y] == 37)
tnv3 = 154;
if (dungeon[x][y] == 38)
tnv3 = 154;
if (dungeon[x][y] == 39)
if (IsAnyOf(dungeon[x][y], 29, 32, 35, 37, 38, 39)) {
tnv3 = 154;
}
dungeon[x - 1][y] = tnv3;
}
}

50
Source/drlg_l2.cpp

@ -1923,7 +1923,7 @@ static void CreateDoorType(int nX, int nY)
if (predungeon[nX][nY + 1] == 68) {
return;
}
if (predungeon[nX][nY] == 66 || predungeon[nX][nY] == 67 || predungeon[nX][nY] == 65 || predungeon[nX][nY] == 69) {
if (IsAnyOf(predungeon[nX][nY], 65, 66, 67, 69)) {
return;
}
@ -2717,43 +2717,23 @@ static bool CreateDungeon()
for (int j = 0; j < DMAXY; j++) { /// BUGFIX: change '<=' to '<' (fixed)
for (int i = 0; i < DMAXX; i++) { /// BUGFIX: change '<=' to '<' (fixed)
if (predungeon[i][j] == 67) {
predungeon[i][j] = 35;
}
if (predungeon[i][j] == 66) {
predungeon[i][j] = 35;
}
if (predungeon[i][j] == 69) {
predungeon[i][j] = 35;
}
if (predungeon[i][j] == 65) {
if (IsAnyOf(predungeon[i][j], 65, 66, 67, 69)) {
predungeon[i][j] = 35;
}
if (predungeon[i][j] == 44) {
predungeon[i][j] = 46;
if (predungeon[i - 1][j - 1] == 32) {
predungeon[i - 1][j - 1] = 35;
}
if (predungeon[i - 1][j] == 32) {
predungeon[i - 1][j] = 35;
}
if (predungeon[i - 1][1 + j] == 32) {
predungeon[i - 1][1 + j] = 35;
}
if (predungeon[i + 1][j - 1] == 32) {
predungeon[i + 1][j - 1] = 35;
}
if (predungeon[i + 1][j] == 32) {
predungeon[i + 1][j] = 35;
}
if (predungeon[i + 1][1 + j] == 32) {
predungeon[i + 1][1 + j] = 35;
}
if (predungeon[i][j - 1] == 32) {
predungeon[i][j - 1] = 35;
}
if (predungeon[i][j + 1] == 32) {
predungeon[i][j + 1] = 35;
for (int a = -1; a <= 1; a++) {
for (int b = -1; b <= 1; b++) {
if (a == 0 && b == 0)
continue;
if (i + a < 0 || j + b < 0)
continue;
if (i + a >= DMAXX || j + b >= DMAXY)
continue;
if (predungeon[i + a][j + b] == 32) {
predungeon[i + a][j + b] = 35;
}
}
}
}
}
@ -2846,7 +2826,7 @@ static void DRLG_L2TransFix()
for (int j = 0; j < DMAXY; j++) {
int xx = 16;
for (int i = 0; i < DMAXX; i++) {
if (dungeon[i][j] == 14 && dungeon[i][j - 1] == 10) {
if (dungeon[i][j] == 14 && dungeon[i][j - 1] == 10) { // BUGFIX: check if j >= 1
dTransVal[xx + 1][yy] = dTransVal[xx][yy];
dTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];
}

72
Source/drlg_l3.cpp

@ -1788,22 +1788,7 @@ static bool WoodVertU(int i, int y)
{
if ((dungeon[i + 1][y] > 152 || dungeon[i + 1][y] < 130)
&& (dungeon[i - 1][y] > 152 || dungeon[i - 1][y] < 130)) {
if (dungeon[i][y] == 7) {
return true;
}
if (dungeon[i][y] == 10) {
return true;
}
if (dungeon[i][y] == 126) {
return true;
}
if (dungeon[i][y] == 129) {
return true;
}
if (dungeon[i][y] == 134) {
return true;
}
if (dungeon[i][y] == 136) {
if (IsAnyOf(dungeon[i][y], 7, 10, 126, 129, 134, 136)) {
return true;
}
}
@ -1815,16 +1800,7 @@ static bool WoodVertD(int i, int y)
{
if ((dungeon[i + 1][y] > 152 || dungeon[i + 1][y] < 130)
&& (dungeon[i - 1][y] > 152 || dungeon[i - 1][y] < 130)) {
if (dungeon[i][y] == 7) {
return true;
}
if (dungeon[i][y] == 2) {
return true;
}
if (dungeon[i][y] == 134) {
return true;
}
if (dungeon[i][y] == 136) {
if (IsAnyOf(dungeon[i][y], 2, 7, 134, 136)) {
return true;
}
}
@ -1836,22 +1812,7 @@ static bool WoodHorizL(int x, int j)
{
if ((dungeon[x][j + 1] > 152 || dungeon[x][j + 1] < 130)
&& (dungeon[x][j - 1] > 152 || dungeon[x][j - 1] < 130)) {
if (dungeon[x][j] == 7) {
return true;
}
if (dungeon[x][j] == 9) {
return true;
}
if (dungeon[x][j] == 121) {
return true;
}
if (dungeon[x][j] == 124) {
return true;
}
if (dungeon[x][j] == 135) {
return true;
}
if (dungeon[x][j] == 137) {
if (IsAnyOf(dungeon[x][j], 7, 9, 121, 124, 135, 137)) {
return true;
}
}
@ -1863,16 +1824,7 @@ static bool WoodHorizR(int x, int j)
{
if ((dungeon[x][j + 1] > 152 || dungeon[x][j + 1] < 130)
&& (dungeon[x][j - 1] > 152 || dungeon[x][j - 1] < 130)) {
if (dungeon[x][j] == 7) {
return true;
}
if (dungeon[x][j] == 4) {
return true;
}
if (dungeon[x][j] == 135) {
return true;
}
if (dungeon[x][j] == 137) {
if (IsAnyOf(dungeon[x][j], 4, 7, 135, 137)) {
return true;
}
}
@ -1914,13 +1866,7 @@ void FenceDoorFix()
}
}
if (dungeon[i][j] == 146) {
if (dungeon[i + 1][j] != 130 && dungeon[i - 1][j] != 130
&& dungeon[i + 1][j] != 132 && dungeon[i - 1][j] != 132
&& dungeon[i + 1][j] != 133 && dungeon[i - 1][j] != 133
&& dungeon[i + 1][j] != 134 && dungeon[i - 1][j] != 134
&& dungeon[i + 1][j] != 136 && dungeon[i - 1][j] != 136
&& dungeon[i + 1][j] != 138 && dungeon[i - 1][j] != 138
&& dungeon[i + 1][j] != 140 && dungeon[i - 1][j] != 140) {
if (IsNoneOf(dungeon[i + 1][j], 130, 132, 133, 145, 136, 138, 140) && IsNoneOf(dungeon[i - 1][j], 130, 132, 133, 145, 136, 138, 140)) {
dungeon[i][j] = 7;
continue;
}
@ -1933,13 +1879,7 @@ void FenceDoorFix()
}
}
if (dungeon[i][j] == 147) {
if (dungeon[i][j + 1] != 131 && dungeon[i][j - 1] != 131
&& dungeon[i][j + 1] != 132 && dungeon[i][j - 1] != 132
&& dungeon[i][j + 1] != 133 && dungeon[i][j - 1] != 133
&& dungeon[i][j + 1] != 135 && dungeon[i][j - 1] != 135
&& dungeon[i][j + 1] != 137 && dungeon[i][j - 1] != 137
&& dungeon[i][j + 1] != 138 && dungeon[i][j - 1] != 138
&& dungeon[i][j + 1] != 139 && dungeon[i][j - 1] != 139) {
if (IsNoneOf(dungeon[i][j + 1], 131, 132, 133, 135, 137, 138, 139) && IsNoneOf(dungeon[i][j - 1], 131, 132, 133, 135, 137, 138, 139)) {
dungeon[i][j] = 7;
continue;
}

164
Source/drlg_l4.cpp

@ -157,20 +157,7 @@ static void DRLG_L4Shadows()
{
for (int y = 1; y < DMAXY; y++) {
for (int x = 1; x < DMAXY; x++) {
bool okflag = false;
if (dungeon[x][y] == 3) {
okflag = true;
}
if (dungeon[x][y] == 4) {
okflag = true;
}
if (dungeon[x][y] == 8) {
okflag = true;
}
if (dungeon[x][y] == 15) {
okflag = true;
}
if (!okflag) {
if (IsNoneOf(dungeon[x][y], 3, 4, 8, 15)) {
continue;
}
if (dungeon[x - 1][y] == 6) {
@ -274,36 +261,9 @@ static int L4HWallOk(int i, int j)
}
}
bool wallok = false;
if (dungeon[i + x][j] == 10) {
wallok = true;
}
if (dungeon[i + x][j] == 12) {
wallok = true;
}
if (dungeon[i + x][j] == 13) {
wallok = true;
}
if (dungeon[i + x][j] == 15) {
wallok = true;
}
if (dungeon[i + x][j] == 16) {
wallok = true;
}
if (dungeon[i + x][j] == 21) {
wallok = true;
}
if (dungeon[i + x][j] == 22) {
wallok = true;
}
if (x <= 3) {
wallok = false;
}
if (wallok) {
if (IsAnyOf(dungeon[i + x][j], 10, 12, 13, 15, 16, 21, 22) && x > 3)
return x;
}
return -1;
}
@ -322,39 +282,9 @@ static int L4VWallOk(int i, int j)
}
}
bool wallok = false;
if (dungeon[i][j + y] == 8) {
wallok = true;
}
if (dungeon[i][j + y] == 9) {
wallok = true;
}
if (dungeon[i][j + y] == 11) {
wallok = true;
}
if (dungeon[i][j + y] == 14) {
wallok = true;
}
if (dungeon[i][j + y] == 15) {
wallok = true;
}
if (dungeon[i][j + y] == 16) {
wallok = true;
}
if (dungeon[i][j + y] == 21) {
wallok = true;
}
if (dungeon[i][j + y] == 23) {
wallok = true;
}
if (y <= 3) {
wallok = false;
}
if (wallok) {
if (IsAnyOf(dungeon[i][j + y], 9, 11, 14, 15, 16, 21, 23) && y > 3)
return y;
}
return -1;
}
@ -452,91 +382,13 @@ static void L4AddWall()
if (dflags[i][j] != 0) {
continue;
}
if (dungeon[i][j] == 10 && GenerateRnd(100) < WALL_CHANCE) {
int x = L4HWallOk(i, j);
if (x != -1) {
L4HorizWall(i, j, x);
}
}
if (dungeon[i][j] == 12 && GenerateRnd(100) < WALL_CHANCE) {
int x = L4HWallOk(i, j);
if (x != -1) {
L4HorizWall(i, j, x);
}
}
if (dungeon[i][j] == 13 && GenerateRnd(100) < WALL_CHANCE) {
int x = L4HWallOk(i, j);
if (x != -1) {
L4HorizWall(i, j, x);
}
}
if (dungeon[i][j] == 15 && GenerateRnd(100) < WALL_CHANCE) {
int x = L4HWallOk(i, j);
if (x != -1) {
L4HorizWall(i, j, x);
}
}
if (dungeon[i][j] == 16 && GenerateRnd(100) < WALL_CHANCE) {
int x = L4HWallOk(i, j);
if (x != -1) {
L4HorizWall(i, j, x);
}
}
if (dungeon[i][j] == 21 && GenerateRnd(100) < WALL_CHANCE) {
int x = L4HWallOk(i, j);
if (x != -1) {
L4HorizWall(i, j, x);
}
}
if (dungeon[i][j] == 22 && GenerateRnd(100) < WALL_CHANCE) {
if (IsAnyOf(dungeon[i][j], 10, 12, 13, 15, 16, 21, 22) && GenerateRnd(100) < WALL_CHANCE) {
int x = L4HWallOk(i, j);
if (x != -1) {
L4HorizWall(i, j, x);
}
}
if (dungeon[i][j] == 8 && GenerateRnd(100) < WALL_CHANCE) {
int y = L4VWallOk(i, j);
if (y != -1) {
L4VertWall(i, j, y);
}
}
if (dungeon[i][j] == 9 && GenerateRnd(100) < WALL_CHANCE) {
int y = L4VWallOk(i, j);
if (y != -1) {
L4VertWall(i, j, y);
}
}
if (dungeon[i][j] == 11 && GenerateRnd(100) < WALL_CHANCE) {
int y = L4VWallOk(i, j);
if (y != -1) {
L4VertWall(i, j, y);
}
}
if (dungeon[i][j] == 14 && GenerateRnd(100) < WALL_CHANCE) {
int y = L4VWallOk(i, j);
if (y != -1) {
L4VertWall(i, j, y);
}
}
if (dungeon[i][j] == 15 && GenerateRnd(100) < WALL_CHANCE) {
int y = L4VWallOk(i, j);
if (y != -1) {
L4VertWall(i, j, y);
}
}
if (dungeon[i][j] == 16 && GenerateRnd(100) < WALL_CHANCE) {
int y = L4VWallOk(i, j);
if (y != -1) {
L4VertWall(i, j, y);
}
}
if (dungeon[i][j] == 21 && GenerateRnd(100) < WALL_CHANCE) {
int y = L4VWallOk(i, j);
if (y != -1) {
L4VertWall(i, j, y);
}
}
if (dungeon[i][j] == 23 && GenerateRnd(100) < WALL_CHANCE) {
if (IsAnyOf(dungeon[i][j], 8, 9, 11, 14, 15, 16, 21, 23) && GenerateRnd(100) < WALL_CHANCE) {
int y = L4VWallOk(i, j);
if (y != -1) {
L4VertWall(i, j, y);
@ -1436,7 +1288,7 @@ static void DRLG_L4TransFix()
for (int j = 0; j < DMAXY; j++) {
int xx = 16;
for (int i = 0; i < DMAXX; i++) {
if (IsDURWall(dungeon[i][j]) && dungeon[i][j - 1] == 18) {
if (IsDURWall(dungeon[i][j]) && dungeon[i][j - 1] == 18) { // BUGFIX: check if j >= 1
dTransVal[xx + 1][yy] = dTransVal[xx][yy];
dTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];
}

24
Source/engine.h

@ -43,6 +43,30 @@
namespace devilution {
template <typename V, typename X>
bool IsAnyOf(const V &v, X x)
{
return v == x;
}
template <typename V, typename X, typename... Xs>
bool IsAnyOf(const V &v, X x, Xs... xs)
{
return IsAnyOf(v, x) || IsAnyOf(v, xs...);
}
template <typename V, typename X>
bool IsNoneOf(const V &v, X x)
{
return v != x;
}
template <typename V, typename X, typename... Xs>
bool IsNoneOf(const V &v, X x, Xs... xs)
{
return IsNoneOf(v, x) && IsNoneOf(v, xs...);
}
struct CelOutputBuffer {
// 8-bit palletized surface.
SDL_Surface *surface;

16
Source/monster.cpp

@ -1276,20 +1276,12 @@ void NewMonsterAnim(int i, AnimStruct *anim, Direction md, AnimationDistribution
bool M_Ranged(int i)
{
char ai = monster[i]._mAi;
return ai == AI_SKELBOW || ai == AI_GOATBOW || ai == AI_SUCC || ai == AI_LAZHELP;
return IsAnyOf(monster[i]._mAi, AI_SKELBOW, AI_GOATBOW, AI_SUCC, AI_LAZHELP);
}
bool M_Talker(int i)
{
char ai = monster[i]._mAi;
return ai == AI_LAZURUS
|| ai == AI_WARLORD
|| ai == AI_GARBUD
|| ai == AI_ZHAR
|| ai == AI_SNOTSPIL
|| ai == AI_LACHDAN
|| ai == AI_LAZHELP;
return IsAnyOf(monster[i]._mAi, AI_LAZURUS, AI_WARLORD, AI_GARBUD, AI_ZHAR, AI_SNOTSPIL, AI_LACHDAN, AI_LAZHELP);
}
void M_Enemy(int i)
@ -5152,9 +5144,7 @@ bool PosOkMonst3(int i, Point position)
if (ret && dObject[position.x][position.y] != 0) {
oi = dObject[position.x][position.y] > 0 ? dObject[position.x][position.y] - 1 : -(dObject[position.x][position.y] + 1);
objtype = object[oi]._otype;
isdoor = objtype == OBJ_L1LDOOR || objtype == OBJ_L1RDOOR
|| objtype == OBJ_L2LDOOR || objtype == OBJ_L2RDOOR
|| objtype == OBJ_L3LDOOR || objtype == OBJ_L3RDOOR;
isdoor = IsAnyOf(objtype, OBJ_L1LDOOR, OBJ_L1RDOOR, OBJ_L2LDOOR, OBJ_L2RDOOR, OBJ_L3LDOOR, OBJ_L3RDOOR);
if (object[oi]._oSolidFlag && !isdoor) {
ret = false;
}

14
Source/objects.cpp

@ -697,7 +697,7 @@ void AddObjTraps()
if (GenerateRnd(2) == 0) {
xp = i - 1;
while (!nSolidTable[dPiece[xp][j]])
while (!nSolidTable[dPiece[xp][j]]) // BUGFIX: check if xp >= 0
xp--;
if (!WallTrapLocOkK(xp, j) || i - xp <= 1)
@ -710,7 +710,7 @@ void AddObjTraps()
object[oi]._oTrapFlag = true;
} else {
yp = j - 1;
while (!nSolidTable[dPiece[i][yp]])
while (!nSolidTable[dPiece[i][yp]]) // BUGFIX: check if yp >= 0
yp--;
if (!WallTrapLocOkK(i, yp) || j - yp <= 1)
@ -3632,13 +3632,7 @@ bool OperateShrineThaumaturgic(int pnum)
for (int j = 0; j < nobjects; j++) {
int v1 = objectactive[j];
assert((DWORD)v1 < MAXOBJECTS);
if ((object[v1]._otype == OBJ_CHEST1
|| object[v1]._otype == OBJ_CHEST2
|| object[v1]._otype == OBJ_CHEST3
|| object[v1]._otype == OBJ_TCHEST1
|| object[v1]._otype == OBJ_TCHEST2
|| object[v1]._otype == OBJ_TCHEST3)
&& object[v1]._oSelFlag == 0) {
if (IsAnyOf(object[v1]._otype, OBJ_CHEST1, OBJ_CHEST2, OBJ_CHEST3, OBJ_TCHEST1, OBJ_TCHEST2, OBJ_TCHEST3) && object[v1]._oSelFlag == 0) {
object[v1]._oRndSeed = AdvanceRndSeed();
object[v1]._oSelFlag = 1;
object[v1]._oAnimFrame -= 2;
@ -5262,7 +5256,7 @@ void SyncCrux(int i)
for (j = 0; j < nobjects; j++) {
oi = objectactive[j];
type = object[oi]._otype;
if (type != OBJ_CRUX1 && type != OBJ_CRUX2 && type != OBJ_CRUX3)
if (IsNoneOf(type, OBJ_CRUX1, OBJ_CRUX2, OBJ_CRUX3))
continue;
if (object[i]._oVar8 != object[oi]._oVar8 || object[oi]._oBreak == -1)
continue;

Loading…
Cancel
Save