diff --git a/Source/missiles.cpp b/Source/missiles.cpp index b057158d4..99a7cccd4 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -3650,7 +3650,7 @@ void ProcessTeleport(Missile &missile) player.position.old = player.position.tile; PlrDoTrans(player.position.tile); missile.var1 = 1; - dPlayer[player.position.tile.x][player.position.tile.y] = id + 1; + player.occupyTile(player.position.tile, false); if (leveltype != DTYPE_TOWN) { ChangeLightXY(player.lightId, player.position.tile); ChangeVisionXY(player.getId(), player.position.tile); diff --git a/Source/monster.cpp b/Source/monster.cpp index 915706404..46a01cd4f 100644 --- a/Source/monster.cpp +++ b/Source/monster.cpp @@ -1260,7 +1260,7 @@ void MonsterAttackPlayer(Monster &monster, Player &player, int hit, int minDam, player.position.tile = newPosition; FixPlayerLocation(player, player._pdir); FixPlrWalkTags(player); - dPlayer[newPosition.x][newPosition.y] = player.getId() + 1; + player.occupyTile(newPosition, false); SetPlayerOld(player); } } @@ -4439,7 +4439,7 @@ void MissToMonst(Missile &missile, Point position) player.position.tile = newPosition; FixPlayerLocation(player, player._pdir); FixPlrWalkTags(player); - dPlayer[newPosition.x][newPosition.y] = pnum + 1; + player.occupyTile(newPosition, false); SetPlayerOld(player); } return; diff --git a/Source/multi.cpp b/Source/multi.cpp index 1e403ad60..85608cb7a 100644 --- a/Source/multi.cpp +++ b/Source/multi.cpp @@ -659,7 +659,7 @@ void multi_process_network_packets() if (player.isWalking()) player.position.temp = syncPosition; SetPlayerOld(player); - dPlayer[player.position.tile.x][player.position.tile.y] = playerId + 1; + player.occupyTile(player.position.tile, false); } if (player.position.future.WalkingDistance(player.position.tile) > 1) { player.position.future = player.position.tile; diff --git a/Source/player.cpp b/Source/player.cpp index db7b1f263..ee51fca10 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -77,17 +77,17 @@ void UpdatePlayerLightOffset(Player &player) void WalkNorthwards(Player &player, const DirectionSettings &walkParams) { - dPlayer[player.position.future.x][player.position.future.y] = -(player.getId() + 1); + player.occupyTile(player.position.future, true); player.position.temp = player.position.tile + walkParams.tileAdd; } void WalkSouthwards(Player &player, const DirectionSettings & /*walkParams*/) { const size_t playerId = player.getId(); - dPlayer[player.position.tile.x][player.position.tile.y] = -(playerId + 1); player.position.temp = player.position.tile; player.position.tile = player.position.future; // Move player to the next tile to maintain correct render order - dPlayer[player.position.tile.x][player.position.tile.y] = playerId + 1; + player.occupyTile(player.position.temp, true); + player.occupyTile(player.position.tile, false); // BUGFIX: missing `if (leveltype != DTYPE_TOWN) {` for call to ChangeLightXY and PM_ChangeLightOff. ChangeLightXY(player.lightId, player.position.tile); UpdatePlayerLightOffset(player); @@ -98,8 +98,8 @@ void WalkSideways(Player &player, const DirectionSettings &walkParams) Point const nextPosition = player.position.tile + walkParams.map; const size_t playerId = player.getId(); - dPlayer[player.position.tile.x][player.position.tile.y] = -(playerId + 1); - dPlayer[player.position.future.x][player.position.future.y] = playerId + 1; + player.occupyTile(player.position.tile, true); + player.occupyTile(player.position.future, false); if (leveltype != DTYPE_TOWN) { ChangeLightXY(player.lightId, nextPosition); @@ -415,7 +415,7 @@ void InitLevelChange(Player &player) FixPlrWalkTags(player); SetPlayerOld(player); if (&player == MyPlayer) { - dPlayer[player.position.tile.x][player.position.tile.y] = player.getId() + 1; + player.occupyTile(player.position.tile, false); } else { player._pLvlVisited[player.plrlevel] = true; } @@ -453,7 +453,7 @@ bool DoWalk(Player &player, int variant) case PM_WALK_NORTHWARDS: dPlayer[player.position.tile.x][player.position.tile.y] = 0; player.position.tile = player.position.temp; - dPlayer[player.position.tile.x][player.position.tile.y] = player.getId() + 1; + player.occupyTile(player.position.tile, false); break; case PM_WALK_SOUTHWARDS: dPlayer[player.position.temp.x][player.position.temp.y] = 0; @@ -462,7 +462,7 @@ bool DoWalk(Player &player, int variant) dPlayer[player.position.tile.x][player.position.tile.y] = 0; player.position.tile = player.position.temp; // dPlayer is set here for backwards comparability, without it the player would be invisible if loaded from a vanilla save. - dPlayer[player.position.tile.x][player.position.tile.y] = player.getId() + 1; + player.occupyTile(player.position.tile, false); break; } @@ -2070,6 +2070,12 @@ int32_t Player::calculateBaseMana() const return attr.adjMana + (attr.lvlMana * getCharacterLevel()) + (attr.chrMana * _pBaseMag); } +void Player::occupyTile(Point position, bool isMoving) const +{ + int16_t id = static_cast(this->getId() + 1); + dPlayer[position.x][position.y] = isMoving ? -id : id; +} + Player *PlayerAtPosition(Point position) { if (!InDungeonBounds(position)) @@ -2567,7 +2573,7 @@ void StartStand(Player &player, Direction dir) player._pmode = PM_STAND; FixPlayerLocation(player, dir); FixPlrWalkTags(player); - dPlayer[player.position.tile.x][player.position.tile.y] = player.getId() + 1; + player.occupyTile(player.position.tile, false); SetPlayerOld(player); } @@ -2641,7 +2647,7 @@ void StartPlrHit(Player &player, int dam, bool forcehit) player._pmode = PM_GOTHIT; FixPlayerLocation(player, pd); FixPlrWalkTags(player); - dPlayer[player.position.tile.x][player.position.tile.y] = player.getId() + 1; + player.occupyTile(player.position.tile, false); SetPlayerOld(player); } @@ -3251,7 +3257,7 @@ void SyncInitPlrPos(Player &player) }(); player.position.tile = position; - dPlayer[position.x][position.y] = player.getId() + 1; + player.occupyTile(position, false); player.position.future = position; if (&player == MyPlayer) { diff --git a/Source/player.h b/Source/player.h index d24cd893a..05d1e140b 100644 --- a/Source/player.h +++ b/Source/player.h @@ -884,6 +884,13 @@ public: /** @brief Returns a character's mana based on starting mana, character level, and base magic. */ int32_t calculateBaseMana() const; + + /** + * @brief Sets a tile/dPlayer to be occupied by the player + * @param position tile to update + * @param isMoving specifies whether the player is moving or not (true/moving results in a negative index in dPlayer) + */ + void occupyTile(Point position, bool isMoving) const; }; extern DVL_API_FOR_TEST size_t MyPlayerId;