Browse Source

Cleanup missile velocity calculations

pull/2210/head
Anders Jenbo 5 years ago
parent
commit
00f8cab32a
  1. 123
      Source/missiles.cpp

123
Source/missiles.cpp

@ -227,8 +227,7 @@ void GetDamageAmt(int i, int *mind, int *maxd)
static bool CheckBlock(Point from, Point to)
{
while (from != to) {
Direction pn = GetDirection(from, to);
from += pn;
from += GetDirection(from, to);
if (nSolidTable[dPiece[from.x][from.y]])
return true;
}
@ -1700,24 +1699,21 @@ void AddRuneExplosion(int mi, Point src, Point dst, int midir, int8_t mienemy, i
void AddImmolation(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam)
{
int i;
if (src == dst) {
dst += (Direction)midir;
}
int sp = 16;
if (mienemy == TARGET_MONSTERS) {
sp += std::min(missile[mi]._mispllvl * 2, 34);
missile[mi]._midam = 2 * (plr[id]._pLevel + GenerateRnd(10) + GenerateRnd(10)) + 4;
for (i = missile[mi]._mispllvl; i > 0; i--) {
for (int i = missile[mi]._mispllvl; i > 0; i--) {
missile[mi]._midam += missile[mi]._midam / 8;
}
i = 2 * missile[mi]._mispllvl + 16;
if (i > 50)
i = 50;
UseMana(id, SPL_FIREBALL);
} else {
i = 16;
}
GetMissileVel(mi, src, dst, i);
GetMissileVel(mi, src, dst, sp);
SetMissDir(mi, GetDirection16(src, dst));
missile[mi]._mirange = 256;
missile[mi]._miVar1 = src.x;
@ -1732,20 +1728,14 @@ void AddImmolation(int mi, Point src, Point dst, int midir, int8_t mienemy, int
void AddFireNova(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam)
{
int i;
if (src == dst) {
dst += (Direction)midir;
}
int sp = 16;
if (mienemy == TARGET_MONSTERS) {
i = missile[mi]._mispllvl + 16;
if (i > 50) {
i = 50;
}
} else {
i = 16;
sp += std::min(missile[mi]._mispllvl, 34);
}
GetMissileVel(mi, src, dst, i);
GetMissileVel(mi, src, dst, sp);
SetMissDir(mi, GetDirection16(src, dst));
missile[mi]._mirange = 256;
missile[mi]._miVar1 = src.x;
@ -1866,14 +1856,8 @@ void AddSearch(int mi, Point src, Point dst, int midir, int8_t mienemy, int id,
void AddCboltArrow(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam)
{
if (mienemy == TARGET_MONSTERS) {
if (id == myplr) {
missile[mi]._mirnd = GenerateRnd(15) + 1;
} else {
missile[mi]._mirnd = GenerateRnd(15) + 1;
}
} else {
missile[mi]._mirnd = GenerateRnd(15) + 1;
missile[mi]._mirnd = GenerateRnd(15) + 1;
if (mienemy != TARGET_MONSTERS) {
missile[mi]._midam = 15;
}
@ -1894,9 +1878,8 @@ void AddLArrow(int mi, Point src, Point dst, int midir, int8_t mienemy, int id,
if (src == dst) {
dst += (Direction)midir;
}
int av = 32;
if (mienemy == TARGET_MONSTERS) {
int av = 32;
if (plr[id]._pClass == HeroClass::Rogue)
av += (plr[id]._pLevel) / 4;
else if (plr[id]._pClass == HeroClass::Warrior || plr[id]._pClass == HeroClass::Bard)
@ -1915,10 +1898,8 @@ void AddLArrow(int mi, Point src, Point dst, int midir, int8_t mienemy, int id,
if (plr[id]._pClass == HeroClass::Rogue || plr[id]._pClass == HeroClass::Warrior || plr[id]._pClass == HeroClass::Bard)
av -= 1;
}
GetMissileVel(mi, src, dst, av);
} else
GetMissileVel(mi, src, dst, 32);
}
GetMissileVel(mi, src, dst, av);
SetMissDir(mi, GetDirection16(src, dst));
missile[mi]._mirange = 256;
@ -1929,13 +1910,11 @@ void AddLArrow(int mi, Point src, Point dst, int midir, int8_t mienemy, int id,
void AddArrow(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam)
{
int av;
if (src == dst) {
dst += (Direction)midir;
}
int av = 32;
if (mienemy == TARGET_MONSTERS) {
av = 32;
if ((plr[id]._pIFlags & ISPL_RNDARROWVEL) != 0) {
av = GenerateRnd(32) + 16;
}
@ -1953,10 +1932,8 @@ void AddArrow(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, i
if ((plr[id]._pIFlags & ISPL_FASTESTATTACK) != 0)
av += 8;
}
GetMissileVel(mi, src, dst, av);
} else {
GetMissileVel(mi, src, dst, 32);
}
GetMissileVel(mi, src, dst, av);
missile[mi]._miAnimFrame = GetDirection16(src, dst) + 1;
missile[mi]._mirange = 256;
}
@ -2025,28 +2002,24 @@ void AddRndTeleport(int mi, Point src, Point dst, int midir, int8_t mienemy, int
void AddFirebolt(int mi, Point src, Point dst, int midir, int8_t micaster, int id, int dam)
{
int i, mx, sp;
if (src == dst) {
dst += (Direction)midir;
}
if (!micaster) {
int sp = 26;
if (micaster == 0) {
sp = 16;
if (id != -1) {
sp += std::min(missile[mi]._mispllvl * 2, 47);
}
int i;
for (i = 0; i < nummissiles; i++) {
mx = missileactive[i];
int mx = missileactive[i];
if (missile[mx]._mitype == MIS_GUARDIAN && missile[mx]._misource == id && missile[mx]._miVar3 == mi)
break;
}
if (i == nummissiles)
UseMana(id, SPL_FIREBOLT);
if (id != -1) {
sp = 2 * missile[mi]._mispllvl + 16;
if (sp >= 63)
sp = 63;
} else {
sp = 16;
}
} else {
sp = 26;
}
GetMissileVel(mi, src, dst, sp);
SetMissDir(mi, GetDirection16(src, dst));
@ -2127,13 +2100,11 @@ void AddLightball(int mi, Point src, Point dst, int midir, int8_t mienemy, int i
void AddFirewall(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam)
{
int i;
missile[mi]._midam = GenerateRnd(10) + GenerateRnd(10) + 2;
missile[mi]._midam += id >= 0 ? plr[id]._pLevel : currlevel; // BUGFIX: missing parenthesis around ternary (fixed)
missile[mi]._midam <<= 3;
GetMissileVel(mi, src, dst, 16);
i = missile[mi]._mispllvl;
int i = missile[mi]._mispllvl;
missile[mi]._mirange = 10;
if (i > 0)
missile[mi]._mirange *= i + 1;
@ -2148,24 +2119,19 @@ void AddFirewall(int mi, Point src, Point dst, int midir, int8_t mienemy, int id
void AddFireball(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam)
{
int i;
if (src == dst) {
dst += (Direction)midir;
}
int sp = 16;
if (mienemy == TARGET_MONSTERS) {
sp += std::min(missile[mi]._mispllvl * 2, 34);
missile[mi]._midam = 2 * (plr[id]._pLevel + GenerateRnd(10) + GenerateRnd(10)) + 4;
for (i = missile[mi]._mispllvl; i > 0; i--) {
for (int i = missile[mi]._mispllvl; i > 0; i--) {
missile[mi]._midam += missile[mi]._midam / 8;
}
i = 2 * missile[mi]._mispllvl + 16;
if (i > 50)
i = 50;
UseMana(id, SPL_FIREBALL);
} else {
i = 16;
}
GetMissileVel(mi, src, dst, i);
GetMissileVel(mi, src, dst, sp);
SetMissDir(mi, GetDirection16(src, dst));
missile[mi]._mirange = 256;
missile[mi]._miVar1 = src.x;
@ -2741,13 +2707,11 @@ void AddHealOther(int mi, Point src, Point dst, int midir, int8_t mienemy, int i
void AddElement(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam)
{
int i;
if (src == dst) {
dst += (Direction)midir;
}
missile[mi]._midam = 2 * (plr[id]._pLevel + GenerateRnd(10) + GenerateRnd(10)) + 4;
for (i = missile[mi]._mispllvl; i > 0; i--) {
for (int i = missile[mi]._mispllvl; i > 0; i--) {
missile[mi]._midam += missile[mi]._midam / 8;
}
missile[mi]._midam /= 2;
@ -2999,17 +2963,10 @@ void AddCbolt(int mi, Point src, Point dst, int midir, int8_t micaster, int id,
{
assert((DWORD)mi < MAXMISSILES);
missile[mi]._mirnd = GenerateRnd(15) + 1;
missile[mi]._midam = 15;
if (micaster == 0) {
if (id == myplr) {
missile[mi]._mirnd = GenerateRnd(15) + 1;
missile[mi]._midam = GenerateRnd(plr[id]._pMagic / 4) + 1;
} else {
missile[mi]._mirnd = GenerateRnd(15) + 1;
missile[mi]._midam = GenerateRnd(plr[id]._pMagic / 4) + 1;
}
} else {
missile[mi]._mirnd = GenerateRnd(15) + 1;
missile[mi]._midam = 15;
missile[mi]._midam = GenerateRnd(plr[id]._pMagic / 4) + 1;
}
if (src == dst) {
@ -3027,18 +2984,12 @@ void AddCbolt(int mi, Point src, Point dst, int midir, int8_t micaster, int id,
void AddHbolt(int mi, Point src, Point dst, int midir, int8_t micaster, int id, int dam)
{
int sp;
if (src == dst) {
dst += (Direction)midir;
}
int sp = 16;
if (id != -1) {
sp = 2 * missile[mi]._mispllvl + 16;
if (sp >= 63) {
sp = 63;
}
} else {
sp = 16;
sp += std::min(missile[mi]._mispllvl * 2, 47);
}
GetMissileVel(mi, src, dst, sp);
SetMissDir(mi, GetDirection16(src, dst));

Loading…
Cancel
Save