Browse Source

refactor UpdateMissileVelocity

refactor MI_ResurrectBeam

Co-authored-by: Anders Jenbo <anders@jenbo.dk>
pull/2626/head
BC Ko 5 years ago committed by Anders Jenbo
parent
commit
aa109b14b4
  1. 535
      Source/missiles.cpp

535
Source/missiles.cpp

@ -114,9 +114,9 @@ constexpr Direction16 Direction16Flip(Direction16 x, Direction16 pivot)
return static_cast<Direction16>(ret);
}
void UpdateMissileVelocity(int i, Point source, Point destination, int v)
void UpdateMissileVelocity(MissileStruct &missile, Point source, Point destination, int v)
{
Missiles[i].position.velocity = { 0, 0 };
missile.position.velocity = { 0, 0 };
if (source == destination)
return;
@ -124,8 +124,8 @@ void UpdateMissileVelocity(int i, Point source, Point destination, int v)
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 dr = sqrt(dxp * dxp + dyp * dyp);
Missiles[i].position.velocity.deltaX = static_cast<int>((dxp * (v << 16)) / dr);
Missiles[i].position.velocity.deltaY = static_cast<int>((dyp * (v << 15)) / dr);
missile.position.velocity.deltaX = static_cast<int>((dxp * (v << 16)) / dr);
missile.position.velocity.deltaY = static_cast<int>((dyp * (v << 15)) / dr);
}
/**
@ -1404,9 +1404,10 @@ void AddBerserk(int mi, Point /*src*/, Point dst, int /*midir*/, int8_t /*mienem
void AddHorkSpawn(int mi, Point src, Point dst, int midir, int8_t /*mienemy*/, int /*id*/, int /*dam*/)
{
UpdateMissileVelocity(mi, src, dst, 8);
Missiles[mi]._mirange = 9;
Missiles[mi]._miVar1 = midir;
auto &missile = Missiles[mi];
UpdateMissileVelocity(missile, src, dst, 8);
missile._mirange = 9;
missile._miVar1 = midir;
PutMissile(mi);
}
@ -1613,16 +1614,17 @@ void AddWarp(int mi, Point src, Point /*dst*/, int /*midir*/, int8_t mienemy, in
void AddLightningWall(int mi, Point src, Point dst, int /*midir*/, int8_t /*mienemy*/, int id, int dam)
{
UpdateMissileVelocity(mi, src, dst, 16);
Missiles[mi]._midam = dam;
Missiles[mi]._miAnimFrame = GenerateRnd(8) + 1;
Missiles[mi]._mirange = 255 * (Missiles[mi]._mispllvl + 1);
auto &missile = Missiles[mi];
UpdateMissileVelocity(missile, src, dst, 16);
missile._midam = dam;
missile._miAnimFrame = GenerateRnd(8) + 1;
missile._mirange = 255 * (Missiles[mi]._mispllvl + 1);
if (id < 0) {
Missiles[mi]._miVar1 = src.x;
Missiles[mi]._miVar2 = src.y;
missile._miVar1 = src.x;
missile._miVar2 = src.y;
} else {
Missiles[mi]._miVar1 = Players[id].position.tile.x;
Missiles[mi]._miVar2 = Players[id].position.tile.y;
missile._miVar1 = Players[id].position.tile.x;
missile._miVar2 = Players[id].position.tile.y;
}
}
@ -1646,22 +1648,23 @@ void AddRuneExplosion(int mi, Point src, Point /*dst*/, int /*midir*/, int8_t mi
void AddFireNova(int mi, Point src, Point dst, int midir, int8_t mienemy, int /*id*/, int /*dam*/)
{
auto &missile = Missiles[mi];
if (src == dst) {
dst += static_cast<Direction>(midir);
}
int sp = 16;
if (mienemy == TARGET_MONSTERS) {
sp += std::min(Missiles[mi]._mispllvl, 34);
sp += std::min(missile._mispllvl, 34);
}
UpdateMissileVelocity(mi, src, dst, sp);
UpdateMissileVelocity(missile, src, dst, sp);
SetMissDir(mi, GetDirection16(src, dst));
Missiles[mi]._mirange = 256;
Missiles[mi]._miVar1 = src.x;
Missiles[mi]._miVar2 = src.y;
Missiles[mi]._miVar3 = 0;
Missiles[mi]._miVar4 = src.x;
Missiles[mi]._miVar5 = src.y;
Missiles[mi]._mlid = AddLight(src, 8);
missile._mirange = 256;
missile._miVar1 = src.x;
missile._miVar2 = src.y;
missile._miVar3 = 0;
missile._miVar4 = src.x;
missile._miVar5 = src.y;
missile._mlid = AddLight(src, 8);
}
void AddLightningArrow(int mi, Point src, Point dst, int midir, int8_t /*mienemy*/, int id, int /*dam*/)
@ -1669,17 +1672,18 @@ void AddLightningArrow(int mi, Point src, Point dst, int midir, int8_t /*mienemy
if (src == dst) {
dst += static_cast<Direction>(midir);
}
UpdateMissileVelocity(mi, src, dst, 32);
Missiles[mi]._miAnimFrame = GenerateRnd(8) + 1;
Missiles[mi]._mirange = 255;
auto &missile = Missiles[mi];
UpdateMissileVelocity(missile, src, dst, 32);
missile._miAnimFrame = GenerateRnd(8) + 1;
missile._mirange = 255;
if (id < 0) {
Missiles[mi]._miVar1 = src.x;
Missiles[mi]._miVar2 = src.y;
missile._miVar1 = src.x;
missile._miVar2 = src.y;
} else {
Missiles[mi]._miVar1 = Players[id].position.tile.x;
Missiles[mi]._miVar2 = Players[id].position.tile.y;
missile._miVar1 = Players[id].position.tile.x;
missile._miVar2 = Players[id].position.tile.y;
}
Missiles[mi]._midam <<= 6;
missile._midam <<= 6;
}
void AddMana(int mi, Point /*src*/, Point /*dst*/, int /*midir*/, int8_t /*mienemy*/, int id, int /*dam*/)
@ -1773,21 +1777,22 @@ void AddSearch(int mi, Point /*src*/, Point /*dst*/, int /*midir*/, int8_t miene
void AddCboltArrow(int mi, Point src, Point dst, int midir, int8_t mienemy, int /*id*/, int /*dam*/)
{
Missiles[mi]._mirnd = GenerateRnd(15) + 1;
auto &missile = Missiles[mi];
missile._mirnd = GenerateRnd(15) + 1;
if (mienemy != TARGET_MONSTERS) {
Missiles[mi]._midam = 15;
missile._midam = 15;
}
if (src == dst) {
dst += static_cast<Direction>(midir);
}
Missiles[mi]._miAnimFrame = GenerateRnd(8) + 1;
Missiles[mi]._mlid = AddLight(src, 5);
UpdateMissileVelocity(mi, src, dst, 8);
Missiles[mi]._miVar1 = 5;
Missiles[mi]._miVar2 = midir;
Missiles[mi]._miVar3 = 0;
Missiles[mi]._mirange = 256;
missile._miAnimFrame = GenerateRnd(8) + 1;
missile._mlid = AddLight(src, 5);
UpdateMissileVelocity(missile, src, dst, 8);
missile._miVar1 = 5;
missile._miVar2 = midir;
missile._miVar3 = 0;
missile._mirange = 256;
}
void AddLArrow(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int /*dam*/)
@ -1817,13 +1822,14 @@ void AddLArrow(int mi, Point src, Point dst, int midir, int8_t mienemy, int id,
av -= 1;
}
}
UpdateMissileVelocity(mi, src, dst, av);
auto &missile = Missiles[mi];
UpdateMissileVelocity(missile, src, dst, av);
SetMissDir(mi, GetDirection16(src, dst));
Missiles[mi]._mirange = 256;
Missiles[mi]._miVar1 = src.x;
Missiles[mi]._miVar2 = src.y;
Missiles[mi]._mlid = AddLight(src, 5);
missile._mirange = 256;
missile._miVar1 = src.x;
missile._miVar2 = src.y;
missile._mlid = AddLight(src, 5);
}
void AddArrow(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int /*dam*/)
@ -1854,9 +1860,10 @@ void AddArrow(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, i
av += 8;
}
}
UpdateMissileVelocity(mi, src, dst, av);
Missiles[mi]._miAnimFrame = GetDirection16(src, dst) + 1;
Missiles[mi]._mirange = 256;
auto &missile = Missiles[mi];
UpdateMissileVelocity(missile, src, dst, av);
missile._miAnimFrame = GetDirection16(src, dst) + 1;
missile._mirange = 256;
}
void UpdateVileMissPos(int mi, Point dst)
@ -1926,11 +1933,12 @@ void AddFirebolt(int mi, Point src, Point dst, int midir, int8_t micaster, int i
if (src == dst) {
dst += static_cast<Direction>(midir);
}
auto &missile = Missiles[mi];
int sp = 26;
if (micaster == 0) {
sp = 16;
if (id != -1) {
sp += std::min(Missiles[mi]._mispllvl * 2, 47);
sp += std::min(missile._mispllvl * 2, 47);
}
int i;
@ -1942,32 +1950,34 @@ void AddFirebolt(int mi, Point src, Point dst, int midir, int8_t micaster, int i
if (i == ActiveMissileCount)
UseMana(id, SPL_FIREBOLT);
}
UpdateMissileVelocity(mi, src, dst, sp);
UpdateMissileVelocity(missile, src, dst, sp);
SetMissDir(mi, GetDirection16(src, dst));
Missiles[mi]._mirange = 256;
Missiles[mi]._miVar1 = src.x;
Missiles[mi]._miVar2 = src.y;
Missiles[mi]._mlid = AddLight(src, 8);
missile._mirange = 256;
missile._miVar1 = src.x;
missile._miVar2 = src.y;
missile._mlid = AddLight(src, 8);
}
void AddMagmaball(int mi, Point src, Point dst, int /*midir*/, int8_t /*mienemy*/, int /*id*/, int /*dam*/)
{
UpdateMissileVelocity(mi, src, dst, 16);
Missiles[mi].position.traveled.deltaX += 3 * Missiles[mi].position.velocity.deltaX;
Missiles[mi].position.traveled.deltaY += 3 * Missiles[mi].position.velocity.deltaY;
auto &missile = Missiles[mi];
UpdateMissileVelocity(missile, src, dst, 16);
missile.position.traveled.deltaX += 3 * missile.position.velocity.deltaX;
missile.position.traveled.deltaY += 3 * missile.position.velocity.deltaY;
UpdateMissilePos(mi);
if (!gbIsHellfire || (Missiles[mi].position.velocity.deltaX & 0xFFFF0000) != 0 || (Missiles[mi].position.velocity.deltaY & 0xFFFF0000) != 0)
Missiles[mi]._mirange = 256;
if (!gbIsHellfire || (missile.position.velocity.deltaX & 0xFFFF0000) != 0 || (missile.position.velocity.deltaY & 0xFFFF0000) != 0)
missile._mirange = 256;
else
Missiles[mi]._mirange = 1;
Missiles[mi]._miVar1 = src.x;
Missiles[mi]._miVar2 = src.y;
Missiles[mi]._mlid = AddLight(src, 8);
missile._mirange = 1;
missile._miVar1 = src.x;
missile._miVar2 = src.y;
missile._mlid = AddLight(src, 8);
}
void AddTeleport(int mi, Point /*src*/, Point dst, int /*midir*/, int8_t /*mienemy*/, int id, int /*dam*/)
{
Missiles[mi]._miDelFlag = true;
auto &missile = Missiles[mi];
missile._miDelFlag = true;
for (int i = 0; i < 6; i++) {
int k = CrawlNum[i];
int ck = k + 2;
@ -1976,9 +1986,9 @@ void AddTeleport(int mi, Point /*src*/, Point dst, int /*midir*/, int8_t /*miene
int ty = dst.y + CrawlTable[ck];
if (0 < tx && tx < MAXDUNX && 0 < ty && ty < MAXDUNY) {
if (IsTileNotSolid({ tx, ty }) && dMonster[tx][ty] == 0 && dObject[tx][ty] == 0 && dPlayer[tx][ty] == 0) {
Missiles[mi].position.tile = { tx, ty };
Missiles[mi].position.start = { tx, ty };
Missiles[mi]._miDelFlag = false;
missile.position.tile = { tx, ty };
missile.position.start = { tx, ty };
missile._miDelFlag = false;
i = 6;
break;
}
@ -1986,44 +1996,46 @@ void AddTeleport(int mi, Point /*src*/, Point dst, int /*midir*/, int8_t /*miene
}
}
if (!Missiles[mi]._miDelFlag) {
if (!missile._miDelFlag) {
UseMana(id, SPL_TELEPORT);
Missiles[mi]._mirange = 2;
missile._mirange = 2;
}
}
void AddLightball(int mi, Point src, Point dst, int /*midir*/, int8_t /*mienemy*/, int id, int dam)
{
UpdateMissileVelocity(mi, src, dst, 16);
Missiles[mi]._midam = dam;
Missiles[mi]._miAnimFrame = GenerateRnd(8) + 1;
Missiles[mi]._mirange = 255;
auto &missile = Missiles[mi];
UpdateMissileVelocity(missile, src, dst, 16);
missile._midam = dam;
missile._miAnimFrame = GenerateRnd(8) + 1;
missile._mirange = 255;
if (id < 0) {
Missiles[mi]._miVar1 = src.x;
Missiles[mi]._miVar2 = src.y;
missile._miVar1 = src.x;
missile._miVar2 = src.y;
} else {
Missiles[mi]._miVar1 = Players[id].position.tile.x;
Missiles[mi]._miVar2 = Players[id].position.tile.y;
missile._miVar1 = Players[id].position.tile.x;
missile._miVar2 = Players[id].position.tile.y;
}
}
void AddFirewall(int mi, Point src, Point dst, int /*midir*/, int8_t mienemy, int id, int /*dam*/)
{
Missiles[mi]._midam = GenerateRndSum(10, 2) + 2;
Missiles[mi]._midam += id >= 0 ? Players[id]._pLevel : currlevel; // BUGFIX: missing parenthesis around ternary (fixed)
Missiles[mi]._midam <<= 3;
UpdateMissileVelocity(mi, src, dst, 16);
int i = Missiles[mi]._mispllvl;
Missiles[mi]._mirange = 10;
auto &missile = Missiles[mi];
missile._midam = GenerateRndSum(10, 2) + 2;
missile._midam += id >= 0 ? Players[id]._pLevel : currlevel; // BUGFIX: missing parenthesis around ternary (fixed)
missile._midam <<= 3;
UpdateMissileVelocity(missile, src, dst, 16);
int i = missile._mispllvl;
missile._mirange = 10;
if (i > 0)
Missiles[mi]._mirange *= i + 1;
missile._mirange *= i + 1;
if (mienemy == TARGET_PLAYERS || id < 0)
Missiles[mi]._mirange += currlevel;
missile._mirange += currlevel;
else
Missiles[mi]._mirange += (Players[id]._pISplDur * Missiles[mi]._mirange) / 128;
Missiles[mi]._mirange *= 16;
Missiles[mi]._miVar1 = Missiles[mi]._mirange - Missiles[mi]._miAnimLen;
Missiles[mi]._miVar2 = 0;
missile._mirange += (Players[id]._pISplDur * missile._mirange) / 128;
missile._mirange *= 16;
missile._miVar1 = missile._mirange - missile._miAnimLen;
missile._miVar2 = 0;
}
void AddFireball(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int /*dam*/)
@ -2032,54 +2044,57 @@ void AddFireball(int mi, Point src, Point dst, int midir, int8_t mienemy, int id
dst += static_cast<Direction>(midir);
}
int sp = 16;
auto &missile = Missiles[mi];
if (mienemy == TARGET_MONSTERS) {
sp += std::min(Missiles[mi]._mispllvl * 2, 34);
sp += std::min(missile._mispllvl * 2, 34);
int dmg = 2 * (Players[id]._pLevel + GenerateRndSum(10, 2)) + 4;
Missiles[mi]._midam = ScaleSpellEffect(dmg, Missiles[mi]._mispllvl);
missile._midam = ScaleSpellEffect(dmg, missile._mispllvl);
UseMana(id, SPL_FIREBALL);
}
UpdateMissileVelocity(mi, src, dst, sp);
UpdateMissileVelocity(missile, src, dst, sp);
SetMissDir(mi, GetDirection16(src, dst));
Missiles[mi]._mirange = 256;
Missiles[mi]._miVar1 = src.x;
Missiles[mi]._miVar2 = src.y;
Missiles[mi]._miVar3 = 0;
Missiles[mi]._miVar4 = src.x;
Missiles[mi]._miVar5 = src.y;
Missiles[mi]._mlid = AddLight(src, 8);
missile._mirange = 256;
missile._miVar1 = src.x;
missile._miVar2 = src.y;
missile._miVar3 = 0;
missile._miVar4 = src.x;
missile._miVar5 = src.y;
missile._mlid = AddLight(src, 8);
}
void AddLightctrl(int mi, Point src, Point dst, int /*midir*/, int8_t mienemy, int id, int dam)
{
if (dam == 0 && mienemy == TARGET_MONSTERS)
UseMana(id, SPL_LIGHTNING);
Missiles[mi]._miVar1 = src.x;
Missiles[mi]._miVar2 = src.y;
UpdateMissileVelocity(mi, src, dst, 32);
Missiles[mi]._miAnimFrame = GenerateRnd(8) + 1;
Missiles[mi]._mirange = 256;
auto &missile = Missiles[mi];
missile._miVar1 = src.x;
missile._miVar2 = src.y;
UpdateMissileVelocity(missile, src, dst, 32);
missile._miAnimFrame = GenerateRnd(8) + 1;
missile._mirange = 256;
}
void AddLightning(int mi, Point /*src*/, Point dst, int midir, int8_t mienemy, int id, int /*dam*/)
{
Missiles[mi].position.start = dst;
auto &missile = Missiles[mi];
missile.position.start = dst;
if (midir >= 0) {
Missiles[mi].position.offset = Missiles[midir].position.offset;
Missiles[mi].position.traveled = Missiles[midir].position.traveled;
missile.position.offset = Missiles[midir].position.offset;
missile.position.traveled = Missiles[midir].position.traveled;
}
Missiles[mi]._miAnimFrame = GenerateRnd(8) + 1;
missile._miAnimFrame = GenerateRnd(8) + 1;
if (midir < 0 || mienemy == TARGET_PLAYERS || id == -1) {
if (midir < 0 || id == -1)
Missiles[mi]._mirange = 8;
missile._mirange = 8;
else
Missiles[mi]._mirange = 10;
missile._mirange = 10;
} else {
Missiles[mi]._mirange = (Missiles[mi]._mispllvl / 2) + 6;
missile._mirange = (missile._mispllvl / 2) + 6;
}
Missiles[mi]._mlid = AddLight(Missiles[mi].position.tile, 4);
missile._mlid = AddLight(missile.position.tile, 4);
}
void AddMisexp(int mi, Point /*src*/, Point dst, int /*midir*/, int8_t mienemy, int id, int /*dam*/)
@ -2222,14 +2237,15 @@ void AddManashield(int mi, Point /*src*/, Point /*dst*/, int /*midir*/, int8_t m
void AddFiremove(int mi, Point src, Point dst, int /*midir*/, int8_t /*mienemy*/, int id, int /*dam*/)
{
Missiles[mi]._midam = GenerateRnd(10) + Players[id]._pLevel + 1;
UpdateMissileVelocity(mi, src, dst, 16);
Missiles[mi]._mirange = 255;
Missiles[mi]._miVar1 = 0;
Missiles[mi]._miVar2 = 0;
Missiles[mi].position.tile.x++;
Missiles[mi].position.tile.y++;
Missiles[mi].position.offset.deltaY -= 32;
auto &missile = Missiles[mi];
missile._midam = GenerateRnd(10) + Players[id]._pLevel + 1;
UpdateMissileVelocity(missile, src, dst, 16);
missile._mirange = 255;
missile._miVar1 = 0;
missile._miVar2 = 0;
missile.position.tile.x++;
missile.position.tile.y++;
missile.position.offset.deltaY -= 32;
}
void AddGuardian(int mi, Point src, Point dst, int /*midir*/, int8_t /*mienemy*/, int id, int /*dam*/)
@ -2320,13 +2336,14 @@ void AddRhino(int mi, Point src, Point dst, int midir, int8_t /*mienemy*/, int i
graphic = MonsterGraphic::Attack;
}
}
UpdateMissileVelocity(mi, src, dst, 18);
InitMissileAnimationFromMonster(Missiles[mi], midir, monster, graphic);
auto &missile = Missiles[mi];
UpdateMissileVelocity(missile, src, dst, 18);
InitMissileAnimationFromMonster(missile, midir, monster, graphic);
if (monster.MType->mtype >= MT_NSNAKE && monster.MType->mtype <= MT_GSNAKE)
Missiles[mi]._miAnimFrame = 7;
missile._miAnimFrame = 7;
if (monster._uniqtype != 0) {
Missiles[mi]._miUniqTrans = monster._uniqtrans + 1;
Missiles[mi]._mlid = monster.mlid;
missile._miUniqTrans = monster._uniqtrans + 1;
missile._mlid = monster.mlid;
}
PutMissile(mi);
}
@ -2336,11 +2353,12 @@ void AddFlare(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, i
if (src == dst) {
dst += static_cast<Direction>(midir);
}
UpdateMissileVelocity(mi, src, dst, 16);
Missiles[mi]._mirange = 256;
Missiles[mi]._miVar1 = src.x;
Missiles[mi]._miVar2 = src.y;
Missiles[mi]._mlid = AddLight(src, 8);
auto &missile = Missiles[mi];
UpdateMissileVelocity(missile, src, dst, 16);
missile._mirange = 256;
missile._miVar1 = src.x;
missile._miVar2 = src.y;
missile._mlid = AddLight(src, 8);
if (mienemy == TARGET_MONSTERS) {
UseMana(id, SPL_FLARE);
ApplyPlrDamage(id, 5);
@ -2356,22 +2374,23 @@ void AddFlare(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, i
SetMissAnim(mi, MFILE_SCUBMISC);
}
if (MissileSpriteData[Missiles[mi]._miAnimType].animFAmt == 16) {
if (MissileSpriteData[missile._miAnimType].animFAmt == 16) {
SetMissDir(mi, GetDirection16(src, dst));
}
}
void AddAcid(int mi, Point src, Point dst, int /*midir*/, int8_t /*mienemy*/, int id, int /*dam*/)
{
UpdateMissileVelocity(mi, src, dst, 16);
auto &missile = Missiles[mi];
UpdateMissileVelocity(missile, src, dst, 16);
SetMissDir(mi, GetDirection16(src, dst));
if ((!gbIsHellfire && (Missiles[mi].position.velocity.deltaX & 0xFFFF0000) != 0) || (Missiles[mi].position.velocity.deltaY & 0xFFFF0000) != 0)
Missiles[mi]._mirange = 5 * (Monsters[id]._mint + 4);
if ((!gbIsHellfire && (missile.position.velocity.deltaX & 0xFFFF0000) != 0) || (missile.position.velocity.deltaY & 0xFFFF0000) != 0)
missile._mirange = 5 * (Monsters[id]._mint + 4);
else
Missiles[mi]._mirange = 1;
Missiles[mi]._mlid = NO_LIGHT;
Missiles[mi]._miVar1 = src.x;
Missiles[mi]._miVar2 = src.y;
missile._mirange = 1;
missile._mlid = NO_LIGHT;
missile._miVar1 = src.x;
missile._miVar2 = src.y;
PutMissile(mi);
}
@ -2513,17 +2532,18 @@ void AddElement(int mi, Point src, Point dst, int midir, int8_t /*mienemy*/, int
}
int dmg = 2 * (Players[id]._pLevel + GenerateRndSum(10, 2)) + 4;
Missiles[mi]._midam = ScaleSpellEffect(dmg, Missiles[mi]._mispllvl) / 2;
auto &missile = Missiles[mi];
missile._midam = ScaleSpellEffect(dmg, missile._mispllvl) / 2;
UpdateMissileVelocity(mi, src, dst, 16);
UpdateMissileVelocity(missile, src, dst, 16);
SetMissDir(mi, GetDirection(src, dst));
Missiles[mi]._mirange = 256;
Missiles[mi]._miVar1 = src.x;
Missiles[mi]._miVar2 = src.y;
Missiles[mi]._miVar3 = 0;
Missiles[mi]._miVar4 = dst.x;
Missiles[mi]._miVar5 = dst.y;
Missiles[mi]._mlid = AddLight(src, 8);
missile._mirange = 256;
missile._miVar1 = src.x;
missile._miVar2 = src.y;
missile._miVar3 = 0;
missile._miVar4 = dst.x;
missile._miVar5 = dst.y;
missile._mlid = AddLight(src, 8);
UseMana(id, SPL_ELEMENT);
}
@ -2733,34 +2753,36 @@ void AddFlamec(int mi, Point src, Point dst, int midir, int8_t mienemy, int id,
if (src == dst) {
dst += static_cast<Direction>(midir);
}
UpdateMissileVelocity(mi, src, dst, 32);
auto &missile = Missiles[mi];
UpdateMissileVelocity(missile, src, dst, 32);
if (mienemy == TARGET_MONSTERS) {
UseMana(id, SPL_FLAME);
}
Missiles[mi]._miVar1 = src.x;
Missiles[mi]._miVar2 = src.y;
Missiles[mi]._miVar3 = 0;
Missiles[mi]._mirange = 256;
missile._miVar1 = src.x;
missile._miVar2 = src.y;
missile._miVar3 = 0;
missile._mirange = 256;
}
void AddCbolt(int mi, Point src, Point dst, int midir, int8_t micaster, int id, int /*dam*/)
{
assert(mi >= 0 && mi < MAXMISSILES);
Missiles[mi]._mirnd = GenerateRnd(15) + 1;
Missiles[mi]._midam = (micaster == 0) ? (GenerateRnd(Players[id]._pMagic / 4) + 1) : 15;
auto &missile = Missiles[mi];
missile._mirnd = GenerateRnd(15) + 1;
missile._midam = (micaster == 0) ? (GenerateRnd(Players[id]._pMagic / 4) + 1) : 15;
if (src == dst) {
dst += static_cast<Direction>(midir);
}
Missiles[mi]._miAnimFrame = GenerateRnd(8) + 1;
Missiles[mi]._mlid = AddLight(src, 5);
missile._miAnimFrame = GenerateRnd(8) + 1;
missile._mlid = AddLight(src, 5);
UpdateMissileVelocity(mi, src, dst, 8);
Missiles[mi]._miVar1 = 5;
Missiles[mi]._miVar2 = midir;
Missiles[mi]._miVar3 = 0;
Missiles[mi]._mirange = 256;
UpdateMissileVelocity(missile, src, dst, 8);
missile._miVar1 = 5;
missile._miVar2 = midir;
missile._miVar3 = 0;
missile._mirange = 256;
}
void AddHbolt(int mi, Point src, Point dst, int midir, int8_t /*micaster*/, int id, int /*dam*/)
@ -2768,19 +2790,19 @@ void AddHbolt(int mi, Point src, Point dst, int midir, int8_t /*micaster*/, int
if (src == dst) {
dst += static_cast<Direction>(midir);
}
auto &missile = Missiles[mi];
int sp = 16;
if (id != -1) {
sp += std::min(Missiles[mi]._mispllvl * 2, 47);
sp += std::min(missile._mispllvl * 2, 47);
}
UpdateMissileVelocity(mi, src, dst, sp);
UpdateMissileVelocity(missile, src, dst, sp);
SetMissDir(mi, GetDirection16(src, dst));
Missiles[mi]._mirange = 256;
Missiles[mi]._miVar1 = src.x;
Missiles[mi]._miVar2 = src.y;
Missiles[mi]._mlid = AddLight(src, 8);
Missiles[mi]._midam = GenerateRnd(10) + Players[id]._pLevel + 9;
missile._mirange = 256;
missile._miVar1 = src.x;
missile._miVar2 = src.y;
missile._mlid = AddLight(src, 8);
missile._midam = GenerateRnd(10) + Players[id]._pLevel + 9;
UseMana(id, SPL_HBOLT);
}
@ -2816,16 +2838,17 @@ void AddBoneSpirit(int mi, Point src, Point dst, int midir, int8_t mienemy, int
if (src == dst) {
dst += static_cast<Direction>(midir);
}
Missiles[mi]._midam = 0;
UpdateMissileVelocity(mi, src, dst, 16);
auto &missile = Missiles[mi];
missile._midam = 0;
UpdateMissileVelocity(missile, src, dst, 16);
SetMissDir(mi, GetDirection(src, dst));
Missiles[mi]._mirange = 256;
Missiles[mi]._miVar1 = src.x;
Missiles[mi]._miVar2 = src.y;
Missiles[mi]._miVar3 = 0;
Missiles[mi]._miVar4 = dst.x;
Missiles[mi]._miVar5 = dst.y;
Missiles[mi]._mlid = AddLight(src, 8);
missile._mirange = 256;
missile._miVar1 = src.x;
missile._miVar2 = src.y;
missile._miVar3 = 0;
missile._miVar4 = dst.x;
missile._miVar5 = dst.y;
missile._mlid = AddLight(src, 8);
if (mienemy == TARGET_MONSTERS) {
UseMana(id, SPL_BONESPIRIT);
ApplyPlrDamage(id, 6);
@ -4260,13 +4283,14 @@ void MI_Flamec(int i)
void MI_Cbolt(int i)
{
Missiles[i]._mirange--;
if (Missiles[i]._miAnimType != MFILE_LGHNING) {
if (Missiles[i]._miVar3 == 0) {
auto &missile = Missiles[i];
missile._mirange--;
if (missile._miAnimType != MFILE_LGHNING) {
if (missile._miVar3 == 0) {
constexpr int BPath[16] = { -1, 0, 1, -1, 0, 1, -1, -1, 0, 0, 1, 1, 0, 1, -1, 0 };
auto md = static_cast<Direction>(Missiles[i]._miVar2);
switch (BPath[Missiles[i]._mirnd]) {
auto md = static_cast<Direction>(missile._miVar2);
switch (BPath[missile._mirnd]) {
case -1:
md = left[md];
break;
@ -4275,29 +4299,29 @@ void MI_Cbolt(int i)
break;
}
Missiles[i]._mirnd = (Missiles[i]._mirnd + 1) & 0xF;
UpdateMissileVelocity(i, Missiles[i].position.tile, Missiles[i].position.tile + md, 8);
Missiles[i]._miVar3 = 16;
missile._mirnd = (missile._mirnd + 1) & 0xF;
UpdateMissileVelocity(missile, missile.position.tile, missile.position.tile + md, 8);
missile._miVar3 = 16;
} else {
Missiles[i]._miVar3--;
missile._miVar3--;
}
Missiles[i].position.traveled += Missiles[i].position.velocity;
missile.position.traveled += missile.position.velocity;
UpdateMissilePos(i);
CheckMissileCol(i, Missiles[i]._midam, Missiles[i]._midam, false, Missiles[i].position.tile, false);
if (Missiles[i]._miHitFlag) {
Missiles[i]._miVar1 = 8;
Missiles[i]._mimfnum = 0;
Missiles[i].position.offset = { 0, 0 };
Missiles[i].position.velocity = {};
CheckMissileCol(i, missile._midam, missile._midam, false, missile.position.tile, false);
if (missile._miHitFlag) {
missile._miVar1 = 8;
missile._mimfnum = 0;
missile.position.offset = { 0, 0 };
missile.position.velocity = {};
SetMissAnim(i, MFILE_LGHNING);
Missiles[i]._mirange = Missiles[i]._miAnimLen;
missile._mirange = missile._miAnimLen;
UpdateMissilePos(i);
}
ChangeLight(Missiles[i]._mlid, Missiles[i].position.tile, Missiles[i]._miVar1);
ChangeLight(missile._mlid, missile.position.tile, missile._miVar1);
}
if (Missiles[i]._mirange == 0) {
Missiles[i]._miDelFlag = true;
AddUnLight(Missiles[i]._mlid);
if (missile._mirange == 0) {
missile._miDelFlag = true;
AddUnLight(missile._mlid);
}
PutMissile(i);
}
@ -4338,13 +4362,14 @@ void MI_Hbolt(int i)
void MI_Element(int i)
{
Missiles[i]._mirange--;
int dam = Missiles[i]._midam;
int id = Missiles[i]._misource;
if (Missiles[i]._miAnimType == MFILE_BIGEXP) {
Point c = Missiles[i].position.tile;
auto &missile = Missiles[i];
missile._mirange--;
int dam = missile._midam;
int id = missile._misource;
if (missile._miAnimType == MFILE_BIGEXP) {
Point c = missile.position.tile;
Point p = Players[id].position.tile;
ChangeLight(Missiles[i]._mlid, Missiles[i].position.tile, Missiles[i]._miAnimFrame);
ChangeLight(missile._mlid, missile.position.tile, missile._miAnimFrame);
if (!CheckBlock(p, c))
CheckMissileCol(i, dam, dam, true, c, true);
@ -4354,41 +4379,41 @@ void MI_Element(int i)
CheckMissileCol(i, dam, dam, true, c + offset, true);
}
if (Missiles[i]._mirange == 0) {
Missiles[i]._miDelFlag = true;
AddUnLight(Missiles[i]._mlid);
if (missile._mirange == 0) {
missile._miDelFlag = true;
AddUnLight(missile._mlid);
}
} else {
Missiles[i].position.traveled += Missiles[i].position.velocity;
missile.position.traveled += missile.position.velocity;
UpdateMissilePos(i);
Point c = Missiles[i].position.tile;
Point c = missile.position.tile;
CheckMissileCol(i, dam, dam, false, c, false);
if (Missiles[i]._miVar3 == 0 && c == Point { Missiles[i]._miVar4, Missiles[i]._miVar5 })
Missiles[i]._miVar3 = 1;
if (Missiles[i]._miVar3 == 1) {
Missiles[i]._miVar3 = 2;
Missiles[i]._mirange = 255;
if (missile._miVar3 == 0 && c == Point { missile._miVar4, missile._miVar5 })
missile._miVar3 = 1;
if (missile._miVar3 == 1) {
missile._miVar3 = 2;
missile._mirange = 255;
auto *monster = FindClosest(c, 19);
if (monster != nullptr) {
Direction sd = GetDirection(c, monster->position.tile);
SetMissDir(i, sd);
UpdateMissileVelocity(i, c, monster->position.tile, 16);
UpdateMissileVelocity(missile, c, monster->position.tile, 16);
} else {
Direction sd = Players[id]._pdir;
SetMissDir(i, sd);
UpdateMissileVelocity(i, c, c + sd, 16);
UpdateMissileVelocity(missile, c, c + sd, 16);
}
}
if (c != Point { Missiles[i]._miVar1, Missiles[i]._miVar2 }) {
Missiles[i]._miVar1 = c.x;
Missiles[i]._miVar2 = c.y;
ChangeLight(Missiles[i]._mlid, c, 8);
if (c != Point { missile._miVar1, missile._miVar2 }) {
missile._miVar1 = c.x;
missile._miVar2 = c.y;
ChangeLight(missile._mlid, c, 8);
}
if (Missiles[i]._mirange == 0) {
Missiles[i]._mimfnum = 0;
if (missile._mirange == 0) {
missile._mimfnum = 0;
SetMissAnim(i, MFILE_BIGEXP);
Missiles[i]._mirange = Missiles[i]._miAnimLen - 1;
Missiles[i].position.StopMissile();
missile._mirange = missile._miAnimLen - 1;
missile.position.StopMissile();
}
}
PutMissile(i);
@ -4396,46 +4421,47 @@ void MI_Element(int i)
void MI_Bonespirit(int i)
{
Missiles[i]._mirange--;
int dam = Missiles[i]._midam;
int id = Missiles[i]._misource;
if (Missiles[i]._mimfnum == DIR_OMNI) {
ChangeLight(Missiles[i]._mlid, Missiles[i].position.tile, Missiles[i]._miAnimFrame);
if (Missiles[i]._mirange == 0) {
Missiles[i]._miDelFlag = true;
AddUnLight(Missiles[i]._mlid);
auto &missile = Missiles[i];
missile._mirange--;
int dam = missile._midam;
int id = missile._misource;
if (missile._mimfnum == DIR_OMNI) {
ChangeLight(missile._mlid, missile.position.tile, missile._miAnimFrame);
if (missile._mirange == 0) {
missile._miDelFlag = true;
AddUnLight(missile._mlid);
}
PutMissile(i);
} else {
Missiles[i].position.traveled += Missiles[i].position.velocity;
missile.position.traveled += missile.position.velocity;
UpdateMissilePos(i);
Point c = Missiles[i].position.tile;
Point c = missile.position.tile;
CheckMissileCol(i, dam, dam, false, c, false);
if (Missiles[i]._miVar3 == 0 && c == Point { Missiles[i]._miVar4, Missiles[i]._miVar5 })
Missiles[i]._miVar3 = 1;
if (Missiles[i]._miVar3 == 1) {
Missiles[i]._miVar3 = 2;
Missiles[i]._mirange = 255;
if (missile._miVar3 == 0 && c == Point { missile._miVar4, missile._miVar5 })
missile._miVar3 = 1;
if (missile._miVar3 == 1) {
missile._miVar3 = 2;
missile._mirange = 255;
auto *monster = FindClosest(c, 19);
if (monster != nullptr) {
Missiles[i]._midam = monster->_mhitpoints >> 7;
missile._midam = monster->_mhitpoints >> 7;
SetMissDir(i, GetDirection(c, monster->position.tile));
UpdateMissileVelocity(i, c, monster->position.tile, 16);
UpdateMissileVelocity(missile, c, monster->position.tile, 16);
} else {
Direction sd = Players[id]._pdir;
SetMissDir(i, sd);
UpdateMissileVelocity(i, c, c + sd, 16);
UpdateMissileVelocity(missile, c, c + sd, 16);
}
}
if (c != Point { Missiles[i]._miVar1, Missiles[i]._miVar2 }) {
Missiles[i]._miVar1 = c.x;
Missiles[i]._miVar2 = c.y;
ChangeLight(Missiles[i]._mlid, c, 8);
if (c != Point { missile._miVar1, missile._miVar2 }) {
missile._miVar1 = c.x;
missile._miVar2 = c.y;
ChangeLight(missile._mlid, c, 8);
}
if (Missiles[i]._mirange == 0) {
if (missile._mirange == 0) {
SetMissDir(i, DIR_OMNI);
Missiles[i].position.velocity = {};
Missiles[i]._mirange = 7;
missile.position.velocity = {};
missile._mirange = 7;
}
PutMissile(i);
}
@ -4443,9 +4469,10 @@ void MI_Bonespirit(int i)
void MI_ResurrectBeam(int i)
{
Missiles[i]._mirange--;
if (Missiles[i]._mirange == 0)
Missiles[i]._miDelFlag = true;
auto &missile = Missiles[i];
missile._mirange--;
if (missile._mirange == 0)
missile._miDelFlag = true;
PutMissile(i);
}

Loading…
Cancel
Save