From b42b72221fbaca29aa987d54ea73b2cddefe86c0 Mon Sep 17 00:00:00 2001 From: obligaron Date: Tue, 5 Dec 2023 19:23:56 +0100 Subject: [PATCH] Use PlayerAtPosition at more places --- Source/missiles.cpp | 36 ++++++++++++++++-------------------- Source/missiles.h | 2 +- Source/monster.cpp | 23 +++++++++++------------ Source/objects.cpp | 10 ++++++---- Source/player.cpp | 13 +++++-------- Source/player.h | 2 +- 6 files changed, 40 insertions(+), 46 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index ce8d1b1bf..c7950a5ec 100644 --- a/Source/missiles.cpp +++ b/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; diff --git a/Source/missiles.h b/Source/missiles.h index 0040cec75..7ab4e9dee 100644 --- a/Source/missiles.h +++ b/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) diff --git a/Source/monster.cpp b/Source/monster.cpp index b44ece4db..7f8873eb8 100644 --- a/Source/monster.cpp +++ b/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; } diff --git a/Source/objects.cpp b/Source/objects.cpp index 5694f8c2d..b0f93c6bf 100644 --- a/Source/objects.cpp +++ b/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); diff --git a/Source/player.cpp b/Source/player.cpp index bd9571fbb..27bad6011 100644 --- a/Source/player.cpp +++ b/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) { diff --git a/Source/player.h b/Source/player.h index f98a72d98..51463cad2 100644 --- a/Source/player.h +++ b/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);