Browse Source

Add Player hasNoLife helper (#8302)

pull/8303/head
Eric Robinson 3 months ago committed by GitHub
parent
commit
7e8173e6ff
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 4
      Source/control.cpp
  2. 4
      Source/controls/plrctrls.cpp
  3. 6
      Source/cursor.cpp
  4. 2
      Source/engine/render/scrollrt.cpp
  5. 2
      Source/inv.cpp
  6. 2
      Source/items.cpp
  7. 8
      Source/missiles.cpp
  8. 8
      Source/monster.cpp
  9. 4
      Source/msg.cpp
  10. 4
      Source/multi.cpp
  11. 2
      Source/objects.cpp
  12. 26
      Source/player.cpp
  13. 5
      Source/player.h
  14. 4
      Source/qol/stash.cpp
  15. 4
      Source/spells.cpp
  16. 2
      Source/track.cpp

4
Source/control.cpp

@ -1466,7 +1466,7 @@ void CheckMainPanelButtonUp()
NetSendCmd(true, CMD_RETOWN); NetSendCmd(true, CMD_RETOWN);
} }
break; break;
} else if (MyPlayer->_pHitPoints == 0) { } else if (MyPlayer->hasNoLife()) {
break; break;
} }
qtextflag = false; qtextflag = false;
@ -1808,7 +1808,7 @@ void control_drop_gold(SDL_Keycode vkey)
{ {
Player &myPlayer = *MyPlayer; Player &myPlayer = *MyPlayer;
if (myPlayer._pHitPoints >> 6 <= 0) { if (myPlayer.hasNoLife()) {
CloseGoldDrop(); CloseGoldDrop();
return; return;
} }

4
Source/controls/plrctrls.cpp

@ -76,7 +76,7 @@ bool InGameMenu()
|| qtextflag || qtextflag
|| gmenu_is_active() || gmenu_is_active()
|| PauseMode == 2 || PauseMode == 2
|| (MyPlayer != nullptr && MyPlayer->_pInvincible && MyPlayer->_pHitPoints == 0); || (MyPlayer != nullptr && MyPlayer->_pInvincible && MyPlayer->hasNoLife());
} }
namespace { namespace {
@ -395,7 +395,7 @@ void CheckPlayerNearby()
const int my = player.position.future.y; const int my = player.position.future.y;
if (dPlayer[mx][my] == 0 if (dPlayer[mx][my] == 0
|| !IsTileLit(player.position.future) || !IsTileLit(player.position.future)
|| (player._pHitPoints == 0 && spl != SpellID::Resurrect)) || (player.hasNoLife() && spl != SpellID::Resurrect))
continue; continue;
if (myPlayer.UsesRangedWeapon() || HasRangedSpell() || spl == SpellID::HealOther) { if (myPlayer.UsesRangedWeapon() || HasRangedSpell() || spl == SpellID::HealOther) {

6
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) { 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; const uint8_t playerId = std::abs(dPlayer[tile.x + 1][tile.y]) - 1;
Player &player = Players[playerId]; Player &player = Players[playerId];
if (&player != MyPlayer && player._pHitPoints != 0) { if (&player != MyPlayer && !player.hasNoLife()) {
cursPosition = tile + Displacement { 1, 0 }; cursPosition = tile + Displacement { 1, 0 };
PlayerUnderCursor = &player; 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) { 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; const uint8_t playerId = std::abs(dPlayer[tile.x][tile.y + 1]) - 1;
Player &player = Players[playerId]; Player &player = Players[playerId];
if (&player != MyPlayer && player._pHitPoints != 0) { if (&player != MyPlayer && !player.hasNoLife()) {
cursPosition = tile + Displacement { 0, 1 }; cursPosition = tile + Displacement { 0, 1 };
PlayerUnderCursor = &player; 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) { 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 uint8_t playerId = std::abs(dPlayer[tile.x + 1][tile.y + 1]) - 1;
const Player &player = Players[playerId]; const Player &player = Players[playerId];
if (&player != MyPlayer && player._pHitPoints != 0) { if (&player != MyPlayer && !player.hasNoLife()) {
cursPosition = tile + Displacement { 1, 1 }; cursPosition = tile + Displacement { 1, 1 };
PlayerUnderCursor = &player; PlayerUnderCursor = &player;
} }

2
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; dFlags[tilePosition.x][tilePosition.y] &= ~DungeonFlag::DeadPlayer;
for (const Player &player : Players) { 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; dFlags[tilePosition.x][tilePosition.y] |= DungeonFlag::DeadPlayer;
const Point playerRenderPosition { targetBufferPosition }; const Point playerRenderPosition { targetBufferPosition };
DrawPlayer(out, player, tilePosition, playerRenderPosition, lightTableIndex); DrawPlayer(out, player, tilePosition, playerRenderPosition, lightTableIndex);

2
Source/inv.cpp

@ -2076,7 +2076,7 @@ bool UseInvItem(int cii)
Player &player = *MyPlayer; Player &player = *MyPlayer;
if (player._pInvincible && player._pHitPoints == 0 && &player == MyPlayer) if (player._pInvincible && player.hasNoLife() && &player == MyPlayer)
return true; return true;
if (pcurs != CURSOR_HAND) if (pcurs != CURSOR_HAND)
return true; return true;

2
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._pMaxHP = std::clamp(life + player._pMaxHPBase, 1 << 6, 2000 << 6);
player._pHitPoints = std::min(life + player._pHPBase, player._pMaxHP); player._pHitPoints = std::min(life + player._pHPBase, player._pMaxHP);
if (&player == MyPlayer && (player._pHitPoints >> 6) <= 0) { if (&player == MyPlayer && player.hasNoLife()) {
SetPlayerHitPoints(player, 0); SetPlayerHitPoints(player, 0);
} }

8
Source/missiles.cpp

@ -1067,7 +1067,7 @@ bool PlayerMHit(Player &player, Monster *monster, int dist, int mind, int maxd,
{ {
*blocked = false; *blocked = false;
if (player._pHitPoints >> 6 <= 0) { if (player.hasNoLife()) {
return false; 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); ApplyPlrDamage(damageType, player, 0, 0, dam, deathReason);
} }
if (player._pHitPoints >> 6 > 0) { if (!player.hasNoLife()) {
player.Say(HeroSpeech::ArghClang); player.Say(HeroSpeech::ArghClang);
} }
return true; 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); ApplyPlrDamage(damageType, player, 0, 0, dam, deathReason);
} }
if (player._pHitPoints >> 6 > 0) { if (!player.hasNoLife()) {
StartPlrHit(player, dam, false); StartPlrHit(player, dam, false);
} }
@ -3932,7 +3932,7 @@ void ProcessRage(Missile &missile)
CalcPlrItemVals(player, true); CalcPlrItemVals(player, true);
// Prevent the player from dying as a result of recalculating their current life // Prevent the player from dying as a result of recalculating their current life
if ((player._pHitPoints >> 6) <= 0) if (player.hasNoLife())
SetPlayerHitPoints(player, 64); SetPlayerHitPoints(player, 64);
RedrawEverything(); RedrawEverything();

8
Source/monster.cpp

@ -682,7 +682,7 @@ void UpdateEnemy(Monster &monster)
for (size_t pnum = 0; pnum < Players.size(); pnum++) { for (size_t pnum = 0; pnum < Players.size(); pnum++) {
const Player &player = Players[pnum]; const Player &player = Players[pnum];
if (!player.plractive || !player.isOnActiveLevel() || player._pLvlChanging if (!player.plractive || !player.isOnActiveLevel() || player._pLvlChanging
|| (((player._pHitPoints >> 6) == 0) && gbIsMultiplayer)) || (player.hasNoLife() && gbIsMultiplayer))
continue; continue;
const bool sameroom = (dTransVal[position.x][position.y] == dTransVal[player.position.tile.x][player.position.tile.y]); 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); 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) 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; return;
if (monster.position.tile.WalkingDistance(player.position.tile) >= 2) if (monster.position.tile.WalkingDistance(player.position.tile) >= 2)
return; 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) if ((monster.flags & MFLAG_NOLIFESTEAL) == 0 && monster.type().type == MT_SKING && gbIsMultiplayer)
monster.hitPoints += dam; monster.hitPoints += dam;
if (player._pHitPoints >> 6 <= 0) { if (player.hasNoLife()) {
if (gbIsHellfire) if (gbIsHellfire)
M_StartStand(monster, monster.direction); M_StartStand(monster, monster.direction);
return; return;
@ -4006,7 +4006,7 @@ void PrepDoEnding()
player._pmode = PM_QUIT; player._pmode = PM_QUIT;
player._pInvincible = true; player._pInvincible = true;
if (gbIsMultiplayer) { if (gbIsMultiplayer) {
if (player._pHitPoints >> 6 == 0) if (player.hasNoLife())
player._pHitPoints = 64; player._pHitPoints = 64;
if (player._pMana >> 6 == 0) if (player._pMana >> 6 == 0)
player._pMana = 64; player._pMana = 64;

4
Source/msg.cpp

@ -2076,7 +2076,7 @@ size_t OnPlayerDamage(const TCmdDamage &message, Player &player)
Player &target = Players[message.bPlr]; Player &target = Players[message.bPlr];
if (&target == MyPlayer && leveltype != DTYPE_TOWN && gbBufferMsgs != 1) { 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<int>(damage), DeathReason::Player); ApplyPlrDamage(message.damageType, target, 0, 0, static_cast<int>(damage), DeathReason::Player);
} }
} }
@ -2308,7 +2308,7 @@ size_t OnPlayerJoinLevel(const TCmdLocParam2 &message, Player &player)
ResetPlayerGFX(player); ResetPlayerGFX(player);
if (player.isOnActiveLevel()) { if (player.isOnActiveLevel()) {
SyncInitPlr(player); SyncInitPlr(player);
if ((player._pHitPoints >> 6) > 0) { if (!player.hasNoLife()) {
StartStand(player, Direction::South); StartStand(player, Direction::South);
} else { } else {
player._pgfxnum &= ~0xFU; player._pgfxnum &= ~0xFU;

4
Source/multi.cpp

@ -724,7 +724,7 @@ void ProcessGameMessagePackets()
player._pBaseStr = pkt->bstr; player._pBaseStr = pkt->bstr;
player._pBaseMag = pkt->bmag; player._pBaseMag = pkt->bmag;
player._pBaseDex = pkt->bdex; player._pBaseDex = pkt->bdex;
if (!cond && player.plractive && player._pHitPoints != 0) { if (!cond && player.plractive && !player.hasNoLife()) {
if (player.isOnActiveLevel() && !player._pLvlChanging) { if (player.isOnActiveLevel() && !player._pLvlChanging) {
if (player.position.tile.WalkingDistance(syncPosition) > 3 && PosOkPlayer(player, syncPosition)) { 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 // 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; return;
} }
if (player._pHitPoints >> 6 > 0) { if (!player.hasNoLife()) {
StartStand(player, Direction::South); StartStand(player, Direction::South);
return; return;
} }

2
Source/objects.cpp

@ -1658,7 +1658,7 @@ void UpdateBurningCrossDamage(Object &cross)
return; return;
ApplyPlrDamage(DamageType::Fire, myPlayer, 0, 0, damage[leveltype - 1]); ApplyPlrDamage(DamageType::Fire, myPlayer, 0, 0, damage[leveltype - 1]);
if (myPlayer._pHitPoints >> 6 > 0) { if (!myPlayer.hasNoLife()) {
myPlayer.Say(HeroSpeech::Argh); myPlayer.Say(HeroSpeech::Argh);
} }
} }

26
Source/player.cpp

@ -156,7 +156,7 @@ void StartWalkAnimation(Player &player, Direction dir, bool pmWillBeCalled)
*/ */
void StartWalk(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); SyncPlrKill(player, DeathReason::Unknown);
return; return;
} }
@ -174,7 +174,7 @@ void ClearStateVariables(Player &player)
void StartAttack(Player &player, Direction d, bool includesFirstFrame) 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); SyncPlrKill(player, DeathReason::Unknown);
return; 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) 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); SyncPlrKill(player, DeathReason::Unknown);
return; return;
} }
@ -248,7 +248,7 @@ player_graphic GetPlayerGraphicForSpell(SpellID spellId)
void StartSpell(Player &player, Direction d, WorldTileCoord cx, WorldTileCoord cy) 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); SyncPlrKill(player, DeathReason::Unknown);
return; return;
} }
@ -1117,7 +1117,7 @@ void CheckNewPath(Player &player, bool pmWillBeCalled)
case ACTION_RATTACKPLR: case ACTION_RATTACKPLR:
case ACTION_SPELLPLR: case ACTION_SPELLPLR:
target = &Players[targetId]; target = &Players[targetId];
if ((target->_pHitPoints >> 6) <= 0) { if (!target->hasNoLife()) {
player.Stop(); player.Stop();
return; return;
} }
@ -2187,7 +2187,7 @@ void InitPlayerGFX(Player &player)
ResetPlayerGFX(player); ResetPlayerGFX(player);
if (player._pHitPoints >> 6 == 0) { if (player.hasNoLife()) {
player._pgfxnum &= ~0xFU; player._pgfxnum &= ~0xFU;
LoadPlrGFX(player, player_graphic::Death); LoadPlrGFX(player, player_graphic::Death);
return; return;
@ -2501,7 +2501,7 @@ void InitPlayer(Player &player, bool firstTime)
ClearStateVariables(player); ClearStateVariables(player);
if (player._pHitPoints >> 6 > 0) { if (!player.hasNoLife()) {
player._pmode = PM_STAND; player._pmode = PM_STAND;
NewPlrAnim(player, player_graphic::Stand, Direction::South); NewPlrAnim(player, player_graphic::Stand, Direction::South);
player.AnimInfo.currentFrame = GenerateRnd(player._pNFrames - 1); player.AnimInfo.currentFrame = GenerateRnd(player._pNFrames - 1);
@ -2590,7 +2590,7 @@ void FixPlayerLocation(Player &player, Direction bDir)
void StartStand(Player &player, Direction dir) 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); SyncPlrKill(player, DeathReason::Unknown);
return; return;
} }
@ -2605,7 +2605,7 @@ void StartStand(Player &player, Direction dir)
void StartPlrBlock(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); SyncPlrKill(player, DeathReason::Unknown);
return; return;
} }
@ -2639,7 +2639,7 @@ void FixPlrWalkTags(const Player &player)
void StartPlrHit(Player &player, int dam, bool forcehit) 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); SyncPlrKill(player, DeathReason::Unknown);
return; return;
} }
@ -2866,7 +2866,7 @@ void ApplyPlrDamage(DamageType damageType, Player &player, int dam, int minHP /*
if (player._pHitPoints < minHitPoints) { if (player._pHitPoints < minHitPoints) {
SetPlayerHitPoints(player, minHitPoints); SetPlayerHitPoints(player, minHitPoints);
} }
if (player._pHitPoints >> 6 <= 0) { if (player.hasNoLife()) {
SyncPlrKill(player, deathReason); SyncPlrKill(player, deathReason);
} }
} }
@ -3024,7 +3024,7 @@ void ProcessPlayers()
for (size_t pnum = 0; pnum < Players.size(); pnum++) { for (size_t pnum = 0; pnum < Players.size(); pnum++) {
Player &player = Players[pnum]; Player &player = Players[pnum];
if (player.plractive && player.isOnActiveLevel() && (&player == MyPlayer || !player._pLvlChanging)) { 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); SyncPlrKill(player, DeathReason::Unknown);
} }
@ -3100,7 +3100,7 @@ bool PosOkPlayer(const Player &player, Point position)
if (!IsTileWalkable(position)) if (!IsTileWalkable(position))
return false; return false;
Player *otherPlayer = PlayerAtPosition(position); Player *otherPlayer = PlayerAtPosition(position);
if (otherPlayer != nullptr && otherPlayer != &player && otherPlayer->_pHitPoints != 0) if (otherPlayer != nullptr && otherPlayer != &player && !otherPlayer->hasNoLife())
return false; return false;
if (dMonster[position.x][position.y] != 0) { if (dMonster[position.x][position.y] != 0) {

5
Source/player.h

@ -900,6 +900,11 @@ public:
return (type == leftHandItem._itype && leftHandItem._iStatFlag) || (type == rightHandItem._itype && rightHandItem._iStatFlag); 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; extern DVL_API_FOR_TEST uint8_t MyPlayerId;

4
Source/qol/stash.cpp

@ -464,7 +464,7 @@ uint16_t CheckStashHLight(Point mousePosition)
bool UseStashItem(uint16_t c) bool UseStashItem(uint16_t c)
{ {
if (MyPlayer->_pInvincible && MyPlayer->_pHitPoints == 0) if (MyPlayer->_pInvincible && MyPlayer->hasNoLife())
return true; return true;
if (pcurs != CURSOR_HAND) if (pcurs != CURSOR_HAND)
return true; return true;
@ -617,7 +617,7 @@ void WithdrawGoldKeyPress(SDL_Keycode vkey)
{ {
Player &myPlayer = *MyPlayer; Player &myPlayer = *MyPlayer;
if (myPlayer._pHitPoints >> 6 <= 0) { if (myPlayer.hasNoLife()) {
CloseGoldWithdraw(); CloseGoldWithdraw();
return; return;
} }

4
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); AddMissile(target.position.tile, target.position.tile, Direction::South, MissileID::ResurrectBeam, TARGET_MONSTERS, player, 0, 0);
if (target._pHitPoints != 0) if (!target.hasNoLife())
return; return;
if (&target == MyPlayer) { if (&target == MyPlayer) {
@ -272,7 +272,7 @@ void DoResurrect(Player &player, Player &target)
void DoHealOther(const Player &caster, Player &target) void DoHealOther(const Player &caster, Player &target)
{ {
if ((target._pHitPoints >> 6) <= 0) { if (target.hasNoLife()) {
return; return;
} }

2
Source/track.cpp

@ -51,7 +51,7 @@ void InvalidateTargets()
if (PlayerUnderCursor != nullptr) { if (PlayerUnderCursor != nullptr) {
const Player &targetPlayer = *PlayerUnderCursor; const Player &targetPlayer = *PlayerUnderCursor;
if (targetPlayer._pmode == PM_DEATH || targetPlayer._pmode == PM_QUIT || !targetPlayer.plractive 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)) || !IsTileLit(targetPlayer.position.tile))
PlayerUnderCursor = nullptr; PlayerUnderCursor = nullptr;
} }

Loading…
Cancel
Save