Browse Source

♻️Simplify loops in to mulitplications (#2225)

pull/1907/head
Anders Jenbo 5 years ago committed by GitHub
parent
commit
b1ca8ee45f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 297
      Source/missiles.cpp

297
Source/missiles.cpp

@ -30,6 +30,38 @@ int numchains;
const int CrawlNum[19] = { 0, 3, 12, 45, 94, 159, 240, 337, 450, 579, 724, 885, 1062, 1255, 1464, 1689, 1930, 2187, 2460 }; const int CrawlNum[19] = { 0, 3, 12, 45, 94, 159, 240, 337, 450, 579, 724, 885, 1062, 1255, 1464, 1689, 1930, 2187, 2460 };
int AddClassHealingBonus(int hp, HeroClass heroClass)
{
if (heroClass == HeroClass::Warrior || heroClass == HeroClass::Monk || heroClass == HeroClass::Barbarian) {
return hp * 2;
}
if (heroClass == HeroClass::Rogue || heroClass == HeroClass::Bard) {
return hp + hp / 2;
}
return hp;
}
int ScaleSpellEffect(int base, int spellLevel)
{
for (int i = 0; i < spellLevel; i++) {
base += base / 8;
}
return base;
}
int GenerateRndSum(int range, int iterations)
{
int value = 0;
for (int i = 0; i < iterations; i++) {
value += GenerateRnd(range);
}
return value;
}
void GetDamageAmt(int i, int *mind, int *maxd) void GetDamageAmt(int i, int *mind, int *maxd)
{ {
assert(myplr >= 0 && myplr < MAX_PLRS); assert(myplr >= 0 && myplr < MAX_PLRS);
@ -42,40 +74,21 @@ void GetDamageAmt(int i, int *mind, int *maxd)
switch (i) { switch (i) {
case SPL_FIREBOLT: case SPL_FIREBOLT:
*mind = (myPlayer._pMagic / 8) + sl + 1; *mind = (myPlayer._pMagic / 8) + sl + 1;
*maxd = (myPlayer._pMagic / 8) + sl + 10; *maxd = *mind + 9;
break; break;
case SPL_HEAL: /// BUGFIX: healing calculation is unused case SPL_HEAL:
*mind = myPlayer._pLevel + sl + 1; case SPL_HEALOTHER:
if (myPlayer._pClass == HeroClass::Warrior || myPlayer._pClass == HeroClass::Monk || myPlayer._pClass == HeroClass::Barbarian) { /// BUGFIX: healing calculation is unused
*mind *= 2; *mind = AddClassHealingBonus(myPlayer._pLevel + sl + 1, myPlayer._pClass) - 1;
} else if (myPlayer._pClass == HeroClass::Rogue || myPlayer._pClass == HeroClass::Bard) { *maxd = AddClassHealingBonus((4 * myPlayer._pLevel) + (6 * sl) + 10, myPlayer._pClass) - 1;
*mind += *mind / 2;
}
*maxd = 10;
for (int k = 0; k < myPlayer._pLevel; k++) {
*maxd += 4;
}
for (int k = 0; k < sl; k++) {
*maxd += 6;
}
if (myPlayer._pClass == HeroClass::Warrior || myPlayer._pClass == HeroClass::Monk || myPlayer._pClass == HeroClass::Barbarian) {
*maxd *= 2;
} else if (myPlayer._pClass == HeroClass::Rogue || myPlayer._pClass == HeroClass::Bard) {
*maxd += *maxd / 2;
}
*mind = -1;
*maxd = -1;
break; break;
case SPL_LIGHTNING: case SPL_LIGHTNING:
case SPL_RUNELIGHT: case SPL_RUNELIGHT:
*mind = 2; *mind = 2;
*maxd = myPlayer._pLevel + 2; *maxd = 2 + myPlayer._pLevel;
break; break;
case SPL_FLASH: case SPL_FLASH:
*mind = myPlayer._pLevel; *mind = ScaleSpellEffect(myPlayer._pLevel, sl);
for (int k = 0; k < sl; k++) {
*mind += *mind / 8;
}
*mind += *mind / 2; *mind += *mind / 2;
*maxd = *mind * 2; *maxd = *mind * 2;
break; break;
@ -109,51 +122,33 @@ void GetDamageAmt(int i, int *mind, int *maxd)
case SPL_LIGHTWALL: case SPL_LIGHTWALL:
case SPL_FIRERING: case SPL_FIRERING:
*mind = 2 * myPlayer._pLevel + 4; *mind = 2 * myPlayer._pLevel + 4;
*maxd = 2 * myPlayer._pLevel + 40; *maxd = *mind + 36;
break; break;
case SPL_FIREBALL: case SPL_FIREBALL:
case SPL_RUNEFIRE: case SPL_RUNEFIRE: {
*mind = 2 * myPlayer._pLevel + 4; int base = (2 * myPlayer._pLevel) + 4;
for (int k = 0; k < sl; k++) { *mind = ScaleSpellEffect(base, sl);
*mind += *mind / 8; *maxd = ScaleSpellEffect(base + 36, sl);
} } break;
*maxd = 2 * myPlayer._pLevel + 40; case SPL_GUARDIAN: {
for (int k = 0; k < sl; k++) { int base = (myPlayer._pLevel / 2) + 1;
*maxd += *maxd / 8; *mind = ScaleSpellEffect(base, sl);
} *maxd = ScaleSpellEffect(base + 9, sl);
break; } break;
case SPL_GUARDIAN:
*mind = (myPlayer._pLevel / 2) + 1;
for (int k = 0; k < sl; k++) {
*mind += *mind / 8;
}
*maxd = (myPlayer._pLevel / 2) + 10;
for (int k = 0; k < sl; k++) {
*maxd += *maxd / 8;
}
break;
case SPL_CHAIN: case SPL_CHAIN:
*mind = 4; *mind = 4;
*maxd = 2 * myPlayer._pLevel + 4; *maxd = 4 + (2 * myPlayer._pLevel);
break; break;
case SPL_WAVE: case SPL_WAVE:
*mind = 6 * (myPlayer._pLevel + 1); *mind = 6 * (myPlayer._pLevel + 1);
*maxd = 6 * (myPlayer._pLevel + 10); *maxd = *mind + 54;
break; break;
case SPL_NOVA: case SPL_NOVA:
case SPL_IMMOLAT: case SPL_IMMOLAT:
case SPL_RUNEIMMOLAT: case SPL_RUNEIMMOLAT:
case SPL_RUNENOVA: case SPL_RUNENOVA:
*mind = (myPlayer._pLevel + 5) / 2; *mind = ScaleSpellEffect((myPlayer._pLevel + 5) / 2, sl) * 5;
for (int k = 0; k < sl; k++) { *maxd = ScaleSpellEffect((myPlayer._pLevel + 30) / 2, sl) * 5;
*mind += *mind / 8;
}
*mind *= 5;
*maxd = (myPlayer._pLevel + 30) / 2;
for (int k = 0; k < sl; k++) {
*maxd += *maxd / 8;
}
*maxd *= 5;
break; break;
case SPL_FLAME: case SPL_FLAME:
*mind = 3; *mind = 3;
@ -165,58 +160,22 @@ void GetDamageAmt(int i, int *mind, int *maxd)
*maxd = 17; *maxd = 17;
break; break;
case SPL_APOCA: case SPL_APOCA:
*mind = 0; *mind = myPlayer._pLevel;
for (int k = 0; k < myPlayer._pLevel; k++) { *maxd = *mind * 6;
*mind += 1;
}
*maxd = 0;
for (int k = 0; k < myPlayer._pLevel; k++) {
*maxd += 6;
}
break; break;
case SPL_ELEMENT: case SPL_ELEMENT:
*mind = 2 * myPlayer._pLevel + 4; *mind = ScaleSpellEffect(2 * myPlayer._pLevel + 4, sl);
for (int k = 0; k < sl; k++) {
*mind += *mind / 8;
}
/// BUGFIX: add here '*mind /= 2;' /// BUGFIX: add here '*mind /= 2;'
*maxd = 2 * myPlayer._pLevel + 40; *maxd = ScaleSpellEffect(2 * myPlayer._pLevel + 40, sl);
for (int k = 0; k < sl; k++) {
*maxd += *maxd / 8;
}
/// BUGFIX: add here '*maxd /= 2;' /// BUGFIX: add here '*maxd /= 2;'
break; break;
case SPL_CBOLT: case SPL_CBOLT:
*mind = 1; *mind = 1;
*maxd = (myPlayer._pMagic / 4) + 1; *maxd = *mind + (myPlayer._pMagic / 4);
break; break;
case SPL_HBOLT: case SPL_HBOLT:
*mind = myPlayer._pLevel + 9; *mind = myPlayer._pLevel + 9;
*maxd = myPlayer._pLevel + 18; *maxd = *mind + 9;
break;
case SPL_HEALOTHER: /// BUGFIX: healing calculation is unused
*mind = myPlayer._pLevel + sl + 1;
if (myPlayer._pClass == HeroClass::Warrior || myPlayer._pClass == HeroClass::Monk || myPlayer._pClass == HeroClass::Barbarian) {
*mind *= 2;
}
if (myPlayer._pClass == HeroClass::Rogue || myPlayer._pClass == HeroClass::Bard) {
*mind += *mind / 2;
}
*maxd = 10;
for (int k = 0; k < myPlayer._pLevel; k++) {
*maxd += 4;
}
for (int k = 0; k < sl; k++) {
*maxd += 6;
}
if (myPlayer._pClass == HeroClass::Warrior || myPlayer._pClass == HeroClass::Monk || myPlayer._pClass == HeroClass::Barbarian) {
*maxd *= 2;
}
if (myPlayer._pClass == HeroClass::Rogue || myPlayer._pClass == HeroClass::Bard) {
*maxd += *maxd / 2;
}
*mind = -1;
*maxd = -1;
break; break;
case SPL_FLARE: case SPL_FLARE:
*mind = (myPlayer._pMagic / 2) + 3 * sl - (myPlayer._pMagic / 8); *mind = (myPlayer._pMagic / 2) + 3 * sl - (myPlayer._pMagic / 8);
@ -1665,12 +1624,10 @@ void AddLightningWall(int mi, Point src, Point dst, int midir, int8_t mienemy, i
void AddRuneExplosion(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam) void AddRuneExplosion(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam)
{ {
if (mienemy == TARGET_MONSTERS || mienemy == TARGET_BOTH) { if (mienemy == TARGET_MONSTERS || mienemy == TARGET_BOTH) {
missile[mi]._midam = 2 * (plr[id]._pLevel + GenerateRnd(10) + GenerateRnd(10)) + 4; int dmg = 2 * (plr[id]._pLevel + GenerateRndSum(10, 2)) + 4;
for (int i = missile[mi]._mispllvl; i > 0; i--) { dmg = ScaleSpellEffect(dmg, missile[mi]._mispllvl);
missile[mi]._midam += missile[mi]._midam / 8;
}
int dmg = missile[mi]._midam; missile[mi]._midam = dmg;
constexpr Point offsets[] = { { -1, -1 }, { 0, -1 }, { 1, -1 }, { -1, 0 }, { 0, 0 }, { 1, 0 }, { -1, 1 }, { 0, 1 }, { 1, 1 } }; constexpr Point offsets[] = { { -1, -1 }, { 0, -1 }, { 1, -1 }, { -1, 0 }, { 0, 0 }, { 1, 0 }, { -1, 1 }, { 0, 1 }, { 1, 1 } };
for (Point offset : offsets) for (Point offset : offsets)
@ -1685,16 +1642,14 @@ 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) void AddImmolation(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam)
{ {
if (src == dst) { if (src == dst) {
dst += (Direction)midir; dst += static_cast<Direction>(midir);
} }
int sp = 16; int sp = 16;
if (mienemy == TARGET_MONSTERS) { if (mienemy == TARGET_MONSTERS) {
sp += std::min(missile[mi]._mispllvl * 2, 34); sp += std::min(missile[mi]._mispllvl * 2, 34);
missile[mi]._midam = 2 * (plr[id]._pLevel + GenerateRnd(10) + GenerateRnd(10)) + 4; int dmg = 2 * (plr[id]._pLevel + GenerateRndSum(10, 2)) + 4;
for (int i = missile[mi]._mispllvl; i > 0; i--) { missile[mi]._midam = ScaleSpellEffect(dmg, missile[mi]._mispllvl);
missile[mi]._midam += missile[mi]._midam / 8;
}
UseMana(id, SPL_FIREBALL); UseMana(id, SPL_FIREBALL);
} }
@ -1714,7 +1669,7 @@ 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) void AddFireNova(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam)
{ {
if (src == dst) { if (src == dst) {
dst += (Direction)midir; dst += static_cast<Direction>(midir);
} }
int sp = 16; int sp = 16;
if (mienemy == TARGET_MONSTERS) { if (mienemy == TARGET_MONSTERS) {
@ -1734,7 +1689,7 @@ void AddFireNova(int mi, Point src, Point dst, int midir, int8_t mienemy, int id
void AddLightningArrow(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam) void AddLightningArrow(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam)
{ {
if (src == dst) { if (src == dst) {
dst += (Direction)midir; dst += static_cast<Direction>(midir);
} }
GetMissileVel(mi, src, dst, 32); GetMissileVel(mi, src, dst, 32);
missile[mi]._miAnimFrame = GenerateRnd(8) + 1; missile[mi]._miAnimFrame = GenerateRnd(8) + 1;
@ -1849,7 +1804,7 @@ void AddCboltArrow(int mi, Point src, Point dst, int midir, int8_t mienemy, int
} }
if (src == dst) { if (src == dst) {
dst += (Direction)midir; dst += static_cast<Direction>(midir);
} }
missile[mi]._miAnimFrame = GenerateRnd(8) + 1; missile[mi]._miAnimFrame = GenerateRnd(8) + 1;
missile[mi]._mlid = AddLight(src, 5); missile[mi]._mlid = AddLight(src, 5);
@ -1863,7 +1818,7 @@ void AddCboltArrow(int mi, Point src, Point dst, int midir, int8_t mienemy, int
void AddLArrow(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam) void AddLArrow(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam)
{ {
if (src == dst) { if (src == dst) {
dst += (Direction)midir; dst += static_cast<Direction>(midir);
} }
int av = 32; int av = 32;
if (mienemy == TARGET_MONSTERS) { if (mienemy == TARGET_MONSTERS) {
@ -1899,7 +1854,7 @@ 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) void AddArrow(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam)
{ {
if (src == dst) { if (src == dst) {
dst += (Direction)midir; dst += static_cast<Direction>(midir);
} }
int av = 32; int av = 32;
if (mienemy == TARGET_MONSTERS) { if (mienemy == TARGET_MONSTERS) {
@ -1912,6 +1867,7 @@ void AddArrow(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, i
av += (player._pLevel - 1) / 4; av += (player._pLevel - 1) / 4;
else if (player._pClass == HeroClass::Warrior || player._pClass == HeroClass::Bard) else if (player._pClass == HeroClass::Warrior || player._pClass == HeroClass::Bard)
av += (player._pLevel - 1) / 8; av += (player._pLevel - 1) / 8;
if (gbIsHellfire) { if (gbIsHellfire) {
if ((player._pIFlags & ISPL_QUICKATTACK) != 0) if ((player._pIFlags & ISPL_QUICKATTACK) != 0)
av++; av++;
@ -1993,7 +1949,7 @@ 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) void AddFirebolt(int mi, Point src, Point dst, int midir, int8_t micaster, int id, int dam)
{ {
if (src == dst) { if (src == dst) {
dst += (Direction)midir; dst += static_cast<Direction>(midir);
} }
int sp = 26; int sp = 26;
if (micaster == 0) { if (micaster == 0) {
@ -2090,7 +2046,7 @@ 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) void AddFirewall(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam)
{ {
missile[mi]._midam = GenerateRnd(10) + GenerateRnd(10) + 2; missile[mi]._midam = GenerateRndSum(10, 2) + 2;
missile[mi]._midam += id >= 0 ? plr[id]._pLevel : currlevel; // BUGFIX: missing parenthesis around ternary (fixed) missile[mi]._midam += id >= 0 ? plr[id]._pLevel : currlevel; // BUGFIX: missing parenthesis around ternary (fixed)
missile[mi]._midam <<= 3; missile[mi]._midam <<= 3;
GetMissileVel(mi, src, dst, 16); GetMissileVel(mi, src, dst, 16);
@ -2110,15 +2066,15 @@ 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) void AddFireball(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam)
{ {
if (src == dst) { if (src == dst) {
dst += (Direction)midir; dst += static_cast<Direction>(midir);
} }
int sp = 16; int sp = 16;
if (mienemy == TARGET_MONSTERS) { if (mienemy == TARGET_MONSTERS) {
sp += std::min(missile[mi]._mispllvl * 2, 34); sp += std::min(missile[mi]._mispllvl * 2, 34);
missile[mi]._midam = 2 * (plr[id]._pLevel + GenerateRnd(10) + GenerateRnd(10)) + 4;
for (int i = missile[mi]._mispllvl; i > 0; i--) { int dmg = 2 * (plr[id]._pLevel + GenerateRndSum(10, 2)) + 4;
missile[mi]._midam += missile[mi]._midam / 8; missile[mi]._midam = ScaleSpellEffect(dmg, missile[mi]._mispllvl);
}
UseMana(id, SPL_FIREBALL); UseMana(id, SPL_FIREBALL);
} }
GetMissileVel(mi, src, dst, sp); GetMissileVel(mi, src, dst, sp);
@ -2270,17 +2226,10 @@ void AddTown(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, in
void AddFlash(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam) void AddFlash(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam)
{ {
int i;
if (id != -1) { if (id != -1) {
if (mienemy == TARGET_MONSTERS) { if (mienemy == TARGET_MONSTERS) {
missile[mi]._midam = 0; int dmg = GenerateRndSum(20, plr[id]._pLevel + 1) + plr[id]._pLevel + 1;
for (i = 0; i <= plr[id]._pLevel; i++) { missile[mi]._midam = ScaleSpellEffect(dmg, missile[mi]._mispllvl);
missile[mi]._midam += GenerateRnd(20) + 1;
}
for (i = missile[mi]._mispllvl; i > 0; i--) {
missile[mi]._midam += missile[mi]._midam / 8;
}
missile[mi]._midam += missile[mi]._midam / 2; missile[mi]._midam += missile[mi]._midam / 2;
UseMana(id, SPL_FLASH); UseMana(id, SPL_FLASH);
} else { } else {
@ -2294,17 +2243,10 @@ void AddFlash(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, i
void AddFlash2(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam) void AddFlash2(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam)
{ {
int i;
if (mienemy == TARGET_MONSTERS) { if (mienemy == TARGET_MONSTERS) {
if (id != -1) { if (id != -1) {
missile[mi]._midam = 0; int dmg = GenerateRndSum(20, plr[id]._pLevel + 1) + plr[id]._pLevel + 1;
for (i = 0; i <= plr[id]._pLevel; i++) { missile[mi]._midam = ScaleSpellEffect(dmg, missile[mi]._mispllvl);
missile[mi]._midam += GenerateRnd(20) + 1;
}
for (i = missile[mi]._mispllvl; i > 0; i--) {
missile[mi]._midam += missile[mi]._midam / 8;
}
missile[mi]._midam += missile[mi]._midam / 2; missile[mi]._midam += missile[mi]._midam / 2;
} else { } else {
missile[mi]._midam = currlevel / 2; missile[mi]._midam = currlevel / 2;
@ -2338,15 +2280,13 @@ void AddFiremove(int mi, Point src, Point dst, int midir, int8_t mienemy, int id
void AddGuardian(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam) void AddGuardian(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam)
{ {
int i, pn, k, j, tx, ty; int pn, k, j, tx, ty;
missile[mi]._midam = GenerateRnd(10) + (plr[id]._pLevel / 2) + 1; int dmg = GenerateRnd(10) + (plr[id]._pLevel / 2) + 1;
for (i = missile[mi]._mispllvl; i > 0; i--) { missile[mi]._midam = ScaleSpellEffect(dmg, missile[mi]._mispllvl);
missile[mi]._midam += missile[mi]._midam / 8;
}
missile[mi]._miDelFlag = true; missile[mi]._miDelFlag = true;
for (i = 0; i < 6; i++) { for (int i = 0; i < 6; i++) {
pn = CrawlNum[i]; pn = CrawlNum[i];
k = pn + 2; k = pn + 2;
for (j = (BYTE)CrawlTable[pn]; j > 0; j--) { for (j = (BYTE)CrawlTable[pn]; j > 0; j--) {
@ -2478,7 +2418,7 @@ void AddFireman(int mi, Point src, Point dst, int midir, int8_t mienemy, int id,
void AddFlare(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam) void AddFlare(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam)
{ {
if (src == dst) { if (src == dst) {
dst += (Direction)midir; dst += static_cast<Direction>(midir);
} }
GetMissileVel(mi, src, dst, 16); GetMissileVel(mi, src, dst, 16);
missile[mi]._mirange = 256; missile[mi]._mirange = 256;
@ -2613,10 +2553,9 @@ void AddEtherealize(int mi, Point src, Point dst, int midir, int8_t mienemy, int
{ {
auto &player = plr[id]; auto &player = plr[id];
missile[mi]._mirange = 16 * player._pLevel / 2; int range = 8 * player._pLevel;
for (int i = missile[mi]._mispllvl; i > 0; i--) { missile[mi]._mirange = ScaleSpellEffect(range, missile[mi]._mispllvl);
missile[mi]._mirange += missile[mi]._mirange / 8;
}
missile[mi]._mirange += missile[mi]._mirange * player._pISplDur / 128; missile[mi]._mirange += missile[mi]._mirange * player._pISplDur / 128;
missile[mi]._miVar1 = player._pHitPoints; missile[mi]._miVar1 = player._pHitPoints;
missile[mi]._miVar2 = player._pHPBase; missile[mi]._miVar2 = player._pHPBase;
@ -2693,13 +2632,12 @@ 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) void AddElement(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam)
{ {
if (src == dst) { if (src == dst) {
dst += (Direction)midir; dst += static_cast<Direction>(midir);
}
missile[mi]._midam = 2 * (plr[id]._pLevel + GenerateRnd(10) + GenerateRnd(10)) + 4;
for (int i = missile[mi]._mispllvl; i > 0; i--) {
missile[mi]._midam += missile[mi]._midam / 8;
} }
missile[mi]._midam /= 2;
int dmg = 2 * (plr[id]._pLevel + GenerateRndSum(10, 2)) + 4;
missile[mi]._midam = ScaleSpellEffect(dmg, missile[mi]._mispllvl) / 2;
GetMissileVel(mi, src, dst, 16); GetMissileVel(mi, src, dst, 16);
SetMissDir(mi, GetDirection(src, dst)); SetMissDir(mi, GetDirection(src, dst));
missile[mi]._mirange = 256; missile[mi]._mirange = 256;
@ -2771,13 +2709,9 @@ void AddFirewallC(int mi, Point src, Point dst, int midir, int8_t mienemy, int i
void AddInfra(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam) void AddInfra(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam)
{ {
int i; missile[mi]._mirange = ScaleSpellEffect(1584, missile[mi]._mispllvl);
missile[mi]._mirange = 1584;
for (i = missile[mi]._mispllvl; i > 0; i--) {
missile[mi]._mirange += missile[mi]._mirange / 8;
}
missile[mi]._mirange += missile[mi]._mirange * plr[id]._pISplDur / 128; missile[mi]._mirange += missile[mi]._mirange * plr[id]._pISplDur / 128;
if (mienemy == TARGET_MONSTERS) if (mienemy == TARGET_MONSTERS)
UseMana(id, SPL_INFRA); UseMana(id, SPL_INFRA);
} }
@ -2795,22 +2729,19 @@ void AddWave(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, in
void AddNova(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam) void AddNova(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam)
{ {
int k;
missile[mi]._miVar1 = dst.x; missile[mi]._miVar1 = dst.x;
missile[mi]._miVar2 = dst.y; missile[mi]._miVar2 = dst.y;
if (id != -1) { if (id != -1) {
missile[mi]._midam = (GenerateRnd(6) + GenerateRnd(6) + GenerateRnd(6) + GenerateRnd(6) + GenerateRnd(6)); int dmg = GenerateRndSum(6, 5) + plr[id]._pLevel + 5;
missile[mi]._midam += plr[id]._pLevel + 5; missile[mi]._midam = ScaleSpellEffect(dmg / 2, missile[mi]._mispllvl);
missile[mi]._midam /= 2;
for (k = missile[mi]._mispllvl; k > 0; k--) {
missile[mi]._midam += missile[mi]._midam / 8;
}
if (mienemy == TARGET_MONSTERS) if (mienemy == TARGET_MONSTERS)
UseMana(id, SPL_NOVA); UseMana(id, SPL_NOVA);
} else { } else {
missile[mi]._midam = ((DWORD)currlevel / 2) + GenerateRnd(3) + GenerateRnd(3) + GenerateRnd(3); missile[mi]._midam = ((DWORD)currlevel / 2) + GenerateRndSum(3, 3);
} }
missile[mi]._mirange = 1; missile[mi]._mirange = 1;
} }
@ -2885,8 +2816,6 @@ void AddDisarm(int mi, Point src, Point dst, int midir, int8_t mienemy, int id,
void AddApoca(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam) void AddApoca(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam)
{ {
int i;
missile[mi]._miVar1 = 8; missile[mi]._miVar1 = 8;
missile[mi]._miVar2 = src.y - missile[mi]._miVar1; missile[mi]._miVar2 = src.y - missile[mi]._miVar1;
missile[mi]._miVar3 = missile[mi]._miVar1 + src.y; missile[mi]._miVar3 = missile[mi]._miVar1 + src.y;
@ -2901,9 +2830,7 @@ void AddApoca(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, i
missile[mi]._miVar4 = 1; missile[mi]._miVar4 = 1;
if (missile[mi]._miVar5 >= MAXDUNX) if (missile[mi]._miVar5 >= MAXDUNX)
missile[mi]._miVar5 = MAXDUNX - 1; missile[mi]._miVar5 = MAXDUNX - 1;
for (i = 0; i < plr[id]._pLevel; i++) { missile[mi]._midam = GenerateRndSum(6, plr[id]._pLevel) + plr[id]._pLevel;
missile[mi]._midam += GenerateRnd(6) + 1;
}
missile[mi]._mirange = 255; missile[mi]._mirange = 255;
missile[mi]._miDelFlag = false; missile[mi]._miDelFlag = false;
UseMana(id, SPL_APOCA); UseMana(id, SPL_APOCA);
@ -2933,7 +2860,7 @@ void AddFlame(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, i
void AddFlamec(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam) void AddFlamec(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam)
{ {
if (src == dst) { if (src == dst) {
dst += (Direction)midir; dst += static_cast<Direction>(midir);
} }
GetMissileVel(mi, src, dst, 32); GetMissileVel(mi, src, dst, 32);
if (mienemy == TARGET_MONSTERS) { if (mienemy == TARGET_MONSTERS) {
@ -2953,7 +2880,7 @@ void AddCbolt(int mi, Point src, Point dst, int midir, int8_t micaster, int id,
missile[mi]._midam = (micaster == 0) ? (GenerateRnd(plr[id]._pMagic / 4) + 1) : 15; missile[mi]._midam = (micaster == 0) ? (GenerateRnd(plr[id]._pMagic / 4) + 1) : 15;
if (src == dst) { if (src == dst) {
dst += (Direction)midir; dst += static_cast<Direction>(midir);
} }
missile[mi]._miAnimFrame = GenerateRnd(8) + 1; missile[mi]._miAnimFrame = GenerateRnd(8) + 1;
missile[mi]._mlid = AddLight(src, 5); missile[mi]._mlid = AddLight(src, 5);
@ -2968,7 +2895,7 @@ 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) void AddHbolt(int mi, Point src, Point dst, int midir, int8_t micaster, int id, int dam)
{ {
if (src == dst) { if (src == dst) {
dst += (Direction)midir; dst += static_cast<Direction>(midir);
} }
int sp = 16; int sp = 16;
@ -3016,7 +2943,7 @@ void AddTelekinesis(int mi, Point src, Point dst, int midir, int8_t mienemy, int
void AddBoneSpirit(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam) void AddBoneSpirit(int mi, Point src, Point dst, int midir, int8_t mienemy, int id, int dam)
{ {
if (src == dst) { if (src == dst) {
dst += (Direction)midir; dst += static_cast<Direction>(midir);
} }
missile[mi]._midam = 0; missile[mi]._midam = 0;
GetMissileVel(mi, src, dst, 16); GetMissileVel(mi, src, dst, 16);
@ -3766,7 +3693,7 @@ static void MI_Ring(int i, int type)
int src = missile[i]._micaster; int src = missile[i]._micaster;
int k = CrawlNum[3] + 1; int k = CrawlNum[3] + 1;
uint8_t lvl = src > 0 ? plr[src]._pLevel : currlevel; uint8_t lvl = src > 0 ? plr[src]._pLevel : currlevel;
int dmg = 16 * (GenerateRnd(10) + GenerateRnd(10) + lvl + 2) / 2; int dmg = 16 * (GenerateRndSum(10, 2) + lvl + 2) / 2;
for (int j = CrawlTable[b]; j > 0; j--, k += 2) { for (int j = CrawlTable[b]; j > 0; j--, k += 2) {
int tx = missile[i]._miVar1 + CrawlTable[k - 1]; int tx = missile[i]._miVar1 + CrawlTable[k - 1];
@ -3833,7 +3760,7 @@ void MI_LightningWallC(int i)
int id = missile[i]._misource; int id = missile[i]._misource;
int lvl = (id > -1) ? plr[id]._pLevel : 0; int lvl = (id > -1) ? plr[id]._pLevel : 0;
int dmg = 16 * (GenerateRnd(10) + GenerateRnd(10) + lvl + 2); int dmg = 16 * (GenerateRndSum(10, 2) + lvl + 2);
{ {
Point position = { missile[i]._miVar1, missile[i]._miVar2 }; Point position = { missile[i]._miVar1, missile[i]._miVar2 };

Loading…
Cancel
Save