diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 7ce6fbd3e..977570ad9 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -2932,40 +2932,35 @@ void AddDiabApoca(int mi, Point src, Point /*dst*/, int /*midir*/, int8_t mienem missile._miDelFlag = true; } +namespace { + +bool CanAddEffect(int playerId, int 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, int mitype, int8_t micaster, int id, int midam, int spllvl) { if (ActiveMissileCount >= MAXMISSILES - 1) return -1; - if (mitype == MIS_MANASHIELD) { - auto &player = Players[id]; - if (player.pManaShield) { - if (currlevel != player.plrlevel) - return -1; - - for (int i = 0; i < ActiveMissileCount; i++) { - int mi = ActiveMissiles[i]; - auto &missile = Missiles[mi]; - if (missile._mitype == MIS_MANASHIELD && missile._misource == id) - return -1; - } - } - } + if (mitype == MIS_MANASHIELD && Players[id].pManaShield && !CanAddEffect(id, mitype)) + return -1; - if (mitype == MIS_REFLECT) { - auto &player = Players[id]; - if (player.wReflections) { - if (currlevel != player.plrlevel) - return -1; - - for (int i = 0; i < ActiveMissileCount; i++) { - int mi = ActiveMissiles[i]; - auto &missile = Missiles[mi]; - if (missile._mitype == MIS_REFLECT && missile._misource == id) - return -1; - } - } - } + if (mitype == MIS_REFLECT && Players[id].wReflections > 0 && !CanAddEffect(id, mitype)) + return -1; int mi = AvailableMissiles[0]; auto &missile = Missiles[mi]; @@ -4685,10 +4680,11 @@ void missiles_process_charge() } } -void ClearMissileSpot(Point &missileTile) +void ClearMissileSpot(const MissileStruct &missile) { - dFlags[missileTile.x][missileTile.y] &= ~BFLAG_MISSILE; - dMissile[missileTile.x][missileTile.y] = 0; + const Point tile = missile.position.tile; + dFlags[tile.x][tile.y] &= ~BFLAG_MISSILE; + dMissile[tile.x][tile.y] = 0; } } // namespace devilution diff --git a/Source/missiles.h b/Source/missiles.h index c5f160946..174ab3988 100644 --- a/Source/missiles.h +++ b/Source/missiles.h @@ -268,6 +268,6 @@ void MI_ResurrectBeam(int i); void MI_Rportal(int i); void ProcessMissiles(); void missiles_process_charge(); -void ClearMissileSpot(Point &missileTile); +void ClearMissileSpot(const MissileStruct &missile); } // namespace devilution diff --git a/Source/msg.cpp b/Source/msg.cpp index 1e0a63270..a0cec1745 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -1753,14 +1753,14 @@ DWORD OnRemoveShield(TCmd *pCmd, PlayerStruct &player) return sizeof(*pCmd); } -DWORD OnEndShield(TCmd *pCmd, int pnum) +DWORD EndEffect(TCmd *pCmd, int pnum, missile_id type) { if (gbBufferMsgs != 1 && pnum != MyPlayerId && currlevel == Players[pnum].plrlevel) { for (int i = 0; i < ActiveMissileCount; i++) { int mi = ActiveMissiles[i]; auto &missile = Missiles[mi]; - if (missile._mitype == MIS_MANASHIELD && missile._misource == pnum) { - ClearMissileSpot(missile.position.tile); + if (missile._mitype == type && missile._misource == pnum) { + ClearMissileSpot(missile); DeleteMissile(mi, i); } } @@ -1769,6 +1769,11 @@ DWORD OnEndShield(TCmd *pCmd, int pnum) return sizeof(*pCmd); } +DWORD OnEndShield(TCmd *pCmd, int pnum) +{ + return EndEffect(pCmd, pnum, MIS_MANASHIELD); +} + DWORD OnSetReflect(TCmd *pCmd, PlayerStruct &player) { auto *p = (TCmdParam1 *)pCmd; @@ -1788,18 +1793,7 @@ DWORD OnRemoveReflect(TCmd *pCmd, PlayerStruct &player) DWORD OnEndReflect(TCmd *pCmd, int pnum) { - if (gbBufferMsgs != 1 && pnum != MyPlayerId && currlevel == Players[pnum].plrlevel) { - for (int i = 0; i < ActiveMissileCount; i++) { - int mi = ActiveMissiles[i]; - auto &missile = Missiles[mi]; - if (missile._mitype == MIS_REFLECT && missile._misource == pnum) { - ClearMissileSpot(missile.position.tile); - DeleteMissile(mi, i); - } - } - } - - return sizeof(*pCmd); + return EndEffect(pCmd, pnum, MIS_REFLECT); } DWORD OnNakrul(TCmd *pCmd) diff --git a/Source/player.cpp b/Source/player.cpp index b874afb7a..a4aa83ec2 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -3221,16 +3221,8 @@ void RemovePlrMissiles(int pnum) if (missile._mitype == MIS_STONE && missile._misource == pnum) { Monsters[missile._miVar2]._mmode = (MON_MODE)missile._miVar1; } - if (missile._mitype == MIS_MANASHIELD && missile._misource == pnum) { - ClearMissileSpot(missile.position.tile); - DeleteMissile(am, i); - } - if (missile._mitype == MIS_REFLECT && missile._misource == pnum) { - ClearMissileSpot(missile.position.tile); - DeleteMissile(am, i); - } - if (missile._mitype == MIS_ETHEREALIZE && missile._misource == pnum) { - ClearMissileSpot(missile.position.tile); + if (IsAnyOf(missile._mitype, MIS_MANASHIELD, MIS_REFLECT) && missile._misource == pnum) { + ClearMissileSpot(missile); DeleteMissile(am, i); } }