Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reduce usage of dPlayer #6854

Merged
merged 2 commits into from
Dec 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 6 additions & 8 deletions Source/controls/plrctrls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1274,13 +1274,11 @@ bool IsPathBlocked(Point position, Direction dir)
return !PosOkPlayer(myPlayer, leftStep) && !PosOkPlayer(myPlayer, rightStep);
}

void WalkInDir(size_t playerId, AxisDirection dir)
void WalkInDir(Player &player, AxisDirection dir)
{
Player &player = Players[playerId];

if (dir.x == AxisDirectionX_NONE && dir.y == AxisDirectionY_NONE) {
if (ControlMode != ControlTypes::KeyboardAndMouse && player.walkpath[0] != WALK_NONE && player.destAction == ACTION_NONE)
NetSendCmdLoc(playerId, true, CMD_WALKXY, player.position.future); // Stop walking
NetSendCmdLoc(player.getId(), true, CMD_WALKXY, player.position.future); // Stop walking
return;
}

Expand All @@ -1302,7 +1300,7 @@ void WalkInDir(size_t playerId, AxisDirection dir)
return; // Don't start backtrack around obstacles
}

NetSendCmdLoc(playerId, true, CMD_WALKXY, delta);
NetSendCmdLoc(player.getId(), true, CMD_WALKXY, delta);
}

void QuestLogMove(AxisDirection moveDir)
Expand Down Expand Up @@ -1360,13 +1358,13 @@ void ProcessLeftStickOrDPadGameUI()
handler(GetLeftStickOrDpadDirection(false));
}

void Movement(size_t playerId)
void Movement(Player &player)
{
if (PadMenuNavigatorActive || PadHotspellMenuActive || InGameMenu())
return;

if (GetLeftStickOrDPadGameUIHandler() == nullptr) {
WalkInDir(playerId, GetMoveDirection());
WalkInDir(player, GetMoveDirection());
}
}

Expand Down Expand Up @@ -1779,7 +1777,7 @@ void plrctrls_every_frame()

void plrctrls_after_game_logic()
{
Movement(MyPlayerId);
Movement(*MyPlayer);
}

void UseBeltItem(int type)
Expand Down
2 changes: 1 addition & 1 deletion Source/inv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2067,7 +2067,7 @@ bool UseInvItem(int cii)
else if (&player == MyPlayer)
PlaySFX(ItemInvSnds[idata]);

UseItem(player.getId(), item->_iMiscId, item->_iSpell, cii);
UseItem(player, item->_iMiscId, item->_iSpell, cii);

if (speedlist) {
if (player.SpdList[c]._iMiscId == IMISC_NOTE) {
Expand Down
3 changes: 1 addition & 2 deletions Source/items.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3981,9 +3981,8 @@ void PrintItemDur(const Item &item)
PrintItemInfo(item);
}

void UseItem(size_t pnum, item_misc_id mid, SpellID spellID, int spellFrom)
void UseItem(Player &player, item_misc_id mid, SpellID spellID, int spellFrom)
{
Player &player = Players[pnum];
std::optional<SpellID> prepareSpellID;

switch (mid) {
Expand Down
2 changes: 1 addition & 1 deletion Source/items.h
Original file line number Diff line number Diff line change
Expand Up @@ -539,7 +539,7 @@ bool DoOil(Player &player, int cii);
void DrawUniqueInfo(const Surface &out);
void PrintItemDetails(const Item &item);
void PrintItemDur(const Item &item);
void UseItem(size_t pnum, item_misc_id Mid, SpellID spellID, int spellFrom);
void UseItem(Player &player, item_misc_id Mid, SpellID spellID, int spellFrom);
bool UseItemOpensHive(const Item &item, Point position);
bool UseItemOpensGrave(const Item &item, Point position);
void SpawnSmith(int lvl);
Expand Down
36 changes: 16 additions & 20 deletions Source/missiles.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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];

Expand All @@ -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();
Expand Down Expand Up @@ -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);
}
}

Expand All @@ -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);
}
}

Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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())
Expand All @@ -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);
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion Source/missiles.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
23 changes: 11 additions & 12 deletions Source/monster.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
10 changes: 6 additions & 4 deletions Source/objects.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand Down
13 changes: 5 additions & 8 deletions Source/player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand Down Expand Up @@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion Source/player.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion Source/qol/stash.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -501,7 +501,7 @@ bool UseStashItem(uint16_t c)
else
PlaySFX(ItemInvSnds[ItemCAnimTbl[item->_iCurs]]);

UseItem(MyPlayerId, item->_iMiscId, item->_iSpell, -1);
UseItem(*MyPlayer, item->_iMiscId, item->_iSpell, -1);

if (Stash.stashList[c]._iMiscId == IMISC_MAPOFDOOM)
return true;
Expand Down