From e2aa3d1c57d1d8249504281bc239fd3130421eb3 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Fri, 23 Apr 2021 04:04:02 +0200 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8FDeduplicate=20LineClear?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Source/missiles.cpp | 28 +++++----- Source/monster.cpp | 128 +++++++++----------------------------------- Source/monster.h | 8 +-- 3 files changed, 43 insertions(+), 121 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 28982fbc6..9056d9982 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -1310,7 +1310,7 @@ static bool missiles_found_target(Sint32 mi, Sint32 *x, Sint32 *y, Sint32 rad) void AddFireRune(Sint32 mi, Sint32 sx, Sint32 sy, Sint32 dx, Sint32 dy, Sint32 midir, Sint8 mienemy, Sint32 id, Sint32 dam) { - if (LineClear(sx, sy, dx, dy)) { + if (LineClearMissile(sx, sy, dx, dy)) { if (id >= 0) UseMana(id, SPL_RUNEFIRE); if (missiles_found_target(mi, &dx, &dy, 10)) { @@ -1327,7 +1327,7 @@ void AddFireRune(Sint32 mi, Sint32 sx, Sint32 sy, Sint32 dx, Sint32 dy, Sint32 m void AddLightningRune(Sint32 mi, Sint32 sx, Sint32 sy, Sint32 dx, Sint32 dy, Sint32 midir, Sint8 mienemy, Sint32 id, Sint32 dam) { - if (LineClear(sx, sy, dx, dy)) { + if (LineClearMissile(sx, sy, dx, dy)) { if (id >= 0) UseMana(id, SPL_RUNELIGHT); if (missiles_found_target(mi, &dx, &dy, 10)) { @@ -1344,7 +1344,7 @@ void AddLightningRune(Sint32 mi, Sint32 sx, Sint32 sy, Sint32 dx, Sint32 dy, Sin void AddGreatLightningRune(Sint32 mi, Sint32 sx, Sint32 sy, Sint32 dx, Sint32 dy, Sint32 midir, Sint8 mienemy, Sint32 id, Sint32 dam) { - if (LineClear(sx, sy, dx, dy)) { + if (LineClearMissile(sx, sy, dx, dy)) { if (id >= 0) UseMana(id, SPL_RUNENOVA); if (missiles_found_target(mi, &dx, &dy, 10)) { @@ -1361,7 +1361,7 @@ void AddGreatLightningRune(Sint32 mi, Sint32 sx, Sint32 sy, Sint32 dx, Sint32 dy void AddImmolationRune(Sint32 mi, Sint32 sx, Sint32 sy, Sint32 dx, Sint32 dy, Sint32 midir, Sint8 mienemy, Sint32 id, Sint32 dam) { - if (LineClear(sx, sy, dx, dy)) { + if (LineClearMissile(sx, sy, dx, dy)) { if (id >= 0) UseMana(id, SPL_RUNEIMMOLAT); if (missiles_found_target(mi, &dx, &dy, 10)) { @@ -1378,7 +1378,7 @@ void AddImmolationRune(Sint32 mi, Sint32 sx, Sint32 sy, Sint32 dx, Sint32 dy, Si void AddStoneRune(Sint32 mi, Sint32 sx, Sint32 sy, Sint32 dx, Sint32 dy, Sint32 midir, Sint8 mienemy, Sint32 id, Sint32 dam) { - if (LineClear(sx, sy, dx, dy)) { + if (LineClearMissile(sx, sy, dx, dy)) { if (id >= 0) UseMana(id, SPL_RUNESTONE); if (missiles_found_target(mi, &dx, &dy, 10)) { @@ -2454,7 +2454,7 @@ void AddGuardian(Sint32 mi, Sint32 sx, Sint32 sy, Sint32 dx, Sint32 dy, Sint32 m ty = dy + CrawlTable[k]; pn = dPiece[tx][ty]; if (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) { - if (LineClear(sx, sy, tx, ty)) { + if (LineClearMissile(sx, sy, tx, ty)) { if ((dMonster[tx][ty] | nSolidTable[pn] | nMissileTable[pn] | dObject[tx][ty] | dMissile[tx][ty]) == 0) { missile[mi]._mix = tx; missile[mi]._miy = ty; @@ -2873,7 +2873,7 @@ void AddFirewallC(Sint32 mi, Sint32 sx, Sint32 sy, Sint32 dx, Sint32 dy, Sint32 ty = dy + CrawlTable[pn]; if (0 < tx && tx < MAXDUNX && 0 < ty && ty < MAXDUNY) { k = dPiece[tx][ty]; - if (LineClear(sx, sy, tx, ty)) { + if (LineClearMissile(sx, sy, tx, ty)) { if ((sx != tx || sy != ty) && (nSolidTable[k] | dObject[tx][ty]) == 0) { missile[mi]._miVar1 = tx; missile[mi]._miVar2 = ty; @@ -3206,7 +3206,7 @@ void AddDiabApoca(Sint32 mi, Sint32 sx, Sint32 sy, Sint32 dx, Sint32 dy, Sint32 int players = gbIsMultiplayer ? MAX_PLRS : 1; for (pnum = 0; pnum < players; pnum++) { if (plr[pnum].plractive) { - if (LineClear(sx, sy, plr[pnum]._pfutx, plr[pnum]._pfuty)) { + if (LineClearMissile(sx, sy, plr[pnum]._pfutx, plr[pnum]._pfuty)) { AddMissile(0, 0, plr[pnum]._pfutx, plr[pnum]._pfuty, 0, MIS_BOOM2, mienemy, id, dam, 0); } } @@ -3284,7 +3284,7 @@ int AddMissile(int sx, int sy, int dx, int dy, int midir, int mitype, int8_t mic int Sentfire(int i, int sx, int sy) { int ex = 0; - if (LineClear(missile[i]._mix, missile[i]._miy, sx, sy)) { + if (LineClearMissile(missile[i]._mix, missile[i]._miy, sx, sy)) { if (dMonster[sx][sy] > 0 && monster[dMonster[sx][sy] - 1]._mhitpoints >> 6 > 0 && dMonster[sx][sy] - 1 > MAX_PLRS - 1) { direction dir = GetDirection(missile[i]._mix, missile[i]._miy, sx, sy); missile[i]._miVar3 = missileavail[0]; @@ -3321,7 +3321,7 @@ void MI_Golem(Sint32 i) ty = missile[i]._miVar5 + *ct; if (0 < tx && tx < MAXDUNX && 0 < ty && ty < MAXDUNY) { dp = dPiece[tx][ty]; - if (LineClear(missile[i]._miVar1, missile[i]._miVar2, tx, ty)) { + if (LineClearMissile(missile[i]._miVar1, missile[i]._miVar2, tx, ty)) { if ((dMonster[tx][ty] | nSolidTable[dp] | dObject[tx][ty]) == 0) { l = 6; SpawnGolum(src, tx, ty, i); @@ -3997,7 +3997,7 @@ void MI_FireRing(Sint32 i) if (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) { dp = dPiece[tx][ty]; if (!nSolidTable[dp] && dObject[tx][ty] == 0) { - if (LineClear(missile[i]._mix, missile[i]._miy, tx, ty)) { + if (LineClearMissile(missile[i]._mix, missile[i]._miy, tx, ty)) { if (nMissileTable[dp] || missile[i]._miVar8) missile[i]._miVar8 = 1; else @@ -4028,7 +4028,7 @@ void MI_LightningRing(Sint32 i) if (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) { dp = dPiece[tx][ty]; if (!nSolidTable[dp] && dObject[tx][ty] == 0) { - if (LineClear(missile[i]._mix, missile[i]._miy, tx, ty)) { + if (LineClearMissile(missile[i]._mix, missile[i]._miy, tx, ty)) { if (nMissileTable[dp] || missile[i]._miVar8) missile[i]._miVar8 = 1; else @@ -4780,7 +4780,7 @@ void MI_Fireman(Sint32 i) } else { j = dMonster[bx][by]; } - if (!PosOkMissile(bx, by) || (j > 0 && !(missile[i]._miVar1 & 1))) { + if (!PosOkMissile(0, bx, by) || (j > 0 && !(missile[i]._miVar1 & 1))) { missile[i]._mixvel *= -1; missile[i]._miyvel *= -1; missile[i]._mimfnum = opposite[missile[i]._mimfnum]; @@ -4844,7 +4844,7 @@ void MI_Apoca(Sint32 i) for (j = missile[i]._miVar2; j < missile[i]._miVar3 && !exit; j++) { for (k = missile[i]._miVar4; k < missile[i]._miVar5 && !exit; k++) { if (dMonster[k][j] > MAX_PLRS - 1 && !nSolidTable[dPiece[k][j]]) { - if (!gbIsHellfire || LineClear(missile[i]._mix, missile[i]._miy, k, j)) { + if (!gbIsHellfire || LineClearMissile(missile[i]._mix, missile[i]._miy, k, j)) { AddMissile(k, j, k, j, plr[id]._pdir, MIS_BOOM, TARGET_MONSTERS, id, missile[i]._midam, 0); exit = true; } diff --git a/Source/monster.cpp b/Source/monster.cpp index ed6a038f5..3950e4fd1 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -2824,7 +2824,7 @@ void GroupUnity(int i) if (monster[i].leaderflag != 0) { leader = monster[i].leader; - clear = LineClearF(CheckNoSolid, monster[i]._mx, monster[i]._my, monster[leader]._mfutx, monster[leader]._mfuty); + clear = LineClearSolid(monster[i]._mx, monster[i]._my, monster[leader]._mfutx, monster[leader]._mfuty); if (clear || monster[i].leaderflag != 1) { if (clear && monster[i].leaderflag == 2 @@ -3063,7 +3063,7 @@ bool MAI_Path(int i) return false; } - clear = LineClearF1( + clear = LineClear( PosOkMonst2, i, Monst->_mx, @@ -3105,7 +3105,7 @@ void MAI_Snake(int i) direction md = GetDirection(Monst->_mx, Monst->_my, Monst->_lastx, Monst->_lasty); Monst->_mdir = md; if (abs(mx) >= 2 || abs(my) >= 2) { - if (abs(mx) < 3 && abs(my) < 3 && LineClearF1(PosOkMonst, i, Monst->_mx, Monst->_my, fx, fy) && Monst->_mVar1 != MM_CHARGE) { + if (abs(mx) < 3 && abs(my) < 3 && LineClear(PosOkMonst, i, Monst->_mx, Monst->_my, fx, fy) && Monst->_mVar1 != MM_CHARGE) { if (AddMissile(Monst->_mx, Monst->_my, fx, fy, md, MIS_RHINO, pnum, i, 0, 0) != -1) { PlayEffect(i, 0); dMonster[Monst->_mx][Monst->_my] = -(i + 1); @@ -3188,7 +3188,7 @@ void MAI_Bat(int i) if (Monst->MType->mtype == MT_GLOOM && (abs(xd) >= 5 || abs(yd) >= 5) && v < 4 * Monst->_mint + 33 - && LineClearF1(PosOkMonst, i, Monst->_mx, Monst->_my, fx, fy)) { + && LineClear(PosOkMonst, i, Monst->_mx, Monst->_my, fx, fy)) { if (AddMissile(Monst->_mx, Monst->_my, fx, fy, md, MIS_RHINO, pnum, i, 0, 0) != -1) { dMonster[Monst->_mx][Monst->_my] = -(i + 1); Monst->_mmode = MM_CHARGE; @@ -3247,7 +3247,7 @@ void MAI_SkelBow(int i) my = Monst->_menemyy; if (!walking) { if (GenerateRnd(100) < 2 * Monst->_mint + 3) { - if (LineClear(Monst->_mx, Monst->_my, mx, my)) + if (LineClearMissile(Monst->_mx, Monst->_my, mx, my)) M_StartRAttack(i, MIS_ARROW, 4); } } @@ -3376,7 +3376,7 @@ void MAI_Fireman(int i) direction md = M_GetDir(i); if (Monst->_mgoal == MGOAL_NORMAL) { - if (LineClear(Monst->_mx, Monst->_my, fx, fy) + if (LineClearMissile(Monst->_mx, Monst->_my, fx, fy) && AddMissile(Monst->_mx, Monst->_my, fx, fy, md, MIS_FIREMAN, pnum, i, 0, 0) != -1) { Monst->_mmode = MM_CHARGE; Monst->_mgoal = MGOAL_ATTACK2; @@ -3386,7 +3386,7 @@ void MAI_Fireman(int i) if (Monst->_mgoalvar1 == 3) { Monst->_mgoal = MGOAL_NORMAL; M_StartFadeout(i, md, true); - } else if (LineClear(Monst->_mx, Monst->_my, fx, fy)) { + } else if (LineClearMissile(Monst->_mx, Monst->_my, fx, fy)) { M_StartRAttack(i, MIS_KRULL, 4); Monst->_mgoalvar1++; } else { @@ -3602,7 +3602,7 @@ void MAI_Ranged(int i, int missile_type, bool special) M_CallWalk(i, opposite[md]); } if (Monst->_mmode == MM_STAND) { - if (LineClear(Monst->_mx, Monst->_my, fx, fy)) { + if (LineClearMissile(Monst->_mx, Monst->_my, fx, fy)) { if (special) M_StartRSpAttack(i, missile_type, 4); else @@ -3716,8 +3716,7 @@ void MAI_Scav(int i) if (y < 0 || y >= MAXDUNY || x < 0 || x >= MAXDUNX) continue; done = dDead[Monst->_mx + x][Monst->_my + y] != 0 - && LineClearF( - CheckNoSolid, + && LineClearSolid( Monst->_mx, Monst->_my, Monst->_mx + x, @@ -3733,8 +3732,7 @@ void MAI_Scav(int i) if (y < 0 || y >= MAXDUNY || x < 0 || x >= MAXDUNX) continue; done = dDead[Monst->_mx + x][Monst->_my + y] != 0 - && LineClearF( - CheckNoSolid, + && LineClearSolid( Monst->_mx, Monst->_my, Monst->_mx + x, @@ -3830,7 +3828,7 @@ void MAI_RoundRanged(int i, int missile_type, bool checkdoors, int dam, int less if (Monst->_mgoalvar1++ >= 2 * dist && DirOK(i, md)) { Monst->_mgoal = MGOAL_NORMAL; } else if (v < (500 * (Monst->_mint + 1) >> lessmissiles) - && (LineClear(Monst->_mx, Monst->_my, fx, fy))) { + && (LineClearMissile(Monst->_mx, Monst->_my, fx, fy))) { M_StartRSpAttack(i, missile_type, dam); } else { M_RoundWalk(i, md, &Monst->_mgoalvar2); @@ -3842,7 +3840,7 @@ void MAI_RoundRanged(int i, int missile_type, bool checkdoors, int dam, int less if (Monst->_mgoal == MGOAL_NORMAL) { if (((dist >= 3 && v < ((500 * (Monst->_mint + 2)) >> lessmissiles)) || v < ((500 * (Monst->_mint + 1)) >> lessmissiles)) - && LineClear(Monst->_mx, Monst->_my, fx, fy)) { + && LineClearMissile(Monst->_mx, Monst->_my, fx, fy)) { M_StartRSpAttack(i, missile_type, dam); } else if (dist >= 2) { v = GenerateRnd(100); @@ -3929,7 +3927,7 @@ void MAI_RR2(int i, int mistype, int dam) } else Monst->_mgoal = MGOAL_NORMAL; if (Monst->_mgoal == MGOAL_NORMAL) { - if (((dist >= 3 && v < 5 * (Monst->_mint + 2)) || v < 5 * (Monst->_mint + 1) || Monst->_mgoalvar3 == 4) && LineClear(Monst->_mx, Monst->_my, fx, fy)) { + if (((dist >= 3 && v < 5 * (Monst->_mint + 2)) || v < 5 * (Monst->_mint + 1) || Monst->_mgoalvar3 == 4) && LineClearMissile(Monst->_mx, Monst->_my, fx, fy)) { M_StartRSpAttack(i, mistype, dam); } else if (dist >= 2) { v = GenerateRnd(100); @@ -4074,7 +4072,7 @@ void MAI_SkelKing(int i) if (Monst->_mgoal == MGOAL_NORMAL) { if (!gbIsMultiplayer && ((dist >= 3 && v < 4 * Monst->_mint + 35) || v < 6) - && LineClear(Monst->_mx, Monst->_my, fx, fy)) { + && LineClearMissile(Monst->_mx, Monst->_my, fx, fy)) { nx = Monst->_mx + offset_x[md]; ny = Monst->_my + offset_y[md]; if (PosOkMonst(i, nx, ny) && nummonsters < MAXMONSTERS) { @@ -4137,7 +4135,7 @@ void MAI_Rhino(int i) if (Monst->_mgoal == MGOAL_NORMAL) { if (dist >= 5 && v < 2 * Monst->_mint + 43 - && LineClearF1(PosOkMonst, i, Monst->_mx, Monst->_my, fx, fy)) { + && LineClear(PosOkMonst, i, Monst->_mx, Monst->_my, fx, fy)) { if (AddMissile(Monst->_mx, Monst->_my, fx, fy, md, MIS_RHINO, Monst->_menemy, i, 0, 0) != -1) { if (Monst->MData->snd_special) PlayEffect(i, 3); @@ -4277,7 +4275,7 @@ void MAI_Counselor(int i) } } else if (Monst->_mgoal == MGOAL_NORMAL) { if (abs(mx) >= 2 || abs(my) >= 2) { - if (v < 5 * (Monst->_mint + 10) && LineClear(Monst->_mx, Monst->_my, fx, fy)) { + if (v < 5 * (Monst->_mint + 10) && LineClearMissile(Monst->_mx, Monst->_my, fx, fy)) { M_StartRAttack(i, counsmiss[Monst->_mint], Monst->mMinDamage + GenerateRnd(Monst->mMaxDamage - Monst->mMinDamage + 1)); } else if (GenerateRnd(100) < 30) { Monst->_mgoal = MGOAL_MOVE; @@ -4851,103 +4849,27 @@ bool DirOK(int i, direction mdir) return mcount == monster[i].packsize; } -bool PosOkMissile(int x, int y) +bool PosOkMissile(int entity, int x, int y) { return !nMissileTable[dPiece[x][y]] && !(dFlags[x][y] & BFLAG_MONSTLR); } -bool CheckNoSolid(int x, int y) +bool CheckNoSolid(int entity, int x, int y) { return !nSolidTable[dPiece[x][y]]; } -bool LineClearF(bool (*Clear)(int, int), int x1, int y1, int x2, int y2) +bool LineClearSolid(int x1, int y1, int x2, int y2) { - int xorg, yorg; - int dx, dy; - int d; - int xincD, yincD, dincD, dincH; - int tmp; - bool done = false; - - xorg = x1; - yorg = y1; - dx = x2 - x1; - dy = y2 - y1; - if (abs(dx) > abs(dy)) { - if (dx < 0) { - tmp = x1; - x1 = x2; - x2 = tmp; - tmp = y1; - y1 = y2; - y2 = tmp; - dx = -dx; - dy = -dy; - } - if (dy > 0) { - d = 2 * dy - dx; - dincD = 2 * dy; - dincH = 2 * (dy - dx); - yincD = 1; - } else { - d = 2 * dy + dx; - dincD = 2 * dy; - dincH = 2 * (dx + dy); - yincD = -1; - } - while (!done && (x1 != x2 || y1 != y2)) { - if ((d <= 0) ^ (yincD < 0)) { - d += dincD; - } else { - d += dincH; - y1 += yincD; - } - x1++; - done = ((x1 != xorg || y1 != yorg) && !Clear(x1, y1)); - } - } else { - if (dy < 0) { - tmp = y1; - y1 = y2; - y2 = tmp; - tmp = x1; - x1 = x2; - x2 = tmp; - dy = -dy; - dx = -dx; - } - if (dx > 0) { - d = 2 * dx - dy; - dincD = 2 * dx; - dincH = 2 * (dx - dy); - xincD = 1; - } else { - d = 2 * dx + dy; - dincD = 2 * dx; - dincH = 2 * (dy + dx); - xincD = -1; - } - while (!done && (y1 != y2 || x1 != x2)) { - if ((d <= 0) ^ (xincD < 0)) { - d += dincD; - } else { - d += dincH; - x1 += xincD; - } - y1++; - done = ((y1 != yorg || x1 != xorg) && !Clear(x1, y1)); - } - } - return x1 == x2 && y1 == y2; + return LineClear(CheckNoSolid, 0, x1, y1, x2, y2); } -bool LineClear(int x1, int y1, int x2, int y2) +bool LineClearMissile(int x1, int y1, int x2, int y2) { - return LineClearF(PosOkMissile, x1, y1, x2, y2); + return LineClear(PosOkMissile, 0, x1, y1, x2, y2); } -bool LineClearF1(bool (*Clear)(int, int, int), int monst, int x1, int y1, int x2, int y2) +bool LineClear(bool (*Clear)(int, int, int), int entity, int x1, int y1, int x2, int y2) { int dx, dy; int d; @@ -4990,7 +4912,7 @@ bool LineClearF1(bool (*Clear)(int, int, int), int monst, int x1, int y1, int x2 y1 += yincD; } x1++; - done = ((x1 != xorg || y1 != yorg) && !Clear(monst, x1, y1)); + done = ((x1 != xorg || y1 != yorg) && !Clear(entity, x1, y1)); } } else { if (dy < 0) { @@ -5022,7 +4944,7 @@ bool LineClearF1(bool (*Clear)(int, int, int), int monst, int x1, int y1, int x2 x1 += xincD; } y1++; - done = ((y1 != yorg || x1 != xorg) && !Clear(monst, x1, y1)); + done = ((y1 != yorg || x1 != xorg) && !Clear(entity, x1, y1)); } } return x1 == x2 && y1 == y2; diff --git a/Source/monster.h b/Source/monster.h index 4cf05484f..8cc8334d9 100644 --- a/Source/monster.h +++ b/Source/monster.h @@ -302,11 +302,11 @@ void DeleteMonsterList(); void ProcessMonsters(); void FreeMonsters(); bool DirOK(int i, direction mdir); -bool PosOkMissile(int x, int y); -bool CheckNoSolid(int x, int y); -bool LineClearF(bool (*Clear)(int, int), int x1, int y1, int x2, int y2); +bool PosOkMissile(int entity, int x, int y); +bool LineClearSolid(int x1, int y1, int x2, int y2); +bool LineClearMissile(int x1, int y1, int x2, int y2); bool LineClear(int x1, int y1, int x2, int y2); -bool LineClearF1(bool (*Clear)(int, int, int), int monst, int x1, int y1, int x2, int y2); +bool LineClear(bool (*Clear)(int, int, int), int entity, int x1, int y1, int x2, int y2); void SyncMonsterAnim(int i); void M_FallenFear(int x, int y); void PrintMonstHistory(int mt);