Browse Source

Deduplicate manashild/reflect code

pull/2661/head
Anders Jenbo 5 years ago
parent
commit
d4bd409472
  1. 58
      Source/missiles.cpp
  2. 2
      Source/missiles.h
  3. 24
      Source/msg.cpp
  4. 12
      Source/player.cpp

58
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

2
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

24
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)

12
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);
}
}

Loading…
Cancel
Save