diff --git a/Source/misdat.h b/Source/misdat.h index 1f93009be..87ffec6dc 100644 --- a/Source/misdat.h +++ b/Source/misdat.h @@ -115,7 +115,7 @@ struct Missile; struct AddMissileParameter; struct MissileData { - void (*mAddProc)(Missile &, const AddMissileParameter &); + void (*mAddProc)(Missile &, AddMissileParameter &); void (*mProc)(Missile &); uint8_t mName; bool mDraw; diff --git a/Source/missiles.cpp b/Source/missiles.cpp index ae4fd9184..a01c4238d 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -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 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::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(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 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 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 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(Left(Left(parameter.midir))); missile.var4 = static_cast(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; } diff --git a/Source/missiles.h b/Source/missiles.h index 517a40e6e..d95d1053c 100644 --- a/Source/missiles.h +++ b/Source/missiles.h @@ -238,43 +238,44 @@ struct AddMissileParameter { Point dst; Direction midir; Missile *pParent; + bool spellFizzled; }; -void AddHiveExplosion(Missile &missile, const AddMissileParameter ¶meter); -void AddFireRune(Missile &missile, const AddMissileParameter ¶meter); -void AddLightningRune(Missile &missile, const AddMissileParameter ¶meter); -void AddGreatLightningRune(Missile &missile, const AddMissileParameter ¶meter); -void AddImmolationRune(Missile &missile, const AddMissileParameter ¶meter); -void AddStoneRune(Missile &missile, const AddMissileParameter ¶meter); -void AddReflection(Missile &missile, const AddMissileParameter ¶meter); -void AddBerserk(Missile &missile, const AddMissileParameter ¶meter); +void AddHiveExplosion(Missile &missile, AddMissileParameter ¶meter); +void AddFireRune(Missile &missile, AddMissileParameter ¶meter); +void AddLightningRune(Missile &missile, AddMissileParameter ¶meter); +void AddGreatLightningRune(Missile &missile, AddMissileParameter ¶meter); +void AddImmolationRune(Missile &missile, AddMissileParameter ¶meter); +void AddStoneRune(Missile &missile, AddMissileParameter ¶meter); +void AddReflection(Missile &missile, AddMissileParameter ¶meter); +void AddBerserk(Missile &missile, AddMissileParameter ¶meter); /** * var1: Direction to place the spawn */ -void AddHorkSpawn(Missile &missile, const AddMissileParameter ¶meter); -void AddJester(Missile &missile, const AddMissileParameter ¶meter); -void AddStealPotions(Missile &missile, const AddMissileParameter ¶meter); -void AddManaTrap(Missile &missile, const AddMissileParameter ¶meter); -void AddSpecArrow(Missile &missile, const AddMissileParameter ¶meter); -void AddWarp(Missile &missile, const AddMissileParameter ¶meter); -void AddLightningWall(Missile &missile, const AddMissileParameter ¶meter); -void AddRuneExplosion(Missile &missile, const AddMissileParameter ¶meter); -void AddFireNova(Missile &missile, const AddMissileParameter ¶meter); -void AddLightningArrow(Missile &missile, const AddMissileParameter ¶meter); -void AddMana(Missile &missile, const AddMissileParameter ¶meter); -void AddMagi(Missile &missile, const AddMissileParameter ¶meter); -void AddRing(Missile &missile, const AddMissileParameter ¶meter); -void AddSearch(Missile &missile, const AddMissileParameter ¶meter); -void AddCboltArrow(Missile &missile, const AddMissileParameter ¶meter); -void AddLArrow(Missile &missile, const AddMissileParameter ¶meter); -void AddArrow(Missile &missile, const AddMissileParameter ¶meter); -void AddRndTeleport(Missile &missile, const AddMissileParameter ¶meter); -void AddFirebolt(Missile &missile, const AddMissileParameter ¶meter); -void AddMagmaball(Missile &missile, const AddMissileParameter ¶meter); -void AddTeleport(Missile &missile, const AddMissileParameter ¶meter); -void AddLightball(Missile &missile, const AddMissileParameter ¶meter); -void AddFirewall(Missile &missile, const AddMissileParameter ¶meter); +void AddHorkSpawn(Missile &missile, AddMissileParameter ¶meter); +void AddJester(Missile &missile, AddMissileParameter ¶meter); +void AddStealPotions(Missile &missile, AddMissileParameter ¶meter); +void AddManaTrap(Missile &missile, AddMissileParameter ¶meter); +void AddSpecArrow(Missile &missile, AddMissileParameter ¶meter); +void AddWarp(Missile &missile, AddMissileParameter ¶meter); +void AddLightningWall(Missile &missile, AddMissileParameter ¶meter); +void AddRuneExplosion(Missile &missile, AddMissileParameter ¶meter); +void AddFireNova(Missile &missile, AddMissileParameter ¶meter); +void AddLightningArrow(Missile &missile, AddMissileParameter ¶meter); +void AddMana(Missile &missile, AddMissileParameter ¶meter); +void AddMagi(Missile &missile, AddMissileParameter ¶meter); +void AddRing(Missile &missile, AddMissileParameter ¶meter); +void AddSearch(Missile &missile, AddMissileParameter ¶meter); +void AddCboltArrow(Missile &missile, AddMissileParameter ¶meter); +void AddLArrow(Missile &missile, AddMissileParameter ¶meter); +void AddArrow(Missile &missile, AddMissileParameter ¶meter); +void AddRndTeleport(Missile &missile, AddMissileParameter ¶meter); +void AddFirebolt(Missile &missile, AddMissileParameter ¶meter); +void AddMagmaball(Missile &missile, AddMissileParameter ¶meter); +void AddTeleport(Missile &missile, AddMissileParameter ¶meter); +void AddLightball(Missile &missile, AddMissileParameter ¶meter); +void AddFirewall(Missile &missile, AddMissileParameter ¶meter); /** * var1: X coordinate of the missile-light @@ -282,61 +283,61 @@ void AddFirewall(Missile &missile, const AddMissileParameter ¶meter); * var4: X coordinate of the missile-light * var5: Y coordinate of the missile-light */ -void AddFireball(Missile &missile, const AddMissileParameter ¶meter); +void AddFireball(Missile &missile, AddMissileParameter ¶meter); /** * var1: X coordinate of the missile * var2: Y coordinate of the missile */ -void AddLightctrl(Missile &missile, const AddMissileParameter ¶meter); -void AddLightning(Missile &missile, const AddMissileParameter ¶meter); -void AddMisexp(Missile &missile, const AddMissileParameter ¶meter); -void AddWeapexp(Missile &missile, const AddMissileParameter ¶meter); +void AddLightctrl(Missile &missile, AddMissileParameter ¶meter); +void AddLightning(Missile &missile, AddMissileParameter ¶meter); +void AddMisexp(Missile &missile, AddMissileParameter ¶meter); +void AddWeapexp(Missile &missile, AddMissileParameter ¶meter); /** * var1: Animation */ -void AddTown(Missile &missile, const AddMissileParameter ¶meter); -void AddFlash(Missile &missile, const AddMissileParameter ¶meter); -void AddFlash2(Missile &missile, const AddMissileParameter ¶meter); -void AddManashield(Missile &missile, const AddMissileParameter ¶meter); -void AddFiremove(Missile &missile, const AddMissileParameter ¶meter); +void AddTown(Missile &missile, AddMissileParameter ¶meter); +void AddFlash(Missile &missile, AddMissileParameter ¶meter); +void AddFlash2(Missile &missile, AddMissileParameter ¶meter); +void AddManashield(Missile &missile, AddMissileParameter ¶meter); +void AddFiremove(Missile &missile, AddMissileParameter ¶meter); /** * var1: Animation * var3: Light strength */ -void AddGuardian(Missile &missile, const AddMissileParameter ¶meter); +void AddGuardian(Missile &missile, AddMissileParameter ¶meter); /** * var1: X coordinate of the destination * var2: Y coordinate of the destination */ -void AddChain(Missile &missile, const AddMissileParameter ¶meter); -void AddRhino(Missile &missile, const AddMissileParameter ¶meter); +void AddChain(Missile &missile, AddMissileParameter ¶meter); +void AddRhino(Missile &missile, AddMissileParameter ¶meter); /** * var1: X coordinate of the missile-light * var2: Y coordinate of the missile-light */ -void AddFlare(Missile &missile, const AddMissileParameter ¶meter); +void AddFlare(Missile &missile, AddMissileParameter ¶meter); /** * var1: X coordinate of the missile-light * var2: Y coordinate of the missile-light */ -void AddAcid(Missile &missile, const AddMissileParameter ¶meter); -void AddAcidpud(Missile &missile, const AddMissileParameter ¶meter); +void AddAcid(Missile &missile, AddMissileParameter ¶meter); +void AddAcidpud(Missile &missile, AddMissileParameter ¶meter); /** * var1: mmode of the monster * var2: mnum of the monster */ -void AddStone(Missile &missile, const AddMissileParameter ¶meter); -void AddGolem(Missile &missile, const AddMissileParameter ¶meter); -void AddBoom(Missile &missile, const AddMissileParameter ¶meter); -void AddHeal(Missile &missile, const AddMissileParameter ¶meter); -void AddHealOther(Missile &missile, const AddMissileParameter ¶meter); +void AddStone(Missile &missile, AddMissileParameter ¶meter); +void AddGolem(Missile &missile, AddMissileParameter ¶meter); +void AddBoom(Missile &missile, AddMissileParameter ¶meter); +void AddHeal(Missile &missile, AddMissileParameter ¶meter); +void AddHealOther(Missile &missile, AddMissileParameter ¶meter); /** * var1: X coordinate of the missile-light @@ -344,8 +345,8 @@ void AddHealOther(Missile &missile, const AddMissileParameter ¶meter); * var4: X coordinate of the destination * var5: Y coordinate of the destination */ -void AddElement(Missile &missile, const AddMissileParameter ¶meter); -void AddIdentify(Missile &missile, const AddMissileParameter ¶meter); +void AddElement(Missile &missile, AddMissileParameter ¶meter); +void AddIdentify(Missile &missile, AddMissileParameter ¶meter); /** * var1: X coordinate of the first wave @@ -355,35 +356,35 @@ void AddIdentify(Missile &missile, const AddMissileParameter ¶meter); * var5: X coordinate of the second wave * var6: Y coordinate of the second wave */ -void AddFirewallC(Missile &missile, const AddMissileParameter ¶meter); -void AddInfra(Missile &missile, const AddMissileParameter ¶meter); +void AddFirewallC(Missile &missile, AddMissileParameter ¶meter); +void AddInfra(Missile &missile, AddMissileParameter ¶meter); /** * var1: X coordinate of the destination * var2: Y coordinate of the destination */ -void AddWave(Missile &missile, const AddMissileParameter ¶meter); -void AddNova(Missile &missile, const AddMissileParameter ¶meter); -void AddBlodboil(Missile &missile, const AddMissileParameter ¶meter); -void AddRepair(Missile &missile, const AddMissileParameter ¶meter); -void AddRecharge(Missile &missile, const AddMissileParameter ¶meter); -void AddDisarm(Missile &missile, const AddMissileParameter ¶meter); -void AddApoca(Missile &missile, const AddMissileParameter ¶meter); -void AddFlame(Missile &missile, const AddMissileParameter ¶meter); -void AddFlamec(Missile &missile, const AddMissileParameter ¶meter); +void AddWave(Missile &missile, AddMissileParameter ¶meter); +void AddNova(Missile &missile, AddMissileParameter ¶meter); +void AddBlodboil(Missile &missile, AddMissileParameter ¶meter); +void AddRepair(Missile &missile, AddMissileParameter ¶meter); +void AddRecharge(Missile &missile, AddMissileParameter ¶meter); +void AddDisarm(Missile &missile, AddMissileParameter ¶meter); +void AddApoca(Missile &missile, AddMissileParameter ¶meter); +void AddFlame(Missile &missile, AddMissileParameter ¶meter); +void AddFlamec(Missile &missile, AddMissileParameter ¶meter); /** * var1: Light strength * var2: Base direction */ -void AddCbolt(Missile &missile, const AddMissileParameter ¶meter); -void AddHbolt(Missile &missile, const AddMissileParameter ¶meter); -void AddResurrect(Missile &missile, const AddMissileParameter ¶meter); -void AddResurrectBeam(Missile &missile, const AddMissileParameter ¶meter); -void AddTelekinesis(Missile &missile, const AddMissileParameter ¶meter); -void AddBoneSpirit(Missile &missile, const AddMissileParameter ¶meter); -void AddRportal(Missile &missile, const AddMissileParameter ¶meter); -void AddDiabApoca(Missile &missile, const AddMissileParameter ¶meter); +void AddCbolt(Missile &missile, AddMissileParameter ¶meter); +void AddHbolt(Missile &missile, AddMissileParameter ¶meter); +void AddResurrect(Missile &missile, AddMissileParameter ¶meter); +void AddResurrectBeam(Missile &missile, AddMissileParameter ¶meter); +void AddTelekinesis(Missile &missile, AddMissileParameter ¶meter); +void AddBoneSpirit(Missile &missile, AddMissileParameter ¶meter); +void AddRportal(Missile &missile, AddMissileParameter ¶meter); +void AddDiabApoca(Missile &missile, AddMissileParameter ¶meter); Missile *AddMissile(Point src, Point dst, Direction midir, missile_id mitype, mienemy_type micaster, int id, int midam, int spllvl, Missile *pParent = nullptr); void MI_LArrow(Missile &missile); void MI_Arrow(Missile &missile); diff --git a/Source/spells.cpp b/Source/spells.cpp index 29c32769b..c0c623a0d 100644 --- a/Source/spells.cpp +++ b/Source/spells.cpp @@ -194,6 +194,12 @@ void ConsumeSpell(Player &player, spell_id sn) drawmanaflag = true; break; } + if (sn == SPL_FLARE) { + ApplyPlrDamage(player, 5); + } + if (sn == SPL_BONESPIRIT) { + ApplyPlrDamage(player, 6); + } } void EnsureValidReadiedSpell(Player &player) @@ -237,19 +243,20 @@ void CastSpell(int id, spell_id spl, int sx, int sy, int dx, int dy, int spllvl) dir = player.tempDirection; } + bool fizzled = false; for (int i = 0; i < 3 && spelldata[spl].sMissiles[i] != MIS_NULL; i++) { - AddMissile({ sx, sy }, { dx, dy }, dir, spelldata[spl].sMissiles[i], TARGET_MONSTERS, id, 0, spllvl); + Missile *missile = AddMissile({ sx, sy }, { dx, dy }, dir, spelldata[spl].sMissiles[i], TARGET_MONSTERS, id, 0, spllvl); + fizzled |= (missile == nullptr); } - - if (spl == SPL_TOWN) { - ConsumeSpell(player, SPL_TOWN); - } else if (spl == SPL_CBOLT) { - ConsumeSpell(player, SPL_CBOLT); - + if (spl == SPL_CBOLT) { for (int i = (spllvl / 2) + 3; i > 0; i--) { - AddMissile({ sx, sy }, { dx, dy }, dir, MIS_CBOLT, TARGET_MONSTERS, id, 0, spllvl); + Missile *missile = AddMissile({ sx, sy }, { dx, dy }, dir, MIS_CBOLT, TARGET_MONSTERS, id, 0, spllvl); + fizzled |= (missile == nullptr); } } + if (!fizzled) { + ConsumeSpell(player, spl); + } } void DoResurrect(size_t pnum, Player &target)