From 7e8173e6ff080265de744169f6fd04483e262837 Mon Sep 17 00:00:00 2001 From: Eric Robinson <68359262+kphoenix137@users.noreply.github.com> Date: Wed, 3 Dec 2025 00:12:42 -0500 Subject: [PATCH] Add Player hasNoLife helper (#8302) --- Source/control.cpp | 4 ++-- Source/controls/plrctrls.cpp | 4 ++-- Source/cursor.cpp | 6 +++--- Source/engine/render/scrollrt.cpp | 2 +- Source/inv.cpp | 2 +- Source/items.cpp | 2 +- Source/missiles.cpp | 8 ++++---- Source/monster.cpp | 8 ++++---- Source/msg.cpp | 4 ++-- Source/multi.cpp | 4 ++-- Source/objects.cpp | 2 +- Source/player.cpp | 26 +++++++++++++------------- Source/player.h | 5 +++++ Source/qol/stash.cpp | 4 ++-- Source/spells.cpp | 4 ++-- Source/track.cpp | 2 +- 16 files changed, 46 insertions(+), 41 deletions(-) diff --git a/Source/control.cpp b/Source/control.cpp index 3f4be9c57..f082171e1 100644 --- a/Source/control.cpp +++ b/Source/control.cpp @@ -1466,7 +1466,7 @@ void CheckMainPanelButtonUp() NetSendCmd(true, CMD_RETOWN); } break; - } else if (MyPlayer->_pHitPoints == 0) { + } else if (MyPlayer->hasNoLife()) { break; } qtextflag = false; @@ -1808,7 +1808,7 @@ void control_drop_gold(SDL_Keycode vkey) { Player &myPlayer = *MyPlayer; - if (myPlayer._pHitPoints >> 6 <= 0) { + if (myPlayer.hasNoLife()) { CloseGoldDrop(); return; } diff --git a/Source/controls/plrctrls.cpp b/Source/controls/plrctrls.cpp index 818091665..546dd3d23 100644 --- a/Source/controls/plrctrls.cpp +++ b/Source/controls/plrctrls.cpp @@ -76,7 +76,7 @@ bool InGameMenu() || qtextflag || gmenu_is_active() || PauseMode == 2 - || (MyPlayer != nullptr && MyPlayer->_pInvincible && MyPlayer->_pHitPoints == 0); + || (MyPlayer != nullptr && MyPlayer->_pInvincible && MyPlayer->hasNoLife()); } namespace { @@ -395,7 +395,7 @@ void CheckPlayerNearby() const int my = player.position.future.y; if (dPlayer[mx][my] == 0 || !IsTileLit(player.position.future) - || (player._pHitPoints == 0 && spl != SpellID::Resurrect)) + || (player.hasNoLife() && spl != SpellID::Resurrect)) continue; if (myPlayer.UsesRangedWeapon() || HasRangedSpell() || spl == SpellID::HealOther) { diff --git a/Source/cursor.cpp b/Source/cursor.cpp index cf24a7bcb..428e982a0 100644 --- a/Source/cursor.cpp +++ b/Source/cursor.cpp @@ -130,7 +130,7 @@ bool TrySelectPlayer(bool flipflag, const Point tile) if (!flipflag && tile.x + 1 < MAXDUNX && dPlayer[tile.x + 1][tile.y] != 0) { const uint8_t playerId = std::abs(dPlayer[tile.x + 1][tile.y]) - 1; Player &player = Players[playerId]; - if (&player != MyPlayer && player._pHitPoints != 0) { + if (&player != MyPlayer && !player.hasNoLife()) { cursPosition = tile + Displacement { 1, 0 }; PlayerUnderCursor = &player; } @@ -138,7 +138,7 @@ bool TrySelectPlayer(bool flipflag, const Point tile) if (flipflag && tile.y + 1 < MAXDUNY && dPlayer[tile.x][tile.y + 1] != 0) { const uint8_t playerId = std::abs(dPlayer[tile.x][tile.y + 1]) - 1; Player &player = Players[playerId]; - if (&player != MyPlayer && player._pHitPoints != 0) { + if (&player != MyPlayer && !player.hasNoLife()) { cursPosition = tile + Displacement { 0, 1 }; PlayerUnderCursor = &player; } @@ -176,7 +176,7 @@ bool TrySelectPlayer(bool flipflag, const Point tile) if (tile.x + 1 < MAXDUNX && tile.y + 1 < MAXDUNY && dPlayer[tile.x + 1][tile.y + 1] != 0) { const uint8_t playerId = std::abs(dPlayer[tile.x + 1][tile.y + 1]) - 1; const Player &player = Players[playerId]; - if (&player != MyPlayer && player._pHitPoints != 0) { + if (&player != MyPlayer && !player.hasNoLife()) { cursPosition = tile + Displacement { 1, 1 }; PlayerUnderCursor = &player; } diff --git a/Source/engine/render/scrollrt.cpp b/Source/engine/render/scrollrt.cpp index fb413e6fa..c12cc0e3e 100644 --- a/Source/engine/render/scrollrt.cpp +++ b/Source/engine/render/scrollrt.cpp @@ -477,7 +477,7 @@ void DrawDeadPlayer(const Surface &out, Point tilePosition, Point targetBufferPo dFlags[tilePosition.x][tilePosition.y] &= ~DungeonFlag::DeadPlayer; for (const Player &player : Players) { - if (player.plractive && player._pHitPoints == 0 && player.isOnActiveLevel() && player.position.tile == tilePosition) { + if (player.plractive && player.hasNoLife() && player.isOnActiveLevel() && player.position.tile == tilePosition) { dFlags[tilePosition.x][tilePosition.y] |= DungeonFlag::DeadPlayer; const Point playerRenderPosition { targetBufferPosition }; DrawPlayer(out, player, tilePosition, playerRenderPosition, lightTableIndex); diff --git a/Source/inv.cpp b/Source/inv.cpp index 16411dfae..fc97994c9 100644 --- a/Source/inv.cpp +++ b/Source/inv.cpp @@ -2076,7 +2076,7 @@ bool UseInvItem(int cii) Player &player = *MyPlayer; - if (player._pInvincible && player._pHitPoints == 0 && &player == MyPlayer) + if (player._pInvincible && player.hasNoLife() && &player == MyPlayer) return true; if (pcurs != CURSOR_HAND) return true; diff --git a/Source/items.cpp b/Source/items.cpp index 228105545..d71d815a2 100644 --- a/Source/items.cpp +++ b/Source/items.cpp @@ -2645,7 +2645,7 @@ void CalcPlrLifeMana(Player &player, int vitality, int magic, int life, int mana player._pMaxHP = std::clamp(life + player._pMaxHPBase, 1 << 6, 2000 << 6); player._pHitPoints = std::min(life + player._pHPBase, player._pMaxHP); - if (&player == MyPlayer && (player._pHitPoints >> 6) <= 0) { + if (&player == MyPlayer && player.hasNoLife()) { SetPlayerHitPoints(player, 0); } diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 834e6de91..788bf4947 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -1067,7 +1067,7 @@ bool PlayerMHit(Player &player, Monster *monster, int dist, int mind, int maxd, { *blocked = false; - if (player._pHitPoints >> 6 <= 0) { + if (player.hasNoLife()) { return false; } @@ -1184,7 +1184,7 @@ bool PlayerMHit(Player &player, Monster *monster, int dist, int mind, int maxd, ApplyPlrDamage(damageType, player, 0, 0, dam, deathReason); } - if (player._pHitPoints >> 6 > 0) { + if (!player.hasNoLife()) { player.Say(HeroSpeech::ArghClang); } return true; @@ -1194,7 +1194,7 @@ bool PlayerMHit(Player &player, Monster *monster, int dist, int mind, int maxd, ApplyPlrDamage(damageType, player, 0, 0, dam, deathReason); } - if (player._pHitPoints >> 6 > 0) { + if (!player.hasNoLife()) { StartPlrHit(player, dam, false); } @@ -3932,7 +3932,7 @@ void ProcessRage(Missile &missile) CalcPlrItemVals(player, true); // Prevent the player from dying as a result of recalculating their current life - if ((player._pHitPoints >> 6) <= 0) + if (player.hasNoLife()) SetPlayerHitPoints(player, 64); RedrawEverything(); diff --git a/Source/monster.cpp b/Source/monster.cpp index 568ed36d6..c71fcfdbf 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -682,7 +682,7 @@ void UpdateEnemy(Monster &monster) for (size_t pnum = 0; pnum < Players.size(); pnum++) { const Player &player = Players[pnum]; if (!player.plractive || !player.isOnActiveLevel() || player._pLvlChanging - || (((player._pHitPoints >> 6) == 0) && gbIsMultiplayer)) + || (player.hasNoLife() && gbIsMultiplayer)) continue; const bool sameroom = (dTransVal[position.x][position.y] == dTransVal[player.position.tile.x][player.position.tile.y]); const int dist = position.WalkingDistance(player.position.tile); @@ -1167,7 +1167,7 @@ int GetMinHit() void MonsterAttackPlayer(Monster &monster, Player &player, int hit, int minDam, int maxDam) { - if (player._pHitPoints >> 6 <= 0 || player._pInvincible || HasAnyOf(player._pSpellFlags, SpellFlag::Etherealize)) + if (player.hasNoLife() || player._pInvincible || HasAnyOf(player._pSpellFlags, SpellFlag::Etherealize)) return; if (monster.position.tile.WalkingDistance(player.position.tile) >= 2) return; @@ -1238,7 +1238,7 @@ void MonsterAttackPlayer(Monster &monster, Player &player, int hit, int minDam, if ((monster.flags & MFLAG_NOLIFESTEAL) == 0 && monster.type().type == MT_SKING && gbIsMultiplayer) monster.hitPoints += dam; - if (player._pHitPoints >> 6 <= 0) { + if (player.hasNoLife()) { if (gbIsHellfire) M_StartStand(monster, monster.direction); return; @@ -4006,7 +4006,7 @@ void PrepDoEnding() player._pmode = PM_QUIT; player._pInvincible = true; if (gbIsMultiplayer) { - if (player._pHitPoints >> 6 == 0) + if (player.hasNoLife()) player._pHitPoints = 64; if (player._pMana >> 6 == 0) player._pMana = 64; diff --git a/Source/msg.cpp b/Source/msg.cpp index cd6c3167b..7d21a4d9e 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -2076,7 +2076,7 @@ size_t OnPlayerDamage(const TCmdDamage &message, Player &player) Player &target = Players[message.bPlr]; if (&target == MyPlayer && leveltype != DTYPE_TOWN && gbBufferMsgs != 1) { - if (player.isOnActiveLevel() && damage <= 192000 && target._pHitPoints >> 6 > 0) { + if (player.isOnActiveLevel() && damage <= 192000 && !target.hasNoLife()) { ApplyPlrDamage(message.damageType, target, 0, 0, static_cast(damage), DeathReason::Player); } } @@ -2308,7 +2308,7 @@ size_t OnPlayerJoinLevel(const TCmdLocParam2 &message, Player &player) ResetPlayerGFX(player); if (player.isOnActiveLevel()) { SyncInitPlr(player); - if ((player._pHitPoints >> 6) > 0) { + if (!player.hasNoLife()) { StartStand(player, Direction::South); } else { player._pgfxnum &= ~0xFU; diff --git a/Source/multi.cpp b/Source/multi.cpp index 192c36d03..84a6e7fda 100644 --- a/Source/multi.cpp +++ b/Source/multi.cpp @@ -724,7 +724,7 @@ void ProcessGameMessagePackets() player._pBaseStr = pkt->bstr; player._pBaseMag = pkt->bmag; player._pBaseDex = pkt->bdex; - if (!cond && player.plractive && player._pHitPoints != 0) { + if (!cond && player.plractive && !player.hasNoLife()) { if (player.isOnActiveLevel() && !player._pLvlChanging) { if (player.position.tile.WalkingDistance(syncPosition) > 3 && PosOkPlayer(player, syncPosition)) { // got out of sync, clear the tiles around where we last thought the player was located @@ -948,7 +948,7 @@ void recv_plrinfo(Player &player, const TCmdPlrInfoHdr &header, bool recv) return; } - if (player._pHitPoints >> 6 > 0) { + if (!player.hasNoLife()) { StartStand(player, Direction::South); return; } diff --git a/Source/objects.cpp b/Source/objects.cpp index e8afa3745..7f1012c88 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -1658,7 +1658,7 @@ void UpdateBurningCrossDamage(Object &cross) return; ApplyPlrDamage(DamageType::Fire, myPlayer, 0, 0, damage[leveltype - 1]); - if (myPlayer._pHitPoints >> 6 > 0) { + if (!myPlayer.hasNoLife()) { myPlayer.Say(HeroSpeech::Argh); } } diff --git a/Source/player.cpp b/Source/player.cpp index 23688db7c..a234a1f4d 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -156,7 +156,7 @@ void StartWalkAnimation(Player &player, Direction dir, bool pmWillBeCalled) */ void StartWalk(Player &player, Direction dir, bool pmWillBeCalled) { - if (player._pInvincible && player._pHitPoints == 0 && &player == MyPlayer) { + if (player._pInvincible && player.hasNoLife() && &player == MyPlayer) { SyncPlrKill(player, DeathReason::Unknown); return; } @@ -174,7 +174,7 @@ void ClearStateVariables(Player &player) void StartAttack(Player &player, Direction d, bool includesFirstFrame) { - if (player._pInvincible && player._pHitPoints == 0 && &player == MyPlayer) { + if (player._pInvincible && player.hasNoLife() && &player == MyPlayer) { SyncPlrKill(player, DeathReason::Unknown); return; } @@ -206,7 +206,7 @@ void StartAttack(Player &player, Direction d, bool includesFirstFrame) void StartRangeAttack(Player &player, Direction d, WorldTileCoord cx, WorldTileCoord cy, bool includesFirstFrame) { - if (player._pInvincible && player._pHitPoints == 0 && &player == MyPlayer) { + if (player._pInvincible && player.hasNoLife() && &player == MyPlayer) { SyncPlrKill(player, DeathReason::Unknown); return; } @@ -248,7 +248,7 @@ player_graphic GetPlayerGraphicForSpell(SpellID spellId) void StartSpell(Player &player, Direction d, WorldTileCoord cx, WorldTileCoord cy) { - if (player._pInvincible && player._pHitPoints == 0 && &player == MyPlayer) { + if (player._pInvincible && player.hasNoLife() && &player == MyPlayer) { SyncPlrKill(player, DeathReason::Unknown); return; } @@ -1117,7 +1117,7 @@ void CheckNewPath(Player &player, bool pmWillBeCalled) case ACTION_RATTACKPLR: case ACTION_SPELLPLR: target = &Players[targetId]; - if ((target->_pHitPoints >> 6) <= 0) { + if (!target->hasNoLife()) { player.Stop(); return; } @@ -2187,7 +2187,7 @@ void InitPlayerGFX(Player &player) ResetPlayerGFX(player); - if (player._pHitPoints >> 6 == 0) { + if (player.hasNoLife()) { player._pgfxnum &= ~0xFU; LoadPlrGFX(player, player_graphic::Death); return; @@ -2501,7 +2501,7 @@ void InitPlayer(Player &player, bool firstTime) ClearStateVariables(player); - if (player._pHitPoints >> 6 > 0) { + if (!player.hasNoLife()) { player._pmode = PM_STAND; NewPlrAnim(player, player_graphic::Stand, Direction::South); player.AnimInfo.currentFrame = GenerateRnd(player._pNFrames - 1); @@ -2590,7 +2590,7 @@ void FixPlayerLocation(Player &player, Direction bDir) void StartStand(Player &player, Direction dir) { - if (player._pInvincible && player._pHitPoints == 0 && &player == MyPlayer) { + if (player._pInvincible && player.hasNoLife() && &player == MyPlayer) { SyncPlrKill(player, DeathReason::Unknown); return; } @@ -2605,7 +2605,7 @@ void StartStand(Player &player, Direction dir) void StartPlrBlock(Player &player, Direction dir) { - if (player._pInvincible && player._pHitPoints == 0 && &player == MyPlayer) { + if (player._pInvincible && player.hasNoLife() && &player == MyPlayer) { SyncPlrKill(player, DeathReason::Unknown); return; } @@ -2639,7 +2639,7 @@ void FixPlrWalkTags(const Player &player) void StartPlrHit(Player &player, int dam, bool forcehit) { - if (player._pInvincible && player._pHitPoints == 0 && &player == MyPlayer) { + if (player._pInvincible && player.hasNoLife() && &player == MyPlayer) { SyncPlrKill(player, DeathReason::Unknown); return; } @@ -2866,7 +2866,7 @@ void ApplyPlrDamage(DamageType damageType, Player &player, int dam, int minHP /* if (player._pHitPoints < minHitPoints) { SetPlayerHitPoints(player, minHitPoints); } - if (player._pHitPoints >> 6 <= 0) { + if (player.hasNoLife()) { SyncPlrKill(player, deathReason); } } @@ -3024,7 +3024,7 @@ void ProcessPlayers() for (size_t pnum = 0; pnum < Players.size(); pnum++) { Player &player = Players[pnum]; if (player.plractive && player.isOnActiveLevel() && (&player == MyPlayer || !player._pLvlChanging)) { - if (!PlrDeathModeOK(player) && (player._pHitPoints >> 6) <= 0) { + if (!PlrDeathModeOK(player) && player.hasNoLife()) { SyncPlrKill(player, DeathReason::Unknown); } @@ -3100,7 +3100,7 @@ bool PosOkPlayer(const Player &player, Point position) if (!IsTileWalkable(position)) return false; Player *otherPlayer = PlayerAtPosition(position); - if (otherPlayer != nullptr && otherPlayer != &player && otherPlayer->_pHitPoints != 0) + if (otherPlayer != nullptr && otherPlayer != &player && !otherPlayer->hasNoLife()) return false; if (dMonster[position.x][position.y] != 0) { diff --git a/Source/player.h b/Source/player.h index 597109349..e60868256 100644 --- a/Source/player.h +++ b/Source/player.h @@ -900,6 +900,11 @@ public: return (type == leftHandItem._itype && leftHandItem._iStatFlag) || (type == rightHandItem._itype && rightHandItem._iStatFlag); } + + bool hasNoLife() const + { + return leveltype == DTYPE_TOWN ? false : _pHitPoints >> 6 <= 0; + } }; extern DVL_API_FOR_TEST uint8_t MyPlayerId; diff --git a/Source/qol/stash.cpp b/Source/qol/stash.cpp index 42eaae6fc..0511675e1 100644 --- a/Source/qol/stash.cpp +++ b/Source/qol/stash.cpp @@ -464,7 +464,7 @@ uint16_t CheckStashHLight(Point mousePosition) bool UseStashItem(uint16_t c) { - if (MyPlayer->_pInvincible && MyPlayer->_pHitPoints == 0) + if (MyPlayer->_pInvincible && MyPlayer->hasNoLife()) return true; if (pcurs != CURSOR_HAND) return true; @@ -617,7 +617,7 @@ void WithdrawGoldKeyPress(SDL_Keycode vkey) { Player &myPlayer = *MyPlayer; - if (myPlayer._pHitPoints >> 6 <= 0) { + if (myPlayer.hasNoLife()) { CloseGoldWithdraw(); return; } diff --git a/Source/spells.cpp b/Source/spells.cpp index c8031da38..06e4ec23a 100644 --- a/Source/spells.cpp +++ b/Source/spells.cpp @@ -236,7 +236,7 @@ void DoResurrect(Player &player, Player &target) { AddMissile(target.position.tile, target.position.tile, Direction::South, MissileID::ResurrectBeam, TARGET_MONSTERS, player, 0, 0); - if (target._pHitPoints != 0) + if (!target.hasNoLife()) return; if (&target == MyPlayer) { @@ -272,7 +272,7 @@ void DoResurrect(Player &player, Player &target) void DoHealOther(const Player &caster, Player &target) { - if ((target._pHitPoints >> 6) <= 0) { + if (target.hasNoLife()) { return; } diff --git a/Source/track.cpp b/Source/track.cpp index 5804ed136..d2f9bfe17 100644 --- a/Source/track.cpp +++ b/Source/track.cpp @@ -51,7 +51,7 @@ void InvalidateTargets() if (PlayerUnderCursor != nullptr) { const Player &targetPlayer = *PlayerUnderCursor; if (targetPlayer._pmode == PM_DEATH || targetPlayer._pmode == PM_QUIT || !targetPlayer.plractive - || !targetPlayer.isOnActiveLevel() || targetPlayer._pHitPoints >> 6 <= 0 + || !targetPlayer.isOnActiveLevel() || targetPlayer.hasNoLife() || !IsTileLit(targetPlayer.position.tile)) PlayerUnderCursor = nullptr; }