From 373f1db22edec89860eafdf4a0bb0f7199203b78 Mon Sep 17 00:00:00 2001 From: qndel Date: Thu, 1 Jul 2021 18:32:25 +0200 Subject: [PATCH] If cleanup + bugfixes (#2273) --- Source/drlg_l1.cpp | 39 ++--------- Source/drlg_l2.cpp | 50 +++++--------- Source/drlg_l3.cpp | 72 ++------------------ Source/drlg_l4.cpp | 164 +++------------------------------------------ Source/engine.h | 24 +++++++ Source/monster.cpp | 16 +---- Source/objects.cpp | 14 ++-- 7 files changed, 66 insertions(+), 313 deletions(-) diff --git a/Source/drlg_l1.cpp b/Source/drlg_l1.cpp index b335de8eb..135e46334 100644 --- a/Source/drlg_l1.cpp +++ b/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; } } diff --git a/Source/drlg_l2.cpp b/Source/drlg_l2.cpp index 07a1d00c9..bd3a3ab92 100644 --- a/Source/drlg_l2.cpp +++ b/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]; } diff --git a/Source/drlg_l3.cpp b/Source/drlg_l3.cpp index 179de3cdd..7033f8218 100644 --- a/Source/drlg_l3.cpp +++ b/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; } diff --git a/Source/drlg_l4.cpp b/Source/drlg_l4.cpp index a385bd04c..312dee9f3 100644 --- a/Source/drlg_l4.cpp +++ b/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]; } diff --git a/Source/engine.h b/Source/engine.h index 06ebbc43e..ee378a0da 100644 --- a/Source/engine.h +++ b/Source/engine.h @@ -43,6 +43,30 @@ namespace devilution { +template +bool IsAnyOf(const V &v, X x) +{ + return v == x; +} + +template +bool IsAnyOf(const V &v, X x, Xs... xs) +{ + return IsAnyOf(v, x) || IsAnyOf(v, xs...); +} + +template +bool IsNoneOf(const V &v, X x) +{ + return v != x; +} + +template +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; diff --git a/Source/monster.cpp b/Source/monster.cpp index 2c79c9871..094c46ced 100644 --- a/Source/monster.cpp +++ b/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; } diff --git a/Source/objects.cpp b/Source/objects.cpp index c97c03585..5d3f344aa 100644 --- a/Source/objects.cpp +++ b/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;