|
|
|
|
@ -1111,7 +1111,7 @@ void InitMissiles()
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddHiveExplosion(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddHiveExplosion(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
for (int x : { 80, 81 }) { |
|
|
|
|
for (int y : { 62, 63 }) { |
|
|
|
|
@ -1121,40 +1121,35 @@ void AddHiveExplosion(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
missile._miDelFlag = true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddFireRune(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddFireRune(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
AddRune(missile, parameter.dst, MIS_HIVEEXP); |
|
|
|
|
ConsumeSpell(Players[missile._misource], SPL_RUNEFIRE); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddLightningRune(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddLightningRune(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
int lvl = (missile.sourceType() == MissileSource::Player) ? missile.sourcePlayer()->_pLevel : 0; |
|
|
|
|
int dmg = 16 * (GenerateRndSum(10, 2) + lvl + 2); |
|
|
|
|
missile._midam = dmg; |
|
|
|
|
AddRune(missile, parameter.dst, MIS_LIGHTWALL); |
|
|
|
|
ConsumeSpell(Players[missile._misource], SPL_RUNELIGHT); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddGreatLightningRune(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddGreatLightningRune(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
AddRune(missile, parameter.dst, MIS_NOVA); |
|
|
|
|
ConsumeSpell(Players[missile._misource], SPL_RUNENOVA); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddImmolationRune(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddImmolationRune(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
AddRune(missile, parameter.dst, MIS_IMMOLATION); |
|
|
|
|
ConsumeSpell(Players[missile._misource], SPL_RUNEIMMOLAT); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddStoneRune(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddStoneRune(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
AddRune(missile, parameter.dst, MIS_STONE); |
|
|
|
|
ConsumeSpell(Players[missile._misource], SPL_RUNESTONE); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddReflection(Missile &missile, const AddMissileParameter & /*parameter*/) |
|
|
|
|
void AddReflection(Missile &missile, AddMissileParameter & /*parameter*/) |
|
|
|
|
{ |
|
|
|
|
missile._miDelFlag = true; |
|
|
|
|
|
|
|
|
|
@ -1169,13 +1164,12 @@ void AddReflection(Missile &missile, const AddMissileParameter & /*parameter*/)
|
|
|
|
|
player.wReflections += add; |
|
|
|
|
if (&player == MyPlayer) |
|
|
|
|
NetSendCmdParam1(true, CMD_SETREFLECT, player.wReflections); |
|
|
|
|
|
|
|
|
|
ConsumeSpell(player, SPL_REFLECT); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddBerserk(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddBerserk(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
missile._miDelFlag = true; |
|
|
|
|
parameter.spellFizzled = true; |
|
|
|
|
|
|
|
|
|
if (missile.sourceType() == MissileSource::Trap) |
|
|
|
|
return; |
|
|
|
|
@ -1219,11 +1213,11 @@ void AddBerserk(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
monster.maxDamageSpecial = (GenerateRnd(10) + 120) * monster.maxDamageSpecial / 100 + slvl; |
|
|
|
|
int lightRadius = leveltype == DTYPE_NEST ? 9 : 3; |
|
|
|
|
monster.lightId = AddLight(monster.position.tile, lightRadius); |
|
|
|
|
ConsumeSpell(player, SPL_BERSERK); |
|
|
|
|
parameter.spellFizzled = false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddHorkSpawn(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddHorkSpawn(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
UpdateMissileVelocity(missile, parameter.dst, 8); |
|
|
|
|
missile._mirange = 9; |
|
|
|
|
@ -1231,7 +1225,7 @@ void AddHorkSpawn(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
PutMissile(missile); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddJester(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddJester(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
missile_id spell = MIS_FIREBOLT; |
|
|
|
|
switch (GenerateRnd(10)) { |
|
|
|
|
@ -1253,7 +1247,6 @@ void AddJester(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
break; |
|
|
|
|
case 6: |
|
|
|
|
spell = MIS_TOWN; |
|
|
|
|
ConsumeSpell(Players[missile._misource], SPL_TOWN); |
|
|
|
|
break; |
|
|
|
|
case 7: |
|
|
|
|
spell = MIS_TELEPORT; |
|
|
|
|
@ -1265,11 +1258,12 @@ void AddJester(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
spell = MIS_STONE; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
AddMissile(missile.position.start, parameter.dst, parameter.midir, spell, missile._micaster, missile._misource, 0, missile._mispllvl); |
|
|
|
|
Missile *randomMissile = AddMissile(missile.position.start, parameter.dst, parameter.midir, spell, missile._micaster, missile._misource, 0, missile._mispllvl); |
|
|
|
|
parameter.spellFizzled = randomMissile == nullptr; |
|
|
|
|
missile._miDelFlag = true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddStealPotions(Missile &missile, const AddMissileParameter & /*parameter*/) |
|
|
|
|
void AddStealPotions(Missile &missile, AddMissileParameter & /*parameter*/) |
|
|
|
|
{ |
|
|
|
|
Crawl(0, 2, [&](Displacement displacement) { |
|
|
|
|
Point target = missile.position.start + displacement; |
|
|
|
|
@ -1336,7 +1330,7 @@ void AddStealPotions(Missile &missile, const AddMissileParameter & /*parameter*/
|
|
|
|
|
missile._miDelFlag = true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddManaTrap(Missile &missile, const AddMissileParameter & /*parameter*/) |
|
|
|
|
void AddManaTrap(Missile &missile, AddMissileParameter & /*parameter*/) |
|
|
|
|
{ |
|
|
|
|
std::optional<Point> trappedPlayerPosition = FindClosestValidPosition( |
|
|
|
|
[](Point target) { |
|
|
|
|
@ -1357,7 +1351,7 @@ void AddManaTrap(Missile &missile, const AddMissileParameter & /*parameter*/)
|
|
|
|
|
missile._miDelFlag = true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddSpecArrow(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddSpecArrow(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
int av = 0; |
|
|
|
|
|
|
|
|
|
@ -1385,7 +1379,7 @@ void AddSpecArrow(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
missile.var3 = av; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddWarp(Missile &missile, const AddMissileParameter & /*parameter*/) |
|
|
|
|
void AddWarp(Missile &missile, AddMissileParameter & /*parameter*/) |
|
|
|
|
{ |
|
|
|
|
int minDistanceSq = std::numeric_limits<int>::max(); |
|
|
|
|
Point src = missile.position.start; |
|
|
|
|
@ -1441,12 +1435,9 @@ void AddWarp(Missile &missile, const AddMissileParameter & /*parameter*/)
|
|
|
|
|
} |
|
|
|
|
missile._mirange = 2; |
|
|
|
|
missile.position.tile = tile; |
|
|
|
|
if (missileSource == MissileSource::Player) { |
|
|
|
|
ConsumeSpell(*missile.sourcePlayer(), SPL_WARP); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddLightningWall(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddLightningWall(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
UpdateMissileVelocity(missile, parameter.dst, 16); |
|
|
|
|
missile._miAnimFrame = GenerateRnd(8) + 1; |
|
|
|
|
@ -1467,7 +1458,7 @@ void AddLightningWall(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddRuneExplosion(Missile &missile, const AddMissileParameter & /*parameter*/) |
|
|
|
|
void AddRuneExplosion(Missile &missile, AddMissileParameter & /*parameter*/) |
|
|
|
|
{ |
|
|
|
|
if (missile.sourceType() == MissileSource::Player) { |
|
|
|
|
int dmg = 2 * (missile.sourcePlayer()->_pLevel + GenerateRndSum(10, 2)) + 4; |
|
|
|
|
@ -1483,7 +1474,7 @@ void AddRuneExplosion(Missile &missile, const AddMissileParameter & /*parameter*
|
|
|
|
|
missile._mirange = missile._miAnimLen - 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddFireNova(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddFireNova(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
Point dst = parameter.dst; |
|
|
|
|
if (missile.position.start == parameter.dst) { |
|
|
|
|
@ -1499,7 +1490,7 @@ void AddFireNova(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
missile._mlid = AddLight(missile.position.start, 8); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddLightningArrow(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddLightningArrow(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
Point dst = parameter.dst; |
|
|
|
|
if (missile.position.start == parameter.dst) { |
|
|
|
|
@ -1518,7 +1509,7 @@ void AddLightningArrow(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
missile._midam <<= 6; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddMana(Missile &missile, const AddMissileParameter & /*parameter*/) |
|
|
|
|
void AddMana(Missile &missile, AddMissileParameter & /*parameter*/) |
|
|
|
|
{ |
|
|
|
|
Player &player = Players[missile._misource]; |
|
|
|
|
|
|
|
|
|
@ -1539,32 +1530,28 @@ void AddMana(Missile &missile, const AddMissileParameter & /*parameter*/)
|
|
|
|
|
player._pManaBase += manaAmount; |
|
|
|
|
if (player._pManaBase > player._pMaxManaBase) |
|
|
|
|
player._pManaBase = player._pMaxManaBase; |
|
|
|
|
ConsumeSpell(player, SPL_MANA); |
|
|
|
|
missile._miDelFlag = true; |
|
|
|
|
drawmanaflag = true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddMagi(Missile &missile, const AddMissileParameter & /*parameter*/) |
|
|
|
|
void AddMagi(Missile &missile, AddMissileParameter & /*parameter*/) |
|
|
|
|
{ |
|
|
|
|
Player &player = Players[missile._misource]; |
|
|
|
|
|
|
|
|
|
player._pMana = player._pMaxMana; |
|
|
|
|
player._pManaBase = player._pMaxManaBase; |
|
|
|
|
ConsumeSpell(player, SPL_MAGI); |
|
|
|
|
missile._miDelFlag = true; |
|
|
|
|
drawmanaflag = true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddRing(Missile &missile, const AddMissileParameter & /*parameter*/) |
|
|
|
|
void AddRing(Missile &missile, AddMissileParameter & /*parameter*/) |
|
|
|
|
{ |
|
|
|
|
if (missile._micaster == TARGET_MONSTERS) |
|
|
|
|
ConsumeSpell(Players[missile._misource], SPL_FIRERING); |
|
|
|
|
missile.var1 = missile.position.start.x; |
|
|
|
|
missile.var2 = missile.position.start.y; |
|
|
|
|
missile._mirange = 7; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddSearch(Missile &missile, const AddMissileParameter & /*parameter*/) |
|
|
|
|
void AddSearch(Missile &missile, AddMissileParameter & /*parameter*/) |
|
|
|
|
{ |
|
|
|
|
Player &player = Players[missile._misource]; |
|
|
|
|
|
|
|
|
|
@ -1574,8 +1561,6 @@ void AddSearch(Missile &missile, const AddMissileParameter & /*parameter*/)
|
|
|
|
|
if (missile._misource >= 0) |
|
|
|
|
lvl = player._pLevel * 2; |
|
|
|
|
missile._mirange = lvl + 10 * missile._mispllvl + 245; |
|
|
|
|
if (missile._micaster == TARGET_MONSTERS) |
|
|
|
|
ConsumeSpell(player, SPL_SEARCH); |
|
|
|
|
|
|
|
|
|
for (auto &other : Missiles) { |
|
|
|
|
if (&other != &missile && missile.isSameSource(other) && other._mitype == MIS_SEARCH) { |
|
|
|
|
@ -1589,7 +1574,7 @@ void AddSearch(Missile &missile, const AddMissileParameter & /*parameter*/)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddCboltArrow(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddCboltArrow(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
Point dst = parameter.dst; |
|
|
|
|
missile._mirnd = GenerateRnd(15) + 1; |
|
|
|
|
@ -1608,7 +1593,7 @@ void AddCboltArrow(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
missile._mirange = 256; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddLArrow(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddLArrow(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
Point dst = parameter.dst; |
|
|
|
|
if (missile.position.start == dst) { |
|
|
|
|
@ -1645,7 +1630,7 @@ void AddLArrow(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
missile._mlid = AddLight(missile.position.start, 5); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddArrow(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddArrow(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
Point dst = parameter.dst; |
|
|
|
|
if (missile.position.start == dst) { |
|
|
|
|
@ -1695,7 +1680,7 @@ void UpdateVileMissPos(Missile &missile, Point dst)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddRndTeleport(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddRndTeleport(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
missile._mirange = 2; |
|
|
|
|
|
|
|
|
|
@ -1731,12 +1716,9 @@ void AddRndTeleport(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
missile.position.tile = targets[std::max<int32_t>(GenerateRnd(count), 0)]; |
|
|
|
|
|
|
|
|
|
if (missile._micaster == TARGET_MONSTERS) |
|
|
|
|
ConsumeSpell(player, SPL_RNDTELEPORT); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddFirebolt(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddFirebolt(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
Point dst = parameter.dst; |
|
|
|
|
if (missile.position.start == dst) { |
|
|
|
|
@ -1748,9 +1730,6 @@ void AddFirebolt(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
if (!missile.IsTrap()) { |
|
|
|
|
sp += std::min(missile._mispllvl * 2, 47); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (parameter.pParent == nullptr || parameter.pParent->_mitype != MIS_GUARDIAN) |
|
|
|
|
ConsumeSpell(Players[missile._misource], SPL_FIREBOLT); |
|
|
|
|
} |
|
|
|
|
UpdateMissileVelocity(missile, dst, sp); |
|
|
|
|
SetMissDir(missile, GetDirection16(missile.position.start, dst)); |
|
|
|
|
@ -1760,7 +1739,7 @@ void AddFirebolt(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
missile._mlid = AddLight(missile.position.start, 8); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddMagmaball(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddMagmaball(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
UpdateMissileVelocity(missile, parameter.dst, 16); |
|
|
|
|
missile.position.traveled.deltaX += 3 * missile.position.velocity.deltaX; |
|
|
|
|
@ -1775,7 +1754,7 @@ void AddMagmaball(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
missile._mlid = AddLight(missile.position.start, 8); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddTeleport(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddTeleport(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
Player &player = Players[missile._misource]; |
|
|
|
|
|
|
|
|
|
@ -1788,14 +1767,14 @@ void AddTeleport(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
if (teleportDestination) { |
|
|
|
|
missile.position.tile = *teleportDestination; |
|
|
|
|
missile.position.start = *teleportDestination; |
|
|
|
|
ConsumeSpell(player, SPL_TELEPORT); |
|
|
|
|
missile._mirange = 2; |
|
|
|
|
} else { |
|
|
|
|
missile._miDelFlag = true; |
|
|
|
|
parameter.spellFizzled = true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddLightball(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddLightball(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
UpdateMissileVelocity(missile, parameter.dst, 16); |
|
|
|
|
missile._miAnimFrame = GenerateRnd(8) + 1; |
|
|
|
|
@ -1805,7 +1784,7 @@ void AddLightball(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
missile.var2 = position.y; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddFirewall(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddFirewall(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
missile._midam = GenerateRndSum(10, 2) + 2; |
|
|
|
|
missile._midam += missile._misource >= 0 ? Players[missile._misource]._pLevel : currlevel; // BUGFIX: missing parenthesis around ternary (fixed)
|
|
|
|
|
@ -1823,7 +1802,7 @@ void AddFirewall(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
missile.var1 = missile._mirange - missile._miAnimLen; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddFireball(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddFireball(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
Point dst = parameter.dst; |
|
|
|
|
if (missile.position.start == dst) { |
|
|
|
|
@ -1836,8 +1815,6 @@ void AddFireball(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
|
|
|
|
|
int dmg = 2 * (player._pLevel + GenerateRndSum(10, 2)) + 4; |
|
|
|
|
missile._midam = ScaleSpellEffect(dmg, missile._mispllvl); |
|
|
|
|
|
|
|
|
|
ConsumeSpell(player, SPL_FIREBALL); |
|
|
|
|
} |
|
|
|
|
UpdateMissileVelocity(missile, dst, sp); |
|
|
|
|
SetMissDir(missile, GetDirection16(missile.position.start, dst)); |
|
|
|
|
@ -1847,10 +1824,8 @@ void AddFireball(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
missile._mlid = AddLight(missile.position.start, 8); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddLightctrl(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddLightctrl(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
if (missile._midam == 0 && missile._micaster == TARGET_MONSTERS) |
|
|
|
|
ConsumeSpell(Players[missile._misource], SPL_LIGHTNING); |
|
|
|
|
missile.var1 = missile.position.start.x; |
|
|
|
|
missile.var2 = missile.position.start.y; |
|
|
|
|
UpdateMissileVelocity(missile, parameter.dst, 32); |
|
|
|
|
@ -1858,7 +1833,7 @@ void AddLightctrl(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
missile._mirange = 256; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddLightning(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddLightning(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
missile.position.start = parameter.dst; |
|
|
|
|
|
|
|
|
|
@ -1877,7 +1852,7 @@ void AddLightning(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
missile._mlid = AddLight(missile.position.tile, 4); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddMisexp(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddMisexp(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
if (missile._micaster != TARGET_MONSTERS && missile._misource >= 0) { |
|
|
|
|
switch (Monsters[missile._misource].type().type) { |
|
|
|
|
@ -1907,7 +1882,7 @@ void AddMisexp(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
missile._mirange = missile._miAnimLen; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddWeapexp(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddWeapexp(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
missile.var2 = parameter.dst.x; |
|
|
|
|
if (parameter.dst.x == 1) |
|
|
|
|
@ -1917,7 +1892,7 @@ void AddWeapexp(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
missile._mirange = missile._miAnimLen - 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddTown(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddTown(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
if (leveltype == DTYPE_TOWN) { |
|
|
|
|
missile.position.tile = parameter.dst; |
|
|
|
|
@ -1971,7 +1946,7 @@ void AddTown(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddFlash(Missile &missile, const AddMissileParameter & /*parameter*/) |
|
|
|
|
void AddFlash(Missile &missile, AddMissileParameter & /*parameter*/) |
|
|
|
|
{ |
|
|
|
|
switch (missile.sourceType()) { |
|
|
|
|
case MissileSource::Player: { |
|
|
|
|
@ -1979,7 +1954,6 @@ void AddFlash(Missile &missile, const AddMissileParameter & /*parameter*/)
|
|
|
|
|
int dmg = GenerateRndSum(20, player._pLevel + 1) + player._pLevel + 1; |
|
|
|
|
missile._midam = ScaleSpellEffect(dmg, missile._mispllvl); |
|
|
|
|
missile._midam += missile._midam / 2; |
|
|
|
|
ConsumeSpell(player, SPL_FLASH); |
|
|
|
|
} break; |
|
|
|
|
case MissileSource::Monster: |
|
|
|
|
missile._midam = missile.sourceMonster()->level(sgGameInitInfo.nDifficulty) * 2; |
|
|
|
|
@ -1992,7 +1966,7 @@ void AddFlash(Missile &missile, const AddMissileParameter & /*parameter*/)
|
|
|
|
|
missile._mirange = 19; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddFlash2(Missile &missile, const AddMissileParameter & /*parameter*/) |
|
|
|
|
void AddFlash2(Missile &missile, AddMissileParameter & /*parameter*/) |
|
|
|
|
{ |
|
|
|
|
if (missile._micaster == TARGET_MONSTERS) { |
|
|
|
|
if (!missile.IsTrap()) { |
|
|
|
|
@ -2008,7 +1982,7 @@ void AddFlash2(Missile &missile, const AddMissileParameter & /*parameter*/)
|
|
|
|
|
missile._mirange = 19; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddManashield(Missile &missile, const AddMissileParameter & /*parameter*/) |
|
|
|
|
void AddManashield(Missile &missile, AddMissileParameter & /*parameter*/) |
|
|
|
|
{ |
|
|
|
|
missile._miDelFlag = true; |
|
|
|
|
|
|
|
|
|
@ -2020,12 +1994,9 @@ void AddManashield(Missile &missile, const AddMissileParameter & /*parameter*/)
|
|
|
|
|
player.pManaShield = true; |
|
|
|
|
if (&player == MyPlayer) |
|
|
|
|
NetSendCmd(true, CMD_SETSHIELD); |
|
|
|
|
|
|
|
|
|
if (missile._micaster == TARGET_MONSTERS) |
|
|
|
|
ConsumeSpell(player, SPL_MANASHIELD); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddFiremove(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddFiremove(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
missile._midam = GenerateRnd(10) + Players[missile._misource]._pLevel + 1; |
|
|
|
|
UpdateMissileVelocity(missile, parameter.dst, 16); |
|
|
|
|
@ -2034,7 +2005,7 @@ void AddFiremove(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
missile.position.offset.deltaY -= 32; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddGuardian(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddGuardian(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
Player &player = Players[missile._misource]; |
|
|
|
|
|
|
|
|
|
@ -2067,13 +2038,13 @@ void AddGuardian(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
|
|
|
|
|
if (!spawnPosition) { |
|
|
|
|
missile._miDelFlag = true; |
|
|
|
|
parameter.spellFizzled = true; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
missile._miDelFlag = false; |
|
|
|
|
missile.position.tile = *spawnPosition; |
|
|
|
|
missile.position.start = *spawnPosition; |
|
|
|
|
ConsumeSpell(player, SPL_GUARDIAN); |
|
|
|
|
|
|
|
|
|
missile._mlid = AddLight(missile.position.tile, 1); |
|
|
|
|
missile._mirange = missile._mispllvl + (player._pLevel / 2); |
|
|
|
|
@ -2089,12 +2060,11 @@ void AddGuardian(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
missile.var3 = 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddChain(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddChain(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
missile.var1 = parameter.dst.x; |
|
|
|
|
missile.var2 = parameter.dst.y; |
|
|
|
|
missile._mirange = 1; |
|
|
|
|
ConsumeSpell(Players[missile._misource], SPL_CHAIN); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
namespace { |
|
|
|
|
@ -2118,7 +2088,7 @@ void InitMissileAnimationFromMonster(Missile &mis, Direction midir, const Monste
|
|
|
|
|
} |
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
void AddRhino(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddRhino(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
Monster &monster = Monsters[missile._misource]; |
|
|
|
|
|
|
|
|
|
@ -2138,7 +2108,7 @@ void AddRhino(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
PutMissile(missile); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddFlare(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddFlare(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
Point dst = parameter.dst; |
|
|
|
|
if (missile.position.start == dst) { |
|
|
|
|
@ -2149,11 +2119,7 @@ void AddFlare(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
missile.var1 = missile.position.start.x; |
|
|
|
|
missile.var2 = missile.position.start.y; |
|
|
|
|
missile._mlid = AddLight(missile.position.start, 8); |
|
|
|
|
if (missile._micaster == TARGET_MONSTERS) { |
|
|
|
|
Player &player = Players[missile._misource]; |
|
|
|
|
ConsumeSpell(player, SPL_FLARE); |
|
|
|
|
ApplyPlrDamage(player, 5); |
|
|
|
|
} else if (missile._misource > 0) { |
|
|
|
|
if (missile._micaster != TARGET_MONSTERS && missile._misource > 0) { |
|
|
|
|
auto &monster = Monsters[missile._misource]; |
|
|
|
|
if (monster.type().type == MT_SUCCUBUS) |
|
|
|
|
SetMissAnim(missile, MFILE_FLARE); |
|
|
|
|
@ -2170,7 +2136,7 @@ void AddFlare(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddAcid(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddAcid(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
UpdateMissileVelocity(missile, parameter.dst, 16); |
|
|
|
|
SetMissDir(missile, GetDirection16(missile.position.start, parameter.dst)); |
|
|
|
|
@ -2184,7 +2150,7 @@ void AddAcid(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
PutMissile(missile); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddAcidpud(Missile &missile, const AddMissileParameter & /*parameter*/) |
|
|
|
|
void AddAcidpud(Missile &missile, AddMissileParameter & /*parameter*/) |
|
|
|
|
{ |
|
|
|
|
missile._miLightFlag = true; |
|
|
|
|
int monst = missile._misource; |
|
|
|
|
@ -2192,7 +2158,7 @@ void AddAcidpud(Missile &missile, const AddMissileParameter & /*parameter*/)
|
|
|
|
|
missile._miPreFlag = true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddStone(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddStone(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
std::optional<Point> targetMonsterPosition = FindClosestValidPosition( |
|
|
|
|
[](Point target) { |
|
|
|
|
@ -2220,6 +2186,7 @@ void AddStone(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
|
|
|
|
|
if (!targetMonsterPosition) { |
|
|
|
|
missile._miDelFlag = true; |
|
|
|
|
parameter.spellFizzled = true; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -2241,10 +2208,9 @@ void AddStone(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
if (missile._mirange > 15) |
|
|
|
|
missile._mirange = 15; |
|
|
|
|
missile._mirange <<= 4; |
|
|
|
|
ConsumeSpell(player, SPL_STONE); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddGolem(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddGolem(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
missile._miDelFlag = true; |
|
|
|
|
|
|
|
|
|
@ -2255,8 +2221,6 @@ void AddGolem(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
if (golem.position.tile != GolemHoldingCell && &player == MyPlayer) |
|
|
|
|
KillMyGolem(); |
|
|
|
|
|
|
|
|
|
ConsumeSpell(player, SPL_GOLEM); |
|
|
|
|
|
|
|
|
|
if (golem.position.tile == GolemHoldingCell) { |
|
|
|
|
std::optional<Point> spawnPosition = FindClosestValidPosition( |
|
|
|
|
[start = missile.position.start](Point target) { |
|
|
|
|
@ -2270,14 +2234,14 @@ void AddGolem(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddBoom(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddBoom(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
missile.position.tile = parameter.dst; |
|
|
|
|
missile.position.start = parameter.dst; |
|
|
|
|
missile._mirange = missile._miAnimLen; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddHeal(Missile &missile, const AddMissileParameter & /*parameter*/) |
|
|
|
|
void AddHeal(Missile &missile, AddMissileParameter & /*parameter*/) |
|
|
|
|
{ |
|
|
|
|
Player &player = Players[missile._misource]; |
|
|
|
|
|
|
|
|
|
@ -2295,17 +2259,15 @@ void AddHeal(Missile &missile, const AddMissileParameter & /*parameter*/)
|
|
|
|
|
player._pHitPoints = std::min(player._pHitPoints + hp, player._pMaxHP); |
|
|
|
|
player._pHPBase = std::min(player._pHPBase + hp, player._pMaxHPBase); |
|
|
|
|
|
|
|
|
|
ConsumeSpell(player, SPL_HEAL); |
|
|
|
|
missile._miDelFlag = true; |
|
|
|
|
drawhpflag = true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddHealOther(Missile &missile, const AddMissileParameter & /*parameter*/) |
|
|
|
|
void AddHealOther(Missile &missile, AddMissileParameter & /*parameter*/) |
|
|
|
|
{ |
|
|
|
|
Player &player = Players[missile._misource]; |
|
|
|
|
|
|
|
|
|
missile._miDelFlag = true; |
|
|
|
|
ConsumeSpell(player, SPL_HEALOTHER); |
|
|
|
|
if (&player == MyPlayer) { |
|
|
|
|
NewCursor(CURSOR_HEALOTHER); |
|
|
|
|
if (ControlMode != ControlTypes::KeyboardAndMouse) |
|
|
|
|
@ -2313,7 +2275,7 @@ void AddHealOther(Missile &missile, const AddMissileParameter & /*parameter*/)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddElement(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddElement(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
Point dst = parameter.dst; |
|
|
|
|
if (missile.position.start == dst) { |
|
|
|
|
@ -2333,17 +2295,15 @@ void AddElement(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
missile.var4 = dst.x; |
|
|
|
|
missile.var5 = dst.y; |
|
|
|
|
missile._mlid = AddLight(missile.position.start, 8); |
|
|
|
|
ConsumeSpell(player, SPL_ELEMENT); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
extern void FocusOnInventory(); |
|
|
|
|
|
|
|
|
|
void AddIdentify(Missile &missile, const AddMissileParameter & /*parameter*/) |
|
|
|
|
void AddIdentify(Missile &missile, AddMissileParameter & /*parameter*/) |
|
|
|
|
{ |
|
|
|
|
Player &player = Players[missile._misource]; |
|
|
|
|
|
|
|
|
|
missile._miDelFlag = true; |
|
|
|
|
ConsumeSpell(player, SPL_IDENTIFY); |
|
|
|
|
if (&player == MyPlayer) { |
|
|
|
|
if (sbookflag) |
|
|
|
|
sbookflag = false; |
|
|
|
|
@ -2356,7 +2316,7 @@ void AddIdentify(Missile &missile, const AddMissileParameter & /*parameter*/)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddFirewallC(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddFirewallC(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
std::optional<Point> spreadPosition = FindClosestValidPosition( |
|
|
|
|
[start = missile.position.start](Point target) { |
|
|
|
|
@ -2366,6 +2326,7 @@ void AddFirewallC(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
|
|
|
|
|
if (!spreadPosition) { |
|
|
|
|
missile._miDelFlag = true; |
|
|
|
|
parameter.spellFizzled = true; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -2377,30 +2338,25 @@ void AddFirewallC(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
missile.var3 = static_cast<int>(Left(Left(parameter.midir))); |
|
|
|
|
missile.var4 = static_cast<int>(Right(Right(parameter.midir))); |
|
|
|
|
missile._mirange = 7; |
|
|
|
|
ConsumeSpell(Players[missile._misource], SPL_FIREWALL); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddInfra(Missile &missile, const AddMissileParameter & /*parameter*/) |
|
|
|
|
void AddInfra(Missile &missile, AddMissileParameter & /*parameter*/) |
|
|
|
|
{ |
|
|
|
|
Player &player = Players[missile._misource]; |
|
|
|
|
|
|
|
|
|
missile._mirange = ScaleSpellEffect(1584, missile._mispllvl); |
|
|
|
|
missile._mirange += missile._mirange * player._pISplDur / 128; |
|
|
|
|
|
|
|
|
|
if (missile._micaster == TARGET_MONSTERS) |
|
|
|
|
ConsumeSpell(player, SPL_INFRA); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddWave(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddWave(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
missile.var1 = parameter.dst.x; |
|
|
|
|
missile.var2 = parameter.dst.y; |
|
|
|
|
missile._mirange = 1; |
|
|
|
|
missile._miAnimFrame = 4; |
|
|
|
|
ConsumeSpell(Players[missile._misource], SPL_WAVE); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddNova(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddNova(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
Player &player = Players[missile._misource]; |
|
|
|
|
|
|
|
|
|
@ -2410,9 +2366,6 @@ void AddNova(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
if (!missile.IsTrap()) { |
|
|
|
|
int dmg = GenerateRndSum(6, 5) + player._pLevel + 5; |
|
|
|
|
missile._midam = ScaleSpellEffect(dmg / 2, missile._mispllvl); |
|
|
|
|
|
|
|
|
|
if (missile._micaster == TARGET_MONSTERS) |
|
|
|
|
ConsumeSpell(player, SPL_NOVA); |
|
|
|
|
} else { |
|
|
|
|
missile._midam = (currlevel / 2) + GenerateRndSum(3, 3); |
|
|
|
|
} |
|
|
|
|
@ -2420,16 +2373,16 @@ void AddNova(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
missile._mirange = 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddBlodboil(Missile &missile, const AddMissileParameter & /*parameter*/) |
|
|
|
|
void AddBlodboil(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
Player &player = Players[missile._misource]; |
|
|
|
|
|
|
|
|
|
if (HasAnyOf(player._pSpellFlags, SpellFlag::RageActive | SpellFlag::RageCooldown) || player._pHitPoints <= player._pLevel << 6) { |
|
|
|
|
missile._miDelFlag = true; |
|
|
|
|
parameter.spellFizzled = true; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ConsumeSpell(player, SPL_BLODBOIL); |
|
|
|
|
int tmp = 3 * player._pLevel; |
|
|
|
|
tmp <<= 7; |
|
|
|
|
player._pSpellFlags |= SpellFlag::RageActive; |
|
|
|
|
@ -2441,12 +2394,11 @@ void AddBlodboil(Missile &missile, const AddMissileParameter & /*parameter*/)
|
|
|
|
|
player.Say(HeroSpeech::Aaaaargh); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddRepair(Missile &missile, const AddMissileParameter & /*parameter*/) |
|
|
|
|
void AddRepair(Missile &missile, AddMissileParameter & /*parameter*/) |
|
|
|
|
{ |
|
|
|
|
Player &player = Players[missile._misource]; |
|
|
|
|
|
|
|
|
|
missile._miDelFlag = true; |
|
|
|
|
ConsumeSpell(player, SPL_REPAIR); |
|
|
|
|
if (&player == MyPlayer) { |
|
|
|
|
if (sbookflag) |
|
|
|
|
sbookflag = false; |
|
|
|
|
@ -2459,12 +2411,11 @@ void AddRepair(Missile &missile, const AddMissileParameter & /*parameter*/)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddRecharge(Missile &missile, const AddMissileParameter & /*parameter*/) |
|
|
|
|
void AddRecharge(Missile &missile, AddMissileParameter & /*parameter*/) |
|
|
|
|
{ |
|
|
|
|
Player &player = Players[missile._misource]; |
|
|
|
|
|
|
|
|
|
missile._miDelFlag = true; |
|
|
|
|
ConsumeSpell(player, SPL_RECHARGE); |
|
|
|
|
if (&player == MyPlayer) { |
|
|
|
|
if (sbookflag) |
|
|
|
|
sbookflag = false; |
|
|
|
|
@ -2477,12 +2428,11 @@ void AddRecharge(Missile &missile, const AddMissileParameter & /*parameter*/)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddDisarm(Missile &missile, const AddMissileParameter & /*parameter*/) |
|
|
|
|
void AddDisarm(Missile &missile, AddMissileParameter & /*parameter*/) |
|
|
|
|
{ |
|
|
|
|
Player &player = Players[missile._misource]; |
|
|
|
|
|
|
|
|
|
missile._miDelFlag = true; |
|
|
|
|
ConsumeSpell(player, SPL_DISARM); |
|
|
|
|
if (&player == MyPlayer) { |
|
|
|
|
NewCursor(CURSOR_DISARM); |
|
|
|
|
if (ControlMode != ControlTypes::KeyboardAndMouse) { |
|
|
|
|
@ -2494,7 +2444,7 @@ void AddDisarm(Missile &missile, const AddMissileParameter & /*parameter*/)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddApoca(Missile &missile, const AddMissileParameter & /*parameter*/) |
|
|
|
|
void AddApoca(Missile &missile, AddMissileParameter & /*parameter*/) |
|
|
|
|
{ |
|
|
|
|
Player &player = Players[missile._misource]; |
|
|
|
|
|
|
|
|
|
@ -2507,10 +2457,9 @@ void AddApoca(Missile &missile, const AddMissileParameter & /*parameter*/)
|
|
|
|
|
int playerLevel = player._pLevel; |
|
|
|
|
missile._midam = GenerateRndSum(6, playerLevel) + playerLevel; |
|
|
|
|
missile._mirange = 255; |
|
|
|
|
ConsumeSpell(player, SPL_APOCA); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddFlame(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddFlame(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
missile.var2 = 5 * missile._midam; |
|
|
|
|
missile.position.start = parameter.dst; |
|
|
|
|
@ -2528,22 +2477,19 @@ void AddFlame(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddFlamec(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddFlamec(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
Point dst = parameter.dst; |
|
|
|
|
if (missile.position.start == parameter.dst) { |
|
|
|
|
dst += parameter.midir; |
|
|
|
|
} |
|
|
|
|
UpdateMissileVelocity(missile, dst, 32); |
|
|
|
|
if (missile._micaster == TARGET_MONSTERS) { |
|
|
|
|
ConsumeSpell(Players[missile._misource], SPL_FLAME); |
|
|
|
|
} |
|
|
|
|
missile.var1 = missile.position.start.x; |
|
|
|
|
missile.var2 = missile.position.start.y; |
|
|
|
|
missile._mirange = 256; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddCbolt(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddCbolt(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
Point dst = parameter.dst; |
|
|
|
|
missile._mirnd = GenerateRnd(15) + 1; |
|
|
|
|
@ -2561,7 +2507,7 @@ void AddCbolt(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
missile._mirange = 256; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddHbolt(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddHbolt(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
Point dst = parameter.dst; |
|
|
|
|
if (missile.position.start == dst) { |
|
|
|
|
@ -2581,14 +2527,12 @@ void AddHbolt(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
missile.var2 = missile.position.start.y; |
|
|
|
|
missile._mlid = AddLight(missile.position.start, 8); |
|
|
|
|
missile._midam = GenerateRnd(10) + player._pLevel + 9; |
|
|
|
|
ConsumeSpell(player, SPL_HBOLT); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddResurrect(Missile &missile, const AddMissileParameter & /*parameter*/) |
|
|
|
|
void AddResurrect(Missile &missile, AddMissileParameter & /*parameter*/) |
|
|
|
|
{ |
|
|
|
|
Player &player = Players[missile._misource]; |
|
|
|
|
|
|
|
|
|
ConsumeSpell(player, SPL_RESURRECT); |
|
|
|
|
if (&player == MyPlayer) { |
|
|
|
|
NewCursor(CURSOR_RESURRECT); |
|
|
|
|
if (ControlMode != ControlTypes::KeyboardAndMouse) |
|
|
|
|
@ -2597,24 +2541,23 @@ void AddResurrect(Missile &missile, const AddMissileParameter & /*parameter*/)
|
|
|
|
|
missile._miDelFlag = true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddResurrectBeam(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddResurrectBeam(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
missile.position.tile = parameter.dst; |
|
|
|
|
missile.position.start = parameter.dst; |
|
|
|
|
missile._mirange = MissileSpriteData[MFILE_RESSUR1].animLen[0]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddTelekinesis(Missile &missile, const AddMissileParameter & /*parameter*/) |
|
|
|
|
void AddTelekinesis(Missile &missile, AddMissileParameter & /*parameter*/) |
|
|
|
|
{ |
|
|
|
|
Player &player = Players[missile._misource]; |
|
|
|
|
|
|
|
|
|
missile._miDelFlag = true; |
|
|
|
|
ConsumeSpell(player, SPL_TELEKINESIS); |
|
|
|
|
if (&player == MyPlayer) |
|
|
|
|
NewCursor(CURSOR_TELEKINESIS); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddBoneSpirit(Missile &missile, const AddMissileParameter ¶meter) |
|
|
|
|
void AddBoneSpirit(Missile &missile, AddMissileParameter ¶meter) |
|
|
|
|
{ |
|
|
|
|
Point dst = parameter.dst; |
|
|
|
|
if (missile.position.start == parameter.dst) { |
|
|
|
|
@ -2628,21 +2571,16 @@ void AddBoneSpirit(Missile &missile, const AddMissileParameter ¶meter)
|
|
|
|
|
missile.var4 = dst.x; |
|
|
|
|
missile.var5 = dst.y; |
|
|
|
|
missile._mlid = AddLight(missile.position.start, 8); |
|
|
|
|
if (missile._micaster == TARGET_MONSTERS) { |
|
|
|
|
Player &player = Players[missile._misource]; |
|
|
|
|
ConsumeSpell(player, SPL_BONESPIRIT); |
|
|
|
|
ApplyPlrDamage(player, 6); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddRportal(Missile &missile, const AddMissileParameter & /*parameter*/) |
|
|
|
|
void AddRportal(Missile &missile, AddMissileParameter & /*parameter*/) |
|
|
|
|
{ |
|
|
|
|
missile._mirange = 100; |
|
|
|
|
missile.var1 = 100 - missile._miAnimLen; |
|
|
|
|
PutMissile(missile); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AddDiabApoca(Missile &missile, const AddMissileParameter & /*parameter*/) |
|
|
|
|
void AddDiabApoca(Missile &missile, AddMissileParameter & /*parameter*/) |
|
|
|
|
{ |
|
|
|
|
for (const Player &player : Players) { |
|
|
|
|
if (!player.plractive) |
|
|
|
|
@ -2695,8 +2633,11 @@ Missile *AddMissile(Point src, Point dst, Direction midir, missile_id mitype, mi
|
|
|
|
|
PlaySfxLoc(missileData.mlSFX, missile.position.start); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
AddMissileParameter parameter = { dst, midir, pParent }; |
|
|
|
|
AddMissileParameter parameter = { dst, midir, pParent, false }; |
|
|
|
|
missileData.mAddProc(missile, parameter); |
|
|
|
|
if (parameter.spellFizzled) { |
|
|
|
|
return nullptr; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return &missile; |
|
|
|
|
} |
|
|
|
|
|