Browse Source

Move manashield and reflect logic out of AddMissile()

pull/2679/head
Anders Jenbo 5 years ago
parent
commit
7e5cbd573a
  1. 52
      Source/missiles.cpp

52
Source/missiles.cpp

@ -747,6 +747,21 @@ bool GrowWall(int playerId, Point position, Point target, missile_id type, int s
return true;
}
bool CanAddEffect(const PlayerStruct &player, missile_id type)
{
if (currlevel != player.plrlevel)
return false;
for (int i = 0; i < ActiveMissileCount; i++) {
int mi = ActiveMissiles[i];
auto &missile = Missiles[mi];
if (missile._mitype == type && &Players[missile._misource] == &player)
return false;
}
return true;
}
} // namespace
void GetDamageAmt(int i, int *mind, int *maxd)
@ -1339,6 +1354,10 @@ void AddReflection(MissileStruct &missile, Point /*dst*/, int /*midir*/)
return;
auto &player = Players[missile._misource];
if (player.wReflections > 0 && !CanAddEffect(player, MIS_REFLECT))
return;
int add = (missile._mispllvl != 0 ? missile._mispllvl : 2) * player._pLevel;
if (player.wReflections + add >= std::numeric_limits<uint16_t>::max())
add = 0;
@ -2204,6 +2223,12 @@ void AddFlash2(MissileStruct &missile, Point /*dst*/, int /*midir*/)
void AddManashield(MissileStruct &missile, Point /*dst*/, int /*midir*/)
{
auto &player = Players[missile._misource];
if (player.pManaShield && !CanAddEffect(player, MIS_MANASHIELD)) {
missile._miDelFlag = true;
return;
}
missile._mirange = 48 * player._pLevel;
if (missile._micaster == TARGET_MONSTERS)
UseMana(missile._misource, SPL_MANASHIELD);
@ -2775,7 +2800,7 @@ void AddResurrect(MissileStruct &missile, Point /*dst*/, int /*midir*/)
void AddResurrectBeam(MissileStruct &missile, Point dst, int /*midir*/)
{
missile.position.tile = dst;
missile.position.start = missile.position.tile;
missile.position.start = dst;
missile.position.velocity = { 0, 0 };
missile._mirange = MissileSpriteData[MFILE_RESSUR1].animLen[0];
}
@ -2832,36 +2857,11 @@ void AddDiabApoca(MissileStruct &missile, Point /*dst*/, int /*midir*/)
missile._miDelFlag = true;
}
namespace {
bool CanAddEffect(int playerId, missile_id type)
{
if (currlevel != Players[playerId].plrlevel)
return false;
for (int i = 0; i < ActiveMissileCount; i++) {
int mi = ActiveMissiles[i];
auto &missile = Missiles[mi];
if (missile._mitype == type && missile._misource == playerId)
return false;
}
return true;
}
} // namespace
int AddMissile(Point src, Point dst, int midir, missile_id mitype, mienemy_type micaster, int id, int midam, int spllvl)
{
if (ActiveMissileCount >= MAXMISSILES - 1)
return -1;
if (mitype == MIS_MANASHIELD && Players[id].pManaShield && !CanAddEffect(id, mitype))
return -1;
if (mitype == MIS_REFLECT && Players[id].wReflections > 0 && !CanAddEffect(id, mitype))
return -1;
int mi = AvailableMissiles[0];
auto &missile = Missiles[mi];

Loading…
Cancel
Save