Browse Source

Use PlayerAtPosition at more places

pull/6855/head
obligaron 2 years ago committed by Anders Jenbo
parent
commit
b42b72221f
  1. 36
      Source/missiles.cpp
  2. 2
      Source/missiles.h
  3. 23
      Source/monster.cpp
  4. 10
      Source/objects.cpp
  5. 13
      Source/player.cpp
  6. 2
      Source/player.h

36
Source/missiles.cpp

@ -202,7 +202,7 @@ int ProjectileTrapDamage(Missile &missile)
return currlevel + GenerateRnd(2 * currlevel);
}
bool MonsterMHit(int pnum, int monsterId, int mindam, int maxdam, int dist, MissileID t, DamageType damageType, bool shift)
bool MonsterMHit(const Player &player, int monsterId, int mindam, int maxdam, int dist, MissileID t, DamageType damageType, bool shift)
{
auto &monster = Monsters[monsterId];
@ -211,7 +211,6 @@ bool MonsterMHit(int pnum, int monsterId, int mindam, int maxdam, int dist, Miss
int hit = RandomIntLessThan(100);
int hper = 0;
const Player &player = Players[pnum];
const MissileData &missileData = GetMissileData(t);
if (missileData.isArrow()) {
hper = player.GetRangedPiercingToHit();
@ -422,7 +421,7 @@ void CheckMissileCol(Missile &missile, DamageType damageType, int minDamage, int
// then the missile can potentially hit this target
isMonsterHit = MonsterTrapHit(mid, minDamage, maxDamage, missile._midist, missile._mitype, damageType, isDamageShifted);
} else if (IsAnyOf(missile._micaster, TARGET_BOTH, TARGET_MONSTERS)) {
isMonsterHit = MonsterMHit(missile._misource, mid, minDamage, maxDamage, missile._midist, missile._mitype, damageType, isDamageShifted);
isMonsterHit = MonsterMHit(*missile.sourcePlayer(), mid, minDamage, maxDamage, missile._midist, missile._mitype, damageType, isDamageShifted);
}
}
@ -434,19 +433,19 @@ void CheckMissileCol(Missile &missile, DamageType damageType, int minDamage, int
bool isPlayerHit = false;
bool blocked = false;
const int8_t pid = dPlayer[mx][my];
if (pid > 0) {
Player *player = PlayerAtPosition({ mx, my }, true);
if (player != nullptr) {
if (missile._micaster != TARGET_BOTH && !missile.IsTrap()) {
if (missile._micaster == TARGET_MONSTERS) {
if ((pid - 1) != missile._misource)
isPlayerHit = Plr2PlrMHit(Players[missile._misource], Players[pid - 1], minDamage, maxDamage, missile._midist, missile._mitype, damageType, isDamageShifted, &blocked);
if (player->getId() != missile._misource)
isPlayerHit = Plr2PlrMHit(Players[missile._misource], *player, minDamage, maxDamage, missile._midist, missile._mitype, damageType, isDamageShifted, &blocked);
} else {
Monster &monster = Monsters[missile._misource];
isPlayerHit = PlayerMHit(pid - 1, &monster, missile._midist, minDamage, maxDamage, missile._mitype, damageType, isDamageShifted, DeathReason::MonsterOrTrap, &blocked);
isPlayerHit = PlayerMHit(*player, &monster, missile._midist, minDamage, maxDamage, missile._mitype, damageType, isDamageShifted, DeathReason::MonsterOrTrap, &blocked);
}
} else {
DeathReason deathReason = (!missile.IsTrap() && (missile._miAnimType == MissileGraphicID::FireWall || missile._miAnimType == MissileGraphicID::Lightning)) ? DeathReason::Player : DeathReason::MonsterOrTrap;
isPlayerHit = PlayerMHit(pid - 1, nullptr, missile._midist, minDamage, maxDamage, missile._mitype, damageType, isDamageShifted, deathReason, &blocked);
isPlayerHit = PlayerMHit(*player, nullptr, missile._midist, minDamage, maxDamage, missile._mitype, damageType, isDamageShifted, deathReason, &blocked);
}
}
@ -976,12 +975,10 @@ bool MonsterTrapHit(int monsterId, int mindam, int maxdam, int dist, MissileID t
return true;
}
bool PlayerMHit(int pnum, Monster *monster, int dist, int mind, int maxd, MissileID mtype, DamageType damageType, bool shift, DeathReason deathReason, bool *blocked)
bool PlayerMHit(Player &player, Monster *monster, int dist, int mind, int maxd, MissileID mtype, DamageType damageType, bool shift, DeathReason deathReason, bool *blocked)
{
*blocked = false;
Player &player = Players[pnum];
if (player._pHitPoints >> 6 <= 0) {
return false;
}
@ -1316,14 +1313,13 @@ void AddStealPotions(Missile &missile, AddMissileParameter & /*parameter*/)
Point target = missile.position.start + displacement;
if (!InDungeonBounds(target))
return false;
int8_t pnum = dPlayer[target.x][target.y];
if (pnum == 0)
Player *player = PlayerAtPosition(target);
if (player == nullptr)
return false;
Player &player = Players[std::abs(pnum) - 1];
bool hasPlayedSFX = false;
for (int si = 0; si < MaxBeltItems; si++) {
Item &beltItem = player.SpdList[si];
Item &beltItem = player->SpdList[si];
_item_indexes ii = IDI_NONE;
if (beltItem._itype == ItemType::Misc) {
if (FlipCoin())
@ -1334,7 +1330,7 @@ void AddStealPotions(Missile &missile, AddMissileParameter & /*parameter*/)
break;
case IMISC_HEAL:
case IMISC_MANA:
player.RemoveSpdBarItem(si);
player->RemoveSpdBarItem(si);
break;
case IMISC_FULLMANA:
ii = ItemMiscIdIdx(IMISC_MANA);
@ -3101,9 +3097,9 @@ void ProcessRune(Missile &missile)
{
Point position = missile.position.tile;
int mid = dMonster[position.x][position.y];
int pid = dPlayer[position.x][position.y];
if (mid != 0 || pid != 0) {
Point targetPosition = mid != 0 ? Monsters[std::abs(mid) - 1].position.tile : Players[std::abs(pid) - 1].position.tile;
Player *player = PlayerAtPosition(position);
if (mid != 0 || player != nullptr) {
Point targetPosition = mid != 0 ? Monsters[std::abs(mid) - 1].position.tile : player->position.tile;
Direction dir = GetDirection(position, targetPosition);
missile._miDelFlag = true;

2
Source/missiles.h

@ -205,7 +205,7 @@ DamageRange GetDamageAmt(SpellID spell, int spellLevel);
*/
Direction16 GetDirection16(Point p1, Point p2);
bool MonsterTrapHit(int monsterId, int mindam, int maxdam, int dist, MissileID t, DamageType damageType, bool shift);
bool PlayerMHit(int pnum, Monster *monster, int dist, int mind, int maxd, MissileID mtype, DamageType damageType, bool shift, DeathReason deathReason, bool *blocked);
bool PlayerMHit(Player &player, Monster *monster, int dist, int mind, int maxd, MissileID mtype, DamageType damageType, bool shift, DeathReason deathReason, bool *blocked);
/**
* @brief Could the missile collide with solid objects? (like walls or closed doors)

23
Source/monster.cpp

@ -4424,25 +4424,24 @@ void MissToMonst(Missile &missile, Point position)
return;
if ((monster.flags & MFLAG_TARGETS_MONSTER) == 0) {
if (dPlayer[oldPosition.x][oldPosition.y] <= 0)
Player *player = PlayerAtPosition(oldPosition, true);
if (player == nullptr)
return;
int pnum = dPlayer[oldPosition.x][oldPosition.y] - 1;
Player &player = Players[pnum];
MonsterAttackPlayer(monster, player, 500, monster.minDamageSpecial, monster.maxDamageSpecial);
MonsterAttackPlayer(monster, *player, 500, monster.minDamageSpecial, monster.maxDamageSpecial);
if (IsAnyOf(monster.type().type, MT_NSNAKE, MT_RSNAKE, MT_BSNAKE, MT_GSNAKE))
return;
if (player._pmode != PM_GOTHIT && player._pmode != PM_DEATH)
StartPlrHit(player, 0, true);
if (player->_pmode != PM_GOTHIT && player->_pmode != PM_DEATH)
StartPlrHit(*player, 0, true);
Point newPosition = oldPosition + monster.direction;
if (PosOkPlayer(player, newPosition)) {
player.position.tile = newPosition;
FixPlayerLocation(player, player._pdir);
FixPlrWalkTags(player);
player.occupyTile(newPosition, false);
SetPlayerOld(player);
if (PosOkPlayer(*player, newPosition)) {
player->position.tile = newPosition;
FixPlayerLocation(*player, player->_pdir);
FixPlrWalkTags(*player);
player->occupyTile(newPosition, false);
SetPlayerOld(*player);
}
return;
}

10
Source/objects.cpp

@ -1613,9 +1613,10 @@ void UpdateFlameTrap(Object &trap)
constexpr MissileID TrapMissile = MissileID::FireWallControl;
if (dMonster[x][y] > 0)
MonsterTrapHit(dMonster[x][y] - 1, mindam / 2, maxdam / 2, 0, TrapMissile, GetMissileData(TrapMissile).damageType(), false);
if (dPlayer[x][y] > 0) {
Player *player = PlayerAtPosition({ x, y }, true);
if (player != nullptr) {
bool unused;
PlayerMHit(dPlayer[x][y] - 1, nullptr, 0, mindam, maxdam, TrapMissile, GetMissileData(TrapMissile).damageType(), false, DeathReason::MonsterOrTrap, &unused);
PlayerMHit(*player, nullptr, 0, mindam, maxdam, TrapMissile, GetMissileData(TrapMissile).damageType(), false, DeathReason::MonsterOrTrap, &unused);
}
if (trap._oAnimFrame == trap._oAnimLen)
@ -3473,9 +3474,10 @@ void BreakBarrel(const Player &player, Object &barrel, bool forcebreak, bool sen
if (dMonster[xp][yp] > 0) {
MonsterTrapHit(dMonster[xp][yp] - 1, 1, 4, 0, TrapMissile, GetMissileData(TrapMissile).damageType(), false);
}
if (dPlayer[xp][yp] > 0) {
Player *adjacentPlayer = PlayerAtPosition({ xp, yp }, true);
if (adjacentPlayer != nullptr) {
bool unused;
PlayerMHit(dPlayer[xp][yp] - 1, nullptr, 0, 8, 16, TrapMissile, GetMissileData(TrapMissile).damageType(), false, DeathReason::MonsterOrTrap, &unused);
PlayerMHit(*adjacentPlayer, nullptr, 0, 8, 16, TrapMissile, GetMissileData(TrapMissile).damageType(), false, DeathReason::MonsterOrTrap, &unused);
}
// don't really need to exclude large objects as explosive barrels are single tile objects, but using considerLargeObjects == false as this matches the old logic.
Object *adjacentObject = FindObjectAtPosition({ xp, yp }, false);

13
Source/player.cpp

@ -2075,13 +2075,13 @@ void Player::occupyTile(Point position, bool isMoving) const
dPlayer[position.x][position.y] = isMoving ? -id : id;
}
Player *PlayerAtPosition(Point position)
Player *PlayerAtPosition(Point position, bool ignoreMovingPlayers /*= false*/)
{
if (!InDungeonBounds(position))
return nullptr;
auto playerIndex = dPlayer[position.x][position.y];
if (playerIndex == 0)
if (playerIndex == 0 || (ignoreMovingPlayers && playerIndex < 0))
return nullptr;
return &Players[std::abs(playerIndex) - 1];
@ -3079,12 +3079,9 @@ bool PosOkPlayer(const Player &player, Point position)
return false;
if (!IsTileWalkable(position))
return false;
if (dPlayer[position.x][position.y] != 0) {
auto &otherPlayer = Players[std::abs(dPlayer[position.x][position.y]) - 1];
if (&otherPlayer != &player && otherPlayer._pHitPoints != 0) {
return false;
}
}
Player *otherPlayer = PlayerAtPosition(position);
if (otherPlayer != nullptr && otherPlayer != &player && otherPlayer->_pHitPoints != 0)
return false;
if (dMonster[position.x][position.y] != 0) {
if (leveltype == DTYPE_TOWN) {

2
Source/player.h

@ -905,7 +905,7 @@ inline bool IsInspectingPlayer()
}
extern bool MyPlayerIsDead;
Player *PlayerAtPosition(Point position);
Player *PlayerAtPosition(Point position, bool ignoreMovingPlayers = false);
void LoadPlrGFX(Player &player, player_graphic graphic);
void InitPlayerGFX(Player &player);

Loading…
Cancel
Save