Browse Source

Make UpdateMissileVelocity use missile current position as src

pull/2690/head
Anders Jenbo 5 years ago
parent
commit
08a29fe3a2
  1. 62
      Source/missiles.cpp

62
Source/missiles.cpp

@ -117,15 +117,15 @@ constexpr Direction16 Direction16Flip(Direction16 x, Direction16 pivot)
return static_cast<Direction16>(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<int>((dxp * (v << 16)) / dr);
missile.position.velocity.deltaY = static_cast<int>((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<Direction>(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<Direction>(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<Direction>(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<Direction>(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 }) {

Loading…
Cancel
Save