diff --git a/Source/missiles.cpp b/Source/missiles.cpp index ae95b3cf8..e0ddf044d 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -117,15 +117,15 @@ constexpr Direction16 Direction16Flip(Direction16 x, Direction16 pivot) return static_cast(ret); } -void UpdateMissileVelocity(MissileStruct &missile, Point source, Point destination, int v) +void UpdateMissileVelocity(MissileStruct &missile, Point destination, int v) { missile.position.velocity = { 0, 0 }; - if (source == destination) + if (missile.position.tile == destination) return; - double dxp = (destination.x + source.y - source.x - destination.y) * (1 << 21); - double dyp = (destination.y + destination.x - source.x - source.y) * (1 << 21); + double dxp = (destination.x + missile.position.tile.y - missile.position.tile.x - destination.y) * (1 << 21); + double dyp = (destination.y + destination.x - missile.position.tile.x - missile.position.tile.y) * (1 << 21); double dr = sqrt(dxp * dxp + dyp * dyp); missile.position.velocity.deltaX = static_cast((dxp * (v << 16)) / dr); missile.position.velocity.deltaY = static_cast((dyp * (v << 15)) / dr); @@ -1415,7 +1415,7 @@ void AddBerserk(MissileStruct &missile, Point dst, int /*midir*/) void AddHorkSpawn(MissileStruct &missile, Point dst, int midir) { - UpdateMissileVelocity(missile, missile.position.start, dst, 8); + UpdateMissileVelocity(missile, dst, 8); missile._mirange = 9; missile._miVar1 = midir; PutMissile(missile); @@ -1619,7 +1619,7 @@ void AddWarp(MissileStruct &missile, Point /*dst*/, int /*midir*/) void AddLightningWall(MissileStruct &missile, Point dst, int /*midir*/) { - UpdateMissileVelocity(missile, missile.position.start, dst, 16); + UpdateMissileVelocity(missile, dst, 16); missile._miAnimFrame = GenerateRnd(8) + 1; missile._mirange = 255 * (missile._mispllvl + 1); if (missile._misource < 0) { @@ -1658,7 +1658,7 @@ void AddFireNova(MissileStruct &missile, Point dst, int midir) if (missile._micaster == TARGET_MONSTERS) { sp += std::min(missile._mispllvl, 34); } - UpdateMissileVelocity(missile, missile.position.start, dst, sp); + UpdateMissileVelocity(missile, dst, sp); SetMissDir(missile, GetDirection16(missile.position.start, dst)); missile._mirange = 256; missile._miVar1 = missile.position.start.x; @@ -1673,7 +1673,7 @@ void AddLightningArrow(MissileStruct &missile, Point dst, int midir) if (missile.position.start == dst) { dst += static_cast(midir); } - UpdateMissileVelocity(missile, missile.position.start, dst, 32); + UpdateMissileVelocity(missile, dst, 32); missile._miAnimFrame = GenerateRnd(8) + 1; missile._mirange = 255; if (missile._misource < 0) { @@ -1776,7 +1776,7 @@ void AddCboltArrow(MissileStruct &missile, Point dst, int midir) } missile._miAnimFrame = GenerateRnd(8) + 1; missile._mlid = AddLight(missile.position.start, 5); - UpdateMissileVelocity(missile, missile.position.start, dst, 8); + UpdateMissileVelocity(missile, dst, 8); missile._miVar1 = 5; missile._miVar2 = midir; missile._mirange = 256; @@ -1809,7 +1809,7 @@ void AddLArrow(MissileStruct &missile, Point dst, int midir) av -= 1; } } - UpdateMissileVelocity(missile, missile.position.start, dst, av); + UpdateMissileVelocity(missile, dst, av); SetMissDir(missile, GetDirection16(missile.position.start, dst)); missile._mirange = 256; @@ -1846,7 +1846,7 @@ void AddArrow(MissileStruct &missile, Point dst, int midir) av += 8; } } - UpdateMissileVelocity(missile, missile.position.start, dst, av); + UpdateMissileVelocity(missile, dst, av); missile._miAnimFrame = GetDirection16(missile.position.start, dst) + 1; missile._mirange = 256; } @@ -1934,7 +1934,7 @@ void AddFirebolt(MissileStruct &missile, Point dst, int midir) if (i == ActiveMissileCount) UseMana(missile._misource, SPL_FIREBOLT); } - UpdateMissileVelocity(missile, missile.position.start, dst, sp); + UpdateMissileVelocity(missile, dst, sp); SetMissDir(missile, GetDirection16(missile.position.start, dst)); missile._mirange = 256; missile._miVar1 = missile.position.start.x; @@ -1944,7 +1944,7 @@ void AddFirebolt(MissileStruct &missile, Point dst, int midir) void AddMagmaball(MissileStruct &missile, Point dst, int /*midir*/) { - UpdateMissileVelocity(missile, missile.position.start, dst, 16); + UpdateMissileVelocity(missile, dst, 16); missile.position.traveled.deltaX += 3 * missile.position.velocity.deltaX; missile.position.traveled.deltaY += 3 * missile.position.velocity.deltaY; UpdateMissilePos(missile); @@ -1986,7 +1986,7 @@ void AddTeleport(MissileStruct &missile, Point dst, int /*midir*/) void AddLightball(MissileStruct &missile, Point dst, int /*midir*/) { - UpdateMissileVelocity(missile, missile.position.start, dst, 16); + UpdateMissileVelocity(missile, dst, 16); missile._miAnimFrame = GenerateRnd(8) + 1; missile._mirange = 255; if (missile._misource < 0) { @@ -2003,7 +2003,7 @@ void AddFirewall(MissileStruct &missile, Point dst, int /*midir*/) missile._midam = GenerateRndSum(10, 2) + 2; missile._midam += missile._misource >= 0 ? Players[missile._misource]._pLevel : currlevel; // BUGFIX: missing parenthesis around ternary (fixed) missile._midam <<= 3; - UpdateMissileVelocity(missile, missile.position.start, dst, 16); + UpdateMissileVelocity(missile, dst, 16); int i = missile._mispllvl; missile._mirange = 10; if (i > 0) @@ -2030,7 +2030,7 @@ void AddFireball(MissileStruct &missile, Point dst, int midir) UseMana(missile._misource, SPL_FIREBALL); } - UpdateMissileVelocity(missile, missile.position.start, dst, sp); + UpdateMissileVelocity(missile, dst, sp); SetMissDir(missile, GetDirection16(missile.position.start, dst)); missile._mirange = 256; missile._miVar1 = missile.position.start.x; @@ -2046,7 +2046,7 @@ void AddLightctrl(MissileStruct &missile, Point dst, int /*midir*/) UseMana(missile._misource, SPL_LIGHTNING); missile._miVar1 = missile.position.start.x; missile._miVar2 = missile.position.start.y; - UpdateMissileVelocity(missile, missile.position.start, dst, 32); + UpdateMissileVelocity(missile, dst, 32); missile._miAnimFrame = GenerateRnd(8) + 1; missile._mirange = 256; } @@ -2211,7 +2211,7 @@ void AddManashield(MissileStruct &missile, Point /*dst*/, int /*midir*/) void AddFiremove(MissileStruct &missile, Point dst, int /*midir*/) { missile._midam = GenerateRnd(10) + Players[missile._misource]._pLevel + 1; - UpdateMissileVelocity(missile, missile.position.start, dst, 16); + UpdateMissileVelocity(missile, dst, 16); missile._mirange = 255; missile._miVar1 = 0; missile._miVar2 = 0; @@ -2307,7 +2307,7 @@ void AddRhino(MissileStruct &missile, Point dst, int midir) graphic = MonsterGraphic::Attack; } } - UpdateMissileVelocity(missile, missile.position.start, dst, 18); + UpdateMissileVelocity(missile, dst, 18); InitMissileAnimationFromMonster(missile, midir, monster, graphic); if (monster.MType->mtype >= MT_NSNAKE && monster.MType->mtype <= MT_GSNAKE) missile._miAnimFrame = 7; @@ -2323,7 +2323,7 @@ void AddFlare(MissileStruct &missile, Point dst, int midir) if (missile.position.start == dst) { dst += static_cast(midir); } - UpdateMissileVelocity(missile, missile.position.start, dst, 16); + UpdateMissileVelocity(missile, dst, 16); missile._mirange = 256; missile._miVar1 = missile.position.start.x; missile._miVar2 = missile.position.start.y; @@ -2350,7 +2350,7 @@ void AddFlare(MissileStruct &missile, Point dst, int midir) void AddAcid(MissileStruct &missile, Point dst, int /*midir*/) { - UpdateMissileVelocity(missile, missile.position.start, dst, 16); + UpdateMissileVelocity(missile, dst, 16); SetMissDir(missile, GetDirection16(missile.position.start, dst)); if ((!gbIsHellfire && (missile.position.velocity.deltaX & 0xFFFF0000) != 0) || (missile.position.velocity.deltaY & 0xFFFF0000) != 0) missile._mirange = 5 * (Monsters[missile._misource]._mint + 4); @@ -2497,7 +2497,7 @@ void AddElement(MissileStruct &missile, Point dst, int midir) int dmg = 2 * (Players[missile._misource]._pLevel + GenerateRndSum(10, 2)) + 4; missile._midam = ScaleSpellEffect(dmg, missile._mispllvl) / 2; - UpdateMissileVelocity(missile, missile.position.start, dst, 16); + UpdateMissileVelocity(missile, dst, 16); SetMissDir(missile, GetDirection(missile.position.start, dst)); missile._mirange = 256; missile._miVar1 = missile.position.start.x; @@ -2706,7 +2706,7 @@ void AddFlamec(MissileStruct &missile, Point dst, int midir) if (missile.position.start == dst) { dst += static_cast(midir); } - UpdateMissileVelocity(missile, missile.position.start, dst, 32); + UpdateMissileVelocity(missile, dst, 32); if (missile._micaster == TARGET_MONSTERS) { UseMana(missile._misource, SPL_FLAME); } @@ -2727,7 +2727,7 @@ void AddCbolt(MissileStruct &missile, Point dst, int midir) missile._miAnimFrame = GenerateRnd(8) + 1; missile._mlid = AddLight(missile.position.start, 5); - UpdateMissileVelocity(missile, missile.position.start, dst, 8); + UpdateMissileVelocity(missile, dst, 8); missile._miVar1 = 5; missile._miVar2 = midir; missile._miVar3 = 0; @@ -2744,7 +2744,7 @@ void AddHbolt(MissileStruct &missile, Point dst, int midir) sp += std::min(missile._mispllvl * 2, 47); } - UpdateMissileVelocity(missile, missile.position.start, dst, sp); + UpdateMissileVelocity(missile, dst, sp); SetMissDir(missile, GetDirection16(missile.position.start, dst)); missile._mirange = 256; missile._miVar1 = missile.position.start.x; @@ -2786,7 +2786,7 @@ void AddBoneSpirit(MissileStruct &missile, Point dst, int midir) dst += static_cast(midir); } missile._midam = 0; - UpdateMissileVelocity(missile, missile.position.start, dst, 16); + UpdateMissileVelocity(missile, dst, 16); SetMissDir(missile, GetDirection(missile.position.start, dst)); missile._mirange = 256; missile._miVar1 = missile.position.start.x; @@ -4254,7 +4254,7 @@ void MI_Cbolt(int i) } missile._mirnd = (missile._mirnd + 1) & 0xF; - UpdateMissileVelocity(missile, missile.position.tile, missile.position.tile + md, 8); + UpdateMissileVelocity(missile, missile.position.tile + md, 8); missile._miVar3 = 16; } else { missile._miVar3--; @@ -4352,11 +4352,11 @@ void MI_Element(int i) if (monster != nullptr) { Direction sd = GetDirection(c, monster->position.tile); SetMissDir(missile, sd); - UpdateMissileVelocity(missile, c, monster->position.tile, 16); + UpdateMissileVelocity(missile, monster->position.tile, 16); } else { Direction sd = Players[id]._pdir; SetMissDir(missile, sd); - UpdateMissileVelocity(missile, c, c + sd, 16); + UpdateMissileVelocity(missile, c + sd, 16); } } if (c != Point { missile._miVar1, missile._miVar2 }) { @@ -4401,11 +4401,11 @@ void MI_Bonespirit(int i) if (monster != nullptr) { missile._midam = monster->_mhitpoints >> 7; SetMissDir(missile, GetDirection(c, monster->position.tile)); - UpdateMissileVelocity(missile, c, monster->position.tile, 16); + UpdateMissileVelocity(missile, monster->position.tile, 16); } else { Direction sd = Players[id]._pdir; SetMissDir(missile, sd); - UpdateMissileVelocity(missile, c, c + sd, 16); + UpdateMissileVelocity(missile, c + sd, 16); } } if (c != Point { missile._miVar1, missile._miVar2 }) {