Browse Source

♻️ Adds Missile::SourcePlayer and Missile::SourceMonster (#4999)

dyn-players
Cesar Canassa 4 years ago committed by GitHub
parent
commit
aa6ea3907e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 25
      Source/missiles.cpp
  2. 29
      Source/missiles.h
  3. 10
      Source/objects.cpp

25
Source/missiles.cpp

@ -1883,19 +1883,22 @@ void AddTown(Missile &missile, const AddMissileParameter &parameter)
void AddFlash(Missile &missile, const AddMissileParameter & /*parameter*/)
{
if (!missile.IsTrap()) {
if (missile._micaster == TARGET_MONSTERS) {
Player &player = Players[missile._misource];
int dmg = GenerateRndSum(20, player._pLevel + 1) + player._pLevel + 1;
missile._midam = ScaleSpellEffect(dmg, missile._mispllvl);
missile._midam += missile._midam / 2;
UseMana(player, SPL_FLASH);
} else {
missile._midam = Monsters[missile._misource].level * 2;
}
} else {
switch (missile.sourceType()) {
case MissileSource::Player: {
Player *player = missile.sourcePlayer();
int dmg = GenerateRndSum(20, player->_pLevel + 1) + player->_pLevel + 1;
missile._midam = ScaleSpellEffect(dmg, missile._mispllvl);
missile._midam += missile._midam / 2;
UseMana(*player, SPL_FLASH);
} break;
case MissileSource::Monster:
missile._midam = missile.sourceMonster()->level * 2;
break;
case MissileSource::Trap:
missile._midam = currlevel / 2;
break;
}
missile._mirange = 19;
}

29
Source/missiles.h

@ -85,6 +85,12 @@ enum class Direction16 {
South_SouthEast,
};
enum class MissileSource {
Player,
Monster,
Trap,
};
struct Missile {
/** Type of projectile */
missile_id _mitype;
@ -132,6 +138,29 @@ struct Missile {
{
return _misource == -1;
}
[[nodiscard]] Player *sourcePlayer()
{
if (IsNoneOf(_micaster, TARGET_BOTH, TARGET_MONSTERS) || _misource == -1)
return nullptr;
return &Players[_misource];
}
[[nodiscard]] Monster *sourceMonster()
{
if (_micaster != TARGET_PLAYERS || _misource == -1)
return nullptr;
return &Monsters[_misource];
}
MissileSource sourceType()
{
if (_misource == -1)
return MissileSource::Trap;
if (_micaster == TARGET_PLAYERS)
return MissileSource::Monster;
return MissileSource::Player;
}
};
extern std::list<Missile> Missiles;

10
Source/objects.cpp

@ -2714,7 +2714,7 @@ void OperateShrineMagical(int pnum)
player.position.tile,
player._pdir,
MIS_MANASHIELD,
TARGET_PLAYERS,
TARGET_MONSTERS,
pnum,
0,
2 * leveltype);
@ -2848,7 +2848,7 @@ void OperateShrineCryptic(int pnum)
player.position.tile,
player._pdir,
MIS_NOVA,
TARGET_PLAYERS,
TARGET_MONSTERS,
pnum,
0,
2 * leveltype);
@ -2936,7 +2936,7 @@ void OperateShrineHoly(int pnum)
{
const Player &player = Players[pnum];
AddMissile(player.position.tile, { 0, 0 }, Direction::South, MIS_RNDTELEPORT, TARGET_PLAYERS, pnum, 0, 2 * leveltype);
AddMissile(player.position.tile, { 0, 0 }, Direction::South, MIS_RNDTELEPORT, TARGET_MONSTERS, pnum, 0, 2 * leveltype);
if (&player != MyPlayer)
return;
@ -3207,7 +3207,7 @@ void OperateShrineTown(int pnum, Point spawnPosition)
player.position.tile,
player._pdir,
MIS_TOWN,
TARGET_PLAYERS,
TARGET_MONSTERS,
pnum,
0,
0);
@ -3570,7 +3570,7 @@ bool OperateFountains(int pnum, int i)
player.position.tile,
player._pdir,
MIS_INFRA,
TARGET_PLAYERS,
TARGET_MONSTERS,
pnum,
0,
2 * leveltype);

Loading…
Cancel
Save